ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjBmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTggQEAKKy8vICoqKiBUSElTIFBBQ0tBR0UgSEFTIFNQRUNJQUwgTElDRU5TSU5HIENPTkRJVElPTlMuICBQTEVBU0UKKy8vICAgICBDT05TVUxUIFRIRSBPV05FUlMgQU5EIG9wZW5zb3VyY2UtbGljZW5zaW5nQGdvb2dsZS5jb20gQkVGT1JFCisvLyAgICAgREVQRU5ESU5HIE9OIElUIElOIFlPVVIgUFJPSkVDVC4gKioqCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UgdGhhdCB0b29rIHRoZSBhcHByb2FjaCBvZgorLy8gJ2FwcGx5IGV2ZXJ5IGxpY2Vuc2UgZm91bmQgdG8gZXZlcnkgdGFyZ2V0Jy4gV2hpbGUgdGhpcyBtYWtlcyBzdXJlIHdlIHJlc3BlY3QKKy8vIGV2ZXJ5IGxpY2Vuc2UgcmVzdHJpY3Rpb24sIGl0IG1heSBub3QgYmUgZW50aXJlbHkgY29ycmVjdC4KKy8vCisvLyBlLmcuIEdQTCBpbiBhbiBNSVQgcHJvamVjdCBtaWdodCBvbmx5IGFwcGx5IHRvIHRoZSBjb250cmliLyBkaXJlY3RvcnkuCisvLworLy8gUGxlYXNlIGNvbnNpZGVyIHNwbGl0dGluZyB0aGUgc2luZ2xlIGxpY2Vuc2UgYmVsb3cgaW50byBtdWx0aXBsZSBsaWNlbnNlcywKKy8vIHRha2luZyBjYXJlIG5vdCB0byBsb3NlIGFueSBsaWNlbnNlX2tpbmQgaW5mb3JtYXRpb24sIGFuZCBvdmVycmlkaW5nIHRoZQorLy8gZGVmYXVsdCBsaWNlbnNlIHVzaW5nIHRoZSAnbGljZW5zZXM6IFsuLi5dJyBwcm9wZXJ0eSBvbiB0YXJnZXRzIGFzIG5lZWRlZC4KKy8vCisvLyBGb3IgdW51c2VkIGZpbGVzLCBjb25zaWRlciBjcmVhdGluZyBhICdmaWxlR3JvdXAnIHdpdGggIi8vdmlzaWJpbGl0eTpwcml2YXRlIgorLy8gdG8gYXR0YWNoIHRoZSBsaWNlbnNlIHRvLCBhbmQgaW5jbHVkaW5nIGEgY29tbWVudCB3aGV0aGVyIHRoZSBmaWxlcyBtYXkgYmUKKy8vIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNEIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1Vbmljb2RlLURGUyIsCisgICAgICAgICJsZWdhY3lfYnlfZXhjZXB0aW9uX29ubHkiLCAvLyBieSBleGNlcHRpb24gb25seQorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAiYXYtdHlwZXMtYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSW50ZXJwb2xhdG9yQ29uZmlnLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0ludGVycG9sYXRvclR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm9EYXRhLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyU3RhdGUuYWlkbCIsCisgICAgXSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmJsdWV0b290aC51cGRhdGFibGUiLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJhdi1oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiZGEzNgotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMjMgQEAKKyMgKioqIFRISVMgUEFDS0FHRSBIQVMgU1BFQ0lBTCBMSUNFTlNJTkcgQ09ORElUSU9OUy4gIFBMRUFTRQorIyAgICAgQ09OU1VMVCBUSEUgT1dORVJTIEFORCBvcGVuc291cmNlLWxpY2Vuc2luZ0Bnb29nbGUuY29tIEJFRk9SRQorIyAgICAgREVQRU5ESU5HIE9OIElUIElOIFlPVVIgUFJPSkVDVC4gKioqCit0aGlyZF9wYXJ0eSB7CisgICMgd291bGQgYmUgTk9USUNFIHNhdmUgZm9yIFdpZGV2aW5lIE1hc3RlciBMaWNlbnNlIEFncmVlbWVudCBpbjoKKyAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCisgICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCisgICMgICBkcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRGV2aWNlRmlsZXMuaAorICAjICAgZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KKyAgIyAgIGRybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKKyAgIyBhbmQgcGF0ZW50IGRpc2NsYWltZXJzIGluOgorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CisgICMgICBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWNzL200dl9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dAorICAjICAgbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKKyAgIyAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CisgIGxpY2Vuc2VfdHlwZTogQllfRVhDRVBUSU9OX09OTFkKK30KZGlmZiAtLWdpdCBhL01haW5saW5lRmlsZXMuY2ZnIGIvTWFpbmxpbmVGaWxlcy5jZmcKaW5kZXggMzdkNzE0Yy4uNDkwYmJiZiAxMDA2NDQKLS0tIGEvTWFpbmxpbmVGaWxlcy5jZmcKKysrIGIvTWFpbmxpbmVGaWxlcy5jZmcKQEAgLTEsMTAgKzEsMTMgQEAKLSMgCisjCiAjIG1haW5saW5lIGZpbGVzIGZvciBmcmFtZXdvcmtzL2F2CisjIHRoaXMgbGlzdCB1c2VkIGJ5IHRvb2xzL21haW5saW5lX2hvb2tfKi5zaCB0byBoZWxwIHNlcGFyYXRlCisjIG1haW5saW5lIGNoYW5nZXMgdnMgZnJhbWV3b3JrIGNoYW5nZXMsIHdoaWNoIHJlbGVhc2UgYXQgZGlmZmVyZW50IHBhY2VzLgorIwogIwogIyBpZ25vcmUgY29tbWVudCAoIykgbGluZXMgYW5kIGJsYW5rIGxpbmVzCiAjIHJlc3QgYXJlIHBhdGggcHJlZml4ZXMgc3RhcnRpbmcgYXQgcm9vdCBvZiB0aGUgcHJvamVjdAogIyAoc28gT1dORVJTLCBub3QgZnJhbWV3b3Jrcy9hdi9PV05FUlMpCi0jIAorIwogIyBwYXRoCiAjIElOQ0xVREUgcGF0aAogIyBFWENMVURFIHBhdGgKQEAgLTI0LDExICsyNyw1IEBACiBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy8KIG1lZGlhL2NvZGVjcy8KIG1lZGlhL2V4dHJhY3RvcnMvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uLwotbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvCi1tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjLwotbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cworbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy8KK21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvCmRpZmYgLS1naXQgYS9PV05FUlMgYi9PV05FUlMKaW5kZXggOGY0MDVlOS4uMGJlMTE5NiAxMDA2NDQKLS0tIGEvT1dORVJTCisrKyBiL09XTkVSUwpAQCAtMSw0ICsxLDggQEAKKyMgQnVnIGNvbXBvbmVudDogMTM0NAogZWxhdXJlbnRAZ29vZ2xlLmNvbQogZXRhbHZhbGFAZ29vZ2xlLmNvbQoraGt1YW5nQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQorCisjIGdvL2FuZHJvaWQtZndrLW1lZGlhLXNvbHV0aW9ucyBmb3IgaW5mbyBvbiBhcmVhcyBvZiBvd25lcnNoaXAuCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L21lZGlhL2phbml0b3JzL21lZGlhX3NvbHV0aW9uc19PV05FUlMKZGlmZiAtLWdpdCBhL1BSRVVQTE9BRC5jZmcgYi9QUkVVUExPQUQuY2ZnCmluZGV4IGFlOTIwYzAuLjcxNmI1NTAgMTAwNjQ0Ci0tLSBhL1BSRVVQTE9BRC5jZmcKKysrIGIvUFJFVVBMT0FELmNmZwpAQCAtMSwyICsxLDEzIEBACiBbSG9vayBTY3JpcHRzXQogbWFpbmxpbmVfaG9vayA9ICR7UkVQT19ST09UfS9mcmFtZXdvcmtzL2F2L3Rvb2xzL21haW5saW5lX2hvb2tfcGFydGlhbC5zaCAke1JFUE9fUk9PVH0gJHtQUkVVUExPQURfRklMRVN9CisKK2hpZGRlbl9hcGlfdHh0X2NoZWNrc29ydGVkX2hvb2sgPSAke1JFUE9fUk9PVH0vdG9vbHMvcGxhdGZvcm0tY29tcGF0L2hpZGRlbmFwaS9jaGVja3NvcnRlZF9zaGEuc2ggJHtQUkVVUExPQURfQ09NTUlUfSAke1JFUE9fUk9PVH0KKworW0J1aWx0aW4gSG9va3NdCitjbGFuZ19mb3JtYXQgPSB0cnVlCisKK1tCdWlsdGluIEhvb2tzIE9wdGlvbnNdCisjIE9ubHkgdHVybiBvbiBjbGFuZy1mb3JtYXQgY2hlY2sgZm9yIHRoZSBmb2xsb3dpbmcgc3ViZm9sZGVycy4KK2NsYW5nX2Zvcm1hdCA9IC0tY29tbWl0ICR7UFJFVVBMT0FEX0NPTU1JVH0gLS1zdHlsZSBmaWxlIC0tZXh0ZW5zaW9ucyBjLGgsY2MsY3BwCisgICAgICAgICAgICAgICBtZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nLworICAgICAgICAgICAgICAgc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy8KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JDb25maWcuYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JDb25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY5MGU4Ci0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL0ludGVycG9sYXRvckNvbmZpZy5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkludGVycG9sYXRvclR5cGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEludGVycG9sYXRvckNvbmZpZyB7CisgICAgSW50ZXJwb2xhdG9yVHlwZSB0eXBlID0gSW50ZXJwb2xhdG9yVHlwZS5DVUJJQzsKKyAgICAvKiogRm9yIGN1YmljIGludGVycG9sYXRpb24sIHRoZSBib3VuZGFyeSBjb25kaXRpb25zIGluIHNsb3BlLiAqLworICAgIGZsb2F0IGZpcnN0U2xvcGU7CisgICAgZmxvYXQgbGFzdFNsb3BlOworICAgIC8qKiBBIGZsYXR0ZW5lZCBsaXN0IG9mIDx4LCB5PiBwYWlycywgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGluIHguICovCisgICAgZmxvYXRbXSB4eTsKK30KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9JbnRlcnBvbGF0b3JUeXBlLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvSW50ZXJwb2xhdG9yVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjJjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvSW50ZXJwb2xhdG9yVHlwZS5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFBvbHlub21pYWwgc3BsaW5lIGludGVycG9sYXRvcnMuCisgKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBJbnRlcnBvbGF0b3JUeXBlIHsKKyAgICAvKiogTm90IGNvbnRpbnVvdXMuICovCisgICAgU1RFUCwKKyAgICAvKiogQzAuICovCisgICAgTElORUFSLAorICAgIC8qKiBDMS4gKi8KKyAgICBDVUJJQywKKyAgICAvKiogQzEgKHRvIHByb3ZpZGUgbG9jYWxseSBtb25vdG9uaWMgY3VydmVzKS4gKi8KKyAgICBDVUJJQ19NT05PVE9OSUMsCisgICAgLy8gQ1VCSUNfQzIsIC8vIFRPRE8gLSByZXF1aXJlcyBnbG9iYWwgY29tcHV0YXRpb24gLyBjYWNoZQorfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvRGF0YS5haWRsIGIvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvRGF0YS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0N2JmYTUKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvTWljcm9waG9uZUluZm9EYXRhLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBNaWNyb3Bob25lSW5mb0RhdGEgeworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZUlkOworICAgIGludCBwb3J0SWQ7CisgICAgaW50IHR5cGU7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgYWRkcmVzczsKKyAgICBpbnQgZGV2aWNlTG9jYXRpb247CisgICAgaW50IGRldmljZUdyb3VwOworICAgIGludCBpbmRleEluVGhlR3JvdXA7CisgICAgZmxvYXRbXSBnZW9tZXRyaWNMb2NhdGlvbjsKKyAgICBmbG9hdFtdIG9yaWVudGF0aW9uOworICAgIGZsb2F0W10gZnJlcXVlbmNpZXM7CisgICAgZmxvYXRbXSBmcmVxdWVuY3lSZXNwb25zZXM7CisgICAgaW50W10gY2hhbm5lbE1hcHBpbmc7CisgICAgZmxvYXQgc2Vuc2l0aXZpdHk7CisgICAgZmxvYXQgbWF4U3BsOworICAgIGZsb2F0IG1pblNwbDsKKyAgICBpbnQgZGlyZWN0aW9uYWxpdHk7Cit9CmRpZmYgLS1naXQgYS9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbi5haWRsIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmU2NTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24uYWlkbApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5JbnRlcnBvbGF0b3JDb25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT3B0aW9uRmxhZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uIHsKKyAgICBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuSUQ7CisgICAgaW50IGlkOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnLiAqLworICAgIGludCBvcHRpb25GbGFnczsKKyAgICBkb3VibGUgZHVyYXRpb25NczsKKyAgICBAbnVsbGFibGUgSW50ZXJwb2xhdG9yQ29uZmlnIGludGVycG9sYXRvckNvbmZpZzsgLy8gbnVsbCBpZiB0eXBlID09IElECit9CmRpZmYgLS1naXQgYS9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT3B0aW9uRmxhZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODNjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuYWlkbApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcgeworICAgIFZPTFVNRV9JTl9EQkZTLAorICAgIENMT0NLX1RJTUUsCit9CmRpZmYgLS1naXQgYS9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuYWlkbCBiL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjMzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUuYWlkbApAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGUgeworICAgIElELAorICAgIFNDQUxFLAorfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbi5haWRsIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOWEwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVm9sdW1lU2hhcGVyT3BlcmF0aW9uIHsKKyAgICAvKiogT3BlcmF0aW9ucyB0byBkby4gQml0bWFzayBvZiBWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnLiAqLworICAgIGludCBmbGFnczsKKyAgICAvKiogSWYgPj0gMCB0aGUgaWQgdG8gcmVtb3ZlIGluIGEgcmVwbGFjZSBvcGVyYXRpb24uICovCisgICAgaW50IHJlcGxhY2VJZDsKKyAgICAvKiogUG9zaXRpb24gaW4gdGhlIGN1cnZlIHRvIHNldCBpZiBhIHZhbGlkIG51bWJlciAobm90IG5hbikuICovCisgICAgZmxvYXQgeE9mZnNldDsKK30KZGlmZiAtLWdpdCBhL2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTUyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnIHsKKyAgICAvKiogVGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnIGluZGljYXRlcyAicGxheSIuICovCisgICAgUkVWRVJTRSwKKyAgICBURVJNSU5BVEUsCisgICAgSk9JTiwKKyAgICBERUxBWSwKKyAgICBDUkVBVEVfSUZfTkVDRVNTQVJZLAorfQpkaWZmIC0tZ2l0IGEvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlclN0YXRlLmFpZGwgYi9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyU3RhdGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg1ZTJiCi0tLSAvZGV2L251bGwKKysrIGIvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlclN0YXRlLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVm9sdW1lU2hhcGVyU3RhdGUgeworICAgIC8qKiBMaW5lYXIgdm9sdW1lIGluIHRoZSByYW5nZSBNSU5fTElORUFSX1ZPTFVNRSB0byBNQVhfTElORUFSX1ZPTFVNRS4gKi8KKyAgICBmbG9hdCB2b2x1bWU7CisgICAgLyoqIFBvc2l0aW9uIG9uIGN1cnZlIGV4cHJlc3NlZCBmcm9tIE1JTl9DVVJWRV9USU1FIHRvIE1BWF9DVVJWRV9USU1FLiAqLworICAgIGZsb2F0IHhPZmZzZXQ7Cit9CmRpZmYgLS1naXQgYS9hcGV4L0FuZHJvaWQuYnAgYi9hcGV4L0FuZHJvaWQuYnAKaW5kZXggMmJhNjI2Ny4uYjlhYmQxMiAxMDA2NDQKLS0tIGEvYXBleC9BbmRyb2lkLmJwCisrKyBiL2FwZXgvQW5kcm9pZC5icApAQCAtMTIsMTAgKzEyLDIwIEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBhcGV4X2RlZmF1bHRzIHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiLAogICAgIHVwZGF0YWJsZTogdHJ1ZSwKLSAgICBqYXZhX2xpYnM6IFsidXBkYXRhYmxlLW1lZGlhIl0sCisgICAgYm9vdGNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtYm9vdGNsYXNzcGF0aC1mcmFnbWVudCJdLAorICAgIHN5c3RlbXNlcnZlcmNsYXNzcGF0aF9mcmFnbWVudHM6IFsiY29tLmFuZHJvaWQubWVkaWEtc3lzdGVtc2VydmVyY2xhc3NwYXRoLWZyYWdtZW50Il0sCiAgICAgbXVsdGlsaWI6IHsKICAgICAgICAgZmlyc3Q6IHsKICAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwcm9jZXNzIHJ1bnMgb25seSB3aXRoIHRoZSBwcmltYXJ5IEFCSS4KQEAgLTMyLDE1ICs0MiwyNCBAQAogICAgICAgICAgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAogICAgICAgICAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIC8vIFRyYW5zY29kaW5nIHNlcnZpY2Ugb25seSBydW4gd2l0aCBwcmltYXJ5IEFCSS4KKyAgICAgICAgICAgIGJpbmFyaWVzOiBbCisgICAgICAgICAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmciLAorICAgICAgICAgICAgXSwKICAgICAgICAgfSwKICAgICB9LAogICAgIC8vIEpOSQotICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWyJsaWJtZWRpYXBhcnNlci1qbmkiXSwKKyAgICBuYXRpdmVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhcGFyc2VyLWpuaSIsCisgICAgICAgICJsaWJtZWRpYWZvcm1hdHNoYXBlciIsCisgICAgXSwKICAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCiAgICAgcHJlYnVpbHRzOiBbCi0gICAgICAgICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAogICAgICAgICAiY29kZV9jb3ZlcmFnZS5wb2xpY3kiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy5yYyIsCiAgICAgICAgICJjcmFzaF9kdW1wLnBvbGljeSIsCisgICAgICAgICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAorICAgICAgICAibWVkaWEtbGlua2VyLWNvbmZpZyIsCiAgICAgXSwKICAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAogICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLm1lZGlhLmNlcnRpZmljYXRlIiwKQEAgLTU2LDEyICs3NSw2NSBAQAogICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKICAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCBwcmUtaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhpcyBhcGV4IGNhbiBiZSBjb21wcmVzc2VkLgorICAgIC8vIFdoZXRoZXIgaXQgYWN0dWFsbHkgd2lsbCBiZSBjb21wcmVzc2VkIGlzIGNvbnRyb2xsZWQgb24gcGVyLWRldmljZSBiYXNpcy4KKyAgICBjb21wcmVzc2libGU6IHRydWUsCiB9CiAKIGFwZXggewogICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCiAgICAgbWFuaWZlc3Q6ICJtYW5pZmVzdC5qc29uIiwKICAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS1kZWZhdWx0cyJdLAorICAgIHByZWJ1aWx0czogWyJjdXJyZW50X3Nka2luZm8iXSwKK30KKworbGlua2VyX2NvbmZpZyB7CisgICAgbmFtZTogIm1lZGlhLWxpbmtlci1jb25maWciLAorICAgIHNyYzogImxpbmtlci5jb25maWcuanNvbiIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAorfQorCisvLyBFbmNhcHN1bGF0ZSB0aGUgY29udHJpYnV0aW9ucyBtYWRlIGJ5IHRoZSBjb20uYW5kcm9pZC5tZWRpYSB0byB0aGUgYm9vdGNsYXNzcGF0aC4KK2Jvb3RjbGFzc3BhdGhfZnJhZ21lbnQgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS1ib290Y2xhc3NwYXRoLWZyYWdtZW50IiwKKyAgICBjb250ZW50czogWyJ1cGRhdGFibGUtbWVkaWEiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAorCisgICAgYXBpOiB7CisgICAgICAgIHN0dWJfbGliczogWworICAgICAgICAgICAgLy8gU3R1YnMgZm9yIHRoZSBBUElzIHByb3ZpZGVkIGJ5IHVwZGF0YWJsZS1tZWRpYS4gVGhpcyBoYXMgdG8gYmUKKyAgICAgICAgICAgIC8vIHNwZWNpZmllZCBleHBsaWNpdGx5IGJlY2F1c2UgdXBkYXRhYmxlLW1lZGlhIGlzIG5vdCBhCisgICAgICAgICAgICAvLyBqYXZhX3Nka19saWJyYXJ5LgorICAgICAgICAgICAgImZyYW1ld29yay1tZWRpYSIsCisgICAgICAgIF0sCisgICAgfSwKKworICAgIC8vIFRoZSBib290Y2xhc3NwYXRoX2ZyYWdtZW50cyB0aGF0IHByb3ZpZGUgQVBJcyBvbiB3aGljaCB0aGlzIGRlcGVuZHMuCisgICAgZnJhZ21lbnRzOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwZXg6ICJjb20uYW5kcm9pZC5hcnQiLAorICAgICAgICAgICAgbW9kdWxlOiAiYXJ0LWJvb3RjbGFzc3BhdGgtZnJhZ21lbnQiLAorICAgICAgICB9LAorICAgIF0sCisKKyAgICAvLyBBZGRpdGlvbmFsIHN0dWJzIGxpYnJhcmllcyB0aGF0IHRoaXMgZnJhZ21lbnQncyBjb250ZW50cyB1c2Ugd2hpY2ggYXJlCisgICAgLy8gbm90IHByb3ZpZGVkIGJ5IGFub3RoZXIgYm9vdGNsYXNzcGF0aF9mcmFnbWVudC4KKyAgICBhZGRpdGlvbmFsX3N0dWJzOiBbCisgICAgICAgICJhbmRyb2lkLW5vbi11cGRhdGFibGUiLAorICAgIF0sCisKKyAgICAvLyBBZGRpdGlvbmFsIGhpZGRlbiBBUEkgZmxhZyBmaWxlcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuIFRoaXMgbXVzdCBvbmx5IGJlCisgICAgLy8gbW9kaWZpZWQgYnkgdGhlIFNvb25nIG9yIHBsYXRmb3JtIGNvbXBhdCB0ZWFtLgorICAgIGhpZGRlbl9hcGk6IHsKKyAgICAgICAgbWF4X3RhcmdldF9vX2xvd19wcmlvcml0eTogWyJoaWRkZW5hcGkvaGlkZGVuYXBpLW1heC10YXJnZXQtby1sb3ctcHJpb3JpdHkudHh0Il0sCisgICAgfSwKK30KKworLy8gRW5jYXBzdWxhdGUgdGhlIGNvbnRyaWJ1dGlvbnMgbWFkZSBieSB0aGUgY29tLmFuZHJvaWQubWVkaWEgdG8gdGhlIHN5c3RlbXNlcnZlcmNsYXNzcGF0aC4KK3N5c3RlbXNlcnZlcmNsYXNzcGF0aF9mcmFnbWVudCB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLXN5c3RlbXNlcnZlcmNsYXNzcGF0aC1mcmFnbWVudCIsCisgICAgY29udGVudHM6IFsic2VydmljZS1tZWRpYS1zIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEiXSwKIH0KIAogZmlsZWdyb3VwIHsKQEAgLTgwLDYgKzE1MiwxMiBAQAogICAgIGJpbmFyaWVzOiBbCiAgICAgICAgICJtZWRpYXN3Y29kZWMiLAogICAgIF0sCisgICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4xIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAogICAgIHByZWJ1aWx0czogWwogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1sZC5jb25maWcudHh0IiwKQEAgLTg4LDcgKzE2Niw2IEBACiAgICAgICAgICJjcmFzaF9kdW1wLnBvbGljeSIsCiAgICAgICAgICJtZWRpYXN3Y29kZWMueG1sIiwKICAgICBdLAotICAgIHVzZV92ZW5kb3I6IHRydWUsCiAgICAga2V5OiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5rZXkiLAogICAgIGNlcnRpZmljYXRlOiAiOmNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuY2VydGlmaWNhdGUiLAogCkBAIC0xMDMsNiArMTgwLDE2IEBACiAgICAgLy8gLSBidWlsZCBhcnRpZmFjdHMgKGxpYi9qYXZhbGliL2JpbikgYWdhaW5zdCBBbmRyb2lkIDEwIFNESwogICAgIC8vICAgc28gdGhhdCB0aGUgYXJ0aWZhY3RzIGNhbiBydW4uCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIC8vIEluZGljYXRlcyB0aGF0IHByZS1pbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGlzIGFwZXggY2FuIGJlIGNvbXByZXNzZWQuCisgICAgLy8gV2hldGhlciBpdCBhY3R1YWxseSB3aWxsIGJlIGNvbXByZXNzZWQgaXMgY29udHJvbGxlZCBvbiBwZXItZGV2aWNlIGJhc2lzLgorICAgIGNvbXByZXNzaWJsZTogdHJ1ZSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtbWVkaWF0cmFuc2NvZGluZy5yYyIsCisgICAgc3JjOiAibWVkaWF0cmFuc2NvZGluZy5yYyIsCisgICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKIHByZWJ1aWx0X2V0YyB7CmRpZmYgLS1naXQgYS9hcGV4L1RFU1RfTUFQUElORyBiL2FwZXgvVEVTVF9NQVBQSU5HCmluZGV4IGYwMzY1MTYuLjRiN2MwMTkgMTAwNjQ0Ci0tLSBhL2FwZXgvVEVTVF9NQVBQSU5HCisrKyBiL2FwZXgvVEVTVF9NQVBQSU5HCkBAIC0xNCwxNyArMTQsOSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVIMjY0UGxheWJhY2tUZXN0cyIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL2FwZXgvaGlkZGVuYXBpL09XTkVSUyBiL2FwZXgvaGlkZGVuYXBpL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhhMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9oaWRkZW5hcGkvT1dORVJTCkBAIC0wLDAgKzEsNSBAQAorIyBzb29uZy10ZWFtQCBhcyB0aGUgaGlkZGVuYXBpIGZpbGVzIGFyZSB0aWdodGx5IGNvdXBsZWQgd2l0aCBTb29uZworZmlsZTpwbGF0Zm9ybS9idWlsZC9zb29uZzovT1dORVJTCisKKyMgY29tcGF0LXRlYW1AIGZvciBjaGFuZ2VzIHRvIGhpZGRlbmFwaSBmaWxlcworZmlsZTp0b29scy9wbGF0Zm9ybS1jb21wYXQ6L09XTkVSUwpkaWZmIC0tZ2l0IGEvYXBleC9oaWRkZW5hcGkvaGlkZGVuYXBpLW1heC10YXJnZXQtby1sb3ctcHJpb3JpdHkudHh0IGIvYXBleC9oaWRkZW5hcGkvaGlkZGVuYXBpLW1heC10YXJnZXQtby1sb3ctcHJpb3JpdHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYmJiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2hpZGRlbmFwaS9oaWRkZW5hcGktbWF4LXRhcmdldC1vLWxvdy1wcmlvcml0eS50eHQKQEAgLTAsMCArMSw2IEBACitMYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yJENvbnRyb2xsZXJJbmZvOy0+PGluaXQ+KExhbmRyb2lkL2NvbnRlbnQvQ29udGV4dDtJSUxqYXZhL2xhbmcvU3RyaW5nO0xhbmRyb2lkL29zL0lJbnRlcmZhY2U7KVYKK0xhbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjIkQ29udHJvbGxlckluZm87LT5nZXRQYWNrYWdlTmFtZSgpTGphdmEvbGFuZy9TdHJpbmc7CitMYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yJENvbnRyb2xsZXJJbmZvOy0+Z2V0UHJvdmlkZXIoKUxhbmRyb2lkL21lZGlhL3VwZGF0ZS9NZWRpYVNlc3Npb24yUHJvdmlkZXIkQ29udHJvbGxlckluZm9Qcm92aWRlcjsKK0xhbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjIkQ29udHJvbGxlckluZm87LT5nZXRVaWQoKUkKK0xhbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjIkQ29udHJvbGxlckluZm87LT5pc1RydXN0ZWQoKVoKK0xhbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjIkQ29udHJvbGxlckluZm87LT5tUHJvdmlkZXI6TGFuZHJvaWQvbWVkaWEvdXBkYXRlL01lZGlhU2Vzc2lvbjJQcm92aWRlciRDb250cm9sbGVySW5mb1Byb3ZpZGVyOwpkaWZmIC0tZ2l0IGEvYXBleC9saW5rZXIuY29uZmlnLmpzb24gYi9hcGV4L2xpbmtlci5jb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2MwNzZlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9saW5rZXIuY29uZmlnLmpzb24KQEAgLTAsMCArMSwzIEBACit7CisgICAgInZpc2libGUiOiB0cnVlCit9CmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0Lmpzb24gYi9hcGV4L21hbmlmZXN0Lmpzb24KaW5kZXggZjFmNjlmNC4uNWQ3MjAzMSAxMDA2NDQKLS0tIGEvYXBleC9tYW5pZmVzdC5qc29uCisrKyBiL2FwZXgvbWFuaWZlc3QuanNvbgpAQCAtMSw0ICsxLDEwIEBACiB7CiAgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhIiwKLSAgInZlcnNpb24iOiAzMDk5OTk5MDAKKyAgInZlcnNpb24iOiAzMTk5OTk5MDAsCisgICJyZXF1aXJlTmF0aXZlTGlicyI6IFsKKyAgICAibGliYW5kcm9pZC5zbyIsCisgICAgImxpYmJpbmRlcl9uZGsuc28iLAorICAgICJsaWJtZWRpYW5kay5zbyIsCisgICAgIjpzcGhhbCIKKyAgXQogfQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCmluZGV4IGUyMGQ4NjcuLmIwZDk2MmQgMTAwNjQ0Ci0tLSBhL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgorKysgYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTEsNiArMSw2IEBACiB7CiAgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAotICAidmVyc2lvbiI6IDMwOTk5OTkwMCwKKyAgInZlcnNpb24iOiAzMTk5OTk5MDAsCiAgICJyZXF1aXJlTmF0aXZlTGlicyI6IFsKICAgICAiOnNwaGFsIgogICBdCmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCmluZGV4IGQxNzQ4MWIuLjBjOWI4YzggMTAwNjQ0Ci0tLSBhL2FwZXgvbWVkaWFzd2NvZGVjLnJjCisrKyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCkBAIC0yLDYgKzIsNSBAQAogICAgIGNsYXNzIG1haW4KICAgICB1c2VyIG1lZGlhY29kZWMKICAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCi0gICAgb3ZlcnJpZGUKICAgICBpb3ByaW8gcnQgNAogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL2FwZXgvbWVkaWF0cmFuc2NvZGluZy5yYyBiL2FwZXgvbWVkaWF0cmFuc2NvZGluZy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTlmOGJhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tZWRpYXRyYW5zY29kaW5nLnJjCkBAIC0wLDAgKzEsMTIgQEAKKyMgbWVkaWEudHJhbnNjb2Rpbmcgc2VydmljZSBpcyBkZWZpbmVkIG9uIGNvbS5hbmRyb2lkLm1lZGlhIGFwZXggd2hpY2ggZ29lcyBiYWNrCisjIHRvIEFQSTI5LCBidXQgd2Ugb25seSB3YW50IGl0IHN0YXJ0ZWQgb24gQVBJMzErIGRldmljZXMuIFNvIHdlIGRlY2xhcmUgaXQgYXMKKyMgImRpc2FibGVkIiBhbmQgc3RhcnQgaXQgZXhwbGljaXRseSBvbiBib290Lgorc2VydmljZSBtZWRpYS50cmFuc2NvZGluZyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS9iaW4vbWVkaWF0cmFuc2NvZGluZworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhCisgICAgZ3JvdXAgbWVkaWEKKyAgICBpb3ByaW8gcnQgNAorICAgICMgUmVzdHJpY3QgdG8gbGl0dGxlIGNvcmVzIG9ubHkgd2l0aCBzeXN0ZW0tYmFja2dyb3VuZCBjcHVzZXQuCisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvc3lzdGVtLWJhY2tncm91bmQvdGFza3MKKyAgICBpbnRlcmZhY2UgYWlkbCBtZWRpYS50cmFuc2NvZGluZworICAgIGRpc2FibGVkCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCmluZGV4IGEwNGFiM2YuLjhiODEwOTAgMTAwNjQ0Ci0tLSBhL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCisrKyBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCkBAIC0xMiwxMiArMTIsMjQgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGFwZXhfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdC5qc29uIiwKICAgICBmaWxlX2NvbnRleHRzOiAiOmNvbS5hbmRyb2lkLm1lZGlhLWZpbGVfY29udGV4dHMiLAogICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCi0gICAgcHJlYnVpbHRzOiBbInNka2luZm9fNDUiXSwKKyAgICBwcmVidWlsdHM6IFsKKyAgICAgICAgInNka2luZm9fNDUiLAorICAgICAgICAibWVkaWEtbGlua2VyLWNvbmZpZyIsCisgICAgXSwKICAgICBpbnN0YWxsYWJsZTogZmFsc2UsCiB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLmJwIGIvY2FtZXJhL0FuZHJvaWQuYnAKaW5kZXggZmEzNmJiMy4uNjg3OGMyMCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDM3IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItTUlUIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLVVuaWNvZGUtREZTIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNhbWVyYV9jbGllbnQiLAogCkBAIC0zNSwxMCArNjYsMTAgQEAKICAgICAgICAgIkNhbWVyYVBhcmFtZXRlcnMuY3BwIiwKICAgICAgICAgIkNhcHR1cmVSZXN1bHQuY3BwIiwKICAgICAgICAgIkNhbWVyYVBhcmFtZXRlcnMyLmNwcCIsCisgICAgICAgICJDYW1lcmFTZXNzaW9uU3RhdHMuY3BwIiwKICAgICAgICAgIklDYW1lcmEuY3BwIiwKICAgICAgICAgIklDYW1lcmFDbGllbnQuY3BwIiwKICAgICAgICAgIklDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAiLAotICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ29uY3VycmVudENhbWVyYS5jcHAiLAogICAgICAgICAiY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcCIsCkBAIC01MCw2ICs4MSw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtODcsNiArMTE5LDggQEAKICAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuYWlkbCIsCiAgICAgICAgICJhaWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsIiwKICAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFPZmZsaW5lU2Vzc2lvbi5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFJbmplY3Rpb25DYWxsYmFjay5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmFpZGwiLAogICAgIF0sCiAgICAgcGF0aDogImFpZGwiLAogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYS5jcHAgYi9jYW1lcmEvQ2FtZXJhLmNwcAppbmRleCA4NGQxZDkzLi42MDRkYmI4IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlIDxDYW1lcmEuaD4KLSNpbmNsdWRlIDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuaD4KIApAQCAtNzIsNjYgKzcxLDEwIEBACiB9CiAKIHNwPENhbWVyYT4gQ2FtZXJhOjpjb25uZWN0KGludCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkKQorICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLCBpbnQgdGFyZ2V0U2RrVmVyc2lvbikKIHsKLSAgICByZXR1cm4gQ2FtZXJhQmFzZVQ6OmNvbm5lY3QoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYTo6Y29ubmVjdExlZ2FjeShpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgIHNwPENhbWVyYT4mIGNhbWVyYSkKLXsKLSAgICBBTE9HVigiJXM6IGNvbm5lY3QgbGVnYWN5IGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwotICAgIHNwPENhbWVyYT4gYyA9IG5ldyBDYW1lcmEoY2FtZXJhSWQpOwotICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGNsID0gYzsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4mIGNzID0gQ2FtZXJhQmFzZVQ6OmdldENhbWVyYVNlcnZpY2UoKTsKLQotICAgIGJpbmRlcjo6U3RhdHVzIHJldDsKLSAgICBpZiAoY3MgIT0gbnVsbHB0cikgewotICAgICAgICByZXQgPSBjcy5nZXQoKS0+Y29ubmVjdExlZ2FjeShjbCwgY2FtZXJhSWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgLypvdXQqLyYoYy0+bUNhbWVyYSkpOwotICAgIH0KLSAgICBpZiAocmV0LmlzT2soKSAmJiBjLT5tQ2FtZXJhICE9IG51bGxwdHIpIHsKLSAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoYy0+bUNhbWVyYSktPmxpbmtUb0RlYXRoKGMpOwotICAgICAgICBjLT5tU3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgIGNhbWVyYSA9IGM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoKHJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgewotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRU5PREVWOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0NBTUVSQV9JTl9VU0U6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVCVVNZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FVVNFUlM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfREVQUkVDQVRFRF9IQUw6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQUJMRUQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVBQ0NFUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDoKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBBTE9HVygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29ubmVjdGluZyB0byBjYW1lcmEgJWQ6ICVzIiwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoY3MgIT0gbnVsbHB0cikgPyAiU2VydmljZSBub3QgYXZhaWxhYmxlIiA6IHJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYy5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBDYW1lcmFCYXNlVDo6Y29ubmVjdChjYW1lcmFJZCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwKKyAgICAgICAgICAgIGNsaWVudFBpZCwgdGFyZ2V0U2RrVmVyc2lvbik7CiB9CiAKIHN0YXR1c190IENhbWVyYTo6cmVjb25uZWN0KCkKQEAgLTIxNCwxMCArMTU3LDYgQEAKIHZvaWQgQ2FtZXJhOjpzdG9wUmVjb3JkaW5nKCkKIHsKICAgICBBTE9HVigic3RvcFJlY29yZGluZyIpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY2xlYXIoKTsKLSAgICB9CiAgICAgc3AgPDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmE+IGMgPSBtQ2FtZXJhOwogICAgIGlmIChjID09IDApIHJldHVybjsKICAgICBjLT5zdG9wUmVjb3JkaW5nKCk7CkBAIC0zMjUsMTIgKzI2NCw2IEBACiAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CiB9CiAKLXZvaWQgQ2FtZXJhOjpzZXRSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiYgbGlzdGVuZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtUmVjb3JkaW5nUHJveHlMaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCiB2b2lkIENhbWVyYTo6c2V0UHJldmlld0NhbGxiYWNrRmxhZ3MoaW50IGZsYWcpCiB7CiAgICAgQUxPR1YoInNldFByZXZpZXdDYWxsYmFja0ZsYWdzIik7CkBAIC0zODQsMTkgKzMxNyw2IEBACiAvLyBjYWxsYmFjayBmcm9tIGNhbWVyYSBzZXJ2aWNlIHdoZW4gdGltZXN0YW1wZWQgZnJhbWUgaXMgcmVhZHkKIHZvaWQgQ2FtZXJhOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpCiB7Ci0gICAgLy8gSWYgcmVjb3JkaW5nIHByb3h5IGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQsIGZvcndhcmQgdGhlIGZyYW1lIGFuZCByZXR1cm4uCi0gICAgLy8gVGhlIG90aGVyIGxpc3RlbmVyIChtTGlzdGVuZXIpIGlzIGlnbm9yZWQgYmVjYXVzZSB0aGUgcmVjZWl2ZXIgbmVlZHMgdG8KLSAgICAvLyBjYWxsIHJlbGVhc2VSZWNvcmRpbmdGcmFtZS4KLSAgICBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4gcHJveHlsaXN0ZW5lcjsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHByb3h5bGlzdGVuZXIgPSBtUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjsKLSAgICB9Ci0gICAgaWYgKHByb3h5bGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBwcm94eWxpc3RlbmVyLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIHNwPENhbWVyYUxpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC00MTMsMTkgKzMzMyw2IEBACiAKIHZvaWQgQ2FtZXJhOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkKIHsKLSAgICAvLyBJZiByZWNvcmRpbmcgcHJveHkgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCwgZm9yd2FyZCB0aGUgZnJhbWUgYW5kIHJldHVybi4KLSAgICAvLyBUaGUgb3RoZXIgbGlzdGVuZXIgKG1MaXN0ZW5lcikgaXMgaWdub3JlZCBiZWNhdXNlIHRoZSByZWNlaXZlciBuZWVkcyB0bwotICAgIC8vIGNhbGwgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlLgotICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiBwcm94eWxpc3RlbmVyOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgcHJveHlsaXN0ZW5lciA9IG1SZWNvcmRpbmdQcm94eUxpc3RlbmVyOwotICAgIH0KLSAgICBpZiAocHJveHlsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIHByb3h5bGlzdGVuZXItPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBoYW5kbGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3A8Q2FtZXJhTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ0NCwxOSArMzUxLDYgQEAKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4mIHRpbWVzdGFtcHMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKQogewotICAgIC8vIElmIHJlY29yZGluZyBwcm94eSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLCBmb3J3YXJkIHRoZSBmcmFtZSBhbmQgcmV0dXJuLgotICAgIC8vIFRoZSBvdGhlciBsaXN0ZW5lciAobUxpc3RlbmVyKSBpcyBpZ25vcmVkIGJlY2F1c2UgdGhlIHJlY2VpdmVyIG5lZWRzIHRvCi0gICAgLy8gY2FsbCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUuCi0gICAgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+IHByb3h5bGlzdGVuZXI7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBwcm94eWxpc3RlbmVyID0gbVJlY29yZGluZ1Byb3h5TGlzdGVuZXI7Ci0gICAgfQotICAgIGlmIChwcm94eWxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgcHJveHlsaXN0ZW5lci0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKHRpbWVzdGFtcHMsIGhhbmRsZXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgc3A8Q2FtZXJhTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTQ3NiwxMCArMzcwLDkgQEAKICAgICByZXR1cm4gbmV3IFJlY29yZGluZ1Byb3h5KHRoaXMpOwogfQogCi1zdGF0dXNfdCBDYW1lcmE6OlJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKQorc3RhdHVzX3QgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmcoKQogewogICAgIEFMT0dWKCJSZWNvcmRpbmdQcm94eTo6c3RhcnRSZWNvcmRpbmciKTsKLSAgICBtQ2FtZXJhLT5zZXRSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICBtQ2FtZXJhLT5yZWNvbm5lY3QoKTsKICAgICByZXR1cm4gbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKIH0KQEAgLTQ5MCwyMyArMzgzLDYgQEAKICAgICBtQ2FtZXJhLT5zdG9wUmVjb3JkaW5nKCk7CiB9CiAKLXZvaWQgQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCi17Ci0gICAgQUxPR1YoIlJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUiKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUobWVtKTsKLX0KLQotdm9pZCBDYW1lcmE6OlJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKLSAgICBBTE9HVigiUmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZSIpOwotICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShoYW5kbGUpOwotfQotCi12b2lkIENhbWVyYTo6UmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiYgaGFuZGxlcykgewotICAgIEFMT0dWKCJSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2giKTsKLSAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaChoYW5kbGVzKTsKLX0KLQogQ2FtZXJhOjpSZWNvcmRpbmdQcm94eTo6UmVjb3JkaW5nUHJveHkoY29uc3Qgc3A8Q2FtZXJhPiYgY2FtZXJhKQogewogICAgIG1DYW1lcmEgPSBjYW1lcmE7CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAgYi9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKaW5kZXggYWVjYjcwYS4uMDM0MzlmZCAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFCYXNlLmNwcApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogCiAvLyBuZWVkZWQgdG8gaW5zdGFudGlhdGUKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CkBAIC0xMjQsOSArMTI1LDcgQEAKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGlmIChnQ2FtZXJhU2VydmljZS5nZXQoKSA9PSAwKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJjb25maWcuZGlzYWJsZV9jYW1lcmFzZXJ2aWNlIiwgdmFsdWUsICIwIik7Ci0gICAgICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDAgJiYgc3RybmNhc2VjbXAodmFsdWUsICJmYWxzZSIsIDYpICE9IDApIHsKKyAgICAgICAgaWYgKENhbWVyYVV0aWxzOjppc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2U7CiAgICAgICAgIH0KIApAQCAtMTUzLDcgKzE1Miw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENhbSwgdHlwZW5hbWUgVENhbVRyYWl0cz4KIHNwPFRDYW0+IENhbWVyYUJhc2U8VENhbSwgVENhbVRyYWl0cz46OmNvbm5lY3QoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGludCB0YXJnZXRTZGtWZXJzaW9uKQogewogICAgIEFMT0dWKCIlczogY29ubmVjdCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgc3A8VENhbT4gYyA9IG5ldyBUQ2FtKGNhbWVyYUlkKTsKQEAgLTE2NCw3ICsxNjMsNyBAQAogICAgIGlmIChjcyAhPSBudWxscHRyKSB7CiAgICAgICAgIFRDYW1Db25uZWN0U2VydmljZSBmbkNvbm5lY3RTZXJ2aWNlID0gVENhbVRyYWl0czo6Zm5Db25uZWN0U2VydmljZTsKICAgICAgICAgcmV0ID0gKGNzLmdldCgpLT4qZm5Db25uZWN0U2VydmljZSkoY2wsIGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIC8qb3V0Ki8gJmMtPm1DYW1lcmEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki8gJmMtPm1DYW1lcmEpOwogICAgIH0KICAgICBpZiAocmV0LmlzT2soKSAmJiBjLT5tQ2FtZXJhICE9IG51bGxwdHIpIHsKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoYy0+bUNhbWVyYSktPmxpbmtUb0RlYXRoKGMpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggMTM1Mzg0YS4uYTRhZTcxYiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE2OSw2ICsxNzAsMTEgQEAKICAgICByZXR1cm4gZW50cnlDb3VudCgpID09IDA7CiB9CiAKK3NpemVfdCBDYW1lcmFNZXRhZGF0YTo6YnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1CdWZmZXIgPT0gTlVMTCkgPyAwIDoKKyAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShtQnVmZmVyKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnNvcnQoKSB7CiAgICAgaWYgKG1Mb2NrZWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFNZXRhZGF0YSBpcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNTIyLDYgKzUyOCw4IEBACiAgICAgICAgICAgICBtQnVmZmVyID0gYWxsb2NhdGVfY2FtZXJhX21ldGFkYXRhKG5ld0VudHJ5Q291bnQsCiAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFDb3VudCk7CiAgICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gTWFpbnRhaW4gb2xkIGJ1ZmZlciB0byBhdm9pZCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCisgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IG9sZEJ1ZmZlcjsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGFsbG9jYXRlIGxhcmdlciBtZXRhZGF0YSBidWZmZXIiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CkBAIC04NzIsNSArODgwLDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK21ldGFkYXRhX3ZlbmRvcl9pZF90IENhbWVyYU1ldGFkYXRhOjpnZXRWZW5kb3JJZCgpIHsKKyAgICByZXR1cm4gZ2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQobUJ1ZmZlcik7Cit9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKaW5kZXggNjg5NjljZi4uZTk1YzkxYyAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKaW5kZXggYzI5MjMzYy4uYTFjZjM1NSAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5jcHAgYi9jYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUwMzdmCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5jcHAKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXNzaW9uU3RhdHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKKworc3RhdHVzX3QgQ2FtZXJhU3RyZWFtU3RhdHM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CisgICAgaWYgKHBhcmNlbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgaW50IHdpZHRoID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZ3aWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgd2lkdGggZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBoZWlnaHQgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaGVpZ2h0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgZm9ybWF0ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZmb3JtYXQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGZvcm1hdCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGRhdGFTcGFjZSA9IDA7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmZGF0YVNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBkYXRhU3BhY2UgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3QgdXNhZ2UgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnVzYWdlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCB1c2FnZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCByZXF1ZXN0Q291bnQgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjQoJnJlcXVlc3RDb3VudCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgcmVxdWVzdCBjb3VudCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50NjRfdCBlcnJvckNvdW50ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZlcnJvckNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBlcnJvciBjb3VudCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IHN0YXJ0TGF0ZW5jeU1zID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZzdGFydExhdGVuY3lNcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc3RhcnQgbGF0ZW5jeSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IG1heEhhbEJ1ZmZlcnMgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm1heEhhbEJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1heCBIYWwgYnVmZmVycyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IG1heEFwcEJ1ZmZlcnMgPSAwOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJm1heEFwcEJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG1heCBhcHAgYnVmZmVycyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGhpc3RvZ3JhbVR5cGUgPSBISVNUT0dSQU1fVFlQRV9VTktOT1dOOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmhpc3RvZ3JhbVR5cGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGhpc3RvZ3JhbSB0eXBlIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaGlzdG9ncmFtQmluczsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEZsb2F0VmVjdG9yKCZoaXN0b2dyYW1CaW5zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBoaXN0b2dyYW0gYmlucyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaGlzdG9ncmFtQ291bnRzOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50NjRWZWN0b3IoJmhpc3RvZ3JhbUNvdW50cykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaGlzdG9ncmFtIGNvdW50cyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIG1EYXRhU3BhY2UgPSBkYXRhU3BhY2U7CisgICAgbVVzYWdlID0gdXNhZ2U7CisgICAgbVJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKKyAgICBtRXJyb3JDb3VudCA9IGVycm9yQ291bnQ7CisgICAgbVN0YXJ0TGF0ZW5jeU1zID0gc3RhcnRMYXRlbmN5TXM7CisgICAgbU1heEhhbEJ1ZmZlcnMgPSBtYXhIYWxCdWZmZXJzOworICAgIG1NYXhBcHBCdWZmZXJzID0gbWF4QXBwQnVmZmVyczsKKyAgICBtSGlzdG9ncmFtVHlwZSA9IGhpc3RvZ3JhbVR5cGU7CisgICAgbUhpc3RvZ3JhbUJpbnMgPSBzdGQ6Om1vdmUoaGlzdG9ncmFtQmlucyk7CisgICAgbUhpc3RvZ3JhbUNvdW50cyA9IHN0ZDo6bW92ZShoaXN0b2dyYW1Db3VudHMpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFTdHJlYW1TdGF0czo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE51bGwgcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1XaWR0aCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN0cmVhbSB3aWR0aCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1IZWlnaHQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gaGVpZ2h0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN0cmVhbSBmb3JtYXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtRGF0YVNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIGRhdGFTcGFjZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDY0KG1Vc2FnZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHN0cmVhbSB1c2FnZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDY0KG1SZXF1ZXN0Q291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBzdHJlYW0gcmVxdWVzdCBjb3VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDY0KG1FcnJvckNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIGVycm9yIGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobVN0YXJ0TGF0ZW5jeU1zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIHN0YXJ0IGxhdGVuY3khIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTWF4SGFsQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIG1heCBoYWwgYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU1heEFwcEJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBtYXggYXBwIGJ1ZmZlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1IaXN0b2dyYW1UeXBlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgaGlzdG9ncmFtIHR5cGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUZsb2F0VmVjdG9yKG1IaXN0b2dyYW1CaW5zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgaGlzdG9ncmFtIGJpbnMhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NFZlY3RvcihtSGlzdG9ncmFtQ291bnRzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgaGlzdG9ncmFtIGNvdW50cyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX1NUQVRFX09QRU4gPSAwOworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX1NUQVRFX0FDVElWRSA9IDE7Citjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfSURMRSA9IDI7Citjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfQ0xPU0VEID0gMzsKKworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX0ZBQ0lOR19CQUNLID0gMDsKK2NvbnN0IGludCBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9GQUNJTkdfRlJPTlQgPSAxOworY29uc3QgaW50IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX0ZBQ0lOR19FWFRFUk5BTCA9IDI7CisKK2NvbnN0IGludCBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9BUElfTEVWRUxfMSA9IDE7Citjb25zdCBpbnQgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfQVBJX0xFVkVMXzIgPSAyOworCitDYW1lcmFTZXNzaW9uU3RhdHM6OkNhbWVyYVNlc3Npb25TdGF0cygpIDoKKyAgICAgICAgbUZhY2luZyhDQU1FUkFfRkFDSU5HX0JBQ0spLAorICAgICAgICBtTmV3Q2FtZXJhU3RhdGUoQ0FNRVJBX1NUQVRFX0NMT1NFRCksCisgICAgICAgIG1BcGlMZXZlbCgwKSwKKyAgICAgICAgbUlzTmRrKGZhbHNlKSwKKyAgICAgICAgbUxhdGVuY3lNcygtMSksCisgICAgICAgIG1TZXNzaW9uVHlwZSgwKSwKKyAgICAgICAgbUludGVybmFsUmVjb25maWd1cmUoMCksCisgICAgICAgIG1SZXF1ZXN0Q291bnQoMCksCisgICAgICAgIG1SZXN1bHRFcnJvckNvdW50KDApLAorICAgICAgICBtRGV2aWNlRXJyb3IoZmFsc2UpIHt9CisKK0NhbWVyYVNlc3Npb25TdGF0czo6Q2FtZXJhU2Vzc2lvblN0YXRzKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwKKyAgICAgICAgaW50IGFwaUxldmVsLCBib29sIGlzTmRrLCBpbnQzMl90IGxhdGVuY3lNcykgOgorICAgICAgICAgICAgICAgIG1DYW1lcmFJZChjYW1lcmFJZCksCisgICAgICAgICAgICAgICAgbUZhY2luZyhmYWNpbmcpLAorICAgICAgICAgICAgICAgIG1OZXdDYW1lcmFTdGF0ZShuZXdDYW1lcmFTdGF0ZSksCisgICAgICAgICAgICAgICAgbUNsaWVudE5hbWUoY2xpZW50TmFtZSksCisgICAgICAgICAgICAgICAgbUFwaUxldmVsKGFwaUxldmVsKSwKKyAgICAgICAgICAgICAgICBtSXNOZGsoaXNOZGspLAorICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMobGF0ZW5jeU1zKSwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvblR5cGUoMCksCisgICAgICAgICAgICAgICAgbUludGVybmFsUmVjb25maWd1cmUoMCksCisgICAgICAgICAgICAgICAgbVJlcXVlc3RDb3VudCgwKSwKKyAgICAgICAgICAgICAgICBtUmVzdWx0RXJyb3JDb3VudCgwKSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlRXJyb3IoMCkge30KKworc3RhdHVzX3QgQ2FtZXJhU2Vzc2lvblN0YXRzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgeworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE51bGwgcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIFN0cmluZzE2IGlkOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmlkKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBjYW1lcmEgaWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgZmFjaW5nID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZmYWNpbmcpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGNhbWVyYSBmYWNpbmcgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgbmV3Q2FtZXJhU3RhdGU7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmbmV3Q2FtZXJhU3RhdGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIG5ldyBjYW1lcmEgc3RhdGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIFN0cmluZzE2IGNsaWVudE5hbWU7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmY2xpZW50TmFtZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2xpZW50IG5hbWUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQzMl90IGFwaUxldmVsOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmFwaUxldmVsKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBhcGkgbGV2ZWwgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJvb2wgaXNOZGs7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRCb29sKCZpc05kaykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaXNOZGsgZmxhZyBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBsYXRlbmN5TXM7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmbGF0ZW5jeU1zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBsYXRlbmN5TXMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3Qgc2Vzc2lvblR5cGU7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmc2Vzc2lvblR5cGUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHNlc3Npb24gdHlwZSBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBpbnRlcm5hbFJlY29uZmlndXJlOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkSW50MzIoJmludGVybmFsUmVjb25maWd1cmUpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIGludGVybmFsIHJlY29uZmlndXJlIGNvdW50IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHJlcXVlc3RDb3VudDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZyZXF1ZXN0Q291bnQpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHJlcXVlc3QgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDY0KCZyZXN1bHRFcnJvckNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCByZXN1bHQgZXJyb3IgY291bnQgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGJvb2wgZGV2aWNlRXJyb3I7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRCb29sKCZkZXZpY2VFcnJvcikpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgZGV2aWNlIGVycm9yIGZsYWcgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPENhbWVyYVN0cmVhbVN0YXRzPiBzdHJlYW1TdGF0czsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGVWZWN0b3IoJnN0cmVhbVN0YXRzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBzdHJlYW0gc3RhdGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1DYW1lcmFJZCA9IGlkOworICAgIG1GYWNpbmcgPSBmYWNpbmc7CisgICAgbU5ld0NhbWVyYVN0YXRlID0gbmV3Q2FtZXJhU3RhdGU7CisgICAgbUNsaWVudE5hbWUgPSBjbGllbnROYW1lOworICAgIG1BcGlMZXZlbCA9IGFwaUxldmVsOworICAgIG1Jc05kayA9IGlzTmRrOworICAgIG1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgbVNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7CisgICAgbUludGVybmFsUmVjb25maWd1cmUgPSBpbnRlcm5hbFJlY29uZmlndXJlOworICAgIG1SZXF1ZXN0Q291bnQgPSByZXF1ZXN0Q291bnQ7CisgICAgbVJlc3VsdEVycm9yQ291bnQgPSByZXN1bHRFcnJvckNvdW50OworICAgIG1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOworICAgIG1TdHJlYW1TdGF0cyA9IHN0ZDo6bW92ZShzdHJlYW1TdGF0cyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlc3Npb25TdGF0czo6d3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIGlmIChwYXJjZWwgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IE51bGwgcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1DYW1lcmFJZCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGNhbWVyYSBpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1GYWNpbmcpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBjYW1lcmEgZmFjaW5nISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU5ld0NhbWVyYVN0YXRlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbmV3IGNhbWVyYSBzdGF0ZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1DbGllbnROYW1lKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgY2xpZW50IG5hbWUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtQXBpTGV2ZWwpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBhcGkgbGV2ZWwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVCb29sKG1Jc05kaykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIGlzTmRrIGZsYWchIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTGF0ZW5jeU1zKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgbGF0ZW5jeSBpbiBNcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1TZXNzaW9uVHlwZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHdyaXRlIHNlc3Npb24gdHlwZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnRlcm5hbFJlY29uZmlndXJlKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgaW50ZXJuYWwgcmVjb25maWd1cmUgY291bnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+d3JpdGVJbnQ2NChtUmVxdWVzdENvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcmVxdWVzdCBjb3VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZUludDY0KG1SZXN1bHRFcnJvckNvdW50KSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcmVzdWx0IGVycm9yIGNvdW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPndyaXRlQm9vbChtRGV2aWNlRXJyb3IpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBkZXZpY2UgZXJyb3IgZmxhZyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgoZXJyID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IobVN0cmVhbVN0YXRzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgc3RyZWFtIHN0YXRlcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNtcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwIGIvY2FtZXJhL0NhbWVyYVV0aWxzLmNwcAppbmRleCA2N2ZjMTE2Li5hZjNjNDkyIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhVXRpbHMuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmFVdGlscy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKQEAgLTI3LDYgKzI4LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdCBjaGFyICprQ2FtZXJhU2VydmljZURpc2FibGVkUHJvcGVydHkgPSAiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSI7CisKIHN0YXR1c190IENhbWVyYVV0aWxzOjpnZXRSb3RhdGlvblRyYW5zZm9ybShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKICAgICAgICAgICAgICAgICAvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTEyMiw0ICsxMjUsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorYm9vbCBDYW1lcmFVdGlsczo6aXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7CisgICAgcmV0dXJuIGJhc2U6OkdldEJvb2xQcm9wZXJ0eShrQ2FtZXJhU2VydmljZURpc2FibGVkUHJvcGVydHksIGZhbHNlKTsKK30KKwogfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCmluZGV4IDc1NTA1MWMuLmJlNDc4OTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcAorKysgYi9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKQEAgLTg5LDcgKzg5LDcgQEAKIHN0YXR1c190IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQucmVtb3ZlKG1QaHlzaWNhbENhbWVyYUlkLnNpemUoKSk7CisgICAgbVBoeXNpY2FsQ2FtZXJhSWQuc2V0VG8odSIiKTsKICAgICBtUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5jbGVhcigpOwogCiAgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmbVBoeXNpY2FsQ2FtZXJhSWQpKSAhPSBPSykgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwIGIvY2FtZXJhL0lDYW1lcmFDbGllbnQuY3BwCmluZGV4IGMwMmM4MWIuLmJlZjJlYTAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9jYW1lcmEvSUNhbWVyYUNsaWVudC5jcHAKQEAgLTE0Miw3ICsxNDIsOCBAQAogICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgbWV0YWRhdGE7CiAgICAgICAgICAgICBpZiAoZGF0YS5kYXRhQXZhaWwoKSA+IDApIHsKICAgICAgICAgICAgICAgICBtZXRhZGF0YS5udW1iZXJfb2ZfZmFjZXMgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5udW1iZXJfb2ZfZmFjZXMgPD0gMCB8fAorICAgICAgICAgICAgICAgIC8vIFplcm8gZmFjZXMgaXMgYSB2YWxpZCBjYXNlLCB0byBub3RpZnkgY2xpZW50cyB0aGF0IG5vIGZhY2VzIGFyZSBub3cgdmlzaWJsZQorICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5udW1iZXJfb2ZfZmFjZXMgPCAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5udW1iZXJfb2ZfZmFjZXMgPiAoaW50MzJfdCkoSU5UMzJfTUFYIC8gc2l6ZW9mKGNhbWVyYV9mYWNlX3QpKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRvbyBsYXJnZSBmYWNlIGNvdW50OiAlZCIsIF9fRlVOQ1RJT05fXywgbWV0YWRhdGEubnVtYmVyX29mX2ZhY2VzKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwIGIvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAKaW5kZXggYmQ2YWY3NS4uOTc1MjNhNSAxMDA2NDQKLS0tIGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAKKysrIGIvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgTE9HX1RBRyAiSUNhbWVyYVJlY29yZGluZ1Byb3h5IgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFVdGlscy5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgpAQCAtMjksMTAgKzI4LDcgQEAKIAogZW51bSB7CiAgICAgU1RBUlRfUkVDT1JESU5HID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTVE9QX1JFQ09SRElORywKLSAgICBSRUxFQVNFX1JFQ09SRElOR19GUkFNRSwKLSAgICBSRUxFQVNFX1JFQ09SRElOR19GUkFNRV9IQU5ETEUsCi0gICAgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFX0JBVENILAorICAgIFNUT1BfUkVDT1JESU5HCiB9OwogCiAKQEAgLTQ0LDEyICs0MCwxMSBAQAogICAgIHsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGFydFJlY29yZGluZyhjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nKCkKICAgICB7CiAgICAgICAgIEFMT0dWKCJzdGFydFJlY29yZGluZyIpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX1JFQ09SRElORywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTYxLDQ2ICs1Niw2IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX1JFQ09SRElORywgZGF0YSwgJnJlcGx5KTsKICAgICB9Ci0KLSAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKQotICAgIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VSZWNvcmRpbmdGcmFtZSIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobWVtKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1JFQ09SRElOR19GUkFNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkgewotICAgICAgICBBTE9HVigicmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFSZWNvcmRpbmdQcm94eTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZU5hdGl2ZUhhbmRsZShoYW5kbGUpOwotCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1JFQ09SRElOR19GUkFNRV9IQU5ETEUsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgLy8gQ2xvc2UgdGhlIG5hdGl2ZSBoYW5kbGUgYmVjYXVzZSBjYW1lcmEgcmVjZWl2ZWQgYSBkdXAgY29weS4KLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIH0KLQotICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFSZWNvcmRpbmdQcm94eTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdWludDMyX3QgbiA9IGhhbmRsZXMuc2l6ZSgpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKG4pOwotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVOYXRpdmVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFX0JBVENILCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIC8vIENsb3NlIHRoZSBuYXRpdmUgaGFuZGxlIGJlY2F1c2UgY2FtZXJhIHJlY2VpdmVkIGEgZHVwIGNvcHkuCi0gICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlcykgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDYW1lcmFSZWNvcmRpbmdQcm94eSwgImFuZHJvaWQuaGFyZHdhcmUuSUNhbWVyYVJlY29yZGluZ1Byb3h5Iik7CkBAIC0xMTQsOSArNjksNyBAQAogICAgICAgICBjYXNlIFNUQVJUX1JFQ09SRElORzogewogICAgICAgICAgICAgQUxPR1YoIlNUQVJUX1JFQ09SRElORyIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFSZWNvcmRpbmdQcm94eSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhcnRSZWNvcmRpbmcobGlzdGVuZXIpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXJ0UmVjb3JkaW5nKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNUT1BfUkVDT1JESU5HOiB7CkBAIC0xMjUsNDYgKzc4LDYgQEAKICAgICAgICAgICAgIHN0b3BSZWNvcmRpbmcoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBSRUxFQVNFX1JFQ09SRElOR19GUkFNRTogewotICAgICAgICAgICAgQUxPR1YoIlJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUobWVtKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBSRUxFQVNFX1JFQ09SRElOR19GUkFNRV9IQU5ETEU6IHsKLSAgICAgICAgICAgIEFMT0dWKCJSRUxFQVNFX1JFQ09SRElOR19GUkFNRV9IQU5ETEUiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHksIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgLy8gcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlIHdpbGwgYmUgcmVzcG9uc2JsZSB0byBjbG9zZSB0aGUgbmF0aXZlIGhhbmRsZS4KLSAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShkYXRhLnJlYWROYXRpdmVIYW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFX0JBVENIOiB7Ci0gICAgICAgICAgICBBTE9HVigiUkVMRUFTRV9SRUNPUkRJTkdfRlJBTUVfSEFORExFX0JBVENIIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNhbWVyYVJlY29yZGluZ1Byb3h5LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBuID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRhdGEucmVhZFVpbnQzMigmbik7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBiYXRjaCBzaXplOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gaGFuZGxlczsKLSAgICAgICAgICAgIGhhbmRsZXMucmVzZXJ2ZShuKTsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGEgbnVsbCBuYXRpdmUgaGFuZGxlIGF0IGhhbmRsZXNbJWRdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVzLnB1c2hfYmFjayhoYW5kbGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaCB3aWxsIGJlIHJlc3BvbnNibGUgdG8gY2xvc2UgdGhlIG5hdGl2ZSBoYW5kbGUuCi0gICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaChoYW5kbGVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpAQCAtMTczLDQgKzg2LDMgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZmFmOGYuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciIKLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIERBVEFfQ0FMTEJBQ0tfVElNRVNUQU1QID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBSRUNPUkRJTkdfRlJBTUVfSEFORExFX0NBTExCQUNLX1RJTUVTVEFNUCwKLSAgICBSRUNPUkRJTkdfRlJBTUVfSEFORExFX0NBTExCQUNLX1RJTUVTVEFNUF9CQVRDSAotfTsKLQotY2xhc3MgQnBDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgaW1hZ2VEYXRhKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRhdGFDYWxsYmFjayIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2dUeXBlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihpbWFnZURhdGEpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERBVEFfQ0FMTEJBQ0tfVElNRVNUQU1QLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7Ci0gICAgICAgIEFMT0dWKCJyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZXN0YW1wKTsKLSAgICAgICAgZGF0YS53cml0ZU5hdGl2ZUhhbmRsZShoYW5kbGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVAsIGRhdGEsICZyZXBseSwKLSAgICAgICAgICAgICAgICBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0KLSAgICAgICAgLy8gVGhlIG5hdGl2ZSBoYW5kbGUgaXMgZHVwcGVkIGluIElDYW1lcmFDbGllbnQgc28gd2UgbmVlZCB0byBmcmVlIGl0IGhlcmUuCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5zZWNzX3Q+JiB0aW1lc3RhbXBzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICAgICAgQUxPR1YoInJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICB1aW50MzJfdCBuID0gdGltZXN0YW1wcy5zaXplKCk7Ci0gICAgICAgIGlmIChuICE9IGhhbmRsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHNpemUgb2YgdGltZXN0YW1wcyglenUpIGFuZCBoYW5kbGVzKCV6dSkgbWlzbWF0Y2ghIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aW1lc3RhbXBzLnNpemUoKSwgaGFuZGxlcy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIobik7Ci0gICAgICAgIGZvciAoYXV0byB0cyA6IHRpbWVzdGFtcHMpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NCh0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBoYW5kbGVzKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlTmF0aXZlSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFQ09SRElOR19GUkFNRV9IQU5ETEVfQ0FMTEJBQ0tfVElNRVNUQU1QX0JBVENILCBkYXRhLCAmcmVwbHksCi0gICAgICAgICAgICAgICAgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotCi0gICAgICAgIC8vIFRoZSBuYXRpdmUgaGFuZGxlIGlzIGR1cHBlZCBpbiBJQ2FtZXJhQ2xpZW50IHNvIHdlIG5lZWQgdG8gZnJlZSBpdCBoZXJlLgotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciwgImFuZHJvaWQuaGFyZHdhcmUuSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIERBVEFfQ0FMTEJBQ0tfVElNRVNUQU1QOiB7Ci0gICAgICAgICAgICBBTE9HVigiREFUQV9DQUxMQkFDS19USU1FU1RBTVAiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IGltYWdlRGF0YSA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ1R5cGUsIGltYWdlRGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVA6IHsKLSAgICAgICAgICAgIEFMT0dWKCJSRUNPUkRJTkdfRlJBTUVfSEFORExFX0NBTExCQUNLX1RJTUVTVEFNUCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRhdGEucmVhZEludDY0KCZ0aW1lc3RhbXApOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgdGltZXN0YW1wOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IGRhdGEucmVhZE5hdGl2ZUhhbmRsZSgpOwotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZWNlaXZlZCBhIG51bGwgbmF0aXZlIGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgaGFuZGxlIHdpbGwgYmUgZnJlZWQgaW4KLSAgICAgICAgICAgIC8vIEJwQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZS4KLSAgICAgICAgICAgIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBoYW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFQ09SRElOR19GUkFNRV9IQU5ETEVfQ0FMTEJBQ0tfVElNRVNUQU1QX0JBVENIOiB7Ci0gICAgICAgICAgICBBTE9HVigiUkVDT1JESU5HX0ZSQU1FX0hBTkRMRV9DQUxMQkFDS19USU1FU1RBTVBfQkFUQ0giKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgbiA9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkYXRhLnJlYWRVaW50MzIoJm4pOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgYmF0Y2ggc2l6ZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5zZWNzX3Q+IHRpbWVzdGFtcHM7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzOwotICAgICAgICAgICAgdGltZXN0YW1wcy5yZXNlcnZlKG4pOwotICAgICAgICAgICAgaGFuZGxlcy5yZXNlcnZlKG4pOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIG5zZWNzX3QgdDsKLSAgICAgICAgICAgICAgICByZXMgPSBkYXRhLnJlYWRJbnQ2NCgmdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWFkIHRpbWVzdGFtcFslZF06ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMucHVzaF9iYWNrKHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gZGF0YS5yZWFkTmF0aXZlSGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVjZWl2ZWQgYSBudWxsIG5hdGl2ZSBoYW5kbGUgYXQgaGFuZGxlc1slZF0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZXMucHVzaF9iYWNrKGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgbmF0aXZlIGhhbmRsZSB3aWxsIGJlIGZyZWVkIGluCi0gICAgICAgICAgICAvLyBCcENhbWVyYVJlY29yZGluZ1Byb3h5OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaC4KLSAgICAgICAgICAgIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCh0aW1lc3RhbXBzLCBoYW5kbGVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2NhbWVyYS9URVNUX01BUFBJTkcgYi9jYW1lcmEvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2UxODMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTEgQEAKK3sKKyAgInBvc3RzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzQ2FtZXJhVGVzdENhc2VzIgorICAgIH0sCisgICAgeworICAgICAgIm5hbWUiOiAiQ3RzQ2FtZXJhVGVzdENhc2VzIiwKKyAgICAgICJrZXl3b3JkcyI6IFsicHJpbWFyeS1kZXZpY2UiXQorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmluZGV4IGQ3MTNkMmQuLjI0ZmE5MTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAorKysgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKQEAgLTY2MCw2ICs2NjAsMTYgQEAKICAgICByZXR1cm4gc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKIH0KIAorYm9vbCBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmlzVmVuZG9yQ2FjaGVQcmVzZW50KG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNMb2NrKTsKKyAgICBpZiAoKHNHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUuZ2V0KCkgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgIChzR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlLT5nZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpLmZpbmQodmVuZG9ySWQpICE9CisgICAgICAgICAgICAgc0dsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZS0+Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKS5lbmQoKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogZXh0ZXJuICJDIiB7CiAKIGludCB2ZW5kb3JfdGFnX2Rlc2NyaXB0b3JfZ2V0X3RhZ19jb3VudChjb25zdCB2ZW5kb3JfdGFnX29wc190KiAvKnYqLykgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmFTZXNzaW9uU3RhdHMuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNjc3NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU2Vzc2lvblN0YXRzLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZTsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIENhbWVyYVNlc3Npb25TdGF0cyBjcHBfaGVhZGVyICJjYW1lcmEvQ2FtZXJhU2Vzc2lvblN0YXRzLmgiOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCmluZGV4IGFjN2EzNWIuLjc4YTc3ZDQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKQEAgLTIwLDYgKzIwLDggQEAKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLklDYW1lcmFDbGllbnQ7CiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLklDYW1lcmFEZXZpY2VVc2VyOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5JQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLklDYW1lcmFJbmplY3Rpb25TZXNzaW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuVmVuZG9yVGFnRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKIGltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIudXRpbHMuQ29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb247CkBAIC02OSw3ICs3MSw3IEBACiAKICAgICAvKioKICAgICAgKiBEZWZhdWx0IFVJRC9QSUQgdmFsdWVzIGZvciBub24tcHJpdmlsZWdlZCBjYWxsZXJzIG9mCi0gICAgICogY29ubmVjdCgpLCBjb25uZWN0RGV2aWNlKCksIGFuZCBjb25uZWN0TGVnYWN5KCkKKyAgICAgKiBjb25uZWN0KCkgYW5kIGNvbm5lY3REZXZpY2UoKQogICAgICAqLwogICAgIGNvbnN0IGludCBVU0VfQ0FMTElOR19VSUQgPSAtMTsKICAgICBjb25zdCBpbnQgVVNFX0NBTExJTkdfUElEID0gLTE7CkBAIC04MCw3ICs4Miw4IEBACiAgICAgSUNhbWVyYSBjb25uZWN0KElDYW1lcmFDbGllbnQgY2xpZW50LAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgU3RyaW5nIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkKTsKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbik7CiAKICAgICAvKioKICAgICAgKiBPcGVuIGEgY2FtZXJhIGRldmljZSB0aHJvdWdoIHRoZSBuZXcgY2FtZXJhIEFQSQpAQCAtOTAsMjEgKzkzLDggQEAKICAgICAgICAgICAgIFN0cmluZyBjYW1lcmFJZCwKICAgICAgICAgICAgIFN0cmluZyBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgQG51bGxhYmxlIFN0cmluZyBmZWF0dXJlSWQsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkKTsKLQotICAgIC8qKgotICAgICAqIGhhbFZlcnNpb24gY29uc3RhbnQgZm9yIGNvbm5lY3RMZWdhY3kKLSAgICAgKi8KLSAgICBjb25zdCBpbnQgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCA9IC0xOwotCi0gICAgLyoqCi0gICAgICogT3BlbiBhIGNhbWVyYSBkZXZpY2UgaW4gbGVnYWN5IG1vZGUsIGlmIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIG1vZHVsZSBIQUwuCi0gICAgICovCi0gICAgSUNhbWVyYSBjb25uZWN0TGVnYWN5KElDYW1lcmFDbGllbnQgY2xpZW50LAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sCi0gICAgICAgICAgICBTdHJpbmcgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQpOworICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IG9vbVNjb3JlT2Zmc2V0LAorICAgICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24pOwogCiAgICAgLyoqCiAgICAgICogQWRkIGxpc3RlbmVyIGZvciBjaGFuZ2VzIHRvIGNhbWVyYSBkZXZpY2UgYW5kIGZsYXNobGlnaHQgc3RhdGUuCkBAIC0xMjYsMTMgKzExNiwxNSBAQAogICAgICAgKiBjb3JyZXNwb25kaW5nIGNhbWVyYSBpZHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSBzZXNzaW9ucyB0aGUgc2V0IG9mIGNhbWVyYSBpZCBhbmQgc2Vzc2lvbiBjb25maWd1cmF0aW9uIHBhaXJzIHRvIGJlIHF1ZXJpZWQuCisgICAgICAqIEBwYXJhbSB0YXJnZXRTZGtWZXJzaW9uIHRoZSB0YXJnZXQgc2RrIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgICAgICAqIEByZXR1cm4gdHJ1ZSAgLSB0aGUgc2V0IG9mIGNvbmN1cnJlbnQgY2FtZXJhIGlkIGFuZCBzdHJlYW0gY29tYmluYXRpb25zIGlzIHN1cHBvcnRlZC4KICAgICAgICogICAgICAgICBmYWxzZSAtIHRoZSBzZXQgb2YgY29uY3VycmVudCBjYW1lcmEgaWQgYW5kIHN0cmVhbSBjb21iaW5hdGlvbnMgaXMgbm90IHN1cHBvcnRlZAogICAgICAgKiAgICAgICAgICAgICAgICAgT1IgdGhlIG1ldGhvZCB3YXMgY2FsbGVkIHdpdGggYSBzZXQgb2YgY2FtZXJhIGlkcyBub3QgcmV0dXJuZWQgYnkKICAgICAgICogICAgICAgICAgICAgICAgIGdldENvbmN1cnJlbnRDYW1lcmFJZHMoKS4KICAgICAgICovCiAgICAgYm9vbGVhbiBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgICAgIGluIENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb25bXSBzZXNzaW9ucyk7CisgICAgICAgICAgICBpbiBDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uW10gc2Vzc2lvbnMsCisgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbik7CiAKICAgICAvKioKICAgICAgKiBSZW1vdmUgbGlzdGVuZXIgZm9yIGNoYW5nZXMgdG8gY2FtZXJhIGRldmljZSBhbmQgZmxhc2hsaWdodCBzdGF0ZS4KQEAgLTE0Myw3ICsxMzUsNyBAQAogICAgICAqIFJlYWQgdGhlIHN0YXRpYyBjYW1lcmEgbWV0YWRhdGEgZm9yIGEgY2FtZXJhIGRldmljZS4KICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIEhBTCB2ZXJzaW9ucyA+PSAzLjIKICAgICAgKi8KLSAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIGNhbWVyYUlkKTsKKyAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIGNhbWVyYUlkLCBpbnQgdGFyZ2V0U2RrVmVyc2lvbik7CiAKICAgICAvKioKICAgICAgKiBSZWFkIGluIHRoZSB2ZW5kb3IgdGFnIGRlc2NyaXB0b3JzIGZyb20gdGhlIGNhbWVyYSBtb2R1bGUgSEFMLgpAQCAtMTc1LDYgKzE2Nyw5IEBACiAgICAgYm9vbGVhbiBzdXBwb3J0c0NhbWVyYUFwaShTdHJpbmcgY2FtZXJhSWQsIGludCBhcGlWZXJzaW9uKTsKICAgICAvLyBEZXRlcm1pbmVzIGlmIGEgY2FtZXJhSWQgaXMgYSBoaWRkZW4gcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuCiAgICAgYm9vbGVhbiBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKFN0cmluZyBjYW1lcmFJZCk7CisgICAgLy8gSW5qZWN0IHRoZSBleHRlcm5hbCBjYW1lcmEgdG8gcmVwbGFjZSB0aGUgaW50ZXJuYWwgY2FtZXJhIHNlc3Npb24uCisgICAgSUNhbWVyYUluamVjdGlvblNlc3Npb24gaW5qZWN0Q2FtZXJhKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGludGVybmFsQ2FtSWQsCisgICAgICAgICAgICBTdHJpbmcgZXh0ZXJuYWxDYW1JZCwgaW4gSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrIENhbWVyYUluamVjdGlvbkNhbGxiYWNrKTsKIAogICAgIHZvaWQgc2V0VG9yY2hNb2RlKFN0cmluZyBjYW1lcmFJZCwgYm9vbGVhbiBlbmFibGVkLCBJQmluZGVyIGNsaWVudEJpbmRlcik7CiAKQEAgLTE4OCw2ICsxODMsMTMgQEAKICAgICBvbmV3YXkgdm9pZCBub3RpZnlTeXN0ZW1FdmVudChpbnQgZXZlbnRJZCwgaW4gaW50W10gYXJncyk7CiAKICAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIG9mIGEgZGlzcGxheSBjb25maWd1cmF0aW9uIGNoYW5nZS4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEaXNwbGF5Q29uZmlndXJhdGlvbkNoYW5nZSgpOworCisgICAgLyoqCiAgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQogICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgogICAgICAqCmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCmluZGV4IDc1NzU5NDguLmJiYjAyODkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5haWRsCkBAIC0xNiwxMSArMTYsMTEgQEAKIAogcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlOwogCitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmFTZXNzaW9uU3RhdHM7CisKIC8qKgogICogQmluZGVyIGludGVyZmFjZSBmb3IgdGhlIGNhbWVyYSBzZXJ2aWNlIHByb3h5IHJ1bm5pbmcgaW4gc3lzdGVtX3NlcnZlci4KICAqCi0gKiBLZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlUHJveHkuaAotICoKICAqIEBoaWRlCiAgKi8KIGludGVyZmFjZSBJQ2FtZXJhU2VydmljZVByb3h5CkBAIC0zMCwzMCArMzAsMTUgQEAKICAgICAgKi8KICAgICBvbmV3YXkgdm9pZCBwaW5nRm9yVXNlclVwZGF0ZSgpOwogCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBuZXdDYW1lcmFTdGF0ZQotICAgICAqLwotICAgIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfT1BFTiA9IDA7Ci0gICAgY29uc3QgaW50IENBTUVSQV9TVEFURV9BQ1RJVkUgPSAxOwotICAgIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfSURMRSA9IDI7Ci0gICAgY29uc3QgaW50IENBTUVSQV9TVEFURV9DTE9TRUQgPSAzOwotCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBmYWNpbmcKLSAgICAgKi8KLSAgICBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19CQUNLID0gMDsKLSAgICBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19GUk9OVCA9IDE7Ci0gICAgY29uc3QgaW50IENBTUVSQV9GQUNJTkdfRVhURVJOQUwgPSAyOwotCi0gICAgLyoqCi0gICAgICogVmFsdWVzIGZvciBub3RpZnlDYW1lcmFTdGF0ZSBhcGkgbGV2ZWwKLSAgICAgKi8KLSAgICAgY29uc3QgaW50IENBTUVSQV9BUElfTEVWRUxfMSA9IDE7Ci0gICAgIGNvbnN0IGludCBDQU1FUkFfQVBJX0xFVkVMXzIgPSAyOwogCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBjYW1lcmEgZGV2aWNlLgogICAgICAqLwotICAgIG9uZXdheSB2b2lkIG5vdGlmeUNhbWVyYVN0YXRlKFN0cmluZyBjYW1lcmFJZCwgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLAotICAgICAgICAgICAgU3RyaW5nIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCk7CisgICAgb25ld2F5IHZvaWQgbm90aWZ5Q2FtZXJhU3RhdGUoaW4gQ2FtZXJhU2Vzc2lvblN0YXRzIGNhbWVyYVNlc3Npb25TdGF0cyk7CisKKyAgICAvKioKKyAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIHRvcCBhY3Rpdml0eSBuZWVkcyBhIHJvdGF0ZSBhbmQgY3JvcCBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKFN0cmluZyBwYWNrYWdlTmFtZSwgaW50IHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgaW50IGxlbnNGYWNpbmcpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAppbmRleCBiMTgzY2NjLi44ZTFmY2MwIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbApAQCAtODMsOSArODMsMTEgQEAKICAgICAgKiBAcGFyYW0gb3BlcmF0aW5nTW9kZSBUaGUga2luZCBvZiBzZXNzaW9uIHRvIGNyZWF0ZTsgZWl0aGVyIE5PUk1BTF9NT0RFIG9yCiAgICAgICogICAgIENPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERS4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSB2YWx1ZS4KICAgICAgKiBAcGFyYW0gc2Vzc2lvblBhcmFtcyBTZXNzaW9uIHdpZGUgY2FtZXJhIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lTXMgVGhlIHRpbWVzdGFtcCBvZiBzZXNzaW9uIGNyZWF0aW9uIHN0YXJ0LCBtZWFzdXJlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMuCiAgICAgICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyZWFtIGlkcyB0aGF0IGNhbiBiZSB1c2VkIGluIG9mZmxpbmUgbW9kZSB2aWEgInN3aXRjaFRvT2ZmbGluZSIKICAgICAgKi8KLSAgICBpbnRbXSBlbmRDb25maWd1cmUoaW50IG9wZXJhdGluZ01vZGUsIGluIENhbWVyYU1ldGFkYXRhTmF0aXZlIHNlc3Npb25QYXJhbXMpOworICAgIGludFtdIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwgaW4gQ2FtZXJhTWV0YWRhdGFOYXRpdmUgc2Vzc2lvblBhcmFtcywgbG9uZyBzdGFydFRpbWVNcyk7CiAKICAgICAvKioKICAgICAgICogQ2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGhhcyBjYW1lcmEgZGV2aWNlCkBAIC0xMTcsMTAgKzExOSwxMSBAQAogICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiB0aGUgaW5wdXQgYnVmZmVycwogICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IG9mIHRoZSBpbnB1dCBidWZmZXJzCiAgICAgICogQHBhcmFtIGZvcm1hdCBGb3JtYXQgb2YgdGhlIGlucHV0IGJ1ZmZlcnMuIE9uZSBvZiBIQUxfUElYRUxfRk9STUFUXyouCisgICAgICogQHBhcmFtIGlzTXVsdGlSZXNvbHV0aW9uIFdoZXRoZXIgdGhlIGlucHV0IHN0cmVhbSBzdXBwb3J0cyB2YXJpYWJsZSByZXNvbHV0aW9uIGltYWdlLgogICAgICAqCiAgICAgICogQHJldHVybiBuZXcgc3RyZWFtIElECiAgICAgICovCi0gICAgaW50IGNyZWF0ZUlucHV0U3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCk7CisgICAgaW50IGNyZWF0ZUlucHV0U3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwgYm9vbGVhbiBpc011bHRpUmVzb2x1dGlvbik7CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN1cmZhY2Ugb2YgdGhlIGlucHV0IHN0cmVhbS4KZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2suYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkxMzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFJbmplY3Rpb25DYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMjsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5JQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbjsKKworLyoqCisgKiBCaW5kZXIgaW50ZXJmYWNlIHVzZWQgdG8gY2FsbCBiYWNrIHRoZSBlcnJvciBzdGF0ZSBpbmplY3RlZCBieSB0aGUgZXh0ZXJuYWwgY2FtZXJhLAorICogYW5kIGNhbWVyYSBzZXJ2aWNlIGNhbiBiZSBzd2l0Y2hlZCBiYWNrIHRvIGludGVybmFsIGNhbWVyYSB3aGVuIGJpbmRlciBzaWduYWxzIHByb2Nlc3MgZGVhdGguCisgKgorICogQGhpZGUKKyAqLworaW50ZXJmYWNlIElDYW1lcmFJbmplY3Rpb25DYWxsYmFjaworeworICAgIC8vIEVycm9yIGNvZGVzIGZvciBvbkluamVjdGlvbkVycm9yCisgICAgLy8gVG8gaW5kaWNhdGUgYWxsIGludmFsaWQgZXJyb3IgY29kZXMKKyAgICBjb25zdCBpbnQgRVJST1JfSU5KRUNUSU9OX0lOVkFMSURfRVJST1IgPSAtMTsKKyAgICAvLyBUbyBpbmRpY2F0ZSB0aGUgY2FtZXJhIGluamVjdGlvbiBzZXNzaW9uIGhhcyBlbmNvdW50ZXJlZCBhIGZhdGFsIGVycm9yLCBzdWNoIGFzIGluamVjdGlvbgorICAgIC8vIGluaXQgZmFpbHVyZSwgY29uZmlndXJlIGZhaWx1cmUgb3IgaW5qZWN0aW5nIGZhaWx1cmUgZXRjLgorICAgIGNvbnN0IGludCBFUlJPUl9JTkpFQ1RJT05fU0VTU0lPTiA9IDA7CisgICAgLy8gVG8gaW5kaWNhdGUgdGhlIGNhbWVyYSBzZXJ2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIGZhdGFsIGVycm9yLgorICAgIGNvbnN0IGludCBFUlJPUl9JTkpFQ1RJT05fU0VSVklDRSA9IDE7CisgICAgLy8gVG8gaW5kaWNhdGUgdGhlIGluamVjdGlvbiBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBjZXJ0YWluIGNhbWVyYSBmdW5jdGlvbnMsIHN1Y2ggYXMKKyAgICAvLyB1bnN1cHBvcnQgc3RyZWFtIGZvcm1hdCwgbm8gY2FwdHVyZS9yZWNvcmQgZnVuY3Rpb24gb3Igbm8gbXVsdGktY2FtZXJhIGZ1bmN0aW9uIGV0Yy4KKyAgICAvLyBXaGVuIHRoaXMgZXJyb3Igb2NjdXJzLCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIGlzIHN0aWxsIGluIHRoZSBpbmplY3Qgc3RhdGUsIGFuZCB0aGUgYXBwIGlzCisgICAgLy8gbm90aWZpZWQgdG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIGFuZCBhIGJsYWNrIHNjcmVlbi4KKyAgICBjb25zdCBpbnQgRVJST1JfSU5KRUNUSU9OX1VOU1VQUE9SVEVEID0gMjsKKworICAgIG9uZXdheSB2b2lkIG9uSW5qZWN0aW9uRXJyb3IoaW50IGVycm9yQ29kZSk7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYUluamVjdGlvblNlc3Npb24uYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWMzMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYUluamVjdGlvblNlc3Npb24uYWlkbApAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTI7CisKKy8qKiBAaGlkZSAqLworaW50ZXJmYWNlIElDYW1lcmFJbmplY3Rpb25TZXNzaW9uCit7CisgICAgb25ld2F5IHZvaWQgc3RvcEluamVjdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IDE4NDNlYzQuLmViYzA5ZDcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTk0LDEyICs5NCwxMiBAQAogICAgIC8vIERvIG5vdCBkaXN0aW5ndWlzaCBudWxsIGFycmF5cyBmcm9tIDAtc2l6ZWQgYXJyYXlzLgogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgICAgICAvLyBQYXJjZWwud3JpdGVQYXJjZWxhYmxlQXJyYXkKLSAgICAgICAgc2l6ZV90IGxlbjsKLSAgICAgICAgY29uc3QgY2hhcjE2X3QqIGNsYXNzTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2SW5wbGFjZSgmbGVuKTsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gY2xhc3NOYW1lOworICAgICAgICBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZjbGFzc05hbWUpOwogICAgICAgICBBTE9HVigiJXM6IFJlYWQgc3VyZmFjZSBjbGFzcyA9ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBjbGFzc05hbWUgIT0gTlVMTCA/IFN0cmluZzgoY2xhc3NOYW1lKS5zdHJpbmcoKSA6ICI8bnVsbD4iKTsKKyAgICAgICAgICAgICAgY2xhc3NOYW1lLnZhbHVlX29yKCI8bnVsbD4iKS5jX3N0cigpKTsKIAotICAgICAgICBpZiAoY2xhc3NOYW1lID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBzdGQ6Om51bGxvcHQpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKaW5kZXggNGU5YjI3ZC4uMmJjY2Q4NyAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAKQEAgLTY4LDYgKzY4LDE0IEBACiAgICAgcmV0dXJuIG1QaHlzaWNhbENhbWVyYUlkOwogfQogCitib29sIE91dHB1dENvbmZpZ3VyYXRpb246OmlzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtSXNNdWx0aVJlc29sdXRpb247Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZPdXRwdXRDb25maWd1cmF0aW9uOjpnZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNlbnNvclBpeGVsTW9kZXNVc2VkOworfQorCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKCkgOgogICAgICAgICBtUm90YXRpb24oSU5WQUxJRF9ST1RBVElPTiksCiAgICAgICAgIG1TdXJmYWNlU2V0SUQoSU5WQUxJRF9TRVRfSUQpLApAQCAtNzUsNyArODMsOCBAQAogICAgICAgICBtV2lkdGgoMCksCiAgICAgICAgIG1IZWlnaHQoMCksCiAgICAgICAgIG1Jc0RlZmVycmVkKGZhbHNlKSwKLSAgICAgICAgbUlzU2hhcmVkKGZhbHNlKSB7CisgICAgICAgIG1Jc1NoYXJlZChmYWxzZSksCisgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbihmYWxzZSkgewogfQogCiBPdXRwdXRDb25maWd1cmF0aW9uOjpPdXRwdXRDb25maWd1cmF0aW9uKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCYgcGFyY2VsKSA6CkBAIC0xNDUsNiArMTU0LDE3IEBACiAKICAgICBwYXJjZWwtPnJlYWRTdHJpbmcxNigmbVBoeXNpY2FsQ2FtZXJhSWQpOwogCisgICAgaW50IGlzTXVsdGlSZXNvbHV0aW9uID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpc011bHRpUmVzb2x1dGlvbikpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc3VyZmFjZSBpc011bHRpUmVzb2x1dGlvbiBmbGFnIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzZW5zb3JQaXhlbE1vZGVzVXNlZDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZzZW5zb3JQaXhlbE1vZGVzVXNlZCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgc2Vuc29yIHBpeGVsIG1vZGUocykgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KICAgICBtUm90YXRpb24gPSByb3RhdGlvbjsKICAgICBtU3VyZmFjZVNldElEID0gc2V0SUQ7CiAgICAgbVN1cmZhY2VUeXBlID0gc3VyZmFjZVR5cGU7CkBAIC0xNTIsNiArMTcyLDcgQEAKICAgICBtSGVpZ2h0ID0gaGVpZ2h0OwogICAgIG1Jc0RlZmVycmVkID0gaXNEZWZlcnJlZCAhPSAwOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkICE9IDA7CisgICAgbUlzTXVsdGlSZXNvbHV0aW9uID0gaXNNdWx0aVJlc29sdXRpb24gIT0gMDsKICAgICBmb3IgKGF1dG8mIHN1cmZhY2UgOiBzdXJmYWNlU2hpbXMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiAlcCwgbmFtZSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBzdXJmYWNlLmdyYXBoaWNCdWZmZXJQcm9kdWNlci5nZXQoKSwKQEAgLTE1OSw5ICsxODAsMTEgQEAKICAgICAgICAgbUdicHMucHVzaF9iYWNrKHN1cmZhY2UuZ3JhcGhpY0J1ZmZlclByb2R1Y2VyKTsKICAgICB9CiAKKyAgICBtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPSBzdGQ6Om1vdmUoc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworCiAgICAgQUxPR1YoIiVzOiBPdXRwdXRDb25maWd1cmF0aW9uOiByb3RhdGlvbiA9ICVkLCBzZXRJZCA9ICVkLCBzdXJmYWNlVHlwZSA9ICVkLCIKLSAgICAgICAgICAiIHBoeXNpY2FsQ2FtZXJhSWQgPSAlcyIsIF9fRlVOQ1RJT05fXywgbVJvdGF0aW9uLCBtU3VyZmFjZVNldElELAotICAgICAgICAgIG1TdXJmYWNlVHlwZSwgU3RyaW5nOChtUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCkpOworICAgICAgICAgICIgcGh5c2ljYWxDYW1lcmFJZCA9ICVzLCBpc011bHRpUmVzb2x1dGlvbiA9ICVkIiwgX19GVU5DVElPTl9fLCBtUm90YXRpb24sCisgICAgICAgICAgbVN1cmZhY2VTZXRJRCwgbVN1cmZhY2VUeXBlLCBTdHJpbmc4KG1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSwgbUlzTXVsdGlSZXNvbHV0aW9uKTsKIAogICAgIHJldHVybiBlcnI7CiB9CkBAIC0xNzUsNiArMTk4LDcgQEAKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOwogICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKKyAgICBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKIH0KIAogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigKQEAgLTE4Myw3ICsyMDcsNyBAQAogICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBpc1NoYXJlZCkKICAgOiBtR2JwcyhnYnBzKSwgbVJvdGF0aW9uKHJvdGF0aW9uKSwgbVN1cmZhY2VTZXRJRChzdXJmYWNlU2V0SUQpLCBtU3VyZmFjZVR5cGUoc3VyZmFjZVR5cGUpLAogICAgIG1XaWR0aCh3aWR0aCksIG1IZWlnaHQoaGVpZ2h0KSwgbUlzRGVmZXJyZWQoZmFsc2UpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLAotICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHsgfQorICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLCBtSXNNdWx0aVJlc29sdXRpb24oZmFsc2UpIHsgfQogCiBzdGF0dXNfdCBPdXRwdXRDb25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAKQEAgLTIyNCwyNCArMjQ4LDU0IEBACiAgICAgZXJyID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KG1QaHlzaWNhbENhbWVyYUlkKTsKICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1Jc011bHRpUmVzb2x1dGlvbiA/IDEgOiAwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGVWZWN0b3IobVNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCiAgICAgcmV0dXJuIE9LOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBib29sIHNpbXBsZVZlY3RvcnNFcXVhbChUIGZpcnN0LCBUIHNlY29uZCkgeworICAgIGlmIChmaXJzdC5zaXplKCkgIT0gc2Vjb25kLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaXJzdC5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoZmlyc3RbaV0gIT0gc2Vjb25kW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgT3V0cHV0Q29uZmlndXJhdGlvbjo6Z2Jwc0VxdWFsKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gPiYgb3RoZXJHYnBzID0KICAgICAgICAgICAgIG90aGVyLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICByZXR1cm4gc2ltcGxlVmVjdG9yc0VxdWFsKG90aGVyR2JwcywgbUdicHMpOworfQogCi0gICAgaWYgKG1HYnBzLnNpemUoKSAhPSBvdGhlckdicHMuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKK2Jvb2wgT3V0cHV0Q29uZmlndXJhdGlvbjo6c2Vuc29yUGl4ZWxNb2Rlc1VzZWRFcXVhbChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBvdGhlcnNlbnNvclBpeGVsTW9kZXNVc2VkID0gb3RoZXIuZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKTsKKyAgICByZXR1cm4gc2ltcGxlVmVjdG9yc0VxdWFsKG90aGVyc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIG1TZW5zb3JQaXhlbE1vZGVzVXNlZCk7Cit9CisKK2Jvb2wgT3V0cHV0Q29uZmlndXJhdGlvbjo6c2Vuc29yUGl4ZWxNb2Rlc1VzZWRMZXNzVGhhbihjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBzcG1zID0gb3RoZXIuZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKTsKKworICAgIGlmIChtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQuc2l6ZSgpICE9ICBzcG1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gbVNlbnNvclBpeGVsTW9kZXNVc2VkLnNpemUoKSA8IHNwbXMuc2l6ZSgpOwogICAgIH0KIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdicHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1HYnBzW2ldICE9IG90aGVyR2Jwc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3Btcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNlbnNvclBpeGVsTW9kZXNVc2VkW2ldICE9IHNwbXNbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBtU2Vuc29yUGl4ZWxNb2Rlc1VzZWRbaV0gPCBzcG1zW2ldOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBib29sIE91dHB1dENvbmZpZ3VyYXRpb246OmdicHNMZXNzVGhhbihjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCmluZGV4IGE0MzFhMzMuLjdjZjYwODcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAKQEAgLTU1LDYgKzU1LDEyIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgYm9vbCBpbnB1dElzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2U7CisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRCb29sKCZpbnB1dElzTXVsdGlSZXNvbHV0aW9uKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCBtdWx0aS1yZXNvbHV0aW9uIGZsYWcgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+IG91dHB1dFN0cmVhbXM7CiAgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlVmVjdG9yKCZvdXRwdXRTdHJlYW1zKSkgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBvdXRwdXQgY29uZmlndXJhdGlvbnMgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNjUsNiArNzEsNyBAQAogICAgIG1JbnB1dFdpZHRoID0gaW5wdXRXaWR0aDsKICAgICBtSW5wdXRIZWlnaHQgPSBpbnB1dEhlaWdodDsKICAgICBtSW5wdXRGb3JtYXQgPSBpbnB1dEZvcm1hdDsKKyAgICBtSW5wdXRJc011bHRpUmVzb2x1dGlvbiA9IGlucHV0SXNNdWx0aVJlc29sdXRpb247CiAgICAgZm9yIChhdXRvJiBzdHJlYW0gOiBvdXRwdXRTdHJlYW1zKSB7CiAgICAgICAgIG1PdXRwdXRTdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOwogICAgIH0KQEAgLTkwLDYgKzk3LDkgQEAKICAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0Rm9ybWF0KTsKICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwogCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUJvb2wobUlucHV0SXNNdWx0aVJlc29sdXRpb24pOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKICAgICBlcnIgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtT3V0cHV0U3RyZWFtcyk7CiAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IGRjN2Y4OGEuLjhjYTg5MjAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfY2FtZXJhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2NhbWVyYV9saWNlbnNlIl0sCit9CisKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogImNhbWVyYXNlcnZlciIsCiAKQEAgLTMzLDExICs0MiwxMiBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi43IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLApAQCAtNDgsNiArNTgsNiBAQAogICAgIGluaXRfcmM6IFsiY2FtZXJhc2VydmVyLnJjIl0sCiAKICAgICB2aW50Zl9mcmFnbWVudHM6IFsKLSAgICAgICAgIm1hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4xLnhtbCIsCisgICAgICAgICJtYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMi54bWwiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4xLnhtbCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTE1YjM1Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KLSAgICA8aGFsPgotICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgotICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMTwvdmVyc2lvbj4KLSAgICAgICAgPGludGVyZmFjZT4KLSAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgotICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgotICAgICAgICA8L2ludGVyZmFjZT4KLSAgICA8L2hhbD4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4yLnhtbCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWZjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4yLnhtbApAQCAtMCwwICsxLDExIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJmcmFtZXdvcmsiPgorICAgIDxoYWw+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2U8L25hbWU+CisgICAgICAgIDx0cmFuc3BvcnQ+aHdiaW5kZXI8L3RyYW5zcG9ydD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8aW50ZXJmYWNlPgorICAgICAgICAgICAgPG5hbWU+SUNhbWVyYVNlcnZpY2U8L25hbWU+CisgICAgICAgICAgICA8aW5zdGFuY2U+ZGVmYXVsdDwvaW5zdGFuY2U+CisgICAgICAgIDwvaW50ZXJmYWNlPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmEuaAppbmRleCAyY2RiNjE3Li41OGNjZDY5IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYS5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgotI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGNhbWVyYS9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmEuaD4KICNpbmNsdWRlIDxjYW1lcmEvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhQ2xpZW50Lmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYUJhc2UuaD4KQEAgLTU5LDcgKzU4LDcgQEAKICAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmFDbGllbnQgVENhbUNhbGxiYWNrczsKICAgICB0eXBlZGVmIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMoOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OipUQ2FtQ29ubmVjdFNlcnZpY2UpCiAgICAgICAgIChjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYsCi0gICAgICAgIGludCwgY29uc3QgU3RyaW5nMTYmLCBpbnQsIGludCwKKyAgICAgICAgaW50LCBjb25zdCBTdHJpbmcxNiYsIGludCwgaW50LCBpbnQsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYT4qKTsKICAgICBzdGF0aWMgVENhbUNvbm5lY3RTZXJ2aWNlICAgICBmbkNvbm5lY3RTZXJ2aWNlOwpAQCAtODIsMTEgKzgxLDcgQEAKICAgICBzdGF0aWMgIHNwPENhbWVyYT4gIGNyZWF0ZShjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQ2FtZXJhPiYgY2FtZXJhKTsKICAgICBzdGF0aWMgIHNwPENhbWVyYT4gIGNvbm5lY3QoaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQpOwotCi0gICAgc3RhdGljICBzdGF0dXNfdCAgY29ubmVjdExlZ2FjeShpbnQgY2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBzcDxDYW1lcmE+JiBjYW1lcmEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLCBpbnQgdGFyZ2V0U2RrVmVyc2lvbik7CiAKICAgICAgICAgICAgIHZpcnR1YWwgICAgIH5DYW1lcmEoKTsKIApAQCAtMTU0LDcgKzE0OSw2IEBACiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRWaWRlb1RhcmdldChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFJlY29yZGluZ1Byb3h5TGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcik7CiAKICAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBwcmV2aWV3IGNhbGxiYWNrcyB0byBhcHAuIE9ubHkgb25lIG9mIHRoZSBvbGRlcgogICAgICAgICAgICAgLy8gY2FsbGJhY2tzIG9yIHRoZSBjYWxsYmFjayBzdXJmYWNlIGNhbiBiZSBhY3RpdmUgYXQgdGhlIHNhbWUgdGltZTsKQEAgLTE4NywxMiArMTgxLDggQEAKICAgICAgICAgZXhwbGljaXQgUmVjb3JkaW5nUHJveHkoY29uc3Qgc3A8Q2FtZXJhPiYgY2FtZXJhKTsKIAogICAgICAgICAvLyBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgaW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHN0b3BSZWNvcmRpbmcoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaCgKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiYgaGFuZGxlcyk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBzcDxDYW1lcmE+ICAgICAgICAgbUNhbWVyYTsKQEAgLTIwMyw4ICsxOTMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhKGNvbnN0IENhbWVyYSYpOwogICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhJiBvcGVyYXRvcj0oY29uc3QgQ2FtZXJhKTsKIAotICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiAgbVJlY29yZGluZ1Byb3h5TGlzdGVuZXI7Ci0KICAgICBmcmllbmQgY2xhc3MgICAgICAgIENhbWVyYUJhc2U7CiB9OwogCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYUJhc2UuaAppbmRleCA0OTliMGU2Li5lMTU2OTk0IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhQmFzZS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFCYXNlLmgKQEAgLTExMyw3ICsxMTMsNyBAQAogCiAgICAgc3RhdGljIHNwPFRDYW0+ICAgICAgY29ubmVjdChpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGludCB0YXJnZXRTZGtWZXJzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBkaXNjb25uZWN0KCk7CiAKICAgICB2b2lkICAgICAgICAgICAgICAgICBzZXRMaXN0ZW5lcihjb25zdCBzcDxUQ2FtTGlzdGVuZXI+JiBsaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IDlkMWI1YzcuLmM1NmVlNmQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0xMjgsNiArMTI4LDExIEBACiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGFsbG9jYXRlZCBjYW1lcmEgbWV0YWRhdGEgYnVmZmVyIHNpemUgaW4gYnl0ZXMuCisgICAgICovCisgICAgc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFNvcnQgbWV0YWRhdGEgYnVmZmVyIGZvciBmYXN0ZXIgZmluZAogICAgICAqLwogICAgIHN0YXR1c190IHNvcnQoKTsKQEAgLTIzNyw2ICsyNDIsMTEgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0VGFnRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IFZlbmRvclRhZ0Rlc2NyaXB0b3IqIHZUYWdzLCB1aW50MzJfdCAqdGFnKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY3VycmVudCB2ZW5kb3IgdGFnIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1ldGFkYXRhLgorICAgICAqLworICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IGdldFZlbmRvcklkKCk7CisKICAgcHJpdmF0ZToKICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqbUJ1ZmZlcjsKICAgICBtdXRhYmxlIGJvb2wgICAgICAgbUxvY2tlZDsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzk4YWNhCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9TRVJWSUNFX1NFU1NJT05fU1RBVFNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0NBTUVSQV9TRVJWSUNFX1NFU1NJT05fU1RBVFNfSAorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKKworLyoqCisgKiBDYW1lcmEgc3RyZWFtIGluZm8gYW5kIHN0YXRpc3RpY3MKKyAqLworY2xhc3MgQ2FtZXJhU3RyZWFtU3RhdHMgOiBwdWJsaWMgYW5kcm9pZDo6UGFyY2VsYWJsZSB7CitwdWJsaWM6CisgICAgZW51bSBIaXN0b2dyYW1UeXBlIHsKKyAgICAgICAgSElTVE9HUkFNX1RZUEVfVU5LTk9XTiA9IDAsCisgICAgICAgIEhJU1RPR1JBTV9UWVBFX0NBUFRVUkVfTEFURU5DWSA9IDEsCisgICAgfTsKKworICAgIGludCBtV2lkdGg7CisgICAgaW50IG1IZWlnaHQ7CisgICAgaW50IG1Gb3JtYXQ7CisgICAgaW50IG1EYXRhU3BhY2U7CisgICAgaW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBidWZmZXJzCisgICAgaW50NjRfdCBtUmVxdWVzdENvdW50OworICAgIC8vIFRoZSBudW1iZXIgb2YgYnVmZmVyIGVycm9ycworICAgIGludDY0X3QgbUVycm9yQ291bnQ7CisKKyAgICAvLyBUaGUgY2FwdHVyZSBsYXRlbmN5IG9mIDFzdCByZXF1ZXN0IGZvciB0aGlzIHN0cmVhbQorICAgIGludDMyX3QgbVN0YXJ0TGF0ZW5jeU1zOworCisgICAgLy8gQnVmZmVyIGNvdW50IGluZm8KKyAgICBpbnQgbU1heEhhbEJ1ZmZlcnM7CisgICAgaW50IG1NYXhBcHBCdWZmZXJzOworCisgICAgLy8gSGlzdG9ncmFtIHR5cGUuIFNvIGZhciBvbmx5IGNhcHR1cmUgbGF0ZW5jeSBoaXN0b2dyYW0gaXMgc3VwcG9ydGVkLgorICAgIGludCBtSGlzdG9ncmFtVHlwZTsKKyAgICAvLyBUaGUgYm91bmFyeSB2YWx1ZXMgc2VwYXJhdGluZyBhZGphY2VudCBoaXN0b2dyYW0gYmlucy4KKyAgICAvLyBBIHZlY3RvciBvZiB7aDEsIGgyLCBoM30gcmVwcmVzZW50cyBiaW5zIG9mIFswLCBoMSksIFtoMSwgaDIpLCBbaDIsIGgzKSwKKyAgICAvLyBhbmQgW2gzLCBpbmZpbml0eSkKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUhpc3RvZ3JhbUJpbnM7CisgICAgLy8gVGhlIGNvdW50cyBmb3IgYWxsIGhpc3RvZ3JhbSBiaW5zLgorICAgIC8vIHNpemUobUhpc3RvZ3JhbUJpbnMpICsgMSA9IHNpemUobUhpc3RvZ3JhbUNvdW50cykKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSGlzdG9ncmFtQ291bnRzOworCisgICAgQ2FtZXJhU3RyZWFtU3RhdHMoKSA6CisgICAgICAgICAgICBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Gb3JtYXQoMCksIG1EYXRhU3BhY2UoMCksIG1Vc2FnZSgwKSwKKyAgICAgICAgICAgIG1SZXF1ZXN0Q291bnQoMCksIG1FcnJvckNvdW50KDApLCBtU3RhcnRMYXRlbmN5TXMoMCksCisgICAgICAgICAgICBtTWF4SGFsQnVmZmVycygwKSwgbU1heEFwcEJ1ZmZlcnMoMCksIG1IaXN0b2dyYW1UeXBlKEhJU1RPR1JBTV9UWVBFX1VOS05PV04pIHt9CisgICAgQ2FtZXJhU3RyZWFtU3RhdHMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgZGF0YVNwYWNlLCBpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgaW50IG1heEhhbEJ1ZmZlcnMsIGludCBtYXhBcHBCdWZmZXJzKQorICAgICAgICAgICAgOiBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCksIG1Gb3JtYXQoZm9ybWF0KSwgbURhdGFTcGFjZShkYXRhU3BhY2UpLAorICAgICAgICAgICAgICBtVXNhZ2UodXNhZ2UpLCBtUmVxdWVzdENvdW50KDApLCBtRXJyb3JDb3VudCgwKSwgbVN0YXJ0TGF0ZW5jeU1zKDApLAorICAgICAgICAgICAgICBtTWF4SGFsQnVmZmVycyhtYXhIYWxCdWZmZXJzKSwgbU1heEFwcEJ1ZmZlcnMobWF4QXBwQnVmZmVycyksCisgICAgICAgICAgICAgIG1IaXN0b2dyYW1UeXBlKEhJU1RPR1JBTV9UWVBFX1VOS05PV04pIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLyoqCisgKiBDYW1lcmEgc2Vzc2lvbiBzdGF0aXN0aWNzCisgKgorICogVGhpcyBpbmNsdWRlcyBzZXNzaW9uIHdpZGUgaW5mbyBhbmQgc3RyZWFtIHN0YXRpc3RpY3MuCisgKi8KK2NsYXNzIENhbWVyYVNlc3Npb25TdGF0cyA6IHB1YmxpYyBhbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBWYWx1ZXMgZm9yIG5vdGlmeUNhbWVyYVN0YXRlIG5ld0NhbWVyYVN0YXRlCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfT1BFTjsKKyAgICBzdGF0aWMgY29uc3QgaW50IENBTUVSQV9TVEFURV9BQ1RJVkU7CisgICAgc3RhdGljIGNvbnN0IGludCBDQU1FUkFfU1RBVEVfSURMRTsKKyAgICBzdGF0aWMgY29uc3QgaW50IENBTUVSQV9TVEFURV9DTE9TRUQ7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZXMgZm9yIG5vdGlmeUNhbWVyYVN0YXRlIGZhY2luZworICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19CQUNLOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX0ZBQ0lOR19GUk9OVDsKKyAgICBzdGF0aWMgY29uc3QgaW50IENBTUVSQV9GQUNJTkdfRVhURVJOQUw7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZXMgZm9yIG5vdGlmeUNhbWVyYVN0YXRlIGFwaSBsZXZlbAorICAgICAqLworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX0FQSV9MRVZFTF8xOworICAgIHN0YXRpYyBjb25zdCBpbnQgQ0FNRVJBX0FQSV9MRVZFTF8yOworCisgICAgU3RyaW5nMTYgbUNhbWVyYUlkOworICAgIGludCBtRmFjaW5nOworICAgIGludCBtTmV3Q2FtZXJhU3RhdGU7CisgICAgU3RyaW5nMTYgbUNsaWVudE5hbWU7CisgICAgaW50IG1BcGlMZXZlbDsKKyAgICBib29sIG1Jc05kazsKKyAgICAvLyBsYXRlbmN5IGluIG1zIGZvciBjYW1lcmEgb3BlbiwgY2xvc2UsIG9yIHNlc3Npb24gY3JlYXRpb24uCisgICAgaW50IG1MYXRlbmN5TXM7CisKKyAgICAvLyBTZXNzaW9uIGluZm8gYW5kIHN0YXRpc3RpY3MKKyAgICBpbnQgbVNlc3Npb25UeXBlOworICAgIGludCBtSW50ZXJuYWxSZWNvbmZpZ3VyZTsKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNhcHR1cmUgcmVxdWVzdHMKKyAgICBpbnQ2NF90IG1SZXF1ZXN0Q291bnQ7CisgICAgLy8gVGhlIG51bWJlciBvZiByZXN1bHQgZXJyb3IKKyAgICBpbnQ2NF90IG1SZXN1bHRFcnJvckNvdW50OworICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBydW5zIGludG8gYW4gZXJyb3Igc3RhdGUKKyAgICBib29sIG1EZXZpY2VFcnJvcjsKKyAgICBzdGQ6OnZlY3RvcjxDYW1lcmFTdHJlYW1TdGF0cz4gbVN0cmVhbVN0YXRzOworCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgQ2FtZXJhU2Vzc2lvblN0YXRzKCk7CisgICAgQ2FtZXJhU2Vzc2lvblN0YXRzKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgaW50IGZhY2luZywgaW50IG5ld0NhbWVyYVN0YXRlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIGludCBhcGlMZXZlbCwgYm9vbCBpc05kaywgaW50MzJfdCBsYXRlbmN5TXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX1NFUlZJQ0VfU0VTU0lPTl9TVEFUU19ICmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhVXRpbHMuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCmluZGV4IGY1OTZmODAuLmEzOTdjY2QgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFVdGlscy5oCkBAIC00Nyw2ICs0NywxMSBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdGljIGJvb2wgaXNOYXRpdmVIYW5kbGVNZXRhZGF0YShjb25zdCBzcDxJTWVtb3J5PiYgaW1hZ2VEYXRhKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgaWYgY2FtZXJhIHNlcnZpY2UgaXMgZGlzYWJsZWQgb24gdGhpcyBkZXZpY2UKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCk7CisKICAgICBwcml2YXRlOgogICAgICAgICBDYW1lcmFVdGlscygpOwogfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaAppbmRleCAwMmFmMmYzLi40MzA2ZGMxIDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCkBAIC0yNCwxMyArMjQsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lcjsKLWNsYXNzIElNZW1vcnk7CiBjbGFzcyBQYXJjZWw7CiAKIC8qCi0gKiBUaGUgcHVycG9zZSBvZiBJQ2FtZXJhUmVjb3JkaW5nUHJveHkgYW5kIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyIGlzIHRvCi0gKiBhbGxvdyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGNhbWVyYSBkdXJpbmcgcmVjb3JkaW5nLgorICogVGhlIHB1cnBvc2Ugb2YgSUNhbWVyYVJlY29yZGluZ1Byb3h5IGlzIHRvCisgKiBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZSBjYW1lcmEgZHVyaW5nIHJlY29yZGluZyB3aXRoIHRoZSBvbGQgY2FtZXJhIEFQSS4KICAqCiAgKiBDYW1lcmEgc2VydmljZSBhbGxvd3Mgb25seSBvbmUgY2xpZW50IGF0IGEgdGltZS4gU2luY2UgY2FtY29yZGVyIGFwcGxpY2F0aW9uCiAgKiBuZWVkcyB0byBvd24gdGhlIGNhbWVyYSB0byBkbyB0aGluZ3MgbGlrZSB6b29tLCB0aGUgbWVkaWEgcmVjb3JkZXIgY2Fubm90CkBAIC00MiwzNSArNDAsMjkgQEAKICAqIElDYW1lcmFSZWNvcmRpbmdQcm94eQogICogICBzdGFydFJlY29yZGluZygpCiAgKiAgIHN0b3BSZWNvcmRpbmcoKQotICogICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKQogICoKLSAqIElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyCi0gKiAgIGRhdGFDYWxsYmFja1RpbWVzdGFtcCgpCi0KICAqIFRoZSBjYW1jb3JkZXIgYXBwIG9wZW5zIHRoZSBjYW1lcmEgYW5kIHN0YXJ0cyB0aGUgcHJldmlldy4gVGhlIGFwcCBwYXNzZXMKICAqIElDYW1lcmEgYW5kIElDYW1lcmFSZWNvcmRpbmdQcm94eSB0byB0aGUgbWVkaWEgcmVjb3JkZXIgYnkKICAqIE1lZGlhUmVjb3JkZXI6OnNldENhbWVyYSgpLiBUaGUgcmVjb3JkZXIgdXNlcyBJQ2FtZXJhIHRvIHNldHVwIHRoZSBjYW1lcmEgaW4KICAqIE1lZGlhUmVjb3JkZXI6OnN0YXJ0KCkuIEFmdGVyIHNldHVwLCB0aGUgcmVjb3JkZXIgZGlzY29ubmVjdHMgZnJvbSBjYW1lcmEKLSAqIHNlcnZpY2UuIFRoZSByZWNvcmRlciBjYWxscyBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0YXJ0UmVjb3JkaW5nKCkgYW5kCi0gKiBwYXNzZXMgYSBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lciB0byB0aGUgYXBwLiBUaGUgYXBwIGNvbm5lY3RzIGJhY2sgdG8KLSAqIGNhbWVyYSBzZXJ2aWNlIGFuZCBzdGFydHMgdGhlIHJlY29yZGluZy4gVGhlIGFwcCBvd25zIHRoZSBjYW1lcmEgYW5kIGNhbiBkbwotICogdGhpbmdzIGxpa2Ugem9vbS4gVGhlIG1lZGlhIHJlY29yZGVyIHJlY2VpdmVzIHRoZSB2aWRlbyBmcmFtZXMgZnJvbSB0aGUKLSAqIGxpc3RlbmVyIGFuZCByZWxlYXNlcyB0aGVtIGJ5IElDYW1lcmFSZWNvcmRpbmdQcm94eTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lLgotICogVGhlIHJlY29yZGVyIGNhbGxzIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6c3RvcFJlY29yZGluZygpIHRvIHN0b3AgdGhlCi0gKiByZWNvcmRpbmcuCisgKiBzZXJ2aWNlLiBUaGUgcmVjb3JkZXIgY2FsbHMgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpzdGFydFJlY29yZGluZygpIGFuZCBUaGUKKyAqIGFwcCBvd25zIHRoZSBjYW1lcmEgYW5kIGNhbiBkbyB0aGluZ3MgbGlrZSB6b29tLiBUaGUgbWVkaWEgcmVjb3JkZXIgcmVjZWl2ZXMKKyAqIHRoZSB2aWRlbyBmcmFtZXMgdmlhIGEgYnVmZmVyIHF1ZXVlLiAgVGhlIHJlY29yZGVyIGNhbGxzCisgKiBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OnN0b3BSZWNvcmRpbmcoKSB0byBzdG9wIHRoZSByZWNvcmRpbmcuCiAgKgogICogVGhlIGNhbGwgc2VxdWVuY2VzIGFyZSBhcyBmb2xsb3dzOgogICogMS4gVGhlIGFwcDogQ2FtZXJhLnVubG9jaygpLgogICogMi4gVGhlIGFwcDogTWVkaWFSZWNvcmRlci5zZXRDYW1lcmEoKS4KICAqIDMuIFN0YXJ0IHJlY29yZGluZwogICogICAgKDEpIFRoZSBhcHA6IE1lZGlhUmVjb3JkZXIuc3RhcnQoKS4KLSAqICAgICgyKSBUaGUgcmVjb3JkZXI6IElDYW1lcmEudW5sb2NrKCkgYW5kIElDYW1lcmEuZGlzY29ubmVjdCgpLgotICogICAgKDMpIFRoZSByZWNvcmRlcjogSUNhbWVyYVJlY29yZGluZ1Byb3h5LnN0YXJ0UmVjb3JkaW5nKCkuCi0gKiAgICAoNCkgVGhlIGFwcDogSUNhbWVyYS5yZWNvbm5lY3QoKS4KLSAqICAgICg1KSBUaGUgYXBwOiBJQ2FtZXJhLnN0YXJ0UmVjb3JkaW5nKCkuCisgKiAgICAoMikgVGhlIHJlY29yZGVyOiBJQ2FtZXJhLnNldFZpZGVvVGFyZ2V0KGJ1ZmZlciBxdWV1ZSkuCisgKiAgICAoMykgVGhlIHJlY29yZGVyOiBJQ2FtZXJhLnVubG9jaygpIGFuZCBJQ2FtZXJhLmRpc2Nvbm5lY3QoKS4KKyAqICAgICg0KSBUaGUgcmVjb3JkZXI6IElDYW1lcmFSZWNvcmRpbmdQcm94eS5zdGFydFJlY29yZGluZygpLgorICogICAgKDUpIFRoZSBhcHA6IElDYW1lcmEucmVjb25uZWN0KCkuCisgKiAgICAoNikgVGhlIGFwcDogSUNhbWVyYS5zdGFydFJlY29yZGluZygpLgogICogNC4gRHVyaW5nIHJlY29yZGluZwotICogICAgKDEpIFRoZSByZWNvcmRlcjogcmVjZWl2ZSBmcmFtZXMgZnJvbSBJQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAoKQotICogICAgKDIpIFRoZSByZWNvcmRlcjogcmVsZWFzZSBmcmFtZXMgYnkgSUNhbWVyYVJlY29yZGluZ1Byb3h5LnJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpLgorICogICAgKDEpIFRoZSByZWNvcmRlcjogcmVjZWl2ZSBmcmFtZXMgdmlhIGEgYnVmZmVyIHF1ZXVlCisgKiAgICAoMikgVGhlIHJlY29yZGVyOiByZWxlYXNlIGZyYW1lcyB2aWEgYSBidWZmZXIgcXVldWUKICAqIDUuIFN0b3AgcmVjb3JkaW5nCiAgKiAgICAoMSkgVGhlIGFwcDogTWVkaWFSZWNvcmRlci5zdG9wKCkKICAqICAgICgyKSBUaGUgcmVjb3JkZXI6IElDYW1lcmFSZWNvcmRpbmdQcm94eS5zdG9wUmVjb3JkaW5nKCkuCkBAIC04MiwxMiArNzQsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQ2FtZXJhUmVjb3JkaW5nUHJveHkpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc3RhcnRSZWNvcmRpbmcoY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+JiBsaXN0ZW5lcikgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UmVjb3JkaW5nKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BSZWNvcmRpbmcoKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTAzYzU2Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHlMaXN0ZW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9JQ0FNRVJBX1JFQ09SRElOR19QUk9YWV9MSVNURU5FUl9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfSUNBTUVSQV9SRUNPUkRJTkdfUFJPWFlfTElTVEVORVJfSAotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUGFyY2VsOwotY2xhc3MgSU1lbW9yeTsKLQotY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5zZWNzX3Q+JiB0aW1lc3RhbXBzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXI+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCmluZGV4IGIyZmJmM2EuLmIzNDQwZDUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApAQCAtMjQ5LDYgKzI0OSwxMiBAQAogICAgICAqLwogICAgIHN0YXRpYyB2b2lkIGNsZWFyR2xvYmFsVmVuZG9yVGFnQ2FjaGUoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybiB0cnVlIGlmIGdpdmVuIHZlbmRvciBpZCBpcyBwcmVzZW50IGluIHRoZSB2ZW5kb3IgdGFnIGNhY2hlcywgcmV0dXJuCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzVmVuZG9yQ2FjaGVQcmVzZW50KG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkKTsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCmluZGV4IDk1YzRmMzkuLmY4MGVkM2EgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKQEAgLTQ3LDYgKzQ3LDEwIEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZlcnJlZCgpIGNvbnN0OwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkKCkgY29uc3Q7CiAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3Q7CisKKyAgICAvLyBzZXQgb2Ygc2Vuc29yIHBpeGVsIG1vZGUgcmVzb2x1dGlvbnMgYWxsb3dlZCB7TUFYX1JFU09MVVRJT04sIERFRkFVTFRfTU9ERX07CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mICAgICAgICAgICAgZ2V0U2Vuc29yUGl4ZWxNb2Rlc1VzZWQoKSBjb25zdDsKICAgICAvKioKICAgICAgKiBLZWVwIGltcGwgdXAtdG8tZGF0ZSB3aXRoIE91dHB1dENvbmZpZ3VyYXRpb24uamF2YSBpbiBmcmFtZXdvcmtzL2Jhc2UKICAgICAgKi8KQEAgLTgzLDcgKzg3LDkgQEAKICAgICAgICAgICAgICAgICBtSXNEZWZlcnJlZCA9PSBvdGhlci5tSXNEZWZlcnJlZCAmJgogICAgICAgICAgICAgICAgIG1Jc1NoYXJlZCA9PSBvdGhlci5tSXNTaGFyZWQgJiYKICAgICAgICAgICAgICAgICBnYnBzRXF1YWwob3RoZXIpICYmCi0gICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWQgPT0gb3RoZXIubVBoeXNpY2FsQ2FtZXJhSWQgKTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCAmJgorICAgICAgICAgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbiA9PSBvdGhlci5tSXNNdWx0aVJlc29sdXRpb24gJiYKKyAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSk7CiAgICAgfQogICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKQEAgLTExNCwxMyArMTIwLDIyIEBACiAgICAgICAgIGlmIChtUGh5c2ljYWxDYW1lcmFJZCAhPSBvdGhlci5tUGh5c2ljYWxDYW1lcmFJZCkgewogICAgICAgICAgICAgcmV0dXJuIG1QaHlzaWNhbENhbWVyYUlkIDwgb3RoZXIubVBoeXNpY2FsQ2FtZXJhSWQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jc011bHRpUmVzb2x1dGlvbiAhPSBvdGhlci5tSXNNdWx0aVJlc29sdXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBtSXNNdWx0aVJlc29sdXRpb24gPCBvdGhlci5tSXNNdWx0aVJlc29sdXRpb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKG90aGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIHNlbnNvclBpeGVsTW9kZXNVc2VkTGVzc1RoYW4ob3RoZXIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBnYnBzTGVzc1RoYW4ob3RoZXIpOwogICAgIH0KKwogICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKICAgICB9CiAKICAgICBib29sIGdicHNFcXVhbChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3Q7CisgICAgYm9vbCBzZW5zb3JQaXhlbE1vZGVzVXNlZEVxdWFsKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdDsKKyAgICBib29sIHNlbnNvclBpeGVsTW9kZXNVc2VkTGVzc1RoYW4oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OwogICAgIGJvb2wgZ2Jwc0xlc3NUaGFuKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdDsKICAgICB2b2lkIGFkZEdyYXBoaWNQcm9kdWNlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnApIHttR2Jwcy5wdXNoX2JhY2soZ2JwKTt9CiBwcml2YXRlOgpAQCAtMTMzLDYgKzE0OCw4IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzRGVmZXJyZWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUlkOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1Jc011bHRpUmVzb2x1dGlvbjsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAgICAgICBtU2Vuc29yUGl4ZWxNb2Rlc1VzZWQ7CiB9OwogfSAvLyBuYW1lc3BhY2UgcGFyYW1zCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEyCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaAppbmRleCA2NDI4OGVkLi4yOTkxM2Y2IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBpbnQgZ2V0SW5wdXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRIZWlnaHQ7IH0KICAgICBpbnQgZ2V0SW5wdXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRGb3JtYXQ7IH0KICAgICBpbnQgZ2V0T3BlcmF0aW5nTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1PcGVyYXRpbmdNb2RlOyB9CisgICAgYm9vbCBpbnB1dElzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3QgeyByZXR1cm4gbUlucHV0SXNNdWx0aVJlc29sdXRpb247IH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CkBAIC02MSw3ICs2Miw4IEBACiAgICAgICAgICAgICAgICAgbUlucHV0V2lkdGggPT0gb3RoZXIubUlucHV0V2lkdGggJiYKICAgICAgICAgICAgICAgICBtSW5wdXRIZWlnaHQgPT0gb3RoZXIubUlucHV0SGVpZ2h0ICYmCiAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID09IG90aGVyLm1JbnB1dEZvcm1hdCAmJgotICAgICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IG90aGVyLm1PcGVyYXRpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSA9PSBvdGhlci5tT3BlcmF0aW5nTW9kZSAmJgorICAgICAgICAgICAgICAgIG1JbnB1dElzTXVsdGlSZXNvbHV0aW9uID09IG90aGVyLm1JbnB1dElzTXVsdGlSZXNvbHV0aW9uKTsKICAgICB9CiAKICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKQEAgLTgzLDYgKzg1LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbUlucHV0Rm9ybWF0IDwgb3RoZXIubUlucHV0Rm9ybWF0OwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1JbnB1dElzTXVsdGlSZXNvbHV0aW9uICE9IG90aGVyLm1JbnB1dElzTXVsdGlSZXNvbHV0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0SXNNdWx0aVJlc29sdXRpb24gPCBvdGhlci5tSW5wdXRJc011bHRpUmVzb2x1dGlvbjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtT3BlcmF0aW5nTW9kZSAhPSBvdGhlci5tT3BlcmF0aW5nTW9kZSkgewogICAgICAgICAgICAgcmV0dXJuIG1PcGVyYXRpbmdNb2RlIDwgb3RoZXIubU9wZXJhdGluZ01vZGU7CiAgICAgICAgIH0KQEAgLTEwNCw2ICsxMTAsNyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gbU91dHB1dFN0cmVhbXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0V2lkdGgsIG1JbnB1dEhlaWdodCwgbUlucHV0Rm9ybWF0LCBtT3BlcmF0aW5nTW9kZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRJc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlOwogfTsKIH0gLy8gbmFtZXNwYWNlIHBhcmFtcwogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9BbmRyb2lkLmJwIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCmluZGV4IDdiYTgyYzEuLmZlZjg3M2IgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDM3IEBACiAvLyB0byByZWZlciB0byBoZWFkZXJzIGluIHBhcmVudCBkaXJlY3RvcmllcyBhbmQgdGhlIGhlYWRlcnMgbGl2ZSBpbgogLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlLgogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9jYW1lcmFfbmRrX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfY2FtZXJhX25ka19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLU1JVCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1Vbmljb2RlLURGUyIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYmNhbWVyYTJuZGsubWFwLnR4dCIsCkBAIC02Miw3ICs5Myw3IEBACiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTEyMSw5ICsxNTIsMTEgQEAKICAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjEiLAogICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCiAgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMSIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMiIsCiAgICAgXSwKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMC1oZWxwZXIiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IGMxNWM1YTUuLmRkNjUyYzcgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTE4Niw2ICsxODYsNyBAQAogICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAogICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIHsKKyAgICBuc2Vjc190IHN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOwogICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwpAQCAtMTk5LDcgKzIwMCw3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCi0gICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycyk7CisgICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgc3RhcnRUaW1lTnMpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiRmFpbCB0byBjcmVhdGUgbmV3IHNlc3Npb24uIGNhbm5vdCBjb25maWd1cmUgc3RyZWFtcyIpOwogICAgICAgICByZXR1cm4gcmV0OwpAQCAtNDUwLDcgKzQ1MSwxMSBAQAogICAgIH0KIAogICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICAvLyBOb3RlOiBUaGUgdW5jb25maWd1cmF0aW9uIG9mIHNlc3Npb24gd29uJ3QgYmUgYWNjb3VudGVkIGZvciBzZXNzaW9uCisgICAgLy8gbGF0ZW5jeSBiZWNhdXNlIGEgc3RyZWFtIGNvbmZpZ3VyYXRpb24gd2l0aCAwIHN0cmVhbXMgd29uJ3QgZXZlciBiZWNvbWUKKyAgICAvLyBhY3RpdmUuCisgICAgbnNlY3NfdCBzdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyLCBzdGFydFRpbWVOcyk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZSBzdHJlYW0gZmFpbGVkLiBEZXZpY2UgbWlnaHQgc3RpbGwgYmUgY29uZmlndXJlZCEgcmV0ICVkIiwgcmV0KTsKICAgICB9CkBAIC02MDksNyArNjE0LDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAotICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsIG5zZWNzX3Qgc3RhcnRUaW1lTnMpIHsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgZW1wdHlPdXRwdXQ7CiAgICAgaWYgKG91dHB1dHMgPT0gbnVsbHB0cikgewogICAgICAgICBvdXRwdXRzID0gJmVtcHR5T3V0cHV0OwpAQCAtNzExLDcgKzcxNiw4IEBACiAgICAgICAgIHBhcmFtcy5hcHBlbmQoc2Vzc2lvblBhcmFtZXRlcnMtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSk7CiAgICAgfQogICAgIHN0ZDo6dmVjdG9yPGludD4gb2ZmbGluZVN0cmVhbUlkczsKLSAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UsIHBhcmFtcywgJm9mZmxpbmVTdHJlYW1JZHMpOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZSgvKmlzQ29uc3RyYWluZWRIaWdoU3BlZWQqLyBmYWxzZSwgcGFyYW1zLAorICAgICAgICAgICAgbnMybXMoc3RhcnRUaW1lTnMpLCAmb2ZmbGluZVN0cmVhbUlkcyk7CiAgICAgaWYgKHJlbW90ZVJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpIHsKICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgY2Fubm5vdCBzdXBwb3J0IGFwcCBvdXRwdXQgY29uZmlndXJhdGlvbjogJXMiLCBnZXRJZCgpLAogICAgICAgICAgICAgICAgIHJlbW90ZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CkBAIC0xMzYxLDMxICsxMzY3LDExIEBACiAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5pc1NlcXVlbmNlQ29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuaXNTZXF1ZW5jZUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgewotICAgICAgICAgICAgICAgIGF1dG8gY2JJdCA9IG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7Ci0gICAgICAgICAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOwotCi0gICAgICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUVuZCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uIHNwIGJlZm9yZSB3ZSBzZW5kIG91dCB0aGUgbWVzc2FnZQotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBndWFyYW50ZWUgdGhlIHJhcmUgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKLSAgICAgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAvLyBkZXN0cnVjdG9yIHdoaWxlIGhvbGRpbmcgZGV2aWNlIGxvY2sKLSAgICAgICAgICAgICAgICBjYmgubVNlc3Npb24uY2xlYXIoKTsKLSAgICAgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChpdC0+c2Vjb25kLmlzU2VxdWVuY2VDb21wbGV0ZWQgJiYgaXQtPnNlY29uZC5pc0luZmxpZ2h0Q29tcGxldGVkKSB7Ci0gICAgICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKSAhPSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKHNlcXVlbmNlSWQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VuZENhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZExvY2tlZChzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworCiAgICAgICAgICAgICBpdCA9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CiAgICAgICAgICAgICBBTE9HVigiJXM6IFJlbW92ZSBob2xkZXIgZm9yIHNlcXVlbmNlSWQgJWQiLCBfX0ZVTkNUSU9OX18sIHNlcXVlbmNlSWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTQxMiwxMyArMTM5OCw3IEBACiAgICAgICAgICAgICAgICAgbGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlcik7CiAgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gbGFzdENvbXBsZXRlZFJlZ3VsYXJGcmFtZU51bWJlcikgewogICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuaXNTZXF1ZW5jZUNvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGNhbGxiYWNrIGZvciB0aGlzIHNlcXVlbmNlCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKLSAgICAgICAgICAgICAgICBpZiAobVNlcXVlbmNlQ2FsbGJhY2tNYXAuY291bnQoc2VxdWVuY2VJZCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiTm8gY2FsbGJhY2sgZm91bmQgZm9yIHNlcXVlbmNlSWQgJWQiLCBzZXF1ZW5jZUlkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShzZXF1ZW5jZUlkKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VuZENhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZExvY2tlZChzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVtb3ZlIGhvbGRlciBmb3Igc2VxdWVuY2VJZCAlZCIsIF9fRlVOQ1RJT05fXywgc2VxdWVuY2VJZCk7CkBAIC0xNzA5LDUgKzE2ODksMzMgQEAKICAgICByZXR1cm4gcmV0OwogfQogCit2b2lkCitDYW1lcmFEZXZpY2U6OnNlbmRDYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWRMb2NrZWQoaW50IHNlcXVlbmNlSWQsIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICBpZiAoY2JJdCAhPSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSBjYkl0LT5zZWNvbmQ7CisgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworCisgICAgICAgIC8vIHNlbmQgc2VxIGNvbXBsZXRlIGNhbGxiYWNrCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CisKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgIC8vIFRoaXMgd2lsbCBndWFyYW50ZWUgdGhlIHJhcmUgY2FzZSB3aGVyZSB0aGUgbWVzc2FnZSBpcyBwcm9jZXNzZWQKKyAgICAgICAgLy8gYmVmb3JlIGNiaCBnb2VzIG91dCBvZiBzY29wZSBhbmQgY2F1c2luZyB3ZSBjYWxsIHRoZSBzZXNzaW9uCisgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICBjYmgubVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgQUxPR1coIk5vIGNhbGxiYWNrIGZvdW5kIGZvciBzZXF1ZW5jZUlkICVkIiwgc2VxdWVuY2VJZCk7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCBkOTM3ODY1Li4zNDRkOTY0IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgIHZvaWQgbm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOwogCiAgICAgY2FtZXJhX3N0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAotICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywgbnNlY3NfdCBzdGFydFRpbWVOcyk7CiAKICAgICAvLyBJbnB1dCBtZXNzYWdlIHdpbGwgYmUgcG9zdGVkIGFuZCBjbGVhcmVkIGFmdGVyIHRoaXMgcmV0dXJucwogICAgIHZvaWQgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKTsKQEAgLTM1NCw2ICszNTQsNyBAQAogICAgIHZvaWQgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKGNvbnN0IGludCBzZXF1ZW5jZUlkLCBjb25zdCBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcik7CiAgICAgdm9pZCBjaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CiAgICAgdm9pZCByZW1vdmVDb21wbGV0ZWRDYWxsYmFja0hvbGRlckxvY2tlZChpbnQ2NF90IGxhc3RDb21wbGV0ZWRSZWd1bGFyRnJhbWVOdW1iZXIpOworICAgIHZvaWQgc2VuZENhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZExvY2tlZChpbnQgc2VxdWVuY2VJZCwgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpOwogCiAgICAgLy8gTWlzYyB2YXJpYWJsZXMKICAgICBpbnQzMl90IG1TaGFkaW5nTWFwU2l6ZVsyXTsgICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYjU4ZWJlMi4uOTVlZjJiMiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKQEAgLTcwLDEyICs3MSw2IEBACiAgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKIH0KIAotc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSIsIHZhbHVlLCAiMCIpOwotICAgIHJldHVybiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwICYmIHN0cm5jYXNlY21wKHZhbHVlLCAiZmFsc2UiLCA2KSAhPSAwKTsKLX0KLQogc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIGdldENhbWVyYVNlcnZpY2VMb2NrZWQoKTsKQEAgLTgzLDcgKzc4LDcgQEAKIAogc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlTG9ja2VkKCkgewogICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CisgICAgICAgIGlmIChDYW1lcmFVdGlsczo6aXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOwogICAgICAgICB9CiAKQEAgLTY5NCw3ICs2ODksOSBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOwogICAgIH0KICAgICBDYW1lcmFNZXRhZGF0YSByYXdNZXRhZGF0YTsKLSAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZFN0ciksICZyYXdNZXRhZGF0YSk7CisgICAgaW50IHRhcmdldFNka1ZlcnNpb24gPSBhbmRyb2lkX2dldF9hcHBsaWNhdGlvbl90YXJnZXRfc2RrX3ZlcnNpb24oKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZFN0ciksCisgICAgICAgICAgICB0YXJnZXRTZGtWZXJzaW9uLCAmcmF3TWV0YWRhdGEpOwogICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKICAgICAgICAgc3dpdGNoKHNlcnZpY2VSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQ6CkBAIC03NDAsMTEgKzczNywxMyBAQAogCiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGRldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGU7CisgICAgaW50IHRhcmdldFNka1ZlcnNpb24gPSBhbmRyb2lkX2dldF9hcHBsaWNhdGlvbl90YXJnZXRfc2RrX3ZlcnNpb24oKTsKICAgICAvLyBObyB3YXkgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIG5hdGl2ZS4KICAgICAvLyBTZW5kIGEgemVybyBsZW5ndGggcGFja2FnZSBuYW1lIGFuZCBsZXQgY2FtZXJhIHNlcnZpY2UgZmlndXJlIGl0IG91dCBmcm9tIFVJRAogICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKLSAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQpLCBTdHJpbmcxNigiIiksIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm91dCovJmRldmljZVJlbW90ZSk7CisgICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkKSwgU3RyaW5nMTYoIiIpLCB7fSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm9vbVNjb3JlT2Zmc2V0Ki8wLAorICAgICAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogCiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzZXJ2aWNlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggYmZhNjBkOS4uZGFiMmZlZiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTI0LDYgKzI0LDI4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisvLyBGb3JtYXRzIG5vdCBsaXN0ZWQgaW4gdGhlIHB1YmxpYyBBUEksIGJ1dCBzdGlsbCBhdmFpbGFibGUgdG8gQUltYWdlUmVhZGVyCisvLyBFbnVtIHZhbHVlIG11c3QgbWF0Y2ggY29ycmVzcG9uZGluZyBlbnVtIGluIHVpL1B1YmxpY0Zvcm1hdC5oICh3aGljaCBpcyBub3QKKy8vIGF2YWlsYWJsZSB0byBWTkRLKQorZW51bSBBSU1BR0VfUFJJVkFURV9GT1JNQVRTIHsKKyAgICAvKioKKyAgICAgKiBVbnByb2Nlc3NlZCBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgcmF3CisgICAgICogZGVwdGggbWVhc3VyZW1lbnRzLCBvcGFxdWUgd2l0aCAxNiBiaXQKKyAgICAgKiBzYW1wbGVzLgorICAgICAqCisgICAgICovCisKKyAgICBBSU1BR0VfRk9STUFUX1JBV19ERVBUSCA9IDB4MTAwMiwKKworICAgIC8qKgorICAgICAqIERldmljZSBzcGVjaWZpYyAxMCBiaXRzIGRlcHRoIFJBVyBpbWFnZSBmb3JtYXQuCisgICAgICoKKyAgICAgKiA8cD5VbnByb2Nlc3NlZCBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgcmF3IGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTAgYml0IHNhbXBsZXMKKyAgICAgKiBhbmQgZGV2aWNlIHNwZWNpZmljIGJpdCBsYXlvdXQuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIMTAgPSAweDEwMDMsCit9OworCiAvKioKICAqIEFDYW1lcmFNZXRhZGF0YSBJbXBsZW1lbnRhdGlvbgogICovCkBAIC0yOTAsNiArMzEyLDEwIEBACiAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOwogICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1kxNikgewogICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBVzE2KSB7CisgICAgICAgICAgICBmb3JtYXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihBSU1BR0VfRk9STUFUX1JBV19ERVBUSCk7CisgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkFXMTApIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIMTApOwogICAgICAgICB9CiAKICAgICAgICAgZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGZvcm1hdCk7CkBAIC00MjYsNiArNDUyLDcgQEAKICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogICAgICAgICAgICAgaW50IHJldCA9IGdldF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkocmF3TWV0YWRhdGEsIGksICZlbnRyeSk7CiAgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRGF0YS0+dW5sb2NrKHJhd01ldGFkYXRhKTsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGVycm9yIHJlYWRpbmcgbWV0YWRhdGEgaW5kZXggJXp1IiwgX19GVU5DVElPTl9fLCBpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQpAQCAtNTI3LDExICs1NTQsMTMgQEAKICAgICAgICAgY2FzZSBBQ0FNRVJBX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREU6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9OT0lTRV9SRURVQ1RJT05fTU9ERToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTjoKKyAgICAgICAgY2FzZSBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1A6CiAgICAgICAgIGNhc2UgQUNBTUVSQV9TRU5TT1JfRVhQT1NVUkVfVElNRToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9GUkFNRV9EVVJBVElPTjoKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9TRU5TSVRJVklUWToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQToKICAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERToKKyAgICAgICAgY2FzZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU0hBRElOR19NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFOgogICAgICAgICBjYXNlIEFDQU1FUkFfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREU6CkBAIC01ODIsNiArNjExLDcgQEAKICAgICBBTkRST0lEX1NFTlNPUl9QUk9GSUxFX0hVRV9TQVRfTUFQLAogICAgIEFORFJPSURfU0VOU09SX1BST0ZJTEVfVE9ORV9DVVJWRSwKICAgICBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkUsCisgICAgQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKICAgICBBTkRST0lEX1NIQURJTkdfU1RSRU5HVEgsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLAogICAgIEFORFJPSURfU1RBVElTVElDU19TSEFSUE5FU1NfTUFQX01PREUsCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKaW5kZXggMDcxNzZjZi4uMmI3ZjA0MCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaApAQCAtNDUsOCArNDUsNiBAQAogCiBfX0JFR0lOX0RFQ0xTCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogLyoqCiAgKiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24gaXMgYW4gb3BhcXVlIHR5cGUgdGhhdCBtYW5hZ2VzIGZyYW1lIGNhcHR1cmVzIG9mIGEgY2FtZXJhIGRldmljZS4KICAqCkBAIC02Myw2ICs2MSwxMCBAQAogICovCiB0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFjaykodm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICpzZXNzaW9uKTsKIAorLyoqCisgKiBDYXB0dXJlIHNlc3Npb24gc3RhdGUgY2FsbGJhY2tzIHVzZWQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IGFuZAorICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnN9CisgKi8KIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyB7CiAgICAgLy8vIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQuCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKQEAgLTI0OCw2ICsyNTAsMTAgQEAKICAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGludDY0X3QgZnJhbWVOdW1iZXIpOwogCisvKioKKyAqIEFDYXB0dXJlQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBzdHJ1Y3R1cmUgdXNlZCBpbgorICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlfSBhbmQge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0fS4KKyAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgewogICAgIC8vLyBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0LgogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OwpAQCAtNDE1LDcgKzQyMSwxMCBAQAogICovCiB2b2lkIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pOwogCi1zdHJ1Y3QgQUNhbWVyYURldmljZTsKKy8qKgorICogQUNhbWVyYURldmljZSBpcyBvcGFxdWUgdHlwZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBhIGNhbWVyYSBkZXZpY2UuCisgKiBBIHBvaW50ZXIgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhfSBtZXRob2QuCisgKi8KIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFEZXZpY2UgQUNhbWVyYURldmljZTsKIAogLyoqCkBAIC01OTMsMTAgKzYwMiwxMCBAQAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9hYm9ydENhcHR1cmVzKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4Ci0KKy8qKgorICogT3BhcXVlIG9iamVjdCBmb3IgY2FwdHVyZSBzZXNzaW9uIG91dHB1dCwgdXNlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlfSBvcgorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGV9IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZS4KKyAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dDsKIAogLyoqCkBAIC02MTAsOSArNjE5LDkgQEAKICAqCiAgKiA8cD5OYXRpdmUgd2luZG93cyB0aGF0IGdldCByZW1vdmVkIG11c3Qgbm90IGJlIHBhcnQgb2YgYW55IGFjdGl2ZSByZXBlYXRpbmcgb3Igc2luZ2xlL2J1cnN0CiAgKiByZXF1ZXN0IG9yIGhhdmUgYW55IHBlbmRpbmcgcmVzdWx0cy4gQ29uc2lkZXIgdXBkYXRpbmcgcmVwZWF0aW5nIHJlcXVlc3RzIHZpYQotICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9zZXRSZXBlYXRpbmdSZXF1ZXN0fSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgbGFzdCBmcmFtZSBudW1iZXIKKyAqIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdH0gYW5kIHRoZW4gd2FpdCBmb3IgdGhlIGxhc3QgZnJhbWUgbnVtYmVyCiAgKiB3aGVuIHRoZSBzZXF1ZW5jZSBjb21wbGV0ZXMKLSAqIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrI29uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkfS48L3A+CisgKiB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWR9LjwvcD4KICAqCiAgKiA8cD5OYXRpdmUgd2luZG93cyB0aGF0IGdldCBhZGRlZCBtdXN0IG5vdCBiZSBwYXJ0IG9mIGFueSBvdGhlciByZWdpc3RlcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dAogICogYW5kIG11c3QgYmUgY29tcGF0aWJsZS4gQ29tcGF0aWJsZSB3aW5kb3dzIG11c3QgaGF2ZSBtYXRjaGluZyBmb3JtYXQsIHJvdGF0aW9uIGFuZApAQCAtNjQxLDkgKzY1MCw3IEBACiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0KEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7Ci0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKIC8qKgogICogVGhlIGRlZmluaXRpb24gb2YgZmluYWwgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2sgd2l0aCBsb2dpY2FsIG11bHRpLWNhbWVyYSBzdXBwb3J0LgogICoKQEAgLTcyMSw3ICs3MjgsMTUgQEAKICAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCiAgICAgICovCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTdGFydGVkfS4KKyAgICAgKi8KICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0ICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZVByb2dyZXNzZWR9LgorICAgICAqLwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0ICAgICAgICBvbkNhcHR1cmVQcm9ncmVzc2VkOwogCiAgICAgLyoqCkBAIC03NTksMTAgKzc3NCwxOCBAQAogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKIAogICAgIC8qKgotICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKiBTYW1lIGFzIHtAbGluayBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyNvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZH0uCiAgICAgICovCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkfS4KKyAgICAgKi8KICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3Mjb25DYXB0dXJlQnVmZmVyTG9zdH0uCisgICAgICovCiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiB9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3M7CiAKQEAgLTc4OCw4ICs4MTEsNiBAQAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggMTUzN2JkZS4uN2JlNGJkMyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC00NCw4ICs0NCw2IEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCiAvKioKICAqIEFDYW1lcmFEZXZpY2UgaXMgb3BhcXVlIHR5cGUgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBjYW1lcmEgZGV2aWNlLgogICoKQEAgLTEyNiw2ICsxMjQsMTAgQEAKICAqLwogdHlwZWRlZiB2b2lkICgqQUNhbWVyYURldmljZV9FcnJvclN0YXRlQ2FsbGJhY2spKHZvaWQqIGNvbnRleHQsIEFDYW1lcmFEZXZpY2UqIGRldmljZSwgaW50IGVycm9yKTsKIAorLyoqCisgKiBBcHBsaWNhdGlvbnMnIGNhbGxiYWNrcyBmb3IgY2FtZXJhIGRldmljZSBzdGF0ZSBjaGFuZ2VzLCByZWdpc3RlciB3aXRoCisgKiB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYX0uCisgKi8KIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgewogICAgIC8vLyBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0LgogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OwpAQCAtMjAwLDYgKzIwMiwxMCBAQAogICovCiBjb25zdCBjaGFyKiBBQ2FtZXJhRGV2aWNlX2dldElkKGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAorLyoqCisgKiBDYXB0dXJlIHJlcXVlc3QgcHJlLWRlZmluZWQgdGVtcGxhdGUgdHlwZXMsIHVzZWQgaW4ge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3R9CisgKiBhbmQge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqLwogdHlwZWRlZiBlbnVtIHsKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSByZXF1ZXN0IHN1aXRhYmxlIGZvciBhIGNhbWVyYSBwcmV2aWV3IHdpbmRvdy4gU3BlY2lmaWNhbGx5LCB0aGlzCkBAIC0zMDMsMTAgKzMwOSwxMiBAQAogICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAogICAgICAgICAvKm91dCovQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotCisvKioKKyAqIE9wYXF1ZSBvYmplY3QgZm9yIENhcHR1cmVTZXNzaW9uT3V0cHV0IGNvbnRhaW5lciwgdXNlCisgKiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZX0gdG8gY3JlYXRlIGFuIGluc3RhbmNlLgorICovCiB0eXBlZGVmIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyOwogCi10eXBlZGVmIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0OwogCiAvKioKICAqIENyZWF0ZSBhIGNhcHR1cmUgc2Vzc2lvbiBvdXRwdXQgY29udGFpbmVyLgpAQCAtNjg3LDEwICs2OTUsNiBAQAogICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKioKICAqIENyZWF0ZSBhIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0LgogICoKQEAgLTc4MiwxMCArNzg2LDYgQEAKICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCiAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKLQogLyoqCiAgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKICAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgpAQCAtODU0LDcgKzg1NCw3IEBACiAgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCiAvKioKLSAqIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHtAQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfSBpcyBzdXBwb3J0ZWQgYnkKKyAqIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJ9IGlzIHN1cHBvcnRlZCBieQogICogdGhlIGNhbWVyYSBkZXZpY2UuCiAgKgogICogPHA+VGhpcyBtZXRob2QgcGVyZm9ybXMgYSBydW50aW1lIGNoZWNrIG9mIGEgZ2l2ZW4ge0BsaW5rCkBAIC04ODUsMTMgKzg4NSwxMiBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuPC9saT4KICAqICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSBpZiB0aGUgcXVlcnkgb3BlcmF0aW9uIGlzIG5vdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGRldmljZS48L2xpPgorICogICAgICAgIDwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCiAgICAgICAgIGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSwKICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFFcnJvci5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFFcnJvci5oCmluZGV4IGZjNjE4ZWUuLjI2ZGI3ZjIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUVycm9yLmgKQEAgLTQwLDkgKzQwLDEzIEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCisvKioKKyAqIENhbWVyYSBzdGF0dXMgZW51bSB0eXBlcy4KKyAqLwogdHlwZWRlZiBlbnVtIHsKKyAgICAvKioKKyAgICAgKiBDYW1lcmEgb3BlcmF0aW9uIGhhcyBzdWNjZWVkZWQuCisgICAgICovCiAgICAgQUNBTUVSQV9PSyA9IDAsCiAKICAgICBBQ0FNRVJBX0VSUk9SX0JBU0UgICAgICAgICAgICAgICAgICA9IC0xMDAwMCwKQEAgLTEzOCw4ICsxNDIsNiBAQAogICAgIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gQUNBTUVSQV9FUlJPUl9CQVNFIC0gMTQsCiB9IGNhbWVyYV9zdGF0dXNfdDsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfRVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAppbmRleCAwYTJlZTU3Li43MjkxODJlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaApAQCAtNDQsOCArNDQsNiBAQAogCiBfX0JFR0lOX0RFQ0xTCiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogLyoqCiAgKiBBQ2FtZXJhTWFuYWdlciBpcyBvcGFxdWUgdHlwZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBjYW1lcmEgc2VydmljZS4KICAqCkBAIC0yOTMsMTAgKzI5MSw2IEBACiAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5Ci0KIC8qKgogICogRGVmaW5pdGlvbiBvZiBjYW1lcmEgYWNjZXNzIHBlcm1pc3Npb24gY2hhbmdlIGNhbGxiYWNrLgogICoKQEAgLTMzMiw3ICszMjYsNyBAQAogICogQHNlZSBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2sKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlMaXN0ZW5lciB7Ci0gICAgLy8vCisgICAgLy8vIENhbGxlZCB3aGVuIGEgY2FtZXJhIGJlY29tZXMgYXZhaWxhYmxlIG9yIHVuYXZhaWxhYmxlCiAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzIGF2YWlsYWJpbGl0eUNhbGxiYWNrczsKIAogICAgIC8vLyBDYWxsZWQgd2hlbiB0aGVyZSBpcyBjYW1lcmEgYWNjZXNzIHBlcm1pc3Npb24gY2hhbmdlCkBAIC00MTksOCArNDEzLDYgQEAKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI5KTsKICNlbmRpZgogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NQU5BR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAppbmRleCAwNzJiYjAyLi5iMzMxZDUwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCkBAIC0zNiwxMyArMzYsMTIgQEAKICNpZm5kZWYgX05ES19DQU1FUkFfTUVUQURBVEFfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9NRVRBREFUQV9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpZm5kZWYgX19BTkRST0lEX1ZOREtfXwotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMAogI2luY2x1ZGUgImpuaS5oIgotI2VuZGlmICAvKiBfX0FORFJPSURfQVBJX18gPj0gMzAgKi8KICNlbmRpZiAgLyogX19BTkRST0lEX1ZOREtfXyAqLwogCiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKQEAgLTUwLDggKzQ5LDYgQEAKIAogX19CRUdJTl9ERUNMUwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI0Ci0KIC8qKgogICogQUNhbWVyYU1ldGFkYXRhIGlzIG9wYXF1ZSB0eXBlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHJlYWQtb25seSBjYW1lcmEgbWV0YWRhdGEgbGlrZSBjYW1lcmEKICAqIGNoYXJhY3RlcmlzdGljcyAodmlhIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3N9KSBvciBjYXB0dXJlIHJlc3VsdHMgKHZpYQpAQCAtMjM3LDEwICsyMzQsNiBAQAogICovCiB2b2lkIEFDYW1lcmFNZXRhZGF0YV9mcmVlKEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQotCiAvKioKICAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGNhbWVyYSBpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KICAqCkBAIC0yNTksMTcgKzI1MiwxNiBAQAogICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKiBjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKQogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KICNpZm5kZWYgX19BTkRST0lEX1ZOREtfXwotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMAogCiAvKioKICAqIFJldHVybiBhIHtAbGluayBBQ2FtZXJhTWV0YWRhdGF9IHRoYXQgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGFzCi0gKiB7QGxpbmsgY2FtZXJhTWV0YWRhdGF9LCB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZgotICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YX0gKGUuZy4sIGEKLSAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzfSBvcgotICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYXB0dXJlUmVzdWx0fSkuCisgKiA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YSI+CisgKiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhPC9hPiBmcm9tIEphdmEgQVBJLiAoZS5nLiwgYQorICogPGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzIj4KKyAqICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9hPgorICogb3IgPGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FwdHVyZVJlc3VsdCI+CisgKiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXN1bHQ8L2E+KS4KICAqCiAgKiA8cD5UaGUgcmV0dXJuZWQgQUNhbWVyYU1ldGFkYXRhIG11c3QgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGJ5IHtAbGluayBBQ2FtZXJhTWV0YWRhdGFfZnJlZX0KICAqIGFmdGVyIGFwcGxpY2F0aW9uIGlzIGRvbmUgdXNpbmcgaXQuPC9wPgpAQCAtMjc5LDE3ICsyNzEsMTggQEAKICAqIHRoZSBKYXZhIG1ldGFkYXRhIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgogICoKICAqIEBwYXJhbSBlbnYgdGhlIEpOSSBlbnZpcm9ubWVudC4KLSAqIEBwYXJhbSBjYW1lcmFNZXRhZGF0YSB0aGUgc291cmNlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhTWV0YWRhdGF9IGZyb20gd2hpY2ggdGhlCisgKiBAcGFyYW0gY2FtZXJhTWV0YWRhdGEgdGhlIHNvdXJjZSA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYU1ldGFkYXRhIDwvYT5mcm9tIHdoaWNoIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIHtAbGluayBBQ2FtZXJhTWV0YWRhdGF9IGlzIGEgdmlldy4KICAqCi0gKiBAcmV0dXJuIGEgdmFsaWQgQUNhbWVyYU1ldGFkYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiB7QGxpbmsgY2FtZXJhTWV0YWRhdGF9IGlzIG51bGwgb3Igbm90IGEgdmFsaWQKLSAqICAgICAgICAgaW5zdGFuY2Ugb2Yge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YX0uCisgKiBAcmV0dXJuIGEgdmFsaWQgQUNhbWVyYU1ldGFkYXRhIHBvaW50ZXIgb3IgTlVMTCBpZiBjYW1lcmFNZXRhZGF0YSBpcyBudWxsIG9yIG5vdCBhIHZhbGlkCisgKiAgICAgICAgIGluc3RhbmNlIG9mIDxhIGhyZWY9ImFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YSI+CisgKiAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YTwvYT4uCiAgKgogICovCiBBQ2FtZXJhTWV0YWRhdGEqIEFDYW1lcmFNZXRhZGF0YV9mcm9tQ2FtZXJhTWV0YWRhdGEoSk5JRW52KiBlbnYsIGpvYmplY3QgY2FtZXJhTWV0YWRhdGEpCiAgICAgICAgIF9fSU5UUk9EVUNFRF9JTigzMCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMzAgKi8KICNlbmRpZiAgLyogX19BTkRST0lEX1ZOREtfXyAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKaW5kZXggMTM1NGZjZS4uODY3ODFlNSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCkBAIC00MCw3ICs0MCw2IEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAogCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uIHsKICAgICBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT04sCkBAIC01MjgsNiArNTI3LDEzIEBACiAgICAgICogc2NlbmUgYXMgdGhleSBkbyBiZWZvcmUuIFNlZSBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyBmb3IgZGV0YWlscy4gV2hldGhlciB0byB1c2UKICAgICAgKiBhY3RpdmVBcnJheVNpemUgb3IgcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBzdGlsbCBkZXBlbmRzIG9uIGRpc3RvcnRpb24gY29ycmVjdGlvbgogICAgICAqIG1vZGUuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FwYWJpbGl0eSwKKyAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiAvCisgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gbXVzdCBiZSB1c2VkIGFzIHRoZQorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgogICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIDxjb2RlPmludFs1ICogYXJlYV9jb3VudF08L2NvZGU+LgogICAgICAqIEV2ZXJ5IGZpdmUgZWxlbWVudHMgcmVwcmVzZW50IGEgbWV0ZXJpbmcgcmVnaW9uIG9mIDxjb2RlPih4bWluLCB5bWluLCB4bWF4LCB5bWF4LCB3ZWlnaHQpPC9jb2RlPi4KICAgICAgKiBUaGUgcmVjdGFuZ2xlIGlzIGRlZmluZWQgdG8gYmUgaW5jbHVzaXZlIG9uIHhtaW4gYW5kIHltaW4sIGJ1dCBleGNsdXNpdmUgb24geG1heCBhbmQKQEAgLTUzNyw3ICs1NDMsMTAgQEAKICAgICAgKiBAc2VlIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKICAgICAgKi8KICAgICBBQ0FNRVJBX0NPTlRST0xfQUVfUkVHSU9OUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMls1KmFyZWFfY291bnRdCiAgICAgICAgICAgICBBQ0FNRVJBX0NPTlRST0xfU1RBUlQgKyA0LApAQCAtNzE5LDYgKzcyOCwxMiBAQAogICAgICAqIHNjZW5lIGFzIHRoZXkgZG8gYmVmb3JlLiBTZWUgQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8gZm9yIGRldGFpbHMuIFdoZXRoZXIgdG8gdXNlCiAgICAgICogYWN0aXZlQXJyYXlTaXplIG9yIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUgc3RpbGwgZGVwZW5kcyBvbiBkaXN0b3J0aW9uIGNvcnJlY3Rpb24KICAgICAgKiBtb2RlLjwvcD4KKyAgICAgKiA8cD5Gb3IgY2FtZXJhIGRldmljZXMgd2l0aCB0aGUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IiPkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SPC9hPgorICAgICAqIGNhcGFiaWxpdHksIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIC8KKyAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiBtdXN0IGJlIHVzZWQgYXMgdGhlCisgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHJlcXVlc3RzIHdoZXJlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CiAgICAgICogPHA+VGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgPGNvZGU+aW50WzUgKiBhcmVhX2NvdW50XTwvY29kZT4uCiAgICAgICogRXZlcnkgZml2ZSBlbGVtZW50cyByZXByZXNlbnQgYSBtZXRlcmluZyByZWdpb24gb2YgPGNvZGU+KHhtaW4sIHltaW4sIHhtYXgsIHltYXgsIHdlaWdodCk8L2NvZGU+LgogICAgICAqIFRoZSByZWN0YW5nbGUgaXMgZGVmaW5lZCB0byBiZSBpbmNsdXNpdmUgb24geG1pbiBhbmQgeW1pbiwgYnV0IGV4Y2x1c2l2ZSBvbiB4bWF4IGFuZApAQCAtNzI4LDcgKzc0MywxMCBAQAogICAgICAqIEBzZWUgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fTU9ERQogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9BRl9SRUdJT05TID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyWzUqYXJlYV9jb3VudF0KICAgICAgICAgICAgIEFDQU1FUkFfQ09OVFJPTF9TVEFSVCArIDgsCkBAIC04MTYsNyArODM0LDcgQEAKICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgogICAgICAqIDxwPlRoaXMgY29udHJvbCBpcyBvbmx5IGVmZmVjdGl2ZSBpZiBBQ0FNRVJBX0NPTlRST0xfTU9ERSBpcyBBVVRPLjwvcD4KLSAgICAgKiA8cD5XaGVuIHNldCB0byB0aGUgT04gbW9kZSwgdGhlIGNhbWVyYSBkZXZpY2UncyBhdXRvLXdoaXRlIGJhbGFuY2UKKyAgICAgKiA8cD5XaGVuIHNldCB0byB0aGUgQVVUTyBtb2RlLCB0aGUgY2FtZXJhIGRldmljZSdzIGF1dG8td2hpdGUgYmFsYW5jZQogICAgICAqIHJvdXRpbmUgaXMgZW5hYmxlZCwgb3ZlcnJpZGluZyB0aGUgYXBwbGljYXRpb24ncyBzZWxlY3RlZAogICAgICAqIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sIEFDQU1FUkFfQ09MT1JfQ09SUkVDVElPTl9HQUlOUyBhbmQKICAgICAgKiBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fTU9ERS4gTm90ZSB0aGF0IHdoZW4gQUNBTUVSQV9DT05UUk9MX0FFX01PREUKQEAgLTkwNSw2ICs5MjMsMTIgQEAKICAgICAgKiB0aGUgc2NlbmUgYXMgdGhleSBkbyBiZWZvcmUuIFNlZSBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyBmb3IgZGV0YWlscy4gV2hldGhlciB0byB1c2UKICAgICAgKiBhY3RpdmVBcnJheVNpemUgb3IgcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5U2l6ZSBzdGlsbCBkZXBlbmRzIG9uIGRpc3RvcnRpb24gY29ycmVjdGlvbgogICAgICAqIG1vZGUuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIHRoZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FwYWJpbGl0eSwgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gLworICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OIG11c3QgYmUgdXNlZCBhcyB0aGUKKyAgICAgKiBjb29yZGluYXRlIHN5c3RlbSBmb3IgcmVxdWVzdHMgd2hlcmUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KICAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNSAqIGFyZWFfY291bnRdPC9jb2RlPi4KICAgICAgKiBFdmVyeSBmaXZlIGVsZW1lbnRzIHJlcHJlc2VudCBhIG1ldGVyaW5nIHJlZ2lvbiBvZiA8Y29kZT4oeG1pbiwgeW1pbiwgeG1heCwgeW1heCwgd2VpZ2h0KTwvY29kZT4uCiAgICAgICogVGhlIHJlY3RhbmdsZSBpcyBkZWZpbmVkIHRvIGJlIGluY2x1c2l2ZSBvbiB4bWluIGFuZCB5bWluLCBidXQgZXhjbHVzaXZlIG9uIHhtYXggYW5kCkBAIC05MTQsNyArOTM4LDEwIEBACiAgICAgICogQHNlZSBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCiAgICAgICovCiAgICAgQUNBTUVSQV9DT05UUk9MX0FXQl9SRUdJT05TID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbNSphcmVhX2NvdW50XQogICAgICAgICAgICAgQUNBTUVSQV9DT05UUk9MX1NUQVJUICsgMTIsCkBAIC0xODQxLDcgKzE4NjgsNyBAQAogICAgICAqIDxsaT5JZiB0aGUgY2FtZXJhIGRldmljZSBoYXMgQlVSU1RfQ0FQVFVSRSBjYXBhYmlsaXR5LCB0aGUgZnJhbWUgcmF0ZSByZXF1aXJlbWVudCBvZgogICAgICAqIEJVUlNUX0NBUFRVUkUgbXVzdCBzdGlsbCBiZSBtZXQuPC9saT4KICAgICAgKiA8bGk+QWxsIHN0cmVhbXMgbm90IGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHN0cmVhbWluZyBkaW1lbnNpb24gZm9yIEJPS0VIX1NUSUxMX0NBUFRVUkUgbW9kZQotICAgICAqIChxdWVyaWVkIHZpYSB7QGxpbmsgQUNBTUVSQV9DT05UUk9MX0FWQUlMQUJMRV9FWFRFTkRFRF9TQ0VORV9NT0RFX0NBUEFCSUxJVElFUyB9KQorICAgICAqIChxdWVyaWVkIHZpYSB7QGxpbmsgQUNBTUVSQV9DT05UUk9MX0FWQUlMQUJMRV9FWFRFTkRFRF9TQ0VORV9NT0RFX01BWF9TSVpFUyB9KQogICAgICAqIHdpbGwgaGF2ZSBwcmV2aWV3IGJva2VoIGVmZmVjdCBhcHBsaWVkLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5XaGVuIHNldCB0byBCT0tFSF9DT05USU5VT1VTIG1vZGUsIGNvbmZpZ3VyZWQgc3RyZWFtcyBkaW1lbnNpb24gc2hvdWxkIG5vdCBleGNlZWQgdGhpcyBtb2RlJ3MKQEAgLTE5NTcsNyArMTk4NCwyMCBAQAogICAgICAqIGV4cGxpY2l0bHkgc2V0IEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMS4wLjwvcD4KICAgICAgKiA8cD5PbmUgbGltaXRhdGlvbiBvZiBjb250cm9sbGluZyB6b29tIHVzaW5nIHpvb21SYXRpbyBpcyB0aGF0IHRoZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTgogICAgICAqIG11c3Qgb25seSBiZSB1c2VkIGZvciBsZXR0ZXJib3hpbmcgb3IgcGlsbGFyYm94aW5nIG9mIHRoZSBzZW5zb3IgYWN0aXZlIGFycmF5LCBhbmQgbm8KLSAgICAgKiBGUkVFRk9STSBjcm9wcGluZyBjYW4gYmUgdXNlZCB3aXRoIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIG90aGVyIHRoYW4gMS4wLjwvcD4KKyAgICAgKiBGUkVFRk9STSBjcm9wcGluZyBjYW4gYmUgdXNlZCB3aXRoIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIG90aGVyIHRoYW4gMS4wLiBJZgorICAgICAqIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIGlzIG5vdCAxLjAsIGFuZCBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiBpcyBzZXQgdG8gYmUKKyAgICAgKiB3aW5kb3dib3hpbmcsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIHdpbGwgb3ZlcnJpZGUgdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHRvIGJlCisgICAgICogdGhlIGFjdGl2ZSBhcnJheS48L3A+CisgICAgICogPHA+SW4gdGhlIGNhcHR1cmUgcmVxdWVzdCwgaWYgdGhlIGFwcGxpY2F0aW9uIHNldHMgQUNBTUVSQV9DT05UUk9MX1pPT01fUkFUSU8gdG8gYQorICAgICAqIHZhbHVlICE9IDEuMCwgdGhlIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIHRhZyBpbiB0aGUgY2FwdHVyZSByZXN1bHQgcmVmbGVjdHMgdGhlCisgICAgICogZWZmZWN0aXZlIHpvb20gcmF0aW8gYWNoaWV2ZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UsIGFuZCB0aGUgQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04KKyAgICAgKiBhZGp1c3RzIGZvciBhZGRpdGlvbmFsIGNyb3BzIHRoYXQgYXJlIG5vdCB6b29tIHJlbGF0ZWQuIE90aGVyd2lzZSwgaWYgdGhlIGFwcGxpY2F0aW9uCisgICAgICogc2V0cyBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyB0byAxLjAsIG9yIGRvZXMgbm90IHNldCBpdCBhdCBhbGwsIHRoZQorICAgICAqIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIHRhZyBpbiB0aGUgcmVzdWx0IG1ldGFkYXRhIHdpbGwgYWxzbyBiZSAxLjAuPC9wPgorICAgICAqIDxwPldoZW4gdGhlIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEgcGh5c2ljYWwgc3RyZWFtIGZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGUKKyAgICAgKiBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyBpbiB0aGUgcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YSB3aWxsIGJlIDEuMCwgYW5kCisgICAgICogdGhlIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIHRhZyByZWZsZWN0cyB0aGUgYW1vdW50IG9mIHpvb20gYW5kIGNyb3AgZG9uZSBieSB0aGUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1JFR0lPTlMKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPCkBAIC0yNzk5LDYgKzI4MzksNTEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdFs1XQogICAgICAgICAgICAgQUNBTUVSQV9MRU5TX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+VGhlIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzIHRvIGNvcnJlY3QgZm9yIHRoaXMgY2FtZXJhIGRldmljZSdzCisgICAgICogcmFkaWFsIGFuZCB0YW5nZW50aWFsIGxlbnMgZGlzdG9ydGlvbiBmb3IgYQorICAgICAqIENhcHR1cmVSZXF1ZXN0IHdpdGggQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogZmxvYXRbNV08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QW5hbG9nb3VzIHRvIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OLCB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9MRU5TX0RJU1RPUlRJT05fTUFYSU1VTV9SRVNPTFVUSU9OID0gICAgICAgICAgICAgICAgLy8gZmxvYXRbNV0KKyAgICAgICAgICAgIEFDQU1FUkFfTEVOU19TVEFSVCArIDE0LAorICAgIC8qKgorICAgICAqIDxwPlRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UncyBpbnRyaW5zaWMKKyAgICAgKiBjYWxpYnJhdGlvbiB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGZsb2F0WzVdPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkFuYWxvZ291cyB0byBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OLCB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OX01BWElNVU1fUkVTT0xVVElPTiA9ICAgICAvLyBmbG9hdFs1XQorICAgICAgICAgICAgQUNBTUVSQV9MRU5TX1NUQVJUICsgMTUsCiAgICAgQUNBTUVSQV9MRU5TX0VORCwKIAogICAgIC8qKgpAQCAtMzQyNiw2ICszNTExLDEyIEBACiAgICAgICogY29vcmRpbmF0ZSBzeXN0ZW0gaXMgcG9zdC16b29tLCBtZWFuaW5nIHRoYXQgdGhlIGFjdGl2ZUFycmF5U2l6ZSBvcgogICAgICAqIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUgY292ZXJzIHRoZSBjYW1lcmEgZGV2aWNlJ3MgZmllbGQgb2YgdmlldyAiYWZ0ZXIiIHpvb20uICBTZWUKICAgICAgKiBBQ0FNRVJBX0NPTlRST0xfWk9PTV9SQVRJTyBmb3IgZGV0YWlscy48L3A+CisgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggdGhlCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIj5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUjwvYT4KKyAgICAgKiBjYXBhYmlsaXR5LCBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiAvCisgICAgICogQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gbXVzdCBiZSB1c2VkIGFzIHRoZQorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIGZvciByZXF1ZXN0cyB3aGVyZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgogICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs0XSwgd2hpY2ggbWFwcyB0byAobGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFCkBAIC0zNDM0LDcgKzM1MjUsMTAgQEAKICAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NQVhfRElHSVRBTF9aT09NCiAgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9DUk9QUElOR19UWVBFCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKICAgICAgKi8KICAgICBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMls0XQogICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQsCkBAIC0zNDkyLDggKzM1ODYsOCBAQAogICAgICAqIDxwPk5vdCBhbGwgb3V0cHV0IGZvcm1hdHMgbWF5IGJlIHN1cHBvcnRlZCBpbiBhIGNvbmZpZ3VyYXRpb24gd2l0aAogICAgICAqIGFuIGlucHV0IHN0cmVhbSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKICAgICAgKiBhbmRyb2lkLnNjYWxlci5hdmFpbGFibGVJbnB1dE91dHB1dEZvcm1hdHNNYXAuPC9wPgotICAgICAqIDxwPlRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dCBzdHJlYW0KLSAgICAgKiBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgbGV2ZWwKKyAgICAgKiA8cD5Gb3IgYXBwbGljYXRpb25zIHRhcmdldGluZyBTREsgdmVyc2lvbiBvbGRlciB0aGFuIDMxLCB0aGUgZm9sbG93aW5nIHRhYmxlCisgICAgICogZGVzY3JpYmVzIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIGhhcmR3YXJlIGxldmVsCiAgICAgICogKEFDQU1FUkFfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUwpOjwvcD4KICAgICAgKiA8cD5Gb3JtYXQgICAgICAgICB8IFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSGFyZHdhcmUgTGV2ZWwgfCBOb3RlcwogICAgICAqIDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tOgpAQCAtMzUwNSw2ICszNTk5LDI4IEBACiAgICAgICogWVVWXzQyMF84ODggICAgfCBhbGwgb3V0cHV0IHNpemVzIGF2YWlsYWJsZSBmb3IgSlBFRyAgICAgICAgICB8IEZVTEwgICAgICAgICAgIHwKICAgICAgKiBZVVZfNDIwXzg4OCAgICB8IGFsbCBvdXRwdXQgc2l6ZXMgYXZhaWxhYmxlIGZvciBKUEVHLCB1cCB0byB0aGUgbWF4aW11bSB2aWRlbyBzaXplIHwgTElNSVRFRCAgICAgICAgfAogICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgfCBzYW1lIGFzIFlVVl80MjBfODg4ICAgICAgICAgICAgICAgICAgfCBBbnkgICAgICAgICAgICB8PC9wPgorICAgICAqIDxwPkZvciBhcHBsaWNhdGlvbnMgdGFyZ2V0aW5nIFNESyB2ZXJzaW9uIDMxIG9yIG5ld2VyLCBpZiB0aGUgbW9iaWxlIGRldmljZSBkZWNsYXJlcyB0byBiZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkL1ZFUlNJT05fQ0RPRVMvTUVESUFfUEVSRk9STUFOQ0VfQ0xBU1MuaHRtbCI+bWVkaWEgcGVyZm9ybWFuY2UgY2xhc3M8L2E+IFMsCisgICAgICogdGhlIHByaW1hcnkgY2FtZXJhIGRldmljZXMgKGZpcnN0IHJlYXIvZnJvbnQgY2FtZXJhIGluIHRoZSBjYW1lcmEgSUQgbGlzdCkgd2lsbCBub3QKKyAgICAgKiBzdXBwb3J0IEpQRUcgc2l6ZXMgc21hbGxlciB0aGFuIDEwODBwLiBJZiB0aGUgYXBwbGljYXRpb24gY29uZmlndXJlcyBhIEpQRUcgc3RyZWFtCisgICAgICogc21hbGxlciB0aGFuIDEwODBwLCB0aGUgY2FtZXJhIGRldmljZSB3aWxsIHJvdW5kIHVwIHRoZSBKUEVHIGltYWdlIHNpemUgdG8gYXQgbGVhc3QKKyAgICAgKiAxMDgwcC4gVGhlIHJlcXVpcmVtZW50cyBmb3IgSU1QTEVNRU5UQVRJT05fREVGSU5FRCBhbmQgWVVWXzQyMF84ODggc3RheSB0aGUgc2FtZS4KKyAgICAgKiBUaGlzIG5ldyBtaW5pbXVtIHJlcXVpcmVkIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXJlIGlsbHVzdHJhdGVkIGJ5IHRoZSB0YWJsZSBiZWxvdzo8L3A+CisgICAgICogPHA+Rm9ybWF0ICAgICAgICAgfCBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhhcmR3YXJlIExldmVsIHwgTm90ZXMKKyAgICAgKiA6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLToKKyAgICAgKiBKUEVHICAgICAgICAgICB8IEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUgICAgICAgICAgfCBBbnkgICAgICAgICAgICB8CisgICAgICogSlBFRyAgICAgICAgICAgfCAxOTIweDEwODAgKDEwODBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFueSAgICAgICAgICAgIHwgaWYgMTA4MHAgJmx0Oz0gYWN0aXZlQXJyYXlTaXplCisgICAgICogWVVWXzQyMF84ODggICAgfCBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFICAgICAgICAgIHwgRlVMTCAgICAgICAgICAgfAorICAgICAqIFlVVl80MjBfODg4ICAgIHwgMTkyMHgxMDgwICgxMDgwcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGVUxMICAgICAgICAgICB8IGlmIDEwODBwICZsdDs9IGFjdGl2ZUFycmF5U2l6ZQorICAgICAqIFlVVl80MjBfODg4ICAgIHwgMTI4MHg3MjAgKDcyMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGVUxMICAgICAgICAgICB8IGlmIDcyMHAgJmx0Oz0gYWN0aXZlQXJyYXlTaXplCisgICAgICogWVVWXzQyMF84ODggICAgfCA2NDB4NDgwICg0ODBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZVTEwgICAgICAgICAgIHwgaWYgNDgwcCAmbHQ7PSBhY3RpdmVBcnJheVNpemUKKyAgICAgKiBZVVZfNDIwXzg4OCAgICB8IDMyMHgyNDAgKDI0MHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRlVMTCAgICAgICAgICAgfCBpZiAyNDBwICZsdDs9IGFjdGl2ZUFycmF5U2l6ZQorICAgICAqIFlVVl80MjBfODg4ICAgIHwgYWxsIG91dHB1dCBzaXplcyBhdmFpbGFibGUgZm9yIEZVTEwgaGFyZHdhcmUgbGV2ZWwsIHVwIHRvIHRoZSBtYXhpbXVtIHZpZGVvIHNpemUgfCBMSU1JVEVEICAgICAgICB8CisgICAgICogSU1QTEVNRU5UQVRJT05fREVGSU5FRCB8IHNhbWUgYXMgWVVWXzQyMF84ODggICAgICAgICAgICAgICAgICB8IEFueSAgICAgICAgICAgIHw8L3A+CisgICAgICogPHA+Rm9yIGFwcGxpY2F0aW9ucyB0YXJnZXRpbmcgU0RLIHZlcnNpb24gMzEgb3IgbmV3ZXIsIGlmIHRoZSBtb2JpbGUgZGV2aWNlIGRvZXNuJ3QgZGVjbGFyZQorICAgICAqIHRvIGJlIG1lZGlhIHBlcmZvcm1hbmNlIGNsYXNzIFMsIG9yIGlmIHRoZSBjYW1lcmEgZGV2aWNlIGlzbid0IGEgcHJpbWFyeSByZWFyL2Zyb250CisgICAgICogY2FtZXJhLCB0aGUgbWluaW11bSByZXF1aXJlZCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgYXBwbGljYXRpb25zCisgICAgICogdGFyZ2V0aW5nIFNESyB2ZXJzaW9uIG9sZGVyIHRoYW4gMzEuPC9wPgogICAgICAqIDxwPlJlZmVyIHRvIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGZvciBhZGRpdGlvbmFsCiAgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb25maWd1cmF0aW9ucyBvbiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzLjwvcD4KICAgICAgKiA8cD5FeGNlcHRpb24gb24gMTc2eDE0NCAoUUNJRikgcmVzb2x1dGlvbjogY2FtZXJhIGRldmljZXMgdXN1YWxseSBoYXZlIGEgZml4ZWQgY2FwYWJpbGl0eSBmb3IKQEAgLTM1MzYsOCArMzY1Miw2IEBACiAgICAgICogc2V0IHRvIGVpdGhlciBPRkYgb3IgRkFTVC48L3A+CiAgICAgICogPHA+V2hlbiBtdWx0aXBsZSBzdHJlYW1zIGFyZSB1c2VkIGluIGEgcmVxdWVzdCwgdGhlIG1pbmltdW0gZnJhbWUKICAgICAgKiBkdXJhdGlvbiB3aWxsIGJlIG1heChpbmRpdmlkdWFsIHN0cmVhbSBtaW4gZHVyYXRpb25zKS48L3A+Ci0gICAgICogPHA+VGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gb2YgYSBzdHJlYW0gKG9mIGEgcGFydGljdWxhciBmb3JtYXQsIHNpemUpCi0gICAgICogaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgaW5wdXQgb3Igb3V0cHV0LjwvcD4KICAgICAgKiA8cD5TZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04gYW5kCiAgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CiAgICAgICogY2FsY3VsYXRpbmcgdGhlIG1heCBmcmFtZSByYXRlLjwvcD4KQEAgLTM2NTEsNyArMzc2NSw5IEBACiAgICAgICogPC9vbD4KICAgICAgKiA8L2xpPgogICAgICAqIDxsaT5TZXR0aW5nIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPIHRvIHZhbHVlcyBkaWZmZXJlbnQgdGhhbiAxLjAgYW5kCi0gICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gdG8gYmUgd2luZG93Ym94aW5nIGF0IHRoZSBzYW1lIHRpbWUgaXMgdW5kZWZpbmVkIGJlaGF2aW9yLjwvbGk+CisgICAgICogQUNBTUVSQV9TQ0FMRVJfQ1JPUF9SRUdJT04gdG8gYmUgd2luZG93Ym94aW5nIGF0IHRoZSBzYW1lIHRpbWUgYXJlIG5vdCBzdXBwb3J0ZWQuIEluIHRoaXMKKyAgICAgKiBjYXNlLCB0aGUgY2FtZXJhIGZyYW1ld29yayB3aWxsIG92ZXJyaWRlIHRoZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTiB0byBiZSB0aGUgYWN0aXZlCisgICAgICogYXJyYXkuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkxFR0FDWSBjYXBhYmlsaXR5IGRldmljZXMgd2lsbCBvbmx5IHN1cHBvcnQgQ0VOVEVSX09OTFkgY3JvcHBpbmcuPC9wPgogICAgICAqCkBAIC0zNzM2LDYgKzM4NTIsMjc4IEBACiAgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyCiAgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9TVEFSVCArIDE1LAorICAgIC8qKgorICAgICAqIDxwPkxpc3Qgb2Ygcm90YXRlLWFuZC1jcm9wIG1vZGVzIGZvciBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1AgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgY2FtZXJhIGRldmljZS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUAorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGVudHJ5IGxpc3RzIHRoZSB2YWxpZCBtb2RlcyBmb3IgQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIHdpdGggQVBJIGxldmVsIDMwLCBhbGwgZGV2aWNlcyB3aWxsIGxpc3QgYXQgbGVhc3QgPGNvZGU+Uk9UQVRFX0FORF9DUk9QX05PTkU8L2NvZGU+LgorICAgICAqIERldmljZXMgd2l0aCBzdXBwb3J0IGZvciByb3RhdGUtYW5kLWNyb3Agd2lsbCBhZGRpdGlvbmFsbHkgbGlzdCBhdCBsZWFzdAorICAgICAqIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9BVVRPPC9jb2RlPiBhbmQgPGNvZGU+Uk9UQVRFX0FORF9DUk9QXzkwPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUAorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9ST1RBVEVfQU5EX0NST1BfTU9ERVMgPSAgICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTYsCisgICAgLyoqCisgICAgICogPHA+V2hldGhlciBhIHJvdGF0aW9uLWFuZC1jcm9wIG9wZXJhdGlvbiBpcyBhcHBsaWVkIHRvIHByb2Nlc3NlZAorICAgICAqIG91dHB1dHMgZnJvbSB0aGUgY2FtZXJhLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3BfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNvbnRyb2wgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGhlbHAgY2FtZXJhIGFwcGxpY2F0aW9ucyB3aXRoIG5vIHN1cHBvcnQgZm9yCisgICAgICogbXVsdGktd2luZG93IG1vZGVzIHRvIHdvcmsgY29ycmVjdGx5IG9uIGRldmljZXMgd2hlcmUgbXVsdGktd2luZG93IHNjZW5hcmlvcyBhcmUKKyAgICAgKiB1bmF2b2lkYWJsZSwgc3VjaCBhcyBmb2xkYWJsZXMgb3Igb3RoZXIgZGV2aWNlcyB3aXRoIHZhcmlhYmxlIGRpc3BsYXkgZ2VvbWV0cnkgb3IgbW9yZQorICAgICAqIGZyZWUtZm9ybSB3aW5kb3cgcGxhY2VtZW50IChzdWNoIGFzIGxhcHRvcHMsIHdoaWNoIG9mdGVuIHBsYWNlIHBvcnRyYWl0LW9yaWVudGF0aW9uIGFwcHMKKyAgICAgKiBpbiBsYW5kc2NhcGUgd2l0aCBwaWxsYXJib3hpbmcpLjwvcD4KKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9BVVRPPC9jb2RlPiwgd2hpY2ggYWxsb3dzIHRoZSBjYW1lcmEgQVBJCisgICAgICogdG8gZW5hYmxlIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHJlc2l6aW5nCisgICAgICogLyBtdWx0aS13aW5kb3cgbW9kZXMsIHdoZW4gdGhlIGRldmljZSBpcyBpbiBmYWN0IGluIGEgbXVsdGktd2luZG93IG1vZGUgKHN1Y2ggYXMgaW5zZXQKKyAgICAgKiBwb3J0cmFpdCBvbiBsYXB0b3BzLCBvciBvbiBhIGZvbGRhYmxlIGRldmljZSBpbiBzb21lIGZvbGQgc3RhdGVzKS4gIEluIGFkZGl0aW9uLAorICAgICAqIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF9OT05FPC9jb2RlPiBhbmQgPGNvZGU+Uk9UQVRFX0FORF9DUk9QXzkwPC9jb2RlPiB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUgaWYgdGhpcyBjb250cm9sCisgICAgICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuICBJZiBub3Qgc3VwcG9ydGVkLCBkZXZpY2VzIEFQSSBsZXZlbCAzMCBvciBoaWdoZXIgd2lsbCBhbHdheXMKKyAgICAgKiBsaXN0IG9ubHkgPGNvZGU+Uk9UQVRFX0FORF9DUk9QX05PTkU8L2NvZGU+LjwvcD4KKyAgICAgKiA8cD5XaGVuIDxjb2RlPkNST1BfQVVUTzwvY29kZT4gaXMgaW4gdXNlLCBhbmQgdGhlIGNhbWVyYSBBUEkgYWN0aXZhdGVzIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSwKKyAgICAgKiBzZXZlcmFsIG1ldGFkYXRhIGZpZWxkcyB3aWxsIGFsc28gYmUgcGFyc2VkIGRpZmZlcmVudGx5IHRvIGVuc3VyZSB0aGF0IGNvb3JkaW5hdGVzIGFyZQorICAgICAqIGNvcnJlY3RseSBoYW5kbGVkIGZvciBmZWF0dXJlcyBsaWtlIGRyYXdpbmcgZmFjZSBkZXRlY3Rpb24gYm94ZXMgb3IgcGFzc2luZyBpbgorICAgICAqIHRhcC10by1mb2N1cyBjb29yZGluYXRlcy4gIFRoZSBjYW1lcmEgQVBJIHdpbGwgY29udmVydCBwb3NpdGlvbnMgaW4gdGhlIGFjdGl2ZSBhcnJheQorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIHRvL2Zyb20gdGhlIGNyb3BwZWQtYW5kLXJvdGF0ZWQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gbWFrZSB0aGUKKyAgICAgKiBvcGVyYXRpb24gdHJhbnNwYXJlbnQgZm9yIGFwcGxpY2F0aW9ucy4gIFRoZSBmb2xsb3dpbmcgY29udHJvbHMgYXJlIGFmZmVjdGVkOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkFDQU1FUkFfQ09OVFJPTF9BRV9SRUdJT05TPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9DT05UUk9MX0FGX1JFR0lPTlM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0NPTlRST0xfQVdCX1JFR0lPTlM8L2xpPgorICAgICAqIDxsaT5hbmRyb2lkLnN0YXRpc3RpY3MuZmFjZXM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+Q2FwdHVyZSByZXN1bHRzIHdpbGwgY29udGFpbiB0aGUgYWN0dWFsIHZhbHVlIHNlbGVjdGVkIGJ5IHRoZSBBUEk7CisgICAgICogPGNvZGU+Uk9UQVRFX0FORF9DUk9QX0FVVE88L2NvZGU+IHdpbGwgbmV2ZXIgYmUgc2VlbiBpbiBhIGNhcHR1cmUgcmVzdWx0LjwvcD4KKyAgICAgKiA8cD5BcHBsaWNhdGlvbnMgY2FuIGFsc28gc2VsZWN0IHRoZWlyIHByZWZlcnJlZCBjcm9wcGluZyBtb2RlLCBlaXRoZXIgdG8gb3B0IG91dCBvZiB0aGUKKyAgICAgKiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB0cmVhdG1lbnQsIG9yIHRvIHVzZSB0aGUgY3JvcHBpbmcgZmVhdHVyZSB0aGVtc2VsdmVzIGFzIG5lZWRlZC4KKyAgICAgKiBJbiB0aGlzIGNhc2UsIG5vIGNvb3JkaW5hdGUgdHJhbnNsYXRpb24gd2lsbCBiZSBkb25lIGF1dG9tYXRpY2FsbHksIGFuZCBhbGwgY29udHJvbHMKKyAgICAgKiB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgbm9ybWFsIGFjdGl2ZSBhcnJheSBjb29yZGluYXRlcy48L3A+CisgICAgICogPHA+Q3JvcHBpbmcgYW5kIHJvdGF0aW5nIGlzIGRvbmUgYWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIG9mIGRpZ2l0YWwgem9vbSAodmlhIGVpdGhlcgorICAgICAqIEFDQU1FUkFfU0NBTEVSX0NST1BfUkVHSU9OIG9yIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPKSwgYnV0IGJlZm9yZSBlYWNoIGluZGl2aWR1YWwKKyAgICAgKiBvdXRwdXQgaXMgZnVydGhlciBjcm9wcGVkIGFuZCBzY2FsZWQuIEl0IG9ubHkgYWZmZWN0cyBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzCisgICAgICogWVVWLCBQUklWQVRFLCBhbmQgSlBFRy4gIEl0IGhhcyBubyBlZmZlY3Qgb24gUkFXIG91dHB1dHMuPC9wPgorICAgICAqIDxwPldoZW4gPGNvZGU+Q1JPUF85MDwvY29kZT4gb3IgPGNvZGU+Q1JPUF8yNzA8L2NvZGU+IGFyZSBzZWxlY3RlZCwgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBsb3NzIHRvIHRoZSBmaWVsZCBvZgorICAgICAqIHZpZXcuIEZvciBleGFtcGxlLCB3aXRoIGEgNDozIGFzcGVjdCByYXRpbyBvdXRwdXQgb2YgMTYwMHgxMjAwLCA8Y29kZT5DUk9QXzkwPC9jb2RlPiB3aWxsIHN0aWxsCisgICAgICogcHJvZHVjZSAxNjAweDEyMDAgb3V0cHV0LCBidXQgdGhlc2UgYnVmZmVycyBhcmUgY3JvcHBlZCBmcm9tIGEgdmVydGljYWwgMzo0IHNsaWNlIGF0IHRoZQorICAgICAqIGNlbnRlciBvZiB0aGUgNDozIGFyZWEsIHRoZW4gcm90YXRlZCB0byBiZSA0OjMsIGFuZCB0aGVuIHVwc2NhbGVkIHRvIDE2MDB4MTIwMC4gIE9ubHkKKyAgICAgKiA1Ni4yNSUgb2YgdGhlIG9yaWdpbmFsIEZPViBpcyBzdGlsbCB2aXNpYmxlLiAgSW4gZ2VuZXJhbCwgZm9yIGFuIGFzcGVjdCByYXRpbyBvZiA8Y29kZT53Omg8L2NvZGU+LAorICAgICAqIHRoZSBjcm9wIGFuZCByb3RhdGUgb3BlcmF0aW9uIGxlYXZlcyA8Y29kZT4oaC93KV4yPC9jb2RlPiBvZiB0aGUgZmllbGQgb2YgdmlldyB2aXNpYmxlLiBGb3IgMTY6OSwKKyAgICAgKiB0aGlzIGlzIH4zMS42JS48L3A+CisgICAgICogPHA+QXMgYSB2aXN1YWwgZXhhbXBsZSwgdGhlIGZpZ3VyZSBiZWxvdyBzaG93cyB0aGUgZWZmZWN0IG9mIDxjb2RlPlJPVEFURV9BTkRfQ1JPUF85MDwvY29kZT4gb24gdGhlCisgICAgICogb3V0cHV0cyBmb3IgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOjwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlNlbnNvciBhY3RpdmUgYXJyYXk6IDxjb2RlPjIwMDB4MTUwMDwvY29kZT48L2xpPgorICAgICAqIDxsaT5Dcm9wIHJlZ2lvbjogdG9wLWxlZnQ6IDxjb2RlPig1MDAsIDM3NSk8L2NvZGU+LCBzaXplOiA8Y29kZT4oMTAwMCwgNzUwKTwvY29kZT4gKDQ6MyBhc3BlY3QgcmF0aW8pPC9saT4KKyAgICAgKiA8bGk+T3V0cHV0IHN0cmVhbXM6IFlVViA8Y29kZT42NDB4NDgwPC9jb2RlPiBhbmQgWVVWIDxjb2RlPjEyODB4NzIwPC9jb2RlPjwvbGk+CisgICAgICogPGxpPjxjb2RlPlJPVEFURV9BTkRfQ1JPUF85MDwvY29kZT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+PGltZyBhbHQ9IkVmZmVjdCBvZiBST1RBVEVfQU5EX0NST1BfOTAiIHNyYz0iLi4vaW1hZ2VzL2NhbWVyYTIvbWV0YWRhdGEvYW5kcm9pZC5zY2FsZXIucm90YXRlQW5kQ3JvcC9jcm9wLXJlZ2lvbi1yb3RhdGUtOTAtNDMtcmF0aW8ucG5nIiAvPjwvcD4KKyAgICAgKiA8cD5XaXRoIHRoZXNlIHNldHRpbmdzLCB0aGUgcmVnaW9ucyBvZiB0aGUgYWN0aXZlIGFycmF5IGNvdmVyZWQgYnkgdGhlIG91dHB1dCBzdHJlYW1zIGFyZTo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT42NDB4NDgwIHN0cmVhbSBjcm9wOiB0b3AtbGVmdDogPGNvZGU+KDIxOSwgMzc1KTwvY29kZT4sIHNpemU6IDxjb2RlPig1NjIsIDc1MCk8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+MTI4MHg3MjAgc3RyZWFtIGNyb3A6IHRvcC1sZWZ0OiA8Y29kZT4oMjg5LCAzNzUpPC9jb2RlPiwgc2l6ZTogPGNvZGU+KDQyMiwgNzUwKTwvY29kZT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+U2luY2UgdGhlIGJ1ZmZlcnMgYXJlIHJvdGF0ZWQsIHRoZSBidWZmZXJzIGFzIHNlZW4gYnkgdGhlIGFwcGxpY2F0aW9uIGFyZTo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT42NDB4NDgwIHN0cmVhbTogdG9wLWxlZnQ6IDxjb2RlPig3ODEsIDM3NSk8L2NvZGU+IG9uIGFjdGl2ZSBhcnJheSwgc2l6ZTogPGNvZGU+KDY0MCwgNDgwKTwvY29kZT4sIGRvd25zY2FsZWQgMS4xN3ggZnJvbSBzZW5zb3IgcGl4ZWxzPC9saT4KKyAgICAgKiA8bGk+MTI4MHg3MjAgc3RyZWFtOiB0b3AtbGVmdDogPGNvZGU+KDcxMSwgMzc1KTwvY29kZT4gb24gYWN0aXZlIGFycmF5LCBzaXplOiA8Y29kZT4oMTI4MCwgNzIwKTwvY29kZT4sIHVwc2NhbGVkIDEuNzF4IGZyb20gc2Vuc29yIHBpeGVsczwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9BRl9SRUdJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQVdCX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfQ09OVFJPTF9aT09NX1JBVElPCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9DUk9QX1JFR0lPTgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3BfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTcsCisgICAgLyoqCisgICAgICogPHA+RGVmYXVsdCBZVVYvUFJJVkFURSBzaXplIHRvIHVzZSBmb3IgcmVxdWVzdGluZyBzZWN1cmUgaW1hZ2UgYnVmZmVycy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMlsyXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGVudHJ5IGxpc3RzIHRoZSBkZWZhdWx0IHNpemUgc3VwcG9ydGVkIGluIHRoZSBzZWN1cmUgY2FtZXJhIG1vZGUuIFRoaXMgZW50cnkgaXMKKyAgICAgKiBvcHRpb25hbCBvbiBkZXZpY2VzIHN1cHBvcnQgdGhlIFNFQ1VSRV9JTUFHRV9EQVRBIGNhcGFiaWxpdHkuIFRoaXMgZW50cnkgd2lsbCBiZSBudWxsCisgICAgICogaWYgdGhlIGNhbWVyYSBkZXZpY2UgZG9lcyBub3QgbGlzdCBTRUNVUkVfSU1BR0VfREFUQSBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiA8cD5XaGVuIHRoZSBrZXkgaXMgcHJlc2VudCwgb25seSBhIFBSSVZBVEUvWVVWIG91dHB1dCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgaXMgZ3VhcmFudGVlZAorICAgICAqIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIEhBTCBpbiB0aGUgc2VjdXJlIGNhbWVyYSBtb2RlLiBBbnkgb3RoZXIgZm9ybWF0IG9yCisgICAgICogcmVzb2x1dGlvbnMgbWlnaHQgbm90IGJlIHN1cHBvcnRlZC4gVXNlCisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCB9CisgICAgICogQVBJIHRvIHF1ZXJ5IGlmIGEgc2VjdXJlIHNlc3Npb24gY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQgaWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGlzCisgICAgICogQVBJLjwvcD4KKyAgICAgKiA8cD5JZiB0aGlzIGtleSByZXR1cm5zIG51bGwgb24gYSBkZXZpY2Ugd2l0aCBTRUNVUkVfSU1BR0VfREFUQSBjYXBhYmlsaXR5LCB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBjYW4gYXNzdW1lIGFsbCBvdXRwdXQgc2l6ZXMgbGlzdGVkIGluIHRoZQorICAgICAqIHtAbGluayBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUyB9CisgICAgICogYXJlIHN1cHBvcnRlZC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfREVGQVVMVF9TRUNVUkVfSU1BR0VfU0laRSA9ICAgICAgICAgICAgICAgICAgLy8gaW50MzJbMl0KKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTgsCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBtdWx0aS1yZXNvbHV0aW9uIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzCisgICAgICogKGkuZS4gZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXQvaW5wdXQgc3RyZWFtKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcGh5c2ljYWxfY2FtZXJhX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbGlzdCBjb250YWlucyBhIHN1YnNldCBvZiB0aGUgcGFyZW50IGxvZ2ljYWwgY2FtZXJhJ3MgbXVsdGktcmVzb2x1dGlvbiBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB3aGljaCBiZWxvbmcgdG8gdGhpcyBwaHlzaWNhbCBjYW1lcmEsIGFuZCBpdCB3aWxsIGFkdmVydGlzZSBhbmQgd2lsbCBvbmx5CisgICAgICogYWR2ZXJ0aXNlIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCByZXNvbHV0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdC48L3A+CisgICAgICogPHA+SWYgdGhpcyBjYW1lcmEgZGV2aWNlIGlzbid0IGEgcGh5c2ljYWwgY2FtZXJhIGRldmljZSBjb25zdGl0dXRpbmcgYSBsb2dpY2FsIGNhbWVyYSwKKyAgICAgKiBidXQgYSBzdGFuZGFsb25lIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FtZXJhLCB0aGlzIGZpZWxkIHJlcHJlc2VudHMgdGhlIG11bHRpLXJlc29sdXRpb24gaW5wdXQvb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBvZgorICAgICAqIGRlZmF1bHQgbW9kZSBhbmQgbWF4IHJlc29sdXRpb24gbW9kZXMuIFRoZSBzaXplcyB3aWxsIGJlIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gb2YgYQorICAgICAqIHBhcnRpY3VsYXIgZm9ybWF0IGZvciBkZWZhdWx0IG1vZGUgYW5kIG1heCByZXNvbHV0aW9uIG1vZGUuPC9wPgorICAgICAqIDxwPlRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGFkdmVydGlzZWQgaWYgdGhlIGRldmljZSBpcyBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhCisgICAgICogbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlIG9yIGFuIHVsdHJhIGhpZ2ggcmVzb2x1dGlvbiBzZW5zb3IgY2FtZXJhLiBGb3IgYSBsb2dpY2FsCisgICAgICogbXVsdGktY2FtZXJhLCB0aGUgY2FtZXJhIEFQSSB3aWxsIGRlcml2ZSB0aGUgbG9naWNhbCBjYW1lcmHigJlzIG11bHRpLXJlc29sdXRpb24gc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgZnJvbSBhbGwgcGh5c2ljYWwgY2FtZXJhcy4gRm9yIGFuIHVsdHJhIGhpZ2ggcmVzb2x1dGlvbiBzZW5zb3IgY2FtZXJhLCB0aGlzCisgICAgICogaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgY2FtZXJh4oCZcyBtdWx0aS1yZXNvbHV0aW9uIHN0cmVhbSBjb25maWd1cmF0aW9ucy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3BoeXNpY2FsX2NhbWVyYV9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxOSwKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMKKyAgICAgKiBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkgZm9yIGEKKyAgICAgKiBDYXB0dXJlUmVxdWVzdCB3aXRoIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX21heGltdW1fcmVzb2x1dGlvbl90KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BbmFsb2dvdXMgdG8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZm9yIGNvbmZpZ3VyYXRpb25zCisgICAgICogd2hpY2ggYXJlIGFwcGxpY2FibGUgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqIDxwPk5vdCBhbGwgb3V0cHV0IGZvcm1hdHMgbWF5IGJlIHN1cHBvcnRlZCBpbiBhIGNvbmZpZ3VyYXRpb24gd2l0aAorICAgICAqIGFuIGlucHV0IHN0cmVhbSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKyAgICAgKiBhbmRyb2lkLnNjYWxlci5hdmFpbGFibGVJbnB1dE91dHB1dEZvcm1hdHNNYXBNYXhpbXVtUmVzb2x1dGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX21heGltdW1fcmVzb2x1dGlvbl90KQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAyMCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gd2hlbiB0aGUgY2FtZXJhIGRldmljZSBpcyBzZW50IGEgQ2FwdHVyZVJlcXVlc3Qgd2l0aAorICAgICAqIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QW5hbG9nb3VzIHRvIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLCBmb3IgY29uZmlndXJhdGlvbnMKKyAgICAgKiB3aGljaCBhcmUgYXBwbGljYWJsZSB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICogPHA+V2hlbiBtdWx0aXBsZSBzdHJlYW1zIGFyZSB1c2VkIGluIGEgcmVxdWVzdCAoaWYgc3VwcG9ydGVkLCB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKiBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+KSwgdGhlCisgICAgICogbWluaW11bSBmcmFtZSBkdXJhdGlvbiB3aWxsIGJlIG1heChpbmRpdmlkdWFsIHN0cmVhbSBtaW4gZHVyYXRpb25zKS48L3A+CisgICAgICogPHA+U2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OIGFuZAorICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OIGZvciBtb3JlIGRldGFpbHMgYWJvdXQKKyAgICAgKiBjYWxjdWxhdGluZyB0aGUgbWF4IGZyYW1lIHJhdGUuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAyMSwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtYXhpbXVtIHN0YWxsIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogb3V0cHV0IGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIHdoZW4gQ2FwdHVyZVJlcXVlc3RzIGFyZSBzdWJtaXR0ZWQgd2l0aAorICAgICAqIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BbmFsb2dvdXMgdG8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsIGZvciBjb25maWd1cmF0aW9ucworICAgICAqIHdoaWNoIGFyZSBhcHBsaWNhYmxlIHdoZW4gQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMjIsCisgICAgLyoqCisgICAgICogPHA+V2hldGhlciB0aGUgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX3N1cHBvcnRlZF90KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BIGxvZ2ljYWwgbXVsdGktY2FtZXJhIG9yIGFuIHVsdHJhIGhpZ2ggcmVzb2x1dGlvbiBjYW1lcmEgbWF5IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbgorICAgICAqIGlucHV0IG9yIG91dHB1dCBzdHJlYW1zLiBXaXRoIG11bHRpLXJlc29sdXRpb24gb3V0cHV0IHN0cmVhbXMsIHRoZSBjYW1lcmEgZGV2aWNlIGlzIGFibGUKKyAgICAgKiB0byBvdXRwdXQgZGlmZmVyZW50IHJlc29sdXRpb24gaW1hZ2VzIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIG9yCisgICAgICogcGl4ZWwgbW9kZS4gV2l0aCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IHN0cmVhbXMsIHRoZSBjYW1lcmEgZGV2aWNlIGNhbiByZXByb2Nlc3MgaW1hZ2VzCisgICAgICogb2YgZGlmZmVyZW50IHJlc29sdXRpb25zIGZyb20gZGlmZmVyZW50IHBoeXNpY2FsIGNhbWVyYXMgb3Igc2Vuc29yIHBpeGVsIG1vZGVzLjwvcD4KKyAgICAgKiA8cD5XaGVuIHNldCB0byBUUlVFOgorICAgICAqICogRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoZSBjYW1lcmEgZnJhbWV3b3JrIGRlcml2ZXMKKyAgICAgKiBhbmRyb2lkLnNjYWxlci5tdWx0aVJlc29sdXRpb25TdHJlYW1Db25maWd1cmF0aW9uTWFwIGJ5IGNvbWJpbmluZyB0aGUKKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9QSFlTSUNBTF9DQU1FUkFfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fQ09ORklHVVJBVElPTlMgZnJvbSBpdHMgcGh5c2ljYWwKKyAgICAgKiBjYW1lcmFzLgorICAgICAqICogRm9yIGFuIHVsdHJhLWhpZ2ggcmVzb2x1dGlvbiBzZW5zb3IgY2FtZXJhLCB0aGUgY2FtZXJhIGZyYW1ld29yayBkaXJlY3RseSBjb3BpZXMKKyAgICAgKiB0aGUgdmFsdWUgb2YgQUNBTUVSQV9TQ0FMRVJfUEhZU0lDQUxfQ0FNRVJBX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX0NPTkZJR1VSQVRJT05TIHRvCisgICAgICogYW5kcm9pZC5zY2FsZXIubXVsdGlSZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRCA9ICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9zdXBwb3J0ZWRfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMjQsCiAgICAgQUNBTUVSQV9TQ0FMRVJfRU5ELAogCiAgICAgLyoqCkBAIC00NTIyLDYgKzQ5MTAsNjcgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX1dISVRFX0xFVkVMID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAyOSwKKyAgICAvKioKKyAgICAgKiA8cD5Td2l0Y2hlcyBzZW5zb3IgcGl4ZWwgbW9kZSBiZXR3ZWVuIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlIGFuZCBkZWZhdWx0IG1vZGUuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX3BpeGVsX21vZGVfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja3M8L2xpPgorICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGtleSBjb250cm9scyB3aGV0aGVyIHRoZSBjYW1lcmEgc2Vuc29yIG9wZXJhdGVzIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPgorICAgICAqIG1vZGUgb3Igbm90LiBCeSBkZWZhdWx0LCBhbGwgY2FtZXJhIGRldmljZXMgb3BlcmF0ZSBpbgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUPC9hPiBtb2RlLgorICAgICAqIFdoZW4gb3BlcmF0aW5nIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQiPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQ8L2E+IG1vZGUsIHNlbnNvcnMKKyAgICAgKiB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FwYWJpbGl0eSB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSBwaXhlbCBiaW5uaW5nIGluIG9yZGVyIHRvIGltcHJvdmUgbG93IGxpZ2h0CisgICAgICogcGVyZm9ybWFuY2UsIG5vaXNlIHJlZHVjdGlvbiBldGMuIEhvd2V2ZXIsIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPgorICAgICAqIG1vZGUgKHN1cHBvcnRlZCBvbmx5CisgICAgICogYnkgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIj5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUjwvYT4KKyAgICAgKiBzZW5zb3JzKSwgc2Vuc29ycyB0eXBpY2FsbHkgb3BlcmF0ZSBpbiB1bmJpbm5lZCBtb2RlIGFsbG93aW5nIGZvciBhIGxhcmdlciBpbWFnZSBzaXplLgorICAgICAqIFRoZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGluCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPgorICAgICAqIG1vZGUgYXJlIGFsc28gZGlmZmVyZW50IGZyb20gdGhvc2Ugb2YKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfREVGQVVMVDwvYT4gbW9kZS4KKyAgICAgKiBUaGV5IGNhbiBiZSBxdWVyaWVkIHRocm91Z2gKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldDwvYT4gd2l0aAorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQX01BWElNVU1fUkVTT0xVVElPTikiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNTQ0FMRVJfU1RSRUFNX0NPTkZJR1VSQVRJT05fTUFQX01BWElNVU1fUkVTT0xVVElPTik8L2E+LgorICAgICAqIFVubGVzcyByZXBvcnRlZCBieSBib3RoCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9wYXJhbXMvU3RyZWFtQ29uZmlndXJhdGlvbk1hcC5odG1sIj5TdHJlYW1Db25maWd1cmF0aW9uTWFwPC9hPnMsIHRoZSBvdXRwdXRzIGZyb20KKyAgICAgKiA8Y29kZT5hbmRyb2lkLnNjYWxlci5zdHJlYW1Db25maWd1cmF0aW9uTWFwTWF4aW11bVJlc29sdXRpb248L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPmFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXA8L2NvZGU+CisgICAgICogbXVzdCBub3QgYmUgbWl4ZWQgaW4gdGhlIHNhbWUgQ2FwdHVyZVJlcXVlc3QuIEluIG90aGVyIHdvcmRzLCB0aGVzZSBvdXRwdXRzIGFyZQorICAgICAqIGV4Y2x1c2l2ZSB0byBlYWNoIG90aGVyLgorICAgICAqIFRoaXMga2V5IGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0IGZvciByZXByb2Nlc3MgcmVxdWVzdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9waXhlbF9tb2RlX3QpCisgICAgICAgICAgICBBQ0FNRVJBX1NFTlNPUl9TVEFSVCArIDMyLAorICAgIC8qKgorICAgICAqIDxwPldoZXRoZXIgPGNvZGU+UkFXPC9jb2RlPiBpbWFnZXMgcmVxdWVzdGVkIGhhdmUgdGhlaXIgYmF5ZXIgcGF0dGVybiBhcyBkZXNjcmliZWQgYnkKKyAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX0JJTk5JTkdfRkFDVE9SLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19CSU5OSU5HX0ZBQ1RPUgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX3Jhd19iaW5uaW5nX2ZhY3Rvcl91c2VkX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGluIGRldmljZXMgYWR2ZXJ0aXN0aW5nIHRoZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FwYWJpbGl0eSB3aGljaCBhbHNvIGFkdmVydGlzZSA8Y29kZT5SRU1PU0FJQ19SRVBST0NFU1NJTkc8L2NvZGU+IGNhcGFiaWxpdHkuIE9uIGFsbCBvdGhlciBkZXZpY2VzCisgICAgICogUkFXIHRhcmdldHMgd2lsbCBoYXZlIGEgcmVndWxhciBiYXllciBwYXR0ZXJuLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9SQVdfQklOTklOR19GQUNUT1JfVVNFRCA9ICAgICAgICAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfcmF3X2Jpbm5pbmdfZmFjdG9yX3VzZWRfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMzMsCiAgICAgQUNBTUVSQV9TRU5TT1JfRU5ELAogCiAgICAgLyoqCkBAIC00Nzc5LDcgKzUyMjgsNyBAQAogICAgICAqIHJlY3RhbmdsZSwgYW5kIGNyb3BwaW5nIHRvIHRoZSByZWN0YW5nbGUgZ2l2ZW4gaW4gQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRS48L3A+CiAgICAgICogPHA+RS5nLiB0byBjYWxjdWxhdGUgcG9zaXRpb24gb2YgYSBwaXhlbCwgKHgseSksIGluIGEgcHJvY2Vzc2VkIFlVViBvdXRwdXQgaW1hZ2Ugd2l0aCB0aGUKICAgICAgKiBkaW1lbnNpb25zIGluIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUgZ2l2ZW4gdGhlIHBvc2l0aW9uIG9mIGEgcGl4ZWwsCi0gICAgICogKHgnLCB5JyksIGluIHRoZSByYXcgcGl4ZWwgYXJyYXkgd2l0aCBkaW1lbnNpb25zIGdpdmUgaW4KKyAgICAgKiAoeCcsIHknKSwgaW4gdGhlIHJhdyBwaXhlbCBhcnJheSB3aXRoIGRpbWVuc2lvbnMgZ2l2ZW4gaW4KICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkU6PC9wPgogICAgICAqIDxvbD4KICAgICAgKiA8bGk+Q2hvb3NlIGEgcGl4ZWwgKHgnLCB5Jykgd2l0aGluIHRoZSBhY3RpdmUgYXJyYXkgcmVnaW9uIG9mIHRoZSByYXcgYnVmZmVyIGdpdmVuIGluCkBAIC00ODIzLDYgKzUyNzIsMTIwIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSA9ICAgICAgLy8gaW50MzJbNF0KICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX0lORk9fU1RBUlQgKyAxMCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXJlYSBvZiB0aGUgaW1hZ2Ugc2Vuc29yIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGFjdGl2ZSBwaXhlbHMgYWZ0ZXIgYW55IGdlb21ldHJpYworICAgICAqIGRpc3RvcnRpb24gY29ycmVjdGlvbiBoYXMgYmVlbiBhcHBsaWVkLCB3aGVuIHRoZSBzZW5zb3IgcnVucyBpbiBtYXhpbXVtIHJlc29sdXRpb24gbW9kZS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMls0XTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BbmFsb2dvdXMgdG8gQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSwgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICogaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi4KKyAgICAgKiBSZWZlciB0byBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIGZvciBkZXRhaWxzLCB3aXRoIHNlbnNvciBhcnJheSByZWxhdGVkIGtleXMKKyAgICAgKiByZXBsYWNlZCB3aXRoIHRoZWlyCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPgorICAgICAqIGNvdW50ZXJwYXJ0cy4KKyAgICAgKiBUaGlzIGtleSB3aWxsIG9ubHkgYmUgcHJlc2VudCBmb3IgZGV2aWNlcyB3aGljaCBhZHZlcnRpc2UgdGhlCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SIj5DYW1lcmFNZXRhZGF0YSNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUjwvYT4KKyAgICAgKiBjYXBhYmlsaXR5LjwvcD4KKyAgICAgKiA8cD5UaGUgZGF0YSByZXByZXNlbnRhdGlvbiBpcyA8Y29kZT5pbnRbNF08L2NvZGU+LCB3aGljaCBtYXBzIHRvIDxjb2RlPihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpPC9jb2RlPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiA9ICAvLyBpbnQzMls0XQorICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19TVEFSVCArIDExLAorICAgIC8qKgorICAgICAqIDxwPkRpbWVuc2lvbnMgb2YgdGhlIGZ1bGwgcGl4ZWwgYXJyYXksIHBvc3NpYmx5CisgICAgICogaW5jbHVkaW5nIGJsYWNrIGNhbGlicmF0aW9uIHBpeGVscywgd2hlbiB0aGUgc2Vuc29yIHJ1bnMgaW4gbWF4aW11bSByZXNvbHV0aW9uIG1vZGUuCisgICAgICogQW5hbG9nb3VzIHRvIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRSwgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzCisgICAgICogc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbMl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlIHBpeGVsIGNvdW50IG9mIHRoZSBmdWxsIHBpeGVsIGFycmF5IG9mIHRoZSBpbWFnZSBzZW5zb3IsIHdoaWNoIGNvdmVycworICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSBhcmVhLiBUaGlzIHJlcHJlc2VudHMgdGhlIGZ1bGwgcGl4ZWwgZGltZW5zaW9ucyBvZgorICAgICAqIHRoZSByYXcgYnVmZmVycyBwcm9kdWNlZCBieSB0aGlzIHNlbnNvciwgd2hlbiBpdCBydW5zIGluIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlLiBUaGF0CisgICAgICogaXMsIHdoZW4gQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LgorICAgICAqIFRoaXMga2V5IHdpbGwgb25seSBiZSBwcmVzZW50IGZvciBkZXZpY2VzIHdoaWNoIGFkdmVydGlzZSB0aGUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IiPkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SPC9hPgorICAgICAqIGNhcGFiaWxpdHkuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BIWVNJQ0FMX1NJWkUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OID0gICAvLyBpbnQzMlsyXQorICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19TVEFSVCArIDEyLAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhcmVhIG9mIHRoZSBpbWFnZSBzZW5zb3Igd2hpY2ggY29ycmVzcG9uZHMgdG8gYWN0aXZlIHBpeGVscyBwcmlvciB0byB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBvZiBhbnkgZ2VvbWV0cmljIGRpc3RvcnRpb24gY29ycmVjdGlvbiwgd2hlbiB0aGUgc2Vuc29yIHJ1bnMgaW4gbWF4aW11bQorICAgICAqIHJlc29sdXRpb24gbW9kZS4gVGhpcyBrZXkgbXVzdCBiZSB1c2VkIGZvciBjcm9wIC8gbWV0ZXJpbmcgcmVnaW9ucywgb25seSB3aGVuCisgICAgICogQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbNF08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QW5hbG9nb3VzIHRvIEFDQU1FUkFfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsCisgICAgICogd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uCisgICAgICogVGhpcyBrZXkgd2lsbCBvbmx5IGJlIHByZXNlbnQgZm9yIGRldmljZXMgd2hpY2ggYWR2ZXJ0aXNlIHRoZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNSRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfVUxUUkFfSElHSF9SRVNPTFVUSU9OX1NFTlNPUiI+Q2FtZXJhTWV0YWRhdGEjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1I8L2E+CisgICAgICogY2FwYWJpbGl0eS48L3A+CisgICAgICogPHA+VGhlIGRhdGEgcmVwcmVzZW50YXRpb24gaXMgPGNvZGU+aW50WzRdPC9jb2RlPiwgd2hpY2ggbWFwcyB0byA8Y29kZT4obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0KTwvY29kZT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMls0XQorICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19TVEFSVCArIDEzLAorICAgIC8qKgorICAgICAqIDxwPkRpbWVuc2lvbnMgb2YgdGhlIGdyb3VwIG9mIHBpeGVscyB3aGljaCBhcmUgdW5kZXIgdGhlIHNhbWUgY29sb3IgZmlsdGVyLgorICAgICAqIFRoaXMgc3BlY2lmaWVzIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IChwYWlyIG9mIGludGVnZXJzKSBvZiB0aGUgZ3JvdXAgb2YgcGl4ZWxzIHdoaWNoIGZhbGwKKyAgICAgKiB1bmRlciB0aGUgc2FtZSBjb2xvciBmaWx0ZXIgZm9yIFVMVFJBX0hJR0hfUkVTT0xVVElPTiBzZW5zb3JzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyWzJdPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlNlbnNvcnMgY2FuIGhhdmUgcGl4ZWxzIGdyb3VwZWQgdG9nZXRoZXIgdW5kZXIgdGhlIHNhbWUgY29sb3IgZmlsdGVyIGluIG9yZGVyCisgICAgICogdG8gaW1wcm92ZSB2YXJpb3VzIGFzcGVjdHMgb2YgaW1hZ2luZyBzdWNoIGFzIG5vaXNlIHJlZHVjdGlvbiwgbG93IGxpZ2h0CisgICAgICogcGVyZm9ybWFuY2UgZXRjLiBUaGVzZSBncm91cHMgY2FuIGJlIG9mIHZhcmlvdXMgc2l6ZXMgc3VjaCBhcyAyWDIgKHF1YWQgYmF5ZXIpLAorICAgICAqIDNYMyAobm9uYS1iYXllcikuIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgbGVuZ3RoIGFuZCB3aWR0aCBvZiB0aGUgcGl4ZWxzIGdyb3VwZWQgdW5kZXIKKyAgICAgKiB0aGUgc2FtZSBjb2xvciBmaWx0ZXIuPC9wPgorICAgICAqIDxwPlRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgaWYgUkVNT1NBSUNfUkVQUk9DRVNTSU5HIGlzIG5vdCBzdXBwb3J0ZWQsIHNpbmNlIFJBVyBpbWFnZXMKKyAgICAgKiB3aWxsIGhhdmUgYSByZWd1bGFyIGJheWVyIHBhdHRlcm4uPC9wPgorICAgICAqIDxwPlRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIHNlbnNvcnMgd2hpY2ggZG9uJ3QgaGF2ZSB0aGUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IiPkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SPC9hPgorICAgICAqIGNhcGFiaWxpdHkuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQklOTklOR19GQUNUT1IgPSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyWzJdCisgICAgICAgICAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX1NUQVJUICsgMTQsCiAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19FTkQsCiAKICAgICAvKioKQEAgLTUyMjMsNyArNTc4Niw3IEBACiAgICAgICogPC91bD48L3A+CiAgICAgICoKICAgICAgKiA8cD5TaW5jZSBvcHRpY2FsIGltYWdlIHN0YWJpbGl6YXRpb24gZ2VuZXJhbGx5IGludm9sdmVzIG1vdGlvbiBtdWNoIGZhc3RlciB0aGFuIHRoZSBkdXJhdGlvbgotICAgICAqIG9mIGluZGl2aWR1YWxxIGltYWdlIGV4cG9zdXJlLCBtdWx0aXBsZSBPSVMgc2FtcGxlcyBjYW4gYmUgaW5jbHVkZWQgZm9yIGEgc2luZ2xlIGNhcHR1cmUKKyAgICAgKiBvZiBpbmRpdmlkdWFsIGltYWdlIGV4cG9zdXJlLCBtdWx0aXBsZSBPSVMgc2FtcGxlcyBjYW4gYmUgaW5jbHVkZWQgZm9yIGEgc2luZ2xlIGNhcHR1cmUKICAgICAgKiByZXN1bHQuIEZvciBleGFtcGxlLCBpZiB0aGUgT0lTIHJlcG9ydGluZyBvcGVyYXRlcyBhdCAyMDAgSHosIGEgdHlwaWNhbCBjYW1lcmEgb3BlcmF0aW5nCiAgICAgICogYXQgMzBmcHMgbWF5IGhhdmUgNi03IE9JUyBzYW1wbGVzIHBlciBjYXB0dXJlIHJlc3VsdC4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgY29tYmluZWQKICAgICAgKiB3aXRoIHRoZSByb2xsaW5nIHNodXR0ZXIgc2tldyB0byBhY2NvdW50IGZvciBsZW5zIG1vdGlvbiBkdXJpbmcgaW1hZ2UgZXhwb3N1cmUgaW4KQEAgLTYwMjgsNiArNjU5MSwxNjIgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAvLyBpbnQ2NFs0Km5dCiAgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgOCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIGRlcHRoIGRhdGFzcGFjZSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cworICAgICAqIChpLmUuIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgb3V0cHV0L2lucHV0IHN0cmVhbSkgd2hlbiBhIENhcHR1cmVSZXF1ZXN0IGlzIHN1Ym1pdHRlZCB3aXRoCisgICAgICogQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QW5hbG9nb3VzIHRvIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZm9yIGNvbmZpZ3VyYXRpb25zIHdoaWNoCisgICAgICogYXJlIGFwcGxpY2FibGUgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdCkKKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA5LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZGVwdGggb3V0cHV0IGZvcm1hdHMgd2hlbiBhIENhcHR1cmVSZXF1ZXN0IGlzIHN1Ym1pdHRlZCB3aXRoCisgICAgICogQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BbmFsb2dvdXMgdG8gQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywgZm9yIGNvbmZpZ3VyYXRpb25zIHdoaWNoCisgICAgICogYXJlIGFwcGxpY2FibGUgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqIDxwPlNlZSBBQ0FNRVJBX1NFTlNPUl9GUkFNRV9EVVJBVElPTiBhbmQKKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CisgICAgICogY2FsY3VsYXRpbmcgdGhlIG1heCBmcmFtZSByYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgMTAsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWF4aW11bSBzdGFsbCBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIG91dHB1dCBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgZGVwdGggc3RyZWFtcyBmb3IgQ2FwdHVyZVJlcXVlc3RzIHdoZXJlCisgICAgICogQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BbmFsb2dvdXMgdG8gQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RBTExfRFVSQVRJT05TLCBmb3IgY29uZmlndXJhdGlvbnMgd2hpY2gKKyAgICAgKiBhcmUgYXBwbGljYWJsZSB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgMTEsCisgICAgLyoqCisgICAgICogPHA+VGhlIGF2YWlsYWJsZSBkeW5hbWljIGRlcHRoIGRhdGFzcGFjZSBzdHJlYW0KKyAgICAgKiBjb25maWd1cmF0aW9ucyB0aGF0IHRoaXMgY2FtZXJhIGRldmljZSBzdXBwb3J0cyAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICogb3V0cHV0L2lucHV0IHN0cmVhbSkgZm9yIENhcHR1cmVSZXF1ZXN0cyB3aGVyZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfbWF4aW11bV9yZXNvbHV0aW9uX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkFuYWxvZ291cyB0byBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZm9yIGNvbmZpZ3VyYXRpb25zCisgICAgICogd2hpY2ggYXJlIGFwcGxpY2FibGUgd2hlbiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdCkKKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyAxMiwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMgIGZvciBDYXB0dXJlUmVxdWVzdHMgd2hlcmUKKyAgICAgKiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkFuYWxvZ291cyB0byBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsIGZvciBjb25maWd1cmF0aW9ucworICAgICAqIHdoaWNoIGFyZSBhcHBsaWNhYmxlIHdoZW4gQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyAxMywKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtYXhpbXVtIHN0YWxsIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogb3V0cHV0IGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBkeW5hbWljIGRlcHRoIHN0cmVhbXMgZm9yIENhcHR1cmVSZXF1ZXN0cyB3aGVyZQorICAgICAqIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QW5hbG9nb3VzIHRvIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TLCBmb3IgY29uZmlndXJhdGlvbnMKKyAgICAgKiB3aGljaCBhcmUgYXBwbGljYWJsZSB3aGVuIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUgaXMgc2V0IHRvCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNZXRhZGF0YS5odG1sI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiI+Q2FtZXJhTWV0YWRhdGEjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDE0LAogICAgIEFDQU1FUkFfREVQVEhfRU5ELAogCiAgICAgLyoqCkBAIC02MjQ4LDYgKzY5NjcsNzEgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TID0gICAgICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCiAgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyAyLAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhdmFpbGFibGUgSEVJQyAoSVNPL0lFQyAyMzAwOC0xMikgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG91dHB1dC9pbnB1dCBzdHJlYW0pLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2hlaWNfYXZhaWxhYmxlX2hlaWNfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX21heGltdW1fcmVzb2x1dGlvbl90KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5SZWZlciB0byBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TIGZvciBkZXRhaWxzLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIGNvbmZpZ3VyYXRpb24gdHVwbGVzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHdpbGwgY29udGFpbgorICAgICAqIEFJTUFHRV9GT1JNQVRfSEVJQyBmb3JtYXQgYXMgT1VUUFVUIG9ubHkuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdCkKKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCArIDMsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBIRUlDIG91dHB1dCBmb3JtYXRzIGZvciBDYXB0dXJlUmVxdWVzdHMgd2hlcmUKKyAgICAgKiBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFIGlzIHNldCB0bworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQ2FtZXJhTWV0YWRhdGEuaHRtbCNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT04iPkNhbWVyYU1ldGFkYXRhI1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTjwvYT4uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9QSVhFTF9NT0RFCisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlJlZmVyIHRvIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TIGZvciBkZXRhaWxzLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyA0LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgc3RyZWFtcyBmb3IgQ2FwdHVyZVJlcXVlc3RzIHdoZXJlCisgICAgICogQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERSBpcyBzZXQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OIj5DYW1lcmFNZXRhZGF0YSNTRU5TT1JfUElYRUxfTU9ERV9NQVhJTVVNX1JFU09MVVRJT048L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERQorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5SZWZlciB0byBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TIGZvciBkZXRhaWxzLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgNSwKICAgICBBQ0FNRVJBX0hFSUNfRU5ELAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CkBAIC04MTI0LDEzICs4OTA4LDI3IEBACiAgICAgICogY2FtZXJhJ3MgY3JvcCByZWdpb24gaXMgc2V0IHRvIG1heGltdW0gc2l6ZSwgdGhlIEZPViBvZiB0aGUgcGh5c2ljYWwgc3RyZWFtcyBmb3IgdGhlCiAgICAgICogdWx0cmF3aWRlIGxlbnMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgbG9naWNhbCBzdHJlYW0sIGJ5IG1ha2luZyB0aGUgY3JvcCByZWdpb24KICAgICAgKiBzbWFsbGVyIHRoYW4gaXRzIGFjdGl2ZSBhcnJheSBzaXplIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBzbWFsbGVyIGZvY2FsIGxlbmd0aC48L3A+Ci0gICAgICogPHA+RXZlbiBpZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzIGhhdmUgZGlmZmVyZW50IFJBVyBjaGFyYWN0ZXJpc3RpY3MgKHN1Y2ggYXMKLSAgICAgKiBzaXplIG9yIENGQSBwYXR0ZXJuKSwgYSBsb2dpY2FsIGNhbWVyYSBjYW4gc3RpbGwgYWR2ZXJ0aXNlIFJBVyBjYXBhYmlsaXR5LiBJbiB0aGlzCi0gICAgICogY2FzZSwgd2hlbiB0aGUgYXBwbGljYXRpb24gY29uZmlndXJlcyBhIFJBVyBzdHJlYW0sIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgbWFrZSBzdXJlCi0gICAgICogdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgd2lsbCByZW1haW4gYWN0aXZlIHRvIGVuc3VyZSBjb25zaXN0ZW50IFJBVyBvdXRwdXQKLSAgICAgKiBiZWhhdmlvciwgYW5kIG5vdCBzd2l0Y2ggdG8gb3RoZXIgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICogPHA+VGhlcmUgYXJlIHR3byB3YXlzIGZvciB0aGUgYXBwbGljYXRpb24gdG8gY2FwdHVyZSBSQVcgaW1hZ2VzIGZyb20gYSBsb2dpY2FsIGNhbWVyYQorICAgICAqIHdpdGggUkFXIGNhcGFiaWxpdHk6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+QmVjYXVzZSB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzIG1heSBoYXZlIGRpZmZlcmVudCBSQVcgY2FwYWJpbGl0aWVzIChzdWNoCisgICAgICogYXMgcmVzb2x1dGlvbiBvciBDRkEgcGF0dGVybiksIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdoZW4gYSBSQVcgc3RyZWFtCisgICAgICogaXMgY29uZmlndXJlZCwgdGhlIGNhbWVyYSBkZXZpY2UgbWFrZXMgc3VyZSB0aGUgZGVmYXVsdCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIHJlbWFpbnMKKyAgICAgKiBhY3RpdmUgYW5kIGRvZXMgbm90IHN3aXRjaCB0byBvdGhlciBwaHlzaWNhbCBjYW1lcmFzLiAoT25lIGV4Y2VwdGlvbiBpcyB0aGF0LCBpZiB0aGUKKyAgICAgKiBsb2dpY2FsIGNhbWVyYSBjb25zaXN0cyBvZiBpZGVudGljYWwgaW1hZ2Ugc2Vuc29ycyBhbmQgYWR2ZXJ0aXNlcyBtdWx0aXBsZSBmb2NhbExlbmd0aAorICAgICAqIGR1ZSB0byBkaWZmZXJlbnQgbGVuc2VzLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgZ2VuZXJhdGUgUkFXIGltYWdlcyBmcm9tIGRpZmZlcmVudAorICAgICAqIHBoeXNpY2FsIGNhbWVyYXMgYmFzZWQgb24gdGhlIGZvY2FsTGVuZ3RoIGJlaW5nIHNldCBieSB0aGUgYXBwbGljYXRpb24uKSBUaGlzCisgICAgICogYmFja3dhcmQtY29tcGF0aWJsZSBhcHByb2FjaCB1c3VhbGx5IHJlc3VsdHMgaW4gbG9zcyBvZiBvcHRpY2FsIHpvb20sIHRvIHRlbGVwaG90bworICAgICAqIGxlbnMgb3IgdG8gdWx0cmF3aWRlIGxlbnMuPC9saT4KKyAgICAgKiA8bGk+QWx0ZXJuYXRpdmVseSwgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGZ1bGwgem9vbVJhdGlvIHJhbmdlIG9mIHRoZSBsb2dpY2FsIGNhbWVyYSwKKyAgICAgKiB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHVzZSA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL011bHRpUmVzb2x1dGlvbkltYWdlUmVhZGVyLmh0bWwiPk11bHRpUmVzb2x1dGlvbkltYWdlUmVhZGVyPC9hPgorICAgICAqIHRvIGNhcHR1cmUgUkFXIGltYWdlcyBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYS4gQmVjYXVzZSBkaWZmZXJlbnQKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgbWF5IGhhdmUgZGlmZmVyZW50IFJBVyBjaGFyYWN0ZXJpc3RpY3MsIHRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byB1c2UKKyAgICAgKiB0aGUgY2hhcmFjdGVyaXN0aWNzIGFuZCByZXN1bHQgbWV0YWRhdGEgb2YgdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgZm9yIHRoZQorICAgICAqIHJlbGV2YW50IFJBVyBtZXRhZGF0YS48L2xpPgorICAgICAqIDwvdWw+CiAgICAgICogPHA+VGhlIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHRhZ3MgcmVxdWlyZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgY2FtZXJhCi0gICAgICogZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBjYXBhYmlsdGl0eS4gT24gdGhlIG90aGVyCisgICAgICogZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBjYXBhYmlsaXR5LiBPbiB0aGUgb3RoZXIKICAgICAgKiBoYW5kLCB0aGUgdXNlIG9mIG1hbnVhbCBjYXB0dXJlIGNvbnRyb2xzIChzZW5zb3Igb3IgcG9zdC1wcm9jZXNzaW5nKSB3aXRoIGEKICAgICAgKiBsb2dpY2FsIGNhbWVyYSBtYXkgcmVzdWx0IGluIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2hlbiB0aGUgSEFMIGRlY2lkZXMgdG8gc3dpdGNoCiAgICAgICogYmV0d2VlbiBwaHlzaWNhbCBjYW1lcmFzIHdpdGggZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcyB1bmRlciB0aGUgaG9vZC4gRm9yIGV4YW1wbGUsCkBAIC04MTk4LDYgKzg5OTYsMjUgQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TWVNURU1fQ0FNRVJBICAgICAgICAgICAgID0gMTQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiBwcm9kdWNpbmcgdWx0cmEgaGlnaCByZXNvbHV0aW9uIGltYWdlcyBpbgorICAgICAqIGFkZGl0aW9uIHRvIHRoZSBpbWFnZSBzaXplcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICogYW5kcm9pZC5zY2FsZXIuc3RyZWFtQ29uZmlndXJhdGlvbk1hcC4KKyAgICAgKiBJdCBjYW4gb3BlcmF0ZSBpbiAnZGVmYXVsdCcgbW9kZSBhbmQgJ21heCByZXNvbHV0aW9uJyBtb2RlLiBJdCBnZW5lcmFsbHkgZG9lcyB0aGlzCisgICAgICogYnkgYmlubmluZyBwaXhlbHMgaW4gJ2RlZmF1bHQnIG1vZGUgYW5kIG5vdCBiaW5uaW5nIHRoZW0gaW4gJ21heCByZXNvbHV0aW9uJyBtb2RlLgorICAgICAqIDxjb2RlPmFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXA8L2NvZGU+IGRlc2NyaWJlcyB0aGUgc3RyZWFtcyBzdXBwb3J0ZWQgaW4gJ2RlZmF1bHQnCisgICAgICogbW9kZS4KKyAgICAgKiBUaGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHN1cHBvcnRlZCBpbiAnbWF4IHJlc29sdXRpb24nIG1vZGUgYXJlIGRlc2NyaWJlZCBieQorICAgICAqIDxjb2RlPmFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXBNYXhpbXVtUmVzb2x1dGlvbjwvY29kZT4uCisgICAgICogVGhlIG1heGltdW0gcmVzb2x1dGlvbiBtb2RlIHBpeGVsIGFycmF5IHNpemUgb2YgYSBjYW1lcmEgZGV2aWNlCisgICAgICogKDxjb2RlPkFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRTwvY29kZT4pIHdpdGggdGhpcyBjYXBhYmlsaXR5LAorICAgICAqIHdpbGwgYmUgYXQgbGVhc3QgMjQgbWVnYXBpeGVscy48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRQorICAgICAqLworICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE2LAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190OwogCiAKQEAgLTgyOTgsNiArOTExNSw3OSBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CiAKKy8vIEFDQU1FUkFfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUAordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9yb3RhdGVfYW5kX2Nyb3AgeworICAgIC8qKgorICAgICAqIDxwPk5vIHJvdGF0ZSBhbmQgY3JvcCBpcyBhcHBsaWVkLiBQcm9jZXNzZWQgb3V0cHV0cyBhcmUgaW4gdGhlIHNlbnNvciBvcmllbnRhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5Qcm9jZXNzZWQgaW1hZ2VzIGFyZSByb3RhdGVkIGJ5IDkwIGRlZ3JlZXMgY2xvY2t3aXNlLCBhbmQgdGhlbiBjcm9wcGVkCisgICAgICogdG8gdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpby48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKKyAgICAvKioKKyAgICAgKiA8cD5Qcm9jZXNzZWQgaW1hZ2VzIGFyZSByb3RhdGVkIGJ5IDE4MCBkZWdyZWVzLiAgU2luY2UgdGhlIGFzcGVjdCByYXRpbyBkb2VzIG5vdAorICAgICAqIGNoYW5nZSwgbm8gY3JvcHBpbmcgaXMgcGVyZm9ybWVkLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfMTgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMiwKKworICAgIC8qKgorICAgICAqIDxwPlByb2Nlc3NlZCBpbWFnZXMgYXJlIHJvdGF0ZWQgYnkgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlLCBhbmQgdGhlbiBjcm9wcGVkCisgICAgICogdG8gdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpby48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzI3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgY2FtZXJhIEFQSSBhdXRvbWF0aWNhbGx5IHNlbGVjdHMgdGhlIGJlc3QgY29uY3JldGUgdmFsdWUgZm9yCisgICAgICogcm90YXRlLWFuZC1jcm9wIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgZm9yIHJlc2l6YWJpbGl0eSBhbmQgdGhlIGN1cnJlbnQKKyAgICAgKiBtdWx0aS13aW5kb3cgbW9kZS48L3A+CisgICAgICogPHA+SWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBvcnQgcmVzaXppbmcgYnV0IHRoZSBkaXNwbGF5IG1vZGUgZm9yIGl0cyBtYWluCisgICAgICogQWN0aXZpdHkgaXMgbm90IGluIGEgdHlwaWNhbCBvcmllbnRhdGlvbiwgdGhlIGNhbWVyYSBBUEkgd2lsbCBzZXQgPGNvZGU+Uk9UQVRFX0FORF9DUk9QXzkwPC9jb2RlPgorICAgICAqIG9yIHNvbWUgb3RoZXIgc3VwcG9ydGVkIHJvdGF0aW9uIHZhbHVlLCBkZXBlbmRpbmcgb24gZGV2aWNlIGNvbmZpZ3VyYXRpb24sCisgICAgICogdG8gZW5zdXJlIHByZXZpZXcgYW5kIGNhcHR1cmVkIGltYWdlcyBhcmUgY29ycmVjdGx5IHNob3duIHRvIHRoZSB1c2VyLiBPdGhlcndpc2UsCisgICAgICogPGNvZGU+Uk9UQVRFX0FORF9DUk9QX05PTkU8L2NvZGU+IHdpbGwgYmUgc2VsZWN0ZWQuPC9wPgorICAgICAqIDxwPldoZW4gYSB2YWx1ZSBvdGhlciB0aGFuIE5PTkUgaXMgc2VsZWN0ZWQsIHNldmVyYWwgbWV0YWRhdGEgZmllbGRzIHdpbGwgYWxzbyBiZSBwYXJzZWQKKyAgICAgKiBkaWZmZXJlbnRseSB0byBlbnN1cmUgdGhhdCBjb29yZGluYXRlcyBhcmUgY29ycmVjdGx5IGhhbmRsZWQgZm9yIGZlYXR1cmVzIGxpa2UgZHJhd2luZworICAgICAqIGZhY2UgZGV0ZWN0aW9uIGJveGVzIG9yIHBhc3NpbmcgaW4gdGFwLXRvLWZvY3VzIGNvb3JkaW5hdGVzLiAgVGhlIGNhbWVyYSBBUEkgd2lsbAorICAgICAqIGNvbnZlcnQgcG9zaXRpb25zIGluIHRoZSBhY3RpdmUgYXJyYXkgY29vcmRpbmF0ZSBzeXN0ZW0gdG8vZnJvbSB0aGUgY3JvcHBlZC1hbmQtcm90YXRlZAorICAgICAqIGNvb3JkaW5hdGUgc3lzdGVtIHRvIG1ha2UgdGhlIG9wZXJhdGlvbiB0cmFuc3BhcmVudCBmb3IgYXBwbGljYXRpb25zLjwvcD4KKyAgICAgKiA8cD5ObyBjb29yZGluYXRlIG1hcHBpbmcgd2lsbCBiZSBkb25lIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHNlbGVjdHMgYSBub24tQVVUTyBtb2RlLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3Q7CisKKy8vIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9waHlzaWNhbF9jYW1lcmFfbXVsdGlfcmVzb2x1dGlvbl9zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIEFDQU1FUkFfU0NBTEVSX1BIWVNJQ0FMX0NBTUVSQV9NVUxUSV9SRVNPTFVUSU9OX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX1NDQUxFUl9QSFlTSUNBTF9DQU1FUkFfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3BoeXNpY2FsX2NhbWVyYV9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCisvLyBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTgordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX21heGltdW1fcmVzb2x1dGlvbiB7CisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT05fT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT05fSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9zdHJlYW1fY29uZmlndXJhdGlvbnNfbWF4aW11bV9yZXNvbHV0aW9uX3Q7CisKKy8vIEFDQU1FUkFfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRAordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9tdWx0aV9yZXNvbHV0aW9uX3N0cmVhbV9zdXBwb3J0ZWQgeworICAgIEFDQU1FUkFfU0NBTEVSX01VTFRJX1JFU09MVVRJT05fU1RSRUFNX1NVUFBPUlRFRF9GQUxTRSAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9TQ0FMRVJfTVVMVElfUkVTT0xVVElPTl9TVFJFQU1fU1VQUE9SVEVEX1RSVUUgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX211bHRpX3Jlc29sdXRpb25fc3RyZWFtX3N1cHBvcnRlZF90OworCiAKIC8vIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NlbnNvcl9yZWZlcmVuY2VfaWxsdW1pbmFudDEgewpAQCAtODM3MCwxMCArOTI2MCwxMCBAQAogICAgICAqIHJlc3BlY3RpdmUgY29sb3IgY2hhbm5lbCBwcm92aWRlZCBpbgogICAgICAqIEFDQU1FUkFfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBLjwvcD4KICAgICAgKiA8cD5Gb3IgZXhhbXBsZTo8L3A+Ci0gICAgICogPHByZT48Y29kZT5hbmRyb2lkLnRlc3RQYXR0ZXJuRGF0YSA9IFswLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAwXQorICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEgPSBbMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgMF0KICAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+QWxsIGdyZWVuIHBpeGVscyBhcmUgMTAwJSBncmVlbi4gQWxsIHJlZC9ibHVlIHBpeGVscyBhcmUgYmxhY2suPC9wPgotICAgICAqIDxwcmU+PGNvZGU+YW5kcm9pZC50ZXN0UGF0dGVybkRhdGEgPSBbMHhGRkZGRkZGRiwgMCwgMHhGRkZGRkZGRiwgMF0KKyAgICAgKiA8cHJlPjxjb2RlPkFDQU1FUkFfU0VOU09SX1RFU1RfUEFUVEVSTl9EQVRBID0gWzB4RkZGRkZGRkYsIDAsIDB4RkZGRkZGRkYsIDBdCiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkFsbCByZWQgcGl4ZWxzIGFyZSAxMDAlIHJlZC4gT25seSB0aGUgb2RkIGdyZWVuIHBpeGVscwogICAgICAqIGFyZSAxMDAlIGdyZWVuLiBBbGwgYmx1ZSBwaXhlbHMgYXJlIDEwMCUgYmxhY2suPC9wPgpAQCAtODQ1Niw2ICs5MzQ2LDQyIEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX3Rlc3RfcGF0dGVybl9tb2RlX3Q7CiAKKy8vIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREUKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcGl4ZWxfbW9kZSB7CisgICAgLyoqCisgICAgICogPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBzZW5zb3IgcGl4ZWwgbW9kZS4gVGhpcyBpcyB0aGUgb25seSBzZW5zb3IgcGl4ZWwgbW9kZQorICAgICAqIHN1cHBvcnRlZCB1bmxlc3MgYSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IiPkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SPC9hPi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIHNlbnNvciBwaXhlbCBtb2RlIGlzIG9mZmVyZWQgYnkgZGV2aWNlcyB3aXRoIGNhcGFiaWxpdHkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1ldGFkYXRhLmh0bWwjUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IiPkNhbWVyYU1ldGFkYXRhI1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SPC9hPi4KKyAgICAgKiBJbiB0aGlzIG1vZGUsIHNlbnNvcnMgdHlwaWNhbGx5IGRvIG5vdCBiaW4gcGl4ZWxzLCBhcyBhIHJlc3VsdCBjYW4gb2ZmZXIgbGFyZ2VyCisgICAgICogaW1hZ2Ugc2l6ZXMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9waXhlbF9tb2RlX3Q7CisKKy8vIEFDQU1FUkFfU0VOU09SX1JBV19CSU5OSU5HX0ZBQ1RPUl9VU0VECit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX3Jhd19iaW5uaW5nX2ZhY3Rvcl91c2VkIHsKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgPGNvZGU+UkFXPC9jb2RlPiB0YXJnZXRzIGluIHRoaXMgY2FwdHVyZSBoYXZlIEFDQU1FUkFfU0VOU09SX0lORk9fQklOTklOR19GQUNUT1IgYXMgdGhlCisgICAgICogYmF5ZXIgcGF0dGVybi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQklOTklOR19GQUNUT1IKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9SQVdfQklOTklOR19GQUNUT1JfVVNFRF9UUlVFICAgICAgICAgICAgICAgICAgICAgID0gMCwKKworICAgIC8qKgorICAgICAqIDxwPlRoZSA8Y29kZT5SQVc8L2NvZGU+IHRhcmdldHMgaGF2ZSBhIHJlZ3VsYXIgYmF5ZXIgcGF0dGVybiBpbiB0aGlzIGNhcHR1cmUuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX1JBV19CSU5OSU5HX0ZBQ1RPUl9VU0VEX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9yYXdfYmlubmluZ19mYWN0b3JfdXNlZF90OworCiAKIC8vIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50IHsKQEAgLTg5NDAsNiArOTg2NiwyNiBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc190OwogCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfZGVwdGhfYXZhaWxhYmxlX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb24geworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT05fT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTl9JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX21heGltdW1fcmVzb2x1dGlvbl90OworCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04KK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfbWF4aW11bV9yZXNvbHV0aW9uIHsKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT05fT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OX0lOUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLAorCit9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdDsKKwogCiAvLyBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlIHsKQEAgLTg5OTEsOSArOTkzNywxOCBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2hlaWNfYXZhaWxhYmxlX2hlaWNfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CiAKKy8vIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfbWF4aW11bV9yZXNvbHV0aW9uIHsKKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTl9PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTl9JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc19tYXhpbXVtX3Jlc29sdXRpb25fdDsKIAogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCisKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaAppbmRleCA5OWY2N2U5Li4wODM4ZmJhIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApAQCAtNDQsMTAgKzQ0LDEyIEBACiAgKi8KICNpZmRlZiBfX0FORFJPSURfVk5ES19fCiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLXR5cGVkZWYgbmF0aXZlX2hhbmRsZV90IEFDYW1lcmFXaW5kb3dUeXBlOwordHlwZWRlZiBjb25zdCBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7CiAjZWxzZQogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogdHlwZWRlZiBBTmF0aXZlV2luZG93IEFDYW1lcmFXaW5kb3dUeXBlOwogI2VuZGlmCiAKKy8qKiBAfSAqLworCiAjZW5kaWYgLy9fTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggZDNmODgyNi4uZDgzYzViMyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtNDQsMTIgKzQ0LDEwIEBACiAKIF9fQkVHSU5fREVDTFMKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyNAotCi0vLyBDb250YWluZXIgZm9yIG91dHB1dCB0YXJnZXRzCisvKiogQ29udGFpbmVyIGZvciBvdXRwdXQgdGFyZ2V0cyAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldHMgQUNhbWVyYU91dHB1dFRhcmdldHM7CiAKLS8vIENvbnRhaW5lciBmb3IgYSBzaW5nbGUgb3V0cHV0IHRhcmdldAorLyoqIENvbnRhaW5lciBmb3IgYSBzaW5nbGUgb3V0cHV0IHRhcmdldCAqLwogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCBBQ2FtZXJhT3V0cHV0VGFyZ2V0OwogCiAvKioKQEAgLTMwNCwxMCArMzAyLDYgQEAKICAqLwogdm9pZCBBQ2FwdHVyZVJlcXVlc3RfZnJlZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKioKICAqIEFzc29jaWF0ZSBhbiBhcmJpdHJhcnkgdXNlciBjb250ZXh0IHBvaW50ZXIgdG8gdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9CiAgKgpAQCAtMzU2LDEwICszNTAsNiBAQAogICovCiBBQ2FwdHVyZVJlcXVlc3QqIEFDYXB0dXJlUmVxdWVzdF9jb3B5KGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc3JjKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKLQogLyoqCiAgKiBHZXQgYSBtZXRhZGF0YSBlbnRyeSBmcm9tIGlucHV0IHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IGZvcgogICogYSBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KQEAgLTM5MywxMCArMzgzLDEwIEBACiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHVuc2lnbmVkIDggYml0cyBkYXRhIHR5cGUgZm9yCiAgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgogICoKLSAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4LCBleGNlcHQgdGhhdCBpZiB0YWcgaXMgY29udGFpbmVkCiAgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgogICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgotICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICogSWYgdGFnIGlzIG5vdCBjb250YWluZWQgaW4KICAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAogICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgogICoKQEAgLTQyMywxMCArNDEzLDEwIEBACiAgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIHNpZ25lZCAzMiBiaXRzIGRhdGEgdHlwZSBmb3IKICAqIGEgcGh5c2ljYWwgY2FtZXJhIG9mIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgogICoKLSAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2kzMiwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzIsIGV4Y2VwdCB0aGF0IGlmIHRhZyBpcyBjb250YWluZWQKICAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCiAgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCi0gKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiBJZiB0YWcgaXMgbm90IGNvbnRhaW5lZCBpbgogICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCiAgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CiAgKgpAQCAtNDUzLDEwICs0NDMsMTAgQEAKICAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZmxvYXQgZGF0YSB0eXBlIGZvcgogICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCiAgKgotICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQsIGV4Y2VwdCB0aGF0IGlmIHRhZyBpcyBjb250YWluZWQKICAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCiAgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCi0gKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiBJZiB0YWcgaXMgbm90IGNvbnRhaW5lZCBpbgogICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCiAgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CiAgKgpAQCAtNDgzLDEwICs0NzMsMTAgQEAKICAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDY0IGJpdHMgZGF0YSB0eXBlIGZvcgogICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCiAgKgotICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NCwgZXhjZXB0IHRoYXQgaWYgdGFnIGlzIGNvbnRhaW5lZAogICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KICAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIElmIHRhZyBpcyBub3QgY29udGFpbmVkIGluCiAgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKICAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KICAqCkBAIC01MTMsMTAgKzUwMywxMCBAQAogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBkb3VibGUgZGF0YSB0eXBlIGZvcgogICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCiAgKgotICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlLCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2RvdWJsZSwgZXhjZXB0IHRoYXQgaWYgdGFnIGlzIGNvbnRhaW5lZAogICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KICAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIElmIHRhZyBpcyBub3QgY29udGFpbmVkIGluCiAgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKICAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KICAqCkBAIC01NDMsMTAgKzUzMywxMCBAQAogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCByYXRpb25hbCBkYXRhIHR5cGUgZm9yCiAgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KICAqCi0gKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9yYXRpb25hbCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9yYXRpb25hbCwgZXhjZXB0IHRoYXQgaWYgdGFnIGlzIGNvbnRhaW5lZAogICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KICAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KLSAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIElmIHRhZyBpcyBub3QgY29udGFpbmVkIGluCiAgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKICAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KICAqCkBAIC01NjksOCArNTU5LDYgQEAKICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCiAgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBBQ2FtZXJhTWV0YWRhdGFfcmF0aW9uYWwqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KLQogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKaW5kZXggZTFhZjhjMS4uNWExYWY3OSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlICJ1dGlscy5oIgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoY29uc3QgbmF0aXZlX2hhbmRsZV90KiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgogICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKIApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAppbmRleCBlNTExYTNmLi45ZjYzMDk5IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMTgwLDYgKzE4MCw3IEBACiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CiAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBjdXJyZW50U2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgICB9CiAKICAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KLSAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCBzdGFydFRpbWVOcyk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbi4gY2Fubm90IGNvbmZpZ3VyZSBzdHJlYW1zIik7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0zNTUsNyArMzU2LDcgQEAKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3RyZWFtSWR4TGlzdDsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXF1ZXN0U3VyZmFjZUlkeExpc3Q7CiAgICAgZm9yIChhdXRvIG91dHB1dFRhcmdldCA6IHJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0cHV0VGFyZ2V0Lm1XaW5kb3c7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0cHV0VGFyZ2V0Lm1XaW5kb3c7CiAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICAgcmVxLT5tU3VyZmFjZUxpc3QucHVzaF9iYWNrKGFudyk7CiAgICAgICAgIC8vIGxvb2t1cCBzdHJlYW0vc3VyZmFjZSBJRApAQCAtNDM0LDcgKzQzNSw3IEBACiAgICAgfQogICAgIHBSZXF1ZXN0LT50YXJnZXRzID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IHJlcS0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IHJlcS0+bVN1cmZhY2VMaXN0W2ldOwogICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0IG91dHB1dFRhcmdldChhbncpOwogICAgICAgICBwUmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMuaW5zZXJ0KG91dHB1dFRhcmdldCk7CiAgICAgfQpAQCAtNDcyLDcgKzQ3MywxMSBAQAogICAgIH0KIAogICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICAvLyBOb3RlOiBUaGUgdW5jb25maWd1cmF0aW9uIG9mIHNlc3Npb24gd29uJ3QgYmUgYWNjb3VudGVkIGZvciBzZXNzaW9uCisgICAgLy8gbGF0ZW5jeSBiZWNhdXNlIGEgc3RyZWFtIGNvbmZpZ3VyYXRpb24gd2l0aCAwIHN0cmVhbXMgd29uJ3QgZXZlciBiZWNvbWUKKyAgICAvLyBhY3RpdmUuCisgICAgbnNlY3NfdCBzdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyLCBzdGFydFRpbWVOcyk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCJVbmNvbmZpZ3VyZSBzdHJlYW0gZmFpbGVkLiBEZXZpY2UgbWlnaHQgc3RpbGwgYmUgY29uZmlndXJlZCEgcmV0ICVkIiwgcmV0KTsKICAgICB9CkBAIC01OTgsNyArNjAzLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAotICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsIG5zZWNzX3Qgc3RhcnRUaW1lTnMpIHsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgZW1wdHlPdXRwdXQ7CiAgICAgaWYgKG91dHB1dHMgPT0gbnVsbHB0cikgewogICAgICAgICBvdXRwdXRzID0gJmVtcHR5T3V0cHV0OwpAQCAtNjExLDcgKzYxNiw3IEBACiAKICAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBvdXRwdXRTZXQ7CiAgICAgZm9yIChhdXRvIG91dENvbmZpZyA6IG91dHB1dHMtPm1PdXRwdXRzKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0Q29uZmlnLm1XaW5kb3c7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0Q29uZmlnLm1XaW5kb3c7CiAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ0luc2VydFc7CiAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZ0luc2VydCA9IG91dENvbmZpZ0luc2VydFcubU91dHB1dENvbmZpZ3VyYXRpb247CiAgICAgICAgIG91dENvbmZpZ0luc2VydC5yb3RhdGlvbiA9IHV0aWxzOjpjb252ZXJ0VG9IaWRsKG91dENvbmZpZy5tUm90YXRpb24pOwpAQCAtNjk3LDcgKzcwMiw4IEBACiAgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHBhcmFtc19tZXRhZGF0YSwgJmhpZGxQYXJhbXMpOwogICAgICAgICBwYXJhbXMudW5sb2NrKHBhcmFtc19tZXRhZGF0YSk7CiAgICAgfQotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUsIGhpZGxQYXJhbXMpOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZV8yXzEoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbFBhcmFtcywgc3RhcnRUaW1lTnMpOwogICAgIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCByZW1vdGVSZXQsICJlbmRDb25maWd1cmUoKSIpCiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CkBAIC04NDYsOCArODUyLDcgQEAKICAgICAgICAgICAgIGZvciAoYXV0byBzdHJlYW1BbmRXaW5kb3dJZCA6IHJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHdpbmRvd0lkID0gc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQ7CiAgICAgICAgICAgICAgICAgaWYgKHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLG91dEhhbmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4od2luZG93SGFuZGxlc1t3aW5kb3dJZF0uZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IHdpbmRvd0hhbmRsZXNbd2luZG93SWRdLmdldE5hdGl2ZUhhbmRsZSgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2FtZXJhICVzIExvc3Qgb3V0cHV0IGJ1ZmZlciBmb3IgQU5XICVwIGZyYW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKIApAQCAtMTI0NCw3ICsxMjQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFudzsKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtBbndLZXksICh2b2lkKiopICZhbncpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIG5hdGl2ZV9oYW5kbGVfdCEiLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDdmYzY5OWUuLjBiNmM3YzggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMS9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KQEAgLTQ0LDcgKzQ0LDggQEAKIG5hbWVzcGFjZSBhY2FtIHsKIAogdXNpbmcgSUNhbWVyYURldmljZUNhbGxiYWNrID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7Ci11c2luZyBJQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBJQ2FtZXJhRGV2aWNlVXNlcl8yXzAgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzE6OklDYW1lcmFEZXZpY2VVc2VyOwogdXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKIHVzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CiB1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwpAQCAtMjAxLDcgKzIwMiw3IEBACiAgICAgdm9pZCBub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCi0gICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLCBuc2Vjc190IHN0YXJ0VGltZU5zKTsKIAogICAgIC8vIElucHV0IG1lc3NhZ2Ugd2lsbCBiZSBwb3N0ZWQgYW5kIGNsZWFyZWQgYWZ0ZXIgdGhpcyByZXR1cm5zCiAgICAgdm9pZCBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCmluZGV4IDVhYTljNDYuLjc3YzkzNGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTc2NCwxNSArNzY0LDE1IEBACiAgICAgfQogCiAgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBjYWxsYmFja3MgPSBkZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOwotICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGU7CisgICAgc3A8SUNhbWVyYURldmljZVVzZXJfMl8wPiBkZXZpY2VSZW1vdGVfMl8wOwogCiAgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCiAgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKICAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKLSAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFJZCwgWyZzdGF0dXMsICZkZXZpY2VSZW1vdGVfMl8wXShhdXRvIHMsIGF1dG8gJmRldmljZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVJlbW90ZV8yXzAgPSBkZXZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKIAogICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKQEAgLTc4MCwxMSArNzgwLDE4IEBACiAgICAgICAgIGRlbGV0ZSBkZXZpY2U7CiAgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CiAgICAgfQotICAgIGlmIChkZXZpY2VSZW1vdGUgPT0gbnVsbHB0cikgeworICAgIGlmIChkZXZpY2VSZW1vdGVfMl8wID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkISByZW1vdGUgZGV2aWNlIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICBkZWxldGUgZGV2aWNlOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOwogICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBJQ2FtZXJhRGV2aWNlVXNlcjo6Y2FzdEZyb20oZGV2aWNlUmVtb3RlXzJfMCk7CisgICAgaWYgKCFjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjYXN0IHJlbW90ZSBkZXZpY2UgdG8gdmVyc2lvbiAyLjEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlID0gY2FzdFJlc3VsdDsKICAgICBkZXZpY2UtPnNldFJlbW90ZURldmljZShkZXZpY2VSZW1vdGUpOwogICAgIGRldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKICAgICAqb3V0RGV2aWNlID0gZGV2aWNlOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKaW5kZXggODVkYTNlOS4uODM1OWJiMSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMS9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4yL0lDYW1lcmFTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBhY2FtIHsKIAotdXNpbmcgSUNhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8xOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMjo6SUNhbWVyYVNlcnZpY2U7CiB1c2luZyBDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7CiB1c2luZyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKIHVzaW5nIFBoeXNpY2FsQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8xOjpQaHlzaWNhbENhbWVyYVN0YXR1c0FuZElkOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaAppbmRleCBlZDY3NjE1Li41NzE1ZDc3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgInV0aWxzLmgiCiAKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKLSAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKKyAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaAppbmRleCBmMzg5ZjAzLi42ZjU4MjBlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTQyLDcgKzQyLDcgQEAKIC8vIFV0aWxpdHkgY2xhc3Mgc28gdGhhdCBDYXB0dXJlUmVxdWVzdCBjYW4gYmUgc3RvcmVkIGJ5IHNwPD4KIHN0cnVjdCBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBtQ2FwdHVyZVJlcXVlc3Q7Ci0gIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CiAgIC8vUGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlLCBzaW5jZSB0aGUgY2FwdHVyZSByZXF1ZXN0CiAgIC8vbWlnaHQgbm90IGNvbnRhaW4gaXQuIFRoYXQncyBzaW5jZSwgZm1xIG1pZ2h0IGhhdmUgY29uc3VtZWQgaXQuCiAgIGhpZGxfdmVjPFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzOwpAQCAtNjIsMTMgKzYyLDEzIEBACiAvLyBVdGlsaXR5IGNsYXNzIHNvIHRoZSBuYXRpdmVfaGFuZGxlX3QgY2FuIGJlIGNvbXBhcmVkIHdpdGggIGl0cyBjb250ZW50cyBpbnN0ZWFkCiAvLyBvZiBqdXN0IHJhdyBwb2ludGVyIGNvbXBhcmlzb25zLgogc3RydWN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgewotICAgIG5hdGl2ZV9oYW5kbGVfdCAqbVdpbmRvdyA9IG51bGxwdHI7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptV2luZG93ID0gbnVsbHB0cjsKIAotICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIobmF0aXZlX2hhbmRsZV90ICpuaCkgOiBtV2luZG93KG5oKSB7IH0KKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgpIDogbVdpbmRvdyhuaCkgeyB9CiAKICAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKCkgPSBkZWZhdWx0OwogCi0gICAgb3BlcmF0b3IgbmF0aXZlX2hhbmRsZV90ICooKSBjb25zdCB7IHJldHVybiBtV2luZG93OyB9CisgICAgb3BlcmF0b3IgY29uc3QgbmF0aXZlX2hhbmRsZV90ICooKSBjb25zdCB7IHJldHVybiBtV2luZG93OyB9CiAKICAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKaW5kZXggOTM4YjVmNS4uYmExNGM1YyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg7CiAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU7Ci11c2luZyBDb25maWd1cmVkV2luZG93cyA9IHN0ZDo6c2V0PG5hdGl2ZV9oYW5kbGVfdCAqPjsKK3VzaW5nIENvbmZpZ3VyZWRXaW5kb3dzID0gc3RkOjpzZXQ8Y29uc3QgbmF0aXZlX2hhbmRsZV90ICo+OwogCiBjbGFzcyBDYW1lcmFIZWxwZXIgewogICAgcHVibGljOgpAQCAtNjAsMTEgKzYwLDExIEBACiAKICAgICBzdHJ1Y3QgUGh5c2ljYWxJbWdSZWFkZXJJbmZvIHsKICAgICAgICAgY29uc3QgY2hhciogcGh5c2ljYWxDYW1lcmFJZDsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbnc7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYW53OwogICAgIH07CiAKICAgICAvLyBSZXRhaW5pbmcgdGhlIGVycm9yIGNvZGUgaW4gY2FzZSB0aGUgY2FsbGVyIG5lZWRzIHRvIGFuYWx5emUgaXQuCi0gICAgc3RkOjp2YXJpYW50PGludCwgQ29uZmlndXJlZFdpbmRvd3M+IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgc3RkOjp2YXJpYW50PGludCwgQ29uZmlndXJlZFdpbmRvd3M+IGluaXRDYW1lcmEoY29uc3QgbmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMsCiAgICAgICAgICAgICBib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKICAgICAgICAgQ29uZmlndXJlZFdpbmRvd3MgY29uZmlndXJlZFdpbmRvd3M7CkBAIC0yNTcsNyArMjU3LDcgQEAKICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzIG1EZXZpY2VDYnt0aGlzLCBudWxscHRyLCBudWxscHRyfTsKICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVNlc3Npb25DYnsgdGhpcywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn07CiAKLSAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogbUltZ1JlYWRlckFudyA9IG51bGxwdHI7ICAvLyBub3Qgb3duZWQgYnkgdXMuCiAKICAgICAvLyBDYW1lcmEgZGV2aWNlCiAgICAgQUNhbWVyYURldmljZSogbURldmljZSA9IG51bGxwdHI7CkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgbmF0aXZlX2hhbmRsZV90KiBnZXROYXRpdmVXaW5kb3coKSB7IHJldHVybiBtSW1nUmVhZGVyQW53OyB9CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBnZXROYXRpdmVXaW5kb3coKSB7IHJldHVybiBtSW1nUmVhZGVyQW53OyB9CiAKICAgICBpbnQgZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawppbmRleCBlNWMxNjMxLi43ZjgwNzhlIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5taworKysgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtNDIsNiArNDIsOSBAQAogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvcgogCiBMT0NBTF9NT0RVTEU6PSBjYW1lcmFfY2xpZW50X3Rlc3QKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS8uLi9OT1RJQ0UKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDhjY2RlZDIuLjlmMmY0MzAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMzYzLDcgKzM2Myw4IEBACiAKICAgICAgICAgLy8gQ2hlY2sgbWV0YWRhdGEgYmluZGVyIGNhbGwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7Ci0gICAgICAgIHJlcyA9IHNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJm1ldGFkYXRhKTsKKyAgICAgICAgcmVzID0gc2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgJm1ldGFkYXRhKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBFWFBFQ1RfRkFMU0UobWV0YWRhdGEuaXNFbXB0eSgpKTsKIApAQCAtMzc4LDggKzM3OSw4IEBACiAgICAgICAgIHNwPFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyhuZXcgVGVzdENhbWVyYURldmljZUNhbGxiYWNrcygpKTsKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2U7CiAgICAgICAgIHJlcyA9IHNlcnZpY2UtPmNvbm5lY3REZXZpY2UoY2FsbGJhY2tzLCBjYW1lcmFJZCwgU3RyaW5nMTYoIm1lZWVlZWVlZWUhIiksCi0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKLSAgICAgICAgICAgICAgICAvKm91dCovJmRldmljZSk7CisgICAgICAgICAgICAgICAge30sIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm9vbVNjb3JlT2Zmc2V0Ki8gMCwKKyAgICAgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qL19fQU5EUk9JRF9BUElfRlVUVVJFX18sIC8qb3V0Ki8mZGV2aWNlKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGV2aWNlLmdldCgpKTsKICAgICAgICAgZGV2aWNlLT5kaXNjb25uZWN0KCk7CkBAIC00MjEsOCArNDIyLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJvcGVuTmV3RGV2aWNlIik7CiAgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBzZXJ2aWNlLT5jb25uZWN0RGV2aWNlKGNhbGxiYWNrcywgZGV2aWNlSWQsIFN0cmluZzE2KCJtZWVlZWVlZWVlISIpLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAotICAgICAgICAgICAgICAgICAgICAvKm91dCovJmRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIHt9LCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvb21TY29yZU9mZnNldCovIDAsCisgICAgICAgICAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgLypvdXQqLyZkZXZpY2UpOwogICAgICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICB9CiAgICAgICAgIGF1dG8gcCA9IHN0ZDo6bWFrZV9wYWlyKGNhbGxiYWNrcywgZGV2aWNlKTsKQEAgLTUxNyw3ICs1MTgsNyBAQAogICAgICAgICBDYW1lcmFNZXRhZGF0YSBzZXNzaW9uUGFyYW1zOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9mZmxpbmVTdHJlYW1JZHM7CiAgICAgICAgIHJlcyA9IGRldmljZS0+ZW5kQ29uZmlndXJlKC8qaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCovIGZhbHNlLCBzZXNzaW9uUGFyYW1zLAotICAgICAgICAgICAgICAgICZvZmZsaW5lU3RyZWFtSWRzKTsKKyAgICAgICAgICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkpLCAmb2ZmbGluZVN0cmVhbUlkcyk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKQEAgLTYyOSw3ICs2MzAsNyBAQAogICAgICAgICByZXMgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgcmVzID0gZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gZmFsc2UsIHNlc3Npb25QYXJhbXMsCi0gICAgICAgICAgICAgICAgJm9mZmxpbmVTdHJlYW1JZHMpOworICAgICAgICAgICAgICAgIG5zMm1zKHN5c3RlbVRpbWUoKSksICZvZmZsaW5lU3RyZWFtSWRzKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogCiAgICAgICAgIHNsZWVwKC8qc2Vjb25kKi8xKTsgLy8gYWxsb3cgc29tZSB0aW1lIGZvciBlcnJvcnMgdG8gc2hvdyB1cCwgaWYgYW55CmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKaW5kZXggMTM1ZDJhMy4uNzZkYzM4YyAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApAQCAtNzMsNyArNzMsOCBAQAogCiAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOwogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247Ci0gICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgcmMgPSBtQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgJm1ldGFkYXRhKTsKICAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKICAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CiAgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhWlNMVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYVpTTFRlc3RzLmNwcAppbmRleCAwMmM2ZTJhLi5lZmQ5ZGFlIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhWlNMVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFaU0xUZXN0cy5jcHAKQEAgLTE4MSw3ICsxODEsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7Ci0gICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgcmMgPSBtQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgJm1ldGFkYXRhKTsKICAgICAgICAgaWYgKCFyYy5pc09rKCkpIHsKICAgICAgICAgICAgIC8vIFRoZSB0ZXN0IGlzIHJlbGV2YW50IG9ubHkgZm9yIGNhbWVyYXMgd2l0aCBIYWwgMy54CiAgICAgICAgICAgICAvLyBzdXBwb3J0LgpAQCAtMjA3LDcgKzIwOCw4IEBACiAKICAgICAgICAgcmMgPSBtQ2FtZXJhU2VydmljZS0+Y29ubmVjdCh0aGlzLCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICBTdHJpbmcxNigiWlNMVGVzdCIpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1BJRCwgJmNhbWVyYURldmljZSk7CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19QSUQsCisgICAgICAgICAgICAgICAgLyp0YXJnZXRTZGtWZXJzaW9uKi9fX0FORFJPSURfQVBJX0ZVVFVSRV9fLCAmY2FtZXJhRGV2aWNlKTsKICAgICAgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKIAogICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhjYW1lcmFEZXZpY2UtPmdldFBhcmFtZXRlcnMoKSk7CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icAppbmRleCBkN2Q5MDVmLi4zNTlhODM1IDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJzY3JlZW5yZWNvcmQiLAogCmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcAppbmRleCBmNGZiNjI2Li5lNmUzNDczIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKQEAgLTU3LDcgKzU3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgotI2luY2x1ZGUgPHVpL0Rpc3BsYXlDb25maWcuaD4KKyNpbmNsdWRlIDx1aS9EaXNwbGF5TW9kZS5oPgogI2luY2x1ZGUgPHVpL0Rpc3BsYXlTdGF0ZS5oPgogCiAjaW5jbHVkZSAic2NyZWVucmVjb3JkLmgiCkBAIC02OCw3ICs2OCw3IEBACiB1c2luZyBhbmRyb2lkOjpBTG9vcGVyOwogdXNpbmcgYW5kcm9pZDo6QU1lc3NhZ2U7CiB1c2luZyBhbmRyb2lkOjpBU3RyaW5nOwotdXNpbmcgYW5kcm9pZDo6RGlzcGxheUNvbmZpZzsKK3VzaW5nIGFuZHJvaWQ6OnVpOjpEaXNwbGF5TW9kZTsKIHVzaW5nIGFuZHJvaWQ6OkZyYW1lT3V0cHV0OwogdXNpbmcgYW5kcm9pZDo6SUJpbmRlcjsKIHVzaW5nIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CkBAIC0yNzMsMTQgKzI3MywxMSBAQAogICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OlRyYW5zYWN0aW9uJiB0LAogICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgZHB5LAogICAgICAgICBjb25zdCB1aTo6RGlzcGxheVN0YXRlJiBkaXNwbGF5U3RhdGUpIHsKLSAgICBjb25zdCB1aTo6U2l6ZSYgdmlld3BvcnQgPSBkaXNwbGF5U3RhdGUudmlld3BvcnQ7Ci0KLSAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyCi0gICAgLy8gY2FzZSBpcyAiYWxsIG9mIGl0Ii4KLSAgICBSZWN0IGxheWVyU3RhY2tSZWN0KHZpZXdwb3J0KTsKKyAgICAvLyBTZXQgdGhlIHJlZ2lvbiBvZiB0aGUgbGF5ZXIgc3RhY2sgd2UncmUgaW50ZXJlc3RlZCBpbiwgd2hpY2ggaW4gb3VyIGNhc2UgaXMgImFsbCBvZiBpdCIuCisgICAgUmVjdCBsYXllclN0YWNrUmVjdChkaXNwbGF5U3RhdGUubGF5ZXJTdGFja1NwYWNlUmVjdCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGRpc3BsYXkuCi0gICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IHZpZXdwb3J0LmdldEhlaWdodCgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZpZXdwb3J0LmdldFdpZHRoKCkpOworICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSBsYXllclN0YWNrUmVjdC5nZXRIZWlnaHQoKSAvIHN0YXRpY19jYXN0PGZsb2F0PihsYXllclN0YWNrUmVjdC5nZXRXaWR0aCgpKTsKIAogCiAgICAgLy8gU2V0IHRoZSB3YXkgd2UgbWFwIHRoZSBvdXRwdXQgb250byB0aGUgZGlzcGxheSBzdXJmYWNlICh3aGljaCB3aWxsCkBAIC02OTIsMjcgKzY4OSwyOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIERpc3BsYXlDb25maWcgZGlzcGxheUNvbmZpZzsKLSAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEFjdGl2ZURpc3BsYXlDb25maWcoZGlzcGxheSwgJmRpc3BsYXlDb25maWcpOworICAgIERpc3BsYXlNb2RlIGRpc3BsYXlNb2RlOworICAgIGVyciA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QWN0aXZlRGlzcGxheU1vZGUoZGlzcGxheSwgJmRpc3BsYXlNb2RlKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBnZXQgZGlzcGxheSBjb25maWdcbiIpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGNvbnN0IHVpOjpTaXplJiB2aWV3cG9ydCA9IGRpc3BsYXlTdGF0ZS52aWV3cG9ydDsKKyAgICBjb25zdCB1aTo6U2l6ZSYgbGF5ZXJTdGFja1NwYWNlUmVjdCA9IGRpc3BsYXlTdGF0ZS5sYXllclN0YWNrU3BhY2VSZWN0OwogICAgIGlmIChnVmVyYm9zZSkgewogICAgICAgICBwcmludGYoIkRpc3BsYXkgaXMgJWR4JWQgQCUuMmZmcHMgKG9yaWVudGF0aW9uPSVzKSwgbGF5ZXJTdGFjaz0ldVxuIiwKLSAgICAgICAgICAgICAgICB2aWV3cG9ydC5nZXRXaWR0aCgpLCB2aWV3cG9ydC5nZXRIZWlnaHQoKSwgZGlzcGxheUNvbmZpZy5yZWZyZXNoUmF0ZSwKLSAgICAgICAgICAgICAgICB0b0NTdHJpbmcoZGlzcGxheVN0YXRlLm9yaWVudGF0aW9uKSwgZGlzcGxheVN0YXRlLmxheWVyU3RhY2spOworICAgICAgICAgICAgICAgIGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0V2lkdGgoKSwgbGF5ZXJTdGFja1NwYWNlUmVjdC5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZS5yZWZyZXNoUmF0ZSwgdG9DU3RyaW5nKGRpc3BsYXlTdGF0ZS5vcmllbnRhdGlvbiksCisgICAgICAgICAgICAgICAgZGlzcGxheVN0YXRlLmxheWVyU3RhY2spOwogICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICB9CiAKICAgICAvLyBFbmNvZGVyIGNhbid0IHRha2Ugb2RkIG51bWJlciBhcyBjb25maWcKICAgICBpZiAoZ1ZpZGVvV2lkdGggPT0gMCkgewotICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKHZpZXdwb3J0LmdldFdpZHRoKCkpOworICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0V2lkdGgoKSk7CiAgICAgfQogICAgIGlmIChnVmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbih2aWV3cG9ydC5nZXRIZWlnaHQoKSk7CisgICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKGxheWVyU3RhY2tTcGFjZVJlY3QuZ2V0SGVpZ2h0KCkpOwogICAgIH0KIAogICAgIC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIGVuY29kZXIuCkBAIC03MjAsNyArNzE4LDcgQEAKICAgICBzcDxGcmFtZU91dHB1dD4gZnJhbWVPdXRwdXQ7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZW5jb2RlcklucHV0U3VyZmFjZTsKICAgICBpZiAoZ091dHB1dEZvcm1hdCAhPSBGT1JNQVRfRlJBTUVTICYmIGdPdXRwdXRGb3JtYXQgIT0gRk9STUFUX1JBV19GUkFNRVMpIHsKLSAgICAgICAgZXJyID0gcHJlcGFyZUVuY29kZXIoZGlzcGxheUNvbmZpZy5yZWZyZXNoUmF0ZSwgJmVuY29kZXIsICZlbmNvZGVySW5wdXRTdXJmYWNlKTsKKyAgICAgICAgZXJyID0gcHJlcGFyZUVuY29kZXIoZGlzcGxheU1vZGUucmVmcmVzaFJhdGUsICZlbmNvZGVyLCAmZW5jb2RlcklucHV0U3VyZmFjZSk7CiAKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUiAmJiAhZ1NpemVTcGVjaWZpZWQpIHsKICAgICAgICAgICAgIC8vIGZhbGxiYWNrIGlzIGRlZmluZWQgZm9yIGxhbmRzY2FwZTsgc3dhcCBpZiB3ZSdyZSBpbiBwb3J0cmFpdApAQCAtNzMzLDcgKzczMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCwgZ1ZpZGVvSGVpZ2h0LCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgICAgICAgICAgICBnVmlkZW9XaWR0aCA9IG5ld1dpZHRoOwogICAgICAgICAgICAgICAgIGdWaWRlb0hlaWdodCA9IG5ld0hlaWdodDsKLSAgICAgICAgICAgICAgICBlcnIgPSBwcmVwYXJlRW5jb2RlcihkaXNwbGF5Q29uZmlnLnJlZnJlc2hSYXRlLCAmZW5jb2RlciwgJmVuY29kZXJJbnB1dFN1cmZhY2UpOworICAgICAgICAgICAgICAgIGVyciA9IHByZXBhcmVFbmNvZGVyKGRpc3BsYXlNb2RlLnJlZnJlc2hSYXRlLCAmZW5jb2RlciwgJmVuY29kZXJJbnB1dFN1cmZhY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7CkBAIC0xMTcwLDE0ICsxMTY4LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICBnUGh5c2ljYWxEaXNwbGF5SWQgPSBhdG9sbChvcHRhcmcpOwotICAgICAgICAgICAgaWYgKGdQaHlzaWNhbERpc3BsYXlJZCA9PSAwKSB7CisgICAgICAgICAgICBnUGh5c2ljYWxEaXNwbGF5SWQgPSBQaHlzaWNhbERpc3BsYXlJZChhdG9sbChvcHRhcmcpKTsKKyAgICAgICAgICAgIGlmIChnUGh5c2ljYWxEaXNwbGF5SWQudmFsdWUgPT0gMCkgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBwaHlzaWNhbCBkaXNwbGF5IGlkXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjoKICAgICAgICAgICAgICAgICAgICAgZ2V0UGh5c2ljYWxEaXNwbGF5VG9rZW4oZ1BoeXNpY2FsRGlzcGxheUlkKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBoeXNpY2FsIGRpc3BsYXkgaWQ6ICUiCi0gICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BIWVNJQ0FMX0RJU1BMQVlfSURfRk9STUFUICJcbiIsIGdQaHlzaWNhbERpc3BsYXlJZCk7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBoeXNpY2FsIGRpc3BsYXkgaWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKGdQaHlzaWNhbERpc3BsYXlJZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA2NDcwZmIxLi44MDNjNGE0IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xNiw2ICsxNiw5IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlianBlZyBsaWJ1aSBsaWJndWkgbGliY3V0aWxzIGxpYmxvZyBcCiAgICAgICAgIGxpYmhpZGxiYXNlIGxpYmRhdGFzb3VyY2UgbGliYXVkaW9jbGllbnQgXAogICAgICAgICBhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAgXAorICAgICAgICBmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtMjgsNiArMzEsOSBAQAogCiBMT0NBTF9TWVNURU1fRVhUX01PRFVMRTo9IHRydWUKIExPQ0FMX01PRFVMRTo9IHN0YWdlZnJpZ2h0CitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCkBAIC00NSw3ICs1MSw4IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50CisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGliZGF0YXNvdXJjZSBsaWJhdWRpb2NsaWVudCBcCisgICAgICAgIGZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvY2FtZXJhL2luY2x1ZGUgXApAQCAtNTgsNiArNjUsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gcmVjb3JkCitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvTk9USUNFCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCkBAIC03OSwxMyArODksMTcgQEAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAotICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCisgICAgICAgIGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUgXAorICAgICAgICBmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcAogCiBMT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvciAtV2FsbAogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBMT0NBTF9NT0RVTEU6PSByZWNvcmR2aWRlbworTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtMTA0LDcgKzExOCw4IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJhdWRpb2NsaWVudAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50IFwKKyAgICAgICAgZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xMTUsNiArMTMwLDkgQEAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKIExPQ0FMX01PRFVMRTo9IGF1ZGlvbG9vcAorTE9DQUxfTElDRU5TRV9LSU5EUzo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKK0xPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUzo9IG5vdGljZQorTE9DQUxfTk9USUNFX0ZJTEU6PSAkKExPQ0FMX1BBVEgpL05PVElDRQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtMTQxLDYgKzE1OSw5IEBACiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCiBMT0NBTF9NT0RVTEU6PSBzdHJlYW0KK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKQEAgLTE2OSw2ICsxOTAsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gY29kZWMKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCiAKQEAgLTIxNCw2ICsyMzgsOSBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKIAogTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCiAKQEAgLTI0Miw1ICsyNjksOCBAQAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAogTE9DQUxfTU9EVUxFOj0gbXV4ZXIKK0xPQ0FMX0xJQ0VOU0VfS0lORFM6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCitMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlM6PSBub3RpY2UKK0xPQ0FMX05PVElDRV9GSUxFOj0gJChMT0NBTF9QQVRIKS9OT1RJQ0UKIAogaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGViNzY5NTMuLjU1NDI3Y2EgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCkBAIC0xMzQsMTUgKzEzNCwxOCBAQAogICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAotICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGNoYW5uZWxNYXNrOworICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CiAgICAgc3VjY2VzcyA9IGZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZudW1DaGFubmVscyk7CiAgICAgQ0hFQ0soc3VjY2Vzcyk7CiAKLSAgICBpZighZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgaWYgKGludDMyX3QgcmF3Q2hhbm5lbE1hc2s7ICFmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZyYXdDaGFubmVsTWFzaykpIHsKICAgICAgICAgLy8gbG9nIG9ubHkgd2hlbiB0aGVyZSdzIGEgcmlzayBvZiBhbWJpZ3VpdHkgb2YgY2hhbm5lbCBtYXNrIHNlbGVjdGlvbgogICAgICAgICBBTE9HSV9JRihudW1DaGFubmVscyA+IDIsCiAgICAgICAgICAgICAgICAgInNvdXJjZSBmb3JtYXQgZGlkbid0IHNwZWNpZnkgY2hhbm5lbCBtYXNrLCB1c2luZyAoJWQpIGNoYW5uZWwgb3JkZXIiLCBudW1DaGFubmVscyk7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKTsKICAgICB9CiAKICAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCmluZGV4IGY0YjgxNjQuLmUwMDA2MzMgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKQEAgLTI3Miw3ICsyNzIsNyBAQAogc3RhdHVzX3QgU2ltcGxlUGxheWVyOjpvblByZXBhcmUoKSB7CiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTlBSRVBBUkVEKTsKIAotICAgIG1FeHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKKyAgICBtRXh0cmFjdG9yID0gbmV3IE51TWVkaWFFeHRyYWN0b3IoTnVNZWRpYUV4dHJhY3Rvcjo6RW50cnlQb2ludDo6T1RIRVIpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZSgKICAgICAgICAgICAgIE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIG1QYXRoLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCmluZGV4IDg0YTZkNmIuLjRiNDFmZjggMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM4LDYgKzM5LDggQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIHN0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIqIG5hbWUpCiB7CiAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1kIGR1LnJhdGlvbl0gWy1tXSBbLXddIFstTiBuYW1lXSBbPG91dHB1dC1maWxlPl1cbiIsIG5hbWUpOwpAQCAtMTEwLDkgKzExMywxMCBAQAogICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CiAgICAgICAgIGF0dHIuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKIAorICAgICAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKICAgICAgICAgc291cmNlID0gbmV3IEF1ZGlvU291cmNlKAogICAgICAgICAgICAgICAgICZhdHRyLAotICAgICAgICAgICAgICAgIFN0cmluZzE2KCksCisgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCmluZGV4IGMyNmUwYjkuLmJlZWFiNTQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KLSNpbmNsdWRlIDx1aS9EaXNwbGF5Q29uZmlnLmg+CisjaW5jbHVkZSA8dWkvRGlzcGxheU1vZGUuaD4KIAogc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWFdIHVzZSBhdWRpb1xuIgpAQCAtNzksNyArNzksNyBAQAogCiAgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKIAotICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOworICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yKE51TWVkaWFFeHRyYWN0b3I6OkVudHJ5UG9pbnQ6Ok9USEVSKTsKICAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTQxNCwxMCArNDE0LDEwIEBACiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CiAgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CiAKLSAgICAgICAgRGlzcGxheUNvbmZpZyBjb25maWc7Ci0gICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QWN0aXZlRGlzcGxheUNvbmZpZyhkaXNwbGF5LCAmY29uZmlnKSwgTk9fRVJST1IpOworICAgICAgICB1aTo6RGlzcGxheU1vZGUgbW9kZTsKKyAgICAgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRBY3RpdmVEaXNwbGF5TW9kZShkaXNwbGF5LCAmbW9kZSksIE5PX0VSUk9SKTsKIAotICAgICAgICBjb25zdCB1aTo6U2l6ZSYgcmVzb2x1dGlvbiA9IGNvbmZpZy5yZXNvbHV0aW9uOworICAgICAgICBjb25zdCB1aTo6U2l6ZSYgcmVzb2x1dGlvbiA9IG1vZGUucmVzb2x1dGlvbjsKICAgICAgICAgY29uc3Qgc3NpemVfdCBkaXNwbGF5V2lkdGggPSByZXNvbHV0aW9uLmdldFdpZHRoKCk7CiAgICAgICAgIGNvbnN0IHNzaXplX3QgZGlzcGxheUhlaWdodCA9IHJlc29sdXRpb24uZ2V0SGVpZ2h0KCk7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggYjg5NDU0NS4uNjdjNjhlNiAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVuZGVyU2NyaXB0V3JhcHBlci5oPgogI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgotI2luY2x1ZGUgPHVpL0Rpc3BsYXlDb25maWcuaD4KKyNpbmNsdWRlIDx1aS9EaXNwbGF5TW9kZS5oPgogCiAjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCiAjaW5jbHVkZSAiU2NyaXB0Q19hcmdidG9yZ2JhLmgiCkBAIC0zMTksNyArMzE5LDggQEAKIAogICAgIHN0YXRpYyBpbnQ2NF90IGtUaW1lb3V0ID0gNTAwbGw7CiAKLSAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcjsKKyAgICBzcDxOdU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBuZXcgTnVNZWRpYUV4dHJhY3RvcihOdU1lZGlhRXh0cmFjdG9yOjpFbnRyeVBvaW50OjpPVEhFUik7CisKICAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci5cbiIpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTc1MSwxMCArNzUyLDEwIEBACiAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CiAgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CiAKLSAgICAgICAgRGlzcGxheUNvbmZpZyBjb25maWc7Ci0gICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QWN0aXZlRGlzcGxheUNvbmZpZyhkaXNwbGF5LCAmY29uZmlnKSwgTk9fRVJST1IpOworICAgICAgICB1aTo6RGlzcGxheU1vZGUgbW9kZTsKKyAgICAgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRBY3RpdmVEaXNwbGF5TW9kZShkaXNwbGF5LCAmbW9kZSksIE5PX0VSUk9SKTsKIAotICAgICAgICBjb25zdCB1aTo6U2l6ZSYgcmVzb2x1dGlvbiA9IGNvbmZpZy5yZXNvbHV0aW9uOworICAgICAgICBjb25zdCB1aTo6U2l6ZSYgcmVzb2x1dGlvbiA9IG1vZGUucmVzb2x1dGlvbjsKICAgICAgICAgY29uc3Qgc3NpemVfdCBkaXNwbGF5V2lkdGggPSByZXNvbHV0aW9uLmdldFdpZHRoKCk7CiAgICAgICAgIGNvbnN0IHNzaXplX3QgZGlzcGxheUhlaWdodCA9IHJlc29sdXRpb24uZ2V0SGVpZ2h0KCk7CiAKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbXV4ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tdXhlci5jcHAKaW5kZXggNGE4M2E0YS4uYmM3ZTQxZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tdXhlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tdXhlci5jcHAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgaW50IHRyaW1FbmRUaW1lTXMsCiAgICAgICAgIGludCByb3RhdGlvbkRlZ3JlZXMsCiAgICAgICAgIE1lZGlhTXV4ZXI6Ok91dHB1dEZvcm1hdCBjb250YWluZXIgPSBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCkgewotICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOworICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yKE51TWVkaWFFeHRyYWN0b3I6OkVudHJ5UG9pbnQ6Ok9USEVSKTsKICAgICBpZiAoZXh0cmFjdG9yLT5zZXREYXRhU291cmNlKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIHBhdGgpICE9IE9LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGluc3RhbnRpYXRlIGV4dHJhY3Rvci4gJXNcbiIsIHBhdGgpOwogICAgICAgICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAppbmRleCAzNzA5MWM0Li4wOThjMjc4IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCkBAIC0yNTksMzEgKzI1OSw2IEBACiAgICAgcHJpbnRmKCIkXG4iKTsKICNlbmRpZgogCi0jaWYgMAotICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gQ2FtZXJhU291cmNlOjpDcmVhdGUoCi0gICAgICAgICAgICBTdHJpbmcxNihhcmd2WzBdLCBzdHJsZW4oYXJndlswXSkpKTsKLSAgICBzb3VyY2UtPnN0YXJ0KCk7Ci0KLSAgICBwcmludGYoInNvdXJjZSA9ICVwXG4iLCBzb3VyY2UpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlcik7Ci0gICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKLQotICAgICAgICBwcmludGYoImdvdCBhIGZyYW1lLCBkYXRhPSVwLCBzaXplPSVkXG4iLAotICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotCi0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBidWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGVyciA9IHNvdXJjZS0+c3RvcCgpOwotCi0gICAgZGVsZXRlIHNvdXJjZTsKLSAgICBzb3VyY2UgPSBOVUxMOwotI2VuZGlmCi0KICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmVjb3JkIGZhaWxlZDogJWRcbiIsIGVycik7CiAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCmluZGV4IDI1MGQyNmIuLjQwYjIzOTIgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKQEAgLTQyLDcgKzQyLDcgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1aS9EaXNwbGF5Q29uZmlnLmg+CisjaW5jbHVkZSA8dWkvRGlzcGxheU1vZGUuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTMyMSwxMCArMzIxLDEwIEBACiAgICAgY29uc3Qgc3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKICAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOwogCi0gICAgRGlzcGxheUNvbmZpZyBjb25maWc7Ci0gICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRBY3RpdmVEaXNwbGF5Q29uZmlnKGRpc3BsYXksICZjb25maWcpLCBOT19FUlJPUik7CisgICAgdWk6OkRpc3BsYXlNb2RlIG1vZGU7CisgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRBY3RpdmVEaXNwbGF5TW9kZShkaXNwbGF5LCAmbW9kZSksIE5PX0VSUk9SKTsKIAotICAgIGNvbnN0IHVpOjpTaXplJiByZXNvbHV0aW9uID0gY29uZmlnLnJlc29sdXRpb247CisgICAgY29uc3QgdWk6OlNpemUmIHJlc29sdXRpb24gPSBtb2RlLnJlc29sdXRpb247CiAgICAgY29uc3Qgc3NpemVfdCBkaXNwbGF5V2lkdGggPSByZXNvbHV0aW9uLmdldFdpZHRoKCk7CiAgICAgY29uc3Qgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gcmVzb2x1dGlvbi5nZXRIZWlnaHQoKTsKIApkaWZmIC0tZ2l0IGEvZHJtL1RFU1RfTUFQUElORyBiL2RybS9URVNUX01BUFBJTkcKaW5kZXggMjU5NWUzZS4uMzY0Mjg5OCAxMDA2NDQKLS0tIGEvZHJtL1RFU1RfTUFQUElORworKysgYi9kcm0vVEVTVF9NQVBQSU5HCkBAIC0xLDUgKzEsNSBAQAogewotICAicHJlc3VibWl0IjogWworICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgIC8vIFRoZSBmb2xsb3dpbmcgdGVzdHMgdmFsaWRhdGUgY29kZWMgYW5kIGRybSBwYXRoLgogICAgIHsKICAgICAgICJuYW1lIjogIkd0c01lZGlhVGVzdENhc2VzIiwKQEAgLTksMTcgKzksOSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVIMjY0UGxheWJhY2tUZXN0cyIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9jb21tb24vQW5kcm9pZC5icAppbmRleCAyNzI2ODRjLi43NmVlMjJlIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw3ICsxNCwyNCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCi1jY19saWJyYXJ5X3N0YXRpYyB7CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9kcm1fY29tbW9uX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfZHJtX2NvbW1vbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZHJtZnJhbWV3b3JrY29tbW9uIiwKIAogICAgIHNyY3M6IFsKQEAgLTM1LDcgKzUyLDExIEBACiAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYmluZGVyIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiCisgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaCBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKaW5kZXggNzNmMTFhNC4uYzBhNWUzYiAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgICAgICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaCBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKaW5kZXggMTgzN2ExMS4uYTU0NTk0MSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCkBAIC0yNTAsNyArMjUwLDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgICAgICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwCmluZGV4IGI2OGU2YzIuLmRmM2E2YTIgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2RybV9kcm1zZXJ2ZXJfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9kcm1fZHJtc2VydmVyX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2JpbmFyeSB7CiAgICAgbmFtZTogImRybXNlcnZlciIsCiAKQEAgLTMxLDE5ICs0OCwxOCBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmtjb21tb24iLAogICAgICAgICAibGlic2VsaW51eCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliZHJtZnJhbWV3b3JrY29tbW9uIl0sCi0KICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKIAogICAgIGluaXRfcmM6IFsiZHJtc2VydmVyLnJjIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCA5YTMyY2M1Li43NGUzMjIzIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTk5LDEzICs5OSwxMyBAQAogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlOiAlemQiLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBBTE9HVygiVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZTogJXUiLCBtc2ctPndoYXQoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIGludDY0X3QgRHJtTWFuYWdlcjo6Z2V0TWV0cmljc0ZsdXNoUGVyaW9kVXMoKSB7Ci0gICAgcmV0dXJuIDEwMDAgKiAxMDAwICogc3RkOjptYXgoMWxsLCBwcm9wZXJ0eV9nZXRfaW50NjQoImRybW1hbmFnZXIubWV0cmljcy5wZXJpb2QiLCA4NjQwMCkpOworICAgIHJldHVybiAxMDAwICogMTAwMCAqIHN0ZDo6bWF4KDFsbCwgKGxvbmcgbG9uZylwcm9wZXJ0eV9nZXRfaW50NjQoImRybW1hbmFnZXIubWV0cmljcy5wZXJpb2QiLCA4NjQwMCkpOwogfQogCiB2b2lkIERybU1hbmFnZXI6OnJlY29yZEVuZ2luZU1ldHJpY3MoCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL2RybXNlcnZlci5yYyBiL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCmluZGV4IGRlNDZmYjkuLmViMTc2YzEgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCisrKyBiL2RybS9kcm1zZXJ2ZXIvZHJtc2VydmVyLnJjCkBAIC0xLDUgKzEsMTIgQEAKIHNlcnZpY2UgZHJtIC9zeXN0ZW0vYmluL2RybXNlcnZlcgorICAgIGRpc2FibGVkCiAgICAgY2xhc3MgbWFpbgogICAgIHVzZXIgZHJtCiAgICAgZ3JvdXAgZHJtIHN5c3RlbSBpbmV0IGRybXJwYyByZWFkcHJvYwogICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKKworb24gcHJvcGVydHk6ZHJtLnNlcnZpY2UuZW5hYmxlZD10cnVlCisgICAgc3RhcnQgZHJtCisKK29uIHByb3BlcnR5OmRybS5zZXJ2aWNlLmVuYWJsZWQ9MQorICAgIHN0YXJ0IGRybQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCmluZGV4IDk0MGMxN2QuLmRiY2U1ZWEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZHJtZnJhbWV3b3JrIiwKIApAQCAtMjksMTMgKzQ2LDExIEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29ya2NvbW1vbiIsCiAgICAgXSwKIAotICAgIHN0YXRpY19saWJzOiBbImxpYmRybWZyYW1ld29ya2NvbW1vbiJdLAotCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0gICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWyJsaWJkcm1mcmFtZXdvcmtjb21tb24iXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYmRybWZyYW1ld29ya2NvbW1vbiJdLAogCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCBiMGE0NDFiLi42Y2IwYTk5IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtNTIsMjUgKzUyLDExIEBACiBjb25zdCBzcDxJRHJtTWFuYWdlclNlcnZpY2U+JiBEcm1NYW5hZ2VyQ2xpZW50SW1wbDo6Z2V0RHJtTWFuYWdlclNlcnZpY2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc011dGV4KTsKICAgICBpZiAoTlVMTCA9PSBzRHJtTWFuYWdlclNlcnZpY2UuZ2V0KCkpIHsKLSAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJkcm0uc2VydmljZS5lbmFibGVkIiwgdmFsdWUsIE5VTEwpID09IDApIHsKLSAgICAgICAgICAgIC8vIERybSBpcyB1bmRlZmluZWQgZm9yIHRoaXMgZGV2aWNlCisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSk7CisgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIHNEcm1NYW5hZ2VyU2VydmljZTsKICAgICAgICAgfQotCi0gICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigiZHJtLmRybU1hbmFnZXIiKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dXKCJEcm1NYW5hZ2VyU2VydmljZSBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7Ci0gICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgcmVxdDsKLSAgICAgICAgICAgIHJlcXQudHZfc2VjICA9IDA7Ci0gICAgICAgICAgICByZXF0LnR2X25zZWMgPSA1MDAwMDAwMDA7IC8vMC41IHNlYwotICAgICAgICAgICAgbmFub3NsZWVwKCZyZXF0LCBOVUxMKTsKLSAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CiAgICAgICAgIGlmIChOVUxMID09IHNEZWF0aE5vdGlmaWVyLmdldCgpKSB7CiAgICAgICAgICAgICBzRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKaW5kZXggMzg1ODY3NS4uOGM4NzgzYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL3V0aWwvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCmluZGV4IDczNzJlYjcuLmE0N2I0YTEgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vdXRpbC9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwyNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX2NvbW1vbl91dGlsX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfcGx1Z2luc19jb21tb25fdXRpbF9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYmRybXV0aWxpdHkiLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCmluZGV4IGJiOWQ3ZWMuLmJlMmI1NDYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwyNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX2ZvcndhcmQtbG9ja19Gd2RMb2NrRW5naW5lX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfcGx1Z2luc19mb3J3YXJkLWxvY2tfRndkTG9ja0VuZ2luZV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmZ3ZGxvY2tlbmdpbmUiLAogCkBAIC0zNiwxMSArNTUsMTEgQEAKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJzc2wiLAogICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29ya2NvbW1vbiIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJkcm11dGlsaXR5IiwKLSAgICAgICAgImxpYmRybWZyYW1ld29ya2NvbW1vbiIsCiAgICAgICAgICJsaWJmd2Rsb2NrLWNvbW1vbiIsCiAgICAgICAgICJsaWJmd2Rsb2NrLWNvbnZlcnRlciIsCiAgICAgICAgICJsaWJmd2Rsb2NrLWRlY29kZXIiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCmluZGV4IGI2MmRkYjkuLmViNWIwZjYgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKQEAgLTI1Miw4ICsyNTIsNyBAQAogCiAvKioKICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldCBidXQgZG9lcyBub3RoaW5nIGZvcgotICogRm9yd2FyZCBMb2NrIEVuZ2luZS4KKyAqIERSTSBmcmFtZXdvcmsuIERvZXMgbm90aGluZyBmb3IgRm9yd2FyZCBMb2NrIEVuZ2luZS4KICAqCiAgKiBAcGFyYW0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICogQHJldHVybiBzdGF0dXNfdApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29tbW9uL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icAppbmRleCAzYmUzMjdhLi4yZTQwNzBiIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9jb21tb24vQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJmd2Rsb2NrLWNvbW1vbiIsCiAKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2NvbnZlcnRlci9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKaW5kZXggZDRlMDRiOC4uNTFjNzc4ZiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvY29udmVydGVyL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliZndkbG9jay1jb252ZXJ0ZXIiLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kZWNvZGVyL0FuZHJvaWQuYnAKaW5kZXggMGJmMjczNy4uNjc3M2ZlMSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZGVjb2Rlci9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RlY29kZXIvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9kcm1fbGliZHJtZnJhbWV3b3JrX2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJmd2Rsb2NrLWRlY29kZXIiLAogCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAppbmRleCA4Zjk1Y2QyLi5jMWQ1YjNkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKQEAgLTQ4OCw3ICs0ODgsNyBAQAogPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSBrZXktZW5jcnlwdGlvbiBrZXkgbXVzdCBiZSB1bmlxdWUgdG8gZWFjaAogZGV2aWNlOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhlIGZpbGVzIGZvcndhcmQgbG9ja5Zwcm90ZWN0ZWQuIElkZWFsbHksIGl0IHNob3VsZAogYmUgZGVyaXZlZCBmcm9tIHNlY3JldCBoYXJkd2FyZSBwYXJhbWV0ZXJzLCBidXQgYXQgdGhlIHZlcnkgbGVhc3QgaXQgc2hvdWxkIGJlCi1wZXJzaXN0ZW50IGZyb20gb25lIG1hc3RlciByZXNldCB0byB0aGUgbmV4dC48L3A+CitwZXJzaXN0ZW50IGZyb20gb25lIGZhY3RvcnkgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgogCiA8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OwogYmFja2dyb3VuZDojRjJGMkYyJz4KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKaW5kZXggMDViNjQ0MC4uNmRmZmQ0OSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L0FuZHJvaWQuYnAKQEAgLTE0LDE3ICsxNCwzNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfZHJtX2xpYmRybWZyYW1ld29ya19wbHVnaW5zX3Bhc3N0aHJ1X2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X2RybV9saWJkcm1mcmFtZXdvcmtfcGx1Z2luc19wYXNzdGhydV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmRybXBhc3N0aHJ1cGx1Z2luIiwKIAogICAgIHNyY3M6IFsic3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcCJdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGliZHJtZnJhbWV3b3JrY29tbW9uIl0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmRybWZyYW1ld29ya2NvbW1vbiIsCiAgICAgXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCmluZGV4IDE3MDBhOTUuLjBmZmU2MjYgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCisrKyBiL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwCkBAIC0yLDYgKzIsMTUgQEAKIC8vIGxpYm1lZGlhZHJtCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhZHJtX2hlYWRlcnMiLAogCkBAIC0xMSw3ICsyMCw3IEBACiAKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhZHJtIiwKIAogICAgIHNyY3M6IFsKQEAgLTUxLDYgKzYwLDcgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNCIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgIF0sCkBAIC02Myw2ICs3Myw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKaW5kZXggMTg3NzJlMC4uZTBkYjFjNCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybVV0aWxzLmg+CiAKIHVzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7CkBAIC0zOSw2ICs0MCw3IEBACiB1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKIHVzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwogCit1c2luZyA6OmFuZHJvaWQ6OkRybVV0aWxzOjp0b1N0YXR1c1Q7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKQEAgLTUzLDQyICs1NSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7Ci0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fTk9fTElDRU5TRTsKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0JVU1k7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT046Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOwotICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVDUllQVDsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1RfMV8yKFN0YXR1c19WMV8yIHN0YXR1cykgewotICAgIHN3aXRjaCAoc3RhdHVzKSB7Ci0gICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7OwotICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOwotICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKLSAgICB9Ci19Ci0KIHN0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CiAgICAgdmVjLnNldFRvRXh0ZXJuYWwoY29uc3RfY2FzdDx1aW50OF90ICo+KHZlY3Rvci5hcnJheSgpKSwgdmVjdG9yLnNpemUoKSk7CkBAIC0xODAsNiArMTQ2LDkgQEAKICAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOwogICAgICAgICAgICAgfQogICAgICAgICApOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgIH0KICAgICByZXR1cm4gcGx1Z2luOwogfQogCkBAIC0yMTMsMTAgKzE4Miw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobVBsdWdpbiA9PSBOVUxMKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgaWYgKG1Jbml0Q2hlY2sgPT0gTk9fSU5JVCkgeworICAgICAgICBtSW5pdENoZWNrID0gbVBsdWdpbiA9PSBOVUxMID8gRVJST1JfVU5TVVBQT1JURUQgOiBPSzsKICAgICB9CiAKICAgICByZXR1cm4gbUluaXRDaGVjazsKQEAgLTM3Niw2ICszNDMsNyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKKyAgICBtTG9jay51bmxvY2soKTsKICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgewogICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAogICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLApAQCAtMzg0LDcgKzM1Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICk7CiAgICAgfSBlbHNlIHsKQEAgLTQxNCw3ICszODIsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbVBsdWdpbi0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKKyAgICBhdXRvIGhSZXN1bHQgPSBtUGx1Z2luLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgIEFMT0dFX0lGKCFoUmVzdWx0LmlzT2soKSwgIm5vdGlmeVJlc29sdXRpb24gdHhuIGZhaWxlZCAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKIH0KIAogc3RhdHVzX3QgQ3J5cHRvSGFsOjpzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKQEAgLTQyNCw3ICszOTMsMTIgQEAKICAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CiAgICAgfQogCi0gICAgcmV0dXJuIHRvU3RhdHVzVChtUGx1Z2luLT5zZXRNZWRpYURybVNlc3Npb24odG9IaWRsVmVjKHNlc3Npb25JZCkpKTsKKyAgICBhdXRvIGVyciA9IG1QbHVnaW4tPnNldE1lZGlhRHJtU2Vzc2lvbih0b0hpZGxWZWMoc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOwogfQogCitzdGF0dXNfdCBDcnlwdG9IYWw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzPGRybTo6VjFfNDo6SUNyeXB0b1BsdWdpbj4obVBsdWdpbiwgbG9ncyk7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBmMjE4MDQxLi40MGQxZTBjIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMTYsMTMgKzE2LDkgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJEcm1IYWwiCi0jaW5jbHVkZSA8aW9tYW5pcD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogCiAjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CkBAIC00MCw3ICszNiw5IEBACiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9JRHJtTWV0cmljc0NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBkcm06OlYxXzA6OktleWVkVmVjdG9yOwpAQCAtNTUsNiArNTMsNyBAQAogdXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwogdXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKIHVzaW5nIGRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6RHJtVXRpbHM6OnRvU3RhdHVzVDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC0yMzUsNTggKzIzNCw2IEBACiAgICAgcmV0dXJuIGtleVNldElkczsKIH0KIAotc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7Ci0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3RhdHVzOjpCQURfVkFMVUU6Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fTk9UX1BST1ZJU0lPTkVEOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1JFU09VUkNFX0JVU1k7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7Ci0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOwotICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOwotICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKLSAgICB9Ci19Ci0KIE11dGV4IERybUhhbDo6bUxvY2s7CiAKIHN0cnVjdCBEcm1IYWw6OkRybVNlc3Npb25DbGllbnQgOiBwdWJsaWMgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKQEAgLTM3MCw4ICszMTcsNyBAQAogICAgIGNsb3NlT3BlblNlc3Npb25zKCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJlcG9ydFBsdWdpbk1ldHJpY3MoKTsKLSAgICByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCk7CisgICAgcmVwb3J0RnJhbWV3b3JrTWV0cmljcyhyZXBvcnRQbHVnaW5NZXRyaWNzKCkpOwogCiAgICAgc2V0TGlzdGVuZXIoTlVMTCk7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CkBAIC0zODcsMTggKzMzMywxOSBAQAogICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOwogICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzQuY2xlYXIoKTsKIH0KIAogc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7Ci0gICAgc3RkOjp2ZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXMoRHJtVXRpbHM6Ok1ha2VEcm1GYWN0b3JpZXMoKSk7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzKERybVV0aWxzOjpNYWtlRHJtRmFjdG9yaWVzKCkpOwogICAgIGlmIChmYWN0b3JpZXMuc2l6ZSgpID09IDApIHsKICAgICAgICAgLy8gbXVzdCBiZSBpbiBwYXNzdGhyb3VnaCBtb2RlLCBsb2FkIHRoZSBkZWZhdWx0IHBhc3N0aHJvdWdoIHNlcnZpY2UKICAgICAgICAgYXV0byBwYXNzdGhyb3VnaCA9IElEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CiAgICAgICAgIGlmIChwYXNzdGhyb3VnaCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HSSgibWFrZURybUZhY3RvcmllczogdXNpbmcgZGVmYXVsdCBwYXNzdGhyb3VnaCBkcm0gaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIERybVV0aWxzOjpMT0cyQkkoIm1ha2VEcm1GYWN0b3JpZXM6IHVzaW5nIGRlZmF1bHQgcGFzc3Rocm91Z2ggZHJtIGluc3RhbmNlIik7CiAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKHBhc3N0aHJvdWdoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBhbnkgZHJtIGZhY3RvcmllcyIpOworICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSgiRmFpbGVkIHRvIGZpbmQgYW55IGRybSBmYWN0b3JpZXMiKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFjdG9yaWVzOwpAQCAtNDE0LDcgKzM2MSw3IEBACiAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBmYWN0b3J5LT5jcmVhdGVQbHVnaW4odXVpZCwgYXBwUGFja2FnZU5hbWUuc3RyaW5nKCksCiAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8SURybVBsdWdpbj4mIGhQbHVnaW4pIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYWtlIGRybSBwbHVnaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiRmFpbGVkIHRvIG1ha2UgZHJtIHBsdWdpbjogJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBsdWdpbiA9IGhQbHVnaW47CkBAIC00MjIsNyArMzY5LDggQEAKICAgICAgICAgKTsKIAogICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVBsdWdpbiByZW1vdGUgY2FsbCBmYWlsZWQiKTsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSh1dWlkLCAiY3JlYXRlUGx1Z2luIHJlbW90ZSBjYWxsIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICB9CiAKICAgICByZXR1cm4gcGx1Z2luOwpAQCAtNjE2LDE4ICs1NjQsMjEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgeworICAgICAgICBhdXRvIGhSZXN1bHQgPSBtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKTsKKyAgICAgICAgaWYgKGhSZXN1bHQuaXNPaygpICYmIGhSZXN1bHQpIHsKICAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwogICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKICAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzQgPSBkcm06OlYxXzQ6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgeworICAgICAgICBEcm1VdGlsczo6TE9HMkJFKHV1aWQsICJObyBzdXBwb3J0ZWQgaGFsIGluc3RhbmNlIGZvdW5kIik7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9IGVsc2UgewogICAgICAgICBtSW5pdENoZWNrID0gT0s7CkBAIC02NDIsNiArNTkzLDcgQEAKICAgICAgICAgICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICAgICAgICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CiAgICAgICAgICAgICBtUGx1Z2luVjFfMi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzQuY2xlYXIoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODIyLDcgKzc3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUXzFfMihzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9KTsKICAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKICAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKQEAgLTkzNiw3ICs4ODgsNyBAQAogICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCiAgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0UHJvdmlzaW9uUmVxdWVzdF8xXzIoCisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0UHJvdmlzaW9uUmVxdWVzdF8xXzIoCiAgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAogICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewpAQCAtOTQ0LDExICs4OTYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAorICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0UHJvdmlzaW9uUmVxdWVzdCgKICAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcoY2VydFR5cGUpLCB0b0hpZGxTdHJpbmcoY2VydEF1dGhvcml0eSksCiAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewpAQCAtMTExNiw3ICsxMDY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChoQ29ubmVjdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0pOwogICAgIH0gZWxzZSBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewogICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzEtPmdldEhkY3BMZXZlbHMoCkBAIC0xNTExLDcgKzE0NjMsNyBAQAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQogCi12b2lkIERybUhhbDo6cmVwb3J0RnJhbWV3b3JrTWV0cmljcygpIGNvbnN0CitzdGQ6OnN0cmluZyBEcm1IYWw6OnJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0CiB7CiAgICAgbWVkaWFtZXRyaWNzX2hhbmRsZV90IGl0ZW0obWVkaWFtZXRyaWNzX2NyZWF0ZSgibWVkaWFkcm0iKSk7CiAgICAgbWVkaWFtZXRyaWNzX3NldFVpZChpdGVtLCBtTWV0cmljcy5HZXRBcHBVaWQoKSk7CkBAIC0xNTQwLDIxICsxNDkyLDI2IEBACiAgICAgaWYgKCFiNjRFbmNvZGVkTWV0cmljcy5lbXB0eSgpKSB7CiAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKGl0ZW0sICJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKICAgICB9CisgICAgaWYgKCFwbHVnaW5NZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcoaXRlbSwgInBsdWdpbl9tZXRyaWNzIiwgcGx1Z2luTWV0cmljcy5jX3N0cigpKTsKKyAgICB9CiAgICAgaWYgKCFtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChpdGVtKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlbGYgcmVjb3JkIGZyYW1ld29yayBtZXRyaWNzIik7CiAgICAgfQogICAgIG1lZGlhbWV0cmljc19kZWxldGUoaXRlbSk7CisgICAgcmV0dXJuIHNlcmlhbGl6ZWRNZXRyaWNzOwogfQogCi12b2lkIERybUhhbDo6cmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0CitzdGQ6OnN0cmluZyBEcm1IYWw6OnJlcG9ydFBsdWdpbk1ldHJpY3MoKSBjb25zdAogewogICAgIFZlY3Rvcjx1aW50OF90PiBtZXRyaWNzVmVjdG9yOwogICAgIFN0cmluZzggdmVuZG9yOwogICAgIFN0cmluZzggZGVzY3JpcHRpb247CisgICAgc3RkOjpzdHJpbmcgbWV0cmljc1N0cmluZzsKICAgICBpZiAoZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJ2ZW5kb3IiKSwgdmVuZG9yKSA9PSBPSyAmJgogICAgICAgICAgICAgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4KCJkZXNjcmlwdGlvbiIpLCBkZXNjcmlwdGlvbikgPT0gT0sgJiYKICAgICAgICAgICAgIGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCgibWV0cmljcyIpLCBtZXRyaWNzVmVjdG9yKSA9PSBPSykgewotICAgICAgICBzdGQ6OnN0cmluZyBtZXRyaWNzU3RyaW5nID0gdG9CYXNlNjRTdHJpbmdOb1BhZChtZXRyaWNzVmVjdG9yLmFycmF5KCksCisgICAgICAgIG1ldHJpY3NTdHJpbmcgPSB0b0Jhc2U2NFN0cmluZ05vUGFkKG1ldHJpY3NWZWN0b3IuYXJyYXkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljc1ZlY3Rvci5zaXplKCkpOwogICAgICAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkOjpyZXBvcnREcm1QbHVnaW5NZXRyaWNzKG1ldHJpY3NTdHJpbmcsIHZlbmRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiwgbU1ldHJpY3MuR2V0QXBwVWlkKCkpOwpAQCAtMTU2Miw2ICsxNTE5LDU1IEBACiAgICAgICAgICAgICBBTE9HRSgiTWV0cmljcyB3ZXJlIHJldHJpZXZlZCBidXQgY291bGQgbm90IGJlIHJlcG9ydGVkOiAlZCIsIHJlcyk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIG1ldHJpY3NTdHJpbmc7Cit9CisKK3N0YXR1c190IERybUhhbDo6cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgKnJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaFJlc3VsdCA9IG1QbHVnaW5WMV80LT5yZXF1aXJlc1NlY3VyZURlY29kZXJEZWZhdWx0KGhpZGxfc3RyaW5nKG1pbWUpKTsKKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIERybVV0aWxzOjpMT0cyQkUoInJlcXVpcmVzU2VjdXJlRGVjb2RlciB0eG4gZmFpbGVkOiAlcyIsIGhSZXN1bHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgKnJlcXVpcmVkID0gaFJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEcm1IYWw6OnJlcXVpcmVzU2VjdXJlRGVjb2Rlcihjb25zdCBjaGFyICptaW1lLCBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlcXVpcmVkKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBsdWdpblYxXzQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaExldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChzZWN1cml0eUxldmVsKTsKKyAgICBhdXRvIGhSZXN1bHQgPSBtUGx1Z2luVjFfNC0+cmVxdWlyZXNTZWN1cmVEZWNvZGVyKGhpZGxfc3RyaW5nKG1pbWUpLCBoTGV2ZWwpOworICAgIGlmICghaFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgRHJtVXRpbHM6OkxPRzJCRSgicmVxdWlyZXNTZWN1cmVEZWNvZGVyIHR4biBmYWlsZWQ6ICVzIiwgaFJlc3VsdC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChyZXF1aXJlZCkgeworICAgICAgICAqcmVxdWlyZWQgPSBoUmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERybUhhbDo6c2V0UGxheWJhY2tJZChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwgY29uc3QgY2hhciAqcGxheWJhY2tJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1QbHVnaW5WMV80ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBhdXRvIGVyciA9IG1QbHVnaW5WMV80LT5zZXRQbGF5YmFja0lkKHRvSGlkbFZlYyhzZXNzaW9uSWQpLCBoaWRsX3N0cmluZyhwbGF5YmFja0lkKSk7CisgICAgcmV0dXJuIGVyci5pc09rKCkgPyB0b1N0YXR1c1QoZXJyKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gRHJtVXRpbHM6OkdldExvZ01lc3NhZ2VzPGRybTo6VjFfNDo6SURybVBsdWdpbj4obVBsdWdpbiwgbG9ncyk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljc0NvbnN1bWVyLmNwcCBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzQ29uc3VtZXIuY3BwCmluZGV4IGI0N2I0ZmYuLjVmMGIyNmUgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzQ29uc3VtZXIuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzQ29uc3VtZXIuY3BwCkBAIC0zNyw4ICszNyw4IEBACiB0ZW1wbGF0ZSA8PiBzdGQ6OnN0cmluZyBHZXRBdHRyaWJ1dGVOYW1lPEtleVN0YXR1c1R5cGU+KEtleVN0YXR1c1R5cGUgdHlwZSkgewogICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlX25hbWVzW10gPSB7IlVTQUJMRSIsICJFWFBJUkVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPVVRQVVRfTk9UX0FMTE9XRUQiLCAiU1RBVFVTX1BFTkRJTkciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVEVSTkFMX0VSUk9SIn07Ci0gICAgaWYgKCgoc2l6ZV90KXR5cGUpID4gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5URVJOQUxfRVJST1IiLCAiVVNBQkxFX0lOX0ZVVFVSRSJ9OworICAgIGlmICgoKHNpemVfdCl0eXBlKSA+PSBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKICAgICAgICAgcmV0dXJuICJVTktOT1dOX1RZUEUiOwogICAgIH0KICAgICByZXR1cm4gdHlwZV9uYW1lc1soc2l6ZV90KXR5cGVdOwpAQCAtNDgsNyArNDgsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICp0eXBlX25hbWVzW10gPSB7IlBST1ZJU0lPTl9SRVFVSVJFRCIsICJLRVlfTkVFREVEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlfRVhQSVJFRCIsICJWRU5ET1JfREVGSU5FRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VTU0lPTl9SRUNMQUlNRUQifTsKLSAgICBpZiAoKChzaXplX3QpdHlwZSkgPiBhcnJheXNpemUodHlwZV9uYW1lcykpIHsKKyAgICBpZiAoKChzaXplX3QpdHlwZSkgPj0gYXJyYXlzaXplKHR5cGVfbmFtZXMpKSB7CiAgICAgICAgIHJldHVybiAiVU5LTk9XTl9UWVBFIjsKICAgICB9CiAgICAgcmV0dXJuIHR5cGVfbmFtZXNbKHNpemVfdCl0eXBlXTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCmluZGV4IDUyOTI3MDUuLmUzMTM5NWQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcApAQCAtNjYsNyArNjYsNyBAQAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICBNZWRpYVJlc291cmNlUGFyY2VsIHJlc291cmNlewogICAgICAgICAgICAgVHlwZTo6a0RybVNlc3Npb24sIFN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsCi0gICAgICAgICAgICB0b1N0ZFZlYzxpbnQ4X3Q+KHNlc3Npb25JZCksIHZhbHVlfTsKKyAgICAgICAgICAgIHRvU3RkVmVjPD4oc2Vzc2lvbklkKSwgdmFsdWV9OwogICAgIHJlc291cmNlcy5wdXNoX2JhY2socmVzb3VyY2UpOwogICAgIHJldHVybiByZXNvdXJjZXM7CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtVXRpbHMuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybVV0aWxzLmNwcAppbmRleCBkODVmYTYxLi4wYjExN2EzIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtVXRpbHMuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1VdGlscy5jcHAKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjMvSUNyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjMvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSURybUZhY3RvcnkuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgogCkBAIC00MSw2ICs0Myw5IEBACiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm0uaD4KIAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKIHVzaW5nIEhTZXJ2aWNlTWFuYWdlciA9IDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMjo6SVNlcnZpY2VNYW5hZ2VyOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNjQsMjAgKzY5LDMwIEBACiAgICAgcmV0dXJuIG9iajsKIH0KIAotdGVtcGxhdGUgPHR5cGVuYW1lIEhhbCwgdHlwZW5hbWUgVj4KLXZvaWQgTWFrZUhpZGxGYWN0b3JpZXMoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgViAmZmFjdG9yaWVzKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBNPgordm9pZCBNYWtlSGlkbEZhY3Rvcmllcyhjb25zdCB1aW50OF90IHV1aWRbMTZdLCBWICZmYWN0b3JpZXMsIE0mIGluc3RhbmNlcykgewogICAgIHNwPEhTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1hbmFnZXIgPSBIU2VydmljZU1hbmFnZXI6OmdldFNlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZU1hbmFnZXIgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKLSAgICAgICAgZXhpdCgtMSk7CisgICAgICAgIExPRzJCRSgiRmFpbGVkIHRvIGdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHNlcnZpY2VNYW5hZ2VyLT5saXN0TWFuaWZlc3RCeUludGVyZmFjZShIYWw6OmRlc2NyaXB0b3IsIFsmXShjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvICZpbnN0YW5jZSA6IHJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgIGF1dG8gZmFjdG9yeSA9IEhhbDo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImZvdW5kICVzICVzIiwgSGFsOjpkZXNjcmlwdG9yLCBpbnN0YW5jZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXV1aWQgfHwgZmFjdG9yeS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKKyAgICAgICAgICAgICAgICBpbnN0YW5jZXNbaW5zdGFuY2UuY19zdHIoKV0gPSBIYWw6OmRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgaWYgKCF1dWlkKSB7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdXRvIHN1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOworICAgICAgICAgICAgICAgIGlmICghc3VwcG9ydGVkLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cyQkUodXVpZCwgImlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkIHR4biBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZCkgewogICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTg1LDYgKzEwMCwxMiBAQAogICAgIH0pOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFsLCB0eXBlbmFtZSBWPgordm9pZCBNYWtlSGlkbEZhY3Rvcmllcyhjb25zdCB1aW50OF90IHV1aWRbMTZdLCBWICZmYWN0b3JpZXMpIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGluc3RhbmNlczsKKyAgICBNYWtlSGlkbEZhY3RvcmllczxIYWw+KHV1aWQsIGZhY3RvcmllcywgaW5zdGFuY2VzKTsKK30KKwogaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWMoc2l6ZSk7CiAgICAgaWYgKHB0ciAhPSBudWxscHRyKSB7CkBAIC0xMDMsMjggKzEyNCw0MiBAQAogc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiBNYWtlRHJtUGx1Z2luKGNvbnN0IHNwPDo6VjFfMDo6SURybUZhY3Rvcnk+ICZmYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IGNoYXIgKmFwcFBhY2thZ2VOYW1lKSB7CiAgICAgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiBwbHVnaW47Ci0gICAgZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKHRvSGlkbEFycmF5MTYodXVpZCksIGhpZGxfc3RyaW5nKGFwcFBhY2thZ2VOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiAmaFBsdWdpbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSA6OlYxXzA6OlN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcGx1Z2luOworICAgIGF1dG8gZXJyID0gZmFjdG9yeS0+Y3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgdG9IaWRsQXJyYXkxNih1dWlkKSwgaGlkbF9zdHJpbmcoYXBwUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgWyZdKDo6VjFfMDo6U3RhdHVzIHN0YXR1cywgY29uc3Qgc3A8OjpWMV8wOjpJRHJtUGx1Z2luPiAmaFBsdWdpbikgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gOjpWMV8wOjpTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRzJCRSh1dWlkLCAiTWFrZURybVBsdWdpbiBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbHVnaW4gPSBoUGx1Z2luOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyci5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0cyQkUodXVpZCwgIk1ha2VEcm1QbHVnaW4gdHhuIGZhaWxlZDogJXMiLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogfQogCiBzcDw6OlYxXzA6OklDcnlwdG9QbHVnaW4+IE1ha2VDcnlwdG9QbHVnaW4oY29uc3Qgc3A8OjpWMV8wOjpJQ3J5cHRvRmFjdG9yeT4gJmZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluaXREYXRhU2l6ZSkgewogICAgIHNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gcGx1Z2luOwotICAgIGZhY3RvcnktPmNyZWF0ZVBsdWdpbih0b0hpZGxBcnJheTE2KHV1aWQpLCB0b0hpZGxWZWMoaW5pdERhdGEsIGluaXREYXRhU2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSg6OlYxXzA6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gJmhQbHVnaW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gOjpWMV8wOjpTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luID0gaFBsdWdpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHBsdWdpbjsKKyAgICBhdXRvIGVyciA9IGZhY3RvcnktPmNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIHRvSGlkbEFycmF5MTYodXVpZCksIHRvSGlkbFZlYyhpbml0RGF0YSwgaW5pdERhdGFTaXplKSwKKyAgICAgICAgICAgIFsmXSg6OlYxXzA6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IHNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4gJmhQbHVnaW4pIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDo6VjFfMDo6U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBMT0cyQkUodXVpZCwgIk1ha2VDcnlwdG9QbHVnaW4gZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGx1Z2luID0gaFBsdWdpbjsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBwbHVnaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HMkJFKHV1aWQsICJNYWtlQ3J5cHRvUGx1Z2luIHR4biBmYWlsZWQ6ICVzIiwgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UKQEAgLTE0MywxMCArMTc4LDE1IEBACiAKIHN0ZDo6dmVjdG9yPHNwPDo6VjFfMDo6SURybUZhY3Rvcnk+PiBNYWtlRHJtRmFjdG9yaWVzKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKICAgICBzdGQ6OnZlY3RvcjxzcDw6OlYxXzA6OklEcm1GYWN0b3J5Pj4gZHJtRmFjdG9yaWVzOwotICAgIE1ha2VIaWRsRmFjdG9yaWVzPDo6VjFfMDo6SURybUZhY3Rvcnk+KHV1aWQsIGRybUZhY3Rvcmllcyk7Ci0gICAgTWFrZUhpZGxGYWN0b3JpZXM8OjpWMV8xOjpJRHJtRmFjdG9yeT4odXVpZCwgZHJtRmFjdG9yaWVzKTsKLSAgICBNYWtlSGlkbEZhY3Rvcmllczw6OlYxXzI6OklEcm1GYWN0b3J5Pih1dWlkLCBkcm1GYWN0b3JpZXMpOwotICAgIE1ha2VIaWRsRmFjdG9yaWVzPDo6VjFfMzo6SURybUZhY3Rvcnk+KHV1aWQsIGRybUZhY3Rvcmllcyk7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBpbnN0YW5jZXM7CisgICAgTWFrZUhpZGxGYWN0b3JpZXM8OjpWMV8wOjpJRHJtRmFjdG9yeT4odXVpZCwgZHJtRmFjdG9yaWVzLCBpbnN0YW5jZXMpOworICAgIE1ha2VIaWRsRmFjdG9yaWVzPDo6VjFfMTo6SURybUZhY3Rvcnk+KHV1aWQsIGRybUZhY3RvcmllcywgaW5zdGFuY2VzKTsKKyAgICBNYWtlSGlkbEZhY3Rvcmllczw6OlYxXzI6OklEcm1GYWN0b3J5Pih1dWlkLCBkcm1GYWN0b3JpZXMsIGluc3RhbmNlcyk7CisgICAgTWFrZUhpZGxGYWN0b3JpZXM8OjpWMV8zOjpJRHJtRmFjdG9yeT4odXVpZCwgZHJtRmFjdG9yaWVzLCBpbnN0YW5jZXMpOworICAgIE1ha2VIaWRsRmFjdG9yaWVzPDo6VjFfNDo6SURybUZhY3Rvcnk+KHV1aWQsIGRybUZhY3RvcmllcywgaW5zdGFuY2VzKTsKKyAgICBmb3IgKGF1dG8gY29uc3QmIGVudHJ5IDogaW5zdGFuY2VzKSB7CisgICAgICAgIExPRzJCSSgiZm91bmQgaW5zdGFuY2U9JXMgdmVyc2lvbj0lcyIsIGVudHJ5LmZpcnN0LmNfc3RyKCksIGVudHJ5LnNlY29uZC5jX3N0cigpKTsKKyAgICB9CiAgICAgcmV0dXJuIGRybUZhY3RvcmllczsKIH0KIApAQCAtMTY1LDYgKzIwNSw3IEBACiAgICAgTWFrZUhpZGxGYWN0b3JpZXM8OjpWMV8xOjpJQ3J5cHRvRmFjdG9yeT4odXVpZCwgY3J5cHRvRmFjdG9yaWVzKTsKICAgICBNYWtlSGlkbEZhY3Rvcmllczw6OlYxXzI6OklDcnlwdG9GYWN0b3J5Pih1dWlkLCBjcnlwdG9GYWN0b3JpZXMpOwogICAgIE1ha2VIaWRsRmFjdG9yaWVzPDo6VjFfMzo6SUNyeXB0b0ZhY3Rvcnk+KHV1aWQsIGNyeXB0b0ZhY3Rvcmllcyk7CisgICAgTWFrZUhpZGxGYWN0b3JpZXM8OjpWMV80OjpJQ3J5cHRvRmFjdG9yeT4odXVpZCwgY3J5cHRvRmFjdG9yaWVzKTsKICAgICByZXR1cm4gY3J5cHRvRmFjdG9yaWVzOwogfQogCkBAIC0xNzcsNSArMjE4LDE2MCBAQAogICAgIHJldHVybiBwbHVnaW5zOwogfQogCitzdGF0dXNfdCB0b1N0YXR1c1RfMV80KDo6VjFfNDo6U3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6T0s6CisgICAgICAgIHJldHVybiBPSzsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpCQURfVkFMVUU6CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERUNSWVBUOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRDsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTjsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9MSUNFTlNFX0VYUElSRUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9FWFBJUkVEOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX05PVF9QUk9WSVNJT05FRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9OT1RfUFJPVklTSU9ORUQ7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1JFU09VUkNFX0JVU1k6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworCisgICAgLy8gTmV3IGluIFMgLyBkcm1AMS40OgorICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkNBTk5PVF9ERUNSWVBUX1pFUk9fU1VCU0FNUExFUzoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVM7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6Q1JZUFRPX0xJQlJBUllfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ1JZUFRPX0xJQlJBUlk7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6R0VORVJBTF9PRU1fRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fR0VORVJJQ19PRU07CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6R0VORVJBTF9QTFVHSU5fRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fR0VORVJJQ19QTFVHSU47CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6SU5JVF9EQVRBX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5JVF9EQVRBOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OktFWV9OT1RfTE9BREVEOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0tFWV9OT1RfTE9BREVEOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUEFSU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9QQVJTRTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1BPTElDWV9FUlJPUjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1BPTElDWTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1JFTEVBU0VfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTElDRU5TRV9SRUxFQVNFOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OkxJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9MSUNFTlNFX1JFUVVFU1RfUkVKRUNURUQ7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TElDRU5TRV9SRVNUT1JFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfUkVTVE9SRTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpMSUNFTlNFX1NUQVRFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0xJQ0VOU0VfU1RBVEU7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6TUFMRk9STUVEX0NFUlRJRklDQVRFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NFUlRJRklDQVRFX01BTEZPUk1FRDsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpNRURJQV9GUkFNRVdPUktfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fTUVESUFfRlJBTUVXT1JLOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6Ok1JU1NJTkdfQ0VSVElGSUNBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0VSVElGSUNBVEVfTUlTU0lORzsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfQ0VSVElGSUNBVEVfRVJST1I6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NFUlRJRklDQVRFOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlBST1ZJU0lPTklOR19DT05GSUdVUkFUSU9OX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUc7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6UFJPVklTSU9OSU5HX1BBUlNFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19QQVJTRTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpQUk9WSVNJT05JTkdfUkVRVUVTVF9SRUpFQ1RFRDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9QUk9WSVNJT05JTkdfUkVRVUVTVF9SRUpFQ1RFRDsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpSRVRSWUFCTEVfUFJPVklTSU9OSU5HX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWTsKKyAgICBjYXNlIDo6VjFfNDo6U3RhdHVzOjpTRUNVUkVfU1RPUF9SRUxFQVNFX0VSUk9SOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX1NFQ1VSRV9TVE9QX1JFTEVBU0U7CisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6U1RPUkFHRV9SRUFEX0ZBSUxVUkU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU1RPUkFHRV9SRUFEOworICAgIGNhc2UgOjpWMV80OjpTdGF0dXM6OlNUT1JBR0VfV1JJVEVfRkFJTFVSRToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFOworCisgICAgY2FzZSA6OlYxXzQ6OlN0YXR1czo6RVJST1JfRFJNX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfRFJNX1VOS05PV047Cit9CisKK25hbWVzcGFjZSB7CitjaGFyIGxvZ1ByaW9yaXR5VG9DaGFyKDo6VjFfNDo6TG9nUHJpb3JpdHkgcHJpb3JpdHkpIHsKKyAgICBjaGFyIHAgPSAnVSc7CisgICAgc3dpdGNoIChwcmlvcml0eSkgeworICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OlZFUkJPU0U6ICBwID0gJ1YnOyBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpERUJVRzogICAgcCA9ICdEJzsgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6SU5GTzogICAgIHAgPSAnSSc7IGJyZWFrOworICAgICAgICBjYXNlIDo6VjFfNDo6TG9nUHJpb3JpdHk6OldBUk46ICAgICBwID0gJ1cnOyBicmVhazsKKyAgICAgICAgY2FzZSA6OlYxXzQ6OkxvZ1ByaW9yaXR5OjpFUlJPUjogICAgcCA9ICdFJzsgYnJlYWs7CisgICAgICAgIGNhc2UgOjpWMV80OjpMb2dQcmlvcml0eTo6RkFUQUw6ICAgIHAgPSAnRic7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBwID0gJ1UnOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworc3RkOjpzdHJpbmcgR2V0RXhjZXB0aW9uTWVzc2FnZShzdGF0dXNfdCBlcnIsIGNvbnN0IGNoYXIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPDo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIHsKKyAgICBzdGQ6OnN0cmluZyBydWxlcigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7CisgICAgc3RkOjpzdHJpbmcgaGVhZGVyKCJCZWdpbm5pbmcgb2YgRFJNIFBsdWdpbiBMb2ciKTsKKyAgICBzdGQ6OnN0cmluZyBmb290ZXIoIkVuZCBvZiBEUk0gUGx1Z2luIExvZyIpOworICAgIFN0cmluZzggbXNnODsKKyAgICBpZiAobXNnKSB7CisgICAgICAgIG1zZzggKz0gbXNnOworICAgICAgICBtc2c4ICs9ICI6ICI7CisgICAgfQorICAgIGF1dG8gZXJyU3RyID0gU3RyQ3J5cHRvRXJyb3IoZXJyKTsKKyAgICBtc2c4ICs9IGVyclN0ci5jX3N0cigpOworICAgIG1zZzggKz0gU3RyaW5nODo6Zm9ybWF0KCJcbiVzICVzICVzIiwgcnVsZXIuY19zdHIoKSwgaGVhZGVyLmNfc3RyKCksIHJ1bGVyLmNfc3RyKCkpOworCisgICAgZm9yIChhdXRvIGxvZyA6IGxvZ3MpIHsKKyAgICAgICAgdGltZV90IHNlY29uZHMgPSBsb2cudGltZU1zIC8gMTAwMDsKKyAgICAgICAgaW50IG1zID0gbG9nLnRpbWVNcyAlIDEwMDA7CisgICAgICAgIGNoYXIgYnVmWzY0XSA9IHswfTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGltZVN0ciA9ICIwMC0wMCAwMDowMDowMCI7CisgICAgICAgIGlmIChzdHJmdGltZShidWYsIHNpemVvZiBidWYsICIlbS0lZCAlSDolTTolUyIsIHN0ZDo6bG9jYWx0aW1lKCZzZWNvbmRzKSkpIHsKKyAgICAgICAgICAgIHRpbWVTdHIgPSBidWY7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIHAgPSBsb2dQcmlvcml0eVRvQ2hhcihsb2cucHJpb3JpdHkpOworICAgICAgICBtc2c4ICs9IFN0cmluZzg6OmZvcm1hdCgiXG4gICVzLiUwM2QgJWMgJXMiLCB0aW1lU3RyLmNfc3RyKCksIG1zLCBwLCBsb2cubWVzc2FnZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBtc2c4ICs9IFN0cmluZzg6OmZvcm1hdCgiXG4lcyAlcyAlcyIsIHJ1bGVyLmNfc3RyKCksIGZvb3Rlci5jX3N0cigpLCBydWxlci5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOC5jX3N0cigpOworfQorCit2b2lkIExvZ0J1ZmZlcjo6YWRkTG9nKGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSAmbG9nKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbUJ1ZmZlci5wdXNoX2JhY2sobG9nKTsKKyAgICB3aGlsZSAobUJ1ZmZlci5zaXplKCkgPiBNQVhfQ0FQQUNJVFkpIHsKKyAgICAgICAgbUJ1ZmZlci5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK1ZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+IExvZ0J1ZmZlcjo6Z2V0TG9ncygpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBsb2dzOworICAgIGZvciAoYXV0byBsb2cgOiBtQnVmZmVyKSB7CisgICAgICAgIGxvZ3MucHVzaF9iYWNrKGxvZyk7CisgICAgfQorICAgIHJldHVybiBsb2dzOworfQorCitMb2dCdWZmZXIgZ0xvZ0J1ZjsKIH0gIC8vIG5hbWVzcGFjZSBEcm1VdGlscwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgxMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYWRybV9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1lZGlhZHJtX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhZHJtIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MjMSIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNCIsCisgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9SRUFETUUubWQgYi9kcm0vbGlibWVkaWFkcm0vZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk1Y2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhZHJtCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBsaWJtZWRpYWRybSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2xpYnJhcnkgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworbGlibWVkaWFkcm0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gU2VjdXJpdHkgTGV2ZWwgKHBhcmFtZXRlciBuYW1lOiBgc2VjdXJpdHlMZXZlbGApCisyLiBNaW1lIFR5cGUgKHBhcmFtZXRlciBuYW1lOiBgbWltZVR5cGVgKQorMy4gS2V5IFR5cGUgKHBhcmFtZXRlciBuYW1lOiBga2V5VHlwZWApCis0LiBDcnlwdG8gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBjcnlwdG9Nb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBzZWN1cml0eUxldmVsYCB8IDAuYERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duYCAxLmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4YCAyLmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVDcnlwdG9gIDMuYERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZWAgIDQuYERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0b2AgNS5gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlYCA2LmBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGxgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciBpbiB0aGUgcmFuZ2UgMCB0byA2fAorfCBgbWltZVR5cGVgIHwgMC5gdmlkZW8vbXA0YCAxLmB2aWRlby9tcGVnYCAyLmB2aWRlby94LWZsdmAgMy5gdmlkZW8vbWoyYCA0LmB2aWRlby8zZ3AyYCA1LmB2aWRlby8zZ3BwYCA2LmB2aWRlby8zZ3BwMmAgNy5gYXVkaW8vbXA0YCA4LmBhdWRpby9tcGVnYCA5LmBhdWRpby9hYWNgIDEwLmBhdWRpby8zZ3AyYCAxMS5gYXVkaW8vM2dwcGAgMTIuYGF1ZGlvLzNncHAyYCAxMy5gdmlkZW8vdW5rbm93bmB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDEzfAorfCBga2V5VHlwZWAgfCAwLmBEcm1QbHVnaW46OmtLZXlUeXBlX09mZmxpbmVgIDEuYERybVBsdWdpbjo6a0tleVR5cGVfU3RyZWFtaW5nYCAyLmBEcm1QbHVnaW46OmtLZXlUeXBlX1JlbGVhc2VgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgaW4gdGhlIHJhbmdlIDAgdG8gMnwKK3wgYGNyeXB0b01vZGVgIHwgMC5gQ3J5cHRvUGx1Z2luOjprTW9kZV9VbmVuY3J5cHRlZGAgMS5gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSYCAyLmBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVmAgMy5gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIGluIHRoZSByYW5nZSAwIHRvIDN8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgZHJtIG1vZHVsZS4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgbWVkaWFkcm1fZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZWRpYWRybV9mdXp6ZXIKK2BgYAorIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSCitgYGAKKyAgJCBhZGIgc2hlbGwgbWtkaXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovJHtUQVJHRVRfQVJDSH0vbWVkaWFkcm1fZnV6emVyL21lZGlhZHJtX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vZnV6emVyL21lZGlhZHJtX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmMDQ3NwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9mdXp6ZXIvbWVkaWFkcm1fZnV6emVyLmNwcApAQCAtMCwwICsxLDQ1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0NyeXB0b0hhbC5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKKyNkZWZpbmUgVU5VU0VEX1BBUkFNIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpmcm9tSGVhcDsKK3VzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwordXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOworCitlbnVtIHsKKyAgICBJTlZBTElEX1VVSUQgPSAwLAorICAgIFBTU0hfQk9YX1VVSUQsCisgICAgQ0xFQVJLRVlfVVVJRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtJbnZhbGlkVVVJRFsxNl0gPSB7MHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHg1MCwgMHg2MCwgMHg3MCwgMHg4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMCwgMHgyMCwgMHgzMCwgMHg0MCwgMHg1MCwgMHg2MCwgMHg3MCwgMHg4MH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb21tb25Qc3NoQm94VVVJRFsxNl0gPSB7MHgxMCwgMHg3NywgMHhFRiwgMHhFQywgMHhDMCwgMHhCMiwgMHg0RCwgMHgwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBQywgMHhFMywgMHgzQywgMHgxRSwgMHg1MiwgMHhFMiwgMHhGQiwgMHg0Qn07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDbGVhcktleVVVSURbMTZdID0gezB4RTIsIDB4NzEsIDB4OUQsIDB4NTgsIDB4QTksIDB4ODUsIDB4QjMsIDB4QzksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDc4LCAweDFBLCAweEIwLCAweDMwLCAweEFGLCAweDc4LCAweEQzLCAweDBFfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtVVUlEW10gPSB7SU5WQUxJRF9VVUlELCBQU1NIX0JPWF9VVUlELCBDTEVBUktFWV9VVUlEfTsKKworY29uc3QgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGtTZWN1cml0eUxldmVsW10gPSB7CisgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24sICAgICAgICBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4LAorICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bywgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlRGVjb2RlLAorICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bywgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlLAorICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbH07CisKK2NvbnN0IGNoYXIgKmtNaW1lVHlwZVtdID0geyJ2aWRlby9tcDQiLCAgICJ2aWRlby9tcGVnIiwgICAgInZpZGVvL3gtZmx2IiwgICJ2aWRlby9tajIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvLzNncDIiLCAgInZpZGVvLzNncHAiLCAgICAidmlkZW8vM2dwcDIiLCAgImF1ZGlvL21wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vbXBlZyIsICAiYXVkaW8vYWFjIiwgICAgICJhdWRpby8zZ3AyIiwgICAiYXVkaW8vM2dwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vM2dwcDIiLCAidmlkZW8vdW5rbm93biIsICJhdWRpby91bmtub3duIn07CisKK2NvbnN0IERybVBsdWdpbjo6S2V5VHlwZSBrS2V5VHlwZVtdID0ge0RybVBsdWdpbjo6a0tleVR5cGVfT2ZmbGluZSwgRHJtUGx1Z2luOjprS2V5VHlwZV9TdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OmtLZXlUeXBlX1JlbGVhc2V9OworCitjb25zdCBDcnlwdG9QbHVnaW46Ok1vZGUga0NyeXB0b01vZGVbXSA9IHtDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSLCBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQ307CisKK2NvbnN0IGNoYXIgKmtDaXBoZXJBbGdvcml0aG1bXSA9IHsiQUVTL0NCQy9Ob1BhZGRpbmciLCAiIn07Citjb25zdCBjaGFyICprTWFjQWxnb3JpdGhtW10gPSB7IkhtYWNTSEEyNTYiLCAiIn07Citjb25zdCBjaGFyICprUlNBQWxnb3JpdGhtW10gPSB7IlJTQVNTQS1QU1MtU0hBMSIsICIifTsKK2NvbnN0IHNpemVfdCBrTnVtU2VjdXJpdHlMZXZlbCA9IHNpemUoa1NlY3VyaXR5TGV2ZWwpOworY29uc3Qgc2l6ZV90IGtOdW1NaW1lVHlwZSA9IHNpemUoa01pbWVUeXBlKTsKK2NvbnN0IHNpemVfdCBrTnVtS2V5VHlwZSA9IHNpemUoa0tleVR5cGUpOworY29uc3Qgc2l6ZV90IGtOdW1DcnlwdG9Nb2RlID0gc2l6ZShrQ3J5cHRvTW9kZSk7Citjb25zdCBzaXplX3Qga051bVVVSUQgPSBzaXplKGtVVUlEKTsKK2NvbnN0IHNpemVfdCBrTWF4U3RyaW5nTGVuZ3RoID0gMTAwOworY29uc3Qgc2l6ZV90IGtNYXhTdWJTYW1wbGVzID0gMTA7Citjb25zdCBzaXplX3Qga01heE51bUJ5dGVzID0gMTAwMDsKKworc3RydWN0IERybUxpc3RlbmVyIDogdmlydHVhbCBwdWJsaWMgSURybUNsaWVudCB7CisgICBwdWJsaWM6CisgICAgdm9pZCBzZW5kRXZlbnQoRHJtUGx1Z2luOjpFdmVudFR5cGUgZXZlbnRUeXBlIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJnNlc3Npb25JZCBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICZkYXRhIFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUge30KKworICAgIHZvaWQgc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPHVpbnQ4X3Q+ICZzZXNzaW9uSWQgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyBVTlVTRURfUEFSQU0pIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiAmc2Vzc2lvbklkIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPERybUtleVN0YXR1cz4gJmtleVN0YXR1c0xpc3QgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gJikgb3ZlcnJpZGUge30KKyAgICBEcm1MaXN0ZW5lcigpIHt9CisKKyAgIHByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtTGlzdGVuZXIpOworfTsKKworY2xhc3MgRHJtRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIHZvaWQgaW52b2tlRHJtKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBib29sIGluaXREcm0oKTsKKyAgICB2b2lkIGludm9rZURybUNyZWF0ZVBsdWdpbigpOworICAgIHZvaWQgaW52b2tlRHJtT3BlblNlc3Npb24oKTsKKyAgICB2b2lkIGludm9rZURybVNldExpc3RlbmVyKCk7CisgICAgdm9pZCBpbnZva2VEcm1TZXRBbGdvcml0aG1BUEkoKTsKKyAgICB2b2lkIGludm9rZURybVByb3BlcnR5QVBJKCk7CisgICAgdm9pZCBpbnZva2VEcm1EZWNyeXB0RW5jcnlwdEFQSShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VEcm1TZWN1cmVTdG9wQVBJKCk7CisgICAgdm9pZCBpbnZva2VEcm1PZmZsaW5lTGljZW5zZUFQSSgpOworICAgIHZvaWQgaW52b2tlRHJtQ2xvc2VTZXNzaW9uKCk7CisgICAgdm9pZCBpbnZva2VEcm1EZXN0cm95UGx1Z2luKCk7CisgICAgdm9pZCBpbnZva2VDcnlwdG8oY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgYm9vbCBpbml0Q3J5cHRvKCk7CisgICAgdm9pZCBpbnZva2VDcnlwdG9DcmVhdGVQbHVnaW4oKTsKKyAgICB2b2lkIGludm9rZUNyeXB0b0RlY3J5cHQoY29uc3QgdWludDhfdCAqZGF0YSk7CisgICAgdm9pZCBpbnZva2VDcnlwdG9EZXN0cm95UGx1Z2luKCk7CisgICAgc3A8RHJtSGFsPiBtRHJtID0gbnVsbHB0cjsKKyAgICBzcDxDcnlwdG9IYWw+IG1DcnlwdG8gPSBudWxscHRyOworICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkID0ge307CisgICAgRnV6emVkRGF0YVByb3ZpZGVyICptRnV6emVkRGF0YVByb3ZpZGVyID0gbnVsbHB0cjsKK307CisKK2Jvb2wgRHJtRnV6emVyOjppbml0RHJtKCkgeworICAgIG1Ecm0gPSBuZXcgRHJtSGFsKCk7CisgICAgaWYgKCFtRHJtKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1DcmVhdGVQbHVnaW4oKSB7CisgICAgbURybS0+aW5pdENoZWNrKCk7CisgICAgU3RyaW5nOCBwYWNrYWdlTmFtZShtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW5ndGgpLmNfc3RyKCkpOworICAgIHVpbnQzMl90IHV1aWRFbnVtID0ga1VVSURbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtOdW1VVUlEIC0gMSldOworICAgIHN3aXRjaCAodXVpZEVudW0pIHsKKyAgICAgICAgY2FzZSBJTlZBTElEX1VVSUQ6CisgICAgICAgICAgICBtRHJtLT5jcmVhdGVQbHVnaW4oa0ludmFsaWRVVUlELCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQU1NIX0JPWF9VVUlEOgorICAgICAgICAgICAgbURybS0+Y3JlYXRlUGx1Z2luKGtDb21tb25Qc3NoQm94VVVJRCwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0xFQVJLRVlfVVVJRDoKKyAgICAgICAgICAgIG1Ecm0tPmNyZWF0ZVBsdWdpbihrQ2xlYXJLZXlVVUlELCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybURlc3Ryb3lQbHVnaW4oKSB7IG1Ecm0tPmRlc3Ryb3lQbHVnaW4oKTsgfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlRHJtT3BlblNlc3Npb24oKSB7CisgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWw7CisgICAgYm9vbCBzaG91bGRQYXNzUmFuZG9tU2VjdXJpdHlMZXZlbCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgaWYgKHNob3VsZFBhc3NSYW5kb21TZWN1cml0eUxldmVsKSB7CisgICAgICAgIHNlY3VyaXR5TGV2ZWwgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpTZWN1cml0eUxldmVsPihtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWN1cml0eUxldmVsID0ga1NlY3VyaXR5TGV2ZWxbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgMCwga051bVNlY3VyaXR5TGV2ZWwgLSAxKV07CisgICAgfQorICAgIG1Ecm0tPm9wZW5TZXNzaW9uKHNlY3VyaXR5TGV2ZWwsIG1TZXNzaW9uSWQpOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlRHJtQ2xvc2VTZXNzaW9uKCkgeyBtRHJtLT5jbG9zZVNlc3Npb24obVNlc3Npb25JZCk7IH0KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybVNldExpc3RlbmVyKCkgeworICAgIHNwPERybUxpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcigpOworICAgIG1Ecm0tPnNldExpc3RlbmVyKGxpc3RlbmVyKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybVNldEFsZ29yaXRobUFQSSgpIHsKKyAgICBtRHJtLT5zZXRDaXBoZXJBbGdvcml0aG0obVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrQ2lwaGVyQWxnb3JpdGhtW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCldKSk7CisgICAgbURybS0+c2V0TWFjQWxnb3JpdGhtKG1TZXNzaW9uSWQsIFN0cmluZzgoa01hY0FsZ29yaXRobVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpXSkpOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlRHJtUHJvcGVydHlBUEkoKSB7CisgICAgbURybS0+c2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCgicHJvcGVydHkiKSwgU3RyaW5nOCgidmFsdWUiKSk7CisgICAgU3RyaW5nOCBzdHJpbmdWYWx1ZTsKKyAgICBtRHJtLT5nZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4KCJwcm9wZXJ0eSIpLCBzdHJpbmdWYWx1ZSk7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHZhbHVlID0ge307CisgICAgbURybS0+c2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCgicHJvcGVydHkiKSwgdmFsdWUpOworICAgIFZlY3Rvcjx1aW50OF90PiBieXRlVmFsdWU7CisgICAgbURybS0+Z2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCgicHJvcGVydHkiKSwgYnl0ZVZhbHVlKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybURlY3J5cHRFbmNyeXB0QVBJKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgdWludDMyX3Qgb3BlblNlc3Npb25zID0gMDsKKyAgICB1aW50MzJfdCBtYXhTZXNzaW9ucyA9IDA7CisgICAgbURybS0+Z2V0TnVtYmVyT2ZTZXNzaW9ucygmb3BlblNlc3Npb25zLCAmbWF4U2Vzc2lvbnMpOworCisgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgY29ubmVjdGVkOworICAgIERybVBsdWdpbjo6SGRjcExldmVsIG1heDsKKyAgICBtRHJtLT5nZXRIZGNwTGV2ZWxzKCZjb25uZWN0ZWQsICZtYXgpOworCisgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWw7CisgICAgbURybS0+Z2V0U2VjdXJpdHlMZXZlbChtU2Vzc2lvbklkLCAmc2VjdXJpdHlMZXZlbCk7CisKKyAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgpIHNoYWxsIGZpbGwgaXNTdXBwb3J0ZWQKKyAgICBib29sIGlzU3VwcG9ydGVkOworICAgIFN0cmluZzggbWltZVR5cGUoCisgICAgICAgIGtNaW1lVHlwZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bU1pbWVUeXBlIC0gMSldKTsKKyAgICBtRHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChrQ2xlYXJLZXlVVUlELCBtaW1lVHlwZSwgc2VjdXJpdHlMZXZlbCwgJmlzU3VwcG9ydGVkKTsKKworICAgIC8vIGdldFByb3Zpc2lvblJlcXVlc3QoKSBzaGFsbCBmaWxsIGxlZ2FjeVJlcXVlc3QgYW5kIGxlZ2FjeURlZmF1bHRVcmwKKyAgICBTdHJpbmc4IGNlcnRpZmljYXRlVHlwZSgKKyAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpKTsKKyAgICBTdHJpbmc4IGNlcnRBdXRob3JpdHkobUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKS5jX3N0cigpKTsKKyAgICBWZWN0b3I8dWludDhfdD4gbGVnYWN5UmVxdWVzdCA9IHt9OworICAgIFN0cmluZzggbGVnYWN5RGVmYXVsdFVybDsKKyAgICBtRHJtLT5nZXRQcm92aXNpb25SZXF1ZXN0KGNlcnRpZmljYXRlVHlwZSwgY2VydEF1dGhvcml0eSwgbGVnYWN5UmVxdWVzdCwgbGVnYWN5RGVmYXVsdFVybCk7CisKKyAgICAvLyBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoKSBzaGFsbCBmaWxsIGNlcnRpZmljYXRlIGFuZCB3cmFwcGVkS2V5CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHByb3Zpc2lvblJlc3BvbnNlID0ge307CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGNlcnRpZmljYXRlID0ge307CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHdyYXBwZWRLZXkgPSB7fTsKKyAgICBtRHJtLT5wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UocHJvdmlzaW9uUmVzcG9uc2UsIGNlcnRpZmljYXRlLCB3cmFwcGVkS2V5KTsKKworICAgIC8vIGdldEtleVJlcXVlc3QoKSBzaGFsbCBmaWxsIGtleVJlcXVlc3QsIGRlZmF1bHRVcmwgYW5kIGtleVJlcXVlc3RUeXBlCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGluaXREYXRhID0ge307CisgICAgaW5pdERhdGEuYXBwZW5kQXJyYXkoZGF0YSwgc2l6ZSk7CisgICAgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGU7CisgICAgYm9vbCBzaG91bGRQYXNzUmFuZG9tS2V5VHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgaWYgKHNob3VsZFBhc3NSYW5kb21LZXlUeXBlKSB7CisgICAgICAgIGtleVR5cGUgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OktleVR5cGU+KG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGtleVR5cGUgPSBrS2V5VHlwZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bUtleVR5cGUgLSAxKV07CisgICAgfQorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1kT3B0aW9uYWxQYXJhbWV0ZXJzID0ge307CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVJlcXVlc3QgPSB7fTsKKyAgICBTdHJpbmc4IGRlZmF1bHRVcmw7CisgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZTsKKyAgICBtRHJtLT5nZXRLZXlSZXF1ZXN0KG1TZXNzaW9uSWQsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIGtleVJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsLCAma2V5UmVxdWVzdFR5cGUpOworCisgICAgLy8gcHJvdmlkZUtleVJlc3BvbnNlKCkgc2hhbGwgZmlsbCBrZXlTZXRJZAorICAgIFZlY3Rvcjx1aW50OF90PiBrZXlSZXNwb25zZSA9IHt9OworICAgIGtleVJlc3BvbnNlLmFwcGVuZEFycmF5KGRhdGEsIHNpemUpOworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZCA9IHt9OworICAgIG1Ecm0tPnByb3ZpZGVLZXlSZXNwb25zZShtU2Vzc2lvbklkLCBrZXlSZXNwb25zZSwga2V5U2V0SWQpOworCisgICAgLy8gcmVzdG9yZUtleXMKKyAgICBtRHJtLT5yZXN0b3JlS2V5cyhtU2Vzc2lvbklkLCBrZXlTZXRJZCk7CisKKyAgICAvLyBxdWVyeUtleVN0YXR1cygpIHNoYWxsIGZpbGwgaW5mb01hcAorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGluZm9NYXAgPSB7fTsKKyAgICBtRHJtLT5xdWVyeUtleVN0YXR1cyhtU2Vzc2lvbklkLCBpbmZvTWFwKTsKKworICAgIC8vIGRlY3J5cHQoKSBzaGFsbCBmaWxsIG91dHB1dFZlYworICAgIFZlY3Rvcjx1aW50OF90PiBrZXlJZFZlYyA9IHt9OworICAgIGtleUlkVmVjLmFwcGVuZEFycmF5KGRhdGEsIHNpemUpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGlucHV0VmVjID0ge307CisgICAgaW5wdXRWZWMuYXBwZW5kQXJyYXkoZGF0YSwgc2l6ZSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gaXZWZWMgPSB7fTsKKyAgICBpdlZlYy5hcHBlbmRBcnJheShkYXRhLCBzaXplKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBvdXRwdXRWZWMgPSB7fTsKKyAgICBtRHJtLT5kZWNyeXB0KG1TZXNzaW9uSWQsIGtleUlkVmVjLCBpbnB1dFZlYywgaXZWZWMsIG91dHB1dFZlYyk7CisKKyAgICAvLyBlbmNyeXB0KCkgc2hhbGwgZmlsbCBvdXRwdXRWZWMKKyAgICBtRHJtLT5lbmNyeXB0KG1TZXNzaW9uSWQsIGtleUlkVmVjLCBpbnB1dFZlYywgaXZWZWMsIG91dHB1dFZlYyk7CisKKyAgICAvLyBzaWduKCkgc2hhbGwgZmlsbCBzaWduYXR1cmUKKyAgICBWZWN0b3I8dWludDhfdD4gbWVzc2FnZSA9IHt9OworICAgIG1lc3NhZ2UuYXBwZW5kQXJyYXkoZGF0YSwgc2l6ZSk7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNpZ25hdHVyZSA9IHt9OworICAgIG1Ecm0tPnNpZ24obVNlc3Npb25JZCwga2V5SWRWZWMsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CisKKyAgICAvLyB2ZXJpZnkoKSBzaGFsbCBmaWxsIG1hdGNoCisgICAgYm9vbCBtYXRjaDsKKyAgICBtRHJtLT52ZXJpZnkobVNlc3Npb25JZCwga2V5SWRWZWMsIG1lc3NhZ2UsIHNpZ25hdHVyZSwgbWF0Y2gpOworCisgICAgLy8gc2lnblJTQSgpIHNoYWxsIGZpbGwgc2lnbmF0dXJlCisgICAgbURybS0+c2lnblJTQShtU2Vzc2lvbklkLCBTdHJpbmc4KGtSU0FBbGdvcml0aG1bbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKV0pLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgd3JhcHBlZEtleSwgc2lnbmF0dXJlKTsKKworICAgIG1Ecm0tPnJlbW92ZUtleXMobVNlc3Npb25JZCk7Cit9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VEcm1TZWN1cmVTdG9wQVBJKCkgeworICAgIC8vIGdldFNlY3VyZVN0b3BzKCkgc2hhbGwgZmlsbCBzZWN1cmVTdG9wcworICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiBzZWN1cmVTdG9wcyA9IHt9OworICAgIG1Ecm0tPmdldFNlY3VyZVN0b3BzKHNlY3VyZVN0b3BzKTsKKworICAgIC8vIGdldFNlY3VyZVN0b3BJZHMoKSBzaGFsbCBmaWxsIHNlY3VyZVN0b3BJZHMKKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gc2VjdXJlU3RvcElkcyA9IHt9OworICAgIG1Ecm0tPmdldFNlY3VyZVN0b3BJZHMoc2VjdXJlU3RvcElkcyk7CisKKyAgICAvLyBnZXRTZWN1cmVTdG9wKCkgc2hhbGwgZmlsbCBzZWN1cmVTdG9wCisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNzaWQgPSB7fTsKKyAgICBWZWN0b3I8dWludDhfdD4gc2VjdXJlU3RvcCA9IHt9OworICAgIG1Ecm0tPmdldFNlY3VyZVN0b3Aoc3NpZCwgc2VjdXJlU3RvcCk7CisKKyAgICBtRHJtLT5yZW1vdmVTZWN1cmVTdG9wKHNzaWQpOworCisgICAgbURybS0+cmVsZWFzZVNlY3VyZVN0b3BzKHNzaWQpOworCisgICAgbURybS0+cmVtb3ZlQWxsU2VjdXJlU3RvcHMoKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybU9mZmxpbmVMaWNlbnNlQVBJKCkgeworICAgIC8vIGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKCkgc2hhbGwga2V5U2V0SWRzCisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkcyA9IHt9OworICAgIG1Ecm0tPmdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisKKyAgICAvLyBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKCkgc2hhbGwgZmlsbCBzdGF0ZQorICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCBrZXlTZXRJZE9mZmxpbmVMaWNlbnNlID0ge307CisgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHN0YXRlOworICAgIG1Ecm0tPmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoa2V5U2V0SWRPZmZsaW5lTGljZW5zZSwgJnN0YXRlKTsKKworICAgIG1Ecm0tPnJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkT2ZmbGluZUxpY2Vuc2UpOworfQorCitib29sIERybUZ1enplcjo6aW5pdENyeXB0bygpIHsKKyAgICBtQ3J5cHRvID0gbmV3IENyeXB0b0hhbCgpOworICAgIGlmICghbUNyeXB0bykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlQ3J5cHRvQ3JlYXRlUGx1Z2luKCkgeworICAgIG1DcnlwdG8tPmluaXRDaGVjaygpOworCisgICAgbUNyeXB0by0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoa0NsZWFyS2V5VVVJRCk7CisgICAgbUNyeXB0by0+Y3JlYXRlUGx1Z2luKGtDbGVhcktleVVVSUQsIE5VTEwsIDApOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlQ3J5cHRvRGVzdHJveVBsdWdpbigpIHsgbUNyeXB0by0+ZGVzdHJveVBsdWdpbigpOyB9CisKK3ZvaWQgRHJtRnV6emVyOjppbnZva2VDcnlwdG9EZWNyeXB0KGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICBtQ3J5cHRvLT5yZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCisgICAgICAgIGtNaW1lVHlwZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bU1pbWVUeXBlIC0gMSldKTsKKworICAgIHVpbnQzMl90IHdpZHRoID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworCisgICAgbUNyeXB0by0+c2V0TWVkaWFEcm1TZXNzaW9uKG1TZXNzaW9uSWQpOworCisgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4gPSB7MCwgMH07CisKKyAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigxLCBrTWF4U3ViU2FtcGxlcyk7CisKKyAgICBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSBzdWJTYW1wbGVzW251bVN1YlNhbXBsZXNdOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdWJTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgY2xlYXJCeXRlcyA9CisgICAgICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCBrTWF4TnVtQnl0ZXMpOworICAgICAgICB1aW50MzJfdCBlbmNyeXB0ZWRCeXRlcyA9CisgICAgICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCBrTWF4TnVtQnl0ZXMpOworICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhID0gY2xlYXJCeXRlczsKKyAgICAgICAgc3ViU2FtcGxlc1tpXS5tTnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPSBlbmNyeXB0ZWRCeXRlczsKKyAgICAgICAgdG90YWxTaXplICs9IHN1YlNhbXBsZXNbaV0ubU51bUJ5dGVzT2ZDbGVhckRhdGE7CisgICAgICAgIHRvdGFsU2l6ZSArPSBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3QgaGVhcFNpemUgPSB0b3RhbFNpemUgKiAyOworICAgIHNwPE1lbW9yeURlYWxlcj4gZGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihoZWFwU2l6ZSwgIkRybUZ1enplck1lbW9yeSIpOworICAgIGlmICghZGVhbGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxIaWRsTWVtb3J5PiBoZWFwID0gZnJvbUhlYXAoZGVhbGVyLT5nZXRNZW1vcnlIZWFwKCkpOworICAgIGlmICghaGVhcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBoZWFwU2VxTnVtID0gbUNyeXB0by0+c2V0SGVhcChoZWFwKTsKKyAgICBpZiAoaGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBzZWdtZW50SW5kZXggPSAwOworICAgIGNvbnN0IHVpbnQ4X3Qga2V5SWRbQUVTX0JMT0NLX1NJWkVdID0ge307CisgICAgbWVtY3B5KCh2b2lkICopa2V5SWQsIGRhdGEsIEFFU19CTE9DS19TSVpFKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgaXZbQUVTX0JMT0NLX1NJWkVdID0ge307CisgICAgbWVtc2V0KCh2b2lkICopaXYsIDAsIEFFU19CTE9DS19TSVpFKTsKKworICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciBzb3VyY2VCdWZmZXIgPSB7LmJ1ZmZlcklkID0gc2VnbWVudEluZGV4LCAub2Zmc2V0ID0gMCwgLnNpemUgPSB0b3RhbFNpemV9OworCisgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXIgZGVzdEJ1ZmZlciA9IHsKKyAgICAgICAgLnR5cGUgPSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZLAorICAgICAgICB7LmJ1ZmZlcklkID0gc2VnbWVudEluZGV4LCAub2Zmc2V0ID0gdG90YWxTaXplLCAuc2l6ZSA9IHRvdGFsU2l6ZX0sCisgICAgICAgIC5zZWN1cmVNZW1vcnkgPSBudWxscHRyfTsKKworICAgIGNvbnN0IHVpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cgPSBudWxscHRyOworICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlOworICAgIGJvb2wgc2hvdWxkUGFzc1JhbmRvbUNyeXB0b01vZGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgIGlmIChzaG91bGRQYXNzUmFuZG9tQ3J5cHRvTW9kZSkgeworICAgICAgICBtb2RlID0gc3RhdGljX2Nhc3Q8Q3J5cHRvUGx1Z2luOjpNb2RlPihtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb2RlID0KKyAgICAgICAgICAgIGtDcnlwdG9Nb2RlW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBrTnVtQ3J5cHRvTW9kZSAtIDEpXTsKKyAgICB9CisgICAgbUNyeXB0by0+ZGVjcnlwdChrZXlJZCwgaXYsIG1vZGUsIHBhdHRlcm4sIHNvdXJjZUJ1ZmZlciwgb2Zmc2V0LCBzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgZGVzdEJ1ZmZlciwgZXJyb3JEZXRhaWxNc2cpOworCisgICAgaWYgKGhlYXBTZXFOdW0gPj0gMCkgeworICAgICAgICBtQ3J5cHRvLT51bnNldEhlYXAoaGVhcFNlcU51bSk7CisgICAgfQorICAgIGhlYXAuY2xlYXIoKTsKK30KKwordm9pZCBEcm1GdXp6ZXI6Omludm9rZURybShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmICghaW5pdERybSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW52b2tlRHJtQ3JlYXRlUGx1Z2luKCk7CisgICAgaW52b2tlRHJtT3BlblNlc3Npb24oKTsKKyAgICBpbnZva2VEcm1TZXRBbGdvcml0aG1BUEkoKTsKKyAgICBpbnZva2VEcm1TZXRMaXN0ZW5lcigpOworICAgIGludm9rZURybVByb3BlcnR5QVBJKCk7CisgICAgaW52b2tlRHJtRGVjcnlwdEVuY3J5cHRBUEkoZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlRHJtU2VjdXJlU3RvcEFQSSgpOworICAgIGludm9rZURybU9mZmxpbmVMaWNlbnNlQVBJKCk7CisgICAgaW52b2tlRHJtQ2xvc2VTZXNzaW9uKCk7CisgICAgaW52b2tlRHJtRGVzdHJveVBsdWdpbigpOworfQorCit2b2lkIERybUZ1enplcjo6aW52b2tlQ3J5cHRvKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIHsKKyAgICBpZiAoIWluaXRDcnlwdG8oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludm9rZUNyeXB0b0NyZWF0ZVBsdWdpbigpOworICAgIGludm9rZUNyeXB0b0RlY3J5cHQoZGF0YSk7CisgICAgaW52b2tlQ3J5cHRvRGVzdHJveVBsdWdpbigpOworfQorCit2b2lkIERybUZ1enplcjo6cHJvY2Vzcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBuZXcgRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGludm9rZURybShkYXRhLCBzaXplKTsKKyAgICBpbnZva2VDcnlwdG8oZGF0YSk7CisgICAgZGVsZXRlIG1GdXp6ZWREYXRhUHJvdmlkZXI7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IEFFU19CTE9DS19TSVpFKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBEcm1GdXp6ZXIgZHJtRnV6emVyOworICAgIGRybUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9DcnlwdG9IYWwuaAppbmRleCBjOWZkYTY3Li41ZmQzOWU2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9DcnlwdG9IYWwuaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9DcnlwdG9IYWwuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b1BsdWdpbi5oPgogCiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC03MSw2ICs3Miw4IEBACiAgICAgfQogICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExvZ01lc3NhZ2VzKFZlY3Rvcjxkcm06OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSBjb25zdDsKKwogcHJpdmF0ZToKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWwuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oCmluZGV4IDNiNDYzOWIuLjdlYjFkZWMgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oCkBAIC0yNSw3ICsyNSwxMCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgpAQCAtMTc2LDYgKzE3OSwxNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVxdWlyZWQpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja0lkKAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF5YmFja0lkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9nTWVzc2FnZXMoVmVjdG9yPGRybTo6VjFfNDo6TG9nTWVzc2FnZT4gJmxvZ3MpIGNvbnN0OworCiAgICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKICAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7CkBAIC0yMDIsNiArMjE2LDcgQEAKICAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwogICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7CiAgICAgc3A8ZHJtOjpWMV8yOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMjsKKyAgICBzcDxkcm06OlYxXzQ6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV80OwogICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwogCiAgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgpAQCAtMjI1LDggKzI0MCw4IEBACiAKICAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOwogCi0gICAgdm9pZCByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7Ci0gICAgdm9pZCByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3Q7CisgICAgc3RkOjpzdHJpbmcgcmVwb3J0UGx1Z2luTWV0cmljcygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBsdWdpbk1ldHJpY3MpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKaW5kZXggOWU0MzUwNC4uYzU2YmYwMSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCkBAIC02Miw3ICs2Miw3IEBACiAgICAgdm9pZCByZW1vdmVTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKICAgICBib29sIHJlY2xhaW1TZXNzaW9uKGludCBjYWxsaW5nUGlkKTsKIAotICAgIC8vIHNhbml0eSBjaGVjayBBUElzCisgICAgLy8gaW5zcGVjdGlvbiBBUElzCiAgICAgc2l6ZV90IGdldFNlc3Npb25Db3VudCgpIGNvbnN0OwogICAgIGJvb2wgY29udGFpbnNTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSBjb25zdDsKIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCmluZGV4IDAxNzdjMjQuLmE4ODc4NGQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JRHJtLmgKQEAgLTI0LDYgKzI0LDE1IEBACiAjZGVmaW5lIEFORFJPSURfSURSTV9IXwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfNCB7CitzdHJ1Y3QgTG9nTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBWMV80Cit9ICAvLyBuYW1lc3BhY2UgZHJtCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKIAogc3RydWN0IEFTdHJpbmc7CiAKQEAgLTE0NSw2ICsxNTQsMTcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TGlzdGVuZXIoY29uc3Qgc3A8SURybUNsaWVudD4mIGxpc3RlbmVyKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVpcmVzU2VjdXJlRGVjb2Rlcihjb25zdCBjaGFyICptaW1lLCBib29sICpyZXF1aXJlZCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1aXJlc1NlY3VyZURlY29kZXIoY29uc3QgY2hhciAqbWltZSwgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqcmVxdWlyZWQpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tJZCgKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgY2hhciAqcGxheWJhY2tJZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgSURybSgpIHt9CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vRHJtVXRpbHMuaCBiL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vRHJtVXRpbHMuaAppbmRleCAyMGIzZmU5Li5lYzBiODc4IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0RybVV0aWxzLmgKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9Ecm1VdGlscy5oCkBAIC0xOSwxMSArMTksMzAgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzIsNiArNTEsNjEgQEAKIAogbmFtZXNwYWNlIERybVV0aWxzIHsKIAorLy8gTG9nIEFQSXMKK2NsYXNzIExvZ0J1ZmZlciB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9DQVBBQ0lUWSA9IDEwMDsKKyAgICB2b2lkIGFkZExvZyhjb25zdCA6OlYxXzQ6OkxvZ01lc3NhZ2UgJmxvZyk7CisgICAgVmVjdG9yPDo6VjFfNDo6TG9nTWVzc2FnZT4gZ2V0TG9ncygpOworCisgIHByaXZhdGU6CisgICAgc3RkOjpkZXF1ZTw6OlYxXzQ6OkxvZ01lc3NhZ2U+IG1CdWZmZXI7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7Cit9OworCitleHRlcm4gTG9nQnVmZmVyIGdMb2dCdWY7CisKK3N0YXRpYyBpbmxpbmUgaW50IGZvcm1hdEJ1ZmZlcihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICptc2cpIHsKKyAgICByZXR1cm4gc25wcmludGYoYnVmLCBzaXplLCAiJXMiLCBtc2cpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3QsIHR5cGVuYW1lLi4uIEFyZ3M+CitzdGF0aWMgaW5saW5lIGludCBmb3JtYXRCdWZmZXIoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCBGaXJzdCBmaXJzdCwgQXJncy4uLiBhcmdzKSB7CisgICAgcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc2l6ZSwgZm10LCBmaXJzdCwgYXJncy4uLik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgordm9pZCBMb2dUb0J1ZmZlcihhbmRyb2lkX0xvZ1ByaW9yaXR5IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIEFyZ3MuLi4gYXJncykgeworICAgIGNvbnN0IGludCBMT0dfQlVGX1NJWkUgPSAyNTY7CisgICAgY2hhciBidWZbTE9HX0JVRl9TSVpFXTsKKyAgICBpbnQgbGVuID0gZm9ybWF0QnVmZmVyKGJ1ZiwgTE9HX0JVRl9TSVpFLCBmbXQsIGFyZ3MuLi4pOworICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUobGV2ZWwsIExPR19UQUcsIGJ1Zik7CisgICAgaWYgKGxldmVsID49IEFORFJPSURfTE9HX0lORk8pIHsKKyAgICAgICAgaW50NjRfdCBlcG9jaFRpbWVNcyA9CisgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpIC8gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxKTsKKyAgICAgICAgZ0xvZ0J1Zi5hZGRMb2coe2Vwb2NoVGltZU1zLCBzdGF0aWNfY2FzdDw6OlYxXzQ6OkxvZ1ByaW9yaXR5PihsZXZlbCksIGJ1Zn0pOworICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Cit2b2lkIExvZ1RvQnVmZmVyKGFuZHJvaWRfTG9nUHJpb3JpdHkgbGV2ZWwsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IGNoYXIgKmZtdCwgQXJncy4uLiBhcmdzKSB7CisgICAgY29uc3QgdWludDY0X3QqIHV1aWQyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50NjRfdCo+KHV1aWQpOworICAgIHN0ZDo6c3RyaW5nIHV1aWRGbXQoInV1aWQ9WyVseCAlbHhdICIpOworICAgIHV1aWRGbXQgKz0gZm10OworICAgIExvZ1RvQnVmZmVyKGxldmVsLCB1dWlkRm10LmNfc3RyKCksIGh0b2JlNjQodXVpZDJbMF0pLCBodG9iZTY0KHV1aWQyWzFdKSwgYXJncy4uLik7Cit9CisKKyNpZm5kZWYgTE9HMkJFCisjZGVmaW5lIExPRzJCRSguLi4pIExvZ1RvQnVmZmVyKEFORFJPSURfTE9HX0VSUk9SLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTE9HMkJXKC4uLikgTG9nVG9CdWZmZXIoQU5EUk9JRF9MT0dfV0FSTiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExPRzJCSSguLi4pIExvZ1RvQnVmZmVyKEFORFJPSURfTE9HX0lORk8sIF9fVkFfQVJHU19fKQorI2RlZmluZSBMT0cyQkQoLi4uKSBMb2dUb0J1ZmZlcihBTkRST0lEX0xPR19ERUJVRywgX19WQV9BUkdTX18pCisjZGVmaW5lIExPRzJCViguLi4pIExvZ1RvQnVmZmVyKEFORFJPSURfTE9HX1ZFUkJPU0UsIF9fVkFfQVJHU19fKQorI2VuZGlmCisKIGJvb2wgVXNlRHJtU2VydmljZSgpOwogCiBzcDxJRHJtPiBNYWtlRHJtKHN0YXR1c190ICpwc3RhdHVzID0gbnVsbHB0cik7CkBAIC05MSw4ICsxNjUsNzQgQEAKIHN0ZDo6dmVjdG9yPHNwPDo6VjFfMDo6SUNyeXB0b1BsdWdpbj4+IE1ha2VDcnlwdG9QbHVnaW5zKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IGluaXREYXRhU2l6ZSk7CiAKK3N0YXR1c190IHRvU3RhdHVzVF8xXzQoOjpWMV80OjpTdGF0dXMgc3RhdHVzKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUz4KK2lubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUyBzdGF0dXMpIHsKKyAgICBhdXRvIGVyciA9IHN0YXRpY19jYXN0PDo6VjFfNDo6U3RhdHVzPihzdGF0dXMpOworICAgIHJldHVybiB0b1N0YXR1c1RfMV80KGVycik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKGNvbnN0IGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48VD4gJnN0YXR1cykgeworICAgIGF1dG8gdCA9IHN0YXRpY19jYXN0PFQ+KHN0YXR1cyk7CisgICAgYXV0byBlcnIgPSBzdGF0aWNfY2FzdDw6OlYxXzQ6OlN0YXR1cz4odCk7CisgICAgcmV0dXJuIHRvU3RhdHVzVF8xXzQoZXJyKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0YXR1c190IEdldExvZ01lc3NhZ2VzKGNvbnN0IHNwPFU+ICZvYmosIFZlY3Rvcjw6OlYxXzQ6OkxvZ01lc3NhZ2U+ICZsb2dzKSB7CisgICAgc3A8VD4gcGx1Z2luID0gVDo6Y2FzdEZyb20ob2JqKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgTE9HMkJXKCIlcyBvYmogaXMgbnVsbCIsIFU6OmRlc2NyaXB0b3IpOworICAgIH0gZWxzZSBpZiAocGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgTE9HMkJXKCJDYW5ub3QgY2FzdCAlcyBvYmogdG8gJXMgcGx1Z2luIiwgVTo6ZGVzY3JpcHRvciwgVDo6ZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgOjpWMV80OjpTdGF0dXMgZXJye307CisgICAgc3RkOjp2ZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBwbHVnaW5Mb2dzOworICAgIDo6VjFfNDo6SURybVBsdWdpbjo6Z2V0TG9nTWVzc2FnZXNfY2IgY2IgPSBbJl0oCisgICAgICAgICAgICA6OlYxXzQ6OlN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBoaWRsX3ZlYzw6OlYxXzQ6OkxvZ01lc3NhZ2U+IGhMb2dzKSB7CisgICAgICAgIGlmICg6OlYxXzQ6OlN0YXR1czo6T0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGx1Z2luTG9ncy5hc3NpZ24oaExvZ3MuZGF0YSgpLCBoTG9ncy5kYXRhKCkgKyBoTG9ncy5zaXplKCkpOworICAgIH07CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IHBsdWdpbi0+Z2V0TG9nTWVzc2FnZXMoY2IpOworICAgIH0KKyAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRzJCVygiJXM6OmdldExvZ01lc3NhZ2VzIHJlbW90ZSBjYWxsIGZhaWxlZCAlcyIsCisgICAgICAgICAgICAgICBUOjpkZXNjcmlwdG9yLCBoUmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgYXV0byBhbGxMb2dzKGdMb2dCdWYuZ2V0TG9ncygpKTsKKyAgICBMT0cyQkQoImZyYW1ld29yayBsb2dzIHNpemUgJXp1OyBwbHVnaW4gbG9ncyBzaXplICV6dSIsCisgICAgICAgICAgIGFsbExvZ3Muc2l6ZSgpLCBwbHVnaW5Mb2dzLnNpemUoKSk7CisgICAgc3RkOjpjb3B5KHBsdWdpbkxvZ3MuYmVnaW4oKSwgcGx1Z2luTG9ncy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKGFsbExvZ3MpKTsKKyAgICBzdGQ6OnNvcnQoYWxsTG9ncy5iZWdpbigpLCBhbGxMb2dzLmVuZCgpLAorICAgICAgICAgICAgICBbXShjb25zdCA6OlYxXzQ6OkxvZ01lc3NhZ2UgJmEsIGNvbnN0IDo6VjFfNDo6TG9nTWVzc2FnZSAmYikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudGltZU1zIDwgYi50aW1lTXM7CisgICAgICAgICAgICAgIH0pOworCisgICAgbG9ncy5hcHBlbmRWZWN0b3IoYWxsTG9ncyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGQ6OnN0cmluZyBHZXRFeGNlcHRpb25NZXNzYWdlKHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncyk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBHZXRFeGNlcHRpb25NZXNzYWdlKHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqbXNnLCBjb25zdCBzcDxUPiAmaWZhY2UpIHsKKyAgICBWZWN0b3I8OjpWMV80OjpMb2dNZXNzYWdlPiBsb2dzOworICAgIGlmYWNlLT5nZXRMb2dNZXNzYWdlcyhsb2dzKTsKKyAgICByZXR1cm4gR2V0RXhjZXB0aW9uTWVzc2FnZShlcnIsIG1zZywgbG9ncyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIERybVV0aWxzCi0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQogI2VuZGlmIC8vIEFORFJPSURfRFJNVVRJTFNfSApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9JQ3J5cHRvLmggYi9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0lDcnlwdG8uaAppbmRleCBkZjk4MGFlLi4yYzRkZjYwIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0lDcnlwdG8uaAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW50ZXJmYWNlL21lZGlhZHJtL0lDcnlwdG8uaApAQCAtMzIsNiArMzIsMTAgQEAKIHN0cnVjdCBTaGFyZWRCdWZmZXI7CiBzdHJ1Y3QgRGVzdGluYXRpb25CdWZmZXI7CiB9ICAvLyBuYW1lc3BhY2UgVjFfMAorCituYW1lc3BhY2UgVjFfNCB7CitzdHJ1Y3QgTG9nTWVzc2FnZTsKK30gIC8vIG5hbWVzcGFjZSBWMV80CiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCkBAIC04Myw2ICs4Nyw4IEBACiAgICAgdmlydHVhbCBpbnQzMl90IHNldEhlYXAoY29uc3Qgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+JiBoZWFwKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2dNZXNzYWdlcyhWZWN0b3I8ZHJtOjpWMV80OjpMb2dNZXNzYWdlPiAmbG9ncykgY29uc3QgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgSUNyeXB0bygpIHt9CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icCBiL2RybS9saWJtZWRpYWRybS9wcm90b3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQyMzdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Byb3Rvcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBkcm0gbWV0cmljcyBjb25maWd1cmVkIGZvciBwcm90b2J1ZiBmdWxsIG9uIGhvc3QuCisvLyBJdCBpcyB1c2VkIGJ5IHRoZSBtZXRyaWNzX2R1bXAgdG9vbC4KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliZHJtX21ldHJpY3NfcHJvdG9zX2Z1bGxfaG9zdCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWyJleHRlcm5hbC9wcm90b2J1Zi9zcmMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1ldHJpY3MucHJvdG8iLAorICAgIF0sCisKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImZ1bGwiLAorICAgIH0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBlcnJvci4gVGhpcyBlcnJvciBvY2N1cnMKKyAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2NTI5Mzg3Li45MjY3ZTc5IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDE0IEBACiAvLyBCdWlsZCBkZWZpbml0aW9ucyBmb3IgdW5pdCB0ZXN0cy4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiQ291bnRlck1ldHJpY190ZXN0IiwKICAgICBzcmNzOiBbIkNvdW50ZXJNZXRyaWNfdGVzdC5jcHAiXSwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9BbmRyb2lkLmJwCmluZGV4IDAxMTNjYjguLjU2OWNkYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmNsZWFya2V5Y2FzcGx1Z2luIiwKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKaW5kZXggY2I2OWY5MS4uNDY2ZTU3MSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcAorKysgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCkBAIC02Miw4ICs2Miw4IEBACiAgICAgfQogICAgIEFMT0dWKCJkZXNjcmlwdG9yX3NpemU9JXp1IiwgY29udGFpbmVyLmRlc2NyaXB0b3Jfc2l6ZSgpKTsKIAotICAgIC8vIFNhbml0eSBjaGVjayB0byB2ZXJpZnkgdGhhdCB0aGUgQnJvYWRjYXN0RW5jcnlwdG9yIGlzIHNlbmRpbmcgYSBwcm9wZXJseQotICAgIC8vIGZvcm1lZCBFY21Db250YWluZXIuIElmIGl0IGNvbnRhaW5zIHR3byBFY21zLCB0aGUgaWRzIHNob3VsZCBoYXZlIGRpZmZlcmVudAorICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIEJyb2FkY2FzdEVuY3J5cHRvciBpcyBzZW5kaW5nIGEgcHJvcGVybHkgZm9ybWVkCisgICAgLy8gRWNtQ29udGFpbmVyLiBJZiBpdCBjb250YWlucyB0d28gRWNtcywgdGhlIGlkcyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQKICAgICAvLyBwYXJpdHkgKG9uZSBvZGQsIG9uZSBldmVuKS4gVGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBhZmZlY3QgZGVjcnlwdGlvbgogICAgIC8vIGJ1dCBpbmRpY2F0ZXMgYSBwcm9ibGVtIHdpdGggRWNtIGdlbmVyYXRpb24uCiAgICAgaWYgKGNvbnRhaW5lci5kZXNjcmlwdG9yX3NpemUoKSA9PSAyKSB7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleVNlc3Npb25MaWJyYXJ5LmgKaW5kZXggYTUzN2U2My4uN2M2ZDg2YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5U2Vzc2lvbkxpYnJhcnkuaApAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RydWN0IEFCdWZmZXI7CkBAIC0zMCw3ICsyOSw3IEBACiBuYW1lc3BhY2UgY2xlYXJrZXljYXMgewogY2xhc3MgS2V5RmV0Y2hlcjsKIAotY2xhc3MgQ2xlYXJLZXlDYXNTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgQ2xlYXJLZXlDYXNTZXNzaW9uIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBDbGVhcktleUNhc1Nlc3Npb24oQ2FzUGx1Z2luICpwbHVnaW4pOwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icAppbmRleCA1NzU4NjNjLi45YWQ4ZDFlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkNsZWFyS2V5RmV0Y2hlclRlc3QiLAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKaW5kZXggZThhM2M2Zi4uNmY2OGM3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1vY2tjYXNwbHVnaW4iLAogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDJjNjc0ZTEuLjdlZDhiODggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGliY2xlYXJrZXljb21tb24iLAogICAgIHZlbmRvcjogdHJ1ZSwKQEAgLTM1LDQgKzQ0LDMgQEAKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICB9LAogfQotCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggOTgwM2QzMi4uNGI1Mzg5YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmRybWNsZWFya2V5cGx1Z2luIiwKICAgICB2ZW5kb3I6IHRydWUsCkBAIC02MCw0ICs2OSwzIEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KLQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Kc29uV2ViS2V5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvSnNvbldlYktleS5jcHAKaW5kZXggNTNmZmFlNC4uYTJkNTA2ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9Kc29uV2ViS2V5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0pzb25XZWJLZXkuY3BwCkBAIC02MSw3ICs2MSw3IEBACiAgICAgLy8gYWxsIHRoZSBiYXNlNjQgZW5jb2RlZCBrZXlzLiBFYWNoIGtleSBpcyBhbHNvIHN0b3JlZCBzZXBhcmF0ZWx5IGFzCiAgICAgLy8gYSBKU09OIG9iamVjdCBpbiBtSnNvbk9iamVjdHNbMS4ubl0gd2hlcmUgbiBpcyB0aGUgdG90YWwKICAgICAvLyBudW1iZXIgb2Yga2V5cyBpbiB0aGUgc2V0LgotICAgIGlmICghaXNKc29uV2ViS2V5U2V0KG1Kc29uT2JqZWN0c1swXSkpIHsKKyAgICBpZiAobUpzb25PYmplY3RzLnNpemUoKSA9PSAwIHx8ICFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNDQxOTg2NS4uYjk3ZTkyNCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvdGVzdHMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsMTUgQEAKIC8vIEJ1aWxkcyBDbGVhcktleSBEcm0gVGVzdHMKIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkNsZWFyS2V5RHJtVW5pdFRlc3QiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAppbmRleCAwYWM4NzljLi5lMDNhODk2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Flc0N0ckRlY3J5cHRvci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icAppbmRleCBjNmFmYTYwLi42YzY4NTMyIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxOSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCisvLyAqKiogVEhJUyBQQUNLQUdFIEhBUyBTUEVDSUFMIExJQ0VOU0lORyBDT05ESVRJT05TLiAgUExFQVNFCisvLyAgICAgQ09OU1VMVCBUSEUgT1dORVJTIEFORCBvcGVuc291cmNlLWxpY2Vuc2luZ0Bnb29nbGUuY29tIEJFRk9SRQorLy8gICAgIERFUEVORElORyBPTiBJVCBJTiBZT1VSIFBST0pFQ1QuICoqKgorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBsZWdhY3lfYnlfZXhjZXB0aW9uX29ubHkgKGJ5IGV4Y2VwdGlvbiBvbmx5KQorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIiwKICAgICB2ZW5kb3I6IHRydWUsCkBAIC00NCw2ICs1Nyw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKQEAgLTk3LDE4ICsxMTEsMTggQEAKIH0KIAogY2NfYmluYXJ5IHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkiLAorICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleSIsCiAgICAgZGVmYXVsdHM6IFsiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsic2VydmljZS5jcHAiXSwKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnJjIl0sCi0gICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkueG1sIl0sCiB9CiAKIGNjX2JpbmFyeSB7Ci0gICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAotICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjMtc2VydmljZS5jbGVhcmtleSJdLAorICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5IiwKKyAgICBvdmVycmlkZXM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UuY2xlYXJrZXkiXSwKICAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJzZXJ2aWNlTGF6eS5jcHAiXSwKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMy1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMiXSwKLSAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4zLXNlcnZpY2UuY2xlYXJrZXkueG1sIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIl0sCisgICAgdmludGZfZnJhZ21lbnRzOiBbIm1hbmlmZXN0X2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnhtbCJdLAogfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCmluZGV4IDY1N2E0MmYuLmQ4MWY4NzUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAppbmRleCA3NWY4Mzk1Li5kY2I3NmY0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggYmZiMGUwNS4uNGFiMzNkMyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzMgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogZXh0ZXJuICJDIiB7CkBAIC0zOCw3ICszOCw3IEBACiB9IC8vIGV4dGVybiAiQyIKIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMworfSAgLy8gbmFtZXNwYWNlIFYxXzQKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IGE2ZWQzYmQuLjBiZWJjM2IgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMjcsMTEgKzI3LDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMyB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b1BsdWdpbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6Y2xlYXJrZXk6OkNyeXB0b1BsdWdpbjsKIAogUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKAogICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+ICZ1dWlkKQpAQCAtNjMsNyArNjMsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMworfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IDMwMmRkMzkuLjNhNjc1ZjYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKQEAgLTIzNSw4ICsyMzUsMjMgQEAKICAgICByZXR1cm4gU3RhdHVzOjpPSzsKIH0KIAorUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6Z2V0TG9nTWVzc2FnZXMoCisgICAgICAgIGdldExvZ01lc3NhZ2VzX2NiIF9oaWRsX2NiKSB7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kczsKKyAgICB1c2luZyBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOworCisgICAgYXV0byB0aW1lTWlsbGlzID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgc3lzdGVtX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkpLmNvdW50KCk7CisKKyAgICBzdGQ6OnZlY3RvcjxMb2dNZXNzYWdlPiBsb2dzID0geworICAgICAgICAgICAgeyB0aW1lTWlsbGlzLCBMb2dQcmlvcml0eTo6RVJST1IsIHN0ZDo6c3RyaW5nKCJOb3QgaW1wbGVtZW50ZWQiKSB9fTsKKyAgICBfaGlkbF9jYihkcm06OlYxXzQ6OlN0YXR1czo6T0ssIHRvSGlkbFZlYyhsb2dzKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQuCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCmluZGV4IDI0MTViNmYuLjAzODVkOGYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCkBAIC0zOCw3ICszOCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoCkBAIC0yNDYsNyArMjQ2LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDFjZTgyNjkuLjE0Y2I1YzEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzEsMTMgKzMxLDEzIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMyB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkRybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OlNlc3Npb25MaWJyYXJ5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV80OjpjbGVhcmtleTo6RHJtUGx1Z2luOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV80OjpjbGVhcmtleTo6U2Vzc2lvbkxpYnJhcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCiBSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC0xMDUsNyArMTA1LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzMKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAppbmRleCA2ZjY5MTEwLi42YTM3NGY5IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgImhpZGxfQ2xlYXJLZXlQbHVnaW4iCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCkBAIC01OCw3ICs1OSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBLZXlSZXF1ZXN0VHlwZSB0b0tleVJlcXVlc3RUeXBlX1YxXzAoS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSkgewpAQCAtNjM1LDYgKzYzNiw0OCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldExvZ01lc3NhZ2VzKAorICAgICAgICBnZXRMb2dNZXNzYWdlc19jYiBfaGlkbF9jYikgeworICAgIHVzaW5nIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0OworICAgIHVzaW5nIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM7CisgICAgdXNpbmcgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazsKKworICAgIGF1dG8gdGltZU1pbGxpcyA9IGR1cmF0aW9uX2Nhc3Q8bWlsbGlzZWNvbmRzPigKKyAgICAgICAgICAgIHN5c3RlbV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpKS5jb3VudCgpOworCisgICAgc3RkOjp2ZWN0b3I8TG9nTWVzc2FnZT4gbG9ncyA9IHsKKyAgICAgICAgICAgIHsgdGltZU1pbGxpcywgTG9nUHJpb3JpdHk6OkVSUk9SLCBzdGQ6OnN0cmluZygiTm90IGltcGxlbWVudGVkIikgfX07CisgICAgX2hpZGxfY2IoZHJtOjpWMV80OjpTdGF0dXM6Ok9LLCB0b0hpZGxWZWMobG9ncykpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxib29sPiBEcm1QbHVnaW46OnJlcXVpcmVzU2VjdXJlRGVjb2RlcigKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWUsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICBVTlVTRUQobWltZSk7CisgICAgVU5VU0VEKGxldmVsKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1JldHVybjxib29sPiBEcm1QbHVnaW46OnJlcXVpcmVzU2VjdXJlRGVjb2RlckRlZmF1bHQoY29uc3QgaGlkbF9zdHJpbmcmIG1pbWUpIHsKKyAgICBVTlVTRUQobWltZSk7CisgICAgLy8gQ2xlYXJrZXkgb25seSBzdXBwb3J0cyBTV19TRUNVUkVfQ1JZUFRPLCBzbyB3ZSBhbHdheXMgcmV0dXJucyBmYWxzZQorICAgIC8vIHJlZ2FyZGxlc3Mgb2YgbWltZSB0eXBlLgorICAgIHJldHVybiBmYWxzZTsKK30KKworUmV0dXJuPFN0YXR1cz4gRHJtUGx1Z2luOjpzZXRQbGF5YmFja0lkKAorICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgY29uc3QgaGlkbF9zdHJpbmcmIHBsYXliYWNrSWQpIHsKKyAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGVtcHR5IHNlc3Npb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZCA9IHRvVmVjdG9yKHNlc3Npb25JZCk7CisgICAgbVBsYXliYWNrSWRbc2lkXSA9IHBsYXliYWNrSWQ7CisgICAgcmV0dXJuIFN0YXR1czo6T0s7Cit9CisKIFJldHVybjxTdGF0dXM+IERybVBsdWdpbjo6c2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgewogICAgIGlmIChzZXNzaW9uSWQuc2l6ZSgpID09IDApIHsKQEAgLTcwMiw5ICs3NDUsMjUgQEAKICAgICAgICJjbG9zZV9zZXNzaW9uIiwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRBdHRyaWJ1dGUgfSwgeyBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWNWYWx1ZSB9CiAgICAgfTsKIAotICAgIERybU1ldHJpY0dyb3VwIG1ldHJpY3MgPSB7IHsgb3BlblNlc3Npb25NZXRyaWMsIGNsb3NlU2Vzc2lvbk1ldHJpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uTm90T3BlbmVkTWV0cmljIH0gfTsKKyAgICAvLyBTZXQgdGhlIHNldFBsYXliYWNrSWQgbWV0cmljLgorICAgIHN0ZDo6dmVjdG9yPERybU1ldHJpY0dyb3VwOjpBdHRyaWJ1dGU+IHNpZHM7CisgICAgc3RkOjp2ZWN0b3I8RHJtTWV0cmljR3JvdXA6OlZhbHVlPiBwbGF5YmFja0lkczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mW2tleSwgdmFsdWVdIDogbVBsYXliYWNrSWQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2lkKGtleS5iZWdpbigpLCBrZXkuZW5kKCkpOworICAgICAgICBEcm1NZXRyaWNHcm91cDo6QXR0cmlidXRlIHNlc3Npb25JZEF0dHJpYnV0ZSA9IHsKKyAgICAgICAgICAgICJzaWQiLCBEcm1NZXRyaWNHcm91cDo6VmFsdWVUeXBlOjpTVFJJTkdfVFlQRSwgMCwgMCwgc2lkIH07CisgICAgICAgIHNpZHMucHVzaF9iYWNrKHNlc3Npb25JZEF0dHJpYnV0ZSk7CiAKKyAgICAgICAgRHJtTWV0cmljR3JvdXA6OlZhbHVlIHBsYXliYWNrSWRNZXRyaWNWYWx1ZSA9IHsKKyAgICAgICAgICAgICJwbGF5YmFja0lkIiwgRHJtTWV0cmljR3JvdXA6OlZhbHVlVHlwZTo6U1RSSU5HX1RZUEUsIDAsIDAsIHZhbHVlIH07CisgICAgICAgIHBsYXliYWNrSWRzLnB1c2hfYmFjayhwbGF5YmFja0lkTWV0cmljVmFsdWUpOworICAgIH0KKyAgICBEcm1NZXRyaWNHcm91cDo6TWV0cmljIHNldFBsYXliYWNrSWRNZXRyaWMgPSB7CisgICAgICAgICAgICAic2V0X3BsYXliYWNrX2lkIiwgeyBzaWRzIH0sIHsgcGxheWJhY2tJZHMgfX07CisKKyAgICBEcm1NZXRyaWNHcm91cCBtZXRyaWNzID0geworICAgICAgICAgICAgeyBvcGVuU2Vzc2lvbk1ldHJpYywgY2xvc2VTZXNzaW9uTWV0cmljLAorICAgICAgICAgICAgICBjbG9zZVNlc3Npb25Ob3RPcGVuZWRNZXRyaWMsIHNldFBsYXliYWNrSWRNZXRyaWMgfX07CiAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgaGlkbF92ZWM8RHJtTWV0cmljR3JvdXA+KHttZXRyaWNzfSkpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CkBAIC05MDcsNyArOTY2LDcgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMgorfSAgLy8gbmFtZXNwYWNlIFYxXzQKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSW5pdERhdGFQYXJzZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKaW5kZXggODUxMzQzNC4uZWNjYzg0MyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIG5hbWVzcGFjZSB7CkBAIC0xODAsNyArMTgwLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCmluZGV4IGQ5Mzc3N2QuLjQ1Y2M3NzUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcApAQCAtMzYsNyArMzYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogSnNvbldlYktleTo6SnNvbldlYktleSgpIHsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAvLyBhbGwgdGhlIGJhc2U2NCBlbmNvZGVkIGtleXMuIEVhY2gga2V5IGlzIGFsc28gc3RvcmVkIHNlcGFyYXRlbHkgYXMKICAgICAvLyBhIEpTT04gb2JqZWN0IGluIG1Kc29uT2JqZWN0c1sxLi5uXSB3aGVyZSBuIGlzIHRoZSB0b3RhbAogICAgIC8vIG51bWJlciBvZiBrZXlzIGluIHRoZSBzZXQuCi0gICAgaWYgKCFpc0pzb25XZWJLZXlTZXQobUpzb25PYmplY3RzWzBdKSkgeworICAgIGlmIChtSnNvbk9iamVjdHMuc2l6ZSgpID09IDAgfHwgIWlzSnNvbldlYktleVNldChtSnNvbk9iamVjdHNbMF0pKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTI3MSw3ICsyNzEsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvTWVtb3J5RmlsZVN5c3RlbS5jcHAKaW5kZXggZDI5YWNhYy4uZTYxZGIzZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwCkBAIC0xMSwxMSArMTEsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHN0ZDo6c3RyaW5nIE1lbW9yeUZpbGVTeXN0ZW06OkdldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgc2l6ZV90IGluZGV4ID0gcGF0aC5maW5kX2xhc3Rfb2YoIi8iKTsKKyAgICBzaXplX3QgaW5kZXggPSBwYXRoLmZpbmRfbGFzdF9vZignLycpOwogICAgIGlmIChpbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICByZXR1cm4gcGF0aC5zdWJzdHIoaW5kZXgrMSk7CiAgICAgfSBlbHNlIHsKQEAgLTkzLDcgKzkzLDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCmluZGV4IGE5ZDcwMTYuLmNmNjY4ZDQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcApAQCAtMjgsNyArMjgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTk1LDcgKzk1LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKaW5kZXggOTlmYjMwZi4uODhhZmNjNCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtODYsNyArODYsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS1sYXp5LmNsZWFya2V5LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWJhODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKQEAgLTAsMCArMSwxOCBAQAorc2VydmljZSB2ZW5kb3IuZHJtLWNsZWFya2V5LWhhbC0xLTQgL3ZlbmRvci9iaW4vaHcvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40LXNlcnZpY2UtbGF6eS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjM6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMzo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40OjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQ6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgZGlzYWJsZWQKKyAgICBvbmVzaG90CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTg2OTMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDE2IEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtNCAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjM6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMzo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS40OjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQ6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKaW5kZXggNzIxZjRjMC4uOTc3OTRmNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7CkBAIC00Miw3ICs0Miw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCmluZGV4IGVjMzBjYzEuLjIzNDlmMjMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC0zOCw3ICszOCw3IEBACiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgc3RkOjpzdHJpbmcgKm91dCk7CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKaW5kZXggYzQ5N2UzNy4uNjZhYWE3MyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpzcDsKQEAgLTU0LDcgKzU0LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKaW5kZXggYjgzY2U2OS4uOGU0N2M0NSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JLZXkoInZlbmRvciIpOwpAQCAtNTUsNyArNTUsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01ldHJpY3NEYXRhW10gPSB7IDAgfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCmluZGV4IDAzYzQzNGUuLmNkMTgwMjkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaApAQCAtMjQsNyArMjQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCBjMWMxODhlLi5kNGE4YTE3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMy9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMy9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMyB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzM6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8zOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8zCit9ICAvLyBuYW1lc3BhY2UgVjFfNAogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggY2I0ODExYi4uZTZiNTQxZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4zL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8zIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMzo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzMKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCAyM2E2NGZhLi5iMjcyYTgzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjQvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgPG11dGV4PgpAQCAtMzQsNyArMzQsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKQEAgLTU2LDcgKzU2LDcgQEAKIAogdHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBkcm06OlYxXzI6OklDcnlwdG9QbHVnaW4geworc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBkcm06OlYxXzQ6OklDcnlwdG9QbHVnaW4gewogICAgIGV4cGxpY2l0IENyeXB0b1BsdWdpbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKSB7CiAgICAgICAgIG1Jbml0U3RhdHVzID0gc2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgfQpAQCAtMTA0LDYgKzEwNCw4IEBACiAKICAgICBSZXR1cm48U3RhdHVzPiBnZXRJbml0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXRTdGF0dXM7IH0KIAorICAgIFJldHVybjx2b2lkPiBnZXRMb2dNZXNzYWdlcygKKyAgICAgICAgICAgIGdldExvZ01lc3NhZ2VzX2NiIF9oaWRsX2NiKTsKIHByaXZhdGU6CiAgICAgQ0xFQVJLRVlfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyeXB0b1BsdWdpbik7CiAKQEAgLTExNCw3ICsxMTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKaW5kZXggNTU0YWU1OS4uNjQ2NmFjMyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKQEAgLTIwLDkgKzIwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpPZmZsaW5lRmlsZTsKKwogY2xhc3MgRGV2aWNlRmlsZXMgewogIHB1YmxpYzoKICAgICB0eXBlZGVmIGVudW0gewpAQCAtNjMsNyArNjUsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCmluZGV4IDYzMjM0Y2YuLmZlYTFlYzggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaApAQCAtMTcsMTUgKzE3LDE1IEBACiAjaWZuZGVmIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9GQUNUT1JZX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMy9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuNC9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8zIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKQEAgLTYzLDcgKzYzLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8zCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKaW5kZXggODk0OTg1Yi4uNWQ2ZTNkYSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAjZGVmaW5lIENMRUFSS0VZX0RSTV9QTFVHSU5fSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS40L0lEcm1QbHVnaW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAKICNpbmNsdWRlIDxtYXA+CkBAIC0zMiw3ICszMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwpAQCAtNTAsOSArNTAsMTIgQEAKIHVzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwogdXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKIHVzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKLXVzaW5nIGRybTo6VjFfMjo6SURybVBsdWdpbjsKIHVzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7CiB1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjpEZXZpY2VGaWxlczsKK3VzaW5nIGRybTo6VjFfNDo6Y2xlYXJrZXk6OlNlc3Npb247Cit1c2luZyBkcm06OlYxXzQ6OmNsZWFya2V5OjpTZXNzaW9uTGlicmFyeTsKK3VzaW5nIGRybTo6VjFfNDo6SURybVBsdWdpbjsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTE5OSw2ICsyMDIsMTggQEAKICAgICBSZXR1cm48U3RhdHVzPiBzZXRQcm9wZXJ0eUJ5dGVBcnJheSgKICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgdmFsdWUpIG92ZXJyaWRlOwogCisgICAgUmV0dXJuPHZvaWQ+IGdldExvZ01lc3NhZ2VzKAorICAgICAgICBnZXRMb2dNZXNzYWdlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiBzZXRQbGF5YmFja0lkKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgcGxheWJhY2tJZCkgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48Ym9vbD4gcmVxdWlyZXNTZWN1cmVEZWNvZGVyKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWUsIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPGJvb2w+IHJlcXVpcmVzU2VjdXJlRGVjb2RlckRlZmF1bHQoY29uc3QgaGlkbF9zdHJpbmcmIG1pbWUpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0Q2lwaGVyQWxnb3JpdGhtKAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgY29uc3QgaGlkbF9zdHJpbmcmIGFsZ29yaXRobSkgewogICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGFsZ29yaXRobS5zaXplKCkgPT0gMCkgewpAQCAtMzk4LDYgKzQxMyw3IEBACiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtU3RyaW5nUHJvcGVydGllczsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtQnl0ZUFycmF5UHJvcGVydGllczsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8dWludDhfdD4gPiBtUmVsZWFzZUtleXNNYXA7CisgICAgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIHN0ZDo6c3RyaW5nPiBtUGxheWJhY2tJZDsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90PiwgU2VjdXJpdHlMZXZlbD4gbVNlY3VyaXR5TGV2ZWw7CiAgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgc3A8SURybVBsdWdpbkxpc3RlbmVyX1YxXzI+IG1MaXN0ZW5lclYxXzI7CkBAIC00MjQsNyArNDQwLDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSW5pdERhdGFQYXJzZXIuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCmluZGV4IDg4OWY1MTEuLjU5MzM4YzkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKQEAgLTQ5LDcgKzQ5LDcgQEAKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBWMV80CiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaAppbmRleCBlNTc0NzBjLi40MGEyZDc0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIGNsYXNzIEpzb25XZWJLZXkgewpAQCAtNTQsNyArNTQsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvTWVtb3J5RmlsZVN5c3RlbS5oCmluZGV4IDZhYzBlMmMuLmE5MGQ4MTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaApAQCAtMTUsNyArMTUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIFYxXzQgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogLy8gVXNpbmcgYW5kcm9pZCBmaWxlIHN5c3RlbSByZXF1aXJlcyBjbGVhcmtleSBwbHVnaW4gdG8gdXBkYXRlCkBAIC02NCw3ICs2NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggYTE1OWU1YS4uMDVjYjhjOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgVjFfNCB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBuYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwpAQCAtNzMsNyArNzMsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIFYxXzQKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKaW5kZXggMWU1NjdiOC4uNWU3NzQzOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb25MaWJyYXJ5LmgKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01OCw3ICs1OCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgVjFfNAogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAppbmRleCBiMGY4NjA3Li4yMmVlY2NkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvVHlwZUNvbnZlcnQuaApAQCAtMTQsOCArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBDTEVBUktFWV9BTkRST0lEX0hBUkRXQVJFX0RSTV9WMV8xX1RZUEVDT05WRVJUCi0jZGVmaW5lIENMRUFSS0VZX0FORFJPSURfSEFSRFdBUkVfRFJNX1YxXzFfVFlQRUNPTlZFUlQKKyNpZm5kZWYgQ0xFQVJLRVlfQU5EUk9JRF9IQVJEV0FSRV9EUk1fVjFfNF9UWVBFQ09OVkVSVAorI2RlZmluZSBDTEVBUktFWV9BTkRST0lEX0hBUkRXQVJFX0RSTV9WMV80X1RZUEVDT05WRVJUCiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBWMV80IHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC04MCw5ICs4MCw5IEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAgLy8gbmFtZXNwYWNlIFYxXzIKK30gIC8vIG5hbWVzcGFjZSBWMV80CiB9ICAvLyBuYW1lc3BhY2UgZHJtCiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAvLyBDTEVBUktFWV9BTkRST0lEX0hBUkRXQVJFX0RSTV9WMV8xX1RZUEVDT05WRVJUCisjZW5kaWYgLy8gQ0xFQVJLRVlfQU5EUk9JRF9IQVJEV0FSRV9EUk1fVjFfNF9UWVBFQ09OVkVSVApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9tYW5pZmVzdF9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS54bWwgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL21hbmlmZXN0X2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuNC1zZXJ2aWNlLmNsZWFya2V5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWRkYjVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9tYW5pZmVzdF9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjQtc2VydmljZS5jbGVhcmtleS54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxtYW5pZmVzdCB2ZXJzaW9uPSIxLjAiIHR5cGU9ImRldmljZSI+CisgICAgPGhhbCBmb3JtYXQ9ImhpZGwiPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmhhcmR3YXJlLmRybTwvbmFtZT4KKyAgICAgICAgPHRyYW5zcG9ydD5od2JpbmRlcjwvdHJhbnNwb3J0PgorICAgICAgICA8ZnFuYW1lPkAxLjQ6OklDcnlwdG9GYWN0b3J5L2NsZWFya2V5PC9mcW5hbWU+CisgICAgICAgIDxmcW5hbWU+QDEuNDo6SURybUZhY3RvcnkvY2xlYXJrZXk8L2ZxbmFtZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcAppbmRleCBiNjJiYWFlLi5kM2Q2OTA1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKQEAgLTI1LDEwICsyNSwxMCBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8zOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzM6OklEcm1GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMzo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8zOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV80OjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwogCiBpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKICAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlTGF6eS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcAppbmRleCBiM2UwMTc5Li4zNThiNWNjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApAQCAtMjUsMTAgKzI1LDEwIEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzM6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMzo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8zOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzM6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV80OjpJRHJtRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzQ6OmNsZWFya2V5OjpDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfNDo6Y2xlYXJrZXk6OkRybUZhY3Rvcnk7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6TGF6eVNlcnZpY2VSZWdpc3RyYXI7CiAKIGludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgewpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCmluZGV4IGRkMmFkN2IuLjIwZGZiNGEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svQW5kcm9pZC5icAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9tb2NrL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtb2NrZHJtY3J5cHRvcGx1Z2luIiwKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCmluZGV4IDg2NmVkYWMuLmEzOGFhOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAorKysgYi9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKQEAgLTMxOCw3ICszMTgsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vVEVTVF9NQVBQSU5HIGIvaW5jbHVkZS9kcm0vVEVTVF9NQVBQSU5HCmluZGV4IDI4ZTQzMmUuLjc0ZmE1MGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL1RFU1RfTUFQUElORworKysgYi9pbmNsdWRlL2RybS9URVNUX01BUFBJTkcKQEAgLTgsMTcgKzgsOSBAQAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVHZW5lcmljT3BzVGVzdHMiCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgIHsKLSAgICAgICJuYW1lIjogIkd0c0V4b1BsYXllclRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImNvbS5nb29nbGUuYW5kcm9pZC5tZWRpYS5ndHMuV2lkZXZpbmVIMjY0UGxheWJhY2tUZXN0cyIKICAgICAgICAgfQogICAgICAgXQogICAgIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSW50ZXJwb2xhdG9yLmggYi9pbmNsdWRlL21lZGlhL0ludGVycG9sYXRvci5oCmluZGV4IDcwM2NmNzcuLjcxZTc2MDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvSW50ZXJwb2xhdG9yLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JbnRlcnBvbGF0b3IuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSW50ZXJwb2xhdG9yQ29uZmlnLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtMzksMTcgKzQwLDEwIEBACiBjbGFzcyBJbnRlcnBvbGF0b3IgOiBwdWJsaWMgc3RkOjptYXA8UywgVD4gewogcHVibGljOgogICAgIC8vIFBvbHlub21pYWwgc3BsaW5lIGludGVycG9sYXRvcnMKLSAgICAvLyBFeHRlbmQgb25seSBhdCB0aGUgZW5kIG9mIGVudW0sIGFzIHRoaXMgbXVzdCBtYXRjaCBvcmRlciBpbiBWb2x1bWVTaGFwZXJzLmphdmEuCi0gICAgZW51bSBJbnRlcnBvbGF0b3JUeXBlIDogaW50MzJfdCB7Ci0gICAgICAgIElOVEVSUE9MQVRPUl9UWVBFX1NURVAsICAgLy8gTm90IGNvbnRpbnVvdXMKLSAgICAgICAgSU5URVJQT0xBVE9SX1RZUEVfTElORUFSLCAvLyBDMAotICAgICAgICBJTlRFUlBPTEFUT1JfVFlQRV9DVUJJQywgIC8vIEMxCi0gICAgICAgIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX01PTk9UT05JQywgLy8gQzEgKHRvIHByb3ZpZGUgbG9jYWxseSBtb25vdG9uaWMgY3VydmVzKQotICAgICAgICAvLyBJTlRFUlBPTEFUT1JfVFlQRV9DVUJJQ19DMiwgLy8gVE9ETyAtIHJlcXVpcmVzIGdsb2JhbCBjb21wdXRhdGlvbiAvIGNhY2hlCi0gICAgfTsKKyAgICB1c2luZyBJbnRlcnBvbGF0b3JUeXBlICA9IG1lZGlhOjpJbnRlcnBvbGF0b3JUeXBlOwogCiAgICAgZXhwbGljaXQgSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgSW50ZXJwb2xhdG9yVHlwZSBpbnRlcnBvbGF0b3JUeXBlID0gSU5URVJQT0xBVE9SX1RZUEVfTElORUFSLAorICAgICAgICAgICAgSW50ZXJwb2xhdG9yVHlwZSBpbnRlcnBvbGF0b3JUeXBlID0gSW50ZXJwb2xhdG9yVHlwZTo6Q1VCSUMsCiAgICAgICAgICAgICBib29sIGNhY2hlID0gdHJ1ZSkKICAgICAgICAgOiBtQ2FjaGUoY2FjaGUpCiAgICAgICAgICwgbUZpcnN0U2xvcGUoMCkKQEAgLTgyLDEzICs3NiwxMyBAQAogCiAgICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdHdvIGFkamFjZW50IHBvaW50czoKICAgICAgICAgc3dpdGNoIChtSW50ZXJwb2xhdG9yVHlwZSkgewotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX1NURVA6CisgICAgICAgIGNhc2UgSW50ZXJwb2xhdG9yVHlwZTo6U1RFUDoKICAgICAgICAgICAgIHJldHVybiBoaWdoLT5maXJzdCA9PSB4ID8gaGlnaC0+c2Vjb25kIDogbG93LT5zZWNvbmQ7Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfTElORUFSOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkxJTkVBUjoKICAgICAgICAgICAgIHJldHVybiAoKGhpZ2gtPmZpcnN0IC0geCkgKiBsb3ctPnNlY29uZCArICh4IC0gbG93LT5maXJzdCkgKiBoaWdoLT5zZWNvbmQpCiAgICAgICAgICAgICAgICAgICAgIC8gKGhpZ2gtPmZpcnN0IC0gbG93LT5maXJzdCk7Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUM6Ci0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUNfTU9OT1RPTklDOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX01PTk9UT05JQzoKICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lCiAKQEAgLTExNiw3ICsxMTAsNyBAQAogICAgICAgICAgICAgLy8gbm9uIGNhdG11bGxSb20gKGZpbml0ZSBkaWZmZXJlbmNlKSB3aXRoIHJlZ3VsYXIgY3ViaWM7CiAgICAgICAgICAgICAvLyB0aGUgY2hvaWNlcyBoZXJlIG1pbmltaXplIGNvbXB1dGF0aW9uLgogICAgICAgICAgICAgYm9vbCBtb25vdG9uaWMsIGNhdG11bGxSb207Ci0gICAgICAgICAgICBpZiAobUludGVycG9sYXRvclR5cGUgPT0gSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUNfTU9OT1RPTklDKSB7CisgICAgICAgICAgICBpZiAobUludGVycG9sYXRvclR5cGUgPT0gSW50ZXJwb2xhdG9yVHlwZTo6Q1VCSUNfTU9OT1RPTklDKSB7CiAgICAgICAgICAgICAgICAgbW9ub3RvbmljID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBjYXRtdWxsUm9tID0gZmFsc2U7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjAyLDExICsxOTYsMTEgQEAKIAogICAgIHN0YXR1c190IHNldEludGVycG9sYXRvclR5cGUoSW50ZXJwb2xhdG9yVHlwZSBpbnRlcnBvbGF0b3JUeXBlKSB7CiAgICAgICAgIHN3aXRjaCAoaW50ZXJwb2xhdG9yVHlwZSkgewotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX1NURVA6ICAgLy8gTm90IGNvbnRpbnVvdXMKLSAgICAgICAgY2FzZSBJTlRFUlBPTEFUT1JfVFlQRV9MSU5FQVI6IC8vIEMwCi0gICAgICAgIGNhc2UgSU5URVJQT0xBVE9SX1RZUEVfQ1VCSUM6ICAvLyBDMQotICAgICAgICBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX01PTk9UT05JQzogLy8gQzEgKyBvdGhlciBjb25zdHJhaW50cwotICAgICAgICAvLyBjYXNlIElOVEVSUE9MQVRPUl9UWVBFX0NVQklDX0MyOgorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OlNURVA6ICAgLy8gTm90IGNvbnRpbnVvdXMKKyAgICAgICAgY2FzZSBJbnRlcnBvbGF0b3JUeXBlOjpMSU5FQVI6IC8vIEMwCisgICAgICAgIGNhc2UgSW50ZXJwb2xhdG9yVHlwZTo6Q1VCSUM6ICAvLyBDMQorICAgICAgICBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX01PTk9UT05JQzogLy8gQzEgKyBvdGhlciBjb25zdHJhaW50cworICAgICAgICAvLyBjYXNlIEludGVycG9sYXRvclR5cGU6OkNVQklDX0MyOgogICAgICAgICAgICAgbUludGVycG9sYXRvclR5cGUgPSBpbnRlcnBvbGF0b3JUeXBlOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICBkZWZhdWx0OgpAQCAtMjM1LDQ5ICsyMjksNTAgQEAKICAgICAgICAgbU1lbW8uY2xlYXIoKTsKICAgICB9CiAKKyAgICAvLyBUT0RPKHl0YWkpOiByZW1vdmUgdGhpcyBtZXRob2Qgb25jZSBpdCBpcyBub3QgdXNlZC4KICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7Ci0gICAgICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUludGVycG9sYXRvclR5cGUpCi0gICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUZsb2F0KG1GaXJzdFNsb3BlKQotICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChtTGFzdFNsb3BlKQotICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVVaW50MzIoKHVpbnQzMl90KXRoaXMtPnNpemUoKSk7IC8vIHNpbGVudCB0cnVuY2F0aW9uCi0gICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdCA6ICp0aGlzKSB7Ci0gICAgICAgICAgICByZXMgPSBwYXJjZWwtPndyaXRlRmxvYXQocHQuZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChwdC5zZWNvbmQpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBtZWRpYTo6SW50ZXJwb2xhdG9yQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgd3JpdGVUb0NvbmZpZygmY29uZmlnKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgfQogCisgICAgdm9pZCB3cml0ZVRvQ29uZmlnKG1lZGlhOjpJbnRlcnBvbGF0b3JDb25maWcgKmNvbmZpZykgY29uc3QgeworICAgICAgICBjb25maWctPnR5cGUgPSBtSW50ZXJwb2xhdG9yVHlwZTsKKyAgICAgICAgY29uZmlnLT5maXJzdFNsb3BlID0gbUZpcnN0U2xvcGU7CisgICAgICAgIGNvbmZpZy0+bGFzdFNsb3BlID0gbUxhc3RTbG9wZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwdCA6ICp0aGlzKSB7CisgICAgICAgICAgICBjb25maWctPnh5LnB1c2hfYmFjayhwdC5maXJzdCk7CisgICAgICAgICAgICBjb25maWctPnh5LnB1c2hfYmFjayhwdC5zZWNvbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyh5dGFpKTogcmVtb3ZlIHRoaXMgbWV0aG9kIG9uY2UgaXQgaXMgbm90IHVzZWQuCiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKLSAgICAgICAgdGhpcy0+Y2xlYXIoKTsKLSAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICB1aW50MzJfdCBzaXplOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBwYXJjZWwucmVhZEludDMyKCZ0eXBlKQotICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRGbG9hdCgmbUZpcnN0U2xvcGUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwucmVhZEZsb2F0KCZtTGFzdFNsb3BlKQotICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLnJlYWRVaW50MzIoJnNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICA/OiBzZXRJbnRlcnBvbGF0b3JUeXBlKChJbnRlcnBvbGF0b3JUeXBlKXR5cGUpOworICAgICAgICBtZWRpYTo6SW50ZXJwb2xhdG9yQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gY29uZmlnLnJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOwogICAgICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkRnJvbUNvbmZpZyhjb25maWcpOworICAgIH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tQ29uZmlnKGNvbnN0IG1lZGlhOjpJbnRlcnBvbGF0b3JDb25maWcgJmNvbmZpZykgeworICAgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgICBzZXRJbnRlcnBvbGF0b3JUeXBlKGNvbmZpZy50eXBlKTsKKyAgICAgICAgaWYgKChjb25maWcueHkuc2l6ZSgpICYgMSkgIT0gMCkgeworICAgICAgICAgICAgLy8geHkgc2l6ZSBtdXN0IGJlIGV2ZW4uCisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHNpemUgPSBjb25maWcueHkuc2l6ZSgpIC8gMjsKKyAgICAgICAgbUZpcnN0U2xvcGUgPSBjb25maWcuZmlyc3RTbG9wZTsKKyAgICAgICAgbUxhc3RTbG9wZSA9IGNvbmZpZy5sYXN0U2xvcGU7CisKICAgICAgICAgLy8gTm90ZTogV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBzaXplIGlzIHdpdGhpbiBzb21lIGJvdW5kcyBhcwogICAgICAgICAvLyB0aGUgUGFyY2VsIHJlYWQgd2lsbCBmYWlsIGlmIHNpemUgaXMgaW5jb3JyZWN0bHkgc3BlY2lmaWVkIHRvbyBsYXJnZS4KICAgICAgICAgZmxvYXQgbGFzdHg7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgIGZsb2F0IHgsIHk7Ci0gICAgICAgICAgICByZXMgPSBwYXJjZWwucmVhZEZsb2F0KCZ4KQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwucmVhZEZsb2F0KCZ5KTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgeCA9IGNvbmZpZy54eVtpICogMl07CisgICAgICAgICAgICBmbG9hdCB5ID0gY29uZmlnLnh5W2kgKiAyICsgMV07CiAgICAgICAgICAgICBpZiAoKGkgPiAwICYmICEoeCA+IGxhc3R4KSkgLyogaGFuZGxlIG5hbiAqLwogICAgICAgICAgICAgICAgICAgICB8fCB5ICE9IHkgLyogaGFuZGxlIG5hbiAqLykgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGQ6Om1hcCBvYmplY3Qgd2hpY2ggaW1wb3NlcyBzb3J0ZWQgb3JkZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWljcm9waG9uZUluZm8uaAppbmRleCAyMjg3YWNhLi5hNTA0NWI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01pY3JvcGhvbmVJbmZvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NaWNyb3Bob25lSW5mby5oCkBAIC0xNywzMyArMTcsMjQgQEAKICNpZm5kZWYgQU5EUk9JRF9NSUNST1BIT05FX0lORk9fSAogI2RlZmluZSBBTkRST0lEX01JQ1JPUEhPTkVfSU5GT19ICiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvRGF0YS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBtZWRpYSB7CiAKLSNkZWZpbmUgUkVUVVJOX0lGX0ZBSUxFRChjYWxsZWRPbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0dXNfdCByZXR1cm5TdGF0dXMgPSBjYWxsZWRPbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHJldHVyblN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIGF0ICVzOiVkICglcykiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAotICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCiBjbGFzcyBNaWNyb3Bob25lSW5mbyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKIHB1YmxpYzoKICAgICBNaWNyb3Bob25lSW5mbygpID0gZGVmYXVsdDsKICAgICBNaWNyb3Bob25lSW5mbyhjb25zdCBNaWNyb3Bob25lSW5mbyYgbWljcm9waG9uZUluZm8pID0gZGVmYXVsdDsKICAgICBNaWNyb3Bob25lSW5mbyhhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QmIGNoYXJhY3RlcmlzdGljKSB7Ci0gICAgICAgIG1EZXZpY2VJZCA9IFN0cmluZzE2KCZjaGFyYWN0ZXJpc3RpYy5kZXZpY2VfaWRbMF0pOworICAgICAgICBtRGV2aWNlSWQgPSBzdGQ6OnN0cmluZygmY2hhcmFjdGVyaXN0aWMuZGV2aWNlX2lkWzBdKTsKICAgICAgICAgbVBvcnRJZCA9IGNoYXJhY3RlcmlzdGljLmlkOwogICAgICAgICBtVHlwZSA9IGNoYXJhY3RlcmlzdGljLmRldmljZTsKLSAgICAgICAgbUFkZHJlc3MgPSBTdHJpbmcxNigmY2hhcmFjdGVyaXN0aWMuYWRkcmVzc1swXSk7CisgICAgICAgIG1BZGRyZXNzID0gc3RkOjpzdHJpbmcoJmNoYXJhY3RlcmlzdGljLmFkZHJlc3NbMF0pOwogICAgICAgICBtRGV2aWNlTG9jYXRpb24gPSBjaGFyYWN0ZXJpc3RpYy5sb2NhdGlvbjsKICAgICAgICAgbURldmljZUdyb3VwID0gY2hhcmFjdGVyaXN0aWMuZ3JvdXA7CiAgICAgICAgIG1JbmRleEluVGhlR3JvdXAgPSBjaGFyYWN0ZXJpc3RpYy5pbmRleF9pbl90aGVfZ3JvdXA7CkBAIC01Myw4ICs0NCw4IEBACiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueCk7CiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueSk7CiAgICAgICAgIG1PcmllbnRhdGlvbi5wdXNoX2JhY2soY2hhcmFjdGVyaXN0aWMub3JpZW50YXRpb24ueik7Ci0gICAgICAgIFZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7Ci0gICAgICAgIFZlY3RvcjxmbG9hdD4gcmVzcG9uc2VzOworICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZnJlcXVlbmNpZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZXNwb25zZXM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhcmFjdGVyaXN0aWMubnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGkrKykgewogICAgICAgICAgICAgZnJlcXVlbmNpZXMucHVzaF9iYWNrKGNoYXJhY3RlcmlzdGljLmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1baV0pOwogICAgICAgICAgICAgcmVzcG9uc2VzLnB1c2hfYmFjayhjaGFyYWN0ZXJpc3RpYy5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2ldKTsKQEAgLTczLDc2ICs2NCw3MyBAQAogICAgIHZpcnR1YWwgfk1pY3JvcGhvbmVJbmZvKCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVN0cmluZzE2KG1EZXZpY2VJZCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtUG9ydElkKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZVVpbnQzMihtVHlwZSkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVTdHJpbmcxNihtQWRkcmVzcykpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGV2aWNlTG9jYXRpb24pKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobURldmljZUdyb3VwKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1JbmRleEluVGhlR3JvdXApKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRCh3cml0ZUZsb2F0VmVjdG9yKHBhcmNlbCwgbUdlb21ldHJpY0xvY2F0aW9uKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1PcmllbnRhdGlvbikpOworICAgICAgICBNaWNyb3Bob25lSW5mb0RhdGEgcGFyY2VsYWJsZTsKKyAgICAgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShNaWNyb3Bob25lSW5mb0RhdGEqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICAgICAgcGFyY2VsYWJsZS0+ZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CisgICAgICAgIHBhcmNlbGFibGUtPnBvcnRJZCA9IG1Qb3J0SWQ7CisgICAgICAgIHBhcmNlbGFibGUtPnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihtVHlwZSkpOworICAgICAgICBwYXJjZWxhYmxlLT5hZGRyZXNzID0gbUFkZHJlc3M7CisgICAgICAgIHBhcmNlbGFibGUtPmRldmljZUdyb3VwID0gbURldmljZUdyb3VwOworICAgICAgICBwYXJjZWxhYmxlLT5pbmRleEluVGhlR3JvdXAgPSBtSW5kZXhJblRoZUdyb3VwOworICAgICAgICBwYXJjZWxhYmxlLT5nZW9tZXRyaWNMb2NhdGlvbiA9IG1HZW9tZXRyaWNMb2NhdGlvbjsKKyAgICAgICAgcGFyY2VsYWJsZS0+b3JpZW50YXRpb24gPSBtT3JpZW50YXRpb247CiAgICAgICAgIGlmIChtRnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSAhPSAyKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZyZXF1ZW5jeVJlc3BvbnNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUZyZXF1ZW5jeVJlc3BvbnNlc1tpXS5zaXplKCkpKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVGbG9hdFZlY3RvcihwYXJjZWwsIG1GcmVxdWVuY3lSZXNwb25zZXNbaV0pKTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGNoYW5uZWxNYXBwaW5nOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFwcGluZy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKG1DaGFubmVsTWFwcGluZ1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IoY2hhbm5lbE1hcHBpbmcpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobVNlbnNpdGl2aXR5KSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUZsb2F0KG1NYXhTcGwpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlRmxvYXQobU1pblNwbCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+d3JpdGVJbnQzMihtRGlyZWN0aW9uYWxpdHkpKTsKKyAgICAgICAgcGFyY2VsYWJsZS0+ZnJlcXVlbmNpZXMgPSBtRnJlcXVlbmN5UmVzcG9uc2VzWzBdOworICAgICAgICBwYXJjZWxhYmxlLT5mcmVxdWVuY3lSZXNwb25zZXMgPSBtRnJlcXVlbmN5UmVzcG9uc2VzWzFdOworICAgICAgICBwYXJjZWxhYmxlLT5jaGFubmVsTWFwcGluZyA9IG1DaGFubmVsTWFwcGluZzsKKyAgICAgICAgcGFyY2VsYWJsZS0+c2Vuc2l0aXZpdHkgPSBtU2Vuc2l0aXZpdHk7CisgICAgICAgIHBhcmNlbGFibGUtPm1heFNwbCA9IG1NYXhTcGw7CisgICAgICAgIHBhcmNlbGFibGUtPm1pblNwbCA9IG1NaW5TcGw7CisgICAgICAgIHBhcmNlbGFibGUtPmRpcmVjdGlvbmFsaXR5ID0gbURpcmVjdGlvbmFsaXR5OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZFN0cmluZzE2KCZtRGV2aWNlSWQpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbVBvcnRJZCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZFVpbnQzMigmbVR5cGUpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRTdHJpbmcxNigmbUFkZHJlc3MpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbURldmljZUxvY2F0aW9uKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EZXZpY2VHcm91cCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtSW5kZXhJblRoZUdyb3VwKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJm1HZW9tZXRyaWNMb2NhdGlvbiwgMykpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRGbG9hdFZlY3RvcihwYXJjZWwsICZtT3JpZW50YXRpb24sIDMpKTsKLSAgICAgICAgaW50MzJfdCBmcmVxdWVuY2llc051bTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmZnJlcXVlbmNpZXNOdW0pKTsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBmcmVxdWVuY2llczsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChyZWFkRmxvYXRWZWN0b3IocGFyY2VsLCAmZnJlcXVlbmNpZXMsIGZyZXF1ZW5jaWVzTnVtKSk7Ci0gICAgICAgIGludDMyX3QgcmVzcG9uc2VzTnVtOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZyZXNwb25zZXNOdW0pKTsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiByZXNwb25zZXM7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocmVhZEZsb2F0VmVjdG9yKHBhcmNlbCwgJnJlc3BvbnNlcywgcmVzcG9uc2VzTnVtKSk7Ci0gICAgICAgIGlmIChmcmVxdWVuY2llcy5zaXplKCkgIT0gcmVzcG9uc2VzLnNpemUoKSkgeworICAgICAgICBNaWNyb3Bob25lSW5mb0RhdGEgZGF0YTsKKyAgICAgICAgcmV0dXJuIGRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKGRhdGEpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IE1pY3JvcGhvbmVJbmZvRGF0YSYgcGFyY2VsYWJsZSkgeworICAgICAgICBtRGV2aWNlSWQgPSBwYXJjZWxhYmxlLmRldmljZUlkOworICAgICAgICBtUG9ydElkID0gcGFyY2VsYWJsZS5wb3J0SWQ7CisgICAgICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KHBhcmNlbGFibGUudHlwZSkpOworICAgICAgICBtQWRkcmVzcyA9IHBhcmNlbGFibGUuYWRkcmVzczsKKyAgICAgICAgbURldmljZUxvY2F0aW9uID0gcGFyY2VsYWJsZS5kZXZpY2VMb2NhdGlvbjsKKyAgICAgICAgbURldmljZUdyb3VwID0gcGFyY2VsYWJsZS5kZXZpY2VHcm91cDsKKyAgICAgICAgbUluZGV4SW5UaGVHcm91cCA9IHBhcmNlbGFibGUuaW5kZXhJblRoZUdyb3VwOworICAgICAgICBpZiAocGFyY2VsYWJsZS5nZW9tZXRyaWNMb2NhdGlvbi5zaXplKCkgIT0gMykgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhmcmVxdWVuY2llcyk7Ci0gICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKHJlc3BvbnNlcyk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPGludD4gY2hhbm5lbE1hcHBpbmc7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZjaGFubmVsTWFwcGluZyk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNoYW5uZWxNYXBwaW5nLnNpemUoKSAhPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICBtR2VvbWV0cmljTG9jYXRpb24gPSBwYXJjZWxhYmxlLmdlb21ldHJpY0xvY2F0aW9uOworICAgICAgICBpZiAocGFyY2VsYWJsZS5vcmllbnRhdGlvbi5zaXplKCkgIT0gMykgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxNYXBwaW5nLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hcHBpbmcucHVzaF9iYWNrKGNoYW5uZWxNYXBwaW5nW2ldKTsKKyAgICAgICAgbU9yaWVudGF0aW9uID0gcGFyY2VsYWJsZS5vcmllbnRhdGlvbjsKKyAgICAgICAgaWYgKHBhcmNlbGFibGUuZnJlcXVlbmNpZXMuc2l6ZSgpICE9IHBhcmNlbGFibGUuZnJlcXVlbmN5UmVzcG9uc2VzLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEZsb2F0KCZtU2Vuc2l0aXZpdHkpKTsKLSAgICAgICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRGbG9hdCgmbU1heFNwbCkpOwotICAgICAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEZsb2F0KCZtTWluU3BsKSk7Ci0gICAgICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJm1EaXJlY3Rpb25hbGl0eSkpOworCisgICAgICAgIG1GcmVxdWVuY3lSZXNwb25zZXMucHVzaF9iYWNrKHBhcmNlbGFibGUuZnJlcXVlbmNpZXMpOworICAgICAgICBtRnJlcXVlbmN5UmVzcG9uc2VzLnB1c2hfYmFjayhwYXJjZWxhYmxlLmZyZXF1ZW5jeVJlc3BvbnNlcyk7CisgICAgICAgIGlmIChwYXJjZWxhYmxlLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAhPSBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ2hhbm5lbE1hcHBpbmcgPSBwYXJjZWxhYmxlLmNoYW5uZWxNYXBwaW5nOworICAgICAgICBtU2Vuc2l0aXZpdHkgPSBwYXJjZWxhYmxlLnNlbnNpdGl2aXR5OworICAgICAgICBtTWF4U3BsID0gcGFyY2VsYWJsZS5tYXhTcGw7CisgICAgICAgIG1NaW5TcGwgPSBwYXJjZWxhYmxlLm1pblNwbDsKKyAgICAgICAgbURpcmVjdGlvbmFsaXR5ID0gcGFyY2VsYWJsZS5kaXJlY3Rpb25hbGl0eTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIFN0cmluZzE2IGdldERldmljZUlkKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUlkOwogICAgIH0KIApAQCAtMTU0LDcgKzE0Miw3IEBACiAgICAgICAgIHJldHVybiBtVHlwZTsKICAgICB9CiAKLSAgICBTdHJpbmcxNiBnZXRBZGRyZXNzKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGdldEFkZHJlc3MoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQWRkcmVzczsKICAgICB9CiAKQEAgLTE3MCwxOSArMTU4LDE5IEBACiAgICAgICAgIHJldHVybiBtSW5kZXhJblRoZUdyb3VwOwogICAgIH0KIAotICAgIGNvbnN0IFZlY3RvcjxmbG9hdD4mIGdldEdlb21ldHJpY0xvY2F0aW9uKCkgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgZ2V0R2VvbWV0cmljTG9jYXRpb24oKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtR2VvbWV0cmljTG9jYXRpb247CiAgICAgfQogCi0gICAgY29uc3QgVmVjdG9yPGZsb2F0PiYgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBnZXRPcmllbnRhdGlvbigpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1PcmllbnRhdGlvbjsKICAgICB9CiAKLSAgICBjb25zdCBWZWN0b3I8VmVjdG9yPGZsb2F0Pj4mIGdldEZyZXF1ZW5jeVJlc3BvbnNlcygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxmbG9hdD4+JiBnZXRGcmVxdWVuY3lSZXNwb25zZXMoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRnJlcXVlbmN5UmVzcG9uc2VzOwogICAgIH0KIAotICAgIGNvbnN0IFZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBnZXRDaGFubmVsTWFwcGluZygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFwcGluZzsKICAgICB9CiAKQEAgLTIwMyw0NiArMTkxLDM4IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIHN0YXR1c190IHJlYWRGbG9hdFZlY3RvcigKLSAgICAgICAgICAgIGNvbnN0IFBhcmNlbCogcGFyY2VsLCBWZWN0b3I8ZmxvYXQ+ICp2ZWN0b3JQdHIsIHNpemVfdCBkZWZhdWx0TGVuZ3RoKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxmbG9hdD4+IHY7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHBhcmNlbC0+cmVhZEZsb2F0VmVjdG9yKCZ2KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgdmVjdG9yUHRyLT5jbGVhcigpOwotICAgICAgICBpZiAodi5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiAqdikgewotICAgICAgICAgICAgICAgIHZlY3RvclB0ci0+cHVzaF9iYWNrKGl0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVjdG9yUHRyLT5yZXNpemUoZGVmYXVsdExlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBzdGF0dXNfdCB3cml0ZUZsb2F0VmVjdG9yKFBhcmNlbCogcGFyY2VsLCBjb25zdCBWZWN0b3I8ZmxvYXQ+JiB2ZWN0b3IpIGNvbnN0IHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHY7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICB2LnB1c2hfYmFjayh2ZWN0b3JbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYXJjZWwtPndyaXRlRmxvYXRWZWN0b3Iodik7Ci0gICAgfQotCi0gICAgU3RyaW5nMTYgbURldmljZUlkOworICAgIHN0ZDo6c3RyaW5nIG1EZXZpY2VJZDsKICAgICBpbnQzMl90IG1Qb3J0SWQ7CiAgICAgdWludDMyX3QgbVR5cGU7Ci0gICAgU3RyaW5nMTYgbUFkZHJlc3M7CisgICAgc3RkOjpzdHJpbmcgbUFkZHJlc3M7CiAgICAgaW50MzJfdCBtRGV2aWNlTG9jYXRpb247CiAgICAgaW50MzJfdCBtRGV2aWNlR3JvdXA7CiAgICAgaW50MzJfdCBtSW5kZXhJblRoZUdyb3VwOwotICAgIFZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOwotICAgIFZlY3RvcjxmbG9hdD4gbU9yaWVudGF0aW9uOwotICAgIFZlY3RvcjxWZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOwotICAgIFZlY3RvcjxpbnQ+IG1DaGFubmVsTWFwcGluZzsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUdlb21ldHJpY0xvY2F0aW9uOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtT3JpZW50YXRpb247CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8ZmxvYXQ+PiBtRnJlcXVlbmN5UmVzcG9uc2VzOworICAgIHN0ZDo6dmVjdG9yPGludD4gbUNoYW5uZWxNYXBwaW5nOwogICAgIGZsb2F0IG1TZW5zaXRpdml0eTsKICAgICBmbG9hdCBtTWF4U3BsOwogICAgIGZsb2F0IG1NaW5TcGw7CiAgICAgaW50MzJfdCBtRGlyZWN0aW9uYWxpdHk7CiB9OwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK2lubGluZSBDb252ZXJzaW9uUmVzdWx0PE1pY3JvcGhvbmVJbmZvPgorYWlkbDJsZWdhY3lfTWljcm9waG9uZUluZm8oY29uc3QgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YSYgYWlkbCkgeworICAgIE1pY3JvcGhvbmVJbmZvIGxlZ2FjeTsKKyAgICBSRVRVUk5fSUZfRVJST1IobGVnYWN5LnJlYWRGcm9tUGFyY2VsYWJsZShhaWRsKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworaW5saW5lIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4KK2xlZ2FjeTJhaWRsX01pY3JvcGhvbmVJbmZvKGNvbnN0IE1pY3JvcGhvbmVJbmZvJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6TWljcm9waG9uZUluZm9EYXRhIGFpZGw7CisgICAgUkVUVVJOX0lGX0VSUk9SKGxlZ2FjeS53cml0ZVRvUGFyY2VsYWJsZSgmYWlkbCkpOworICAgIHJldHVybiBhaWRsOworfQorCiB9IC8vIG5hbWVzcGFjZSBtZWRpYQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01tYXBTdHJlYW1JbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCmluZGV4IGIzYmYxNmQuLjYxZGU5ODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTW1hcFN0cmVhbUludGVyZmFjZS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCisjaW5jbHVkZSA8dGltZS5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE1tYXBTdHJlYW1DYWxsYmFjazsKQEAgLTEwMyw2ICsxMDUsMTkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgorICAgICAqIEdldCBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQvcmVjZWl2ZWQgdG8vZnJvbSBhbgorICAgICAqIGV4dGVybmFsIG9ic2VydmVyLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcG9zaXRpb24gY291bnQgb2YgcHJlc2VudGVkIGF1ZGlvIGZyYW1lcworICAgICAqIFxwYXJhbVtvdXRdIHRpbWVOYW5vcyBhc3NvY2lhdGVkIGNsb2NrIHRpbWUKKyAgICAgKgorICAgICAqIFxyZXR1cm4gT0sgaWYgdGhlIGV4dGVybmFsIHBvc2l0aW9uIGlzIHNldCBjb3JyZWN0bHkuCisgICAgICogICAgICAgICBOT19JTklUIGluIGNhc2Ugb2YgaW5pdGlhbGl6YXRpb24gZXJyb3IKKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBpbnRlcmZhY2UgaXMgbm90IGltcGxlbWVudGVkCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90KiBwb3NpdGlvbiwgaW50NjRfdCogdGltZU5hbm9zKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgogICAgICAqIGNyZWF0ZU1tYXBCdWZmZXIoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBzdGFydCgpCiAgICAgICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmggYi9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCmluZGV4IGZlNTE5YmIuLjUyNzFlMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaApAQCAtMjIsNiArMjIsMTEgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlck9wZXJhdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSW50ZXJwb2xhdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTI4NCwzMCArMjg5LDQxIEBACiAgICAgICAgICAgICBjbGFtcFZvbHVtZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVGhlIHBhcmNlbCBsYXlvdXQgbXVzdCBtYXRjaCBWb2x1bWVTaGFwZXIuamF2YQogICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1UeXBlKQotICAgICAgICAgICAgICAgICAgICA/OiBwYXJjZWwtPndyaXRlSW50MzIobUlkKQotICAgICAgICAgICAgICAgICAgICA/OiBtVHlwZSA9PSBUWVBFX0lECi0gICAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCltT3B0aW9uRmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZURvdWJsZShtRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiBJbnRlcnBvbGF0b3I8UywgVD46OndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgICAgIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24gcGFyY2VsYWJsZTsKKyAgICAgICAgICAgIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUsIG9wdGlvbkZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEludDMyKCZ0eXBlKQotICAgICAgICAgICAgICAgICAgICA/OiBzZXRUeXBlKChUeXBlKXR5cGUpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEludDMyKCZtSWQpCi0gICAgICAgICAgICAgICAgICAgID86IG1UeXBlID09IFRZUEVfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gTk9fRVJST1IKLSAgICAgICAgICAgICAgICAgICAgICAgIDogcGFyY2VsLT5yZWFkSW50MzIoJm9wdGlvbkZsYWdzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHNldE9wdGlvbkZsYWdzKChPcHRpb25GbGFnKW9wdGlvbkZsYWdzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZERvdWJsZSgmbUR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogSW50ZXJwb2xhdG9yPFMsIFQ+OjpyZWFkRnJvbVBhcmNlbCgqcGFyY2VsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IGNoZWNrQ3VydmUoKTsKKyAgICAgICAgdm9pZCB3cml0ZVRvUGFyY2VsYWJsZShWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uICpwYXJjZWxhYmxlKSBjb25zdCB7CisgICAgICAgICAgICBwYXJjZWxhYmxlLT5pZCA9IGdldElkKCk7CisgICAgICAgICAgICBwYXJjZWxhYmxlLT50eXBlID0gZ2V0VHlwZUFzQWlkbCgpOworICAgICAgICAgICAgcGFyY2VsYWJsZS0+b3B0aW9uRmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKG1UeXBlICE9IFRZUEVfSUQpIHsKKyAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLT5vcHRpb25GbGFncyA9IGdldE9wdGlvbkZsYWdzQXNBaWRsKCk7CisgICAgICAgICAgICAgICAgcGFyY2VsYWJsZS0+ZHVyYXRpb25NcyA9IGdldER1cmF0aW9uTXMoKTsKKyAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLT5pbnRlcnBvbGF0b3JDb25maWcuZW1wbGFjZSgpOyAvLyBjcmVhdGUgdmFsdWUgaW4gc3RkOjpvcHRpb25hbAorICAgICAgICAgICAgICAgIEludGVycG9sYXRvcjxTLCBUPjo6d3JpdGVUb0NvbmZpZygmKnBhcmNlbGFibGUtPmludGVycG9sYXRvckNvbmZpZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBkYXRhOworICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBwYXJjZWxhYmxlKSB7CisgICAgICAgICAgICBzZXRJZChwYXJjZWxhYmxlLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRUeXBlRnJvbUFpZGwocGFyY2VsYWJsZS50eXBlKQorICAgICAgICAgICAgICAgICAgID86IG1UeXBlID09IFRZUEVfSUQKKyAgICAgICAgICAgICAgICAgICAgICA/IE5PX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICAgOiBzZXRPcHRpb25GbGFnc0Zyb21BaWRsKHBhcmNlbGFibGUub3B0aW9uRmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICA/OiBzZXREdXJhdGlvbk1zKHBhcmNlbGFibGUuZHVyYXRpb25NcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID86ICFwYXJjZWxhYmxlLmludGVycG9sYXRvckNvbmZpZyAgLy8gY2hlY2sgc3RkOjpvcHRpb25hbCBmb3IgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEJBRF9WQUxVRSAvLyBtdXN0IGJlIG5vbm51bGwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbnRlcnBvbGF0b3I8UywgVD46OnJlYWRGcm9tQ29uZmlnKCpwYXJjZWxhYmxlLmludGVycG9sYXRvckNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPzogY2hlY2tDdXJ2ZSgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUmV0dXJucyBhIHN0cmluZyBmb3IgZGVidWcgcHJpbnRpbmcuCkBAIC0zMjksNiArMzQ1LDUxIEBACiAgICAgICAgIGludDMyX3QgbUlkOyAgICAgICAgICAgICAvLyBBIHZhbGlkIGlkIGlzID49IDAuCiAgICAgICAgIE9wdGlvbkZsYWcgbU9wdGlvbkZsYWdzOyAvLyBvcHRpb24gZmxhZ3MgZm9yIHRoZSBjb25maWd1cmF0aW9uLgogICAgICAgICBkb3VibGUgbUR1cmF0aW9uTXM7ICAgICAgLy8gZHVyYXRpb24sIG11c3QgYmUgPiAwOyBkZWZhdWx0IGlzIDEwMDAgbXMuCisKKyAgICAgICAgaW50MzJfdCBnZXRPcHRpb25GbGFnc0FzQWlkbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIGludDMyX3QgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIGlmIChnZXRPcHRpb25GbGFncygpICYgT1BUSU9OX0ZMQUdfVk9MVU1FX0lOX0RCRlMpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT3B0aW9uRmxhZzo6Vk9MVU1FX0lOX0RCRlMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldE9wdGlvbkZsYWdzKCkgJiBPUFRJT05fRkxBR19DTE9DS19USU1FKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9IDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT3B0aW9uRmxhZzo6Q0xPQ0tfVElNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc2V0T3B0aW9uRmxhZ3NGcm9tQWlkbChpbnQzMl90IGFpZGwpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8T3B0aW9uRmxhZz4gb3B0aW9ucyA9IDA7CisgICAgICAgICAgICBpZiAoYWlkbCAmICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbk9wdGlvbkZsYWc6OlZPTFVNRV9JTl9EQkZTKSkpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zIHw9IE9QVElPTl9GTEFHX1ZPTFVNRV9JTl9EQkZTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PcHRpb25GbGFnOjpDTE9DS19USU1FKSkpIHsKKyAgICAgICAgICAgICAgICBvcHRpb25zIHw9IE9QVElPTl9GTEFHX0NMT0NLX1RJTUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2V0T3B0aW9uRmxhZ3Moc3RhdGljX2Nhc3Q8T3B0aW9uRmxhZz4ob3B0aW9ucykpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc2V0VHlwZUZyb21BaWRsKFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlIGFpZGwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICAgICAgICAgIGNhc2UgVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvblR5cGU6OklEOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VHlwZShUWVBFX0lEKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlOjpTQ0FMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFR5cGUoVFlQRV9TQ0FMRSk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlIGdldFR5cGVBc0FpZGwoKSBjb25zdCB7CisgICAgICAgICAgICBzd2l0Y2ggKGdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25UeXBlOjpJRDsKKyAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0NBTEU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uVHlwZTo6U0NBTEU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9OyAvLyBDb25maWd1cmF0aW9uCiAKICAgICAvKiBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiBleHByZXNzZXMgYW4gb3BlcmF0aW9uIHRvIHBlcmZvcm0gb24gdGhlCkBAIC00MjAsMTkgKzQ4MSwyOSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1GbGFncykKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT53cml0ZUludDMyKG1SZXBsYWNlSWQpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChtWE9mZnNldCk7CisgICAgICAgICAgICBWb2x1bWVTaGFwZXJPcGVyYXRpb24gb3A7CisgICAgICAgICAgICB3cml0ZVRvUGFyY2VsYWJsZSgmb3ApOworICAgICAgICAgICAgcmV0dXJuIG9wLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBpbnQzMl90IGZsYWdzOwotICAgICAgICAgICAgcmV0dXJuIHBhcmNlbC0+cmVhZEludDMyKCZmbGFncykKLSAgICAgICAgICAgICAgICAgICAgPzogcGFyY2VsLT5yZWFkSW50MzIoJm1SZXBsYWNlSWQpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCkKLSAgICAgICAgICAgICAgICAgICAgPzogc2V0RmxhZ3MoKEZsYWcpZmxhZ3MpOworICAgICAgICB2b2lkIHdyaXRlVG9QYXJjZWxhYmxlKFZvbHVtZVNoYXBlck9wZXJhdGlvbiogb3ApIGNvbnN0IHsKKyAgICAgICAgICAgIG9wLT5mbGFncyA9IGdldEZsYWdzQXNBaWRsKCk7CisgICAgICAgICAgICBvcC0+cmVwbGFjZUlkID0gbVJlcGxhY2VJZDsKKyAgICAgICAgICAgIG9wLT54T2Zmc2V0ID0gbVhPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgVm9sdW1lU2hhcGVyT3BlcmF0aW9uIG9wOworICAgICAgICAgICAgcmV0dXJuIG9wLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKKyAgICAgICAgICAgICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUob3ApOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IFZvbHVtZVNoYXBlck9wZXJhdGlvbiYgb3ApIHsKKyAgICAgICAgICAgIG1SZXBsYWNlSWQgPSBvcC5yZXBsYWNlSWQ7CisgICAgICAgICAgICBtWE9mZnNldCA9IG9wLnhPZmZzZXQ7CisgICAgICAgICAgICByZXR1cm4gc2V0RmxhZ3NGcm9tQWlkbChvcC5mbGFncyk7CiAgICAgICAgIH0KIAogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKQEAgLTQ0NSw2ICs1MTYsNDggQEAKICAgICAgICAgfQogCiAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdHVzX3Qgc2V0RmxhZ3NGcm9tQWlkbChpbnQzMl90IGFpZGwpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8RmxhZz4gZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OlJFVkVSU0UpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfUkVWRVJTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhaWRsICYgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpURVJNSU5BVEUpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfVEVSTUlOQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFpZGwgJiAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OkpPSU4pKSkgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfSk9JTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhaWRsICYgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpERUxBWSkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19ERUxBWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhaWRsICYgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpDUkVBVEVfSUZfTkVDRVNTQVJZKSkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NSRUFURV9JRl9ORUNFU1NBUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2V0RmxhZ3Moc3RhdGljX2Nhc3Q8RmxhZz4oZmxhZ3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgZ2V0RmxhZ3NBc0FpZGwoKSBjb25zdCB7CisgICAgICAgICAgICBpbnQzMl90IGFpZGwgPSAwOworICAgICAgICAgICAgc3RkOjp1bmRlcmx5aW5nX3R5cGVfdDxGbGFnPiBmbGFncyA9IGdldEZsYWdzKCk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1JFVkVSU0UpIHsKKyAgICAgICAgICAgICAgICBhaWRsIHw9ICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6UkVWRVJTRSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19URVJNSU5BVEUpIHsKKyAgICAgICAgICAgICAgICBhaWRsIHw9ICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6VEVSTUlOQVRFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX0pPSU4pIHsKKyAgICAgICAgICAgICAgICBhaWRsIHw9ICgxIDw8IHN0YXRpY19jYXN0PGludD4oVm9sdW1lU2hhcGVyT3BlcmF0aW9uRmxhZzo6Sk9JTikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19ERUxBWSkgeworICAgICAgICAgICAgICAgIGFpZGwgfD0gKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihWb2x1bWVTaGFwZXJPcGVyYXRpb25GbGFnOjpERUxBWSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR19DUkVBVEVfSUZfTkVDRVNTQVJZKSB7CisgICAgICAgICAgICAgICAgYWlkbCB8PSAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFZvbHVtZVNoYXBlck9wZXJhdGlvbkZsYWc6OkNSRUFURV9JRl9ORUNFU1NBUlkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgogICAgICAgICBGbGFnIG1GbGFnczsgICAgICAgIC8vIG9wZXJhdGlvbiB0byBkbwogICAgICAgICBpbnQzMl90IG1SZXBsYWNlSWQ7IC8vIGlmID49IDAgdGhlIGlkIHRvIHJlbW92ZSBpbiBhIHJlcGxhY2Ugb3BlcmF0aW9uLgogICAgICAgICBTIG1YT2Zmc2V0OyAgICAgICAgIC8vIHBvc2l0aW9uIGluIHRoZSBjdXJ2ZSB0byBzZXQgaWYgYSB2YWxpZCBudW1iZXIgKG5vdCBuYW4pCkBAIC00ODMsMTUgKzU5NiwyOCBAQAogICAgICAgICAgICAgbVhPZmZzZXQgPSB4T2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7CiAgICAgICAgICAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyY2VsLT53cml0ZUZsb2F0KG1Wb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+d3JpdGVGbG9hdChtWE9mZnNldCk7CisgICAgICAgICAgICBWb2x1bWVTaGFwZXJTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHdyaXRlVG9QYXJjZWxhYmxlKCZzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgICAgICB9CiAKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJjZWwtPnJlYWRGbG9hdCgmbVZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgID86IHBhcmNlbC0+cmVhZEZsb2F0KCZtWE9mZnNldCk7CisgICAgICAgIHZvaWQgd3JpdGVUb1BhcmNlbGFibGUoVm9sdW1lU2hhcGVyU3RhdGUqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICAgICAgICAgIHBhcmNlbGFibGUtPnZvbHVtZSA9IG1Wb2x1bWU7CisgICAgICAgICAgICBwYXJjZWxhYmxlLT54T2Zmc2V0ID0gbVhPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgVm9sdW1lU2hhcGVyU3RhdGUgc3RhdGU7CisgICAgICAgICAgICByZXR1cm4gc3RhdGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICAgICAgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgVm9sdW1lU2hhcGVyU3RhdGUmIHBhcmNlbGFibGUpIHsKKyAgICAgICAgICAgIG1Wb2x1bWUgPSBwYXJjZWxhYmxlLnZvbHVtZTsKKyAgICAgICAgICAgIG1YT2Zmc2V0ID0gcGFyY2VsYWJsZS54T2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCA5Y2FiZDhiLi4yMDBlOTJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTE4Miw2ICsxODIsNyBAQAogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgc2V0IGJ5IEF1ZGlvVHJhY2suc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkuCiAgICAgICAgICAgICAgICAgLy8gQSB3cml0ZSB3aWxsIG5vdCBmaWxsIHRoZSBidWZmZXIgYWJvdmUgdGhpcyBsaW1pdC4KICAgICB2b2xhdGlsZSAgICB1aW50MzJfdCAgIG1CdWZmZXJTaXplSW5GcmFtZXM7ICAvLyBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgdm9sYXRpbGUgICAgdWludDMyX3QgICBtU3RhcnRUaHJlc2hvbGRJbkZyYW1lczsgLy8gbWluIGZyYW1lcyBpbiBidWZmZXIgdG8gc3RhcnQgc3RyZWFtaW5nCiAKIHB1YmxpYzoKIApAQCAtMjE2LDYgKzIxNyw4IEBACiAgICAgfTsKIAogICAgIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUZyYW1lQ291bnQ7IH0KKyAgICB1aW50MzJfdCBnZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKCkgY29uc3Q7CisgICAgdWludDMyX3Qgc2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcyh1aW50MzJfdCBzdGFydFRocmVzaG9sZEluRnJhbWVzKTsKIAogcHJvdGVjdGVkOgogICAgIC8vIFRoZXNlIHJlZmVyIHRvIHNoYXJlZCBtZW1vcnksIGFuZCBhcmUgdmlydHVhbCBhZGRyZXNzZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuCmRpZmYgLS1naXQgYS9tZWRpYS9PV05FUlMgYi9tZWRpYS9PV05FUlMKaW5kZXggMWFmYzI1My4uNGNmNDg3MCAxMDA2NDQKLS0tIGEvbWVkaWEvT1dORVJTCisrKyBiL21lZGlhL09XTkVSUwpAQCAtMSwyMyArMSwyMCBAQAotYW5kcmV3bGV3aXNAZ29vZ2xlLmNvbQotY2h6QGdvb2dsZS5jb20KLWR3a2FuZ0Bnb29nbGUuY29tCisjIEJ1ZyBjb21wb25lbnQ6IDEzNDQKIGVsYXVyZW50QGdvb2dsZS5jb20KIGVzc2lja0Bnb29nbGUuY29tCi1na2FzdGVuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBodW5nYUBnb29nbGUuY29tCiBqaWFiaW5AZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCi1rcm9jYXJkQGdvb2dsZS5jb20KIGxham9zQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQotcGF3aW5AZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCiBwaGlsYnVya0Bnb29nbGUuY29tCiBwbWNsZWFuQGdvb2dsZS5jb20KLXJhY2hhZEBnb29nbGUuY29tCitxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCiByYWdvQGdvb2dsZS5jb20KIHJvYmVydHNoaWhAZ29vZ2xlLmNvbQogdGFrbGVlQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQogd29uc2lrQGdvb2dsZS5jb20KKworIyBnby9hbmRyb2lkLWZ3ay1tZWRpYS1zb2x1dGlvbnMgZm9yIGluZm8gb24gYXJlYXMgb2Ygb3duZXJzaGlwLgoraW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9tZWRpYS9qYW5pdG9ycy9tZWRpYV9zb2x1dGlvbnNfT1dORVJTCmRpZmYgLS1naXQgYS9tZWRpYS9URVNUX01BUFBJTkcgYi9tZWRpYS9URVNUX01BUFBJTkcKaW5kZXggYTZkZmIyMS4uNWJjNzI2MiAxMDA2NDQKLS0tIGEvbWVkaWEvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL1RFU1RfTUFQUElORwpAQCAtMSwzMiArMSw2NSBAQAorLy8gZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEKIHsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICB7Ci0gICAgICAibmFtZSI6ICJHdHNNZWRpYVRlc3RDYXNlcyIsCi0gICAgICAib3B0aW9ucyIgOiBbCisgICAgInByZXN1Ym1pdC1sYXJnZSI6IFsKKyAgICAgICAgLy8gcnVucyB3aGVuZXZlciB3ZSBjaGFuZ2Ugc29tZXRoaW5nIGluIHRoaXMgdHJlZQogICAgICAgICB7Ci0gICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUHJlc3VibWl0IgorICAgICAgICAgICAgIm5hbWUiOiAiQ3RzTWVkaWFUZXN0Q2FzZXMiLAorICAgICAgICAgICAgIm9wdGlvbnMiOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiYW5kcm9pZC5tZWRpYS5jdHMuRW5jb2RlRGVjb2RlVGVzdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdCiAgICAgICAgIH0sCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLm1lZGlhLmd0cy5XaWRldmluZUdlbmVyaWNPcHNUZXN0cyIKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJvcHRpb25zIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkRlY29kZUVkaXRFbmNvZGVUZXN0IgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0KICAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgewotICAgICAgIm5hbWUiOiAiR3RzRXhvUGxheWVyVGVzdENhc2VzIiwKLSAgICAgICJvcHRpb25zIiA6IFsKKyAgICBdLAorICAgICJwcmVzdWJtaXQiOiBbCiAgICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5Tb2NQcmVzdWJtaXQiCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLmV4b3BsYXllci5ndHMuRGFzaFRlc3QjdGVzdFdpZGV2aW5lMjNGcHNIMjY0Rml4ZWQiCisgICAgICAgICAgICAibmFtZSI6ICJHdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAib3B0aW9ucyIgOiBbCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1hbm5vdGF0aW9uIjogImFuZHJvaWQucGxhdGZvcm0udGVzdC5hbm5vdGF0aW9ucy5QcmVzdWJtaXQiCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJjb20uZ29vZ2xlLmFuZHJvaWQubWVkaWEuZ3RzLldpZGV2aW5lR2VuZXJpY09wc1Rlc3RzIgorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZS1maWx0ZXIiOiAiY29tLmdvb2dsZS5hbmRyb2lkLm1lZGlhLmd0cy5XaWRldmluZUgyNjRQbGF5YmFja1Rlc3RzIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0KICAgICAgICAgfQotICAgICAgXQotICAgIH0KLSAgXSwKLSAgImltcG9ydHMiOiBbCi0gICAgewotICAgICAgInBhdGgiOiAiZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFkcm0vcGx1Z2lucyIKLSAgICB9Ci0gIF0KLX0KKyAgICBdLAogCisgICAgImltcG9ydHMiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJwYXRoIjogImZyYW1ld29ya3MvYXYvZHJtL21lZGlhZHJtL3BsdWdpbnMiCisgICAgICAgIH0KKyAgICBdLAorCisgICAgInBsYXRpbnVtLXBvc3RzdWJtaXQiOiBbCisgICAgICAgIC8vIHJ1bnMgcmVndWxhcmx5LCBpbmRlcGVuZGVudCBvZiBjaGFuZ2VzIGluIHRoaXMgdHJlZS4KKyAgICAgICAgLy8gc2lnbmFscyBpZiBjaGFuZ2VzIGVsc2V3aGVyZSBicmVhayBtZWRpYSBmdW5jdGlvbmFsaXR5CisgICAgICAgIHsKKyAgICAgICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICAgICAgICJvcHRpb25zIjogWworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUtZmlsdGVyIjogImFuZHJvaWQubWVkaWEuY3RzLkVuY29kZURlY29kZVRlc3QiCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5EZWNvZGVFZGl0RW5jb2RlVGVzdCIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdCisgICAgICAgIH0KKyAgICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTI1ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImF1ZGlvc2VydmVyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1haW5fYXVkaW9zZXJ2ZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvc2VydmljZSIsCisgICAgICAgICJsaWJhdWRpb2ZsaW5nZXIiLAorICAgICAgICAibGliYXVkaW9wb2xpY3lzZXJ2aWNlIiwKKyAgICAgICAgImxpYmF1ZGlvcHJvY2Vzc2luZyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYWxvZ3NlcnZpY2UiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidmlicmF0b3IiLAorCisgICAgXSwKKworICAgIC8vIFRPRE8gY2hlY2sgaWYgd2Ugc3RpbGwgbmVlZCBhbGwgb2YgdGhlc2UgaW5jbHVkZSBkaXJlY3RvcmllcworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvc29uaWMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmciLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2ciLAorCisgICAgICAgIC8vIFRPRE8gb2JvZXNlcnZpY2UgaXMgdGhlIG9sZCBmb2xkZXIgbmFtZSBmb3IgYWF1ZGlvc2VydmljZS4gSXQgd2lsbCBiZSBjaGFuZ2VkLgorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9vYm9lc2VydmljZSIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsiYXVkaW9zZXJ2ZXIucmMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjMTRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0JbWFpbl9hdWRpb3NlcnZlci5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJhYXVkaW9zZXJ2aWNlIFwKLQlsaWJhdWRpb2ZsaW5nZXIgXAotCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCi0JbGliYXVkaW9wcm9jZXNzaW5nIFwKLQlsaWJiaW5kZXIgXAotCWxpYmN1dGlscyBcCi0JbGlibG9nIFwKLQlsaWJoaWRsYmFzZSBcCi0JbGlibWVkaWEgXAotCWxpYm1lZGlhbG9nc2VydmljZSBcCi0JbGlibWVkaWF1dGlscyBcCi0JbGlibmJhaW8gXAotCWxpYm5ibG9nIFwKLQlsaWJ1dGlscyBcCi0JbGlidmlicmF0b3IKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0JbGliYXVkaW9oYWxfaGVhZGVycyBcCi0JbGlibWVkaWFtZXRyaWNzX2hlYWRlcnMgXAotCi0jIFRPRE8gb2JvZXNlcnZpY2UgaXMgdGhlIG9sZCBmb2xkZXIgbmFtZSBmb3IgYWF1ZGlvc2VydmljZS4gSXQgd2lsbCBiZSBjaGFuZ2VkLgotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotCWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZSBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9vYm9lc2VydmljZSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZyBcCi0JZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlIFwKLQlleHRlcm5hbC9zb25pYyBcCi0KLUxPQ0FMX01PRFVMRSA6PSBhdWRpb3NlcnZlcgotCi1MT0NBTF9JTklUX1JDIDo9IGF1ZGlvc2VydmVyLnJjCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwppbmRleCBmMDVjMmQyLi5jNGE2NjAxIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYworKysgYi9tZWRpYS9hdWRpb3NlcnZlci9hdWRpb3NlcnZlci5yYwpAQCAtNiw4ICs2LDEyIEBACiAgICAgY2FwYWJpbGl0aWVzIEJMT0NLX1NVU1BFTkQKICAgICBpb3ByaW8gcnQgNAogICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaCBIaWdoUGVyZm9ybWFuY2UKLQotICAgIG9ucmVzdGFydCBzZXRwcm9wIHN5cy5hdWRpby5yZXN0YXJ0LmhhbCAxCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAorICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvX3Byb3h5X3NlcnZpY2UKKyAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKIAogb24gcHJvcGVydHk6dnRzLm5hdGl2ZV9zZXJ2ZXIub249MQogICAgIHN0b3AgYXVkaW9zZXJ2ZXIKQEAgLTE3LDYgKzIxLDcgQEAKIG9uIHByb3BlcnR5OmluaXQuc3ZjLmF1ZGlvc2VydmVyPXN0b3BwZWQKICAgICBzdG9wIHZlbmRvci5hdWRpby1oYWwKICAgICBzdG9wIHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAorICAgIHN0b3AgYXVkaW9fcHJveHlfc2VydmljZQogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgIHN0b3AgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKICAgICBzdG9wIGF1ZGlvLWhhbC0yLTAKQEAgLTI1LDYgKzMwLDcgQEAKICAgICAjIGF1ZGlvc2VydmVyIGJyaW5naW5nIGl0IGJhY2sgaW50byBydW5uaW5nIHN0YXRlLgogICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwKICAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKKyAgICBzdGFydCBhdWRpb19wcm94eV9zZXJ2aWNlCiAgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKICAgICBzdGFydCBhdWRpby1oYWwtMi0wCkBAIC0zMiwxNiArMzgsMjQgQEAKIG9uIHByb3BlcnR5OmluaXQuc3ZjLmF1ZGlvc2VydmVyPXJ1bm5pbmcKICAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsCiAgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgc3RhcnQgYXVkaW9fcHJveHlfc2VydmljZQogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwtMi0wCiAgICAgc3RhcnQgYXVkaW8taGFsLTItMAogCiBvbiBwcm9wZXJ0eTpzeXMuYXVkaW8ucmVzdGFydC5oYWw9MQotICAgIHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbAotICAgIHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgIyBTZWUgYi8xNTk5NjYyNDMuIEF2b2lkIHJlc3RhcnQgbG9vcCBiZXR3ZWVuIGF1ZGlvc2VydmVyIGFuZCBIQUwuCiAgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAotICAgIHJlc3RhcnQgYXVkaW8taGFsLTItMAorICAgIHN0b3AgdmVuZG9yLmF1ZGlvLWhhbAorICAgIHN0b3AgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgc3RvcCBhdWRpb19wcm94eV9zZXJ2aWNlCisgICAgc3RvcCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIHN0b3AgYXVkaW8taGFsLTItMAorICAgIHN0YXJ0IHZlbmRvci5hdWRpby1oYWwKKyAgICBzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTQtMC1tc2QKKyAgICBzdGFydCBhdWRpb19wcm94eV9zZXJ2aWNlCisgICAgc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKKyAgICBzdGFydCBhdWRpby1oYWwtMi0wCiAgICAgIyByZXNldCB0aGUgcHJvcGVydHkKICAgICBzZXRwcm9wIHN5cy5hdWRpby5yZXN0YXJ0LmhhbCAwCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggZjlmNGYzMS4uOGVlMWVmYiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTI5LDggKzI5LDggQEAKICNpbmNsdWRlIDxtZWRpYXV0aWxzL0xpbWl0UHJvY2Vzc01lbW9yeS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0vLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvVGVzdGluZy5oIgorLy8gZnJvbSBpbmNsdWRlX2RpcnMKKyNpbmNsdWRlICJhYXVkaW8vQUF1ZGlvVGVzdGluZy5oIiAvLyBhYXVkaW9fcG9saWN5X3QsIEFBVURJT19QUk9QX01NQVBfUE9MSUNZLCBBQVVESU9fUE9MSUNZXyoKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlLmgiCkBAIC00OSw3ICs0OSwxMiBAQAogCiAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogCisjaWYgMQorICAgIC8vIEZJWE1FIFNlZSBidWcgMTY1NzAyMzk0IGFuZCBidWcgMTY4NTExNDg1CisgICAgY29uc3QgYm9vbCBkb0xvZyA9IGZhbHNlOworI2Vsc2UKICAgICBib29sIGRvTG9nID0gKGJvb2wpIHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCAwKTsKKyNlbmRpZgogCiAgICAgcGlkX3QgY2hpbGRQaWQ7CiAgICAgLy8gRklYTUUgVGhlIGFkdmFudGFnZSBvZiBtYWtpbmcgdGhlIHByb2Nlc3MgY29udGFpbmluZyBtZWRpYS5sb2cgc2VydmljZSB0aGUgcGFyZW50IHByb2Nlc3Mgb2YKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BbmRyb2lkLmJwCmluZGV4IGY4MTdjNzYuLjE2Y2Y5MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDEuMCIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKaW5kZXggNjkxZWQ0MC4uMDk3N2JhNSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0U2luZ2xlVGVzdCIsCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcAppbmRleCAxNzk2ODE5Li5kOGNjMjg1IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icAppbmRleCA1MzZmNzVlLi4wZDFmZTI3IDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLWRlZmF1bHQiLAogICAgIHNyY3M6IFsKQEAgLTQ5LDQgKzU4LDMgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCmluZGV4IDkzMDhiODEuLmNkYTIzZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiBuYW1lc3BhY2UgVjJfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCi1zdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMjAwMDAwMDsgLy8gMnMKIHN0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOwogc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCiBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Q2FjaGVkQnVmZmVyQ291bnQgPSA2NDsKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDg0OTI5MzkuLjgwM2E4MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRTaW5nbGVUZXN0IiwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKQEAgLTI1LDcgKzM0LDcgQEAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliZm1xIiwKQEAgLTQ0LDEwICs1MywzMCBAQAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJmbXEiLAogICAgIF0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldENvbmRUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgImNvbmQuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAKaW5kZXggODQzZjdlYS4uMjViMDhlZiAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCkBAIC0xMjAsNiArMTIwLDI0IEBACiAKIH0KIAordm9pZCBJcGNNdXRleDo6aW5pdCgpIHsKKyAgcHRocmVhZF9tdXRleGF0dHJfdCBtYXR0cjsKKyAgcHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbWF0dHIpOworICBwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkKCZtYXR0ciwgUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCk7CisgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9jaywgJm1hdHRyKTsKKyAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbWF0dHIpOworCisgIHB0aHJlYWRfY29uZGF0dHJfdCBjYXR0cjsKKyAgcHRocmVhZF9jb25kYXR0cl9pbml0KCZjYXR0cik7CisgIHB0aHJlYWRfY29uZGF0dHJfc2V0cHNoYXJlZCgmY2F0dHIsIFBUSFJFQURfUFJPQ0VTU19TSEFSRUQpOworICBwdGhyZWFkX2NvbmRfaW5pdCgmY29uZCwgJmNhdHRyKTsKKyAgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KCZjYXR0cik7Cit9CisKK0lwY011dGV4ICpJcGNNdXRleDo6SW1wb3J0KHZvaWQgKnBNdXRleCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJcGNNdXRleCAqPihwTXV0ZXgpOworfQorCiAKIFJlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKQEAgLTIwMSw5ICsyMTksMzMgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpNYXBNZW1vcnlGb3JNdXRleChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgdm9pZCAqKm1lbSkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgICptZW0gPSBtbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisgIGlmICgqbWVtID09IE1BUF9GQUlMRUQgfHwgKm1lbSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpVbm1hcE1lbW9yeUZvck11dGV4KHZvaWQgKm1lbSkgeworICBtdW5tYXAobWVtLCBzaXplb2YoSXBjTXV0ZXgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CiAgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKICAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOwogCiAgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOwogfQorCit2b2lkIGdldElwY011dGV4UGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhzaXplb2YoSXBjTXV0ZXgpKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKaW5kZXggNTI4MWRjMy4uODYyZDFhNSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAogI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICiAKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KIAogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7CkBAIC0yNSw2ICsyNiwxNyBAQAogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CiAgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKIAorc3RydWN0IElwY011dGV4IHsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7CisgIHB0aHJlYWRfY29uZF90IGNvbmQ7CisgIGludCBjb3VudGVyID0gMDsKKyAgYm9vbCBzaWduYWxsZWQgPSBmYWxzZTsKKworICB2b2lkIGluaXQoKTsKKworICBzdGF0aWMgSXBjTXV0ZXggKkltcG9ydCh2b2lkICptZW0pOworfTsKKwogLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCiBjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKICBwdWJsaWM6CkBAIC00Myw5ICs1NSwxNCBAQAogCiAgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOwogCisgIHN0YXRpYyBib29sIE1hcE1lbW9yeUZvck11dGV4KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCB2b2lkICoqbWVtKTsKKworICBzdGF0aWMgYm9vbCBVbm1hcE1lbW9yeUZvck11dGV4KHZvaWQgKm1lbSk7CiB9OwogCiAvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwogdm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOwogCit2b2lkIGdldElwY011dGV4UGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCiAjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2NvbmQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvY29uZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiZWVhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2NvbmQuY3BwCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKK2NvbnN0ZXhwciBpbnQga1NpZ25hbEludCA9IDIwMDsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sTXVsdGlUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtUmVjZWl2ZXJQaWQgPSAtMTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1Db21tYW5kUGlwZUZkcykgPT0gMCk7CisgICAgQVNTRVJUX1RSVUUocGlwZShtUmVzdWx0UGlwZUZkcykgPT0gMCk7CisKKyAgICBtUmVjZWl2ZXJQaWQgPSBmb3JrKCk7CisgICAgQVNTRVJUX1RSVUUobVJlY2VpdmVyUGlkID49IDApOworCisgICAgaWYgKG1SZWNlaXZlclBpZCA9PSAwKSB7CisgICAgICBkb1JlY2VpdmVyKCk7CisgICAgICAvLyBJbiBvcmRlciB0byBpZ25vcmUgZ3Rlc3QgYmVoYXZpb3VyLCB3YWl0IGZvciBiZWluZyBraWxsZWQgZnJvbQorICAgICAgLy8gdGVhckRvd24KKyAgICAgIHBhdXNlKCk7CisgICAgfQorCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gdHJ1ZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobVJlY2VpdmVyUGlkID4gMCkgeworICAgICAga2lsbChtUmVjZWl2ZXJQaWQsIFNJR0tJTEwpOworICAgICAgaW50IHdzdGF0dXM7CisgICAgICB3YWl0KCZ3c3RhdHVzKTsKKyAgICB9CisKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIHBpZF90IG1SZWNlaXZlclBpZDsKKyAgaW50IG1Db21tYW5kUGlwZUZkc1syXTsKKyAgaW50IG1SZXN1bHRQaXBlRmRzWzJdOworCisgIGJvb2wgc2VuZE1lc3NhZ2UoaW50ICpwaXBlcywgY29uc3QgUGlwZU1lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gd3JpdGUocGlwZXNbMV0sIG1lc3NhZ2UuYXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgcmVjZWl2ZU1lc3NhZ2UoaW50ICpwaXBlcywgUGlwZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKKyAgICBpbnQgcmV0ID0gcmVhZChwaXBlc1swXSwgbWVzc2FnZS0+YXJyYXksIHNpemVvZihQaXBlTWVzc2FnZSkpOworICAgIHJldHVybiByZXQgPT0gc2l6ZW9mKFBpcGVNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgZG9SZWNlaXZlcigpIHsKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDEsIGZhbHNlKTsKKyAgICBQaXBlTWVzc2FnZSBtZXNzYWdlOworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIW1NYW5hZ2VyKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkOjpzdGF0dXNfdCBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJBc1NlcnZpY2UoKTsKKyAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX0VSUk9SOworICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpJTklUX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKworICAgIGludCB2YWwgPSAwOworICAgIHJlY2VpdmVNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgJm1lc3NhZ2UpOworICAgIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmhhbmRsZSA9IG51bGxwdHI7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHJidWZmZXI7CisgICAgICB2b2lkICptZW0gPSBudWxscHRyOworICAgICAgSXBjTXV0ZXggKm11dGV4ID0gbnVsbHB0cjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6Ok1hcE1lbW9yeUZvck11dGV4KHJoYW5kbGUsICZtZW0pKSB7CisgICAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbXV0ZXggPSBJcGNNdXRleDo6SW1wb3J0KG1lbSk7CisgICAgICBwdGhyZWFkX211dGV4X2xvY2soJihtdXRleC0+bG9jaykpOworICAgICAgd2hpbGUgKG11dGV4LT5zaWduYWxsZWQgIT0gdHJ1ZSkgeworICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCYobXV0ZXgtPmNvbmQpLCAmKG11dGV4LT5sb2NrKSk7CisgICAgICB9CisgICAgICB2YWwgPSBtdXRleC0+Y291bnRlcjsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobXV0ZXgtPmxvY2spKTsKKworICAgICAgKHZvaWQpVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlVubWFwTWVtb3J5Rm9yTXV0ZXgobWVtKTsKKyAgICAgIGlmIChyaGFuZGxlKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UocmhhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKHJoYW5kbGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAodmFsID09IGtTaWduYWxJbnQpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgfQorICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICAgIHZvaWQgKm1lbSA9IG51bGxwdHI7CisgICAgSXBjTXV0ZXggKm11dGV4ID0gbnVsbHB0cjsKKworICAgIGdldElwY011dGV4UGFyYW1zKCZ2ZWNQYXJhbXMpOworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZzaGFuZGxlLCAmc2J1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6Ok1hcE1lbW9yeUZvck11dGV4KHNoYW5kbGUsICZtZW0pKTsKKworICAgIG11dGV4ID0gbmV3KG1lbSkgSXBjTXV0ZXgoKTsKKyAgICBtdXRleC0+aW5pdCgpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpTRU5EOworICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCA9IHNidWZmZXItPm1JZDsKKyAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkID0gcmVjZWl2ZXJJZDsKKyAgICBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzID0gcG9zdFVzOworICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CisgICAgZm9yIChpbnQgaT0wOyBpIDwgMjAwMDAwMDAwOyArK2kpIHsKKyAgICAgIC8vIG5vLW9wIGluIG9yZGVyIHRvIGVuc3VyZQorICAgICAgLy8gcHRocmVhZF9jb25kX3dhaXQgaXMgY2FsbGVkIGJlZm9yZSBwdGhyZWFkX2NvbmRfc2lnbmFsCisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKG11dGV4LT5sb2NrKSk7CisgICAgbXV0ZXgtPmNvdW50ZXIgPSBrU2lnbmFsSW50OworICAgIG11dGV4LT5zaWduYWxsZWQgPSB0cnVlOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJihtdXRleC0+Y29uZCkpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobXV0ZXgtPmxvY2spKTsKKyAgICAodm9pZClUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VW5tYXBNZW1vcnlGb3JNdXRleChtZW0pOworICAgIGlmIChzaGFuZGxlKSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHNoYW5kbGUpOworICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc2hhbmRsZSk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmRhdGEuY29tbWFuZCA9PSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKaW5kZXggNjhiNjk5Mi4uNDNiMGE4YyAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApAQCAtMTYxLDExICsxNjEsMTggQEAKICAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKICAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKICAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgewotICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKLSAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOwotICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9FUlJPUjsKKyAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAocmhhbmRsZSkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHJoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShyaGFuZGxlKTsKICAgICAgIH0KICAgICB9CiAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKQEAgLTE5OCw2ICsyMDUsMTAgQEAKICAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CiAKICAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisgICAgaWYgKHNoYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzaGFuZGxlKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoc2hhbmRsZSk7CisgICAgfQogCiAgICAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKHJlY2VpdmVySWQsIHNidWZmZXIsICZ0cmFuc2FjdGlvbklkLCAmcG9zdFVzKTsKICAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CkBAIC0yMTAsMTIgKzIyMSwxMyBAQAogICAgIHNlbmRNZXNzYWdlKG1Db21tYW5kUGlwZUZkcywgbWVzc2FnZSk7CiAgIH0KICAgRVhQRUNUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuZGF0YS5jb21tYW5kID09IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LKTsKIH0KIAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcAppbmRleCA3NzdlZGNmLi4xZTkwMjdiIDEwMDY0NAotLS0gYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAKQEAgLTEwMiw2ICsxMDIsMTAgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgewogICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcltpXSk7CiAgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIGlmIChhbGxvY0hhbmRsZSkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShhbGxvY0hhbmRsZSk7CisgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShhbGxvY0hhbmRsZSk7CisgICAgfQogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraikgewpAQCAtMTI1LDYgKzEyOSwxMCBAQAogICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJmJ1ZmZlcik7CiAgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOwogICAgIGJpZFtpXSA9IGJ1ZmZlci0+bUlkOworICAgIGlmIChhbGxvY0hhbmRsZSkgeworICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShhbGxvY0hhbmRsZSk7CisgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShhbGxvY0hhbmRsZSk7CisgICAgfQogICB9CiAgIGZvciAoaW50IGkgPSAxOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKICAgICBBU1NFUlRfVFJVRShiaWRbaSAtIDFdID09IGJpZFtpXSk7CkBAIC0xNTQsNiArMTYyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN2SGFuZGxlLCAmcmJ1ZmZlcik7CiAgIEVYUEVDVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKICAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyZWN2SGFuZGxlLCAweDc3KSk7CisKKyAgaWYgKGFsbG9jSGFuZGxlKSB7CisgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShhbGxvY0hhbmRsZSk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoYWxsb2NIYW5kbGUpOworICB9CisgIGlmIChyZWN2SGFuZGxlKSB7CisgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShyZWN2SGFuZGxlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShyZWN2SGFuZGxlKTsKKyAgfQogfQogCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWMyL1RFU1RfTUFQUElORwppbmRleCBmY2EzNDc3Li42YWM0MjEwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2NvZGVjMi9URVNUX01BUFBJTkcKQEAgLTQsNyArNCw5IEBACiAgICAgLy8geyAibmFtZSI6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0In0sCiAgICAgLy8gVE9ETyhiLzE1NTUxNjUyNCkKICAgICAvLyB7ICJuYW1lIjogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0In0sCi0gICAgeyAibmFtZSI6ICJjb2RlYzJfdm5ka190ZXN0In0sCisgICAgeyAibmFtZSI6ICJjb2RlYzJfdm5ka190ZXN0In0KKyAgXSwKKyAgInByZXN1Ym1pdC1sYXJnZSI6IFsKICAgICB7CiAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCiAgICAgICAib3B0aW9ucyI6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKaW5kZXggNTA0OTVhOS4uYzU0N2U4NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2FhY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19hYWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKaW5kZXggZjY1NmJiNi4uMzQyZDc3MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTI4OSwxMyArMjg5LDE0IEBACiAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CiAgICAgbUJ1ZmZlcnNJbmZvLmNsZWFyKCk7CiAKLSAgICAvLyBUbyBtYWtlIHRoZSBjb2RlYyBiZWhhdmUgdGhlIHNhbWUgYmVmb3JlIGFuZCBhZnRlciBhIHJlc2V0LCB3ZSBuZWVkIHRvIGludmFsaWRhdGUgdGhlCi0gICAgLy8gc3RyZWFtaW5mbyBzdHJ1Y3QuIFRoaXMgZG9lcyB0aGF0OgotICAgIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlID0gMDsgLy8gVE9ETzogbVN0cmVhbUluZm8gaXMgcmVhZCBvbmx5Ci0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgIGlmIChtQUFDRGVjb2RlcikgeworICAgICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKKyAgICAgICAgc3RhdHVzID0gaW5pdERlY29kZXIoKTsKKyAgICB9CiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAKLSAgICByZXR1cm4gQzJfT0s7CisgICAgcmV0dXJuIHN0YXR1cyA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOwogfQogCiB2b2lkIEMyU29mdEFhY0RlYzo6b25SZXNldCgpIHsKQEAgLTUxNCw4ICs1MTUsOCBAQAogCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgogICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKLSAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBudW1TYW1wbGVzICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soYnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgewogICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGZldGNoIGEgbGluZWFyIGJsb2NrICglZCkiLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9OT19NRU1PUlkpOwpAQCAtNTI5LDcgKzUzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmJpbmQoZmlsbEVtcHR5V29yaywgXzEsIEMyX0NPUlJVUFRFRCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKV0oCisgICAgICAgICAgICAgICAgcmV0dXJuIFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIGJ1ZmZlclNpemUpXSgKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CiAgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOwogICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OwpAQCAtODgyLDEwICs4ODMsMTQgQEAKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGN1cnJlbnRCb29zdEZhY3RvcikpOwogCi0gICAgICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQgY3VycmVudENvbXByZXNzTW9kZSgwdSwKLSAgICAgICAgICAgICAgICAgICAgKEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90KSBjb21wcmVzc01vZGUpOwotICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY3VycmVudENvbXByZXNzTW9kZSkpOworICAgICAgICAgICAgaWYgKGFuZHJvaWRfZ2V0X2RldmljZV9hcGlfbGV2ZWwoKSA8IF9fQU5EUk9JRF9BUElfU19fKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgdXNlZCB0byByZXBvcnQgRFJDIGNvbXByZXNzaW9uIG1vZGUgaW4gdGhlIG91dHB1dCBmb3JtYXQKKyAgICAgICAgICAgICAgICAvLyBpbiBRIGFuZCBSLCBidXQgc3RvcHBlZCBkb2luZyB0aGF0IGluIFMKKyAgICAgICAgICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQgY3VycmVudENvbXByZXNzTW9kZSgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdCkgY29tcHJlc3NNb2RlKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY3VycmVudENvbXByZXNzTW9kZSkpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQgY3VycmVudEVuY29kZWRUYXJnZXRMZXZlbCgwdSwKICAgICAgICAgICAgICAgICAgICAgKEMyRmxvYXRWYWx1ZSkgKGVuY1RhcmdldExldmVsKi0wLjI1KSk7CkBAIC0xMDg5LDExICsxMDk0LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcAppbmRleCAyZTg1OTE1Li5kODY1YWIyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApAQCAtMjcyLDggKzI3Miw5IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChzYnJNb2RlICE9IC0xICYmIGFhY1Byb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgewotICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgc2JyTW9kZSkpIHsKKyAgICBpZiAoc2JyTW9kZSAhPSBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICYmIGFhY1Byb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgeworICAgICAgICBpbnQgYWFjU2JyTW9kZSA9IHNick1vZGUgIT0gQzJDb25maWc6OkFBQ19TQlJfT0ZGOworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfTU9ERSwgYWFjU2JyTW9kZSkpIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CkBAIC02OTIsMTEgKzY5MywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggYmVlOTY5Yi4uN2NlNWM5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKIAogICAgIGlmIChtRGF0YVVwZGF0ZSkgewotICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjaGVjawogICAgICAgICBpZiAoKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKSAmJiAobURlc1RhcmdldCAhPSAtMSkpewogICAgICAgICAgICAgbURlc1RhcmdldCA9IE1BWF9UQVJHRVRfTEVWRUw7ICAvLyBsaW1pdCB0YXJnZXQgbGV2ZWwgdG8gLTEwIGRCIG9yIGJlbG93CiAgICAgICAgICAgICBuZXdUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscwogCi0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKICAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgewogICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQogICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQogCi0gICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICAvLyBWYWxpZGF0aW9uIGNoZWNrIGFnYWluCiAgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CiAgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CiAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCmluZGV4IGIwOWE1MDUuLjE0MThiYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19hbXJfbmJfd2JfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfYW1yX25iX3diX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYyIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKaW5kZXggZjc5NDNiZS4uZTkyZDM4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIGlmICghbUlzV2lkZSkgewogICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1BbXJIYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAwIC8qIHJlc2V0X2FsbCAqLyk7CisgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtQW1ySGFuZGxlLCAxIC8qIHJlc2V0X2FsbCAqLyk7CiAgICAgfQogICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOwogICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKQEAgLTM2MSw3ICszNjEsMTMgQEAKIAogICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOwogICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7Ci0gICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaykpOworICAgIC8vIHdlIGZpbGxlZCB0aGUgb3V0cHV0IGJ1ZmZlciB0byAoaW50cHRyX3Qpb3V0cHV0IC0gKGludHB0cl90KXdWaWV3LmRhdGEoKQorICAgIC8vIHVzZSBjYWxPdXRTaXplIGFzIHRoYXQgY29udGFpbnMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBzYW1wbGVzCisgICAgQUxPR0RfSUYoY2FsT3V0U2l6ZSAhPSAoKGludHB0cl90KW91dHB1dCAtIChpbnRwdHJfdCl3Vmlldy5kYXRhKCkpLAorICAgICAgICAgICAgIkV4cGVjdGVkICV6dSBvdXRwdXQgYnl0ZXMsIGJ1dCBmaWxsZWQgJWxsZCIsCisgICAgICAgICAgICAgY2FsT3V0U2l6ZSwgKGxvbmcgbG9uZykoKGludHB0cl90KW91dHB1dCAtIChpbnRwdHJfdCl3Vmlldy5kYXRhKCkpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIGNhbE91dFNpemUpKTsKICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CiAgICAgaWYgKGVvcykgewogICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKQEAgLTQyMCwxMSArNDI2LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QU1SRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAKaW5kZXggZTJkOGNiNi4uYmI2M2UxZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCkBAIC0zMzcsMTEgKzMzNywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFtck5iRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKaW5kZXggODRhZTRiNy4uODQ3MjhhZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwCkBAIC00MTEsMTEgKzQxMSwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFtcldiRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icAppbmRleCBmY2M0NTUyLi5jYjk4MzdmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdjFkZWNfYW9tIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAppbmRleCBjNzA0NmNiLi5jMDhjZDU5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtNTA2LDMwICs1MDYsMjggQEAKIH0KIAogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHVpbnQ4X3QqIGRzdFN0YXJ0ID0gZHN0OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogfQogCkBAIC01OTYsMTYgKzU5NCwxMiBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC02OTYsNyArNjkwLDkgQEAKICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgKGludCkqKGludDY0X3QqKWltZy0+dXNlcl9wcml2KTsKIAotICAgIHVpbnQ4X3QqIGRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIGRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiBkc3RVID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOwogICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ldOwogICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdOwogICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ZdOwpAQCAtNzEwLDEzICs3MDYsMTQgQEAKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CkBAIC03MjUsNyArNzIyLDcgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKQEAgLTgwMywxMSArODAwLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW9tRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icAppbmRleCA2YjBlMzYzLi4wYmUxYmVkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApAQCAtMSw5ICsxLDE5IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCiAgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAotICAgXSwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2NmaS1kZWZhdWx0cyIsCisgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAogCkBAIC0yMCw3ICszMCw4IEBACiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCi0gICBdLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfY2ZpLWRlZmF1bHRzIiwKKyAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKaW5kZXggM2FmZDY3MC4uZTgyODdmOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQzJTb2Z0QXZjRGVjLmgiCi0jaW5jbHVkZSAiaWgyNjRkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzkxLDEyICszOTAsMTQgQEAKICAgICB9CiAKICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWgyNjRkX3ZpZGVvX2RlY29kZV9pcF90IHNfaDI2NGRfZGVjb2RlX2lwID0ge307CisgICAgICAgIGloMjY0ZF92aWRlb19kZWNvZGVfb3BfdCBzX2gyNjRkX2RlY29kZV9vcCA9IHt9OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCA9ICZzX2gyNjRkX2RlY29kZV9pcC5zX2l2ZF92aWRlb19kZWNvZGVfaXBfdDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AgPSAmc19oMjY0ZF9kZWNvZGVfb3Auc19pdmRfdmlkZW9fZGVjb2RlX29wX3Q7CiAKLSAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7Ci0gICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICBzZXREZWNvZGVBcmdzKHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19oMjY0ZF9kZWNvZGVfaXAsICZzX2gyNjRkX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpIHsKICAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDExLDggKzQxMiw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKLSAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7Ci0gICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcCA9IHt9OworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcCA9IHt9OwogCiAgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOwogICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CkBAIC00MzgsOCArNDM5LDggQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXROdW1Db3JlcygpIHsKLSAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcCA9IHt9OworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcCA9IHt9OwogCiAgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOwogICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNDU4LDIyICs0NTksMjYgQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKLSAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOwotICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisgICAgaWgyNjRkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19oMjY0ZF9zZXRfZHluX3BhcmFtc19pcCA9IHt9OworICAgIGloMjY0ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfaDI2NGRfc2V0X2R5bl9wYXJhbXNfb3AgPSB7fTsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCAqcHNfc2V0X2R5bl9wYXJhbXNfaXAgPQorICAgICAgICAmc19oMjY0ZF9zZXRfZHluX3BhcmFtc19pcC5zX2l2ZF9jdGxfc2V0X2NvbmZpZ19pcF90OworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90ICpwc19zZXRfZHluX3BhcmFtc19vcCA9CisgICAgICAgICZzX2gyNjRkX3NldF9keW5fcGFyYW1zX29wLnNfaXZkX2N0bF9zZXRfY29uZmlnX29wX3Q7CiAKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKLSAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT51NF9zaXplID0gc2l6ZW9mKGloMjY0ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+ZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+ZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+ZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfb3AtPnU0X3NpemUgPSBzaXplb2YoaWgyNjRkX2N0bF9zZXRfY29uZmlnX29wX3QpOwogICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19oMjY0ZF9zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfaDI2NGRfc2V0X2R5bl9wYXJhbXNfb3ApOwogICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHBzX3NldF9keW5fcGFyYW1zX29wLT51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCkBAIC00ODEsOCArNDg2LDggQEAKIH0KIAogdm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7Ci0gICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOwotICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXAgPSB7fTsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3AgPSB7fTsKICAgICBVV09SRDggYXUxX2J1Zls1MTJdOwogCiAgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOwpAQCAtNTM4LDcgKzU0Myw3IEBACiAgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaWgyNjRkX3ZpZGVvX2RlY29kZV9pcF90KTsKICAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CiAgICAgaWYgKGluQnVmZmVyKSB7CiAgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKQEAgLTU2NywxNCArNTcyLDE0IEBACiAgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOwogICAgIH0KICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7Ci0gICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGloMjY0ZF92aWRlb19kZWNvZGVfb3BfdCk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDMlNvZnRBdmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKLSAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKLSAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcCA9IHt9OworICAgIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCBzX2dldF92dWlfcGFyYW1zX29wID0ge307CiAKICAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKICAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CkBAIC02MjIsOCArNjI3LDggQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7Ci0gICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOwotICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXAgPSB7fTsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3AgPSB7fTsKIAogICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKICAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNjQxLDggKzY0Niw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEF2Y0RlYzo6cmVzZXREZWNvZGVyKCkgewotICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOwotICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwID0ge307CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3AgPSB7fTsKIAogICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOwogICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKQEAgLTY3MSw4ICs2NzYsOCBAQAogCiBzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRlbGV0ZURlY29kZXIoKSB7CiAgICAgaWYgKG1EZWNIYW5kbGUpIHsKLSAgICAgICAgaXZkZXh0X2RlbGV0ZV9pcF90IHNfZGVsZXRlX2lwOwotICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3A7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcCA9IHt9OworICAgICAgICBpdmRleHRfZGVsZXRlX29wX3Qgc19kZWxldGVfb3AgPSB7fTsKIAogICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CiAgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CkBAIC04MzcsOCArODQyLDEwIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWgyNjRkX3ZpZGVvX2RlY29kZV9pcF90IHNfaDI2NGRfZGVjb2RlX2lwID0ge307CisgICAgICAgIGloMjY0ZF92aWRlb19kZWNvZGVfb3BfdCBzX2gyNjRkX2RlY29kZV9vcCA9IHt9OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCA9ICZzX2gyNjRkX2RlY29kZV9pcC5zX2l2ZF92aWRlb19kZWNvZGVfaXBfdDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AgPSAmc19oMjY0ZF9kZWNvZGVfb3Auc19pdmRfdmlkZW9fZGVjb2RlX29wX3Q7CiAgICAgICAgIHsKICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOwogICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKQEAgLTg0Niw3ICs4NTMsNyBAQAogICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CkBAIC04NjIsMjYgKzg2OSwyNyBAQAogICAgICAgICAgICAgV09SRDMyIGRlbGF5OwogICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CiAgICAgICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKLSAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19oMjY0ZF9kZWNvZGVfaXAsICZzX2gyNjRkX2RlY29kZV9vcCk7CiAgICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKICAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKICAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CiAgICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAotICAgICAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgICAgICAgICAgIHBzX2RlY29kZV9vcC0+dTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKICAgICAgICAgfQotICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgaWYgKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0KKyAgICAgICAgICAgICAgICAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CiAgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOwogICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CkBAIC04OTAsMTYgKzg5OCwxNiBAQAogCiAgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7Ci0gICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKLSAgICAgICAgfSBlbHNlIGlmIChJU19JVkRfRkFUQUxfRVJST1Ioc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgcHNfZGVjb2RlX2lwLCBwc19kZWNvZGVfb3ApOworICAgICAgICB9IGVsc2UgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmF0YWwgZXJyb3IgaW4gZGVjb2RlciAweCV4IiwgcHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoID49IDAgJiYgbU91dHB1dERlbGF5ICE9IHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGgpIHsKLSAgICAgICAgICAgIG1PdXRwdXREZWxheSA9IHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGg7CisgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPmk0X3Jlb3JkZXJfZGVwdGggPj0gMCAmJiBtT3V0cHV0RGVsYXkgIT0gcHNfZGVjb2RlX29wLT5pNF9yZW9yZGVyX2RlcHRoKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXkgPSBwc19kZWNvZGVfb3AtPmk0X3Jlb3JkZXJfZGVwdGg7CiAgICAgICAgICAgICBBTE9HVigiTmV3IE91dHB1dCBkZWxheSAlZCAiLCBtT3V0cHV0RGVsYXkpOwogCiAgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KG1PdXRwdXREZWxheSk7CkBAIC05MTcsMTYgKzkyNSwxNiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgIGlmICgwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfd2QgJiYgMCA8IHBzX2RlY29kZV9vcC0+dTRfcGljX2h0KSB7CiAgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVN0cmlkZSA9IEFMSUdOMzIoc19kZWNvZGVfb3AudTRfcGljX3dkKTsKKyAgICAgICAgICAgICAgICBtU3RyaWRlID0gQUxJR04zMihwc19kZWNvZGVfb3AtPnU0X3BpY193ZCk7CiAgICAgICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7Ci0gICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKLSAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworICAgICAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfcGljX3dkICE9IG1XaWR0aCB8fCBwc19kZWNvZGVfb3AtPnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gcHNfZGVjb2RlX29wLT51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHBzX2RlY29kZV9vcC0+dTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50KTsKIAogICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CkBAIC05NDUsMTEgKzk1MywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICh2b2lkKWdldFZ1aVBhcmFtcygpOwotICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7Ci0gICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gcHNfZGVjb2RlX29wLT51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAocHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhwc19kZWNvZGVfb3AtPnU0X3RzLCB3b3JrKTsKICAgICAgICAgfQotICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGluUG9zICs9IHBzX2RlY29kZV9vcC0+dTRfbnVtX2J5dGVzX2NvbnN1bWVkOwogICAgIH0KICAgICBpZiAoZW9zKSB7CiAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKQEAgLTk4NywxNiArOTk1LDE4IEBACiAgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiAgICAgICAgIH0KLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOwotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7Ci0gICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICBpaDI2NGRfdmlkZW9fZGVjb2RlX2lwX3Qgc19oMjY0ZF9kZWNvZGVfaXAgPSB7fTsKKyAgICAgICAgaWgyNjRkX3ZpZGVvX2RlY29kZV9vcF90IHNfaDI2NGRfZGVjb2RlX29wID0ge307CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwID0gJnNfaDI2NGRfZGVjb2RlX2lwLnNfaXZkX3ZpZGVvX2RlY29kZV9pcF90OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCA9ICZzX2gyNjRkX2RlY29kZV9vcC5zX2l2ZF92aWRlb19kZWNvZGVfb3BfdDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiAgICAgICAgIH0KLSAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7Ci0gICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfaDI2NGRfZGVjb2RlX2lwLCAmc19oMjY0ZF9kZWNvZGVfb3ApOworICAgICAgICBpZiAocHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhwc19kZWNvZGVfb3AtPnU0X3RzLCB3b3JrKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwNDksMTEgKzEwNTksMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKaW5kZXggYmQ4NGRlMC4uNWMwN2QyOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApAQCAtMjUsOCArMjUsNyBAQAogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgotI2luY2x1ZGUgIml2LmgiCi0jaW5jbHVkZSAiaXZkLmgiCisjaW5jbHVkZSAiaWgyNjRkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAppbmRleCA1NjY4OTVmLi5kNjVmZmE1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CkBAIC0yNiw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KIAogI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KICNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgogI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CiAjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KQEAgLTEyMSw2ICsxMjQsMTkgQEAKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAKICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1FVQU5USVpBVElPTikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGV4Q291bnQgKi8sIDB1IC8qIHN0cmVhbSAqLykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGljdHVyZVF1YW50aXphdGlvbiwgbS52YWx1ZXNbMF0udHlwZV8pLm9uZU9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QzJDb25maWc6OnBpY3R1cmVfdHlwZV90KElfRlJBTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1QaWN0dXJlUXVhbnRpemF0aW9uLCBtLnZhbHVlc1swXS5taW4pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVBpY3R1cmVRdWFudGl6YXRpb24sIG0udmFsdWVzWzBdLm1heCkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCiAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoREVGQVVMVF9CX0ZSQU1FUykpCiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWN0dWFsSW5wdXREZWxheSwgdmFsdWUpLmluUmFuZ2UoMCwgTUFYX0JfRlJBTUVTKX0pCkBAIC0xOTgsNiArMjE0LDQyIEBACiAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIsIG1Db2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KIAogICAgIHN0YXRpYyBDMlIgSW5wdXREZWxheVNldHRlcigKQEAgLTIyMCw2ICsyNzIsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorCiAgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CiAgICAgICAgICh2b2lkKW1heUJsb2NrOwpAQCAtMzM2LDYgKzM4OSw5NSBAQAogICAgICAgICByZXR1cm4gQzJSOjpPaygpOwogICAgIH0KIAorICAgIHN0YXRpYyBDMlIgUGljdHVyZVF1YW50aXphdGlvblNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7CisKKyAgICAgICAgLy8gVE9ETzogcmVmYWN0b3Igd2l0aCBzYW1lIGFsZ29yaXRobSBpbiB0aGUgU2V0UXAoKQorICAgICAgICBpbnQzMl90IGlNaW4gPSBERUZBVUxUX0lfUVBfTUlOLCBwTWluID0gREVGQVVMVF9QX1FQX01JTiwgYk1pbiA9IERFRkFVTFRfQl9RUF9NSU47CisgICAgICAgIGludDMyX3QgaU1heCA9IERFRkFVTFRfSV9RUF9NQVgsIHBNYXggPSBERUZBVUxUX1BfUVBfTUFYLCBiTWF4ID0gREVGQVVMVF9CX1FQX01BWDsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lLnYuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0ICZsYXllciA9IG1lLnYubS52YWx1ZXNbaV07CisKKyAgICAgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoSV9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBpTWF4ID0gbGF5ZXIubWF4OworICAgICAgICAgICAgICAgIGlNaW4gPSBsYXllci5taW47CisgICAgICAgICAgICAgICAgQUxPR1YoImlNaW4gJWQgaU1heCAlZCIsIGlNaW4sIGlNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBwTWF4ID0gbGF5ZXIubWF4OworICAgICAgICAgICAgICAgIHBNaW4gPSBsYXllci5taW47CisgICAgICAgICAgICAgICAgQUxPR1YoInBNaW4gJWQgcE1heCAlZCIsIHBNaW4sIHBNYXgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBiTWF4ID0gbGF5ZXIubWF4OworICAgICAgICAgICAgICAgIGJNaW4gPSBsYXllci5taW47CisgICAgICAgICAgICAgICAgQUxPR1YoImJNaW4gJWQgYk1heCAlZCIsIGJNaW4sIGJNYXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIoZW50cnkpOiBpICVkLSVkIHAgJWQtJWQgYiAlZC0lZCIsCisgICAgICAgICAgICAgIGlNaW4sIGlNYXgsIHBNaW4sIHBNYXgsIGJNaW4sIGJNYXgpOworCisgICAgICAgIC8vIGVuc3VyZSB3ZSBoYXZlIGxlZ2FsIHZhbHVlcworICAgICAgICBpTWF4ID0gc3RkOjpjbGFtcChpTWF4LCBDT0RFQ19RUF9NSU4sIENPREVDX1FQX01BWCk7CisgICAgICAgIGlNaW4gPSBzdGQ6OmNsYW1wKGlNaW4sIENPREVDX1FQX01JTiwgQ09ERUNfUVBfTUFYKTsKKyAgICAgICAgcE1heCA9IHN0ZDo6Y2xhbXAocE1heCwgQ09ERUNfUVBfTUlOLCBDT0RFQ19RUF9NQVgpOworICAgICAgICBwTWluID0gc3RkOjpjbGFtcChwTWluLCBDT0RFQ19RUF9NSU4sIENPREVDX1FQX01BWCk7CisgICAgICAgIGJNYXggPSBzdGQ6OmNsYW1wKGJNYXgsIENPREVDX1FQX01JTiwgQ09ERUNfUVBfTUFYKTsKKyAgICAgICAgYk1pbiA9IHN0ZDo6Y2xhbXAoYk1pbiwgQ09ERUNfUVBfTUlOLCBDT0RFQ19RUF9NQVgpOworCisgICAgICAgIC8vIHB1dCB0aGVtIGJhY2sgaW50byB0aGUgc3RydWN0dXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1tpXTsKKworICAgICAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1heCA9IGlNYXg7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0ubWluID0gaU1pbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tLnZhbHVlc1tpXS5tYXggPSBwTWF4OworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLm1pbiA9IHBNaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KEJfRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0ubWF4ID0gYk1heDsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tLnZhbHVlc1tpXS5taW4gPSBiTWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlBpY3R1cmVRdWFudGl6YXRpb25TZXR0ZXIoZXhpdCk6IGkgJWQtJWQgcCAlZC0lZCBiICVkLSVkIiwKKyAgICAgICAgICAgICAgaU1pbiwgaU1heCwgcE1pbiwgcE1heCwgYk1pbiwgYk1heCk7CisKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCiAgICAgSVZfUFJPRklMRV9UIGdldFByb2ZpbGVfbCgpIGNvbnN0IHsKICAgICAgICAgc3dpdGNoIChtUHJvZmlsZUxldmVsLT5wcm9maWxlKSB7CiAgICAgICAgIGNhc2UgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkU6ICBbW2ZhbGx0aHJvdWdoXV07CkBAIC0zOTMsNiArNTM1LDExIEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gZ2V0R29wX2woKSBjb25zdCB7IHJldHVybiBtR29wOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBnZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKSBjb25zdAorICAgIHsgcmV0dXJuIG1QaWN0dXJlUXVhbnRpemF0aW9uOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2RlZENvbG9yQXNwZWN0c19sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIH0KIAogcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKQEAgLTQwNCw2ICs1NTEsOSBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBtR29wOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc6Om91dHB1dD4gbVBpY3R1cmVRdWFudGl6YXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CiB9OwogCiAjZGVmaW5lIGl2ZV9hcGlfZnVuY3Rpb24gIGloMjY0ZV9hcGlfZnVuY3Rpb24KQEAgLTY2NCwyMCArODE0LDUyIEBACiAgICAgaXZlX2N0bF9zZXRfcXBfb3BfdCBzX3FwX29wOwogICAgIElWX1NUQVRVU19UIHN0YXR1czsKIAorICAgIEFMT0dWKCJpbiBzZXRRcCgpIik7CisKKyAgICAvLyBzZXQgdGhlIGRlZmF1bHRzCiAgICAgc19xcF9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOwogICAgIHNfcXBfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1FQOwogCi0gICAgc19xcF9pcC51NF9pX3FwID0gREVGQVVMVF9JX1FQOwotICAgIHNfcXBfaXAudTRfaV9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKLSAgICBzX3FwX2lwLnU0X2lfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisgICAgLy8gVE9ETzogcmVmYWN0b3Igd2l0aCBzYW1lIGFsZ29yaXRobSBpbiB0aGUgUGljdHVyZVF1YW50aXphdGlvblNldHRlcigpCisgICAgaW50MzJfdCBpTWluID0gREVGQVVMVF9JX1FQX01JTiwgcE1pbiA9IERFRkFVTFRfUF9RUF9NSU4sIGJNaW4gPSBERUZBVUxUX0JfUVBfTUlOOworICAgIGludDMyX3QgaU1heCA9IERFRkFVTFRfSV9RUF9NQVgsIHBNYXggPSBERUZBVUxUX1BfUVBfTUFYLCBiTWF4ID0gREVGQVVMVF9CX1FQX01BWDsKIAotICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKLSAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7Ci0gICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOwogCi0gICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOwotICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKLSAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBxcCA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRQaWN0dXJlUXVhbnRpemF0aW9uX2woKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHFwLT5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEMyUGljdHVyZVF1YW50aXphdGlvblN0cnVjdCAmbGF5ZXIgPSBxcC0+bS52YWx1ZXNbaV07CisKKyAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChJX0ZSQU1FKSkgeworICAgICAgICAgICAgaU1heCA9IGxheWVyLm1heDsKKyAgICAgICAgICAgIGlNaW4gPSBsYXllci5taW47CisgICAgICAgICAgICBBTE9HVigiaU1pbiAlZCBpTWF4ICVkIiwgaU1pbiwgaU1heCk7CisgICAgICAgIH0gZWxzZSBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUpKSB7CisgICAgICAgICAgICBwTWF4ID0gbGF5ZXIubWF4OworICAgICAgICAgICAgcE1pbiA9IGxheWVyLm1pbjsKKyAgICAgICAgICAgIEFMT0dWKCJwTWluICVkIHBNYXggJWQiLCBwTWluLCBwTWF4KTsKKyAgICAgICAgfSBlbHNlIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoQl9GUkFNRSkpIHsKKyAgICAgICAgICAgIGJNYXggPSBsYXllci5tYXg7CisgICAgICAgICAgICBiTWluID0gbGF5ZXIubWluOworICAgICAgICAgICAgQUxPR1YoImJNaW4gJWQgYk1heCAlZCIsIGJNaW4sIGJNYXgpOworICAgICAgICB9CisgICAgfQorCisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IGlNYXg7CisgICAgc19xcF9pcC51NF9pX3FwX21pbiA9IGlNaW47CisgICAgc19xcF9pcC51NF9wX3FwX21heCA9IHBNYXg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IHBNaW47CisgICAgc19xcF9pcC51NF9iX3FwX21heCA9IGJNYXg7CisgICAgc19xcF9pcC51NF9iX3FwX21pbiA9IGJNaW47CisKKyAgICAvLyBlbnN1cmUgaW5pdGlhbCBxcCB2YWx1ZXMgYXJlIHdpdGhpbiBvdXIgbmV3bHkgY29uZmlndXJlZCBib3VuZHMuLi4KKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBzdGQ6OmNsYW1wKERFRkFVTFRfSV9RUCwgaU1pbiwgaU1heCk7CisgICAgc19xcF9pcC51NF9wX3FwID0gc3RkOjpjbGFtcChERUZBVUxUX1BfUVAsIHBNaW4sIHBNYXgpOworICAgIHNfcXBfaXAudTRfYl9xcCA9IHN0ZDo6Y2xhbXAoREVGQVVMVF9CX1FQLCBiTWluLCBiTWF4KTsKKworICAgIEFMT0dWKCJzZXRRcCgpOiBpICVkLSVkIHAgJWQtJWQgYiAlZC0lZCIsIGlNaW4sIGlNYXgsIHBNaW4sIHBNYXgsIGJNaW4sIGJNYXgpOworCiAKICAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CiAgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CkBAIC05MDcsNiArMTA4OSw1NSBAQAogICAgIHJldHVybjsKIH0KIAorYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRWdWlQYXJhbXMoKQoreworICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPnByaW1hcmllcywgJnNmQXNwZWN0cy5tUHJpbWFyaWVzKSkgeworICAgICAgICBzZkFzcGVjdHMubVByaW1hcmllcyA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghQzJNYXBwZXI6Om1hcChtQ29sb3JBc3BlY3RzLT5yYW5nZSwgJnNmQXNwZWN0cy5tUmFuZ2UpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tUmFuZ2UgPSBhbmRyb2lkOjpDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghQzJNYXBwZXI6Om1hcChtQ29sb3JBc3BlY3RzLT5tYXRyaXgsICZzZkFzcGVjdHMubU1hdHJpeENvZWZmcykpIHsKKyAgICAgICAgc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBhbmRyb2lkOjpDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIH0KKyAgICBpZiAoIUMyTWFwcGVyOjptYXAobUNvbG9yQXNwZWN0cy0+dHJhbnNmZXIsICZzZkFzcGVjdHMubVRyYW5zZmVyKSkgeworICAgICAgICBzZkFzcGVjdHMubVRyYW5zZmVyID0gYW5kcm9pZDo6Q29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIH0KKyAgICBpbnQzMl90IHByaW1hcmllcywgdHJhbnNmZXIsIG1hdHJpeENvZWZmczsKKyAgICBib29sIHJhbmdlOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhzZkFzcGVjdHMsCisgICAgICAgICAgICAmcHJpbWFyaWVzLAorICAgICAgICAgICAgJnRyYW5zZmVyLAorICAgICAgICAgICAgJm1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICZyYW5nZSk7CisgICAgaWgyNjRlX3Z1aV9pcF90IHNfdnVpX3BhcmFtc19pcCB7fTsKKyAgICBpaDI2NGVfdnVpX29wX3Qgc192dWlfcGFyYW1zX29wIHt9OworCisgICAgc192dWlfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc192dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9WVUlfUEFSQU1TOworCisgICAgc192dWlfcGFyYW1zX2lwLnUxX3ZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgc192dWlfcGFyYW1zX2lwLnUxX2NvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSAxOworICAgIHNfdnVpX3BhcmFtc19pcC51MV9jb2xvdXJfcHJpbWFyaWVzID0gcHJpbWFyaWVzOworICAgIHNfdnVpX3BhcmFtc19pcC51MV90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSB0cmFuc2ZlcjsKKyAgICBzX3Z1aV9wYXJhbXNfaXAudTFfbWF0cml4X2NvZWZmaWNpZW50cyA9IG1hdHJpeENvZWZmczsKKyAgICBzX3Z1aV9wYXJhbXNfaXAudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnID0gcmFuZ2U7CisKKyAgICBzX3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpaDI2NGVfdnVpX2lwX3QpOworICAgIHNfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGloMjY0ZV92dWlfb3BfdCk7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXMgPSBpaDI2NGVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Z1aV9wYXJhbXNfb3ApOworICAgIGlmKHN0YXR1cyAhPSBJVl9TVUNDRVNTKQorICAgIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgdnVpIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc192dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKIGMyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6aW5pdEVuY29kZXIoKSB7CiAgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOwogICAgIFdPUkQzMiBsZXZlbDsKQEAgLTkyNiw2ICsxMTU3LDcgQEAKICAgICAgICAgbUlJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOwogICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKICAgICAgICAgZ29wID0gbUludGYtPmdldEdvcF9sKCk7CisgICAgICAgIG1Db2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpOwogICAgIH0KICAgICBpZiAoZ29wICYmIGdvcC0+ZmxleENvdW50KCkgPiAwKSB7CiAgICAgICAgIHVpbnQzMl90IHN5bmNJbnRlcnZhbCA9IDE7CkBAIC0xMDA5LDI5ICsxMjQxLDMxIEBACiAKICAgICAvKiBHZXR0aW5nIE1lbVJlY29yZHMgQXR0cmlidXRlcyAqLwogICAgIHsKLSAgICAgICAgaXZfZmlsbF9tZW1fcmVjX2lwX3Qgc19maWxsX21lbV9yZWNfaXA7Ci0gICAgICAgIGl2X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fcmVjX29wOworICAgICAgICBpaDI2NGVfZmlsbF9tZW1fcmVjX2lwX3Qgc19paDI2NGVfbWVtX3JlY19pcCA9IHt9OworICAgICAgICBpaDI2NGVfZmlsbF9tZW1fcmVjX29wX3Qgc19paDI2NGVfbWVtX3JlY19vcCA9IHt9OworICAgICAgICBpdl9maWxsX21lbV9yZWNfaXBfdCAqcHNfZmlsbF9tZW1fcmVjX2lwID0gJnNfaWgyNjRlX21lbV9yZWNfaXAuc19pdmVfaXA7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19vcF90ICpwc19maWxsX21lbV9yZWNfb3AgPSAmc19paDI2NGVfbWVtX3JlY19vcC5zX2l2ZV9vcDsKIAotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKLSAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpaDI2NGVfZmlsbF9tZW1fcmVjX2lwX3QpOworICAgICAgICBwc19maWxsX21lbV9yZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaWgyNjRlX2ZpbGxfbWVtX3JlY19vcF90KTsKIAotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF93ZCA9IHdpZHRoOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jb2xvcl9mb3JtYXQgPSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQ7Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZWZfY250ID0gREVGQVVMVF9NQVhfUkVGX0ZSTTsKLSAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3Jlb3JkZXJfY250ID0gREVGQVVMVF9NQVhfUkVPUkRFUl9GUk07Ci0gICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOwotICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT5lX2NtZCA9IElWX0NNRF9GSUxMX05VTV9NRU1fUkVDOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF93ZCA9IHdpZHRoOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgcHNfZmlsbF9tZW1fcmVjX2lwLT51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+ZV9jb2xvcl9mb3JtYXQgPSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQ7CisgICAgICAgIHBzX2ZpbGxfbWVtX3JlY19pcC0+dTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBwc19maWxsX21lbV9yZWNfaXAtPnU0X21heF9zcmNoX3JuZ195ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9ZOwogCi0gICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obnVsbHB0ciwgJnNfZmlsbF9tZW1fcmVjX2lwLCAmc19maWxsX21lbV9yZWNfb3ApOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX2loMjY0ZV9tZW1fcmVjX2lwLCAmc19paDI2NGVfbWVtX3JlY19vcCk7CiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAotICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcHNfZmlsbF9tZW1fcmVjX29wLT51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDYwLDQ4ICsxMjk0LDUxIEBACiAKICAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLwogICAgIHsKLSAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7Ci0gICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworICAgICAgICBpaDI2NGVfaW5pdF9pcF90IHNfZW5jX2lwID0ge307CisgICAgICAgIGloMjY0ZV9pbml0X29wX3Qgc19lbmNfb3AgPSB7fTsKKworICAgICAgICBpdmVfaW5pdF9pcF90ICpwc19pbml0X2lwID0gJnNfZW5jX2lwLnNfaXZlX2lwOworICAgICAgICBpdmVfaW5pdF9vcF90ICpwc19pbml0X29wID0gJnNfZW5jX29wLnNfaXZlX29wOwogCiAgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CiAgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CiAgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKIAotICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKLSAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X3NpemUgPSBzaXplb2YoaWgyNjRlX2luaXRfaXBfdCk7CisgICAgICAgIHBzX2luaXRfb3AtPnU0X3NpemUgPSBzaXplb2YoaWgyNjRlX2luaXRfb3BfdCk7CiAKLSAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOwotICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKLSAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgIHBzX2luaXRfaXAtPmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X251bV9tZW1fcmVjID0gbU51bU1lbVJlY29yZHM7CisgICAgICAgIHBzX2luaXRfaXAtPnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9odCA9IGhlaWdodDsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbWF4X3JlZl9jbnQgPSBERUZBVUxUX01BWF9SRUZfRlJNOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfbWF4X2xldmVsID0gbUFWQ0VuY0xldmVsOworICAgICAgICBwc19pbml0X2lwLT5lX2lucF9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OwogCiAgICAgICAgIGlmIChtUmVjb25FbmFibGUgfHwgbVBTTlJFbmFibGUpIHsKLSAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAxOworICAgICAgICAgICAgcHNfaW5pdF9pcC0+dTRfZW5hYmxlX3JlY29uID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNfaW5pdF9pcC51NF9lbmFibGVfcmVjb24gPSAwOworICAgICAgICAgICAgcHNfaW5pdF9pcC0+dTRfZW5hYmxlX3JlY29uID0gMDsKICAgICAgICAgfQotICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKLSAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7Ci0gICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOwotICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOwotICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7Ci0gICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOwotICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKLSAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOwotICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfZnJhbWVyYXRlID0gREVGQVVMVF9NQVhfRlJBTUVSQVRFOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X251bV9iZnJhbWVzID0gbUJmcmFtZXM7CisgICAgICAgIHBzX2luaXRfaXAtPmVfY29udGVudF90eXBlID0gSVZfUFJPR1JFU1NJVkU7CisgICAgICAgIHBzX2luaXRfaXAtPnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBwc19pbml0X2lwLT51NF9tYXhfc3JjaF9ybmdfeSA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWTsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9zbGljZV9tb2RlID0gbVNsaWNlTW9kZTsKKyAgICAgICAgcHNfaW5pdF9pcC0+dTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgcHNfaW5pdF9pcC0+ZV9hcmNoID0gbUFyY2g7CisgICAgICAgIHBzX2luaXRfaXAtPmVfc29jID0gREVGQVVMVF9TT0M7CiAKLSAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2luaXRfaXAsICZzX2luaXRfb3ApOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jX2lwLCAmc19lbmNfb3ApOwogCiAgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgewotICAgICAgICAgICAgQUxPR0UoIkluaXQgZW5jb2RlciBmYWlsZWQgPSAweCV4XG4iLCBzX2luaXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHBzX2luaXRfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQogICAgIH0KQEAgLTExNDUsNiArMTM4Miw5IEBACiAgICAgLyogVmlkZW8gY29udHJvbCBTZXQgUHJvZmlsZSBwYXJhbXMgKi8KICAgICBzZXRQcm9maWxlUGFyYW1zKCk7CiAKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWVUkgcGFyYW1zICovCisgICAgc2V0VnVpUGFyYW1zKCk7CisKICAgICAvKiBWaWRlbyBjb250cm9sIFNldCBpbiBFbmNvZGUgaGVhZGVyIG1vZGUgKi8KICAgICBzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9IRUFERVIpOwogCkBAIC0xNDI5LDE1ICsxNjY5LDE3IEBACiAgICAgfQogICAgIC8vIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewogICAgIGMyX3N0YXR1c190IGVycm9yOwotICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCBzX2VuY29kZV9pcDsKLSAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7Ci0gICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7CisgICAgaWgyNjRlX3ZpZGVvX2VuY29kZV9pcF90IHNfdmlkZW9fZW5jb2RlX2lwID0ge307CisgICAgaWgyNjRlX3ZpZGVvX2VuY29kZV9vcF90IHNfdmlkZW9fZW5jb2RlX29wID0ge307CisgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAgPSAmc192aWRlb19lbmNvZGVfaXAuc19pdmVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AgPSAmc192aWRlb19lbmNvZGVfb3Auc19pdmVfb3A7CisgICAgbWVtc2V0KHBzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKCpwc19lbmNvZGVfb3ApKTsKIAogICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CiAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVhZGVyTGVuZ3RoID0gTUlOX1NUUkVBTV9TSVpFOwogICAgICAgICB1aW50OF90IGhlYWRlcltrSGVhZGVyTGVuZ3RoXTsKICAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAotICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBudWxscHRyLCBoZWFkZXIsIGtIZWFkZXJMZW5ndGgsIHdvcmtJbmRleCk7CisgICAgICAgICAgICAgICAgcHNfZW5jb2RlX2lwLCBwc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgd29ya0luZGV4KTsKICAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTE0NDUsMjIgKzE2ODcsMjIgQEAKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsIHBzX2VuY29kZV9pcCwgcHNfZW5jb2RlX29wKTsKIAogICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKICAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgaGVhZGVyIGZhaWxlZCA9IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOwogCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQotICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzLCAwdSk7CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOwogICAgICAgICBpZiAoIWNzZCkgewogICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTE0NjgsNyArMTcxMCw3IEBACiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGhlYWRlciwgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcyk7CiAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKIAogICAgICAgICBEVU1QX1RPX0ZJTEUoCkBAIC0xNTYyLDcgKzE4MDQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZXJyb3IgPSBzZXRFbmNvZGVBcmdzKAotICAgICAgICAgICAgICAgICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCB2aWV3LmdldCgpLCB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIHdvcmtJbmRleCk7CisgICAgICAgICAgICAgICAgcHNfZW5jb2RlX2lwLCBwc19lbmNvZGVfb3AsIHZpZXcuZ2V0KCksIHdWaWV3LmJhc2UoKSwgd1ZpZXcuY2FwYWNpdHkoKSwgd29ya0luZGV4KTsKICAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgOiAlZCIsIGVycm9yKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CkBAIC0xNTc5LDE3ICsxODIxLDE3IEBACiAgICAgICAgIC8qIENvbXB1dGUgdGltZSBlbGFwc2VkIGJldHdlZW4gZW5kIG9mIHByZXZpb3VzIGRlY29kZSgpCiAgICAgICAgICAqIHRvIHN0YXJ0IG9mIGN1cnJlbnQgZGVjb2RlKCkgKi8KICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOwotICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfdmlkZW9fZW5jb2RlX2lwLCAmc192aWRlb19lbmNvZGVfb3ApOwogCiAgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgewotICAgICAgICAgICAgaWYgKChzX2VuY29kZV9vcC51NF9lcnJvcl9jb2RlICYgMHhGRikgPT0gSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpIHsKKyAgICAgICAgICAgIGlmICgocHNfZW5jb2RlX29wLT51NF9lcnJvcl9jb2RlICYgMHhGRikgPT0gSUgyNjRFX0JJVFNUUkVBTV9CVUZGRVJfT1ZFUkZMT1cpIHsKICAgICAgICAgICAgICAgICAvLyBUT0RPOiB1c2UgSVZFX0NNRF9DVExfR0VUQlVGSU5GTyBmb3IgcHJvcGVyIG1heCBpbnB1dCBzaXplPwogICAgICAgICAgICAgICAgIG1PdXRCdWZmZXJTaXplICo9IDI7CiAgICAgICAgICAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HRSgiRW5jb2RlIEZyYW1lIGZhaWxlZCA9IDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CkBAIC0xNTk5LDcgKzE4NDEsNyBAQAogCiAgICAgLy8gSG9sZCBpbnB1dCBidWZmZXIgcmVmZXJlbmNlCiAgICAgaWYgKGlucHV0QnVmZmVyKSB7Ci0gICAgICAgIG1CdWZmZXJzW3NfZW5jb2RlX2lwLnNfaW5wX2J1Zi5hcHZfYnVmc1swXV0gPSBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlcnNbcHNfZW5jb2RlX2lwLT5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CiAgICAgfQogCiAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOwpAQCAtMTYwNyw5ICsxODQ5LDkgQEAKICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CiAKICAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCi0gICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICAgICAgcHNfZW5jb2RlX29wLT5zX291dF9idWYudTRfYnl0ZXMpOwogCi0gICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgdm9pZCAqZnJlZWQgPSBwc19lbmNvZGVfb3AtPnNfaW5wX2J1Zi5hcHZfYnVmc1swXTsKICAgICAvKiBJZiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCiAgICAgaWYgKGZyZWVkICE9IG51bGxwdHIpIHsKICAgICAgICAgaWYgKG1CdWZmZXJzLmNvdW50KGZyZWVkKSA9PSAwdSkgewpAQCAtMTYyMSwxNyArMTg2MywxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7Ci0gICAgICAgIGlmICghc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKSB7CisgICAgaWYgKHBzX2VuY29kZV9vcC0+b3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgaWYgKCFwc19lbmNvZGVfb3AtPnNfb3V0X2J1Zi51NF9ieXRlcykgewogICAgICAgICAgICAgQUxPR0UoIkVycm9yOiBPdXRwdXQgcHJlc2VudCBidXQgYnl0ZXMgZ2VuZXJhdGVkIGlzIHplcm8iKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHVpbnQ2NF90IHdvcmtJZCA9ICgodWludDY0X3Qpc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwKLSAgICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfbG93OwotICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgdWludDY0X3Qgd29ya0lkID0gKCh1aW50NjRfdClwc19lbmNvZGVfb3AtPnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgcHNfZW5jb2RlX29wLT51NF90aW1lc3RhbXBfbG93OworICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgcHNfZW5jb2RlX29wKTsKICAgICB9CiAgICAgaWYgKG1TYXdJbnB1dEVPUykgewogICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CkBAIC0xNjcxLDkgKzE5MTMsMTEgQEAKICAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOwogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQotICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7Ci0gICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKLSAgICAgICAgaWYgKEMyX09LICE9IHNldEVuY29kZUFyZ3MoJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsCisgICAgICAgIGloMjY0ZV92aWRlb19lbmNvZGVfaXBfdCBzX3ZpZGVvX2VuY29kZV9pcCA9IHt9OworICAgICAgICBpaDI2NGVfdmlkZW9fZW5jb2RlX29wX3Qgc192aWRlb19lbmNvZGVfb3AgPSB7fTsKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90ICpwc19lbmNvZGVfaXAgPSAmc192aWRlb19lbmNvZGVfaXAuc19pdmVfaXA7CisgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wID0gJnNfdmlkZW9fZW5jb2RlX29wLnNfaXZlX29wOworICAgICAgICBpZiAoQzJfT0sgIT0gc2V0RW5jb2RlQXJncyhwc19lbmNvZGVfaXAsIHBzX2VuY29kZV9vcCwgbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCAwKSkgewogICAgICAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIGZvciBkcmFpbkludGVybmFsIik7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTY4MSw5ICsxOTI1LDkgQEAKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgICh2b2lkKWl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisgICAgICAgICh2b2lkKWl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc192aWRlb19lbmNvZGVfaXAsICZzX3ZpZGVvX2VuY29kZV9vcCk7CiAKLSAgICAgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgICAgIHZvaWQgKmZyZWVkID0gcHNfZW5jb2RlX29wLT5zX2lucF9idWYuYXB2X2J1ZnNbMF07CiAgICAgICAgIC8qIElmIGVuY29kZXIgZnJlZXMgdXAgYW4gaW5wdXQgYnVmZmVyLCBtYXJrIGl0IGFzIGZyZWUgKi8KICAgICAgICAgaWYgKGZyZWVkICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKQEAgLTE2OTUsMTAgKzE5MzksMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChzX2VuY29kZV9vcC5vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgdWludDY0X3Qgd29ya0lkID0gKCh1aW50NjRfdClzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfbG93OwotICAgICAgICAgICAgZmluaXNoV29yayh3b3JrSWQsIHdvcmssICZzX2VuY29kZV9vcCk7CisgICAgICAgIGlmIChwc19lbmNvZGVfb3AtPm91dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXBzX2VuY29kZV9vcC0+dTRfdGltZXN0YW1wX2hpZ2ggPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfZW5jb2RlX29wLT51NF90aW1lc3RhbXBfbG93OworICAgICAgICAgICAgZmluaXNoV29yayh3b3JrSWQsIHdvcmssIHBzX2VuY29kZV9vcCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHNQcm9jZXNzZWQgIT0gMXUpIHsKICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKQEAgLTE3NTYsMTEgKzIwMDAsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNFbmNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKaW5kZXggNTU1MDU1Yi4uMWZlY2Q5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CiAKICNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgotI2luY2x1ZGUgIml2Mi5oIgotI2luY2x1ZGUgIml2ZTIuaCIKKyNpbmNsdWRlICJpaDI2NGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMDAsNiArOTksMTMgQEAKICNkZWZpbmUgU1RSTEVOR1RIICAgICAgICAgICAgICAgICAgIDUwMAogI2RlZmluZSBERUZBVUxUX0NPTlNUUkFJTkVEX0lOVFJBICAgMAogCisvKiogbGltaXRzIGFzIHNwZWNpZmllZCBieSBoMjY0CisgKiAgKFFQX01JTj09NCBpcyBhY3R1YWxseSBhIGxpbWl0YXRpb24gb2YgdGhpcyBTVyBjb2RlYywgbm90IHRoZSBILjI2NCBzdGFuZGFyZCkKKyAqKi8KKyNkZWZpbmUgQ09ERUNfUVBfTUlOICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQ09ERUNfUVBfTUFYICAgICAgICAgICAgICAgIDUxCisKKwogI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSk/IChhKSA6IChiKQogI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSk/IChhKSA6IChiKQogI2RlZmluZSBBTElHTjE2KHgpICgoKCh4KSArIDE1KSA+PiA0KSA8PCA0KQpAQCAtMTkyLDYgKzE5OCw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKIAogICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOwogICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKQEAgLTIyNSw2ICsyMzIsNyBAQAogICAgIGMyX3N0YXR1c190IHNldFByb2ZpbGVQYXJhbXMoKTsKICAgICBjMl9zdGF0dXNfdCBzZXREZWJsb2NrUGFyYW1zKCk7CiAgICAgYzJfc3RhdHVzX3Qgc2V0VmJ2UGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0VnVpUGFyYW1zKCk7CiAgICAgdm9pZCBsb2dWZXJzaW9uKCk7CiAgICAgYzJfc3RhdHVzX3Qgc2V0RW5jb2RlQXJncygKICAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfaXBfdCAqcHNfZW5jb2RlX2lwLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCmluZGV4IDM3MTI1NjQuLjE2MGUyNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTEsNSArMSwxNCBAQAogLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCiAvLyB1c2UgbGliY29kZWMyX3NvZnQtZGVmYXVsdHMgaW5zdGVhZAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLApAQCAtMjAsNyArMjksNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCi0gICAgICAgICJsaWJsb2ciLCAgICAvLyBmb3IgQUxPRworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKICAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAogICAgIF0sCkBAIC0zOCw3ICs0Nyw3IEBACiAKIGZpbGVncm91cCB7CiAgICAgbmFtZTogImNvZGVjMl9zb2Z0X2V4cG9ydHMiLAotICAgIHNyY3M6IFsgImV4cG9ydHMubGRzIiBdLAorICAgIHNyY3M6IFsiZXhwb3J0cy5sZHMiXSwKIH0KIAogLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCkBAIC05MSw3ICsxMDAsMTcgQEAKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBjb25maWc6IHsKKyAgICAgICAgICAgIGNmaV9hc3NlbWJseV9zdXBwb3J0OiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTEzMSw0ICsxNTAsMyBAQAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMyQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCmluZGV4IGZiM2ZiZDAuLjZjNGI3ZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0xMTAsMTcgKzExMCwyMCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CiAgICAgICAgICAgICBpbnQzMl90IGVyciA9IHRoaXotPm9uU3RvcCgpOworICAgICAgICAgICAgdGhpei0+bU91dHB1dEJsb2NrUG9vbC5yZXNldCgpOwogICAgICAgICAgICAgUmVwbHkobXNnLCAmZXJyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRSZXNldDogewogICAgICAgICAgICAgdGhpei0+b25SZXNldCgpOworICAgICAgICAgICAgdGhpei0+bU91dHB1dEJsb2NrUG9vbC5yZXNldCgpOwogICAgICAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKICAgICAgICAgICAgIFJlcGx5KG1zZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZTogewogICAgICAgICAgICAgdGhpei0+b25SZWxlYXNlKCk7CisgICAgICAgICAgICB0aGl6LT5tT3V0cHV0QmxvY2tQb29sLnJlc2V0KCk7CiAgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwogICAgICAgICAgICAgUmVwbHkobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTg5LDIxICs1OTIsMTEgQEAKIH0KIAogc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAotICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpKTsKLX0KLQotc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBTaW1wbGVDMkNvbXBvbmVudDo6Y3JlYXRlTGluZWFyQnVmZmVyKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLT5zaGFyZShvZmZzZXQsIHNpemUsIDo6QzJGZW5jZSgpKSk7CiB9CiAKIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSk7Ci19Ci0KLXN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUdyYXBoaWNCdWZmZXIoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLCBjb25zdCBDMlJlY3QgJmNyb3ApIHsKICAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKGNyb3AsIDo6QzJGZW5jZSgpKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCmluZGV4IDIyZDU3MTQuLmU1ZTE2ZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0xNDAsMTUgKzE0MCw5IEBACiAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlTGluZWFyQnVmZmVyKAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKTsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAogICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZjcm9wKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCmluZGV4IGEwODFlMjguLmQ2ZmZkMTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJjb2RlYzJwbGF5IiwKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCmluZGV4IGQ2MDI1ZGUuLmExN2IwNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiBTaW1wbGVQbGF5ZXI6OlNpbXBsZVBsYXllcigpCiAgICAgOiBtTGlzdGVuZXIobmV3IExpc3RlbmVyKHRoaXMpKSwKLSAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBEdW1teVByb2R1Y2VyTGlzdGVuZXIpLAorICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFN0dWJQcm9kdWNlckxpc3RlbmVyKSwKICAgICAgIG1MaW5lYXJQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKICAgICAgIG1Db21wb3NlckNsaWVudChuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KSB7CiAgICAgQ0hFQ0tfRVEobUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQW5kcm9pZC5icAppbmRleCAzNTI5ZmVjLi4zOGRmY2U0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19mbGFjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2ZsYWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmNwcAppbmRleCA0MDM5YjliLi40OTg5MmE0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAKQEAgLTIyMSw2ICsyMjEsMTEgQEAKIAogICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKICAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgaWYgKG1IYXNTdHJlYW1JbmZvKSB7CisgICAgICAgICAgICBBTE9HVigiSWdub3JlIENvZGVjIENvbmZpZyIpOworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5wYXJzZU1ldGFkYXRhKGlucHV0LCBpblNpemUpOwogICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSyAmJiBkZWNvZGVyRXJyICE9IFdPVUxEX0JMT0NLKSB7CiAgICAgICAgICAgICBBTE9HRSgicHJvY2VzczogRkxBQ0RlY29kZXIgcGFyc2VNZXRhRGF0YSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CkBAIC0zNjcsMTEgKzM3MiwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcAppbmRleCA0MDhkYjdlLi42ZmVhZDNhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5jcHAKQEAgLTI2Miw5ICsyNjIsMTAgQEAKICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKLSAgICBpZiAod1ZpZXcuZXJyb3IoKSkgewotICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisKKyAgICBlcnIgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpLmVycm9yKCk7CisgICAgaWYgKGVycikgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgZXJyKTsKICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDgxLDExICs0ODIsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRGbGFjRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCmluZGV4IDIyZGQ1ZWQuLjQ1ZTg1YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX2c3MTFfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfZzcxMV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMiLAogICAgIGRlZmF1bHRzOiBbCkBAIC03LDYgKzI2LDggQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKIAorICAgIHN0YXRpY19saWJzOiBbImNvZGVjc19nNzExZGVjIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EQUxBVyIsCiAgICAgXSwKQEAgLTIwLDQgKzQxLDYgQEAKICAgICBdLAogCiAgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsiY29kZWNzX2c3MTFkZWMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCmluZGV4IDRmZjA3OTMuLmY5NTJmMjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgotCisjaW5jbHVkZSA8ZzcxMURlYy5oPgogI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTk5LDcgKzE5OSw3IEBACiAKICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOwotICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBvdXRTaXplKSk7CiAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOwogCiAgICAgaWYgKGVvcykgewpAQCAtMjI0LDUzICsyMjQsNiBAQAogICAgIHJldHVybiBDMl9PSzsKIH0KIAotI2lmZGVmIEFMQVcKLXZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlQUxhdygKLSAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgewotICAgIHdoaWxlIChpblNpemUgPiAwKSB7Ci0gICAgICAgIGluU2l6ZS0tOwotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7Ci0gICAgICAgIGl4ICY9IDB4N2Y7Ci0KLSAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKLSAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOwotCi0gICAgICAgIGlmIChpZXhwID4gMCkgewotICAgICAgICAgICAgbWFudCArPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7Ci0KLSAgICAgICAgaWYgKGlleHAgPiAxKSB7Ci0gICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OwotICAgIH0KLX0KLSNlbHNlCi12b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZU1MYXcoCi0gICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKLSAgICB3aGlsZSAoaW5TaXplID4gMCkgewotICAgICAgICBpblNpemUtLTsKLSAgICAgICAgaW50MzJfdCB4ID0gKmluKys7Ci0KLSAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OwotICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKLSAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOwotICAgICAgICBtYW50aXNzYSAmPSAweDBmOwotCi0gICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKLQotICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKLQotICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKLSAgICB9Ci19Ci0jZW5kaWYKLQogY2xhc3MgQzJTb2Z0RzcxMURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKIHB1YmxpYzoKICAgICBDMlNvZnRHNzExRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KApAQCAtMzA2LDExICsyNTksMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHNzExRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaAppbmRleCAyM2U4ZmZjLi5mOTM4NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtNDUsMTIgKzQ1LDYgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOwogICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKIAotI2lmZGVmIEFMQVcKLSAgICB2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7Ci0jZWxzZQotICAgIHZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKLSNlbmRpZgotCiAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RzcxMURlYyk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKaW5kZXggMzJhYTk4ZC4uNzY5MmQzNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdjFkZWNfZ2F2MSIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCmluZGV4IDEyMGJhN2EuLmY4NTdlODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcApAQCAtMjYsNiArMjYsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgeworCitjb25zdGV4cHIgdWludDhfdCBORVVUUkFMX1VWX1ZBTFVFID0gMTI4OworCit9ICAvLyBuYW1lc3BhY2UKIAogLy8gY29kZWNuYW1lIHNldCBhbmQgcGFzc2VkIGluIGFzIGEgY29tcGlsZSBmbGFnIGZyb20gQW5kcm9pZC5icAogY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9IENPREVDTkFNRTsKQEAgLTUxLDggKzU2LDggQEAKICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQogICAgICAgICAgICAgLndpdGhGaWVsZHMoewotICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCi0gICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQogICAgICAgICAgICAgLmJ1aWxkKCkpOwpAQCAtNjUsMTIgKzcwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVYxXzF9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbmVPZih7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzMsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV80LCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfNSwgQzJDb25maWc6OkxFVkVMX0FWMV81XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfSkKICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCiAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CkBAIC00NTgsMzIgKzQ2NSw0MCBAQAogICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gIHVpbnQ4X3QgKmNvbnN0IGRzdFN0YXJ0ID0gZHN0Oworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ub2Nocm9tZSkgewogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICBzcmNZICs9IHNyY1lTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICBpZiAoaXNNb25vY2hyb21lKSB7CisgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgbWVtc2V0KGRzdFYsIE5FVVRSQUxfVVZfVkFMVUUsIHdpZHRoIC8gMik7CisgICAgICBtZW1zZXQoZHN0VSwgTkVVVFJBTF9VVl9WQUxVRSwgd2lkdGggLyAyKTsKKyAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICB9CiAKLSAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgIG1lbWNweShkc3RVLCBzcmNVLCB3aWR0aCAvIDIpOwogICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKICAgfQogfQogCkBAIC01NTUsMTUgKzU3MCwxMSBAQAogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKLSAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwKLSAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAotICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAotICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7Ci0gIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBib29sIGlzTW9ub2Nocm9tZSkgewogCiAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTU3NCw2ICs1ODUsMTcgQEAKICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgIH0KIAorICBpZiAoaXNNb25vY2hyb21lKSB7CisgICAgLy8gRmlsbCB3aXRoIG5ldXRyYWwgVS9WIHZhbHVlcy4KKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgeworICAgICAgbWVtc2V0KGRzdFYsIE5FVVRSQUxfVVZfVkFMVUUsICh3aWR0aCArIDEpIC8gMik7CisgICAgICBtZW1zZXQoZHN0VSwgTkVVVFJBTF9VVl9WQUxVRSwgKHdpZHRoICsgMSkgLyAyKTsKKyAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKwogICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChoZWlnaHQgKyAxKSAvIDI7ICsreSkgewogICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKQEAgLTYyOSw4ICs2NTEsMTYgQEAKICAgICB9CiAgIH0KIAotICAvLyBUT0RPKHZpZ25lc2h2KTogQWRkIHN1cHBvcnQgZm9yIG1vbm9jaHJvbWUgdmlkZW9zIHNpbmNlIEFWMSBzdXBwb3J0cyBpdC4KLSAgQ0hFQ0soYnVmZmVyLT5pbWFnZV9mb3JtYXQgPT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwKTsKKyAgaWYgKCEoYnVmZmVyLT5pbWFnZV9mb3JtYXQgPT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwIHx8CisgICAgICAgIGJ1ZmZlci0+aW1hZ2VfZm9ybWF0ID09IGxpYmdhdjE6OmtJbWFnZUZvcm1hdE1vbm9jaHJvbWU0MDApKSB7CisgICAgQUxPR0UoImltYWdlX2Zvcm1hdCAlZCBub3Qgc3VwcG9ydGVkIiwgYnVmZmVyLT5pbWFnZV9mb3JtYXQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IGJvb2wgaXNNb25vY2hyb21lID0KKyAgICAgIGJ1ZmZlci0+aW1hZ2VfZm9ybWF0ID09IGxpYmdhdjE6OmtJbWFnZUZvcm1hdE1vbm9jaHJvbWU0MDA7CiAKICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwpAQCAtNjQyLDYgKzY3MiwxMyBAQAogICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgogICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT5tYXRyaXggPT0gQzJDb2xvcjo6TUFUUklYX0JUMjAyMCAmJgogICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgIGlmIChidWZmZXItPmltYWdlX2Zvcm1hdCAhPSBsaWJnYXYxOjprSW1hZ2VGb3JtYXRZdXY0MjApIHsKKyAgICAgICAgQUxPR0UoIk9ubHkgWVVWNDIwIG91dHB1dCBpcyBzdXBwb3J0ZWQgd2hlbiB0YXJnZXRpbmcgUkdCQV8xMDEwMTAyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09NSVRURUQ7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOwogICAgIH0KICAgfQpAQCAtNjY3LDEwICs3MDQsMTMgQEAKICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLCBibG9jay0+d2lkdGgoKSwKICAgICAgICAgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsIChpbnQpYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSk7CiAKLSAgdWludDhfdCAqZHN0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICB1aW50OF90ICpkc3RZID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICB1aW50OF90ICpkc3RVID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICB1aW50OF90ICpkc3RWID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOwogICBzaXplX3Qgc3JjWVN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzBdOwogICBzaXplX3Qgc3JjVVN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzFdOwogICBzaXplX3Qgc3JjVlN0cmlkZSA9IGJ1ZmZlci0+c3RyaWRlWzJdOworCiAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOwogICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOwpAQCAtNjgyLDIwICs3MjIsMjEgQEAKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKLSAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKKyAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCiAgICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUgLyBzaXplb2YodWludDMyX3QpLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsCisgICAgICAgICAgc3JjVlN0cmlkZSAvIDIsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLCBtV2lkdGgsIG1IZWlnaHQsCisgICAgICAgICAgaXNNb25vY2hyb21lKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVswXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzFdOwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMl07Ci0gICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKAorICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAorICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0LCBpc01vbm9jaHJvbWUpOwogICB9CiAgIGZpbmlzaFdvcmsoYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CiAgIGJsb2NrID0gbnVsbHB0cjsKQEAgLTc3MSwxMSArODEyLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5ICpDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHYXYxRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5ICpmYWN0b3J5KSB7CiAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCmluZGV4IDdmNTRhZjguLjJkMDk3NmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19nc21fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfZ3NtX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCmluZGV4IDI4N2NmYzYuLjk3NzY3N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCkBAIC0yOTQsMTEgKzI5NCwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaAppbmRleCAyYjIwOWZlLi5lZGQyNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0xOSwxMCArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAotCi1leHRlcm4gIkMiIHsKLSAgICAjaW5jbHVkZSAiZ3NtLmgiCi19CisjaW5jbHVkZSAiZ3NtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCmluZGV4IDI4NTgyMTIuLmQxMzg4YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwxOCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEhldmNEZWMuY3BwIl0sCkBAIC0xNiw2ICsyNiw3IEBACiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9jZmktZGVmYXVsdHMiLAogICAgIF0sCiAKICAgICBzcmNzOiBbIkMyU29mdEhldmNFbmMuY3BwIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcAppbmRleCAxNzY2ODQzLi42YmNmM2EyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgogCiAjaW5jbHVkZSAiQzJTb2Z0SGV2Y0RlYy5oIgotI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zODAsMTIgKzM3OSwxNCBAQAogICAgIH0KIAogICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKLSAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpaGV2Y2RfY3hhX3ZpZGVvX2RlY29kZV9pcF90IHNfaGV2Y2RfZGVjb2RlX2lwID0ge307CisgICAgICAgIGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX29wX3Qgc19oZXZjZF9kZWNvZGVfb3AgPSB7fTsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAgPSAmc19oZXZjZF9kZWNvZGVfaXAuc19pdmRfdmlkZW9fZGVjb2RlX2lwX3Q7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wID0gJnNfaGV2Y2RfZGVjb2RlX29wLnNfaXZkX3ZpZGVvX2RlY29kZV9vcF90OwogCi0gICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOwotICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKLSAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgcHNfZGVjb2RlX2lwLCBwc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50KSB7CiAgICAgICAgICAgICByZXNldFBsdWdpbigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQwMCw4ICs0MDEsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpjcmVhdGVEZWNvZGVyKCkgewotICAgIGl2ZGV4dF9jcmVhdGVfaXBfdCBzX2NyZWF0ZV9pcDsKLSAgICBpdmRleHRfY3JlYXRlX29wX3Qgc19jcmVhdGVfb3A7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwID0ge307CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wID0ge307CiAKICAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jcmVhdGVfaXBfdCk7CiAgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0NSRUFURTsKQEAgLTQyNyw4ICs0MjgsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKLSAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcCA9IHt9OworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcCA9IHt9OwogCiAgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOwogICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNDQ3LDIyICs0NDgsMjYgQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7Ci0gICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKLSAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworICAgIGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfaXBfdCBzX2hldmNkX3NldF9keW5fcGFyYW1zX2lwID0ge307CisgICAgaWhldmNkX2N4YV9jdGxfc2V0X2NvbmZpZ19vcF90IHNfaGV2Y2Rfc2V0X2R5bl9wYXJhbXNfb3AgPSB7fTsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCAqcHNfc2V0X2R5bl9wYXJhbXNfaXAgPQorICAgICAgICAmc19oZXZjZF9zZXRfZHluX3BhcmFtc19pcC5zX2l2ZF9jdGxfc2V0X2NvbmZpZ19pcF90OworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90ICpwc19zZXRfZHluX3BhcmFtc19vcCA9CisgICAgICAgICZzX2hldmNkX3NldF9keW5fcGFyYW1zX29wLnNfaXZkX2N0bF9zZXRfY29uZmlnX29wX3Q7CiAKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKLSAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOwotICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKLSAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBwc19zZXRfZHluX3BhcmFtc19pcC0+dTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgcHNfc2V0X2R5bl9wYXJhbXNfaXAtPmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLT5lX3ZpZF9kZWNfbW9kZSA9IGRlY19tb2RlOworICAgIHBzX3NldF9keW5fcGFyYW1zX29wLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfY3RsX3NldF9jb25maWdfb3BfdCk7CiAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX2lwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX3NldF9keW5fcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19zZXRfZHluX3BhcmFtc19vcCk7CiAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9keW5fcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgcHNfc2V0X2R5bl9wYXJhbXNfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKQEAgLTQ3MCw4ICs0NzUsOCBAQAogfQogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgewotICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKLSAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwID0ge307CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wID0ge307CiAgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKIAogICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKQEAgLTUyOSw3ICs1MzQsNyBAQAogICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX2lwX3QpOwogICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKICAgICBpZiAoaW5CdWZmZXIpIHsKICAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOwpAQCAtNTU4LDE1ICs1NjMsMTUgQEAKICAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CiAgICAgfQogICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaWhldmNkX2N4YV92aWRlb19kZWNvZGVfb3BfdCk7CiAgICAgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCA9IDA7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDMlNvZnRIZXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7Ci0gICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXAgPSB7fTsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcCA9IHt9OwogCiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCk7CiAgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOwpAQCAtNjE0LDggKzYxOSw4IEBACiB9CiAKIHN0YXR1c190IEMyU29mdEhldmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKLSAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7Ci0gICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcCA9IHt9OworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcCA9IHt9OwogCiAgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOwogICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CkBAIC02MzMsOCArNjM4LDggQEAKIH0KIAogc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6cmVzZXREZWNvZGVyKCkgewotICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOwotICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwID0ge307CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3AgPSB7fTsKIAogICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOwogICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKQEAgLTY2Miw4ICs2NjcsOCBAQAogCiBzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgewogICAgIGlmIChtRGVjSGFuZGxlKSB7Ci0gICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKLSAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXAgPSB7fTsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wID0ge307CiAKICAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX2lwX3QpOwogICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC5lX2NtZCA9IElWRF9DTURfREVMRVRFOwpAQCAtODM1LDkgKzg0MCwxMSBAQAogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKLSAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgaWhldmNkX2N4YV92aWRlb19kZWNvZGVfaXBfdCBzX2hldmNkX2RlY29kZV9pcCA9IHt9OworICAgICAgICBpaGV2Y2RfY3hhX3ZpZGVvX2RlY29kZV9vcF90IHNfaGV2Y2RfZGVjb2RlX29wID0ge307CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwID0gJnNfaGV2Y2RfZGVjb2RlX2lwLnNfaXZkX3ZpZGVvX2RlY29kZV9pcF90OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCA9ICZzX2hldmNkX2RlY29kZV9vcC5zX2l2ZF92aWRlb19kZWNvZGVfb3BfdDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKQEAgLTg1MiwyNiArODU5LDI2IEBACiAgICAgICAgIFdPUkQzMiBkZWxheTsKICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CiAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOwotICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCBwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCk7CiAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOwogICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CiAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CiAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCi0gICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7Ci0gICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgICBwc19kZWNvZGVfb3AtPnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAocHNfZGVjb2RlX29wLT51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CiAgICAgICAgICAgICBBTE9HRSgiYWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OwogICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0KLSAgICAgICAgICAgICAgICAgICAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgICAgICAgIChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKICAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKICAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CiAgICAgICAgICAgICByZXNldERlY29kZXIoKTsKQEAgLTg4MCwxNiArODg3LDE2IEBACiAKICAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKLSAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICB9IGVsc2UgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhdGFsIGVycm9yIGluIGRlY29kZXIgMHgleCIsIHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCBwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCk7CisgICAgICAgIH0gZWxzZSBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHBzX2RlY29kZV9vcC0+dTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBwc19kZWNvZGVfb3AtPnU0X2Vycm9yX2NvZGUpOwogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGggPj0gMCAmJiBtT3V0cHV0RGVsYXkgIT0gc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aCkgewotICAgICAgICAgICAgbU91dHB1dERlbGF5ID0gc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aDsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+aTRfcmVvcmRlcl9kZXB0aCA+PSAwICYmIG1PdXRwdXREZWxheSAhPSBwc19kZWNvZGVfb3AtPmk0X3Jlb3JkZXJfZGVwdGgpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheSA9IHBzX2RlY29kZV9vcC0+aTRfcmVvcmRlcl9kZXB0aDsKICAgICAgICAgICAgIEFMT0dWKCJOZXcgT3V0cHV0IGRlbGF5ICVkICIsIG1PdXRwdXREZWxheSk7CiAKICAgICAgICAgICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXkobU91dHB1dERlbGF5KTsKQEAgLTkwNywxNSArOTE0LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgaWYgKDAgPCBwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAmJiAwIDwgcHNfZGVjb2RlX29wLT51NF9waWNfaHQpIHsKICAgICAgICAgICAgIGlmIChtSGVhZGVyRGVjb2RlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIG1IZWFkZXJEZWNvZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04zMihzX2RlY29kZV9vcC51NF9waWNfd2QpLCBJVkRfREVDT0RFX0ZSQU1FKTsKKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMoQUxJR04zMihwc19kZWNvZGVfb3AtPnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOwotICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKyAgICAgICAgICAgIGlmIChwc19kZWNvZGVfb3AtPnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHBzX2RlY29kZV9vcC0+dTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBwc19kZWNvZGVfb3AtPnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gcHNfZGVjb2RlX29wLT51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpOwogCiAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKQEAgLTkzNSwxNSArOTQyLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOwotICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7Ci0gICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgewotICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gcHNfZGVjb2RlX29wLT51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAocHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhwc19kZWNvZGVfb3AtPnU0X3RzLCB3b3JrKTsKICAgICAgICAgfQotICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgaWYgKDAgPT0gcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKICAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaW5Qb3MgKz0gcHNfZGVjb2RlX29wLT51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CiAgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKICAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCiAgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOwpAQCAtOTg1LDE2ICs5OTIsMTggQEAKICAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOwogICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICAgICAgfQotICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7Ci0gICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKLSAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgIGloZXZjZF9jeGFfdmlkZW9fZGVjb2RlX2lwX3Qgc19oZXZjZF9kZWNvZGVfaXAgPSB7fTsKKyAgICAgICAgaWhldmNkX2N4YV92aWRlb19kZWNvZGVfb3BfdCBzX2hldmNkX2RlY29kZV9vcCA9IHt9OworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCA9ICZzX2hldmNkX2RlY29kZV9pcC5zX2l2ZF92aWRlb19kZWNvZGVfaXBfdDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AgPSAmc19oZXZjZF9kZWNvZGVfb3Auc19pdmRfdmlkZW9fZGVjb2RlX29wX3Q7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncyhwc19kZWNvZGVfaXAsIHBzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgewogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICB9Ci0gICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOwotICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsIHBzX2RlY29kZV9pcCwgcHNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHBzX2RlY29kZV9vcC0+dTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsocHNfZGVjb2RlX29wLT51NF90cywgd29yayk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDQ3LDExICsxMDU2LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKaW5kZXggNjAwZDdjMS4uYjliMGE0OCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTIzLDggKzIzLDcgQEAKICNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgogCiAjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKLSNpbmNsdWRlICJpdi5oIgotI2luY2x1ZGUgIml2ZC5oIgorI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcAppbmRleCBjMmQyNTQwLi40YmMxNzc3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogCiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgpAQCAtMjA4LDYgKzIwOSw0MiBAQAogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAogICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQogICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyLCBtQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKICAgICBzdGF0aWMgQzJSIElucHV0RGVsYXlTZXR0ZXIoCkBAIC00MDIsNiArNDM5LDM0IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdldEdvcF9sKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUdvcDsKICAgICB9CisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2RlZENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIH0KIAogICAgcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKQEAgLTQxNSw2ICs0ODAsOCBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBtR29wOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOwogfTsKIAogc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CkBAIC01MzMsNiArNjAwLDMyIEBACiAgICAgICAgICAgICBtQmZyYW1lcyA9IG1heEJmcmFtZXM7CiAgICAgICAgIH0KICAgICB9CisgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICBpZiAoIUMyTWFwcGVyOjptYXAobUNvbG9yQXNwZWN0cy0+cHJpbWFyaWVzLCAmc2ZBc3BlY3RzLm1QcmltYXJpZXMpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tUHJpbWFyaWVzID0gYW5kcm9pZDo6Q29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPnJhbmdlLCAmc2ZBc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgc2ZBc3BlY3RzLm1SYW5nZSA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFDMk1hcHBlcjo6bWFwKG1Db2xvckFzcGVjdHMtPm1hdHJpeCwgJnNmQXNwZWN0cy5tTWF0cml4Q29lZmZzKSkgeworICAgICAgICBzZkFzcGVjdHMubU1hdHJpeENvZWZmcyA9IGFuZHJvaWQ6OkNvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghQzJNYXBwZXI6Om1hcChtQ29sb3JBc3BlY3RzLT50cmFuc2ZlciwgJnNmQXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIHNmQXNwZWN0cy5tVHJhbnNmZXIgPSBhbmRyb2lkOjpDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGludDMyX3QgcHJpbWFyaWVzLCB0cmFuc2ZlciwgbWF0cml4Q29lZmZzOworICAgIGJvb2wgcmFuZ2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKHNmQXNwZWN0cywKKyAgICAgICAgICAgICZwcmltYXJpZXMsCisgICAgICAgICAgICAmdHJhbnNmZXIsCisgICAgICAgICAgICAmbWF0cml4Q29lZmZzLAorICAgICAgICAgICAgJnJhbmdlKTsKKyAgICBtRW5jUGFyYW1zLnNfb3V0X3N0cm1fcHJtcy5pNF92dWlfZW5hYmxlID0gMTsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX2NvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSAxOworICAgIG1FbmNQYXJhbXMuc192dWlfc2VpX3BybXMudTFfY29sb3VyX3ByaW1hcmllcyA9IHByaW1hcmllczsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IHRyYW5zZmVyOworICAgIG1FbmNQYXJhbXMuc192dWlfc2VpX3BybXMudTFfbWF0cml4X2NvZWZmaWNpZW50cyA9IG1hdHJpeENvZWZmczsKKyAgICBtRW5jUGFyYW1zLnNfdnVpX3NlaV9wcm1zLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyA9IHJhbmdlOwogICAgIC8vIHVwZGF0ZSBjb25maWd1cmF0aW9uCiAgICAgbUVuY1BhcmFtcy5zX3NyY19wcm1zLmk0X3dpZHRoID0gbVNpemUtPndpZHRoOwogICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9oZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OwpAQCAtNjI5LDYgKzcyMiw3IEBACiAgICAgICAgIG1RdWFsaXR5ID0gbUludGYtPmdldFF1YWxpdHlfbCgpOwogICAgICAgICBtR29wID0gbUludGYtPmdldEdvcF9sKCk7CiAgICAgICAgIG1SZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIG1Db2xvckFzcGVjdHMgPSBtSW50Zi0+Z2V0Q29kZWRDb2xvckFzcGVjdHNfbCgpOwogICAgIH0KIAogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKQEAgLTEwNzgsMTEgKzExNzIsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAppbmRleCA1ZWE0NjAyLi45ZGJmNjgyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApAQCAtODksNiArODksNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dD4gbVF1YWxpdHk7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOwogI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKICAgICBjaGFyIG1JbkZpbGVbMjAwXTsKICAgICBjaGFyIG1PdXRGaWxlWzIwMF07CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCmluZGV4IGI0ZmIxYjAuLjQzN2QzNGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19tcDNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfbXAzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCmluZGV4IDM5ODRmNjIuLmUzOTQ2NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXAzRGVjIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8bnVtZXJpYz4KQEAgLTQ4NSwxMCArNDg2LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsaW5nUmF0ZTsKKyAgICBpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOwogICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKLSAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCi0gICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gb2Zmc2V0ICVkIHNpemUgJWQgdGltZXN0YW1wICUiIFBSSWQ2NCAiICIsIG91dE9mZnNldCwKKyAgICAgICAgICBvdXRTaXplIC0gb3V0T2Zmc2V0LCBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKTsKICAgICBkZWNvZGVkU2l6ZXMuY2xlYXIoKTsKICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOwpAQCAtNTM5LDExICs1NDAsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcDNEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKaW5kZXggNDAyYmRjNC4uZTJkZmNmMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuaApAQCAtNjMsNyArNjMsNyBAQAogICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwogICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKICAgICBib29sIG1HYXBsZXNzQnl0ZXM7Ci0gICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICBpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CiAgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CiAKICAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKaW5kZXggNjY2ZTY5Ny4uZGFhMTBhZSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCmluZGV4IDdlNzliNzguLmIxY2YzODggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKQEAgLTExMTQsMTEgKzExMTQsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icAppbmRleCAwNjczNzA5Li5lMTlmYTQ1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c19tcGVnNF9oMjYzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX21wZWc0X2gyNjNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAppbmRleCA1NTcxZTYwLi5kZGQzMTJmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtNDQ3LDM0ICs0NDcsMzQgQEAKIC8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKICAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLwogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCB1aW50OF90ICpzcmMsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwKICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSB7CiAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CiAgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7Ci0gICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKICAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdFksIHNyYywgd2lkdGgpOwogICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CisKICAgICAvKiBVIGJ1ZmZlciAqLwogICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFUsIHNyYywgd2lkdGggLyAyKTsKICAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQorCiAgICAgLyogViBidWZmZXIgKi8KICAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RWLCBzcmMsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIH0KIApAQCAtNjU1LDExICs2NTUsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJVID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyViA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKICAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CiAgICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclksCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwKICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CkBAIC03MjcsMTEgKzczMCwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcAppbmRleCA1NGM4YzQ3Li4zYzg3NTMxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApAQCAtNDQ4LDYgKzQ0OCwyMCBAQAogICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CiAgICAgfQogCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgYml0cmF0ZSBjaGFuZ2UKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBpbnQgbGF5ZXJCaXRyYXRlWzJdID0ge3N0YXRpY19jYXN0PGludD4obUJpdHJhdGUtPnZhbHVlKSwgMH07CisgICAgICAgICAgICBBTE9HVigiQ2FsbGluZyBQVlVwZGF0ZUJpdFJhdGUgJWQiLCBsYXllckJpdHJhdGVbMF0pOworICAgICAgICAgICAgUFZVcGRhdGVCaXRSYXRlKG1IYW5kbGUsIGxheWVyQml0cmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKICAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKQEAgLTY1MiwxMSArNjY2LDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKaW5kZXggMzJlMmJmOC4uYmZiYTQ1YyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKaW5kZXggYjdjMTU1Ni4uZDQ5ODdjMCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwCkBAIC00NzMsMTEgKzQ3MywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcAppbmRleCA3MGQxOTY1Li4zNzBkMzNjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAKQEAgLTc4LDYgKzc4LDE5IEBACiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogCiAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlTW9kZSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQml0cmF0ZU1vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgMTI4MDAwKSkKICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg1MDAsIDUxMjAwMCl9KQpAQCAtMTAwLDEyICsxMTMsMTQgQEAKICAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CiAgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KICAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZU1vZGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGUtPnZhbHVlOyB9CiAgICAgdWludDMyX3QgZ2V0Q29tcGxleGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1Db21wbGV4aXR5LT52YWx1ZTsgfQogCiBwcml2YXRlOgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dD4gbUNvbXBsZXhpdHk7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOwogfTsKQEAgLTEzNSw2ICsxNTAsNyBAQAogICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKICAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOwogICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIHVpbnQzMl90IGJpdHJhdGVNb2RlID0gbUludGYtPmdldEJpdHJhdGVNb2RlKCk7CiAgICAgaW50IGNvbXBsZXhpdHkgPSBtSW50Zi0+Z2V0Q29tcGxleGl0eSgpOwogICAgIG1OdW1TYW1wbGVzUGVyRnJhbWUgPSBtU2FtcGxlUmF0ZSAvICgxMDAwIC8gbUZyYW1lRHVyYXRpb25Ncyk7CiAgICAgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSA9CkBAIC0xODksMTQgKzIwNSwyNCBAQAogICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIENvbnN0cmFpbmVkIFZCUgotICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9WQlIoMSkgIT0gT1BVU19PSykpIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgdmJyIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUl9DT05TVFJBSU5UKDEpICE9Ci0gICAgICAgICAgICBPUFVTX09LKSkgewotICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCB2YnIgY29uc3RyYWludCIpOworICAgIGlmIChiaXRyYXRlTW9kZSA9PSBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSkgeworICAgICAgICAvLyBDb25zdHJhaW5lZCBWQlIKKyAgICAgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUigxKSAhPSBPUFVTX09LKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgdmJyIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUl9DT05TVFJBSU5UKDEpICE9CisgICAgICAgICAgICAgICAgT1BVU19PSykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciBjb25zdHJhaW50Iik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChiaXRyYXRlTW9kZSA9PSBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkgeworICAgICAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSKDApICE9IE9QVVNfT0spKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBjYnIgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGJpdHJhdGUgbW9kZSIpOwogICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNjI2LDExICs2NTIsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icAppbmRleCBkNGZiOGY4Li5jMGI3NjEzIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfcmF3X2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX3Jhd19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcAppbmRleCA3YjZmMjFhLi5hMDNkNGUyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApAQCAtODcsNyArODcsOSBAQAogICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCiAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzgsCi0gICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzI0LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8zMn0pCiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwpAQCAtMjE1LDExICsyMTcsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRSYXdEZWNGYWN0b3J5KCk7CiB9CiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgZGVsZXRlIGZhY3Rvcnk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5icAppbmRleCA0M2JmM2M2Li4zYzY4ZWVlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogIkMyU29mdENvZGVjVGVzdC1kZWZhdWx0cyIsCiAgICAgZ3Rlc3Q6IHRydWUsCkBAIC0xNSw2ICsyNCw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY29kZWMyIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmRtYWJ1ZmhlYXAiLAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2NvbW1vbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCmluZGV4IGZmMTE4M2YuLmNjZjZmMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c192b3JiaXNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWMyX2NvbXBvbmVudHNfdm9yYmlzX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCmluZGV4IGE4YjUzNzcuLjg5OWZlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC00NzcsMTEgKzQ3NywxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZvcmJpc0RlY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKaW5kZXggNzIxNzhhYS4uYmI2YTU0NSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjMl9jb21wb25lbnRzX3ZweF9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlYzJfY29tcG9uZW50c192cHhfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCiAgICAgZGVmYXVsdHM6IFsKQEAgLTU3LDQgKzc2LDMgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCmluZGV4IGYxOGY1ZDAuLjA0OWVjMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCkBAIC0xMDEsMTEgKzEwMSwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOEVuY0ZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKaW5kZXggNzQwZGJkYS4uNjQwMTUyMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKQEAgLTEzMSwxMSArMTMxLDEzIEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA5RW5jRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAppbmRleCAzZWVmMWUzLi4yOTUzZDkwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApAQCAtNjMxLDMxICs2MzEsMzAgQEAKIH0KIAogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjWSwgd2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdFksIHNyY1ksIHdpZHRoKTsKICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgZHN0WVN0cmlkZSAqIGhlaWdodDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICAgIH0KKwogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAodWludDMyX3QgKmRzdCwKQEAgLTcyMSwxNiArNzIwLDEyIEBACiAgICAgcmV0dXJuOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKLSAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7Ci0KLSAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7Ci0gICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKLSAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7Ci0gICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewogCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKQEAgLTgyMyw3ICs4MTgsMTAgQEAKICAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAogICAgICAgICAgICAoKGMyX2NudHI2NF90ICopaW1nLT51c2VyX3ByaXYpLT5wZWVrbGwoKSk7CiAKLSAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqZHN0WSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICpkc3RVID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QgKmRzdFYgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisKICAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKICAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKQEAgLTg0MiwxOCArODQwLDE4IEBACiAgICAgICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtIZWlnaHQgPSA2NDsKICAgICAgICAgICAgIGZvciAoOyBpIDwgbUhlaWdodDsgaSArPSBrSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgcXVldWUtPmVudHJpZXMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgW2RzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBtV2lkdGgsIGhlaWdodCA9IHN0ZDo6bWluKG1IZWlnaHQgLSBpLCBrSGVpZ2h0KV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3RZLCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAvIDIgKiBrSGVpZ2h0OwogICAgICAgICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOwogICAgICAgICAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOwotICAgICAgICAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlICoga0hlaWdodDsKKyAgICAgICAgICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGUgKiBrSGVpZ2h0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHF1ZXVlLT5udW1QZW5kaW5nKTsKICAgICAgICAgICAgIHF1ZXVlLT5udW1QZW5kaW5nID0gcXVldWUtPmVudHJpZXMuc2l6ZSgpOwpAQCAtODYyLDggKzg2MCw5IEBACiAgICAgICAgICAgICAgICAgcXVldWUud2FpdEZvckNvbmRpdGlvbihxdWV1ZS0+Y29uZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CkBAIC04NzEsOCArODcwLDEwIEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKICAgICAgICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgICAgICAgICAgZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgIGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAogICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAogICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CkBAIC05NDcsMTEgKzk0OCwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKICAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZweEZhY3RvcnkoKTsKIH0KIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgZmFjdG9yeTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKaW5kZXggN2U5MDkwZi4uNzQ4NmQyNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKQEAgLTYzNSw3ICs2MzUsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOwogICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKICAgICAgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpIHsKICAgICAgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCiAgICAgICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKaW5kZXggNWUzNGI4YS4uYzk4YjgwMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApAQCAtMzQ1LDYgKzM0NSw0MiBAQAogICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQogICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlciwgbUNvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCiAgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgewpAQCAtNDE1LDYgKzQ1MSwzMSBAQAogICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKICAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOwogICAgIH0KKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KIAogICAgcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKQEAgLTQyNyw2ICs0ODgsOCBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlTW9kZTsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCmluZGV4IDQ4ODlkNzguLmJiM2VmYjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwxOCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCiAgICAgZGVmYXVsdHM6IFsKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKICAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisJImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2NmaS1kZWZhdWx0cyIsCiAgICAgXSwKIAogICAgIHNyY3M6IFsiQzJTb2Z0WGFhY0RlYy5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCmluZGV4IDk1MWQwNTguLjhiZjRiNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMzYxLDkgKzM2MSw4IEBACiAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CiAgICAgaW50MTZfdCogb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpKTsKICAgICBtZW1jcHkob3V0QnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKTsKLSAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CiAKLSAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCAwLCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyldKAogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgewogICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKQEAgLTM3Niw2ICszNzUsOSBAQAogICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CiAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CiAgICAgfTsKKworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKwogICAgIGlmICh3b3JrICYmIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBjMl9jbnRyNjRfdChtQ3VyRnJhbWVJbmRleCkpIHsKICAgICAgICAgZmlsbFdvcmsod29yayk7CiAgICAgfSBlbHNlIHsKQEAgLTE2MDAsMTEgKzE2MDIsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGV4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOwogfQogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CiAgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBmYWN0b3J5OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKaW5kZXggMjcwNDNmOC4uNjQ5OTliNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0yMSw2ICszMCwxMCBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9hYmlfY2hlY2tlcjogeworICAgICAgICBjaGVja19hbGxfYXBpczogdHJ1ZSwKKyAgICB9LAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLApAQCAtNDgsNCArNjEsMyBAQAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKaW5kZXggM2QzNTg3Yy4uYWJlMzQzYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlci5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtNjQyLDcgKzY0Miw4IEBACiAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgogICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGNhcGFjaXR5IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0xpbmVhckFsbG9jYXRpb24oCiAgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKQEAgLTY2Niw3ICs2NjcsOCBAQAogICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCkBAIC02OTksNyArNzAxLDggQEAKICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyIGVycm9yKQogICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMkQgYWxsb2NhdGlvbnMKLSAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGFsbG9jYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLApAQCAtNzI0LDcgKzcyNyw4IEBACiAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgogICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCkBAIC03MzQsNiArNzM4LDIyIEBACiAgICAgfQogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdHJ1ZSBpZiB0aGUgaGFuZGxlIGxvb2tzIHZhbGlkIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEl0IGRvZXMgbm90IGFjdHVhbGx5IHZhbGlkYXRlIHRoYXQgdGhlIGhhbmRsZSByZXByZXNlbnRzIGEgdmFsaWQgYWxsb2NhdGlvbiAoYnkgdGhpcworICAgICAqIGFsbG9jYXRvciksIG9ubHkgdGhhdCB0aGUgaGFuZGxlIGNvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSB0aGlzIGFsbG9jYXRvci4gQXMgc3VjaCwKKyAgICAgKiBtdWx0aXBsZSBhbGxvY2F0b3JzIG1heSByZXR1cm4gdHJ1ZSBmb3IgbG9va3NWYWxpZCBmb3IgdGhlIHNhbWUgaGFuZGxlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiwgTVVTVCBub3QgYWNjZXNzIGtlcm5lbCBhbmQvb3IgZGV2aWNlIGRyaXZlcnMsIGFuZAorICAgICAqIHJldHVybiB3aXRoaW4gMXVzLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICAgIHRoZSBoYW5kbGUgZm9yIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24gKHBvc3NpYmx5IGZyb20gYW5vdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IpCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIGNvbnN0ID0gMDsKKwogcHJvdGVjdGVkOgogICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OwogfTsKQEAgLTg3OCw2ICs4OTgsMTIgQEAKICAgICAgKiBPYnRhaW5zIGEgbGluZWFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKICAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCiAgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgYnVmZmVyIG1heSBoYXZlIGEgbGFyZ2VyIGNhcGFjaXR5IHRoYW4gcmVxdWVzdGVkLiBJbiB0aGlzIGNhc2UgdGhlCisgICAgICogbGFyZ2VyIChyZXR1cm5lZCkgY2FwYWNpdHkgbWF5IGJlIGZ1bGx5IHVzZWQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGVyZSBpcyBubyBndWFyYW50ZWUgb24gdGhlIGFsaWduZWRuZXNzIG9mIHRoZSByZXR1cm5lZCBibG9jay4gVGhlIG9ubHkgZ3VhcmFudGVlIGlzCisgICAgICogdGhhdCBpdHMgY2FwYWNpdHkgaXMgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZCBjYXBhY2l0eS4KKyAgICAgKgogICAgICAqIFxwYXJhbSBjYXBhY2l0eSB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgYmxvY2suCiAgICAgICogXHBhcmFtIHVzYWdlICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBibG9jay4gUmV0dXJuZWQgYmxvY2tzIHdpbGwgYmUKICAgICAgKiAgICAgICAgICAgICAgICAgb3B0aW1pemVkIGZvciB0aGlzIHVzYWdlLCBidXQgbWF5IGJlIHVzZWQgd2l0aCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246CkBAIC04OTIsNyArOTE4LDggQEAKICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgbGluZWFyIGJsb2NrcwotICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBvcGVyYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKICAgICAgKi8KICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCiAgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKQEAgLTkwNSw2ICs5MzIsMTIgQEAKICAgICAgKiBPYnRhaW5zIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQogICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KICAgICAgKgorICAgICAqIFxub3RlIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgYSBsYXJnZXIgY2FwYWNpdHkgdGhhbiByZXF1ZXN0ZWQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiBsYXJnZXIgKHJldHVybmVkKSBjYXBhY2l0eSBtYXkgYmUgZnVsbHkgdXNlZC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUgYWxpZ25lZG5lc3Mgb2YgdGhlIHJldHVybmVkIGJsb2NrLiBUaGUgb25seSBndWFyYW50ZWUgaXMKKyAgICAgKiB0aGF0IGl0cyBjYXBhY2l0eSBpcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5LgorICAgICAqCiAgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBjaXJjdWxhciBibG9jay4gKG5vdGU6IHRoZSBzaXplIG9mIHRoZSBvYnRhaW5lZAogICAgICAqICAgICAgICAgICAgICAgICBibG9jayBjb3VsZCBiZSBzbGlnaHRseSBsYXJnZXIsIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZAogICAgICAqICAgICAgICAgICAgICAgICBhbGlnbm1lbnQpCkBAIC05MjEsNyArOTU0LDggQEAKICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgY2lyY3VsYXIgYmxvY2tzCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAogICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCkBAIC05MzQsNiArOTY4LDEyIEBACiAgICAgICogT2J0YWlucyBhIDJEIGdyYXBoaWMgYmxvY2sgb2YgZ2l2ZW4gfHdpZHRofCwgfGhlaWdodHwsIHxmb3JtYXR8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLAogICAgICAqIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCiAgICAgICoKKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgYnVmZmVyIG1heSBoYXZlIGEgbGFyZ2VyIGNhcGFjaXR5ICh3aWR0aCBhbmQgaGVpZ2h0KSB0aGFuIHJlcXVlc3RlZC4gSW4KKyAgICAgKiB0aGlzIGNhc2UgdGhlIGxhcmdlciAocmV0dXJuZWQpIGNhcGFjaXR5IG1heSBiZSBmdWxseSB1c2VkLgorICAgICAqCisgICAgICogXG5vdGUgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9uIHRoZSBhbGlnbmVkbmVzcyBvZiB0aGUgcmV0dXJuZWQgYmxvY2suIFRoZSBvbmx5IGd1YXJhbnRlZSBpcworICAgICAqIHRoYXQgaXRzIGNhcGFjaXR5IGlzIGVxdWFsIHRvIG9yIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgKHdpZHRoIGFuZCBoZWlnaHQpLgorICAgICAqCiAgICAgICogXHBhcmFtIHdpZHRoICB0aGUgd2lkdGggb2YgcmVxdWVzdGVkIGJsb2NrICh0aGUgb2J0YWluZWQgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBlLmcuCiAgICAgICogICAgICAgICAgICAgICB0byBhY2NvbW1vZGF0ZSBhbnkgc3lzdGVtLXJlcXVpcmVkIGFsaWdubWVudCkKICAgICAgKiBccGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgcmVxdWVzdGVkIGJsb2NrICh0aGUgb2J0YWluZWQgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLApAQCAtOTUzLDcgKzk5Myw4IEBACiAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCiAgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCi0gICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQogICAgICAqLwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCBfX3VudXNlZCwgdWludDMyX3QgaGVpZ2h0IF9fdW51c2VkLCB1aW50MzJfdCBmb3JtYXQgX191bnVzZWQsCkBAIC05NjQsNiArMTAwNSwxMDIgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIH5DMkJsb2NrUG9vbCgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEJsb2NraW5nIGZldGNoIGZvciBsaW5lYXIgYmxvY2suIE9idGFpbnMgYSBsaW5lYXIgd3JpdGFibGUgYmxvY2sgb2YgZ2l2ZW4gfGNhcGFjaXR5fAorICAgICAqIGFuZCB8dXNhZ2V8LiBJZiBhIGJsb2NrIGNhbiBiZSBzdWNjZXNzZnVsbHkgb2J0YWluZWQsIHRoZSBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfCwKKyAgICAgKiB8ZmVuY2V8IGlzIHNldCB0byBhIG51bGwtZmVuY2UgYW5kIEMyX09LIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogSWYgYSBibG9jayBjYW5ub3QgYmUgdGVtcG9yYXJpbHkgb2J0YWluZWQsIHxibG9ja3wgaXMgc2V0IHRvIG51bGxwdHIsIGEgd2FpdGFibGUgZmVuY2UKKyAgICAgKiBpcyBzdG9yZWQgaW50byB8ZmVuY2V8IGFuZCBDMl9CTE9DS0lORyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIE90aGVyd2lzZSwgfGJsb2NrfCBpcyBzZXQgdG8gbnVsbHB0ciBhbmQgfGZlbmNlfCBpcyBzZXQgdG8gYSBudWxsLWZlbmNlLiBUaGUgd2FpdGFibGUKKyAgICAgKiBmZW5jZSBpcyBzaWduYWxsZWQgd2hlbiB0aGUgdGVtcG9yYXJ5IHJlc3RyaWN0aW9uIG9uIGZldGNoIGlzIGxpZnRlZC4KKyAgICAgKiBlLmcuIG1vcmUgbWVtb3J5IGlzIGF2YWlsYWJsZSB0byBmZXRjaCBiZWNhdXNlIHNvbWUgbWVvbW9yeSBvciBwcmlvciBibG9ja3Mgd2VyZSByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZSByZXR1cm5lZCBidWZmZXIgbWF5IGhhdmUgYSBsYXJnZXIgY2FwYWNpdHkgdGhhbiByZXF1ZXN0ZWQuIEluIHRoaXMgY2FzZSB0aGUKKyAgICAgKiBsYXJnZXIgKHJldHVybmVkKSBjYXBhY2l0eSBtYXkgYmUgZnVsbHkgdXNlZC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUgYWxpZ25lZG5lc3Mgb2YgdGhlIHJldHVybmVkIGJsb2NrLiBUaGUgb25seSBndWFyYW50ZWUgaXMKKyAgICAgKiB0aGF0IGl0cyBjYXBhY2l0eSBpcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5LgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5IHRoZSBzaXplIG9mIHJlcXVlc3RlZCBibG9jay4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgdGhlIG1lbW9yeSB1c2FnZSBpbmZvIGZvciB0aGUgcmVxdWVzdGVkIGJsb2NrLiBSZXR1cm5lZCBibG9ja3Mgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJsb2Nrcy9idWZmZXJzIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBwcm90ZWN0ZWQgc2NlbmFyaW8uCisgICAgICogXHBhcmFtIGJsb2NrICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG9idGFpbmVkIGJsb2NrIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBmZW5jZSBzaGFsbCBiZSBzdG9yZWQgb24gQzJfQkxPQ0tJTkcgZXJyb3IuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzIG5vciBmZW5jZS4KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovLAorICAgICAgICAgICAgQzJGZW5jZSAqZmVuY2UgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICAodm9pZCkgZmVuY2U7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJsb2NraW5nIGZldGNoIGZvciAyRCBncmFwaGljIGJsb2NrLiBPYnRhaW5zIGEgMkQgZ3JhcGhpYyB3cml0YWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8CisgICAgICogYW5kIHx1c2FnZXwuIElmIGEgYmxvY2sgY2FuIGJlIHN1Y2Nlc3NmdWxseSBvYnRhaW5lZCwgdGhlIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LAorICAgICAqIHxmZW5jZXwgaXMgc2V0IHRvIGEgbnVsbC1mZW5jZSBhbmQgQzJfT0sgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBJZiBhIGJsb2NrIGNhbm5vdCBiZSB0ZW1wb3JhcmlseSBvYnRhaW5lZCwgfGJsb2NrfCBpcyBzZXQgdG8gbnVsbHB0ciwgYSB3YWl0YWJsZSBmZW5jZQorICAgICAqIGlzIHN0b3JlZCBpbnRvIHxmZW5jZXwgYW5kIEMyX0JMT0NLSU5HIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byBudWxscHRyIGFuZCB8ZmVuY2V8IGlzIHNldCB0byBhIG51bGwtZmVuY2UuIFRoZSB3YWl0YWJsZQorICAgICAqIGZlbmNlIGlzIHNpZ25hbGxlZCB3aGVuIHRoZSB0ZW1wb3JhcnkgcmVzdHJpY3Rpb24gb24gZmV0Y2ggaXMgbGlmdGVkLgorICAgICAqIGUuZy4gbW9yZSBtZW1vcnkgaXMgYXZhaWxhYmxlIHRvIGZldGNoIGJlY2F1c2Ugc29tZSBtZW9tb3J5IG9yIHByaW9yIGJsb2NrcyB3ZXJlIHJlbGVhc2VkLgorICAgICAqCisgICAgICogXG5vdGUgVGhlIHJldHVybmVkIGJ1ZmZlciBtYXkgaGF2ZSBhIGxhcmdlciBjYXBhY2l0eSAod2lkdGggYW5kIGhlaWdodCkgdGhhbiByZXF1ZXN0ZWQuIEluCisgICAgICogdGhpcyBjYXNlIHRoZSBsYXJnZXIgKHJldHVybmVkKSBjYXBhY2l0eSBtYXkgYmUgZnVsbHkgdXNlZC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvbiB0aGUgYWxpZ25lZG5lc3Mgb2YgdGhlIHJldHVybmVkIGJsb2NrLiBUaGUgb25seSBndWFyYW50ZWUgaXMKKyAgICAgKiB0aGF0IGl0cyBjYXBhY2l0eSBpcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5ICh3aWR0aCBhbmQgaGVpZ2h0KS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLgorICAgICAqICAgICAgICAgICAgICAgdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBibG9jay4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvciBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgIHByb3RlY3RlZCBibG9ja3MvYnVmZmVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBibG9jayAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqIFxwYXJhbSBmZW5jZSAgcG9pbnRlciB0byB3aGVyZSB0aGUgZmVuY2Ugc2hhbGwgYmUgc3RvcmVkIG9uIEMyX0JMT0NLSU5HIGVycm9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBDMkZlbmNlICpmZW5jZSAvKiBub25udWxsICovKSB7CisgICAgICAgICpibG9jayA9IG51bGxwdHI7CisgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQogcHJvdGVjdGVkOgogICAgIEMyQmxvY2tQb29sKCkgPSBkZWZhdWx0OwogfTsKQEAgLTIxNTYsOSArMjI5MywxMiBAQAogfTsKIAogLyoqCi0gKiBBbiBleHRlbnNpb24gb2YgQzJJbmZvIG9iamVjdHMgdGhhdCBjYW4gY29udGFpbiBhcmJpdHJhcnkgYnVmZmVyIGRhdGEuCisgKiBBIGNvbnN0IG1ldGFkYXRhIG9iamVjdCB0aGF0IGNhbiBjb250YWluIGFyYml0cmFyeSBidWZmZXIgZGF0YS4KICAqCi0gKiBcbm90ZSBUaGlzIG9iamVjdCBpcyBub3QgZGVzY3JpYmFibGUgYW5kIGNvbnRhaW5zIG9wYXF1ZSBkYXRhLgorICogVGhpcyBvYmplY3QgaXMgbm90IGFuIGFjdHVhbCBDMkluZm8gYW5kIGlzIG5vdCBhdHRhY2hlZCB0byBidWZmZXJzIChDMkJ1ZmZlciksIGJ1dCByYXRoZXIgdG8KKyAqIGZyYW1lcyAoQzJGcmFtZURhdGEpLiBJdCBpcyBub3QgZGVzY3JpYmFibGUgdmlhIEMyUGFyYW1EZXNjcmlwdG9yLgorICoKKyAqIEMySW5mb0J1ZmZlciBpcyBhIGNvbnN0IG9iamVjdCB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgb24gc3RhY2sgYW5kIGlzIGNvcGlhYmxlLgogICovCiBjbGFzcyBDMkluZm9CdWZmZXIgewogcHVibGljOgpAQCAtMjE2NywxNCArMjMwNyw2NSBAQAogICAgICAqCiAgICAgICogXHJldHVybiB0aGUgcGFyYW1ldGVyIGluZGV4LgogICAgICAqLwotICAgIGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3Q7CisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCiAgICAgICoKICAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgogICAgICAqLwotICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7CisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQorCisgICAgLy8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIGFzIGEgZ2xvYmFsIGluZm8gYnVmZmVyLgorICAgIEMySW5mb0J1ZmZlciBhc0dsb2JhbCgpIGNvbnN0IHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBtSW5kZXg7CisgICAgICAgIGluZGV4LmNvbnZlcnRUb0dsb2JhbCgpOworICAgICAgICByZXR1cm4gQzJJbmZvQnVmZmVyKGluZGV4LCBtRGF0YSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIGFzIGEgcG9ydCBpbmZvIGJ1ZmZlci4KKyAgICBDMkluZm9CdWZmZXIgYXNQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gbUluZGV4OworICAgICAgICBpbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXgsIG1EYXRhKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgYXMgYSBzdHJlYW0gaW5mbyBidWZmZXIuCisgICAgQzJJbmZvQnVmZmVyIGFzU3RyZWFtKGJvb2wgb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0pIGNvbnN0IHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBtSW5kZXg7CisgICAgICAgIGluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXgsIG1EYXRhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZ2xvYmFsIGluZm8gYnVmZmVyIGNvbnRhaW5pbmcgYSBzaW5nbGUgbGluZWFyIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IHRoZSBjb3JlIHBhcmFtZXRlciBpbmRleCBvZiB0aGlzIGluZm8gYnVmZmVyLgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgaW5mbyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGluZm8gYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBDMkluZm9CdWZmZXIgQ3JlYXRlTGluZWFyQnVmZmVyKEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZ2xvYmFsIGluZm8gYnVmZmVyIGNvbnRhaW5pbmcgYSBzaW5nbGUgZ3JhcGhpYyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleCB0aGUgY29yZSBwYXJhbWV0ZXIgaW5kZXggb2YgdGhpcyBpbmZvIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGluZm8gYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBpbmZvIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJJbmZvQnVmZmVyIENyZWF0ZUdyYXBoaWNCdWZmZXIoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBubyBwdWJsaWMgY29uc3RydWN0b3IKKyAgICBleHBsaWNpdCBDMkluZm9CdWZmZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2Nrcyk7CisgICAgZXhwbGljaXQgQzJJbmZvQnVmZmVyKEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKTsKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtOjpJbmRleCBtSW5kZXg7CisgICAgQzJCdWZmZXJEYXRhIG1EYXRhOworICAgIGV4cGxpY2l0IEMySW5mb0J1ZmZlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3QgQzJCdWZmZXJEYXRhICZkYXRhKTsKIH07CiAKIC8vLyBAfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCmluZGV4IDI5YmNjZDUuLjJjYzdhYjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTc1LDYgKzc1LDEwIEBACiAgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCiB9OwogCitzdHJ1Y3QgQzJQbGF0Zm9ybUNvbmZpZyB7CisgICAgZW51bSBlbmNvZGluZ19xdWFsaXR5X2xldmVsX3QgOiB1aW50MzJfdDsgLy8vPCBlbmNvZGluZyBxdWFsaXR5IGxldmVsCit9OworCiBuYW1lc3BhY2UgewogCiBlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgewpAQCAtMTUxLDYgKzE1NSw3IEBACiAKICAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLwogICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKyAgICBrUGFyYW1JbmRleEVuY3J5cHRlZEJ1ZmZlciwgLy8gaW5mby1idWZmZXIsIHVzZWQgd2l0aCBTTV9SRUFEX1BST1RFQ1RFRF9XSVRIX0VOQ1JZUFRFRAogCiAgICAgLy8gZGVwcmVjYXRlZAogICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0ID0ga1BhcmFtSW5kZXhEZWxheSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfUkVRVUVTVF9GTEFHLApAQCAtMTg2LDYgKzE5MSw4IEBACiAgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKICAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAogCisgICAga1BhcmFtSW5kZXhQaWN0dXJlUXVhbnRpemF0aW9uLAorCiAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICAgICBrUGFyYW1JbmRleEZyYW1lUmF0ZSA9IEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJULApAQCAtMjIxLDYgKzIyOCw3IEBACiAgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlLCAvLyBkcmMsIGVudW0KICAgICBrUGFyYW1JbmRleERyY091dHB1dExvdWRuZXNzLCAvLyBkcmMsIGZsb2F0IChkQkZTKQogICAgIGtQYXJhbUluZGV4RHJjQWxidW1Nb2RlLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleEF1ZGlvRnJhbWVTaXplLCAvLyBpbnQKIAogICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBwbGF0Zm9ybS1kZWZpbmVkIHBhcmFtZXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKQEAgLTI0OSw2ICsyNTcsMTkgQEAKIAogICAgIC8vIGxvdyBsYXRlbmN5IG1vZGUKICAgICBrUGFyYW1JbmRleExvd0xhdGVuY3lNb2RlLCAvLyBib29sCisKKyAgICAvLyB0dW5uZWxlZCBjb2RlYworICAgIGtQYXJhbUluZGV4VHVubmVsZWRNb2RlLCAvLyBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFR1bm5lbEhhbmRsZSwgLy8gaW50MzJbXQorICAgIGtQYXJhbUluZGV4VHVubmVsU3lzdGVtVGltZSwgLy8gaW50NjQKKyAgICBrUGFyYW1JbmRleFR1bm5lbEhvbGRSZW5kZXIsIC8vIGJvb2wKKyAgICBrUGFyYW1JbmRleFR1bm5lbFN0YXJ0UmVuZGVyLCAvLyBib29sCisKKyAgICAvLyBkbWFidWYgYWxsb2NhdG9yCisgICAga1BhcmFtSW5kZXhTdG9yZURtYUJ1ZlVzYWdlLCAgLy8gc3RvcmUsIHN0cnVjdAorCisgICAgLy8gZW5jb2RpbmcgcXVhbGl0eSByZXF1aXJlbWVudHMKKyAgICBrUGFyYW1JbmRleEVuY29kaW5nUXVhbGl0eUxldmVsLCAvLyBlbmNvZGVycywgZW51bQogfTsKIAogfQpAQCAtMzczLDYgKzM5NCw3IEBACiAKIG5hbWVzcGFjZSB7CiAKKy8vIENvZGVjIGJhc2VzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyIGRhdGUgb2YgaW50cm9kdWN0aW9uIHRvIHRoZSBjb2RlIGJhc2UuCiBlbnVtIDogdWludDMyX3QgewogICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCiAgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKQEAgLTM4MywxMiArNDA1LDE2IEBACiAgICAgX0MyX1BMX1ZQOV9CQVNFICA9IDB4NzAwMCwKICAgICBfQzJfUExfRFZfQkFTRSAgID0gMHg4MDAwLAogICAgIF9DMl9QTF9BVjFfQkFTRSAgPSAweDkwMDAsCisgICAgX0MyX1BMX1ZQOF9CQVNFICA9IDB4QTAwMCwKKyAgICBfQzJfUExfTVBFR0hfQkFTRSA9IDB4QjAwMCwgICAgIC8vIE1QRUctSCAzRCBBdWRpbwogCiAgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAogfTsKIAogfQogCisvLyBQcm9maWxlcyBhbmQgbGV2ZWxzIGZvciBlYWNoIGNvZGVjIGFyZSBvcmRlcmVkIGJhc2VkIG9uIGhvdyB0aGV5IGFyZSBvcmRlcmVkIGluIHRoZQorLy8gY29ycmVzcG9uZGluZyBzdGFuZGFyZCBkb2N1bWVudHMgYXQgaW50cm9kdWN0aW9uLCBhbmQgY2hyb25vbG9naWNhbGx5IGFmdGVyd2FyZHMuCiBlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CiAgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCiAKQEAgLTUzNiw2ICs1NjIsMTggQEAKICAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQogICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKICAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCisKKyAgICAvLyBWUDggcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOF8wID0gX0MyX1BMX1ZQOF9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA4IFByb2ZpbGUgMAorICAgIFBST0ZJTEVfVlA4XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDggUHJvZmlsZSAxCisgICAgUFJPRklMRV9WUDhfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOCBQcm9maWxlIDIKKyAgICBQUk9GSUxFX1ZQOF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA4IFByb2ZpbGUgMworCisgICAgLy8gTVBFRy1IIDNEIEF1ZGlvIHByb2ZpbGVzCisgICAgUFJPRklMRV9NUEVHSF9NQUlOID0gX0MyX1BMX01QRUdIX0JBU0UsICAgICAvLy88IE1QRUctSCBNYWluCisgICAgUFJPRklMRV9NUEVHSF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBIaWdoCisgICAgUFJPRklMRV9NUEVHSF9MQywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBMb3ctY29tcGxleGl0eQorICAgIFBST0ZJTEVfTVBFR0hfQkFTRUxJTkUsICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLUggQmFzZWxpbmUKIH07CiAKIGVudW0gQzJDb25maWc6OmxldmVsX3QgOiB1aW50MzJfdCB7CkBAIC02NzgsNiArNzE2LDEzIEBACiAgICAgTEVWRUxfQVYxXzdfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjEKICAgICBMRVZFTF9BVjFfN18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMgogICAgIExFVkVMX0FWMV83XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4zCisKKyAgICAvLyBNUEVHLUggM0QgQXVkaW8gbGV2ZWxzCisgICAgTEVWRUxfTVBFR0hfMSA9IF9DMl9QTF9NUEVHSF9CQVNFLCAgICAgICAgICAvLy88IE1QRUctSCBMMQorICAgIExFVkVMX01QRUdIXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLUggTDIKKyAgICBMRVZFTF9NUEVHSF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy1IIEwzCisgICAgTEVWRUxfTVBFR0hfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctSCBMNAorICAgIExFVkVMX01QRUdIXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLUggTDUKIH07CiAKIHN0cnVjdCBDMlByb2ZpbGVMZXZlbFN0cnVjdCB7CkBAIC0xMTM3LDYgKzExODIsOCBAQAogQzJFTlVNKEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90LCB1aW50MzJfdCwKICAgICBTTV9VTlBST1RFQ1RFRCwgICAgLy8vPCBubyBjb250ZW50IHByb3RlY3Rpb24KICAgICBTTV9SRUFEX1BST1RFQ1RFRCwgLy8vPCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhbGwgYmUgcHJvdGVjdGVkIGZyb20gcmVhZGluZworICAgIC8vLyBib3RoIHJlYWQgcHJvdGVjdGVkIGFuZCByZWFkYWJsZSBlbmNyeXB0ZWQgYnVmZmVycyBhcmUgdXNlZAorICAgIFNNX1JFQURfUFJPVEVDVEVEX1dJVEhfRU5DUllQVEVELAogKQogCiB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNlY3VyZV9tb2RlX3Q+LCBrUGFyYW1JbmRleFNlY3VyZU1vZGU+CkBAIC0xNjg4LDYgKzE3MzUsMzEgQEAKIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0dPUFtdID0gImNvZGluZy5nb3AiOwogCiAvKioKKyAqIFF1YW50aXphdGlvbgorICogbWluL21heCBmb3IgZWFjaCBwaWN0dXJlIHR5cGUKKyAqCisgKi8KK3N0cnVjdCBDMlBpY3R1cmVRdWFudGl6YXRpb25TdHJ1Y3QgeworICAgIEMyUGljdHVyZVF1YW50aXphdGlvblN0cnVjdCgpIDogdHlwZV8oKEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluKElOVDMyX01JTiksIG1heChJTlQzMl9NQVgpIHt9CisgICAgQzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0KEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlLCBpbnQzMl90IG1pbl8sIGludDMyX3QgbWF4XykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSwgbWluKG1pbl8pLCBtYXgobWF4XykgeyB9CisKKyAgICBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZV87CisgICAgaW50MzJfdCBtaW47ICAgICAgLy8gSU5UMzJfTUlOID09ICdubyBsb3dlciBib3VuZCBzcGVjaWZpZWQnCisgICAgaW50MzJfdCBtYXg7ICAgICAgLy8gSU5UMzJfTUFYID09ICdubyB1cHBlciBib3VuZCBzcGVjaWZpZWQnCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFBpY3R1cmVRdWFudGl6YXRpb24pCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQobWluLCAibWluIikKKyAgICBDMkZJRUxEKG1heCwgIm1heCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJQaWN0dXJlUXVhbnRpemF0aW9uU3RydWN0PiwKKyAgICAgICAga1BhcmFtSW5kZXhQaWN0dXJlUXVhbnRpemF0aW9uPiBDMlN0cmVhbVBpY3R1cmVRdWFudGl6YXRpb25UdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1FVQU5USVpBVElPTltdID0gImNvZGluZy5xcCI7CisKKy8qKgogICogU3luYyBmcmFtZSBjYW4gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBieSB0aGUgY2xpZW50LgogICoKICAqIElmIHRydWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwgYmUgZW5jb2RlZCBhcyBhIHN5bmMgZnJhbWUuIFRoaXMgY29uZmlnIGNhbiBiZSBwYXNzZWQKQEAgLTE4NjMsNyArMTkzNSw5IEBACiBDMkVOVU0oQzJDb25maWc6OnBjbV9lbmNvZGluZ190LCB1aW50MzJfdCwKICAgICBQQ01fMTYsCiAgICAgUENNXzgsCi0gICAgUENNX0ZMT0FUCisgICAgUENNX0ZMT0FULAorICAgIFBDTV8yNCwKKyAgICBQQ01fMzIKICkKIAogdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3Q+LCBrUGFyYW1JbmRleFBjbUVuY29kaW5nPgpAQCAtMTk2Miw5ICsyMDM2LDIwIEBACiAvKioKICAqIERSQyBvdXRwdXQgbG91ZG5lc3MgaW4gZEJGUy4gUmV0cmlldmVkIGR1cmluZyBkZWNvZGluZwogICovCi0gdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY091dHB1dExvdWRuZXNzPgordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY091dHB1dExvdWRuZXNzPgogICAgICAgICBDMlN0cmVhbURyY091dHB1dExvdWRuZXNzVHVuaW5nOwotIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19PVVRQVVRfTE9VRE5FU1NbXSA9ICJvdXRwdXQuZHJjLm91dHB1dC1sb3VkbmVzcyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfT1VUUFVUX0xPVURORVNTW10gPSAib3V0cHV0LmRyYy5vdXRwdXQtbG91ZG5lc3MiOworCisvKioKKyAqIEF1ZGlvIGZyYW1lIHNpemUgaW4gc2FtcGxlcy4KKyAqCisgKiBBdWRpbyBlbmNvZGVycyBjYW4gZXhwb3NlIHRoaXMgcGFyYW1ldGVyIHRvIHNpZ25hbCB0aGUgZGVzaXJlZCBhdWRpbyBmcmFtZQorICogc2l6ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGNvZGVkIGFjY2VzcyB1bml0LgorICogRGVmYXVsdCB2YWx1ZSBpcyAwLCBtZWFuaW5nIHRoYXQgdGhlIGVuY29kZXIgYWNjZXB0cyBpbnB1dCBidWZmZXJzIG9mIGFueSBzaXplLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEF1ZGlvRnJhbWVTaXplPgorICAgICAgICBDMlN0cmVhbUF1ZGlvRnJhbWVTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FVRElPX0ZSQU1FX1NJWkVbXSA9ICJyYXcuYXVkaW8tZnJhbWUtc2l6ZSI7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBQUMgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjAzNiw2ICsyMTIxLDMzIEBACiAgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm87CiAKIC8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBwcmVmZXJyZWQgRE1BLUJ1ZiBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gbWVtb3J5IHVzYWdlLgorICovCitzdHJ1Y3QgQzJTdG9yZURtYUJ1ZlVzYWdlU3RydWN0IHsKKyAgICBpbmxpbmUgQzJTdG9yZURtYUJ1ZlVzYWdlU3RydWN0KCkgeyBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7IH0KKworICAgIGlubGluZSBDMlN0b3JlRG1hQnVmVXNhZ2VTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgdWludDY0X3QgdXNhZ2VfLCB1aW50MzJfdCBjYXBhY2l0eV8pCisgICAgICAgIDogdXNhZ2UodXNhZ2VfKSwgY2FwYWNpdHkoY2FwYWNpdHlfKSwgYWxsb2NGbGFncygwKSB7CisgICAgICAgIG1lbXNldChoZWFwTmFtZSwgMCwgZmxleENvdW50KTsKKyAgICB9CisKKyAgICB1aW50NjRfdCB1c2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBDMk1lbW9yeVVzYWdlCisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FwYWNpdHkKKyAgICBpbnQzMl90IGFsbG9jRmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBpb24gYWxsb2NhdGlvbiBmbGFncworICAgIGNoYXIgaGVhcE5hbWVbXTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGRtYWJ1ZiBoZWFwIG5hbWUKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChTdG9yZURtYUJ1ZlVzYWdlLCBoZWFwTmFtZSkKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQoY2FwYWNpdHksICJjYXBhY2l0eSIpCisgICAgQzJGSUVMRChhbGxvY0ZsYWdzLCAiYWxsb2MtZmxhZ3MiKQorICAgIEMyRklFTEQoaGVhcE5hbWUsICJoZWFwLW5hbWUiKQorfTsKKworLy8gc3RvcmUsIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RvcmVEbWFCdWZVc2FnZVN0cnVjdCwga1BhcmFtSW5kZXhTdG9yZURtYUJ1ZlVzYWdlPgorICAgICAgICBDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvOworCisvKioKICAqIEZsZXhpYmxlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycwogICovCiBzdHJ1Y3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCB7CkBAIC0yMTgyLDYgKzIyOTQsMTIzIEBACiB0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q+IEMyUG9ydFRpbWVzdGFtcEdhcFR1bmluZzsKIGNvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRVNUQU1QX0FESlVTVE1FTlRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWVzdGFtcC1hZGp1c3RtZW50IjsKIAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUVU5ORUxFRCBDT0RFQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBUdW5uZWxlZCBjb2RlYyBjb250cm9sLgorICovCitzdHJ1Y3QgQzJUdW5uZWxlZE1vZGVTdHJ1Y3QgeworICAgIC8vLyBtb2RlCisgICAgZW51bSBtb2RlX3QgOiB1aW50MzJfdDsKKyAgICAvLy8gc3luYyB0eXBlCisgICAgZW51bSBzeW5jX3R5cGVfdCA6IHVpbnQzMl90OworCisgICAgaW5saW5lIEMyVHVubmVsZWRNb2RlU3RydWN0KCkgPSBkZWZhdWx0OworCisgICAgaW5saW5lIEMyVHVubmVsZWRNb2RlU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgbW9kZV90IG1vZGVfLCBzeW5jX3R5cGVfdCB0eXBlLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpZCkKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgc3luY1R5cGUodHlwZSkgeworICAgICAgICBtZW1jcHkoJnN5bmNJZCwgJmlkWzBdLCBjMl9taW4oaWQuc2l6ZSgpLCBmbGV4Q291bnQpICogRkxFWF9TSVpFKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJUdW5uZWxlZE1vZGVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgbW9kZV90IG1vZGVfLCBzeW5jX3R5cGVfdCB0eXBlLCBpbnQzMl90IGlkKQorICAgICAgICA6IG1vZGUobW9kZV8pLCBzeW5jVHlwZSh0eXBlKSB7CisgICAgICAgIGlmIChmbGV4Q291bnQgPj0gMSkgeworICAgICAgICAgICAgc3luY0lkWzBdID0gaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb2RlX3QgbW9kZTsgICAgICAgICAgLy8vPCB0dW5uZWxlZCBtb2RlCisgICAgc3luY190eXBlX3Qgc3luY1R5cGU7IC8vLzwgdHlwZSBvZiBzeW5jIHVzZWQgZm9yIHR1bm5lbGVkIG1vZGUKKyAgICBpbnQzMl90IHN5bmNJZFtdOyAgICAgLy8vPCBzeW5jIGlkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVHVubmVsZWRNb2RlLCBzeW5jSWQpCisgICAgQzJGSUVMRChtb2RlLCAibW9kZSIpCisgICAgQzJGSUVMRChzeW5jVHlwZSwgInN5bmMtdHlwZSIpCisgICAgQzJGSUVMRChzeW5jSWQsICJzeW5jLWlkIikKKworfTsKKworQzJFTlVNKEMyVHVubmVsZWRNb2RlU3RydWN0Ojptb2RlX3QsIHVpbnQzMl90LAorICAgIE5PTkUsCisgICAgU0lERUJBTkQsCispOworCisKK0MyRU5VTShDMlR1bm5lbGVkTW9kZVN0cnVjdDo6c3luY190eXBlX3QsIHVpbnQzMl90LAorICAgIFJFQUxUSU1FLAorICAgIEFVRElPX0hXX1NZTkMsCisgICAgSFdfQVZfU1lOQywKKyk7CisKKy8qKgorICogQ29uZmlndXJlIHR1bm5lbGVkIG1vZGUKKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUdW5uZWxlZE1vZGVTdHJ1Y3QsIGtQYXJhbUluZGV4VHVubmVsZWRNb2RlPgorICAgICAgICBDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UVU5ORUxFRF9SRU5ERVJbXSA9ICJvdXRwdXQudHVubmVsZWQtcmVuZGVyIjsKKworLyoqCisgKiBUdW5uZWxlZCBtb2RlIGhhbmRsZS4gVGhlIG1lYW5pbmcgb2YgdGhpcyBpcyBkZXBlbmRzIG9uIHRoZQorICogdHVubmVsZWQgbW9kZS4gSWYgdGhlIHR1bm5lbGVkIG1vZGUgaXMgU0lERUJBTkQsIHRoaXMgaXMgdGhlCisgKiBzaWRlYmFuZCBoYW5kbGUuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJBcnJheSwga1BhcmFtSW5kZXhUdW5uZWxIYW5kbGU+IEMyUG9ydFR1bm5lbEhhbmRsZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9UVU5ORUxfSEFORExFW10gPSAib3V0cHV0LnR1bm5lbC1oYW5kbGUiOworCisvKioKKyAqIFRoZSBzeXN0ZW0gdGltZSB1c2luZyBDTE9DS19NT05PVE9OSUMgaW4gbmFub3NlY29uZHMgYXQgdGhlIHR1bm5lbCBlbmRwb2ludC4KKyAqIEZvciBkZWNvZGVycyB0aGlzIGlzIHRoZSByZW5kZXIgdGltZSBmb3IgdGhlIG91dHB1dCBmcmFtZSBhbmQKKyAqIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIG1lZGlhIHRpbWVzdGFtcCBvZiB0aGUgb3V0cHV0IGZyYW1lLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQ2NF90Piwga1BhcmFtSW5kZXhUdW5uZWxTeXN0ZW1UaW1lPgorICAgICAgICBDMlBvcnRUdW5uZWxTeXN0ZW1UaW1lOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFTkRFUl9USU1FW10gPSAib3V0cHV0LnJlbmRlci10aW1lIjsKKworCisvKioKKyAqIFR1bm5lbGVkIG1vZGUgdmlkZW8gcGVlayBzaWduYWxpbmcgZmxhZy4KKyAqCisgKiBXaGVuIGEgdmlkZW8gZnJhbWUgaXMgcHVzaGVkIHRvIHRoZSBkZWNvZGVyIHdpdGggdGhpcyBwYXJhbWV0ZXIgc2V0IHRvIHRydWUsCisgKiB0aGUgZGVjb2RlciBtdXN0IGRlY29kZSB0aGUgZnJhbWUsIHNpZ25hbCBwYXJ0aWFsIGNvbXBsZXRpb24sIGFuZCBob2xkIG9uIHRoZQorICogZnJhbWUgdW50aWwgQzJTdHJlYW1UdW5uZWxTdGFydFJlbmRlciBpcyBzZXQgdG8gdHJ1ZSAod2hpY2ggcmVzZXRzIHRoaXMKKyAqIGZsYWcpLiBGbHVzaCB3aWxsIGFsc28gcmVzdWx0IGluIHRoZSBmcmFtZXMgYmVpbmcgcmV0dXJuZWQgYmFjayB0byB0aGUKKyAqIGNsaWVudCAoYnV0IG5vdCByZW5kZXJlZCkuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUdW5uZWxIb2xkUmVuZGVyPgorICAgICAgICBDMlN0cmVhbVR1bm5lbEhvbGRSZW5kZXI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9UVU5ORUxfSE9MRF9SRU5ERVJbXSA9ICJvdXRwdXQudHVubmVsLWhvbGQtcmVuZGVyIjsKKworLyoqCisgKiBUdW5uZWxlZCBtb2RlIHZpZGVvIHBlZWsgc2lnbmFsaW5nIGZsYWcuCisgKgorICogVXBvbiByZWNlaXZpbmcgdGhpcyBmbGFnLCB0aGUgZGVjb2RlciBzaGFsbCBzZXQgQzJTdHJlYW1UdW5uZWxIb2xkUmVuZGVyIHRvCisgKiBmYWxzZSwgd2hpY2ggc2hhbGwgY2F1c2UgYW55IGZyYW1lcyBoZWxkIGZvciByZW5kZXJpbmcgdG8gYmUgaW1tZWRpYXRlbHkKKyAqIGRpc3BsYXllZCwgcmVnYXJkbGVzcyBvZiB0aGVpciB0aW1lc3RhbXBzLgorKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhUdW5uZWxTdGFydFJlbmRlcj4KKyAgICAgICAgQzJTdHJlYW1UdW5uZWxTdGFydFJlbmRlcjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RVTk5FTF9TVEFSVF9SRU5ERVJbXSA9ICJvdXRwdXQudHVubmVsLXN0YXJ0LXJlbmRlciI7CisKKy8qKgorICogRW5jb2RpbmcgcXVhbGl0eSBsZXZlbCBzaWduYWxpbmcuCisgKgorICogU2lnbmFsIHRoZSAnbWluaW11bSBlbmNvZGluZyBxdWFsaXR5JyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMTIvUy4gSXQgaW5kaWNhdGVzCisgKiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNvZGVjIGlzIGV4cGVjdGVkIHRvIHRha2UgZXh0cmEgc3RlcHMgdG8gZW5zdXJlIHF1YWxpdHkgbWVldHMgdGhlCisgKiBhcHByb3ByaWF0ZSBtaW5pbXVtLiBBIHZhbHVlIG9mIE5PTkUgaW5kaWNhdGVzIHRoYXQgdGhlIGNvZGVjIGlzIG5vdCB0byBhcHBseQorICogYW55IG1pbmltdW0gcXVhbGl0eSBiYXIgcmVxdWlyZW1lbnRzLiBPdGhlciB2YWx1ZXMgaW5kaWNhdGUgdGhhdCB0aGUgY29kZWMgaXMgdG8gYXBwbHkKKyAqIGEgbWluaW11bSBxdWFsaXR5IGJhciwgd2l0aCB0aGUgZXhhY3QgcXVhbGl0eSBiYXIgYmVpbmcgZGVjaWRlZCBieSB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLAorICAgICAgICBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJQbGF0Zm9ybUNvbmZpZzo6ZW5jb2RpbmdfcXVhbGl0eV9sZXZlbF90Pj4sCisgICAgICAgIGtQYXJhbUluZGV4RW5jb2RpbmdRdWFsaXR5TGV2ZWw+IEMyRW5jb2RpbmdRdWFsaXR5TGV2ZWw7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9FTkNPRElOR19RVUFMSVRZX0xFVkVMW10gPSAiYWxnby5lbmNvZGluZy1xdWFsaXR5LWxldmVsIjsKKworQzJFTlVNKEMyUGxhdGZvcm1Db25maWc6OmVuY29kaW5nX3F1YWxpdHlfbGV2ZWxfdCwgdWludDMyX3QsCisgICAgTk9ORSA9IDAsCisgICAgU19IQU5ESEVMRCA9IDEgICAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIFZNQUY9NzAKKyk7CisKIC8vLyBAfQogCiAjZW5kaWYgIC8vIEMyQ09ORklHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaAppbmRleCBiMGZhZDhmLi5kYTFmNDNiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKQEAgLTU0LDcgKzU0LDcgQEAKIC8vLyBcbm90ZSB0aGlzIHdpbGwgY29udGFpbiBhbnkgaW5pdGlhbGl6YXRpb24sIHdoaWNoIHdlIHdpbGwgcmVtb3ZlIHdoZW4gY29udmVydGluZyB0byBsb3dlci1jYXNlCiAjZGVmaW5lIF9DMl9HRVRfRU5VTV9OQU1FKHgsIHkpICN4CiAvLy8gbWFwcGVyIHRvIGdldCB2YWx1ZSBvZiBlbnVtCi0jZGVmaW5lIF9DMl9HRVRfRU5VTV9WQUxVRSh4LCB0eXBlKSAoX0MyRW51bUNvbnN0PHR5cGU+KXgKKyNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGVfKSAoX0MyRW51bUNvbnN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPHR5cGVfPjo6dHlwZT4pdHlwZV86OngKIAogLy8vIFxlbmRjb25kCiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogdGVtcGxhdGU8PiBcCiBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKICAgICByZXR1cm4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZXMoIFwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4geyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9WQUxVRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4geyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9WQUxVRSwgbmFtZSwgX19WQV9BUkdTX18pIH0sIFwKICAgICAgICAgICAgIHsgX0MyX01BUChfQzJfR0VUX0VOVU1fTkFNRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKICAgICAgICAgICAgIHByZWZpeCk7IFwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKaW5kZXggNTFkNDE3YS4uZTkzOGY5NiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKQEAgLTMxNyw3ICszMTcsOCBAQAogICAgICAgICBERUZJTkVfRklFTERfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoSW5kZXgsIG1JbmRleCkKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJQYXJhbTsgICAgICAgICAgIC8vIGZvciBzZXRTdHJlYW0sIE1ha2VTdHJlYW1JZCwgaXNWYWxpZAorICAgICAgICBmcmllbmQgY2xhc3MgQzJJbmZvQnVmZmVyOyAgICAgICAvLyBmb3IgY29udmVydFRvKgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQsIGNvbnZlcnRUbyoKICAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKIAogICAgICAgICAvKioKQEAgLTUwOCw2ICs1MDksMTQgQEAKICAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0UG9ydChvdXRwdXQpOwogICAgIH0KIAorICAgIC8vLyBzZXRzIHRoZSBzaXplIG9mIHRoaXMgcGFyYW1ldGVyLgorICAgIGlubGluZSB2b2lkIHNldFNpemUoc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPCBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICB9CisgICAgICAgIF9tU2l6ZSA9IGMyX21pbihzaXplLCBfbVNpemUpOworICAgIH0KKwogcHVibGljOgogICAgIC8vLyBpbnZhbGlkYXRlIHRoaXMgcGFyYW1ldGVyLiBUaGVyZSBpcyBubyByZWNvdmVyeSBmcm9tIHRoaXMgY2FsbDsgZS5nLiBwYXJhbWV0ZXIKICAgICAvLy8gY2Fubm90IGJlICdjb3JyZWN0ZWQnIHRvIGJlIHZhbGlkLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaAppbmRleCAwYTMzMjgzLi5kNTc4ODIwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApAQCAtOTcsNiArOTcsOSBAQAogICAgICAgICBQQVJBTV9UWVBFID0gQ29yZUluZGV4IHwgVHlwZUZsYWdzCiAgICAgfTsKIAorICAgIC8vIHRoZSB1bmRlcmx5aW5nIHBhcmFtIHN0cnVjdCB0eXBlCisgICAgdHlwZWRlZiBTIFN0cnVjdDsKKwogcHJvdGVjdGVkOgogICAgIGVudW0gOiB1aW50MzJfdCB7CiAgICAgICAgIEZMRVhfU0laRSA9IDAsCkBAIC0yNzAsNiArMjczLDExIEBACiAgICAgICAgIH0gXAogICAgICAgICByZXR1cm4gMDsgXAogICAgIH0gXAorICAgIGlubGluZSB2b2lkIHNldEZsZXhDb3VudChzaXplX3QgY291bnQpIHsgXAorICAgICAgICBpZiAoY291bnQgPCBmbGV4Q291bnQoKSkgeyBcCisgICAgICAgICAgICB0aGlzLT5zZXRTaXplKHNpemVvZihfVHlwZSkgKyBfVHlwZTo6RkxFWF9TSVpFICogY291bnQpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAogCiAvLy8gTWFyayBmbGV4aWJsZSBtZW1iZXIgdmFyaWFibGUgYW5kIG1ha2Ugc3RydWN0dXJlIGZsZXhpYmxlLgogI2RlZmluZSBGTEVYKGNscywgbSkgXApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmgKaW5kZXggNjkyM2YzZS4uNzk0NDAyZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCkBAIC0xNDUsMTAgKzE0NSwzNSBAQAogICAgICAgICAgKi8KICAgICAgICAgRkxBR19JTkNPTVBMRVRFID0gKDEgPDwgMyksCiAgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGhhcyBiZWVuIGNvcnJlY3RlZCBkdWUgdG8gYSBiaXRzdHJlYW0gZXJyb3IuIFRoaXMgaXMgYSBoaW50LCBhbmQgaW4gbW9zdCBjYXNlcworICAgICAgICAgKiBjYW4gYmUgaWdub3JlZC4gVGhpcyBmbGFnIGNhbiBiZSBzZXQgYnkgY29tcG9uZW50cyBvbiB0aGVpciBvdXRwdXQgdG8gc2lnbmFsIHRoZSBjbGllbnRzCisgICAgICAgICAqIHRoYXQgZXJyb3JzIG1heSBiZSBwcmVzZW50IGJ1dCB0aGUgZnJhbWUgc2hvdWxkIGJlIHVzZWQgbm9uZXRoZWxlc3MuIEl0IGNhbiBhbHNvIGJlIHNldAorICAgICAgICAgKiBieSBjbGllbnRzIHRvIHNpZ25hbCB0aGF0IHRoZSBpbnB1dCBmcmFtZSBoYXMgYmVlbiBjb3JyZWN0ZWQsIGJ1dCBub25ldGhlbGVzcyBzaG91bGQgYmUKKyAgICAgICAgICogcHJvY2Vzc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT1JSRUNURUQgPSAoMSA8PCA0KSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgY29ycnVwdCBkdWUgdG8gYSBiaXRzdHJlYW0gZXJyb3IuIFRoaXMgaXMgc2ltaWxhciB0byBGTEFHX0NPUlJFQ1RFRCwKKyAgICAgICAgICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhpcyBpcyBhIGhpbnQgdGhhdCBkb3duc3RyZWFtIGNvbXBvbmVudHMgc2hvdWxkIG5vdCBwcm9jZXNzIHRoaXMKKyAgICAgICAgICogZnJhbWUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiBzZXQgb24gdGhlIGlucHV0IGJ5IHRoZSBjbGllbnQsIHRoZSBpbnB1dCBpcyBsaWtlbHkgbm9uLXByb2Nlc3NhYmxlIGFuZCBzaG91bGQgYmUKKyAgICAgICAgICogaGFuZGxlZCBzaW1pbGFybHkgdG8gdW5jb3JyZWN0YWJsZSBiaXRzdHJlYW0gZXJyb3IgZGV0ZWN0ZWQuIEZvciBjb21wb25lbnRzIHRoYXQgb3BlcmF0CisgICAgICAgICAqIG9uIHdob2xlIGFjY2VzcyB1bml0cywgdGhpcyBmbGFnIGNhbiBiZSBwcm9wYWdhdGVkIHRvIHRoZSBvdXRwdXQuIE90aGVyIGNvbXBvbmVudHMgc2hvdWxkCisgICAgICAgICAqIGFpbSB0byBkZXRlY3QgYWNjZXNzIHVuaXQgYm91bmRhcmllcyB0byBkZXRlcm1pbmUgaWYgYW55IHBhcnQgb2YgdGhlIGlucHV0IGZyYW1lIGNhbiBiZQorICAgICAgICAgKiBwcm9jZXNzZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiBzZXQgYnkgdGhlIGNvbXBvbmVudCwgdGhpcyBzaWduYWxzIHRvIHRoZSBjbGllbnQgdGhhdCB0aGUgb3V0cHV0IGlzIG5vbi11c2FibGUgLQorICAgICAgICAgKiBpbmNsdWRpbmcgcG9zc2libHkgdGhlIG1ldGFkYXRhIHRoYXQgbWF5IGFsc28gYmUgbm9uLXVzYWJsZTsgLS0gaG93ZXZlciwgdGhlIGNvbXBvbmVudAorICAgICAgICAgKiB3aWxsIHRyeSB0byByZWNvdmVyIG9uIHN1Y2Nlc3NpdmUgaW5wdXQgZnJhbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT1JSVVBUID0gKDEgPDwgNSksCisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIFRoaXMgZnJhbWUgY29udGFpbnMgb25seSBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCBubyBhY3R1YWwgYWNjZXNzIHVuaXQuCiAgICAgICAgICAqCi0gICAgICAgICAqIFxkZXByZWNhdGVkIHBhc3MgY29kZWMgY29uZmlndXJhdGlvbiB3aXRoIHVzaW5nIHRoZSBcdG9kbyBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uCi0gICAgICAgICAqIGluZm8gdG9nZXRoZXIgd2l0aCB0aGUgYWNjZXNzIHVuaXQuCisgICAgICAgICAqIFxkZXByZWNhdGVkIHBhc3MgY29kZWMgY29uZmlndXJhdGlvbiB3aXRoIHVzaW5nIHRoZSBDMkluaXREYXRhIGluZm8gcGFyYW1ldGVyIHRvZ2V0aGVyCisgICAgICAgICAqICAgICAgICAgICAgIHdpdGggdGhlIGFjY2VzcyB1bml0LgogICAgICAgICAgKi8KICAgICAgICAgRkxBR19DT0RFQ19DT05GSUcgID0gKDF1IDw8IDMxKSwKICAgICB9OwpAQCAtMTYxLDcgKzE4Niw3IEBACiAgICAgLy88IGZvciBpbml0aWFsIHdvcmsgaXRlbSwgdGhlc2UgbWF5IGFsc28gY29tZSBmcm9tIHRoZSBwYXJzZXIgLSBpZiBwcm92aWRlZAogICAgIC8vPCBmb3Igb3V0cHV0IGJ1ZmZlcnMsIHRoZXNlIGFyZSB0aGUgcmVzcG9uc2VzIHRvIHJlcXVlc3RlZEluZm9zCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAgICAgIGNvbmZpZ1VwZGF0ZTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPj4gaW5mb0J1ZmZlcnM7CisgICAgc3RkOjp2ZWN0b3I8QzJJbmZvQnVmZmVyPiBpbmZvQnVmZmVyczsKIH07CiAKIHN0cnVjdCBDMldvcmtsZXQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icAppbmRleCBhMGFkM2NlLi5jMDRlY2JlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliY29kZWMyX2NvbXBvbmVudF93cmFwcGVyIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtMjYsNCArMzUsMyBAQAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZmFjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiQzJGdXp6ZXItZGVmYXVsdHMiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJGdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJkbWFidWZoZWFwIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9jb21tb24iLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlidm5ka3N1cHBvcnQiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJBdmNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5hdmMuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckhldmNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJoZXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplck1wZWcyRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJNcGVnNERlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJIMjYzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJWcDhEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC52cDguZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnZweCIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplclZwOURlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlidnB4IiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyQWFjRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQuYWFjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyQW1ybmJEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJBbXJ3YkRlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckZsYWNEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5mbGFjLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyRzcxMUFsYXdEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJHNzExTWxhd0RlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiY29kZWNzX2c3MTFkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJDMkZ1enplckdzbURlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ3NtIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyTXAzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQubXAzLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJPcHVzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlib3B1cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiQzJGdXp6ZXJSYXdEZWMiLAorICAgIGRlZmF1bHRzOiBbIkMyRnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQzJDT01QT05FTlROQU1FPVwiYzIuYW5kcm9pZC5yYXcuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyVm9yYmlzRGVjIiwKKyAgICBkZWZhdWx0czogWyJDMkZ1enplci1kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREMyQ09NUE9ORU5UTkFNRT1cImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXJcIiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIkMyRnV6emVyWGFhY0RlYyIsCisgICAgZGVmYXVsdHM6IFsiQzJGdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURDMkNPTVBPTkVOVE5BTUU9XCJjMi5hbmRyb2lkLnhhYWMuZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnhhYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMTAxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMzE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8QzJGdXp6ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgcHVibGljOgorICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9CisKKyAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2ssIHNpemVfdCBzaXplKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgc2l6ZSwgOjpDMkZlbmNlKCkpfSkge30KK307CisKKy8qKgorICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lX25iKCksIG9uVHJpcHBlZF9uYigpLCBvbkVycm9yX25iKCkgZm9yIEMyIENvbXBvbmVudHMKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyBwdWJsaWM6CisgIENvZGVjTGlzdGVuZXIoY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+CisgICAgICAgICAgICAgICAgICAgIGZuID0gbnVsbHB0cikKKyAgICAgIDogY2FsbEJhY2soZm4pIHt9CisgIHZpcnR1YWwgdm9pZCBvbldvcmtEb25lX25iKGNvbnN0IHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgaWYgKGNhbGxCYWNrKSB7CisgICAgICBjYWxsQmFjayhjb21wLCB3b3JrSXRlbXMpOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdHMpIHsKKyAgICAodm9pZCljb21wOworICAgICh2b2lkKXNldHRpbmdSZXN1bHRzOworICB9CisKKyAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgKHZvaWQpY29tcDsKKyAgICAodm9pZCllcnJvckNvZGU7CisgIH0KKworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGNhbGxCYWNrOworfTsKKworLyoqCisgKiBCdWZmZXIgc291cmNlIGltcGxlbWVudGF0aW9ucyB0byBpZGVudGlmeSBhIGZyYW1lIGFuZCBpdHMgc2l6ZQorICovCitib29sIENvZGVjMkZ1enplcjo6QnVmZmVyU291cmNlOjpzZWFyY2hGb3JNYXJrZXIoKSB7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGlzTWFya2VyKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAtLW1SZWFkSW5kZXg7CisgICAgaWYgKG1SZWFkSW5kZXggPiBtU2l6ZSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDb2RlYzJGdXp6ZXI6OkJ1ZmZlclNvdXJjZTo6cGFyc2UoKSB7CisgIGJvb2wgaXNGcmFtZUF2YWlsYWJsZSA9IHRydWU7CisgIHNpemVfdCBieXRlc1JlbWFpbmluZyA9IG1TaXplOworICB3aGlsZSAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgIGlzRnJhbWVBdmFpbGFibGUgPSBzZWFyY2hGb3JNYXJrZXIoKTsKKyAgICBpZiAoaXNGcmFtZUF2YWlsYWJsZSkgeworICAgICAgc2l6ZV90IGxvY2F0aW9uID0gbVJlYWRJbmRleCArIGtNYXJrZXJTaXplOworICAgICAgYm9vbCBpc0NTRCA9IGlzQ1NETWFya2VyKGxvY2F0aW9uKTsKKyAgICAgIGxvY2F0aW9uICs9IGtNYXJrZXJTdWZmaXhTaXplOworICAgICAgdWludDhfdCogZnJhbWVQdHIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPigmbURhdGFbbG9jYXRpb25dKTsKKyAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBieXRlc1JlbWFpbmluZyAtIGxvY2F0aW9uOworICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgaWYgKG1GcmFtZUxpc3QuZW1wdHkoKSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgfSBlbHNlIGlmIChpc0NTRCkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUc7CisgICAgICB9CisgICAgICBtRnJhbWVMaXN0LmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdHVwbGUoZnJhbWVQdHIsIGZyYW1lU2l6ZSwgZmxhZ3MpKTsKKyAgICAgIGJ5dGVzUmVtYWluaW5nIC09IChmcmFtZVNpemUgKyBrTWFya2VyU2l6ZSArIGtNYXJrZXJTdWZmaXhTaXplKTsKKyAgICAgIC0tbVJlYWRJbmRleDsKKyAgICB9CisgIH0KKyAgaWYgKG1GcmFtZUxpc3QuZW1wdHkoKSkgeworICAgIC8qKgorICAgICAqIFNjZW5hcmlvIHdoZXJlIGlucHV0IGRhdGEgZG9lcyBub3QgY29udGFpbiB0aGUgY3VzdG9tIGZyYW1lIG1hcmtlcnMuCisgICAgICogSGVuY2UgZmVlZCB0aGUgZW50aXJlIGRhdGEgYXMgc2luZ2xlIGZyYW1lLgorICAgICAqLworICAgIG1GcmFtZUxpc3QuZW1wbGFjZV9iYWNrKAorICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoY29uc3RfY2FzdDx1aW50OF90Kj4obURhdGEpLCAwLCBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSk7CisgICAgbUZyYW1lTGlzdC5lbXBsYWNlX2JhY2soCisgICAgICAgIHN0ZDo6bWFrZV90dXBsZShjb25zdF9jYXN0PHVpbnQ4X3QqPihtRGF0YSksIG1TaXplLCBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKTsKKyAgfQorfQorCitGcmFtZURhdGEgQ29kZWMyRnV6emVyOjpCdWZmZXJTb3VyY2U6OmdldEZyYW1lKCkgeworICBGcmFtZURhdGEgZnJhbWUgPSBtRnJhbWVMaXN0LmJhY2soKTsKKyAgbUZyYW1lTGlzdC5wb3BfYmFjaygpOworICByZXR1cm4gZnJhbWU7Cit9CisKK3ZvaWQgQ29kZWMyRnV6emVyOjpoYW5kbGVXb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAodm9pZCljb21wOworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICE9IEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpIHsKKyAgICAgICAgbUVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVF1ZXVlTG9jayk7CisgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW9zKSB7CisgICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHdhaXRGb3JEZWNvZGVDb21wbGV0ZShtRGVjb2RlQ29tcGxldGVNdXRleCk7CisgICAgICAgICAgfQorICAgICAgICAgIG1Db25kaXRpb25hbFZhcmlhYmxlLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIENvZGVjMkZ1enplcjo6aW5pdERlY29kZXIoKSB7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8QzJTdHJpbmcsIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMsCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jPj4gY29kZWMyRmFjdG9yeUZ1bmM7CisKKyAgY29kZWMyRmFjdG9yeUZ1bmMuZW1wbGFjZV9iYWNrKAorICAgICAgc3RkOjptYWtlX3R1cGxlKEMyQ09NUE9ORU5UTkFNRSwgJkNyZWF0ZUNvZGVjMkZhY3RvcnksICZEZXN0cm95Q29kZWMyRmFjdG9yeSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZSA9IEdldFRlc3RDb21wb25lbnRTdG9yZShjb2RlYzJGYWN0b3J5RnVuYyk7CisgIGlmICghY29tcG9uZW50U3RvcmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgIGlmICghYWxsb2NhdG9yU3RvcmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmbUxpbmVhckFsbG9jYXRvcik7CisgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBtTGluZWFyUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1MaW5lYXJBbGxvY2F0b3IsICsrbUJsb2NrUG9vbElkKTsKKyAgaWYgKCFtTGluZWFyUG9vbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1iZXJPZkMyV29ya0l0ZW1zOyArK2kpIHsKKyAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgfQorCisgIHN0YXR1cyA9IGNvbXBvbmVudFN0b3JlLT5jcmVhdGVDb21wb25lbnQoQzJDT01QT05FTlROQU1FLCAmbUNvbXBvbmVudCk7CisgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0dXMgPSBjb21wb25lbnRTdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKEMyQ09NUE9ORU5UTkFNRSwgJm1JbnRlcmZhY2UpOworICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluOworICBzdGF0dXMgPSBtSW50ZXJmYWNlLT5xdWVyeV92Yih7JmtpbmQsICZkb21haW59LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbXM7CisgIGlmIChkb21haW4udmFsdWUgPT0gRE9NQUlOX1ZJREVPKSB7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwga1dpZHRoT2ZWaWRlbywga0hlaWdodE9mVmlkZW8pOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJmlucHV0U2l6ZSk7CisgIH0gZWxzZSBpZiAoZG9tYWluLnZhbHVlID09IERPTUFJTl9BVURJTykgeworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwga1NhbXBsaW5nUmF0ZU9mQXVkaW8pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGtDaGFubmVsc09mQXVkaW8pOworICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2soJnNhbXBsZVJhdGVJbmZvKTsKKyAgICBjb25maWdQYXJhbXMucHVzaF9iYWNrKCZjaGFubmVsQ291bnRJbmZvKTsKKyAgfQorCisgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgIFt0aGlzXShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgaGFuZGxlV29ya0RvbmUoY29tcCwgd29ya0l0ZW1zKTsKKyAgICAgIH0pKTsKKyAgaWYgKCFtTGlzdGVuZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0dXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICBjb21wb25lbnRTdG9yZS0+Y29uZmlnX3NtKGNvbmZpZ1BhcmFtcywgJmZhaWx1cmVzKTsKKyAgaWYgKGZhaWx1cmVzLnNpemUoKSAhPSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RhdHVzID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkZ1enplcjo6ZGVJbml0RGVjb2RlcigpIHsKKyAgbUNvbXBvbmVudC0+c3RvcCgpOworICBtQ29tcG9uZW50LT5yZXNldCgpOworICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgIG1Db21wb25lbnQgPSBudWxscHRyOworfQorCit2b2lkIENvZGVjMkZ1enplcjo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgICByZXR1cm47CisgIH0KKyAgbUJ1ZmZlclNvdXJjZS0+cGFyc2UoKTsKKyAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisgIHNpemVfdCBudW1GcmFtZXMgPSAwOworICB3aGlsZSAoIW1CdWZmZXJTb3VyY2UtPmlzRW9zKCkpIHsKKyAgICB1aW50OF90KiBmcmFtZSA9IG51bGxwdHI7CisgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IDA7CisgICAgRnJhbWVEYXRhIGZyYW1lRGF0YSA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lKCk7CisgICAgZnJhbWUgPSBzdGQ6OmdldDwwPihmcmFtZURhdGEpOworICAgIGZyYW1lU2l6ZSA9IHN0ZDo6Z2V0PDE+KGZyYW1lRGF0YSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUXVldWVMb2NrKTsKKyAgICAgIGlmIChtV29ya1F1ZXVlLmVtcHR5KCkpIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2Zvcihsb2NrLCBrQzJGdXp6ZXJUaW1lT3V0KTsKKyAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KXN0ZDo6Z2V0PDI+KGZyYW1lRGF0YSk7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9ICsrbnVtRnJhbWVzOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpbnQzMl90IGFsaWduZWRTaXplID0gQzJGVVpaRVJfQUxJR04oZnJhbWVTaXplLCBQQUdFX1NJWkUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0YXR1cyA9IG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICBhbGlnbmVkU2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LCAmYmxvY2spOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkodmlldy5iYXNlKCksIGZyYW1lLCBmcmFtZVNpemUpOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2ssIGZyYW1lU2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWV1ZV9uYigmaXRlbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiB3YWl0Rm9yRGVjb2RlQ29tcGxldGUobURlY29kZUNvbXBsZXRlTXV0ZXgpOworICBtQ29uZGl0aW9uYWxWYXJpYWJsZS53YWl0X2Zvcih3YWl0Rm9yRGVjb2RlQ29tcGxldGUsIGtDMkZ1enplclRpbWVPdXQsIFt0aGlzXSB7IHJldHVybiBtRW9zOyB9KTsKKyAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKKyAgbUNvbXBvbmVudC0+Zmx1c2hfc20oQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmMyZmx1c2hlZFdvcmtzKTsKKyAgZGVsZXRlIG1CdWZmZXJTb3VyY2U7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29kZWMyRnV6emVyKiBjb2RlYyA9IG5ldyBDb2RlYzJGdXp6ZXIoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIH0KKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaCBiL21lZGlhL2NvZGVjMi9mdXp6ZXIvQzJGdXp6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFjODFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2Z1enplci9DMkZ1enplci5oCkBAIC0wLDAgKzEsMTI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpZm5kZWYgX19DMkZVWlpFUl9IX18KKyNkZWZpbmUgX19DMkZVWlpFUl9IX18KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCk7CitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgQzJGVVpaRVJfQUxJR04oX3N6LCBfYWxpZ24pICgoKF9zeikgKyAoKF9hbGlnbiktMSkpICYgfigoX2FsaWduKS0xKSkKKworY29uc3RleHByIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMga0MyRnV6emVyVGltZU91dCA9IDUwMDBtczsKK2NvbnN0ZXhwciBpbnQzMl90IGtOdW1iZXJPZkMyV29ya0l0ZW1zID0gODsKK2NvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGhPZlZpZGVvID0gMzg0MDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0T2ZWaWRlbyA9IDIxNjA7Citjb25zdGV4cHIgdWludDMyX3Qga1NhbXBsaW5nUmF0ZU9mQXVkaW8gPSA0ODAwMDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrQ2hhbm5lbHNPZkF1ZGlvID0gODsKKwordHlwZWRlZiBzdGQ6OnR1cGxlPHVpbnQ4X3QqLCBzaXplX3QsIHVpbnQzMl90PiBGcmFtZURhdGE7CisKK2NsYXNzIENvZGVjMkZ1enplciB7CisgcHVibGljOgorICBDb2RlYzJGdXp6ZXIoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYzJGdXp6ZXIoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorICBib29sIGluaXREZWNvZGVyKCk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk7CisKKyBwcml2YXRlOgorICBjbGFzcyBCdWZmZXJTb3VyY2UgeworICAgcHVibGljOgorICAgIEJ1ZmZlclNvdXJjZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRGF0YShkYXRhKSwgbVNpemUoc2l6ZSkgeworICAgICAgbVJlYWRJbmRleCA9IChzaXplIDw9IGtNYXJrZXJTaXplKSA/IDAgOiAoc2l6ZSAtIGtNYXJrZXJTaXplKTsKKyAgICB9CisgICAgfkJ1ZmZlclNvdXJjZSgpIHsKKyAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICAgIG1TaXplID0gMDsKKyAgICAgIG1SZWFkSW5kZXggPSAwOworICAgICAgbUZyYW1lTGlzdC5jbGVhcigpOworICAgIH0KKyAgICBib29sIGlzRW9zKCkgeyByZXR1cm4gbUZyYW1lTGlzdC5lbXB0eSgpOyB9CisgICAgdm9pZCBwYXJzZSgpOworICAgIEZyYW1lRGF0YSBnZXRGcmFtZSgpOworCisgICBwcml2YXRlOgorICAgIGJvb2wgaXNNYXJrZXIoKSB7CisgICAgICBpZiAoKGtNYXJrZXJTaXplIDwgbVNpemUpICYmIChtUmVhZEluZGV4IDwgbVNpemUgLSBrTWFya2VyU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIChtZW1jbXAoJm1EYXRhW21SZWFkSW5kZXhdLCBrTWFya2VyLCBrTWFya2VyU2l6ZSkgPT0gMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc0NTRE1hcmtlcihzaXplX3QgcG9zaXRpb24pIHsKKyAgICAgIGlmICgoa01hcmtlclN1ZmZpeFNpemUgPCBtU2l6ZSkgJiYgKHBvc2l0aW9uIDwgbVNpemUgLSBrTWFya2VyU3VmZml4U2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIChtZW1jbXAoJm1EYXRhW3Bvc2l0aW9uXSwga0NzZE1hcmtlclN1ZmZpeCwga01hcmtlclN1ZmZpeFNpemUpID09IDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgc2VhcmNoRm9yTWFya2VyKCk7CisKKyAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1TaXplID0gMDsKKyAgICBzaXplX3QgbVJlYWRJbmRleCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8RnJhbWVEYXRhPiBtRnJhbWVMaXN0OworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWFya2VyW10gPSAiX01BUksiOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrQ3NkTWFya2VyU3VmZml4W10gPSAiX0hfIjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0ZyYW1lTWFya2VyU3VmZml4W10gPSAiX0ZfIjsKKyAgICAvLyBBbGwgbWFya2VycyBzaG91bGQgYmUgNSBieXRlcyBsb25nICggc2l6ZW9mICdfTUFSSycgd2hpY2ggaXMgNSkKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU2l6ZSA9IChzaXplb2Yoa01hcmtlcikgLSAxKTsKKyAgICAvLyBBbGwgbWFya2VyIHR5cGVzIHNob3VsZCBiZSAzIGJ5dGVzIGxvbmcgKCdfSF8nLCAnX0ZfJykKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU3VmZml4U2l6ZSA9IDM7CisgIH07CisKKyAgQnVmZmVyU291cmNlKiBtQnVmZmVyU291cmNlOworICBib29sIG1Fb3MgPSBmYWxzZTsKKyAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworCisgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKyAgc3RkOjptdXRleCBtRGVjb2RlQ29tcGxldGVNdXRleDsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbmFsVmFyaWFibGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9fQzJGVVpaRVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCmluZGV4IDNiNzMzNTAuLjEyMmFhY2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCkBAIC0xLDEyICsxLDIwIEBACiAvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKIC8vIHVzZSBsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMgaW5zdGVhZAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCiAKICAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJPdXRwdXRCdWZmZXJRdWV1ZS5jcHAiLAogICAgICAgICAidHlwZXMuY3BwIiwKICAgICBdLAogCkBAIC04MCw2ICs4OCw3IEBACiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKQEAgLTkzLDkgKzEwMiwxNyBAQAogICAgICAgICB2ZW5kb3I6IHsKICAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKICAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyX25vdm5kayIsCisgICAgICAgICAgICAgICAgImxpYmNvZGVjMl9oaWRsX3BsdWdpbl9zdHViIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgYXBleDogeworICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgIH0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCmluZGV4IDhhODQ2MDEuLjA4MmM1ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCkBAIC0yMiw2ICsyMiwxMCBAQAogI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KIAorI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKQEAgLTM5MCwxMCArMzk0LDE3IEBACiAgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAogICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbDsKKyNpZmRlZiBfX0FORFJPSURfQVBFWF9fCiAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCiAgICAgICAgICAgICBtQ29tcG9uZW50LAogICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisjZWxzZQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENvbXBvbmVudFN0b3JlOjpHZXRGaWx0ZXJXcmFwcGVyKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworI2VuZGlmCiAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgewogICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCmluZGV4IDliOWQ0NDkuLjFjMGQ1YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcApAQCAtMzUsNiArMzUsMTQgQEAKICNpbmNsdWRlIDxvc3RyZWFtPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8RGVmYXVsdEZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKyNlbmRpZgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIG1lZGlhIHsKQEAgLTE3Niw2ICsxODQsMTYgQEAKICAgICByZXR1cm4gbVBhcmFtZXRlckNhY2hlOwogfQogCisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IENvbXBvbmVudFN0b3JlOjpHZXRGaWx0ZXJXcmFwcGVyKCkgeworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGtQbHVnaW5QYXRoW10gPSAibGliYzJmaWx0ZXJwbHVnaW4uc28iOworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gd3JhcHBlciA9IEZpbHRlcldyYXBwZXI6OkNyZWF0ZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RGVmYXVsdEZpbHRlclBsdWdpbj4oa1BsdWdpblBhdGgpKTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KKyNlbmRpZgorCiAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKIFJldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAogICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKQEAgLTE4OSw2ICsyMDcsOSBAQAogICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CiAKICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmNvbXBvbmVudCA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwQ29tcG9uZW50KGMyY29tcG9uZW50KTsKKyNlbmRpZgogICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmNvbXBvbmVudC0+aW50ZigpKTsKICAgICAgICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChjMmNvbXBvbmVudCwgbGlzdGVuZXIsIHRoaXMsIHBvb2wpOwogICAgICAgICBpZiAoIWNvbXBvbmVudCkgewpAQCAtMjE0LDggKzIzNSwxMiBAQAogICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGMyaW50ZXJmYWNlOwogICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CisKICAgICBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRlcmZhY2U7CiAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgICAgIGMyaW50ZXJmYWNlID0gR2V0RmlsdGVyV3JhcHBlcigpLT5tYXliZVdyYXBJbnRlcmZhY2UoYzJpbnRlcmZhY2UpOworI2VuZGlmCiAgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyaW50ZXJmYWNlKTsKICAgICAgICAgaW50ZXJmYWNlID0gbmV3IENvbXBvbmVudEludGVyZmFjZShjMmludGVyZmFjZSwgbVBhcmFtZXRlckNhY2hlKTsKICAgICB9CkBAIC00NTgsNyArNDgzLDYgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCi0KIH0gIC8vIG5hbWVzcGFjZSB1dGlscwogfSAgLy8gbmFtZXNwYWNlIFYxXzAKIH0gIC8vIG5hbWVzcGFjZSBjMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCmluZGV4IDVlYzg4ZWMuLjdjMmUwMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKQEAgLTIwMSw2ICsyMDEsOCBAQAogICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKICAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvT3V0cHV0QnVmZmVyUXVldWUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL091dHB1dEJ1ZmZlclF1ZXVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhNzJlZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvT3V0cHV0QnVmZmVyUXVldWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLU91dHB1dEJ1ZmZlclF1ZXVlIgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL091dHB1dEJ1ZmZlclF1ZXVlLmg+Ci0jaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzIuMC9CMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLQotI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgotI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgotI2luY2x1ZGUgPEMyQnVmZmVyLmg+Ci0jaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KLQotI2luY2x1ZGUgPGlvbWFuaXA+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBoYXJkd2FyZSB7Ci1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIGMyIHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXVzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgotICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdXNpbmcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKLSAgICAgICAgVjJfMDo6dXRpbHM6OkIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLQotbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8gewotCi0vLyBDcmVhdGUgYSBHcmFwaGljQnVmZmVyIG9iamVjdCBmcm9tIGEgZ3JhcGhpYyBibG9jay4KLXNwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKLSAgICB1aW50MzJfdCB3aWR0aDsKLSAgICB1aW50MzJfdCBoZWlnaHQ7Ci0gICAgdWludDMyX3QgZm9ybWF0OwotICAgIHVpbnQ2NF90IHVzYWdlOwotICAgIHVpbnQzMl90IHN0cmlkZTsKLSAgICB1aW50MzJfdCBnZW5lcmF0aW9uOwotICAgIHVpbnQ2NF90IGJxSWQ7Ci0gICAgaW50MzJfdCBicVNsb3Q7Ci0gICAgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKLSAgICAgICAgICAgIGJsb2NrLmhhbmRsZSgpLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwKLSAgICAgICAgICAgICZzdHJpZGUsICZnZW5lcmF0aW9uLCAmYnFJZCwgcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZicVNsb3QpKTsKLSAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPQotICAgICAgICAgICAgVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShibG9jay5oYW5kbGUoKSk7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9Ci0gICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcihncmFsbG9jSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdXNhZ2UsIHN0cmlkZSk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoZ3JhbGxvY0hhbmRsZSk7Ci0gICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KLXZvaWQgZm9yRWFjaEJsb2NrKEMyRnJhbWVEYXRhJiBmcmFtZURhdGEsCi0gICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzKSB7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIgOiBmcmFtZURhdGEuYnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrIDoKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7Ci0gICAgICAgICAgICAgICAgcHJvY2VzcyhibG9jayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBCbG9ja1Byb2Nlc3Nvcj4KLXZvaWQgZm9yRWFjaEJsb2NrKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAotICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgewotICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrTGlzdCkgewotICAgICAgICBpZiAoIXdvcmspIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4mIHdvcmtsZXQgOiB3b3JrLT53b3JrbGV0cykgewotICAgICAgICAgICAgaWYgKHdvcmtsZXQpIHsKLSAgICAgICAgICAgICAgICBmb3JFYWNoQmxvY2sod29ya2xldC0+b3V0cHV0LCBwcm9jZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0SGdicChjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgewotICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQotICAgICAgICAgICAgaWdicC0+Z2V0SGFsSW50ZXJmYWNlPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+KCk7Ci0gICAgcmV0dXJuIGhnYnAgPyBoZ2JwIDoKLSAgICAgICAgICAgIG5ldyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIoaWdicCk7Ci19Ci0KLXN0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKLSAgICBpZiAoIWlnYnApIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIG51bGwgcHJvZHVjZXIuIjsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOwotICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7Ci0KLSAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoaW5nIGJ1ZmZlcjoiCi0gICAgICAgICAgICA8PCAiIGJsb2NrIGRpbWVuc2lvbiAiIDw8IGJsb2NrLndpZHRoKCkgPDwgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2NrLmhlaWdodCgpCi0gICAgICAgICAgICA8PCAiLCBncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgPDwgIngiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkKLSAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCi0gICAgICAgICAgICA8PCAiLCBmb3JtYXQgMHgiIDw8IHN0ZDo6c2V0dyg4KSA8PCBncmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpCi0gICAgICAgICAgICA8PCAiLCB1c2FnZSAweCIgPDwgc3RkOjpzZXR3KDE2KSA8PCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpCi0gICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKQotICAgICAgICAgICAgPDwgIiwgc3RyaWRlICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCkKLSAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKLSAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gIiA8PCByZXN1bHQgPDwgIi4iOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIHJldHVybmVkIHNsb3QgIyIKLSAgICAgICAgICAgICAgICAgPDwgKmJxU2xvdCA8PCAiLiI7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1ib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKLSAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCi0gICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKSwKLSAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7Ci19Ci0KLX0gLy8gdW5uYW1lZCBuYW1lc3BhY2UKLQotT3V0cHV0QnVmZmVyUXVldWU6Ok91dHB1dEJ1ZmZlclF1ZXVlKCkKLSAgICAgIDogbUdlbmVyYXRpb257MH0sIG1CcUlkezB9IHsKLX0KLQotT3V0cHV0QnVmZmVyUXVldWU6On5PdXRwdXRCdWZmZXJRdWV1ZSgpIHsKLX0KLQotYm9vbCBPdXRwdXRCdWZmZXJRdWV1ZTo6Y29uZmlndXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCkgewotICAgIHNpemVfdCB0cnlOdW0gPSAwOwotICAgIHNpemVfdCBzdWNjZXNzID0gMDsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXJzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107Ci0gICAgc3RkOjp3ZWFrX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPgotICAgICAgICAgICAgcG9vbERhdGFzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107Ci0gICAgewotICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKLSAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtSWdicCA9IGlnYnA7Ci0gICAgICAgIG1HZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKLSAgICAgICAgbUJxSWQgPSBicUlkOwotICAgICAgICBtT3duZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPGludD4oMCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChtQnFJZCA9PSAwIHx8ICFtQnVmZmVyc1tpXSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPSBtUG9vbERhdGFzW2ldLmxvY2soKTsKLSAgICAgICAgICAgIGlmICghZGF0YSB8fAotICAgICAgICAgICAgICAgICFfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK3RyeU51bTsKLSAgICAgICAgICAgIGludCBicVNsb3Q7Ci0gICAgICAgICAgICBtQnVmZmVyc1tpXS0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmYnFTbG90LCBtQnVmZmVyc1tpXSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIGF0dGFjaCA9Ci0gICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6RW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIG1Pd25lciwgZ2V0SGdicChtSWdicCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgYnFJZCwgYnFTbG90KTsKLSAgICAgICAgICAgIGlmICghYXR0YWNoKSB7Ci0gICAgICAgICAgICAgICAgaWdicC0+Y2FuY2VsQnVmZmVyKGJxU2xvdCwgRmVuY2U6Ok5PX0ZFTkNFKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlcnNbYnFTbG90XSA9IG1CdWZmZXJzW2ldOwotICAgICAgICAgICAgcG9vbERhdGFzW2JxU2xvdF0gPSBkYXRhOwotICAgICAgICAgICAgKytzdWNjZXNzOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzW2ldID0gYnVmZmVyc1tpXTsKLSAgICAgICAgICAgIG1Qb29sRGF0YXNbaV0gPSBwb29sRGF0YXNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR0QoInJlbW90ZSBncmFwaGljIGJ1ZmZlciBtaWdyYXRpb24gJXp1LyV6dSIsIHN1Y2Nlc3MsIHRyeU51bSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgT3V0cHV0QnVmZmVyUXVldWU6OnJlZ2lzdGVyQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQotICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7Ci0gICAgaWYgKCFkYXRhKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7Ci0KLSAgICBpZiAoIW1JZ2JwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBvbGRHZW5lcmF0aW9uOwotICAgIHVpbnQ2NF90IG9sZElkOwotICAgIGludDMyX3Qgb2xkU2xvdDsKLSAgICAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IGJ1ZmZlcnF1ZXVlLWJhc2VkLCBkbyBub3RoaW5nLgotICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCi0gICAgICAgICAgICBkYXRhLCAmb2xkR2VuZXJhdGlvbiwgJm9sZElkLCAmb2xkU2xvdCkgfHwgKG9sZElkID09IDApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gSWYgdGhlIGJsb2NrJ3MgYnFJZCBpcyB0aGUgc2FtZSBhcyB0aGUgZGVzaXJlZCBicUlkLCBqdXN0IGhvbGQuCi0gICAgaWYgKChvbGRJZCA9PSBtQnFJZCkgJiYgKG9sZEdlbmVyYXRpb24gPT0gbUdlbmVyYXRpb24pKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gaW1wb3J0IHdpdGhvdXQgYXR0YWNoaW5nOiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnFJZCAiIDw8IG9sZElkCi0gICAgICAgICAgICAgICAgICAgICA8PCAiLCBicVNsb3QgIiA8PCBvbGRTbG90Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgbUdlbmVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKLSAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoZGF0YSwgbU93bmVyLCBnZXRIZ2JwKG1JZ2JwKSk7Ci0gICAgICAgIG1Qb29sRGF0YXNbb2xkU2xvdF0gPSBkYXRhOwotICAgICAgICBtQnVmZmVyc1tvbGRTbG90XSA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOwotICAgICAgICBtQnVmZmVyc1tvbGRTbG90XS0+c2V0R2VuZXJhdGlvbk51bWJlcihtR2VuZXJhdGlvbik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbnQzMl90IGQgPSAoaW50MzJfdCkgbUdlbmVyYXRpb24gLSAoaW50MzJfdCkgb2xkR2VuZXJhdGlvbjsKLSAgICBMT0coV0FSTklORykgPDwgInJlY2VpdmluZyBzdGFsZSBidWZmZXI6IGdlbmVyYXRpb24gIgotICAgICAgICAgICAgICAgICA8PCBtR2VuZXJhdGlvbiA8PCAiICwgZGlmZiAiIDw8IGQgIDw8ICIgOiBzbG90ICIKLSAgICAgICAgICAgICAgICAgPDwgb2xkU2xvdDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE91dHB1dEJ1ZmZlclF1ZXVlOjpvdXRwdXRCdWZmZXIoCi0gICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAotICAgICAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCi0gICAgICAgIEJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KSB7Ci0gICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICB1aW50NjRfdCBicUlkOwotICAgIGludDMyX3QgYnFTbG90OwotICAgIGJvb2wgZGlzcGxheSA9IGRpc3BsYXlCdWZmZXJRdWV1ZUJsb2NrKGJsb2NrKTsKLSAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSB8fAotICAgICAgICBicUlkID09IDApIHsKLSAgICAgICAgLy8gQmxvY2sgbm90IGZyb20gYnVmZmVycXVldWUgLS0gaXQgbXVzdCBiZSBhdHRhY2hlZCBiZWZvcmUgcXVldWluZy4KLQotICAgICAgICBtTXV0ZXgubG9jaygpOwotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7Ci0gICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKLSAgICAgICAgbU11dGV4LnVubG9jaygpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dGFjaFRvQnVmZmVyUXVldWUoCi0gICAgICAgICAgICAgICAgYmxvY2ssIG91dHB1dElnYnAsIG91dHB1dEdlbmVyYXRpb24sICZicVNsb3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgIm91dHB1dEJ1ZmZlciAtLSBhdHRhY2hpbmcgZmFpbGVkLiI7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm91dHB1dEJ1ZmZlciAtLSBxdWV1ZUJ1ZmZlcigpIGZhaWxlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJvbiBub24tYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKLSAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yID0gIiA8PCBzdGF0dXMgPDwgIi4iOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgbU11dGV4LmxvY2soKTsKLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7Ci0gICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOwotICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtQnFJZDsKLSAgICBtTXV0ZXgudW5sb2NrKCk7Ci0KLSAgICBpZiAoIW91dHB1dElnYnApIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvdXRwdXRCdWZmZXIgLS0gb3V0cHV0IHN1cmZhY2UgaXMgbnVsbC4iOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBpZiAoIWRpc3BsYXkpIHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJvdXRwdXRCdWZmZXIgLS0gY2Fubm90IGRpc3BsYXkgIgotICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrIHRvIHRoZSBidWZmZXJxdWV1ZS4iOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKGJxSWQgIT0gb3V0cHV0QnFJZCB8fCBnZW5lcmF0aW9uICE9IG91dHB1dEdlbmVyYXRpb24pIHsKLSAgICAgICAgaW50MzJfdCBkaWZmID0gKGludDMyX3QpIG91dHB1dEdlbmVyYXRpb24gLSAoaW50MzJfdCkgZ2VuZXJhdGlvbjsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJvdXRwdXRCdWZmZXIgLS0gYnVmZmVycyBmcm9tIG9sZCBnZW5lcmF0aW9uIHRvICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IG91dHB1dEdlbmVyYXRpb24gPDwgIiAsIGRpZmY6ICIgPDwgZGlmZgotICAgICAgICAgICAgICAgICAgICAgPDwgIiAsIHNsb3Q6ICIgPDwgYnFTbG90OwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJvdXRwdXRCdWZmZXIgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgotICAgICAgICAgICAgICAgICAgICJvbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgotICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE91dHB1dEJ1ZmZlclF1ZXVlOjpob2xkQnVmZmVyUXVldWVCbG9ja3MoCi0gICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0KSB7Ci0gICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAotICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJk91dHB1dEJ1ZmZlclF1ZXVlOjpyZWdpc3RlckJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gIC8vIG5hbWVzcGFjZSBWMV8wCi19ICAvLyBuYW1lc3BhY2UgYzIKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCmluZGV4IGZlN2QwNDguLjI3ZTJhMDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBGaWx0ZXJXcmFwcGVyOworCiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIG1lZGlhIHsKIG5hbWVzcGFjZSBjMiB7CkBAIC03NCw2ICs3Niw4IEBACiAgICAgICovCiAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtZXRlckNhY2hlPiBnZXRQYXJhbWV0ZXJDYWNoZSgpIGNvbnN0OwogCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBHZXRGaWx0ZXJXcmFwcGVyKCk7CisKICAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUuCiAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvT3V0cHV0QnVmZmVyUXVldWUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9PdXRwdXRCdWZmZXJRdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDM2OGY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9PdXRwdXRCdWZmZXJRdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX09VVFBVVF9CVUZGRVJfUVVFVUUKLSNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19PVVRQVVRfQlVGRkVSX1FVRVVFCi0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPEMyV29yay5oPgotCi1zdHJ1Y3QgQzJfSElERSBfQzJCbG9ja1Bvb2xEYXRhOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgaGFyZHdhcmUgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBjMiB7Ci1uYW1lc3BhY2UgVjFfMCB7Ci1uYW1lc3BhY2UgdXRpbHMgewotCi0vLyBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9jayBPcGVyYXRpb25zCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIE1hbmFnZSBCdWZmZXJRdWV1ZSBhbmQgZ3JhcGhpYyBibG9ja3MgZm9yIGJvdGggY29tcG9uZW50IGFuZCBjb2RlYy4KLS8vIE1hbmFnZSBncmFwaGljIGJsb2NrcyBvd25lcnNoaXAgY29uc2lzdGVudGx5IGR1cmluZyBzdXJmYWNlIGNoYW5nZS4KLXN0cnVjdCBPdXRwdXRCdWZmZXJRdWV1ZSB7Ci0KLSAgICBPdXRwdXRCdWZmZXJRdWV1ZSgpOwotCi0gICAgfk91dHB1dEJ1ZmZlclF1ZXVlKCk7Ci0KLSAgICAvLyBDb25maWd1cmUgYSBuZXcgc3VyZmFjZSB0byByZW5kZXIgZ3JhcGhpYyBibG9ja3MuCi0gICAgLy8gR3JhcGhpYyBibG9ja3MgZnJvbSBvbGRlciBzdXJmYWNlIHdpbGwgYmUgbWlncmF0ZWQgdG8gbmV3IHN1cmZhY2UuCi0gICAgYm9vbCBjb25maWd1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkKTsKLQotICAgIC8vIFJlbmRlciBhIGdyYXBoaWMgYmxvY2sgdG8gY3VycmVudCBzdXJmYWNlLgotICAgIHN0YXR1c190IG91dHB1dEJ1ZmZlcigKLSAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAotICAgICAgICAgICAgY29uc3QgQm5HcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAotICAgICAgICAgICAgQm5HcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBvdXRwdXQpOwotCi0gICAgLy8gQ2FsbCBob2xkQnVmZmVyUXVldWVCbG9jaygpIG9uIG91dHB1dCBibG9ja3MgaW4gdGhlIGdpdmVuIHdvcmtMaXN0LgotICAgIC8vIFRoZSBPdXRwdXRCdWZmZXJRdWV1ZSB3aWxsIHRha2UgdGhlIG93bmVyc2hpcCBvZiBvdXRwdXQgYmxvY2tzLgotICAgIC8vCi0gICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gcmVjZWl2ZWQKLSAgICAvLyBmcm9tIGFub3RoZXIgcHJvY2Vzcy4KLSAgICB2b2lkIGhvbGRCdWZmZXJRdWV1ZUJsb2NrcygKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0KTsKLQotcHJpdmF0ZToKLQotICAgIHN0ZDo6bXV0ZXggbU11dGV4OwotICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1JZ2JwOwotICAgIHVpbnQzMl90IG1HZW5lcmF0aW9uOwotICAgIHVpbnQ2NF90IG1CcUlkOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IG1Pd25lcjsKLSAgICAvLyBUbyBtaWdyYXRlIGV4aXN0aW5nIGJ1ZmZlcnMKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOyAvLyBmaW5kIGEgYmV0dGVyIHdheQotICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOwotCi0gICAgYm9vbCByZWdpc3RlckJ1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gIC8vIG5hbWVzcGFjZSBWMV8wCi19ICAvLyBuYW1lc3BhY2UgYzIKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfT1VUUFVUX0JVRkZFUl9RVUVVRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAKaW5kZXggYzczY2I1Mi4uNzJmN2M0MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC04OTUsMTMgKzg5NSwxMiBAQAogICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAogICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKICAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgewotICAgIC8vIFRPRE86IEMySW5mb0J1ZmZlciBpcyBub3QgaW1wbGVtZW50ZWQuCi0gICAgKHZvaWQpZDsKLSAgICAodm9pZClzOwotICAgICh2b2lkKWJ1ZmZlclBvb2xTZW5kZXI7Ci0gICAgKHZvaWQpYmFzZUJsb2NrczsKLSAgICAodm9pZCliYXNlQmxvY2tJbmRpY2VzOwotICAgIExPRyhJTkZPKSA8PCAiSW5mb0J1ZmZlciBub3QgaW1wbGVtZW50ZWQuIjsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuaW5kZXgoKSk7CisgICAgQnVmZmVyJiBkQnVmZmVyID0gZC0+YnVmZmVyOworICAgIGlmICghb2JqY3B5KCZkQnVmZmVyLCBzLmRhdGEoKSwgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkluZm9CdWZmZXI6OmRhdGEiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC05NDMsMTQgKzk0Miw5IEBACiAKICAgICBkLT5pbmZvQnVmZmVycy5yZXNpemUocy5pbmZvQnVmZmVycy5zaXplKCkpOwogICAgIGkgPSAwOwotICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4mIHNJbmZvQnVmZmVyIDogcy5pbmZvQnVmZmVycykgeworICAgIGZvciAoY29uc3QgQzJJbmZvQnVmZmVyJiBzSW5mb0J1ZmZlciA6IHMuaW5mb0J1ZmZlcnMpIHsKICAgICAgICAgSW5mb0J1ZmZlciYgZEluZm9CdWZmZXIgPSBkLT5pbmZvQnVmZmVyc1tpKytdOwotICAgICAgICBpZiAoIXNJbmZvQnVmZmVyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJOdWxsIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFvYmpjcHkoJmRJbmZvQnVmZmVyLCAqc0luZm9CdWZmZXIsCisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgc0luZm9CdWZmZXIsCiAgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmluZm9CdWZmZXJzWyIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgaSAtIDEgPDwgIl0uIjsKQEAgLTEzNDEsNiArMTMzNSw2OCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCisvLyBJbmZvQnVmZmVyIC0+IEMySW5mb0J1ZmZlcgorYm9vbCBvYmpjcHkoc3RkOjp2ZWN0b3I8QzJJbmZvQnVmZmVyPiAqZCwgY29uc3QgSW5mb0J1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisKKyAgICAvLyBDdXJyZW50bHksIGEgbm9uLW51bGwgQzJJbmZvQnVmZXIgbXVzdCBjb250YWluIGV4YWN0bHkgMSBibG9jay4KKyAgICBpZiAocy5idWZmZXIuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5idWZmZXIuYmxvY2tzLnNpemUoKSAhPSAxKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgSW5mb0J1ZmZlcjo6QnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMySW5mb0J1ZmZlciBtdXN0IGNvbnRhaW4gZXhhY3RseSAxIGJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBCbG9jayAmc0Jsb2NrID0gcy5idWZmZXIuYmxvY2tzWzBdOworICAgIGlmIChzQmxvY2suaW5kZXggPj0gYmFzZUJsb2Nrcy5zaXplKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBJbmZvQnVmZmVyOjpCdWZmZXI6OmJsb2Nrc1swXS5pbmRleDogIgorICAgICAgICAgICAgICAgICAgICAgICJBcnJheSBpbmRleCBvdXQgb2YgcmFuZ2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkJhc2VCbG9jayAmYmFzZUJsb2NrID0gYmFzZUJsb2Nrc1tzQmxvY2suaW5kZXhdOworCisgICAgLy8gUGFyc2UgbWV0YS4KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gc0Jsb2NrTWV0YTsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmc0Jsb2NrTWV0YSwgc0Jsb2NrLm1ldGEpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgSW5mb0J1ZmZlcjo6QnVmZmVyOjpibG9ja3NbMF0ubWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ29weSBmZW5jZS4KKyAgICBDMkZlbmNlIGRGZW5jZTsKKyAgICBpZiAoIW9iamNweSgmZEZlbmNlLCBzQmxvY2suZmVuY2UpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgSW5mb0J1ZmZlcjo6QnVmZmVyOjpibG9ja3NbMF0uZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvbnN0cnVjdCBhIGJsb2NrLgorICAgIHN3aXRjaCAoYmFzZUJsb2NrLnR5cGUpIHsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpMSU5FQVI6CisgICAgICAgIGlmIChzQmxvY2tNZXRhLnNpemUoKSA9PSAxICYmIHNCbG9ja01ldGFbMF0gIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgc0Jsb2NrTWV0YVswXS0+c2l6ZSgpID09IHNpemVvZihDMkhpZGxfUmFuZ2VJbmZvKSkgeworICAgICAgICAgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDMkhpZGxfUmFuZ2VJbmZvKj4oc0Jsb2NrTWV0YVswXSk7CisgICAgICAgICAgICBkLT5lbXBsYWNlX2JhY2soQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHMuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGJhc2VCbG9jay5saW5lYXItPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlSW5mby0+b2Zmc2V0LCByYW5nZUluZm8tPmxlbmd0aCwgZEZlbmNlKSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBNZXRhIGZvciBDMkJhc2VCbG9jazo6TGluZWFyIEluZm9CdWZmZXIuIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6R1JBUEhJQzoKKyAgICAgICAgLy8gSXQncyBub3QgdXNlZCBub3cKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm9uLVVzZWQgQzJCYXNlQmxvY2s6OnR5cGUgZm9yIEluZm9CdWZmZXIuIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJhc2VCbG9jazo6dHlwZSBmb3IgSW5mb0J1ZmZlci4iOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQogYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CkBAIC0xMzc1LDggKzE0MzEsMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCiAgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAocy5pbmZvQnVmZmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBJbmZvQnVmZmVyIGlzIG9wdGlvbmFsCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkLT5pbmZvQnVmZmVycy5yZXNlcnZlKHMuaW5mb0J1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IEluZm9CdWZmZXIgJnNJbmZvQnVmZmVyOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIGlmICghb2JqY3B5KCYoZC0+aW5mb0J1ZmZlcnMpLCBzSW5mb0J1ZmZlciwgYmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVkYXRhOjppbmZvQnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMTM2Mjc5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi8uLi8uLi8uLi9idWlsZC9zb29uZy9zY3JpcHRzL3N5c3RlbS1jbGFuZy1mb3JtYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9BbmRyb2lkLmJwCmluZGV4IDVlYTQ4MjUuLjBhZTEzM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGZpbGVncm91cCB7CiAgICAgbmFtZTogIm1lZGlhX2MyX3YxX2F1ZGlvX2RlY29kZV9yZXMiLAogICAgIHBhdGg6ICJyZXMiLApAQCAtMTA4LDQgKzExNyw0IEBACiAgICAgc3JjczogWwogICAgICAgICAicmVzL2JiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IiwKICAgICBdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKaW5kZXggMDE0Y2JlOS4uNjI0YWFkMiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCIsCiAgICAgc3RlbTogInZ0c19tZWRpYV9jMl92MV8wX2F1ZGlvX2RlY190ZXN0IiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCmluZGV4IDNhNDdhZTkuLjllM2E4MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtMjMsMjQgKzIzLDQ3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKLSNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CiAjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlIDxDMkRlYnVnLmg+CiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CiAKLXVzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOwotCiAjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgordXNpbmcgRGVjb2RlVGVzdFBhcmFtZXRlcnMgPSBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWludDMyX3QsIGJvb2w+Oworc3RhdGljIHN0ZDo6dmVjdG9yPERlY29kZVRlc3RQYXJhbWV0ZXJzPiBnRGVjb2RlVGVzdFBhcmFtZXRlcnM7CiAKLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4KLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzOwordXNpbmcgQ3NkRmx1c2hUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBib29sPjsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzPiBnQ3NkRmx1c2hUZXN0UGFyYW1ldGVyczsKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzOworc3RydWN0IENvbXBUb0ZpbGVzIHsKKyAgICBzdGQ6OnN0cmluZyBtaW1lOworICAgIHN0ZDo6c3RyaW5nIGlucHV0RmlsZTsKKyAgICBzdGQ6OnN0cmluZyBpbmZvRmlsZTsKK307CiAKLS8vIFJlc291cmNlIGRpcmVjdG9yeQotc3RhdGljIHN0ZDo6c3RyaW5nIHNSZXNvdXJjZURpciA9ICIiOworc3RkOjp2ZWN0b3I8Q29tcFRvRmlsZXM+IGdDb21wVG9GaWxlcyA9IHsKKyAgICAgICAgeyJtcDRhLWxhdG0iLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Im1wNGEtbGF0bSIsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9LAorICAgICAgICB7Im1wZWciLCAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIsICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyJ9LAorICAgICAgICB7Im1wZWciLCAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIsCisgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifSwKKyAgICAgICAgeyIzZ3BwIiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIn0sCisgICAgICAgIHsiM2dwcCIsICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifSwKKyAgICAgICAgeyJhbXItd2IiLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8ifSwKKyAgICAgICAgeyJhbXItd2IiLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn0sCisgICAgICAgIHsidm9yYmlzIiwgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLAorICAgICAgICAgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHsib3B1cyIsICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIn0sCisgICAgICAgIHsiZzcxMS1hbGF3IiwgImJiYl9nNzExYWxhd18xY2hfOGtoei5yYXciLCAiYmJiX2c3MTFhbGF3XzFjaF84a2h6LmluZm8ifSwKKyAgICAgICAgeyJnNzExLW1sYXciLCAiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXciLCAiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIn0sCisgICAgICAgIHsiZ3NtIiwgImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyIsICJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIn0sCisgICAgICAgIHsicmF3IiwgImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgImJiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyJ9LAorICAgICAgICB7ImZsYWMiLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyJ9LAorfTsKIAogY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKICAgcHVibGljOgpAQCAtNzYsMzMgKzk5LDI4IEBACiAgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOwogICAgICAgICBBU1NFUlRfTkUobUxpbmVhclBvb2wsIG51bGxwdHIpOwogCi0gICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKLSAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOwotICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOwotICAgICAgICB9OwotICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0gewotICAgICAgICAgICAgICAgIHsieGFhYyIsIHhhYWN9LCAgICAgICAgICB7Im1wMyIsIG1wM30sIHsiYW1ybmIiLCBhbXJuYn0sCi0gICAgICAgICAgICAgICAgeyJhbXJ3YiIsIGFtcndifSwgICAgICAgIHsiYWFjIiwgYWFjfSwgeyJ2b3JiaXMiLCB2b3JiaXN9LAotICAgICAgICAgICAgICAgIHsib3B1cyIsIG9wdXN9LCAgICAgICAgICB7InBjbSIsIHBjbX0sIHsiZzcxMS5hbGF3IiwgZzcxMWFsYXd9LAotICAgICAgICAgICAgICAgIHsiZzcxMS5tbGF3IiwgZzcxMW1sYXd9LCB7ImdzbSIsIGdzbX0sIHsicmF3IiwgcmF3fSwKLSAgICAgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKLSAgICAgICAgfTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPSBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEFTU0VSVF9FUShjMmVyciwgQzJfT0spIDw8ICJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCI7CisgICAgICAgIEFTU0VSVF9FUShxdWVyaWVkLnNpemUoKSwgMSkgPDwgIlNpemUgb2YgdGhlIHZlY3RvciByZXR1cm5lZCBpcyBpbnZhbGlkIjsKIAotICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgewotICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIobUNvbXBvbmVudE5hbWUuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgewotICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbU1pbWUgPSAoKEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKwogICAgICAgICBtRW9zID0gZmFsc2U7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CiAgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OwogICAgICAgICBtV29ya1Jlc3VsdCA9IEMyX09LOwogICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOwotICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKworICAgICAgICBib29sIHZhbGlkID0gZ2V0RmlsZU5hbWVzKG1TdHJlYW1JbmRleCk7CisgICAgICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgICAgIEdURVNUX1NLSVAoKSA8PCAiTm8gdGVzdCBmaWxlIGZvciAgbWltZSAiIDw8IG1NaW1lIDw8ICIgaW5kZXg6ICIgPDwgbVN0cmVhbUluZGV4OworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJtU3RyZWFtSW5kZXggOiAlenUiLCBtU3RyZWFtSW5kZXgpOworICAgICAgICBBTE9HVigibUlucHV0RmlsZSA6ICVzIiwgbUlucHV0RmlsZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIm1JbmZvRmlsZSA6ICVzIiwgbUluZm9GaWxlLmNfc3RyKCkpOworCiAgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOwogICAgIH0KIApAQCAtMTE5LDYgKzEzNyw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGVUaW1lc3RhbXBMaXN0KGludDMyX3QqIGJpdFN0cmVhbUluZm8pOwogCisgICAgYm9vbCBnZXRGaWxlTmFtZXMoc2l6ZV90IHN0cmVhbUluZGV4ID0gMCk7CisKICAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgewogICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CkBAIC0xNTgsMjkgKzE3OCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW51bSBzdGFuZGFyZENvbXAgewotICAgICAgICB4YWFjLAotICAgICAgICBtcDMsCi0gICAgICAgIGFtcm5iLAotICAgICAgICBhbXJ3YiwKLSAgICAgICAgYWFjLAotICAgICAgICB2b3JiaXMsCi0gICAgICAgIG9wdXMsCi0gICAgICAgIHBjbSwKLSAgICAgICAgZzcxMWFsYXcsCi0gICAgICAgIGc3MTFtbGF3LAotICAgICAgICBnc20sCi0gICAgICAgIHJhdywKLSAgICAgICAgZmxhYywKLSAgICAgICAgdW5rbm93bl9jb21wLAotICAgIH07Ci0KKyAgICBzdGQ6OnN0cmluZyBtTWltZTsKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIGJvb2wgbUVvczsKICAgICBib29sIG1EaXNhYmxlVGVzdDsKICAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OwotICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CiAKICAgICBpbnQzMl90IG1Xb3JrUmVzdWx0OwogICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKQEAgLTIwMSwyMyArMjA0LDI3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CiAKKyAgICBzdGQ6OnN0cmluZyBtSW5wdXRGaWxlOworICAgIHN0ZDo6c3RyaW5nIG1JbmZvRmlsZTsKKyAgICBzaXplX3QgbVN0cmVhbUluZGV4ID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TdHJlYW1JbmRleCA9IDA7CiAgICAgfQogfTsKIAogdm9pZCB2YWxpZGF0ZUNvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgZGlzYWJsZVRlc3QpIHsKICAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CkBAIC0yNDQsMTMgKzI1MSw2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKLSAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7Ci0gICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOwotICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOwogfQogCkBAIC0yNzEsNyArMjcxLDcgQEAKIC8vIHBhcnNpbmcgdGhlIGhlYWRlciBvZiBlbGVtZW50YXJ5IHN0cmVhbS4gQ2xpZW50IG5lZWRzIHRvIGNvbGxlY3QgdGhpcwogLy8gaW5mb3JtYXRpb24gYW5kIHJlY29uZmlndXJlCiB2b2lkIGdldElucHV0Q2hhbm5lbEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1pbWUsIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKICAgICAvLyBxdWVyeSBuU2FtcGxlUmF0ZSBhbmQgbkNoYW5uZWxzCiAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzewogICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLApAQCAtMjc5LDEwMCArMjc5LDM4IEBACiAgICAgfTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOwogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX0RPTlRfQkxPQ0ssICZpblBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBzdGF0dXMpOwotICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKLSAgICAgICAgICAgIGJpdFN0cmVhbUluZm9baV0gPSAqKGludDMyX3QqKSgodWludDhfdCopcGFyYW0gKyBvZmZzZXQpOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoY29tcE5hbWUpIHsKLSAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1ybmI6IHsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJ3YjogewotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCAxNjAwMCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojpnc206IHsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgODAwMCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spIDw8ICJRdWVyeSBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbCBjb3VudCBpbmZvIGZhaWxlZCI7CisgICAgQVNTRVJUX0VRKGluUGFyYW1zLnNpemUoKSwgaW5kaWNlcy5zaXplKCkpIDw8ICJTaXplIG9mIHRoZSB2ZWN0b3IgcmV0dXJuZWQgaXMgaW52YWxpZCI7CisKKyAgICBiaXRTdHJlYW1JbmZvWzBdID0gQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpGcm9tKGluUGFyYW1zWzBdLmdldCgpKS0+dmFsdWU7CisgICAgYml0U3RyZWFtSW5mb1sxXSA9IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpGcm9tKGluUGFyYW1zWzFdLmdldCgpKS0+dmFsdWU7CisgICAgaWYgKG1pbWUuZmluZCgiM2dwcCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOworICAgIH0gZWxzZSBpZiAobWltZS5maW5kKCJhbXItd2IiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgMTYwMDApOworICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgfSBlbHNlIGlmIChtaW1lLmZpbmQoImdzbSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMV0sIDEpOwogICAgIH0KIH0KIAotLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50Ci0jZGVmaW5lIFNUUkVBTV9DT1VOVCAyCi0KIC8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKLXZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLCBjaGFyKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0cmVhbUluZGV4ID0gMCkgewotICAgIHN0cnVjdCBDb21wVG9VUkwgewotICAgICAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKLSAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKLSAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKLSAgICB9OwotICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKK2Jvb2wgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdEJhc2U6OmdldEZpbGVOYW1lcyhzaXplX3Qgc3RyZWFtSW5kZXgpIHsKKyAgICBpbnQgc3RyZWFtQ291bnQgPSAwOwogCi0gICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7Ci0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp4YWFjLAotICAgICAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCi0gICAgICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsCi0gICAgICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wMywKLSAgICAgICAgICAgICB7ImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLCAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyJ9LAotICAgICAgICAgICAgIHsiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6LmluZm8iLAotICAgICAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCi0gICAgICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKLSAgICAgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKLSAgICAgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCi0gICAgICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIifSwKLSAgICAgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsCi0gICAgICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwKLSAgICAgICAgICAgICB7ImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiJ9LAotICAgICAgICAgICAgIHsiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIiwKLSAgICAgICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKLSAgICAgICAgICAgICB7ImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAotICAgICAgICAgICAgIHsiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAotICAgICAgICAgICAgIHsiYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFtbGF3LAotICAgICAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXciLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8iLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAotICAgICAgICAgICAgIHsiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3IiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCi0gICAgICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLnJhdyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAotICAgICAgICAgICAgIHsiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKLSAgICB9OwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgewotICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKLSAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKLSAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdDb21wVG9GaWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIW1NaW1lLmNvbXBhcmUoImF1ZGlvLyIgKyBnQ29tcFRvRmlsZXNbaV0ubWltZSkpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Db3VudCA9PSBzdHJlYW1JbmRleCkgeworICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUgPSBzUmVzb3VyY2VEaXIgKyBnQ29tcFRvRmlsZXNbaV0uaW5wdXRGaWxlOworICAgICAgICAgICAgICAgIG1JbmZvRmlsZSA9IHNSZXNvdXJjZURpciArIGdDb21wVG9GaWxlc1tpXS5pbmZvRmlsZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbUNvdW50Kys7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LApAQCAtNDYxLDcgKzM5OSw3IEBACiB2b2lkIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlOjp2YWxpZGF0ZVRpbWVzdGFtcExpc3QoaW50MzJfdCogYml0U3RyZWFtSW5mbykgewogICAgIHVpbnQzMl90IHNhbXBsZXNSZWNlaXZlZCA9IDA7CiAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIGludDMyX3QgblNhbXBsZVJhdGUgPSBiaXRTdHJlYW1JbmZvWzBdOwogICAgIGludDMyX3QgbkNoYW5uZWxzID0gYml0U3RyZWFtSW5mb1sxXTsKICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOwpAQCAtNDg2LDcgKzQyNCw3IEBACiBURVNUX1AoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7Ci0gICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1EaXNhYmxlVGVzdCk7CiAgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOwogfQogCkBAIC00OTUsMTggKzQzMywxNyBAQAogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1NaW1lLCBiaXRTdHJlYW1JbmZvKSk7CiAgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CiB9CiAKLWNsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdAotICAgIDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPERlY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVN0cmVhbUluZGV4ID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CiAgICAgfQogfTsKIApAQCAtNTE0LDQyICs0NTEsMzAgQEAKICAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIHVpbnQzMl90IHN0cmVhbUluZGV4ID0gc3RkOjpzdG9pKHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpKTsKLSAgICA7Ci0gICAgYm9vbCBzaWduYWxFT1MgPSAhc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOworICAgIGJvb2wgc2lnbmFsRU9TID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOwotICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7Ci0gICAgaWYgKCFzdHJjbXAobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpKSB7Ci0gICAgICAgIEFMT0dWKCJFTVBUWSBJTlBVVCBzUmVzb3VyY2VEaXIuY19zdHIoKSAlcyBtVVJMICAlcyAiLCBzUmVzb3VyY2VEaXIuY19zdHIoKSwgbVVSTCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IoaW5mbywgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7Ci0gICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBpbmZvOworICAgIGludDMyX3QgbnVtQ3NkcyA9IHBvcHVsYXRlSW5mb1ZlY3RvcihtSW5mb0ZpbGUsICZJbmZvLCBtVGltZXN0YW1wRGV2VGVzdCwgJm1UaW1lc3RhbXBVc2xpc3QpOworICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGU6ICIgPDwgbUluZm9GaWxlOwogCiAgICAgLy8gUmVzZXQgdG90YWwgbm8gb2YgZnJhbWVzIHJlY2VpdmVkCiAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKICAgICBtVGltZXN0YW1wVXMgPSAwOwogICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKLSAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgIGlmIChtTWltZS5maW5kKCJyYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKICAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIH0KICAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwKQEAgLTU4NiwyOSArNTExLDIzIEBACiAgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKLQotICAgIGludDMyX3QgbnVtQ3NkcyA9IHBvcHVsYXRlSW5mb1ZlY3RvcihpbmZvLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKLSAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlOiAiIDw8IGluZm87CisgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKG1JbmZvRmlsZSwgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CisgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBtSW5mb0ZpbGU7CiAKICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07Ci0gICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICBpZiAobU1pbWUuZmluZCgicmF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbU1pbWUsIGJpdFN0cmVhbUluZm8pKTsKICAgICB9CiAgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CiAKICAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCiAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQpAQCAtNjIxLDcgKzU0MCw3IEBACiAKICAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOwogICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOwotICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgZWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLApAQCAtNjc4LDIyICs1OTcsMTcgQEAKIFRFU1RfUChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBGbHVzaFRlc3QpIHsKICAgICBkZXNjcmlwdGlvbigiVGVzdHMgRmx1c2ggY2FsbHMiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwotICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKLQotICAgIGludDMyX3QgbnVtQ3NkcyA9IHBvcHVsYXRlSW5mb1ZlY3RvcihpbmZvLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKLSAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlOiAiIDw8IGluZm87CisgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKG1JbmZvRmlsZSwgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CisgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBtSW5mb0ZpbGU7CiAKICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07Ci0gICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICBpZiAobU1pbWUuZmluZCgicmF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbU1pbWUsIGJpdFN0cmVhbUluZm8pKTsKICAgICB9CiAgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CkBAIC03MDgsOSArNjIyLDggQEAKICAgICAgICAgICAgIHZlcmlmeUZsdXNoT3V0cHV0KGZsdXNoZWRXb3JrLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2spKTsKICAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIE1BWF9JTlBVVF9CVUZGRVJTKTsKIAotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogICAgIC8vIERlY29kZSAzMCBmcmFtZXMgYW5kIGZsdXNoLgogICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSBGTFVTSF9JTlRFUlZBTDsKQEAgLTc2MywxNSArNjc2LDEwIEBACiAgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOwogICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOwogCi0gICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOwotCi0gICAgZWxlSW5mby5vcGVuKGluZm8pOwotICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGVsZUluZm8ub3BlbihtSW5mb0ZpbGUpOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbUlucHV0RmlsZSA8PCAiIC0gZmlsZSBub3QgZm91bmQiOwogICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CiAgICAgaW50IGJ5dGVzQ291bnQgPSAwOwogICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOwpAQCAtNzk4LDE5ICs3MDYsMTggQEAKICAgICB9CiAgICAgZWxlSW5mby5jbG9zZSgpOwogICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKLSAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgIGlmIChtTWltZS5maW5kKCJyYXciKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKICAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtTWltZSwgYml0U3RyZWFtSW5mbykpOwogICAgIH0KICAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwKQEAgLTgzMywxMiArNzQwLDEyIEBACiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOwogfQogCi1jbGFzcyBDb2RlYzJBdWRpb0RlY0NzZElucHV0VGVzdHMKLSAgICA6IHB1YmxpYyBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0QmFzZSwKLSAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJBdWRpb0RlY0NzZElucHV0VGVzdHMgOiBwdWJsaWMgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Q3NkRmx1c2hUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TdHJlYW1JbmRleCA9IDA7CiAgICAgfQogfTsKIApAQCAtODQ4LDI3ICs3NTUsMTcgQEAKICAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29kZWNzIGZvciBmbHVzaCBhdCBkaWZmZXJlbnQgc3RhdGVzIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKLSAgICBpZiAoIXN0cmNtcChtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSkpIHsKLSAgICAgICAgQUxPR1YoIkVNUFRZIElOUFVUIHNSZXNvdXJjZURpci5jX3N0cigpICVzIG1VUkwgICVzICIsIHNSZXNvdXJjZURpci5jX3N0cigpLCBtVVJMKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7Ci0KLSAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IoaW5mbywgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CisgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKG1JbmZvRmlsZSwgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CiAgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZSI7CiAKICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07Ci0gICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICBpZiAobU1pbWUuZmluZCgicmF3IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CiAgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbU1pbWUsIGJpdFN0cmVhbUluZm8pKTsKICAgICB9CiAgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CkBAIC04NzcsMTEgKzc3NCwxMSBAQAogCiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogCiAgICAgYm9vbCBzaWduYWxFT1MgPSBmYWxzZTsKLSAgICBib29sIGZsdXNoQ3NkID0gIXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICBib29sIGZsdXNoQ3NkID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CiAgICAgQUxPR1YoInNlbmRpbmcgJWQgY3NkIGRhdGEgIiwgbnVtQ3Nkcyk7CiAgICAgaW50IGZyYW1lc1RvRGVjb2RlID0gbnVtQ3NkczsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKQEAgLTkzNiw0NSArODMzLDM3IEBACiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOwogfQogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGtUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIC8vIERlY29kZVRlc3Qgd2l0aCBTdHJlYW1JbmRleCBhbmQgRU9TIC8gTm8gRU9TCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrRGVjb2RlVGVzdFBhcmFtZXRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGluZzo6VmFsdWVzSW4oZ0RlY29kZVRlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDc2RJbnB1dHMsIENvZGVjMkF1ZGlvRGVjQ3NkSW5wdXRUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihrQ3NkRmx1c2hUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnQ3NkRmx1c2hUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGtUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIpOwotICAgIGZvciAoYXV0byBwYXJhbXMgOiBrVGVzdFBhcmFtZXRlcnMpIHsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIwIiwgInRydWUiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIxIiwgImZhbHNlIikpOwotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMSIsICJ0cnVlIikpOworICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIGZhbHNlKSk7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIHRydWUpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgZmFsc2UpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMSwgdHJ1ZSkpOwogCi0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiKSk7Ci0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgImZhbHNlIikpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmdzLgotICAgIC8vIFRlc3Qgd2lsbCBmYWlsIHRvIHNldCB1cCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IHNldC4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgJiYgaSA8IGFyZ2MgLSAxKSB7Ci0gICAgICAgICAgICBzUmVzb3VyY2VEaXIgPSBhcmd2W2kgKyAxXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgdHJ1ZSkpOworICAgICAgICBnQ3NkRmx1c2hUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlKSk7CiAgICAgfQogCiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcAppbmRleCBlM2E0ZjY4Li5iZDdlYzBkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKQEAgLTI0LDIyICsyNCwxNyBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxmc3RyZWFtPgogCi0jaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogCi11c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKLQogI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PgotICAgICAgICBrRW5jb2RlVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBFbmNvZGVUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBib29sLCBpbnQzMl90PjsKIAotLy8gUmVzb3VyY2UgZGlyZWN0b3J5Ci1zdGF0aWMgc3RkOjpzdHJpbmcgc1Jlc291cmNlRGlyID0gIiI7CitzdGF0aWMgc3RkOjp2ZWN0b3I8RW5jb2RlVGVzdFBhcmFtZXRlcnM+IGdFbmNvZGVUZXN0UGFyYW1ldGVyczsKIAogY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKICAgcHVibGljOgpAQCAtNDcsNiArNDIsOCBAQAogICAgICAgICA6IEMyQnVmZmVyKHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQogfTsKIAorY29uc3RleHByIHVpbnQzMl90IGtNYXhTYW1wbGVzUGVyRnJhbWUgPSAyNTY7CisKIG5hbWVzcGFjZSB7CiAKIGNsYXNzIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CkBAIC03NSwzMSArNzIsMjUgQEAKICAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CiAgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CiAKLSAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOwotICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7Ci0gICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7Ci0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7Ci0gICAgICAgICAgICAgICAgeyJhYWMiLCBhYWN9LCB7ImZsYWMiLCBmbGFjfSwgeyJvcHVzIiwgb3B1c30sIHsiYW1ybmIiLCBhbXJuYn0sIHsiYW1yd2IiLCBhbXJ3Yn0sCi0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0gc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgQVNTRVJUX0VRKGMyZXJyLCBDMl9PSykgPDwgIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKHF1ZXJpZWQuc2l6ZSgpLCAxKSA8PCAiU2l6ZSBvZiB0aGUgdmVjdG9yIHJldHVybmVkIGlzIGludmFsaWQiOwogCi0gICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtTWltZSA9ICgoQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKICAgICAgICAgbUVvcyA9IGZhbHNlOwogICAgICAgICBtQ3NkID0gZmFsc2U7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1FbmNvZGVyRnJhbWVTaXplID0gMDsKICAgICAgICAgbVdvcmtSZXN1bHQgPSBDMl9PSzsKICAgICAgICAgbU91dHB1dFNpemUgPSAwdTsKLSAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7Ci0gICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOwotICAgICAgICBnZXRJbnB1dE1heEJ1ZlNpemUoKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRNYXhCdWZTaXplKCkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRDaGFubmVsQ291bnQoJm1OdW1DaGFubmVscykpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRTYW1wbGVSYXRlKCZtU2FtcGxlUmF0ZSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRTYW1wbGVzUGVyRnJhbWUobU51bUNoYW5uZWxzLCAmbVNhbXBsZXNQZXJGcmFtZSkpOworCisgICAgICAgIGdldEZpbGUobU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSk7CiAgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewpAQCAtMTEzLDYgKzEwNCwxMiBAQAogICAgIC8vIEdldCB0aGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gR2V0UGFyYW0gY2FsbC4KICAgICB2aXJ0dWFsIHZvaWQgZ2V0UGFyYW1zKCkge30KIAorICAgIHZvaWQgZ2V0Q2hhbm5lbENvdW50KGludDMyX3QqIG5DaGFubmVscyk7CisgICAgdm9pZCBnZXRTYW1wbGVSYXRlKGludDMyX3QqIG5TYW1wbGVSYXRlKTsKKyAgICB2b2lkIGdldFNhbXBsZXNQZXJGcmFtZShpbnQzMl90IG5DaGFubmVscywgaW50MzJfdCogc2FtcGxlc1BlckZyYW1lKTsKKworICAgIHZvaWQgZ2V0RmlsZShpbnQzMl90IGNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKTsKKwogICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgogICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CiAgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKQEAgLTEzMywyNiArMTMwLDE5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgZW51bSBzdGFuZGFyZENvbXAgewotICAgICAgICBhYWMsCi0gICAgICAgIGZsYWMsCi0gICAgICAgIG9wdXMsCi0gICAgICAgIGFtcm5iLAotICAgICAgICBhbXJ3YiwKLSAgICAgICAgdW5rbm93bl9jb21wLAotICAgIH07CiAKKyAgICBzdGQ6OnN0cmluZyBtTWltZTsKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIGJvb2wgbUVvczsKICAgICBib29sIG1Dc2Q7CiAgICAgYm9vbCBtRGlzYWJsZVRlc3Q7Ci0gICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKIAogICAgIGludDMyX3QgbVdvcmtSZXN1bHQ7CiAgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOwogICAgIGludDMyX3QgbUlucHV0TWF4QnVmU2l6ZTsKICAgICB1aW50NjRfdCBtT3V0cHV0U2l6ZTsKKyAgICB1aW50MzJfdCBtRW5jb2RlckZyYW1lU2l6ZTsKICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKIAogICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKQEAgLTE2Nyw2ICsxNTcsMTIgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKIAorICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBtU2FtcGxlc1BlckZyYW1lOworCisgICAgc3RkOjpzdHJpbmcgbUlucHV0RmlsZTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKQEAgLTE3NCwyNyArMTcwLDE4IEBACiAKICAgICAvLyBJbiBlbmNvZGVyIGNvbXBvbmVudHMsIGZldGNoIHRoZSBzaXplIG9mIGlucHV0IGJ1ZmZlciBhbGxvY2F0ZWQKICAgICB2b2lkIGdldElucHV0TWF4QnVmU2l6ZSgpIHsKLSAgICAgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzFdID0gezB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOwogICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0OjpQQVJBTV9UWVBFfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJmluUGFyYW1zKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBpblBhcmFtcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlF1ZXJ5IE1heEJ1ZmZlclNpemVJbmZvIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUlucHV0TWF4QnVmU2l6ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEMyX09LKSA8PCAiUXVlcnkgbWF4IGJ1ZmZlciBzaXplIGluZm8gZmFpbGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGluUGFyYW1zLnNpemUoKSwgMSkgPDwgIlNpemUgb2YgdGhlIHZlY3RvciByZXR1cm5lZCBpcyBpbnZhbGlkIjsKKworICAgICAgICBtSW5wdXRNYXhCdWZTaXplID0gQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ6OkZyb20oaW5QYXJhbXNbMF0uZ2V0KCkpLT52YWx1ZTsKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0yMDIsNyArMTg5LDcgQEAKIH07CiAKIHZvaWQgdmFsaWRhdGVDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGRpc2FibGVUZXN0KSB7CiAgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CiAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOwpAQCAtMjI5LDEzICsyMTYsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCi0gICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgewotICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKLSAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKIH0KIApAQCAtMjUyLDYxICsyMzIsOTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLS8vIEdldCBjb25maWcgcGFyYW1zIGZvciBhIGNvbXBvbmVudAotYm9vbCBnZXRDb25maWdQYXJhbXMoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBpbnQzMl90KiBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBuU2FtcGxlUmF0ZSwgaW50MzJfdCogc2FtcGxlc1BlckZyYW1lKSB7Ci0gICAgc3dpdGNoIChjb21wTmFtZSkgewotICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OmFhYzoKLSAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAyOwotICAgICAgICAgICAgKm5TYW1wbGVSYXRlID0gNDgwMDA7Ci0gICAgICAgICAgICAqc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKK3ZvaWQgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdEJhc2U6OmdldENoYW5uZWxDb3VudChpbnQzMl90KiBuQ2hhbm5lbHMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gY2hhbm5lbENvdW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHZhbGlkVmFsdWVJbmZvcyA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKGNoYW5uZWxDb3VudC5nZXQoKSwgJkMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6dmFsdWUpKX07CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBtQ29tcG9uZW50LT5xdWVyeVN1cHBvcnRlZFZhbHVlcyh2YWxpZFZhbHVlSW5mb3MsIEMyX0RPTlRfQkxPQ0spOworICAgIEFTU0VSVF9FUShjMmVyciwgQzJfT0spIDw8ICJRdWVyeSBjaGFubmVsIGNvdW50IGluZm8gZmFpbGVkIjsKKyAgICBBU1NFUlRfRVEodmFsaWRWYWx1ZUluZm9zLnNpemUoKSwgMSkgPDwgIlNpemUgb2YgdGhlIHZlY3RvciByZXR1cm5lZCBpcyBpbnZhbGlkIjsKKworICAgIC8vIHNldHRpbmcgZGVmYXVsdCB2YWx1ZSBvZiBjaGFubmVsQ291bnQKKyAgICAqbkNoYW5uZWxzID0gMTsKKyAgICBjb25zdCBhdXRvJiBjMkZTViA9IHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXM7CisgICAgc3dpdGNoIChjMkZTVi50eXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpSQU5HRTogeworICAgICAgICAgICAgY29uc3QgYXV0byYgcmFuZ2UgPSBjMkZTVi5yYW5nZTsKKyAgICAgICAgICAgIHVpbnQzMl90IHJtYXggPSAodWludDMyX3QpKHJhbmdlLm1heCkucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgaWYgKHJtYXggPj0gMikgeworICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OmZsYWM6Ci0gICAgICAgICAgICAqbkNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgICpuU2FtcGxlUmF0ZSA9IDQ4MDAwOwotICAgICAgICAgICAgKnNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlZBTFVFUzogeworICAgICAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUmIHByaW0gOiBjMkZTVi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KXByaW0ucmVmPHVpbnQzMl90PigpID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscyA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodWludDMyX3QpcHJpbS5yZWY8dWludDMyX3Q+KCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAqbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpvcHVzOgotICAgICAgICAgICAgKm5DaGFubmVscyA9IDI7Ci0gICAgICAgICAgICAqblNhbXBsZVJhdGUgPSA0ODAwMDsKLSAgICAgICAgICAgICpzYW1wbGVzUGVyRnJhbWUgPSA5NjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjphbXJuYjoKLSAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgKm5TYW1wbGVSYXRlID0gODAwMDsKLSAgICAgICAgICAgICpzYW1wbGVzUGVyRnJhbWUgPSAxNjA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjphbXJ3YjoKLSAgICAgICAgICAgICpuQ2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgKm5TYW1wbGVSYXRlID0gMTYwMDA7Ci0gICAgICAgICAgICAqc2FtcGxlc1BlckZyYW1lID0gMTYwOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiVW5zdXBwb3J0ZWQgdHlwZTogIiA8PCBjMkZTVi50eXBlOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybjsKK30KK3ZvaWQgQ29kZWMyQXVkaW9FbmNIaWRsVGVzdEJhc2U6OmdldFNhbXBsZVJhdGUoaW50MzJfdCogblNhbXBsZVJhdGUpIHsKKyAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc2FtcGxlIHJhdGUgZm9yIG1Db21wb25lbnRzCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgQVNTRVJUX0VRKGMyZXJyLCBDMl9PSykgPDwgIlF1ZXJ5IHNhbXBsZSByYXRlIGluZm8gZmFpbGVkIjsKKyAgICBBU1NFUlRfRVEocXVlcmllZC5zaXplKCksIDEpIDw8ICJTaXplIG9mIHRoZSB2ZWN0b3IgcmV0dXJuZWQgaXMgaW52YWxpZCI7CisKKyAgICAqblNhbXBsZVJhdGUgPSBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKS0+dmFsdWU7CisgICAgcmV0dXJuOwogfQogCi0vLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCi12b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCkgewotICAgIHN0cnVjdCBDb21wVG9VUkwgewotICAgICAgICBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKLSAgICAgICAgY29uc3QgY2hhciogbVVSTDsKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0gewotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YWFjLCAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJuYiwgImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3In0sCi0gICAgICAgICAgICB7Q29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphbXJ3YiwgImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyJ9LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZmxhYywgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAotICAgICAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6b3B1cywgImJiYl9yYXdfMmNoXzQ4a2h6X3MxNmxlLnJhdyJ9LAotICAgIH07Cit2b2lkIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlOjpnZXRTYW1wbGVzUGVyRnJhbWUoaW50MzJfdCBuQ2hhbm5lbHMsIGludDMyX3QqIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJTdHJlYW1BdWRpb0ZyYW1lU2l6ZUluZm86OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKLSAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7Ci0gICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMKTsKKyAgICBpZiAoYzJlcnIgPT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMSkgeworICAgICAgICBtRW5jb2RlckZyYW1lU2l6ZSA9IEMyU3RyZWFtQXVkaW9GcmFtZVNpemVJbmZvOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKS0+dmFsdWU7CisgICAgICAgIGlmIChtRW5jb2RlckZyYW1lU2l6ZSkgeworICAgICAgICAgICAgKnNhbXBsZXNQZXJGcmFtZSA9IG1FbmNvZGVyRnJhbWVTaXplOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQorCisgICAgYzJlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0OjpQQVJBTV9UWVBFfSwgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWVyaWVkKTsKKyAgICBBU1NFUlRfRVEoYzJlcnIsIEMyX09LKSA8PCAiUXVlcnkgbWF4IGJ1ZmZlciBzaXplIGluZm8gZmFpbGVkIjsKKyAgICBBU1NFUlRfRVEocXVlcmllZC5zaXplKCksIDEpIDw8ICJTaXplIG9mIHRoZSB2ZWN0b3IgcmV0dXJuZWQgaXMgaW52YWxpZCI7CisKKyAgICB1aW50MzJfdCBtYXhJbnB1dFNpemUgPSBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dDo6RnJvbShxdWVyaWVkWzBdLmdldCgpKS0+dmFsdWU7CisgICAgKnNhbXBsZXNQZXJGcmFtZSA9IHN0ZDo6bWluKChtYXhJbnB1dFNpemUgLyAobkNoYW5uZWxzICogMikpLCBrTWF4U2FtcGxlc1BlckZyYW1lKTsKKworICAgIHJldHVybjsKK30KKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0QmFzZTo6Z2V0RmlsZShpbnQzMl90IGNoYW5uZWxDb3VudCwgaW50MzJfdCBzYW1wbGVSYXRlKSB7CisgICAgc3RkOjpzdHJpbmcgcmF3SW5wdXQgPSAiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXciOworICAgIGlmIChjaGFubmVsQ291bnQgPT0gMSAmJiBzYW1wbGVSYXRlID09IDE2MDAwKSB7CisgICAgICAgIHJhd0lucHV0ID0gImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyI7CisgICAgfSBlbHNlIGlmIChjaGFubmVsQ291bnQgPT0gMikgeworICAgICAgICByYXdJbnB1dCA9ICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXciOworICAgIH0KKworICAgIG1JbnB1dEZpbGUgPSBzUmVzb3VyY2VEaXIgKyByYXdJbnB1dDsKIH0KIAogdm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKQEAgLTMyMCw5ICszMzEsMTcgQEAKIAogICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOwogICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKLSAgICBpbnQgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CisgICAgdWludDMyX3QgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CiAgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0gKGludCkoKChmbG9hdClzYW1wbGVzUGVyRnJhbWUgLyBuU2FtcGxlUmF0ZSkgKiAxMDAwMDAwKTsKICAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworCisgICAgLy8gZ2V0IGxlbmd0aCBvZiBmaWxlOgorICAgIGludDMyX3QgY3VyclBvcyA9IGVsZVN0cmVhbS50ZWxsZygpOworICAgIGVsZVN0cmVhbS5zZWVrZygwLCBlbGVTdHJlYW0uZW5kKTsKKyAgICB1aW50MzJfdCByZW1haW5pbmdCeXRlcyA9ICh1aW50MzJfdCllbGVTdHJlYW0udGVsbGcoKSAtIGN1cnJQb3M7CisgICAgZWxlU3RyZWFtLnNlZWtnKGN1cnJQb3MsIGVsZVN0cmVhbS5iZWcpOworCisgICAgbkZyYW1lcyA9IHN0ZDo6bWluKG5GcmFtZXMsIHJlbWFpbmluZ0J5dGVzIC8gYnl0ZXNDb3VudCk7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CiAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKQEAgLTM1Niw3ICszNzUsMTIgQEAKICAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CiAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKICAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7Ci0gICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICAvLyBpZiB3ZSBoYXZlIHJlYWNoZWQgYXQgdGhlIGVuZCBvZiBpbnB1dCBzdHJlYW0sIHNpZ25hbCBlb3MKKyAgICAgICAgaWYgKGVsZVN0cmVhbS5nY291bnQoKSA8IGJ5dGVzQ291bnQpIHsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSBlbGVTdHJlYW0uZ2NvdW50KCk7CisgICAgICAgICAgICBpZiAoc2lnbmFsRU9TKSBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOwogICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCiAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKApAQCAtMzk1LDE0ICs0MTksMTIgQEAKIFRFU1RfUChDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKICAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKLSAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbURpc2FibGVUZXN0KTsKICAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7CiB9CiAKLWNsYXNzIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdAotICAgIDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0IDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPEVuY29kZVRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTQxMiw0MCArNDM0LDI5IEBACiBURVNUX1AoQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CiAgICAgQUxPR1YoIkVuY29kZVRlc3QiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7Ci0gICAgYm9vbCBzaWduYWxFT1MgPSAhc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkuY29tcGFyZSgidHJ1ZSIpOwotICAgIC8vIFJhdGlvIHcuci50IHRvIG1JbnB1dE1heEJ1ZlNpemUKLSAgICBpbnQzMl90IGlucHV0TWF4QnVmUmF0aW8gPSBzdGQ6OnN0b2koc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSkpOwotCi0gICAgaW50MzJfdCBuQ2hhbm5lbHM7Ci0gICAgaW50MzJfdCBuU2FtcGxlUmF0ZTsKLSAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZTsKLQotICAgIGlmICghZ2V0Q29uZmlnUGFyYW1zKG1Db21wTmFtZSwgJm5DaGFubmVscywgJm5TYW1wbGVSYXRlLCAmc2FtcGxlc1BlckZyYW1lKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNvbmZpZyBwYXJhbXMgZm9yICIgPDwgbUNvbXBOYW1lIDw8ICIgY29tcG9uZW50XG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwotICAgICAgICByZXR1cm47CisgICAgYm9vbCBzaWduYWxFT1MgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKyAgICAvLyBTZXQgc2FtcGxlcyBwZXIgZnJhbWUgYmFzZWQgb24gaW5wdXRNYXhCdWZSYXRpbyBpZiBjb21wb25lbnQgZG9lcyBub3QKKyAgICAvLyBhZHZlcnRpc2Ugc3VwcG9ydGVkIGZyYW1lIHNpemUKKyAgICBpZiAoIW1FbmNvZGVyRnJhbWVTaXplKSB7CisgICAgICAgIC8vIFJhdGlvIHcuci50IHRvIG1JbnB1dE1heEJ1ZlNpemUKKyAgICAgICAgaW50MzJfdCBpbnB1dE1heEJ1ZlJhdGlvID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAoKG1JbnB1dE1heEJ1ZlNpemUgLyBpbnB1dE1heEJ1ZlJhdGlvKSAvIChtTnVtQ2hhbm5lbHMgKiAyKSk7CiAgICAgfQorICAgIEFMT0dWKCJzaWduYWxFT1MgJWQgbUlucHV0TWF4QnVmU2l6ZSAlZCBtU2FtcGxlc1BlckZyYW1lICVkIiwgc2lnbmFsRU9TLCBtSW5wdXRNYXhCdWZTaXplLAorICAgICAgICAgIG1TYW1wbGVzUGVyRnJhbWUpOwogCi0gICAgc2FtcGxlc1BlckZyYW1lID0gKChtSW5wdXRNYXhCdWZTaXplIC8gaW5wdXRNYXhCdWZSYXRpbykgLyAobkNoYW5uZWxzICogMikpOwotICAgIEFMT0dWKCJzaWduYWxFT1MgJWQgbUlucHV0TWF4QnVmU2l6ZSAlZCBzYW1wbGVzUGVyRnJhbWUgJWQiLCBzaWduYWxFT1MsIG1JbnB1dE1heEJ1ZlNpemUsCi0gICAgICAgICAgc2FtcGxlc1BlckZyYW1lKTsKKyAgICBBU1NFUlRfVFJVRShzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUpKQorICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBjb25maWd1cmUgZm9yIGNoYW5uZWxzOiAiIDw8IG1OdW1DaGFubmVscyA8PCAiIGFuZCBzYW1wbGluZyByYXRlICIKKyAgICAgICAgICAgIDw8IG1TYW1wbGVSYXRlOwogCi0gICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKICAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxNjsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlbmNvZGVORnJhbWVzKAogICAgICAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLAotICAgICAgICAgICAgZWxlU3RyZWFtLCBudW1GcmFtZXMsIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgZmFsc2UsIHNpZ25hbEVPUykpOworICAgICAgICAgICAgZWxlU3RyZWFtLCBudW1GcmFtZXMsIG1TYW1wbGVzUGVyRnJhbWUsIG1OdW1DaGFubmVscywgbVNhbXBsZVJhdGUsIGZhbHNlLCBzaWduYWxFT1MpKTsKIAogICAgIC8vIElmIEVPUyBpcyBub3Qgc2VudCwgc2VuZGluZyBlbXB0eSBpbnB1dCB3aXRoIEVPUyBmbGFnCiAgICAgaWYgKCFzaWduYWxFT1MpIHsKQEAgLTQ2NCwxMSArNDc1LDkgQEAKICAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOwogICAgIH0KLSAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7Ci0gICAgICAgIGlmICghbUNzZCkgewotICAgICAgICAgICAgQUxPR0UoIkNTRCBidWZmZXIgbWlzc2luZyIpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOwotICAgICAgICB9CisgICAgaWYgKChtTWltZS5maW5kKCJmbGFjIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8IChtTWltZS5maW5kKCJvcHVzIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHx8CisgICAgICAgIChtTWltZS5maW5kKCJtcDRhLWxhdG0iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUNzZCkgPDwgIkNTRCBidWZmZXIgbWlzc2luZyI7CiAgICAgfQogICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CkBAIC01MjAsMzEgKzUyOSwxOCBAQAogICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7Ci0KICAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKLSAgICBpbnQzMl90IG5DaGFubmVsczsKLSAgICBpbnQzMl90IG5TYW1wbGVSYXRlOwotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lOwogCi0gICAgaWYgKCFnZXRDb25maWdQYXJhbXMobUNvbXBOYW1lLCAmbkNoYW5uZWxzLCAmblNhbXBsZVJhdGUsICZzYW1wbGVzUGVyRnJhbWUpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY29uZmlnIHBhcmFtcyBmb3IgIiA8PCBtQ29tcE5hbWUgPDwgIiBjb21wb25lbnRcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgQVNTRVJUX1RSVUUoc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKSkKKyAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gY29uZmlndXJlIGZvciBjaGFubmVsczogIiA8PCBtTnVtQ2hhbm5lbHMgPDwgIiBhbmQgc2FtcGxpbmcgcmF0ZSAiCisgICAgICAgICAgICA8PCBtU2FtcGxlUmF0ZTsKIAotICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CiAKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKICAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMzA7CiAgICAgdWludDMyX3QgbnVtRnJhbWVzID0gMTI4OwotICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgZWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CiAgICAgLy8gZmx1c2gKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOwpAQCAtNTUzLDEwICs1NDksOSBAQAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAogICAgICAgICAgICAgdmVyaWZ5Rmx1c2hPdXRwdXQoZmx1c2hlZFdvcmssIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaykpOwogICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgTUFYX0lOUFVUX0JVRkZFUlMpOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzRmx1c2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSwgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSkpOwogICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CiAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOwogICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLApAQCAtNTY2LDggKzU2MSw4IEBACiAgICAgQVNTRVJUX0VRKG1Xb3JrUXVldWUuc2l6ZSgpLCBNQVhfSU5QVVRfQlVGRkVSUyk7CiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLCBzYW1wbGVzUGVyRnJhbWUsIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TYW1wbGVSYXRlLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMgLSBudW1GcmFtZXNGbHVzaGVkLCBtU2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzLCBtU2FtcGxlUmF0ZSwgdHJ1ZSkpOwogICAgIGVsZVN0cmVhbS5jbG9zZSgpOwogICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CiAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOwpAQCAtNTg1LDM0ICs1ODAsMjAgQEAKICAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIGZvciBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudCIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXTsKLSAgICBzdHJjcHkobVVSTCwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOwotCi0gICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07Ci0gICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7Ci0KLSAgICBpbnQzMl90IG5TYW1wbGVSYXRlOwotICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lOwotICAgIGludDMyX3QgbkNoYW5uZWxzOwogICAgIGludDMyX3QgbnVtRnJhbWVzID0gMTY7CiAgICAgaW50MzJfdCBtYXhDaGFubmVsQ291bnQgPSA4OwogCi0gICAgaWYgKCFnZXRDb25maWdQYXJhbXMobUNvbXBOYW1lLCAmbkNoYW5uZWxzLCAmblNhbXBsZVJhdGUsICZzYW1wbGVzUGVyRnJhbWUpKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiRmFpbGVkIHRvIGdldCB0aGUgY29uZmlnIHBhcmFtcyBmb3IgIiA8PCBtQ29tcE5hbWUgPDwgIiBjb21wb25lbnRcbiI7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbUlucHV0RmlsZSA8PCAiIGZpbGUgbm90IGZvdW5kIjsKIAogICAgIHVpbnQ2NF90IHByZXZPdXRwdXRTaXplID0gMHU7CiAgICAgdWludDMyX3QgcHJldkNoYW5uZWxDb3VudCA9IDB1OwogCiAgICAgLy8gTG9vcGluZyB0aHJvdWdoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVsIGNvdW50IHN1cHBvcnRlZCBieSBlbmNvZGVyCi0gICAgZm9yIChuQ2hhbm5lbHMgPSAxOyBuQ2hhbm5lbHMgPCBtYXhDaGFubmVsQ291bnQ7IG5DaGFubmVscysrKSB7Ci0gICAgICAgIEFMT0dWKCJDb25maWd1cmluZyAldSBlbmNvZGVyIGZvciBjaGFubmVsIGNvdW50ID0gJWQiLCBtQ29tcE5hbWUsIG5DaGFubmVscyk7Ci0gICAgICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgeworICAgIGZvciAoaW50MzJfdCBuQ2hhbm5lbHMgPSAxOyBuQ2hhbm5lbHMgPCBtYXhDaGFubmVsQ291bnQ7IG5DaGFubmVscysrKSB7CisgICAgICAgIEFMT0dWKCJDb25maWd1cmluZyBlbmNvZGVyICVzICBmb3IgY2hhbm5lbCBjb3VudCA9ICVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbkNoYW5uZWxzKTsKKyAgICAgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgbVNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC02MjAsMjAgKzYwMSwyMiBAQAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGluUGFyYW1zOwogICAgICAgICBjMl9zdGF0dXNfdCBjMl9zdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmaW5QYXJhbXMpOwotICAgICAgICBBU1NFUlRfVFJVRSghYzJfc3RhdHVzICYmIGluUGFyYW1zLnNpemUoKSkKLSAgICAgICAgICAgICAgICA8PCAiUXVlcnkgY29uZmlndXJlZCBjaGFubmVsQ291bnQgZmFpbGVkID0+ICVkIiA8PCBjMl9zdGF0dXM7CisgICAgICAgIEFTU0VSVF9FUShjMl9zdGF0dXMsIEMyX09LKSA8PCAiUXVlcnkgY2hhbm5lbCBjb3VudCBpbmZvIGZhaWxlZCI7CisgICAgICAgIEFTU0VSVF9FUShpblBhcmFtcy5zaXplKCksIDEpIDw8ICJTaXplIG9mIHRoZSB2ZWN0b3IgcmV0dXJuZWQgaXMgaW52YWxpZCI7CiAKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKLSAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1swXS5nZXQoKTsKLSAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAqKGludDMyX3QqKSgodWludDhfdCopcGFyYW0gKyBvZmZzZXQpOworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ6OkZyb20oaW5QYXJhbXNbMF0uZ2V0KCkpLT52YWx1ZTsKKwogICAgICAgICBpZiAoY2hhbm5lbENvdW50ICE9IG5DaGFubmVscykgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIGZvciBDaGFubmVsQ291bnQgIiA8PCBuQ2hhbm5lbHMgPDwgIlxuIjsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVG8gY2hlY2sgaWYgdGhlIGlucHV0IHN0cmVhbSBpcyBzdWZmaWNpZW50IHRvIGVuY29kZSBmb3IgdGhlIGhpZ2hlciBjaGFubmVsIGNvdW50Ci0gICAgICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IChzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyKSAqIG51bUZyYW1lczsKLSAgICAgICAgaWYgKGVsZVN0cmVhbS5nY291bnQoKSA8IGJ5dGVzQ291bnQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0KG1JbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAobVNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDIpICogbnVtRnJhbWVzOworICAgICAgICBpZiAoZmlsZVNpemUgPCBieXRlc0NvdW50KSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgZm9yIENoYW5uZWxDb3VudCAiIDw8IG5DaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgaW5wdXQgZGF0YVxuIjsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjQzLDcgKzYyNiw3IEBACiAKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBtU2FtcGxlUmF0ZSkpOwogCiAgICAgICAgIC8vIG1EaXNhYmxlVGVzdCB3aWxsIGJlIHNldCBpZiBidWZmZXIgd2FzIG5vdCBmZXRjaGVkIHByb3Blcmx5LgogICAgICAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBjb25maWcgcGFyYW1zIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNjZWVkZWQKQEAgLTY1Nyw5ICs2NDAsNiBAQAogICAgICAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZSBjb25zdW1lZAogICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSk7CiAKLSAgICAgICAgLy8gVmFsaWRhdGUgb3V0cHV0IHNpemUgYmFzZWQgb24gY2hvc2VuIENoYW5uZWxDb3VudAotICAgICAgICBFWFBFQ1RfR0UobU91dHB1dFNpemUsIHByZXZPdXRwdXRTaXplKTsKLQogICAgICAgICBwcmV2Q2hhbm5lbENvdW50ID0gbkNoYW5uZWxzOwogICAgICAgICBwcmV2T3V0cHV0U2l6ZSA9IG1PdXRwdXRTaXplOwogCkBAIC02NjgsMTEgKzY0OCwxNCBAQAogICAgICAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICgobU1pbWUuZmluZCgiZmxhYyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAgICAgKG1NaW1lLmZpbmQoIm9wdXMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgIChtTWltZS5maW5kKCJtcDRhLWxhdG0iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1Dc2QpIDw8ICJDU0QgYnVmZmVyIG1pc3NpbmciOwogICAgICAgICB9CiAgICAgICAgIEFTU0VSVF9UUlVFKG1Fb3MpOwotICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgICAgIC8vIFRPRE8oYi8xNDczNDg3MTEpIFVzZSByZXNldCBpbnN0ZWFkIG9mIHN0b3Agd2hlbiB1c2luZyB0aGUgc2FtZSBpbnN0YW5jZSBvZiBjb2RlYy4KKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKICAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKICAgICAgICAgbU91dHB1dFNpemUgPSAwOwogICAgICAgICBtRW9zID0gZmFsc2U7CkBAIC02ODUsMjUgKzY2OCwxMSBAQAogICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUgZm9yIGRpZmZlcmVudCBTYW1wbGVSYXRlIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCk7Ci0KLSAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKLQotICAgIGludDMyX3QgblNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWU7Ci0gICAgaW50MzJfdCBuQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBudW1GcmFtZXMgPSAxNjsKIAotICAgIGlmICghZ2V0Q29uZmlnUGFyYW1zKG1Db21wTmFtZSwgJm5DaGFubmVscywgJm5TYW1wbGVSYXRlLCAmc2FtcGxlc1BlckZyYW1lKSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNvbmZpZyBwYXJhbXMgZm9yICIgPDwgbUNvbXBOYW1lIDw8ICIgY29tcG9uZW50XG4iOwotICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1JbnB1dEZpbGUgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CiAKICAgICBpbnQzMl90IHNhbXBsZVJhdGVWYWx1ZXNbXSA9IHsxMDAwLCA4MDAwLCAxNjAwMCwgMjQwMDAsIDQ4MDAwLCA5NjAwMCwgMTkyMDAwfTsKIApAQCAtNzExLDggKzY4MCw4IEBACiAgICAgdWludDMyX3QgcHJldlNhbXBsZVJhdGUgPSAwdTsKIAogICAgIGZvciAoaW50MzJfdCBuU2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGVWYWx1ZXMpIHsKLSAgICAgICAgQUxPR1YoIkNvbmZpZ3VyaW5nICV1IGVuY29kZXIgZm9yIFNhbXBsZVJhdGUgPSAlZCIsIG1Db21wTmFtZSwgblNhbXBsZVJhdGUpOwotICAgICAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIkNvbmZpZ3VyaW5nIGVuY29kZXIgJXMgIGZvciBTYW1wbGVSYXRlID0gJWQiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBuU2FtcGxlUmF0ZSk7CisgICAgICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBtTnVtQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSkgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNzIwLDIxICs2ODksMjIgQEAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKICAgICAgICAgYzJfc3RhdHVzX3QgYzJfc3RhdHVzID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZpblBhcmFtcyk7CisgICAgICAgIEFTU0VSVF9FUShjMl9zdGF0dXMsIEMyX09LKSA8PCAiUXVlcnkgc2FtcGxlIHJhdGUgaW5mbyBmYWlsZWQiOworICAgICAgICBBU1NFUlRfRVEoaW5QYXJhbXMuc2l6ZSgpLCAxKSA8PCAiU2l6ZSBvZiB0aGUgdmVjdG9yIHJldHVybmVkIGlzIGludmFsaWQiOwogCi0gICAgICAgIEFTU0VSVF9UUlVFKCFjMl9zdGF0dXMgJiYgaW5QYXJhbXMuc2l6ZSgpKQotICAgICAgICAgICAgICAgIDw8ICJRdWVyeSBjb25maWd1cmVkIFNhbXBsZVJhdGUgZmFpbGVkID0+ICVkIiA8PCBjMl9zdGF0dXM7Ci0gICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7Ci0gICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbMF0uZ2V0KCk7Ci0gICAgICAgIGludDMyX3QgY29uZmlndXJlZFNhbXBsZVJhdGUgPSAqKGludDMyX3QqKSgodWludDhfdCopcGFyYW0gKyBvZmZzZXQpOwotCisgICAgICAgIGludDMyX3QgY29uZmlndXJlZFNhbXBsZVJhdGUgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0OjpGcm9tKGluUGFyYW1zWzBdLmdldCgpKS0+dmFsdWU7CiAgICAgICAgIGlmIChjb25maWd1cmVkU2FtcGxlUmF0ZSAhPSBuU2FtcGxlUmF0ZSkgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIGZvciBTYW1wbGVSYXRlICIgPDwgblNhbXBsZVJhdGUgPDwgIlxuIjsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVG8gY2hlY2sgaWYgdGhlIGlucHV0IHN0cmVhbSBpcyBzdWZmaWNpZW50IHRvIGVuY29kZSBmb3IgdGhlIGhpZ2hlciBTYW1wbGVSYXRlCi0gICAgICAgIGludDMyX3QgYnl0ZXNDb3VudCA9IChzYW1wbGVzUGVyRnJhbWUgKiBuQ2hhbm5lbHMgKiAyKSAqIG51bUZyYW1lczsKLSAgICAgICAgaWYgKGVsZVN0cmVhbS5nY291bnQoKSA8IGJ5dGVzQ291bnQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0KG1JbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAobVNhbXBsZXNQZXJGcmFtZSAqIG1OdW1DaGFubmVscyAqIDIpICogbnVtRnJhbWVzOworICAgICAgICBpZiAoZmlsZVNpemUgPCBieXRlc0NvdW50KSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgZm9yIFNhbXBsZVJhdGUgIiA8PCBuU2FtcGxlUmF0ZQogICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYmVjYXVzZSBvZiBpbnN1ZmZpY2llbnQgaW5wdXQgZGF0YVxuIjsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNzQ0LDcgKzcxNCw3IEBACiAKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSwgbU51bUNoYW5uZWxzLCBuU2FtcGxlUmF0ZSkpOwogCiAgICAgICAgIC8vIG1EaXNhYmxlVGVzdCB3aWxsIGJlIHNldCBpZiBidWZmZXIgd2FzIG5vdCBmZXRjaGVkIHByb3Blcmx5LgogICAgICAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiBjb25maWcgcGFyYW1zIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNjZWVkZWQKQEAgLTc1OCwxMiArNzI4LDYgQEAKICAgICAgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUgY29uc3VtZWQKICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpOwogCi0gICAgICAgIC8vIFZhbGlkYXRlIG91dHB1dCBzaXplIGJhc2VkIG9uIGNob3NlbiBzYW1wbGVyYXRlCi0gICAgICAgIGlmIChwcmV2U2FtcGxlUmF0ZSA+PSBuU2FtcGxlUmF0ZSkgewotICAgICAgICAgICAgRVhQRUNUX0xFKG1PdXRwdXRTaXplLCBwcmV2T3V0cHV0U2l6ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFWFBFQ1RfR1QobU91dHB1dFNpemUsIHByZXZPdXRwdXRTaXplKTsKLSAgICAgICAgfQogICAgICAgICBwcmV2U2FtcGxlUmF0ZSA9IG5TYW1wbGVSYXRlOwogICAgICAgICBwcmV2T3V0cHV0U2l6ZSA9IG1PdXRwdXRTaXplOwogCkBAIC03NzIsMTEgKzczNiwxNCBAQAogICAgICAgICAgICAgQUxPR0UoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAldSIsIG1GcmFtZXNSZWNlaXZlZCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKG1Db21wTmFtZSA9PSBmbGFjIHx8IG1Db21wTmFtZSA9PSBvcHVzIHx8IG1Db21wTmFtZSA9PSBhYWMpKSB7CisgICAgICAgIGlmICgobU1pbWUuZmluZCgiZmxhYyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fAorICAgICAgICAgICAgKG1NaW1lLmZpbmQoIm9wdXMiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgIChtTWltZS5maW5kKCJtcDRhLWxhdG0iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpIHsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1Dc2QpIDw8ICJDU0QgYnVmZmVyIG1pc3NpbmciOwogICAgICAgICB9CiAgICAgICAgIEFTU0VSVF9UUlVFKG1Fb3MpOwotICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgICAgIC8vIFRPRE8oYi8xNDczNDg3MTEpIFVzZSByZXNldCBpbnN0ZWFkIG9mIHN0b3Agd2hlbiB1c2luZyB0aGUgc2FtZSBpbnN0YW5jZSBvZiBjb2RlYy4KKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKICAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKICAgICAgICAgbU91dHB1dFNpemUgPSAwOwogICAgICAgICBtRW9zID0gZmFsc2U7CkBAIC03ODUsMzcgKzc1MiwyOSBAQAogICAgIH0KIH0KIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB0ZXN0aW5nOjpWYWx1ZXNJbihrVGVzdFBhcmFtZXRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGdUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiAvLyBFbmNvZGVUZXN0IHdpdGggRU9TIC8gTm8gRU9TIGFuZCBpbnB1dE1heEJ1ZlJhdGlvCiAvLyBpbnB1dE1heEJ1ZlJhdGlvIGlzIHJhdGlvIHcuci50LiB0byBtSW5wdXRNYXhCdWZTaXplCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRW5jb2RlVGVzdCwgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtFbmNvZGVUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnRW5jb2RlVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBrVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKLSAgICBmb3IgKGF1dG8gcGFyYW1zIDoga1Rlc3RQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGtFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICJmYWxzZSIsICIxIikpOwotICAgICAgICBrRW5jb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiZmFsc2UiLCAiMiIpKTsKLSAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiLCAiMSIpKTsKLSAgICAgICAga0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiLCAiMiIpKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBiYXNlZCBvbiBjb21tYW5kIGxpbmUgYXJncy4KLSAgICAvLyBUZXN0IHdpbGwgZmFpbCB0byBzZXQgdXAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBzZXQuCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICYmIGkgPCBhcmdjIC0gMSkgewotICAgICAgICAgICAgc1Jlc291cmNlRGlyID0gYXJndltpICsgMV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlLCAxKSk7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlLCAyKSk7CisgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIHRydWUsIDEpKTsKKyAgICAgICAgZ0VuY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgdHJ1ZSwgMikpOwogICAgIH0KIAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IGY5ZWM1YWUuLjQxMDZiZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCiAgICAgZGVmYXVsdHM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCmluZGV4IDAyNTFlYzIuLjFmMTY4MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcApAQCAtMjIsNiArMjIsNDggQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgogCitzdGQ6OnN0cmluZyBzUmVzb3VyY2VEaXIgPSAiIjsKKworc3RkOjpzdHJpbmcgc0NvbXBvbmVudE5hbWVQcmVmaXggPSAiIjsKKworc3RhdGljIGNvbnN0ZXhwciBzdHJ1Y3Qgb3B0aW9uIGtBcmdPcHRpb25zW10gPSB7CisgICAgICAgIHsicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sCisgICAgICAgIHsicHJlZml4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJ30sCisgICAgICAgIHsiaGVscCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnaCd9LAorICAgICAgICB7bnVsbHB0ciwgMCwgbnVsbHB0ciwgMH0sCit9OworCit2b2lkIHByaW50VXNhZ2UoY2hhciogbWUpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIlZUUyB0ZXN0cyB0byB0ZXN0IGNvZGVjMiBjb21wb25lbnRzIFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlVzYWdlOiAiIDw8IG1lIDw8ICIgW29wdGlvbnNdIFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlx0IC1QLCAgLS1yZXM6ICAgIE1hbmRhdG9yeSBwYXRoIHRvIGEgZm9sZGVyIHRoYXQgY29udGFpbnMgdGVzdCByZXNvdXJjZXMgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgLXAsICAtLXByZWZpeDogT3B0aW9uYWwgcHJlZml4IHRvIHNlbGVjdCBjb21wb25lbnQvcyB0byBiZSB0ZXN0ZWQgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgICAgICAgICAgICAgICAgICAgIEFsbCBjb2RlY3MgYXJlIHRlc3RlZCBieSBkZWZhdWx0IFxuIjsKKyAgICBzdGQ6OmNlcnIgPDwgIlx0ICAgICAgICAgICAgICAgICAgICBFZzogYzIuYW5kcm9pZCAtIHRlc3QgY29kZWNzIHN0YXJ0aW5nIHdpdGggYzIuYW5kcm9pZCBcbiI7CisgICAgc3RkOjpjZXJyIDw8ICJcdCAgICAgICAgICAgICAgICAgICAgRWc6IGMyLmFuZHJvaWQuYWFjLmRlY29kZXIgLSB0ZXN0IGEgc3BlY2lmaWMgY29kZWMgXG4iOworICAgIHN0ZDo6Y2VyciA8PCAiXHQgLWgsICAtLWhlbHA6ICAgUHJpbnQgdXNhZ2UgXG4iOworfQorCit2b2lkIHBhcnNlQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpbnQgYXJnOworICAgIGludCBvcHRpb25faW5kZXg7CisgICAgd2hpbGUgKChhcmcgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiOlA6cDpoIiwga0FyZ09wdGlvbnMsICZvcHRpb25faW5kZXgpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2ggKGFyZykgeworICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgc1Jlc291cmNlRGlyID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICAgICAgc0NvbXBvbmVudE5hbWVQcmVmaXggPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gVGVzdCB0aGUgY29kZWNzIGZvciBOdWxsQnVmZmVyLCBFbXB0eSBJbnB1dCBCdWZmZXIgd2l0aChvdXQpIGZsYWdzIHNldAogdm9pZCB0ZXN0SW5wdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCkBAIC05Miw4ICsxMzQsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKICAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCogY3NkQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0KikocGFyYW0pOworICAgICAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQqIGNzZEJ1ZmZlciA9IChDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0KikocGFyYW0pOwogICAgICAgICAgICAgICAgIHNpemVfdCBjc2RTaXplID0gY3NkQnVmZmVyLT5mbGV4Q291bnQoKTsKICAgICAgICAgICAgICAgICBpZiAoY3NkU2l6ZSA+IDApIGNzZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CkBAIC0xMTgsOCArMTU5LDcgQEAKICAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKICAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKICAgICAgICAgICAgIHdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKLSAgICAgICAgICAgIGlmICghZmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgotICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gZmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYgKGZyYW1lSW5kZXhJdCAhPSBmbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKICAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOwpAQCAtMTM2LDE1ICsxNzYsMTUgQEAKIH0KIAogLy8gUmV0dXJuIGFsbCB0ZXN0IHBhcmFtZXRlcnMsIGEgbGlzdCBvZiB0dXBsZSBvZiA8aW5zdGFuY2UsIGNvbXBvbmVudD4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKCkgeworY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcmFtZXRlcnM+JiBnZXRUZXN0UGFyYW1ldGVycygpIHsKICAgICByZXR1cm4gZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUiwgQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOwogfQogCiAvLyBSZXR1cm4gYWxsIHRlc3QgcGFyYW1ldGVycywgYSBsaXN0IG9mIHR1cGxlIG9mIDxpbnN0YW5jZSwgY29tcG9uZW50PiB3aXRoIG1hdGNoaW5nIGRvbWFpbiBhbmQKIC8vIGtpbmQuCi1jb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+JiBnZXRUZXN0UGFyYW1ldGVycygKLSAgICAgICAgQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kKSB7Ci0gICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcGFyYW1ldGVyczsKK2NvbnN0IHN0ZDo6dmVjdG9yPFRlc3RQYXJhbWV0ZXJzPiYgZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OmRvbWFpbl90IGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPFRlc3RQYXJhbWV0ZXJzPiBwYXJhbWV0ZXJzOwogCiAgICAgYXV0byBpbnN0YW5jZXMgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkdldFNlcnZpY2VOYW1lcygpOwogICAgIGZvciAoc3RkOjpzdHJpbmcgaW5zdGFuY2UgOiBpbnN0YW5jZXMpIHsKQEAgLTE1NywxMSArMTk3LDE4IEBACiAgICAgICAgICAgICAgICAgKHRyYWl0cy5kb21haW4gIT0gZG9tYWluIHx8IHRyYWl0cy5raW5kICE9IGtpbmQpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGlmICh0cmFpdHMubmFtZS5yZmluZChzQ29tcG9uZW50TmFtZVByZWZpeCwgMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJTa2lwcGluZyB0ZXN0cyBmb3IgJXMuIFByZWZpeCBzcGVjaWZpZWQgaXMgJXMiLCB0cmFpdHMubmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgIHNDb21wb25lbnROYW1lUHJlZml4LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGluc3RhbmNlLCB0cmFpdHMubmFtZSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHBhcmFtZXRlcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gdGVzdCBwYXJhbWV0ZXJzIGFkZGVkLiBWZXJpZnkgY29tcG9uZW50IHByZWZpeCBwYXNzZWQgdG8gdGhlIHRlc3QiKTsKKyAgICB9CiAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKaW5kZXggNTBlM2FjNS4uMjIyMmFhZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTQwLDcgKzQwLDE0IEBACiAKIHVzaW5nIG5hbWVzcGFjZSA6OnN0ZDo6Y2hyb25vOwogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBrVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKK3N0YXRpYyBzdGQ6OnZlY3RvcjxUZXN0UGFyYW1ldGVycz4gZ1Rlc3RQYXJhbWV0ZXJzOworCisvLyBSZXNvdXJjZSBkaXJlY3RvcnkKK2V4dGVybiBzdGQ6OnN0cmluZyBzUmVzb3VyY2VEaXI7CisKKy8vIENvbXBvbmVudCBuYW1lIHByZWZpeAorZXh0ZXJuIHN0ZDo6c3RyaW5nIHNDb21wb25lbnROYW1lUHJlZml4OwogCiBzdHJ1Y3QgRnJhbWVJbmZvIHsKICAgICBpbnQgYnl0ZXNDb3VudDsKQEAgLTQ4LDYgKzU1LDE4IEBACiAgICAgaW50NjRfdCB0aW1lc3RhbXA7CiB9OwogCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVD4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nKAorICAgICAgICBjb25zdCB0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPHN0ZDo6dHVwbGU8VC4uLj4+JiBpbmZvKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3RkOjphcHBseShbJnNzXShhdXRvJiYuLi4gZWxlbXMpIHsgKChzcyA8PCBlbGVtcyA8PCAnXycpLCAuLi4pOyB9LCBpbmZvLnBhcmFtKTsKKyAgICBzcyA8PCBpbmZvLmluZGV4OworICAgIHN0ZDo6c3RyaW5nIHBhcmFtX3N0cmluZyA9IHNzLnN0cigpOworICAgIGF1dG8gaXNOb3RBbHBoYU51bSA9IFtdKGNoYXIgYykgeyByZXR1cm4gIXN0ZDo6aXNhbG51bShjKTsgfTsKKyAgICBzdGQ6OnJlcGxhY2VfaWYocGFyYW1fc3RyaW5nLmJlZ2luKCksIHBhcmFtX3N0cmluZy5lbmQoKSwgaXNOb3RBbHBoYU51bSwgJ18nKTsKKyAgICByZXR1cm4gcGFyYW1fc3RyaW5nOworfQorCiAvKgogICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lKCksIG9uVHJpcHBlZCgpLAogICogb25FcnJvcigpLCBvbkRlYXRoKCksIG9uRnJhbWVzUmVuZGVyZWQoKQpAQCAtMTA1LDEzICsxMjQsMTUgQEAKICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gY2FsbEJhY2s7CiB9OwogCit2b2lkIHBhcnNlQXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworCiAvLyBSZXR1cm4gYWxsIHRlc3QgcGFyYW1ldGVycywgYSBsaXN0IG9mIHR1cGxlIG9mIDxpbnN0YW5jZSwgY29tcG9uZW50Pi4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKCk7Citjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UGFyYW1ldGVycz4mIGdldFRlc3RQYXJhbWV0ZXJzKCk7CiAKIC8vIFJldHVybiBhbGwgdGVzdCBwYXJhbWV0ZXJzLCBhIGxpc3Qgb2YgdHVwbGUgb2YgPGluc3RhbmNlLCBjb21wb25lbnQ+IHdpdGggbWF0Y2hpbmcgZG9tYWluIGFuZAogLy8ga2luZC4KLWNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4mIGdldFRlc3RQYXJhbWV0ZXJzKAotICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLCBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQpOworY29uc3Qgc3RkOjp2ZWN0b3I8VGVzdFBhcmFtZXRlcnM+JiBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6a2luZF90IGtpbmQpOwogCiAvKgogICogY29tbW9uIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvQW5kcm9pZC5icAppbmRleCA3ZWM2NGVlLi5jYzAxOWRhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IiwKICAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCiAgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0LmNwcAppbmRleCA2MTIyMjI1Li5mZmVjODk3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC01Myw5ICs1Myw4IEBACiAgICAgfQogCiBuYW1lc3BhY2UgewotCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzOwordXNpbmcgSW5wdXRUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aW50MzJfdCwgYm9vbD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8SW5wdXRUZXN0UGFyYW1ldGVycz4gZ0lucHV0VGVzdFBhcmFtZXRlcnM7CiAKIC8vIGdvb2dsZS5jb2RlYzIgQ29tcG9uZW50IHRlc3Qgc2V0dXAKIGNsYXNzIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0QmFzZSA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewpAQCAtMTIwLDkgKzExOSw4IEBACiAgICAgfQogfTsKIAotY2xhc3MgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QKLSAgICA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0zMTcsMTAgKzMxNSw4IEBACiAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOwogfQogCi1jbGFzcyBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzCi0gICAgOiBwdWJsaWMgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPAotICAgICAgICAgICAgICBzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4geworY2xhc3MgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJDb21wb25lbnRIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPElucHV0VGVzdFBhcmFtZXRlcnM+IHsKICAgICB2b2lkIGdldFBhcmFtcygpIHsKICAgICAgICAgbUluc3RhbmNlTmFtZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwpAQCAtMzMwLDggKzMyNiw4IEBACiBURVNUX1AoQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgSW5wdXRCdWZmZXJUZXN0KSB7CiAgICAgZGVzY3JpcHRpb24oIlRlc3RzIGZvciBkaWZmZXJlbnQgaW5wdXRzIik7CiAKLSAgICB1aW50MzJfdCBmbGFncyA9IHN0ZDo6c3RvdWwoc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkpOwotICAgIGJvb2wgaXNOdWxsQnVmZmVyID0gIXN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICB1aW50MzJfdCBmbGFncyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGJvb2wgaXNOdWxsQnVmZmVyID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CiAgICAgaWYgKGlzTnVsbEJ1ZmZlcikKICAgICAgICAgQUxPR0QoIlRlc3RpbmcgZm9yIG51bGwgaW5wdXQgYnVmZmVyIHdpdGggZmxhZyA6ICV1IiwgZmxhZ3MpOwogICAgIGVsc2UKQEAgLTM0OSwzMiArMzQ1LDI5IEBACiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKIH0KIAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oa1Rlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZElucHV0cywgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtJbnB1dFRlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnSW5wdXRUZXN0UGFyYW1ldGVycyksIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgd29yaywKIC8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHN0YXRlcwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAga1Rlc3RQYXJhbWV0ZXJzID0gZ2V0VGVzdFBhcmFtZXRlcnMoKTsKLSAgICBmb3IgKGF1dG8gcGFyYW1zIDoga1Rlc3RQYXJhbWV0ZXJzKSB7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAidHJ1ZSIpKTsKLSAgICAgICAga0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSwgInRydWUiKSk7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtJbnB1dFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSwgImZhbHNlIikpOwotICAgICAgICBrSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pLCAiZmFsc2UiKSk7CisgICAgcGFyc2VBcmdzKGFyZ2MsIGFyZ3YpOworICAgIGdUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKCk7CisgICAgZm9yIChhdXRvIHBhcmFtcyA6IGdUZXN0UGFyYW1ldGVycykgeworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIHRydWUpKTsKKyAgICAgICAgZ0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIHRydWUpKTsKKyAgICAgICAgZ0lucHV0VGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAwLCBmYWxzZSkpOworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHLCBmYWxzZSkpOworICAgICAgICBnSW5wdXRUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgZmFsc2UpKTsKICAgICB9CiAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvQW5kcm9pZC5icAppbmRleCA1M2UzMjNlLi40MGY1MjAxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0IiwKICAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCiAgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIl0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9tYXN0ZXIvVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRNYXN0ZXJUZXN0LmNwcAppbmRleCBmYjFjMjkxLi40N2NlZWQ1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCkBAIC03Myw5ICs3MywxMCBAQAogICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKIAogICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbXBvbmVudCBmcm9tIGFsbCBrbm93biBzZXJ2aWNlcwotICAgICAgICAgICAgY29tcG9uZW50ID0KLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudC0+Q3JlYXRlQ29tcG9uZW50QnlOYW1lKGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwgJm1DbGllbnQpOwotICAgICAgICAgICAgQVNTRVJUX05FKGNvbXBvbmVudCwgbnVsbHB0cikKKyAgICAgICAgICAgIGNvbnN0IGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwgJmNvbXBvbmVudCwgJm1DbGllbnQpOworICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQzJfT0spCiAgICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIiA8PCBsaXN0VHJhaXRzW2ldLm5hbWUuY19zdHIoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKaW5kZXggYzdiMGMxMi4uZWNjNGY5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCIsCiAgICAgc3RlbTogInZ0c19tZWRpYV9jMl92MV8wX3ZpZGVvX2RlY190ZXN0IiwKQEAgLTI3LDYgKzM2LDggQEAKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJ1aSIsCiAgICAgXSwKICAgICBkYXRhOiBbIjptZWRpYV9jMl92MV92aWRlb19kZWNvZGVfcmVzIl0sCiAgICAgdGVzdF9jb25maWc6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC54bWwiLApAQCAtNDAsNCArNTEsMyBAQAogICAgIGRhdGE6IFsiOm1lZGlhX2MyX3YxX3ZpZGVvX2VuY29kZV9yZXMiXSwKICAgICB0ZXN0X2NvbmZpZzogIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LnhtbCIsCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwCmluZGV4IDEyZWQ3MjUuLjY3ODczZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KIAotI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkNvbmZpZy5oPgpAQCAtMzQsMTkgKzMzLDU3IEBACiAjaW5jbHVkZSA8Z3VpL0lDb25zdW1lckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi11c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKyNpbmNsdWRlIDxndWkvR0xDb25zdW1lci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgogCiAjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgogI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PgotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnM7Citjb25zdGV4cHIgc2l6ZV90IGtTbW9vdGhuZXNzRmFjdG9yID0gNDsKK2NvbnN0ZXhwciBzaXplX3Qga1JlbmRlcmluZ0RlcHRoID0gMzsKK2VudW0gc3VyZmFjZU1vZGVfdCB7IE5PX1NVUkZBQ0UsIE5VTExfU1VSRkFDRSwgU1VSRkFDRSB9OwogCi1zdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4ga0NzZEZsdXNoVGVzdFBhcmFtZXRlcnM7Cit1c2luZyBEZWNvZGVUZXN0UGFyYW1ldGVycyA9IHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCB1aW50MzJfdCwgYm9vbCwgc3VyZmFjZU1vZGVfdD47CitzdGF0aWMgc3RkOjp2ZWN0b3I8RGVjb2RlVGVzdFBhcmFtZXRlcnM+IGdEZWNvZGVUZXN0UGFyYW1ldGVyczsKIAotLy8gUmVzb3VyY2UgZGlyZWN0b3J5Ci1zdGF0aWMgc3RkOjpzdHJpbmcgc1Jlc291cmNlRGlyID0gIiI7Cit1c2luZyBDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGJvb2w+Oworc3RhdGljIHN0ZDo6dmVjdG9yPENzZEZsdXNoVGVzdFBhcmFtZXRlcnM+IGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzOworCitzdHJ1Y3QgQ29tcFRvRmlsZXMgeworICAgIHN0ZDo6c3RyaW5nIG1pbWU7CisgICAgc3RkOjpzdHJpbmcgaW5wdXRGaWxlOworICAgIHN0ZDo6c3RyaW5nIGluZm9GaWxlOworICAgIHN0ZDo6c3RyaW5nIGNoa3N1bUZpbGU7Cit9Oworc3RkOjp2ZWN0b3I8Q29tcFRvRmlsZXM+IGdDb21wVG9GaWxlcyA9IHsKKyAgICAgICAgeyJhdmMiLCAiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCIsICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwc19jaGtzdW0ubWQ1In0sCisgICAgICAgIHsiYXZjIiwgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQiLCAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyIsCisgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHNfY2hrc3VtLm1kNSJ9LAorICAgICAgICB7ImhldmMiLCAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLCAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwc19jaGtzdW0ubWQ1In0sCisgICAgICAgIHsiaGV2YyIsICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMiLCAiYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIiwKKyAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzX2Noa3N1bS5tZDUifSwKKyAgICAgICAgeyJtcGVnMiIsICJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsICJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLAorICAgICAgICAgIiJ9LAorICAgICAgICB7Im1wZWcyIiwgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiIsICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIiwgIiJ9LAorICAgICAgICB7IjNncHAiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8iLCAiIn0sCisgICAgICAgIHsibXA0di1lcyIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8iLAorICAgICAgICAgIiJ9LAorICAgICAgICB7Ingtdm5kLm9uMi52cDgiLCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgIiJ9LAorICAgICAgICB7Ingtdm5kLm9uMi52cDgiLCAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCIsICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyIsCisgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzX2Noa3NtLm1kNSJ9LAorICAgICAgICB7Ingtdm5kLm9uMi52cDkiLCAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgIiJ9LAorICAgICAgICB7Ingtdm5kLm9uMi52cDkiLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSIsCisgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8iLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzX2Noa3NtLm1kNSJ9LAorICAgICAgICB7Ingtdm5kLm9uMi52cDkiLCAiYmJiX3ZwOV83MDR4NDgwXzI4MGticHNfMjRmcHNfYWx0cmVmXzIudnA5IiwKKyAgICAgICAgICJiYmJfdnA5XzcwNHg0ODBfMjgwa2Jwc18yNGZwc19hbHRyZWZfMi5pbmZvIiwgIiJ9LAorICAgICAgICB7ImF2MDEiLCAiYmJiX2F2MV82NDBfMzYwLmF2MSIsICJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsICJiYmJfYXYxXzY0MF8zNjBfY2hrc3VtLm1kNSJ9LAorICAgICAgICB7ImF2MDEiLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsICJiYmJfYXYxXzE3Nl8xNDRfY2hrc20ubWQ1In0sCit9OwogCiBjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgewogICBwdWJsaWM6CkBAIC02NCw4ICsxMDEsOCBAQAogICAgIC8vIGdvb2dsZS5jb2RlYzIgVmlkZW8gdGVzdCBzZXR1cAogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKICAgICAgICAgZ2V0UGFyYW1zKCk7CisKICAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7Ci0gICAgICAgIEFMT0dWKCJDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IFNldFVwIik7CiAgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICAgICAgICAgIG1JbnN0YW5jZU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAhYm9vbChhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0IiwgdHJ1ZSkpKTsKQEAgLTg1LDI2ICsxMjIsMTMgQEAKICAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CiAgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CiAKLSAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOwotICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7Ci0gICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7Ci0gICAgICAgIH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEFTU0VSVF9FUShjMmVyciwgQzJfT0spIDw8ICJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCI7CisgICAgICAgIEFTU0VSVF9FUShxdWVyaWVkLnNpemUoKSwgMSkgPDwgIlNpemUgb2YgdGhlIHZlY3RvciByZXR1cm5lZCBpcyBpbnZhbGlkIjsKIAotICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0gewotICAgICAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzIiLCBtcGVnMn0sIHsibXBlZzQiLCBtcGVnNH0sCi0gICAgICAgICAgICAgICAgeyJoZXZjIiwgaGV2Y30sIHsidnA4IiwgdnA4fSwgeyJ2cDkiLCB2cDl9LCAgICAgeyJhdjEiLCBhdjF9LAotICAgICAgICB9OwotCi0gICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0gc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOwotCi0gICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBtTWltZSA9ICgoQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOwogICAgICAgICBtRW9zID0gZmFsc2U7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CiAgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OwpAQCAtMTE0LDE0ICsxMzgsMjMgQEAKICAgICAgICAgbU1kNU9mZnNldCA9IDA7CiAgICAgICAgIG1NZDVFbmFibGUgPSBmYWxzZTsKICAgICAgICAgbVJlZk1kNSA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOwogCiAgICAgICAgIEMyU2VjdXJlTW9kZVR1bmluZyBzZWN1cmVNb2RlVHVuaW5ne307CiAgICAgICAgIG1Db21wb25lbnQtPnF1ZXJ5KHsmc2VjdXJlTW9kZVR1bmluZ30sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOwotICAgICAgICBpZiAoc2VjdXJlTW9kZVR1bmluZy52YWx1ZSA9PSBDMkNvbmZpZzo6U01fUkVBRF9QUk9URUNURUQpIHsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEIHx8CisgICAgICAgICAgICBzZWN1cmVNb2RlVHVuaW5nLnZhbHVlID09IEMyQ29uZmlnOjpTTV9SRUFEX1BST1RFQ1RFRF9XSVRIX0VOQ1JZUFRFRCkgewogICAgICAgICAgICAgbURpc2FibGVUZXN0ID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGJvb2wgdmFsaWQgPSBnZXRGaWxlTmFtZXMobVN0cmVhbUluZGV4KTsKKyAgICAgICAgaWYgKCF2YWxpZCkgeworICAgICAgICAgICAgR1RFU1RfU0tJUCgpIDw8ICJObyB0ZXN0IGZpbGUgZm9yICBtaW1lICIgPDwgbU1pbWUgPDwgIiBpbmRleDogIiA8PCBtU3RyZWFtSW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIm1TdHJlYW1JbmRleCA6ICV6dSIsIG1TdHJlYW1JbmRleCk7CisgICAgICAgIEFMT0dWKCJtSW5wdXRGaWxlIDogJXMiLCBtSW5wdXRGaWxlLmNfc3RyKCkpOworICAgICAgICBBTE9HVigibUluZm9GaWxlIDogJXMiLCBtSW5mb0ZpbGUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJtQ2hrc3VtRmlsZSA6ICVzIiwgbUNoa3N1bUZpbGUuY19zdHIoKSk7CisKICAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CiAgICAgfQogCkBAIC0xMzYsNiArMTY5LDggQEAKICAgICAvLyBHZXQgdGhlIHRlc3QgcGFyYW1ldGVycyBmcm9tIEdldFBhcmFtIGNhbGwuCiAgICAgdmlydHVhbCB2b2lkIGdldFBhcmFtcygpIHt9CiAKKyAgICBib29sIGdldEZpbGVOYW1lcyhzaXplX3Qgc3RyZWFtSW5kZXggPSAwKTsKKwogICAgIC8qIENhbGN1bGF0ZSB0aGUgQ0tTVU0gZm9yIHRoZSBkYXRhIGluIGluYnVmICovCiAgICAgdm9pZCBjYWxjX21kNV9ja3N1bSh1aW50OF90KiBwdTFfaW5idWYsIHVpbnQzMl90IHU0X3N0cmlkZSwgdWludDMyX3QgdTRfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1NF9oZWlnaHQsIHVpbnQ4X3QqIHB1MV9ja3N1bV9wKSB7CkBAIC0yMjAsOCArMjU1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVvcmRlckRlcHRoIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckJ1ZmZlckRlcHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudC0+cXVlcnkoeyZyZW9yZGVyQnVmZmVyRGVwdGh9LCB7fSwgQzJfTUFZX0JMT0NLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnJlb3JkZXJCdWZmZXJEZXB0aH0sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJEZXB0aCA9IHJlb3JkZXJCdWZmZXJEZXB0aC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVvcmRlckRlcHRoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFkZCB2YWxpZGF0aW9uIGZvciByZW9yZGVyZWQgb3V0cHV0CkBAIC0yNjcsMTggKzMwMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlbnVtIHN0YW5kYXJkQ29tcCB7Ci0gICAgICAgIGgyNjMsCi0gICAgICAgIGF2YywKLSAgICAgICAgbXBlZzIsCi0gICAgICAgIG1wZWc0LAotICAgICAgICBoZXZjLAotICAgICAgICB2cDgsCi0gICAgICAgIHZwOSwKLSAgICAgICAgYXYxLAotICAgICAgICB1bmtub3duX2NvbXAsCi0gICAgfTsKLQorICAgIHN0ZDo6c3RyaW5nIG1NaW1lOwogICAgIHN0ZDo6c3RyaW5nIG1JbnN0YW5jZU5hbWU7CiAgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7CiAKQEAgLTI5MSw3ICszMTQsNiBAQAogICAgIGNoYXIqIG1SZWZNZDU7CiAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OwogICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOwotICAgIHN0YW5kYXJkQ29tcCBtQ29tcE5hbWU7CiAKICAgICBpbnQzMl90IG1Xb3JrUmVzdWx0OwogICAgIGludDMyX3QgbVJlb3JkZXJEZXB0aDsKQEAgLTMwOCwyMyArMzMwLDI4IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CiAKKyAgICBzdGQ6OnN0cmluZyBtSW5wdXRGaWxlOworICAgIHN0ZDo6c3RyaW5nIG1JbmZvRmlsZTsKKyAgICBzdGQ6OnN0cmluZyBtQ2hrc3VtRmlsZTsKKyAgICBzaXplX3QgbVN0cmVhbUluZGV4ID0gMDsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TdHJlYW1JbmRleCA9IDA7CiAgICAgfQogfTsKIAogdm9pZCB2YWxpZGF0ZUNvbXBvbmVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgZGlzYWJsZVRlc3QpIHsKICAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKICAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CkBAIC0zNTEsODMgKzM3OCw1OSBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCi0gICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgewotICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKLSAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKIH0KIAogLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CiAjZGVmaW5lIFNUUkVBTV9DT1VOVCAzCi0vLyBMb29rVXBUYWJsZSBvZiBjbGlwcywgbWV0YWRhdGEgYW5kIGNoa3N1bSBmb3IgY29tcG9uZW50IHRlc3RpbmcKLXZvaWQgR2V0VVJMQ2hrc21Gb3JDb21wb25lbnQoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXAsIGNoYXIqIG1VUkwsIGNoYXIqIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGNoa3N1bSwgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgewotICAgIHN0cnVjdCBDb21wVG9VUkwgewotICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKLSAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKLSAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKLSAgICAgICAgY29uc3QgY2hhciBjaGtzdW1bU1RSRUFNX0NPVU5UXVs1MTJdOwotICAgIH07Ci0gICAgQVNTRVJUX1RSVUUoc3RyZWFtSW5kZXggPCBTVFJFQU1fQ09VTlQpOworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyByZXF1aXJlZCBmb3IgYWRhcHRpdmUgdGVzdGluZworI2RlZmluZSBBREFQVElWRV9TVFJFQU1fQ09VTlQgMgorLy8gTG9va1VwVGFibGUgb2YgY2xpcHMsIG1ldGFkYXRhIGFuZCBtQ2hrc3VtRmlsZSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK2Jvb2wgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2U6OmdldEZpbGVOYW1lcyhzaXplX3Qgc3RyZWFtSW5kZXgpIHsKKyAgICBpbnQgc3RyZWFtQ291bnQgPSAwOwogCi0gICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7Ci0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdmMsCi0gICAgICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmgyNjQiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzLmluZm8iLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwc19jaGtzdW0ubWQ1IiwKLSAgICAgICAgICAgICAgImJiYl9hdmNfNjQweDM2MF83NjhrYnBzXzMwZnBzX2Noa3N1bS5tZDUiLCAiIn19LAotICAgICAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aGV2YywKLSAgICAgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwc19jaGtzdW0ubWQ1IiwKLSAgICAgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHNfY2hrc3VtLm1kNSIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnMiwKLSAgICAgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IiwgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyIsICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIiwgIiJ9LAotICAgICAgICAgICAgIHsiIiwgIiIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoMjYzLAotICAgICAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIiwgIiJ9LAotICAgICAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIiwgIiJ9LAotICAgICAgICAgICAgIHsiIiwgIiIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnNCwKLSAgICAgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diIsICIifSwKLSAgICAgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8iLCAiIn0sCi0gICAgICAgICAgICAgeyIiLCAiIiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOCwKLSAgICAgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCIsICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4IiwgIiJ9LAotICAgICAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbyIsICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyIsICIifSwKLSAgICAgICAgICAgICB7IiIsICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHNfY2hrc20ubWQ1IiwgIiJ9fSwKLSAgICAgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOSwKLSAgICAgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSIsICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5IiwKLSAgICAgICAgICAgICAgImJiYl92cDlfNzA0eDQ4MF8yODBrYnBzXzI0ZnBzX2FsdHJlZl8yLnZwOSJ9LAotICAgICAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyIsICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyIsCi0gICAgICAgICAgICAgICJiYmJfdnA5XzcwNHg0ODBfMjgwa2Jwc18yNGZwc19hbHRyZWZfMi5pbmZvIn0sCi0gICAgICAgICAgICAgeyIiLCAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzX2Noa3NtLm1kNSIsICIifX0sCi0gICAgICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdjEsCi0gICAgICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5hdjEiLCAiIn0sCi0gICAgICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsICIifSwKLSAgICAgICAgICAgICB7ImJiYl9hdjFfNjQwXzM2MF9jaGtzdW0ubWQ1IiwgImJiYl9hdjFfMTc2XzE0NF9jaGtzbS5tZDUiLCAiIn19LAotICAgIH07Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7Ci0gICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgewotICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOwotICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOwotICAgICAgICAgICAgc3RyY2F0KGNoa3N1bSwga0NvbXBUb1VSTFtpXS5jaGtzdW1bc3RyZWFtSW5kZXhdKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdDb21wVG9GaWxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIW1NaW1lLmNvbXBhcmUoInZpZGVvLyIgKyBnQ29tcFRvRmlsZXNbaV0ubWltZSkpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Db3VudCA9PSBzdHJlYW1JbmRleCkgeworICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUgPSBzUmVzb3VyY2VEaXIgKyBnQ29tcFRvRmlsZXNbaV0uaW5wdXRGaWxlOworICAgICAgICAgICAgICAgIG1JbmZvRmlsZSA9IHNSZXNvdXJjZURpciArIGdDb21wVG9GaWxlc1tpXS5pbmZvRmlsZTsKKyAgICAgICAgICAgICAgICBtQ2hrc3VtRmlsZSA9IHNSZXNvdXJjZURpciArIGdDb21wVG9GaWxlc1tpXS5jaGtzdW1GaWxlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtQ291bnQrKzsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLCBjaGFyKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgewotICAgIGNoYXIgY2hrc3VtWzUxMl07Ci0gICAgc3RyY3B5KGNoa3N1bSwgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTENoa3NtRm9yQ29tcG9uZW50KGNvbXAsIG1VUkwsIGluZm8sIGNoa3N1bSwgc3RyZWFtSW5kZXgpOwordm9pZCBzZXRPdXRwdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlTW9kZV90IHN1cmZNb2RlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXIgPSBudWxscHRyOworICAgIHN0YXRpYyBzdGQ6OmF0b21pY191aW50MzJfdCBzdXJmYWNlR2VuZXJhdGlvbnswfTsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0KKyAgICAgICAgICAgIChnZXRwaWQoKSA8PCAxMCkgfAorICAgICAgICAgICAgKChzdXJmYWNlR2VuZXJhdGlvbi5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgKyAxKSAmICgoMSA8PCAxMCkgLSAxKSk7CisgICAgaW50MzJfdCBtYXhEZXF1ZXVlQnVmZmVycyA9IGtTbW9vdGhuZXNzRmFjdG9yICsga1JlbmRlcmluZ0RlcHRoOworICAgIGlmIChzdXJmTW9kZSA9PSBTVVJGQUNFKSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyID0gbnVsbHB0cjsKKyAgICAgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICAgICAgQVNTRVJUX05FKHByb2R1Y2VyLCBudWxscHRyKSA8PCAiY3JlYXRlQnVmZmVyUXVldWUgcmV0dXJuZWQgaW52YWxpZCBwcm9kdWNlciI7CisgICAgICAgIEFTU0VSVF9ORShjb25zdW1lciwgbnVsbHB0cikgPDwgImNyZWF0ZUJ1ZmZlclF1ZXVlIHJldHVybmVkIGludmFsaWQgY29uc3VtZXIiOworCisgICAgICAgIHNwPEdMQ29uc3VtZXI+IHRleHR1cmUgPQorICAgICAgICAgICAgICAgIG5ldyBHTENvbnN1bWVyKGNvbnN1bWVyLCAwIC8qIHRleCAqLywgR0xDb25zdW1lcjo6VEVYVFVSRV9FWFRFUk5BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHVzZUZlbmNlU3luYyAqLywgZmFsc2UgLyogaXNDb250cm9sbGVkQnlBcHAgKi8pOworCisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IGdTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgICAgICBBU1NFUlRfTkUoZ1N1cmZhY2UsIG51bGxwdHIpIDw8ICJnZXRTdXJmYWNlIGZhaWxlZCI7CisKKyAgICAgICAgcHJvZHVjZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDLCBwcm9kdWNlciwgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKSA8PCAic2V0T3V0cHV0U3VyZmFjZSBmYWlsZWQiOwogfQogCiB2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LApAQCAtNTE3LDcgKzUyMCw3IEBACiBURVNUX1AoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7Ci0gICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1EaXNhYmxlVGVzdCk7CiAgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOwogfQogCkBAIC01NzMsMTMgKzU3NiwxMiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotY2xhc3MgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Ci0gICAgICAgICAgICAgIHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RGVjb2RlVGVzdFBhcmFtZXRlcnM+IHsKICAgICB2b2lkIGdldFBhcmFtcygpIHsKICAgICAgICAgbUluc3RhbmNlTmFtZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtU3RyZWFtSW5kZXggPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKICAgICB9CiB9OwogCkBAIC01ODgsMjQgKzU5MCwxNCBAQAogICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogCi0gICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBzdGQ6OnN0b2koc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSkpOwotICAgIGJvb2wgc2lnbmFsRU9TID0gIXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICBib29sIHNpZ25hbEVPUyA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgIHN1cmZhY2VNb2RlX3Qgc3VyZk1vZGUgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CiAKLSAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdLCBjaGtzdW1bNTEyXTsKICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOwogCi0gICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIHN0cmNweShjaGtzdW0sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLQotICAgIEdldFVSTENoa3NtRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgY2hrc3VtLCBzdHJlYW1JbmRleCk7Ci0gICAgaWYgKCEoc3RyY21wKG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKSkgfHwgIShzdHJjbXAoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpKSkgewotICAgICAgICBBTE9HVigiU2tpcHBpbmcgVGVzdCwgU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KICAgICBtTWQ1RW5hYmxlID0gdHJ1ZTsKLSAgICBpZiAoIXN0cmNtcChjaGtzdW0sIHNSZXNvdXJjZURpci5jX3N0cigpKSkgbU1kNUVuYWJsZSA9IGZhbHNlOworICAgIGlmICghbUNoa3N1bUZpbGUuY29tcGFyZShzUmVzb3VyY2VEaXIpKSBtTWQ1RW5hYmxlID0gZmFsc2U7CiAKICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CiAgICAgaWYgKCFjb25maWdQaXhlbEZvcm1hdChmb3JtYXQpKSB7CkBAIC02MTYsMjMgKzYwOCwyMiBAQAogICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOwogICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKIAotICAgIGludDMyX3QgbnVtQ3NkcyA9IHBvcHVsYXRlSW5mb1ZlY3RvcihpbmZvLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKLSAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlOiAiIDw8IGluZm87CisgICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKG1JbmZvRmlsZSwgJkluZm8sIG1UaW1lc3RhbXBEZXZUZXN0LCAmbVRpbWVzdGFtcFVzbGlzdCk7CisgICAgQVNTRVJUX0dFKG51bUNzZHMsIDApIDw8ICJFcnJvciBpbiBwYXJzaW5nIGlucHV0IGluZm8gZmlsZTogIiA8PCBtSW5mb0ZpbGU7CiAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwogICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAogICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CiAgICAgbVRpbWVzdGFtcFVzID0gMDsKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOwogCiAgICAgc2l6ZV90IHJlZkNoa3NtU2l6ZSA9IDA7CiAgICAgc3RkOjppZnN0cmVhbSByZWZDaGtzdW07CiAgICAgaWYgKG1NZDVFbmFibGUpIHsKLSAgICAgICAgQUxPR1YoImNoa3N1bSBmaWxlIG5hbWU6ICVzIiwgY2hrc3VtKTsKLSAgICAgICAgcmVmQ2hrc3VtLm9wZW4oY2hrc3VtLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkgfCBzdGQ6Omlmc3RyZWFtOjphdGUpOworICAgICAgICByZWZDaGtzdW0ub3BlbihtQ2hrc3VtRmlsZSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5IHwgc3RkOjppZnN0cmVhbTo6YXRlKTsKICAgICAgICAgQVNTRVJUX0VRKHJlZkNoa3N1bS5pc19vcGVuKCksIHRydWUpOwogICAgICAgICByZWZDaGtzbVNpemUgPSByZWZDaGtzdW0udGVsbGcoKTsKICAgICAgICAgcmVmQ2hrc3VtLnNlZWtnKDAsIHN0ZDo6aWZzdHJlYW06OmJlZyk7CkBAIC02NDUsNiArNjM2LDEwIEBACiAgICAgICAgIHJlZkNoa3N1bS5jbG9zZSgpOwogICAgIH0KIAorICAgIGlmIChzdXJmTW9kZSAhPSBOT19TVVJGQUNFKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldE91dHB1dFN1cmZhY2UobUNvbXBvbmVudCwgc3VyZk1vZGUpKTsKKyAgICB9CisKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpLCBzaWduYWxFT1MpKTsKQEAgLTY4OCw5ICs2ODMsMTEgQEAKIFRFU1RfUChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBBZGFwdGl2ZURlY29kZVRlc3QpIHsKICAgICBkZXNjcmlwdGlvbigiQWRhcHRpdmUgRGVjb2RlIFRlc3QiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwotICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fCBtQ29tcE5hbWUgPT0gdnA5IHx8Ci0gICAgICAgICAgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICBpZiAoIShzdHJjYXNlc3RyKG1NaW1lLmNfc3RyKCksICJhdmMiKSB8fCBzdHJjYXNlc3RyKG1NaW1lLmNfc3RyKCksICJoZXZjIikgfHwKKyAgICAgICAgICBzdHJjYXNlc3RyKG1NaW1lLmNfc3RyKCksICJ2cDgiKSB8fCBzdHJjYXNlc3RyKG1NaW1lLmNfc3RyKCksICJ2cDkiKSB8fAorICAgICAgICAgIHN0cmNhc2VzdHIobU1pbWUuY19zdHIoKSwgIm1wZWcyIikpKSB7CiAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKQEAgLTY5OSwyMCArNjk2LDE3IEBACiAgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKICAgICB1aW50MzJfdCBvZmZzZXQgPSAwOwogICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgewotICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBBREFQVElWRV9TVFJFQU1fQ09VTlQgKiAyOyBpKyspIHsKICAgICAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CiAKLSAgICAgICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICAgICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7Ci0gICAgICAgIGlmICghKHN0cmNtcChtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSkpIHx8ICEoc3RyY21wKGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKSkpIHsKKyAgICAgICAgYm9vbCB2YWxpZCA9IGdldEZpbGVOYW1lcyhpICUgQURBUFRJVkVfU1RSRUFNX0NPVU5UKTsKKyAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSBub3QgYXZhaWxhYmxlLCBza2lwcGluZyB0aGlzIGluZGV4Iik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGVsZUluZm8ub3BlbihpbmZvKTsKLSAgICAgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgICAgIGVsZUluZm8ub3BlbihtSW5mb0ZpbGUpOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1JbnB1dEZpbGUgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKICAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOwogICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CkBAIC03MzQsMTMgKzcyOCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRpbWVzdGFtcE1heCA8IHRpbWVzdGFtcCkgdGltZXN0YW1wTWF4ID0gdGltZXN0YW1wOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcE9mZnNldCA9IHRpbWVzdGFtcE1heDsKKyAgICAgICAgdGltZXN0YW1wT2Zmc2V0ID0gdGltZXN0YW1wTWF4ICsgMzMzMzM7CiAgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKIAogICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAogICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOwotICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7Ci0gICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CiAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKQEAgLTc5NiwxNSArNzg5LDkgQEAKICAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciB0aHVtYm5haWwiKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogCi0gICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOwotCi0gICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOwotCi0gICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKGluZm8sICZJbmZvLCBtVGltZXN0YW1wRGV2VGVzdCwgJm1UaW1lc3RhbXBVc2xpc3QpOwotICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGU6ICIgPDwgaW5mbzsKKyAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IobUluZm9GaWxlLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKKyAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlOiAiIDw8IG1JbmZvRmlsZTsKIAogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JVEVSQVRJT05TOyBpKyspIHsKQEAgLTgyMSw3ICs4MDgsNyBAQAogICAgICAgICB9IHdoaWxlICghKGZsYWdzICYgU1lOQ19GUkFNRSkpOwogCiAgICAgICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOwotICAgICAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBlbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwogICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CiAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsCkBAIC04ODMsMTkgKzg3MCwxMiBAQAogCiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKIAotICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKLQogICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOwogCi0gICAgaW50MzJfdCBudW1Dc2RzID0gcG9wdWxhdGVJbmZvVmVjdG9yKGluZm8sICZJbmZvLCBtVGltZXN0YW1wRGV2VGVzdCwgJm1UaW1lc3RhbXBVc2xpc3QpOwotICAgIEFTU0VSVF9HRShudW1Dc2RzLCAwKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBpbnB1dCBpbmZvIGZpbGU6ICIgPDwgaW5mbzsKLQotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IobUluZm9GaWxlLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKKyAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlOiAiIDw8IG1JbmZvRmlsZTsKIAogICAgIC8vIGZsdXNoCiAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKQEAgLTkwNiw3ICs4ODYsNyBAQAogICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgTUFYX0lOUFVUX0JVRkZFUlMpOwogCiAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07Ci0gICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBlbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwogICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKICAgICAvLyBEZWNvZGUgMzAgZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAzMCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CiAgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKQEAgLTk1OSwxNSArOTM5LDEwIEBACiAgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOwogICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOwogCi0gICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBzdHJjcHkoaW5mbywgc1Jlc291cmNlRGlyLmNfc3RyKCkpOwotICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOwotCi0gICAgZWxlSW5mby5vcGVuKGluZm8pOwotICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGVsZUluZm8ub3BlbihtSW5mb0ZpbGUpOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbUlucHV0RmlsZSA8PCAiIC0gZmlsZSBub3QgZm91bmQiOwogICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CiAgICAgaW50IGJ5dGVzQ291bnQgPSAwOwogICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOwpAQCAtOTk1LDggKzk3MCw3IEBACiAgICAgZWxlSW5mby5jbG9zZSgpOwogCiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7Ci0gICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBlbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwogICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsCkBAIC0xMDE3LDEyICs5OTEsMTIgQEAKICAgICB9CiB9CiAKLWNsYXNzIENvZGVjMlZpZGVvRGVjQ3NkSW5wdXRUZXN0cwotICAgIDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3RCYXNlLAotICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+IHsKK2NsYXNzIENvZGVjMlZpZGVvRGVjQ3NkSW5wdXRUZXN0cyA6IHB1YmxpYyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVN0cmVhbUluZGV4ID0gMDsKICAgICB9CiB9OwogCkBAIC0xMDMyLDI3ICsxMDA2LDIwIEBACiAgICAgZGVzY3JpcHRpb24oIlRlc3RzIGNvZGVjcyBmb3IgZmx1c2ggYXQgZGlmZmVyZW50IHN0YXRlcyIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKLSAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOwotCiAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKIAotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgc3RyY3B5KGluZm8sIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKLQotICAgIGludDMyX3QgbnVtQ3NkcyA9IHBvcHVsYXRlSW5mb1ZlY3RvcihpbmZvLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKKyAgICBpbnQzMl90IG51bUNzZHMgPSBwb3B1bGF0ZUluZm9WZWN0b3IobUluZm9GaWxlLCAmSW5mbywgbVRpbWVzdGFtcERldlRlc3QsICZtVGltZXN0YW1wVXNsaXN0KTsKICAgICBBU1NFUlRfR0UobnVtQ3NkcywgMCkgPDwgIkVycm9yIGluIHBhcnNpbmcgaW5wdXQgaW5mbyBmaWxlIjsKIAogICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CiAKLSAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CiAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07Ci0gICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBlbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwogICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKICAgICBib29sIGZsdXNoZWREZWNvZGVyID0gZmFsc2U7CiAgICAgYm9vbCBzaWduYWxFT1MgPSBmYWxzZTsKICAgICBib29sIGtleUZyYW1lID0gZmFsc2U7Ci0gICAgYm9vbCBmbHVzaENzZCA9ICFzdGQ6OmdldDwyPihHZXRQYXJhbSgpKS5jb21wYXJlKCJ0cnVlIik7CisgICAgYm9vbCBmbHVzaENzZCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOwogCiAgICAgQUxPR1YoInNlbmRpbmcgJWQgY3NkIGRhdGEgIiwgbnVtQ3Nkcyk7CiAgICAgaW50IGZyYW1lc1RvRGVjb2RlID0gbnVtQ3NkczsKQEAgLTExMjEsNTAgKzEwODgsNDcgQEAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CiB9CiAKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oa1Rlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFBlckluc3RhbmNlLCBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCB0ZXN0aW5nOjpWYWx1ZXNJbihnVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogLy8gRGVjb2RlVGVzdCB3aXRoIFN0cmVhbUluZGV4IGFuZCBFT1MgLyBObyBFT1MKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChTdHJlYW1JbmRleEFuZEVPUywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtEZWNvZGVUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXNJbihnRGVjb2RlVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENzZElucHV0cywgQ29kZWMyVmlkZW9EZWNDc2RJbnB1dFRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOworICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlc0luKGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gVE9ETyA6IFZpZGVvIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gVGVzdAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICAga1Rlc3RQYXJhbWV0ZXJzID0gZ2V0VGVzdFBhcmFtZXRlcnMoQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUik7Ci0gICAgZm9yIChhdXRvIHBhcmFtcyA6IGtUZXN0UGFyYW1ldGVycykgewotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMCIsICJmYWxzZSIpKTsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjAiLCAidHJ1ZSIpKTsKLSAgICAgICAga0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjEiLCAiZmFsc2UiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIxIiwgInRydWUiKSk7Ci0gICAgICAgIGtEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIyIiwgImZhbHNlIikpOwotICAgICAgICBrRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMiIsICJ0cnVlIikpOwotCi0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgInRydWUiKSk7Ci0gICAgICAgIGtDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgImZhbHNlIikpOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IGJhc2VkIG9uIGNvbW1hbmQgbGluZSBhcmdzLgotICAgIC8vIFRlc3Qgd2lsbCBmYWlsIHRvIHNldCB1cCBpZiB0aGUgYXJndW1lbnQgaXMgbm90IHNldC4KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBpZiAoc3RyY21wKGFyZ3ZbaV0sICItUCIpID09IDAgJiYgaSA8IGFyZ2MgLSAxKSB7Ci0gICAgICAgICAgICBzUmVzb3VyY2VEaXIgPSBhcmd2W2kgKyAxXTsKLSAgICAgICAgICAgIGJyZWFrOworICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgIC8vIG1PdXRwdXRCdWZmZXJRdWV1ZS0+Y29uZmlndXJlKCkgY3Jhc2hlcyB3aGVuIHN1cmZhY2UgaXMgTlVMTAorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3VyZmFjZU1vZGVfdD4gc3VyZmFjZU1vZGUgPSB7CisgICAgICAgICAgICAgICAgc3VyZmFjZU1vZGVfdDo6Tk9fU1VSRkFDRSwgc3VyZmFjZU1vZGVfdDo6TlVMTF9TVVJGQUNFLCBzdXJmYWNlTW9kZV90OjpTVVJGQUNFfTsKKyAgICAgICAgZm9yIChzdXJmYWNlTW9kZV90IG1vZGUgOiBzdXJmYWNlTW9kZSkgeworICAgICAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDAsIGZhbHNlLCBtb2RlKSk7CisgICAgICAgICAgICBnRGVjb2RlVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMCwgdHJ1ZSwgbW9kZSkpOwogICAgICAgICB9CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDEsIGZhbHNlLCBOT19TVVJGQUNFKSk7CisgICAgICAgIGdEZWNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDEsIHRydWUsIE5PX1NVUkZBQ0UpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMiwgZmFsc2UsIE5PX1NVUkZBQ0UpKTsKKyAgICAgICAgZ0RlY29kZVRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMiwgdHJ1ZSwgTk9fU1VSRkFDRSkpOworCisgICAgICAgIGdDc2RGbHVzaFRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgdHJ1ZSkpOworICAgICAgICBnQ3NkRmx1c2hUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIGZhbHNlKSk7CiAgICAgfQogCiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcAppbmRleCBlY2FmM2E4Li44MzA1ZmViIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKQEAgLTIzLDE1ICsyMywxMiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KIAotI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CiAjaW5jbHVkZSA8QzJCdWZmZXIuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkNvbmZpZy5oPgogI2luY2x1ZGUgPEMyRGVidWcuaD4KICNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KIAotdXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247Ci0KICNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCiAjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgogCkBAIC00MSwxMyArMzgsMTEgQEAKICAgICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpfSkge30KIH07CiAKLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4+Ci0gICAgICAgIGtFbmNvZGVUZXN0UGFyYW1ldGVyczsKLXN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4KLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVyczsKK3VzaW5nIEVuY29kZVRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGJvb2wsIGJvb2wsIGJvb2w+Oworc3RhdGljIHN0ZDo6dmVjdG9yPEVuY29kZVRlc3RQYXJhbWV0ZXJzPiBnRW5jb2RlVGVzdFBhcmFtZXRlcnM7CiAKLS8vIFJlc291cmNlIGRpcmVjdG9yeQotc3RhdGljIHN0ZDo6c3RyaW5nIHNSZXNvdXJjZURpciA9ICIiOwordXNpbmcgRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzID0gc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIGludDMyX3QsIGludDMyX3Q+Oworc3RhdGljIHN0ZDo6dmVjdG9yPEVuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycz4gZ0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVyczsKIAogbmFtZXNwYWNlIHsKIApAQCAtNzgsMjYgKzczLDE0IEBACiAgICAgICAgIG1HcmFwaGljUG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CiAgICAgICAgIEFTU0VSVF9ORShtR3JhcGhpY1Bvb2wsIG51bGxwdHIpOwogCi0gICAgICAgIG1Db21wTmFtZSA9IHVua25vd25fY29tcDsKLSAgICAgICAgc3RydWN0IFN0cmluZ1RvTmFtZSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lOwotICAgICAgICAgICAgc3RhbmRhcmRDb21wIENvbXBOYW1lOwotICAgICAgICB9OworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgICAgIGMyX3N0YXR1c190IGMyZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgQVNTRVJUX0VRKGMyZXJyLCBDMl9PSykgPDwgIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKHF1ZXJpZWQuc2l6ZSgpLCAxKSA8PCAiU2l6ZSBvZiB0aGUgdmVjdG9yIHJldHVybmVkIGlzIGludmFsaWQiOwogCi0gICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7Ci0gICAgICAgICAgICAgICAgeyJoMjYzIiwgaDI2M30sIHsiYXZjIiwgYXZjfSwgeyJtcGVnNCIsIG1wZWc0fSwKLSAgICAgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCi0gICAgICAgIH07Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPSBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7Ci0KLSAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKG1Db21wb25lbnROYW1lLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKLSAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1NaW1lID0gKChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBzdGQ6OmNvdXQgPDwgIm1pbWUgOiAiIDw8IG1NaW1lIDw8ICJcbiI7CiAgICAgICAgIG1Fb3MgPSBmYWxzZTsKICAgICAgICAgbUNzZCA9IGZhbHNlOwogICAgICAgICBtQ29uZmlnQlBpY3R1cmVzID0gZmFsc2U7CkBAIC0xMDYsNyArODksMjYgQEAKICAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CiAgICAgICAgIG1PdXRwdXRTaXplID0gMHU7CiAgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7Ci0gICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBtV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICAgICAgbUhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICAgICAgbU1heFdpZHRoID0gMDsKKyAgICAgICAgbU1heEhlaWdodCA9IDA7CisgICAgICAgIG1NaW5XaWR0aCA9IElOVDMyX01BWDsKKyAgICAgICAgbU1pbkhlaWdodCA9IElOVDMyX01BWDsKKworICAgICAgICBBU1NFUlRfRVEoZ2V0TWF4TWluUmVzb2x1dGlvblN1cHBvcnRlZCgpLCBDMl9PSyk7CisgICAgICAgIG1XaWR0aCA9IHN0ZDo6bWF4KHN0ZDo6bWluKG1XaWR0aCwgbU1heFdpZHRoKSwgbU1pbldpZHRoKTsKKyAgICAgICAgbUhlaWdodCA9IHN0ZDo6bWF4KHN0ZDo6bWluKG1IZWlnaHQsIG1NYXhIZWlnaHQpLCBtTWluSGVpZ2h0KTsKKyAgICAgICAgQUxPR1YoIm1XaWR0aCAlZCBtSGVpZ2h0ICVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OworICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7JnNlY3VyZU1vZGVUdW5pbmd9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNlY3VyZU1vZGVUdW5pbmcudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEIHx8CisgICAgICAgICAgICBzZWN1cmVNb2RlVHVuaW5nLnZhbHVlID09IEMyQ29uZmlnOjpTTV9SRUFEX1BST1RFQ1RFRF9XSVRIX0VOQ1JZUFRFRCkgeworICAgICAgICAgICAgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGdldEZpbGUoKTsKICAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CiAgICAgfQogCkBAIC0xMjAsOCArMTIyLDkgQEAKIAogICAgIC8vIEdldCB0aGUgdGVzdCBwYXJhbWV0ZXJzIGZyb20gR2V0UGFyYW0gY2FsbC4KICAgICB2aXJ0dWFsIHZvaWQgZ2V0UGFyYW1zKCkge30KLQorICAgIHZvaWQgZ2V0RmlsZSgpOwogICAgIGJvb2wgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0LCBpbnQzMl90IG5CRnJhbWUgPSAwKTsKKyAgICBjMl9zdGF0dXNfdCBnZXRNYXhNaW5SZXNvbHV0aW9uU3VwcG9ydGVkKCk7CiAKICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKICAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgewpAQCAtMTgwLDE2ICsxODMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW51bSBzdGFuZGFyZENvbXAgewotICAgICAgICBoMjYzLAotICAgICAgICBhdmMsCi0gICAgICAgIG1wZWc0LAotICAgICAgICBoZXZjLAotICAgICAgICB2cDgsCi0gICAgICAgIHZwOSwKLSAgICAgICAgdW5rbm93bl9jb21wLAotICAgIH07Ci0KKyAgICBzdGQ6OnN0cmluZyBtTWltZTsKICAgICBzdGQ6OnN0cmluZyBtSW5zdGFuY2VOYW1lOwogICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOwogICAgIGJvb2wgbUVvczsKQEAgLTE5NywxMSArMTkxLDE2IEBACiAgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CiAgICAgYm9vbCBtQ29uZmlnQlBpY3R1cmVzOwogICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7Ci0gICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKICAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CiAgICAgdWludDMyX3QgbUZhaWxlZFdvcmtSZWNlaXZlZDsKICAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CiAgICAgdWludDY0X3QgbU91dHB1dFNpemU7CisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbU1heFdpZHRoOworICAgIGludDMyX3QgbU1heEhlaWdodDsKKyAgICBpbnQzMl90IG1NaW5XaWR0aDsKKyAgICBpbnQzMl90IG1NaW5IZWlnaHQ7CiAKICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CiAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CkBAIC0yMTgsMTUgKzIxNywxNiBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OwogCisgICAgc3RkOjpzdHJpbmcgbUlucHV0RmlsZTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKICAgICB9CiB9OwogCi1jbGFzcyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0Ci0gICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxUZXN0UGFyYW1ldGVycz4gewogICAgIHZvaWQgZ2V0UGFyYW1zKCkgewogICAgICAgICBtSW5zdGFuY2VOYW1lID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgICAgIG1Db21wb25lbnROYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CkBAIC0yMzQsNyArMjM0LDcgQEAKIH07CiAKIHZvaWQgdmFsaWRhdGVDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGRpc2FibGVUZXN0KSB7CiAgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CiAgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOwpAQCAtMjYxLDEzICsyNjEsNiBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCi0gICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgewotICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKLSAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKIH0KIApAQCAtMjk1LDkgKzI4OCwzOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0vLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBmb3IgY29tcG9uZW50IHRlc3RpbmcKLXZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIFVSTCkgewotICAgIHN0cmNhdChVUkwsICJiYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIpOwordm9pZCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0QmFzZTo6Z2V0RmlsZSgpIHsKKyAgICBtSW5wdXRGaWxlID0gc1Jlc291cmNlRGlyICsgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IjsKK30KKwordm9pZCBmaWxsQnl0ZUJ1ZmZlcihjaGFyKiBpbnB1dEJ1ZmZlciwgY2hhciogbUlucHV0RGF0YSwgdWludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0OworICAgIGludCBvZmZzZXQgPSAwLCBmcm1PZmZzZXQgPSAwOworICAgIGludCBudW1PZlBsYW5lcyA9IDM7CisgICAgZm9yIChpbnQgcGxhbmUgPSAwOyBwbGFuZSA8IG51bU9mUGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGlmIChwbGFuZSA9PSAwKSB7CisgICAgICAgICAgICB3aWR0aCA9IG5XaWR0aDsKKyAgICAgICAgICAgIGhlaWdodCA9IG5IZWlnaHQ7CisgICAgICAgICAgICB0aWxlV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICAgICAgICAgIHRpbGVIZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aWR0aCA9IG5XaWR0aCAvIDI7CisgICAgICAgICAgICB0aWxlV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSCAvIDI7CisgICAgICAgICAgICBoZWlnaHQgPSBuSGVpZ2h0IC8gMjsKKyAgICAgICAgICAgIHRpbGVIZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaGVpZ2h0OyBrICs9IHRpbGVIZWlnaHQpIHsKKyAgICAgICAgICAgIGludCByb3dzVG9Db3B5ID0gc3RkOjptaW4oaGVpZ2h0IC0gaywgdGlsZUhlaWdodCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJvd3NUb0NvcHk7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gdGlsZVdpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2xzVG9Db3B5ID0gc3RkOjptaW4od2lkdGggLSBpLCB0aWxlV2lkdGgpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIgKyAob2Zmc2V0ICsgKGsgKyBqKSAqIHdpZHRoICsgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXREYXRhICsgKGZybU9mZnNldCArIGogKiB0aWxlV2lkdGgpLCBjb2xzVG9Db3B5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IHdpZHRoICogaGVpZ2h0OworICAgICAgICBmcm1PZmZzZXQgKz0gdGlsZVdpZHRoICogdGlsZUhlaWdodDsKKyAgICB9CiB9CiAKIHZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCkBAIC0zMTIsNiArMzM1LDEyIEBACiAgICAgaW50IGJ5dGVzQ291bnQgPSBuV2lkdGggKiBuSGVpZ2h0ICogMyA+PiAxOwogICAgIGludDMyX3QgdGltZXN0YW1wSW5jciA9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKworICAgIC8vIFF1ZXJ5IGNvbXBvbmVudCdzIG1lbW9yeSB1c2FnZSBmbGFncworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0IGNvbXBVc2FnZSgwdSwgMHUpOworICAgIGNvbXBvbmVudC0+cXVlcnkoeyZjb21wVXNhZ2V9LCB7fSwgQzJfRE9OVF9CTE9DSywgJnBhcmFtcyk7CisKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwpAQCAtMzQzLDE2ICszNzIsMjcgQEAKICAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKICAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKICAgICAgICAgfQotICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhieXRlc0NvdW50KTsKLSAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOwotICAgICAgICBtZW1zZXQoZGF0YSwgMCwgYnl0ZXNDb3VudCk7Ci0gICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7Ci0gICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBieXRlc0NvdW50KTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoYnl0ZXNDb3VudCk7CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgaWYgKG5XaWR0aCAhPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSCB8fCBuSGVpZ2h0ICE9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVCkgeworICAgICAgICAgICAgaW50IGRlZmF1bHRCeXRlc0NvdW50ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUICogRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEggKiAzID4+IDE7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzcmNCdWZmZXIoZGVmYXVsdEJ5dGVzQ291bnQpOworICAgICAgICAgICAgY2hhciogc3JjRGF0YSA9IChjaGFyKilzcmNCdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgaWYgKGVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgICAgICAgICBlbGVTdHJlYW0ucmVhZChzcmNEYXRhLCBkZWZhdWx0Qnl0ZXNDb3VudCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgZGVmYXVsdEJ5dGVzQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsbEJ5dGVCdWZmZXIoZGF0YSwgc3JjRGF0YSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKICAgICAgICAgZXJyID0gZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgY29tcFVzYWdlLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB8IGNvbXBVc2FnZS52YWx1ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spOwogICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZldGNoR3JhcGhpY0Jsb2NrIGZhaWxlZCA6ICVkXG4iLCBlcnIpOwpAQCAtMzgxLDcgKzQyMSw2IEBACiAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBHcmFwaGljQnVmZmVyKGJsb2NrKSk7CiAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CiAgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKLSAgICAgICAgZnJlZShkYXRhKTsKIAogICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOwogICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKQEAgLTM5OCwzOSArNDM3LDc3IEBACiBURVNUX1AoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7Ci0gICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1EaXNhYmxlVGVzdCk7CiAgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOwogfQogCi1jbGFzcyBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QKLSAgICA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0QmFzZSwKLSAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTwKLSAgICAgICAgICAgICAgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CitjbGFzcyBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RW5jb2RlVGVzdFBhcmFtZXRlcnM+IHsKICAgICB2b2lkIGdldFBhcmFtcygpIHsKICAgICAgICAgbUluc3RhbmNlTmFtZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOwogICAgICAgICBtQ29tcG9uZW50TmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwogICAgIH0KIH07CiAKK2MyX3N0YXR1c190IENvZGVjMlZpZGVvRW5jSGlkbFRlc3RCYXNlOjpnZXRNYXhNaW5SZXNvbHV0aW9uU3VwcG9ydGVkKCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IHBhcmFtID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PigpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gdmFsaWRWYWx1ZUluZm9zID0geworICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQocGFyYW0uZ2V0KCksICZDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6d2lkdGgpKSwKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudCgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHBhcmFtLmdldCgpLCAmQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmhlaWdodCkpfTsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKHZhbGlkVmFsdWVJbmZvcywgQzJfTUFZX0JMT0NLKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgfHwgdmFsaWRWYWx1ZUluZm9zLnNpemUoKSAhPSAydSkgeworICAgICAgICBBTE9HRSgicXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIgZmFpbGVkIGZvciBwaWN0dXJlU2l6ZSIpOworICAgICAgICByZXR1cm4gYzJlcnI7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgYzJGU1ZXaWR0aCA9IHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXM7CisgICAgY29uc3QgYXV0byYgYzJGU1ZIZWlnaHQgPSB2YWxpZFZhbHVlSW5mb3NbMV0udmFsdWVzOworICAgIHN3aXRjaCAoYzJGU1ZXaWR0aC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpSQU5HRTogeworICAgICAgICAgICAgY29uc3QgYXV0byYgd2lkdGhSYW5nZSA9IGMyRlNWV2lkdGgucmFuZ2U7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBoZWlnaHRSYW5nZSA9IGMyRlNWSGVpZ2h0LnJhbmdlOworICAgICAgICAgICAgbU1heFdpZHRoID0gKHVpbnQzMl90KSh3aWR0aFJhbmdlLm1heCkucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgbU1heEhlaWdodCA9ICh1aW50MzJfdCkoaGVpZ2h0UmFuZ2UubWF4KS5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgICAgICBtTWluV2lkdGggPSAodWludDMyX3QpKHdpZHRoUmFuZ2UubWluKS5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgICAgICBtTWluSGVpZ2h0ID0gKHVpbnQzMl90KShoZWlnaHRSYW5nZS5taW4pLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpWQUxVRVM6IHsKKyAgICAgICAgICAgIGludDMyX3QgY3VyciA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSYgcHJpbSA6IGMyRlNWV2lkdGgudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgY3VyciA9ICh1aW50MzJfdClwcmltLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICBtTWF4V2lkdGggPSBzdGQ6Om1heChjdXJyLCBtTWF4V2lkdGgpOworICAgICAgICAgICAgICAgIG1NaW5XaWR0aCA9IHN0ZDo6bWluKGN1cnIsIG1NaW5XaWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSYgcHJpbSA6IGMyRlNWSGVpZ2h0LnZhbHVlcykgeworICAgICAgICAgICAgICAgIGN1cnIgPSAodWludDMyX3QpcHJpbS5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgICAgICAgICAgbU1heEhlaWdodCA9IHN0ZDo6bWF4KGN1cnIsIG1NYXhIZWlnaHQpOworICAgICAgICAgICAgICAgIG1NaW5IZWlnaHQgPSBzdGQ6Om1pbihjdXJyLCBtTWluSGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiTm9uIHN1cHBvcnRlZCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKIFRFU1RfUChDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsIEVuY29kZVRlc3QpIHsKICAgICBkZXNjcmlwdGlvbigiRW5jb2RlcyBpbnB1dCBmaWxlIik7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgR1RFU1RfU0tJUCgpIDw8ICJUZXN0IGlzIGRpc2FibGVkIjsKIAotICAgIGNoYXIgbVVSTFs1MTJdOwotICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7Ci0gICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOwotICAgIGJvb2wgc2lnbmFsRU9TID0gIXN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKKyAgICBib29sIHNpZ25hbEVPUyA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOwogICAgIC8vIFNlbmQgYW4gZW1wdHkgZnJhbWUgdG8gcmVjZWl2ZSBDU0QgZGF0YSBmcm9tIGVuY29kZXIuCi0gICAgYm9vbCBzZW5kRW1wdHlGaXJzdEZyYW1lID0gIXN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKLSAgICBtQ29uZmlnQlBpY3R1cmVzID0gIXN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpLmNvbXBhcmUoInRydWUiKTsKLQotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworICAgIGJvb2wgc2VuZEVtcHR5Rmlyc3RGcmFtZSA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgIG1Db25maWdCUGljdHVyZXMgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKIAogICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOwotICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7Ci0gICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiBmaWxlIG5vdCBmb3VuZCI7Ci0gICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG1JbnB1dEZpbGUgPDwgIiBmaWxlIG5vdCBmb3VuZCI7CiAKICAgICBtVGltZXN0YW1wVXMgPSAwOwogICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKQEAgLTQ0NiwxMCArNTIzLDYgQEAKICAgICAgICAgaW5wdXRGcmFtZXMtLTsKICAgICB9CiAKLSAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0LCBtQ29uZmlnQlBpY3R1cmVzID8gMSA6IDApKSB7Ci0gICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKICAgICBjMl9zdGF0dXNfdCBjMl9zdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZpblBhcmFtcyk7CkBAIC00NTksOSArNTMyLDE3IEBACiAgICAgICAgICAgICAgICAgICA8PCAiIHJlc2V0dGluZyBudW0gQkZyYW1lcyB0byAwXG4iOwogICAgICAgICBtQ29uZmlnQlBpY3R1cmVzID0gZmFsc2U7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKLSAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1swXS5nZXQoKTsKLSAgICAgICAgaW50MzJfdCBudW1CRnJhbWVzID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgaW50MzJfdCBudW1CRnJhbWVzID0gMDsKKyAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dCogZ29wID0gQzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dDo6RnJvbShpblBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIGlmIChnb3AgJiYgZ29wLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdvcC0+ZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyR29wTGF5ZXJTdHJ1Y3QmIGxheWVyID0gZ29wLT5tLnZhbHVlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUgfCBCX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBudW1CRnJhbWVzID0gbGF5ZXIuY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmICghbnVtQkZyYW1lcykgewogICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gQmZyYW1lIG5vdCBzdXBwb3J0ZWQgZm9yICIgPDwgbUNvbXBvbmVudE5hbWUKQEAgLTQ2OSw2ICs1NTAsOSBAQAogICAgICAgICAgICAgbUNvbmZpZ0JQaWN0dXJlcyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtV2lkdGgsIG1IZWlnaHQsIG1Db25maWdCUGljdHVyZXMgPyAxIDogMCkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJGYWlsZWQgd2hpbGUgY29uZmlndXJpbmcgaGVpZ2h0IGFuZCB3aWR0aCBmb3IgIiA8PCBtQ29tcG9uZW50TmFtZTsKKyAgICB9CiAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOwogCkBAIC00NzgsNyArNTYyLDcgQEAKICAgICB9CiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lcywgRU5DX05VTV9GUkFNRVMsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lcywgRU5DX05VTV9GUkFNRVMsIG1XaWR0aCwgbUhlaWdodCwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxFT1MpKTsKICAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KICAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNjZWVkZWQKQEAgLTUxMCw5ICs1OTQsOSBAQAogICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CiAgICAgfQogCi0gICAgaWYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IGgyNjMpIHsKKyAgICBpZiAoKG1NaW1lLmZpbmQoInZwOCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB8fCAobU1pbWUuZmluZCgiM2dwcCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgewogICAgICAgICBBU1NFUlRfRkFMU0UobUNzZCkgPDwgIkNTRCBCdWZmZXIgbm90IGV4cGVjdGVkIjsKLSAgICB9IGVsc2UgaWYgKG1Db21wTmFtZSAhPSB2cDkpIHsKKyAgICB9IGVsc2UgaWYgKG1NaW1lLmZpbmQoInZwOSIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICAgIEFTU0VSVF9UUlVFKG1Dc2QpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CiAgICAgfQogCkBAIC01NjgsMTUgKzY1Miw4IEBACiAgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKICAgICBpZiAobURpc2FibGVUZXN0KSBHVEVTVF9TS0lQKCkgPDwgIlRlc3QgaXMgZGlzYWJsZWQiOwogCi0gICAgY2hhciBtVVJMWzUxMl07Ci0gICAgaW50MzJfdCBuV2lkdGggPSBFTkNfREVGQVVMVF9GUkFNRV9XSURUSDsKLSAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQ7Ci0gICAgc3RyY3B5KG1VUkwsIHNSZXNvdXJjZURpci5jX3N0cigpKTsKLSAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7Ci0KLSAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwotICAgICAgICByZXR1cm47CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1XaWR0aCwgbUhlaWdodCkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJGYWlsZWQgd2hpbGUgY29uZmlndXJpbmcgaGVpZ2h0IGFuZCB3aWR0aCBmb3IgIiA8PCBtQ29tcG9uZW50TmFtZTsKICAgICB9CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKIApAQCAtNTg1LDkgKzY2Miw5IEBACiAgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CiAgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEwOwogICAgIHVpbnQzMl90IG51bUZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOwotICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgZWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7Ci0gICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworCiAgICAgLy8gZmx1c2gKICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOwogICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CkBAIC01OTgsNyArNjc1LDcgQEAKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgbURpc2FibGVUZXN0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc0ZsdXNoZWQsIG1XaWR0aCwgbUhlaWdodCwgZmFsc2UsIGZhbHNlKSk7CiAgICAgLy8gbURpc2FibGVUZXN0IHdpbGwgYmUgc2V0IGlmIGJ1ZmZlciB3YXMgbm90IGZldGNoZWQgcHJvcGVybHkuCiAgICAgLy8gVGhpcyBtYXkgaGFwcGVuIHdoZW4gcmVzb2x1dGlvbiBpcyBub3QgcHJvcGVyIGJ1dCBjb25maWcgc3VjY2VlZGVkCiAgICAgLy8gSW4gdGhpcyBjYXNlcywgd2Ugc2tpcCBlbmNvZGluZyB0aGUgaW5wdXQgc3RyZWFtCkBAIC02MTgsOCArNjk1LDggQEAKICAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIE1BWF9JTlBVVF9CVUZGRVJTKTsKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sIG1EaXNhYmxlVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc0ZsdXNoZWQsIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIG5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5IZWlnaHQsIHRydWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lc0ZsdXNoZWQsIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWlnaHQsIHRydWUpKTsKICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKICAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KICAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNjZWVkZWQKQEAgLTY5MCw4ICs3NjcsNyBAQAogCiBjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0CiAgICAgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdEJhc2UsCi0gICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Ci0gICAgICAgICAgICAgIHN0ZDo6dHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzPiB7CiAgICAgdm9pZCBnZXRQYXJhbXMoKSB7CiAgICAgICAgIG1JbnN0YW5jZU5hbWUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKICAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKQEAgLTcwMyw4ICs3NzksOCBAQAogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7CiAKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBpbnQzMl90IG5XaWR0aCA9IHN0ZDo6c3RvaShzdGQ6OmdldDwyPihHZXRQYXJhbSgpKSk7Ci0gICAgaW50MzJfdCBuSGVpZ2h0ID0gc3RkOjpzdG9pKHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpKTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgbkhlaWdodCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOwogICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOwogICAgIG1Fb3MgPSBmYWxzZTsKIApAQCAtNzM1LDM3ICs4MTEsMzQgQEAKICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cmVzZXQoKSwgQzJfT0spOwogfQogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoUGVySW5zdGFuY2UsIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIHRlc3Rpbmc6OlZhbHVlc0luKGtUZXN0UGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChQZXJJbnN0YW5jZSwgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdGVzdGluZzo6VmFsdWVzSW4oZ1Rlc3RQYXJhbWV0ZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQcmludEluc3RhbmNlVHVwbGVOYW1lVG9TdHJpbmc8Pik7CiAKIElOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChOb25TdGRTaXplcywgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50SW5zdGFuY2VUdXBsZU5hbWVUb1N0cmluZzw+KTsKIAogLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUwogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEVuY29kZVRlc3R3aXRoRU9TLCBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihrRW5jb2RlVGVzdFBhcmFtZXRlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKGdFbmNvZGVUZXN0UGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRJbnN0YW5jZVR1cGxlTmFtZVRvU3RyaW5nPD4pOwogCiBURVNUX1AoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgQWRhcHRpdmVCaXRyYXRlVGVzdCkgewogICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUgZm9yIGRpZmZlcmVudCBiaXRyYXRlcyIpOwogICAgIGlmIChtRGlzYWJsZVRlc3QpIEdURVNUX1NLSVAoKSA8PCAiVGVzdCBpcyBkaXNhYmxlZCI7Ci0KLSAgICBjaGFyIG1VUkxbNTEyXTsKLQotICAgIHN0cmNweShtVVJMLCBzUmVzb3VyY2VEaXIuY19zdHIoKSk7Ci0gICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworICAgIGlmIChtTWltZSAhPSAidmlkZW8vYXZjIiAmJiBtTWltZSAhPSAidmlkZW8vaGV2YyIgJiYgbU1pbWUgIT0gInZpZGVvL3gtdm5kLm9uMi52cDgiICYmCisgICAgICAgIG1NaW1lICE9ICJ2aWRlby94LXZuZC5vbjIudnA5IikgeworICAgICAgICBHVEVTVF9TS0lQKCkgPDwgIkFkYXB0aXZlQml0cmF0ZVRlc3QgaXMgZW5hYmxlZCBvbmx5IGZvciBhdmMsIGhldmMsIHZwOCBhbmQgdnA5IGVuY29kZXJzIjsKKyAgICB9CiAKICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOwotICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtSW5wdXRGaWxlIDw8ICIgZmlsZSBub3QgZm91bmQiOwogCiAgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CiAKLSAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOwotICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKLSAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOwotICAgICAgICByZXR1cm47CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1XaWR0aCwgbUhlaWdodCkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJGYWlsZWQgd2hpbGUgY29uZmlndXJpbmcgaGVpZ2h0IGFuZCB3aWR0aCBmb3IgIiA8PCBtQ29tcG9uZW50TmFtZTsKICAgICB9CiAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKIApAQCAtNzg2LDggKzg1OSw4IEBACiAKICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzYWJsZVRlc3QsIGlucHV0RnJhbWVJZCwgRU5DX05VTV9GUkFNRVMsIG5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzYWJsZVRlc3QsIGlucHV0RnJhbWVJZCwgRU5DX05VTV9GUkFNRVMsIG1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKICAgICAgICAgLy8gbURpc2FibGVUZXN0IHdpbGwgYmUgc2V0IGlmIGJ1ZmZlciB3YXMgbm90IGZldGNoZWQgcHJvcGVybHkuCiAgICAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHJlc29sdXRpb24gaXMgbm90IHByb3BlciBidXQgY29uZmlnIHN1Y2NlZWRlZAogICAgICAgICAvLyBJbiB0aGlzIGNhc2VzLCB3ZSBza2lwIGVuY29kaW5nIHRoZSBpbnB1dCBzdHJlYW0KQEAgLTgzNCwzOCArOTA3LDI2IEBACiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIGtUZXN0UGFyYW1ldGVycyA9IGdldFRlc3RQYXJhbWV0ZXJzKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIpOwotICAgIGZvciAoYXV0byBwYXJhbXMgOiBrVGVzdFBhcmFtZXRlcnMpIHsKLSAgICAgICAgY29uc3RleHByIGNoYXIgY29uc3QqIGtCb29sU3RyaW5nW10gPSB7ICJmYWxzZSIsICJ0cnVlIiB9OworICAgIHBhcnNlQXJncyhhcmdjLCBhcmd2KTsKKyAgICBnVGVzdFBhcmFtZXRlcnMgPSBnZXRUZXN0UGFyYW1ldGVycyhDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKKyAgICBmb3IgKGF1dG8gcGFyYW1zIDogZ1Rlc3RQYXJhbWV0ZXJzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMSA8PCAzOyArK2kpIHsKLSAgICAgICAgICAgIGtFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKAotICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLAotICAgICAgICAgICAgICAgICAgICBrQm9vbFN0cmluZ1tpICYgMV0sCi0gICAgICAgICAgICAgICAgICAgIGtCb29sU3RyaW5nWyhpID4+IDEpICYgMV0sCi0gICAgICAgICAgICAgICAgICAgIGtCb29sU3RyaW5nWyhpID4+IDIpICYgMV0pKTsKKyAgICAgICAgICAgIGdFbmNvZGVUZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCBpICYgMSwgKGkgPj4gMSkgJiAxLCAoaSA+PiAyKSAmIDEpKTsKICAgICAgICAgfQogCi0gICAgICAgIGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiNTIiLCAiMTgiKSk7Ci0gICAgICAgIGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiMzY1IiwgIjM2NSIpKTsKLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICI0ODQiLCAiMzYyIikpOwotICAgICAgICBrRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgIjI0NCIsICI0ODgiKSk7Ci0gICAgICAgIGtFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAiODUyIiwgIjYwOCIpKTsKLSAgICAgICAga0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksICIxNDAwIiwgIjQ0MiIpKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIHJlc291cmNlIGRpcmVjdG9yeSBiYXNlZCBvbiBjb21tYW5kIGxpbmUgYXJncy4KLSAgICAvLyBUZXN0IHdpbGwgZmFpbCB0byBzZXQgdXAgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBzZXQuCi0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChhcmd2W2ldLCAiLVAiKSA9PSAwICYmIGkgPCBhcmdjIC0gMSkgewotICAgICAgICAgICAgc1Jlc291cmNlRGlyID0gYXJndltpICsgMV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBnRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgNTIsIDE4KSk7CisgICAgICAgIGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCAzNjUsIDM2NSkpOworICAgICAgICBnRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgNDg0LCAzNjIpKTsKKyAgICAgICAgZ0VuY29kZVJlc29sdXRpb25UZXN0UGFyYW1ldGVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKHN0ZDo6Z2V0PDA+KHBhcmFtcyksIHN0ZDo6Z2V0PDE+KHBhcmFtcyksIDI0NCwgNDg4KSk7CisgICAgICAgIGdFbmNvZGVSZXNvbHV0aW9uVGVzdFBhcmFtZXRlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmdldDwwPihwYXJhbXMpLCBzdGQ6OmdldDwxPihwYXJhbXMpLCA4NTIsIDYwOCkpOworICAgICAgICBnRW5jb2RlUmVzb2x1dGlvblRlc3RQYXJhbWV0ZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoc3RkOjpnZXQ8MD4ocGFyYW1zKSwgc3RkOjpnZXQ8MT4ocGFyYW1zKSwgMTQwMCwgNDQyKSk7CiAgICAgfQogCiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCmluZGV4IDM4NmY2ZTIuLjBlZWVkYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9BbmRyb2lkLmJwCkBAIC0xLDEyICsxLDIwIEBACiAvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKIC8vIHVzZSBsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMgaW5zdGVhZAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMSIsCiAKICAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJPdXRwdXRCdWZmZXJRdWV1ZS5jcHAiLAogICAgICAgICAidHlwZXMuY3BwIiwKICAgICBdLAogCkBAIC00NCw2ICs1MiwxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCiAgICAgICAgICJsaWJ1aSIsCiAgICAgXSwKKworICAgIC8vIERldmljZSBkb2VzIG5vdCBib290IHdoZW4gZ2xvYmFsIFRoaW5MVE8gaXMgZW5hYmxlZCBmb3IgdGhpcyBsaWJyYXJ5LgorICAgIC8vIGh0dHA6Ly9iLzE3MDU5NTQyOQorICAgIGx0bzogeworICAgICAgICBuZXZlcjogdHJ1ZSwKKyAgICB9LAogfQogCiAKQEAgLTg1LDYgKzk5LDcgQEAKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY29kZWMyIiwKICAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLApAQCAtOTksOSArMTE0LDE3IEBACiAgICAgICAgIHZlbmRvcjogewogICAgICAgICAgICAgZXhjbHVkZV9zaGFyZWRfbGliczogWwogICAgICAgICAgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXJfbm92bmRrIiwKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCisgICAgICAgICAgICAgICAgImxpYmNvZGVjMl9oaWRsX3BsdWdpbiIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBhcGV4OiB7CisgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYmNvZGVjMl9oaWRsX3BsdWdpbl9zdHViIiwKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCiAgICAgfSwKQEAgLTE1MiwxNCArMTc1LDMgQEAKICAgICBdLAogfQogCi0vLyBBbGlhcyB0byB0aGUgbGF0ZXN0ICJkZWZhdWx0cyIgZm9yIENvZGVjIDIuMCBIQUwgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMKLWNjX2RlZmF1bHRzIHsKLSAgICBuYW1lOiAibGliY29kZWMyLWhpZGwtZGVmYXVsdHMiLAotICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzQDEuMSJdLAotfQotCi0vLyBBbGlhcyB0byB0aGUgbGF0ZXN0ICJkZWZhdWx0cyIgZm9yIENvZGVjIDIuMCBIQUwgY2xpZW50Ci1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyIsCi0gICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzQDEuMSJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcAppbmRleCBlZDI4MWU2Li4xZDdkM2Q4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMjIsNiArMjIsMTAgQEAKICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50U3RvcmUuaD4KICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjEvSW5wdXRCdWZmZXJNYW5hZ2VyLmg+CiAKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCkBAIC0zOTAsMTAgKzM5NCwxNyBAQAogICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKICAgICAgICAgY3JlYXRlQmxvY2tQb29sX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBibG9ja1Bvb2w7CisjaWZkZWYgX19BTkRST0lEX0FQRVhfXwogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAogICAgICAgICAgICAgbUNvbXBvbmVudCwKICAgICAgICAgICAgICZibG9ja1Bvb2wpOworI2Vsc2UKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDb21wb25lbnRTdG9yZTo6R2V0RmlsdGVyV3JhcHBlcigpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3Q+KGFsbG9jYXRvcklkKSwKKyAgICAgICAgICAgIG1Db21wb25lbnQsCisgICAgICAgICAgICAmYmxvY2tQb29sKTsKKyNlbmRpZgogICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKICAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcAppbmRleCAyMjVjZDA5Li5kNDdhYmRkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvQ29tcG9uZW50U3RvcmUuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMS91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTM1LDYgKzM1LDE0IEBACiAjaW5jbHVkZSA8b3N0cmVhbT4KICNpbmNsdWRlIDxzc3RyZWFtPgogCisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyUGx1Z2luLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPERlZmF1bHRGaWx0ZXJQbHVnaW4uaD4KKyNpbmNsdWRlIDxGaWx0ZXJXcmFwcGVyLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBtZWRpYSB7CkBAIC0xNzYsNiArMTg0LDE2IEBACiAgICAgcmV0dXJuIG1QYXJhbWV0ZXJDYWNoZTsKIH0KIAorI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBDb21wb25lbnRTdG9yZTo6R2V0RmlsdGVyV3JhcHBlcigpIHsKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBrUGx1Z2luUGF0aFtdID0gImxpYmMyZmlsdGVycGx1Z2luLnNvIjsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IHdyYXBwZXIgPSBGaWx0ZXJXcmFwcGVyOjpDcmVhdGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPERlZmF1bHRGaWx0ZXJQbHVnaW4+KGtQbHVnaW5QYXRoKSk7CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisjZW5kaWYKKwogLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCiBSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCkBAIC0xODksNiArMjA3LDkgQEAKICAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyAgICAgICAgYzJjb21wb25lbnQgPSBHZXRGaWx0ZXJXcmFwcGVyKCktPm1heWJlV3JhcENvbXBvbmVudChjMmNvbXBvbmVudCk7CisjZW5kaWYKICAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CiAgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKICAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKQEAgLTIxNiw2ICsyMzcsOSBAQAogICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CiAgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOwogICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmludGVyZmFjZSA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwSW50ZXJmYWNlKGMyaW50ZXJmYWNlKTsKKyNlbmRpZgogICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmludGVyZmFjZSk7CiAgICAgICAgIGludGVyZmFjZSA9IG5ldyBDb21wb25lbnRJbnRlcmZhY2UoYzJpbnRlcmZhY2UsIG1QYXJhbWV0ZXJDYWNoZSk7CiAgICAgfQpAQCAtMzQyLDYgKzM2Niw5IEBACiAgICAgICAgICAgICBtU3RvcmUtPmNyZWF0ZUNvbXBvbmVudChuYW1lLCAmYzJjb21wb25lbnQpKTsKIAogICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgICAgIGMyY29tcG9uZW50ID0gR2V0RmlsdGVyV3JhcHBlcigpLT5tYXliZVdyYXBDb21wb25lbnQoYzJjb21wb25lbnQpOworI2VuZGlmCiAgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOwogICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CiAgICAgICAgIGlmICghY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvT3V0cHV0QnVmZmVyUXVldWUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL091dHB1dEJ1ZmZlclF1ZXVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3NTZlOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvT3V0cHV0QnVmZmVyUXVldWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMS9PdXRwdXRCdWZmZXJRdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudFN0b3JlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50U3RvcmUuaAppbmRleCAxZjA0MzkxLi5mNmRhZWU3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50U3RvcmUuaAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvQ29tcG9uZW50U3RvcmUuaApAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgRmlsdGVyV3JhcHBlcjsKKwogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBtZWRpYSB7CiBuYW1lc3BhY2UgYzIgewpAQCAtNzUsNiArNzcsOCBAQAogICAgICAqLwogICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbWV0ZXJDYWNoZT4gZ2V0UGFyYW1ldGVyQ2FjaGUoKSBjb25zdDsKIAorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gR2V0RmlsdGVyV3JhcHBlcigpOworCiAgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlLgogICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUNvbXBvbmVudCgKICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4xL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4xL091dHB1dEJ1ZmZlclF1ZXVlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvT3V0cHV0QnVmZmVyUXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3ODUyZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjEvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjEvT3V0cHV0QnVmZmVyUXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMV9VVElMU19PVVRQVVRfQlVGRkVSX1FVRVVFCi0jZGVmaW5lIENPREVDMl9ISURMX1YxXzFfVVRJTFNfT1VUUFVUX0JVRkZFUl9RVUVVRQotCi0jaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL091dHB1dEJ1ZmZlclF1ZXVlLmg+Ci0jaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4xL3R5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBoYXJkd2FyZSB7Ci1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIGMyIHsKLW5hbWVzcGFjZSBWMV8xIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6Ok91dHB1dEJ1ZmZlclF1ZXVlOwotCi19IC8vIG5hbWVzcGFjZSB1dGlscwotfSAvLyBuYW1lc3BhY2UgVjFfMQotfSAvLyBuYW1lc3BhY2UgYzIKLX0gLy8gbmFtZXNwYWNlIG1lZGlhCi19IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQ09ERUMyX0hJRExfVjFfMV9VVElMU19PVVRQVVRfQlVGRkVSX1FVRVVFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTRhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIwNiBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIGluc3RlYWQKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjIiLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjIiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4xIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjIiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJsaWJ1aSIsCisgICAgXSwKKworICAgIC8vIERldmljZSBkb2VzIG5vdCBib290IHdoZW4gZ2xvYmFsIFRoaW5MVE8gaXMgZW5hYmxlZCBmb3IgdGhpcyBsaWJyYXJ5LgorICAgIC8vIGh0dHA6Ly9iLzE3MDU5NTQyOQorICAgIGx0bzogeworICAgICAgICBuZXZlcjogdHJ1ZSwKKyAgICB9LAorfQorCisKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbEAxLjIiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgICAgICAidGVzdF9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgIkNvbXBvbmVudFN0b3JlLmNwcCIsCisgICAgICAgICJDb25maWd1cmFibGUuY3BwIiwKKyAgICAgICAgIklucHV0QnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjEiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlcl9ub3ZuZGsiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlcl9ub3ZuZGsiLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW5fc3R1YiIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGFwZXg6IHsKKyAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX3N0dWIiLAorICAgICAgICAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4xIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGlidWkiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzQDEuMiIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4xIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIENvZGVjIDIuMCBIQUwgY2xpZW50CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0c0AxLjIiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjIiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4xIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgIF0sCit9CisKKy8vIEFsaWFzIHRvIHRoZSBsYXRlc3QgImRlZmF1bHRzIiBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWhpZGwtZGVmYXVsdHNAMS4yIl0sCit9CisKKy8vIEFsaWFzIHRvIHRoZSBsYXRlc3QgImRlZmF1bHRzIiBmb3IgQ29kZWMgMi4wIEhBTCBjbGllbnQKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHNAMS4yIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyNGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRAMS4yIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0lucHV0QnVmZmVyTWFuYWdlci5oPgorCisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpbmNsdWRlIDxGaWx0ZXJXcmFwcGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGhpZGwvSGlkbEJpbmRlclN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCisvLyBDb21wb25lbnRMaXN0ZW5lciB3cmFwcGVyCitzdHJ1Y3QgQ29tcG9uZW50OjpMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworCisgICAgTGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgY29tcG9uZW50KSA6CisgICAgICAgIG1Db21wb25lbnQoY29tcG9uZW50KSwKKyAgICAgICAgbUxpc3RlbmVyKGNvbXBvbmVudC0+bUxpc3RlbmVyKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25FcnJvcihTdGF0dXM6Ok9LLCBlcnJvckNvZGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbkVycm9yX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMnNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiBzZXR0aW5nUmVzdWx0cyhjMnNldHRpbmdSZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZjMnJlc3VsdCA6CisgICAgICAgICAgICAgICAgICAgIGMyc2V0dGluZ1Jlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmIChjMnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmc2V0dGluZ1Jlc3VsdHNbaXgrK10sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMucmVzaXplKGl4KTsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vblRyaXBwZWQoc2V0dGluZ1Jlc3VsdHMpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKworICAgICAgICAgICAgc3A8Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGJlZ2luVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgYzJ3b3JrSXRlbXMsIHN0cm9uZ0NvbXBvbmVudCA/CisgICAgICAgICAgICAgICAgICAgICZzdHJvbmdDb21wb25lbnQtPm1CdWZmZXJQb29sU2VuZGVyIDogbnVsbHB0cikpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbldvcmtEb25lX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBjb3JydXB0ZWQgd29yayBpdGVtcy4iOworICAgICAgICAgICAgICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25Xb3JrRG9uZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgd3A8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworfTsKKworLy8gQ29tcG9uZW50OjpTaW5rCitzdHJ1Y3QgQ29tcG9uZW50OjpTaW5rIDogcHVibGljIElJbnB1dFNpbmsgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbXBvbmVudC0+cXVldWUod29ya0J1bmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Db25maWd1cmFibGU7CisgICAgfQorCisgICAgU2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KTsKKyAgICB2aXJ0dWFsIH5TaW5rKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBQcm9jZXNzLXdpZGUgbWFwOiBDb21wb25lbnQ6OlNpbmsgLT4gQzJDb21wb25lbnQuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc1NpbmsyQ29tcG9uZW50TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4gc1NpbmsyQ29tcG9uZW50OworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspOworfTsKKworc3RkOjptdXRleAorICAgICAgICBDb21wb25lbnQ6OlNpbms6OnNTaW5rMkNvbXBvbmVudE11dGV4e307CitzdGQ6Om1hcDxJSW5wdXRTaW5rKiwgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4+CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50e307CisKK0NvbXBvbmVudDo6U2luazo6U2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KQorICAgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgICBtQ29uZmlndXJhYmxle1smY29tcG9uZW50XSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiByZXQxID0gY29tcG9uZW50LT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQxLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBjb21wb25lbnQncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gcmV0MiA9CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbXBvbmVudEludGVyZmFjZT4+KHJldDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBpbnRlcmZhY2UncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4ocmV0Mik7CisgICAgICAgICAgfSgpfSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lbXBsYWNlKHRoaXMsIGNvbXBvbmVudC0+bUNvbXBvbmVudCk7Cit9CisKK0NvbXBvbmVudDo6U2luazo6flNpbmsoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lcmFzZSh0aGlzKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgYXV0byBpID0gc1NpbmsyQ29tcG9uZW50LmZpbmQoc2luay5nZXQoKSk7CisgICAgaWYgKGkgPT0gc1NpbmsyQ29tcG9uZW50LmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaS0+c2Vjb25kLmxvY2soKTsKK30KKworLy8gQ29tcG9uZW50CitDb21wb25lbnQ6OkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICBJQ2xpZW50TWFuYWdlcj4mIGNsaWVudFBvb2xNYW5hZ2VyKQorICAgICAgOiBtQ29tcG9uZW50e2NvbXBvbmVudH0sCisgICAgICAgIG1JbnRlcmZhY2V7bmV3IENvbXBvbmVudEludGVyZmFjZShjb21wb25lbnQtPmludGYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLT5nZXRQYXJhbWV0ZXJDYWNoZSgpKX0sCisgICAgICAgIG1MaXN0ZW5lcntsaXN0ZW5lcn0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye2NsaWVudFBvb2xNYW5hZ2VyfSB7CisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIC8vIFRPRE86IFdlIGNvdWxkIGNhY2hlIHRoaXMgcGVyIGNvbXBvbmVudC9pbnRlcmZhY2UgdHlwZQorICAgIG1Jbml0ID0gbUludGVyZmFjZS0+c3RhdHVzKCk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudDo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMTo6SUNvbXBvbmVudAorUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtzOworCisgICAgaWYgKCFvYmpjcHkoJmMyd29ya3MsIHdvcmtCdW5kbGUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMndvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICByZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnF1ZXVlX25iKCZjMndvcmtzKSk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMmZsdXNoZWRXb3JrczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1Db21wb25lbnQtPmZsdXNoX3NtKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICZjMmZsdXNoZWRXb3Jrcyk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyZmx1c2hlZFdvcmtzKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXb3JrQnVuZGxlIGZsdXNoZWRXb3JrQnVuZGxlOworICAgIFN0YXR1cyByZXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGMycmVzKTsKKyAgICBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUpOworICAgIGlmIChjMnJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAoIW9iamNweSgmZmx1c2hlZFdvcmtCdW5kbGUsIGMyZmx1c2hlZFdvcmtzLCAmbUJ1ZmZlclBvb2xTZW5kZXIpKSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihyZXMsIGZsdXNoZWRXb3JrQnVuZGxlKTsKKyAgICBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzKGMyZmx1c2hlZFdvcmtzLCB0cnVlLCB0cnVlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OmRyYWluKGJvb2wgd2l0aEVvcykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPmRyYWluX25iKHdpdGhFb3MgPworICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyA6CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX05PX0VPUykpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIHVpbnQ2NF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4mIHN1cmZhY2UpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgR2V0Q29kZWMyQmxvY2tQb29sKGJsb2NrUG9vbElkLCBtQ29tcG9uZW50LCAmcG9vbCk7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPiBicVBvb2wgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPihwb29sKTsKKyAgICAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6T25SZW5kZXJDYWxsYmFjayBjYiA9CisgICAgICAgICAgICBbdGhpc10odWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2VjcykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhdGNoIHRoaXMKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkOworICAgICAgICAgICAgICAgIHJlbmRlcmVkLnJlc2l6ZSgxKTsKKyAgICAgICAgICAgICAgICByZW5kZXJlZFswXSA9IHsgcHJvZHVjZXIsIHNsb3QsIG5zZWNzIH07CisgICAgICAgICAgICAgICAgKHZvaWQpbUxpc3RlbmVyLT5vbkZyYW1lc1JlbmRlcmVkKHJlbmRlcmVkKS5pc09rKCk7CisgICAgICAgIH07CisgICAgICAgIGlmIChicVBvb2wpIHsKKyAgICAgICAgICAgIGJxUG9vbC0+c2V0UmVuZGVyQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgYnFQb29sLT5jb25maWd1cmVQcm9kdWNlcihzdXJmYWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGF1dG8gdHJhbnNTdGF0dXMgPSBpbnB1dFN1cmZhY2UtPmNvbm5lY3QoCisgICAgICAgICAgICBhc0lucHV0U2luaygpLAorICAgICAgICAgICAgWyZzdGF0dXMsICZjb25uZWN0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IHNwPElJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSB7CisgICAgKHZvaWQpcHJvZHVjZXI7CisgICAgKHZvaWQpc291cmNlOworICAgICh2b2lkKV9oaWRsX2NiOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICByZXR1cm4gU3RhdHVzOjpPSzsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQmxvY2tQb29sSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIEJsb2NrUG9vbEludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkKKyAgICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZnsKKyAgICAgICAgICAgICAgICAiQzJCbG9ja1Bvb2w6IiArCisgICAgICAgICAgICAgICAgICAgIChwb29sID8gc3RkOjp0b19zdHJpbmcocG9vbC0+Z2V0TG9jYWxJZCgpKSA6ICJudWxsIiksCisgICAgICAgICAgICAgICAgMH0sCisgICAgICAgICAgICBtUG9vbHtwb29sfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiBpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWluZGljZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWZpZWxkczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1Qb29sOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIHVpbnQzMl90IGFsbG9jYXRvcklkLAorICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbDsKKyNpZmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90PihhbGxvY2F0b3JJZCksCisgICAgICAgICAgICBtQ29tcG9uZW50LAorICAgICAgICAgICAgJmJsb2NrUG9vbCk7CisjZWxzZQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENvbXBvbmVudFN0b3JlOjpHZXRGaWx0ZXJXcmFwcGVyKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworI2VuZGlmCisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBibG9ja1Bvb2wgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoYmxvY2tQb29sKSB7CisgICAgICAgIG1CbG9ja1Bvb2xzTXV0ZXgubG9jaygpOworICAgICAgICBtQmxvY2tQb29scy5lbXBsYWNlKGJsb2NrUG9vbC0+Z2V0TG9jYWxJZCgpLCBibG9ja1Bvb2wpOworICAgICAgICBtQmxvY2tQb29sc011dGV4LnVubG9jaygpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyksCisgICAgICAgICAgICBibG9ja1Bvb2wgPyBibG9ja1Bvb2wtPmdldExvY2FsSWQoKSA6IDAsCisgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCbG9ja1Bvb2xJbnRmPihibG9ja1Bvb2wpKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgcmV0dXJuIG1CbG9ja1Bvb2xzLmVyYXNlKGJsb2NrUG9vbElkKSA9PSAxID8KKyAgICAgICAgICAgIFN0YXR1czo6T0sgOiBTdGF0dXM6OkNPUlJVUFRFRDsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdGFydCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdGFydCgpKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpzdG9wKCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnN0b3AoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgU3RhdHVzIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+cmVzZXQoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQmxvY2tQb29sc011dGV4KTsKKyAgICAgICAgbUJsb2NrUG9vbHMuY2xlYXIoKTsKKyAgICB9CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlbGVhc2UoKSk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQmxvY2tQb29sc011dGV4KTsKKyAgICAgICAgbUJsb2NrUG9vbHMuY2xlYXIoKTsKKyAgICB9CisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lcik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBDb21wb25lbnQ6OmdldEludGVyZmFjZSgpIHsKKyAgICByZXR1cm4gc3A8SUNvbXBvbmVudEludGVyZmFjZT4obUludGVyZmFjZSk7Cit9CisKK1JldHVybjxzcDxJSW5wdXRTaW5rPj4gQ29tcG9uZW50Ojphc0lucHV0U2luaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU2lua011dGV4KTsKKyAgICBpZiAoIW1TaW5rKSB7CisgICAgICAgIG1TaW5rID0gbmV3IFNpbmsoc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9CisgICAgcmV0dXJuIHttU2lua307Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbmZpZ3VyZVZpZGVvVHVubmVsKAorICAgICAgICB1aW50MzJfdCBhdlN5bmNId0lkLCBjb25maWd1cmVWaWRlb1R1bm5lbF9jYiBfaGlkbF9jYikgeworICAgICh2b2lkKWF2U3luY0h3SWQ7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPTUlUVEVELCBoaWRsX2hhbmRsZXt9KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2VXaXRoU3luY09iaigKKyAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiYgc3VyZmFjZSwKKyAgICAgICAgY29uc3QgU3VyZmFjZVN5bmNPYmomIHN5bmNPYmplY3QpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CisgICAgR2V0Q29kZWMyQmxvY2tQb29sKGJsb2NrUG9vbElkLCBtQ29tcG9uZW50LCAmcG9vbCk7CisgICAgaWYgKHBvb2wgJiYgcG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSA9PSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPiBicVBvb2wgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sPihwb29sKTsKKyAgICAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6T25SZW5kZXJDYWxsYmFjayBjYiA9CisgICAgICAgICAgICBbdGhpc10odWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2VjcykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGJhdGNoIHRoaXMKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxJQ29tcG9uZW50TGlzdGVuZXI6OlJlbmRlcmVkRnJhbWU+IHJlbmRlcmVkOworICAgICAgICAgICAgICAgIHJlbmRlcmVkLnJlc2l6ZSgxKTsKKyAgICAgICAgICAgICAgICByZW5kZXJlZFswXSA9IHsgcHJvZHVjZXIsIHNsb3QsIG5zZWNzIH07CisgICAgICAgICAgICAgICAgKHZvaWQpbUxpc3RlbmVyLT5vbkZyYW1lc1JlbmRlcmVkKHJlbmRlcmVkKS5pc09rKCk7CisgICAgICAgIH07CisgICAgICAgIGlmIChicVBvb2wpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaCA9IHN5bmNPYmplY3Quc3luY01lbW9yeTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc3luY01lbW9yeSA9IGggPyBuYXRpdmVfaGFuZGxlX2Nsb25lKGgpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQgPSBzeW5jT2JqZWN0LmJxSWQ7CisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uSWQgPSBzeW5jT2JqZWN0LmdlbmVyYXRpb25JZDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSBzeW5jT2JqZWN0LmNvbnN1bWVyVXNhZ2U7CisKKyAgICAgICAgICAgIGJxUG9vbC0+c2V0UmVuZGVyQ2FsbGJhY2soY2IpOworICAgICAgICAgICAgYnFQb29sLT5jb25maWd1cmVQcm9kdWNlcihzdXJmYWNlLCBzeW5jTWVtb3J5LCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uSWQsIGNvbnN1bWVyVXNhZ2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHJldHVybiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgodGhpcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBjMgorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50SW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmU0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29tcG9uZW50SW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudEludGVyZmFjZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhYzVkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw1NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlQDEuMiIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0lucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxEZWZhdWx0RmlsdGVyUGx1Z2luLmg+CisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBTdG9yZUludGYgOiBwdWJsaWMgQ29uZmlndXJhYmxlQzJJbnRmIHsKKyAgICBTdG9yZUludGYoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZntzdG9yZSA/IHN0b3JlLT5nZXROYW1lKCkgOiAiIiwgMH0sCisgICAgICAgICAgICBtU3RvcmV7c3RvcmV9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIHBhcmFtcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtU3RvcmUtPmNvbmZpZ19zbShwYXJhbXMsIGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBhcmFtcyBhcmUgYmxvY2tpbmcKKyAgICAgICAgLy8gVE9ETzogRmlsdGVyIGZvciBzdXBwb3J0ZWQgcGFyYW1zCisgICAgICAgIGlmIChtYXlCbG9jayA9PSBDMl9ET05UX0JMT0NLICYmIGluZGljZXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5xdWVyeV9zbSh7fSwgaW5kaWNlcywgcGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtU3RvcmUtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBmaWVsZHMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShmaWVsZHMpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTo6U3RvcmVQYXJhbWV0ZXJDYWNoZSA6IHB1YmxpYyBQYXJhbWV0ZXJDYWNoZSB7CisgICAgc3RkOjptdXRleCBtU3RvcmVNdXRleDsKKyAgICBDb21wb25lbnRTdG9yZSogbVN0b3JlOworCisgICAgU3RvcmVQYXJhbWV0ZXJDYWNoZShDb21wb25lbnRTdG9yZSogc3RvcmUpOiBtU3RvcmV7c3RvcmV9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHZhbGlkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcworICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgX2xvY2sobVN0b3JlTXV0ZXgpOworICAgICAgICByZXR1cm4gbVN0b3JlID8gbVN0b3JlLT52YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpIDogQzJfTk9fSU5JVDsKKyAgICB9CisKKyAgICB2b2lkIG9uU3RvcmVEZXN0cm95ZWQoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgX2xvY2sobVN0b3JlTXV0ZXgpOworICAgICAgICBtU3RvcmUgPSBudWxscHRyOworICAgIH0KK307CisKK0NvbXBvbmVudFN0b3JlOjpDb21wb25lbnRTdG9yZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoc3RkOjptYWtlX3VuaXF1ZTxTdG9yZUludGY+KHN0b3JlKSl9LAorICAgICAgICBtUGFyYW1ldGVyQ2FjaGV7c3RkOjptYWtlX3NoYXJlZDxTdG9yZVBhcmFtZXRlckNhY2hlPih0aGlzKX0sCisgICAgICAgIG1TdG9yZXtzdG9yZX0geworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgU2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoc3RvcmUpOworCisgICAgLy8gUmV0cmlldmUgc3RydWN0IGRlc2NyaXB0b3JzCisgICAgbVBhcmFtUmVmbGVjdG9yID0gbVN0b3JlLT5nZXRQYXJhbVJlZmxlY3RvcigpOworCisgICAgLy8gUmV0cmlldmUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBzdG9yZQorICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnBsYWNlaG9sZGVyczsKKyAgICBtSW5pdCA9IG1Db25maWd1cmFibGUtPmluaXQobVBhcmFtZXRlckNhY2hlKTsKK30KKworQ29tcG9uZW50U3RvcmU6On5Db21wb25lbnRTdG9yZSgpIHsKKyAgICBtUGFyYW1ldGVyQ2FjaGUtPm9uU3RvcmVEZXN0cm95ZWQoKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudFN0b3JlOjp2YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcykgeworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1zKSB7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgLy8gQWxsIGRlc2NyaXB0b3JzIHNob3VsZCBiZSB2YWxpZAorICAgICAgICAgICAgcmVzID0gcmVzID8gcmVzIDogQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IGRlc2MtPmluZGV4KCkuY29yZUluZGV4KCk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdCA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2MgPQorICAgICAgICAgICAgICAgICAgICBtUGFyYW1SZWZsZWN0b3ItPmRlc2NyaWJlKGNvcmVJbmRleCk7CisgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgc3VwcG9ydGVkIHBhcmFtcyBtdXN0IGJlIGRlc2NyaWJlZAorICAgICAgICAgICAgICAgIHJlcyA9IEMyX0JBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjpzaGFyZWRfcHRyPFBhcmFtZXRlckNhY2hlPiBDb21wb25lbnRTdG9yZTo6Z2V0UGFyYW1ldGVyQ2FjaGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJDYWNoZTsKK30KKworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBDb21wb25lbnRTdG9yZTo6R2V0RmlsdGVyV3JhcHBlcigpIHsKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBrUGx1Z2luUGF0aFtdID0gImxpYmMyZmlsdGVycGx1Z2luLnNvIjsKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IHdyYXBwZXIgPSBGaWx0ZXJXcmFwcGVyOjpDcmVhdGUoCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPERlZmF1bHRGaWx0ZXJQbHVnaW4+KGtQbHVnaW5QYXRoKSk7CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisjZW5kaWYKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgeworCisgICAgc3A8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMmNvbXBvbmVudDsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPigKKyAgICAgICAgICAgIG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KG5hbWUsICZjMmNvbXBvbmVudCkpOworCisgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisjaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyAgICAgICAgYzJjb21wb25lbnQgPSBHZXRGaWx0ZXJXcmFwcGVyKCktPm1heWJlV3JhcENvbXBvbmVudChjMmNvbXBvbmVudCk7CisjZW5kaWYKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CisgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKKyAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwb3J0Q29tcG9uZW50QmlydGgoY29tcG9uZW50LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGMyaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CisgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmludGVyZmFjZSA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwSW50ZXJmYWNlKGMyaW50ZXJmYWNlKTsKKyNlbmRpZgorICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmludGVyZmFjZSk7CisgICAgICAgIGludGVyZmFjZSA9IG5ldyBDb21wb25lbnRJbnRlcmZhY2UoYzJpbnRlcmZhY2UsIG1QYXJhbWV0ZXJDYWNoZSk7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4ocmVzKSwgaW50ZXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6Omxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBjMnRyYWl0cyA9CisgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisgICAgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+IHRyYWl0cyhjMnRyYWl0cy5zaXplKCkpOworICAgIHNpemVfdCBpeCA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJmMydHJhaXQgOiBjMnRyYWl0cykgeworICAgICAgICBpZiAoYzJ0cmFpdCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmdHJhaXRzW2l4XSwgKmMydHJhaXQpKSB7CisgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgdHJhaXRzLnJlc2l6ZShpeCk7CisgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgdHJhaXRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBzb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgpOworICAgIGlmIChzb3VyY2UtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6Q09SUlVQVEVELCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6cGxhY2Vob2xkZXJzOworICAgIHNwPElucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0gbmV3IElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJDYWNoZSwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCksCisgICAgICAgICAgICBzb3VyY2UtPmdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgIHNvdXJjZSk7CisgICAgX2hpZGxfY2IoaW5wdXRTdXJmYWNlID8gU3RhdHVzOjpPSyA6IFN0YXR1czo6Tk9fTUVNT1JZLAorICAgICAgICAgICAgIGlucHV0U3VyZmFjZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDb21wb25lbnRTdG9yZTo6b25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIC8vIGludmFsaWRhdGUgdW5zdXBwb3J0ZWQgc3RydWN0IGRlc2NyaXB0b3JzIGlmIGEgbmV3IGludGVyZmFjZSBpcyBsb2FkZWQgYXMgaXQgbWF5IGhhdmUKKyAgICAvLyBleHBvc2VkIG5ldyBkZXNjcmlwdG9ycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICBpZiAoIW1Mb2FkZWRJbnRlcmZhY2VzLmNvdW50KGludGYtPmdldE5hbWUoKSkpIHsKKyAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuY2xlYXIoKTsKKyAgICAgICAgbUxvYWRlZEludGVyZmFjZXMuZW1wbGFjZShpbnRmLT5nZXROYW1lKCkpOworICAgIH0KK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpnZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgeworICAgIGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKGluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgZHN0SXggPSAwOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIGZvciAoc2l6ZV90IHNyY0l4ID0gMDsgc3JjSXggPCBpbmRpY2VzLnNpemUoKTsgKytzcmNJeCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RydWN0RGVzY3JpcHRvcnNNdXRleCk7CisgICAgICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoaW5kaWNlc1tzcmNJeF0pLmNvcmVJbmRleCgpOworICAgICAgICBjb25zdCBhdXRvIGl0ZW0gPSBtU3RydWN0RGVzY3JpcHRvcnMuZmluZChjb3JlSW5kZXgpOworICAgICAgICBpZiAoaXRlbSA9PSBtU3RydWN0RGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIG5vdCBpbiB0aGUgY2FjaGUsIGFuZCBub3Qga25vd24gdG8gYmUgdW5zdXBwb3J0ZWQsIHF1ZXJ5IGxvY2FsIHJlZmxlY3RvcgorICAgICAgICAgICAgaWYgKCFtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jb3VudChjb3JlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgbVVuc3VwcG9ydGVkU3RydWN0RGVzY3JpcHRvcnMuZW1wbGFjZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJ1Y3REZXNjcmlwdG9ycy5pbnNlcnQoeyBjb3JlSW5kZXgsIHN0cnVjdERlc2MgfSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvYmpjcHkoJmRlc2NyaXB0b3JzW2RzdEl4XSwgKnN0cnVjdERlc2MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2RzdEl4OworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0tPnNlY29uZCkgeworICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqaXRlbS0+c2Vjb25kKSkgeworICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNjcmlwdG9ycy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgZGVzY3JpcHRvcnMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IENvbXBvbmVudFN0b3JlOjpnZXRQb29sQ2xpZW50TWFuYWdlcigpIHsKKyAgICByZXR1cm4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoY29uc3QgQnVmZmVyJiBzcmMsIGNvbnN0IEJ1ZmZlciYgZHN0KSB7CisgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIHJldHVybiBTdGF0dXM6Ok9NSVRURUQ7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gQ29tcG9uZW50U3RvcmU6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMTo6SUNvbXBvbmVudFN0b3JlCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudF8xXzEoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICBjcmVhdGVDb21wb25lbnRfMV8xX2NiIF9oaWRsX2NiKSB7CisKKyAgICBzcDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGMyY29tcG9uZW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KAorICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CisKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyNpZm5kZWYgX19BTkRST0lEX0FQRVhfXworICAgICAgICBjMmNvbXBvbmVudCA9IEdldEZpbHRlcldyYXBwZXIoKS0+bWF5YmVXcmFwQ29tcG9uZW50KGMyY29tcG9uZW50KTsKKyNlbmRpZgorICAgICAgICBvbkludGVyZmFjZUxvYWRlZChjMmNvbXBvbmVudC0+aW50ZigpKTsKKyAgICAgICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudChjMmNvbXBvbmVudCwgbGlzdGVuZXIsIHRoaXMsIHBvb2wpOworICAgICAgICBpZiAoIWNvbXBvbmVudCkgeworICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXBvcnRDb21wb25lbnRCaXJ0aChjb21wb25lbnQuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21wb25lbnQtPmluaXRMaXN0ZW5lcihjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXR1cywgY29tcG9uZW50KTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8yOjpJQ29tcG9uZW50U3RvcmUKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHBvb2wsCisgICAgICAgIGNyZWF0ZUNvbXBvbmVudF8xXzJfY2IgX2hpZGxfY2IpIHsKKworICAgIHNwPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gYzJjb21wb25lbnQ7CisgICAgU3RhdHVzIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oCisgICAgICAgICAgICBtU3RvcmUtPmNyZWF0ZUNvbXBvbmVudChuYW1lLCAmYzJjb21wb25lbnQpKTsKKworICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgICAgIGMyY29tcG9uZW50ID0gR2V0RmlsdGVyV3JhcHBlcigpLT5tYXliZVdyYXBDb21wb25lbnQoYzJjb21wb25lbnQpOworI2VuZGlmCisgICAgICAgIG9uSW50ZXJmYWNlTG9hZGVkKGMyY29tcG9uZW50LT5pbnRmKCkpOworICAgICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGMyY29tcG9uZW50LCBsaXN0ZW5lciwgdGhpcywgcG9vbCk7CisgICAgICAgIGlmICghY29tcG9uZW50KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcG9ydENvbXBvbmVudEJpcnRoKGNvbXBvbmVudC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oY29tcG9uZW50LT5zdGF0dXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+aW5pdExpc3RlbmVyKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC0+c3RhdHVzKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb21wb25lbnQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIENhbGxlZCBmcm9tIGNyZWF0ZUNvbXBvbmVudCgpIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiBgY29tcG9uZW50YC4KK3ZvaWQgQ29tcG9uZW50U3RvcmU6OnJlcG9ydENvbXBvbmVudEJpcnRoKENvbXBvbmVudCogY29tcG9uZW50KSB7CisgICAgQ29tcG9uZW50U3RhdHVzIGNvbXBvbmVudFN0YXR1czsKKyAgICBjb21wb25lbnRTdGF0dXMuYzJDb21wb25lbnQgPSBjb21wb25lbnQtPm1Db21wb25lbnQ7CisgICAgY29tcG9uZW50U3RhdHVzLmJpcnRoVGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICBtQ29tcG9uZW50Um9zdGVyLmVtcGxhY2UoY29tcG9uZW50LCBjb21wb25lbnRTdGF0dXMpOworfQorCisvLyBDYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGRlc3RydWN0b3Igb2YgYGNvbXBvbmVudGAuIE5vIHZpcnR1YWwgZnVuY3Rpb24gY2FsbHMKKy8vIGFyZSBtYWRlIG9uIGBjb21wb25lbnRgIGhlcmUuCit2b2lkIENvbXBvbmVudFN0b3JlOjpyZXBvcnRDb21wb25lbnREZWF0aChDb21wb25lbnQqIGNvbXBvbmVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgbUNvbXBvbmVudFJvc3Rlci5lcmFzZShjb21wb25lbnQpOworfQorCisvLyBEdW1wcyBjb21wb25lbnQgdHJhaXRzLgorc3RkOjpvc3RyZWFtJiBDb21wb25lbnRTdG9yZTo6ZHVtcCgKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCkgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJuYW1lOiAiIDw8IGNvbXAtPm5hbWUgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImRvbWFpbjogIiA8PCBjb21wLT5kb21haW4gPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgImtpbmQ6ICIgPDwgY29tcC0+a2luZCA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAicmFuazogIiA8PCBjb21wLT5yYW5rIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJtZWRpYVR5cGU6ICIgPDwgY29tcC0+bWVkaWFUeXBlIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJhbGlhc2VzOiI7CisgICAgZm9yIChjb25zdCBhdXRvJiBhbGlhcyA6IGNvbXAtPmFsaWFzZXMpIHsKKyAgICAgICAgb3V0IDw8ICcgJyA8PCBhbGlhczsKKyAgICB9CisgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKy8vIER1bXBzIGNvbXBvbmVudCBzdGF0dXMuCitzdGQ6Om9zdHJlYW0mIENvbXBvbmVudFN0b3JlOjpkdW1wKAorICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgQ29tcG9uZW50U3RhdHVzJiBjb21wU3RhdHVzKSB7CisKKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICAgIjsKKworICAgIC8vIFByaW50IGJpcnRoIHRpbWUuCisgICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyBtcyA9CisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPigKKyAgICAgICAgICAgICAgICBjb21wU3RhdHVzLmJpcnRoVGltZS50aW1lX3NpbmNlX2Vwb2NoKCkpOworICAgIHN0ZDo6dGltZV90IGJpcnRoVGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRvX3RpbWVfdCgKKyAgICAgICAgICAgIGNvbXBTdGF0dXMuYmlydGhUaW1lKTsKKyAgICBzdGQ6OnRtIHRtID0gKnN0ZDo6bG9jYWx0aW1lKCZiaXJ0aFRpbWUpOworICAgIG91dCA8PCBpbmRlbnQgPDwgIkNyZWF0aW9uIHRpbWU6ICIKKyAgICAgICAgPDwgc3RkOjpwdXRfdGltZSgmdG0sICIlWS0lbS0lZCAlSDolTTolUyIpCisgICAgICAgIDw8ICcuJyA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OnNldHcoMykgPDwgbXMuY291bnQoKSAlIDEwMDAKKyAgICAgICAgPDwgc3RkOjplbmRsOworCisgICAgLy8gUHJpbnQgbmFtZSBhbmQgaWQuCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmID0gY29tcFN0YXR1cy5jMkNvbXBvbmVudC0+aW50ZigpOworICAgIGlmICghaW50ZikgeworICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJVbmtub3duIGNvbXBvbmVudCAtLSBudWxsIGludGVyZmFjZSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gb3V0OworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50IDw8ICJOYW1lOiAiIDw8IGludGYtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiSWQ6ICIgPDwgaW50Zi0+Z2V0SWQoKSA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wcyBpbmZvcm1hdGlvbiB3aGVuIGxzaGFsIGlzIGNhbGxlZC4KK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6ZGVidWcoCisgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiYgLyogYXJncyAqLykgeworICAgIExPRyhJTkZPKSA8PCAiZGVidWcgLS0gZHVtcGluZy4uLiI7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoID0gaGFuZGxlLmdldE5hdGl2ZUhhbmRsZSgpOworICAgIGlmICghaCB8fCBoLT5udW1GZHMgIT0gMSkgeworICAgICAgIExPRyhFUlJPUikgPDwgImRlYnVnIC0tIGR1bXBpbmcgZmFpbGVkIC0tICIKKyAgICAgICAgICAgICAgICJpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciB0byBkdW1wIHRvIjsKKyAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgICAgeyAvLyBQb3B1bGF0ZSAib3V0Ii4KKworICAgICAgICBjb25zdGV4cHIgY29uc3QgY2hhciBpbmRlbnRbXSA9ICIgICI7CisKKyAgICAgICAgLy8gU2hvdyBuYW1lLgorICAgICAgICBvdXQgPDwgIkJlZ2lubmluZyBvZiBkdW1wIC0tIEMyQ29tcG9uZW50U3RvcmU6ICIKKyAgICAgICAgICAgICAgICA8PCBtU3RvcmUtPmdldE5hbWUoKSA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworCisgICAgICAgIC8vIFJldHJpZXZlIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb21wb25lbnRzLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IHRyYWl0c0xpc3QgPQorICAgICAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKworICAgICAgICAvLyBEdW1wIHRoZSB0cmFpdHMgb2Ygc3VwcG9ydGVkIGNvbXBvbmVudHMuCisgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIlN1cHBvcnRlZCBjb21wb25lbnRzOiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgaWYgKHRyYWl0c0xpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgaW5kZW50IDw8ICJOT05FIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFpdHMgOiB0cmFpdHNMaXN0KSB7CisgICAgICAgICAgICAgICAgZHVtcChvdXQsIHRyYWl0cykgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRHVtcCBhY3RpdmUgY29tcG9uZW50cy4KKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiQWN0aXZlIGNvbXBvbmVudHM6IiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNvbXBvbmVudFJvc3Rlck11dGV4KTsKKyAgICAgICAgICAgIGlmIChtQ29tcG9uZW50Um9zdGVyLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCA8PCBpbmRlbnQgPDwgIk5PTkUiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGFpciA6IG1Db21wb25lbnRSb3N0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZHVtcChvdXQsIHBhaXIuc2Vjb25kKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJFbmQgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIH0KKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZkKG91dC5zdHIoKSwgaC0+ZGF0YVswXSkpIHsKKyAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiZGVidWcgLS0gZHVtcGluZyBmYWlsZWQgLS0gd3JpdGUoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKElORk8pIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIHN1Y2NlZWRlZCI7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBjMgorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29uZmlndXJhYmxlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9Db25maWd1cmFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Mzg3MGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvQ29uZmlndXJhYmxlLmNwcApAQCAtMCwwICsxLDE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0NvbmZpZ3VyYWJsZS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvSW5wdXRCdWZmZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTIwMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9JbnB1dFN1cmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL0lucHV0U3VyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ZDI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9JbnB1dFN1cmZhY2UuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvSW5wdXRTdXJmYWNlLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkNThjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3NjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzJfVVRJTFNfQ09NUE9ORU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT01QT05FTlRfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4yL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjIvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8yIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8yOjpJQ29tcG9uZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50TGlzdGVuZXI7CisKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUJpbmRlcjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OndwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK3N0cnVjdCBDb21wb25lbnQgOiBwdWJsaWMgSUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDb21wb25lbnQ+IHsKKyAgICBDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgICAgICBJQ2xpZW50TWFuYWdlcj4mIGNsaWVudFBvb2xNYW5hZ2VyKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMjsKKworICAgIC8vIE1ldGhvZHMgZnJvbSBJQ29tcG9uZW50IGZvbGxvdy4KKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRyYWluKGJvb2wgd2l0aEVvcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxPiYgcHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gZ2V0SW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUlucHV0U2luaz4+IGFzSW5wdXRTaW5rKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlndXJlVmlkZW9UdW5uZWwoCisgICAgICAgICAgICB1aW50MzJfdCBhdlN5bmNId0lkLCBjb25maWd1cmVWaWRlb1R1bm5lbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzZXRPdXRwdXRTdXJmYWNlV2l0aFN5bmNPYmooCisgICAgICAgICAgICB1aW50NjRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiYgc3VyZmFjZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VTeW5jT2JqJiBzeW5jT2JqZWN0KSBvdmVycmlkZTsKKworCisgICAgLy8gUmV0dXJucyBhIEMyQ29tcG9uZW50IGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHNpbmsgaWYgdGhlIHNpbmsgaXMgaW5kZWVkCisgICAgLy8gYSBsb2NhbCBjb21wb25lbnQuIFJldHVybnMgbnVsbHB0ciBvdGhlcndpc2UuCisgICAgLy8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgSW5wdXRTdXJmYWNlOjpjb25uZWN0KCkuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspOworCitwcm90ZWN0ZWQ6CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHNwPENvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjo6dXRpbHM6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyCisgICAgICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcjsKKworICAgIHN0cnVjdCBTaW5rOworICAgIHN0ZDo6bXV0ZXggbVNpbmtNdXRleDsKKyAgICBzcDxTaW5rPiBtU2luazsKKworICAgIHN0ZDo6bXV0ZXggbUJsb2NrUG9vbHNNdXRleDsKKyAgICAvLyBUaGlzIG1hcCBrZWVwcyBDMkJsb2NrUG9vbCBvYmplY3RzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgY3JlYXRlQmxvY2tQb29sKCkKKyAgICAvLyBhbGl2ZS4gVGhlc2UgQzJCbG9ja1Bvb2wgb2JqZWN0cyBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nCisgICAgLy8gZGVzdHJveUJsb2NrUG9vbCgpLCByZXNldCgpIG9yIHJlbGVhc2UoKSwgb3IgYnkgZGVzdHJveWluZyB0aGUgY29tcG9uZW50LgorICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKKworICAgIHZvaWQgaW5pdExpc3RlbmVyKGNvbnN0IHNwPENvbXBvbmVudD4mIHNlbGYpOworCisgICAgdmlydHVhbCB+Q29tcG9uZW50KCkgb3ZlcnJpZGU7CisKKyAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOworCisgICAgc3RydWN0IExpc3RlbmVyOworfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENPREVDMl9ISURMX1YxXzJfVVRJTFNfQ09NUE9ORU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ5ZjkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6Q29tcG9uZW50SW50ZXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1YTY1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRTdG9yZS5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzJfVVRJTFNfQ09NUE9ORU5UX1NUT1JFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT01QT05FTlRfU1RPUkVfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjIvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBGaWx0ZXJXcmFwcGVyOworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgSUNvbXBvbmVudFN0b3JlIHsKKyAgICBDb21wb25lbnRTdG9yZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKyAgICB2aXJ0dWFsIH5Db21wb25lbnRTdG9yZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDYWNoZWRDb25maWd1cmFibGU6OmluaXQoKSB0byB2YWxpZGF0ZQorICAgICAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSdzIFBhcmFtZXRlckNhY2hlLiBUaGlzIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gYnkKKyAgICAgKiBDb25maWd1cmFibGU6OmluaXQoKS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1ldGVyQ2FjaGU+IGdldFBhcmFtZXRlckNhY2hlKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZpbHRlcldyYXBwZXI+IEdldEZpbHRlcldyYXBwZXIoKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiBnZXRQb29sQ2xpZW50TWFuYWdlcigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzE6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnRfMV8xKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudF8xXzFfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjo6SUNvbXBvbmVudFN0b3JlLgorICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUNvbXBvbmVudF8xXzIoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50XzFfMl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyBpbmZvcm1hdGlvbiB3aGVuIGxzaGFsIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkZWJ1ZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworICAgIHN0cnVjdCBTdG9yZVBhcmFtZXRlckNhY2hlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdG9yZVBhcmFtZXRlckNhY2hlPiBtUGFyYW1ldGVyQ2FjaGU7CisKKyAgICAvLyBEb2VzIGJvb2trZWVwaW5nIGZvciBhbiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnRTdG9yZSBrZWVwcyB0cmFjayBvZiBsaXZlIENvbXBvbmVudHMuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMkNvbXBvbmVudDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBiaXJ0aFRpbWU7CisgICAgfTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ29tcG9uZW50Um9zdGVyTXV0ZXg7CisgICAgc3RkOjptYXA8Q29tcG9uZW50KiwgQ29tcG9uZW50U3RhdHVzPiBtQ29tcG9uZW50Um9zdGVyOworCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIENvbXBvbmVudCBpcyBjcmVhdGVkLgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworICAgIC8vIENhbGxlZCBvbmx5IGZyb20gdGhlIGRlc3RydWN0b3Igb2YgQ29tcG9uZW50LgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworCisgICAgZnJpZW5kIENvbXBvbmVudDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGR1bXBpbmcuCisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCk7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cyk7CisKK307CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBjMgorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDT0RFQzJfSElETF9WMV8yX1VUSUxTX0NPTVBPTkVOVF9TVE9SRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29uZmlndXJhYmxlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvQ29uZmlndXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmYWQzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9Db25maWd1cmFibGUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzJfVVRJTFNfQ09ORklHVVJBQkxFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMl9VVElMU19DT05GSUdVUkFCTEVfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpDb25maWd1cmFibGVDMkludGY7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpQYXJhbWV0ZXJDYWNoZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkNhY2hlZENvbmZpZ3VyYWJsZTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGMyCit9IC8vIG5hbWVzcGFjZSBtZWRpYQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENPREVDMl9ISURMX1YxXzJfVVRJTFNfQ09ORklHVVJBQkxFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9JbnB1dEJ1ZmZlck1hbmFnZXIuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9JbnB1dEJ1ZmZlck1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGE1ZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0lucHV0QnVmZmVyTWFuYWdlci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzJfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpJbnB1dEJ1ZmZlck1hbmFnZXI7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBjMgorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDT0RFQzJfSElETF9WMV8yX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFlODZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9TVVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzIgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6SW5wdXRTdXJmYWNlOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMi9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYThhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8yX1VUSUxTX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOworCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgYzIKK30gLy8gbmFtZXNwYWNlIG1lZGlhCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQ09ERUMyX0hJRExfVjFfMl9VVElMU19JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL3R5cGVzLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjIvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzE4MGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4yL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4yL3R5cGVzLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMl9VVElMU19UWVBFU19ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzJfVVRJTFNfVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjIvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMi9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzIgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OkJhc2VCbG9jazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6QmxvY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OkJ1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6RmllbGREZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpGaWVsZElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpGaWVsZFN1cHBvcnRlZFZhbHVlczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6RnJhbWVEYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJbmZvQnVmZmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpQYXJhbURlc2NyaXB0b3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlBhcmFtRmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlBhcmFtRmllbGRWYWx1ZXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlBhcmFtSW5kZXg7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlBhcmFtczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6UHJpbWl0aXZlVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlNldHRpbmdSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6U3RydWN0RGVzY3JpcHRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6VmFsdWVSYW5nZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6V29yazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6V29ya0J1bmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6V29ya09yZGluYWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OldvcmtsZXQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjo6U3VyZmFjZVN5bmNPYmo7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudEludGVyZmFjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbXBvbmVudExpc3RlbmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29uZmlndXJhYmxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTaW5rOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjsKKworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6dG9DMlN0YXR1czsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6QzJIaWRsX1JhbmdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6QzJIaWRsX1JhbmdlSW5mbzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkMySGlkbF9SZWN0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6QzJIaWRsX1JlY3RJbmZvOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpvYmpjcHk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpwYXJzZVBhcmFtc0Jsb2I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpjcmVhdGVQYXJhbXNCbG9iOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6Y29weVBhcmFtc0Zyb21CbG9iOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6dXBkYXRlUGFyYW1zRnJvbUJsb2I7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkJ1ZmZlclBvb2xTZW5kZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6YmVnaW5UcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjplbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjplbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2tzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6ZGlzcGxheUJ1ZmZlclF1ZXVlQmxvY2s7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6Om9wZXJhdG9yPDw7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBjMgorfSAvLyBuYW1lc3BhY2UgbWVkaWEKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDT0RFQzJfSElETF9WMV8yX1VUSUxTX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMi91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGEwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjIvdXRpbHMvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvdHlwZXMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKaW5kZXggM2MzNzk5MC4uMGU1MjgxMyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTEsOCArMSwyMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliY29kZWMyX2NsaWVudCIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJjbGllbnQuY3BwIiwKKyAgICAgICAgIm91dHB1dC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMTAsMTEgKzI0LDEzIEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKICAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjEiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMiIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliZ3VpIiwKQEAgLTMyLDExICs0OCwxMiBAQAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yIiwKICAgICAgICAgImxpYmNvZGVjMiIsCiAgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKICAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjEiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMiIsCiAgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCiAgICAgXSwKIAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCmluZGV4IDdlNDM1MmQuLjQyYjNjNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9jbGllbnQuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+IC8vIGZvciBDMlN0cmVhbVVzYWdlVHVuaW5nCiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KQEAgLTMzLDE1ICszNCwxOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvT3V0cHV0QnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjEvT3V0cHV0QnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjEvdHlwZXMuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9vdXRwdXQuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzIuMC9CMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4gLy8gZm9yIEdSQUxMT0NfVVNBR0VfKgogI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+IC8vIGZvciBOQVRJVkVfV0lORE9XX1FVRVJZXyoKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPiAvLyBmb3IgYXNTdHJpbmcoc3RhdHVzX3QpCisKIAogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPGl0ZXJhdG9yPgpAQCAtNzMsMTIgKzc4LDE3IEBACiAgICAgICAgIFYyXzA6OnV0aWxzOjpCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiB1c2luZyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKICAgICAgICAgVjJfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjo6U3VyZmFjZVN5bmNPYmo7CiAKIG5hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKIAogLy8gYzJfc3RhdHVzX3QgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byBod2JpbmRlciB0cmFuc2FjdGlvbiBmYWlsdXJlLgogY29uc3RleHByIGMyX3N0YXR1c190IEMyX1RSQU5TQUNUSU9OX0ZBSUxFRCA9IEMyX0NPUlJVUFRFRDsKIAorLy8gQnkgZGVmYXVsdCBwcmVwYXJlIGJ1ZmZlciB0byBiZSBkaXNwbGF5ZWQgb24gYW55IG9mIHRoZSBjb21tb24gc3VyZmFjZXMKK2NvbnN0ZXhwciB1aW50NjRfdCBrRGVmYXVsdENvbnN1bWVyVXNhZ2UgPQorICAgIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSKTsKKwogLy8gU2VhcmNoZXMgZm9yIGEgbmFtZSBpbiBHZXRTZXJ2aWNlTmFtZXMoKSBhbmQgcmV0dXJucyB0aGUgaW5kZXggZm91bmQuIElmIHRoZQogLy8gbmFtZSBpcyBub3QgZm91bmQsIHRoZSByZXR1cm5lZCBpbmRleCB3aWxsIGJlIGVxdWFsIHRvCiAvLyBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCkuCkBAIC01OTIsOSArNjAyLDkgQEAKIAogLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6Ok91dHB1dEJ1ZmZlclF1ZXVlCiBzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6Ok91dHB1dEJ1ZmZlclF1ZXVlIDoKLSAgICAgICAgaGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMTo6dXRpbHM6Ok91dHB1dEJ1ZmZlclF1ZXVlIHsKKyAgICAgICAgaGFyZHdhcmU6Om1lZGlhOjpjMjo6T3V0cHV0QnVmZmVyUXVldWUgewogICAgIE91dHB1dEJ1ZmZlclF1ZXVlKCkKLSAgICAgICAgICA6IGhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzE6OnV0aWxzOjpPdXRwdXRCdWZmZXJRdWV1ZSgpIHsKKyAgICAgICAgICA6IGhhcmR3YXJlOjptZWRpYTo6YzI6Ok91dHB1dEJ1ZmZlclF1ZXVlKCkgewogICAgIH0KIH07CiAKQEAgLTYxMiw2ICs2MjIsNyBAQAogICAgICAgICB9LAogICAgICAgICBtQmFzZTFfMHtiYXNlfSwKICAgICAgICAgbUJhc2UxXzF7QmFzZTFfMTo6Y2FzdEZyb20oYmFzZSl9LAorICAgICAgICBtQmFzZTFfMntCYXNlMV8yOjpjYXN0RnJvbShiYXNlKX0sCiAgICAgICAgIG1TZXJ2aWNlSW5kZXh7c2VydmljZUluZGV4fSB7CiAgICAgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gdHJhbnNSZXN1bHQgPSBiYXNlLT5nZXRQb29sQ2xpZW50TWFuYWdlcigpOwogICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CkBAIC02MzMsNiArNjQ0LDEwIEBACiAgICAgcmV0dXJuIG1CYXNlMV8xOwogfQogCitzcDxDb2RlYzJDbGllbnQ6OkJhc2UxXzI+IGNvbnN0JiBDb2RlYzJDbGllbnQ6OmdldEJhc2UxXzIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlMV8yOworfQorCiBzdGQ6OnN0cmluZyBjb25zdCYgQ29kZWMyQ2xpZW50OjpnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0U2VydmljZU5hbWVzKClbbVNlcnZpY2VJbmRleF07CiB9CkBAIC02NDUsOCArNjYwLDkgQEAKICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CiAgICAgc3A8Q29tcG9uZW50OjpIaWRsTGlzdGVuZXI+IGhpZGxMaXN0ZW5lciA9IG5ldyBDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcnt9OwogICAgIGhpZGxMaXN0ZW5lci0+YmFzZSA9IGxpc3RlbmVyOwotICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlMV8xID8KLSAgICAgICAgbUJhc2UxXzEtPmNyZWF0ZUNvbXBvbmVudF8xXzEoCisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzOworICAgIGlmIChtQmFzZTFfMikgeworICAgICAgICB0cmFuc1N0YXR1cyA9IG1CYXNlMV8yLT5jcmVhdGVDb21wb25lbnRfMV8yKAogICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKICAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCkBAIC02NTksOCArNjc1LDI1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKICAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7Ci0gICAgICAgICAgICB9KSA6Ci0gICAgICAgIG1CYXNlMV8wLT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgZWxzZSBpZiAobUJhc2UxXzEpIHsKKyAgICAgICAgdHJhbnNTdGF0dXMgPSBtQmFzZTFfMS0+Y3JlYXRlQ29tcG9uZW50XzFfMSgKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBoaWRsTGlzdGVuZXIsCisgICAgICAgICAgICBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbXBvbmVudCwgaGlkbExpc3RlbmVyXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnQ+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29tcG9uZW50ID0gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4oYyk7CisgICAgICAgICAgICAgICAgaGlkbExpc3RlbmVyLT5jb21wb25lbnQgPSAqY29tcG9uZW50OworICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtQmFzZTFfMCkgeyAvLyB2ZXIxXzAKKyAgICAgICAgdHJhbnNTdGF0dXMgPSBtQmFzZTFfMC0+Y3JlYXRlQ29tcG9uZW50KAogICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKICAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCkBAIC02NzQsNiArNzA3LDkgQEAKICAgICAgICAgICAgICAgICAqY29tcG9uZW50ID0gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4oYyk7CiAgICAgICAgICAgICAgICAgaGlkbExpc3RlbmVyLT5jb21wb25lbnQgPSAqY29tcG9uZW50OwogICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgIH0KICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKICAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKQEAgLTg0Myw2ICs4NzksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CiAgICAgICAgIH0KIApAQCAtMTAwMyw2ICsxMDQ0LDggQEAKICAgICAgICAgICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7a2V5MkluZGV4TXV0ZXh9OwogICAgICAgICAgICAgICAgIGtleTJJbmRleFtrZXldID0gaW5kZXg7IC8vIHVwZGF0ZSBsYXN0IGtub3duIGNsaWVudCBpbmRleAogICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX05PX01FTU9SWSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBDMl9UUkFOU0FDVElPTl9GQUlMRUQpIHsKICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlwiIiA8PCBrZXkgPDwgIlwiIGZhaWxlZCBmb3Igc2VydmljZSBcIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2xpZW50LT5nZXROYW1lKCkKQEAgLTEwMjMsMjQgKzEwNjYsMjMgQEAKICAgICByZXR1cm4gc3RhdHVzOyAvLyByZXR1cm4gdGhlIGxhc3Qgc3RhdHVzIGZyb20gYSB2YWxpZCBjbGllbnQKIH0KIAotc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PgotICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAogICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnROYW1lLAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4qIGNvbXBvbmVudCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyLAogICAgICAgICBzaXplX3QgbnVtYmVyT2ZBdHRlbXB0cykgewogICAgIHN0ZDo6c3RyaW5nIGtleXsiY3JlYXRlOiJ9OwogICAgIGtleS5hcHBlbmQoY29tcG9uZW50TmFtZSk7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OwogICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFNlcnZpY2VzKAogICAgICAgICAgICAga2V5LAogICAgICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cywKLSAgICAgICAgICAgIFtvd25lciwgJmNvbXBvbmVudCwgY29tcG9uZW50TmFtZSwgJmxpc3RlbmVyXSgKKyAgICAgICAgICAgIFtvd25lciwgY29tcG9uZW50LCBjb21wb25lbnROYW1lLCAmbGlzdGVuZXJdKAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgewogICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgKm93bmVyID0gY2xpZW50OwpAQCAtMTA1OSw3ICsxMTAxLDcgQEAKICAgICAgICAgICAgICAgICAgICA8PCAiXCIgZnJvbSBhbGwga25vd24gc2VydmljZXMuICIKICAgICAgICAgICAgICAgICAgICAgICAiTGFzdCByZXR1cm5lZCBzdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CiAgICAgfQotICAgIHJldHVybiBjb21wb25lbnQ7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPgpAQCAtMTE4Nyw2ICsxMjI5LDcgQEAKICAgICAgICAgfSwKICAgICAgICAgbUJhc2UxXzB7YmFzZX0sCiAgICAgICAgIG1CYXNlMV8xe0Jhc2UxXzE6OmNhc3RGcm9tKGJhc2UpfSwKKyAgICAgICAgbUJhc2UxXzJ7QmFzZTFfMjo6Y2FzdEZyb20oYmFzZSl9LAogICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclBvb2xTZW5kZXI+KCl9LAogICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWV7c3RkOjptYWtlX3VuaXF1ZTxPdXRwdXRCdWZmZXJRdWV1ZT4oKX0gewogfQpAQCAtMTIwOSw2ICsxMjUyLDMwIEBACiAgICAgICAgIH0sCiAgICAgICAgIG1CYXNlMV8we2Jhc2V9LAogICAgICAgICBtQmFzZTFfMXtiYXNlfSwKKyAgICAgICAgbUJhc2UxXzJ7QmFzZTFfMjo6Y2FzdEZyb20oYmFzZSl9LAorICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclBvb2xTZW5kZXI+KCl9LAorICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWV7c3RkOjptYWtlX3VuaXF1ZTxPdXRwdXRCdWZmZXJRdWV1ZT4oKX0geworfQorCitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Q29tcG9uZW50KGNvbnN0IHNwPEJhc2UxXzI+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiB0cmFuc1Jlc3VsdDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdDEuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0MiA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4odHJhbnNSZXN1bHQxKS0+CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQyLmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNlMV8we2Jhc2V9LAorICAgICAgICBtQmFzZTFfMXtiYXNlfSwKKyAgICAgICAgbUJhc2UxXzJ7YmFzZX0sCiAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye3N0ZDo6bWFrZV91bmlxdWU8QnVmZmVyUG9vbFNlbmRlcj4oKX0sCiAgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZXtzdGQ6Om1ha2VfdW5pcXVlPE91dHB1dEJ1ZmZlclF1ZXVlPigpfSB7CiB9CkBAIC0xNDIzLDcgKzE0OTAsOCBAQAogYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCiAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICBpbnQgbWF4RGVxdWV1ZUNvdW50KSB7CiAgICAgdWludDY0X3QgYnFJZCA9IDA7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbnVsbElnYnA7CiAgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+IG51bGxIZ2JwOwpAQCAtMTQzNCwyMSArMTUwMiw2NSBAQAogICAgICAgICBpZ2JwID0gbmV3IEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjIoc3VyZmFjZSk7CiAgICAgfQogCisgICAgc3RkOjpzaGFyZWRfcHRyPFN1cmZhY2VTeW5jT2JqPiBzeW5jT2JqOworCiAgICAgaWYgKCFzdXJmYWNlKSB7Ci0gICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS0+Y29uZmlndXJlKG51bGxJZ2JwLCBnZW5lcmF0aW9uLCAwKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLT5jb25maWd1cmUobnVsbElnYnAsIGdlbmVyYXRpb24sIDAsIG1heERlcXVldWVDb3VudCwgbnVsbHB0cik7CiAgICAgfSBlbHNlIGlmIChzdXJmYWNlLT5nZXRVbmlxdWVJZCgmYnFJZCkgIT0gT0spIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSAiCiAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBvYnRhaW4gYnVmZmVycXVldWUgaWQuIjsKICAgICAgICAgYnFJZCA9IDA7Ci0gICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS0+Y29uZmlndXJlKG51bGxJZ2JwLCBnZW5lcmF0aW9uLCAwKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLT5jb25maWd1cmUobnVsbElnYnAsIGdlbmVyYXRpb24sIDAsIG1heERlcXVldWVDb3VudCwgbnVsbHB0cik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLT5jb25maWd1cmUoc3VyZmFjZSwgZ2VuZXJhdGlvbiwgYnFJZCk7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS0+Y29uZmlndXJlKHN1cmZhY2UsIGdlbmVyYXRpb24sIGJxSWQsIG1heERlcXVldWVDb3VudCwgbUJhc2UxXzIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY09iaiA6IG51bGxwdHIpOwogICAgIH0KLSAgICBBTE9HRCgiZ2VuZXJhdGlvbiByZW1vdGUgY2hhbmdlICV1IiwgZ2VuZXJhdGlvbik7CiAKLSAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlMV8wLT5zZXRPdXRwdXRTdXJmYWNlKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwKLSAgICAgICAgICAgIGJxSWQgPT0gMCA/IG51bGxIZ2JwIDogaWdicCk7CisgICAgLy8gc2V0IGNvbnN1bWVyIGJpdHMKKyAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyBnZXQgaW5jb3Jwb3JhdGVkIGludG8gc2V0T3V0cHV0U3VyZmFjZSBtZXRob2Qgc28gdGhhdCBjb25zdW1lciBiaXRzCisgICAgLy8gY2FuIGJlIHNldCBhdG9taWNhbGx5PworICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSBrRGVmYXVsdENvbnN1bWVyVXNhZ2U7CisgICAgeworICAgICAgICBpZiAoc3VyZmFjZSkgeworICAgICAgICAgICAgaW50IHVzYWdlID0gMDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN1cmZhY2UtPnF1ZXJ5KE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywgJnVzYWdlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2V0T3V0cHV0U3VyZmFjZSAtLSBmYWlsZWQgdG8gZ2V0IGNvbnN1bWVyIHVzYWdlIGJpdHMgKCVkLyVzKS4gaWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm90ZTogd2UgYXJlIGFkZGluZyB0aGUgZGVmYXVsdCB1c2FnZSBiZWNhdXNlIGNvbXBvbmVudHMgbXVzdCBzdXBwb3J0CisgICAgICAgICAgICAgICAgLy8gcHJvZHVjaW5nIG91dHB1dCBmcmFtZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkIGFuIGFsbCBvdXRwdXQgc3VyZmFjZXMuCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBkbyBub3Qgc2V0IHVzYWdlIGZvciB0dW5uZWxlZCBzY2VuYXJpby4gSXQgaXMgdW5jbGVhciBpZiBjb25zdW1lciB1c2FnZQorICAgICAgICAgICAgICAgIC8vIGlzIG1lYW5pbmdmdWwgaW4gYSB0dW5uZWxlZCBzY2VuYXJpbzsgb24gb25lIGhhbmQgb3V0cHV0IGJ1ZmZlcnMgZXhpc3QsIGJ1dAorICAgICAgICAgICAgICAgIC8vIHRoZXkgZG8gbm90IGV4aXN0IGluc2lkZSBvZiBDMiBzY29wZS4gQW55IGJ1ZmZlciB1c2FnZSBzaGFsbCBiZSBjb21tdW5pY2F0ZWQKKyAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBzaWRlYmFuZCBjaGFubmVsLgorCisgICAgICAgICAgICAgICAgLy8gZG8gYW4gdW5zaWduZWQgY29udmVyc2lvbiBhcyBiaXQtMzEgbWF5IGJlIDEKKyAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlID0gKHVpbnQzMl90KXVzYWdlIHwga0RlZmF1bHRDb25zdW1lclVzYWdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6b3V0cHV0IG91dHB1dFVzYWdleworICAgICAgICAgICAgICAgIDB1LCBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6RnJvbUdyYWxsb2NVc2FnZShjb25zdW1lclVzYWdlKS5leHBlY3RlZH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gY29uZmlnKHsmb3V0cHV0VXNhZ2V9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJzZXRPdXRwdXRTdXJmYWNlIC0tIGZhaWxlZCB0byBzZXQgY29uc3VtZXIgdXNhZ2UgKCVkLyVzKSIsCisgICAgICAgICAgICAgICAgICAgIGVyciwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0QoInNldE91dHB1dFN1cmZhY2UgLS0gZ2VuZXJhdGlvbj0ldSBjb25zdW1lciB1c2FnZT0lI2xseCVzIiwKKyAgICAgICAgICAgIGdlbmVyYXRpb24sIChsb25nIGxvbmcpY29uc3VtZXJVc2FnZSwgc3luY09iaiA/ICIgc3luYyIgOiAiIik7CisKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IHN5bmNPYmogPworICAgICAgICAgICAgbUJhc2UxXzItPnNldE91dHB1dFN1cmZhY2VXaXRoU3luY09iaigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwKKyAgICAgICAgICAgICAgICAgICAgYnFJZCA9PSAwID8gbnVsbEhnYnAgOiBpZ2JwLCAqc3luY09iaikgOgorICAgICAgICAgICAgbUJhc2UxXzAtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihibG9ja1Bvb2xJZCksCisgICAgICAgICAgICAgICAgICAgIGJxSWQgPT0gMCA/IG51bGxIZ2JwIDogaWdicCk7CisKICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOwogICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOwpAQCAtMTQ1OCw2ICsxNTcwLDcgQEAKICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKICAgICB9CisgICAgQUxPR0QoIlN1cmZhY2UgY29uZmlndXJlIGNvbXBsZXRlZCIpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0NjgsNiArMTU4MSwxMSBAQAogICAgIHJldHVybiBtT3V0cHV0QnVmZmVyUXVldWUtPm91dHB1dEJ1ZmZlcihibG9jaywgaW5wdXQsIG91dHB1dCk7CiB9CiAKK3ZvaWQgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2VNYXhEZXF1ZXVlQ291bnQoCisgICAgICAgIGludCBtYXhEZXF1ZXVlQ291bnQpIHsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWUtPnVwZGF0ZU1heERlcXVldWVCdWZmZXJDb3VudChtYXhEZXF1ZXVlQ291bnQpOworfQorCiBjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKQEAgLTE2MjAsNCArMTczOCwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL2NsaWVudC5oIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKaW5kZXggZmZkMTk0YS4uMzQ3ZTU4YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTc4LDYgKzc4LDExIEBACiBzdHJ1Y3QgSUNvbXBvbmVudFN0b3JlOwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzEKIAorbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzIgeworc3RydWN0IElDb21wb25lbnQ7CitzdHJ1Y3QgSUNvbXBvbmVudFN0b3JlOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzIKKwogbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMCB7CiBzdHJ1Y3QgSUNsaWVudE1hbmFnZXI7CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wCkBAIC0xMzcsNiArMTQyLDcgQEAKIAogICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUgQmFzZTFfMDsKICAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMTo6SUNvbXBvbmVudFN0b3JlIEJhc2UxXzE7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzI6OklDb21wb25lbnRTdG9yZSBCYXNlMV8yOwogICAgIHR5cGVkZWYgQmFzZTFfMCBCYXNlOwogCiAgICAgc3RydWN0IExpc3RlbmVyOwpAQCAtMTU2LDYgKzE2Miw3IEBACiAgICAgc3A8QmFzZT4gY29uc3QmIGdldEJhc2UoKSBjb25zdDsKICAgICBzcDxCYXNlMV8wPiBjb25zdCYgZ2V0QmFzZTFfMCgpIGNvbnN0OwogICAgIHNwPEJhc2UxXzE+IGNvbnN0JiBnZXRCYXNlMV8xKCkgY29uc3Q7CisgICAgc3A8QmFzZTFfMj4gY29uc3QmIGdldEJhc2UxXzIoKSBjb25zdDsKIAogICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0OwogCkBAIC0yMDAsOSArMjA3LDEwIEBACiAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCB3aXRoIGEgZ2l2ZW4gbmFtZSBmcm9tIGFsbCBrbm93bgogICAgIC8vIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4gbnVtYmVyT2ZBdHRlbXB0cyBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgdGltZXMKICAgICAvLyB0byByZXRyeSB0aGUgSElETCBjYWxsIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4KLSAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gQ3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBDcmVhdGVDb21wb25lbnRCeU5hbWUoCiAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjb21wb25lbnROYW1lLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBjb25zdCYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiogY29tcG9uZW50LAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0ciwKICAgICAgICAgICAgIHNpemVfdCBudW1iZXJPZkF0dGVtcHRzID0gMTApOwogCkBAIC0yMjcsNiArMjM1LDcgQEAKIHByb3RlY3RlZDoKICAgICBzcDxCYXNlMV8wPiBtQmFzZTFfMDsKICAgICBzcDxCYXNlMV8xPiBtQmFzZTFfMTsKKyAgICBzcDxCYXNlMV8yPiBtQmFzZTFfMjsKIAogICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBzdG9yZSB3aGVyZSB0aGUgcHJlZGljYXRlIHJldHVybnMgQzJfT0sgYW5kIHJldHVybnMgdGhlCiAgICAgLy8gbGFzdCBwcmVkaWNhdGUgcmVzdWx0LiBUaGUgcHJlZGljYXRlIHdpbGwgYmUgdHJpZWQgb24gYWxsIHN0b3Jlcy4gVGhlCkBAIC0zMTcsNiArMzI2LDcgQEAKIAogICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50IEJhc2UxXzA7CiAgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzE6OklDb21wb25lbnQgQmFzZTFfMTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjo6SUNvbXBvbmVudCBCYXNlMV8yOwogICAgIHR5cGVkZWYgQmFzZTFfMCBCYXNlOwogCiAgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKApAQCAtMzc0LDcgKzM4NCw4IEBACiAgICAgYzJfc3RhdHVzX3Qgc2V0T3V0cHV0U3VyZmFjZSgKICAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAogICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICBpbnQgbWF4RGVxdWV1ZUJ1ZmZlckNvdW50KTsKIAogICAgIC8vIEV4dHJhY3QgYSBzbG90IG51bWJlciBmcm9tIG9mIHRoZSBibG9jaywgdGhlbiBjYWxsCiAgICAgLy8gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIoKS4KQEAgLTM5Nyw2ICs0MDgsOSBAQAogICAgICAgICAgICAgY29uc3QgUXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCiAgICAgICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKIAorICAgIC8vIFNldCBtYXggZGVxdWV1ZSBjb3VudCBmb3Igb3V0cHV0IHN1cmZhY2UuCisgICAgdm9pZCBzZXRPdXRwdXRTdXJmYWNlTWF4RGVxdWV1ZUNvdW50KGludCBtYXhEZXF1ZXVlQ291bnQpOworCiAgICAgLy8gQ29ubmVjdCB0byBhIGdpdmVuIElucHV0U3VyZmFjZS4KICAgICBjMl9zdGF0dXNfdCBjb25uZWN0VG9JbnB1dFN1cmZhY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLApAQCAtNDEyLDEyICs0MjYsMTQgQEAKICAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgogICAgIENvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CiAgICAgQ29tcG9uZW50KGNvbnN0IHNwPEJhc2UxXzE+JiBiYXNlKTsKKyAgICBDb21wb25lbnQoY29uc3Qgc3A8QmFzZTFfMj4mIGJhc2UpOwogCiAgICAgfkNvbXBvbmVudCgpOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3A8QmFzZTFfMD4gbUJhc2UxXzA7CiAgICAgc3A8QmFzZTFfMT4gbUJhc2UxXzE7CisgICAgc3A8QmFzZTFfMj4gbUJhc2UxXzI7CiAKICAgICBzdHJ1Y3QgQnVmZmVyUG9vbFNlbmRlcjsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyUG9vbFNlbmRlcj4gbUJ1ZmZlclBvb2xTZW5kZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaCBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9pbmNsdWRlL2NvZGVjMi9oaWRsL291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NzE0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9vdXRwdXQuaApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfT1VUUFVUX0JVRkZFUl9RVUVVRQorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX09VVFBVVF9CVUZGRVJfUVVFVUUKKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK3N0cnVjdCBDMl9ISURFIF9DMkJsb2NrUG9vbERhdGE7CitjbGFzcyBDMlN1cmZhY2VTeW5jTWVtb3J5OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CisKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBNYW5hZ2UgQnVmZmVyUXVldWUgYW5kIGdyYXBoaWMgYmxvY2tzIGZvciBib3RoIGNvbXBvbmVudCBhbmQgY29kZWMuCisvLyBNYW5hZ2UgZ3JhcGhpYyBibG9ja3Mgb3duZXJzaGlwIGNvbnNpc3RlbnRseSBkdXJpbmcgc3VyZmFjZSBjaGFuZ2UuCitzdHJ1Y3QgT3V0cHV0QnVmZmVyUXVldWUgeworCisgICAgT3V0cHV0QnVmZmVyUXVldWUoKTsKKworICAgIH5PdXRwdXRCdWZmZXJRdWV1ZSgpOworCisgICAgLy8gQ29uZmlndXJlIGEgbmV3IHN1cmZhY2UgdG8gcmVuZGVyIGdyYXBoaWMgYmxvY2tzLgorICAgIC8vIEdyYXBoaWMgYmxvY2tzIGZyb20gb2xkZXIgc3VyZmFjZSB3aWxsIGJlIG1pZ3JhdGVkIHRvIG5ldyBzdXJmYWNlLgorICAgIGJvb2wgY29uZmlndXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWF4RGVxdWV1ZUJ1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxWMV8yOjpTdXJmYWNlU3luY09iaj4gKnN5bmNPYmopOworCisgICAgLy8gUmVuZGVyIGEgZ3JhcGhpYyBibG9jayB0byBjdXJyZW50IHN1cmZhY2UuCisgICAgc3RhdHVzX3Qgb3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDYWxsIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKCkgb24gb3V0cHV0IGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisgICAgLy8gVGhlIE91dHB1dEJ1ZmZlclF1ZXVlIHdpbGwgdGFrZSB0aGUgb3duZXJzaGlwIG9mIG91dHB1dCBibG9ja3MuCisgICAgLy8KKyAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgV29ya0J1bmRsZSBoYXMgYmVlbiByZWNlaXZlZAorICAgIC8vIGZyb20gYW5vdGhlciBwcm9jZXNzLgorICAgIHZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QpOworCisgICAgLy8gVXBkYXRlICMgb2YgbWF4IGRlcXVldWUgYnVmZmVyIGZyb20gQlEuIElmICMgb2YgbWF4IGRlcXVldWVkIGJ1ZmZlciBpcyBzaGFyZWQKKyAgICAvLyB2aWEgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIEhBTCBhbmQgZnJhbWV3b3JrLCBVcGRhdGUgIyBvZiBtYXggZGVxdWV1ZWQgYnVmZmVyCisgICAgLy8gYW5kIHN5bmNocm9uaXplLgorICAgIHZvaWQgdXBkYXRlTWF4RGVxdWV1ZUJ1ZmZlckNvdW50KGludCBtYXhEZXF1ZXVlQnVmZmVyQ291bnQpOworCitwcml2YXRlOgorCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUlnYnA7CisgICAgdWludDMyX3QgbUdlbmVyYXRpb247CisgICAgdWludDY0X3QgbUJxSWQ7CisgICAgaW50MzJfdCBtTWF4RGVxdWV1ZUJ1ZmZlckNvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IG1Pd25lcjsKKyAgICAvLyBUbyBtaWdyYXRlIGV4aXN0aW5nIGJ1ZmZlcnMKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOyAvLyBmaW5kIGEgYmV0dGVyIHdheQorICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBtU3luY01lbTsKKworICAgIGJvb2wgcmVnaXN0ZXJCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX09VVFBVVF9CVUZGRVJfUVVFVUUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L291dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzNGMyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL2NsaWVudC9vdXRwdXQuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1PdXRwdXRCdWZmZXJRdWV1ZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8yLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL291dHB1dC5oPgorI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJTdXJmYWNlU3luY09iai5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgVjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OnV0aWxzOjpCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2suCitzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICB1aW50NjRfdCB1c2FnZTsKKyAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICBibG9jay5oYW5kbGUoKSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsCisgICAgICAgICAgICAmc3RyaWRlLCAmZ2VuZXJhdGlvbiwgJmJxSWQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmYnFTbG90KSk7CisgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0KKyAgICAgICAgICAgIFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPQorICAgICAgICAgICAgbmV3IEdyYXBoaWNCdWZmZXIoZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHVzYWdlLCBzdHJpZGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworICAgIHJldHVybiBncmFwaGljQnVmZmVyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhDMkZyYW1lRGF0YSYgZnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyIDogZnJhbWVEYXRhLmJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3MoYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgIGlmICh3b3JrbGV0KSB7CisgICAgICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmtsZXQtPm91dHB1dCwgcHJvY2Vzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEhnYnAoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnApIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgICAgIGlnYnAtPmdldEhhbEludGVyZmFjZTxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPigpOworICAgIHJldHVybiBoZ2JwID8gaGdicCA6CisgICAgICAgICAgICBuZXcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGlnYnApOworfQorCitzdGF0dXNfdCBhdHRhY2hUb0J1ZmZlclF1ZXVlKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSkgeworICAgIGlmICghaWdicCkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gbnVsbCBwcm9kdWNlci4iOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jayk7CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uKTsKKworICAgIExPRyhWRVJCT1NFKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hpbmcgYnVmZmVyOiIKKyAgICAgICAgICAgIDw8ICIgYmxvY2sgZGltZW5zaW9uICIgPDwgYmxvY2sud2lkdGgoKSA8PCAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYmxvY2suaGVpZ2h0KCkKKyAgICAgICAgICAgIDw8ICIsIGdyYXBoaWNCdWZmZXIgZGltZW5zaW9uICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSA8PCAieCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBncmFwaGljQnVmZmVyLT5nZXRIZWlnaHQoKQorICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykKKyAgICAgICAgICAgIDw8ICIsIGZvcm1hdCAweCIgPDwgc3RkOjpzZXR3KDgpIDw8IGdyYXBoaWNCdWZmZXItPmdldFBpeGVsRm9ybWF0KCkKKyAgICAgICAgICAgIDw8ICIsIHVzYWdlIDB4IiA8PCBzdGQ6OnNldHcoMTYpIDw8IGdyYXBoaWNCdWZmZXItPmdldFVzYWdlKCkKKyAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpCisgICAgICAgICAgICA8PCAiLCBzdHJpZGUgIiA8PCBncmFwaGljQnVmZmVyLT5nZXRTdHJpZGUoKQorICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKTsKKworICAgIEMyU3luY1ZhcmlhYmxlcyAqc3luY1ZhciA9IHN5bmNNZW0gPyBzeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgc3luY1Zhci0+bG9jaygpOworICAgICAgICBpZiAoIXN5bmNWYXItPmlzRGVxdWV1ZWFibGVMb2NrZWQoKSB8fAorICAgICAgICAgICAgc3luY1Zhci0+Z2V0U3luY1N0YXR1c0xvY2tlZCgpID09IEMyU3luY1ZhcmlhYmxlczo6U1RBVFVTX1NXSVRDSElORykgeworICAgICAgICAgICAgc3luY1Zhci0+dW5sb2NrKCk7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0dXMgPSAiIDw8IElOVkFMSURfT1BFUkFUSU9OIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgc3luY1Zhci0+bm90aWZ5RGVxdWV1ZWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyA9ICIgPDwgcmVzdWx0IDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgTE9HKFZFUkJPU0UpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciByZXR1cm5lZCBzbG90ICMiCisgICAgICAgICAgICAgICAgIDw8ICpicVNsb3QgPDwgIi4iOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgcmV0dXJuIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayksCisgICAgICAgICAgICBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK091dHB1dEJ1ZmZlclF1ZXVlOjpPdXRwdXRCdWZmZXJRdWV1ZSgpCisgICAgICA6IG1HZW5lcmF0aW9uezB9LCBtQnFJZHswfSB7Cit9CisKK091dHB1dEJ1ZmZlclF1ZXVlOjp+T3V0cHV0QnVmZmVyUXVldWUoKSB7Cit9CisKK2Jvb2wgT3V0cHV0QnVmZmVyUXVldWU6OmNvbmZpZ3VyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heERlcXVldWVCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VjFfMjo6U3VyZmFjZVN5bmNPYmo+ICpzeW5jT2JqKSB7CisgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgaWYgKGlnYnAgJiYgaWdicC0+Z2V0Q29uc3VtZXJVc2FnZSgmY29uc3VtZXJVc2FnZSkgIT0gT0spIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgY29uc3VtZXIgdXNhZ2UiKTsKKyAgICB9CisKKyAgICAvLyBUT0RPIDogQWJzdHJhY3QgY3JlYXRpb24gcHJvY2VzcyBpbnRvIEMyU3VyZmFjZVN5bmNNZW1vcnkgY2xhc3MuCisgICAgLy8gdXNlIEMyTGluZWFyQmxvY2sgaW5zdGVhZCBhc2htZW0uCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW07CisgICAgaWYgKHN5bmNPYmogJiYgaWdicCkgeworICAgICAgICBib29sIG1hcHBlZCA9IGZhbHNlOworICAgICAgICBpbnQgbWVtRmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbigiQzJTdXJmYWNlTWVtIiwgc2l6ZW9mKEMyU3luY1ZhcmlhYmxlcykpOworICAgICAgICBzaXplX3QgbWVtU2l6ZSA9IG1lbUZkIDwgMCA/IDAgOiBhc2htZW1fZ2V0X3NpemVfcmVnaW9uKG1lbUZkKTsKKyAgICAgICAgaWYgKG1lbVNpemUgPiAwKSB7CisgICAgICAgICAgICBzeW5jTWVtID0gQzJTdXJmYWNlU3luY01lbW9yeTo6Q3JlYXRlKG1lbUZkLCBtZW1TaXplKTsKKyAgICAgICAgICAgIGlmIChzeW5jTWVtKSB7CisgICAgICAgICAgICAgICAgbWFwcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqc3luY09iaiA9IHN0ZDo6bWFrZV9zaGFyZWQ8VjFfMjo6U3VyZmFjZVN5bmNPYmo+KCk7CisgICAgICAgICAgICAgICAgKCpzeW5jT2JqKS0+c3luY01lbW9yeSA9IHN5bmNNZW0tPmhhbmRsZSgpOworICAgICAgICAgICAgICAgICgqc3luY09iaiktPmJxSWQgPSBicUlkOworICAgICAgICAgICAgICAgICgqc3luY09iaiktPmdlbmVyYXRpb25JZCA9IGdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgKCpzeW5jT2JqKS0+Y29uc3VtZXJVc2FnZSA9IGNvbnN1bWVyVXNhZ2U7CisgICAgICAgICAgICAgICAgQUxPR0QoIkMyU3VyZmFjZVN5bmNNZW1vcnkgY3JlYXRlZCAlenUoJXp1KSIsIHNpemVvZihDMlN5bmNWYXJpYWJsZXMpLCBtZW1TaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1hcHBlZCkgeworICAgICAgICAgICAgaWYgKG1lbUZkID49IDApIHsKKyAgICAgICAgICAgICAgICA6OmNsb3NlKG1lbUZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJTdXJmYWNlU3luY09iaiBjcmVhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgdHJ5TnVtID0gMDsKKyAgICBzaXplX3Qgc3VjY2VzcyA9IDA7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOworICAgIHN0ZDo6d2Vha19wdHI8X0MyQmxvY2tQb29sRGF0YT4KKyAgICAgICAgICAgIHBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKG1NdXRleCk7CisgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAvLyBjYXNlIG9mIG9sZCBCbG9ja1Bvb2wgZGVzdHJ1Y3Rpb24KKyAgICAgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqdmFyID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKHN5bmNPYmogJiYgdmFyKSB7CisgICAgICAgICAgICAgICAgKnN5bmNPYmogPSBzdGQ6Om1ha2Vfc2hhcmVkPFYxXzI6OlN1cmZhY2VTeW5jT2JqPigpOworICAgICAgICAgICAgICAgICgqc3luY09iaiktPmJxSWQgPSBicUlkOworICAgICAgICAgICAgICAgICgqc3luY09iaiktPnN5bmNNZW1vcnkgPSBtU3luY01lbS0+aGFuZGxlKCk7CisgICAgICAgICAgICAgICAgKCpzeW5jT2JqKS0+Z2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAoKnN5bmNPYmopLT5jb25zdW1lclVzYWdlID0gY29uc3VtZXJVc2FnZTsKKyAgICAgICAgICAgICAgICBtTWF4RGVxdWV1ZUJ1ZmZlckNvdW50ID0gbWF4RGVxdWV1ZUJ1ZmZlckNvdW50OworICAgICAgICAgICAgICAgIHZhci0+bG9jaygpOworICAgICAgICAgICAgICAgIHZhci0+c2V0U3luY1N0YXR1c0xvY2tlZChDMlN5bmNWYXJpYWJsZXM6OlNUQVRVU19JTklUKTsKKyAgICAgICAgICAgICAgICB2YXItPnNldEluaXRpYWxEZXF1ZXVlQ291bnRMb2NrZWQobU1heERlcXVldWVCdWZmZXJDb3VudCwgMCk7CisgICAgICAgICAgICAgICAgdmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gb2xkTWVtID0gbVN5bmNNZW07CisgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqb2xkU3luYyA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKKyAgICAgICAgaWYgKG9sZFN5bmMpIHsKKyAgICAgICAgICAgIG9sZFN5bmMtPmxvY2soKTsKKyAgICAgICAgICAgIG9sZFN5bmMtPnNldFN5bmNTdGF0dXNMb2NrZWQoQzJTeW5jVmFyaWFibGVzOjpTVEFUVVNfU1dJVENISU5HKTsKKyAgICAgICAgICAgIG9sZFN5bmMtPnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIG1TeW5jTWVtLnJlc2V0KCk7CisgICAgICAgIGlmIChzeW5jTWVtKSB7CisgICAgICAgICAgICBtU3luY01lbSA9IHN5bmNNZW07CisgICAgICAgIH0KKyAgICAgICAgQzJTeW5jVmFyaWFibGVzICpuZXdTeW5jID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOworCisgICAgICAgIG1JZ2JwID0gaWdicDsKKyAgICAgICAgbUdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICBtQnFJZCA9IGJxSWQ7CisgICAgICAgIG1Pd25lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8aW50PigwKTsKKyAgICAgICAgbU1heERlcXVldWVCdWZmZXJDb3VudCA9IG1heERlcXVldWVCdWZmZXJDb3VudDsKKyAgICAgICAgaWYgKGlnYnAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtQnFJZCA9PSAwIHx8ICFtQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPSBtUG9vbERhdGFzW2ldLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghZGF0YSB8fAorICAgICAgICAgICAgICAgICFfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKGRhdGEpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3RyeU51bTsKKyAgICAgICAgICAgIGludCBicVNsb3Q7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBidWZmZXIncyBnZW5lcmF0aW9uIGFuZCB1c2FnZS4KKyAgICAgICAgICAgIGlmICgobUJ1ZmZlcnNbaV0tPmdldFVzYWdlKCkgJiBjb25zdW1lclVzYWdlKSAhPSBjb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0gPSBuZXcgR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0tPmhhbmRsZSwgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS0+d2lkdGgsIG1CdWZmZXJzW2ldLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLT5mb3JtYXQsIG1CdWZmZXJzW2ldLT5sYXllckNvdW50LAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS0+Z2V0VXNhZ2UoKSB8IGNvbnN1bWVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLT5zdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHRvIHVwZGF0ZSB1c2FnZSwgb3JpZ2luYWwgdXNhZ2U9JSIgUFJJeDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGNvbnN1bWVyIHVzYWdlPSUiIFBSSXg2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1CdWZmZXJzW2ldLT5nZXRVc2FnZSgpLCBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0tPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGlnYnAtPmF0dGFjaEJ1ZmZlcigmYnFTbG90LCBtQnVmZmVyc1tpXSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIGF0dGFjaCA9CisgICAgICAgICAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6RW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIG1Pd25lciwgZ2V0SGdicChtSWdicCksIG1TeW5jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7CisgICAgICAgICAgICBpZiAoIWF0dGFjaCkgeworICAgICAgICAgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJzW2JxU2xvdF0gPSBtQnVmZmVyc1tpXTsKKyAgICAgICAgICAgIHBvb2xEYXRhc1ticVNsb3RdID0gZGF0YTsKKyAgICAgICAgICAgICsrc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IGJ1ZmZlcnNbaV07CisgICAgICAgICAgICBtUG9vbERhdGFzW2ldID0gcG9vbERhdGFzW2ldOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdTeW5jKSB7CisgICAgICAgICAgICBuZXdTeW5jLT5sb2NrKCk7CisgICAgICAgICAgICBuZXdTeW5jLT5zZXRJbml0aWFsRGVxdWV1ZUNvdW50TG9ja2VkKG1NYXhEZXF1ZXVlQnVmZmVyQ291bnQsIHN1Y2Nlc3MpOworICAgICAgICAgICAgbmV3U3luYy0+dW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0QoInJlbW90ZSBncmFwaGljIGJ1ZmZlciBtaWdyYXRpb24gJXp1LyV6dSIsCisgICAgICAgICAgc3VjY2VzcywgdHJ5TnVtKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPdXRwdXRCdWZmZXJRdWV1ZTo6cmVnaXN0ZXJCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKKworICAgIGlmICghbUlnYnApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IG9sZEdlbmVyYXRpb247CisgICAgdWludDY0X3Qgb2xkSWQ7CisgICAgaW50MzJfdCBvbGRTbG90OworICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgYnVmZmVycXVldWUtYmFzZWQsIGRvIG5vdGhpbmcuCisgICAgaWYgKCFfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGRhdGEsICZvbGRHZW5lcmF0aW9uLCAmb2xkSWQsICZvbGRTbG90KSB8fCAob2xkSWQgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBJZiB0aGUgYmxvY2sncyBicUlkIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXNpcmVkIGJxSWQsIGp1c3QgaG9sZC4KKyAgICBpZiAoKG9sZElkID09IG1CcUlkKSAmJiAob2xkR2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbikpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBpbXBvcnQgd2l0aG91dCBhdHRhY2hpbmc6IgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBicUlkICIgPDwgb2xkSWQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IG9sZFNsb3QKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBtR2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZShkYXRhLCBtT3duZXIsIGdldEhnYnAobUlnYnApLCBtU3luY01lbSk7CisgICAgICAgIG1Qb29sRGF0YXNbb2xkU2xvdF0gPSBkYXRhOworICAgICAgICBtQnVmZmVyc1tvbGRTbG90XSA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOworICAgICAgICBtQnVmZmVyc1tvbGRTbG90XS0+c2V0R2VuZXJhdGlvbk51bWJlcihtR2VuZXJhdGlvbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQzMl90IGQgPSAoaW50MzJfdCkgbUdlbmVyYXRpb24gLSAoaW50MzJfdCkgb2xkR2VuZXJhdGlvbjsKKyAgICBMT0coV0FSTklORykgPDwgInJlY2VpdmluZyBzdGFsZSBidWZmZXI6IGdlbmVyYXRpb24gIgorICAgICAgICAgICAgICAgICA8PCBtR2VuZXJhdGlvbiA8PCAiICwgZGlmZiAiIDw8IGQgIDw8ICIgOiBzbG90ICIKKyAgICAgICAgICAgICAgICAgPDwgb2xkU2xvdDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE91dHB1dEJ1ZmZlclF1ZXVlOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgIEJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KSB7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIGJvb2wgZGlzcGxheSA9IFYxXzA6OnV0aWxzOjpkaXNwbGF5QnVmZmVyUXVldWVCbG9jayhibG9jayk7CisgICAgaWYgKCFnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoYmxvY2ssICZnZW5lcmF0aW9uLCAmYnFJZCwgJmJxU2xvdCkgfHwKKyAgICAgICAgYnFJZCA9PSAwKSB7CisgICAgICAgIC8vIEJsb2NrIG5vdCBmcm9tIGJ1ZmZlcnF1ZXVlIC0tIGl0IG11c3QgYmUgYXR0YWNoZWQgYmVmb3JlIHF1ZXVpbmcuCisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW07CisgICAgICAgIG1NdXRleC5sb2NrKCk7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG91dHB1dElnYnAgPSBtSWdicDsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICBzeW5jTWVtID0gbVN5bmNNZW07CisgICAgICAgIG1NdXRleC51bmxvY2soKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2hUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgICAgIGJsb2NrLCBvdXRwdXRJZ2JwLCBvdXRwdXRHZW5lcmF0aW9uLCAmYnFTbG90LCBzeW5jTWVtKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIm91dHB1dEJ1ZmZlciAtLSBhdHRhY2hpbmcgZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICBhdXRvIHN5bmNWYXIgPSBzeW5jTWVtID8gc3luY01lbS0+bWVtKCkgOiBudWxscHRyOworICAgICAgICBpZihzeW5jVmFyKSB7CisgICAgICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgIHN5bmNWYXItPm5vdGlmeVF1ZXVlZExvY2tlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY1Zhci0+dW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm91dHB1dEJ1ZmZlciAtLSBxdWV1ZUJ1ZmZlcigpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJvbiBub24tYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yID0gIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW07CisgICAgbU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7CisgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IG91dHB1dEJxSWQgPSBtQnFJZDsKKyAgICBzeW5jTWVtID0gbVN5bmNNZW07CisgICAgbU11dGV4LnVubG9jaygpOworCisgICAgaWYgKCFvdXRwdXRJZ2JwKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAib3V0cHV0QnVmZmVyIC0tIG91dHB1dCBzdXJmYWNlIGlzIG51bGwuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAib3V0cHV0QnVmZmVyIC0tIGNhbm5vdCBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICJidWZmZXJxdWV1ZS1iYXNlZCBibG9jayB0byB0aGUgYnVmZmVycXVldWUuIjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQgfHwgZ2VuZXJhdGlvbiAhPSBvdXRwdXRHZW5lcmF0aW9uKSB7CisgICAgICAgIGludDMyX3QgZGlmZiA9IChpbnQzMl90KSBvdXRwdXRHZW5lcmF0aW9uIC0gKGludDMyX3QpIGdlbmVyYXRpb247CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAib3V0cHV0QnVmZmVyIC0tIGJ1ZmZlcnMgZnJvbSBvbGQgZ2VuZXJhdGlvbiB0byAiCisgICAgICAgICAgICAgICAgICAgICA8PCBvdXRwdXRHZW5lcmF0aW9uIDw8ICIgLCBkaWZmOiAiIDw8IGRpZmYKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgLCBzbG90OiAiIDw8IGJxU2xvdDsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGF1dG8gc3luY1ZhciA9IHN5bmNNZW0gPyBzeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CisgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgc3luY1Zhci0+bG9jaygpOworICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICBzeW5jVmFyLT5ub3RpZnlRdWV1ZWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAib3V0cHV0QnVmZmVyIC0tIHF1ZXVlQnVmZmVyKCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAib24gYnVmZmVycXVldWUtYmFzZWQgYmxvY2suICIKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJRdWV1ZTo6aG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCkgeworICAgIGZvckVhY2hCbG9jayh3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZPdXRwdXRCdWZmZXJRdWV1ZTo6cmVnaXN0ZXJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJRdWV1ZTo6dXBkYXRlTWF4RGVxdWV1ZUJ1ZmZlckNvdW50KGludCBtYXhEZXF1ZXVlQnVmZmVyQ291bnQpIHsKKyAgICBtTXV0ZXgubG9jaygpOworICAgIG1NYXhEZXF1ZXVlQnVmZmVyQ291bnQgPSBtYXhEZXF1ZXVlQnVmZmVyQ291bnQ7CisgICAgYXV0byBzeW5jVmFyID0gbVN5bmNNZW0gPyBtU3luY01lbS0+bWVtKCkgOiBudWxscHRyOworICAgIGlmIChzeW5jVmFyKSB7CisgICAgICAgIHN5bmNWYXItPmxvY2soKTsKKyAgICAgICAgc3luY1Zhci0+dXBkYXRlTWF4RGVxdWV1ZUNvdW50TG9ja2VkKG1heERlcXVldWVCdWZmZXJDb3VudCk7CisgICAgICAgIHN5bmNWYXItPnVubG9jaygpOworICAgIH0KKyAgICBtTXV0ZXgudW5sb2NrKCk7CisgICAgQUxPR0QoInNldCBtYXggZGVxdWV1ZSBjb3VudCAlZCBmcm9tIHVwZGF0ZSIsIG1heERlcXVldWVCdWZmZXJDb3VudCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczYmIwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzUgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfcGx1Z2luX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9oaWRsX3BsdWdpbl9zdHViIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRlZmF1bHRGaWx0ZXJQbHVnaW4uY3BwIiwKKyAgICAgICAgIkZpbHRlcldyYXBwZXJTdHViLmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLCAvLyBwcml2YXRlCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgImludGVybmFsIiwKKyAgICBdLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbF9wbHVnaW4iLAorICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRlZmF1bHRGaWx0ZXJQbHVnaW4uY3BwIiwKKyAgICAgICAgIkZpbHRlcldyYXBwZXIuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRGVmYXVsdEZpbHRlclBsdWdpbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRGVmYXVsdEZpbHRlclBsdWdpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ZTc0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9EZWZhdWx0RmlsdGVyUGx1Z2luLmNwcApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItRGVmYXVsdEZpbHRlclBsdWdpbiIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorCisjaW5jbHVkZSA8RGVmYXVsdEZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEZWZhdWx0RmlsdGVyUGx1Z2luOjpEZWZhdWx0RmlsdGVyUGx1Z2luKGNvbnN0IGNoYXIgKnBsdWdpblBhdGgpCisgICAgOiBtSW5pdChOT19JTklUKSwKKyAgICAgIG1IYW5kbGUobnVsbHB0ciksCisgICAgICBtRGVzdHJveVBsdWdpbihudWxscHRyKSwKKyAgICAgIG1QbHVnaW4obnVsbHB0cikgeworICAgIG1IYW5kbGUgPSBkbG9wZW4ocGx1Z2luUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRmlsdGVyUGx1Z2luOiBubyBwbHVnaW4gZGV0ZWN0ZWQiOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEdldEZpbHRlclBsdWdpblZlcnNpb25GdW5jIGdldFZlcnNpb24gPQorICAgICAgICAoR2V0RmlsdGVyUGx1Z2luVmVyc2lvbkZ1bmMpZGxzeW0obUhhbmRsZSwgIkdldEZpbHRlclBsdWdpblZlcnNpb24iKTsKKyAgICBpZiAoIWdldFZlcnNpb24pIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWx0ZXJQbHVnaW46IEdldEZpbHRlclBsdWdpblZlcnNpb24gdW5kZWZpbmVkIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IHZlcnNpb24gPSBnZXRWZXJzaW9uKCk7CisgICAgaWYgKHZlcnNpb24gIT0gRmlsdGVyUGx1Z2luX1YxOjpWRVJTSU9OKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiB1bnJlY29nbml6ZWQgdmVyc2lvbiAoIiA8PCB2ZXJzaW9uIDw8ICIpIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDcmVhdGVGaWx0ZXJQbHVnaW5GdW5jIGNyZWF0ZVBsdWdpbiA9CisgICAgICAgIChDcmVhdGVGaWx0ZXJQbHVnaW5GdW5jKWRsc3ltKG1IYW5kbGUsICJDcmVhdGVGaWx0ZXJQbHVnaW4iKTsKKyAgICBpZiAoIWNyZWF0ZVBsdWdpbikgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbHRlclBsdWdpbjogQ3JlYXRlRmlsdGVyUGx1Z2luIHVuZGVmaW5lZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbURlc3Ryb3lQbHVnaW4gPQorICAgICAgICAoRGVzdHJveUZpbHRlclBsdWdpbkZ1bmMpZGxzeW0obUhhbmRsZSwgIkRlc3Ryb3lGaWx0ZXJQbHVnaW4iKTsKKyAgICBpZiAoIW1EZXN0cm95UGx1Z2luKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiBEZXN0cm95RmlsdGVyUGx1Z2luIHVuZGVmaW5lZCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVBsdWdpbiA9IChGaWx0ZXJQbHVnaW5fVjEgKiljcmVhdGVQbHVnaW4oKTsKKyAgICBpZiAoIW1QbHVnaW4pIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGaWx0ZXJQbHVnaW46IENyZWF0ZUZpbHRlclBsdWdpbiByZXR1cm5lZCBudWxscHRyIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RvcmUgPSBtUGx1Z2luLT5nZXRDb21wb25lbnRTdG9yZSgpOworICAgIGlmICghbVN0b3JlKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmlsdGVyUGx1Z2luOiBGaWx0ZXJQbHVnaW5fVjE6OmdldENvbXBvbmVudFN0b3JlIHJldHVybmVkIG51bGxwdHIiOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jbml0ID0gT0s7Cit9CisKK0RlZmF1bHRGaWx0ZXJQbHVnaW46On5EZWZhdWx0RmlsdGVyUGx1Z2luKCkgeworICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGlmIChtRGVzdHJveVBsdWdpbiAmJiBtUGx1Z2luKSB7CisgICAgICAgICAgICBtRGVzdHJveVBsdWdpbihtUGx1Z2luKTsKKyAgICAgICAgICAgIG1QbHVnaW4gPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGRsY2xvc2UobUhhbmRsZSk7CisgICAgICAgIG1IYW5kbGUgPSBudWxscHRyOworICAgICAgICBtRGVzdHJveVBsdWdpbiA9IG51bGxwdHI7CisgICAgfQorfQorCitib29sIERlZmF1bHRGaWx0ZXJQbHVnaW46OmRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIEZpbHRlcldyYXBwZXI6OkRlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbVBsdWdpbi0+ZGVzY3JpYmUobmFtZSwgZGVzYyk7Cit9CisKK2Jvb2wgRGVmYXVsdEZpbHRlclBsdWdpbjo6aXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbVBsdWdpbi0+aXNGaWx0ZXJpbmdFbmFibGVkKGludGYpOworfQorCitjMl9zdGF0dXNfdCBEZWZhdWx0RmlsdGVyUGx1Z2luOjpxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpwYXJhbXMpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEMyX05PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtUGx1Z2luLT5xdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KGludGYsIHBhcmFtcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyV3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjNjNmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyLmNwcApAQCAtMCwwICsxLDk4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItRmlsdGVyV3JhcHBlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorCisjaW5jbHVkZSA8RmlsdGVyV3JhcHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8vIEluZGljZXMgdGhhdCB0aGUgbGFzdCBmaWx0ZXIgaW4gdGhlIGNoYWluIHNob3VsZCBjb25zdW1lLgorc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrVHlwZXNGb3JMYXN0RmlsdGVyW10gPSB7CisgICAgLy8gSW4gY2FzZSB3ZSBoYXZlIGFuIG91dHB1dCBzdXJmYWNlLCB3ZSB3YW50IHRvIHVzZSB0aGUgYmxvY2sgcG9vbAorICAgIC8vIGJhY2tlZCBieSB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyIGdvaW5nIHRvIHRoZSBjbGllbnQuCisgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorfTsKKworY2xhc3MgV3JhcHBlZERlY29kZXJJbnRlcmZhY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIFdyYXBwZWREZWNvZGVySW50ZXJmYWNlKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiAmJmZpbHRlcnMsCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IGZpbHRlcldyYXBwZXIpCisgICAgICAgIDogbUludGYoaW50ZiksIG1GaWx0ZXJXcmFwcGVyKGZpbHRlcldyYXBwZXIpIHsKKyAgICAgICAgdGFrZUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnMpKTsKKyAgICB9CisKKyAgICB+V3JhcHBlZERlY29kZXJJbnRlcmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIHRha2VGaWx0ZXJzKHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gJiZmaWx0ZXJzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGxhc3RGaWx0ZXJQYXJhbXM7CisgICAgICAgIGlmICghbUZpbHRlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbURlc2NzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUZpbHRlcnMuYmFjaygpLmludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKCZwYXJhbURlc2NzKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG1GaWx0ZXJzLmJhY2soKS50cmFpdHMubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgICAgICBwYXJhbURlc2NzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJnBhcmFtRGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IHBhcmFtRGVzYy0+aW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGtUeXBlc0Zvckxhc3RGaWx0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGtUeXBlc0Zvckxhc3RGaWx0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LnR5cGUoKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXguZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIGRvZXMgbm90IHJldHVybiBwZXItc3RyZWFtIHBhcmFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBzdHJlYW0tMCBmb3Igbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleC53aXRoU3RyZWFtKDB1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtRmlsdGVycy5iYWNrKCkuaW50Zi0+cXVlcnlfdmIoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJmxhc3RGaWx0ZXJQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZG9jdW1lbnRhdGlvbgorICAgICAgICBtRmlsdGVycyA9IHN0ZDo6bW92ZShmaWx0ZXJzKTsKKyAgICAgICAgbVR5cGVUb0luZGV4Rm9yUXVlcnkuY2xlYXIoKTsKKyAgICAgICAgbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmNsZWFyKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1JbnRmLCBtRmlsdGVyc1swXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1GaWx0ZXJzW2kgLSAxXS5pbnRmLCBtRmlsdGVyc1tpXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpUeXBlIHR5cGUgOiBtRmlsdGVyc1tpXS5kZXNjLmNvbnRyb2xQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBtVHlwZVRvSW5kZXhGb3JRdWVyeVt0eXBlLnR5cGUoKV0gPSBpOworICAgICAgICAgICAgICAgIG1UeXBlVG9JbmRleEZvckNvbmZpZ1t0eXBlLnR5cGUoKSAmIH5DMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBR10gPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpUeXBlIHR5cGUgOiBtRmlsdGVyc1tpXS5kZXNjLmFmZmVjdGVkUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgbVR5cGVUb0luZGV4Rm9yUXVlcnlbdHlwZS50eXBlKCldID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gbUZpbHRlcnMuc2l6ZSgpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYmFja1Byb3BhZ2F0ZVBhcmFtc19sKG1JbnRmLCBtRmlsdGVyc1swXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYWNrUHJvcGFnYXRlUGFyYW1zX2wobUZpbHRlcnNbaSAtIDJdLmludGYsIG1GaWx0ZXJzW2kgLSAxXS5pbnRmLCBDMl9NQVlfQkxPQ0spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUZpbHRlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB0eXBlIDoga1R5cGVzRm9yTGFzdEZpbHRlcikgeworICAgICAgICAgICAgICAgIG1UeXBlVG9JbmRleEZvclF1ZXJ5W3R5cGVdID0gbUZpbHRlcnMuc2l6ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICBtVHlwZVRvSW5kZXhGb3JDb25maWdbdHlwZSAmIH5DMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBR10gPQorICAgICAgICAgICAgICAgICAgICBtRmlsdGVycy5zaXplKCkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsYXN0RmlsdGVyUGFyYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtUHRycyhsYXN0RmlsdGVyUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgc3RkOjp0cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RmlsdGVyUGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RmlsdGVyUGFyYW1zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1QdHJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIG1GaWx0ZXJzLmJhY2soKS5pbnRmLT5jb25maWdfdmIocGFyYW1QdHJzLCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUludGYtPmdldE5hbWUoKTsgfQorCisgICAgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUludGYtPmdldElkKCk7IH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgc3RkOjpsaXN0PEMyUGFyYW0gKj4gc3RhY2tQYXJhbXNMaXN0KHN0YWNrUGFyYW1zLnNpemUoKSk7CisgICAgICAgIHN0ZDo6Y29weV9uKHN0YWNrUGFyYW1zLmJlZ2luKCksIHN0YWNrUGFyYW1zLnNpemUoKSwgc3RhY2tQYXJhbXNMaXN0LmJlZ2luKCkpOworICAgICAgICBoZWFwUGFyYW1zLT5jbGVhcigpOworICAgICAgICBjMl9zdGF0dXNfdCByZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgLy8gVE9ETzogbG9vcCBvcHRpbWl6YXRpb24KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmlsdGVycy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgLy8gRmlsdGVyIHN0YWNrIHBhcmFtcyBhY2NvcmRpbmcgdG8gbVR5cGVUb0luZGV4Rm9yUXVlcnkKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gc3RhY2tQYXJhbXNGb3JGaWx0ZXI7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdGFja1BhcmFtc0xpc3QuYmVnaW4oKTsgaXQgIT0gc3RhY2tQYXJhbXNMaXN0LmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICpwYXJhbSA9ICppdDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gcGFyYW0tPnR5cGUoKS50eXBlKCk7CisgICAgICAgICAgICAgICAgYXV0byBpdDIgPSBtVHlwZVRvSW5kZXhGb3JRdWVyeS5maW5kKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChpdDIgPT0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZW5kKCkgfHwgaXQyLT5zZWNvbmQgIT0gaSkgeworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNGb3JGaWx0ZXIucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgICAgICAgICBpdCA9IHN0YWNrUGFyYW1zTGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGaWx0ZXIgaGVhcCBwYXJhbXMgYWNjb3JkaW5nIHRvIG1UeXBlVG9JbmRleEZvclF1ZXJ5CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaGVhcFBhcmFtSW5kaWNlc0ZvckZpbHRlcjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBoZWFwUGFyYW1JbmRpY2VzW2pdLnR5cGUoKTsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZmluZCh0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZW5kKCkgfHwgaXQtPnNlY29uZCAhPSBpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1JbmRpY2VzRm9yRmlsdGVyLnB1c2hfYmFjayhoZWFwUGFyYW1JbmRpY2VzW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtc0ZvckZpbHRlcjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmZpbHRlciA9IG1GaWx0ZXJzW2ldLmludGY7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXItPnF1ZXJ5X3ZiKAorICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc0ZvckZpbHRlciwgaGVhcFBhcmFtSW5kaWNlc0ZvckZpbHRlciwgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICZoZWFwUGFyYW1zRm9yRmlsdGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgZmlsdGVyLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIHF1ZXJ5X3ZiOyBlcnI9IiA8PCBlcnI7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhcFBhcmFtcy0+aW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoaGVhcFBhcmFtc0ZvckZpbHRlci5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IoaGVhcFBhcmFtc0ZvckZpbHRlci5lbmQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBzdGFja1BhcmFtc0ZvckludGY7CisgICAgICAgIHN0ZDo6Y29weV9uKHN0YWNrUGFyYW1zTGlzdC5iZWdpbigpLCBzdGFja1BhcmFtc0xpc3Quc2l6ZSgpLCBzdGFja1BhcmFtc0ZvckludGYuYmVnaW4oKSk7CisKKyAgICAgICAgLy8gR2F0aGVyIGhlYXAgcGFyYW1zIHRoYXQgZGlkIG5vdCBnZXQgcXVlcmllZCBmcm9tIHRoZSBmaWx0ZXIgaW50ZXJmYWNlcyBhYm92ZS4KKyAgICAgICAgLy8gVGhlc2UgbmVlZCB0byBiZSBxdWVyaWVkIGZyb20gdGhlIGRlY29kZXIgaW50ZXJmYWNlLgorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaGVhcFBhcmFtSW5kaWNlc0ZvckludGY7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGVhcFBhcmFtSW5kaWNlcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IGhlYXBQYXJhbUluZGljZXNbal0udHlwZSgpOworICAgICAgICAgICAgaWYgKG1UeXBlVG9JbmRleEZvclF1ZXJ5LmZpbmQodHlwZSkgIT0gbVR5cGVUb0luZGV4Rm9yUXVlcnkuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhlYXBQYXJhbUluZGljZXNGb3JJbnRmLnB1c2hfYmFjayhoZWFwUGFyYW1JbmRpY2VzW2pdKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtc0ZvckludGY7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5xdWVyeV92YigKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtc0ZvckludGYsIGhlYXBQYXJhbUluZGljZXNGb3JJbnRmLCBtYXlCbG9jaywgJmhlYXBQYXJhbXNGb3JJbnRmKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKGVyciA9PSBDMl9CQURfSU5ERVggPyBWRVJCT1NFIDogV0FSTklORykKKyAgICAgICAgICAgICAgICAgICAgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG1JbnRmLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlfdmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHBhcmFtcyBuZWVkcyB0byBwcmVzZXJ2ZSB0aGUgb3JkZXIKKyAgICAgICAgaGVhcFBhcmFtcy0+aW5zZXJ0KAorICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGhlYXBQYXJhbXNGb3JJbnRmLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKGhlYXBQYXJhbXNGb3JJbnRmLmVuZCgpKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gQzJfT0s7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gcGFyYW1zRm9ySW50ZjsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICAgICAgYXV0byBpdCA9IG1UeXBlVG9JbmRleEZvckNvbmZpZy5maW5kKHBhcmFtLT50eXBlKCkudHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmFtc0ZvckludGYucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtc0ZvckludGYsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhlcnIgPT0gQzJfQkFEX0lOREVYID8gVkVSQk9TRSA6IFdBUk5JTkcpCisgICAgICAgICAgICAgICAgICAgIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBtSW50Zi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIGNvbmZpZ192YjsgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZpbHRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICB0cmFuc2ZlclBhcmFtc19sKG1JbnRmLCBtRmlsdGVyc1swXS5pbnRmLCBtYXlCbG9jayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYW5zZmVyUGFyYW1zX2wobUZpbHRlcnNbaSAtIDFdLmludGYsIG1GaWx0ZXJzW2ldLmludGYsIG1heUJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmZpbHRlciA9IG1GaWx0ZXJzW2ldLmludGY7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmlsdGVyRmFpbHVyZXM7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtc0ZvckZpbHRlcjsKKyAgICAgICAgICAgIGZvciAoQzJQYXJhbSogcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbVR5cGVUb0luZGV4Rm9yQ29uZmlnLmZpbmQocGFyYW0tPnR5cGUoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtVHlwZVRvSW5kZXhGb3JDb25maWcuZW5kKCkgJiYgaXQtPnNlY29uZCAhPSBpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJhbXNGb3JGaWx0ZXIucHVzaF9iYWNrKHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGZpbHRlci0+Y29uZmlnX3ZiKHBhcmFtc0ZvckZpbHRlciwgbWF5QmxvY2ssICZmaWx0ZXJGYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgTE9HKGVyciA9PSBDMl9CQURfSU5ERVggPyBWRVJCT1NFIDogV0FSTklORykKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBmaWx0ZXItPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgY29uZmlnX3ZiOyBlcnI9IiA8PCBlcnI7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtRmlsdGVycy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICBiYWNrUHJvcGFnYXRlUGFyYW1zX2wobUludGYsIG1GaWx0ZXJzWzBdLmludGYsIG1heUJsb2NrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFja1Byb3BhZ2F0ZVBhcmFtc19sKG1GaWx0ZXJzW2kgLSAyXS5pbnRmLCBtRmlsdGVyc1tpIC0gMV0uaW50ZiwgbWF5QmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IG1JbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgICAgICBpZiAocmVzdWx0ICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG1JbnRmLT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IHJlc3VsdDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogb3B0aW1pemF0aW9uIGlkZWEgLS0tIHByZS1jb21wdXRlIGF0IHRha2VGaWx0ZXIoKS4KKyAgICAgICAgZm9yIChjb25zdCBGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgJmZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBmaWx0ZXJQYXJhbXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXIuaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJmZpbHRlclBhcmFtcyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBmaWx0ZXIuaW50Zi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYjsgZXJyPSIgPDwgcmVzdWx0OworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmcGFyYW1EZXNjIDogZmlsdGVyUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6Y291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZGVzYy5jb250cm9sUGFyYW1zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZGVzYy5jb250cm9sUGFyYW1zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1EZXNjLT5pbmRleCgpLnR5cGUoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYW1zLT5wdXNoX2JhY2socGFyYW1EZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgICAgICBpZiAocmVzdWx0ICE9IEMyX09LICYmIHJlc3VsdCAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgbUludGYtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYjsgZXJyPSIgPDwgcmVzdWx0OworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCAmZmlsdGVyIDogbUZpbHRlcnMpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gZmlsdGVyRmllbGRzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBpbmRpY2VzOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJmZpZWxkID0gZmllbGRzW2ldOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgPSBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoZmllbGQuZmllbGQoKSkpLnR5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5kZXNjLmNvbnRyb2xQYXJhbXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5kZXNjLmNvbnRyb2xQYXJhbXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXJGaWVsZHMucHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGZpbHRlci5pbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihmaWx0ZXJGaWVsZHMsIG1heUJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgZmlsdGVyLmludGYtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IHJlc3VsdDsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbHRlckZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGZpZWxkc1tpbmRpY2VzW2ldXSA9IGZpbHRlckZpZWxkc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBtRmlsdGVyczsKKyAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IG1GaWx0ZXJXcmFwcGVyOworICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzaXplX3Q+IG1UeXBlVG9JbmRleEZvclF1ZXJ5OworICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzaXplX3Q+IG1UeXBlVG9JbmRleEZvckNvbmZpZzsKKworICAgIGMyX3N0YXR1c190IHRyYW5zZmVyUGFyYW1zX2woCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZjdXJyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmbmV4dCwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIHsKKyAgICAgICAgLy8gTk9URTogdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwcmVsaW1pbmFyeSAtLS0gaXQgY291bGQgY2hhbmdlIG9uY2UKKyAgICAgICAgLy8gd2UgZGVmaW5lIHdoYXQgcGFyYW1ldGVycyBuZWVkcyB0byBiZSBwcm9wYWdhdGVkIGluIGNvbXBvbmVudCBjaGFpbmluZy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbmV4dC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnBhcmFtRGVzY3MpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogIiA8PCBuZXh0LT5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiByZXR1cm5lZCBlcnJvciBmb3IgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRmluZCBzdXBwb3J0ZWQgaW5wdXQgcGFyYW1zIGZyb20gdGhlIG5leHQgaW50ZXJmYWNlIGFuZCBmbGlwIGRpcmVjdGlvbgorICAgICAgICAvLyBzbyB0aGV5IGJlY29tZSBvdXRwdXQgcGFyYW1zLgorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZwYXJhbURlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IHBhcmFtRGVzYy0+aW5kZXgoKTsKKyAgICAgICAgICAgIGlmICghaW5kZXguZm9ySW5wdXQoKSB8fCBwYXJhbURlc2MtPmlzUmVhZE9ubHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4LmZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gaW5kZXguc3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleC53aXRoUG9ydCh0cnVlIC8qIG91dHB1dCAqLykud2l0aFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4LndpdGhQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGljZXMucHVzaF9iYWNrKGluZGV4KTsKKyAgICAgICAgfQorICAgICAgICAvLyBRdWVyeSB0aG9zZSBvdXRwdXQgcGFyYW1zIGZyb20gdGhlIGN1cnJlbnQgaW50ZXJmYWNlCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAgICAgZXJyID0gY3Vyci0+cXVlcnlfdmIoe30sIGluZGljZXMsIG1heUJsb2NrLCAmaGVhcFBhcmFtcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiV3JhcHBlZERlY29kZXJJbnRlcmZhY2U6ICIgPDwgY3Vyci0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICIgcmV0dXJuZWQgZXJyb3IgZm9yIHF1ZXJ5X3ZiOyBlcnI9IiA8PCBlcnI7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIC8vIEZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcXVlcmllZCBwYXJhbXMsIHNvIHRoZXkgYmVjb21lIGlucHV0IHBhcmFtZXRlcnMuCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgbmV4dCBpbnRlcmZhY2Ugd2l0aCB0aGUgcGFyYW1zLgorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IGNvbmZpZ1BhcmFtczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXNbaV0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoZWFwUGFyYW1zW2ldLT5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXNbaV0gPSBDMlBhcmFtOjpDb3B5QXNTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAqaGVhcFBhcmFtc1tpXSwgZmFsc2UgLyogb3V0cHV0ICovLCBoZWFwUGFyYW1zW2ldLT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXNbaV0gPSBDMlBhcmFtOjpDb3B5QXNQb3J0KCpoZWFwUGFyYW1zW2ldLCBmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlnUGFyYW1zLnB1c2hfYmFjayhoZWFwUGFyYW1zW2ldLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGVyciA9IG5leHQtPmNvbmZpZ192Yihjb25maWdQYXJhbXMsIG1heUJsb2NrLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG5leHQtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBjb25maWdfdmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGJhY2tQcm9wYWdhdGVQYXJhbXNfbCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmN1cnIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZuZXh0LAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgICAgICAvLyBOT1RFOiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHByZWxpbWluYXJ5IC0tLSBpdCBjb3VsZCBjaGFuZ2Ugb25jZQorICAgICAgICAvLyB3ZSBkZWZpbmUgd2hhdCBwYXJhbWV0ZXJzIG5lZWRzIHRvIGJlIHByb3BhZ2F0ZWQgaW4gY29tcG9uZW50IGNoYWluaW5nLgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gZmlsdGVyV3JhcHBlciA9IG1GaWx0ZXJXcmFwcGVyLmxvY2soKTsKKyAgICAgICAgaWYgKCFmaWx0ZXJXcmFwcGVyKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogRmlsdGVyV3JhcHBlciBub3QgZm91bmQiOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBmaWx0ZXJXcmFwcGVyLT5xdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KG5leHQsICZwYXJhbXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXcmFwcGVkRGVjb2RlckludGVyZmFjZTogRmlsdGVyV3JhcHBlciByZXR1cm5lZCBlcnJvciBmb3IgIgorICAgICAgICAgICAgICAgIDw8ICJxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50OyBpbnRmPSIgPDwgbmV4dC0+Z2V0TmFtZSgpIDw8ICIgZXJyPSIgPDwgZXJyOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnUGFyYW1zOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXNbaV0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZ1BhcmFtcy5wdXNoX2JhY2socGFyYW1zW2ldLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGN1cnItPmNvbmZpZ192Yihjb25maWdQYXJhbXMsIG1heUJsb2NrLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIldyYXBwZWREZWNvZGVySW50ZXJmYWNlOiAiIDw8IG5leHQtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiIHJldHVybmVkIGVycm9yIGZvciBjb25maWdfdmI7IGVycj0iIDw8IGVycjsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KK307CisKK2NsYXNzIFdyYXBwZWREZWNvZGVyIDogcHVibGljIEMyQ29tcG9uZW50LCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxXcmFwcGVkRGVjb2Rlcj4geworcHVibGljOgorICAgIFdyYXBwZWREZWNvZGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiAmJmZpbHRlcnMsCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEZpbHRlcldyYXBwZXI+IGZpbHRlcldyYXBwZXIpCisgICAgICAgIDogbUNvbXAoY29tcCksIG1GaWx0ZXJzKHN0ZDo6bW92ZShmaWx0ZXJzKSksIG1GaWx0ZXJXcmFwcGVyKGZpbHRlcldyYXBwZXIpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBmaWx0ZXJzRHVwKG1GaWx0ZXJzKTsKKyAgICAgICAgbUludGYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFdyYXBwZWREZWNvZGVySW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBjb21wLT5pbnRmKCksIHN0ZDo6bW92ZShmaWx0ZXJzRHVwKSwgZmlsdGVyV3JhcHBlcik7CisgICAgfQorCisgICAgfldyYXBwZWREZWNvZGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGUgeyByZXR1cm4gbUludGY7IH0KKworICAgIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBzZXRMaXN0ZW5lckludGVybmFsKG1GaWx0ZXJzLCBsaXN0ZW5lciwgbWF5QmxvY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNvbXAtPnNldExpc3RlbmVyX3ZiKG51bGxwdHIsIG1heUJsb2NrKTsKKyAgICAgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50ICZmaWx0ZXIgOiBtRmlsdGVycykgeworICAgICAgICAgICAgICAgIGZpbHRlci5jb21wLT5zZXRMaXN0ZW5lcl92YihudWxscHRyLCBtYXlCbG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBhbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IG1Db21wLT5mbHVzaF9zbShtb2RlLCBmbHVzaGVkV29yayk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmlsdGVyRmx1c2hlZFdvcms7CisgICAgICAgIGZvciAoRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50IGZpbHRlciA6IG1SdW5uaW5nRmlsdGVycykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmNvbXAtPmZsdXNoX3NtKG1vZGUsICZmaWx0ZXJGbHVzaGVkV29yayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hlZFdvcmstPnNwbGljZShmbHVzaGVkV29yay0+ZW5kKCksIGZpbHRlckZsdXNoZWRXb3JrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IHNpbXBsaWZ5IHVzaW5nIGNvbXAtPmRyYWluX25iKG1vZGUpCisgICAgICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzogeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gZW9zV29ya3tuZXcgQzJXb3JrfTsKKyAgICAgICAgICAgIGVvc1dvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGVvc1dvcmstPndvcmtsZXRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKSk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZShlb3NXb3JrKSk7CisgICAgICAgICAgICBtQ29tcC0+cXVldWVfbmIoJml0ZW1zKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9OT19FT1M6CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gZmlsdGVyczsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxGaWx0ZXJXcmFwcGVyPiBmaWx0ZXJXcmFwcGVyID0gbUZpbHRlcldyYXBwZXIubG9jaygpKSB7CisgICAgICAgICAgICAvLyBMZXQncyBjaGVjayBpZiB3ZSBoYXZlIGZpbHRlcnMgdGhhdCB3ZSBjYW4gc2tpcAorICAgICAgICAgICAgZm9yIChGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQgJmZpbHRlciA6IG1GaWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJXcmFwcGVyLT5pc0ZpbHRlcmluZ0VuYWJsZWQoZmlsdGVyLmludGYpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiZmlsdGVyaW5nIGRpc2FibGVkIGZvciAiIDw8IGZpbHRlci50cmFpdHMubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiZmlsdGVyaW5nIGVuYWJsZWQgZm9yICIgPDwgZmlsdGVyLnRyYWl0cy5uYW1lOworICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaF9iYWNrKGZpbHRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsdGVycy5zaXplKCkgPCBtRmlsdGVycy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgKG1GaWx0ZXJzLnNpemUoKSAtIGZpbHRlcnMuc2l6ZSgpKSA8PCAiIGZpbHRlcihzKSBza2lwcGVkIjsKKyAgICAgICAgICAgICAgICBzZXRMaXN0ZW5lckludGVybmFsKGZpbHRlcnMsIG1MaXN0ZW5lciwgQzJfTUFZX0JMT0NLKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvciBmaWx0ZXJzQ29weShmaWx0ZXJzKTsKKyAgICAgICAgICAgICAgICBtSW50Zi0+dGFrZUZpbHRlcnMoc3RkOjptb3ZlKGZpbHRlcnNDb3B5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcC0+c3RhcnQoKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCAmZmlsdGVyIDogZmlsdGVycykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmNvbXAtPnN0YXJ0KCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY29tcG9uZW50cyBhcmUgYWxyZWFkeSBzdGFydGVkIHN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBlbmRlZCB1cCBpbiBhbiBpbmNvaGVyZW50IHN0YXRlLgorICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJ1bm5pbmdGaWx0ZXJzID0gc3RkOjptb3ZlKGZpbHRlcnMpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXAtPnN0b3AoKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCBmaWx0ZXIgOiBtUnVubmluZ0ZpbHRlcnMpIHsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGZpbHRlci5jb21wLT5zdG9wKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY29tcG9uZW50cyBhcmUgYWxyZWFkeSBzdG9wcGVkIHN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBlbmRlZCB1cCBpbiBhbiBpbmNvaGVyZW50IHN0YXRlLgorICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJ1bm5pbmdGaWx0ZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXAtPnJlc2V0KCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCBmaWx0ZXIgOiBtRmlsdGVycykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmNvbXAtPnJlc2V0KCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY29tcG9uZW50cyBhcmUgYWxyZWFkeSByZXNldCBzdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgLy8gd2UgZW5kZWQgdXAgaW4gYW4gaW5jb2hlcmVudCBzdGF0ZS4KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgLy8gY29udGludWUgZm9yIHRoZSByZXN0IG9mIHRoZSBjaGFpbgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SdW5uaW5nRmlsdGVycy5jbGVhcigpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IG1Db21wLT5yZWxlYXNlKCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudCBmaWx0ZXIgOiBtRmlsdGVycykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZmlsdGVyLmNvbXAtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBjb21wb25lbnRzIGFyZSBhbHJlYWR5IHJlbGVhc2VkIHN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBlbmRlZCB1cCBpbiBhbiBpbmNvaGVyZW50IHN0YXRlLgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAvLyBjb250aW51ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGNoYWluCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJ1bm5pbmdGaWx0ZXJzLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGNsYXNzIFBhc3NpbmdMaXN0ZW5lciA6IHB1YmxpYyBMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICBQYXNzaW5nTGlzdGVuZXIoCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiB3cmFwcGVkQ29tcG9uZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJndyYXBwZWRDb21wb25lbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG5leHRDb21wb25lbnQpCisgICAgICAgICAgICA6IG1XcmFwcGVkQ29tcG9uZW50KHdyYXBwZWRDb21wb25lbnQpLAorICAgICAgICAgICAgICBtV3JhcHBlZENvbXBvbmVudExpc3RlbmVyKHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lciksCisgICAgICAgICAgICAgIG1OZXh0Q29tcG9uZW50KG5leHRDb21wb25lbnQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiwKKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBuZXh0Q29tcG9uZW50ID0gbU5leHRDb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmYWlsZWRXb3JrSXRlbXM7CisgICAgICAgICAgICBpZiAoIW5leHRDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgY29tcG9uZW50IHVuZXhwZWN0ZWRseSByZWxlYXNlZCB3aGlsZSB0aGUgd29yayBpcworICAgICAgICAgICAgICAgICAgICAvLyBpbi1mbGlnaHQuIFJlcG9ydCBDMl9DT1JSVVBURUQgdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICBmYWlsZWRXb3JrSXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmtJdGVtcy5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSB3b3JrSXRlbXMuYmVnaW4oKTsgaXQgIT0gd29ya0l0ZW1zLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgPSAqaXQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkV29ya0l0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUoKml0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IHdvcmtJdGVtcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBjMl9jbnRyNjRfdCBjdXN0b21PcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dCA9IHN0ZDo6bW92ZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSBjdXN0b21PcmRpbmFsOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6ZmxhZ3NfdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuaW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZhaWxlZFdvcmtJdGVtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZhaWxlZFdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIndvcmsgIyIgPDwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWsoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiBlcnI9IiA8PCB3b3JrLT5yZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdvcmtsZXRzLnNpemUoKT0iIDw8IHdvcmstPndvcmtsZXRzLnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gd3JhcHBlZENvbXBvbmVudExpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkQ29tcG9uZW50TGlzdGVuZXIubG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci0+b25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZENvbXBvbmVudCwgc3RkOjptb3ZlKGZhaWxlZFdvcmtJdGVtcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXh0Q29tcG9uZW50LT5xdWV1ZV9uYigmd29ya0l0ZW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKAorICAgICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+Pikgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gVHJpcCBub3Qgc3VwcG9ydGVkCisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4sIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gd3JhcHBlZENvbXBvbmVudExpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lci5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXItPm9uRXJyb3JfbmIobVdyYXBwZWRDb21wb25lbnQsIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IG1XcmFwcGVkQ29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBtV3JhcHBlZENvbXBvbmVudExpc3RlbmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBtTmV4dENvbXBvbmVudDsKKyAgICB9OworCisgICAgY2xhc3MgTGFzdExpc3RlbmVyIDogcHVibGljIExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIExhc3RMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IHdyYXBwZWRDb21wb25lbnQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmd3JhcHBlZENvbXBvbmVudExpc3RlbmVyKQorICAgICAgICAgICAgOiBtV3JhcHBlZENvbXBvbmVudCh3cmFwcGVkQ29tcG9uZW50KSwKKyAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lcih3cmFwcGVkQ29tcG9uZW50TGlzdGVuZXIpIHsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiwKKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKG1XcmFwcGVkQ29tcG9uZW50LmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkQ29tcG9uZW50TGlzdGVuZXIubG9jaygpKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlZENvbXBvbmVudExpc3RlbmVyLT5vbldvcmtEb25lX25iKAorICAgICAgICAgICAgICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnQsIHN0ZDo6bW92ZSh3b3JrSXRlbXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKAorICAgICAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+Pikgb3ZlcnJpZGUgeworICAgICAgICAgICAgLy8gVHJpcCBub3Qgc3VwcG9ydGVkCisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4sIHVpbnQzMl90IGVycm9yQ29kZSkgeworICAgICAgICAgICAgaWYgKG1XcmFwcGVkQ29tcG9uZW50LmV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IHdyYXBwZWRDb21wb25lbnRMaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkQ29tcG9uZW50TGlzdGVuZXIubG9jaygpKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlZENvbXBvbmVudExpc3RlbmVyLT5vbkVycm9yX25iKG1XcmFwcGVkQ29tcG9uZW50LCBlcnJvckNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBtV3JhcHBlZENvbXBvbmVudDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gbVdyYXBwZWRDb21wb25lbnRMaXN0ZW5lcjsKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBtQ29tcDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8V3JhcHBlZERlY29kZXJJbnRlcmZhY2U+IG1JbnRmOworICAgIHN0ZDo6dmVjdG9yPEZpbHRlcldyYXBwZXI6OkNvbXBvbmVudD4gbUZpbHRlcnM7CisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBtUnVubmluZ0ZpbHRlcnM7CisgICAgc3RkOjp3ZWFrX3B0cjxGaWx0ZXJXcmFwcGVyPiBtRmlsdGVyV3JhcHBlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgYmFzZTo6U2NvcGVkTG9nU2V2ZXJpdHkgbVNjb3BlZExvZ1NldmVyaXR5e2Jhc2U6OlZFUkJPU0V9OworI2VuZGlmCisKKyAgICBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lckludGVybmFsKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiAmZmlsdGVycywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgICAgICBpZiAoZmlsdGVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbUNvbXAtPnNldExpc3RlbmVyX3ZiKGxpc3RlbmVyLCBtYXlCbG9jayk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyIHBhc3NpbmdMaXN0ZW5lciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UGFzc2luZ0xpc3RlbmVyPigKKyAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksCisgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgZmlsdGVycy5mcm9udCgpLmNvbXApOworICAgICAgICBtQ29tcC0+c2V0TGlzdGVuZXJfdmIocGFzc2luZ0xpc3RlbmVyLCBtYXlCbG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCkgLSAxOyArK2kpIHsKKyAgICAgICAgICAgIGZpbHRlcnNbaV0uY29tcC0+c2V0TGlzdGVuZXJfdmIoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8UGFzc2luZ0xpc3RlbmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1tpICsgMV0uY29tcCksCisgICAgICAgICAgICAgICAgICAgIG1heUJsb2NrKTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJzLmJhY2soKS5jb21wLT5zZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExhc3RMaXN0ZW5lcj4oc2hhcmVkX2Zyb21fdGhpcygpLCBsaXN0ZW5lciksIG1heUJsb2NrKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KK307CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworRmlsdGVyV3JhcHBlcjo6RmlsdGVyV3JhcHBlcihzdGQ6OnVuaXF1ZV9wdHI8UGx1Z2luPiAmJnBsdWdpbikKKyAgICA6IG1Jbml0KE5PX0lOSVQpLAorICAgICAgbVBsdWdpbihzdGQ6Om1vdmUocGx1Z2luKSkgeworICAgIGlmIChtUGx1Z2luLT5zdGF0dXMoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJwbHVnaW4gbm90IE9LOiAiIDw8IG1QbHVnaW4tPnN0YXR1cygpOworICAgICAgICBtUGx1Z2luLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVN0b3JlID0gbVBsdWdpbi0+Z2V0U3RvcmUoKTsKKyAgICBpZiAoIW1TdG9yZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJubyBzdG9yZSI7CisgICAgICAgIG1QbHVnaW4ucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IHRyYWl0cyA9CisgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBzdGQ6OnNvcnQoCisgICAgICAgICAgICB0cmFpdHMuYmVnaW4oKSwKKyAgICAgICAgICAgIHRyYWl0cy5lbmQoKSwKKyAgICAgICAgICAgIFtdKHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+ICZiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEtPnJhbmsgPCBiLT5yYW5rOworICAgICAgICAgICAgfSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFpdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+ICZ0cmFpdCA9IHRyYWl0c1tpXTsKKyAgICAgICAgaWYgKHRyYWl0LT5kb21haW4gPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUgorICAgICAgICAgICAgICAgIHx8IHRyYWl0LT5kb21haW4gPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTworICAgICAgICAgICAgICAgIHx8IHRyYWl0LT5raW5kICE9IEMyQ29tcG9uZW50OjpLSU5EX09USEVSKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8IHRyYWl0LT5uYW1lIDw8ICIgaXMgaWdub3JlZCBiZWNhdXNlIG9mIGRvbWFpbi9raW5kOiAiCisgICAgICAgICAgICAgICAgPDwgdHJhaXQtPmRvbWFpbiA8PCAiLyIgPDwgdHJhaXQtPmtpbmQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBEZXNjcmlwdG9yIGRlc2M7CisgICAgICAgIGlmICghbVBsdWdpbi0+ZGVzY3JpYmUodHJhaXQtPm5hbWUsICZkZXNjKSkgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCB0cmFpdC0+bmFtZSA8PCAiIGlzIGlnbm9yZWQgYmVjYXVzZSBkZXNjcmliZSgpIGZhaWxlZCI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50cy5wdXNoX2JhY2soe251bGxwdHIsIG51bGxwdHIsICp0cmFpdCwgZGVzY30pOworICAgIH0KKyAgICBpZiAobUNvbXBvbmVudHMuZW1wdHkoKSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJGaWx0ZXJXcmFwcGVyOiBubyBmaWx0ZXIgY29tcG9uZW50IGZvdW5kIjsKKyAgICAgICAgbVBsdWdpbi5yZXNldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jbml0ID0gT0s7Cit9CisKK0ZpbHRlcldyYXBwZXI6On5GaWx0ZXJXcmFwcGVyKCkgeworfQorCitzdGQ6OnZlY3RvcjxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IEZpbHRlcldyYXBwZXI6OmNyZWF0ZUZpbHRlcnMoKSB7CisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBmaWx0ZXJzOworICAgIGZvciAoY29uc3QgRmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50ICZmaWx0ZXIgOiBtQ29tcG9uZW50cykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXA7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICAgICAgaWYgKEMyX09LICE9IG1TdG9yZS0+Y3JlYXRlQ29tcG9uZW50KGZpbHRlci50cmFpdHMubmFtZSwgJmNvbXApKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgZmlsdGVycy5wdXNoX2JhY2soe2NvbXAsIGNvbXAtPmludGYoKSwgZmlsdGVyLnRyYWl0cywgZmlsdGVyLmRlc2N9KTsKKyAgICB9CisgICAgcmV0dXJuIGZpbHRlcnM7Cit9CisKK0MyQ29tcG9uZW50OjpUcmFpdHMgRmlsdGVyV3JhcHBlcjo6Z2V0VHJhaXRzKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSB7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobUNhY2hlTXV0ZXgpOworICAgICAgICBpZiAobUNhY2hlZFRyYWl0cy5jb3VudChpbnRmLT5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhY2hlZFRyYWl0cy5hdChpbnRmLT5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW47CisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPnF1ZXJ5X3ZiKHsmZG9tYWluLCAma2luZH0sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOworICAgIEMyQ29tcG9uZW50OjpUcmFpdHMgdHJhaXRzID0geworICAgICAgICAicXVlcnkgZmFpbGVkIiwgIC8vIG5hbWUKKyAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUiwKKyAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfT1RIRVIsCisgICAgICAgIDAsICAgLy8gcmFuaywgdW51c2VkCisgICAgICAgICIiLCAgLy8gbWVkaWEgdHlwZSwgdW51c2VkCisgICAgICAgICIiLCAgLy8gb3duZXIsIHVudXNlZAorICAgICAgICB7fSwgIC8vIGFsaWFzZXMsIHVudXNlZAorICAgIH07CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICB0cmFpdHMgPSB7CisgICAgICAgICAgICBpbnRmLT5nZXROYW1lKCksCisgICAgICAgICAgICBkb21haW4udmFsdWUsCisgICAgICAgICAgICBraW5kLnZhbHVlLAorICAgICAgICAgICAgMCwgICAvLyByYW5rLCB1bnVzZWQKKyAgICAgICAgICAgICIiLCAgLy8gbWVkaWEgdHlwZSwgdW51c2VkCisgICAgICAgICAgICAiIiwgIC8vIG93bmVyLCB1bnVzZWQKKyAgICAgICAgICAgIHt9LCAgLy8gYWxpYXNlcywgdW51c2VkCisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtQ2FjaGVNdXRleCk7CisgICAgICAgIG1DYWNoZWRUcmFpdHNbdHJhaXRzLm5hbWVdID0gdHJhaXRzOworICAgIH0KKyAgICByZXR1cm4gdHJhaXRzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IEZpbHRlcldyYXBwZXI6Om1heWJlV3JhcEludGVyZmFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKSB7CisgICAgaWYgKG1Jbml0ICE9IE9LKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAibWF5YmVXcmFwSW50ZXJmYWNlOiBXcmFwcGVyIG5vdCBpbml0aWFsaXplZDogIgorICAgICAgICAgICAgICAgIDw8IGludGYtPmdldE5hbWUoKSA8PCAiIGlzIG5vdCB3cmFwcGVkLiI7CisgICAgICAgIHJldHVybiBpbnRmOworICAgIH0KKyAgICBDMkNvbXBvbmVudDo6VHJhaXRzIHRyYWl0cyA9IGdldFRyYWl0cyhpbnRmKTsKKyAgICBpZiAodHJhaXRzLm5hbWUgIT0gaW50Zi0+Z2V0TmFtZSgpKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAibWF5YmVXcmFwSW50ZXJmYWNlOiBRdWVyeWluZyB0cmFpdHMgZnJvbSAiIDw8IGludGYtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOyBub3Qgd3JhcHBpbmcgdGhlIGludGVyZmFjZSI7CisgICAgICAgIHJldHVybiBpbnRmOworICAgIH0KKyAgICBpZiAoKHRyYWl0cy5kb21haW4gIT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyAmJiB0cmFpdHMuZG9tYWluICE9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UpCisgICAgICAgICAgICB8fCB0cmFpdHMua2luZCAhPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAibWF5YmVXcmFwSW50ZXJmYWNlOiAiIDw8IHRyYWl0cy5uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgdmlkZW8vaW1hZ2UgZGVjb2Rlcjsgbm90IHdyYXBwaW5nIHRoZSBpbnRlcmZhY2UiOworICAgICAgICByZXR1cm4gaW50ZjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8V3JhcHBlZERlY29kZXJJbnRlcmZhY2U+KAorICAgICAgICAgICAgaW50ZiwgY3JlYXRlRmlsdGVycygpLCB3ZWFrX2Zyb21fdGhpcygpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBGaWx0ZXJXcmFwcGVyOjptYXliZVdyYXBDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCkgeworICAgIGlmIChtSW5pdCAhPSBPSykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm1heWJlV3JhcENvbXBvbmVudDogV3JhcHBlciBub3QgaW5pdGlhbGl6ZWQ6ICIKKyAgICAgICAgICAgICAgICA8PCBjb21wLT5pbnRmKCktPmdldE5hbWUoKSA8PCAiIGlzIG5vdCB3cmFwcGVkLiI7CisgICAgICAgIHJldHVybiBjb21wOworICAgIH0KKyAgICBDMkNvbXBvbmVudDo6VHJhaXRzIHRyYWl0cyA9IGdldFRyYWl0cyhjb21wLT5pbnRmKCkpOworICAgIGlmICh0cmFpdHMubmFtZSAhPSBjb21wLT5pbnRmKCktPmdldE5hbWUoKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIm1heWJlV3JhcENvbXBvbmVudDogUXVlcnlpbmcgdHJhaXRzIGZyb20gIiA8PCBjb21wLT5pbnRmKCktPmdldE5hbWUoKQorICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOyBub3Qgd3JhcHBpbmcgdGhlIGNvbXBvbmVudCI7CisgICAgICAgIHJldHVybiBjb21wOworICAgIH0KKyAgICBpZiAoKHRyYWl0cy5kb21haW4gIT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTyAmJiB0cmFpdHMuZG9tYWluICE9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0UpCisgICAgICAgICAgICB8fCB0cmFpdHMua2luZCAhPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAibWF5YmVXcmFwQ29tcG9uZW50OiAiIDw8IHRyYWl0cy5uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgdmlkZW8vaW1hZ2UgZGVjb2Rlcjsgbm90IHdyYXBwaW5nIHRoZSBjb21wb25lbnQiOworICAgICAgICByZXR1cm4gY29tcDsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8Q29tcG9uZW50PiBmaWx0ZXJzID0gY3JlYXRlRmlsdGVycygpOworICAgIHN0ZDo6c2hhcmVkX3B0ciB3cmFwcGVkID0gc3RkOjptYWtlX3NoYXJlZDxXcmFwcGVkRGVjb2Rlcj4oCisgICAgICAgICAgICBjb21wLCBzdGQ6OnZlY3RvcihmaWx0ZXJzKSwgd2Vha19mcm9tX3RoaXMoKSk7CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVdyYXBwZWRDb21wb25lbnRzTXV0ZXgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gJmNvbXBvbmVudHMgPQorICAgICAgICAgICAgbVdyYXBwZWRDb21wb25lbnRzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBjb21wb25lbnRzLnB1c2hfYmFjayh3cmFwcGVkKTsKKyAgICAgICAgY29tcG9uZW50cy5wdXNoX2JhY2soY29tcCk7CisgICAgICAgIGZvciAoY29uc3QgQ29tcG9uZW50ICZmaWx0ZXIgOiBmaWx0ZXJzKSB7CisgICAgICAgICAgICBjb21wb25lbnRzLnB1c2hfYmFjayhmaWx0ZXIuY29tcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHdyYXBwZWQ7Cit9CisKK2Jvb2wgRmlsdGVyV3JhcHBlcjo6aXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICBpZiAobUluaXQgIT0gT0spIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJpc0ZpbHRlcmluZ0VuYWJsZWQ6IFdyYXBwZXIgbm90IGluaXRpYWxpemVkOiAiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtUGx1Z2luLT5pc0ZpbHRlcmluZ0VuYWJsZWQoaW50Zik7Cit9CisKK2MyX3N0YXR1c190IEZpbHRlcldyYXBwZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtV3JhcHBlZENvbXBvbmVudHNNdXRleCk7CisgICAgZm9yIChhdXRvIGl0ID0gbVdyYXBwZWRDb21wb25lbnRzLmJlZ2luKCk7IGl0ICE9IG1XcmFwcGVkQ29tcG9uZW50cy5lbmQoKTsgKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcCA9IGl0LT5mcm9udCgpLmxvY2soKTsKKyAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICBpdCA9IG1XcmFwcGVkQ29tcG9uZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcG9uZW50ID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IGNvbXBvbmVudHMoaXQtPnNpemUoKSk7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgaXQtPmJlZ2luKCksIGl0LT5lbmQoKSwgY29tcG9uZW50cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiAmZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKEMyX09LID09IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50cywgcG9vbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZUNvZGVjMkJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworYzJfc3RhdHVzX3QgRmlsdGVyV3JhcHBlcjo6cXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZiwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqcGFyYW1zKSB7CisgICAgaWYgKG1Jbml0ICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudDogV3JhcHBlciBub3QgaW5pdGlhbGl6ZWQ6ICI7CisgICAgICAgIHJldHVybiBDMl9OT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVBsdWdpbi0+cXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudChpbnRmLCBwYXJhbXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlcldyYXBwZXJTdHViLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyU3R1Yi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjYTU5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJXcmFwcGVyU3R1Yi5jcHAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItRmlsdGVyV3JhcHBlclN0dWIiCisKKyNpbmNsdWRlIDxGaWx0ZXJXcmFwcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmlsdGVyV3JhcHBlcjo6RmlsdGVyV3JhcHBlcihzdGQ6OnVuaXF1ZV9wdHI8UGx1Z2luPiAmJikgeworfQorCitGaWx0ZXJXcmFwcGVyOjp+RmlsdGVyV3JhcHBlcigpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBGaWx0ZXJXcmFwcGVyOjptYXliZVdyYXBJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZikgeworICAgIHJldHVybiBpbnRmOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IEZpbHRlcldyYXBwZXI6Om1heWJlV3JhcENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wKSB7CisgICAgcmV0dXJuIGNvbXA7Cit9CisKK2Jvb2wgRmlsdGVyV3JhcHBlcjo6aXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJikgeworICAgIHJldHVybiBmYWxzZTsKK30KKworYzJfc3RhdHVzX3QgRmlsdGVyV3JhcHBlcjo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvZGVjMkJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBwb29sKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbmNsdWRlL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbmNsdWRlL2NvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWFjNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2luY2x1ZGUvY29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfUExVR0lOX0ZJTFRFUl9QTFVHSU5fSAorCisjZGVmaW5lIENPREVDMl9ISURMX1BMVUdJTl9GSUxURVJfUExVR0lOX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRmlsdGVyUGx1Z2luX1YxIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgVkVSU0lPTiA9IDE7CisKKyAgICB2aXJ0dWFsIH5GaWx0ZXJQbHVnaW5fVjEoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgQzJDb21wb25lbnRTdG9yZSBvYmplY3Qgd2l0aCB3aGljaCBjbGllbnRzIGNhbiBjcmVhdGUKKyAgICAgKiBmaWx0ZXIgY29tcG9uZW50cyAvIGludGVyZmFjZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gZ2V0Q29tcG9uZW50U3RvcmUoKSA9IDA7CisgICAgc3RydWN0IERlc2NyaXB0b3IgeworICAgICAgICAvLyBQYXJhbWV0ZXJzIHRoYXQgY2xpZW50IHNldHMgZm9yIGZpbHRlciBjb250cm9sLgorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6VHlwZT4gY29udHJvbFBhcmFtczsKKyAgICAgICAgLy8gUGFyYW1ldGVycyB0aGF0IHRoZSBjb21wb25lbnQgY2hhbmdlcyBhZnRlciBmaWx0ZXJpbmcuCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpUeXBlPiBhZmZlY3RlZFBhcmFtczsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRGVzY3JpYmUgYSBmaWx0ZXIgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWVbaW5dICBmaWx0ZXIncyBuYW1lCisgICAgICogQHBhcmFtIGRlc2Nbb3V0XSBwb2ludGVyIHRvIGZpbHRlciBkZXNjcmlwdG9yIHRvIGJlIHBvcHVsYXRlZAorICAgICAqIEByZXR1cm4gIHRydWUgaWYgfG5hbWV8IGlzIGluIHRoZSBzdG9yZSBhbmQgfGRlc2N8IGlzIHBvcHVsYXRlZDsKKyAgICAgKiAgICAgICAgICBmYWxzZSBpZiB8bmFtZXwgaXMgbm90IHJlY29nbml6ZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgZGVzY3JpYmUoQzJTdHJpbmcgbmFtZSwgRGVzY3JpcHRvciAqZGVzYykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIGEgY29tcG9uZW50IHdpbGwgYXBwbHkgZmlsdGVyaW5nIGFmdGVyIGFsbCBnaXZlbiB0aGUKKyAgICAgKiBjdXJyZW50IGNvbmZpZ3VyYXRpb247IGZhbHNlIGlmIGl0IHdpbGwgYmUgbm8tb3AuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbWV0ZXJzIHRvIHxpbnRmfCwgd2hpY2ggdGhlIGNvbXBvbmVudCB3YW50cyBhcHBsaWVkIHRvCisgICAgICogdGhlIHByZXZpb3VzIGNvbXBvbmVudCBpbiB0aGUgY2hhaW4uIEZvciBleGFtcGxlLCBhbiBpbWFnZS92aWRlbyBmaWx0ZXIKKyAgICAgKiBtYXkgcmVxdWlyZSBzcGVjaWZpYyB1c2FnZSBvciBwaXhlbCBmb3JtYXQgZnJvbSB0aGUgcHJldmlvdXMgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpwYXJhbXMpID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgeworCit0eXBlZGVmIGludDMyX3QgKCpHZXRGaWx0ZXJQbHVnaW5WZXJzaW9uRnVuYykoKTsKK2ludDMyX3QgR2V0RmlsdGVyUGx1Z2luVmVyc2lvbigpOworCit0eXBlZGVmIHZvaWQqICgqQ3JlYXRlRmlsdGVyUGx1Z2luRnVuYykoKTsKK3ZvaWQgKkNyZWF0ZUZpbHRlclBsdWdpbigpOworCit0eXBlZGVmIHZvaWQgKCpEZXN0cm95RmlsdGVyUGx1Z2luRnVuYykodm9pZCAqKTsKK3ZvaWQgRGVzdHJveUZpbHRlclBsdWdpbih2b2lkICpwbHVnaW4pOworCit9ICAvLyBleHRlcm4gIkMiCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfUExVR0lOX0ZJTFRFUl9QTFVHSU5fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0RlZmF1bHRGaWx0ZXJQbHVnaW4uaCBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbnRlcm5hbC9EZWZhdWx0RmlsdGVyUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhYjM5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9pbnRlcm5hbC9EZWZhdWx0RmlsdGVyUGx1Z2luLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9QTFVHSU5fREVGQVVMVF9GSUxURVJfUExVR0lOX0gKKworI2RlZmluZSBDT0RFQzJfSElETF9QTFVHSU5fREVGQVVMVF9GSUxURVJfUExVR0lOX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL3BsdWdpbi9GaWx0ZXJQbHVnaW4uaD4KKworI2luY2x1ZGUgPEZpbHRlcldyYXBwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZWZhdWx0RmlsdGVyUGx1Z2luIDogcHVibGljIEZpbHRlcldyYXBwZXI6OlBsdWdpbiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGVmYXVsdEZpbHRlclBsdWdpbihjb25zdCBjaGFyICpwbHVnaW5QYXRoKTsKKworICAgIH5EZWZhdWx0RmlsdGVyUGx1Z2luKCk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSW5pdDsgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdldFN0b3JlKCkgb3ZlcnJpZGUgeyByZXR1cm4gbVN0b3JlOyB9CisgICAgYm9vbCBkZXNjcmliZShDMlN0cmluZyBuYW1lLCBGaWx0ZXJXcmFwcGVyOjpEZXNjcmlwdG9yICpkZXNjKSBvdmVycmlkZTsKKyAgICBib29sIGlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnBhcmFtcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXQ7CisgICAgdm9pZCAqbUhhbmRsZTsKKyAgICBEZXN0cm95RmlsdGVyUGx1Z2luRnVuYyBtRGVzdHJveVBsdWdpbjsKKyAgICBGaWx0ZXJQbHVnaW5fVjEgKm1QbHVnaW47CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IG1TdG9yZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfUExVR0lOX0RFRkFVTFRfRklMVEVSX1BMVUdJTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vaW50ZXJuYWwvRmlsdGVyV3JhcHBlci5oIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0ZpbHRlcldyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJjYzMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL2ludGVybmFsL0ZpbHRlcldyYXBwZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9QTFVHSU5fRklMVEVSX1dSQVBQRVJfSAorCisjZGVmaW5lIENPREVDMl9ISURMX1BMVUdJTl9GSUxURVJfV1JBUFBFUl9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvcGx1Z2luL0ZpbHRlclBsdWdpbi5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRPRE86IGRvY3VtZW50YXRpb24KK2NsYXNzIEZpbHRlcldyYXBwZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxGaWx0ZXJXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgdXNpbmcgRGVzY3JpcHRvciA9IEZpbHRlclBsdWdpbl9WMTo6RGVzY3JpcHRvcjsKKworICAgIGNsYXNzIFBsdWdpbiB7CisgICAgcHVibGljOgorICAgICAgICBQbHVnaW4oKSA9IGRlZmF1bHQ7CisgICAgICAgIHZpcnR1YWwgflBsdWdpbigpID0gZGVmYXVsdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGF0dXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdldFN0b3JlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgZGVzY3JpYmUoQzJTdHJpbmcgbmFtZSwgRGVzY3JpcHRvciAqZGVzYykgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpID0gMDsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqcGFyYW1zKSA9IDA7CisgICAgICAgIEMyX0RPX05PVF9DT1BZKFBsdWdpbik7CisgICAgfTsKKworICAgIHN0cnVjdCBDb21wb25lbnQgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGNvbXA7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZjsKKyAgICAgICAgY29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cyB0cmFpdHM7CisgICAgICAgIGNvbnN0IERlc2NyaXB0b3IgZGVzYzsKKyAgICB9OworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEZpbHRlcldyYXBwZXIoc3RkOjp1bmlxdWVfcHRyPFBsdWdpbj4gJiZwbHVnaW4pOworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4gQ3JlYXRlKHN0ZDo6dW5pcXVlX3B0cjxQbHVnaW4+ICYmcGx1Z2luKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RmlsdGVyV3JhcHBlcj4obmV3IEZpbHRlcldyYXBwZXIoc3RkOjptb3ZlKHBsdWdpbikpKTsKKyAgICB9CisgICAgfkZpbHRlcldyYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd3JhcHBlZCBpbnRlcmZhY2UsIG9yIHxpbnRmfCBpZiB3cmFwcGluZyBpcyBub3QgcG9zc2libGUgLyBuZWVkZWQuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBtYXliZVdyYXBJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3cmFwcGVkIGNvbXBvbmVudCwgb3IgfGNvbXB8IGlmIHdyYXBwaW5nIGlzIG5vdCBwb3NzaWJsZSAvIG5lZWRlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1heWJlV3JhcENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHR1cmUgaWZmIHRoZSBmaWx0ZXJpbmcgd2lsbCBhcHBseSB0byB0aGUgYnVmZmVyIGluIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBib29sIGlzRmlsdGVyaW5nRW5hYmxlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEMyQmxvY2tQb29sIG9iamVjdCB3aXRoIHxhbGxvY2F0b3JJZHwgZm9yIHxjb21wb25lbnR8LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbWV0ZXJzIHRoYXQgfGludGZ8IHdhbnRzIGZyb20gdGhlIHByZXZpb3VzIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnBhcmFtcyk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBsdWdpbj4gbVBsdWdpbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIHN0ZDo6bGlzdDxGaWx0ZXJXcmFwcGVyOjpDb21wb25lbnQ+IG1Db21wb25lbnRzOworCisgICAgc3RkOjptdXRleCBtQ2FjaGVNdXRleDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQzJDb21wb25lbnQ6OlRyYWl0cz4gbUNhY2hlZFRyYWl0czsKKworICAgIHN0ZDo6bXV0ZXggbVdyYXBwZWRDb21wb25lbnRzTXV0ZXg7CisgICAgc3RkOjpsaXN0PHN0ZDo6dmVjdG9yPHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+Pj4gbVdyYXBwZWRDb21wb25lbnRzOworCisgICAgc3RkOjp2ZWN0b3I8RmlsdGVyV3JhcHBlcjo6Q29tcG9uZW50PiBjcmVhdGVGaWx0ZXJzKCk7CisgICAgQzJDb21wb25lbnQ6OlRyYWl0cyBnZXRUcmFpdHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisKKyAgICBDMl9ET19OT1RfQ09QWShGaWx0ZXJXcmFwcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfUExVR0lOX0ZJTFRFUl9XUkFQUEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3BsdWdpbi9zYW1wbGVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjc2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJzYW1wbGUtY29kZWMyLWhpZGwtcGx1Z2luLWRlZmF1bHRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNhbXBsZUZpbHRlclBsdWdpbi5jcHAiLAorICAgIF0sCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyLWltcGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2hpZGxfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGliZ3VpX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MV9DTSIsCisgICAgICAgICJsaWJHTEVTdjIiLAorICAgICAgICAibGliR0xFU3YzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICAgICAgImxpYnN5bmMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicmVuZGVyZnJpZ2h0IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAic2FtcGxlLWNvZGVjMi1oaWRsLXBsdWdpbiIsCisgICAgdmVuZG9yOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInNhbXBsZS1jb2RlYzItaGlkbC1wbHVnaW4tZGVmYXVsdHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9wbHVnaW4vc2FtcGxlcy9TYW1wbGVGaWx0ZXJQbHVnaW4uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTQyYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvcGx1Z2luL3NhbXBsZXMvU2FtcGxlRmlsdGVyUGx1Z2luLmNwcApAQCAtMCwwICsxLDk5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJTYW1wbGVGaWx0ZXJQbHVnaW4iCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9wbHVnaW4vRmlsdGVyUGx1Z2luLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL1JlbmRlckVuZ2luZS5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9yQXNwZWN0c1N0cnVjdCwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleENvbG9yQXNwZWN0cyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfUkVRVUVTVF9GTEFHPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c1JlcXVlc3RJbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmxpdGVyYWxzOjpjaHJvbm9fbGl0ZXJhbHM7CisKK2NsYXNzIFNhbXBsZVRvbmVNYXBwaW5nRmlsdGVyCisgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNhbXBsZVRvbmVNYXBwaW5nRmlsdGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW50ZXJmYWNlIDogcHVibGljIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBOQU1FOworICAgICAgICBzdGF0aWMgY29uc3QgRmlsdGVyUGx1Z2luX1YxOjpEZXNjcmlwdG9yIERFU0NSSVBUT1I7CisKKyAgICAgICAgZXhwbGljaXQgSW50ZXJmYWNlKGMyX25vZGVfaWRfdCBpZCkKKyAgICAgICAgICAgIDogbUlkKGlkKSwKKyAgICAgICAgICAgICAgbVJlZmxlY3RvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyUmVmbGVjdG9ySGVscGVyPigpKSwKKyAgICAgICAgICAgICAgbUhlbHBlcihtUmVmbGVjdG9yKSB7CisgICAgICAgIH0KKyAgICAgICAgfkludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICAgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIE5BTUU7IH0KKyAgICAgICAgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUlkOyB9CisKKyAgICAgICAgYzJfc3RhdHVzX3QgcXVlcnlfdmIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbUhlbHBlci5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgbWF5QmxvY2ssIGhlYXBQYXJhbXMpOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtSGVscGVyLmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtSGVscGVyLnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBtSGVscGVyLnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgbWF5QmxvY2spOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICAgICAgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKworICAgICAgICB1aW50MzJfdCBnZXREYXRhU3BhY2UoKSB7CisgICAgICAgICAgICBIZWxwZXI6OkxvY2sgbG9jayA9IG1IZWxwZXIubG9jaygpOworICAgICAgICAgICAgdWludDMyX3QgZGF0YXNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICAgICAgICAgQzJNYXBwZXI6Om1hcCgKKyAgICAgICAgICAgICAgICAgICAgbUhlbHBlci5tSW5wdXRDb2xvckFzcGVjdEluZm8tPnJhbmdlLAorICAgICAgICAgICAgICAgICAgICBtSGVscGVyLm1JbnB1dENvbG9yQXNwZWN0SW5mby0+cHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICBtSGVscGVyLm1JbnB1dENvbG9yQXNwZWN0SW5mby0+bWF0cml4LAorICAgICAgICAgICAgICAgICAgICBtSGVscGVyLm1JbnB1dENvbG9yQXNwZWN0SW5mby0+dHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICZkYXRhc3BhY2UpOworICAgICAgICAgICAgcmV0dXJuIGRhdGFzcGFjZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjppbnB1dD4gZ2V0SGRyU3RhdGljTWV0YWRhdGEoKSB7CisgICAgICAgICAgICBIZWxwZXI6OkxvY2sgbG9jayA9IG1IZWxwZXIubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIG1IZWxwZXIubUlucHV0SGRyU3RhdGljSW5mbzsKKyAgICAgICAgfQorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBnZXRQb29sSWQoKSB7CisgICAgICAgICAgICBIZWxwZXI6OkxvY2sgbG9jayA9IG1IZWxwZXIubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIG1IZWxwZXIubU91dHB1dFBvb2xJZHMtPm0udmFsdWVzWzBdOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGJvb2wgSXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIHsKKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzUmVxdWVzdEluZm86Om91dHB1dCBpbmZvKDB1KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaGVhcFBhcmFtczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPnF1ZXJ5X3ZiKHsmaW5mb30sIHt9LCBDMl9NQVlfQkxPQ0ssICZoZWFwUGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiU2FtcGxlVG9uZU1hcHBpbmdGaWx0ZXI6OkludGVyZmFjZTo6SXNGaWx0ZXJpbmdFbmFibGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAicXVlcnkgZmFpbGVkIGZvciAiIDw8IGludGYtPmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME07CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgYzJfc3RhdHVzX3QgUXVlcnlQYXJhbXNGb3JQcmV2aW91c0NvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBbW21heWJlX3VudXNlZF1dIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqcGFyYW1zKSB7CisgICAgICAgICAgICBwYXJhbXMtPmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OkhXX1RFWFRVUkVfUkVBRCkpOworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IGMyX25vZGVfaWRfdCBtSWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICAgICAgc3RydWN0IEhlbHBlciA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgICAgICBleHBsaWNpdCBIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgICAgICAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICAgICAgICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXBpRmVhdHVyZXMsIEMyX1BBUkFNS0VZX0FQSV9GRUFUVVJFUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBcGlGZWF0dXJlc1NldHRpbmcoQzJDb25maWc6OmFwaV9mZWF0dXJlX3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSV9SRUZMRUNUSU9OIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJX1ZBTFVFUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSV9DVVJSRU5UX1ZBTFVFUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSV9ERVBFTkRFTkNZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJX1NBTUVfSU5QVVRfQlVGRkVSKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBtTmFtZSA9IEMyQ29tcG9uZW50TmFtZVNldHRpbmc6OkFsbG9jU2hhcmVkKE5BTUUuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgc3RybmNweShtTmFtZS0+bS52YWx1ZSwgTkFNRS5jX3N0cigpLCBOQU1FLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1OYW1lLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShtTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1LaW5kLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRLaW5kU2V0dGluZyhDMkNvbXBvbmVudDo6S0lORF9PVEhFUikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG9tYWluLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudERvbWFpblNldHRpbmcoQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRTdHJlYW1Db3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6aW5wdXQoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQ09VTlQpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRGb3JtYXQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtSYXdNZWRpYVR5cGUgPSAidmlkZW8vcmF3IjsKKyAgICAgICAgICAgICAgICBtSW5wdXRNZWRpYVR5cGUgPSBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBrUmF3TWVkaWFUeXBlLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgIHN0cm5jcHkobUlucHV0TWVkaWFUeXBlLT5tLnZhbHVlLCBrUmF3TWVkaWFUeXBlLmNfc3RyKCksIGtSYXdNZWRpYVR5cGUuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG1JbnB1dE1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRGb3JtYXQsIEMyX1BBUkFNS0VZX09VVFBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQnVmZmVyRGF0YTo6R1JBUEhJQykpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBtT3V0cHV0TWVkaWFUeXBlID0gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtSYXdNZWRpYVR5cGUuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgc3RybmNweShtT3V0cHV0TWVkaWFUeXBlLT5tLnZhbHVlLCBrUmF3TWVkaWFUeXBlLmNfc3RyKCksIGtSYXdNZWRpYVR5cGUuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dE1lZGlhVHlwZSwgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobU91dHB1dE1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxQaXBlbGluZURlbGF5LCBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nKDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZHNbMV0gPSB7IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIH07CisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFBvb2xJZHMsIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dFBvb2xJZHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRQb29sSWRzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoT3V0cHV0QmxvY2tQb29sU2V0dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0SGRyU3RhdGljSW5mbywgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUhkclN0YXRpY0luZm86OmlucHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUlucHV0SGRyU3RhdGljSW5mbywgbWFzdGVyaW5nLnJlZC54KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHJTdGF0aWNJbmZvU2V0dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEhkclN0YXRpY0luZm8sIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTykKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Q29sb3JBc3BlY3RJbmZvLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KDB1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUlucHV0Q29sb3JBc3BlY3RJbmZvLCByYW5nZSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dENvbG9yQXNwZWN0SW5mbywgcHJpbWFyaWVzKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUlucHV0Q29sb3JBc3BlY3RJbmZvLCB0cmFuc2ZlcikuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnB1dENvbG9yQXNwZWN0SW5mbywgbWF0cml4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihJbnB1dENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGQ6OnN0cmluZyhDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKSArICIucmVxdWVzdCIpLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzUmVxdWVzdEluZm86Om91dHB1dCgwdSkpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvLCByYW5nZSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvLCBwcmltYXJpZXMpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RSZXF1ZXN0SW5mbywgdHJhbnNmZXIpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvLCBtYXRyaXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1JlcXVlc3RTZXR0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Q29sb3JBc3BlY3RJbmZvLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgwdSkpCisgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRDb2xvckFzcGVjdEluZm8sIHJhbmdlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dENvbG9yQXNwZWN0SW5mbywgcHJpbWFyaWVzKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dENvbG9yQXNwZWN0SW5mbywgdHJhbnNmZXIpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtT3V0cHV0Q29sb3JBc3BlY3RJbmZvLCBtYXRyaXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE91dHB1dENvbG9yQXNwZWN0c1NldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dENvbG9yQXNwZWN0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0aWMgQzJSIE91dHB1dEJsb2NrUG9vbFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgQzJQPEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpbWF5QmxvY2ssICh2b2lkKW1lOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpYyBDMlIgSGRyU3RhdGljSW5mb1NldHRlcigKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAgICAgICAgICh2b2lkKW1heUJsb2NrLCAodm9pZCltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0aWMgQzJSIElucHV0Q29sb3JBc3BlY3RzU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpbWF5QmxvY2ssICh2b2lkKW1lOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRpYyBDMlIgT3V0cHV0Q29sb3JBc3BlY3RzU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZpbnB1dENvbG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNSZXF1ZXN0SW5mbzo6b3V0cHV0PiAmcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gaW5wdXRDb2xvci52LnJhbmdlOworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGlucHV0Q29sb3Iudi5wcmltYXJpZXM7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBpbnB1dENvbG9yLnYudHJhbnNmZXI7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3Qudi50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfMTcwTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gaW5wdXRDb2xvci52Lm1hdHJpeDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1JlcXVlc3RTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1JlcXVlc3RJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgICAgIGlmIChtZS52LnJhbmdlICE9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZS52LnByaW1hcmllcyAhPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWUudi50cmFuc2ZlciAhPSBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZS52Lm1hdHJpeCAhPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+IG1OYW1lOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+IG1BbGlhc2VzOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50S2luZFNldHRpbmc+IG1LaW5kOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50RG9tYWluU2V0dGluZz4gbURvbWFpbjsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRNZWRpYVR5cGU7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0TWVkaWFUeXBlOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0PiBtT3V0cHV0Rm9ybWF0OworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0PiBtQWN0dWFsSW5wdXREZWxheTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0PiBtQWN0dWFsT3V0cHV0RGVsYXk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nPiBtQWN0dWFsUGlwZWxpbmVEZWxheTsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjppbnB1dD4gbUlucHV0U3RyZWFtQ291bnQ7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6Om91dHB1dD4gbU91dHB1dFN0cmVhbUNvdW50OworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBtT3V0cHV0UG9vbElkczsKKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6aW5wdXQ+IG1JbnB1dEhkclN0YXRpY0luZm87CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IG1PdXRwdXRIZHJTdGF0aWNJbmZvOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1JbnB1dENvbG9yQXNwZWN0SW5mbzsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbU91dHB1dENvbG9yQXNwZWN0SW5mbzsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1JlcXVlc3RJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdFJlcXVlc3RJbmZvOworICAgICAgICB9IG1IZWxwZXI7CisgICAgfTsKKworICAgIGV4cGxpY2l0IFNhbXBsZVRvbmVNYXBwaW5nRmlsdGVyKGMyX25vZGVfaWRfdCBpZCkKKyAgICAgICAgOiBtSW50ZihzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4oaWQpKSB7CisgICAgfQorICAgIH5TYW1wbGVUb25lTWFwcGluZ0ZpbHRlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Qcm9jZXNzaW5nVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgICAgIG1Qcm9jZXNzaW5nVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBkZWFkbGluZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgNW1zOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN0YXRlID09IFJVTk5JTkcgJiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVE9QUEVEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobUxpc3RlbmVyTXV0ZXgsIHN0ZDo6dHJ5X3RvX2xvY2spOworICAgICAgICBpZiAobG9jaykgeworICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0spIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICBsb2NrLnRyeV9sb2NrX3VudGlsKGRlYWRsaW5lKTsKKyAgICAgICAgaWYgKCFsb2NrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfVElNRURfT1VUOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKCFpdGVtcykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVF1ZXVlTXV0ZXgpOworICAgICAgICBtUXVldWUuc3BsaWNlKG1RdWV1ZS5lbmQoKSwgKml0ZW1zKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICYpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKworICAgIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIWZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChtb2RlID09IEZMVVNIX0NIQUlOKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtU3RhdGVNdXRleCk7CisgICAgICAgICAgICBpZiAobVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtUXVldWVNdXRleCk7CisgICAgICAgICAgICBtUXVldWUuc3dhcCgqZmx1c2hlZFdvcmspOworICAgICAgICB9CisgICAgICAgIC8vIE5PVEU6IHRoaXMgY29tcG9uZW50IGRvZXMgbm90IGhhdmUgaW50ZXJuYWwgc3RhdGUgdG8gZmx1c2guCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBOT1RFOiB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCB3YWl0IGZvciB3b3JrIGl0ZW1zIGJlZm9yZSBwcm9jZXNzaW5nLgorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIC8vc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBkZWFkbGluZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgNTAwbXM7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtU3RhdGVNdXRleCk7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVJUSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gU1RPUFBFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVElORzsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVByb2Nlc3NpbmdNdXRleCk7CisgICAgICAgICAgICBpZiAoIW1Qcm9jZXNzaW5nVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBtUHJvY2Vzc2luZ1RocmVhZCA9IHN0ZDo6dGhyZWFkKFt0aGlzXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0xvb3Aoc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgbVN0YXRlID0gUlVOTklORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy9zdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGRlYWRsaW5lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyA1MDBtczsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1TdGF0ZU11dGV4KTsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQSU5HOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtUXVldWVNdXRleCk7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtUHJvY2Vzc2luZ011dGV4KTsKKyAgICAgICAgICAgIGlmIChtUHJvY2Vzc2luZ1RocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgbVByb2Nlc3NpbmdUaHJlYWQuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtU3RhdGVNdXRleCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy9zdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IGRlYWRsaW5lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgKyA1MDBtczsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1TdGF0ZU11dGV4KTsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVTRVRUSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXRlID0gUkVTRVRUSU5HOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtUXVldWVNdXRleCk7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtUHJvY2Vzc2luZ011dGV4KTsKKyAgICAgICAgICAgIGlmIChtUHJvY2Vzc2luZ1RocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgbVByb2Nlc3NpbmdUaHJlYWQuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtU3RhdGVNdXRleCk7CisgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlKCkgb3ZlcnJpZGUgeworICAgICAgICAvL3N0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgZGVhZGxpbmUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSArIDUwMG1zOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNFRCB8fCBtU3RhdGUgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiBDMl9CQURfU1RBVEUgaWYgbm90IHN0b3BwZWQKKyAgICAgICAgICAgIG1TdGF0ZSA9IFJFTEVBU0lORzsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVF1ZXVlTXV0ZXgpOworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVByb2Nlc3NpbmdNdXRleCk7CisgICAgICAgICAgICBpZiAobVByb2Nlc3NpbmdUaHJlYWQuam9pbmFibGUoKSkgeworICAgICAgICAgICAgICAgIG1Qcm9jZXNzaW5nVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgbVN0YXRlID0gUkVMRUFTRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHByb2Nlc3NMb29wKHN0ZDo6c2hhcmVkX3B0cjxTYW1wbGVUb25lTWFwcGluZ0ZpbHRlcj4gdGhpeikgeworICAgICAgICBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhMdW1pYW5jZSA9IDUwMC4wOworICAgICAgICBjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNYXhNYXN0ZXJpbmdMdW1pbmFuY2UgPSAxMDAwLjA7CisgICAgICAgIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heENvbnRlbnRMdW1pbmFuY2UgPSAxMDAwLjA7CisgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrRHN0VXNhZ2UgPQorICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gfAorICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFOworCisgICAgICAgIGludDMyX3Qgd29ya0NvdW50ID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lPiByZW5kZXJFbmdpbmUgPSByZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Y3JlYXRlKAorICAgICAgICAgICAgICAgIHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzOjpCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldFBpeGVsRm9ybWF0KHN0YXRpY19jYXN0PGludD4odWk6OlBpeGVsRm9ybWF0OjpSR0JBXzg4ODgpKQorICAgICAgICAgICAgICAgICAgICAuc2V0SW1hZ2VDYWNoZVNpemUoMiAvKm1heEZyYW1lQnVmZmVyQWNxdWlyZWRCdWZmZXJzKi8pCisgICAgICAgICAgICAgICAgICAgIC5zZXRVc2VDb2xvck1hbmFnZXJtZW50KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFbmFibGVQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAuc2V0UHJlY2FjaGVUb25lTWFwcGVyU2hhZGVyT25seSh0cnVlKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGV4dFByaW9yaXR5KHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHk6OkxPVykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBpZiAoIXJlbmRlckVuZ2luZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1MaXN0ZW5lck11dGV4KTsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+b25FcnJvcl9uYih0aGl6LCBDMl9DT1JSVVBURUQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHRleHR1cmVOYW1lID0gMDsKKyAgICAgICAgcmVuZGVyRW5naW5lLT5nZW5UZXh0dXJlcygxLCAmdGV4dHVyZU5hbWUpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyBCZWZvcmUgZG9pbmcgYW55dGhpbmcsIHZlcmlmeSB0aGUgc3RhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobVN0YXRlTXV0ZXgpOworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBFeHRyYWN0IG9uZSB3b3JrIGl0ZW0KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1RdWV1ZU11dGV4KTsKKyAgICAgICAgICAgICAgICBpZiAobVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIDFzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUXVldWUuZnJvbnQoKS5zd2FwKHdvcmspOworICAgICAgICAgICAgICAgIG1RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICArK3dvcmtDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAid29yayAjIiA8PCB3b3JrQ291bnQgPDwgIjogZmxhZ3M9IiA8PCB3b3JrLT5pbnB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICA8PCAiIHRpbWVzdGFtcD0iIDw8IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWsoKTs7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnVXBkYXRlOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgY29uZmlnVXBkYXRlLnB1c2hfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBtSW50Zi0+Y29uZmlnX3ZiKGNvbmZpZ1VwZGF0ZSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjppbnB1dD4gaGRyU3RhdGljSW5mbyA9CisgICAgICAgICAgICAgICAgbUludGYtPmdldEhkclN0YXRpY01ldGFkYXRhKCk7CisgICAgICAgICAgICB1aW50MzJfdCBkYXRhc3BhY2UgPSBtSW50Zi0+Z2V0RGF0YVNwYWNlKCk7CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG91dEMyQnVmZmVyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+aGFzSW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gaW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmdldEluZm8oQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gZmxpcHBlZCA9IEMyUGFyYW06OkNvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbywgZmFsc2UgLyogb3V0cHV0ICovLCBpbmZvLT5zdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8ucmVzZXQoc3RhdGljX2Nhc3Q8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjppbnB1dCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVkLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqYzJIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHN0cmlkZSwgaWdicF9zbG90LCBnZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLCBpZ2JwX2lkOworICAgICAgICAgICAgICAgIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBjMkhhbmRsZSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsICZzdHJpZGUsICZnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9IFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYzJIYW5kbGUpOworICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IHNyY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY0hhbmRsZSwgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAxLCB1c2FnZSwgc3RyaWRlKTsKKworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZHN0QmxvY2s7CisgICAgICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbElkID0gbUludGYtPmdldFBvb2xJZCgpOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgICAgICAgICBHZXRDb2RlYzJCbG9ja1Bvb2wocG9vbElkLCB0aGl6LCAmcG9vbCk7CisgICAgICAgICAgICAgICAgcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OkZyb21HcmFsbG9jVXNhZ2Uoa0RzdFVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCbG9jayk7CisgICAgICAgICAgICAgICAgb3V0QzJCdWZmZXIgPSBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJsb2NrLT5zaGFyZShDMlJlY3Qod2lkdGgsIGhlaWdodCksIEMyRmVuY2UoKSkpOworICAgICAgICAgICAgICAgIGMySGFuZGxlID0gZHN0QmxvY2stPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBjMkhhbmRsZSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsICZzdHJpZGUsICZnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUgPSBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGMySGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBkc3RCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NIYW5kbGUsIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgMSwgdXNhZ2UsIHN0cmlkZSk7CisKKyAgICAgICAgICAgICAgICBSZWN0IHNvdXJjZUNyb3AoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisKKyAgICAgICAgICAgICAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gY2xpZW50Q29tcG9zaXRpb25MYXllcnM7CisKKyAgICAgICAgICAgICAgICBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXkucGh5c2ljYWxEaXNwbGF5ID0gc291cmNlQ3JvcDsKKyAgICAgICAgICAgICAgICBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXkuY2xpcCA9IHNvdXJjZUNyb3A7CisKKyAgICAgICAgICAgICAgICBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXkub3V0cHV0RGF0YXNwYWNlID0gdWk6OkRhdGFzcGFjZTo6VjBfU1JHQjsKKyAgICAgICAgICAgICAgICBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXkubWF4THVtaW5hbmNlID0ga0RlZmF1bHRNYXhMdW1pYW5jZTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb21wb3NpdGlvbkRpc3BsYXkuY2xlYXJSZWdpb24gPSBSZWdpb246OklOVkFMSURfUkVHSU9OOworICAgICAgICAgICAgICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllclNldHRpbmdzOworICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3MuZ2VvbWV0cnkuYm91bmRhcmllcyA9IHNvdXJjZUNyb3AudG9GbG9hdFJlY3QoKTsKKyAgICAgICAgICAgICAgICBsYXllclNldHRpbmdzLmFscGhhID0gMS4wZjsKKworICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3Muc291cmNlRGF0YXNwYWNlID0gc3RhdGljX2Nhc3Q8dWk6OkRhdGFzcGFjZT4oZGF0YXNwYWNlKTsKKworICAgICAgICAgICAgICAgIC8vIGZyb20gQnVmZmVyTGF5ZXIKKyAgICAgICAgICAgICAgICBsYXllclNldHRpbmdzLnNvdXJjZS5idWZmZXIuYnVmZmVyID0gc3JjQnVmZmVyOworICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3Muc291cmNlLmJ1ZmZlci5pc09wYXF1ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICBsYXllclNldHRpbmdzLnNvdXJjZS5idWZmZXIuZmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisgICAgICAgICAgICAgICAgbGF5ZXJTZXR0aW5ncy5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lID0gdGV4dHVyZU5hbWU7CisgICAgICAgICAgICAgICAgbGF5ZXJTZXR0aW5ncy5zb3VyY2UuYnVmZmVyLnVzZVByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3Muc291cmNlLmJ1ZmZlci5pc1k0MTBCVDIwMjAgPQorICAgICAgICAgICAgICAgICAgICAobGF5ZXJTZXR0aW5ncy5zb3VyY2VEYXRhc3BhY2UgPT0gdWk6OkRhdGFzcGFjZTo6QlQyMDIwX0lUVV9QUSB8fAorICAgICAgICAgICAgICAgICAgICAgbGF5ZXJTZXR0aW5ncy5zb3VyY2VEYXRhc3BhY2UgPT0gdWk6OkRhdGFzcGFjZTo6QlQyMDIwX0lUVV9ITEcpICYmCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICAgICAgICAgICAgICBsYXllclNldHRpbmdzLnNvdXJjZS5idWZmZXIubWF4TWFzdGVyaW5nTHVtaW5hbmNlID0KKyAgICAgICAgICAgICAgICAgICAgKGhkclN0YXRpY0luZm8gJiYgKmhkclN0YXRpY0luZm8gJiYKKyAgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLm1heEx1bWluYW5jZSA6IGtEZWZhdWx0TWF4TWFzdGVyaW5nTHVtaW5hbmNlOworICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3Muc291cmNlLmJ1ZmZlci5tYXhDb250ZW50THVtaW5hbmNlID0KKyAgICAgICAgICAgICAgICAgICAgKGhkclN0YXRpY0luZm8gJiYgKmhkclN0YXRpY0luZm8gJiYgaGRyU3RhdGljSW5mby0+bWF4Q2xsID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gaGRyU3RhdGljSW5mby0+bWF4Q2xsIDoga0RlZmF1bHRNYXhDb250ZW50THVtaW5hbmNlOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGZpbHRlcmluZyB0byBmYWxzZSBzaW5jZSB0aGUgY2FwdHVyZSBpdHNlbGYgZG9lc24ndCBpbnZvbHZlCisgICAgICAgICAgICAgICAgLy8gYW55IHNjYWxpbmcsIG1ldGFkYXRhIHJldHJpZXZlciBKTkkgaXMgc2NhbGluZyB0aGUgYml0bWFwIGlmCisgICAgICAgICAgICAgICAgLy8gZGlzcGxheSBzaXplIGlzIGRpZmZlcmVudCBmcm9tIGRlY29kZWQgc2l6ZS4gSWYgdGhhdCBzY2FsaW5nCisgICAgICAgICAgICAgICAgLy8gbmVlZHMgdG8gYmUgaGFuZGxlZCBieSBzZXJ2ZXIgc2lkZSwgY29uc2lkZXIgZW5hYmxlIHRoaXMgYmFzZWQKKyAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHNpemUgdnMgZGVjb2RlZCBzaXplLgorICAgICAgICAgICAgICAgIGxheWVyU2V0dGluZ3Muc291cmNlLmJ1ZmZlci51c2VUZXh0dXJlRmlsdGVyaW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbGF5ZXJTZXR0aW5ncy5zb3VyY2UuYnVmZmVyLnRleHR1cmVUcmFuc2Zvcm0gPSBtYXQ0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50Q29tcG9zaXRpb25MYXllcnMucHVzaF9iYWNrKCZsYXllclNldHRpbmdzKTsKKworICAgICAgICAgICAgICAgIC8vIFVzZSBhbiBlbXB0eSBmZW5jZSBmb3IgdGhlIGJ1ZmZlciBmZW5jZSwgc2luY2Ugd2UganVzdCBjcmVhdGVkIHRoZSBidWZmZXIgc28KKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBuZWVkIGZvciBzeW5jaHJvbml6YXRpb24gd2l0aCB0aGUgR1BVLgorICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCBidWZmZXJGZW5jZTsKKyAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQgZHJhd0ZlbmNlOworICAgICAgICAgICAgICAgIHJlbmRlckVuZ2luZS0+dXNlUHJvdGVjdGVkQ29udGV4dChmYWxzZSk7CisgICAgICAgICAgICAgICAgZXJyID0gcmVuZGVyRW5naW5lLT5kcmF3TGF5ZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q29tcG9zaXRpb25EaXNwbGF5LCBjbGllbnRDb21wb3NpdGlvbkxheWVycywgZHN0QnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp1c2VGcmFtZWJ1ZmZlckNhY2hlPSovZmFsc2UsIHN0ZDo6bW92ZShidWZmZXJGZW5jZSksICZkcmF3RmVuY2UpOworCisgICAgICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKHN0ZDo6bW92ZShkcmF3RmVuY2UpKTsKKworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBtb3ZlIHdhaXRpbmcgZm9yIGZlbmNlICYgc2VuZGluZyBpdCBiYWNrIG9uIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGltcHJvdmUKKyAgICAgICAgICAgICAgICAvLyBlZmZpY2llbmN5LCBidXQgbGVhdmluZyBpdCBoZXJlIGZvciBzaW1wbGljaXR5LgorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZHJhd0xheWVycyByZXR1cm5lZCBlcnIgIiA8PCBlcnI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZmVuY2UtPndhaXQoNTAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJ3YWl0IGZvciBmZW5jZSByZXR1cm5lZCBlcnIgIiA8PCBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVuZGVyRW5naW5lLT5jbGVhbnVwUG9zdFJlbmRlcihyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX0FMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAob3V0QzJCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG91dEMyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1MaXN0ZW5lck11dGV4KTsKKyAgICAgICAgICAgIG1MaXN0ZW5lci0+b25Xb3JrRG9uZV9uYih0aGl6LCBzdGQ6Om1vdmUoaXRlbXMpKTsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAic2VudCB3b3JrICMiIDw8IHdvcmtDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG11dGFibGUgc3RkOjp0aW1lZF9tdXRleCBtTGlzdGVuZXJNdXRleDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtUXVldWVNdXRleDsKKyAgICBtdXRhYmxlIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1RdWV1ZTsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IG1JbnRmOworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1TdGF0ZU11dGV4OworICAgIGVudW0gU3RhdGUgeworICAgICAgICBTVE9QUEVELAorICAgICAgICBSVU5OSU5HLAorICAgICAgICBSRUxFQVNFRCwKKyAgICAgICAgU1RBUlRJTkcsICAgLy8gU1RPUFBFRCAtPiBSVU5OSU5HCisgICAgICAgIFNUT1BQSU5HLCAgIC8vIFJVTk5JTkcgLT4gU1RPUFBFRAorICAgICAgICBSRVNFVFRJTkcsICAvLyA8PEFOWT4+IC0+IFNUT1BQRUQKKyAgICAgICAgUkVMRUFTSU5HLCAgLy8gU1RPUFBFRCAtPiBSRUxFQVNFRAorICAgIH0gbVN0YXRlOworCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm9jZXNzaW5nTXV0ZXg7CisgICAgc3RkOjp0aHJlYWQgbVByb2Nlc3NpbmdUaHJlYWQ7CisKK307CisKKy8vIHN0YXRpYworY29uc3Qgc3RkOjpzdHJpbmcgU2FtcGxlVG9uZU1hcHBpbmdGaWx0ZXI6OkludGVyZmFjZTo6TkFNRSA9ICJjMi5zYW1wbGUudG9uZS1tYXBwZXIiOworLy8gc3RhdGljCitjb25zdCBGaWx0ZXJQbHVnaW5fVjE6OkRlc2NyaXB0b3IgU2FtcGxlVG9uZU1hcHBpbmdGaWx0ZXI6OkludGVyZmFjZTo6REVTQ1JJUFRPUiA9IHsKKyAgICAvLyBjb250cm9sUGFyYW1zCisgICAgeyBDMlN0cmVhbUNvbG9yQXNwZWN0c1JlcXVlc3RJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAvLyBhZmZlY3RlZFBhcmFtcworICAgIHsKKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9LAorfTsKKworY2xhc3MgU2FtcGxlQzJDb21wb25lbnRTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICBTYW1wbGVDMkNvbXBvbmVudFN0b3JlKCkKKyAgICAgICAgOiBtUmVmbGVjdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCkpLAorICAgICAgICAgIG1JbnRmKG1SZWZsZWN0b3IpLAorICAgICAgICAgIG1GYWN0b3JpZXMoQ3JlYXRlRmFjdG9yaWVzKCkpIHsKKyAgICB9CisgICAgflNhbXBsZUMyQ29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gImFuZHJvaWQuc2FtcGxlLmZpbHRlci1wbHVnaW4tc3RvcmUiOyB9CisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtRmFjdG9yaWVzLmNvdW50KG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1GYWN0b3JpZXMuYXQobmFtZSktPmNyZWF0ZUNvbXBvbmVudCgrK21Ob2RlSWQsIGNvbXBvbmVudCk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUZhY3Rvcmllcy5jb3VudChuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtRmFjdG9yaWVzLmF0KG5hbWUpLT5jcmVhdGVJbnRlcmZhY2UoKyttTm9kZUlkLCBpbnRlcmZhY2UpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IHJldDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZbbmFtZSwgZmFjdG9yeV0gOiBtRmFjdG9yaWVzKSB7CisgICAgICAgICAgICByZXQucHVzaF9iYWNrKGZhY3RvcnktPmdldFRyYWl0cygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4sIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+KSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvcjsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYucXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKGZpZWxkcywgQzJfTUFZX0JMT0NLKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY2xhc3MgQ29tcG9uZW50RmFjdG9yeSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db21wb25lbnRGYWN0b3J5KCkgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmZ2V0VHJhaXRzKCkgeyByZXR1cm4gbVRyYWl0czsgfQorCisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgY29uc3QgPSAwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgQ29tcG9uZW50RmFjdG9yeShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJnRyYWl0cykKKyAgICAgICAgICAgIDogbVRyYWl0cyh0cmFpdHMpIHsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBzdHJ1Y3QgQ29tcG9uZW50RmFjdG9yeUltcGwgOiBwdWJsaWMgQ29tcG9uZW50RmFjdG9yeSB7CisgICAgcHVibGljOgorICAgICAgICBDb21wb25lbnRGYWN0b3J5SW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gJnRyYWl0cykKKyAgICAgICAgICAgIDogQ29tcG9uZW50RmFjdG9yeSh0cmFpdHMpIHsKKyAgICAgICAgfQorICAgICAgICB+Q29tcG9uZW50RmFjdG9yeUltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAqY29tcG9uZW50ID0gc3RkOjptYWtlX3NoYXJlZDxUPihpZCk7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPHR5cGVuYW1lIFQ6OkludGVyZmFjZT4oaWQpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHN0YXRpYyB2b2lkIEFkZEZhY3Rvcnkoc3RkOjptYXA8QzJTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxDb21wb25lbnRGYWN0b3J5Pj4gKmZhY3RvcmllcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGZ7bmV3IHR5cGVuYW1lIFQ6OkludGVyZmFjZSgwKX07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMobmV3IChzdGQ6Om5vdGhyb3cpIEMyQ29tcG9uZW50OjpUcmFpdHMpOworICAgICAgICBDSEVDSyhDMkludGVyZmFjZVV0aWxzOjpGaWxsVHJhaXRzRnJvbUludGVyZmFjZSh0cmFpdHMuZ2V0KCksIGludGYpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZmlsbCB0cmFpdHMgZnJvbSBpbnRlcmZhY2UiOworICAgICAgICBmYWN0b3JpZXMtPmVtcGxhY2UodHJhaXRzLT5uYW1lLCBuZXcgQ29tcG9uZW50RmFjdG9yeUltcGw8VD4odHJhaXRzKSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6bWFwPEMyU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Q29tcG9uZW50RmFjdG9yeT4+IENyZWF0ZUZhY3RvcmllcygpIHsKKyAgICAgICAgc3RkOjptYXA8QzJTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxDb21wb25lbnRGYWN0b3J5Pj4gZmFjdG9yaWVzOworICAgICAgICBBZGRGYWN0b3J5PFNhbXBsZVRvbmVNYXBwaW5nRmlsdGVyPigmZmFjdG9yaWVzKTsKKyAgICAgICAgcmV0dXJuIGZhY3RvcmllczsKKyAgICB9CisKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgZXhwbGljaXQgSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICAgICAgfQorICAgIH0gbUludGY7CisKKyAgICBjb25zdCBzdGQ6Om1hcDxDMlN0cmluZywgc3RkOjp1bmlxdWVfcHRyPENvbXBvbmVudEZhY3Rvcnk+PiBtRmFjdG9yaWVzOworCisgICAgc3RkOjphdG9taWNfaW50MzJfdCBtTm9kZUlkezB9OworfTsKKworY2xhc3MgU2FtcGxlRmlsdGVyUGx1Z2luIDogcHVibGljIEZpbHRlclBsdWdpbl9WMSB7CitwdWJsaWM6CisgICAgU2FtcGxlRmlsdGVyUGx1Z2luKCkgOiBtU3RvcmUobmV3IFNhbXBsZUMyQ29tcG9uZW50U3RvcmUpIHt9CisgICAgflNhbXBsZUZpbHRlclBsdWdpbigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBnZXRDb21wb25lbnRTdG9yZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TdG9yZTsKKyAgICB9CisKKyAgICBib29sIGRlc2NyaWJlKEMyU3RyaW5nIG5hbWUsIERlc2NyaXB0b3IgKmRlc2MpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gU2FtcGxlVG9uZU1hcHBpbmdGaWx0ZXI6OkludGVyZmFjZTo6TkFNRSkgeworICAgICAgICAgICAgKmRlc2MgPSBTYW1wbGVUb25lTWFwcGluZ0ZpbHRlcjo6SW50ZXJmYWNlOjpERVNDUklQVE9SOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNGaWx0ZXJpbmdFbmFibGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGludGYtPmdldE5hbWUoKSA9PSBTYW1wbGVUb25lTWFwcGluZ0ZpbHRlcjo6SW50ZXJmYWNlOjpOQU1FKSB7CisgICAgICAgICAgICByZXR1cm4gU2FtcGxlVG9uZU1hcHBpbmdGaWx0ZXI6OkludGVyZmFjZTo6SXNGaWx0ZXJpbmdFbmFibGVkKGludGYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnBhcmFtcykgb3ZlcnJpZGUgeworICAgICAgICBpZiAoaW50Zi0+Z2V0TmFtZSgpID09IFNhbXBsZVRvbmVNYXBwaW5nRmlsdGVyOjpJbnRlcmZhY2U6Ok5BTUUpIHsKKyAgICAgICAgICAgIHJldHVybiBTYW1wbGVUb25lTWFwcGluZ0ZpbHRlcjo6SW50ZXJmYWNlOjpRdWVyeVBhcmFtc0ZvclByZXZpb3VzQ29tcG9uZW50KAorICAgICAgICAgICAgICAgICAgICBpbnRmLCBwYXJhbXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIHsKKworaW50MzJfdCBHZXRGaWx0ZXJQbHVnaW5WZXJzaW9uKCkgeworICAgIHJldHVybiA6OmFuZHJvaWQ6OlNhbXBsZUZpbHRlclBsdWdpbjo6VkVSU0lPTjsKK30KKwordm9pZCAqQ3JlYXRlRmlsdGVyUGx1Z2luKCkgeworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpTYW1wbGVGaWx0ZXJQbHVnaW47Cit9CisKK3ZvaWQgRGVzdHJveUZpbHRlclBsdWdpbih2b2lkICpwbHVnaW4pIHsKKyAgICBkZWxldGUgKDo6YW5kcm9pZDo6U2FtcGxlRmlsdGVyUGx1Z2luICopcGx1Z2luOworfQorCit9ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAppbmRleCBhMTZiMTA2Li5iYjlmNTFmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTI5LDEyICsyOSwyMSBAQAogLy8gVGhlIHNlY2NvbXBfcG9saWN5IGZpbGUgbmFtZSBhbmQgaXRzIGNvbnRlbnQgY2FuIGJlIG1vZGlmaWVkLCBidXQgbm90ZSB0aGF0CiAvLyB2ZW5kb3IuY3BwIGFsc28gbmVlZHMgdG8gYmUgdXBkYXRlZCBiZWNhdXNlIGl0IG5lZWRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZQogLy8gc2VjY29tcCBwb2xpY3kgZmlsZSBvbiB0aGUgZGV2aWNlLgorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXNlcnZpY2UiLAorICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UiLAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCiAKLSAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtc2VydmljZS5yYyJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjIl0sCiAKICAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyJdLAogICAgIHNyY3M6IFsKQEAgLTQ2LDEyICs1NSwxNSBAQAogICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICBdLAotICAgIHJlcXVpcmVkOiBbImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtc2VjY29tcF9wb2xpY3kiXSwKKyAgICByZXF1aXJlZDogWyJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlY2NvbXBfcG9saWN5Il0sCiAKICAgICAvLyBUaGUgY29udGVudCBpbiBtYW5pZmVzdF9tZWRpYV9jMl9WMV8xX2RlZmF1bHQueG1sIGNhbiBiZSBpbmNsdWRlZAogICAgIC8vIGRpcmVjdGx5IGluIHRoZSBtYWluIGRldmljZSBtYW5pZmVzdC54bWwgZmlsZSBvciB2aWEgdmludGZfZnJhZ21lbnRzLgogICAgIC8vIChSZW1vdmUgdGhlIGxpbmUgYmVsb3cgaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIG1haW4gbWFuaWZlc3QuKQogICAgIHZpbnRmX2ZyYWdtZW50czogWyJtYW5pZmVzdF9tZWRpYV9jMl9WMV8xX2RlZmF1bHQueG1sIl0sCisKKyAgICAvLyBSZW1vdmUgdGhpcyBsaW5lIHRvIGVuYWJsZSB0aGlzIG1vZHVsZS4KKyAgICBlbmFibGVkOiBmYWxzZSwKIH0KIAogLy8gc2VjY29tcCBwb2xpY3kgZmlsZS4KQEAgLTYxLDI3ICs3MywyNiBAQAogLy8gRmlsZXMgaW4gdGhlICJzZWNjb21wX3BvbGljeSIgc3ViZGlyZWN0b3J5IGFyZSBvbmx5IHByb3ZpZGVkIGFzIGV4YW1wbGVzLgogLy8gVGhleSBtYXkgbm90IHdvcmsgb24gc29tZSBkZXZpY2VzIGFuZC9vciBhcmNoaXRlY3R1cmVzIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgogcHJlYnVpbHRfZXRjIHsKLSAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1zZWNjb21wX3BvbGljeSIsCisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VjY29tcF9wb2xpY3kiLAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICBzdWJfZGlyOiAic2VjY29tcF9wb2xpY3kiLAogCiAgICAgLy8gSWYgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0ZWQsIG11bHRpcGxlIGNob2ljZXMgYXJlIG5vdCBuZWVkZWQuCiAgICAgYXJjaDogewogICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtYXJtLnBvbGljeSIsCisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LWFybS5wb2xpY3kiLAogICAgICAgICB9LAogICAgICAgICBhcm02NDogewotICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1hcm02NC5wb2xpY3kiLAorICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1hcm02NC5wb2xpY3kiLAogICAgICAgICB9LAogICAgICAgICB4ODY6IHsKLSAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQteDg2LnBvbGljeSIsCisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXg4Ni5wb2xpY3kiLAogICAgICAgICB9LAogICAgICAgICB4ODZfNjQ6IHsKLSAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQteDg2XzY0LnBvbGljeSIsCisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXg4Nl82NC5wb2xpY3kiLAogICAgICAgICB9LAogICAgIH0sCiAKICAgICAvLyBUaGlzIG1heSBiZSByZW1vdmVkLgogICAgIHJlcXVpcmVkOiBbImNyYXNoX2R1bXAucG9saWN5Il0sCiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtc2VydmljZS5yYyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtc2VydmljZS5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmMmQ4ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXNlcnZpY2UucmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNlcnZpY2UgYW5kcm9pZC1oYXJkd2FyZS1tZWRpYS1jMi1oYWwtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtc2VydmljZQotICAgIGNsYXNzIGhhbAotICAgIHVzZXIgbWVkaWFjb2RlYwotICAgIGdyb3VwIGNhbWVyYSBtZWRpYWRybSBkcm1ycGMKLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1zZXJ2aWNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjZlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIGFuZHJvaWQtaGFyZHdhcmUtbWVkaWEtYzItaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXNlcnZpY2UKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL21hbmlmZXN0X21lZGlhX2MyX1YxXzJfZGVmYXVsdC54bWwgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9tYW5pZmVzdF9tZWRpYV9jMl9WMV8yX2RlZmF1bHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZThkODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9tYW5pZmVzdF9tZWRpYV9jMl9WMV8yX2RlZmF1bHQueG1sCkBAIC0wLDAgKzEsMTEgQEAKKzxtYW5pZmVzdCB2ZXJzaW9uPSIxLjAiIHR5cGU9ImRldmljZSI+CisgICAgPGhhbD4KKyAgICAgICAgPG5hbWU+YW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMjwvbmFtZT4KKyAgICAgICAgPHRyYW5zcG9ydD5od2JpbmRlcjwvdHJhbnNwb3J0PgorICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgICAgIDxpbnRlcmZhY2U+CisgICAgICAgICAgICA8bmFtZT5JQ29tcG9uZW50U3RvcmU8L25hbWU+CisgICAgICAgICAgICA8aW5zdGFuY2U+ZGVmYXVsdDwvaW5zdGFuY2U+CisgICAgICAgIDwvaW50ZXJmYWNlPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtYXJtNjQucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1hcm02NC5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYWY4YjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC1hcm02NC5wb2xpY3kKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1mdXRleDogMQotIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KLWlvY3RsOiAxCi1zY2hlZF95aWVsZDogMQotY2xvc2U6IDEKLWR1cDogMQotcHBvbGw6IDEKLW1wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQotbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKLWdldHVpZDogMQotZ2V0cmxpbWl0OiAxCi1mc3RhdDogMQotbmV3ZnN0YXRhdDogMQotZnN0YXRmczogMQotbWVtZmRfY3JlYXRlOiAxCi1mdHJ1bmNhdGU6IDEKLQotIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKLSMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAotIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKLSMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKLSMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAotIyBmb3IgbW9yZSBkZXRhaWxzLgotbXJlbWFwOiBhcmczID09IDMKLW11bm1hcDogMQotcHJjdGw6IDEKLXdyaXRldjogMQotc2lnYWx0c3RhY2s6IDEKLWNsb25lOiAxCi1leGl0OiAxCi1sc2VlazogMQotcnRfc2lncHJvY21hc2s6IDEKLW9wZW5hdDogMQotd3JpdGU6IDEKLW5hbm9zbGVlcDogMQotc2V0cHJpb3JpdHk6IDEKLXNldF90aWRfYWRkcmVzczogMQotZ2V0ZGVudHM2NDogMQotcmVhZGxpbmthdDogMQotcmVhZDogMQotcHJlYWQ2NDogMQotZ2V0dGltZW9mZGF5OiAxCi1mYWNjZXNzYXQ6IDEKLWV4aXRfZ3JvdXA6IDEKLXJlc3RhcnRfc3lzY2FsbDogMQotcnRfc2lncmV0dXJuOiAxCi1nZXRyYW5kb206IDEKLW1hZHZpc2U6IDEKLQotIyBjcmFzaCBkdW1wIHBvbGljeSBhZGRpdGlvbnMKLWNsb2NrX2dldHRpbWU6IDEKLWdldHBpZDogMQotZ2V0dGlkOiAxCi1waXBlMjogMQotcmVjdm1zZzogMQotcHJvY2Vzc192bV9yZWFkdjogMQotdGdraWxsOiAxCi1ydF9zaWdhY3Rpb246IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi0jbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgotbXVubWFwOiAxCi0jbW1hcDogYXJnMiBpbiAweDF8MHgyCi1nZXRldWlkOiAxCi1nZXRnaWQ6IDEKLWdldGVnaWQ6IDEKLWdldGdyb3VwczogMQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXg4Ni5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXg4Ni5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzQwNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC14ODYucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVhZDogMQotbXByb3RlY3Q6IDEKLXByY3RsOiAxCi1vcGVuYXQ6IDEKLW9wZW46IDEKLWdldHVpZDMyOiAxCi1nZXR1aWQ6IDEKLWdldHJsaW1pdDogMQotd3JpdGV2OiAxCi1pb2N0bDogMQotY2xvc2U6IDEKLW1tYXAyOiAxCi1tbWFwOiAxCi1mc3RhdDY0OiAxCi1mc3RhdDogMQotc3RhdDY0OiAxCi1zdGF0ZnM2NDogMQotbWFkdmlzZTogMQotZnN0YXRhdDY0OiAxCi1uZXdmc3RhdGF0OiAxCi1mdXRleDogMQotbXVubWFwOiAxCi1mYWNjZXNzYXQ6IDEKLV9sbHNlZWs6IDEKLWxzZWVrOiAxCi1jbG9uZTogMQotc2lnYWx0c3RhY2s6IDEKLXNldHByaW9yaXR5OiAxCi1yZXN0YXJ0X3N5c2NhbGw6IDEKLWV4aXQ6IDEKLWV4aXRfZ3JvdXA6IDEKLXJ0X3NpZ3JldHVybjogMQotdWdldHJsaW1pdDogMQotcmVhZGxpbms6IDEKLXJlYWRsaW5rYXQ6IDEKLV9sbHNlZWs6IDEKLWZzdGF0ZnM2NDogMQotZnN0YXRmczogMQotcHJlYWQ2NDogMQotbXJlbWFwOiAxCi1kdXA6IDEKLXNldF90aWRfYWRkcmVzczogMQotd3JpdGU6IDEKLW5hbm9zbGVlcDogMQotc2NoZWRfc2V0c2NoZWR1bGVyOiAxCi11bmFtZTogMQotbWVtZmRfY3JlYXRlOiAxCi1mdHJ1bmNhdGU6IDEKLWZ0cnVuY2F0ZTY0OiAxCi0KLSMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgotZ2V0dGlkOiAxCi1zY2hlZF95aWVsZDogMQotZ2V0cGlkOiAxCi1nZXR0aWQ6IDEKLQotQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXg4Nl82NC5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXg4Nl82NC5wb2xpY3kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzQwNDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtZGVmYXVsdC14ODZfNjQucG9saWN5CisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcmVhZDogMQotbXByb3RlY3Q6IDEKLXByY3RsOiAxCi1vcGVuYXQ6IDEKLW9wZW46IDEKLWdldHVpZDMyOiAxCi1nZXR1aWQ6IDEKLWdldHJsaW1pdDogMQotd3JpdGV2OiAxCi1pb2N0bDogMQotY2xvc2U6IDEKLW1tYXAyOiAxCi1tbWFwOiAxCi1mc3RhdDY0OiAxCi1mc3RhdDogMQotc3RhdDY0OiAxCi1zdGF0ZnM2NDogMQotbWFkdmlzZTogMQotZnN0YXRhdDY0OiAxCi1uZXdmc3RhdGF0OiAxCi1mdXRleDogMQotbXVubWFwOiAxCi1mYWNjZXNzYXQ6IDEKLV9sbHNlZWs6IDEKLWxzZWVrOiAxCi1jbG9uZTogMQotc2lnYWx0c3RhY2s6IDEKLXNldHByaW9yaXR5OiAxCi1yZXN0YXJ0X3N5c2NhbGw6IDEKLWV4aXQ6IDEKLWV4aXRfZ3JvdXA6IDEKLXJ0X3NpZ3JldHVybjogMQotdWdldHJsaW1pdDogMQotcmVhZGxpbms6IDEKLXJlYWRsaW5rYXQ6IDEKLV9sbHNlZWs6IDEKLWZzdGF0ZnM2NDogMQotZnN0YXRmczogMQotcHJlYWQ2NDogMQotbXJlbWFwOiAxCi1kdXA6IDEKLXNldF90aWRfYWRkcmVzczogMQotd3JpdGU6IDEKLW5hbm9zbGVlcDogMQotc2NoZWRfc2V0c2NoZWR1bGVyOiAxCi11bmFtZTogMQotbWVtZmRfY3JlYXRlOiAxCi1mdHJ1bmNhdGU6IDEKLWZ0cnVuY2F0ZTY0OiAxCi0KLSMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgotZ2V0dGlkOiAxCi1zY2hlZF95aWVsZDogMQotZ2V0cGlkOiAxCi1nZXR0aWQ6IDEKLQotQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LWFybS5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LWFybS5wb2xpY3kKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWRlZmF1bHQtYXJtLnBvbGljeQpyZW5hbWUgdG8gbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC1hcm0ucG9saWN5CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LWFybTY0LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtYXJtNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMDI4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LWFybTY0LnBvbGljeQpAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK2dldHVpZDogMQorZ2V0cmxpbWl0OiAxCitmc3RhdDogMQorbmV3ZnN0YXRhdDogMQorZnN0YXRmczogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMgfHwgYXJnMyA9PSBNUkVNQVBfTUFZTU9WRQorbXVubWFwOiAxCitwcmN0bDogMQord3JpdGV2OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK2V4aXQ6IDEKK2xzZWVrOiAxCitydF9zaWdwcm9jbWFzazogMQorb3BlbmF0OiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCitzZXRwcmlvcml0eTogMQorc2V0X3RpZF9hZGRyZXNzOiAxCitnZXRkZW50czY0OiAxCityZWFkbGlua2F0OiAxCityZWFkOiAxCitwcmVhZDY0OiAxCitnZXR0aW1lb2ZkYXk6IDEKK2ZhY2Nlc3NhdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQorbWFkdmlzZTogMQorCisjIGNyYXNoIGR1bXAgcG9saWN5IGFkZGl0aW9ucworY2xvY2tfZ2V0dGltZTogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKK3BpcGUyOiAxCityZWN2bXNnOiAxCitwcm9jZXNzX3ZtX3JlYWR2OiAxCit0Z2tpbGw6IDEKK3J0X3NpZ2FjdGlvbjogMQorcnRfdGdzaWdxdWV1ZWluZm86IDEKKyNtcHJvdGVjdDogYXJnMiBpbiAweDF8MHgyCittdW5tYXA6IDEKKyNtbWFwOiBhcmcyIGluIDB4MXwweDIKK2dldGV1aWQ6IDEKK2dldGdpZDogMQorZ2V0ZWdpZDogMQorZ2V0Z3JvdXBzOiAxCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQteDg2LnBvbGljeSBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZjNjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC14ODYucG9saWN5CkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitvcGVuOiAxCitnZXR1aWQzMjogMQorZ2V0dWlkOiAxCitnZXRybGltaXQ6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorbW1hcDogMQorZnN0YXQ2NDogMQorZnN0YXQ6IDEKK3N0YXQ2NDogMQorc3RhdGZzNjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorbmV3ZnN0YXRhdDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rOiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK2ZzdGF0ZnM6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQordW5hbWU6IDEKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC14ODZfNjQucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItZGVmYXVsdC14ODZfNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmM2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMi1kZWZhdWx0LXg4Nl82NC5wb2xpY3kKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK29wZW46IDEKK2dldHVpZDMyOiAxCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCittbWFwOiAxCitmc3RhdDY0OiAxCitmc3RhdDogMQorc3RhdDY0OiAxCitzdGF0ZnM2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCituZXdmc3RhdGF0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbms6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorZnN0YXRmczogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCit1bmFtZTogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKK2Z0cnVuY2F0ZTY0OiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcAppbmRleCA4MWJmZmViLi4wZDA2ODRkIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKQEAgLTE1LDExICsxNSwxMSBAQAogICovCiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtc2VydmljZSIKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItc2VydmljZSIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMS9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRTdG9yZS5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtaW5pamFpbC5oPgogCkBAIC0zMSwxMyArMzEsMTMgQEAKIC8vICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXNlY2NvbXBfcG9saWN5IiBpbiBBbmRyb2lkLmJwLgogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtCYXNlU2VjY29tcFBvbGljeVBhdGhbXSA9CiAgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS8iCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMS1kZWZhdWx0LXNlY2NvbXAtcG9saWN5IjsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWRlZmF1bHQtc2VjY29tcC1wb2xpY3kiOwogCiAvLyBBZGRpdGlvbmFsIHNlY2NvbXAgcGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkIGluIHRoaXMgZmlsZS4KIC8vIFRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCBieSBkZWZhdWx0Lgogc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtFeHRTZWNjb21wUG9saWN5UGF0aFtdID0KICAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5LyIKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4xLWV4dGVuZGVkLXNlY2NvbXAtcG9saWN5IjsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4yLWV4dGVuZGVkLXNlY2NvbXAtcG9saWN5IjsKIAogY2xhc3MgU3RvcmVJbXBsIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgewogcHVibGljOgpAQCAtMTIyLDYgKzEyMiwxOCBAQAogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0SW9uVXNhZ2UpCiAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURtYUJ1ZlVzYWdlSW5mbywgImRtYWJ1Zi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvKCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgdXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgY2FwYWNpdHkpLmluUmFuZ2UoMCwgVUlOVDMyX01BWCwgMTAyNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCBoZWFwTmFtZSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCBhbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXREbWFCdWZVc2FnZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2aXJ0dWFsIH5JbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CkBAIC0xMzUsNyArMTQ3LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOwogICAgICAgICB9CiAKKyAgICAgICAgc3RhdGljIEMyUiBTZXREbWFCdWZVc2FnZShib29sIC8qIG1heUJsb2NrICovLCBDMlA8QzJTdG9yZURtYUJ1ZlVzYWdlSW5mbz4gJm1lKSB7CisgICAgICAgICAgICAvLyBWZW5kb3IncyBUT0RPOiBwdXQgYXBwcm9wcmlhdGUgbWFwcGluZyBsb2dpYworICAgICAgICAgICAgc3RybmNweShtZS5zZXQoKS5tLmhlYXBOYW1lLCAic3lzdGVtIiwgbWUudi5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5tLmFsbG9jRmxhZ3MgPSAwOworICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgfQorCisKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVJb25Vc2FnZUluZm8+IG1Jb25Vc2FnZUluZm87CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiBtRG1hQnVmVXNhZ2VJbmZvOwogICAgIH07CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9ySGVscGVyOwogICAgIEludGVyZmFjZSBtSW50ZXJmYWNlOwpAQCAtMTQzLDcgKzE2NCw3IEBACiAKIGludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgewogICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Ci0gICAgTE9HKERFQlVHKSA8PCAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjEtc2VydmljZSBzdGFydGluZy4uLiI7CisgICAgTE9HKERFQlVHKSA8PCAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjItc2VydmljZSBzdGFydGluZy4uLiI7CiAKICAgICAvLyBTZXQgdXAgbWluaWphaWwgdG8gbGltaXQgc3lzdGVtIGNhbGxzLgogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKQEAgLTE1OSw3ICsxODAsNyBAQAogCiAgICAgLy8gQ3JlYXRlIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlLgogICAgIHsKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMTsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMjsKICAgICAgICAgc3A8SUNvbXBvbmVudFN0b3JlPiBzdG9yZTsKIAogICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icAppbmRleCA5NDAzNGI1Li4yYmM3NDhmIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjIiwKIApAQCAtMTEsNiArMjAsNyBAQAogICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCiAgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKICAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJGcmFtZVJlYXNzZW1ibGVyLmNwcCIsCiAgICAgICAgICJQaXBlbGluZVdhdGNoZXIuY3BwIiwKICAgICAgICAgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCmluZGV4IGM3NTg4ZTkuLmMwNDkxODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CiAjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CiAjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CkBAIC0zMiwxOCArMzMsMjIgQEAKICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQvZmRzYW4uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogCisjaW5jbHVkZSAidXRpbHMvQ29kZWMyTWFwcGVyLmgiCiAjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIHsKIAorY29uc3RleHByIE9NWF9VMzIga1BvcnRJbmRleElucHV0ID0gMDsKKwogY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgewogcHVibGljOgogICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQpAQCAtNjgsNiArNzMsMjcgQEAKICAgICAgICAgam9icy0+Y29uZC5icm9hZGNhc3QoKTsKICAgICB9CiAKKyAgICB2b2lkIHNldERhdGFzcGFjZShhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2UpIHsKKyAgICAgICAgTXV0ZXhlZDxKb2JzPjo6TG9ja2VkIGpvYnMobUpvYnMpOworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpOworICAgICAgICBqb2JzLT5jb25maWdVcGRhdGUuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbURhdGFTcGFjZUluZm86OmlucHV0KDB1LCBkYXRhc3BhY2UpKTsKKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlcjsKKyAgICAgICAgaW50MzJfdCByYW5nZTsKKyAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRGF0YVNwYWNlKGRhdGFzcGFjZSwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBjb2xvckFzcGVjdHMgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PigwdSk7CisgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHN0YW5kYXJkLCAmY29sb3JBc3BlY3RzLT5wcmltYXJpZXMsICZjb2xvckFzcGVjdHMtPm1hdHJpeCkKKyAgICAgICAgICAgICAgICAmJiBDMk1hcHBlcjo6bWFwKHRyYW5zZmVyLCAmY29sb3JBc3BlY3RzLT50cmFuc2ZlcikKKyAgICAgICAgICAgICAgICAmJiBDMk1hcHBlcjo6bWFwKHJhbmdlLCAmY29sb3JBc3BlY3RzLT5yYW5nZSkpIHsKKyAgICAgICAgICAgIGpvYnMtPmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNvbG9yQXNwZWN0cykpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KGdldFRpZCgpLCBwcmlvcml0eSk7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGUgewogICAgICAgICBjb25zdGV4cHIgbnNlY3NfdCBrSW50ZXJ2YWxOcyA9IG5zZWNzX3QoMTApICogMTAwMCAqIDEwMDA7ICAvLyAxMG1zCkBAIC05OSw2ICsxMjUsOSBAQAogICAgICAgICAgICAgICAgICAgICB1bmlxdWVGZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZkMSkpOwogICAgICAgICAgICAgICAgICAgICBxdWV1ZS53b3JrTGlzdC5wb3BfZnJvbnQoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogam9icy0+Y29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZyb250KCktPmlucHV0LmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBqb2JzLnVubG9jaygpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGZlbmNlRmQgOiBmZW5jZUZkcykgewpAQCAtMTE2LDYgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgcXVldWVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChxdWV1ZWQpIHsKKyAgICAgICAgICAgICAgICBqb2JzLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpID09IDApIHsKQEAgLTE1OCw2ICsxODgsNyBAQAogICAgICAgICBzdGQ6Om1hcDxzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiwKICAgICAgICAgICAgICAgICAgUXVldWUsCiAgICAgICAgICAgICAgICAgIHN0ZDo6b3duZXJfbGVzczxzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50Pj4+IHF1ZXVlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CiAgICAgICAgIENvbmRpdGlvbiBjb25kOwogICAgIH07CiAgICAgTXV0ZXhlZDxKb2JzPiBtSm9iczsKQEAgLTE2OSw2ICsyMDAsOSBAQAogICAgICAgbVF1ZXVlVGhyZWFkKG5ldyBRdWV1ZVRocmVhZCkgewogICAgIGFuZHJvaWRfZmRzYW5fc2V0X2Vycm9yX2xldmVsKEFORFJPSURfRkRTQU5fRVJST1JfTEVWRUxfV0FSTl9BTFdBWVMpOwogICAgIG1RdWV1ZVRocmVhZC0+cnVuKCJDMk9NWE5vZGUiLCBQUklPUklUWV9BVURJTyk7CisKKyAgICBNdXRleGVkPGFuZHJvaWRfZGF0YXNwYWNlPjo6TG9ja2VkIGRzKG1EYXRhc3BhY2UpOworICAgICpkcyA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKIH0KIAogc3RhdHVzX3QgQzJPTVhOb2RlOjpmcmVlTm9kZSgpIHsKQEAgLTIwMCwxMSArMjM0LDM1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBEZWYgPSAoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqKXBhcmFtczsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgdGhlc2UgZnJvbSBpbnRmKCkKKyAgICAgICAgICAgIGlmIChwRGVmLT5uUG9ydEluZGV4ICE9IGtQb3J0SW5kZXhJbnB1dCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKworICAgICAgICAgICAgLy8gV09SS0FST1VORDogaGF2aW5nIG1vcmUgc2xvdHMgaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGlsZSBjb25zdW1pbmcKKyAgICAgICAgICAgIC8vIG1vcmUgbWVtb3J5LiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gcmVkdWNlIG1lbW9yeSBmb3IKKyAgICAgICAgICAgIC8vIGxhcmdlci10aGFuLTRLIHNjZW5hcmlvLgorICAgICAgICAgICAgaWYgKG1XaWR0aCAqIG1IZWlnaHQgPiA0MDk2ICogMjM0MCkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IG1Db21wLmxvY2soKTsKKyAgICAgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKKyAgICAgICAgICAgICAgICBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcgcGlwZWxpbmVEZWxheSgwKTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgICAgICBpZiAoY29tcCkgeworICAgICAgICAgICAgICAgICAgICBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsmaW5wdXREZWxheSwgJnBpcGVsaW5lRGVsYXl9LCB7fSwgQzJfRE9OVF9CTE9DSywgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjMmVyciA9PSBDMl9PSyB8fCBjMmVyciA9PSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gNDsKKyAgICAgICAgICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsICs9IChpbnB1dERlbGF5ID8gaW5wdXREZWxheS52YWx1ZSA6IDB1KTsKKyAgICAgICAgICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsICs9IChwaXBlbGluZURlbGF5ID8gcGlwZWxpbmVEZWxheS52YWx1ZSA6IDB1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOwogICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOwogICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBwRGVmLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU7CiAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zNjUsNiArNDIzLDggQEAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgKHZvaWQpZmQwLnJlbGVhc2UoKTsKICAgICAgICAgICAgICh2b2lkKWZkMS5yZWxlYXNlKCk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CkBAIC00MzIsOCArNDkyLDExIEBACiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKW1zZy51LmV2ZW50X2RhdGEuZGF0YTE7CiAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtc2cudS5ldmVudF9kYXRhLmRhdGEzOwogCi0gICAgLy8gVE9ETzogc2V0IGRhdGFzcGFjZSBvbiBjb21wb25lbnQgdG8gc2VlIGlmIGl0IGltcGFjdHMgY29sb3IgYXNwZWN0cwogICAgIEFMT0dEKCJkYXRhc3BhY2UgY2hhbmdlZCB0byAlI3ggcGl4ZWwgZm9ybWF0OiAlI3giLCBkYXRhU3BhY2UsIHBpeGVsRm9ybWF0KTsKKyAgICBtUXVldWVUaHJlYWQtPnNldERhdGFzcGFjZShkYXRhU3BhY2UpOworCisgICAgTXV0ZXhlZDxhbmRyb2lkX2RhdGFzcGFjZT46OkxvY2tlZCBkcyhtRGF0YXNwYWNlKTsKKyAgICAqZHMgPSBkYXRhU3BhY2U7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC00NjYsNCArNTI5LDEyIEBACiAgICAgKHZvaWQpbUJ1ZmZlclNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVySWQsIC0xKTsKIH0KIAorYW5kcm9pZF9kYXRhc3BhY2UgQzJPTVhOb2RlOjpnZXREYXRhc3BhY2UoKSB7CisgICAgcmV0dXJuICptRGF0YXNwYWNlLmxvY2soKTsKK30KKwordm9pZCBDMk9NWE5vZGU6OnNldFByaW9yaXR5KGludCBwcmlvcml0eSkgeworICAgIG1RdWV1ZVRocmVhZC0+c2V0UHJpb3JpdHkocHJpb3JpdHkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5oCmluZGV4IDE3MTdjOTYuLjY2NjkzMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKQEAgLTkzLDYgKzkzLDE2IEBACiAgICAgICovCiAgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjMl9jbnRyNjRfdCBpbmRleCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGRhdGFzcGFjZSBpbmZvcm1hdGlvbiBmcm9tIEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgICovCisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YXNwYWNlKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHByaW9yaXR5IG9mIHRoZSBxdWV1ZSB0aHJlYWQuCisgICAgICovCisgICAgdm9pZCBzZXRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCiBwcml2YXRlOgogICAgIHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wOwogICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CkBAIC0xMDEsNiArMTExLDcgQEAKICAgICB1aW50MzJfdCBtV2lkdGg7CiAgICAgdWludDMyX3QgbUhlaWdodDsKICAgICB1aW50NjRfdCBtVXNhZ2U7CisgICAgTXV0ZXhlZDxhbmRyb2lkX2RhdGFzcGFjZT4gbURhdGFzcGFjZTsKIAogICAgIC8vIFdPUktBUk9VTkQ6IHRpbWVzdGFtcCBhZGp1c3RtZW50CiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKaW5kZXggMTk3MmQzZi4uODI0NjBjOSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTM4LDEyICszOCwxNCBAQAogI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgogCiAjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCiAjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgpAQCAtMjEwLDggKzIxMiw2IEBACiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKICAgICAgICAgICAgICAgICAmdXNhZ2UsIHNpemVvZih1c2FnZSkpOwogCi0gICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCi0gICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KICAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKAogICAgICAgICAgICAgICAgIG1PbXhOb2RlLCBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6RGF0YXNwYWNlPihtRGF0YVNwYWNlKSk7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTI0Niw4ICsyNDYsMTkgQEAKICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfQotICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisKKyAgICAgICAgc2l6ZV90IG51bVNsb3RzID0gMTY7CisgICAgICAgIGNvbnN0ZXhwciBPTVhfVTMyIGtQb3J0SW5kZXhJbnB1dCA9IDA7CisKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBwYXJhbTsKKyAgICAgICAgcGFyYW0ublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbU5vZGUtPmdldFBhcmFtZXRlcihPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbSwgc2l6ZW9mKHBhcmFtKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG51bVNsb3RzID0gcGFyYW0ubkJ1ZmZlckNvdW50QWN0dWFsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TbG90czsgKytpKSB7CiAgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKICAgICAgICAgfQogCkBAIC0zODcsNiArMzk4LDE0IEBACiAKICAgICAgICAgLy8gY29uc3VtZXIgdXNhZ2UgaXMgcXVlcmllZCBlYXJsaWVyLgogCisgICAgICAgIC8vIHByaW9yaXR5CisgICAgICAgIGlmIChtQ29uZmlnLm1Qcmlvcml0eSAhPSBjb25maWcubVByaW9yaXR5KSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLm1Qcmlvcml0eSAhPSBJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgbU5vZGUtPnNldFByaW9yaXR5KGNvbmZpZy5tUHJpb3JpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tUHJpb3JpdHkgPSBjb25maWcubVByaW9yaXR5OworICAgICAgICB9CisKICAgICAgICAgaWYgKHN0YXR1cy5zdHIoKS5lbXB0eSgpKSB7CiAgICAgICAgICAgICBBTE9HRCgiSVNDb25maWcgbm90IGNoYW5nZWQiKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTM5OSw2ICs0MTgsMTAgQEAKICAgICAgICAgbU5vZGUtPm9uSW5wdXRCdWZmZXJEb25lKGluZGV4KTsKICAgICB9CiAKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBnZXREYXRhc3BhY2UoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTm9kZS0+Z2V0RGF0YXNwYWNlKCk7CisgICAgfQorCiBwcml2YXRlOgogICAgIHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOwogICAgIHNwPEMyT01YTm9kZT4gbU5vZGU7CkBAIC00NzEsNiArNDk0LDcyIEBACiAgICAgfQogfTsKIAordm9pZCBSZXZlcnRPdXRwdXRGb3JtYXRJZk5lZWRlZCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvbGRGb3JtYXQsIHNwPEFNZXNzYWdlPiAmY3VycmVudEZvcm1hdCkgeworICAgIC8vIFdlIHVzZWQgdG8gbm90IHJlcG9ydCBjaGFuZ2VzIHRvIHRoZXNlIGtleXMgdG8gdGhlIGNsaWVudC4KKyAgICBjb25zdCBzdGF0aWMgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNJZ25vcmVkS2V5cyh7CisgICAgICAgICAgICBLRVlfQklUX1JBVEUsCisgICAgICAgICAgICBLRVlfRlJBTUVfUkFURSwKKyAgICAgICAgICAgIEtFWV9NQVhfQklUX1JBVEUsCisgICAgICAgICAgICBLRVlfTUFYX1dJRFRILAorICAgICAgICAgICAgS0VZX01BWF9IRUlHSFQsCisgICAgICAgICAgICAiY3NkLTAiLAorICAgICAgICAgICAgImNzZC0xIiwKKyAgICAgICAgICAgICJjc2QtMiIsCisgICAgfSk7CisgICAgaWYgKGN1cnJlbnRGb3JtYXQgPT0gb2xkRm9ybWF0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QU1lc3NhZ2U+IGRpZmYgPSBjdXJyZW50Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpOworICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgZm9yIChzaXplX3QgaSA9IGRpZmYtPmNvdW50RW50cmllcygpOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGlmIChzSWdub3JlZEtleXMuY291bnQoZGlmZi0+Z2V0RW50cnlOYW1lQXQoaSAtIDEsICZ0eXBlKSkgPiAwKSB7CisgICAgICAgICAgICBkaWZmLT5yZW1vdmVFbnRyeUF0KGkgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGlmZi0+Y291bnRFbnRyaWVzKCkgPT0gMCkgeworICAgICAgICBjdXJyZW50Rm9ybWF0ID0gb2xkRm9ybWF0OworICAgIH0KK30KKwordm9pZCBBbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7CisgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgLy8gQ29kZWMgc3BlY2lmaWMgZGF0YSBzaG91bGQgYmUgU1BTIGFuZCBQUFMgaW4gYSBzaW5nbGUgYnVmZmVyLAorICAgICAgICAvLyBlYWNoIHByZWZpeGVkIGJ5IGEgc3RhcnRjb2RlICgweDAwIDB4MDAgMHgwMCAweDAxKS4KKyAgICAgICAgLy8gV2Ugc2VwYXJhdGUgdGhlIHR3byBhbmQgcHV0IHRoZW0gaW50byB0aGUgb3V0cHV0IGZvcm1hdAorICAgICAgICAvLyB1bmRlciB0aGUga2V5cyAiY3NkLTAiIGFuZCAiY3NkLTEiLgorCisgICAgICAgIHVuc2lnbmVkIGNzZEluZGV4ID0gMDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgc2l6ZV90IG5hbFNpemU7CisgICAgICAgIHdoaWxlIChnZXROZXh0TkFMVW5pdCgmZGF0YSwgJnNpemUsICZuYWxTdGFydCwgJm5hbFNpemUsIHRydWUpID09IE9LKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihuYWxTaXplICsgNCk7CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCksICJceDAwXHgwMFx4MDBceDAxIiwgNCk7CisgICAgICAgICAgICBtZW1jcHkoY3NkLT5kYXRhKCkgKyA0LCBuYWxTdGFydCwgbmFsU2l6ZSk7CisKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nUHJpbnRmKCJjc2QtJXUiLCBjc2RJbmRleCkuY19zdHIoKSwgY3NkKTsKKworICAgICAgICAgICAgKytjc2RJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc2RJbmRleCAhPSAyKSB7CisgICAgICAgICAgICBBTE9HVygiRXhwZWN0ZWQgdHdvIE5BTCB1bml0cyBmcm9tIEFWQyBjb2RlYyBjb25maWcsIGJ1dCAldSBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgIGNzZEluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2Ugd2UganVzdCBzdGFzaCB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YSBpbnRvCisgICAgICAgIC8vIHRoZSBvdXRwdXQgZm9ybWF0IGFzIGEgc2luZ2xlIHBpZWNlIG9mIGNzZCB1bmRlciAiY3NkLTAiLgorICAgICAgICBzcDxBQnVmZmVyPiBjc2QgPSBuZXcgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgbWVtY3B5KGNzZC0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICAgICAgY3NkLT5zZXRSYW5nZSgwLCBzaXplKTsKKyAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoImNzZC0wIiwgY3NkKTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCkBAIC01MDIsOSArNTkxLDI2IEBACiAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAogICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7Ci0gICAgICAgIC8vIFRPRE8KLSAgICAgICAgKHZvaWQpY29tcG9uZW50OwotICAgICAgICAodm9pZCllcnJvckNvZGU7CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbXBvbmVudCBpcyBvbmx5IHVzZWQgZm9yIHJlcG9ydGluZyBhcyB3ZSB1c2UgYSBzZXBhcmF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBpbnN0YW5jZQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJDb21wb25lbnQgZGllZCB3aXRoIGVycm9yOiAweCV4IiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIkNvbXBvbmVudCBcIiVzXCIgcmV0dXJuZWQgZXJyb3I6IDB4JXgiLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcG9ydCB0byBNZWRpYUNvZGVjCisgICAgICAgIC8vIE5vdGU6IGZvciBub3cgd2UgZG8gbm90IHByb3BhZ2F0ZSB0aGUgZXJyb3IgY29kZSB0byBNZWRpYUNvZGVjCisgICAgICAgIC8vIGV4Y2VwdCBmb3IgQzJfTk9fTUVNT1JZLCBhcyB3ZSB3b3VsZCBuZWVkIHRvIHRyYW5zbGF0ZSB0byBhIE1lZGlhQ29kZWMgZXJyb3IuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKAorICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9PSBDMl9OT19NRU1PUlkgPyBOT19NRU1PUlkgOiBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgICAgIEFDVElPTl9DT0RFX0ZBVEFMKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKQEAgLTU2Nyw2ICs2NzMsMTAgQEAKICAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKICAgICB9CiAKKyAgICB2b2lkIG9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5KCkgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25GaXJzdFR1bm5lbEZyYW1lUmVhZHkoKTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgQ0NvZGVjICptQ29kZWM7CiB9OwpAQCAtNjM0LDE3ICs3NDQsMTggQEAKICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOwogICAgIH0KIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9Ci0gICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCiAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICBtQ2xpZW50TGlzdGVuZXIsCisgICAgICAgICAgICAmY29tcCwKICAgICAgICAgICAgICZjbGllbnQpOwotICAgIGlmICghY29tcCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgQ3JlYXRlIGNvbXBvbmVudDogJXMsIGVycm9yPSVkIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CiAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOwogICAgICAgICBzdGF0ZS51bmxvY2soKTsKLSAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKChzdGF0dXMgPT0gQzJfTk9fTUVNT1JZID8gTk9fTUVNT1JZIDogVU5LTk9XTl9FUlJPUiksIEFDVElPTl9DT0RFX0ZBVEFMKTsKICAgICAgICAgc3RhdGUubG9jaygpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzM5LDEwICs4NTAsMzAgQEAKICAgICAgICAgICAgIG1DaGFubmVsLT5zZXRNZXRhTW9kZShDQ29kZWNCdWZmZXJDaGFubmVsOjpNT0RFX0FOVyk7CiAgICAgICAgIH0KIAorICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwogICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpIHsKICAgICAgICAgICAgIHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICAvLyBzZXR1cCB0dW5uZWxlZCBwbGF5YmFjaworICAgICAgICAgICAgaWYgKHN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHVubmVsZWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsICZ0dW5uZWxlZCkgJiYgdHVubmVsZWQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIFRVTk5FTEVEIHZpZGVvIHBsYXliYWNrLiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soY29tcCwgJmNvbmZpZy0+bVNpZGViYW5kSGFuZGxlLCBtc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2sgZmFpbGVkISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1UdW5uZWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRTdXJmYWNlKHN1cmZhY2UpOwogICAgICAgICB9CiAKQEAgLTc3MywxMiArOTA0LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOwogICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfSU1BR0UgfCBDb25maWc6OklTX1ZJREVPKSkgewotICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfV0lEVEgsICZpMzIpKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJndpZHRoKSkgewogICAgICAgICAgICAgICAgIEFMT0dEKCJ3aWR0aCBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgaW1hZ2UvdmlkZW8gY29tcG9uZW50cy4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaTMyKSkgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIEFMT0dEKCJoZWlnaHQgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KQEAgLTg2MiwyOCArOTk1LDEyMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tVXNhZ2UgPSAwOworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1Qcmlvcml0eSA9IElOVF9NQVg7CiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBIYW5kbGUgZGVzaXJlZCBjb2xvciBmb3JtYXQuCiAgICAgICAgICAqLworICAgICAgICBpbnQzMl90IGRlZmF1bHRDb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwogICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IC0xOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAwOworICAgICAgICAgICAgLy8gUXVlcnkgdmVuZG9yIGZvcm1hdCBmb3IgRmxleGlibGUgWVVWCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgICAgICAgICBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbyAqcGl4ZWxGb3JtYXRJbmZvID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChtQ2xpZW50LT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAge0MyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZoZWFwUGFyYW1zKSA9PSBDMl9PSworICAgICAgICAgICAgICAgICAgICAmJiBoZWFwUGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mbyA9IEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBmbGV4UGl4ZWxGb3JtYXR7fTsKKyAgICAgICAgICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IGZsZXhQbGFuYXJQaXhlbEZvcm1hdHt9OworICAgICAgICAgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gZmxleFNlbWlQbGFuYXJQaXhlbEZvcm1hdHt9OworICAgICAgICAgICAgaWYgKHBpeGVsRm9ybWF0SW5mbyAmJiAqcGl4ZWxGb3JtYXRJbmZvKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaXhlbEZvcm1hdEluZm8tPmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCAmZGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8tPm0udmFsdWVzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVzYy5iaXREZXB0aCAhPSA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5zdWJzYW1wbGluZyAhPSBDMkNvbG9yOjpZVVZfNDIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE4MDA3NjEwNSk6IHNvbWUgZGV2aWNlIHJlcG9ydCB3cm9uZyBsYXlvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9QQUNLRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9BTElHTkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6VU5LTk9XTl9MQVlPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghZmxleFBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQgPSBkZXNjLnBpeGVsRm9ybWF0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpQTEFOQVJfUEFDS0VEICYmICFmbGV4UGxhbmFyUGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhQbGFuYXJQaXhlbEZvcm1hdCA9IGRlc2MucGl4ZWxGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MubGF5b3V0ID09IEMyQ29sb3I6OlNFTUlQTEFOQVJfUEFDS0VEICYmICFmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGV4U2VtaVBsYW5hclBpeGVsRm9ybWF0ID0gZGVzYy5waXhlbEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEFsc28gaGFuZGxlIGRlZmF1bHQgY29sb3IgZm9ybWF0IChlbmNvZGVycyByZXF1aXJlIGNvbG9yIGZvcm1hdCwgc28gdGhpcyBpcyBvbmx5Ci0gICAgICAgICAgICAgICAgICogbmVlZGVkIGZvciBkZWNvZGVycy4KLSAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyBBbHNvIGhhbmRsZSBkZWZhdWx0IGNvbG9yIGZvcm1hdCAoZW5jb2RlcnMgcmVxdWlyZSBjb2xvciBmb3JtYXQsIHNvIHRoaXMgaXMgb25seQorICAgICAgICAgICAgICAgIC8vIG5lZWRlZCBmb3IgZGVjb2RlcnMuCiAgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAoc3VyZmFjZSA9PSBudWxscHRyKSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJzZW1pLSI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDbGllbnQgcmVxdWVzdGVkIEJ5dGVCdWZmZXIgbW9kZSBkZWNvZGVyIHcvbyBjb2xvciBmb3JtYXQgc2V0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBkZWZhdWx0ICVzcGxhbmFyIGNvbG9yIGZvcm1hdCIsIHByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBDT0xPUl9Gb3JtYXRTdXJmYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb2xvckZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB8fCAhc3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbGV4UGl4ZWxGb3JtYXQudmFsdWVfb3IoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gZmxleFBsYW5hclBpeGVsRm9ybWF0LnZhbHVlX29yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0LnZhbHVlX29yKGZvcm1hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZsZXhTZW1pUGxhbmFyUGl4ZWxGb3JtYXQudmFsdWVfb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4UGl4ZWxGb3JtYXQudmFsdWVfb3IoZm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vLW9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPj0gMCkgeworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgZm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBkYXRhc3BhY2UKKyAgICAgICAgICovCisgICAgICAgIGludDMyX3QgdXNpbmdSZWNvcmRlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl91c2luZy1yZWNvcmRlciIsICZ1c2luZ1JlY29yZGVyKSAmJiB1c2luZ1JlY29yZGVyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX0JUNzA5OworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgICAgICAgICAgICAgZ2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgICAgIHNldERlZmF1bHRDb2RlY0NvbG9yQXNwZWN0c0lmTmVlZGVkKGFzcGVjdHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgZGF0YXNwYWNlIC8gY29sb3IgYXNwZWN0IGZyb20gdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIHNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgY29uc3RfY2FzdDxzcDxBTWVzc2FnZT4gJj4obXNnKSk7CisgICAgICAgICAgICAgICAgZGF0YVNwYWNlID0gZ2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5ZXhwYW5kICovKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KWRhdGFTcGFjZSk7CisgICAgICAgICAgICBBTE9HRCgic2V0dGluZyBkYXRhc3BhY2UgdG8gJXgiLCBkYXRhU3BhY2UpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBzdWJzY3JpYmVUb0FsbFZlbmRvclBhcmFtczsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ4LSoiLCAmc3Vic2NyaWJlVG9BbGxWZW5kb3JQYXJhbXMpICYmIHN1YnNjcmliZVRvQWxsVmVuZG9yUGFyYW1zKSB7CiAgICAgICAgICAgICBpZiAoY29uZmlnLT5zdWJzY3JpYmVUb0FsbFZlbmRvclBhcmFtcyhjb21wLCBDMl9NQVlfQkxPQ0spICE9IE9LKSB7CkBAIC05MDAsNyArMTEyNyw3IEBACiAgICAgICAgICAgICBzZGtQYXJhbXMgPSBtc2ctPmR1cCgpOwogICAgICAgICAgICAgc2RrUGFyYW1zLT5yZW1vdmVFbnRyeUF0KHNka1BhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSkpOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgZXJyID0gY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAogICAgICAgICAgICAgICAgIGNvbXAsIHNka1BhcmFtcywgQ29uZmlnOjpJU19DT05GSUcsIEMyX0RPTlRfQkxPQ0ssICZjb25maWdVcGRhdGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbnZlcnQgY29uZmlndXJhdGlvbiB0byBjMiBwYXJhbXMiKTsKQEAgLTkyMSw2ICsxMTQ4LDU1IEBACiAgICAgICAgICAgICBjb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShnb3ApKTsKICAgICAgICAgfQogCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKSkgeworICAgICAgICAgICAgLy8gd2UgbWF5IG5vdCB1c2UgYWxsIDMgb2YgdGhlc2UgZW50cmllcworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtUGljdHVyZVF1YW50aXphdGlvblR1bmluZzo6b3V0cHV0PiBxcCA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlUXVhbnRpemF0aW9uVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDMgLyogZmxleENvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gKi8pOworCisgICAgICAgICAgICBpbnQgaXggPSAwOworCisgICAgICAgICAgICBpbnQzMl90IGlNYXggPSBJTlQzMl9NQVg7CisgICAgICAgICAgICBpbnQzMl90IGlNaW4gPSBJTlQzMl9NSU47CisgICAgICAgICAgICAodm9pZCkgc2RrUGFyYW1zLT5maW5kSW50MzIoS0VZX1ZJREVPX1FQX0lfTUFYLCAmaU1heCk7CisgICAgICAgICAgICAodm9pZCkgc2RrUGFyYW1zLT5maW5kSW50MzIoS0VZX1ZJREVPX1FQX0lfTUlOLCAmaU1pbik7CisgICAgICAgICAgICBpZiAoaU1heCAhPSBJTlQzMl9NQVggfHwgaU1pbiAhPSBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICBxcC0+bS52YWx1ZXNbaXgrK10gPSB7SV9GUkFNRSwgaU1pbiwgaU1heH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgcE1heCA9IElOVDMyX01BWDsKKyAgICAgICAgICAgIGludDMyX3QgcE1pbiA9IElOVDMyX01JTjsKKyAgICAgICAgICAgICh2b2lkKSBzZGtQYXJhbXMtPmZpbmRJbnQzMihLRVlfVklERU9fUVBfUF9NQVgsICZwTWF4KTsKKyAgICAgICAgICAgICh2b2lkKSBzZGtQYXJhbXMtPmZpbmRJbnQzMihLRVlfVklERU9fUVBfUF9NSU4sICZwTWluKTsKKyAgICAgICAgICAgIGlmIChwTWF4ICE9IElOVDMyX01BWCB8fCBwTWluICE9IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgIHFwLT5tLnZhbHVlc1tpeCsrXSA9IHtQX0ZSQU1FLCBwTWluLCBwTWF4fTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBiTWF4ID0gSU5UMzJfTUFYOworICAgICAgICAgICAgaW50MzJfdCBiTWluID0gSU5UMzJfTUlOOworICAgICAgICAgICAgKHZvaWQpIHNka1BhcmFtcy0+ZmluZEludDMyKEtFWV9WSURFT19RUF9CX01BWCwgJmJNYXgpOworICAgICAgICAgICAgKHZvaWQpIHNka1BhcmFtcy0+ZmluZEludDMyKEtFWV9WSURFT19RUF9CX01JTiwgJmJNaW4pOworICAgICAgICAgICAgaWYgKGJNYXggIT0gSU5UMzJfTUFYIHx8IGJNaW4gIT0gSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgcXAtPm0udmFsdWVzW2l4KytdID0ge0JfRlJBTUUsIGJNaW4sIGJNYXh9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGp1c3QgdG8gcmVmbGVjdCBhY3R1YWwgdXNlLgorICAgICAgICAgICAgcXAtPnNldEZsZXhDb3VudChpeCk7CisKKyAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHFwKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGJhY2tncm91bmQgPSAwOworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2JhY2tncm91bmQtbW9kZSIsICZiYWNrZ3JvdW5kKQorICAgICAgICAgICAgICAgICYmIGJhY2tncm91bmQpIHsKKyAgICAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eShnZXR0aWQoKSwgQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICAgICAgICAgIGlmIChjb25maWctPm1JU0NvbmZpZykgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tUHJpb3JpdHkgPSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBlcnIgPSBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9ET05UX0JMT0NLKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb25maWd1cmUgYzIgcGFyYW1zIik7CkBAIC05MzIsNyArMTIwOCwxMCBAQAogICAgICAgICBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCBtYXhJbnB1dFNpemUoMHUsIDB1KTsKICAgICAgICAgQzJQcmVwZW5kSGVhZGVyTW9kZVNldHRpbmcgcHJlcGVuZChQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKIAorICAgICAgICBDMlBhcmFtOjpJbmRleCBjb2xvckFzcGVjdHNSZXF1ZXN0SW5kZXggPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRzsKICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzIHsKKyAgICAgICAgICAgIGNvbG9yQXNwZWN0c1JlcXVlc3RJbmRleC53aXRoU3RyZWFtKDB1KSwKICAgICAgICAgfTsKICAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5xdWVyeSgKICAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSwgJnByZXBlbmQgfSwKQEAgLTk0MywxMSArMTIyMiw2IEBACiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGNvbXBvbmVudCBpbnRlcmZhY2U6ICVkIiwgYzJlcnIpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gaW5kaWNlcy5zaXplKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb21wb25lbnQgcmV0dXJucyB3cm9uZyBudW1iZXIgb2YgcGFyYW1zOiBleHBlY3RlZCAlenUgYWN0dWFsICV6dSIsCi0gICAgICAgICAgICAgICAgICAgIGluZGljZXMuc2l6ZSgpLCBwYXJhbXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9CiAgICAgICAgIGlmICh1c2FnZSkgewogICAgICAgICAgICAgaWYgKHVzYWdlLnZhbHVlICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpIHsKICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCB0cnVlKTsKQEAgLTk1Niw2ICsxMjMwLDcgQEAKICAgICAgICAgICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZSBhbmRyb2lkVXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpOwogICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tVXNhZ2UgPSBhbmRyb2lkVXNhZ2UuYXNHcmFsbG9jVXNhZ2UoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgiYW5kcm9pZC5fQzJNZW1vcnlVc2FnZSIsIHVzYWdlLnZhbHVlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IGJsaW5kbHkgdXNlIGNsaWVudCBzcGVjaWZpZWQgaW5wdXQgc2l6ZSBpZiBzcGVjaWZpZWQgYXMgY2xpZW50cwpAQCAtMTAxMiwxMyArMTI4NywxNCBAQAogICAgICAgICBpbnQzMl90IGNsaWVudFByZXBlbmQ7CiAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykKICAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQotICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMsICZjbGllbnRQcmVwZW5kKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKEtFWV9QUkVQRU5EX0hFQURFUl9UT19TWU5DX0ZSQU1FUywgJmNsaWVudFByZXBlbmQpCiAgICAgICAgICAgICAgICAgJiYgY2xpZW50UHJlcGVuZAogICAgICAgICAgICAgICAgICYmICghcHJlcGVuZCB8fCBwcmVwZW5kLnZhbHVlICE9IFBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUyIpOworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBjb21wb25lbnRDb2xvckZvcm1hdCA9IDA7CiAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSBIRFIgc3RhdGljIGluZm8gdG8gb3V0cHV0IGZvcm1hdCBmb3IgYm90aCBlbmNvZGVycyBhbmQgZGVjb2RlcnMKICAgICAgICAgICAgIC8vIGlmIGNvbXBvbmVudCBzdXBwb3J0cyB0aGlzIGluZm8sIHdlIHdpbGwgdXBkYXRlIGZyb20gY29tcG9uZW50LCBidXQgb25seSB0aGUgcmF3IHBvcnQsCkBAIC0xMDMxLDEyICsxMzA3LDE2IEBACiAKICAgICAgICAgICAgIC8vIFNldCBkZXNpcmVkIGNvbG9yIGZvcm1hdCBmcm9tIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCiAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdDsKLSAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgJmZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBkZWZhdWx0Q29sb3JGb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmY29tcG9uZW50Q29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgY29tcG9uZW50Q29sb3JGb3JtYXQpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEwNjQsOCArMTM0NCw4NiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIGFuZCBvdXRwdXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29sb3JUcmFuc2ZlclJlcXVlc3RQYXJhbTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgICAgICBpZiAocGFyYW0tPmluZGV4KCkgPT0gY29sb3JBc3BlY3RzUmVxdWVzdEluZGV4LndpdGhTdHJlYW0oMHUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGNvbG9yIHRyYW5zZmVyIHJlcXVlc3QgcGFyYW0iKTsKKyAgICAgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdFBhcmFtID0gc3RkOjptb3ZlKHBhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXJSZXF1ZXN0ID0gMDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykKKyAgICAgICAgICAgICAgICAmJiAhc2RrUGFyYW1zLT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyLXJlcXVlc3QiLCAmY29sb3JUcmFuc2ZlclJlcXVlc3QpKSB7CisgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29sb3JUcmFuc2ZlclJlcXVlc3QgIT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0gJiYgKmNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0pIHsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCAqaW5mbyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yVHJhbnNmZXJSZXF1ZXN0UGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChpbmZvLT50cmFuc2ZlciwgJmNvbG9yVHJhbnNmZXJSZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb2xvclRyYW5zZmVyUmVxdWVzdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoImNvbG9yLXRyYW5zZmVyLXJlcXVlc3QiLCBjb2xvclRyYW5zZmVyUmVxdWVzdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcG9uZW50Q29sb3JGb3JtYXQgIT0gMCAmJiBjb21wb25lbnRDb2xvckZvcm1hdCAhPSBDT0xPUl9Gb3JtYXRTdXJmYWNlKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIGdldCBzdHJpZGUvdnN0cmlkZQorICAgICAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBQSVhFTF9GT1JNQVRfVU5LTk9XTjsKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRGcmFtZXdvcmtUb0NvZGVjKGNvbXBvbmVudENvbG9yRm9ybWF0LCAmcGl4ZWxGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0cmlldmUgdGhlc2UgdmFsdWVzIHdpdGhvdXQgYWxsb2NhdGluZyBhIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyAgICAgICBDdXJyZW50bHkgYWxsb2NhdGluZyBhIGJ1ZmZlciBpcyBuZWNlc3NhcnkgdG8gcmV0cmlldmUgdGhlIGxheW91dC4KKyAgICAgICAgICAgICAgICBpbnQ2NF90IGJsb2NrVXNhZ2UgPQorICAgICAgICAgICAgICAgICAgICB1c2FnZS52YWx1ZSB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBGZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCBibG9ja1VzYWdlLCB7Y29tcC0+Z2V0TmFtZSgpfSk7CisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oc2l6ZV90IHNpemUpIC0+IHNwPEFCdWZmZXI+IHsgcmV0dXJuIG5ldyBBQnVmZmVyKHNpemUpOyB9KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGFsbG9jYXRlIGEgZ3JhcGhpYyBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIih3aWR0aD0lZCBoZWlnaHQ9JWQgcGl4ZWxGb3JtYXQ9JXUgdXNhZ2U9JWxseCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCAobG9uZyBsb25nKWJsb2NrVXNhZ2UpOworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgYnl0ZSBidWZmZXIgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBhbnl3YXkuIFNraXAgc2V0dGluZyBzdHJpZGUvdnN0cmlkZSB0byBpbnB1dCBmb3JtYXQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhID0gYnVmZmVyLT5nZXRJbWFnZURhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFJbWFnZTIgKmltZyA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbWFnZURhdGEgJiYgaW1hZ2VEYXRhLT5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbWFnZURhdGEtPnNpemUoKSA+PSBzaXplb2YoTWVkaWFJbWFnZTIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWcgPSAoTWVkaWFJbWFnZTIqKWltYWdlRGF0YS0+ZGF0YSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpbWcgJiYgaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldERlbHRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIChpbnQ2NF90KWltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldERlbHRhICUgc3RyaWRlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2c3RyaWRlID0gaW50MzJfdChvZmZzZXREZWx0YSAvIHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ2Fubm90IHJlcG9ydCBhY2N1cmF0ZSBzbGljZSBoZWlnaHQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0RGVsdGEgPSAlbGxkIHN0cmlkZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW9mZnNldERlbHRhLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIG91dHB1dDogJXMiLAogICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH07CkBAIC0xMDc2LDYgKzE0MzQsOCBAQAogICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOwogCisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKICAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50Q29uZmlndXJlZChjb25maWctPm1JbnB1dEZvcm1hdCwgY29uZmlnLT5tT3V0cHV0Rm9ybWF0KTsKIH0KIApAQCAtMTE0NCwxMyArMTUwNCwxMSBAQAogICAgIHN0YXR1c190IGVycjsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKIAotICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OwogICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICB7CiAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKLSAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKICAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OwogICAgICAgICB1c2FnZSA9IGNvbmZpZy0+bUlTQ29uZmlnID8gY29uZmlnLT5tSVNDb25maWctPm1Vc2FnZSA6IDA7CiAgICAgfQpAQCAtMTE4Niw2ICsxNTQ0LDE0IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICAvLyBGb3JtYXRzIGNhbiBjaGFuZ2UgYWZ0ZXIgc2V0dXBJbnB1dFN1cmZhY2UKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CiAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0ZWQoCiAgICAgICAgICAgICBpbnB1dEZvcm1hdCwKICAgICAgICAgICAgIG91dHB1dEZvcm1hdCwKQEAgLTEyMDAsMTUgKzE1NjYsMzYgQEAKICAgICAvLyB3ZSBhcmUgbm93IHVzaW5nIHN1cmZhY2UgLSBhcHBseSBkZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gaW5wdXQgZm9ybWF0IC0gYXMgd2VsbCBhcwogICAgIC8vIGdldCBkYXRhc3BhY2UKICAgICBib29sIGlucHV0Rm9ybWF0Q2hhbmdlZCA9IGNvbmZpZy0+dXBkYXRlRm9ybWF0cyhDb25maWc6OklTX0lOUFVUKTsKLSAgICBBTE9HRCgiaW5wdXQgZm9ybWF0ICVzIHRvICVzIiwKLSAgICAgICAgICAgIGlucHV0Rm9ybWF0Q2hhbmdlZCA/ICJjaGFuZ2VkIiA6ICJ1bmNoYW5nZWQiLAotICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyBjb25maWd1cmUgZGF0YXNwYWNlCiAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50MzJfdCkgPT0gc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSwgImRhdGFzcGFjZSBzaXplIG1pc21hdGNoIik7Ci0gICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwotICAgICh2b2lkKWNvbmZpZy0+bUlucHV0Rm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YVNwYWNlKTsKKworICAgIC8vIFRoZSBvdXRwdXQgZm9ybWF0IGNvbnRhaW5zIGFwcC1jb25maWd1cmVkIGNvbG9yIGFzcGVjdHMsIGFuZCB0aGUgaW5wdXQgZm9ybWF0CisgICAgLy8gaGFzIHRoZSBkZWZhdWx0IGNvbG9yIGFzcGVjdHMuIFVzZSB0aGUgZGVmYXVsdCBmb3IgdGhlIHVuc3BlY2lmaWVkIHBhcmFtcy4KKyAgICBDb2xvckFzcGVjdHMgaW5wdXRDb2xvckFzcGVjdHMsIGNvbG9yQXNwZWN0czsKKyAgICBnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGNvbmZpZy0+bU91dHB1dEZvcm1hdCwgY29sb3JBc3BlY3RzKTsKKyAgICBnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGNvbmZpZy0+bUlucHV0Rm9ybWF0LCBpbnB1dENvbG9yQXNwZWN0cyk7CisgICAgaWYgKGNvbG9yQXNwZWN0cy5tUmFuZ2UgPT0gQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKSB7CisgICAgICAgIGNvbG9yQXNwZWN0cy5tUmFuZ2UgPSBpbnB1dENvbG9yQXNwZWN0cy5tUmFuZ2U7CisgICAgfQorICAgIGlmIChjb2xvckFzcGVjdHMubVByaW1hcmllcyA9PSBDb2xvckFzcGVjdHM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKSB7CisgICAgICAgIGNvbG9yQXNwZWN0cy5tUHJpbWFyaWVzID0gaW5wdXRDb2xvckFzcGVjdHMubVByaW1hcmllczsKKyAgICB9CisgICAgaWYgKGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIgPT0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkKSB7CisgICAgICAgIGNvbG9yQXNwZWN0cy5tVHJhbnNmZXIgPSBpbnB1dENvbG9yQXNwZWN0cy5tVHJhbnNmZXI7CisgICAgfQorICAgIGlmIChjb2xvckFzcGVjdHMubU1hdHJpeENvZWZmcyA9PSBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkKSB7CisgICAgICAgIGNvbG9yQXNwZWN0cy5tTWF0cml4Q29lZmZzID0gaW5wdXRDb2xvckFzcGVjdHMubU1hdHJpeENvZWZmczsKKyAgICB9CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gZ2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKAorICAgICAgICAgICAgY29sb3JBc3BlY3RzLCAvKiBtYXlFeHRlbmQgPSAqLyBmYWxzZSk7CiAgICAgc3VyZmFjZS0+c2V0RGF0YVNwYWNlKGRhdGFTcGFjZSk7CisgICAgc2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChjb2xvckFzcGVjdHMsIGNvbmZpZy0+bUlucHV0Rm9ybWF0LCAvKiBmb3JjZSA9ICovIHRydWUpOworICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgaW50MzJfdChkYXRhU3BhY2UpKTsKKworICAgIEFMT0dEKCJpbnB1dCBmb3JtYXQgJXMgdG8gJXMiLAorICAgICAgICAgICAgaW5wdXRGb3JtYXRDaGFuZ2VkID8gImNoYW5nZWQiIDogInVuY2hhbmdlZCIsCisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIHN0YXR1c190IGVyciA9IG1DaGFubmVsLT5zZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTIzNSwxMyArMTYyMiwxMSBAQAogfQogCiB2b2lkIENDb2RlYzo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgewotICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OwogICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICB7CiAgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOwogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKLSAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKICAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OwogICAgICAgICB1c2FnZSA9IGNvbmZpZy0+bUlTQ29uZmlnID8gY29uZmlnLT5tSVNDb25maWctPm1Vc2FnZSA6IDA7CiAgICAgfQpAQCAtMTI3Myw2ICsxNjU4LDE0IEBACiAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChVTktOT1dOX0VSUk9SKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICAvLyBGb3JtYXRzIGNhbiBjaGFuZ2UgYWZ0ZXIgc2V0dXBJbnB1dFN1cmZhY2UKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICB9CiAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUFjY2VwdGVkKGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOwogfQogCkBAIC0xMzI0LDYgKzE3MTcsNyBAQAogICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQtPmR1cCgpOwogICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICBlcnIyID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5zdGFydCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlRGF0YXNwYWNlID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5nZXREYXRhc3BhY2UoKTsKICAgICAgICAgfQogICAgICAgICBidWZmZXJzQm91bmRUb0NvZGVjID0gY29uZmlnLT5tQnVmZmVyc0JvdW5kVG9Db2RlYzsKICAgICB9CkBAIC0xMzMxLDggKzE3MjUsNiBAQAogICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIC8vIFdlJ3JlIG5vdCBzdGFydGluZyBhZnRlciBmbHVzaC4KLSAgICAodm9pZCltU2VudENvbmZpZ0FmdGVyUmVzdW1lLnRlc3RfYW5kX3NldCgpOwogICAgIGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCwgYnVmZmVyc0JvdW5kVG9Db2RlYyk7CiAgICAgaWYgKGVycjIgIT0gT0spIHsKICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKQEAgLTE0MTMsNiArMTgwNSw3IEBACiAgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZURhdGFzcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KICAgICB7CkBAIC0xNDYyLDYgKzE4NTUsNyBAQAogICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2VEYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0OTksNiArMTg5MywyMSBAQAogfQogCiBzdGF0dXNfdCBDQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgaWYgKGNvbmZpZy0+bVR1bm5lbGVkICYmIGNvbmZpZy0+bVNpZGViYW5kSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cgKj4oc3VyZmFjZS5nZXQoKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zaWRlYmFuZF9zdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oY29uZmlnLT5tU2lkZWJhbmRIYW5kbGUtPmhhbmRsZSgpKSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5hdGl2ZVdpbmRvdyglcCkgbmF0aXZlX3dpbmRvd19zZXRfc2lkZWJhbmRfc3RyZWFtKCVwKSBmYWlsZWQhIChlcnIgJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVXaW5kb3cuZ2V0KCksIGNvbmZpZy0+bVNpZGViYW5kSGFuZGxlLT5oYW5kbGUoKSwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBtQ2hhbm5lbC0+c2V0U3VyZmFjZShzdXJmYWNlKTsKIH0KIApAQCAtMTU4MCwxMSArMTk4OSwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbVNlbnRDb25maWdBZnRlclJlc3VtZS5jbGVhcigpOwogICAgIHsKICAgICAgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CiAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OwogICAgICAgICBjb25maWctPnF1ZXJ5Q29uZmlndXJhdGlvbihjb21wKTsKKyAgICAgICAgUmV2ZXJ0T3V0cHV0Rm9ybWF0SWZOZWVkZWQob3V0cHV0Rm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOwogICAgIH0KIAogICAgICh2b2lkKW1DaGFubmVsLT5zdGFydChudWxscHRyLCBudWxscHRyLCBbJl17CkBAIC0xNjMwLDYgKzIwNDAsMTIgQEAKICAgICAgICAgcGFyYW1zLT5yZW1vdmVFbnRyeUF0KHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKEtFWV9CSVRfUkFURSkpOwogICAgIH0KIAorICAgIGludDMyX3Qgc3luY0lkID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImF1ZGlvLWh3LXN5bmMiLCAmc3luY0lkKQorICAgICAgICAgICAgfHwgcGFyYW1zLT5maW5kSW50MzIoImh3LWF2LXN5bmMtaWQiLCAmc3luY0lkKSkgeworICAgICAgICBjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soY29tcCwgbnVsbHB0ciwgcGFyYW1zKTsKKyAgICB9CisKICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKIApAQCAtMTY3Miw3ICsyMDg4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgY29tcC0+Z2V0TmFtZSgpLmZpbmQoImMyLmFuZHJvaWQuIikgPT0gMCkpIHsKICAgICAgICAgbUNoYW5uZWwtPnNldFBhcmFtZXRlcnMoY29uZmlnVXBkYXRlKTsKICAgICB9IGVsc2UgeworICAgICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OwogICAgICAgICAodm9pZCljb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgY29uZmlnVXBkYXRlLCBDMl9NQVlfQkxPQ0spOworICAgICAgICBSZXZlcnRPdXRwdXRGb3JtYXRJZk5lZWRlZChvdXRwdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7CiAgICAgfQogfQogCkBAIC0xNjk5LDYgKzIxMTcsMzkgQEAKICAgICBjb25maWctPnNldFBhcmFtZXRlcnMoY29tcCwgcGFyYW1zLCBDMl9NQVlfQkxPQ0spOwogfQogCitzdGF0dXNfdCBDQ29kZWM6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgTXV0ZXhlZDxzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPj46OkxvY2tlZCBjb25maWdMb2NrZWQobUNvbmZpZyk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENvbmZpZz4gJmNvbmZpZyA9ICpjb25maWdMb2NrZWQ7CisgICAgcmV0dXJuIGNvbmZpZy0+cXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKG5hbWVzKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjpkZXNjcmliZVBhcmFtZXRlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYykgeworICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOworICAgIHJldHVybiBjb25maWctPmRlc2NyaWJlKG5hbWUsIGRlc2MpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnN1YnNjcmliZVRvUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gbVN0YXRlLmxvY2soKS0+Y29tcDsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICByZXR1cm4gY29uZmlnLT5zdWJzY3JpYmVUb1ZlbmRvckNvbmZpZ1VwZGF0ZShjb21wLCBuYW1lcyk7Cit9CisKK3N0YXR1c190IENDb2RlYzo6dW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0gbVN0YXRlLmxvY2soKS0+Y29tcDsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICByZXR1cm4gY29uZmlnLT51bnN1YnNjcmliZUZyb21WZW5kb3JDb25maWdVcGRhdGUoY29tcCwgbmFtZXMpOworfQorCiB2b2lkIENDb2RlYzo6b25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKICAgICBpZiAoIXdvcmtJdGVtcy5lbXB0eSgpKSB7CiAgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CkBAIC0xNzk1LDc4ICsyMjQ2LDk3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGhhbmRsZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgaW4gd29yayBkb25lCi0gICAgICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+ICZjb25maWcgPSAqY29uZmlnTG9ja2VkOwotICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gIW1TZW50Q29uZmlnQWZ0ZXJSZXN1bWUudGVzdF9hbmRfc2V0KCk7Ci0gICAgICAgICAgICBDb25maWc6OldhdGNoZXI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGEgPQotICAgICAgICAgICAgICAgIGNvbmZpZy0+d2F0Y2g8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4oKTsKLSAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAmJiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBDMkZyYW1lRGF0YTo6RkxBR19ESVNDQVJEX0ZSQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGE7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+Pjo6TG9ja2VkIGNvbmZpZ0xvY2tlZChtQ29uZmlnKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgICAgICAgICBDb25maWc6OldhdGNoZXI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gaW5pdERhdGFXYXRjaGVyID0KKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT53YXRjaDxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PigpOworICAgICAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEMyRnJhbWVEYXRhOjpGTEFHX0RJU0NBUkRfRlJBTUUpID09IDApIHsKIAotICAgICAgICAgICAgICAgIC8vIGNvcHkgYnVmZmVyIGluZm8gdG8gY29uZmlnCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzOwotICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbQotICAgICAgICAgICAgICAgICAgICAgICAgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHN0cmVhbSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmLT5pbmZvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgYWxsIGluZm8gaW50byBvdXRwdXQtc3RyZWFtICMwIGRvbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weUFzU3RyZWFtKCppbmZvLCB0cnVlIC8qIG91dHB1dCAqLywgc3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgYnVmZmVyIGluZm8gdG8gY29uZmlnCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgOiBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJnb3Qgb3V0cHV0IGJ1ZmZlciB3aXRoIGNyb3AgJXUsJXUrJXUsJXUgYW5kIHNpemUgJXUsJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmb3V0cHV0QnVmZmVycyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiBvdXRwdXRCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogYnVmLT5pbmZvKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFsbCBpbmZvIGludG8gb3V0cHV0LXN0cmVhbSAjMCBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHlBc1N0cmVhbSgqaW5mbywgdHJ1ZSAvKiBvdXRwdXQgKi8sIHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IG9ubHkgZG8gdGhlIGZpcnN0IGJsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1YoImdvdCBvdXRwdXQgYnVmZmVyIHdpdGggY3JvcCAldSwldSsldSwldSBhbmQgc2l6ZSAldSwldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkubGVmdCwgYmxvY2suY3JvcCgpLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKLSAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT51cGRhdGVDb25maWd1cmF0aW9uKHVwZGF0ZXMsIGNvbmZpZy0+bU91dHB1dERvbWFpbikpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgICAgICAgICAgICAgICAgICBjb25maWctPnVwZGF0ZUNvbmZpZ3VyYXRpb24odXBkYXRlcywgY29uZmlnLT5tT3V0cHV0RG9tYWluKTsKKyAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0T3V0cHV0Rm9ybWF0SWZOZWVkZWQob2xkRm9ybWF0LCBjb25maWctPm1PdXRwdXRGb3JtYXQpOwogCi0gICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQotICAgICAgICAgICAgICAgIC8vIG1heSBvdmVyd3JpdGUgdGhlIGFjdHVhbCBpbnRlcm1lZGlhdGUgdmFsdWUgd2l0aCBhIGZpbmFsIHZhbHVlKQotICAgICAgICAgICAgICAgIHN0cmVhbSA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBzdGRHZnhJbmZvcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAotICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWYgOiB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IHN0ZEdmeEluZm9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYtPmhhc0luZm8oaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnBhcmFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoaXgud2l0aFN0cmVhbShzdHJlYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gaW5mbyhDMlBhcmFtOjpDb3B5KCpwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5zZXRJbmZvKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkluZm8+KGluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29weSBzdGFuZGFyZCBpbmZvcyB0byBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IGFscmVhZHkgcHJlc2VudCAob3RoZXJ3aXNlLCB3ZQorICAgICAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEMyUGFyYW06OkluZGV4IHN0ZEdmeEluZm9zW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmIDogb3V0cHV0QnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFidWYtPmhhc0luZm8oaXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICpwYXJhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGluZm8oQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgewotICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5pdERhdGFXYXRjaGVyLmhhc0NoYW5nZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbml0RGF0YSA9IGluaXREYXRhV2F0Y2hlci51cGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgQW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEtPm0udmFsdWUsIGluaXREYXRhLT5mbGV4Q291bnQoKSwgY29uZmlnLT5tQ29kaW5nTWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DaGFubmVsLT5vbldvcmtEb25lKAotICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUod29yayksIGNoYW5nZWQgPyBjb25maWctPm1PdXRwdXRGb3JtYXQtPmR1cCgpIDogbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEuaGFzQ2hhbmdlZCgpID8gaW5pdERhdGEudXBkYXRlKCkuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBvdXRwdXRGb3JtYXQsIGluaXREYXRhID8gaW5pdERhdGEuZ2V0KCkgOiBudWxscHRyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRXYXRjaDogewpAQCAtMTg5MCw2ICsyMzYwLDU1IEBACiAgICAgZGVhZGxpbmUtPnNldChub3cgKyAodGltZW91dCAqIG11bHQpLCBuYW1lKTsKIH0KIAorc3RhdHVzX3QgQ0NvZGVjOjpjb25maWd1cmVUdW5uZWxlZFZpZGVvUGxheWJhY2soCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCwKKyAgICAgICAgc3A8TmF0aXZlSGFuZGxlPiAqc2lkZWJhbmRIYW5kbGUsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6b3V0cHV0PiB0dW5uZWxlZFBsYXliYWNrID0KKyAgICAgICAgQzJQb3J0VHVubmVsZWRNb2RlVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6U3RydWN0OjpTSURFQkFORCwKKyAgICAgICAgICAgIEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6U3RydWN0OjpSRUFMVElNRSwKKyAgICAgICAgICAgIDApOworICAgIC8vIFRPRE86IHVzZSBLRVlfQVVESU9fSFdfU1lOQywgS0VZX0hBUkRXQVJFX0FWX1NZTkNfSUQgd2hlbiB0aGV5IGFyZSBpbiBNZWRpYUNvZGVjQ29uc3RhbnRzLmgKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImF1ZGlvLWh3LXN5bmMiLCAmdHVubmVsZWRQbGF5YmFjay0+bS5zeW5jSWRbMF0pKSB7CisgICAgICAgIHR1bm5lbGVkUGxheWJhY2stPm0uc3luY1R5cGUgPSBDMlBvcnRUdW5uZWxlZE1vZGVUdW5pbmc6OlN0cnVjdDo6c3luY190eXBlX3Q6OkFVRElPX0hXX1NZTkM7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigiaHctYXYtc3luYy1pZCIsICZ0dW5uZWxlZFBsYXliYWNrLT5tLnN5bmNJZFswXSkpIHsKKyAgICAgICAgdHVubmVsZWRQbGF5YmFjay0+bS5zeW5jVHlwZSA9IEMyUG9ydFR1bm5lbGVkTW9kZVR1bmluZzo6U3RydWN0OjpzeW5jX3R5cGVfdDo6SFdfQVZfU1lOQzsKKyAgICB9IGVsc2UgeworICAgICAgICB0dW5uZWxlZFBsYXliYWNrLT5tLnN5bmNUeXBlID0gQzJQb3J0VHVubmVsZWRNb2RlVHVuaW5nOjpTdHJ1Y3Q6OnN5bmNfdHlwZV90OjpSRUFMVElNRTsKKyAgICAgICAgdHVubmVsZWRQbGF5YmFjay0+c2V0RmxleENvdW50KDApOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXAtPmNvbmZpZyh7IHR1bm5lbGVkUGxheWJhY2suZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChjMmVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoc2lkZWJhbmRIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgYzJlcnIgPSBjb21wLT5xdWVyeSh7fSwge0MyUG9ydFR1bm5lbEhhbmRsZVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFfSwgQzJfRE9OVF9CTE9DSywgJnBhcmFtcyk7CisgICAgaWYgKGMyZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgQzJQb3J0VHVubmVsSGFuZGxlVHVuaW5nOjpvdXRwdXQgKnZpZGVvVHVubmVsU2lkZWJhbmQgPQorICAgICAgICAgICAgQzJQb3J0VHVubmVsSGFuZGxlVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgLy8gQ3VycmVudGx5LCBDb2RlYzIgb25seSBzdXBwb3J0cyBub24tZmQgY2FzZSBmb3Igc2lkZWJhbmQgbmF0aXZlX2hhbmRsZS4KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCB2aWRlb1R1bm5lbFNpZGViYW5kLT5mbGV4Q291bnQoKSk7CisgICAgICAgICpzaWRlYmFuZEhhbmRsZSA9IE5hdGl2ZUhhbmRsZTo6Y3JlYXRlKGhhbmRsZSwgdHJ1ZSAvKiBvd25zSGFuZGxlICovKTsKKyAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyICYmIHZpZGVvVHVubmVsU2lkZWJhbmQtPmZsZXhDb3VudCgpKSB7CisgICAgICAgICAgICBtZW1jcHkoaGFuZGxlLT5kYXRhLCB2aWRlb1R1bm5lbFNpZGViYW5kLT5tLnZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDMyX3QpICogdmlkZW9UdW5uZWxTaWRlYmFuZC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKwogdm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICBib29sIHBlbmRpbmdEZWFkbGluZSA9IGZhbHNlOwpAQCAtMTkwMiw3ICsyNDIxLDQ0IEBACiAgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICBib29sIHR1bm5lbGVkID0gZmFsc2U7CisgICAgYm9vbCBpc01lZGlhVHlwZUtub3duID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtLbm93bk1lZGlhVHlwZXN7CisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19WUDgsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19WUDksCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19BVjEsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19BVkMsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fTVBFRzQsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19IMjYzLAorICAgICAgICAgICAgTUlNRVRZUEVfVklERU9fTVBFRzIsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19SQVcsCisgICAgICAgICAgICBNSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX0FNUl9OQiwKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX0FNUl9XQiwKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX01QRUcsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19BQUMsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19RQ0VMUCwKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgIE1JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19HNzExX0FMQVcsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19HNzExX01MQVcsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19SQVcsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19GTEFDLAorICAgICAgICAgICAgTUlNRVRZUEVfQVVESU9fTVNHU00sCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19BQzMsCisgICAgICAgICAgICBNSU1FVFlQRV9BVURJT19FQUMzLAorCisgICAgICAgICAgICBNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgICAgIH07CisgICAgICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENvbmZpZz4+OjpMb2NrZWQgY29uZmlnTG9ja2VkKG1Db25maWcpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiAmY29uZmlnID0gKmNvbmZpZ0xvY2tlZDsKKyAgICAgICAgdHVubmVsZWQgPSBjb25maWctPm1UdW5uZWxlZDsKKyAgICAgICAgaXNNZWRpYVR5cGVLbm93biA9IChrS25vd25NZWRpYVR5cGVzLmNvdW50KGNvbmZpZy0+bUNvZGluZ01lZGlhVHlwZSkgIT0gMCk7CisgICAgfQorICAgIGlmICghdHVubmVsZWQgJiYgaXNNZWRpYVR5cGVLbm93biAmJiBuYW1lLmVtcHR5KCkpIHsKICAgICAgICAgY29uc3RleHByIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGtXb3JrRHVyYXRpb25UaHJlc2hvbGQgPSAzczsKICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG1DaGFubmVsLT5lbGFwc2VkKCk7CiAgICAgICAgIGlmIChlbGFwc2VkID49IGtXb3JrRHVyYXRpb25UaHJlc2hvbGQpIHsKQEAgLTE5MjIsNyArMjQ3OCwxOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQUxPR1coInByZXZpb3VzIGNhbGwgdG8gJXMgZXhjZWVkZWQgdGltZW91dCIsIG5hbWUuY19zdHIoKSk7CisgICAgQzJTdHJpbmcgY29tcE5hbWU7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmICghc3RhdGUtPmNvbXApIHsKKyAgICAgICAgICAgIEFMT0dEKCJwcmV2aW91cyBjYWxsIHRvICVzIGV4Y2VlZGVkIHRpbWVvdXQgIgorICAgICAgICAgICAgICAgICAgImFuZCB0aGUgY29tcG9uZW50IGlzIGFscmVhZHkgcmVsZWFzZWQiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXBOYW1lID0gc3RhdGUtPmNvbXAtPmdldE5hbWUoKTsKKyAgICB9CisgICAgQUxPR1coIlslc10gcHJldmlvdXMgY2FsbCB0byAlcyBleGNlZWRlZCB0aW1lb3V0IiwgY29tcE5hbWUuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKwogICAgIGluaXRpYXRlUmVsZWFzZShmYWxzZSk7CiAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKIH0KQEAgLTE5OTQsNyArMjU2MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocGFyYW0tPnR5cGUoKSA9PSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSkgewogICAgICAgICAgICAgICAgIG1JbnB1dEFsbG9jYXRvcnMucmVzZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dDo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbUluaXRTdGF0dXMgPSBPSzsKQEAgLTIxNDQsNyArMjcxMSwxMSBAQAogICAgICAgICAgICAgKm1heFVzYWdlID0gMDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgICptaW5Vc2FnZSB8PSBzdXBwb3J0ZWQudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgaWYgKHN1cHBvcnRlZC52YWx1ZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgKm1pblVzYWdlIHw9IHN1cHBvcnRlZC52YWx1ZXNbMV0udTY0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm1pblVzYWdlIHw9IHN1cHBvcnRlZC52YWx1ZXNbMF0udTY0OworICAgICAgICB9CiAgICAgICAgIGludDY0X3QgY3VycmVudE1heFVzYWdlID0gMDsKICAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJmZsYWdzIDogc3VwcG9ydGVkLnZhbHVlcykgewogICAgICAgICAgICAgY3VycmVudE1heFVzYWdlIHw9IGZsYWdzLnU2NDsKQEAgLTIxNjgsMTUgKzI3MzksMTcgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgIH0KLSAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IHVzYWdlLmV4cGVjdGVkOwotICAgIHVpbnQ2NF90IG1heFVzYWdlID0gfjB1bGw7CiAgICAgc3RkOjpzZXQ8QzJBbGxvY2F0b3I6OmlkX3Q+IGFsbG9jYXRvcnM7CiAgICAgR2V0Q29tbW9uQWxsb2NhdG9ySWRzKG5hbWVzLCBDMkFsbG9jYXRvcjo6TElORUFSLCAmYWxsb2NhdG9ycyk7CiAgICAgaWYgKGFsbG9jYXRvcnMuZW1wdHkoKSkgewogICAgICAgICAqaXNDb21wYXRpYmxlID0gZmFsc2U7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CisKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSB+MHVsbDsKICAgICBDYWxjdWxhdGVNaW5NYXhVc2FnZShuYW1lcywgJm1pblVzYWdlLCAmbWF4VXNhZ2UpOworICAgIG1pblVzYWdlIHw9IHVzYWdlLmV4cGVjdGVkOwogICAgICppc0NvbXBhdGlibGUgPSAoKG1heFVzYWdlICYgbWluVXNhZ2UpID09IG1pblVzYWdlKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0yMjAzLDE0ICsyNzc2LDE2IEBACiAvLyBzdGF0aWMKIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDQ29kZWM6OkZldGNoTGluZWFyQmxvY2soCiAgICAgICAgIHNpemVfdCBjYXBhY2l0eSwgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIHsKLSAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IHVzYWdlLmV4cGVjdGVkOwotICAgIHVpbnQ2NF90IG1heFVzYWdlID0gfjB1bGw7CiAgICAgc3RkOjpzZXQ8QzJBbGxvY2F0b3I6OmlkX3Q+IGFsbG9jYXRvcnM7CiAgICAgR2V0Q29tbW9uQWxsb2NhdG9ySWRzKG5hbWVzLCBDMkFsbG9jYXRvcjo6TElORUFSLCAmYWxsb2NhdG9ycyk7CiAgICAgaWYgKGFsbG9jYXRvcnMuZW1wdHkoKSkgewogICAgICAgICBhbGxvY2F0b3JzLmluc2VydChDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSKTsKICAgICB9CisKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSB+MHVsbDsKICAgICBDYWxjdWxhdGVNaW5NYXhVc2FnZShuYW1lcywgJm1pblVzYWdlLCAmbWF4VXNhZ2UpOworICAgIG1pblVzYWdlIHw9IHVzYWdlLmV4cGVjdGVkOwogICAgIGlmICgobWF4VXNhZ2UgJiBtaW5Vc2FnZSkgIT0gbWluVXNhZ2UpIHsKICAgICAgICAgYWxsb2NhdG9ycy5jbGVhcigpOwogICAgICAgICBhbGxvY2F0b3JzLmluc2VydChDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSKTsKQEAgLTIyOTEsNCArMjg2NiwzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCAwNjI2YzhkLi5lOWFkZmM5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgpAQCAtMTQzLDcgKzE0NCw4IEBACiAgICAgICBtRnJhbWVJbmRleCgwdSksCiAgICAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXgoMHUpLAogICAgICAgbU1ldGFNb2RlKE1PREVfTk9ORSksCi0gICAgICBtSW5wdXRNZXRFb3MoZmFsc2UpIHsKKyAgICAgIG1JbnB1dE1ldEVvcyhmYWxzZSksCisgICAgICBtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXIoZmFsc2UpIHsKICAgICBtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzID0ga1Ntb290aG5lc3NGYWN0b3IgKyBrUmVuZGVyaW5nRGVwdGg7CiAgICAgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CkBAIC0xNTksNiArMTYxLDEwIEBACiAgICAgICAgIG91dHB1dC0+b3V0cHV0RGVsYXkgPSAwdTsKICAgICAgICAgb3V0cHV0LT5udW1TbG90cyA9IGtTbW9vdGhuZXNzRmFjdG9yOwogICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisgICAgICAgIHBvb2xzLT5vdXRwdXRQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgIH0KIH0KIAogQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6fkNDb2RlY0J1ZmZlckNoYW5uZWwoKSB7CkBAIC0xODgsNyArMTk0LDEwIEBACiAgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIH0KIAotc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlckludGVybmFsKHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcikgeworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlckludGVybmFsKAorICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBlbmNyeXB0ZWRCbG9jaywKKyAgICAgICAgc2l6ZV90IGJsb2NrU2l6ZSkgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIApAQCAtMjAwLDYgKzIwOSw3IEBACiAgICAgaW50MzJfdCBmbGFncyA9IDA7CiAgICAgaW50MzJfdCB0bXAgPSAwOwogICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgYm9vbCB0dW5uZWxGaXJzdEZyYW1lID0gZmFsc2U7CiAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgewogICAgICAgICBlb3MgPSB0cnVlOwogICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOwpAQCAtMjA4LDcgKzIxOCwxMSBAQAogICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOwogICAgIH0KKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigidHVubmVsLWZpcnN0LWZyYW1lIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIHR1bm5lbEZpcnN0RnJhbWUgPSB0cnVlOworICAgIH0KICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOwogICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOwogICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CkBAIC0yMTgsOSArMjMyLDggQEAKICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lVXM7CiAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOwogCi0gICAgdWludDY0X3QgcXVldWVkRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IHF1ZXVlZEJ1ZmZlcnM7CiAgICAgc3A8Q29kZWMyQnVmZmVyPiBjb3B5OworICAgIGJvb2wgdXNlc0ZyYW1lUmVhc3NlbWJsZXIgPSBmYWxzZTsKIAogICAgIGlmIChidWZmZXItPnNpemUoKSA+IDB1KSB7CiAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKQEAgLTI0NSwzMCArMjU4LDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBzdGFydmF0aW9uIG9uIGNvbXBvbmVudC4iLCBtTmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOwotICAgICAgICBxdWV1ZWRCdWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7CisgICAgICAgIGlmIChpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlcikgeworICAgICAgICAgICAgdXNlc0ZyYW1lUmVhc3NlbWJsZXIgPSB0cnVlOworICAgICAgICAgICAgaW5wdXQtPmZyYW1lUmVhc3NlbWJsZXIucHJvY2VzcyhidWZmZXIsICZpdGVtcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IGN2byA9IDA7CisgICAgICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3ZvIiwgJmN2bykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uID0gY3ZvICUgMzYwOworICAgICAgICAgICAgICAgIC8vIGNoYW5nZSByb3RhdGlvbiB0byBjb3VudGVyLWNsb2NrIHdpc2UuCisgICAgICAgICAgICAgICAgcm90YXRpb24gPSAoKHJvdGF0aW9uIDw9IDApID8gMCA6IDM2MCkgLSByb3RhdGlvbjsKKworICAgICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnJvdGF0aW9uW2ZyYW1lSW5kZXhdID0gcm90YXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZW5jcnlwdGVkQmxvY2spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5lbXBsYWNlX2JhY2soQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEVuY3J5cHRlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZEJsb2NrLT5zaGFyZSgwLCBibG9ja1NpemUsIEMyRmVuY2UoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZW9zKSB7CiAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CiAgICAgfQotICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOwotICAgIC8vIFRPRE86IGZpbGwgaW5mbydzCisgICAgaWYgKHVzZXNGcmFtZVJlYXNzZW1ibGVyKSB7CisgICAgICAgIGlmICghaXRlbXMuZW1wdHkoKSkgeworICAgICAgICAgICAgaXRlbXMuZnJvbnQoKS0+aW5wdXQuY29uZmlnVXBkYXRlID0gc3RkOjptb3ZlKG1QYXJhbXNUb0JlU2V0KTsKKyAgICAgICAgICAgIG1GcmFtZUluZGV4ID0gKGl0ZW1zLmJhY2soKS0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ICsgMSkucGVlaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIC8vIFRPRE86IGZpbGwgaW5mbydzCiAKLSAgICB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOwotICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7Ci0gICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUgPSBzdGQ6Om1vdmUobVBhcmFtc1RvQmVTZXQpOworICAgICAgICBpZiAodHVubmVsRmlyc3RGcmFtZSkgeworICAgICAgICAgICAgQzJTdHJlYW1UdW5uZWxIb2xkUmVuZGVyOjppbnB1dCB0dW5uZWxIb2xkUmVuZGVyeworICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSAqLywKKyAgICAgICAgICAgICAgICBDMl9UUlVFIC8qIHZhbHVlICovCisgICAgICAgICAgICB9OworICAgICAgICAgICAgd29yay0+aW5wdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHR1bm5lbEhvbGRSZW5kZXIpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CiAKLSAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOwotICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOwotICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCi0gICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAotICAgICAgICAgICAgc3RkOjptb3ZlKHF1ZXVlZEJ1ZmZlcnMpLAotICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOwotICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7Ci0gICAgaWYgKGVyciAhPSBDMl9PSykgewotICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgZW9zID0gZW9zICYmIGJ1ZmZlci0+c2l6ZSgpID4gMHU7CiAgICAgfQotCi0gICAgaWYgKGVyciA9PSBDMl9PSyAmJiBlb3MgJiYgYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgIGlmIChlb3MpIHsKICAgICAgICAgd29yay5yZXNldChuZXcgQzJXb3JrKTsKICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CiAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CkBAIC0yNzcsMjMgKzMxNSwyOCBAQAogICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CiAgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKICAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOwotCi0gICAgICAgIHF1ZXVlZEZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKLSAgICAgICAgcXVldWVkQnVmZmVycy5jbGVhcigpOwotCi0gICAgICAgIGl0ZW1zLmNsZWFyKCk7CiAgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOwotCi0gICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCi0gICAgICAgICAgICAgICAgcXVldWVkRnJhbWVJbmRleCwKLSAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCi0gICAgICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOwotICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOwotICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7Ci0gICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKLSAgICAgICAgfQogICAgIH0KLSAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCFpdGVtcy5lbXB0eSgpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjp0aW1lX3BvaW50IG5vdyA9IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGl0ZW1zKSB7CisgICAgICAgICAgICAgICAgd2F0Y2hlci0+b25Xb3JrUXVldWVkKAorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcih3b3JrLT5pbnB1dC5idWZmZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogaXRlbXMpIHsKKyAgICAgICAgICAgIHdhdGNoZXItPm9uV29ya0RvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwogICAgICAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CiAgICAgICAgIGlmIChidWZmZXIpIHsKQEAgLTUxNCw2ICs1NTcsNDAgQEAKICAgICB9CiAgICAgc3A8RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI+IGVuY3J5cHRlZEJ1ZmZlcigoRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgKilidWZmZXIuZ2V0KCkpOwogCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHNpemVfdCBhbGxvY1NpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgYzJfc3RhdHVzX3QgYmxvY2tSZXMgPSBDMl9PSzsKKyAgICBib29sIGNvcGllZCA9IGZhbHNlOworICAgIGlmIChtU2VuZEVuY3J5cHRlZEluZm9CdWZmZXIpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEMyTWVtb3J5VXNhZ2Uga0RlZmF1bHRSZWFkV3JpdGVVc2FnZXsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgICAgICBjb25zdGV4cHIgaW50IGtBbGxvY0dyYW51bGUwID0gMTAyNCAqIDY0OworICAgICAgICBjb25zdGV4cHIgaW50IGtBbGxvY0dyYW51bGUxID0gMTAyNCAqIDEwMjQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbCA9IG1CbG9ja1Bvb2xzLmxvY2soKS0+aW5wdXRQb29sOworICAgICAgICAvLyByb3VuZCB1cCBlbmNyeXB0ZWQgc2l6ZXMgdG8gbGltaXQgZnJhZ21lbnRhdGlvbiBhbmQgZW5jb3VyYWdlIGJ1ZmZlciByZXVzZQorICAgICAgICBpZiAoYWxsb2NTaXplIDw9IGtBbGxvY0dyYW51bGUxKSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gYWxpZ24oYWxsb2NTaXplLCBrQWxsb2NHcmFudWxlMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gYWxpZ24oYWxsb2NTaXplLCBrQWxsb2NHcmFudWxlMSk7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tSZXMgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsIGtEZWZhdWx0UmVhZFdyaXRlVXNhZ2UsICZibG9jayk7CisKKyAgICAgICAgaWYgKGJsb2NrUmVzID09IEMyX09LKSB7CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSA9PSBDMl9PSyAmJiB2aWV3LnNpemUoKSA9PSBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgY29waWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmx5IGNvcHkgY2xlYXIgc2VjdGlvbnMKKyAgICAgICAgICAgICAgICBtZW1jcHkodmlldy5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBhbGxvY1NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb3BpZWQpIHsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisKICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOwogICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobnVtU3ViU2FtcGxlcyA9PSAxCkBAIC02MDUsNyArNjgyLDggQEAKICAgICB9CiAKICAgICBidWZmZXItPnNldFJhbmdlKGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0IC0gY29kZWNEYXRhT2Zmc2V0KTsKLSAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7CisKKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlciwgYmxvY2ssIGJ1ZmZlclNpemUpOwogfQogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCkgewpAQCAtNjE4LDI1ICs2OTYsMjYgQEAKIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCkgewotICAgIGlmIChtSW5wdXRNZXRFb3MgfHwgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgaWYgKG1JbnB1dE1ldEVvcykgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwogICAgICAgICBpZiAoIW91dHB1dC0+YnVmZmVycyB8fAogICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+aGFzUGVuZGluZygpIHx8Ci0gICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5udW1DbGllbnRCdWZmZXJzKCkgPj0gb3V0cHV0LT5udW1TbG90cykgeworICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+bnVtQWN0aXZlU2xvdHMoKSA+PSBvdXRwdXQtPm51bVNsb3RzKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUlucHV0U2xvdHM7ICsraSkgeworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cyA9IDA7CisgICAgd2hpbGUgKCFtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+cGlwZWxpbmVGdWxsKCkpIHsKICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gaW5CdWZmZXI7CiAgICAgICAgIHNpemVfdCBpbmRleDsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOwotICAgICAgICAgICAgaWYgKGlucHV0LT5idWZmZXJzLT5udW1DbGllbnRCdWZmZXJzKCkgPj0gaW5wdXQtPm51bVNsb3RzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgbnVtQWN0aXZlU2xvdHMgPSBpbnB1dC0+YnVmZmVycy0+bnVtQWN0aXZlU2xvdHMoKTsKKyAgICAgICAgICAgIGlmIChudW1BY3RpdmVTbG90cyA+PSBpbnB1dC0+bnVtU2xvdHMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmaW5CdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbmV3IGJ1ZmZlciBhdmFpbGFibGUiLCBtTmFtZSk7CkBAIC02NDYsNiArNzI1LDcgQEAKICAgICAgICAgQUxPR1YoIlslc10gbmV3IGlucHV0IGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIGluQnVmZmVyLmdldCgpKTsKICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBpbkJ1ZmZlcik7CiAgICAgfQorICAgIEFMT0dWKCJbJXNdICMgYWN0aXZlIHNsb3RzIGFmdGVyIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlID0gJXp1IiwgbU5hbWUsIG51bUFjdGl2ZVNsb3RzKTsKIH0KIAogc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVuZGVyT3V0cHV0QnVmZmVyKApAQCAtNjkzLDYgKzc3MywyMiBAQAogICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKICAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKICAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNhbm5vdCByZW5kZXIgYnVmZmVyIHdpdGhvdXQgc3VyZmFjZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImZyYW1lSW5kZXgiLCAmZnJhbWVJbmRleCk7CisgICAgICAgIGlmIChvdXRwdXQtPnJvdGF0aW9uLmNvdW50KGZyYW1lSW5kZXgpICE9IDApIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBvdXRwdXQtPnJvdGF0aW9uLmZpbmQoZnJhbWVJbmRleCk7CisgICAgICAgICAgICBxdWFydGVycyA9IChpdC0+c2Vjb25kIC8gOTApICYgMzsKKyAgICAgICAgICAgIG91dHB1dC0+cm90YXRpb24uZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorCiAgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKICAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CiAgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KQEAgLTczNiwxNCArODMyLDYgQEAKICAgICAgICAgaGRyMTBQbHVzSW5mby5yZXNldCgpOwogICAgIH0KIAotICAgIHsKLSAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7Ci0gICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0koIlslc10gY2Fubm90IHJlbmRlciBidWZmZXIgd2l0aG91dCBzdXJmYWNlIiwgbU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gYmxvY2tzID0gYzJCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCk7CiAgICAgaWYgKGJsb2Nrcy5zaXplKCkgIT0gMXUpIHsKICAgICAgICAgQUxPR0QoIlslc10gZXhwZWN0ZWQgMSBncmFwaGljIGJsb2NrLCBidXQgZ290ICV6dSIsIG1OYW1lLCBibG9ja3Muc2l6ZSgpKTsKQEAgLTgxNCw5ICs5MDIsMTcgQEAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQ29tcG9uZW50LT5xdWV1ZVRvT3V0cHV0U3VyZmFjZShibG9jaywgcWJpLCAmcWJvKTsKICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CiAgICAgICAgIEFMT0dJKCJbJXNdIHF1ZXVlQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19JTklUKSB7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAgIEFMT0dWKCJbJXNdIHF1ZXVlIGJ1ZmZlciBzdWNjZXNzZnVsIiwgbU5hbWUpOworCisgICAgaWYoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5mcHMiLCBmYWxzZSkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlslc10gcXVldWUgYnVmZmVyIHN1Y2Nlc3NmdWwiLCBtTmFtZSk7CisgICAgfQogCiAgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IDA7CiAgICAgKHZvaWQpYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKQEAgLTg3NywyNyArOTczLDMxIEBACiAgICAgICAgIGJvb2wgYnVmZmVyc0JvdW5kVG9Db2RlYykgewogICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0IGlTdHJlYW1Gb3JtYXQoMHUpOwogICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQ7CiAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOwogICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KDApOwogICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5KDApOworICAgIEMyU2VjdXJlTW9kZVR1bmluZyBzZWN1cmVNb2RlKEMyQ29uZmlnOjpTTV9VTlBST1RFQ1RFRCk7CiAKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSgKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAmaVN0cmVhbUZvcm1hdCwKICAgICAgICAgICAgICAgICAmb1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAma2luZCwKICAgICAgICAgICAgICAgICAmcmVvcmRlckRlcHRoLAogICAgICAgICAgICAgICAgICZyZW9yZGVyS2V5LAogICAgICAgICAgICAgICAgICZpbnB1dERlbGF5LAogICAgICAgICAgICAgICAgICZwaXBlbGluZURlbGF5LAogICAgICAgICAgICAgICAgICZvdXRwdXREZWxheSwKKyAgICAgICAgICAgICAgICAmc2VjdXJlTW9kZSwKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCiAgICAgICAgICAgICBudWxscHRyKTsKICAgICBpZiAoZXJyID09IEMyX0JBRF9JTkRFWCkgewotICAgICAgICBpZiAoIWlTdHJlYW1Gb3JtYXQgfHwgIW9TdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgaWYgKCFpU3RyZWFtRm9ybWF0IHx8ICFvU3RyZWFtRm9ybWF0IHx8ICFraW5kKSB7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZXJyICE9IEMyX09LKSB7CkBAIC05MTQsMTggKzEwMTQsMjYgQEAKICAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGlucHV0IGZvcm1hdAogICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKIAorICAgIC8vIHNlY3VyZSBtb2RlIGlzIGEgc3RhdGljIHBhcmFtZXRlciAoc2hhbGwgbm90IGNoYW5nZSBpbiB0aGUgZXhlY3V0aW5nIHN0YXRlKQorICAgIG1TZW5kRW5jcnlwdGVkSW5mb0J1ZmZlciA9IHNlY3VyZU1vZGUudmFsdWUgPT0gQzJDb25maWc6OlNNX1JFQURfUFJPVEVDVEVEX1dJVEhfRU5DUllQVEVEOworCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOwogICAgIGludCBwb29sTWFzayA9IEdldENvZGVjMlBvb2xNYXNrKCk7CiAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IHByZWZlcnJlZExpbmVhcklkID0gR2V0UHJlZmVycmVkTGluZWFyQWxsb2NhdG9ySWQocG9vbE1hc2spOwogCiAgICAgaWYgKGlucHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKICAgICAgICAgYm9vbCBncmFwaGljID0gKGlTdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgYm9vbCBhdWRpb0VuY29kZXIgPSAhZ3JhcGhpYyAmJiAoa2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKTsKICAgICAgICAgQzJDb25maWc6OmFwaV9mZWF0dXJlX3QgYXBpRmVhdHVyZXMgPSBDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdCgKICAgICAgICAgICAgICAgICBBUElfUkVGTEVDVElPTiB8CiAgICAgICAgICAgICAgICAgQVBJX1ZBTFVFUyB8CiAgICAgICAgICAgICAgICAgQVBJX0NVUlJFTlRfVkFMVUVTIHwKICAgICAgICAgICAgICAgICBBUElfREVQRU5ERU5DWSB8CiAgICAgICAgICAgICAgICAgQVBJX1NBTUVfSU5QVVRfQlVGRkVSKTsKKyAgICAgICAgQzJTdHJlYW1BdWRpb0ZyYW1lU2l6ZUluZm86OmlucHV0IGVuY29kZXJGcmFtZVNpemUoMHUpOworICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCBzYW1wbGVSYXRlKDB1KTsKKyAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCBjaGFubmVsQ291bnQoMHUpOworICAgICAgICBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6aW5wdXQgcGNtRW5jb2RpbmcoMHUpOwogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CkBAIC05MzgsNyArMTA0NiwxOSBAQAogICAgICAgICAgICAgLy8gZnJvbSBjb21wb25lbnQsIGNyZWF0ZSB0aGUgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGdpdmVuIElELiBPdGhlcndpc2UsIHVzZSBkZWZhdWx0IElEcy4KICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOwogICAgICAgICAgICAgQzJBcGlGZWF0dXJlc1NldHRpbmcgZmVhdHVyZXNTZXR0aW5ne2FwaUZlYXR1cmVzfTsKLSAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJmZlYXR1cmVzU2V0dGluZyB9LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiBzdGFja1BhcmFtcyh7JmZlYXR1cmVzU2V0dGluZ30pOworICAgICAgICAgICAgaWYgKGF1ZGlvRW5jb2RlcikgeworICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zLnB1c2hfYmFjaygmZW5jb2RlckZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMucHVzaF9iYWNrKCZzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5wdXNoX2JhY2soJmNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXMucHVzaF9iYWNrKCZwY21FbmNvZGluZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuY29kZXJGcmFtZVNpemUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudC5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgcGNtRW5jb2RpbmcuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoc3RhY2tQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CkBAIC05OTYsMTAgKzExMTYsMjEgQEAKICAgICAgICAgaW5wdXQtPm51bVNsb3RzID0gbnVtSW5wdXRTbG90czsKICAgICAgICAgaW5wdXQtPmV4dHJhQnVmZmVycy5mbHVzaCgpOwogICAgICAgICBpbnB1dC0+bnVtRXh0cmFTbG90cyA9IDB1OworICAgICAgICBpZiAoYXVkaW9FbmNvZGVyICYmIGVuY29kZXJGcmFtZVNpemUgJiYgc2FtcGxlUmF0ZSAmJiBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIGlucHV0LT5mcmFtZVJlYXNzZW1ibGVyLmluaXQoCisgICAgICAgICAgICAgICAgICAgIHBvb2wsCisgICAgICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlckZyYW1lU2l6ZS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBwY21FbmNvZGluZyA/IHBjbUVuY29kaW5nLnZhbHVlIDogQzJDb25maWc6OlBDTV8xNik7CisgICAgICAgIH0KICAgICAgICAgYm9vbCBjb25mb3JtaW5nID0gKGFwaUZlYXR1cmVzICYgQVBJX1NBTUVfSU5QVVRfQlVGRkVSKTsKICAgICAgICAgLy8gRm9yIGVuY3J5cHRlZCBjb250ZW50LCBmcmFtZXdvcmsgZGVjcnlwdHMgc291cmNlIGJ1ZmZlciAoYXNobWVtKSBpbnRvCiAgICAgICAgIC8vIEMyQnVmZmVycy4gVGh1cyBub24tY29uZm9ybWluZyBjb2RlY3MgY2FuIHByb2Nlc3MgdGhlc2UuCi0gICAgICAgIGlmICghYnVmZmVyc0JvdW5kVG9Db2RlYyAmJiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpIHx8IGNvbmZvcm1pbmcpKSB7CisgICAgICAgIGlmICghYnVmZmVyc0JvdW5kVG9Db2RlYworICAgICAgICAgICAgICAgICYmICFpbnB1dC0+ZnJhbWVSZWFzc2VtYmxlcgorICAgICAgICAgICAgICAgICYmIChoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkgfHwgY29uZm9ybWluZykpIHsKICAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLnJlc2V0KG5ldyBTbG90SW5wdXRCdWZmZXJzKG1OYW1lKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZ3JhcGhpYykgewogICAgICAgICAgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKQEAgLTEwNTcsMTMgKzExODgsMTEgQEAKICAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0U3VyZmFjZTsKICAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgaW50IG1heERlcXVldWVDb3VudCA9IDA7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOwotICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG51bU91dHB1dFNsb3RzICsKKyAgICAgICAgICAgIG1heERlcXVldWVDb3VudCA9IG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBudW1PdXRwdXRTbG90cyArCiAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJEZXB0aC52YWx1ZSArIGtSZW5kZXJpbmdEZXB0aDsKLSAgICAgICAgICAgIGlmICghc2VjdXJlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyArPSBudW1JbnB1dFNsb3RzOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0cHV0U3VyZmFjZSA9IG91dHB1dC0+c3VyZmFjZSA/CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CkBAIC0xMDc0LDEwICsxMjAzLDEzIEBACiAKICAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkXzsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcHJldk91dHB1dFBvb2xJZDsKIAogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOwogCisgICAgICAgICAgICBwcmV2T3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKwogICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgogICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gKGdyYXBoaWMpID8gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwcmVmZXJyZWRMaW5lYXJJZDsKQEAgLTExNzEsNiArMTMwMywxNSBAQAogICAgICAgICAgICAgb3V0cHV0UG9vbElkXyA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAocHJldk91dHB1dFBvb2xJZCAhPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSCisgICAgICAgICAgICAgICAgJiYgcHJldk91dHB1dFBvb2xJZCAhPSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQykgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+ZGVzdHJveUJsb2NrUG9vbChwcmV2T3V0cHV0UG9vbElkKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGNsZWFuIHVwIHByZXZpb3VzIGJsb2NrIHBvb2wgJWxsdSAtICVzICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBwcmV2T3V0cHV0UG9vbElkLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOwogICAgICAgICBvdXRwdXQtPm91dHB1dERlbGF5ID0gb3V0cHV0RGVsYXlWYWx1ZTsKICAgICAgICAgb3V0cHV0LT5udW1TbG90cyA9IG51bU91dHB1dFNsb3RzOwpAQCAtMTE5OCw3ICsxMzM5LDE3IEBACiAgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWRfLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbWF4RGVxdWV1ZUNvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSBDUFUgcmVhZCBjb25zdW1lciB1c2FnZQorICAgICAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6b3V0cHV0IG91dHB1dFVzYWdlezB1LCBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRH07CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jb25maWcoeyAmb3V0cHV0VXNhZ2UgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgLy8gZG8gbm90IHByaW50IGVycm9yIG1lc3NhZ2UgZm9yIG5vdyBhcyBtb3N0IGNvbXBvbmVudHMgbWF5IG5vdCB5ZXQKKyAgICAgICAgICAgIC8vIHN1cHBvcnQgdGhpcyBzZXR0aW5nCisgICAgICAgICAgICBBTE9HRF9JRihlcnIgIT0gQzJfQkFEX0lOREVYLCAiWyVzXSBDb25maWd1cmVkIG91dHB1dCB1c2FnZSBbJSNsbHhdIiwKKyAgICAgICAgICAgICAgICAgIG1OYW1lLCAobG9uZyBsb25nKW91dHB1dFVzYWdlLnZhbHVlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CkBAIC0xMjM1LDcgKzEzODYsNyBAQAogICAgIC8vIGFib3V0IGJ1ZmZlcnMgZnJvbSB0aGUgcHJldmlvdXMgZ2VuZXJhdGlvbiBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlCiAgICAgLy8gbmV3bHkgaW5pdGlhbGl6ZWQgcGlwZWxpbmUgY2FwYWNpdHkuCiAKLSAgICB7CisgICAgaWYgKGlucHV0Rm9ybWF0IHx8IG91dHB1dEZvcm1hdCkgewogICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOwogICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKICAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCkBAIC0xMjk4LDU0ICsxNDQ5LDMwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGEuY2FwYWNpdHkgPCBiLmNhcGFjaXR5OwogICAgICAgICAgICAgfSk7CiAKLSAgICB7Ci0gICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHNwPEFCdWZmZXI+Pj46OkxvY2tlZCBjb25maWdzKG1GbHVzaGVkQ29uZmlncyk7Ci0gICAgICAgIGlmICghY29uZmlncy0+ZW1wdHkoKSkgewotICAgICAgICAgICAgd2hpbGUgKCFjb25maWdzLT5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY29uZmlnID0gY29uZmlncy0+ZnJvbnQoKTsKLSAgICAgICAgICAgICAgICBjb25maWdzLT5wb3BfZnJvbnQoKTsKLSAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCBpbnB1dCBidWZmZXIgdGhhdCBjYW4gZml0IHRoZSBjb25maWcuCi0gICAgICAgICAgICAgICAgYXV0byBpID0gc3RkOjpmaW5kX2lmKAotICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBbY2ZnU2l6ZSA9IGNvbmZpZy0+c2l6ZSgpXShjb25zdCBDbGllbnRJbnB1dEJ1ZmZlciYgYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmNhcGFjaXR5ID49IGNmZ1NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBjbGllbnRJbnB1dEJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gbm8gaW5wdXQgYnVmZmVyIGxhcmdlIGVub3VnaCBmb3IgdGhlIGNvbmZpZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIoJXp1IGJ5dGVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBjb25maWctPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IGktPmJ1ZmZlcjsKLSAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5iYXNlKCksIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb25maWctPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIDEpOwotICAgICAgICAgICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhIGZsdXNoZWQgY29uZmlnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2xpZW50SW5wdXRCdWZmZXJzLmVyYXNlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIgJiYKLSAgICAgICAgICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSkgewotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gY2xpZW50SW5wdXRCdWZmZXJzLmZyb250KCkuYnVmZmVyOwotICAgICAgICAgICAgLy8gV09SS0FST1VORDogU29tZSBhcHBzIGV4cGVjdCBDU0QgYXZhaWxhYmxlIHdpdGhvdXQgcXVldWVpbmcKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFueSBpbnB1dC4gUXVldWUgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCB0aGUgQ1NELgotICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIEVycm9yIHdoaWxlIHF1ZXVlaW5nIGFuIGVtcHR5IGJ1ZmZlciB0byBnZXQgQ1NEIiwKLSAgICAgICAgICAgICAgICAgICAgICBtTmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkQ29uZmlnczsKKyAgICBtRmx1c2hlZENvbmZpZ3MubG9jaygpLT5zd2FwKGZsdXNoZWRDb25maWdzKTsKKyAgICBpZiAoIWZsdXNoZWRDb25maWdzLmVtcHR5KCkpIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJmZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR1coIlslc10gRXJyb3Igd2hpbGUgcXVldWVpbmcgYSBmbHVzaGVkIGNvbmZpZyIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmCisgICAgICAgICAgICAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSA9PSBQUkVQRU5EX0hFQURFUl9UT19OT05FKSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPSBjbGllbnRJbnB1dEJ1ZmZlcnMuZnJvbnQoKS5idWZmZXI7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCisgICAgICAgIC8vICAgICAgICAgICAgIGFueSBpbnB1dC4gUXVldWUgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCB0aGUgQ1NELgorICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IENTRCIsCisgICAgICAgICAgICAgICAgICBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjbGllbnRJbnB1dEJ1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgfQogCiAgICAgZm9yIChjb25zdCBDbGllbnRJbnB1dEJ1ZmZlciYgY2xpZW50SW5wdXRCdWZmZXI6IGNsaWVudElucHV0QnVmZmVycykgewogICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRCdWZmZXJBdmFpbGFibGUoCkBAIC0xMzU5LDE0ICsxNDg2LDE0IEBACiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnN0b3AoKSB7CiAgICAgbVN5bmMuc3RvcCgpOwogICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci0gICAgaWYgKG1JbnB1dFN1cmZhY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7Ci0gICAgfQotICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5mbHVzaCgpOwogfQogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnJlc2V0KCkgewogICAgIHN0b3AoKTsKKyAgICBpZiAobUlucHV0U3VyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dFN1cmZhY2UucmVzZXQoKTsKKyAgICB9CisgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmZsdXNoKCk7CiAgICAgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAgICAgICAgIGlucHV0LT5idWZmZXJzLnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycygiIikpOwpAQCAtMTM5NCwyNyArMTUyMSwzOSBAQAogCiB2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CiAgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7Ci0gICAgewotICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOwotICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKLSAgICAgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQotICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQzJSZWFkVmlldyB2aWV3ID0KLSAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKLSAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBmYWlsZWQgdG8gbWFwIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGE6ICVkIiwgbU5hbWUsIHZpZXcuZXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb25maWdzLT5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpKTsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSAoc2l6ZT0ldSkiLCBtTmFtZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gaW5kaWNlczsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGNvbmZpZ3M7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgIGluZGljZXMucHVzaF9iYWNrKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgaWYgKCEod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpCisgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBubyBsaW5lYXIgY29kZWMgY29uZmlnIGRhdGEgZm91bmQiLCBtTmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiBjb3B5KG5ldyBDMldvcmspOworICAgICAgICBjb3B5LT5pbnB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpmbGFnc190KHdvcmstPmlucHV0LmZsYWdzIHwgQzJGcmFtZURhdGE6OkZMQUdfRFJPUF9GUkFNRSk7CisgICAgICAgIGNvcHktPmlucHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBjb3B5LT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmluc2VydCgKKyAgICAgICAgICAgICAgICBjb3B5LT5pbnB1dC5idWZmZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW5kKCkpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGNvcHktPmlucHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgfQorICAgICAgICBjb3B5LT5pbnB1dC5pbmZvQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgY29weS0+aW5wdXQuaW5mb0J1ZmZlcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5pbmZvQnVmZmVycy5iZWdpbigpLAorICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmluZm9CdWZmZXJzLmVuZCgpKTsKKyAgICAgICAgY29weS0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBjb25maWdzLnB1c2hfYmFjayhzdGQ6Om1vdmUoY29weSkpOworICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEiLCBtTmFtZSk7CiAgICAgfQorICAgIG1GbHVzaGVkQ29uZmlncy5sb2NrKCktPnN3YXAoY29uZmlncyk7CiAgICAgewogICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CiAgICAgICAgIGlucHV0LT5idWZmZXJzLT5mbHVzaCgpOwpAQCAtMTQyNyw3ICsxNTY2LDEyIEBACiAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmZsdXNoU3Rhc2goKTsKICAgICAgICAgfQogICAgIH0KLSAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+Zmx1c2goKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPjo6TG9ja2VkIHdhdGNoZXIobVBpcGVsaW5lV2F0Y2hlcik7CisgICAgICAgIGZvciAodWludDY0X3QgaW5kZXggOiBpbmRpY2VzKSB7CisgICAgICAgICAgICB3YXRjaGVyLT5vbldvcmtEb25lKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKApAQCAtMTUyMyw3ICsxNjY3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IG5ld0lucHV0RGVsYXksIG5ld1BpcGVsaW5lRGVsYXk7CisgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gbmV3SW5wdXREZWxheSwgbmV3UGlwZWxpbmVEZWxheSwgbmV3T3V0cHV0RGVsYXksIG5ld1Jlb3JkZXJEZXB0aDsKKyAgICBzdGQ6Om9wdGlvbmFsPEMyQ29uZmlnOjpvcmRpbmFsX2tleV90PiBuZXdSZW9yZGVyS2V5OworICAgIGJvb2wgbmVlZE1heERlcXVldWVCdWZmZXJDb3VudFVwZGF0ZSA9IGZhbHNlOwogICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKICAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CkBAIC0xNTMyLDI0ICsxNjc4LDEwIEBACiAgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6Q09SRV9JTkRFWDogewogICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJEZXB0aDsKICAgICAgICAgICAgICAgICBpZiAocmVvcmRlckRlcHRoLnVwZGF0ZUZyb20oKnBhcmFtKSkgewotICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZzo6bnBvczsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dC5sb2NrKCktPmJ1ZmZlcnMtPnNldFJlb3JkZXJEZXB0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIgZGVwdGggdG8gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlckRlcHRoLnZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gbU91dHB1dC5sb2NrKCktPm51bVNsb3RzOwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOwotICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG51bU91dHB1dFNsb3RzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VjdXJlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzICs9IG51bUlucHV0U2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdSZW9yZGVyRGVwdGggPSByZW9yZGVyRGVwdGgudmFsdWU7CisgICAgICAgICAgICAgICAgICAgIG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSk7CkBAIC0xNTU5LDcgKzE2OTEsNyBAQAogICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6Q09SRV9JTkRFWDogewogICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKICAgICAgICAgICAgICAgICBpZiAocmVvcmRlcktleS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dC5sb2NrKCktPmJ1ZmZlcnMtPnNldFJlb3JkZXJLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIG5ld1Jlb3JkZXJLZXkgPSByZW9yZGVyS2V5LnZhbHVlOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGVkIHJlb3JkZXIga2V5IHRvICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJLZXkudmFsdWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNTkzLDUzICsxNzI1LDM0IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZWxheS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0aW5nIG91dHB1dCBkZWxheSAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0RGVsYXkudmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZWN1cmUgPSBtQ29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiLnNlY3VyZSIpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpucG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm91dHB1dERlbGF5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCltUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b3V0cHV0RGVsYXkob3V0cHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3V0cHV0RGVsYXkgPSBvdXRwdXREZWxheS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm91dHB1dERlbGF5ID0gb3V0cHV0RGVsYXkudmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0U2xvdHMgPSBvdXRwdXREZWxheS52YWx1ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU21vb3RobmVzc0ZhY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5udW1TbG90cyA8IG51bU91dHB1dFNsb3RzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBudW1PdXRwdXRTbG90czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dEJ1ZmZlcnNBcnJheSAqKW91dHB1dC0+YnVmZmVycy5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGdyb3dpbmcgb3V0cHV0IGJ1ZmZlciBhcnJheSB0byAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG51bU91dHB1dFNsb3RzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LT5ncm93KG51bU91dHB1dFNsb3RzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXB0aCA9IG1PdXRwdXQubG9jaygpLT5idWZmZXJzLT5nZXRSZW9yZGVyRGVwdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyA9IG51bU91dHB1dFNsb3RzICsgZGVwdGggKyBrUmVuZGVyaW5nRGVwdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlY3VyZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgKz0gbnVtSW5wdXRTbG90czsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyUG9ydFR1bm5lbFN5c3RlbVRpbWU6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlBvcnRUdW5uZWxTeXN0ZW1UaW1lOjpvdXRwdXQgZnJhbWVSZW5kZXJUaW1lOworICAgICAgICAgICAgICAgIGlmIChmcmFtZVJlbmRlclRpbWUudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGZyYW1lIHJlbmRlcmVkIChzeXM6JWxsZCBucywgbWVkaWE6JWxsZCB1cykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKGxvbmcgbG9uZylmcmFtZVJlbmRlclRpbWUudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpd29ya2xldC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrKCksIGZyYW1lUmVuZGVyVGltZS52YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlN0cmVhbVR1bm5lbEhvbGRSZW5kZXI6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVR1bm5lbEhvbGRSZW5kZXI6Om91dHB1dCBmaXJzdFR1bm5lbEZyYW1lSG9sZFJlbmRlcjsKKyAgICAgICAgICAgICAgICBpZiAoISh3b3JrbGV0LT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSkgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKCFmaXJzdFR1bm5lbEZyYW1lSG9sZFJlbmRlci51cGRhdGVGcm9tKCpwYXJhbSkpIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFR1bm5lbEZyYW1lSG9sZFJlbmRlci52YWx1ZSAhPSBDMl9UUlVFKSBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBmaXJzdCB0dW5uZWwgZnJhbWUgcmVhZHkiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkZpcnN0VHVubmVsRnJhbWVSZWFkeSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1bnJlY29nbml6ZWQgY29uZmlnIHVwZGF0ZSAoJTA4WCkiLAogICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbS0+aW5kZXgoKSk7CkBAIC0xNjY0LDYgKzE3NzcsNTYgQEAKICAgICAgICAgICAgIGlucHV0LT5udW1TbG90cyA9IG5ld051bVNsb3RzOwogICAgICAgICB9CiAgICAgfQorICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IDA7CisgICAgdWludDMyX3QgcmVvcmRlckRlcHRoID0gMDsKKyAgICBib29sIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKG5ld1Jlb3JkZXJLZXkgfHwgbmV3UmVvcmRlckRlcHRoIHx8IG5lZWRNYXhEZXF1ZXVlQnVmZmVyQ291bnRVcGRhdGUpIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBpZiAoIW91dHB1dC0+YnVmZmVycykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG51bU91dHB1dFNsb3RzID0gb3V0cHV0LT5udW1TbG90czsKKyAgICAgICAgaWYgKG5ld1Jlb3JkZXJLZXkpIHsKKyAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+c2V0UmVvcmRlcktleShuZXdSZW9yZGVyS2V5LnZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdSZW9yZGVyRGVwdGgpIHsKKyAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+c2V0UmVvcmRlckRlcHRoKG5ld1Jlb3JkZXJEZXB0aC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZW9yZGVyRGVwdGggPSBvdXRwdXQtPmJ1ZmZlcnMtPmdldFJlb3JkZXJEZXB0aCgpOworICAgICAgICBpZiAobmV3T3V0cHV0RGVsYXkpIHsKKyAgICAgICAgICAgIG91dHB1dC0+b3V0cHV0RGVsYXkgPSBuZXdPdXRwdXREZWxheS52YWx1ZSgpOworICAgICAgICAgICAgbnVtT3V0cHV0U2xvdHMgPSBuZXdPdXRwdXREZWxheS52YWx1ZSgpICsga1Ntb290aG5lc3NGYWN0b3I7CisgICAgICAgICAgICBpZiAob3V0cHV0LT5udW1TbG90cyA8IG51bU91dHB1dFNsb3RzKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5udW1TbG90cyA9IG51bU91dHB1dFNsb3RzOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoT3V0cHV0QnVmZmVyc0FycmF5ICopb3V0cHV0LT5idWZmZXJzLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBncm93aW5nIG91dHB1dCBidWZmZXIgYXJyYXkgdG8gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXktPmdyb3cobnVtT3V0cHV0U2xvdHMpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG51bU91dHB1dFNsb3RzID0gb3V0cHV0LT5udW1TbG90czsKKyAgICB9CisgICAgaWYgKG91dHB1dEJ1ZmZlcnNDaGFuZ2VkKSB7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgIH0KKyAgICBpZiAobmVlZE1heERlcXVldWVCdWZmZXJDb3VudFVwZGF0ZSkgeworICAgICAgICBpbnQgbWF4RGVxdWV1ZUNvdW50ID0gMDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBtYXhEZXF1ZXVlQ291bnQgPSBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGggKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXhEZXF1ZXVlQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlTWF4RGVxdWV1ZUNvdW50KG1heERlcXVldWVDb3VudCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpbnQzMl90IGZsYWdzID0gMDsKICAgICBpZiAod29ya2xldC0+b3V0cHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgewpAQCAtMTgwOSwxMCArMTk3MiwxMSBAQAogICAgICAgICAgICAgICAgICYgKCgxIDw8IDEwKSAtIDEpKTsKIAogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIGludCBtYXhEZXF1ZXVlQ291bnQgPSBtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzOwogICAgIGlmIChuZXdTdXJmYWNlKSB7CiAgICAgICAgIG5ld1N1cmZhY2UtPnNldFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CiAgICAgICAgIG5ld1N1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlVGltZW91dE5zKTsKLSAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChtYXhEZXF1ZXVlQ291bnQpOwogICAgICAgICBwcm9kdWNlciA9IG5ld1N1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKICAgICAgICAgcHJvZHVjZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CiAgICAgfSBlbHNlIHsKQEAgLTE4MzIsNyArMTk5Niw4IEBACiAgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAogICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKICAgICAgICAgICAgICAgICBwcm9kdWNlciwKLSAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgbWF4RGVxdWV1ZUNvdW50KSAhPSBDMl9PSykgewogICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCAwNDZjNWMzLi41YTJhY2EyIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KIAogI2luY2x1ZGUgIkNDb2RlY0J1ZmZlcnMuaCIKKyNpbmNsdWRlICJGcmFtZVJlYXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgogI2luY2x1ZGUgIlBpcGVsaW5lV2F0Y2hlci5oIgogCkBAIC00NCw2ICs0NSw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5KCkgPSAwOwogfTsKIAogLyoqCkBAIC0yMzgsNyArMjQwLDkgQEAKIAogICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKICAgICB2b2lkIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKLSAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gZW5jcnlwdGVkQmxvY2sgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYmxvY2tTaXplID0gMCk7CiAgICAgYm9vbCBoYW5kbGVXb3JrKAogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCiAgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSk7CkBAIC0yNjksNiArMjczLDggQEAKICAgICAgICAgc2l6ZV90IG51bUV4dHJhU2xvdHM7CiAgICAgICAgIHVpbnQzMl90IGlucHV0RGVsYXk7CiAgICAgICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXk7CisKKyAgICAgICAgRnJhbWVSZWFzc2VtYmxlciBmcmFtZVJlYXNzZW1ibGVyOwogICAgIH07CiAgICAgTXV0ZXhlZDxJbnB1dD4gbUlucHV0OwogICAgIHN0cnVjdCBPdXRwdXQgewpAQCAtMjc3LDcgKzI4Myw3IEBACiAgICAgICAgIHVpbnQzMl90IG91dHB1dERlbGF5OwogICAgIH07CiAgICAgTXV0ZXhlZDxPdXRwdXQ+IG1PdXRwdXQ7Ci0gICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+PiBtRmx1c2hlZENvbmZpZ3M7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+PiBtRmx1c2hlZENvbmZpZ3M7CiAKICAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKICAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRmlyc3RWYWxpZEZyYW1lSW5kZXg7CkBAIC0yODgsNiArMjk0LDcgQEAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKICAgICAgICAgaW50IG1heERlcXVldWVCdWZmZXJzOworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgaW50PiByb3RhdGlvbjsKICAgICB9OwogICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT4gbU91dHB1dFN1cmZhY2U7CiAKQEAgLTMxNSw2ICszMjIsNyBAQAogICAgIGlubGluZSBib29sIGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSB7CiAgICAgICAgIHJldHVybiBtQ3J5cHRvICE9IG51bGxwdHIgfHwgbURlc2NyYW1ibGVyICE9IG51bGxwdHI7CiAgICAgfQorICAgIHN0ZDo6YXRvbWljX2Jvb2wgbVNlbmRFbmNyeXB0ZWRJbmZvQnVmZmVyOwogfTsKIAogLy8gQ29udmVyc2lvbiBvZiBhIGMyX3N0YXR1c190IHZhbHVlIHRvIGEgc3RhdHVzX3QgdmFsdWUgbWF5IGRlcGVuZCBvbiB0aGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcAppbmRleCBlNThhMWU0Li4zMzNhMmNhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogCiAjaW5jbHVkZSAiQ0NvZGVjQnVmZmVycy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc2LDI5ICs3Nyw0MiBAQAogdm9pZCBDQ29kZWNCdWZmZXJzOjpoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhQ2FuZGlkYXRlID0gYnVmZmVyLT5nZXRJbWFnZURhdGEoKTsKICAgICBpZiAoaW1hZ2VEYXRhQ2FuZGlkYXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRXaXRoSW1hZ2VEYXRhKSB7CisgICAgICAgICAgICAvLyBXZSBwcmV2aW91c2x5IHNlbnQgdGhlIGZvcm1hdCB3aXRoIGltYWdlIGRhdGEsIHNvIHVzZSB0aGUgc2FtZSBmb3JtYXQuCisgICAgICAgICAgICBidWZmZXItPnNldEZvcm1hdChtRm9ybWF0V2l0aEltYWdlRGF0YSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7Ci0gICAgaWYgKCFtRm9ybWF0LT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkKLSAgICAgICAgICAgIHx8IGltYWdlRGF0YUNhbmRpZGF0ZS0+c2l6ZSgpICE9IGltYWdlRGF0YS0+c2l6ZSgpCi0gICAgICAgICAgICB8fCBtZW1jbXAoaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCksIGltYWdlRGF0YS0+ZGF0YSgpLCBpbWFnZURhdGEtPnNpemUoKSkgIT0gMCkgeworICAgIGlmICghbUxhc3RJbWFnZURhdGEKKyAgICAgICAgICAgIHx8IGltYWdlRGF0YUNhbmRpZGF0ZS0+c2l6ZSgpICE9IG1MYXN0SW1hZ2VEYXRhLT5zaXplKCkKKyAgICAgICAgICAgIHx8IG1lbWNtcChpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtTGFzdEltYWdlRGF0YS0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW1hZ2VEYXRhLT5zaXplKCkpICE9IDApIHsKICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgaW1hZ2UtZGF0YSIsIG1OYW1lKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IGR1cEZvcm1hdCgpOwotICAgICAgICBuZXdGb3JtYXQtPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YUNhbmRpZGF0ZSk7CisgICAgICAgIG1Gb3JtYXRXaXRoSW1hZ2VEYXRhID0gZHVwRm9ybWF0KCk7CisgICAgICAgIG1MYXN0SW1hZ2VEYXRhID0gaW1hZ2VEYXRhQ2FuZGlkYXRlOworICAgICAgICBtRm9ybWF0V2l0aEltYWdlRGF0YS0+c2V0QnVmZmVyKCJpbWFnZS1kYXRhIiwgaW1hZ2VEYXRhQ2FuZGlkYXRlKTsKICAgICAgICAgTWVkaWFJbWFnZTIgKmltZyA9IChNZWRpYUltYWdlMiopaW1hZ2VEYXRhQ2FuZGlkYXRlLT5kYXRhKCk7CiAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAwICYmIGltZy0+bVR5cGUgIT0gaW1nLT5NRURJQV9JTUFHRV9UWVBFX1VOS05PV04pIHsKICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKLSAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKLSAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHN0cmlkZSA9ICVkIiwgbU5hbWUsIHN0cmlkZSk7CisgICAgICAgICAgICBtRm9ybWF0V2l0aEltYWdlRGF0YS0+c2V0SW50MzIoS0VZX1NUUklERSwgc3RyaWRlKTsKKyAgICAgICAgICAgIG1Gb3JtYXRXaXRoSW1hZ2VEYXRhLT5zZXRJbnQzMihLRVlfV0lEVEgsIGltZy0+bVdpZHRoKTsKKyAgICAgICAgICAgIG1Gb3JtYXRXaXRoSW1hZ2VEYXRhLT5zZXRJbnQzMihLRVlfSEVJR0hULCBpbWctPm1IZWlnaHQpOworICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgc3RyaWRlID0gJWQsIHdpZHRoOiAlZCwgaGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgc3RyaWRlLCBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0KTsKICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOwotICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NMSUNFX0hFSUdIVCwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXREZWx0YSA9CisgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KWltZy0+bVBsYW5lWzFdLm1PZmZzZXQgLSAoaW50NjRfdClpbWctPm1QbGFuZVswXS5tT2Zmc2V0OworICAgICAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IGludDMyX3Qob2Zmc2V0RGVsdGEgLyBzdHJpZGUpOworICAgICAgICAgICAgICAgIG1Gb3JtYXRXaXRoSW1hZ2VEYXRhLT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyB2c3RyaWRlID0gJWQiLCBtTmFtZSwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNldEZvcm1hdChuZXdGb3JtYXQpOwotICAgICAgICBidWZmZXItPnNldEZvcm1hdChuZXdGb3JtYXQpOwogICAgIH0KKyAgICBidWZmZXItPnNldEZvcm1hdChtRm9ybWF0V2l0aEltYWdlRGF0YSk7CiB9CiAKIC8vIElucHV0QnVmZmVycwpAQCAtMTU2LDggKzE3MCw3IEBACiAgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZyk7CiB9CiAKLXZvaWQgT3V0cHV0QnVmZmVyczo6dXBkYXRlU2tpcEN1dEJ1ZmZlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgbm90aWZ5KSB7Cit2b2lkIE91dHB1dEJ1ZmZlcnM6OnVwZGF0ZVNraXBDdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKICAgICBpZiAoZm9ybWF0LT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWVkaWFUeXBlKQogICAgICAgICAgICAgJiYgbWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX1JBVykgewpAQCAtMTY4LDkgKzE4MSw2IEBACiAgICAgICAgICAgICB1cGRhdGVTa2lwQ3V0QnVmZmVyKHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG5vdGlmeSkgewotICAgICAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IG51bGxwdHI7Ci0gICAgfQogfQogCiB2b2lkIE91dHB1dEJ1ZmZlcnM6OnN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CkBAIC0xOTQsNyArMjA0LDYgQEAKICAgICBtUmVvcmRlclN0YXNoLmNsZWFyKCk7CiAgICAgbURlcHRoID0gMDsKICAgICBtS2V5ID0gQzJDb25maWc6Ok9SRElOQUw7Ci0gICAgbVVucmVwb3J0ZWRGb3JtYXQgPSBudWxscHRyOwogfQogCiB2b2lkIE91dHB1dEJ1ZmZlcnM6OmZsdXNoU3Rhc2goKSB7CkBAIC0yNzAsMjcgKzI3OSwxNSBAQAogICAgICpjMkJ1ZmZlciA9IGVudHJ5LmJ1ZmZlcjsKICAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gZW50cnkuZm9ybWF0OwogCi0gICAgLy8gVGhlIG91dHB1dCBmb3JtYXQgY2FuIGJlIHByb2Nlc3NlZCB3aXRob3V0IGEgcmVnaXN0ZXJlZCBzbG90LgotICAgIGlmIChvdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgQUxPR0QoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCi0gICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgdXBkYXRlU2tpcEN1dEJ1ZmZlcihvdXRwdXRGb3JtYXQsIGVudHJ5Lm5vdGlmeSk7Ci0gICAgfQotCi0gICAgaWYgKGVudHJ5Lm5vdGlmeSkgewotICAgICAgICBpZiAob3V0cHV0Rm9ybWF0KSB7Ci0gICAgICAgICAgICBzZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKLSAgICAgICAgfSBlbHNlIGlmIChtVW5yZXBvcnRlZEZvcm1hdCkgewotICAgICAgICAgICAgb3V0cHV0Rm9ybWF0ID0gbVVucmVwb3J0ZWRGb3JtYXQ7Ci0gICAgICAgICAgICBzZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dEZvcm1hdCkgewotICAgICAgICAgICAgbVVucmVwb3J0ZWRGb3JtYXQgPSBvdXRwdXRGb3JtYXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1VbnJlcG9ydGVkRm9ybWF0KSB7Ci0gICAgICAgICAgICBtVW5yZXBvcnRlZEZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIH0KKyAgICBpZiAoZW50cnkubm90aWZ5ICYmIG1Gb3JtYXQgIT0gb3V0cHV0Rm9ybWF0KSB7CisgICAgICAgIHVwZGF0ZVNraXBDdXRCdWZmZXIob3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgLy8gVHJpZ2dlciBpbWFnZSBkYXRhIHByb2Nlc3NpbmcgdG8gdGhlIG5ldyBmb3JtYXQKKyAgICAgICAgbUxhc3RJbWFnZURhdGEuY2xlYXIoKTsKKyAgICAgICAgQUxPR1YoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IG91dHB1dCBmb3JtYXQgcmVmZXJlbmNlIGNoYW5nZWQ6ICVwIC0+ICVwIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgbUZvcm1hdC5nZXQoKSwgb3V0cHV0Rm9ybWF0LmdldCgpKTsKKyAgICAgICAgQUxPR0QoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6IGF0ICVsbGR1cywgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgKGxvbmcgbG9uZyllbnRyeS50aW1lc3RhbXAsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgc2V0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CiAgICAgfQogCiAgICAgLy8gRmx1c2hpbmcgbVJlb3JkZXJTdGFzaCBiZWNhdXNlIG5vIG90aGVyIGJ1ZmZlcnMgc2hvdWxkIGNvbWUgYWZ0ZXIgb3V0cHV0CkBAIC0zMTcsNiArMzE0LDcgQEAKICAgICAvLyBBcHBlbmQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJvbnQgc3Rhc2ggZW50cnkgdG8gb3V0QnVmZmVyLgogICAgICgqb3V0QnVmZmVyKS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgZW50cnkudGltZXN0YW1wKTsKICAgICAoKm91dEJ1ZmZlciktPm1ldGEoKS0+c2V0SW50MzIoImZsYWdzIiwgZW50cnkuZmxhZ3MpOworICAgICgqb3V0QnVmZmVyKS0+bWV0YSgpLT5zZXRJbnQ2NCgiZnJhbWVJbmRleCIsIGVudHJ5Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSk7CiAgICAgQUxPR1YoIlslc10gcG9wRnJvbVN0YXNoQW5kUmVnaXN0ZXI6ICIKICAgICAgICAgICAib3V0IGJ1ZmZlciBpbmRleCA9ICV6dSBbJXBdID0+ICVwICsgJXp1ICglbGxkKSIsCiAgICAgICAgICAgbU5hbWUsICppbmRleCwgb3V0QnVmZmVyLT5nZXQoKSwKQEAgLTQ4NywxMSArNDg1LDEyIEBACiAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKIH0KIAotc2l6ZV90IEZsZXhCdWZmZXJzSW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKK3NpemVfdCBGbGV4QnVmZmVyc0ltcGw6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgewogICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAogICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCiAgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmNsaWVudEJ1ZmZlciAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhZW50cnkuY29tcEJ1ZmZlci5leHBpcmVkKCkpOwogICAgICAgICAgICAgfSk7CiB9CiAKQEAgLTYzNywxMSArNjM2LDExIEBACiAgICAgfQogfQogCi1zaXplX3QgQnVmZmVyc0FycmF5SW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKK3NpemVfdCBCdWZmZXJzQXJyYXlJbXBsOjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKICAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKICAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAogICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm93bmVkQnlDbGllbnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm93bmVkQnlDbGllbnQgfHwgIWVudHJ5LmNvbXBCdWZmZXIuZXhwaXJlZCgpOwogICAgICAgICAgICAgfSk7CiB9CiAKQEAgLTY5MSw4ICs2OTAsOCBAQAogICAgIG1JbXBsLmZsdXNoKCk7CiB9CiAKLXNpemVfdCBJbnB1dEJ1ZmZlcnNBcnJheTo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworc2l6ZV90IElucHV0QnVmZmVyc0FycmF5OjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQWN0aXZlU2xvdHMoKTsKIH0KIAogc3A8Q29kZWMyQnVmZmVyPiBJbnB1dEJ1ZmZlcnNBcnJheTo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtNzI5LDggKzcyOCw4IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNpemVfdCBTbG90SW5wdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgU2xvdElucHV0QnVmZmVyczo6bnVtQWN0aXZlU2xvdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUFjdGl2ZVNsb3RzKCk7CiB9CiAKIHNwPENvZGVjMkJ1ZmZlcj4gU2xvdElucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtNzgxLDggKzc4MCw4IEBACiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CiB9CiAKLXNpemVfdCBMaW5lYXJJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK3NpemVfdCBMaW5lYXJJbnB1dEJ1ZmZlcnM6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1BY3RpdmVTbG90cygpOwogfQogCiAvLyBzdGF0aWMKQEAgLTc5NSw4ICs3OTQsOSBAQAogICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOwogICAgIH0KIAotICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCi0gICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGludDY0X3QgdXNhZ2VWYWx1ZSA9IDA7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50NjQoImFuZHJvaWQuX0MyTWVtb3J5VXNhZ2UiLCAmdXNhZ2VWYWx1ZSk7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZXt1c2FnZVZhbHVlIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKIAogICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOwpAQCAtOTU4LDggKzk1OCw4IEBACiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CiB9CiAKLXNpemVfdCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK3NpemVfdCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1BY3RpdmVTbG90cygpOwogfQogCiBzcDxDb2RlYzJCdWZmZXI+IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewpAQCAtMTAwNywzMSArMTAwNyw0NiBAQAogICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCiB9CiAKK3N0YXRpYyB1aW50MzJfdCBleHRyYWN0UGl4ZWxGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBpbnQzMl90IGZyYW1ld29ya0NvbG9yRm9ybWF0ID0gMDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZnJhbWV3b3JrQ29sb3JGb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBQSVhFTF9GT1JNQVRfVU5LTk9XTjsKKyAgICB9CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBQSVhFTF9GT1JNQVRfVU5LTk9XTjsKKyAgICBpZiAoQzJNYXBwZXI6Om1hcFBpeGVsRm9ybWF0RnJhbWV3b3JrVG9Db2RlYyhmcmFtZXdvcmtDb2xvckZvcm1hdCwgJnBpeGVsRm9ybWF0KSkgeworICAgICAgICByZXR1cm4gcGl4ZWxGb3JtYXQ7CisgICAgfQorICAgIHJldHVybiBQSVhFTF9GT1JNQVRfVU5LTk9XTjsKK30KKwogc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gR3JhcGhpY0lucHV0QnVmZmVyczo6dG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAogICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1CQi1JbnB1dFtOXSIpKTsKICAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CiAgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCA9IGV4dHJhY3RQaXhlbEZvcm1hdChtRm9ybWF0KTsKICAgICBhcnJheS0+aW5pdGlhbGl6ZSgKICAgICAgICAgICAgIG1JbXBsLAogICAgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLCBmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sLCBwaXhlbEZvcm1hdF0oKQorICAgICAgICAgICAgICAgICAgICAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIGZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbGJwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIGZvcm1hdCwgcGl4ZWxGb3JtYXQsIHVzYWdlLCBsYnApOwogICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7CiB9CiAKLXNpemVfdCBHcmFwaGljSW5wdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgR3JhcGhpY0lucHV0QnVmZmVyczo6bnVtQWN0aXZlU2xvdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUFjdGl2ZVNsb3RzKCk7CiB9CiAKIHNwPENvZGVjMkJ1ZmZlcj4gR3JhcGhpY0lucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgewotICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCi0gICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGludDY0X3QgdXNhZ2VWYWx1ZSA9IDA7CisgICAgKHZvaWQpbUZvcm1hdC0+ZmluZEludDY0KCJhbmRyb2lkLl9DMk1lbW9yeVVzYWdlIiwgJnVzYWdlVmFsdWUpOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2V7dXNhZ2VWYWx1ZSB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKICAgICByZXR1cm4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOworICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIGV4dHJhY3RQaXhlbEZvcm1hdChtRm9ybWF0KSwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOwogfQogCiAvLyBPdXRwdXRCdWZmZXJzQXJyYXkKQEAgLTExMTMsOCArMTEyOCw4IEBACiAgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOwogfQogCi1zaXplX3QgT3V0cHV0QnVmZmVyc0FycmF5OjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgT3V0cHV0QnVmZmVyc0FycmF5OjpudW1BY3RpdmVTbG90cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQWN0aXZlU2xvdHMoKTsKIH0KIAogdm9pZCBPdXRwdXRCdWZmZXJzQXJyYXk6OnJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKQEAgLTExNjcsNyArMTE4Miw2IEBACiB2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6dHJhbnNmZXJGcm9tKE91dHB1dEJ1ZmZlcnMqIHNvdXJjZSkgewogICAgIG1Gb3JtYXQgPSBzb3VyY2UtPm1Gb3JtYXQ7CiAgICAgbVNraXBDdXRCdWZmZXIgPSBzb3VyY2UtPm1Ta2lwQ3V0QnVmZmVyOwotICAgIG1VbnJlcG9ydGVkRm9ybWF0ID0gc291cmNlLT5tVW5yZXBvcnRlZEZvcm1hdDsKICAgICBtUGVuZGluZyA9IHN0ZDo6bW92ZShzb3VyY2UtPm1QZW5kaW5nKTsKICAgICBtUmVvcmRlclN0YXNoID0gc3RkOjptb3ZlKHNvdXJjZS0+bVJlb3JkZXJTdGFzaCk7CiAgICAgbURlcHRoID0gc291cmNlLT5tRGVwdGg7CkBAIC0xMjI0LDggKzEyMzgsOCBAQAogICAgIHJldHVybiBhcnJheTsKIH0KIAotc2l6ZV90IEZsZXhPdXRwdXRCdWZmZXJzOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7CitzaXplX3QgRmxleE91dHB1dEJ1ZmZlcnM6Om51bUFjdGl2ZVNsb3RzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1BY3RpdmVTbG90cygpOwogfQogCiAvLyBMaW5lYXJPdXRwdXRCdWZmZXJzCkBAIC0xMjkwLDE3ICsxMzA0LDcgQEAKIAogc3A8Q29kZWMyQnVmZmVyPiBSYXdHcmFwaGljT3V0cHV0QnVmZmVyczo6d3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjMmJ1ZmZlciA9IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAotICAgICAgICAgICAgICAgIG1Gb3JtYXQsCi0gICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGJwLT5uZXdCdWZmZXIoY2FwYWNpdHkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoYzJidWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkgZmFpbGVkIiwgbU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgYzJidWZmZXItPnNldFJhbmdlKDAsIDApOwotICAgICAgICByZXR1cm4gYzJidWZmZXI7CisgICAgICAgIHJldHVybiBuZXcgQ29kZWMyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKG51bGxwdHIsIDApKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAogICAgICAgICAgICAgICAgIG1Gb3JtYXQsCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaAppbmRleCAwZDRmYTgxLi45OTVkM2E0IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKQEAgLTMzLDggKzMzLDggQEAKIGNsYXNzIFNraXBDdXRCdWZmZXI7CiAKIGNvbnN0ZXhwciBzaXplX3Qga0xpbmVhckJ1ZmZlclNpemUgPSAxMDQ4NTc2OwotLy8gVGhpcyBjYW4gZml0IDRLIFJHQkEgZnJhbWUsIGFuZCBtb3N0IGxpa2VseSBjbGllbnQgd29uJ3QgbmVlZCBtb3JlIHRoYW4gdGhpcy4KLWNvbnN0ZXhwciBzaXplX3Qga01heExpbmVhckJ1ZmZlclNpemUgPSA0MDk2ICogMjMwNCAqIDQ7CisvLyBUaGlzIGNhbiBmaXQgYW4gOEsgZnJhbWUuCitjb25zdGV4cHIgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gNzY4MCAqIDQzMjAgKiAyOwogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCkBAIC03Miw3ICs3Miw3IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIG51bWJlciBvZiBidWZmZXJzIHRoZSBjbGllbnQgb3ducy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogRXhhbWluZSBpbWFnZSBkYXRhIGZyb20gdGhlIGJ1ZmZlciBhbmQgdXBkYXRlIHRoZSBmb3JtYXQgaWYgbmVjZXNzYXJ5LgpAQCAtODYsNiArODYsOSBAQAogICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgogICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OwogCisgICAgc3A8QUJ1ZmZlcj4gbUxhc3RJbWFnZURhdGE7CisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXRXaXRoSW1hZ2VEYXRhOworCiBwcml2YXRlOgogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlY0J1ZmZlcnMpOwogfTsKQEAgLTIxNSwxMCArMjE4LDggQEAKIAogICAgIC8qKgogICAgICAqIFVwZGF0ZSBTa2lwQ3V0QnVmZmVyIGZyb20gZm9ybWF0LiBUaGUgQHAgZm9ybWF0IG11c3Qgbm90IGJlIG51bGwuCi0gICAgICogQHAgbm90aWZ5IGRldGVybWluZXMgd2hldGhlciB0aGUgZm9ybWF0IGNvbWVzIHdpdGggYSBidWZmZXIgdGhhdCBzaG91bGQKLSAgICAgKiBiZSByZXBvcnRlZCB0byB0aGUgY2xpZW50IG9yIG5vdC4KICAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVNraXBDdXRCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgbm90aWZ5ID0gdHJ1ZSk7CisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIC8qKgogICAgICAqIE91dHB1dCBTdGFzaApAQCAtMzkyLDkgKzM5Myw2IEBACiAKICAgICAvLyBPdXRwdXQgc3Rhc2gKIAotICAgIC8vIE91dHB1dCBmb3JtYXQgdGhhdCBoYXMgbm90IGJlZW4gbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNsaWVudC4KLSAgICBzcDxBTWVzc2FnZT4gbVVucmVwb3J0ZWRGb3JtYXQ7Ci0KICAgICAvLyBTdHJ1Y3QgZm9yIGFuIGVudHJ5IGluIHRoZSBvdXRwdXQgc3Rhc2ggKG1QZW5kaW5nIGFuZCBtUmVvcmRlclN0YXNoKQogICAgIHN0cnVjdCBTdGFzaEVudHJ5IHsKICAgICAgICAgaW5saW5lIFN0YXNoRW50cnkoKQpAQCAtNTg0LDcgKzU4Miw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjbGllbnQgYnV0IG5vdCByZWxlYXNlZAogICAgICAqIHlldC4KICAgICAgKi8KLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0OworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjb21wb25lbnQgYnV0IG5vdApAQCAtNzA1LDcgKzcwMyw3IEBACiAgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjbGllbnQgYnV0IG5vdCByZWxlYXNlZAogICAgICAqIHlldC4KICAgICAgKi8KLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0OworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhcnJheS4KQEAgLTc2NSw3ICs3NjMsNyBAQAogCiAgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlOwogCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdCBmaW5hbDsKIAogcHJvdGVjdGVkOgogICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CkBAIC03OTYsNyArNzk0LDcgQEAKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSBmaW5hbDsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKIHByb3RlY3RlZDoKICAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIGZpbmFsOwpAQCAtODI2LDcgKzgyNCw3IEBACiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CiAKLSAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0IGZpbmFsOwogCiBwcm90ZWN0ZWQ6CiAgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKQEAgLTg5NCw3ICs4OTIsNyBAQAogCiAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIGZpbmFsOwogCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdCBmaW5hbDsKIAogcHJvdGVjdGVkOgogICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CkBAIC05MjQsNyArOTIyLDcgQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZSgKICAgICAgICAgICAgIHNpemVfdCBzaXplKSBmaW5hbDsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKIHByb3RlY3RlZDoKICAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlOwpAQCAtOTY1LDcgKzk2Myw3IEBACiAgICAgICAgIGFycmF5LT5jbGVhcigpOwogICAgIH0KIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWwgeworICAgIHNpemVfdCBudW1BY3RpdmVTbG90cygpIGNvbnN0IGZpbmFsIHsKICAgICAgICAgcmV0dXJuIDB1OwogICAgIH0KIApAQCAtMTAxOSw3ICsxMDE3LDcgQEAKIAogICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsOwogCi0gICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKyAgICBzaXplX3QgbnVtQWN0aXZlU2xvdHMoKSBjb25zdCBmaW5hbDsKIAogICAgIC8qKgogICAgICAqIFJlYWxsb2NhdGUgdGhlIGFycmF5LCBmaWxsZWQgd2l0aCBidWZmZXJzIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBnaXZlbgpAQCAtMTA3Myw3ICsxMDcxLDcgQEAKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAotICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisgICAgc2l6ZV90IG51bUFjdGl2ZVNsb3RzKCkgY29uc3QgZmluYWw7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgQ29kZWMyQnVmZmVyIG9iamVjdCBmb3IgdGhlIHR5cGUgb2YgYnVmZmVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKaW5kZXggOTZmODZlOC4uYzI3NTE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKQEAgLTE4LDExICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJDQ29kZWNDb25maWciCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAKICNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgogI2luY2x1ZGUgPEMyUGFyYW0uaD4KICNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAKICNpbmNsdWRlICJDQ29kZWNDb25maWcuaCIKQEAgLTI4OSw4ICsyOTEsOCBAQAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRQYXRoc0ZvckRvbWFpbigKICAgICAgICAgICAgIERvbWFpbiBhbnksIERvbWFpbiBhbGwgPSBEb21haW46OkFMTCkgY29uc3QgewogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzOwotICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbUNvbmZpZ01hcHBlcnMpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJltrZXksIG1hcHBlcnNdIDogbUNvbmZpZ01hcHBlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IG1hcHBlcnMpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiZmlsdGVyaW5nICVzICV4ICV4ICV4ICV4IiwgY20ucGF0aCgpLmNfc3RyKCksIGNtLmRvbWFpbigpLCBhbnksCiAgICAgICAgICAgICAgICAgICAgICAgICAoY20uZG9tYWluKCkgJiBhbnkpLCAoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpKTsKICAgICAgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgYW55KSAmJiAoKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSA9PSAoYW55ICYgYWxsKSkpIHsKQEAgLTMyMSw3ICszMjMsOCBAQAogQ0NvZGVjQ29uZmlnOjpDQ29kZWNDb25maWcoKQogICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCiAgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCi0gICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSB7IH0KKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpLAorICAgICAgbVR1bm5lbGVkKGZhbHNlKSB7IH0KIAogdm9pZCBDQ29kZWNDb25maWc6OmluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpIHsKICAgICB0eXBlZGVmIERvbWFpbiBEOwpAQCAtMzU5LDcgKzM2MiwxMCBAQAogICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CiAKICAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKLSAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpKTsKKyAgICAvLyBTb21lIGF1ZGlvIGRlY29kZXJzIHJlcXVpcmUgYml0cmF0ZSBpbmZvcm1hdGlvbiB0byBiZSBzZXQKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6Q09ERUQpKTsKICAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBiaXRyYXRlIGluIHRoZSBtYXggYml0cmF0ZSBmaWVsZAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlJFQUQgJiBEOjpPVVRQVVQpKTsKQEAgLTQxNSwxOSArNDIxLDM4IEBACiAgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKICAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKIAorICAgIC8vIHJlYWQgYmFjayBkZWZhdWx0IGZvciBkZWNvZGVycy4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB0aGUgY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQKKyAgICAvLyBjb2xvciBhc3BlY3RzLiBJbiB0aGF0IGNhc2UsIHRoZXNlIHZhbHVlcyBnZXQgY29waWVkIHRvIGNvbG9yLSoga2V5cy4KKyAgICAvLyBUUklDS1k6IFdlIHJlYWQgdGhlc2UgdmFsdWVzIGF0IHJhdyBwb3J0LCBzaW5jZSB0aGF0J3Mgd2hlcmUgd2Ugd2FudCB0byByZWFkIHRoZXNlLgorICAgIGFkZChDb25maWdNYXBwZXIoImRlZmF1bHQtY29sb3ItcmFuZ2UiLCAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiZGVmYXVsdC1jb2xvci10cmFuc2ZlciIsICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJkZWZhdWx0LWNvbG9yLXByaW1hcmllcyIsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcgJiBEOjpSRUFEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiZGVmYXVsdC1jb2xvci1tYXRyaXgiLCAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkpOworCiAgICAgLy8gcmVhZCBiYWNrIGZpbmFsIGZvciBkZWNvZGVyIG91dHB1dCAoYWxzbywgY29uZmlndXJlIGZpbmFsIGFzcGVjdHMgYXMgd2VsbC4gVGhpcyBzaG91bGQgYmUKICAgICAvLyBvdmVyd3JpdHRlbiBiYXNlZCBvbiBjb2RlZC9kZWZhdWx0IHZhbHVlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29sb3IgYXNwZWN0cywgYnV0IGlzIHVzZWQKICAgICAvLyBhcyBmaW5hbCB2YWx1ZXMgaWYgY29tcG9uZW50IGRvZXMgbm90IHN1cHBvcnQgYXNwZWN0cyBhdCBhbGwpCiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKLSAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkKICAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKLSAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkKICAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CiAgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCi0gICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6UkVBRCkpOwogICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQotICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVyAmIEQ6OlJFQUQpKTsKKworICAgIC8vIGNvbmZpZ3VyZSB0cmFuc2ZlciByZXF1ZXN0CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItdHJhbnNmZXItcmVxdWVzdCIsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKIAogICAgIC8vIGNvbmZpZ3VyZSBzb3VyY2UgYXNwZWN0cyBmb3IgZW5jb2RlcnMgYW5kIHJlYWQgdGhlbSBiYWNrIG9uIHRoZSBjb2RlZCghKSBwb3J0LgogICAgIC8vIFRoaXMgaXMgdG8gZW5zdXJlIG11eGluZyB0aGUgZGVzaXJlZCBhc3BlY3RzIGludG8gdGhlIGNvbnRhaW5lci4KQEAgLTQ4OCw3ICs1MTMsNyBAQAogICAgIGFkZChDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcoS0VZX0ZFQVRVUkVfKSArIEZFQVRVUkVfU2VjdXJlUGxheWJhY2ssCiAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TRUNVUkVfTU9ERSwgInZhbHVlIikpOwogCi0gICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTLAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSRVBFTkRfSEVBREVSX1RPX1NZTkNfRlJBTUVTLAogICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERSwgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKQogICAgICAgICAud2l0aE1hcHBlcnMoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKQEAgLTUxMiw3ICs1MzcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKICAgICAgICAgfSkpOwogICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKLSAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTLAorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9QUkVQRU5EX0hFQURFUl9UT19TWU5DX0ZSQU1FUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLmFkZC1jc2QtdG8tc3luYy1mcmFtZXMiLCAidmFsdWUiKQogICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CiAgICAgLy8gY29udmVydCB0byB0aW1lc3RhbXAgYmFzZQpAQCAtNzA4LDYgKzczMywxNyBAQAogICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKICAgICAgICAgfSkpOwogCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX1BST0ZJTEUsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJwcm9maWxlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkKKyAgICAgICAgLndpdGhNYXBwZXIoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzIgPSBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgICAgIGludDMyX3Qgc2RrOworICAgICAgICAgICAgaWYgKG1hcHBlciAmJiB2LmdldCgmc2RrKSAmJiBtYXBwZXItPm1hcFByb2ZpbGUoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBST0ZJTEVfVU5VU0VEOworICAgICAgICB9KSk7CisKICAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKICAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNIHwgRDo6UkVBRCkpCkBAIC03NjUsMjEgKzgwMSwxMyBAQAogCiAgICAgLy8gY29udmVydCB0byBjb21wcmVzc2lvbiB0eXBlIGFuZCBhZGQgZGVmYXVsdAogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFLCAidmFsdWUiKQotICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0gfCBEOjpSRUFEKSkKLSAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CiAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOwogICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgewogICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0hFQVZZLCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAxID8gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA6IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQ7Ci0gICAgICAgIH0sW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKLSAgICAgICAgICAgIGludDMyX3QgdmFsdWU7Ci0gICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgewotICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfSkpOwogCiAgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdApAQCAtODgxLDYgKzkwOSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pKTsKIAorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2VuY29kaW5nLXF1YWxpdHktbGV2ZWwiLCBDMl9QQVJBTUtFWV9FTkNPRElOR19RVUFMSVRZX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOwogICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1FVQUxJVFksIEMyX1BBUkFNS0VZX1FVQUxJVFksICJ2YWx1ZSIpCiAgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CiAgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCwgQzJfUEFSQU1LRVlfQ09NUExFWElUWSwgInZhbHVlIikKQEAgLTkxMCw2ICs5NDAsMTQgQEAKICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSAwID8gQzJfRkFMU0UgOiBDMl9UUlVFOwogICAgICAgICB9KSk7CiAKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl90cmlnZ2VyLXR1bm5lbC1wZWVrIiwgQzJfUEFSQU1LRVlfVFVOTkVMX1NUQVJUX1JFTkRFUiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpWSURFTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICAgICAgICAgICh2b2lkKXYuZ2V0KCZ2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gMCA/IEMyX0ZBTFNFIDogQzJfVFJVRTsKKyAgICAgICAgfSkpOworCiAgICAgLyogc3RpbGwgdG8gZG8KICAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogCkBAIC0xMDA5LDExICsxMDQ3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbVBpeGVsQXNwZWN0UmF0aW9JbmZvOjpvdXRwdXQoMHUsIDF1LCAxdSksCiAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJTyk7CiAgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0KDB1LCAwKSwgQzJfUEFSQU1LRVlfUk9UQVRJT04pOwotICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KDB1KSwKKyAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKTsKICAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UpOwogICAgICAgICAgICAgYWRkTG9jYWxQYXJhbTxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKTsKLSAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtU3VyZmFjZVNjYWxpbmdJbmZvOjpvdXRwdXQoMHUsIFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dCgwdSwgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCksCisgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoMHUpLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKTsKICAgICAgICAgfQpAQCAtMTA0NSw3ICsxMDg2LDcgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBrZXlzOwogICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0S2V5c0ZvclBhcmFtSW5kZXgoZGVzYy0+aW5kZXgoKSwgJmtleXMpOwogICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAma2V5IDoga2V5cykgewotICAgICAgICAgICAgICAgIG1WZW5kb3JQYXJhbUluZGljZXMuaW5zZXJ0X29yX2Fzc2lnbihrZXksIGRlc2MtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIG1WZW5kb3JQYXJhbXMuaW5zZXJ0X29yX2Fzc2lnbihrZXksIGRlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTExMiw2ICsxMTUzLDEyIEBACiAgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAobUlucHV0U3VyZmFjZQorICAgICAgICAgICAgJiYgKGRvbWFpbiAmIG1PdXRwdXREb21haW4pCisgICAgICAgICAgICAmJiBtSW5wdXRTdXJmYWNlRGF0YXNwYWNlICE9IG1JbnB1dFN1cmZhY2UtPmdldERhdGFzcGFjZSgpKSB7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICBtSW5wdXRTdXJmYWNlRGF0YXNwYWNlID0gbUlucHV0U3VyZmFjZS0+Z2V0RGF0YXNwYWNlKCk7CisgICAgfQogCiAgICAgQUxPR1YoInVwZGF0ZWQgY29uZmlndXJhdGlvbiBoYXMgJXp1IHBhcmFtcyAoJXMpIiwgbUN1cnJlbnRDb25maWcuc2l6ZSgpLAogICAgICAgICAgICAgY2hhbmdlZCA/ICJDSEFOR0VEIiA6ICJubyBjaGFuZ2UiKTsKQEAgLTExODAsOCArMTIyNyw4IEBACiAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLAogICAgICAgICBEb21haW4gcG9ydERvbWFpbikgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0S2V5cygpKSB7Ci0gICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgbWFwcGVyc10gOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtYXBwZXJzKSB7CiAgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgcG9ydERvbWFpbikgPT0gMCAvLyBpbnB1dC1vdXRwdXQtY29kZWQtcmF3CiAgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgbURvbWFpbikgIT0gbURvbWFpbiAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKICAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBJU19SRUFEKSA9PSAwKSB7CkBAIC0xMjA1LDI2ICsxMjUyLDI2IEBACiAgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShrZXkuY19zdHIoKSwgaXRlbSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBib29sIGlucHV0ID0gKHBvcnREb21haW4gJiBEb21haW46OklTX0lOUFVUKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVuZG9yS2V5czsKLSAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZT4gJmVudHJ5IDogcmVmbGVjdGVkKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1JbmRpY2VzLmZpbmQoZW50cnkuZmlyc3QpOwotICAgICAgICBpZiAoaXQgPT0gbVZlbmRvclBhcmFtSW5kaWNlcy5lbmQoKSkgeworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgdmFsdWVdIDogcmVmbGVjdGVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1WZW5kb3JQYXJhbXMuZW5kKCkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuY291bnQoaXQtPnNlY29uZCkgPT0gMCkgeworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCA9IGl0LT5zZWNvbmQtPmluZGV4KCk7CisgICAgICAgIGlmIChtU3Vic2NyaWJlZEluZGljZXMuY291bnQoaW5kZXgpID09IDApIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIEZvciB2ZW5kb3IgcGFyYW1ldGVycywgd2Ugb25seSBjYXJlIGFib3V0IGRpcmVjdGlvbgotICAgICAgICBpZiAoKGlucHV0ICYmICFpdC0+c2Vjb25kLmZvcklucHV0KCkpCi0gICAgICAgICAgICAgICAgfHwgKCFpbnB1dCAmJiAhaXQtPnNlY29uZC5mb3JPdXRwdXQoKSkpIHsKKyAgICAgICAgaWYgKChpbnB1dCAmJiAhaW5kZXguZm9ySW5wdXQoKSkKKyAgICAgICAgICAgICAgICB8fCAoIWlucHV0ICYmICFpbmRleC5mb3JPdXRwdXQoKSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJnZhbHVlID0gZW50cnkuc2Vjb25kOwogICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOwogICAgICAgICBBU3RyaW5nIHN0clZhbHVlOwpAQCAtMTIzNiwxMCArMTI4MywxMCBAQAogICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmZpbmQoJnN0clZhbHVlKSkgewogICAgICAgICAgICAgaXRlbS5zZXQoc3RyVmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGVudHJ5LmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGtleS5jX3N0cigpKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1zZy0+c2V0SXRlbShlbnRyeS5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgbXNnLT5zZXRJdGVtKGtleS5jX3N0cigpLCBpdGVtKTsKICAgICB9CiAKICAgICB7IC8vIGNvbnZlcnQgZnJvbSBDb2RlYyAyLjAgcmVjdCB0byBNZWRpYUZvcm1hdCByZWN0IGFuZCBhZGQgY3JvcCByZWN0IGlmIG5vdCBwcmVzZW50CkBAIC0xMjk5LDkgKzEzNDYsNDYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFJlbW92ZSBLRVlfQUFDX1NCUl9NT0RFIGZyb20gU0RLIG1lc3NhZ2UgaWYgaXQgaXMgb3V0c2lkZSBzdXBwb3J0ZWQgcmFuZ2UKKyAgICAvLyBhcyBTREsgZG9lc24ndCBoYXZlIGEgd2F5IHRvIHNpZ25hbCBkZWZhdWx0IHNiciBtb2RlIGJhc2VkIG9uIHByb2ZpbGUgYW5kCisgICAgLy8gcmVxdWlyZXMgdGhhdCB0aGUga2V5IGlzbid0IHByZXNlbnQgaW4gZm9ybWF0IHRvIHNpZ25hbCB0aGF0CisgICAgaW50IHNick1vZGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9BQUNfU0JSX01PREUsICZzYnJNb2RlKSAmJiAoc2JyTW9kZSA8IDAgfHwgc2JyTW9kZSA+IDIpKSB7CisgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZShLRVlfQUFDX1NCUl9NT0RFKSk7CisgICAgfQorCiAgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgLy8gbW92ZSBkZWZhdWx0IGNvbG9yIHRvIGNvbG9yIGFzcGVjdCBpZiBub3QgcmVhZCBmcm9tIHRoZSBjb21wb25lbnQKKyAgICAgICAgaW50MzJfdCB0bXA7CisgICAgICAgIGludDMyX3QgcmFuZ2U7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZGVmYXVsdC1jb2xvci1yYW5nZSIsICZyYW5nZSkpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImRlZmF1bHQtY29sb3ItcmFuZ2UiKSk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJkZWZhdWx0LWNvbG9yLXRyYW5zZmVyIiwgJnRyYW5zZmVyKSkgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiZGVmYXVsdC1jb2xvci10cmFuc2ZlciIpKTsKKyAgICAgICAgfQogICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZGVmYXVsdC1jb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImNvbG9yLXByaW1hcmllcyIsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItcHJpbWFyaWVzIiwgcHJpbWFyaWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiZGVmYXVsdC1jb2xvci1wcmltYXJpZXMiKSk7CisgICAgICAgIH0KICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImRlZmF1bHQtY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjb2xvci1tYXRyaXgiLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImRlZmF1bHQtY29sb3ItbWF0cml4IikpOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKICAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CiAgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOwpAQCAtMTMxNCw3ICsxMzk4LDYgQEAKICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItbWF0cml4IikpOwogICAgICAgICB9CiAKLQogICAgICAgICAvLyBjYWxjdWxhdGUgZGF0YXNwYWNlIGZvciByYXcgZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBzcGVjaWZpZWQgYnkgY29tcG9uZW50LCBvciBpZgogICAgICAgICAvLyB1c2luZyBzdXJmYWNlIHdpdGggdW5zcGVjaWZpZWQgYXNwZWN0cyAoYXMgdGhvc2UgbXVzdCBiZSBkZWZhdWx0ZWQgd2hpY2ggbWF5IGNoYW5nZQogICAgICAgICAvLyB0aGUgZGF0YXNwYWNlKQpAQCAtMTM1Miw2ICsxNDM1LDIzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlID0gbUlucHV0U3VyZmFjZS0+Z2V0RGF0YXNwYWNlKCk7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpOworICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbURhdGFTcGFjZShkYXRhc3BhY2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbwogCiAgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOwpAQCAtMTM5MywyMiArMTQ5MywyMiBAQAogICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CiAgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKICAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOwotICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKLSAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKICAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLnkiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi54IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS55IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWZhbGwiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NDMsOCArMTc0Myw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoImZpbHRlcmVkICVzIHRvICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAotICAgICAgICAgICAgZmlsdGVyZWQuZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgQUxPR1YoImZpbHRlciBzcmMgbXNnICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKKyAgICBBTE9HVigiZmlsdGVyIGRzdCBwYXJhbXMgJXMiLCBmaWx0ZXJlZC5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKICAgICByZXR1cm4gZmlsdGVyZWQ7CiB9CiAKQEAgLTE3NjksOCArMTg2OSw4MSBAQAogc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb0FsbFZlbmRvclBhcmFtcygKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAogICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7Ci0gICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkluZGV4PiAmZW50cnkgOiBtVmVuZG9yUGFyYW1JbmRpY2VzKSB7Ci0gICAgICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoZW50cnkuc2Vjb25kKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJltwYXRoLCBkZXNjXSA6IG1WZW5kb3JQYXJhbXMpIHsKKyAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmluc2VydChkZXNjLT5pbmRleCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKGNvbmZpZ3VyYWJsZSwge30sIGJsb2NraW5nKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgeworICAgIGlmICghbmFtZXMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbmFtZXMtPmNsZWFyKCk7CisgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcworICAgIGZvciAoY29uc3QgYXV0byAmW2tleSwgZGVzY10gOiBtVmVuZG9yUGFyYW1zKSB7CisgICAgICAgIG5hbWVzLT5wdXNoX2JhY2soa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmRlc2NyaWJlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gVE9ETzogZXhwYW5kIHRvIHN0YW5kYXJkIHBhcmFtcworICAgIGRlc2MtPm5hbWUgPSBuYW1lOworICAgIHN3aXRjaCAobVBhcmFtVXBkYXRlci0+Z2V0VHlwZUZvcktleShuYW1lKSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOgorICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlSW50MzI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICAgICAgICAgIGRlc2MtPnR5cGUgPSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlRmxvYXQ7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGRlc2MtPnR5cGUgPSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICBkZXNjLT50eXBlID0gQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzdWJzY3JpYmVUb1ZlbmRvckNvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5hbWVzKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChpdCA9PSBtVmVuZG9yUGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgbm90IGEgcmVjb2duaXplZCB2ZW5kb3IgcGFyYW1ldGVyOyBpZ25vcmVkLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuaW5zZXJ0KGl0LT5zZWNvbmQtPmluZGV4KCkpOworICAgIH0KKyAgICByZXR1cm4gc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29uZmlndXJhYmxlLCB7fSwgYmxvY2tpbmcpOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnVuc3Vic2NyaWJlRnJvbVZlbmRvckNvbmZpZ1VwZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiAmY29uZmlndXJhYmxlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5hbWVzKSB7CisgICAgICAgIGF1dG8gaXQgPSBtVmVuZG9yUGFyYW1zLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChpdCA9PSBtVmVuZG9yUGFyYW1zLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgiJXMgaXMgbm90IGEgcmVjb2duaXplZCB2ZW5kb3IgcGFyYW1ldGVyOyBpZ25vcmVkLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZXJhc2UoaXQtPnNlY29uZC0+aW5kZXgoKSk7CiAgICAgfQogICAgIHJldHVybiBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb25maWd1cmFibGUsIHt9LCBibG9ja2luZyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKaW5kZXggMjg5NTc0Ni4uNDE3Yjc3MyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApAQCAtMzUsNiArMzUsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CitzdHJ1Y3QgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yOworY2xhc3MgTmF0aXZlSGFuZGxlOwogc3RydWN0IFN0YW5kYXJkUGFyYW1zOwogCiAvKioKQEAgLTEyMyw2ICsxMjUsNyBAQAogCiAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CiAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZz4gbUlTQ29uZmlnOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1JbnB1dFN1cmZhY2VEYXRhc3BhY2U7CiAKICAgICAvLy8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gVXBkYXRlZCBhZnRlciBjb25maWd1cmUoKSBhbmQgYmFzZWQgb24gY29uZmlnVXBkYXRlIGluCiAgICAgLy8vIG9uV29ya0RvbmUKQEAgLTEzNiwxMSArMTM5LDE1IEBACiAgICAgLy8vIEZvciBub3cgc3VwcG9ydCBhIHZhbGlkYXRpb24gZnVuY3Rpb24uCiAgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIExvY2FsUGFyYW1WYWxpZGF0b3I+IG1Mb2NhbFBhcmFtczsKIAotICAgIC8vLyBWZW5kb3IgZmllbGQgbmFtZSAtPiBpbmRleCBtYXAuCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEMyUGFyYW06OkluZGV4PiBtVmVuZG9yUGFyYW1JbmRpY2VzOworICAgIC8vLyBWZW5kb3IgZmllbGQgbmFtZSAtPiBkZXNjIG1hcC4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVZlbmRvclBhcmFtczsKIAogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtTGFzdENvbmZpZzsKIAorICAgIC8vLyBUdW5uZWxlZCBjb2RlY3MKKyAgICBib29sIG1UdW5uZWxlZDsKKyAgICBzcDxOYXRpdmVIYW5kbGU+IG1TaWRlYmFuZEhhbmRsZTsKKwogICAgIENDb2RlY0NvbmZpZygpOwogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLApAQCAtMzIxLDYgKzMyOCw0MSBAQAogICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUXVlcmllcyBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhbmQgcHV0IHRoZSBrZXlzIHRvIHxuYW1lc3wuCisgICAgICogVE9ETzogY3VycmVudGx5IHRoaXMgbWV0aG9kIHF1ZXJpZXMgdmVuZG9yIHBhcmFtZXRlciBrZXlzIG9ubHkuCisgICAgICoKKyAgICAgKiBccmV0dXJuIE9LIGlmIHN1Y2Nlc3NmdWwuCisgICAgICogICAgICAgICBCQURfVkFMVUUgaWYgfG5hbWVzfCBpcyBudWxscHRyLgorICAgICAqLworICAgIHN0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKTsKKworICAgIC8qKgorICAgICAqIERlc2NyaWJlIHRoZSBwYXJhbWV0ZXIgd2l0aCB8bmFtZXwsIGZpbGxpbmcgdGhlIGluZm9ybWF0aW9uIGludG8gfGRlc2N8CisgICAgICogVE9ETzogY3VycmVudGx5IHRoaXMgbWV0aG9kIHdvcmtzIG9ubHkgZm9yIHZlbmRvciBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsLgorICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHxkZXNjfCBpcyBudWxscHRyLgorICAgICAqICAgICAgICAgTkFNRV9OT1RfRk9VTkQgaWYgfG5hbWV8IGlzIG5vdCBhIHJlY29nbml6ZWQgcGFyYW1ldGVyIG5hbWUuCisgICAgICovCisgICAgc3RhdHVzX3QgZGVzY3JpYmUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYyk7CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBmb3IgfG5hbWVzfCBhbmQgc3Vic2NyaWJlIHRvIHRoZW0uCisgICAgICovCisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9WZW5kb3JDb25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+ICZjb25maWd1cmFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLyoqCisgICAgICogRmluZCBjb3JyZXNwb25kaW5nIGluZGljZXMgZm9yIHxuYW1lc3wgYW5kIHVuc3Vic2NyaWJlIGZyb20gdGhlbS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCB1bnN1YnNjcmliZUZyb21WZW5kb3JDb25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+ICZjb25maWd1cmFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCiBwcml2YXRlOgogCiAgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcAppbmRleCAyNWU3ZGE5Li40MDcwNDc4IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJDb2RlYzJCdWZmZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CkBAIC0yMTEsMjEgKzIxMiwyNCBAQAogICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgogICAgICAqCiAgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKLSAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKLSAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKLSAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKiBccGFyYW0gZm9ybWF0IGJ1ZmZlciBmb3JtYXQKICAgICAgKiBccGFyYW0gY29weSB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgdXNlZCBmb3IgY29weSBvciBub3QKICAgICAgKi8KICAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAotICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCwgYm9vbCBjb3B5KQorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGJvb2wgY29weSkKICAgICAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgICAgIG1WaWV3KHZpZXcpLAogICAgICAgICAgIG1XaWR0aCh2aWV3LndpZHRoKCkpLAogICAgICAgICAgIG1IZWlnaHQodmlldy5oZWlnaHQoKSksCi0gICAgICAgICAgbUNvbG9yRm9ybWF0KGNvbG9yRm9ybWF0KSwKICAgICAgICAgICBtQWxsb2NhdGVkRGVwdGgoMCksCiAgICAgICAgICAgbUJhY2tCdWZmZXJTaXplKDApLAogICAgICAgICAgIG1NZWRpYUltYWdlKG5ldyBBQnVmZmVyKHNpemVvZihNZWRpYUltYWdlMikpKSB7CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJm1DbGllbnRDb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICB9CisgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZtQ29tcG9uZW50Q29sb3JGb3JtYXQpKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50Q29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgfQogICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CiAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB2aWV3LmVycm9yKCkgPSAlZCIsIHZpZXcuZXJyb3IoKSk7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwpAQCAtMjQ2LDY4ICsyNTAsNTcgQEAKICAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gYWxpZ24odmlldy5jcm9wKCkud2lkdGgsIDIpICogZGl2VXAobGF5b3V0LnBsYW5lc1swXS5hbGxvY2F0ZWREZXB0aCwgOHUpOwogICAgICAgICB1aW50MzJfdCB2U3RyaWRlID0gYWxpZ24odmlldy5jcm9wKCkuaGVpZ2h0LCAyKTsKIAorICAgICAgICBib29sIHRyeVdyYXBwaW5nID0gIWNvcHk7CisKICAgICAgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgewotICAgICAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogewogICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOwogICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8geVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm8gdlBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgICAgICAgICAgICAgaWYgKHlQbGFuZS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX1kKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHVQbGFuZS5jaGFubmVsICE9IEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB2UGxhbmUuY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWIGxheW91dCIpOwogICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvcHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluUHRyID0gbVZpZXcuZGF0YSgpWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1heFB0ciA9IG1WaWV3LmRhdGEoKVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldChtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IG1heE9mZnNldCA9IHBsYW5lLm1heE9mZnNldChtV2lkdGgsIG1IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWluUHRyID4gbVZpZXcuZGF0YSgpW2ldICsgbWluT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heFB0ciA8IG1WaWV3LmRhdGEoKVtpXSArIG1heE9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lU2l6ZSArPSBzdGQ6OmFicyhwbGFuZS5yb3dJbmMpICogYWxpZ24obUhlaWdodCwgNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkaXZVcChtQWxsb2NhdGVkRGVwdGgsIDh1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyByaXNreSBhcyByZWFkaW5nL3dyaXRpbmcgZGF0YSBvdXQgb2YgYm91bmQgcmVzdWx0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgaW4gYW4gdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQgZ3JhbGxvYyBkb2VzIGFzc3VtZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBjb250aWd1b3VzIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Db2xJbmMgPSBwbGFuZS5jb2xJbmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVJvd0luYyA9IHBsYW5lLnJvd0luYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1WZXJ0U3Vic2FtcGxpbmcgPSBwbGFuZS5yb3dTYW1wbGluZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFB0ciAtIG1pblB0ciArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCB5dXY0MjA4ODggPSB5UGxhbmUucm93U2FtcGxpbmcgPT0gMSAmJiB5UGxhbmUuY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgdVBsYW5lLnJvd1NhbXBsaW5nID09IDIgJiYgdVBsYW5lLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHZQbGFuZS5yb3dTYW1wbGluZyA9PSAyICYmIHZQbGFuZS5jb2xTYW1wbGluZyA9PSAyOworICAgICAgICAgICAgICAgIGlmICh5dXY0MjA4ODgpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSA4IHx8IHBsYW5lLmJpdERlcHRoICE9IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXY0MjA4ODggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKLQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHl1djQyMDg4OCA9IHl1djQyMDg4OCAmJiB5UGxhbmUuY29sSW5jID09IDEgJiYgdVBsYW5lLnJvd0luYyA9PSB2UGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IGNvcHlGb3JtYXQgPSBtQ2xpZW50Q29sb3JGb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKHl1djQyMDg4OCAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgPT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVQbGFuZS5jb2xJbmMgPT0gMiAmJiB2UGxhbmUuY29sSW5jID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVQbGFuZS5jb2xJbmMgPT0gMSAmJiB2UGxhbmUuY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Rm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnRfZm10PTB4JXggeTp7Y29sSW5jPSVkIHJvd0luYz0lZH0gdTp7Y29sSW5jPSVkIHJvd0luYz0lZH0gIgorICAgICAgICAgICAgICAgICAgICAgICAgInY6e2NvbEluYz0lZCByb3dJbmM9JWR9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHlQbGFuZS5jb2xJbmMsIHlQbGFuZS5yb3dJbmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1UGxhbmUuY29sSW5jLCB1UGxhbmUucm93SW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgdlBsYW5lLmNvbEluYywgdlBsYW5lLnJvd0luYyk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjb3B5Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tT2Zmc2V0ID0gMDsKQEAgLTMyNyw2ICszMjAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tUm93SW5jID0gc3RyaWRlIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlXcmFwcGluZyAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgIT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IHl1djQyMDg4OCAmJiB1UGxhbmUuY29sSW5jID09IDEgJiYgdlBsYW5lLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMgKiAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3LmRhdGEoKVswXSA8IHZpZXcuZGF0YSgpWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2aWV3LmRhdGEoKVsxXSA8IHZpZXcuZGF0YSgpWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgpAQCAtMzQ4LDY0ICszNDgsMTY1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlXcmFwcGluZyAmJiBtQ2xpZW50Q29sb3JGb3JtYXQgIT0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IHl1djQyMDg4OCAmJiB1UGxhbmUuY29sSW5jID09IDIgJiYgdlBsYW5lLmNvbEluYyA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXcuZGF0YSgpWzBdIDwgdmlldy5kYXRhKClbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZpZXcuZGF0YSgpWzFdIDwgdmlldy5kYXRhKClbMl07CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVlAwMTA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Sb3dJbmMgPSBzdHJpZGUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1PZmZzZXQgPSBzdHJpZGUgKiB2U3RyaWRlICogMiArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZSAqIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUhvcml6U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1WZXJ0U3Vic2FtcGxpbmcgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVdyYXBwaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5V3JhcHBpbmcgPSB5UGxhbmUuYWxsb2NhdGVkRGVwdGggPT0gMTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5hbGxvY2F0ZWREZXB0aCA9PSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmFsbG9jYXRlZERlcHRoID09IDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUuYml0RGVwdGggPT0gMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5iaXREZXB0aCA9PSAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmJpdERlcHRoID09IDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB2UGxhbmUucmlnaHRTaGlmdCA9PSA2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93U2FtcGxpbmcgPT0gMSAmJiB5UGxhbmUuY29sU2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdVBsYW5lLnJvd1NhbXBsaW5nID09IDIgJiYgdVBsYW5lLmNvbFNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHZQbGFuZS5yb3dTYW1wbGluZyA9PSAyICYmIHZQbGFuZS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUuY29sSW5jID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVQbGFuZS5jb2xJbmMgPT0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdlBsYW5lLmNvbEluYyA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB5UGxhbmUucm93SW5jID09IHVQbGFuZS5yb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHlQbGFuZS5yb3dJbmMgPT0gdlBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gZnVsbHkgcGxhbmFyIGZvcm1hdCAtLS0gdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gaWYgd3JhcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGtlZXAgaW50ZXJsZWF2ZWQgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbEluYyA9IGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dJbmMgPSBzdHJpZGUgKiBjb2xJbmMgLyB5UGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IGNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tUm93SW5jID0gcm93SW5jOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Ib3JpelN1YnNhbXBsaW5nID0geVBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSB5UGxhbmUucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCA9IHJvd0luYyAqIHZTdHJpZGUgLyB5UGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luYyA9IHN0cmlkZSAqIGNvbEluYyAvIHVQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlVdLm1Db2xJbmMgPSBjb2xJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IHVQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tVmVydFN1YnNhbXBsaW5nID0gdVBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHJvd0luYyAqIHZTdHJpZGUgLyB1UGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd0luYyA9IHN0cmlkZSAqIGNvbEluYyAvIHZQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSBjb2xJbmM7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHJvd0luYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IHZQbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gdlBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKLSAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKLSAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFlVVkEgbGF5b3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKLSAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFJHQiBsYXlvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudENvbG9yRm9ybWF0LCBtQ29tcG9uZW50Q29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOworICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgTWVkaWFJbWFnZSBsYXlvdXQKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6Ci0gICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVR5cGUgPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9SR0JBOwotICAgICAgICAgICAgICAgIHN3aXRjaCAobUNvbG9yRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gbWVkaWEgaW1hZ2UKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JBRmxleGlibGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBQkdSODg4ODoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OgotICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJJbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBSR0JBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6ICVkIHBsYW5lcyBmb3IgUkdCQSBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKLSAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiB1bnJlY29nbml6ZWQgY29sb3IgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkgZm9yIFJHQkEgbGF5b3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IE1lZGlhSW1hZ2UgbGF5b3V0CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047Ci0gICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7Ci0gICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAocGxhbmUuY29sSW5jIDwgMCB8fCBwbGFuZS5yb3dJbmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5LW9ubHkgaWYgd2UgaGF2ZSBuZWdhdGl2ZSBjb2xJbmMvcm93SW5jCisgICAgICAgICAgICAgICAgICAgICAgICB0cnlXcmFwcGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVswXS5tT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lWzBdLm1Db2xJbmMgPSBzdGQ6OmFicyhwbGFuZS5jb2xJbmMpOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbMF0ubVJvd0luYyA9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYyk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVswXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbMF0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IHVucmVjb2duaXplZCBsYXlvdXQ6IGNvbG9yIGZvcm1hdCAoY2xpZW50ICVkIGNvbXBvbmVudCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDb2xvckZvcm1hdCwgbUNvbXBvbmVudENvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyeVdyYXBwaW5nKSB7CisgICAgICAgICAgICAvLyB0cnkgdG8gbWFwIGRpcmVjdGx5LiBjaGVjayBpZiB0aGUgcGxhbmVzIGFyZSBuZWFyIG9uZSBhbm90aGVyCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYXhQdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICBpbnQzMl90IHBsYW5lU2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBsYW5lU3RyaWRlID0gc3RkOjphYnMocGxhbmUucm93SW5jIC8gcGxhbmUuY29sSW5jKTsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG1pbk9mZnNldCA9IHBsYW5lLm1pbk9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCAvIHBsYW5lLmNvbFNhbXBsaW5nLCBtSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmcpOworICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoIC8gcGxhbmUuY29sU2FtcGxpbmcsIG1IZWlnaHQgLyBwbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgICAgICAgICAgaWYgKG1pblB0ciA+IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBtaW5QdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYXhQdHIgPCBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4UHRyID0gbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGFuZVNpemUgKz0gcGxhbmVTdHJpZGUgKiBkaXZVcChtQWxsb2NhdGVkRGVwdGgsIDh1KQorICAgICAgICAgICAgICAgICAgICAgICAgKiBhbGlnbihtSGVpZ2h0LCA2NCkgLyBwbGFuZS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1pblB0ciA9PSBtVmlldy5kYXRhKClbMF0gJiYgKG1heFB0ciAtIG1pblB0ciArIDEpIDw9IHBsYW5lU2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzCisgICAgICAgICAgICAgICAgLy8gICAgICAgIGluIGFuIHVuZGVmaW5lZCBiZWhhdmlvciwgYnV0IGdyYWxsb2MgZG9lcyBhc3N1bWUgYQorICAgICAgICAgICAgICAgIC8vICAgICAgICBjb250aWd1b3VzIG1hcHBpbmcKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tT2Zmc2V0ID0gbVZpZXcuZGF0YSgpW2ldIC0gbWluUHRyOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Sb3dJbmMgPSBwbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tSG9yaXpTdWJzYW1wbGluZyA9IHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA9IG5ldyBBQnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCAqPihtaW5QdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyIC0gbWluUHRyICsgMSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvbnZlcnRlcjogd3JhcHBlZCAoY2FwYWNpdHk9JXp1KSIsIG1XcmFwcGVkLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBtZWRpYUltYWdlLT5tTnVtUGxhbmVzID0gbGF5b3V0Lm51bVBsYW5lczsKICAgICAgICAgbWVkaWFJbWFnZS0+bVdpZHRoID0gdmlldy5jcm9wKCkud2lkdGg7CkBAIC00MjgsMTIgKzUyOSwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSBtQWxsb2NhdGVkRGVwdGggfHwgcGxhbmUuYml0RGVwdGggIT0gYml0RGVwdGgpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZGlmZmVyZW50IGFsbG9jYXRlZERlcHRoL2JpdERlcHRoIHBlciBwbGFuZSB1bnN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIEFMT0dEKCJkaWZmZXJlbnQgYWxsb2NhdGVkRGVwdGgvYml0RGVwdGggcGVyIHBsYW5lIHVuc3VwcG9ydGVkIik7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWZmZXJTaXplICs9IHN0cmlkZSAqIHZTdHJpZGUKLSAgICAgICAgICAgICAgICAgICAgLyBwbGFuZS5yb3dTYW1wbGluZyAvIHBsYW5lLmNvbFNhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmcgKiBkaXZVcChtQWxsb2NhdGVkRGVwdGgsIDh1KTsKICAgICAgICAgfQogCiAgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CkBAIC00ODgsNyArNTg5LDggQEAKICAgICBjb25zdCBDMkdyYXBoaWNWaWV3IG1WaWV3OwogICAgIHVpbnQzMl90IG1XaWR0aDsKICAgICB1aW50MzJfdCBtSGVpZ2h0OwotICAgIGludDMyX3QgbUNvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgaW50MzJfdCBtQ2xpZW50Q29sb3JGb3JtYXQ7ICAvLy88IFNESyBjb2xvciBmb3JtYXQgZm9yIE1lZGlhSW1hZ2UKKyAgICBpbnQzMl90IG1Db21wb25lbnRDb2xvckZvcm1hdDsgIC8vLzwgU0RLIGNvbG9yIGZvcm1hdCBmcm9tIGNvbXBvbmVudAogICAgIHNwPEFCdWZmZXI+IG1XcmFwcGVkOyAgLy8vPCB3cmFwcGVkIGJ1ZmZlciAoaWYgd2UgY2FuIG1hcCBDMkJ1ZmZlciB0byBhbiBBQnVmZmVyKQogICAgIHVpbnQzMl90IG1BbGxvY2F0ZWREZXB0aDsKICAgICB1aW50MzJfdCBtQmFja0J1ZmZlclNpemU7CkBAIC01MTcsMTAgKzYxOSw3IEBACiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKLSAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKLQotICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKHZpZXcsIGNvbG9yRm9ybWF0LCBmYWxzZSAvKiBjb3B5ICovKTsKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcih2aWV3LCBmb3JtYXQsIGZhbHNlIC8qIGNvcHkgKi8pOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTU3OCw3ICs2NzcsMjYgQEAKIH0KIAogc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBHcmFwaGljTWV0YWRhdGFCdWZmZXI6OmFzQzJCdWZmZXIoKSB7Ci0jaWZuZGVmIF9fTFA2NF9fCisjaWZkZWYgX19MUDY0X18KKyAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgc19jaGVja09uY2U7CisgICAgc3RhdGljIGJvb2wgc19pczY0Yml0T2sge3RydWV9OworICAgIHN0ZDo6Y2FsbF9vbmNlKHNfY2hlY2tPbmNlLCBbJl0oKXsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWJpMzJsaXN0ID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8ucHJvZHVjdC5jcHUuYWJpbGlzdDMyIiwgIiIpOworICAgICAgICBpZiAoIWFiaTMybGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBpbnQzMl90IGlucHV0U3VyZmFjZVNldHRpbmcgPQorICAgICAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgiZGVidWcuc3RhZ2VmcmlnaHQuYzJpbnB1dHN1cmZhY2UiLCBpbnQzMl90KDApKTsKKyAgICAgICAgICAgIHNfaXM2NGJpdE9rID0gaW5wdXRTdXJmYWNlU2V0dGluZyAhPSAwOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAoIXNfaXM2NGJpdE9rKSB7CisgICAgICAgIEFMT0dFKCJHcmFwaGljTWV0YWRhdGFCdWZmZXIgZG9lcyBub3Qgd29yayBpbiAzMis2NCBzeXN0ZW0gaWYgY29tcGlsZWQgYXMgNjQtYml0IG9iamVjdCJcCisgICAgICAgICAgICAgICJ3aGVuIGRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIGlzIHNldCB0byAwIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyNlbmRpZgorCiAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqbWV0YSA9IChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpOwogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZmZlciA9IChBTmF0aXZlV2luZG93QnVmZmVyICopbWV0YS0+cEJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKQEAgLTU5OCw2ICs3MTYsOCBAQAogICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvYy0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CiAgICAgaWYgKGVyciAhPSBDMl9PSykgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHdyYXAgVmlkZW9OYXRpdmVNZXRhZGF0YSBpbnRvIEMyR3JhcGhpY0FsbG9jYXRpb24iKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKQEAgLTYxMSwxMCArNzMxLDYgQEAKICAgICB9CiAgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAogICAgICAgICAgICAgYmxvY2stPnNoYXJlKEMyUmVjdChidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCksIEMyRmVuY2UoKSkpOwotI2Vsc2UKLSAgICBBTE9HRSgiR3JhcGhpY01ldGFkYXRhQnVmZmVyIGRvZXMgbm90IHdvcmsgb24gNjQtYml0IGFyY2giKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSNlbmRpZgogfQogCiAvLyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcgpAQCAtNjM0LDEwICs3NTAsNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpKSk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IGhvbGRlcjsKIAotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKLSAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKLQotICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKCp2aWV3LCBjb2xvckZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CisgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoKnZpZXcsIGZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CiAgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgewogICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtNzI5LDEyICs4NDIsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKLSAgICAvLyBGSVhNRTogZm9ybWF0KCkgaXMgbm90IGNvbnN0LCBidXQgd2UgY2Fubm90IGNoYW5nZSBpdCwgc28gZG8gYSBjb25zdCBjYXN0IGhlcmUKLSAgICBjb25zdF9jYXN0PENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyICo+KHRoaXMpLT5mb3JtYXQoKS0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpOwotCiAgICAgR3JhcGhpY1ZpZXcyTWVkaWFJbWFnZUNvbnZlcnRlciBjb252ZXJ0ZXIoCi0gICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksIGNvbG9yRm9ybWF0LCB0cnVlIC8qIGNvcHkgKi8pOworICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLAorICAgICAgICAgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgICAgICAgICBjb25zdF9jYXN0PENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyICo+KHRoaXMpLT5mb3JtYXQoKSwKKyAgICAgICAgICAgIHRydWUgLyogY29weSAqLyk7CiAgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgewogICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC03NTIsMTEgKzg2NCw5IEBACiAgICAgICAgIHNldFJhbmdlKDAsIDApOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwotICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CiAKICAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQsIHRydWUgLyogY29weSAqLyk7CisgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCksIGZvcm1hdCgpLCB0cnVlIC8qIGNvcHkgKi8pOwogICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKICAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBjb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKaW5kZXggYjExMjI0OS4uN2M0YmZiNiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOwogfQogCi12b2lkIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisvLyByZXR1cm5zIHRydWUgaWYgY29tcG9uZW50IGFkdmVydGlzZWQgc3VwcG9ydGVkIHByb2ZpbGUgbGV2ZWwocykKK2Jvb2wgYWRkU3VwcG9ydGVkUHJvZmlsZUxldmVscygKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiBpbnRmLAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyICpjYXBzLAogICAgICAgICBjb25zdCBUcmFpdHMmIHRyYWl0LCBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlKSB7CkBAIC04NywxMiArODgsMTIgQEAKICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhwcm9maWxlUXVlcnksIEMyX0RPTlRfQkxPQ0spOwogICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgcHJvZmlsZXMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKICAgICBpZiAoZXJyICE9IEMyX09LIHx8IHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0spIHsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gd2Ugb25seSBoYW5kbGUgZW51bWVyYXRlZCB2YWx1ZXMKICAgICBpZiAocHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSCkBAIC0xMDMsMTEgKzEwNCwxNiBAQAogICAgIGMyX3N0YXR1c190IGVycjEgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygmcGFyYW1EZXNjcyk7CiAgICAgaWYgKGVycjEgPT0gQzJfT0spIHsKICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgewotICAgICAgICAgICAgc3dpdGNoICgodWludDMyX3QpZGVzYy0+aW5kZXgoKSkgewotICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IGRlc2MtPmluZGV4KCk7CisgICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIG9uIHJhdyBwb3J0cworICAgICAgICAgICAgaWYgKCEoZW5jb2RlciA/IHR5cGUuZm9ySW5wdXQoKSA6IHR5cGUuZm9yT3V0cHV0KCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpDT1JFX0lOREVYOgogICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyMTBQbHVzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6Q09SRV9JTkRFWDoKICAgICAgICAgICAgICAgICBzdXBwb3J0c0hkciA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMTIwLDYgKzEyNiw4IEBACiAgICAgc3VwcG9ydHNIZHIgfD0gKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpOwogICAgIHN1cHBvcnRzSGRyIHw9IChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVYxKTsKIAorICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKKwogICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHByb2ZpbGUgOiBwcm9maWxlUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgewogICAgICAgICBwbC5wcm9maWxlID0gKEMyQ29uZmlnOjpwcm9maWxlX3QpcHJvZmlsZS5yZWY8dWludDMyX3Q+KCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKQEAgLTE2MCw2ICsxNjgsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CiAgICAgICAgIH0KKyAgICAgICAgYWRkZWQgPSB0cnVlOwogCiAgICAgICAgIC8vIGZvciBILjI2MyBhbHNvIGFkdmVydGlzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgaWYgdGhlCiAgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMApAQCAtMTgzLDYgKzE5Miw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIGFkZGVkOwogfQogCiB2b2lkIGFkZFN1cHBvcnRlZENvbG9yRm9ybWF0cygKQEAgLTMzMyw2ICszNDMsNTkgQEAKICAgICAvLyBwYXJzZSBkZWZhdWx0IFhNTCBmaWxlcwogICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CiAKKyAgICAvLyBUaGUgbWFpbmxpbmUgbW9kdWxlcyBmb3IgbWVkaWEgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBzb21lIGNvZGVjIHNoYXBpbmcgaW5mb3JtYXRpb24uCisgICAgLy8gQmFzZWQgb24gdmVuZG9yIHBhcnRpdGlvbiBTREssIGFuZCB0aGUgYnJhbmQvcHJvZHVjdC9kZXZpY2UgaW5mb3JtYXRpb24KKyAgICAvLyAoZXhwZWN0IHRvIGJlIGVtcHR5IGluIGFsbW9zdCBhbHdheXMpCisgICAgLy8KKyAgICB7CisgICAgICAgIC8vIGdldCBidWlsZCBpbmZvIHNvIHdlIGtub3cgd2hhdCBmaWxlIHRvIHNlYXJjaAorICAgICAgICAvLyByby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQKKyAgICAgICAgc3RkOjpzdHJpbmcgZmluZ2VycHJpbnQgPSBiYXNlOjpHZXRQcm9wZXJ0eSgicm8udmVuZG9yLmJ1aWxkLmZpbmdlcnByaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJyYW5kL3Byb2R1Y3QvZGV2aWNlOiIpOworICAgICAgICBBTE9HVigicHJvcGVydHlfZ2V0IGZvciByby52ZW5kb3IuYnVpbGQuZmluZ2VycHJpbnQgPT0gJyVzJyIsIGZpbmdlcnByaW50LmNfc3RyKCkpOworCisgICAgICAgIC8vIHJvLnZlbmRvci5idWlsZC52ZXJzaW9uLnNkaworICAgICAgICBzdGQ6OnN0cmluZyBzZGsgPSBiYXNlOjpHZXRQcm9wZXJ0eSgicm8udmVuZG9yLmJ1aWxkLnZlcnNpb24uc2RrIiwgIjAiKTsKKyAgICAgICAgQUxPR1YoInByb3BlcnR5X2dldCBmb3Igcm8udmVuZG9yLmJ1aWxkLnZlcnNpb24uc2RrID09ICclcyciLCBzZGsuY19zdHIoKSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgYnJhbmQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHByb2R1Y3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKKyAgICAgICAgc2l6ZV90IHBvczE7CisgICAgICAgIHBvczEgPSBmaW5nZXJwcmludC5maW5kKCcvJyk7CisgICAgICAgIGlmIChwb3MxICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBicmFuZCA9IGZpbmdlcnByaW50LnN1YnN0cigwLCBwb3MxKTsKKyAgICAgICAgICAgIHNpemVfdCBwb3MyID0gZmluZ2VycHJpbnQuZmluZCgnLycsIHBvczErMSk7CisgICAgICAgICAgICBpZiAocG9zMiAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBmaW5nZXJwcmludC5zdWJzdHIocG9zMSsxLCBwb3MyIC0gcG9zMSAtIDEpOworICAgICAgICAgICAgICAgIHNpemVfdCBwb3MzID0gZmluZ2VycHJpbnQuZmluZCgnLycsIHBvczIrMSk7CisgICAgICAgICAgICAgICAgaWYgKHBvczMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gZmluZ2VycHJpbnQuc3Vic3RyKHBvczIrMSwgcG9zMyAtIHBvczIgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBvczQgPSBkZXZpY2UuZmluZCgnOicpOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zNCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLnJlc2l6ZShwb3M0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJwYXJzZWQ6IHNkayAnJXMnIGJyYW5kICclcycgcHJvZHVjdCAnJXMnIGRldmljZSAnJXMnIiwKKyAgICAgICAgICAgIHNkay5jX3N0cigpLCBicmFuZC5jX3N0cigpLCBwcm9kdWN0LmNfc3RyKCksIGRldmljZS5jX3N0cigpKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBiYXNlID0gIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9mb3JtYXRzaGFwZXIiOworCisgICAgICAgIC8vIGxvb2tpbmcgaW4gdGhlc2UgZGlyZWN0b3JpZXMgd2l0aGluIHRoZSBhcGV4CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVQYXRobmFtZXMgPSB7CisgICAgICAgICAgICBiYXNlICsgIi8iICsgc2RrICsgIi8iICsgYnJhbmQgKyAiLyIgKyBwcm9kdWN0ICsgIi8iICsgZGV2aWNlLAorICAgICAgICAgICAgYmFzZSArICIvIiArIHNkayArICIvIiArIGJyYW5kICsgIi8iICsgcHJvZHVjdCwKKyAgICAgICAgICAgIGJhc2UgKyAiLyIgKyBzZGsgKyAiLyIgKyBicmFuZCwKKyAgICAgICAgICAgIGJhc2UgKyAiLyIgKyBzZGssCisgICAgICAgICAgICBiYXNlCisgICAgICAgIH07CisKKyAgICAgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoIHsgIm1lZGlhX2NvZGVjc19zaGFwaW5nLnhtbCIgfSwgbW9kdWxlUGF0aG5hbWVzKTsKKyAgICB9CisKICAgICBpZiAocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSAhPSBPSykgewogICAgICAgICBBTE9HRCgiWE1MIHBhcnNlciBubyBnb29kIik7CiAgICAgICAgIHJldHVybiBPSzsKQEAgLTU0Niw3ICs2MDksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKCFhZGRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKGludGYsIGNhcHMuZ2V0KCksIHRyYWl0LCBtZWRpYVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xOTMyNzk2NDYpIFRoaXMgd2lsbCBnZXQgZml4ZWQgaW4gQzJJbnRlcmZhY2VIZWxwZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gU29tZSBjb21wb25lbnRzIG1heSBub3QgYWR2ZXJ0aXNlIHN1cHBvcnRlZCB2YWx1ZXMgaWYgdGhleSB1c2UgYSBjb25zdAorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbSBmb3IgcHJvZmlsZS9sZXZlbCAodGhleSBzdXBwb3J0IG9ubHkgb25lIHByb2ZpbGUpLiBGb3Igbm93IGNvdmVyCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgVlA4IGhlcmUgdW50aWwgaXQgaXMgZml4ZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoVlA4UHJvZmlsZU1haW4sIFZQOExldmVsX1ZlcnNpb24wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA1NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuY3BwCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZyYW1lUmVhc3NlbWJsZXIiCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJGcmFtZVJlYXNzZW1ibGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrVG9sZXJhbmNlVXMgPSAxMDAwOyAgLy8gMW1zCisKK0ZyYW1lUmVhc3NlbWJsZXI6OkZyYW1lUmVhc3NlbWJsZXIoKQorICAgIDogbVVzYWdlezAsIDB9LAorICAgICAgbVNhbXBsZVJhdGUoMHUpLAorICAgICAgbUNoYW5uZWxDb3VudCgwdSksCisgICAgICBtRW5jb2RpbmcoQzJDb25maWc6OlBDTV8xNiksCisgICAgICBtQ3VycmVudE9yZGluYWwoezAsIDAsIDB9KSB7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgdWludDMyX3QgZnJhbWVTaXplLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZykgeworICAgIG1CbG9ja1Bvb2wgPSBwb29sOworICAgIG1Vc2FnZSA9IHVzYWdlOworICAgIG1GcmFtZVNpemUgPSBmcmFtZVNpemU7CisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CisgICAgbUVuY29kaW5nID0gZW5jb2Rpbmc7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6dXBkYXRlRnJhbWVTaXplKHVpbnQzMl90IGZyYW1lU2l6ZSkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtRnJhbWVTaXplID0gZnJhbWVTaXplOworfQorCit2b2lkIEZyYW1lUmVhc3NlbWJsZXI6OnVwZGF0ZVNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6dXBkYXRlQ2hhbm5lbENvdW50KHVpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50OworfQorCit2b2lkIEZyYW1lUmVhc3NlbWJsZXI6OnVwZGF0ZVBjbUVuY29kaW5nKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZykgeworICAgIGZpbmlzaEN1cnJlbnRCbG9jaygmbVBlbmRpbmdXb3JrKTsKKyAgICBtRW5jb2RpbmcgPSBlbmNvZGluZzsKK30KKwordm9pZCBGcmFtZVJlYXNzZW1ibGVyOjpyZXNldCgpIHsKKyAgICBmbHVzaCgpOworICAgIG1DdXJyZW50T3JkaW5hbCA9IHswLCAwLCAwfTsKKyAgICBtQmxvY2tQb29sLnJlc2V0KCk7CisgICAgbUZyYW1lU2l6ZS5yZXNldCgpOworICAgIG1TYW1wbGVSYXRlID0gMHU7CisgICAgbUNoYW5uZWxDb3VudCA9IDB1OworICAgIG1FbmNvZGluZyA9IEMyQ29uZmlnOjpQQ01fMTY7Cit9CisKK0ZyYW1lUmVhc3NlbWJsZXI6Om9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIG1GcmFtZVNpemUuaGFzX3ZhbHVlKCk7Cit9CisKK2MyX3N0YXR1c190IEZyYW1lUmVhc3NlbWJsZXI6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDB1CisgICAgICAgICAgICB8fCAhYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpdGVtcy0+c3BsaWNlKGl0ZW1zLT5lbmQoKSwgbVBlbmRpbmdXb3JrKTsKKworICAgIC8vIEZpbGwgbUN1cnJlbnRCbG9jaworICAgIGlmIChtQ3VycmVudEJsb2NrKSB7CisgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgYzJfY250cjY0X3QgZW5kVGltZXN0YW1wVXMgPSBtQ3VycmVudE9yZGluYWwudGltZXN0YW1wOworICAgICAgICBlbmRUaW1lc3RhbXBVcyArPSBieXRlc1RvU2FtcGxlcyhtV3JpdGVWaWV3LT5zaXplKCkpICogMTAwMDAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAodGltZVVzIDwgZW5kVGltZXN0YW1wVXMucGVlaygpKSB7CisgICAgICAgICAgICB1aW50NjRfdCBkaWZmVXMgPSAoZW5kVGltZXN0YW1wVXMgLSB0aW1lVXMpLnBlZWt1KCk7CisgICAgICAgICAgICBpZiAoZGlmZlVzID4ga1RvbGVyYW5jZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBnb2luZyBiYWNrIGluIHRpbWUgaW4gbGFyZ2UgYW1vdW50LgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGIvMTQ1NzAyMTM2CisgICAgICAgICAgICAgICAgQUxPR1coInRpbWVzdGFtcCBnb2luZyBiYWNrIGluIHRpbWUhIGZyb20gJWxsZCB0byAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWVzdGFtcFVzLnBlZWtsbCgpLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAvLyB0aW1lVXMgPj0gZW5kVGltZXN0YW1wVXMucGVlaygpCisgICAgICAgICAgICB1aW50NjRfdCBkaWZmVXMgPSAodGltZVVzIC0gZW5kVGltZXN0YW1wVXMpLnBlZWt1KCk7CisgICAgICAgICAgICBpZiAoZGlmZlVzID4ga1RvbGVyYW5jZVVzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBnb2luZyBmb3J3YXJkOyBhZGQgc2lsZW5jZSBhcyBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgc2l6ZV90IGdhcFNhbXBsZXMgPSB1c1RvU2FtcGxlcyhkaWZmVXMpOworICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmdTYW1wbGVzID0KKyAgICAgICAgICAgICAgICAgICAgKG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkgLSBtV3JpdGVWaWV3LT5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIC8gbUNoYW5uZWxDb3VudCAvIGJ5dGVzUGVyU2FtcGxlKCk7CisgICAgICAgICAgICAgICAgaWYgKGdhcFNhbXBsZXMgPCByZW1haW5pbmdTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBnYXBCeXRlcyA9IGdhcFNhbXBsZXMgKiBtQ2hhbm5lbENvdW50ICogYnl0ZXNQZXJTYW1wbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1Xcml0ZVZpZXctPmJhc2UoKSArIG1Xcml0ZVZpZXctPnNpemUoKSwgMHUsIGdhcEJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlVmlldy0+c2V0U2l6ZShtV3JpdGVWaWV3LT5zaXplKCkgKyBnYXBCeXRlcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoQ3VycmVudEJsb2NrKGl0ZW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRCbG9jaykgeworICAgICAgICAvLyBBcHBlbmQgdGhlIGRhdGEgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBibG9jaworICAgICAgICBzaXplX3QgY29weVNpemUgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzaXplX3QobVdyaXRlVmlldy0+Y2FwYWNpdHkoKSAtIG1Xcml0ZVZpZXctPnNpemUoKSkpOworICAgICAgICBtZW1jcHkobVdyaXRlVmlldy0+YmFzZSgpICsgbVdyaXRlVmlldy0+c2l6ZSgpLCBidWZmZXItPmRhdGEoKSwgY29weVNpemUpOworICAgICAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCkgKyBjb3B5U2l6ZSwgYnVmZmVyLT5zaXplKCkgLSBjb3B5U2l6ZSk7CisgICAgICAgIG1Xcml0ZVZpZXctPnNldFNpemUobVdyaXRlVmlldy0+c2l6ZSgpICsgY29weVNpemUpOworICAgICAgICBpZiAobVdyaXRlVmlldy0+c2l6ZSgpID09IG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRCbG9jayhpdGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgdGltZVVzICs9IGJ5dGVzVG9TYW1wbGVzKGNvcHlTaXplKSAqIDEwMDAwMDAgLyBtU2FtcGxlUmF0ZTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgIG1DdXJyZW50T3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CisgICAgICAgIG1DdXJyZW50T3JkaW5hbC5jdXN0b21PcmRpbmFsID0gdGltZVVzOworICAgIH0KKworICAgIHNpemVfdCBmcmFtZVNpemVCeXRlcyA9IG1GcmFtZVNpemUudmFsdWUoKSAqIG1DaGFubmVsQ291bnQgKiBieXRlc1BlclNhbXBsZSgpOworICAgIHdoaWxlIChidWZmZXItPnNpemUoKSA+IDApIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgICAgICAgICAgICBtQ3VycmVudEJsb2NrLAorICAgICAgICAgICAgICAgICJUaGVyZSdzIHJlbWFpbmluZyBkYXRhIGJ1dCB0aGUgcGVuZGluZyBibG9jayBpcyBub3QgZmlsbGVkICYgZmluaXNoZWQiKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUJsb2NrUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhmcmFtZVNpemVCeXRlcywgbVVzYWdlLCAmbUN1cnJlbnRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IGNvcHlTaXplID0gc3RkOjptaW4oYnVmZmVyLT5zaXplKCksIGZyYW1lU2l6ZUJ5dGVzKTsKKyAgICAgICAgbVdyaXRlVmlldyA9IG1DdXJyZW50QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAobVdyaXRlVmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Xcml0ZVZpZXctPmVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImJ1ZmZlcj17b2Zmc2V0PSV6dSBzaXplPSV6dX0gY29weVNpemU9JXp1IiwKKyAgICAgICAgICAgICAgICBidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSwgY29weVNpemUpOworICAgICAgICBtZW1jcHkobVdyaXRlVmlldy0+YmFzZSgpLCBidWZmZXItPmRhdGEoKSwgY29weVNpemUpOworICAgICAgICBtV3JpdGVWaWV3LT5zZXRPZmZzZXQoMHUpOworICAgICAgICBtV3JpdGVWaWV3LT5zZXRTaXplKGNvcHlTaXplKTsKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgY29weVNpemUsIGJ1ZmZlci0+c2l6ZSgpIC0gY29weVNpemUpOworICAgICAgICBpZiAoY29weVNpemUgPT0gZnJhbWVTaXplQnl0ZXMpIHsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRCbG9jayhpdGVtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IGVvcyA9IDA7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgeworICAgICAgICBmaW5pc2hDdXJyZW50QmxvY2soaXRlbXMpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBGcmFtZVJlYXNzZW1ibGVyOjpmbHVzaCgpIHsKKyAgICBtUGVuZGluZ1dvcmsuY2xlYXIoKTsKKyAgICBtV3JpdGVWaWV3LnJlc2V0KCk7CisgICAgbUN1cnJlbnRCbG9jay5yZXNldCgpOworfQorCit1aW50NjRfdCBGcmFtZVJlYXNzZW1ibGVyOjpieXRlc1RvU2FtcGxlcyhzaXplX3QgbnVtQnl0ZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVtQnl0ZXMgLyBtQ2hhbm5lbENvdW50IC8gYnl0ZXNQZXJTYW1wbGUoKTsKK30KKworc2l6ZV90IEZyYW1lUmVhc3NlbWJsZXI6OnVzVG9TYW1wbGVzKHVpbnQ2NF90IHVzKSBjb25zdCB7CisgICAgcmV0dXJuICh1cyAqIG1DaGFubmVsQ291bnQgKiBtU2FtcGxlUmF0ZSAvIDEwMDAwMDApOworfQorCit1aW50MzJfdCBGcmFtZVJlYXNzZW1ibGVyOjpieXRlc1BlclNhbXBsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1FbmNvZGluZyA9PSBDMkNvbmZpZzo6UENNXzgpID8gMQorICAgICAgICAgOiAobUVuY29kaW5nID09IEMyQ29uZmlnOjpQQ01fMTYpID8gMgorICAgICAgICAgOiAobUVuY29kaW5nID09IEMyQ29uZmlnOjpQQ01fRkxPQVQpID8gNCA6IDA7Cit9CisKK3ZvaWQgRnJhbWVSZWFzc2VtYmxlcjo6ZmluaXNoQ3VycmVudEJsb2NrKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKSB7CisgICAgaWYgKCFtQ3VycmVudEJsb2NrKSB7CisgICAgICAgIC8vIE5vLW9wCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1Xcml0ZVZpZXctPnNpemUoKSA8IG1Xcml0ZVZpZXctPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgbWVtc2V0KG1Xcml0ZVZpZXctPmJhc2UoKSArIG1Xcml0ZVZpZXctPnNpemUoKSwgMHUsCisgICAgICAgICAgICAgICAgbVdyaXRlVmlldy0+Y2FwYWNpdHkoKSAtIG1Xcml0ZVZpZXctPnNpemUoKSk7CisgICAgICAgIG1Xcml0ZVZpZXctPnNldFNpemUobVdyaXRlVmlldy0+Y2FwYWNpdHkoKSk7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmt7c3RkOjptYWtlX3VuaXF1ZTxDMldvcms+KCl9OworICAgIHdvcmstPmlucHV0Lm9yZGluYWwgPSBtQ3VycmVudE9yZGluYWw7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIG1DdXJyZW50QmxvY2stPnNoYXJlKDAsIG1DdXJyZW50QmxvY2stPmNhcGFjaXR5KCksIEMyRmVuY2UoKSkpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBpdGVtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICArK21DdXJyZW50T3JkaW5hbC5mcmFtZUluZGV4OworICAgIG1DdXJyZW50T3JkaW5hbC50aW1lc3RhbXAgKz0gbUZyYW1lU2l6ZS52YWx1ZSgpICogMTAwMDAwMCAvIG1TYW1wbGVSYXRlOworICAgIG1DdXJyZW50T3JkaW5hbC5jdXN0b21PcmRpbmFsID0gbUN1cnJlbnRPcmRpbmFsLnRpbWVzdGFtcDsKKyAgICBtQ3VycmVudEJsb2NrLnJlc2V0KCk7CisgICAgbVdyaXRlVmlldy5yZXNldCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0ZyYW1lUmVhc3NlbWJsZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhYzA2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9GcmFtZVJlYXNzZW1ibGVyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGUkFNRV9SRUFTU0VNQkxFUl9IXworI2RlZmluZSBGUkFNRV9SRUFTU0VNQkxFUl9IXworCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRnJhbWVSZWFzc2VtYmxlciB7CitwdWJsaWM6CisgICAgRnJhbWVSZWFzc2VtYmxlcigpOworCisgICAgdm9pZCBpbml0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZVNpemUsCisgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nKTsKKyAgICB2b2lkIHVwZGF0ZUZyYW1lU2l6ZSh1aW50MzJfdCBmcmFtZVNpemUpOworICAgIHZvaWQgdXBkYXRlU2FtcGxlUmF0ZSh1aW50MzJfdCBzYW1wbGVSYXRlKTsKKyAgICB2b2lkIHVwZGF0ZUNoYW5uZWxDb3VudCh1aW50MzJfdCBjaGFubmVsQ291bnQpOworICAgIHZvaWQgdXBkYXRlUGNtRW5jb2RpbmcoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGVuY29kaW5nKTsKKyAgICB2b2lkIHJlc2V0KCk7CisgICAgdm9pZCBmbHVzaCgpOworCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICppdGVtcyk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtQmxvY2tQb29sOworICAgIEMyTWVtb3J5VXNhZ2UgbVVzYWdlOworICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IG1GcmFtZVNpemU7CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgdWludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgbUVuY29kaW5nOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVBlbmRpbmdXb3JrOworICAgIEMyV29ya09yZGluYWxTdHJ1Y3QgbUN1cnJlbnRPcmRpbmFsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQ3VycmVudEJsb2NrOworICAgIHN0ZDo6b3B0aW9uYWw8QzJXcml0ZVZpZXc+IG1Xcml0ZVZpZXc7CisKKyAgICB1aW50NjRfdCBieXRlc1RvU2FtcGxlcyhzaXplX3QgbnVtQnl0ZXMpIGNvbnN0OworICAgIHNpemVfdCB1c1RvU2FtcGxlcyh1aW50NjRfdCB1cykgY29uc3Q7CisgICAgdWludDMyX3QgYnl0ZXNQZXJTYW1wbGUoKSBjb25zdDsKKworICAgIHZvaWQgZmluaXNoQ3VycmVudEJsb2NrKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gKml0ZW1zKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRlJBTUVfUkVBU1NFTUJMRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vSW5wdXRTdXJmYWNlV3JhcHBlci5oCmluZGV4IGJiMzU3NjMuLjQ0YmE3OGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaApAQCAtNjEsMjQgKzYxLDI1IEBACiAgICAgLy8vIElucHV0IFN1cmZhY2UgY29uZmlndXJhdGlvbgogICAgIHN0cnVjdCBDb25maWcgewogICAgICAgICAvLyBJTiBQQVJBTVMgKEdCUykKLSAgICAgICAgZmxvYXQgbU1pbkZwczsgLy8gbWluaW11bSBmcHMgKHJlcGVhdCBmcmFtZSB0byBhY2hpZXZlIHRoaXMpCi0gICAgICAgIGZsb2F0IG1NYXhGcHM7IC8vIG1heCBmcHMgKHZpYSBmcmFtZSBkcm9wKQotICAgICAgICBmbG9hdCBtQ2FwdHVyZUZwczsgLy8gY2FwdHVyZSBmcHMKLSAgICAgICAgZmxvYXQgbUNvZGVkRnBzOyAgIC8vIGNvZGVkIGZwcwotICAgICAgICBib29sIG1TdXNwZW5kZWQ7IC8vIHN1c3BlbmRlZAotICAgICAgICBpbnQ2NF90IG1UaW1lT2Zmc2V0VXM7IC8vIHRpbWUgb2Zmc2V0IChpbnB1dCA9PiBjb2RlYykKLSAgICAgICAgaW50NjRfdCBtU3VzcGVuZEF0VXM7IC8vIHN1c3BlbmQvcmVzdW1lIHRpbWUKLSAgICAgICAgaW50NjRfdCBtU3RhcnRBdFVzOyAvLyBzdGFydCB0aW1lCi0gICAgICAgIGJvb2wgbVN0b3BwZWQ7IC8vIHN0b3BwZWQKLSAgICAgICAgaW50NjRfdCBtU3RvcEF0VXM7IC8vIHN0b3AgdGltZQorICAgICAgICBmbG9hdCBtTWluRnBzID0gMC4wOyAvLyBtaW5pbXVtIGZwcyAocmVwZWF0IGZyYW1lIHRvIGFjaGlldmUgdGhpcykKKyAgICAgICAgZmxvYXQgbU1heEZwcyA9IDAuMDsgLy8gbWF4IGZwcyAodmlhIGZyYW1lIGRyb3ApCisgICAgICAgIGZsb2F0IG1DYXB0dXJlRnBzID0gMC4wOyAvLyBjYXB0dXJlIGZwcworICAgICAgICBmbG9hdCBtQ29kZWRGcHMgPSAwLjA7ICAgLy8gY29kZWQgZnBzCisgICAgICAgIGJvb2wgbVN1c3BlbmRlZCA9IGZhbHNlOyAvLyBzdXNwZW5kZWQKKyAgICAgICAgaW50NjRfdCBtVGltZU9mZnNldFVzID0gMDsgLy8gdGltZSBvZmZzZXQgKGlucHV0ID0+IGNvZGVjKQorICAgICAgICBpbnQ2NF90IG1TdXNwZW5kQXRVcyA9IDA7IC8vIHN1c3BlbmQvcmVzdW1lIHRpbWUKKyAgICAgICAgaW50NjRfdCBtU3RhcnRBdFVzID0gMDsgLy8gc3RhcnQgdGltZQorICAgICAgICBib29sIG1TdG9wcGVkID0gZmFsc2U7IC8vIHN0b3BwZWQKKyAgICAgICAgaW50NjRfdCBtU3RvcEF0VXMgPSAwOyAvLyBzdG9wIHRpbWUKIAogICAgICAgICAvLyBPVVQgUEFSQU1TIChHQlMpCi0gICAgICAgIGludDY0X3QgbUlucHV0RGVsYXlVczsgLy8gZGVsYXkgYmV0d2VlbiBlbmNvZGVyIGlucHV0IGFuZCBzdXJmYWNlIGlucHV0CisgICAgICAgIGludDY0X3QgbUlucHV0RGVsYXlVcyA9IDA7IC8vIGRlbGF5IGJldHdlZW4gZW5jb2RlciBpbnB1dCBhbmQgc3VyZmFjZSBpbnB1dAogCiAgICAgICAgIC8vIElOIFBBUkFNUyAoQ09ERUMgV1JBUFBFUikKLSAgICAgICAgZmxvYXQgbUZpeGVkQWRqdXN0ZWRGcHM7IC8vIGZpeGVkIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgotICAgICAgICBmbG9hdCBtTWluQWRqdXN0ZWRGcHM7IC8vIG1pbmltdW0gZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCi0gICAgICAgIHVpbnQ2NF90IG1Vc2FnZTsgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICAgICAgZmxvYXQgbUZpeGVkQWRqdXN0ZWRGcHMgPSAwLjA7IC8vIGZpeGVkIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgICAgICBmbG9hdCBtTWluQWRqdXN0ZWRGcHMgPSAwLjA7IC8vIG1pbmltdW0gZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIHVpbnQ2NF90IG1Vc2FnZSA9IDA7IC8vIGNvbnN1bWVyIHVzYWdlCisgICAgICAgIGludCBtUHJpb3JpdHkgPSBJTlRfTUFYOyAvLyBwcmlvcml0eSBvZiBxdWV1ZSB0aHJlYWQgKGlmIGFueSk7IElOVF9NQVggZm9yIG5vLW9wCiAgICAgfTsKIAogICAgIC8qKgpAQCAtMTA2LDYgKzEwNywxMSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjMl9jbnRyNjRfdCAvKiBpbmRleCAqLykge30KIAorICAgIC8qKgorICAgICAqIFJldHVybnMgZGF0YXNwYWNlIGluZm9ybWF0aW9uIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWRfZGF0YXNwYWNlIGdldERhdGFzcGFjZSgpIHsgcmV0dXJuIG1EYXRhU3BhY2U7IH0KKwogcHJvdGVjdGVkOgogICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcAppbmRleCAwZWU5MDU2Li5iYzkxOTdjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtOTUsNiArOTUsNyBAQAogfQogCiB2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6Zmx1c2goKSB7CisgICAgQUxPR1YoImZsdXNoIik7CiAgICAgbUZyYW1lc0luUGlwZWxpbmUuY2xlYXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcAppbmRleCBmMzkwNTFiLi5kMTRiOWIwIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApAQCAtMjg4LDYgKzI4OCwyMCBAQAogICAgIH0KIH0KIAorQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFR5cGVGb3JLZXkoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZrZXkpIGNvbnN0IHsKKyAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGtleSk7CisgICAgaWYgKGl0ID09IG1NYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QofjApOworICAgIH0KKworICAgIGlmIChpdC0+c2Vjb25kLmZpZWxkRGVzYykgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5maWVsZERlc2MtPnR5cGUoKTsKKyAgICB9CisgICAgLy8gd2hvbGUgcGFyYW0gaXMgZXhwb3NlZCBhcyBhIGJsb2IKKyAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I7Cit9CisKIHZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjp1cGRhdGVQYXJhbXNGcm9tTWVzc2FnZSgKICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5oCmluZGV4IDc1MmM3ZTQuLjZkY2YyYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKQEAgLTE3Niw2ICsxNzYsMTQgQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqa2V5cyAvKiBub25udWxsICovKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIEdldCBmaWVsZCB0eXBlIGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgICAqCisgICAgICogXHBhcmFtIGtleVtpbl0gICBmaWVsZCBuYW1lCisgICAgICogXHJldHVybiB0eXBlIG9mIHRoZSBmaWVsZCwgb3IgdHlwZV90KH4wKSBpZiBub3QgZm91bmQuCisgICAgICovCisgICAgQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCBnZXRUeXBlRm9yS2V5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSBDMlBhcmFtIG9iamVjdHMgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZSBpbiBBTWVzc2FnZSBvYmplY3QuCiAgICAgICoKICAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgICBEaWN0IG9iamVjdCB3aXRoIGZpZWxkIG5hbWUgdG8gdmFsdWUgcGFpcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DQ29kZWMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCmluZGV4IGVjYjI1MDYuLmVjMTgxMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NDb2RlYy5oCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXNjcmliZVBhcmFtZXRlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBDb2RlY1BhcmFtZXRlckRlc2NyaXB0b3IgKmRlc2MpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3Vic2NyaWJlVG9QYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSBvdmVycmlkZTsKKwogICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOwogICAgIHZvaWQgb25Xb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpOwogICAgIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOwpAQCAtMTI2LDYgKzEzMiwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwogCisgICAgc3RhdHVzX3QgY29uZmlndXJlVHVubmVsZWRWaWRlb1BsYXliYWNrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wLAorICAgICAgICAgICAgc3A8TmF0aXZlSGFuZGxlPiAqc2lkZWJhbmRIYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKICAgICBlbnVtIHsKICAgICAgICAga1doYXRBbGxvY2F0ZSwKICAgICAgICAga1doYXRDb25maWd1cmUsCkBAIC0xOTMsNyArMjA0LDYgQEAKIAogICAgIE11dGV4ZWQ8c3RkOjp1bmlxdWVfcHRyPENDb2RlY0NvbmZpZz4+IG1Db25maWc7CiAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+PiBtV29ya0RvbmVRdWV1ZTsKLSAgICBzdGQ6OmF0b21pY19mbGFnIG1TZW50Q29uZmlnQWZ0ZXJSZXN1bWU7CiAKICAgICBmcmllbmQgY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsOwogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDVjNzc0YTIuLjkyZjM3NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImNjb2RlY191bml0X3Rlc3QiLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLApAQCAtNSw2ICsxNCw3IEBACiAgICAgc3JjczogWwogICAgICAgICAiQ0NvZGVjQnVmZmVyc190ZXN0LmNwcCIsCiAgICAgICAgICJDQ29kZWNDb25maWdfdGVzdC5jcHAiLAorICAgICAgICAiRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcCIsCiAgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNCdWZmZXJzX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKaW5kZXggNWJlZTYwNS4uNDFlNGZmZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0J1ZmZlcnNfdGVzdC5jcHAKQEAgLTE4LDIyICsxOCwzMiBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KIAorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gR2V0UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPiBidWZmZXJzID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4oInRlc3QiKTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsIHdpZHRoKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIGhlaWdodCk7CisgICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgcmV0dXJuIGJ1ZmZlcnM7Cit9CisKIFRFU1QoUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnNUZXN0LCBDaGFuZ2VOdW1TbG90cykgewogICAgIGNvbnN0ZXhwciBpbnQzMl90IGtXaWR0aCA9IDM4NDA7CiAgICAgY29uc3RleHByIGludDMyX3Qga0hlaWdodCA9IDIxNjA7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnMgPQotICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPigidGVzdCIpOwotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXR7bmV3IEFNZXNzYWdlfTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIGtXaWR0aCk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0Iiwga0hlaWdodCk7Ci0gICAgYnVmZmVycy0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgICAgIEdldFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKGtXaWR0aCwga0hlaWdodCk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHBvb2w7CiAgICAgQVNTRVJUX0VRKE9LLCBHZXRDb2RlYzJCbG9ja1Bvb2woQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMsIG51bGxwdHIsICZwb29sKSk7CkBAIC05Niw0ICsxMDYsNzU5IEBACiAgICAgfQogfQogCitURVNUKFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzVGVzdCwgV3JhcE51bGxCdWZmZXIpIHsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIGludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4gYnVmZmVycyA9CisgICAgICAgIEdldFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKGtXaWR0aCwga0hlaWdodCk7CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcnMtPndyYXAobnVsbHB0cik7CisgICAgQVNTRVJUX0VRKG51bGxwdHIsIGJ1ZmZlci0+YmFzZSgpKTsKKyAgICBBU1NFUlRfRVEoMCwgYnVmZmVyLT5zaXplKCkpOworICAgIEFTU0VSVF9FUSgwLCBidWZmZXItPm9mZnNldCgpKTsKK30KKworVEVTVChSYXdHcmFwaGljT3V0cHV0QnVmZmVyc1Rlc3QsIEZsZXhZdXZDb2xvckZvcm1hdCkgeworICAgIGNvbnN0ZXhwciBpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0ID0gMjQwOworCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGZsZXhQaXhlbEZvcm1hdHMoe0hBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OH0pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoImRlZmF1bHQiKTsKKyAgICBpZiAoY2xpZW50KSB7CisgICAgICAgIC8vIFF1ZXJ5IHZlbmRvciBmb3JtYXQgZm9yIEZsZXhpYmxlIFlVVgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgICAgIEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvICpwaXhlbEZvcm1hdEluZm8gPSBudWxscHRyOworICAgICAgICBpZiAoY2xpZW50LT5xdWVyeSgKKyAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgIHtDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmhlYXBQYXJhbXMpID09IEMyX09LCisgICAgICAgICAgICAgICAgJiYgaGVhcFBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mbyA9IEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOjpGcm9tKAorICAgICAgICAgICAgICAgICAgICBoZWFwUGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpeGVsRm9ybWF0SW5mbyA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpeGVsRm9ybWF0SW5mbyAmJiAqcGl4ZWxGb3JtYXRJbmZvKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBpeGVsRm9ybWF0SW5mby0+ZmxleENvdW50KCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3QgJmRlc2MgPQorICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdEluZm8tPm0udmFsdWVzW2ldOworICAgICAgICAgICAgICAgIGlmIChkZXNjLmJpdERlcHRoICE9IDgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlc2Muc3Vic2FtcGxpbmcgIT0gQzJDb2xvcjo6WVVWXzQyMAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE4MDA3NjEwNSk6IHNvbWUgZGV2aWNlcyByZXBvcnQgd3JvbmcgbGF5b3V0cworICAgICAgICAgICAgICAgICAgICAgICAgLy8gfHwgZGVzYy5sYXlvdXQgPT0gQzJDb2xvcjo6SU5URVJMRUFWRURfUEFDS0VECisgICAgICAgICAgICAgICAgICAgICAgICAvLyB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpJTlRFUkxFQVZFRF9BTElHTkVECisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZXNjLmxheW91dCA9PSBDMkNvbG9yOjpVTktOT1dOX0xBWU9VVCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxleFBpeGVsRm9ybWF0cy5wdXNoX2JhY2soZGVzYy5waXhlbEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IHBpeGVsRm9ybWF0IDogZmxleFBpeGVsRm9ybWF0cykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnMgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxSYXdHcmFwaGljT3V0cHV0QnVmZmVycz4oCisgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoInRlc3QgcGl4ZWwgZm9ybWF0IDB4JXgiLCBwaXhlbEZvcm1hdCkuY19zdHIoKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdHtuZXcgQU1lc3NhZ2V9OworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9XSURUSCwga1dpZHRoKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBrSGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSk7CisgICAgICAgIGludDMyX3QgZndrUGl4ZWxGb3JtYXQgPSAwOworICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcFBpeGVsRm9ybWF0Q29kZWNUb0ZyYW1ld29yayhwaXhlbEZvcm1hdCwgJmZ3a1BpeGVsRm9ybWF0KSkgeworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYW5kcm9pZC5fY29sb3ItZm9ybWF0IiwgZndrUGl4ZWxGb3JtYXQpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcnMtPnNldEZvcm1hdChmb3JtYXQpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBHZXRDb2RlYzJCbG9ja1Bvb2woQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUMsIG51bGxwdHIsICZwb29sKSk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICBrV2lkdGgsIGtIZWlnaHQsIHBpeGVsRm9ybWF0LAorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2V7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jaykpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHZpZXcubGF5b3V0KCk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSB0aGUgYmxvY2sgaXMgaW4gWVVWNDIwIGZvcm1hdAorICAgICAgICAgICAgQVNTRVJUX0VRKEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVViwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgQVNTRVJUX0VRKDN1LCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvJiB5UGxhbmUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvJiB1UGxhbmUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvJiB2UGxhbmUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgICAgICAgICAgLy8gWSBwbGFuZQorICAgICAgICAgICAgQVNTRVJUX0VRKDF1LCB5UGxhbmUuY29sU2FtcGxpbmcpOworICAgICAgICAgICAgQVNTRVJUX0VRKDF1LCB5UGxhbmUucm93U2FtcGxpbmcpOworICAgICAgICAgICAgQVNTRVJUX0VRKDh1LCB5UGxhbmUuYWxsb2NhdGVkRGVwdGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKDh1LCB5UGxhbmUuYml0RGVwdGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB5UGxhbmUucmlnaHRTaGlmdCk7CisKKyAgICAgICAgICAgIC8vIFUgcGxhbmUKKyAgICAgICAgICAgIEFTU0VSVF9FUSgydSwgdVBsYW5lLmNvbFNhbXBsaW5nKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgydSwgdVBsYW5lLnJvd1NhbXBsaW5nKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSg4dSwgdVBsYW5lLmFsbG9jYXRlZERlcHRoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSg4dSwgdVBsYW5lLmJpdERlcHRoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdVBsYW5lLnJpZ2h0U2hpZnQpOworCisgICAgICAgICAgICAvLyBWIHBsYW5lCisgICAgICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5jb2xTYW1wbGluZyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgICAgICBBU1NFUlRfRVEoOHUsIHZQbGFuZS5hbGxvY2F0ZWREZXB0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoOHUsIHZQbGFuZS5iaXREZXB0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZQbGFuZS5yaWdodFNoaWZ0KTsKKworICAgICAgICAgICAgdWludDhfdCAqeVJvd1B0ciA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnVSb3dQdHIgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgICAgICB1aW50OF90ICp2Um93UHRyID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgICAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGtIZWlnaHQ7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqeVB0ciA9IHlSb3dQdHI7CisgICAgICAgICAgICAgICAgdWludDhfdCAqdVB0ciA9IHVSb3dQdHI7CisgICAgICAgICAgICAgICAgdWludDhfdCAqdlB0ciA9IHZSb3dQdHI7CisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGtXaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgKnlQdHIgPSAoKHJvdyArIGNvbCkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgeVB0ciArPSB5UGxhbmUuY29sSW5jOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPCBrSGVpZ2h0IC8gMiAmJiBjb2wgPCBrV2lkdGggLyAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdVB0ciA9ICgocm93ICsgY29sICsgMSkgJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICp2UHRyID0gKChyb3cgKyBjb2wgKyAyKSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICAgICAgdVB0ciArPSB1UGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgICAgICAgICAgdlB0ciArPSB2UGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHlSb3dQdHIgKz0geVBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdVJvd1B0ciArPSB1UGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgICAgICB2Um93UHRyICs9IHZQbGFuZS5yb3dJbmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICBibG9jay0+Y3JvcCgpLCBDMkZlbmNle30pKTsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoYzJCdWZmZXIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgY2xpZW50QnVmZmVyKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgICAgICBBU1NFUlRfVFJVRShjbGllbnRCdWZmZXItPmZvcm1hdCgpLT5maW5kQnVmZmVyKCJpbWFnZS1kYXRhIiwgJmltYWdlRGF0YSkpOworICAgICAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyICopaW1hZ2VEYXRhLT5kYXRhKCk7CisgICAgICAgIEFTU0VSVF9FUShNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYsIGltZy0+bVR5cGUpOworICAgICAgICBBU1NFUlRfRVEoM3UsIGltZy0+bU51bVBsYW5lcyk7CisgICAgICAgIEFTU0VSVF9FUShrV2lkdGgsIGltZy0+bVdpZHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGltZy0+bUhlaWdodCk7CisgICAgICAgIEFTU0VSVF9FUSg4dSwgaW1nLT5tQml0RGVwdGgpOworICAgICAgICBBU1NFUlRfRVEoOHUsIGltZy0+bUJpdERlcHRoQWxsb2NhdGVkKTsKKyAgICAgICAgY29uc3QgTWVkaWFJbWFnZTI6OlBsYW5lSW5mbyAmeVBsYW5lID0gaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlldOworICAgICAgICBjb25zdCBNZWRpYUltYWdlMjo6UGxhbmVJbmZvICZ1UGxhbmUgPSBpbWctPm1QbGFuZVtNZWRpYUltYWdlMjo6VV07CisgICAgICAgIGNvbnN0IE1lZGlhSW1hZ2UyOjpQbGFuZUluZm8gJnZQbGFuZSA9IGltZy0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXTsKKyAgICAgICAgQVNTRVJUX0VRKDF1LCB5UGxhbmUubUhvcml6U3Vic2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5tVmVydFN1YnNhbXBsaW5nKTsKKyAgICAgICAgQVNTRVJUX0VRKDJ1LCB1UGxhbmUubUhvcml6U3Vic2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5tVmVydFN1YnNhbXBsaW5nKTsKKyAgICAgICAgQVNTRVJUX0VRKDJ1LCB2UGxhbmUubUhvcml6U3Vic2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5tVmVydFN1YnNhbXBsaW5nKTsKKworICAgICAgICB1aW50OF90ICp5Um93UHRyID0gY2xpZW50QnVmZmVyLT5kYXRhKCkgKyB5UGxhbmUubU9mZnNldDsKKyAgICAgICAgdWludDhfdCAqdVJvd1B0ciA9IGNsaWVudEJ1ZmZlci0+ZGF0YSgpICsgdVBsYW5lLm1PZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QgKnZSb3dQdHIgPSBjbGllbnRCdWZmZXItPmRhdGEoKSArIHZQbGFuZS5tT2Zmc2V0OworICAgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwga0hlaWdodDsgKytyb3cpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnlQdHIgPSB5Um93UHRyOworICAgICAgICAgICAgdWludDhfdCAqdVB0ciA9IHVSb3dQdHI7CisgICAgICAgICAgICB1aW50OF90ICp2UHRyID0gdlJvd1B0cjsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBrV2lkdGg7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKChyb3cgKyBjb2wpICYgMHhGRiwgKnlQdHIpOworICAgICAgICAgICAgICAgIHlQdHIgKz0geVBsYW5lLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgaWYgKHJvdyA8IGtIZWlnaHQgLyAyICYmIGNvbCA8IGtXaWR0aCAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKChyb3cgKyBjb2wgKyAxKSAmIDB4RkYsICp1UHRyKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKChyb3cgKyBjb2wgKyAyKSAmIDB4RkYsICp2UHRyKTsKKyAgICAgICAgICAgICAgICAgICAgdVB0ciArPSB1UGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgdlB0ciArPSB2UGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5Um93UHRyICs9IHlQbGFuZS5tUm93SW5jOworICAgICAgICAgICAgaWYgKHJvdyA8IGtIZWlnaHQgLyAyKSB7CisgICAgICAgICAgICAgICAgdVJvd1B0ciArPSB1UGxhbmUubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2Um93UHRyICs9IHZQbGFuZS5tUm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitURVNUKFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzVGVzdCwgUDAxMENvbG9yRm9ybWF0KSB7CisgICAgY29uc3RleHByIGludDMyX3Qga1dpZHRoID0gMzIwOworICAgIGNvbnN0ZXhwciBpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnMgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzPigidGVzdCBQMDEwIik7CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsIGtXaWR0aCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBrSGVpZ2h0KTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIENPTE9SX0Zvcm1hdFlVVlAwMTApOworICAgIGludDMyX3QgZndrUGl4ZWxGb3JtYXQgPSAwOworICAgIGlmIChDMk1hcHBlcjo6bWFwUGl4ZWxGb3JtYXRDb2RlY1RvRnJhbWV3b3JrKEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfUDAxMCwgJmZ3a1BpeGVsRm9ybWF0KSkgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBmd2tQaXhlbEZvcm1hdCk7CisgICAgfQorICAgIGJ1ZmZlcnMtPnNldEZvcm1hdChmb3JtYXQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sOworICAgIEFTU0VSVF9FUShPSywgR2V0Q29kZWMyQmxvY2tQb29sKEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDLCBudWxscHRyLCAmcG9vbCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGtXaWR0aCwga0hlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl9QMDEwLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZXtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEdURVNUX1NLSVAoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhlIGJsb2NrIGlzIGluIFlVVjQyMCBmb3JtYXQKKyAgICAgICAgQVNTRVJUX0VRKEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVViwgbGF5b3V0LnR5cGUpOworICAgICAgICBBU1NFUlRfRVEoM3UsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyYgeVBsYW5lID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvJiB1UGxhbmUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8mIHZQbGFuZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgICAgIC8vIFkgcGxhbmUKKyAgICAgICAgQVNTRVJUX0VRKDF1LCB5UGxhbmUuY29sU2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgxNnUsIHlQbGFuZS5hbGxvY2F0ZWREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSgxMHUsIHlQbGFuZS5iaXREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSg2dSwgeVBsYW5lLnJpZ2h0U2hpZnQpOworCisgICAgICAgIC8vIFUgcGxhbmUKKyAgICAgICAgQVNTRVJUX0VRKDJ1LCB1UGxhbmUuY29sU2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgxNnUsIHVQbGFuZS5hbGxvY2F0ZWREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSgxMHUsIHVQbGFuZS5iaXREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSg2dSwgdVBsYW5lLnJpZ2h0U2hpZnQpOworCisgICAgICAgIC8vIFYgcGxhbmUKKyAgICAgICAgQVNTRVJUX0VRKDJ1LCB2UGxhbmUuY29sU2FtcGxpbmcpOworICAgICAgICBBU1NFUlRfRVEoMnUsIHZQbGFuZS5yb3dTYW1wbGluZyk7CisgICAgICAgIEFTU0VSVF9FUSgxNnUsIHZQbGFuZS5hbGxvY2F0ZWREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSgxMHUsIHZQbGFuZS5iaXREZXB0aCk7CisgICAgICAgIEFTU0VSVF9FUSg2dSwgdlBsYW5lLnJpZ2h0U2hpZnQpOworCisgICAgICAgIHVpbnQ4X3QgKnlSb3dQdHIgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHVpbnQ4X3QgKnVSb3dQdHIgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHVpbnQ4X3QgKnZSb3dQdHIgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBrSGVpZ2h0OyArK3JvdykgeworICAgICAgICAgICAgdWludDhfdCAqeVB0ciA9IHlSb3dQdHI7CisgICAgICAgICAgICB1aW50OF90ICp1UHRyID0gdVJvd1B0cjsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZQdHIgPSB2Um93UHRyOworICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IGtXaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAgICAgICB5UHRyWzBdID0gKChyb3cgKyBjb2wpICYgMHgzKSA8PCA2OworICAgICAgICAgICAgICAgIHlQdHJbMV0gPSAoKHJvdyArIGNvbCkgJiAweDNGQykgPj4gMjsKKyAgICAgICAgICAgICAgICB5UHRyICs9IHlQbGFuZS5jb2xJbmM7CisKKyAgICAgICAgICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIgJiYgY29sIDwga1dpZHRoIC8gMikgeworICAgICAgICAgICAgICAgICAgICB1UHRyWzBdID0gKChyb3cgKyBjb2wgKyAxKSAmIDB4MykgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgdVB0clsxXSA9ICgocm93ICsgY29sICsgMSkgJiAweDNGQykgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgdlB0clswXSA9ICgocm93ICsgY29sICsgMikgJiAweDMpIDw8IDY7CisgICAgICAgICAgICAgICAgICAgIHZQdHJbMV0gPSAoKHJvdyArIGNvbCArIDIpICYgMHgzRkMpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIHVQdHIgKz0gdVBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgdlB0ciArPSB2UGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlSb3dQdHIgKz0geVBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIGlmIChyb3cgPCBrSGVpZ2h0IC8gMikgeworICAgICAgICAgICAgICAgIHVSb3dQdHIgKz0gdVBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgICAgICB2Um93UHRyICs9IHZQbGFuZS5yb3dJbmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgYmxvY2stPmNyb3AoKSwgQzJGZW5jZXt9KSk7CisgICAgc2l6ZV90IGluZGV4OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICBBU1NFUlRfRVEoT0ssIGJ1ZmZlcnMtPnJlZ2lzdGVyQnVmZmVyKGMyQnVmZmVyLCAmaW5kZXgsICZjbGllbnRCdWZmZXIpKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY2xpZW50QnVmZmVyKTsKKyAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGE7CisgICAgQVNTRVJUX1RSVUUoY2xpZW50QnVmZmVyLT5mb3JtYXQoKS0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyICopaW1hZ2VEYXRhLT5kYXRhKCk7CisgICAgQVNTRVJUX0VRKE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwgaW1nLT5tVHlwZSk7CisgICAgQVNTRVJUX0VRKDN1LCBpbWctPm1OdW1QbGFuZXMpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGltZy0+bVdpZHRoKTsKKyAgICBBU1NFUlRfRVEoa0hlaWdodCwgaW1nLT5tSGVpZ2h0KTsKKyAgICBBU1NFUlRfRVEoMTB1LCBpbWctPm1CaXREZXB0aCk7CisgICAgQVNTRVJUX0VRKDE2dSwgaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQpOworICAgIGNvbnN0IE1lZGlhSW1hZ2UyOjpQbGFuZUluZm8gJnlQbGFuZSA9IGltZy0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXTsKKyAgICBjb25zdCBNZWRpYUltYWdlMjo6UGxhbmVJbmZvICZ1UGxhbmUgPSBpbWctPm1QbGFuZVtNZWRpYUltYWdlMjo6VV07CisgICAgY29uc3QgTWVkaWFJbWFnZTI6OlBsYW5lSW5mbyAmdlBsYW5lID0gaW1nLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdOworICAgIEFTU0VSVF9FUSgxdSwgeVBsYW5lLm1Ib3JpelN1YnNhbXBsaW5nKTsKKyAgICBBU1NFUlRfRVEoMXUsIHlQbGFuZS5tVmVydFN1YnNhbXBsaW5nKTsKKyAgICBBU1NFUlRfRVEoMnUsIHVQbGFuZS5tSG9yaXpTdWJzYW1wbGluZyk7CisgICAgQVNTRVJUX0VRKDJ1LCB1UGxhbmUubVZlcnRTdWJzYW1wbGluZyk7CisgICAgQVNTRVJUX0VRKDJ1LCB2UGxhbmUubUhvcml6U3Vic2FtcGxpbmcpOworICAgIEFTU0VSVF9FUSgydSwgdlBsYW5lLm1WZXJ0U3Vic2FtcGxpbmcpOworCisgICAgdWludDhfdCAqeVJvd1B0ciA9IGNsaWVudEJ1ZmZlci0+ZGF0YSgpICsgeVBsYW5lLm1PZmZzZXQ7CisgICAgdWludDhfdCAqdVJvd1B0ciA9IGNsaWVudEJ1ZmZlci0+ZGF0YSgpICsgdVBsYW5lLm1PZmZzZXQ7CisgICAgdWludDhfdCAqdlJvd1B0ciA9IGNsaWVudEJ1ZmZlci0+ZGF0YSgpICsgdlBsYW5lLm1PZmZzZXQ7CisgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGtIZWlnaHQ7ICsrcm93KSB7CisgICAgICAgIHVpbnQ4X3QgKnlQdHIgPSB5Um93UHRyOworICAgICAgICB1aW50OF90ICp1UHRyID0gdVJvd1B0cjsKKyAgICAgICAgdWludDhfdCAqdlB0ciA9IHZSb3dQdHI7CisgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBrV2lkdGg7ICsrY29sKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoKChyb3cgKyBjb2wpICYgMHgzKSA8PCA2LCB5UHRyWzBdKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoKHJvdyArIGNvbCkgJiAweDNGQykgPj4gMiwgeVB0clsxXSk7CisgICAgICAgICAgICB5UHRyICs9IHlQbGFuZS5tQ29sSW5jOworICAgICAgICAgICAgaWYgKHJvdyA8IGtIZWlnaHQgLyAyICYmIGNvbCA8IGtXaWR0aCAvIDIpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoKChyb3cgKyBjb2wgKyAxKSAmIDB4MykgPDwgNiwgdVB0clswXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKCgocm93ICsgY29sICsgMSkgJiAweDNGQykgPj4gMiwgdVB0clsxXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKCgocm93ICsgY29sICsgMikgJiAweDMpIDw8IDYsIHZQdHJbMF0pOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgoKHJvdyArIGNvbCArIDIpICYgMHgzRkMpID4+IDIsIHZQdHJbMV0pOworICAgICAgICAgICAgICAgIHVQdHIgKz0gdVBsYW5lLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgdlB0ciArPSB2UGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB5Um93UHRyICs9IHlQbGFuZS5tUm93SW5jOworICAgICAgICBpZiAocm93IDwga0hlaWdodCAvIDIpIHsKKyAgICAgICAgICAgIHVSb3dQdHIgKz0gdVBsYW5lLm1Sb3dJbmM7CisgICAgICAgICAgICB2Um93UHRyICs9IHZQbGFuZS5tUm93SW5jOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBUZXN0R3JhcGhpY0FsbG9jYXRpb24gOiBwdWJsaWMgQzJHcmFwaGljQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgVGVzdEdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0LAorICAgICAgICAgICAgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBvZmZzZXRzKQorICAgICAgICA6IEMyR3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCksCisgICAgICAgICAgbUxheW91dChsYXlvdXQpLAorICAgICAgICAgIG1NZW1vcnkoY2FwYWNpdHksIDB4QUEpLAorICAgICAgICAgIG1PZmZzZXRzKG9mZnNldHMpIHsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClyZWN0OworICAgICAgICAodm9pZCl1c2FnZTsKKyAgICAgICAgKHZvaWQpZmVuY2U7CisgICAgICAgICpsYXlvdXQgPSBtTGF5b3V0OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1MYXlvdXQubnVtUGxhbmVzOyArK2kpIHsKKyAgICAgICAgICAgIGFkZHJbaV0gPSBtTWVtb3J5LmRhdGEoKSArIG1PZmZzZXRzW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bm1hcCh1aW50OF90ICoqLCBDMlJlY3QsIEMyRmVuY2UgKikgb3ZlcnJpZGUgeyByZXR1cm4gQzJfT0s7IH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gLTE7IH0KKworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgICBib29sIGVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBvdGhlci5nZXQoKSA9PSB0aGlzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMlBsYW5hckxheW91dCBtTGF5b3V0OworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1NZW1vcnk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdCAqPiBtQWRkcjsKKyAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG1PZmZzZXRzOworfTsKKworY2xhc3MgTGF5b3V0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTxib29sLCBzdGQ6OnN0cmluZywgYm9vbCwgaW50MzJfdD4+IHsKK3ByaXZhdGU6CisgICAgc3RhdGljIEMyUGxhbmFyTGF5b3V0IFlVVlBsYW5hckxheW91dChpbnQzMl90IHN0cmlkZSkgeworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB7CisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVYsCisgICAgICAgICAgICAzLCAgLyogbnVtUGxhbmVzICovCisgICAgICAgICAgICAzLCAgLyogcm9vdFBsYW5lcyAqLworICAgICAgICAgICAge30sICAvKiBwbGFuZXMgLS0tIHRvIGJlIGZpbGxlZCBiZWxvdyAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksCisgICAgICAgICAgICAxLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDEsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMSwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLAorICAgICAgICAgICAgMSwgIC8qIGNvbEluYyAqLworICAgICAgICAgICAgc3RyaWRlIC8gMiwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMiwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAyLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAwLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsCisgICAgICAgICAgICAxLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUgLyAyLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAyLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDIsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDAsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJQbGFuYXJMYXlvdXQgWVVWU2VtaVBsYW5hckxheW91dChpbnQzMl90IHN0cmlkZSkgeworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB7CisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVYsCisgICAgICAgICAgICAzLCAgLyogbnVtUGxhbmVzICovCisgICAgICAgICAgICAyLCAgLyogcm9vdFBsYW5lcyAqLworICAgICAgICAgICAge30sICAvKiBwbGFuZXMgLS0tIHRvIGJlIGZpbGxlZCBiZWxvdyAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksCisgICAgICAgICAgICAxLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDEsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMSwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLAorICAgICAgICAgICAgMiwgIC8qIGNvbEluYyAqLworICAgICAgICAgICAgc3RyaWRlLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAyLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDIsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDAsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwKKyAgICAgICAgICAgIDIsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMiwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAyLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAxLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgfQorCisgICAgc3RhdGljIEMyUGxhbmFyTGF5b3V0IFlWVVNlbWlQbGFuYXJMYXlvdXQoaW50MzJfdCBzdHJpZGUpIHsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0geworICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWLAorICAgICAgICAgICAgMywgIC8qIG51bVBsYW5lcyAqLworICAgICAgICAgICAgMiwgIC8qIHJvb3RQbGFuZXMgKi8KKyAgICAgICAgICAgIHt9LCAgLyogcGxhbmVzIC0tLSB0byBiZSBmaWxsZWQgYmVsb3cgKi8KKyAgICAgICAgfTsKKyAgICAgICAgbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLAorICAgICAgICAgICAgMSwgIC8qIGNvbEluYyAqLworICAgICAgICAgICAgc3RyaWRlLCAgLyogcm93SW5jICovCisgICAgICAgICAgICAxLCAgLyogY29sU2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDEsICAvKiByb3dTYW1wbGluZyAqLworICAgICAgICAgICAgOCwgIC8qIGFsbG9jYXRlZERlcHRoICovCisgICAgICAgICAgICA4LCAgLyogYml0RGVwdGggKi8KKyAgICAgICAgICAgIDAsICAvKiByaWdodFNoaWZ0ICovCisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAvKiByb290SXggKi8KKyAgICAgICAgICAgIDAsICAvKiBvZmZzZXQgKi8KKyAgICAgICAgfTsKKyAgICAgICAgbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwKKyAgICAgICAgICAgIDIsICAvKiBjb2xJbmMgKi8KKyAgICAgICAgICAgIHN0cmlkZSwgIC8qIHJvd0luYyAqLworICAgICAgICAgICAgMiwgIC8qIGNvbFNhbXBsaW5nICovCisgICAgICAgICAgICAyLCAgLyogcm93U2FtcGxpbmcgKi8KKyAgICAgICAgICAgIDgsICAvKiBhbGxvY2F0ZWREZXB0aCAqLworICAgICAgICAgICAgOCwgIC8qIGJpdERlcHRoICovCisgICAgICAgICAgICAwLCAgLyogcmlnaHRTaGlmdCAqLworICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgLyogcm9vdEl4ICovCisgICAgICAgICAgICAxLCAgLyogb2Zmc2V0ICovCisgICAgICAgIH07CisgICAgICAgIGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsCisgICAgICAgICAgICAyLCAgLyogY29sSW5jICovCisgICAgICAgICAgICBzdHJpZGUsICAvKiByb3dJbmMgKi8KKyAgICAgICAgICAgIDIsICAvKiBjb2xTYW1wbGluZyAqLworICAgICAgICAgICAgMiwgIC8qIHJvd1NhbXBsaW5nICovCisgICAgICAgICAgICA4LCAgLyogYWxsb2NhdGVkRGVwdGggKi8KKyAgICAgICAgICAgIDgsICAvKiBiaXREZXB0aCAqLworICAgICAgICAgICAgMCwgIC8qIHJpZ2h0U2hpZnQgKi8KKyAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsCisgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfViwgIC8qIHJvb3RJeCAqLworICAgICAgICAgICAgMCwgIC8qIG9mZnNldCAqLworICAgICAgICB9OworICAgICAgICByZXR1cm4gbGF5b3V0OworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCwKKyAgICAgICAgICAgIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gb2Zmc2V0cykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RHcmFwaGljQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGxheW91dCwKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICBvZmZzZXRzKTsKKworICAgICAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBHZXRQaXhlbFZhbHVlKHVpbnQ4X3QgdmFsdWUsIHVpbnQzMl90IHJvdywgdWludDMyX3QgY29sKSB7CisgICAgICAgIHJldHVybiAodWludDMyX3QodmFsdWUpICogcm93ICsgY29sKSAmIDB4RkY7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgRmlsbFBsYW5lKEMyR3JhcGhpY1ZpZXcgJnZpZXcsIHNpemVfdCBpbmRleCwgdWludDhfdCB2YWx1ZSkgeworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB2aWV3LmxheW91dCgpOworCisgICAgICAgIHVpbnQ4X3QgKnJvd1B0ciA9IHZpZXcuZGF0YSgpW2luZGV4XTsKKyAgICAgICAgQzJQbGFuZUluZm8gcGxhbmUgPSBsYXlvdXQucGxhbmVzW2luZGV4XTsKKyAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCB2aWV3LmhlaWdodCgpIC8gcGxhbmUucm93U2FtcGxpbmc7ICsrcm93KSB7CisgICAgICAgICAgICB1aW50OF90ICpjb2xQdHIgPSByb3dQdHI7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHZpZXcud2lkdGgoKSAvIHBsYW5lLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgICAgICpjb2xQdHIgPSBHZXRQaXhlbFZhbHVlKHZhbHVlLCByb3csIGNvbCk7CisgICAgICAgICAgICAgICAgY29sUHRyICs9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd1B0ciArPSBwbGFuZS5yb3dJbmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBGaWxsQmxvY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworCisgICAgICAgIEZpbGxQbGFuZSh2aWV3LCBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgJ1knKTsKKyAgICAgICAgRmlsbFBsYW5lKHZpZXcsIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAnVScpOworICAgICAgICBGaWxsUGxhbmUodmlldywgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICdWJyk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgVmVyaWZ5UGxhbmUoCisgICAgICAgICAgICBjb25zdCBNZWRpYUltYWdlMiAqbWVkaWFJbWFnZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJhc2UsCisgICAgICAgICAgICB1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsdWUsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZXJyb3JNc2cpIHsKKyAgICAgICAgKmVycm9yTXNnID0gIiI7CisgICAgICAgIE1lZGlhSW1hZ2UyOjpQbGFuZUluZm8gcGxhbmUgPSBtZWRpYUltYWdlLT5tUGxhbmVbaW5kZXhdOworICAgICAgICBjb25zdCB1aW50OF90ICpyb3dQdHIgPSBiYXNlICsgcGxhbmUubU9mZnNldDsKKyAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBtZWRpYUltYWdlLT5tSGVpZ2h0IC8gcGxhbmUubVZlcnRTdWJzYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmNvbFB0ciA9IHJvd1B0cjsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgbWVkaWFJbWFnZS0+bVdpZHRoIC8gcGxhbmUubUhvcml6U3Vic2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgaWYgKEdldFBpeGVsVmFsdWUodmFsdWUsIHJvdywgY29sKSAhPSAqY29sUHRyKSB7CisgICAgICAgICAgICAgICAgICAgICplcnJvck1zZyA9IEFTdHJpbmdQcmludGYoInJvdz0ldSBjb2w9JXUgZXhwZWN0ZWQ9JTAyeCBhY3R1YWw9JTAyeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LCBjb2wsIEdldFBpeGVsVmFsdWUodmFsdWUsIHJvdywgY29sKSwgKmNvbFB0cikuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2xQdHIgKz0gcGxhbmUubUNvbEluYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJvd1B0ciArPSBwbGFuZS5tUm93SW5jOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtHYXBMZW5ndGggPSBrV2lkdGggKiBrSGVpZ2h0ICogMTA7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDcmVhdGVBbmRGaWxsQnVmZmVyRnJvbVBhcmFtKGNvbnN0IFBhcmFtVHlwZSAmcGFyYW0pIHsKKyAgICAgICAgYm9vbCBjb250aWd1b3VzID0gc3RkOjpnZXQ8MD4ocGFyYW0pOworICAgICAgICBzdGQ6OnN0cmluZyBwbGFuZU9yZGVyU3RyID0gc3RkOjpnZXQ8MT4ocGFyYW0pOworICAgICAgICBib29sIHBsYW5hciA9IHN0ZDo6Z2V0PDI+KHBhcmFtKTsKKyAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBzdGQ6OmdldDwzPihwYXJhbSk7CisKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OnBsYW5lX2luZGV4X3QgcGxhbmVPcmRlclszXTsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0OworCisgICAgICAgIGlmIChwbGFuZU9yZGVyU3RyLnNpemUoKSAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OnBsYW5lX2luZGV4X3QgcGxhbmVJbmRleDsKKyAgICAgICAgICAgIHN3aXRjaCAocGxhbmVPcmRlclN0cltpXSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ1knOiBwbGFuZUluZGV4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1k7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1UnOiBwbGFuZUluZGV4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1U7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1YnOiBwbGFuZUluZGV4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYW5lT3JkZXJbaV0gPSBwbGFuZUluZGV4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBsYW5hcikgeworICAgICAgICAgICAgbGF5b3V0ID0gWVVWUGxhbmFyTGF5b3V0KHN0cmlkZSk7CisgICAgICAgIH0gZWxzZSB7ICAvLyBzZW1pLXBsYW5hcgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAocGxhbmVPcmRlcltpXSA9PSBDMlBsYW5hckxheW91dDo6UExBTkVfVSkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXQgPSBZVVZTZW1pUGxhbmFyTGF5b3V0KHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGxhbmVPcmRlcltpXSA9PSBDMlBsYW5hckxheW91dDo6UExBTkVfVikgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXQgPSBZVlVTZW1pUGxhbmFyTGF5b3V0KHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHN0cmlkZSAqIGtIZWlnaHQ7CisgICAgICAgIHNpemVfdCB1dlBsYW5lU2l6ZSA9IHN0cmlkZSAqIGtIZWlnaHQgLyA0OworICAgICAgICBzaXplX3QgY2FwYWNpdHkgPSB5UGxhbmVTaXplICsgdXZQbGFuZVNpemUgKiAyOworICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IG9mZnNldHMoMyk7CisKKyAgICAgICAgaWYgKCFjb250aWd1b3VzKSB7CisgICAgICAgICAgICBpZiAocGxhbmFyKSB7CisgICAgICAgICAgICAgICAgY2FwYWNpdHkgKz0ga0dhcExlbmd0aCAqIDI7CisgICAgICAgICAgICB9IGVsc2UgeyAgLy8gc2VtaS1wbGFuYXIKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSArPSBrR2FwTGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0c1twbGFuZU9yZGVyWzBdXSA9IDA7CisgICAgICAgIHNpemVfdCBwbGFuZVNpemUgPSAocGxhbmVPcmRlclswXSA9PSBDMlBsYW5hckxheW91dDo6UExBTkVfWSkgPyB5UGxhbmVTaXplIDogdXZQbGFuZVNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICBvZmZzZXRzW3BsYW5lT3JkZXJbaV1dID0gb2Zmc2V0c1twbGFuZU9yZGVyW2kgLSAxXV0gKyBwbGFuZVNpemU7CisgICAgICAgICAgICBpZiAoIWNvbnRpZ3VvdXMpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRzW3BsYW5lT3JkZXJbaV1dICs9IGtHYXBMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbGFuZVNpemUgPSAocGxhbmVPcmRlcltpXSA9PSBDMlBsYW5hckxheW91dDo6UExBTkVfWSkgPyB5UGxhbmVTaXplIDogdXZQbGFuZVNpemU7CisgICAgICAgICAgICBpZiAoIXBsYW5hciAgLy8gc2VtaS1wbGFuYXIKKyAgICAgICAgICAgICAgICAgICAgJiYgcGxhbmVPcmRlcltpIC0gMV0gIT0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1kKKyAgICAgICAgICAgICAgICAgICAgJiYgcGxhbmVPcmRlcltpXSAhPSBDMlBsYW5hckxheW91dDo6UExBTkVfWSkgeworICAgICAgICAgICAgICAgIG9mZnNldHNbcGxhbmVPcmRlcltpXV0gPSBvZmZzZXRzW3BsYW5lT3JkZXJbaSAtIDFdXSArIDE7CisgICAgICAgICAgICAgICAgcGxhbmVTaXplID0gdXZQbGFuZVNpemUgKiAyIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2sgPSBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAga1dpZHRoLAorICAgICAgICAgICAgICAgIGtIZWlnaHQsCisgICAgICAgICAgICAgICAgbGF5b3V0LAorICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgIG9mZnNldHMpOworICAgICAgICBGaWxsQmxvY2soYmxvY2spOworICAgICAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgYmxvY2stPnNoYXJlKGJsb2NrLT5jcm9wKCksIEMyRmVuY2UoKSkpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIFZlcmlmeUNsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c3RyaW5nICplcnJvck1zZykgeworICAgICAgICAqZXJyb3JNc2cgPSAiIjsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgICAgICBpZiAoIWJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICAgICAgKmVycm9yTXNnID0gIk1pc3NpbmcgaW1hZ2UgZGF0YSI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFJbWFnZTIgKm1lZGlhSW1hZ2UgPSAoTWVkaWFJbWFnZTIgKilpbWFnZURhdGEtPmRhdGEoKTsKKyAgICAgICAgaWYgKG1lZGlhSW1hZ2UtPm1UeXBlICE9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVikgeworICAgICAgICAgICAgKmVycm9yTXNnID0gQVN0cmluZ1ByaW50ZigiVW5leHBlY3RlZCB0eXBlOiAlZCIsIG1lZGlhSW1hZ2UtPm1UeXBlKS5jX3N0cigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHBsYW5lRXJyb3JNc2c7CisgICAgICAgIGlmICghVmVyaWZ5UGxhbmUobWVkaWFJbWFnZSwgYnVmZmVyLT5iYXNlKCksIE1lZGlhSW1hZ2UyOjpZLCAnWScsICZwbGFuZUVycm9yTXNnKSkgeworICAgICAgICAgICAgKmVycm9yTXNnID0gIlkgcGxhbmUgZG9lcyBub3QgbWF0Y2g6ICIgKyBwbGFuZUVycm9yTXNnOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghVmVyaWZ5UGxhbmUobWVkaWFJbWFnZSwgYnVmZmVyLT5iYXNlKCksIE1lZGlhSW1hZ2UyOjpVLCAnVScsICZwbGFuZUVycm9yTXNnKSkgeworICAgICAgICAgICAgKmVycm9yTXNnID0gIlUgcGxhbmUgZG9lcyBub3QgbWF0Y2g6ICIgKyBwbGFuZUVycm9yTXNnOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghVmVyaWZ5UGxhbmUobWVkaWFJbWFnZSwgYnVmZmVyLT5iYXNlKCksIE1lZGlhSW1hZ2UyOjpWLCAnVicsICZwbGFuZUVycm9yTXNnKSkgeworICAgICAgICAgICAgKmVycm9yTXNnID0gIlYgcGxhbmUgZG9lcyBub3QgbWF0Y2g6ICIgKyBwbGFuZUVycm9yTXNnOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CisgICAgICAgIGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMihLRVlfV0lEVEgsICZ3aWR0aCk7CisgICAgICAgIGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKEtFWV9TVFJJREUsICZzdHJpZGUpOworCisgICAgICAgIE1lZGlhSW1hZ2UyIGxlZ2FjeVlMYXlvdXQgPSB7CisgICAgICAgICAgICBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZLAorICAgICAgICAgICAgMSwgIC8vIG1OdW1QbGFuZXMKKyAgICAgICAgICAgIHVpbnQzMl90KHdpZHRoKSwKKyAgICAgICAgICAgIHVpbnQzMl90KGhlaWdodCksCisgICAgICAgICAgICA4LAorICAgICAgICAgICAgOCwKKyAgICAgICAgICAgIHt9LCAgLy8gbVBsYW5lCisgICAgICAgIH07CisgICAgICAgIGxlZ2FjeVlMYXlvdXQubVBsYW5lW01lZGlhSW1hZ2UyOjpZXSA9IHsKKyAgICAgICAgICAgIDAsICAvLyBtT2Zmc2V0CisgICAgICAgICAgICAxLCAgLy8gbUNvbEluYworICAgICAgICAgICAgc3RyaWRlLCAgLy8gbVJvd0luYworICAgICAgICAgICAgMSwgIC8vIG1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAxLCAgLy8gbVZlcnRTdWJzYW1wbGluZworICAgICAgICB9OworICAgICAgICBpZiAoIVZlcmlmeVBsYW5lKCZsZWdhY3lZTGF5b3V0LCBidWZmZXItPmRhdGEoKSwgTWVkaWFJbWFnZTI6OlksICdZJywgJnBsYW5lRXJyb3JNc2cpKSB7CisgICAgICAgICAgICAqZXJyb3JNc2cgPSAiWSBwbGFuZSBieSBsZWdhY3kgbGF5b3V0IGRvZXMgbm90IG1hdGNoOiAiICsgcGxhbmVFcnJvck1zZzsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK307CisKK1RFU1RfUChMYXlvdXRUZXN0LCBWZXJpZnlMYXlvdXQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnMgPQorICAgICAgICBHZXRSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhrV2lkdGgsIGtIZWlnaHQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlciA9IENyZWF0ZUFuZEZpbGxCdWZmZXJGcm9tUGFyYW0oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGMyQnVmZmVyKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4OworICAgIEFTU0VSVF9FUShPSywgYnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoYzJCdWZmZXIsICZpbmRleCwgJmNsaWVudEJ1ZmZlcikpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjbGllbnRCdWZmZXIpOworICAgIHN0ZDo6c3RyaW5nIGVycm9yTXNnOworICAgIEFTU0VSVF9UUlVFKFZlcmlmeUNsaWVudEJ1ZmZlcihjbGllbnRCdWZmZXIsICZlcnJvck1zZykpIDw8IGVycm9yTXNnOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzVGVzdCwKKyAgICAgICAgTGF5b3V0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKAorICAgICAgICAgICAgOjp0ZXN0aW5nOjpCb29sKCksICAvKiBjb250aWd1b3VzICovCisgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygiWVVWIiwgIllWVSIsICJVVlkiLCAiVlVZIiksCisgICAgICAgICAgICA6OnRlc3Rpbmc6OkJvb2woKSwgIC8qIHBsYW5hciAqLworICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoMzIwLCA1MTIpKSwKKyAgICAgICAgW10oY29uc3QgOjp0ZXN0aW5nOjpUZXN0UGFyYW1JbmZvPExheW91dFRlc3Q6OlBhcmFtVHlwZT4gJmluZm8pIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRpZ3VvdXMgPSBzdGQ6OmdldDwwPihpbmZvLnBhcmFtKSA/ICJDb250aWd1b3VzIiA6ICJOb25jb250aWd1b3VzIjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBsYW5hciA9IHN0ZDo6Z2V0PDI+KGluZm8ucGFyYW0pID8gIlBsYW5hciIgOiAiU2VtaVBsYW5hciI7CisgICAgICAgICAgICByZXR1cm4gY29udGlndW91cworICAgICAgICAgICAgICAgICAgICArIHN0ZDo6Z2V0PDE+KGluZm8ucGFyYW0pCisgICAgICAgICAgICAgICAgICAgICsgcGxhbmFyCisgICAgICAgICAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcoc3RkOjpnZXQ8Mz4oaW5mby5wYXJhbSkpOworICAgICAgICB9KTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9DQ29kZWNDb25maWdfdGVzdC5jcHAKaW5kZXggYzljYWEwMS4uN2M2NjBkYyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0NDb2RlY0NvbmZpZ190ZXN0LmNwcAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQ0NvZGVjQ29uZmlnX3Rlc3QuY3BwCkBAIC0yMDgsNiArMjA4LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0PikKICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKIAorICAgICAgICAgICAgICAgIGlmIChpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtSW5wdXRCaXRyYXRlLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0Qml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtT3V0cHV0Qml0cmF0ZSwgdmFsdWUpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5PEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCwgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCaXRyYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBtb3JlIFNESyBwYXJhbXMKICAgICAgICAgICAgIH0KICAgICAgICAgcHJpdmF0ZToKQEAgLTIyMSwxMSArMjM5LDE5IEBACiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1WZW5kb3JJbnQ2NEluZm86Om91dHB1dD4gbUludDY0T3V0cHV0OwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFZlbmRvclN0cmluZ0luZm86OmlucHV0PiBtU3RyaW5nSW5wdXQ7CiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0PiBtUGl4ZWxBc3BlY3RSYXRpbzsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUlucHV0Qml0cmF0ZTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1PdXRwdXRCaXRyYXRlOwogCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgc3RhdGljIEMyUiBTZXR0ZXIoYm9vbCwgQzJQPFQ+ICYpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBNRSwgdHlwZW5hbWUgREVQPgorICAgICAgICAgICAgc3RhdGljIEMyUiBDb3B5KGJvb2wsIEMyUDxNRT4gJm1lLCBjb25zdCBDMlA8REVQPiAmZGVwKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSBkZXAudi52YWx1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgfQogICAgICAgICB9OwogCiAgICAgICAgIEltcGwgbUltcGw7CkBAIC00NTcsNCArNDgzLDk3IEBACiAgICAgICAgICAgICA8PCAibUlucHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOwogfQogCitURVNUX0YoQ0NvZGVjQ29uZmlnVGVzdCwgRGF0YXNwYWNlVXBkYXRlKSB7CisgICAgaW5pdChDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLCBNSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgQVNTRVJUX0VRKE9LLCBtQ29uZmlnLmluaXRpYWxpemUobVJlZmxlY3RvciwgbUNvbmZpZ3VyYWJsZSkpOworICAgIGNsYXNzIElucHV0U3VyZmFjZVN0dWIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CisgICAgcHVibGljOgorICAgICAgICB+SW5wdXRTdXJmYWNlU3R1YigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICYpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7fQorICAgICAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsgcmV0dXJuIE9LOyB9CisgICAgICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7IHJldHVybiBPSzsgfQorICAgICAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICYpIG92ZXJyaWRlIHsgcmV0dXJuIE9LOyB9CisgICAgfTsKKyAgICBtQ29uZmlnLm1JbnB1dFN1cmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPElucHV0U3VyZmFjZVN0dWI+KCk7CisKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0e25ldyBBTWVzc2FnZX07CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENPTE9SX1JBTkdFX0xJTUlURUQpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBDT0xPUl9TVEFOREFSRF9CVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQklUX1JBVEUsIDEwMCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICBBU1NFUlRfRVEoT0ssIG1Db25maWcuZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIG1Db25maWd1cmFibGUsIGZvcm1hdCwgRDo6QUxMLCBDMl9NQVlfQkxPQ0ssICZjb25maWdVcGRhdGUpKTsKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLnVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnVXBkYXRlLCBEOjpBTEwpKTsKKworICAgIGludDMyX3QgcmFuZ2V7MH07CisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmcmFuZ2UpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9SQU5HRV9MSU1JVEVELCByYW5nZSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIGludDMyX3Qgc3RhbmRhcmR7MH07CisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9TVEFOREFSRF9CVDcwOSwgc3RhbmRhcmQpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisKKyAgICBpbnQzMl90IHRyYW5zZmVyezB9OworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPLCB0cmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIG1Db25maWcubUlucHV0U3VyZmFjZS0+c2V0RGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfQlQyMDIwX1BRKTsKKworICAgIC8vIERhdGFzcGFjZSBmcm9tIGlucHV0IHN1cmZhY2Ugc2hvdWxkIG92ZXJyaWRlIHRoZSBjb25maWd1cmVkIHNldHRpbmcKKyAgICBtQ29uZmlnLnVwZGF0ZUZvcm1hdHMoRDo6QUxMKTsKKworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJnJhbmdlKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfUkFOR0VfRlVMTCwgcmFuZ2UpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCkpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisgICAgRVhQRUNUX0VRKENPTE9SX1NUQU5EQVJEX0JUMjAyMCwgc3RhbmRhcmQpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisKKyAgICBBU1NFUlRfVFJVRShtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0cmFuc2ZlcikpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisgICAgRVhQRUNUX0VRKENPTE9SX1RSQU5TRkVSX1NUMjA4NCwgdHJhbnNmZXIpCisgICAgICAgICAgICA8PCAibU91dHB1dEZvcm1hdCA9ICIgPDwgbUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCk7CisKKyAgICAvLyBTaW11bGF0ZSBiaXRyYXRlIHVwZGF0ZQorICAgIGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9CSVRfUkFURSwgMjAwKTsKKyAgICBjb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1Db25maWcuZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIG1Db25maWd1cmFibGUsIGZvcm1hdCwgRDo6QUxMLCBDMl9NQVlfQkxPQ0ssICZjb25maWdVcGRhdGUpKTsKKyAgICBBU1NFUlRfRVEoT0ssIG1Db25maWcuc2V0UGFyYW1ldGVycyhtQ29uZmlndXJhYmxlLCBjb25maWdVcGRhdGUsIEMyX01BWV9CTE9DSykpOworCisgICAgLy8gQ29sb3IgaW5mb3JtYXRpb24gc2hvdWxkIHJlbWFpbiB0aGUgc2FtZQorICAgIG1Db25maWcudXBkYXRlRm9ybWF0cyhEOjpBTEwpOworCisgICAgQVNTRVJUX1RSVUUobUNvbmZpZy5tT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmcmFuZ2UpKQorICAgICAgICAgICAgPDwgIm1PdXRwdXRGb3JtYXQgPSAiIDw8IG1Db25maWcubU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpOworICAgIEVYUEVDVF9FUShDT0xPUl9SQU5HRV9GVUxMLCByYW5nZSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfU1RBTkRBUkRfQlQyMDIwLCBzdGFuZGFyZCkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKworICAgIEFTU0VSVF9UUlVFKG1Db25maWcubU91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKSkKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKKyAgICBFWFBFQ1RfRVEoQ09MT1JfVFJBTlNGRVJfU1QyMDg0LCB0cmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJtT3V0cHV0Rm9ybWF0ID0gIiA8PCBtQ29uZmlnLm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0ZyYW1lUmVhc3NlbWJsZXJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvRnJhbWVSZWFzc2VtYmxlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzM4ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL0ZyYW1lUmVhc3NlbWJsZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJGcmFtZVJlYXNzZW1ibGVyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgc2l6ZV90IEJ5dGVzUGVyU2FtcGxlKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZykgeworICAgIHJldHVybiBlbmNvZGluZyA9PSBQQ01fOCA/IDEKKyAgICAgICAgIDogZW5jb2RpbmcgPT0gUENNXzE2ID8gMgorICAgICAgICAgOiBlbmNvZGluZyA9PSBQQ01fRkxPQVQgPyA0IDogMDsKK30KKworc3RhdGljIHVpbnQ2NF90IERpZmYoYzJfY250cjY0X3QgYSwgYzJfY250cjY0X3QgYikgeworICAgIHJldHVybiBzdGQ6OmFicygoYSAtIGIpLnBlZWsoKSk7Cit9CisKK2NsYXNzIEZyYW1lUmVhc3NlbWJsZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IEMyTWVtb3J5VXNhZ2Uga1VzYWdlOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga1RpbWVzdGFtcFRvbGVyYW5jZVVzID0gMTAwOworCisgICAgRnJhbWVSZWFzc2VtYmxlclRlc3QoKSB7CisgICAgICAgIG1Jbml0U3RhdHVzID0gR2V0Q29kZWMyQmxvY2tQb29sKEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVIsIG51bGxwdHIsICZtUG9vbCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgaW5pdFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0U3RhdHVzOyB9CisKKyAgICB2b2lkIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICBzaXplX3QgZW5jb2RlckZyYW1lU2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCBlbmNvZGluZywKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dEZyYW1lU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICBzaXplX3QgY291bnQsCisgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRPdXRwdXRTaXplKSB7CisgICAgICAgIEZyYW1lUmVhc3NlbWJsZXIgZnJhbWVSZWFzc2VtYmxlcjsKKyAgICAgICAgZnJhbWVSZWFzc2VtYmxlci5pbml0KAorICAgICAgICAgICAgICAgIG1Qb29sLAorICAgICAgICAgICAgICAgIGtVc2FnZSwKKyAgICAgICAgICAgICAgICBlbmNvZGVyRnJhbWVTaXplLAorICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKworICAgICAgICBBU1NFUlRfVFJVRShmcmFtZVJlYXNzZW1ibGVyKSA8PCAiRnJhbWVSZWFzc2VtYmxlciBpbml0IGZhaWxlZCI7CisKKyAgICAgICAgc2l6ZV90IGlucHV0SW5kZXggPSAwLCBvdXRwdXRJbmRleCA9IDA7CisgICAgICAgIHNpemVfdCBleHBlY3RDb3VudCA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gbmV3IE1lZGlhQ29kZWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZSwgbmV3IEFCdWZmZXIoaW5wdXRGcmFtZVNpemVJbkJ5dGVzKSk7CisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGlucHV0RnJhbWVTaXplSW5CeXRlcyk7CisgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICJ0aW1lVXMiLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4ICogMTAwMDAwMCAvIHNhbXBsZVJhdGUgLyBjaGFubmVsQ291bnQgLyBCeXRlc1BlclNhbXBsZShlbmNvZGluZykpOworICAgICAgICAgICAgaWYgKGkgPT0gY291bnQgLSAxKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJlb3MiLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZVNpemVJbkJ5dGVzOyArK2osICsraW5wdXRJbmRleCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+YmFzZSgpW2pdID0gKGlucHV0SW5kZXggJiAweEZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssIGZyYW1lUmVhc3NlbWJsZXIucHJvY2VzcyhidWZmZXIsICZpdGVtcykpOworICAgICAgICAgICAgd2hpbGUgKCFpdGVtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayA9IHN0ZDo6bW92ZSgqaXRlbXMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaXRlbXMuZXJhc2UoaXRlbXMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IGV4cGVjdGVkVGltZVVzID0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SW5kZXggKiAxMDAwMDAwIC8gc2FtcGxlUmF0ZSAvIGNoYW5uZWxDb3VudCAvIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfR0UoCisgICAgICAgICAgICAgICAgICAgICAgICBrVGltZXN0YW1wVG9sZXJhbmNlVXMsCisgICAgICAgICAgICAgICAgICAgICAgICBEaWZmKGV4cGVjdGVkVGltZVVzLCB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJleHBlY3RlZCB0aW1lc3RhbXA6ICIgPDwgZXhwZWN0ZWRUaW1lVXMKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBhY3R1YWwgdGltZXN0YW1wOiAiIDw8IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBvdXRwdXQgaW5kZXg6ICIgPDwgb3V0cHV0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgYnVmZmVyCisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDF1LCB3b3JrLT5pbnB1dC5idWZmZXJzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKEMyQnVmZmVyRGF0YTo6TElORUFSLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgxdSwgYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBDMlJlYWRWaWV3IHZpZXcgPSBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW5jb2RlckZyYW1lU2l6ZSAqIEJ5dGVzUGVyU2FtcGxlKGVuY29kaW5nKSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHZpZXcuY2FwYWNpdHkoKTsgKytqLCArK291dHB1dEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG91dHB1dEluZGV4IDwgaW5wdXRJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbnB1dEluZGV4ID09IGlucHV0RnJhbWVTaXplSW5CeXRlcyAqIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBleHBlY3RlZCA9IG91dHB1dEluZGV4IDwgaW5wdXRJbmRleCA/IChvdXRwdXRJbmRleCAmIDB4RkYpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdENvdW50IDwgMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZXhwZWN0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHZpZXcuZGF0YSgpW2pdKSA8PCAib3V0cHV0IGluZGV4ID0gIiA8PCBvdXRwdXRJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9FUShpbnB1dEZyYW1lU2l6ZUluQnl0ZXMgKiBjb3VudCwgaW5wdXRJbmRleCk7CisgICAgICAgIHNpemVfdCBlbmNvZGVyRnJhbWVTaXplSW5CeXRlcyA9CisgICAgICAgICAgICBlbmNvZGVyRnJhbWVTaXplICogY2hhbm5lbENvdW50ICogQnl0ZXNQZXJTYW1wbGUoZW5jb2RpbmcpOworICAgICAgICBBU1NFUlRfRVEoMCwgb3V0cHV0SW5kZXggJSBlbmNvZGVyRnJhbWVTaXplSW5CeXRlcykKKyAgICAgICAgICAgIDw8ICJvdXRwdXQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIGZyYW1lIHNpemU6IG91dHB1dCBzaXplID0gIiA8PCBvdXRwdXRJbmRleAorICAgICAgICAgICAgPDwgIiBmcmFtZSBzaXplID0gIiA8PCBlbmNvZGVyRnJhbWVTaXplSW5CeXRlczsKKyAgICAgICAgQVNTRVJUX0VRKGV4cGVjdGVkT3V0cHV0U2l6ZSwgb3V0cHV0SW5kZXgpCisgICAgICAgICAgICA8PCAib3V0cHV0IHNpemUgbXVzdCBiZSBzbWFsbGVzdCBtdWx0aXBsZSBvZiBmcmFtZSBzaXplLCAiCisgICAgICAgICAgICA8PCAiZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gaW5wdXQgc2l6ZS4gb3V0cHV0IHNpemUgPSAiIDw8IG91dHB1dEluZGV4CisgICAgICAgICAgICA8PCAiIGlucHV0IHNpemUgPSAiIDw8IGlucHV0SW5kZXggPDwgIiBmcmFtZSBzaXplID0gIiA8PCBlbmNvZGVyRnJhbWVTaXplSW5CeXRlczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRTdGF0dXM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKK307CisKK2NvbnN0IEMyTWVtb3J5VXNhZ2UgRnJhbWVSZWFzc2VtYmxlclRlc3Q6OmtVc2FnZXtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworLy8gUHVzaCBmcmFtZXMgd2l0aCBleGFjdGx5IHRoZSBzYW1lIHNpemUgYXMgdGhlIGVuY29kZXIgcmVxdWVzdGVkLgorVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoRXhhY3RGcmFtZVNpemUpIHsKKyAgICBBU1NFUlRfRVEoT0ssIGluaXRTdGF0dXMoKSk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fOCwKKyAgICAgICAgICAgIDEwMjQgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjQgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMvc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAyMDQ4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI0IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzL3NhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMjA0ODAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgNDA5NiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyNCBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcy9zYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKK30KKworLy8gUHVzaCBmcmFtZXMgd2l0aCBoYWxmIHRoZSBzaXplIHRoYXQgdGhlIGVuY29kZXIgcmVxdWVzdGVkLgorVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoSGFsZkZyYW1lU2l6ZSkgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgNTEyIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSA1MTIgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDEgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgNTEyMCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDEwMjQgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogMiBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgIDIwNDggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDUxMiBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDUgKiA0MDk2IGJ5dGVzL2ZyYW1lICovKTsKK30KKworLy8gUHVzaCBmcmFtZXMgd2l0aCB0d2ljZSB0aGUgc2l6ZSB0aGF0IHRoZSBlbmNvZGVyIHJlcXVlc3RlZC4KK1RFU1RfRihGcmFtZVJlYXNzZW1ibGVyVGVzdCwgUHVzaERvdWJsZUZyYW1lU2l6ZSkgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgMjA0OCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMjA0OCBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAyMDQ4MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDIwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICA0MDk2IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAyMDQ4IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDQwOTYwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMjAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgIDgxOTIgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDIwNDggc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgODE5MjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCisvLyBQdXNoIGZyYW1lcyB3aXRoIGEgbGl0dGxlIGJpdCBsYXJnZXIgKCs1IHNhbXBsZXMpIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgorVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoTGl0dGxlTGFyZ2VyRnJhbWVTaXplKSB7CisgICAgQVNTRVJUX0VRKE9LLCBpbml0U3RhdHVzKCkpOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNXzgsCisgICAgICAgICAgICAxMDI5IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDI5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAxIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDExMjY0IC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTEgKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDIwNTggLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMjkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDIgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMjI1MjggLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMSAqIDIwNDggYnl0ZXMvZnJhbWUgKi8pOworICAgIHRlc3RQdXNoU2FtZVNpemUoCisgICAgICAgICAgICAxMDI0IC8qIGZyYW1lIHNpemUgaW4gc2FtcGxlcyAqLywKKyAgICAgICAgICAgIDQ4MDAwIC8qIHNhbXBsZSByYXRlICovLAorICAgICAgICAgICAgMSAvKiBjaGFubmVsIGNvdW50ICovLAorICAgICAgICAgICAgUENNX0ZMT0FULAorICAgICAgICAgICAgNDExNiAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAyOSBzYW1wbGVzICogMSBjaGFubmVsICogNCBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICA0NTA1NiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDExICogNDA5NiBieXRlcy9mcmFtZSAqLyk7Cit9CisKKy8vIFB1c2ggZnJhbWVzIHdpdGggYSBsaXR0bGUgYml0IHNtYWxsZXIgKC01IHNhbXBsZXMpIHRoYW4gdGhlIHJlcXVlc3RlZCBzaXplLgorVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoTGl0dGxlU21hbGxlckZyYW1lU2l6ZSkgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgMTAxOSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzID0gMTAxOSBzYW1wbGVzICogMSBjaGFubmVsICogMSBieXRlcyBwZXIgc2FtcGxlICovLAorICAgICAgICAgICAgMTAgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDI0MCAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDEwICogMTAyNCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fMTYsCisgICAgICAgICAgICAyMDM4IC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgPSAxMDE5IHNhbXBsZXMgKiAxIGNoYW5uZWwgKiAyIGJ5dGVzIHBlciBzYW1wbGUgKi8sCisgICAgICAgICAgICAxMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDIwNDgwIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gMTAgKiAyMDQ4IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV9GTE9BVCwKKyAgICAgICAgICAgIDQwNzYgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyA9IDEwMTkgc2FtcGxlcyAqIDEgY2hhbm5lbCAqIDQgYnl0ZXMgcGVyIHNhbXBsZSAqLywKKyAgICAgICAgICAgIDEwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgNDA5NjAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAxMCAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCisvLyBQdXNoIHNpbmdsZS1ieXRlIGZyYW1lcworVEVTVF9GKEZyYW1lUmVhc3NlbWJsZXJUZXN0LCBQdXNoU2luZ2xlQnl0ZSkgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgMSAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgMTAwMDAwIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDEgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgIDEwMDAwMCAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAxIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCisgICAgICAgICAgICAxMDAwMDAgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDI0MDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCisvLyBQdXNoIG9uZSBiaWcgY2h1bmsuCitURVNUX0YoRnJhbWVSZWFzc2VtYmxlclRlc3QsIFB1c2hCaWdDaHVuaykgeworICAgIEFTU0VSVF9FUShPSywgaW5pdFN0YXR1cygpKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV84LAorICAgICAgICAgICAgMTAwMDAwIC8qIGlucHV0IGZyYW1lIHNpemUgaW4gYnl0ZXMgKi8sCisgICAgICAgICAgICAxIC8qIGNvdW50ICovLAorICAgICAgICAgICAgMTAwMzUyIC8qIGV4cGVjdGVkIG91dHB1dCBzaXplID0gOTggKiAxMDI0IGJ5dGVzL2ZyYW1lICovKTsKKyAgICB0ZXN0UHVzaFNhbWVTaXplKAorICAgICAgICAgICAgMTAyNCAvKiBmcmFtZSBzaXplIGluIHNhbXBsZXMgKi8sCisgICAgICAgICAgICA0ODAwMCAvKiBzYW1wbGUgcmF0ZSAqLywKKyAgICAgICAgICAgIDEgLyogY2hhbm5lbCBjb3VudCAqLywKKyAgICAgICAgICAgIFBDTV8xNiwKKyAgICAgICAgICAgIDEwMDAwMCAvKiBpbnB1dCBmcmFtZSBzaXplIGluIGJ5dGVzICovLAorICAgICAgICAgICAgMSAvKiBjb3VudCAqLywKKyAgICAgICAgICAgIDEwMDM1MiAvKiBleHBlY3RlZCBvdXRwdXQgc2l6ZSA9IDQ5ICogMjA0OCBieXRlcy9mcmFtZSAqLyk7CisgICAgdGVzdFB1c2hTYW1lU2l6ZSgKKyAgICAgICAgICAgIDEwMjQgLyogZnJhbWUgc2l6ZSBpbiBzYW1wbGVzICovLAorICAgICAgICAgICAgNDgwMDAgLyogc2FtcGxlIHJhdGUgKi8sCisgICAgICAgICAgICAxIC8qIGNoYW5uZWwgY291bnQgKi8sCisgICAgICAgICAgICBQQ01fRkxPQVQsCisgICAgICAgICAgICAxMDAwMDAgLyogaW5wdXQgZnJhbWUgc2l6ZSBpbiBieXRlcyAqLywKKyAgICAgICAgICAgIDEgLyogY291bnQgKi8sCisgICAgICAgICAgICAxMDI0MDAgLyogZXhwZWN0ZWQgb3V0cHV0IHNpemUgPSAyNSAqIDQwOTYgYnl0ZXMvZnJhbWUgKi8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCmluZGV4IGU3ZGM5MmEuLjJmNGQ2YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTI0LDExICszMywxMyBAQAogICAgICAgICAibGliY29kZWMyX3ZuZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhcmVjdCIsCiAgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKICAgICBdLAogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcAppbmRleCBiZjJhMDdlLi41Zjg3YzY2IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG11dGV4PgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKQEAgLTEyMSwzMiArMTIyLDY5IEBACiAgICAgaWYgKHZpZXcuY3JvcCgpLndpZHRoICE9IGltZy0+bVdpZHRoIHx8IHZpZXcuY3JvcCgpLmhlaWdodCAhPSBpbWctPm1IZWlnaHQpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKChJc05WMTIodmlldykgJiYgSXNJNDIwKGltZykpIHx8IChJc0k0MjAodmlldykgJiYgSXNOVjEyKGltZykpKSB7Ci0gICAgICAgIC8vIFRha2Ugc2hvcnRjdXRzIHRvIHVzZSBsaWJ5dXYgZnVuY3Rpb25zIGJldHdlZW4gTlYxMiBhbmQgSTQyMCBjb252ZXJzaW9uLgotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfeSA9IHZpZXcuZGF0YSgpWzBdOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHZpZXcuZGF0YSgpWzJdOwotICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfeSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzBdLnJvd0luYzsKLSAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7Ci0gICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOwotICAgICAgICB1aW50OF90KiBkc3RfeSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVswXS5tT2Zmc2V0OwotICAgICAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OwotICAgICAgICB1aW50OF90KiBkc3RfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OwotICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfeSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7Ci0gICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKLSAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOwotICAgICAgICBpZiAoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdSA9IHZpZXcuZGF0YSgpWzFdOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gdmlldy5kYXRhKClbMl07CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSB2aWV3LmxheW91dCgpLnBsYW5lc1sxXS5yb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSB2aWV3LmxheW91dCgpLnBsYW5lc1syXS5yb3dJbmM7CisgICAgdWludDhfdCogZHN0X3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICB1aW50OF90KiBkc3RfdSA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0OworICAgIHVpbnQ4X3QqIGRzdF92ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQ7CisgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gaW1nLT5tUGxhbmVbMV0ubVJvd0luYzsKKyAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IGltZy0+bVBsYW5lWzJdLm1Sb3dJbmM7CisgICAgaW50IHdpZHRoID0gdmlldy5jcm9wKCkud2lkdGg7CisgICAgaW50IGhlaWdodCA9IHZpZXcuY3JvcCgpLmhlaWdodDsKKworICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQgLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYxMlRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBkc3RfeSwgZHN0X3N0cmlkZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgdmlldy5jcm9wKCkud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNyb3AoKS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNOVjIxKHZpZXcpKSB7CisgICAgICAgIGlmIChJc05WMTIoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzTlYyMShpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY192LCBzcmNfc3RyaWRlX3YsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQgLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIGlmIChJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChJc0k0MjAodmlldykpIHsKKyAgICAgICAgaWYgKElzTlYxMihpbWcpKSB7CiAgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYxMihzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgdmlldy5jcm9wKCkud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNyb3AoKS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChJc05WMjEoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Okk0MjBUb05WMjEoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBfSW1hZ2VDb3B5PHRydWU+KHZpZXcsIGltZywgaW1nQmFzZSk7CkBAIC0xNTYsMzIgKzE5NCw2OCBAQAogICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICgoSXNOVjEyKGltZykgJiYgSXNJNDIwKHZpZXcpKSB8fCAoSXNJNDIwKGltZykgJiYgSXNOVjEyKHZpZXcpKSkgewotICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKLSAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKLSAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOwotICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7Ci0gICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKLSAgICAgICAgdWludDhfdCogZHN0X3kgPSB2aWV3LmRhdGEoKVswXTsKLSAgICAgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKLSAgICAgICAgdWludDhfdCogZHN0X3YgPSB2aWV3LmRhdGEoKVsyXTsKLSAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7Ci0gICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOwotICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKLSAgICAgICAgaWYgKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfdiA9IGltZ0Jhc2UgKyBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0OworICAgIGludDMyX3Qgc3JjX3N0cmlkZV95ID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICBpbnQzMl90IHNyY19zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgaW50MzJfdCBzcmNfc3RyaWRlX3YgPSBpbWctPm1QbGFuZVsyXS5tUm93SW5jOworICAgIHVpbnQ4X3QqIGRzdF95ID0gdmlldy5kYXRhKClbMF07CisgICAgdWludDhfdCogZHN0X3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICB1aW50OF90KiBkc3RfdiA9IHZpZXcuZGF0YSgpWzJdOworICAgIGludDMyX3QgZHN0X3N0cmlkZV95ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMF0ucm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgIGludDMyX3QgZHN0X3N0cmlkZV92ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMl0ucm93SW5jOworICAgIGludCB3aWR0aCA9IHZpZXcuY3JvcCgpLndpZHRoOworICAgIGludCBoZWlnaHQgPSB2aWV3LmNyb3AoKS5oZWlnaHQ7CisgICAgaWYgKElzTlYxMihpbWcpKSB7CisgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY195LCBzcmNfc3RyaWRlX3ksIGRzdF95LCBkc3Rfc3RyaWRlX3ksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzSTQyMCh2aWV3KSkgewogICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcud2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuaGVpZ2h0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoSXNOVjIxKGltZykpIHsKKyAgICAgICAgaWYgKElzTlYxMih2aWV3KSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMjFUb05WMTIoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3YsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCBkc3Rfc3RyaWRlX3ksIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKElzTlYyMSh2aWV3KSkgeworICAgICAgICAgICAgbGlieXV2OjpDb3B5UGxhbmUoc3JjX3ksIHNyY19zdHJpZGVfeSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6TlYyMVRvSTQyMChzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfeSwgZHN0X3N0cmlkZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3UsIGRzdF9zdHJpZGVfdSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKElzSTQyMChpbWcpKSB7CisgICAgICAgIGlmIChJc05WMTIodmlldykpIHsKICAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LndpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3UsIGRzdF9zdHJpZGVfdSwgd2lkdGgsIGhlaWdodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSXNOVjIxKHZpZXcpKSB7CisgICAgICAgICAgICBpZiAoIWxpYnl1djo6STQyMFRvTlYyMShzcmNfeSwgc3JjX3N0cmlkZV95LCBzcmNfdSwgc3JjX3N0cmlkZV91LCBzcmNfdiwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIGRzdF9zdHJpZGVfeSwgZHN0X3YsIGRzdF9zdHJpZGVfdiwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoSXNJNDIwKHZpZXcpKSB7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfeSwgc3JjX3N0cmlkZV95LCBkc3RfeSwgZHN0X3N0cmlkZV95LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGxpYnl1djo6Q29weVBsYW5lKHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF91LCBkc3Rfc3RyaWRlX3UsIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMik7CisgICAgICAgICAgICBsaWJ5dXY6OkNvcHlQbGFuZShzcmNfdiwgc3JjX3N0cmlkZV92LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB3aWR0aCAvIDIsIGhlaWdodCAvIDIpOworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBfSW1hZ2VDb3B5PGZhbHNlPih2aWV3LCBpbWcsIGltZ0Jhc2UpOwpAQCAtMjI1LDYgKzI5OSwyMCBAQAogICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ub2Zmc2V0ID09IDEpOwogfQogCitib29sIElzTlYyMShjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgaWYgKCFJc1lVVjQyMCh2aWV3KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIHJldHVybiAobGF5b3V0LnJvb3RQbGFuZXMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ub2Zmc2V0ID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1YKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLm9mZnNldCA9PSAwKTsKK30KKwogYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgewogICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU4LDcgKzM0NiwxNiBAQAogICAgIH0KICAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMgogICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAyCi0gICAgICAgICAgICAmJiAoaW1nLT5tUGxhbmVbMl0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgPT0gMSkpOworICAgICAgICAgICAgJiYgKGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgPT0gaW1nLT5tUGxhbmVbMV0ubU9mZnNldCArIDEpKTsKK30KKworYm9vbCBJc05WMjEoY29uc3QgTWVkaWFJbWFnZTIgKmltZykgeworICAgIGlmICghSXNZVVY0MjAoaW1nKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoaW1nLT5tUGxhbmVbMV0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsyXS5tQ29sSW5jID09IDIKKyAgICAgICAgICAgICYmIChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0ID09IGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgKyAxKSk7CiB9CiAKIGJvb2wgSXNJNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKQEAgLTI3MCw2ICszNjcsNzYgQEAKICAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQgPiBpbWctPm1QbGFuZVsxXS5tT2Zmc2V0KTsKIH0KIAorRmxleExheW91dCBHZXRZdXY0MjBGbGV4aWJsZUxheW91dCgpIHsKKyAgICBzdGF0aWMgRmxleExheW91dCBzTGF5b3V0ID0gW117CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGRlc2MgPSB7CisgICAgICAgICAgICAxNiwgIC8vIHdpZHRoCisgICAgICAgICAgICAxNiwgIC8vIGhlaWdodAorICAgICAgICAgICAgMSwgICAvLyBsYXllcnMKKyAgICAgICAgICAgIEFIQVJEV0FSRUJVRkZFUl9GT1JNQVRfWThDYjhDcjhfNDIwLAorICAgICAgICAgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOIHwgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9XUklURV9PRlRFTiwKKyAgICAgICAgICAgIDAsICAgLy8gc3RyaWRlCisgICAgICAgICAgICAwLCAgIC8vIHJmdTAKKyAgICAgICAgICAgIDAsICAgLy8gcmZ1MQorICAgICAgICB9OworICAgICAgICBBSGFyZHdhcmVCdWZmZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGludCByZXQgPSBBSGFyZHdhcmVCdWZmZXJfYWxsb2NhdGUoJmRlc2MsICZidWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGNsYXNzIEF1dG9DbG9zZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBdXRvQ2xvc2VyKEFIYXJkd2FyZUJ1ZmZlciAqYnVmZmVyKSA6IG1CdWZmZXIoYnVmZmVyKSwgbUxvY2tlZChmYWxzZSkge30KKyAgICAgICAgICAgIH5BdXRvQ2xvc2VyKCkgeworICAgICAgICAgICAgICAgIGlmIChtTG9ja2VkKSB7CisgICAgICAgICAgICAgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl91bmxvY2sobUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9yZWxlYXNlKG1CdWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHNldExvY2tlZCgpIHsgbUxvY2tlZCA9IHRydWU7IH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQUhhcmR3YXJlQnVmZmVyICptQnVmZmVyOworICAgICAgICAgICAgYm9vbCBtTG9ja2VkOworICAgICAgICB9IGF1dG9DbG9zZXIoYnVmZmVyKTsKKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyX1BsYW5lcyBwbGFuZXM7CisgICAgICAgIHJldCA9IEFIYXJkd2FyZUJ1ZmZlcl9sb2NrUGxhbmVzKAorICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4gfCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgIC0xLCAgICAgICAvLyBmZW5jZQorICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyByZWN0CisgICAgICAgICAgICAgICAgJnBsYW5lcyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIGF1dG9DbG9zZXIuc2V0TG9ja2VkKCk7CisgICAgICAgIGlmIChwbGFuZXMucGxhbmVDb3VudCAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gRkxFWF9MQVlPVVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1swXS5waXhlbFN0cmlkZSAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gRkxFWF9MQVlPVVRfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1sxXS5waXhlbFN0cmlkZSA9PSAxICYmIHBsYW5lcy5wbGFuZXNbMl0ucGl4ZWxTdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1BMQU5BUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhbmVzLnBsYW5lc1sxXS5waXhlbFN0cmlkZSA9PSAyICYmIHBsYW5lcy5wbGFuZXNbMl0ucGl4ZWxTdHJpZGUgPT0gMikgeworICAgICAgICAgICAgc3NpemVfdCB1dkRpc3QgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4ocGxhbmVzLnBsYW5lc1syXS5kYXRhKSAtCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCAqPihwbGFuZXMucGxhbmVzWzFdLmRhdGEpOworICAgICAgICAgICAgaWYgKHV2RGlzdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1NFTUlQTEFOQVJfVVY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHV2RGlzdCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBGTEVYX0xBWU9VVF9TRU1JUExBTkFSX1ZVOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZMRVhfTEFZT1VUX1VOS05PV047CisgICAgfSgpOworICAgIHJldHVybiBzTGF5b3V0OworfQorCiBNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CiAgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKQEAgLTM0MCw5ICs1MDcsMjEgQEAKICAgICB9OwogfQogCisvLyBNYXRyaXggY29lZmZpY2llbnQgdG8gY29udmVydCBSR0IgdG8gUGxhbmFyIFlVViBkYXRhLgorLy8gRWFjaCBzdWItYXJyYXkgcmVwcmVzZW50cyB0aGUgM1gzIGNvZWZmIHVzZWQgd2l0aCBSLCBHIGFuZCBCCitzdGF0aWMgY29uc3QgaW50MTZfdCBidDYwMU1hdHJpeFsyXVszXVszXSA9IHsKKyAgICB7IHsgNzYsIDE1MCwgMjkgfSwgeyAtNDMsIC04NSwgMTI4IH0sIHsgMTI4LCAtMTA3LCAtMjEgfSB9LCAvKiBSQU5HRV9GVUxMICovCisgICAgeyB7IDY2LCAxMjksIDI1IH0sIHsgLTM4LCAtNzQsIDExMiB9LCB7IDExMiwgLTk0LCAtMTggfSB9LCAgLyogUkFOR0VfTElNSVRFRCAqLworfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgYnQ3MDlNYXRyaXhbMl1bM11bM10gPSB7CisgICAgeyB7IDU0LCAxODMsIDE4IH0sIHsgLTI5LCAtOTksIDEyOCB9LCB7IDEyOCwgLTExNiwgLTEyIH0gfSwgLyogUkFOR0VfRlVMTCAqLworICAgIHsgeyA0NywgMTU3LCAxNiB9LCB7IC0yNiwgLTg2LCAxMTIgfSwgeyAxMTIsIC0xMDIsIC0xMCB9IH0sIC8qIFJBTkdFX0xJTUlURUQgKi8KK307CisKIHN0YXR1c190IENvbnZlcnRSR0JUb1BsYW5hcllVVigKICAgICAgICAgdWludDhfdCAqZHN0WSwgc2l6ZV90IGRzdFN0cmlkZSwgc2l6ZV90IGRzdFZTdHJpZGUsIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3ICZzcmMpIHsKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjLCBDMkNvbG9yOjptYXRyaXhfdCBjb2xvck1hdHJpeCwgQzJDb2xvcjo6cmFuZ2VfdCBjb2xvclJhbmdlKSB7CiAgICAgQ0hFQ0soZHN0WSAhPSBudWxscHRyKTsKICAgICBDSEVDSygoc3JjLndpZHRoKCkgJiAxKSA9PSAwKTsKICAgICBDSEVDSygoc3JjLmhlaWdodCgpICYgMSkgPT0gMCk7CkBAIC0zNjAsMjggKzUzOSwzOCBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKnBHcmVlbiA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddOwogICAgIGNvbnN0IHVpbnQ4X3QgKnBCbHVlICA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdOwogCi0jZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQorICAgIC8vIHNldCBkZWZhdWx0IHJhbmdlIGFzIGxpbWl0ZWQKKyAgICBpZiAoY29sb3JSYW5nZSAhPSBDMkNvbG9yOjpSQU5HRV9GVUxMICYmIGNvbG9yUmFuZ2UgIT0gQzJDb2xvcjo6UkFOR0VfTElNSVRFRCkgeworICAgICAgICBjb2xvclJhbmdlID0gQzJDb2xvcjo6UkFOR0VfTElNSVRFRDsKKyAgICB9CisgICAgY29uc3QgaW50MTZfdCAoKndlaWdodHMpWzNdID0KKyAgICAgICAgKGNvbG9yTWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDcwOSkgPworICAgICAgICAgICAgYnQ3MDlNYXRyaXhbY29sb3JSYW5nZSAtIDFdIDogYnQ2MDFNYXRyaXhbY29sb3JSYW5nZSAtIDFdOworICAgIHVpbnQ4X3QgemVyb0x2bCA9ICBjb2xvclJhbmdlID09IEMyQ29sb3I6OlJBTkdFX0ZVTEwgPyAwIDogMTY7CisgICAgdWludDhfdCBtYXhMdmxMdW1hID0gIGNvbG9yUmFuZ2UgPT0gQzJDb2xvcjo6UkFOR0VfRlVMTCA/IDI1NSA6IDIzNTsKKyAgICB1aW50OF90IG1heEx2bENocm9tYSA9ICBjb2xvclJhbmdlID09IEMyQ29sb3I6OlJBTkdFX0ZVTEwgPyAyNTUgOiAyNDA7CisKKyNkZWZpbmUgQ0xJUDMobWluLHYsbWF4KSAoKCh2KSA8IChtaW4pKSA/IChtaW4pIDogKCgobWF4KSA+ICh2KSkgPyAodikgOiAobWF4KSkpCiAgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzcmMuaGVpZ2h0KCk7ICsreSkgewogICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHNyYy53aWR0aCgpOyArK3gpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgcmVkID0gKnBSZWQ7Ci0gICAgICAgICAgICB1aW50OF90IGdyZWVuID0gKnBHcmVlbjsKLSAgICAgICAgICAgIHVpbnQ4X3QgYmx1ZSA9ICpwQmx1ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgciA9ICpwUmVkOworICAgICAgICAgICAgdWludDhfdCBnID0gKnBHcmVlbjsKKyAgICAgICAgICAgIHVpbnQ4X3QgYiA9ICpwQmx1ZTsKIAotICAgICAgICAgICAgLy8gdXNpbmcgSVRVLVIgQlQuNjAxIGNvbnZlcnNpb24gbWF0cml4Ci0gICAgICAgICAgICB1bnNpZ25lZCBsdW1hID0KLSAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiA2NiArIGdyZWVuICogMTI5ICsgYmx1ZSAqIDI1KSA+PiA4KSArIDE2KSwgMjU1KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGx1bWEgPSAoKHIgKiB3ZWlnaHRzWzBdWzBdICsgZyAqIHdlaWdodHNbMF1bMV0gKyBiICogd2VpZ2h0c1swXVsyXSkgPj4gOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvTHZsOwogCi0gICAgICAgICAgICBkc3RZW3hdID0gbHVtYTsKKyAgICAgICAgICAgIGRzdFlbeF0gPSBDTElQMyh6ZXJvTHZsLCBsdW1hLCBtYXhMdmxMdW1hKTsKIAogICAgICAgICAgICAgaWYgKCh4ICYgMSkgPT0gMCAmJiAoeSAmIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0KLSAgICAgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgoLXJlZCAqIDM4IC0gZ3JlZW4gKiA3NCArIGJsdWUgKiAxMTIpID4+IDgpICsgMTI4KSwgMjU1KTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVID0gKChyICogd2VpZ2h0c1sxXVswXSArIGcgKiB3ZWlnaHRzWzFdWzFdICsgYiAqIHdlaWdodHNbMV1bMl0pID4+IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyODsKIAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIFYgPQotICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKChyZWQgKiAxMTIgLSBncmVlbiAqIDk0IC0gYmx1ZSAqIDE4KSA+PiA4KSArIDEyOCksIDI1NSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9ICgociAqIHdlaWdodHNbMl1bMF0gKyBnICogd2VpZ2h0c1syXVsxXSArIGIgKiB3ZWlnaHRzWzJdWzJdKSA+PiA4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjg7CiAKLSAgICAgICAgICAgICAgICBkc3RVW3ggPj4gMV0gPSBVOwotICAgICAgICAgICAgICAgIGRzdFZbeCA+PiAxXSA9IFY7CisgICAgICAgICAgICAgICAgZHN0VVt4ID4+IDFdID0gQ0xJUDMoemVyb0x2bCwgVSwgbWF4THZsQ2hyb21hKTsKKyAgICAgICAgICAgICAgICBkc3RWW3ggPj4gMV0gPSBDTElQMyh6ZXJvTHZsLCBWLCBtYXhMdmxDaHJvbWEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYzsKICAgICAgICAgICAgIHBHcmVlbiArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9HXS5jb2xJbmM7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCmluZGV4IGFmYWRmMDAuLjlmYTY0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIENPREVDMl9CVUZGRVJfVVRJTFNfSF8KIAogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KICNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgpAQCAtMzksNyArNDAsOCBAQAogICovCiBzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCiAgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKTsKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjLCBDMkNvbG9yOjptYXRyaXhfdCBjb2xvck1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9CVDYwMSwKKyAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCBjb2xvclJhbmdlID0gQzJDb2xvcjo6UkFOR0VfTElNSVRFRCk7CiAKIC8qKgogICogUmV0dXJucyBhIHBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCkBAIC05Niw2ICs5OCwxMSBAQAogYm9vbCBJc05WMTIoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CiAKIC8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgTlYyMSBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjIxKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKICAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIEk0MjAgbGF5b3V0LgogICovCiBib29sIElzSTQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKQEAgLTExMSwxMCArMTE4LDI2IEBACiBib29sIElzTlYxMihjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKIAogLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgTlYyMSBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjIxKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKICAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBJNDIwIGxheW91dC4KICAqLwogYm9vbCBJc0k0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CiAKK2VudW0gRmxleExheW91dCB7CisgICAgRkxFWF9MQVlPVVRfVU5LTk9XTiwKKyAgICBGTEVYX0xBWU9VVF9QTEFOQVIsCisgICAgRkxFWF9MQVlPVVRfU0VNSVBMQU5BUl9VViwKKyAgICBGTEVYX0xBWU9VVF9TRU1JUExBTkFSX1ZVLAorfTsKKy8qKgorICogUmV0dXJucyBsYXlvdXQgb2YgWUNCQ1JfNDIwXzg4OCBwaXhlbCBmb3JtYXQuCisgKi8KK0ZsZXhMYXlvdXQgR2V0WXV2NDIwRmxleGlibGVMYXlvdXQoKTsKKwogLyoqCiAgKiBBIHJhdyBtZW1vcnkgYmxvY2sgdG8gdXNlIGZvciBpbnRlcm5hbCBidWZmZXJzLgogICoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKaW5kZXggOTAzZGI2Yy4uNGQ5MzlmYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5jcHAKQEAgLTkyLDYgKzkyLDcgQEAKIAogQUxvb2t1cDxDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3Q+IHNCaXRyYXRlTW9kZXMgPSB7CiAgICAgeyBDMkNvbmZpZzo6QklUUkFURV9DT05TVCwgICAgICBCSVRSQVRFX01PREVfQ0JSIH0sCisgICAgeyBDMkNvbmZpZzo6QklUUkFURV9DT05TVF9TS0lQX0FMTE9XRUQsIEJJVFJBVEVfTU9ERV9DQlJfRkQgfSwKICAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFLCAgIEJJVFJBVEVfTU9ERV9WQlIgfSwKICAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRSwgICAgIEJJVFJBVEVfTU9ERV9DUSB9LAogfTsKQEAgLTMxMSw2ICszMTIsOCBAQAogICAgIHsgQzJDb25maWc6OlBDTV84LCBrQXVkaW9FbmNvZGluZ1BjbThiaXQgfSwKICAgICB7IEMyQ29uZmlnOjpQQ01fMTYsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKICAgICB7IEMyQ29uZmlnOjpQQ01fRkxPQVQsIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMjQsIGtBdWRpb0VuY29kaW5nUGNtMjRiaXRQYWNrZWQgfSwKKyAgICB7IEMyQ29uZmlnOjpQQ01fMzIsIGtBdWRpb0VuY29kaW5nUGNtMzJiaXQgfSwKIH07CiAKIEFMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNWcDlMZXZlbHMgPSB7CkBAIC05NTgsMTcgKzk2MSwxNiBAQAogICAgICAgICAgICAgKmMyVmFsdWUgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKLSAgICAgICAgICAgICpjMlZhbHVlID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OwotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgogICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6Ci0gICAgICAgICAgICAqYzJWYWx1ZSA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICpjMlZhbHVlID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IHNvbWUgc29ydCBvZiBwYXNzdGhyb3VnaAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gUGFzc3Rocm91Z2gKKyAgICAgICAgICAgICpjMlZhbHVlID0gdWludDMyX3QoZnJhbWV3b3JrVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCkBAIC05NzksMTEgKzk4MSwxNiBAQAogICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDoKICAgICAgICAgICAgICpmcmFtZXdvcmtWYWx1ZSA9IENPTE9SX0Zvcm1hdFN1cmZhY2U7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfU1A6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ1JDQl80MjBfU1A6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjJfSToKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgogICAgICAgICAgICAgKmZyYW1ld29ya1ZhbHVlID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIFBhc3N0aHJvdWdoCisgICAgICAgICAgICAqZnJhbWV3b3JrVmFsdWUgPSBpbnQzMl90KGMyVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAppbmRleCBjOTE2OWE5Li5iODU4ZmE1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJjb2RlYzJfY29yZV9wYXJhbV90ZXN0IiwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKaW5kZXggNTY0ZDRkMi4uYmI4MTMwYyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKQEAgLTk2LDcgKzk2LDcgQEAKICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOwogICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7ICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCiAgICAgY29uc3Qgc3RhdGljIEZEOjp0eXBlX3QgVFlQRSA9IChGRDo6dHlwZV90KShDT1JFX0lOREVYIHwgRkQ6OlNUUlVDVF9GTEFHKTsKLX07Cit9IEMyX1BBQ0s7CiAKIERFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKEMyU2l6ZVN0cnVjdCkKIApAQCAtMTExLDExICsxMTEsMTMgQEAKIAogc3RydWN0IEMyVGVzdFN0cnVjdF9BIHsKICAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKICAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKICAgICBmbG9hdCBmcDMyOwotICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107IC8vIDgtYnl0ZSBzdHJ1Y3R1cmUsIGJ1dCA0LWJ5dGUgYWxpZ25lZAogICAgIHVpbnQ4X3QgYmxvYlsxMDBdOwogICAgIGNoYXIgc3RyaW5nWzEwMF07CiAgICAgYm9vbCB5ZXNOb1sxMDBdOwpAQCAtMTI0LDIxICsxMjYsMjEgQEAKICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOwogICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3QgfTsKICAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9BIF90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOwogCiBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6OkZpZWxkTGlzdCgpIHsKICAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7CiB9CiBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUID0KICAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCi0gICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAotICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKLSAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCi0gICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAotICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKLSAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCi0gICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAotICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OworICAgICAgeyBGRDo6SU5UNjQsICAgIDIsICJzNjQiLCAgIDgsIDggfSwKKyAgICAgIHsgRkQ6OlVJTlQzMiwgICAxLCAidTMyIiwgIDI0LCA0IH0sCisgICAgICB7IEZEOjpVSU5UNjQsICAgMSwgInU2NCIsICAzMiwgOCB9LAorICAgICAgeyBGRDo6RkxPQVQsICAgIDEsICJmcCIsICAgNDAsIDQgfSwKKyAgICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAzLCAic2l6ZSIsIDQ0LCA4IH0sCisgICAgICB7IEZEOjpCTE9CLCAgIDEwMCwgImJsb2IiLCA2OCwgMSB9LAorICAgICAgeyBGRDo6U1RSSU5HLCAxMDAsICJzdHIiLCAxNjgsIDEgfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAieS1uIiwgMjY4LCAxIH0gfTsKIAogVEVTVF9QKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gR2V0UGFyYW0oKSwgZXhwZWN0ZWQgPSBDMlRlc3RTdHJ1Y3RfQTo6X0ZJRUxEX0xJU1Q7CkBAIC0xOTgsMTEgKzIwMCwxMyBAQAogCiBzdHJ1Y3QgQzJUZXN0QVN0cnVjdCB7CiAgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CiAgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICAvLyA0LWJ5dGUgcGFkZGluZwogICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CiAgICAgZmxvYXQgZnAzMjsKLSAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgQzJTaXplU3RydWN0IHN6WzNdOyAvLyA4LWJ5dGUgc3RydWN0dXJlLCBidXQgNC1ieXRlIGFsaWduZWQKICAgICB1aW50OF90IGJsb2JbMTAwXTsKICAgICBjaGFyIHN0cmluZ1sxMDBdOwogICAgIGJvb2wgeWVzTm9bMTAwXTsKQEAgLTIyOSwxMSArMjMzLDEzIEBACiAKIHN0cnVjdCBDMlRlc3RCU3RydWN0IHsKICAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKICAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKICAgICBmbG9hdCBmcDMyOwotICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107IC8vIDgtYnl0ZSBzdHJ1Y3R1cmUsIGJ1dCA0LWJ5dGUgYWxpZ25lZAogICAgIHVpbnQ4X3QgYmxvYlsxMDBdOwogICAgIGNoYXIgc3RyaW5nWzEwMF07CiAgICAgYm9vbCB5ZXNOb1sxMDBdOwpAQCAtMjg2LDcgKzI5Miw3IEBACiAgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgewogICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKICAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIGFsaWdub2YoVHlwZVBhcmFtKSAvKiBvZmZzZXQgKi8sIHRoaXMtPkZMRVhfU0laRSksCiAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzFdKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CkBAIC0zOTIsNiArMzk4LDcgQEAKIAogc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IHsKICAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIC8vIDQtYnl0ZSBwYWRkaW5nCiAgICAgaW50NjRfdCBtU2lnbmVkNjRGbGV4W107CiAKICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOwpAQCAtNDA2LDcgKzQxMyw3IEBACiB9CiBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6Ol9GSUVMRF9MSVNUID0gewogICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAotICAgIHsgRkQ6OklOVDY0LCAwLCAiZmxleCIsIDQsIDggfSwKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCA4LCA4IH0sCiB9OwogCiBzdHJ1Y3QgQzJUZXN0RmxleFM2NFN0cnVjdCB7CkBAIC00MTksNiArNDI2LDcgQEAKIAogc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgewogICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgLy8gNC1ieXRlIHBhZGRpbmcKICAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKICAgICBDMlRlc3RGbGV4RW5kUzY0U3RydWN0KCkge30KIApAQCAtNDY4LDcgKzQ3Niw3IEBACiAgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSwgRkxFWF9TSVpFID0gOCB9OwogICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplIF90eXBlOwogICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOwotfTsKK30gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpOwogCiBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpGaWVsZExpc3QoKSB7CiAgICAgcmV0dXJuIF9GSUVMRF9MSVNUOwpAQCAtNTM5LDE0ICs1NDcsMTQgQEAKIFRFU1RfRihDMlBhcmFtVGVzdCwgRmllbGRJZCkgewogICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDIwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT51bnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+ZnAzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDM2LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN6KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+YmxvYikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5zdHJpbmcpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjAsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+eWVzTm8pKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjQsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT55ZXNObykpOwogCiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CkBAIC01NTYsMTQgKzU2NCwxNCBAQAogCiAgICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKIAogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOwogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKQEAgLTU3MywxNCArNTgxLDE0IEBACiAKICAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6Onllc05vKSk7CiAKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKQEAgLTU5NCwxNCArNjAyLDE0IEBACiAKICAgICAvLyBwb2ludGVyIGNvbnN0cnVjdG9yIGluIEMyUGFyYW0KICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDMyKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQ2NCkpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmZwMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zeikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmJsb2IpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnllc05vKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg1MiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDc2LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNzYsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjc2LCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnllc05vKSk7CiAKICAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm8qKTApLT5tLnNpZ25lZDMyKSk7CiAgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0ubUZsZXhTaXplKSk7CkBAIC02MTEsMTQgKzYxOSwxNCBAQAogCiAgICAgLy8gbWVtYmVyIHBvaW50ZXIgaW4gQzJQYXJhbQogICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQzMikpOwotICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnVuc2lnbmVkMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnVuc2lnbmVkNjQpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0MCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmZwMzIpKTsKLSAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0NCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN6KSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpibG9iKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3RyaW5nKSk7Ci0gICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjY4LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6eWVzTm8pKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzIsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp1bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDgsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzeikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDc2LCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE3NiwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI3NiwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86Onllc05vKSk7CiAKICAgICAvLyBOT1RFOiBjYW5ub3QgdXNlIGEgbWVtYmVyIHBvaW50ZXIgZm9yIGZsZXggcGFyYW1zIGR1ZSB0byBpbnRyb2R1Y3Rpb24gb2YgJ20nCiAgICAgLy8gRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5zaWduZWQzMikpOwpAQCAtMjMyOCw2ICsyMzM2LDE3IEBACiAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGJsb2JWYWx1ZS0+bS52YWx1ZSksIHVpbnQ4X3RbXT46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3RbXSIpOwogICAgICAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJsb2JWYWx1ZS0+bS52YWx1ZSwgIkFCQ0RcMCIsIDYpKTsKICAgICAgICAgRVhQRUNUX0VRKDZ1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYmxvYlZhbHVlLT5zZXRGbGV4Q291bnQoN3UpOyAvLyBpbmNyZWFzaW5nIHRoZSBjb3VudCBkb2VzIG5vdCBjaGFuZ2UgaXQKKyAgICAgICAgRVhQRUNUX0VRKDZ1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgYmxvYlZhbHVlLT5zZXRGbGV4Q291bnQoMnUpOyAvLyBkZWNyZWFzaW5nIHRoZSBjb3VudCBjaGFuZ2VzIGl0IHRvIGl0CisgICAgICAgIEVYUEVDVF9FUSgydSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDB1KTsgLy8gY2FuIGRlY3JlYXNlIHRvIDAgYW5kIGJsb2IgcmVtYWlucyB2YWxpZAorICAgICAgICBFWFBFQ1RfRVEoMHUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmxvYlZhbHVlKTsKKyAgICAgICAgYmxvYlZhbHVlLT5pbnZhbGlkYXRlKCk7IC8vIGZsZXggcGFyYW1zIGNhbiBiZSBpbnZhbGlkYXRlZCA9PiByZXN1bHRzIGluIDAgc2l6ZQorICAgICAgICBFWFBFQ1RfRkFMU0UoKmJsb2JWYWx1ZSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYmxvYlZhbHVlLT5zaXplKCkpOworCiAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBibG9iVmFsdWUtPkZpZWxkTGlzdCgpOwogICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOwogICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcAppbmRleCA1OWNkMzEzLi4yZDY2ZGYxIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCkBAIC03OCw3ICs3OCw3IEBACiAgICAgICB7ICJ2YWx1ZTIiLCBFbnVtM1ZhbHVlMiB9LAogICAgICAgeyAidmFsdWU0IiwgRW51bTNWYWx1ZTQgfSwKICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSk7Ci0gICAgRW51bTMgZTM7CisgICAgRW51bTMgZTMoSW52YWxpZCk7CiAgICAgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGUzKTsKIAogICAgIC8vIHVwcGVyIGNhc2UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwCmluZGV4IDc4MDk5NGEuLjBjZmI0NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi90ZXN0cy92bmRrL0MyQnVmZmVyVGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApAQCAtMTYsMTEgKzE2LDEyIEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KICNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlci5oPgogI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIApAQCAtMjMzLDEwICsyMzQsMTAgQEAKIHB1YmxpYzoKICAgICBDMkJ1ZmZlclRlc3QoKQogICAgICAgICA6IG1CbG9ja1Bvb2xJZChDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQpLAotICAgICAgICAgIG1MaW5lYXJBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcklvbj4oJ2knKSksCiAgICAgICAgICAgbVNpemUoMHUpLAogICAgICAgICAgIG1BZGRyKG51bGxwdHIpLAogICAgICAgICAgIG1HcmFwaGljQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPignZycpKSB7CisgICAgICAgIGdldExpbmVhckFsbG9jYXRvcigmbUxpbmVhckFsbG9jYXRvcik7CiAgICAgfQogCiAgICAgfkMyQnVmZmVyVGVzdCgpID0gZGVmYXVsdDsKQEAgLTMyOSw2ICszMzAsMTEgQEAKICAgICB9CiAKIHByaXZhdGU6CisgICAgdm9pZCBnZXRMaW5lYXJBbGxvY2F0b3Ioc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiogbUxpbmVhckFsbG9jYXRvcikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPSBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIEFTU0VSVF9FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsIG1MaW5lYXJBbGxvY2F0b3IpLCBDMl9PSyk7CisgICAgfQorCiAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtTGluZWFyQWxsb2NhdGlvbjsKQEAgLTc2NSw0ICs3NzEsNTQgQEAKICAgICB9CiB9CiAKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEluZm9CdWZmZXJUZXN0KSB7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworCisgICAgLy8gYWxsb2NhdGUgYSBsaW5lYXIgYmxvY2sKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGxpbmVhclBvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2s7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2spKTsKKworICAgIEMySW5mb0J1ZmZlciBpbmZvID0gQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlcjEsIGxpbmVhckJsb2NrLT5zaGFyZSgxMDI0LCBrQ2FwYWNpdHkgLyAyLCBDMkZlbmNlKCkpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiBzcEluZm8obmV3IEMySW5mb0J1ZmZlcihpbmZvKSk7CisgICAgQVNTRVJUX0VRKGtQYXJhbUluZGV4TnVtYmVyMSwgc3BJbmZvLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShzcEluZm8tPmluZGV4KCkuaXNHbG9iYWwoKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHNwSW5mby0+aW5kZXgoKS5raW5kKCkpOworICAgIEFTU0VSVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgc3BJbmZvLT5kYXRhKCkudHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMTAyNCwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBzcEluZm8tPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkpOworICAgIC8vIGhhbmRsZXMgbXVzdCBhY3R1YWxseSBiZSBpZGVudGljYWwgYWZ0ZXIgc2hhcmluZyBpbnRvIGFuIGluZm8gYnVmZmVyCisgICAgQVNTRVJUX0VRKGxpbmVhckJsb2NrLT5oYW5kbGUoKSwgc3BJbmZvLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uaGFuZGxlKCkpOworICAgIEFTU0VSVF9FUShsaW5lYXJQb29sLT5nZXRBbGxvY2F0b3JJZCgpLCBzcEluZm8tPmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKKworICAgIEMySW5mb0J1ZmZlciBzdHJlYW1JbmZvID0gaW5mby5hc1N0cmVhbShmYWxzZSAvKiBvdXRwdXQgKi8sICAxdSk7CisgICAgQVNTRVJUX0VRKGtQYXJhbUluZGV4TnVtYmVyMSwgc3RyZWFtSW5mby5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmZvLmluZGV4KCkuZm9yU3RyZWFtKCkpOworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZm8uaW5kZXgoKS5mb3JJbnB1dCgpKTsKKyAgICBBU1NFUlRfRVEoMXUsIHN0cmVhbUluZm8uaW5kZXgoKS5zdHJlYW0oKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHN0cmVhbUluZm8uaW5kZXgoKS5raW5kKCkpOworICAgIEFTU0VSVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUiwgc3RyZWFtSW5mby5kYXRhKCkudHlwZSgpKTsKKyAgICBBU1NFUlRfRVEoMTAyNCwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBzdHJlYW1JbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5zaXplKCkpOworICAgIC8vIGhhbmRsZXMgbXVzdCBhY3R1YWxseSBiZSBpZGVudGljYWwgYWZ0ZXIgc2hhcmluZyBpbnRvIGFuIGluZm8gYnVmZmVyCisgICAgQVNTRVJUX0VRKGxpbmVhckJsb2NrLT5oYW5kbGUoKSwgc3RyZWFtSW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uaGFuZGxlKCkpOworICAgIEFTU0VSVF9FUShsaW5lYXJQb29sLT5nZXRBbGxvY2F0b3JJZCgpLCBzdHJlYW1JbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKKworICAgIEMySW5mb0J1ZmZlciBwb3J0SW5mbyA9IHN0cmVhbUluZm8uYXNQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICBBU1NFUlRfRVEoa1BhcmFtSW5kZXhOdW1iZXIxLCBwb3J0SW5mby5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBBU1NFUlRfVFJVRShwb3J0SW5mby5pbmRleCgpLmZvclBvcnQoKSk7CisgICAgQVNTRVJUX1RSVUUocG9ydEluZm8uaW5kZXgoKS5mb3JPdXRwdXQoKSk7CisgICAgQVNTRVJUX0VRKEMyUGFyYW06OklORk8sIHBvcnRJbmZvLmluZGV4KCkua2luZCgpKTsKKyAgICBBU1NFUlRfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIHBvcnRJbmZvLmRhdGEoKS50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxMDI0LCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ub2Zmc2V0KCkpOworICAgIEFTU0VSVF9FUShrQ2FwYWNpdHkgLyAyLCBwb3J0SW5mby5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpKTsKKyAgICAvLyBoYW5kbGVzIG11c3QgYWN0dWFsbHkgYmUgaWRlbnRpY2FsIGFmdGVyIHNoYXJpbmcgaW50byBhbiBpbmZvIGJ1ZmZlcgorICAgIEFTU0VSVF9FUShsaW5lYXJCbG9jay0+aGFuZGxlKCksIHBvcnRJbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5oYW5kbGUoKSk7CisgICAgQVNTRVJUX0VRKGxpbmVhclBvb2wtPmdldEFsbG9jYXRvcklkKCksIHBvcnRJbmZvLmRhdGEoKS5saW5lYXJCbG9ja3MoKVswXS5nZXRBbGxvY2F0b3JJZCgpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAKaW5kZXggZmQxYzBlYS4uYmU4MWM4NCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQW5kcm9pZC5icAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliY29kZWMyX2ludGVybmFsIiwKIApAQCAtMTEsNyArMjAsNyBAQAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKIH0KIAotLy8gISEhRE8gTk9UIERFUEVORCBPTiBUSElTIExJQlJBUlkgRElSRUNUTFkhISEKKy8vICEhIURPIE5PVCBERVBFTkQgT04gVEhJUyBTSEFSRUQgTElCUkFSWSBESVJFQ1RMWSEhIQogLy8gdXNlIGxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIGluc3RlYWQKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJjb2RlYzJfdm5kayIsCkBAIC0yNiw5ICszNSwxMiBAQAogICAgICAgICAiQzJBbGxvY2F0b3JHcmFsbG9jLmNwcCIsCiAgICAgICAgICJDMkJ1ZmZlci5jcHAiLAogICAgICAgICAiQzJDb25maWcuY3BwIiwKKyAgICAgICAgIkMyRG1hQnVmQWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJDMkZlbmNlLmNwcCIsCiAgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKICAgICAgICAgIkMyU3RvcmUuY3BwIiwKICAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyU3VyZmFjZVN5bmNPYmouY3BwIiwKICAgICAgICAgInR5cGVzLmNwcCIsCiAgICAgICAgICJ1dGlsL0MyRGVidWcuY3BwIiwKICAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIiwKQEAgLTY0LDYgKzc2LDcgQEAKICAgICAgICAgImxpYmhhcmR3YXJlIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJkbWFidWZoZWFwIiwKICAgICAgICAgImxpYmZtcSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibmF0aXZld2luZG93IiwKQEAgLTExMCw0ICsxMjMsMyBAQAogCiAgICAgLy8gVE9ETzogc2VwYXJhdGUgaW50ZXJuYWwgaGVhZGVycyBzbyB0aGV5IGNhbiBiZSBleHBvc2VkIGhlcmUKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JCbG9iLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yQmxvYi5jcHAKaW5kZXggYWEwNTQ5OS4uOGNmYTFkNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JCbG9iLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckJsb2IuY3BwCkBAIC0xNzgsNiArMTc4LDggQEAKICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKICAgICB9CiAKKyAgICAvLyBOb3RlOiB0aGUgQkxPQiBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCBwYWRkaW5nIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBleHBlY3RlZAorICAgIC8vIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBncmFsbG9jIGltcGxlbWVudGF0aW9uLgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBncmFwaGljQWxsb2NhdGlvbjsKICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBtQzJBbGxvY2F0b3JHcmFsbG9jLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKICAgICAgICAgICAgIGNhcGFjaXR5LCBrTGluZWFyQnVmZmVySGVpZ2h0LCBrTGluZWFyQnVmZmVyRm9ybWF0LCB1c2FnZSwgJmdyYXBoaWNBbGxvY2F0aW9uKTsKQEAgLTIzNSwxMiArMjM3LDEyIEBACiB9CiAKIC8vIHN0YXRpYwotYm9vbCBDMkFsbG9jYXRvckJsb2I6OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKK2Jvb2wgQzJBbGxvY2F0b3JCbG9iOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgewogICAgIHNpemVfdCBjYXBhY2l0eTsKICAgICAvLyBEaXN0aW5ndWlzaCBDMkhhbmRsZSBwdXJlbHkgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYywgb3Igb25lIGFsbG9jYXRlZCB0aHJvdWdoCiAgICAgLy8gQzJBbGxvY2F0b3JCbG9iLCBieSBjaGVja2luZyB0aGUgaGFuZGxlJ3MgaGVpZ2h0IGlzIDEsIGFuZCBpdHMgZm9ybWF0IGlzCiAgICAgLy8gUGl4ZWxGb3JtYXQ6OkJMT0IgYnkgR2V0Q2FwYWNpdHlGcm9tSGFuZGxlKCkuCi0gICAgcmV0dXJuIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChvKSAmJiBHZXRDYXBhY2l0eUZyb21IYW5kbGUobywgJmNhcGFjaXR5KSA9PSBDMl9PSzsKKyAgICByZXR1cm4gQzJBbGxvY2F0b3JHcmFsbG9jOjpDaGVja0hhbmRsZShvKSAmJiBHZXRDYXBhY2l0eUZyb21IYW5kbGUobywgJmNhcGFjaXR5KSA9PSBDMl9PSzsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCmluZGV4IGUxZTEzNzcuLjZhN2YxOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgorI2luY2x1ZGUgPHVpL1JlY3QuaD4KIAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CkBAIC00MSw3ICs0Miw5IEBACiAgICAgICAgICAqIFVzYWdlIG1hc2sgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCBmcm9tIGdyYWxsb2MgdG8gQ29kZWMgMi4wIHVzYWdlLgogICAgICAgICAgKi8KICAgICAgICAgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSyA9Ci0gICAgICAgICAgICB+KEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLIHwgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpCisgICAgICAgICAgICB+c3RhdGljX2Nhc3Q8dWludDY0X3Q+KEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpCiAgICAgfTsKIAogICAgIC8vIHZlcmlmeSB0aGF0IHBhc3N0aHJvdWdoIG1hc2sgaXMgd2l0aGluIHRoZSBwbGF0Zm9ybSBtYXNrCkBAIC0xMDMsNyArMTA2LDcgQEAKICAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFHSUMgPSAnXHhjMmdyXHgwMCc7CiAKICAgICBzdGF0aWMKLSAgICBjb25zdCBFeHRyYURhdGEqIGdldEV4dHJhRGF0YShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgY29uc3QgRXh0cmFEYXRhKiBHZXRFeHRyYURhdGEoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgewogICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIKICAgICAgICAgICAgICAgICB8fCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoaGFuZGxlKQogICAgICAgICAgICAgICAgIHx8IGhhbmRsZS0+bnVtSW50cyA8IE5VTV9JTlRTKSB7CkBAIC0xMTQsMjMgKzExNywyMyBAQAogICAgIH0KIAogICAgIHN0YXRpYwotICAgIEV4dHJhRGF0YSAqZ2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KGdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOworICAgIEV4dHJhRGF0YSAqR2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KEdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOwogICAgIH0KIAogcHVibGljOgogICAgIHZvaWQgZ2V0SWdicERhdGEodWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEodGhpcyk7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBHZXRFeHRyYURhdGEodGhpcyk7CiAgICAgICAgICpnZW5lcmF0aW9uID0gZWQtPmdlbmVyYXRpb247CiAgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoZWQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoZWQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKICAgICAgICAgKmlnYnBfc2xvdCA9IGVkLT5pZ2JwX3Nsb3Q7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqY29uc3QgbykgeworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUgKmNvbnN0IG8pIHsKICAgICAgICAgaWYgKG8gPT0gbnVsbHB0cikgeyAvLyBudWxsIGhhbmRsZSBpcyBhbHdheXMgdmFsaWQKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEobyk7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBHZXRFeHRyYURhdGEobyk7CiAgICAgICAgIC8vIHdlIGNhbm5vdCB2YWxpZGF0ZSB3aWR0aC9oZWlnaHQvZm9ybWF0L3VzYWdlIHdpdGhvdXQgYWNjZXNzaW5nIGdyYWxsb2MgZHJpdmVyCiAgICAgICAgIHJldHVybiB4ZCAhPSBudWxscHRyICYmIHhkLT5tYWdpYyA9PSBNQUdJQzsKICAgICB9CkBAIC0xNTIsNyArMTU1LDcgQEAKICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOwogICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOwotICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgICAgICAqR2V0RXh0cmFEYXRhKHJlcykgPSB4ZDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDMkhhbmRsZUdyYWxsb2MgKj4ocmVzKTsKICAgICB9CkBAIC0xODAsMTAgKzE4MywxMCBAQAogICAgIHN0YXRpYyBib29sIE1pZ3JhdGVOYXRpdmVIYW5kbGUoCiAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQsIHVpbnQzMl90IGlnYnBfc2xvdCkgewotICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIgfHwgIWlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIgfHwgIUlzVmFsaWQoaGFuZGxlKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgRXh0cmFEYXRhICplZCA9IEdldEV4dHJhRGF0YShoYW5kbGUpOwogICAgICAgICBpZiAoIWVkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGVkLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKICAgICAgICAgZWQtPmlnYnBfaWRfbG8gPSB1aW50MzJfdChpZ2JwX2lkICYgMHhGRkZGRkZGRik7CkBAIC0xOTUsNyArMTk4LDcgQEAKIAogICAgIHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QqIFVud3JhcE5hdGl2ZUhhbmRsZSgKICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKLSAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShoYW5kbGUpOworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gR2V0RXh0cmFEYXRhKGhhbmRsZSk7CiAgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTIxMSw3ICsyMTQsNyBAQAogICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAogICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAogICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7Ci0gICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IEdldEV4dHJhRGF0YShoYW5kbGUpOwogICAgICAgICBpZiAoeGQgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KQEAgLTI1Myw3ICsyNTYsNyBAQAogICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbkdyYWxsb2MoKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAotICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgQzJSZWN0IGMyUmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCiAgICAgICAgICAgICBDMlBsYW5hckxheW91dCAqbGF5b3V0IC8qIG5vbm51bGwgKi8sIHVpbnQ4X3QgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAoCiAgICAgICAgICAgICB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovLCBDMlJlY3QgcmVjdCwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8pIG92ZXJyaWRlOwpAQCAtMzM2LDggKzMzOSwxMiBAQAogfQogCiBjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjptYXAoCi0gICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgQzJSZWN0IGMyUmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCiAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgeworICAgIGNvbnN0IFJlY3QgcmVjdHsoaW50MzJfdCljMlJlY3QubGVmdCwgKGludDMyX3QpYzJSZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyUmVjdC5sZWZ0ICsgYzJSZWN0LndpZHRoKSAvKiByaWdodCAqLywKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyUmVjdC50b3AgKyBjMlJlY3QuaGVpZ2h0KSAvKiBib3R0b20gKi99OworCiAgICAgdWludDY0X3QgZ3JhbGxvY1VzYWdlID0gc3RhdGljX2Nhc3Q8QzJBbmRyb2lkTWVtb3J5VXNhZ2U+KHVzYWdlKS5hc0dyYWxsb2NVc2FnZSgpOwogICAgIEFMT0dWKCJtYXBwaW5nIGJ1ZmZlciB3aXRoIHVzYWdlICUjbGx4ID0+ICUjbGx4IiwKICAgICAgICAgICAobG9uZyBsb25nKXVzYWdlLmV4cGVjdGVkLCAobG9uZyBsb25nKWdyYWxsb2NVc2FnZSk7CkBAIC0zODYsMTAgKzM5Myw3IEBACiAgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50ZXIpOworICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzEwMTAxMDIpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKQEAgLTQ2NCwxMCArNDY4LDcgQEAKICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOwogICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzg4ODgpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKQEAgLTUyNCwxMCArNTI1LDcgQEAKICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOwogICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhCTE9CKSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CkBAIC01MzYsMjAgKzUzNCwzMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OllDQkNSXzQyMl9TUCk6CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUGl4ZWxGb3JtYXQ0OjpZQ1JDQl80MjBfU1ApOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6WUNCQ1JfNDIyX0kpOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCiAgICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6WUNCQ1JfNDIwXzg4OCk6CiAgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKLSAgICAgICAgY2FzZSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUGl4ZWxGb3JtYXQ0OjpZVjEyKToKLSAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAotICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGNhc2Ugc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBpeGVsRm9ybWF0NDo6WVYxMik6IHsKICAgICAgICAgICAgIGFuZHJvaWRfeWNiY3IgeWNiY3JMYXlvdXQ7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2tZQ2JDcigKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ5Y2JjckxheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwgcmVjdCwgJnljYmNyTGF5b3V0KTsKICAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrWUNiQ3IiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrWUNiQ3IgKGVycj0lZCkiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXljYmNyTGF5b3V0LnkgfHwgIXljYmNyTGF5b3V0LmNiIHx8ICF5Y2JjckxheW91dC5jcgorICAgICAgICAgICAgICAgICAgICB8fCB5Y2JjckxheW91dC55c3RyaWRlID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgeWNiY3JMYXlvdXQuY3N0cmlkZSA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IHljYmNyTGF5b3V0LmNocm9tYV9zdGVwID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBsYXlvdXQ6IGxvY2tZQ2JDciAoeT0lcyBjYj0lcyBjcj0lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAieXN0cmlkZT0lenUgY3N0cmlkZT0lenUgY2hyb21hX3N0ZXA9JXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dC55ID8gIihub24tbnVsbCkiIDogIihudWxsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dC5jYiA/ICIobm9uLW51bGwpIiA6ICIobnVsbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQuY3IgPyAiKG5vbi1udWxsKSIgOiAiKG51bGwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyTGF5b3V0LnlzdHJpZGUsIHljYmNyTGF5b3V0LmNzdHJpZGUsIHljYmNyTGF5b3V0LmNocm9tYV9zdGVwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOwogICAgICAgICAgICAgfQogCkBAIC02MTEsNiArNjIyLDE3MSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIHN0YXRpY19jYXN0PHVpbnQzMl90PihQaXhlbEZvcm1hdDQ6OllDQkNSX1AwMTApOiB7CisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLmxvY2soCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsICZwb2ludGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrKFlDQkNSX1AwMTApIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXBvaW50ZXIgKyBtU3RyaWRlICogMiAqIHJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdICsgMjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfWSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigyICogbVN0cmlkZSksIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigyICogbVN0cmlkZSksIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigyICogbVN0cmlkZSksIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgYnV0IGxldCdzIHRyeSB0byBsb2NrIGl0LgorICAgICAgICAgICAgYW5kcm9pZF95Y2JjciB5Y2JjckxheW91dDsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkubG9ja1lDYkNyKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsIHJlY3QsICZ5Y2JjckxheW91dCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIHljYmNyTGF5b3V0LnkgJiYgeWNiY3JMYXlvdXQuY2IgJiYgeWNiY3JMYXlvdXQuY3IKKyAgICAgICAgICAgICAgICAgICAgJiYgeWNiY3JMYXlvdXQueXN0cmlkZSA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgeWNiY3JMYXlvdXQuY3N0cmlkZSA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXAgPiAwKSB7CisgICAgICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0Lnk7CisgICAgICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNiOworICAgICAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC5jcjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDM7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQueXN0cmlkZSwgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY2hyb21hX3N0ZXAsIC8vIGNvbEluYworICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jc3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0geworICAgICAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCwgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNzdHJpZGUsICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1YsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW50ZXJsZWF2ZWQgZm9ybWF0cworICAgICAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgICAgICBpZiAodXZPZmZzZXQgPiAwICYmIHV2T2Zmc2V0IDwgKGludHB0cl90KXljYmNyTGF5b3V0LmNocm9tYV9zdGVwKSB7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb290SXggPSBDMlBsYW5hckxheW91dDo6UExBTkVfVTsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLm9mZnNldCA9IHV2T2Zmc2V0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFfc3RlcCkgeworICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAyOworICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5vZmZzZXQgPSAtdXZPZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXM7IGxvY2sgdGhlIGJ1ZmZlciBhbmQgcGFzcyBpdCB0aHJvdWdoIC0tLQorICAgICAgICAgICAgLy8gdGhlIGNsaWVudCBtYXkga25vdyBob3cgdG8gaW50ZXJwcmV0IGl0LgorCisgICAgICAgICAgICAvLyB1bmxvY2sgcHJldmlvdXMgYWxsb2NhdGlvbiBpZiBpdCB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpLnVubG9jayhtQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IHVubG9jayIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCAqcG9pbnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKS5sb2NrKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwgZ3JhbGxvY1VzYWdlLCByZWN0LCAmcG9pbnRlcik7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayg/Pz8gJXgpIiwgbUZvcm1hdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbMF0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9VTktOT1dOOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAxOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzWzBdID0geworICAgICAgICAgICAgICAgIC8vIFRPRE86IENIQU5ORUxfVU5LTk9XTj8KKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Y2hhbm5lbF90KDB4RkYpLCAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIGludDMyX3QobVN0cmlkZSksICAgICAgICAgICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogICAgIG1Mb2NrZWQgPSB0cnVlOwogCkBAIC03ODQsOCArOTYwLDkgQEAKICAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOwogfQogCi1ib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgewotICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7CisvLyBzdGF0aWMKK2Jvb2wgQzJBbGxvY2F0b3JHcmFsbG9jOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OklzVmFsaWQobyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcAppbmRleCA2ZDI3YTAyLi43N2IyNjVhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0zMCwxMCArMzAsMTUgQEAKICNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KICNpbmNsdWRlIDxDMkhhbmRsZUlvbkludGVybmFsLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSB7CiAgICAgY29uc3RleHByIHNpemVfdCBVU0FHRV9MUlVfQ0FDSEVfU0laRSA9IDEwMjQ7CisKKyAgICAvLyBtYXggcGFkZGluZyBhZnRlciBpb24vZG1hYnVmIGFsbG9jYXRpb25zIGluIGJ5dGVzCisgICAgY29uc3RleHByIHVpbnQzMl90IE1BWF9QQURESU5HID0gMHg4MDAwOyAvLyAzMktCCiB9CiAKIC8qIHNpemVfdCA8PT4gaW50KGxvKSwgaW50KGhpKSBjb252ZXJzaW9ucyAqLwpAQCAtNzMsNyArNzgsNyBAQAogfTsKIAogLy8gc3RhdGljCi1ib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworYm9vbCBDMkhhbmRsZUlvbjo6SXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pIHsKICAgICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0zNzYsMTQgKzM4MSwzNCBAQAogICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CiAgICAgaW50IGJ1ZmZlckZkID0gLTE7CiAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7Ci0gICAgc2l6ZV90IGFsaWduZWRTaXplID0gYWxpZ24gPT0gMCA/IHNpemUgOiAoc2l6ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisgICAgLy8gTk9URTogcmVhZCB0aGlzIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gdGhlIHByb3BlcnR5IGFzIHRoaXMgY29kZSBoYXMgdG8gcnVuIG9uCisgICAgLy8gQW5kcm9pZCBRLCBidXQgdGhlIHN5c3Byb3Agd2FzIG9ubHkgaW50cm9kdWNlZCBpbiBBbmRyb2lkIFMuCisgICAgc3RhdGljIHNpemVfdCBzUGFkZGluZyA9CisgICAgICAgIGJhc2U6OkdldFVpbnRQcm9wZXJ0eSgibWVkaWEuYzIuZG1hYnVmLnBhZGRpbmciLCAodWludDMyX3QpMCwgTUFYX1BBRERJTkcpOworICAgIGlmIChzUGFkZGluZyA+IFNJWkVfTUFYIC0gc2l6ZSkgeworICAgICAgICBBTE9HRCgiaW9uX2FsbG9jOiBzaXplICUjenggY2Fubm90IGFjY29tbW9kYXRlIHBhZGRpbmcgJSN6eCIsIHNpemUsIHNQYWRkaW5nKTsKKyAgICAgICAgLy8gdXNlIEltcGxWMiBhcyB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIGFueXdheXMKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIHNpemUsIC0xLCBpZCwgLUVOT01FTSk7CisgICAgfQorCisgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IHNpemUgKyBzUGFkZGluZzsKKyAgICBpZiAoYWxpZ24pIHsKKyAgICAgICAgaWYgKGFsaWduIC0gMSA+IFNJWkVfTUFYIC0gYWxsb2NTaXplKSB7CisgICAgICAgICAgICBBTE9HRCgiaW9uX2FsbG9jOiBzaXplICUjenggY2Fubm90IGFjY29tbW9kYXRlIHBhZGRpbmcgJSN6eCBhbmQgYWxpZ25tZW50ICUjengiLAorICAgICAgICAgICAgICAgICAgc2l6ZSwgc1BhZGRpbmcsIGFsaWduKTsKKyAgICAgICAgICAgIC8vIHVzZSBJbXBsVjIgYXMgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBhbnl3YXlzCisgICAgICAgICAgICByZXR1cm4gbmV3IEltcGxWMihpb25GZCwgc2l6ZSwgLTEsIGlkLCAtRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhbGxvY1NpemUgKz0gYWxpZ24gLSAxOworICAgICAgICBhbGxvY1NpemUgJj0gfihhbGlnbiAtIDEpOworICAgIH0KICAgICBpbnQgcmV0OwogCiAgICAgaWYgKGlvbl9pc19sZWdhY3koaW9uRmQpKSB7Ci0gICAgICAgIHJldCA9IGlvbl9hbGxvYyhpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsICZidWZmZXIpOworICAgICAgICByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsbG9jU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlcik7CiAgICAgICAgIEFMT0dWKCJpb25fYWxsb2MoaW9uRmQgPSAlZCwgc2l6ZSA9ICV6dSwgYWxpZ24gPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCkgIgogICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSA7IGJ1ZmZlciA9ICVkIiwKLSAgICAgICAgICAgICAgaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgIGlvbkZkLCBhbGxvY1NpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyKTsKICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAvLyBnZXQgYnVmZmVyIGZkIGZvciBuYXRpdmUgaGFuZGxlIGNvbnN0cnVjdG9yCiAgICAgICAgICAgICByZXQgPSBpb25fc2hhcmUoaW9uRmQsIGJ1ZmZlciwgJmJ1ZmZlckZkKTsKQEAgLTM5MiwxNSArNDE3LDE2IEBACiAgICAgICAgICAgICAgICAgYnVmZmVyID0gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7Ci0KKyAgICAgICAgLy8gdGhlIHBhZGRpbmcgaXMgbm90IHVzYWJsZSBzbyBkZWR1Y3QgaXQgZnJvbSB0aGUgYWR2ZXJ0aXNlZCBjYXBhY2l0eQorICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGFsbG9jU2l6ZSAtIHNQYWRkaW5nLCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBpb25fYWxsb2NfZmQoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyRmQpOworICAgICAgICByZXQgPSBpb25fYWxsb2NfZmQoaW9uRmQsIGFsbG9jU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlckZkKTsKICAgICAgICAgQUxPR1YoImlvbl9hbGxvY19mZChpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCiAgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyRmQgPSAlZCIsCi0gICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXJGZCk7CisgICAgICAgICAgICAgIGlvbkZkLCBhbGxvY1NpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyRmQpOwogCi0gICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGlkLCByZXQpOworICAgICAgICAvLyB0aGUgcGFkZGluZyBpcyBub3QgdXNhYmxlIHNvIGRlZHVjdCBpdCBmcm9tIHRoZSBhZHZlcnRpc2VkIGNhcGFjaXR5CisgICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBhbGxvY1NpemUgLSBzUGFkZGluZywgYnVmZmVyRmQsIGlkLCByZXQpOwogICAgIH0KIH0KIApAQCAtNTc5LDcgKzYwNSw3IEBACiAgICAgICAgIHJldHVybiBtSW5pdDsKICAgICB9CiAKLSAgICBpZiAoIUMySGFuZGxlSW9uOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICBpZiAoIUMySGFuZGxlSW9uOjpJc1ZhbGlkKGhhbmRsZSkpIHsKICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU5Niw5ICs2MjIsOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKLSAgICByZXR1cm4gQzJIYW5kbGVJb246OmlzVmFsaWQobyk7Citib29sIEMyQWxsb2NhdG9ySW9uOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUlvbjo6SXNWYWxpZChvKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkJ1ZmZlci5jcHAKaW5kZXggMGIwOGYzMS4uMTQzMzU1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApAQCAtMTA2LDYgKzEwNiw3IEBACiBjbGFzcyBCdWZmZXJEYXRhQnVkZHkgOiBwdWJsaWMgQzJCdWZmZXJEYXRhIHsKICAgICB1c2luZyBDMkJ1ZmZlckRhdGE6OkMyQnVmZmVyRGF0YTsKICAgICBmcmllbmQgY2xhc3MgOjpDMkJ1ZmZlcjsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkluZm9CdWZmZXI7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTM5NiwyNiArMzk3LDE4IEBACiBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jaygKICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSkgewogICAgIC8vIFRPRE86IGdldCBwcm9wZXIgYWxsb2NhdG9yPyBhbmQgbXV0ZXg/Ci0gICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcj4gc0FsbG9jYXRvciA9IFtdewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKLSAgICAgICAgaWYgKGFuZHJvaWQ6OkdldFByZWZlcnJlZExpbmVhckFsbG9jYXRvcklkKGFuZHJvaWQ6OkdldENvZGVjMlBvb2xNYXNrKCkpID09Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKSB7Ci0gICAgICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yQmxvYj4oYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JJb24+KGFuZHJvaWQ6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OKTsKLSAgICAgICAgfQorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IHNBbGxvY2F0b3IgPSBbXXsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKwogICAgICAgICByZXR1cm4gYWxsb2NhdG9yOwogICAgIH0oKTsKIAogICAgIGlmIChzQWxsb2NhdG9yID09IG51bGxwdHIpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgYm9vbCBpc1ZhbGlkSGFuZGxlID0gZmFsc2U7Ci0gICAgaWYgKHNBbGxvY2F0b3ItPmdldElkKCkgPT0gYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9CKSB7Ci0gICAgICAgIGlzVmFsaWRIYW5kbGUgPSBDMkFsbG9jYXRvckJsb2I6OmlzVmFsaWQoaGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpc1ZhbGlkSGFuZGxlID0gQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKTsKLSAgICB9CisgICAgYm9vbCBpc1ZhbGlkSGFuZGxlID0gc0FsbG9jYXRvci0+Y2hlY2tIYW5kbGUoaGFuZGxlKTsKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOwogICAgIGlmIChpc1ZhbGlkSGFuZGxlKSB7CkBAIC00MzEsMjYgKzQyNCwxOCBAQAogc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCiAgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CiAgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KLSAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yPiBzQWxsb2NhdG9yID0gW117Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOwotICAgICAgICBpZiAoYW5kcm9pZDo6R2V0UHJlZmVycmVkTGluZWFyQWxsb2NhdG9ySWQoYW5kcm9pZDo6R2V0Q29kZWMyUG9vbE1hc2soKSkgPT0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JCbG9iPihhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oYW5kcm9pZDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOwotICAgICAgICB9CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gc0FsbG9jYXRvciA9IFtdeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0gYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworCiAgICAgICAgIHJldHVybiBhbGxvY2F0b3I7CiAgICAgfSgpOwogCiAgICAgaWYgKHNBbGxvY2F0b3IgPT0gbnVsbHB0cikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBib29sIGlzVmFsaWRIYW5kbGUgPSBmYWxzZTsKLSAgICBpZiAoc0FsbG9jYXRvci0+Z2V0SWQoKSA9PSBhbmRyb2lkOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJMT0IpIHsKLSAgICAgICAgaXNWYWxpZEhhbmRsZSA9IEMyQWxsb2NhdG9yQmxvYjo6aXNWYWxpZChjSGFuZGxlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpc1ZhbGlkSGFuZGxlID0gQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSk7Ci0gICAgfQorICAgIGJvb2wgaXNWYWxpZEhhbmRsZSA9IHNBbGxvY2F0b3ItPmNoZWNrSGFuZGxlKGNIYW5kbGUpOwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYWxsb2M7CiAgICAgaWYgKGlzVmFsaWRIYW5kbGUpIHsKQEAgLTExNDgsNyArMTEzMyw3IEBACiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7Ci0gICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjSGFuZGxlKSkgeworICAgIGlmIChzQWxsb2NhdG9yLT5pc1ZhbGlkKGNIYW5kbGUpKSB7CiAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHNBbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oY0hhbmRsZSwgJmFsbG9jKTsKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKQEAgLTExODUsNiArMTE3MCw3IEBACiAgICAgdHlwZV90IG1UeXBlOwogICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKICAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKKyAgICBmcmllbmQgY2xhc3MgQzJJbmZvQnVmZmVyOwogfTsKIAogQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IG1JbXBsKG5ldyBJbXBsKGJsb2NrcykpIHt9CkBAIC0xMjAwLDYgKzExODYsMzUgQEAKICAgICByZXR1cm4gbUltcGwtPmdyYXBoaWNCbG9ja3MoKTsKIH0KIAorQzJJbmZvQnVmZmVyOjpDMkluZm9CdWZmZXIoCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKKyAgICA6IG1JbmRleChpbmRleCksIG1EYXRhKEJ1ZmZlckRhdGFCdWRkeShibG9ja3MpKSB7Cit9CisKK0MySW5mb0J1ZmZlcjo6QzJJbmZvQnVmZmVyKAorICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgIDogbUluZGV4KGluZGV4KSwgbURhdGEoQnVmZmVyRGF0YUJ1ZGR5KGJsb2NrcykpIHsKK30KKworQzJJbmZvQnVmZmVyOjpDMkluZm9CdWZmZXIoCisgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSkKKyAgICA6IG1JbmRleChpbmRleCksIG1EYXRhKGRhdGEpIHsKK30KKworLy8gc3RhdGljCitDMkluZm9CdWZmZXIgQzJJbmZvQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdExpbmVhckJsb2NrICZibG9jaykgeworICAgIHJldHVybiBDMkluZm9CdWZmZXIoaW5kZXguY29yZUluZGV4KCkgfCBDMlBhcmFtOjpJbmRleDo6S0lORF9JTkZPIHwgQzJQYXJhbTo6SW5kZXg6OkRJUl9HTE9CQUwsCisgICAgICAgICAgICAgICAgICAgICAgICB7IGJsb2NrIH0pOworfQorCisvLyBzdGF0aWMKK0MySW5mb0J1ZmZlciBDMkluZm9CdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gQzJJbmZvQnVmZmVyKGluZGV4LmNvcmVJbmRleCgpIHwgQzJQYXJhbTo6SW5kZXg6OktJTkRfSU5GTyB8IEMyUGFyYW06OkluZGV4OjpESVJfR0xPQkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgeyBibG9jayB9KTsKK30KKwogY2xhc3MgQzJCdWZmZXI6OkltcGwgewogcHVibGljOgogICAgIEltcGwoQzJCdWZmZXIgKnRoaXosIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykKQEAgLTEzMzAsNCArMTM0NSwzIEBACiBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrKSB7CiAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkNvbmZpZy5jcHAKaW5kZXggMzQ2ODBhNy4uZTkyMjNmYiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApAQCAtMTQyLDYgKzE0MiwxNCBAQAogICAgICAgICB7ICJhdjEtMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wIH0sCiAgICAgICAgIHsgImF2MS0xIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzEgfSwKICAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMiB9LAorICAgICAgICB7ICJ2cDgtMCIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOF8wIH0sCisgICAgICAgIHsgInZwOC0xIiwgQzJDb25maWc6OlBST0ZJTEVfVlA4XzEgfSwKKyAgICAgICAgeyAidnA4LTIiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDhfMiB9LAorICAgICAgICB7ICJ2cDgtMyIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOF8zIH0sCisgICAgICAgIHsgIm1wZWdoLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUEVHSF9NQUlOIH0sCisgICAgICAgIHsgIm1wZWdoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9NUEVHSF9ISUdIIH0sCisgICAgICAgIHsgIm1wZWdoLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfTVBFR0hfTEMgfSwKKyAgICAgICAgeyAibXBlZ2gtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUEVHSF9CQVNFTElORSB9LAogfSkpCiAKIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OmxldmVsX3QsICh7CkBAIC0yNDgsNiArMjU2LDExIEBACiAgICAgICAgIHsgImF2MS03LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMSB9LAogICAgICAgICB7ICJhdjEtNy4yIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzIgfSwKICAgICAgICAgeyAiYXYxLTcuMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18zIH0sCisgICAgICAgIHsgIm1wZWdoLTEiLCBDMkNvbmZpZzo6TEVWRUxfTVBFR0hfMSB9LAorICAgICAgICB7ICJtcGVnaC0yIiwgQzJDb25maWc6OkxFVkVMX01QRUdIXzIgfSwKKyAgICAgICAgeyAibXBlZ2gtMyIsIEMyQ29uZmlnOjpMRVZFTF9NUEVHSF8zIH0sCisgICAgICAgIHsgIm1wZWdoLTQiLCBDMkNvbmZpZzo6TEVWRUxfTVBFR0hfNCB9LAorICAgICAgICB7ICJtcGVnaC01IiwgQzJDb25maWc6OkxFVkVMX01QRUdIXzUgfSwKIH0pKQogCiBERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKEMyQnVmZmVyRGF0YTo6dHlwZV90LCAoewpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJEbWFCdWZBbGxvY2F0b3IuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJEbWFCdWZBbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTNkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkRtYUJ1ZkFsbG9jYXRvci5jcHAKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyRG1hQnVmQWxsb2NhdG9yIgorCisjaW5jbHVkZSA8QnVmZmVyQWxsb2NhdG9yL0J1ZmZlckFsbG9jYXRvci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyRG1hQnVmQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8QzJFcnJub1V0aWxzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pb24uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAgLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IFVTQUdFX0xSVV9DQUNIRV9TSVpFID0gMTAyNDsKKworICAgIC8vIG1heCBwYWRkaW5nIGFmdGVyIGlvbi9kbWFidWYgYWxsb2NhdGlvbnMgaW4gYnl0ZXMKKyAgICBjb25zdGV4cHIgdWludDMyX3QgTUFYX1BBRERJTkcgPSAweDgwMDA7IC8vIDMyS0IKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiBIQU5ETEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIEJ1ZmZlciBoYW5kbGUKKyAqCisgKiBTdG9yZXMgZG1hYnVmIGZkICYgbWV0YWRhdGEKKyAqCisgKiBUaGlzIGhhbmRsZSB3aWxsIG5vdCBjYXB0dXJlIG1hcHBlZCBmZC1zIGFzIHVwZGF0aW5nIHRoYXQgd291bGQgcmVxdWlyZSBhCisgKiBnbG9iYWwgbXV0ZXguCisgKi8KKworc3RydWN0IEMySGFuZGxlQnVmIDogcHVibGljIEMySGFuZGxlIHsKKyAgICBDMkhhbmRsZUJ1ZihpbnQgYnVmZmVyRmQsIHNpemVfdCBzaXplKQorICAgICAgICA6IEMySGFuZGxlKGNIZWFkZXIpLAorICAgICAgICAgIG1GZHN7YnVmZmVyRmR9LAorICAgICAgICAgIG1JbnRze2ludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpY30ge30KKworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1CdWZmZXI7ICAvLyBkbWFidWYgZmQKKyAgICB9IG1GZHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1TaXplTG87ICAvLyBsb3cgMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtU2l6ZUhpOyAgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVCdWYgX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvLyBjb25zdGV4cHIgc3RhdGljIEMySGFuZGxlIGNIZWFkZXIgPSB7IHZlcnNpb24sIG51bUZkcywgbnVtSW50cywge30gfTsKKyAgICBjb25zdCBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlcjsKK307CisKK2NvbnN0IEMySGFuZGxlIEMySGFuZGxlQnVmOjpjSGVhZGVyID0geworICAgICAgICBDMkhhbmRsZUJ1Zjo6dmVyc2lvbiwgQzJIYW5kbGVCdWY6Om51bUZkcywgQzJIYW5kbGVCdWY6Om51bUludHMsIHt9fTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlQnVmOjpJc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IEMySGFuZGxlQnVmKiBvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlQnVmKj4obyk7CisgICAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRE1BQlVGIEFMTE9DQVRJT04gPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkRtYUJ1ZkFsbG9jYXRpb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKKyAgIHB1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlKiBmZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlKiBmZW5jZUZkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIH5DMkRtYUJ1ZkFsbG9jYXRpb24oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+JiBvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisKKyAgICAvKioKKyAgICAgICogQ29uc3RydWN0cyBhbiBhbGxvY2F0aW9uIHZpYSBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgKgorICAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGFsbG9jYXRvcgorICAgICAgKiBAcGFyYW0gYWxsb2NTaXplIHNpemUgdXNlZCBmb3IgdGhlIGFsbG9jYXRvcgorICAgICAgKiBAcGFyYW0gY2FwYWNpdHkgIGNhcGFjaXR5IGFkdmVydGlzZWQgdG8gdGhlIGNsaWVudAorICAgICAgKiBAcGFyYW0gaGVhcF9uYW1lIG5hbWUgb2YgdGhlIGRtYWJ1ZiBoZWFwIChkZXZpY2UpCisgICAgICAqIEBwYXJhbSBmbGFncyAgICAgZmxhZ3MKKyAgICAgICogQHBhcmFtIGlkICAgICAgICBhbGxvY2F0b3IgaWQKKyAgICAgICovCisgICAgQzJEbWFCdWZBbGxvY2F0aW9uKEJ1ZmZlckFsbG9jYXRvciYgYWxsb2MsIHNpemVfdCBhbGxvY1NpemUsIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJpbmcgaGVhcF9uYW1lLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgLyoqCisgICAgICAqIENvbnN0cnVjdHMgYW4gYWxsb2NhdGlvbiBieSB3cmFwcGluZyBhbiBleGlzdGluZyBhbGxvY2F0aW9uLgorICAgICAgKgorICAgICAgKiBAcGFyYW0gc2l6ZSAgICBjYXBhY2l0eSBhZHZlcnRpc2VkIHRvIHRoZSBjbGllbnQKKyAgICAgICogQHBhcmFtIHNoYXJlRmQgZG1hYnVmIGZkIG9mIHRoZSB3cmFwcGVkIGFsbG9jYXRpb24KKyAgICAgICogQHBhcmFtIGlkICAgICAgYWxsb2NhdG9yIGlkCisgICAgICAqLworICAgIEMyRG1hQnVmQWxsb2NhdGlvbihzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXBJbnRlcm5hbChzaXplX3QgbWFwU2l6ZSwgc2l6ZV90IG1hcE9mZnNldCwgc2l6ZV90IGFsaWdubWVudEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3QsIGludCBmbGFncywgdm9pZCoqIGJhc2UsIHZvaWQqKiBhZGRyKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAqYmFzZSA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1IYW5kbGUuYnVmZmVyRmQoKSwgbWFwT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoIm1tYXAoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgaWYgKCpiYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IG1JZDsKKyAgICBDMkhhbmRsZUJ1ZiBtSGFuZGxlOworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0cnVjdCBNYXBwaW5nIHsKKyAgICAgICAgdm9pZCogYWRkcjsKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxNYXBwaW5nPiBtTWFwcGluZ3M7CisKKyAgICAvLyBUT0RPOiB3ZSBjb3VsZCBtYWtlIHRoaXMgZW5jYXBzdWxhdGUgc2hhcmVkX3B0ciBhbmQgY29waWFibGUKKyAgICBDMl9ET19OT1RfQ09QWShDMkRtYUJ1ZkFsbG9jYXRpb24pOworfTsKKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0aW9uOjptYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UqIGZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGFkZHIpIHsKKyAgICAodm9pZClmZW5jZTsgIC8vIFRPRE86IHdhaXQgZm9yIGZlbmNlCisgICAgKmFkZHIgPSBudWxscHRyOworICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIm11bHRpcGxlIG1hcCIpOworICAgICAgICAvLyBUT0RPOiB0ZWNobmljYWxseSB3ZSBzaG91bGQgcmV0dXJuIERVUExJQ0FURSBoZXJlLCBidXQgb3VyIGJsb2NrIHZpZXdzCisgICAgICAgIC8vIGRvbid0IGFjdHVhbGx5IHVubWFwLCBzbyB3ZSBlbmQgdXAgcmVtYXBwaW5nIHRoZSBidWZmZXIgbXVsdGlwbGUgdGltZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgfQorICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgcHJvdCA9IFBST1RfTk9ORTsKKyAgICBpbnQgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgIHByb3QgfD0gUFJPVF9SRUFEOworICAgIH0KKyAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpIHsKKyAgICAgICAgcHJvdCB8PSBQUk9UX1dSSVRFOworICAgIH0KKworICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlcyA9IG9mZnNldCAlIFBBR0VfU0laRTsKKyAgICBzaXplX3QgbWFwT2Zmc2V0ID0gb2Zmc2V0IC0gYWxpZ25tZW50Qnl0ZXM7CisgICAgc2l6ZV90IG1hcFNpemUgPSBzaXplICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgTWFwcGluZyBtYXAgPSB7bnVsbHB0ciwgYWxpZ25tZW50Qnl0ZXMsIG1hcFNpemV9OworCisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgIG1hcEludGVybmFsKG1hcFNpemUsIG1hcE9mZnNldCwgYWxpZ25tZW50Qnl0ZXMsIHByb3QsIGZsYWdzLCAmKG1hcC5hZGRyKSwgYWRkcik7CisgICAgaWYgKG1hcC5hZGRyKSB7CisgICAgICAgIG1NYXBwaW5ncy5wdXNoX2JhY2sobWFwKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0aW9uOjp1bm1hcCh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSogZmVuY2UpIHsKKyAgICBpZiAobU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0QoInRyaWVkIHRvIHVubWFwIHVubWFwcGVkIGJ1ZmZlciIpOworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFwcGluZ3MuYmVnaW4oKTsgaXQgIT0gbU1hcHBpbmdzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChhZGRyICE9ICh1aW50OF90KilpdC0+YWRkciArIGl0LT5hbGlnbm1lbnRCeXRlcyB8fAorICAgICAgICAgICAgc2l6ZSArIGl0LT5hbGlnbm1lbnRCeXRlcyAhPSBpdC0+c2l6ZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVyciA9IG11bm1hcChpdC0+YWRkciwgaXQtPnNpemUpOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJtdW5tYXAgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICB9CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOyAgLy8gbm90IHVzaW5nIGZlbmNlcworICAgICAgICB9CisgICAgICAgICh2b2lkKW1NYXBwaW5ncy5lcmFzZShpdCk7CisgICAgICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgdW5tYXBwZWQ6ICVkIiwgbUhhbmRsZS5idWZmZXJGZCgpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBBTE9HRCgidW5tYXAgZmFpbGVkIHRvIGZpbmQgc3BlY2lmaWVkIG1hcCIpOworICAgIHJldHVybiBDMl9CQURfVkFMVUU7Cit9CisKK2MyX3N0YXR1c190IEMyRG1hQnVmQWxsb2NhdGlvbjo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJEbWFCdWZBbGxvY2F0aW9uOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUlkOworfQorCitib29sIEMyRG1hQnVmQWxsb2NhdGlvbjo6ZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+JiBvdGhlcikgY29uc3QgeworICAgIGlmICghb3RoZXIgfHwgb3RoZXItPmdldEFsbG9jYXRvcklkKCkgIT0gZ2V0QWxsb2NhdG9ySWQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGdldCB1c2VyIGhhbmRsZSB0byBjb21wYXJlIG9iamVjdHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJEbWFCdWZBbGxvY2F0aW9uPiBvdGhlckFzQnVmID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkRtYUJ1ZkFsbG9jYXRpb24+KG90aGVyKTsKKyAgICByZXR1cm4gbUhhbmRsZS5idWZmZXJGZCgpID09IG90aGVyQXNCdWYtPm1IYW5kbGUuYnVmZmVyRmQoKTsKK30KKworY29uc3QgQzJIYW5kbGUqIEMyRG1hQnVmQWxsb2NhdGlvbjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiAmbUhhbmRsZTsKK30KKworQzJEbWFCdWZBbGxvY2F0aW9uOjp+QzJEbWFCdWZBbGxvY2F0aW9uKCkgeworICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICBmb3IgKGNvbnN0IE1hcHBpbmcmIG1hcCA6IG1NYXBwaW5ncykgeworICAgICAgICAgICAgaW50IGVyciA9IG11bm1hcChtYXAuYWRkciwgbWFwLnNpemUpOworICAgICAgICAgICAgaWYgKGVycikgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgfQorfQorCitDMkRtYUJ1ZkFsbG9jYXRpb246OkMyRG1hQnVmQWxsb2NhdGlvbihCdWZmZXJBbGxvY2F0b3ImIGFsbG9jLCBzaXplX3QgYWxsb2NTaXplLCBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmluZyBoZWFwX25hbWUsIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihjYXBhY2l0eSksIG1IYW5kbGUoLTEsIDApIHsKKyAgICBpbnQgYnVmZmVyRmQgPSAtMTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGJ1ZmZlckZkID0gYWxsb2MuQWxsb2MoaGVhcF9uYW1lLCBhbGxvY1NpemUsIGZsYWdzKTsKKyAgICBpZiAoYnVmZmVyRmQgPCAwKSB7CisgICAgICAgIHJldCA9IGJ1ZmZlckZkOworICAgIH0KKworICAgIC8vIHRoaXMgbWF5IGJlIGEgbm9uLXdvcmtpbmcgaGFuZGxlIGlmIGJ1ZmZlckZkIGlzIG5lZ2F0aXZlCisgICAgbUhhbmRsZSA9IEMySGFuZGxlQnVmKGJ1ZmZlckZkLCBjYXBhY2l0eSk7CisgICAgbUlkID0gaWQ7CisgICAgbUluaXQgPSBjMl9zdGF0dXNfdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4ocmV0KSk7Cit9CisKK0MyRG1hQnVmQWxsb2NhdGlvbjo6QzJEbWFCdWZBbGxvY2F0aW9uKHNpemVfdCBzaXplLCBpbnQgc2hhcmVGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksIG1IYW5kbGUoLTEsIDApIHsKKyAgICBtSGFuZGxlID0gQzJIYW5kbGVCdWYoc2hhcmVGZCwgc2l6ZSk7CisgICAgbUlkID0gaWQ7CisgICAgbUluaXQgPSBjMl9zdGF0dXNfdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oMCkpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gRE1BQlVGIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0MyRG1hQnVmQWxsb2NhdG9yOjpDMkRtYUJ1ZkFsbG9jYXRvcihpZF90IGlkKSA6IG1Jbml0KEMyX09LKSB7CisgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHswLCAwfTsKKyAgICBDMk1lbW9yeVVzYWdlIG1heFVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIFRyYWl0cyB0cmFpdHMgPSB7ImFuZHJvaWQuYWxsb2NhdG9yLmRtYWJ1ZiIsIGlkLCBMSU5FQVIsIG1pblVzYWdlLCBtYXhVc2FnZX07CisgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkRtYUJ1ZkFsbG9jYXRvcjo6Z2V0SWQoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworfQorCitDMlN0cmluZyBDMkRtYUJ1ZkFsbG9jYXRvcjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyRG1hQnVmQWxsb2NhdG9yOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK3ZvaWQgQzJEbWFCdWZBbGxvY2F0b3I6OnNldFVzYWdlTWFwcGVyKGNvbnN0IFVzYWdlTWFwcGVyRm4mIG1hcHBlciBfX3VudXNlZCwgdWludDY0X3QgbWluVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgbVVzYWdlTWFwcGVyQ2FjaGUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXJMcnUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXIgPSBtYXBwZXI7CisgICAgVHJhaXRzIHRyYWl0cyA9IHttVHJhaXRzLT5uYW1lLCBtVHJhaXRzLT5pZCwgTElORUFSLCBDMk1lbW9yeVVzYWdlKG1pblVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UobWF4VXNhZ2UpfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKK30KKworc3RkOjpzaXplX3QgQzJEbWFCdWZBbGxvY2F0b3I6Ok1hcHBlcktleUhhc2g6Om9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5JiBrKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShrLmZpcnN0KSBeIHN0ZDo6aGFzaDxzaXplX3Q+e30oay5zZWNvbmQpOworfQorCitjMl9zdGF0dXNfdCBDMkRtYUJ1ZkFsbG9jYXRvcjo6bWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LCBDMlN0cmluZyogaGVhcF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBmbGFncykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgIC8vIGFsaWduIGNhcGFjaXR5CisgICAgY2FwYWNpdHkgPSAoY2FwYWNpdHkgKyBtQmxvY2tTaXplIC0gMSkgJiB+KG1CbG9ja1NpemUgLSAxKTsKKyAgICBNYXBwZXJLZXkga2V5ID0gc3RkOjptYWtlX3BhaXIodXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICBhdXRvIGVudHJ5ID0gbVVzYWdlTWFwcGVyQ2FjaGUuZmluZChrZXkpOworICAgIGlmIChlbnRyeSA9PSBtVXNhZ2VNYXBwZXJDYWNoZS5lbmQoKSkgeworICAgICAgICBpZiAobVVzYWdlTWFwcGVyKSB7CisgICAgICAgICAgICByZXMgPSBtVXNhZ2VNYXBwZXIodXNhZ2UsIGNhcGFjaXR5LCBoZWFwX25hbWUsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChDMkRtYUJ1ZkFsbG9jYXRvcjo6c3lzdGVtX3VuY2FjaGVkX3N1cHBvcnRlZCgpICYmCisgICAgICAgICAgICAgICAgISh1c2FnZS5leHBlY3RlZCAmIChDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkpKQorICAgICAgICAgICAgICAgICpoZWFwX25hbWUgPSAic3lzdGVtLXVuY2FjaGVkIjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqaGVhcF9uYW1lID0gInN5c3RlbSI7CisgICAgICAgICAgICAqZmxhZ3MgPSAwOworICAgICAgICAgICAgcmVzID0gQzJfTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgdXNhZ2UgdG8gY2FjaGUKKyAgICAgICAgTWFwcGVyVmFsdWUgdmFsdWUgPSBzdGQ6Om1ha2VfdHVwbGUoKmhlYXBfbmFtZSwgKmZsYWdzLCByZXMpOworICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuZW1wbGFjZV9mcm9udChrZXksIHZhbHVlKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZW1wbGFjZShzdGQ6Om1ha2VfcGFpcihrZXksIG1Vc2FnZU1hcHBlckxydS5iZWdpbigpKSk7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXJDYWNoZS5zaXplKCkgPiBVU0FHRV9MUlVfQ0FDSEVfU0laRSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIExSVSBlbnRyeQorICAgICAgICAgICAgTWFwcGVyS2V5IGxydUtleSA9IG1Vc2FnZU1hcHBlckxydS5mcm9udCgpLmZpcnN0OworICAgICAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZXJhc2UobHJ1S2V5KTsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckxydS5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW92ZSBlbnRyeSB0byBNUlUKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnNwbGljZShtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSwgbVVzYWdlTWFwcGVyTHJ1LCBlbnRyeS0+c2Vjb25kKTsKKyAgICAgICAgY29uc3QgTWFwcGVyVmFsdWUmIHZhbHVlID0gZW50cnktPnNlY29uZC0+c2Vjb25kOworICAgICAgICBzdGQ6OnRpZSgqaGVhcF9uYW1lLCAqZmxhZ3MsIHJlcykgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0b3I6Om5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiogYWxsb2NhdGlvbikgeworICAgIGlmIChhbGxvY2F0aW9uID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhbGxvY2F0aW9uLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgQzJTdHJpbmcgaGVhcF9uYW1lOworICAgIHVuc2lnbmVkIGZsYWdzID0gMDsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBtYXBVc2FnZSh1c2FnZSwgY2FwYWNpdHksICZoZWFwX25hbWUsICZmbGFncyk7CisgICAgaWYgKHJldCAmJiByZXQgIT0gQzJfTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRPRE86IHNob3VsZCB3ZSBwYWQgYmVmb3JlIG1hcHBpbmcgdXNhZ2U/CisKKyAgICAvLyBOT1RFOiByZWFkIHRoaXMgcHJvcGVydHkgZGlyZWN0bHkgZnJvbSB0aGUgcHJvcGVydHkgYXMgdGhpcyBjb2RlIGhhcyB0byBydW4gb24KKyAgICAvLyBBbmRyb2lkIFEsIGJ1dCB0aGUgc3lzcHJvcCB3YXMgb25seSBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgUy4KKyAgICBzdGF0aWMgc2l6ZV90IHNQYWRkaW5nID0KKyAgICAgICAgYmFzZTo6R2V0VWludFByb3BlcnR5KCJtZWRpYS5jMi5kbWFidWYucGFkZGluZyIsICh1aW50MzJfdCkwLCBNQVhfUEFERElORyk7CisgICAgaWYgKHNQYWRkaW5nID4gU0laRV9NQVggLSBjYXBhY2l0eSkgeworICAgICAgICAvLyBzaXplIHdvdWxkIG92ZXJmbG93CisgICAgICAgIEFMT0dEKCJkbWFidWZfYWxsb2M6IHNpemUgIyV4IGNhbm5vdCBhY2NvbW1vZGF0ZSBwYWRkaW5nICMlengiLCBjYXBhY2l0eSwgc1BhZGRpbmcpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHNpemVfdCBhbGxvY1NpemUgPSAoc2l6ZV90KWNhcGFjaXR5ICsgc1BhZGRpbmc7CisgICAgLy8gVE9ETzogc2hvdWxkIHdlIGFsaWduIGFsbG9jYXRpb24gc2l6ZSB0byBtQmxvY2tTaXplIHRvIHJlZmxlY3QgdGhlIHRydWUgYWxsb2NhdGlvbiBzaXplPworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkRtYUJ1ZkFsbG9jYXRpb24+IGFsbG9jID0gc3RkOjptYWtlX3NoYXJlZDxDMkRtYUJ1ZkFsbG9jYXRpb24+KAorICAgICAgICAgICAgbUJ1ZmZlckFsbG9jYXRvciwgYWxsb2NTaXplLCBhbGxvY1NpemUgLSBzUGFkZGluZywgaGVhcF9uYW1lLCBmbGFncywgZ2V0SWQoKSk7CisgICAgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYzJfc3RhdHVzX3QgQzJEbWFCdWZBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4qIGFsbG9jYXRpb24pIHsKKyAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBpZiAoIUMySGFuZGxlQnVmOjpJc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBnZXQgY2FwYWNpdHkgYW5kIHZhbGlkYXRlIGl0CisgICAgY29uc3QgQzJIYW5kbGVCdWYqIGggPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUJ1Zio+KGhhbmRsZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRG1hQnVmQWxsb2NhdGlvbj4gYWxsb2MgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkRtYUJ1ZkFsbG9jYXRpb24+KGgtPnNpemUoKSwgaC0+YnVmZmVyRmQoKSwgZ2V0SWQoKSk7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gYWxsb2MtPnN0YXR1cygpOworICAgIGlmIChyZXQgPT0gQzJfT0spIHsKKyAgICAgICAgKmFsbG9jYXRpb24gPSBhbGxvYzsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihyZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLy8gc3RhdGljCitib29sIEMyRG1hQnVmQWxsb2NhdG9yOjpDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUJ1Zjo6SXNWYWxpZChvKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJGZW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1MTgzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyRmVuY2UuY3BwCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkZlbmNlRmFjdG9yeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyRmVuY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8QzJTdXJmYWNlU3luY09iai5oPgorCitjbGFzcyBDMkZlbmNlOjpJbXBsIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCByZWFkeSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGZkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBib29sIGlzSFcoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5JbXBsKCkgPSBkZWZhdWx0OworCisgICAgSW1wbCgpID0gZGVmYXVsdDsKK307CisKK2MyX3N0YXR1c190IEMyRmVuY2U6OndhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT53YWl0KHRpbWVvdXROcyk7CisgICAgfQorICAgIC8vIG51bGwgZmVuY2UgaXMgYWx3YXlzIHNpZ25hbGxlZC4KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJGZW5jZTo6dmFsaWQoKSBjb25zdCB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+dmFsaWQoKTsKKyAgICB9CisgICAgLy8gbnVsbCBmZW5jZSBpcyBhbHdheXMgdmFsaWQuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJGZW5jZTo6cmVhZHkoKSBjb25zdCB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVhZHkoKTsKKyAgICB9CisgICAgLy8gbnVsbCBmZW5jZSBpcyBhbHdheXMgc2lnbmFsbGVkLgorICAgIHJldHVybiB0cnVlOworfQorCitpbnQgQzJGZW5jZTo6ZmQoKSBjb25zdCB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmQoKTsKKyAgICB9CisgICAgLy8gbnVsbCBmZW5jZSBkb2VzIG5vdCBoYXZlIGZkLgorICAgIHJldHVybiAtMTsKK30KKworYm9vbCBDMkZlbmNlOjppc0hXKCkgY29uc3QgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmlzSFcoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIEZlbmNlIGltcGxlbWVudGF0aW9uIGZvciBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sIGJhc2VkIGJsb2NrIGFsbG9jYXRpb24uCisgKiBUaGUgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgYWxsIEMyRmVuY2UgaW50ZXJmYWNlIGV4Y2VwdCBmZCgpLgorICovCitjbGFzcyBfQzJGZW5jZUZhY3Rvcnk6OlN1cmZhY2VGZW5jZUltcGw6IHB1YmxpYyBDMkZlbmNlOjpJbXBsIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpIHsKKyAgICAgICAgaWYgKG1QdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBtUHRyLT53YWl0Rm9yQ2hhbmdlKG1XYWl0SWQsIHRpbWVvdXROcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCB2YWxpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QdHI7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgeworICAgICAgICB1aW50MzJfdCBzdGF0dXM7CisgICAgICAgIGlmIChtUHRyKSB7CisgICAgICAgICAgICBtUHRyLT5sb2NrKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBtUHRyLT5nZXRXYWl0SWRMb2NrZWQoKTsKKyAgICAgICAgICAgIG1QdHItPnVubG9jaygpOworCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzICE9IG1XYWl0SWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgZmQoKSBjb25zdCB7CisgICAgICAgIC8vIGRvZXMgbm90IHN1cHBvcnQgZmQsIHNpbmNlIHRoaXMgaXMgc2hhcmVkIG1lbSBhbmQgZnV0ZXggYmFzZWQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hXKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB+U3VyZmFjZUZlbmNlSW1wbCgpIHt9OworCisgICAgU3VyZmFjZUZlbmNlSW1wbChzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSwgdWludDMyX3Qgd2FpdElkKSA6CisgICAgICAgICAgICBtU3luY01lbShzeW5jTWVtKSwKKyAgICAgICAgICAgIG1QdHIoc3luY01lbSA/IHN5bmNNZW0tPm1lbSgpIDogbnVsbHB0ciksCisgICAgICAgICAgICBtV2FpdElkKHN5bmNNZW0gPyB3YWl0SWQgOiAwKSB7fQorcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdXJmYWNlU3luY01lbW9yeT4gbVN5bmNNZW07IC8vIFRoaXMgaXMgZm9yIGxpZmUtY3ljbGUgZ3VhcmFudGVlCisgICAgQzJTeW5jVmFyaWFibGVzICpjb25zdCBtUHRyOworICAgIGNvbnN0IHVpbnQzMl90IG1XYWl0SWQ7Cit9OworCitDMkZlbmNlOjpDMkZlbmNlKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKSA6IG1JbXBsKGltcGwpIHt9CisKK0MyRmVuY2UgX0MyRmVuY2VGYWN0b3J5OjpDcmVhdGVTdXJmYWNlRmVuY2UoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLAorICAgICAgICB1aW50MzJfdCB3YWl0SWQpIHsKKyAgICBpZiAoc3luY01lbSkgeworICAgICAgICBDMkZlbmNlOjpJbXBsICpwCisgICAgICAgICAgICAgICAgPSBuZXcgX0MyRmVuY2VGYWN0b3J5OjpTdXJmYWNlRmVuY2VJbXBsKHN5bmNNZW0sIHdhaXRJZCk7CisgICAgICAgIGlmIChwLT52YWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJGZW5jZShzdGQ6OnNoYXJlZF9wdHI8QzJGZW5jZTo6SW1wbD4ocCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsZXRlIHA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyRmVuY2UoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDRjMzMwZTUuLmJlZTAyOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMzMsNyArMzMsOCBAQAogfSAgLy8gdW5uYW1lZAogCiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQotICAgIDogbUNyZWF0ZUJsb2NrUG9vbChudWxscHRyKSB7CisgICAgOiBtQ3JlYXRlQmxvY2tQb29sKG51bGxwdHIpLAorICAgICAgbUNyZWF0ZUFsbG9jYXRvcihudWxscHRyKSB7CiAgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOwogICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcAppbmRleCBkMTY1MjdlLi5jMDdjMDllIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPEMyQWxsb2NhdG9yQmxvYi5oPgogI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgogI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJEbWFCdWZBbGxvY2F0b3IuaD4KICNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgogI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CkBAIC04Miw2ICs4Myw3IEBACiAKICAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gaW9uIGFsbG9jYXRvcgogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoRG1hQnVmQWxsb2NhdG9yKCk7CiAKICAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gZ3JhbGxvYyBhbGxvY2F0b3IKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGZldGNoR3JhbGxvY0FsbG9jYXRvcigpOwpAQCAtOTksNiArMTAxLDM0IEBACiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgewogfQogCitzdGF0aWMgYm9vbCB1c2luZ19pb24odm9pZCkgeworICAgIHN0YXRpYyBpbnQgY2FjaGVkX3Jlc3VsdCA9IFtdKCktPmludCB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZmZlcjsKKyAgICAgICAgaW50IHJldCA9IChzdGF0KCIvZGV2L2lvbiIsICZidWZmZXIpID09IDApOworCisgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfaW50MzIoImRlYnVnLmMyLnVzZV9kbWFidWZoZWFwcyIsIDApKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRG91YmxlIGNoZWNrIHRoYXQgdGhlIHN5c3RlbSBoZWFwIGlzIHByZXNlbnQgc28gd2UKKyAgICAgICAgICAgICAqIGNhbiBncmFjZWZ1bGx5IGZhaWwgYmFjayB0byBJT04gaWYgd2UgY2Fubm90IHNhdGlzZnkKKyAgICAgICAgICAgICAqIHRoZSBvdmVycmlkZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXQgPSAoc3RhdCgiL2Rldi9kbWFfaGVhcC9zeXN0ZW0iLCAmYnVmZmVyKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgQUxPR0UoImRlYnVnLmMyLnVzZV9kbWFidWZoZWFwcyBzZXQsIGJ1dCBubyBzeXN0ZW0gaGVhcC4gSWdub3Jpbmcgb3ZlcnJpZGUhIik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR0QoImRlYnVnLmMyLnVzZV9kbWFidWZoZWFwcyBzZXQsIGZvcmNpbmcgRE1BQlVGIEhlYXBzIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgQUxPR0QoIlVzaW5nIElPTlxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBETUFCVUYgSGVhcHNcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0oKTsKKworICAgIHJldHVybiAoY2FjaGVkX3Jlc3VsdCA9PSAxKTsKK30KKwogYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hBbGxvY2F0b3IoCiAgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgewogICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKQEAgLTEwNyw4ICsxMzcsMTEgQEAKICAgICB9CiAgICAgc3dpdGNoIChpZCkgewogICAgIC8vIFRPRE86IHNob3VsZCB3ZSBpbXBsZW1lbnQgYSBnZW5lcmljIHJlZ2lzdHJ5IGZvciBhbGwsIGFuZCB1c2UgdGhhdD8KLSAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgotICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOiAvKiBhbHNvIDo6RE1BQlVGSEVBUCAqLworICAgICAgICBpZiAodXNpbmdfaW9uKCkpCisgICAgICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoRG1hQnVmQWxsb2NhdG9yKCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CkBAIC0xNDIsNyArMTc1LDkgQEAKIG5hbWVzcGFjZSB7CiAKIHN0ZDo6bXV0ZXggZ0lvbkFsbG9jYXRvck11dGV4Oworc3RkOjptdXRleCBnRG1hQnVmQWxsb2NhdG9yTXV0ZXg7CiBzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9ySW9uPiBnSW9uQWxsb2NhdG9yOworc3RkOjp3ZWFrX3B0cjxDMkRtYUJ1ZkFsbG9jYXRvcj4gZ0RtYUJ1ZkFsbG9jYXRvcjsKIAogdm9pZCBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcigKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IsCkBAIC0xOTcsNiArMjMyLDY1IEBACiAgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKIH0KIAordm9pZCBVc2VDb21wb25lbnRTdG9yZUZvckRtYUJ1ZkFsbG9jYXRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJEbWFCdWZBbGxvY2F0b3I+IGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgQzJEbWFCdWZBbGxvY2F0b3I6OlVzYWdlTWFwcGVyRm4gbWFwcGVyOworICAgIGNvbnN0IHNpemVfdCBtYXhIZWFwTmFtZUxlbiA9IDEyODsKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSBDMk1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpLmV4cGVjdGVkOworICAgIHNpemVfdCBibG9ja1NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisgICAgLy8gcXVlcnkgbWluIGFuZCBtYXggdXNhZ2UgYXMgd2VsbCBhcyBibG9jayBzaXplIHZpYSBzdXBwb3J0ZWQgdmFsdWVzCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RvcmVEbWFCdWZVc2FnZUluZm8+IHVzYWdlSW5mbzsKKyAgICB1c2FnZUluZm8gPSBDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvOjpBbGxvY1VuaXF1ZShtYXhIZWFwTmFtZUxlbik7CisKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UoKnVzYWdlSW5mbywgdXNhZ2VJbmZvLT5tLnVzYWdlKSksCisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQ6Ok1ha2UoKnVzYWdlSW5mbywgdXNhZ2VJbmZvLT5tLmNhcGFjaXR5KSksCisgICAgfTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20ocXVlcnkpOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgaWYgKHF1ZXJ5WzBdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyYgZnN2ID0gcXVlcnlbMF0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTICYmICFmc3YudmFsdWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtaW5Vc2FnZSA9IGZzdi52YWx1ZXNbMF0udTY0OworICAgICAgICAgICAgICAgIG1heFVzYWdlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSB2IDogZnN2LnZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBtYXhVc2FnZSB8PSB2LnU2NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1ZXJ5WzFdLnN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyYgZnN2ID0gcXVlcnlbMV0udmFsdWVzOworICAgICAgICAgICAgaWYgKGZzdi50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFICYmIGZzdi5yYW5nZS5zdGVwLnUzMiA+IDApIHsKKyAgICAgICAgICAgICAgICBibG9ja1NpemUgPSBmc3YucmFuZ2Uuc3RlcC51MzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtYXBwZXIgPSBbc3RvcmVdKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwgQzJTdHJpbmcqIGhlYXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBmbGFncykgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgaWYgKGNhcGFjaXR5ID4gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiB1c2FnZUluZm87CisgICAgICAgICAgICB1c2FnZUluZm8gPSBDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvOjpBbGxvY1VuaXF1ZShtYXhIZWFwTmFtZUxlbiwgdXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsgIC8vIFRPRE86IHJlbW92ZQorCisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+Y29uZmlnX3NtKHsmKnVzYWdlSW5mb30sICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgKmhlYXBOYW1lID0gQzJTdHJpbmcodXNhZ2VJbmZvLT5tLmhlYXBOYW1lKTsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSB1c2FnZUluZm8tPm0uYWxsb2NGbGFnczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBhbGxvY2F0b3ItPnNldFVzYWdlTWFwcGVyKG1hcHBlciwgbWluVXNhZ2UsIG1heFVzYWdlLCBibG9ja1NpemUpOworfQorCiB9CiAKIHZvaWQgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6c2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CkBAIC0yMzMsNiArMzI3LDIyIEBACiAgICAgcmV0dXJuIGFsbG9jYXRvcjsKIH0KIAorc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaERtYUJ1ZkFsbG9jYXRvcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnRG1hQnVmQWxsb2NhdG9yTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkRtYUJ1ZkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ0RtYUJ1ZkFsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0b3JlID0gX21Db21wb25lbnRTdG9yZTsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyRG1hQnVmQWxsb2NhdG9yPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkRNQUJVRkhFQVApOworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvckRtYUJ1ZkFsbG9jYXRvcihhbGxvY2F0b3IsIGNvbXBvbmVudFN0b3JlKTsKKyAgICAgICAgZ0RtYUJ1ZkFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKwogc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEJsb2JBbGxvY2F0b3IoKSB7CiAgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CiAgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGJsb2JBbGxvY2F0b3I7CkBAIC0zMzUsNyArNDQ1LDcgQEAKIAogICAgIGMyX3N0YXR1c190IF9jcmVhdGVCbG9ja1Bvb2woCiAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IGNvbXBvbmVudHMsCiAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQsCiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9CkBAIC0zNDcsNyArNDU3LDcgQEAKICAgICAgICAgICAgIGFsbG9jYXRvcklkID0gR2V0UHJlZmVycmVkTGluZWFyQWxsb2NhdG9ySWQoR2V0Q29kZWMyUG9vbE1hc2soKSk7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoKGFsbG9jYXRvcklkKSB7Ci0gICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjogLyogYWxzbyA6OkRNQUJVRkhFQVAgKi8KICAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTiwgJmFsbG9jYXRvcik7CiAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgewpAQCAtMzU2LDcgKzQ2Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CiAgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOwogICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOwotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCTE9COgpAQCAtMzY4LDcgKzQ4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CiAgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOwogICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOwotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgpAQCAtMzgwLDcgKzQ5NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihhbGxvY2F0b3IsIHBvb2xJZCk7CiAgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOwogICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOwotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKQEAgLTM5Miw3ICs1MDgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOwogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNDAzLDcgKzUyMSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgewogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXS5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQxMiw5ICs1MzIsOSBAQAogCiAgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAogICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBjb21wb25lbnRzLAogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgewotICAgICAgICByZXR1cm4gX2NyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBtQmxvY2tQb29sU2VxSWQrKywgcG9vbCk7CisgICAgICAgIHJldHVybiBfY3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnRzLCBtQmxvY2tQb29sU2VxSWQrKywgcG9vbCk7CiAgICAgfQogCiAgICAgYm9vbCBnZXRCbG9ja1Bvb2woCkBAIC00MzAsOCArNTUwLDEzIEBACiAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIG1Db21wb25lbnRzLmVyYXNlKGJsb2NrUG9vbElkKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1Db21wb25lbnRzLmZpbmQoYmxvY2tQb29sSWQpOwotICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gZm91bmQtPnNlY29uZC5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbYmxvY2tQb29sSWRdLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1tibG9ja1Bvb2xJZF0uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbY29tcG9uZW50XShjb25zdCBzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiAmcHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudCA9PSBwdHIubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1Db21wb25lbnRzW2Jsb2NrUG9vbElkXS5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDQ0LDcgKzU2OSw3IEBACiAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbFNlcUlkOwogCiAgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKLSAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IG1Db21wb25lbnRzOworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OnZlY3RvcjxzdGQ6OndlYWtfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4+IG1Db21wb25lbnRzOwogfTsKIAogc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxfQzJCbG9ja1Bvb2xDYWNoZT4gc0Jsb2NrUG9vbENhY2hlID0KQEAgLTQ4NCw3ICs2MDksNyBAQAogICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzLiB0aGlzIGlzIHRlbXBvcmFyeQogICAgIGNhc2UgQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUOgogICAgICAgICByZXMgPSBzQmxvY2tQb29sQ2FjaGUtPl9jcmVhdGVCbG9ja1Bvb2woCi0gICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwgY29tcG9uZW50LCBpZCwgcG9vbCk7CisgICAgICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSwge2NvbXBvbmVudH0sIGlkLCBwb29sKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CkBAIC00OTQsMTIgKzYxOSwyMiBAQAogCiBjMl9zdGF0dXNfdCBDcmVhdGVDb2RlYzJCbG9ja1Bvb2woCiAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50Pj4gJmNvbXBvbmVudHMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50cywgcG9vbCk7Cit9CisKK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgewogICAgIHBvb2wtPnJlc2V0KCk7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7Ci0gICAgcmV0dXJuIHNCbG9ja1Bvb2xDYWNoZS0+Y3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIHBvb2wpOworICAgIHJldHVybiBzQmxvY2tQb29sQ2FjaGUtPmNyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwge2NvbXBvbmVudH0sIHBvb2wpOwogfQogCiBjbGFzcyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CkBAIC01MjYsNiArNjYxLDEyIEBACiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKICAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKIAorICAgIC8vIEZvciB0ZXN0aW5nIG9ubHkKKyAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPEMyU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYz4+KTsKKwogICAgIHZpcnR1YWwgfkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogcHJpdmF0ZToKQEAgLTU2Niw2ICs3MDcsMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICogTk9URTogRm9yIHRlc3Rpbmcgb25seQorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbmFtZVtpbl0gIGNvbXBvbmVudCBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TW9kdWxlKAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMgY3JlYXRlRmFjdG9yeSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYyBkZXN0cm95RmFjdG9yeSkKKyAgICAgICAgICAgIDogbUluaXQoQzJfTk9fSU5JVCksCisgICAgICAgICAgICAgIG1MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgICAgICAgIGNyZWF0ZUZhY3RvcnkoY3JlYXRlRmFjdG9yeSksCisgICAgICAgICAgICAgIGRlc3Ryb3lGYWN0b3J5KGRlc3Ryb3lGYWN0b3J5KSwKKyAgICAgICAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkobnVsbHB0cikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEluaXRpYWxpemVzIGEgY29tcG9uZW50IG1vZHVsZSB3aXRoIGEgZ2l2ZW4gbGlicmFyeSBwYXRoLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCiAgICAgICAgICAqCiAgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCkBAIC02MjEsNyArNzgwLDEzIEBACiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbG9jYWxNb2R1bGUgPSBtTW9kdWxlLmxvY2soKTsKICAgICAgICAgICAgIGlmIChsb2NhbE1vZHVsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgbG9jYWxNb2R1bGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBvbmVudE1vZHVsZT4oKTsKKyAgICAgICAgICAgICAgICBpZihtQ3JlYXRlRmFjdG9yeSkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdGVzdGluZyBvbmx5CisgICAgICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KG1DcmVhdGVGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVzdHJveUZhY3RvcnkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsTW9kdWxlID0gc3RkOjptYWtlX3NoYXJlZDxDb21wb25lbnRNb2R1bGU+KCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJlcyA9IGxvY2FsTW9kdWxlLT5pbml0KG1MaWJQYXRoKTsKICAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGUgPSBsb2NhbE1vZHVsZTsKQEAgLTYzNywxNCArODAyLDI3IEBACiAgICAgICAgIENvbXBvbmVudExvYWRlcihzdGQ6OnN0cmluZyBsaWJQYXRoKQogICAgICAgICAgICAgOiBtTGliUGF0aChsaWJQYXRoKSB7fQogCisgICAgICAgIC8vIEZvciB0ZXN0aW5nIG9ubHkKKyAgICAgICAgQ29tcG9uZW50TG9hZGVyKHN0ZDo6dHVwbGU8QzJTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jPiBmdW5jKQorICAgICAgICAgICAgOiBtTGliUGF0aChzdGQ6OmdldDwwPihmdW5jKSksCisgICAgICAgICAgICAgIG1DcmVhdGVGYWN0b3J5KHN0ZDo6Z2V0PDE+KGZ1bmMpKSwKKyAgICAgICAgICAgICAgbURlc3Ryb3lGYWN0b3J5KHN0ZDo6Z2V0PDI+KGZ1bmMpKSB7fQorCiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIG1vZHVsZQogICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudE1vZHVsZT4gbU1vZHVsZTsgLy8vPCB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgbG9hZGVkIG1vZHVsZQogICAgICAgICBzdGQ6OnN0cmluZyBtTGliUGF0aDsgLy8vPCBsaWJyYXJ5IHBhdGgKKworICAgICAgICAvLyBGb3IgdGVzdGluZyBvbmx5CisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMgbUNyZWF0ZUZhY3RvcnkgPSBudWxscHRyOworICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYyBtRGVzdHJveUZhY3RvcnkgPSBudWxscHRyOwogICAgIH07CiAKICAgICBzdHJ1Y3QgSW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVJb25Vc2FnZUluZm8+IG1Jb25Vc2FnZUluZm87CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0b3JlRG1hQnVmVXNhZ2VJbmZvPiBtRG1hQnVmVXNhZ2VJbmZvOwogCiAgICAgICAgIEludGVyZmFjZShzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3RvcikKICAgICAgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CkBAIC02ODAsNyArODU4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm1pbkFsaWdubWVudCA9IDA7CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0YXRpYyBDMlIgc2V0RG1hQnVmVXNhZ2UoYm9vbCAvKiBtYXlCbG9jayAqLywgQzJQPEMyU3RvcmVEbWFCdWZVc2FnZUluZm8+ICZtZSkgeworICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgdXNhZ2UgPSAobG9uZyBsb25nKW1lLmdldCgpLm0udXNhZ2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChDMkRtYUJ1ZkFsbG9jYXRvcjo6c3lzdGVtX3VuY2FjaGVkX3N1cHBvcnRlZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhKHVzYWdlICYgKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkobWUuc2V0KCkubS5oZWFwTmFtZSwgInN5c3RlbS11bmNhY2hlZCIsIG1lLnYuZmxleENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShtZS5zZXQoKS5tLmhlYXBOYW1lLCAic3lzdGVtIiwgbWUudi5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubS5hbGxvY0ZsYWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgYWRkUGFyYW1ldGVyKApAQCAtNjk1LDYgKzg4NSwxOCBAQAogICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyOjpzZXRJb25Vc2FnZSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRG1hQnVmVXNhZ2VJbmZvLCAiZG1hYnVmLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdG9yZURtYUJ1ZlVzYWdlSW5mbzo6QWxsb2NTaGFyZWQoMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS51c2FnZSkuZmxhZ3Moe0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCBtLmNhcGFjaXR5KS5pblJhbmdlKDAsIFVJTlQzMl9NQVgsIDEwMjQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURtYUJ1ZlVzYWdlSW5mbywgbS5hbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRG1hQnVmVXNhZ2VJbmZvLCBtLmhlYXBOYW1lKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0RG1hQnVmVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgICAgICB9CiAgICAgfTsKIApAQCAtNzMxLDI1ICs5MzMsMzMgQEAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKICAgICBJbnRlcmZhY2UgbUludGVyZmFjZTsKKworICAgIC8vIEZvciB0ZXN0aW5nIG9ubHkKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPEMyU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYz4+IG1Db2RlYzJGYWN0b3J5RnVuY3M7CiB9OwogCiBjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6aW5pdCgKICAgICAgICAgc3RkOjpzdHJpbmcgbGliUGF0aCkgewogICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKICAgICBBTE9HVigibG9hZGluZyBkbGwiKTsKLSAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTGliSGFuZGxlID09IG51bGxwdHIsCi0gICAgICAgICAgICAiY291bGQgbm90IGRsb3BlbiAlczogJXMiLCBsaWJQYXRoLmNfc3RyKCksIGRsZXJyb3IoKSk7CiAKLSAgICBjcmVhdGVGYWN0b3J5ID0KLSAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUNvZGVjMkZhY3RvcnkiKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNyZWF0ZUZhY3RvcnkgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICJjcmVhdGVGYWN0b3J5IGlzIG51bGwgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworICAgIGlmKCFjcmVhdGVGYWN0b3J5KSB7CisgICAgICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aC5jX3N0cigpLCBSVExEX05PV3xSVExEX05PREVMRVRFKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTGliSGFuZGxlID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGliUGF0aC5jX3N0cigpLCBkbGVycm9yKCkpOwogCi0gICAgZGVzdHJveUZhY3RvcnkgPQotICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXN0cm95RmFjdG9yeSA9PSBudWxscHRyLAotICAgICAgICAgICAgImRlc3Ryb3lGYWN0b3J5IGlzIG51bGwgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworICAgICAgICBjcmVhdGVGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVDb2RlYzJGYWN0b3J5Iik7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY3JlYXRlRmFjdG9yeSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICJjcmVhdGVGYWN0b3J5IGlzIG51bGwgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworCisgICAgICAgIGRlc3Ryb3lGYWN0b3J5ID0KKyAgICAgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYylkbHN5bShtTGliSGFuZGxlLCAiRGVzdHJveUNvZGVjMkZhY3RvcnkiKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXN0cm95RmFjdG9yeSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICJkZXN0cm95RmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKyAgICB9CiAKICAgICBtQ29tcG9uZW50RmFjdG9yeSA9IGNyZWF0ZUZhY3RvcnkoKTsKICAgICBpZiAobUNvbXBvbmVudEZhY3RvcnkgPT0gbnVsbHB0cikgewpAQCAtNzcyLDU4ICs5ODIsMTAgQEAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMobmV3IChzdGQ6Om5vdGhyb3cpIEMyQ29tcG9uZW50OjpUcmFpdHMpOwogICAgIGlmICh0cmFpdHMpIHsKLSAgICAgICAgdHJhaXRzLT5uYW1lID0gaW50Zi0+Z2V0TmFtZSgpOwotCi0gICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZDsKLSAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbjsKLSAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoeyAma2luZCwgJmRvbWFpbiB9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKLSAgICAgICAgYm9vbCBmaXhEb21haW4gPSByZXMgIT0gQzJfT0s7Ci0gICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKLSAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9IGtpbmQudmFsdWU7Ci0gICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IGRvbWFpbi52YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZhbGwtYmFjawotICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2UgZm9yIGtpbmQgYW5kIGRvbWFpbjogJWQiLCByZXMpOwotCi0gICAgICAgICAgICB0cmFpdHMtPmtpbmQgPQotICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgOgotICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgOgotICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgbWVkaWFUeXBlSW5kZXggPQotICAgICAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFCi0gICAgICAgICAgICAgICAgOiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7Ci0gICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IG1lZGlhVHlwZUluZGV4IH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7Ci0gICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKLSAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgIGlmICghQzJJbnRlcmZhY2VVdGlsczo6RmlsbFRyYWl0c0Zyb21JbnRlcmZhY2UodHJhaXRzLmdldCgpLCBpbnRmKSkgeworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaWxsIHRyYWl0cyBmcm9tIGludGVyZmFjZSIpOwogICAgICAgICAgICAgcmV0dXJuIG1Jbml0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDF1KSB7Ci0gICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZTogdW5leHBlY3RlZCB2ZWN0b3Igc2l6ZTogJXp1IiwgcGFyYW1zLnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyAqbWVkaWFUeXBlQ29uZmlnID0gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6RnJvbShwYXJhbXNbMF0uZ2V0KCkpOwotICAgICAgICBpZiAobWVkaWFUeXBlQ29uZmlnID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgbWVkaWEgdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuIG1Jbml0OwotICAgICAgICB9Ci0gICAgICAgIHRyYWl0cy0+bWVkaWFUeXBlID0KLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4obWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLCBtZWRpYVR5cGVDb25maWctPmZsZXhDb3VudCgpKSk7Ci0KLSAgICAgICAgaWYgKGZpeERvbWFpbikgewotICAgICAgICAgICAgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImF1ZGlvLyIsIDYpID09IDApIHsKLSAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgInZpZGVvLyIsIDYpID09IDApIHsKLSAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImltYWdlLyIsIDYpID09IDApIHsKLSAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE86IGdldCB0aGlzIHByb3Blcmx5IGZyb20gdGhlIHN0b3JlIGR1cmluZyBlbXBsYWNlCiAgICAgICAgIHN3aXRjaCAodHJhaXRzLT5kb21haW4pIHsKQEAgLTgzMywyNiArOTk1LDYgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRyYWl0cy0+cmFuayA9IDUxMjsKICAgICAgICAgfQotCi0gICAgICAgIHBhcmFtcy5jbGVhcigpOwotICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpQQVJBTV9UWVBFIH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7Ci0gICAgICAgIGlmIChyZXMgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxdSkgewotICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZyAqYWxpYXNlc1NldHRpbmcgPQotICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChhbGlhc2VzU2V0dGluZykgewotICAgICAgICAgICAgICAgIC8vIFNwbGl0IGFsaWFzZXMgb24gJywnCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBzaW1wbGVyIGluIHBsYWluIEMgYW5kIGV2ZW4gc3RkOjpzdHJpbmcgd291bGQgc3RpbGwgbWFrZSBhIGNvcHkuCi0gICAgICAgICAgICAgICAgY2hhciAqYWxpYXNlcyA9IDo6c3RybmR1cChhbGlhc2VzU2V0dGluZy0+bS52YWx1ZSwgYWxpYXNlc1NldHRpbmctPmZsZXhDb3VudCgpKTsKLSAgICAgICAgICAgICAgICBBTE9HRCgiJyVzJyBoYXMgYWxpYXNlczogJyVzJyIsIGludGYtPmdldE5hbWUoKS5jX3N0cigpLCBhbGlhc2VzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoY2hhciAqdG9rLCAqcHRyLCAqc3RyID0gYWxpYXNlczsgKHRvayA9IDo6c3RydG9rX3Ioc3RyLCAiLCIsICZwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhaXRzLT5hbGlhc2VzLnB1c2hfYmFjayh0b2spOwotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWRkaW5nIGFsaWFzOiAnJXMnIiwgdG9rKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJlZShhbGlhc2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KICAgICBtVHJhaXRzID0gdHJhaXRzOwogCkBAIC05NTAsNiArMTA5MiwyMiBAQAogICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYy5zbyIpOwogICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOwogICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYy5zbyIpOworCit9CisKKy8vIEZvciB0ZXN0aW5nIG9ubHkKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8QzJTdHJpbmcsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEZhY3Rvcnk6OkRlc3Ryb3lDb2RlYzJGYWN0b3J5RnVuYz4+IGZ1bmNzKQorICAgIDogbVZpc2l0ZWQoZmFsc2UpLAorICAgICAgbVJlZmxlY3RvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyUmVmbGVjdG9ySGVscGVyPigpKSwKKyAgICAgIG1JbnRlcmZhY2UobVJlZmxlY3RvciksCisgICAgICBtQ29kZWMyRmFjdG9yeUZ1bmNzKGZ1bmNzKSB7CisKKyAgICBmb3IoYXV0byBjb25zdCYgZnVuYzogbUNvZGVjMkZhY3RvcnlGdW5jcykgeworICAgICAgICBtQ29tcG9uZW50cy5lbXBsYWNlKHN0ZDo6Z2V0PDA+KGZ1bmMpLCBmdW5jKTsKKyAgICB9CiB9CiAKIGMyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcigKQEAgLTEwNjksNCArMTIyNywxMSBAQAogICAgIHJldHVybiBzdG9yZTsKIH0KIAorLy8gRm9yIHRlc3Rpbmcgb25seQorc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFRlc3RDb21wb25lbnRTdG9yZSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxDMlN0cmluZywKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+PiBmdW5jcykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4obmV3IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZShmdW5jcykpOworfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckJsb2IuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JCbG9iLmgKaW5kZXggODljZTk0OS4uZmM2N2FmNyAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckJsb2IuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yQmxvYi5oCkBAIC00NCw3ICs0NCwxMiBAQAogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JCbG9iKCkgb3ZlcnJpZGU7CiAKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CisKKyAgICBzdGF0aWMgYm9vbCBDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvLyBkZXByZWNhdGVkCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeyByZXR1cm4gQ2hlY2tIYW5kbGUobyk7IH0KIAogcHJpdmF0ZToKICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JHcmFsbG9jLmgKaW5kZXggZWU3NTI0ZS4uMWRhM2UxNCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oCkBAIC0zNyw3ICszNyw4IEBACiAgKiBXcmFwIHRoZSBncmFsbG9jIGhhbmRsZSBhbmQgbWV0YWRhdGEgaW50byBDb2RlYzIgaGFuZGxlIHJlY29nbml6ZWQgYnkKICAqIEMyQWxsb2NhdG9yR3JhbGxvYy4KICAqCi0gKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgQzJIYW5kbGUgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgdXNpbmcgbmF0aXZlX2hhbmRsZV9kZWxldGUuCisgKiBAcmV0dXJuIGEgbmV3IE5PTi1PV05JTkcgQzJIYW5kbGUgdGhhdCBtdXN0IGJlIGNsb3NlZCBhbmQgZGVsZXRlZCB1c2luZyBuYXRpdmVfaGFuZGxlX2Nsb3NlIGFuZAorICogbmF0aXZlX2hhbmRsZV9kZWxldGUuCiAgKi8KIEMySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCkBAIC04NCw3ICs4NSwxMiBAQAogCiAgICAgdmlydHVhbCB+QzJBbGxvY2F0b3JHcmFsbG9jKCkgb3ZlcnJpZGU7CiAKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CisKKyAgICBzdGF0aWMgYm9vbCBDaGVja0hhbmRsZShjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvLyBkZXByZWNhdGVkCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeyByZXR1cm4gQ2hlY2tIYW5kbGUobyk7IH0KIAogcHJpdmF0ZToKICAgICBjbGFzcyBJbXBsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCmluZGV4IDFiMjA1MWYuLjZhNDliN2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKQEAgLTU3LDcgKzU3LDEyIEBACiAKICAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgLy8gZGVwcmVjYXRlZAorICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsgcmV0dXJuIENoZWNrSGFuZGxlKG8pOyB9CiAKICAgICAvKioKICAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaAppbmRleCBlMWE4MTM4Li5iMjYzNmU5IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCkBAIC0yMCw5ICsyMCwxNCBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CiAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogCituYW1lc3BhY2UgYW5kcm9pZCB7CitjbGFzcyBHcmFwaGljQnVmZmVyOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwogY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CiBwdWJsaWM6CiAgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CkBAIC00NCw2ICs0OSwxNCBAQAogICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBDMkZlbmNlICpmZW5jZSAvKiBub25udWxsICovKSBvdmVycmlkZTsKKwogICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpPiBPblJlbmRlckNhbGxiYWNrOwogCiAgICAgLyoqCkBAIC02Nyw2ICs4MCwyNyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpOwogCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBhbiBJR0JQIGluIG9yZGVyIHRvIGNyZWF0ZSBibG9ja3MuIEEgbmV3bHkgY3JlYXRlZCBibG9jayBpcworICAgICAqIGRlcXVldWVkIGZyb20gdGhlIGNvbmZpZ3VyZWQgSUdCUC4gVW5pcXVlIElkIG9mIElHQlAgYW5kIHRoZSBzbG90IG51bWJlciBvZgorICAgICAqIGJsb2NrcyBhcmUgcGFzc2VkIHZpYSBuYXRpdmVfaGFuZGxlLiBNYW5hZ2luZyBJR0JQIGlzIHJlc3BvbnNpYmlsaXR5IG9mIGNhbGxlci4KKyAgICAgKiBXaGVuIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQsIGJsb2NrIHdpbGwgYmUgY3JlYXRlZCB2aWEgYWxsb2NhdG9yLgorICAgICAqIFNpbmNlIHplcm8gaXMgbm90IHVzZWQgZm9yIFVuaXF1ZSBJZCBvZiBJR0JQLCBpZiBJR0JQIGlzIG5vdCBjb25maWd1cmVkIG9yIHByb2R1Y2VyCisgICAgICogaXMgY29uZmlndXJlZCBhcyBudWxscHRyLCB1bmlxdWUgaWQgd2hpY2ggaXMgYnVuZGxlZCBpbiBuYXRpdmVfaGFuZGxlIGlzIHplcm8uCisgICAgICoKKyAgICAgKiBccGFyYW0gcHJvZHVjZXIgICAgICB0aGUgSUdCUCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZldGNoIGJsb2NrcworICAgICAqIFxwYXJhbSBzeW5jTWVtb3J5ICAgIFNoYXJlZCBtZW1vcnkgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBhbGxvY2F0aW9uICYgZGVhbGxvY2F0aW9uLgorICAgICAqIFxwYXJhbSBicUlkICAgICAgICAgIElkIG9mIElHQlAKKyAgICAgKiBccGFyYW0gZ2VuZXJhdGlvbklkICBHZW5lcmF0aW9uIElkIGZvciByZW5kZXJpbmcgb3V0cHV0CisgICAgICogXHBhcmFtIGNvbnN1bWVyVXNhZ2UgY29uc3VtZXJVc2FnZSBmbGFnb2YgdGhlIElHQlAKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnN5bmNNZW1vcnksCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbklkLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSk7CisKIHByaXZhdGU6CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOwogICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CkBAIC03Nyw0ICsxMTEsNzIgQEAKICAgICBmcmllbmQgc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOwogfTsKIAorY2xhc3MgQzJTdXJmYWNlU3luY01lbW9yeTsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhIDogcHVibGljIF9DMkJsb2NrUG9vbERhdGEgeworcHVibGljOgorICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiAmb3duZXIsCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+LCBpbnQgbm9Vc2UpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGludCBtaWdyYXRlKGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0b0dlbmVyYXRpb24sIHVpbnQ2NF90IHRvVXNhZ2UsIHVpbnQ2NF90IHRvQnFJZCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwgdWludDMyX3Qgb2xkR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisKKyAgICAvLyBNZXRob2RzIGRlbGVnYXRlZCBmcm9tIF9DMkJsb2NrRmFjdG9yeS4KKyAgICB2b2lkIGdldEJ1ZmZlclF1ZXVlRGF0YSh1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgY29uc3Q7CisgICAgYm9vbCBob2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtKTsKKyAgICBib29sIGJlZ2luVHJhbnNmZXJCbG9ja1RvQ2xpZW50KCk7CisgICAgYm9vbCBlbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoYm9vbCB0cmFuc2Zlcik7CisgICAgYm9vbCBiZWdpbkF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZSgpOworICAgIGJvb2wgZW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCk7CisgICAgYm9vbCBkaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKCk7CisKKyAgICBjb25zdCBib29sIG1Mb2NhbDsKKyAgICBib29sIG1IZWxkOworCisgICAgLy8gRGF0YSBvZiB0aGUgY29ycmVzcG9uZGluZyBidWZmZXIuCisgICAgdWludDMyX3QgbUdlbmVyYXRpb247CisgICAgdWludDY0X3QgbUJxSWQ7CisgICAgaW50MzJfdCBtQnFTbG90OworCisgICAgLy8gRGF0YSBvZiB0aGUgY3VycmVudCBJR0JQLCB1cGRhdGVkIGF0IG1pZ3JhdGUoKS4gSWYgdGhlIHZhbHVlcyBhcmUKKyAgICAvLyBtaXNtYXRjaGVkLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlciB3aWxsIG5vdCBiZSBjYW5jZWxsZWQgYmFjayB0bworICAgIC8vIElHQlAgYXQgdGhlIGRlc3RydWN0b3IuCisgICAgdWludDMyX3QgbUN1cnJlbnRHZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IG1DdXJyZW50QnFJZDsKKworICAgIGJvb2wgbVRyYW5zZmVyOyAvLyBsb2NhbCB0cmFuc2ZlciB0byByZW1vdGUKKyAgICBib29sIG1BdHRhY2g7IC8vIGF0dGFjaCBvbiByZW1vdGUKKyAgICBib29sIG1EaXNwbGF5OyAvLyBkaXNwbGF5IG9uIHJlbW90ZTsKKyAgICBzdGQ6OndlYWtfcHRyPGludD4gbU93bmVyOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1JZ2JwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBtU3luY01lbTsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7Cit9OworCiAjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRG1hQnVmQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0YzhjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEbWFCdWZBbGxvY2F0b3IuaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9CVUZfSF8KKworI2luY2x1ZGUgPEJ1ZmZlckFsbG9jYXRvci9CdWZmZXJBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+ICAvLyBzdGF0CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMkRtYUJ1ZkFsbG9jYXRvciA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiogYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+KiBhbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyRG1hQnVmQWxsb2NhdG9yKGlkX3QgaWQpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtSW5pdDsgfQorCisgICAgdmlydHVhbCBib29sIGNoZWNrSGFuZGxlKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBDaGVja0hhbmRsZShvKTsgfQorCisgICAgc3RhdGljIGJvb2wgQ2hlY2tIYW5kbGUoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoaGVhcE5hbWUsIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvCisgICAgLy8gcmVkdWNlIGNhY2hpbmcgb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBDMlN0cmluZyosIHVuc2lnbmVkKik+CisgICAgICAgICAgICBVc2FnZU1hcHBlckZuOworCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgdXNhZ2UgbWFwcGVyIGZvciBzdWJzZXF1ZW50IG5ldyBhbGxvY2F0aW9ucywgYXMgd2VsbCBhcyB0aGUKKyAgICAgKiBzdXBwb3J0ZWQgbWluaW11bSBhbmQgbWF4aW11bSB1c2FnZSBtYXNrcyBhbmQgZGVmYXVsdCBibG9jay1zaXplIHRvIHVzZQorICAgICAqIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRtYWJ1ZiBoZWFwIG5hbWUgYW5kIGZsYWdzIHJlcXVpcmVkIGJ5IHRoZSBkbWEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiBoZWFwIGRldmljZQorICAgICAqCisgICAgICogXHBhcmFtIG1pblVzYWdlICAgICAgICBNaW5pbXVtIGJ1ZmZlciB1c2FnZSByZXF1aXJlZCBmb3Igc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKgorICAgICAqIFxwYXJhbSBtYXhVc2FnZSAgICAgICAgTWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gU1dfUkVBRCB8IFNXX1dSSVRFKQorICAgICAqCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSAgICAgICBBbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBjYXBhY2l0eS4gVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgcmVxdWlyZWQgZm9yIGNhY2hpbmcgbWFwcGVyIHJlc3VsdHMuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKGNvbnN0IFVzYWdlTWFwcGVyRm4mIG1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYmxvY2tTaXplKTsKKworICAgIHN0YXRpYyBib29sIHN5c3RlbV91bmNhY2hlZF9zdXBwb3J0ZWQodm9pZCkgeworICAgICAgICBzdGF0aWMgaW50IGNhY2hlZF9yZXN1bHQgPSAtMTsKKworICAgICAgICBpZiAoY2FjaGVkX3Jlc3VsdCA9PSAtMSkgeworICAgICAgICAgICAgc3RydWN0IHN0YXQgYnVmZmVyOworICAgICAgICAgICAgY2FjaGVkX3Jlc3VsdCA9IChzdGF0KCIvZGV2L2RtYV9oZWFwL3N5c3RlbS11bmNhY2hlZCIsICZidWZmZXIpID09IDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY2FjaGVkX3Jlc3VsdCA9PSAxKTsKKyAgICB9OworCisgICBwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIEJ1ZmZlckFsbG9jYXRvciBtQnVmZmVyQWxsb2NhdG9yOworCisgICAgYzJfc3RhdHVzX3QgbWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gQzJTdHJpbmcqIGhlYXBfbmFtZSwgdW5zaWduZWQqIGZsYWdzKTsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kCisgICAgLy8gbVVzYWdlTWFwcGVyQ2FjaGUKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVVzYWdlTWFwcGVyTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIFVzYWdlTWFwcGVyRm4gbVVzYWdlTWFwcGVyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ2NF90LCBzaXplX3Q+IE1hcHBlcktleTsKKyAgICBzdHJ1Y3QgTWFwcGVyS2V5SGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5JikgY29uc3Q7CisgICAgfTsKKyAgICB0eXBlZGVmIHN0ZDo6dHVwbGU8QzJTdHJpbmcsIHVuc2lnbmVkLCBjMl9zdGF0dXNfdD4gTWFwcGVyVmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8TWFwcGVyS2V5LCBNYXBwZXJWYWx1ZT4gTWFwcGVyS2V5VmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+OjppdGVyYXRvciBNYXBwZXJLZXlWYWx1ZVBvaW50ZXI7CisgICAgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPiBtVXNhZ2VNYXBwZXJMcnU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPE1hcHBlcktleSwgTWFwcGVyS2V5VmFsdWVQb2ludGVyLCBNYXBwZXJLZXlIYXNoPiBtVXNhZ2VNYXBwZXJDYWNoZTsKK307Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfQlVGX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRmVuY2VGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiZWQyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJGZW5jZUZhY3RvcnkuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfRkVOQ0VfRkFDVE9SWV9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRkVOQ0VfRkFDVE9SWV9IXworCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCitjbGFzcyBDMlN1cmZhY2VTeW5jTWVtb3J5OworCisvKioKKyAqIEMyRmVuY2UgaW1wbGVtZW50YXRpb24gZmFjdG9yeQorICovCitzdHJ1Y3QgX0MyRmVuY2VGYWN0b3J5IHsKKworICAgIGNsYXNzIFN1cmZhY2VGZW5jZUltcGw7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBDMkZlbmNlIGZvciBCdWZmZXJRdWV1ZUJhc2VkIGJsb2NrcG9vbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzeW5jTWVtICAgICAgICAgICBTaGFyZWQgbWVtb3J5IG9iamVjdCBmb3Igc3luY2hyb25pemF0aW9uIGJldHdlZW4gcHJvY2Vzc2VzLgorICAgICAqIFxwYXJhbSB3YWl0SWQgICAgICAgICAgICB3YWl0IGlkIGZvciB0cmFja2luZyBzdGF0dXMgY2hhbmdlIGZvciBDMkZlbmNlLgorICAgICAqLworICAgIHN0YXRpYyBDMkZlbmNlIENyZWF0ZVN1cmZhY2VGZW5jZSgKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLAorICAgICAgICAgICAgdWludDMyX3Qgd2FpdElkKTsKK307CisKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9GRU5DRV9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKaW5kZXggYTE0ZTBkMy4uZGM4MmU4MiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN1cHBvcnQuaApAQCAtNDcsNiArNDcsMTcgQEAKICAgICAgICAgICovCiAgICAgICAgIElPTiA9IFBMQVRGT1JNX1NUQVJULAogCisgICAgICAgIC8qCisgICAgICAgICAqIElEIG9mIHRoZSBETUEtQnVmIEhlYXAgKGlvbiByZXBsYWNlbWVudCkgYmFja2VkIHBsYXRmb3JtIGFsbG9jYXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQzJIYW5kbGUgY29uc2lzdHMgb2Y6CisgICAgICAgICAqICAgZmQgIHNoYXJlZCBkbWFidWYgYnVmZmVyIGhhbmRsZQorICAgICAgICAgKiAgIGludCBzaXplIChsbyAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBzaXplIChoaSAzMiBiaXRzKQorICAgICAgICAgKiAgIGludCBtYWdpYyAnXHhjMmlvXHgwMCcKKyAgICAgICAgICovCisgICAgICAgIERNQUJVRkhFQVAgPSBJT04sCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCiAgICAgICAgICAqCkBAIC0xMjcsMTIgKzEzOCwzOCBAQAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKIAogLyoqCisgKiBDcmVhdGVzIGEgYmxvY2sgcG9vbC4KKyAqIFxwYXJhbSBhbGxvY2F0b3JJZCAgdGhlIGFsbG9jYXRvciBJRCB3aGljaCBpcyB1c2VkIHRvIGFsbG9jYXRlIGJsb2NrcworICogXHBhcmFtIGNvbXBvbmVudHMgICAgdGhlIGNvbXBvbmVudHMgdXNpbmcgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBwb29sICAgICAgICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZSBvbiBzdWNjZXNzLgorICogICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0b3IgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBhIGJsb2NrIHBvb2wKKyAqLworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+ICZjb21wb25lbnRzLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKTsKKworLyoqCiAgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCiAgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKICAqLwogc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKIAogLyoqCisgKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUuCisgKiBOT1RFOiBGb3IgdGVzdGluZyBvbmx5CisgKiBccmV0dmFsIG51bGxwdHIgaWYgdGhlIHBsYXRmb3JtIGNvbXBvbmVudCBzdG9yZSBjb3VsZCBub3QgYmUgb2J0YWluZWQKKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFRlc3RDb21wb25lbnRTdG9yZSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxDMlN0cmluZywgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYywKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmM+Pik7CisKKy8qKgogICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cwogICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAogICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyU3VyZmFjZVN5bmNPYmouaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJTdXJmYWNlU3luY09iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjODdmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyU3VyZmFjZVN5bmNPYmouaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX1NVUkZBQ0VfU1lOQ19PQkpfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX1NVUkZBQ0VfU1lOQ19PQkpfSF8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRnV0ZXggYmFzZWQgbG9jayAvIHdhaXQgaW1wbGVtZW50YXRpb24gZm9yIHNoYXJpbmcgb3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uCisgKiBpbmZvcm1hdGlvbiBiZXR3ZWVuIEZyYW1ld29yayBhbmQgSEFMLgorICovCitzdHJ1Y3QgQzJTeW5jVmFyaWFibGVzIHsKKyAgICBlbnVtIFN5bmNTdGF0dXMgOiB1aW50MzJfdCB7CisgICAgICAgICAgIFNUQVRVU19JTklUID0gMCwgICAgICAgICAvLyBXaGVuIHN1cmZhY2UgY29uZmlndXJhdGlvbiBzdGFydHMuCisgICAgICAgICAgIFNUQVRVU19BQ1RJVkUgPSAxLCAgICAgICAvLyBXaGVuIHN1cmZhY2UgY29uZmlndXJhdGlvbiBmaW5pc2hzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBVFVTX0lOSVQgLT4gU1RBVFVTX0FDVElWRQorICAgICAgICAgICBTVEFUVVNfU1dJVENISU5HID0gMiwgICAgLy8gV2hlbiB0aGUgc3VyZmFjZSBpcyByZXBsYWNlZCBieSBhIG5ldyBzdXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJpbmcgc3VyZmFjZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU1RBVFVTX0FDVElWRSAtPiBTVEFUVVNfU1dJVENISU5HCisgICAgfTsKKworICAgIC8qKgorICAgICAqIExvY2sgdGhlIG1lbW9yeSByZWdpb24KKyAgICAgKi8KKyAgICBpbnQgbG9jaygpOworCisgICAgLyoqCisgICAgICogVW5sb2NrIHRoZSBtZW1vcnkgcmVnaW9uCisgICAgICovCisgICAgaW50IHVubG9jaygpOworCisgICAgLyoqCisgICAgICogU2V0IGluaXRpYWwgZGVxdWV1ZWQgYnVmZmVyIGNvdW50LgorICAgICAqCisgICAgICogXHBhcmFtIG1heERlcXVldWVDb3VudCAgICAgICAgICAgSW5pdGlhbCB2YWx1ZSBvZiAjIG9mIG1heCBkZXF1ZXVlZCBidWZmZXIgY291bnQKKyAgICAgKiBccGFyYW0gY3VyRGVxdWV1ZUNvdW50ICAgICAgICAgICBJbml0aWFsIHZhbHVlIG9mICMgb2YgY3VycmVudCBkZXF1ZXVlZCBidWZmZXIgY291bnQKKyAgICAgKi8KKyAgICB2b2lkIHNldEluaXRpYWxEZXF1ZXVlQ291bnRMb2NrZWQoaW50MzJfdCBtYXhEZXF1ZXVlQ291bnQsIGludDMyX3QgY3VyRGVxdWV1ZUNvdW50KTsKKworICAgIC8qKgorICAgICAqIEdldCBhIHdhaXRJZCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gaW1wbGVtZW50IGZlbmNlLgorICAgICAqLworICAgIHVpbnQzMl90IGdldFdhaXRJZExvY2tlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHVwY29taW5nIGRlcXVldWUgb3BlcmF0aW9uIGlzIG5vdCBibG9ja2VkLgorICAgICAqIGlmIGl0J3MgYmxvY2tlZCBhbmQgd2FpdElkIGlzIG5vbi1udWxsLCB3YWl0SWQgaXMgcmV0dXJuZWQgdG8gYmUgdXNlZCBmb3Igd2FpdGluZy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgZmFsc2UgICAgZGVxdWV1ZSBvcGVyYXRpb24gaXMgYmxvY2tlZCBub3cuCisgICAgICogXHJldHZhbCB0cnVlICAgICBkZXF1ZXVlIG9wZXJhdGlvbiBpcyBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBib29sIGlzRGVxdWV1ZWFibGVMb2NrZWQodWludDMyX3QgKndhaXRJZCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IGEgYnVmZmVyIGlzIHF1ZXVlZC4gUmV0dXJuIHdoZXRoZXIgdGhlIHVwY29taW5nIGRlcXVldWUgb3BlcmF0aW9uCisgICAgICogaXMgbm90IGJsb2NrZWQuIGlmIGl0J3MgYmxvY2tlZCBhbmQgd2FpdElkIGlzIG5vbi1udWxsLCB3YWl0SWQgaXMgcmV0dXJuZWQKKyAgICAgKiB0byBiZSB1c2VkIGZvciB3YWl0aW5nLgorICAgICAqCisgICAgICogXHJldHZhbCBmYWxzZSAgICBkZXF1ZXVlIG9wZXJhdGlvbiBpcyBibG9ja2VkIG5vdy4KKyAgICAgKiBccmV0dmFsIHRydWUgICAgIGRlcXVldWUgb3BlcmF0aW9uIGlzIHBvc3NpYmxlLgorICAgICAqLworICAgIGJvb2wgbm90aWZ5UXVldWVkTG9ja2VkKHVpbnQzMl90ICp3YWl0SWQgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBhIGJ1ZmZlciBpcyBkZXF1ZXVlZC4KKyAgICAgKi8KKyAgICB2b2lkIG5vdGlmeURlcXVldWVkTG9ja2VkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgc3luYyBzdGF0dXMuCisgICAgICovCisgICAgdm9pZCBzZXRTeW5jU3RhdHVzTG9ja2VkKFN5bmNTdGF0dXMgc3RhdHVzKTsKKworICAgIC8qKgorICAgICAqIEdldCBzeW5jIHN0YXR1cy4KKyAgICAgKi8KKyAgICBDMlN5bmNWYXJpYWJsZXM6OlN5bmNTdGF0dXMgZ2V0U3luY1N0YXR1c0xvY2tlZCgpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIGN1cnJlbnQgbWF4IGRlcXVldWUgY291bnQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVNYXhEZXF1ZXVlQ291bnRMb2NrZWQoaW50MzJfdCBtYXhEZXF1ZXVlQ291bnQpOworCisgICAgLyoqCisgICAgICogV2FpdCB1bnRpbCBzdGF0dXMgaXMgbm8gbG9uZ2VyIGVxdWFsIHRvIHdhaXRJZCwgb3IgdW50aWwgdGltZW91dC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3YWl0SWQgICAgICAgICAgICBpbnRlcm5hbCBzdGF0dXMgZm9yIHdhaXRpbmcgdW50aWwgaXQgaXMgY2hhbmdlZC4KKyAgICAgKiBccGFyYW0gdGltZW91c05zICAgICAgICAgbmFubyBzZWNvbmRzIHRvIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVET1VUICAgICAgY2hhbmdlIGRvZXMgbm90IGhhcHBlbiBkdXJpbmcgd2FpdGluZy4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSAgICAgaW52YWxpZCBldmVudCB3YWl0aW5nLgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICBjaGFuZ2Ugd2FzIHNpZ25hbGxlZC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB3YWl0Rm9yQ2hhbmdlKHVpbnQzMl90IHdhaXRJZCwgYzJfbnNlY3NfdCB0aW1lb3V0TnMpOworCisgICAgQzJTeW5jVmFyaWFibGVzKCkge30KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBzaWduYWwgb25lIHdhaXRlciB0byB3YWtlIHVwLgorICAgICAqLworICAgIGludCBzaWduYWwoKTsKKworICAgIC8qKgorICAgICAqIHNpZ25hbCBhbGwgd2FpdGVyIHRvIHdha2UgdXAuCisgICAgICovCisgICAgaW50IGJyb2FkY2FzdCgpOworCisgICAgLyoqCisgICAgICogd2FpdCBmb3Igc2lnbmFsIG9yIGJyb2FkY2FzdC4KKyAgICAgKi8KKyAgICBpbnQgd2FpdCgpOworCisgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1Mb2NrOworICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBtQ29uZDsKKyAgICBpbnQzMl90IG1NYXhEZXF1ZXVlQ291bnQ7CisgICAgaW50MzJfdCBtQ3VyRGVxdWV1ZUNvdW50OworICAgIFN5bmNTdGF0dXMgbVN0YXR1czsKK307CisKKy8qKgorICogU2hhcmVkIG1lbW9yeSBpbiBvcmRlciB0byBzeW5jaHJvbml6ZSBpbmZvcm1hdGlvbiBmb3IgU3VyZmFjZShJR0JQKQorICogYmFzZWQgb3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uLgorICovCitjbGFzcyBDMlN1cmZhY2VTeW5jTWVtb3J5IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTaGFyZWQgbWVtb3J5IGhhbmRsZSBpbiBvcmRlciB0byBzeW5jaHJvbml6ZSBpbmZvcm1hdGlvbiBmb3IKKyAgICAgKiBTdXJmYWNlIGJhc2VkIG91dHB1dCBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSGFuZGxlU3luY01lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICAgICAgICBIYW5kbGVTeW5jTWVtKGludCBmZCwgc2l6ZV90IHNpemUpIDoKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICAgICAgICAgIG1GZHN7ZmR9LAorICAgICAgICAgICAgbUludHN7aW50KHNpemUgJiAweEZGRkZGRkZGKSwKKyAgICAgICAgICAgICAgICBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWN9IHt9CisKKyAgICAgICAgLyoqIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhlIHNoYXJlZCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIGludCBtZW1GZCgpIGNvbnN0IHtyZXR1cm4gbUZkcy5tTWVtO30KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeSAqLworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgICAgICAgICAgICAgIHwgc2l6ZV90KHVpbnQ2NF90KHVuc2lnbmVkKG1JbnRzLm1TaXplSGkpKSA8PCAzMik7CisgICAgICAgIH0KKworICAgICAgICAvKiogQ2hlY2sgd2hldGhlciB0aGUgbmF0aXZlIGhhbmRsZSBpcyBpbiB0aGUgZm9ybSBvZiBIYW5kbGVTeW5jTWVtCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR1cm4gd2hldGhlciB0aGUgbmF0aXZlIGhhbmRsZSBpcyBjb21wYXRpYmxlCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgaW50IG1NZW07CisgICAgICAgIH0gbUZkczsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGludCBtU2l6ZUxvOworICAgICAgICAgICAgaW50IG1TaXplSGk7CisgICAgICAgICAgICBpbnQgbU1hZ2ljOworICAgICAgICB9IG1JbnRzOworICAgIHByaXZhdGU6CisgICAgICAgIGVudW0geworICAgICAgICAgICAga01hZ2ljID0gJ3NzbVx4MDAnLAorICAgICAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgICAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgICAgICAgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW1wb3J0cyBhIHNoYXJlZCBtZW1vcnkgb2JqZWN0IGZyb20gYSBuYXRpdmUgaGFuZGxlKFRoZSBzaGFyZWQgbWVtb3J5IGlzIGFscmVhZHkgZXhpc3RpbmcpLgorICAgICAqIFRoaXMgaXMgdXN1YWxseSB1c2VkIGFmdGVyIG5hdGl2ZV9oYW5kbGVfdCBpcyBwYXNzZWQgdmlhIFJQQy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICAgIGhhbmRsZSByZXByZXNlbnRpbmcgc2hhcmVkIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gSW1wb3J0KG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0cyBhIHNoYXJlZCBtZW1vcnkgb2JqZWN0IGZvciBzeW5jaHJvbml6YXRpb24gb2Ygb3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIFNoYXJlZCBtZW1vcnkgY3JlYXRpb24gc2hvdWxkIGJlIGRvbmUgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmZCAgICAgICAgICAgIGZpbGUgZGVzY3JpcHRvciB0byBzaGFyZWQgbWVtb3J5CisgICAgICogXHBhcmFtIHNpemUgICAgICAgICAgc2l6ZSBvZiB0aGUgc2hhcmVkIG1lbW9yeQorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gQ3JlYXRlKGludCBmZCwgc2l6ZV90IHNpemUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhbmRsZSByZXByZXNlbnRpbmcgdGhlIHNocmVhZCBtZW1vcnkgZm9yIHN5bmNocm9uaXphdGlvbiBvZgorICAgICAqIG91dHB1dCBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHdoaWNoIHdpbGwgcHJvdmlkZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBwdHIgdG8gc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZSBjbGFzcworICAgICAqLworICAgIEMyU3luY1ZhcmlhYmxlcyAqbWVtKCk7CisKKyAgICB+QzJTdXJmYWNlU3luY01lbW9yeSgpOworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXQ7CisgICAgSGFuZGxlU3luY01lbSAqbUhhbmRsZTsKKyAgICBDMlN5bmNWYXJpYWJsZXMgKm1NZW07CisKKyAgICBDMlN1cmZhY2VTeW5jTWVtb3J5KCk7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX1NVUkZBQ0VfU1lOQ19PQkpfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCmluZGV4IGU5MDM3ZTUuLjEzYmRhYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwogI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwogCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KICNpbmNsdWRlIDxDMlBhcmFtLmg+CiAjaW5jbHVkZSA8QzJXb3JrLmg+CiAKQEAgLTExMzAsNiArMTEzMSwxOSBAQAogCiB9OwogCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIEMyQ29tcG9uZW50SW50ZXJmYWNlCisgKi8KK3N0cnVjdCBDMkludGVyZmFjZVV0aWxzIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdHJhaXRzIGZyb20gQzJDb21wb25lbnRJbnRlcmZhY2UuIE5vdGUgdGhhdCByYW5rIGNhbm5vdCBiZSBxdWVyaWVkIGZyb20gaW50ZXJmYWNlcywKKyAgICAgKiBzbyBsZWZ0IHVudG91Y2hlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBGaWxsVHJhaXRzRnJvbUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpUcmFpdHMgKnRyYWl0cywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpOworfTsKKwogI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KIAogI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaAppbmRleCA0YWU5NDZhLi5jNTEwZmNhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApAQCAtNTIsNiArNTIsOCBAQAogCiBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CiAKK2NsYXNzIEMyU3VyZmFjZVN5bmNNZW1vcnk7CisKIC8qKgogICogSW50ZXJuYWwgb25seSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrcyBieSBibG9jayBwb29sL2J1ZmZlciBwYXNzaW5nIGltcGxlbWVudGF0aW9ucy4KICAqCkBAIC0yNzksNiArMjgxLDggQEAKICAgICAgKiAgICAgICAgICAgICAgICAgYW55bW9yZS4KICAgICAgKiBccGFyYW0gaWdicCAgICAgXGMgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSB0byBiZSBhc3NpZ25lZCB0byB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2suIFRoaXMgaXMgbm90IG5lZWRlZCB3aGVuIHRoZSBibG9jayBpcyBsb2NhbC4KKyAgICAgKiBccGFyYW0gc3luY01lbSAgTWVtb3J5IGJsb2NrIHdoaWNoIHdpbGwgc3VwcG9ydCBzeW5jaHJvbml6YXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgYmV0d2VlbiBGcmFtZXdvcmsgYW5kIEhBTC4KICAgICAgKgogICAgICAqIFxyZXR1cm4gVGhlIHByZXZpb3VzIGhlbGQgc3RhdHVzLgogICAgICAqLwpAQCAtMjg3LDcgKzI5MSw4IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAogICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSA9IG51bGxwdHIpOwogCiAgICAgLyoqCiAgICAgICogUHJlcGFyZSBhIGJsb2NrIHRvIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHByb2Nlc3MuIFRoaXMgYmxvY2tzCkBAIC0zNTgsNiArMzYzLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4sCiAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAogICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKICAgICAgICAgICAgIGludDMyX3QgYnFTbG90KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MySGFuZGxlSW9uSW50ZXJuYWwuaCBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MySGFuZGxlSW9uSW50ZXJuYWwuaAppbmRleCBjMGUxZDgzLi5jNjc2OThjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkhhbmRsZUlvbkludGVybmFsLmgKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJIYW5kbGVJb25JbnRlcm5hbC5oCkBAIC0yOCw3ICsyOCwxMCBAQAogICAgICAgICAgIG1GZHN7IGJ1ZmZlckZkIH0sCiAgICAgICAgICAgbUludHN7IGludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHsgfQogCi0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pOworICAgIHN0YXRpYyBib29sIElzVmFsaWQoY29uc3QgQzJIYW5kbGUgKiBjb25zdCBvKTsKKworICAgIC8vIGRlcHJlY2F0ZWQKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeyByZXR1cm4gSXNWYWxpZChvKTsgfQogCiAgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CiAgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCmluZGV4IDYyOTM2ZjYuLjE2OWRlMGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0yOSw2ICsyOSw4IEBACiAjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CiAjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KICNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkZlbmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPEMyU3VyZmFjZVN5bmNPYmouaD4KIAogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWFwPgpAQCAtNTQsNTkgKzU2LDEzIEBACiB1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wCiAgICAgICAgIDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIAotc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhIDogcHVibGljIF9DMkJsb2NrUG9vbERhdGEgewotCi0gICAgYm9vbCBoZWxkOwotICAgIGJvb2wgbG9jYWw7Ci0gICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICB1aW50NjRfdCBicUlkOwotICAgIGludDMyX3QgYnFTbG90OwotICAgIGJvb2wgdHJhbnNmZXI7IC8vIGxvY2FsIHRyYW5zZmVyIHRvIHJlbW90ZQotICAgIGJvb2wgYXR0YWNoOyAvLyBhdHRhY2ggb24gcmVtb3RlCi0gICAgYm9vbCBkaXNwbGF5OyAvLyBkaXNwbGF5IG9uIHJlbW90ZTsKLSAgICBzdGQ6OndlYWtfcHRyPGludD4gb3duZXI7Ci0gICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicDsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4gbG9jYWxQb29sOwotICAgIG11dGFibGUgc3RkOjptdXRleCBsb2NrOwotCi0gICAgdmlydHVhbCB0eXBlX3QgZ2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIFRZUEVfQlVGRkVSUVVFVUU7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGEgcmVtb3RlIEJsb2NrUG9vbERhdGEuCi0gICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+ICZvd25lciwKLSAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcik7Ci0KLSAgICAvLyBDcmVhdGUgYSBsb2NhbCBCbG9ja1Bvb2xEYXRhLgotICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAotICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpOwotCi0gICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoKSBvdmVycmlkZTsKLQotICAgIGludCBtaWdyYXRlKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0b0dlbmVyYXRpb24sIHVpbnQ2NF90IHRvQnFJZCwKLSAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAqYnVmZmVycywgdWludDMyX3Qgb2xkR2VuZXJhdGlvbik7Ci19OwotCiBib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCiAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLCB1aW50NjRfdCogYnFJZCwgaW50MzJfdCogYnFTbG90KSB7CiAgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKLSAgICAgICAgaWYgKGdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOwotICAgICAgICAgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHBvb2xEYXRhLT5sb2NrKTsKLSAgICAgICAgICAgICpnZW5lcmF0aW9uID0gcG9vbERhdGEtPmdlbmVyYXRpb247Ci0gICAgICAgICAgICBpZiAoYnFJZCkgewotICAgICAgICAgICAgICAgICpicUlkID0gcG9vbERhdGEtPmJxSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnFTbG90KSB7Ci0gICAgICAgICAgICAgICAgKmJxU2xvdCA9IHBvb2xEYXRhLT5icVNsb3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmdldEJ1ZmZlclF1ZXVlRGF0YShnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE1LDI5ICs3MSwxOCBAQAogYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiYgb3duZXIsCi0gICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSkgewogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKLSAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOwotICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7Ci0gICAgICAgIHBvb2xEYXRhLT5vd25lciA9IG93bmVyOwotICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7Ci0gICAgfQotICAgIGlmIChwb29sRGF0YS0+aGVsZCkgewotICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBwb29sRGF0YS0+aG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKG93bmVyLCBpZ2JwLCBzeW5jTWVtKTsKIH0KIAogYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luVHJhbnNmZXJCbG9ja1RvQ2xpZW50KAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEpIHsKICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KICAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7Ci0gICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHBvb2xEYXRhLT5sb2NrKTsKLSAgICBwb29sRGF0YS0+dHJhbnNmZXIgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBwb29sRGF0YS0+YmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoKTsKIH0KIAogYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkVuZFRyYW5zZmVyQmxvY2tUb0NsaWVudCgKQEAgLTE0NSwyOCArOTAsMTQgQEAKICAgICAgICAgYm9vbCB0cmFuc2ZlcikgewogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKLSAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOwotICAgIHBvb2xEYXRhLT50cmFuc2ZlciA9IGZhbHNlOwotICAgIGlmICh0cmFuc2ZlcikgewotICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcG9vbERhdGEtPmVuZFRyYW5zZmVyQmxvY2tUb0NsaWVudCh0cmFuc2Zlcik7CiB9CiAKIGJvb2wgX0MyQmxvY2tGYWN0b3J5OjpCZWdpbkF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZSgKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhKSB7CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CiAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOwotICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7Ci0gICAgaWYgKHBvb2xEYXRhLT5sb2NhbCB8fCBwb29sRGF0YS0+ZGlzcGxheSB8fAotICAgICAgICBwb29sRGF0YS0+YXR0YWNoIHx8ICFwb29sRGF0YS0+aGVsZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwb29sRGF0YS0+YnFJZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcG9vbERhdGEtPmF0dGFjaCA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHBvb2xEYXRhLT5iZWdpbkF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZSgpOwogfQogCiAvLyBpZiBkaXNwbGF5IHdhcyB0cmllZCBkdXJpbmcgYXR0YWNoLCBidWZmZXIgc2hvdWxkIGJlIHJldGlyZWQgQVNBUC4KQEAgLTE3NCw0NyArMTA1LDIwIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAogICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IHN5bmNNZW0sCiAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCiAgICAgICAgIHVpbnQ2NF90IGJxSWQsCiAgICAgICAgIGludDMyX3QgYnFTbG90KSB7CiAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CiAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOwotICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7Ci0gICAgaWYgKHBvb2xEYXRhLT5sb2NhbCB8fCAhcG9vbERhdGEtPmF0dGFjaCApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocG9vbERhdGEtPmRpc3BsYXkpIHsKLSAgICAgICAgcG9vbERhdGEtPmF0dGFjaCA9IGZhbHNlOwotICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHBvb2xEYXRhLT5hdHRhY2ggPSBmYWxzZTsKLSAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7Ci0gICAgcG9vbERhdGEtPm93bmVyID0gb3duZXI7Ci0gICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOwotICAgIHBvb2xEYXRhLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKLSAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7Ci0gICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcG9vbERhdGEtPmVuZEF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZShvd25lciwgaWdicCwgc3luY01lbSwgZ2VuZXJhdGlvbiwgYnFJZCwgYnFTbG90KTsKIH0KIAogYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkRpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgewogICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKLSAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOwotICAgIGlmIChwb29sRGF0YS0+bG9jYWwgfHwgcG9vbERhdGEtPmRpc3BsYXkgfHwgIXBvb2xEYXRhLT5oZWxkKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHBvb2xEYXRhLT5icUlkID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwb29sRGF0YS0+ZGlzcGxheSA9IHRydWU7Ci0gICAgaWYgKHBvb2xEYXRhLT5hdHRhY2gpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBwb29sRGF0YS0+ZGlzcGxheUJsb2NrVG9CdWZmZXJRdWV1ZSgpOwogfQogCiBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKApAQCAtMjIzLDcgKzEyNyw3IEBACiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMkFsbG9jYXRvckdyYWxsb2M+IHNBbGxvY2F0b3IgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyQWxsb2NhdG9yR3JhbGxvYz4oMCk7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7Ci0gICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgaWYgKEMyQWxsb2NhdG9yR3JhbGxvYzo6Q2hlY2tIYW5kbGUoaGFuZGxlKSkgewogICAgICAgICB1aW50MzJfdCB3aWR0aDsKICAgICAgICAgdWludDMyX3QgaGVpZ2h0OwogICAgICAgICB1aW50MzJfdCBmb3JtYXQ7CkBAIC0yNjcsOCArMTcxLDggQEAKICAgICByZXR1cm4gc3RhbXA7CiB9CiAKLWJvb2wgZ2V0R2VuZXJhdGlvbk51bWJlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24pIHsKK2Jvb2wgZ2V0R2VuZXJhdGlvbk51bWJlckFuZFVzYWdlKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqdXNhZ2UpIHsKICAgICBzdGF0dXNfdCBzdGF0dXN7fTsKICAgICBpbnQgc2xvdHt9OwogICAgIGJvb2wgYnVmZmVyTmVlZHNSZWFsbG9jYXRpb257fTsKQEAgLTMwMiw3ICsyMDYsNyBAQAogICAgIC8vIGluc3RlYWQgb2YgYSBuZXcgYWxsb2NhdGlvbi4KICAgICB0cmFuc1Jlc3VsdCA9IHByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAogICAgICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmc2xvdEJ1ZmZlciwgJmdlbmVyYXRpb25dKAorICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90QnVmZmVyLCAmZ2VuZXJhdGlvbiwgJnVzYWdlXSgKICAgICAgICAgICAgICAgICAgICAgSFN0YXR1cyBoU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICBIQnVmZmVyIGNvbnN0JiBoQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKQEAgLTMxMCw2ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaDJiKGhCdWZmZXIsICZzbG90QnVmZmVyKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb25OdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICp1c2FnZSA9IHNsb3RCdWZmZXItPmdldFVzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOwpAQCAtMzMwLDEyICsyMzUsNTggQEAKIGNsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKICAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7CiBwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGRlcXVldWVCdWZmZXIoCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlIGFuZHJvaWRVc2FnZSwKKyAgICAgICAgICAgIGludCAqc2xvdCwgYm9vbCAqbmVlZHNSZWFsbG9jLCBzcDxGZW5jZT4gKmZlbmNlKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgICAgICB1c2luZyBJbnB1dCA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRlcXVldWVCdWZmZXJJbnB1dDsKKyAgICAgICAgdXNpbmcgT3V0cHV0ID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGVxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgIElucHV0eworICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRVc2FnZS5hc0dyYWxsb2NVc2FnZSgpfSwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgc2xvdCwgbmVlZHNSZWFsbG9jLAorICAgICAgICAgICAgICAgICBmZW5jZV0oSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGNvbnN0JiBoT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICpzbG90ID0gc3RhdGljX2Nhc3Q8aW50PihoU2xvdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaDJiKGhTdGF0dXMsICZzdGF0dXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWgyYihoT3V0cHV0LmZlbmNlLCBmZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKm5lZWRzUmVhbGxvYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPdXRwdXQuYnVmZmVyTmVlZHNSZWFsbG9jYXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkgfHwgc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBpZiAodHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgKyttRHFGYWlsdXJlOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT04gfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OlRJTUVEX09VVCB8fAorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGVxdWV1ZSBidWZmZXIgaXMgYmxvY2tlZCB0ZW1wb3JhcmlseS4gUmV0cnlpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgiY2Fubm90IGRlcXVldWUgYnVmZmVyICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKwogICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAogICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAogICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKLSAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBDMkZlbmNlICpjMkZlbmNlKSB7CiAgICAgICAgIC8vIFdlIGhhdmUgYW4gSUdCUCBub3cuCiAgICAgICAgIEMyQW5kcm9pZE1lbW9yeVVzYWdlIGFuZHJvaWRVc2FnZSA9IHVzYWdlOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXN7fTsKQEAgLTM0NCw0MSArMjk1LDQyIEBACiAgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOwogICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKIAorICAgICAgICBDMlN5bmNWYXJpYWJsZXMgKnN5bmNWYXIgPSBtU3luY01lbSA/IG1TeW5jTWVtLT5tZW0oKTogbnVsbHB0cjsKICAgICAgICAgeyAvLyBDYWxsIGRlcXVldWVCdWZmZXIoKS4KLSAgICAgICAgICAgIHVzaW5nIElucHV0ID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGVxdWV1ZUJ1ZmZlcklucHV0OwotICAgICAgICAgICAgdXNpbmcgT3V0cHV0ID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGVxdWV1ZUJ1ZmZlck91dHB1dDsKLSAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1Qcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgSW5wdXR7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRVc2FnZS5hc0dyYWxsb2NVc2FnZSgpfSwKLSAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAmZmVuY2VdKEhTdGF0dXMgaFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoU2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0IGNvbnN0JiBoT3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbG90ID0gc3RhdGljX2Nhc3Q8aW50PihoU2xvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgyYihoU3RhdHVzLCAmc3RhdHVzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaDJiKGhPdXRwdXQuZmVuY2UsICZmZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSA6OmFuZHJvaWQ6OkJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE91dHB1dC5idWZmZXJOZWVkc1JlYWxsb2NhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSB8fCBzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICsrbURxRmFpbHVyZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OlRJTUVEX09VVCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OldPVUxEX0JMT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXF1ZXVlIGJ1ZmZlciBpcyBibG9ja2VkIHRlbXBvcmFyaWx5LiBSZXRyeWluZyBpcwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBjMlN0YXR1czsKKyAgICAgICAgICAgIGlmIChzeW5jVmFyKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2FpdElkOworICAgICAgICAgICAgICAgIHN5bmNWYXItPmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN5bmNWYXItPmlzRGVxdWV1ZWFibGVMb2NrZWQoJndhaXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Zhci0+dW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjMkZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYzJGZW5jZSA9IF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlU3VyZmFjZUZlbmNlKG1TeW5jTWVtLCB3YWl0SWQpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNhbm5vdCBkZXF1ZXVlIGJ1ZmZlciAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBpZiAoc3luY1Zhci0+Z2V0U3luY1N0YXR1c0xvY2tlZCgpICE9IEMyU3luY1ZhcmlhYmxlczo6U1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICB3YWl0SWQgPSBzeW5jVmFyLT5nZXRXYWl0SWRMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Zhci0+dW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjMkZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYzJGZW5jZSA9IF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlU3VyZmFjZUZlbmNlKG1TeW5jTWVtLCB3YWl0SWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3luY1Zhci0+bm90aWZ5RGVxdWV1ZWRMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBjMlN0YXR1cyA9IGRlcXVldWVCdWZmZXIod2lkdGgsIGhlaWdodCwgZm9ybWF0LCBhbmRyb2lkVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xvdCwgJmJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uLCAmZmVuY2UpOworICAgICAgICAgICAgICAgIGlmIChjMlN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNWYXItPm5vdGlmeVF1ZXVlZExvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMyU3RhdHVzID0gZGVxdWV1ZUJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsb3QsICZidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiwgJmZlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjMlN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBjMlN0YXR1czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1EcUZhaWx1cmUgPSAwOwogICAgICAgICAgICAgbUxhc3REcVRzID0gZ2V0VGltZXN0YW1wTm93KCk7CkBAIC0zODksMTggKzM0MSw0MSBAQAogICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIGJvb2wgZGVxdWV1ZWFibGUgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3Qgd2FpdElkOwogICAgICAgICBpZiAoZmVuY2UpIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtGZW5jZVdhaXRUaW1lTXMgPSAxMDsKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmVuY2UtPndhaXQoa0ZlbmNlV2FpdFRpbWVNcyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IC1FVElNRSkgewogICAgICAgICAgICAgICAgIC8vIGZlbmNlIGlzIG5vdCBzaWduYWxsZWQgeWV0LgotICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3luY1ZhcikgeworICAgICAgICAgICAgICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWFibGUgPSBzeW5jVmFyLT5ub3RpZnlRdWV1ZWRMb2NrZWQoJndhaXRJZCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNWYXItPnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBpZiAoYzJGZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmMyRmVuY2UgPSBkZXF1ZXVlYWJsZSA/IEMyRmVuY2UoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMkZlbmNlRmFjdG9yeTo6Q3JlYXRlU3VyZmFjZUZlbmNlKG1TeW5jTWVtLCB3YWl0SWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBmZW5jZSB3YWl0IGVycm9yICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Zhci0+bG9jaygpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNWYXItPm5vdGlmeVF1ZXVlZExvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMyRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjMkZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOwpAQCAtNDQwLDcgKzQxNSwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Zhci0+bG9jaygpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNWYXItPm5vdGlmeVF1ZXVlZExvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMyRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjMkZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1HZW5lcmF0aW9uID09IDApIHsKQEAgLTQ2MywyMCArNDQ4LDM2IEBACiAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOwogICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oYzJIYW5kbGUsICZhbGxvYyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGMySGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoYzJIYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXIsIG1TeW5jTWVtLCAwKTsKICAgICAgICAgICAgICAgICBtUG9vbERhdGFzW3Nsb3RdID0gcG9vbERhdGE7CiAgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBCbG9jayB3YXMgbm90IGNyZWF0ZWQuIGNhbGwgcmVxdWVzdEJ1ZmZlciMgYWdhaW4gbmV4dCB0aW1lLgogICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIHN5bmNWYXItPm5vdGlmeVF1ZXVlZExvY2tlZCgpOworICAgICAgICAgICAgICAgIHN5bmNWYXItPnVubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjMkZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICpjMkZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJGZW5jZSkgeworICAgICAgICAgICAgKmMyRmVuY2UgPSBDMkZlbmNlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKICAgICB9CkBAIC01MDYsNyArNTA3LDggQEAKICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovLAorICAgICAgICAgICAgQzJGZW5jZSAqZmVuY2UpIHsKICAgICAgICAgYmxvY2stPnJlc2V0KCk7CiAgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgewogICAgICAgICAgICAgcmV0dXJuIG1Jbml0OwpAQCAtNTM3LDE3ICs1MzksMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQogICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAodWludDY0X3QpMCwgfjAsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBudWxscHRyLCBudWxscHRyLCAwKTsKICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CiAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOwogCiAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CiAgICAgICAgIH0KLSAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrLCBmZW5jZSk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfQkxPQ0tJTkcpIHsKICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBpbiBvcmRlciBub3QgdG8gZHJhaW4gY3B1IGZyb20gY29tcG9uZW50J3Mgc3Bpbm5pbmcKLSAgICAgICAgICAgIDo6dXNsZWVwKGtNYXhJZ2JwUmV0cnlEZWxheVVzKTsKKyAgICAgICAgICAgIGlmICghZmVuY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciBub3QgdG8gZHJhaW4gY3B1IGZyb20gY29tcG9uZW50J3Mgc3Bpbm5pbmcKKyAgICAgICAgICAgICAgICA6OnVzbGVlcChrTWF4SWdicFJldHJ5RGVsYXlVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CkBAIC01NTcsMTAgKzU2MSwxMiBAQAogICAgICAgICBtUmVuZGVyQ2FsbGJhY2sgPSByZW5kZXJDYWxsYmFjazsKICAgICB9CiAKKyAgICAvKiBUaGlzIGlzIGZvciBPbGQgSEFMIHJlcXVlc3QgZm9yIGNvbXBhdGliaWxpdHkgKi8KICAgICB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcikgewogICAgICAgICB1aW50NjRfdCBwcm9kdWNlcklkID0gMDsKICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDA7Ci0gICAgICAgIGJvb2wgaGF2ZUdlbmVyYXRpb24gPSBmYWxzZTsKKyAgICAgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgICAgICBib29sIGJxSW5mb3JtYXRpb24gPSBmYWxzZTsKICAgICAgICAgaWYgKHByb2R1Y2VyKSB7CiAgICAgICAgICAgICBSZXR1cm48dWludDY0X3Q+IHRyYW5zUmVzdWx0ID0gcHJvZHVjZXItPmdldFVuaXF1ZUlkKCk7CiAgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgewpAQCAtNTY4LDE0ICs1NzQsMzIgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcm9kdWNlcklkID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHRyYW5zUmVzdWx0KTsKLSAgICAgICAgICAgIC8vIFRPRE86IHByb3ZpZGUgZ25lcmF0aW9uIG51bWJlciBmcm9tIHBhcmFtZXRlci4KLSAgICAgICAgICAgIGhhdmVHZW5lcmF0aW9uID0gZ2V0R2VuZXJhdGlvbk51bWJlcihwcm9kdWNlciwgJmdlbmVyYXRpb24pOwotICAgICAgICAgICAgaWYgKCFoYXZlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgYnFJbmZvcm1hdGlvbiA9IGdldEdlbmVyYXRpb25OdW1iZXJBbmRVc2FnZShwcm9kdWNlciwgJmdlbmVyYXRpb24sICZ1c2FnZSk7CisgICAgICAgICAgICBpZiAoIWJxSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0IGdlbmVyYXRpb25OdW1iZXIgZmFpbGVkICVsbHUiLAogICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgY29uZmlndXJlUHJvZHVjZXIocHJvZHVjZXIsIG51bGxwdHIsIHByb2R1Y2VySWQsIGdlbmVyYXRpb24sIHVzYWdlLCBicUluZm9ybWF0aW9uKTsKKyAgICB9CisKKyAgICB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc3luY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHByb2R1Y2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJxSW5mb3JtYXRpb24pIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IGMyU3luY01lbTsKKyAgICAgICAgaWYgKHN5bmNIYW5kbGUpIHsKKyAgICAgICAgICAgIGlmICghcHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKHN5bmNIYW5kbGUpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKHN5bmNIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjMlN5bmNNZW0gPSBDMlN1cmZhY2VTeW5jTWVtb3J5OjpJbXBvcnQoc3luY0hhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaW50IG1pZ3JhdGVkID0gMDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3VyZmFjZVN5bmNNZW1vcnk+IG9sZE1lbTsKICAgICAgICAgLy8gcG9vbERhdGFzIGR0b3Igc2hvdWxkIG5vdCBiZSBjYWxsZWQgZHVyaW5nIGxvY2sgaXMgaGVsZC4KICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPgogICAgICAgICAgICAgICAgIHBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKQEAgLTU5NSwyMiArNjE5LDMwIEBACiAgICAgICAgICAgICBpZiAocHJvZHVjZXIpIHsKICAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7Ci0gICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSBoYXZlR2VuZXJhdGlvbiA/IGdlbmVyYXRpb24gOiAwOworICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uID0gYnFJbmZvcm1hdGlvbiA/IGdlbmVyYXRpb24gOiAwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBudWxscHRyOwogICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkID0gMDsKICAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgcHJvZHVjZXIgcHJvZHVjZXIoJWQpLCBnZW5lcmF0aW9uKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgKGJvb2wpcHJvZHVjZXIsIGhhdmVHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAoYm9vbClwcm9kdWNlciwgYnFJbmZvcm1hdGlvbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb2R1Y2VyICYmIGhhdmVHZW5lcmF0aW9uKSB7IC8vIG1pZ3JhdGUgYnVmZmVycworICAgICAgICAgICAgb2xkTWVtID0gbVN5bmNNZW07IC8vIHByZXZlbiBkZXN0cnVjdGlvbiB3aGlsZSBsb2NrZWQuCisgICAgICAgICAgICBtU3luY01lbSA9IGMyU3luY01lbTsKKyAgICAgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqc3luY1ZhciA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChzeW5jVmFyKSB7CisgICAgICAgICAgICAgICAgc3luY1Zhci0+bG9jaygpOworICAgICAgICAgICAgICAgIHN5bmNWYXItPnNldFN5bmNTdGF0dXNMb2NrZWQoQzJTeW5jVmFyaWFibGVzOjpTVEFUVVNfQUNUSVZFKTsKKyAgICAgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJvZHVjZXIgJiYgYnFJbmZvcm1hdGlvbikgeyAvLyBtaWdyYXRlIGJ1ZmZlcnMKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgewogICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IGRhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb29sRGF0YXNbaV0ubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsb3QgPSBkYXRhLT5taWdyYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXIsIGdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VySWQsIG1CdWZmZXJzLCBvbGRHZW5lcmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLCBnZW5lcmF0aW9uLCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJJZCwgbUJ1ZmZlcnNbaV0sIG9sZEdlbmVyYXRpb24sIG1TeW5jTWVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbG90ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzW3Nsb3RdID0gbUJ1ZmZlcnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbERhdGFzW3Nsb3RdID0gZGF0YTsKQEAgLTYyNCw3ICs2NTYsNyBAQAogICAgICAgICAgICAgICAgIG1Qb29sRGF0YXNbaV0gPSBwb29sRGF0YXNbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHByb2R1Y2VyICYmIGhhdmVHZW5lcmF0aW9uKSB7CisgICAgICAgIGlmIChwcm9kdWNlciAmJiBicUluZm9ybWF0aW9uKSB7CiAgICAgICAgICAgICBBTE9HRCgibG9jYWwgZ2VuZXJhdGlvbiBjaGFuZ2UgJXUgLCAiCiAgICAgICAgICAgICAgICAgICAiYnFJZDogJWxsdSBtaWdyYXRlZCBidWZmZXJzICMgJWQiLAogICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylwcm9kdWNlcklkLCBtaWdyYXRlZCk7CkBAIC02MzQsMTcgKzY2Niw2IEBACiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CiAKLSAgICB2b2lkIGNhbmNlbCh1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgewotICAgICAgICBib29sIGNhbmNlbGxlZCA9IGZhbHNlOwotICAgICAgICB7Ci0gICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwotICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbiAmJiBpZ2JwX2lkID09IG1Qcm9kdWNlcklkICYmIG1Qcm9kdWNlcikgewotICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoaWdicF9zbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7Ci0gICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBjMl9zdGF0dXNfdCBtSW5pdDsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJJZDsKICAgICB1aW50MzJfdCBtR2VuZXJhdGlvbjsKQEAgLTY2Miw3MSArNjgzLDEyMyBAQAogCiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107CiAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBtU3luY01lbTsKIH07CiAKIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyKSA6Ci0gICAgICAgIGhlbGQocHJvZHVjZXIgJiYgYnFJZCAhPSAwKSwgbG9jYWwoZmFsc2UpLAotICAgICAgICBnZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBicUlkKGJxSWQpLCBicVNsb3QoYnFTbG90KSwKLSAgICAgICAgdHJhbnNmZXIoZmFsc2UpLCBhdHRhY2goZmFsc2UpLCBkaXNwbGF5KGZhbHNlKSwKLSAgICAgICAgb3duZXIob3duZXIpLCBpZ2JwKHByb2R1Y2VyKSwKLSAgICAgICAgbG9jYWxQb29sKCkgeworICAgICAgICBtTG9jYWwoZmFsc2UpLCBtSGVsZChwcm9kdWNlciAmJiBicUlkICE9IDApLAorICAgICAgICBtR2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgbUJxSWQoYnFJZCksIG1CcVNsb3QoYnFTbG90KSwKKyAgICAgICAgbUN1cnJlbnRHZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBtQ3VycmVudEJxSWQoYnFJZCksCisgICAgICAgIG1UcmFuc2ZlcihmYWxzZSksIG1BdHRhY2goZmFsc2UpLCBtRGlzcGxheShmYWxzZSksCisgICAgICAgIG1Pd25lcihvd25lciksIG1JZ2JwKHByb2R1Y2VyKSB7CiB9CiAKIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCi0gICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgotICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKLSAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCi0gICAgICAgIHRyYW5zZmVyKGZhbHNlKSwgYXR0YWNoKGZhbHNlKSwgZGlzcGxheShmYWxzZSksCi0gICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAotICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLCBpbnQgbm9Vc2UpIDoKKyAgICAgICAgbUxvY2FsKHRydWUpLCBtSGVsZCh0cnVlKSwKKyAgICAgICAgbUdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIG1CcUlkKGJxSWQpLCBtQnFTbG90KGJxU2xvdCksCisgICAgICAgIG1DdXJyZW50R2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgbUN1cnJlbnRCcUlkKGJxSWQpLAorICAgICAgICBtVHJhbnNmZXIoZmFsc2UpLCBtQXR0YWNoKGZhbHNlKSwgbURpc3BsYXkoZmFsc2UpLAorICAgICAgICBtSWdicChwcm9kdWNlciksIG1TeW5jTWVtKHN5bmNNZW0pIHsKKyAgICAgICAgICAgICh2b2lkKW5vVXNlOwogfQogCiBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgewotICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICBpZiAoIW1IZWxkIHx8IG1CcUlkID09IDAgfHwgIW1JZ2JwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKGxvY2FsKSB7Ci0gICAgICAgIGlmIChsb2NhbFBvb2wpIHsKLSAgICAgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7CisKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGlmIChtR2VuZXJhdGlvbiA9PSBtQ3VycmVudEdlbmVyYXRpb24gJiYgbUJxSWQgPT0gbUN1cnJlbnRCcUlkKSB7CisgICAgICAgICAgICBDMlN5bmNWYXJpYWJsZXMgKnN5bmNWYXIgPSBtU3luY01lbSA/IG1TeW5jTWVtLT5tZW0oKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc3luY1ZhcikgeworICAgICAgICAgICAgICAgIHN5bmNWYXItPmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3luY1Zhci0+Z2V0U3luY1N0YXR1c0xvY2tlZCgpID09IEMyU3luY1ZhcmlhYmxlczo6U1RBVFVTX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICBtSWdicC0+Y2FuY2VsQnVmZmVyKG1CcVNsb3QsIGhpZGxfaGFuZGxle30pLmlzT2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY1Zhci0+bm90aWZ5UXVldWVkTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN5bmNWYXItPnVubG9jaygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSWdicC0+Y2FuY2VsQnVmZmVyKG1CcVNsb3QsIGhpZGxfaGFuZGxle30pLmlzT2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaWdicCAmJiAhb3duZXIuZXhwaXJlZCgpKSB7Ci0gICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIGhpZGxfaGFuZGxle30pLmlzT2soKTsKKyAgICB9IGVsc2UgaWYgKCFtT3duZXIuZXhwaXJlZCgpKSB7CisgICAgICAgIEMyU3luY1ZhcmlhYmxlcyAqc3luY1ZhciA9IG1TeW5jTWVtID8gbVN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKKyAgICAgICAgaWYgKHN5bmNWYXIpIHsKKyAgICAgICAgICAgIHN5bmNWYXItPmxvY2soKTsKKyAgICAgICAgICAgIGlmIChzeW5jVmFyLT5nZXRTeW5jU3RhdHVzTG9ja2VkKCkgIT0gQzJTeW5jVmFyaWFibGVzOjpTVEFUVVNfU1dJVENISU5HKSB7CisgICAgICAgICAgICAgICAgbUlnYnAtPmNhbmNlbEJ1ZmZlcihtQnFTbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7CisgICAgICAgICAgICAgICAgc3luY1Zhci0+bm90aWZ5UXVldWVkTG9ja2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jVmFyLT51bmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JZ2JwLT5jYW5jZWxCdWZmZXIobUJxU2xvdCwgaGlkbF9oYW5kbGV7fSkuaXNPaygpOworICAgICAgICB9CiAgICAgfQogfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6dHlwZV90IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworfQorCiBpbnQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6Om1pZ3JhdGUoCiAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKLSAgICAgICAgdWludDMyX3QgdG9HZW5lcmF0aW9uLCB1aW50NjRfdCB0b0JxSWQsCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+ICpidWZmZXJzLCB1aW50MzJfdCBvbGRHZW5lcmF0aW9uKSB7Ci0gICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsKGxvY2spOwotICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgdWludDMyX3QgdG9HZW5lcmF0aW9uLCB1aW50NjRfdCB0b1VzYWdlLCB1aW50NjRfdCB0b0JxSWQsCisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLCB1aW50MzJfdCBvbGRHZW5lcmF0aW9uLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChtTG9jayk7CisKKyAgICBtQ3VycmVudEJxSWQgPSB0b0JxSWQ7CisgICAgbUN1cnJlbnRHZW5lcmF0aW9uID0gdG9HZW5lcmF0aW9uOworCisgICAgaWYgKCFtSGVsZCB8fCBtQnFJZCA9PSAwKSB7CiAgICAgICAgIEFMT0dWKCJidWZmZXIgaXMgbm90IG93bmVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKCFsb2NhbCB8fCAhbG9jYWxQb29sKSB7CisgICAgaWYgKCFtTG9jYWwpIHsKICAgICAgICAgQUxPR1YoInBvb2wgaXMgbm90IGxvY2FsIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKGJxU2xvdCA8IDAgfHwgYnFTbG90ID49IE5VTV9CVUZGRVJfU0xPVFMgfHwgIWJ1ZmZlcnNbYnFTbG90XSkgeworICAgIGlmIChtQnFTbG90IDwgMCB8fCBtQnFTbG90ID49IE5VTV9CVUZGRVJfU0xPVFMpIHsKICAgICAgICAgQUxPR1YoInNsb3QgaXMgbm90IGluIGVmZmVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmICh0b0dlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbiAmJiBicUlkID09IHRvQnFJZCkgeworICAgIGlmICghZ3JhcGhpY0J1ZmZlcikgeworICAgICAgICBBTE9HVigiYnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodG9HZW5lcmF0aW9uID09IG1HZW5lcmF0aW9uICYmIG1CcUlkID09IHRvQnFJZCkgewogICAgICAgICBBTE9HVigiY2Fubm90IG1pZ3JhdGUgdG8gc2FtZSBidWZmZXJxdWV1ZSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChvbGRHZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKKyAgICBpZiAob2xkR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgewogICAgICAgICBBTE9HVigiY2Fubm90IG1pZ3JhdGUgc3RhbGUgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKHRyYW5zZmVyKSB7CisgICAgaWYgKG1UcmFuc2ZlcikgewogICAgICAgICAvLyBlaXRoZXIgdHJhbnNmZXJyZWQgb3IgZGV0YWNoZWQuCiAgICAgICAgIEFMT0dWKCJidWZmZXIgaXMgaW4gdHJhbnNmZXIiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBjb25zdCYgZ3JhcGhpY0J1ZmZlciA9IGJ1ZmZlcnNbYnFTbG90XTsKKworICAgIGlmICh0b1VzYWdlICE9IGdyYXBoaWNCdWZmZXItPmdldFVzYWdlKCkpIHsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBncmFwaGljQnVmZmVyLT5oYW5kbGUsIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgIGdyYXBoaWNCdWZmZXItPndpZHRoLCBncmFwaGljQnVmZmVyLT5oZWlnaHQsIGdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgIGdyYXBoaWNCdWZmZXItPmxheWVyQ291bnQsIHRvVXNhZ2UgfCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpLCBncmFwaGljQnVmZmVyLT5zdHJpZGUpOworICAgICAgICBpZiAobmV3QnVmZmVyLT5pbml0Q2hlY2soKSA9PSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlciA9IHN0ZDo6bW92ZShuZXdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzKCkgZmFpbGVkIHRvIHVwZGF0ZSB1c2FnZSwgb3JpZ2luYWwgdXNhZ2U9JSIgUFJJeDY0ICIsIHRvVXNhZ2U9JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGdyYXBoaWNCdWZmZXItPmdldFVzYWdlKCksIHRvVXNhZ2UpOworICAgICAgICB9CisgICAgfQogICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIodG9HZW5lcmF0aW9uKTsKIAogICAgIEhCdWZmZXIgaEJ1ZmZlcnt9OwpAQCAtNzU1LDEzICs4MjgsMTI0IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgQUxPR1YoImxvY2FsIG1pZ3JhdGlvbiBmcm9tIGdlbiAldSA6ICV1IHNsb3QgJWQgOiAlZCIsCi0gICAgICAgICAgZ2VuZXJhdGlvbiwgdG9HZW5lcmF0aW9uLCBicVNsb3QsIHNsb3QpOwotICAgIGdlbmVyYXRpb24gPSB0b0dlbmVyYXRpb247Ci0gICAgYnFJZCA9IHRvQnFJZDsKLSAgICBicVNsb3QgPSBzbG90OworICAgICAgICAgIG1HZW5lcmF0aW9uLCB0b0dlbmVyYXRpb24sIG1CcVNsb3QsIHNsb3QpOworICAgIG1JZ2JwID0gcHJvZHVjZXI7CisgICAgbUdlbmVyYXRpb24gPSB0b0dlbmVyYXRpb247CisgICAgbUJxSWQgPSB0b0JxSWQ7CisgICAgbUJxU2xvdCA9IHNsb3Q7CisgICAgbVN5bmNNZW0gPSBzeW5jTWVtOworCisgICAgQzJTeW5jVmFyaWFibGVzICpzeW5jVmFyID0gc3luY01lbSA/IHN5bmNNZW0tPm1lbSgpIDogbnVsbHB0cjsKKyAgICBpZiAoc3luY1ZhcikgeworICAgICAgICBzeW5jVmFyLT5sb2NrKCk7CisgICAgICAgIHN5bmNWYXItPm5vdGlmeURlcXVldWVkTG9ja2VkKCk7CisgICAgICAgIHN5bmNWYXItPnVubG9jaygpOworICAgIH0KICAgICByZXR1cm4gc2xvdDsKIH0KIAordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6Z2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgY29uc3QgeworICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgICpnZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgICAgIGlmIChicUlkKSB7CisgICAgICAgICAgICAqYnFJZCA9IG1CcUlkOworICAgICAgICB9CisgICAgICAgIGlmIChicVNsb3QpIHsKKyAgICAgICAgICAgICpicVNsb3QgPSBtQnFTbG90OworICAgICAgICB9CisgICAgfQorfQorCitib29sIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpob2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIW1Mb2NhbCkgeworICAgICAgICBtT3duZXIgPSBvd25lcjsKKyAgICAgICAgbUlnYnAgPSBpZ2JwOworICAgICAgICBtU3luY01lbSA9IHN5bmNNZW07CisgICAgfQorICAgIGlmIChtSGVsZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1IZWxkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6YmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtVHJhbnNmZXIgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjplbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoYm9vbCB0cmFuc2ZlcikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVRyYW5zZmVyID0gZmFsc2U7CisgICAgaWYgKHRyYW5zZmVyKSB7CisgICAgICAgIG1IZWxkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpiZWdpbkF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZSgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtTG9jYWwgfHwgbURpc3BsYXkgfHwKKyAgICAgICAgbUF0dGFjaCB8fCAhbUhlbGQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobUJxSWQgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1BdHRhY2ggPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjplbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICBpbnQzMl90IGJxU2xvdCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKG1Mb2NhbCB8fCAhbUF0dGFjaCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtRGlzcGxheSkgeworICAgICAgICBtQXR0YWNoID0gZmFsc2U7CisgICAgICAgIG1IZWxkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUF0dGFjaCA9IGZhbHNlOworICAgIG1IZWxkID0gdHJ1ZTsKKyAgICBtT3duZXIgPSBvd25lcjsKKyAgICBtSWdicCA9IGlnYnA7CisgICAgbVN5bmNNZW0gPSBzeW5jTWVtOworICAgIG1HZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICBtQnFJZCA9IGJxSWQ7CisgICAgbUJxU2xvdCA9IGJxU2xvdDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6ZGlzcGxheUJsb2NrVG9CdWZmZXJRdWV1ZSgpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtTG9jYWwgfHwgbURpc3BsYXkgfHwgIW1IZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1CcUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtRGlzcGxheSA9IHRydWU7CisgICAgaWYgKG1BdHRhY2gpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtSGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCiBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKICAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQpAQCAtNzc1LDcgKzk1OSwyMCBAQAogICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CiAgICAgaWYgKG1JbXBsKSB7Ci0gICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2hHcmFwaGljQmxvY2sod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrLCBudWxscHRyKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLywKKyAgICAgICAgQzJGZW5jZSAqZmVuY2UgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrLCBmZW5jZSk7CiAgICAgfQogICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CiB9CkBAIC03ODYsNiArOTgzLDE4IEBACiAgICAgfQogfQogCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmNvbmZpZ3VyZVByb2R1Y2VyKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqc3luY01lbW9yeSwKKyAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbklkLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jb25maWd1cmVQcm9kdWNlcigKKyAgICAgICAgICAgICAgIHByb2R1Y2VyLCBzeW5jTWVtb3J5LCBicUlkLCBnZW5lcmF0aW9uSWQsIGNvbnN1bWVyVXNhZ2UsIHRydWUpOworICAgIH0KK30KKwogdm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgewogICAgIGlmIChtSW1wbCkgewogICAgICAgICBtSW1wbC0+c2V0UmVuZGVyQ2FsbGJhY2socmVuZGVyQ2FsbGJhY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJTdXJmYWNlU3luY09iai5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMlN1cmZhY2VTeW5jT2JqLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTViZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJTdXJmYWNlU3luY09iai5jcHAKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU3VyZmFjZVN5bmNPYmoiCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxDMlN1cmZhY2VTeW5jT2JqLmg+CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBDMlN1cmZhY2VTeW5jTWVtb3J5OjpIYW5kbGVTeW5jTWVtOjpjSGVhZGVyID0geworICAgIEMyU3VyZmFjZVN5bmNNZW1vcnk6OkhhbmRsZVN5bmNNZW06OnZlcnNpb24sCisgICAgQzJTdXJmYWNlU3luY01lbW9yeTo6SGFuZGxlU3luY01lbTo6bnVtRmRzLAorICAgIEMyU3VyZmFjZVN5bmNNZW1vcnk6OkhhbmRsZVN5bmNNZW06Om51bUludHMsCisgICAge30KK307CisKK2Jvb2wgQzJTdXJmYWNlU3luY01lbW9yeTo6SGFuZGxlU3luY01lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgICAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgSGFuZGxlU3luY01lbSAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVTeW5jTWVtKj4obyk7CisgICAgcmV0dXJuIG90aGVyLT5tSW50cy5tTWFnaWMgPT0ga01hZ2ljOworfQorCitDMlN1cmZhY2VTeW5jTWVtb3J5OjpDMlN1cmZhY2VTeW5jTWVtb3J5KCkKKyAgICA6IG1Jbml0KGZhbHNlKSwgbUhhbmRsZShudWxscHRyKSwgbU1lbShudWxscHRyKSB7fQorCitDMlN1cmZhY2VTeW5jTWVtb3J5Ojp+QzJTdXJmYWNlU3luY01lbW9yeSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgICAgaWYgKG1NZW0pIHsKKyAgICAgICAgICAgIG11bm1hcChzdGF0aWNfY2FzdDx2b2lkICo+KG1NZW0pLCBtSGFuZGxlLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBDMlN1cmZhY2VTeW5jTWVtb3J5OjpJbXBvcnQoCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgaWYgKCFIYW5kbGVTeW5jTWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgSGFuZGxlU3luY01lbSAqbyA9IHN0YXRpY19jYXN0PEhhbmRsZVN5bmNNZW0qPihoYW5kbGUpOworICAgIHZvaWQgKnB0ciA9IG1tYXAoTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5tZW1GZCgpLCAwKTsKKworICAgIGlmIChwdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBzeW5jTWVtKG5ldyBDMlN1cmZhY2VTeW5jTWVtb3J5KTsKKyAgICBzeW5jTWVtLT5tSW5pdCA9IHRydWU7CisgICAgc3luY01lbS0+bUhhbmRsZSA9IG87CisgICAgc3luY01lbS0+bU1lbSA9IHN0YXRpY19jYXN0PEMyU3luY1ZhcmlhYmxlcyo+KHB0cik7CisgICAgcmV0dXJuIHN5bmNNZW07Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlN1cmZhY2VTeW5jTWVtb3J5PiBDMlN1cmZhY2VTeW5jTWVtb3J5OjpDcmVhdGUoaW50IGZkLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChmZCA8IDAgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBIYW5kbGVTeW5jTWVtICpoYW5kbGUgPSBuZXcgSGFuZGxlU3luY01lbShmZCwgc2l6ZSk7CisKKyAgICB2b2lkICpwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKKyAgICBpZiAocHRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdXJmYWNlU3luY01lbW9yeT4gc3luY01lbShuZXcgQzJTdXJmYWNlU3luY01lbW9yeSk7CisgICAgc3luY01lbS0+bUluaXQgPSB0cnVlOworICAgIHN5bmNNZW0tPm1IYW5kbGUgPSBoYW5kbGU7CisgICAgc3luY01lbS0+bU1lbSA9IHN0YXRpY19jYXN0PEMyU3luY1ZhcmlhYmxlcyo+KHB0cik7CisgICAgcmV0dXJuIHN5bmNNZW07Cit9CisKK25hdGl2ZV9oYW5kbGVfdCAqQzJTdXJmYWNlU3luY01lbW9yeTo6aGFuZGxlKCkgeworICAgIHJldHVybiAhbUluaXQgPyBudWxscHRyIDogbUhhbmRsZTsKK30KKworQzJTeW5jVmFyaWFibGVzICpDMlN1cmZhY2VTeW5jTWVtb3J5OjptZW0oKSB7CisgICAgcmV0dXJuICFtSW5pdCA/IG51bGxwdHIgOiBtTWVtOworfQorCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBpbnQga1NwaW5OdW1Gb3JMb2NrID0gMTAwOworICAgIGNvbnN0ZXhwciBpbnQga1NwaW5OdW1Gb3JVbmxvY2sgPSAyMDA7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBGVVRFWF9VTkxPQ0tFRCA9IDAsCisgICAgICAgIEZVVEVYX0xPQ0tFRF9VTkNPTlRFTkRFRCA9IDEsICAvLyB1c2VyLXNwYWNlIGxvY2tpbmcKKyAgICAgICAgRlVURVhfTE9DS0VEX0NPTlRFTkRFRCA9IDIsICAgIC8vIGZ1dGV4IGxvY2tpbmcKKyAgICB9OworfQorCitpbnQgQzJTeW5jVmFyaWFibGVzOjpsb2NrKCkgeworICAgIHVpbnQzMl90IG9sZDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtTcGluTnVtRm9yTG9jazsgaSsrKSB7CisgICAgICAgIG9sZCA9IDA7CisgICAgICAgIGlmIChtTG9jay5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhvbGQsIEZVVEVYX0xPQ0tFRF9VTkNPTlRFTkRFRCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgfQorCisgICAgaWYgKG9sZCA9PSBGVVRFWF9MT0NLRURfVU5DT05URU5ERUQpCisgICAgICAgIG9sZCA9IG1Mb2NrLmV4Y2hhbmdlKEZVVEVYX0xPQ0tFRF9DT05URU5ERUQpOworCisgICAgd2hpbGUgKG9sZCkgeworICAgICAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUxvY2ssIEZVVEVYX1dBSVQsIEZVVEVYX0xPQ0tFRF9DT05URU5ERUQsIE5VTEwsIE5VTEwsIDApOworICAgICAgICBvbGQgPSBtTG9jay5leGNoYW5nZShGVVRFWF9MT0NLRURfQ09OVEVOREVEKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBDMlN5bmNWYXJpYWJsZXM6OnVubG9jaygpIHsKKyAgICBpZiAobUxvY2suZXhjaGFuZ2UoRlVURVhfVU5MT0NLRUQpID09IEZVVEVYX0xPQ0tFRF9VTkNPTlRFTkRFRCkgcmV0dXJuIDA7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtTcGluTnVtRm9yVW5sb2NrOyBpKyspIHsKKyAgICAgICAgaWYgKG1Mb2NrLmxvYWQoKSkgeworICAgICAgICAgICAgdWludDMyX3Qgb2xkID0gRlVURVhfTE9DS0VEX1VOQ09OVEVOREVEOworICAgICAgICAgICAgbUxvY2suY29tcGFyZV9leGNoYW5nZV9zdHJvbmcob2xkLCBGVVRFWF9MT0NLRURfQ09OVEVOREVEKTsKKyAgICAgICAgICAgIGlmIChvbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY2hlZF95aWVsZCgpOworICAgIH0KKworICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtTG9jaywgRlVURVhfV0FLRSwgMSwgTlVMTCwgTlVMTCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQzJTeW5jVmFyaWFibGVzOjpzZXRJbml0aWFsRGVxdWV1ZUNvdW50TG9ja2VkKAorICAgICAgICBpbnQzMl90IG1heERlcXVldWVDb3VudCwgaW50MzJfdCBjdXJEZXF1ZXVlQ291bnQpIHsKKyAgICBtTWF4RGVxdWV1ZUNvdW50ID0gbWF4RGVxdWV1ZUNvdW50OworICAgIG1DdXJEZXF1ZXVlQ291bnQgPSBjdXJEZXF1ZXVlQ291bnQ7Cit9CisKK3VpbnQzMl90IEMyU3luY1ZhcmlhYmxlczo6Z2V0V2FpdElkTG9ja2VkKCkgeworICAgIHJldHVybiBtQ29uZC5sb2FkKCk7Cit9CisKK2Jvb2wgQzJTeW5jVmFyaWFibGVzOjppc0RlcXVldWVhYmxlTG9ja2VkKHVpbnQzMl90ICp3YWl0SWQpIHsKKyAgICBpZiAobU1heERlcXVldWVDb3VudCA8PSBtQ3VyRGVxdWV1ZUNvdW50KSB7CisgICAgICAgIGlmICh3YWl0SWQpIHsKKyAgICAgICAgICAgICp3YWl0SWQgPSBnZXRXYWl0SWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU3luY1ZhcmlhYmxlczo6bm90aWZ5UXVldWVkTG9ja2VkKHVpbnQzMl90ICp3YWl0SWQpIHsKKyAgICAvLyBOb3RlLiB0aHVuZGVyaW5nIGhlcmRzIG1heSBvY2N1ci4gRWRnZSB0cmlnZ2VkIHNpZ25hbGxpbmcuCisgICAgLy8gQnV0IG9uZSB3YWl0ZXIgd2lsbCBndWFyYW50ZWUgdG8gZGVxdWV1ZS4gb3RoZXJzIG1heSB3YWl0IGFnYWluLgorICAgIC8vIE1pbmltaXplIGZ1dGV4IHN5c2NhbGwodHJhcCkgZm9yIHRoZSBtYWluIHVzZSBjYXNlKG9uZSB3YWl0ZXIgY2FzZSkuCisgICAgaWYgKG1NYXhEZXF1ZXVlQ291bnQgPT0gbUN1ckRlcXVldWVDb3VudC0tKSB7CisgICAgICAgIGJyb2FkY2FzdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobUN1ckRlcXVldWVDb3VudCA+PSBtTWF4RGVxdWV1ZUNvdW50KSB7CisgICAgICAgIGlmICh3YWl0SWQpIHsKKyAgICAgICAgICAgICp3YWl0SWQgPSBnZXRXYWl0SWRMb2NrZWQoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZSBibG9ja2VkICVkLyVkIiwgbUN1ckRlcXVldWVDb3VudCwgbU1heERlcXVldWVDb3VudCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQzJTeW5jVmFyaWFibGVzOjpub3RpZnlEZXF1ZXVlZExvY2tlZCgpIHsKKyAgICBtQ3VyRGVxdWV1ZUNvdW50Kys7CisgICAgQUxPR1YoImRlcXVldWUgc3VjY2Vzc2Z1bCAlZC8lZCIsIG1DdXJEZXF1ZXVlQ291bnQsIG1NYXhEZXF1ZXVlQ291bnQpOworfQorCit2b2lkIEMyU3luY1ZhcmlhYmxlczo6c2V0U3luY1N0YXR1c0xvY2tlZChTeW5jU3RhdHVzIHN0YXR1cykgeworICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICBicm9hZGNhc3QoKTsKKyAgICB9Cit9CisKK0MyU3luY1ZhcmlhYmxlczo6U3luY1N0YXR1cyBDMlN5bmNWYXJpYWJsZXM6OmdldFN5bmNTdGF0dXNMb2NrZWQoKSB7CisgICAgcmV0dXJuIG1TdGF0dXM7Cit9CisKK3ZvaWQgQzJTeW5jVmFyaWFibGVzOjp1cGRhdGVNYXhEZXF1ZXVlQ291bnRMb2NrZWQoaW50MzJfdCBtYXhEZXF1ZXVlQ291bnQpIHsKKyAgICBtTWF4RGVxdWV1ZUNvdW50ID0gbWF4RGVxdWV1ZUNvdW50OworICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgYnJvYWRjYXN0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlN5bmNWYXJpYWJsZXM6OndhaXRGb3JDaGFuZ2UodWludDMyX3Qgd2FpdElkLCBjMl9uc2Vjc190IHRpbWVvdXROcykgeworICAgIGlmICh0aW1lb3V0TnMgPCAwKSB7CisgICAgICAgIHRpbWVvdXROcyA9IDA7CisgICAgfQorICAgIHN0cnVjdCB0aW1lc3BlYyB0djsKKyAgICB0di50dl9zZWMgPSB0aW1lb3V0TnMgLyAxMDAwMDAwMDAwOworICAgIHR2LnR2X25zZWMgPSB0aW1lb3V0TnMgJSAxMDAwMDAwMDAwOworCisgICAgaW50IHJldCA9ICBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtQ29uZCwgRlVURVhfV0FJVCwgd2FpdElkLCAmdHYsIE5VTEwsIDApOworICAgIGlmIChyZXQgPT0gMCB8fCByZXQgPT0gRUFHQUlOKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKHJldCA9PSBFSU5UUiB8fCByZXQgPT0gRVRJTUVET1VUKSB7CisgICAgICAgIHJldHVybiBDMl9USU1FRF9PVVQ7CisgICAgfQorICAgIHJldHVybiBDMl9CQURfVkFMVUU7Cit9CisKK2ludCBDMlN5bmNWYXJpYWJsZXM6OnNpZ25hbCgpIHsKKyAgICBtQ29uZCsrOworCisgICAgKHZvaWQpIHN5c2NhbGwoX19OUl9mdXRleCwgJm1Db25kLCBGVVRFWF9XQUtFLCAxLCBOVUxMLCBOVUxMLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEMyU3luY1ZhcmlhYmxlczo6YnJvYWRjYXN0KCkgeworICAgIG1Db25kKys7CisKKyAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUNvbmQsIEZVVEVYX1JFUVVFVUUsIDEsICh2b2lkICopSU5UX01BWCwgJm1Mb2NrLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEMyU3luY1ZhcmlhYmxlczo6d2FpdCgpIHsKKyAgICB1aW50MzJfdCBvbGQgPSBtQ29uZC5sb2FkKCk7CisgICAgdW5sb2NrKCk7CisKKyAgICAodm9pZCkgc3lzY2FsbChfX05SX2Z1dGV4LCAmbUNvbmQsIEZVVEVYX1dBSVQsIG9sZCwgTlVMTCwgTlVMTCwgMCk7CisgICAgd2hpbGUgKG1Mb2NrLmV4Y2hhbmdlKEZVVEVYX0xPQ0tFRF9DT05URU5ERUQpKSB7CisgICAgICAgICh2b2lkKSBzeXNjYWxsKF9fTlJfZnV0ZXgsICZtTG9jaywgRlVURVhfV0FJVCwgRlVURVhfTE9DS0VEX0NPTlRFTkRFRCwgTlVMTCwgTlVMTCwgMCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcAppbmRleCA5ZWI1MmQyLi4xOWQyMjk1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApAQCAtNjQ1LDYgKzY0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGxhdGVSZWFkUGFyYW1zLmVtcGxhY2VfYmFjayhwKTsKICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHJlcXVlc3QoQzJQYXJhbTo6Q29weUFzUmVxdWVzdCgqcCkpOwogICAgICAgICAgICAgICAgICAgICBwID0gcmVxdWVzdC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1JeCA9IHAtPmluZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtUmVxdWVzdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKaW5kZXggMGMxNzI5Yi4uYjViYzY5MSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlVXRpbHMuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UKIAorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CiAjaW5jbHVkZSA8QzJEZWJ1Zy5oPgogI2luY2x1ZGUgPEMyUGFyYW0uaD4KICNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgpAQCAtMTMwNCwzICsxMzA2LDgxIEBACiAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKIH0KIAorLy9zdGF0aWMKK2Jvb2wgQzJJbnRlcmZhY2VVdGlsczo6RmlsbFRyYWl0c0Zyb21JbnRlcmZhY2UoCisgICAgICAgIEMyQ29tcG9uZW50OjpUcmFpdHMgKnRyYWl0cywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50ZikgeworICAgIGlmICghdHJhaXRzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdHJhaXRzLT5uYW1lID0gaW50Zi0+Z2V0TmFtZSgpOworCisgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW47CisgICAgYzJfc3RhdHVzX3QgcmVzID0gaW50Zi0+cXVlcnlfdmIoeyAma2luZCwgJmRvbWFpbiB9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICBib29sIGZpeERvbWFpbiA9IHJlcyAhPSBDMl9PSzsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIHRyYWl0cy0+a2luZCA9IGtpbmQudmFsdWU7CisgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gZG9tYWluLnZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZhbGwtYmFjaworICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlIGZvciBraW5kIGFuZCBkb21haW46ICIgPDwgcmVzOworCisgICAgICAgIHRyYWl0cy0+a2luZCA9CisgICAgICAgICAgICAodHJhaXRzLT5uYW1lLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgPyBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSIDoKKyAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgOgorICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgfQorCisgICAgdWludDMyX3QgbWVkaWFUeXBlSW5kZXggPSB0cmFpdHMtPmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUgorICAgICAgICAgICAgPyBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgIDogQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgbWVkaWFUeXBlSW5kZXggfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEMyX0xPRyhERUJVRykgPDwgImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6ICIgPDwgcmVzOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEMyX0xPRyhERUJVRykgPDwgImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6IHVuZXhwZWN0ZWQgdmVjdG9yIHNpemU6ICIgPDwgcGFyYW1zLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nICptZWRpYVR5cGVDb25maWcgPSBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgaWYgKG1lZGlhVHlwZUNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgIEMyX0xPRyhERUJVRykgPDwgImZhaWxlZCB0byBxdWVyeSBtZWRpYSB0eXBlIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB0cmFpdHMtPm1lZGlhVHlwZSA9CisgICAgICAgIHN0ZDo6c3RyaW5nKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3RybmxlbihtZWRpYVR5cGVDb25maWctPm0udmFsdWUsIG1lZGlhVHlwZUNvbmZpZy0+ZmxleENvdW50KCkpKTsKKworICAgIGlmIChmaXhEb21haW4pIHsKKyAgICAgICAgaWYgKHN0cm5jbXAodHJhaXRzLT5tZWRpYVR5cGUuY19zdHIoKSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiaW1hZ2UvIiwgNikgPT0gMCkgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICB9CisgICAgfQorCisgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6UEFSQU1fVFlQRSB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgIGlmIChyZXMgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nICphbGlhc2VzU2V0dGluZyA9CisgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIGlmIChhbGlhc2VzU2V0dGluZykgeworICAgICAgICAgICAgc3RkOjppc3RyaW5nc3RyZWFtIGlzcygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoYWxpYXNlc1NldHRpbmctPm0udmFsdWUsIGFsaWFzZXNTZXR0aW5nLT5mbGV4Q291bnQoKSkpOworICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCBpbnRmLT5nZXROYW1lKCkgPDwgIiBoYXMgYWxpYXNlczogIiA8PCBpc3Muc3RyKCk7CisKKyAgICAgICAgICAgIGZvciAoc3RkOjpzdHJpbmcgdG9rOyBzdGQ6OmdldGxpbmUoaXNzLCB0b2ssICcsJyk7ICkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+YWxpYXNlcy5wdXNoX2JhY2sodG9rKTsKKyAgICAgICAgICAgICAgICBDMl9MT0coREVCVUcpIDw8ICJhZGRpbmcgYWxpYXM6ICIgPDwgdG9rOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL1RFU1RfTUFQUElORyBiL21lZGlhL2NvZGVjcy9hbXJuYi9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzZDA4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMCBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iCit7CisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiQW1ybmJEZWNvZGVyVGVzdCJ9LAorICAgIHsgIm5hbWUiOiAiQW1ybmJFbmNvZGVyVGVzdCJ9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWU2NWYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2NvbW1vbl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfY29tbW9uX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2FkZC5jcHAiLAorICAgICAgICAic3JjL2F6X2xzcC5jcHAiLAorICAgICAgICAic3JjL2JpdG5vX3RhYi5jcHAiLAorICAgICAgICAic3JjL2JpdHJlb3JkZXJfdGFiLmNwcCIsCisgICAgICAgICJzcmMvYml0czJwcm0uY3BwIiwKKyAgICAgICAgInNyYy9jMl85cGZfdGFiLmNwcCIsCisgICAgICAgICJzcmMvY29weS5jcHAiLAorICAgICAgICAic3JjL2Rpdl8zMi5jcHAiLAorICAgICAgICAic3JjL2Rpdl9zLmNwcCIsCisgICAgICAgICJzcmMvZXh0cmFjdF9oLmNwcCIsCisgICAgICAgICJzcmMvZXh0cmFjdF9sLmNwcCIsCisgICAgICAgICJzcmMvZ2FpbnNfdGJsLmNwcCIsCisgICAgICAgICJzcmMvZ2NfcHJlZC5jcHAiLAorICAgICAgICAic3JjL2dtZWRfbi5jcHAiLAorICAgICAgICAic3JjL2dyaWRfdGJsLmNwcCIsCisgICAgICAgICJzcmMvZ3JheV90YmwuY3BwIiwKKyAgICAgICAgInNyYy9pbnRfbHBjLmNwcCIsCisgICAgICAgICJzcmMvaW52X3NxcnQuY3BwIiwKKyAgICAgICAgInNyYy9pbnZfc3FydF90YmwuY3BwIiwKKyAgICAgICAgInNyYy9sX2Ficy5jcHAiLAorICAgICAgICAic3JjL2xfZGVwb3NpdF9oLmNwcCIsCisgICAgICAgICJzcmMvbF9kZXBvc2l0X2wuY3BwIiwKKyAgICAgICAgInNyYy9sX3Nocl9yLmNwcCIsCisgICAgICAgICJzcmMvbG9nMi5jcHAiLAorICAgICAgICAic3JjL2xvZzJfbm9ybS5jcHAiLAorICAgICAgICAic3JjL2xvZzJfdGJsLmNwcCIsCisgICAgICAgICJzcmMvbHNmd3QuY3BwIiwKKyAgICAgICAgInNyYy9sc3AuY3BwIiwKKyAgICAgICAgInNyYy9sc3BfYXouY3BwIiwKKyAgICAgICAgInNyYy9sc3BfbHNmLmNwcCIsCisgICAgICAgICJzcmMvbHNwX2xzZl90YmwuY3BwIiwKKyAgICAgICAgInNyYy9sc3BfdGFiLmNwcCIsCisgICAgICAgICJzcmMvbXVsdF9yLmNwcCIsCisgICAgICAgICJzcmMvbm9ybV9sLmNwcCIsCisgICAgICAgICJzcmMvbm9ybV9zLmNwcCIsCisgICAgICAgICJzcmMvcGhfZGlzcF90YWIuY3BwIiwKKyAgICAgICAgInNyYy9wb3cyLmNwcCIsCisgICAgICAgICJzcmMvcG93Ml90YmwuY3BwIiwKKyAgICAgICAgInNyYy9wcmVkX2x0LmNwcCIsCisgICAgICAgICJzcmMvcV9wbHNmLmNwcCIsCisgICAgICAgICJzcmMvcV9wbHNmXzMuY3BwIiwKKyAgICAgICAgInNyYy9xX3Bsc2ZfM190YmwuY3BwIiwKKyAgICAgICAgInNyYy9xX3Bsc2ZfNS5jcHAiLAorICAgICAgICAic3JjL3FfcGxzZl81X3RibC5jcHAiLAorICAgICAgICAic3JjL3F1YV9nYWluX3RibC5jcHAiLAorICAgICAgICAic3JjL3Jlb3JkZXIuY3BwIiwKKyAgICAgICAgInNyYy9yZXNpZHUuY3BwIiwKKyAgICAgICAgInNyYy9yb3VuZC5jcHAiLAorICAgICAgICAic3JjL3NldF96ZXJvLmNwcCIsCisgICAgICAgICJzcmMvc2hyLmNwcCIsCisgICAgICAgICJzcmMvc2hyX3IuY3BwIiwKKyAgICAgICAgInNyYy9zcXJ0X2wuY3BwIiwKKyAgICAgICAgInNyYy9zcXJ0X2xfdGJsLmNwcCIsCisgICAgICAgICJzcmMvc3ViLmNwcCIsCisgICAgICAgICJzcmMvc3luX2ZpbHQuY3BwIiwKKyAgICAgICAgInNyYy92YWQxLmNwcCIsCisgICAgICAgICJzcmMvd2VpZ2h0X2EuY3BwIiwKKyAgICAgICAgInNyYy93aW5kb3dfdGFiLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAorICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1ET1NDTF9FWFBPUlRfUkVGPSIsCisKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKKyAgICAvL3Nhbml0aXplOiB7CisgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAvLyAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWJzX3MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hYnNfcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWJzX3MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Fic19zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hZGQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hZGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2FkZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYWRkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hel9sc3AuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9hel9sc3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2F6X2xzcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYXpfbHNwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV9nY2NfdjUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fZ2NjX3Y1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fZ2NjX3Y1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fZ2NjX3Y1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fdjUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9hcm1fdjUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2FybV92NS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfYXJtX3Y1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY19vcF9jX2VxdWl2YWxlbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljX29wX2NfZXF1aXZhbGVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNfb3BfY19lcXVpdmFsZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY29wX21hbGxvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Jhc2ljb3BfbWFsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iYXNpY29wX21hbGxvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYmFzaWNvcF9tYWxsb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdG5vX3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdG5vX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0bm9fdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRub190YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHJlb3JkZXJfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0cmVvcmRlcl90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHJlb3JkZXJfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRyZW9yZGVyX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0czJwcm0uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9iaXRzMnBybS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvYml0czJwcm0uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2JpdHMycHJtLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdF92YWQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jbnN0X3ZhZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY25zdF92YWQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Nuc3RfdmFkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9jb3B5LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY29weS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY29weS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvY29weS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfZ2Fpbl9wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX2dhaW5fcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9nYWluX3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfcGxzZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2RfcGxzZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZF9wbHNmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kX3Bsc2YuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl8zMi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl8zMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2XzMyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfMzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl9zLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZGl2X3MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2Rpdl9zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kaXZfcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZHR4X2NvbW1vbl9kZWYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9kdHhfY29tbW9uX2RlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZHR4X2NvbW1vbl9kZWYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2R0eF9jb21tb25fZGVmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9oLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2wuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9leHRyYWN0X2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2V4dHJhY3RfbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZXh0cmFjdF9sLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ZyYW1lX3R5cGVfM2dwcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZnJhbWVfdHlwZV8zZ3BwLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9mcmFtZV90eXBlXzNncHAuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2djX3ByZWQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nY19wcmVkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nY19wcmVkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nY19wcmVkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nbWVkX24uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nbWVkX24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2dtZWRfbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ21lZF9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9nc21fYW1yX3R5cGVkZWZzLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ3NtX2Ftcl90eXBlZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ3NtX2Ftcl90eXBlZGVmcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvZ3NtX2Ftcl90eXBlZGVmcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW50X2xwYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9scGMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9scGMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9scGMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludF9sc2YuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHNmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHNmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnRfbHNmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnZfc3FydC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2ludl9zcXJ0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9pbnZfc3FydC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvaW52X3NxcnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWJzLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hYnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWJzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2Ficy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfYWRkLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2FkZF9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGRfYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGRfYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9hZGRfYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9jb21wLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9jb21wLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2NvbXAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfY29tcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9oLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfbC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZGVwb3NpdF9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2RlcG9zaXRfbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9kZXBvc2l0X2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZXh0cmFjdC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfZXh0cmFjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9leHRyYWN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX2V4dHJhY3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbWFjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tYWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbWFjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21hYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tc3UuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX21zdS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tc3UuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXN1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX211bHQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX211bHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbXVsdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9tdWx0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX25lZ2F0ZS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfbmVnYXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX25lZ2F0ZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9uZWdhdGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3NobC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Noci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc2hyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3Nocl9yLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHJfci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHJfci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zaHJfci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zdWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sX3N1Yi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbF9zdWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xfc3ViLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMl9ub3JtLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbG9nMl9ub3JtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sb2cyX25vcm0uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xvZzJfbm9ybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNmd3QuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc2Z3dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNmd3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzZnd0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3AuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfYXouaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfYXouaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF9hei5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2F6LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9sc3BfbHNmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2xzZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2xzZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX2xzZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbHNwX3RhYi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF90YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL2xzcF90YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21hY18zMi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21hY18zMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbWFjXzMyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tYWNfMzIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21vZGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzJfMTYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tcHlfMzJfMTYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL21weV8zMl8xNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXB5XzMyXzE2LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdF9yLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbXVsdF9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9tdWx0X3IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL211bHRfci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbl9wcm9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbl9wcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uX3Byb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25fcHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbmVnYXRlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbmVnYXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9uZWdhdGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25lZ2F0ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9sLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9zLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvbm9ybV9zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9ub3JtX3MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL25vcm1fcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvb3Blcl8zMmIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9vcGVyXzMyYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvb3Blcl8zMmIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL29wZXJfMzJiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wX29sX3dnaC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Bfb2xfd2doLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wX29sX3dnaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcF9vbF93Z2guaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3BvdzIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wb3cyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wb3cyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wb3cyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9wcmVkX2x0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcHJlZF9sdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcHJlZF9sdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcHJlZF9sdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2YuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzNfdGJsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzNfdGJsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfM190YmwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl8zX3RibC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzVfdGJsLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcV9wbHNmXzVfdGJsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xX3Bsc2ZfNV90YmwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FfcGxzZl81X3RibC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcWdhaW40NzVfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcWdhaW40NzVfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xZ2FpbjQ3NV90YWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3FnYWluNDc1X3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW4uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbl90YmwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9xdWFfZ2Fpbl90YmwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3F1YV9nYWluX3RibC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcXVhX2dhaW5fdGJsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZW9yZGVyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVvcmRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVvcmRlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVvcmRlci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVzaWR1LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmVzaWR1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXNpZHUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Jlc2lkdS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmV2ZXJzZV9iaXRzLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcmV2ZXJzZV9iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yZXZlcnNlX2JpdHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JldmVyc2VfYml0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcm91bmQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9yb3VuZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvcm91bmQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3JvdW5kLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zZXRfemVyby5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NldF96ZXJvLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zZXRfemVyby5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2V0X3plcm8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NobC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NobC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaGwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Noci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Noci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Nocl9yLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc2hyX3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3Nocl9yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zaHJfci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3FydF9sLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3FydF9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zcXJ0X2wuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3NxcnRfbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3ViLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3ViLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zdWIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N1Yi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3luX2ZpbHQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS9zeW5fZmlsdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvc3luX2ZpbHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3N5bl9maWx0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS90eXBlZGVmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdHlwZWRlZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdHlwZWRlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdHlwZWRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvdmFkMS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDEuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDEuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3ZhZDIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS92YWQyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93ZWlnaHRfYS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dlaWdodF9hLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93ZWlnaHRfYS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd2VpZ2h0X2EuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9pbmNsdWRlL3dpbmRvd190YWIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93aW5kb3dfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93aW5kb3dfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93aW5kb3dfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vaW5jbHVkZS93bWZfdG9fZXRzLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd21mX3RvX2V0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd21mX3RvX2V0cy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL2luY2x1ZGUvd21mX3RvX2V0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9hZGQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYWRkLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYWRkLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYWRkLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYXpfbHNwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2F6X2xzcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdG5vX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRub190YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRub190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRub190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRyZW9yZGVyX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRyZW9yZGVyX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHJlb3JkZXJfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0cmVvcmRlcl90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRzMnBybS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9iaXRzMnBybS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2JpdHMycHJtLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYml0czJwcm0uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jMl85cGZfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2MyXzlwZl90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jMl85cGZfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvYzJfOXBmX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2NvcHkuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvY29weS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2NvcHkuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9jb3B5LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2XzMyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl8zMi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl8zMi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl8zMi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2Rpdl9zLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZGl2X3MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9kaXZfcy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2V4dHJhY3RfaC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9leHRyYWN0X2wuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9sLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZXh0cmFjdF9sLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2FpbnNfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dhaW5zX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dhaW5zX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dhaW5zX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ2NfcHJlZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2djX3ByZWQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9nY19wcmVkLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ21lZF9uLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dtZWRfbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyYXlfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyYXlfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JheV90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmF5X3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyaWRfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2dyaWRfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvZ3JpZF90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ncmlkX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludF9scGMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW50X2xwYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludF9scGMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnRfbHBjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9pbnZfc3FydC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvaW52X3NxcnRfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0X3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0X3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2ludl9zcXJ0X3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9oLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9oLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9sLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfZGVwb3NpdF9sLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9kZXBvc2l0X2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2RlcG9zaXRfbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9zaHJfci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX3Nocl9yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX25vcm0uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl9ub3JtLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl9ub3JtLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl9ub3JtLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbG9nMl90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sb2cyX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xvZzJfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNmd3QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNmd3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc2Z3dC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzZnd0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9hei5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfYXouY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2YuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2ZfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF9sc2ZfdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX2xzZl90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfbHNmX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcF90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3BfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbXVsdF9yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL211bHRfci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9ub3JtX2wuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9sLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbm9ybV9zLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25vcm1fcy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BoX2Rpc3BfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BoX2Rpc3BfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcGhfZGlzcF90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9waF9kaXNwX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Mi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Ml90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcG93Ml90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wb3cyX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3BvdzJfdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9wcmVkX2x0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcHJlZF9sdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ByZWRfbHQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2YuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfMy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzNfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zX3RibC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zX3RibC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl8zX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcV9wbHNmXzUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3FfcGxzZl81X3RibC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNV90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNV90YmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xX3Bsc2ZfNV90YmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9xdWFfZ2Fpbl90YmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcXVhX2dhaW5fdGJsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcXVhX2dhaW5fdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcXVhX2dhaW5fdGJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVvcmRlci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZW9yZGVyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVvcmRlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Jlb3JkZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yZXNpZHUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcmVzaWR1LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2V0X3plcm8uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2V0X3plcm8uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zZXRfemVyby5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NldF96ZXJvLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Noci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2wuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2wuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2xfdGJsLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3NxcnRfbF90YmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zcXJ0X2xfdGJsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3FydF9sX3RibC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N1Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zdWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zdWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zdWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zeW5fZmlsdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zeW5fZmlsdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3N5bl9maWx0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc3luX2ZpbHQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy92YWQxLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3ZhZDEuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy92YWQxLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvdmFkMS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dlaWdodF9hLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2VpZ2h0X2EuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93ZWlnaHRfYS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dpbmRvd190YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvd2luZG93X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3dpbmRvd190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy93aW5kb3dfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODNiODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzggQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UgdGhhdCB0b29rIHRoZSBhcHByb2FjaCBvZgorLy8gJ2FwcGx5IGV2ZXJ5IGxpY2Vuc2UgZm91bmQgdG8gZXZlcnkgdGFyZ2V0Jy4gV2hpbGUgdGhpcyBtYWtlcyBzdXJlIHdlIHJlc3BlY3QKKy8vIGV2ZXJ5IGxpY2Vuc2UgcmVzdHJpY3Rpb24sIGl0IG1heSBub3QgYmUgZW50aXJlbHkgY29ycmVjdC4KKy8vCisvLyBlLmcuIEdQTCBpbiBhbiBNSVQgcHJvamVjdCBtaWdodCBvbmx5IGFwcGx5IHRvIHRoZSBjb250cmliLyBkaXJlY3RvcnkuCisvLworLy8gUGxlYXNlIGNvbnNpZGVyIHNwbGl0dGluZyB0aGUgc2luZ2xlIGxpY2Vuc2UgYmVsb3cgaW50byBtdWx0aXBsZSBsaWNlbnNlcywKKy8vIHRha2luZyBjYXJlIG5vdCB0byBsb3NlIGFueSBsaWNlbnNlX2tpbmQgaW5mb3JtYXRpb24sIGFuZCBvdmVycmlkaW5nIHRoZQorLy8gZGVmYXVsdCBsaWNlbnNlIHVzaW5nIHRoZSAnbGljZW5zZXM6IFsuLi5dJyBwcm9wZXJ0eSBvbiB0YXJnZXRzIGFzIG5lZWRlZC4KKy8vCisvLyBGb3IgdW51c2VkIGZpbGVzLCBjb25zaWRlciBjcmVhdGluZyBhICdmaWxlR3JvdXAnIHdpdGggIi8vdmlzaWJpbGl0eTpwcml2YXRlIgorLy8gdG8gYXR0YWNoIHRoZSBsaWNlbnNlIHRvLCBhbmQgaW5jbHVkaW5nIGEgY29tbWVudCB3aGV0aGVyIHRoZSBmaWxlcyBtYXkgYmUKKy8vIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2FfcmVmbC5jcHAiLAorICAgICAgICAic3JjL2FnYy5jcHAiLAorICAgICAgICAic3JjL2FtcmRlY29kZS5jcHAiLAorICAgICAgICAic3JjL2JfY25fY29kLmNwcCIsCisgICAgICAgICJzcmMvYmduc2NkLmNwcCIsCisgICAgICAgICJzcmMvY19nX2F2ZXIuY3BwIiwKKyAgICAgICAgInNyYy9kMTAzNXBmLmNwcCIsCisgICAgICAgICJzcmMvZDJfMTFwZi5jcHAiLAorICAgICAgICAic3JjL2QyXzlwZi5jcHAiLAorICAgICAgICAic3JjL2QzXzE0cGYuY3BwIiwKKyAgICAgICAgInNyYy9kNF8xN3BmLmNwcCIsCisgICAgICAgICJzcmMvZDhfMzFwZi5jcHAiLAorICAgICAgICAic3JjL2RfZ2Fpbl9jLmNwcCIsCisgICAgICAgICJzcmMvZF9nYWluX3AuY3BwIiwKKyAgICAgICAgInNyYy9kX3Bsc2YuY3BwIiwKKyAgICAgICAgInNyYy9kX3Bsc2ZfMy5jcHAiLAorICAgICAgICAic3JjL2RfcGxzZl81LmNwcCIsCisgICAgICAgICJzcmMvZGVjX2Ftci5jcHAiLAorICAgICAgICAic3JjL2RlY19nYWluLmNwcCIsCisgICAgICAgICJzcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwIiwKKyAgICAgICAgInNyYy9kZWNfbGFnMy5jcHAiLAorICAgICAgICAic3JjL2RlY19sYWc2LmNwcCIsCisgICAgICAgICJzcmMvZHR4X2RlYy5jcHAiLAorICAgICAgICAic3JjL2VjX2dhaW5zLmNwcCIsCisgICAgICAgICJzcmMvZXhfY3RybC5jcHAiLAorICAgICAgICAic3JjL2lmMl90b19ldHMuY3BwIiwKKyAgICAgICAgInNyYy9pbnRfbHNmLmNwcCIsCisgICAgICAgICJzcmMvbHNwX2F2Zy5jcHAiLAorICAgICAgICAic3JjL3BoX2Rpc3AuY3BwIiwKKyAgICAgICAgInNyYy9wb3N0X3Byby5jcHAiLAorICAgICAgICAic3JjL3ByZWVtcGguY3BwIiwKKyAgICAgICAgInNyYy9wc3RmaWx0LmNwcCIsCisgICAgICAgICJzcmMvcWdhaW40NzVfdGFiLmNwcCIsCisgICAgICAgICJzcmMvc3BfZGVjLmNwcCIsCisgICAgICAgICJzcmMvd21mX3RvX2V0cy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAorICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKworICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlY190ZXN0IiwKKyAgICBndGVzdDogZmFsc2UsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbInRlc3QvYW1ybmJkZWNfdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgLy9zYW5pdGl6ZTogeworICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgLy8gICAgXSwKKyAgICAvL30sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL05PVElDRSBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FfcmVmbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hX3JlZmwuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYV9yZWZsLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FnYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hZ2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYWdjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2FtcmRlY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9hbXJkZWNvZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYW1yZGVjb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYl9jbl9jb2QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JfY25fY29kLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iX2NuX2NvZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9iZ25zY2QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvYmduc2NkLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2JnbnNjZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2NfZ19hdmVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9jX2dfYXZlci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvY19nX2F2ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMTAzNXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QxMDM1cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDEwMzVwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzExcGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfMTFwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl8xMXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QyXzlwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kMl85cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDJfOXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDNfMTRwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kM18xNHBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2QzXzE0cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kNF8xN3BmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q0XzE3cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDRfMTdwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2Q4XzMxcGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZDhfMzFwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kOF8zMXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfZ2Fpbl9wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9nYWluX3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX2dhaW5fcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2YuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2YuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2YuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfMy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfMy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl8zLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kX3Bsc2ZfNS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RfcGxzZl81LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZF9wbHNmXzUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19hbXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2Ftci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfYW1yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2dhaW4uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19nYWluLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfZ2Fpbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfaW5wdXRfZm9ybWF0X3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfaW5wdXRfZm9ybWF0X3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19pbnB1dF9mb3JtYXRfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWczLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnMy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kZWNfbGFnNi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZGVjX2xhZzYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2RlY19sYWc2LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZHR4X2RlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9kdHhfZGVjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2R0eF9kZWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9lY19nYWlucy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZWNfZ2FpbnMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2VjX2dhaW5zLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZXhfY3RybC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9leF9jdHJsLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2V4X2N0cmwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvZ3NtYW1yX2RlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9nc21hbXJfZGVjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2dzbWFtcl9kZWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pZjJfdG9fZXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2lmMl90b19ldHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaWYyX3RvX2V0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2ludF9sc2YuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9pbnRfbHNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvaW50X2xzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvbHNwX2F2Zy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9sc3BfYXZnLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL2xzcF9hdmcuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9waF9kaXNwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BoX2Rpc3AuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcGhfZGlzcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3Bvc3RfcHJvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wb3N0X3Byby5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcG9zdF9wcm8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wcmVlbXBoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3ByZWVtcGguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHJlZW1waC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3BzdGZpbHQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvcHN0ZmlsdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9wc3RmaWx0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3FnYWluNDc1X3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9xZ2FpbjQ3NV90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9xZ2FpbjQ3NV90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9xZ2FpbjQ3NV90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy93bWZfdG9fZXRzLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvc3JjL3dtZl90b19ldHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy93bWZfdG9fZXRzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy9zcmMvd21mX3RvX2V0cy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY1Rlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI1OGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9kZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1ybmJEZWNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJuYkRlY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWU2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBBbXItbmIgRGVjb2RlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkFtcm5iRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFtcm5iRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA3M2U0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQU1SLU5CIERlY29kZXIgOgorVGhlIEFtci1OYiBEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJuYiBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQW1ybmJEZWNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJuYkRlY29kZXJUZXN0L0Ftcm5iRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggQW1ybmJEZWNvZGVyVGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogQW1ybmJEZWNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBbXJuYkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTQ3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDUgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UgdGhhdCB0b29rIHRoZSBhcHByb2FjaCBvZgorLy8gJ2FwcGx5IGV2ZXJ5IGxpY2Vuc2UgZm91bmQgdG8gZXZlcnkgdGFyZ2V0Jy4gV2hpbGUgdGhpcyBtYWtlcyBzdXJlIHdlIHJlc3BlY3QKKy8vIGV2ZXJ5IGxpY2Vuc2UgcmVzdHJpY3Rpb24sIGl0IG1heSBub3QgYmUgZW50aXJlbHkgY29ycmVjdC4KKy8vCisvLyBlLmcuIEdQTCBpbiBhbiBNSVQgcHJvamVjdCBtaWdodCBvbmx5IGFwcGx5IHRvIHRoZSBjb250cmliLyBkaXJlY3RvcnkuCisvLworLy8gUGxlYXNlIGNvbnNpZGVyIHNwbGl0dGluZyB0aGUgc2luZ2xlIGxpY2Vuc2UgYmVsb3cgaW50byBtdWx0aXBsZSBsaWNlbnNlcywKKy8vIHRha2luZyBjYXJlIG5vdCB0byBsb3NlIGFueSBsaWNlbnNlX2tpbmQgaW5mb3JtYXRpb24sIGFuZCBvdmVycmlkaW5nIHRoZQorLy8gZGVmYXVsdCBsaWNlbnNlIHVzaW5nIHRoZSAnbGljZW5zZXM6IFsuLi5dJyBwcm9wZXJ0eSBvbiB0YXJnZXRzIGFzIG5lZWRlZC4KKy8vCisvLyBGb3IgdW51c2VkIGZpbGVzLCBjb25zaWRlciBjcmVhdGluZyBhICdmaWxlR3JvdXAnIHdpdGggIi8vdmlzaWJpbGl0eTpwcml2YXRlIgorLy8gdG8gYXR0YWNoIHRoZSBsaWNlbnNlIHRvLCBhbmQgaW5jbHVkaW5nIGEgY29tbWVudCB3aGV0aGVyIHRoZSBmaWxlcyBtYXkgYmUKKy8vIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9lbmNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgc3JjczogWworICAgICAgICAic3JjL2FtcmVuY29kZS5jcHAiLAorICAgICAgICAic3JjL2F1dG9jb3JyLmNwcCIsCisgICAgICAgICJzcmMvYzEwMzVwZi5jcHAiLAorICAgICAgICAic3JjL2MyXzExcGYuY3BwIiwKKyAgICAgICAgInNyYy9jMl85cGYuY3BwIiwKKyAgICAgICAgInNyYy9jM18xNHBmLmNwcCIsCisgICAgICAgICJzcmMvYzRfMTdwZi5jcHAiLAorICAgICAgICAic3JjL2M4XzMxcGYuY3BwIiwKKyAgICAgICAgInNyYy9jYWxjX2Nvci5jcHAiLAorICAgICAgICAic3JjL2NhbGNfZW4uY3BwIiwKKyAgICAgICAgInNyYy9jYnNlYXJjaC5jcHAiLAorICAgICAgICAic3JjL2NsX2x0cC5jcHAiLAorICAgICAgICAic3JjL2NvZF9hbXIuY3BwIiwKKyAgICAgICAgInNyYy9jb252b2x2ZS5jcHAiLAorICAgICAgICAic3JjL2Nvcl9oLmNwcCIsCisgICAgICAgICJzcmMvY29yX2hfeC5jcHAiLAorICAgICAgICAic3JjL2Nvcl9oX3gyLmNwcCIsCisgICAgICAgICJzcmMvY29ycndnaHRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvZHR4X2VuYy5jcHAiLAorICAgICAgICAic3JjL2VuY19sYWczLmNwcCIsCisgICAgICAgICJzcmMvZW5jX2xhZzYuY3BwIiwKKyAgICAgICAgInNyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwIiwKKyAgICAgICAgInNyYy9ldHNfdG9faWYyLmNwcCIsCisgICAgICAgICJzcmMvZXRzX3RvX3dtZi5jcHAiLAorICAgICAgICAic3JjL2dfYWRhcHQuY3BwIiwKKyAgICAgICAgInNyYy9nX2NvZGUuY3BwIiwKKyAgICAgICAgInNyYy9nX3BpdGNoLmNwcCIsCisgICAgICAgICJzcmMvZ2Fpbl9xLmNwcCIsCisgICAgICAgICJzcmMvaHBfbWF4LmNwcCIsCisgICAgICAgICJzcmMvaW50ZXJfMzYuY3BwIiwKKyAgICAgICAgInNyYy9pbnRlcl8zNl90YWIuY3BwIiwKKyAgICAgICAgInNyYy9sX2NvbXAuY3BwIiwKKyAgICAgICAgInNyYy9sX2V4dHJhY3QuY3BwIiwKKyAgICAgICAgInNyYy9sX25lZ2F0ZS5jcHAiLAorICAgICAgICAic3JjL2xhZ193aW5kLmNwcCIsCisgICAgICAgICJzcmMvbGFnX3dpbmRfdGFiLmNwcCIsCisgICAgICAgICJzcmMvbGV2aW5zb24uY3BwIiwKKyAgICAgICAgInNyYy9scGMuY3BwIiwKKyAgICAgICAgInNyYy9vbF9sdHAuY3BwIiwKKyAgICAgICAgInNyYy9wX29sX3dnaC5jcHAiLAorICAgICAgICAic3JjL3BpdGNoX2ZyLmNwcCIsCisgICAgICAgICJzcmMvcGl0Y2hfb2wuY3BwIiwKKyAgICAgICAgInNyYy9wcmVfYmlnLmNwcCIsCisgICAgICAgICJzcmMvcHJlX3Byb2MuY3BwIiwKKyAgICAgICAgInNyYy9wcm0yYml0cy5jcHAiLAorICAgICAgICAic3JjL3FfZ2Fpbl9jLmNwcCIsCisgICAgICAgICJzcmMvcV9nYWluX3AuY3BwIiwKKyAgICAgICAgInNyYy9xZ2FpbjQ3NS5jcHAiLAorICAgICAgICAic3JjL3FnYWluNzk1LmNwcCIsCisgICAgICAgICJzcmMvcXVhX2dhaW4uY3BwIiwKKyAgICAgICAgInNyYy9zMTBfOHBmLmNwcCIsCisgICAgICAgICJzcmMvc2V0X3NpZ24uY3BwIiwKKyAgICAgICAgInNyYy9zaWRfc3luYy5jcHAiLAorICAgICAgICAic3JjL3NwX2VuYy5jcHAiLAorICAgICAgICAic3JjL3NwcmVwcm9jLmNwcCIsCisgICAgICAgICJzcmMvc3BzdHByb2MuY3BwIiwKKyAgICAgICAgInNyYy90b25fc3RhYi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAorICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jX3Rlc3QiLAorICAgIGd0ZXN0OiBmYWxzZSwKKworICAgIHNyY3M6IFsidGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCisKKyAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAorICAgIC8vc2FuaXRpemU6IHsKKyAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWworICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgIC8vICAgIF0sCisgICAgLy99LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA0MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2VuY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2Ftcm5iX2VuY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1ybmJfZW5jX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJuYl9lbmNfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWI0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIGVuY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUi1OQiBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0FNUi1XQiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBPdXRwdXQgRm9ybWF0IChwYXJhbWV0ZXIgbmFtZTogYG91dHB1dEZvcm1hdGApCisyLiBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYG1vZGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYG91dHB1dEZvcm1hdGAgfCAwLiBgQU1SX1RYX1dNRmAgMS4gYEFNUl9UWF9JRjJgIDIuIGBBTVJfVFhfRVRTYCB8IEJpdHMgMCwgMSBhbmQgMiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8Cit8IGBtb2RlYCAgIHwgMC4gYE1SNDc1YCAxLiBgTVI1MTVgIDIuIGBNUjU5YCAzLiBgTVI2N2AgIDQuIGBNUjc0IGAgNS4gYE1SNzk1YCA2LiBgTVIxMDJgIDcuIGBNUjEyMmAgOC4gYE1SRFRYYCB8IEJpdHMgMywgNCwgNSBhbmQgNiBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgZnJhbWUgc2l6ZS4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgc3RpbGwgYWR2YW5jZWQgYnkgZnJhbWUgc2l6ZSBzbwordGhhdCB0aGUgZnV6emVyIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1ybmJfZW5jX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgYW1ybmJfZW5jX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHBjbSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJuYl9lbmNfZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvYW1ybmJfZW5jX2Z1enplci9hbXJuYl9lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9mdXp6ZXIvYW1ybmJfZW5jX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYmYyNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvZnV6emVyL2Ftcm5iX2VuY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiZ3NtYW1yX2VuYy5oIgorCisvLyBDb25zdGFudHMgZm9yIEFNUi1OQgorY29uc3QgaW50MzJfdCBrTnVtSW5wdXRTYW1wbGVzID0gTF9GUkFNRTsgIC8vIDE2MCBzYW1wbGVzCitjb25zdCBpbnQzMl90IGtPdXRwdXRCdWZmZXJTaXplID0gMiAqIGtOdW1JbnB1dFNhbXBsZXMgKiBzaXplb2YoV29yZDE2KTsKK2NvbnN0IE1vZGUga01vZGVzWzldID0ge01SNDc1LCAvKiA0Ljc1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNTE1LCAvKiA1LjE1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNTksICAvKiA1LjkwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNjcsICAvKiA2LjcwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNzQsICAvKiA3LjQwIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SNzk1LCAvKiA3Ljk1IGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SMTAyLCAvKiAxMC4yIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SMTIyLCAvKiAxMi4yIGticHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1SRFRYLCAvKiBEVFggICAgICAgKi99OworY29uc3QgV29yZDE2IGtPdXRwdXRGb3JtYXRbM10gPSB7QU1SX1RYX1dNRiwgQU1SX1RYX0lGMiwgQU1SX1RYX0VUU307CisKK2NsYXNzIENvZGVjIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlYygpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMoKSB7IGRlSW5pdEVuY29kZXIoKTsgfQorICAgIFdvcmQxNiBpbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIGRlSW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIGVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgdm9pZCAqbUVuY1N0YXRlID0gbnVsbHB0cjsKKyAgICB2b2lkICptU2lkU3RhdGUgPSBudWxscHRyOworfTsKKworV29yZDE2IENvZGVjOjppbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgcmV0dXJuIEFNUkVuY29kZUluaXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSwgKCpkYXRhID4+IDEpICYgMHgwMSAvKiBkdHhfZW5hYmxlIGZsYWcgKi8pOworfQorCit2b2lkIENvZGVjOjpkZUluaXRFbmNvZGVyKCkgeworICAgIGlmIChtRW5jU3RhdGUpIHsKKyAgICAgICAgQU1SRW5jb2RlRXhpdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlKTsKKyAgICAgICAgbUVuY1N0YXRlID0gbnVsbHB0cjsKKyAgICAgICAgbVNpZFN0YXRlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQ29kZWM6OmVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFNUkVuY29kZVJlc2V0KG1FbmNTdGF0ZSwgbVNpZFN0YXRlKTsKKyAgICB1aW50OF90IHN0YXJ0Qnl0ZSA9ICpkYXRhOworICAgIGludCBtb2RlSW5kZXggPSAoKHN0YXJ0Qnl0ZSA+PiAzKSAlIDkpOworICAgIGludCBvdXRwdXRGb3JtYXRJbmRleCA9IChzdGFydEJ5dGUgJSAzKTsKKyAgICBNb2RlIG1vZGUgPSBrTW9kZXNbbW9kZUluZGV4XTsKKyAgICBXb3JkMTYgb3V0cHV0Rm9ybWF0ID0ga091dHB1dEZvcm1hdFtvdXRwdXRGb3JtYXRJbmRleF07CisKKyAgICAvLyBDb25zdW1lIHN0YXJ0Qnl0ZQorICAgIGRhdGErKzsKKyAgICBzaXplLS07CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IChGcmFtZV9UeXBlXzNHUFApbW9kZTsKKworICAgICAgICBXb3JkMTYgaW5wdXRCdWZba051bUlucHV0U2FtcGxlc10gPSB7fTsKKyAgICAgICAgaW50MzJfdCBtaW5TaXplID0gc3RkOjptaW4oc2l6ZSwgc2l6ZW9mKGlucHV0QnVmKSk7CisKKyAgICAgICAgdWludDhfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdID0ge307CisgICAgICAgIG1lbWNweShpbnB1dEJ1ZiwgZGF0YSwgbWluU2l6ZSk7CisKKyAgICAgICAgQU1SRW5jb2RlKG1FbmNTdGF0ZSwgbVNpZFN0YXRlLCBtb2RlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCAmZnJhbWVUeXBlLCBvdXRwdXRGb3JtYXQpOworCisgICAgICAgIGRhdGEgKz0gbWluU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBtaW5TaXplOworICAgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5pbml0RW5jb2RlcihkYXRhKSA9PSAwKSB7CisgICAgICAgIGNvZGVjLT5lbmNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGRlbGV0ZSBjb2RlYzsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2FtcmVuY29kZS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2FtcmVuY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hbXJlbmNvZGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYW1yZW5jb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYXV0b2NvcnIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2F1dG9jb3JyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9hdXRvY29yci5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MxMDM1cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzEwMzVwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMTAzNXBmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfMTFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl8xMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzExcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzJfOXBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MyXzlwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jMl85cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jM18xNHBmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2MzXzE0cGYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzNfMTRwZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M0XzE3cGYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzRfMTdwZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jNF8xN3BmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvYzhfMzFwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jOF8zMXBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2M4XzMxcGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2Nvci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19jb3IuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfY29yLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2FsY19lbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYWxjX2VuLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NhbGNfZW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jYnNlYXJjaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2JzZWFyY2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nic2VhcmNoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NsX2x0cC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jbF9sdHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY2xfbHRwLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29kX2Ftci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb2RfYW1yLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvZF9hbXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb252b2x2ZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29udm9sdmUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2NvbnZvbHZlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2guY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94LmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJlYjRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1BvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgM0dQUCBzdGFuZGFyZDoKKworICAgIDNHUFAgVFMgMjYuMDczCisgICAgQU5TSS1DIGNvZGUgZm9yIHRoZSBBZGFwdGl2ZSBNdWx0aS1SYXRlIChBTVIpIHNwZWVjaCBjb2RlYworICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKKworKEMpIDIwMDQsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQorUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKK3Rlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyBQYXRobmFtZTogLi9hdWRpby9nc20tYW1yL2Mvc3JjL2Nvcl9oX3gyLmMKKworICAgICBEYXRlOiAxMS8wNy8yMDAxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFVklTSU9OIEhJU1RPUlkKKworIERlc2NyaXB0aW9uOiBDcmVhdGVkIGEgc2VwYXJhdGUgZmlsZSBmb3IgY29yX2hfeDIgZnVuY3Rpb24uCisKKyBEZXNjcmlwdGlvbjogRml4ZWQgdHlwZWNhc3RpbmcgaXNzdWUgd2l0aCBUSSBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIG9uZQorICAgICAgICAgICAgICBsb2NhbCB2YXJpYWJsZSBwZXIgbGluZS4gVXBkYXRlZCBjb3B5cmlnaHQgeWVhci4KKworIERlc2NyaXB0aW9uOiBBZGRlZCAjZGVmaW5lIGZvciBsb2cyKDMyKSA9IDUuCisKKyBEZXNjcmlwdGlvbjogQWRkZWQgY2FsbCB0byByb3VuZCgpIGFuZCBMX3NobCgpIGZ1bmN0aW9ucyBpbiB0aGUgbGFzdCBGT1IKKyAgICAgICAgICAgICAgbG9vcCB0byBtYWtlIGNvZGUgYml0LWV4YWN0LgorCisgRGVzY3JpcHRpb246IEFkZGVkIHBPdmVyZmxvdyBhcyBhIHZhcmlhYmxlIHRoYXQncyBwYXNzZWQgaW4gZm9yIHRoZSBFUE9DCisgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCisKKyBEZXNjcmlwdGlvbjogQ2hhbmdlZCByb3VuZCBmdW5jdGlvbiBuYW1lIHRvIHB2X3JvdW5kIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKKyAgICAgICAgICAgICAgcm91bmQgZnVuY3Rpb24gaW4gQyBzdGFuZGFyZCBsaWJyYXJ5LgorCisgRGVzY3JpcHRpb246IFVzaW5nIGludHJpbnNpY3MgZnJvbSBmeHBfYXJpdGhtZXRpYy5oIC4KKworIERlc2NyaXB0aW9uOiBSZXBsYWNpbmcgZnhwX2FyaXRobWV0aWMuaCB3aXRoIGJhc2ljX29wLmguCisKKyBEZXNjcmlwdGlvbjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJjbnN0LmgiCisjaW5jbHVkZSAiY29yX2hfeC5oIgorI2luY2x1ZGUgImNvcl9oX3gyLmgiIC8vIEJYCisjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIExPRzJfT0ZfMzIgIDUKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCis7IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUworOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gTkFNRTogY29yX2hfeDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKKworIElucHV0czoKKyAgICBoID0gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGltcHVsc2UgcmVzcG9uc2Ugb2YgdGhlIHdlaWdodGVkIHN5bnRoZXNpcworICAgICAgICBmaWx0ZXI7IHZlY3RvciBjb250ZW50cyBhcmUgb2YgdHlwZSBXb3JkMTY7IHZlY3RvciBsZW5ndGggaXMKKyAgICAgICAgMiAqIExfU1VCRlIKKyAgICB4ID0gdGFyZ2V0IHNpZ25hbCB2ZWN0b3I7IHZlY3RvciBjb250ZW50cyBhcmUgb2YgdHlwZSBXb3JkMTY7IHZlY3RvcgorICAgICAgICBsZW5ndGggaXMgTF9TVUJGUgorICAgIGRuID0gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlCisgICAgICAgICBpbXB1bHNlIHJlc3BvbnNlOyB2ZWN0b3IgY29udGVudHMgYXJlIG9mIHR5cGUgV29yZDE2OyB2ZWN0b3IKKyAgICAgICAgIGxlbmd0aCBpcyBMX0NPREUKKyAgICBzZiA9IHNjYWxpbmcgZmFjdG9yIG9mIHR5cGUgV29yZDE2IDsgMiB3aGVuIG1vZGUgaXMgTVIxMjIsIDEgZm9yIGFsbAorICAgICAgICAgb3RoZXIgbW9kZXMKKyAgICBuYl90cmFjayA9IG51bWJlciBvZiBBQ0IgdHJhY2tzIChXb3JkMTYpCisgICAgc3RlcCA9IHN0ZXAgc2l6ZSBiZXR3ZWVuIHB1bHNlcyBpbiBvbmUgdHJhY2sgKFdvcmQxNikKKyAgICBwT3ZlcmZsb3cgPSBwb2ludGVyIHRvIG92ZXJmbG93IChGbGFnKQorCisgT3V0cHV0czoKKyAgICBkbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY29ycmVsYXRpb24gdmFsdWVzCisgICAgcE92ZXJmbG93ID0gMSBpZiB0aGUgbWF0aCBmdW5jdGlvbnMgY2FsbGVkIGJ5IGNvcl9oX3gyIHJlc3VsdCBpbiBvdmVyZmxvdworICAgIGVsc2UgemVyby4KKworIFJldHVybnM6CisgICAgTm9uZQorCisgR2xvYmFsIFZhcmlhYmxlcyBVc2VkOgorICAgIE5vbmUKKworIExvY2FsIFZhcmlhYmxlcyBOZWVkZWQ6CisgICAgTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCisgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdGFyZ2V0IHNpZ25hbCAoeCkgYW5kIHRoZQorIGltcHVsc2UgcmVzcG9uc2UgKGgpLgorCisgVGhlIGNvcnJlbGF0aW9uIGlzIGdpdmVuIGJ5OiBkW25dID0gc3VtX3tpPW59XntMLTF9IHhbaV0gaFtpLW5dLAorIHdoZXJlOiBuPTAsLi4uLEwtMQorCisgZFtuXSBpcyBub3JtYWxpemVkIHN1Y2ggdGhhdCB0aGUgc3VtIG9mIDUgbWF4aW1hIG9mIGRbbl0gY29ycmVzcG9uZGluZyB0bworIGVhY2ggcG9zaXRpb24gdHJhY2sgZG9lcyBub3Qgc2F0dXJhdGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisgTm9uZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTCisKKyBjb3JfaC5jLCBVTVRTIEdTTSBBTVIgc3BlZWNoIGNvZGVjLCBSOTkgLSBWZXJzaW9uIDMuMi4wLCBNYXJjaCAyLCAyMDAxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFCisKK1RoZSBvcmlnaW5hbCBldHNpIHJlZmVyZW5jZSBjb2RlIHVzZXMgYSBnbG9iYWwgZmxhZyBPdmVyZmxvdy4gSG93ZXZlciwgaW4gdGhlCithY3R1YWwgaW1wbGVtZW50YXRpb24gYSBwb2ludGVyIHRvIGEgdGhlIG92ZXJmbG93IGZsYWcgaXMgcGFzc2VkIGluLgorCit2b2lkIGNvcl9oX3gyICgKKyAgICBXb3JkMTYgaFtdLCAgICAvLyAoaSk6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlcgorICAgIFdvcmQxNiB4W10sICAgIC8vIChpKTogdGFyZ2V0CisgICAgV29yZDE2IGRuW10sICAgLy8gKG8pOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdCisgICAgV29yZDE2IHNmLCAgICAgLy8gKGkpOiBzY2FsaW5nIGZhY3RvcjogMiBmb3IgMTIuMiwgMSBmb3Igb3RoZXJzCisgICAgV29yZDE2IG5iX3RyYWNrLC8vIChpKTogdGhlIG51bWJlciBvZiBBQ0IgdHJhY2tzCisgICAgV29yZDE2IHN0ZXAgICAgLy8gKGkpOiBzdGVwIHNpemUgZnJvbSBvbmUgcHVsc2UgcG9zaXRpb24gdG8gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG9uZSB0cmFjaworKQoreworICAgIFdvcmQxNiBpLCBqLCBrOworICAgIFdvcmQzMiBzLCB5MzJbTF9DT0RFXSwgbWF4LCB0b3Q7CisKKyAgICAvLyBmaXJzdCBrZWVwIHRoZSByZXN1bHQgb24gMzIgYml0cyBhbmQgZmluZCBhYnNvbHV0ZSBtYXhpbXVtCisKKyAgICB0b3QgPSA1OworCisgICAgZm9yIChrID0gMDsgayA8IG5iX3RyYWNrOyBrKyspCisgICAgeworICAgICAgICBtYXggPSAwOworICAgICAgICBmb3IgKGkgPSBrOyBpIDwgTF9DT0RFOyBpICs9IHN0ZXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgPSAwOworICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IExfQ09ERTsgaisrKQorICAgICAgICAgICAgICAgIHMgPSBMX21hYyAocywgeFtqXSwgaFtqIC0gaV0pOworCisgICAgICAgICAgICB5MzJbaV0gPSBzOworCisgICAgICAgICAgICBzID0gTF9hYnMgKHMpOworICAgICAgICAgICAgaWYgKExfc3ViIChzLCBtYXgpID4gKFdvcmQzMikgMEwpCisgICAgICAgICAgICAgICAgbWF4ID0gczsKKyAgICAgICAgfQorICAgICAgICB0b3QgPSBMX2FkZCAodG90LCBMX3NociAobWF4LCAxKSk7CisgICAgfQorCisgICAgaiA9IHN1YiAobm9ybV9sICh0b3QpLCBzZik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTF9DT0RFOyBpKyspCisgICAgeworICAgICAgICBkbltpXSA9IHB2X3JvdW5kIChMX3NobCAoeTMyW2ldLCBqKSk7CisgICAgfQorfQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCisKKyBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCisKKyBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcworCisgQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCisgICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGNhbGxlZCkKKyAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDQVVUSU9OIFtvcHRpb25hbF0KKyBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQgY29yX2hfeDIoCisgICAgV29yZDE2IGhbXSwgICAgLyogKGkpOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8KKyAgICBXb3JkMTYgeFtdLCAgICAvKiAoaSk6IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQxNiBkbltdLCAgIC8qIChvKTogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAgICAgICovCisgICAgV29yZDE2IHNmLCAgICAgLyogKGkpOiBzY2FsaW5nIGZhY3RvcjogMiBmb3IgMTIuMiwgMSBmb3Igb3RoZXJzICAgICAgKi8KKyAgICBXb3JkMTYgbmJfdHJhY2ssLyogKGkpOiB0aGUgbnVtYmVyIG9mIEFDQiB0cmFja3MgICAgICAgICAgICAgICAgICAgICAqLworICAgIFdvcmQxNiBzdGVwLCAgIC8qIChpKTogc3RlcCBzaXplIGZyb20gb25lIHB1bHNlIHBvc2l0aW9uIHRvIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvbmUgdHJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGbGFnICpwT3ZlcmZsb3cKKykKK3sKKyAgICBXb3JkMTYgaTsKKyAgICBXb3JkMTYgajsKKyAgICBXb3JkMTYgazsKKyAgICBXb3JkMzIgczsKKyAgICBXb3JkMzIgeTMyW0xfQ09ERV17fTsKKyAgICBXb3JkMzIgbWF4OworICAgIFdvcmQzMiB0b3Q7CisKKworICAgIC8qIGZpcnN0IGtlZXAgdGhlIHJlc3VsdCBvbiAzMiBiaXRzIGFuZCBmaW5kIGFic29sdXRlIG1heGltdW0gKi8KKyAgICB0b3QgPSBMT0cyX09GXzMyOworICAgIGZvciAoayA9IDA7IGsgPCBuYl90cmFjazsgaysrKQorICAgIHsKKyAgICAgICAgbWF4ID0gMDsKKyAgICAgICAgZm9yIChpID0gazsgaSA8IExfQ09ERTsgaSArPSBzdGVwKQorICAgICAgICB7CisgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IExfQ09ERTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSBhbXJuYl9meHBfbWFjXzE2X2J5XzE2YmIoKFdvcmQzMil4W2pdLCAoV29yZDMyKWhbai1pXSwgcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMgPSBzIDw8IDE7CisgICAgICAgICAgICB5MzJbaV0gPSBzOworICAgICAgICAgICAgcyA9IExfYWJzKHMpOworCisgICAgICAgICAgICBpZiAocyA+IG1heCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXggPSBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvdCA9ICh0b3QgKyAobWF4ID4+IDEpKTsKKyAgICB9CisKKyAgICBqID0gc3ViKG5vcm1fbCh0b3QpLCBzZiwgcE92ZXJmbG93KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMX0NPREU7IGkrKykKKyAgICB7CisgICAgICAgIGRuW2ldID0gcHZfcm91bmQoTF9zaGwoeTMyW2ldLCBqLCBwT3ZlcmZsb3cpLCBwT3ZlcmZsb3cpOworICAgIH0KKworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3JfaF94Mi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9jb3Jyd2dodF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29ycndnaHRfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29ycndnaHRfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29ycndnaHRfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9kdHhfZW5jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2R0eF9lbmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZHR4X2VuYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnMy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnMy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWczLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnMy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfbGFnNi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZW5jX2xhZzYuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19sYWc2LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2VuY19vdXRwdXRfZm9ybWF0X3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9lbmNfb3V0cHV0X2Zvcm1hdF90YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b19pZjIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX2lmMi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9faWYyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZXRzX3RvX3dtZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ldHNfdG9fd21mLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2V0c190b193bWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2FkYXB0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfYWRhcHQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19hZGFwdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2NvZGUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX2NvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19jb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfY29kZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dfcGl0Y2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ19waXRjaC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nX3BpdGNoLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dhaW5fcS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dhaW5fcS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nYWluX3EuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ2Fpbl9xLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dzbWFtcl9lbmMuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2dzbWFtcl9lbmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvZ3NtYW1yX2VuYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9nc21hbXJfZW5jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2hwX21heC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2hwX21heC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9ocF9tYXguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaHBfbWF4LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2LmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNl90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9pbnRlcl8zNl90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvaW50ZXJfMzZfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2ludGVyXzM2X3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX2NvbXAuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9jb21wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9jb21wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9jb21wLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9leHRyYWN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfZXh0cmFjdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfZXh0cmFjdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfZXh0cmFjdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfbmVnYXRlLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xfbmVnYXRlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbF9uZWdhdGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sX25lZ2F0ZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZF90YWIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sYWdfd2luZF90YWIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGFnX3dpbmRfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xhZ193aW5kX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xldmluc29uLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9sZXZpbnNvbi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbGV2aW5zb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbHBjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvbHBjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2xwYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9scGMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvb2xfbHRwLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvb2xfbHRwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL29sX2x0cC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9vbF9sdHAuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcF9vbF93Z2guY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcF9vbF93Z2guY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wX29sX3dnaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Bfb2xfd2doLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfZnIuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfZnIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9mci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfZnIuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX2ZyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcGl0Y2hfb2wuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BpdGNoX29sLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9waXRjaF9vbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9iaWcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX2JpZy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfYmlnLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJlX3Byb2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3ByZV9wcm9jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcmVfcHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcm0yYml0cy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcm0yYml0cy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3BybTJiaXRzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9wcm0yYml0cy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcHJtMmJpdHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9wLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcV9nYWluX3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FfZ2Fpbl9wLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xX2dhaW5fcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhNWMxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmNwcApAQCAtMCwwICsxLDE0NDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyAzR1BQIHN0YW5kYXJkOgorCisgICAgM0dQUCBUUyAyNi4wNzMKKyAgICBBTlNJLUMgY29kZSBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgKEFNUikgc3BlZWNoIGNvZGVjCisgICAgQXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy4zZ3BwLm9yZworCisoQykgMjAwNCwgM0dQUCBPcmdhbml6YXRpb25hbCBQYXJ0bmVycyAoQVJJQiwgQVRJUywgQ0NTQSwgRVRTSSwgVFRBLCBUVEMpCitQZXJtaXNzaW9uIHRvIGRpc3RyaWJ1dGUsIG1vZGlmeSBhbmQgdXNlIHRoaXMgZmlsZSB1bmRlciB0aGUgc3RhbmRhcmQgbGljZW5zZQordGVybXMgbGlzdGVkIGFib3ZlIGhhcyBiZWVuIG9idGFpbmVkIGZyb20gdGhlIGNvcHlyaWdodCBob2xkZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworIFBhdGhuYW1lOiAuL2F1ZGlvL2dzbS1hbXIvYy9zcmMvcWdhaW40NzUuYworIEZ1bnRpb25zOiBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzCisgICAgICAgICAgIE1SNDc1X3VwZGF0ZV91bnFfcHJlZAorICAgICAgICAgICBNUjQ3NV9nYWluX3F1YW50CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1PRFVMRSBERVNDUklQVElPTgorCisgVGhlc2UgbW9kdWxlcyBoYW5kbGUgdGhlIHF1YW50aXphdGlvbiBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgZm9yIE1SNDc1LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IElOQ0xVREVTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJxZ2FpbjQ3NS5oIgorI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJiYXNpY19vcC5oIgorI2luY2x1ZGUgIm1vZGUuaCIKKyNpbmNsdWRlICJjbnN0LmgiCisjaW5jbHVkZSAicG93Mi5oIgorI2luY2x1ZGUgImxvZzIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1SNDc1X1ZRX1NJWkUgMjU2CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUworOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgVkFSSUFCTEUgREVGSU5JVElPTlMKKzsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoZSB0YWJsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGE6CisgKgorICogICAgZ19waXRjaCgwKSAgICAgICAgKFExNCkgLy8gZm9yIHN1Yi0KKyAqICAgIGdfZmFjKDApICAgICAgICAgIChRMTIpIC8vIGZyYW1lIDAgYW5kIDIKKyAqICAgIGdfcGl0Y2goMSkgICAgICAgIChRMTQpIC8vIGZvciBzdWItCisgKiAgICBnX2ZhYygyKSAgICAgICAgICAoUTEyKSAvLyBmcmFtZSAxIGFuZCAzCisgKgorICovCitzdGF0aWMgY29uc3QgV29yZDE2IHRhYmxlX2dhaW5fTVI0NzVbTVI0NzVfVlFfU0laRSo0XSA9Cit7CisgICAgLypnX3BpdCgwKSwgZ19mYWMoMCksICAgICAgZ19waXQoMSksIGdfZmFjKDEpICovCisgICAgODEyLCAgICAgICAgICAxMjgsICAgICAgICAgICA1NDIsICAgICAgMTQwLAorICAgIDI4NzMsICAgICAgICAgMTEzNSwgICAgICAgICAgMjI2NiwgICAgIDM0MDIsCisgICAgMjA2NywgICAgICAgICAgNTYzLCAgICAgICAgIDEyNjc3LCAgICAgIDY0NywKKyAgICA0MTMyLCAgICAgICAgIDE3OTgsICAgICAgICAgIDU2MDEsICAgICA1Mjg1LAorICAgIDc2ODksICAgICAgICAgIDM3NCwgICAgICAgICAgMzczNSwgICAgICA0NDEsCisgICAgMTA5MTIsICAgICAgICAgMjYzOCwgICAgICAgICAxMTgwNywgICAgIDI0OTQsCisgICAgMjA0OTAsICAgICAgICAgIDc5NywgICAgICAgICAgNTIxOCwgICAgICA2NzUsCisgICAgNjcyNCwgICAgICAgICA4MzU0LCAgICAgICAgICA1MjgyLCAgICAgMTY5NiwKKyAgICAxNDg4LCAgICAgICAgICA0MjgsICAgICAgICAgIDU4ODIsICAgICAgNDUyLAorICAgIDUzMzIsICAgICAgICAgNDA3MiwgICAgICAgICAgMzU4MywgICAgIDEyNjgsCisgICAgMjQ2OSwgICAgICAgICAgOTAxLCAgICAgICAgIDE1ODk0LCAgICAgMTAwNSwKKyAgICAxNDk4MiwgICAgICAgICAzMjcxLCAgICAgICAgIDEwMzMxLCAgICAgNDg1OCwKKyAgICAzNjM1LCAgICAgICAgIDIwMjEsICAgICAgICAgIDI1OTYsICAgICAgODM1LAorICAgIDEyMzYwLCAgICAgICAgIDQ4OTIsICAgICAgICAgMTIyMDYsICAgICAxNzA0LAorICAgIDEzNDMyLCAgICAgICAgIDE2MDQsICAgICAgICAgIDkxMTgsICAgICAyMzQxLAorICAgIDM5NjgsICAgICAgICAgMTUzOCwgICAgICAgICAgNTQ3OSwgICAgIDk5MzYsCisgICAgMzc5NSwgICAgICAgICAgNDE3LCAgICAgICAgICAxMzU5LCAgICAgIDQxNCwKKyAgICAzNjQwLCAgICAgICAgIDE1NjksICAgICAgICAgIDc5OTUsICAgICAzNTQxLAorICAgIDExNDA1LCAgICAgICAgICA2NDUsICAgICAgICAgIDg1NTIsICAgICAgNjM1LAorICAgIDQwNTYsICAgICAgICAgMTM3NywgICAgICAgICAxNjYwOCwgICAgIDYxMjQsCisgICAgMTE0MjAsICAgICAgICAgIDcwMCwgICAgICAgICAgMjAwNywgICAgICA2MDcsCisgICAgMTI0MTUsICAgICAgICAgMTU3OCwgICAgICAgICAxMTExOSwgICAgIDQ2NTQsCisgICAgMTM2ODAsICAgICAgICAgMTcwOCwgICAgICAgICAxMTk5MCwgICAgIDEyMjksCisgICAgNzk5NiwgICAgICAgICA3Mjk3LCAgICAgICAgIDEzMjMxLCAgICAgNTcxNSwKKyAgICAyNDI4LCAgICAgICAgIDExNTksICAgICAgICAgIDIwNzMsICAgICAxOTQxLAorICAgIDYyMTgsICAgICAgICAgNjEyMSwgICAgICAgICAgMzU0NiwgICAgIDE4MDQsCisgICAgODkyNSwgICAgICAgICAxODAyLCAgICAgICAgICA4Njc5LCAgICAgMTU4MCwKKyAgICAxMzkzNSwgICAgICAgICAzNTc2LCAgICAgICAgIDEzMzEzLCAgICAgNjIzNywKKyAgICA2MTQyLCAgICAgICAgIDExMzAsICAgICAgICAgIDU5OTQsICAgICAxNzM0LAorICAgIDE0MTQxLCAgICAgICAgIDQ2NjIsICAgICAgICAgMTEyNzEsICAgICAzMzIxLAorICAgIDEyMjI2LCAgICAgICAgIDE1NTEsICAgICAgICAgMTM5MzEsICAgICAzMDE1LAorICAgIDUwODEsICAgICAgICAxMDQ2NCwgICAgICAgICAgOTQ0NCwgICAgIDY3MDYsCisgICAgMTY4OSwgICAgICAgICAgNjgzLCAgICAgICAgICAxNDM2LCAgICAgMTMwNiwKKyAgICA3MjEyLCAgICAgICAgIDM5MzMsICAgICAgICAgIDQwODIsICAgICAyNzEzLAorICAgIDc3OTMsICAgICAgICAgIDcwNCwgICAgICAgICAxNTA3MCwgICAgICA4MDIsCisgICAgNjI5OSwgICAgICAgICA1MjEyLCAgICAgICAgICA0MzM3LCAgICAgNTM1NywKKyAgICA2Njc2LCAgICAgICAgICA1NDEsICAgICAgICAgIDYwNjIsICAgICAgNjI2LAorICAgIDEzNjUxLCAgICAgICAgIDM3MDAsICAgICAgICAgMTE0OTgsICAgICAyNDA4LAorICAgIDE2MTU2LCAgICAgICAgICA3MTYsICAgICAgICAgMTIxNzcsICAgICAgNzUxLAorICAgIDgwNjUsICAgICAgICAxMTQ4OSwgICAgICAgICAgNjMxNCwgICAgIDIyNTYsCisgICAgNDQ2NiwgICAgICAgICAgNDk2LCAgICAgICAgICA3MjkzLCAgICAgIDUyMywKKyAgICAxMDIxMywgICAgICAgICAzODMzLCAgICAgICAgICA4Mzk0LCAgICAgMzAzNywKKyAgICA4NDAzLCAgICAgICAgICA5NjYsICAgICAgICAgMTQyMjgsICAgICAxODgwLAorICAgIDg3MDMsICAgICAgICAgNTQwOSwgICAgICAgICAxNjM5NSwgICAgIDQ4NjMsCisgICAgNzQyMCwgICAgICAgICAxOTc5LCAgICAgICAgICA2MDg5LCAgICAgMTIzMCwKKyAgICA5MzcxLCAgICAgICAgIDQzOTgsICAgICAgICAgMTQ1NTgsICAgICAzMzYzLAorICAgIDEzNTU5LCAgICAgICAgIDI4NzMsICAgICAgICAgMTMxNjMsICAgICAxNDY1LAorICAgIDU1MzQsICAgICAgICAgMTY3OCwgICAgICAgICAxMzEzOCwgICAgMTQ3NzEsCisgICAgNzMzOCwgICAgICAgICAgNjAwLCAgICAgICAgICAxMzE4LCAgICAgIDU0OCwKKyAgICA0MjUyLCAgICAgICAgIDM1MzksICAgICAgICAgMTAwNDQsICAgICAyMzY0LAorICAgIDEwNTg3LCAgICAgICAgICA2MjIsICAgICAgICAgMTMwODgsICAgICAgNjY5LAorICAgIDE0MTI2LCAgICAgICAgIDM1MjYsICAgICAgICAgIDUwMzksICAgICA5Nzg0LAorICAgIDE1MzM4LCAgICAgICAgICA2MTksICAgICAgICAgIDMxMTUsICAgICAgNTkwLAorICAgIDE2NDQyLCAgICAgICAgIDMwMTMsICAgICAgICAgMTU1NDIsICAgICA0MTY4LAorICAgIDE1NTM3LCAgICAgICAgIDE2MTEsICAgICAgICAgMTU0MDUsICAgICAxMjI4LAorICAgIDE2MDIzLCAgICAgICAgIDkyOTksICAgICAgICAgIDc1MzQsICAgICA0OTc2LAorICAgIDE5OTAsICAgICAgICAgMTIxMywgICAgICAgICAxMTQ0NywgICAgIDExNTcsCisgICAgMTI1MTIsICAgICAgICAgNTUxOSwgICAgICAgICAgOTQ3NSwgICAgIDI2NDQsCisgICAgNzcxNiwgICAgICAgICAyMDM0LCAgICAgICAgIDEzMjgwLCAgICAgMjIzOSwKKyAgICAxNjAxMSwgICAgICAgICA1MDkzLCAgICAgICAgICA4MDY2LCAgICAgNjc2MSwKKyAgICAxMDA4MywgICAgICAgICAxNDEzLCAgICAgICAgICA1MDAyLCAgICAgMjM0NywKKyAgICAxMjUyMywgICAgICAgICA1OTc1LCAgICAgICAgIDE1MTI2LCAgICAgMjg5OSwKKyAgICAxODI2NCwgICAgICAgICAyMjg5LCAgICAgICAgIDE1ODI3LCAgICAgMjUyNywKKyAgICAxNjI2NSwgICAgICAgIDEwMjU0LCAgICAgICAgIDE0NjUxLCAgICAxMTMxOSwKKyAgICAxNzk3LCAgICAgICAgICAzMzcsICAgICAgICAgIDMxMTUsICAgICAgMzk3LAorICAgIDM1MTAsICAgICAgICAgMjkyOCwgICAgICAgICAgNDU5MiwgICAgIDI2NzAsCisgICAgNzUxOSwgICAgICAgICAgNjI4LCAgICAgICAgIDExNDE1LCAgICAgIDY1NiwKKyAgICA1OTQ2LCAgICAgICAgIDI0MzUsICAgICAgICAgIDY1NDQsICAgICA3MzY3LAorICAgIDgyMzgsICAgICAgICAgIDgyOSwgICAgICAgICAgNDAwMCwgICAgICA4NjMsCisgICAgMTAwMzIsICAgICAgICAgMjQ5MiwgICAgICAgICAxNjA1NywgICAgIDM1NTEsCisgICAgMTgyMDQsICAgICAgICAgMTA1NCwgICAgICAgICAgNjEwMywgICAgIDE0NTQsCisgICAgNTg4NCwgICAgICAgICA3OTAwLCAgICAgICAgIDE4NzUyLCAgICAgMzQ2OCwKKyAgICAxODY0LCAgICAgICAgICA1NDQsICAgICAgICAgIDkxOTgsICAgICAgNjgzLAorICAgIDExNjIzLCAgICAgICAgIDQxNjAsICAgICAgICAgIDQ1OTQsICAgICAxNjQ0LAorICAgIDMxNTgsICAgICAgICAgMTE1NywgICAgICAgICAxNTk1MywgICAgIDI1NjAsCisgICAgMTIzNDksICAgICAgICAgMzczMywgICAgICAgICAxNzQyMCwgICAgIDUyNjAsCisgICAgNjEwNiwgICAgICAgICAyMDA0LCAgICAgICAgICAyOTE3LCAgICAgMTc0MiwKKyAgICAxNjQ2NywgICAgICAgICA1MjU3LCAgICAgICAgIDE2Nzg3LCAgICAgMTY4MCwKKyAgICAxNzIwNSwgICAgICAgICAxNzU5LCAgICAgICAgICA0NzczLCAgICAgMzIzMSwKKyAgICA3Mzg2LCAgICAgICAgIDYwMzUsICAgICAgICAgMTQzNDIsICAgIDEwMDEyLAorICAgIDQwMzUsICAgICAgICAgIDQ0MiwgICAgICAgICAgNDE5NCwgICAgICA0NTgsCisgICAgOTIxNCwgICAgICAgICAyMjQyLCAgICAgICAgICA3NDI3LCAgICAgNDIxNywKKyAgICAxMjg2MCwgICAgICAgICAgODAxLCAgICAgICAgIDExMTg2LCAgICAgIDgyNSwKKyAgICAxMjY0OCwgICAgICAgICAyMDg0LCAgICAgICAgIDEyOTU2LCAgICAgNjU1NCwKKyAgICA5NTA1LCAgICAgICAgICA5OTYsICAgICAgICAgIDY2MjksICAgICAgOTg1LAorICAgIDEwNTM3LCAgICAgICAgIDI1MDIsICAgICAgICAgMTUyODksICAgICA1MDA2LAorICAgIDEyNjAyLCAgICAgICAgIDIwNTUsICAgICAgICAgMTU0ODQsICAgICAxNjUzLAorICAgIDE2MTk0LCAgICAgICAgIDY5MjEsICAgICAgICAgMTQyMzEsICAgICA1NzkwLAorICAgIDI2MjYsICAgICAgICAgIDgyOCwgICAgICAgICAgNTYxNSwgICAgIDE2ODYsCisgICAgMTM2NjMsICAgICAgICAgNTc3OCwgICAgICAgICAgMzY2OCwgICAgIDE1NTQsCisgICAgMTEzMTMsICAgICAgICAgMjYzMywgICAgICAgICAgOTc3MCwgICAgIDE0NTksCisgICAgMTQwMDMsICAgICAgICAgNDczMywgICAgICAgICAxNTg5NywgICAgIDYyOTEsCisgICAgNjI3OCwgICAgICAgICAxODcwLCAgICAgICAgICA3OTEwLCAgICAgMjI4NSwKKyAgICAxNjk3OCwgICAgICAgICA0NTcxLCAgICAgICAgIDE2NTc2LCAgICAgMzg0OSwKKyAgICAxNTI0OCwgICAgICAgICAyMzExLCAgICAgICAgIDE2MDIzLCAgICAgMzI0NCwKKyAgICAxNDQ1OSwgICAgICAgIDE3ODA4LCAgICAgICAgIDExODQ3LCAgICAgMjc2MywKKyAgICAxOTgxLCAgICAgICAgIDE0MDcsICAgICAgICAgIDE0MDAsICAgICAgODc2LAorICAgIDQzMzUsICAgICAgICAgMzU0NywgICAgICAgICAgNDM5MSwgICAgIDQyMTAsCisgICAgNTQwNSwgICAgICAgICAgNjgwLCAgICAgICAgIDE3NDYxLCAgICAgIDc4MSwKKyAgICA2NTAxLCAgICAgICAgIDUxMTgsICAgICAgICAgIDgwOTEsICAgICA3Njc3LAorICAgIDczNTUsICAgICAgICAgIDc5NCwgICAgICAgICAgODMzMywgICAgIDExODIsCisgICAgMTUwNDEsICAgICAgICAgMzE2MCwgICAgICAgICAxNDkyOCwgICAgIDMwMzksCisgICAgMjA0MjEsICAgICAgICAgIDg4MCwgICAgICAgICAxNDU0NSwgICAgICA4NTIsCisgICAgMTIzMzcsICAgICAgICAxNDcwOCwgICAgICAgICAgNjkwNCwgICAgIDE5MjAsCisgICAgNDIyNSwgICAgICAgICAgOTMzLCAgICAgICAgICA4MjE4LCAgICAgMTA4NywKKyAgICAxMDY1OSwgICAgICAgICA0MDg0LCAgICAgICAgIDEwMDgyLCAgICAgNDUzMywKKyAgICAyNzM1LCAgICAgICAgICA4NDAsICAgICAgICAgMjA2NTcsICAgICAxMDgxLAorICAgIDE2NzExLCAgICAgICAgIDU5NjYsICAgICAgICAgMTU4NzMsICAgICA0NTc4LAorICAgIDEwODcxLCAgICAgICAgIDI1NzQsICAgICAgICAgIDM3NzMsICAgICAxMTY2LAorICAgIDE0NTE5LCAgICAgICAgIDQwNDQsICAgICAgICAgMjA2OTksICAgICAyNjI3LAorICAgIDE1MjE5LCAgICAgICAgIDI3MzQsICAgICAgICAgMTUyNzQsICAgICAyMTg2LAorICAgIDYyNTcsICAgICAgICAgMzIyNiwgICAgICAgICAxMzEyNSwgICAgMTk0ODAsCisgICAgNzE5NiwgICAgICAgICAgOTMwLCAgICAgICAgICAyNDYyLCAgICAgMTYxOCwKKyAgICA0NTE1LCAgICAgICAgIDMwOTIsICAgICAgICAgMTM4NTIsICAgICA0Mjc3LAorICAgIDEwNDYwLCAgICAgICAgICA4MzMsICAgICAgICAgMTczMzksICAgICAgODEwLAorICAgIDE2ODkxLCAgICAgICAgIDIyODksICAgICAgICAgMTU1NDYsICAgICA4MjE3LAorICAgIDEzNjAzLCAgICAgICAgIDE2ODQsICAgICAgICAgIDMxOTcsICAgICAxODM0LAorICAgIDE1OTQ4LCAgICAgICAgIDI4MjAsICAgICAgICAgMTU4MTIsICAgICA1MzI3LAorICAgIDE3MDA2LCAgICAgICAgIDI0MzgsICAgICAgICAgMTY3ODgsICAgICAxMzI2LAorICAgIDE1NjcxLCAgICAgICAgIDgxNTYsICAgICAgICAgMTE3MjYsICAgICA4NTU2LAorICAgIDM3NjIsICAgICAgICAgMjA1MywgICAgICAgICAgOTU2MywgICAgIDEzMTcsCisgICAgMTM1NjEsICAgICAgICAgNjc5MCwgICAgICAgICAxMjIyNywgICAgIDE5MzYsCisgICAgODE4MCwgICAgICAgICAzNTUwLCAgICAgICAgIDEzMjg3LCAgICAgMTc3OCwKKyAgICAxNjI5OSwgICAgICAgICA2NTk5LCAgICAgICAgIDE2MjkxLCAgICAgNzc1OCwKKyAgICA4NTIxLCAgICAgICAgIDI1NTEsICAgICAgICAgIDcyMjUsICAgICAyNjQ1LAorICAgIDE4MjY5LCAgICAgICAgIDc0ODksICAgICAgICAgMTY4ODUsICAgICAyMjQ4LAorICAgIDE3ODgyLCAgICAgICAgIDI4ODQsICAgICAgICAgMTcyNjUsICAgICAzMzI4LAorICAgIDk0MTcsICAgICAgICAyMDE2MiwgICAgICAgICAxMTA0MiwgICAgIDgzMjAsCisgICAgMTI4NiwgICAgICAgICAgNjIwLCAgICAgICAgICAxNDMxLCAgICAgIDU4MywKKyAgICA1OTkzLCAgICAgICAgIDIyODksICAgICAgICAgIDM5NzgsICAgICAzNjI2LAorICAgIDUxNDQsICAgICAgICAgIDc1MiwgICAgICAgICAxMzQwOSwgICAgICA4MzAsCisgICAgNTU1MywgICAgICAgICAyODYwLCAgICAgICAgIDExNzY0LCAgICAgNTkwOCwKKyAgICAxMDczNywgICAgICAgICAgNTYwLCAgICAgICAgICA1NDQ2LCAgICAgIDU2NCwKKyAgICAxMzMyMSwgICAgICAgICAzMDA4LCAgICAgICAgIDExOTQ2LCAgICAgMzY4MywKKyAgICAxOTg4NywgICAgICAgICAgNzk4LCAgICAgICAgICA5ODI1LCAgICAgIDcyOCwKKyAgICAxMzY2MywgICAgICAgICA4NzQ4LCAgICAgICAgICA3MzkxLCAgICAgMzA1MywKKyAgICAyNTE1LCAgICAgICAgICA3NzgsICAgICAgICAgIDYwNTAsICAgICAgODMzLAorICAgIDY0NjksICAgICAgICAgNTA3NCwgICAgICAgICAgODMwNSwgICAgIDI0NjMsCisgICAgNjE0MSwgICAgICAgICAxODY1LCAgICAgICAgIDE1MzA4LCAgICAgMTI2MiwKKyAgICAxNDQwOCwgICAgICAgICA0NTQ3LCAgICAgICAgIDEzNjYzLCAgICAgNDUxNSwKKyAgICAzMTM3LCAgICAgICAgIDI5ODMsICAgICAgICAgIDI0NzksICAgICAxMjU5LAorICAgIDE1MDg4LCAgICAgICAgIDQ2NDcsICAgICAgICAgMTUzODIsICAgICAyNjA3LAorICAgIDE0NDkyLCAgICAgICAgIDIzOTIsICAgICAgICAgMTI0NjIsICAgICAyNTM3LAorICAgIDc1MzksICAgICAgICAgMjk0OSwgICAgICAgICAxMjkwOSwgICAgMTIwNjAsCisgICAgNTQ2OCwgICAgICAgICAgNjg0LCAgICAgICAgICAzMTQxLCAgICAgIDcyMiwKKyAgICA1MDgxLCAgICAgICAgIDEyNzQsICAgICAgICAgMTI3MzIsICAgICA0MjAwLAorICAgIDE1MzAyLCAgICAgICAgICA2ODEsICAgICAgICAgIDc4MTksICAgICAgNTkyLAorICAgIDY1MzQsICAgICAgICAgMjAyMSwgICAgICAgICAxNjQ3OCwgICAgIDg3MzcsCisgICAgMTMzNjQsICAgICAgICAgIDg4MiwgICAgICAgICAgNTM5NywgICAgICA4OTksCisgICAgMTQ2NTYsICAgICAgICAgMjE3OCwgICAgICAgICAxNDc0MSwgICAgIDQyMjcsCisgICAgMTQyNzAsICAgICAgICAgMTI5OCwgICAgICAgICAxMzkyOSwgICAgIDIwMjksCisgICAgMTU0NzcsICAgICAgICAgNzQ4MiwgICAgICAgICAxNTgxNSwgICAgIDQ1NzIsCisgICAgMjUyMSwgICAgICAgICAyMDEzLCAgICAgICAgICA1MDYyLCAgICAgMTgwNCwKKyAgICA1MTU5LCAgICAgICAgIDY1ODIsICAgICAgICAgIDcxMzAsICAgICAzNTk3LAorICAgIDEwOTIwLCAgICAgICAgIDE2MTEsICAgICAgICAgMTE3MjksICAgICAxNzA4LAorICAgIDE2OTAzLCAgICAgICAgIDM0NTUsICAgICAgICAgMTYyNjgsICAgICA2NjQwLAorICAgIDkzMDYsICAgICAgICAgMTAwNywgICAgICAgICAgOTM2OSwgICAgIDIxMDYsCisgICAgMTkxODIsICAgICAgICAgNTAzNywgICAgICAgICAxMjQ0MSwgICAgIDQyNjksCisgICAgMTU5MTksICAgICAgICAgMTMzMiwgICAgICAgICAxNTM1NywgICAgIDM1MTIsCisgICAgMTE4OTgsICAgICAgICAxNDE0MSwgICAgICAgICAxNjEwMSwgICAgIDY4NTQsCisgICAgMjAxMCwgICAgICAgICAgNzM3LCAgICAgICAgICAzNzc5LCAgICAgIDg2MSwKKyAgICAxMTQ1NCwgICAgICAgICAyODgwLCAgICAgICAgICAzNTY0LCAgICAgMzU0MCwKKyAgICA5MDU3LCAgICAgICAgIDEyNDEsICAgICAgICAgMTIzOTEsICAgICAgODk2LAorICAgIDg1NDYsICAgICAgICAgNDYyOSwgICAgICAgICAxMTU2MSwgICAgIDU3NzYsCisgICAgODEyOSwgICAgICAgICAgNTg5LCAgICAgICAgICA4MjE4LCAgICAgIDU4OCwKKyAgICAxODcyOCwgICAgICAgICAzNzU1LCAgICAgICAgIDEyOTczLCAgICAgMzE0OSwKKyAgICAxNTcyOSwgICAgICAgICAgNzU4LCAgICAgICAgIDE2NjM0LCAgICAgIDc1NCwKKyAgICAxNTIyMiwgICAgICAgIDExMTM4LCAgICAgICAgIDE1ODcxLCAgICAgMjIwOCwKKyAgICA0NjczLCAgICAgICAgICA2MTAsICAgICAgICAgMTAyMTgsICAgICAgNjc4LAorICAgIDE1MjU3LCAgICAgICAgIDQxNDYsICAgICAgICAgIDU3MjksICAgICAzMzI3LAorICAgIDgzNzcsICAgICAgICAgMTY3MCwgICAgICAgICAxOTg2MiwgICAgIDIzMjEsCisgICAgMTU0NTAsICAgICAgICAgNTUxMSwgICAgICAgICAxNDA1NCwgICAgIDU0ODEsCisgICAgNTcyOCwgICAgICAgICAyODg4LCAgICAgICAgICA3NTgwLCAgICAgMTM0NiwKKyAgICAxNDM4NCwgICAgICAgICA1MzI1LCAgICAgICAgIDE2MjM2LCAgICAgMzk1MCwKKyAgICAxNTExOCwgICAgICAgICAzNzQ0LCAgICAgICAgIDE1MzA2LCAgICAgMTQzNSwKKyAgICAxNDU5NywgICAgICAgICA0MDcwLCAgICAgICAgIDEyMzAxLCAgICAxNTY5NiwKKyAgICA3NjE3LCAgICAgICAgIDE2OTksICAgICAgICAgIDIxNzAsICAgICAgODg0LAorICAgIDQ0NTksICAgICAgICAgNDU2NywgICAgICAgICAxODA5NCwgICAgIDMzMDYsCisgICAgMTI3NDIsICAgICAgICAgIDgxNSwgICAgICAgICAxNDkyNiwgICAgICA5MDcsCisgICAgMTUwMTYsICAgICAgICAgNDI4MSwgICAgICAgICAxNTUxOCwgICAgIDgzNjgsCisgICAgMTc5OTQsICAgICAgICAgMTA4NywgICAgICAgICAgMjM1OCwgICAgICA4NjUsCisgICAgMTYyODEsICAgICAgICAgMzc4NywgICAgICAgICAxNTY3OSwgICAgIDQ1OTYsCisgICAgMTYzNTYsICAgICAgICAgMTUzNCwgICAgICAgICAxNjU4NCwgICAgIDIyMTAsCisgICAgMTY4MzMsICAgICAgICAgOTY5NywgICAgICAgICAxNTkyOSwgICAgIDQ1MTMsCisgICAgMzI3NywgICAgICAgICAxMDg1LCAgICAgICAgICA5NjQzLCAgICAgMjE4NywKKyAgICAxMTk3MywgICAgICAgICA2MDY4LCAgICAgICAgICA5MTk5LCAgICAgNDQ2MiwKKyAgICA4OTU1LCAgICAgICAgIDE2MjksICAgICAgICAgMTAyODksICAgICAzMDYyLAorICAgIDE2NDgxLCAgICAgICAgIDUxNTUsICAgICAgICAgMTU0NjYsICAgICA3MDY2LAorICAgIDEzNjc4LCAgICAgICAgIDI1NDMsICAgICAgICAgIDUyNzMsICAgICAyMjc3LAorICAgIDE2NzQ2LCAgICAgICAgIDYyMTMsICAgICAgICAgMTY2NTUsICAgICAzNDA4LAorICAgIDIwMzA0LCAgICAgICAgIDMzNjMsICAgICAgICAgMTg2ODgsICAgICAxOTg1LAorICAgIDE0MTcyLCAgICAgICAgMTI4NjcsICAgICAgICAgMTUxNTQsICAgIDE1NzAzLAorICAgIDQ0NzMsICAgICAgICAgMTAyMCwgICAgICAgICAgMTY4MSwgICAgICA4ODYsCisgICAgNDMxMSwgICAgICAgICA0MzAxLCAgICAgICAgICA4OTUyLCAgICAgMzY1NywKKyAgICA1ODkzLCAgICAgICAgIDExNDcsICAgICAgICAgMTE2NDcsICAgICAxNDUyLAorICAgIDE1ODg2LCAgICAgICAgIDIyMjcsICAgICAgICAgIDQ1ODIsICAgICA2NjQ0LAorICAgIDY5MjksICAgICAgICAgMTIwNSwgICAgICAgICAgNjIyMCwgICAgICA3OTksCisgICAgMTI0MTUsICAgICAgICAgMzQwOSwgICAgICAgICAxNTk2OCwgICAgIDM4NzcsCisgICAgMTk4NTksICAgICAgICAgMjEwOSwgICAgICAgICAgOTY4OSwgICAgIDIxNDEsCisgICAgMTQ3NDIsICAgICAgICAgODgzMCwgICAgICAgICAxNDQ4MCwgICAgIDI1OTksCisgICAgMTgxNywgICAgICAgICAxMjM4LCAgICAgICAgICA3NzcxLCAgICAgIDgxMywKKyAgICAxOTA3OSwgICAgICAgICA0NDEwLCAgICAgICAgICA1NTU0LCAgICAgMjA2NCwKKyAgICAzNjg3LCAgICAgICAgIDI4NDQsICAgICAgICAgMTc0MzUsICAgICAyMjU2LAorICAgIDE2Njk3LCAgICAgICAgIDQ0ODYsICAgICAgICAgMTYxOTksICAgICA1Mzg4LAorICAgIDgwMjgsICAgICAgICAgMjc2MywgICAgICAgICAgMzQwNSwgICAgIDIxMTksCisgICAgMTc0MjYsICAgICAgICAgNTQ3NywgICAgICAgICAxMzY5OCwgICAgIDI3ODYsCisgICAgMTk4NzksICAgICAgICAgMjcyMCwgICAgICAgICAgOTA5OCwgICAgIDM4ODAsCisgICAgMTgxNzIsICAgICAgICAgNDgzMywgICAgICAgICAxNzMzNiwgICAgMTIyMDcsCisgICAgNTExNiwgICAgICAgICAgOTk2LCAgICAgICAgICA0OTM1LCAgICAgIDk4OCwKKyAgICA5ODg4LCAgICAgICAgIDMwODEsICAgICAgICAgIDYwMTQsICAgICA1MzcxLAorICAgIDE1ODgxLCAgICAgICAgIDE2NjcsICAgICAgICAgIDg0MDUsICAgICAxMTgzLAorICAgIDE1MDg3LCAgICAgICAgIDIzNjYsICAgICAgICAgMTk3NzcsICAgICA3MDAyLAorICAgIDExOTYzLCAgICAgICAgIDE1NjIsICAgICAgICAgIDcyNzksICAgICAxMTI4LAorICAgIDE2ODU5LCAgICAgICAgIDE1MzIsICAgICAgICAgMTU3NjIsICAgICA1MzgxLAorICAgIDE0NzA4LCAgICAgICAgIDIwNjUsICAgICAgICAgMjAxMDUsICAgICAyMTU1LAorICAgIDE3MTU4LCAgICAgICAgIDgyNDUsICAgICAgICAgMTc5MTEsICAgICA2MzE4LAorICAgIDU0NjcsICAgICAgICAgMTUwNCwgICAgICAgICAgNDEwMCwgICAgIDI1NzQsCisgICAgMTc0MjEsICAgICAgICAgNjgxMCwgICAgICAgICAgNTY3MywgICAgIDI4ODgsCisgICAgMTY2MzYsICAgICAgICAgMzM4MiwgICAgICAgICAgODk3NSwgICAgIDE4MzEsCisgICAgMjAxNTksICAgICAgICAgNDczNywgICAgICAgICAxOTU1MCwgICAgIDcyOTQsCisgICAgNjY1OCwgICAgICAgICAyNzgxLCAgICAgICAgIDExNDcyLCAgICAgMzMyMSwKKyAgICAxOTM5NywgICAgICAgICA1MDU0LCAgICAgICAgIDE4ODc4LCAgICAgNDcyMiwKKyAgICAxNjQzOSwgICAgICAgICAyMzczLCAgICAgICAgIDIwNDMwLCAgICAgNDM4NiwKKyAgICAxMTM1MywgICAgICAgIDI2NTI2LCAgICAgICAgIDExNTkzLCAgICAgMzA2OCwKKyAgICAyODY2LCAgICAgICAgIDE1NjYsICAgICAgICAgIDUxMDgsICAgICAxMDcwLAorICAgIDk2MTQsICAgICAgICAgNDkxNSwgICAgICAgICAgNDkzOSwgICAgIDM1MzYsCisgICAgNzU0MSwgICAgICAgICAgODc4LCAgICAgICAgIDIwNzE3LCAgICAgIDg1MSwKKyAgICA2OTM4LCAgICAgICAgIDQzOTUsICAgICAgICAgMTY3OTksICAgICA3NzMzLAorICAgIDEwMTM3LCAgICAgICAgIDEwMTksICAgICAgICAgIDk4NDUsICAgICAgOTY0LAorICAgIDE1NDk0LCAgICAgICAgIDM5NTUsICAgICAgICAgMTU0NTksICAgICAzNDMwLAorICAgIDE4ODYzLCAgICAgICAgICA5ODIsICAgICAgICAgMjAxMjAsICAgICAgOTYzLAorICAgIDE2ODc2LCAgICAgICAgMTI4ODcsICAgICAgICAgMTQzMzQsICAgICA0MjAwLAorICAgIDY1OTksICAgICAgICAgMTIyMCwgICAgICAgICAgOTIyMiwgICAgICA4MTQsCisgICAgMTY5NDIsICAgICAgICAgNTEzNCwgICAgICAgICAgNTY2MSwgICAgIDQ4OTgsCisgICAgNTQ4OCwgICAgICAgICAxNzk4LCAgICAgICAgIDIwMjU4LCAgICAgMzk2MiwKKyAgICAxNzAwNSwgICAgICAgICA2MTc4LCAgICAgICAgIDE3OTI5LCAgICAgNTkyOSwKKyAgICA5MzY1LCAgICAgICAgIDM0MjAsICAgICAgICAgIDc0NzQsICAgICAxOTcxLAorICAgIDE5NTM3LCAgICAgICAgIDUxNzcsICAgICAgICAgMTkwMDMsICAgICAzMDA2LAorICAgIDE2NDU0LCAgICAgICAgIDM3ODgsICAgICAgICAgMTYwNzAsICAgICAyMzY3LAorICAgIDg2NjQsICAgICAgICAgMjc0MywgICAgICAgICAgOTQ0NSwgICAgMjYzNTgsCisgICAgMTA4NTYsICAgICAgICAgMTI4NywgICAgICAgICAgMzU1NSwgICAgIDEwMDksCisgICAgNTYwNiwgICAgICAgICAzNjIyLCAgICAgICAgIDE5NDUzLCAgICAgNTUxMiwKKyAgICAxMjQ1MywgICAgICAgICAgNzk3LCAgICAgICAgIDIwNjM0LCAgICAgIDkxMSwKKyAgICAxNTQyNywgICAgICAgICAzMDY2LCAgICAgICAgIDE3MDM3LCAgICAxMDI3NSwKKyAgICAxODg4MywgICAgICAgICAyNjMzLCAgICAgICAgICAzOTEzLCAgICAgMTI2OCwKKyAgICAxOTUxOSwgICAgICAgICAzMzcxLCAgICAgICAgIDE4MDUyLCAgICAgNTIzMCwKKyAgICAxOTI5MSwgICAgICAgICAxNjc4LCAgICAgICAgIDE5NTA4LCAgICAgMzE3MiwKKyAgICAxODA3MiwgICAgICAgIDEwNzU0LCAgICAgICAgIDE2NjI1LCAgICAgNjg0NSwKKyAgICAzMTM0LCAgICAgICAgIDIyOTgsICAgICAgICAgMTA4NjksICAgICAyNDM3LAorICAgIDE1NTgwLCAgICAgICAgIDY5MTMsICAgICAgICAgMTI1OTcsICAgICAzMzgxLAorICAgIDExMTE2LCAgICAgICAgIDMyOTcsICAgICAgICAgMTY3NjIsICAgICAyNDI0LAorICAgIDE4ODUzLCAgICAgICAgIDY3MTUsICAgICAgICAgMTcxNzEsICAgICA5ODg3LAorICAgIDEyNzQzLCAgICAgICAgIDI2MDUsICAgICAgICAgIDg5MzcsICAgICAzMTQwLAorICAgIDE5MDMzLCAgICAgICAgIDc3NjQsICAgICAgICAgMTgzNDcsICAgICAzODgwLAorICAgIDIwNDc1LCAgICAgICAgIDM2ODIsICAgICAgICAgMTk2MDIsICAgICAzMzgwLAorICAgIDEzMDQ0LCAgICAgICAgMTkzNzMsICAgICAgICAgMTA1MjYsICAgIDIzMTI0Cit9OworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gTkFNRTogTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCisgSW5wdXRzOgorICAgIHByZWRfc3QgPSBwb2ludGVyIHRvIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIHAgPSBwb2ludGVyIHRvIHNlbGVjdGVkIHF1YW50aXplciB0YWJsZSBlbnRyeSAoY29uc3QgV29yZDE2KQorICAgIGdjb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChXb3JkMTYpCisgICAgZXhwX2djb2RlMCA9IGV4cG9uZW50IG9mIHByZWRpY3RlZCBDQiBnYWluIChXb3JkMTYpCisgICAgZ2Fpbl9waXQgPSBwb2ludGVyIHRvIFBpdGNoIGdhaW4gKFdvcmQxNikKKyAgICBnYWluX2NvZCA9IHBvaW50ZXIgdG8gQ29kZSBnYWluIChXb3JkMTYpCisKKyBPdXRwdXRzOgorICAgIHByZWRfc3QgcG9pbnRzIHRvIHRoZSB1cGRhdGVkIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIGdhaW5fcGl0IHBvaW50cyB0byBQaXRjaCBnYWluCisgICAgZ2Fpbl9jb2QgcG9pbnRzIHRvIENvZGUgZ2FpbgorICAgIHBPdmVyZmxvdyBwb2ludHMgdG8gb3ZlcmZsb3cgaW5kaWNhdG9yIChGbGFnKQorCisgUmV0dXJuczoKKyAgICBOb25lLgorCisgR2xvYmFsIFZhcmlhYmxlcyBVc2VkOgorICAgIE5vbmUuCisKKyBMb2NhbCBWYXJpYWJsZXMgTmVlZGVkOgorICAgIE5vbmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OCisKKyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGZpbmFsIGZpeGVkIGNvZGVib29rIGdhaW4gYW5kIHRoZSBwcmVkaWN0b3IKKyB1cGRhdGUgdmFsdWVzLCBhbmQgdXBkYXRlcyB0aGUgZ2FpbiBwcmVkaWN0b3IuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFUVVJUkVNRU5UUworCisgTm9uZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVGRVJFTkNFUworCisgcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQU0VVRE8tQ09ERQorCitzdGF0aWMgdm9pZCBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKAorCisgICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAorICAgIGNvbnN0IFdvcmQxNiAqcCwgICAgICAgLy8gaSAgOiBwb2ludGVyIHRvIHNlbGVjdGVkIHF1YW50aXplciB0YWJsZSBlbnRyeQorICAgIFdvcmQxNiBnY29kZTAsICAgICAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgIFEoMTQgLSBleHBfZ2NvZGUwKQorICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgICAgIFEwCisgICAgV29yZDE2ICpnYWluX3BpdCwgICAgICAvLyBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgUTE0CisgICAgV29yZDE2ICpnYWluX2NvZCAgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTEKKykKK3sKKworICAgIFdvcmQxNiBnX2NvZGUsIGV4cCwgZnJhYywgdG1wOworICAgIFdvcmQzMiBMX3RtcDsKKworICAgIFdvcmQxNiBxdWFfZW5lcl9NUjEyMjsgLy8gbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCBNUjEyMiB2ZXJzaW9uIFExMAorICAgIFdvcmQxNiBxdWFfZW5lcjsgICAgICAgLy8gbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCAgICAgICAgICAgICAgIFExMAorCisgICAgLy8gUmVhZCB0aGUgcXVhbnRpemVkIGdhaW5zCisgICAgKmdhaW5fcGl0ID0gKnArKzsKKyAgICBnX2NvZGUgPSAqcCsrOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIGNhbGN1bGF0ZSBmaW5hbCBmaXhlZCBjb2RlYm9vayBnYWluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICBnYyA9IGdjMCAqIGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIExfdG1wID0gTF9tdWx0KGdfY29kZSwgZ2NvZGUwKTsKKyAgICBMX3RtcCA9IExfc2hyKExfdG1wLCBzdWIoMTAsIGV4cF9nY29kZTApKTsKKyAgICAqZ2Fpbl9jb2QgPSBleHRyYWN0X2goTF90bXApOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIGNhbGN1bGF0ZSBwcmVkaWN0b3IgdXBkYXRlIHZhbHVlcyBhbmQgdXBkYXRlIGdhaW4gcHJlZGljdG9yOiAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICBxdWFfZW5lciAgICAgICA9IGxvZzIoZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICBxdWFfZW5lcl9NUjEyMiA9IDIwKmxvZzEwKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIExvZzIgKExfZGVwb3NpdF9sIChnX2NvZGUpLCAmZXhwLCAmZnJhYyk7IC8vIExvZzIoeCBRMTIpID0gbG9nMih4KSArIDEyCisgICAgZXhwID0gc3ViKGV4cCwgMTIpOworCisgICAgdG1wID0gc2hyX3IgKGZyYWMsIDUpOworICAgIHF1YV9lbmVyX01SMTIyID0gYWRkICh0bXAsIHNobCAoZXhwLCAxMCkpOworCisgICAgTF90bXAgPSBNcHlfMzJfMTYoZXhwLCBmcmFjLCAyNDY2MCk7IC8vIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKQorICAgIHF1YV9lbmVyID0gcHZfcm91bmQgKExfc2hsIChMX3RtcCwgMTMpKTsgLy8gUTEyICogUTAgPSBRMTMgLT4gUTEwCisKKyAgICBnY19wcmVkX3VwZGF0ZShwcmVkX3N0LCBxdWFfZW5lcl9NUjEyMiwgcXVhX2VuZXIpOworfQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCisKKyBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCisKKyBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcworCisgQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCisgICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGNhbGxlZCkKKyAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDQVVUSU9OIFtvcHRpb25hbF0KKyBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3N0YXRpYyB2b2lkIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMoCisgICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvKiBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdCAgICAgICAgICAgICAgICovCisgICAgY29uc3QgV29yZDE2ICpwLCAgICAgICAvKiBpICA6IHBvaW50ZXIgdG8gc2VsZWN0ZWQgcXVhbnRpemVyIHRhYmxlIGVudHJ5ICovCisgICAgV29yZDE2IGdjb2RlMCwgICAgICAgICAvKiBpICA6IHByZWRpY3RlZCBDQiBnYWluLCAgICAgUSgxNCAtIGV4cF9nY29kZTApICovCisgICAgV29yZDE2IGV4cF9nY29kZTAsICAgICAvKiBpICA6IGV4cG9uZW50IG9mIHByZWRpY3RlZCBDQiBnYWluLCAgICAgICAgUTAgICovCisgICAgV29yZDE2ICpnYWluX3BpdCwgICAgICAvKiBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgUTE0ICovCisgICAgV29yZDE2ICpnYWluX2NvZCwgICAgICAvKiBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgUTEgICovCisgICAgRmxhZyAgICpwT3ZlcmZsb3cgICAgICAvKiBvICA6IG92ZXJmbG93IGluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICAgICovCispCit7CisgICAgV29yZDE2IGdfY29kZTsKKyAgICBXb3JkMTYgZXhwOworICAgIFdvcmQxNiBmcmFjOworICAgIFdvcmQxNiB0bXA7CisgICAgV29yZDMyIExfdG1wOworCisgICAgV29yZDE2IHF1YV9lbmVyX01SMTIyOyAvKiBvICA6IHF1YW50aXplZCBlbmVyZ3kgZXJyb3IsIE1SMTIyIHZlcnNpb24gUTEwICovCisgICAgV29yZDE2IHF1YV9lbmVyOyAgICAgICAvKiBvICA6IHF1YW50aXplZCBlbmVyZ3kgZXJyb3IsICAgICAgICAgICAgICAgUTEwICovCisKKworICAgIC8qIFJlYWQgdGhlIHF1YW50aXplZCBnYWlucyAqLworICAgICpnYWluX3BpdCA9ICpwKys7CisgICAgZ19jb2RlID0gKnArKzsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBjYWxjdWxhdGUgZmluYWwgZml4ZWQgY29kZWJvb2sgZ2FpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgZ2MgPSBnYzAgKiBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIExfdG1wID0gKChXb3JkMzIpIGdfY29kZSAqIGdjb2RlMCkgPDwgMTsKKyAgICB0bXAgICA9IDEwIC0gZXhwX2djb2RlMDsKKyAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXAsIHBPdmVyZmxvdyk7CisgICAgKmdhaW5fY29kID0gKFdvcmQxNikoTF90bXAgPj4gMTYpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIGNhbGN1bGF0ZSBwcmVkaWN0b3IgdXBkYXRlIHZhbHVlcyBhbmQgdXBkYXRlIGdhaW4gcHJlZGljdG9yOiAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICBxdWFfZW5lciAgICAgICA9IGxvZzIoZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICBxdWFfZW5lcl9NUjEyMiA9IDIwKmxvZzEwKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogTG9nMih4IFExMikgPSBsb2cyKHgpICsgMTIgKi8KKyAgICBMb2cyKChXb3JkMzIpIGdfY29kZSwgJmV4cCwgJmZyYWMsIHBPdmVyZmxvdyk7CisgICAgZXhwIC09IDEyOworCisgICAgdG1wID0gc2hyX3IoZnJhYywgNSwgcE92ZXJmbG93KTsKKyAgICBxdWFfZW5lcl9NUjEyMiA9IGV4cCA8PCAxMDsKKyAgICBxdWFfZW5lcl9NUjEyMiA9IHRtcCArIHF1YV9lbmVyX01SMTIyOworCisgICAgLyogMjQ2NjAgUTEyIH49IDYuMDIwNiA9IDIwKmxvZzEwKDIpICovCisgICAgTF90bXAgPSBNcHlfMzJfMTYoZXhwLCBmcmFjLCAyNDY2MCwgcE92ZXJmbG93KTsKKyAgICBMX3RtcCA9IExfdG1wIDw8IDEzOworCisgICAgLyogUTEyICogUTAgPSBRMTMgLT4gUTEwICovCisgICAgcXVhX2VuZXIgPSAoV29yZDE2KSgoTF90bXAgKyAoV29yZDMyKSAweDAwMDA4MDAwTCkgPj4gMTYpOworCisgICAgZ2NfcHJlZF91cGRhdGUocHJlZF9zdCwgcXVhX2VuZXJfTVIxMjIsIHF1YV9lbmVyKTsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIE5BTUU6IE1SNDc1X3VwZGF0ZV91bnFfcHJlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCisgSW5wdXRzOgorICAgIHByZWRfc3QgPSBwb2ludGVyIHRvIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIGV4cF9nY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSAoV29yZDE2KQorICAgIGZyYWNfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50IExTVykgKFdvcmQxNikKKyAgICBjb2RfZ2Fpbl9leHAgPSBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGV4cG9uZW50KShXb3JkMTYpCisgICAgY29kX2dhaW5fZnJhYyA9IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZnJhY3Rpb24pIChXb3JkMTYpCisKKyBPdXRwdXRzOgorICAgIHByZWRfc3QgcG9pbnRzIHRvIHRoZSB1cGRhdGVkIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIHBPdmVyZmxvdyBwb2ludHMgdG8gb3ZlcmZsb3cgaW5kaWNhdG9yIChGbGFnKQorCisgUmV0dXJuczoKKyAgICBOb25lLgorCisgR2xvYmFsIFZhcmlhYmxlcyBVc2VkOgorICAgIE5vbmUuCisKKyBMb2NhbCBWYXJpYWJsZXMgTmVlZGVkOgorICAgIE5vbmUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OCisKKyBUaGlzIG1vZHVsZSB1c2VzIHRoZSBvcHRpbXVtIGNvZGVib29rIGdhaW4gYW5kIHVwZGF0ZXMgdGhlICJ1bnF1YW50aXplZCIKKyBnYWluIHByZWRpY3RvciB3aXRoIHRoZSAoYm91bmRlZCkgcHJlZGljdGlvbiBlcnJvci4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTCisKKyBOb25lLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTCisKKyBxZ2FpbjQ3NS5jLCBVTVRTIEdTTSBBTVIgc3BlZWNoIGNvZGVjLCBSOTkgLSBWZXJzaW9uIDMuMi4wLCBNYXJjaCAyLCAyMDAxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFCisKK3ZvaWQKK01SNDc1X3VwZGF0ZV91bnFfcHJlZCgKKyAgICBnY19wcmVkU3RhdGUgKnByZWRfc3QsIC8vIGkvbzogZ2FpbiBwcmVkaWN0b3Igc3RhdGUgc3RydWN0CisgICAgV29yZDE2IGV4cF9nY29kZTAsICAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBNU1cpLCAgUTAKKyAgICBXb3JkMTYgZnJhY19nY29kZTAsICAgIC8vIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50IExTVyksICBRMTUKKyAgICBXb3JkMTYgY29kX2dhaW5fZXhwLCAgIC8vIGkgIDogb3B0aW11bSBjb2RlYm9vayBnYWluIChleHBvbmVudCksICBRMAorICAgIFdvcmQxNiBjb2RfZ2Fpbl9mcmFjICAgLy8gaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSwgIFExNQorKQoreworICAgIFdvcmQxNiB0bXAsIGV4cCwgZnJhYzsKKyAgICBXb3JkMTYgcXVhX2VuZXIsIHF1YV9lbmVyX01SMTIyOworICAgIFdvcmQzMiBMX3RtcDsKKworICAgIC8vIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIGZhY3RvciAoZ2l2ZW4gb3B0aW11bSBDQiBnYWluIGdjdSk6CisgICAgLy8gICBwcmVkRXJyRmFjdCA9IGdjdSAvIGdjb2RlMAorICAgIC8vICAgKGxpbWl0IHRvIE1JTl9QUkVEX0VSUl9GQUNUIDw9IHByZWRFcnJGYWN0IDw9IE1BWF9QUkVEX0VSUl9GQUNUCisgICAgLy8gICAgLT4gbGltaXQgcXVhX2VuZXIqKQorICAgIC8vCisgICAgLy8gY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKGxvZyk6CisgICAgLy8KKyAgICAvLyAgIHF1YV9lbmVyX01SMTIyID0gbG9nMihwcmVkRXJyRmFjdCkKKyAgICAvLyAgIHF1YV9lbmVyICAgICAgID0gMjAqbG9nMTAocHJlZEVyckZhY3QpCisKKyAgICBpZiAoY29kX2dhaW5fZnJhYyA8PSAwKQorICAgIHsKKyAgICAgICAgLy8gaWYgZ2N1IDw9IDAgLT4gcHJlZEVyckZhY3QgPSAwIDwgTUlOX1BSRURfRVJSX0ZBQ1QKKyAgICAgICAgLy8gLT4gc2V0IHF1YV9lbmVyKF9NUjEyMikgZGlyZWN0bHkKKyAgICAgICAgcXVhX2VuZXIgPSBNSU5fUVVBX0VORVI7CisgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUlOX1FVQV9FTkVSX01SMTIyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBjb252ZXJ0IGdjb2RlMCBmcm9tIERQRiB0byBzdGFuZGFyZCBmcmFjdGlvbi9leHBvbmVudCBmb3JtYXQKKyAgICAgICAgLy8gd2l0aCBub3JtYWxpemVkIGZyYWMsIGkuZS4gMTYzODQgPD0gZnJhYyA8PSAzMjc2NworICAgICAgICAvLyBOb3RlOiBleHBvbmVudCBjb3JyZWN0aW9uIChleHA9ZXhwLTE0KSBpcyBkb25lIGFmdGVyIGRpdl9zCisgICAgICAgIGZyYWNfZ2NvZGUwID0gZXh0cmFjdF9sIChQb3cyICgxNCwgZnJhY19nY29kZTApKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgY29kX2dhaW5fZnJhYyA8IGZyYWNfZ2NvZGUwICBmb3IgZGl2X3MKKyAgICAgICAgaWYgKHN1Yihjb2RfZ2Fpbl9mcmFjLCBmcmFjX2djb2RlMCkgPj0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgY29kX2dhaW5fZnJhYyA9IHNociAoY29kX2dhaW5fZnJhYywgMSk7CisgICAgICAgICAgICBjb2RfZ2Fpbl9leHAgPSBhZGQgKGNvZF9nYWluX2V4cCwgMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmVkRXJyRmFjdAorICAgICAgICAvLyAgID0gZ2N1IC8gZ2NvZGUwCisgICAgICAgIC8vICAgPSBjb2RfZ2Fpbl9mcmFjL2ZyYWNfZ2NvZGUwICogMl4oY29kX2dhaW5fZXhwLShleHBfZ2NvZGUwLTE0KSkKKyAgICAgICAgLy8gICA9IGRpdl9zIChjX2dfZiwgZnJhY19nY29kZTApKjJeLTE1ICogMl4oY19nX2UtZXhwX2djb2RlMCsxNCkKKyAgICAgICAgLy8gICA9IGRpdl9zICogMl4oY29kX2dhaW5fZXhwLWV4cF9nY29kZTAgLSAxKQorCisgICAgICAgIGZyYWMgPSBkaXZfcyAoY29kX2dhaW5fZnJhYywgZnJhY19nY29kZTApOworICAgICAgICB0bXAgPSBzdWIgKHN1YiAoY29kX2dhaW5fZXhwLCBleHBfZ2NvZGUwKSwgMSk7CisKKyAgICAgICAgTG9nMiAoTF9kZXBvc2l0X2wgKGZyYWMpLCAmZXhwLCAmZnJhYyk7CisgICAgICAgIGV4cCA9IGFkZCAoZXhwLCB0bXApOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIChsb2cyLCBRMTApCisgICAgICAgIHF1YV9lbmVyX01SMTIyID0gc2hyX3IgKGZyYWMsIDUpOworICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IGFkZCAocXVhX2VuZXJfTVIxMjIsIHNobCAoZXhwLCAxMCkpOworCisgICAgICAgIGlmIChzdWIocXVhX2VuZXJfTVIxMjIsIE1JTl9RVUFfRU5FUl9NUjEyMikgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBxdWFfZW5lciA9IE1JTl9RVUFfRU5FUjsKKyAgICAgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUlOX1FVQV9FTkVSX01SMTIyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN1YihxdWFfZW5lcl9NUjEyMiwgTUFYX1FVQV9FTkVSX01SMTIyKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1YV9lbmVyID0gTUFYX1FVQV9FTkVSOworICAgICAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBNQVhfUVVBX0VORVJfTVIxMjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAoMjAqbG9nMTAsIFExMCkKKyAgICAgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjApOworICAgICAgICAgICAgLy8gMjQ2NjAgUTEyIH49IDYuMDIwNiA9IDIwKmxvZzEwKDIpCisgICAgICAgICAgICBxdWFfZW5lciA9IHB2X3JvdW5kIChMX3NobCAoTF90bXAsIDEzKSk7CisgICAgICAgICAgICAvLyBRMTIgKiBRMCA9IFExMyAtPiBRMjYgLT4gUTEwCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1cGRhdGUgTUEgcHJlZGljdG9yIG1lbW9yeQorICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7Cit9CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFU09VUkNFUyBVU0VEIFtvcHRpb25hbF0KKworIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQorIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KKworIEhFQVAgTUVNT1JZIFVTRUQ6IHggYnl0ZXMKKworIFNUQUNLIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCisKKyBDTE9DSyBDWUNMRVM6IChjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBmdW5jdGlvbikgKyAodmFyaWFibGUKKyAgICAgICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCisgICAgICAgICAgICAgICAgY2FsbGVkKQorICAgICB3aGVyZTogKGN5Y2xlIGNvdW50IHZhcmlhYmxlKSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVdCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENBVVRJT04gW29wdGlvbmFsXQorIFtTdGF0ZSBhbnkgc3BlY2lhbCBub3RlcywgY29uc3RyYWludHMgb3IgY2F1dGlvbnMgZm9yIHVzZXJzIG9mIHRoaXMgZnVuY3Rpb25dCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKwordm9pZCBNUjQ3NV91cGRhdGVfdW5xX3ByZWQoCisgICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvKiBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdCAgICAgICAgICAgICovCisgICAgV29yZDE2IGV4cF9nY29kZTAsICAgICAvKiBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBNU1cpLCAgUTAgICovCisgICAgV29yZDE2IGZyYWNfZ2NvZGUwLCAgICAvKiBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpLCAgUTE1ICovCisgICAgV29yZDE2IGNvZF9nYWluX2V4cCwgICAvKiBpICA6IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZXhwb25lbnQpLCAgUTAgICovCisgICAgV29yZDE2IGNvZF9nYWluX2ZyYWMsICAvKiBpICA6IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZnJhY3Rpb24pLCAgUTE1ICovCisgICAgRmxhZyAgICpwT3ZlcmZsb3cgICAgICAvKiBvICA6IG92ZXJmbG93IGluZGljYXRvciAgICAgICAgICAgICAgICAgICAgICovCispCit7CisgICAgV29yZDE2IHRtcDsKKyAgICBXb3JkMTYgZXhwOworICAgIFdvcmQxNiBmcmFjOworICAgIFdvcmQxNiBxdWFfZW5lcjsKKyAgICBXb3JkMTYgcXVhX2VuZXJfTVIxMjI7CisgICAgV29yZDMyIExfdG1wOworCisgICAgLyogY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgZmFjdG9yIChnaXZlbiBvcHRpbXVtIENCIGdhaW4gZ2N1KToKKyAgICAgKgorICAgICAqICAgcHJlZEVyckZhY3QgPSBnY3UgLyBnY29kZTAKKyAgICAgKiAgIChsaW1pdCB0byBNSU5fUFJFRF9FUlJfRkFDVCA8PSBwcmVkRXJyRmFjdCA8PSBNQVhfUFJFRF9FUlJfRkFDVAorICAgICAqICAgIC0+IGxpbWl0IHF1YV9lbmVyKikKKyAgICAgKgorICAgICAqIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIChsb2cpOgorICAgICAqCisgICAgICogICBxdWFfZW5lcl9NUjEyMiA9IGxvZzIocHJlZEVyckZhY3QpCisgICAgICogICBxdWFfZW5lciAgICAgICA9IDIwKmxvZzEwKHByZWRFcnJGYWN0KQorICAgICAqCisgICAgICovCisKKyAgICBpZiAoY29kX2dhaW5fZnJhYyA8PSAwKQorICAgIHsKKyAgICAgICAgLyogaWYgZ2N1IDw9IDAgLT4gcHJlZEVyckZhY3QgPSAwIDwgTUlOX1BSRURfRVJSX0ZBQ1QgKi8KKyAgICAgICAgLyogLT4gc2V0IHF1YV9lbmVyKF9NUjEyMikgZGlyZWN0bHkgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcXVhX2VuZXIgPSBNSU5fUVVBX0VORVI7CisgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUlOX1FVQV9FTkVSX01SMTIyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBjb252ZXJ0IGdjb2RlMCBmcm9tIERQRiB0byBzdGFuZGFyZCBmcmFjdGlvbi9leHBvbmVudCBmb3JtYXQgKi8KKyAgICAgICAgLyogd2l0aCBub3JtYWxpemVkIGZyYWMsIGkuZS4gMTYzODQgPD0gZnJhYyA8PSAzMjc2NyAgICAgICAgICAgICovCisgICAgICAgIC8qIE5vdGU6IGV4cG9uZW50IGNvcnJlY3Rpb24gKGV4cD1leHAtMTQpIGlzIGRvbmUgYWZ0ZXIgZGl2X3MgICAqLworICAgICAgICBmcmFjX2djb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIGZyYWNfZ2NvZGUwLCBwT3ZlcmZsb3cpKTsKKworICAgICAgICAvKiBtYWtlIHN1cmUgY29kX2dhaW5fZnJhYyA8IGZyYWNfZ2NvZGUwICBmb3IgZGl2X3MgKi8KKyAgICAgICAgaWYgKGNvZF9nYWluX2ZyYWMgPj0gZnJhY19nY29kZTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZF9nYWluX2ZyYWMgPj49IDE7CisgICAgICAgICAgICBjb2RfZ2Fpbl9leHAgKz0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAgcHJlZEVyckZhY3QKKyAgICAgICAgICAgICA9IGdjdSAvIGdjb2RlMAorICAgICAgICAgICAgID0gY29kX2dhaW5fZnJhYy9mcmFjX2djb2RlMCAqIDJeKGNvZF9nYWluX2V4cC0oZXhwX2djb2RlMC0xNCkpCisgICAgICAgICAgICAgPSBkaXZfcyAoY19nX2YsIGZyYWNfZ2NvZGUwKSoyXi0xNSAqIDJeKGNfZ19lLWV4cF9nY29kZTArMTQpCisgICAgICAgICAgICAgPSBkaXZfcyAqIDJeKGNvZF9nYWluX2V4cC1leHBfZ2NvZGUwIC0gMSkKKyAgICAgICAgKi8KKyAgICAgICAgZnJhYyA9IGRpdl9zKGNvZF9nYWluX2ZyYWMsIGZyYWNfZ2NvZGUwKTsKKyAgICAgICAgdG1wID0gY29kX2dhaW5fZXhwIC0gZXhwX2djb2RlMDsKKyAgICAgICAgdG1wIC09IDE7CisKKyAgICAgICAgTG9nMigoV29yZDMyKSBmcmFjLCAmZXhwLCAmZnJhYywgcE92ZXJmbG93KTsKKyAgICAgICAgZXhwICs9IHRtcDsKKworICAgICAgICAvKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nMiwgUTEwKSAqLworICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IHNocl9yKGZyYWMsIDUsIHBPdmVyZmxvdyk7CisgICAgICAgIHRtcCA9IGV4cCA8PCAxMDsKKyAgICAgICAgcXVhX2VuZXJfTVIxMjIgKz0gdG1wOworCisgICAgICAgIGlmIChxdWFfZW5lcl9NUjEyMiA+IE1BWF9RVUFfRU5FUl9NUjEyMikKKyAgICAgICAgeworICAgICAgICAgICAgcXVhX2VuZXIgPSBNQVhfUVVBX0VORVI7CisgICAgICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1BWF9RVUFfRU5FUl9NUjEyMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yICgyMCpsb2cxMCwgUTEwKSAqLworICAgICAgICAgICAgTF90bXAgPSBNcHlfMzJfMTYoZXhwLCBmcmFjLCAyNDY2MCwgcE92ZXJmbG93KTsKKyAgICAgICAgICAgIC8qIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKSAqLworICAgICAgICAgICAgTF90bXAgPSAgTF9zaGwoTF90bXAsIDEzLCBwT3ZlcmZsb3cpOworICAgICAgICAgICAgcXVhX2VuZXIgPSBwdl9yb3VuZChMX3RtcCwgcE92ZXJmbG93KTsKKworICAgICAgICAgICAgLyogUTEyICogUTAgPSBRMTMgLT4gUTI2IC0+IFExMCAgICAgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSBNQSBwcmVkaWN0b3IgbWVtb3J5ICovCisgICAgZ2NfcHJlZF91cGRhdGUocHJlZF9zdCwgcXVhX2VuZXJfTVIxMjIsIHF1YV9lbmVyKTsKKworCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gTkFNRTogTVI0NzVfZ2Fpbl9xdWFudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCisgSW5wdXRzOgorICAgIHByZWRfc3QgPSBwb2ludGVyIHRvIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIHNmMF9leHBfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50KSAoV29yZDE2KQorICAgIGYwX2ZyYWNfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQorICAgIHNmMF9leHBfY29lZmYgPSBlbmVyZ3kgY29lZmYuIChleHBvbmVudCBwYXJ0KSAoV29yZDE2KQorICAgIHNmMF9mcmFjX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoKGZyYWN0aW9uIHBhcnQpIChXb3JkMTYpCisgICAgc2YwX2V4cF90YXJnZXRfZW4gPSBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5IChXb3JkMTYpCisgICAgc2YwX2ZyYWNfdGFyZ2V0X2VuID0gZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSAoV29yZDE2KQorICAgIHNmMV9jb2RlX25vc2hhcnAgPSBpbm5vdmF0aXZlIGNvZGVib29rIHZlY3RvciAgKFdvcmQxNikKKyAgICBzZjFfZXhwX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCkgKFdvcmQxNikKKyAgICBzZjFfZnJhY19nY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pIChXb3JkMTYpCisgICAgc2YxX2V4cF9jb2VmZiA9IGVuZXJneSBjb2VmZi4gKGV4cG9uZW50IHBhcnQpIChXb3JkMTYpCisgICAgc2YxX2ZyYWNfY29lZmYgPSBlbmVyZ3kgY29lZmYuIChmcmFjdGlvbiBwYXJ0KSAoV29yZDE2KQorICAgIHNmMV9leHBfdGFyZ2V0X2VuID0gZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSAoV29yZDE2KQorICAgIHNmMV9mcmFjX3RhcmdldF9lbiA9IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKKyAgICBncF9saW1pdCA9IHBpdGNoIGdhaW4gbGltaXQgKFdvcmQxNikKKyAgICBzZjBfZ2Fpbl9waXQgPSBwb2ludGVyIHRvIFBpdGNoIGdhaW4gKFdvcmQxNikKKyAgICBzZjBfZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQorICAgIHNmMV9nYWluX3BpdCA9IHBvaW50ZXIgdG8gUGl0Y2ggZ2FpbiAoV29yZDE2KQorICAgIHNmMV9nYWluX2NvZCA9IHBvaW50ZXIgdG8gQ29kZSBnYWluIChXb3JkMTYpCisKKyBPdXRwdXRzOgorICAgIHByZWRfc3QgcG9pbnRzIHRvIHRoZSB1cGRhdGVkIHN0cnVjdHVyZSBvZiB0eXBlIGdjX3ByZWRTdGF0ZQorICAgIHNmMF9nYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgorICAgIHNmMF9nYWluX2NvZCBwb2ludHMgdG8gQ29kZSBnYWluCisgICAgc2YxX2dhaW5fcGl0IHBvaW50cyB0byBQaXRjaCBnYWluCisgICAgc2YxX2dhaW5fY29kIHBvaW50cyB0byBDb2RlIGdhaW4KKworIFJldHVybnM6CisgICAgaW5kZXggPSBpbmRleCBvZiBxdWFudGl6YXRpb24KKworIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKKyAgICBOb25lLgorCisgTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKKyAgICBOb25lLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCisgVGhpcyBtb2R1bGUgcHJvdmlkZXMgcXVhbnRpemF0aW9uIG9mIHBpdGNoIGFuZCBjb2RlYm9vayBnYWlucyBmb3IgdHdvCisgc3ViZnJhbWVzIHVzaW5nIHRoZSBwcmVkaWN0ZWQgY29kZWJvb2sgZ2Fpbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTCisKKyBOb25lLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTCisKKyBxZ2FpbjQ3NS5jLCBVTVRTIEdTTSBBTVIgc3BlZWNoIGNvZGVjLCBSOTkgLSBWZXJzaW9uIDMuMi4wLCBNYXJjaCAyLCAyMDAxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFCisKK1dvcmQxNgorTVI0NzVfZ2Fpbl9xdWFudCggICAgICAgICAgICAgIC8vIG8gIDogaW5kZXggb2YgcXVhbnRpemF0aW9uLgorICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgICAgIC8vIGkvbzogZ2FpbiBwcmVkaWN0b3Igc3RhdGUgc3RydWN0CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGZyb20gc3ViZnJhbWUgMCAob3IgMikKKyAgICBXb3JkMTYgc2YwX2V4cF9nY29kZTAsICAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCksICAgICAgUTAKKyAgICBXb3JkMTYgc2YwX2ZyYWNfZ2NvZGUwLCAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbiksICAgICAgUTE1CisgICAgV29yZDE2IHNmMF9leHBfY29lZmZbXSwgICAgLy8gaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZXhwb25lbnQgcGFydCwgIFEwCisgICAgV29yZDE2IHNmMF9mcmFjX2NvZWZmW10sICAgLy8gaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNhbGNfZmlsdF9lbmVyZ2llcygpKQorICAgIFdvcmQxNiBzZjBfZXhwX3RhcmdldF9lbiwgIC8vIGkgIDogZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMAorICAgIFdvcmQxNiBzZjBfZnJhY190YXJnZXRfZW4sIC8vIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgZnJvbSBzdWJmcmFtZSAxIChvciAzKQorICAgIFdvcmQxNiBzZjFfY29kZV9ub3NoYXJwW10sIC8vIGkgIDogaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKExfU1VCRlIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAod2hpdGhvdXQgcGl0Y2ggc2hhcnBlbmluZykKKyAgICBXb3JkMTYgc2YxX2V4cF9nY29kZTAsICAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCksICAgICAgUTAKKyAgICBXb3JkMTYgc2YxX2ZyYWNfZ2NvZGUwLCAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbiksICAgICAgUTE1CisgICAgV29yZDE2IHNmMV9leHBfY29lZmZbXSwgICAgLy8gaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZXhwb25lbnQgcGFydCwgIFEwCisgICAgV29yZDE2IHNmMV9mcmFjX2NvZWZmW10sICAgLy8gaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNhbGNfZmlsdF9lbmVyZ2llcygpKQorICAgIFdvcmQxNiBzZjFfZXhwX3RhcmdldF9lbiwgIC8vIGkgIDogZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMAorICAgIFdvcmQxNiBzZjFfZnJhY190YXJnZXRfZW4sIC8vIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUKKworICAgIFdvcmQxNiBncF9saW1pdCwgICAgICAgICAgIC8vIGkgIDogcGl0Y2ggZ2FpbiBsaW1pdAorCisgICAgV29yZDE2ICpzZjBfZ2Fpbl9waXQsICAgICAgLy8gbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgIFExNAorICAgIFdvcmQxNiAqc2YwX2dhaW5fY29kLCAgICAgIC8vIG8gIDogQ29kZSBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICBRMQorCisgICAgV29yZDE2ICpzZjFfZ2Fpbl9waXQsICAgICAgLy8gbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgIFExNAorICAgIFdvcmQxNiAqc2YxX2dhaW5fY29kICAgICAgIC8vIG8gIDogQ29kZSBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICBRMQorKQoreworICAgIGNvbnN0IFdvcmQxNiAqcDsKKyAgICBXb3JkMTYgaSwgaW5kZXggPSAwOworICAgIFdvcmQxNiB0bXA7CisgICAgV29yZDE2IGV4cDsKKyAgICBXb3JkMTYgc2YwX2djb2RlMCwgc2YxX2djb2RlMDsKKyAgICBXb3JkMTYgZ19waXRjaCwgZzJfcGl0Y2gsIGdfY29kZSwgZzJfY29kZSwgZ19waXRfY29kOworICAgIFdvcmQxNiBjb2VmZlsxMF0sIGNvZWZmX2xvWzEwXSwgZXhwX21heFsxMF07ICAvLyAwLi40OiBzZjA7IDUuLjk6IHNmMQorICAgIFdvcmQzMiBMX3RtcCwgZGlzdF9taW47CisKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIHByZWRpY3RlZCBjb2RlYm9vayBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgZ2MwICAgICA9IDJeZXhwX2djb2RlMCArIDJeZnJhY19nY29kZTAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICBnY29kZTAgKFExNCkgPSAyXjE0KjJeZnJhY19nY29kZTAgPSBnYzAgKiAyXigxNC1leHBfZ2NvZGUwKSAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisKKyAgICBzZjBfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMF9mcmFjX2djb2RlMCkpOworICAgIHNmMV9nY29kZTAgPSBleHRyYWN0X2woUG93MigxNCwgc2YxX2ZyYWNfZ2NvZGUwKSk7CisKKyAgICAgKiBGb3IgZWFjaCBzdWJmcmFtZSwgdGhlIGVycm9yIGVuZXJneSAoc3VtKSB0byBiZSBtaW5pbWl6ZWQgY29uc2lzdHMKKyAgICAgKiBvZiBmaXZlIHRlcm1zLCB0WzAuLjRdLgorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFswXSA9ICAgIGdwXjIgICogPHkxIHkxPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAtMipncCAgICAqIDx4biB5MT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzJdID0gICAgZ2NeMiAgKiA8eTIgeTI+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFszXSA9IC0yKmdjICAgICogPHhuIHkyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbNF0gPSAgMipncCpnYyAqIDx5MSB5Mj4KKyAgICAgKgorCisgICAgLy8gc2YgMAorICAgIC8vIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExCisgICAgZXhwID0gc3ViKHNmMF9leHBfZ2NvZGUwLCAxMSk7CisKKyAgICAvLyBjYWxjdWxhdGUgZXhwX21heFtpXSA9IHNbaV0tMQorICAgIGV4cF9tYXhbMF0gPSBzdWIoc2YwX2V4cF9jb2VmZlswXSwgMTMpOworICAgIGV4cF9tYXhbMV0gPSBzdWIoc2YwX2V4cF9jb2VmZlsxXSwgMTQpOworICAgIGV4cF9tYXhbMl0gPSBhZGQoc2YwX2V4cF9jb2VmZlsyXSwgYWRkKDE1LCBzaGwoZXhwLCAxKSkpOworICAgIGV4cF9tYXhbM10gPSBhZGQoc2YwX2V4cF9jb2VmZlszXSwgZXhwKTsKKyAgICBleHBfbWF4WzRdID0gYWRkKHNmMF9leHBfY29lZmZbNF0sIGFkZCgxLCBleHApKTsKKworICAgIC8vIHNmIDEKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMQorICAgIGV4cCA9IHN1YihzZjFfZXhwX2djb2RlMCwgMTEpOworCisgICAgLy8gY2FsY3VsYXRlIGV4cF9tYXhbaV0gPSBzW2ldLTEKKyAgICBleHBfbWF4WzVdID0gc3ViKHNmMV9leHBfY29lZmZbMF0sIDEzKTsKKyAgICBleHBfbWF4WzZdID0gc3ViKHNmMV9leHBfY29lZmZbMV0sIDE0KTsKKyAgICBleHBfbWF4WzddID0gYWRkKHNmMV9leHBfY29lZmZbMl0sIGFkZCgxNSwgc2hsKGV4cCwgMSkpKTsKKyAgICBleHBfbWF4WzhdID0gYWRkKHNmMV9leHBfY29lZmZbM10sIGV4cCk7CisgICAgZXhwX21heFs5XSA9IGFkZChzZjFfZXhwX2NvZWZmWzRdLCBhZGQoMSwgZXhwKSk7CisKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIEdhaW4gc2VhcmNoIGVxdWFsaXNhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgVGhlIE1TRSBmb3IgdGhlIHR3byBzdWJmcmFtZXMgaXMgd2VpZ2h0ZWQgZGlmZmVyZW50bHkgaWYgdGhlcmUgICAqCisgICAgICogIGlzIGEgYmlnIGRpZmZlcmVuY2UgaW4gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGVuZXJnaWVzICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKworICAgIC8vIG1ha2UgdGhlIHRhcmdldCBlbmVyZ3kgZXhwb25lbnRzIHRoZSBzYW1lIGJ5IGRlLW5vcm1hbGl6aW5nIHRoZQorICAgIC8vIGZyYWN0aW9uIG9mIHRoZSBzbWFsbGVyIG9uZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBjb21wYXJlCisgICAgLy8gdGhlbQorCisgICAgZXhwID0gc2YwX2V4cF90YXJnZXRfZW4gLSBzZjFfZXhwX3RhcmdldF9lbjsKKyAgICBpZiAoZXhwID4gMCkKKyAgICB7CisgICAgICAgIHNmMV9mcmFjX3RhcmdldF9lbiA9IHNociAoc2YxX2ZyYWNfdGFyZ2V0X2VuLCBleHApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZjBfZnJhY190YXJnZXRfZW4gPSBzaGwgKHNmMF9mcmFjX3RhcmdldF9lbiwgZXhwKTsKKyAgICB9CisKKyAgICAvLyBhc3N1bWUgbm8gY2hhbmdlIG9mIGV4cG9uZW50cworICAgIGV4cCA9IDA7CisKKyAgICAvLyB0ZXN0IGZvciB0YXJnZXQgZW5lcmd5IGRpZmZlcmVuY2U7IHNldCBleHAgdG8gKzEgb3IgLTEgdG8gc2NhbGUKKyAgICAvLyB1cC9kb3duIGNvZWZmaWNpZW50cyBmb3Igc2YgMQorCisgICAgdG1wID0gc2hyX3IgKHNmMV9mcmFjX3RhcmdldF9lbiwgMSk7ICAgLy8gdG1wID0gY2VpbCgwLjUqZW4oc2YxKSkKKyAgICBpZiAoc3ViICh0bXAsIHNmMF9mcmFjX3RhcmdldF9lbikgPiAwKSAvLyB0bXAgPiBlbihzZjApPworICAgIHsKKyAgICAgICAgLy8gdGFyZ2V0X2VuZXJneShzZjEpID4gMip0YXJnZXRfZW5lcmd5KHNmMCkKKyAgICAgICAgLy8gICAtPiBzY2FsZSB1cCBNU0Uoc2YwKSBieSAyIGJ5IGFkZGluZyAxIHRvIGV4cG9uZW50cyAwLi40CisgICAgICAgIGV4cCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRtcCA9IHNociAoYWRkIChzZjBfZnJhY190YXJnZXRfZW4sIDMpLCAyKTsgLy8gdG1wPWNlaWwoMC4yNSplbihzZjApKQorICAgICAgICBpZiAoc3ViICh0bXAsIHNmMV9mcmFjX3RhcmdldF9lbikgPiAwKSAgICAgIC8vIHRtcCA+IGVuKHNmMSk/CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRhcmdldF9lbmVyZ3koc2YxKSA8IDAuMjUqdGFyZ2V0X2VuZXJneShzZjApCisgICAgICAgICAgICAvLyAgIC0+IHNjYWxlIGRvd24gTVNFKHNmMCkgYnkgMC41IGJ5IHN1YnRyYWN0aW5nIDEgZnJvbQorICAgICAgICAgICAgLy8gICAgICBjb2VmZmljaWVudHMgMC4uNAorICAgICAgICAgICAgZXhwID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgZXhwX21heFtpXSA9IGFkZCAoZXhwX21heFtpXSwgZXhwKTsKKyAgICB9CisKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgICAgICogIEZpbmQgbWF4aW11bSBleHBvbmVudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIEZvciB0aGUgc3VtIG9wZXJhdGlvbiwgYWxsIHRlcm1zIG11c3QgaGF2ZSB0aGUgc2FtZSBzY2FsaW5nOyAgICAgKgorICAgICAqICB0aGF0IHNjYWxpbmcgc2hvdWxkIGJlIGxvdyBlbm91Z2ggdG8gcHJldmVudCBvdmVyZmxvdy4gVGhlcmUtICAgICoKKyAgICAgKiAgZm9yZSwgdGhlIG1heGltdW0gc2NhbGUgaXMgZGV0ZXJtaW5lZCBhbmQgYWxsIGNvZWZmaWNpZW50cyBhcmUgICAqCisgICAgICogIHJlLXNjYWxlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICBleHAgPSBtYXgoZXhwX21heFtpXSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgZSA9IGV4cF9tYXhbaV0tZXhwOyAgICAgICAgIGUgPD0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgIGNbaV0gPSBjW2ldKjJeZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisKKyAgICBleHAgPSBleHBfbWF4WzBdOworICAgIGZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN1YihleHBfbWF4W2ldLCBleHApID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZXhwID0gZXhwX21heFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBleHAgPSBhZGQoZXhwLCAxKTsgICAgICAvLyBUbyBhdm9pZCBvdmVyZmxvdworCisgICAgcCA9ICZzZjBfZnJhY19jb2VmZlswXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIHRtcCA9IHN1YihleHAsIGV4cF9tYXhbaV0pOworICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKCpwKyspOworICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXApOworICAgICAgICBMX0V4dHJhY3QoTF90bXAsICZjb2VmZltpXSwgJmNvZWZmX2xvW2ldKTsKKyAgICB9CisgICAgcCA9ICZzZjFfZnJhY19jb2VmZlswXTsKKyAgICBmb3IgKDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgdG1wID0gc3ViKGV4cCwgZXhwX21heFtpXSk7CisgICAgICAgIExfdG1wID0gTF9kZXBvc2l0X2goKnArKyk7CisgICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCk7CisgICAgICAgIExfRXh0cmFjdChMX3RtcCwgJmNvZWZmW2ldLCAmY29lZmZfbG9baV0pOworICAgIH0KKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgQ29kZWJvb2sgc2VhcmNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgRm9yIGVhY2ggcGFpciAoZ19waXRjaCwgZ19mYWMpIGluIHRoZSB0YWJsZSBjYWxjdWxhdGUgdGhlICAgICAgICAqCisgICAgICogIHRlcm1zIHRbMC4uNF0gYW5kIHN1bSB0aGVtIHVwOyB0aGUgcmVzdWx0IGlzIHRoZSBtZWFuIHNxdWFyZWQgICAgKgorICAgICAqICBlcnJvciBmb3IgdGhlIHF1YW50aXplZCBnYWlucyBmcm9tIHRoZSB0YWJsZS4gVGhlIGluZGV4IGZvciB0aGUgICoKKyAgICAgKiAgbWluaW11bSBNU0UgaXMgc3RvcmVkIGFuZCBmaW5hbGx5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHF1YW50aXplZCAqCisgICAgICogIGdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gc3RhcnQgd2l0aCAiaW5maW5pdGUiIE1TRQorICAgIGRpc3RfbWluID0gTUFYXzMyOworCisgICAgcCA9ICZ0YWJsZV9nYWluX01SNDc1WzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IE1SNDc1X1ZRX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIC8vIHN1YmZyYW1lIDAgKGFuZCAyKSBjYWxjdWxhdGlvbnMKKyAgICAgICAgZ19waXRjaCA9ICpwKys7CisgICAgICAgIGdfY29kZSA9ICpwKys7CisKKyAgICAgICAgZ19jb2RlID0gbXVsdChnX2NvZGUsIHNmMF9nY29kZTApOworICAgICAgICBnMl9waXRjaCA9IG11bHQoZ19waXRjaCwgZ19waXRjaCk7CisgICAgICAgIGcyX2NvZGUgPSBtdWx0KGdfY29kZSwgZ19jb2RlKTsKKyAgICAgICAgZ19waXRfY29kID0gbXVsdChnX2NvZGUsIGdfcGl0Y2gpOworCisgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KCAgICAgICBjb2VmZlswXSwgY29lZmZfbG9bMF0sIGcyX3BpdGNoKTsKKyAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzFdLCBjb2VmZl9sb1sxXSwgZ19waXRjaCk7CisgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZlsyXSwgY29lZmZfbG9bMl0sIGcyX2NvZGUpOworICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbM10sIGNvZWZmX2xvWzNdLCBnX2NvZGUpOworICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbNF0sIGNvZWZmX2xvWzRdLCBnX3BpdF9jb2QpOworCisgICAgICAgIHRtcCA9IHN1YiAoZ19waXRjaCwgZ3BfbGltaXQpOworCisgICAgICAgIC8vIHN1YmZyYW1lIDEgKGFuZCAzKSBjYWxjdWxhdGlvbnMKKyAgICAgICAgZ19waXRjaCA9ICpwKys7CisgICAgICAgIGdfY29kZSA9ICpwKys7CisKKyAgICAgICAgaWYgKHRtcCA8PSAwICYmIHN1YihnX3BpdGNoLCBncF9saW1pdCkgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZ19jb2RlID0gbXVsdChnX2NvZGUsIHNmMV9nY29kZTApOworICAgICAgICAgICAgZzJfcGl0Y2ggPSBtdWx0KGdfcGl0Y2gsIGdfcGl0Y2gpOworICAgICAgICAgICAgZzJfY29kZSA9IG11bHQoZ19jb2RlLCBnX2NvZGUpOworICAgICAgICAgICAgZ19waXRfY29kID0gbXVsdChnX2NvZGUsIGdfcGl0Y2gpOworCisgICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbNV0sIGNvZWZmX2xvWzVdLCBnMl9waXRjaCk7CisgICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbNl0sIGNvZWZmX2xvWzZdLCBnX3BpdGNoKTsKKyAgICAgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZls3XSwgY29lZmZfbG9bN10sIGcyX2NvZGUpOworICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzhdLCBjb2VmZl9sb1s4XSwgZ19jb2RlKTsKKyAgICAgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZls5XSwgY29lZmZfbG9bOV0sIGdfcGl0X2NvZCk7CisKKyAgICAgICAgICAgIC8vIHN0b3JlIHRhYmxlIGluZGV4IGlmIE1TRSBmb3IgdGhpcyBpbmRleCBpcyBsb3dlcgorICAgICAgICAgICAgICAgdGhhbiB0aGUgbWluaW11bSBNU0Ugc2VlbiBzbyBmYXIKKyAgICAgICAgICAgIGlmIChMX3N1YihMX3RtcCwgZGlzdF9taW4pIDwgKFdvcmQzMikgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXN0X21pbiA9IExfdG1wOworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICByZWFkIHF1YW50aXplZCBnYWlucyBhbmQgdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcmllcyAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorCisgICAgLy8gZm9yIHN1YmZyYW1lIDAsIHRoZSBwcmUtY2FsY3VsYXRlZCBnY29kZTAvZXhwX2djb2RlMCBhcmUgdGhlIHNhbWUKKyAgICAvLyBhcyB0aG9zZSBjYWxjdWxhdGVkIGZyb20gdGhlICJyZWFsIiBwcmVkaWN0b3IgdXNpbmcgcXVhbnRpemVkIGdhaW5zCisgICAgdG1wID0gc2hsKGluZGV4LCAyKTsKKyAgICBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKHByZWRfc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVfZ2Fpbl9NUjQ3NVt0bXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YwX2djb2RlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9leHBfZ2NvZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YwX2dhaW5fcGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YwX2dhaW5fY29kKTsKKworICAgIC8vIGNhbGN1bGF0ZSBuZXcgcHJlZGljdGVkIGdhaW4gZm9yIHN1YmZyYW1lIDEgKHRoaXMgdGltZSB1c2luZworICAgIC8vIHRoZSByZWFsLCBxdWFudGl6ZWQgZ2FpbnMpCisgICAgZ2NfcHJlZChwcmVkX3N0LCBNUjQ3NSwgc2YxX2NvZGVfbm9zaGFycCwKKyAgICAgICAgICAgICZzZjFfZXhwX2djb2RlMCwgJnNmMV9mcmFjX2djb2RlMCwKKyAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTApOyAvLyBsYXN0IHR3byBhcmdzIGFyZSB1bnVzZWQKKyAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOworCisgICAgdG1wID0gYWRkICh0bXAsIDIpOworICAgIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMocHJlZF9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9nYWluX01SNDc1W3RtcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2NvZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2V4cF9nY29kZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9waXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9jb2QpOworCisgICAgcmV0dXJuIGluZGV4OworfQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCisKKyBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKKyB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCisKKyBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcworCisgQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCisgICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGNhbGxlZCkKKyAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDQVVUSU9OIFtvcHRpb25hbF0KKyBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK1dvcmQxNiBNUjQ3NV9nYWluX3F1YW50KCAgICAgICAvKiBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4gICAgICAgICAgICAgICAgICovCisgICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAgICAgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLworCisgICAgLyogZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpICovCisgICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLworICAgIFdvcmQxNiBzZjBfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KKyAgICBXb3JkMTYgc2YwX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCisgICAgV29yZDE2IHNmMF9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLworICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KKyAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCisgICAgV29yZDE2IHNmMF9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLworICAgIFdvcmQxNiBzZjBfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KKworICAgIC8qIGRhdGEgZnJvbSBzdWJmcmFtZSAxIChvciAzKSAqLworICAgIFdvcmQxNiBzZjFfY29kZV9ub3NoYXJwW10sIC8qIGkgIDogaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKExfU1VCRlIpICAgKi8KKyAgICAvKiAgICAgICh3aGl0aG91dCBwaXRjaCBzaGFycGVuaW5nKSAgICAgICAgICAgICovCisgICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLworICAgIFdvcmQxNiBzZjFfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KKyAgICBXb3JkMTYgc2YxX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCisgICAgV29yZDE2IHNmMV9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLworICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KKyAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCisgICAgV29yZDE2IHNmMV9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLworICAgIFdvcmQxNiBzZjFfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KKworICAgIFdvcmQxNiBncF9saW1pdCwgICAgICAgICAgIC8qIGkgIDogcGl0Y2ggZ2FpbiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8qIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQgKi8KKyAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvKiBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEgICovCisKKyAgICBXb3JkMTYgKnNmMV9nYWluX3BpdCwgICAgICAvKiBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgUTE0ICovCisgICAgV29yZDE2ICpzZjFfZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLworICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgICAgIC8qIG8gIDogb3ZlcmZsb3cgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgKi8KKykKK3sKKyAgICBjb25zdCBXb3JkMTYgKnA7CisgICAgV29yZDE2IGk7CisgICAgV29yZDE2IGluZGV4ID0gMDsKKyAgICBXb3JkMTYgdG1wOworICAgIFdvcmQxNiBleHA7CisgICAgV29yZDE2IHNmMF9nY29kZTA7CisgICAgV29yZDE2IHNmMV9nY29kZTA7CisgICAgV29yZDE2IGdfcGl0Y2g7CisgICAgV29yZDE2IGcyX3BpdGNoOworICAgIFdvcmQxNiBnX2NvZGU7CisgICAgV29yZDE2IGcyX2NvZGU7CisgICAgV29yZDE2IGdfcGl0X2NvZDsKKyAgICBXb3JkMTYgY29lZmZbMTBdOworICAgIFdvcmQxNiBjb2VmZl9sb1sxMF07CisgICAgV29yZDE2IGV4cF9tYXhbMTBdOyAgLyogMC4uNDogc2YwOyA1Li45OiBzZjEgKi8KKyAgICBXb3JkMzIgTF90bXA7CisgICAgV29yZDMyIGRpc3RfbWluOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIHNmMF9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjBfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOworICAgIHNmMV9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjFfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOworCisgICAgLyoKKyAgICAgKiBGb3IgZWFjaCBzdWJmcmFtZSwgdGhlIGVycm9yIGVuZXJneSAoc3VtKSB0byBiZSBtaW5pbWl6ZWQgY29uc2lzdHMKKyAgICAgKiBvZiBmaXZlIHRlcm1zLCB0WzAuLjRdLgorICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFswXSA9ICAgIGdwXjIgICogPHkxIHkxPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAtMipncCAgICAqIDx4biB5MT4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzJdID0gICAgZ2NeMiAgKiA8eTIgeTI+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdFszXSA9IC0yKmdjICAgICogPHhuIHkyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbNF0gPSAgMipncCpnYyAqIDx5MSB5Mj4KKyAgICAgKgorICAgICAqLworCisgICAgLyogc2YgMCAqLworICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCisgICAgZXhwID0gc2YwX2V4cF9nY29kZTAgLSAxMTsKKworICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCisgICAgZXhwX21heFswXSA9IChzZjBfZXhwX2NvZWZmWzBdIC0gMTMpOworICAgIGV4cF9tYXhbMV0gPSAoc2YwX2V4cF9jb2VmZlsxXSAtIDE0KTsKKyAgICBleHBfbWF4WzJdID0gKHNmMF9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7CisgICAgZXhwX21heFszXSA9IChzZjBfZXhwX2NvZWZmWzNdICsgZXhwKTsKKyAgICBleHBfbWF4WzRdID0gKHNmMF9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOworCisgICAgLyogc2YgMSAqLworICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCisgICAgZXhwID0gc2YxX2V4cF9nY29kZTAgLSAxMTsKKworICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCisgICAgZXhwX21heFs1XSA9IChzZjFfZXhwX2NvZWZmWzBdIC0gMTMpOworICAgIGV4cF9tYXhbNl0gPSAoc2YxX2V4cF9jb2VmZlsxXSAtIDE0KTsKKyAgICBleHBfbWF4WzddID0gKHNmMV9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7CisgICAgZXhwX21heFs4XSA9IChzZjFfZXhwX2NvZWZmWzNdICsgZXhwKTsKKyAgICBleHBfbWF4WzldID0gKHNmMV9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgorICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogbWFrZSB0aGUgdGFyZ2V0IGVuZXJneSBleHBvbmVudHMgdGhlIHNhbWUgYnkgZGUtbm9ybWFsaXppbmcgdGhlCisgICAgICAgZnJhY3Rpb24gb2YgdGhlIHNtYWxsZXIgb25lLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGNvbXBhcmUKKyAgICAgICB0aGVtCisgICAgICovCisgICAgZXhwID0gc2YwX2V4cF90YXJnZXRfZW4gLSBzZjFfZXhwX3RhcmdldF9lbjsKKyAgICBpZiAoZXhwID4gMCkKKyAgICB7CisgICAgICAgIHNmMV9mcmFjX3RhcmdldF9lbiA+Pj0gZXhwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZjBfZnJhY190YXJnZXRfZW4gPj49ICgtZXhwKTsKKyAgICB9CisKKyAgICAvKiBhc3N1bWUgbm8gY2hhbmdlIG9mIGV4cG9uZW50cyAqLworICAgIGV4cCA9IDA7CisKKyAgICAvKiB0ZXN0IGZvciB0YXJnZXQgZW5lcmd5IGRpZmZlcmVuY2U7IHNldCBleHAgdG8gKzEgb3IgLTEgdG8gc2NhbGUKKyAgICAgKiB1cC9kb3duIGNvZWZmaWNpZW50cyBmb3Igc2YgMQorICAgICAqLworICAgIHRtcCA9IHNocl9yKHNmMV9mcmFjX3RhcmdldF9lbiwgMSwgcE92ZXJmbG93KTsgIC8qIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpICovCisKKyAgICBpZiAodG1wID4gc2YwX2ZyYWNfdGFyZ2V0X2VuKSAgICAgICAgICAvKiB0bXAgPiBlbihzZjApPyAqLworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpID4gMip0YXJnZXRfZW5lcmd5KHNmMCkKKyAgICAgICAgICogICAtPiBzY2FsZSB1cCBNU0Uoc2YwKSBieSAyIGJ5IGFkZGluZyAxIHRvIGV4cG9uZW50cyAwLi40CisgICAgICAgICAqLworICAgICAgICBleHAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0bXAgPSAoKHNmMF9mcmFjX3RhcmdldF9lbiArIDMpID4+IDIpOyAvKiB0bXA9Y2VpbCgwLjI1KmVuKHNmMCkpICovCisKKyAgICAgICAgaWYgKHRtcCA+IHNmMV9mcmFjX3RhcmdldF9lbikgICAgICAvKiB0bXAgPiBlbihzZjEpPyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpIDwgMC4yNSp0YXJnZXRfZW5lcmd5KHNmMCkKKyAgICAgICAgICAgICAqICAgLT4gc2NhbGUgZG93biBNU0Uoc2YwKSBieSAwLjUgYnkgc3VidHJhY3RpbmcgMSBmcm9tCisgICAgICAgICAgICAgKiAgICAgIGNvZWZmaWNpZW50cyAwLi40CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGV4cCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICB7CisgICAgICAgIGV4cF9tYXhbaV0gKz0gZXhwOworICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgRmluZCBtYXhpbXVtIGV4cG9uZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgRm9yIHRoZSBzdW0gb3BlcmF0aW9uLCBhbGwgdGVybXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNjYWxpbmc7ICAgICAqCisgICAgICogIHRoYXQgc2NhbGluZyBzaG91bGQgYmUgbG93IGVub3VnaCB0byBwcmV2ZW50IG92ZXJmbG93LiBUaGVyZS0gICAgKgorICAgICAqICBmb3JlLCB0aGUgbWF4aW11bSBzY2FsZSBpcyBkZXRlcm1pbmVkIGFuZCBhbGwgY29lZmZpY2llbnRzIGFyZSAgICoKKyAgICAgKiAgcmUtc2NhbGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgIGV4cCA9IG1heChleHBfbWF4W2ldKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICBlID0gZXhwX21heFtpXS1leHA7ICAgICAgICAgZSA8PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogICAgY1tpXSA9IGNbaV0qMl5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICBleHAgPSBleHBfbWF4WzBdOworICAgIGZvciAoaSA9IDk7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBpZiAoZXhwX21heFtpXSA+IGV4cCkKKyAgICAgICAgeworICAgICAgICAgICAgZXhwID0gZXhwX21heFtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBleHArKzsgICAgICAvKiBUbyBhdm9pZCBvdmVyZmxvdyAqLworCisgICAgcCA9ICZzZjBfZnJhY19jb2VmZlswXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorICAgIHsKKyAgICAgICAgdG1wID0gKGV4cCAtIGV4cF9tYXhbaV0pOworICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7CisgICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKKyAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7CisgICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKKyAgICB9CisgICAgcCA9ICZzZjFfZnJhY19jb2VmZlswXTsKKyAgICBmb3IgKDsgaSA8IDEwOyBpKyspCisgICAgeworICAgICAgICB0bXAgPSBleHAgLSBleHBfbWF4W2ldOworICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7CisgICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKKyAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7CisgICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKKyAgICB9CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiAgQ29kZWJvb2sgc2VhcmNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogIH5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgRm9yIGVhY2ggcGFpciAoZ19waXRjaCwgZ19mYWMpIGluIHRoZSB0YWJsZSBjYWxjdWxhdGUgdGhlICAgICAgICAqCisgICAgICogIHRlcm1zIHRbMC4uNF0gYW5kIHN1bSB0aGVtIHVwOyB0aGUgcmVzdWx0IGlzIHRoZSBtZWFuIHNxdWFyZWQgICAgKgorICAgICAqICBlcnJvciBmb3IgdGhlIHF1YW50aXplZCBnYWlucyBmcm9tIHRoZSB0YWJsZS4gVGhlIGluZGV4IGZvciB0aGUgICoKKyAgICAgKiAgbWluaW11bSBNU0UgaXMgc3RvcmVkIGFuZCBmaW5hbGx5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHF1YW50aXplZCAqCisgICAgICogIGdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiBzdGFydCB3aXRoICJpbmZpbml0ZSIgTVNFICovCisgICAgZGlzdF9taW4gPSBNQVhfMzI7CisKKyAgICBwID0gJnRhYmxlX2dhaW5fTVI0NzVbMF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTVI0NzVfVlFfU0laRTsgaSsrKQorICAgIHsKKyAgICAgICAgLyogc3ViZnJhbWUgMCAoYW5kIDIpIGNhbGN1bGF0aW9ucyAqLworICAgICAgICBnX3BpdGNoID0gKnArKzsKKyAgICAgICAgZ19jb2RlID0gKnArKzsKKworICAgICAgICAvKiBOZWVkIHRvIGJlIHRoZXJlIE9LQSAqLworICAgICAgICBnX2NvZGUgICAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogc2YwX2djb2RlMCkgPj4gMTUpOworICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKKyAgICAgICAgZzJfY29kZSAgID0gKFdvcmQxNikoKChXb3JkMzIpIGdfY29kZSAqIGdfY29kZSkgPj4gMTUpOworICAgICAgICBnX3BpdF9jb2QgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogZ19waXRjaCkgPj4gMTUpOworCisKKyAgICAgICAgTF90bXAgPSBNcHlfMzJfMTYoY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzFdLCBjb2VmZl9sb1sxXSwgZ19waXRjaCwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzJdLCBjb2VmZl9sb1syXSwgZzJfY29kZSwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKKyAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbNF0sIGNvZWZmX2xvWzRdLCBnX3BpdF9jb2QsIHBPdmVyZmxvdyk7CisKKyAgICAgICAgdG1wID0gKGdfcGl0Y2ggLSBncF9saW1pdCk7CisKKyAgICAgICAgLyogc3ViZnJhbWUgMSAoYW5kIDMpIGNhbGN1bGF0aW9ucyAqLworICAgICAgICBnX3BpdGNoID0gKnArKzsKKyAgICAgICAgZ19jb2RlID0gKnArKzsKKworICAgICAgICBpZiAoKHRtcCA8PSAwKSAmJiAoZ19waXRjaCA8PSBncF9saW1pdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdfY29kZSA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBzZjFfZ2NvZGUwKSA+PiAxNSk7CisgICAgICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKKyAgICAgICAgICAgIGcyX2NvZGUgICA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX2NvZGUpID4+IDE1KTsKKyAgICAgICAgICAgIGdfcGl0X2NvZCA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX3BpdGNoKSA+PiAxNSk7CisKKyAgICAgICAgICAgIExfdG1wICs9IChNcHlfMzJfMTYoY29lZmZbNV0sIGNvZWZmX2xvWzVdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzddLCBjb2VmZl9sb1s3XSwgZzJfY29kZSwgcE92ZXJmbG93KSArCisgICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzhdLCBjb2VmZl9sb1s4XSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKKyAgICAgICAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QsIHBPdmVyZmxvdykpOworCisgICAgICAgICAgICAvKiBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyICovCisgICAgICAgICAgICBpZiAoTF90bXAgPCBkaXN0X21pbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXN0X21pbiA9IExfdG1wOworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqICByZWFkIHF1YW50aXplZCBnYWlucyBhbmQgdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcmllcyAgICAgICAgICAgKgorICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgKgorICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCisgICAgICAgYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucyAqLworICAgIHRtcCA9IGluZGV4IDw8IDI7CisgICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvdyk7CisKKyAgICAvKiBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKKyAgICAgICB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAorICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAorICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCwgLyogdW51c2VkIGFyZ3MgKi8KKyAgICAgICAgICAgIHBPdmVyZmxvdyk7CisKKyAgICBzZjFfZ2NvZGUwID0gKFdvcmQxNikoUG93MigxNCwgc2YxX2ZyYWNfZ2NvZGUwLCBwT3ZlcmZsb3cpKTsKKworICAgIHRtcCArPSAyOworICAgIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMoCisgICAgICAgIHByZWRfc3QsCisgICAgICAgICZ0YWJsZV9nYWluX01SNDc1W3RtcF0sCisgICAgICAgIHNmMV9nY29kZTAsCisgICAgICAgIHNmMV9leHBfZ2NvZGUwLAorICAgICAgICBzZjFfZ2Fpbl9waXQsCisgICAgICAgIHNmMV9nYWluX2NvZCwKKyAgICAgICAgcE92ZXJmbG93KTsKKworICAgIHJldHVybihpbmRleCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2Fpbjc5NS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW43OTUuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNzk1LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3F1YV9nYWluLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3F1YV9nYWluLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcXVhX2dhaW4uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xdWFfZ2Fpbi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvczEwXzhwZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zMTBfOHBmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3MxMF84cGYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zZXRfc2lnbi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2V0X3NpZ24uaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NldF9zaWduLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc2lkX3N5bmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NpZF9zeW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zaWRfc3luYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcF9lbmMuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcF9lbmMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BfZW5jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwX2VuYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3NwcmVwcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHJlcHJvYy5oIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3ByZXByb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuY3BwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9zcHN0cHJvYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvc3BzdHByb2MuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Nwc3Rwcm9jLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvdG9uX3N0YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3Rvbl9zdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3NyYy90b25fc3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY1Rlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0Ftcm5iRW5jb2RlclRlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzOTNlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1ybmJfZW5jX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNECisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJuYl9lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFtcm5iRW5jb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQW1ybmJFbmNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvYW1ybmJfZW5jX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzYTdiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1ybmJfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiYW1ybmJfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTczNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlICJnc21hbXJfZGVjLmgiCisKKy8vIENvbnN0YW50cyBmb3IgQU1SLU5CCitjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKK2NvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZSAvIDg7Citjb25zdCBiaXRzdHJlYW1fZm9ybWF0IGtCaXRTdHJlYW1Gb3JtYXRzWzJdID0ge01JTUVfSUVURiwgSUYyfTsKK2NvbnN0IGludDMyX3Qga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVsxNl0gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgNiwgIDUsICA1LCAgMCwgIDAsICAwLCAgMH07Citjb25zdCBpbnQzMl90IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbMTZdID0gezEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxfTsKKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisgIGludDE2X3QgaW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZUluaXREZWNvZGVyKCk7CisgIHZvaWQgZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworIHByaXZhdGU6CisgIHZvaWQgKm1BbXJIYW5kbGUgPSBudWxscHRyOworfTsKKworaW50MTZfdCBDb2RlYzo6aW5pdERlY29kZXIoKSB7IHJldHVybiBHU01Jbml0RGVjb2RlKCZtQW1ySGFuZGxlLCAoV29yZDggKikiQU1STkJEZWNvZGVyIik7IH0KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsgR1NNRGVjb2RlRnJhbWVFeGl0KCZtQW1ySGFuZGxlKTsgfQorCit2b2lkIENvZGVjOjpkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgdWludDhfdCBtb2RlID0gKmRhdGE7CisgICAgYm9vbCBiaXQgPSBtb2RlICYgMHgwMTsKKyAgICBiaXRzdHJlYW1fZm9ybWF0IGJpdHNyZWFtRm9ybWF0ID0ga0JpdFN0cmVhbUZvcm1hdHNbYml0XTsKKyAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7CisgICAgLyogRmluZCBmcmFtZSB0eXBlICovCisgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IHN0YXRpY19jYXN0PEZyYW1lX1R5cGVfM0dQUD4oKG1vZGUgPj4gMykgJiAweDBmKTsKKyAgICArK2RhdGE7CisgICAgLS1zaXplOworICAgIGlmIChiaXQpIHsKKyAgICAgIGZyYW1lU2l6ZSA9IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbZnJhbWVUeXBlXTsKKyAgICB9IGVsc2UgeworICAgICAgZnJhbWVTaXplID0ga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVtmcmFtZVR5cGVdOworICAgIH0KKyAgICBpbnQxNl90IG91dHB1dEJ1ZltrT3V0cHV0QnVmZmVyU2l6ZV07CisgICAgdWludDhfdCAqaW5wdXRCdWYgPSBuZXcgdWludDhfdFtmcmFtZVNpemVdOworICAgIGlmICghaW5wdXRCdWYpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBtaW5TaXplID0gc3RkOjptaW4oKGludDMyX3Qpc2l6ZSwgZnJhbWVTaXplKTsKKyAgICBtZW1jcHkoaW5wdXRCdWYsIGRhdGEsIG1pblNpemUpOworICAgIEFNUkRlY29kZShtQW1ySGFuZGxlLCBmcmFtZVR5cGUsIGlucHV0QnVmLCBvdXRwdXRCdWYsIGJpdHNyZWFtRm9ybWF0KTsKKyAgICAvKiBBTVJEZWNvZGUoKSBkZWNvZGVzIG1pblNpemUgbnVtYmVyIG9mIGJ5dGVzIGlmIGRlY29kZSBpcyBzdWNjZXNzZnVsLgorICAgICAqIEFNUkRlY29kZSgpIHJldHVybnMgLTEgaWYgZGVjb2RlIGZhaWxzLgorICAgICAqIEV2ZW4gaWYgbm8gYnl0ZXMgYXJlIGRlY29kZWQsIGluY3JlbWVudCBieSBtaW5TaXplIHRvIGVuc3VyZSBmdXp6ZXIgcHJvY2VlZHMKKyAgICAgKiB0byBmZWVkIG5leHQgZGF0YSAqLworICAgIGRhdGEgKz0gbWluU2l6ZTsKKyAgICBzaXplIC09IG1pblNpemU7CisgICAgZGVsZXRlW10gaW5wdXRCdWY7CisgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSA9PSAwKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJuYi9wYXRlbnRfZGlzY2xhaW1lci50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhlYTgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTM2IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlIHRoYXQgdG9vayB0aGUgYXBwcm9hY2ggb2YKKy8vICdhcHBseSBldmVyeSBsaWNlbnNlIGZvdW5kIHRvIGV2ZXJ5IHRhcmdldCcuIFdoaWxlIHRoaXMgbWFrZXMgc3VyZSB3ZSByZXNwZWN0CisvLyBldmVyeSBsaWNlbnNlIHJlc3RyaWN0aW9uLCBpdCBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QuCisvLworLy8gZS5nLiBHUEwgaW4gYW4gTUlUIHByb2plY3QgbWlnaHQgb25seSBhcHBseSB0byB0aGUgY29udHJpYi8gZGlyZWN0b3J5LgorLy8KKy8vIFBsZWFzZSBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHNpbmdsZSBsaWNlbnNlIGJlbG93IGludG8gbXVsdGlwbGUgbGljZW5zZXMsCisvLyB0YWtpbmcgY2FyZSBub3QgdG8gbG9zZSBhbnkgbGljZW5zZV9raW5kIGluZm9ybWF0aW9uLCBhbmQgb3ZlcnJpZGluZyB0aGUKKy8vIGRlZmF1bHQgbGljZW5zZSB1c2luZyB0aGUgJ2xpY2Vuc2VzOiBbLi4uXScgcHJvcGVydHkgb24gdGFyZ2V0cyBhcyBuZWVkZWQuCisvLworLy8gRm9yIHVudXNlZCBmaWxlcywgY29uc2lkZXIgY3JlYXRpbmcgYSAnZmlsZUdyb3VwJyB3aXRoICIvL3Zpc2liaWxpdHk6cHJpdmF0ZSIKKy8vIHRvIGF0dGFjaCB0aGUgbGljZW5zZSB0bywgYW5kIGluY2x1ZGluZyBhIGNvbW1lbnQgd2hldGhlciB0aGUgZmlsZXMgbWF5IGJlCisvLyB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNEIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLAorICAgICAgICAic3JjL2JhbmRfcGFzc182a183ay5jcHAiLAorICAgICAgICAic3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAiLAorICAgICAgICAic3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAiLAorICAgICAgICAic3JjL2RlY19hbGdfY29kZWJvb2suY3BwIiwKKyAgICAgICAgInNyYy9kZWNfZ2FpbjJfYW1yX3diLmNwcCIsCisgICAgICAgICJzcmMvZGVlbXBoYXNpc18zMi5jcHAiLAorICAgICAgICAic3JjL2R0eF9kZWNvZGVyX2Ftcl93Yi5jcHAiLAorICAgICAgICAic3JjL2dldF9hbXJfd2JfYml0cy5jcHAiLAorICAgICAgICAic3JjL2hpZ2hwYXNzXzQwMGh6X2F0XzEyazguY3BwIiwKKyAgICAgICAgInNyYy9oaWdocGFzc181MGh6X2F0XzEyazguY3BwIiwKKyAgICAgICAgInNyYy9ob21pbmdfYW1yX3diX2RlYy5jcHAiLAorICAgICAgICAic3JjL2ludGVycG9sYXRlX2lzcC5jcHAiLAorICAgICAgICAic3JjL2lzZl9leHRyYXBvbGF0aW9uLmNwcCIsCisgICAgICAgICJzcmMvaXNwX2F6LmNwcCIsCisgICAgICAgICJzcmMvaXNwX2lzZi5jcHAiLAorICAgICAgICAic3JjL2xhZ2NvbmNlYWwuY3BwIiwKKyAgICAgICAgInNyYy9sb3dfcGFzc19maWx0XzdrLmNwcCIsCisgICAgICAgICJzcmMvbWVkaWFuNS5jcHAiLAorICAgICAgICAic3JjL21pbWVfaW8uY3BwIiwKKyAgICAgICAgInNyYy9ub2lzZV9nZW5fYW1yd2IuY3BwIiwKKyAgICAgICAgInNyYy9ub3JtYWxpemVfYW1yX3diLmNwcCIsCisgICAgICAgICJzcmMvb3ZlcnNhbXBfMTJrOF90b18xNmsuY3BwIiwKKyAgICAgICAgInNyYy9waGFzZV9kaXNwZXJzaW9uLmNwcCIsCisgICAgICAgICJzcmMvcGl0X3NocnAuY3BwIiwKKyAgICAgICAgInNyYy9wcmVkX2x0NC5jcHAiLAorICAgICAgICAic3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcCIsCisgICAgICAgICJzcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcCIsCisgICAgICAgICJzcmMvcHZhbXJ3YmRlY29kZXIuY3BwIiwKKyAgICAgICAgInNyYy9xX2dhaW4yX3RhYi5jcHAiLAorICAgICAgICAic3JjL3Fpc2ZfbnMuY3BwIiwKKyAgICAgICAgInNyYy9xaXNmX25zX3RhYi5jcHAiLAorICAgICAgICAic3JjL3FwaXNmXzJzLmNwcCIsCisgICAgICAgICJzcmMvcXBpc2ZfMnNfdGFiLmNwcCIsCisgICAgICAgICJzcmMvc2NhbGVfc2lnbmFsLmNwcCIsCisgICAgICAgICJzcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAiLAorICAgICAgICAic3JjL3ZvaWNlX2ZhY3Rvci5jcHAiLAorICAgICAgICAic3JjL3diX3N5bl9maWx0LmNwcCIsCisgICAgICAgICJzcmMvd2VpZ2h0X2FtcndiX2xwYy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzcmMiLAorICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWNfdGVzdCIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWyJ0ZXN0L2FtcndiZGVjX3Rlc3QuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJhdWRpb3V0aWxzIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI3OGQyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YgoreworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkFtcndiRGVjb2RlclRlc3QifQorCisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJ3Yl9kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJ3Yl9kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9pbmNsdWRlL3B2YW1yd2JkZWNvZGVyX2FwaS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL2luY2x1ZGUvcHZhbXJ3YmRlY29kZXJfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2FnYzJfYW1yX3diLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2FnYzJfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9hZ2MyX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2FnYzJfYW1yX3diLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvYmFuZF9wYXNzXzZrXzdrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9iYW5kX3Bhc3NfNmtfN2suY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfYWNlbHBfMnBfaW5fNjQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hY2VscF8ycF9pbl82NC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWxnX2NvZGVib29rLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19hbGdfY29kZWJvb2suY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hbGdfY29kZWJvb2suY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfYWxnX2NvZGVib29rLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfZ2FpbjJfYW1yX3diLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19nYWluMl9hbXJfd2IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWNfZ2FpbjJfYW1yX3diLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWVtcGhhc2lzXzMyLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2RlZW1waGFzaXNfMzIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kZWVtcGhhc2lzXzMyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHguaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2R0eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2R0eC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kdHguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZHR4X2RlY29kZXJfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2VfcHZfYW1yd2JkZWMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2VfcHZfYW1yd2JkZWMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9lX3B2X2FtcndiZGVjLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2VfcHZfYW1yd2JkZWMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9nZXRfYW1yX3diX2JpdHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2dldF9hbXJfd2JfYml0cy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZ2V0X2Ftcl93Yl9iaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2dldF9hbXJfd2JfYml0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzQwMGh6X2F0XzEyazguY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaGlnaHBhc3NfNDAwaHpfYXRfMTJrOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2hpZ2hwYXNzXzQwMGh6X2F0XzEyazguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9oaWdocGFzc181MGh6X2F0XzEyazguY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2hpZ2hwYXNzXzUwaHpfYXRfMTJrOC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2hvbWluZ19hbXJfd2JfZGVjLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2ludGVycG9sYXRlX2lzcC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pbnRlcnBvbGF0ZV9pc3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2ludGVycG9sYXRlX2lzcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2ludGVycG9sYXRlX2lzcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzZl9leHRyYXBvbGF0aW9uLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNmX2V4dHJhcG9sYXRpb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzcF9hei5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc3BfYXouY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2lzcF9hei5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL2lzcF9hei5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvaXNwX2lzZi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9pc3BfaXNmLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9pc3BfaXNmLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvaXNwX2lzZi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbGFnY29uY2VhbC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sYWdjb25jZWFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sYWdjb25jZWFsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbGFnY29uY2VhbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbG93X3Bhc3NfZmlsdF83ay5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9sb3dfcGFzc19maWx0XzdrLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbG93X3Bhc3NfZmlsdF83ay5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWVkaWFuNS5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9tZWRpYW41LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9tZWRpYW41LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWVkaWFuNS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9taW1lX2lvLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9taW1lX2lvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbWltZV9pby5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL21pbWVfaW8uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbWltZV9pby5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub2lzZV9nZW5fYW1yd2IuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL25vaXNlX2dlbl9hbXJ3Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvbm9ybWFsaXplX2Ftcl93Yi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9vdmVyc2FtcF8xMms4X3RvXzE2ay5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9waGFzZV9kaXNwZXJzaW9uLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3BoYXNlX2Rpc3BlcnNpb24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waGFzZV9kaXNwZXJzaW9uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9waXRfc2hycC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waXRfc2hycC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcGl0X3NocnAuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9waXRfc2hycC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHJlZF9sdDQuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZF9sdDQuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ByZWRfbHQ0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHJlZF9sdDQuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wcmVlbXBoX2FtcndiX2RlYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3ByZWVtcGhfYW1yd2JfZGVjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZfYW1yX3diX3R5cGVfZGVmcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdl9hbXJfd2JfdHlwZV9kZWZzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3Yl9tYXRoX29wLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiX21hdGhfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JfbWF0aF9vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JfbWF0aF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiX21hdGhfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYWNlbHAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9hY2VscC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2FybXY1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfYXJtdjUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfY2VxdWl2YWxlbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2djY19hcm12NS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfZ2NjX2FybXY1LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2djY19hcm12NS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9jbnN0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX2Nuc3QuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9tZW1fZnVuY3MuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9wdmFtcndiZGVjb2Rlcl9tZW1fZnVuY3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xX2dhaW4yX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX2dhaW4yX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcV9nYWluMl90YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xX2dhaW4yX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcV9wdWxzZS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcV9wdWxzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FfcHVsc2UuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcV9wdWxzZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcWlzZl9ucy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9ucy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3Fpc2ZfbnMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3Fpc2ZfbnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9xaXNmX25zX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xaXNmX25zX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcWlzZl9uc190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xaXNmX25zX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9xcGlzZl8ycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3FwaXNmXzJzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FwaXNmXzJzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnNfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3FwaXNmXzJzX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcXBpc2ZfMnNfdGFiLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvcXBpc2ZfMnNfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zY2FsZV9zaWduYWwuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc2NhbGVfc2lnbmFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zY2FsZV9zaWduYWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy9zY2FsZV9zaWduYWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3N5bnRoZXNpc19hbXJfd2IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvc3ludGhlc2lzX2Ftcl93Yi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3N5bnRoZXNpc19hbXJfd2IuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9zeW50aGVzaXNfYW1yX3diLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3N5bnRoZXNpc19hbXJfd2IuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy92b2ljZV9mYWN0b3IuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvdm9pY2VfZmFjdG9yLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy92b2ljZV9mYWN0b3IuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy92b2ljZV9mYWN0b3IuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93Yl9zeW5fZmlsdC5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3NyYy93Yl9zeW5fZmlsdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyODI4ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3diX3N5bl9maWx0LmNwcApAQCAtMCwwICsxLDMxMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZm9sbG93aW5nIDNHUFAgc3RhbmRhcmQ6CisKKyAgICAzR1BQIFRTIDI2LjE3MworICAgIEFOU0ktQyBjb2RlIGZvciB0aGUgQWRhcHRpdmUgTXVsdGktUmF0ZSAtIFdpZGViYW5kIChBTVItV0IpIHNwZWVjaCBjb2RlYworICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKKworKEMpIDIwMDcsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQorUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKK3Rlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKyBGaWxlbmFtZTogd2Jfc3luX2ZpbHQuY3BwCisKKyAgICAgRGF0ZTogMDUvMDgvMjAwNAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVZJU0lPTiBISVNUT1JZCisKKworIERlc2NyaXB0aW9uOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCisKK3diX3N5bl9maWx0CisKKyAgICAgaW50MTYgYVtdLCAgICAgICAgICAgICAgIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMKKyAgICAgaW50MTYgbSwgICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKKyAgICAgaW50MTYgeFtdLCAgICAgICAgICAgICAgIChpKSAgICAgOiBpbnB1dCBzaWduYWwKKyAgICAgaW50MTYgeVtdLCAgICAgICAgICAgICAgIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsCisgICAgIGludDE2IGxnLCAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKKyAgICAgaW50MTYgbWVtW10sICAgICAgICAgICAgIChpL28pICAgOiBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsdGVyaW5nLgorICAgICBpbnQxNiB1cGRhdGUsICAgICAgICAgICAgKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuCisgICAgIGludDE2IHlfYnVmW10KKworU3luX2ZpbHRfMzIKKworICAgICBpbnQxNiBhW10sICAgICAgICAgICAgICAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzCisgICAgIGludDE2IG0sICAgICAgICAgICAgICAgIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIKKyAgICAgaW50MTYgZXhjW10sICAgICAgICAgICAgKGkpIFFuZXc6IGV4Y2l0YXRpb24gKGV4Y1tpXSA+PiBRbmV3KQorICAgICBpbnQxNiBRbmV3LCAgICAgICAgICAgICAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpCisgICAgIGludDE2IHNpZ19oaVtdLCAgICAgICAgIChvKSAvMTYgOiBzeW50aGVzaXMgaGlnaAorICAgICBpbnQxNiBzaWdfbG9bXSwgICAgICAgICAobykgLzE2IDogc3ludGhlc2lzIGxvdworICAgICBpbnQxNiBsZyAgICAgICAgICAgICAgICAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04KKworICAgIERvIHRoZSBzeW50aGVzaXMgZmlsdGVyaW5nIDEvQSh6KSAgMTYgYW5kIDMyLWJpdHMgdmVyc2lvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVFVSVJFTUVOVFMKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRUZFUkVOQ0VTCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFBTRVVETy1DT0RFCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKyNpbmNsdWRlICJwdl9hbXJfd2JfdHlwZV9kZWZzLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfbWVtX2Z1bmNzLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYmFzaWNfb3AuaCIKKyNpbmNsdWRlICJwdmFtcndiX21hdGhfb3AuaCIKKyNpbmNsdWRlICJwdmFtcndiZGVjb2Rlcl9jbnN0LmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYWNlbHAuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgREVGSU5FUworOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAorOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCis7IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHdiX3N5bl9maWx0KAorICAgIGludDE2IGFbXSwgICAgICAgLyogKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cyAgICAgICAgICAgKi8KKyAgICBpbnQxNiBtLCAgICAgICAgIC8qIChpKSAgICAgOiBvcmRlciBvZiBMUCBmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50MTYgeFtdLCAgICAgICAvKiAoaSkgICAgIDogaW5wdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludDE2IHlbXSwgICAgICAgLyogKG8pICAgICA6IG91dHB1dCBzaWduYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQxNiBsZywgICAgICAgIC8qIChpKSAgICAgOiBzaXplIG9mIGZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50MTYgbWVtW10sICAgICAvKiAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4gICAqLworICAgIGludDE2IHVwZGF0ZSwgICAgLyogKGkpICAgICA6IDA9bm8gdXBkYXRlLCAxPXVwZGF0ZSBvZiBtZW1vcnkuICAgICAgICAgKi8KKyAgICBpbnQxNiB5X2J1ZltdCispCit7CisKKyAgICBpbnQxNiBpLCBqOworICAgIGludDMyIExfdG1wMTsKKyAgICBpbnQzMiBMX3RtcDI7CisgICAgaW50MzIgTF90bXAzOworICAgIGludDMyIExfdG1wNDsKKyAgICBpbnQxNiAqeXk7CisKKyAgICAvKiBjb3B5IGluaXRpYWwgZmlsdGVyIHN0YXRlcyBpbnRvIHN5bnRoZXNpcyBidWZmZXIgKi8KKyAgICBwdl9tZW1jcHkoeV9idWYsIG1lbSwgbSpzaXplb2YoKnl5KSk7CisKKyAgICB5eSA9ICZ5X2J1ZlttXTsKKworICAgIC8qIERvIHRoZSBmaWx0ZXJpbmcuICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGcgPj4gMjsgaSsrKQorICAgIHsKKyAgICAgICAgTF90bXAxID0gLSgoaW50MzIpeFsoaTw8MildIDw8IDExKTsKKyAgICAgICAgTF90bXAyID0gLSgoaW50MzIpeFsoaTw8MikrMV0gPDwgMTEpOworICAgICAgICBMX3RtcDMgPSAtKChpbnQzMil4WyhpPDwyKSsyXSA8PCAxMSk7CisgICAgICAgIExfdG1wNCA9IC0oKGludDMyKXhbKGk8PDIpKzNdIDw8IDExKTsKKworICAgICAgICAvKiBhW10gdXNlcyBRMTIgYW5kIGFicyhhKSA9PCAxICovCisKKyAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtM10sIGFbM10sIExfdG1wMSk7CisgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTJdLCBhWzNdLCBMX3RtcDIpOworICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0yXSwgYVsyXSwgTF90bXAxKTsKKyAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtMV0sIGFbMl0sIExfdG1wMik7CisgICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTFdLCBhWzFdLCBMX3RtcDEpOworCisgICAgICAgIGZvciAoaiA9IDQ7IGogPCBtOyBqICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MiktMSAgLSBqXSwgYVtqKzFdLCBMX3RtcDEpOworICAgICAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAgICAtIGpdLCBhW2orMV0sIExfdG1wMik7CisgICAgICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbaiAgXSwgTF90bXAxKTsKKyAgICAgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqICBdLCBMX3RtcDIpOworICAgICAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsxICAtIGpdLCBhW2orMV0sIExfdG1wMyk7CisgICAgICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzIgIC0gal0sIGFbaisxXSwgTF90bXA0KTsKKyAgICAgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMiAgLSBqXSwgYVtqICBdLCBMX3RtcDMpOworICAgICAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSszICAtIGpdLCBhW2ogIF0sIExfdG1wNCk7CisgICAgICAgIH0KKworICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICAgIC0gal0sIGFbal0sIExfdG1wMSk7CisgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqXSwgTF90bXAyKTsKKyAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyICAtIGpdLCBhW2pdLCBMX3RtcDMpOworICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzMgIC0gal0sIGFbal0sIExfdG1wNCk7CisKKyAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgNCk7CisgICAgICAgIExfdG1wMSA9IExfdG1wMSA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXAxOworCisgICAgICAgIHlbKGk8PDIpXSA9IHl5WyhpPDwyKV0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMSk7CisKKyAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKV0sIGFbMV0sIExfdG1wMik7CisKKyAgICAgICAgTF90bXAyID0gc2hsX2ludDMyKExfdG1wMiwgNCk7CisgICAgICAgIExfdG1wMiA9IExfdG1wMiA9PSBJTlQzMl9NSU4gPyBJTlQzMl9NSU4gKyAxIDogTF90bXAyOworCisgICAgICAgIHlbKGk8PDIpKzFdID0geXlbKGk8PDIpKzFdID0gYW1yX3diX3JvdW5kKC1MX3RtcDIpOworCisgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLSAxXSwgYVszXSwgTF90bXAzKTsKKyAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKV0sIGFbM10sIExfdG1wNCk7CisgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MildLCBhWzJdLCBMX3RtcDMpOworICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpICsgMV0sIGFbMl0sIExfdG1wNCk7CisgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgKyAxXSwgYVsxXSwgTF90bXAzKTsKKworICAgICAgICBMX3RtcDMgPSBzaGxfaW50MzIoTF90bXAzLCA0KTsKKyAgICAgICAgTF90bXAzID0gTF90bXAzID09IElOVDMyX01JTiA/IElOVDMyX01JTiArIDEgOiBMX3RtcDM7CisKKyAgICAgICAgeVsoaTw8MikrMl0gPSB5eVsoaTw8MikrMl0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMyk7CisKKyAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyXSwgYVsxXSwgTF90bXA0KTsKKworICAgICAgICBMX3RtcDQgPSBzaGxfaW50MzIoTF90bXA0LCA0KTsKKyAgICAgICAgTF90bXA0ID0gTF90bXA0ID09IElOVDMyX01JTiA/IElOVDMyX01JTiArIDEgOiBMX3RtcDQ7CisKKyAgICAgICAgeVsoaTw8MikrM10gPSB5eVsoaTw8MikrM10gPSBhbXJfd2Jfcm91bmQoLUxfdG1wNCk7CisgICAgfQorCisKKyAgICAvKiBVcGRhdGUgbWVtb3J5IGlmIHJlcXVpcmVkICovCisKKyAgICBpZiAodXBkYXRlKQorICAgIHsKKyAgICAgICAgcHZfbWVtY3B5KG1lbSwgJnlbbGcgLSBtXSwgbSpzaXplb2YoKnkpKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBGVU5DVElPTiBDT0RFCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBTeW5fZmlsdF8zMigKKyAgICBpbnQxNiBhW10sICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovCisgICAgaW50MTYgbSwgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLworICAgIGludDE2IGV4Y1tdLCAgICAgICAgICAgIC8qIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykgICAgKi8KKyAgICBpbnQxNiBRbmV3LCAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovCisgICAgaW50MTYgc2lnX2hpW10sICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLworICAgIGludDE2IHNpZ19sb1tdLCAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgbG93ICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQxNiBsZyAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovCispCit7CisgICAgaW50MTYgaSwgaywgYTA7CisgICAgaW50MzIgTF90bXAxOworICAgIGludDMyIExfdG1wMjsKKyAgICBpbnQzMiBMX3RtcDM7CisgICAgaW50MzIgTF90bXA0OworCisgICAgYTAgPSA5IC0gUW5ldzsgICAgICAgIC8qIGlucHV0IC8gMTYgYW5kID4+UW5ldyAqLworCisgICAgLyogRG8gdGhlIGZpbHRlcmluZy4gKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZyA+PiAxOyBpKyspCisgICAgeworCisgICAgICAgIExfdG1wMyA9IDA7CisgICAgICAgIExfdG1wNCA9IDA7CisKKyAgICAgICAgTF90bXAxID0gZnhwX211bF8xNmJ5MTYoc2lnX2xvWyhpPDwxKSAtIDFdLCBhWzFdKTsKKyAgICAgICAgTF90bXAyID0gZnhwX211bF8xNmJ5MTYoc2lnX2hpWyhpPDwxKSAtIDFdLCBhWzFdKTsKKworICAgICAgICBmb3IgKGsgPSAyOyBrIDwgbTsgayArPSAyKQorICAgICAgICB7CisKKyAgICAgICAgICAgIExfdG1wMSA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSktMSAtIGtdLCBhW2srMV0sIExfdG1wMSk7CisgICAgICAgICAgICBMX3RtcDIgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpLTEgLSBrXSwgYVtrKzFdLCBMX3RtcDIpOworICAgICAgICAgICAgTF90bXAxID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSAgIC0ga10sIGFbayAgXSwgTF90bXAxKTsKKyAgICAgICAgICAgIExfdG1wMiA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkgICAtIGtdLCBhW2sgIF0sIExfdG1wMik7CisgICAgICAgICAgICBMX3RtcDMgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpICAgLSBrXSwgYVtrKzFdLCBMX3RtcDMpOworICAgICAgICAgICAgTF90bXA0ID0gZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSAgIC0ga10sIGFbaysxXSwgTF90bXA0KTsKKyAgICAgICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkrMSAtIGtdLCBhW2sgIF0sIExfdG1wMyk7CisgICAgICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpKzEgLSBrXSwgYVtrICBdLCBMX3RtcDQpOworICAgICAgICB9CisKKyAgICAgICAgTF90bXAxID0gLWZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkgICAtIGtdLCBhW2tdLCBMX3RtcDEpOworICAgICAgICBMX3RtcDMgPSAgZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSsxIC0ga10sIGFba10sIExfdG1wMyk7CisgICAgICAgIExfdG1wMiA9ICBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpICAgLSBrXSwgYVtrXSwgTF90bXAyKTsKKyAgICAgICAgTF90bXA0ID0gIGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkrMSAtIGtdLCBhW2tdLCBMX3RtcDQpOworCisKKworICAgICAgICBMX3RtcDEgPj49IDExOyAgICAgIC8qIC00IDogc2lnX2xvW2ldIDw8IDQgKi8KKworICAgICAgICBpbnQ2NCBzaWdfdG1wOworICAgICAgICBzaWdfdG1wID0gKGludDY0KUxfdG1wMSArIChpbnQzMikoZXhjWyhpPDwxKV0gPDwgYTApOworICAgICAgICBMX3RtcDEgPSAoaW50MzIpKHNpZ190bXAgLSAoTF90bXAyIDw8IDEpKTsKKworICAgICAgICAvKiBzaWdfaGkgPSBiaXQxNiB0byBiaXQzMSBvZiBzeW50aGVzaXMgKi8KKyAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgMyk7ICAgICAgICAgICAvKiBhaSBpbiBRMTIgKi8KKworICAgICAgICBzaWdfaGlbKGk8PDEpXSA9IChpbnQxNikoTF90bXAxID4+IDE2KTsKKworICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNigoaW50MTYpKExfdG1wMSA+PiAxNiksIGFbMV0sIExfdG1wNCk7CisKKyAgICAgICAgLyogc2lnX2xvID0gYml0NCB0byBiaXQxNSBvZiBzeW50aGVzaXMgKi8KKyAgICAgICAgLyogTF90bXAxID4+PSA0IDogc2lnX2xvW2ldID4+IDQgKi8KKyAgICAgICAgc2lnX2xvWyhpPDwxKV0gPSAoaW50MTYpKChMX3RtcDEgPj4gNCkgLSAoKExfdG1wMSA+PiAxNikgPDwgMTIpKTsKKworICAgICAgICBMX3RtcDMgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpXSwgYVsxXSwgTF90bXAzKTsKKyAgICAgICAgTF90bXAzID0gLUxfdG1wMyA+PiAxMTsKKworICAgICAgICBzaWdfdG1wID0gKGludDY0KUxfdG1wMyArIChpbnQzMikoZXhjWyhpPDwxKSsxXSA8PCBhMCk7CisgICAgICAgIExfdG1wMyA9IChpbnQzMikoc2lnX3RtcCAtIChMX3RtcDQgPDwgMSkpOworICAgICAgICAvKiBzaWdfaGkgPSBiaXQxNiB0byBiaXQzMSBvZiBzeW50aGVzaXMgKi8KKyAgICAgICAgTF90bXAzID0gc2hsX2ludDMyKExfdG1wMywgMyk7ICAgICAgICAgICAvKiBhaSBpbiBRMTIgKi8KKyAgICAgICAgc2lnX2hpWyhpPDwxKSsxXSA9IChpbnQxNikoTF90bXAzID4+IDE2KTsKKworICAgICAgICAvKiBzaWdfbG8gPSBiaXQ0IHRvIGJpdDE1IG9mIHN5bnRoZXNpcyAqLworICAgICAgICAvKiBMX3RtcDEgPj49IDQgOiBzaWdfbG9baV0gPj4gNCAqLworICAgICAgICBzaWdfbG9bKGk8PDEpKzFdID0gKGludDE2KSgoTF90bXAzID4+IDQpIC0gKHNpZ19oaVsoaTw8MSkrMV0gPDwgMTIpKTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy9zcmMvd2VpZ2h0X2FtcndiX2xwYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2VpZ2h0X2FtcndiX2xwYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvc3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FtcndiRGVjVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FtcndiRGVjVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNvZGVyVGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDBjOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9kZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1yd2JEZWNvZGVyVGVzdCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJ3YkRlY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZGVjL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9kZWMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L2FtcndiZGVjX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L2FtcndiZGVjX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9hbXJ3YmRlY190ZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2RlYy90ZXN0L2FtcndiZGVjX3Rlc3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3MmViNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDE2NiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9hdXRvY29yci5jIiwKKyAgICAgICAgInNyYy9hel9pc3AuYyIsCisgICAgICAgICJzcmMvYml0cy5jIiwKKyAgICAgICAgInNyYy9jMnQ2NGZ4LmMiLAorICAgICAgICAic3JjL2M0dDY0ZnguYyIsCisgICAgICAgICJzcmMvY29udm9sdmUuYyIsCisgICAgICAgICJzcmMvY29yX2hfeC5jIiwKKyAgICAgICAgInNyYy9kZWNpbTU0LmMiLAorICAgICAgICAic3JjL2RlZW1waC5jIiwKKyAgICAgICAgInNyYy9kdHguYyIsCisgICAgICAgICJzcmMvZ19waXRjaC5jIiwKKyAgICAgICAgInNyYy9ncGNsaXAuYyIsCisgICAgICAgICJzcmMvaG9taW5nLmMiLAorICAgICAgICAic3JjL2hwNDAwLmMiLAorICAgICAgICAic3JjL2hwNTAuYyIsCisgICAgICAgICJzcmMvaHA2ay5jIiwKKyAgICAgICAgInNyYy9ocF93c3AuYyIsCisgICAgICAgICJzcmMvaW50X2xwYy5jIiwKKyAgICAgICAgInNyYy9pc3BfYXouYyIsCisgICAgICAgICJzcmMvaXNwX2lzZi5jIiwKKyAgICAgICAgInNyYy9sYWdfd2luZC5jIiwKKyAgICAgICAgInNyYy9sZXZpbnNvbi5jIiwKKyAgICAgICAgInNyYy9sb2cyLmMiLAorICAgICAgICAic3JjL2xwX2RlYzIuYyIsCisgICAgICAgICJzcmMvbWF0aF9vcC5jIiwKKyAgICAgICAgInNyYy9vcGVyXzMyYi5jIiwKKyAgICAgICAgInNyYy9wX21lZF9vbC5jIiwKKyAgICAgICAgInNyYy9waXRfc2hycC5jIiwKKyAgICAgICAgInNyYy9waXRjaF9mNC5jIiwKKyAgICAgICAgInNyYy9wcmVkX2x0NC5jIiwKKyAgICAgICAgInNyYy9wcmVlbXBoLmMiLAorICAgICAgICAic3JjL3FfZ2FpbjIuYyIsCisgICAgICAgICJzcmMvcV9wdWxzZS5jIiwKKyAgICAgICAgInNyYy9xaXNmX25zLmMiLAorICAgICAgICAic3JjL3FwaXNmXzJzLmMiLAorICAgICAgICAic3JjL3JhbmRvbS5jIiwKKyAgICAgICAgInNyYy9yZXNpZHUuYyIsCisgICAgICAgICJzcmMvc2NhbGUuYyIsCisgICAgICAgICJzcmMvc3RyZWFtLmMiLAorICAgICAgICAic3JjL3N5bl9maWx0LmMiLAorICAgICAgICAic3JjL3VwZHRfdGFyLmMiLAorICAgICAgICAic3JjL3V0aWwuYyIsCisgICAgICAgICJzcmMvdm9BTVJXQkVuYy5jIiwKKyAgICAgICAgInNyYy92b2ljZWZhYy5jIiwKKyAgICAgICAgInNyYy93Yl92YWQuYyIsCisgICAgICAgICJzcmMvd2VpZ2h0X2EuYyIsCisgICAgICAgICJzcmMvbWVtX2FsaWduLmMiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgc3JjczogWworICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIiwKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucyIsCisgICAgICAgICAgICBdLAorCisgICAgICAgICAgICBjZmxhZ3M6IFsKKyAgICAgICAgICAgICAgICAiLURBUk0iLAorICAgICAgICAgICAgICAgICItREFTTV9PUFQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMvYXNtL0FSTVY1RSJdLAorCisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorCisgICAgICAgICAgICBuZW9uOiB7CisgICAgICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMiLAorICAgICAgICAgICAgICAgIF0sCisKKyAgICAgICAgICAgICAgICBzcmNzOiBbCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucyIsCisgICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMiLAorICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMiLAorICAgICAgICAgICAgICAgIF0sCisKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBnZW5lcmF0ZSBuZW9uIGluc3RydWN0aW9ucywgc2VlIGJ1ZyAyNjkzMjk4MAorICAgICAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICAgICAiLURBUk1WNyIsCisgICAgICAgICAgICAgICAgICAgICItbWZwdT12ZnB2MyIsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFIiwKKyAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjciLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvTk9USUNFIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NDgzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ3IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX2FtcndiX2VuY19TYW1wbGVDb2RlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfU2FtcGxlQ29kZV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQU1SV0JFbmNUZXN0IiwKKyAgICBndGVzdDogZmFsc2UsCisKKyAgICBzcmNzOiBbIkFNUldCX0VfU0FNUExFLmMiXSwKKworICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9OT1RJQ0UgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL1NhbXBsZUNvZGUvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvU2FtcGxlQ29kZS9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZThiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYworeworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkFtcndiRW5jb2RlclRlc3QifQorCisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvZG9jL3ZvQU1SV0JFbmNvZGVyU0RLLnBkZgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9kb2Mvdm9BTVJXQkVuY29kZXJTREsucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGZhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZW5jX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfYW1yd2JfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJ3Yl9lbmNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImFtcndiX2VuY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2ZiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIGVuY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUi1XQiBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0FNUi1XQiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBGcmFtZSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGZyYW1lVHlwZWApCisyLiBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYG1vZGVgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGZyYW1lVHlwZWAgfCAwLiBgVk9BTVJXQl9ERUZBVUxUYCAxLiBgVk9BTVJXQl9JVFVgIDIuIGBWT0FNUldCX1JGQzMyNjdgIHwgQml0cyAwLCAxIGFuZCAyIG9mIDFzdCBieXRlIG9mIGRhdGEuIHwKK3wgYG1vZGVgICAgfCAwLiBgVk9BTVJXQl9NRDY2YCAxLiBgVk9BTVJXQl9NRDg4NWAgMi4gYFZPQU1SV0JfTUQxMjY1YCAzLiBgVk9BTVJXQl9NRDE0MjVgICA0LiBgVk9BTVJXQl9NRDE1ODUgYCA1LiBgVk9BTVJXQl9NRDE4MjVgIDYuIGBWT0FNUldCX01EMTk4NWAgNy4gYFZPQU1SV0JfTUQyMzA1YCA4LiBgVk9BTVJXQl9NRDIzODVgIDkuIGBWT0FNUldCX05fTU9ERVNgIHwgQml0cyA0LCA1LCA2IGFuZCA3IG9mIDFzdCBieXRlIG9mIGRhdGEuIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCitJZiB0aGUgZW5jb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBmcmFtZSBzaXplLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBzdGlsbCBhZHZhbmNlZCBieSBmcmFtZSBzaXplIHNvCit0aGF0IHRoZSBmdXp6ZXIgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBhbXJ3Yl9lbmNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJ3Yl9lbmNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgcGNtIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2FtcndiX2VuY19mdXp6ZXIvYW1yd2JfZW5jX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9hbXJ3Yl9lbmNfZnV6emVyL2FtcndiX2VuY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvYW1yd2JfZW5jX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2Z1enplci9hbXJ3Yl9lbmNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzczYTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9mdXp6ZXIvYW1yd2JfZW5jX2Z1enplci5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisjaW5jbHVkZSAiY25zdC5oIgorCit0eXBlZGVmIGludChWT19BUEkgKlZPR0VUQVVESU9FTkNBUEkpKFZPX0FVRElPX0NPREVDQVBJICpwRW5jSGFuZGxlKTsKK2NvbnN0IGludDMyX3Qga0lucHV0QnVmZmVyU2l6ZSA9IExfRlJBTUUxNmsgKiBzaXplb2YoaW50MTZfdCkgKiAyOworY29uc3QgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDIgKiBrSW5wdXRCdWZmZXJTaXplOworY29uc3QgaW50MzJfdCBrTW9kZXNbXSA9IHtWT0FNUldCX01ENjYgLyogNi42MGticHMgKi8sICAgIFZPQU1SV0JfTUQ4ODUgLyogOC44NWticHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZPQU1SV0JfTUQxMjY1IC8qIDEyLjY1a2JwcyAqLywgVk9BTVJXQl9NRDE0MjUgLyogMTQuMjVrYnBzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWT0FNUldCX01EMTU4NSAvKiAxNS44NWticHMgKi8sIFZPQU1SV0JfTUQxODI1IC8qIDE4LjI1a2JwcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVk9BTVJXQl9NRDE5ODUgLyogMTkuODVrYnBzICovLCBWT0FNUldCX01EMjMwNSAvKiAyMy4wNWticHMgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZPQU1SV0JfTUQyMzg1IC8qIDIzLjg1a2JwcyAqLywgVk9BTVJXQl9OX01PREVTIC8qIEludmFsaWQgTW9kZSAqL307Citjb25zdCBWT0FNUldCRlJBTUVUWVBFIGtGcmFtZVR5cGVzW10gPSB7Vk9BTVJXQl9ERUZBVUxULCBWT0FNUldCX0lUVSwgVk9BTVJXQl9SRkMzMjY3fTsKKworY2xhc3MgQ29kZWMgeworICAgcHVibGljOgorICAgIENvZGVjKCkgPSBkZWZhdWx0OworICAgIH5Db2RlYygpIHsgZGVJbml0RW5jb2RlcigpOyB9CisgICAgYm9vbCBpbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIGRlSW5pdEVuY29kZXIoKTsKKyAgICB2b2lkIGVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgVk9fQVVESU9fQ09ERUNBUEkgKm1BcGlIYW5kbGUgPSBudWxscHRyOworICAgIFZPX01FTV9PUEVSQVRPUiAqbU1lbU9wZXJhdG9yID0gbnVsbHB0cjsKKyAgICBWT19IQU5ETEUgbUVuY29kZXJIYW5kbGUgPSBudWxscHRyOworfTsKKworYm9vbCBDb2RlYzo6aW5pdEVuY29kZXIoY29uc3QgdWludDhfdCAqZGF0YSkgeworICAgIHVpbnQ4X3Qgc3RhcnRCeXRlID0gKmRhdGE7CisgICAgaW50MzJfdCBtb2RlID0ga01vZGVzWyhzdGFydEJ5dGUgPj4gNCkgJSAxMF07CisgICAgVk9BTVJXQkZSQU1FVFlQRSBmcmFtZVR5cGUgPSBrRnJhbWVUeXBlc1tzdGFydEJ5dGUgJSAzXTsKKyAgICBtTWVtT3BlcmF0b3IgPSBuZXcgVk9fTUVNX09QRVJBVE9SOworICAgIGlmICghbU1lbU9wZXJhdG9yKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtTWVtT3BlcmF0b3ItPkFsbG9jID0gY21uTWVtQWxsb2M7CisgICAgbU1lbU9wZXJhdG9yLT5Db3B5ID0gY21uTWVtQ29weTsKKyAgICBtTWVtT3BlcmF0b3ItPkZyZWUgPSBjbW5NZW1GcmVlOworICAgIG1NZW1PcGVyYXRvci0+U2V0ID0gY21uTWVtU2V0OworICAgIG1NZW1PcGVyYXRvci0+Q2hlY2sgPSBjbW5NZW1DaGVjazsKKworICAgIFZPX0NPREVDX0lOSVRfVVNFUkRBVEEgdXNlckRhdGE7CisgICAgbWVtc2V0KCZ1c2VyRGF0YSwgMCwgc2l6ZW9mKHVzZXJEYXRhKSk7CisgICAgdXNlckRhdGEubWVtZmxhZyA9IFZPX0lNRl9VU0VSTUVNT1BFUkFUT1I7CisgICAgdXNlckRhdGEubWVtRGF0YSA9IChWT19QVFIpbU1lbU9wZXJhdG9yOworCisgICAgbUFwaUhhbmRsZSA9IG5ldyBWT19BVURJT19DT0RFQ0FQSTsKKyAgICBpZiAoIW1BcGlIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gdm9HZXRBTVJXQkVuY0FQSShtQXBpSGFuZGxlKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+SW5pdCgmbUVuY29kZXJIYW5kbGUsIFZPX0FVRElPX0NvZGluZ0FNUldCLCAmdXNlckRhdGEpKSB7CisgICAgICAgIC8vIEZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0obUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEUsICZmcmFtZVR5cGUpKSB7CisgICAgICAgIC8vIEZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBmcmFtZSB0eXBlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKFZPX0VSUl9OT05FICE9IG1BcGlIYW5kbGUtPlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfTU9ERSwgJm1vZGUpKSB7CisgICAgICAgIC8vIEZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBtb2RlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdEVuY29kZXIoKSB7CisgICAgaWYgKG1FbmNvZGVySGFuZGxlKSB7CisgICAgICAgIG1BcGlIYW5kbGUtPlVuaW5pdChtRW5jb2RlckhhbmRsZSk7CisgICAgICAgIG1FbmNvZGVySGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1BcGlIYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1BcGlIYW5kbGU7CisgICAgICAgIG1BcGlIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU1lbU9wZXJhdG9yKSB7CisgICAgICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7CisgICAgICAgIG1NZW1PcGVyYXRvciA9IG51bGxwdHI7CisgICAgfQorfQorCit2b2lkIENvZGVjOjplbmNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBkbyB7CisgICAgICAgIGludDMyX3QgbWluU2l6ZSA9IHN0ZDo6bWluKChpbnQzMl90KXNpemUsIGtJbnB1dEJ1ZmZlclNpemUpOworICAgICAgICB1aW50OF90IG91dHB1dEJ1ZltrT3V0cHV0QnVmZmVyU2l6ZV0gPSB7fTsKKyAgICAgICAgVk9fQ09ERUNCVUZGRVIgaW5EYXRhOworICAgICAgICBWT19DT0RFQ0JVRkZFUiBvdXREYXRhOworICAgICAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dEZvcm1hdDsKKyAgICAgICAgaW5EYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKyAgICAgICAgaW5EYXRhLkxlbmd0aCA9IG1pblNpemU7CisgICAgICAgIG91dERhdGEuQnVmZmVyID0gb3V0cHV0QnVmOworICAgICAgICBtQXBpSGFuZGxlLT5TZXRJbnB1dERhdGEobUVuY29kZXJIYW5kbGUsICZpbkRhdGEpOworICAgICAgICBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmb3V0RGF0YSwgJm91dEZvcm1hdCk7CisgICAgICAgIGRhdGEgKz0gbWluU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBtaW5TaXplOworICAgIH0gd2hpbGUgKHNpemUgPiAwKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGNvZGVjLT5pbml0RW5jb2RlcihkYXRhKSkgeworICAgICAgICAvLyBDb25zdW1lIGZpcnN0IGJ5dGUKKyAgICAgICAgKytkYXRhOworICAgICAgICAtLXNpemU7CisgICAgICAgIGNvZGVjLT5lbmNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGRlbGV0ZSBjb2RlYzsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYWNlbHAuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2FjZWxwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvYWNlbHAuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvYWNlbHAuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iYXNpY19vcC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvYmFzaWNfb3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iYXNpY19vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9iYXNpY19vcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2JpdHMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2JpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9iaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2JpdHMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9jbnN0LmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9jbnN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY25zdC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9jbnN0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY29kX21haW4uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2NvZF9tYWluLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvY29kX21haW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvY29kX21haW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9kdHguaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2R0eC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2R0eC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9kdHguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9ncmlkMTAwLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2dyaWQxMDAudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2dyaWQxMDAudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9ncmlkMTAwLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9oYW1fd2luZC50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9oYW1fd2luZC50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaGFtX3dpbmQudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9oYW1fd2luZC50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaG9taW5nLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2hvbWluZy50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvaG9taW5nLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvaG9taW5nLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9pc3BfaXNmLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2lzcF9pc2YudGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2lzcF9pc2YudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9pc3BfaXNmLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9sYWdfd2luZC50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9sYWdfd2luZC50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbGFnX3dpbmQudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9sYWdfd2luZC50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbG9nMi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbG9nMi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbG9nMi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzJfdGFiLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9sb2cyX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL2xvZzJfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL2xvZzJfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvbWFpbi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWFpbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21haW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvbWFpbi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21hdGhfb3AuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21hdGhfb3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tYXRoX29wLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21hdGhfb3AuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9tZW1fYWxpZ24uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21lbV9hbGlnbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21lbV9hbGlnbi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9tZW1fYWxpZ24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9taW1lX2lvLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL21pbWVfaW8udGFiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL21pbWVfaW8udGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9taW1lX2lvLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9vcGVyXzMyYi5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvb3Blcl8zMmIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9vcGVyXzMyYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9vcGVyXzMyYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3BfbWVkX28uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3BfbWVkX28uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3BfbWVkX28uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9wX21lZF9vbC50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vbC50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcF9tZWRfb2wudGFiCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9wX21lZF9vbC50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9nYWluMi50YWIgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9xX2dhaW4yLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xX2dhaW4yLnRhYgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcV9nYWluMi50YWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcV9wdWxzZS5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcV9wdWxzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FfcHVsc2UuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcV9wdWxzZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3Fpc2ZfbnMudGFiIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvcWlzZl9ucy50YWIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvcWlzZl9ucy50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3Fpc2ZfbnMudGFiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3FwaXNmXzJzLnRhYiBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FwaXNmXzJzLnRhYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9xcGlzZl8ycy50YWIKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3FwaXNmXzJzLnRhYgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy9zdHJlYW0uaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3N0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3N0cmVhbS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy9zdHJlYW0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy90eXBlZGVmLmggYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy90eXBlZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy90eXBlZGVmLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZnMuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3R5cGVkZWZzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9pbmMvdHlwZWRlZnMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvdHlwZWRlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWQuaCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvaW5jL3diX3ZhZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvaW5jL3diX3ZhZC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy93Yl92YWQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWRfYy5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9pbmMvd2JfdmFkX2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL2luYy93Yl92YWRfYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL2luYy93Yl92YWRfYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9EZWVtcGhfMzJfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvRG90X3Bfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9GaWx0XzZrXzdrX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9Ob3JtX0NvcnJfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL1N5bl9maWx0XzMyX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvY29udm9sdmVfb3B0LnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvY29yX2hfdmVjX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9wcmVkX2x0NF8xX29wdC5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjVFL3N5bl9maWx0X29wdC5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRGVlbXBoXzMyX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0RlZW1waF8zMl9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9Eb3RfcF9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L0RvdF9wX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L0ZpbHRfNmtfN2tfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvTm9ybV9Db3JyX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L05vcm1fQ29ycl9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L1N5bl9maWx0XzMyX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvY29udm9sdmVfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9jb3JfaF92ZWNfbmVvbi5zCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9wcmVkX2x0NF8xX25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3Jlc2lkdV9hc21fbmVvbi5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvcmVzaWR1X2FzbV9uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hc20vQVJNVjcvc2NhbGVfc2lnX25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXNtL0FSTVY3L3N5bl9maWx0X25lb24ucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXV0b2NvcnIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9hdXRvY29yci5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9hdXRvY29yci5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2F6X2lzcC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYXpfaXNwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYXpfaXNwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2F6X2lzcC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2JpdHMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2JpdHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9iaXRzLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2JpdHMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9jMnQ2NGZ4LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9jMnQ2NGZ4LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzJ0NjRmeC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9jMnQ2NGZ4LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzR0NjRmeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvYzR0NjRmeC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9jb252b2x2ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2NvbnZvbHZlLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2NvbnZvbHZlLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvY29yX2hfeC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvY29yX2hfeC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2Nvcl9oX3guYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvY29yX2hfeC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlY2ltNTQuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2RlY2ltNTQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWNpbTU0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2RlY2ltNTQuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kZWVtcGguYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2RlZW1waC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2RlZW1waC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kZWVtcGguYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9kdHguYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2R0eC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2R0eC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9kdHguYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9nX3BpdGNoLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9nX3BpdGNoLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ19waXRjaC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9nX3BpdGNoLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvZ3BjbGlwLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ncGNsaXAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ncGNsaXAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvZ3BjbGlwLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaG9taW5nLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ob21pbmcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ob21pbmcuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaG9taW5nLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwNDAwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA0MDAuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA0MDAuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9ocDUwLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocDUwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA1MC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9ocDUwLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHA2ay5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA2ay5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwNmsuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHA2ay5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2hwX3dzcC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvaHBfd3NwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaHBfd3NwLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2hwX3dzcC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2ludF9scGMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2ludF9scGMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pbnRfbHBjLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2ludF9scGMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfYXouYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2lzcF9hei5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2lzcF9hei5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pc3BfYXouYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9pc3BfaXNmLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pc3BfaXNmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvaXNwX2lzZi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9pc3BfaXNmLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGFnX3dpbmQuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xhZ193aW5kLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbGFnX3dpbmQuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbGFnX3dpbmQuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sZXZpbnNvbi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbGV2aW5zb24uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sZXZpbnNvbi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9sZXZpbnNvbi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2xvZzIuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xvZzIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9sb2cyLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL2xvZzIuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9scF9kZWMyLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9scF9kZWMyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbHBfZGVjMi5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9scF9kZWMyLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWF0aF9vcC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbWF0aF9vcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21hdGhfb3AuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbWF0aF9vcC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL21lbV9hbGlnbi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvbWVtX2FsaWduLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvbWVtX2FsaWduLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL21lbV9hbGlnbi5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL29wZXJfMzJiLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9vcGVyXzMyYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL29wZXJfMzJiLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL29wZXJfMzJiLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcF9tZWRfb2wuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BfbWVkX29sLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcF9tZWRfb2wuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcF9tZWRfb2wuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRfc2hycC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcGl0X3NocnAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9waXRfc2hycC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9waXRfc2hycC5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9waXRjaF9mNC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3BpdGNoX2Y0LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3BpdGNoX2Y0LmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZF9sdDQuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ByZWRfbHQ0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZF9sdDQuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZF9sdDQuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZW1waC5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcHJlZW1waC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Mzg0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9wcmVlbXBoLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KKyAqKgorICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqKgorICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICBGaWxlOiBwcmVlbXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgIERlc2NyaXB0aW9uOiBQcmVlbXBoYXNpczogZmlsdGVyaW5nIHRocm91Z2ggMSAtIGcgel4tMSAgICAgICAgICoKKyogICAgICAgICAgICAgIFByZWVtcGgyIC0tPiBzaWduYWwgaXMgbXVsdGlwbGllZCBieSAyICAgICAgICAgICAgICoKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0eXBlZGVmLmgiCisjaW5jbHVkZSAiYmFzaWNfb3AuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBQcmVlbXBoKAorICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLworICAgICAgICBXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBwcmVlbXBoYXNpcyBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAqLworICAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICApCit7CisgICAgV29yZDE2IHRlbXA7CisgICAgV29yZDMyIGksIExfdG1wOworCisgICAgdGVtcCA9IHhbbGcgLSAxXTsKKworICAgIGZvciAoaSA9IGxnIC0gMTsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFtpXSk7CisgICAgICAgIExfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsKKyAgICAgICAgeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworICAgIH0KKworICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7CisgICAgTF90bXAgLT0gKCgqbWVtKSAqIG11KTw8MTsKKyAgICB4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisKKyAgICAqbWVtID0gdGVtcDsKKworICAgIHJldHVybjsKK30KKworCit2b2lkIFByZWVtcGgyKAorICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLworICAgICAgICBXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBwcmVlbXBoYXNpcyBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAqLworICAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgKQoreworICAgIFdvcmQxNiB0ZW1wOworICAgIFdvcmQzMiBpLCBMX3RtcDsKKworICAgIHRlbXAgPSB4W2xnIC0gMV07CisKKyAgICBmb3IgKGkgPSAoV29yZDE2KSAobGcgLSAxKTsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFtpXSk7CisgICAgICAgIExfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsgLy8gb25seSBjYWxsZWQgd2l0aCBtdSA9PSAyMjI4Miwgc28gdGhpcyB3b24ndCBvdmVyZmxvdworICAgICAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLyAyKSB7CisgICAgICAgICAgICBMX3RtcCA9IElOVDMyX01BWCAvIDI7CisgICAgICAgIH0KKyAgICAgICAgTF90bXAgPSAoTF90bXAgPDwgMSk7CisgICAgICAgIGlmIChMX3RtcCA+IElOVDMyX01BWCAtIDB4ODAwMCkgeworICAgICAgICAgICAgTF90bXAgPSBJTlQzMl9NQVggLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OworICAgIH0KKworICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7CisgICAgTF90bXAgLT0gKCgqbWVtKSAqIG11KTw8MTsKKyAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLyAyKSB7CisgICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC8gMjsKKyAgICB9CisgICAgTF90bXAgPSAoTF90bXAgPDwgMSk7CisgICAgaWYgKExfdG1wID4gSU5UMzJfTUFYIC0gMHg4MDAwKSB7CisgICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC0gMHg4MDAwOworICAgIH0KKyAgICB4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7CisKKyAgICAqbWVtID0gdGVtcDsKKworICAgIHJldHVybjsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9nYWluMi5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9nYWluMi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3FfZ2FpbjIuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcV9nYWluMi5jCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX3B1bHNlLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xX3B1bHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3YjZmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3FfcHVsc2UuYwpAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgorICoqCisgKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoqCisgKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgIEZpbGU6IHFfcHVsc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICBEZXNjcmlwdGlvbjogQ29kaW5nIGFuZCBkZWNvZGluZyBvZiBhbGdlYnJhaWMgY29kZWJvb2sgICAgICAgICAgKgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInR5cGVkZWYuaCIKKyNpbmNsdWRlICJiYXNpY19vcC5oIgorI2luY2x1ZGUgInFfcHVsc2UuaCIKKworI2RlZmluZSBOQl9QT1MgMTYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvcyBpbiB0cmFjaywgbWFzayBmb3Igc2lnbiBiaXQgKi8KKyNkZWZpbmUgVU5VU0VEX1ZBUiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCitXb3JkMzIgcXVhbnRfMXBfTjEoICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiBOKzEgYml0cyAgICAgICAgICAgICAqLworICAgICAgICBXb3JkMTYgcG9zLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgICAgICAgKi8KKyAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCit7CisgICAgV29yZDE2IG1hc2s7CisgICAgV29yZDMyIGluZGV4OworCisgICAgbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiBRdWFudGl6YXRpb24gb2YgMSBwdWxzZSB3aXRoIE4rMSBiaXRzOiAgICAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpbmRleCA9IExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MgJiBtYXNrKSk7CisgICAgaWYgKChwb3MgJiBOQl9QT1MpICE9IDApCisgICAgeworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBMX2RlcG9zaXRfbCgxIDw8IE4pKTsgICAvKiBpbmRleCArPSAxIDw8IE47ICovCisgICAgfQorICAgIHJldHVybiAoaW5kZXgpOworfQorCisKK1dvcmQzMiBxdWFudF8ycF8yTjEoICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICgyKk4pKzEgYml0cyAgICAgICAgICovCisgICAgICAgIFdvcmQxNiBwb3MxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMiAgICAgKi8KKyAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCit7CisgICAgV29yZDE2IG1hc2ssIHRtcDsKKyAgICBXb3JkMzIgaW5kZXg7CisgICAgbWFzayA9ICgxIDw8IE4pIC0gMTsgICAgICAgICAgICAgIC8qIG1hc2sgPSAoKDE8PE4pLTEpOyAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiBRdWFudGl6YXRpb24gb2YgMiBwdWxzZXMgd2l0aCAyKk4rMSBiaXRzOiAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChwb3MyIF4gcG9zMSkgJiBOQl9QT1MpID09IDApCisgICAgeworICAgICAgICAvKiBzaWduIG9mIDFzdCBwdWxzZSA9PSBzaWduIG9mIDJ0aCBwdWxzZSAqLworICAgICAgICBpZihwb3MxIDw9IHBvczIpICAgICAgICAgIC8qICgocG9zMSAtIHBvczIpIDw9IDApICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMiAmIG1hc2spKSkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMSAmIG1hc2spKSkpOworICAgICAgICB9CisgICAgICAgIGlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7ICAgICAgIC8qIGluZGV4ICs9IDEgPDwgKDIqTik7ICovCisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIC8qIHNpZ24gb2YgMXN0IHB1bHNlICE9IHNpZ24gb2YgMnRoIHB1bHNlICovCisgICAgICAgIGlmICh2b19zdWIoKFdvcmQxNikgKHBvczEgJiBtYXNrKSwgKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPD0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaW5kZXggPSAoKHBvczIgJiBtYXNrKSA8PCBOKSArIChwb3MxICYgbWFzayk7ICovCisgICAgICAgICAgICBpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMiAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MxICYgbWFzaykpKSk7CisgICAgICAgICAgICBpZiAoKHBvczIgJiBOQl9QT1MpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7ICAgICAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLworICAgICAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsICgxTCA8PCB0bXApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MxICYgbWFzaykgPDwgTikgKyAocG9zMiAmIG1hc2spOyAgICAgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsKKyAgICAgICAgICAgIGlmICgocG9zMSAmIE5CX1BPUykgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0bXAgPSAoTiA8PCAxKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMSA8PCB0bXApKTsgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCitXb3JkMzIgcXVhbnRfM3BfM04xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMypOKSsxIGJpdHMgICAgICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCisgICAgICAgIFdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLworICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KK3sKKyAgICBXb3JkMTYgbmJfcG9zOworICAgIFdvcmQzMiBpbmRleDsKKworICAgIG5iX3BvcyA9KDEgPDwoTiAtIDEpKTsgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8KE4tMSkpOyAqLworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAgICAgKiBRdWFudGl6YXRpb24gb2YgMyBwdWxzZXMgd2l0aCAzKk4rMSBiaXRzOiAgICAgICAgICAgICAqCisgICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApCisgICAgeworICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCisgICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7CisgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczMsIE4pIDw8ICgyKk4pOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMywgTik8PChOIDw8IDEpKSk7CisKKyAgICB9IGVsc2UgaWYgKCgocG9zMSBeIHBvczMpICYgbmJfcG9zKSA9PSAwKQorICAgIHsKKyAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMywgKE4tMSkpOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7CisgICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMiwgTikgPDwgKE4gPDwgMSkpKTsKKyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zMiwgTikgPDwKKyAgICAgICAgICogKDIqTik7ICovCisgICAgfSBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4tMSkpOyAqLworICAgICAgICAvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsgICAgICAgICAgICAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczIgJiBuYl9wb3MpKSA8PCBOKSk7CisgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczEsIE4pIDw8ICgyKk4pOyAgICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoTiA8PCAxKSkpOworICAgIH0KKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCitXb3JkMzIgcXVhbnRfNHBfNE4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoNCpOKSsxIGJpdHMgICAgICAgICAqLworICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCisgICAgICAgIFdvcmQxNiBwb3MzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAzICAgICAqLworICAgICAgICBXb3JkMTYgcG9zNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgNCAgICAgKi8KKyAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCit7CisgICAgV29yZDE2IG5iX3BvczsKKyAgICBXb3JkMzIgaW5kZXg7CisKKyAgICBuYl9wb3MgPSAxIDw8IChOIC0gMSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICAgICAqIFF1YW50aXphdGlvbiBvZiA0IHB1bHNlcyB3aXRoIDQqTisxIGJpdHM6ICAgICAgICAgICAgICoKKyAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmICgoKHBvczEgXiBwb3MyKSAmIG5iX3BvcykgPT0gMCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczIsIChOLTEpKTsgKi8KKyAgICAgICAgLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICAgICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsKKyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8ICgyKk4pOyAqLworICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczMsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7CisgICAgfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOIC0gMSkpOworICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOworICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zNCwgTikgPDwgKDIqTik7ICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8ycF8yTjEocG9zMiwgcG9zNCwgTikgPDwgKE4gPDwgMSkpKTsKKyAgICB9IGVsc2UKKyAgICB7CisgICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOIC0gMSkpOworICAgICAgICAvKiBpbmRleCArPSAocG9zMiAmIG5iX3BvcykgPDwgTjsgKi8KKyAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOworICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zNCwgTikgPDwgKDIqTik7ICovCisgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF8ycF8yTjEocG9zMSwgcG9zNCwgTikgPDwgKE4gPDwgMSkpKTsKKyAgICB9CisgICAgcmV0dXJuIChpbmRleCk7Cit9CisKKworV29yZDMyIHF1YW50XzRwXzROKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNCpOIGJpdHMgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjQgICovCisgICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLworeworICAgIFdvcmQxNiBuYl9wb3MsIG1hc2sgVU5VU0VEX1ZBUiwgbl8xLCB0bXA7CisgICAgV29yZDE2IHBvc0FbNF0sIHBvc0JbNF07CisgICAgV29yZDMyIGksIGosIGssIGluZGV4OworCisgICAgbl8xID0gKFdvcmQxNikgKE4gLSAxKTsKKyAgICBuYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLworICAgIG1hc2sgPSB2b19zdWIoKDEgPDwgTiksIDEpOyAgICAgICAgICAgICAgLyogbWFzayA9ICgoMTw8TiktMSk7ICovCisKKyAgICBpID0gMDsKKyAgICBqID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgIHsKKyAgICAgICAgaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0FbaSsrXSA9IHBvc1trXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0JbaisrXSA9IHBvc1trXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoTiA8PCAyKSwgMyk7ICAgICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg0Kk4pLTMpOyAqLworICAgICAgICAgICAgaW5kZXggPSAoMUwgPDwgdG1wKTsKKyAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzRwXzROMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBwb3NCWzNdLCBuXzEpOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfNHBfNE4xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIHBvc0JbM10sIG5fMSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfMXBfTjEocG9zQVswXSwgbl8xKSA8PCAoKDMqbl8xKSsxKTsgKi8KKyAgICAgICAgICAgIHRtcCA9IGFkZDEoKFdvcmQxNikoKHZvX0xfbXVsdCgzLCBuXzEpID4+IDEpKSwgMSk7CisgICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSksIHRtcCk7CisgICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0bXAgPSAoKG5fMSA8PCAxKSArIDEpOyAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCBOOyAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgTik7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaW5kZXggPSBxdWFudF80cF80TjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgcG9zQVszXSwgbl8xKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF80cF80TlxuIik7CisgICAgfQorICAgIHRtcCA9ICgoTiA8PCAyKSAtIDIpOyAgICAgICAgICAgICAgIC8qIGluZGV4ICs9IChpICYgMykgPDwgKCg0Kk4pLTIpOyAqLworICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIExfc2hsKChMX2RlcG9zaXRfbChpKSAmICgzTCkpLCB0bXApKTsKKworICAgIHJldHVybiAoaW5kZXgpOworfQorCisKKworV29yZDMyIHF1YW50XzVwXzVOKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gNSpOIGJpdHMgICAgICAgICAgICAgKi8KKyAgICAgICAgV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjUgICovCisgICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLworeworICAgIFdvcmQxNiBuYl9wb3MsIG5fMSwgdG1wOworICAgIFdvcmQxNiBwb3NBWzVdLCBwb3NCWzVdOworICAgIFdvcmQzMiBpLCBqLCBrLCBpbmRleCwgdG1wMjsKKworICAgIG5fMSA9IChXb3JkMTYpIChOIC0gMSk7CisgICAgbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8KKworICAgIGkgPSAwOworICAgIGogPSAwOworICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspCisgICAgeworICAgICAgICBpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcG9zQVtpKytdID0gcG9zW2tdOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcG9zQltqKytdID0gcG9zW2tdOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChpKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdG1wID0gdm9fc3ViKChXb3JkMTYpKCh2b19MX211bHQoNSwgTikgPj4gMSkpLCAxKTsgICAgICAgIC8qICgoNSpOKS0xKSkgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9zaGwoMUwsIHRtcCk7ICAgLyogaW5kZXggPSAxIDw8ICgoNSpOKS0xKTsgKi8KKyAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyovCisgICAgICAgICAgICB0bXAyID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSksIHRtcCk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NCWzRdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQls0XSwgTik7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdG1wID0gdm9fc3ViKChXb3JkMTYpKCh2b19MX211bHQoNSwgTikgPj4gMSkpLCAxKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKDFMLCB0bXApOworICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwoKDIqTikrMSk7ICAqLworICAgICAgICAgICAgdG1wMiA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgdG1wMik7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQVswXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0FbMF0sIE4pOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHRtcCA9IHZvX3N1YigoV29yZDE2KSgodm9fTF9tdWx0KDUsIE4pID4+IDEpKSwgMSk7ICAgICAgICAvKiAoKDUqTiktMSkpICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKDFMLCB0bXApOyAgICAgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDUqTiktMSk7ICovCisgICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovCisgICAgICAgICAgICB0bXAyID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSksIHRtcCk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgTik7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovCisgICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBOKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8KKyAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7CisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQlswXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0JbMF0sIE4pOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLworICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NBWzRdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQVs0XSwgTik7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNXBfNU5cbiIpOworICAgIH0KKworICAgIHJldHVybiAoaW5kZXgpOworfQorCisKK1dvcmQzMiBxdWFudF82cF82Tl8yKCAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuICg2Kk4pLTIgYml0cyAgICAgICAgICovCisgICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi42ICAqLworICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KK3sKKyAgICBXb3JkMTYgbmJfcG9zLCBuXzE7CisgICAgV29yZDE2IHBvc0FbNl0sIHBvc0JbNl07CisgICAgV29yZDMyIGksIGosIGssIGluZGV4OworCisgICAgLyogISEgIE4gYW5kIG5fMSBhcmUgY29uc3RhbnRzIC0+IGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBvcGVyYXRlZCBieSBCYXNpYyBPcGVyYXRvcnMgKi8KKyAgICBuXzEgPSAoV29yZDE2KSAoTiAtIDEpOworICAgIG5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovCisKKyAgICBpID0gMDsKKyAgICBqID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgNjsgaysrKQorICAgIHsKKyAgICAgICAgaWYgKChwb3Nba10gJiBuYl9wb3MpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0FbaSsrXSA9IHBvc1trXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvc0JbaisrXSA9IHBvc1trXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaSkKKyAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGluZGV4ID0gKDEgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE4pKTsgLyogaW5kZXggKz0gcXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQls1XSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NCWzVdLCBuXzEpOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGluZGV4ID0gKDFMIDw8IChXb3JkMTYpICg2ICogTiAtIDUpKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDYqTiktNSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOKSk7IC8qIGluZGV4ICs9IHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTjsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0FbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQVswXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpbmRleCA9ICgxTCA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLworICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfNHBfNE4ocG9zQiwgbl8xKSA8PCAoKDIqbl8xKSsxKTsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF80cF80Tihwb3NCLCBuXzEpIDw8IChXb3JkMTYpICgyICogbl8xICsgMSkpKTsKKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpKTsgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpbmRleCA9IChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoV29yZDE2KSAoMyAqIG5fMSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMypuXzEpKzEpOyAqLworICAgICAgICAgICAgaW5kZXggPXZvX0xfYWRkKGluZGV4LCBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpID0gMjsKKyAgICAgICAgICAgIGluZGV4ID0gKHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKFdvcmQxNikgKDIgKiBuXzEgKyAxKSk7ICAvKiBpbmRleCA9IHF1YW50XzRwXzROKHBvc0EsIG5fMSkgPDwgKCgyKm5fMSkrMSk7ICovCisgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKSk7ICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIG5fMSk7ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgaSA9IDE7CisgICAgICAgICAgICBpbmRleCA9IChxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE4pOyAgICAgICAvKiBpbmRleCA9IHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTjsgKi8KKyAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKTsgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGluZGV4ID0gKHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTik7ICAgICAgIC8qIGluZGV4ID0gcXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOOyAqLworICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQVs1XSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NBWzVdLCBuXzEpOyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzZwXzZOXzJcbiIpOworICAgIH0KKyAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoKExfZGVwb3NpdF9sKGkpICYgM0wpIDw8IChXb3JkMTYpICg2ICogTiAtIDQpKSk7ICAgLyogaW5kZXggKz0gKGkgJiAzKSA8PCAoKDYqTiktNCk7ICovCisKKyAgICByZXR1cm4gKGluZGV4KTsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Fpc2ZfbnMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3Fpc2ZfbnMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xaXNmX25zLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3Fpc2ZfbnMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcXBpc2ZfMnMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xcGlzZl8ycy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9xcGlzZl8ycy5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3JhbmRvbS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcmFuZG9tLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmFuZG9tLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3JhbmRvbS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3Jlc2lkdS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvcmVzaWR1LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcmVzaWR1LmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3Jlc2lkdS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zY2FsZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3NjYWxlLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3NjYWxlLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3RyZWFtLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy9zdHJlYW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9zdHJlYW0uYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc3RyZWFtLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3N5bl9maWx0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvc3luX2ZpbHQuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvc3luX2ZpbHQuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91cGR0X3Rhci5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdXBkdF90YXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91cGR0X3Rhci5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy91cGR0X3Rhci5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3V0aWwuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3V0aWwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy91dGlsLmMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3V0aWwuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy92b0FNUldCRW5jLmMgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy92b0FNUldCRW5jLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9BTVJXQkVuYy5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy92b0FNUldCRW5jLmMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3ZvaWNlZmFjLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvdm9pY2VmYWMuYwpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvdm9pY2VmYWMuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93Yl92YWQuYyBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvc3JjL3diX3ZhZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3diX3ZhZC5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy93Yl92YWQuYwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy9zcmMvd2VpZ2h0X2EuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy93ZWlnaHRfYS5jCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3NyYy93ZWlnaHRfYS5jCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L0FtcndiRW5jVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FtcndiRW5jVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbXJ3YkVuY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9BbXJ3YkVuY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJmNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19hbXJ3Yl9lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFtcndiRW5jb2RlclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQW1yd2JFbmNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvY29kZWNzL2FtcndiL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvYW1yd2IvZW5jL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9SRUFETUUubWQKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9hbXJ3Yi9lbmMvdGVzdC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Q5NzQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAiY29kZWNzX2c3MTFkZWMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJnNzExRGVjQWxhdy5jcHAiLAorICAgICAgICAiZzcxMURlY01sYXcuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgICAgICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjLmggYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM1N2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRzcxMV9ERUNfSF8KKyNkZWZpbmUgRzcxMV9ERUNfSF8KKworLyoqCisgKiBAZmlsZSBnNzExRGVjLmgKKyAqIEBicmllZiBnNzExIERlY29kZXIgQVBJOiBEZWNvZGVBTGF3IGFuZCBEZWNvZGVNTGF3CisgKi8KKworLyoqIERlY29kZXMgaW5wdXQgYnl0ZXMgb2Ygc2l6ZSBpblNpemUgYWNjb3JkaW5nIHRvIEFMQVcKKyAqCisgKiBAcGFyYW0gW2luXSBvdXQgPHR0PmludDE2X3QqPC90dD46IG91dHB1dCBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggZGVjb2RlZCBieXRlcy4KKyAqIEBwYXJhbSBbaW5dIGluIDx0dD5jb25zdCB1aW50OF90KjwvdHQ+OiBpbnB1dCBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byBiZSBkZWNvZGVkLgorICogQHBhcmFtIFtpbl0gaW5TaXplIDx0dD5zaXplX3Q8L3R0Pjogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgorICovCit2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKy8qKiBEZWNvZGVzIGlucHV0IGJ5dGVzIG9mIHNpemUgaW5TaXplIGFjY29yZGluZyB0byBNTEFXCisgKgorICogQHBhcmFtIFtpbl0gb3V0IDx0dD5pbnQxNl90KjwvdHQ+OiBvdXRwdXQgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGRlY29kZWQgYnl0ZXMuCisgKiBAcGFyYW0gW2luXSBpbiA8dHQ+Y29uc3QgdWludDhfdCo8L3R0PjogaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXMgdG8gYmUgZGVjb2RlZC4KKyAqIEBwYXJhbSBbaW5dIGluU2l6ZSA8dHQ+c2l6ZV90PC90dD46IHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAqLwordm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworCisjZW5kaWYgIC8vIEc3MTFfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjQWxhdy5jcHAgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDFhN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjQWxhdy5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgaWYgKG91dCAhPSBudWxscHRyICYmIGluICE9IG51bGxwdHIpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgaW5TaXplLS07CisgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKKyAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICB9CisKKyAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7CisKKyAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOworICAgICAgfQorCisgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNNbGF3LmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMmNhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNNbGF3LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICBpZiAob3V0ICE9IG51bGxwdHIgJiYgaW4gIT0gbnVsbHB0cikgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICBpblNpemUtLTsKKyAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKKyAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKKworICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZjY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL2c3MTEvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFhbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFtbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWMzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDkgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9nNzExZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEc3MTEgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitHNzExIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBkZWNvZGluZzoKKzEuIERlY29kZUFMYXcKKzIuIERlY29kZU1MYXcKKworVGhlc2UgdHdvIGRlY29kZXIgQVBJJ3MgYXJlIGZ1enplZCBzZXBhcmF0ZWx5IHVzaW5nIGc3MTFhbGF3X2RlY19mdXp6ZXIgYW5kCitnNzExbWxhd19kZWNfZnV6emVyIHJlc3BlY3RpdmVseS4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIGFzIGV4cGVjdGVkIGJ5IGRlY29kZXIgQVBJLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBnNzExYWxhd19kZWNfZnV6emVyIGFuZCBnNzExbWxhd19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBnNzExYWxhd19kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBnNzExbWxhd19kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZzcxMSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9nNzExX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImc3MTFEZWMuaCIKKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpID0gZGVmYXVsdDsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworfTsKKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gc2l6ZW9mKGludDE2X3QpICogc2l6ZTsKKyAgaW50MTZfdCAqb3V0ID0gbmV3IGludDE2X3Rbb3V0cHV0QnVmZmVyU2l6ZV07CisgIGlmICghb3V0KSB7CisgICAgcmV0dXJuOworICB9CisjaWZkZWYgQUxBVworICBEZWNvZGVBTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZWxzZQorICBEZWNvZGVNTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZW5kaWYKKyAgZGVsZXRlW10gb3V0OworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9URVNUX01BUFBJTkcgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2ZmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTggQEAKKy8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2MworeworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKworICAgIC8vIHRoZSBkZWNvZGVyIHJlcG9ydHMgc29tZXRoaW5nIGJhZCBhYm91dCBhbiB1bmV4cGVjdGVkIG5ld2xpbmUgaW4gdGhlICpjb25maWcgZmlsZQorICAgIC8vIGFuZCB0aGUgY29uZmlnIGZpbGUgbG9va3MgbGlrZSB0aGUgQW5kcm9pZFRlc3QueG1sIGZpbGUgdGhhdCB3ZSBwdXQgaW4gdGhlcmUuCisgICAgLy8gSSBkb24ndCBnZXQgdGhpcyBmcm9tIHRoZSBFbmNvZGVyIC0tIGFuZCBJIGRvbid0IHNlZSBhbnkgc3Vic3RhbnRpdmUgZGlmZmVyZW5jZQorICAgIC8vIGJldHdlZW4gZGVjb2RlIGFuZCBlbmNvZGUgQW5kcm9pZFRlc3QueG1sIGZpbGVzIC0tIGV4Y2VwdCB0aGF0IGVuY29kZSBkb2VzIE5PVAorICAgIC8vIGZpbmlzaCB3aXRoIGEgbmV3bGluZS4KKyAgICAvLyBzdHJhbmdlLgorICAgIHsgIm5hbWUiOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QifSwKKyAgICB7ICJuYW1lIjogIk1wZWc0SDI2M0VuY29kZXJUZXN0In0KKworICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZDBlMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDc2IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbTR2X2gyNjNfZGVjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9iaXRzdHJlYW0uY3BwIiwKKyAgICAgICAgInNyYy9ibG9ja19pZGN0LmNwcCIsCisgICAgICAgICJzcmMvY2FsX2RjX3NjYWxlci5jcHAiLAorICAgICAgICAic3JjL2NvbWJpbmVkX2RlY29kZS5jcHAiLAorICAgICAgICAic3JjL2NvbmNlYWwuY3BwIiwKKyAgICAgICAgInNyYy9kYXRhcGFydF9kZWNvZGUuY3BwIiwKKyAgICAgICAgInNyYy9kY2FjX3ByZWRpY3Rpb24uY3BwIiwKKyAgICAgICAgInNyYy9kZWNfcHJlZF9pbnRyYV9kYy5jcHAiLAorICAgICAgICAic3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAiLAorICAgICAgICAic3JjL2dldF9wcmVkX291dHNpZGUuY3BwIiwKKyAgICAgICAgInNyYy9pZGN0LmNwcCIsCisgICAgICAgICJzcmMvaWRjdF92Y2EuY3BwIiwKKyAgICAgICAgInNyYy9tYl9tb3Rpb25fY29tcC5jcHAiLAorICAgICAgICAic3JjL21iX3V0aWxzLmNwcCIsCisgICAgICAgICJzcmMvcGFja2V0X3V0aWwuY3BwIiwKKyAgICAgICAgInNyYy9wb3N0X2ZpbHRlci5jcHAiLAorICAgICAgICAic3JjL3B2ZGVjX2FwaS5jcHAiLAorICAgICAgICAic3JjL3NjYWxpbmdfdGFiLmNwcCIsCisgICAgICAgICJzcmMvdmxjX2RlY29kZS5jcHAiLAorICAgICAgICAic3JjL3ZsY19kZXF1YW50LmNwcCIsCisgICAgICAgICJzcmMvdmxjX3RhYi5jcHAiLAorICAgICAgICAic3JjL3ZvcC5jcHAiLAorICAgICAgICAic3JjL3ppZ3phZ190YWIuY3BwIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTk9USUNFIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL200dmgyNjNfZGVjb2Rlcl9wdl90eXBlcy5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL200dmgyNjNfZGVjb2Rlcl9wdl90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbTR2aDI2M19kZWNvZGVyX3B2X3R5cGVzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhZWUwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9NUDRERUNfQVBJX0hfCisjZGVmaW5lIF9NUDRERUNfQVBJX0hfCisKKyNpbmNsdWRlICJtNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaCIKKworLy8gI2RlZmluZSBQVl9UT0xFUkFURV9WT0xfRVJST1JTCisjZGVmaW5lIFBWX01FTU9SWV9QT09MCisKKyNpZm5kZWYgX1BWX1RZUEVTXworI2RlZmluZSBfUFZfVFlQRVNfCisKK3R5cGVkZWYgdWludCBCb29sOworCisjZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKKyNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQorI2VuZGlmCisKKyNkZWZpbmUgUFZfVFJVRSAgMQorI2RlZmluZSBQVl9GQUxTRSAwCisKKyNpZm5kZWYgT1NDTF9JTVBPUlRfUkVGCisjZGVmaW5lIE9TQ0xfSU1QT1JUX1JFRiAvKiBlbXB0eSAqLworI2VuZGlmCisjaWZuZGVmIE9TQ0xfRVhQT1JUX1JFRgorI2RlZmluZSBPU0NMX0VYUE9SVF9SRUYgLyogZW1wdHkgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgUFZfTk9fUE9TVF9QUk9DIDAKKyNkZWZpbmUgUFZfREVCTE9DSyAxCisjZGVmaW5lIFBWX0RFUklORyAgMgorCisKKworI2luY2x1ZGUgInZpc3VhbF9oZWFkZXIuaCIgLy8gc3RydWN0IFZvbEluZm8gaXMgZGVmaW5lZAorCisKKy8qKkBuYW1lIFN0cnVjdHVyZSBhbmQgRGF0YSBUeXBlcworICogVGhlc2UgdHlwZSBkZWZpbml0aW9ucyBzcGVjaWZ5IHRoZSBpbnB1dCAvIG91dHB1dCBmcm9tIHRoZSBQVk1lc3NhZ2UKKyAqIGxpYnJhcnkuCisgKi8KKworLypAeyovCisvKiBUaGUgYXBwbGljYXRpb24gaGFzIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnT3V0cHV0RnJhbWUKK3sKKyAgICB1aW50OCAgICAgICAqZGF0YTsgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRwdXQgWVVWIGJ1ZmZlciAqLworICAgIHVpbnQzMiAgICAgIHRpbWVTdGFtcDsgICAgICAvKiB0aW1lIHN0YW1wICovCit9IE91dHB1dEZyYW1lOworCit0eXBlZGVmIHN0cnVjdCB0YWdBcHBsaWNhdGlvbkRhdGEKK3sKKyAgICBpbnQgbGF5ZXI7ICAgICAgICAgIC8qIGN1cnJlbnQgdmlkZW8gbGF5ZXIgKi8KKyAgICB2b2lkICpvYmplY3Q7ICAgICAgIC8qIHNvbWUgb3B0aW9uYWwgZGF0YSBmaWVsZCAqLworfSBhcHBsaWNhdGlvbkRhdGE7CisKKy8qIEFwcGxpY2F0aW9uIGNvbnRyb2xzLCB0aGlzIHN0cnVjdGVkIHNoYWxsIGJlIGFsbG9jYXRlZCAqLworLyogICAgYW5kIGluaXRpYWxpemVkIGluIHRoZSBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzCit7CisgICAgLyogVGhlIGZvbGxvd2luZyBmdWNudGlvbiBwb2ludGVyIGlzIGNvcGllZCB0byBCaXRzdHJlYW1EZWNWaWRlbyBzdHJ1Y3R1cmUgICovCisgICAgLyogICAgdXBvbiBpbml0aWFsaXphdGlvbiBhbmQgbmV2ZXIgdXNlZCBhZ2Fpbi4gKi8KKyAgICBpbnQgKCpyZWFkQml0c3RyZWFtRGF0YSkodWludDggKmJ1ZiwgaW50IG5ieXRlc19yZXF1aXJlZCwgdm9pZCAqYXBwRGF0YSk7CisgICAgYXBwbGljYXRpb25EYXRhIGFwcERhdGE7CisKKyAgICB1aW50OCAqb3V0cHV0RnJhbWU7CisgICAgdm9pZCAqdmlkZW9EZWNvZGVyRGF0YTsgICAgIC8qIHRoaXMgaXMgYW4gaW50ZXJuYWwgcG9pbnRlciB0aGF0IGlzIG9ubHkgdXNlZCAqLworICAgIC8qIGluIHRoZSBkZWNvZGVyIGxpYnJhcnkuICAgKi8KKyNpZmRlZiBQVl9NRU1PUllfUE9PTAorICAgIGludDMyIHNpemU7CisjZW5kaWYKKyAgICBpbnQgbkxheWVyczsKKyAgICAvKiBwb2ludGVycyB0byBWT0wgZGF0YSBmb3IgZnJhbWUtYmFzZWQgZGVjb2RpbmcuICovCisgICAgdWludDggKnZvbGJ1ZlsyXTsgICAgICAgICAgIC8qIG1heGltdW0gb2YgMiBsYXllcnMgZm9yIG5vdyAqLworICAgIGludDMyIHZvbGJ1Zl9zaXplWzJdOworCit9IFZpZGVvRGVjQ29udHJvbHM7CisKK3R5cGVkZWYgZW51bQoreworICAgIEgyNjNfTU9ERSA9IDAsIE1QRUc0X01PREUsIFVOS05PV05fTU9ERQorfSBNUDREZWNvZGluZ01vZGU7CisKK3R5cGVkZWYgZW51bQoreworICAgIE1QNF9JX0ZSQU1FLCBNUDRfUF9GUkFNRSwgTVA0X0JfRlJBTUUsIE1QNF9CQURfRlJBTUUKK30gTVA0RnJhbWVUeXBlOworCit0eXBlZGVmIHN0cnVjdCB0YWdWb3BIZWFkZXJJbmZvCit7CisgICAgaW50ICAgICBjdXJyTGF5ZXI7CisgICAgdWludDMyICB0aW1lc3RhbXA7CisgICAgTVA0RnJhbWVUeXBlICAgIGZyYW1lVHlwZTsKKyAgICBpbnQgICAgIHJlZlNlbENvZGU7CisgICAgaW50MTYgICAgICAgcXVhbnRpemVyOworfSBWb3BIZWFkZXJJbmZvOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogVmlkZW9SZWZDb3B5SW5mbzoKKyAqIE9NQVAgRFNQIHNwZWNpZmljIHR5cGVkZWYgc3RydWN0dXJlLCB0byBzdXBwb3J0IHRoZSB1c2VyIChBUk0pIGNvcHlpbmcKKyAqIG9mIGEgUmVmZXJlbmNlIEZyYW1lIGludG8gdGhlIFZpZGVvIERlY29kZXIuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1ZpZGVvUmVmQ29weUluZm9QdHIKK3sKKyAgICB1aW50OCAgICp5Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFkgY29tcG9uZW50IGZyYW1lIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLworICAgIHVpbnQ4ICAgKnVDaGFuOyAgICAgICAgICAgICAvKiBUaGUgVSBjb21wb25lbnQgZnJhbWUgdGhlIHVzZXIgY2FuIGNvcHkgYSBuZXcgcmVmZXJlbmNlIHRvICovCisgICAgdWludDggICAqdkNoYW47ICAgICAgICAgICAgIC8qIFRoZSBWIGNvbXBvbmVudCBmcmFtZSB0aGUgdXNlciBjYW4gY29weSBhIG5ldyByZWZlcmVuY2UgdG8gKi8KKyAgICB1aW50OCAgICpjdXJyZW50Vm9wOyAgICAgICAgLyogVGhlIFZvcCBmb3IgdmlkZW8gdGhlIHVzZXIgY2FuIGNvcHkgYSBuZXcgcmVmZXJlbmNlIHRvICovCit9IFZpZGVvUmVmQ29weUluZm9QdHI7CisKK3R5cGVkZWYgc3RydWN0IHRhZ1ZpZGVvUmVmQ29weUluZm9EYXRhCit7CisgICAgaW50MTYgICB3aWR0aDsgICAgICAgICAgICAgIC8qIFdpZHRoICovCisgICAgaW50MTYgICBoZWlnaHQ7ICAgICAgICAgICAgIC8qIEhlaWdodCAqLworICAgIGludDE2ICAgcmVhbFdpZHRoOyAgICAgICAgICAvKiBOb24tcGFkZGVkIHdpZHRoLCBub3QgYSBtdWx0aXBsZSBvZiAxNi4gKi8KKyAgICBpbnQxNiAgIHJlYWxIZWlnaHQ7ICAgICAgICAgLyogTm9uLXBhZGRlZCBoZWlnaHQsIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAqLworfSBWaWRlb1JlZkNvcHlJbmZvRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnVmlkZW9SZWZDb3B5SW5mbworeworICAgIFZpZGVvUmVmQ29weUluZm9EYXRhIGRhdGE7CisgICAgVmlkZW9SZWZDb3B5SW5mb1B0ciBwdHJzOworfSBWaWRlb1JlZkNvcHlJbmZvOworCisvKkB9Ki8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKworCisgICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZJbml0VmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICp2b2xidWZbXSwgaW50MzIgKnZvbGJ1Zl9zaXplLCBpbnQgbkxheWVycywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBNUDREZWNvZGluZ01vZGUgbW9kZSk7CisgICAgQm9vbCAgICBQVkFsbG9jVmlkZW9EYXRhKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5MYXllcnMpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKKyAgICBCb29sICAgIFBWUmVzZXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7CisgICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZTZXRSZWZlcmVuY2VZVVYoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVVik7CisgICAgQm9vbCAgICBQVkRlY1NldFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCB1aW50MzIgdGltZXN0YW1wKTsKKyAgICBCb29sICAgIFBWRGVjU2V0RW5oUmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsIHVpbnQzMiB0aW1lc3RhbXApOworICAgIE9TQ0xfSU1QT1JUX1JFRiBCb29sICAgIFBWRGVjb2RlVmlkZW9GcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqYml0c3RyZWFtW10sIHVpbnQzMiAqdGltZXN0YW1wLCBpbnQzMiAqYnVmZmVyX3NpemUsIHVpbnQgdXNlX2V4dF90aW1lc3RhbXBbXSwgdWludDgqIGN1cnJZVVYpOworICAgIEJvb2wgICAgUFZEZWNvZGVWb3BIZWFkZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKmJ1ZmZlcltdLCB1aW50MzIgdGltZXN0YW1wW10sIGludDMyIGJ1ZmZlcl9zaXplW10sIFZvcEhlYWRlckluZm8gKmhlYWRlcl9pbmZvLCB1aW50IHVzZV9leHRfdGltZXN0YW1wW10sIHVpbnQ4ICpjdXJyWVVWKTsKKyAgICBCb29sICAgIFBWRGVjb2RlVm9wQm9keShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiBidWZmZXJfc2l6ZVtdKTsKKyAgICB2b2lkICAgIFBWRGVjUG9zdFByb2Nlc3MoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKm91dHB1dFlVVik7CisgICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgKmRpc3BsYXlfd2lkdGgsIGludDMyICpkaXNwbGF5X2hlaWdodCk7CisgICAgT1NDTF9JTVBPUlRfUkVGIHZvaWQgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICpidWZfd2lkdGgsIGludDMyICpidWZfaGVpZ2h0KTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVlNldFBvc3RQcm9jVHlwZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgbW9kZSk7CisgICAgdWludDMyICBQVkdldFZpZGVvVGltZVN0YW1wKFZpZGVvRGVjQ29udHJvbHMgKmRlY29kZXJDb250cm9sKTsKKyAgICBpbnQgICAgIFBWR2V0RGVjQml0cmF0ZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKKyAgICBpbnQgICAgIFBWR2V0RGVjRnJhbWVyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIHVpbnQ4ICAgKlBWR2V0RGVjT3V0cHV0RnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7CisgICAgaW50ICAgICBQVkdldExheWVySUQoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7CisgICAgaW50MzIgICBQVkdldERlY01lbW9yeVVzYWdlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBNUDREZWNvZGluZ01vZGUgUFZHZXREZWNCaXRzdHJlYW1Nb2RlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOworICAgIEJvb2wgICAgUFZFeHRyYWN0Vm9sSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIHVpbnQ4ICp2b2xfaGVhZGVyLCBpbnQzMiAqdm9sX2hlYWRlcl9zaXplKTsKKyAgICBpbnQzMiAgIFBWTG9jYXRlRnJhbWVIZWFkZXIodWludDggKnZpZGVvX2J1ZmZlciwgaW50MzIgdm9wX3NpemUpOworICAgIGludDMyICAgUFZMb2NhdGVIMjYzRnJhbWVIZWFkZXIodWludDggKnZpZGVvX2J1ZmZlciwgaW50MzIgdm9wX3NpemUpOworICAgIEJvb2wgICAgUFZHZXRWb2xJbmZvKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIFZvbEluZm8gKnBWb2xJbmZvKTsgLy8gQlggNi8yNC8wNAorICAgIEJvb2wgICAgSXNJbnRyYUZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY29kZXJDb250cm9sKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiBfTVA0REVDX0FQSV9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvdmlzdWFsX2hlYWRlci5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL3Zpc3VhbF9oZWFkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYml0c3RyZWFtLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYml0c3RyZWFtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2JpdHN0cmVhbS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9iaXRzdHJlYW0uaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzcwOGUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKQEAgLTAsMCArMSw5MTQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCisgSW5wdXRzOgorICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgorICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6CisgICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBPdXRwdXRzOgorICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCisgICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQorCisgUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6CisgICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQorICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKKyAgICAgICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgorICAgICAgdmFyaWFibGVfYmZyXQorCisgTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgorICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKKyAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBGVU5DVElPTiBERVNDUklQVElPTgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVFVSVJFTUVOVFMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVGRVJFTkNFUworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBQU0VVRE8tQ09ERQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSRVNPVVJDRVMgVVNFRAorICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCisgICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KKworIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKKyAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KKworICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQorICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKKworIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKKworIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKKworIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKKyAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQorICAgICAgICAgICBjYWxsZWRdCisKKyAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgSU5DTFVERVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIm1wNGRlY19saWIuaCIKKyNpbmNsdWRlICJpZGN0LmgiCisjaW5jbHVkZSAibW90aW9uX2NvbXAuaCIKKworI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05WX1BPU1NJQkxFX0xPU1NfT0ZfREFUQQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IE1BQ1JPUworOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IERFRklORVMKKzsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKKzsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHByaXZhdGUgcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaWRjdHJvdyhpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKTsKK3N0YXRpYyB2b2lkIGlkY3Ryb3dfaW50cmEoaW50MTYgKmJsaywgUElYRUwgKiwgaW50IHdpZHRoKTsKK3N0YXRpYyB2b2lkIGlkY3Rjb2woaW50MTYgKmJsayk7CisKKyNpZmRlZiBGQVNUX0lEQ1QKKy8vIG1hcHBpbmcgZnJvbSBuel9jb2VmcyB0byBmdW5jdGlvbnMgdG8gYmUgdXNlZAorCisKKy8vIEFSTTQgZG9lcyBub3QgYWxsb3cgZ2xvYmFsIGRhdGEgd2hlbiB0aGV5IGFyZSBub3QgY29uc3RhbnQgaGVuY2UKKy8vIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGNhbm5vdCBiZSBjb25zaWRlcmVkIGFzIGFycmF5IG9mIGNvbnN0YW50cworLy8gKGFjdHVhbCBhZGRyZXNzZXMgYXJlIG9ubHkga25vd24gd2hlbiB0aGUgZGxsIGlzIGxvYWRlZCkuCisvLyBTbyBpbnN0ZWFkIG9mIGFycmF5cyBvZiBmdW5jdGlvbiBwb2ludGVycywgd2UnbGwgc3RvcmUgaGVyZQorLy8gYXJyYXlzIG9mIHJvd3Mgb3IgY29sdW1ucyBhbmQgdGhlbiBjYWxsIHRoZSBpZGN0IGZ1bmN0aW9uCisvLyBjb3JyZXNwb25kaW5nIHRvIHN1Y2ggdGhlIHJvdy9jb2x1bW4gbnVtYmVyOgorCisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdGNvbFZDQVsxMF1bNF0pKGludDE2KikgPQoreworICAgIHsmaWRjdGNvbDEsICZpZGN0Y29sMCwgJmlkY3Rjb2wwLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDEsICZpZGN0Y29sMSwgJmlkY3Rjb2wwLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDIsICZpZGN0Y29sMSwgJmlkY3Rjb2wwLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMSwgJmlkY3Rjb2wwLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wwLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxLCAmaWRjdGNvbDB9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wxLCAmaWRjdGNvbDF9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMiwgJmlkY3Rjb2wyLCAmaWRjdGNvbDF9LAorICAgIHsmaWRjdGNvbDMsICZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDF9LAorICAgIHsmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDF9Cit9OworCisKK3N0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQVsxMF0pKGludDE2KiwgdWludDgqLCB1aW50OCosIGludCkgPQoreworICAgICZpZGN0cm93MSwKKyAgICAmaWRjdHJvdzIsCisgICAgJmlkY3Ryb3cyLAorICAgICZpZGN0cm93MiwKKyAgICAmaWRjdHJvdzIsCisgICAgJmlkY3Ryb3czLAorICAgICZpZGN0cm93NCwKKyAgICAmaWRjdHJvdzQsCisgICAgJmlkY3Ryb3c0LAorICAgICZpZGN0cm93NAorfTsKKworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Rjb2xWQ0EyWzE2XSkoaW50MTYqKSA9Cit7CisgICAgJmlkY3Rjb2wwLCAmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2w0LAorICAgICZpZGN0Y29sMiwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNCwKKyAgICAmaWRjdGNvbDEsICZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDQsCisgICAgJmlkY3Rjb2wyLCAmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2w0Cit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0EyWzhdKShpbnQxNiosIHVpbnQ4KiwgdWludDgqLCBpbnQpID0KK3sKKyAgICAmaWRjdHJvdzEsICZpZGN0cm93NCwgJmlkY3Ryb3czLCAmaWRjdHJvdzQsCisgICAgJmlkY3Ryb3cyLCAmaWRjdHJvdzQsICZpZGN0cm93MywgJmlkY3Ryb3c0Cit9OworCitzdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0FfaW50cmFbMTBdKShpbnQxNiosIFBJWEVMICosIGludCkgPQoreworICAgICZpZGN0cm93MV9pbnRyYSwKKyAgICAmaWRjdHJvdzJfaW50cmEsCisgICAgJmlkY3Ryb3cyX2ludHJhLAorICAgICZpZGN0cm93Ml9pbnRyYSwKKyAgICAmaWRjdHJvdzJfaW50cmEsCisgICAgJmlkY3Ryb3czX2ludHJhLAorICAgICZpZGN0cm93NF9pbnRyYSwKKyAgICAmaWRjdHJvdzRfaW50cmEsCisgICAgJmlkY3Ryb3c0X2ludHJhLAorICAgICZpZGN0cm93NF9pbnRyYQorfTsKKworc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBMl9pbnRyYVs4XSkoaW50MTYqLCBQSVhFTCAqLCBpbnQpID0KK3sKKyAgICAmaWRjdHJvdzFfaW50cmEsICZpZGN0cm93NF9pbnRyYSwgJmlkY3Ryb3czX2ludHJhLCAmaWRjdHJvdzRfaW50cmEsCisgICAgJmlkY3Ryb3cyX2ludHJhLCAmaWRjdHJvdzRfaW50cmEsICZpZGN0cm93M19pbnRyYSwgJmlkY3Ryb3c0X2ludHJhCit9OworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUworOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKKzsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKKzsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRlVOQ1RJT04gQ09ERQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIE1CbG9ja0lEQ1QoVmlkZW9EZWNEYXRhICp2aWRlbykKK3sKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBNYWNyb0Jsb2NrICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOworICAgIFBJWEVMICpjX2NvbXA7CisgICAgUElYRUwgKmN1X2NvbXA7CisgICAgUElYRUwgKmN2X2NvbXA7CisgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKKyAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OworICAgIGludCB3aWR0aCwgd2lkdGhfdXY7CisgICAgaW50MzIgb2Zmc2V0OworICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOworICAgIHdpZHRoX3V2ID0gd2lkdGggPj4gMTsKKyAgICBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7CisKKyAgICBjX2NvbXAgID0gY3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7CisgICAgY3VfY29tcCA9IGN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKTsKKyAgICBjdl9jb21wID0gY3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpOworCisgICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY19jb21wLCAwLCB3aWR0aCk7CisgICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY19jb21wICsgOCwgMSwgd2lkdGgpOworICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCArICh3aWR0aCA8PCAzKSwgMiwgd2lkdGgpOworICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGNfY29tcCArICh3aWR0aCA8PCAzKSArIDgsIDMsIHdpZHRoKTsKKyAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjdV9jb21wLCA0LCB3aWR0aF91dik7CisgICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY3ZfY29tcCwgNSwgd2lkdGhfdXYpOworfQorCisKK3ZvaWQgQmxvY2tJRENUX2ludHJhKAorICAgIE1hY3JvQmxvY2sgKm1ibG9jaywgUElYRUwgKmNfY29tcCwgaW50IGNvbXAsIGludCB3aWR0aCkKK3sKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW50MTYgKmNvZWZmX2luID0gbWJsb2NrLT5ibG9ja1tjb21wXTsKKyNpZmRlZiBJTlRFR0VSX0lEQ1QKKyNpZmRlZiBGQVNUX0lEQ1QgIC8qIFZDQSBJRENUIHVzaW5nIG56Y29lZnMgYW5kIGJpdG1hcHMqLworICAgIGludCBpLCBibWFwcjsKKyAgICBpbnQgbnpfY29lZnMgPSBtYmxvY2stPm5vX2NvZWZmW2NvbXBdOworICAgIHVpbnQ4ICpiaXRtYXBjb2wgPSBtYmxvY2stPmJpdG1hcGNvbFtjb21wXTsKKyAgICB1aW50OCBiaXRtYXByb3cgPSBtYmxvY2stPmJpdG1hcHJvd1tjb21wXTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaWYgKG56X2NvZWZzIDw9IDEwKQorICAgIHsKKyAgICAgICAgYm1hcHIgPSAobnpfY29lZnMgLSAxKTsKKworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXSkpKGNvZWZmX2luKTsKKyAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMV0pKShjb2VmZl9pbiArIDEpOworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVsyXSkpKGNvZWZmX2luICsgMik7CisgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzNdKSkoY29lZmZfaW4gKyAzKTsKKworICAgICAgICAoKmlkY3Ryb3dWQ0FfaW50cmFbbnpfY29lZnMtMV0pKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaSA9IDg7CisgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGJtYXByID0gKGludCliaXRtYXBjb2xbaV07CisgICAgICAgICAgICBpZiAoYm1hcHIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChibWFwciYweGYpID09IDApICAgICAgICAgLyogIDA3LzE4LzAxICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKihpZGN0Y29sVkNBMltibWFwcj4+NF0pKShjb2VmZl9pbiArIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZGN0Y29sKGNvZWZmX2luICsgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoYml0bWFwY29sWzRdIHwgYml0bWFwY29sWzVdIHwgYml0bWFwY29sWzZdIHwgYml0bWFwY29sWzddKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRtYXByb3cgPj49IDQ7CisgICAgICAgICAgICAoKihpZGN0cm93VkNBMl9pbnRyYVsoaW50KWJpdG1hcHJvd10pKShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZGN0cm93X2ludHJhKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgdm9pZCBpZGN0X2ludHJhKGludCAqYmxvY2ssIHVpbnQ4ICpjb21wLCBpbnQgd2lkdGgpOworICAgIGlkY3RfaW50cmEoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOworI2VuZGlmCisjZWxzZQorICAgIHZvaWQgaWRjdHJlZl9pbnRyYShpbnQgKmJsb2NrLCB1aW50OCAqY29tcCwgaW50IHdpZHRoKTsKKyAgICBpZGN0cmVmX2ludHJhKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKKyNlbmRpZgorCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcmV0dXJuOworfQorCisvKiAgMDgvMDQvMDUsIG5vIHJlc2lkdWUsIGp1c3QgY29weSBmcm9tIHByZWQgdG8gb3V0cHV0ICovCit2b2lkIENvcHlfQmxrX3RvX1ZvcCh1aW50OCAqZHN0LCB1aW50OCAqcHJlZCwgaW50IHdpZHRoKQoreworICAgIC8qIGNvcHkgNCBieXRlcyBhdCBhIHRpbWUgKi8KKyAgICB3aWR0aCAtPSA0OworICAgICooKHVpbnQzMiopZHN0KSA9ICooKHVpbnQzMiopcHJlZCk7CisgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7CisgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7CisgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKKyAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7CisgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7CisgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOworICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKKworICAgIHJldHVybiA7Cit9CisKKy8qICAwOC8wNC8wNSBjb21wdXRlIElEQ1QgYW5kIGFkZCBwcmVkaWN0aW9uIGF0IHRoZSBlbmQgICovCit2b2lkIEJsb2NrSURDVCgKKyAgICB1aW50OCAqZHN0LCAgLyogZGVzdGluYXRpb24gKi8KKyAgICB1aW50OCAqcHJlZCwgLyogcHJlZGljdGlvbiBibG9jaywgcGl0Y2ggMTYgKi8KKyAgICBpbnQxNiAgICpjb2VmZl9pbiwgIC8qIERDVCBkYXRhLCBzaXplIDY0ICovCisgICAgaW50IHdpZHRoLCAvKiB3aWR0aCBvZiBkc3QgKi8KKyAgICBpbnQgbnpfY29lZnMsCisgICAgdWludDggKmJpdG1hcGNvbCwKKyAgICB1aW50OCBiaXRtYXByb3cKKykKK3sKKyNpZmRlZiBJTlRFR0VSX0lEQ1QKKyNpZmRlZiBGQVNUX0lEQ1QgIC8qIFZDQSBJRENUIHVzaW5nIG56Y29lZnMgYW5kIGJpdG1hcHMqLworICAgIGludCBpLCBibWFwcjsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGlmIChuel9jb2VmcyA8PSAxMCkKKyAgICB7CisgICAgICAgIGJtYXByID0gKG56X2NvZWZzIC0gMSk7CisgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdKSkoY29lZmZfaW4pOworICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVsxXSkpKGNvZWZmX2luICsgMSk7CisgICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzJdKSkoY29lZmZfaW4gKyAyKTsKKyAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bM10pKShjb2VmZl9pbiArIDMpOworCisgICAgICAgICgqaWRjdHJvd1ZDQVtuel9jb2Vmcy0xXSkoY29lZmZfaW4sIHByZWQsIGRzdCwgd2lkdGgpOworICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpID0gODsKKworICAgICAgICB3aGlsZSAoaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBibWFwciA9IChpbnQpYml0bWFwY29sW2ldOworICAgICAgICAgICAgaWYgKGJtYXByKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoYm1hcHImMHhmKSA9PSAwKSAgICAgICAgIC8qICAwNy8xOC8wMSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCooaWRjdGNvbFZDQTJbYm1hcHI+PjRdKSkoY29lZmZfaW4gKyBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWRjdGNvbChjb2VmZl9pbiArIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGJpdG1hcGNvbFs0XSB8IGJpdG1hcGNvbFs1XSB8IGJpdG1hcGNvbFs2XSB8IGJpdG1hcGNvbFs3XSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgKCooaWRjdHJvd1ZDQTJbYml0bWFwcm93Pj40XSkpKGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkY3Ryb3coY29lZmZfaW4sIHByZWQsIGRzdCwgd2lkdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorI2Vsc2UgLy8gRkFTVF9JRENUCisgICAgdm9pZCBpZGN0KGludCAqYmxvY2ssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpOworICAgIGlkY3QoY29lZmZfaW4sIHByZWQsIGRzdCwgd2lkdGgpOworICAgIHJldHVybjsKKyNlbmRpZiAvLyBGQVNUX0lEQ1QKKyNlbHNlIC8vIElOVEVHRVJfSURDVAorICAgIHZvaWQgaWRjdHJlZihpbnQgKmJsb2NrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKTsKKyAgICBpZGN0cmVmKGNvZWZmX2luLCBwcmVkLCBkc3QsIHdpZHRoKTsKKyAgICByZXR1cm47CisjZW5kaWYgLy8gSU5URUdFUl9JRENUCisKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAgRW5kIEZ1bmN0aW9uOiBibG9ja19pZGN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIE5BTUU6IGlkY3Ryb3cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMgRk9SIGlkY3Ryb3cKKworIElucHV0czoKKyAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgorICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgT3V0cHV0czoKKyAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKworIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgorICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKKyAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKKyAgICAgIHZhcmlhYmxlX2Jmcl0KKworIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04gRk9SIGlkY3Ryb3cKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTIEZPUiBpZGN0cm93CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMgRk9SIGlkY3Ryb3cKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUgRk9SIGlkY3Ryb3cKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVTT1VSQ0VTIFVTRUQgRk9SIGlkY3Ryb3cKKyAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQorICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50CisgICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCisKKyAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKyBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCisgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKKyAgICAgICAgICAgY2FsbGVkXQorCisgICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Ryb3cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0cm93KAorICAgIGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgKKykKK3sKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogcm93IChob3Jpem9udGFsKSBJRENUCisgICAgKgorICAgICogNyAgICAgICAgICAgICAgICAgICAgICAgcGkgICAgICAgICAxIGRzdFtrXSA9IHN1bSBjW2xdICogc3JjW2xdICogY29zKCAtLSAqCisgICAgKiAoIGsgKyAtICkgKiBsICkgbD0wICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAgMgorICAgICoKKyAgICAqIHdoZXJlOiBjWzBdICAgID0gMTI4IGNbMS4uN10gPSAxMjgqc3FydCgyKSAqLworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHdpZHRoIC09IDQ7CisgICAgZHN0IC09IHdpZHRoOworICAgIHByZWQgLT0gMTI7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDEgPSAoaW50MzIpYmxrWzEyXSA8PCA4OworICAgICAgICBibGtbMTJdID0gMDsKKyAgICAgICAgeDIgPSBibGtbMTRdOworICAgICAgICBibGtbMTRdID0gMDsKKyAgICAgICAgeDMgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDQgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHg1ID0gYmxrWzE1XTsKKyAgICAgICAgYmxrWzE1XSA9IDA7CisgICAgICAgIHg2ID0gYmxrWzEzXTsKKyAgICAgICAgYmxrWzEzXSA9IDA7CisgICAgICAgIHg3ID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICBibGtbMF0gPSAwOyAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIC8qIGZpcnN0IHN0YWdlICovCisgICAgICAgIHg4ID0gVzcgKiAoeDQgKyB4NSkgKyA0OworICAgICAgICB4NCA9ICh4OCArIChXMSAtIFc3KSAqIHg0KSA+PiAzOworICAgICAgICB4NSA9ICh4OCAtIChXMSArIFc3KSAqIHg1KSA+PiAzOworICAgICAgICB4OCA9IFczICogKHg2ICsgeDcpICsgNDsKKyAgICAgICAgeDYgPSAoeDggLSAoVzMgLSBXNSkgKiB4NikgPj4gMzsKKyAgICAgICAgeDcgPSAoeDggLSAoVzMgKyBXNSkgKiB4NykgPj4gMzsKKworICAgICAgICAvKiBzZWNvbmQgc3RhZ2UgKi8KKyAgICAgICAgeDggPSB4MCArIHgxOworICAgICAgICB4MCAtPSB4MTsKKyAgICAgICAgeDEgPSBXNiAqICh4MyArIHgyKSArIDQ7CisgICAgICAgIHgyID0gKHgxIC0gKFcyICsgVzYpICogeDIpID4+IDM7CisgICAgICAgIHgzID0gKHgxICsgKFcyIC0gVzYpICogeDMpID4+IDM7CisgICAgICAgIHgxID0geDQgKyB4NjsKKyAgICAgICAgeDQgLT0geDY7CisgICAgICAgIHg2ID0geDUgKyB4NzsKKyAgICAgICAgeDUgLT0geDc7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDcgPSB4OCArIHgzOworICAgICAgICB4OCAtPSB4MzsKKyAgICAgICAgeDMgPSB4MCArIHgyOworICAgICAgICB4MCAtPSB4MjsKKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4NCA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworCisgICAgICAgIHJlcyA9ICh4NyArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHgzICsgeDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDAgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4OCArIHg2KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisKKyAgICAgICAgcmVzID0gKHg4IC0geDYpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7CisgICAgICAgIHJlczIgPSAoeDAgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7CisgICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7CisgICAgICAgIHJlcyA9ICh4MyAtIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKKyAgICAgICAgcmVzID0gKHg3IC0geDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKyAgICB9CisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHJldHVybjsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0cm93X2ludHJhKAorICAgIGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgKKykKK3sKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKKyAgICBpbnQgaSA9IDg7CisgICAgaW50IG9mZnNldCA9IHdpZHRoOworICAgIGludDMyIHdvcmQ7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIHJvdyAoaG9yaXpvbnRhbCkgSURDVAorICAgICoKKyAgICAqIDcgICAgICAgICAgICAgICAgICAgICAgIHBpICAgICAgICAgMSBkc3Rba10gPSBzdW0gY1tsXSAqIHNyY1tsXSAqIGNvcyggLS0gKgorICAgICogKCBrICsgLSApICogbCApIGw9MCAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgIDIKKyAgICAqCisgICAgKiB3aGVyZTogY1swXSAgICA9IDEyOCBjWzEuLjddID0gMTI4KnNxcnQoMikgKi8KKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDEgPSAoaW50MzIpYmxrWzRdIDw8IDg7CisgICAgICAgIGJsa1s0XSA9IDA7CisgICAgICAgIHgyID0gYmxrWzZdOworICAgICAgICBibGtbNl0gPSAwOworICAgICAgICB4MyA9IGJsa1syXTsKKyAgICAgICAgYmxrWzJdID0gMDsKKyAgICAgICAgeDQgPSBibGtbMV07CisgICAgICAgIGJsa1sxXSA9IDA7CisgICAgICAgIHg1ID0gYmxrWzddOworICAgICAgICBibGtbN10gPSAwOworICAgICAgICB4NiA9IGJsa1s1XTsKKyAgICAgICAgYmxrWzVdID0gMDsKKyAgICAgICAgeDcgPSBibGtbM107CisgICAgICAgIGJsa1szXSA9IDA7CisjaWZuZGVmIEZBU1RfSURDVAorICAgICAgICAvKiBzaG9ydGN1dCAqLyAgLyogY292ZXJlZCBieSBpZGN0cm93MSAgMDEvOS8yMDAxICovCisgICAgICAgIGlmICghKHgxIHwgeDIgfCB4MyB8IHg0IHwgeDUgfCB4NiB8IHg3KSkKKyAgICAgICAgeworICAgICAgICAgICAgYmxrWzBdID0gYmxrWzFdID0gYmxrWzJdID0gYmxrWzNdID0gYmxrWzRdID0gYmxrWzVdID0gYmxrWzZdID0gYmxrWzddID0gKGJsa1swXSArIDMyKSA+PiA2OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCA4KSArIDgxOTI7CisgICAgICAgIGJsa1swXSA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4OCA9IFc3ICogKHg0ICsgeDUpICsgNDsKKyAgICAgICAgeDQgPSAoeDggKyAoVzEgLSBXNykgKiB4NCkgPj4gMzsKKyAgICAgICAgeDUgPSAoeDggLSAoVzEgKyBXNykgKiB4NSkgPj4gMzsKKyAgICAgICAgeDggPSBXMyAqICh4NiArIHg3KSArIDQ7CisgICAgICAgIHg2ID0gKHg4IC0gKFczIC0gVzUpICogeDYpID4+IDM7CisgICAgICAgIHg3ID0gKHg4IC0gKFczICsgVzUpICogeDcpID4+IDM7CisKKyAgICAgICAgLyogc2Vjb25kIHN0YWdlICovCisgICAgICAgIHg4ID0geDAgKyB4MTsKKyAgICAgICAgeDAgLT0geDE7CisgICAgICAgIHgxID0gVzYgKiAoeDMgKyB4MikgKyA0OworICAgICAgICB4MiA9ICh4MSAtIChXMiArIFc2KSAqIHgyKSA+PiAzOworICAgICAgICB4MyA9ICh4MSArIChXMiAtIFc2KSAqIHgzKSA+PiAzOworICAgICAgICB4MSA9IHg0ICsgeDY7CisgICAgICAgIHg0IC09IHg2OworICAgICAgICB4NiA9IHg1ICsgeDc7CisgICAgICAgIHg1IC09IHg3OworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHg3ID0geDggKyB4MzsKKyAgICAgICAgeDggLT0geDM7CisgICAgICAgIHgzID0geDAgKyB4MjsKKyAgICAgICAgeDAgLT0geDI7CisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICB3b3JkID0gKCh4NyArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDMgKyB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisgICAgICAgIHRlbXAgPSAoKHgwICsgeDQpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKKyAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7CisKKyAgICAgICAgdGVtcCA9ICgoeDggKyB4NikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKKyAgICAgICAgKigoaW50MzIqKShjb21wKSkgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAoKHg4IC0geDYpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKKworICAgICAgICB0ZW1wID0gKCh4MCAtIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7CisKKyAgICAgICAgdGVtcCA9ICgoeDMgLSB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKworICAgICAgICB0ZW1wID0gKCh4NyAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOworICAgICAgICBjb21wICs9IG9mZnNldDsKKworICAgICAgICBibGsgKz0gQl9TSVpFOworICAgIH0KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRW5kIEZ1bmN0aW9uOiBpZGN0cm93CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIE5BTUU6IGlkY3Rjb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMgRk9SIGlkY3Rjb2wKKworIElucHV0czoKKyAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisKKyBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgorICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKKyAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCisgICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQorCisgT3V0cHV0czoKKyAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAorICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKworIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgorICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKKyAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCisgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KKyAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKKyAgICAgIHZhcmlhYmxlX2Jmcl0KKworIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKKyAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQorICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCisgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRlVOQ1RJT04gREVTQ1JJUFRJT04gRk9SIGlkY3Rjb2wKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVRVUlSRU1FTlRTIEZPUiBpZGN0Y29sCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJFRkVSRU5DRVMgRk9SIGlkY3Rjb2wKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUFNFVURPLUNPREUgRk9SIGlkY3Rjb2wKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUkVTT1VSQ0VTIFVTRUQgRk9SIGlkY3Rjb2wKKyAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQorICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCisKKyBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50CisgICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCisKKyAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKKyAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKyBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCisKKyBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCisgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKKyAgICAgICAgICAgY2FsbGVkXQorCisgICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCisgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZ1bmN0aW9uIENvZGUgRk9SIGlkY3Rjb2wKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0Y29sKAorICAgIGludDE2ICpibGsKKykKK3sKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogY29sdW1uICh2ZXJ0aWNhbCkgSURDVAorICAgICoKKyAgICAqIDcgICAgICAgICAgICAgICAgICAgICAgICAgcGkgICAgICAgICAxIGRzdFs4KmtdID0gc3VtIGNbbF0gKiBzcmNbOCpsXSAqCisgICAgKiBjb3MoIC0tICogKCBrICsgLSApICogbCApIGw9MCAgICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAgMgorICAgICoKKyAgICAqIHdoZXJlOiBjWzBdICAgID0gMS8xMDI0IGNbMS4uN10gPSAoMS8xMDI0KSpzcXJ0KDIpICovCisgICAgeDEgPSAoaW50MzIpYmxrWzMyXSA8PCAxMTsKKyAgICB4MiA9IGJsa1s0OF07CisgICAgeDMgPSBibGtbMTZdOworICAgIHg0ID0gYmxrWzhdOworICAgIHg1ID0gYmxrWzU2XTsKKyAgICB4NiA9IGJsa1s0MF07CisgICAgeDcgPSBibGtbMjRdOworI2lmbmRlZiBGQVNUX0lEQ1QKKyAgICAvKiBzaG9ydGN1dCAqLyAgICAgICAgLyogY292ZXJlZCBieSBpZGN0Y29sdW1uMSAgMDEvOS8yMDAxICovCisgICAgaWYgKCEoeDEgfCB4MiB8IHgzIHwgeDQgfCB4NSB8IHg2IHwgeDcpKQorICAgIHsKKyAgICAgICAgYmxrWzBdID0gYmxrWzhdID0gYmxrWzE2XSA9IGJsa1syNF0gPSBibGtbMzJdID0gYmxrWzQwXSA9IGJsa1s0OF0gPSBibGtbNTZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBibGtbMF0gPDwgMzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorCisgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7CisKKyAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgIHg4ID0gVzcgKiAoeDQgKyB4NSk7CisgICAgeDQgPSB4OCArIChXMSAtIFc3KSAqIHg0OworICAgIHg1ID0geDggLSAoVzEgKyBXNykgKiB4NTsKKyAgICB4OCA9IFczICogKHg2ICsgeDcpOworICAgIHg2ID0geDggLSAoVzMgLSBXNSkgKiB4NjsKKyAgICB4NyA9IHg4IC0gKFczICsgVzUpICogeDc7CisKKyAgICAvKiBzZWNvbmQgc3RhZ2UgKi8KKyAgICB4OCA9IHgwICsgeDE7CisgICAgeDAgLT0geDE7CisgICAgeDEgPSBXNiAqICh4MyArIHgyKTsKKyAgICB4MiA9IHgxIC0gKFcyICsgVzYpICogeDI7CisgICAgeDMgPSB4MSArIChXMiAtIFc2KSAqIHgzOworICAgIHgxID0geDQgKyB4NjsKKyAgICB4NCAtPSB4NjsKKyAgICB4NiA9IHg1ICsgeDc7CisgICAgeDUgLT0geDc7CisKKyAgICAvKiB0aGlyZCBzdGFnZSAqLworICAgIHg3ID0geDggKyB4MzsKKyAgICB4OCAtPSB4MzsKKyAgICB4MyA9IHgwICsgeDI7CisgICAgeDAgLT0geDI7CisgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKKworICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgIGJsa1swXSAgICA9ICh4NyArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4MyArIHgyKSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDAgKyB4NCkgPj4gODsKKyAgICBibGtbMjRdID0gKHg4ICsgeDYpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4OCAtIHg2KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDAgLSB4NCkgPj4gODsKKyAgICBibGtbNDhdID0gKHgzIC0geDIpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4NyAtIHgxKSA+PiA4OworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICByZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgIEVuZCBGdW5jdGlvbjogaWRjdGNvbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NhbF9kY19zY2FsZXIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2FsX2RjX3NjYWxlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NhbF9kY19zY2FsZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jYWxfZGNfc2NhbGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjYmU4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKQEAgLTAsMCArMSw3NDQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAibXA0ZGVjX2xpYi5oIiAvKiB2aWRlbyBkZWNvZGVyIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KKyNpbmNsdWRlICJ2bGNfZGVjb2RlLmgiCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisjaW5jbHVkZSAic2NhbGluZy5oIgorI2luY2x1ZGUgIm1idHlwZV9tb2RlLmgiCisKKyNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09ORElUSU9OQUxfSVNfQ09OU1RBTlQKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGVjb2RlRnJhbWVDb21iaW5lZE1vZGUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgYSBmcmFtZSBvZiBNUEVHNCBiaXRzdHJlYW0gaW4gY29tYmluZWQgbW9kZS4gICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwMy8zMC8yMDAwIDogQ2xlYW5lZCB1cCBhbmQgb3B0aW1pemVkIHRoZSBjb2RlLiAgICAgICAgICAgICAqLworLyogICAgICAwMy8zMS8yMDAwIDogQWRkZWQgcHJvcGVyIGhhbmRsaW5nIG9mIE1CIHN0dWZmaW5nLiAgICAgICAgICAqLworLyogICAgICAwNC8xMy8yMDAwIDogUmV3cm90ZSB0aGlzIGNvbWJpbmVkIG1vZGUgcGF0aCBjb21wbGV0ZWx5ICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGl0IGhhbmRsZXMgIkNvbWJpbmVkIE1vZGUgV2l0aCBFcnJvciAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2lsaWVuY2UuIiAgTm93IHRoZSBjb2RlIHJlc2VtYmxlcyB0aGUgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvIGNvZGVzIGluIE1QRUctNCBzdGFuZGFyZCBiZXR0ZXIuICAgICAgICAqLworLyogICAgICAxMC8xMy8yMDAwIDogQWRkIGZhc3QgVkxDK2RlcXVhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAwNC8xMy8yMDAxIDogZml4IE1CX3N0dWZmaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDA4LzA3LzIwMDEgOiByZW1vdmUgTUJ6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZShWaWRlb0RlY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisgICAgaW50IG1ibnVtOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOworICAgIGludCBzaG9ydFZpZGVvSGVhZGVyID0gdmlkZW8tPnNob3J0VmlkZW9IZWFkZXI7CisgICAgaW50MTYgUVAsICpRUE1CID0gdmlkZW8tPlFQTUI7CisgICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKKyAgICBpbnQgbk1CUGVyUm93ID0gdmlkZW8tPm5NQlBlclJvdzsKKyAgICBpbnQgc2xpY2VfY291bnRlcjsKKyAgICB1aW50MzIgdG1wdmFyLCBsb25nX3plcm9fYml0czsKKyAgICB1aW50IGNvZGU7CisgICAgaW50IHZhbGlkX3N0dWZmaW5nOworICAgIGludCByZXN5bmNfbWFya2VyX2xlbmd0aDsKKyAgICBpbnQgc3R1ZmZpbmdfbGVuZ3RoOworCisgICAgLyogYWRkIHRoaXMgZm9yIGVycm9yIHJlc2lsaWVudCwgMDUvMTgvMjAwMCAqLworICAgIGludDMyIHN0YXJ0UGFja2V0OworICAgIGludCBtYl9zdGFydDsKKyAgICAvKiBjb3B5IGFuZCBwYWQgdG8gcHJldl9Wb3AgZm9yIElOVEVSIGNvZGluZyAqLworICAgIHN3aXRjaCAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUpCisgICAgeworICAgICAgICBjYXNlIElfVk9QIDoKKy8vICAgICAgb3NjbF9tZW1zZXQoTW9kZSwgTU9ERV9JTlRSQSwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7CisgICAgICAgICAgICByZXN5bmNfbWFya2VyX2xlbmd0aCA9IDE3OworICAgICAgICAgICAgc3R1ZmZpbmdfbGVuZ3RoID0gOTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBfVk9QIDoKKyAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSo0Km5Ub3RhbE1CKTsKKyAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSo0Km5Ub3RhbE1CKTsKKy8vICAgICAgb3NjbF9tZW1zZXQoTW9kZSwgTU9ERV9JTlRFUiwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7CisgICAgICAgICAgICByZXN5bmNfbWFya2VyX2xlbmd0aCA9IDE2ICsgY3VyclZvcC0+ZmNvZGVGb3J3YXJkOworICAgICAgICAgICAgc3R1ZmZpbmdfbGVuZ3RoID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZSgpOiBWb3AgdHlwZSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICB9CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5hZHZhbmNlZF9JTlRSQSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5tb2RpZmllZF9xdWFudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyX0FubmV4SVQ7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leFQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcl9Bbm5leEk7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bW9kaWZpZWRfcXVhbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyX0FubmV4VDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRlciA9IHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNlbmRpZgorCisgICAgLyoqIEluaXRpYWxpemUgc2xpY2VObyAqKiovCisgICAgbWJudW0gPSBzbGljZV9jb3VudGVyID0gMDsKKy8vICBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7CisgICAgUVAgPSB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyBlcXVpdmFsZW50IHRvIG1vdGlvbl9zaGFwZV90ZXh0dXJlKCkgKi8KKyAgICAgICAgLyogICAgaW4gdGhlIE1QRUctNCBzdGFuZGFyZC4gICAgIDA0LzEzLzIwMDAgICAgICAgICAgKi8KKyAgICAgICAgbWJfc3RhcnQgPSBtYm51bTsKKyAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAgICAgICAgICAgIC8qICAwNC8yNy8wMSAqLworICAgICAgICBzdGFydFBhY2tldCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKKworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICBpZiAodmlkZW8tPm1vZGlmaWVkX3F1YW50KQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+UVBfQ0hSID0gTVFfY2hyb21hX1FQX3RhYmxlW1FQXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSBRUDsgICAgIC8qIEFOTkVYX1QgKi8KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIC8qIHJlbW92ZSBhbnkgc3R1ZmZpbmcgYml0cyAqLworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoLCAmY29kZSk7CisgICAgICAgIHdoaWxlIChjb2RlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCk7CisgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoLCAmY29kZSk7CisgICAgICAgIH0KKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBuZWVkIHZpZGVvLT5tYm51bSBpbiBsb3dlciBsZXZlbCBmdW5jdGlvbnMgKi8KKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7CisgICAgICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OworICAgICAgICAgICAgLyogYXNzaWduIHNsaWNlIG51bWJlciBmb3IgZWFjaCBtYWNyb2Jsb2NrcyAqLworICAgICAgICAgICAgdmlkZW8tPnNsaWNlTm9bbWJudW1dID0gKHVpbnQ4KSBzbGljZV9jb3VudGVyOworCisgICAgICAgICAgICAvKiBkZWNvZGUgQ09ELCBNQ0JQQywgQUNwcmVkX2ZsYWcsIENQQlkgYW5kIERRVUFOVCAqLworICAgICAgICAgICAgLyogV2UgaGF2ZSB0byBkaXNjYXJkIHN0dWZmZWQgTUIgaGVhZGVyICovCisgICAgICAgICAgICBzdGF0dXMgPSBHZXRNQmhlYWRlcih2aWRlbywgJlFQKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OworICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCAoc3RhcnRQYWNrZXQgJiAtOCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdG9yZSB0aGUgUVAgdmFsdWUgZm9yIGxhdGVyIHVzZSBpbiBBQyBwcmVkaWN0aW9uICovCisgICAgICAgICAgICBRUE1CW21ibnVtXSA9IFFQOworCisgICAgICAgICAgICBpZiAoTW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgRENUIGNvZWZpY2llbnRzIGZvciB0aGUgTUIgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBHZXRNQkRhdGEodmlkZW8pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIChzdGFydFBhY2tldCAmIC04KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogTU9ERV9TS0lQUEVEICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2tpcHBlZE1CTW90aW9uQ29tcCh2aWRlbyk7IC8qICAwOC8wNC8wNSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgcHV0IHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2sKKyAgICAgICAgICAgIG1ibnVtKys7CisKKyAgICAgICAgICAgIC8qIHJlbW92ZSBhbnkgc3R1ZmZpbmcgYml0cyAqLworICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOworICAgICAgICAgICAgd2hpbGUgKGNvZGUgPT0gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgpOworICAgICAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgsICZjb2RlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvIHBhY2tldCBvciB2b3A/ICovCisgICAgICAgICAgICBpZiAoc2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgICAgIHsKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAoIXZpZGVvLT5zbGljZV9zdHJ1Y3R1cmUpCisgICAgICAgICAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA+PSAoaW50KSh2aWRlby0+bWJudW1fcm93ICsgMSkqdmlkZW8tPm5NQmluR09CKSAgIC8qICAxMC8xMS8wMSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJudW0gPj0gblRvdGFsTUIpIHJldHVybiBQVl9TVUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIEdPQl9SRVNZTkNfTUFSS0VSX0xFTkdUSCwgJnRtcHZhcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gR09CX1JFU1lOQ19NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfQml0c3RyZWFtU2hvd0JpdHNCeXRlQWxpZ24oc3RyZWFtLCBHT0JfUkVTWU5DX01BUktFUl9MRU5HVEgsICZ0bXB2YXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gR09CX1JFU1lOQ19NQVJLRVIpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKSAgLyogaW4gY2FzZSBubyB2YWxpZCBzdHVmZmluZyAgMDYvMjMvMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nX2gyNjMoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZF9zdHVmZmluZyA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmNlYWxQYWNrZXQodmlkZW8sIG1iX3N0YXJ0LCBuVG90YWxNQiwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBBTk5FWF9LICovCisgICAgICAgICAgICAgICAgICAgIFBWX0JpdHN0cmVhbVNob3dCaXRzQnl0ZUFsaWduTm9Gb3JjZVN0dWZmaW5nKHN0cmVhbSwgMTcsICZ0bXB2YXIpOworICAgICAgICAgICAgICAgICAgICBpZiAodG1wdmFyID09IFJFU1lOQ19NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZ19oMjYzKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRfc3R1ZmZpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qICAwNi8yMS8wMSAqLworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWJudW0gPj0gblRvdGFsTUIpICAvKiBpbiBjYXNlIG5vIHZhbGlkIHN0dWZmaW5nICAwNi8yMy8wMSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogIDExLzAxLzIwMDIgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lIGFuZCB0aGVyZSBpcyBzb21lIGdhcmJhZ2UgZGF0YQorICAgICAgICAgICAgICAgICAgICBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZSAoaS5lLiBubyBuZXh0IHN0YXJ0Y29kZSkgYnJlYWsgaWYgdGhlIHN0dWZmaW5nIGlzIHZhbGlkICovCisgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZyhzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRfc3R1ZmZpbmcgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIDExLzAxLzIwMDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VhbFBhY2tldCh2aWRlbywgbWJfc3RhcnQsIG5Ub3RhbE1CLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQVl9CaXRzdHJlYW1CeXRlQWxpZ24oc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX1NVQ0NFU1M7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfQml0c3RyZWFtU2hvd0JpdHNCeXRlQWxpZ24oc3RyZWFtLCAyMywgJnRtcHZhcik7IC8qIHRoaXMgY2FsbCBpcyB2YWxpZCBmb3IgZl9jb2RlIDwgOCAqLworICAgICAgICAgICAgICAgIGxvbmdfemVyb19iaXRzID0gIXRtcHZhcjsKKworICAgICAgICAgICAgICAgIGlmICgodG1wdmFyID4+ICgyMyAtIHJlc3luY19tYXJrZXJfbGVuZ3RoKSkgPT0gUkVTWU5DX01BUktFUiB8fCBsb25nX3plcm9fYml0cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZyhzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRfc3R1ZmZpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogIDA2LzIxLzAxICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKFRSVUUpOworCisgICAgICAgIGlmIChzaG9ydFZpZGVvSGVhZGVyKQorICAgICAgICB7IC8qIFdlIG5lZWQgdG8gY2hlY2sgbmV3Z29iIHRvIHJlZnJlc2ggcXVhbnRpemVyICovCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAoIXZpZGVvLT5zbGljZV9zdHJ1Y3R1cmUpCisgICAgICAgICAgICB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IFBWX0dvYkhlYWRlcih2aWRlbykpID09IFBWX0ZBSUwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoR09CSGVhZGVyKHN0cmVhbSkpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWJudW0gPSBjdXJyVm9wLT5nb2JOdW1iZXIgKiB2aWRlby0+bk1CaW5HT0I7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBQVl9IMjYzU2xpY2VIZWFkZXIodmlkZW8sICZtYm51bSkpID09IFBWX0ZBSUwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXR1cyA9IHF1aWNrU2VhcmNoSDI2M1NsaWNlSGVhZGVyKHN0cmVhbSkpICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfUmVhZFZpZGVvUGFja2V0SGVhZGVyKHZpZGVvLCAmbWJudW0pKSA9PSBQVl9GQUlMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gcXVpY2tTZWFyY2hWaWRlb1BhY2tldEhlYWRlcihzdHJlYW0sIHJlc3luY19tYXJrZXJfbGVuZ3RoKSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX1ZPUCkKKyAgICAgICAgeworICAgICAgICAgICAgbWJudW0gPSBuVG90YWxNQjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYm51bSA+IHZpZGVvLT5tYm51bSArIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbmNlYWxQYWNrZXQodmlkZW8sIHZpZGVvLT5tYm51bSwgbWJudW0sIHNsaWNlX2NvdW50ZXIpOworICAgICAgICB9CisgICAgICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKKyAgICAgICAgc2xpY2VfY291bnRlcisrOworICAgICAgICBpZiAobWJudW0gPj0gblRvdGFsTUIpIGJyZWFrOworCisgICAgfQorICAgIHdoaWxlIChUUlVFKTsKKyAgICByZXR1cm4gUFZfU1VDQ0VTUzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBHZXRNQkhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgTUIgaGVhZGVyLCBub3RfY29kZWQsIG1jYnBjLCBhY19wcmVkX2ZsYWcsIGNicHksIGRxdWFudC4gICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDMvMjkvMDAgOiBDaGFuZ2VkIHRoZSByZXR1cm5lZCB2YWx1ZSBhbmQgb3B0aW1pemVkIHRoZSBjb2RlLiAgICAqLworLyogICAgICA0LzAxLzAxIDogbmV3IEFDREMgcHJlZGljdGlvbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBHZXRNQmhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApCit7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJudW1fY29sOworICAgIHR5cGVEQ1N0b3JlICpEQyA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKKyAgICB0eXBlRENBQ1N0b3JlICpEQ0FDX3JvdyA9IHZpZGVvLT5wcmVkRENBQ19yb3cgKyB4X3BvczsKKyAgICB0eXBlRENBQ1N0b3JlICpEQ0FDX2NvbCA9IHZpZGVvLT5wcmVkRENBQ19jb2w7CisgICAgY29uc3Qgc3RhdGljIGludDE2ICBEUV90YWJbNF0gPSB7IC0xLCAtMiwgMSwgMn07CisKKyAgICBpbnQgQ0JQWSwgQ0JQQzsKKyAgICBpbnQgTUJ0eXBlLCBWb3BUeXBlOworICAgIGludCBNQ0JQQzsKKyAgICB1aW50IERRVUFOVDsKKyAgICBpbnQgY29tcDsKKyAgICBCb29sIG1iX2NvZGVkOworCisgICAgVm9wVHlwZSA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICBtYl9jb2RlZCA9ICgoVm9wVHlwZSA9PSBJX1ZPUCkgPyBUUlVFIDogIUJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKSk7CisKKyAgICBpZiAoIW1iX2NvZGVkKQorICAgIHsKKyAgICAgICAgLyogc2tpcHBlZCBtYWNyb2Jsb2NrICovCisgICAgICAgIE1vZGVbbWJudW1dID0gTU9ERV9TS0lQUEVEOworICAgICAgICAvL29zY2xfbWVtc2V0KERDQUNfcm93LCAwLCBzaXplb2YodHlwZURDQUNTdG9yZSkpOyAgIC8qICBTS0lQUEVEX0FDREMgKi8KKyAgICAgICAgLy9vc2NsX21lbXNldChEQ0FDX2NvbCwgMCwgc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKyAgICAgICAgWkVST19PVVRfNjRCWVRFUyhEQ0FDX3Jvdyk7CisgICAgICAgIFpFUk9fT1VUXzY0QllURVMoRENBQ19jb2wpOyAvKiAgMDgvMTIvMDUgKi8KKworICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQorICAgICAgICB7CisgICAgICAgICAgICAoKkRDKVtjb21wXSA9IG1pZF9ncmF5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIGNvZGVkIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgaWYgKFZvcFR5cGUgPT0gSV9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludHJhKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICBpZiAoIXZpZGVvLT5kZWJsb2NraW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludGVyKHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50ZXJfSDI2MyhzdHJlYW0pOworICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludGVyKHN0cmVhbSk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQoTUNCUEMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIE1vZGVbbWJudW1dID0gKHVpbnQ4KShNQnR5cGUgPSBNQnR5cGVfbW9kZVtNQ0JQQyAmIDddKTsKKyAgICAgICAgQ0JQQyA9IChNQ0JQQyA+PiA0KSAmIDM7CisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgaWYgKE1CdHlwZSAmIElOVFJBX01BU0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gKHVpbnQ4KSBCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmFkdmFuY2VkX0lOVFJBKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibG9jay0+ZGlyZWN0aW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJsb2NrLT5kaXJlY3Rpb24gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAoKE1CdHlwZSAmIElOVFJBX01BU0spICYmICF2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gKHVpbnQ4KSBCaXRzdHJlYW1SZWFkMUJpdHNfSU5MSU5FKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAwOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgQ0JQWSA9IFBWX1ZsY0RlY0NCUFkoc3RyZWFtLCBNQnR5cGUgJiBJTlRSQV9NQVNLKTsgLyogSU5UUkEgfHwgSU5UUkFfUSAqLworICAgICAgICBpZiAoQ0JQWSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgLy8gR1cgMDQvMjMvOTkKKyAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9ICh1aW50OCkoQ0JQWSA8PCAyIHwgKENCUEMgJiAzKSk7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgIGlmIChNQnR5cGUgJiBRX01BU0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdmlkZW8tPm1vZGlmaWVkX3F1YW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERRVUFOVCA9IEJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCAyKTsKKyAgICAgICAgICAgICAgICAqUVAgKz0gRFFfdGFiW0RRVUFOVF07CisKKyAgICAgICAgICAgICAgICBpZiAoKlFQIDwgMSkgKlFQID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgqUVAgPiAzMSkgKlFQID0gMzE7CisgICAgICAgICAgICAgICAgdmlkZW8tPlFQX0NIUiA9ICpRUDsgIC8qIEFOTkVYX1QgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpRUCArPSBEUV90YWJfQW5uZXhfVF8xMVsqUVBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKlFQICs9IERRX3RhYl9Bbm5leF9UXzEwWypRUF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpRUCA+IDMxKSAqUVAgPSAzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKlFQID0gKGludDE2KUJpdHN0cmVhbVJlYWRCaXRzMTYoc3RyZWFtLCA1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlkZW8tPlFQX0NIUiA9ICBNUV9jaHJvbWFfUVBfdGFibGVbKlFQXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKE1CdHlwZSAmIFFfTUFTSykKKyAgICAgICAgeworICAgICAgICAgICAgRFFVQU5UID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOworICAgICAgICAgICAgKlFQICs9IERRX3RhYltEUVVBTlRdOworCisgICAgICAgICAgICBpZiAoKlFQIDwgMSkgKlFQID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpRUCA+IDMxKSAqUVAgPSAzMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRCZWdpbioqKioqKgorKiAgICAgICAzLzEwLzAwICA6IGluaXRpYWwgbW9kaWZpY2F0aW9uIHRvIHRoZQorKiAgICAgICAgICAgICAgICBuZXcgUFYtRGVjb2RlciBMaWIgZm9ybWF0LgorKiAgICAgICA0LzIvMjAwMCA6IENsZWFudXAgYW5kIGVycm9yLWhhbmRsaW5nIG1vZGlmaWNhdGlvbi4gIFRoaXMKKyogICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaGFzIGJlZW4gZGl2aWRlZCBpbnRvIHNldmVyYWwgc3ViLWZ1bmN0aW9ucyBmb3IKKyogICAgICAgICAgICAgICAgICAgYmV0dGVyIGNvZGluZyBzdHlsZSBhbmQgbWFpbnRhaW5hbmNlIHJlYXNvbi4gIEkgYWxzbworKiAgICAgICAgICAgICAgICAgICBncmVhdGx5IHNocnVuayB0aGUgY29kZSBzaXplIGhlcmUuCisqICAgICAgIDkvMTgvMjAwMCA6IFZsY0RlY29kZStEZXF1YW50IG9wdGltaXphdGlvbiAqCisqICAgICAgIDQvMDEvMjAwMSA6IG5ldyBBQ0RDIHByZWRpY3Rpb24gc3RydWN0dXJlCisqICAgICAgIDMvMjkvMjAwMiA6IHJlbW92ZWQgR2V0SW50cmFNQiBhbmQgR2V0SW50ZXJNQgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCitQVl9TVEFUVVMgR2V0TUJEYXRhKFZpZGVvRGVjRGF0YSAqdmlkZW8pCit7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOworICAgIE1hY3JvQmxvY2sgKm1ibG9jayA9IHZpZGVvLT5tYmxvY2s7CisgICAgaW50MTYgKmRhdGFCbG9jazsKKyAgICBQSVhFTCAqY19jb21wOworICAgIHVpbnQgbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworICAgIHVpbnQgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKyAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07CisgICAgaW50IGludHJhX2RjX3ZsY190aHIgPSB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RocjsKKyAgICBpbnQxNiBRUCA9IHZpZGVvLT5RUE1CW21ibnVtXTsKKyAgICBpbnQxNiBRUF90bXAgPSBRUDsKKyAgICBpbnQgd2lkdGggPSB2aWRlby0+d2lkdGg7CisgICAgaW50ICBjb21wOworICAgIGludCAgc3dpdGNoZWQ7CisgICAgaW50IG5jb2VmZnNbNl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisgICAgaW50ICpub19jb2VmZiA9IG1ibG9jay0+bm9fY29lZmY7CisgICAgaW50MTYgRENfY29lZmY7CisgICAgUFZfU1RBVFVTIHN0YXR1czsKKworICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7CisgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKKyAgICBpbnQzMiBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7CisKKyAgICAvKiBEZWNvZGUgZWFjaCA4LWJ5LTggYmxvY2tzLiBjb21wIDAgfiAzIGFyZSBsdW1pbmFuY2UgYmxvY2tzLCA0IH4gNSAqLworICAgIC8qICBhcmUgY2hyb21pbmFuY2UgYmxvY2tzLiAgIDA0LzAzLzIwMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgLyogIG9zY2xfbWVtc2V0KG1ibG9jay0+YmxvY2ssIDAsIHNpemVvZih0eXBlTUJTdG9yZSkpOyAgICBBdWcgOSwyMDA1ICovCisKKyAgICBpZiAobW9kZSAmIElOVFJBX01BU0spIC8qIE1PREVfSU5UUkEgfHwgTU9ERV9JTlRSQV9RICovCisgICAgeworICAgICAgICBzd2l0Y2hlZCA9IDA7CisgICAgICAgIGlmIChpbnRyYV9kY192bGNfdGhyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKKyAgICAgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsgICAvKiBydW5uaW5nIFFQICAwNC8yNi8wMSAqLworCisgICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgUVBfdG1wID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOworICAgICAgICB9CisKKyAgICAgICAgbWJsb2NrLT5EQ1NjYWxhckx1bSA9IGNhbF9kY19zY2FsZXIoUVAsIExVTUlOQU5DRV9EQ19UWVBFKTsgICAvKiAgMy8wMS8wMSAqLworICAgICAgICBtYmxvY2stPkRDU2NhbGFyQ2hyID0gY2FsX2RjX3NjYWxlcihRUCwgQ0hST01JTkFOQ0VfRENfVFlQRSk7CisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YUJsb2NrID0gbWJsb2NrLT5ibG9ja1tjb21wXTsgICAgLyogMTAvMjAvMjAwMCAqLworCisgICAgICAgICAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgICAgICB7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgaWYgKCF2aWRlby0+YWR2YW5jZWRfSU5UUkEpCisgICAgICAgICAgICAgICAgeworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIERDX2NvZWZmID0gKGludDE2KSBCaXRzdHJlYW1SZWFkQml0czE2X0lOTElORShzdHJlYW0sIDgpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoRENfY29lZmYgJiAweDdmKSA9PSAwKSAvKiAxMjggJiAwICAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgd2Ugd2lsbCBvbmx5IHNpZ25hbCBGQUlMIGZvciAxMjguIFdlIHdpbGwgaWdub3JlIHRoZSAwIGNhc2UgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRENfY29lZmYgPT0gMTI4KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChEQ19jb2VmZiA9PSAyNTUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERDX2NvZWZmID0gMTI4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRhdGFCbG9ja1swXSA9IChpbnQxNikgRENfY29lZmY7CisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9ja19TSCh2aWRlbywgY29tcCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3dpdGNoZWQgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0RlY29kZVByZWRpY3RlZEludHJhREMoY29tcCwgc3RyZWFtLCAmRENfY29lZmYpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICAgICAgICAgIGRhdGFCbG9ja1swXSA9IChpbnQxNikgRENfY29lZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2sodmlkZW8sIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaGVkLCBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzW2NvbXBdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3dpdGNoZWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSAxOworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldCgoZGF0YUJsb2NrICsgMSksIDAsIHNpemVvZihpbnQxNikqNjMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vX2NvZWZmW2NvbXBdID0gbmNvZWZmc1tjb21wXTsKKworICAgICAgICB9CisgICAgICAgIE1CbG9ja0lEQ1QodmlkZW8pOworICAgIH0KKyAgICBlbHNlICAgICAgLyogSU5URVIgbW9kZXMgKi8KKyAgICB7ICAgLyogIG1vdmVkIGl0IGhlcmUgQXVnIDE1LCAyMDA1ICovCisgICAgICAgIC8qIGRlY29kZSB0aGUgbW90aW9uIHZlY3RvciAoaWYgdGhlcmUgYXJlIGFueSkgKi8KKyAgICAgICAgc3RhdHVzID0gUFZfR2V0TUJ2ZWN0b3JzKHZpZGVvLCBtb2RlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKworICAgICAgICBNQk1vdGlvbkNvbXAodmlkZW8sIENCUCk7CisgICAgICAgIGNfY29tcCAgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7CisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKKyAgICAgICAgICAgIGlmIChDQlAgJiAoMSA8PCAoNSAtIGNvbXApKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCBjb21wLCBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKyAgICAgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgICAgIEJsb2NrSURDVChjX2NvbXAgKyAoY29tcCYyKSood2lkdGggPDwgMikgKyA4Kihjb21wJjEpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAoY29tcCYyKSo2NCArIDgqKGNvbXAmMSksIG1ibG9jay0+YmxvY2tbY29tcF0sIHdpZHRoLCBuY29lZmZzW2NvbXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+UVBNQlttYm51bV0gPSB2aWRlby0+UVBfQ0hSOyAgICAgLyogQU5ORVhfVCAqLworCisKKworICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OworICAgICAgICBpZiAoQ0JQICYgMikKKyAgICAgICAgeworICAgICAgICAgICAgbmNvZWZmc1s0XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNCwgbWJsb2NrLT5iaXRtYXBjb2xbNF0sICZtYmxvY2stPmJpdG1hcHJvd1s0XSk7CisgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNF0pKSByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOworCisgICAgICAgIH0KKyAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKKyAgICAgICAgaWYgKENCUCAmIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNV0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDUsIG1ibG9jay0+Yml0bWFwY29sWzVdLCAmbWJsb2NrLT5iaXRtYXByb3dbNV0pOworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzVdKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNjQsIG1ibG9jay0+YmxvY2tbNV0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNV0sCisgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sIG1ibG9jay0+Yml0bWFwcm93WzVdKTsKKworICAgICAgICB9CisgICAgICAgIHZpZGVvLT5RUE1CW21ibnVtXSA9IFFQOyAgLyogcmVzdG9yZSB0aGUgUVAgdmFsdWVzICBBTk5FWF9UKi8KKyNlbHNlCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7CisgICAgICAgICAgICBpZiAoQ0JQICYgKDEgPDwgKDUgLSBjb21wKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgY29tcCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisgICAgICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzW2NvbXBdKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKCpEQylbNF0gPSBtaWRfZ3JheTsKKyAgICAgICAgaWYgKENCUCAmIDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDQsIG1ibG9jay0+Yml0bWFwY29sWzRdLCAmbWJsb2NrLT5iaXRtYXByb3dbNF0pOworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzRdKSkgcmV0dXJuIFBWX0ZBSUw7CisKKyAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLworICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLworICAgICAgICB9CisgICAgICAgICgqREMpWzVdID0gbWlkX2dyYXk7CisgICAgICAgIGlmIChDQlAgJiAxKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzVdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA1LCBtYmxvY2stPmJpdG1hcGNvbFs1XSwgJm1ibG9jay0+Yml0bWFwcm93WzVdKTsKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s1XSkpIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAorICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KKyNlbmRpZiAgLy8gUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisKKworCisKKworCisgICAgfQorCisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAgICAgICAgIC8qIHNob3VsZCBiZSBzZXQgYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IENvZGVkICAwNC8yNy8wMSAqLworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29uY2VhbC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb25jZWFsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29uY2VhbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbmNlYWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDcxZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcApAQCAtMCwwICsxLDc1OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWNfbGliLmgiCisjaW5jbHVkZSAidmxjX2RlY29kZS5oIgorI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorI2luY2x1ZGUgInNjYWxpbmcuaCIKKyNpbmNsdWRlICJtYnR5cGVfbW9kZS5oIgorI2luY2x1ZGUgImlkY3QuaCIKKworI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05ESVRJT05BTF9JU19DT05TVEFOVAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERlY29kZSBhIGZyYW1lIG9mIE1QRUc0IGJpdHN0cmVhbSBpbiBkYXRhcGFydGl0aW9uaW5nIG1vZGUuICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIDA0LzI1LzIwMDAgOiBSZXdyaXRlIHRoZSBkYXRhIHBhcnRpdGlvbmluZyBwYXRoIGNvbXBsZXRlbHkgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgcHNldWRvIGNvZGVzIGluIE1QRUctNCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogMDkvMTgvMjAwMCBhZGQgZmFzdCBWbGNEZWNvZGUrRGVxdWFudCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIDA0LzE3LzIwMDEgY2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZShWaWRlb0RlY0RhdGEgKnZpZGVvKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisgICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07CisKKyAgICBpbnQgbk1CUGVyUm93ID0gdmlkZW8tPm5NQlBlclJvdzsKKworICAgIGludCB2b3BUeXBlID0gY3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgaW50IG1ibnVtOworICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKKyAgICBpbnQgc2xpY2VfY291bnRlcjsKKyAgICBpbnQgcmVzeW5jX21hcmtlcl9sZW5ndGg7CisKKyAgICAvKiBjb3B5IGFuZCBwYWQgdG8gcHJldl9Wb3AgZm9yIElOVEVSIGNvZGluZyAqLworICAgIHN3aXRjaCAodm9wVHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgSV9WT1AgOgorLy8gICAgICBvc2NsX21lbXNldChNb2RlLCBNT0RFX0lOVFJBLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKKyAgICAgICAgICAgIHJlc3luY19tYXJrZXJfbGVuZ3RoID0gMTc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQX1ZPUCA6CisgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7CisgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkqNCpuVG90YWxNQik7CisvLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5URVIsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOworICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNiArIGN1cnJWb3AtPmZjb2RlRm9yd2FyZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZUZyYW1lRGF0YVBhcnRNb2RlKCk6IFZvcCB0eXBlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgIH0KKworICAgIC8qKiBJbml0aWFsaXplIHNsaWNlTm8gKioqLworICAgIG1ibnVtID0gc2xpY2VfY291bnRlciA9IDA7CisvLyAgb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFRoaXMgc2VjdGlvbiBpcyBlcXVpdmFsZW50IHRvIG1vdGlvbl9zaGFwZV90ZXh0dXJlKCkgKi8KKyAgICAgICAgLyogaW4gdGhlIE1QRUctNCBzdGFuZGFyZC4gICAgICAgICAgICAwNC8xMy8yMDAwICAgICAgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOyAgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKworICAgICAgICBzd2l0Y2ggKHZvcFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSV9WT1AgOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZURhdGFQYXJ0X0lfVmlkZW9QYWNrZXQodmlkZW8sIHNsaWNlX2NvdW50ZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFBfVk9QIDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBEZWNvZGVEYXRhUGFydF9QX1ZpZGVvUGFja2V0KHZpZGVvLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoKTogVm9wIHR5cGUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBQVl9SZWFkVmlkZW9QYWNrZXRIZWFkZXIodmlkZW8sICZtYm51bSkpID09IFBWX0ZBSUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gcXVpY2tTZWFyY2hWaWRlb1BhY2tldEhlYWRlcihzdHJlYW0sIHJlc3luY19tYXJrZXJfbGVuZ3RoKSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfRU5EX09GX1ZPUCkKKyAgICAgICAgeworICAgICAgICAgICAgbWJudW0gPSBuVG90YWxNQjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYm51bSA+IHZpZGVvLT5tYm51bSArIDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbmNlYWxQYWNrZXQodmlkZW8sIHZpZGVvLT5tYm51bSwgbWJudW0sIHNsaWNlX2NvdW50ZXIpOworICAgICAgICB9CisgICAgICAgIHNsaWNlX2NvdW50ZXIrKzsKKyAgICAgICAgaWYgKG1ibnVtID49IG5Ub3RhbE1CKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICB9CisgICAgd2hpbGUgKFRSVUUpOworCisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBEZWNvZGVEYXRhUGFydF9JX1ZpZGVvUGFja2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzI1LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRGVjb2RlIERhdGEgUGFydGl0aW9uZWQgTW9kZSBWaWRlbyBQYWNrZXQgaW4gSS1WT1AgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBQVl9GQUlMIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogMDkvMTgvMjAwMCBhZGQgZmFzdCBWbGNEZWNvZGUrRGVxdWFudCAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIDA0LzAxLzIwMDEgZml4ZWQgTUJfc3R1ZmZpbmcsIHJlbW92ZWQgdW5uZWNlc3NhcnkgY29kZSAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK1BWX1NUQVRVUyBEZWNvZGVEYXRhUGFydF9JX1ZpZGVvUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBzbGljZV9jb3VudGVyKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXM7CisgICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOworICAgIGludCAgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7CisgICAgaW50ICBtYm51bSwgbWJfc3RhcnQsIG1iX2VuZDsKKyAgICBpbnQxNiBRUCwgKlFQTUIgPSB2aWRlby0+UVBNQjsKKyAgICBpbnQgIE1CdHlwZSwgTUNCUEMsIENCUFk7CisgICAgdWludDMyIHRtcHZhcjsKKyAgICB1aW50IGNvZGU7CisgICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7CisgICAgQm9vbCB2YWxpZF9zdHVmZmluZzsKKyAgICBpbnQzMiBzdGFydFNlY29uZFBhcnQsIHN0YXJ0Rmlyc3RQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOworCisgICAgLyogZGVjb2RlIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KKyAgICBRUCA9IHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXI7CisgICAgbWJfc3RhcnQgPSBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICB2aWRlby0+dXNlUHJldlFQID0gMDsgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KKworCisgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDksICZjb2RlKTsKKyAgICB3aGlsZSAoY29kZSA9PSAxKQorICAgIHsKKyAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOSk7CisgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7CisgICAgfQorCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIGRlY29kZSBDT0QsIE1DQlBDLCBBQ3ByZWRfZmxhZywgQ1BCWSBhbmQgRFFVQU5UICovCisgICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludHJhKHN0cmVhbSk7CisKKyAgICAgICAgaWYgKCFWTENfRVJST1JfREVURUNURUQoTUNCUEMpKQorICAgICAgICB7CisgICAgICAgICAgICBNb2RlW21ibnVtXSA9ICh1aW50OCkoTUJ0eXBlID0gTUJ0eXBlX21vZGVbTUNCUEMgJiA3XSk7CisgICAgICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gKHVpbnQ4KSgoTUNCUEMgPj4gNCkgJiAzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKHZpZGVvLCAmUVApOworICAgICAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAgICAgICAvKiBzZXQgaXQgYWZ0ZXIgdGhlIGZpcnN0IGNvZGVkIE1CICAgICAgMDQvMjcvMDEgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7CisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSAodWludDgpIHNsaWNlX2NvdW50ZXI7CisgICAgICAgIFFQTUJbbWJudW1dID0gUVA7CisgICAgICAgIHZpZGVvLT5tYm51bSA9ICsrbWJudW07CisKKyAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDksICZjb2RlKTsKKyAgICAgICAgd2hpbGUgKGNvZGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgOSk7CisgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgOSwgJmNvZGUpOworICAgICAgICB9CisgICAgICAgIC8qIGhhdmUgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyBwYWNrZXQgb3Igdm9wPyAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgRENfTUFSS0VSX0xFTkdUSCwgJnRtcHZhcik7CisKKyAgICB9CisgICAgd2hpbGUgKHRtcHZhciAhPSBEQ19NQVJLRVIgJiYgdmlkZW8tPm1ibnVtIDwgblRvdGFsTUIpOworCisgICAgaWYgKHRtcHZhciA9PSBEQ19NQVJLRVIpCisgICAgeworICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBEQ19NQVJLRVJfTEVOR1RIKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gcXVpY2tTZWFyY2hEQ00oc3RyZWFtKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBvbmx5IHdheSB5b3UgY2FuIGVuZCB1cCBiZWluZyBoZXJlIGlzIGluIHRoZSBsYXN0IHBhY2tldCxhbmQgdGhlcmUgaXMgc3R1ZmZpbmcgYXQKKyAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IHBhcnRpdGlvbiAqLworICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgRENfTUFSS0VSX0xFTkdUSCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCisgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7CisgICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKKyAgICAgICAgICAgIC8qIGNvbmNlYWxtZW50IHdpbGwgYmUgdGFrZW4gY2FyZSBvZiBpbiB0aGUgdXBwZXIgbGF5ZXIgKi8KKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVjb2RlIHRoZSBzZWNvbmQgcGFydGl0aW9uICovCisgICAgc3RhcnRTZWNvbmRQYXJ0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOworCisgICAgbWJfZW5kID0gdmlkZW8tPm1ibnVtOworCisgICAgZm9yIChtYm51bSA9IG1iX3N0YXJ0OyBtYm51bSA8IG1iX2VuZDsgbWJudW0rKykKKyAgICB7CisgICAgICAgIE1CdHlwZSA9IE1vZGVbbWJudW1dOworICAgICAgICAvKiBObyBza2lwcGVkIG1vZGUgaW4gSS1wYWNrZXRzICAzLzEvMjAwMSAgICAqLworICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKKworICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7CisgICAgICAgIC8qIHRoZXJlIGlzIGFsd2F5cyBhY2RjcHJlZCBpbiBEYXRhUGFydCBtb2RlICAwNC8xMC8wMSAqLworICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAodWludDgpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOworCisgICAgICAgIENCUFkgPSBQVl9WbGNEZWNDQlBZKHN0cmVhbSwgTUJ0eXBlICYgSU5UUkFfTUFTSyk7IC8qIE1PREVfSU5UUkEgfHwgTU9ERV9JTlRSQV9RICovCisgICAgICAgIGlmIChDQlBZIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsgLyogICovCisgICAgICAgICAgICAvKiBDb25jZWFsIHBhY2tldCwgIDA1LzE1LzIwMDAgKi8KKyAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX0kodmlkZW8sIHN0YXJ0Rmlyc3RQYXJ0LCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSB8PSAodWludDgpKENCUFkgPDwgMik7CisgICAgfQorCisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7CisKKyAgICBmb3IgKG1ibnVtID0gbWJfc3RhcnQ7IG1ibnVtIDwgbWJfZW5kOyBtYm51bSsrKQorICAgIHsKKyAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisKKyAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0gLCBuTUJQZXJSb3cpOyAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLworICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OworICAgICAgICAvKiBObyBza2lwcGVkIG1vZGUgaW4gSS1wYWNrZXRzICAzLzEvMjAwMSAgICAqLworICAgICAgICAvKiBkZWNvZGUgdGhlIERDVCBjb2VmaWNpZW50cyBmb3IgdGhlIE1CICovCisgICAgICAgIHN0YXR1cyA9IEdldE1CRGF0YV9EYXRhUGFydCh2aWRlbyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsgLyogICovCisgICAgICAgICAgICAvKiBDb25jZWFsIHBhY2tldCwgIDA1LzE1LzIwMDAgKi8KKyAgICAgICAgICAgIENvbmNlYWxUZXh0dXJlX0kodmlkZW8sIHN0YXJ0Rmlyc3RQYXJ0LCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAgICAgICAgICAvKiAgMDQvMjcvMDEgc2hvdWxkIGJlIHNldCBhZnRlciBkZWNvZGluZyBmaXJzdCBNQiAqLworICAgIH0KKworICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZyhzdHJlYW0pOworICAgIGlmICghdmFsaWRfc3R1ZmZpbmcpCisgICAgeworICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7CisgICAgICAgIENvbmNlYWxUZXh0dXJlX0kodmlkZW8sIHN0YXJ0Rmlyc3RQYXJ0LCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgfQorICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGVjb2RlRGF0YVBhcnRfUF9WaWRlb1BhY2tldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8yNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERlY29kZSBEYXRhIFBhcnRpdGlvbmVkIE1vZGUgVmlkZW8gUGFja2V0IGluIFAtVk9QICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgUFZfRkFJTCBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgMDkvMTgvMjAwMCwgIGZhc3QgVmxjRGVjb2RlK0RlcXVhbnQgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIDA0LzEzLzIwMDEsICBmaXhlZCBNQl9zdHVmZmluZywgbmV3IEFDREMgcHJlZCBzdHJ1Y3R1cmUsICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgMDgvMDcvMjAwMSwgIHJlbW92ZSBNQnplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRGVjb2RlRGF0YVBhcnRfUF9WaWRlb1BhY2tldChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgc2xpY2VfY291bnRlcikKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzOworICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKKyAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7CisgICAgaW50IG1ibnVtLCBtYl9zdGFydCwgbWJfZW5kOworICAgIGludDE2IFFQLCAqUVBNQiA9IHZpZGVvLT5RUE1COworICAgIGludCBNQnR5cGUsIENCUFk7CisgICAgQm9vbCB2YWxpZF9zdHVmZmluZzsKKyAgICBpbnQgaW50cmFfTUI7CisgICAgdWludDMyIHRtcHZhcjsKKyAgICB1aW50IGNvZGU7CisgICAgaW50MzIgIHN0YXJ0Rmlyc3RQYXJ0LCBzdGFydFNlY29uZFBhcnQ7CisgICAgaW50IG5NQlBlclJvdyA9IHZpZGVvLT5uTUJQZXJSb3c7CisgICAgdWludDggKnBieXRlOworICAgIC8qIGRlY29kZSB0aGUgZmlyc3QgcGFydGl0aW9uICovCisgICAgc3RhcnRGaXJzdFBhcnQgPSBnZXRQb2ludGVyKHN0cmVhbSk7CisgICAgbWJfc3RhcnQgPSB2aWRlby0+bWJudW07CisgICAgdmlkZW8tPnVzZVByZXZRUCA9IDA7ICAgICAgICAgICAgLyogIDA0LzI3LzAxICovCisKKyAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgMTAsICZjb2RlKTsKKyAgICB3aGlsZSAoY29kZSA9PSAxKQorICAgIHsKKyAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgMTApOworICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgMTAsICZjb2RlKTsKKyAgICB9CisKKyAgICBkbworICAgIHsKKyAgICAgICAgLyogZGVjb2RlIENPRCwgTUNCUEMsIEFDcHJlZF9mbGFnLCBDUEJZIGFuZCBEUVVBTlQgKi8KKyAgICAgICAgLyogV2UgaGF2ZSB0byBkaXNjYXJkIHN0dWZmZWQgTUIgaGVhZGVyICovCisKKyAgICAgICAgc3RhdHVzID0gR2V0TUJoZWFkZXJEYXRhUGFydF9QKHZpZGVvKTsKKworICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKKyAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSBtdXN0IHVwZGF0ZSBzbGljZV9jb3VudGVyIGJlZm9yZSBtb3Rpb24gdmVjdG9yIGRlY29kaW5nLiAgICovCisgICAgICAgIHZpZGVvLT5zbGljZU5vW3ZpZGVvLT5tYm51bV0gPSAodWludDgpIHNsaWNlX2NvdW50ZXI7CisKKyAgICAgICAgaWYgKE1vZGVbdmlkZW8tPm1ibnVtXSAmIElOVEVSX01BU0spIC8qIElOVEVSIHx8IElOVEVSX1EgfHwgSU5URVJfNFYgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBtb3Rpb24gdmVjdG9yIChpZiB0aGVyZSBhcmUgYW55KSAqLworICAgICAgICAgICAgc3RhdHVzID0gUFZfR2V0TUJ2ZWN0b3JzKHZpZGVvLCBNb2RlW3ZpZGVvLT5tYm51bV0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KKyAgICAgICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKKyAgICAgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOworICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OworICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpZGVvLT5tYm51bSsrOworCisgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKHZpZGVvLT5tYm51bSwgbk1CUGVyUm93KTsgICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbWJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCisgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSB2aWRlby0+bWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OworCisgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCAxMCwgJmNvZGUpOworICAgICAgICB3aGlsZSAoY29kZSA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCAxMCk7CisgICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgMTAsICZjb2RlKTsKKyAgICAgICAgfQorICAgICAgICAvKiBoYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gcGFja2V0IG9yIHZvcD8gKi8KKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtU2hvd0JpdHMzMihzdHJlYW0sIE1PVElPTl9NQVJLRVJfQ09NQl9MRU5HVEgsICZ0bXB2YXIpOworICAgICAgICAvKiAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUyAmJiBzdGF0dXMgIT0gUFZfRU5EX09GX0JVRkZFUikgcmV0dXJuIHN0YXR1czsgICovCisgICAgfQorICAgIHdoaWxlICh0bXB2YXIgIT0gTU9USU9OX01BUktFUl9DT01CICYmIHZpZGVvLT5tYm51bSA8IG5Ub3RhbE1CKTsKKworICAgIGlmICh0bXB2YXIgPT0gTU9USU9OX01BUktFUl9DT01CKQorICAgIHsKKyAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgTU9USU9OX01BUktFUl9DT01CX0xFTkdUSCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHF1aWNrU2VhcmNoTW90aW9uTWFya2VyKHN0cmVhbSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgLyogb25seSB3YXkgeW91IGNhbiBlbmQgdXAgYmVpbmcgaGVyZSBpcyBpbiB0aGUgbGFzdCBwYWNrZXQsYW5kIHRoZXJlIGlzIHN0dWZmaW5nIGF0CisgICAgICAgICAgICB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KKyAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIE1PVElPTl9NQVJLRVJfQ09NQl9MRU5HVEgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOworICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7CisgICAgICAgICAgICAvKiBjb25jZWFsbWVudCB3aWxsIGJlIHRha2VuIGNhcmUgb2YgaW4gdGhlIHVwcGVyIGxheWVyICAqLworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkZWNvZGUgdGhlIHNlY29uZCBwYXJ0aXRpb24gKi8KKyAgICBzdGFydFNlY29uZFBhcnQgPSBnZXRQb2ludGVyKHN0cmVhbSk7CisgICAgUVAgPSB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyOworCisgICAgbWJfZW5kID0gdmlkZW8tPm1ibnVtOworCisgICAgZm9yIChtYm51bSA9IG1iX3N0YXJ0OyBtYm51bSA8IG1iX2VuZDsgbWJudW0rKykKKyAgICB7CisgICAgICAgIE1CdHlwZSA9IE1vZGVbbWJudW1dOworCisgICAgICAgIGlmIChNQnR5cGUgPT0gTU9ERV9TS0lQUEVEKQorICAgICAgICB7CisgICAgICAgICAgICBRUE1CW21ibnVtXSA9IFFQOyAvKiAgMDMvMDEvMDEgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludHJhX01CID0gKE1CdHlwZSAmIElOVFJBX01BU0spOyAvKiAoTUJ0eXBlID09IE1PREVfSU5UUkEgfHwgTUJ0eXBlID09IE1PREVfSU5UUkFfUSkgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07CisgICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOyAgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKworICAgICAgICAvKiB0aGVyZSBpcyBhbHdheXMgYWNkY3ByZWRpY3Rpb24gaW4gRGF0YVBhcnQgbW9kZSAgICAwNC8xMC8wMSAqLworICAgICAgICBpZiAoaW50cmFfTUIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzX0lOTElORShzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgQ0JQWSA9IFBWX1ZsY0RlY0NCUFkoc3RyZWFtLCBpbnRyYV9NQik7CisgICAgICAgIGlmIChDQlBZIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgICAgICAvKiBDb25jZWFsIHNlY29uZCBwYXJ0aXRpb24sICA1LzE1LzIwMDAgKi8KKyAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOworICAgICAgICAgICAgQ29uY2VhbFRleHR1cmVfUCh2aWRlbywgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gfD0gKHVpbnQ4KShDQlBZIDw8IDIpOworICAgICAgICBpZiAoaW50cmFfTUIgfHwgTUJ0eXBlID09IE1PREVfSU5URVJfUSkgICAgICAgICAgICAgICAgICAgICAvKiAgMDQvMjYvMDEgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJoZWFkZXJEYXRhUGFydF9EUVVBTlRfREModmlkZW8sICZRUCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAgICAgICAvKiAgMDQvMjcvMDEgKi8KKyAgICAgICAgUVBNQlttYm51bV0gPSBRUDsKKyAgICB9CisKKyAgICB2aWRlby0+dXNlUHJldlFQID0gMDsgIC8qICAwNC8yNy8wMSAqLworCisgICAgZm9yIChtYm51bSA9IG1iX3N0YXJ0OyBtYm51bSA8IG1iX2VuZDsgbWJudW0rKykKKyAgICB7CisgICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOworICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKKworCisgICAgICAgIGlmIChNb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGRlY29kZSB0aGUgRENUIGNvZWZpY2llbnRzIGZvciB0aGUgTUIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CRGF0YV9EYXRhUGFydCh2aWRlbyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLworICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOworCisgICAgICAgICAgICAgICAgLyogQ29uY2VhbCBzZWNvbmQgcGFydGl0aW9uLCAgNS8xNS8yMDAwICovCisgICAgICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7CisgICAgICAgICAgICAgICAgQ29uY2VhbFRleHR1cmVfUCh2aWRlbywgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvLT51c2VQcmV2UVAgPSAxOyAgLyogIDA0LzI3LzAxICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgLy8gU0tJUFBFRAorCisgICAgICAgICAgICAvKiBNb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBwdXQgaXQgdG8gdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jayAqLworICAgICAgICAgICAgU2tpcHBlZE1CTW90aW9uQ29tcCh2aWRlbyk7CisKKyAgICAgICAgICAgIC8vb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX3JvdyArIHZpZGVvLT5tYm51bV9jb2wsIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7IC8qICBTS0lQUEVEX0FDREMgKi8KKyAgICAgICAgICAgIC8vb3NjbF9tZW1zZXQodmlkZW8tPnByZWREQ0FDX2NvbCwgMCwgc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKyAgICAgICAgICAgIC8qICAwOC8wOC8yMDA1ICovCisgICAgICAgICAgICBwYnl0ZSA9ICh1aW50OCopKHZpZGVvLT5wcmVkRENBQ19yb3cgKyB2aWRlby0+bWJudW1fY29sKTsKKyAgICAgICAgICAgIFpFUk9fT1VUXzY0QllURVMocGJ5dGUpOworICAgICAgICAgICAgcGJ5dGUgPSAodWludDgqKSh2aWRlby0+cHJlZERDQUNfY29sKTsKKyAgICAgICAgICAgIFpFUk9fT1VUXzY0QllURVMocGJ5dGUpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmcoc3RyZWFtKTsgICAvKiAgKi8KKyAgICBpZiAoIXZhbGlkX3N0dWZmaW5nKQorICAgIHsKKyAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7CisgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOyAvKiAgKi8KKyAgICAgICAgQ29uY2VhbFRleHR1cmVfUCh2aWRlbywgbWJfc3RhcnQsIG1iX2VuZCwgc2xpY2VfY291bnRlcik7CisKKyAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgfQorICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogR2V0TUJoZWFkZXJEYXRhUGFydF9EUVVBTlRfREMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8yNi8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERlY29kZSBEUVVBTlQgYW5kIERDIGluIERhdGEgUGFydGl0aW9uZWQgTW9kZSBmb3IgYm90aCAgICAgICAqLworLyogICAgICAgICAgICAgSS1WT1AgYW5kIFAtVk9QLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBQVl9GQUlMIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogMDIvMTMvMjAwMSBuZXcgQUNEQyBwcmVkaWN0aW9uIHN0cnVjdHVyZSwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworUFZfU1RBVFVTIEdldE1CaGVhZGVyRGF0YVBhcnRfRFFVQU5UX0RDKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludDE2ICpRUCkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgaW50IGludHJhX2RjX3ZsY190aHIgPSB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RocjsKKyAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7CisgICAgaW50ICBNQnR5cGUgPSBNb2RlW21ibnVtXTsKKyAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07CisgICAgaW50ICBjb21wOworICAgIEJvb2wgc3dpdGNoZWQ7CisgICAgdWludCAgRFFVQU5UOworICAgIGludDE2IFFQX3RtcDsKKworICAgIGNvbnN0IHN0YXRpYyBpbnQgIERRX3RhYls0XSA9IHsgLTEsIC0yLCAxLCAyfTsKKworICAgIGlmIChNQnR5cGUgJiBRX01BU0spICAgICAgICAgICAgIC8qIElOVFJBX1EgfHwgSU5URVJfUSAqLworICAgIHsKKyAgICAgICAgRFFVQU5UID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOworICAgICAgICAqUVAgKz0gRFFfdGFiW0RRVUFOVF07CisKKyAgICAgICAgaWYgKCpRUCA8IDEpICpRUCA9IDE7CisgICAgICAgIGVsc2UgaWYgKCpRUCA+IDMxKSAqUVAgPSAzMTsKKyAgICB9CisgICAgaWYgKE1CdHlwZSAmIElOVFJBX01BU0spICAvKiBJTlRSQSB8fCBJTlRSQV9RICovIC8qIG5vIHN3aXRjaCwgY29kZSBEQyBzZXBhcmF0ZWx5ICovCisgICAgeworICAgICAgICBRUF90bXAgPSAqUVA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgUVAgIDA0LzI2LzAxKi8KKyAgICAgICAgc3dpdGNoZWQgPSAwOworICAgICAgICBpZiAoaW50cmFfZGNfdmxjX3RocikgICAgICAgICAgICAgICAgIC8qICAwNC8yNy8wMSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKKyAgICAgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsKKyAgICAgICAgICAgIHN3aXRjaGVkID0gKGludHJhX2RjX3ZsY190aHIgPT0gNyB8fCBRUF90bXAgPj0gaW50cmFfZGNfdmxjX3RociAqIDIgKyAxMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzd2l0Y2hlZCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9EZWNvZGVQcmVkaWN0ZWRJbnRyYURDKGNvbXAsIHN0cmVhbSwgKCpEQyArIGNvbXApKTsgICAvKiAgMDMvMDEvMDEgKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpIHJldHVybiBQVl9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKkRDKVtjb21wXSA9IDA7ICAgLyogIDA0LzI2LzAxIG5lZWRlZCBmb3Igc3dpdGNoZWQgY2FzZSovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50QmVnaW4qKioqKioKKyogICAgICAgMDQvMjUvMjAwMCA6IEluaXRpYWwgbW9kaWZpY2F0aW9uIHRvIHRoZSBuZXcgUFYgTGliIGZvcm1hdC4KKyogICAgICAgMDQvMTcvMjAwMSA6IG5ldyBBQ0RDIHByZWQgc3RydWN0dXJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KK1BWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X1AoVmlkZW9EZWNEYXRhICp2aWRlbykKK3sKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKKyAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07CisgICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOworICAgIHR5cGVEQ1N0b3JlICpEQyA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKKyAgICB1aW50IG5vX2RjdF9mbGFnOworICAgIGludCBjb21wOworICAgIGludCBNQ0JQQzsKKworICAgIG5vX2RjdF9mbGFnID0gQml0c3RyZWFtUmVhZDFCaXRzX0lOTElORShzdHJlYW0pOworCisgICAgaWYgKG5vX2RjdF9mbGFnKQorICAgIHsKKyAgICAgICAgLyogc2tpcHBlZCBtYWNyb2Jsb2NrICovCisgICAgICAgIE1vZGVbbWJudW1dID0gTU9ERV9TS0lQUEVEOworCisgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7CisgICAgICAgICAgICAvKiAgQUNEQyBSRU1PVkUgQUMgY29lZnMgYXJlIHNldCBpbiBEZWNvZGVEYXRhUGFydF9QICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogY29kZWQgbWFjcm9ibG9jayAqLworICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcihzdHJlYW0pOworCisgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQoTUNCUEMpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIE1vZGVbbWJudW1dID0gKHVpbnQ4KU1CdHlwZV9tb2RlW01DQlBDICYgN107CisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gPSAodWludDgpKChNQ0JQQyA+PiA0KSAmIDMpOworICAgIH0KKworICAgIHJldHVybiBQVl9TVUNDRVNTOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRCZWdpbioqKioqKgorKiAgICAgICAwNC8xNy8wMSAgbmV3IEFDREMgcHJlZCBzdHJ1Y3R1cmUsIHJlb3JnYW5pemVkIGNvZGUsIGNsZWFudXAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLworUFZfU1RBVFVTIEdldE1CRGF0YV9EYXRhUGFydChWaWRlb0RlY0RhdGEgKnZpZGVvKQoreworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKyAgICBpbnQxNiAqZGF0YUJsb2NrOworICAgIE1hY3JvQmxvY2sgKm1ibG9jayA9IHZpZGVvLT5tYmxvY2s7CisgICAgaW50IFFQID0gdmlkZW8tPlFQTUJbbWJudW1dOworICAgIGludDMyIG9mZnNldDsKKyAgICBQSVhFTCAqY19jb21wOworICAgIGludCB3aWR0aCA9IHZpZGVvLT53aWR0aDsKKyAgICBpbnQgaW50cmFfZGNfdmxjX3RociA9IHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyOworICAgIHVpbnQgQ0JQID0gdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXTsKKyAgICB1aW50OCBtb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVttYm51bV07CisgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKKyAgICB0eXBlRENTdG9yZSAqREMgPSB2aWRlby0+cHJlZERDICsgbWJudW07CisgICAgaW50ICBuY29lZmZzWzZdLCAqbm9fY29lZmYgPSBtYmxvY2stPm5vX2NvZWZmOworICAgIGludCAgY29tcDsKKyAgICBCb29sICBzd2l0Y2hlZDsKKyAgICBpbnQgUVBfdG1wID0gUVA7CisKKyAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OworCisKKworCisgICAgLyogIG9zY2xfbWVtc2V0KG1ibG9jay0+YmxvY2ssIDAsIHNpemVvZih0eXBlTUJTdG9yZSkpOyAgICBBdWcgOSwyMDA1ICovCisKKyAgICBpZiAobW9kZSAmIElOVFJBX01BU0spIC8qIE1PREVfSU5UUkEgfHwgbW9kZSA9PSBNT0RFX0lOVFJBX1EgKi8KKyAgICB7CisgICAgICAgIHN3aXRjaGVkID0gMDsKKyAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQorICAgICAgICAgICAgICAgIFFQX3RtcCA9IHZpZGVvLT5RUE1CW21ibnVtLTFdOyAgIC8qIHJ1bm5pbmcgUVAgIDA0LzI2LzAxICovCisKKyAgICAgICAgICAgIHN3aXRjaGVkID0gKGludHJhX2RjX3ZsY190aHIgPT0gNyB8fCBRUF90bXAgPj0gaW50cmFfZGNfdmxjX3RociAqIDIgKyAxMSk7CisgICAgICAgIH0KKworICAgICAgICBtYmxvY2stPkRDU2NhbGFyTHVtID0gY2FsX2RjX3NjYWxlcihRUCwgTFVNSU5BTkNFX0RDX1RZUEUpOyAgICAgLyogICBBQ0RDIDAzLzAxLzAxICovCisgICAgICAgIG1ibG9jay0+RENTY2FsYXJDaHIgPSBjYWxfZGNfc2NhbGVyKFFQLCBDSFJPTUlOQU5DRV9EQ19UWVBFKTsKKworICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhQmxvY2sgPSBtYmxvY2stPmJsb2NrW2NvbXBdOyAgICAvKiwgMTAvMjAvMjAwMCAqLworCisgICAgICAgICAgICBkYXRhQmxvY2tbMF0gPSAoKkRDKVtjb21wXTsKKworICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9jayh2aWRlbywgY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hlZCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CisKKyAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpICAgICAgICAgLyogICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN3aXRjaGVkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoKGRhdGFCbG9jayArIDEpLCAwLCBzaXplb2YoaW50MTYpKjYzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07CisgICAgICAgICAgICAvKiAgbW9kaWZpZWQgdG8gbmV3IHNlbWFwaG9yZSBmb3IgcG9zdC1wcm9jICovCisgICAgICAgICAgICAvLyBGdXR1cmUgd29yazo6IGNhbiBiZSBjb21iaW5lZCBpbiB0aGUgZGVxdWFudCBmdW5jdGlvbgorICAgICAgICAgICAgLy8gQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrCisgICAgICAgIH0KKyAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7CisgICAgfQorICAgIGVsc2UgLyogTU9ERSBJTlRFUiovCisgICAgeworCisKKworCisgICAgICAgIE1CTW90aW9uQ29tcCh2aWRlbywgQ0JQKTsKKyAgICAgICAgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOworICAgICAgICBjX2NvbXAgID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OworCisKKyAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKKyAgICAgICAgeworICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKKworICAgICAgICAgICAgaWYgKENCUCAmICgxIDw8ICg1IC0gY29tcCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOworICAgICAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworCisKKyAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiAgQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrLCBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICAqLworICAgICAgICB9CisKKyAgICAgICAgKCpEQylbNF0gPSBtaWRfZ3JheTsKKyAgICAgICAgaWYgKENCUCAmIDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzRdLCAmbWJsb2NrLT5iaXRtYXByb3dbNF0pOworICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzRdKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKKworICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmZzWzRdID0gMDsKKyAgICAgICAgfQorICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OworICAgICAgICBpZiAoQ0JQICYgMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmNvZWZmc1s1XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sICZtYmxvY2stPmJpdG1hcHJvd1s1XSk7CisgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOworCisgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAorICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5jb2VmZnNbNV0gPSAwOworICAgICAgICB9CisKKworCisKKyAgICAgICAgLyogTW90aW9uIGNvbXBlbnNhdGlvbiBhbmQgcHV0IGl0IHRvIHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2sgKi8KKyAgICB9CisgICAgcmV0dXJuIFBWX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kY2FjX3ByZWRpY3Rpb24uY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGNhY19wcmVkaWN0aW9uLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGNhY19wcmVkaWN0aW9uLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGNhY19wcmVkaWN0aW9uLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZWNfcHJlZF9pbnRyYV9kYy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX2Fkdl9iX2FkZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX291dHNpZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2dldF9wcmVkX291dHNpZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdC5oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhZjVkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcApAQCAtMCwwICsxLDY3MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJtcDRkZWYuaCIKKyNpbmNsdWRlICJpZGN0LmgiCisjaW5jbHVkZSAibW90aW9uX2NvbXAuaCIKKworI2lmZGVmIEZBU1RfSURDVAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICB2Y2FfaWRjdC5jIDogY3JlYXRlZCA2LzEvOTkgZm9yIHNldmVyYWwgb3B0aW9ucworKiAgICAgICAgICAgICAgICAgICAgIG9mIGhhcmQtY29kZWQgcmVkdWNlZCBpZGN0IGZ1bmN0aW9uICh1c2luZyBuel9jb2VmcykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy9wcmV0ZXN0ZWQgdmVyc2lvbgordm9pZCBpZGN0cm93MChpbnQxNiAqLCB1aW50OCAqLCB1aW50OCAqLCBpbnQpCit7CisgICAgcmV0dXJuIDsKK30KK3ZvaWQgaWRjdGNvbDAoaW50MTYgKikKK3sKKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3cxKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCit7CisgICAgLyogc2hvcnRjdXQgKi8KKyAgICBpbnQgdG1wOworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHdpZHRoIC09IDQ7CisgICAgZHN0IC09IHdpZHRoOworICAgIHByZWQgLT0gMTI7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgdG1wID0gKCooYmxrICs9IDgpICsgMzIpID4+IDY7CisgICAgICAgICpibGsgPSAwOworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSB0bXAgKyAocHJlZF93b3JkICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIHJlczIgPSB0bXAgKyAoKHByZWRfd29yZCA+PiA4KSAmIDB4RkYpOworICAgICAgICBDTElQX1JFU1VMVChyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMTYpICYgMHhGRik7CisgICAgICAgIENMSVBfUkVTVUxUKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSB0bXAgKyAoKHByZWRfd29yZCA+PiAyNCkgJiAweEZGKTsKKyAgICAgICAgQ0xJUF9SRVNVTFQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgaWRjdGNvbDEoaW50MTYgKmJsaykKK3sgLyogc2hvcnRjdXQgKi8KKyAgICBibGtbMF0gPSBibGtbOF0gPSBibGtbMTZdID0gYmxrWzI0XSA9IGJsa1szMl0gPSBibGtbNDBdID0gYmxrWzQ4XSA9IGJsa1s1Nl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsa1swXSA8PCAzOworICAgIHJldHVybjsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0cm93MihpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NTsKKyAgICBpbnQgaSA9IDg7CisgICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7CisgICAgaW50IHJlcywgcmVzMjsKKworICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KKyAgICB3aWR0aCAtPSA0OworICAgIGRzdCAtPSB3aWR0aDsKKyAgICBwcmVkIC09IDEyOworICAgIGJsayAtPSA4OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIC8qIHNob3J0Y3V0ICovCisgICAgICAgIHg0ID0gYmxrWzldOworICAgICAgICBibGtbOV0gPSAwOworICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKKyAgICAgICAgKmJsayA9IDA7ICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKworICAgICAgICAvKiBmaXJzdCBzdGFnZSAqLworICAgICAgICB4NSA9IChXNyAqIHg0ICsgNCkgPj4gMzsKKyAgICAgICAgeDQgPSAoVzEgKiB4NCArIDQpID4+IDM7CisKKyAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KKyAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OworICAgICAgICB4MSA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7CisKKyAgICAgICAgLyogZm91cnRoIHN0YWdlICovCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgKyB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MCArIHgyKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgLSB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4MCAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHgwIC0geDIpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4NCkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Rjb2wyKGludDE2ICpibGspCit7CisgICAgaW50MzIgeDAsIHgxLCB4MywgeDUsIHg3Oy8vLCB4ODsKKworICAgIHgxID0gYmxrWzhdOworICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OworICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKworICAgIHg3ID0gVzcgKiB4MTsKKyAgICB4MSA9IFcxICogeDE7CisKKyAgICB4MyA9IHg3OworICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKKyAgICBibGtbOF0gPSAoeDAgKyB4NykgPj4gODsKKyAgICBibGtbMTZdID0gKHgwICsgeDUpID4+IDg7CisgICAgYmxrWzI0XSA9ICh4MCArIHgzKSA+PiA4OworICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKKyAgICBibGtbNDhdID0gKHgwIC0geDcpID4+IDg7CisgICAgYmxrWzQwXSA9ICh4MCAtIHg1KSA+PiA4OworICAgIGJsa1szMl0gPSAoeDAgLSB4MykgPj4gODsKKworICAgIHJldHVybiA7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdzMoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHdpZHRoIC09IDQ7CisgICAgZHN0IC09IHdpZHRoOworICAgIHByZWQgLT0gMTI7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDEgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgICAvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KKyAgICAgICAgLyogYm90aCB1cHBlciBhbmQgbG93ZXIqLworICAgICAgICAvKiBib3RoIHgyb3J4NiBhbmQgeDBvcng0ICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDMgPSB4NzsKKyAgICAgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgICAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7CisKKyAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxMikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg0ICsgeDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDYgKyB4NSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MiArIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCisgICAgICAgIHJlcyA9ICh4MiAtIHgzKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMShyZXMpOworICAgICAgICByZXMyID0gKHg2IC0geDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAyKHJlczIpOworICAgICAgICBkc3Rfd29yZCA9IChyZXMyIDw8IDgpIHwgcmVzOworICAgICAgICByZXMgPSAoeDQgLSB4NykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDMocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAxNik7CisgICAgICAgIHJlcyA9ICh4MCAtIHgxKSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQNChyZXMpOworICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQordm9pZCBpZGN0Y29sMyhpbnQxNiAqYmxrKQoreworICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CisKKyAgICB4MiA9IGJsa1sxNl07CisgICAgeDEgPSBibGtbOF07CisgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCAxMSkgKyAxMjg7CisKKyAgICB4NCA9IHgwOworICAgIHg2ID0gVzYgKiB4MjsKKyAgICB4MiA9IFcyICogeDI7CisgICAgeDggPSB4MCAtIHgyOworICAgIHgwICs9IHgyOworICAgIHgyID0geDg7CisgICAgeDggPSB4NCAtIHg2OworICAgIHg0ICs9IHg2OworICAgIHg2ID0geDg7CisKKyAgICB4NyA9IFc3ICogeDE7CisgICAgeDEgPSBXMSAqIHgxOworICAgIHgzID0geDc7CisgICAgeDUgPSAoMTgxICogKHgxIC0geDcpICsgMTI4KSA+PiA4OworICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKKworICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OworICAgIGJsa1s4XSA9ICh4NCArIHg3KSA+PiA4OworICAgIGJsa1sxNl0gPSAoeDYgKyB4NSkgPj4gODsKKyAgICBibGtbMjRdID0gKHgyICsgeDMpID4+IDg7CisgICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OworICAgIGJsa1s0OF0gPSAoeDQgLSB4NykgPj4gODsKKyAgICBibGtbNDBdID0gKHg2IC0geDUpID4+IDg7CisgICAgYmxrWzMyXSA9ICh4MiAtIHgzKSA+PiA4OworCisgICAgcmV0dXJuOworfQorCisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdzQoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OworICAgIGludCBpID0gODsKKyAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKKyAgICBpbnQgcmVzLCByZXMyOworCisgICAgLyogcHJlc2V0IHRoZSBvZmZzZXQsIHN1Y2ggdGhhdCB3ZSBjYW4gdGFrZSBhZHZhbnRhZ2UgcHJlLW9mZnNldCBhZGRyZXNzaW5nIG1vZGUgICAqLworICAgIHdpZHRoIC09IDQ7CisgICAgZHN0IC09IHdpZHRoOworICAgIHByZWQgLT0gMTI7CisgICAgYmxrIC09IDg7CisKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgeDIgPSBibGtbMTBdOworICAgICAgICBibGtbMTBdID0gMDsKKyAgICAgICAgeDEgPSBibGtbOV07CisgICAgICAgIGJsa1s5XSA9IDA7CisgICAgICAgIHgzID0gYmxrWzExXTsKKyAgICAgICAgYmxrWzExXSA9IDA7CisgICAgICAgIHgwID0gKCgqKGJsayArPSA4KSkgPDwgOCkgKyA4MTkyOworICAgICAgICAqYmxrID0gMDsgICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgeDQgPSB4MDsKKyAgICAgICAgeDYgPSAoVzYgKiB4MiArIDQpID4+IDM7CisgICAgICAgIHgyID0gKFcyICogeDIgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgwIC0geDI7CisgICAgICAgIHgwICs9IHgyOworICAgICAgICB4MiA9IHg4OworICAgICAgICB4OCA9IHg0IC0geDY7CisgICAgICAgIHg0ICs9IHg2OworICAgICAgICB4NiA9IHg4OworCisgICAgICAgIHg3ID0gKFc3ICogeDEgKyA0KSA+PiAzOworICAgICAgICB4MSA9IChXMSAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDUgPSAoVzMgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHgzID0gKC0gVzUgKiB4MyArIDQpID4+IDM7CisgICAgICAgIHg4ID0geDEgLSB4NTsKKyAgICAgICAgeDEgKz0geDU7CisgICAgICAgIHg1ID0geDg7CisgICAgICAgIHg4ID0geDcgLSB4MzsKKyAgICAgICAgeDMgKz0geDc7CisgICAgICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDUgPSAoMTgxICogKHg1IC0geDgpICsgMTI4KSA+PiA4OworCisgICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NCArIHg3KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg2ICsgeDUpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDIgKyB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KKworICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLworICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKKyAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKKyAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKKyAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKKyAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OworICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7CisgICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOworICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7CisgICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKKyAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLworICAgIH0KKyAgICByZXR1cm4gOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Rjb2w0KGludDE2ICpibGspCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKKyAgICB4MiA9IGJsa1sxNl07CisgICAgeDEgPSBibGtbOF07CisgICAgeDMgPSBibGtbMjRdOworICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OworCisgICAgeDQgPSB4MDsKKyAgICB4NiA9IFc2ICogeDI7CisgICAgeDIgPSBXMiAqIHgyOworICAgIHg4ID0geDAgLSB4MjsKKyAgICB4MCArPSB4MjsKKyAgICB4MiA9IHg4OworICAgIHg4ID0geDQgLSB4NjsKKyAgICB4NCArPSB4NjsKKyAgICB4NiA9IHg4OworCisgICAgeDcgPSBXNyAqIHgxOworICAgIHgxID0gVzEgKiB4MTsKKyAgICB4NSA9IFczICogeDM7CisgICAgeDMgPSAtVzUgKiB4MzsKKyAgICB4OCA9IHgxIC0geDU7CisgICAgeDEgKz0geDU7CisgICAgeDUgPSB4ODsKKyAgICB4OCA9IHg3IC0geDM7CisgICAgeDMgKz0geDc7CisgICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OworICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKKworCisgICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7CisgICAgYmxrWzhdID0gKHg0ICsgeDcpID4+IDg7CisgICAgYmxrWzE2XSA9ICh4NiArIHg1KSA+PiA4OworICAgIGJsa1syNF0gPSAoeDIgKyB4MykgPj4gODsKKyAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7CisgICAgYmxrWzQ4XSA9ICh4NCAtIHg3KSA+PiA4OworICAgIGJsa1s0MF0gPSAoeDYgLSB4NSkgPj4gODsKKyAgICBibGtbMzJdID0gKHgyIC0geDMpID4+IDg7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Ryb3cwX2ludHJhKGludDE2ICosIFBJWEVMICosIGludCkKK3sKKyAgICByZXR1cm4gOworfQorCit2b2lkIGlkY3Ryb3cxX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCit7CisgICAgLyogc2hvcnRjdXQgKi8KKyAgICBpbnQzMiB0bXA7CisgICAgaW50IGkgPSA4OworICAgIGludCBvZmZzZXQgPSB3aWR0aDsKKyAgICB1aW50MzIgd29yZDsKKworICAgIGNvbXAgLT0gb2Zmc2V0OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICB0bXAgPSAoKGJsa1swXSArIDMyKSA+PiA2KTsKKyAgICAgICAgYmxrWzBdID0gMDsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wKQorCisgICAgICAgIHdvcmQgPSAodG1wIDw8IDgpIHwgdG1wOworICAgICAgICB3b3JkID0gKHdvcmQgPDwgMTYpIHwgd29yZDsKKworICAgICAgICAqKCh1aW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKKyAgICAgICAgKigodWludDMyKikoY29tcCArIDQpKSA9IHdvcmQ7CisKKworCisKKyAgICAgICAgYmxrICs9IEJfU0laRTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCit2b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCit7CisgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOworICAgIGludCBpID0gODsKKyAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7CisgICAgaW50MzIgd29yZDsKKworICAgIGNvbXAgLT0gb2Zmc2V0OworICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICAvKiBzaG9ydGN1dCAqLworICAgICAgICB4NCA9IGJsa1sxXTsKKyAgICAgICAgYmxrWzFdID0gMDsKKyAgICAgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCA4KSArIDgxOTI7CisgICAgICAgIGJsa1swXSA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisKKyAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KKyAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7CisgICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOworCisgICAgICAgIC8qIHRoaXJkIHN0YWdlICovCisgICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OworCisgICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLworICAgICAgICB3b3JkID0gKCh4MCArIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDAgKyB4MikgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworICAgICAgICB0ZW1wID0gKCh4MCArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOworICAgICAgICB0ZW1wID0gKCh4MCArIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAoKHgwIC0geDUpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKKyAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworICAgICAgICB0ZW1wID0gKCh4MCAtIHgyKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOworICAgICAgICB0ZW1wID0gKCh4MCAtIHg0KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOworCisgICAgICAgIGJsayArPSBCX1NJWkU7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdzNfaW50cmEoaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB0ZW1wOworICAgIGludCBpID0gODsKKyAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7CisgICAgaW50MzIgd29yZDsKKworICAgIGNvbXAgLT0gb2Zmc2V0OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzJdOworICAgICAgICBibGtbMl0gPSAwOworICAgICAgICB4MSA9IGJsa1sxXTsKKyAgICAgICAgYmxrWzFdID0gMDsKKyAgICAgICAgeDAgPSAoKGludDMyKWJsa1swXSA8PCA4KSArIDgxOTI7CisgICAgICAgIGJsa1swXSA9IDA7LyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCisgICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KKyAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHgzID0geDc7CisgICAgICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKKyAgICAgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OworCisgICAgICAgIHdvcmQgPSAoKHgwICsgeDEpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKKyAgICAgICAgdGVtcCA9ICgoeDQgKyB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisKKyAgICAgICAgdGVtcCA9ICgoeDYgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKworICAgICAgICB0ZW1wID0gKCh4MiArIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAoKHgyIC0geDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKKworICAgICAgICB0ZW1wID0gKCh4NiAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7CisKKyAgICAgICAgdGVtcCA9ICgoeDQgLSB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKworICAgICAgICB0ZW1wID0gKCh4MCAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOworCisgICAgICAgIGJsayArPSBCX1NJWkU7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKK3ZvaWQgaWRjdHJvdzRfaW50cmEoaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aCkKK3sKKyAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB0ZW1wOworICAgIGludCBpID0gODsKKyAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7CisgICAgaW50MzIgd29yZDsKKworICAgIGNvbXAgLT0gb2Zmc2V0OworCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHgyID0gYmxrWzJdOworICAgICAgICBibGtbMl0gPSAwOworICAgICAgICB4MSA9IGJsa1sxXTsKKyAgICAgICAgYmxrWzFdID0gMDsKKyAgICAgICAgeDMgPSBibGtbM107CisgICAgICAgIGJsa1szXSA9IDA7CisgICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOworICAgICAgICBibGtbMF0gPSAwOy8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLworCisgICAgICAgIHg0ID0geDA7CisgICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOworICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKKyAgICAgICAgeDggPSB4MCAtIHgyOworICAgICAgICB4MCArPSB4MjsKKyAgICAgICAgeDIgPSB4ODsKKyAgICAgICAgeDggPSB4NCAtIHg2OworICAgICAgICB4NCArPSB4NjsKKyAgICAgICAgeDYgPSB4ODsKKworICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKKyAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7CisgICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOworICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOworICAgICAgICB4OCA9IHgxIC0geDU7CisgICAgICAgIHgxICs9IHg1OworICAgICAgICB4NSA9IHg4OworICAgICAgICB4OCA9IHg3IC0geDM7CisgICAgICAgIHgzICs9IHg3OworICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7CisgICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKKworICAgICAgICB3b3JkID0gKCh4MCArIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCisKKyAgICAgICAgdGVtcCA9ICgoeDQgKyB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOworCisKKyAgICAgICAgdGVtcCA9ICgoeDYgKyB4NSkgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKworICAgICAgICB0ZW1wID0gKCh4MiArIHgzKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKz0gb2Zmc2V0KSkgPSB3b3JkOworCisgICAgICAgIHdvcmQgPSAoKHgyIC0geDMpID4+IDE0KTsKKyAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKKworICAgICAgICB0ZW1wID0gKCh4NiAtIHg1KSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7CisKKyAgICAgICAgdGVtcCA9ICgoeDQgLSB4NykgPj4gMTQpOworICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQorICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKKworICAgICAgICB0ZW1wID0gKCh4MCAtIHgxKSA+PiAxNCk7CisgICAgICAgIENMSVBfUkVTVUxUKHRlbXApCisgICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOworICAgICAgICAqKChpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOworCisgICAgICAgIGJsayArPSBCX1NJWkU7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21heF9sZXZlbC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWF4X2xldmVsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21heF9sZXZlbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYXhfbGV2ZWwuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzYwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKQEAgLTAsMCArMSw1NjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKyNkZWZpbmUgTE9HX1RBRyAibTR2X2gyNjMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisvKgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUworCisgSW5wdXRzOgorICAgIHZpZGVvID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBWaWRlb0RlY0RhdGEKKworIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKKyAgICByb3VuZHRhYjE2ID0gcm91bmRpbmcgdGFibGUKKworIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6CisgICAgTm9uZQorCisgT3V0cHV0czoKKyAgICBOb25lCisKKyBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKKyAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gY29udGVudHMgYXJlIHRoZSBuZXdseSBjYWxjdWxhdGVkIGx1bWluYW5jZQorICAgICAgZGF0YQorICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY2hyb21pbmFuY2UKKyAgICAgIGIgZGF0YQorICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY2hyb21pbmFuY2UKKyAgICAgIHIgZGF0YQorICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwaG9yZSBwcm9wYWdhdGlvbgorICAgICAgdmFsdWVzCisKKyBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6CisgICAgTm9uZQorCisgR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKKyAgICBOb25lCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZVTkNUSU9OIERFU0NSSVBUSU9OCisKKyBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGhpZ2ggbGV2ZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBvbiB0aGUgbHVtaW5hbmNlIGFuZAorIGNocm9taW5hbmNlIGRhdGEuIEl0IHNldHMgdXAgYWxsIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbnMKKyB0aGF0IHBlcmZvcm0gbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwcmVkaWN0aW9uIGFuZCBpdCBpbml0aWFsaXplcyB0aGUKKyBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlcyBvZiBhIGdpdmVuIGJsb2NrLiBJdCBhbHNvIGNoZWNrcworIHRoZSBtb3Rpb24gY29tcGVuc2F0aW9uIG1vZGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGx1bWluYW5jZSBvcgorIGNocm9taW5hbmNlIHByZWRpY3Rpb24gZnVuY3Rpb25zIHRvIGNhbGwgYW5kIGRldGVybWluZXMgaG93IHRoZSBwb3N0CisgcHJvY2Vzc2luZyBzZW1hcGhvcmVzIGFyZSB1cGRhdGVkLgorCisqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgorI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTUFDUk9TCis7IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBERUZJTkVTCis7IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCis7IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKKzsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKKzsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAwOS8yOS8yMDAwIGJyaW5nIHRoaXMgZnJvbSBtcDRkZWYuaCAqLworLy8gY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjRbXSA9IHswLDEsMSwxfTsKKy8vIGNvbnN0IHN0YXRpYyBpbnQgcm91bmR0YWI4W10gPSB7MCwwLDEsMSwxLDEsMSwyfTsKKy8qKiogMTAvMzAgZm9yIFRQUyAqLworLy8gY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjEyW10gPSB7MCwwLDAsMSwxLDEsMSwxLDEsMSwyLDJ9OworLyogMTAvMzAgZm9yIFRQUyAqKiovCitjb25zdCBzdGF0aWMgaW50IHJvdW5kdGFiMTZbXSA9IHswLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyfTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUworOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUworOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEZVTkNUSU9OIENPREUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiogbW9kaWZpZWQgMyBBdWd1c3QgMjAwNSB0byBkbyBwcmVkaWN0aW9uIGFuZCBwdXQgdGhlIHJlc3VsdHMgaW4KK3ZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2ssIG5vIGFkZGluZyB3aXRoIHJlc2lkdWUgKi8KKwordm9pZCAgTUJNb3Rpb25Db21wKAorICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCisgICAgaW50IENCUAorKQoreworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIFByZXZpb3VzIFZpZGVvIE9iamVjdCBQbGFuZSAqLworICAgIFZvcCAqcHJldiA9IHZpZGVvLT5wcmV2Vm9wOworCisgICAgLyogQ3VycmVudCBNYWNyb2Jsb2NrIChNQikgaW4gdGhlIFZPUCAqLworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKKworICAgIC8qIE51bWJlciBvZiBNQiBwZXIgZGF0YSByb3cgKi8KKyAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OworICAgIGludCB5cG9zLCB4cG9zOworICAgIFBJWEVMICpjX2NvbXAsICpjX3ByZXY7CisgICAgUElYRUwgKmN1X2NvbXAsICpjdV9wcmV2OworICAgIFBJWEVMICpjdl9jb21wLCAqY3ZfcHJldjsKKyAgICBpbnQgaGVpZ2h0LCB3aWR0aCwgcHJlZF93aWR0aDsKKyAgICBpbnQgaW12LCBtdndpZHRoOworICAgIGludDMyIG9mZnNldDsKKyAgICB1aW50OCBtb2RlOworICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAqcHJlZDsKKworICAgIC8qIE1vdGlvbiB2ZWN0b3IgKGR4LGR5KSBpbiBoYWxmLXBlbCByZXNvbHV0aW9uICovCisgICAgaW50IGR4LCBkeTsKKworICAgIE1PVCBweFs0XSwgcHlbNF07CisgICAgaW50IHhwcmVkLCB5cHJlZDsKKyAgICBpbnQgeHN1bTsKKyAgICBpbnQgcm91bmQxOworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogU2V0IHJvdW5kaW5nIHR5cGUgKi8KKyAgICAvKiBjaGFuZ2UgZnJvbSBhcnJheSB0byBzaW5nbGUgMDkvMjkvMjAwMCAqLworICAgIHJvdW5kMSA9IChpbnQpKDEgLSB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlKTsKKworICAgIC8qIHdpZHRoIG9mIGx1bWluYW5jZSBkYXRhIGluIHBpeGVscyAoeSBheGlzKSAqLworICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOworCisgICAgLyogaGVpZ3RoIG9mIGx1bWluYW5jZSBkYXRhIGluIHBpeGVscyAoeCBheGlzKSAqLworICAgIGhlaWdodCA9IHZpZGVvLT5oZWlnaHQ7CisKKyAgICAvKiBudW1iZXIgb2YgYmxvY2tzIHBlciByb3cgKi8KKyAgICBtdndpZHRoID0gTUJfaW5fd2lkdGggPDwgMTsKKworICAgIC8qIHN0YXJ0aW5nIHkgcG9zaXRpb24gaW4gY3VycmVudCBNQjsgb3JpZ2luIG9mIE1CICovCisgICAgeXBvcyA9IHZpZGVvLT5tYm51bV9yb3cgPDwgNCA7CisgICAgLyogc3RhcnRpbmcgeCBwb3NpdGlvbiBpbiBjdXJyZW50IE1COyBvcmlnaW4gb2YgTUIgKi8KKyAgICB4cG9zID0gdmlkZW8tPm1ibnVtX2NvbCA8PCA0IDsKKworICAgIC8qIG9mZnNldCB0byAoeCx5KSBwb3NpdGlvbiBpbiBjdXJyZW50IGx1bWluYW5jZSBNQiAqLworICAgIC8qIGluIHBpeGVsIHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIHlwb3Mqd2lkdGggLT4gcm93LCAreCAtPiBjb2x1bW4gKi8KKyAgICBvZmZzZXQgPSAoaW50MzIpeXBvcyAqIHdpZHRoICsgeHBvczsKKworICAgIC8qIGdldCBtb2RlIGZvciBjdXJyZW50IE1CICovCisgICAgbW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGVbbWJudW1dOworCisgICAgLyogYmxvY2sgaW5kZXggKi8KKyAgICAvKiBpbXYgPSAoeHBvcy84KSArICgoeXBvcy84KSAqIG12d2lkdGgpICovCisgICAgaW12ID0gKG9mZnNldCA+PiA2KSAtICh4cG9zID4+IDYpICsgKHhwb3MgPj4gMyk7CisgICAgaWYgKG1vZGUgJiBJTlRFUl8xVk1BU0spCisgICAgeworICAgICAgICBkeCA9IHB4WzBdID0gcHhbMV0gPSBweFsyXSA9IHB4WzNdID0gdmlkZW8tPm1vdFhbaW12XTsKKyAgICAgICAgZHkgPSBweVswXSA9IHB5WzFdID0gcHlbMl0gPSBweVszXSA9IHZpZGVvLT5tb3RZW2ltdl07CisgICAgICAgIGlmICgoZHggJiAzKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkeCA9IGR4ID4+IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiB4IGNvbXBvbmVudCBvZiBNViBpcyBvcidlZCBmb3Igcm91bmRpbmcgKD8pICovCisgICAgICAgICAgICBkeCA9IChkeCA+PiAxKSB8IDE7CisgICAgICAgIH0KKworICAgICAgICAvKiB5IGNvbXBvbmVudCBvZiBtb3Rpb24gdmVjdG9yOyBkaXZpZGUgYnkgMiBmb3IgdG8gKi8KKyAgICAgICAgLyogY29udmVydCB0byBmdWxsLXBlbCByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGlmICgoZHkgJiAzKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBkeSA9IGR5ID4+IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiB5IGNvbXBvbmVudCBvZiBNViBpcyBvcidlZCBmb3Igcm91bmRpbmcgKD8pICovCisgICAgICAgICAgICBkeSA9IChkeSA+PiAxKSB8IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHhbMF0gPSB2aWRlby0+bW90WFtpbXZdOworICAgICAgICBweFsxXSA9IHZpZGVvLT5tb3RYW2ltdisxXTsKKyAgICAgICAgcHhbMl0gPSB2aWRlby0+bW90WFtpbXYrbXZ3aWR0aF07CisgICAgICAgIHB4WzNdID0gdmlkZW8tPm1vdFhbaW12K212d2lkdGgrMV07CisgICAgICAgIHhzdW0gPSBweFswXSArIHB4WzFdICsgcHhbMl0gKyBweFszXTsKKyAgICAgICAgZHggPSBQVl9TSUdOKHhzdW0pICogKHJvdW5kdGFiMTZbKFBWX0FCUyh4c3VtKSkgJiAweEZdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBWX0FCUyh4c3VtKSkgPj4gNCkgPDwgMSkpOworICAgICAgICBweVswXSA9IHZpZGVvLT5tb3RZW2ltdl07CisgICAgICAgIHB5WzFdID0gdmlkZW8tPm1vdFlbaW12KzFdOworICAgICAgICBweVsyXSA9IHZpZGVvLT5tb3RZW2ltdittdndpZHRoXTsKKyAgICAgICAgcHlbM10gPSB2aWRlby0+bW90WVtpbXYrbXZ3aWR0aCsxXTsKKyAgICAgICAgeHN1bSA9IHB5WzBdICsgcHlbMV0gKyBweVsyXSArIHB5WzNdOworICAgICAgICBkeSA9IFBWX1NJR04oeHN1bSkgKiAocm91bmR0YWIxNlsoUFZfQUJTKHhzdW0pKSAmIDB4Rl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoUFZfQUJTKHhzdW0pKSA+PiA0KSA8PCAxKSk7CisgICAgfQorCisgICAgLyogUG9pbnRlciB0byBwcmV2aW91cyBsdW1pbmFuY2UgZnJhbWUgKi8KKyAgICBjX3ByZXYgID0gcHJldi0+eUNoYW47CisgICAgaWYgKCFjX3ByZXYpIHsKKyAgICAgICAgQUxPR0UoImIvMzUyNjk2MzUiKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNTI2OTYzNSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJlZF9ibG9jayA9IHZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2s7CisKKyAgICAvKiBzb21lIGJsb2NrcyBoYXZlIG5vIHJlc2lkdWUgb3IgSU5URVI0ViAqLworICAgIC8qaWYgKG1vZGUgPT0gTU9ERV9JTlRFUjRWKSAgIDA1LzA4LzE1ICovCisgICAgLyogTW90aW9uIENvbXBlbnNhdGlvbiBmb3IgYW4gOHg4IGJsb2NrIHdpdGhpbiBhIE1CICovCisgICAgLyogKDQgTVYgcGVyIE1CKSAqLworCisKKworICAgIC8qIENhbGwgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBsdW1pbmFuY2UgcHJlZGljdGlvbiAqLworICAgIC8qICAgICAgbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2KHhwb3MsIHlwb3MsIHB4LCBweSwgY19wcmV2LAorICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICByb3VuZDEsIG12d2lkdGgsICZ4c3VtLCAmeXN1bSk7Ki8KKyAgICBjX2NvbXAgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBvZmZzZXQ7CisKKworICAgIHhwcmVkID0gKGludCkoKHhwb3MgPDwgMSkgKyBweFswXSk7CisgICAgeXByZWQgPSAoaW50KSgoeXBvcyA8PCAxKSArIHB5WzBdKTsKKworICAgIGlmICgoQ0JQID4+IDUpJjEpCisgICAgeworICAgICAgICBwcmVkID0gcHJlZF9ibG9jazsKKyAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmVkID0gY19jb21wOworICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCisgICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIDsKKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgY19wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOworICAgIH0KKworCisgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCisgICAgLyogKGJsb2NrcyAxKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQ7ICAgICAgICovCisgICAgLyogYWRkIDggdG8geF9wb3MgdG8gYWR2YW5jZSB0byBuZXh0IGJsb2NrICAgICAgICAgKi8KKyAgICB4cHJlZCA9IChpbnQpKCgoeHBvcyArIEJfU0laRSkgPDwgMSkgKyBweFsxXSk7CisgICAgeXByZWQgPSAoaW50KSgoeXBvcyA8PCAxKSArIHB5WzFdKTsKKworICAgIGlmICgoQ0JQID4+IDQpJjEpCisgICAgeworICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDg7CisgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJlZCA9IGNfY29tcCArIDg7CisgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBNViBwb2ludHMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KKyAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoIDw8IDEpIC0gKDIqQl9TSVpFKSkgJiYKKyAgICAgICAgICAgIHlwcmVkID49IDAgJiYgeXByZWQgPD0gKChoZWlnaHQgPDwgMSkgLSAoMipCX1NJWkUpKSkKKyAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBpbnNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgR2V0UHJlZEFkdkJUYWJsZVt5cHJlZCYxXVt4cHJlZCYxXShjX3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIEdldFByZWRPdXRzaWRlKHhwcmVkLCB5cHJlZCwgY19wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOworICAgIH0KKworCisKKyAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gdmFsdWVzIG92ZXIgY3VycmVudCBsdW1pbmFuY2UgTUIgKi8KKyAgICAvKiAoYmxvY2tzIDIpOyBhZGQgbW90aW9uIHZlY3RvciBwcmlvciB0byBpbnB1dCAgICAgICAgKi8KKyAgICAvKiBhZGQgOCB0byB5X3BvcyB0byBhZHZhbmNlIHRvIGJsb2NrIG9uIG5leHQgcm93ICAgICAgKi8KKyAgICB4cHJlZCA9IChpbnQpKCh4cG9zIDw8IDEpICsgcHhbMl0pOworICAgIHlwcmVkID0gKGludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIHB5WzJdKTsKKworICAgIGlmICgoQ0JQID4+IDMpJjEpCisgICAgeworICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDEyODsKKyAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwcmVkID0gY19jb21wICsgKHdpZHRoIDw8IDMpOworICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCisgICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKKyAgICB9CisKKworCisgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCisgICAgLyogKGJsb2NrcyAzKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQ7ICAgICAgICovCisgICAgLyogYWRkIDggdG8geF9wb3MgYW5kIHlfcG9zIHRvIGFkdmFuY2UgdG8gbmV4dCBibG9jayAgICovCisgICAgLyogb24gbmV4dCByb3cgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB4cHJlZCA9IChpbnQpKCgoeHBvcyArIEJfU0laRSkgPDwgMSkgKyBweFszXSk7CisgICAgeXByZWQgPSAoaW50KSgoKHlwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHlbM10pOworCisgICAgaWYgKChDQlAgPj4gMikmMSkKKyAgICB7CisgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMTM2OworICAgICAgICBwcmVkX3dpZHRoID0gMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByZWQgPSBjX2NvbXAgKyAod2lkdGggPDwgMykgKyA4OworICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgfQorCisgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCisgICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCisgICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKKyAgICB9CisgICAgLyogQ2FsbCBmdW5jdGlvbiB0byBzZXQgZGUtYmxvY2tpbmcgYW5kIGRlLXJpbmdpbmcgKi8KKyAgICAvKiAgIHNlbWFwaG9yZXMgZm9yIGx1bWluYW5jZSAgICAgICAgICAgICAgICAgICAgICAqLworCisKKworICAgIC8qIHhwcmVkIGFuZCB5cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgKi8KKyAgICAvKiBpbiBmdWxsLXBlbCByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAvKiBDaHJvbWluYW5jZSAqLworICAgIC8qIHdpZHRoIG9mIGNocm9taW5hbmNlIGRhdGEgaW4gcGl4ZWxzICh5IGF4aXMpICovCisgICAgd2lkdGggPj49IDE7CisKKyAgICAvKiBoZWlndGggb2YgY2hyb21pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHggYXhpcykgKi8KKyAgICBoZWlnaHQgPj49IDE7CisKKyAgICAvKiBQb2ludGVyIHRvIHByZXZpb3VzIGNocm9taW5hbmNlIGIgZnJhbWUgKi8KKyAgICBjdV9wcmV2ID0gcHJldi0+dUNoYW47CisKKyAgICAvKiBQb2ludGVyIHRvIHByZXZpb3VzIGNocm9taW5hbmNlIHIgZnJhbWUgKi8KKyAgICBjdl9wcmV2ID0gcHJldi0+dkNoYW47CisKKyAgICAvKiB4IHBvc2l0aW9uIGluIHByZWRpY3Rpb24gZGF0YSBvZmZzZXQgYnkgbW90aW9uIHZlY3RvciAqLworICAgIC8qIHhwcmVkIGNhbGN1bGF0aW9uIGZvciBDaHJvbWluYW5jZSBpcyBpbiBmdWxsLXBlbCAgICAgICovCisgICAgLyogcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB4cHJlZCA9IHhwb3MgKyBkeDsKKworICAgIC8qIHkgcG9zaXRpb24gaW4gcHJlZGljdGlvbiBkYXRhIG9mZnNldCBieSBtb3Rpb24gdmVjdG9yICovCisgICAgLyogeXByZWQgY2FsY3VsYXRpb24gZm9yIENocm9taW5hbmNlIGlzIGluIGZ1bGwtcGVsICAgICAgKi8KKyAgICAvKiByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHlwcmVkID0geXBvcyArIGR5OworCisgICAgY3VfY29tcCA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKKyAgICBjdl9jb21wID0gdmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOworCisgICAgLyogQ2FsbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGNocm9taW5hbmNlIHByZWRpY3Rpb24gKi8KKyAgICAvKiAgICAgIGNocm9taW5hbmNlX3ByZWQoeHByZWQsIHlwcmVkLCBjdV9wcmV2LCBjdl9wcmV2LAorICAgICAgICAgICAgcHJlZF9ibG9jaywgd2lkdGhfdXYsIGhlaWdodF91diwKKyAgICAgICAgICAgIHJvdW5kMSk7Ki8KKyAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoIDw8IDEpIC0gKDIqQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgorICAgICAgICAgICAgeXByZWQgPD0gKChoZWlnaHQgPDwgMSkgLSAoMipCX1NJWkUpKSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGlmICgoQ0JQID4+IDEpJjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjU2OworICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCA9IGN1X2NvbXA7CisgICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIGIgKGJsb2NrWzRdKSAqLworICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGN1X3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOworCisgICAgICAgIGlmIChDQlAmMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAyNjQ7CisgICAgICAgICAgICBwcmVkX3dpZHRoID0gMTY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkID0gY3ZfY29tcDsKKyAgICAgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKKyAgICAgICAgfQorICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIHIgKGJsb2NrWzVdKSAqLworICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGN2X3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGlmICgoQ0JQID4+IDEpJjEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjU2OworICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJlZCA9IGN1X2NvbXA7CisgICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIGIgKGJsb2NrWzRdKSAqLworICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsICAgIGN1X3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7CisKKyAgICAgICAgaWYgKENCUCYxKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDI2NDsKKyAgICAgICAgICAgIHByZWRfd2lkdGggPSAxNjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZWQgPSBjdl9jb21wOworICAgICAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSByIChibG9ja1s1XSkgKi8KKyAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCAgICBjdl9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOworCisgICAgICAgIHJldHVybiA7CisgICAgfQorCit9CisKKy8qKiogc3BlY2lhbCBmdW5jdGlvbiBmb3Igc2tpcHBlZCBtYWNyb2Jsb2NrLCAgQXVnIDE1LCAyMDA1ICovCit2b2lkICBTa2lwcGVkTUJNb3Rpb25Db21wKAorICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8KKykKK3sKKyAgICBWb3AgKnByZXYgPSB2aWRlby0+cHJldlZvcDsKKyAgICBWb3AgKmNvbXA7CisgICAgaW50IHlwb3MsIHhwb3M7CisgICAgUElYRUwgKmNfY29tcCwgKmNfcHJldjsKKyAgICBQSVhFTCAqY3VfY29tcCwgKmN1X3ByZXY7CisgICAgUElYRUwgKmN2X2NvbXAsICpjdl9wcmV2OworICAgIGludCB3aWR0aCwgd2lkdGhfdXY7CisgICAgaW50MzIgb2Zmc2V0OworCisgICAgd2lkdGggPSB2aWRlby0+d2lkdGg7CisgICAgd2lkdGhfdXYgID0gd2lkdGggPj4gMTsKKyAgICB5cG9zID0gdmlkZW8tPm1ibnVtX3JvdyA8PCA0IDsKKyAgICB4cG9zID0gdmlkZW8tPm1ibnVtX2NvbCA8PCA0IDsKKyAgICBvZmZzZXQgPSAoaW50MzIpeXBvcyAqIHdpZHRoICsgeHBvczsKKworCisgICAgLyogemVybyBtb3Rpb24gY29tcGVuc2F0aW9uIGZvciBwcmV2aW91cyBmcmFtZSAqLworICAgIC8qbWJ5KndpZHRoICsgbWJ4OyovCisgICAgY19wcmV2ICA9IHByZXYtPnlDaGFuOworICAgIGlmICghY19wcmV2KSB7CisgICAgICAgIEFMT0dFKCJiLzM1MjY5NjM1Iik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzUyNjk2MzUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjX3ByZXYgKz0gb2Zmc2V0OworCisgICAgLypieSp3aWR0aF91diArIGJ4OyovCisgICAgY3VfcHJldiA9IHByZXYtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOworICAgIC8qYnkqd2lkdGhfdXYgKyBieDsqLworICAgIGN2X3ByZXYgPSBwcmV2LT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKKworICAgIGNvbXAgPSB2aWRlby0+Y3VyclZvcDsKKworICAgIGNfY29tcCAgPSBjb21wLT55Q2hhbiArIG9mZnNldDsKKyAgICBjdV9jb21wID0gY29tcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7CisgICAgY3ZfY29tcCA9IGNvbXAtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOworCisKKyAgICAvKiBDb3B5IHByZXZpb3VzIHJlY29uc3RydWN0ZWQgZnJhbWUgaW50byB0aGUgY3VycmVudCBmcmFtZSAqLworICAgIFB1dFNLSVBQRURfTUIoY19jb21wLCAgY19wcmV2LCB3aWR0aCk7CisgICAgUHV0U0tJUFBFRF9CKGN1X2NvbXAsIGN1X3ByZXYsIHdpZHRoX3V2KTsKKyAgICBQdXRTS0lQUEVEX0IoY3ZfY29tcCwgY3ZfcHJldiwgd2lkdGhfdXYpOworCisgICAgLyogIDEwLzI0LzIwMDAgcG9zdF9wcm9jZXNzaW5nIHNlbWFwaG9yZSBnZW5lcmF0aW9uICovCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfdXRpbHMuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfdXRpbHMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl91dGlscy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX3V0aWxzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJ0eXBlX21vZGUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21idHlwZV9tb2RlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21idHlwZV9tb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21idHlwZV9tb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21vdGlvbl9jb21wLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tb3Rpb25fY29tcC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tb3Rpb25fY29tcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tb3Rpb25fY29tcC5oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U2ZjljMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaApAQCAtMCwwICsxLDMwMyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgX01QNERFQ0xJQl9IXworI2RlZmluZSBfTVA0REVDTElCX0hfCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBJTkNMVURFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAibXA0ZGVmLmgiIC8qIHR5cGVkZWYgKi8KKyNpbmNsdWRlICJtcDRsaWJfaW50LmgiIC8qIG1haW4gdmlkZW8gc3RydWN0dXJlICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBNQUNST1MKKzsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBERUZJTkVTCis7IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBFWFRFUk5BTCBWQVJJQUJMRVMgUkVGRVJFTkNFUworOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBTSU1QTEUgVFlQRURFRidTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVOVU1FUkFURUQgVFlQRURFRidTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IFNUUlVDVFVSRVMgVFlQRURFRidTCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEdMT0JBTCBGVU5DVElPTiBERUZJTklUSU9OUworOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworICAgIC8qIGRlZmluZWQgaW4gcHZkZWNfYXBpLmMsIHRoZXNlIGZ1bmN0aW9uIGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUgICAgKi8KKyAgICAvKiBleHBvc2VkIHRvIHByb2dyYW1tZXJzIG91dHNpZGUgUGFja2V0VmlkZW8uICAwOC8xNS8yMDAwLiAgICAqLworICAgIHVpbnQgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKworI2lmZGVmIEVOQUJMRV9MT0cKKyAgICB2b2lkIG00dmRlY19kcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKTsKKyNkZWZpbmUgbXA0ZGVjX2xvZyhtZXNzYWdlKSBtNHZkZWNfZHByaW50ZihtZXNzYWdlKQorI2Vsc2UKKyNkZWZpbmUgbXA0ZGVjX2xvZyhtZXNzYWdlKQorI2VuZGlmCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGZyYW1lX2J1ZmZlci5jICovCisgICAgUFZfU1RBVFVTIEZpbGxGcmFtZUJ1ZmZlck5ldyhCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtKTsKKyAgICBQVl9TVEFUVVMgRmlsbEZyYW1lQnVmZmVyKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIGludCBzaG9ydF9oZWFkZXIpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBkY19hY19wcmVkLmMgKi8KKyAgICBpbnQgY2FsX2RjX3NjYWxlcihpbnQgUVAsIGludCB0eXBlKTsKKyAgICBQVl9TVEFUVVMgUFZfRGVjb2RlUHJlZGljdGVkSW50cmFEQyhpbnQgY29tcG51bSwgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqSW50cmFEQ19kZWx0YSk7CisKKyAgICB2b2lkICAgIGRvRENBQ1ByZWRpY3Rpb24oVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsIGludDE2ICpxX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpcmVjdGlvbik7CisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKKyAgICB2b2lkICAgIGRvRENBQ1ByZWRpY3Rpb25fSShWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwgaW50MTYgKnFfYmxvY2spOworI2VuZGlmCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBibG9ja19pZGN0LmMgKi8KKyAgICB2b2lkIE1CbG9ja0lEQ1RBZGQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IG56X2NvZWZzW10pOworCisgICAgdm9pZCBCbG9ja0lEQ1QodWludDggKmRzdCwgdWludDggKnByZWQsIGludDE2ICpibGssIGludCB3aWR0aCwgaW50IG56Y29lZnMsCisgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggYml0bWFwcm93KTsKKworICAgIHZvaWQgTUJsb2NrSURDVChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKyAgICB2b2lkIEJsb2NrSURDVF9pbnRyYShNYWNyb0Jsb2NrICptYmxvY2ssIFBJWEVMICpjX2NvbXAsIGludCBjb21wLCBpbnQgd2lkdGhfb2Zmc2V0KTsKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGNvbWJpbmVkX2RlY29kZS5jICovCisgICAgUFZfU1RBVFVTIERlY29kZUZyYW1lQ29tYmluZWRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApOworICAgIFBWX1NUQVRVUyBHZXRNQkRhdGEoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGRhdGFwYXJ0X2RlY29kZS5jICovCisgICAgUFZfU1RBVFVTIERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApOworICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X1AoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisgICAgUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X0lfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpOworICAgIFBWX1NUQVRVUyBEZWNvZGVEYXRhUGFydF9QX1ZpZGVvUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBzbGljZV9jb3VudGVyKTsKKyAgICBQVl9TVEFUVVMgR2V0TUJEYXRhX0RhdGFQYXJ0KFZpZGVvRGVjRGF0YSAqdmlkZW8pOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBwYWNrZXRfdXRpbC5jICovCisgICAgUFZfU1RBVFVTIFBWX1JlYWRWaWRlb1BhY2tldEhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgKm5leHRfTUIpOworICAgIFBWX1NUQVRVUyBSZWNvdmVyUGFja2V0RXJyb3IoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgaW50IG1hcmtlcl9sZW5ndGgsIGludDMyICpuZXh0Vm9wKTsKKyAgICBQVl9TVEFUVVMgUmVjb3ZlckdPQkVycm9yKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIGludCBtYXJrZXJfbGVuZ3RoLCBpbnQzMiAqdm9wUG9zKTsKKyAgICBQVl9TVEFUVVMgUFZfR29iSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8pOworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgIFBWX1NUQVRVUyBQVl9IMjYzU2xpY2VIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlb0ludCwgaW50ICpuZXh0X01CKTsKKyNlbmRpZgorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gbW90aW9uX2NvbXAuYyAqLworICAgIHZvaWQgTUJNb3Rpb25Db21wKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBDQlApOworICAgIHZvaWQgIFNraXBwZWRNQk1vdGlvbkNvbXAoVmlkZW9EZWNEYXRhICp2aWRlbyk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGNocm9taW5hbmNlX3ByZWQuYyAqLworICAgIHZvaWQgY2hyb21pbmFuY2VfcHJlZCgKKyAgICAgICAgaW50IHhwcmVkLCAgICAgICAgICAvKiBpICovCisgICAgICAgIGludCB5cHJlZCwgICAgICAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqY3VfcHJldiwgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKmN2X3ByZXYsICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGhfdXYsICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IGhlaWdodF91diwgICAgICAvKiBpICovCisgICAgICAgIGludCByb3VuZDEKKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyLmMgKi8KKyAgICB2b2lkIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXIoCisgICAgICAgIGludCB4cHJlZCwgICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgeXByZWQsICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGgsICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAvKiBpICovCisgICAgICAgIGludCByb3VuZDEKKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyNHYuYyAqLworICAgIHZvaWQgbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2KAorICAgICAgICBpbnQgeHBvcywgICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHlwb3MsICAgICAgICAgICAvKiBpICovCisgICAgICAgIE1PVCAqcHgsICAgICAgICAgICAgLyogaSAqLworICAgICAgICBNT1QgKnB5LCAgICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGgsICAgICAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAvKiBpICovCisgICAgICAgIGludCByb3VuZDEsICAgICAgICAgLyogaSAqLworICAgICAgICBpbnQgbXZ3aWR0aCwgICAgICAgICAgICAvKiBpICovCisgICAgICAgIGludCAqeHN1bV9wdHIsICAgICAgICAgIC8qIGkvbyAqLworICAgICAgICBpbnQgKnlzdW1fcHRyICAgICAgICAgICAvKiBpL28gKi8KKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyLmMgKi8KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX2Fkdl9tYl9hZGQuYyAqLworICAgIGludCBHZXRQcmVkQWR2YW5jZWRNQigKKyAgICAgICAgaW50IHhwb3MsCisgICAgICAgIGludCB5cG9zLAorICAgICAgICB1aW50OCAqY19wcmV2LAorICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgcm5kMQorICAgICk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX2Fkdl9iX2FkZC5jICovCisgICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MHgwKAorICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLworICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLworICAgICk7CisKKyAgICBpbnQgR2V0UHJlZEFkdmFuY2VkQnkweDEoCisgICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLworICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCisgICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCisgICAgICAgIGludCBwcmVkX3dpZHRoX3JuZCAvKiBpICovCisgICAgKTsKKworICAgIGludCBHZXRQcmVkQWR2YW5jZWRCeTF4MCgKKyAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCisgICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KKyAgICAgICAgaW50IHByZWRfd2lkdGhfcm5kIC8qIGkgKi8KKyAgICApOworCisgICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MXgxKAorICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KKyAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLworICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLworICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLworICAgICk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX291dHNpZGUuYyAqLworICAgIGludCBHZXRQcmVkT3V0c2lkZSgKKyAgICAgICAgaW50IHhwb3MsCisgICAgICAgIGludCB5cG9zLAorICAgICAgICB1aW50OCAqY19wcmV2LAorICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywKKyAgICAgICAgaW50IHdpZHRoLAorICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgcm5kMSwKKyAgICAgICAgaW50IHByZWRfd2lkdGgKKyAgICApOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBmaW5kX3BtdnNFcnJSZXMuYyAqLworICAgIHZvaWQgbXZfcHJlZGljdGlvbihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgYmxvY2ssIE1PVCAqbXZ4LCBNT1QgKm12eSk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGRlZmluZWQgaW4gbWJfdXRpbHMuYyAqLworICAgIHZvaWQgQ29weV9NQl9pbnRvX1ZvcCh1aW50OCAqY29tcCwgaW50IHlDaGFuW11bTkNPRUZGX0JMT0NLXSwgaW50IHdpZHRoKTsKKyAgICB2b2lkIENvcHlfQl9pbnRvX1ZvcCh1aW50OCAqY29tcCwgaW50IGNDaGFuW10sIGludCB3aWR0aCk7CisgICAgdm9pZCBQdXRTS0lQUEVEX01CKHVpbnQ4ICpjb21wLCB1aW50OCAqY19wcmV2LCBpbnQgd2lkdGgpOworICAgIHZvaWQgUHV0U0tJUFBFRF9CKHVpbnQ4ICpjb21wLCB1aW50OCAqY19wcmV2LCBpbnQgd2lkdGgpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiB2b3AuYyAqLworICAgIFBWX1NUQVRVUyBEZWNvZGVHT1ZIZWFkZXIoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgdWludDMyICp0aW1lX2Jhc2UpOworICAgIFBWX1NUQVRVUyBEZWNvZGVWT0xIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGxheWVyKTsKKyAgICBQVl9TVEFUVVMgRGVjb2RlVk9QSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCwgQm9vbCB1c2VfZXh0X3RpZW1zdGFtcCk7CisgICAgUFZfU1RBVFVTIERlY29kZVNob3J0SGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCk7CisgICAgUFZfU1RBVFVTIFBWX0RlY29kZVZvcChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKKyAgICB1aW50MzIgQ2FsY1ZvcERpc3BsYXlUaW1lKFZvbCAqY3VyclZvbCwgVm9wICpjdXJyVm9wLCBpbnQgc2hvcnRWaWRlb0hlYWRlcik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBkZWZpbmVkIGluIHBvc3RfcHJvYy5jICovCisjaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCisgICAgdm9pZCBIMjYzX0RlYmxvY2sodWludDggKnJlYywgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwgdWludDggKm1vZGUsIGludCBjaHIsIGludCBUKTsKKyNlbmRpZgorICAgIGludCAgUG9zdFByb2NTZW1hcGhvcmUoaW50MTYgKnFfYmxvY2spOworICAgIHZvaWQgUG9zdEZpbHRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgZmlsZXJfdHlwZSwgdWludDggKm91dHB1dCk7CisgICAgdm9pZCBGaW5kTWF4TWluKHVpbnQ4ICpwdHIsIGludCAqbWluLCBpbnQgKm1heCwgaW50IGluY3IpOworICAgIHZvaWQgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgodWludDggKmltZywgaW50IGluY3IsIGludCB0aHJlcywgaW50IG14ZGYpOworICAgIHZvaWQgQWRhcHRpdmVTbW9vdGhfTm9NTVgodWludDggKlJlY19ZLCBpbnQgdjAsIGludCBoMCwgaW50IHZfYmxrLCBpbnQgaF9ibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyLCBpbnQgd2lkdGgsIGludCBtYXhfZGlmZik7CisgICAgdm9pZCBEZXJpbmdpbmdfTHVtYSh1aW50OCAqUmVjX1ksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbWJpbmVkLCB1aW50OCAqcHBfbW9kKTsKKyAgICB2b2lkIERlcmluZ2luZ19DaHJvbWEodWludDggKlJlY19DLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbWJpbmVkLCB1aW50OCAqcHBfbW9kKTsKKyAgICB2b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIodWludDggKnJlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHIsIHVpbnQ4ICpwcF9tb2QpOworICAgIHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKHVpbnQ4ICpyZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAorICAgICAgICAgICAgaW50IGNociwgdWludDggKnBwX21vZCk7CisgICAgdm9pZCBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcih1aW50OCAqcmVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqUVBfc3RvcmUsIGludCBjaHIsIHVpbnQ4ICpwcF9tb2QpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogZGVmaW5lZCBpbiBjb25jZWFsLmMgKi8KKyAgICB2b2lkIENvbmNlYWxUZXh0dXJlX0koVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MzIgc3RhcnRGaXJzdFBhcnRpdGlvbiwgaW50IG1iX3N0YXJ0LCBpbnQgbWJfc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlX2NvdW50ZXIpOworICAgIHZvaWQgQ29uY2VhbFRleHR1cmVfUChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgbWJfc3RhcnQsIGludCBtYl9zdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfY291bnRlcik7CisgICAgdm9pZCBDb25jZWFsUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBtYl9zdGFydCwgaW50IG1iX3N0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV9jb3VudGVyKTsKKyAgICB2b2lkIENvcHlWb3BNQihWb3AgKmN1cnIsIHVpbnQ4ICpwcmV2LCBpbnQgbWJudW0sIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvKiBkZWZpbmUgaW4gdmxjX2RlcXVhbnQuYyAsICAwOS8xOC8yMDAwKi8KKyNpZmRlZiBQVl9TVVBQT1JUX01BSU5fUFJPRklMRQorICAgIGludCBWbGNEZXF1YW50TXBlZ0ludHJhQmxvY2sodm9pZCAqdmlkZW8sIGludCBjb21wLCBpbnQgc3dpdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKKyAgICBpbnQgVmxjRGVxdWFudE1wZWdJbnRlckJsb2NrKHZvaWQgKnZpZGVvLCBpbnQgY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOworI2VuZGlmCisgICAgaW50IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9jayhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwgaW50IHN3aXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7CisgICAgaW50IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9ja19TSChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOworICAgIGludCBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2soVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IEVORAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVmLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlZi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRsaWJfaW50LmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRsaWJfaW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGxpYl9pbnQuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0bGliX2ludC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BhY2tldF91dGlsLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMDNhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfZmlsdGVyLmNwcApAQCAtMCwwICsxLDQzOSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKKworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorI2luY2x1ZGUgICAgIm1vdGlvbl9jb21wLmgiCisjaW5jbHVkZSAibWJ0eXBlX21vZGUuaCIKK2NvbnN0IHN0YXRpYyBpbnQgU1RSRU5HVEhfdGFiW10gPSB7MCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNywgOCwgOCwgOCwgOSwgOSwgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMn07CisjZW5kaWYKKworCisKKyNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKK3ZvaWQgSDI2M19EZWJsb2NrKHVpbnQ4ICpyZWMsCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgaW50MTYgKlFQX3N0b3JlLAorICAgICAgICAgICAgICAgICAgdWludDggKm1vZGUsCisgICAgICAgICAgICAgICAgICBpbnQgY2hyLCBpbnQgYW5uZXhfVCkKK3sKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgaW50IGksIGosIGs7CisgICAgdWludDggKnJlY195OworICAgIGludCB0bXB2YXI7CisgICAgaW50IG1ibnVtLCBzdHJlbmd0aCwgQV9ELCBkMV8yLCBkMSwgZDIsIEEsIEIsIEMsIEQsIGJfc2l6ZTsKKyAgICBpbnQgZCwgb2Zmc2V0LCBuTUJQZXJSb3csIG5NQlBlckNvbCwgd2lkdGgyID0gKHdpZHRoIDw8IDEpOworICAgIC8qIE1BS0UgU1VSRSBJLVZPUCBJTlRSQSBNQUNST0JMT0NLUyBBUkUgU0VUIFRPIE5PTi1TS0lQUEVEIE1PREUqLworICAgIG1ibnVtID0gMDsKKworICAgIGlmIChjaHIpCisgICAgeworICAgICAgICBuTUJQZXJSb3cgPSB3aWR0aCA+PiAzOworICAgICAgICBuTUJQZXJDb2wgPSBoZWlnaHQgPj4gMzsKKyAgICAgICAgYl9zaXplID0gODsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbk1CUGVyUm93ID0gd2lkdGggPj4gNDsKKyAgICAgICAgbk1CUGVyQ29sID0gaGVpZ2h0ID4+IDQ7CisgICAgICAgIGJfc2l6ZSA9IDE2OworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBWRVJUSUNBTCBGSUxURVJJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiB2ZXJ0aWNhbCBmaWx0ZXJpbmcgb2YgbWlkIHNlY3Rpb25zIG5vIG5lZWQgdG8gY2hlY2sgbmVpZ2hib3JpbmcgUVAncyBldGMgKi8KKyAgICBpZiAoIWNocikKKyAgICB7CisgICAgICAgIHJlY195ID0gcmVjICsgKHdpZHRoIDw8IDMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGhlaWdodCA+PiA0KTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKHdpZHRoID4+IDQpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGsgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbUVBfc3RvcmVbbWJudW1dXTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGstLSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQSA9ICAqKHJlY195IC0gd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAqKHJlY195ICsgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7CisgICAgICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OworICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA8IC1zdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxID4gKHN0cmVuZ3RoIDw8IDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAoc3RyZW5ndGggPDwgMSkgLSBkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLSgtQV9EID4+IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtZDFfMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPiBkMV8yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoMikgPSBBIC0gZDI7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgpID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQyAtIGQxOworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOworICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSArIHdpZHRoKSA9IEQgKyBkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY195Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYm51bSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVjX3kgKz0gKDE1ICogd2lkdGgpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBWRVJUSUNBTCBib3VuZGFyeSBibG9ja3MgKi8KKworCisgICAgcmVjX3kgPSByZWMgKyB3aWR0aCAqIGJfc2l6ZTsKKworICAgIG1ibnVtID0gbk1CUGVyUm93OworICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2wgLSAxOyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbk1CUGVyUm93OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQgfHwgbW9kZVttYm51bSAtIG5NQlBlclJvd10gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSBiX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bV1dIDogUVBfc3RvcmVbbWJudW1dKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bSAtIG5NQlBlclJvd11dIDogUVBfc3RvcmVbbWJudW0gLSBuTUJQZXJSb3ddKV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKGstLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIHdpZHRoMik7CisgICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7CisgICAgICAgICAgICAgICAgICAgIEMgPSAqcmVjX3k7CisgICAgICAgICAgICAgICAgICAgIEIgPSAqKHJlY195IC0gd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgyKSA9IEEgLSBkMjsKKyAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQiArIGQxOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCisgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSB3aWR0aCkgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyB3aWR0aCkgPSBEICsgZDI7CisgICAgICAgICAgICAgICAgICAgIHJlY195Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ibnVtKys7CisgICAgICAgIH0KKyAgICAgICAgcmVjX3kgKz0gKChiX3NpemUgLSAxKSAqIHdpZHRoKTsKKworICAgIH0KKworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKkhPUklaT05UQUwgRklMVEVSSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIG1ibnVtID0gMDsKKyAgICAvKiBIT1JJWk9OVEFMIElOTkVSICovCisgICAgaWYgKCFjaHIpCisgICAgeworICAgICAgICByZWNfeSA9IHJlYyArIDg7CisgICAgICAgIG9mZnNldCA9IHdpZHRoICogYl9zaXplIC0gYl9zaXplOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2w7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5NQlBlclJvdzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrID0gMTY7CisgICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiW1FQX3N0b3JlW21ibnVtXV07CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRCA9ICAqKHJlY195ICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBX0QgPSBBIC0gRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMgPSAqcmVjX3k7CisgICAgICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgLShzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC1kMSAtIChzdHJlbmd0aCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gZCA+PiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSBkMSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gQV9EID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gZDFfMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSAyKSA9IEEgLSBkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSAxKSA9IHRtcHZhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZWNfeSA9IHRtcHZhcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyAxKSA9IEQgKyBkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY195ICs9IHdpZHRoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlY195IC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYm51bSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVjX3kgKz0gKDE1ICogd2lkdGgpOworCisgICAgICAgIH0KKyAgICB9CisKKworCisgICAgLyogSE9SSVpPTlRBTCBFREdFICovCisgICAgcmVjX3kgPSByZWMgKyBiX3NpemU7CisgICAgb2Zmc2V0ID0gd2lkdGggKiBiX3NpemUgLSBiX3NpemU7CisgICAgbWJudW0gPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBuTUJQZXJDb2w7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuTUJQZXJSb3cgLSAxOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQgfHwgbW9kZVttYm51bS0xXSAhPSBNT0RFX1NLSVBQRUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgayA9IGJfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbKGFubmV4X1QgPyAgTVFfY2hyb21hX1FQX3RhYmxlW1FQX3N0b3JlW21ibnVtXV0gOiBRUF9zdG9yZVttYm51bV0pXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZW5ndGggPSBTVFJFTkdUSF90YWJbKGFubmV4X1QgPyAgTVFfY2hyb21hX1FQX3RhYmxlW1FQX3N0b3JlW21ibnVtIC0gMV1dIDogUVBfc3RvcmVbbWJudW0gLSAxXSldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgRCA9ICAqKHJlY195ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOworICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OworICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIDEpOworICAgICAgICAgICAgICAgICAgICBkID0gKCgoQyAtIEIpIDw8IDIpICsgQV9EKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLSgtZCA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gLWQxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkMSA+IHN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChBX0QgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA8IC1kMV8yKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMikgPSBBIC0gZDI7CisgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMSkgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQorICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7CisgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyAxKSA9IEQgKyBkMjsKKyAgICAgICAgICAgICAgICAgICAgcmVjX3kgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlY195IC09IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWNfeSArPSBiX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYm51bSsrOworICAgICAgICB9CisgICAgICAgIHJlY195ICs9ICgod2lkdGggKiAoYl9zaXplIC0gMSkpICsgYl9zaXplKTsKKyAgICAgICAgbWJudW0rKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDgyOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtMCwwICsxLDE2ODcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIExPR19UQUcgInB2ZGVjX2FwaSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgorI2luY2x1ZGUgInZsY19kZWNvZGUuaCIKKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKworI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYIDB4N2ZmZmZmZmYKKyNlbmRpZgorCisjaWZuZGVmIFNJWkVfTUFYCisjZGVmaW5lIFNJWkVfTUFYICgoc2l6ZV90KSAtMSkKKyNlbmRpZgorCisjZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTkRJVElPTkFMX0lTX0NPTlNUQU5UCisKKyNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAorI2RlZmluZSBRQ0lGX01CUyA5OQorI2RlZmluZSBRQ0lGX0JTICg0KlFDSUZfTUJTKQorI2RlZmluZSBRQ0lGX01CX1JPV1MgMTEKK2V4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX3NsaWNlTm9bUUNJRl9NQlNdOworZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fYWNQcmVkRmxhZ1tRQ0lGX01CU107CitleHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9oZWFkZXJJbmZvX01vZGVbUUNJRl9NQlNdOworZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1faGVhZGVySW5mb19DQlBbUUNJRl9NQlNdOworZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgIElNRU1faGVhZGVySW5mb19RUE1CW1FDSUZfTUJTXTsKK2V4dGVybiBNYWNyb0Jsb2NrICAgICAgICAgICBJTUVNX21ibG9jazsKK2V4dGVybiBNT1QgICAgICAgICAgICAgICAgICBJTUVNX21vdFhbUUNJRl9CU107CitleHRlcm4gTU9UICAgICAgICAgICAgICAgICAgSU1FTV9tb3RZW1FDSUZfQlNdOworZXh0ZXJuIEJpdHN0cmVhbURlY1ZpZGVvICAgIElNRU1fQml0c3RyZWFtRGVjVmlkZW9bNF07CitleHRlcm4gdHlwZURDU3RvcmUgICAgICAgICAgSU1FTV9wcmVkRENbUUNJRl9NQlNdOworZXh0ZXJuIHR5cGVEQ0FDU3RvcmUgICAgICAgIElNRU1fcHJlZERDQUNfY29sW1FDSUZfTUJfUk9XUysxXTsKKworZXh0ZXJuIFZpZGVvRGVjRGF0YSAgICAgICAgIElNRU1fVmlkZW9EZWNEYXRhWzFdOworZXh0ZXJuIFZvcCAgICAgICAgICAgICAgICAgIElNRU1fY3VyclZvcFsxXTsKK2V4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ByZXZWb3BbMV07CitleHRlcm4gUElYRUwgICAgICAgICAgICAgICAgSU1FTV9jdXJyVm9wX3lDaGFuW1FDSUZfTUJTKjEyOCozXTsKK2V4dGVybiBQSVhFTCAgICAgICAgICAgICAgICBJTUVNX3ByZXZWb3BfeUNoYW5bUUNJRl9NQlMqMTI4KjNdOworZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fcHN0cHJjVHlwQ3VyWzYqUUNJRl9NQlNdOworZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fcHN0cHJjVHlwUHJ2WzYqUUNJRl9NQlNdOworCisKK2V4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ZvcEhFQURFUlsyXTsKK2V4dGVybiBWb2wgICAgICAgICAgICAgICAgICBJTUVNX1ZPTFsyXTsKK2V4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ZvcEhlYWRlclsyXVsxXTsKK2V4dGVybiBWb2wgICAgICAgICAgICAgICAgICBJTUVNX3ZvbFsyXVsxXTsKKworI2VuZGlmCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZJbml0VmlkZW9EZWNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xMS8yMDAwLCAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEluaXRpYWxpemF0aW9uIG9mIHRoZSBNUEVHLTQgdmlkZW8gZGVjb2RlciBsaWJyYXJ5LiAgICAgICAgICAqLworLyogICAgICAgICAgICAgVGhlIHJldHVybiB0eXBlIGlzIEJvb2wgaW5zdGVhZCBvZiBQVl9TVEFUVVMgYmVjYXVzZSAgICAgICAgICovCisvKiAgICAgICAgICAgICB3ZSBkb24ndCB3YW50IHRvIGV4cG9zZSBQVl9TVEFUVVMgdG8gKG91dHNpZGUpIHByb2dyYW1tZXJzICAgKi8KKy8qICAgICAgICAgICAgIHRoYXQgdXNlIG91ciBkZWNvZGVyIGxpYnJhcnkgU0RLLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkluaXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnZvbGJ1ZltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyICp2b2xidWZfc2l6ZSwgaW50IG5MYXllcnMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgTVA0RGVjb2RpbmdNb2RlIG1vZGUpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7CisgICAgaW50IGlkeDsKKyAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOworCisKKyAgICBvc2NsX21lbXNldChkZWNDdHJsLCAwLCBzaXplb2YoVmlkZW9EZWNDb250cm9scykpOyAvKiBmaXggYSBzaXplIGJ1Zy4gICAwMy8yOC8yMDAxICovCisgICAgZGVjQ3RybC0+bkxheWVycyA9IG5MYXllcnM7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKKyAgICB7CisgICAgICAgIGRlY0N0cmwtPnZvbGJ1ZltpZHhdID0gdm9sYnVmW2lkeF07CisgICAgICAgIGRlY0N0cmwtPnZvbGJ1Zl9zaXplW2lkeF0gPSB2b2xidWZfc2l6ZVtpZHhdOworICAgIH0KKworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24gKi8KKyNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAorICAgIHZpZGVvID0gSU1FTV9WaWRlb0RlY0RhdGE7CisjZWxzZQorICAgIHZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBvc2NsX21hbGxvYyhzaXplb2YoVmlkZW9EZWNEYXRhKSk7CisjZW5kaWYKKyAgICBpZiAodmlkZW8gIT0gTlVMTCkKKyAgICB7CisgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLCAwLCBzaXplb2YoVmlkZW9EZWNEYXRhKSk7CisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSA9IHNpemVvZihWaWRlb0RlY0RhdGEpOworICAgICAgICB2aWRlby0+bnVtYmVyT2ZMYXllcnMgPSBuTGF5ZXJzOworI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCisgICAgICAgIHZpZGVvLT52b2wgPSAoVm9sICoqKSBJTUVNX1ZPTDsKKyNlbHNlCisgICAgICAgIGlmICgoc2l6ZV90KW5MYXllcnMgPiBTSVpFX01BWCAvIHNpemVvZihWb2wgKikpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT52b2wgPSAoVm9sICoqKSBvc2NsX21hbGxvYyhuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKSk7CisjZW5kaWYKKyAgICAgICAgaWYgKHZpZGVvLT52b2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKTsKKworICAgICAgICAvKiBiZSBzdXJlIG5vdCB0byBsZWFrIGFueSBwcmV2aW91cyBzdGF0ZSAqLworICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoZGVjQ3RybCk7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gc2V0dXAgdGhpcyBwb2ludGVyIGZvciB0aGUgYXBwbGljYXRpb24gdG8gKi8KKyAgICAgICAgLyogICAgcGFzcyBpdCBhcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID0gKHZvaWQgKikgdmlkZW87CisgICAgICAgIHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzID0gZGVjQ3RybDsgIC8qIHllcy4gd2UgaGF2ZSBhIGN5Y2xpYyAqLworICAgICAgICAvKiByZWZlcmVuY2VzIGhlcmUgOikgICAgKi8KKworICAgICAgICAvKiBBbGxvY2F0aW5nIFZvcCBzcGFjZSwgdGhpcyBoYXMgdG8gY2hhbmdlIHdoZW4gd2UgYWRkICovCisgICAgICAgIC8qICAgIHNwYXRpYWwgc2NhbGFiaWxpdHkgdG8gdGhlIGRlY29kZXIgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAorICAgICAgICB2aWRlby0+Y3VyclZvcCA9IElNRU1fY3VyclZvcDsKKyAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5jdXJyVm9wLCAwLCBzaXplb2YoVm9wKSk7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gSU1FTV9wcmV2Vm9wOworICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AsIDAsIHNpemVvZihWb3ApKTsKKyAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSAqIDIpOworICAgICAgICB2aWRlby0+dm9wSGVhZGVyID0gKFZvcCAqKikgSU1FTV92b3BIRUFERVI7CisjZWxzZQorCisgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gKFZvcCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wKSk7CisgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+Y3VyclZvcCwgMCwgc2l6ZW9mKFZvcCkpOworICAgICAgICB2aWRlby0+cHJldlZvcCA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOworICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AsIDAsIHNpemVvZihWb3ApKTsKKyAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSAqIDIpOworCisgICAgICAgIGlmICgoc2l6ZV90KW5MYXllcnMgPiBTSVpFX01BWCAvIHNpemVvZihWb3AgKikpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPnZvcEhlYWRlciA9IChWb3AgKiopIG9zY2xfbWFsbG9jKHNpemVvZihWb3AgKikgKiBuTGF5ZXJzKTsKKyNlbmRpZgorICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlciA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9wSGVhZGVyLCAwLCBzaXplb2YoVm9wICopKm5MYXllcnMpOworICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3AgKikgKiBuTGF5ZXJzKTsKKworICAgICAgICB2aWRlby0+aW5pdGlhbGl6ZWQgPSBQVl9GQUxTRTsKKyAgICAgICAgLyogRGVjb2RlIHRoZSBoZWFkZXIgdG8gZ2V0IGFsbCBpbmZvcm1hdGlvbiB0byBhbGxvY2F0ZSBkYXRhICovCisgICAgICAgIGlmIChzdGF0dXMgPT0gUFZfVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVkIGZyYW1lIGNvdW50ZXIuICAgMDQvMjQvMjAwMSAqLworICAgICAgICAgICAgdmlkZW8tPmZyYW1lX2lkeCA9IC0xOworCisKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgICAgICAgICB7CisKKyNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAorICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9IElNRU1fdm9wSGVhZGVyW2lkeF07CisjZWxzZQorICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9wSGVhZGVyW2lkeF0sIDAsIHNpemVvZihWb3ApKTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPSAwOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3ApKTsKKyAgICAgICAgICAgICAgICB9CisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOworICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKKyNlbHNlCisgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKFZvbCk7CisgICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0cmVhbSA9IChCaXRzdHJlYW1EZWNWaWRlbyAqKSBvc2NsX21hbGxvYyhzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzIgYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYnVmZmVyX3NpemUgPSBCaXRzdHJlYW1PcGVuKHN0cmVhbSwgaWR4KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJJbml0VmlkZW9EZWNvZGVyKCk6IENhbid0IGFsbG9jYXRlIGJpdHN0cmVhbSBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IGJ1ZmZlcl9zaXplOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT52b2xJRCA9IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT50aW1lSW5jX29mZnNldCA9IDA7ICAvKiAgMTEvMTIvMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHVwIFZPTCBoZWFkZXIgYml0c3RyZWFtIGZvciBmcmFtZS1iYXNlZCBkZWNvZGluZy4gIDA4LzMwLzIwMDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgZGVjQ3RybC0+dm9sYnVmW2lkeF0sIGRlY0N0cmwtPnZvbGJ1Zl9zaXplW2lkeF0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKERlY29kZVZPTEhlYWRlcih2aWRlbywgaWR4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWX1NVQ0NFU1MgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX1RSVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9UUlVFOyAgIC8qICB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGZpcnN0IGxheWVyIGlzIGJhZCwgc2Vjb25kIGxheWVyIGlzIGdvb2QgcmV0dXJuIFBWX0ZBSUwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWX0JBRF9WT0xIRUFERVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPSBQVl9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID09IFBWX1RSVUUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBIMjYzX01PREU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgbWF4IHdpZHRoIGFuZCBoZWlnaHQuICBJbiBILjI2MyBtb2RlLCB3ZSB1c2UgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICB2b2xidWZfc2l6ZVswXSB0byBwYXNzIGluIHdpZHRoIGFuZCB2b2xidWZfc2l6ZVsxXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogIHRvIHBhc3MgaW4gaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgMDQvMjMvMjAwMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnRlbXBvcmFsUmVmID0gMDsgLyogIDExLzEyLzAxICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHNvbWUgY29udmVuaWVuY2UgdmFyaWFibGVzOiAgIDA0LzIzLzIwMDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+cXVhbnRUeXBlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+cXVhbnRQcmVjaXNpb24gPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5lcnJvclJlc0Rpc2FibGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5kYXRhUGFydGl0aW9uaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+dXNlUmV2ZXJzZVZMQyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFfYWNkY1ByZWREaXNhYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+c2NhbGFiaWxpdHkgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT53aWR0aCA9ICh3aWR0aCArIDE1KSAmIC0xNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWlnaHQgPSAoaGVpZ2h0ICsgMTUpICYgLTE2OworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNpemUgPSAoaW50MzIpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKKworI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1vZGlmaWVkX3F1YW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hZHZhbmNlZF9JTlRSQSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IFBWX0ZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBQVkFsbG9jVmlkZW9EYXRhKGRlY0N0cmwsIHdpZHRoLCBoZWlnaHQsIG5MYXllcnMpOworICAgICAgICAgICAgdmlkZW8tPmluaXRpYWxpemVkID0gUFZfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICB9CisKK2ZhaWw6CisgICAgaWYgKHN0YXR1cyA9PSBQVl9GQUxTRSkgUFZDbGVhblVwVmlkZW9EZWNvZGVyKGRlY0N0cmwpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworQm9vbCBQVkFsbG9jVmlkZW9EYXRhKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5MYXllcnMpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7CisgICAgaW50IG5Ub3RhbE1COworICAgIGludCBuTUJQZXJSb3c7CisgICAgaW50MzIgc2l6ZTsKKworICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9PSBQVl9UUlVFKQorICAgIHsKKyAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHdpZHRoOworICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgdmlkZW8tPndpZHRoID0gKHdpZHRoICsgMTUpICYgLTE2OworICAgICAgICB2aWRlby0+aGVpZ2h0ID0gKGhlaWdodCArIDE1KSAmIC0xNjsKKworICAgICAgICB2aWRlby0+bk1CUGVyUm93ID0KKyAgICAgICAgICAgIHZpZGVvLT5uTUJpbkdPQiAgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFOworICAgICAgICB2aWRlby0+bk1CUGVyQ29sID0KKyAgICAgICAgICAgIHZpZGVvLT5uR09CaW5Wb3AgPSB2aWRlby0+aGVpZ2h0IC8gTUJfU0laRTsKKyAgICAgICAgdmlkZW8tPm5Ub3RhbE1CID0KKyAgICAgICAgICAgIHZpZGVvLT5uTUJQZXJSb3cgKiB2aWRlby0+bk1CUGVyQ29sOworICAgIH0KKworICAgIGlmICgoKHVpbnQ2NF90KXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQpID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIHNpemVvZihQSVhFTCkpIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKworICAgIHNpemUgPSAoaW50MzIpc2l6ZW9mKFBJWEVMKSAqIHZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7CisjaWZkZWYgUFZfTUVNT1JZX1BPT0wKKyAgICBkZWNDdHJsLT5zaXplID0gc2l6ZTsKKyNlbHNlCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBJTUVNX2N1cnJWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KKworICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IElNRU1fcHJldlZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCisgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKyAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQorICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KKyAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CisjZW5kaWYKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemUgKiAzKTsKKyNlbmRpZiAgIC8vIE1FTU9SWV9QT09MCisgICAgLyogTm90ZSB0aGF0IGJhc2VWb3AsIGVuaGNWb3AgaXMgb25seSB1c2VkIHRvIGhvbGQgZW5oYW5jZW1lbnQgKi8KKyAgICAvKiAgICBsYXllciBoZWFkZXIgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgMDUvMDQvMjAwMCAgKi8KKyAgICBpZiAobkxheWVycyA+IDEpCisgICAgeworICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AgPSAoVm9wICopIG9zY2xfbWFsbG9jKHNpemVvZihWb3ApKTsKKyAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSk7CisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldkVuaGNWb3AsIDAsIHNpemVvZihWb3ApKTsKKyNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKKyAgICAgICAgICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgeworICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKDMgKiBzaXplIC8gMik7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHNsaWNlcywgQUMgcHJlZGljdGlvbiBmbGFnLCBhbmQgKi8KKyAgICAvKiAgICBBQy9EQyBwcmVkaWN0aW9uIHN0b3JhZ2UgKi8KKyAgICBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKKyAgICBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OworCisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKShJTUVNX3NsaWNlTm8pOworICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CisgICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikoSU1FTV9hY1ByZWRGbGFnKTsKKyAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CisgICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKShJTUVNX3ByZWREQyk7CisgICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOworICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKShJTUVNX3ByZWREQ0FDX2NvbCk7CisgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOworICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfY29sICsgMTsKKyAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopKElNRU1faGVhZGVySW5mb19Nb2RlKTsKKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CisgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopKElNRU1faGVhZGVySW5mb19DQlApOworICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COworICAgIHZpZGVvLT5RUE1CID0gKGludCAqKShJTUVNX2hlYWRlckluZm9fUVBNQik7CisgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7CisgICAgdmlkZW8tPm1ibG9jayA9ICZJTUVNX21ibG9jazsKKyAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBvc2NsX21lbXNldCh2aWRlby0+bWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKGludDE2KSo2Kk5DT0VGRl9CTE9DSyk7IC8vICBBdWcgMjMsMjAwNQorCisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihNYWNyb0Jsb2NrKTsKKyAgICB2aWRlby0+bW90WCA9IChNT1QgKikoSU1FTV9tb3RYKTsKKyAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgdmlkZW8tPm1vdFkgPSAoTU9UICopKElNRU1fbW90WSk7CisgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOworI2Vsc2UKKyAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CisgICAgaWYgKHZpZGVvLT5zbGljZU5vID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIG5Ub3RhbE1CKTsKKyAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CisKKyAgICB2aWRlby0+YWNQcmVkRmxhZyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOworICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5hY1ByZWRGbGFnLCAwLCBuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIpOworCisgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENTdG9yZSkpIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKyAgICB2aWRlby0+cHJlZERDID0gKHR5cGVEQ1N0b3JlICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CisgICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDLCAwLCBuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKKworICAgIGlmIChuTUJQZXJSb3cgPiBJTlQzMl9NQVggLSAxCisgICAgICAgICAgICB8fCAoc2l6ZV90KShuTUJQZXJSb3cgKyAxKSA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisgICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopIG9zY2xfbWFsbG9jKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CisgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfY29sLCAwLCAobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKworICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCisgICAgLyogIHRoZSByZXN0IHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyBob3Jpem9udGFsIChyb3cpIEFDIGNvZWZmaWNpZW50cyAgKi8KKyAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX2NvbCArIDE7ICAgICAgICAvKiAgQUNEQyAqLworCisgICAgLyogQWxsb2NhdGluZyBIZWFkZXJJbmZvIHN0cnVjdHVyZSAmIFF1YW50aXplciBhcnJheSAqLworICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmhlYWRlckluZm8uTW9kZSwgMCwgblRvdGFsTUIpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKKyAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCAodmlkZW8tPmhlYWRlckluZm8uQ0JQLCAwLCBuVG90YWxNQik7CisgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COworCisgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihpbnQxNikpIHsKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIH0KKyAgICB2aWRlby0+UVBNQiA9IChpbnQxNiAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOworICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+UVBNQiwgMHgwLCBuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7CisKKyAgICAvKiBBbGxvY2F0aW5nIG1hY3JvYmxvY2sgc3BhY2UgKi8KKyAgICB2aWRlby0+bWJsb2NrID0gKE1hY3JvQmxvY2sgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1hY3JvQmxvY2spKTsKKyAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tYmxvY2stPmJsb2NrLCAwLCBzaXplb2YoaW50MTYpKjYqTkNPRUZGX0JMT0NLKTsgLy8gIEF1ZyAyMywyMDA1CisKKyAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihNYWNyb0Jsb2NrKTsKKyAgICB9CisgICAgLyogQWxsb2NhdGluZyBtb3Rpb24gdmVjdG9yIHNwYWNlICovCisgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIChzaXplb2YoTU9UKSAqIDQpKSB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisgICAgdmlkZW8tPm1vdFggPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKKyAgICB2aWRlby0+bW90WSA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOworICAgIGlmICh2aWRlby0+bW90WSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOworICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOworI2VuZGlmCisKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgbGlicmFyeSAqLworICAgIHZpZGVvLT5wcmV2Vm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgIHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXAgPSAwOworI2lmbmRlZiBQVl9NRU1PUllfUE9PTAorICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiwgMTYsIHNpemVvZih1aW50OCkqc2l6ZSk7ICAgICAvKiAgMTAvMzEvMDEgKi8KKyAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+dUNoYW4sIDEyOCwgc2l6ZW9mKHVpbnQ4KSpzaXplIC8gMik7CisKKyAgICBvc2NsX21lbXNldCh2aWRlby0+Y3VyclZvcC0+eUNoYW4sIDAsIHNpemVvZih1aW50OCkqc2l6ZSozIC8gMik7CisgICAgaWYgKG5MYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiwgMCwgc2l6ZW9mKHVpbnQ4KSpzaXplKjMgLyAyKTsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPSAwOworICAgIH0KKyAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgIC8qICAwNy8wNy8yMDAxICovCisgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47ICAgICAgICAgICAgICAvKiAgMDYvMTkvMjAwMiAqLworI2VuZGlmCisKKyAgICAvKiBhbHdheXMgc3RhcnQgZnJvbSBiYXNlIGxheWVyICovCisgICAgdmlkZW8tPmN1cnJMYXllciA9IDA7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlJlc2V0VmlkZW9EZWNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDAxLzE0LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUmVzZXQgdmlkZW8gdGltZXN0YW1wcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZSZXNldFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgaW50IGlkeDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgZGVjQ3RybC0+bkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICB2aWRlby0+dm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcCA9IDA7CisgICAgfQorICAgIHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXAgPSAwOworICAgIGlmIChkZWNDdHJsLT5uTGF5ZXJzID4gMSkKKyAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPSAwOworCisgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1ibG9jay0+YmxvY2ssIDAsIHNpemVvZihpbnQxNikqNipOQ09FRkZfQkxPQ0spOyAvLyAgQXVnIDIzLDIwMDUKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZDbGVhblVwVmlkZW9EZWNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xMS8yMDAwLCAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IENsZWFudXAgb2YgdGhlIE1QRUctNCB2aWRlbyBkZWNvZGVyIGxpYnJhcnkuICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkNsZWFuVXBWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKK3sKKyAgICBpbnQgaWR4OworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKKyAgICBpZiAodmlkZW8pCisgICAgeworCisgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnICAgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPnNsaWNlTm8gICAgICAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+bW90WCAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5tb3RZICAgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPm1ibG9jayAgICAgICAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+UVBNQiAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5wcmVkREMgICAgICAgICAgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPnByZWREQ0FDX3JvdyAgICAgPSBOVUxMOworICAgICAgICB2aWRlby0+cHJlZERDQUNfY29sICAgICA9IE5VTEw7CisgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgID0gTlVMTDsKKyAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQICAgPSBOVUxMOworICAgICAgICBpZiAodmlkZW8tPm51bWJlck9mTGF5ZXJzID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oY1ZvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gTlVMTDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbikgb3NjbF9mcmVlKHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4pOworICAgICAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+cHJldkVuaGNWb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuKQorICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSBOVUxMOworICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4pCisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gTlVMTDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+dm9sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5udW1iZXJPZkxheWVyczsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbUNsb3NlKHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aWRlby0+dm9wSGVhZGVyW2lkeF0gPSBOVUxMOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlby0+dm9sID0gTlVMTDsKKyAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8gPSBOVUxMOworICAgICAgICBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID0gTlVMTDsKKyAgICB9CisKKyNlbHNlCisKKyAgICBpZiAodmlkZW8pCisgICAgeworICAgICAgICBpZiAodmlkZW8tPnByZWREQykgb3NjbF9mcmVlKHZpZGVvLT5wcmVkREMpOworICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gTlVMTDsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wpIG9zY2xfZnJlZSh2aWRlby0+cHJlZERDQUNfY29sKTsKKyAgICAgICAgaWYgKHZpZGVvLT5tb3RYKSBvc2NsX2ZyZWUodmlkZW8tPm1vdFgpOworICAgICAgICBpZiAodmlkZW8tPm1vdFkpIG9zY2xfZnJlZSh2aWRlby0+bW90WSk7CisgICAgICAgIGlmICh2aWRlby0+bWJsb2NrKSBvc2NsX2ZyZWUodmlkZW8tPm1ibG9jayk7CisgICAgICAgIGlmICh2aWRlby0+UVBNQikgb3NjbF9mcmVlKHZpZGVvLT5RUE1CKTsKKyAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUpIG9zY2xfZnJlZSh2aWRlby0+aGVhZGVySW5mby5Nb2RlKTsKKyAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCkgb3NjbF9mcmVlKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCk7CisgICAgICAgIGlmICh2aWRlby0+c2xpY2VObykgb3NjbF9mcmVlKHZpZGVvLT5zbGljZU5vKTsKKyAgICAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnKSBvc2NsX2ZyZWUodmlkZW8tPmFjUHJlZEZsYWcpOworCisgICAgICAgIGlmICh2aWRlby0+bnVtYmVyT2ZMYXllcnMgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSBOVUxMOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSBOVUxMOworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKSBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbik7CisgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2RW5oY1ZvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wKQorICAgICAgICB7CisKKyNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSBOVUxMOworICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbikKKyAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPmN1cnJWb3AtPnlDaGFuKTsKKyNlbmRpZgorICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5jdXJyVm9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPnByZXZWb3ApCisgICAgICAgIHsKKyNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IE5VTEw7CisgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSBOVUxMOworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbikKKyAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZWb3AtPnlDaGFuKTsKKyNlbmRpZgorICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2Vm9wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+dm9sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5udW1iZXJPZkxheWVyczsgaWR4KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtQ2xvc2UodmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnZvbFtpZHhdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+dm9sKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPm51bWJlck9mTGF5ZXJzOyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXJbaWR4XSkgb3NjbF9mcmVlKHZpZGVvLT52b3BIZWFkZXJbaWR4XSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlcikgb3NjbF9mcmVlKHZpZGVvLT52b3BIZWFkZXIpOworCisgICAgICAgIG9zY2xfZnJlZSh2aWRlbyk7CisgICAgICAgIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEgPSBOVUxMOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBQVl9UUlVFOworfQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldFZpZGVvRGltZW5zaW9ucygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0MDUwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IHRoZSBkaXNwbGF5X3dpZHRoIGFuZCBkaXNwbGF5X2hlaWdodCBvZiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgdGhlIGZyYW1lIGluIHRoZSBjdXJyZW50IGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiBUaGlzIGlzIG5vdCBhIG1hY3JvIG9yIGlubGluZSBmdW5jdGlvbiBiZWNhdXNlIHdlIGRvICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBub3Qgd2FudCB0byBleHBvc2Ugb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlLiAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWR2V0VmlkZW9EaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICpkaXNwbGF5X3dpZHRoLCBpbnQzMiAqZGlzcGxheV9oZWlnaHQpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgICpkaXNwbGF5X3dpZHRoID0gdmlkZW8tPmRpc3BsYXlXaWR0aDsKKyAgICAqZGlzcGxheV9oZWlnaHQgPSB2aWRlby0+ZGlzcGxheUhlaWdodDsKK30KKworT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZHZXRCdWZmZXJEaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICp3aWR0aCwgaW50MzIgKmhlaWdodCkgeworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICAqd2lkdGggPSB2aWRlby0+d2lkdGg7CisgICAgKmhlaWdodCA9IHZpZGVvLT5oZWlnaHQ7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRWaWRlb1RpbWVTdGFtcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8yNy8yMDAwLCAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBjdXJyZW50IHRpbWUgc3RhbXAgaW4gbWlsbGlzZWNvbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VpbnQzMiBQVkdldFZpZGVvVGltZVN0YW1wKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIHJldHVybiB2aWRlby0+Y3VyclRpbWVzdGFtcDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWU2V0UG9zdFByb2NUeXBlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDcvMDcvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogU2V0IHBvc3QtcHJvY2Vzc2luZyBmaWx0ZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IC4gMDgvMjkvMjAwMCBjaGFuZ2VzIHRoZSBuYW1lIGZvciBjb25zaXN0ZW5jeS4gICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgdm9pZCBQVlNldFBvc3RQcm9jVHlwZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgbW9kZSkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgaWYgKG1vZGUgIT0gMCkgeworICAgICAgICBBTE9HRSgiUG9zdCBwcm9jZXNzaW5nIGZpbHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgdmlkZW8tPnBvc3RGaWx0ZXJUeXBlID0gMDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0RGVjQml0cmF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhdmVyYWdlIGJpdHMgcGVyIHNlY29uZC4gICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgUFZHZXREZWNCaXRyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIGludCAgICAgaWR4OworICAgIGludDMyICAgc3VtID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQklUUkFURV9BVkVSQUdFX1dJTkRPVzsgaWR4KyspCisgICAgeworICAgICAgICBzdW0gKz0gdmlkZW8tPm5CaXRzUGVyVm9wW2lkeF07CisgICAgfQorICAgIHN1bSA9IChzdW0gKiB2aWRlby0+ZnJhbWVSYXRlKSAvICgxMCAqIEJJVFJBVEVfQVZFUkFHRV9XSU5ET1cpOworICAgIHJldHVybiAoaW50KSBzdW07Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldERlY0ZyYW1lcmF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYXZlcmFnZSBmcmFtZSBwZXIgMTAgc2Vjb25kLiAgICAgICAqLworLyogIE5vdGUgICAgIDogVGhlIGZwcyBjYW4gYmUgY2FsY3VsYXRlZCBieSBQVkdldERlY0ZyYW1lcmF0ZSgpLzEwICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IFBWR2V0RGVjRnJhbWVyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworCisgICAgcmV0dXJuIHZpZGVvLT5mcmFtZVJhdGU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRPdXRwdXRGcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNS8wNy8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmcmFtZSAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3VpbnQ4ICpQVkdldERlY091dHB1dEZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgcmV0dXJuIGRlY0N0cmwtPm91dHB1dEZyYW1lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0TGF5ZXJJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDcvMDkvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGRlY29kZWQgZnJhbWUgbGF5ZXIgaWQgKEJBU0UvRU5IQU5DRSkgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitpbnQgUFZHZXRMYXllcklEKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIHJldHVybiB2aWRlby0+Y3VyckxheWVyOworfQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldERlY01lbW9yeVVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkLiAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50MzIgUFZHZXREZWNNZW1vcnlVc2FnZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKKyAgICByZXR1cm4gdmlkZW8tPm1lbW9yeVVzYWdlOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXREZWNCaXRzdHJlYW1Nb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlY29kaW5nIG1vZGUgb2YgdGhlIGJhc2VsYXllciAgICAgKi8KKy8qICAgICAgICAgICAgICBiaXRzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIE1QNERlY29kaW5nTW9kZSBQVkdldERlY0JpdHN0cmVhbU1vZGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEgyNjNfTU9ERTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1QRUc0X01PREU7CisgICAgfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZFeHRyYWN0Vm9sSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBFeHRyYWN0IHZvbCBoZWFkZXIgb2YgdGhlIGJpdHN0cmVhbSBmcm9tIGJ1ZmZlcltdLiAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZFeHRyYWN0Vm9sSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIHVpbnQ4ICp2b2xfaGVhZGVyLCBpbnQzMiAqdm9sX2hlYWRlcl9zaXplKQoreworICAgIGludCBpZHggPSAtMTsKKyAgICB1aW50OCBzdGFydF9jb2RlX3ByZWZpeFtdID0geyAweDAwLCAweDAwLCAweDAxIH07CisgICAgdWludDggaDI2M19wcmVmaXhbXSA9IHsgMHgwMCwgMHgwMCwgMHg4MCB9OworCisgICAgaWYgKG9zY2xfbWVtY21wKGgyNjNfcHJlZml4LCB2aWRlb19idWZmZXIsIDMpID09IDApIC8qIHdlIGhhdmUgc2hvcnQgaGVhZGVyIHN0cmVhbSAqLworICAgIHsKKyAgICAgICAgb3NjbF9tZW1jcHkodm9sX2hlYWRlciwgdmlkZW9fYnVmZmVyLCAzMik7CisgICAgICAgICp2b2xfaGVhZGVyX3NpemUgPSAzMjsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChvc2NsX21lbWNtcChzdGFydF9jb2RlX3ByZWZpeCwgdmlkZW9fYnVmZmVyLCAzKSB8fAorICAgICAgICAgICAgICAgICh2aWRlb19idWZmZXJbM10gIT0gMHhiMCAmJiB2aWRlb19idWZmZXJbM10gPj0gMHgyMCkpIHJldHVybiBGQUxTRTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgIHdoaWxlIChvc2NsX21lbWNtcChzdGFydF9jb2RlX3ByZWZpeCwgdmlkZW9fYnVmZmVyICsgaWR4LCAzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ICsgMyA+PSAqdm9sX2hlYWRlcl9zaXplKSBnb3RvIHF1aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHZpZGVvX2J1ZmZlcltpZHgrM10gIT0gMHhiMyAmJiB2aWRlb19idWZmZXJbaWR4KzNdICE9IDB4YjYpOworCisgICAgICAgIG9zY2xfbWVtY3B5KHZvbF9oZWFkZXIsIHZpZGVvX2J1ZmZlciwgaWR4KTsKKyAgICAgICAgKnZvbF9oZWFkZXJfc2l6ZSA9IGlkeDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCitxdWl0OgorICAgIG9zY2xfbWVtY3B5KHZvbF9oZWFkZXIsIHZpZGVvX2J1ZmZlciwgKnZvbF9oZWFkZXJfc2l6ZSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZMb2NhdGVGcmFtZUhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC84LzIwMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBSZXR1cm4gdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgU0MgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludDMyIFBWTG9jYXRlRnJhbWVIZWFkZXIodWludDggKnB0ciwgaW50MzIgc2l6ZSkKK3sKKyAgICBpbnQgY291bnQgPSAwOworICAgIGludDMyIGkgPSBzaXplOworCisgICAgaWYgKHNpemUgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdoaWxlIChpLS0pCisgICAgeworICAgICAgICBpZiAoKGNvdW50ID4gMSkgJiYgKCpwdHIgPT0gMHgwMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCpwdHIrKykKKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgcmV0dXJuIChzaXplIC0gKGkgKyAxKSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkxvY2F0ZUgyNjNGcmFtZUhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzgvMjAwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFJldHVybiB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBTQyBpbiB0aGUgYnVmZmVyICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50MzIgUFZMb2NhdGVIMjYzRnJhbWVIZWFkZXIodWludDggKnB0ciwgaW50MzIgc2l6ZSkKK3sKKyAgICBpbnQgY291bnQgPSAwOworICAgIGludDMyIGkgPSBzaXplOworCisgICAgaWYgKHNpemUgPCAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIGlmICgoY291bnQgPiAxKSAmJiAoKCpwdHIgJiAweEZDKSA9PSAweDgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKnB0cisrKQorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gKHNpemUgLSAoaSArIDEpKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjb2RlVmlkZW9GcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWNvZGUgb25lIHZpZGVvIGZyYW1lIGFuZCByZXR1cm4gYSBZVVYtMTIgaW1hZ2UuICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6IDA0LzE3LzIwMDEgcmVtb3ZlZCBQVl9FT1MsIFBWX0VORF9PRl9CVUZGRVIgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgOiAwOC8yMi8yMDAyIGJyZWFrIHVwIGludG8gMiBmdW5jdGlvbnMgUFZEZWNvZGVWb3BIZWFkZXIgYW5kICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgUFZEZWNvZGVWb3BCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZEZWNvZGVWaWRlb0ZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpidWZmZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZXN0YW1wW10sIGludDMyIGJ1ZmZlcl9zaXplW10sIHVpbnQgdXNlX2V4dF90aW1lc3RhbXBbXSwgdWludDggKmN1cnJZVVYpCit7CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKworICAgIHN0YXR1cyA9IChQVl9TVEFUVVMpUFZEZWNvZGVWb3BIZWFkZXIoZGVjQ3RybCwgYnVmZmVyLCB0aW1lc3RhbXAsIGJ1ZmZlcl9zaXplLCAmaGVhZGVyX2luZm8sIHVzZV9leHRfdGltZXN0YW1wLCBjdXJyWVVWKTsKKyAgICBpZiAoc3RhdHVzICE9IFBWX1RSVUUpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGlmIChQVkRlY29kZVZvcEJvZHkoZGVjQ3RybCwgYnVmZmVyX3NpemUpICE9IFBWX1RSVUUpCisgICAgeworICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZEZWNvZGVWb3BIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERldGVybWluZSB0YXJnZXQgbGF5ZXIgYW5kIGRlY29kZSB2b3AgaGVhZGVyLCBtb2RpZmllZCBmcm9tICAqLworLyogICAgICAgICAgICAgIG9yaWdpbmFsIFBWRGVjb2RlVmlkZW9GcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQm9vbCBQVkRlY29kZVZvcEhlYWRlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqYnVmZmVyW10sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0aW1lc3RhbXBbXSwgaW50MzIgYnVmZmVyX3NpemVbXSwgVm9wSGVhZGVySW5mbyAqaGVhZGVyX2luZm8sIHVpbnQgdXNlX2V4dF90aW1lc3RhbXAgW10sIHVpbnQ4ICpjdXJyWVVWKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgVm9sICpjdXJyVm9sOworICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgIFZvcCAqKnZvcEhlYWRlciA9IHZpZGVvLT52b3BIZWFkZXI7CisgICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbTsKKworICAgIGludCB0YXJnZXRfbGF5ZXI7CisKKyNpZmRlZiBQVl9TVVBQT1JUX1RFTVBPUkFMX1NDQUxBQklMSVRZCisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX0ZBSUw7CisgICAgaW50IGlkeDsKKyAgICBpbnQzMiBkaXNwbGF5X3RpbWU7CisKKyAgICAvKiBkZWNpZGUgd2hpY2ggZnJhbWUgdG8gZGVjb2RlIG5leHQgKi8KKyAgICBpZiAoZGVjQ3RybC0+bkxheWVycyA+IDEpCisgICAgeworICAgICAgICBkaXNwbGF5X3RpbWUgPSB0YXJnZXRfbGF5ZXIgPSAtMTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBkZWNDdHJsLT5uTGF5ZXJzOyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBkYXRhIGZvciB0aGlzIGxheWVyPyAqLworICAgICAgICAgICAgaWYgKGJ1ZmZlcl9zaXplW2lkeF0gPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBbaWR4XSA9IC0xOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkaWQgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGUgYSB0aW1lc3RhbXAgZm9yIHRoaXMgdm9wPyAqLworICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFtpZHhdIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYml0c3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSBpZHg7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtOworICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZXNldChzdHJlYW0sIGJ1ZmZlcltpZHhdLCBidWZmZXJfc2l6ZVtpZHhdKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IERlY29kZVZPUEhlYWRlcih2aWRlbywgdm9wSGVhZGVyW2lkeF0sIEZBTFNFKSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSBWT1AgaGVhZGVyIGluIHRoZSBidWZmZXIuICAgMDgvMzAvMjAwMC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBkYXRhIGZvciBlbmhhbmNlbWVudCBsYXllciwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBkb24ndCBqdXN0IHN0b3AuICAgMDkvMDcvMjAwMC4gICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVtpZHhdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFtpZHhdID0gQ2FsY1ZvcERpc3BsYXlUaW1lKHZpZGVvLT52b2xbaWR4XSwgdm9wSGVhZGVyW2lkeF0sIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gMCkgdm9wSGVhZGVyW2lkeF0tPnJlZlNlbGVjdENvZGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3ZlIGRlY29kZWQgdGhpcyB2b3AgaGVhZGVyIGluIHRoZSBwcmV2aW91cyBydW4gYWxyZWFkeS4gKi8KKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wW2lkeF0gPSB2b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVXNlIHRpbWVzdGFtcHMgdG8gc2VsZWN0IHRoZSBuZXh0IFZPUCB0byBiZSBkZWNvZGVkICovCisgICAgICAgICAgICBpZiAodGltZXN0YW1wW2lkeF0gPj0gMCAmJiAoZGlzcGxheV90aW1lIDwgMCB8fCBkaXNwbGF5X3RpbWUgPiB0aW1lc3RhbXBbaWR4XSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lID0gdGltZXN0YW1wW2lkeF07CisgICAgICAgICAgICAgICAgdGFyZ2V0X2xheWVyID0gaWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGlzcGxheV90aW1lID09IHRpbWVzdGFtcFtpZHhdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdlIGhhdmUgdG8gaGFuZGxlIGVpdGhlciBTTlIgb3Igc3BhdGlhbCBzY2FsYWJpbGl0eSBoZXJlLiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIgPCAwKSByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAgICAgLyogc2V0IHVwIGZvciBkZWNvZGluZyB0aGUgdGFyZ2V0IGxheWVyICovCisgICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSB0YXJnZXRfbGF5ZXI7CisgICAgICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW3RhcmdldF9sYXllcl07CisgICAgICAgIHZpZGVvLT5iaXRzdHJlYW0gPSBzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07CisKKyAgICAgICAgLyogV2UgbmVlZCB0byBkZWNvZGUgdGhlIHZvcCBoZWFkZXIgaWYgZXh0ZXJuYWwgdGltZXN0YW1wICAgKi8KKyAgICAgICAgLyogICAgaXMgcHJvdmlkZWQuICAgIDEwLzA0LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0gPSB2aWRlby0+dm9sW3RhcmdldF9sYXllcl0tPmJpdHN0cmVhbTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgYnVmZmVyW3RhcmdldF9sYXllcl0sIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0pOworCisgICAgICAgICAgICB3aGlsZSAoRGVjb2RlVk9QSGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXSwgVFJVRSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZmluZCBhIFZPUCBoZWFkZXIgaW4gdGhlIGJ1ZmZlci4gICAwOC8zMC8yMDAwLiAqLworICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGRhdGEgZm9yIGVuaGFuY2VtZW50IGxheWVyLCAqLworICAgICAgICAgICAgICAgICAgICAvKiAgICBkb24ndCBqdXN0IHN0b3AuICAgMDkvMDcvMjAwMC4gICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXS0+dGltZUluY19vZmZzZXQgPSB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZUluYzsKKyAgICAgICAgICAgIHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXS0+bW9kdWxvVGltZUJhc2UgPSB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXTsKKyAgICAgICAgICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIgPT0gMCkgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnJlZlNlbGVjdENvZGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLyogYmFzZSBsYXllciBvbmx5IGRlY29kaW5nICovCisgICAgeworI2VuZGlmCisgICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSB0YXJnZXRfbGF5ZXIgPSAwOworICAgICAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFswXTsKKyAgICAgICAgdmlkZW8tPmJpdHN0cmVhbSA9IHN0cmVhbSA9IGN1cnJWb2wtPmJpdHN0cmVhbTsKKyAgICAgICAgaWYgKGJ1ZmZlcl9zaXplWzBdIDw9IDApIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgQml0c3RyZWFtUmVzZXQoc3RyZWFtLCBidWZmZXJbMF0sIGJ1ZmZlcl9zaXplWzBdKTsKKworICAgICAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChEZWNvZGVTaG9ydEhlYWRlcih2aWRlbywgdm9wSGVhZGVyWzBdKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRIMjYzRnJhbWUoc3RyZWFtKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gdm9wIGhlYWRlciBpbiB0aGUgYnVmZmVyLCAgICAqLworICAgICAgICAgICAgICAgICAgICAvKiAgIGNsZWFuIGJpdHN0cmVhbSBidWZmZXIuICAgICAyLzUvMjAwMSAgICovCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbml0aWFsaXplZCA9PSBQVl9GQUxTRSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHZpZGVvLT53aWR0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1c2VfZXh0X3RpbWVzdGFtcFswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBNVEIgZm9yIEgyNjMgaXMgYWJzb2x1dGUgVFIgKi8KKyAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgbGluZSBpcyBlcXVpdmFsZW50IHRvICByb3VuZCgodGltZXN0YW1wWzBdKjMwKS8xMDAxKTsgICAxMS8xMy8yMDAxICovCisgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFswXS0+bW9kdWxvVGltZUJhc2UgPSAzMCAqICgodGltZXN0YW1wWzBdICsgMTcpIC8gMTAwMSkgKyAoMzAgKiAoKHRpbWVzdGFtcFswXSArIDE3KSAlIDEwMDEpIC8gMTAwMSk7CisgICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSBDYWxjVm9wRGlzcGxheVRpbWUoY3VyclZvbCwgdm9wSGVhZGVyWzBdLCB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoRGVjb2RlVk9QSGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbMF0sIEZBTFNFKSAhPSBQVl9TVUNDRVNTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmaW5kIGEgVk9QIGhlYWRlciBpbiB0aGUgYnVmZmVyLiAgIDA4LzMwLzIwMDAuICovCisgICAgICAgICAgICAgICAgaWYgKFBWU2VhcmNoTmV4dE00VkZyYW1lKHN0cmVhbSkgIT0gUFZfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHZvcCBoZWFkZXIgaW4gdGhlIGJ1ZmZlciwgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogICBjbGVhbiBiaXRzdHJlYW0gYnVmZmVyLiAgICAgMi81LzIwMDEgICAqLworICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1c2VfZXh0X3RpbWVzdGFtcFswXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+dm9sWzBdLT50aW1lSW5jX29mZnNldCA9IHZvcEhlYWRlclswXS0+dGltZUluYzsKKyAgICAgICAgICAgICAgICB2aWRlby0+dm9sWzBdLT5tb2R1bG9UaW1lQmFzZSA9IHRpbWVzdGFtcFswXTsgIC8qICAxMS8xMi8yMDAxICovCisgICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSBDYWxjVm9wRGlzcGxheVRpbWUoY3VyclZvbCwgdm9wSGVhZGVyWzBdLCB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdXAgc29tZSBiYXNlLWxheWVyIG9ubHkgcGFyYW1ldGVycyAqLworICAgICAgICB2b3BIZWFkZXJbMF0tPnJlZlNlbGVjdENvZGUgPSAxOworI2lmZGVmIFBWX1NVUFBPUlRfVEVNUE9SQUxfU0NBTEFCSUxJVFkKKyAgICB9CisjZW5kaWYKKyAgICB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXSA9IHZpZGVvLT5jdXJyVGltZXN0YW1wID0gdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVTdGFtcDsKKyNpZmRlZiBQVl9NRU1PUllfUE9PTAorICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT55Q2hhbiA9IChQSVhFTCAqKWN1cnJZVVY7CisgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnVDaGFuID0gKFBJWEVMICopY3VycllVViArIGRlY0N0cmwtPnNpemU7CisgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnZDaGFuID0gKFBJWEVMICopKHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT51Q2hhbikgKyAoZGVjQ3RybC0+c2l6ZSA+PiAyKTsKKyNlbHNlCisgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnlDaGFuID0gY3VyclZvcC0+eUNoYW47CisgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnVDaGFuID0gY3VyclZvcC0+dUNoYW47CisgICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnZDaGFuID0gY3VyclZvcC0+dkNoYW47CisjZW5kaWYKKyAgICBvc2NsX21lbWNweShjdXJyVm9wLCB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXSwgc2l6ZW9mKFZvcCkpOworCisjaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQorICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPSAtMTsKKyNlbmRpZgorICAgIC8qIHB1dCBoZWFkZXIgaW5mbyBpbnRvIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICBoZWFkZXJfaW5mby0+Y3VyckxheWVyID0gdGFyZ2V0X2xheWVyOworICAgIGhlYWRlcl9pbmZvLT50aW1lc3RhbXAgPSB2aWRlby0+Y3VyclRpbWVzdGFtcDsKKyAgICBoZWFkZXJfaW5mby0+ZnJhbWVUeXBlID0gKE1QNEZyYW1lVHlwZSljdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICBoZWFkZXJfaW5mby0+cmVmU2VsQ29kZSA9IHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT5yZWZTZWxlY3RDb2RlOworICAgIGhlYWRlcl9pbmZvLT5xdWFudGl6ZXIgPSBjdXJyVm9wLT5xdWFudGl6ZXI7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZEZWNvZGVWb3BCb2R5KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IERlY29kZSB2b3AgYm9keSBhZnRlciB0aGUgaGVhZGVyIGlzIGRlY29kZWQsIG1vZGlmaWVkIGZyb20gICAqLworLyogICAgICAgICAgICAgIG9yaWdpbmFsIFBWRGVjb2RlVmlkZW9GcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQm9vbCBQVkRlY29kZVZvcEJvZHkoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgYnVmZmVyX3NpemVbXSkKK3sKKyAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfRkFJTDsKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIGludCB0YXJnZXRfbGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXTsKKyAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICBWb3AgKnByZXZWb3AgPSB2aWRlby0+cHJldlZvcDsKKyAgICBWb3AgKnRlbXBWb3BQdHI7CisgICAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsgLyogUmVjb3JkIGhvdyBtYW55IGJpdHMgd2UgdXNlZCBpbiB0aGUgYnVmZmVyLiAgIDA0LzI0LzIwMDEgKi8KKworICAgIGludCBpZHg7CisKKyAgICBpZiAoY3VyclZvcC0+dm9wQ29kZWQgPT0gMCkgICAgICAgICAgICAgICAgICAvKiAgMDcvMDMvMjAwMSAqLworICAgIHsKKyAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKGN1cnJWb2wtPmJpdHN0cmVhbSk7CisgICAgICAgIC8qIFdlIHNob3VsZCBhbHdheXMgY2xlYXIgdXAgYml0c3RyZWFtIGJ1ZmZlci4gICAxMC8xMC8yMDAwICovCisgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gKGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKSArIDcpID4+IDM7CisKKyAgICAgICAgaWYgKGJ5dGVzX2NvbnN1bWVkID4gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3M7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPCBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBJZiB3ZSBvbmx5IGNvbnN1bWUgcGFydCBvZiB0aGUgYml0cyBpbiB0aGUgYnVmZmVyLCB0YWtlIHRob3NlICovCisgICAgICAgICAgICAvKiAgb3V0LiAgICAgMDQvMjQvMjAwMSAqLworICAgICAgICAgICAgLyogICAgICAgICAgb3NjbF9tZW1jcHkoYnVmZmVyW3RhcmdldF9sYXllcl0sIGJ1ZmZlclt0YXJnZXRfbGF5ZXJdK2J5dGVzX2NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdLT1ieXRlc19jb25zdW1lZCkpOyAqLworICAgICAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSAtPSBieXRlc19jb25zdW1lZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gPSAwOworICAgICAgICB9CisjaWZkZWYgUFZfTUVNT1JZX1BPT0wKKworICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPiB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCF2aWRlby0+cHJldlZvcC0+eUNoYW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJiLzM1MjY5NjM1Iik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM1MjY5NjM1Iik7CisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgb3NjbF9tZW1jcHkoY3VyclZvcC0+eUNoYW4sIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiwgKGRlY0N0cmwtPnNpemUqMykgLyAyKTsKKworICAgICAgICB2aWRlby0+cHJldlZvcCA9IHByZXZWb3A7CisKKyAgICAgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IGN1cnJWb3AtPnlDaGFuOyAgICAgICAvKiAgMDcvMDcvMjAwMSAqLworCisgICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsgLyogIDA3LzA5LzAxICovCisKKyAgICAgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSBjdXJyVm9wLT55Q2hhbjsKKworICAgICAgICAvKiBTd2FwIFZPUCBwb2ludGVycy4gIE5vIGVuaGMuIGZyYW1lIG9zY2xfbWVtY3B5KCkgYW55bW9yZSEgICAwNC8yNC8yMDAxICovCisgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldkVuaGNWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldlZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXBWb3BQdHI7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpICAgICAgIC8qIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGZsYXNoYmFjayBwcm9ibGVtcyAgIDA2LzIxLzIwMDIqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IGN1cnJWb3AtPnRpbWVTdGFtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXAgPSBjdXJyVm9wLT50aW1lU3RhbXA7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gY3VyclZvcC0+cHJlZGljdGlvblR5cGU7IC8qICAwNy8wOS8wMSAqLworICAgICAgICAvKiB0aGUgZm9sbG93aW5nIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkaXNwbGF5aW5nIGFuIG5vdENvZGVkIEktVk9QIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzZXNzaW9uCisgICAgICAgIG9yIGFmdGVyIHJhbmRvbSBwb3NpdGlvbmluZyAgMDcvMDMvMDIqLworICAgICAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBQX1ZPUDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcmV0dXJuIFBWX1RSVUU7CisgICAgfQorICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAvKiAgRGVjb2RlIHZvcCBib2R5IChpZiB0aGVyZSBpcyBubyBlcnJvciBpbiB0aGUgaGVhZGVyISkgICovCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgLyogZmlyc3QsIHdlIG5lZWQgdG8gc2VsZWN0IGEgcmVmZXJlbmNlIGZyYW1lICovCisgICAgaWYgKGRlY0N0cmwtPm5MYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBkbyBub3RoaW5nIGhlcmUgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChjdXJyVm9wLT5yZWZTZWxlY3RDb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMCA6IC8qIG1vc3QgcmVjZW50bHkgZGVjb2RlZCBlbmhhbmNlbWVudCB2b3AgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogU2V0dXAgdmlkZW8tPnByZXZWb3AgYmVmb3JlIHdlIGNhbGwgUFZfRGVjb2RlVm9wKCkuICAgMDQvMjQvMjAwMSAqLworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPj0gdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMSA6IC8qIG1vc3QgcmVjZW50bHkgZGlzcGxheWVkIGJhc2UtbGF5ZXIgdm9wICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA+IHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDIgOiAvKiBuZXh0IGJhc2UtbGF5ZXIgdm9wIGluIGRpc3BsYXkgb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDMgOiAvKiB0ZW1wb3JhbGx5IGNvaW5jaWRlbnQgYmFzZS1sYXllciB2b3AgKG5vIE1WJ3MpICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogd2UgaGF2ZSBhIEItVm9wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVZpZGVvRnJhbWUoKTogQi1WT1Agbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVGhpcyBpcyBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBmcmFtZSByYXRlIGFuZCBiaXRyYXRlLiAqLworICAgIGlkeCA9ICsrdmlkZW8tPmZyYW1lX2lkeCAlIEJJVFJBVEVfQVZFUkFHRV9XSU5ET1c7CisKKyAgICAvKiBDYWxjdWxhdGUgYml0cmF0ZSBmb3IgdGhpcyBsYXllci4gICAwOC8yMy8yMDAwICovCisgICAgc3RhdHVzID0gUFZfRGVjb2RlVm9wKHZpZGVvKTsKKyAgICB2aWRlby0+bkJpdHNQZXJWb3BbaWR4XSA9IGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKTsKKyAgICB2aWRlby0+cHJldlRpbWVzdGFtcFtpZHhdID0gY3VyclZvcC0+dGltZVN0YW1wOworCisgICAgLyogcmVzdG9yZSB2aWRlby0+cHJldlZvcCBhZnRlciBQVl9EZWNvZGVWb3AoKS4gICAwNC8yNC8yMDAxICovCisvLyAgaWYgKGN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPT0gMCkgdmlkZW8tPnByZXZWb3AgPSBwcmV2Vm9wOworICAgIHZpZGVvLT5wcmV2Vm9wID0gcHJldlZvcDsKKworICAgIC8qIEVzdGltYXRlIHRoZSBmcmFtZSByYXRlLiAgIDA4LzIzLzIwMDAgKi8KKyAgICB2aWRlby0+ZHVyYXRpb24gPSB2aWRlby0+cHJldlRpbWVzdGFtcFtpZHhdOworICAgIHZpZGVvLT5kdXJhdGlvbiAtPSB2aWRlby0+cHJldlRpbWVzdGFtcFsoKytpZHgpJUJJVFJBVEVfQVZFUkFHRV9XSU5ET1ddOworICAgIGlmICh2aWRlby0+ZHVyYXRpb24gPiAwKQorICAgIHsgLyogT25seSB1cGRhdGUgZnJhbWVyYXRlIHdoZW4gdGhlIHRpbWVzdGFtcCBpcyByaWdodCAqLworICAgICAgICB2aWRlby0+ZnJhbWVSYXRlID0gKGludCkoRlJBTUVSQVRFX1NDQUxFKSAvIHZpZGVvLT5kdXJhdGlvbjsKKyAgICB9CisKKyAgICAvKiBXZSBzaG91bGQgYWx3YXlzIGNsZWFyIHVwIGJpdHN0cmVhbSBidWZmZXIuICAgMTAvMTAvMjAwMCAqLworICAgIGJ5dGVzX2NvbnN1bWVkID0gKGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKSArIDcpID4+IDM7IC8qICAxMS80LzAzICovCisKKyAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPiBjdXJyVm9sLT5iaXRzdHJlYW0tPmRhdGFfZW5kX3BvcykKKyAgICB7CisgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3M7CisgICAgfQorCisgICAgaWYgKGJ5dGVzX2NvbnN1bWVkIDwgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSkKKyAgICB7CisgICAgICAgIC8qIElmIHdlIG9ubHkgY29uc3VtZSBwYXJ0IG9mIHRoZSBiaXRzIGluIHRoZSBidWZmZXIsIHRha2UgdGhvc2UgKi8KKyAgICAgICAgLyogIG91dC4gICAgIDA0LzI0LzIwMDEgKi8KKyAgICAgICAgLyogICAgICBvc2NsX21lbWNweShidWZmZXJbdGFyZ2V0X2xheWVyXSwgYnVmZmVyW3RhcmdldF9sYXllcl0rYnl0ZXNfY29uc3VtZWQsCisgICAgICAgICAgICAgICAgICAgIChidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdLT1ieXRlc19jb25zdW1lZCkpOyAqLworICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdIC09IGJ5dGVzX2NvbnN1bWVkOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdID0gMDsKKyAgICB9CisgICAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgICAgICBjYXNlIFBWX0ZBSUwgOgorICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOyAgICAgICAgLyogdGhpcyB3aWxsIHRha2UgY2FyZSBvZiBjb25jZWFsbWVudCBpZiB3ZSBsb3NlIHdob2xlIGZyYW1lICAqLworCisgICAgICAgIGNhc2UgUFZfRU5EX09GX1ZPUCA6CisgICAgICAgICAgICAvKiB3ZSBtYXkgd2FudCB0byBkaWZmZXJlbmNpYXRlIFBWX0VORF9PRl9WT1AgYW5kIFBWX1NVQ0NFU1MgKi8KKyAgICAgICAgICAgIC8qICAgIGluIHRoZSBmdXR1cmUuICAgICAwNS8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgY2FzZSBQVl9TVUNDRVNTIDoKKyAgICAgICAgICAgIC8qIE5vaHRpbmcgaXMgd3JvbmcgOikuICovCisKKworICAgICAgICAgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsgICAgICAgLyogIDA3LzA3LzIwMDEgKi8KKworICAgICAgICAgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsgLyogIDA3LzA5LzAxICovCisKKyAgICAgICAgICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOworCisgICAgICAgICAgICAvKiBTd2FwIFZPUCBwb2ludGVycy4gIE5vIGVuaGMuIGZyYW1lIG9zY2xfbWVtY3B5KCkgYW55bW9yZSEgICAwNC8yNC8yMDAxICovCisgICAgICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldkVuaGNWb3A7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wVm9wUHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldlZvcDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5jdXJyVm9wOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgLyogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKyNpZmRlZiBQVl9NRU1PUllfUE9PTAorT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZTZXRSZWZlcmVuY2VZVVYoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKllVVikKK3sKKyAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gKFBJWEVMICopWVVWOworICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IChQSVhFTCAqKVlVViArIHZpZGVvLT5zaXplOworICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IChQSVhFTCAqKXZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChkZWNDdHJsLT5zaXplID4+IDIpOworICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiwgMTYsIHNpemVvZih1aW50OCkqZGVjQ3RybC0+c2l6ZSk7ICAgICAvKiAgMTAvMzEvMDEgKi8KKyAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+dUNoYW4sIDEyOCwgc2l6ZW9mKHVpbnQ4KSpkZWNDdHJsLT5zaXplIC8gMik7CisgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgICAvKiAgMDcvMDcvMjAwMSAqLworICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgLyogIDA2LzE5LzIwMDIgKi8KK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNi8yMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5dGltZSBhbiBlcnJvciBpbnQgdGhlICAgICAgKi8KKy8qICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgZGV0ZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwordWludCBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKFZpZGVvRGVjRGF0YSAqKQoreworICAgIC8qIFRoaXMgaXMgb25seSB1c2VkIGZvciB0cmFwcGluZyBiaXRzdHJlYW0gZXJyb3IgZm9yIGRlYnVnaW5nICovCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBFTkFCTEVfTE9HCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogbTR2ZGVjX2RwcmludGYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8xNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGxvZ3MgbWVzc2FnZXMgaW4gdGhlIG1wZWc0IHZpZGVvICAgICAqLworLyogICAgICAgICAgICAgZGVjb2Rlci4gIFdlIGNhbiBjYWxsIHRoZSBzdGFuZGFyZCBQYWNrZXRWaWRlbyBQVk1lc3NhZ2UgICAgICovCisvKiAgICAgICAgICAgICBmcm9tIGluc2lkZSB0aGlzIGZ1bmN0aW9uIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiBUbyB0dXJuIG9uIHRoZSBsb2dnaW5nLCBMT0dfTVA0REVDX01FU1NBR0UgbXVzdCBiZSBkZWZpbmVkICAgKi8KKy8qICAgICAgICAgICAgICB3aGVuIGNvbXBpbGluZyB0aGlzIGZpbGUgKG9ubHkgdGhpcyBmaWxlKS4gICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3ZvaWQgbTR2ZGVjX2RwcmludGYoY2hhciAqZm9ybWF0LCAuLi4pCit7CisgICAgRklMRSAqbG9nX2ZwOworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCisgICAgLyogb3BlbiB0aGUgbG9nIGZpbGUgKi8KKyAgICBsb2dfZnAgPSBmb3BlbigiXFxtcDRkZWNfbG9nLnR4dCIsICJhKyIpOworICAgIGlmIChsb2dfZnAgPT0gTlVMTCkgcmV0dXJuOworICAgIC8qIG91dHB1dCB0aGUgbWVzc2FnZSAqLworICAgIHZmcHJpbnRmKGxvZ19mcCwgZm9ybWF0LCBhcmdzKTsKKyAgICBmY2xvc2UobG9nX2ZwKTsKKworICAgIHZhX2VuZChhcmdzKTsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogSXNJbnRyYUZyYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNS8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBUaGUgbW9zdCByZWNlbnRseSBkZWNvZGVkIGZyYW1lIGlzIGFuIEludHJhIGZyYW1lLiAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgSXNJbnRyYUZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCit7CisgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOworICAgIHJldHVybiAodmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9PSBJX1ZPUCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZEZWNQb3N0UHJvY2VzcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwMS8wOS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFBvc3RQcm9jZXNzIG9uZSB2aWRlbyBmcmFtZSBhbmQgcmV0dXJuIGEgWVVWLTEyIGltYWdlLiAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3ZvaWQgUFZEZWNQb3N0UHJvY2VzcyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqb3V0cHV0WVVWKQoreworICAgIHVpbnQ4ICpvdXRwdXRCdWZmZXI7CisgICAgb3V0cHV0QnVmZmVyID0gZGVjQ3RybC0+b3V0cHV0RnJhbWU7CisgICAgb3V0cHV0WVVWOworICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gb3V0cHV0QnVmZmVyOworICAgIHJldHVybjsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWRGVjU2V0UmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB0aW1lc3RhbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNy8yMi8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCBZVVYgcmVmZXJlbmNlIGZyYW1lIGZyb20gZXh0ZXJuYWwgc291cmNlLiAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogWVVWIDQtMi0wIGZyYW1lIGNvbnRhaW5pbmcgbmV3IHJlZmVyZW5jZSBmcmFtZSBpbiB0aGUgc2FtZSAgICovCisvKiAgIDogZGltZW5zaW9uIGFzIG9yaWdpbmFsLCBpLmUuLCBkb2Vzbid0IGhhdmUgdG8gYmUgbXVsdGlwbGUgb2YgMTYgISEhLiAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQm9vbCBQVkRlY1NldFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCB1aW50MzIgdGltZXN0YW1wKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgVm9wICpwcmV2Vm9wID0gdmlkZW8tPnByZXZWb3A7CisgICAgaW50IHdpZHRoID0gdmlkZW8tPndpZHRoOworICAgIHVpbnQ4ICpkc3RQdHIsICpvcmdQdHIsICpkc3RQdHIyLCAqb3JnUHRyMjsKKyAgICBpbnQzMiBzaXplID0gKGludDMyKXdpZHRoICogdmlkZW8tPmhlaWdodDsKKworCisgICAgLyogc2V0IG5ldyBwYXJhbWV0ZXJzICovCisgICAgcHJldlZvcC0+dGltZVN0YW1wID0gdGltZXN0YW1wOworICAgIHByZXZWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CisKKyAgICBkc3RQdHIgPSBwcmV2Vm9wLT55Q2hhbjsKKyAgICBvcmdQdHIgPSByZWZZVVY7CisgICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIHNpemUpOworICAgIGRzdFB0ciA9IHByZXZWb3AtPnVDaGFuOworICAgIGRzdFB0cjIgPSBwcmV2Vm9wLT52Q2hhbjsKKyAgICBvcmdQdHIgPSByZWZZVVYgKyBzaXplOworICAgIG9yZ1B0cjIgPSBvcmdQdHIgKyAoc2l6ZSA+PiAyKTsKKyAgICBvc2NsX21lbWNweShkc3RQdHIsIG9yZ1B0ciwgKHNpemUgPj4gMikpOworICAgIG9zY2xfbWVtY3B5KGRzdFB0cjIsIG9yZ1B0cjIsIChzaXplID4+IDIpKTsKKworICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47CisgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IElfVk9QOworICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZEZWNTZXRFbmhSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB0aW1lc3RhbXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNy8yMy8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCBZVVYgZW5oYW5jZSByZWZlcmVuY2UgZnJhbWUgZnJvbSBleHRlcm5hbCBzb3VyY2UuICAgICAgICAqLworLyogIEluL291dCAgIDogWVVWIDQtMi0wIGZyYW1lIGNvbnRhaW5pbmcgbmV3IHJlZmVyZW5jZSBmcmFtZSBpbiB0aGUgc2FtZSAgICovCisvKiAgIDogZGltZW5zaW9uIGFzIG9yaWdpbmFsLCBpLmUuLCBkb2Vzbid0IGhhdmUgdG8gYmUgbXVsdGlwbGUgb2YgMTYgISEhLiAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQm9vbCBQVkRlY1NldEVuaFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCB1aW50MzIgdGltZXN0YW1wKQoreworICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7CisgICAgVm9wICpwcmV2RW5oY1ZvcCA9IHZpZGVvLT5wcmV2RW5oY1ZvcDsKKyAgICB1aW50OCAqZHN0UHRyLCAqb3JnUHRyLCAqZHN0UHRyMiwgKm9yZ1B0cjI7CisgICAgaW50MzIgc2l6ZSA9IChpbnQzMikgdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKKworICAgIGlmICh2aWRlby0+bnVtYmVyT2ZMYXllcnMgPD0gMSkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisKKyAgICAvKiBzZXQgbmV3IHBhcmFtZXRlcnMgKi8KKyAgICBwcmV2RW5oY1ZvcC0+dGltZVN0YW1wID0gdGltZXN0YW1wOworICAgIHByZXZFbmhjVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworCisgICAgZHN0UHRyID0gcHJldkVuaGNWb3AtPnlDaGFuOworICAgIG9yZ1B0ciA9IHJlZllVVjsKKyAgICBvc2NsX21lbWNweShkc3RQdHIsIG9yZ1B0ciwgc2l6ZSk7CisgICAgZHN0UHRyID0gcHJldkVuaGNWb3AtPnVDaGFuOworICAgIGRzdFB0cjIgPSBwcmV2RW5oY1ZvcC0+dkNoYW47CisgICAgb3JnUHRyID0gcmVmWVVWICsgc2l6ZTsKKyAgICBvcmdQdHIyID0gb3JnUHRyICsgKHNpemUgPj4gMik7CisgICAgb3NjbF9tZW1jcHkoZHN0UHRyLCBvcmdQdHIsIChzaXplID4+IDIpKTsKKyAgICBvc2NsX21lbWNweShkc3RQdHIyLCBvcmdQdHIyLCAoc2l6ZSA+PiAyKSk7CisgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW47CisgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IElfVk9QOworICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbjsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRWb2xJbmZvKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwOC8wNi8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCB0aGUgdm9sIGluZm8ob25seSBiYXNlLWxheWVyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogMDYvMjQvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0Jvb2wgUFZHZXRWb2xJbmZvKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIFZvbEluZm8gKnBWb2xJbmZvKQoreworICAgIFZvbCAqY3VyclZvbDsKKworICAgIGlmIChwVm9sSW5mbyA9PSBOVUxMIHx8IGRlY0N0cmwgPT0gTlVMTCB8fCBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICgoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSktPnZvbFswXSA9PSBOVUxMKSByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBjdXJyVm9sID0gKChWaWRlb0RlY0RhdGEgKikoZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSkpLT52b2xbMF07CisKKyAgICAvLyBnZXQgdGhlIFZPTCBpbmZvCisgICAgcFZvbEluZm8tPnNob3J0VmlkZW9IZWFkZXIgPSAoaW50MzIpKChWaWRlb0RlY0RhdGEgKikoZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSkpLT5zaG9ydFZpZGVvSGVhZGVyOworICAgIHBWb2xJbmZvLT5kYXRhUGFydGl0aW9uaW5nID0gKGludDMyKWN1cnJWb2wtPmRhdGFQYXJ0aXRpb25pbmc7CisgICAgcFZvbEluZm8tPmVycm9yUmVzRGlzYWJsZSAgPSAoaW50MzIpY3VyclZvbC0+ZXJyb3JSZXNEaXNhYmxlOworICAgIHBWb2xJbmZvLT51c2VSZXZlcnNlVkxDICAgID0gKGludDMyKWN1cnJWb2wtPnVzZVJldmVyc2VWTEM7CisgICAgcFZvbEluZm8tPnNjYWxhYmlsaXR5ICAgICAgPSAoaW50MzIpY3VyclZvbC0+c2NhbGFiaWxpdHk7CisgICAgcFZvbEluZm8tPm5iaXRzVGltZUluY1JlcyAgPSAoaW50MzIpY3VyclZvbC0+bmJpdHNUaW1lSW5jUmVzOworICAgIHBWb2xJbmZvLT5wcm9maWxlX2xldmVsX2lkID0gKGludDMyKWN1cnJWb2wtPnByb2ZpbGVfbGV2ZWxfaWQ7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmcuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmdfdGFiLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3NjYWxpbmdfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvc2NhbGluZ190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9zY2FsaW5nX3RhYi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNfdGFiLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjX3RhYi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZWNvZGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlY29kZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVjb2RlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZXF1YW50LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY19kZXF1YW50LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX2RlcXVhbnQuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfZGVxdWFudC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY190YWIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdmxjX3RhYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZsY190YWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92bGNfdGFiLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZy5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWcuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnX3RhYi5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy96aWd6YWdfdGFiLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvemlnemFnX3RhYi5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ppZ3phZ190YWIuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZGU1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgdGVzdF9zdWl0ZXM6IFsKKyAgICAgICAgImRldmljZS10ZXN0cyIsCisgICAgICAgICJtdHMiLAorICAgIF0sCisKKyAgICAvLyBTdXBwb3J0IG11bHRpbGliIHZhcmlhbnRzICh1c2luZyBkaWZmZXJlbnQgc3VmZml4IHBlciBzdWItYXJjaGl0ZWN0dXJlKSwgd2hpY2ggaXMgbmVlZGVkIG9uCisgICAgLy8gYnVpbGQgdGFyZ2V0cyB3aXRoIHNlY29uZGFyeSBhcmNoaXRlY3R1cmVzLCBhcyB0aGUgTVRTIHRlc3Qgc3VpdGUgcGFja2FnaW5nIGxvZ2ljIGZsYXR0ZW5zCisgICAgLy8gYWxsIHRlc3QgYXJ0aWZhY3RzIGludG8gYSBzaW5nbGUgYHRlc3RjYXNlc2AgZGlyZWN0b3J5LgorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJib3RoIiwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBsaWIzMjogeworICAgICAgICAgICAgc3VmZml4OiAiMzIiLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgc3VmZml4OiAiNjQiLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICAvLyB0aGlzIHVuaXQgdGVzdCBhbHNvIHJ1bnMgd2l0aGluIHRoZSBtYWlubGluZSB0ZXN0cyAoTVRTKSwKKyAgICAvLyBzbyBpdCBtdXN0IGJlIGNvbXBhdGlibGUgYmFjayB0byBBbmRyb2lkIFEvMTAgKHNkayAyOSkKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiYjRkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcGVnNEgyNjMgRGVjb2RlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhcHBlbmQtYml0bmVzcyIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyLTEuMS56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwMzQwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwNyBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19tNHZfaDI2M19lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZSB0aGF0IHRvb2sgdGhlIGFwcHJvYWNoIG9mCisvLyAnYXBwbHkgZXZlcnkgbGljZW5zZSBmb3VuZCB0byBldmVyeSB0YXJnZXQnLiBXaGlsZSB0aGlzIG1ha2VzIHN1cmUgd2UgcmVzcGVjdAorLy8gZXZlcnkgbGljZW5zZSByZXN0cmljdGlvbiwgaXQgbWF5IG5vdCBiZSBlbnRpcmVseSBjb3JyZWN0LgorLy8KKy8vIGUuZy4gR1BMIGluIGFuIE1JVCBwcm9qZWN0IG1pZ2h0IG9ubHkgYXBwbHkgdG8gdGhlIGNvbnRyaWIvIGRpcmVjdG9yeS4KKy8vCisvLyBQbGVhc2UgY29uc2lkZXIgc3BsaXR0aW5nIHRoZSBzaW5nbGUgbGljZW5zZSBiZWxvdyBpbnRvIG11bHRpcGxlIGxpY2Vuc2VzLAorLy8gdGFraW5nIGNhcmUgbm90IHRvIGxvc2UgYW55IGxpY2Vuc2Vfa2luZCBpbmZvcm1hdGlvbiwgYW5kIG92ZXJyaWRpbmcgdGhlCisvLyBkZWZhdWx0IGxpY2Vuc2UgdXNpbmcgdGhlICdsaWNlbnNlczogWy4uLl0nIHByb3BlcnR5IG9uIHRhcmdldHMgYXMgbmVlZGVkLgorLy8KKy8vIEZvciB1bnVzZWQgZmlsZXMsIGNvbnNpZGVyIGNyZWF0aW5nIGEgJ2ZpbGVHcm91cCcgd2l0aCAiLy92aXNpYmlsaXR5OnByaXZhdGUiCisvLyB0byBhdHRhY2ggdGhlIGxpY2Vuc2UgdG8sIGFuZCBpbmNsdWRpbmcgYSBjb21tZW50IHdoZXRoZXIgdGhlIGZpbGVzIG1heSBiZQorLy8gdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LgorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2VuY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvYml0c3RyZWFtX2lvLmNwcCIsCisgICAgICAgICJzcmMvY29tYmluZWRfZW5jb2RlLmNwcCIsICJzcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCIsCisgICAgICAgICJzcmMvZGN0LmNwcCIsCisgICAgICAgICJzcmMvZmluZGhhbGZwZWwuY3BwIiwKKyAgICAgICAgInNyYy9mYXN0Y29kZW1iLmNwcCIsCisgICAgICAgICJzcmMvZmFzdGlkY3QuY3BwIiwKKyAgICAgICAgInNyYy9mYXN0cXVhbnQuY3BwIiwKKyAgICAgICAgInNyYy9tZV91dGlscy5jcHAiLAorICAgICAgICAic3JjL21wNGVuY19hcGkuY3BwIiwKKyAgICAgICAgInNyYy9yYXRlX2NvbnRyb2wuY3BwIiwKKyAgICAgICAgInNyYy9tb3Rpb25fZXN0LmNwcCIsCisgICAgICAgICJzcmMvbW90aW9uX2NvbXAuY3BwIiwKKyAgICAgICAgInNyYy9zYWQuY3BwIiwKKyAgICAgICAgInNyYy9zYWRfaGFsZnBlbC5jcHAiLAorICAgICAgICAic3JjL3ZsY19lbmNvZGUuY3BwIiwKKyAgICAgICAgInNyYy92b3AuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREJYX1JDIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuY190ZXN0IiwKKyAgICBndGVzdDogZmFsc2UsCisKKyAgICBzcmNzOiBbInRlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwIl0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlhfUkMiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTk9USUNFIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL2N2ZWkuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9jdmVpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9jdmVpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9jdmVpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9iaXRzdHJlYW1faW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvYml0c3RyZWFtX2lvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2JpdHN0cmVhbV9pby5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9jb21iaW5lZF9lbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvY29tYmluZWRfZW5jb2RlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvY29tYmluZWRfZW5jb2RlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvY29tYmluZWRfZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGF0YXBhcnRfZW5jb2RlLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RhdGFwYXJ0X2VuY29kZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3QuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2RjdF9pbmxpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZGN0X2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9kY3RfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGNvZGVtYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0Y29kZW1iLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3Rjb2RlbWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdGlkY3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0aWRjdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RpZGN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2Zhc3RxdWFudF9pbmxpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmFzdHF1YW50X2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9mYXN0cXVhbnRfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9maW5kaGFsZnBlbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL200dmVuY19vc2NsLmggYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tNHZlbmNfb3NjbC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tZV91dGlscy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21lX3V0aWxzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbWVfdXRpbHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9jb21wLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbW90aW9uX2VzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGRlZi5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRmYWVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2FwaS5jcHAKQEAgLTAsMCArMSwzMzA1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgorI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgorI2luY2x1ZGUgInJhdGVfY29udHJvbC5oIgorI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAweDdmZmZmZmZmCisjZW5kaWYKKworI2lmbmRlZiBTSVpFX01BWAorI2RlZmluZSBTSVpFX01BWCAoKHNpemVfdCkgLTEpCisjZW5kaWYKKworLyogSW52ZXJzZSBub3JtYWwgemlnemFnICovCitjb25zdCBzdGF0aWMgSW50IHppZ3phZ19pW05DT0VGRl9CTE9DS10gPQoreworICAgIDAsIDEsIDgsIDE2LCA5LCAyLCAzLCAxMCwKKyAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LAorICAgIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKKyAgICAyNywgMjAsIDEzLCA2LCA3LCAxNCwgMjEsIDI4LAorICAgIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgICAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorICAgIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MworfTsKKworLyogSU5UUkEgKi8KK2NvbnN0IHN0YXRpYyBJbnQgbXBlZ19pcW1hdF9kZWZbTkNPRUZGX0JMT0NLXSA9CisgICAgeyAgOCwgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsCisgICAgICAgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI4LAorICAgICAgIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwKKyAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsCisgICAgICAgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LAorICAgICAgIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwKKyAgICAgICAyNSwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsCisgICAgICAgMjcsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsIDQ1CisgICAgfTsKKworLyogSU5URVIgKi8KK2NvbnN0IHN0YXRpYyBJbnQgbXBlZ19ucW1hdF9kZWZbNjRdICA9CisgICAgeyAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCisgICAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgICAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCisgICAgICAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjcsCisgICAgICAyMCwgMjEsIDIyLCAyMywgMjUsIDI2LCAyNywgMjgsCisgICAgICAyMSwgMjIsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMzAsCisgICAgICAyMiwgMjMsIDI0LCAyNiwgMjcsIDI4LCAzMCwgMzEsCisgICAgICAyMywgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMKKyAgICB9OworCisvKiBQcm9maWxlcyBhbmQgbGV2ZWxzICovCisvKiBTaW1wbGUgcHJvZmlsZShsZXZlbCAwLTMpIGFuZCBDb3JlIHByb2ZpbGUgKGxldmVsIDEtMikgKi8KKy8qIHtTUEwwLCBTUEwxLCBTUEwyLCBTUEwzLCBDUEwxLCBDUEwyLCBDUEwyLCBDUEwyfSAsIFNQTDA6IFNpbXBsZSBQcm9maWxlQExldmVsMCwgQ1BMMTogQ29yZSBQcm9maWxlQExldmVsMSwgdGhlIGxhc3QgdHdvIGFyZSByZWR1bmRhbnQgZm9yIGVhc3kgdGFibGUgbWFuaXB1bGF0aW9uICovCitjb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfY29kZVs4XSA9Cit7CisgICAgMHgwOCwgMHgwMSwgMHgwMiwgMHgwMywgMHgyMSwgMHgyMiwgMHgyMiwgMHgyMgorfTsKKworY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzhdID0KK3sKKyAgICA2NDAwMCwgNjQwMDAsIDEyODAwMCwgMzg0MDAwLCAzODQwMDAsIDIwMDAwMDAsIDIwMDAwMDAsIDIwMDAwMDAKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbOF0gPQoreworICAgIDIwNDgsIDIwNDgsIDQwOTYsIDgxOTIsIDQwOTYsIDgxOTIsIDgxOTIsIDgxOTIKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjWzhdID0KK3sKKyAgICAxNDg1LCAxNDg1LCA1OTQwLCAxMTg4MCwgNTk0MCwgMjM3NjAsIDIzNzYwLCAyMzc2MAorfTsKKworY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs4XSA9Cit7CisgICAgMTYzODQwLCAxNjM4NDAsIDY1NTM2MCwgNjU1MzYwLCAyNjIxNDQsIDEzMTA3MjAsIDEzMTA3MjAsIDEzMTA3MjAKK307CisKKworLyogU2ltcGxlIHNjYWxhYmxlIHByb2ZpbGUgKGxldmVsIDAtMikgYW5kIENvcmUgc2NhbGFibGUgcHJvZmlsZSAobGV2ZWwgMS0zKSAqLworLyoge1NTUEwwLCBTU1BMMSwgU1NQTDIsIFNTUEwyLCBDU1BMMSwgQ1NQTDIsIENTUEwzLCBDU1BMM30gLCBTU1BMMDogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGVATGV2ZWwwLCBDU1BMMTogQ29yZSBTY2FsYWJsZSBQcm9maWxlQExldmVsMSwgdGhlIGZvdXJ0aCBpcyByZWR1bmRhbnQgZm9yIGVhc3kgdGFibGUgbWFuaXB1bGF0aW9uICovCisKK2NvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlWzhdID0KK3sKKyAgICAweDEwLCAweDExLCAweDEyLCAweDEyLCAweEExLCAweEEyLCAweEEzLCAweEEzCit9OworCitjb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbOF0gPQoreworICAgIDEyODAwMCwgMTI4MDAwLCAyNTYwMDAsIDI1NjAwMCwgNzY4MDAwLCAxNTAwMDAwLCA0MDAwMDAwLCA0MDAwMDAwCit9OworCisvKiBpbiBiaXRzICovCitjb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplWzhdID0KK3sKKyAgICAyMDQ4LCAyMDQ4LCA0MDk2LCA0MDk2LCA0MDk2LCA0MDk2LCAxNjM4NCwgMTYzODQKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjWzhdID0KK3sKKyAgICAxNDg1LCA3NDI1LCAyMzc2MCwgMjM3NjAsIDE0ODUwLCAyOTcwMCwgMTIwOTYwLCAxMjA5NjAKK307CisKK2NvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbOF0gPQoreworICAgIDE2Mzg0MCwgNjU1MzYwLCA2NTUzNjAsIDY1NTM2MCwgMTA0ODU3NiwgMTMxMDcyMCwgMTMxMDcyMCwgMTMxMDcyMAorfTsKKworCisvKiBIMjYzIHByb2ZpbGUgMCBAIGxldmVsIDEwLTcwICovCitjb25zdCBzdGF0aWMgSW50ICAgaDI2M0xldmVsWzhdID0gezAsIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwfTsKK2NvbnN0IHN0YXRpYyBmbG9hdCByQlJfYm91bmRbOF0gPSB7MCwgMSwgMiwgNiwgMzIsIDY0LCAxMjgsIDI1Nn07Citjb25zdCBzdGF0aWMgZmxvYXQgbWF4X2gyNjNfZnJhbWVyYXRlWzJdID0geyhmbG9hdCkzMDAwMCAvIChmbG9hdCkyMDAyLAorICAgICAgICAoZmxvYXQpMzAwMDAgLyAoZmxvYXQpMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBzdGF0aWMgSW50ICAgbWF4X2gyNjNfd2lkdGhbMl0gID0gezE3NiwgMzUyfTsKK2NvbnN0IHN0YXRpYyBJbnQgICBtYXhfaDI2M19oZWlnaHRbMl0gPSB7MTQ0LCAyODh9OworCisvKiA2LzIvMjAwMSwgbmV3bHkgYWRkZWQgZnVuY3Rpb25zIHRvIG1ha2UgUFZFbmNvZGVWb3AgbW9yZSByZWFkYWJsZS4gKi8KK0ludCBEZXRlcm1pbmVDb2RpbmdMYXllcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgKm5MYXllciwgVUxvbmcgbW9kVGltZSk7Cit2b2lkIERldGVybWluZVZvcFR5cGUoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllcik7CitJbnQgVXBkYXRlU2tpcE5leHRGcmFtZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBVTG9uZyAqbW9kVGltZSwgSW50ICpzaXplLCBQVl9TVEFUVVMgc3RhdHVzKTsKK0Jvb2wgU2V0UHJvZmlsZV9CdWZmZXJTaXplKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGZsb2F0IGRlbGF5LCBJbnQgYkluaXRpYWxpemVkKTsKKworI2lmZGVmIFBSSU5UX1JDX0lORk8KK2V4dGVybiBGSUxFICpmYWNjdDsKK2V4dGVybiBpbnQgdGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQ7CitleHRlcm4gaW50IGlTdHVmZkJpdHM7CisjZW5kaWYKKworI2lmZGVmIFBSSU5UX0VDCitleHRlcm4gRklMRSAqZmVjOworI2VuZGlmCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldERlZmF1bHRFbmNPcHRpb24oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEyLzEyLzIwMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldERlZmF1bHRFbmNPcHRpb24oVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24sIEludCBlbmNVc2VDYXNlKQoreworICAgIFZpZGVvRW5jT3B0aW9ucyBkZWZhdWx0VXNlQ2FzZSA9IHtIMjYzX01PREUsIHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW1NJTVBMRV9QUk9GSUxFX0xFVkVMMF0gPj4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNUExFX1BST0ZJTEVfTEVWRUwwLCBQVl9PRkYsIDAsIDEsIDEwMDAsIDMzLCB7MTQ0LCAxNDR9LCB7MTc2LCAxNzZ9LCB7MTUsIDMwfSwgezY0MDAwLCAxMjgwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsIDEwfSwgezEyLCAxMn0sIHswLCAwfSwgQ0JSXzEsIDAuMCwgUFZfT0ZGLCAtMSwgMCwgUFZfT0ZGLCAxNiwgUFZfT0ZGLCAwLCBQVl9PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoZW5jVXNlQ2FzZSk7IC8vIHVudXNlZCBmb3Igbm93LiBMYXRlciB3ZSBjYW4gYWRkIG1vcmUgZGVmYXVsdHMgc2V0dGluZyBhbmQgdXNlIHRoaXMKKyAgICAvLyBhcmd1bWVudCB0byBzZWxlY3QgdGhlIHJpZ2h0IG9uZS4KKyAgICAvKiBpbiB0aGUgZnV0dXJlIHdlIGNhbiBjcmVhdGUgbW9yZSBtZWFuaW5nZnVsIHVzZS1jYXNlcyAqLworICAgIGlmIChlbmNPcHRpb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICB9CisKKyAgICBNNFZFTkNfTUVNQ1BZKGVuY09wdGlvbiwgJmRlZmF1bHRVc2VDYXNlLCBzaXplb2YoVmlkZW9FbmNPcHRpb25zKSk7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkluaXRWaWRlb0VuY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogSW5pdGlhbGl6YXRpb24gb2YgTVA0IEVuY29kZXIgYW5kIFZPIGJpdHN0cmVhbSAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogIDUvMjEvMDEsIGFsbG9jYXRlIG9ubHkgeUNoYW4gYW5kIGFzc2lnbiB1Q2hhbiAmIHZDaGFuICAgKi8KKy8qICAgICAgICAgICAgICAxMi8xMi8wNSwgYWRkIGVuY29kaW5nIG9wdGlvbiBhcyBpbnB1dCBhcmd1bWVudCAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sICAgIFBWSW5pdFZpZGVvRW5jb2RlcihWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCwgVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24pCit7CisKKyAgICBCb29sICAgICAgICBzdGF0dXMgPSBQVl9UUlVFOworICAgIEludCAgICAgICAgIG5MYXllcnMsIGlkeCwgaSwgajsKKyAgICBJbnQgICAgICAgICBtYXggPSAwLCBtYXhfd2lkdGggPSAwLCBtYXhfaGVpZ2h0ID0gMCwgcGl0Y2gsIG9mZnNldDsKKyAgICBJbnQgICAgICAgICBzaXplID0gMCwgblRvdGFsTUIgPSAwOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW87CisgICAgVm9sICAgICAgICAgKnBWb2w7CisgICAgVmlkZW9FbmNQYXJhbXMgICpwRW5jUGFyYW1zOworICAgIEludCAgICAgICAgIHRlbXBfdywgdGVtcF9oLCBtYnNQZXJTZWM7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgdGhpcyBwYXJ0IHVzZSB0byBiZSBQVlNldEVuY29kZSgpICovCisgICAgSW50IHByb2ZpbGVfdGFibGVfaW5kZXgsICpwcm9maWxlX2xldmVsX3RhYmxlOworICAgIEludCBwcm9maWxlX2xldmVsID0gZW5jT3B0aW9uLT5wcm9maWxlX2xldmVsOworICAgIEludCBQYWNrZXRTaXplID0gZW5jT3B0aW9uLT5wYWNrZXRTaXplIDw8IDM7CisgICAgSW50IHRpbWVJbmMsIHRpbWVJbmNSZXM7CisgICAgZmxvYXQgcHJvZmlsZV9tYXhfZnJhbWVyYXRlOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXM7CisKKyAgICBpZiAoZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEpIC8qIHRoaXMgaGFzIGJlZW4gY2FsbGVkICovCisgICAgeworICAgICAgICBpZiAoZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQpIC8qIGNoZWNrIGlmIFBWSW5pdFZpZGVvRW5jb2RlcigpIGhhcyBiZWVuIGNhbGxlZCAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKGVuY29kZXJDb250cm9sKTsKKyAgICAgICAgICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIE00VkVOQ19GUkVFKGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhKTsKKyAgICAgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEgPSBOVUxMOworICAgIH0KKyAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDA7ICAgLyogcmVzZXQgdGhpcyB2YWx1ZSAqLworCisgICAgdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopTTRWRU5DX01BTExPQyhzaXplb2YoVmlkZW9FbmNEYXRhKSk7IC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jRGF0YSAqLworCisgICAgaWYgKHZpZGVvID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIE00VkVOQ19NRU1TRVQodmlkZW8sIDAsIHNpemVvZihWaWRlb0VuY0RhdGEpKTsKKworICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhID0gKHZvaWQgKikgdmlkZW87ICAgICAgICAgLyogc2V0IHVwIHBvaW50ZXIgaW4gVmlkZW9FbmNEYXRhIHN0cnVjdHVyZSAqLworCisgICAgdmlkZW8tPmVuY1BhcmFtcyA9IChWaWRlb0VuY1BhcmFtcyAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFZpZGVvRW5jUGFyYW1zKSk7CisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBDTEVBTl9VUDsKKworICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPmVuY1BhcmFtcywgMCwgc2l6ZW9mKFZpZGVvRW5jUGFyYW1zKSk7CisKKyAgICBlbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IGVuY09wdGlvbi0+bnVtTGF5ZXJzOworCisgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgaW5wdXQgcGFja2V0c2l6ZSBpcyB2YWxpZCAoTm90ZTogcHV0IGNvZGUgaGVyZSAoYmVmb3JlIGFueSBtZW1vcnkgYWxsb2NhdGlvbikgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWsgKi8KKyAgICBpZiAoKEludClwcm9maWxlX2xldmVsIDwgKEludCkoU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwwKSkgIC8qIG5vbi1zY2FsYWJsZSBwcm9maWxlICovCisgICAgeworICAgICAgICBwcm9maWxlX2xldmVsX3RhYmxlID0gKEludCAqKXByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplOworICAgICAgICBwcm9maWxlX3RhYmxlX2luZGV4ID0gKEludClwcm9maWxlX2xldmVsOworICAgICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzICE9IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKworICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW3Byb2ZpbGVfdGFibGVfaW5kZXhdOworCisgICAgfQorICAgIGVsc2UgICAvKiBzY2FsYWJsZSBwcm9maWxlICovCisgICAgeworICAgICAgICBwcm9maWxlX2xldmVsX3RhYmxlID0gKEludCAqKXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplOworICAgICAgICBwcm9maWxlX3RhYmxlX2luZGV4ID0gKEludClwcm9maWxlX2xldmVsIC0gKEludCkoU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwwKTsKKyAgICAgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2ldID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW3Byb2ZpbGVfdGFibGVfaW5kZXhdOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBjYW5ub3QgaGF2ZSB6ZXJvIHNpemUgcGFja2V0IHdpdGggdGhlc2UgbW9kZXMgKi8KKyAgICBpZiAoUGFja2V0U2l6ZSA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBEQVRBX1BBUlRJVElPTklOR19NT0RFKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY01vZGUgPT0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUykKKyAgICAgICAgeworICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNNb2RlID0gQ09NQklORV9NT0RFX05PX0VSUl9SRVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW5jT3B0aW9uLT5nb2JIZWFkZXJJbnRlcnZhbCA9PSAwKQorICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBIMjYzX01PREVfV0lUSF9FUlJfUkVTKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNPcHRpb24tPmVuY01vZGUgPSBIMjYzX01PREU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNNb2RlID09IFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jTW9kZSA9IFNIT1JUX0hFQURFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQYWNrZXRTaXplID4gcHJvZmlsZV9sZXZlbF90YWJsZVtwcm9maWxlX3RhYmxlX2luZGV4XSkKKyAgICAgICAgZ290byBDTEVBTl9VUDsKKworICAgIC8qIEluaXRpYWwgRGVmYXVsdHMgZm9yIGFsbCBNb2RlcyAqLworCisgICAgZW5jUGFyYW1zLT5TZXF1ZW5jZVN0YXJ0Q29kZSA9IDE7CisgICAgZW5jUGFyYW1zLT5HT1ZfRW5hYmxlZCA9IDA7CisgICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOworICAgIGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociA9IFBWX01BWChQVl9NSU4oZW5jT3B0aW9uLT5pbnRyYURDVmxjVGgsIDcpLCAwKTsKKyAgICBlbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uID0gKChlbmNPcHRpb24tPnVzZUFDUHJlZCA9PSBQVl9PTikgPyBUUlVFIDogRkFMU0UpOworICAgIGVuY1BhcmFtcy0+UkNfVHlwZSA9IGVuY09wdGlvbi0+cmNUeXBlOworICAgIGVuY1BhcmFtcy0+UmVmcmVzaCA9IGVuY09wdGlvbi0+bnVtSW50cmFNQjsKKyAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBFbmFibGUgUmVzeW5jIE1hcmtlciAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGVuY09wdGlvbi0+bnVtTGF5ZXJzOyBpKyspCisgICAgeworI2lmZGVmIE5PX01QRUdfUVVBTlQKKyAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbaV0gPSAwOworI2Vsc2UKKyAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbaV0gPSBlbmNPcHRpb24tPnF1YW50VHlwZVtpXTsgICAgICAvKiBIMjYzICovCisjZW5kaWYKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+cFF1YW50W2ldID49IDEgJiYgZW5jT3B0aW9uLT5wUXVhbnRbaV0gPD0gMzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtpXSA9IGVuY09wdGlvbi0+cFF1YW50W2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jT3B0aW9uLT5pUXVhbnRbaV0gPj0gMSAmJiBlbmNPcHRpb24tPmlRdWFudFtpXSA8PSAzMSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW1zLT5Jbml0UXVhbnRJdm9wW2ldID0gZW5jT3B0aW9uLT5pUXVhbnRbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jUGFyYW1zLT5IYWxmUGVsX0VuYWJsZWQgPSAxOworICAgIGVuY1BhcmFtcy0+U2VhcmNoUmFuZ2UgPSBlbmNPcHRpb24tPnNlYXJjaFJhbmdlOyAvKiA0LzE2LzIwMDEgKi8KKyAgICBlbmNQYXJhbXMtPkZ1bGxTZWFyY2hfRW5hYmxlZCA9IDA7CisjaWZkZWYgTk9fSU5URVI0VgorICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7CisjZWxzZQorICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7Ly8gY29tbWVudCBvdXQgZm9yIG5vdyEhIGVuY09wdGlvbi0+bXY4eDhFbmFibGU7CisjZW5kaWYKKyAgICBlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA9IDA7CisgICAgZW5jUGFyYW1zLT5HT0JfSGVhZGVyX0ludGVydmFsID0gMDsgLy8gbmVlZCB0byBiZSByZXNldCB0byAwCisgICAgZW5jUGFyYW1zLT5JbnRyYVBlcmlvZCA9IGVuY09wdGlvbi0+aW50cmFQZXJpb2Q7ICAgIC8qIEludHJhIHVwZGF0ZSBwZXJpb2QgdXBkYXRlIGRlZmF1bHQqLworICAgIGVuY1BhcmFtcy0+U2NlbmVDaGFuZ2VfRGV0ID0gZW5jT3B0aW9uLT5zY2VuZURldGVjdDsKKyAgICBlbmNQYXJhbXMtPkZpbmVGcmFtZVNraXBfRW5hYmxlZCA9IDA7CisgICAgZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID0gZW5jT3B0aW9uLT5ub0ZyYW1lU2tpcHBlZDsKKyAgICBlbmNQYXJhbXMtPk5vUHJlU2tpcF9FbmFibGVkID0gZW5jT3B0aW9uLT5ub0ZyYW1lU2tpcHBlZDsKKyAgICBlbmNQYXJhbXMtPkdldFZvbEhlYWRlclswXSA9IDA7CisgICAgZW5jUGFyYW1zLT5HZXRWb2xIZWFkZXJbMV0gPSAwOworICAgIGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSA9IGVuY09wdGlvbi0+cGFja2V0U2l6ZSA8PCAzOworICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gMDsKKyAgICBlbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9IDA7CisgICAgZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IChmbG9hdCkwLjA7CisgICAgZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IChmbG9hdCkwLjA7CisgICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSBlbmNPcHRpb24tPnZidkRlbGF5OyAgLyogMnNlYyBWQlYgYnVmZmVyIHNpemUgKi8KKworICAgIHN3aXRjaCAoZW5jT3B0aW9uLT5lbmNNb2RlKQorICAgIHsKKworICAgICAgICBjYXNlIFNIT1JUX0hFQURFUjoKKyAgICAgICAgY2FzZSBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTOgorCisgICAgICAgICAgICAvKiBGcm9tIFRhYmxlIDYtMjYgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IDE7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVswXSA9IDA7ICAgIC8qSDI2MyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAvKiBDb21iaW5lZCBNb2RlICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgIC8qIERpc2FibGUgUlZMQyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOworICAgICAgICAgICAgZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyID0gNzsgICAvKiB1c2VfaW50cmFfZGNfdmxjID0gMCAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsKKworICAgICAgICAgICAgZW5jUGFyYW1zLT5HT0JfSGVhZGVyX0ludGVydmFsID0gZW5jT3B0aW9uLT5nb2JIZWFkZXJJbnRlcnZhbDsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+SDI2M19FbmFibGVkID0gMjsKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+R09WX0VuYWJsZWQgPSAwOworICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gMzAwMDA7ICAgICAgICAvKiB0aW1lSW5jcmVtZW50UmVzIGZvciBIMjYzICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEgyNjNfTU9ERToKKyAgICAgICAgY2FzZSBIMjYzX01PREVfV0lUSF9FUlJfUkVTOgorCisgICAgICAgICAgICAvKiBGcm9tIFRhYmxlIDYtMjYgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IDE7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVswXSA9IDA7ICAgIC8qSDI2MyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAvKiBDb21iaW5lZCBNb2RlICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgIC8qIERpc2FibGUgUlZMQyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOworICAgICAgICAgICAgZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyID0gNzsgICAvKiB1c2VfaW50cmFfZGNfdmxjID0gMCAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsKKworICAgICAgICAgICAgZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgPSAxOworICAgICAgICAgICAgZW5jUGFyYW1zLT5HT1ZfRW5hYmxlZCA9IDA7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSAzMDAwMDsgICAgICAgIC8qIHRpbWVJbmNyZW1lbnRSZXMgZm9yIEgyNjMgKi8KKworICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIEgyNjNfT05MWQorICAgICAgICBjYXNlIERBVEFfUEFSVElUSU9OSU5HX01PREU6CisKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDE7ICAgICAgICAvKiBCYXNlIExheWVyIERhdGEgUGFydGl0aW9uaW5nICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBSZXN5bmMgTWFya2VyICovCisjaWZkZWYgTk9fUlZMQworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsKKyNlbHNlCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAoZW5jT3B0aW9uLT5ydmxjRW5hYmxlID09IFBWX09OKTsgLyogUlZMQyB3aGVuIERhdGEgUGFydGl0aW9uaW5nICovCisjZW5kaWYKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSA9IFBhY2tldFNpemU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM6CisKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7ICAgICAgICAvKiBDb21iaW5lZCBNb2RlICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBSZXN5bmMgTWFya2VyICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgICAgICAgICAgLyogTm8gUlZMQyAqLworICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplID0gUGFja2V0U2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09NQklORV9NT0RFX05PX0VSUl9SRVM6CisKKyAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7ICAgICAgICAvKiBDb21iaW5lZCBNb2RlICovCisgICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAxOyAvKiBEaXNhYmxlIFJlc3luYyBNYXJrZXIgKi8KKyAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7ICAgICAgICAgICAvKiBObyBSVkxDICovCisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICB9CisgICAgLyogU2V0IHRoZSBjb25zdHJhaW50cyAobWF4aW11bSB2YWx1ZXMpIGFjY29yZGluZyB0byB0aGUgaW5wdXQgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKyAgICAvKiBOb3RlIHRoYXQgcHJvZmlsZV90YWJsZV9pbmRleCBpcyBhbHJlYWR5IGZpZ3VyZWQgb3V0IGFib3ZlICovCisKKyAgICAvKiBiYXNlIGxheWVyICovCisgICAgZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4ICAgID0gcHJvZmlsZV90YWJsZV9pbmRleDsgLyogVXNlZCB0byBsaW1pdCB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW4gU2V0UHJvZmlsZV9CdWZmZXJTaXplKCkgKi8KKworICAgIC8qIGNoZWNrIHRpbWVJbmNSZXMgKi8KKyAgICB0aW1lSW5jUmVzID0gZW5jT3B0aW9uLT50aW1lSW5jUmVzOworICAgIHRpbWVJbmMgPSBlbmNPcHRpb24tPnRpY2tQZXJTcmM7CisKKyAgICBpZiAoKHRpbWVJbmNSZXMgPj0gMSkgJiYgKHRpbWVJbmNSZXMgPD0gNjU1MzYpICYmICh0aW1lSW5jIDwgdGltZUluY1JlcykgJiYgKHRpbWVJbmMgIT0gMCkpCisgICAgeworICAgICAgICBpZiAoIWVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSB0aW1lSW5jUmVzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gMzAwMDA7CisvLyAgICAgICAgICB2aWRlby0+RnJhbWVSYXRlID0gMzAwMDAvKGZsb2F0KTEwMDE7IC8qIGZpeCBpdCB0byAyOS45NyBmcHMgKi8KKyAgICAgICAgfQorICAgICAgICB2aWRlby0+RnJhbWVSYXRlID0gdGltZUluY1JlcyAvICgoZmxvYXQpdGltZUluYyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorCisgICAgLyogY2hlY2sgZnJhbWUgZGltZW5zaW9uICovCisgICAgaWYgKGVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChlbmNPcHRpb24tPmVuY1dpZHRoWzBdKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gOTYpIC8qIHNvdXJjZV9mb3JtYXQgPSAxICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3NjoKKyAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gMTQ0KSAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNTI6CisgICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDI4OCkgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSA3MDQ6CisgICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDU3NikgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQwODoKKyAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gMTE1MikgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFtpXSA9PSAwIHx8IGVuY09wdGlvbi0+ZW5jV2lkdGhbaV0gPT0gMCB8fAorICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jSGVpZ2h0W2ldICUgMTYgIT0gMCB8fCBlbmNPcHRpb24tPmVuY1dpZHRoW2ldICUgMTYgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0gPSBlbmNPcHRpb24tPmVuY0hlaWdodFtpXTsKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllcldpZHRoW2ldID0gZW5jT3B0aW9uLT5lbmNXaWR0aFtpXTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmcmFtZSByYXRlICovCisgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQorICAgIHsKKyAgICAgICAgZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSA9IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldOworICAgIH0KKworICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgPiAxKQorICAgIHsKKyAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdIHx8CisgICAgICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMF0gPT0gMC4gfHwgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMV0gPT0gMC4pIC8qIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIC8qIHNldCBtYXggZnJhbWUgcmF0ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBtYXhpbXVtIGZyYW1lcmF0ZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgICAgIG5Ub3RhbE1CID0gKChlbmNQYXJhbXMtPkxheWVyV2lkdGhbaV0gKyAxNSkgLyAxNikgKiAoKGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0gKyAxNSkgLyAxNik7CisKKyAgICAgICAgaWYgKG5Ub3RhbE1CID4gMCkKKyAgICAgICAgICAgIHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZSA9IChmbG9hdCllbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2ldIC8gKGZsb2F0KW5Ub3RhbE1COworCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZSA9IChmbG9hdCkzMC4wOworCisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbaV0gPSBQVl9NSU4ocHJvZmlsZV9tYXhfZnJhbWVyYXRlLCBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBiaXQgcmF0ZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlW2ldID0gZW5jT3B0aW9uLT5iaXRSYXRlW2ldOworICAgIH0KKyAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzID4gMSkKKyAgICB7CisgICAgICAgIGlmIChlbmNPcHRpb24tPmJpdFJhdGVbMF0gPT0gZW5jT3B0aW9uLT5iaXRSYXRlWzFdIHx8CisgICAgICAgICAgICAgICAgZW5jT3B0aW9uLT5iaXRSYXRlWzBdID09IDAgfHwgZW5jT3B0aW9uLT5iaXRSYXRlWzFdID09IDApIC8qIDcvMzEvMDMgKi8KKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIC8qIGNoZWNrIHJhdGUgY29udHJvbCBhbmQgdmJ2IGRlbGF5Ki8KKyAgICBlbmNQYXJhbXMtPlJDX1R5cGUgPSBlbmNPcHRpb24tPnJjVHlwZTsKKworICAgIGlmIChlbmNPcHRpb24tPnZidkRlbGF5ID09IDAuMCkgLyogc2V0IHRvIGRlZmF1bHQgKi8KKyAgICB7CisgICAgICAgIHN3aXRjaCAoZW5jT3B0aW9uLT5yY1R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQ0JSXzE6CisgICAgICAgICAgICBjYXNlIENCUl8yOgorICAgICAgICAgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gKGZsb2F0KTIuMDsgLyogZGVmYXVsdCAyc2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENCUl9MT1dERUxBWToKKyAgICAgICAgICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IChmbG9hdCkwLjU7IC8qIGRlZmF1bHQgMC41c2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFZCUl8xOgorICAgICAgICAgICAgY2FzZSBWQlJfMjoKKyAgICAgICAgICAgICAgICBlbmNQYXJhbXMtPlZCVl9kZWxheSA9IChmbG9hdCkxMC4wOyAvKiBkZWZhdWx0IDEwc2VjIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8qIGZvcmNlIHRoaXMgdmFsdWUgKi8KKyAgICB7CisgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gZW5jT3B0aW9uLT52YnZEZWxheTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBzZWFyY2ggcmFuZ2UgKi8KKyAgICBpZiAoZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgZW5jT3B0aW9uLT5zZWFyY2hSYW5nZSA+IDE2KQorICAgIHsKKyAgICAgICAgZW5jUGFyYW1zLT5TZWFyY2hSYW5nZSA9IDE2OyAvKiA0LzE2LzIwMDEgKi8KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogY2hlY2tpbmcgZm9yIGNvbmZsaWN0IGJldHdlZW4gb3B0aW9ucyAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl8xIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSXzIgfHwgdmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfTE9XREVMQVkpICAvKiBpZiBDQlIgKi8KKyAgICB7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQgPT0gUFZfT04gfHwKKyAgICAgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Ob1ByZVNraXBfRW5hYmxlZCA9PSBQVl9PTikgLyogZG9uJ3QgYWxsb3cgZnJhbWUgc2tpcCovCisgICAgICAgICAgICBwcmludGYoIldBUk5JTkchISEhIENCUiB3aXRoIE5vRnJhbWVTa2lwXG4iKTsKKyNlbmRpZgorICAgIH0KKyAgICBlbHNlIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EpICAgLyogY29uc3RhbnRfUSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+Tm9GcmFtZVNraXBfRW5hYmxlZCA9IFBWX09OOyAgLyogbm8gZnJhbWUgc2tpcCAqLworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Ob1ByZVNraXBfRW5hYmxlZCA9IFBWX09OOyAgICAvKiBubyBmcmFtZSBza2lwICovCisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgcHJpbnRmKCJUdXJuIG9uIE5vRnJhbWVTa2lwXG4iKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID09IFBWX09OKSAvKiBpZiBubyBmcmFtZSBza2lwICovCisgICAgeworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5GaW5lRnJhbWVTa2lwX0VuYWJsZWQgPSBQVl9PRkY7CisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICAgICAgcHJpbnRmKCJOb0ZyYW1lU2tpcCAhISEgbWF5IHZpb2xhdGUgVkJWX0JVRkZFUiBjb25zdHJhaW50LlxuIik7CisgICAgICAgIHByaW50ZigiVHVybiBvZmYgRmluZUZyYW1lU2tpcFxuIik7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBuTGF5ZXJzID0gdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgLyogTnVtYmVyIG9mIExheWVycyB0byBiZSBlbmNvZGVkICovCisKKyAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIHdpZHRoKmhlaWdodCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhlIFZPUHMgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQorICAgIHsKKyAgICAgICAgdGVtcF93ID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpZHhdOworICAgICAgICB0ZW1wX2ggPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOworCisgICAgICAgIGlmICgodGVtcF93KnRlbXBfaCkgPiBtYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heCA9IHRlbXBfdyAqIHRlbXBfaDsKKyAgICAgICAgICAgIG1heF93aWR0aCA9ICgodGVtcF93ICsgMTUpID4+IDQpIDw8IDQ7CisgICAgICAgICAgICBtYXhfaGVpZ2h0ID0gKCh0ZW1wX2ggKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KW1heF93aWR0aCAqIG1heF9oZWlnaHQpID4gKHVpbnQ2NF90KUlOVDMyX01BWAorICAgICAgICAgICAgICAgICAgICB8fCB0ZW1wX3cgPiBJTlQzMl9NQVggLSAxNSB8fCB0ZW1wX2ggPiBJTlQzMl9NQVggLSAxNSkgeworICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuVG90YWxNQiA9ICgobWF4X3dpZHRoICogbWF4X2hlaWdodCkgPj4gOCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgdmlkZW8gc2l6ZSBhbmQgZnJhbWVyYXRlKE1Cc1BlclNlYykgYXJlIHZhbGQgKi8KKyAgICAgICAgbWJzUGVyU2VjID0gKEludCkoblRvdGFsTUIgKiB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpZHhdKTsKKyAgICAgICAgaWYgKG1ic1BlclNlYyA+IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2lkeF0pIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFNldCBQcm9maWxlIGFuZCBWaWRlbyBCdWZmZXIgU2l6ZSBmb3IgZWFjaCBsYXllciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkgdmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gMC41OyAvKiBGb3IgQ0JSX0xPV0RFTEFZLCB3ZSBzZXQgMC41c2VjIGJ1ZmZlciAqLworICAgIHN0YXR1cyA9IFNldFByb2ZpbGVfQnVmZmVyU2l6ZSh2aWRlbywgdmlkZW8tPmVuY1BhcmFtcy0+VkJWX2RlbGF5LCAxKTsKKyAgICBpZiAoc3RhdHVzICE9IFBWX1RSVUUpCisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICh2aWRlbyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgLyogY3ljbGljIHJlZmVyZW5jZSBmb3IgcGFzc2luZyB0aHJvdWdoIGJvdGggc3RydWN0dXJlcyAqLworICAgIHZpZGVvLT52aWRlb0VuY0NvbnRyb2xzID0gZW5jb2RlckNvbnRyb2w7CisKKyAgICAvL3ZpZGVvLT5jdXJyTGF5ZXIgPSAwOyAvKiBTZXQgY3VycmVudCBMYXllciB0byAwICovCisgICAgLy92aWRlby0+Y3VyckZyYW1lTm8gPSAwOyAvKiBTZXQgY3VycmVudCBmcmFtZSBOdW1iZXIgdG8gMCAqLworICAgIHZpZGVvLT5uZXh0TW9kVGltZSA9IDA7CisgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMDsgLyogU2V0cyB1cCB2ZXJ5IGZpcnN0IGZyYW1lIHRvIGJlIEktVk9QISAqLworICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOyAvKiBjb3VudGVyIGZvciBWb3BzIGluIEdvcCwgMi84LzAxICovCisKKyAgICAvL3ZpZGVvLT5mcmFtZVJhdGUgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsgLyogU2V0IGN1cnJlbnQgbGF5ZXIgZnJhbWUgcmF0ZSAqLworCisgICAgdmlkZW8tPlFQTUIgPSAoVUNoYXIgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZihVQ2hhcikpOyAvKiBNZW1vcnkgZm9yIE1CIHF1YW50aXplcnMgKi8KKyAgICBpZiAodmlkZW8tPlFQTUIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworCisgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBuVG90YWxNQik7IC8qIE1lbW9yeSBmb3IgTUIgTW9kZXMgKi8KKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiBuVG90YWxNQik7ICAgLyogTWVtb3J5IGZvciBDQlAgKFkgYW5kIEMpIG9mIGVhY2ggTUIgKi8KKyAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBBbGxvY2F0aW5nIG1vdGlvbiB2ZWN0b3Igc3BhY2UgYW5kIGludGVycG9sYXRpb24gbWVtb3J5Ki8KKworICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoTU9UICopKSB7CisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIHZpZGVvLT5tb3QgPSAoTU9UICoqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKE1PVCAqKSAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPm1vdCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuVG90YWxNQjsgaWR4KyspCisgICAgeworICAgICAgICB2aWRlby0+bW90W2lkeF0gPSAoTU9UICopTTRWRU5DX01BTExPQyhzaXplb2YoTU9UKSAqIDgpOworICAgICAgICBpZiAodmlkZW8tPm1vdFtpZHhdID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+aW50cmFBcnJheSA9IChVQ2hhciAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsKKyAgICBpZiAodmlkZW8tPmludHJhQXJyYXkgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIHZpZGVvLT5zbGljZU5vID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0MoblRvdGFsTUIpOyAvKiBNZW1vcnkgZm9yIFNsaWNlIE51bWJlcnMgKi8KKyAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAvKiBBbGxvY2F0aW5nIHNwYWNlIGZvciBwcmVkRENBQ1tdWzhdWzE2XSwgTm90IHRoYXQgSSBpbnRlbnRpb25hbGx5ICAqLworICAgIC8qICAgIGluY3JlYXNlIHRoZSBkaW1lbnNpb24gb2YgcHJlZERDQUMgZnJvbSBbXVs2XVsxNV0gdG8gW11bOF1bMTZdICovCisgICAgLyogICAgc28gdGhhdCBjb21waWxlcnMgY2FuIGdlbmVyYXRlIGZhc3RlciBjb2RlIHRvIGluZGV4aW5nIHRoZSAgICAgKi8KKyAgICAvKiAgICBkYXRhIGluc2lkZSAoYnkgdXNpbmcgPDwgaW5zdGVhZCBvZiAqKS4gICAgICAgICAwNC8xNC8yMDAwLiAqLworICAgIC8qIDUvMjkvMDEsIHVzZSAgZGVjb2RlciBsaWIgQUNEQyBwcmVkaWN0aW9uIG1lbW9yeSBzY2hlbWUuICAqLworICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YodHlwZURDU3RvcmUpKSB7CisgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgfQorICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOworICAgIGlmICh2aWRlby0+cHJlZERDID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICBpZiAoIXZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICB7CisgICAgICAgIGlmICgoc2l6ZV90KSgobWF4X3dpZHRoID4+IDQpICsgMSkgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENBQ1N0b3JlKSkgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgTTRWRU5DX01BTExPQygoKG1heF93aWR0aCA+PiA0KSArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgICAgICAvKiBlbGVtZW50IHplcm8gd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2FsIChjb2wpIEFDIGNvZWZmaWNpZW50cyAqLworICAgICAgICAvKiAgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIGZvciBzdG9yaW5nIGhvcml6b250YWwgKHJvdykgQUMgY29lZmZpY2llbnRzICAqLworICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX2NvbCArIDE7ICAgICAgICAvKiAgQUNEQyAqLworCisgICAgICAgIGlmICgoc2l6ZV90KW5Ub3RhbE1CID4gU0laRV9NQVggLyBzaXplb2YoSW50KSkgeworICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+YWNQcmVkRmxhZyA9IChJbnQgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQiAqIHNpemVvZihJbnQpKTsgLyogTWVtb3J5IGZvciBhY1ByZWRGbGFnICovCisgICAgICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIH0KKworICAgIHZpZGVvLT5vdXRwdXRNQiA9IChNYWNyb0Jsb2NrICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKE1hY3JvQmxvY2spKTsgLyogQWxsb2NhdGluZyBtYWNyb2Jsb2NrIHNwYWNlICovCisgICAgaWYgKHZpZGVvLT5vdXRwdXRNQiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPm91dHB1dE1CLT5ibG9ja1swXSwgMCwgKHNpemVvZihTaG9ydCkgPDwgNikqNik7CisKKyAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5kYXRhQmxvY2ssIDAsIHNpemVvZihTaG9ydCkgPDwgNyk7CisgICAgLyogQWxsb2NhdGUgKDIqcGFja2V0c2l6ZSkgd29ya2luZyBiaXRzdHJlYW1zICovCisKKyAgICB2aWRlby0+Yml0c3RyZWFtMSA9IEJpdFN0cmVhbUNyZWF0ZUVuYygyICogNDA5Nik7IC8qYWxsb2NhdGUgd29ya2luZyBzdHJlYW0gMSovCisgICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0xID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPmJpdHN0cmVhbTIgPSBCaXRTdHJlYW1DcmVhdGVFbmMoMiAqIDQwOTYpOyAvKmFsbG9jYXRlIHdvcmtpbmcgc3RyZWFtIDIqLworICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgIHZpZGVvLT5iaXRzdHJlYW0zID0gQml0U3RyZWFtQ3JlYXRlRW5jKDIgKiA0MDk2KTsgLyphbGxvY2F0ZSB3b3JraW5nIHN0cmVhbSAzKi8KKyAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTMgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIC8qIGFsbG9jYXRlIG92ZXJydW4gYnVmZmVyICovCisgICAgLy8gdGhpcyBidWZmZXIgaXMgdXNlZCB3aGVuIHVzZXIncyBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGhvbGQgb25lIGZyYW1lLgorICAgIC8vIEl0IGlzIG5vdCBuZWVkZWQgZm9yIHNsaWNlLWJhc2VkIGVuY29kaW5nLgorICAgIGlmIChuTGF5ZXJzID09IDEpCisgICAgeworICAgICAgICB2aWRlby0+b0JTaXplID0gZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdID4+IDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5vQlNpemUgPSBQVl9NQVgoKGVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSA+PiAzKSwgKGVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSA+PiAzKSk7CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5vQlNpemUgPiBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkUgfHwgZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EpIC8vIHNldCBsaW1pdAorICAgIHsKKyAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRTsKKyAgICB9CisgICAgdmlkZW8tPm92ZXJydW5CdWZmZXIgPSAoVUNoYXIqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihVQ2hhcikgKiB2aWRlby0+b0JTaXplKTsKKyAgICBpZiAodmlkZW8tPm92ZXJydW5CdWZmZXIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworCisgICAgdmlkZW8tPmN1cnJWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAvKiBNZW1vcnkgZm9yIEN1cnJlbnQgVk9QICovCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAvKiBhZGQgcGFkZGluZywgMDkvMTkvMDUgKi8KKyAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiBtYWtlIGl0IGNvbmRpdGlvbmFsICAxMS8yOC8wNSAqLworICAgIHsKKyAgICAgICAgcGl0Y2ggPSBtYXhfd2lkdGg7CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBpdGNoID0gbWF4X3dpZHRoICsgMzI7CisgICAgICAgIG9mZnNldCA9IChwaXRjaCA8PCA0KSArIDE2OworICAgICAgICBtYXhfaGVpZ2h0ICs9IDMyOworICAgIH0KKyAgICBpZiAoKCh1aW50NjRfdClwaXRjaCAqIG1heF9oZWlnaHQpID4gKHVpbnQ2NF90KUlOVDMyX01BWCkgeworICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKyAgICBzaXplID0gcGl0Y2ggKiBtYXhfaGVpZ2h0OworCisgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLSAoc2l6ZSA+PiAxKQorICAgICAgICAgICAgfHwgKHNpemVfdCkoc2l6ZSArIChzaXplID4+IDEpKSA+IFNJWkVfTUFYIC8gc2l6ZW9mKFBJWEVMKSkgeworICAgICAgICBnb3RvIENMRUFOX1VQOworICAgIH0KKyAgICB2aWRlby0+Y3VyclZvcC0+YWxsQ2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IChQSVhFTCAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBjdXJyVm9wIFkgKi8KKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsvKiBNZW1vcnkgZm9yIGN1cnJWb3AgVSAqLworICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOy8qIE1lbW9yeSBmb3IgY3VyclZvcCBWICovCisKKyAgICAvKiBzaGlmdCBmb3IgdGhlIG9mZnNldCAqLworICAgIGlmIChvZmZzZXQpCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICB9CisKKyAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5jdXJyVm9wOyAgICAgIC8qICBJbml0aWFsaXplIGZvcndhcmRSZWZWb3AgKi8KKyAgICB2aWRlby0+YmFja3dhcmRSZWZWb3AgPSB2aWRlby0+Y3VyclZvcDsgICAgIC8qICBJbml0aWFsaXplIGJhY2t3YXJkUmVmVm9wICovCisKKyAgICB2aWRlby0+cHJldkJhc2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgICAgIC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgQmFzZSBWb3AgKi8KKyAgICBpZiAodmlkZW8tPnByZXZCYXNlVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPnByZXZCYXNlVm9wLT5hbGxDaGFuID0gdmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihQSVhFTCkgKiAoc2l6ZSArIChzaXplID4+IDEpKSk7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgWSAqLworICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIHByZXZCYXNlVm9wIFUgKi8KKyAgICB2aWRlby0+cHJldkJhc2VWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiArIChzaXplID4+IDIpOyAvKiBNZW1vcnkgZm9yIHByZXZCYXNlVm9wIFYgKi8KKworICAgIGlmIChvZmZzZXQpCisgICAgeworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuICs9IG9mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBvcmlnaW4uKi8KKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICB9CisKKworICAgIGlmICgwKSAvKiBJZiBCIEZyYW1lcyAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wID0gKFZvcCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihWb3ApKTsgICAgICAgICAvKiBNZW1vcnkgZm9yIE5leHQgQmFzZSBWb3AgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AtPmFsbENoYW4gPSB2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBZICovCisgICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dUNoYW4gPSB2aWRlby0+bmV4dEJhc2VWb3AtPnlDaGFuICsgc2l6ZTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBVICovCisgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dkNoYW4gPSB2aWRlby0+bmV4dEJhc2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgbmV4dEJhc2VWb3AgViAqLworCisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+dkNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobkxheWVycyA+IDEpICAgLyogSWYgZW5oYW5jZW1lbnQgbGF5ZXJzICovCisgICAgeworICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgIC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRW5oYW5jZW1lbnQgVm9wICovCisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT5hbGxDaGFuID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihQSVhFTCkgKiAoc2l6ZSArIChzaXplID4+IDEpKSk7IC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRWhhbmNlbWVudCBZICovCisgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuICsgc2l6ZTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBVICovCisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgUHJldmlvdXMgRW5oYW5jZW1lbnQgViAqLworCisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLworICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dkNoYW4gKz0gKG9mZnNldCA+PiAyKSArIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aWRlby0+bnVtYmVyT2ZMYXllcnMgPSBuTGF5ZXJzOyAvKiBOdW1iZXIgb2YgTGF5ZXJzICovCisgICAgdmlkZW8tPnN1bU1BRCA9IDA7CisKKworICAgIC8qIDA0LzA5LzAxLCBmb3IgVm9wcyBpbiB0aGUgdXNlIG11bHRpcGFzcyBwcm9jZXNzaW5nICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKKyAgICB7CisgICAgICAgIHZpZGVvLT5wTVBbaWR4XSA9IChNdWx0aVBhc3MgKilNNFZFTkNfTUFMTE9DKHNpemVvZihNdWx0aVBhc3MpKTsKKyAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XSA9PSBOVUxMKSAgICBnb3RvIENMRUFOX1VQOworICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5wTVBbaWR4XSwgMCwgc2l6ZW9mKE11bHRpUGFzcykpOworCisgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZW5jb2RlZF9mcmFtZXMgPSAtMTsgLyogZm9yZ2V0IGFib3V0IHRoZSB2ZXJ5IGZpcnN0IEkgZnJhbWUgKi8KKworCisgICAgICAgIC8qIFJESW5mbyAqKnBSRFNhbXBsZXMgKi8KKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzID0gKFJESW5mbyAqKilNNFZFTkNfTUFMTE9DKDMwICogc2l6ZW9mKFJESW5mbyAqKSk7CisgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMgPT0gTlVMTCkgICAgZ290byBDTEVBTl9VUDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSA9IChSREluZm8gKilNNFZFTkNfTUFMTE9DKDMyICogc2l6ZW9mKFJESW5mbykpOworICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspICAgIE00VkVOQ19NRU1TRVQoJih2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXNbaV1bal0pLCAwLCBzaXplb2YoUkRJbmZvKSk7CisgICAgICAgIH0KKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlID0gKEludCkodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaWR4XSAqIDEuMCk7IC8qIDEuMHMgdGltZSBmcmFtZSovCisgICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSA9IFBWX01BWCh2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UsIDUpOworICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UgPSBQVl9NSU4odmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlLCAzMCk7CisKKyAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVBvcyA9IC0xOworCisgICAgfQorICAgIC8qIC8vLyBFbmQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKworICAgIGlmICgoc2l6ZV90KW5MYXllcnMgPiBTSVpFX01BWCAvIHNpemVvZihWb2wgKikpIHsKKyAgICAgICAgZ290byBDTEVBTl9VUDsKKyAgICB9CisgICAgdmlkZW8tPnZvbCA9IChWb2wgKiopTTRWRU5DX01BTExPQyhuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKSk7IC8qIE1lbW9yeSBmb3IgVk9MIHBvaW50ZXJzICovCisKKyAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgSW5pdGlhbGl6YXRpb24gb2YgVm9scyBhbmQgd3JpdGluZyBvZiBoZWFkZXJzICovCisgICAgaWYgKHZpZGVvLT52b2wgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtpZHhdID0gMTsKKyAgICAgICAgdmlkZW8tPnJlZlRpY2tbaWR4XSA9IDA7CisgICAgICAgIHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2lkeF0gPSAxMDAwOworICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSAoVm9sICopTTRWRU5DX01BTExPQyhzaXplb2YoVm9sKSk7CisgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0gPT0gTlVMTCkgIGdvdG8gQ0xFQU5fVVA7CisKKyAgICAgICAgcFZvbCA9IHZpZGVvLT52b2xbaWR4XTsKKyAgICAgICAgcEVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisKKyAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBzb21lIFZPTCBwYXJhbWV0ZXJzICovCisgICAgICAgIHBWb2wtPnZvbElEID0gaWR4OyAgLyogU2V0IFZPTCBJRCAqLworICAgICAgICBwVm9sLT5zaG9ydFZpZGVvSGVhZGVyID0gcEVuY1BhcmFtcy0+SDI2M19FbmFibGVkOyAvKlNob3J0IEhlYWRlciAqLworICAgICAgICBwVm9sLT5HT1ZTdGFydCA9IHBFbmNQYXJhbXMtPkdPVl9FbmFibGVkOyAvKiBHT1YgSGVhZGVyICovCisgICAgICAgIHBWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID0gdmlkZW8tPmVuY1BhcmFtcy0+VGltZUluY3JlbWVudFJlczsKKyAgICAgICAgcFZvbC0+bmJpdHNUaW1lSW5jUmVzID0gMTsKKyAgICAgICAgd2hpbGUgKHBWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uID4gKDEgPDwgcFZvbC0+bmJpdHNUaW1lSW5jUmVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgcFZvbC0+bmJpdHNUaW1lSW5jUmVzKys7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aW1pbmcgc3R1ZmYgKi8KKyAgICAgICAgcFZvbC0+dGltZUluY3JlbWVudCA9IDA7CisgICAgICAgIHBWb2wtPm1vZHVsb1RpbWVCYXNlID0gMDsKKyAgICAgICAgcFZvbC0+Zml4ZWRWb3BSYXRlID0gMDsgLyogTm8gZml4ZWQgVk9QIHJhdGUgKi8KKyAgICAgICAgcFZvbC0+c3RyZWFtID0gKEJpdHN0cmVhbUVuY1ZpZGVvICopTTRWRU5DX01BTExPQyhzaXplb2YoQml0c3RyZWFtRW5jVmlkZW8pKTsgLyogYWxsb2NhdGUgQml0c3RyZWFtRW5jVmlkZW8gSW5zdGFuY2UgKi8KKyAgICAgICAgaWYgKHBWb2wtPnN0cmVhbSA9PSBOVUxMKSAgZ290byBDTEVBTl9VUDsKKworICAgICAgICBwVm9sLT53aWR0aCA9IHBFbmNQYXJhbXMtPkxheWVyV2lkdGhbaWR4XTsgICAgICAvKiBMYXllciBXaWR0aCAqLworICAgICAgICBwVm9sLT5oZWlnaHQgPSBwRW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOyAgICAvKiBMYXllciBIZWlnaHQgKi8KKyAgICAgICAgLy8gIHBWb2wtPmludHJhX2FjZGNQcmVkRGlzYWJsZSA9IHBFbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uOyAvKiBBQ0RDIFByZWRpY3Rpb24gKi8KKyAgICAgICAgcFZvbC0+UmVzeW5jTWFya2VyRGlzYWJsZSA9IHBFbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGU7IC8qIFJlc3luYyBNYXJrZXIgTW9kZSAqLworICAgICAgICBwVm9sLT5kYXRhUGFydGl0aW9uaW5nID0gcEVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZzsgLyogRGF0YSBQYXJ0aXRpb25pbmcgKi8KKyAgICAgICAgcFZvbC0+dXNlUmV2ZXJzZVZMQyA9IHBFbmNQYXJhbXMtPlJldmVyc2libGVWTEM7IC8qIFJWTEMgKi8KKyAgICAgICAgaWYgKGlkeCA+IDApIC8qIFNjYWxhYmlsaXR5IGxheWVycyAqLworICAgICAgICB7CisgICAgICAgICAgICBwVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsKKyAgICAgICAgICAgIHBWb2wtPmRhdGFQYXJ0aXRpb25pbmcgPSAwOworICAgICAgICAgICAgcFZvbC0+dXNlUmV2ZXJzZVZMQyA9IDA7IC8qICBObyBSVkxDICovCisgICAgICAgIH0KKyAgICAgICAgcFZvbC0+cXVhbnRUeXBlID0gcEVuY1BhcmFtcy0+UXVhbnRUeXBlW2lkeF07ICAgICAgICAgICAvKiBRdWFudGl6ZXIgVHlwZSAqLworCisgICAgICAgIC8qIG5vIG5lZWQgdG8gaW5pdCBRdWFudCBNYXRyaWNlcyAqLworCisgICAgICAgIHBWb2wtPnNjYWxhYmlsaXR5ID0gMDsgIC8qIFZvbCBTY2FsYWJpbGl0eSAqLworICAgICAgICBpZiAoaWR4ID4gMCkKKyAgICAgICAgICAgIHBWb2wtPnNjYWxhYmlsaXR5ID0gMTsgLyogTXVsdGlwbGUgbGF5ZXJzID0+IFNjYWxhYmlsaXR5ICovCisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBWb2wgdG8gVGVtcG9yYWwgc2NhbGFiaWxpdHkuICBJdCBjYW4gY2hhbmdlIGR1cmluZyBlbmNvZGluZyAqLworICAgICAgICBwVm9sLT5zY2FsVHlwZSA9IDE7CisgICAgICAgIC8qIEluaXRpYWxpemUgcmVmZXJlbmNlIFZvbCBJRCB0byB0aGUgYmFzZSBsYXllciA9IDAgKi8KKyAgICAgICAgcFZvbC0+cmVmVm9sSUQgPSAwOworICAgICAgICAvKiBJbml0aWFsaXplIGxheWVyIHJlc29sdXRpb24gdG8gc2FtZSBhcyB0aGUgcmVmZXJlbmNlICovCisgICAgICAgIHBWb2wtPnJlZlNhbXBEaXIgPSAwOworICAgICAgICBwVm9sLT5ob3JTYW1wX20gPSAxOworICAgICAgICBwVm9sLT5ob3JTYW1wX24gPSAxOworICAgICAgICBwVm9sLT52ZXJTYW1wX20gPSAxOworICAgICAgICBwVm9sLT52ZXJTYW1wX24gPSAxOworICAgICAgICBwVm9sLT5lbmhhbmNlbWVudFR5cGUgPSAwOyAvKiBXZSBhbHdheXMgZW5oYW5jZSB0aGUgZW50aXJlIHJlZ2lvbiAqLworCisgICAgICAgIHBWb2wtPm5NQlBlclJvdyA9IChwVm9sLT53aWR0aCArIDE1KSAvIDE2OworICAgICAgICBwVm9sLT5uTUJQZXJDb2wgPSAocFZvbC0+aGVpZ2h0ICsgMTUpIC8gMTY7CisgICAgICAgIHBWb2wtPm5Ub3RhbE1CID0gcFZvbC0+bk1CUGVyUm93ICogcFZvbC0+bk1CUGVyQ29sOworCisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDMpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAyOworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDM7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA5KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNDsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDE3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNTsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDMzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNjsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDY1KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gNzsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDEyOSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDg7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAyNTcpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA5OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNTEzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTA7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxMDI1KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTE7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAyMDQ5KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTI7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA0MDk3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTM7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA4MTkzKQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTQ7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxNjM4NSkKKyAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE1OworICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMzI3NjkpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxNjsKKyAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDY1NTM3KQorICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTc7CisgICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAxMzEwNzMpCisgICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxODsKKworICAgICAgICBpZiAocFZvbC0+c2hvcnRWaWRlb0hlYWRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChwVm9sLT53aWR0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEyODoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSA5NikgIC8qIHNvdXJjZV9mb3JtYXQgPSAxICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDY7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxNzY6CisgICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gMTQ0KSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gMTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzUyOgorICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDI4OCkgIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDE4OworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSAyMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDcwNDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSA1NzYpICAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSAxODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gODg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTQwODoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSAxMTUyKSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gMTg7CisgICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDM1MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHJhdGUgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIEJFR0lOIElOSVRJQUxJWkFUSU9OIE9GIEFOTkVYIEwgUkFURSBDT05UUk9MICovCisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICB7CisgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspIC8qIDEyLzI1LzAwICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5yY1tpZHhdID0KKyAgICAgICAgICAgICAgICAocmF0ZUNvbnRyb2wgKilNNFZFTkNfTUFMTE9DKHNpemVvZihyYXRlQ29udHJvbCkpOworCisgICAgICAgICAgICBpZiAodmlkZW8tPnJjW2lkeF0gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKKworICAgICAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+cmNbaWR4XSwgMCwgc2l6ZW9mKHJhdGVDb250cm9sKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBWX1NVQ0NFU1MgIT0gUkNfSW5pdGlhbGl6ZSh2aWRlbykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gZm9yIDItcGFzcyByYXRlIGNvbnRyb2wgKi8KKyAgICB9CisgICAgLyogRU5EIElOSVRJQUxJWkFUSU9OIE9GIEFOTkVYIEwgUkFURSBDT05UUk9MICovCisKKyAgICAvKioqKioqKioqKiBhc3NpZ24gcGxhdGZvcm0gZGVwZW5kZW50IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAxLzIzLzAxICovCisgICAgLyogVGhpcyBtdXN0IGJlIGRvbmUgYXQgcnVuLXRpbWUgbm90IGEgY29tcGlsZSB0aW1lICovCisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlciA9IChGdW5jUHRyKikgTTRWRU5DX01BTExPQyhzaXplb2YoRnVuY1B0cikpOworICAgIGlmICh2aWRlby0+ZnVuY3Rpb25Qb2ludGVyID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7CisKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5Db21wdXRlTUJTdW0gPSAmQ29tcHV0ZU1CU3VtX0M7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJlNBRF9NQl9IYWxmUGVsX0N4aDsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSGFsZlBlbF9DeWg7CisgICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbM10gPSAmU0FEX01CX0hhbGZQZWxfQ3hoeWg7CisKKyNpZm5kZWYgTk9fSU5URVI0VgorICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbGtfSGFsZlBlbCA9ICZTQURfQmxrX0hhbGZQZWxfQzsKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfQmxvY2sgPSAmU0FEX0Jsb2NrX0M7CisjZW5kaWYKKyAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZTQURfTWFjcm9ibG9ja19DOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkNob29zZU1vZGUgPSAmQ2hvb3NlTW9kZV9DOworICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkdldEhhbGZQZWxNQlJlZ2lvbiA9ICZHZXRIYWxmUGVsTUJSZWdpb25fQzsKKy8vICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfUEFERElORyA9ICZTQURfTUJfUEFERElORzsgLyogNC8yMS8wMSAqLworCisKKyAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDE7ICAvKiBpbml0IGRvbmUhICovCisKKyAgICByZXR1cm4gUFZfVFJVRTsKKworQ0xFQU5fVVA6CisgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKGVuY29kZXJDb250cm9sKTsKKworICAgIHJldHVybiBQVl9GQUxTRTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQ2xlYW5VcFZpZGVvRW5jb2RlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBEZWFsbG9jYXRlcyBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gSW5pdFZpZGVvRW5jb2RlcigpICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiA1LzIxLzAxLCBmcmVlIG9ubHkgeUNoYW4gaW4gVm9wICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworICAgIEludCBpZHgsIGk7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBpbnQgblRvdGFsTUI7CisgICAgaW50IG1heF93aWR0aCwgb2Zmc2V0OworCisjaWZkZWYgUFJJTlRfUkNfSU5GTworICAgIGlmIChmYWNjdCAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVE9UQUwgTlVNIEJJVFMgR0VORVJBVEVEICVkXG4iLCB0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBGUkFNRVMgQ09ERUQgJWRcbiIsCisgICAgICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+cmNbMF0tPnRvdGFsRnJhbWVOdW1iZXIpOworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJBdmVyYWdlIEJpdFJhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgKHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkIC8gKDkwIC8gMzApKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBTVFVGRiBCSVRTICVkXG4iLCAoaVN0dWZmQml0cyArIDEwNzQwKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlRPVEFMIE5VTUJFUiBPRiBCSVRTIFRPIE5FVFdPUksgJWRcbiIsICgzNTgwMCo5MCAvIDMwKSk7OworICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJTVU0gT0YgU1RVRkYgQklUUyBBTkQgR0VORVJBVEVEIEJJVFMgJWRcbiIsCisgICAgICAgICAgICAgICAgKHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkICsgaVN0dWZmQml0cyArIDEwNzQwKSk7CisgICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIlVOQUNDT1VOVEVEIERJRkZFUkVOQ0UgJWRcbiIsCisgICAgICAgICAgICAgICAgKCgzNTgwMCo5MCAvIDMwKSAtICh0aVRvdGFsTnVtQml0c0dlbmVyYXRlZCArIGlTdHVmZkJpdHMgKyAxMDc0MCkpKTsKKyAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOworICAgICAgICBmY2xvc2UoZmFjY3QpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgUFJJTlRfRUMKKyAgICBmY2xvc2UoZmVjKTsKKyNlbmRpZgorCisgICAgaWYgKHZpZGVvICE9IE5VTEwpCisgICAgeworCisgICAgICAgIGlmICh2aWRlby0+UVBNQikgTTRWRU5DX0ZSRUUodmlkZW8tPlFQTUIpOworICAgICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSlNNFZFTkNfRlJFRSh2aWRlby0+aGVhZGVySW5mby5Nb2RlKTsKKyAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUClNNFZFTkNfRlJFRSh2aWRlby0+aGVhZGVySW5mby5DQlApOworCisKKyAgICAgICAgaWYgKHZpZGVvLT5tb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5Ub3RhbE1CID0gdmlkZW8tPnZvbFswXS0+blRvdGFsTUI7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDE7IGlkeCA8IHZpZGVvLT5jdXJyTGF5ZXI7IGlkeCsrKQorICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPm5Ub3RhbE1CID4gblRvdGFsTUIpCisgICAgICAgICAgICAgICAgICAgIG5Ub3RhbE1CID0gdmlkZW8tPnZvbFtpZHhdLT5uVG90YWxNQjsKKyAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgblRvdGFsTUI7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bW90W2lkeF0pCisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5tb3RbaWR4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+bW90KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2aWRlby0+aW50cmFBcnJheSkgTTRWRU5DX0ZSRUUodmlkZW8tPmludHJhQXJyYXkpOworCisgICAgICAgIGlmICh2aWRlby0+c2xpY2VObylNNFZFTkNfRlJFRSh2aWRlby0+c2xpY2VObyk7CisgICAgICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZylNNFZFTkNfRlJFRSh2aWRlby0+YWNQcmVkRmxhZyk7CisvLyAgICAgIGlmKHZpZGVvLT5wcmVkRENBQylNNFZFTkNfRlJFRSh2aWRlby0+cHJlZERDQUMpOworICAgICAgICBpZiAodmlkZW8tPnByZWREQykgTTRWRU5DX0ZSRUUodmlkZW8tPnByZWREQyk7CisgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSBOVUxMOworICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCkgTTRWRU5DX0ZSRUUodmlkZW8tPnByZWREQ0FDX2NvbCk7CisgICAgICAgIGlmICh2aWRlby0+b3V0cHV0TUIpTTRWRU5DX0ZSRUUodmlkZW8tPm91dHB1dE1CKTsKKworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTEpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTEpOworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTIpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTIpOworICAgICAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTMpQml0c3RyZWFtQ2xvc2VFbmModmlkZW8tPmJpdHN0cmVhbTMpOworCisgICAgICAgIGlmICh2aWRlby0+b3ZlcnJ1bkJ1ZmZlcikgTTRWRU5DX0ZSRUUodmlkZW8tPm92ZXJydW5CdWZmZXIpOworCisgICAgICAgIG1heF93aWR0aCA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbMF07CisgICAgICAgIG1heF93aWR0aCA9ICgoKG1heF93aWR0aCArIDE1KSA+PiA0KSA8PCA0KTsgLyogMDkvMTkvMDUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCA9ICgobWF4X3dpZHRoICsgMzIpIDw8IDQpICsgMTY7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPmN1cnJWb3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+YWxsQ2hhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+Y3VyclZvcC0+YWxsQ2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+Y3VyclZvcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmlkZW8tPm5leHRCYXNlVm9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPm5leHRCYXNlVm9wLT5hbGxDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5uZXh0QmFzZVZvcC0+YWxsQ2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+bmV4dEJhc2VWb3ApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcC0+YWxsQ2hhbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cHJldkJhc2VWb3AtPmFsbENoYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnByZXZCYXNlVm9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhhbmNlVm9wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhhbmNlVm9wLT5hbGxDaGFuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+YWxsQ2hhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cHJldkVuaGFuY2VWb3ApOworICAgICAgICB9CisKKyAgICAgICAgLyogMDQvMDkvMDEsIGZvciBWb3BzIGluIHRoZSB1c2UgbXVsdGlwYXNzIHByb2Nlc3NpbmcgKi8KKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPnBNUFtpZHhdLCAwLCBzaXplb2YoTXVsdGlQYXNzKSk7CisgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnBNUFtpZHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiAvLyAgRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisgICAgICAgIGlmICh2aWRlby0+dm9sKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnM7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdLT5zdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+dm9sW2lkeF0tPnN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT52b2xbaWR4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnZvbCk7CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBzdG9wIHJhdGUgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgLyogQU5ORVggTCBSQVRFIENPTlRST0wgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICAgICAgeworICAgICAgICAgICAgUkNfQ2xlYW51cCh2aWRlby0+cmMsIHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnMpOworCisgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnM7IGlkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cmNbaWR4XSkKKyAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnJjW2lkeF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZpZGVvLT5mdW5jdGlvblBvaW50ZXIpIE00VkVOQ19GUkVFKHZpZGVvLT5mdW5jdGlvblBvaW50ZXIpOworCisgICAgICAgIC8qIElmIGFwcGxpY2F0aW9uIGhhcyBjYWxsZWQgUFZDbGVhblVwVmlkZW9FbmNvZGVyIHRoZW4gd2UgZGVhbGxvY2F0ZSAqLworICAgICAgICAvKiBJZiBQVkluaXRWaWRlb0VuY29kZXIgY2xhc3MgaXQsIHRoZW4gd2UgRE8gTk9UIGRlYWxsb2NhdGUgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5lbmNQYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8pOworICAgICAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YSA9IE5VTEw7IC8qIHZpZGVvICovCisgICAgfQorCisgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQgPSAwOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRWb2xIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiA3LzE3LzIwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXRWb2xIZWFkZXIoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVUNoYXIgKnZvbEhlYWRlciwgSW50ICpzaXplLCBJbnQgbGF5ZXIpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworCisgICAgZW5jRGF0YS0+Y3VyckxheWVyID0gbGF5ZXI7IC8qIFNldCBMYXllciAqLworICAgIC8qcHZfc3RhdHVzID0gKi8KKyAgICBFbmNvZGVWT1NfU3RhcnQoZW5jQ3RybCk7IC8qIEVuY29kZSBWT0wgSGVhZGVyICovCisKKyAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkdldFZvbEhlYWRlcltsYXllcl0gPSAxOyAvKiBTZXQgdXNhZ2UgZmxhZzogTmVlZGVkIHRvIHN1cHBvcnQgb2xkIG1ldGhvZCovCisKKyAgICAvKiBDb3B5IGJpdHN0cmVhbSB0byBidWZmZXIgYW5kIHNldCB0aGUgc2l6ZSAqLworCisgICAgaWYgKCpzaXplID4gZW5jRGF0YS0+Yml0c3RyZWFtMS0+Ynl0ZUNvdW50KQorICAgIHsKKyAgICAgICAgKnNpemUgPSBlbmNEYXRhLT5iaXRzdHJlYW0xLT5ieXRlQ291bnQ7CisgICAgICAgIE00VkVOQ19NRU1DUFkodm9sSGVhZGVyLCBlbmNEYXRhLT5iaXRzdHJlYW0xLT5iaXRzdHJlYW1CdWZmZXIsICpzaXplKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBSZXNldCBiaXRzdHJlYW0xIGJ1ZmZlciBwYXJhbWV0ZXJzICovCisgICAgQml0c3RyZWFtRW5jUmVzZXQoZW5jRGF0YS0+Yml0c3RyZWFtMSk7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldE92ZXJydW5CdWZmZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCB0aGUgb3ZlcnJ1biBidWZmZXIgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQb2ludGVyIHRvIG92ZXJydW4gYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBVQ2hhciogUFZHZXRPdmVycnVuQnVmZmVyKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpCit7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOworICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKKworICAgIGlmIChjdXJyVm9sLT5zdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciAhPSB2aWRlby0+b3ZlcnJ1bkJ1ZmZlcikgLy8gbm90IHVzZWQKKyAgICB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiB2aWRlby0+b3ZlcnJ1bkJ1ZmZlcjsKK30KKworCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBFbmNvZGVWaWRlb0ZyYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRW5jb2RlIHZpZGVvIGZyYW1lIGFuZCByZXR1cm4gYml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMDIuMTQuMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBGaW5pc2hpbmcgbmV3IHRpbWVzdGFtcCAzMi1iaXQgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgIEFwcGxpY2F0aW9ucyBuZWVkIHRvIHRha2UgY2FyZSBvZiB3cmFwLWFyb3VuZCAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRW5jb2RlVmlkZW9GcmFtZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9pbiwgVmlkZW9FbmNGcmFtZUlPICp2aWRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMb25nICpuZXh0TW9kVGltZSwgVUNoYXIgKmJzdHJlYW0sIEludCAqc2l6ZSwgSW50ICpuTGF5ZXIpCit7CisgICAgQm9vbCBzdGF0dXMgPSBQVl9UUlVFOworICAgIFBWX1NUQVRVUyBwdl9zdGF0dXM7CisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIFZvbCAqY3VyclZvbDsKKyAgICBWb3AgKnRlbXBGb3J3UmVmVm9wID0gTlVMTDsKKyAgICBJbnQgdGVtcFJlZlNlbENvZGUgPSAwOworICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKKyAgICBJbnQgd2lkdGhfMTYsIGhlaWdodF8xNjsKKyAgICBJbnQgd2lkdGgsIGhlaWdodDsKKyAgICBWb3AgKnRlbXA7CisgICAgSW50IGVuY29kZVZvcCA9IDA7CisgICAgdm9pZCAgUGFkZGluZ0VkZ2UoVm9wICpwYWRWb3ApOworICAgIEludCBjdXJyTGF5ZXIgPSAtMTsKKyAgICAvL0ludCBuTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOworCisgICAgVUxvbmcgbW9kVGltZSA9IHZpZF9pbi0+dGltZXN0YW1wOworCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgSW50IHJhbmRvbV92YWxbMzBdID0gezAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDB9OworICAgIHN0YXRpYyBJbnQgcmFuZF9pZHggPSAwOworI2VuZGlmCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgTmV4dCBWb3AgdG8gZW5jb2RlLCBpZiBhbnksIGFuZCBuTGF5ZXIgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvL2kgPSBuTGF5ZXJzLTE7CisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbMF0pIC8qIGZpcnN0IHZvbCB0byBjb2RlICovCisgICAgeworICAgICAgICB2aWRlby0+bmV4dE1vZFRpbWUgPSB2aWRlby0+bW9kVGltZVJlZiA9ICgobW9kVGltZSkgLSAoKG1vZFRpbWUpICUgMTAwMCkpOworICAgIH0KKworICAgIGVuY29kZVZvcCA9IERldGVybWluZUNvZGluZ0xheWVyKHZpZGVvLCBuTGF5ZXIsIG1vZFRpbWUpOworICAgIGN1cnJMYXllciA9ICpuTGF5ZXI7CisgICAgaWYgKChjdXJyTGF5ZXIgPCAwKSB8fCAoY3VyckxheWVyID4gZW5jUGFyYW1zLT5uTGF5ZXJzIC0gMSkpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSWYgcG9zdC1za2lwcGluZyBzdGlsbCBlZmZlY3RpdmUgLS0tIHJldHVybiAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoIWVuY29kZVZvcCkgLyogc2tpcCBlbmggbGF5ZXIsIG5vIGJhc2UgbGF5ZXIgY29kZWQgLS0tIHJldHVybiAqLworICAgIHsKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgICAgICBwcmludGYoIk5vIGZyYW1lIGNvZGVkLiBDb250aW51ZSB0byBuZXh0IGZyYW1lLiIpOworI2VuZGlmCisgICAgICAgIC8qIGV4cGVjdGVkIG5leHQgY29kZSB0aW1lLCBjb252ZXJ0IGJhY2sgdG8gbWlsbGlzZWMgKi8KKyAgICAgICAgKm5leHRNb2RUaW1lID0gdmlkZW8tPm5leHRNb2RUaW1lOworCisjaWZkZWYgQUxMT1dfVk9QX05PVF9DT0RFRAorICAgICAgICBpZiAodmlkZW8tPnZvbFswXS0+c2hvcnRWaWRlb0hlYWRlcikgLyogU2hvcnQgVmlkZW8gSGVhZGVyID0gMSAqLworICAgICAgICB7CisgICAgICAgICAgICAqc2l6ZSA9IDA7CisgICAgICAgICAgICAqbkxheWVyID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqbkxheWVyID0gMDsKKyAgICAgICAgICAgIEVuY29kZVZvcE5vdENvZGVkKHZpZGVvLCBic3RyZWFtLCBzaXplLCBtb2RUaW1lKTsKKyAgICAgICAgICAgICpzaXplID0gdmlkZW8tPnZvbFswXS0+c3RyZWFtLT5ieXRlQ291bnQ7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgKm5MYXllciA9IC0xOworI2VuZGlmCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisKKy8vRU5DT0RFX1ZPUF9BR0FJTjogIC8qIDEyLzMwLzAwICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBWb2wgc3RyZWFtIHN0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIGJpdHN0cmVhbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgY3VyclZvbC0+c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBic3RyZWFtOworICAgIGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSA9ICpzaXplOworICAgIEJpdHN0cmVhbUVuY1Jlc2V0KGN1cnJWb2wtPnN0cmVhbSk7CisgICAgQml0c3RyZWFtU2V0T3ZlcnJ1bkJ1ZmZlcihjdXJyVm9sLT5zdHJlYW0sIHZpZGVvLT5vdmVycnVuQnVmZmVyLCB2aWRlby0+b0JTaXplLCB2aWRlbyk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFZPUyBhbmQgVk9MIEhlYWRlcnMgb24gZmlyc3QgY2FsbCBmb3IgZWFjaCBsYXllciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQorICAgIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnRpbWVJbmMgPSAwOworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnRpbWVJbmMgPSAwOworICAgICAgICBpZiAoIXZpZGVvLT5lbmNQYXJhbXMtPkdldFZvbEhlYWRlcltjdXJyTGF5ZXJdKQorICAgICAgICAgICAgcHZfc3RhdHVzID0gRW5jb2RlVk9TX1N0YXJ0KGVuY0N0cmwpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29weSBJbnB1dCBWaWRlbyBGcmFtZSB0byBJbnRlcm5hbCBWaWRlbyBCdWZmZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIERldGVybWluZSBXaWR0aCBhbmQgSGVpZ2h0IG9mIFZvcCBMYXllciAqLworCisgICAgd2lkdGggPSBlbmNQYXJhbXMtPkxheWVyV2lkdGhbY3VyckxheWVyXTsgICAvKiBHZXQgaW5wdXQgd2lkdGggKi8KKyAgICBoZWlnaHQgPSBlbmNQYXJhbXMtPkxheWVySGVpZ2h0W2N1cnJMYXllcl07IC8qIEdldCBpbnB1dCBoZWlnaHQgKi8KKyAgICAvKiBSb3VuZCBVcCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2IDogTVBFRy00IFN0YW5kYXJkICovCisKKyAgICB3aWR0aF8xNiA9ICgod2lkdGggKyAxNSkgLyAxNikgKiAxNjsgICAgICAgICAgICAvKiBSb3VuZCB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2ICovCisgICAgaGVpZ2h0XzE2ID0gKChoZWlnaHQgKyAxNSkgLyAxNikgKiAxNjsgICAgICAgICAgLyogUm91bmQgdXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiAqLworCisgICAgdmlkZW8tPmlucHV0ID0gdmlkX2luOyAgLyogcG9pbnQgdG8gdGhlIGZyYW1lIGlucHV0ICovCisKKyAgICAvKi8vICBFbmQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgVk9QIFR5cGUgICAgICAgICAgICAgICAgICovCisgICAgLyogNi8yLzIwMDEsIHNlcGFyYXRlIGZ1bmN0aW9uICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgRGV0ZXJtaW5lVm9wVHlwZSh2aWRlbywgY3VyckxheWVyKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgIEluaXRpYWxpemUgVk9QICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHZpZGVvLT5jdXJyVm9wLT52b2xJRCA9IGN1cnJWb2wtPnZvbElEOworICAgIHZpZGVvLT5jdXJyVm9wLT53aWR0aCA9IHdpZHRoXzE2OworICAgIHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQgPSBoZWlnaHRfMTY7CisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkgLyogIDExLzI4LzA1ICovCisgICAgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+cGl0Y2ggPSB3aWR0aF8xNjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnBpdGNoID0gd2lkdGhfMTYgKyAzMjsKKyAgICB9CisgICAgdmlkZW8tPmN1cnJWb3AtPnRpbWVJbmMgPSBjdXJyVm9sLT50aW1lSW5jcmVtZW50OworICAgIHZpZGVvLT5jdXJyVm9wLT52b3BDb2RlZCA9IDE7CisgICAgdmlkZW8tPmN1cnJWb3AtPnJvdW5kaW5nVHlwZSA9IDA7CisgICAgdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHIgPSBlbmNQYXJhbXMtPkludHJhRENWbGNUaHI7CisKKyAgICBpZiAoY3VyckxheWVyID09IDAKKyNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERSAgIC8qIGFkZCByYW5kb20gc2VsZWN0aW9uIG9mIHJlZmVyZW5jZSBWb3AgKi8KKyAgICAgICAgICAgIHx8IHJhbmRvbV92YWxbcmFuZF9pZHhdIHx8IHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0KKyNlbmRpZgorICAgICAgICkKKyAgICB7CisgICAgICAgIHRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICBpZiAodGVtcEZvcndSZWZWb3AgIT0gTlVMTCkgdGVtcFJlZlNlbENvZGUgPSB0ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAxOworICAgIH0KKyNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICBpZiAodGVtcEZvcndSZWZWb3AgIT0gTlVMTCkgdGVtcFJlZlNlbENvZGUgPSB0ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOworICAgIH0KKyAgICByYW5kX2lkeCsrOworICAgIHJhbmRfaWR4ICU9IDMwOworI2VuZGlmCisKKyAgICB2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZSA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JOdW1iZXIgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JGcmFtZUlEID0gdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbFJlZiA9IChtb2RUaW1lICogMzAgLyAxMDAxKSAlIDI1NjsKKworICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbEludGVydmFsID0gMDsKKworICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudEl2b3BbY3VyckxheWVyXTsKKyAgICBlbHNlCisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudFB2b3BbY3VyckxheWVyXTsKKworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFZvcCAqLworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHZpZGVvLT5zbGljZV9jb2RpbmcgPSAwOworCisgICAgcHZfc3RhdHVzID0gRW5jb2RlVm9wKHZpZGVvKTsKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgIHByaW50ZigiIEktVk9QICIpOworICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCIgUC1WT1AgKHJlZi4lZCkiLCB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSk7CisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVXBkYXRlIFNraXAgTmV4dCBGcmFtZSAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICpuTGF5ZXIgPSBVcGRhdGVTa2lwTmV4dEZyYW1lKHZpZGVvLCBuZXh0TW9kVGltZSwgc2l6ZSwgcHZfc3RhdHVzKTsKKyAgICBpZiAoKm5MYXllciA9PSAtMSkgLyogc2tpcCBjdXJyZW50IGZyYW1lICovCisgICAgeworICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBwb2ludGVycyBhcmUgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIHN0YXRlICovCisgICAgICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB0ZW1wRm9yd1JlZlZvcDsgLyogRm9yIFAtVm9wIGJhc2Ugb25seSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5mb3J3YXJkUmVmVm9wICE9IE5VTEwpIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gdGVtcFJlZlNlbENvZGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIElmIEktVk9QIHdhcyBlbmNvZGVkLCByZXNldCBJbnRyYVBlcmlvZCAqLworICAgIGlmICgoY3VyckxheWVyID09IDApICYmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID4gMCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCisgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q7CisKKyAgICAvKiBTZXQgSGludFRyYWNrIEluZm9ybWF0aW9uICovCisgICAgaWYgKGN1cnJMYXllciAhPSAtMSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2UpCisgICAgICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAwOworICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5MYXllcklEID0gKFVDaGFyKWN1cnJWb2wtPnZvbElEOworICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5Db2RlVHlwZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7CisgICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLlJlZlNlbENvZGUgPSAoVUNoYXIpdmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGU7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgbkxheWVyIGFuZCB0aW1lSW5jIGZvciBuZXh0IGVuY29kZSAqLworICAgIC8qIDEyLzI3LzAwIGFsd2F5cyBnbyBieSB0aGUgaGlnaGVzdCBsYXllciovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcHkgUmVjb25zdHJ1Y3RlZCBCdWZmZXIgdG8gT3V0cHV0IFZpZGVvIEZyYW1lIEJ1ZmZlciAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHZpZF9vdXQtPnlDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOworICAgIHZpZF9vdXQtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuOworICAgIHZpZF9vdXQtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnZDaGFuOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCisgICAgeworICAgICAgICB2aWRfb3V0LT5oZWlnaHQgPSB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0OyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodCArIDMyOyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoICsgMzI7IC8qIHBhZGRlZCB3aWR0aCAqLworICAgIH0KKyAgICAvL3ZpZGVvX291dC0+dGltZXN0YW1wID0gdmlkZW8tPm1vZFRpbWU7CisgICAgdmlkX291dC0+dGltZXN0YW1wID0gKFVMb25nKSgoKHZpZGVvLT5wcmV2RnJhbWVOdW1bY3VyckxheWVyXSAqIDEwMDApIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtjdXJyTGF5ZXJdKSArIHZpZGVvLT5tb2RUaW1lUmVmICsgMC41KTsKKworICAgIC8qLy8gRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVXBkYXRlIE91cHV0IGJzdHJlYW0gYnl0ZSBjb3VudCAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICpzaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQ7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTd2FwIFZvcCBQb2ludGVycyBmb3IgQmFzZSBMYXllciAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgeworICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT5wYWRkZWQgPSAwOyAvKiBub3QgcGFkZGVkICovCisgICAgICAgIHZpZGVvLT5jdXJyVm9wICA9IHRlbXA7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdGVtcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wID0gdmlkZW8tPmN1cnJWb3A7CisgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXA7CisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogTW9kaWZ5IHRoZSBpbnRpYWxpemUgZmxhZyBhdCB0aGUgZW5kLiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgICAgIHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0gPSAwOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworI2lmbmRlZiBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZFbmNvZGVGcmFtZVNldCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVudGVyIGEgdmlkZW8gZnJhbWUgYW5kIHBlcmZvcm0gZnJvbnQtZW5kIHRpbWUgY2hlY2sgcGx1cyBNRSAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRW5jb2RlRnJhbWVTZXQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVmlkZW9FbmNGcmFtZUlPICp2aWRfaW4sIFVMb25nICpuZXh0TW9kVGltZSwgSW50ICpuTGF5ZXIpCit7CisgICAgQm9vbCBzdGF0dXMgPSBQVl9UUlVFOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBWb2wgKmN1cnJWb2w7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIEludCB3aWR0aF8xNiwgaGVpZ2h0XzE2OworICAgIEludCB3aWR0aCwgaGVpZ2h0OworICAgIEludCBlbmNvZGVWb3AgPSAwOworICAgIHZvaWQgIFBhZGRpbmdFZGdlKFZvcCAqcGFkVm9wKTsKKyAgICBJbnQgY3VyckxheWVyID0gLTE7CisgICAgLy9JbnQgbkxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKKworICAgIFVMb25nICAgbW9kVGltZSA9IHZpZF9pbi0+dGltZXN0YW1wOworCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgSW50IHJhbmRvbV92YWxbMzBdID0gezAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDB9OworICAgIHN0YXRpYyBJbnQgcmFuZF9pZHggPSAwOworI2VuZGlmCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIE5leHQgVm9wIHRvIGVuY29kZSwgaWYgYW55LCBhbmQgbkxheWVyICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICB2aWRlby0+bW9kVGltZSA9IG1vZFRpbWU7CisKKyAgICAvL2kgPSBuTGF5ZXJzLTE7CisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbMF0pIC8qIGZpcnN0IHZvbCB0byBjb2RlICovCisgICAgeworICAgICAgICB2aWRlby0+bmV4dE1vZFRpbWUgPSB2aWRlby0+bW9kVGltZVJlZiA9ICgobW9kVGltZSkgLSAoKG1vZFRpbWUpICUgMTAwMCkpOworICAgIH0KKworCisgICAgZW5jb2RlVm9wID0gRGV0ZXJtaW5lQ29kaW5nTGF5ZXIodmlkZW8sIG5MYXllciwgbW9kVGltZSk7CisKKyAgICBjdXJyTGF5ZXIgPSAqbkxheWVyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJZiBwb3N0LXNraXBwaW5nIHN0aWxsIGVmZmVjdGl2ZSAtLS0gcmV0dXJuICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmICghZW5jb2RlVm9wKSAvKiBza2lwIGVuaCBsYXllciwgbm8gYmFzZSBsYXllciBjb2RlZCAtLS0gcmV0dXJuICovCisgICAgeworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgIHByaW50ZigiTm8gZnJhbWUgY29kZWQuIENvbnRpbnVlIHRvIG5leHQgZnJhbWUuIik7CisjZW5kaWYKKyAgICAgICAgKm5MYXllciA9IC0xOworCisgICAgICAgIC8qIGV4cGVjdGVkIG5leHQgY29kZSB0aW1lLCBjb252ZXJ0IGJhY2sgdG8gbWlsbGlzZWMgKi8KKyAgICAgICAgKm5leHRNb2RUaW1lID0gdmlkZW8tPm5leHRNb2RUaW1lOzsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBWb2wgc3RyZWFtIHN0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIGJpdHN0cmVhbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gMDsKKyAgICBCaXRzdHJlYW1FbmNSZXNldChjdXJyVm9sLT5zdHJlYW0pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWT1MgYW5kIFZPTCBIZWFkZXJzIG9uIGZpcnN0IGNhbGwgZm9yIGVhY2ggbGF5ZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gMDsKKyAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wLT50aW1lSW5jID0gMDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcHkgSW5wdXQgVmlkZW8gRnJhbWUgdG8gSW50ZXJuYWwgVmlkZW8gQnVmZmVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBEZXRlcm1pbmUgV2lkdGggYW5kIEhlaWdodCBvZiBWb3AgTGF5ZXIgKi8KKworICAgIHdpZHRoID0gZW5jUGFyYW1zLT5MYXllcldpZHRoW2N1cnJMYXllcl07ICAgLyogR2V0IGlucHV0IHdpZHRoICovCisgICAgaGVpZ2h0ID0gZW5jUGFyYW1zLT5MYXllckhlaWdodFtjdXJyTGF5ZXJdOyAvKiBHZXQgaW5wdXQgaGVpZ2h0ICovCisgICAgLyogUm91bmQgVXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiA6IE1QRUctNCBTdGFuZGFyZCAqLworCisgICAgd2lkdGhfMTYgPSAoKHdpZHRoICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgICAgLyogUm91bmQgdXAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiAxNiAqLworICAgIGhlaWdodF8xNiA9ICgoaGVpZ2h0ICsgMTUpIC8gMTYpICogMTY7ICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KKworICAgIHZpZGVvLT5pbnB1dCA9IHZpZF9pbjsgIC8qIHBvaW50IHRvIHRoZSBmcmFtZSBpbnB1dCAqLworCisgICAgLyovLyAgRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogRGV0ZXJtaW5lIFZPUCBUeXBlICAgICAgICAgICAgICAgICAqLworICAgIC8qIDYvMi8yMDAxLCBzZXBhcmF0ZSBmdW5jdGlvbiAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIERldGVybWluZVZvcFR5cGUodmlkZW8sIGN1cnJMYXllcik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICBJbml0aWFsaXplIFZPUCAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB2aWRlby0+Y3VyclZvcC0+dm9sSUQgPSBjdXJyVm9sLT52b2xJRDsKKyAgICB2aWRlby0+Y3VyclZvcC0+d2lkdGggPSB3aWR0aF8xNjsKKyAgICB2aWRlby0+Y3VyclZvcC0+aGVpZ2h0ID0gaGVpZ2h0XzE2OworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIC8qICAxMS8yOC8wNSAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnBpdGNoID0gd2lkdGhfMTY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2ICsgMzI7CisgICAgfQorICAgIHZpZGVvLT5jdXJyVm9wLT50aW1lSW5jID0gY3VyclZvbC0+dGltZUluY3JlbWVudDsKKyAgICB2aWRlby0+Y3VyclZvcC0+dm9wQ29kZWQgPSAxOworICAgIHZpZGVvLT5jdXJyVm9wLT5yb3VuZGluZ1R5cGUgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyID0gZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyOworCisgICAgaWYgKGN1cnJMYXllciA9PSAwCisjaWZkZWYgUkFORE9NX1JFRlNFTENPREUgICAvKiBhZGQgcmFuZG9tIHNlbGVjdGlvbiBvZiByZWZlcmVuY2UgVm9wICovCisgICAgICAgICAgICB8fCByYW5kb21fdmFsW3JhbmRfaWR4XSB8fCB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdCisjZW5kaWYKKyAgICAgICApCisgICAgeworICAgICAgICB2aWRlby0+dGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCisgICAgICAgIGlmICh2aWRlby0+dGVtcEZvcndSZWZWb3AgIT0gTlVMTCkgdmlkZW8tPnRlbXBSZWZTZWxDb2RlID0gdmlkZW8tPnRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7CisgICAgfQorI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmlkZW8tPnRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLworICAgICAgICBpZiAodmlkZW8tPnRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHZpZGVvLT50ZW1wUmVmU2VsQ29kZSA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKKworICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKKyAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOworICAgIH0KKyAgICByYW5kX2lkeCsrOworICAgIHJhbmRfaWR4ICU9IDMwOworI2VuZGlmCisKKyAgICB2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZSA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JOdW1iZXIgPSAwOworICAgIHZpZGVvLT5jdXJyVm9wLT5nb2JGcmFtZUlEID0gdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOworICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbFJlZiA9ICgobW9kVGltZSkgKiAzMCAvIDEwMDEpICUgMjU2OworCisgICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsSW50ZXJ2YWwgPSAwOworCisgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtjdXJyTGF5ZXJdOworICAgIGVsc2UKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtjdXJyTGF5ZXJdOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFZvcCAgICovCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgdmlkZW8tPnNsaWNlX2NvZGluZyA9IDE7CisKKyAgICAvKnB2X3N0YXR1cyA9Ki8KKyAgICBFbmNvZGVWb3AodmlkZW8pOworCisjaWZkZWYgX1BSSU5UX1NUQVQKKyAgICBpZiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQorICAgICAgICBwcmludGYoIiBJLVZPUCAiKTsKKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiIFAtVk9QIChyZWYuJWQpIiwgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUpOworI2VuZGlmCisKKyAgICAvKiBTZXQgSGludFRyYWNrIEluZm9ybWF0aW9uICovCisgICAgaWYgKGN1cnJWb2wtPnByZXZNb2R1bG9UaW1lQmFzZSkKKyAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMTsKKyAgICBlbHNlCisgICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLk1UQiA9IDA7CisKKyAgICB2aWRlby0+aGludFRyYWNrSW5mby5MYXllcklEID0gKFVDaGFyKWN1cnJWb2wtPnZvbElEOworICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLkNvZGVUeXBlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKKyAgICB2aWRlby0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZiAvKiBOT19TTElDRV9FTkNPREUgKi8KKworI2lmbmRlZiBOT19TTElDRV9FTkNPREUKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZFbmNvZGVQYWNrZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEVuY29kZSBvbmUgcGFja2V0IGFuZCByZXR1cm4gYml0c3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWRW5jb2RlU2xpY2UoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgVUNoYXIgKmJzdHJlYW0sIEludCAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICplbmRvZkZyYW1lLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsIFVMb25nICpuZXh0TW9kVGltZSkKK3sKKyAgICBQVl9TVEFUVVMgcHZfc3RhdHVzOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBWb2wgKmN1cnJWb2w7CisgICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOworICAgIFZvcCAqdGVtcDsKKyAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7CisgICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7CisgICAgSW50IHByZV9za2lwOworICAgIEludCBwcmVfc2l6ZTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBWb2wgc3RyZWFtIHN0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIGJpdHN0cmVhbSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW2N1cnJMYXllcl07CisgICAgY3VyclZvbC0+c3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBic3RyZWFtOworICAgIHByZV9zaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQ7CisgICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gcHJlX3NpemUgKyAoKnNpemUpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEVuY29kZSBWT1MgYW5kIFZPTCBIZWFkZXJzIG9uIGZpcnN0IGNhbGwgZm9yIGVhY2ggbGF5ZXIgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKKyAgICB7CisgICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2N1cnJMYXllcl0pCisgICAgICAgICAgICBwdl9zdGF0dXMgPSBFbmNvZGVWT1NfU3RhcnQoZW5jQ3RybCk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgLyogRW5jb2RlIFNsaWNlICovCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgcHZfc3RhdHVzID0gRW5jb2RlU2xpY2UodmlkZW8pOworCisgICAgKmVuZG9mRnJhbWUgPSAwOworCisgICAgaWYgKHZpZGVvLT5tYm51bSA+PSBjdXJyVm9sLT5uVG90YWxNQiAmJiAhdmlkZW8tPmVuZF9vZl9idWYpCisgICAgeworICAgICAgICAqZW5kb2ZGcmFtZSA9IDE7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVXBkYXRlIFNraXAgTmV4dCBGcmFtZSAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgcHJlX3NraXAgPSBVcGRhdGVTa2lwTmV4dEZyYW1lKHZpZGVvLCBuZXh0TW9kVGltZSwgc2l6ZSwgcHZfc3RhdHVzKTsgLyogbW9kaWZpZWQgc3VjaCB0aGF0IG5vIHByZS1za2lwcGVkICovCisKKyAgICAgICAgaWYgKHByZV9za2lwID09IC0xKSAvKiBlcnJvciAqLworICAgICAgICB7CisgICAgICAgICAgICAqZW5kb2ZGcmFtZSA9IC0xOworICAgICAgICAgICAgLyogbWFrZSBzdXJlIHRoYXQgcG9pbnRlcnMgYXJlIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBzdGF0ZSAqLworICAgICAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnRlbXBGb3J3UmVmVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCisgICAgICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSB2aWRlby0+dGVtcFJlZlNlbENvZGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBwdl9zdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBJLVZPUCB3YXMgZW5jb2RlZCwgcmVzZXQgSW50cmFQZXJpb2QgKi8KKyAgICAgICAgaWYgKChjdXJyTGF5ZXIgPT0gMCkgJiYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPiAwKSAmJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKSkKKyAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIENvcHkgUmVjb25zdHJ1Y3RlZCBCdWZmZXIgdG8gT3V0cHV0IFZpZGVvIEZyYW1lIEJ1ZmZlciAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgdmlkX291dC0+eUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47CisgICAgICAgIHZpZF9vdXQtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuOworICAgICAgICB2aWRfb3V0LT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT52Q2hhbjsKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodDsgLyogcGFkZGVkIGhlaWdodCAqLworICAgICAgICAgICAgdmlkX291dC0+cGl0Y2ggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGg7IC8qIHBhZGRlZCB3aWR0aCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodCArIDMyOyAvKiBwYWRkZWQgaGVpZ2h0ICovCisgICAgICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aCArIDMyOyAvKiBwYWRkZWQgd2lkdGggKi8KKyAgICAgICAgfQorICAgICAgICAvL3ZpZF9vdXQtPnRpbWVzdGFtcCA9IHZpZGVvLT5tb2RUaW1lOworICAgICAgICB2aWRfb3V0LT50aW1lc3RhbXAgPSAoVUxvbmcpKCgodmlkZW8tPnByZXZGcmFtZU51bVtjdXJyTGF5ZXJdICogMTAwMCkgLyBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2N1cnJMYXllcl0pICsgdmlkZW8tPm1vZFRpbWVSZWYgKyAwLjUpOworCisgICAgICAgIC8qLy8gRW5kIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIFN3YXAgVm9wIFBvaW50ZXJzIGZvciBCYXNlIExheWVyICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICBpZiAoY3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkJhc2VWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkJhc2VWb3A7IC8qIEZvciBQLVZvcCBiYXNlIG9ubHkgKi8KKyAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AgPSB2aWRlby0+Y3VyclZvcDsKKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLworICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOworICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7CisgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVXBkYXRlIE91cHV0IGJzdHJlYW0gYnl0ZSBjb3VudCAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICpzaXplID0gY3VyclZvbC0+c3RyZWFtLT5ieXRlQ291bnQgLSBwcmVfc2l6ZTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIE1vZGlmeSB0aGUgaW50aWFsaXplIGZsYWcgYXQgdGhlIGVuZC4qLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQorICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdID0gMDsKKworICAgIHJldHVybiBwdl9zdGF0dXM7Cit9CisjZW5kaWYgLyogTk9fU0xJQ0VfRU5DT0RFICovCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEgyNjNQcm9maWxlTGV2ZWxJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDAyLzA1LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogR2V0IEguMjYzIFByb2ZpbGUgSUQgYW5kIGxldmVsIElEIGZvciBwcm9maWxlIDAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBQcm9maWxlIElEPTAsIGxldmVsSUQgaXMgd2hhdCB3ZSB3YW50ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTm90ZSAgICAgOiBoMjYzTGV2ZWxbOF0sIHJCUl9ib3VuZFs4XSwgbWF4X2gyNjNfZnJhbWVyYXRlWzJdICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgIG1heF9oMjYzX3dpZHRoWzJdLCBtYXhfaDI2M19oZWlnaHRbMl0gYXJlIGdsb2JhbCAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0SDI2M1Byb2ZpbGVMZXZlbElEKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqcHJvZmlsZUlELCBJbnQgKmxldmVsSUQpCit7CisgICAgVmlkZW9FbmNEYXRhICplbmNEYXRhOworICAgIEludCB3aWR0aCwgaGVpZ2h0OworICAgIGZsb2F0IGJpdHJhdGVfciwgZnJhbWVyYXRlOworCisKKyAgICAvKiBGb3IgdGhpcyB2ZXJzaW9uLCB3ZSBvbmx5IHN1cHBvcnQgSC4yNjMgcHJvZmlsZSAwICovCisgICAgKnByb2ZpbGVJRCA9IDA7CisKKyAgICAqbGV2ZWxJRCA9IDA7CisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgaWYgKCFlbmNEYXRhLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkgcmV0dXJuIFBWX0ZBTFNFOworCisKKyAgICAvKiBnZXQgaW1hZ2Ugd2lkdGgsIGhlaWdodCwgYml0cmF0ZSBhbmQgZnJhbWVyYXRlICovCisgICAgd2lkdGggICAgID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllcldpZHRoWzBdOworICAgIGhlaWdodCAgICA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbMF07CisgICAgYml0cmF0ZV9yID0gKGZsb2F0KShlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVswXSkgLyAoZmxvYXQpNjQwMDAuMDsKKyAgICBmcmFtZXJhdGUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOworICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCAhKGJpdHJhdGVfciA+IDAgJiYgZnJhbWVyYXRlID4gMCkpIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qIFRoaXMgaXMgdGhlIG1vc3QgZnJlcXVlbnQgY2FzZSA6IGxldmVsIDEwICovCisgICAgaWYgKGJpdHJhdGVfciA8PSByQlJfYm91bmRbMV0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVswXSAmJgorICAgICAgICAgICAgKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzBdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMF0pKQorICAgIHsKKyAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbMV07CisgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgIH0KKyAgICBlbHNlIGlmIChiaXRyYXRlX3IgPiByQlJfYm91bmRbNF0gfHwKKyAgICAgICAgICAgICAod2lkdGggPiBtYXhfaDI2M193aWR0aFsxXSB8fCBoZWlnaHQgPiBtYXhfaDI2M19oZWlnaHRbMV0pIHx8CisgICAgICAgICAgICAgZnJhbWVyYXRlID4gbWF4X2gyNjNfZnJhbWVyYXRlWzFdKSAgICAvKiBjaGVjayB0aGUgaGlnaGVzdCBsZXZlbCA3MCAqLworICAgIHsKKyAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbN107CisgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgIH0KKyAgICBlbHNlICAgLyogc2VhcmNoIGxldmVsIDIwLCAzMCwgNDAgKi8KKyAgICB7CisKKyAgICAgICAgLyogcGljayBvdXQgbGV2ZWwgMjAgKi8KKyAgICAgICAgaWYgKGJpdHJhdGVfciA8PSByQlJfYm91bmRbMl0gJiYKKyAgICAgICAgICAgICAgICAoKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzBdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMF0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVsxXSkgfHwKKyAgICAgICAgICAgICAgICAgKHdpZHRoIDw9IG1heF9oMjYzX3dpZHRoWzFdICYmIGhlaWdodCA8PSBtYXhfaDI2M19oZWlnaHRbMV0gJiYgZnJhbWVyYXRlIDw9IG1heF9oMjYzX2ZyYW1lcmF0ZVswXSkpKQorICAgICAgICB7CisgICAgICAgICAgICAqbGV2ZWxJRCA9IGgyNjNMZXZlbFsyXTsKKyAgICAgICAgICAgIHJldHVybiBQVl9UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgICAvKiB3aWR0aCwgaGVpZ2h0IGFuZCBmcmFtZXJhdGUgYXJlIG9rLCBub3cgY2hvb3NlIGxldmVsIDMwIG9yIDQwICovCisgICAgICAgIHsKKyAgICAgICAgICAgICpsZXZlbElEID0gKGJpdHJhdGVfciA8PSByQlJfYm91bmRbM10gPyBoMjYzTGV2ZWxbM10gOiBoMjYzTGV2ZWxbNF0pOworICAgICAgICAgICAgcmV0dXJuIFBWX1RSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZHZXRNUEVHNFByb2ZpbGVMZXZlbElEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAyNi8wNi8yMDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IEdldCBNUEVHNCBMZXZlbCBhZnRlciBpbml0aWFsaXplZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogcHJvZmlsZV9sZXZlbCBhY2NvcmRpbmcgdG8gaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0TVBFRzRQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVfbGV2ZWwsIEludCBuTGF5ZXIpCit7CisgICAgVmlkZW9FbmNEYXRhKiB2aWRlbzsKKyAgICBJbnQgaTsKKworICAgIHZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAobkxheWVyID09IDApCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID09IHByb2ZpbGVfbGV2ZWxfY29kZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcHJvZmlsZV9sZXZlbCA9IGk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMF0gPT0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlW2ldKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwcm9maWxlX2xldmVsID0gaSArIFNJTVBMRV9TQ0FMQUJMRV9QUk9GSUxFX0xFVkVMMDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUVuY0ZyYW1lUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIHRhcmdldCBmcmFtZSByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlICAgICovCisvKiAgICAgICAgICAgICBsYXllcihpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWVXBkYXRlRW5jRnJhbWVSYXRlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIGZsb2F0ICpmcmFtZVJhdGUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworICAgIEludCBpOy8vIG5Ub3RhbE1CLCBtYlBlclNlYzsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIC8qIFVwZGF0ZSB0aGUgZnJhbWVyYXRlcyBmb3IgYWxsIHRoZSBsYXllcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCisgICAgeworCisgICAgICAgIC8qIE5ldyBjaGVjazogZW5jb2RpbmcgZnJhbWVyYXRlIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCisgICAgICAgIC8vblRvdGFsTUIgPSAoKChlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbaV0rMTUpLzE2KSoxNikqKCgoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpXSsxNSkvMTYpKjE2KS8oMTYqMTYpOworICAgICAgICAvL21iUGVyU2VjID0gKEludCkoblRvdGFsTUIgKiBmcmFtZVJhdGVbaV0pOworICAgICAgICAvL2lmKG1iUGVyU2VjID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heE1ic1BlclNlY1tpXSkgcmV0dXJuIFBWX0ZBTFNFOworICAgICAgICBpZiAoZnJhbWVSYXRlW2ldID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVtpXSkgcmV0dXJuIFBWX0ZBTFNFOyAvKiBzZXQgYnkgdXNlcnMgb3IgcHJvZmlsZSAqLworCisgICAgICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gPSBmcmFtZVJhdGVbaV07CisgICAgfQorCisgICAgcmV0dXJuIFJDX1VwZGF0ZUJYUkNQYXJhbXMoKHZvaWQqKSBlbmNEYXRhKTsKKworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWVXBkYXRlQml0UmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBVcGRhdGUgdGFyZ2V0IGJpdCByYXRlcyBvZiB0aGUgZW5jb2RlZCBiYXNlIGFuZCBlbmhhbmNlICAgICAgKi8KKy8qICAgICAgICAgICAgIGxheWVyKGlmIGFueSkgd2hpbGUgZW5jb2Rpbmcgb3BlcmF0aW9uIGlzIG9uZ29pbmcgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZVcGRhdGVCaXRSYXRlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqYml0UmF0ZSkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisgICAgSW50IGk7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBVcGRhdGUgdGhlIGJpdHJhdGVzIGZvciBhbGwgdGhlIGxheWVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChiaXRSYXRlW2ldID4gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbaV0pIC8qIHNldCBieSB1c2VycyBvciBwcm9maWxlICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVtpXSA9IGJpdFJhdGVbaV07CisgICAgfQorCisgICAgcmV0dXJuIFJDX1VwZGF0ZUJYUkNQYXJhbXMoKHZvaWQqKSBlbmNEYXRhKTsKKworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZVZCVkRlbGF5KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8yMy8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVXBkYXRlIFZCViBidWZmZXIgc2l6ZShpbiBkZWxheSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitCb29sIFBWVXBkYXRlVkJWRGVsYXkoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgZmxvYXQgZGVsYXkpCit7CisKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisgICAgSW50IHRvdGFsX2JpdHJhdGUsIG1heF9idWZmZXJfc2l6ZTsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBkZWxheSBpcyB2YWxpZCBiYXNlZCBvbiB0aGUgZ2l2ZW4gcHJvZmlsZSAqLworICAgIHRvdGFsX2JpdHJhdGUgICA9IChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMSA/IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzBdIDoKKyAgICAgICAgICAgICAgICAgICAgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMV0pOworICAgIGluZGV4ID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4OworICAgIG1heF9idWZmZXJfc2l6ZSA9IChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMSA/IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSA6CisgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSk7CisKKyAgICBpZiAodG90YWxfYml0cmF0ZSpkZWxheSA+IChmbG9hdCltYXhfYnVmZmVyX3NpemUpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gZGVsYXk7CisgICAgcmV0dXJuIFBWX1RSVUU7CisKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUlGcmFtZUludGVydmFsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNC8xMC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IHVwZGF0ZXMgdGhlIElOVFJBIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwgd2hpbGUgZW5jb2RpbmcgICAgICAqLworLyogICAgICAgICAgICAgaXMgb25nb2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVlVwZGF0ZUlGcmFtZUludGVydmFsKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCBhSUZyYW1lUGVyaW9kKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPSBhSUZyYW1lUGVyaW9kOworICAgIHJldHVybiBQVl9UUlVFOworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWU2V0TnVtSW50cmFNQlJlZnJlc2goKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMDUvMjAwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQm9vbCAgICBQVlVwZGF0ZU51bUludHJhTUJSZWZyZXNoKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCBudW1NQikKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisKKyAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPlJlZnJlc2ggPSBudW1NQjsKKworICAgIHJldHVybiBQVl9UUlVFOworfQorI2VuZGlmCisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWSUZyYW1lUmVxdWVzdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMTAvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBlbmNvZGVzIHRoZSBuZXh0IGJhc2UgZnJhbWUgYXMgYW4gSS1Wb3AgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWSUZyYW1lUmVxdWVzdChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKQoreworICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKKworICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKKworICAgIGlmIChlbmNEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKyAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCisgICAgICAgIHJldHVybiBQVl9GQUxTRTsKKworICAgIGVuY0RhdGEtPm5leHRFbmNJVm9wID0gMTsKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKyNlbmRpZgorI2lmbmRlZiBMSU1JVEVEX0FQSQorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEVuY01lbW9yeVVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEwLzE3LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgSW50IFBWR2V0RW5jTWVtb3J5VXNhZ2UoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKK3sKKyAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7CisKKyAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7CisKKyAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgcmV0dXJuIGVuY0RhdGEtPmVuY1BhcmFtcy0+TWVtb3J5VXNhZ2U7Cit9CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldEhpbnRUcmFjaygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDEvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldEhpbnRUcmFjayhWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBNUDRIaW50VHJhY2sgKmluZm8pCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGluZm8tPk1UQiA9IGVuY0RhdGEtPmhpbnRUcmFja0luZm8uTVRCOworICAgIGluZm8tPkxheWVySUQgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLkxheWVySUQ7CisgICAgaW5mby0+Q29kZVR5cGUgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLkNvZGVUeXBlOworICAgIGluZm8tPlJlZlNlbENvZGUgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLlJlZlNlbENvZGU7CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkdldE1heFZpZGVvRnJhbWVTaXplKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDcvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRnVuY3Rpb24gbWVyZWx5IHJldHVybnMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldE1heFZpZGVvRnJhbWVTaXplKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIEludCAqbWF4VmlkZW9GcmFtZVNpemUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisKKworICAgICptYXhWaWRlb0ZyYW1lU2l6ZSA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXTsKKworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMikKKyAgICAgICAgaWYgKCptYXhWaWRlb0ZyYW1lU2l6ZSA8IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSkKKyAgICAgICAgICAgICptYXhWaWRlb0ZyYW1lU2l6ZSA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXTsKKyAgICAqbWF4VmlkZW9GcmFtZVNpemUgPj49IDM7ICAgLyogQ29udmVydCB0byBCeXRlcyAqLworCisgICAgaWYgKCptYXhWaWRlb0ZyYW1lU2l6ZSA8PSA0MDAwKQorICAgICAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSA0MDAwOworCisgICAgcmV0dXJuIFBWX1RSVUU7Cit9CisjaWZuZGVmIExJTUlURURfQVBJCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWR2V0VkJWU2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xNS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGdW5jdGlvbiBtZXJlbHkgcmV0dXJucyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK09TQ0xfRVhQT1JUX1JFRiBCb29sIFBWR2V0VkJWU2l6ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKlZCVlNpemUpCit7CisgICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOworCisgICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOworCisgICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgKlZCVlNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF07CisgICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcy0+bkxheWVycyA9PSAyKQorICAgICAgICAqVkJWU2l6ZSArPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV07CisKKyAgICByZXR1cm4gUFZfVFJVRTsKKworfQorI2VuZGlmCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEVuY29kZVZPU19TdGFydCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBFbmNvZGVzIHRoZSBWT1MsVk8sIGFuZCBWT0wgb3IgU2hvcnQgSGVhZGVycyAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitQVl9TVEFUVVMgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworCisgICAgVmlkZW9FbmNEYXRhICp2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVyRGF0YTsKKyAgICBWb2wgICAgICAgICAqY3VyclZvbCA9IHZpZGVvLT52b2xbdmlkZW8tPmN1cnJMYXllcl07CisgICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX1NVQ0NFU1M7CisgICAgLy9pbnQgcHJvZmlsZV9sZXZlbD0weDAxOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtMTsKKyAgICBpbnQgaSwgajsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBDaGVjayBmb3Igc2hvcnRfdmlkZW9faGVhZGVyICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChjdXJyVm9sLT5zaG9ydFZpZGVvSGVhZGVyID09IDEpCisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogU2hvcnQgVmlkZW8gSGVhZGVyIG9yIE00ViAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVmlzdWFsT2JqZWN0U2VxdWVuY2UgKCkqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMzIsIFNFU1NJT05fU1RBUlRfQ09ERSk7CisgICAgICAgIC8qICBEZXRlcm1pbmUgcHJvZmlsZV9sZXZlbCAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsW3ZpZGVvLT5jdXJyTGF5ZXJdKTsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBWaXN1YWxPYmplY3QoKSAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqLworCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgMzIsIFZJU1VBTF9PQkpFQ1RfU1RBUlRfQ09ERSk7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7IC8qIHZpc3VhbCBvYmplY3QgaWRlbnRpZmllciAqLworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgMHgwMSk7IC8qIHZpc3VhbCBvYmplY3QgVHlwZSA9PSAidmlkZW8gSUQiICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7IC8qIG5vIHZpZGVvIHNpZ25hbCB0eXBlICovCisKKyAgICAgICAgLyp0ZW1wICAgPSAqLworICAgICAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7CisKKworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDI3LCBWT19TVEFSVF9DT0RFKTsvKiBieXRlIGFsaWduOiBzaG91bGQgYmUgMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCAweDAwKTsvKiAgVmlkZW8gSUQgPSAwICAqLworCisKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVmlkZW9PYmplY3RMYXllcigpICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlciA9PSAwKQorICAgICAgICB7IC8qIE00ViAgZWxzZSBTaG9ydCBWaWRlbyBIZWFkZXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUMTZCaXRzKHN0cmVhbSwgVk9MX1NUQVJUX0NPREVfTEVOR1RILCBWT0xfU1RBUlRfQ09ERSk7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgY3VyclZvbC0+dm9sSUQpOy8qICB2aWRlb19vYmplY3RfbGF5ZXJfaWQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7LyogIFJhbmRvbSBBY2Nlc3MgPSAwICAqLworCisgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA9PSAwKQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAweDAxKTsvKiBWaWRlbyBPYmplY3QgVHlwZSBJbmRpY2F0aW9uID0gMSAgLi4uIFNpbXBsZSBPYmplY3QgVHlwZSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAweDAyKTsvKiBWaWRlbyBPYmplY3QgVHlwZSBJbmRpY2F0aW9uID0gMiAgLi4uIFNpbXBsZSBTY2FsYWJsZSBPYmplY3QgVHlwZSAqLworCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qICBpc19vYmplY3RfbGF5ZXJfaWRlbnRpZmVyID0gMCAqLworCisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA0LCAweDAxKTsgLyogYXNwZWN0X3JhdGlvX2luZm8gPSAxIC4uLiAxOjEoU3F1YXJlKSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiB2b2xfY29udHJvbF9wYXJhbWV0ZXJzID0gMCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDIsIDB4MDApOy8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSA9IDAwIC4uLiByZWN0YW5ndWxhciAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDhCaXRzKHN0cmVhbSwgMTYsIGN1cnJWb2wtPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKTsvKiB2b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmZpeGVkVm9wUmF0ZSk7LyogZml4ZWRfdm9wX3JhdGUgPSAwICovCisKKyAgICAgICAgICAgIC8qIEZvciBSZWN0YW5ndWxhciBWTyBsYXllciBzaGFwZSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBtYXJrZXIgYml0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDhCaXRzKHN0cmVhbSwgMTMsIGN1cnJWb2wtPndpZHRoKTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDEzLCBjdXJyVm9sLT5oZWlnaHQpOy8qIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyptYXJrZXIgYml0ICovCisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7LyppbnRlcmxhY2VkID0gMCAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAxKTsvKiBvYm1jX2Rpc2FibGUgPSAxICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qIHNwcml0ZV9lbmFibGUgPSAwICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qIG5vdF84X2JpdCA9IDAgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+cXVhbnRUeXBlKTsvKiAgIHF1YW50X3R5cGUgKi8KKworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnF1YW50VHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmxvYWRJbnRyYVF1YW50TWF0KTsgLyogSW50cmEgcXVhbnQgbWF0cml4ICovCisgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWRJbnRyYVF1YW50TWF0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNjM7IGogPj0gMTsgai0tKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraildICE9IGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2krai0xKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaiA9PSAxKSAmJiAoY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStqKV0gPT0gY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStqLTEpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGogKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgY3VyclZvbC0+aXFtYXRbKih6aWd6YWdfaStpKV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaiA8IDYzKQorICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJWb2wtPmlxbWF0W2pdID0gbXBlZ19pcW1hdF9kZWZbal07CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5sb2FkTm9uSW50cmFRdWFudE1hdCk7IC8qIE5vbi1JbnRyYSBxdWFudCBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+bG9hZE5vbkludHJhUXVhbnRNYXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA2MzsgaiA+PSAxOyBqLS0pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2kraildICE9IGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2otMSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoKGogPT0gMSkgJiYgKGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2opXSA9PSBjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqLTEpXSkpCisgICAgICAgICAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGogKyAxOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2kraSldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPCA2MykKKyAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5uaXFtYXRbal0gPSBtcGVnX25xbWF0X2RlZltqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7ICAgLyogY29tcGxleGl0eV9lc3RpbWF0aW9uX2Rpc2FibGUgPSAxICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPlJlc3luY01hcmtlckRpc2FibGUpOy8qIFJlc3luY19tYXJrZXJfZGlzYWJsZSAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKTsvKiBEYXRhIHBhcnRpdGlvbmVkICovCisKKyAgICAgICAgICAgIGlmIChjdXJyVm9sLT5kYXRhUGFydGl0aW9uaW5nKQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+dXNlUmV2ZXJzZVZMQyk7IC8qIFJldmVyc2libGVfdmxjICovCisKKworICAgICAgICAgICAgaWYgKGN1cnJWb2wtPnNjYWxhYmlsaXR5KSAvKiBTY2FsYWJpbGl0eSovCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnNjYWxhYmlsaXR5KTsvKiBTY2FsYWJpbGl0eSA9IDEgKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnNjYWxUeXBlKTsvKiBoaWVyYXJjaHkgX3R5cGUgLi4uIFNwYXRpYWw9IDAgYW5kIFRlbXBvcmFsID0gMSAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA0LCBjdXJyVm9sLT5yZWZWb2xJRCk7LyogcmVmX2xheWVyX2lkICAqLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+cmVmU2FtcERpcik7LyogcmVmX2xheWVyX3NhbXBsaW5nX2RpcmVjKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgY3VyclZvbC0+aG9yU2FtcF9uKTsvKmhvcl9zYW1wbGluZ19mYWN0b3JfbiovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPmhvclNhbXBfbSk7Lypob3Jfc2FtcGxpbmdfZmFjdG9yX20qLworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT52ZXJTYW1wX24pOy8qdmVydF9zYW1wbGluZ19mYWN0b3JfbiovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPnZlclNhbXBfbSk7Lyp2ZXJ0X3NhbXBsaW5nX2ZhY3Rvcl9tKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPmVuaGFuY2VtZW50VHlwZSk7LyogZW5oYW5jZW1lbnRfdHlwZSovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIE5vIFNjYWxhYmlsaXR5ICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsYWJpbGl0eSk7LyogU2NhbGFiaWxpdHkgPSAwICovCisKKyAgICAgICAgICAgIC8qdGVtcCA9ICovCisgICAgICAgICAgICBCaXRzdHJlYW1NcGVnNEJ5dGVBbGlnblN0dWZmaW5nKHN0cmVhbSk7IC8qIEJ5dGUgYWxpZ24gSGVhZGVycyBmb3IgVk9QICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFZPU19FbmQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBWaXN1YWwgT2JqZWN0IFNlcXVlbmNlIEVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1BWX1NUQVRVUyBWT1NfRW5kKFZpZGVvRW5jQ29udHJvbHMgKmVuY29kZXJDb250cm9sKQoreworICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOworICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGE7CisgICAgVm9sICAgICAgICAgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOworICAgIEJpdHN0cmVhbUVuY1ZpZGVvICpzdHJlYW0gPSBjdXJyVm9sLT5zdHJlYW07CisKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCBTRVNTSU9OX0VORF9DT0RFLCAzMik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IERldGVybWluZUNvZGluZ0xheWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDYvMDIvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBGaW5kIGxheWVyIHRvIGNvZGUgYmFzZWQgb24gY3VycmVudCBtb2QgdGltZSwgYXNzdW1pbmcgdGhhdAorICAgICAgICAgICAgICAgaXQncyB0aW1lIHRvIGVuY29kZSBlbmhhbmNlZCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IE51bWJlciBvZiBsYXllciB0byBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitJbnQgRGV0ZXJtaW5lQ29kaW5nTGF5ZXIoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50ICpuTGF5ZXIsIFVMb25nIG1vZFRpbWUpCit7CisgICAgVm9sICoqdm9sID0gdmlkZW8tPnZvbDsKKyAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKKyAgICBJbnQgbnVtTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOworICAgIFVJbnQgbW9kVGltZVJlZiA9IHZpZGVvLT5tb2RUaW1lUmVmOworICAgIGZsb2F0ICpMYXllckZyYW1lUmF0ZSA9IGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGU7CisgICAgVUludCBmcmFtZU51bVs0XSwgZnJhbWVUaWNrOworICAgIFVMb25nIGZyYW1lTW9kVGltZSwgbmV4dEZybU1vZFRpbWU7CisjaWZkZWYgUkVEVUNFX0ZSQU1FX1ZBUklBTkNFICAgIC8qIFRvIGxpbWl0IGhvdyBjbG9zZSAyIGZyYW1lcyBjYW4gYmUgKi8KKyAgICBmbG9hdCBmcmFtZUludGVydmFsOworI2VuZGlmCisgICAgZmxvYXQgc3JjRnJhbWVJbnRlcnZhbDsKKyAgICBJbnQgZnJhbWVJbmM7CisgICAgSW50IGksIGV4dHJhX3NraXA7CisgICAgSW50IGVuY29kZVZvcCA9IDA7CisKKyAgICBpID0gbnVtTGF5ZXJzIC0gMTsKKworICAgIGlmIChtb2RUaW1lIC0gdmlkZW8tPm5leHRNb2RUaW1lID4gKChVTG9uZykoLTEpKSA+PiAxKSAvKiBuZXh0IHRpbWUgd3JhcHBlZCBhcm91bmQgKi8KKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vdCB0aW1lIHRvIGNvZGUgaXQgeWV0ICovCisKKyAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSAtPSAxMDAwOworICAgIHZpZGVvLT5uZXh0RW5jSVZvcC0tOyAgLyogbnVtYmVyIG9mIFZvcHMgaW4gaGlnaGVzdCBsYXllciByZXNvbHV0aW9uLiAqLworICAgIHZpZGVvLT5udW1Wb3BzSW5HT1ArKzsKKworICAgIC8qIGZyb20gdGhpcyBwb2ludCBmcmFtZU1vZFRpbWUgYW5kIG5leHRGcm1Nb2RUaW1lIGFyZSBpbnRlcm5hbCAqLworCisgICAgZnJhbWVOdW1baV0gPSAoVUludCkoKG1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIExheWVyRnJhbWVSYXRlW2ldICsgNTAwKSAvIDEwMDA7CisgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2ldKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bVtpXSA9IGZyYW1lTnVtW2ldIC0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnJhbWVOdW1baV0gPD0gdmlkZW8tPnByZXZGcmFtZU51bVtpXSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAvKiBkbyBub3QgZW5jb2RlIHRoaXMgZnJhbWUgKi8KKyAgICB9CisKKyAgICAvKioqKiB0aGlzIHBhcnQgY29tcHV0ZXMgZXhwZWN0ZWQgbmV4dCBmcmFtZSAqKioqKioqLworICAgIGZyYW1lTW9kVGltZSA9IChVTG9uZykoKChmcmFtZU51bVtpXSAqIDEwMDApIC8gTGF5ZXJGcmFtZVJhdGVbaV0pICsgbW9kVGltZVJlZiArIDAuNSk7IC8qIHJlYy4gdGltZSAqLworICAgIG5leHRGcm1Nb2RUaW1lID0gKFVMb25nKSgoKChmcmFtZU51bVtpXSArIDEpICogMTAwMCkgLyBMYXllckZyYW1lUmF0ZVtpXSkgKyBtb2RUaW1lUmVmICsgMC41KTsgLyogcmVjLiB0aW1lICovCisKKyAgICBzcmNGcmFtZUludGVydmFsID0gMTAwMCAvIHZpZGVvLT5GcmFtZVJhdGU7CisKKyAgICB2aWRlby0+bmV4dE1vZFRpbWUgPSBuZXh0RnJtTW9kVGltZSAtIChVTG9uZykoc3JjRnJhbWVJbnRlcnZhbCAvIDIuKSAtIDE7IC8qIGJldHdlZW4gY3VycmVudCBhbmQgbmV4dCBmcmFtZSAqLworCisjaWZkZWYgUkVEVUNFX0ZSQU1FX1ZBUklBTkNFICAgIC8qIFRvIGxpbWl0IGhvdyBjbG9zZSAyIGZyYW1lcyBjYW4gYmUgKi8KKyAgICBmcmFtZUludGVydmFsID0gMTAwMCAvIExheWVyRnJhbWVSYXRlW2ldOyAvKiBuZXh0IHJlYy4gdGltZSAqLworICAgIGRlbHRhID0gKEludCkoZnJhbWVJbnRlcnZhbCAvIDQpOyAvKiBlbXBpcmljYWwgbnVtYmVyICovCisgICAgaWYgKHZpZGVvLT5uZXh0TW9kVGltZSAtIG1vZFRpbWUgIDwgKFVMb25nKWRlbHRhKSAvKiBuZWVkIHRvIG1vdmUgbmV4dE1vZFRpbWUgZnVydGhlci4gKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5uZXh0TW9kVGltZSArPSAoKGRlbHRhIC0gdmlkZW8tPm5leHRNb2RUaW1lICsgbW9kVGltZSkpOyAvKiBlbXBpcmljYWwgZm9ybXVsYSAgKi8KKyAgICB9CisjZW5kaWYKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIG1hcCBmcmFtZSBuby50byB0aWNrIGZyb20gbW9kVGltZVJlZiAqLworICAgIC8qZnJhbWVUaWNrID0gKGZyYW1lTnVtW2ldKnZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24pIDsKKyAgICBmcmFtZVRpY2sgPSAoVUludCkoKGZyYW1lVGljayArIChlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldLzIpKS9lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsqLworICAgIC8qICAxMS8xNi8wMSwgY2hhbmdlIGZyYW1lVGljayB0byBiZSB0aGUgY2xvc2VzdCB0aWNrIGZyb20gdGhlIGFjdHVhbCBtb2RUaW1lICovCisgICAgLyogIDEyLzEyLzAyLCBhZGQgKGRvdWJsZSkgdG8gcHJldmVudCBsYXJnZSBudW1iZXIgd3JhcC1hcm91bmQgKi8KKyAgICBmcmFtZVRpY2sgPSAoSW50KSgoKGRvdWJsZSkobW9kVGltZSAtIG1vZFRpbWVSZWYpICogdm9sW2ldLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiArIDUwMCkgLyAxMDAwKTsKKworICAgIC8qIGZpbmQgdGltZUluY3JlbWVudCB0byBiZSBwdXQgaW4gdGhlIGJpdHN0cmVhbSAqLworICAgIC8qIHJlZlRpY2sgaXMgc2Vjb25kIGJvdW5kYXJ5IHJlZmVyZW5jZS4gKi8KKyAgICB2b2xbaV0tPnRpbWVJbmNyZW1lbnQgPSBmcmFtZVRpY2sgLSB2aWRlby0+cmVmVGlja1tpXTsKKworCisgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSA9IDA7CisgICAgd2hpbGUgKHZvbFtpXS0+dGltZUluY3JlbWVudCA+PSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKQorICAgIHsKKyAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50IC09IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb247CisgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UrKzsKKyAgICAgICAgLyogZG8gbm90IHVwZGF0ZSByZWZUaWNrIGFuZCBtb2RUaW1lUmVmIHlldCwgZG8gaXQgYWZ0ZXIgZW5jb2RpbmchISAqLworICAgIH0KKworICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAwKSAgICAvKiBubyBza2lwcGluZyAqLworICAgIHsKKyAgICAgICAgZW5jb2RlVm9wID0gMTsKKyAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9ICpuTGF5ZXIgPSBpOworICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPSAxMDAwOworCisgICAgICAgIC8qIHRha2VzIGNhcmUgb2YgbW9yZSBkcm9wcGVkIGZyYW1lIHRoYW4gZXhwZWN0ZWQgKi8KKyAgICAgICAgZXh0cmFfc2tpcCA9IC0xOworICAgICAgICBmcmFtZUluYyA9IChmcmFtZU51bVtpXSAtIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pOworICAgICAgICBleHRyYV9za2lwICs9IGZyYW1lSW5jOworCisgICAgICAgIGlmIChleHRyYV9za2lwID4gMCkKKyAgICAgICAgeyAgIC8qIHVwZGF0ZSByYy0+TnIsIHJjLT5CLCAocmMtPlJyKSovCisgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgLT0gZXh0cmFfc2tpcDsKKyAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgKz0gZXh0cmFfc2tpcDsKKyAgICAgICAgICAgIGlmIChlbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSQ19VcGRhdGVCdWZmZXIodmlkZW8sIGksIGV4dHJhX3NraXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisgICAgLyogdXBkYXRlIGZyYW1lIG5vLiAqLworICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXTsKKworICAgIC8qIGdvIHRocm91Z2ggYWxsIGxvd2VyIGxheWVyICovCisgICAgZm9yIChpID0gKG51bUxheWVycyAtIDIpOyBpID49IDA7IGktLSkKKyAgICB7CisKKyAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gLT0gMTAwMDsKKworICAgICAgICAvKiBmaW5kIHRpbWVJbmNyZW1lbnQgdG8gYmUgcHV0IGluIHRoZSBiaXRzdHJlYW0gKi8KKyAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50ID0gZnJhbWVUaWNrIC0gdmlkZW8tPnJlZlRpY2tbaV07CisKKyAgICAgICAgaWYgKHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2ldIDw9IDApIC8qIHRpbWUgdG8gZW5jb2RlIGJhc2UgKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyogMTIvMjcvMDAgKi8KKyAgICAgICAgICAgIGVuY29kZVZvcCA9IDE7CisgICAgICAgICAgICB2aWRlby0+Y3VyckxheWVyID0gKm5MYXllciA9IGk7CisgICAgICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPQorICAgICAgICAgICAgICAgIChJbnQpKCgxMDAwLjAgKiBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW251bUxheWVycy0xXSkgLyBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsKKworICAgICAgICAgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodm9sW2ldLT50aW1lSW5jcmVtZW50ID49IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdm9sW2ldLT50aW1lSW5jcmVtZW50IC09IHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb247CisgICAgICAgICAgICAgICAgdm9sW2ldLT5tb2R1bG9UaW1lQmFzZSsrOworICAgICAgICAgICAgICAgIC8qIGRvIG5vdCB1cGRhdGUgcmVmVGljayBhbmQgbW9kVGltZVJlZiB5ZXQsIGRvIGl0IGFmdGVyIGVuY29kaW5nISEgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdGFrZXMgY2FyZSBvZiBtb3JlIGRyb3BwZWQgZnJhbWUgdGhhbiBleHBlY3RlZCAqLworICAgICAgICAgICAgZnJhbWVOdW1baV0gPSAoVUludCkoKGZyYW1lTW9kVGltZSAtIG1vZFRpbWVSZWYpICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2ldKQorICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXSAtIDE7CisKKyAgICAgICAgICAgIGV4dHJhX3NraXAgPSAtMTsKKyAgICAgICAgICAgIGZyYW1lSW5jID0gKGZyYW1lTnVtW2ldIC0gdmlkZW8tPnByZXZGcmFtZU51bVtpXSk7CisgICAgICAgICAgICBleHRyYV9za2lwICs9IGZyYW1lSW5jOworCisgICAgICAgICAgICBpZiAoZXh0cmFfc2tpcCA+IDApCisgICAgICAgICAgICB7ICAgLyogdXBkYXRlIHJjLT5OciwgcmMtPkIsIChyYy0+UnIpKi8KKyAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSQ19VcGRhdGVCdWZmZXIodmlkZW8sIGksIGV4dHJhX3NraXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHVwZGF0ZSBmcmFtZSBuby4gKi8KKyAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgaWYgKGVuY29kZVZvcCkKKyAgICAgICAgcHJpbnRmKCIgVEk6ICVkICIsIHZvbFsqbkxheWVyXS0+dGltZUluY3JlbWVudCk7CisjZW5kaWYKKworICAgIHJldHVybiBlbmNvZGVWb3A7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogRGV0ZXJtaW5lVm9wVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF0ZSAgICAgOiAwNi8wMi8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQdXJwb3NlICA6IFRoZSBuYW1lIHNheXMgaXQgYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiB2b2lkIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKwordm9pZCBEZXRlcm1pbmVWb3BUeXBlKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIpCit7CisgICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7CisvLyAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworCisgICAgaWYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gMCkgLyogSS1WT1BzIG9ubHkgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+Y3VyckxheWVyID4gMCkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgaWYgKHZpZGVvLT5udW1Wb3BzSW5HT1AgPj0gMTMyKQorICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gLTEpICAvKiBJUFBQUFAuLi4gKi8KKyAgICB7CisKKyAgICAgICAgLyogbWFpbnRhaW4gZnJhbWUgdHlwZSBpZiBwcmV2aW91cyBmcmFtZSBpcyBwcmUtc2tpcHBlZCwgMDYvMDIvMjAwMSAqLworICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EgfHwgdmlkZW8tPnJjW2N1cnJMYXllcl0tPnNraXBfbmV4dF9mcmFtZSAhPSAtMSkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworCisgICAgICAgIGlmICh2aWRlby0+Y3VyckxheWVyID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgvKnZpZGVvLT5udW1Wb3BzSW5HT1A+PTEzMiB8fCAqL3ZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CisgICAgICAgICAgICAgICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7IC8qIGZvcmNlIElOVFJBIHVwZGF0ZSBldmVyeSAxMzIgYmFzZSBmcmFtZXMqLworICAgICAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+bmV4dEVuY0lWb3AgPT0gMCB8fCB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgLyogSW50cmFQZXJpb2Q+MCA6IElQUFBQUElQUFBQUEkuLi4gKi8KKyAgICB7CisKKyAgICAgICAgLyogbWFpbnRhaW4gZnJhbWUgdHlwZSBpZiBwcmV2aW91cyBmcmFtZSBpcyBwcmUtc2tpcHBlZCwgMDYvMDIvMjAwMSAqLworICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlID09IENPTlNUQU5UX1EgfHwgdmlkZW8tPnJjW2N1cnJMYXllcl0tPnNraXBfbmV4dF9mcmFtZSAhPSAtMSkKKyAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IFBfVk9QOworCisgICAgICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5uZXh0RW5jSVZvcCA8PSAwIHx8IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOworICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBVcGRhdGVTa2lwTmV4dEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDA2LzAyLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogRnJvbSByYXRlIGNvbnRyb2wgZnJhbWUgc2tpcHBpbmcgZGVjaXNpb24sIHVwZGF0ZSB0aW1pbmcKKyAgICAgICAgICAgICAgICByZWxhdGVkIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBDdXJyZW50IGNvZGVkIGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworSW50IFVwZGF0ZVNraXBOZXh0RnJhbWUoVmlkZW9FbmNEYXRhICp2aWRlbywgVUxvbmcgKm1vZFRpbWUsIEludCAqc2l6ZSwgUFZfU1RBVFVTIHN0YXR1cykKK3sKKyAgICBJbnQgY3VyckxheWVyID0gdmlkZW8tPmN1cnJMYXllcjsKKyAgICBJbnQgbkxheWVyID0gY3VyckxheWVyOworICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOworICAgIEludCBudW1MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7CisgICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOworICAgIFZvbCAqKnZvbCA9IHZpZGVvLT52b2w7CisgICAgSW50IG51bV9za2lwLCBleHRyYV9za2lwOworICAgIEludCBpOworICAgIFVJbnQgbmV3UmVmVGljaywgZGVsdGFNb2RUaW1lOworICAgIFVJbnQgdGVtcDsKKworICAgIGlmIChlbmNQYXJhbXMtPlJDX1R5cGUgIT0gQ09OU1RBTlRfUSkKKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVswXSAmJiBjdXJyTGF5ZXIgPT0gMCkgIC8qIGFsd2F5cyBlbmNvZGUgdGhlIGZpcnN0IGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFJDX1Jlc2V0U2tpcE5leHRGcmFtZSh2aWRlbywgY3VyckxheWVyKTsKKyAgICAgICAgICAgIC8vcmV0dXJuIGN1cnJMYXllcjsgIDA5LzE1LzA1CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoUkNfR2V0U2tpcE5leHRGcmFtZSh2aWRlbywgY3VyckxheWVyKSA8IDAgfHwgc3RhdHVzID09IFBWX0VORF9PRl9CVUYpICAgLyogU2tpcCBDdXJyZW50IEZyYW1lICovCisgICAgICAgICAgICB7CisKKyNpZmRlZiBfUFJJTlRfU1RBVAorICAgICAgICAgICAgICAgIHByaW50ZigiU2tpcCBjdXJyZW50IGZyYW1lIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjdXJyVm9sLT5tb2R1bG9UaW1lQmFzZSA9IGN1cnJWb2wtPnByZXZNb2R1bG9UaW1lQmFzZTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogcHJlcGFyZSB0byByZXR1cm4gKi8KKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpzaXplID0gMDsgIC8qIFNldCBCaXRzdHJlYW0gYnVmZmVyIHRvIHplcm8gKi8KKworICAgICAgICAgICAgICAgIC8qIERldGVybWluZSBuTGF5ZXIgYW5kIG1vZFRpbWUgZm9yIG5leHQgZW5jb2RlICovCisKKyAgICAgICAgICAgICAgICAqbW9kVGltZSA9IHZpZGVvLT5uZXh0TW9kVGltZTsKKyAgICAgICAgICAgICAgICBuTGF5ZXIgPSAtMTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuTGF5ZXI7IC8qIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IHVwZGF0aW5nIFJlZlRpY2sgJiBtb2RUaW1lUmVmICovCisgICAgICAgICAgICAgICAgLyogSWYgSS1WT1Agd2FzIGF0dGVtcHRlZCwgdGhlbiBlbnN1cmUgbmV4dCBiYXNlIGlzIEktVk9QICovCisgICAgICAgICAgICAgICAgLyppZigoZW5jUGFyYW1zLT5JbnRyYVBlcmlvZD4wKSAmJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKSkKKyAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAwOyBjb21tZW50ZWQgb3V0IGJ5IDA2LzA1LzAxICovCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChudW1fc2tpcCA9IFJDX0dldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcikpID4gMCkKKyAgICAgICAgICAgIHsKKworI2lmZGVmIF9QUklOVF9TVEFUCisgICAgICAgICAgICAgICAgcHJpbnRmKCJTa2lwIG5leHQgJWQgZnJhbWVzIiwgbnVtX3NraXApOworI2VuZGlmCisgICAgICAgICAgICAgICAgLyogdG8ga2VlcCB0aGUgTnIgb2YgZW5oIGxheWVyIHRoZSBzYW1lICovCisgICAgICAgICAgICAgICAgLyogYWRqdXN0IHJlbExheWVyQ29kZVRpbWUgb25seSwgZG8gbm90IGFkanVzdCBsYXllckNvZGVUaW1lW251bUxheWVycy0xXSAqLworICAgICAgICAgICAgICAgIGV4dHJhX3NraXAgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyTGF5ZXI7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAxMDAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9za2lwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gY3VyckxheWVyOyBpIDwgbnVtTGF5ZXJzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSArPSAobnVtX3NraXAgKyBleHRyYV9za2lwKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSW50KSgoMTAwMC4wICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtudW1MYXllcnMtMV0pIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS8qIGZpcnN0IGZyYW1lICovCisgICAgfQorICAgIC8qKioqKiAgY3VycmVudCBmcmFtZSBpcyBlbmNvZGVkLCBub3cgdXBkYXRlIHJlZlRpY2sgKioqKioqLworCisgICAgdmlkZW8tPnJlZlRpY2tbY3VyckxheWVyXSArPSB2b2xbY3VyckxheWVyXS0+cHJldk1vZHVsb1RpbWVCYXNlICogdm9sW2N1cnJMYXllcl0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOworCisgICAgLyogUmVzZXQgbGF5ZXJDb2RlVGltZSBldmVyeSBJLVZPUCB0byBwcmV2ZW50IG92ZXJmbG93ICovCisgICAgaWYgKGN1cnJMYXllciA9PSAwKQorICAgIHsKKyAgICAgICAgLyogIDEyLzEyLzAyLCBmaXggZm9yIHdlaXJkIHRhcmdlciBmcmFtZSByYXRlIG9mIDkuOTkgZnBzIG9yIDMuMzMgZnBzICovCisgICAgICAgIGlmICgoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgIT0gMCkgLyomJiAodmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlPT1JX1ZPUCkqLykgfHwKKyAgICAgICAgICAgICAgICAoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2QgPT0gMCkgJiYgKHZpZGVvLT5udW1Wb3BzSW5HT1AgPT0gMCkpKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdSZWZUaWNrID0gdmlkZW8tPnJlZlRpY2tbMF07CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBudW1MYXllcnM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnJlZlRpY2tbaV0gPCBuZXdSZWZUaWNrKQorICAgICAgICAgICAgICAgICAgICBuZXdSZWZUaWNrID0gdmlkZW8tPnJlZlRpY2tbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB1cGRhdGUgaXMgaW50ZWdlciBtdWx0aXBsZSBvZiBmcmFtZSBudW1iZXIgKi8KKyAgICAgICAgICAgIC8qIGhvdyBtYW55IG1zZWMgZWxhcHNlZCBmcm9tIGxhc3QgbW9kVGltZVJlZiAqLworICAgICAgICAgICAgZGVsdGFNb2RUaW1lID0gKG5ld1JlZlRpY2sgLyB2b2xbMF0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSAqIDEwMDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IG51bUxheWVycyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSAoVUludCkoZGVsdGFNb2RUaW1lICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7IC8qIDEyLzEyLzAyICovCisgICAgICAgICAgICAgICAgaWYgKHRlbXAgJSAxMDAwKQorICAgICAgICAgICAgICAgICAgICBuZXdSZWZUaWNrID0gMDsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld1JlZlRpY2sgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tb2RUaW1lUmVmICs9IGRlbHRhTW9kVGltZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBudW1MYXllcnMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gLT0gKFVJbnQpKGRlbHRhTW9kVGltZSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pIC8gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnJlZlRpY2tbaV0gLT0gbmV3UmVmVGljazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqbW9kVGltZSA9ICB2aWRlby0+bmV4dE1vZFRpbWU7CisKKyAgICByZXR1cm4gbkxheWVyOworfQorCisKKyNpZm5kZWYgT1JJR0lOQUxfVkVSU0lPTgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFNldFByb2ZpbGVfQnVmZmVyU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMDQvMDgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTZXQgcHJvZmlsZSBhbmQgdmlkZW8gYnVmZmVyIHNpemUsIGNvcGllZCBmcm9tIEppbSdzIGNvZGUgICAgKi8KKy8qICAgICAgICAgICAgIGluIFBWSW5pdFZpZGVvRW5jb2RlciguKSwgc2luY2Ugd2UgaGF2ZSBkaWZmZXJlbnQgcGxhY2VzICAgICAqLworLyogICAgICAgICAgICAgdG8gcmVzZXQgcHJvZmlsZSBhbmQgdmlkZW8gYnVmZmVyIHNpemUgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitCb29sIFNldFByb2ZpbGVfQnVmZmVyU2l6ZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBmbG9hdCBkZWxheSwgSW50IGJJbml0aWFsaXplZCkKK3sKKyAgICBJbnQgaSwgaiwgc3RhcnQsIGVuZDsKKy8vICBJbnQgQmFzZU1Cc1BlclNlYyA9IDAsIEVuaE1Cc1BlclNlYyA9IDA7CisgICAgSW50IG5Ub3RhbE1CID0gMDsKKyAgICBJbnQgaWR4LCB0ZW1wX3csIHRlbXBfaCwgbWF4ID0gMCwgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0OworCisgICAgSW50IG5MYXllcnMgPSB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyAvKiBOdW1iZXIgb2YgTGF5ZXJzIHRvIGJlIGVuY29kZWQgKi8KKworICAgIEludCB0b3RhbF9iaXRyYXRlID0gMCwgYmFzZV9iaXRyYXRlOworICAgIEludCB0b3RhbF9wYWNrZXRfc2l6ZSA9IDAsIGJhc2VfcGFja2V0X3NpemU7CisgICAgSW50IHRvdGFsX01Cc1BlclNlYyA9IDAsIGJhc2VfTUJzUGVyU2VjOworICAgIEludCB0b3RhbF9WQlZfc2l6ZSA9IDAsIGJhc2VfVkJWX3NpemUsIGVuaGFuY2VfVkJWX3NpemUgPSAwOworICAgIGZsb2F0IHRvdGFsX2ZyYW1lcmF0ZSwgYmFzZV9mcmFtZXJhdGU7CisgICAgZmxvYXQgdXBwZXJfYm91bmRfcmF0aW87CisgICAgSW50IGJGb3VuZCA9IDA7CisgICAgSW50IGsgPSAwLCB3aWR0aDE2LCBoZWlnaHQxNiwgaW5kZXg7CisgICAgSW50IGxvd2VzdF9sZXZlbDsKKworI2RlZmluZSBNSU5fQlVGRiAgICAxNjAwMCAvKiAxNmsgbWluaW11bSBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBCVUZGX0NPTlNUICAyLjAgICAgLyogMjAwMG1zICovCisjZGVmaW5lIFVQUEVSX0JPVU5EX1JBVElPIDguNTQgLyogdXBwZXJfYm91bmQgPSAxLjQqKDEuMStib3VuZC8xMCkqYml0cmF0ZS9mcmFtZXJhdGUgKi8KKworI2RlZmluZSBRQ0lGX1dJRFRIICAxNzYKKyNkZWZpbmUgUUNJRl9IRUlHSFQgMTQ0CisKKyAgICBpbmRleCA9IHZpZGVvLT5lbmNQYXJhbXMtPnByb2ZpbGVfdGFibGVfaW5kZXg7CisKKyAgICAvKiBDYWxjdWxhdGUgIm5Ub3RhbE1CIiAqLworICAgIC8qIEZpbmQgdGhlIG1heGltdW0gd2lkdGgqaGVpZ2h0IGZvciBtZW1vcnkgYWxsb2NhdGlvbiBvZiB0aGUgVk9QcyAqLworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCisgICAgeworICAgICAgICB0ZW1wX3cgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllcldpZHRoW2lkeF07CisgICAgICAgIHRlbXBfaCA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0W2lkeF07CisKKyAgICAgICAgaWYgKCh0ZW1wX3cqdGVtcF9oKSA+IG1heCkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4ID0gdGVtcF93ICogdGVtcF9oOworICAgICAgICAgICAgbWF4X3dpZHRoID0gdGVtcF93OworICAgICAgICAgICAgbWF4X2hlaWdodCA9IHRlbXBfaDsKKyAgICAgICAgICAgIG5Ub3RhbE1CID0gKChtYXhfd2lkdGggKyAxNSkgPj4gNCkgKiAoKG1heF9oZWlnaHQgKyAxNSkgPj4gNCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdXBwZXJfYm91bmRfcmF0aW8gPSAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfTE9XREVMQVkgPyAoZmxvYXQpNS4wIDogKGZsb2F0KVVQUEVSX0JPVU5EX1JBVElPKTsKKworCisgICAgLyogR2V0IHRoZSBiYXNpYyBpbmZvcm1hdGlvbjogYml0cmF0ZSwgcGFja2V0X3NpemUsIE1Ccy9zIGFuZCBWQlZfc2l6ZSAqLworICAgIGJhc2VfYml0cmF0ZSAgICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMF07CisgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSAhPSAwKSAvKiB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCBtZWFucyBpdCBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgeworICAgICAgICBiYXNlX2JpdHJhdGUgICAgPSBQVl9NQVgoYmFzZV9iaXRyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0pOworICAgIH0KKyAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLworICAgIHsKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF07CisgICAgfQorCisgICAgYmFzZV9mcmFtZXJhdGUgICAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOworICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSAhPSAwKQorICAgIHsKKyAgICAgICAgYmFzZV9mcmFtZXJhdGUgID0gUFZfTUFYKGJhc2VfZnJhbWVyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSk7CisgICAgfQorICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCisgICAgeworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdIC8gblRvdGFsTUI7CisgICAgfQorCisgICAgYmFzZV9wYWNrZXRfc2l6ZSAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPlJlc3luY1BhY2tldHNpemU7CisgICAgYmFzZV9NQnNQZXJTZWMgICAgICA9IChJbnQpKGJhc2VfZnJhbWVyYXRlICogblRvdGFsTUIpOworICAgIGJhc2VfVkJWX3NpemUgICAgICAgPSBQVl9NQVgoKEludCkoYmFzZV9iaXRyYXRlICogZGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludCkodXBwZXJfYm91bmRfcmF0aW8gKiBiYXNlX2JpdHJhdGUgLyBiYXNlX2ZyYW1lcmF0ZSkpOworICAgIGJhc2VfVkJWX3NpemUgICAgICAgPSBQVl9NQVgoYmFzZV9WQlZfc2l6ZSwgTUlOX0JVRkYpOworCisgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplLCB3ZSdsbCBjbGlwIGl0ICovCisgICAgaWYgKGJhc2VfVkJWX3NpemUgPiBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs1XSkKKyAgICAgICAgYmFzZV9WQlZfc2l6ZSA9IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzVdOworCisKKyAgICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZ2l2ZW4gdGhlIG1heGltdW0gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KKyAgICBpZiAobkxheWVycyA9PSAxICYmIGJhc2VfVkJWX3NpemUgPiBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisgICAgICAgIHJldHVybiBGQUxTRTsKKworCisgICAgaWYgKG5MYXllcnMgPT0gMikKKyAgICB7CisgICAgICAgIHRvdGFsX2JpdHJhdGUgICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMV07CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxfYml0cmF0ZSAgID0gUFZfTUlOKHRvdGFsX2JpdHJhdGUsIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvKiBpZiB0aGUgbWF4IGlzIG5vdCBzZXQsIHNldCBpdCB0byB0aGUgc3BlY2lmaWVkIHByb2ZpbGUvbGV2ZWwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF07CisgICAgICAgIH0KKworICAgICAgICB0b3RhbF9mcmFtZXJhdGUgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbMV07CisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0b3RhbF9mcmFtZXJhdGUgICAgID0gUFZfTUlOKHRvdGFsX2ZyYW1lcmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdID0gKGZsb2F0KXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpbmRleF0gLyBuVG90YWxNQjsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOworICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgID0gKEludCkodG90YWxfZnJhbWVyYXRlICogblRvdGFsTUIpOworCisgICAgICAgIGVuaGFuY2VfVkJWX3NpemUgICAgPSBQVl9NQVgoKEludCkoKHRvdGFsX2JpdHJhdGUgLSBiYXNlX2JpdHJhdGUpICogZGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnQpKHVwcGVyX2JvdW5kX3JhdGlvICogKHRvdGFsX2JpdHJhdGUgLSBiYXNlX2JpdHJhdGUpIC8gKHRvdGFsX2ZyYW1lcmF0ZSAtIGJhc2VfZnJhbWVyYXRlKSkpOworICAgICAgICBlbmhhbmNlX1ZCVl9zaXplICAgID0gUFZfTUFYKGVuaGFuY2VfVkJWX3NpemUsIE1JTl9CVUZGKTsKKworICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgID0gYmFzZV9WQlZfc2l6ZSArIGVuaGFuY2VfVkJWX3NpemU7CisKKyAgICAgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplLCB3ZSdsbCBjbGlwIGl0ICovCisgICAgICAgIGlmICh0b3RhbF9WQlZfc2l6ZSA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzZdKQorICAgICAgICB7CisgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSA9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplWzZdOworICAgICAgICAgICAgZW5oYW5jZV9WQlZfc2l6ZSA9IHRvdGFsX1ZCVl9zaXplIC0gYmFzZV9WQlZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGlmIHRoZSBidWZmZXIgZXhjZWVkcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSBnaXZlbiB0aGUgbWF4aW11bSBwcm9maWxlIGFuZCBsZXZlbCAqLworICAgICAgICBpZiAodG90YWxfVkJWX3NpemUgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyAgICBpZiAoIWJJbml0aWFsaXplZCkgLyogSGFzIGJlZW4gaW5pdGlhbGl6ZWQgLS0+IHByb2ZpbGUgQCBsZXZlbCBoYXMgYmVlbiBmaWd1cmVkIG91dCEgKi8KKyAgICB7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPSBiYXNlX1ZCVl9zaXplOworICAgICAgICBpZiAobkxheWVycyA+IDEpCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdID0gZW5oYW5jZV9WQlZfc2l6ZTsKKworICAgICAgICByZXR1cm4gUFZfVFJVRTsKKyAgICB9CisKKworICAgIC8qIFByb2ZpbGUgQCBsZXZlbCBkZXRlcm1pbmF0aW9uICovCisgICAgaWYgKG5MYXllcnMgPT0gMSkKKyAgICB7CisgICAgICAgIC8qIEJBU0UgT05MWSA6IFNpbXBsZSBQcm9maWxlKFNQKSBPciBDb3JlIFByb2ZpbGUoQ1ApICovCisgICAgICAgIGlmIChiYXNlX2JpdHJhdGUgICAgID4gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0gICAgIHx8CisgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSA+IHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2luZGV4XSB8fAorICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgPiBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdICAgfHwKKyAgICAgICAgICAgICAgICBiYXNlX1ZCVl9zaXplICAgID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQorCisgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIEJleW9uZCB0aGUgYm91bmQgb2YgQ29yZSBQcm9maWxlIEAgTGV2ZWwyICovCisKKyAgICAgICAgLyogRm9yIEgyNjMvU2hvcnQgaGVhZGVyLCBkZXRlcm1pbmUgayoxNjM4NCAqLworICAgICAgICB3aWR0aDE2ICA9ICgodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFswXSArIDE1KSA+PiA0KSA8PCA0OworICAgICAgICBoZWlnaHQxNiA9ICgodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbMF0gKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKKyAgICAgICAgeworICAgICAgICAgICAgayA9IDQ7CisgICAgICAgICAgICBpZiAod2lkdGgxNiAgPT0gMipRQ0lGX1dJRFRIICYmIGhlaWdodDE2ID09IDIqUUNJRl9IRUlHSFQpICAvKiBDSUYgKi8KKyAgICAgICAgICAgICAgICBrID0gMTY7CisKKyAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoMTYgID09IDQqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSA0KlFDSUZfSEVJR0hUKSAgLyogNENJRiAqLworICAgICAgICAgICAgICAgIGsgPSAzMjsKKworICAgICAgICAgICAgZWxzZSBpZiAod2lkdGgxNiAgPT0gOCpRQ0lGX1dJRFRIICYmIGhlaWdodDE2ID09IDgqUUNJRl9IRUlHSFQpICAvKiAxNkNJRiAqLworICAgICAgICAgICAgICAgIGsgPSA2NDsKKworICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+bWF4RnJhbWVTaXplICA9IGsgKiAxNjM4NDsKKworICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBidWZmZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIHRoZSB0b3AgcHJvZmlsZSBhbmQgbGV2ZWw6IHRoZSBDb3JlIHByb2ZpbGUgYW5kIGxldmVsIDIgKi8KKyAgICAgICAgICAgIGlmIChiYXNlX1ZCVl9zaXplID4gKEludCkoayoxNjM4NCArIDQqKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbNV0qMTAwMS4wIC8gMzAwMDAuMCkpCisgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSA9IChJbnQpKGsgKiAxNjM4NCArIDQgKiAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVs1XSAqIDEwMDEuMCAvIDMwMDAwLjApOworCisgICAgICAgICAgICBpZiAoYmFzZV9WQlZfc2l6ZSA+IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2luZGV4XSoxMDAxLjAgLyAzMDAwMC4wKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZWFyY2ggdGhlIGFwcHJvcHJpYXRlIHByb2ZpbGVAbGV2ZWwgaW5kZXggKi8KKyAgICAgICAgaWYgKCF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYKKyAgICAgICAgICAgICAgICAodmlkZW8tPmVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociAhPSAwIHx8IHZpZGVvLT5lbmNQYXJhbXMtPlNlYXJjaFJhbmdlID4gMTYpKQorICAgICAgICB7CisgICAgICAgICAgICBsb3dlc3RfbGV2ZWwgPSAxOyAvKiBjYW5ub3QgYWxsb3cgU1BMMCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbG93ZXN0X2xldmVsID0gMDsgLyogU1BMMCAqLworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gbG93ZXN0X2xldmVsOyBpIDw9IGluZGV4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDQgJiYgLyogc2tpcCBDb3JlIFByb2ZpbGVATGV2ZWwxIGJlY2F1c2UgdGhlIHBhcmFtZXRlcnMgaW4gaXQgYXJlIHNtYWxsZXIgdGhhbiB0aG9zZSBpbiBTaW1wbGUgUHJvZmlsZUBMZXZlbDMgKi8KKyAgICAgICAgICAgICAgICAgICAgYmFzZV9iaXRyYXRlICAgICA8PSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldICAgICAmJgorICAgICAgICAgICAgICAgICAgICBiYXNlX3BhY2tldF9zaXplIDw9IHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2ldICYmCisgICAgICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2ldICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICA8PSAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkID8gKEludCkoayoxNjM4NCArIDQqKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0qMTAwMS4wIC8gMzAwMDAuMCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpXSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPiBpbmRleCkgcmV0dXJuIFBWX0ZBTFNFOyAvKiBOb3RoaW5nIGZvdW5kISEgKi8KKworICAgICAgICAvKiBGb3VuZCBvdXQgdGhlIGFjdHVhbCBwcm9maWxlIEAgbGV2ZWwgOiBpbmRleCAiaSIgKi8KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRm9yIFNpbXBsZSBQcm9maWxlIEAgTGV2ZWwgMCwgd2UgbmVlZCB0byBkbyBvbmUgbW9yZSBjaGVjazogaW1hZ2Ugc2l6ZSA8PSBRQ0lGICovCisgICAgICAgICAgICBpZiAod2lkdGgxNiA+IFFDSUZfV0lEVEggfHwgaGVpZ2h0MTYgPiBRQ0lGX0hFSUdIVCkKKyAgICAgICAgICAgICAgICBpID0gMTsgLyogaW1hZ2Ugc2l6ZSA+IFFDSUYsIHRoZW4gc2V0IFNQIGxldmVsMSAqLworICAgICAgICB9CisKKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID0gcHJvZmlsZV9sZXZlbF9jb2RlW2ldOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdICAgPSBiYXNlX1ZCVl9zaXplOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCkKKyAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV07CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzBdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IFBWX01JTigzMCwgKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAvIG5Ub3RhbE1CKTsKKworICAgICAgICAvKiBGb3IgSDI2My9TaG9ydCBoZWFkZXIsIG9uZSBzcGVjaWFsIGNvbnN0cmFpbnQgZm9yIFZCViBidWZmZXIgc2l6ZSAqLworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSA9IChJbnQpKGsgKiAxNjM4NCArIDQgKiAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAqIDEwMDEuMCAvIDMwMDAwLjApOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFNDQUxBQkFMRSBNT0RFOiBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZShTU1ApIE9yIENvcmUgU2NhbGFibGUgUHJvZmlsZShDU1ApICovCisKKyAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2luZGV4XSAgICAgfHwKKyAgICAgICAgICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbaW5kZXhdIHx8CisgICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpbmRleF0gICB8fAorICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pCisKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsgLyogQmV5b25kIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCisKKyAgICAgICAgLyogT25lLXRpbWUgY2hlY2s6IFNpbXBsZSBTY2FsYWJsZSBQcm9maWxlIG9yIENvcmUgU2NhbGFibGUgUHJvZmlsZSAqLworICAgICAgICBpZiAodG90YWxfYml0cmF0ZSAgICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzJdICAgICAgICAmJgorICAgICAgICAgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbMl0gICAgJiYKKyAgICAgICAgICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1syXSAgICAgICYmCisgICAgICAgICAgICAgICAgdG90YWxfVkJWX3NpemUgICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVsyXSkKKworICAgICAgICB7CisgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICBlbmQgPSBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnQgPSA0OworICAgICAgICAgICAgZW5kID0gaW5kZXg7CisgICAgICAgIH0KKworCisgICAgICAgIC8qIFNlYXJjaCB0aGUgc2NhbGFibGUgcHJvZmlsZSAqLworICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfcGFja2V0X3NpemUgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpXSAmJgorICAgICAgICAgICAgICAgICAgICB0b3RhbF9NQnNQZXJTZWMgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAgICYmCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaV0pCisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+IGVuZCkgcmV0dXJuIFBWX0ZBTFNFOworCisgICAgICAgIC8qIFNlYXJjaCB0aGUgYmFzZSBwcm9maWxlICovCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgYkZvdW5kID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICBiRm91bmQgPSAwOworCisgICAgICAgIGZvciAoaiA9IHN0YXJ0OyAhYkZvdW5kICYmIGogPD0gaTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmFzZV9iaXRyYXRlICAgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2pdICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSAgICA8PSBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtqXSAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9NQnNQZXJTZWMgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbal0gICAgJiYKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICAgICA8PSBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtqXSkKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJGb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJGb3VuZCkgLy8gJiYgc3RhcnQgPT0gNCkKKyAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsgLyogbWlzLW1hdGNoIGluIHRoZSBwcm9maWxlcyBiZXR3ZWVuIGJhc2UgbGF5ZXIgYW5kIGVuaGFuY2VtZW50IGxheWVyICovCisKKyAgICAgICAgLyogaiBmb3IgYmFzZSBsYXllciwgaSBmb3IgZW5oYW5jZW1lbnQgbGF5ZXIgKi8KKyAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID0gcHJvZmlsZV9sZXZlbF9jb2RlW2pdOworICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMV0gPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX2NvZGVbaV07CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gICA9IGJhc2VfVkJWX3NpemU7CisgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV0gICA9IGVuaGFuY2VfVkJWX3NpemU7CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtqXTsKKworICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0gPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldOworCisgICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9PSAwKQorICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSBQVl9NSU4oMzAsIChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbal0gLyBuVG90YWxNQik7CisKKyAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdID09IDApCisgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IFBWX01JTigzMCwgKGZsb2F0KXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAvIG5Ub3RhbE1CKTsKKworCisgICAgfSAvKiBlbmQgb2Y6IGlmKG5MYXllcnMgPT0gMSkgKi8KKworCisgICAgaWYgKCF2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgJiYgKHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9PSAweDA4KSkgLyogU1BMMCByZXN0cmljdGlvbiovCisgICAgeworICAgICAgICAvKiBQViBvbmx5IGFsbG93IGZyYW1lLWJhc2VkIHJhdGUgY29udHJvbCwgbm8gUVAgY2hhbmdlIGZyb20gb25lIE1CIHRvIGFub3RoZXIKKyAgICAgICAgaWYodmlkZW8tPmVuY1BhcmFtcy0+QUNEQ1ByZWRpY3Rpb24gPT0gVFJVRSAmJiBNQi1iYXNlZCByYXRlIGNvbnRyb2wpCisgICAgICAgICByZXR1cm4gUFZfRkFMU0UgKi8KKyAgICB9CisKKyAgICByZXR1cm4gUFZfVFJVRTsKK30KKworI2VuZGlmIC8qICNpZm5kZWYgT1JJR0lOQUxfVkVSU0lPTiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZW5jX2xpYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfbGliLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19saWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0bGliX2ludC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRsaWJfaW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGxpYl9pbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWwuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9oYWxmcGVsX2lubGluZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX2lubGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9pbmxpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvc2FkX21iX29mZnNldC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9zYWRfbWJfb2Zmc2V0LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY190YWIuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNfdGFiLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92bGNfZW5jb2RlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvdmxjX2VuY29kZV9pbmxpbmUuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZsY19lbmNvZGVfaW5saW5lLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy92b3AuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWU0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX200dl9oMjYzX2VuY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUJTRAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbTR2X2gyNjNfZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNcGVnNEgyNjNFbmNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzIDogWyAiTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwIiBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTJjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibXBlZzRfaDI2M19kZWNfZnV6el9kZWZhdWx0cyIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWc0X2RlY19mdXp6ZXIiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZGVjX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ETVBFRzQiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJoMjYzX2RlY19mdXp6ZXIiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZGVjX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibXBlZzRfaDI2M19lbmNfZnV6el9kZWZhdWx0cyIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsibXBlZzRfaDI2M19lbmNfZnV6emVyLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWc0X2VuY19mdXp6ZXIiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZW5jX2Z1enpfZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsiLURNUEVHNCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaDI2M19lbmNfZnV6emVyIiwKKworICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2VuY19mdXp6X2RlZmF1bHRzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDRmZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSwxNTggQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QRUc0L0gyNjMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGVzIChkaWN0aW9uYXJ5IGZpbGVzKSBhcmUgY3JlYXRlZCBmb3IgTVBFRzQgYW5kIEgyNjMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgZGVjb2RlciBkb2VzIG5vdCByZWplY3QgYW55IGlucHV0IGZpbGUgaW4gdGhlIGZpcnN0IGNoZWNrCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCisgKiBJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKKyAgIGluIHRoZSBkZWNvZGUgY2FsbC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlIHNvIHRoYXQgdGhlIGZ1enplcgorICAgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLCBtYWxmb3JtZWQsIGV0YykKK2FuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCisgKiBUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzRfZGVjX2Z1enplciBhbmQgaDI2M19kZWNfZnV6emVyIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlCisgICBvZiBhIGZsYWcgLSAnTVBFRzQnCisgKiBUaGUgbnVtYmVyIG9mIGRlY29kZSBjYWxscyBhcmUga2VwdCB0byBhIG1heGltdW0gb2YgMTAwIHNvIHRoYXQgdGhlIGZ1enplciBkb2VzIG5vdCB0aW1lb3V0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnNF9kZWNfZnV6emVyIGFuZCBoMjYzX2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnNF9kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBoMjYzX2RlY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUEVHNCBvciBIMjYzIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWc0X2RlY19mdXp6ZXIvbXBlZzRfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvaDI2M19kZWNfZnV6emVyL2gyNjNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcGVnNF9kZWNfZnV6emVyL21wZWc0X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2gyNjNfZGVjX2Z1enplci9oMjYzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIGVuY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QRUc0L0gyNjMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitNUEVHNC9IMjYzIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIEZyYW1lIFdpZHRoIChwYXJhbWV0ZXIgbmFtZTogYGVuY1dpZHRoYCkKKzIuIEZyYW1lIEhlaWdodCAocGFyYW1ldGVyIG5hbWU6IGBlbmNIZWlnaHRgKQorMy4gUmF0ZSBjb250cm9sIG1vZGUgKHBhcmFtZXRlciBuYW1lOiBgcmNUeXBlYCkKKzQuIE51bWJlciBvZiBieXRlcyBwZXIgcGFja2V0IChwYXJhbWV0ZXIgbmFtZTogYHBhY2tldFNpemVgKQorNS4gUXAgZm9yIEktVm9wKHBhcmFtZXRlciBuYW1lOiBgaVF1YW50YCkKKzYuIFFwIGZvciBQLVZvcCAocGFyYW1ldGVyIG5hbWU6IGBwUXVhbnRgKQorNy4gRW5hYmxlIFJWTEMgbW9kZSAocGFyYW1ldGVyIG5hbWU6IGBydmxjRW5hYmxlYCkKKzguIFF1YW50aXphdGlvbiBtb2RlIChwYXJhbWV0ZXIgbmFtZTogYHF1YW50VHlwZWApCis5LiBEaXNhYmxlIGZyYW1lIHNraXBwaW5nIChwYXJhbWV0ZXIgbmFtZTogYG5vRnJhbWVTa2lwcGVkYCkKKzEwLiBFbmFibGUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiAocGFyYW1ldGVyIG5hbWU6IGBzY2VuZURldGVjdGApCisxMS4gTnVtYmVyIG9mIGludHJhIE1CcyBpbiBQLWZyYW1lKHBhcmFtZXRlciBuYW1lOiBgbnVtSW50cmFNQmApCisxMi4gU2VhcmNoIHJhbmdlIG9mIE1FIChwYXJhbWV0ZXIgbmFtZTogYHNlYXJjaFJhbmdlYCkKKzEzLiBFbmFibGUgOHg4IE1FIGFuZCBNQyAocGFyYW1ldGVyIG5hbWU6IGBtdjh4OEVuYWJsZWApCisxNC4gRW5hYmxlIEFDIHByZWRpY3Rpb24gKHBhcmFtZXRlciBuYW1lOiBgdXNlQUNQcmVkYCkKKzE1LiBUaHJlc2hvbGQgZm9yIGludHJhIERDIFZMQyAocGFyYW1ldGVyIG5hbWU6IGBpbnRyYURDVmxjVGhgKQorMTYuIEVuY29kaW5nIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgZW5jTW9kZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgcmNUeXBlYCB8IDAuIGBDT05TVEFOVF9RYCAxLiBgQ0JSXzFgIDIuIGBWQlJfMWAgMy4gYENCUl8yYCA0LiBgVkJSXzJgIDUuIGBDQlJfTE9XREVMQVlgIHwgQWxsIHRoZSBiaXRzIG9mIDZ0aCBieXRlIG9mIGRhdGEgbW9kdWx1cyA2IHwKK3wgYHBhY2tldFNpemVgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDI1NWAgfCBBbGwgdGhlIGJpdHMgb2YgN3RoIGJ5dGUgb2YgZGF0YSB8Cit8IGBpUXVhbnRgIHwgSW4gdGhlIHJhbmdlIGAxIHRvIDMxYCB8IEFsbCB0aGUgYml0cyBvZiA4dGggYnl0ZSBvZiBkYXRhIHwKK3wgYHBRdWFudGAgfCBJbiB0aGUgcmFuZ2UgYDEgdG8gMzFgIHwgQWxsIHRoZSBiaXRzIG9mIDl0aCBieXRlIG9mIGRhdGEgfAorfCBgcnZsY0VuYWJsZWAgfCAwLiBgUFZfT0ZGYCAxLiBgUFZfT05gIHwgYml0IDAgb2YgMTB0aCBieXRlIG9mIGRhdGEgfAorfCBgcXVhbnRUeXBlYCB8IDAuIGAwYCAxLiBgMWAgfCBiaXQgMCBvZiAxMXRoIGJ5dGUgb2YgZGF0YSB8Cit8IGBub0ZyYW1lU2tpcHBlZGAgfCAwLiBgUFZfT0ZGYCAxLiBgUFZfT05gIHwgYml0IDAgb2YgMTJ0aCBieXRlIG9mIGRhdGEgfAorfCBgc2NlbmVEZXRlY3RgIHwgMC4gYFBWX09GRmAgMS4gYFBWX09OYCB8IGJpdCAwIG9mIDEzdGggYnl0ZSBvZiBkYXRhIHwKK3wgYG51bUludHJhTUJgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDdgIHwgYml0IDAsIDEgYW5kIDIgb2YgMTR0aCBieXRlIG9mIGRhdGEgfAorfCBgc2VhcmNoUmFuZ2VgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDMxYCB8IGJpdCAwLCAxLCAyLCAzIGFuZCA0IG9mIDE1dGggYnl0ZSBvZiBkYXRhIHwKK3wgYG12OHg4RW5hYmxlYCB8IDAuIGBQVl9PRkZgIDEuIGBQVl9PTmAgfCBiaXQgMCBvZiAxNnRoIGJ5dGUgb2YgZGF0YSB8Cit8IGB1c2VBQ1ByZWRgIHwgMC4gYFBWX09GRmAgMS4gYFBWX09OYCB8IGJpdCAwIG9mIDE3dGggYnl0ZSBvZiBkYXRhIHwKK3wgYGludHJhRENWbGNUaGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gN2AgfCBiaXQgMCwgMSBhbmQgMiBvZiAxOHRoIGJ5dGUgb2YgZGF0YSB8CisKK0ZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBvbmx5IGZvciBtcGVnNF9lbmNfZnV6emVyCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZW5jV2lkdGhgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDEwMjM5YCB8IEFsbCB0aGUgYml0cyBvZiAxc3QgYW5kIDJuZCBieXRlIG9mIGRhdGEgfAorfCBgZW5jSGVpZ2h0YCB8IEluIHRoZSByYW5nZSBgMCB0byAxMDIzOWAgfCBBbGwgdGhlIGJpdHMgb2YgM3JkIGFuZCA0dGggYnl0ZSBvZiBkYXRhIHwKK3wgYGVuY01vZGVgIHwgMC4gYEgyNjNfTU9ERWAgMS4gYEgyNjNfTU9ERV9XSVRIX0VSUl9SRVNgIDIuIGBEQVRBX1BBUlRJVElPTklOR19NT0RFYCAzLiBgQ09NQklORV9NT0RFX05PX0VSUl9SRVNgIDQuIGBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTYCB8IEFsbCB0aGUgYml0cyBvZiAxOXRoIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDUgfAorCitGb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb25seSBmb3IgaDI2M19lbmNfZnV6emVyCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZW5jV2lkdGhgIHwgMC4gYDEyOGAgMS4gYDE3NmAgMi4gYDM1MmAgMy4gYDcwNGAgNC4gYDE0MDhgIHwgQWxsIHRoZSBiaXRzIG9mIDFzdCBieXRlIG9mIGRhdGEgbW9kdWx1cyA1fAorfCBgZW5jSGVpZ2h0YCB8IDAuIGA5NmAgMS4gYDE0NGAgMi4gYDI4OGAgMy4gYDU3NmAgNC4gYDExNTIgYCB8IEFsbCB0aGUgYml0cyBvZiAzcmQgYnl0ZSBvZiBkYXRhIG1vZHVsdXMgNXwKK3wgYGVuY01vZGVgIHwgMC4gYFNIT1JUX0hFQURFUmAgMS4gYFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVNgIHwgQWxsIHRoZSBiaXRzIG9mIDE5dGggYnl0ZSBvZiBkYXRhIG1vZHVsdXMgMiB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyMjIyBNYXhpbWl6ZSB1dGlsaXphdGlvbiBvZiBpbnB1dCBkYXRhCitUaGUgcGx1Z2luIGZlZWRzIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSB0byB0aGUgY29kZWMgdXNpbmcgYSBsb29wLgorSWYgdGhlIGVuY29kZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBhZHZhbmNlZCBieSB0aGUgZnJhbWUgc2l6ZS4KK0lmIHRoZSBlbmNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgc3RpbGwgYWR2YW5jZWQgYnkgZnJhbWUgc2l6ZSBzbwordGhhdCB0aGUgZnV6emVyIGNhbiBwcm9jZWVkIHRvIGZlZWQgdGhlIG5leHQgZnJhbWUuCisKK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc250IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgbXBlZzRfZW5jX2Z1enplciBhbmQgaDI2M19lbmNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnNF9lbmNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBoMjYzX2VuY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSB5dXYgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbTR2X2gyNjNfZW5jX2Z1enplci9tNHZfaDI2M19lbmNfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9oMjYzX2VuY19mdXp6ZXIvaDI2M19lbmNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L21wZWc0X2VuY19mdXp6ZXIvbXBlZzRfZW5jX2Z1enplciBDT1JQVVNfRElSCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvaDI2M19lbmNfZnV6emVyL2gyNjNfZW5jX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL2gyNjNfZGVjX2Z1enplci5kaWN0IGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQora3cxPSJceDAwXHgwMFx4ODBceDAyIgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2RlY19mdXp6ZXIuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjI0MWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDAxXHhCMCIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJjODIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCisjZGVmaW5lIE1QRUc0X01BWF9XSURUSCAxOTIwCisjZGVmaW5lIE1QRUc0X01BWF9IRUlHSFQgMTA4MAorI2RlZmluZSBIMjYzX01BWF9XSURUSCAzNTIKKyNkZWZpbmUgSDI2M19NQVhfSEVJR0hUIDI4OAorI2RlZmluZSBERUZBVUxUX1dJRFRIIDM1MgorI2RlZmluZSBERUZBVUxUX0hFSUdIVCAyODgKKworY29uc3RleHByIHNpemVfdCBrTWF4TnVtRGVjb2RlQ2FsbHMgPSAxMDA7Citjb25zdGV4cHIgdWludDhfdCBrTnVtT3V0cHV0QnVmZmVycyA9IDI7Citjb25zdGV4cHIgaW50IGtMYXllciA9IDE7CisKK3N0cnVjdCB0YWd2aWRlb0RlY0NvbnRyb2xzOworCisvKiA9PSBjZWlsKG51bSAvIGRlbikgKiBkZW4uIFQgbXVzdCBiZSBpbnRlZ2VyIHR5cGUsIGFsaWdubWVudCBtdXN0IGJlIHBvc2l0aXZlIHBvd2VyIG9mIDIgKi8KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIHN0YXRpYyBjb25zdCBUIGFsaWduKGNvbnN0IFQgJm51bSwgY29uc3QgVSAmZGVuKSB7CisgIHJldHVybiAobnVtICsgKFQpKGRlbiAtIDEpKSAmIChUKSB+KGRlbiAtIDEpOworfQorCitjbGFzcyBDb2RlYyB7CisgcHVibGljOgorICBDb2RlYygpID0gZGVmYXVsdDsKKyAgfkNvZGVjKCkgeyBkZUluaXREZWNvZGVyKCk7IH0KKyAgYm9vbCBpbml0RGVjb2RlcigpOworICBib29sIGFsbG9jT3V0cHV0QnVmZmVyKHNpemVfdCBvdXRwdXRCdWZmZXJTaXplKTsKKyAgdm9pZCBmcmVlT3V0cHV0QnVmZmVyKCk7CisgIHZvaWQgaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpOworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworCisgcHJpdmF0ZToKKyAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZSA9IG51bGxwdHI7CisgIHVpbnQ4X3QgKm1PdXRwdXRCdWZmZXJba051bU91dHB1dEJ1ZmZlcnNdOworICBib29sIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICBib29sIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisjaWZkZWYgTVBFRzQKKyAgTVA0RGVjb2RpbmdNb2RlIG1JbnB1dE1vZGUgPSBNUEVHNF9NT0RFOworICBzaXplX3QgbU1heFdpZHRoID0gTVBFRzRfTUFYX1dJRFRIOworICBzaXplX3QgbU1heEhlaWdodCA9IE1QRUc0X01BWF9IRUlHSFQ7CisjZWxzZQorICBNUDREZWNvZGluZ01vZGUgbUlucHV0TW9kZSA9IEgyNjNfTU9ERTsKKyAgc2l6ZV90IG1NYXhXaWR0aCA9IEgyNjNfTUFYX1dJRFRIOworICBzaXplX3QgbU1heEhlaWdodCA9IEgyNjNfTUFYX0hFSUdIVDsKKyNlbmRpZgorICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgIHVpbnQzMl90IG1XaWR0aCA9IERFRkFVTFRfV0lEVEg7CisgIHVpbnQzMl90IG1IZWlnaHQgPSBERUZBVUxUX0hFSUdIVDsKK307CisKK2Jvb2wgQ29kZWM6OmluaXREZWNvZGVyKCkgeworICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgIGlmICghbURlY0hhbmRsZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWM6OmFsbG9jT3V0cHV0QnVmZmVyKHNpemVfdCBvdXRwdXRCdWZmZXJTaXplKSB7CisgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KG1hbGxvYyhvdXRwdXRCdWZmZXJTaXplKSk7CisgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZnJlZU91dHB1dEJ1ZmZlcigpIHsKKyAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29kZWM6OmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKSB7CisgIGludDMyX3QgZGlzcFdpZHRoLCBkaXNwSGVpZ2h0OworICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmZGlzcFdpZHRoLCAmZGlzcEhlaWdodCk7CisKKyAgaW50MzJfdCBidWZXaWR0aCwgYnVmSGVpZ2h0OworICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgJmJ1ZldpZHRoLCAmYnVmSGVpZ2h0KTsKKworICBpZiAoZGlzcFdpZHRoICE9IG1XaWR0aCB8fCBkaXNwSGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICBtV2lkdGggPSBkaXNwV2lkdGg7CisgICAgbUhlaWdodCA9IGRpc3BIZWlnaHQ7CisgIH0KK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obU1heFdpZHRoLCAxNikgKiBhbGlnbihtTWF4SGVpZ2h0LCAxNikgKiAzIC8gMjsKKyAgdWludDhfdCAqc3RhcnRfY29kZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgdm9sSW5mb1tdID0gezB4MDAsIDB4MDAsIDB4MDEsIDB4QjB9OworICBib29sIHZvbEhlYWRlciA9IG1lbWNtcChzdGFydF9jb2RlLCB2b2xJbmZvLCA0KSA9PSAwOworICBpZiAodm9sSGVhZGVyKSB7CisgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICB9CisKKyAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICB1aW50OF90ICp2b2xEYXRhWzFde307CisgICAgaW50MzJfdCB2b2xTaXplID0gMDsKKworICAgIGlmICh2b2xIZWFkZXIpIHsgLyogcmVtb3ZlZCBzb21lIGNvZGVjIGNvbmZpZyBwYXJ0ICovCisgICAgICB2b2xEYXRhWzBdID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICAgICAgdm9sU2l6ZSA9IHNpemU7CisgICAgfQorCisgICAgaWYgKCFQVkluaXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSwgdm9sRGF0YSwgJnZvbFNpemUsIGtMYXllciwgbU1heFdpZHRoLCBtTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dE1vZGUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobURlY0hhbmRsZSk7CisgICAgaWYgKG1JbnB1dE1vZGUgIT0gYWN0dWFsTW9kZSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworICB9CisgIHNpemVfdCB5RnJhbWVTaXplID0gc2l6ZW9mKHVpbnQ4KSAqIG1EZWNIYW5kbGUtPnNpemU7CisgIGlmIChvdXRwdXRCdWZmZXJTaXplIDwgeUZyYW1lU2l6ZSAqIDMgLyAyKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmICghYWxsb2NPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVyU2l6ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IG51bURlY29kZUNhbGxzID0gMDsKKyAgd2hpbGUgKChzaXplID4gMCkgJiYgKG51bURlY29kZUNhbGxzIDwga01heE51bURlY29kZUNhbGxzKSkgeworICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKKyAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsIG1PdXRwdXRCdWZmZXJbMV0pOworICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOworICAgIH0KKworICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGVhZGVyIGNvbnRhaW5zIG5ldyBpbmZvLCBlLmcuLCB3aWR0aC9oZWlnaHQsIGV0Yy4KKyAgICBWb3BIZWFkZXJJbmZvIGhlYWRlcl9pbmZvOworICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChudW1EZWNvZGVDYWxscyA9PSAwKTsKKyAgICBpbnQzMl90IHRlbXBTaXplID0gKGludDMyX3Qpc2l6ZTsKKyAgICB1aW50OF90ICpiaXRzdHJlYW1UbXAgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIobURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRlbXBTaXplLCAmaGVhZGVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSkgIT0gUFZfVFJVRSkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTsKKworICAgIFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdGVtcFNpemUpOworICAgIHVpbnQzMl90IGJ5dGVzQ29uc3VtZWQgPSAxOworICAgIGlmIChzaXplID4gdGVtcFNpemUpIHsKKyAgICAgIGJ5dGVzQ29uc3VtZWQgPSBzaXplIC0gdGVtcFNpemU7CisgICAgfQorICAgIGRhdGEgKz0gYnl0ZXNDb25zdW1lZDsKKyAgICBzaXplIC09IGJ5dGVzQ29uc3VtZWQ7CisgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICArK251bURlY29kZUNhbGxzOworICB9CisgIGZyZWVPdXRwdXRCdWZmZXIoKTsKK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICBkZWxldGUgbURlY0hhbmRsZTsKKyAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPCA0KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7CisgIGlmICghY29kZWMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoY29kZWMtPmluaXREZWNvZGVyKCkpIHsKKyAgICBjb2RlYy0+ZGVjb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICB9CisgIGRlbGV0ZSBjb2RlYzsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZW5jX2Z1enplci5jcHAgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZW5jX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzMzI1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19lbmNfZnV6emVyLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworY29uc3RleHByIGludDhfdCBrSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYyA9IDE7Citjb25zdGV4cHIgTVA0UmF0ZUNvbnRyb2xUeXBlIGtyY1R5cGVbXSA9IHtDT05TVEFOVF9RLCBDQlJfMSwgVkJSXzEsIENCUl8yLCBWQlJfMiwgQ0JSX0xPV0RFTEFZfTsKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIE1QNEVuY29kaW5nTW9kZSBrRW5jb2RpbmdNb2RlW10gPSB7U0hPUlRfSEVBREVSLCBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9QQVJUSVRJT05JTkdfTU9ERSwgQ09NQklORV9NT0RFX05PX0VSUl9SRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01CSU5FX01PREVfV0lUSF9FUlJfUkVTfTsKK2NvbnN0ZXhwciBzaXplX3Qga01heFdpZHRoID0gMTAyNDA7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhIZWlnaHQgPSAxMDI0MDsKKyNlbHNlCitjb25zdGV4cHIgTVA0RW5jb2RpbmdNb2RlIGtFbmNvZGluZ01vZGVbXSA9IHtIMjYzX01PREUsIEgyNjNfTU9ERV9XSVRIX0VSUl9SRVN9OworY29uc3RleHByIGludCBrV2lkdGhbXSA9IHsxMjgsIDE3NiwgMzUyLCA3MDQsIDE0MDh9OworY29uc3RleHByIGludCBrSGVpZ2h0W10gPSB7OTYsIDE0NCwgMjg4LCA1NzYsIDExNTJ9OworY29uc3RleHByIHNpemVfdCBrV2lkdGhOdW0gPSBzdGQ6OnNpemUoa1dpZHRoKTsKK2NvbnN0ZXhwciBzaXplX3Qga0hlaWdodE51bSA9IHN0ZDo6c2l6ZShrSGVpZ2h0KTsKKyNlbmRpZgorCitjb25zdGV4cHIgc2l6ZV90IGtyY1R5cGVOdW0gPSBzdGQ6OnNpemUoa3JjVHlwZSk7Citjb25zdGV4cHIgc2l6ZV90IGtFbmNvZGluZ01vZGVOdW0gPSBzdGQ6OnNpemUoa0VuY29kaW5nTW9kZSk7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhRUCA9IDUxOworCitlbnVtIHsKKyAgICBJRFhfV0RfQllURV8xLAorICAgIElEWF9XRF9CWVRFXzIsCisgICAgSURYX0hUX0JZVEVfMSwKKyAgICBJRFhfSFRfQllURV8yLAorICAgIElEWF9GUkFNRV9SQVRFLAorICAgIElEWF9SQ19UWVBFLAorICAgIElEWF9QQUNLRVRfU0laRSwKKyAgICBJRFhfSV9GUkFNRV9RUCwKKyAgICBJRFhfUF9GUkFNRV9RUCwKKyAgICBJRFhfRU5BQkxFX1JWTEMsCisgICAgSURYX1FVQU5UX1RZUEUsCisgICAgSURYX05PX0ZSQU1FX1NLSVBQRURfRkxBRywKKyAgICBJRFhfRU5BQkxFX1NDRU5FX0RFVEVDVCwKKyAgICBJRFhfTlVNX0lOVFJBX01CLAorICAgIElEWF9TRUFSQ0hfUkFOR0UsCisgICAgSURYX0VOQUJMRV9NVl84eDgsCisgICAgSURYX1VTRV9BQ19QUkVELAorICAgIElEWF9JTlRSQV9EQ19WTENfVEhSRVNIT0xELAorICAgIElEWF9FTkNfTU9ERSwKKyAgICBJRFhfTEFTVAorfTsKKworY2xhc3MgQ29kZWMgeworICAgcHVibGljOgorICAgIENvZGVjKCkgPSBkZWZhdWx0OworICAgIH5Db2RlYygpIHsgZGVJbml0RW5jb2RlcigpOyB9CisgICAgYm9vbCBpbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKTsKKyAgICB2b2lkIGVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBkZUluaXRFbmNvZGVyKCk7CisKKyAgIHByaXZhdGU6CisgICAgaW50MzJfdCBtRnJhbWVXaWR0aCA9IDM1MjsKKyAgICBpbnQzMl90IG1GcmFtZUhlaWdodCA9IDI4ODsKKyAgICBmbG9hdCBtRnJhbWVSYXRlID0gMjUuMGY7CisgICAgVmlkZW9FbmNPcHRpb25zICptRW5jb2RlSGFuZGxlID0gbnVsbHB0cjsKKyAgICBWaWRlb0VuY0NvbnRyb2xzICptRW5jb2RlQ29udHJvbCA9IG51bGxwdHI7Cit9OworCitib29sIENvZGVjOjppbml0RW5jb2Rlcihjb25zdCB1aW50OF90ICpkYXRhKSB7CisgICAgbUVuY29kZUhhbmRsZSA9IG5ldyBWaWRlb0VuY09wdGlvbnM7CisgICAgaWYgKCFtRW5jb2RlSGFuZGxlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtc2V0KG1FbmNvZGVIYW5kbGUsIDAsIHNpemVvZihWaWRlb0VuY09wdGlvbnMpKTsKKyAgICBtRW5jb2RlQ29udHJvbCA9IG5ldyBWaWRlb0VuY0NvbnRyb2xzOworICAgIGlmICghbUVuY29kZUNvbnRyb2wpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1zZXQobUVuY29kZUNvbnRyb2wsIDAsIHNpemVvZihWaWRlb0VuY0NvbnRyb2xzKSk7CisgICAgUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNvZGVIYW5kbGUsIDApOworCisjaWZkZWYgTVBFRzQKKyAgICBtRnJhbWVXaWR0aCA9ICgoZGF0YVtJRFhfV0RfQllURV8xXSA8PCA4KSB8IGRhdGFbSURYX1dEX0JZVEVfMl0pICUga01heFdpZHRoOworICAgIG1GcmFtZUhlaWdodCA9ICgoZGF0YVtJRFhfSFRfQllURV8xXSA8PCA4KSB8IGRhdGFbSURYX0hUX0JZVEVfMl0pICUga01heEhlaWdodDsKKyNlbHNlCisgICAgbUZyYW1lV2lkdGggPSBrV2lkdGhbZGF0YVtJRFhfV0RfQllURV8xXSAlIGtXaWR0aE51bV07CisgICAgbUZyYW1lSGVpZ2h0ID0ga0hlaWdodFtkYXRhW0lEWF9IVF9CWVRFXzFdICUga0hlaWdodE51bV07CisjZW5kaWYKKyAgICBtRnJhbWVSYXRlID0gZGF0YVtJRFhfRlJBTUVfUkFURV07CisgICAgbUVuY29kZUhhbmRsZS0+cmNUeXBlID0ga3JjVHlwZVtkYXRhW0lEWF9SQ19UWVBFXSAlIGtyY1R5cGVOdW1dOworICAgIG1FbmNvZGVIYW5kbGUtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNvZGVIYW5kbGUtPnBhY2tldFNpemUgPSBkYXRhW0lEWF9QQUNLRVRfU0laRV07CisgICAgbUVuY29kZUhhbmRsZS0+aVF1YW50WzBdID0gKGRhdGFbSURYX0lfRlJBTUVfUVBdICUga01heFFQKSArIDE7CisgICAgbUVuY29kZUhhbmRsZS0+cFF1YW50WzBdID0gKGRhdGFbSURYX1BfRlJBTUVfUVBdICUga01heFFQKSArIDE7CisgICAgbUVuY29kZUhhbmRsZS0+cnZsY0VuYWJsZSA9IChkYXRhW0lEWF9FTkFCTEVfUlZMQ10gJiAweDAxKSA/IFBWX09GRiA6IFBWX09OOworICAgIG1FbmNvZGVIYW5kbGUtPnF1YW50VHlwZVswXSA9IChkYXRhW0lEWF9RVUFOVF9UWVBFXSAmIDB4MDEpID8gMCA6IDE7CisgICAgbUVuY29kZUhhbmRsZS0+bm9GcmFtZVNraXBwZWQgPSAoZGF0YVtJRFhfTk9fRlJBTUVfU0tJUFBFRF9GTEFHXSAmIDB4MDEpID8gUFZfT0ZGIDogUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+c2NlbmVEZXRlY3QgPSAoZGF0YVtJRFhfRU5BQkxFX1NDRU5FX0RFVEVDVF0gJiAweDAxKSA/IFBWX09GRiA6IFBWX09OOworICAgIG1FbmNvZGVIYW5kbGUtPm51bUludHJhTUIgPSBkYXRhW0lEWF9OVU1fSU5UUkFfTUJdICYgMHgwNzsKKyAgICBtRW5jb2RlSGFuZGxlLT5zZWFyY2hSYW5nZSA9IGRhdGFbSURYX1NFQVJDSF9SQU5HRV0gJiAweDFGOworICAgIG1FbmNvZGVIYW5kbGUtPm12OHg4RW5hYmxlID0gKGRhdGFbSURYX0VOQUJMRV9NVl84eDhdICYgMHgwMSkgPyBQVl9PRkYgOiBQVl9PTjsKKyAgICBtRW5jb2RlSGFuZGxlLT51c2VBQ1ByZWQgPSAoZGF0YVtJRFhfVVNFX0FDX1BSRURdICYgMHgwMSkgPyBQVl9PRkYgOiBQVl9PTjsKKyAgICBtRW5jb2RlSGFuZGxlLT5pbnRyYURDVmxjVGggPSBkYXRhW0lEWF9JTlRSQV9EQ19WTENfVEhSRVNIT0xEXSAmIDB4MDc7CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jTW9kZSA9IGtFbmNvZGluZ01vZGVbZGF0YVtJRFhfRU5DX01PREVdICUga0VuY29kaW5nTW9kZU51bV07CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jV2lkdGhbMF0gPSBtRnJhbWVXaWR0aDsKKyAgICBtRW5jb2RlSGFuZGxlLT5lbmNIZWlnaHRbMF0gPSBtRnJhbWVIZWlnaHQ7CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZTsKKyAgICBtRW5jb2RlSGFuZGxlLT50aWNrUGVyU3JjID0gbUVuY29kZUhhbmRsZS0+dGltZUluY1JlcyAvIG1GcmFtZVJhdGU7CisgICAgbUVuY29kZUhhbmRsZS0+aW50cmFQZXJpb2QgPSAoa0lEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWMgKiBtRnJhbWVSYXRlKTsKKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtRW5jb2RlQ29udHJvbCwgbUVuY29kZUhhbmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RW5jb2RlcigpIHsKKyAgICBpZiAobUVuY29kZUNvbnRyb2wpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1FbmNvZGVDb250cm9sKTsKKyAgICAgICAgZGVsZXRlIG1FbmNvZGVDb250cm9sOworICAgICAgICBtRW5jb2RlQ29udHJvbCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtRW5jb2RlSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtRW5jb2RlSGFuZGxlOworICAgICAgICBtRW5jb2RlSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQ29kZWM6OmVuY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBpbnB1dEJ1ZmZlclNpemUgPSAobUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAzKSAvIDI7CisgICAgc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUgPSBpbnB1dEJ1ZmZlclNpemUgKiAyOworICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W291dHB1dEJ1ZmZlclNpemVdOworICAgIHVpbnQ4X3QgKmlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3RbaW5wdXRCdWZmZXJTaXplXTsKKworICAgIC8vIEdldCBWT0wgaGVhZGVyLgorICAgIGludDMyX3Qgc2l6ZU91dHB1dEJ1ZmZlciA9IG91dHB1dEJ1ZmZlclNpemU7CisgICAgUFZHZXRWb2xIZWFkZXIobUVuY29kZUNvbnRyb2wsIG91dHB1dEJ1ZmZlciwgJnNpemVPdXRwdXRCdWZmZXIsIDApOworCisgICAgc2l6ZV90IG51bUZyYW1lID0gMDsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgc2l6ZV90IGJ5dGVzQ29uc3VtZWQgPSBzdGQ6Om1pbihzaXplLCBpbnB1dEJ1ZmZlclNpemUpOworICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIsIGRhdGEsIGJ5dGVzQ29uc3VtZWQpOworICAgICAgICBpZiAoYnl0ZXNDb25zdW1lZCA8IGlucHV0QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbWVtc2V0KGlucHV0QnVmZmVyICsgYnl0ZXNDb25zdW1lZCwgZGF0YVswXSwgaW5wdXRCdWZmZXJTaXplIC0gYnl0ZXNDb25zdW1lZCk7CisgICAgICAgIH0KKyAgICAgICAgVmlkZW9FbmNGcmFtZUlPIHZpZGVvSW57fSwgdmlkZW9PdXR7fTsKKyAgICAgICAgdmlkZW9Jbi5oZWlnaHQgPSBtRnJhbWVIZWlnaHQ7CisgICAgICAgIHZpZGVvSW4ucGl0Y2ggPSBtRnJhbWVXaWR0aDsKKyAgICAgICAgdmlkZW9Jbi50aW1lc3RhbXAgPSAobnVtRnJhbWUgKiAxMDAwKSAvIG1GcmFtZVJhdGU7CisgICAgICAgIHZpZGVvSW4ueUNoYW4gPSBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgdmlkZW9Jbi51Q2hhbiA9IHZpZGVvSW4ueUNoYW4gKyB2aWRlb0luLmhlaWdodCAqIHZpZGVvSW4ucGl0Y2g7CisgICAgICAgIHZpZGVvSW4udkNoYW4gPSB2aWRlb0luLnVDaGFuICsgKCh2aWRlb0luLmhlaWdodCAqIHZpZGVvSW4ucGl0Y2gpID4+IDIpOworICAgICAgICB1aW50MzJfdCBtb2RUaW1lTXMgPSAwOworICAgICAgICBpbnQzMl90IGRhdGFMZW5ndGggPSBvdXRwdXRCdWZmZXJTaXplOworICAgICAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgICAgIFBWRW5jb2RlVmlkZW9GcmFtZShtRW5jb2RlQ29udHJvbCwgJnZpZGVvSW4sICZ2aWRlb091dCwgJm1vZFRpbWVNcywgb3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFMZW5ndGgsICZuTGF5ZXIpOworICAgICAgICBNUDRIaW50VHJhY2sgaGludFRyYWNrOworICAgICAgICBQVkdldEhpbnRUcmFjayhtRW5jb2RlQ29udHJvbCwgJmhpbnRUcmFjayk7CisgICAgICAgIFBWR2V0T3ZlcnJ1bkJ1ZmZlcihtRW5jb2RlQ29udHJvbCk7CisgICAgICAgICsrbnVtRnJhbWU7CisgICAgICAgIGRhdGEgKz0gYnl0ZXNDb25zdW1lZDsKKyAgICAgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgIH0KKyAgICBkZWxldGVbXSBpbnB1dEJ1ZmZlcjsKKyAgICBkZWxldGVbXSBvdXRwdXRCdWZmZXI7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IElEWF9MQVNUKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY29kZWMtPmluaXRFbmNvZGVyKGRhdGEpKSB7CisgICAgICAgIGRhdGEgKz0gSURYX0xBU1Q7CisgICAgICAgIHNpemUgLT0gSURYX0xBU1Q7CisgICAgICAgIGNvZGVjLT5lbmNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgICAgfQorICAgIGRlbGV0ZSBjb2RlYzsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbTR2X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1YjhiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDE1OCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UgdGhhdCB0b29rIHRoZSBhcHByb2FjaCBvZgorLy8gJ2FwcGx5IGV2ZXJ5IGxpY2Vuc2UgZm91bmQgdG8gZXZlcnkgdGFyZ2V0Jy4gV2hpbGUgdGhpcyBtYWtlcyBzdXJlIHdlIHJlc3BlY3QKKy8vIGV2ZXJ5IGxpY2Vuc2UgcmVzdHJpY3Rpb24sIGl0IG1heSBub3QgYmUgZW50aXJlbHkgY29ycmVjdC4KKy8vCisvLyBlLmcuIEdQTCBpbiBhbiBNSVQgcHJvamVjdCBtaWdodCBvbmx5IGFwcGx5IHRvIHRoZSBjb250cmliLyBkaXJlY3RvcnkuCisvLworLy8gUGxlYXNlIGNvbnNpZGVyIHNwbGl0dGluZyB0aGUgc2luZ2xlIGxpY2Vuc2UgYmVsb3cgaW50byBtdWx0aXBsZSBsaWNlbnNlcywKKy8vIHRha2luZyBjYXJlIG5vdCB0byBsb3NlIGFueSBsaWNlbnNlX2tpbmQgaW5mb3JtYXRpb24sIGFuZCBvdmVycmlkaW5nIHRoZQorLy8gZGVmYXVsdCBsaWNlbnNlIHVzaW5nIHRoZSAnbGljZW5zZXM6IFsuLi5dJyBwcm9wZXJ0eSBvbiB0YXJnZXRzIGFzIG5lZWRlZC4KKy8vCisvLyBGb3IgdW51c2VkIGZpbGVzLCBjb25zaWRlciBjcmVhdGluZyBhICdmaWxlR3JvdXAnIHdpdGggIi8vdmlzaWJpbGl0eTpwcml2YXRlIgorLy8gdG8gYXR0YWNoIHRoZSBsaWNlbnNlIHRvLCBhbmQgaW5jbHVkaW5nIGEgY29tbWVudCB3aGV0aGVyIHRoZSBmaWxlcyBtYXkgYmUKKy8vIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4KKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19tcDNkZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1CU0QiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wM2RlY19oZWFkZXJzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDp0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAic3JjIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOnRydWUsCisgICAgc3JjczogWworICAgICAgICAic3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2NyYy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldGJpdHMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2h1ZmZtYW5fZGVjb2RpbmcuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM190YWJsZXMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21kY3RfNi5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RjdF82LmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19lcXVhbGl6ZXIuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19zZWVrX3N5bmNoLmNwcCIsCisgICAgICAgICJzcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19yZW9yZGVyLmNwcCIsCisKKyAgICAgICAgInNyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX21kY3RfMTguY3BwIiwKKyAgICAgICAgInNyYy9wdm1wM19kY3RfOS5jcHAiLAorICAgICAgICAic3JjL3B2bXAzX2RjdF8xNi5jcHAiLAorICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCisgICAgICAgICAgICAgICAgInNyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAiLAorICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfbWRjdF8xOC5jcHAiLAorICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfZGN0XzkuY3BwIiwKKyAgICAgICAgICAgICAgICAic3JjL3B2bXAzX2RjdF8xNi5jcHAiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIHNyY3M6IFsKKyAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfbWRjdF8xOF9nY2MucyIsCisgICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfZGN0XzlfZ2NjLnMiLAorICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucyIsCisgICAgICAgICAgICBdLAorCisgICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIl0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWNfaGVhZGVycyJdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGlic3RhZ2VmcmlnaHRfbXAzZGVjX2hlYWRlcnMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX1VOVVNFRF9BUkcoeCk9KHZvaWQpKHgpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcDNkZWNfdGVzdCIsCisgICAgZ3Rlc3Q6IGZhbHNlLAorCisgICAgc3JjczogWworICAgICAgICAidGVzdC9tcDNkZWNfdGVzdC5jcHAiLAorICAgICAgICAidGVzdC9tcDNyZWFkZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAic3JjIiwKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJhdWRpb3V0aWxzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL05PVElDRSBiL21lZGlhL2NvZGVjcy9tcDNkZWMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL05PVElDRQpyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvY29kZWNzL21wM2RlYy9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmNDMxNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsOSBAQAorLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYworeworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIk1wM0RlY29kZXJUZXN0In0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0YThhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2NvZGVjc19tcDNkZWNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBtcDMgZGVjb2RlciBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKKworVGhpcyBmdXp6ZXIgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29uZmlnIHBhcmFtZXRlcnM6CisxLiBFcXVhbGl6ZXIgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBlcXVhbGl6ZXJUeXBlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlcXVhbGl6ZXJUeXBlYCB8IDAuIGBmbGF0IGAgMS4gYGJhc3NfYm9vc3QgYCAyLiBgcm9jayBgIDMuIGBwb3AgYCA0LiBgamF6eiBgIDUuIGBjbGFzc2ljYWwgYCA2LiBgdGFsayBgIDcuIGBmbGF0XyBgIHwgQml0cyAwLCAxIGFuZCAyIG9mIGZpcnN0IGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKK3wgYGNyY0VuYWJsZWRgIHwgMC4gYGZhbHNlIGAgMS4gYHRydWUgYHwgQml0IDAgb2Ygc2Vjb25kIGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlcgorICAgb2YgYnl0ZXMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlCisgICB0aWxsIGl0IHJlYWNoZXMgYSB2YWxpZCBmcmFtZSBvciBlbmQgb2Ygc3RyZWFtLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0N2M4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8cHZtcDNkZWNvZGVyX2FwaS5oPgorCitjb25zdGV4cHIgaW50IGtNYXhGcmFtZVNhbXBsZXMgPSA0NjA4OworY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSAyOworY29uc3RleHByIGVfZXF1YWxpemF0aW9uIGtFcXVhbGl6ZXJUeXBlc1tdID0ge2ZsYXQsIGJhc3NfYm9vc3QsIHJvY2ssIHBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXp6LCBjbGFzc2ljYWwsICB0YWxrLCBmbGF0X307CisKK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLCB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAqZnJhbWVfc2l6ZSA9IDA7CisgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDA7CisKKyAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgIGlmIChsYXllciA9PSAweDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHs0NDEwMCwgNDgwMDAsIDMyMDAwfTsKKyAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgIH0KKworICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgaWYgKGxheWVyID09IDMpIHsgIC8vIGxheWVyIEkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHszMiwgIDY0LCAgOTYsICAxMjgsIDE2MCwgMTkyLCAyMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4fTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2fTsKKworICAgIGludCBiaXRyYXRlID0KKyAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KKyAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgfQorICB9IGVsc2UgeyAgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODR9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7MzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjB9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gezgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MH07CisgICAgaW50IGJpdHJhdGU7CisgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgYml0cmF0ZSA9CisgICAgICAgICAgKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIFYyIChvciAyLjUpCisgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICB9IGVsc2UgeyAgLy8gVjIgb3IgVjIuNQorICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfQorCisgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSGVhZGVyKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUpIHsKKyAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKyAgYm9vbCBpc1ZhbGlkQnVmZmVyID0gZmFsc2U7CisKKyAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgIGlzVmFsaWRCdWZmZXIgPSB0cnVlOworICAgIHVpbnQzMl90IHZhbCA9IFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSk7CisgICAgaWYgKCFwYXJzZU1wM0hlYWRlcih2YWwsICZmcmFtZVNpemUsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgfQorCisgIHJldHVybiAoaXNWYWxpZEJ1ZmZlcik7Cit9CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorCisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXModWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZyA9IG51bGxwdHI7CisgIHZvaWQgKm1EZWNvZGVyQnVmID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXREZWNvZGVyKCkgeworICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICBpZiAoIW1Db25maWcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IGRlY29kZXJCdWZTaXplID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhkZWNvZGVyQnVmU2l6ZSk7CisgIGlmICghbURlY29kZXJCdWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNvZGVyQnVmLCAweDAsIGRlY29kZXJCdWZTaXplKTsKKyAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHVpbnQ4X3QgZXF1YWxpemVyVHlwZVZhbHVlID0gKGRhdGFbMF0gJiAweDcpOworICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0ga0VxdWFsaXplclR5cGVzW2VxdWFsaXplclR5cGVWYWx1ZV07CisgIG1Db25maWctPmNyY0VuYWJsZWQgPSBkYXRhWzFdICYgMHgxOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGJvb2wgc3RhdHVzID0gY2hlY2tIZWFkZXIoZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGErKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzaXplX3Qgb3V0QnVmU2l6ZSA9IGtNYXhGcmFtZVNhbXBsZXMgKiBrTWF4Q2hhbm5lbHM7CisgICAgc2l6ZV90IHVzZWRCeXRlcyA9IDA7CisgICAgaW50MTZfdCBvdXRwdXRCdWZbb3V0QnVmU2l6ZV07CisgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gc2l6ZTsKKyAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBkYXRhOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gb3V0QnVmU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YSsrOworICAgIH0gZWxzZSB7CisgICAgICB1c2VkQnl0ZXMgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOworICAgICAgc2l6ZSAtPSB1c2VkQnl0ZXM7CisgICAgICBkYXRhICs9IHVzZWRCeXRlczsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICB9CisgIGRlbGV0ZSBtQ29uZmlnOworICBtQ29uZmlnID0gbnVsbHB0cjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL21wM19kZWNvZGVyX3NlbGVjdGlvbi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL21wM19kZWNvZGVyX3NlbGVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvbXAzX2RlY29kZXJfc2VsZWN0aW9uLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9tcDNfZGVjb2Rlcl9zZWxlY3Rpb24uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzX2F1ZGlvX3R5cGVfZGVmcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzX2F1ZGlvX3R5cGVfZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2luY2x1ZGUvcHZtcDNfYXVkaW9fdHlwZV9kZWZzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM19hdWRpb190eXBlX2RlZnMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9pbmNsdWRlL3B2bXAzZGVjb2Rlcl9hcGkuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvaW5jbHVkZS9wdm1wM2RlY29kZXJfYXBpLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWNzL21wM2RlYy9wYXRlbnRfZGlzY2xhaW1lci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF8xNl9nY2MucyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19kY3RfOV9nY2MucwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX2RjdF85X2djYy5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfZGN0XzlfZ2NjLnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX21kY3RfMThfZ2NjLnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19tZGN0XzE4X2djYy5zCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfbWRjdF8xOF9nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvYXNtL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93X2djYy5zCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL2FzbS9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvd19nY2MucwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvbXAzX21lbV9mdW5jcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvbXAzX21lbV9mdW5jcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9tcDNfbWVtX2Z1bmNzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL21wM19tZW1fZnVuY3MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzX2h1ZmZtYW4uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM19odWZmbWFuLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3AuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybV9nY2MuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfYXJtX2djYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2FybV9nY2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9hcm1fZ2NjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX21zY19ldmMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfbXNjX2V2Yy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX21zY19ldmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9tc2NfZXZjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2NyYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19jcmMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfY3JjLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF8xNi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfMTYuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzE2LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfNi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzkuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfOS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY19kZWZzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNfZGVmcy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9oZWFkZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2hlYWRlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlY29kZV9odWZmX2N3LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZWNvZGVfaHVmZl9jdy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RlcXVhbnRpemVfc2FtcGxlLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kZXF1YW50aXplX3NhbXBsZS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZXF1YWxpemVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZXF1YWxpemVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2VxdWFsaXplci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19lcXVhbGl6ZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZnJhbWVkZWNvZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ZyYW1lZGVjb2Rlci5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19mcmFtZWRlY29kZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X21haW5fZGF0YV9zaXplLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9tYWluX2RhdGFfc2l6ZS5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2NhbGVfZmFjdG9ycy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zY2FsZV9mYWN0b3JzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldF9zaWRlX2luZm8uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRiaXRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2dldGJpdHMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0Yml0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2h1ZmZtYW5fZGVjb2RpbmcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaHVmZm1hbl9kZWNvZGluZy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2h1ZmZtYW5fcGFyc2luZy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19odWZmbWFuX3BhcnNpbmcuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2ltZGN0X3N5bnRoLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19pbWRjdF9zeW50aC5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfaW1kY3Rfc3ludGguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzE4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfMTguaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF8xOC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9kYXRhLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2RhdGEuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZmFjdG9ycy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfZ2V0X3NjYWxlX2ZhY3RvcnMuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21wZWcyX3N0ZXJlb19wcm9jLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tcGVnMl9zdGVyZW9fcHJvYy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5X3BoYXNlX3N5bnRoZXNpcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seV9waGFzZV9zeW50aGVzaXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19wb2x5cGhhc2VfZmlsdGVyX3dpbmRvdy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3BvbHlwaGFzZV9maWx0ZXJfd2luZG93LmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfcmVvcmRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19yZW9yZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3Jlb3JkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zZWVrX3N5bmNoLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3NlZWtfc3luY2guaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc2Vla19zeW5jaC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19zdGVyZW9fcHJvYy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfc3RlcmVvX3Byb2MuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfdGFibGVzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX3RhYmxlcy5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM190YWJsZXMuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc19odWZmY29kZXRhYi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc19odWZmY29kZXRhYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX2h1ZmZjb2RldGFiLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfaHVmZmNvZGV0YWIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc19tcDNiaXRzLmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3NyYy9zX21wM2JpdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc19tcDNiaXRzLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfbXAzYml0cy5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9zX3RtcDNkZWNfY2hhbi5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2NoYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2NoYW4uaApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2NoYW4uaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvc190bXAzZGVjX2ZpbGUuaCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvc3JjL3NfdG1wM2RlY19maWxlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwYjZhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9jb2RlY3NfbXAzZGVjX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQlNECisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfY29kZWNzX21wM2RlY19saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNcDNEZWNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcDNyZWFkZXIuY3BwIiwKKyAgICAgICAgIk1wM0RlY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcDNkZWMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTUyZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcDMgRGVjb2RlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcDNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC0xLjIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzMjZhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1wM0RlY29kZXJUZXN0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1wM3JlYWRlci5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworI2luY2x1ZGUgIk1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCIKKworI2RlZmluZSBPVVRQVVRfRklMRSAiL2RhdGEvbG9jYWwvdG1wL21wM0RlY29kZS5vdXQiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSAxMDI0ICogMTA7Citjb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDQ2MDggKiAyOworY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrTnVtRnJhbWVSZXNldCA9IDE1MDsKKworc3RhdGljIE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcDNEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nPiB7CisgIHB1YmxpYzoKKyAgICBNcDNEZWNvZGVyVGVzdCgpIDogbUNvbmZpZyhudWxscHRyKSB7fQorCisgICAgfk1wM0RlY29kZXJUZXN0KCkgeworICAgICAgICBpZiAobUNvbmZpZykgeworICAgICAgICAgICAgZGVsZXRlIG1Db25maWc7CisgICAgICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICAgICAgQVNTRVJUX05FKG1Db25maWcsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWcuIE5vIE1lbW9yeSBhdmFpbGFibGUiOworICAgICAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworICAgIH0KKworICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKKyAgICBNcDNSZWFkZXIgbU1wM1JlYWRlcjsKKworICAgIEVSUk9SX0NPREUgRGVjb2RlRnJhbWVzKHZvaWQgKmRlY29kZXJidWYsIFNOREZJTEUgKm91dEZpbGVIYW5kbGUsIFNGX0lORk8gc2ZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IElOVDMyX01BWCk7CisgICAgU05ERklMRSAqb3Blbk91dHB1dEZpbGUoU0ZfSU5GTyAqc2ZJbmZvKTsKK307CisKK0VSUk9SX0NPREUgTXAzRGVjb2RlclRlc3Q6OkRlY29kZUZyYW1lcyh2b2lkICpkZWNvZGVyQnVmLCBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLCBTRl9JTkZPIHNmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQpIHsKKyAgICB1aW50OF90IGlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOworICAgIGludDE2X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKKyAgICB1aW50MzJfdCBieXRlc1JlYWQ7CisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgIHdoaWxlIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTXAzUmVhZGVyLmdldEZyYW1lKGlucHV0QnVmLCAmYnl0ZXNSZWFkKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBieXRlc1JlYWQ7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gaW5wdXRCdWY7CisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgYnJlYWs7CisgICAgICAgIHNmX3dyaXRlZl9zaG9ydChvdXRGaWxlSGFuZGxlLCBvdXRwdXRCdWYsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIHNmSW5mby5jaGFubmVscyk7CisgICAgICAgIGZyYW1lQ291bnQtLTsKKyAgICB9CisgICAgcmV0dXJuIGRlY29kZXJFcnI7Cit9CisKK1NOREZJTEUgKk1wM0RlY29kZXJUZXN0OjpvcGVuT3V0cHV0RmlsZShTRl9JTkZPICpzZkluZm8pIHsKKyAgICBtZW1zZXQoc2ZJbmZvLCAwLCBzaXplb2YoU0ZfSU5GTykpOworICAgIHNmSW5mby0+Y2hhbm5lbHMgPSBtTXAzUmVhZGVyLmdldE51bUNoYW5uZWxzKCk7CisgICAgc2ZJbmZvLT5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgU0ZfRk9STUFUX1BDTV8xNjsKKyAgICBzZkluZm8tPnNhbXBsZXJhdGUgPSBtTXAzUmVhZGVyLmdldFNhbXBsZVJhdGUoKTsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gc2Zfb3BlbihPVVRQVVRfRklMRSwgU0ZNX1dSSVRFLCBzZkluZm8pOworICAgIHJldHVybiBvdXRGaWxlSGFuZGxlOworfQorCitURVNUX0YoTXAzRGVjb2RlclRlc3QsIE11bHRpQ3JlYXRlTXAzRGVjb2RlclRlc3QpIHsKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIEFTU0VSVF9ORShtZW1SZXF1aXJlbWVudHMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnQgc2l6ZSI7CisgICAgdm9pZCAqZGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIEFTU0VSVF9ORShkZWNvZGVyQnVmLCBudWxscHRyKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGVyIG1lbW9yeSBvZiBzaXplICIgPDwgbWVtUmVxdWlyZW1lbnRzOworICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKKyAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7CisgICAgICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgfQorICAgIGlmIChkZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7CisgICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KK30KKworVEVTVF9QKE1wM0RlY29kZXJUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBBU1NFUlRfTkUobWVtUmVxdWlyZW1lbnRzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IHNpemUiOworICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOworICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKyAgICBib29sIHN0YXR1cyA9IG1NcDNSZWFkZXIuaW5pdChpbnB1dEZpbGUuY19zdHIoKSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1wM1JlYWRlciI7CisKKyAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBTRl9JTkZPIHNmSW5mbzsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7CisgICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhkZWNvZGVyQnVmLCBvdXRGaWxlSGFuZGxlLCBzZkluZm8pOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCBOT19ERUNPRElOR19FUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGZyYW1lcyI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5jaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLnNhbXBsZXJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSkgPDwgIlNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIjsKKworICAgIG1NcDNSZWFkZXIuY2xvc2UoKTsKKyAgICBzZl9jbG9zZShvdXRGaWxlSGFuZGxlKTsKKyAgICBpZiAoZGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKGRlY29kZXJCdWYpOworICAgICAgICBkZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK1RFU1RfUChNcDNEZWNvZGVyVGVzdCwgUmVzZXREZWNvZGVyVGVzdCkgeworICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgQVNTRVJUX05FKG1lbVJlcXVpcmVtZW50cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudCBzaXplIjsKKyAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKKyAgICBBTE9HVigiRGVjb2RlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgIGJvb2wgc3RhdHVzID0gbU1wM1JlYWRlci5pbml0KGlucHV0RmlsZS5jX3N0cigpKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgbXAzUmVhZGVyIjsKKworICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlLgorICAgIFNGX0lORk8gc2ZJbmZvOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBvcGVuT3V0cHV0RmlsZSgmc2ZJbmZvKTsKKyAgICBBU1NFUlRfTkUob3V0RmlsZUhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcgZGVjb2RlZCBvdXRwdXQiOworCisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvLCBrTnVtRnJhbWVSZXNldCk7CisgICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIE5PX0RFQ09ESU5HX0VSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgZnJhbWVzIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLmNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpIDw8ICJOdW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShzZkluZm8uc2FtcGxlcmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKSA8PCAiU2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2giOworCisgICAgcHZtcDNfcmVzZXREZWNvZGVyKGRlY29kZXJCdWYpOworICAgIC8vIERlY29kZSB0aGUgc2FtZSBmaWxlLgorICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvKTsKKyAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgTk9fREVDT0RJTkdfRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBmcmFtZXMiOworICAgIEFTU0VSVF9FUShzZkluZm8uY2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscykgPDwgIk51bWJlciBvZiBjaGFubmVscyBkb2VzIG5vdCBtYXRjaCI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5zYW1wbGVyYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpIDw8ICJTYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCI7CisKKyAgICBtTXAzUmVhZGVyLmNsb3NlKCk7CisgICAgc2ZfY2xvc2Uob3V0RmlsZUhhbmRsZSk7CisgICAgaWYgKGRlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKKyAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTXAzRGVjb2RlclRlc3RBbGwsIE1wM0RlY29kZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYnVnXzEzNjA1Mzg4NS5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl8yY2hfNDRrSHpfbGFtZV9jcmMubXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIikpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBNcDNEZWNvZGVyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZApyZW5hbWUgdG8gbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM2RlY190ZXN0LmNwcCBiL21lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNkZWNfdGVzdC5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNkZWNfdGVzdC5jcHAKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNkZWNfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuY3BwIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5oIGIvbWVkaWEvY29kZWNzL21wM2RlYy90ZXN0L21wM3JlYWRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvbXAzcmVhZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2NvZGVjcy9tcDNkZWMvdGVzdC9tcDNyZWFkZXIuaApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCmluZGV4IDdjNGU2MmYuLjc1MTNjYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImV4dHJhY3Rvci1kZWZhdWx0cyIsCiAKQEAgLTIxLDcgKzMwLDYgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFuZGsjMjkiLAogICAgIF0sCiAKICAgICAvLyBleHRyYWN0b3JzIGFyZSBzdXBwb3NlZCB0byB3b3JrIG9uIFEoMjkpCkBAIC0zOSw2ICs0NywyMSBAQAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGlibWVkaWFuZGsjMjkiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgaG9zdDogeworICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAgICAgICAgICJsaWJtZWRpYW5ka19mb3JtYXQiLAorICAgICAgICAgICAgICAgICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTQ2LDQgKzY5LDQgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL1RFU1RfTUFQUElORyBiL21lZGlhL2V4dHJhY3RvcnMvVEVTVF9NQVBQSU5HCmluZGV4IGNmM2MzMGUuLjQ5ODRiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvVEVTVF9NQVBQSU5HCkBAIC0xLDUgKzEsNiBAQAogewogICAicHJlc3VibWl0IjogWworCiAgICAgLy8gVE9ETyhiLzE1MzY2MTU5MSkgZW5hYmxlIHRlc3Qgb25jZSB0aGUgYnVnIGlzIGZpeGVkCiAgICAgLy8gVGhpcyB0ZXN0cyB0aGUgZXh0cmFjdG9yIHBhdGgKICAgICAvLyB7CkBAIC0xMyw3ICsxNCwxNCBAQAogICAgIC8vICAgICAgfQogICAgIC8vICAgIF0KICAgICAvLyAgfQotICAgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKLSAgICAvL3sgIm5hbWUiOiAiRXh0cmFjdG9yVW5pdFRlc3QiIH0KKyAgXSwKKworICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIkV4dHJhY3RvclVuaXRUZXN0IiB9CiAgIF0KKworCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA4ZjYwZjZiLi4yZmM0NTg0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQUFDRXh0cmFjdG9yIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgIkFBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0yNzcsNyArMjc5LDIyIEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaWYgKG1GcmFtZUR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBtRnJhbWVEdXJhdGlvblVzOworICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSAwOworICAgICAgICAgICAgc3dpdGNoKG1vZGUgJiAweDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgLy8gImF0IG9yIGFmdGVyIgorICAgICAgICAgICAgICAgICAgICBzZWVrRnJhbWUgPSAoc2Vla1RpbWVVcyArIG1GcmFtZUR1cmF0aW9uVXMgLSAxKSAvIG1GcmFtZUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DOgorICAgICAgICAgICAgICAgIGNhc2UgUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgICAgICAgICAgc2Vla0ZyYW1lID0gKHNlZWtUaW1lVXMgKyBtRnJhbWVEdXJhdGlvblVzLzIpIC8gbUZyYW1lRHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vICdhdCBvciBiZWZvcmUnCisgICAgICAgICAgICAgICAgICAgIHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBtRnJhbWVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDYwZDNhZTEuLjdiZjNhMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX2FhY19saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfYWFjX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhYWNleHRyYWN0b3IiLAogICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLApAQCAtMTAsNCArMjcsMTEgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKaW5kZXggMjY0MzFhNC4uZTI2ZmYwYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIkFNUkV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlICJBTVJFeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0yODMsOCArMjg1LDIyIEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG1PZmZzZXRUYWJsZUxlbmd0aCA+IDAgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gMjAwMDBMTDsgIC8vIDIwbXMgcGVyIGZyYW1lLgotICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIDIwMDAwTEw7CisgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEdXJhdGlvblVzID0gMjAwMDBMTDsgIC8vIDIwbXMgcGVyIGZyYW1lLgorICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IDA7CisgICAgICAgIHN3aXRjaChtb2RlICYgMHg3KSB7CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgICAgICBzZWVrRnJhbWUgPSAoc2Vla1RpbWVVcyArIGZyYW1lRHVyYXRpb25VcyAtIDEpIC8gZnJhbWVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q6CisgICAgICAgICAgICAgICAgc2Vla0ZyYW1lID0gKHNlZWtUaW1lVXMgKyBmcmFtZUR1cmF0aW9uVXMvMikgLyBmcmFtZUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBmcmFtZUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBmcmFtZUR1cmF0aW9uVXM7CiAKICAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKICAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKaW5kZXggNDljOTU2Ny4uNzEyMzYwZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfYW1yX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19hbXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmFtcmV4dHJhY3RvciIsCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCkBAIC04LDQgKzI1LDEwIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA4MjZjMWEwLi45YTJhNzZiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMSw2ICsxLDI1IEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19mbGFjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfZmxhY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGliZmxhY2V4dHJhY3RvciIsCi0gICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIiwgImxpYmJpbmRlcl9uZGtfaG9zdF91c2VyIl0sCiAKICAgICBzcmNzOiBbIkZMQUNFeHRyYWN0b3IuY3BwIl0sCiAKQEAgLTIxLDQgKzQwLDEyIEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU0YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIiwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fY29sb3J1dGlsc19uZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5ka19mb3JtYXQiLAorICAgICAgICAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZXh0cmFjdG9yZnV6emVyYmFzZSIsCisgICAgXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICAgICAgImxpYm1wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmV4dHJhY3RvcmZ1enplcmJhc2UiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wNF9leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcDRfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9tcDQiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJ3YXZfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvd2F2IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZpZm8iLAorICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYW1yIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCisgICAgXSwKKworICAgIGRpY3Rpb25hcnk6ICJhbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1rdl9leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9ta3YiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlid2VibSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJvZ2dfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvb2dnIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlidm9yYmlzaWRlYyIsCisgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbIm1wZWcyLWV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUcyUFMiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGRpY3Rpb25hcnk6ICJtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXAzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmZpZm8iLAorICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFhY19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhYWNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9hYWMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy9mbGFjIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgICAgICJsaWJmbGFjZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAiZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibWlkaV9leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtaWRpX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbWlkaSIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzb25pdm94IiwKKyAgICAgICAgImxpYm1lZGlhX21pZGlpb3dyYXBwZXIiLAorICAgICAgICAibGlibWlkaWV4dHJhY3RvciIsCisgICAgICAgICJsaWJ3YXRjaGRvZyIsCisgICAgXSwKKworICAgIGRpY3Rpb25hcnk6ICJtaWRpX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU4NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0V4dHJhY3RvckZ1enplckJhc2UuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJFeHRyYWN0b3JGdXp6ZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworYm9vbCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICBtRGF0YVNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YVNvdXJjZSo+KG1CdWZmZXJTb3VyY2UuZ2V0KCkpOworICBpZiAoIW1EYXRhU291cmNlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmdldEV4dHJhY3RvckRlZigpIHsKKyAgZmxvYXQgY29uZmlkZW5jZTsKKyAgdm9pZCogbWV0YSA9IG51bGxwdHI7CisgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CisKKyAgRXh0cmFjdG9yRGVmIGV4dHJhY3RvckRlZiA9IEdFVEVYVFJBQ1RPUkRFRigpOworICBpZiAoZXh0cmFjdG9yRGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSkgeworICAgIGV4dHJhY3RvckRlZi51LnYyLnNuaWZmKG1EYXRhU291cmNlLT53cmFwKCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhKTsKKyAgfSBlbHNlIGlmIChleHRyYWN0b3JEZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgZXh0cmFjdG9yRGVmLnUudjMuc25pZmYobURhdGFTb3VyY2UtPndyYXAoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEpOworICB9CisKKyAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgZnJlZU1ldGEobWV0YSk7CisgIH0KK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpleHRyYWN0VHJhY2tzKCkgeworICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgIGlmICghYnVmZmVyR3JvdXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCk7CisgICAgaWYgKCF0cmFjaykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGV4dHJhY3RUcmFjayh0cmFjaywgYnVmZmVyR3JvdXApOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6ZXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLCBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCkgeworICBDTWVkaWFUcmFjayogY1RyYWNrID0gd3JhcCh0cmFjayk7CisgIGlmICghY1RyYWNrKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgZnJlZShjVHJhY2spOworICAgIHJldHVybjsKKyAgfQorCisgIGRvIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogYnVmZmVyID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgIH0gd2hpbGUgKHN0YXR1cyA9PSBBTUVESUFfT0spOworCisgIGNUcmFjay0+c3RvcCh0cmFjayk7CisgIGZyZWUoY1RyYWNrKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpnZXRUcmFja3NNZXRhZGF0YSgpIHsKKyAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisKKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoZm9ybWF0LCB0cmFja0luZGV4LCBmbGFncyk7CisgIH0KKworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6Z2V0TWV0YWRhdGEoKSB7CisgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YShmb3JtYXQpOworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2V0RGF0YVNvdXJjZUZsYWdzKHVpbnQzMl90IGZsYWdzKSB7CisgIG1CdWZmZXJTb3VyY2UtPnNldEZsYWdzKGZsYWdzKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZWVrQW5kRXh0cmFjdFRyYWNrcygpIHsKKyAgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICBpZiAoIWJ1ZmZlckdyb3VwKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICBNZWRpYVRyYWNrSGVscGVyKiB0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpOworICAgIGlmICghdHJhY2spIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogdHJhY2tNZXRhRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24gPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisgICAgbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0cmFja01ldGFEYXRhLCB0cmFja0luZGV4LCBmbGFncyk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZ0cmFja0R1cmF0aW9uKTsKKworICAgIHNlZWtBbmRFeHRyYWN0VHJhY2sodHJhY2ssIGJ1ZmZlckdyb3VwLCB0cmFja0R1cmF0aW9uKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrTWV0YURhdGEpOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2Vla0FuZEV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pIHsKKyAgQ01lZGlhVHJhY2sqIGNUcmFjayA9IHdyYXAodHJhY2spOworICBpZiAoIWNUcmFjaykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgIGZyZWUoY1RyYWNrKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IHNlZWtDb3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHNlZWtUb1RpbWVTdGFtcDsKKyAgd2hpbGUgKHNlZWtDb3VudCA8PSBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50KSB7CisgICAgLyogVGhpcyBlbnN1cmVzIGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQgc2VlayBwb2ludHMgYXJlIHdpdGhpbiB0aGUgY2xpcER1cmF0aW9uIGFuZCAxIHNlZWsKKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIG9mIHRoZSBjbGlwRHVyYXRpb24uCisgICAgICovCisgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAoc2Vla0NvdW50ICogdHJhY2tEdXJhdGlvbikgLyAoa0Z1enplck1heFNlZWtQb2ludHNDb3VudCAtIDEpOworICAgIHNlZWtUb1RpbWVTdGFtcC5wdXNoX2JhY2sodGltZVN0YW1wKTsKKyAgICBzZWVrQ291bnQrKzsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzZWVrT3B0aW9uczsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKTsKKworICBmb3IgKHVpbnQzMl90IHNlZWtPcHRpb24gOiBzZWVrT3B0aW9ucykgeworICAgIGZvciAoaW50NjRfdCBzZWVrUHRzIDogc2Vla1RvVGltZVN0YW1wKSB7CisgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAgICAgbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKHNlZWtPcHRpb24sIHNlZWtQdHMpOworICAgICAgTWVkaWFCdWZmZXJIZWxwZXIqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICB9CisgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICB9CisgIH0KKworICBjVHJhY2stPnN0b3AodHJhY2spOworICBmcmVlKGNUcmFjayk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6cHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNldERhdGFTb3VyY2UoZGF0YSwgc2l6ZSkpIHsKKyAgICBpZiAoY3JlYXRlRXh0cmFjdG9yKCkpIHsKKyAgICAgIGdldEV4dHJhY3RvckRlZigpOworICAgICAgZ2V0TWV0YWRhdGEoKTsKKyAgICAgIGV4dHJhY3RUcmFja3MoKTsKKyAgICAgIGdldFRyYWNrc01ldGFkYXRhKCk7CisgICAgICBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxZDUyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKQEAgLTAsMCArMSwzNjIgQEAKKyMgRnV6emVyIGZvciBleHRyYWN0b3JzCisKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrIFtsaWJleHRyYWN0b3JmdXp6ZXJiYXNlXSgjRXh0cmFjdG9yRnV6emVyQmFzZSkKKysgW2xpYm1wNGV4dHJhY3Rvcl0oI21wNEV4dHJhY3RvckZ1enplcikKKysgW2xpYndhdmV4dHJhY3Rvcl0oI3dhdkV4dHJhY3RvckZ1enplcikKKysgW2xpYmFtcmV4dHJhY3Rvcl0oI2FtckV4dHJhY3RvckZ1enplcikKKysgW2xpYm1rdmV4dHJhY3Rvcl0oI21rdkV4dHJhY3RvckZ1enplcikKKysgW2xpYm9nZ2V4dHJhY3Rvcl0oI29nZ0V4dHJhY3RvckZ1enplcikKKysgW2xpYm1wZWcyZXh0cmFjdG9yXSgjbXBlZzJFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJtcDNleHRyYWN0b3JdKCNtcDNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJhYWNleHRyYWN0b3JdKCNhYWNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJmbGFjZXh0cmFjdG9yXSgjZmxhY0V4dHJhY3RvcikKKysgW2xpYm1pZGlleHRyYWN0b3JdKCNtaWRpRXh0cmFjdG9yRnV6emVyKQorCisjIDxhIG5hbWU9IkV4dHJhY3RvckZ1enplckJhc2UiPjwvYT4gRnV6emVyIGZvciBsaWJleHRyYWN0b3JmdXp6ZXJiYXNlCitBbGwgdGhlIGV4dHJhY3RvcnMgaGF2ZSBhIGNvbW1vbiBBUEkgLSBjcmVhdGluZyBhIGRhdGEgc291cmNlLCBleHRyYWN0aW9uCitvZiBhbGwgdGhlIHRyYWNrcywgZXRjLiBUaGVzZSBjb21tb24gQVBJcyBoYXZlIGJlZW4gYWJzdHJhY3RlZCBpbiBhIGJhc2UgY2xhc3MKK2NhbGxlZCBgRXh0cmFjdG9yRnV6emVyQmFzZWAgdG8gZW5zdXJlIGNvZGUgaXMgcmV1c2VkIGJldHdlZW4gZnV6emVyIHBsdWdpbnMuCisKK0FkZGl0aW9uYWxseSwgYEV4dHJhY3RvckZ1enplckJhc2VgIGFsc28gaGFzIHN1cHBvcnQgZm9yIG1lbW9yeSBiYXNlZCBidWZmZXIKK2BCdWZmZXJTb3VyY2VgIHNpbmNlIHRoZSBmdXp6aW5nIGVuZ2luZSBmZWVkcyBkYXRhIHVzaW5nIG1lbW9yeSBidWZmZXJzIGFuZAordXNhZ2Ugb2Ygc3RhbmRhcmQgZGF0YSBzb3VyY2Ugb2JqZWN0cyBsaWtlIEZpbGVTb3VyY2UsIEhUVFBTb3VyY2UsIGV0Yy4gaXMKK25vdCBmZWFzaWJsZS4KKworIyA8YSBuYW1lPSJtcDRFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtcDRleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QNCBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1QNCBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNUDQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIE1QNAorYXRvbXMgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZCBhcyBhIHJhbmdlIG9mIE1QNCBhdG9tcyB3aWxsIGJlCitwcmVzZW50IGluIHRoZSBpbnB1dCBkYXRhLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wNF9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDRfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIE1QNCBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcDRfZXh0cmFjdG9yX2Z1enplci9tcDRfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJ3YXZFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJ3YXZleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIFdBViBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIFdBViBleHRyYWN0b3IgY2xhc3MuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgd2F2X2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIHdhdl9leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgd2F2IGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L3dhdl9leHRyYWN0b3JfZnV6emVyL3dhdl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9ImFtckV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYmFtcmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgQU1SIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgQU1SIGV4dHJhY3RvciBjbGFzcy4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIEFNUiB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYW1yX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGFtcl9leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgQU1SIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2Ftcl9leHRyYWN0b3JfZnV6emVyL2Ftcl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1rdkV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1rdmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTUtWIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTUtWIGV4dHJhY3RvciBjbGFzcy4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIE1LViB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgZWxlbWVudAorSUQncyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1rdl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBta3ZfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1rdiBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ib2dnRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlib2dnZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBPR0cgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBPR0cgZXh0cmFjdG9yIG9iamVjdC4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIE9HRyB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgb2dnX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG9nZ19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgb2dnIGZpbGVzIHRvIHRoYXQgZm9sZGVyLgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9vZ2dfZXh0cmFjdG9yX2Z1enplci9vZ2dfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJtcGVnMkV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1wZWcyZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2lucyBmb3IgTVBFRzItUFMgYW5kIE1QRUcyLVRTIGV4dHJhY3RvciB1c2UgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudCBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1QRUcyLVBTIG9yIE1QRUcyLVRTIGV4dHJhY3Rvcgorb2JqZWN0IHJlc3BlY3RpdmVseS4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlcyAoZGljdGlvbmFyeSBmaWxlcykgYXJlIGNyZWF0ZWQgZm9yIE1QRUcyLVBTIGFuZCBNUEVHMi1UUyB0byBlbnN1cmUgdGhhdCB0aGUKK3JlcXVpcmVkIHN0YXJ0IGJ5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCitUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzJwc19leHRyYWN0b3JfZnV6emVyIGFuZCBtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIgYXJlCitnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgZmxhZyAtIGBNUEVHMlBTYAorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wZWcycHNfZXh0cmFjdG9yX2Z1enplciBhbmQgbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIKKyAgJCBtbSAtaiQobnByb2MpIG1wZWcydHNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wZWcyIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWcycHNfZXh0cmFjdG9yX2Z1enplci9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWcydHNfZXh0cmFjdG9yX2Z1enplci9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibXAzRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlibXAzZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUDMgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUDMgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcDNfZXh0cmFjdG9yX2Z1enplci9tcDNfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJhYWNFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJhYWNleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFBQyBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEFBQyBleHRyYWN0b3IgY2xhc3MuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYWFjX2V4dHJhY3Rvcl9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIGFhY19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgYWFjIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2FhY19leHRyYWN0b3JfZnV6emVyL2FhY19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9ImZsYWNFeHRyYWN0b3IiPjwvYT4gRnV6emVyIGZvciBsaWJmbGFjZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBGTEFDIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgRkxBQyBleHRyYWN0b3Igb2JqZWN0LgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGUgKGRpY3Rpb25hcnkgZmlsZSkgaXMgY3JlYXRlZCBmb3IgRkxBQyB0byBlbnN1cmUgdGhhdCB0aGUgcmVxdWlyZWQgc3RhcnQKK2J5dGVzIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQuCisKKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgZmxhY19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBmbGFjIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2ZsYWNfZXh0cmFjdG9yX2Z1enplci9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibWlkaUV4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1pZGlleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1JREkgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNSURJIGV4dHJhY3RvciBjbGFzcy4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIE1JREkgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIE1JREkKK2hlYWRlcnMgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZCBhcyBhIHJhbmdlIG9mIE1JREkgaGVhZGVycyB3aWxsIGJlCitwcmVzZW50IGluIHRoZSBpbnB1dCBkYXRhLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1pZGlfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWlkaV9leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgTUlESSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9taWRpX2V4dHJhY3Rvcl9mdXp6ZXIvbWlkaV9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTZjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBYWNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQWFjRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCAwKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBYWNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBbXJFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQW1yRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBbXJFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBbXJFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NzI2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlCitrdzE9IiMhQU1SIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM0ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJGTEFDRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBGbGFjRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgRmxhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfkZsYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgRmxhY0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIEZsYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBGbGFjRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDMgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQorIyBUaGUgYmVsb3cgNCBieXRlcyBjb3JyZXNwb25kIHRvICJmTGFDIiBpbiBBU0NJSQora3cxPSJceDY2XHg0Q1x4NjFceDQzIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmExYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvaW5jbHVkZS9FeHRyYWN0b3JGdXp6ZXJCYXNlLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaWZuZGVmIF9fRVhUUkFDVE9SX0ZVWlpFUl9CQVNFX0hfXworI2RlZmluZSBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2V4dGVybiAiQyIgeworYW5kcm9pZDo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpOworfQorCitjb25zdGV4cHIgaW50MzJfdCBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50ID0gNTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEV4dHJhY3RvckZ1enplckJhc2UoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkV4dHJhY3RvckZ1enplckJhc2UoKSB7CisgICAgaWYgKG1FeHRyYWN0b3IpIHsKKyAgICAgIGRlbGV0ZSBtRXh0cmFjdG9yOworICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQnVmZmVyU291cmNlKSB7CisgICAgICBtQnVmZmVyU291cmNlLmNsZWFyKCk7CisgICAgICBtQnVmZmVyU291cmNlID0gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50LgorICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgKi8KKyAgdmlydHVhbCBib29sIGNyZWF0ZUV4dHJhY3RvcigpID0gMDsKKworICAvKiogUGFyZW50IGNsYXNzIGZ1bmN0aW9ucyB0byBiZSByZXVzZWQgYnkgZGVyaXZlZCBjbGFzcy4KKyAgICAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGFsbCBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50cy4KKyAgICAqLworICBib29sIHNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgIHZvaWQgZ2V0RXh0cmFjdG9yRGVmKCk7CisKKyAgdm9pZCBleHRyYWN0VHJhY2tzKCk7CisKKyAgdm9pZCBnZXRNZXRhZGF0YSgpOworCisgIHZvaWQgZ2V0VHJhY2tzTWV0YWRhdGEoKTsKKworICB2b2lkIHNldERhdGFTb3VyY2VGbGFncyh1aW50MzJfdCBmbGFncyk7CisKKyAgdm9pZCBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworCisgIHZvaWQgcHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgcHJvdGVjdGVkOgorICBjbGFzcyBCdWZmZXJTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICBwdWJsaWM6CisgICAgQnVmZmVyU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIDogbURhdGEoZGF0YSksIG1MZW5ndGgobGVuZ3RoKSB7fQorICAgIHZpcnR1YWwgfkJ1ZmZlclNvdXJjZSgpIHsgbURhdGEgPSBudWxscHRyOyB9CisKKyAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7IG1GbGFncyA9IGZsYWdzOyB9CisKKyAgICB1aW50MzJfdCBmbGFncygpIHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbURhdGEgIT0gbnVsbHB0ciA/IE9LIDogTk9fSU5JVDsgfQorCisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICBpZiAoIW1EYXRhKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgfQorCisgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgaWYgKChvZmZzZXQgPj0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCkpIHx8IChvZmZzZXQgPCAwKSkgeworICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIGJvdW5kcy4KKyAgICAgIH0KKyAgICAgIHNpemVfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXQpOworICAgICAgaWYgKHNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSkgeworICAgICAgaWYgKCFtRGF0YSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgIH0KKworICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCk7CisgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgIHZvaWQqIHJlc3VsdCA9IG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGxwdHIgPyBzaXplIDogMDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1MZW5ndGggPSAwOworICAgIE11dGV4IG1Mb2NrOworICAgIHVpbnQzMl90IG1GbGFncyA9IDA7CisKKyAgIHByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnVmZmVyU291cmNlKTsKKyAgfTsKKworICBzcDxCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CisgIERhdGFTb3VyY2UqIG1EYXRhU291cmNlID0gbnVsbHB0cjsKKyAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqIG1FeHRyYWN0b3IgPSBudWxscHRyOworCisgIHZpcnR1YWwgdm9pZCBleHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwKTsKKyAgdmlydHVhbCB2b2lkIHNlZWtBbmRFeHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9taWRpX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21pZGlfZXh0cmFjdG9yX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyYTEyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9taWRpX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTWlkaUV4dHJhY3Rvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTUlESUV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1JRElFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NSURJRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1JRElFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNaWRpRXh0cmFjdG9yKG1EYXRhU291cmNlLT53cmFwKCkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIE1JRElFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNSURJRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWlkaV9leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWlkaV9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YmI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9taWRpX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDMgQEAKKyMgTUlESSBDaHVua3MKK2t3MT0iTVRoZCIKK2t3Mj0iTVRyayIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWI5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1LVkV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNS1ZFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTUtWRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTUtWRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODE1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0NCBAQAorIyBFbGVtZW50cyBJRCdzCitrdzE9Ilx4NDJceDg2Igora3cyPSJceDQyXHhGNyIKK2t3Mz0iXHg0Mlx4RjIiCitrdzQ9Ilx4NDJceEYzIgora3c1PSJceDQyXHg4NyIKK2t3Nj0iXHg0Mlx4ODUiCitrdzc9Ilx4MThceDUzXHg4MFx4NjciCitrdzg9Ilx4MTFceDREXHg5Qlx4NzQiCitrdzk9Ilx4NERceEJCIgora3cxMD0iXHg1M1x4QUIiCitrdzExPSJceDUzXHhBQyIKK2t3MTI9Ilx4MTVceDQ5XHhBOVx4NjYiCitrdzEzPSJceDczXHhBNCIKK2t3MTQ9Ilx4NzNceDg0Igora3cxNT0iXHgzQ1x4QjlceDIzIgora3cxNj0iXHgzQ1x4ODNceEFCIgora3cxNz0iXHgzQ1x4QjlceDIzIgora3cxOD0iXHgzRVx4ODNceEJCIgora3cxOT0iXHg0NFx4NDQiCitrdzIwPSJceDY5XHgyNCIKK2t3MjE9Ilx4NjlceEZDIgora3cyMj0iXHg2OVx4QkYiCitrdzIzPSJceDY5XHhBNSIKK2t3MjQ9Ilx4MkFceEQ3XHhCMSIKK2t3MjU9Ilx4NDRceDg5Igora3cyNj0iXHg0NFx4NjEiCitrdzI3PSJceDdCXHhBOSIKK2t3Mjg9Ilx4NERceDgwIgora3cyOT0iXHg1N1x4NDEiCitrdzMwPSJceDFGXHg0M1x4QjZceDc1Igora3czMT0iXHhFNyIKK2t3MzI9Ilx4NThceDU0Igora3czMz0iXHg1OFx4RDciCitrdzM0PSJceEE3Igora3czNT0iXHhBQiIKK2t3MzY9Ilx4QTMiCitrdzM3PSJceEEwIgora3czOD0iXHhBMSIKK2t3Mzk9Ilx4QTIiCitrdzQwPSJceDc1XHhBMSIKK2t3NDE9Ilx4MkFceEQ3XHhCMSIKK2t3NDI9Ilx4QTYiCitrdzQzPSJceEVFIgora3c0ND0iXHhBNSIKK2t3NDU9Ilx4OUEiCitrdzQ2PSJceEZBIgora3c0Nz0iXHhGQiIKK2t3NDg9Ilx4RkQiCitrdzQ5PSJceEE0Igora3c1MD0iXHg3NVx4QTIiCitrdzUxPSJceDhFIgora3c1Mj0iXHhFOCIKK2t3NTM9Ilx4Q0MiCitrdzU0PSJceENEIgora3c1NT0iXHhDQiIKK2t3NTY9Ilx4Q0UiCitrdzU3PSJceENGIgora3c1OD0iXHhDOCIKK2t3NTk9Ilx4QzkiCitrdzYwPSJceENBIgora3c2MT0iXHhBRiIKK2t3NjI9Ilx4MTZceDU0XHhBRVx4NkIiCitrdzYzPSJceEFFIgora3c2ND0iXHhENyIKK2t3NjU9Ilx4NzNceEM1Igora3c2Nj0iXHg4MyIKK2t3Njc9Ilx4QjkiCitrdzY4PSJceDg4Igora3c2OT0iXHg1NVx4QUEiCitrdzcwPSJceDlDIgora3c3MT0iXHg2RFx4RTciCitrdzcyPSJceDZEXHhGOCIKK2t3NzM9Ilx4MjNceEUzXHg4MyIKK2t3NzQ9Ilx4MjNceDRFXHg3QSIKK2t3NzU9Ilx4MjNceDMxXHg0RiIKK2t3NzY9Ilx4NTNceDdGIgora3c3Nz0iXHg1NVx4RUUiCitrdzc4PSJceDUzXHg2RSIKK2t3Nzk9Ilx4MjJceEI1XHg5QyIKK2t3ODA9Ilx4MjJceEI1XHg5RCIKK2t3ODE9Ilx4ODYiCitrdzgyPSJceDYzXHhBMiIKK2t3ODM9Ilx4MjVceDg2XHg4OCIKK2t3ODQ9Ilx4MjZceEIyXHg0MCIKK2t3ODU9Ilx4QUEiCitrdzg2PSJceDZGXHhBQiIKK2t3ODc9Ilx4NTZceEFBIgora3c4OD0iXHg1Nlx4QkIiCitrdzg5PSJceDY2XHgyNCIKK2t3OTA9Ilx4NjZceEZDIgora3c5MT0iXHg2Nlx4QkYiCitrdzkyPSJceEUwIgora3c5Mz0iXHg5QSIKK2t3OTQ9Ilx4OUQiCitrdzk1PSJceDUzXHhCOCIKK2t3OTY9Ilx4NTNceEMwIgora3c5Nz0iXHg1M1x4QjkiCitrdzk4PSJceEIwIgora3c5OT0iXHhCQSIKK2t3MTAwPSJceDU0XHhBQSIKK2t3MTAxPSJceDU0XHhCQiIKK2t3MTAyPSJceDU0XHhDQyIKK2t3MTAzPSJceDU0XHhERCIKK2t3MTA0PSJceDU0XHhCMCIKK2t3MTA1PSJceDU0XHhCQSIKK2t3MTA2PSJceDU0XHhCMiIKK2t3MTA3PSJceDU0XHhCMyIKK2t3MTA4PSJceDJFXHhCNVx4MjQiCitrdzEwOT0iXHgyRlx4QjVceDIzIgora3cxMTA9Ilx4MjNceDgzXHhFMyIKK2t3MTExPSJceDU1XHhCMCIKK2t3MTEyPSJceDU1XHhCMSIKK2t3MTEzPSJceDU1XHhCMiIKK2t3MTE0PSJceDU1XHhCMyIKK2t3MTE1PSJceDU1XHhCNCIKK2t3MTE2PSJceDU1XHhCNSIKK2t3MTE3PSJceDU1XHhCNiIKK2t3MTE4PSJceDU1XHhCNyIKK2t3MTE5PSJceDU1XHhCOCIKK2t3MTIwPSJceDU1XHhCOSIKK2t3MTIxPSJceDU1XHhCQSIKK2t3MTIyPSJceDU1XHhCQiIKK2t3MTIzPSJceDU1XHhCQyIKK2t3MTI0PSJceDU1XHhCRCIKK2t3MTI1PSJceDU1XHhEMCIKK2t3MTI2PSJceDU1XHhEMSIKK2t3MTI3PSJceDU1XHhEMiIKK2t3MTI4PSJceDU1XHhEMyIKK2t3MTI5PSJceDU1XHhENCIKK2t3MTMwPSJceDU1XHhENSIKK2t3MTMxPSJceDU1XHhENiIKK2t3MTMyPSJceDU1XHhENyIKK2t3MTMzPSJceDU1XHhEOCIKK2t3MTM0PSJceDU1XHhEOSIKK2t3MTM1PSJceDU1XHhEQSIKK2t3MTM2PSJceDc2XHg3MCIKK2t3MTM3PSJceDc2XHg3MSIKK2t3MTM4PSJceDc2XHg3MiIKK2t3MTM5PSJceDc2XHg3MyIKK2t3MTQwPSJceDc2XHg3NCIKK2t3MTQxPSJceDc2XHg3NSIKK2t3MTQyPSJceEUxIgora3cxNDM9Ilx4QjUiCitrdzE0ND0iXHg3OFx4QjUiCitrdzE0NT0iXHg5RiIKK2t3MTQ2PSJceDdEXHg3QiIKK2t3MTQ3PSJceDYyXHg2NCIKK2t3MTQ4PSJceEUyIgora3cxNDk9Ilx4RTMiCitrdzE1MD0iXHhFNCIKK2t3MTUxPSJceEU1Igora3cxNTI9Ilx4RTYiCitrdzE1Mz0iXHhFOSIKK2t3MTU0PSJceEVEIgora3cxNTU9Ilx4QzAiCitrdzE1Nj0iXHhDMSIKK2t3MTU3PSJceEM2Igora3cxNTg9Ilx4QzciCitrdzE1OT0iXHhDNCIKK2t3MTYwPSJceDZEXHg4MCIKK2t3MTYxPSJceDYyXHg0MCIKK2t3MTYyPSJceDUwXHgzMSIKK2t3MTYzPSJceDUwXHgzMiIKK2t3MTY0PSJceDUwXHgzMyIKK2t3MTY1PSJceDUwXHgzNCIKK2t3MTY2PSJceDUwXHgzNSIKK2t3MTY3PSJceDQyXHg1NCIKK2t3MTY4PSJceDQyXHg1NSIKK2t3MTY5PSJceDQ3XHhFMSIKK2t3MTcwPSJceDQ3XHhFMiIKK2t3MTcxPSJceDQ3XHhFNyIKK2t3MTcyPSJceDQ3XHhFOCIKK2t3MTczPSJceDQ3XHhFMyIKK2t3MTc0PSJceDQ3XHhFNCIKK2t3MTc1PSJceDQ3XHhFNSIKK2t3MTc2PSJceDQ3XHhFNiIKK2t3MTc3PSJceDFDXHg1M1x4QkJceDZCIgora3cxNzg9Ilx4QkIiCitrdzE3OT0iXHhCMyIKK2t3MTgwPSJceEI3Igora3cxODE9Ilx4RjciCitrdzE4Mj0iXHhGMSIKK2t3MTgzPSJceEYwIgora3cxODQ9Ilx4QjIiCitrdzE4NT0iXHg1M1x4NzgiCitrdzE4Nj0iXHhFQSIKK2t3MTg3PSJceERCIgora3cxODg9Ilx4OTYiCitrdzE4OT0iXHg5NyIKK2t3MTkwPSJceDUzXHg1RiIKK2t3MTkxPSJceEVCIgora3cxOTI9Ilx4MTlceDQxXHhBNFx4NjkiCitrdzE5Mz0iXHg0Nlx4N0UiCitrdzE5ND0iXHg0Nlx4NkUiCitrdzE5NT0iXHg0Nlx4NjAiCitrdzE5Nj0iXHg0Nlx4NUMiCitrdzE5Nz0iXHg0Nlx4QUUiCitrdzE5OD0iXHg0Nlx4NzUiCitrdzE5OT0iXHg0Nlx4NjEiCitrdzIwMD0iXHg0Nlx4NjIiCitrdzIwMT0iXHgxMFx4NDNceEE3XHg3MCIKK2t3MjAyPSJceDQ1XHhCOSIKK2t3MjAzPSJceDQ1XHhCQyIKK2t3MjA0PSJceDQ1XHhCRCIKK2t3MjA1PSJceDQ1XHhEQiIKK2t3MjA2PSJceDQ1XHhERCIKK2t3MjA3PSJceEI2Igora3cyMDg9Ilx4NzNceEM0Igora3cyMDk9Ilx4NTZceDU0Igora3cyMTA9Ilx4OTEiCitrdzIxMT0iXHg5MiIKK2t3MjEyPSJceDk4Igora3cyMTM9Ilx4NDVceDk4Igora3cyMTQ9Ilx4NkVceDY3Igora3cyMTU9Ilx4NkVceEJDIgora3cyMTY9Ilx4NjNceEMzIgora3cyMTc9Ilx4OEYiCitrdzIxOD0iXHg4OSIKK2t3MjE5PSJceDgwIgora3cyMjA9Ilx4ODUiCitrdzIyMT0iXHg0M1x4N0MiCitrdzIyMj0iXHg0M1x4N0QiCitrdzIyMz0iXHg0M1x4N0UiCitrdzIyND0iXHg2OVx4NDQiCitrdzIyNT0iXHg2OVx4NTUiCitrdzIyNj0iXHg0NVx4MEQiCitrdzIyNz0iXHg2OVx4MTEiCitrdzIyOD0iXHg2OVx4MjIiCitrdzIyOT0iXHg2OVx4MzMiCitrdzIzMD0iXHgxMlx4NTRceEMzXHg2NyIKK2t3MjMxPSJceDczXHg3MyIKK2t3MjMyPSJceDYzXHhDMCIKK2t3MjMzPSJceDY4XHhDQSIKK2t3MjM0PSJceDYzXHhDQSIKK2t3MjM1PSJceDYzXHhDNSIKK2t3MjM2PSJceDYzXHhDOSIKK2t3MjM3PSJceDY3XHhDOCIKK2t3MjM4PSJceDQ1XHhBMyIKK2t3MjM5PSJceDQ0XHg3QSIKK2t3MjQwPSJceDQ0XHg3QiIKK2t3MjQxPSJceDQ0XHg4NCIKK2t3MjQyPSJceDQ0XHg4NyIKK2t3MjQzPSJceDQ0XHg4NSIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDdjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVAzRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNcDNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTXAzRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTVAzRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCBudWxscHRyKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNcDNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNcDNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTVA0RXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1QNEV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgc2V0RGF0YVNvdXJjZUZsYWdzKERhdGFTb3VyY2VCYXNlOjprV2FudHNQcmVmZXRjaGluZyB8IERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTVA0RXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTVA0RXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODM2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0OCBAQAorIyBNUDQgQXRvbXMvQm94ZXMKK2t3MT0iZnR5cCIKK2t3Mj0iZnJlZSIKK2t3Mz0ibWRhdCIKK2t3ND0ibW9vdiIKK2t3NT0ibXZoZCIKK2t3Nj0idHJhayIKK2t3Nz0idGtoZCIKK2t3OD0iZWR0cyIKK2t3OT0iZWxzdCIKK2t3MTA9Im1kaWEiCitrdzExPSJtZGhkIgora3cxMj0iaGRsciIKK2t3MTM9Im1pbmYiCitrdzE0PSJ2bWhkIgora3cxNT0iZGluZiIKK2t3MTY9ImRyZWYiCitrdzE3PSJ1cmwgIgora3cxOD0ic3RibCIKK2t3MTk9InN0c2QiCitrdzIwPSJhdmMxIgora3cyMT0iYXZjQyIKK2t3MjI9InN0dHMiCitrdzIzPSJzdHNzIgora3cyND0iY3R0cyIKK2t3MjU9InN0c2MiCitrdzI2PSJzdHN6Igora3cyNz0ic3RjbyIKK2t3Mjg9Im1wNGEiCitrdzI5PSJlc2RzIgora3czMD0idWR0YSIKK2t3MzE9Im1ldGEiCitrdzMyPSJpbHN0Igora3czMz0ic2FtciIKK2t3MzQ9InNhd2IiCitrdzM1PSJlYy0zIgora3czNj0ibXA0diIKK2t3Mzc9InMyNjMiCitrdzM4PSJoMjYzIgora3czOT0iSDI2MyIKK2t3NDA9ImF2YzEiCitrdzQxPSJodmMxIgora3c0Mj0iaGV2MSIKK2t3NDM9ImFjLTQiCitrdzQ0PSJPcHVzIgora3c0NT0idHdvcyIKK2t3NDY9InNvd3QiCitrdzQ3PSJhbGFjIgora3c0OD0iZkxhQyIKK2t3NDk9ImF2MDEiCitrdzUwPSIubXAzIgora3c1MT0ia2V5cyIKK2t3NTI9ImNwcnQiCitrdzUzPSJjb3ZyIgora3c1ND0ibXZleCIKK2t3NTU9Im1vb2YiCitrdzU2PSJ0cmFmIgora3c1Nz0ibWZyYSIKK2t3NTg9InNpbmYiCitrdzU5PSJzY2hpIgora3c2MD0id2F2ZSIKK2t3NjE9InNjaG0iCitrdzYyPSJjYmMxIgora3c2Mz0iY2JjcyIKK2t3NjQ9ImNlbmMiCitrdzY1PSJjZW5zIgora3c2Nj0iZnJtYSIKK2t3Njc9InRlbmMiCitrdzY4PSJ0cmVmIgora3c2OT0idGhtYiIKK2t3NzA9InBzc2giCitrdzcxPSJtZXR0Igora3c3Mj0iZW5jYSIKK2t3NzM9ImVuY3YiCitrdzc0PSJjbzY0Igora3c3NT0ic3R6MiIKK2t3NzY9Ilx4QTl4eXoiCitrdzc3PSJidHJ0Igora3c3OD0iaHZjQyIKK2t3Nzk9ImF2MUMiCitrdzgwPSJkMjYzIgora3c4MT0iaWxvYyIKK2t3ODI9ImlpbmYiCitrdzgzPSJpcHJwIgora3c4ND0icGl0bSIKK2t3ODU9ImlkYXQiCitrdzg2PSJpcmVmIgora3c4Nz0iaXBybyIKK2t3ODg9Im1lYW4iCitrdzg5PSJuYW1lIgora3c5MD0iZGF0YSIKK2t3OTE9Im1laGQiCitrdzkyPSJ0ZXh0Igora3c5Mz0ic2J0bCIKK2t3OTQ9InRyZXgiCitrdzk1PSJ0eDNnIgora3c5Nj0iY29sciIKK2t3OTc9InRpdGwiCitrdzk4PSJwZXJmIgora3c5OT0iYXV0aCIKK2t3MTAwPSJnbnJlIgora3cxMDE9ImFsYm0iCitrdzEwMj0ieXJyYyIKK2t3MTAzPSJJRDMyIgora3cxMDQ9Ii0tLS0iCitrdzEwNT0ic2lkeCIKK2t3MTA2PSJhYy0zIgora3cxMDc9InF0ICAiCitrdzEwOD0ibWlmMSIKK2t3MTA5PSJoZWljIgora3cxMTA9ImRhYzQiCitrdzExMT0iZGVjMyIKK2t3MTEyPSJkYWMzIgora3cxMTM9Ilx4QTlhbGIiCitrdzExND0iXHhBOUFSVCIKK2t3MTE1PSJhQVJUIgora3cxMTY9Ilx4QTlkYXkiCitrdzExNz0iXHhBOW5hbSIKK2t3MTE4PSJceEE5d3J0Igora3cxMTk9Ilx4QTlnZW4iCitrdzEyMD0iY3BpbCIKK2t3MTIxPSJ0cmtuIgora3cxMjI9ImRpc2siCitrdzEyMz0ibmNseCIKK2t3MTI0PSJuY2xjIgora3cxMjU9InRmaGQiCitrdzEyNj0idHJ1biIKK2t3MTI3PSJzYWl6Igora3cxMjg9InNhaW8iCitrdzEyOT0ic2VuYyIKK2t3MTMwPSJpc29tIgora3cxMzE9ImlzbzIiCitrdzEzMj0iM2dwNCIKK2t3MTMzPSJtcDQxIgora3cxMzQ9Im1wNDIiCitrdzEzNT0iZGFzaCIKK2t3MTM2PSJudnIxIgora3cxMzc9Ik1TTlYiCitrdzEzOD0id21mICIKK2t3MTM5PSIzZzJhIgora3cxNDA9IjNnMmIiCitrdzE0MT0ibXNmMSIKK2t3MTQyPSJoZXZjIgora3cxNDM9InBkaW4iCitrdzE0ND0idHJnciIKK2t3MTQ1PSJzbWhkIgora3cxNDY9ImhtaGQiCitrdzE0Nz0ibm1oZCIKK2t3MTQ4PSJjc2xnIgora3cxNDk9InN0c2giCitrdzE1MD0icGFkYiIKK2t3MTUxPSJzdGRwIgora3cxNTI9InNkdHAiCitrdzE1Mz0ic2JncCIKK2t3MTU0PSJzZ3BkIgora3cxNTU9InN1YnMiCitrdzE1Nj0ibGV2YSIKK2t3MTU3PSJtZmhkIgora3cxNTg9InRmZHQiCitrdzE1OT0idGZyYSIKK2t3MTYwPSJtZnJvIgora3cxNjE9InNraXAiCitrdzE2Mj0idHNlbCIKK2t3MTYzPSJzdHJrIgora3cxNjQ9InN0cmkiCitrdzE2NT0ic3RyZCIKK2t3MTY2PSJ4bWwgIgora3cxNjc9ImJ4bWwiCitrdzE2OD0iZmlpbiIKK2t3MTY5PSJwYWVuIgora3cxNzA9ImZpcmUiCitrdzE3MT0iZnBhciIKK2t3MTcyPSJmZWNyIgora3cxNzM9InNlZ3IiCitrdzE3ND0iZ2l0biIKK2t3MTc1PSJtZWNvIgora3cxNzY9Im1lcmUiCitrdzE3Nz0ic3R5cCIKK2t3MTc4PSJzc2l4Igora3cxNzk9InByZnQiCitrdzE4MD0iaGludCIKK2t3MTgxPSJjZHNjIgora3cxODI9ImhpbmQiCitrdzE4Mz0idmRlcCIKK2t3MTg0PSJ2cGx4Igora3cxODU9Im1zcmMiCitrdzE4Nj0idXJuICIKK2t3MTg3PSJlbmN0Igora3cxODg9ImVuY3MiCitrdzE4OT0icmluZiIKK2t3MTkwPSJzcnBwIgora3cxOTE9InN0c2ciCitrdzE5Mj0ic3R2aSIKK2t3MTkzPSJ0aW1zIgora3cxOTQ9InRzcm8iCitrdzE5NT0ic25ybyIKK2t3MTk2PSJydHAgIgora3cxOTc9InNydHAiCitrdzE5OD0icnRwbyIKK2t3MTk5PSJobnRpIgora3cyMDA9InNkcCAiCitrdzIwMT0idHJweSIKK2t3MjAyPSJudW1wIgora3cyMDM9InRweWwiCitrdzIwND0idG90bCIKK2t3MjA1PSJucGNrIgora3cyMDY9InRwYXkiCitrdzIwNz0ibWF4ciIKK2t3MjA4PSJkbWVkIgora3cyMDk9ImRpbW0iCitrdzIxMD0iZHJlcCIKK2t3MjExPSJ0bWluIgora3cyMTI9InRtYXgiCitrdzIxMz0icG1heCIKK2t3MjE0PSJkbWF4Igora3cyMTU9InBheXQiCitrdzIxNj0iZmRwICIKK2t3MjE3PSJmZHNhIgora3cyMTg9ImZkcGEiCitrdzIxOT0iZXh0ciIKK2t3MjIwPSJmZWNpIgora3cyMjE9InJtMnQiCitrdzIyMj0ic20ydCIKK2t3MjIzPSJ0UEFUIgora3cyMjQ9InRQTVQiCitrdzIyNT0idE9EICIKK2t3MjI2PSJ0c3RpIgora3cyMjc9ImlzdG0iCitrdzIyOD0icG0ydCIKK2t3MjI5PSJycnRwIgora3cyMzA9InJzc3IiCitrdzIzMT0icnNjciIKK2t3MjMyPSJyc3JwIgora3cyMzM9InJzc3IiCitrdzIzND0iY2NpZCIKK2t3MjM1PSJzcm9jIgora3cyMzY9InBydHAiCitrdzIzNz0icm9sbCIKK2t3MjM4PSJyYXNoIgora3cyMzk9ImFsc3QiCitrdzI0MD0icmFwICIKK2t3MjQxPSJ0ZWxlIgora3cyNDI9Im1wNzEiCitrdzI0Mz0iaXNvMyIKK2t3MjQ0PSJpc280Igora3cyNDU9ImlzbzUiCitrdzI0Nj0icmVzdiIKK2t3MjQ3PSJpc282IgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGVmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpZmRlZiBNUEVHMlBTCisjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgorI2Vsc2UKKyNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1QRUcyRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVBFRzJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NUEVHMkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNUEVHMkV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworI2lmZGVmIE1QRUcyUFMKKyAgbUV4dHJhY3RvciA9IG5ldyBNUEVHMlBTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyNlbHNlCisgIG1FeHRyYWN0b3IgPSBuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisjZW5kaWYKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNUEVHMkV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1QRUcyRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzkwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQora3cxPSJceDAwXHgwMFx4MDFceEJBIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmExZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGJ5dGUKK2t3MT0iXHg0NyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmZjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiT2dnRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBPR0dFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBPR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5PR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgT0dHRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBPR0dFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBPR0dFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZmMzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMyBAQAorIyBTdGFydCBjb2RlKGJ5dGVzIDAtMykKKyMgVGhlIGJlbG93IDQgYnl0ZXMgY29ycmVzcG9uZCB0byAiT2dnUyIgaW4gQVNDSUkKK2t3MT0iXHg0Rlx4NjdceDY3XHg1MyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy93YXZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTFlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyB3YXZFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICB3YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH53YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgd2F2RXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3YXZFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyB3YXZFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKaW5kZXggYjgyNTVmYy4uMDhhNmZhMCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfbWlkaV9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX21pZGlfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1pZGlleHRyYWN0b3IiLAogICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLApAQCAtNSw3ICsyNCw3IEBACiAgICAgc3JjczogWyJNaWRpRXh0cmFjdG9yLmNwcCJdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTE4LDQgKzM3LDEyIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgIF0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAppbmRleCA3YWQ4Y2MxLi41NGM1YjI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19ta3ZfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX21rdl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWt2ZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTE1LDEwICszMiwxOSBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9jb2xvcnV0aWxzX25kayIsICAgLy8gZm9yIG1haW5saW5lLXNhZmUgQ29sb3JVdGlscwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCAyN2JkMzU3Li40NDNlMjZjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0xNzAwLDE3ICsxNzAwLDE3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgc2l6ZV90IGhlYWRlcl9zdGFydCA9IDA7Ci0gICAgc2l6ZV90IGhlYWRlcl9sZW50aCA9IDA7CisgICAgbG9uZyBoZWFkZXJfc3RhcnQgPSAwOworICAgIGxvbmcgaGVhZGVyX2xlbmd0aCA9IDA7CiAgICAgZm9yIChoZWFkZXJfc3RhcnQgPSAwOyBoZWFkZXJfc3RhcnQgPCBmcmFtZS5sZW4gLSA0OyBoZWFkZXJfc3RhcnQrKykgewogICAgICAgICBpZiAobnRvaGwoMHgwMDAwMDFiMykgPT0gKih1aW50MzJfdCopKCh1aW50OF90Kil0bXBEYXRhLmdldCgpICsgaGVhZGVyX3N0YXJ0KSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgYm9vbCBpc0NvbXBsZXRlX2NzZCA9IGZhbHNlOwotICAgIGZvciAoaGVhZGVyX2xlbnRoID0gMDsgaGVhZGVyX2xlbnRoIDwgZnJhbWUubGVuIC0gNCAtIGhlYWRlcl9zdGFydDsgaGVhZGVyX2xlbnRoKyspIHsKKyAgICBmb3IgKGhlYWRlcl9sZW5ndGggPSAwOyBoZWFkZXJfbGVuZ3RoIDwgZnJhbWUubGVuIC0gNCAtIGhlYWRlcl9zdGFydDsgaGVhZGVyX2xlbmd0aCsrKSB7CiAgICAgICAgIGlmIChudG9obCgweDAwMDAwMWI4KSA9PSAqKHVpbnQzMl90KikoKHVpbnQ4X3QqKXRtcERhdGEuZ2V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVudGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyX3N0YXJ0ICsgaGVhZGVyX2xlbmd0aCkpIHsKICAgICAgICAgICAgIGlzQ29tcGxldGVfY3NkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNzIwLDcgKzE3MjAsNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSh0cmFja0luZm8tPm1NZXRhLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikodG1wRGF0YS5nZXQoKSkgKyBoZWFkZXJfc3RhcnQsIGhlYWRlcl9sZW50aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSh0bXBEYXRhLmdldCgpKSArIGhlYWRlcl9zdGFydCwgaGVhZGVyX2xlbmd0aCk7CiAKICAgICByZXR1cm4gT0s7CiAKQEAgLTE4ODgsMTMgKzE4ODgsMTIgQEAKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwotICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKKyAgICAgICAgaWYgKGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQ291bnQoKSA+IDApIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKLSAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7CisgICAgICAgICAgICBlbmNyeXB0aW9uID0gZW5jb2RpbmctPkdldEVuY3J5cHRpb25CeUluZGV4KDApOwogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcih0cmFja0luZm8tPm1NZXRhLAogICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGVuY3J5cHRpb24tPmtleV9pZCwgZW5jcnlwdGlvbi0+a2V5X2lkX2xlbik7CiAgICAgICAgICAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldENvbXByZXNzaW9uQ291bnQoKTsgaisrKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAppbmRleCAxMDJhYzgxLi43NWI5YjdiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKICAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZGVmYXVsdHMiXSwKQEAgLTEzLDQgKzIyLDExIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKaW5kZXggNTE2NTgyMi4uMjQ4YTM5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCkBAIC00MjUsOCArNDI1LDcgQEAKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwotICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTUwNSw3ICs1MDQsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrVGltZVVzOwotICAgICAgICAgICAgbUN1cnJlbnRQb3MgPSBtRmlyc3RGcmFtZVBvcyArIHNlZWtUaW1lVXMgKiBiaXRyYXRlIC8gODAwMDAwMDsKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVc1RpbWVzQml0cmF0ZTsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNlZWtUaW1lVXMsIGJpdHJhdGUsICZzZWVrVGltZVVzVGltZXNCaXRyYXRlKSkgeworICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coCisgICAgICAgICAgICAgICAgICAgIG1GaXJzdEZyYW1lUG9zLCBzZWVrVGltZVVzVGltZXNCaXRyYXRlIC8gODAwMDAwMCwgJm1DdXJyZW50UG9zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZWVrQ0JSID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gYWN0dWFsU2Vla1RpbWVVczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCmluZGV4IGU0OGUxYjcuLjdmYTZiZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX21wNF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfbXA0X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3IiLAogICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLApAQCAtMTYsNCArMzMsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCmluZGV4IDA3NzMzODcuLjQ0NDY2NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtNzYsMTYgKzc2LDE5IEBACiAgICAgc2l6ZV90IHNpemU7CiAgICAgc3A8QUJ1ZmZlcj4gaHZjYzsKICAgICBzcDxBQnVmZmVyPiBpY2M7CisgICAgc3A8QUJ1ZmZlcj4gYXYxYzsKIAogICAgIFZlY3Rvcjx1aW50MzJfdD4gdGh1bWJuYWlsczsKICAgICBWZWN0b3I8dWludDMyX3Q+IGRpbWdSZWZzOwotICAgIFZlY3Rvcjx1aW50MzJfdD4gY2RzY1JlZnM7CisgICAgVmVjdG9yPHVpbnQzMl90PiBleGlmUmVmczsKKyAgICBWZWN0b3I8dWludDMyX3Q+IHhtcFJlZnM7CiAgICAgc2l6ZV90IG5leHRUaWxlSW5kZXg7CiB9OwogCi1zdHJ1Y3QgRXhpZkl0ZW0geworc3RydWN0IEV4dGVybmFsTWV0YUl0ZW0gewogICAgIG9mZjY0X3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOworICAgIGJvb2wgaXNFeGlmOwogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC00ODEsNyArNDg0LDcgQEAKIAogICAgIHZvaWQgYXBwbHkoCiAgICAgICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSW1hZ2VJdGVtPiAmaXRlbUlkVG9JdGVtTWFwLAotICAgICAgICAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4aWZJdGVtPiAmaXRlbUlkVG9FeGlmTWFwKSBjb25zdDsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBFeHRlcm5hbE1ldGFJdGVtPiAmaXRlbUlkVG9NZXRhTWFwKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtSXRlbUlkOwpAQCAtNDkzLDcgKzQ5Niw3IEBACiAKIHZvaWQgSXRlbVJlZmVyZW5jZTo6YXBwbHkoCiAgICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJbWFnZUl0ZW0+ICZpdGVtSWRUb0l0ZW1NYXAsCi0gICAgICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBFeGlmSXRlbT4gJml0ZW1JZFRvRXhpZk1hcCkgY29uc3QgeworICAgICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgRXh0ZXJuYWxNZXRhSXRlbT4gJml0ZW1JZFRvTWV0YU1hcCkgY29uc3QgewogICAgIEFMT0dWKCJhdHRhY2ggcmVmZXJlbmNlIHR5cGUgMHgleCB0byBpdGVtIGlkICVkKSIsIHR5cGUoKSwgbUl0ZW1JZCk7CiAKICAgICBzd2l0Y2godHlwZSgpKSB7CkBAIC01NDYsMjQgKzU0OSwyNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyB0aHVtYm5haWwgaXRlbSBpZCAlZCIsIG1SZWZzW2ldLCBtSXRlbUlkKTsKLSAgICAgICAgICAgIEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBpdGVtSWRUb0l0ZW1NYXAuZWRpdFZhbHVlQXQoaXRlbUluZGV4KTsKLSAgICAgICAgICAgIGlmICghbWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBJbWFnZUl0ZW0gJmltYWdlSXRlbSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOworICAgICAgICAgICAgaWYgKCFpbWFnZUl0ZW0udGh1bWJuYWlscy5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImFscmVhZHkgaGFzIHRodW1ibmFpbHMhIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXN0ZXJJbWFnZS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKKyAgICAgICAgICAgIGltYWdlSXRlbS50aHVtYm5haWxzLnB1c2hfYmFjayhtSXRlbUlkKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBGT1VSQ0MoImNkc2MiKTogewotICAgICAgICBzc2l6ZV90IGl0ZW1JbmRleCA9IGl0ZW1JZFRvRXhpZk1hcC5pbmRleE9mS2V5KG1JdGVtSWQpOworICAgICAgICBzc2l6ZV90IG1ldGFJbmRleCA9IGl0ZW1JZFRvTWV0YU1hcC5pbmRleE9mS2V5KG1JdGVtSWQpOwogCi0gICAgICAgIC8vIGlnbm9yZSBub24tZXhpZiBibG9jayBpdGVtcwotICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgeworICAgICAgICAvLyBpZ25vcmUgbm9uLW1ldGEgaXRlbXMKKyAgICAgICAgaWYgKG1ldGFJbmRleCA8IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlZnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGl0ZW1JbmRleCA9IGl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KG1SZWZzW2ldKTsKKyAgICAgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVJlZnNbaV0pOwogCiAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCiAgICAgICAgICAgICBpZiAoaXRlbUluZGV4IDwgMCkgewpAQCAtNTcxLDcgKzU3NCwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIkltYWdlIGl0ZW0gaWQgJWQgdXNlcyBtZXRhZGF0YSBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOwogICAgICAgICAgICAgSW1hZ2VJdGVtICZpbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOwotICAgICAgICAgICAgaW1hZ2UuY2RzY1JlZnMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgaWYgKGl0ZW1JZFRvTWV0YU1hcFttZXRhSW5kZXhdLmlzRXhpZikgeworICAgICAgICAgICAgICAgIGltYWdlLmV4aWZSZWZzLnB1c2hfYmFjayhtSXRlbUlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1hZ2UueG1wUmVmcy5wdXNoX2JhY2sobUl0ZW1JZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNzY0LDYgKzc3MSwzOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RydWN0IEF2MWNCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKKyAgICBBdjFjQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImF2MUMiKSkge30KKworICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGF0dGFjaFRvKEltYWdlSXRlbSAmaW1hZ2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgaW1hZ2UuYXYxYyA9IG1BdjFjOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxBQnVmZmVyPiBtQXYxYzsKK307CisKK3N0YXR1c190IEF2MWNCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCIlczogb2Zmc2V0ICVsbGQsIHNpemUgJXp1IiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CisKKyAgICBtQXYxYyA9IG5ldyBBQnVmZmVyKHNpemUpOworCisgICAgaWYgKG1BdjFjLT5kYXRhKCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChzb3VyY2UoKS0+cmVhZEF0KG9mZnNldCwgbUF2MWMtPmRhdGEoKSwgc2l6ZSkgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICBBTE9HVigicHJvcGVydHkgYXYxQyIpOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdHJ1Y3QgSXJvdEJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewogICAgIElyb3RCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXJvdCIpKSwgbUFuZ2xlKDApIHt9CkBAIC05MjksNyArOTY5LDcgQEAKIAogc3RhdHVzX3QgSXBjb0JveDo6cGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CiAgICAgQUxPR1YoIiVzOiBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLSAgICAvLyBwdXNoIGR1bW15IGFzIHRoZSBpbmRleCBpcyAxLWJhc2VkCisgICAgLy8gcHVzaCBhIHBsYWNlaG9sZGVyIGFzIHRoZSBpbmRleCBpcyAxLWJhc2VkCiAgICAgbUl0ZW1Qcm9wZXJ0aWVzLT5wdXNoX2JhY2sobmV3IEl0ZW1Qcm9wZXJ0eSgpKTsKICAgICByZXR1cm4gcGFyc2VDaHVua3Mob2Zmc2V0LCBzaXplKTsKIH0KQEAgLTk1Nyw2ICs5OTcsMTEgQEAKICAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBDb2xyQm94KHNvdXJjZSgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdjFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBBdjFjQm94KHNvdXJjZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHB1c2ggZHVtbXkgdG8gbWFpbnRhaW4gY29ycmVjdCBpdGVtIHByb3BlcnR5IGluZGV4CkBAIC0xMDI2LDcgKzEwNzEsMjEgQEAKIHN0cnVjdCBJdGVtSW5mbyB7CiAgICAgdWludDMyX3QgaXRlbUlkOwogICAgIHVpbnQzMl90IGl0ZW1UeXBlOworICAgIFN0cmluZzggY29udGVudFR5cGU7CiAgICAgYm9vbCBoaWRkZW47CisKKyAgICBib29sIGlzWG1wKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXRlbVR5cGUgPT0gRk9VUkNDKCJtaW1lIikgJiYgY29udGVudFR5cGUgPT0gU3RyaW5nOCgiYXBwbGljYXRpb24vcmRmK3htbCIpOworICAgIH0KKyAgICBib29sIGlzRXhpZigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGl0ZW1UeXBlID09IEZPVVJDQygiRXhpZiIpOworICAgIH0KKyAgICBib29sIGlzR3JpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGl0ZW1UeXBlID09IEZPVVJDQygiZ3JpZCIpOworICAgIH0KKyAgICBib29sIGlzU2FtcGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXRlbVR5cGUgPT0gRk9VUkNDKCJhdjAxIikgfHwgaXRlbVR5cGUgPT0gRk9VUkNDKCJodmMxIik7CisgICAgfQogfTsKIAogc3RydWN0IEluZmVCb3ggOiBwdWJsaWMgRnVsbEJveCB7CkBAIC0xMTE2LDYgKzExNzUsNyBAQAogICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVtSW5mby0+Y29udGVudFR5cGUgPSBjb250ZW50X3R5cGU7CiAKICAgICAgICAgICAgIC8vIGNvbnRlbnRfZW5jb2RpbmcgaXMgb3B0aW9uYWw7IGNhbiBiZSBvbWl0dGVkIGlmIHdvdWxkIGJlIGVtcHR5CiAgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKQEAgLTExMzYsMTggKzExOTYsMTggQEAKIAogc3RydWN0IElpbmZCb3ggOiBwdWJsaWMgRnVsbEJveCB7CiAgICAgSWluZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpaW5mIikpLCBtSXRlbUluZm9zKGl0ZW1JbmZvcykge30KKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWluZiIpKSwgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpLCBtTmVlZElyZWYoZmFsc2UpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgYm9vbCBoYXNGb3VyQ0ModWludDMyX3QgdHlwZSkgeyByZXR1cm4gbUZvdXJDQ1NlZW4uY291bnQodHlwZSkgPiAwOyB9CisgICAgYm9vbCBuZWVkSXJlZkJveCgpIHsgcmV0dXJuIG1OZWVkSXJlZjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3Qgb25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBWZWN0b3I8SXRlbUluZm8+ICptSXRlbUluZm9zOwotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aW50MzJfdD4gbUZvdXJDQ1NlZW47CisgICAgYm9vbCBtTmVlZElyZWY7CiB9OwogCiBzdGF0dXNfdCBJaW5mQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTExOTQsNyArMTI1NCw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gaW5mZUJveC5wYXJzZShvZmZzZXQsIHNpemUsICZpdGVtSW5mbyk7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBtSXRlbUluZm9zLT5wdXNoX2JhY2soaXRlbUluZm8pOwotICAgICAgICBtRm91ckNDU2Vlbi5pbnNlcnQoaXRlbUluZm8uaXRlbVR5cGUpOworICAgICAgICBtTmVlZElyZWYgfD0gKGl0ZW1JbmZvLmlzRXhpZigpIHx8IGl0ZW1JbmZvLmlzWG1wKCkgfHwgaXRlbUluZm8uaXNHcmlkKCkpOwogICAgIH0KICAgICAvLyBJbmZlQm94IHBhcnNlIHJldHVybnMgRVJST1JfVU5TVVBQT1JURUQgaWYgdGhlIGJveCBpZiBhbiB1bnN1cHBvcnRlZAogICAgIC8vIHZlcnNpb24uIElnbm9yZSB0aGlzIGVycm9yIGFzIGl0J3Mgbm90IGZhdGFsLgpAQCAtMTIwMyw4ICsxMjYzLDkgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpc0hlaWYpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbUlzSGVpZihpc0hlaWYpLAogICAgICAgbVByaW1hcnlJdGVtSWQoMCksCiAgICAgICBtSWRhdE9mZnNldCgwKSwKICAgICAgIG1JZGF0U2l6ZSgwKSwKQEAgLTEyODMsNyArMTM0NCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaWYgKGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiZ3JpZCIpKSB8fCBpaW5mQm94Lmhhc0ZvdXJDQyhGT1VSQ0MoIkV4aWYiKSkpIHsKKyAgICBpZiAoaWluZkJveC5uZWVkSXJlZkJveCgpKSB7CiAgICAgICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXJlZicpOwogICAgIH0KIApAQCAtMTM1OSwxMSArMTQyMCw5IEBACiAKICAgICAgICAgLy8gT25seSBoYW5kbGUgMyB0eXBlcyBvZiBpdGVtcywgYWxsIG90aGVycyBhcmUgaWdub3JlZDoKICAgICAgICAgLy8gICAnZ3JpZCc6IGRlcml2ZWQgaW1hZ2UgZnJvbSB0aWxlcwotICAgICAgICAvLyAgICdodmMxJzogY29kZWQgaW1hZ2UgKG9yIHRpbGUpCi0gICAgICAgIC8vICAgJ0V4aWYnOiBFWElGIG1ldGFkYXRhCi0gICAgICAgIGlmIChpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiZ3JpZCIpICYmCi0gICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiaHZjMSIpICYmCi0gICAgICAgICAgICBpbmZvLml0ZW1UeXBlICE9IEZPVVJDQygiRXhpZiIpKSB7CisgICAgICAgIC8vICAgJ2h2YzEnIG9yICdhdjAxJzogY29kZWQgaW1hZ2UgKG9yIHRpbGUpCisgICAgICAgIC8vICAgJ0V4aWYnIG9yIFhNUDogbWV0YWRhdGEKKyAgICAgICAgaWYgKCFpbmZvLmlzR3JpZCgpICYmICFpbmZvLmlzU2FtcGxlKCkgJiYgIWluZm8uaXNFeGlmKCkgJiYgIWluZm8uaXNYbXAoKSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIApAQCAtMTM4NiwxNSArMTQ0NSwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpbmZvLml0ZW1UeXBlID09IEZPVVJDQygiRXhpZiIpKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IGFkZCBpZiB0aGUgRXhpZiBkYXRhIGlzIG5vbi1lbXB0eS4gVGhlIGZpcnN0IDQgYnl0ZXMgY29udGFpbgorICAgICAgICBpZiAoaW5mby5pc0V4aWYoKSB8fCBpbmZvLmlzWG1wKCkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgYWRkIGlmIHRoZSBtZXRhIGlzIG5vbi1lbXB0eS4gRm9yIEV4aWYsIHRoZSBmaXJzdCA0IGJ5dGVzIGNvbnRhaW4KICAgICAgICAgICAgIC8vIHRoZSBvZmZzZXQgdG8gVElGRiBoZWFkZXIsIHdoaWNoIHRoZSBFeGlmIHBhcnNlciBkb2Vzbid0IHVzZS4KLSAgICAgICAgICAgIGlmIChzaXplID4gNCkgewotICAgICAgICAgICAgICAgIEV4aWZJdGVtIGV4aWZJdGVtID0geworICAgICAgICAgICAgQUxPR1YoImFkZGluZyBtZXRhIHRvIG1JdGVtSWRUb01ldGFNYXA6IGlzRXhpZiAlZCwgb2Zmc2V0ICVsbGQsIHNpemUgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgIGluZm8uaXNFeGlmKCksIChsb25nIGxvbmcpb2Zmc2V0LCAobG9uZyBsb25nKXNpemUpOworICAgICAgICAgICAgaWYgKChpbmZvLmlzRXhpZigpICYmIHNpemUgPiA0KSB8fCAoaW5mby5pc1htcCgpICYmIHNpemUgPiAwKSkgeworICAgICAgICAgICAgICAgIEV4dGVybmFsTWV0YUl0ZW0gbWV0YUl0ZW0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAuaXNFeGlmID0gaW5mby5pc0V4aWYoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQgPSBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IHNpemUsCiAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBtSXRlbUlkVG9FeGlmTWFwLmFkZChpbmZvLml0ZW1JZCwgZXhpZkl0ZW0pOworICAgICAgICAgICAgICAgIG1JdGVtSWRUb01ldGFNYXAuYWRkKGluZm8uaXRlbUlkLCBtZXRhSXRlbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMTQyOSw3ICsxNDkxLDcgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtUmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0l0ZW1NYXAsIG1JdGVtSWRUb0V4aWZNYXApOworICAgICAgICBtSXRlbVJlZmVyZW5jZXNbaV0tPmFwcGx5KG1JdGVtSWRUb0l0ZW1NYXAsIG1JdGVtSWRUb01ldGFNYXApOwogICAgIH0KIAogICAgIGJvb2wgZm91bmRQcmltYXJ5ID0gZmFsc2U7CkBAIC0xNTA5LDcgKzE1NzEsOSBAQAogICAgIH0KIAogICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKLSAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKAorICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgIG1Jc0hlaWYgPyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMgOiBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKTsKIAogICAgIGlmIChpbWFnZS0+aXRlbUlkID09IG1QcmltYXJ5SXRlbUlkKSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsIDEpOwpAQCAtMTUzOSwxNSArMTYwMywyNCBAQAogICAgICAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGltYWdlLT50aHVtYm5haWxzWzBdKTsKICAgICAgICAgaWYgKHRodW1iSXRlbUluZGV4ID49IDApIHsKICAgICAgICAgICAgIGNvbnN0IEltYWdlSXRlbSAmdGh1bWJuYWlsID0gbUl0ZW1JZFRvSXRlbU1hcFt0aHVtYkl0ZW1JbmRleF07Ci0KLSAgICAgICAgICAgIGlmICh0aHVtYm5haWwuaHZjYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCB8fCB0aHVtYm5haWwuYXYxYyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCwgdGh1bWJuYWlsLndpZHRoKTsKICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCwgdGh1bWJuYWlsLmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWwuaHZjYy0+ZGF0YSgpLCB0aHVtYm5haWwuaHZjYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgaGFyZC1jb2RlZCBzdHJpbmcgaGVyZSBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgIC8vIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9BVjFDLiBUaGUga2V5IGlzIGF2YWlsYWJsZSBvbmx5IGZyb20gU0RLIDMxLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbXA0IGV4dHJhY3RvciBpcyBwYXJ0IG9mIG1haW5saW5lIGFuZCBidWlsZHMgYWdhaW5zdCBTREsgMjkgYXMgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGluZy4gVGhpcyBoYXJkLWNvZGVkIHN0cmluZyBjYW4gYmUgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZWQgY29uc3RhbnQgb25jZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbXA0IGV4dHJhY3RvciBpcyBidWlsdCBhZ2FpbnN0IFNESyA+PSAzMS4KKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHVtYm5haWwtY3NkLWF2MWMiLCB0aHVtYm5haWwuYXYxYy0+ZGF0YSgpLCB0aHVtYm5haWwuYXYxYy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LCB0aHVtYm5haWwud2lkdGgsIHRodW1ibmFpbC5oZWlnaHQsIHRodW1iSXRlbUluZGV4KTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNTc0LDEyICsxNjQ3LDIxIEBACiAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDMgLyAyKTsKICAgICB9CiAKLSAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtSXNIZWlmKSB7CisgICAgICAgIGlmIChpbWFnZS0+aHZjYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGltYWdlLT5hdjFjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogYXYxYyBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBpbWFnZS0+YXYxYy0+ZGF0YSgpLCBpbWFnZS0+YXYxYy0+c2l6ZSgpKTsKICAgICB9Ci0gICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAotICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgaW1hZ2UtPmh2Y2MtPmRhdGEoKSwgaW1hZ2UtPmh2Y2MtPnNpemUoKSk7CiAKICAgICBpZiAoaW1hZ2UtPmljYyAhPSBOVUxMKSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKQEAgLTE2MTQsMTcgKzE2OTYsMTcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtYXN0ZXJJdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOworICAgIHVpbnQzMl90IGltYWdlSXRlbUluZGV4ID0gbURpc3BsYXlhYmxlc1tpbWFnZUluZGV4XTsKIAotICAgIGNvbnN0IEltYWdlSXRlbSAmbWFzdGVySW1hZ2UgPSBtSXRlbUlkVG9JdGVtTWFwW21hc3Rlckl0ZW1JbmRleF07Ci0gICAgaWYgKG1hc3RlckltYWdlLnRodW1ibmFpbHMuZW1wdHkoKSkgewotICAgICAgICAqaXRlbUluZGV4ID0gbWFzdGVySXRlbUluZGV4OworICAgIGNvbnN0IEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gbUl0ZW1JZFRvSXRlbU1hcFtpbWFnZUl0ZW1JbmRleF07CisgICAgaWYgKGltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgKml0ZW1JbmRleCA9IGltYWdlSXRlbUluZGV4OwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtYXN0ZXJJbWFnZS50aHVtYm5haWxzWzBdKTsKKyAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KGltYWdlSXRlbS50aHVtYm5haWxzWzBdKTsKICAgICBpZiAodGh1bWJJdGVtSW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIG1hc3RlciBpbWFnZSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gRG8gbm90IHJldHVybiB0aGUgaW1hZ2UgaXRlbSBpbiB0aGlzIGNhc2UsIGZhaWwgaXQgc28gdGhhdCB0aGUKICAgICAgICAgLy8gdGh1bWJuYWlsIGV4dHJhY3Rpb24gY29kZSBrbm93cyB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSBpdC4KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTE2ODYsMTEgKzE3NjgsMTEgQEAKICAgICB9CiAKICAgICBjb25zdCBJbWFnZUl0ZW0gJmltYWdlID0gbUl0ZW1JZFRvSXRlbU1hcFtpdGVtSW5kZXhdOwotICAgIGlmIChpbWFnZS5jZHNjUmVmcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChpbWFnZS5leGlmUmVmcy5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogCi0gICAgc3NpemVfdCBleGlmSW5kZXggPSBtSXRlbUlkVG9FeGlmTWFwLmluZGV4T2ZLZXkoaW1hZ2UuY2RzY1JlZnNbMF0pOworICAgIHNzaXplX3QgZXhpZkluZGV4ID0gbUl0ZW1JZFRvTWV0YU1hcC5pbmRleE9mS2V5KGltYWdlLmV4aWZSZWZzWzBdKTsKICAgICBpZiAoZXhpZkluZGV4IDwgMCkgewogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQpAQCAtMTY5OCw3ICsxNzgwLDcgQEAKICAgICAvLyBza2lwIHRoZSBmaXJzdCA0LWJ5dGUgb2YgdGhlIG9mZnNldCB0byBUSUZGIGhlYWRlcgogICAgIHVpbnQzMl90IHRpZmZPZmZzZXQ7CiAgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCwgJnRpZmZPZmZzZXQsIDQpKSB7CisgICAgICAgICAgICBtSXRlbUlkVG9NZXRhTWFwW2V4aWZJbmRleF0ub2Zmc2V0LCAmdGlmZk9mZnNldCwgNCkpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgIH0KIApAQCAtMTcxMSwxNiArMTc5Myw0MyBAQAogICAgIC8vIGV4aWYgZGF0YS4gVGhlIHNpemUgb2YgdGhlIGl0ZW0gc2hvdWxkIGJlID4gNCBmb3IgYSBub24tZW1wdHkgZXhpZiAodGhpcwogICAgIC8vIHdhcyBhbHJlYWR5IGNoZWNrZWQgd2hlbiB0aGUgaXRlbSB3YXMgYWRkZWQpLiBBbHNvIGNoZWNrIHRoYXQgdGhlIHRpZmYKICAgICAvLyBoZWFkZXIgb2Zmc2V0IGlzIHZhbGlkLgotICAgIGlmIChtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSA8PSA0IHx8Ci0gICAgICAgICAgICB0aWZmT2Zmc2V0ID4gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0KSB7CisgICAgaWYgKG1JdGVtSWRUb01ldGFNYXBbZXhpZkluZGV4XS5zaXplIDw9IDQgfHwKKyAgICAgICAgICAgIHRpZmZPZmZzZXQgPiBtSXRlbUlkVG9NZXRhTWFwW2V4aWZJbmRleF0uc2l6ZSAtIDQpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICAvLyBPZmZzZXQgb2YgJ0V4aWZcMFwwJyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mICdFeGlmJyBpdGVtCiAgICAgLy8gKGZpcnN0IDQtYnl0ZSBpcyB0aGUgdGlmZiBoZWFkZXIgb2Zmc2V0KQogICAgIHVpbnQzMl90IGV4aWZPZmZzZXQgPSA0ICsgdGlmZk9mZnNldCAtIDY7Ci0gICAgKm9mZnNldCA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQgKyBleGlmT2Zmc2V0OwotICAgICpzaXplID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSBleGlmT2Zmc2V0OworICAgICpvZmZzZXQgPSBtSXRlbUlkVG9NZXRhTWFwW2V4aWZJbmRleF0ub2Zmc2V0ICsgZXhpZk9mZnNldDsKKyAgICAqc2l6ZSA9IG1JdGVtSWRUb01ldGFNYXBbZXhpZkluZGV4XS5zaXplIC0gZXhpZk9mZnNldDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEl0ZW1UYWJsZTo6Z2V0WG1wT2Zmc2V0QW5kU2l6ZShvZmY2NF90ICpvZmZzZXQsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3NpemVfdCBpdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobVByaW1hcnlJdGVtSWQpOworCisgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgc29tZXRoaW5nJ3Mgc2VyaW91c2x5IHdyb25nLgorICAgIGlmIChpdGVtSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjb25zdCBJbWFnZUl0ZW0gJmltYWdlID0gbUl0ZW1JZFRvSXRlbU1hcFtpdGVtSW5kZXhdOworICAgIGlmIChpbWFnZS54bXBSZWZzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzc2l6ZV90IHhtcEluZGV4ID0gbUl0ZW1JZFRvTWV0YU1hcC5pbmRleE9mS2V5KGltYWdlLnhtcFJlZnNbMF0pOworICAgIGlmICh4bXBJbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpvZmZzZXQgPSBtSXRlbUlkVG9NZXRhTWFwW3htcEluZGV4XS5vZmZzZXQ7CisgICAgKnNpemUgPSBtSXRlbUlkVG9NZXRhTWFwW3htcEluZGV4XS5zaXplOwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAppbmRleCBiZTgxYjU5Li42MjgyNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaApAQCAtMzQsNyArMzQsNyBAQAogCiBzdHJ1Y3QgQXNzb2NpYXRpb25FbnRyeTsKIHN0cnVjdCBJbWFnZUl0ZW07Ci1zdHJ1Y3QgRXhpZkl0ZW07CitzdHJ1Y3QgRXh0ZXJuYWxNZXRhSXRlbTsKIHN0cnVjdCBJdGVtTG9jOwogc3RydWN0IEl0ZW1JbmZvOwogc3RydWN0IEl0ZW1Qcm9wZXJ0eTsKQEAgLTQyLDEyICs0MiwxMiBAQAogCiAvKgogICogSXRlbVRhYmxlIGtlZXBzIHRyYWNrIG9mIGFsbCBpbWFnZSBpdGVtcyAoaW5jbHVkaW5nIGNvZGVkIGltYWdlcywgZ3JpZHMgYW5kCi0gKiB0aWxlcykgaW5zaWRlIGEgSEVJRiBzdGlsbCBpbWFnZSAoSVNPL0lFQyBGRElTIDIzMDA4LTEyLjI6MjAxNyhFKSkuCisgKiB0aWxlcykgaW5zaWRlIGEgSEVJRi9BVklGIHN0aWxsIGltYWdlIChJU08vSUVDIEZESVMgMjMwMDgtMTIuMjoyMDE3KEUpKS4KICAqLwogCiBjbGFzcyBJdGVtVGFibGUgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CisgICAgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpc0hlaWYpOwogCiAgICAgc3RhdHVzX3QgcGFyc2UodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIApAQCAtNTksMTIgKzU5LDE1IEBACiAgICAgc3RhdHVzX3QgZ2V0SW1hZ2VPZmZzZXRBbmRTaXplKAogICAgICAgICAgICAgdWludDMyX3QgKml0ZW1JbmRleCwgb2ZmNjRfdCAqb2Zmc2V0LCBzaXplX3QgKnNpemUpOwogICAgIHN0YXR1c190IGdldEV4aWZPZmZzZXRBbmRTaXplKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKKyAgICBzdGF0dXNfdCBnZXRYbXBPZmZzZXRBbmRTaXplKG9mZjY0X3QgKm9mZnNldCwgc2l6ZV90ICpzaXplKTsKIAogcHJvdGVjdGVkOgogICAgIH5JdGVtVGFibGUoKTsKIAogcHJpdmF0ZToKICAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICAvLyBJZiB0aGlzIGlzIHRydWUsIHRoZW4gdGhpcyBpdGVtIHRhYmxlIGlzIGZvciBhIEhFSUYgaW1hZ2UuIE90aGVyd2lzZSBpdCBpcyBmb3IgYW4gQVZJRiBpbWFnZS4KKyAgICBib29sIG1Jc0hlaWY7CiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOwogICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKQEAgLTgyLDcgKzg1LDcgQEAKICAgICBib29sIG1JbWFnZUl0ZW1zVmFsaWQ7CiAgICAgdWludDMyX3QgbUN1cnJlbnRJdGVtSW5kZXg7CiAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEltYWdlSXRlbT4gbUl0ZW1JZFRvSXRlbU1hcDsKLSAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgRXhpZkl0ZW0+IG1JdGVtSWRUb0V4aWZNYXA7CisgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEV4dGVybmFsTWV0YUl0ZW0+IG1JdGVtSWRUb01ldGFNYXA7CiAgICAgVmVjdG9yPHVpbnQzMl90PiBtRGlzcGxheWFibGVzOwogCiAgICAgc3RhdHVzX3QgcGFyc2VJbG9jQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKaW5kZXggOTJkZTJjYi4uODgzNmM0NyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtNjIsNiArNjIsMTYgQEAKIAogI2RlZmluZSBBTEFDX1NQRUNJRklDX0lORk9fU0laRSAoMzYpCiAKKy8vIFRPRE8gOiBSZW1vdmUgdGhlIGRlZmluZXMgb25jZSBtYWlubGluZSBtZWRpYSBpcyBidWlsdCBhZ2FpbnN0IE5ESyA+PSAzMS4KKy8vIFRoZSBtcDQgZXh0cmFjdG9yIGlzIHBhcnQgb2YgbWFpbmxpbmUgYW5kIGJ1aWxkcyBhZ2FpbnN0IE5ESyAyOSBhcyBvZgorLy8gd3JpdGluZy4gVGhlc2Uga2V5cyBhcmUgYXZhaWxhYmxlIG9ubHkgZnJvbSBOREsgMzE6CisjZGVmaW5lIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUFJPRklMRV9MRVZFTF9JTkRJQ0FUSU9OIFwKKyAgIm1wZWdoLXByb2ZpbGUtbGV2ZWwtaW5kaWNhdGlvbiIKKyNkZWZpbmUgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQgXAorICAibXBlZ2gtcmVmZXJlbmNlLWNoYW5uZWwtbGF5b3V0IgorI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUyBcCisgICJtcGVnaC1jb21wYXRpYmxlLXNldHMiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZW51bSB7CkBAIC0xMzksNiArMTQ5LDcgQEAKICAgICBib29sIG1Jc0hFVkM7CiAgICAgYm9vbCBtSXNEb2xieVZpc2lvbjsKICAgICBib29sIG1Jc0FDNDsKKyAgICBib29sIG1Jc01wZWdIID0gZmFsc2U7CiAgICAgYm9vbCBtSXNQY207CiAgICAgc2l6ZV90IG1OQUxMZW5ndGhTaXplOwogCkBAIC0xNTAsNiArMTYxLDcgQEAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCiAgICAgYm9vbCBtSXNIZWlmOworICAgIGJvb2wgbUlzQXZpZjsKICAgICBib29sIG1Jc0F1ZGlvOwogICAgIGJvb2wgbUlzVXNhYyA9IGZhbHNlOwogICAgIHNwPEl0ZW1UYWJsZT4gbUl0ZW1UYWJsZTsKQEAgLTIwMyw4ICsyMTUsOCBAQAogICAgICAgICB1aW50MzJfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBjb21wb3NpdGlvbk9mZnNldDsKICAgICAgICAgdWludDhfdCBpdlsxNl07Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGNsZWFyc2l6ZXM7Ci0gICAgICAgIFZlY3RvcjxzaXplX3Q+IGVuY3J5cHRlZHNpemVzOworICAgICAgICBWZWN0b3I8dWludDMyX3Q+IGNsZWFyc2l6ZXM7CisgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gZW5jcnlwdGVkc2l6ZXM7CiAgICAgfTsKICAgICBWZWN0b3I8U2FtcGxlPiBtQ3VycmVudFNhbXBsZXM7CiAgICAgc3RkOjptYXA8b2ZmNjRfdCwgdWludDMyX3Q+IG1Ecm1PZmZzZXRzOwpAQCAtMzczLDkgKzM4NSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUM7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOworICAgICAgICBjYXNlIEZPVVJDQygidnAwOSIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKICAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKICAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1oYTEiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSEExOworICAgICAgICBjYXNlIEZPVVJDQygibWhtMSIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTE7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBmb3VyY2M6ICVjJWMlYyVjIiwKICAgICAgICAgICAgICAgICAgICAoZm91cmNjID4+IDI0KSAmIDB4ZmYsCkBAIC00MTMsNiArNDMxLDcgQEAKICAgICAgIG1Jc0hlaWYoZmFsc2UpLAogICAgICAgbUhhc01vb3ZCb3goZmFsc2UpLAogICAgICAgbVByZWZlckhlaWYobWltZSAhPSBOVUxMICYmICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKSksCisgICAgICBtSXNBdmlmKGZhbHNlKSwKICAgICAgIG1GaXJzdFRyYWNrKE5VTEwpLAogICAgICAgbUxhc3RUcmFjayhOVUxMKSB7CiAgICAgQUxPR1YoIm1pbWU9JXMsIG1QcmVmZXJIZWlmPSVkIiwgbWltZSwgbVByZWZlckhlaWYpOwpAQCAtNjM3LDggKzY1Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCB0cmFjay0+bWV0YSk7Ci0gICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgdHJhY2stPm1ldGEpOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNjY5LDcgKzY4Nyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobUlzSGVpZiAmJiAobUl0ZW1UYWJsZSAhPSBOVUxMKSAmJiAobUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKSA+IDApKSB7CisgICAgaWYgKChtSXNBdmlmIHx8IG1Jc0hlaWYpICYmIChtSXRlbVRhYmxlICE9IE5VTEwpICYmIChtSXRlbVRhYmxlLT5jb3VudEltYWdlcygpID4gMCkpIHsKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewpAQCAtNjc4LDYgKzY5NiwxOSBAQAogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KKyAgICAgICAgb2ZmNjRfdCB4bXBPZmZzZXQ7CisgICAgICAgIHNpemVfdCB4bXBTaXplOworICAgICAgICBpZiAobUl0ZW1UYWJsZS0+Z2V0WG1wT2Zmc2V0QW5kU2l6ZSgmeG1wT2Zmc2V0LCAmeG1wU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogYi8xNzU3MTczMzkKKyAgICAgICAgICAgIC8vIFVzZSBhIGhhcmQtY29kZWQgc3RyaW5nIGhlcmUgaW5zdGVhZCBvZiBuYW1lZCBrZXlzLiBUaGUga2V5cyBhcmUgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBvbmx5IG9uIEFQSSAzMSsuIFRoZSBtcDQgZXh0cmFjdG9yIGlzIHBhcnQgb2YgbWFpbmxpbmUgYW5kIGhhcyBtaW5fc2RrX3ZlcnNpb24KKyAgICAgICAgICAgIC8vIG9mIDI5LiBUaGlzIGhhcmQtY29kZWQgc3RyaW5nIGNhbiBiZSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lZCBjb25zdGFudCBvbmNlCisgICAgICAgICAgICAvLyB0aGUgbXA0IGV4dHJhY3RvciBpcyBidWlsdCBhZ2FpbnN0IEFQSSAzMSsuCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgInhtcC1vZmZzZXQiIC8qQU1FRElBRk9STUFUX0tFWV9YTVBfT0ZGU0VUKi8sIChpbnQ2NF90KXhtcE9mZnNldCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgInhtcC1zaXplIiAvKkFNRURJQUZPUk1BVF9LRVlfWE1QX1NJWkUqLywgKGludDY0X3QpeG1wU2l6ZSk7CisgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU1ldGEoaW1hZ2VJbmRleCk7CkBAIC02OTUsNyArNzI2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKIAotICAgICAgICAgICAgQUxPR1YoImFkZGluZyBIRUlGIGltYWdlIHRyYWNrICV1IiwgaW1hZ2VJbmRleCk7CisgICAgICAgICAgICBBTE9HVigiYWRkaW5nICVzIGltYWdlIHRyYWNrICV1IiwgbUlzSGVpZiA/ICJIRUlGIiA6ICJBVklGIiwgaW1hZ2VJbmRleCk7CiAgICAgICAgICAgICBUcmFjayAqdHJhY2sgPSBuZXcgVHJhY2s7CiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bmV4dCA9IHRyYWNrOwpAQCAtNzIxLDYgKzc1MiwxMCBAQAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAogICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikgIT0gTlVMTCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLAogICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKQEAgLTEwOTIsNyArMTEyNyw5IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2l6ZSA+PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHByb2ZpbGUgPSBwdHJbMl0gPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYmxfY29tcGF0aWJpbGl0eV9pZCA9IChwdHJbNF0pID4+IDQ7CkBAIC0xMTI5LDggKzExNjYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2tfYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19iLT5uZXh0ID0gTlVMTDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaWQgPSB0cmFja19iLT5tZXRhLT5tRm9ybWF0LT5maW5kRW50cnlCeU5hbWUoQU1FRElBRk9STUFUX0tFWV9DU0RfMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfYi0+bWV0YS0+bUZvcm1hdC0+cmVtb3ZlRW50cnlBdChpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byByZW1vdmUgdGhlIGNzZC0yIGtleSBmcm9tIHRoZSBtZXRhZGF0YSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSBhbiBBTWVkaWFGb3JtYXRfKiBmdW5jdGlvbiB0byBkbyBzby4gU2V0dGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHJlcGxhY2luZyB0aGlzIGNzZC0yIHdpdGggYW4gZW1wdHkgY3NkLTIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBlbXB0eWJ1ZmZlcls4XSA9IHt9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tfYi0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5YnVmZmVyLCAwKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0ID09IHByb2ZpbGUgfHwgNyA9PSBwcm9maWxlIHx8IDggPT0gcHJvZmlsZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFja19iLT5tZXRhLApAQCAtMTE1MCw3ICsxMTkxLDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1vb3YiKSkgewogICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKIAotICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOyAgLy8gUmV0dXJuIGEgZHVtbXkgZXJyb3IuCisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBnZW5lcmljIGVycm9yLgogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE3NTksNiArMTgwMCw4IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJmTGFDIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CiAgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbworICAgICAgICBjYXNlIEZPVVJDQygibWhhMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygibWhtMSIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUlzUVQgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygid2F2ZSIpKSB7CiAKQEAgLTE3ODgsNyArMTgzMSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MTZfdCBkYXRhX3JlZl9pbmRleCBfX3VudXNlZCA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBnZXQgZGF0YV9yZWZfaW5kZXggdmFsdWUgZnJvbSBVMTZfQVQoJmJ1ZmZlcls2XSkKICAgICAgICAgICAgIHVpbnQxNl90IHZlcnNpb24gPSBVMTZfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBudW1fY2hhbm5lbHMgPSBVMTZfQVQoJmJ1ZmZlclsxNl0pOwogCkBAIC0xOTU4LDcgKzIwMDEsOTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgRk9VUkNDKCJtaGFDIik6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNlZSBJU09fSUVDXzIzMDA4LTM7MjAxOSBNSEFEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZAorICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IG1oYWNfaGVhZGVyX3NpemUgPSA0IC8qIHNpemUgKi8gKyA0IC8qIGJveHR5cGUgJ21oYUMnICovCisgICAgICAgICAgICAgICAgICAgICsgMSAvKiBjb25maWd1cmF0aW9uVmVyc2lvbiAqLyArIDEgLyogbXBlZ2gzZGFQcm9maWxlTGV2ZWxJbmRpY2F0aW9uICovCisgICAgICAgICAgICAgICAgICAgICsgMSAvKiByZWZlcmVuY2VDaGFubmVsTGF5b3V0ICovICsgMiAvKiBtcGVnaDNkYUNvbmZpZ0xlbmd0aCAqLzsKKyAgICAgICAgICAgIHVpbnQ4X3QgbWhhY19oZWFkZXJbbWhhY19oZWFkZXJfc2l6ZV07CisgICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKIAorICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCBzaXplb2YobWhhY19oZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIG1oYWNfaGVhZGVyLCBzaXplb2YobWhhY19oZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihtaGFjX2hlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vZ2V0IG1wZWdoM2RhUHJvZmlsZUxldmVsSW5kaWNhdGlvbgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbXBlZ2gzZGFQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gbWhhY19oZWFkZXJbOV07CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9QUk9GSUxFX0xFVkVMX0lORElDQVRJT04sCisgICAgICAgICAgICAgICAgICAgIG1wZWdoM2RhUHJvZmlsZUxldmVsSW5kaWNhdGlvbik7CisKKyAgICAgICAgICAgICAvL2dldCByZWZlcmVuY2VDaGFubmVsTGF5b3V0CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByZWZlcmVuY2VDaGFubmVsTGF5b3V0ID0gbWhhY19oZWFkZXJbMTBdOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VULAorICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VDaGFubmVsTGF5b3V0KTsKKworICAgICAgICAgICAgLy8gZ2V0IG1wZWdoM2RhQ29uZmlnTGVuZ3RoCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtaGFjX2NvbmZpZ19zaXplID0gVTE2X0FUKCZtaGFjX2hlYWRlclsxMV0pOworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgIT0gc2l6ZW9mKG1oYWNfaGVhZGVyKSArIG1oYWNfY29uZmlnX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhY19oZWFkZXIpOworICAgICAgICAgICAgdWludDhfdCBtaGFjX2NvbmZpZ1ttaGFjX2NvbmZpZ19zaXplXTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KGRhdGFfb2Zmc2V0LCBtaGFjX2NvbmZpZywgc2l6ZW9mKG1oYWNfY29uZmlnKSkKKyAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobWhhY19jb25maWcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIG1oYWNfY29uZmlnLCBzaXplb2YobWhhY19jb25maWcpKTsKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihtaGFjX2NvbmZpZyk7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygibWhhUCIpOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBGREFtZF8yIG9mIElTT19JRUNfMjMwMDgtMzsyMDE5IE1IQVByb2ZpbGVBbmRMZXZlbENvbXBhdGliaWxpdHlTZXRCb3gKKyAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBtaGFwX2hlYWRlcl9zaXplID0gNCAvKiBzaXplICovICsgNCAvKiBib3h0eXBlICdtaGFQJyAqLworICAgICAgICAgICAgICAgICAgICArIDEgLyogbnVtQ29tcGF0aWJsZVNldHMgKi87CisKKyAgICAgICAgICAgIHVpbnQ4X3QgbWhhcF9oZWFkZXJbbWhhcF9oZWFkZXJfc2l6ZV07CisgICAgICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAoc3NpemVfdCltaGFwX2hlYWRlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoZGF0YV9vZmZzZXQsIG1oYXBfaGVhZGVyLCBzaXplb2YobWhhcF9oZWFkZXIpKQorICAgICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihtaGFwX2hlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG1oYXBfY29tcGF0aWJsZV9zZXRzX3NpemUgPSBudW1Db21wYXRpYmxlU2V0cyAqIHNpemVvZih1aW50OF90KQorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWhhcF9jb21wYXRpYmxlX3NldHNfc2l6ZSA9IG1oYXBfaGVhZGVyWzhdOworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgIT0gc2l6ZW9mKG1oYXBfaGVhZGVyKSArIG1oYXBfY29tcGF0aWJsZV9zZXRzX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhcF9oZWFkZXIpOworICAgICAgICAgICAgdWludDhfdCBtaGFwX2NvbXBhdGlibGVfc2V0c1ttaGFwX2NvbXBhdGlibGVfc2V0c19zaXplXTsKKyAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgbWhhcF9jb21wYXRpYmxlX3NldHMsIHNpemVvZihtaGFwX2NvbXBhdGlibGVfc2V0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YobWhhcF9jb21wYXRpYmxlX3NldHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfQ09NUEFUSUJMRV9TRVRTLAorICAgICAgICAgICAgICAgICAgICBtaGFwX2NvbXBhdGlibGVfc2V0cywgc2l6ZW9mKG1oYXBfY29tcGF0aWJsZV9zZXRzKSk7CisgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YobWhhcF9jb21wYXRpYmxlX3NldHMpOworICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImVuY3YiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInMyNjMiKToKQEAgLTE5NzMsNiArMjEwMyw3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJkdmgxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJkYXYxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ2cDA5Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewpAQCAtMTk4NSw3ICsyMTE2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3Qgd2lkdGggPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMThdKTsKICAgICAgICAgICAgIHVpbnQxNl90IGhlaWdodCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAyMF0pOwogCkBAIC0yNDM1LDYgKzI1NjYsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygidnBjQyIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKQEAgLTI1NzQsOSArMjcwNyw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJpcmVmIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJpcHJvIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNIZWlmKSB7CisgICAgICAgICAgICBpZiAobUlzSGVpZiB8fCBtSXNBdmlmKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1JdGVtVGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBtSXRlbVRhYmxlID0gbmV3IEl0ZW1UYWJsZShtRGF0YVNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIG1JdGVtVGFibGUgPSBuZXcgSXRlbVRhYmxlKG1EYXRhU291cmNlLCBtSXNIZWlmKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUl0ZW1UYWJsZS0+cGFyc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTI4NzgsNiArMzAxMSwyMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEZPVVJDQygicGFzcCIpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvLyB0aGlzIG11c3QgYmUgaW4gYSBWaXN1YWxTYW1wbGVFbnRyeSBib3ggdW5kZXIgdGhlIFNhbXBsZSBEZXNjcmlwdGlvbiBCb3ggKCdzdHNkJykKKyAgICAgICAgICAgIC8vIGlnbm9yZSBvdGhlcndpc2UKKyAgICAgICAgICAgIGlmIChkZXB0aCA+PSAyICYmIG1QYXRoW2RlcHRoIC0gMl0gPT0gRk9VUkNDKCJzdHNkIikpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBhc3BCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEZPVVJDQygidGl0bCIpOgogICAgICAgICBjYXNlIEZPVVJDQygicGVyZiIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXV0aCIpOgpAQCAtMzAwMiwxNCArMzE1MCwyMCBAQAogICAgICAgICAgICAgICAgICAgICBtSXNIZWlmID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCJtaWYxIikpOwogICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoImhlaWMiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoImF2aWYiKSkgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmNvdW50KEZPVVJDQygiYXZpcyIpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgQVZJRiBpbWFnZSIpOworICAgICAgICAgICAgICAgICAgICBtSXNBdmlmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCJhdmlmIikpOworICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoImF2aXMiKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKCFicmFuZFNldC5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZSBtb292IGJveC4KICAgICAgICAgICAgICAgICAgICAgLy8gSXQgY291bGQgYmUgYW55IGlzbyBmaWxlcyAobXA0LCBoZWlmcywgZXRjLikKICAgICAgICAgICAgICAgICAgICAgbUhhc01vb3ZCb3ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobUlzSGVpZikgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImlkZW50aWZpZWQgSEVJRiBpbWFnZSB3aXRoIG90aGVyIHRyYWNrcyIpOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzSGVpZiB8fCBtSXNBdmlmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCAlcyBpbWFnZSB3aXRoIG90aGVyIHRyYWNrcyIsIG1Jc0hlaWYgPyAiSEVJRiIgOiAiQVZJRiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzQxMCw3ICszNTY0LDcgQEAKICAgICB9CiAKICAgICAvLyBza2lwCi0gICAgdW5zaWduZWQgYnNtb2QgX191bnVzZWQgPSBici5nZXRCaXRzKDMpOworICAgIGJyLnNraXBCaXRzKDMpOyAvLyBic21vZAogCiAgICAgdW5zaWduZWQgYWNtb2QgPSBici5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKQEAgLTM3MjEsMTkgKzM4NzUsMTggQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgIH0KIAotICAgIHVpbnQ2NF90IGN0aW1lIF9fdW51c2VkLCBtdGltZSBfX3VudXNlZCwgZHVyYXRpb24gX191bnVzZWQ7CiAgICAgaW50MzJfdCBpZDsKIAogICAgIGlmICh2ZXJzaW9uID09IDEpIHsKLSAgICAgICAgY3RpbWUgPSBVNjRfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTY0X0FUKCZidWZmZXJbMTJdKTsKKyAgICAgICAgLy8gd2UgY2FuIGdldCBjdGltZSB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzRdKQorICAgICAgICAvLyB3ZSBjYW4gZ2V0IG10aW1lIHZhbHVlIGZyb20gVTY0X0FUKCZidWZmZXJbMTJdKQogICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7Ci0gICAgICAgIGR1cmF0aW9uID0gVTY0X0FUKCZidWZmZXJbMjhdKTsKKyAgICAgICAgLy8gd2UgY2FuIGdldCBkdXJhdGlvbiB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzI4XSkKICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICBjdGltZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKLSAgICAgICAgbXRpbWUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgY3RpbWUgdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlcls0XSkKKyAgICAgICAgLy8gd2UgY2FuIGdldCBtdGltZSB2YWx1ZSBmcm9tIFUzMl9BVCgmYnVmZmVyWzhdKQogICAgICAgICBpZCA9IFUzMl9BVCgmYnVmZmVyWzEyXSk7Ci0gICAgICAgIGR1cmF0aW9uID0gVTMyX0FUKCZidWZmZXJbMjBdKTsKKyAgICAgICAgLy8gd2UgY2FuIGdldCBkdXJhdGlvbiB2YWx1ZSBmcm9tIFUzMl9BVCgmYnVmZmVyWzIwXSkKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQpAQCAtNDA1MSw2ICs0MjA0LDI2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VQYXNwQm94KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgOCB8fCBzaXplID09IFNJWkVfTUFYIHx8IG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQzMl90IGRhdGFbMl07IC8vIGhTcGFjaW5nLCB2U3BhY2luZworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgOCkgPCA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDMyX3QgaFNwYWNpbmcgPSBudG9obChkYXRhWzBdKTsKKyAgICB1aW50MzJfdCB2U3BhY2luZyA9IG50b2hsKGRhdGFbMV0pOworCisgICAgaWYgKGhTcGFjaW5nICE9IDAgJiYgdlNwYWNpbmcgIT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIGhTcGFjaW5nKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgdlNwYWNpbmcpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlM0dQUE1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50IGRlcHRoKSB7CiAgICAgaWYgKHNpemUgPCA0IHx8IHNpemUgPT0gU0laRV9NQVgpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTQzMjgsNyArNDUwMSw4IEBACiAgICAgICAgIGlmIChzaXplICE9IDI0IHx8ICgocHRyWzBdICE9IDEgfHwgcHRyWzFdICE9IDApICYmIChwdHJbMF0gIT0gMiB8fCBwdHJbMV0gIT0gMSkpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpKSB7CisgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkKKyAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikpIHsKICAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7CiAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewpAQCAtNDMzNyw3ICs0NTExLDIyIEBACiAKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogCi0gICAgICAgIGlmIChzaXplIDwgNSB8fCBwdHJbMF0gIT0gMHg4MSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICBpZiAoc2l6ZSA8IDQgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSkgeworICAgICAgICAgICAgaXRlbVRhYmxlID0gbUl0ZW1UYWJsZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICB2b2lkICpkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKKworICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4MDEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQpAQCAtNDM5NCw2ICs0NTgzLDEwIEBACiAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CkBAIC00NDg4LDYgKzQ2ODEsOSBAQAogCiAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4NkIgfHwgb2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2OSkgewogICAgICAgICAvLyBtcDMgYXVkaW8KKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC00NTc4LDYgKzQ3NzQsMTAgQEAKICAgICAgICAgaWYgKG9mZnNldCA+PSBjc2Rfc2l6ZSB8fCBjc2Rbb2Zmc2V0XSAhPSAweDAxKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICAvLyBmb3JtZXJseSBrS2V5Vm9yYmlzSW5mbwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCiAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmNzZFtvZmZzZXRdLCBsZW4xKTsKQEAgLTQ2NDEsMTggKzQ4NDEsMTcgQEAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwogICAgICAgICBpZiAoZXh0RnJlcUluZGV4ID09IDE1KSB7CiAgICAgICAgICAgICBpZiAoY3NkX3NpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMjQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBleHRTYW1wbGVSYXRlID0gYnIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBici5za2lwQml0cygyNCk7IC8vIGV4dFNhbXBsZVJhdGUKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CisgICAgICAgICAgICAvL2V4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KICAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwpAQCAtNDY5NSwxMyArNDg5NCwxMyBAQAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfU0NBTCB8fAogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPT0gQU9UX0VSX0JTQUMpIHsKICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMikgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVMZW5ndGhGbGFnIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvLyBmcmFtZUxlbmd0aEZsYWcKIAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZXBlbmRzT25Db3JlQ29kZXIgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICBpZiAoZGVwZW5kc09uQ29yZUNvZGVyICkgewogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMTQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb3JlQ29kZXJEZWxheSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMTQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE0KTsgLy8gY29yZUNvZGVyRGVsYXkKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBleHRlbnNpb25GbGFnID0gLTE7CkBAIC00NzMzLDY0ICs0OTMyLDY0IEBACiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzMikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBFbGVtZW50SW5zdGFuY2VUYWcKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygyKTsgLy8gUHJvZmlsZQorICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Gcm9udENoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUJhY2tDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtTGZlQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUFzc29jRGF0YUVsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bVZhbGlkQ2NFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMyk7IC8vIE51bUFzc29jRGF0YUVsZW1lbnRzCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIE51bVZhbGlkQ2NFbGVtZW50cwogCiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogCiAgICAgICAgICAgICAgICAgaWYgKE1vbm9NaXhkb3duUHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNb25vTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gTW9ub01peGRvd25FbGVtZW50TnVtYmVyCiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93blByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChTdGVyZW9NaXhkb3duUHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlciBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBTdGVyZW9NaXhkb3duRWxlbWVudE51bWJlcgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleFByZXNlbnQgPSBici5nZXRCaXRzKDEpOwogICAgICAgICAgICAgICAgIGlmIChNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzKSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE1hdHJpeE1peGRvd25JbmRleCBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHNldWRvU3Vycm91bmRFbmFibGUgX191bnVzZWQgPSBici5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cygyKTsgLy8gTWF0cml4TWl4ZG93bkluZGV4CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDEpOyAvLyBQc2V1ZG9TdXJyb3VuZEVuYWJsZQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtRnJvbnRDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgRnJvbnRFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBGcm9udEVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gRnJvbnRFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bVNpZGVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU2lkZUVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU2lkZUVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gU2lkZUVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtQmFja0NoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBCYWNrRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBCYWNrRWxlbWVudFRhZ1NlbGVjdAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIExmZUVsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1wZWc0IGF1ZGlvIGNoYW5uZWxzTnVtID0gJWQiLCBjaGFubmVsc051bSk7CkBAIC00ODg3LDcgKzUwODYsNiBAQAogICAgICAgbUJ1ZmZlcihOVUxMKSwKICAgICAgIG1TcmNCdWZmZXJTaXplKDApLAogICAgICAgbVNyY0J1ZmZlcihOVUxMKSwKLSAgICAgIG1Jc0hlaWYoaXRlbVRhYmxlICE9IE5VTEwpLAogICAgICAgbUl0ZW1UYWJsZShpdGVtVGFibGUpLAogICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MoZWxzdFNoaWZ0U3RhcnRUaWNrcyksCiAgICAgICBtRWxzdEluaXRpYWxFbXB0eUVkaXRUaWNrcyhlbHN0SW5pdGlhbEVtcHR5RWRpdFRpY2tzKSB7CkBAIC00OTE3LDExICs1MTE1LDE1IEBACiAgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAorICAgIG1Jc01wZWdIID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMSkgfHwKKyAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTEpOwogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CiAgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKICAgICBtSXNEb2xieVZpc2lvbiA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTik7CisgICAgbUlzSGVpZiA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgJiYgbUl0ZW1UYWJsZSAhPSBOVUxMOworICAgIG1Jc0F2aWYgPSAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSAmJiBtSXRlbVRhYmxlICE9IE5VTEw7CiAKICAgICBpZiAobUlzQVZDKSB7CiAgICAgICAgIHZvaWQgKmRhdGE7CkBAIC01NzcyLDcgKzU5NzQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBhcHBseSBzb21lIHNhbml0eSAodnMgc3RyaWN0IGxlZ2FsaXR5KSBjaGVja3MKKyAgICAgICAgLy8gYXBwbHkgc29tZSBxdWljayAodnMgc3RyaWN0IGxlZ2FsaXR5KSBjaGVja3MKICAgICAgICAgLy8KICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4VHJ1blNhbXBsZUNvdW50ID0gMTAwMDA7CiAgICAgICAgIGlmIChzYW1wbGVDb3VudCA+IGtNYXhUcnVuU2FtcGxlQ291bnQpIHsKQEAgLTU5MTgsNyArNjEyMCw3IEBACiAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBBTE9HVigic2Vla1RpbWVVczolIiBQUklkNjQsIHNlZWtUaW1lVXMpOwotICAgICAgICBpZiAobUlzSGVpZikgeworICAgICAgICBpZiAobUlzSGVpZiB8fCBtSXNBdmlmKSB7CiAgICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwogICAgICAgICAgICAgaW50MzJfdCBpbWFnZUluZGV4OwpAQCAtNTk4OCwxMCArNjE5MCwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBzeW5jU2FtcGxlSW5kZXggPSBzYW1wbGVJbmRleDsKLSAgICAgICAgICAgIC8vIGFzc3VtZSBldmVyeSBub24tVVNBQyBhdWRpbyBzYW1wbGUgaXMgYSBzeW5jIHNhbXBsZS4gVGhpcyB3b3JrcyBhcm91bmQKKyAgICAgICAgICAgIC8vIGFzc3VtZSBldmVyeSBub24tVVNBQy9ub24tTVBFR0ggYXVkaW8gc2FtcGxlIGlzIGEgc3luYyBzYW1wbGUuCisgICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGFyb3VuZAogICAgICAgICAgICAgLy8gc2VlayBpc3N1ZXMgd2l0aCBmaWxlcyB0aGF0IHdlcmUgaW5jb3JyZWN0bHkgd3JpdHRlbiB3aXRoIGFuCiAgICAgICAgICAgICAvLyBlbXB0eSBvciBzaW5nbGUtc2FtcGxlIHN0c3MgYmxvY2sgZm9yIHRoZSBhdWRpbyB0cmFjawotICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAoIW1Jc0F1ZGlvIHx8IG1Jc1VzYWMpKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmICghbUlzQXVkaW8gfHwgbUlzVXNhYyB8fCBtSXNNcGVnSCkpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTeW5jU2FtcGxlTmVhcigKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogICAgICAgICAgICAgfQpAQCAtNjA2Myw3ICs2MjY2LDcgQEAKICAgICAgICAgbmV3QnVmZmVyID0gdHJ1ZTsKIAogICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmICghbUlzSGVpZikgeworICAgICAgICBpZiAoIW1Jc0hlaWYgJiYgIW1Jc0F2aWYpIHsKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUobUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KikmY3RzLCAmaXNTeW5jU2FtcGxlLCAmc3R0cyk7CiAgICAgICAgICAgICBpZihlcnIgPT0gT0spIHsKQEAgLTYxODksNyArNjM5MiwxOSBAQAogICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICAgICAgfQotIAorCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgInNhbXBsZS1maWxlLW9mZnNldCIgLypBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9GSUxFX09GRlNFVCovLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKworICAgICAgICAgICAgICAgIGlmIChtU2FtcGxlVGFibGUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9PSBtU2FtcGxlVGFibGUtPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsCisgICAgICAgICAgICAgICAgICAgICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIgLypBTUVESUFGT1JNQVRfS0VZX0xBU1RfU0FNUExFX0lOREVYX0lOX0NIVU5LKi8sCisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYyNjgsNyArNjQ4Myw2IEBACiAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCiAgICAgICAgICAgICByZXR1cm4gbVNyY0J1ZmZlckZpdHNEYXRhVG9SZWFkID8gQU1FRElBX0VSUk9SX0lPIDogQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCkBAIC02MzQ2LDYgKzY1NjAsMTcgQEAKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsICJzYW1wbGUtZmlsZS1vZmZzZXQiIC8qQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfRklMRV9PRkZTRVQqLywgb2Zmc2V0KTsKKworICAgICAgICBpZiAobVNhbXBsZVRhYmxlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID09IG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsCisgICAgICAgICAgICAgICAgICAgICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIgLypBTUVESUFGT1JNQVRfS0VZX0xBU1RfU0FNUExFX0lOREVYX0lOX0NIVU5LKi8sCisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKKyAgICAgICAgfQorCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKIAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKQEAgLTY1MDYsOSArNjczMSw5IEBACiAgICAgaWYgKHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSkgewogICAgICAgICAvLyBzdG9yZSBjbGVhci9lbmNyeXB0ZWQgbGVuZ3RocyBpbiBtZXRhZGF0YQogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAotICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKKyAgICAgICAgICAgICAgICBzbXBsLT5jbGVhcnNpemVzLmFycmF5KCksIHNtcGwtPmNsZWFyc2l6ZXMuc2l6ZSgpICogc2l6ZW9mKHVpbnQzMl90KSk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAotICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIDQpOworICAgICAgICAgICAgICAgIHNtcGwtPmVuY3J5cHRlZHNpemVzLmFycmF5KCksIHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSAqIHNpemVvZih1aW50MzJfdCkpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCBtRGVmYXVsdElWU2l6ZSk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtQ3J5cHRvTW9kZSk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBtQ3J5cHRvS2V5LCAxNik7CkBAIC02NzE3LDcgKzY5NDIsOCBAQAogICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNEEgIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwZjR2ICIsIDgpCiAgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGtkZGkiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBNNFZQIiwgOCkKICAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwbWlmMSIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGhlaWMiLCA4KQotICAgICAgICB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBtc2YxIiwgOCkgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwaGV2YyIsIDgpKSB7CisgICAgICAgIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cG1zZjEiLCA4KSB8fCAhbWVtY21wKGhlYWRlciwgImZ0eXBoZXZjIiwgOCkKKyAgICAgICAgfHwgIW1lbWNtcChoZWFkZXIsICJmdHlwYXZpZiIsIDgpIHx8ICFtZW1jbXAoaGVhZGVyLCAiZnR5cGF2aXMiLCA4KSkgewogICAgICAgICAqY29uZmlkZW5jZSA9IDAuNDsKIAogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY3MzQsNiArNjk2MCw3IEBACiAgICAgICAgIEZPVVJDQygiaHZjMSIpLAogICAgICAgICBGT1VSQ0MoImhldjEiKSwKICAgICAgICAgRk9VUkNDKCJhdjAxIiksCisgICAgICAgIEZPVVJDQygidnAwOSIpLAogICAgICAgICBGT1VSQ0MoIjNncDQiKSwKICAgICAgICAgRk9VUkNDKCJtcDQxIiksCiAgICAgICAgIEZPVVJDQygibXA0MiIpLApAQCAtNjc1Miw2ICs2OTc5LDggQEAKICAgICAgICAgRk9VUkNDKCJoZWljIiksICAvLyBIRUlGIGltYWdlCiAgICAgICAgIEZPVVJDQygibXNmMSIpLCAgLy8gSEVJRiBpbWFnZSBzZXF1ZW5jZQogICAgICAgICBGT1VSQ0MoImhldmMiKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCJhdmlmIiksICAvLyBBVklGIGltYWdlCisgICAgICAgIEZPVVJDQygiYXZpcyIpLCAgLy8gQVZJRiBpbWFnZSBzZXF1ZW5jZQogICAgIH07CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDFlNDlkNTAuLjU0MmEzZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaApAQCAtMTQ0LDYgKzE0NCw3IEBACiAgICAgYm9vbCBtSXNIZWlmOwogICAgIGJvb2wgbUhhc01vb3ZCb3g7CiAgICAgYm9vbCBtUHJlZmVySGVpZjsKKyAgICBib29sIG1Jc0F2aWY7CiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwogCkBAIC0xNjAsNiArMTYxLDcgQEAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKTsKICAgICBzdGF0dXNfdCBwYXJzZUlUdW5lc01ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2VDb2xvckluZm8ob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVBhc3BCb3gob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZTNHUFBNZXRhRGF0YShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBkZXB0aCk7CiAgICAgdm9pZCBwYXJzZUlEM3YyTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlUVRNZXRhS2V5KG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBkYXRhX3NpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCmluZGV4IGJjODYzMmMuLjdlNjI0N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTEsNiArMSwzNSBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2V4dHJhY3RvcnNfbXBlZzJfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19tcGVnMl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYnZuZGtzdXBwb3J0IzI5Il0sCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwpAQCAtMTIsMTQgKzQxLDEzIEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliY2dyb3VwcmMjMjkiLAotICAgICAgICAibGlidm5ka3N1cHBvcnQjMjkiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0zNyw3ICs2NSw3IEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfbm9jcnlwdG8iLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCmluZGV4IDllMDkzZWIuLjJlNjg4MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcApAQCAtMjY4LDYgKzI2OCw5IEBACiBtZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAogICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKKyAgICBpZiAobWV0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQogICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOwogICAgIGlmIChpbXBsTWV0YSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAppbmRleCA3YWVkNjgzLi5kNzU0MGM0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc19vZ2dfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX29nZ19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlib2dnZXh0cmFjdG9yIiwKIApAQCAtMjAsNCArMzcsMTEgQEAKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYjNhZmUyZi4uNWQ5N2Q5YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZC5icApAQCAtMTQsOSArMTQsMTkgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkV4dHJhY3RvclVuaXRUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKIAogICAgIHNyY3M6IFsiRXh0cmFjdG9yVW5pdFRlc3QuY3BwIl0sCiAKQEAgLTQxLDYgKzUxLDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fY29sb3J1dGlsc19uZGsiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbAppbmRleCA2YmIyYzhhLi5mYzgxNTJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFeHRyYWN0b3JVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0IiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci0xLjQuemlwP3VuemlwPXRydWUiCiAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0UmVzLyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAppbmRleCA1MTgxNjZlLi44NGVjMWYyIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcApAQCAtMTgsMTAgKzE4LDE0IEBACiAjZGVmaW5lIExPR19UQUcgIkV4dHJhY3RvclVuaXRUZXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogCiAjaW5jbHVkZSAiYWFjL0FBQ0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgImFtci9BTVJFeHRyYWN0b3IuaCIKQEAgLTQzLDExICs0Nyw3NiBAQAogI2RlZmluZSBPVVRQVVRfRFVNUF9GSUxFICIvZGF0YS9sb2NhbC90bXAvZXh0cmFjdG9yT3V0cHV0IgogCiBjb25zdGV4cHIgaW50MzJfdCBrTWF4Q291bnQgPSAxMDsKLWNvbnN0ZXhwciBpbnQzMl90IGtPcHVzU2Vla1ByZVJvbGxVcyA9IDgwMDAwOyAgLy8gODAgbXM7Citjb25zdGV4cHIgaW50MzJfdCBrQXVkaW9EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSAyMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwbXMKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TZWVrVG9sZXJhbmNlVXMgPSAyICoga0F1ZGlvRGVmYXVsdFNhbXBsZUR1cmF0aW9uOyAgLy8gNDAgbXM7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU2VlZCA9IDcwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtVbmRlZmluZWQgPSAtMTsKKworZW51bSBpbnB1dElEIHsKKyAgICAvLyBhdWRpbyBzdHJlYW1zCisgICAgQUFDXzEsCisgICAgQU1SX05CXzEsCisgICAgQU1SX1dCXzEsCisgICAgRkxBQ18xLAorICAgIEdTTV8xLAorICAgIE1JRElfMSwKKyAgICBNUDNfMSwKKyAgICBPUFVTXzEsCisgICAgVk9SQklTXzEsCisgICAgLy8gdmlkZW8gc3RyZWFtcworICAgIEhFVkNfMSwKKyAgICBIRVZDXzIsCisgICAgTVBFRzJfUFNfMSwKKyAgICBNUEVHMl9UU18xLAorICAgIE1QRUc0XzEsCisgICAgVlA5XzEsCisgICAgVU5LTk9XTl9JRCwKK307CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgSW5wdXREYXRhIHsKKyAgICBpbnB1dElEIGlucElkOworICAgIHN0cmluZyBtaW1lOworICAgIHN0cmluZyBpbnB1dEZpbGU7CisgICAgaW50MzJfdCBmaXJzdFBhcmFtOworICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGludDMyX3QgZnJhbWVSYXRlOworfSBrSW5wdXREYXRhW10gPSB7CisgICAgICAgIHtBQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAidGVzdF9tb25vXzQ0MTAwSHpfYWFjLmFhYyIsIDQ0MTAwLCAxLCBBQUNPYmplY3RMQywKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7QU1SX05CXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgImJiYl9tb25vXzhrSHpfYW1ybmIuYW1yIiwgODAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7QU1SX1dCXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgImJiYl9tb25vXzE2a0h6X2FtcndiLmFtciIsIDE2MDAwLCAxLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtGTEFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgImJiYl9zdGVyZW9fNDhrSHpfZmxhYy5mbGFjIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0dTTV8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSwgInRlc3RfbW9ub184a0h6X2dzbS53YXYiLCA4MDAwLCAxLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtNSURJXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgIm1pZGlfYS5taWQiLCAyMjA1MCwgMiwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNUDNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgImJiYl9zdGVyZW9fNDhrSHpfbXAzLm1wMyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtPUFVTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJ0ZXN0X3N0ZXJlb180OGtIel9vcHVzLm9wdXMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7Vk9SQklTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl9zdGVyZW9fNDhrSHpfdm9yYmlzLm9nZyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisKKyAgICAgICAgLy8gVGVzdCAoYi8xNTE2NzcyNjQpIGZvciBNUDQgZXh0cmFjdG9yCisgICAgICAgIHtIRVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubXA0IiwgNTA4LCAyNDAsCisgICAgICAgICBIRVZDUHJvZmlsZU1haW4sIDI1fSwKKyAgICAgICAge0hFVkNfMiwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLCAidGVzdDMuaGVpYyIsIDgyMCwgNDYwLCBrVW5kZWZpbmVkLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01QRUcyX1BTXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciLCAxNDQsIDEzNiwKKyAgICAgICAgIE1QRUcyUHJvZmlsZU1haW4sIDEyfSwKKyAgICAgICAge01QRUcyX1RTXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLCAiYmJiX2NpZl83NjhrYnBzXzMwZnBzX21wZWcyLnRzIiwgMzUyLCAyODgsCisgICAgICAgICBNUEVHMlByb2ZpbGVNYWluLCAzMH0sCisgICAgICAgIHtNUEVHNF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnNC5ta3YiLCAzNTIsIDI4OCwKKyAgICAgICAgIE1QRUc0UHJvZmlsZVNpbXBsZSwgMzB9LAorICAgICAgICB7VlA5XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgImJiYl8zNDB4MjgwXzMwZnBzX3ZwOS53ZWJtIiwgMzQwLCAyODAsIFZQOVByb2ZpbGUwLCAzMH0sCit9OwogCiBzdGF0aWMgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKLWNsYXNzIEV4dHJhY3RvclVuaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgc3RyaW5nPj4geworY2xhc3MgRXh0cmFjdG9yVW5pdFRlc3QgewogICBwdWJsaWM6CiAgICAgRXh0cmFjdG9yVW5pdFRlc3QoKSA6IG1JbnB1dEZwKG51bGxwdHIpLCBtRGF0YVNvdXJjZShudWxscHRyKSwgbUV4dHJhY3RvcihudWxscHRyKSB7fQogCkBAIC02NiwxNiArMTM1LDI5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihzdHJpbmcgd3JpdGVyRm9ybWF0KSB7CiAgICAgICAgIG1FeHRyYWN0b3JOYW1lID0gdW5rbm93bl9jb21wOwogICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKIAogICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YW5kYXJkRXh0cmFjdG9ycz4gbWFwRXh0cmFjdG9yID0gewotICAgICAgICAgICAgICAgIHsiYWFjIiwgQUFDfSwgICAgIHsiYW1yIiwgQU1SfSwgICAgICAgICB7Im1wMyIsIE1QM30sICAgICAgICB7Im9nZyIsIE9HR30sCi0gICAgICAgICAgICAgICAgeyJ3YXYiLCBXQVZ9LCAgICAgeyJta3YiLCBNS1Z9LCAgICAgICAgIHsiZmxhYyIsIEZMQUN9LCAgICAgIHsibWlkaSIsIE1JREl9LAotICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sIHsibXBlZzJ0cyIsIE1QRUcyVFN9LCB7Im1wZWcycHMiLCBNUEVHMlBTfX07CisgICAgICAgICAgICAgICAgeyJhYWMiLCBBQUN9LAorICAgICAgICAgICAgICAgIHsiYW1yIiwgQU1SfSwKKyAgICAgICAgICAgICAgICB7ImZsYWMiLCBGTEFDfSwKKyAgICAgICAgICAgICAgICB7Im1pZCIsIE1JREl9LAorICAgICAgICAgICAgICAgIHsibWlkaSIsIE1JREl9LAorICAgICAgICAgICAgICAgIHsibWt2IiwgTUtWfSwKKyAgICAgICAgICAgICAgICB7Im1wMyIsIE1QM30sCisgICAgICAgICAgICAgICAgeyJtcDQiLCBNUEVHNH0sCisgICAgICAgICAgICAgICAgeyJtcGVnMnBzIiwgTVBFRzJQU30sCisgICAgICAgICAgICAgICAgeyJtcGVnMnRzIiwgTVBFRzJUU30sCisgICAgICAgICAgICAgICAgeyJtcGVnNCIsIE1QRUc0fSwKKyAgICAgICAgICAgICAgICB7Im1wZyIsIE1QRUcyUFN9LAorICAgICAgICAgICAgICAgIHsib2dnIiwgT0dHfSwKKyAgICAgICAgICAgICAgICB7Im9wdXMiLCBPR0d9LAorICAgICAgICAgICAgICAgIHsidHMiLCBNUEVHMlRTfSwKKyAgICAgICAgICAgICAgICB7IndhdiIsIFdBVn0sCisgICAgICAgICAgICAgICAgeyJ3ZWJtIiwgTUtWfX07CiAgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OwogICAgICAgICBpZiAobWFwRXh0cmFjdG9yLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBFeHRyYWN0b3IuZW5kKCkpIHsKICAgICAgICAgICAgIG1FeHRyYWN0b3JOYW1lID0gbWFwRXh0cmFjdG9yLmF0KHdyaXRlckZvcm1hdCk7CiAgICAgICAgIH0KQEAgLTExMiw2ICsxOTQsMzkgQEAKICAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqbUV4dHJhY3RvcjsKIH07CiAKK2NsYXNzIEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0CisgICAgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZyAvKiBjb250YWluZXIgKi8sIHN0cmluZyAvKiBJbnB1dEZpbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogbnVtVHJhY2tzICovLCBib29sIC8qIHNlZWtTdXBwb3J0ZWQgKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc3RyaW5nLCBpbnQzMl90LCBib29sPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBtQ29udGFpbmVyID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1OdW1UcmFja3MgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgc2V0dXBFeHRyYWN0b3IobUNvbnRhaW5lcik7CisgICAgfQorICAgIHN0cmluZyBtQ29udGFpbmVyOworICAgIGludDMyX3QgbU51bVRyYWNrczsKK307CisKK2NsYXNzIENvbmZpZ1BhcmFtVGVzdCA6IHB1YmxpYyBFeHRyYWN0b3JVbml0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGlucHV0SUQ+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwRXh0cmFjdG9yKEdldFBhcmFtKCkuZmlyc3QpOyB9CisKKyAgICBzdHJ1Y3QgY29uZmlnRm9ybWF0IHsKKyAgICAgICAgc3RyaW5nIG1pbWU7CisgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlOworICAgIH07CisKKyAgICB2b2lkIGdldEZpbGVQcm9wZXJ0aWVzKGlucHV0SUQgaW5wdXRJZCwgc3RyaW5nICZpbnB1dEZpbGUsIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pOworfTsKKwogaW50MzJfdCBFeHRyYWN0b3JVbml0VGVzdDo6c2V0RGF0YVNvdXJjZShzdHJpbmcgaW5wdXRGaWxlTmFtZSkgewogICAgIG1JbnB1dEZwID0gZm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAicmIiKTsKICAgICBpZiAoIW1JbnB1dEZwKSB7CkBAIC0xNjgsNiArMjgzLDc1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgQ29uZmlnUGFyYW1UZXN0OjpnZXRGaWxlUHJvcGVydGllcyhpbnB1dElEIGlucHV0SWQsIHN0cmluZyAmaW5wdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pIHsKKyAgICBpbnQzMl90IGlucHV0RGF0YVNpemUgPSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSk7CisgICAgaW50MzJfdCBpbnB1dElkeCA9IDA7CisgICAgZm9yICg7IGlucHV0SWR4IDwgaW5wdXREYXRhU2l6ZTsgaW5wdXRJZHgrKykgeworICAgICAgICBpZiAoaW5wdXRJZCA9PSBrSW5wdXREYXRhW2lucHV0SWR4XS5pbnBJZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlucHV0SWR4ID09IGlucHV0RGF0YVNpemUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnB1dEZpbGUgKz0ga0lucHV0RGF0YVtpbnB1dElkeF0uaW5wdXRGaWxlOworICAgIGNvbmZpZ1BhcmFtLm1pbWUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5taW1lOworICAgIHNpemVfdCBmb3VuZCA9IGNvbmZpZ1BhcmFtLm1pbWUuZmluZCgiYXVkaW8vIik7CisgICAgLy8gQ2hlY2sgaWYgJ2F1ZGlvLycgaXMgcHJlc2VudCBpbiB0aGUgYmVnaW5pbmlnIG9mIHRoZSBtaW1lIHR5cGUKKyAgICBpZiAoZm91bmQgPT0gMCkgeworICAgICAgICBjb25maWdQYXJhbS5zYW1wbGVSYXRlID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZmlyc3RQYXJhbTsKKyAgICAgICAgY29uZmlnUGFyYW0uY2hhbm5lbENvdW50ID0ga0lucHV0RGF0YVtpbnB1dElkeF0uc2Vjb25kUGFyYW07CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uZmlnUGFyYW0ud2lkdGggPSBrSW5wdXREYXRhW2lucHV0SWR4XS5maXJzdFBhcmFtOworICAgICAgICBjb25maWdQYXJhbS5oZWlnaHQgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5zZWNvbmRQYXJhbTsKKyAgICB9CisgICAgY29uZmlnUGFyYW0ucHJvZmlsZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnByb2ZpbGU7CisgICAgY29uZmlnUGFyYW0uZnJhbWVSYXRlID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZnJhbWVSYXRlOworICAgIHJldHVybjsKK30KKwordm9pZCByYW5kb21TZWVrVGVzdChNZWRpYVRyYWNrSGVscGVyICp0cmFjaywgaW50NjRfdCBjbGlwRHVyYXRpb24pIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgaW50MzJfdCBzZWVrQ291bnQgPSAwOworICAgIGJvb2wgaGFzVGltZXN0YW1wID0gZmFsc2U7CisgICAgdmVjdG9yPGludDY0X3Q+IHNlZWtUb1RpbWVTdGFtcDsKKyAgICBzdHJpbmcgc2Vla1B0c1N0cmluZzsKKworICAgIHNyYW5kKGtSYW5kb21TZWVkKTsKKyAgICB3aGlsZSAoc2Vla0NvdW50IDwga01heENvdW50KSB7CisgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gKChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVgpICogY2xpcER1cmF0aW9uOworICAgICAgICBzZWVrVG9UaW1lU3RhbXAucHVzaF9iYWNrKHRpbWVTdGFtcCk7CisgICAgICAgIHNlZWtQdHNTdHJpbmcuYXBwZW5kKHRvX3N0cmluZyh0aW1lU3RhbXApKTsKKyAgICAgICAgc2Vla1B0c1N0cmluZy5hcHBlbmQoIiwgIik7CisgICAgICAgIHNlZWtDb3VudCsrOworICAgIH0KKworICAgIGZvciAoaW50NjRfdCBzZWVrUHRzIDogc2Vla1RvVGltZVN0YW1wKSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKAorICAgICAgICAgICAgICAgIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVCB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUssIHNlZWtQdHMpOworICAgICAgICBBU1NFUlRfTkUob3B0aW9ucywgbnVsbHB0cikgPDwgIkNhbm5vdCBjcmVhdGUgcmVhZCBvcHRpb24iOworCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IDA7CisgICAgICAgICAgICBoYXNUaW1lc3RhbXAgPSBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShoYXNUaW1lc3RhbXApIDw8ICJFeHRyYWN0b3IgZGlkbid0IHNldCB0aW1lc3RhbXAgZm9yIHRoZSBnaXZlbiBzYW1wbGUiOworCisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIEVYUEVDVF9MRShhYnModGltZVN0YW1wIC0gc2Vla1B0cyksIGtSYW5kb21TZWVrVG9sZXJhbmNlVXMpCisgICAgICAgICAgICAgICAgICAgIDw8ICJTZWVrIHVuc3VjY2Vzc2Z1bC4gRXhwZWN0ZWQgdGltZXN0YW1wIHJhbmdlIFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlZWtQdHMgLSBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzIDw8ICIsICIgPDwgc2Vla1B0cyArIGtSYW5kb21TZWVrVG9sZXJhbmNlVXMKKyAgICAgICAgICAgICAgICAgICAgPDwgIl0gIgorICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgIiA8PCB0aW1lU3RhbXAgPDwgIiwgbGlzdCBvZiBpbnB1dCBzZWVrIHRpbWVzdGFtcHMgWyIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2Vla1B0c1N0cmluZyA8PCAiXSI7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgfQorfQorCiB2b2lkIGdldFNlZWthYmxlUG9pbnRzKHZlY3RvcjxpbnQ2NF90PiAmc2Vla2FibGVQb2ludHMsIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrKSB7CiAgICAgaW50MzJfdCBzdGF0dXMgPSAwOwogICAgIGlmICghc2Vla2FibGVQb2ludHMuZW1wdHkoKSkgewpAQCAtMTkwLDIwICszNzQsMjEgQEAKICAgICB9CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgQ3JlYXRlRXh0cmFjdG9yVGVzdCkgeworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBDcmVhdGVFeHRyYWN0b3JUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCiAgICAgQUxPR1YoIkNoZWNrcyBpZiBhIHZhbGlkIGV4dHJhY3RvciBpcyBjcmVhdGVkIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAotICAgIEFTU0VSVF9FUShzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpLCAwKQotICAgICAgICAgICAgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAotICAgIEFTU0VSVF9FUShjcmVhdGVFeHRyYWN0b3IoKSwgMCkKLSAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKLSAgICAvLyBBIHZhbGlkIGV4dHJhY3RvciBpbnN0YWNlIHNob3VsZCByZXR1cm4gc3VjY2VzcyBmb3IgZm9sbG93aW5nIGNhbGxzCi0gICAgQVNTRVJUX0dUKG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCksIDApOworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKQEAgLTIxMiwyMCArMzk3LDIxIEBACiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOwogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIEV4dHJhY3RvclRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgRXh0cmFjdG9yVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CiAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKQEAgLTI2MiwyMCArNDQ4LDIxIEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIE1ldGFEYXRhQ29tcGFyaXNvblRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgTWV0YURhdGFDb21wYXJpc29uVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAogICAgIEFMT0dWKCJWYWxpZGF0ZXMgRXh0cmFjdG9yJ3MgbWV0YSBkYXRhIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBBU1NFUlRfTkUoZXh0cmFjdG9yRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CkBAIC0zMTgsNyArNTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tTYW1wbGVSYXRlKSk7CiAgICAgICAgICAgICBBU1NFUlRfRVEoZXhDaGFubmVsQ291bnQsIHRyYWNrQ2hhbm5lbENvdW50KSA8PCAiQ2hhbm5lbENvdW50IG5vdCBhcyBleHBlY3RlZCI7CiAgICAgICAgICAgICBBU1NFUlRfRVEoZXhTYW1wbGVSYXRlLCB0cmFja1NhbXBsZVJhdGUpIDw8ICJTYW1wbGVSYXRlIG5vdCBhcyBleHBlY3RlZCI7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZXh0cmFjdG9yTWltZSwgInZpZGVvLyIsIDYpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGV4V2lkdGgsIGV4SGVpZ2h0OwogICAgICAgICAgICAgaW50MzJfdCB0cmFja1dpZHRoLCB0cmFja0hlaWdodDsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZleFdpZHRoKSk7CkBAIC0zMjcsNiArNTE0LDggQEAKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZ0cmFja0hlaWdodCkpOwogICAgICAgICAgICAgQVNTRVJUX0VRKGV4V2lkdGgsIHRyYWNrV2lkdGgpIDw8ICJXaWR0aCBub3QgYXMgZXhwZWN0ZWQiOwogICAgICAgICAgICAgQVNTRVJUX0VRKGV4SGVpZ2h0LCB0cmFja0hlaWdodCkgPDwgIkhlaWdodCBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIm5vbiBhL3YgdHJhY2siKTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0b3AodHJhY2spOwogICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CkBAIC0zMzcsMjAgKzUyNiwyMSBAQAogICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXh0cmFjdG9yRm9ybWF0KTsKIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBNdWx0aXBsZVN0YXJ0U3RvcFRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgTXVsdGlwbGVTdGFydFN0b3BUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCi0gICAgQUxPR1YoIlRlc3QgJXMgZXh0cmFjdG9yIGZvciBtdWx0aXBsZSBzdGFydCBhbmQgc3RvcCBjYWxscyIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dWKCJUZXN0ICVzIGV4dHJhY3RvciBmb3IgbXVsdGlwbGUgc3RhcnQgYW5kIHN0b3AgY2FsbHMiLCBtQ29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgLy8gc3RhcnQvc3RvcCB0aGUgdHJhY2tzIG11bHRpcGxlIHRpbWVzCiAgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKQEAgLTM3OSwyNyArNTY5LDI5IEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIFNlZWtUZXN0KSB7Ci0gICAgLy8gQm90aCBGbGFjIGFuZCBXYXYgZXh0cmFjdG9yIGNhbiBnaXZlIHNhbXBsZXMgZnJvbSBhbnkgcHRzIGFuZCBtYXJrIHRoZSBnaXZlbiBzYW1wbGUgYXMKLSAgICAvLyBzeW5jIGZyYW1lLiBTbywgdGhpcyBzZWVrIHRlc3QgaXMgbm90IGFwcGxpY2FibGUgdG8gRkxBQyBhbmQgV0FWIGV4dHJhY3RvcnMKLSAgICBpZiAobURpc2FibGVUZXN0IHx8IG1FeHRyYWN0b3JOYW1lID09IEZMQUMgfHwgbUV4dHJhY3Rvck5hbWUgPT0gV0FWKSByZXR1cm47CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIFNlZWtUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogCi0gICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBkaWZmZXJlbnQgc2VlayBtb2RlcyIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBkaWZmZXJlbnQgc2VlayBtb2RlcyBmaWxlbmFtZSAlcyIsCisgICAgICAgICAgbUNvbnRhaW5lci5jX3N0cigpLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIHVpbnQzMl90IHNlZWtGbGFnID0gbUV4dHJhY3Rvci0+ZmxhZ3MoKTsKLSAgICBpZiAoIShzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSykpIHsKLSAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZC4gIiA8PCBHZXRQYXJhbSgpLmZpcnN0Ci0gICAgICAgICAgICAgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CisgICAgYm9vbCBzZWVrU3VwcG9ydGVkID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2Vla2FibGUgPSBzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSzsKKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShzZWVrU3VwcG9ydGVkKSA8PCBtQ29udGFpbmVyIDw8ICJFeHRyYWN0b3IgaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCBzZWVrICI7CisgICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgbUNvbnRhaW5lciA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDE1LDE5ICs2MDcsNzMgQEAKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOwogICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7Ci0gICAgICAgIGdldFNlZWthYmxlUG9pbnRzKHNlZWthYmxlUG9pbnRzLCB0cmFjayk7Ci0gICAgICAgIEFTU0VSVF9HVChzZWVrYWJsZVBvaW50cy5zaXplKCksIDApCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgc2Vla2FibGUgcG9pbnRzIGZvciAiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIC8vIEZvciBGbGFjLCBXYXYgYW5kIE1pZGkgZXh0cmFjdG9yLCBhbGwgc2FtcGxlcyBhcmUgc2VlayBwb2ludHMuCisgICAgICAgIC8vIFdlIGNhbm5vdCBjcmVhdGUgbGlzdCBvZiBhbGwgc2Vla2FibGUgcG9pbnRzIGZvciB0aGVzZS4KKyAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIHdlIHBhc3MgYSBzZWVrVG9UaW1lU3RhbXAgYmV0d2VlbiB0d28gc2VlayBwb2ludHMsIHdlIG1heQorICAgICAgICAvLyBlbmQgdXAgZ2V0dGluZyB0aGUgdGltZXN0YW1wIG9mIG5leHQgc2FtcGxlIGFzIGEgc2Vla2FibGUgdGltZXN0YW1wLgorICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCBtYXkvbWF5IG5vdCBiZSBhIHBhcnQgb2YgdGhlIHNlZWthYmxlIHBvaW50IHZlY3RvciB0aGVyZWJ5IGZhaWxpbmcgdGhlCisgICAgICAgIC8vIHRlc3QuIFNvIHdlIHRlc3QgdGhlc2UgZXh0cmFjdG9ycyB1c2luZyByYW5kb20gc2VlayB0ZXN0LgorICAgICAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gRkxBQyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBXQVYgfHwgbUV4dHJhY3Rvck5hbWUgPT0gTUlESSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICBBU1NFUlRfTkUodHJhY2tNZXRhLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodHJhY2tNZXRhLCBpZHgsIDEpOworICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb24gPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvbik7CisgICAgICAgICAgICBBU1NFUlRfR1QoY2xpcER1cmF0aW9uLCAwKSA8PCAiSW52YWxpZCBjbGlwIGR1cmF0aW9uICI7CisgICAgICAgICAgICByYW5kb21TZWVrVGVzdCh0cmFjaywgY2xpcER1cmF0aW9uKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CiAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQodHJhY2tGb3JtYXQpOwogICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CiAKLSAgICAgICAgYm9vbCBpc09wdXMgPSBmYWxzZTsKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7Ci0gICAgICAgIGlmICghc3RyY21wKG1pbWUsICJhdWRpby9vcHVzIikpIGlzT3B1cyA9IHRydWU7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUiOworCisgICAgICAgIC8vIEltYWdlIGZvcm1hdHMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBzZWVrYWJsZQorICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSBjb250aW51ZTsKKworICAgICAgICAvLyBSZXF1ZXN0IHNlZWthYmxlIHBvaW50cyBmb3IgcmVtYWluaW5nIGV4dHJhY3RvcnMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBzZWVrCisgICAgICAgIC8vIGFjY3VyYWN5IGZvciB0aGUgZXh0cmFjdG9ycy4gRGVwZW5kaW5nIG9uIFNFRUsgTW9kZSwgd2UgZXhwZWN0IHRoZSBleHRyYWN0b3JzIHRvIHJldHVybgorICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgc3luYyBmcmFtZS4gV2UgZG9uJ3QgcHJlZmVyIHJhbmRvbSBzZWVrIHRlc3QgZm9yIHRoZXNlIGV4dHJhY3RvcnMgYmVjYXVzZQorICAgICAgICAvLyB0aGV5IGFyZW4ndCBleHBlY3RlZCB0byBzZWVrIHRvIHJhbmRvbSBzYW1wbGVzLiBNUDQgZm9yIGluc3RhbmNlIGNhbiBzZWVrIHRvCisgICAgICAgIC8vIG5leHQvcHJldmlvdXMgc3luYyBmcmFtZXMgYnV0IG5vdCB0byBzYW1wbGVzIGJldHdlZW4gdHdvIHN5bmMgZnJhbWVzLgorICAgICAgICBnZXRTZWVrYWJsZVBvaW50cyhzZWVrYWJsZVBvaW50cywgdHJhY2spOworICAgICAgICBBU1NFUlRfR1Qoc2Vla2FibGVQb2ludHMuc2l6ZSgpLCAwKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHNlZWthYmxlIHBvaW50cyBmb3IgIiA8PCBtQ29udGFpbmVyIDw8ICIgZXh0cmFjdG9yIjsKKworICAgICAgICBib29sIGlzT3B1cyA9IGZhbHNlOworICAgICAgICBpbnQ2NF90IG9wdXNTZWVrUHJlUm9sbFVzID0gMDsKKyAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgImF1ZGlvL29wdXMiKSkgeworICAgICAgICAgICAgaXNPcHVzID0gdHJ1ZTsKKyAgICAgICAgICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja0Zvcm1hdCwgImNzZC0yIiwgJnNlZWtQcmVSb2xsQnVmLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHZvaWQgKmNzZEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tGb3JtYXQsICJjc2QtMCIsICZjc2RCdWZmZXIsICZzaXplKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoY3NkQnVmZmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKCh1aW50OF90ICopY3NkQnVmZmVyLCBzaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX05FKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQuIFNlZWtQcmVSb2xsIGluZm8gbWlzc2luZyBmb3IgT3B1cyBmaWxlIjsKKyAgICAgICAgICAgIG9wdXNTZWVrUHJlUm9sbFVzID0gKigoaW50NjRfdCAqKXNlZWtQcmVSb2xsQnVmKTsKKyAgICAgICAgfQogICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKIAogICAgICAgICBpbnQzMl90IHNlZWtJZHggPSAwOwpAQCAtNDM5LDcgKzY4NSw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHNlZWtJZHggPj0gc2Vla2FibGVQb2ludHNTaXplKSBzZWVrSWR4ID0gc2Vla2FibGVQb2ludHNTaXplIC0gMTsKIAogICAgICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RvVGltZVN0YW1wID0gc2Vla2FibGVQb2ludHNbc2Vla0lkeF07Ci0gICAgICAgICAgICAgICAgaWYgKHNlZWthYmxlUG9pbnRzU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2Vla0lkeCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGljayBhIHRpbWUganVzdCBlYXJsaWVyIHRoYW4gdGhpcyBzZWVrIHBvaW50CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJldlRpbWVTdGFtcCA9IHNlZWthYmxlUG9pbnRzW3NlZWtJZHggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgc2Vla1RvVGltZVN0YW1wID0gc2Vla1RvVGltZVN0YW1wIC0gKChzZWVrVG9UaW1lU3RhbXAgLSBwcmV2VGltZVN0YW1wKSA+PiAzKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NDgsNyArNjk1LDcgQEAKICAgICAgICAgICAgICAgICAvLyBleHRyYWN0b3IgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiAoc2Vla1B0cyAtIHNlZWtQcmVSb2xsVXMpLgogICAgICAgICAgICAgICAgIC8vIFNvIHdlIGFkZCB0aGUgcHJlUm9sbCB2YWx1ZSB0byB0aGUgdGltZVN0YW1wIHdlIHdhbnQgdG8gc2VlayB0by4KICAgICAgICAgICAgICAgICBpZiAoaXNPcHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZWtUb1RpbWVTdGFtcCArPSBrT3B1c1NlZWtQcmVSb2xsVXM7CisgICAgICAgICAgICAgICAgICAgIHNlZWtUb1RpbWVTdGFtcCArPSBvcHVzU2Vla1ByZVJvbGxVczsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKQEAgLTQ3MCwxMSArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyBpcyA4LiBVc2luZyBtYXNrIDAxMTFiIHRvIGdldCB0cnVlIG1vZGVzCiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobW9kZSAmIDB4NykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWthYmxlUG9pbnRzU2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0aW1lU3RhbXAsIHNlZWthYmxlUG9pbnRzW3NlZWtJZHhdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodGltZVN0YW1wLCBzZWVrYWJsZVBvaW50c1tzZWVrSWR4IC0gMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodGltZVN0YW1wLCBzZWVrYWJsZVBvaW50c1tzZWVrSWR4ID4gMCA/IChzZWVrSWR4IC0gMSkgOiAwXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKQEAgLTQ5NiwyNCArNzM5LDUyMyBAQAogICAgIHNlZWthYmxlUG9pbnRzLmNsZWFyKCk7CiB9CiAKLS8vIFRPRE86IChiLzE0NTMzMjE4NSkKLS8vIEFkZCBNSURJIGlucHV0cwotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEV4dHJhY3RvclVuaXRUZXN0QWxsLCBFeHRyYWN0b3JVbml0VGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImFhYyIsICJsb3Vkc29mdGFhYy5hYWMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsICJ0ZXN0YW1yLmFtciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgImFtcndiLndhdiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgImpvaG5fY2FnZS5vZ2ciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndhdiIsICJtb25vdGVzdGdzbS53YXYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcydHMiLCAic2VnbWVudDAwMDAwMS50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsICJ0ZXN0b3B1cy5vcHVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubXAzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcycHMiLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IikpKTsKKy8vIFRlc3RzIHRoZSBleHRyYWN0b3JzIGZvciBzZWVrIGJleW9uZCByYW5nZSA6ICgwLCBDbGlwRHVyYXRpb24pCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE1vbmtleVNlZWtUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIC8vIFRPRE8oYi8xNTU2MzA3NzgpOiBFbmFibGUgdGVzdCBmb3Igd2F2IGV4dHJhY3RvcnMKKyAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gV0FWKSByZXR1cm47CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgaW52YWxpZCBzZWVrIHBvaW50cywgZmlsZW5hbWUgJXMiLAorICAgICAgICAgIG1Db250YWluZXIuY19zdHIoKSwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworCisgICAgdWludDMyX3Qgc2Vla0ZsYWcgPSBtRXh0cmFjdG9yLT5mbGFncygpOworICAgIGJvb2wgc2Vla1N1cHBvcnRlZCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBib29sIHNlZWthYmxlID0gc2Vla0ZsYWcgJiBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6Q0FOX1NFRUs7CisgICAgaWYgKCFzZWVrYWJsZSkgeworICAgICAgICBBU1NFUlRfRkFMU0Uoc2Vla1N1cHBvcnRlZCkgPDwgbUNvbnRhaW5lciA8PCAiRXh0cmFjdG9yIGlzIGV4cGVjdGVkIHRvIHN1cHBvcnQgc2VlayAiOworICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiAiIDw8IG1Db250YWluZXIgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX05FKGNUcmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgd3JhcHBlciBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFja01ldGEsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YSwgaWR4LCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2tNZXRhRGF0YSI7CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUiOworCisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uID0gMDsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvbik7CisgICAgICAgIC8vIEltYWdlIGZvcm1hdHMgYXJlIG5vdCBleHBlY3RlZCB0byBoYXZlIGR1cmF0aW9uIGluZm9ybWF0aW9uCisgICAgICAgIEFTU0VSVF9UUlVFKGNsaXBEdXJhdGlvbiA+IDAgfHwgIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSA8PCAiSW52YWxpZCBjbGlwIGR1cmF0aW9uICI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhKTsKKworICAgICAgICBpbnQ2NF90IHNlZWtUb1RpbWVTdGFtcFVzW10gPSB7LWNsaXBEdXJhdGlvbiwgY2xpcER1cmF0aW9uIC8gMiwgY2xpcER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcER1cmF0aW9uICogMn07CisgICAgICAgIGZvciAoaW50MzJfdCBtb2RlID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICAgICAgIG1vZGUgPD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOyBtb2RlKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50NjRfdCBzZWVrVGltZVVzIDogc2Vla1RvVGltZVN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLLCBzZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUob3B0aW9ucywgbnVsbHB0cikgPDwgIkNhbm5vdCBjcmVhdGUgcmVhZCBvcHRpb24iOworCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhRGF0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVN0YW1wOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTZWVrZWQgdG8gdGltZXN0YW1wIDogJWxsZCwgcmVxdWVzdGVkIDogJWxsZCIsIChsb25nIGxvbmcpdGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICB9Cit9CisKKy8vIFRlc3RzIGV4dHJhY3RvcnMgZm9yIGludmFsaWQgdHJhY2tzCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIFNhbml0eVRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgLy8gVE9ETyhiLzE1NTYyNjk0Nik6IEVuYWJsZSB0ZXN0IGZvciBNUEVHMiBUUy9QUyBleHRyYWN0b3JzCisgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IE1QRUcyVFMgfHwgbUV4dHJhY3Rvck5hbWUgPT0gTVBFRzJQUykgcmV0dXJuOworCisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGludmFsaWQgdHJhY2tzIC0gZmlsZSAlcyIsCisgICAgICAgICAgbUNvbnRhaW5lci5jX3N0cigpLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBpbnQzMl90IHRyYWNrSWR4W10gPSB7LTEsIG51bVRyYWNrc307CisgICAgZm9yIChpbnQzMl90IGlkeCA6IHRyYWNrSWR4KSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHggPDwgIlxuIjsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgZXh0cmFjdG9yRm9ybWF0LCBpZHgsIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICAgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIGludmFsaWQgaW5kZXggIiA8PCBpZHg7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXh0cmFjdG9yRm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBFeHRyYWN0b3IncyBnZXRUcmFja01ldGFEYXRhIGZvciBudWxsIGZvcm1hdAorICAgIEFNZWRpYUZvcm1hdCAqbWVkaWFGb3JtYXQgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEobWVkaWFGb3JtYXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIG51bGwgTWVkaWEgZm9ybWF0IjsKK30KKworLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyBjb25maWcgcGFyYW1zIGZvciBhIGdpdmVuIGlucHV0IGZpbGUuCisvLyBGb3IgdGhpcyB0ZXN0IHdlIG9ubHkgdGFrZSBzaW5nbGUgdHJhY2sgZmlsZXMgc2luY2UgdGhlIGZvY3VzIG9mIHRoaXMgdGVzdCBpcworLy8gdG8gdmFsaWRhdGUgdGhlIGZpbGUgcHJvcGVydGllcyByZXBvcnRlZCBieSBFeHRyYWN0b3IgYW5kIG5vdCBtdWx0aS10cmFjayBiZWhhdmlvcgorVEVTVF9QKENvbmZpZ1BhcmFtVGVzdCwgQ29uZmlnUGFyYW1WYWxpZGF0aW9uKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY29uc3QgaW50IHRyYWNrTnVtYmVyID0gMDsKKworICAgIHN0cmluZyBjb250YWluZXIgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgaW5wdXRJRCBpbnB1dEZpbGVJZCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGNvbmZpZ0Zvcm1hdCBjb25maWdQYXJhbTsKKyAgICBnZXRGaWxlUHJvcGVydGllcyhpbnB1dEZpbGVJZCwgaW5wdXRGaWxlTmFtZSwgY29uZmlnUGFyYW0pOworCisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGlucHV0J3MgZmlsZSBwcm9wZXJ0aWVzLCBmaWxlICVzIiwKKyAgICAgICAgICBjb250YWluZXIuY19zdHIoKSwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yICIgPDwgY29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yICIgPDwgY29udGFpbmVyIDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrTnVtYmVyKTsKKyAgICBBU1NFUlRfTkUodHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIGZvciBpbmRleCAwIjsKKworICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CisKKyAgICBzdGF0dXMgPSB0cmFjay0+Z2V0Rm9ybWF0KHRyYWNrRm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CisKKyAgICBjb25zdCBjaGFyICp0cmFja01pbWU7CisgICAgYm9vbCB2YWx1ZUZvdW5kID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmdHJhY2tNaW1lKTsKKyAgICBBU1NFUlRfVFJVRSh2YWx1ZUZvdW5kKSA8PCAiTWltZSB0eXBlIG5vdCBzZXQgYnkgZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfU1RSRVEoY29uZmlnUGFyYW0ubWltZS5jX3N0cigpLCB0cmFja01pbWUpIDw8ICJJbnZhbGlkIHRyYWNrIGZvcm1hdCI7CisKKyAgICBpZiAoIXN0cm5jbXAodHJhY2tNaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHRyYWNrQ2hhbm5lbENvdW50OworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0NoYW5uZWxDb3VudCkpOworICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZ0cmFja1NhbXBsZVJhdGUpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnNhbXBsZVJhdGUsIHRyYWNrU2FtcGxlUmF0ZSkgPDwgIlNhbXBsZVJhdGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmNoYW5uZWxDb3VudCwgdHJhY2tDaGFubmVsQ291bnQpIDw8ICJDaGFubmVsQ291bnQgbm90IGFzIGV4cGVjdGVkIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHRyYWNrTWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3QgdHJhY2tXaWR0aCwgdHJhY2tIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJnRyYWNrV2lkdGgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJnRyYWNrSGVpZ2h0KSk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS53aWR0aCwgdHJhY2tXaWR0aCkgPDwgIldpZHRoIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5oZWlnaHQsIHRyYWNrSGVpZ2h0KSA8PCAiSGVpZ2h0IG5vdCBhcyBleHBlY3RlZCI7CisKKyAgICAgICAgaWYgKGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSAhPSBrVW5kZWZpbmVkKSB7CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgJmZyYW1lUmF0ZSkpOworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSwgZnJhbWVSYXRlKSA8PCAiZnJhbWVSYXRlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhlIHByb2ZpbGUgZm9yIHRoZSBpbnB1dCBjbGlwCisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGlmIChjb25maWdQYXJhbS5wcm9maWxlICE9IGtVbmRlZmluZWQpIHsKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5wcm9maWxlLCBwcm9maWxlKSA8PCAicHJvZmlsZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgaWYgKG1FeHRyYWN0b3JOYW1lID09IEFBQyAmJgorICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgJnByb2ZpbGUpKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0ucHJvZmlsZSwgcHJvZmlsZSkgPDwgInByb2ZpbGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAicHJvZmlsZSBub3QgcmV0dXJuZWQgaW4gZXh0cmFjdG9yIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbGV0ZSB0cmFjazsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKK30KKworY2xhc3MgRXh0cmFjdG9yQ29tcGFyaXNvbgorICAgIDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZyAvKiBJbnB1dEZpbGUwICovLCBzdHJpbmcgLyogSW5wdXRGaWxlMSAqLz4+IHsKKyAgcHVibGljOgorICAgIH5FeHRyYWN0b3JDb21wYXJpc29uKCkgeworICAgICAgICBmb3IgKGludDhfdCAqZXh0cmFjdG9yT3AgOiBtRXh0cmFjdG9yT3V0cHV0KSB7CisgICAgICAgICAgICBpZiAoZXh0cmFjdG9yT3AgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGZyZWUoZXh0cmFjdG9yT3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50OF90ICptRXh0cmFjdG9yT3V0cHV0WzJde307CisgICAgc2l6ZV90IG1FeHRyYWN0b3JPdXB1dFNpemVbMl17fTsKK307CisKK3NpemVfdCBhbGxvY2F0ZU91dHB1dEJ1ZmZlcnMoc3RyaW5nIGlucHV0RmlsZU5hbWUsIEFNZWRpYUZvcm1hdCAqZXh0cmFjdG9yRm9ybWF0KSB7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwdTsKKyAgICAvLyBhbGxvY2F0aW5nIHRoZSBidWZmZXIgc2l6ZSBhcyBzYW1wbGVSYXRlICogY2hhbm5lbENvdW50ICogY2xpcER1cmF0aW9uIHNpbmNlCisgICAgLy8gc29tZSBleHRyYWN0b3JzIGxpa2UgZmxhYywgbWlkaSBhbmQgd2F2IGRlY29kZXMgdGhlIGZpbGUuIFRoZXNlIGV4dHJhY3RvcnMKKyAgICAvLyBhZHZlcnRpc2UgdGhlIG1pbWUgdHlwZSBhcyByYXcuCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgeworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzID0gLTE7CisgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOworICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wcGxlID0gLTE7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50KSB8fCBjaGFubmVsQ291bnQgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbENvdW50IGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc2FtcGxlUmF0ZSBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvblVzKSB8fAorICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2xpcCBkdXJhdGlvbiBmb3IgaW5wdXQgZmlsZSA6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaXRzUGVyU2FtcHBsZSkgfHwgYml0c1BlclNhbXBwbGUgPD0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgYml0cyBwZXIgc2FtcGxlIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJpdHNQZXJTYW1wcGxlICogY2hhbm5lbENvdW50ICogc2FtcGxlUmF0ZSAqIChjbGlwRHVyYXRpb25VcyAvIDEwMDAwMDAgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gc3RhdChpbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZ2V0IGZpbGUgcHJvcGVydGllcyBmb3I6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlclNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlclNpemU7Cit9CisKKy8vIENvbXBhcmUgb3V0cHV0IG9mIHR3byBleHRyYWN0b3JzIGZvciBpZGVudGljYWwgY29udGVudAorVEVTVF9QKEV4dHJhY3RvckNvbXBhcmlzb24sIEV4dHJhY3RvckNvbXBhcmlzb25UZXN0KSB7CisgICAgdmVjdG9yPHN0cmluZz4gaW5wdXRGaWxlTmFtZXMgPSB7R2V0UGFyYW0oKS5maXJzdCwgR2V0UGFyYW0oKS5zZWNvbmR9OworICAgIHNpemVfdCBleHRyYWN0ZWRPdXRwdXRTaXplWzJde307CisgICAgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXRbMl17fTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IE9LOworCisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGlucHV0RmlsZU5hbWVzLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgc3RyaW5nIGNvbnRhaW5lckZvcm1hdCA9IGlucHV0RmlsZU5hbWVzW2lkeF0uc3Vic3RyKGlucHV0RmlsZU5hbWVzW2lkeF0uZmluZCgiLiIpICsgMSk7CisgICAgICAgIHNldHVwRXh0cmFjdG9yKGNvbnRhaW5lckZvcm1hdCk7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgICAgIEFMT0dWKCJVbmtub3duIGV4dHJhY3RvciAlcy4gU2tpcHBpbmcgdGhlIHRlc3QiLCBjb250YWluZXJGb3JtYXQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgJXMiLCBjb250YWluZXJGb3JtYXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgaW5wdXRGaWxlTmFtZXNbaWR4XS5jX3N0cigpKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGlucHV0RmlsZU5hbWVzW2lkeF07CisKKyAgICAgICAgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgY29udGFpbmVyRm9ybWF0IDw8ICJleHRyYWN0b3IiOworCisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXJGb3JtYXQgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgMSkgPDwgIlRoaXMgdGVzdCBleHBlY3RzIGlucHV0cyB3aXRoIG9uZSB0cmFjayBvbmx5IjsKKworICAgICAgICBpbnQzMl90IHRyYWNrSWR4ID0gMDsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayh0cmFja0lkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgdHJhY2tJZHg7CisKKyAgICAgICAgZXh0cmFjdG9yRm9ybWF0W2lkeF0gPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShleHRyYWN0b3JGb3JtYXRbaWR4XSwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQoZXh0cmFjdG9yRm9ybWF0W2lkeF0pOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CisKKyAgICAgICAgQ01lZGlhVHJhY2sgKmNUcmFjayA9IHdyYXAodHJhY2spOworICAgICAgICBBU1NFUlRfTkUoY1RyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayB3cmFwcGVyIGZvciBpbmRleCAiIDw8IHRyYWNrSWR4OworCisgICAgICAgIG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSA9IGFsbG9jYXRlT3V0cHV0QnVmZmVycyhpbnB1dEZpbGVOYW1lLCBleHRyYWN0b3JGb3JtYXRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9HVChtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0sIDB1KSA8PCAiIEludmFsaWQgc2l6ZSBmb3Igb3V0cHV0IGJ1ZmZlcnMiOworCisgICAgICAgIG1FeHRyYWN0b3JPdXRwdXRbaWR4XSA9IChpbnQ4X3QgKiljYWxsb2MoMSwgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKG1FeHRyYWN0b3JPdXRwdXRbaWR4XSwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igd3JpdGluZyBleHRyYWN0b3IncyBvdXRwdXQiOworCisgICAgICAgIE1lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgdHJhY2siOworCisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXR1cyAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIEFMT0dWKCJ0cmFjay0+cmVhZCBTdGF0dXMgPSAlZCBidWZmZXIgJXAiLCBzdGF0dXMsIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0xFKG9mZnNldCArIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJNZW1vcnkgb3ZlcmZsb3cuIEV4dHJhY3RlZCBvdXRwdXQgc2l6ZSBtb3JlIHRoYW4gZXhwZWN0ZWQiOworCisgICAgICAgICAgICAgICAgbWVtY3B5KG1FeHRyYWN0b3JPdXRwdXRbaWR4XSArIG9mZnNldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGV4dHJhY3RlZE91dHB1dFNpemVbaWR4XSArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RvcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9FUShPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgICAgICBmY2xvc2UobUlucHV0RnApOworICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgZGVsZXRlIG1FeHRyYWN0b3I7CisgICAgICAgIG1JbnB1dEZwID0gbnVsbHB0cjsKKyAgICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSB0aGUgbWV0YSBkYXRhIGZyb20gYm90aCB0aGUgZXh0cmFjdG9ycworICAgIGNvbnN0IGNoYXIgKm1pbWVbMl07CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVbMF0pOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lWzFdKTsKKyAgICBBU1NFUlRfU1RSRVEobWltZVswXSwgbWltZVsxXSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3MgZm9ybWF0IjsKKworICAgIGlmICghc3RybmNtcChtaW1lWzBdLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQwLCBjaGFubmVsQ291bnQxOworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUwLCBzYW1wbGVSYXRlMTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWxDb3VudDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVSYXRlMCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50MSkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUxKSk7CisgICAgICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQwLCBjaGFubmVsQ291bnQxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBjaGFubmVsQ291bnQiOworICAgICAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZTAsIHNhbXBsZVJhdGUxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBzYW1wbGVSYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1pbWVbMF0sICJ2aWRlby8iLCA2KSkgeworICAgICAgICBpbnQzMl90IHdpZHRoMCwgaGVpZ2h0MDsKKyAgICAgICAgaW50MzJfdCB3aWR0aDEsIGhlaWdodDE7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMF0sIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ3aWR0aDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ3aWR0aDEpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQxKSk7CisgICAgICAgIEFTU0VSVF9FUSh3aWR0aDAsIHdpZHRoMSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3Mgd2lkdGgiOworICAgICAgICBBU1NFUlRfRVEoaGVpZ2h0MCwgaGVpZ2h0MSkgPDwgIk1pc21hdGNoIGJldHdlZW4gZXh0cmFjdG9yJ3MgaGVpZ2h0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIkludmFsaWQgbWltZSB0eXBlICIgPDwgbWltZVswXTsKKyAgICB9CisKKyAgICBmb3IgKEFNZWRpYUZvcm1hdCAqZXhGb3JtYXQgOiBleHRyYWN0b3JGb3JtYXQpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShleEZvcm1hdCk7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSB0aGUgZXh0cmFjdGVkIG91dHB1dHMgb2YgYm90aCBleHRyYWN0b3IKKyAgICBBU1NFUlRfRVEoZXh0cmFjdGVkT3V0cHV0U2l6ZVswXSwgZXh0cmFjdGVkT3V0cHV0U2l6ZVsxXSkKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IncyBvdXRwdXQgc2l6ZSBkb2Vzbid0IG1hdGNoIGJldHdlZW4gIiA8PCBpbnB1dEZpbGVOYW1lc1swXSA8PCAiYW5kICIKKyAgICAgICAgICAgIDw8IGlucHV0RmlsZU5hbWVzWzFdIDw8ICIgZXh0cmFjdG9ycyI7CisgICAgc3RhdHVzID0gbWVtY21wKG1FeHRyYWN0b3JPdXRwdXRbMF0sIG1FeHRyYWN0b3JPdXRwdXRbMV0sIGV4dHJhY3RlZE91dHB1dFNpemVbMF0pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0ZWQgY29udGVudCBtaXNtYXRjaCBiZXR3ZWVuICIgPDwgaW5wdXRGaWxlTmFtZXNbMF0gPDwgImFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRGaWxlTmFtZXNbMV0gPDwgIiBleHRyYWN0b3JzIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFeHRyYWN0b3JDb21wYXJpc29uQWxsLCBFeHRyYWN0b3JDb21wYXJpc29uLAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfdnA5Lm1wNCIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fNDgweDM2MF9tcDRfdnA5XzMzM2ticHNfMjVmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX3dlYm1fdnA5XzMzM2ticHNfMjVmcHMud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZpZGVvXzEyODB4NzIwX2F2MV9oZHJfc3RhdGljXzNtYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQuM2dwIiwgInN3aXJsXzEzMngxMzBfbXBlZzQubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl9hdmMubWt2IiwgInN3aXJsXzE0NHgxMzZfYXZjLm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1wNCIsImNyb3dkXzUwOHgyNDBfMjVmcHNfaGV2Yy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzIubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzIudHMiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImxvdWRzb2Z0YWFjLmFhYyIsICJsb3Vkc29mdGFhYy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBmbGFjbWt2Lm1rdiIsICJzaW5lc3dlZXBmbGFjbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG1wM2xhbWUubXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwb2dnbXA0Lm1wNCIsICJzaW5lc3dlZXBvZ2cub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1wNCIsICJzaW5lc3dlZXB2b3JiaXMub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1rdiIsICJzaW5lc3dlZXB2b3JiaXMub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMubWt2IiwgInRlc3RvcHVzLm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm1wNCIsICJ0ZXN0b3B1cy5vcHVzIiksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJsb3Vkc29mdGFhYy5hYWMiLCAibG91ZHNvZnRhYWMuYWFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdGFtci5hbXIiLCAidGVzdGFtci5hbXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBmbGFjLmZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWlkaV9hLm1pZCIsICJtaWRpX2EubWlkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwdm9yYmlzLm1rdiIsICJzaW5lc3dlZXB2b3JiaXMubWt2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5vcHVzIiwgInRlc3RvcHVzLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJqb2huX2NhZ2Uub2dnIiwgImpvaG5fY2FnZS5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtb25vdGVzdGdzbS53YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDkud2VibSIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDgud2VibSIsICJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvbmZpZ1BhcmFtVGVzdEFsbCwgQ29uZmlnUGFyYW1UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYWFjIiwgQUFDXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgQU1SX05CXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgQU1SX1dCXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiZmxhYyIsIEZMQUNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3YXYiLCBHU01fMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtaWRpIiwgTUlESV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wMyIsIE1QM18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsIE9QVVNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCBWT1JCSVNfMSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgSEVWQ18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgSEVWQ18yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcycHMiLCBNUEVHMl9QU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcydHMiLCBNUEVHMl9UU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsIE1QRUc0XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgVlA5XzEpKSk7CisKKy8vIFZhbGlkYXRlIGV4dHJhY3RvcnMgZm9yIGNvbnRhaW5lciBmb3JtYXQsIGlucHV0IGZpbGUsIG5vLiBvZiB0cmFja3MgYW5kIHN1cHBvcnRzIHNlZWsgZmxhZworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFeHRyYWN0b3JVbml0VGVzdEFsbCwgRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsICJsb3Vkc29mdGFhYy5hYWMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXIiLCAidGVzdGFtci5hbXIiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXIiLCAiYW1yd2Iud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtaWRpIiwgIm1pZGlfYS5taWQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzaW5lc3dlZXBtcDNsYW1lLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJsb3Vkc29mdGFhYy5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcDMiLCAiaWQzdGVzdDEwLm1wMyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAic2VnbWVudDAwMDAwMS50cyIsIDIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RhYzN0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RhYzR0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnRzIiwgInRlc3RlYWMzdHMudHMiLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiYXVkaW9fYWFjX21vbm9fNzBrYnNfNDQxMDBoei5tcDQiLCAyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJtdWx0aTBfYWM0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgIm5vaXNlXzZjaF80NGtoel9hb3Q1X2RyX3Nicl9zaWcyX21wNC5tNGEiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBhbGFjLm1vdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcGZsYWNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwbTRhLm00YSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBvcHVzbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3RhYzNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdGVhYzNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgImpvaG5fY2FnZS5vZ2ciLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCAidGVzdG9wdXMub3B1cyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsICJzaW5lc3dlZXBvZ2dhbGJ1bWFydC5vZ2ciLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAibG91ZHNvZnR3YXYud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgIm1vbm90ZXN0Z3NtLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJub2lzZV81Y2hfNDRraHpfYW90Ml93YXZlLndhdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJzaW5lMWtoem00MGRiX2FsYXcud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfZjMybGUud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfbXVsYXcud2F2IiwgMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic3dpcmxfMTQ0eDEzNl9hdmMubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgIndpdGhvdXRjdWVzLm1rdiIsIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMnBzIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcycHMiLCAicHJvZ3JhbXN0cmVhbS5tcGVnIiwgMiwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgImNvbG9yXzE3NngxNDRfYnQ2MDFfNTI1X2xyX3Nkcl9oMjY0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgImhlaWZ3cml0ZXJfaW5wdXQuaGVpYyIsIDQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJwc3NodGVzdC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3R2aWRlby4zZ3AiLCA0LCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0dmlkZW9fd2l0aF8yX3RpbWVkdGV4dF90cmFja3MuM2dwIiwgNCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE3NngxNDRfM2dwX2gyNjNfMzAwa2Jwc18yNWZwc19hYWNfc3RlcmVvXzEyOGticHNfMTEwMjVoel8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWRhdGFfZ3lyb19jb21wbGlhbnQuM2dwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF9tcDRfbXBlZzJfMTIwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fNDgweDM2MF9tcDRfaGV2Y182NTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX21wNF9oMjY0XzEzNTBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180NDEwMGh6X2Rhc2gubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIHRydWUpKSk7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgIGdFbnYgPSBuZXcgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZAppbmRleCA2OTUzOGI2Li5jZmYwOWNhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZApAQCAtMjIsNyArMjIsNyBAQAogYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9FeHRyYWN0b3JVbml0VGVzdC9FeHRyYWN0b3JVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCiBgYGAKIAotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci0xLjQuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgogCiBgYGAKIGFkYiBwdXNoIGV4dHJhY3RvciAvZGF0YS9sb2NhbC90bXAvCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icAppbmRleCA1ZDM4YTgxLi5jYzVlMWM3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKQEAgLTEsNyArMSwyNCBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfZXh0cmFjdG9yc193YXZfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9leHRyYWN0b3JzX3dhdl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlid2F2ZXh0cmFjdG9yIiwKIAotICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1kZWZhdWx0cyIsICJsaWJiaW5kZXJfbmRrX2hvc3RfdXNlciJdLAogCiAgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCiAKQEAgLTE5LDQgKzM2LDExIEBACiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icAppbmRleCA2NDUzMGUxLi4yMzdjZDJiIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9pbWdfdXRpbHMvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliaW1nX3V0aWxzIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvamFuaXRvcnMvUkVBRE1FIGIvbWVkaWEvamFuaXRvcnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYjhlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYW5pdG9ycy9SRUFETUUKQEAgLTAsMCArMSw0IEBACitBIGNvbGxlY3Rpb24gb2YgT1dORVJTIGZpbGVzIHRoYXQgd2UgcmVmZXJlbmNlIGZyb20gb3RoZXIgcHJvamVjdHMsCitzdWNoIGFzIHRoZSBzb2Z0d2FyZSBjb2RlY3MgaW4gZGlyZWN0b3JpZXMgbGlrZSBleHRlcm5hbC9saWJhdmMuCitUaGlzIGlzIHRvIHNpbXBsaWZ5IG91ciBvd25lci9hcHByb3ZlciBtYW5hZ2VtZW50IGFjcm9zcyB0aGUgbXVsdGlwbGUKK3Byb2plY3RzIHJlbGF0ZWQgdG8gbWVkaWEuCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMgYi9tZWRpYS9qYW5pdG9ycy9jb2RlY19PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwMTM5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phbml0b3JzL2NvZGVjX09XTkVSUwpAQCAtMCwwICsxLDUgQEAKKyMgZ2Vycml0IG93bmVyL2FwcHJvdmVycyBmb3IgdGhlIGFjdHVhbCBzb2Z0d2FyZSBjb2RlYyBsaWJyYXJpZXMKKyMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9tZWRpYV9zb2x1dGlvbnNfT1dORVJTIGIvbWVkaWEvamFuaXRvcnMvbWVkaWFfc29sdXRpb25zX09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGMxYzdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvbWVkaWFfc29sdXRpb25zX09XTkVSUwpAQCAtMCwwICsxLDEwIEBACisjIEJ1ZyBjb21wb25lbnQ6IDEzNDQKKyMgZ28vYW5kcm9pZC1md2stbWVkaWEtc29sdXRpb25zIGZvciBpbmZvIG9uIGFyZWFzIG9mIG93bmVyc2hpcC4KKworIyBNYWluIG93bmVyczoKK2FxdWlsZXNjYW50YUBnb29nbGUuY29tCitrcm9jYXJkQGdvb2dsZS5jb20KKworIyBJbiBjYXNlIG9mIGVtZXJnZW5jeToKK2FuZHJld2xld2lzQGdvb2dsZS5jb20gI3tMQVNUX1JFU09SVF9TVUdHRVNUSU9OfQorb2xseUBnb29nbGUuY29tICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKaW5kZXggMTQwMDUyZi4uYWRkMjhlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBuZGtfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYkFBdWRpb19oZWFkZXJzIiwKICAgICBmcm9tOiAiaW5jbHVkZSIsCkBAIC0zMiw1ICs0MSw2IEBACiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhYXVkaW9faGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJhYXVkaW8tYWlkbC1jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWyJhYXVkaW8tYWlkbC1jcHAiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0RveHlmaWxlLm9yaWcgYi9tZWRpYS9saWJhYXVkaW8vRG94eWZpbGUub3JpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ZmFjYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vRG94eWZpbGUub3JpZworKysgL2Rldi9udWxsCkBAIC0xLDIzMDMgKzAsMCBAQAotIyBEb3h5ZmlsZSAxLjguNgotCi0jIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCi0jIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KLSMKLSMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KLSMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCi0jCi0jIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCi0jIFRoZSBmb3JtYXQgaXM6Ci0jIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQotIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgotIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCi0jIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKLSMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0Ci0jIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKLSMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252Ci0jIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KLQotRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04Ci0KLSMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5Ci0jIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQotIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQotIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KLQotUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJNeSBQcm9qZWN0IgotCi0jIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcwotIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KLSMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KLQotUFJPSkVDVF9OVU1CRVIgICAgICAgICA9Ci0KLSMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgotIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyIGEKLSMgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCi0KLVBST0pFQ1RfQlJJRUYgICAgICAgICAgPQotCi0jIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGFuIGxvZ28gb3IgaWNvbiB0aGF0IGlzIGluY2x1ZGVkIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGxvZ28gc2hvdWxkIG5vdCBleGNlZWQgNTUgcGl4ZWxzCi0jIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgbG9nbwotIyB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KLQotUFJPSkVDVF9MT0dPICAgICAgICAgICA9Ci0KLSMgVGhlIE9VVFBVVF9ESVJFQ1RPUlkgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgKHJlbGF0aXZlIG9yIGFic29sdXRlKSBwYXRoCi0jIGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4gSWYgYSByZWxhdGl2ZSBwYXRoIGlzCi0jIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIGRveHlnZW4gd2FzIHN0YXJ0ZWQuIElmCi0jIGxlZnQgYmxhbmsgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgdXNlZC4KLQotT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9Ci0KLSMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCi0jIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAotIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCi0jIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQotIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKLSMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1DUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KLQotIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAotIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcwotIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCi0jIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAotIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAotIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCi0jIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKLSMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAotIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKLSMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAotIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgotCi1PVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAotCi0jIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBicmllZiBtZW1iZXIKLSMgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSBhbmQgY2xhc3MKLSMgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhZG9jKS4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUwotCi0jIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCi0jIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KLSMKLSMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQotIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVJFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKLQotIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcwotIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAotIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0Ci0jIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKLSMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCi0jIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgotIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCi0jIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCi0KLUFCQlJFVklBVEVfQlJJRUYgICAgICAgPQotCi0jIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KLSMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgotIyBkZXNjcmlwdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1BTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KLQotIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKLSMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCi0jIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50Ci0jIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOTElORV9JTkhFUklURURfTUVNQiAgPSBOTwotCi0jIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAotIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCi0jIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUwotCi0jIFRoZSBTVFJJUF9GUk9NX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguCi0jIFN0cmlwcGluZyBpcyBvbmx5IGRvbmUgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBtYXRjaGVzIHRoZSBsZWZ0LWhhbmQKLSMgcGFydCBvZiB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuCi0jIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIHBhdGggdG8KLSMgc3RyaXAuCi0jCi0jIE5vdGUgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYWJzb2x1dGUgcGF0aHMgaGVyZSwgYnV0IGFsc28gcmVsYXRpdmUgcGF0aHMsIHdoaWNoCi0jIHdpbGwgYmUgcmVsYXRpdmUgZnJvbSB0aGUgZGlyZWN0b3J5IHdoZXJlIGRveHlnZW4gaXMgc3RhcnRlZC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZVTExfUEFUSF9OQU1FUyBpcyBzZXQgdG8gWUVTLgotCi1TVFJJUF9GUk9NX1BBVEggICAgICAgID0KLQotIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKLSMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAotIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKLSMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKLSMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKLSMgdXNpbmcgdGhlIC1JIGZsYWcuCi0KLVNUUklQX0ZST01fSU5DX1BBVEggICAgPQotCi0jIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0Ci0jIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0Ci0jIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKLSMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCi0jIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQotIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKLSMgZGVzY3JpcHRpb24uKQotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUpBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTwotCi0jIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdAotIyBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZgotIyBzZXQgdG8gTk8sIHRoZSBRdC1zdHlsZSB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cwotIyByZXF1aXJpbmcgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVFUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTwotCi0jIFRoZSBNVUxUSUxJTkVfQ1BQX0lTX0JSSUVGIHRhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBtYWtlIGRveHlnZW4gdHJlYXQgYQotIyBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vIGNvbW1lbnRzKSBhcwotIyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuIFRoZSBuZXcgZGVmYXVsdCBpcwotIyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gU2V0IHRoaXMKLSMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3IgaW5zdGVhZC4KLSMKLSMgTm90ZSB0aGF0IHNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIGFsc28gbWVhbnMgdGhhdCByYXRpb25hbCByb3NlIGNvbW1lbnRzIGFyZQotIyBub3QgcmVjb2duaXplZCBhbnkgbW9yZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1NVUxUSUxJTkVfQ1BQX0lTX0JSSUVGID0gTk8KLQotIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKLSMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUlOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlIGEKLSMgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwgYmUKLSMgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TRVBBUkFURV9NRU1CRVJfUEFHRVMgID0gTk8KLQotIyBUaGUgVEFCX1NJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHNwYWNlcyBpbiBhIHRhYi4gRG94eWdlbgotIyB1c2VzIHRoaXMgdmFsdWUgdG8gcmVwbGFjZSB0YWJzIGJ5IHNwYWNlcyBpbiBjb2RlIGZyYWdtZW50cy4KLSMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMTYsIGRlZmF1bHQgdmFsdWU6IDQuCi0KLVRBQl9TSVpFICAgICAgICAgICAgICAgPSA0Ci0KLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0IGFzIGNvbW1hbmRzIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm06Ci0jIG5hbWU9dmFsdWUKLSMgRm9yIGV4YW1wbGUgYWRkaW5nCi0jICJzaWRlZWZmZWN0PUBwYXIgU2lkZSBFZmZlY3RzOlxuIgotIyB3aWxsIGFsbG93IHlvdSB0byBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbiwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZwotIyAiU2lkZSBFZmZlY3RzOiIuIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0Ci0jIG5ld2xpbmVzLgotCi1BTElBU0VTICAgICAgICAgICAgICAgID0KLQotIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgotIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKLSMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgotCi1UQ0xfU1VCU1QgICAgICAgICAgICAgID0KLQotIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKLSMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCi0jIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKLSMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1PUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KLQotIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKLSMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAotIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAotIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1PUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KLQotIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KLSMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCi0KLSMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCi0jIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLU9QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTwotCi0jIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKLSMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KLSMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAotIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKLSMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCi0jIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETC4gRm9yIGluc3RhbmNlIHRvIG1ha2UKLSMgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwgYW5kIC5mIGZpbGVzIGFzIEMKLSMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgotIwotIyBOb3RlIEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KLSMKLSMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQotIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCi0KLUVYVEVOU0lPTl9NQVBQSU5HICAgICAgPQotCi0jIElmIHRoZSBNQVJLRE9XTl9TVVBQT1JUIHRhZyBpcyBlbmFibGVkIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbCBjb21tZW50cwotIyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCi0jIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KLSMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdSBjYW4KLSMgbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLiBEaXNhYmxlIG9ubHkgaW4KLSMgY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1NQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCi0KLSMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZAotIyBjbGFzc2VzLCBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuCi0jIGJlIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQKLSMgb3IgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1BVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCi0KLSMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAotIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQgc2V0IHRoaXMKLSMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAotIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsKLSMgdmVyc3VzIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCi0jIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1CVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KLQotIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bwotIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUNQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTwotCi0jIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIChzZWU6Ci0jIGh0dHA6Ly93d3cucml2ZXJiYW5rY29tcHV0aW5nLmNvLnVrL3NvZnR3YXJlL3NpcC9pbnRybykgc291cmNlcyBvbmx5LiBEb3h5Z2VuCi0jIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMgaW5zdGVhZAotIyBvZiBwcml2YXRlIGluaGVyaXRhbmNlIHdoZW4gbm8gZXhwbGljaXQgcHJvdGVjdGlvbiBrZXl3b3JkIGlzIHByZXNlbnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU0lQX1NVUFBPUlQgICAgICAgICAgICA9IE5PCi0KLSMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvIGluZGljYXRlCi0jIGdldHRlciBhbmQgc2V0dGVyIG1ldGhvZHMgZm9yIGEgcHJvcGVydHkuIFNldHRpbmcgdGhpcyBvcHRpb24gdG8gWUVTIHdpbGwgbWFrZQotIyBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZQotIyB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUgbWV0aG9kcyBhbnl3YXksIHlvdQotIyBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1JRExfUFJPUEVSVFlfU1VQUE9SVCAgID0gWUVTCi0KLSMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQwotIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0Ci0jIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAotIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLURJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTwotCi0jIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKLSMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKLSMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKLSMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQotIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCi0KLSMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQgdW5pb25zCi0jIGFyZSBzaG93biBpbnNpZGUgdGhlIGdyb3VwIGluIHdoaWNoIHRoZXkgYXJlIGluY2x1ZGVkIChlLmcuIHVzaW5nIFxpbmdyb3VwKQotIyBpbnN0ZWFkIG9mIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYCi0jIGFuZCBSVEYpLgotIwotIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGRvZXMgbm90IHdvcmsgaW4gY29tYmluYXRpb24gd2l0aAotIyBTRVBBUkFURV9NRU1CRVJfUEFHRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSU5MSU5FX0dST1VQRURfQ0xBU1NFUyA9IE5PCi0KLSMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zCi0jIHdpdGggb25seSBwdWJsaWMgZGF0YSBmaWVsZHMgb3Igc2ltcGxlIHR5cGVkZWYgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluCi0jIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIChpLmUuIGZpbGUsCi0jIG5hbWVzcGFjZSwgb3IgZ3JvdXAgZG9jdW1lbnRhdGlvbiksIHByb3ZpZGVkIHRoaXMgc2NvcGUgaXMgZG9jdW1lbnRlZC4gSWYgc2V0Ci0jIHRvIE5PLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQgdW5pb25zIGFyZSBzaG93biBvbiBhIHNlcGFyYXRlIHBhZ2UgKGZvciBIVE1MIGFuZAotIyBNYW4gcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1JTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8KLQotIyBXaGVuIFRZUEVERUZfSElERVNfU1RSVUNUIHRhZyBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvcgotIyBlbnVtIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbwotIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QKLSMgd2l0aCBuYW1lIFR5cGVULiBXaGVuIGRpc2FibGVkIHRoZSB0eXBlZGVmIHdpbGwgYXBwZWFyIGFzIGEgbWVtYmVyIG9mIGEgZmlsZSwKLSMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCi0jIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCi0jIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1UWVBFREVGX0hJREVTX1NUUlVDVCAgID0gTk8KLQotIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCi0jIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQotIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCi0jIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAotIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCi0jIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQotIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2Ci0jIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKLSMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KLQotTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgYXNzdW1lIGFsbCBlbnRpdGllcyBpbgotIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4gUHJpdmF0ZQotIyBjbGFzcyBtZW1iZXJzIGFuZCBzdGF0aWMgZmlsZSBtZW1iZXJzIHdpbGwgYmUgaGlkZGVuIHVubGVzcyB0aGUKLSMgRVhUUkFDVF9QUklWQVRFIHJlc3BlY3RpdmVseSBFWFRSQUNUX1NUQVRJQyB0YWdzIGFyZSBzZXQgdG8gWUVTLgotIyBOb3RlOiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSB3YXJuaW5ncyBhYm91dCB1bmRvY3VtZW50ZWQgbWVtYmVycyB0aGF0IGFyZQotIyBub3JtYWxseSBwcm9kdWNlZCB3aGVuIFdBUk5JTkdTIGlzIHNldCB0byBZRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9BTEwgICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAotIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1FWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KLQotIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAotIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTwotCi0jIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKLSMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAotIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8KLSMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0Ci0jIGZvciBKYXZhIHNvdXJjZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKLQotIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAotIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCi0jIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCi0jIGluY2x1ZGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUVYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTwotCi0jIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCi0jIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAotIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKLSMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCi0jIGFyZSBoaWRkZW4uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCi0jIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQotIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgotIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUhJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTwotCi0jIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAotIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAotIyB0byBOTyB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMKLSMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCi0KLSMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAotIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQotIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1ISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KLQotIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQotIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PIHRoZXNlCi0jIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCi0KLSMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKLSMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KLSMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCi0jIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KLSMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgotIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKLSMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgotCi1DQVNFX1NFTlNFX05BTUVTICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAotIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZQotIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1ISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KLQotIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHB1dCBhIGxpc3Qgb2YKLSMgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZpbGUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMKLQotIyBJZiB0aGUgU0hPV19HUk9VUEVEX01FTUJfSU5DIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIGFkZCBmb3IgZWFjaAotIyBncm91cGVkIG1lbWJlciBhbiBpbmNsdWRlIHN0YXRlbWVudCB0byB0aGUgZG9jdW1lbnRhdGlvbiwgdGVsbGluZyB0aGUgcmVhZGVyCi0jIHdoaWNoIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgdGhlIG1lbWJlci4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TSE9XX0dST1VQRURfTUVNQl9JTkMgID0gTk8KLQotIyBJZiB0aGUgRk9SQ0VfTE9DQUxfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbGlzdCBpbmNsdWRlCi0jIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiByYXRoZXIgdGhhbiB3aXRoIHNoYXJwIGJyYWNrZXRzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUZPUkNFX0xPQ0FMX0lOQ0xVREVTICAgPSBOTwotCi0jIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgdGFnIFtpbmxpbmVdIGlzIGluc2VydGVkIGluIHRoZQotIyBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCi0jIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgotIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNPUlRfTUVNQkVSX0RPQ1MgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGJyaWVmCi0jIGRlc2NyaXB0aW9ucyBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCi0jIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0Ci0jIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKLSMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAotIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKLSMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCi0jIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgotIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KLSMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZwotIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KLQotIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKLSMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAotIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KLQotIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQotIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKLSMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCi0jIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCi0jIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKLSMgbGlzdC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1TT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KLQotIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgotIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KLSMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKLSMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCi0jIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCi0jIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVNUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTwotCi0jIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQotIyB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gY29tbWFuZHMgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKLQotIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUKLSMgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IGNvbW1hbmRzIGluIHRoZQotIyBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1HRU5FUkFURV9URVNUTElTVCAgICAgID0gWUVTCi0KLSMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoIFlFUykgb3IgZGlzYWJsZSAoIE5PKSB0aGUgYnVnCi0jIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUwotCi0jIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pCi0jIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4KLSMgdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKLQotIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsIGRvY3VtZW50YXRpb24KLSMgc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgPHNlY3Rpb25fbGFiZWw+IC4uLiBcZW5kaWYgYW5kIFxjb25kIDxzZWN0aW9uX2xhYmVsPgotIyAuLi4gXGVuZGNvbmQgYmxvY2tzLgotCi1FTkFCTEVEX1NFQ1RJT05TICAgICAgID0KLQotIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQotIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQotIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKLSMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCi0jIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KLQotTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCi0KLSMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0Ci0jIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgbGlzdAotIyB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1TSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCi0KLSMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCi0jIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldwotIyAoaWYgc3BlY2lmaWVkKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUwotCi0jIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCi0jIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCi0jIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKLQotIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKLSMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCi0jIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQotIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQotIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAotIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKLSMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotCi1GSUxFX1ZFUlNJT05fRklMVEVSICAgID0KLQotIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAotIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAotIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKLSMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCi0jIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCi0jIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCi0jCi0jIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKLSMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCi0jIHRhZyBpcyBsZWZ0IGVtcHR5LgotCi1MQVlPVVRfRklMRSAgICAgICAgICAgID0KLQotIyBUaGUgQ0lURV9CSUJfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgYmliIGZpbGVzIGNvbnRhaW5pbmcKLSMgdGhlIHJlZmVyZW5jZSBkZWZpbml0aW9ucy4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUgLmJpYgotIyBleHRlbnNpb24gaXMgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiBvbWl0dGVkLiBUaGlzIHJlcXVpcmVzIHRoZSBiaWJ0ZXggdG9vbAotIyB0byBiZSBpbnN0YWxsZWQuIFNlZSBhbHNvIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGZvciBtb3JlIGluZm8uCi0jIEZvciBMYVRlWCB0aGUgc3R5bGUgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZwotIyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG5lZWQgYmlidGV4IGFuZCBwZXJsIGF2YWlsYWJsZSBpbiB0aGUKLSMgc2VhcmNoIHBhdGguIERvIG5vdCB1c2UgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcywgYmlidGV4IGNhbm5vdCBoYW5kbGUgdGhlbS4gU2VlCi0jIGFsc28gXGNpdGUgZm9yIGluZm8gaG93IHRvIGNyZWF0ZSByZWZlcmVuY2VzLgotCi1DSVRFX0JJQl9GSUxFUyAgICAgICAgID0KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bwotIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKLSMgbWVzc2FnZXMgYXJlIG9mZi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1RVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KLQotIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCi0jIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoIHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUwotIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgotIwotIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKLSMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCi0jIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUwotCi0jIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgotIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKLSMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKLSMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVdBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKLQotIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKLSMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCi0jIHZhbHVlLiBJZiBzZXQgdG8gTk8gZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlcgotIyBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCi0KLSMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBkb3h5Z2VuCi0jIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCB0YWdzLCB3aGljaAotIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZSB3YXJuaW5nIG9yaWdpbmF0ZWQKLSMgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAkdmVyc2lvbiwgd2hpY2ggd2lsbAotIyBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQgYmUgb2J0YWluZWQgdmlhCi0jIEZJTEVfVkVSU0lPTl9GSUxURVIpCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAkZmlsZTokbGluZTogJHRleHQuCi0KLVdBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgotCi0jIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcgYW5kIGVycm9yCi0jIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBzdGFuZGFyZAotIyBlcnJvciAoc3RkZXJyKS4KLQotV0FSTl9MT0dGSUxFICAgICAgICAgICA9Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgVGhlIElOUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KLSMgZG9jdW1lbnRlZCBzb3VyY2UgZmlsZXMuIFlvdSBtYXkgZW50ZXIgZmlsZSBuYW1lcyBsaWtlIG15ZmlsZS5jcHAgb3IKLSMgZGlyZWN0b3JpZXMgbGlrZSAvdXNyL3NyYy9teXByb2plY3QuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3RvcmllcyB3aXRoCi0jIHNwYWNlcy4KLSMgTm90ZTogSWYgdGhpcyB0YWcgaXMgZW1wdHkgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHNlYXJjaGVkLgotCi1JTlBVVCAgICAgICAgICAgICAgICAgID0KLQotIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcwotIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcwotIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgotIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCi0jIHBvc3NpYmxlIGVuY29kaW5ncy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgotCi1JTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKLQotIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCi0jIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCi0jICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayB0aGUKLSMgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsICouYysrLCAqLmphdmEsICouaWksCi0jICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsICouaGgsICouaHh4LCAqLmhwcCwKLSMgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywgKi5tLCAqLm1hcmtkb3duLAotIyAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5mOTAsICouZiwgKi5mb3IsICoudGNsLCAqLnZoZCwgKi52aGRsLCAqLnVjZiwKLSMgKi5xc2YsICouYXMgYW5kICouanMuCi0KLUZJTEVfUEFUVEVSTlMgICAgICAgICAgPQotCi0jIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3Qgc3ViZGlyZWN0b3JpZXMgc2hvdWxkCi0jIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVJFQ1VSU0lWRSAgICAgICAgICAgICAgPSBOTwotCi0jIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQotIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQotIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KLSMKLSMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcwotIyBydW4uCi0KLUVYQ0xVREUgICAgICAgICAgICAgICAgPQotCi0jIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKLSMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKLSMgZnJvbSB0aGUgaW5wdXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCi0KLSMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQotIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKLSMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgotIwotIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KLSMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKLQotRVhDTFVERV9QQVRURVJOUyAgICAgICA9Ci0KLSMgVGhlIEVYQ0xVREVfU1lNQk9MUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBzeW1ib2wgbmFtZXMKLSMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUKLSMgb3V0cHV0LiBUaGUgc3ltYm9sIG5hbWUgY2FuIGJlIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGEgd29yZCwgb3IgaWYgdGhlCi0jIHdpbGRjYXJkICogaXMgdXNlZCwgYSBzdWJzdHJpbmcuIEV4YW1wbGVzOiBBTmFtZXNwYWNlLCBBQ2xhc3MsCi0jIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QKLSMKLSMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCi0jIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCi0KLUVYQ0xVREVfU1lNQk9MUyAgICAgICAgPQotCi0jIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKLSMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKLSMgY29tbWFuZCkuCi0KLUVYQU1QTEVfUEFUSCAgICAgICAgICAgPQotCi0jIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCi0jIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCBhbmQKLSMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIGFsbAotIyBmaWxlcyBhcmUgaW5jbHVkZWQuCi0KLUVYQU1QTEVfUEFUVEVSTlMgICAgICAgPQotCi0jIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKLSMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCi0jIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCi0KLSMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKLSMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQotIyBcaW1hZ2UgY29tbWFuZCkuCi0KLUlNQUdFX1BBVEggICAgICAgICAgICAgPQotCi0jIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQKLSMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQotIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZDoKLSMKLSMgPGZpbHRlcj4gPGlucHV0LWZpbGU+Ci0jCi0jIHdoZXJlIDxmaWx0ZXI+IGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUKLSMgbmFtZSBvZiBhbiBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIKLSMgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0LiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZwotIyB3aWxsIGJlIGlnbm9yZWQuCi0jCi0jIE5vdGUgdGhhdCB0aGUgZmlsdGVyIG11c3Qgbm90IGFkZCBvciByZW1vdmUgbGluZXM7IGl0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZQotIyBjb2RlIGlzIHNjYW5uZWQsIGJ1dCBub3Qgd2hlbiB0aGUgb3V0cHV0IGNvZGUgaXMgZ2VuZXJhdGVkLiBJZiBsaW5lcyBhcmUgYWRkZWQKLSMgb3IgcmVtb3ZlZCwgdGhlIGFuY2hvcnMgd2lsbCBub3QgYmUgcGxhY2VkIGNvcnJlY3RseS4KLQotSU5QVVRfRklMVEVSICAgICAgICAgICA9Ci0KLSMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybgotIyBiYXNpcy4gRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCi0jIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiBwYXR0ZXJuPWZpbHRlcgotIyAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cKLSMgZmlsdGVycyBhcmUgdXNlZC4gSWYgdGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgaXMgZW1wdHkgb3IgaWYgbm9uZSBvZiB0aGUKLSMgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuCi0KLUZJTFRFUl9QQVRURVJOUyAgICAgICAgPQotCi0jIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcKLSMgSU5QVVRfRklMVEVSICkgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgotIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1GSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KLQotIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQotIyBwYXR0ZXJuLiBBIHBhdHRlcm4gd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBmb3IgRklMVEVSX1BBVFRFUk4gKGlmIGFueSkgYW5kCi0jIGl0IGlzIGFsc28gcG9zc2libGUgdG8gZGlzYWJsZSBzb3VyY2UgZmlsdGVyaW5nIGZvciBhIHNwZWNpZmljIHBhdHRlcm4gdXNpbmcKLSMgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIHNldCB0byBZRVMuCi0KLUZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgPQotCi0jIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKLSMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCi0jIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCi0jIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCi0KLVVTRV9NREZJTEVfQVNfTUFJTlBBR0UgPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZwotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQotIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KLSMKLSMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0Ci0jIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotU09VUkNFX0JST1dTRVIgICAgICAgICA9IE5PCi0KLSMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkgb2YgZnVuY3Rpb25zLAotIyBjbGFzc2VzIGFuZCBlbnVtcyBkaXJlY3RseSBpbnRvIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUlOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTwotCi0jIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyB3aWxsIGluc3RydWN0IGRveHlnZW4gdG8gaGlkZSBhbnkKLSMgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZSBmcmFnbWVudHMuIE5vcm1hbCBDLCBDKysgYW5kCi0jIEZvcnRyYW4gY29tbWVudHMgd2lsbCBhbHdheXMgcmVtYWluIHZpc2libGUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLVNUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMKLQotIyBJZiB0aGUgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQKLSMgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZnVuY3Rpb25zIHJlZmVyZW5jaW5nIGl0IHdpbGwgYmUgbGlzdGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVJFRkVSRU5DRURfQllfUkVMQVRJT04gPSBOTwotCi0jIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgotIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLVJFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTwotCi0jIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0Ci0jIHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAotIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKLSMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUwotCi0jIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKLSMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCi0jIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcwotIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKLSMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCi0KLVNPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAotIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCi0jIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KLSMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCi0jIDQuOC42IG9yIGhpZ2hlci4KLSMKLSMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6Ci0jIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCi0jIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCi0jIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCi0jIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCi0jCi0jIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQotIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KLSMKLSMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bwotIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgotCi1VU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcwotIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCi0jIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCi0jIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKLSMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUFMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKLQotIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KLSMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCi0jIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCi0KLUNPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1Ci0KLSMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKLSMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKLSMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCi0jIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KLQotSUdOT1JFX1BSRUZJWCAgICAgICAgICA9Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIEhUTUwgb3V0cHV0Ci0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUdFTkVSQVRFX0hUTUwgICAgICAgICAgPSBZRVMKLQotIyBUaGUgSFRNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgSFRNTCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCi0jIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgotIyBpdC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBodG1sLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1IVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAotCi0jIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgZWFjaAotIyBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwgLnBocCwgLmFzcCkuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuaHRtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCi0KLSMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgaGVhZGVyIGZpbGUgZm9yCi0jIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCi0jIHN0YW5kYXJkIGhlYWRlci4KLSMKLSMgVG8gZ2V0IHZhbGlkIEhUTUwgdGhlIGhlYWRlciBmaWxlIHRoYXQgaW5jbHVkZXMgYW55IHNjcmlwdHMgYW5kIHN0eWxlIHNoZWV0cwotIyB0aGF0IGRveHlnZW4gbmVlZHMsIHdoaWNoIGlzIGRlcGVuZGVudCBvbiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHVzZWQgKGUuZy4KLSMgdGhlIHNldHRpbmcgR0VORVJBVEVfVFJFRVZJRVcpLiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gc3RhcnQgd2l0aCBhCi0jIGRlZmF1bHQgaGVhZGVyIHVzaW5nCi0jIGRveHlnZW4gLXcgaHRtbCBuZXdfaGVhZGVyLmh0bWwgbmV3X2Zvb3Rlci5odG1sIG5ld19zdHlsZXNoZWV0LmNzcwotIyBZb3VyQ29uZmlnRmlsZQotIyBhbmQgdGhlbiBtb2RpZnkgdGhlIGZpbGUgbmV3X2hlYWRlci5odG1sLiBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIgotIyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGhlYWRlciB0aGF0IGRveHlnZW4gbm9ybWFsbHkKLSMgdXNlcy4KLSMgTm90ZTogVGhlIGhlYWRlciBpcyBzdWJqZWN0IHRvIGNoYW5nZSBzbyB5b3UgdHlwaWNhbGx5IGhhdmUgdG8gcmVnZW5lcmF0ZSB0aGUKLSMgZGVmYXVsdCBoZWFkZXIgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4uIEZvciBhIGRlc2NyaXB0aW9uCi0jIG9mIHRoZSBwb3NzaWJsZSBtYXJrZXJzIGFuZCBibG9jayBuYW1lcyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfSEVBREVSICAgICAgICAgICAgPQotCi0jIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAotIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKLSMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAotIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KLSMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKLSMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRk9PVEVSICAgICAgICAgICAgPQotCi0jIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCi0jIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCi0jIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgotIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQotIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KLSMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcwotIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQotIyBvYnNvbGV0ZS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9TVFlMRVNIRUVUICAgICAgICA9Ci0KLSMgVGhlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhZGRpdGlvbmFsIHVzZXItCi0jIGRlZmluZWQgY2FzY2FkaW5nIHN0eWxlIHNoZWV0IHRoYXQgaXMgaW5jbHVkZWQgYWZ0ZXIgdGhlIHN0YW5kYXJkIHN0eWxlIHNoZWV0cwotIyBjcmVhdGVkIGJ5IGRveHlnZW4uIFVzaW5nIHRoaXMgb3B0aW9uIG9uZSBjYW4gb3ZlcnJ1bGUgY2VydGFpbiBzdHlsZSBhc3BlY3RzLgotIyBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVCBzaW5jZSBpdCBkb2VzIG5vdCByZXBsYWNlIHRoZQotIyBzdGFuZGFyZCBzdHlsZSBzaGVldCBhbmQgaXMgdGhlcmVmb3IgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KLSMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEZvciBhbiBleGFtcGxlCi0jIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9Ci0KLSMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCi0jIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKLSMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKLSMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKLSMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCi0jIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRVhUUkFfRklMRVMgICAgICAgPQotCi0jIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LiBEb3h5Z2VuCi0jIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bwotIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCi0jIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCi0jIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAotIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAotCi0jIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCi0jIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQotIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKLQotIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQotIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCi0jIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAotIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKLSMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAotIyBjaGFuZ2UgdGhlIGdhbW1hLgotIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCi0KLSMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCi0jIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCi0jIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKLSMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKLSMgcGFnZSBoYXMgbG9hZGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTwotCi0jIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcwotIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKLSMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KLSMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKLSMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKLSMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKLSMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKLSMgdHJlZSBieSBkZWZhdWx0LgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKLQotIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKLSMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50Ci0jIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAotIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KLSMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCi0jIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAotIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAotIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KLQotIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKLSMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKLSMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCi0KLSMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCi0jIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KLSMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAotCi0jIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKLSMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKLSMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgotCi1ET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCi0KLSMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KLQotRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgotCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCi0jIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQotIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKLSMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KLSMgV2luZG93cy4KLSMKLSMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0Ci0jIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAotIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAotIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAotIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgotIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKLSMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUdFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTwotCi0jIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQotIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCi0jIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUNITV9GSUxFICAgICAgICAgICAgICAgPQotCi0jIFRoZSBISENfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoCi0jIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKCBoaGMuZXhlKS4gSWYgbm9uLWVtcHR5Ci0jIGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuCi0jIFRoZSBmaWxlIGhhcyB0byBiZSBzcGVjaWZpZWQgd2l0aCBmdWxsIHBhdGguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgotCi1ISENfTE9DQVRJT04gICAgICAgICAgID0KLQotIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkICgKLSMgWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoIE5PKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCi0KLSMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoIGhoayksIGNvbnRlbnQgKCBoaGMpCi0jIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUNITV9JTkRFWF9FTkNPRElORyAgICAgPQotCi0jIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAotIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLUJJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTwotCi0jIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCi0jIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCi0KLVRPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKLSMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0Ci0jIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCi0jICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KLSMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RQ0hfRklMRSAgICAgICAgICAgICAgID0KLQotIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCi0jIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQotIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKLQotIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0Ci0jIEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gVmlydHVhbAotIyBGb2xkZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLQotIyBmb2xkZXJzKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGRvYy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgotCi1RSFBfVklSVFVBTF9GT0xERVIgICAgID0gZG9jCi0KLSMgSWYgdGhlIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIHRhZyBpcyBzZXQsIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGN1c3RvbQotIyBmaWx0ZXIgdG8gYWRkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbQotIyBGaWx0ZXJzIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tCi0jIGZpbHRlcnMpLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIUF9DVVNUX0ZJTFRFUl9OQU1FICAgPQotCi0jIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKLSMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCi0jIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KLSMgZmlsdGVycykuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9Ci0KLSMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKLSMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6Ci0jIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KLQotUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9Ci0KLSMgVGhlIFFIR19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncwotIyBxaGVscGdlbmVyYXRvci4gSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZQotIyBnZW5lcmF0ZWQgLnFocCBmaWxlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCi0KLVFIR19MT0NBVElPTiAgICAgICAgICAgPQotCi0jIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCi0jIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCi0jIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KLSMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCi0jIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5Ci0jIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KLSMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KLQotIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KLSMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKLSMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KLQotRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKLQotIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAotIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCi0jIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAotIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcwotIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KLSMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCi0KLSMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAotIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZwotIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQotIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcwotIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAotIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQotIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZXNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgotIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCi0jIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAotIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKLSMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKLSMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1HRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KLQotIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIHRoYXQKLSMgZG94eWdlbiB3aWxsIGdyb3VwIG9uIG9uZSBsaW5lIGluIHRoZSBnZW5lcmF0ZWQgSFRNTCBkb2N1bWVudGF0aW9uLgotIwotIyBOb3RlIHRoYXQgYSB2YWx1ZSBvZiAwIHdpbGwgY29tcGxldGVseSBzdXBwcmVzcyB0aGUgZW51bSB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcKLSMgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA0LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1FTlVNX1ZBTFVFU19QRVJfTElORSAgID0gNAotCi0jIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlIHVzZWQKLSMgdG8gc2V0IHRoZSBpbml0aWFsIHdpZHRoIChpbiBwaXhlbHMpIG9mIHRoZSBmcmFtZSBpbiB3aGljaCB0aGUgdHJlZSBpcyBzaG93bi4KLSMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTUwMCwgZGVmYXVsdCB2YWx1ZTogMjUwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1UUkVFVklFV19XSURUSCAgICAgICAgID0gMjUwCi0KLSMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3BlbiBsaW5rcyB0bwotIyBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KLQotRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCi0KLSMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhVGVYIGZvcm11bGFzIGluY2x1ZGVkIGFzIGltYWdlcyBpbgotIyB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBXaGVuIHlvdSBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBhZnRlciBhIHN1Y2Nlc3NmdWwKLSMgZG94eWdlbiBydW4geW91IG5lZWQgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MCi0jIG91dHB1dCBkaXJlY3RvcnkgdG8gZm9yY2UgdGhlbSB0byBiZSByZWdlbmVyYXRlZC4KLSMgTWluaW11bSB2YWx1ZTogOCwgbWF4aW11bSB2YWx1ZTogNTAsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1GT1JNVUxBX0ZPTlRTSVpFICAgICAgID0gMTAKLQotIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMKLSMgZ2VuZXJhdGVkIGZvciBmb3JtdWxhcyBhcmUgdHJhbnNwYXJlbnQgUE5Hcy4gVHJhbnNwYXJlbnQgUE5HcyBhcmUgbm90Ci0jIHN1cHBvcnRlZCBwcm9wZXJseSBmb3IgSUUgNi4wLCBidXQgYXJlIHN1cHBvcnRlZCBvbiBhbGwgbW9kZXJuIGJyb3dzZXJzLgotIwotIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMgaW4KLSMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLUZPUk1VTEFfVFJBTlNQQVJFTlQgICAgPSBZRVMKLQotIyBFbmFibGUgdGhlIFVTRV9NQVRISkFYIG9wdGlvbiB0byByZW5kZXIgTGFUZVggZm9ybXVsYXMgdXNpbmcgTWF0aEpheCAoc2VlCi0jIGh0dHA6Ly93d3cubWF0aGpheC5vcmcpIHdoaWNoIHVzZXMgY2xpZW50IHNpZGUgSmF2YXNjcmlwdCBmb3IgdGhlIHJlbmRlcmluZwotIyBpbnN0ZWFkIG9mIHVzaW5nIHByZXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QgaGF2ZSBMYVRlWAotIyBpbnN0YWxsZWQgb3IgaWYgeW91IHdhbnQgdG8gZm9ybXVsYXMgbG9vayBwcmV0dGllciBpbiB0aGUgSFRNTCBvdXRwdXQuIFdoZW4KLSMgZW5hYmxlZCB5b3UgbWF5IGFsc28gbmVlZCB0byBpbnN0YWxsIE1hdGhKYXggc2VwYXJhdGVseSBhbmQgY29uZmlndXJlIHRoZSBwYXRoCi0jIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCi0KLVVTRV9NQVRISkFYICAgICAgICAgICAgPSBOTwotCi0jIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQgdG8gYmUgdXNlZCBmb3IKLSMgdGhlIE1hdGhKYXggb3V0cHV0LiBTZWUgdGhlIE1hdGhKYXggc2l0ZSAoc2VlOgotIyBodHRwOi8vZG9jcy5tYXRoamF4Lm9yZy9lbi9sYXRlc3Qvb3V0cHV0Lmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCi0jIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEhUTUwtQ1NTICh3aGljaCBpcyBzbG93ZXIsIGJ1dCBoYXMgdGhlIGJlc3QKLSMgY29tcGF0aWJpbGl0eSksIE5hdGl2ZU1NTCAoaS5lLiBNYXRoTUwpIGFuZCBTVkcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIVE1MLUNTUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFVTRV9NQVRISkFYIGlzIHNldCB0byBZRVMuCi0KLU1BVEhKQVhfRk9STUFUICAgICAgICAgPSBIVE1MLUNTUwotCi0jIFdoZW4gTWF0aEpheCBpcyBlbmFibGVkIHlvdSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBIVE1MCi0jIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLSMgc2hvdWxkIGNvbnRhaW4gdGhlIE1hdGhKYXguanMgc2NyaXB0LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBtYXRoamF4IGRpcmVjdG9yeQotIyBpcyBsb2NhdGVkIGF0IHRoZSBzYW1lIGxldmVsIGFzIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHRoZW4KLSMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8gdGhlIE1hdGhKYXgKLSMgQ29udGVudCBEZWxpdmVyeSBOZXR3b3JrIHNvIHlvdSBjYW4gcXVpY2tseSBzZWUgdGhlIHJlc3VsdCB3aXRob3V0IGluc3RhbGxpbmcKLSMgTWF0aEpheC4gSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsIGNvcHkgb2YKLSMgTWF0aEpheCBmcm9tIGh0dHA6Ly93d3cubWF0aGpheC5vcmcgYmVmb3JlIGRlcGxveW1lbnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0LgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KLQotTUFUSEpBWF9SRUxQQVRIICAgICAgICA9IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QKLQotIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIE1hdGhKYXgKLSMgZXh0ZW5zaW9uIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGVuYWJsZWQgZHVyaW5nIE1hdGhKYXggcmVuZGVyaW5nLiBGb3IgZXhhbXBsZQotIyBNQVRISkFYX0VYVEVOU0lPTlMgPSBUZVgvQU1TbWF0aCBUZVgvQU1Tc3ltYm9scwotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KLQotTUFUSEpBWF9FWFRFTlNJT05TICAgICA9Ci0KLSMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKLSMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCi0jIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCi0jIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KLQotTUFUSEpBWF9DT0RFRklMRSAgICAgICA9Ci0KLSMgV2hlbiB0aGUgU0VBUkNIRU5HSU5FIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHNlYXJjaCBib3ggZm9yCi0jIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQgYW5kIERIVE1MIGFuZAotIyBzaG91bGQgd29yayBvbiBhbnkgbW9kZXJuIGJyb3dzZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIEhUTUwgaGVscAotIyAoR0VORVJBVEVfSFRNTEhFTFApLCBRdCBoZWxwIChHRU5FUkFURV9RSFApLCBvciBkb2NzZXRzIChHRU5FUkFURV9ET0NTRVQpCi0jIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkIHR5cGljYWxseSBiZSBkaXNhYmxlZC4KLSMgRm9yIGxhcmdlIHByb2plY3RzIHRoZSBqYXZhc2NyaXB0IGJhc2VkIHNlYXJjaCBlbmdpbmUgY2FuIGJlIHNsb3csIHRoZW4KLSMgZW5hYmxpbmcgU0VSVkVSX0JBU0VEX1NFQVJDSCBtYXkgcHJvdmlkZSBhIGJldHRlciBzb2x1dGlvbi4gSXQgaXMgcG9zc2libGUgdG8KLSMgc2VhcmNoIHVzaW5nIHRoZSBrZXlib2FyZDsgdG8ganVtcCB0byB0aGUgc2VhcmNoIGJveCB1c2UgPGFjY2VzcyBrZXk+ICsgUwotIyAod2hhdCB0aGUgPGFjY2VzcyBrZXk+IGlzIGRlcGVuZHMgb24gdGhlIE9TIGFuZCBicm93c2VyLCBidXQgaXQgaXMgdHlwaWNhbGx5Ci0jIDxDVFJMPiwgPEFMVD4vPG9wdGlvbj4sIG9yIGJvdGgpLiBJbnNpZGUgdGhlIHNlYXJjaCBib3ggdXNlIHRoZSA8Y3Vyc29yIGRvd24KLSMga2V5PiB0byBqdW1wIGludG8gdGhlIHNlYXJjaCByZXN1bHRzIHdpbmRvdywgdGhlIHJlc3VsdHMgY2FuIGJlIG5hdmlnYXRlZAotIyB1c2luZyB0aGUgPGN1cnNvciBrZXlzPi4gUHJlc3MgPEVudGVyPiB0byBzZWxlY3QgYW4gaXRlbSBvciA8ZXNjYXBlPiB0byBjYW5jZWwKLSMgdGhlIHNlYXJjaC4gVGhlIGZpbHRlciBvcHRpb25zIGNhbiBiZSBzZWxlY3RlZCB3aGVuIHRoZSBjdXJzb3IgaXMgaW5zaWRlIHRoZQotIyBzZWFyY2ggYm94IGJ5IHByZXNzaW5nIDxTaGlmdD4rPGN1cnNvciBkb3duPi4gQWxzbyBoZXJlIHVzZSB0aGUgPGN1cnNvciBrZXlzPgotIyB0byBzZWxlY3QgYSBmaWx0ZXIgYW5kIDxFbnRlcj4gb3IgPGVzY2FwZT4gdG8gYWN0aXZhdGUgb3IgY2FuY2VsIHRoZSBmaWx0ZXIKLSMgb3B0aW9uLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgotCi1TRUFSQ0hFTkdJTkUgICAgICAgICAgID0gWUVTCi0KLSMgV2hlbiB0aGUgU0VSVkVSX0JBU0VEX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCB0aGUgc2VhcmNoIGVuZ2luZSB3aWxsIGJlCi0jIGltcGxlbWVudGVkIHVzaW5nIGEgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGEgd2ViIGNsaWVudCB1c2luZyBKYXZhc2NyaXB0LiBUaGVyZQotIyBhcmUgdHdvIGZsYXZvdXJzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUKLSMgRVhURVJOQUxfU0VBUkNIIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yCi0jIHNlYXJjaGluZyBhbmQgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzCi0jIGVuYWJsZWQgdGhlIGluZGV4aW5nIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZQotIyB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgotCi1TRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KLQotIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKLSMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCi0jIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCi0jIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQotIyBzZWFyY2ggcmVzdWx0cy4KLSMKLSMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQotIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5Ci0jIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLgotIwotIyBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotRVhURVJOQUxfU0VBUkNIICAgICAgICA9IE5PCi0KLSMgVGhlIFNFQVJDSEVOR0lORV9VUkwgc2hvdWxkIHBvaW50IHRvIGEgc2VhcmNoIGVuZ2luZSBob3N0ZWQgYnkgYSB3ZWIgc2VydmVyCi0jIHdoaWNoIHdpbGwgcmV0dXJuIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIEVYVEVSTkFMX1NFQVJDSCBpcyBlbmFibGVkLgotIwotIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyICggZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCi0jIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKLSMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kCi0jIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KLQotU0VBUkNIRU5HSU5FX1VSTCAgICAgICA9Ci0KLSMgV2hlbiBTRVJWRVJfQkFTRURfU0VBUkNIIGFuZCBFWFRFUk5BTF9TRUFSQ0ggYXJlIGJvdGggZW5hYmxlZCB0aGUgdW5pbmRleGVkCi0jIHNlYXJjaCBkYXRhIGlzIHdyaXR0ZW4gdG8gYSBmaWxlIGZvciBpbmRleGluZyBieSBhbiBleHRlcm5hbCB0b29sLiBXaXRoIHRoZQotIyBTRUFSQ0hEQVRBX0ZJTEUgdGFnIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSBjYW4gYmUgc3BlY2lmaWVkLgotIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBzZWFyY2hkYXRhLnhtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgotCi1TRUFSQ0hEQVRBX0ZJTEUgICAgICAgID0gc2VhcmNoZGF0YS54bWwKLQotIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZQotIyBFWFRFUk5BTF9TRUFSQ0hfSUQgdGFnIGNhbiBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBwcm9qZWN0LiBUaGlzIGlzCi0jIHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIEVYVFJBX1NFQVJDSF9NQVBQSU5HUyB0byBzZWFyY2ggdGhyb3VnaCBtdWx0aXBsZQotIyBwcm9qZWN0cyBhbmQgcmVkaXJlY3QgdGhlIHJlc3VsdHMgYmFjayB0byB0aGUgcmlnaHQgcHJvamVjdC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgotCi1FWFRFUk5BTF9TRUFSQ0hfSUQgICAgID0KLQotIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgotIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCi0jIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKLSMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgotIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKLSMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCi0KLUVYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIExhVGVYIG91dHB1dC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUwotCi0jIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbGF0ZXguCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKLQotIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQotIyBpbnZva2VkLgotIwotIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCi0jIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcwotIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgotIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAotCi0jIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byBnZW5lcmF0ZQotIyBpbmRleCBmb3IgTGFUZVguCi0jIFRoZSBkZWZhdWx0IGZpbGUgaXM6IG1ha2VpbmRleC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLU1BS0VJTkRFWF9DTURfTkFNRSAgICAgPSBtYWtlaW5kZXgKLQotIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKLSMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKLSMgdHJlZXMgaW4gZ2VuZXJhbC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KLQotQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCi0KLSMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgYnkgdGhlCi0jIHByaW50ZXIuCi0jIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0ICgyMTAgeCAyOTcgbW0pLCBsZXR0ZXIgKDguNSB4IDExIGluY2hlcyksIGxlZ2FsICg4LjUgeAotIyAxNCBpbmNoZXMpIGFuZCBleGVjdXRpdmUgKDcuMjUgeCAxMC41IGluY2hlcykuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBhNC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLVBBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNAotCi0jIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBMYVRlWCBwYWNrYWdlIG5hbWVzCi0jIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuIFRvIGdldCB0aGUgdGltZXMgZm9udCBmb3IKLSMgaW5zdGFuY2UgeW91IGNhbiBzcGVjaWZ5Ci0jIEVYVFJBX1BBQ0tBR0VTPXRpbWVzCi0jIElmIGxlZnQgYmxhbmsgbm8gZXh0cmEgcGFja2FnZXMgd2lsbCBiZSBpbmNsdWRlZC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUVYVFJBX1BBQ0tBR0VTICAgICAgICAgPQotCi0jIFRoZSBMQVRFWF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBoZWFkZXIgZm9yIHRoZQotIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCB0aGUgZmlyc3QKLSMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBoZWFkZXIuIFNlZQotIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGxldCBkb3h5Z2VuIHdyaXRlIHRoZQotIyBkZWZhdWx0IGhlYWRlciB0byBhIHNlcGFyYXRlIGZpbGUuCi0jCi0jIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGhlYWRlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchIFRoZQotIyBmb2xsb3dpbmcgY29tbWFuZHMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZyBpbnNpZGUgdGhlIGhlYWRlcjogJHRpdGxlLAotIyAkZGF0ZXRpbWUsICRkYXRlLCAkZG94eWdlbnZlcnNpb24sICRwcm9qZWN0bmFtZSwgJHByb2plY3RudW1iZXIuIERveHlnZW4gd2lsbAotIyByZXBsYWNlIHRoZW0gYnkgcmVzcGVjdGl2ZWx5IHRoZSB0aXRsZSBvZiB0aGUgcGFnZSwgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSwKLSMgb25seSB0aGUgY3VycmVudCBkYXRlLCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgZG94eWdlbiwgdGhlIHByb2plY3QgbmFtZSAoc2VlCi0jIFBST0pFQ1RfTkFNRSksIG9yIHRoZSBwcm9qZWN0IG51bWJlciAoc2VlIFBST0pFQ1RfTlVNQkVSKS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0hFQURFUiAgICAgICAgICAgPQotCi0jIFRoZSBMQVRFWF9GT09URVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBMYVRlWCBmb290ZXIgZm9yIHRoZQotIyBnZW5lcmF0ZWQgTGFUZVggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlciB0aGUgbGFzdAotIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGZvb3Rlci4KLSMKLSMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0ZPT1RFUiAgICAgICAgICAgPQotCi0jIFRoZSBMQVRFWF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKLSMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIExBVEVYX09VVFBVVCBvdXRwdXQKLSMgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IKLSMgbWFya2VycyBhdmFpbGFibGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9FWFRSQV9GSUxFUyAgICAgID0KLQotIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcwotIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCi0jIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCi0jIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1QREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCi0KLSMgSWYgdGhlIExBVEVYX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCi0jIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQotIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLVVTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCi0jIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZwotIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKLSMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCi0KLUxBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTwotCi0jIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCi0jIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KLQotIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKLSMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KLSMKLSMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCi0jIFNPVVJDRV9CUk9XU0VSLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KLQotIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQotIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCi0jIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgotCi1MQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQotIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKLSMgcmVhZGVycy9lZGl0b3JzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTwotCi0jIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCi0jIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgotIyBpdC4KLSMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KLQotUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgotCi0jIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCi0jIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCi0jIHRyZWVzIGluIGdlbmVyYWwuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgotCi1DT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAotIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAotIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQotIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCi0jIGZpZWxkcy4KLSMKLSMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgotCi1SVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KLQotIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCi0jIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCi0jIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgotIwotIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQotIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCi0KLVJURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQotCi0jIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcwotIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAotIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCi0KLVJURl9FWFRFTlNJT05TX0ZJTEUgICAgPQotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBtYW4gcGFnZSBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfTUFOIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtYW4gcGFnZXMgZm9yCi0jIGNsYXNzZXMgYW5kIGZpbGVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTwotCi0jIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQotIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKLSMgaXQuIEEgZGlyZWN0b3J5IG1hbjMgd2lsbCBiZSBjcmVhdGVkIGluc2lkZSB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieQotIyBNQU5fT1VUUFVULgotIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IG1hbi4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgotCi1NQU5fT1VUUFVUICAgICAgICAgICAgID0gbWFuCi0KLSMgVGhlIE1BTl9FWFRFTlNJT04gdGFnIGRldGVybWluZXMgdGhlIGV4dGVuc2lvbiB0aGF0IGlzIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQKLSMgbWFuIHBhZ2VzLiBJbiBjYXNlIHRoZSBtYW51YWwgc2VjdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgbnVtYmVyLCB0aGUgbnVtYmVyCi0jIDMgaXMgcHJlcGVuZGVkLiBUaGUgZG90ICguKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQU5fRVhURU5TSU9OIHRhZyBpcwotIyBvcHRpb25hbC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IC4zLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCi0KLU1BTl9FWFRFTlNJT04gICAgICAgICAgPSAuMwotCi0jIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKLSMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAotIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKLSMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCi0KLU1BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdAotIyBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9YTUwgICAgICAgICAgID0gTk8KLQotIyBUaGUgWE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBYTUwgcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKLSMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCi0jIGl0LgotIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHhtbC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgotCi1YTUxfT1VUUFVUICAgICAgICAgICAgID0geG1sCi0KLSMgVGhlIFhNTF9TQ0hFTUEgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgc2NoZW1hLCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCi0jIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KLQotWE1MX1NDSEVNQSAgICAgICAgICAgICA9Ci0KLSMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgRFRELCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCi0jIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KLQotWE1MX0RURCAgICAgICAgICAgICAgICA9Ci0KLSMgSWYgdGhlIFhNTF9QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZHVtcCB0aGUgcHJvZ3JhbQotIyBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIGluZm9ybWF0aW9uKSB0bwotIyB0aGUgWE1MIG91dHB1dC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBzaXplCi0jIG9mIHRoZSBYTUwgb3V0cHV0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCi0KLVhNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgRE9DQk9PSyBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfRE9DQk9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcwotIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotCi1HRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KLQotIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KLSMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KLSMgZnJvbnQgb2YgaXQuCi0jIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KLQotRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKLQotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4gQXV0b0dlbgotIyBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKLSMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsCi0jIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0KLUdFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQotIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCi0jCi0jIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBuZWNlc3NhcnkKLSMgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJCi0jIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KLQotUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKLSMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCi0jIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTyB0aGUKLSMgc2l6ZSBvZiB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbXVjaCBzbWFsbGVyIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQKLSMganVzdCB0aGUgc2FtZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KLQotUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUwotCi0jIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQotIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCi0jIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAotIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KLQotUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9Ci0KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3NvcgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCi0jIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKLQotIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBleHBhbmQgYWxsIG1hY3JvIG5hbWVzCi0jIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PIG9ubHkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2lsbCBiZQotIyBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgd2F5IGJ5IHNldHRpbmcKLSMgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCi0jIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAotIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1FWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KLQotIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBpbmNsdWRlcyBmaWxlcyBpbiB0aGUKLSMgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCi0KLVNFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKLQotIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKLSMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieSB0aGUKLSMgcHJlcHJvY2Vzc29yLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIX0lOQ0xVREVTIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVfUEFUSCAgICAgICAgICAgPQotCi0jIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQKLSMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQotIyBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuaywgdGhlIHBhdHRlcm5zIHNwZWNpZmllZCB3aXRoIEZJTEVfUEFUVEVSTlMgd2lsbCBiZQotIyB1c2VkLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9Ci0KLSMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKLSMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgotIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCi0jIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKLSMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgotIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1QUkVERUZJTkVEICAgICAgICAgICAgID0KLQotIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKLSMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKLSMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECi0jIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKLSMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgotCi1FWFBBTkRfQVNfREVGSU5FRCAgICAgID0KLQotIyBJZiB0aGUgU0tJUF9GVU5DVElPTl9NQUNST1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwKLSMgcmVtb3ZlIGFsbCByZWZyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuCi0jIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MgYXJlCi0jIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAotIyByZW1vdmVkLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KLQotU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUwotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKLSMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCi0jIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6Ci0jIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCi0jIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6Ci0jIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KLSMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQotIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKLSMgb2YgdGFnIGZpbGVzLgotIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhbiB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQotIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCi0jIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCi0KLVRBR0ZJTEVTICAgICAgICAgICAgICAgPQotCi0jIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQotIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KLSMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KLQotR0VORVJBVEVfVEFHRklMRSAgICAgICA9Ci0KLSMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3Mgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlCi0jIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZSBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCi0KLSMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkIGluCi0jIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsIGJlCi0jIGxpc3RlZC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotRVhURVJOQUxfR1JPVVBTICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBFWFRFUk5BTF9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgcGFnZXMgd2lsbCBiZSBsaXN0ZWQgaW4KLSMgdGhlIHJlbGF0ZWQgcGFnZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgcGFnZXMgd2lsbAotIyBiZSBsaXN0ZWQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0KLUVYVEVSTkFMX1BBR0VTICAgICAgICAgPSBZRVMKLQotIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQKLSMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiAnd2hpY2ggcGVybCcpLgotIyBUaGUgZGVmYXVsdCBmaWxlICh3aXRoIGFic29sdXRlIHBhdGgpIGlzOiAvdXNyL2Jpbi9wZXJsLgotCi1QRVJMX1BBVEggICAgICAgICAgICAgID0gL3Vzci9iaW4vcGVybAotCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCi0jIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bwotIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCi0jIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKLSMgcG93ZXJmdWwgZ3JhcGhzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotCi1DTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCi0KLSMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKLSMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgotIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQotIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCi0jIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCi0jIGRlZmF1bHQgc2VhcmNoIHBhdGguCi0KLU1TQ0dFTl9QQVRIICAgICAgICAgICAgPQotCi0jIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCi0jIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQotIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KLSMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KLQotRElBX1BBVEggICAgICAgICAgICAgICA9Ci0KLSMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgaW5oZXJpdGFuY2UKLSMgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZCBvciBpcyBub3QgYSBjbGFzcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLQotSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUwotCi0jIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcwotIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXogKHNlZToKLSMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvKSwgYSBncmFwaCB2aXN1YWxpemF0aW9uIHRvb2xraXQgZnJvbSBBVCZUIGFuZCBMdWNlbnQKLSMgQmVsbCBMYWJzLiBUaGUgb3RoZXIgb3B0aW9ucyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMKLSMgc2V0IHRvIE5PCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLQotSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCi0KLSMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcyBhbGxvd2VkCi0jIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCBkb3h5Z2VuIHdpbGwgYmFzZSB0aGlzIG9uIHRoZSBudW1iZXIgb2YKLSMgcHJvY2Vzc29ycyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbS4gWW91IGNhbiBzZXQgaXQgZXhwbGljaXRseSB0byBhIHZhbHVlCi0jIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZSBiZXR3ZWVuIENQVSBsb2FkIGFuZCBwcm9jZXNzaW5nCi0jIHNwZWVkLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzMiwgZGVmYXVsdCB2YWx1ZTogMC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9OVU1fVEhSRUFEUyAgICAgICAgPSAwCi0KLSMgV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCBuIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCi0jIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKLSMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKLSMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKLSMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEhlbHZldGljYQotCi0jIFRoZSBET1RfRk9OVFNJWkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2l6ZSAoaW4gcG9pbnRzKSBvZiB0aGUgZm9udCBvZgotIyBkb3QgZ3JhcGhzLgotIyBNaW5pbXVtIHZhbHVlOiA0LCBtYXhpbXVtIHZhbHVlOiAyNCwgZGVmYXVsdCB2YWx1ZTogMTAuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTAKLQotIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAotIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0Ci0jIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9GT05UUEFUSCAgICAgICAgICAgPQotCi0jIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgotIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCi0jIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUNMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCi0jIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgotIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKLSMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1DT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCi0KLSMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgotIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCi0jIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCi0jIExhbmd1YWdlLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1VTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIGVuYWJsZWQsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgYXJlIHNob3duIGluc2lkZSB0aGUKLSMgY2xhc3Mgbm9kZS4gSWYgdGhlcmUgYXJlIG1hbnkgZmllbGRzIG9yIG1ldGhvZHMgYW5kIG1hbnkgbm9kZXMgdGhlIGdyYXBoIG1heQotIyBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUyB0aHJlc2hvbGQgbGltaXRzIHRoZQotIyBudW1iZXIgb2YgaXRlbXMgZm9yIGVhY2ggdHlwZSB0byBtYWtlIHRoZSBzaXplIG1vcmUgbWFuYWdlYWJsZS4gU2V0IHRoaXMgdG8gMAotIyBmb3Igbm8gbGltaXQuIE5vdGUgdGhhdCB0aGUgdGhyZXNob2xkIG1heSBiZSBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdAotIyBpcyBlbmZvcmNlZC4gU28gd2hlbiB5b3Ugc2V0IHRoZSB0aHJlc2hvbGQgdG8gMTAsIHVwIHRvIDE1IGZpZWxkcyBtYXkgYXBwZWFyLAotIyBidXQgaWYgdGhlIG51bWJlciBleGNlZWRzIDE1LCB0aGUgdG90YWwgYW1vdW50IG9mIGZpZWxkcyBzaG93biBpcyBsaW1pdGVkIHRvCi0jIDEwLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAsIGRlZmF1bHQgdmFsdWU6IDEwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotVU1MX0xJTUlUX05VTV9GSUVMRFMgICA9IDEwCi0KLSMgSWYgdGhlIFRFTVBMQVRFX1JFTEFUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBpbmhlcml0YW5jZSBhbmQKLSMgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZSByZWxhdGlvbnMgYmV0d2VlbiB0ZW1wbGF0ZXMgYW5kIHRoZWlyCi0jIGluc3RhbmNlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotVEVNUExBVEVfUkVMQVRJT05TICAgICA9IE5PCi0KLSMgSWYgdGhlIElOQ0xVREVfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUgc2V0IHRvCi0jIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nIHRoZQotIyBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAotIyBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKLQotIyBJZiB0aGUgSU5DTFVERURfQllfR1JBUEgsIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGFuZCBTRUFSQ0hfSU5DTFVERVMgdGFncyBhcmUKLSMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgZmlsZSBzaG93aW5nCi0jIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggb3RoZXIgZG9jdW1lbnRlZAotIyBmaWxlcy4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUlOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMKLQotIyBJZiB0aGUgQ0FMTF9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwKLSMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KLSMKLSMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KLSMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbCBncmFwaHMgZm9yIHNlbGVjdGVkCi0jIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUNBTExfR1JBUEggICAgICAgICAgICAgPSBOTwotCi0jIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKLSMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KLSMKLSMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KLSMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKLSMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1DQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KLQotIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKLSMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLUdSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKLQotIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCi0jIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKLSMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQotIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCi0KLSMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKLSMgZ2VuZXJhdGVkIGJ5IGRvdC4KLSMgTm90ZTogSWYgeW91IGNob29zZSBzdmcgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIKLSMgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzIHZpc2libGUgaW4gSUUgOSsgKG90aGVyIGJyb3dzZXJzIGRvIG5vdCBoYXZlIHRoaXMKLSMgcmVxdWlyZW1lbnQpLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBwbmcsIGpwZywgZ2lmIGFuZCBzdmcuCi0jIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbmcuCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nCi0KLSMgSWYgRE9UX0lNQUdFX0ZPUk1BVCBpcyBzZXQgdG8gc3ZnLCB0aGVuIHRoaXMgb3B0aW9uIGNhbiBiZSBzZXQgdG8gWUVTIHRvCi0jIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLgotIwotIyBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBhIG1vZGVybiBicm93c2VyIG90aGVyIHRoYW4gSW50ZXJuZXQgRXhwbG9yZXIuIFRlc3RlZAotIyBhbmQgd29ya2luZyBhcmUgRmlyZWZveCwgQ2hyb21lLCBTYWZhcmksIGFuZCBPcGVyYS4KLSMgTm90ZTogRm9yIElFIDkrIHlvdSBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UKLSMgdGhlIFNWRyBmaWxlcyB2aXNpYmxlLiBPbGRlciB2ZXJzaW9ucyBvZiBJRSBkbyBub3QgaGF2ZSBTVkcgc3VwcG9ydC4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PCi0KLSMgVGhlIERPVF9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHdoZXJlIHRoZSBkb3QgdG9vbCBjYW4gYmUKLSMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9QQVRIICAgICAgICAgICAgICAgPQotCi0jIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAotIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQotIyBjb21tYW5kKS4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVEZJTEVfRElSUyAgICAgICAgICAgPQotCi0jIFRoZSBNU0NGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAotIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcbXNjZmlsZQotIyBjb21tYW5kKS4KLQotTVNDRklMRV9ESVJTICAgICAgICAgICA9Ci0KLSMgVGhlIERJQUZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0Ci0jIGNvbnRhaW4gZGlhIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkaWFmaWxlCi0jIGNvbW1hbmQpLgotCi1ESUFGSUxFX0RJUlMgICAgICAgICAgID0KLQotIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcwotIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcwotIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCi0jIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAotIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgotIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKLSMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCi0jIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KLSMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCi0KLURPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAotCi0jIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocwotIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQotIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQotIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKLSMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCi0jIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKLSMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgotIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKLQotIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKLSMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KLSMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgotIwotIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCi0jIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bwotIyByZWFkKS4KLSMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCi0KLSMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKLSMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcwotIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0Ci0jIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCi0jIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgotCi1ET1RfTVVMVElfVEFSR0VUUyAgICAgID0gWUVTCi0KLSMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZQotIyBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZCBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQKLSMgZ3JhcGhzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUwotCi0jIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90Ci0jIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgotIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgotIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KLQotRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icAppbmRleCA0OWJkNWVlLi5lMmMxODc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInV0aWxzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icAppbmRleCBkOGM1ODQzLi43MmFkZmQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiaW5wdXRfbW9uaXRvciIsCiAgICAgZ3Rlc3Q6IGZhbHNlLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icAppbmRleCA1YjdkOTU2Li5iMThhZWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icApAQCAtMSwxMiArMSwyMyBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYWF1ZGlvX2xvb3BiYWNrIiwKICAgICBndGVzdDogZmFsc2UsCiAgICAgc3JjczogWyJzcmMvbG9vcGJhY2suY3BwIl0sCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzdGF0aWNfbGliczogWyJsaWJzbmRmaWxlIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbImV4dGVybmFsL29ib2UvYXBwcy9PYm9lVGVzdGVyL2FwcC9zcmMvbWFpbi9jcHAiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYWF1ZGlvIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIgogICAgICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL0dsaXRjaEFuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL0dsaXRjaEFuYWx5emVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDM1ZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9HbGl0Y2hBbmFseXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFOQUxZWkVSX0dMSVRDSF9BTkFMWVpFUl9ICi0jZGVmaW5lIEFOQUxZWkVSX0dMSVRDSF9BTkFMWVpFUl9ICi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlICJMYXRlbmN5QW5hbHl6ZXIuaCIKLSNpbmNsdWRlICJQc2V1ZG9SYW5kb20uaCIKLQotLyoqCi0gKiBPdXRwdXQgYSBzdGVhZHkgc2luZSB3YXZlIGFuZCBhbmFseXplIHRoZSByZXR1cm4gc2lnbmFsLgotICoKLSAqIFVzZSBhIGNvc2luZSB0cmFuc2Zvcm0gdG8gbWVhc3VyZSB0aGUgcHJlZGljdGVkIG1hZ25pdHVkZSBhbmQgcmVsYXRpdmUgcGhhc2Ugb2YgdGhlCi0gKiBsb29wZWQgYmFjayBzaW5lIHdhdmUuIFRoZW4gZ2VuZXJhdGUgYSBwcmVkaWN0ZWQgc2lnbmFsIGFuZCBjb21wYXJlIHdpdGggdGhlIGFjdHVhbCBzaWduYWwuCi0gKi8KLWNsYXNzIEdsaXRjaEFuYWx5emVyIDogcHVibGljIExvb3BiYWNrUHJvY2Vzc29yIHsKLXB1YmxpYzoKLQotICAgIGludDMyX3QgZ2V0U3RhdGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU3RhdGU7Ci0gICAgfQotCi0gICAgZG91YmxlIGdldFBlYWtBbXBsaXR1ZGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUGVha0ZvbGxvd2VyLmdldExldmVsKCk7Ci0gICAgfQotCi0gICAgZG91YmxlIGdldFRvbGVyYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Ub2xlcmFuY2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUb2xlcmFuY2UoZG91YmxlIHRvbGVyYW5jZSkgewotICAgICAgICBtVG9sZXJhbmNlID0gdG9sZXJhbmNlOwotICAgICAgICBtU2NhbGVkVG9sZXJhbmNlID0gbU1hZ25pdHVkZSAqIG1Ub2xlcmFuY2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRNYWduaXR1ZGUoZG91YmxlIG1hZ25pdHVkZSkgewotICAgICAgICBtTWFnbml0dWRlID0gbWFnbml0dWRlOwotICAgICAgICBtU2NhbGVkVG9sZXJhbmNlID0gbU1hZ25pdHVkZSAqIG1Ub2xlcmFuY2U7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRHbGl0Y2hDb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1HbGl0Y2hDb3VudDsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldFN0YXRlRnJhbWVDb3VudChpbnQgc3RhdGUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZUZyYW1lQ291bnRlcnNbc3RhdGVdOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRTaWduYWxUb05vaXNlREIoKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgdGhyZXNob2xkID0gMS4wZS0xNDsKLSAgICAgICAgaWYgKG1NZWFuU3F1YXJlU2lnbmFsIDwgdGhyZXNob2xkIHx8IG1NZWFuU3F1YXJlTm9pc2UgPCB0aHJlc2hvbGQpIHsKLSAgICAgICAgICAgIHJldHVybiAwLjA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkb3VibGUgc2lnbmFsVG9Ob2lzZSA9IG1NZWFuU3F1YXJlU2lnbmFsIC8gbU1lYW5TcXVhcmVOb2lzZTsgLy8gcG93ZXIgcmF0aW8KLSAgICAgICAgICAgIGRvdWJsZSBzaWduYWxUb05vaXNlREIgPSAxMC4wICogbG9nKHNpZ25hbFRvTm9pc2UpOwotICAgICAgICAgICAgaWYgKHNpZ25hbFRvTm9pc2VEQiA8IE1JTl9TTlJfREIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRCgiRVJST1IgLSBzaWduYWwgdG8gbm9pc2UgcmF0aW8gaXMgdG9vIGxvdyEgPCAlZCBkQi4gQWRqdXN0IHZvbHVtZS4iLAotICAgICAgICAgICAgICAgICAgICAgTUlOX1NOUl9EQik7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX1ZPTFVNRV9UT09fTE9XKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaWduYWxUb05vaXNlREI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhbmFseXplKCkgb3ZlcnJpZGUgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXBvcnQ7Ci0gICAgICAgIHJlcG9ydCA8PCAiR2xpdGNoQW5hbHl6ZXIgLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGVhay5hbXBsaXR1ZGUgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgIDw8IGdldFBlYWtBbXBsaXR1ZGUoKSA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5tYWduaXR1ZGUgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgIDw8IG1NYWduaXR1ZGUgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInJtcy5ub2lzZSAgICAgICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtTWVhblNxdWFyZU5vaXNlIDw8ICJcbiI7Ci0gICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJzaWduYWwudG8ubm9pc2UuZGIgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgPDwgZ2V0U2lnbmFsVG9Ob2lzZURCKCkgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lcy5hY2N1bXVsYXRlZCA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtRnJhbWVzQWNjdW11bGF0ZWQgPDwgIlxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICIgPDwgc3RkOjpzZXR3KDgpCi0gICAgICAgICAgICAgICA8PCBtU2luZVBlcmlvZCA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgIDw8IG1TdGF0ZSA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgIDw8IG1GcmFtZUNvdW50ZXIgPDwgIlxuIjsKLSAgICAgICAgLy8gRGlkIHdlIGV2ZXIgZ2V0IGEgbG9jaz8KLSAgICAgICAgYm9vbCBnb3RMb2NrID0gKG1TdGF0ZSA9PSBTVEFURV9MT0NLRUQpIHx8IChtR2xpdGNoQ291bnQgPiAwKTsKLSAgICAgICAgaWYgKCFnb3RMb2NrKSB7Ci0gICAgICAgICAgICByZXBvcnQgPDwgIkVSUk9SIC0gZmFpbGVkIHRvIGxvY2sgb24gcmVmZXJlbmNlIHNpbmUgdG9uZS5cbiI7Ci0gICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfTk9fTE9DSyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHByaW50IGlmIG1lYW5pbmdmdWwuCi0gICAgICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZ2xpdGNoLmNvdW50ICAgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgICAgICA8PCBtR2xpdGNoQ291bnQgPDwgIlxuIjsKLSAgICAgICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJtYXguZ2xpdGNoICAgICAgICAgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgICAgIDw8IG1NYXhHbGl0Y2hEZWx0YSA8PCAiXG4iOwotICAgICAgICAgICAgaWYgKG1HbGl0Y2hDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXBvcnQgPDwgIkVSUk9SIC0gbnVtYmVyIG9mIGdsaXRjaGVzID4gMFxuIjsKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfR0xJVENIRVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBvcnQuc3RyKCk7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFN0YXR1cygpIG92ZXJyaWRlIHsKLSAgICAgICAgQUxPR0QoInN0ID0gJWQsICNnbCA9ICUzZCwiLCBtU3RhdGUsIG1HbGl0Y2hDb3VudCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENhbGN1bGF0ZSB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb21wb25lbnQgb2YgdGhlIGlucHV0IHNpZ25hbAotICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgYW5hbHlzaXMgZnJlcXVlbmN5LgotICAgICAqIEFsc28gY2FsY3VsYXRlIHRoZSBwaGFzZSB0aGF0IHdlIGNhbiB1c2UgdG8gY3JlYXRlIGEKLSAgICAgKiBzaWduYWwgdGhhdCBtYXRjaGVzIHRoYXQgY29tcG9uZW50LgotICAgICAqIFRoZSBwaGFzZSB3aWxsIGJlIGJldHdlZW4gLVBJIGFuZCArUEkuCi0gICAgICovCi0gICAgZG91YmxlIGNhbGN1bGF0ZU1hZ25pdHVkZShkb3VibGUgKnBoYXNlUHRyID0gbnVsbHB0cikgewotICAgICAgICBpZiAobUZyYW1lc0FjY3VtdWxhdGVkID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwLjA7Ci0gICAgICAgIH0KLSAgICAgICAgZG91YmxlIHNpbk1lYW4gPSBtU2luQWNjdW11bGF0b3IgLyBtRnJhbWVzQWNjdW11bGF0ZWQ7Ci0gICAgICAgIGRvdWJsZSBjb3NNZWFuID0gbUNvc0FjY3VtdWxhdG9yIC8gbUZyYW1lc0FjY3VtdWxhdGVkOwotICAgICAgICBkb3VibGUgbWFnbml0dWRlID0gMi4wICogc3FydCgoc2luTWVhbiAqIHNpbk1lYW4pICsgKGNvc01lYW4gKiBjb3NNZWFuKSk7Ci0gICAgICAgIGlmIChwaGFzZVB0ciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkb3VibGUgcGhhc2UgPSBNX1BJXzIgLSBhdGFuMihzaW5NZWFuLCBjb3NNZWFuKTsKLSAgICAgICAgICAgICpwaGFzZVB0ciA9IHBoYXNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYWduaXR1ZGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZyYW1lRGF0YSBjb250YWlucyBtaWNyb3Bob25lIGRhdGEgd2l0aCBzaW5lIHNpZ25hbCBmZWVkYmFjawotICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQKLSAgICAgKi8KLSAgICByZXN1bHRfY29kZSBwcm9jZXNzSW5wdXRGcmFtZShmbG9hdCAqZnJhbWVEYXRhLCBpbnQgLyogY2hhbm5lbENvdW50ICovKSBvdmVycmlkZSB7Ci0gICAgICAgIHJlc3VsdF9jb2RlIHJlc3VsdCA9IFJFU1VMVF9PSzsKLQotICAgICAgICBmbG9hdCBzYW1wbGUgPSBmcmFtZURhdGFbMF07Ci0gICAgICAgIGZsb2F0IHBlYWsgPSBtUGVha0ZvbGxvd2VyLnByb2Nlc3Moc2FtcGxlKTsKLQotICAgICAgICAvLyBGb3JjZSBhIHBlcmlvZGljIGdsaXRjaCB0byB0ZXN0IHRoZSBkZXRlY3RvciEKLSAgICAgICAgaWYgKG1Gb3JjZUdsaXRjaER1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgaWYgKG1Gb3JjZUdsaXRjaENvdW50ZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZm9yY2UgYSBnbGl0Y2ghISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICBtRm9yY2VHbGl0Y2hDb3VudGVyID0gZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtRm9yY2VHbGl0Y2hDb3VudGVyIDw9IG1Gb3JjZUdsaXRjaER1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gRm9yY2UgYW4gYWJydXB0IG9mZnNldC4KLSAgICAgICAgICAgICAgICBzYW1wbGUgKz0gKHNhbXBsZSA+IDAuMCkgPyAtMC41ZiA6IDAuNWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAtLW1Gb3JjZUdsaXRjaENvdW50ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGVGcmFtZUNvdW50ZXJzW21TdGF0ZV0rKzsgLy8gY291bnQgaG93IG1hbnkgZnJhbWVzIHdlIGFyZSBpbiBlYWNoIHN0YXRlCi0KLSAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXItLTsKLSAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOwotICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBJTU1VTkVfRlJBTUVfQ09VTlQ7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dFBoYXNlID0gMC4wOyAvLyBwcmV2ZW50IHNwaWtlIGF0IHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRQaGFzZSA9IDAuMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSU1NVU5FOgotICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlci0tOwotICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDoKLSAgICAgICAgICAgICAgICBpZiAocGVhayA+IG1UaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfTE9DSzsKLSAgICAgICAgICAgICAgICAgICAgLy9BTE9HRCgiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfTE9DSyIsIG1GcmFtZUNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s6Ci0gICAgICAgICAgICAgICAgbVNpbkFjY3VtdWxhdG9yICs9IHNhbXBsZSAqIHNpbmYobUlucHV0UGhhc2UpOwotICAgICAgICAgICAgICAgIG1Db3NBY2N1bXVsYXRvciArPSBzYW1wbGUgKiBjb3NmKG1JbnB1dFBoYXNlKTsKLSAgICAgICAgICAgICAgICBtRnJhbWVzQWNjdW11bGF0ZWQrKzsKLSAgICAgICAgICAgICAgICAvLyBNdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBlcmlvZCBvciB0aGUgY2FsY3VsYXRpb24gd2lsbCBub3QgYmUgYWNjdXJhdGUuCi0gICAgICAgICAgICAgICAgaWYgKG1GcmFtZXNBY2N1bXVsYXRlZCA9PSBtU2luZVBlcmlvZCAqIFBFUklPRFNfTkVFREVEX0ZPUl9MT0NLKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwaGFzZU9mZnNldCA9IDAuMDsKLSAgICAgICAgICAgICAgICAgICAgc2V0TWFnbml0dWRlKGNhbGN1bGF0ZU1hZ25pdHVkZSgmcGhhc2VPZmZzZXQpKTsKLS8vICAgICAgICAgICAgICAgICAgICBBTE9HRCgiJXMoKSBtYWcgPSAlZiwgb2Zmc2V0ID0gJWYsIHByZXYgPSAlZiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbU1hZ25pdHVkZSwgbVBoYXNlT2Zmc2V0LCBtUHJldmlvdXNQaGFzZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTWFnbml0dWRlID4gbVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFicyhwaGFzZU9mZnNldCkgPCBrTWF4UGhhc2VFcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0xPQ0tFRDsKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlNWQ6IHN3aXRjaCB0byBTVEFURV9MT0NLRUQiLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBtSW5wdXRQaGFzZSB0byBtYXRjaCBtZWFzdXJlZCBwaGFzZQotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0UGhhc2UgKz0gcGhhc2VPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzZXRBY2N1bXVsYXRvcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbnB1dFBoYXNlKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBVEVfTE9DS0VEOiB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlZGljdCBuZXh0IHNpbmUgdmFsdWUKLSAgICAgICAgICAgICAgICBkb3VibGUgcHJlZGljdGVkID0gc2luZihtSW5wdXRQaGFzZSkgKiBtTWFnbml0dWRlOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkaWZmID0gcHJlZGljdGVkIC0gc2FtcGxlOwotICAgICAgICAgICAgICAgIGRvdWJsZSBhYnNEaWZmID0gZmFicyhkaWZmKTsKLSAgICAgICAgICAgICAgICBtTWF4R2xpdGNoRGVsdGEgPSBzdGQ6Om1heChtTWF4R2xpdGNoRGVsdGEsIGFic0RpZmYpOwotICAgICAgICAgICAgICAgIGlmIChhYnNEaWZmID4gbVNjYWxlZFRvbGVyYW5jZSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFUlJPUl9HTElUQ0hFUzsKLSAgICAgICAgICAgICAgICAgICAgb25HbGl0Y2hTdGFydCgpOwotLy8gICAgICAgICAgICAgICAgICAgIExPR0koImRpZmYgZ2xpdGNoIGRldGVjdGVkLCBhYnNEaWZmID0gJWciLCBhYnNEaWZmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU3VtU3F1YXJlU2lnbmFsICs9IHByZWRpY3RlZCAqIHByZWRpY3RlZDsKLSAgICAgICAgICAgICAgICAgICAgbVN1bVNxdWFyZU5vaXNlICs9IGRpZmYgKiBkaWZmOwotICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBpbmNvbWluZyBzaWduYWwgYW5kIHNsb3dseSBhZGp1c3QgbWFnbml0dWRlIHRvIGFjY291bnQKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRyaWZ0IGluIHRoZSBEUkMgb3IgQUdDLgotICAgICAgICAgICAgICAgICAgICBtU2luQWNjdW11bGF0b3IgKz0gc2FtcGxlICogc2luZihtSW5wdXRQaGFzZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db3NBY2N1bXVsYXRvciArPSBzYW1wbGUgKiBjb3NmKG1JbnB1dFBoYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lc0FjY3VtdWxhdGVkKys7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgcGVyaW9kIG9yIHRoZSBjYWxjdWxhdGlvbiB3aWxsIG5vdCBiZSBhY2N1cmF0ZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GcmFtZXNBY2N1bXVsYXRlZCA9PSBtU2luZVBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGNvZWZmaWNpZW50ID0gMC4xOwotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBoYXNlT2Zmc2V0ID0gMC4wOwotICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1hZ25pdHVkZSA9IGNhbGN1bGF0ZU1hZ25pdHVkZSgmcGhhc2VPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25lIHBvbGUgYXZlcmFnaW5nIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hZ25pdHVkZSgobU1hZ25pdHVkZSAqICgxLjAgLSBjb2VmZmljaWVudCkpICsgKG1hZ25pdHVkZSAqIGNvZWZmaWNpZW50KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWFuU3F1YXJlTm9pc2UgPSBtU3VtU3F1YXJlTm9pc2UgKiBtSW52ZXJzZVNpbmVQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVhblNxdWFyZVNpZ25hbCA9IG1TdW1TcXVhcmVTaWduYWwgKiBtSW52ZXJzZVNpbmVQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYnMocGhhc2VPZmZzZXQpID4ga01heFBoYXNlRXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFUlJPUl9HTElUQ0hFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkdsaXRjaFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBoYXNlIGdsaXRjaCBkZXRlY3RlZCwgcGhhc2VPZmZzZXQgPSAlZyIsIHBoYXNlT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1hZ25pdHVkZSA8IG1UaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBFUlJPUl9HTElUQ0hFUzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkdsaXRjaFN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm1hZ25pdHVkZSBnbGl0Y2ggZGV0ZWN0ZWQsIG1NYWduaXR1ZGUgPSAlZyIsIG1NYWduaXR1ZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluY3JlbWVudElucHV0UGhhc2UoKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU1RBVEVfR0xJVENISU5HOiB7Ci0gICAgICAgICAgICAgICAgLy8gUHJlZGljdCBuZXh0IHNpbmUgdmFsdWUKLSAgICAgICAgICAgICAgICBtR2xpdGNoTGVuZ3RoKys7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHByZWRpY3RlZCA9IHNpbmYobUlucHV0UGhhc2UpICogbU1hZ25pdHVkZTsKLSAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IHByZWRpY3RlZCAtIHNhbXBsZTsKLSAgICAgICAgICAgICAgICBkb3VibGUgYWJzRGlmZiA9IGZhYnMoZGlmZik7Ci0gICAgICAgICAgICAgICAgbU1heEdsaXRjaERlbHRhID0gc3RkOjptYXgobU1heEdsaXRjaERlbHRhLCBhYnNEaWZmKTsKLSAgICAgICAgICAgICAgICBpZiAoYWJzRGlmZiA8IG1TY2FsZWRUb2xlcmFuY2UpIHsgLy8gY2xvc2UgZW5vdWdoPwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgYSBmdWxsIHNpbmUgcGVyaW9kIG9mIG5vbi1nbGl0Y2ggc2FtcGxlcyBpbiBhIHJvdyB0aGVuIGNvbnNpZGVyIHRoZSBnbGl0Y2ggb3Zlci4KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBqdXN0IGNvbnNpZGVyIGEgemVybyBjcm9zc2luZyB0aGUgZW5kIG9mIGEgZ2xpdGNoLgotICAgICAgICAgICAgICAgICAgICBpZiAobU5vbkdsaXRjaENvdW50KysgPiBtU2luZVBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb25HbGl0Y2hFbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob25HbGl0Y2hDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtR2xpdGNoTGVuZ3RoID4gKDQgKiBtU2luZVBlcmlvZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluY3JlbWVudElucHV0UGhhc2UoKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTlVNX1NUQVRFUzogLy8gbm90IGEgcmVhbCBzdGF0ZQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbUZyYW1lQ291bnRlcisrOwotCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gYWR2YW5jZSBhbmQgd3JhcCBwaGFzZQotICAgIHZvaWQgaW5jcmVtZW50SW5wdXRQaGFzZSgpIHsKLSAgICAgICAgbUlucHV0UGhhc2UgKz0gbVBoYXNlSW5jcmVtZW50OwotICAgICAgICBpZiAobUlucHV0UGhhc2UgPiBNX1BJKSB7Ci0gICAgICAgICAgICBtSW5wdXRQaGFzZSAtPSAoMi4wICogTV9QSSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBhZHZhbmNlIGFuZCB3cmFwIHBoYXNlCi0gICAgdm9pZCBpbmNyZW1lbnRPdXRwdXRQaGFzZSgpIHsKLSAgICAgICAgbU91dHB1dFBoYXNlICs9IG1QaGFzZUluY3JlbWVudDsKLSAgICAgICAgaWYgKG1PdXRwdXRQaGFzZSA+IE1fUEkpIHsKLSAgICAgICAgICAgIG1PdXRwdXRQaGFzZSAtPSAoMi4wICogTV9QSSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZnJhbWVEYXRhIHVwb24gcmV0dXJuLCBjb250YWlucyB0aGUgcmVmZXJlbmNlIHNpbmUgd2F2ZQotICAgICAqIEBwYXJhbSBjaGFubmVsQ291bnQKLSAgICAgKi8KLSAgICByZXN1bHRfY29kZSBwcm9jZXNzT3V0cHV0RnJhbWUoZmxvYXQgKmZyYW1lRGF0YSwgaW50IGNoYW5uZWxDb3VudCkgb3ZlcnJpZGUgewotICAgICAgICBmbG9hdCBvdXRwdXQgPSAwLjBmOwotICAgICAgICAvLyBPdXRwdXQgc2luZSB3YXZlIHNvIHdlIGNhbiBtZWFzdXJlIGl0LgotICAgICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKLSAgICAgICAgICAgIGZsb2F0IHNpbk91dCA9IHNpbmYobU91dHB1dFBoYXNlKTsKLSAgICAgICAgICAgIGluY3JlbWVudE91dHB1dFBoYXNlKCk7Ci0gICAgICAgICAgICBvdXRwdXQgPSAoc2luT3V0ICogbU91dHB1dEFtcGxpdHVkZSkKLSAgICAgICAgICAgICAgICAgICAgICsgKG1XaGl0ZU5vaXNlLm5leHRSYW5kb21Eb3VibGUoKSAqIGtOb2lzZUFtcGxpdHVkZSk7Ci0gICAgICAgICAgICAvLyBBTE9HRCgic2luKCVmKSA9ICVmLCAlZlxuIiwgbU91dHB1dFBoYXNlLCBzaW5PdXQsICBtUGhhc2VJbmNyZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lRGF0YVswXSA9IG91dHB1dDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgewotICAgICAgICAgICAgZnJhbWVEYXRhW2ldID0gMC4wZjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUkVTVUxUX09LOwotICAgIH0KLQotICAgIHZvaWQgb25HbGl0Y2hTdGFydCgpIHsKLSAgICAgICAgbUdsaXRjaENvdW50Kys7Ci0vLyAgICAgICAgQUxPR0QoIiU1ZDogU1RBUlRFRCBhIGdsaXRjaCAjICVkIiwgbUZyYW1lQ291bnRlciwgbUdsaXRjaENvdW50KTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfR0xJVENISU5HOwotICAgICAgICBtR2xpdGNoTGVuZ3RoID0gMTsKLSAgICAgICAgbU5vbkdsaXRjaENvdW50ID0gMDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uR2xpdGNoRW5kKCkgewotLy8gICAgICAgIEFMT0dEKCIlNWQ6IEVOREVEIGEgZ2xpdGNoICMgJWQsIGxlbmd0aCA9ICVkIiwgbUZyYW1lQ291bnRlciwgbUdsaXRjaENvdW50LCBtR2xpdGNoTGVuZ3RoKTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfTE9DS0VEOwotICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0gICAgfQotCi0gICAgLy8gcmVzZXQgdGhlIHNpbmUgd2F2ZSBkZXRlY3RvcgotICAgIHZvaWQgcmVzZXRBY2N1bXVsYXRvcigpIHsKLSAgICAgICAgbUZyYW1lc0FjY3VtdWxhdGVkID0gMDsKLSAgICAgICAgbVNpbkFjY3VtdWxhdG9yID0gMC4wOwotICAgICAgICBtQ29zQWNjdW11bGF0b3IgPSAwLjA7Ci0gICAgICAgIG1TdW1TcXVhcmVTaWduYWwgPSAwLjA7Ci0gICAgICAgIG1TdW1TcXVhcmVOb2lzZSA9IDAuMDsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbG9jaygpIHsKLS8vICAgICAgICBBTE9HRCgicmVsb2NrOiAlZCBiZWNhdXNlIG9mIGEgdmVyeSBsb25nICVkIGdsaXRjaCIsIG1GcmFtZUNvdW50ZXIsIG1HbGl0Y2hMZW5ndGgpOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOwotICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0gICAgfQotCi0gICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKLSAgICAgICAgTG9vcGJhY2tQcm9jZXNzb3I6OnJlc2V0KCk7Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgIG1Eb3duQ291bnRlciA9IElETEVfRlJBTUVfQ09VTlQ7Ci0gICAgICAgIHJlc2V0QWNjdW11bGF0b3IoKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByZXBhcmVUb1Rlc3QoKSBvdmVycmlkZSB7Ci0gICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpwcmVwYXJlVG9UZXN0KCk7Ci0gICAgICAgIG1TaW5lUGVyaW9kID0gZ2V0U2FtcGxlUmF0ZSgpIC8ga1RhcmdldEdsaXRjaEZyZXF1ZW5jeTsKLSAgICAgICAgbU91dHB1dFBoYXNlID0gMC4wZjsKLSAgICAgICAgbUludmVyc2VTaW5lUGVyaW9kID0gMS4wIC8gbVNpbmVQZXJpb2Q7Ci0gICAgICAgIG1QaGFzZUluY3JlbWVudCA9IDIuMCAqIE1fUEkgKiBtSW52ZXJzZVNpbmVQZXJpb2Q7Ci0gICAgICAgIG1HbGl0Y2hDb3VudCA9IDA7Ci0gICAgICAgIG1NYXhHbGl0Y2hEZWx0YSA9IDAuMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RBVEVTOyBpKyspIHsKLSAgICAgICAgICAgIG1TdGF0ZUZyYW1lQ291bnRlcnNbaV0gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgLy8gVGhlc2UgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIEdsaXRjaEFjdGl2aXR5LmphdmEKLSAgICBlbnVtIHNpbmVfc3RhdGVfdCB7Ci0gICAgICAgIFNUQVRFX0lETEUsICAgICAgICAgICAgICAgLy8gYmVnaW5uaW5nCi0gICAgICAgIFNUQVRFX0lNTVVORSwgICAgICAgICAgICAgLy8gaWdub3JpbmcgaW5wdXQsIHdhaXRpbmcgZm8gSFcgdG8gc2V0dGxlCi0gICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTCwgLy8gbG9va2luZyBmb3IgYSBsb3VkIHNpZ25hbAotICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLLCAgIC8vIHRyeWluZyB0byBsb2NrIG9udG8gdGhlIHBoYXNlIG9mIHRoZSBzaW5lCi0gICAgICAgIFNUQVRFX0xPQ0tFRCwgICAgICAgICAgICAgLy8gbG9ja2VkIG9uIHRoZSBzaW5lIHdhdmUsIGxvb2tpbmcgZm9yIGdsaXRjaGVzCi0gICAgICAgIFNUQVRFX0dMSVRDSElORywgICAgICAgICAgIC8vIGxvY2tlZCBvbiB0aGUgc2luZSB3YXZlIGJ1dCBnbGl0Y2hpbmcKLSAgICAgICAgTlVNX1NUQVRFUwotICAgIH07Ci0KLSAgICBlbnVtIGNvbnN0YW50cyB7Ci0gICAgICAgIC8vIEFyYml0cmFyeSBkdXJhdGlvbnMsIGFzc3VtaW5nIDQ4MDAwIEh6Ci0gICAgICAgIElETEVfRlJBTUVfQ09VTlQgPSA0OCAqIDEwMCwKLSAgICAgICAgSU1NVU5FX0ZSQU1FX0NPVU5UID0gNDggKiAxMDAsCi0gICAgICAgIFBFUklPRFNfTkVFREVEX0ZPUl9MT0NLID0gOCwKLSAgICAgICAgTUlOX1NOUl9EQiA9IDY1Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga05vaXNlQW1wbGl0dWRlID0gMC4wMDsgLy8gVXNlZCB0byBleHBlcmltZW50IHdpdGggd2FyYmxpbmcgY2F1c2VkIGJ5IERSQy4KLSAgICBzdGF0aWMgY29uc3RleHByIGludCBrVGFyZ2V0R2xpdGNoRnJlcXVlbmN5ID0gNjA3OwotICAgIHN0YXRpYyBjb25zdGV4cHIgZG91YmxlIGtNYXhQaGFzZUVycm9yID0gTV9QSSAqIDAuMDU7Ci0KLSAgICBmbG9hdCAgIG1Ub2xlcmFuY2UgPSAwLjEwOyAvLyBzY2FsZWQgZnJvbSAwLjAgdG8gMS4wCi0gICAgZG91YmxlICBtVGhyZXNob2xkID0gMC4wMDU7Ci0gICAgaW50ICAgICBtU2luZVBlcmlvZCA9IDE7IC8vIHRoaXMgd2lsbCBiZSBzZXQgYmVmb3JlIHVzZQotICAgIGRvdWJsZSAgbUludmVyc2VTaW5lUGVyaW9kID0gMS4wOwotCi0gICAgaW50MzJfdCBtU3RhdGVGcmFtZUNvdW50ZXJzW05VTV9TVEFURVNdOwotCi0gICAgZG91YmxlICBtUGhhc2VJbmNyZW1lbnQgPSAwLjA7Ci0gICAgZG91YmxlICBtSW5wdXRQaGFzZSA9IDAuMDsKLSAgICBkb3VibGUgIG1PdXRwdXRQaGFzZSA9IDAuMDsKLSAgICBkb3VibGUgIG1NYWduaXR1ZGUgPSAwLjA7Ci0gICAgaW50MzJfdCBtRnJhbWVzQWNjdW11bGF0ZWQgPSAwOwotICAgIGRvdWJsZSAgbVNpbkFjY3VtdWxhdG9yID0gMC4wOwotICAgIGRvdWJsZSAgbUNvc0FjY3VtdWxhdG9yID0gMC4wOwotICAgIGRvdWJsZSAgbU1heEdsaXRjaERlbHRhID0gMC4wOwotICAgIGludDMyX3QgbUdsaXRjaENvdW50ID0gMDsKLSAgICBpbnQzMl90IG1Ob25HbGl0Y2hDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBtR2xpdGNoTGVuZ3RoID0gMDsKLSAgICAvLyBUaGlzIGlzIHVzZWQgZm9yIHByb2Nlc3NpbmcgZXZlcnkgZnJhbWUgc28gd2UgY2FjaGUgaXQgaGVyZS4KLSAgICBkb3VibGUgIG1TY2FsZWRUb2xlcmFuY2UgPSAwLjA7Ci0gICAgaW50ICAgICBtRG93bkNvdW50ZXIgPSBJRExFX0ZSQU1FX0NPVU5UOwotICAgIGludDMyX3QgbUZyYW1lQ291bnRlciA9IDA7Ci0gICAgZG91YmxlICBtT3V0cHV0QW1wbGl0dWRlID0gMC43NTsKLQotICAgIGludDMyX3QgbUZvcmNlR2xpdGNoRHVyYXRpb24gPSAwOyAvLyBpZiA+IDAgdGhlbiBmb3JjZSBhIGdsaXRjaCBmb3IgZGVidWdnaW5nCi0gICAgaW50MzJfdCBtRm9yY2VHbGl0Y2hDb3VudGVyID0gNCAqIDQ4MDAwOyAvLyBjb3VudCBkb3duIGFuZCB0cmlnZ2VyIGF0IHplcm8KLQotICAgIC8vIG1lYXN1cmUgYmFja2dyb3VuZCBub2lzZSBjb250aW51b3VzbHkgYXMgYSBkZXZpYXRpb24gZnJvbSB0aGUgZXhwZWN0ZWQgc2lnbmFsCi0gICAgZG91YmxlICBtU3VtU3F1YXJlU2lnbmFsID0gMC4wOwotICAgIGRvdWJsZSAgbVN1bVNxdWFyZU5vaXNlID0gMC4wOwotICAgIGRvdWJsZSAgbU1lYW5TcXVhcmVTaWduYWwgPSAwLjA7Ci0gICAgZG91YmxlICBtTWVhblNxdWFyZU5vaXNlID0gMC4wOwotCi0gICAgUGVha0RldGVjdG9yICBtUGVha0ZvbGxvd2VyOwotCi0gICAgUHNldWRvUmFuZG9tICBtV2hpdGVOb2lzZTsKLQotICAgIHNpbmVfc3RhdGVfdCAgbVN0YXRlID0gU1RBVEVfSURMRTsKLX07Ci0KLQotI2VuZGlmIC8vQU5BTFlaRVJfR0xJVENIX0FOQUxZWkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvTGF0ZW5jeUFuYWx5emVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL0xhdGVuY3lBbmFseXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA2NzkxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvTGF0ZW5jeUFuYWx5emVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVG9vbHMgZm9yIG1lYXN1cmluZyBsYXRlbmN5IGFuZCBmb3IgZGV0ZWN0aW5nIGdsaXRjaGVzLgotICogVGhlc2UgY2xhc3NlcyBhcmUgcHVyZSBtYXRoIGFuZCBjYW4gYmUgdXNlZCB3aXRoIGFueSBhdWRpbyBzeXN0ZW0uCi0gKi8KLQotI2lmbmRlZiBBTkFMWVpFUl9MQVRFTkNZX0FOQUxZWkVSX0gKLSNkZWZpbmUgQU5BTFlaRVJfTEFURU5DWV9BTkFMWVpFUl9ICi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiUGVha0RldGVjdG9yLmgiCi0jaW5jbHVkZSAiUHNldWRvUmFuZG9tLmgiCi0jaW5jbHVkZSAiUmFuZG9tUHVsc2VHZW5lcmF0b3IuaCIKLQotLy8gVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNvZGUgaXMgaW4gT2JvZS4KLSNpZm5kZWYgQUxPR0QKLSNkZWZpbmUgQUxPR0QgcHJpbnRmCi0jZGVmaW5lIEFMT0dFIHByaW50ZgotI2RlZmluZSBBTE9HVyBwcmludGYKLSNlbmRpZgotCi0jZGVmaW5lIExPT1BCQUNLX1JFU1VMVF9UQUcgICJSRVNVTFQ6ICIKLQotc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ4MDAwOwotc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtNaWxsaXNQZXJTZWNvbmQgICA9IDEwMDA7Ci1zdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heExhdGVuY3lNaWxsaXMgID0gNzAwOyAgLy8gYXJiaXRyYXJ5IGFuZCBnZW5lcm91cwotc3RhdGljIGNvbnN0ZXhwciBkb3VibGUgIGtNaW5pbXVtQ29uZmlkZW5jZSA9IDAuMjsKLQotc3RydWN0IExhdGVuY3lSZXBvcnQgewotICAgIGludDMyX3QgbGF0ZW5jeUluRnJhbWVzID0gMC4wOwotICAgIGRvdWJsZSBjb25maWRlbmNlID0gMC4wOwotCi0gICAgdm9pZCByZXNldCgpIHsKLSAgICAgICAgbGF0ZW5jeUluRnJhbWVzID0gMDsKLSAgICAgICAgY29uZmlkZW5jZSA9IDAuMDsKLSAgICB9Ci19OwotCi0vLyBDYWxjdWxhdGUgYSBub3JtYWxpemVkIGNyb3NzIGNvcnJlbGF0aW9uLgotc3RhdGljIGRvdWJsZSBjYWxjdWxhdGVOb3JtYWxpemVkQ29ycmVsYXRpb24oY29uc3QgZmxvYXQgKmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dTaXplKSB7Ci0gICAgZG91YmxlIGNvcnJlbGF0aW9uID0gMC4wOwotICAgIGRvdWJsZSBzdW1Qcm9kdWN0cyA9IDAuMDsKLSAgICBkb3VibGUgc3VtU3F1YXJlcyA9IDAuMDsKLQotICAgIC8vIENvcnJlbGF0ZSBhIGFnYWluc3QgYi4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICBmbG9hdCBzMSA9IGFbaV07Ci0gICAgICAgIGZsb2F0IHMyID0gYltpXTsKLSAgICAgICAgLy8gVXNlIGEgbm9ybWFsaXplZCBjcm9zcy1jb3JyZWxhdGlvbi4KLSAgICAgICAgc3VtUHJvZHVjdHMgKz0gczEgKiBzMjsKLSAgICAgICAgc3VtU3F1YXJlcyArPSAoKHMxICogczEpICsgKHMyICogczIpKTsKLSAgICB9Ci0KLSAgICBpZiAoc3VtU3F1YXJlcyA+PSAxLjBlLTkpIHsKLSAgICAgICAgY29ycmVsYXRpb24gPSAyLjAgKiBzdW1Qcm9kdWN0cyAvIHN1bVNxdWFyZXM7Ci0gICAgfQotICAgIHJldHVybiBjb3JyZWxhdGlvbjsKLX0KLQotc3RhdGljIGRvdWJsZSBjYWxjdWxhdGVSb290TWVhblNxdWFyZShmbG9hdCAqZGF0YSwgaW50MzJfdCBudW1TYW1wbGVzKSB7Ci0gICAgZG91YmxlIHN1bSA9IDAuMDsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gZGF0YVtpXTsKLSAgICAgICAgc3VtICs9IHNhbXBsZSAqIHNhbXBsZTsKLSAgICB9Ci0gICAgcmV0dXJuIHNxcnQoc3VtIC8gbnVtU2FtcGxlcyk7Ci19Ci0KLS8qKgotICogTW9ub3Bob25pYyByZWNvcmRpbmcgd2l0aCBwcm9jZXNzaW5nLgotICovCi1jbGFzcyBBdWRpb1JlY29yZGluZwotewotcHVibGljOgotCi0gICAgdm9pZCBhbGxvY2F0ZShpbnQgbWF4RnJhbWVzKSB7Ci0gICAgICAgIG1EYXRhID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihtYXhGcmFtZXMpOwotICAgICAgICBtTWF4RnJhbWVzID0gbWF4RnJhbWVzOwotICAgIH0KLQotICAgIC8vIFdyaXRlIFNIT1JUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQzMl90IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKLSAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCi0gICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7Ci0gICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICBtRGF0YVttRnJhbWVDb3VudGVyKytdID0gaW5wdXREYXRhW2kgKiBpbnB1dENoYW5uZWxDb3VudF0gKiAoMS4wZiAvIDMyNzY4KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVtRnJhbWVzOwotICAgIH0KLQotICAgIC8vIFdyaXRlIEZMT0FUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQzMl90IHdyaXRlKGZsb2F0ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7Ci0gICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgotICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewotICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgbURhdGFbbUZyYW1lQ291bnRlcisrXSA9IGlucHV0RGF0YVtpICogaW5wdXRDaGFubmVsQ291bnRdOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudW1GcmFtZXM7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgRkxPQVQgZGF0YSBmcm9tIHRoZSBmaXJzdCBjaGFubmVsLgotICAgIGludDMyX3Qgd3JpdGUoZmxvYXQgc2FtcGxlKSB7Ci0gICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgotICAgICAgICBpZiAobUZyYW1lQ291bnRlciA8IG1NYXhGcmFtZXMpIHsKLSAgICAgICAgICAgIG1EYXRhW21GcmFtZUNvdW50ZXIrK10gPSBzYW1wbGU7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyKCkgewotICAgICAgICBtRnJhbWVDb3VudGVyID0gMDsKLSAgICB9Ci0gICAgaW50MzJfdCBzaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKLSAgICB9Ci0KLSAgICBib29sIGlzRnVsbCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50ZXIgPj0gbU1heEZyYW1lczsKLSAgICB9Ci0KLSAgICBmbG9hdCAqZ2V0RGF0YSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EYXRhLmdldCgpOwotICAgIH0KLQotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQzMl90IHNhbXBsZVJhdGUpIHsKLSAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNxdWFyZSB0aGUgc2FtcGxlcyBzbyB0aGV5IGFyZSBhbGwgcG9zaXRpdmUgYW5kIHNvIHRoZSBwZWFrcyBhcmUgZW1waGFzaXplZC4KLSAgICAgKi8KLSAgICB2b2lkIHNxdWFyZSgpIHsKLSAgICAgICAgZmxvYXQgKnggPSBtRGF0YS5nZXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKLSAgICAgICAgICAgIHhbaV0gKj0geFtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFtcGxpZnkgYSBzaWduYWwgc28gdGhhdCB0aGUgcGVhayBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIHRhcmdldCBmaW5hbCBtYXggdmFsdWUKLSAgICAgKiBAcmV0dXJuIGdhaW4gYXBwbGllZCB0byBzaWduYWwKLSAgICAgKi8KLSAgICBmbG9hdCBub3JtYWxpemUoZmxvYXQgdGFyZ2V0KSB7Ci0gICAgICAgIGZsb2F0IG1heFZhbHVlID0gMS4wZS05ZjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKLSAgICAgICAgICAgIG1heFZhbHVlID0gc3RkOjptYXgobWF4VmFsdWUsIGFicyhtRGF0YVtpXSkpOwotICAgICAgICB9Ci0gICAgICAgIGZsb2F0IGdhaW4gPSB0YXJnZXQgLyBtYXhWYWx1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKLSAgICAgICAgICAgIG1EYXRhW2ldICo9IGdhaW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdhaW47Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBtRGF0YTsKLSAgICBpbnQzMl90ICAgICAgIG1GcmFtZUNvdW50ZXIgPSAwOwotICAgIGludDMyX3QgICAgICAgbU1heEZyYW1lcyA9IDA7Ci0gICAgaW50MzJfdCAgICAgICBtU2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxlUmF0ZTsgLy8gY29tbW9uIGRlZmF1bHQKLX07Ci0KLXN0YXRpYyBpbnQgbWVhc3VyZUxhdGVuY3lGcm9tUHVsc2UoQXVkaW9SZWNvcmRpbmcgJnJlY29yZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZGluZyAmcHVsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVuY3lSZXBvcnQgKnJlcG9ydCkgewotCi0gICAgcmVwb3J0LT5sYXRlbmN5SW5GcmFtZXMgPSAwOwotICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IDAuMDsKLQotICAgIGludCBudW1Db3JyZWxhdGlvbnMgPSByZWNvcmRlZC5zaXplKCkgLSBwdWxzZS5zaXplKCk7Ci0gICAgaWYgKG51bUNvcnJlbGF0aW9ucyA8IDEwKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIHJlY29yZGluZyB0b28gc21hbGwgPSAlZCBmcmFtZXNcbiIsIF9fZnVuY19fLCByZWNvcmRlZC5zaXplKCkpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBjb3JyZWxhdGlvbnM9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4obnVtQ29ycmVsYXRpb25zKTsKLQotICAgIC8vIENvcnJlbGF0ZSBwdWxzZSBhZ2FpbnN0IHRoZSByZWNvcmRlZCBkYXRhLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKLSAgICAgICAgZmxvYXQgY29ycmVsYXRpb24gPSAoZmxvYXQpIGNhbGN1bGF0ZU5vcm1hbGl6ZWRDb3JyZWxhdGlvbigmcmVjb3JkZWQuZ2V0RGF0YSgpW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdWxzZS5nZXREYXRhKClbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVsc2Uuc2l6ZSgpKTsKLSAgICAgICAgY29ycmVsYXRpb25zW2ldID0gY29ycmVsYXRpb247Ci0gICAgfQotCi0gICAgLy8gRmluZCBoaWdoZXN0IHBlYWsgaW4gY29ycmVsYXRpb24gYXJyYXkuCi0gICAgZmxvYXQgcGVha0NvcnJlbGF0aW9uID0gMC4wOwotICAgIGludCBwZWFrSW5kZXggPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvcnJlbGF0aW9uczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHZhbHVlID0gYWJzKGNvcnJlbGF0aW9uc1tpXSk7Ci0gICAgICAgIGlmICh2YWx1ZSA+IHBlYWtDb3JyZWxhdGlvbikgewotICAgICAgICAgICAgcGVha0NvcnJlbGF0aW9uID0gdmFsdWU7Ci0gICAgICAgICAgICBwZWFrSW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwZWFrSW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG5vIHNpZ25hbCBmb3IgY29ycmVsYXRpb25cbiIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIC0yOwotICAgIH0KLQotICAgIHJlcG9ydC0+bGF0ZW5jeUluRnJhbWVzID0gcGVha0luZGV4OwotICAgIHJlcG9ydC0+Y29uZmlkZW5jZSA9IHBlYWtDb3JyZWxhdGlvbjsKLQotICAgIHJldHVybiAwOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWNsYXNzIExvb3BiYWNrUHJvY2Vzc29yIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5Mb29wYmFja1Byb2Nlc3NvcigpID0gZGVmYXVsdDsKLQotICAgIGVudW0gcmVzdWx0X2NvZGUgewotICAgICAgICBSRVNVTFRfT0sgPSAwLAotICAgICAgICBFUlJPUl9OT0lTWSA9IC05OSwKLSAgICAgICAgRVJST1JfVk9MVU1FX1RPT19MT1csCi0gICAgICAgIEVSUk9SX1ZPTFVNRV9UT09fSElHSCwKLSAgICAgICAgRVJST1JfQ09ORklERU5DRSwKLSAgICAgICAgRVJST1JfSU5WQUxJRF9TVEFURSwKLSAgICAgICAgRVJST1JfR0xJVENIRVMsCi0gICAgICAgIEVSUk9SX05PX0xPQ0sKLSAgICB9OwotCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVUb1Rlc3QoKSB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgewotICAgICAgICBtUmVzdWx0ID0gMDsKLSAgICAgICAgbVJlc2V0Q291bnQrKzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHJlc3VsdF9jb2RlIHByb2Nlc3NJbnB1dEZyYW1lKGZsb2F0ICpmcmFtZURhdGEsIGludCBjaGFubmVsQ291bnQpID0gMDsKLSAgICB2aXJ0dWFsIHJlc3VsdF9jb2RlIHByb2Nlc3NPdXRwdXRGcmFtZShmbG9hdCAqZnJhbWVEYXRhLCBpbnQgY2hhbm5lbENvdW50KSA9IDA7Ci0KLSAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtSW5wdXRGcmFtZXMsCi0gICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtT3V0cHV0RnJhbWVzKSB7Ci0gICAgICAgIGludCBudW1Cb3RoID0gc3RkOjptaW4obnVtSW5wdXRGcmFtZXMsIG51bU91dHB1dEZyYW1lcyk7Ci0gICAgICAgIC8vIFByb2Nlc3Mgb25lIGZyYW1lIGF0IGEgdGltZS4KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Cb3RoOyBpKyspIHsKLSAgICAgICAgICAgIHByb2Nlc3NJbnB1dEZyYW1lKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQpOwotICAgICAgICAgICAgaW5wdXREYXRhICs9IGlucHV0Q2hhbm5lbENvdW50OwotICAgICAgICAgICAgcHJvY2Vzc091dHB1dEZyYW1lKG91dHB1dERhdGEsIG91dHB1dENoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICBvdXRwdXREYXRhICs9IG91dHB1dENoYW5uZWxDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBJZiB0aGVyZSBpcyBtb3JlIGlucHV0IHRoYW4gb3V0cHV0LgotICAgICAgICBmb3IgKGludCBpID0gbnVtQm90aDsgaSA8IG51bUlucHV0RnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIHByb2Nlc3NJbnB1dEZyYW1lKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQpOwotICAgICAgICAgICAgaW5wdXREYXRhICs9IGlucHV0Q2hhbm5lbENvdW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgb3V0cHV0IHRoYW4gaW5wdXQuCi0gICAgICAgIGZvciAoaW50IGkgPSBudW1Cb3RoOyBpIDwgbnVtT3V0cHV0RnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIHByb2Nlc3NPdXRwdXRGcmFtZShvdXRwdXREYXRhLCBvdXRwdXRDaGFubmVsQ291bnQpOwotICAgICAgICAgICAgb3V0cHV0RGF0YSArPSBvdXRwdXRDaGFubmVsQ291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGFuYWx5emUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcHJpbnRTdGF0dXMoKSB7fTsKLQotICAgIGludDMyX3QgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gbVJlc3VsdDsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFJlc3VsdChpbnQzMl90IHJlc3VsdCkgewotICAgICAgICBtUmVzdWx0ID0gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0RvbmUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBzYXZlKGNvbnN0IGNoYXIgKmZpbGVOYW1lKSB7Ci0gICAgICAgICh2b2lkKSBmaWxlTmFtZTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IGxvYWQoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKLSAgICAgICAgKHZvaWQpIGZpbGVOYW1lOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSB7Ci0gICAgICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlUmF0ZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldFJlc2V0Q291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVzZXRDb3VudDsKLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIHdoZW4gbm90IGVub3VnaCBpbnB1dCBmcmFtZXMgY291bGQgYmUgcmVhZCBhZnRlciBzeW5jaHJvbml6YXRpb24uCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIG9uSW5zdWZmaWNpZW50UmVhZCgpIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBpbnQzMl90ICAgbVJlc2V0Q291bnQgPSAwOwotCi1wcml2YXRlOgotICAgIGludDMyX3QgbVNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBtUmVzdWx0ID0gMDsKLX07Ci0KLWNsYXNzIExhdGVuY3lBbmFseXplciA6IHB1YmxpYyBMb29wYmFja1Byb2Nlc3NvciB7Ci1wdWJsaWM6Ci0KLSAgICBMYXRlbmN5QW5hbHl6ZXIoKSA6IExvb3BiYWNrUHJvY2Vzc29yKCkge30KLSAgICB2aXJ0dWFsIH5MYXRlbmN5QW5hbHl6ZXIoKSA9IGRlZmF1bHQ7Ci0KLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0UHJvZ3Jlc3MoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCBnZXRTdGF0ZSgpID0gMDsKLQotICAgIC8vIEByZXR1cm4gbGF0ZW5jeSBpbiBmcmFtZXMKLSAgICB2aXJ0dWFsIGludDMyX3QgZ2V0TWVhc3VyZWRMYXRlbmN5KCkgPSAwOwotCi0gICAgdmlydHVhbCBkb3VibGUgZ2V0TWVhc3VyZWRDb25maWRlbmNlKCkgPSAwOwotCi0gICAgdmlydHVhbCBkb3VibGUgZ2V0QmFja2dyb3VuZFJNUygpID0gMDsKLQotICAgIHZpcnR1YWwgZG91YmxlIGdldFNpZ25hbFJNUygpID0gMDsKLQotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vKioKLSAqIE1lYXN1cmUgbGF0ZW5jeSBnaXZlbiBhIGxvb3BiYWNrIHN0cmVhbSBkYXRhLgotICogVXNlIGFuIGVuY29kZWQgYml0IHRyYWluIGFzIHRoZSBzb3VuZCBzb3VyY2UgYmVjYXVzZSBpdAotICogaGFzIGFuIHVuYW1iaWd1b3VzIGNvcnJlbGF0aW9uIHZhbHVlLgotICogVXNlcyBhIHN0YXRlIG1hY2hpbmUgdG8gY3ljbGUgdGhyb3VnaCB2YXJpb3VzIHN0YWdlcy4KLSAqCi0gKi8KLWNsYXNzIFB1bHNlTGF0ZW5jeUFuYWx5emVyIDogcHVibGljIExhdGVuY3lBbmFseXplciB7Ci1wdWJsaWM6Ci0KLSAgICBQdWxzZUxhdGVuY3lBbmFseXplcigpIDogTGF0ZW5jeUFuYWx5emVyKCkgewotICAgICAgICBpbnQzMl90IG1heExhdGVuY3lGcmFtZXMgPSBnZXRTYW1wbGVSYXRlKCkgKiBrTWF4TGF0ZW5jeU1pbGxpcyAvIGtNaWxsaXNQZXJTZWNvbmQ7Ci0gICAgICAgIGludDMyX3QgbnVtUHVsc2VCaXRzID0gZ2V0U2FtcGxlUmF0ZSgpICoga1B1bHNlTGVuZ3RoTWlsbGlzCi0gICAgICAgICAgICAgICAgLyAoa0ZyYW1lc1BlckVuY29kZWRCaXQgKiBrTWlsbGlzUGVyU2Vjb25kKTsKLSAgICAgICAgaW50MzJfdCAgcHVsc2VMZW5ndGggPSBudW1QdWxzZUJpdHMgKiBrRnJhbWVzUGVyRW5jb2RlZEJpdDsKLSAgICAgICAgbUZyYW1lc1RvUmVjb3JkID0gcHVsc2VMZW5ndGggKyBtYXhMYXRlbmN5RnJhbWVzOwotICAgICAgICBtQXVkaW9SZWNvcmRpbmcuYWxsb2NhdGUobUZyYW1lc1RvUmVjb3JkKTsKLSAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLnNldFNhbXBsZVJhdGUoZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgZ2VuZXJhdGVSYW5kb21QdWxzZShwdWxzZUxlbmd0aCk7Ci0gICAgfQotCi0gICAgdm9pZCBnZW5lcmF0ZVJhbmRvbVB1bHNlKGludDMyX3QgcHVsc2VMZW5ndGgpIHsKLSAgICAgICAgbVB1bHNlLmFsbG9jYXRlKHB1bHNlTGVuZ3RoKTsKLSAgICAgICAgUmFuZG9tUHVsc2VHZW5lcmF0b3IgcHVsc2VyKGtGcmFtZXNQZXJFbmNvZGVkQml0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdWxzZUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBtUHVsc2Uud3JpdGUocHVsc2VyLm5leHRGbG9hdCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBnZXRTdGF0ZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldFNhbXBsZVJhdGUoaW50MzJfdCBzYW1wbGVSYXRlKSBvdmVycmlkZSB7Ci0gICAgICAgIExvb3BiYWNrUHJvY2Vzc29yOjpzZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwotICAgICAgICBtQXVkaW9SZWNvcmRpbmcuc2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgewotICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6cmVzZXQoKTsKLSAgICAgICAgbURvd25Db3VudGVyID0gZ2V0U2FtcGxlUmF0ZSgpIC8gMjsKLSAgICAgICAgbUxvb3BDb3VudGVyID0gMDsKLQotICAgICAgICBtUHVsc2VDdXJzb3IgPSAwOwotICAgICAgICBtQmFja2dyb3VuZFN1bVNxdWFyZSA9IDAuMGY7Ci0gICAgICAgIG1CYWNrZ3JvdW5kU3VtQ291bnQgPSAwOwotICAgICAgICBtQmFja2dyb3VuZFJNUyA9IDAuMGY7Ci0gICAgICAgIG1TaWduYWxSTVMgPSAwLjBmOwotCi0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX01FQVNVUkVfQkFDS0dST1VORDsKLSAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLmNsZWFyKCk7Ci0gICAgICAgIG1MYXRlbmN5UmVwb3J0LnJlc2V0KCk7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNFbm91Z2hEYXRhKCkgewotICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkaW5nLmlzRnVsbCgpOwotICAgIH0KLQotICAgIGJvb2wgaXNEb25lKCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0RPTkU7Ci0gICAgfQotCi0gICAgaW50MzJfdCBnZXRQcm9ncmVzcygpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1JlY29yZGluZy5zaXplKCk7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgYW5hbHl6ZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVwb3J0OwotICAgICAgICByZXBvcnQgPDwgIlB1bHNlTGF0ZW5jeUFuYWx5emVyIC0tLS0tLS0tLS0tLS0tLVxuIjsKLSAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICAgICAgPSAiCi0gICAgICAgICAgICAgICAgPDwgc3RkOjpzZXR3KDgpIDw8IG1TdGF0ZSA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZS5uYW1lICAgICAgICA9ICIKLSAgICAgICAgICAgICAgICA8PCBjb252ZXJ0U3RhdGVUb1RleHQobVN0YXRlKSA8PCAiXG4iOwotICAgICAgICByZXBvcnQgPDwgTE9PUEJBQ0tfUkVTVUxUX1RBRyAiYmFja2dyb3VuZC5ybXMgICAgICAgICA9ICIKLSAgICAgICAgICAgICAgICA8PCBzdGQ6OnNldHcoOCkgPDwgbUJhY2tncm91bmRSTVMgPDwgIlxuIjsKLQotICAgICAgICBpbnQzMl90IG5ld1Jlc3VsdCA9IFJFU1VMVF9PSzsKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9HT1RfREFUQSkgewotICAgICAgICAgICAgcmVwb3J0IDw8ICJXQVJOSU5HIC0gQmFkIHN0YXRlLiBDaGVjayB2b2x1bWUgb24gZGV2aWNlLlxuIjsKLSAgICAgICAgICAgIC8vIHNldFJlc3VsdChFUlJPUl9JTlZBTElEX1NUQVRFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsb2F0IGdhaW4gPSBtQXVkaW9SZWNvcmRpbmcubm9ybWFsaXplKDEuMGYpOwotICAgICAgICAgICAgbWVhc3VyZUxhdGVuY3lGcm9tUHVsc2UobUF1ZGlvUmVjb3JkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVB1bHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MYXRlbmN5UmVwb3J0KTsKLQotICAgICAgICAgICAgaWYgKG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UgPCBrTWluaW11bUNvbmZpZGVuY2UpIHsKLSAgICAgICAgICAgICAgICByZXBvcnQgPDwgIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ISI7Ci0gICAgICAgICAgICAgICAgbmV3UmVzdWx0ID0gRVJST1JfQ09ORklERU5DRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNpZ25hbFJNUyA9IGNhbGN1bGF0ZVJvb3RNZWFuU3F1YXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgJm1BdWRpb1JlY29yZGluZy5nZXREYXRhKClbbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzXSwgbVB1bHNlLnNpemUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnYWluOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNaWxsaXMgPSBrTWlsbGlzUGVyU2Vjb25kICogKGRvdWJsZSkgbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kuZnJhbWVzICAgICAgICAgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgICAgIDw8IG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyA8PCAiXG4iOwotICAgICAgICAgICAgcmVwb3J0IDw8IExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kubXNlYyAgICAgICAgICAgPSAiIDw8IHN0ZDo6c2V0dyg4KQotICAgICAgICAgICAgICAgICAgIDw8IGxhdGVuY3lNaWxsaXMgPDwgIlxuIjsKLSAgICAgICAgICAgIHJlcG9ydCA8PCBMT09QQkFDS19SRVNVTFRfVEFHICJsYXRlbmN5LmNvbmZpZGVuY2UgICAgID0gIiA8PCBzdGQ6OnNldHcoOCkKLSAgICAgICAgICAgICAgICAgICA8PCBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlIDw8ICJcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlID0gU1RBVEVfRE9ORTsKLSAgICAgICAgaWYgKGdldFJlc3VsdCgpID09IFJFU1VMVF9PSykgewotICAgICAgICAgICAgc2V0UmVzdWx0KG5ld1Jlc3VsdCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVwb3J0LnN0cigpOwotICAgIH0KLQotICAgIGludDMyX3QgZ2V0TWVhc3VyZWRMYXRlbmN5KCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbUxhdGVuY3lSZXBvcnQubGF0ZW5jeUluRnJhbWVzOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRNZWFzdXJlZENvbmZpZGVuY2UoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlOwotICAgIH0KLQotICAgIGRvdWJsZSBnZXRCYWNrZ3JvdW5kUk1TKCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbUJhY2tncm91bmRSTVM7Ci0gICAgfQotCi0gICAgZG91YmxlIGdldFNpZ25hbFJNUygpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIG1TaWduYWxSTVM7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFN0YXR1cygpIG92ZXJyaWRlIHsKLSAgICAgICAgQUxPR0QoInN0ID0gJWQiLCBtU3RhdGUpOwotICAgIH0KLQotICAgIHJlc3VsdF9jb2RlIHByb2Nlc3NJbnB1dEZyYW1lKGZsb2F0ICpmcmFtZURhdGEsIGludCBjaGFubmVsQ291bnQpIG92ZXJyaWRlIHsKLSAgICAgICAgZWNob19zdGF0ZSBuZXh0U3RhdGUgPSBtU3RhdGU7Ci0gICAgICAgIG1Mb29wQ291bnRlcisrOwotCi0gICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX01FQVNVUkVfQkFDS0dST1VORDoKLSAgICAgICAgICAgICAgICAvLyBNZWFzdXJlIGJhY2tncm91bmQgUk1TIG9uIGNoYW5uZWwgMAotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kU3VtU3F1YXJlICs9IGZyYW1lRGF0YVswXSAqIGZyYW1lRGF0YVswXTsKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZFN1bUNvdW50Kys7Ci0gICAgICAgICAgICAgICAgbURvd25Db3VudGVyLS07Ci0gICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kUk1TID0gc3FydGYobUJhY2tncm91bmRTdW1TcXVhcmUgLyBtQmFja2dyb3VuZFN1bUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlID0gU1RBVEVfSU5fUFVMU0U7Ci0gICAgICAgICAgICAgICAgICAgIG1QdWxzZUN1cnNvciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX0lOX1BVTFNFOgotICAgICAgICAgICAgICAgIC8vIFJlY29yZCBpbnB1dCB1bnRpbCB0aGUgbUF1ZGlvUmVjb3JkaW5nIGlzIGZ1bGwuCi0gICAgICAgICAgICAgICAgbUF1ZGlvUmVjb3JkaW5nLndyaXRlKGZyYW1lRGF0YSwgY2hhbm5lbENvdW50LCAxKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFzRW5vdWdoRGF0YSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX0dPVF9EQVRBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTVEFURV9HT1RfREFUQToKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBuZXh0U3RhdGU7Ci0gICAgICAgIHJldHVybiBSRVNVTFRfT0s7Ci0gICAgfQotCi0gICAgcmVzdWx0X2NvZGUgcHJvY2Vzc091dHB1dEZyYW1lKGZsb2F0ICpmcmFtZURhdGEsIGludCBjaGFubmVsQ291bnQpIG92ZXJyaWRlIHsKLSAgICAgICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSU5fUFVMU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QdWxzZUN1cnNvciA8IG1QdWxzZS5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgcHVsc2VTYW1wbGUgPSBtUHVsc2UuZ2V0RGF0YSgpW21QdWxzZUN1cnNvcisrXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFubmVsQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEYXRhW2ldID0gcHVsc2VTYW1wbGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYW5uZWxDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURhdGFbaV0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNUQVRFX01FQVNVUkVfQkFDS0dST1VORDoKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfR09UX0RBVEE6Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0RPTkU6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVEYXRhW2ldID0gMC4wZjsgLy8gc2lsZW5jZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBSRVNVTFRfT0s7Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgZW51bSBlY2hvX3N0YXRlIHsKLSAgICAgICAgU1RBVEVfTUVBU1VSRV9CQUNLR1JPVU5ELAotICAgICAgICBTVEFURV9JTl9QVUxTRSwKLSAgICAgICAgU1RBVEVfR09UX0RBVEEsIC8vIG11c3QgbWF0Y2ggUm91bmRUcmlwTGF0ZW5jeUFjdGl2aXR5LmphdmEKLSAgICAgICAgU1RBVEVfRE9ORSwKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciAqY29udmVydFN0YXRlVG9UZXh0KGVjaG9fc3RhdGUgc3RhdGUpIHsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9NRUFTVVJFX0JBQ0tHUk9VTkQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJTklUIjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSU5fUFVMU0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJQVUxTRSI7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0dPVF9EQVRBOgotICAgICAgICAgICAgICAgIHJldHVybiAiR09UX0RBVEEiOwotICAgICAgICAgICAgY2FzZSBTVEFURV9ET05FOgotICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORSI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKLSAgICB9Ci0KLSAgICBpbnQzMl90ICAgICAgICAgbURvd25Db3VudGVyID0gNTAwOwotICAgIGludDMyX3QgICAgICAgICBtTG9vcENvdW50ZXIgPSAwOwotICAgIGVjaG9fc3RhdGUgICAgICBtU3RhdGUgPSBTVEFURV9NRUFTVVJFX0JBQ0tHUk9VTkQ7Ci0KLSAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0ZyYW1lc1BlckVuY29kZWRCaXQgPSA4OyAvLyBtdWx0aXBsZSBvZiAyCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtQdWxzZUxlbmd0aE1pbGxpcyA9IDUwMDsKLQotICAgIEF1ZGlvUmVjb3JkaW5nICAgICBtUHVsc2U7Ci0gICAgaW50MzJfdCAgICAgICAgICAgIG1QdWxzZUN1cnNvciA9IDA7Ci0KLSAgICBkb3VibGUgICAgICAgICAgICAgbUJhY2tncm91bmRTdW1TcXVhcmUgPSAwLjA7Ci0gICAgaW50MzJfdCAgICAgICAgICAgIG1CYWNrZ3JvdW5kU3VtQ291bnQgPSAwOwotICAgIGRvdWJsZSAgICAgICAgICAgICBtQmFja2dyb3VuZFJNUyA9IDAuMDsKLSAgICBkb3VibGUgICAgICAgICAgICAgbVNpZ25hbFJNUyA9IDAuMDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgbUZyYW1lc1RvUmVjb3JkID0gMDsKLQotICAgIEF1ZGlvUmVjb3JkaW5nICAgICBtQXVkaW9SZWNvcmRpbmc7IC8vIGNvbnRhaW5zIG9ubHkgdGhlIGlucHV0IGFmdGVyIHN0YXJ0aW5nIHRoZSBwdWxzZQotICAgIExhdGVuY3lSZXBvcnQgICAgICBtTGF0ZW5jeVJlcG9ydDsKLX07Ci0KLSNlbmRpZiAvLyBBTkFMWVpFUl9MQVRFTkNZX0FOQUxZWkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvTWFuY2hlc3RlckVuY29kZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvTWFuY2hlc3RlckVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0YmQ1Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL01hbmNoZXN0ZXJFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5BTFlaRVJfTUFOQ0hFU1RFUl9FTkNPREVSX0gKLSNkZWZpbmUgQU5BTFlaRVJfTUFOQ0hFU1RFUl9FTkNPREVSX0gKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLS8qKgotICogRW5jb2RlIGJ5dGVzIHVzaW5nIE1hbmNoZXN0ZXIgQ29kaW5nIHNjaGVtZS4KLSAqCi0gKiBNYW5jaGVzdGVyIENvZGUgaXMgc2VsZiBjbG9ja2luZy4KLSAqIFRoZXJlIGlzIGEgdHJhbnNpdGlvbiBpbiB0aGUgbWlkZGxlIG9mIGV2ZXJ5IGJpdC4KLSAqIFplcm8gaXMgaGlnaCB0aGVuIGxvdy4KLSAqIE9uZSBpcyBsb3cgdGhlbiBoaWdoLgotICoKLSAqIFRoaXMgYXZvaWRzIGhhdmluZyBsb25nIERDIHNlY3Rpb25zIHRoYXQgd291bGQgZHJvb3Agd2hlbgotICogcGFzc2VkIHRob3VnaCBhbmFsb2cgY2lyY3VpdHMgd2l0aCBBQyBjb3VwbGluZy4KLSAqCi0gKiBJRUVFIDgwMi4zIGNvbXBhdGlibGUuCi0gKi8KLQotY2xhc3MgTWFuY2hlc3RlckVuY29kZXIgewotcHVibGljOgotICAgIE1hbmNoZXN0ZXJFbmNvZGVyKGludCBzYW1wbGVzUGVyUHVsc2UpCi0gICAgICAgICAgICA6IG1TYW1wbGVzUGVyUHVsc2Uoc2FtcGxlc1BlclB1bHNlKQotICAgICAgICAgICAgLCBtU2FtcGxlc1BlclB1bHNlSGFsZihzYW1wbGVzUGVyUHVsc2UgLyAyKQotICAgICAgICAgICAgLCBtQ3Vyc29yKHNhbXBsZXNQZXJQdWxzZSkgewotICAgIH0KLQotICAgIHZpcnR1YWwgfk1hbmNoZXN0ZXJFbmNvZGVyKCkgPSBkZWZhdWx0OwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBuZXh0IGJ5dGUgaXMgbmVlZGVkLgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHVpbnQ4X3Qgb25OZXh0Qnl0ZSgpID0gMDsKLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlIHRoZSBuZXh0IGZsb2F0aW5nIHBvaW50IHNhbXBsZS4KLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgdmlydHVhbCBmbG9hdCBuZXh0RmxvYXQoKSB7Ci0gICAgICAgIGFkdmFuY2VTYW1wbGUoKTsKLSAgICAgICAgaWYgKG1DdXJyZW50Qml0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1DdXJzb3IgPCBtU2FtcGxlc1BlclB1bHNlSGFsZikgPyAtMS4wZiA6IDEuMGY7IC8vIG9uZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtQ3Vyc29yIDwgbVNhbXBsZXNQZXJQdWxzZUhhbGYpID8gMS4wZiA6IC0xLjBmOyAvLyB6ZXJvCi0gICAgICAgIH0KLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBuZXcgYml0IGlzIHJlYWR5IHRvIGJlIGVuY29kZWQuCi0gICAgICogSXQgY2FuIGJlIHVzZWQgdG8gcHJlcGFyZSB0aGUgZW5jb2RlZCBzYW1wbGVzLgotICAgICAqIEBwYXJhbSBjdXJyZW50Ci0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIG9uTmV4dEJpdChib29sIC8qIGN1cnJlbnQgKi8pIHt9OwotCi0gICAgdm9pZCBhZHZhbmNlU2FtcGxlKCkgewotICAgICAgICAvLyBBcmUgd2UgcmVhZHkgZm9yIGEgbmV3IGJpdD8KLSAgICAgICAgaWYgKCsrbUN1cnNvciA+PSBtU2FtcGxlc1BlclB1bHNlKSB7Ci0gICAgICAgICAgICBtQ3Vyc29yID0gMDsKLSAgICAgICAgICAgIGlmIChtQml0c0xlZnQgPT0gMCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50Qnl0ZSA9IG9uTmV4dEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBtQml0c0xlZnQgPSA4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLS1tQml0c0xlZnQ7Ci0gICAgICAgICAgICBtQ3VycmVudEJpdCA9IChtQ3VycmVudEJ5dGUgPj4gbUJpdHNMZWZ0KSAmIDE7Ci0gICAgICAgICAgICBvbk5leHRCaXQobUN1cnJlbnRCaXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYm9vbCBnZXRDdXJyZW50Qml0KCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRCaXQ7Ci0gICAgfQotCi0gICAgY29uc3QgaW50IG1TYW1wbGVzUGVyUHVsc2U7Ci0gICAgY29uc3QgaW50IG1TYW1wbGVzUGVyUHVsc2VIYWxmOwotICAgIGludCAgICAgICBtQ3Vyc29yOwotICAgIGludCAgICAgICBtQml0c0xlZnQgPSAwOwotICAgIHVpbnQ4X3QgICBtQ3VycmVudEJ5dGUgPSAwOwotICAgIGJvb2wgICAgICBtQ3VycmVudEJpdCA9IGZhbHNlOwotfTsKLSNlbmRpZiAvL0FOQUxZWkVSX01BTkNIRVNURVJfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1BlYWtEZXRlY3Rvci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9QZWFrRGV0ZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzYjRlNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1BlYWtEZXRlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkFMWVpFUl9QRUFLX0RFVEVDVE9SX0gKLSNkZWZpbmUgQU5BTFlaRVJfUEVBS19ERVRFQ1RPUl9ICi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLS8qKgotICogTWVhc3VyZSBhIHBlYWsgZW52ZWxvcGUgYnkgcmlzaW5nIHdpdGggdGhlIHBlYWtzLAotICogYW5kIGRlY2F5aW5nIGV4cG9uZW50aWFsbHkgYWZ0ZXIgZWFjaCBwZWFrLgotICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBpbnB1dCBzaWduYWwgaXMgdXNlZC4KLSAqLwotY2xhc3MgUGVha0RldGVjdG9yIHsKLXB1YmxpYzoKLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1MZXZlbCA9IDAuMDsKLSAgICB9Ci0KLSAgICBkb3VibGUgcHJvY2Vzcyhkb3VibGUgaW5wdXQpIHsKLSAgICAgICAgbUxldmVsICo9IG1EZWNheTsgLy8gZXhwb25lbnRpYWwgZGVjYXkKLSAgICAgICAgaW5wdXQgPSBmYWJzKGlucHV0KTsKLSAgICAgICAgLy8gbmV2ZXIgZmFsbCBiZWxvdyB0aGUgaW5wdXQgc2lnbmFsCi0gICAgICAgIGlmIChpbnB1dCA+IG1MZXZlbCkgewotICAgICAgICAgICAgbUxldmVsID0gaW5wdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1MZXZlbDsKLSAgICB9Ci0KLSAgICBkb3VibGUgZ2V0TGV2ZWwoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTGV2ZWw7Ci0gICAgfQotCi0gICAgZG91YmxlIGdldERlY2F5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURlY2F5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11bHRpcGx5IHRoZSBsZXZlbCBieSB0aGlzIGFtb3VudCBvbiBldmVyeSBpdGVyYXRpb24uCi0gICAgICogVGhpcyBwcm92aWRlcyBhbiBleHBvbmVudGlhbCBkZWNheSBjdXJ2ZS4KLSAgICAgKiBBIHZhbHVlIGp1c3QgdW5kZXIgMS4wIGlzIGJlc3QsIGZvciBleGFtcGxlLCAwLjk5OwotICAgICAqIEBwYXJhbSBkZWNheSBzY2FsZSBsZXZlbCBmb3IgZWFjaCBpbnB1dAotICAgICAqLwotICAgIHZvaWQgc2V0RGVjYXkoZG91YmxlIGRlY2F5KSB7Ci0gICAgICAgIG1EZWNheSA9IGRlY2F5OwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3RleHByIGRvdWJsZSBrRGVmYXVsdERlY2F5ID0gMC45OWY7Ci0KLSAgICBkb3VibGUgbUxldmVsID0gMC4wOwotICAgIGRvdWJsZSBtRGVjYXkgPSBrRGVmYXVsdERlY2F5OwotfTsKLSNlbmRpZiAvL0FOQUxZWkVSX1BFQUtfREVURUNUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9Qc2V1ZG9SYW5kb20uaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUHNldWRvUmFuZG9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDkzOGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9Qc2V1ZG9SYW5kb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgQU5BTFlaRVJfUFNFVURPUkFORE9NX0gKLSNkZWZpbmUgQU5BTFlaRVJfUFNFVURPUkFORE9NX0gKLQotI2luY2x1ZGUgPGNjdHlwZT4KLQotY2xhc3MgUHNldWRvUmFuZG9tIHsKLXB1YmxpYzoKLSAgICBQc2V1ZG9SYW5kb20oaW50NjRfdCBzZWVkID0gOTk4ODc3NjYpCi0gICAgICAgICAgICA6ICAgIG1TZWVkKHNlZWQpCi0gICAge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgcmFuZG9tIGRvdWJsZSBmcm9tIC0xLjAgdG8gMS4wCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGZyb20gLTEuMCB0byAxLjAKLSAgICAgKi8KLSAgICBkb3VibGUgbmV4dFJhbmRvbURvdWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG5leHRSYW5kb21JbnRlZ2VyKCkgKiAoMC41IC8gKCgoaW50MzJfdCkxKSA8PCAzMCkpOwotICAgIH0KLQotICAgIC8qKiBDYWxjdWxhdGUgcmFuZG9tIDMyIGJpdCBudW1iZXIgdXNpbmcgbGluZWFyLWNvbmdydWVudGlhbCBtZXRob2QKLSAgICAgKiB3aXRoIGtub3duIHJlYWwtdGltZSBwZXJmb3JtYW5jZS4KLSAgICAgKi8KLSAgICBpbnQzMl90IG5leHRSYW5kb21JbnRlZ2VyKCkgewotI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX211bF9vdmVyZmxvdykgJiYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYWRkX292ZXJmbG93KQotICAgICAgICBpbnQ2NF90IHByb2Q7Ci0gICAgICAgIC8vIFVzZSB2YWx1ZXMgZm9yIDY0LWJpdCBzZXF1ZW5jZSBmcm9tIE1NSVggYnkgRG9uYWxkIEtudXRoLgotICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1TZWVkLCAoaW50NjRfdCk2MzY0MTM2MjIzODQ2NzkzMDA1LCAmcHJvZCk7Ci0gICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocHJvZCwgKGludDY0X3QpMTQ0MjY5NTA0MDg4ODk2MzQwNywgJm1TZWVkKTsKLSNlbHNlCi0gICAgICAgIG1TZWVkID0gKG1TZWVkICogKGludDY0X3QpNjM2NDEzNjIyMzg0Njc5MzAwNSkgKyAoaW50NjRfdCkxNDQyNjk1MDQwODg4OTYzNDA3OwotI2VuZGlmCi0gICAgICAgIHJldHVybiAoaW50MzJfdCkgKG1TZWVkID4+IDMyKTsgLy8gVGhlIGhpZ2hlciBiaXRzIGhhdmUgYSBsb25nZXIgc2VxdWVuY2UuCi0gICAgfQotCi1wcml2YXRlOgotICAgIGludDY0X3QgbVNlZWQ7Ci19OwotCi0jZW5kaWYgLy9BTkFMWVpFUl9QU0VVRE9SQU5ET01fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9SYW5kb21QdWxzZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9hbmFseXplci9SYW5kb21QdWxzZUdlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzAwNTBiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUmFuZG9tUHVsc2VHZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5BTFlaRVJfUkFORE9NX1BVTFNFX0dFTkVSQVRPUl9ICi0jZGVmaW5lIEFOQUxZWkVSX1JBTkRPTV9QVUxTRV9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiUm91bmRlZE1hbmNoZXN0ZXJFbmNvZGVyLmgiCi0KLS8qKgotICogRW5jb2RlIHJhbmRvbSBvbmVzIGFuZCB6ZXJvcyB1c2luZyBNYW5jaGVzdGVyIENvZGUgcGVyIElFRUUgODAyLjMuCi0gKi8KLWNsYXNzIFJhbmRvbVB1bHNlR2VuZXJhdG9yIDogcHVibGljIFJvdW5kZWRNYW5jaGVzdGVyRW5jb2RlciB7Ci1wdWJsaWM6Ci0gICAgUmFuZG9tUHVsc2VHZW5lcmF0b3IoaW50IHNhbXBsZXNQZXJQdWxzZSkKLSAgICA6IFJvdW5kZWRNYW5jaGVzdGVyRW5jb2RlcihzYW1wbGVzUGVyUHVsc2UpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5SYW5kb21QdWxzZUdlbmVyYXRvcigpID0gZGVmYXVsdDsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbmV4dCBieXRlIGlzIG5lZWRlZC4KLSAgICAgKiBAcmV0dXJuIHJhbmRvbSBieXRlCi0gICAgICovCi0gICAgdWludDhfdCBvbk5leHRCeXRlKCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4ocmFuZCgpKTsKLSAgICB9Ci19OwotCi0jZW5kaWYgLy9BTkFMWVpFUl9SQU5ET01fUFVMU0VfR0VORVJBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUm91bmRlZE1hbmNoZXN0ZXJFbmNvZGVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2FuYWx5emVyL1JvdW5kZWRNYW5jaGVzdGVyRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmViYTg0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvYW5hbHl6ZXIvUm91bmRlZE1hbmNoZXN0ZXJFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5BTFlaRVJfUk9VTkRFRF9NQU5DSEVTVEVSX0VOQ09ERVJfSAotI2RlZmluZSBBTkFMWVpFUl9ST1VOREVEX01BTkNIRVNURVJfRU5DT0RFUl9ICi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAiTWFuY2hlc3RlckVuY29kZXIuaCIKLQotLyoqCi0gKiBFbmNvZGUgYnl0ZXMgdXNpbmcgTWFuY2hlc3RlciBDb2RlLgotICogUm91bmQgdGhlIGVkZ2VzIHVzaW5nIGEgaGFsZiBjb3NpbmUgdG8gcmVkdWNlIHJpbmdpbmcgY2F1c2VkIGJ5IGEgaGFyZCBlZGdlLgotICovCi0KLWNsYXNzIFJvdW5kZWRNYW5jaGVzdGVyRW5jb2RlciA6IHB1YmxpYyBNYW5jaGVzdGVyRW5jb2RlciB7Ci1wdWJsaWM6Ci0gICAgUm91bmRlZE1hbmNoZXN0ZXJFbmNvZGVyKGludCBzYW1wbGVzUGVyUHVsc2UpCi0gICAgICAgICAgICA6IE1hbmNoZXN0ZXJFbmNvZGVyKHNhbXBsZXNQZXJQdWxzZSkgewotICAgICAgICBpbnQgcmFtcFNpemUgPSBzYW1wbGVzUGVyUHVsc2UgLyA0OwotICAgICAgICBtWmVyb0FmdGVyWmVybyA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oc2FtcGxlc1BlclB1bHNlKTsKLSAgICAgICAgbVplcm9BZnRlck9uZSA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oc2FtcGxlc1BlclB1bHNlKTsKLQotICAgICAgICBpbnQgc2FtcGxlSW5kZXggPSAwOwotICAgICAgICBmb3IgKGludCByYW1wSW5kZXggPSAwOyByYW1wSW5kZXggPCByYW1wU2l6ZTsgcmFtcEluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHBoYXNlID0gKHJhbXBJbmRleCArIDEpICogTV9QSSAvIHJhbXBTaXplOwotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gLWNvc2YocGhhc2UpOwotICAgICAgICAgICAgbVplcm9BZnRlclplcm9bc2FtcGxlSW5kZXhdID0gc2FtcGxlOwotICAgICAgICAgICAgbVplcm9BZnRlck9uZVtzYW1wbGVJbmRleF0gPSAxLjBmOwotICAgICAgICAgICAgc2FtcGxlSW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByYW1wSW5kZXggPSAwOyByYW1wSW5kZXggPCByYW1wU2l6ZTsgcmFtcEluZGV4KyspIHsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJaZXJvW3NhbXBsZUluZGV4XSA9IDEuMGY7Ci0gICAgICAgICAgICBtWmVyb0FmdGVyT25lW3NhbXBsZUluZGV4XSA9IDEuMGY7Ci0gICAgICAgICAgICBzYW1wbGVJbmRleCsrOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJhbXBJbmRleCA9IDA7IHJhbXBJbmRleCA8IHJhbXBTaXplOyByYW1wSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgcGhhc2UgPSAocmFtcEluZGV4ICsgMSkgKiBNX1BJIC8gcmFtcFNpemU7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBjb3NmKHBoYXNlKTsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJaZXJvW3NhbXBsZUluZGV4XSA9IHNhbXBsZTsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJPbmVbc2FtcGxlSW5kZXhdID0gc2FtcGxlOwotICAgICAgICAgICAgc2FtcGxlSW5kZXgrKzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCByYW1wSW5kZXggPSAwOyByYW1wSW5kZXggPCByYW1wU2l6ZTsgcmFtcEluZGV4KyspIHsKLSAgICAgICAgICAgIG1aZXJvQWZ0ZXJaZXJvW3NhbXBsZUluZGV4XSA9IC0xLjBmOwotICAgICAgICAgICAgbVplcm9BZnRlck9uZVtzYW1wbGVJbmRleF0gPSAtMS4wZjsKLSAgICAgICAgICAgIHNhbXBsZUluZGV4Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uTmV4dEJpdChib29sIGN1cnJlbnQpIG92ZXJyaWRlIHsKLSAgICAgICAgLy8gRG8gd2UgbmVlZCB0byB1c2UgdGhlIHJvdW5kZWQgZWRnZT8KLSAgICAgICAgbUN1cnJlbnRTYW1wbGVzID0gKGN1cnJlbnQgXiBtUHJldmlvdXNCaXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gbVplcm9BZnRlck9uZS5nZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1aZXJvQWZ0ZXJaZXJvLmdldCgpOwotICAgICAgICBtUHJldmlvdXNCaXQgPSBjdXJyZW50OwotICAgIH0KLQotICAgIGZsb2F0IG5leHRGbG9hdCgpIG92ZXJyaWRlIHsKLSAgICAgICAgYWR2YW5jZVNhbXBsZSgpOwotICAgICAgICBmbG9hdCBvdXRwdXQgPSBtQ3VycmVudFNhbXBsZXNbbUN1cnNvcl07Ci0gICAgICAgIGlmIChnZXRDdXJyZW50Qml0KCkpIG91dHB1dCA9IC1vdXRwdXQ7Ci0gICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgYm9vbCBtUHJldmlvdXNCaXQgPSBmYWxzZTsKLSAgICBmbG9hdCAqbUN1cnJlbnRTYW1wbGVzID0gbnVsbHB0cjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gbVplcm9BZnRlclplcm87Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IG1aZXJvQWZ0ZXJPbmU7Ci19OwotCi0jZW5kaWYgLy9BTkFMWVpFUl9ST1VOREVEX01BTkNIRVNURVJfRU5DT0RFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL2xvb3BiYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCmluZGV4IDBkMmVjNzAuLjZmZmY1NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwCkBAIC0zNiw4ICszNiwxMiBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVJlY29yZGVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKKy8vIEdldCBsb2dnaW5nIG1hY3JvcyBmcm9tIE9ib2VUZXN0ZXIKKyNpbmNsdWRlICJhbmRyb2lkX2RlYnVnLmgiCisvLyBHZXQgc2lnbmFsIGFuYWx5emVycyBmcm9tIE9ib2VUZXN0ZXIKICNpbmNsdWRlICJhbmFseXplci9HbGl0Y2hBbmFseXplci5oIgogI2luY2x1ZGUgImFuYWx5emVyL0xhdGVuY3lBbmFseXplci5oIgorCiAjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKIC8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCBhdXRvLWNvcnJlbGF0ZSBlbnRpcmUgZWNobwpAQCAtNDUsOCArNDksOSBAQAogLy8gICAgICAgICAgIGZpeCAtbiBvcHRpb24gdG8gc2V0IG91dHB1dCBidWZmZXIgZm9yIC10bQogLy8gICAgICAgICAgIHBsb3QgZmlyc3QgZ2xpdGNoCiAvLyBWMC40LjAyID0gYWxsb3cgLW4wIGZvciBtaW5pbWFsIGJ1ZmZlciBzaXplCi0vLyBWMC41LjAwID0gdXNlIGxhdGVuY3kgYW5hbHl6ZXIgZnJvbSBPYm9lVGVzdGVyLCB1c2VzIHJhbmRvbSBub2lzZSBmb3IgbGF0ZW5jeQotI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC41LjAwIgorLy8gVjAuNS4wMCA9IHVzZSBsYXRlbmN5IGFuYWx5emVyIGNvcGllZCBmcm9tIE9ib2VUZXN0ZXIsIHVzZXMgcmFuZG9tIG5vaXNlIGZvciBsYXRlbmN5CisvLyBWMC41LjAxID0gdXNlIGxhdGVuY3kgYW5hbHl6ZXIgZGlyZWN0bHkgZnJvbSBPYm9lVGVzdGVyIGluIGV4dGVybmFsL29ib2UKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuNS4wMSIKIAogLy8gVGFnIGZvciBtYWNoaW5lIHJlYWRhYmxlIHJlc3VsdHMgYXMgcHJvcGVydHkgPSB2YWx1ZSBwYWlycwogI2RlZmluZSBSRVNVTFRfVEFHICAgICAgICAgICAgICAiUkVTVUxUOiAiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAppbmRleCA0YmJhNDM2Li5lNjcwNjQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKQEAgLTQyMSw3ICs0MjEsOSBAQAogICAgICAgICBwcmludGYoIiAgICAgIC1mezB8MXwyfSBzZXQgZm9ybWF0XG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMCA9IFVOU1BFQ0lGSUVEXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IFBDTV9JMTZcbiIpOwotICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gRkxPQVRcbiIpOworICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gUENNX0ZMT0FUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMyA9IFBDTV9JMjRfUEFDS0VEXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgNCA9IFBDTV9JMzJcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1pe2lucHV0UHJlc2V0fSBlZy4gNSBmb3IgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVJcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC1tezB8MXwyfDN9IHNldCBNTUFQIHBvbGljeVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBfVU5TUEVDSUZJRUQsIHVzZSBhYXVkaW8ubW1hcF9wb2xpY3kgc3lzdGVtIHByb3BlcnR5LCBkZWZhdWx0XG4iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9FeGFtcGxlVXRpbHMuaAppbmRleCA0NmI4ODk1Li41ODE5ZGZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCAoTkFOT1NfUEVSX01JQ1JPU0VDT05EICogMTAwMCkKICNkZWZpbmUgTkFOT1NfUEVSX1NFQ09ORCAgICAgIChOQU5PU19QRVJfTUlMTElTRUNPTkQgKiAxMDAwKQogCisvLyBVc2UgdGVtcGxhdGUgZnVuY3Rpb25zIHRvIGF2b2lkIHdhcm5pbmcgb2YgdW51c2VkIHN0YXRpYyBmdW5jdGlvbnMuCiB0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGFhdWRpb19zaGFyaW5nX21vZGVfdD4KIGNvbnN0IGNoYXIgKmdldFNoYXJpbmdNb2RlVGV4dChhYXVkaW9fc2hhcmluZ19tb2RlX3QgbW9kZSkgewogICAgIGNvbnN0IGNoYXIgKnRleHQgPSAidW5rbm93biI7CkBAIC00OCw2ICs0OSw3IEBACiAgICAgcmV0dXJuIHRleHQ7CiB9CiAKK3RlbXBsYXRlIDxjbGFzcyBUID0gYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdD4KIGNvbnN0IGNoYXIgKmdldFBlcmZvcm1hbmNlTW9kZVRleHQoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKSB7CiAgICAgY29uc3QgY2hhciAqdGV4dCA9ICJ1bmtub3duIjsKICAgICBzd2l0Y2ggKG1vZGUpIHsKQEAgLTY2LDYgKzY4LDcgQEAKICAgICByZXR1cm4gdGV4dDsKIH0KIAordGVtcGxhdGUgPGNsYXNzIFQgPSBhYXVkaW9fZGlyZWN0aW9uX3Q+CiBjb25zdCBjaGFyICpnZXREaXJlY3Rpb25UZXh0KGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKICAgICBjb25zdCBjaGFyICp0ZXh0ID0gInVua25vd24iOwogICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CkBAIC04MSw2ICs4NCwyOSBAQAogICAgIHJldHVybiB0ZXh0OwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGFhdWRpb19kaXJlY3Rpb25fdD4KK2NvbnN0ZXhwciBpbnQzMl90IGdldEJ5dGVzUGVyU2FtcGxlKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRDoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kzMjoKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLy8gUmV0dXJuIHRydWUgaWYgQ1BVIGlzIG5hdGl2ZSBMaXR0bGUgRW5kaWFuCitpbmxpbmUgYm9vbCBpc05hdGl2ZUxpdHRsZUVuZGlhbigpIHsKKyAgICAvLyBJZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZGF0YSB3b3JkIGluIG1lbW9yeSBpcyAxIHRoZW4gTGl0dGxlIEVuZGlhbi4KKyAgICBjb25zdGV4cHIgdW5pb24geyB1bnNpZ25lZCB1OyB1bnNpZ25lZCBjaGFyIGNbc2l6ZW9mKHVuc2lnbmVkKV07IH0gb25lID0gezF9OworICAgIHJldHVybiBvbmUuY1swXSAhPSAwOworfQorCiB0ZW1wbGF0ZSA8Y2xhc3MgVCA9IGludDY0X3Q+CiB2b2lkIGNvbnZlcnROYW5vc2Vjb25kc1RvVGltZXNwZWMoaW50NjRfdCBuYW5vc2Vjb25kcywgc3RydWN0IHRpbWVzcGVjICp0aW1lKSB7CiAgICAgdGltZS0+dHZfc2VjID0gbmFub3NlY29uZHMgLyBOQU5PU19QRVJfU0VDT05EOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCmluZGV4IGZkMWZjNDUuLjdkYWFjMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKQEAgLTM1OSwyMiArMzU5LDM4IEBACiAKICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKIAotCi0gICAgaW50IG51bUFjdGl2ZU9zY2lsYXRvcnMgPSAoc2FtcGxlc1BlckZyYW1lID4gTUFYX0NIQU5ORUxTKSA/IE1BWF9DSEFOTkVMUyA6IHNhbXBsZXNQZXJGcmFtZTsKKyAgICBpbnQgbnVtQWN0aXZlT3NjaWxsYXRvcnMgPSBzdGQ6Om1pbihzYW1wbGVzUGVyRnJhbWUsIE1BWF9DSEFOTkVMUyk7CiAgICAgc3dpdGNoIChBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6IHsKICAgICAgICAgICAgIGludDE2X3QgKmF1ZGlvQnVmZmVyID0gKGludDE2X3QgKikgYXVkaW9EYXRhOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGF0b3JzOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmYXVkaW9CdWZmZXJbaV0sIHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmF1ZGlvQnVmZmVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKICAgICAgICAgICAgIGZsb2F0ICphdWRpb0J1ZmZlciA9IChmbG9hdCAqKSBhdWRpb0RhdGE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgewotICAgICAgICAgICAgICAgIHNpbmVEYXRhLT5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZhdWRpb0J1ZmZlcltpXSwgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsbGF0b3JzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmYXVkaW9CdWZmZXJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VEOiB7CisgICAgICAgICAgICB1aW50OF90ICphdWRpb0J1ZmZlciA9ICh1aW50OF90ICopIGF1ZGlvRGF0YTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJTYW1wbGUgPSBnZXRCeXRlc1BlclNhbXBsZShBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VEKTsKKyAgICAgICAgICAgICAgICBzaW5lRGF0YS0+c2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcjI0KCZhdWRpb0J1ZmZlcltpICogYnl0ZXNQZXJTYW1wbGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBudW1GcmFtZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMzI6IHsKKyAgICAgICAgICAgIGludDMyX3QgKmF1ZGlvQnVmZmVyID0gKGludDMyX3QgKikgYXVkaW9EYXRhOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgc2luZURhdGEtPnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmF1ZGlvQnVmZmVyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL1NpbmVHZW5lcmF0b3IuaAppbmRleCA5ZTZkNDZkLi42NmEwOGZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvU2luZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9TaW5lR2VuZXJhdG9yLmgKQEAgLTQxLDIwICs0MSw1NCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmxvYXQgbmV4dCgpIHsKKyAgICAgICAgZmxvYXQgdmFsdWUgPSBzaW5mKG1QaGFzZSkgKiBtQW1wbGl0dWRlOworICAgICAgICBhZHZhbmNlUGhhc2UoKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKwogICAgIHZvaWQgcmVuZGVyKGludDE2X3QgKmJ1ZmZlciwgaW50MzJfdCBjaGFubmVsU3RyaWRlLCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICBpbnQgc2FtcGxlSW5kZXggPSAwOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXhdID0gKGludDE2X3QpIChJTlQxNl9NQVggKiBzaW4obVBoYXNlKSAqIG1BbXBsaXR1ZGUpOworICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IChpbnQxNl90KSAoSU5UMTZfTUFYICogbmV4dCgpKTsKICAgICAgICAgICAgIHNhbXBsZUluZGV4ICs9IGNoYW5uZWxTdHJpZGU7Ci0gICAgICAgICAgICBhZHZhbmNlUGhhc2UoKTsKICAgICAgICAgfQogICAgIH0KKwogICAgIHZvaWQgcmVuZGVyKGZsb2F0ICpidWZmZXIsIGludDMyX3QgY2hhbm5lbFN0cmlkZSwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IHNpbihtUGhhc2UpICogbUFtcGxpdHVkZTsKKyAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSBuZXh0KCk7CiAgICAgICAgICAgICBzYW1wbGVJbmRleCArPSBjaGFubmVsU3RyaWRlOwotICAgICAgICAgICAgYWR2YW5jZVBoYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlbmRlcihpbnQzMl90ICpidWZmZXIsIGludDMyX3QgY2hhbm5lbFN0cmlkZSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgaW50IHNhbXBsZUluZGV4ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4XSA9IChpbnQzMl90KSAoSU5UMzJfTUFYICogbmV4dCgpKTsKKyAgICAgICAgICAgIHNhbXBsZUluZGV4ICs9IGNoYW5uZWxTdHJpZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlbmRlcjI0KHVpbnQ4X3QgKmJ1ZmZlciwgaW50MzJfdCBjaGFubmVsU3RyaWRlLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBpbnQgc2FtcGxlSW5kZXggPSAwOworICAgICAgICBjb25zdGV4cHIgaW50MzJfdCBJTlQyNF9NQVggPSAoMSA8PCAyMykgLSAxOworICAgICAgICBjb25zdGV4cHIgaW50IGJ5dGVzUGVyU2FtcGxlID0gZ2V0Qnl0ZXNQZXJTYW1wbGUoQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRCk7CisgICAgICAgIGNvbnN0IGJvb2wgaXNMaXR0bGVFbmRpYW4gPSBpc05hdGl2ZUxpdHRsZUVuZGlhbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZSA9IChpbnQzMl90KSAoSU5UMjRfTUFYICogbmV4dCgpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYW1wbGUgPSAodWludDMyX3QpIHNhbXBsZTsKKyAgICAgICAgICAgIGlmIChpc0xpdHRsZUVuZGlhbikgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleF0gPSB1c2FtcGxlOyAvLyBsaXR0bGUgZW5kIGZpcnN0CisgICAgICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4ICsgMV0gPSB1c2FtcGxlID4+IDg7CisgICAgICAgICAgICAgICAgYnVmZmVyW3NhbXBsZUluZGV4ICsgMl0gPSB1c2FtcGxlID4+IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbc2FtcGxlSW5kZXhdID0gdXNhbXBsZSA+PiAxNjsgLy8gYmlnIGVuZCBmaXJzdAorICAgICAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleCArIDFdID0gdXNhbXBsZSA+PiA4OworICAgICAgICAgICAgICAgIGJ1ZmZlcltzYW1wbGVJbmRleCArIDJdID0gdXNhbXBsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhbXBsZUluZGV4ICs9IGNoYW5uZWxTdHJpZGUgKiBieXRlc1BlclNhbXBsZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAwLDQgKzEzNCwzIEBACiB9OwogCiAjZW5kaWYgLyogU0lORV9HRU5FUkFUT1JfSCAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL2R1bW15LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmN2UzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKioKLSAqIER1bW15IGZpbGUgbmVlZGVkIHRvIGdldCBBbmRyb2lkIFN0dWRpbyB0byBzY2FuIHRoaXMgZm9sZGVyLgotICovCi0KLWludCBnX0RvTm90VXNlVGhpc1ZhcmlhYmxlID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy91bnVzZWQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1MjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy91bnVzZWQuY3BwCkBAIC0wLDAgKzEsNSBAQAorLyoqCisgKiBVbnVzZWQgZmlsZSByZXF1aXJlZCB0byBnZXQgQW5kcm9pZCBTdHVkaW8gdG8gc2NhbiB0aGlzIGZvbGRlci4KKyAqLworCitpbnQgZ19Eb05vdFVzZVRoaXNWYXJpYWJsZSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icAppbmRleCBhYTI1ZTY3Li4xYzdlMGYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAid3JpdGVfc2luZSIsCiAgICAgc3JjczogWyJzcmMvd3JpdGVfc2luZS5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lLmNwcAppbmRleCA4ZTMzYTMxLi4zM2QwN2YwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmUuY3BwCkBAIC00Nyw5ICs0NywxMSBAQAogICAgIGludDMyX3QgIGZyYW1lc1RvUGxheSA9IDA7CiAgICAgaW50MzJfdCAgZnJhbWVzTGVmdCA9IDA7CiAgICAgaW50MzJfdCAgeFJ1bkNvdW50ID0gMDsKLSAgICBpbnQgICAgICBudW1BY3RpdmVPc2NpbGF0b3JzID0gMDsKKyAgICBpbnQgICAgICBudW1BY3RpdmVPc2NpbGxhdG9ycyA9IDA7CiAgICAgZmxvYXQgICAqZmxvYXREYXRhID0gbnVsbHB0cjsKICAgICBpbnQxNl90ICpzaG9ydERhdGEgPSBudWxscHRyOworICAgIGludDMyX3QgKmludDMyRGF0YSA9IG51bGxwdHI7CisgICAgdWludDhfdCAqYnl0ZURhdGEgPSBudWxscHRyOwogCiAgICAgaW50ICAgICAgdGVzdEZkID0gLTE7CiAKQEAgLTU3LDcgKzU5LDcgQEAKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuM1xuIiwgYXJndlswXSk7CisgICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHdhdmUgdXNpbmcgQUF1ZGlvIFYwLjEuNFxuIiwgYXJndlswXSk7CiAKICAgICBpZiAoYXJnUGFyc2VyLnBhcnNlQXJncyhhcmdjLCBhcmd2KSkgewogICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwpAQCAtOTEsMTMgKzkzLDIzIEBACiAgICAgcHJpbnRmKCJCdWZmZXI6IGZyYW1lc1BlcldyaXRlID0gJWRcbiIsZnJhbWVzUGVyV3JpdGUpOwogCiAgICAgLy8gQWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBhdWRpbyBkYXRhLgotICAgIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGZsb2F0RGF0YSA9IG5ldyBmbG9hdFtmcmFtZXNQZXJXcml0ZSAqIGFjdHVhbENoYW5uZWxDb3VudF07Ci0gICAgfSBlbHNlIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBzaG9ydERhdGEgPSBuZXcgaW50MTZfdFtmcmFtZXNQZXJXcml0ZSAqIGFjdHVhbENoYW5uZWxDb3VudF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiBVbnN1cHBvcnRlZCBkYXRhIGZvcm1hdCFcbiIpOwotICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICBzd2l0Y2ggKGFjdHVhbERhdGFGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGZsb2F0RGF0YSA9IG5ldyBmbG9hdFtmcmFtZXNQZXJXcml0ZSAqIGFjdHVhbENoYW5uZWxDb3VudF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CisgICAgICAgICAgICBzaG9ydERhdGEgPSBuZXcgaW50MTZfdFtmcmFtZXNQZXJXcml0ZSAqIGFjdHVhbENoYW5uZWxDb3VudF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VEOgorICAgICAgICAgICAgYnl0ZURhdGEgPSBuZXcgdWludDhfdFtmcmFtZXNQZXJXcml0ZSAqIGFjdHVhbENoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGdldEJ5dGVzUGVyU2FtcGxlKEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kzMjoKKyAgICAgICAgICAgIGludDMyRGF0YSA9IG5ldyBpbnQzMl90W2ZyYW1lc1BlcldyaXRlICogYWN0dWFsQ2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBVbnN1cHBvcnRlZCBkYXRhIGZvcm1hdCFcbiIpOworICAgICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQogCiAgICAgdGVzdEZkID0gb3BlbigiL2RhdGEvYWF1ZGlvX3RlbXAucmF3IiwgT19DUkVBVCB8IE9fUkRXUiwgU19JUldYVSk7CkBAIC0xMTcsMjkgKzEyOSw1NiBAQAogICAgIC8vIFBsYXkgZm9yIGEgd2hpbGUuCiAgICAgZnJhbWVzVG9QbGF5ID0gYWN0dWFsU2FtcGxlUmF0ZSAqIGFyZ1BhcnNlci5nZXREdXJhdGlvblNlY29uZHMoKTsKICAgICBmcmFtZXNMZWZ0ID0gZnJhbWVzVG9QbGF5OwotICAgIG51bUFjdGl2ZU9zY2lsYXRvcnMgPSAoYWN0dWFsQ2hhbm5lbENvdW50ID4gTUFYX0NIQU5ORUxTKSA/IE1BWF9DSEFOTkVMUyA6IGFjdHVhbENoYW5uZWxDb3VudDsKKyAgICBudW1BY3RpdmVPc2NpbGxhdG9ycyA9IChhY3R1YWxDaGFubmVsQ291bnQgPiBNQVhfQ0hBTk5FTFMpID8gTUFYX0NIQU5ORUxTIDogYWN0dWFsQ2hhbm5lbENvdW50OwogICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgewogICAgICAgICAvLyBSZW5kZXIgYXMgRkxPQVQgb3IgUENNCi0gICAgICAgIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgewotICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZmbG9hdERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbERhdGFGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsYXRvcnM7ICsraSkgewotICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZzaG9ydERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOwotICAgICAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFjdHVhbERhdGFGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BY3RpdmVPc2NpbGxhdG9yczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS5zaW5lT3NjaWxsYXRvcnNbaV0ucmVuZGVyKCZmbG9hdERhdGFbaV0sIGFjdHVhbENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyV3JpdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBteURhdGEuc2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcigmc2hvcnREYXRhW2ldLCBhY3R1YWxDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlcldyaXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kzMjoKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZU9zY2lsbGF0b3JzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbXlEYXRhLnNpbmVPc2NpbGxhdG9yc1tpXS5yZW5kZXIoJmludDMyRGF0YVtpXSwgYWN0dWFsQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VEOgorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlT3NjaWxsYXRvcnM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNhbXBsZSA9IGdldEJ5dGVzUGVyU2FtcGxlKEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQpOworICAgICAgICAgICAgICAgICAgICBteURhdGEuc2luZU9zY2lsbGF0b3JzW2ldLnJlbmRlcjI0KCZieXRlRGF0YVtpICogYnl0ZXNQZXJTYW1wbGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNQZXJXcml0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV3JpdGUgYXVkaW8gZGF0YSB0byB0aGUgc3RyZWFtLgogICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vcyA9IDEwMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAgICAgICAgIGludDMyX3QgbWluRnJhbWVzID0gKGZyYW1lc1RvUGxheSA8IGZyYW1lc1BlcldyaXRlKSA/IGZyYW1lc1RvUGxheSA6IGZyYW1lc1BlcldyaXRlOwogICAgICAgICBpbnQzMl90IGFjdHVhbCA9IDA7Ci0gICAgICAgIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLCBmbG9hdERhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxEYXRhRm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgc2hvcnREYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgIHN3aXRjaCAoYWN0dWFsRGF0YUZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLCBmbG9hdERhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTE2OgorICAgICAgICAgICAgICAgIGFjdHVhbCA9IEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0sIHNob3J0RGF0YSwgbWluRnJhbWVzLCB0aW1lb3V0TmFub3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMzI6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgaW50MzJEYXRhLCBtaW5GcmFtZXMsIHRpbWVvdXROYW5vcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gQUF1ZGlvU3RyZWFtX3dyaXRlKGFhdWRpb1N0cmVhbSwgYnl0ZURhdGEsIG1pbkZyYW1lcywgdGltZW91dE5hbm9zKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoYWN0dWFsIDwgMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV93cml0ZSgpIHJldHVybmVkICVkXG4iLCBhY3R1YWwpOwpAQCAtMTk2LDYgKzIzNSw4IEBACiAKICAgICBkZWxldGVbXSBmbG9hdERhdGE7CiAgICAgZGVsZXRlW10gc2hvcnREYXRhOworICAgIGRlbGV0ZVtdIGludDMyRGF0YTsKKyAgICBkZWxldGVbXSBieXRlRGF0YTsKICAgICBwcmludGYoImV4aXRpbmcgLSBBQXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IGNhNjAyMzMuLmNkYzk4N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuNyIKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuOCIKIAogY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCmluZGV4IGE0N2YxODkuLjRiMDgyOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKQEAgLTI5LDYgKzI5LDggQEAKICNpZm5kZWYgQUFVRElPX0FBVURJT19ICiAjZGVmaW5lIEFBVURJT19BQVVESU9fSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHRpbWUuaD4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC02Myw3ICs2NSw3IEBACiAKICAgICAvKioKICAgICAgKiBUaGlzIGZvcm1hdCB1c2VzIHRoZSBpbnQxNl90IGRhdGEgdHlwZS4KLSAgICAgKiBUaGUgbWF4aW11bSByYW5nZSBvZiB0aGUgZGF0YSBpcyAtMzI3NjggdG8gMzI3NjcuCisgICAgICogVGhlIG1heGltdW0gcmFuZ2Ugb2YgdGhlIGRhdGEgaXMgLTMyNzY4ICgweDgwMDApIHRvIDMyNzY3ICgweDdGRkYpLgogICAgICAqLwogICAgIEFBVURJT19GT1JNQVRfUENNX0kxNiwKIApAQCAtNzIsMTAgKzc0LDM3IEBACiAgICAgICogVGhlIG5vbWluYWwgcmFuZ2Ugb2YgdGhlIGRhdGEgaXMgWy0xLjBmLCAxLjBmKS4KICAgICAgKiBWYWx1ZXMgb3V0c2lkZSB0aGF0IHJhbmdlIG1heSBiZSBjbGlwcGVkLgogICAgICAqCi0gICAgICogU2VlIGFsc28gJ2Zsb2F0RGF0YScgYXQKLSAgICAgKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrI3dyaXRlKGZsb2F0W10sJTIwaW50LCUyMGludCwlMjBpbnQpCisgICAgICogU2VlIGFsc28gdGhlIGZsb2F0IERhdGEgaW4KKyAgICAgKiA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayN3cml0ZShmbG9hdFtdLCUyMGludCwlMjBpbnQsJTIwaW50KSI+CisgICAgICogICB3cml0ZShmbG9hdFtdLCBpbnQsIGludCwgaW50KTwvYT4uCiAgICAgICovCi0gICAgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKworICAgIC8qKgorICAgICAqIFRoaXMgZm9ybWF0IHVzZXMgMjQtYml0IHNhbXBsZXMgcGFja2VkIGludG8gMyBieXRlcy4KKyAgICAgKiBUaGUgYnl0ZXMgYXJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIsIHNvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlCisgICAgICogY29tZXMgZmlyc3QgaW4gdGhlIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBUaGUgbWF4aW11bSByYW5nZSBvZiB0aGUgZGF0YSBpcyAtODM4ODYwOCAoMHg4MDAwMDApCisgICAgICogdG8gODM4ODYwNyAoMHg3RkZGRkYpLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZSBsb3dlciBwcmVjaXNpb24gYml0cyBtYXkgYmUgaWdub3JlZCBieSB0aGUgZGV2aWNlLgorICAgICAqCisgICAgICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAgICAgKi8KKyAgICBBQVVESU9fRk9STUFUX1BDTV9JMjRfUEFDS0VELAorCisgICAgLyoqCisgICAgICogVGhpcyBmb3JtYXQgdXNlcyAzMi1iaXQgc2FtcGxlcyBzdG9yZWQgaW4gYW4gaW50MzJfdCBkYXRhIHR5cGUuCisgICAgICogVGhlIG1heGltdW0gcmFuZ2Ugb2YgdGhlIGRhdGEgaXMgLTIxNDc0ODM2NDggKDB4ODAwMDAwMDApCisgICAgICogdG8gMjE0NzQ4MzY0NyAoMHg3RkZGRkZGRikuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIGxvd2VyIHByZWNpc2lvbiBiaXRzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICAgICAqLworICAgIEFBVURJT19GT1JNQVRfUENNX0kzMgorCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19mb3JtYXRfdDsKIApAQCAtMTcwLDIxICsxOTksNjkgQEAKIH07CiB0eXBlZGVmIGludDMyX3QgIGFhdWRpb19yZXN1bHRfdDsKIAorLyoqCisgKiBBQXVkaW8gU3RyZWFtIHN0YXRlcywgZm9yIGRldGFpbHMsIHJlZmVyIHRvCisgKiA8YSBocmVmPSIvbmRrL2d1aWRlcy9hdWRpby9hYXVkaW8vYWF1ZGlvI3VzaW5nLXN0cmVhbXMiPlVzaW5nIGFuIEF1ZGlvIFN0cmVhbTwvYT4KKyAqLwogZW51bQogeworCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBpcyBjcmVhdGVkIGJ1dCBub3QgaW5pdGlhbGl6ZWQgeWV0LgorICAgICAqLwogICAgIEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRCA9IDAsCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBpcyBpbiBhbiB1bnJlY29nbml6ZWQgc3RhdGUuCisgICAgICovCiAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOLAorCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBpcyBvcGVuIGFuZCByZWFkeSB0byB1c2UuCisgICAgICovCiAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9PUEVOLAorICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gaXMganVzdCBzdGFydGluZyB1cC4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HLAorICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gaGFzIHN0YXJ0ZWQuCisgICAgICovCiAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELAorICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gaXMgcGF1c2luZy4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcsCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBoYXMgcGF1c2VkLCBjb3VsZCBiZSByZXN0YXJ0ZWQgb3IgZmx1c2hlZC4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRCwKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIGlzIGJlaW5nIGZsdXNoZWQuCisgICAgICovCiAgICAgQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORywKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIGlzIGZsdXNoZWQsIHJlYWR5IHRvIGJlIHJlc3RhcnRlZC4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQsCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBpcyBzdG9wcGluZy4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HLAorICAgIC8qKgorICAgICAqIFRoZSBzdHJlYW0gaGFzIGJlZW4gc3RvcHBlZC4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQsCisgICAgLyoqCisgICAgICogVGhlIHN0cmVhbSBpcyBjbG9zaW5nLgorICAgICAqLwogICAgIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORywKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCwKKyAgICAvKioKKyAgICAgKiBUaGUgc3RyZWFtIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIGF1ZGlvIGRldmljZS4KKyAgICAgKi8KICAgICBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAogfTsKIHR5cGVkZWYgaW50MzJfdCBhYXVkaW9fc3RyZWFtX3N0YXRlX3Q7CkBAIC0yMzQsNyArMzExLDggQEAKICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBjZXJ0YWluIHBsYXRmb3JtcyBvciByb3V0aW5nIHBvbGljaWVzCiAgKiB0byBtYWtlIG1vcmUgcmVmaW5lZCB2b2x1bWUgb3Igcm91dGluZyBkZWNpc2lvbnMuCiAgKgotICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXN9CisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluCisgKiA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzIj5BdWRpb0F0dHJpYnV0ZXM8L2E+CiAgKiBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KICAqCiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCkBAIC0zMzUsNyArNDEzLDggQEAKICAqIGFuIGF1ZGlvIGJvb2sgYXBwbGljYXRpb24pIHRoaXMgaW5mb3JtYXRpb24gbWlnaHQgYmUgdXNlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrIHRvCiAgKiBlbmZvcmNlIGF1ZGlvIGZvY3VzLgogICoKLSAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzfQorICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbgorICogPGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyI+QXVkaW9BdHRyaWJ1dGVzPC9hPgogICogaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgpAQCAtNDE1LDcgKzQ5NCw4IEBACiAvKioKICAqIFNwZWNpZnlpbmcgaWYgYXVkaW8gbWF5IG9yIG1heSBub3QgYmUgY2FwdHVyZWQgYnkgb3RoZXIgYXBwcyBvciB0aGUgc3lzdGVtLgogICoKLSAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4ge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzfQorICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbgorICogPGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyI+QXVkaW9BdHRyaWJ1dGVzPC9hPgogICogaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI5LgpAQCAtNDI3LDEwICs1MDcsMTEgQEAKICAgICAgKiBGb3IgcHJpdmFjeSwgdGhlIGZvbGxvd2luZyB1c2FnZXMgY2FuIG5vdCBiZSByZWNvcmRlZDogQUFVRElPX1ZPSUNFX0NPTU1VTklDQVRJT04qLAogICAgICAqIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT04qLCBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRSogYW5kIHtAbGluayAjQUFVRElPX1VTQUdFX0FTU0lTVEFOVH0uCiAgICAgICoKLSAgICAgKiBPbiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI1F9LCB0aGlzIG1lYW5zIG9ubHkge0BsaW5rICNBQVVESU9fVVNBR0VfTUVESUF9Ci0gICAgICogYW5kIHtAbGluayAjQUFVRElPX1VTQUdFX0dBTUV9IG1heSBiZSBjYXB0dXJlZC4KKyAgICAgKiBPbiA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvb3MvQnVpbGQuVkVSU0lPTl9DT0RFUyNRIj5CdWlsZC5WRVJTSU9OX0NPREVTPC9hPiwKKyAgICAgKiB0aGlzIG1lYW5zIG9ubHkge0BsaW5rICNBQVVESU9fVVNBR0VfTUVESUF9IGFuZCB7QGxpbmsgI0FBVURJT19VU0FHRV9HQU1FfSBtYXkgYmUgY2FwdHVyZWQuCiAgICAgICoKLSAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfQUxMfS4KKyAgICAgKiBTZWUgPGEgaHJlZj0iL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5odG1sI0FMTE9XX0NBUFRVUkVfQllfQUxMIj4KKyAgICAgKiBBTExPV19DQVBUVVJFX0JZX0FMTDwvYT4uCiAgICAgICovCiAgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMID0gMSwKICAgICAvKioKQEAgLTQzOCw4ICs1MTksOSBAQAogICAgICAqCiAgICAgICogU3lzdGVtIGFwcHMgY2FuIGNhcHR1cmUgZm9yIG1hbnkgcHVycG9zZXMgbGlrZSBhY2Nlc3NpYmlsaXR5LCB1c2VyIGd1aWRhbmNlLi4uCiAgICAgICogYnV0IGhhdmUgc3Ryb25nIHJlc3RyaWN0aW9uLiBTZWUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMjQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU19IGZvciB3aGF0IHRoZSBzeXN0ZW0gYXBwcwotICAgICAqIGNhbiBkbyB3aXRoIHRoZSBjYXB0dXJlIGF1ZGlvLgorICAgICAqIDxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaHRtbCNBTExPV19DQVBUVVJFX0JZX1NZU1RFTSI+CisgICAgICogQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU08L2E+CisgICAgICogZm9yIHdoYXQgdGhlIHN5c3RlbSBhcHBzIGNhbiBkbyB3aXRoIHRoZSBjYXB0dXJlIGF1ZGlvLgogICAgICAqLwogICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSA9IDIsCiAgICAgLyoqCkBAIC00NDcsNyArNTI5LDggQEAKICAgICAgKgogICAgICAqIEl0IGlzIGVuY291cmFnZWQgdG8gdXNlIHtAbGluayAjQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNfSBpbnN0ZWFkIG9mIHRoaXMgdmFsdWUgYXMgc3lzdGVtIGFwcHMKICAgICAgKiBwcm92aWRlIHNpZ25pZmljYW50IGFuZCB1c2VmdWwgZmVhdHVyZXMgZm9yIHRoZSB1c2VyIChlZy4gYWNjZXNzaWJpbGl0eSkuCi0gICAgICogU2VlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlcyNBTExPV19DQVBUVVJFX0JZX05PTkV9LgorICAgICAqIFNlZSA8YSBocmVmPSIvcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmh0bWwjQUxMT1dfQ0FQVFVSRV9CWV9OT05FIj4KKyAgICAgKiBBTExPV19DQVBUVVJFX0JZX05PTkU8L2E+LgogICAgICAqLwogICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkUgPSAzLAogfTsKQEAgLTU1NSw2ICs2MzgsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlSWQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgorICogRGVjbGFyZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBjcmVhdGluZyB0aGUgc3RyZWFtLgorICoKKyAqIFRoaXMgaXMgdXN1YWxseSB7QGNvZGUgQ29udGV4dCNnZXRQYWNrYWdlTmFtZSgpfS4KKyAqCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIGEgcmFuZG9tIHBhY2thZ2UgaW4gdGhlIGNhbGxpbmcgdWlkLgorICogVGhlIHZhc3QgbWFqb3JpdHkgb2YgYXBwcyBoYXZlIG9ubHkgb25lIHBhY2thZ2UgcGVyIGNhbGxpbmcgVUlELiBJZiB0aGUgcGFja2FnZQorICogbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgY2FsbGluZyBVSUQsIHRoZW4gcmVxdWVzdHMgd2lsbCBiZSByZWplY3RlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICoKKyAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCisgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZU5hbWUgb2YgdGhlIGNhbGxpbmcgYXBwLgorICovCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQYWNrYWdlTmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHBhY2thZ2VOYW1lKSBfX0lOVFJPRFVDRURfSU4oMzEpOworCisvKioKKyAqIERlY2xhcmUgdGhlIGF0dHJpYnV0aW9uIHRhZyBvZiB0aGUgY29udGV4dCBjcmVhdGluZyB0aGUgc3RyZWFtLgorICoKKyAqIFRoaXMgaXMgdXN1YWxseSB7QGNvZGUgQ29udGV4dCNnZXRBdHRyaWJ1dGlvblRhZygpfS4KKyAqCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIG51bGwuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAqCisgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQorICogQHBhcmFtIGF0dHJpYnV0aW9uVGFnIGF0dHJpYnV0aW9uVGFnIG9mIHRoZSBjYWxsaW5nIGNvbnRleHQuCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEF0dHJpYnV0aW9uVGFnKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGNvbnN0IGNoYXIgKiBhdHRyaWJ1dGlvblRhZykgX19JTlRST0RVQ0VEX0lOKDMxKTsKKworLyoqCiAgKiBSZXF1ZXN0IGEgc2FtcGxlIHJhdGUgaW4gSGVydHouCiAgKgogICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCkBAIC02ODcsNyArODAyLDcgQEAKICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFNldCB0aGUgaW50ZW5kZWQgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCisgKiBTZXQgdGhlIGludGVuZGVkIHVzZSBjYXNlIGZvciB0aGUgb3V0cHV0IHN0cmVhbS4KICAqCiAgKiBUaGUgQUF1ZGlvIHN5c3RlbSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIG9wdGltaXplIHRoZQogICogYmVoYXZpb3Igb2YgdGhlIHN0cmVhbS4KQEAgLTcwNCw3ICs4MTksNyBAQAogICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCi0gKiBTZXQgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSB0aGF0IHRoZSBzdHJlYW0gd2lsbCBjYXJyeS4KKyAqIFNldCB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhIHRoYXQgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCBjYXJyeS4KICAqCiAgKiBUaGUgQUF1ZGlvIHN5c3RlbSB3aWxsIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIG9wdGltaXplIHRoZQogICogYmVoYXZpb3Igb2YgdGhlIHN0cmVhbS4KQEAgLTc0Niw3ICs4NjEsOSBAQAogICogVGhlIGRlZmF1bHQgaXMge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEx9LgogICoKICAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gYWxzbyBzZXQgaXRzIGdsb2JhbCBwb2xpY3ksIGluIHdoaWNoIGNhc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUKLSAqIHBvbGljeSBpcyBhbHdheXMgYXBwbGllZC4gU2VlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlcyNzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShpbnQpfQorICogcG9saWN5IGlzIGFsd2F5cyBhcHBsaWVkLiBTZWUKKyAqIDxhIGhyZWY9Ii9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9BdWRpb01hbmFnZXIjc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50KSI+CisgKiBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShpbnQpPC9hPgogICoKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjkuCiAgKgpAQCAtODk0LDggKzEwMTEsOSBAQAogICogSXQgd2lsbCBzdG9wIGJlaW5nIGNhbGxlZCBhZnRlciBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgb3IKICAqIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIGlzIGNhbGxlZC4KICAqCi0gKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGEgcmVhbC10aW1lIHRocmVhZCBvd25lZCBieSBBQXVkaW8uIFNlZQotICoge0BsaW5rICNBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIFRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb24gYSByZWFsLXRpbWUgdGhyZWFkIG93bmVkIGJ5IEFBdWRpby4KKyAqIFRoZSBsb3cgbGF0ZW5jeSBzdHJlYW1zIG1heSBoYXZlIGNhbGxiYWNrIHRocmVhZHMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhbiBub3JtYWwgc3RyZWFtcy4KKyAqIFNlZSB7QGxpbmsgI0FBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2t9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICoKICAqIE5vdGUgdGhhdCB0aGUgQUF1ZGlvIGNhbGxiYWNrcyB3aWxsIG5ldmVyIGJlIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCiAgKgpAQCAtMTAyMiw3ICsxMTQwLDYgQEAKIC8vIFN0cmVhbSBDb250cm9sCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAzMAogLyoqCiAgKiBGcmVlIHRoZSBhdWRpbyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3RyZWFtIGNyZWF0ZWQgYnkKICAqIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpLgpAQCAtMTAzNSwxMSArMTE1MiwxNyBAQAogICogYnV0IHN0aWxsIGFsbG93IHF1ZXJpZXMgdG8gdGhlIHN0cmVhbSB0byBvY2N1ciBmcm9tIG90aGVyIHRocmVhZHMuIFRoaXMgb2Z0ZW4KICAqIGhhcHBlbnMgaWYgeW91IGFyZSBtb25pdG9yaW5nIHN0cmVhbSBwcm9ncmVzcyBmcm9tIGEgVUkgdGhyZWFkLgogICoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBmdWxseSBpbXBsZW1lbnRlZCBmb3IgTU1BUCBzdHJlYW1zLAorICogd2hpY2ggYXJlIGxvdyBsYXRlbmN5IHN0cmVhbXMgc3VwcG9ydGVkIGJ5IHNvbWUgZGV2aWNlcy4KKyAqIE9uIG90aGVyICJMZWdhY3kiIHN0cmVhbXMgc29tZSBhdWRpbyByZXNvdXJjZXMgd2lsbCBzdGlsbCBiZSBpbiB1c2UKKyAqIGFuZCBzb21lIGNhbGxiYWNrcyBtYXkgc3RpbGwgYmUgaW4gcHJvY2VzcyBhZnRlciB0aGlzIGNhbGwuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMC4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZWxlYXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMzApOwotI2VuZGlmIC8vIF9fQU5EUk9JRF9BUElfXwogCiAvKioKICAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtIGNyZWF0ZWQKQEAgLTEwNDcsNiArMTE3MCw4IEBACiAgKgogICogSWYgQUF1ZGlvU3RyZWFtX3JlbGVhc2UoKSBoYXMgbm90IGJlZW4gY2FsbGVkIHRoZW4gaXQgd2lsbCBiZSBjYWxsZWQgYXV0b21hdGljYWxseS4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKaW5kZXggNzE3ZjMxYS4uMzNhNWM3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhYXVkaW8iLAogCkBAIC0yMSw2ICszMCw3IEBACiAgICAgXSwKIAogICAgIGNmbGFnczogWworICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwKICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTQyLDYgKzUyLDcgQEAKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC03NSw2ICs4NiwxMCBAQAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhYXVkaW9faGVhZGVycyJdLAogCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC04NSw2ICsxMDAsOSBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJhYXVkaW8tYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xMTQsMTEgKzEzMiwxMCBAQAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCiAgICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuY3BwIiwKICAgICAgICAgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCIsCiAgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwIiwKICAgICAgICAgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAiLAotICAgICAgICAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmNwcCIsCi0gICAgICAgICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIiwKICAgICAgICAgImJpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAiLApAQCAtMTI5LDEyICsxNDYsNDUgQEAKICAgICAgICAgImZsb3dncmFwaC9TaW5rRmxvYXQuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9TaW5rSTE2LmNwcCIsCiAgICAgICAgICJmbG93Z3JhcGgvU2lua0kyNC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMzIuY3BwIiwKICAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkxNi5jcHAiLAogICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAiLAogICAgIF0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsiYm91bmRzIl0sCiAgICAgfSwKIH0KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhYXVkaW8tYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJiaW5kaW5nL2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vRW5kcG9pbnQuYWlkbCIsCisgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL1JpbmdCdWZmZXIuYWlkbCIsCisgICAgICAgICJiaW5kaW5nL2FpZGwvYWF1ZGlvL1NoYXJlZFJlZ2lvbi5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUmVxdWVzdC5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb0NsaWVudC5haWRsIiwKKyAgICAgICAgImJpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIgorICAgIF0sCisgICAgYmFja2VuZDoKKyAgICB7CisgICAgICAgIGNwcDogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICAgICAgamF2YTogeworICAgICAgICAgICAgLy8gVE9ETzogbmVlZCB0byBoYXZlIGF1ZGlvX2NvbW1vbi1haWRsIGF2YWlsYWJsZSBpbiBKYXZhIHRvIGVuYWJsZQorICAgICAgICAgICAgLy8gICAgICAgdGhpcy4KKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzYTFjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaD4KKyNpbmNsdWRlIDx1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oPgorCituYW1lc3BhY2UgYWF1ZGlvIHsKKwordXNpbmcgYW5kcm9pZDo6YWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKworQUF1ZGlvQmluZGVyQWRhcHRlcjo6QUF1ZGlvQmluZGVyQWRhcHRlcihJQUF1ZGlvU2VydmljZSogZGVsZWdhdGUpCisgICAgICAgIDogbURlbGVnYXRlKGRlbGVnYXRlKSB7fQorCit2b2lkIEFBdWRpb0JpbmRlckFkYXB0ZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpIHsKKyAgICBtRGVsZWdhdGUtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Cit9CisKK2FhdWRpb19oYW5kbGVfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpvcGVuU3RyZWFtKGNvbnN0IEFBdWRpb1N0cmVhbVJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWcpIHsKKyAgICBhYXVkaW9faGFuZGxlX3QgcmVzdWx0OworICAgIFN0cmVhbVBhcmFtZXRlcnMgcGFyYW1zOworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPm9wZW5TdHJlYW0ocmVxdWVzdC5wYXJjZWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICBjb25maWcgPSBwYXJhbXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmNsb3NlU3RyZWFtKHN0cmVhbUhhbmRsZSwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSYgZW5kcG9pbnRPdXQpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIEVuZHBvaW50IGVuZHBvaW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICBlbmRwb2ludE91dCA9IHN0ZDo6bW92ZShlbmRwb2ludCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OnN0YXJ0U3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6cGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgU3RhdHVzIHN0YXR1cyA9IG1EZWxlZ2F0ZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlLCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OworICAgIFN0YXR1cyBzdGF0dXMgPSBtRGVsZWdhdGUtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlLCAmcmVzdWx0KTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJBZGFwdGVyOjpmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gbURlbGVnYXRlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUsICZyZXN1bHQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckFkYXB0ZXI6OnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQ7CisgICAgU3RhdHVzIHN0YXR1cyA9IG1EZWxlZ2F0ZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsIGNsaWVudFRocmVhZElkLCBwZXJpb2ROYW5vc2Vjb25kcywgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQWRhcHRlcjo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkKSB7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gbURlbGVnYXRlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCwgJnJlc3VsdCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYWF1ZGlvCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQWRhcHRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTlhYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhYXVkaW8vSUFBdWRpb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFhdWRpbyB7CisKKy8qKgorICogQW4gYWRhcHRlciB0aGF0IHRha2VzIGluIGFuIHVuZGVybHlpbmcgSUFBdWRpb1NlcnZpY2UgYW5kIGV4cG9zZXMgYW4KKyAqIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBhYnN0cmFjdDogdGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRob3NlCisgKiBtZXRob2RzIGZyb20gQUF1ZGlvU2VydmljZUludGVyZmFjZSB0aGF0IGRvbid0IGhhdmUgY291bnRlcnBhcnRzIGluIElBQXVkaW9TZXJ2aWNlLgorICovCitjbGFzcyBBQXVkaW9CaW5kZXJBZGFwdGVyIDogcHVibGljIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEFBdWRpb0JpbmRlckFkYXB0ZXIoSUFBdWRpb1NlcnZpY2UqIGRlbGVnYXRlKTsKKworICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBlbmRwb2ludCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgSUFBdWRpb1NlcnZpY2UqIGNvbnN0IG1EZWxlZ2F0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhYXVkaW8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKaW5kZXggN2IwZDMxZi4uZmE1YTJkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAKQEAgLTE5LDM1ICsxOSwzMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgiCi0vLyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLS8vI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgotLy8jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotLy8jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogCi0vLyNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKKworI2RlZmluZSBBQVVESU9fU0VSVklDRV9OQU1FICAibWVkaWEuYWF1ZGlvIgogCiB1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKIHVzaW5nIGFuZHJvaWQ6OklTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIGFuZHJvaWQ6OmludGVyZmFjZV9jYXN0OwogdXNpbmcgYW5kcm9pZDo6SUludGVyZmFjZTsKLXVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7CiB1c2luZyBhbmRyb2lkOjpQcm9jZXNzU3RhdGU7CiB1c2luZyBhbmRyb2lkOjpzcDsKK3VzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwogdXNpbmcgYW5kcm9pZDo6d3A7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIApAQCAtNjcsMjAgKzYyLDE4IEBACiBBQXVkaW9CaW5kZXJDbGllbnQ6On5BQXVkaW9CaW5kZXJDbGllbnQoKSB7CiAgICAgQUxPR1YoIiVzIC0gZGVzdHJveWluZyAlcCIsIF9fZnVuY19fLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlcnZpY2VMb2NrKTsKLSAgICBpZiAobUFBdWRpb1NlcnZpY2UgIT0gMCkgewotICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQUF1ZGlvU2VydmljZSktPnVubGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7Ci0gICAgfQogfQogCiAvLyBUT0RPIFNoYXJlIGNvZGUgd2l0aCBvdGhlciBzZXJ2aWNlIGNsaWVudHMuCiAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IGFjY2VzcyB0byB0aGUgIkFBdWRpb1NlcnZpY2UiIHNlcnZpY2UuCiAvLyBUaGlzIGNvZGUgd2FzIG1vZGVsZWQgYWZ0ZXIgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKLWNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEFBdWRpb1NlcnZpY2UoKSB7CitzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gQUF1ZGlvQmluZGVyQ2xpZW50OjpnZXRBQXVkaW9TZXJ2aWNlKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiByZXN1bHQ7CiAgICAgc3A8SUFBdWRpb1NlcnZpY2U+IGFhdWRpb1NlcnZpY2U7CiAgICAgYm9vbCBuZWVkVG9SZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGlmIChtQUF1ZGlvU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQWRhcHRlciA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXI7CiAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CiAgICAgICAgICAgICAvLyBUcnkgc2V2ZXJhbCB0aW1lcyB0byBnZXQgdGhlIHNlcnZpY2UuCkBAIC05OSw3ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIGxpbmtUb0RlYXRoKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUFBdWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb1NlcnZpY2U+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIucmVzZXQobmV3IEFkYXB0ZXIoYWF1ZGlvU2VydmljZSwgbUFBdWRpb0NsaWVudCkpOwogICAgICAgICAgICAgICAgIG5lZWRUb1JlZ2lzdGVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgY2FsbGJhY2tzIGNhbiBiZSByZWNlaXZlZCBieSBtQUF1ZGlvQ2xpZW50CiAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwpAQCAtMTA3LDE4ICsxMDEsMTggQEAKICAgICAgICAgICAgICAgICBBTE9HRSgiQUF1ZGlvQmluZGVyQ2xpZW50IGNvdWxkIG5vdCBjb25uZWN0IHRvICVzIiwgQUFVRElPX1NFUlZJQ0VfTkFNRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYWF1ZGlvU2VydmljZSA9IG1BQXVkaW9TZXJ2aWNlOworICAgICAgICByZXN1bHQgPSBtQWRhcHRlcjsKICAgICB9CiAgICAgLy8gRG8gdGhpcyBvdXRzaWRlIHRoZSBtdXRleCBsb2NrLgogICAgIGlmIChuZWVkVG9SZWdpc3RlciAmJiBhYXVkaW9TZXJ2aWNlLmdldCgpICE9IG51bGxwdHIpIHsgLy8gbmV3IGNsaWVudD8KICAgICAgICAgYWF1ZGlvU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUFBdWRpb0NsaWVudCk7CiAgICAgfQotICAgIHJldHVybiBhYXVkaW9TZXJ2aWNlOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQgQUF1ZGlvQmluZGVyQ2xpZW50Ojpkcm9wQUF1ZGlvU2VydmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlcnZpY2VMb2NrKTsKLSAgICBtQUF1ZGlvU2VydmljZS5jbGVhcigpOyAvLyBmb3JjZSBhIHJlY29ubmVjdAorICAgIG1BZGFwdGVyLnJlc2V0KCk7CiB9CiAKIC8qKgpAQCAtMTI3LDEzICsxMjEsMTMgQEAKICogQHJldHVybiBoYW5kbGUgdG8gdGhlIHN0cmVhbSBvciBhIG5lZ2F0aXZlIGVycm9yCiAqLwogYWF1ZGlvX2hhbmRsZV90IEFBdWRpb0JpbmRlckNsaWVudDo6b3BlblN0cmVhbShjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiAmc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKIAotICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25PdXRwdXQpOworICAgICAgICBzdHJlYW0gPSBzZXJ2aWNlLT5vcGVuU3RyZWFtKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pOwogCiAgICAgICAgIGlmIChzdHJlYW0gPT0gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpIHsKICAgICAgICAgICAgIEFMT0dFKCJvcGVuU3RyZWFtIGxvc3QgY29ubmVjdGlvbiB0byBBQXVkaW9TZXJ2aWNlLiIpOwpAQCAtMTQ2LDggKzE0MCw5IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKICAgICByZXR1cm4gc2VydmljZS0+Y2xvc2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIApAQCAtMTU1LDMzICsxNTAsMzggQEAKICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgogKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OmdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUmIGVuZHBvaW50T3V0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOwotICAgIHJldHVybiBzZXJ2aWNlLT5nZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOworCisgICAgcmV0dXJuIHNlcnZpY2UtPmdldFN0cmVhbURlc2NyaXB0aW9uKHN0cmVhbUhhbmRsZSwgZW5kcG9pbnRPdXQpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50OjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworCiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9CaW5kZXJDbGllbnQ6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBjb25zdCBzcDxJQUF1ZGlvU2VydmljZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QUF1ZGlvU2VydmljZUludGVyZmFjZT4gc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZS5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisKICAgICByZXR1cm4gc2VydmljZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgY29uc3Qgc3A8SUFBdWRpb1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IHNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworCiAgICAgcmV0dXJuIHNlcnZpY2UtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6Zmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKwogICAgIHJldHVybiBzZXJ2aWNlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOwogfQogCkBAIC0xOTEsMTcgKzE5MSwxNiBAQAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0JpbmRlckNsaWVudDo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKLSAgICByZXR1cm4gc2VydmljZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kTmFub3NlY29uZHMpOworCisgICAgcmV0dXJuIHNlcnZpY2UtPnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCwgcGVyaW9kTmFub3NlY29uZHMpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvQmluZGVyQ2xpZW50Ojp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgewotICAgIGNvbnN0IHNwPElBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlPiBzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOwogICAgIGlmIChzZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKLSAgICByZXR1cm4gc2VydmljZS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZElkKTsKKworICAgIHJldHVybiBzZXJ2aWNlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmgKaW5kZXggZThjOTFmYy4uNmE3YjYzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaApAQCAtMjEsMTIgKzIxLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSAiQUF1ZGlvU2VydmljZURlZmluaXRpb25zLmgiCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgImFhdWRpby9CbkFBdWRpb0NsaWVudC5oIgorI2luY2x1ZGUgImFhdWRpby9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0JpbmRlckFkYXB0ZXIuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgorI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgogCiAvKioKICAqIEltcGxlbWVudHMgdGhlIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgYnkgdGFsa2luZyB0byB0aGUgc2VydmljZSB0aHJvdWdoIEJpbmRlci4KQEAgLTQ0LDExICs0Nyw3IEBACiAKICAgICB2aXJ0dWFsIH5BQXVkaW9CaW5kZXJDbGllbnQoKTsKIAotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlPiBnZXRBQXVkaW9TZXJ2aWNlKCk7Ci0KLSAgICB2b2lkIGRyb3BBQXVkaW9TZXJ2aWNlKCk7Ci0KLSAgICB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9DbGllbnQ+JiBjbGllbnQgX191bnVzZWQpIG92ZXJyaWRlIHt9CisgICAgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50IF9fdW51c2VkKSBvdmVycmlkZSB7fQogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3QgaW5mbyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBzdHJlYW0KQEAgLTY0LDcgKzYzLDcgQEAKICAgICAqIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KICAgICAqLwogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRTdHJlYW1EZXNjcmlwdGlvbihhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50T3V0KSBvdmVycmlkZTsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCkBAIC0xMTUsOCArMTE0LDcgQEAKICAgICAgICAgQUxPR1coIm9uU3RyZWFtQ2hhbmdlIGNhbGxlZCEiKTsKICAgICB9CiAKLSAgICBjbGFzcyBBQXVkaW9DbGllbnQgOiBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgLCBwdWJsaWMgYW5kcm9pZDo6Qm5BQXVkaW9DbGllbnQKLSAgICB7CisgICAgY2xhc3MgQUF1ZGlvQ2xpZW50IDogcHVibGljIGFuZHJvaWQ6OklCaW5kZXI6OkRlYXRoUmVjaXBpZW50LCBwdWJsaWMgQm5BQXVkaW9DbGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgQUF1ZGlvQ2xpZW50KGFuZHJvaWQ6OndwPEFBdWRpb0JpbmRlckNsaWVudD4gYWF1ZGlvQmluZGVyQ2xpZW50KQogICAgICAgICAgICAgICAgIDogbUJpbmRlckNsaWVudChhYXVkaW9CaW5kZXJDbGllbnQpIHsKQEAgLTEzMiwyMSArMTMwLDY2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBpbXBsZW1lbnQgQm5BQXVkaW9DbGllbnQKLSAgICAgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkgeworICAgICAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0cmVhbUNoYW5nZShpbnQzMl90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8YWF1ZGlvX2hhbmRsZV90LCBpbnQzMl90Pik7CiAgICAgICAgICAgICBhbmRyb2lkOjpzcDxBQXVkaW9CaW5kZXJDbGllbnQ+IGNsaWVudCA9IG1CaW5kZXJDbGllbnQucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgY2xpZW50LT5vblN0cmVhbUNoYW5nZShoYW5kbGUsIG9wY29kZSwgdmFsdWUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgICAgICB9CiAgICAgcHJpdmF0ZToKICAgICAgICAgYW5kcm9pZDo6d3A8QUF1ZGlvQmluZGVyQ2xpZW50PiBtQmluZGVyQ2xpZW50OwogICAgIH07CiAKLXByaXZhdGU6CisgICAgLy8gVGhpcyBhZGFwdGVyIGlzIHVzZWQgdG8gY29udmVydCB0aGUgYmluZGVyIGludGVyZmFjZSAoZGVsZWdhdGUpIHRvIHRoZSBBdWRpb1NlcnZpY2VJbnRlcmZhY2UKKyAgICAvLyBjb252ZW50aW9ucyAodHJhbnNsYXRpbmcgYmV0d2VlbiBkYXRhIHR5cGVzIGFuZCByZXNwZWN0aXZlIHBhcmNlbGFibGVzLCB0cmFuc2xhdGluZyBlcnJvcgorICAgIC8vIGNvZGVzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zKS4KKyAgICAvLyBUaGUgYWRhcHRlciBhbHNvIG93bnMgdGhlIHVuZGVybHlpbmcgc2VydmljZSBvYmplY3QgYW5kIGlzIHJlc3BvbnNpYmxlIHRvIHVubGluayBpdHMgZGVhdGgKKyAgICAvLyBsaXN0ZW5lciB3aGVuIGRlc3Ryb3llZC4KKyAgICBjbGFzcyBBZGFwdGVyIDogcHVibGljIEFBdWRpb0JpbmRlckFkYXB0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgQWRhcHRlcihjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvU2VydmljZT4mIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4mIGFhdWRpb0NsaWVudCkKKyAgICAgICAgICAgICAgICA6IEFBdWRpb0JpbmRlckFkYXB0ZXIoZGVsZWdhdGUuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgbURlbGVnYXRlKGRlbGVnYXRlKSwKKyAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQoYWF1ZGlvQ2xpZW50KSB7fQogCi0gICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICAgICAgICAgICBtU2VydmljZUxvY2s7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U+ICBtQUF1ZGlvU2VydmljZTsKLSAgICBhbmRyb2lkOjpzcDxBQXVkaW9DbGllbnQ+ICAgICAgIG1BQXVkaW9DbGllbnQ7CisgICAgICAgIHZpcnR1YWwgfkFkYXB0ZXIoKSB7CisgICAgICAgICAgICBpZiAobURlbGVnYXRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpJSW50ZXJmYWNlOjphc0JpbmRlcihtRGVsZWdhdGUpLT51bmxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIChjYWxsIGlzIHJlamVjdGVkIGF0IHRoZSBBdWRpb0JpbmRlckNsaWVudCBsZXZlbCkuCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGNsaWVudEhhbmRsZSBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIChjYWxsIGlzIHJlamVjdGVkIGF0IHRoZSBBdWRpb0JpbmRlckNsaWVudCBsZXZlbCkuCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGFuZHJvaWQ6OnNwPElBQXVkaW9TZXJ2aWNlPiBtRGVsZWdhdGU7CisgICAgICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gbUFBdWRpb0NsaWVudDsKKyAgICB9OworCitwcml2YXRlOgorICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VydmljZUxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IG1BZGFwdGVyOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb0NsaWVudD4gICAgICAgICAgICAgICBtQUF1ZGlvQ2xpZW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEFBdWRpb1NlcnZpY2VJbnRlcmZhY2U+IGdldEFBdWRpb1NlcnZpY2UoKTsKKworICAgIHZvaWQgZHJvcEFBdWRpb1NlcnZpY2UoKTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgKaW5kZXggOWMyOGNjNy4uNWQxMTUxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oCkBAIC0yMCwxMSArMjAsMTEgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9DbGllbnQuaD4KIAorI2luY2x1ZGUgImFhdWRpby9JQUF1ZGlvQ2xpZW50LmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlRGVmaW5pdGlvbnMuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCiAKIC8qKgogICogVGhpcyBoYXMgdGhlIHNhbWUgbWV0aG9kcyBhcyBJQUF1ZGlvU2VydmljZSBidXQgd2l0aG91dCB0aGUgQmluZGVyIGZlYXR1cmVzLgpAQCAtNDAsNyArNDAsNyBAQAogICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKSB7fTsKICAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCkgPSBkZWZhdWx0OwogCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklBQXVkaW9DbGllbnQ+JiBjbGllbnQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3QgYW5kcm9pZDo6c3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHJlcXVlc3QgaW5mbyBuZWVkZWQgdG8gY3JlYXRlIHRoZSBzdHJlYW0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCBiNzg1Zjg4Li4yZDUwMWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0yMywxMDEgKzIzLDY2IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KLQogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgogCi11c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLQogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpIHt9Ci1BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp+QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpIHt9Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ7CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0RGV2aWNlSWQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVzUGVyRnJhbWUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldFNoYXJpbmdNb2RlKCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRVc2FnZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0Q29udGVudFR5cGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0UHJlc2V0KCkpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTZXNzaW9uSWQoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoaXNQcml2YWN5U2Vuc2l0aXZlKCkgPyAxIDogMCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci1lcnJvcjoKLSAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbihjb25zdCBTdHJlYW1QYXJhbWV0ZXJzJiBwYXJjZWxhYmxlKSB7CisgICAgc2V0U2FtcGxlc1BlckZyYW1lKHBhcmNlbGFibGUuc2FtcGxlc1BlckZyYW1lKTsKKyAgICBzZXRTYW1wbGVSYXRlKHBhcmNlbGFibGUuc2FtcGxlUmF0ZSk7CisgICAgc2V0RGV2aWNlSWQocGFyY2VsYWJsZS5kZXZpY2VJZCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5zaGFyaW5nTW9kZSkpOworICAgIHNldFNoYXJpbmdNb2RlKHBhcmNlbGFibGUuc2hhcmluZ01vZGUpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOworICAgIHNldEZvcm1hdChzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocGFyY2VsYWJsZS5hdWRpb0Zvcm1hdCkpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuZGlyZWN0aW9uKSk7CisgICAgc2V0RGlyZWN0aW9uKHBhcmNlbGFibGUuZGlyZWN0aW9uKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhdWRpb191c2FnZV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS51c2FnZSkpOworICAgIHNldFVzYWdlKHBhcmNlbGFibGUudXNhZ2UpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19jb250ZW50X3R5cGVfdCkgPT0gc2l6ZW9mKHBhcmNlbGFibGUuY29udGVudFR5cGUpKTsKKyAgICBzZXRDb250ZW50VHlwZShwYXJjZWxhYmxlLmNvbnRlbnRUeXBlKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9faW5wdXRfcHJlc2V0X3QpID09IHNpemVvZihwYXJjZWxhYmxlLmlucHV0UHJlc2V0KSk7CisgICAgc2V0SW5wdXRQcmVzZXQocGFyY2VsYWJsZS5pbnB1dFByZXNldCk7CisgICAgc2V0QnVmZmVyQ2FwYWNpdHkocGFyY2VsYWJsZS5idWZmZXJDYXBhY2l0eSk7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHNpemVvZihhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90KSA9PSBzaXplb2YocGFyY2VsYWJsZS5hbGxvd2VkQ2FwdHVyZVBvbGljeSkpOworICAgIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHBhcmNlbGFibGUuYWxsb3dlZENhcHR1cmVQb2xpY3kpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zZXNzaW9uX2lkX3QpID09IHNpemVvZihwYXJjZWxhYmxlLnNlc3Npb25JZCkpOworICAgIHNldFNlc3Npb25JZChwYXJjZWxhYmxlLnNlc3Npb25JZCk7CisgICAgc2V0UHJpdmFjeVNlbnNpdGl2ZShwYXJjZWxhYmxlLmlzUHJpdmFjeVNlbnNpdGl2ZSk7CiB9CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgaW50MzJfdCB2YWx1ZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0RGV2aWNlSWQodmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRTYW1wbGVSYXRlKHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0U2FtcGxlc1BlckZyYW1lKHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CitBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJgorQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6b3BlcmF0b3I9KGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpIHsKKyAgICB0aGlzLT5+QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpOworICAgIG5ldyAodGhpcykgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbihwYXJjZWxhYmxlKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CiAKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0RGlyZWN0aW9uKChhYXVkaW9fZGlyZWN0aW9uX3QpIHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0QnVmZmVyQ2FwYWNpdHkodmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRVc2FnZSgoYWF1ZGlvX3VzYWdlX3QpIHZhbHVlKTsKLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc2V0Q29udGVudFR5cGUoKGFhdWRpb19jb250ZW50X3R5cGVfdCkgdmFsdWUpOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRJbnB1dFByZXNldCgoYWF1ZGlvX2lucHV0X3ByZXNldF90KSB2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KChhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90KSB2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldFByaXZhY3lTZW5zaXRpdmUodmFsdWUgPT0gMSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotZXJyb3I6Ci0gICAgQUxPR0UoIiVzKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworU3RyZWFtUGFyYW1ldGVycyBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjpwYXJjZWxhYmxlKCkgY29uc3QgeworICAgIFN0cmVhbVBhcmFtZXRlcnMgcmVzdWx0OworICAgIHJlc3VsdC5zYW1wbGVzUGVyRnJhbWUgPSBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICByZXN1bHQuc2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKKyAgICByZXN1bHQuZGV2aWNlSWQgPSBnZXREZXZpY2VJZCgpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgPT0gc2l6ZW9mKHJlc3VsdC5zaGFyaW5nTW9kZSkpOworICAgIHJlc3VsdC5zaGFyaW5nTW9kZSA9IGdldFNoYXJpbmdNb2RlKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fZm9ybWF0X3QpID09IHNpemVvZihyZXN1bHQuYXVkaW9Gb3JtYXQpKTsKKyAgICByZXN1bHQuYXVkaW9Gb3JtYXQgPSBzdGF0aWNfY2FzdDxBdWRpb0Zvcm1hdD4oZ2V0Rm9ybWF0KCkpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGFhdWRpb19kaXJlY3Rpb25fdCkgPT0gc2l6ZW9mKHJlc3VsdC5kaXJlY3Rpb24pKTsKKyAgICByZXN1bHQuZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYXVkaW9fdXNhZ2VfdCkgPT0gc2l6ZW9mKHJlc3VsdC51c2FnZSkpOworICAgIHJlc3VsdC51c2FnZSA9IGdldFVzYWdlKCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2NvbnRlbnRfdHlwZV90KSA9PSBzaXplb2YocmVzdWx0LmNvbnRlbnRUeXBlKSk7CisgICAgcmVzdWx0LmNvbnRlbnRUeXBlID0gZ2V0Q29udGVudFR5cGUoKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihhYXVkaW9faW5wdXRfcHJlc2V0X3QpID09IHNpemVvZihyZXN1bHQuaW5wdXRQcmVzZXQpKTsKKyAgICByZXN1bHQuaW5wdXRQcmVzZXQgPSBnZXRJbnB1dFByZXNldCgpOworICAgIHJlc3VsdC5idWZmZXJDYXBhY2l0eSA9IGdldEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCkgPT0gc2l6ZW9mKHJlc3VsdC5hbGxvd2VkQ2FwdHVyZVBvbGljeSkpOworICAgIHJlc3VsdC5hbGxvd2VkQ2FwdHVyZVBvbGljeSA9IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCk7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoYWF1ZGlvX3Nlc3Npb25faWRfdCkgPT0gc2l6ZW9mKHJlc3VsdC5zZXNzaW9uSWQpKTsKKyAgICByZXN1bHQuc2Vzc2lvbklkID0gZ2V0U2Vzc2lvbklkKCk7CisgICAgcmVzdWx0LmlzUHJpdmFjeVNlbnNpdGl2ZSA9IGlzUHJpdmFjeVNlbnNpdGl2ZSgpOworICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaAppbmRleCBiMzI0ODk2Li5mNDI4ZWIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmgKQEAgLTIwLDI0ICsyMCwyNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9TdHJlYW1QYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAKLXVzaW5nIGFuZHJvaWQ6OnN0YXR1c190OwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsOwotdXNpbmcgYW5kcm9pZDo6UGFyY2VsYWJsZTsKLQogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycywgcHVibGljIFBhcmNlbGFibGUgeworLy8gVGhpcyBpcyBhIGhvbGRlciBmb3IgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycywgd2hpY2ggYWxsb3dzIGNvbnZlcnNpb24gdG8vZnJvbSBpdCBwYXJjZWxhYmxlCisvLyByZXByZXNlbnRhdGlvbiwgU3RyZWFtUGFyYW1ldGVycy4KK2NsYXNzIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gOiBwdWJsaWMgQUF1ZGlvU3RyZWFtUGFyYW1ldGVycyB7CiBwdWJsaWM6Ci0gICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbigpOwotICAgIHZpcnR1YWwgfkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24oKTsKKyAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKCkgPSBkZWZhdWx0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgICBleHBsaWNpdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uKGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFN0cmVhbVBhcmFtZXRlcnMmIHBhcmNlbGFibGUpOworCisgICAgU3RyZWFtUGFyYW1ldGVycyBwYXJjZWxhYmxlKCkgY29uc3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcAppbmRleCBjMzBjNWI5Li44ZDkwMDM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuY3BwCkBAIC0yMSw2NyArMjEsMjggQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKIAotdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7Ci11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Ci0KIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKLUFBdWRpb1N0cmVhbVJlcXVlc3Q6OkFBdWRpb1N0cmVhbVJlcXVlc3QoKQotICAgIDogbUNvbmZpZ3VyYXRpb24oKQotICAgIHt9Ci0KLUFBdWRpb1N0cmVhbVJlcXVlc3Q6On5BQXVkaW9TdHJlYW1SZXF1ZXN0KCkge30KLQotc3RhdHVzX3QgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgbVVzZXJJZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSW5TZXJ2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gbUNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci0KLWVycm9yOgotICAgIEFMT0dFKCJ3cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworQUF1ZGlvU3RyZWFtUmVxdWVzdDo6QUF1ZGlvU3RyZWFtUmVxdWVzdChjb25zdCBTdHJlYW1SZXF1ZXN0JiBwYXJjZWxhYmxlKSA6CisgICAgICAgIG1Db25maWd1cmF0aW9uKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnBhcmFtcykpLAorICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UocGFyY2VsYWJsZS5hdHRyaWJ1dGlvblNvdXJjZSksCisgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQocGFyY2VsYWJsZS5zaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpLAorICAgICAgICBtSW5TZXJ2aWNlKHBhcmNlbGFibGUuaW5TZXJ2aWNlKSB7CiB9CiAKLXN0YXR1c190IEFBdWRpb1N0cmVhbVJlcXVlc3Q6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgaW50MzJfdCB0ZW1wOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ0ZW1wKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIG1Vc2VySWQgPSAodWlkX3QpIHRlbXA7Ci0KLSAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbUluU2VydmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IG1Db25maWd1cmF0aW9uLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLQotZXJyb3I6Ci0gICAgQUxPR0UoInJlYWRGcm9tUGFyY2VsKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7CitTdHJlYW1SZXF1ZXN0IEFBdWRpb1N0cmVhbVJlcXVlc3Q6OnBhcmNlbGFibGUoKSBjb25zdCB7CisgICAgU3RyZWFtUmVxdWVzdCByZXN1bHQ7CisgICAgcmVzdWx0LnBhcmFtcyA9IHN0ZDo6bW92ZShtQ29uZmlndXJhdGlvbikucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5hdHRyaWJ1dGlvblNvdXJjZSA9IG1BdHRyaWJ1dGlvblNvdXJjZTsKKyAgICByZXN1bHQuc2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsKKyAgICByZXN1bHQuaW5TZXJ2aWNlID0gbUluU2VydmljZTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6dmFsaWRhdGUoKSBjb25zdCB7CkBAIC04OSw4ICs1MCw3IEBACiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUmVxdWVzdDo6ZHVtcCgpIGNvbnN0IHsKLSAgICBBTE9HRCgibVVzZXJJZCAgICA9ICVkIiwgbVVzZXJJZCk7Ci0gICAgQUxPR0QoIm1Qcm9jZXNzSWQgPSAlZCIsIG1Qcm9jZXNzSWQpOworICAgIEFMT0dEKCJtQXR0cmlidXRpb25Tb3VyY2UgID0gJXMiLCBtQXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICBBTE9HRCgibVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9ICVkIiwgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCk7CiAgICAgQUxPR0QoIm1JblNlcnZpY2UgPSAlZCIsIG1JblNlcnZpY2UpOwogICAgIG1Db25maWd1cmF0aW9uLmR1bXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtUmVxdWVzdC5oCmluZGV4IDQ5MmY2OWQuLmNjNDNhNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaApAQCAtMjAsMzYgKzIwLDI4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8YWF1ZGlvL1N0cmVhbVJlcXVlc3QuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgotCi11c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIEFBdWRpb1N0cmVhbVJlcXVlc3QgOiBwdWJsaWMgUGFyY2VsYWJsZSB7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCitjbGFzcyBBQXVkaW9TdHJlYW1SZXF1ZXN0IHsKIHB1YmxpYzoKLSAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0KCk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU3RyZWFtUmVxdWVzdCgpOworICAgIEFBdWRpb1N0cmVhbVJlcXVlc3QoKSA9IGRlZmF1bHQ7CiAKLSAgICB1aWRfdCBnZXRVc2VySWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVXNlcklkOworICAgIC8vIENvbnN0cnVjdCBiYXNlZCBvbiBhIHBhcmNlbGFibGUgcmVwcmVzZW50YXRpb24uCisgICAgZXhwbGljaXQgQUF1ZGlvU3RyZWFtUmVxdWVzdChjb25zdCBTdHJlYW1SZXF1ZXN0JiBwYXJjZWxhYmxlKTsKKworICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgJmdldEF0dHJpYnV0aW9uU291cmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUF0dHJpYnV0aW9uU291cmNlOwogICAgIH0KIAotICAgIHZvaWQgc2V0VXNlcklkKHVpZF90IHVzZXJJZCkgewotICAgICAgICBtVXNlcklkID0gdXNlcklkOwotICAgIH0KLQotICAgIHBpZF90IGdldFByb2Nlc3NJZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Qcm9jZXNzSWQ7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRQcm9jZXNzSWQocGlkX3QgcHJvY2Vzc0lkKSB7Ci0gICAgICAgIG1Qcm9jZXNzSWQgPSBwcm9jZXNzSWQ7CisgICAgdm9pZCBzZXRBdHRyaWJ1dGlvblNvdXJjZShjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UgPSBhdHRyaWJ1dGlvblNvdXJjZTsKICAgICB9CiAKICAgICBib29sIGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkgY29uc3QgewpAQCAtNzYsMTggKzY4LDE2IEBACiAgICAgICAgIG1JblNlcnZpY2UgPSBpblNlcnZpY2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAotcHJvdGVjdGVkOgorICAgIC8vIEV4dHJhY3QgYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgorICAgIFN0cmVhbVJlcXVlc3QgcGFyY2VsYWJsZSgpIGNvbnN0OworCitwcml2YXRlOgogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gIG1Db25maWd1cmF0aW9uOwotICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgIG1Vc2VySWQgPSAodWlkX3QpIC0xOwotICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzSWQgPSAocGlkX3QpIC0xOworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgbUF0dHJpYnV0aW9uU291cmNlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSW5TZXJ2aWNlID0gZmFsc2U7IC8vIFN0cmVhbSBvcGVuZWQgYnkgQUF1ZGlvc2VydmljZQogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuY3BwCmluZGV4IDYxZDdkMjcuLmFhNGFjMjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcApAQCAtMjksMjIgKzI5LDQzIEBACiAjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQ7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbjsKIHVzaW5nIGFuZHJvaWQ6Ok5PX0VSUk9SOwogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi0vKioKLSAqIENvbnRhaW5lciBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lc3NhZ2UgcXVldWVzIHBsdXMKLSAqIGdlbmVyYWwgc3RyZWFtIGluZm9ybWF0aW9uIG5lZWRlZCBieSBBQXVkaW8gY2xpZW50cy4KLSAqIEl0IGNvbnRhaW5zIG5vIGFkZHJlc3NlcywganVzdCBzaXplcywgb2Zmc2V0cyBhbmQgZmlsZSBkZXNjcmlwdG9ycyBmb3IKLSAqIHNoYXJlZCBtZW1vcnkgdGhhdCBjYW4gYmUgcGFzc2VkIHRocm91Z2ggQmluZGVyLgotICovCi1BdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6QXVkaW9FbmRwb2ludFBhcmNlbGFibGUoKSB7fQorQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKEVuZHBvaW50JiYgcGFyY2VsYWJsZSkKKyAgICAgICAgOiBtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZS5kb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1VcERhdGFRdWV1ZVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUudXBEYXRhUXVldWVQYXJjZWxhYmxlKSksCisgICAgICAgICAgbURvd25EYXRhUXVldWVQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLmRvd25EYXRhUXVldWVQYXJjZWxhYmxlKSksCisgICAgICAgICAgbU51bVNoYXJlZE1lbW9yaWVzKHBhcmNlbGFibGUuc2hhcmVkTWVtb3JpZXMuc2l6ZSgpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzLnNpemUoKSAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CisgICAgICAgIC8vIFJlLWNvbnN0cnVjdC4KKyAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLn5TaGFyZWRNZW1vcnlQYXJjZWxhYmxlKCk7CisgICAgICAgIG5ldygmbVNoYXJlZE1lbW9yaWVzW2ldKSBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnNoYXJlZE1lbW9yaWVzW2ldKSk7CisgICAgfQorfQogCi1BdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6fkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKCkge30KK0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlJiBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6b3BlcmF0b3I9KEVuZHBvaW50JiYgcGFyY2VsYWJsZSkgeworICAgIHRoaXMtPn5BdWRpb0VuZHBvaW50UGFyY2VsYWJsZSgpOworICAgIG5ldyh0aGlzKSBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZShzdGQ6Om1vdmUocGFyY2VsYWJsZSkpOworICAgIHJldHVybiAqdGhpczsKK30KKworRW5kcG9pbnQgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSYmIHsKKyAgICBFbmRwb2ludCByZXN1bHQ7CisgICAgcmVzdWx0LnVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtVXBNZXNzYWdlUXVldWVQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC51cERhdGFRdWV1ZVBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVVwRGF0YVF1ZXVlUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5kb3duRGF0YVF1ZXVlUGFyY2VsYWJsZSA9IHN0ZDo6bW92ZShtRG93bkRhdGFRdWV1ZVBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICByZXN1bHQuc2hhcmVkTWVtb3JpZXMucmVzZXJ2ZShzdGQ6Om1pbihtTnVtU2hhcmVkTWVtb3JpZXMsIE1BWF9TSEFSRURfTUVNT1JJRVMpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllcyAmJiBpIDwgTUFYX1NIQVJFRF9NRU1PUklFUzsgKytpKSB7CisgICAgICAgIHJlc3VsdC5zaGFyZWRNZW1vcmllcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKG1TaGFyZWRNZW1vcmllc1tpXSkucGFyY2VsYWJsZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAogLyoqCiAgKiBBZGQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgdGFibGUuCkBAIC02MCw2MCArODEsNiBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAotLyoqCi0gKiBUaGUgcmVhZCBhbmQgd3JpdGUgbXVzdCBiZSBzeW1tZXRyaWMuCi0gKi8KLXN0YXR1c190IEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtTnVtU2hhcmVkTWVtb3JpZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1TaGFyZWRNZW1vcmllczsgaSsrKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1TaGFyZWRNZW1vcmllc1tpXS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHN0YXR1cyA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25NZXNzYWdlUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IG1VcERhdGFRdWV1ZVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9FbmRwb2ludFBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1OdW1TaGFyZWRNZW1vcmllcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU51bVNoYXJlZE1lbW9yaWVzOyBpKyspIHsKLSAgICAgICAgbVNoYXJlZE1lbW9yaWVzW2ldLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHN0YXR1cyA9IG1VcE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHN0YXR1cyA9IG1Eb3duTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbVVwRGF0YVF1ZXVlUGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgc3RhdHVzID0gbURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLQotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLQotZXJyb3I6Ci0gICAgQUxPR0UoIiVzIHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZTo6cmVzb2x2ZShFbmRwb2ludERlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZS5yZXNvbHZlKG1TaGFyZWRNZW1vcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPnVwTWVzc2FnZVF1ZXVlRGVzY3JpcHRvcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCmluZGV4IGU0ZjhiOWUuLjUyMzdhMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oCkBAIC0yMCwxNiArMjAsMTMgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogLy8jaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxhYXVkaW8vRW5kcG9pbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgogI2luY2x1ZGUgImJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWw7Ci11c2luZyBhbmRyb2lkOjpQYXJjZWxhYmxlOwogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIApAQCAtMzksMTAgKzM2LDE1IEBACiAgKiBJdCBjb250YWlucyBubyBhZGRyZXNzZXMsIGp1c3Qgc2l6ZXMsIG9mZnNldHMgYW5kIGZpbGUgZGVzY3JpcHRvcnMgZm9yCiAgKiBzaGFyZWQgbWVtb3J5IHRoYXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIEJpbmRlci4KICAqLwotY2xhc3MgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitjbGFzcyBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb0VuZHBvaW50UGFyY2VsYWJsZSgpOworICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworCisgICAgLy8gQ3Rvci9hc3NpZ25tZW50IGZyb20gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgIC8vIFNpbmNlIHRoZSBwYXJjZWxhYmxlIG9iamVjdCBvd25zIHVuaXF1ZSBGRHMgKGZvciBzaGFyZWQgbWVtb3J5IGJsb2NrcyksIG1vdmUgc2VtYW50aWNzIGFyZQorICAgIC8vIHByb3ZpZGVkIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGR1cGUuCisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUoRW5kcG9pbnQmJiBwYXJjZWxhYmxlKTsKKyAgICBBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSYgb3BlcmF0b3I9KEVuZHBvaW50JiYgcGFyY2VsYWJsZSk7CiAKICAgICAvKioKICAgICAgKiBBZGQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgdGFibGUuCkBAIC01MCwxNiArNTIsMTcgQEAKICAgICAgKi8KICAgICBpbnQzMl90IGFkZEZpbGVEZXNjcmlwdG9yKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQsIGludDMyX3Qgc2l6ZUluQnl0ZXMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoRW5kcG9pbnREZXNjcmlwdG9yICpkZXNjcmlwdG9yKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpOwogCiAgICAgdm9pZCBkdW1wKCk7CiAKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAvLyBTaW5jZSBvdXIgc2hhcmVkIG1lbW9yeSBvYmplY3RzIG93biBhIHVuaXF1ZSBGRCwgbW92ZSBzZW1hbnRpY3MgYXJlIHByb3ZpZGVkIHRvIGF2b2lkIHRoZQorICAgIC8vIG5lZWQgdG8gZHVwZS4KKyAgICBFbmRwb2ludCBwYXJjZWxhYmxlKCkmJjsKKwogcHVibGljOiAvLyBUT0RPIGFkZCBnZXR0ZXJzCiAgICAgLy8gU2V0IGNhcGFjaXR5SW5GcmFtZXMgdG8gemVybyBpZiBRdWV1ZSBpcyB1bnVzZWQuCiAgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUgICAgbVVwTWVzc2FnZVF1ZXVlUGFyY2VsYWJsZTsgICAvLyBzZXJ2ZXIgdG8gY2xpZW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OWM0ZTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotCi0jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5oIgotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Q7Ci0KLS8qKgotICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBBQXVkaW8gU2VydmljZSB0byB0YWxrIHRvIGFuIEFBdWRpbyBDbGllbnQuCi0gKgotICogVGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFBhcmNlbHMgbXVzdCBtYXRjaCB3aXRoIGNvZGUgaW4gQUF1ZGlvQ2xpZW50LmNwcC4KLSAqLwotY2xhc3MgQnBBQXVkaW9DbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUFBdWRpb0NsaWVudD4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEFBdWRpb0NsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQUF1ZGlvQ2xpZW50PihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUsIGludDMyX3Qgb3Bjb2RlLCBpbnQzMl90IHZhbHVlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9DbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIob3Bjb2RlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHZhbHVlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9OX1NUUkVBTV9DSEFOR0UsIGRhdGEsICAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLX07Ci0KLS8vIEltcGxlbWVudCBhbiBpbnRlcmZhY2UgdG8gdGhlIHNlcnZpY2UuCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvQ2xpZW50LCAiSUFBdWRpb0NsaWVudCIpOwotCi0vLyBUaGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgUGFyY2VscyBtdXN0IG1hdGNoIHdpdGggY29kZSBpbiBCcEFBdWRpb0NsaWVudAotCi1zdGF0dXNfdCBCbkFBdWRpb0NsaWVudDo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlOwotICAgIGludDMyX3Qgb3Bjb2RlID0gMDsKLSAgICBpbnQzMl90IHZhbHVlID0gMDsKLSAgICBBTE9HVigiQm5BQXVkaW9DbGllbnQ6Om9uVHJhbnNhY3QoJXUpICV1IiwgY29kZSwgZmxhZ3MpOwotCi0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBPTl9TVFJFQU1fQ0hBTkdFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBkYXRhLnJlYWRJbnQzMigmb3Bjb2RlKTsKLSAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCZ2YWx1ZSk7Ci0gICAgICAgICAgICBvblN0cmVhbUNoYW5nZShzdHJlYW1IYW5kbGUsIG9wY29kZSwgdmFsdWUpOwotICAgICAgICAgICAgQUxPR0QoIkJuQUF1ZGlvQ2xpZW50IG9uU3RyZWFtQ2hhbmdlKCV4LCAlZCwgJWQpIiwgc3RyZWFtSGFuZGxlLCBvcGNvZGUsIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gQUxPR1coIkJuQUF1ZGlvQ2xpZW50OjpvblRyYW5zYWN0IG5vdCBoYW5kbGVkICV1IiwgY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWZkOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQUFVRElPX0lBQVVESU9fQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9BQVVESU9fSUFBVURJT19DTElFTlRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi0vLyBJbnRlcmZhY2UgKG91ciBBSURMKSAtIGNsaWVudCBtZXRob2RzIGNhbGxlZCBieSBzZXJ2aWNlCi1jbGFzcyBJQUF1ZGlvQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UgewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBQXVkaW9DbGllbnQpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uU3RyZWFtQ2hhbmdlKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpID0gMDsKLQotfTsKLQotY2xhc3MgQm5BQXVkaW9DbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUFBdWRpb0NsaWVudD4gewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19IC8qIG5hbWVzcGFjZSBhbmRyb2lkICovCi0KLSNlbmRpZiAvL0FORFJPSURfQUFVRElPX0lBQVVESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxN2IzYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFBdWRpbyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VEZWZpbml0aW9ucy5oIgotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKLSNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90OwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgQUF1ZGlvIENsaWVudCB0byB0YWxrIHRvIHRoZSBBQXVkaW8gU2VydmljZS4KLSAqCi0gKiBUaGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgUGFyY2VscyBtdXN0IG1hdGNoIHdpdGggY29kZSBpbiBBQXVkaW9TZXJ2aWNlLmNwcC4KLSAqLwotY2xhc3MgQnBBQXVkaW9TZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBQXVkaW9TZXJ2aWNlPgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQUF1ZGlvU2VydmljZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQUF1ZGlvU2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9DTElFTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgYWF1ZGlvX2hhbmRsZV90IG9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIC8vIHJlcXVlc3QuZHVtcCgpOwotICAgICAgICByZXF1ZXN0LndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBvcGVuU3RyZWFtIHRyYW5zYWN0IGZhaWxlZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtOwotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoJnN0cmVhbSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChPUEVOX1NUUkVBTSkgcmVhZEludCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IGNvbmZpZ3VyYXRpb25PdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IG9wZW5TdHJlYW0gcmVhZEZyb21QYXJjZWwgZmFpbGVkICVkIiwgZXJyKTsKLSAgICAgICAgICAgIGNsb3NlU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IGNsb3NlU3RyZWFtIHRyYW5zYWN0IGZhaWxlZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgdHJhbnNhY3QoR0VUX1NUUkVBTV9ERVNDUklQVElPTikgcmV0dXJucyAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoJnJlc3VsdCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OKSByZWFkSW50ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCBHRVRfU1RSRUFNX0RFU0NSSVBUSU9OIHBhc3NlZCByZXN1bHQgJWQiLCByZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChHRVRfU1RSRUFNX0RFU0NSSVBUSU9OKSByZWFkIGVuZHBvaW50ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETyBzaG91bGQgd2Ugd2FpdCBmb3IgYSByZXBseT8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgLy8gc2VuZCBjb21tYW5kCi0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQUF1ZGlvU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChQQVVTRV9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1IYW5kbGUpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoRkxVU0hfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKQotICAgIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBQXVkaW9TZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRUaHJlYWRJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChwZXJpb2ROYW5vc2Vjb25kcyk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9BVURJT19USFJFQUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHBhcnNlIHJlcGx5Ci0gICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXM7Ci0gICAgICAgIHJlcGx5LnJlYWRJbnQzMigmcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpCi0gICAgb3ZlcnJpZGUgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIHNlbmQgY29tbWFuZAotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUFBdWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJlYW1IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudFRocmVhZElkKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfQVVESU9fVEhSRUFELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBwYXJzZSByZXBseQotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzOwotICAgICAgICByZXBseS5yZWFkSW50MzIoJnJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi19OwotCi0vLyBJbXBsZW1lbnQgYW4gaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlLgotLy8gVGhpcyBpcyBoZXJlIHNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gbGluayB3aXRoIGxpYmFhdWRpbyBzdGF0aWMgbGlicmFyeS4KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBQXVkaW9TZXJ2aWNlLCAiSUFBdWRpb1NlcnZpY2UiKTsKLQotLy8gVGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIFBhcmNlbHMgbXVzdCBtYXRjaCB3aXRoIGNvZGUgaW4gQnBBQXVkaW9TZXJ2aWNlCi0KLXN0YXR1c190IEJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlID0gMDsKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgcmVxdWVzdDsKLSAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKLSAgICBwaWRfdCB0aWQgPSAwOwotICAgIGludDY0X3QgbmFub3NlY29uZHMgPSAwOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCglaSkgJWkiLCBjb2RlLCBmbGFncyk7Ci0KLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIFJFR0lTVEVSX0NMSUVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQUF1ZGlvQ2xpZW50PiBjbGllbnQgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvQ2xpZW50PigKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgLy8gcmVhZFN0cm9uZ0JpbmRlcigpIGNhbiByZXR1cm4gbnVsbAotICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQ0xJRU5UKSBjbGllbnQgaXMgTlVMTCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTYyMzA0NTMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgT1BFTl9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVxdWVzdC5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXF1ZXN0LnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSA9IHJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRCgiQm5BQXVkaW9TZXJ2aWNlOjpjbGllbnQgb3BlblN0cmVhbSByZXF1ZXN0IGR1bXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgICAgICAvL3JlcXVlc3QuZHVtcCgpOwotICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIHRoZSB1aWQgYW5kIHBpZCBmcm9tIHRoZSBjbGllbnQgaW4gY2FzZSB0aGV5IGFyZSBpbmNvcnJlY3QuCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRVc2VySWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFByb2Nlc3NJZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSA9IG9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRCgiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IE9QRU5fU1RSRUFNIHNlcnZlciBoYW5kbGUgPSAweCUwOFgiLAotICAgICAgICAgICAgICAgIC8vICAgICAgICBzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ud3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDTE9TRV9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoQ0xPU0VfU1RSRUFNKSBzdHJlYW1IYW5kbGUgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gY2xvc2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIC8vQUxPR0QoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBDTE9TRV9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAvLyAgICAgIHN0cmVhbUhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfU1RSRUFNX0RFU0NSSVBUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6OiVzKEdFVF9TVFJFQU1fREVTQ1JJUFRJT04pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlIHBhcmNlbGFibGU7Ci0gICAgICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMocmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBUlRfU1RSRUFNOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCbkFBdWRpb1NlcnZpY2U6OiVzKFNUQVJUX1NUUkVBTSkgc3RyZWFtSGFuZGxlIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFNUQVJUX1NUUkVBTSAweCUwOFgsIHJlc3VsdCA9ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFBBVVNFX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhQQVVTRV9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBwYXVzZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBQQVVTRV9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUF9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoU1RPUF9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBzdG9wU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFNUT1BfU1RSRUFNIDB4JTA4WCwgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgc3RyZWFtSGFuZGxlLCByZXN1bHQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEZMVVNIX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBQXVkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhGTFVTSF9TVFJFQU0pIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBmbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1YoIkJuQUF1ZGlvU2VydmljZTo6b25UcmFuc2FjdCBGTFVTSF9TVFJFQU0gMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbUhhbmRsZSwgcmVzdWx0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQVVESU9fVEhSRUFEKSBzdHJlYW1IYW5kbGUgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnRpZCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQVVESU9fVEhSRUFEKSB0aWQgZmFpbGVkISIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50NjQoJm5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhSRUdJU1RFUl9BVURJT19USFJFQUQpIG5hbm9zZWNvbmRzIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCB0aWQsIG5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIEFMT0dWKCJCbkFBdWRpb1NlcnZpY2U6OiVzKFJFR0lTVEVSX0FVRElPX1RIUkVBRCkgMHglMDhYLCByZXN1bHQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgVU5SRUdJU1RFUl9BVURJT19USFJFQUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN0cmVhbUhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoVU5SRUdJU1RFUl9BVURJT19USFJFQUQpIHN0cmVhbUhhbmRsZSBmYWlsZWQhIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdGlkKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhVTlJFR0lTVEVSX0FVRElPX1RIUkVBRCkgdGlkIGZhaWxlZCEiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHVucmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsIHRpZCk7Ci0gICAgICAgICAgICBBTE9HVigiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IFVOUkVHSVNURVJfQVVESU9fVEhSRUFEIDB4JTA4WCwgcmVzdWx0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1IYW5kbGUsIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBBTE9HVygiQm5BQXVkaW9TZXJ2aWNlOjpvblRyYW5zYWN0IG5vdCBoYW5kbGVkICV1IiwgY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkYjgyNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9UZXh0T3V0cHV0Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KLQotI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCi0jaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlRGVmaW5pdGlvbnMuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvQ2xpZW50LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotI2RlZmluZSBBQVVESU9fU0VSVklDRV9OQU1FICAibWVkaWEuYWF1ZGlvIgotCi0vLyBJbnRlcmZhY2UgKG91ciBBSURMKSAtIHNlcnZpY2UgbWV0aG9kcyBjYWxsZWQgYnkgY2xpZW50Ci1jbGFzcyBJQUF1ZGlvU2VydmljZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKLXB1YmxpYzoKLQotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQUF1ZGlvU2VydmljZSk7Ci0KLSAgICAvLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgotICAgIC8vIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBQXVkaW8gc2VydmljZSBkaXNyZWdhcmRzIGFueSByZWdpc3RyYXRpb25zIGFmdGVyIHRoZSBmaXJzdC4KLSAgICAvLyBUaHVzIHRoZSBJQUF1ZGlvQ2xpZW50IG11c3QgYmUgYSBzaW5nbGV0b24gcGVyIHByb2Nlc3MuCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpID0gMDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IGluZm8gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNyZWF0ZWQgc3RyZWFtCi0gICAgICogQHJldHVybiBoYW5kbGUgdG8gdGhlIHN0cmVhbSBvciBhIG5lZ2F0aXZlIGVycm9yCi0gICAgICovCi0gICAgdmlydHVhbCBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpID0gMDsKLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW4tbWVtb3J5IHF1ZXVlcwotICAgICogdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICovCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0U3RyZWFtRGVzY3JpcHRpb24oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCB0aGUgZmxvdyBvZiBkYXRhLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBTVEFSVEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCi0gICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIFBBVVNFRCBldmVudC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpID0gMDsKLQotICAgIC8qKgotICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzdWNoIHRoYXQgdGhlIGRhdGEgY3VycmVudGx5IGluIHRoZSBidWZmZXIgaXMgcGxheWVkLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBTVE9QUEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiAgRGlzY2FyZCBhbnkgZGF0YSBoZWxkIGJ5IHRoZSB1bmRlcmx5aW5nIEhBTCBvciBTZXJ2aWNlLgotICAgICAqIFRoaXMgaXMgYXN5bmNocm9ub3VzLiBXaGVuIGNvbXBsZXRlLCB0aGUgc2VydmljZSB3aWxsIHNlbmQgYSBGTFVTSEVEIGV2ZW50LgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgPSAwOwotCi0gICAgLyoqCi0gICAgICogTWFuYWdlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGFzIGEgbG93IGxhdGVuY3kgYXVkaW8gdGhyZWFkLgotICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFRocmVhZElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMpID0gMDsKLQotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHVucmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgPSAwOwotfTsKLQotY2xhc3MgQm5BQXVkaW9TZXJ2aWNlIDogcHVibGljIEJuSW50ZXJmYWNlPElBQXVkaW9TZXJ2aWNlPiB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotfTsKLQotfSAvKiBuYW1lc3BhY2UgYW5kcm9pZCAqLwotCi0jZW5kaWYgLy9BTkRST0lEX0FBVURJT19JQUFVRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAKaW5kZXggNDk5NmIzZi4uYTRiM2NlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1JpbmdCdWZmZXJQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuY3BwCkBAIC0yOSw4ICsyOSwyOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi1SaW5nQnVmZmVyUGFyY2VsYWJsZTo6UmluZ0J1ZmZlclBhcmNlbGFibGUoKSB7fQotUmluZ0J1ZmZlclBhcmNlbGFibGU6On5SaW5nQnVmZmVyUGFyY2VsYWJsZSgpIHt9CitSaW5nQnVmZmVyUGFyY2VsYWJsZTo6UmluZ0J1ZmZlclBhcmNlbGFibGUoY29uc3QgUmluZ0J1ZmZlciYgcGFyY2VsYWJsZSkKKyAgICAgICAgOiBtUmVhZENvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLnJlYWRDb3VudGVyUGFyY2VsYWJsZSkpLAorICAgICAgICAgIG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKHN0ZDo6bW92ZShwYXJjZWxhYmxlLndyaXRlQ291bnRlclBhcmNlbGFibGUpKSwKKyAgICAgICAgICBtRGF0YVBhcmNlbGFibGUoc3RkOjptb3ZlKHBhcmNlbGFibGUuZGF0YVBhcmNlbGFibGUpKSwKKyAgICAgICAgICBtQnl0ZXNQZXJGcmFtZShwYXJjZWxhYmxlLmJ5dGVzUGVyRnJhbWUpLAorICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdChwYXJjZWxhYmxlLmZyYW1lc1BlckJ1cnN0KSwKKyAgICAgICAgICBtQ2FwYWNpdHlJbkZyYW1lcyhwYXJjZWxhYmxlLmNhcGFjaXR5SW5GcmFtZXMpLAorICAgICAgICAgIG1GbGFncyhzdGF0aWNfY2FzdDxSaW5nYnVmZmVyRmxhZ3M+KHBhcmNlbGFibGUuZmxhZ3MpKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZsYWdzKSA9PSBzaXplb2YocGFyY2VsYWJsZS5mbGFncykpOworfQorCitSaW5nQnVmZmVyIFJpbmdCdWZmZXJQYXJjZWxhYmxlOjpwYXJjZWxhYmxlKCkgY29uc3QgeworICAgIFJpbmdCdWZmZXIgcmVzdWx0OworICAgIHJlc3VsdC5yZWFkQ291bnRlclBhcmNlbGFibGUgPSBzdGQ6Om1vdmUobVJlYWRDb3VudGVyUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC53cml0ZUNvdW50ZXJQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1Xcml0ZUNvdW50ZXJQYXJjZWxhYmxlKS5wYXJjZWxhYmxlKCk7CisgICAgcmVzdWx0LmRhdGFQYXJjZWxhYmxlID0gc3RkOjptb3ZlKG1EYXRhUGFyY2VsYWJsZSkucGFyY2VsYWJsZSgpOworICAgIHJlc3VsdC5ieXRlc1BlckZyYW1lID0gbUJ5dGVzUGVyRnJhbWU7CisgICAgcmVzdWx0LmZyYW1lc1BlckJ1cnN0ID0gbUZyYW1lc1BlckJ1cnN0OworICAgIHJlc3VsdC5jYXBhY2l0eUluRnJhbWVzID0gbUNhcGFjaXR5SW5GcmFtZXM7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZsYWdzKSA9PSBzaXplb2YocmVzdWx0LmZsYWdzKSk7CisgICAgcmVzdWx0LmZsYWdzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUZsYWdzKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCiAvLyBUT0RPIFRoaXMgYXNzdW1lcyB0aGF0IGFsbCB0aHJlZSB1c2UgdGhlIHNhbWUgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZQogdm9pZCBSaW5nQnVmZmVyUGFyY2VsYWJsZTo6c2V0dXBNZW1vcnkoaW50MzJfdCBzaGFyZWRNZW1vcnlJbmRleCwKQEAgLTc2LDU4ICs5Nyw2IEBACiAgICAgbUNhcGFjaXR5SW5GcmFtZXMgPSBjYXBhY2l0eUluRnJhbWVzOwogfQogCi0vKioKLSAqIFRoZSByZWFkIGFuZCB3cml0ZSBtdXN0IGJlIHN5bW1ldHJpYy4KLSAqLwotc3RhdHVzX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1CeXRlc1BlckZyYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtRmxhZ3MpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgICAgICBzdGF0dXMgPSBtUmVhZENvdW50ZXJQYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbVdyaXRlQ291bnRlclBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgICAgICBzdGF0dXMgPSBtRGF0YVBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1DYXBhY2l0eUluRnJhbWVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIGlmIChtQ2FwYWNpdHlJbkZyYW1lcyA+IDApIHsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1CeXRlc1BlckZyYW1lKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKChpbnQzMl90ICopJm1GbGFncyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHN0YXR1cyA9IG1SZWFkQ291bnRlclBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbVdyaXRlQ291bnRlclBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gbURhdGFQYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLWVycm9yOgotICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgUmluZ0J1ZmZlclBhcmNlbGFibGU6OnJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCmluZGV4IDFkYmNmMDcuLjI1MDhjZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgPGFhdWRpby9SaW5nQnVmZmVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZURlZmluaXRpb25zLmgiCkBAIC0yNiwxMCArMjcsMTIgQEAKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLWNsYXNzIFJpbmdCdWZmZXJQYXJjZWxhYmxlIDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgUmluZ0J1ZmZlclBhcmNlbGFibGUgIHsKIHB1YmxpYzoKLSAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSgpOwotICAgIHZpcnR1YWwgflJpbmdCdWZmZXJQYXJjZWxhYmxlKCk7CisgICAgUmluZ0J1ZmZlclBhcmNlbGFibGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDb25zdHJ1Y3QgYmFzZWQgb24gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgIGV4cGxpY2l0IFJpbmdCdWZmZXJQYXJjZWxhYmxlKGNvbnN0IFJpbmdCdWZmZXImIHBhcmNlbGFibGUpOwogCiAgICAgLy8gVE9ETyBUaGlzIGFzc3VtZXMgdGhhdCBhbGwgdGhyZWUgdXNlIHRoZSBzYW1lIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUKICAgICB2b2lkIHNldHVwTWVtb3J5KGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsCkBAIC01NywyMSArNjAsMTQgQEAKIAogICAgIGJvb2wgaXNGaWxlRGVzY3JpcHRvclNhZmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2Vscyk7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgcmVhZCBhbmQgd3JpdGUgbXVzdCBiZSBzeW1tZXRyaWMuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmUoU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSAqbWVtb3J5UGFyY2VscywgUmluZ0J1ZmZlckRlc2NyaXB0b3IgKmRlc2NyaXB0b3IpOwogCiAgICAgdm9pZCBkdW1wKCk7CiAKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICBSaW5nQnVmZmVyIHBhcmNlbGFibGUoKSBjb25zdDsKKwogcHJpdmF0ZToKLQotICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0OwotCiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSAgbVJlYWRDb3VudGVyUGFyY2VsYWJsZTsKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtV3JpdGVDb3VudGVyUGFyY2VsYWJsZTsKICAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlICBtRGF0YVBhcmNlbGFibGU7CkBAIC03OSw2ICs3NSw4IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gMDsgICAgLy8gZm9yIElTT0NIUk9OT1VTIHF1ZXVlcwogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYXBhY2l0eUluRnJhbWVzID0gMDsgIC8vIHplcm8gaWYgdW51c2VkCiAgICAgUmluZ2J1ZmZlckZsYWdzICAgICAgICAgbUZsYWdzID0gUmluZ2J1ZmZlckZsYWdzOjpOT05FOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHZhbGlkYXRlKCkgY29uc3Q7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCBiNmU4NDcyLi5lZWYyMzhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKQEAgLTMzLDYxICszNCwzNyBAQAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogdXNpbmcgYW5kcm9pZDo6Tk9fRVJST1I7CiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7Cit1c2luZyBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbjsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAotU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6U2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpIHt9Ci1TaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjp+U2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpIHt9OworU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6U2hhcmVkTWVtb3J5UGFyY2VsYWJsZShTaGFyZWRGaWxlUmVnaW9uJiYgcGFyY2VsYWJsZSkgeworICAgIG1GZCA9IHBhcmNlbGFibGUuZmQucmVsZWFzZSgpOworICAgIG1TaXplSW5CeXRlcyA9IHBhcmNlbGFibGUuc2l6ZTsKKyAgICBtT2Zmc2V0SW5CeXRlcyA9IHBhcmNlbGFibGUub2Zmc2V0OworfQorCitTaGFyZWRGaWxlUmVnaW9uIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnBhcmNlbGFibGUoKSAmJiB7CisgICAgU2hhcmVkRmlsZVJlZ2lvbiByZXN1bHQ7CisgICAgcmVzdWx0LmZkLnJlc2V0KHN0ZDo6bW92ZShtRmQpKTsKKyAgICByZXN1bHQuc2l6ZSA9IG1TaXplSW5CeXRlczsKKyAgICByZXN1bHQub2Zmc2V0ID0gbU9mZnNldEluQnl0ZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpkdXAoKSBjb25zdCB7CisgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSByZXN1bHQ7CisgICAgcmVzdWx0LnNldHVwKG1GZCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVNpemVJbkJ5dGVzKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7Ci0gICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAorICAgIGNvbnN0ZXhwciBpbnQgbWluRmQgPSAzOyAvLyBza2lwIG92ZXIgc3Rkb3V0LCBzdGRpbiBhbmQgc3RkZXJyCisgICAgbUZkLnJlc2V0KGZjbnRsKGZkLmdldCgpLCBGX0RVUEZEX0NMT0VYRUMsIG1pbkZkKSk7IC8vIHN0b3JlIGEgZHVwbGljYXRlIEZECiAgICAgQUxPR1YoInNldHVwKGZkID0gJWQgLT4gJWQsIHNpemUgPSAlZCkgdGhpcyA9ICVwXG4iLCBmZC5nZXQoKSwgbUZkLmdldCgpLCBzaXplSW5CeXRlcywgdGhpcyk7CiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKLXN0YXR1c190IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplSW5CeXRlcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBBTE9HVigid3JpdGVUb1BhcmNlbCgpIG1GZCA9ICVkLCB0aGlzID0gJXBcbiIsIG1GZC5nZXQoKSwgdGhpcyk7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVbmlxdWVGaWxlRGVzY3JpcHRvcihtRmQpOwotICAgICAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICJTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHdyaXRlRHVwRmlsZURlc2NyaXB0b3IgZmFpbGVkIDogJWQiLAotICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtU2l6ZUluQnl0ZXMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7Ci0KLSAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICAvLyBUaGUgUGFyY2VsIG93bnMgdGhlIGZpbGUgZGVzY3JpcHRvciBhbmQgd2lsbCBjbG9zZSBpdCBsYXRlci4KLSAgICAgICAgdW5pcXVlX2ZkIG1tYXBGZDsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkVW5pcXVlRmlsZURlc2NyaXB0b3IoJm1tYXBGZCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZWFkRnJvbVBhcmNlbCgpIHJlYWRVbmlxdWVGaWxlRGVzY3JpcHRvcigpIGZhaWxlZCA6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNvbHZlIHRoZSBtZW1vcnkgbm93IHdoaWxlIHdlIHN0aWxsIGhhdmUgdGhlIEZEIGZyb20gdGhlIFBhcmNlbC4KLSAgICAgICAgLy8gQ2xvc2luZyB0aGUgRkQgd2lsbCBub3QgYWZmZWN0IHRoZSBzaGFyZWQgbWVtb3J5IG9uY2UgbW1hcCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlc29sdmVTaGFyZWRNZW1vcnkobW1hcEZkKTsKLSAgICAgICAgc3RhdHVzID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMocmVzdWx0KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0KLWVycm9yOgotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpjbG9zZSgpIHsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyAhPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewogICAgICAgICBpbnQgZXJyID0gbXVubWFwKG1SZXNvbHZlZEFkZHJlc3MsIG1TaXplSW5CeXRlcyk7CkBAIC0xMDQsNyArODEsNyBAQAogICAgIG1SZXNvbHZlZEFkZHJlc3MgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaXplSW5CeXRlcywgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELCBmZC5nZXQoKSwgMCk7CiAgICAgaWYgKG1SZXNvbHZlZEFkZHJlc3MgPT0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1MpIHsKLSAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICVkLCBlcnJubyA9ICVzIiwKKyAgICAgICAgQUxPR0UoIm1tYXAoKSBmYWlsZWQgZm9yIGZkID0gJWQsIG5CeXRlcyA9ICUiIFBSSWQ2NCAiLCBlcnJubyA9ICVzIiwKICAgICAgICAgICAgICAgZmQuZ2V0KCksIG1TaXplSW5CeXRlcywgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CkBAIC0xMTgsNyArOTUsNyBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9IGVsc2UgaWYgKChvZmZzZXRJbkJ5dGVzICsgc2l6ZUluQnl0ZXMpID4gbVNpemVJbkJ5dGVzKSB7CiAgICAgICAgIEFMT0dFKCJvdXQgb2YgcmFuZ2UsIG9mZnNldEluQnl0ZXMgPSAlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICJzaXplSW5CeXRlcyA9ICVkLCBtU2l6ZUluQnl0ZXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgInNpemVJbkJ5dGVzID0gJWQsIG1TaXplSW5CeXRlcyA9ICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgb2Zmc2V0SW5CeXRlcywgc2l6ZUluQnl0ZXMsIG1TaXplSW5CeXRlcyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTE0OCw3ICsxMjUsMTEgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2l6ZUluQnl0ZXMgPCAwIHx8IG1TaXplSW5CeXRlcyA+PSBNQVhfTU1BUF9TSVpFX0JZVEVTKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIG1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbVNpemVJbkJ5dGVzID0gJSIgUFJJZDY0LCBtU2l6ZUluQnl0ZXMpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgaWYgKG1PZmZzZXRJbkJ5dGVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbU9mZnNldEluQnl0ZXMgPSAlIiBQUklkNjQsIG1PZmZzZXRJbkJ5dGVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xNTYsNSArMTM3LDUgQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpkdW1wKCkgewogICAgIEFMT0dEKCJtRmQgPSAlZCIsIG1GZC5nZXQoKSk7Ci0gICAgQUxPR0QoIm1TaXplSW5CeXRlcyA9ICVkIiwgbVNpemVJbkJ5dGVzKTsKKyAgICBBTE9HRCgibVNpemVJbkJ5dGVzID0gJSIgUFJJZDY0LCBtU2l6ZUluQnl0ZXMpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggNGVjMzhjNS4uMWYyYzMzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC0yMSwxMiArMjEsMTEgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5oPgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIAotLy8gQXJiaXRyYXJ5IGxpbWl0cyBmb3Igc2FuaXR5IGNoZWNrcy4gVE9ETyByZW1vdmUgYWZ0ZXIgZGVidWdnaW5nLgorLy8gQXJiaXRyYXJ5IGxpbWl0cyBmb3IgcmFuZ2UgY2hlY2tzLgogI2RlZmluZSBNQVhfU0hBUkVEX01FTU9SSUVTICgzMikKICNkZWZpbmUgTUFYX01NQVBfT0ZGU0VUX0JZVEVTICgzMiAqIDEwMjQgKiA4KQogI2RlZmluZSBNQVhfTU1BUF9TSVpFX0JZVEVTICgzMiAqIDEwMjQgKiA4KQpAQCAtMzYsMTAgKzM1LDE0IEBACiAgKiBJdCBtYXkgYmUgZGl2aWRlZCBpbnRvIHNldmVyYWwgcmVnaW9ucy4KICAqIFRoZSBtZW1vcnkgY2FuIGJlIHNoYXJlZCB1c2luZyBCaW5kZXIgb3Igc2ltcGx5IHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuCiAgKi8KLWNsYXNzIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgOiBwdWJsaWMgYW5kcm9pZDo6UGFyY2VsYWJsZSB7CitjbGFzcyBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIHsKIHB1YmxpYzoKLSAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlKCk7Ci0gICAgdmlydHVhbCB+U2hhcmVkTWVtb3J5UGFyY2VsYWJsZSgpOworICAgIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDdG9yIGZyb20gYSBwYXJjZWxhYmxlIHJlcHJlc2VudGF0aW9uLgorICAgIC8vIFNpbmNlIHRoZSBwYXJjZWxhYmxlIG9iamVjdCBvd25zIGEgdW5pcXVlIEZELCBtb3ZlIHNlbWFudGljcyBhcmUgcHJvdmlkZWQgdG8gYXZvaWQgdGhlIG5lZWQKKyAgICAvLyB0byBkdXBlLgorICAgIGV4cGxpY2l0IFNoYXJlZE1lbW9yeVBhcmNlbGFibGUoYW5kcm9pZDo6bWVkaWE6OlNoYXJlZEZpbGVSZWdpb24mJiBwYXJjZWxhYmxlKTsKIAogICAgIC8qKgogICAgICAqIE1ha2UgYSBkdXAoKSBvZiB0aGUgZmQgYW5kIHN0b3JlIGl0IGZvciBsYXRlciB1c2UuCkBAIC00OSwxMCArNTIsNiBAQAogICAgICAqLwogICAgIHZvaWQgc2V0dXAoY29uc3QgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiBmZCwgaW50MzJfdCBzaXplSW5CeXRlcyk7CiAKLSAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICAvLyBtbWFwKCkgc2hhcmVkIG1lbW9yeQogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlKGludDMyX3Qgb2Zmc2V0SW5CeXRlcywgaW50MzJfdCBzaXplSW5CeXRlcywgdm9pZCAqKnJlZ2lvbkFkZHJlc3NQdHIpOwogCkBAIC02MywyMCArNjIsMjMgQEAKIAogICAgIHZvaWQgZHVtcCgpOwogCi1wcm90ZWN0ZWQ6CisgICAgLy8gRXh0cmFjdCBhIHBhcmNlbGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QuCisgICAgLy8gU2luY2Ugd2Ugb3duIGEgdW5pcXVlIEZELCBtb3ZlIHNlbWFudGljcyBhcmUgcHJvdmlkZWQgdG8gYXZvaWQgdGhlIG5lZWQgdG8gZHVwZS4KKyAgICBhbmRyb2lkOjptZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbiBwYXJjZWxhYmxlKCkgJiY7CiAKLSNkZWZpbmUgTU1BUF9VTlJFU09MVkVEX0FERFJFU1MgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oTUFQX0ZBSUxFRCkKLQotICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpOwotCi0gICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TaXplSW5CeXRlcyA9IDA7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOworICAgIC8vIENvcHkgdGhpcyBpbnN0YW5jZS4gRHVwbGljYXRlcyB0aGUgdW5kZXJseWluZyBGRC4KKyAgICBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlIGR1cCgpIGNvbnN0OwogCiBwcml2YXRlOgorI2RlZmluZSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUyAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihNQVBfRkFJTEVEKQogCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgIG1TaXplSW5CeXRlcyA9IDA7CisgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgbU9mZnNldEluQnl0ZXMgPSAwOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgKm1SZXNvbHZlZEFkZHJlc3MgPSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUzsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpOwogICAgIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0OwotCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmNwcAppbmRleCBjNzc2MTE2Li41NmI5OWMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwCkBAIC0zNiw4ICszNiwxOCBAQAogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwogCi1TaGFyZWRSZWdpb25QYXJjZWxhYmxlOjpTaGFyZWRSZWdpb25QYXJjZWxhYmxlKCkge30KLVNoYXJlZFJlZ2lvblBhcmNlbGFibGU6On5TaGFyZWRSZWdpb25QYXJjZWxhYmxlKCkge30KK1NoYXJlZFJlZ2lvblBhcmNlbGFibGU6OlNoYXJlZFJlZ2lvblBhcmNlbGFibGUoY29uc3QgU2hhcmVkUmVnaW9uJiBwYXJjZWxhYmxlKQorICAgICAgICA6IG1TaGFyZWRNZW1vcnlJbmRleChwYXJjZWxhYmxlLnNoYXJlZE1lbW9yeUluZGV4KSwKKyAgICAgICAgICBtT2Zmc2V0SW5CeXRlcyhwYXJjZWxhYmxlLm9mZnNldEluQnl0ZXMpLAorICAgICAgICAgIG1TaXplSW5CeXRlcyhwYXJjZWxhYmxlLnNpemVJbkJ5dGVzKSB7fQorCitTaGFyZWRSZWdpb24gU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6cGFyY2VsYWJsZSgpIGNvbnN0IHsKKyAgICBTaGFyZWRSZWdpb24gcmVzdWx0OworICAgIHJlc3VsdC5zaGFyZWRNZW1vcnlJbmRleCA9IG1TaGFyZWRNZW1vcnlJbmRleDsKKyAgICByZXN1bHQub2Zmc2V0SW5CeXRlcyA9IG1PZmZzZXRJbkJ5dGVzOworICAgIHJlc3VsdC5zaXplSW5CeXRlcyA9IG1TaXplSW5CeXRlczsKKyAgICByZXR1cm4gcmVzdWx0OworfQogCiB2b2lkIFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OnNldHVwKGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0SW5CeXRlcywKQEAgLTQ3LDQxICs1Nyw2IEBACiAgICAgbVNpemVJbkJ5dGVzID0gc2l6ZUluQnl0ZXM7CiB9CiAKLXN0YXR1c190IFNoYXJlZFJlZ2lvblBhcmNlbGFibGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyh2YWxpZGF0ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotCi0gICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1TaXplSW5CeXRlcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBpZiAobVNpemVJbkJ5dGVzID4gMCkgewotICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobVNoYXJlZE1lbW9yeUluZGV4KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1PZmZzZXRJbkJ5dGVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi1lcnJvcjoKLSAgICBBTE9HRSgiJXMgcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbVNpemVJbkJ5dGVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIGlmIChtU2l6ZUluQnl0ZXMgPiAwKSB7Ci0gICAgICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtU2hhcmVkTWVtb3J5SW5kZXgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgICAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbU9mZnNldEluQnl0ZXMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIH0KLSAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXModmFsaWRhdGUoKSk7Ci0KLWVycm9yOgotICAgIEFMT0dFKCIlcyByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZTo6cmVzb2x2ZShTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICptZW1vcnlQYXJjZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipyZWdpb25BZGRyZXNzUHRyKSB7CiAgICAgaWYgKG1TaXplSW5CeXRlcyA9PSAwKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuaAppbmRleCAwY2Q4YzA0Li5jMTVmYzMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkUmVnaW9uUGFyY2VsYWJsZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRSZWdpb25QYXJjZWxhYmxlLmgKQEAgLTIwLDQxICsyMCwzOSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9TaGFyZWRSZWdpb24uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oIgogCiB1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKLXVzaW5nIGFuZHJvaWQ6OlBhcmNlbGFibGU7CiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi1jbGFzcyBTaGFyZWRSZWdpb25QYXJjZWxhYmxlIDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSB7CiBwdWJsaWM6Ci0gICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSgpOwotICAgIHZpcnR1YWwgflNoYXJlZFJlZ2lvblBhcmNlbGFibGUoKTsKKyAgICBTaGFyZWRSZWdpb25QYXJjZWxhYmxlKCkgPSBkZWZhdWx0OworCisgICAgLy8gQ29uc3RydWN0IGJhc2VkIG9uIGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbi4KKyAgICBleHBsaWNpdCBTaGFyZWRSZWdpb25QYXJjZWxhYmxlKGNvbnN0IFNoYXJlZFJlZ2lvbiYgcGFyY2VsYWJsZSk7CiAKICAgICB2b2lkIHNldHVwKGludDMyX3Qgc2hhcmVkTWVtb3J5SW5kZXgsIGludDMyX3Qgb2Zmc2V0SW5CeXRlcywgaW50MzJfdCBzaXplSW5CeXRlcyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzb2x2ZShTaGFyZWRNZW1vcnlQYXJjZWxhYmxlICptZW1vcnlQYXJjZWxzLCB2b2lkICoqcmVnaW9uQWRkcmVzc1B0cik7CiAKICAgICBib29sIGlzRmlsZURlc2NyaXB0b3JTYWZlKFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgKm1lbW9yeVBhcmNlbHMpOwogCiAgICAgdm9pZCBkdW1wKCk7CiAKLXByb3RlY3RlZDoKKyAgICAvLyBFeHRyYWN0IGEgcGFyY2VsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICBTaGFyZWRSZWdpb24gcGFyY2VsYWJsZSgpIGNvbnN0OworCitwcml2YXRlOgogICAgIGludDMyX3QgbVNoYXJlZE1lbW9yeUluZGV4ID0gLTE7CiAgICAgaW50MzJfdCBtT2Zmc2V0SW5CeXRlcyAgICAgPSAwOwogICAgIGludDMyX3QgbVNpemVJbkJ5dGVzICAgICAgID0gMDsKIAotcHJpdmF0ZToKICAgICBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9FbmRwb2ludC5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0VuZHBvaW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMGI2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9FbmRwb2ludC5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFhdWRpbzsKKworaW1wb3J0IGFhdWRpby5SaW5nQnVmZmVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU2hhcmVkRmlsZVJlZ2lvbjsKKworcGFyY2VsYWJsZSBFbmRwb2ludCB7CisgICAgLy8gU2V0IGNhcGFjaXR5SW5GcmFtZXMgdG8gemVybyBpZiBRdWV1ZSBpcyB1bnVzZWQuCisgICAgUmluZ0J1ZmZlciB1cE1lc3NhZ2VRdWV1ZVBhcmNlbGFibGU7ICAgLy8gc2VydmVyIHRvIGNsaWVudAorICAgIFJpbmdCdWZmZXIgZG93bk1lc3NhZ2VRdWV1ZVBhcmNlbGFibGU7IC8vIHRvIHNlcnZlcgorICAgIFJpbmdCdWZmZXIgdXBEYXRhUXVldWVQYXJjZWxhYmxlOyAgICAgIC8vIGVnLiByZWNvcmQsIGNvdWxkIHNoYXJlIHNhbWUgcXVldWUKKyAgICBSaW5nQnVmZmVyIGRvd25EYXRhUXVldWVQYXJjZWxhYmxlOyAgICAvLyBlZy4gcGxheWJhY2sKKyAgICBTaGFyZWRGaWxlUmVnaW9uW10gc2hhcmVkTWVtb3JpZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb0NsaWVudC5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9DbGllbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDEwZGJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9DbGllbnQuYWlkbApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhYXVkaW87CisKK2ludGVyZmFjZSBJQUF1ZGlvQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBvblN0cmVhbUNoYW5nZShpbnQgaGFuZGxlLCBpbnQgb3Bjb2RlLCBpbnQgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vSUFBdWRpb1NlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQyMjExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL0lBQXVkaW9TZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYWF1ZGlvOworCitpbXBvcnQgYWF1ZGlvLkVuZHBvaW50OworaW1wb3J0IGFhdWRpby5JQUF1ZGlvQ2xpZW50OworaW1wb3J0IGFhdWRpby5TdHJlYW1QYXJhbWV0ZXJzOworaW1wb3J0IGFhdWRpby5TdHJlYW1SZXF1ZXN0OworCitpbnRlcmZhY2UgSUFBdWRpb1NlcnZpY2UgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFuIG9iamVjdCB0byByZWNlaXZlIGF1ZGlvIGlucHV0L291dHB1dCBjaGFuZ2UgYW5kIHRyYWNrIG5vdGlmaWNhdGlvbnMuCisgICAgICogRm9yIGEgZ2l2ZW4gY2FsbGluZyBwaWQsIEFBdWRpbyBzZXJ2aWNlIGRpc3JlZ2FyZHMgYW55IHJlZ2lzdHJhdGlvbnMgYWZ0ZXIgdGhlIGZpcnN0LgorICAgICAqIFRodXMgdGhlIElBQXVkaW9DbGllbnQgbXVzdCBiZSBhIHNpbmdsZXRvbiBwZXIgcHJvY2Vzcy4KKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyQ2xpZW50KElBQXVkaW9DbGllbnQgY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IGluZm8gbmVlZGVkIHRvIGNyZWF0ZSB0aGUgc3RyZWFtCisgICAgICogQHBhcmFtIHBhcmFtc091dCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3JlYXRlZCBzdHJlYW0KKyAgICAgKiBAcmV0dXJuIGhhbmRsZSB0byB0aGUgc3RyZWFtIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAgICAgKi8KKyAgICBpbnQgb3BlblN0cmVhbShpbiBTdHJlYW1SZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgb3V0IFN0cmVhbVBhcmFtZXRlcnMgcGFyYW1zT3V0KTsKKworICAgIGludCBjbG9zZVN0cmVhbShpbnQgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qCisgICAgICogR2V0IGFuIGltbXV0YWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW4tbWVtb3J5IHF1ZXVlcworICAgICAqIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KKyAgICAgKi8KKyAgICBpbnQgZ2V0U3RyZWFtRGVzY3JpcHRpb24oaW50IHN0cmVhbUhhbmRsZSwgb3V0IEVuZHBvaW50IGVuZHBvaW50KTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHRoZSBmbG93IG9mIGRhdGEuCisgICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIFNUQVJURUQgZXZlbnQuCisgICAgICovCisgICAgaW50IHN0YXJ0U3RyZWFtKGludCBzdHJlYW1IYW5kbGUpOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgZmxvdyBvZiBkYXRhIHN1Y2ggdGhhdCBzdGFydCgpIGNhbiByZXN1bWUgd2l0aG91dCBsb3NzIG9mIGRhdGEuCisgICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIFBBVVNFRCBldmVudC4KKyAgICAgKi8KKyAgICBpbnQgcGF1c2VTdHJlYW0oaW50IHN0cmVhbUhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgc3VjaCB0aGF0IHRoZSBkYXRhIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyIGlzIHBsYXllZC4KKyAgICAgKiBUaGlzIGlzIGFzeW5jaHJvbm91cy4gV2hlbiBjb21wbGV0ZSwgdGhlIHNlcnZpY2Ugd2lsbCBzZW5kIGEgU1RPUFBFRCBldmVudC4KKyAgICAgKi8KKyAgICBpbnQgc3RvcFN0cmVhbShpbnQgc3RyZWFtSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqICBEaXNjYXJkIGFueSBkYXRhIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgSEFMIG9yIFNlcnZpY2UuCisgICAgICogVGhpcyBpcyBhc3luY2hyb25vdXMuIFdoZW4gY29tcGxldGUsIHRoZSBzZXJ2aWNlIHdpbGwgc2VuZCBhIEZMVVNIRUQgZXZlbnQuCisgICAgICovCisgICAgaW50IGZsdXNoU3RyZWFtKGludCBzdHJlYW1IYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFuYWdlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGFzIGEgbG93IGxhdGVuY3kgYXVkaW8gdGhyZWFkLgorICAgICAqLworICAgIGludCByZWdpc3RlckF1ZGlvVGhyZWFkKGludCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcGVyaW9kTmFub3NlY29uZHMpOworCisgICAgaW50IHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaWVudFRocmVhZElkKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9SaW5nQnVmZmVyLmFpZGwgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGIzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vUmluZ0J1ZmZlci5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFhdWRpbzsKKworaW1wb3J0IGFhdWRpby5TaGFyZWRSZWdpb247CisKK3BhcmNlbGFibGUgUmluZ0J1ZmZlciB7CisgICAgU2hhcmVkUmVnaW9uICAgICAgICByZWFkQ291bnRlclBhcmNlbGFibGU7CisgICAgU2hhcmVkUmVnaW9uICAgICAgICB3cml0ZUNvdW50ZXJQYXJjZWxhYmxlOworICAgIFNoYXJlZFJlZ2lvbiAgICAgICAgZGF0YVBhcmNlbGFibGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBieXRlc1BlckZyYW1lOyAgICAgLy8gaW5kZXggaXMgaW4gZnJhbWVzCisgICAgaW50ICAgICAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdDsgICAgLy8gZm9yIElTT0NIUk9OT1VTIHF1ZXVlcworICAgIGludCAgICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lczsgIC8vIHplcm8gaWYgdW51c2VkCisgICAgaW50IC8qIFJpbmdidWZmZXJGbGFncyAqLyBmbGFnczsgIC8vID0gUmluZ2J1ZmZlckZsYWdzOjpOT05FOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TaGFyZWRSZWdpb24uYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TaGFyZWRSZWdpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE1M2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1NoYXJlZFJlZ2lvbi5haWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFhdWRpbzsKKworcGFyY2VsYWJsZSBTaGFyZWRSZWdpb24geworICAgIGludCBzaGFyZWRNZW1vcnlJbmRleDsKKyAgICBpbnQgb2Zmc2V0SW5CeXRlczsKKyAgICBpbnQgc2l6ZUluQnl0ZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvYWlkbC9hYXVkaW8vU3RyZWFtUGFyYW1ldGVycy5haWRsIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M0ZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVBhcmFtZXRlcnMuYWlkbApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhYXVkaW87CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworcGFyY2VsYWJsZSBTdHJlYW1QYXJhbWV0ZXJzIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWU7ICAvLyAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU7ICAvLyAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQ7ICAvLyAgICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgLyogYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICovICAgICAgICAgICBzaGFyaW5nTW9kZTsgIC8vICAgICAgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgQXVkaW9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQ7ICAvLyAgICAgICAgICA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGludCAvKiBhYXVkaW9fZGlyZWN0aW9uX3QgKi8gICAgICAgICAgICAgIGRpcmVjdGlvbjsgIC8vICAgICAgICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKKyAgICBpbnQgLyogYWF1ZGlvX3VzYWdlX3QgKi8gICAgICAgICAgICAgICAgICB1c2FnZTsgIC8vICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAvKiBhYXVkaW9fY29udGVudF90eXBlX3QgKi8gICAgICAgICAgIGNvbnRlbnRUeXBlOyAgLy8gICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50IC8qIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAqLyAgICAgICAgICAgaW5wdXRQcmVzZXQ7ICAvLyAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJDYXBhY2l0eTsgIC8vICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludCAvKiBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90ICovIGFsbG93ZWRDYXB0dXJlUG9saWN5OyAgLy8gPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgaW50IC8qIGFhdWRpb19zZXNzaW9uX2lkX3QgKi8gICAgICAgICAgICAgc2Vzc2lvbklkOyAgLy8gICAgICAgICAgICA9IEFBVURJT19TRVNTSU9OX0lEX05PTkU7CisgICAgYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcml2YWN5U2Vuc2l0aXZlOyAgLy8gICA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL2FpZGwvYWF1ZGlvL1N0cmVhbVJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1SZXF1ZXN0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3ODdhMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9haWRsL2FhdWRpby9TdHJlYW1SZXF1ZXN0LmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYWF1ZGlvOworCitpbXBvcnQgYWF1ZGlvLlN0cmVhbVBhcmFtZXRlcnM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKK3BhcmNlbGFibGUgU3RyZWFtUmVxdWVzdCB7CisgICAgU3RyZWFtUGFyYW1ldGVycyAgICAgICBwYXJhbXM7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBib29sZWFuICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZDsgLy8gPSBmYWxzZTsKKyAgICBib29sZWFuICAgICAgICAgICAgICAgIGluU2VydmljZTsgLy8gPSBmYWxzZTsgLy8gU3RyZWFtIG9wZW5lZCBieSBBQXVkaW9zZXJ2aWNlCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAKaW5kZXggOGYyYzQ4OC4uNjFiNTBmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCkBAIC0yNiw5ICsyNiwxMSBAQAogI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgogI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTI0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMzIuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlRmxvYXQuaD4KICNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTE2Lmg+CiAjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMzIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKIApAQCAtMzgsNyArNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpIHsKICAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqbGFzdE91dHB1dCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiJXMoKSBzb3VyY2UgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkLCBzaW5rIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCIsCisgICAgLy8gVE9ETyBjaGFuZ2UgYmFjayB0byBBTE9HRAorICAgIEFMT0dJKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKICAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOwogCiAgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKQEAgLTUxLDcgKzU0LDEwIEBACiAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgogICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTI0Pihzb3VyY2VDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTMyPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzb3VyY2UgZm9ybWF0ID0gJWQiLCBfX2Z1bmNfXywgc291cmNlRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CkBAIC05MCw3ICs5NiwxMCBAQAogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKICAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTI0PihzaW5rQ2hhbm5lbENvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rSTMyPihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc2luayBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzaW5rRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCmluZGV4IDA2ZjY2ZDMuLmViYzlmMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICB9CiAKLSAgICBtVXBDb21tYW5kUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9CdWZmZXI+KAorICAgIG1VcENvbW1hbmRRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0J1ZmZlckluZGlyZWN0PigKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICBkZXNjcmlwdG9yLT5jYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgZGVzY3JpcHRvci0+cmVhZENvdW50ZXJBZGRyZXNzLApAQCAtMTY2LDcgKzE2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJm1EYXRhV3JpdGVDb3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdG9yLT53cml0ZUNvdW50ZXJBZGRyZXNzOwogCi0gICAgbURhdGFRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0J1ZmZlcj4oCisgICAgLy8gQ2xlYXIgYnVmZmVyIHRvIGF2b2lkIGFuIGluaXRpYWwgZ2xpdGNoIG9uIHNvbWUgZGV2aWNlcy4KKyAgICBzaXplX3QgYnVmZmVyU2l6ZUJ5dGVzID0gZGVzY3JpcHRvci0+Y2FwYWNpdHlJbkZyYW1lcyAqIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWU7CisgICAgbWVtc2V0KGRlc2NyaXB0b3ItPmRhdGFBZGRyZXNzLCAwLCBidWZmZXJTaXplQnl0ZXMpOworCisgICAgbURhdGFRdWV1ZSA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0J1ZmZlckluZGlyZWN0PigKICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICBkZXNjcmlwdG9yLT5jYXBhY2l0eUluRnJhbWVzLAogICAgICAgICAgICAgcmVhZENvdW50ZXJBZGRyZXNzLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5oCmluZGV4IDQ4NGQ5MTcuLjRjOGQ2MGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmgKQEAgLTkzLDggKzkzLDggQEAKICAgICB2b2lkIGR1bXAoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlcj4gbVVwQ29tbWFuZFF1ZXVlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVyPiBtRGF0YVF1ZXVlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpGaWZvQnVmZmVySW5kaXJlY3Q+IG1VcENvbW1hbmRRdWV1ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiBtRGF0YVF1ZXVlOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1GcmVlUnVubmluZzsKICAgICBhbmRyb2lkOjpmaWZvX2NvdW50ZXJfdCBtRGF0YVJlYWRDb3VudGVyOyAvLyBvbmx5IHVzZWQgaWYgZnJlZS1ydW5uaW5nCiAgICAgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3QgbURhdGFXcml0ZUNvdW50ZXI7IC8vIG9ubHkgdXNlZCBpZiBmcmVlLXJ1bm5pbmcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggNDUyMDgyMy4uNmQyZDQ2NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTI4LDE4ICsyOCwxNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSAiQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbVJlcXVlc3QuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uaCIKLSNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgImNvcmUvQXVkaW9HbG9iYWwuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgImZpZm8vRmlmb0J1ZmZlci5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUludGVybmFsLmgiCiAKQEAgLTUwLDkgKzQ5LDkgQEAKIC8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGxvZ3MgbW9yZSBlYXNpbHkuCiAjZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbF9TZXJ2aWNlIiA6ICJBdWRpb1N0cmVhbUludGVybmFsX0NsaWVudCIpCiAKLXVzaW5nIGFuZHJvaWQ6OlN0cmluZzE2OwogdXNpbmcgYW5kcm9pZDo6TXV0ZXg7CiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CiAKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKQEAgLTc2LDYgKzc1LDcgQEAKIH0KIAogQXVkaW9TdHJlYW1JbnRlcm5hbDo6fkF1ZGlvU3RyZWFtSW50ZXJuYWwoKSB7CisgICAgQUxPR0QoIiVzKCkgJXAgY2FsbGVkIiwgX19mdW5jX18sIHRoaXMpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKQEAgLTEwMCwxNiArMTAwLDI0IEBACiAgICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKICAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKIAorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEZvcm1hdCA9IGdldEZvcm1hdCgpOwogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCi0gICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQotICAgIC8vIFJlcXVlc3QgRkxPQVQgZm9yIHRoZSBzaGFyZWQgbWl4ZXIuCisgICAgLy8gUmVxdWVzdCBGTE9BVCBmb3IgdGhlIHNoYXJlZCBtaXhlciBvciB0aGUgZGV2aWNlLgogICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAorICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwoYW5kcm9pZDo6bGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IGJ1aWxkZXIuZ2V0T3BQYWNrYWdlTmFtZSgpOworICAgIGF0dHJpYnV0aW9uU291cmNlLmF0dHJpYnV0aW9uVGFnID0gYnVpbGRlci5nZXRBdHRyaWJ1dGlvblRhZygpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8YW5kcm9pZDo6QkJpbmRlcj46Om1ha2UoKTsKKwogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4KLSAgICByZXF1ZXN0LnNldFVzZXJJZChnZXR1aWQoKSk7Ci0gICAgcmVxdWVzdC5zZXRQcm9jZXNzSWQoZ2V0cGlkKCkpOworICAgIHJlcXVlc3Quc2V0QXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpOwogICAgIHJlcXVlc3Quc2V0U2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKGlzU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkKCkpOwogICAgIHJlcXVlc3Quc2V0SW5TZXJ2aWNlKGlzSW5TZXJ2aWNlKCkpOwogCkBAIC0xNDcsOCArMTU1LDE5IEBACiAKICAgICAvLyBUaGlzIG11c3QgbWF0Y2ggdGhlIGtleSBnZW5lcmF0ZWQgaW4gb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCiAgICAgLy8gc28gdGhlIGNsaWVudCBjYW4gaGF2ZSBwZXJtaXNzaW9uIHRvIGxvZy4KLSAgICBtTWV0cmljc0lkID0gc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NUUkVBTSkKLSAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcobVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgIGlmICghbUluU2VydmljZSkgeworICAgICAgICAvLyBObyBuZWVkIHRvIGxvZyBpZiBpdCBpcyBmcm9tIHNlcnZpY2Ugc2lkZS4KKyAgICAgICAgbU1ldHJpY3NJZCA9IHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6dG9fc3RyaW5nKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKKyAgICB9CisKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BFUkZPUk1BTkNFTU9ERSwKKyAgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFBlcmZvcm1hbmNlTW9kZVRvVGV4dChidWlsZGVyLmdldFBlcmZvcm1hbmNlTW9kZSgpKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NIQVJJTkdNT0RFLAorICAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U2hhcmluZ01vZGVUb1RleHQoYnVpbGRlci5nZXRTaGFyaW5nTW9kZSgpKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HQ0xJRU5ULAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjp0b1N0cmluZyhyZXF1ZXN0ZWRGb3JtYXQpLmNfc3RyKCkpLnJlY29yZCgpOwogCiAgICAgcmVzdWx0ID0gY29uZmlndXJhdGlvbk91dHB1dC52YWxpZGF0ZSgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0yMTEsMTAgKzIzMCwxMCBAQAogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBtRnJhbWVzUGVyQnVyc3QgPSBmcmFtZXNQZXJCdXJzdDsgLy8gb25seSBzYXZlIGdvb2QgdmFsdWUKKyAgICBzZXRGcmFtZXNQZXJCdXJzdChmcmFtZXNQZXJCdXJzdCk7IC8vIG9ubHkgc2F2ZSBnb29kIHZhbHVlCiAKICAgICBtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA9IG1FbmRwb2ludERlc2NyaXB0b3IuZGF0YVF1ZXVlRGVzY3JpcHRvci5jYXBhY2l0eUluRnJhbWVzOwotICAgIGlmIChtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA8IG1GcmFtZXNQZXJCdXJzdAorICAgIGlmIChtQnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA8IGdldEZyYW1lc1BlckJ1cnN0KCkKICAgICAgICAgICAgIHx8IG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzID4gTUFYX0JVRkZFUl9DQVBBQ0lUWV9JTl9GUkFNRVMpIHsKICAgICAgICAgQUxPR0UoIiVzIC0gYnVmZmVyQ2FwYWNpdHkgb3V0IG9mIHJhbmdlID0gJWQiLCBfX2Z1bmNfXywgbUJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMjM5LDcgKzI1OCw3IEBACiAKICAgICAgICAgfQogICAgICAgICBpZiAobUNhbGxiYWNrRnJhbWVzID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gbUZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgbUNhbGxiYWNrRnJhbWVzID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IGludDMyX3QgY2FsbGJhY2tCdWZmZXJTaXplID0gbUNhbGxiYWNrRnJhbWVzICogZ2V0Qnl0ZXNQZXJGcmFtZSgpOwpAQCAtMjcxLDIxICsyOTAsMjEgQEAKICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKLSAgICByZWxlYXNlQ2xvc2VGaW5hbCgpOworICAgIHNhZmVSZWxlYXNlQ2xvc2UoKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlbGVhc2VfbCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIEFMT0dWKCIlcygpOiBtU2VydmljZVN0cmVhbUhhbmRsZSA9IDB4JTA4WCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgQUxPR0QoIiVzKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgIT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpOwogICAgICAgICAvLyBEb24ndCByZWxlYXNlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuIFN0b3AgaXQgZmlyc3QuCiAgICAgICAgIC8vIElmIERJU0NPTk5FQ1RFRCB0aGVuIHdlIHNob3VsZCBzdGlsbCB0cnkgdG8gc3RvcCBpbiBjYXNlIHRoZQogICAgICAgICAvLyBlcnJvciBjYWxsYmFjayBpcyBzdGlsbCBydW5uaW5nLgogICAgICAgICBpZiAoaXNBY3RpdmUoKSB8fCBjdXJyZW50U3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIHJlcXVlc3RTdG9wKCk7CisgICAgICAgICAgICByZXF1ZXN0U3RvcF9sKCk7CiAgICAgICAgIH0KIAogICAgICAgICBsb2dSZWxlYXNlQnVmZmVyU3RhdGUoKTsKQEAgLTMzMSw3ICszNTAsNyBAQAogICogVGhlIHByb2Nlc3NpbmcgY29kZSB3aWxsIHRoZW4gc2F2ZSB0aGUgY3VycmVudCBvZmZzZXQKICAqIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgYW5kIGFwcGx5IHRoYXQgdG8gYW55IHBvc2l0aW9uIGdpdmVuIHRvIHRoZSBhcHAuCiAgKi8KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RhcnQoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdGFydF9sKCkKIHsKICAgICBpbnQ2NF90IHN0YXJ0VGltZTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CkBAIC0zNTMsNiArMzcyLDggQEAKICAgICAvLyBDbGVhciBhbnkgc3RhbGUgdGltZXN0YW1wcyBmcm9tIHRoZSBwcmV2aW91cyBydW4uCiAgICAgZHJhaW5UaW1lc3RhbXBzRnJvbVNlcnZpY2UoKTsKIAorICAgIHByZXBhcmVCdWZmZXJzRm9yU3RhcnQoKTsgLy8gdGVsbCBzdWJjbGFzc2VzIHRvIGdldCByZWFkeQorCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TZXJ2aWNlSW50ZXJmYWNlLnN0YXJ0U3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSkgewogICAgICAgICBBTE9HRCgiJXMoKSBJTlZBTElEX0hBTkRMRSwgc3RyZWFtIHdhcyBwcm9iYWJseSBzdG9sZW4iLCBfX2Z1bmNfXyk7CkBAIC0zNzIsNyArMzkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gZ2V0U2FtcGxlUmF0ZSgpOwogICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKHRydWUpOwotICAgICAgICByZXN1bHQgPSBjcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsIGFhdWRpb19jYWxsYmFja190aHJlYWRfcHJvYywgdGhpcyk7CisgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRocmVhZF9sKHBlcmlvZE5hbm9zLCBhYXVkaW9fY2FsbGJhY2tfdGhyZWFkX3Byb2MsIHRoaXMpOwogICAgIH0KICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBzZXRTdGF0ZShvcmlnaW5hbFN0YXRlKTsKQEAgLTM5OCwzMyArNDE5LDM2IEBACiB9CiAKIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6c3RvcENhbGxiYWNrKCkKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpzdG9wQ2FsbGJhY2tfbCgpCiB7CiAgICAgaWYgKGlzRGF0YUNhbGxiYWNrU2V0KCkKICAgICAgICAgICAgICYmIChpc0FjdGl2ZSgpIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpKSB7CiAgICAgICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gam9pblRocmVhZChOVUxMKTsgLy8gbWF5IHRlbXBvcmFyaWx5IHVubG9jayBtU3RyZWFtTG9jaworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gam9pblRocmVhZF9sKE5VTEwpOyAvLyBtYXkgdGVtcG9yYXJpbHkgdW5sb2NrIG1TdHJlYW1Mb2NrCiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKSB7CiAgICAgICAgICAgICBBTE9HRCgiJXMoKSBJTlZBTElEX0hBTkRMRSwgc3RyZWFtIHdhcyBwcm9iYWJseSBzdG9sZW4iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiJXMoKSBza2lwcGVkLCBpc0RhdGFDYWxsYmFja1NldCgpID0gJWQsIGlzQWN0aXZlKCkgPSAlZCwgZ2V0U3RhdGUoKSAgPSAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgaXNEYXRhQ2FsbGJhY2tTZXQoKSwgaXNBY3RpdmUoKSwgZ2V0U3RhdGUoKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogfQogCi0vLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnJlcXVlc3RTdG9wKCkgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcF9sKCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2tfbCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIEFMT0dXKCIlcygpIHN0b3AgY2FsbGJhY2sgcmV0dXJuZWQgJWQsIHJldHVybmluZyBlYXJseSIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICAvLyBUaGUgc3RyZWFtIG1heSBoYXZlIGJlZW4gdW5sb2NrZWQgdGVtcG9yYXJpbHkgdG8gbGV0IGEgY2FsbGJhY2sgZmluaXNoCiAgICAgLy8gYW5kIHRoZSBjYWxsYmFjayBtYXkgaGF2ZSBzdG9wcGVkIHRoZSBzdHJlYW0uCiAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdHJlYW0gc3RpbGwgbmVlZHMgdG8gYmUgc3RvcHBlZC4KLSAgICAvLyBTZWUgYWxzbyBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKS4KKyAgICAvLyBTZWUgYWxzbyBBdWRpb1N0cmVhbTo6c2FmZVN0b3BfbCgpLgogICAgIGlmICghKGlzQWN0aXZlKCkgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgcmV0dXJuaW5nIGVhcmx5LCBub3QgYWN0aXZlIG9yIGRpc2Nvbm5lY3RlZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKQEAgLTc1NSw5ICs3NzksOSBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6c2V0QnVmZmVyU2l6ZShpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykgewogICAgIGludDMyX3QgYWRqdXN0ZWRGcmFtZXMgPSByZXF1ZXN0ZWRGcmFtZXM7Ci0gICAgY29uc3QgaW50MzJfdCBtYXhpbXVtU2l6ZSA9IGdldEJ1ZmZlckNhcGFjaXR5KCkgLSBtRnJhbWVzUGVyQnVyc3Q7CisgICAgY29uc3QgaW50MzJfdCBtYXhpbXVtU2l6ZSA9IGdldEJ1ZmZlckNhcGFjaXR5KCkgLSBnZXRGcmFtZXNQZXJCdXJzdCgpOwogICAgIC8vIE1pbmltdW0gc2l6ZSBzaG91bGQgYmUgYSBtdWx0aXBsZSBudW1iZXIgb2YgYnVyc3RzLgotICAgIGNvbnN0IGludDMyX3QgbWluaW11bVNpemUgPSAxICogbUZyYW1lc1BlckJ1cnN0OworICAgIGNvbnN0IGludDMyX3QgbWluaW11bVNpemUgPSAxICogZ2V0RnJhbWVzUGVyQnVyc3QoKTsKIAogICAgIC8vIENsaXAgdG8gbWluaW11bSBzaXplIHNvIHRoYXQgcm91bmRpbmcgdXAgd2lsbCB3b3JrIGJldHRlci4KICAgICBhZGp1c3RlZEZyYW1lcyA9IHN0ZDo6bWF4KG1pbmltdW1TaXplLCBhZGp1c3RlZEZyYW1lcyk7CkBAIC03NjcsOSArNzkxLDkgQEAKICAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSBtYXhpbXVtU2l6ZTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBSb3VuZCB0byB0aGUgbmV4dCBoaWdoZXN0IGJ1cnN0IHNpemUuCi0gICAgICAgIGludDMyX3QgbnVtQnVyc3RzID0gKGFkanVzdGVkRnJhbWVzICsgbUZyYW1lc1BlckJ1cnN0IC0gMSkgLyBtRnJhbWVzUGVyQnVyc3Q7Ci0gICAgICAgIGFkanVzdGVkRnJhbWVzID0gbnVtQnVyc3RzICogbUZyYW1lc1BlckJ1cnN0OwotICAgICAgICAvLyBDbGlwIGp1c3QgaW4gY2FzZSBtYXhpbXVtU2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiBtRnJhbWVzUGVyQnVyc3QuCisgICAgICAgIGludDMyX3QgbnVtQnVyc3RzID0gKGFkanVzdGVkRnJhbWVzICsgZ2V0RnJhbWVzUGVyQnVyc3QoKSAtIDEpIC8gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICAgICAgYWRqdXN0ZWRGcmFtZXMgPSBudW1CdXJzdHMgKiBnZXRGcmFtZXNQZXJCdXJzdCgpOworICAgICAgICAvLyBDbGlwIGp1c3QgaW4gY2FzZSBtYXhpbXVtU2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiBnZXRGcmFtZXNQZXJCdXJzdCgpLgogICAgICAgICBhZGp1c3RlZEZyYW1lcyA9IHN0ZDo6bWluKG1heGltdW1TaXplLCBhZGp1c3RlZEZyYW1lcyk7CiAgICAgfQogCkBAIC04MDQsMTUgKzgyOCw2IEBACiAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eUluRnJhbWVzOwogfQogCi1pbnQzMl90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3QgewotICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7Ci19Ci0KLS8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7Ci0gICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwotfQotCiBib29sIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0IHsKICAgICByZXR1cm4gaXNBY3RpdmUoKSAmJiBtQXVkaW9FbmRwb2ludC0+aXNGcmVlUnVubmluZygpICYmIG1DbG9ja01vZGVsLmlzUnVubmluZygpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCmluZGV4IDYxNTkxYjMuLmZiZTRjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKLSNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BdWRpb0VuZHBvaW50UGFyY2VsYWJsZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZUludGVyZmFjZS5oIgogI2luY2x1ZGUgImNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaCIKQEAgLTI5LDcgKzI4LDYgQEAKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7Ci11c2luZyBhbmRyb2lkOjpJQUF1ZGlvU2VydmljZTsKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTQ2LDEwICs0NCw2IEBACiAgICAgQXVkaW9TdHJlYW1JbnRlcm5hbChBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmc2VydmljZUludGVyZmFjZSwgYm9vbCBpblNlcnZpY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtSW50ZXJuYWwoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSBvdmVycmlkZTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFRpbWVzdGFtcChjbG9ja2lkX3QgY2xvY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIG92ZXJyaWRlOwpAQCAtNTgsMTYgKzUyLDEyIEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlbGVhc2VfbCgpIG92ZXJyaWRlOwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpIG92ZXJyaWRlOwogCiAgICAgaW50MzJfdCBnZXRCdWZmZXJTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0KICAgICBpbnQzMl90IGdldFhSdW5Db3VudCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIG1YUnVuQ291bnQ7CiAgICAgfQpAQCAtNzYsMTIgKzY2LDkgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyVGhyZWFkKCkgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgam9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKTsKLQogICAgIC8vIENhbGxlZCBpbnRlcm5hbGx5IGZyb20gJ0MnCiAgICAgdmlydHVhbCB2b2lkICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKLQogICAgIGJvb2wgaXNNTWFwKCkgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xMDAsNiArODcsMTAgQEAKICAgICB9CiAKIHByb3RlY3RlZDoKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0X2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVsZWFzZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHByb2Nlc3NEYXRhKHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKQEAgLTEyMSw5ICsxMTIsMTEgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBwcm9jZXNzQ29tbWFuZHMoKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2FsbGJhY2soKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcENhbGxiYWNrX2woKTsKIAotICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQnVmZmVyc0ZvclN0YXJ0KCkge30KKworICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luID0gMCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkge30KIApAQCAtMTU5LDcgKzE1Miw2IEBACiAKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGU7IC8vIG9wYXF1ZSBoYW5kbGUgcmV0dXJuZWQgZnJvbSBzZXJ2aWNlCiAKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gTUlOX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGZyYW1lcyBwZXIgSEFMIHRyYW5zZmVyCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1YUnVuQ291bnQgPSAwOyAgICAgIC8vIGhvdyBtYW55IHVuZGVycnVuIGV2ZW50cz8KIAogICAgIC8vIE9mZnNldCBmcm9tIHVuZGVybHlpbmcgZnJhbWUgcG9zaXRpb24uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggOWZhMmU0MC4uMmRhNTQwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtMTQsMTQgKzE0LDEzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmVfU2VydmljZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZV9DbGllbnQiKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCkBAIC0yOSw2ICsyOCwxNCBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCisvLyBXZSBkbyB0aGlzIGFmdGVyIHRoZSAjaW5jbHVkZXMgYmVjYXVzZSBpZiBhIGhlYWRlciB1c2VzIEFMT0cuCisvLyBpdCB3b3VsZCBmYWlsIG9uIHRoZSByZWZlcmVuY2UgdG8gbUluU2VydmljZS4KKyN1bmRlZiBMT0dfVEFHCisvLyBUaGlzIGZpbGUgaXMgdXNlZCBpbiBib3RoIGNsaWVudCBhbmQgc2VydmVyIHByb2Nlc3Nlcy4KKy8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIGxvZ3MgbW9yZSBlYXNpbHkuCisjZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmVfU2VydmljZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZV9DbGllbnQiKQorCiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKQEAgLTQxLDkgKzQ4LDkgQEAKIAogQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6On5BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZSgpIHt9CiAKLXZvaWQgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKSB7Cit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luKSB7CiAgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgaW50NjRfdCB3cml0ZUNvdW50ZXIgPSBtQXVkaW9FbmRwb2ludC0+Z2V0RGF0YVdyaXRlQ291bnRlcigpICsgc2VydmVyTWFyZ2luOwogCiAgICAgLy8gQnVtcCBvZmZzZXQgc28gY2FsbGVyIGRvZXMgbm90IHNlZSB0aGUgcmV0cm9ncmFkZSBtb3Rpb24gaW4gZ2V0RnJhbWVzUmVhZCgpLgogICAgIGludDY0X3Qgb2Zmc2V0ID0gcmVhZENvdW50ZXIgLSB3cml0ZUNvdW50ZXI7CkBAIC0xNDMsNyArMTUwLDcgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZnJhbWUgcG9zaXRpb24gYmFzZWQgb2ZmIG9mIHRoZSByZWFkQ291bnRlciBiZWNhdXNlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgotICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpICsgbUZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpICsgZ2V0RnJhbWVzUGVyQnVyc3QoKTsKICAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvTGF0ZXN0VGltZShuZXh0UG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTgzLDI2ICsxOTAsMTAgQEAKIAogICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZGVzdGluYXRpb25Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKLSAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgaWYgKHNvdXJjZUZvcm1hdCA9PSBkZXN0aW5hdGlvbkZvcm1hdCkgewotICAgICAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9uLCB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sIG51bUJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKLSAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCi0gICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEgYXVkaW9fZm9ybWF0X3Qgc291cmNlID0gJXUsIGRlc3QgPSAldSIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKLSAgICAgICAgfQorCisgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uRm9ybWF0LAorICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgc291cmNlRm9ybWF0LCBudW1TYW1wbGVzKTsKKwogICAgICAgICBkZXN0aW5hdGlvbiArPSBudW1CeXRlczsKICAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNUb1Byb2Nlc3M7CiAgICAgfQpAQCAtMjYyLDcgKzI1Myw3IEBACiAKICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewogICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BJbnRlcm5hbCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaAppbmRleCA2NDM2YTUzLi4yNTFhN2YyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKLXVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIApAQCAtNDYsNyArNDUsNyBAQAogICAgIH0KIHByb3RlY3RlZDoKIAotICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbihpbnQzMl90IHNlcnZlck9mZnNldCA9IDApIG92ZXJyaWRlOwogCiAvKioKICAqIExvdyBsZXZlbCBkYXRhIHByb2Nlc3NpbmcgdGhhdCB3aWxsIG5vdCBibG9jay4gSXQgd2lsbCBqdXN0IHJlYWQgb3Igd3JpdGUgYXMgbXVjaCBhcyBpdCBjYW4uCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKaW5kZXggMTMwM2RhZi4uNzFiZGU5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcApAQCAtMTQsMTggKzE0LDI2IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgKG1JblNlcnZpY2UgPyAiQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXlfU2VydmljZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsUGxheV9DbGllbnQiKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAorLy8gV2UgZG8gdGhpcyBhZnRlciB0aGUgI2luY2x1ZGVzIGJlY2F1c2UgaWYgYSBoZWFkZXIgdXNlcyBBTE9HLgorLy8gaXQgd291bGQgZmFpbCBvbiB0aGUgcmVmZXJlbmNlIHRvIG1JblNlcnZpY2UuCisjdW5kZWYgTE9HX1RBRworLy8gVGhpcyBmaWxlIGlzIHVzZWQgaW4gYm90aCBjbGllbnQgYW5kIHNlcnZlciBwcm9jZXNzZXMuCisvLyBUaGlzIGlzIG5lZWRlZCB0byBtYWtlIHNlbnNlIG9mIHRoZSBsb2dzIG1vcmUgZWFzaWx5LgorI2RlZmluZSBMT0dfVEFHIChtSW5TZXJ2aWNlID8gIkF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5X1NlcnZpY2UiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJBdWRpb1N0cmVhbUludGVybmFsUGxheV9DbGllbnQiKQorCit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKIHVzaW5nIGFuZHJvaWQ6OldyYXBwaW5nQnVmZmVyOwogCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOwpAQCAtNDksNyArNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CiAKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIHJlbGVhc2VDbG9zZUZpbmFsKCk7CisgICAgICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gU2FtcGxlIHJhdGUgaXMgY29uc3RyYWluZWQgdG8gY29tbW9uIHZhbHVlcyBieSBub3cgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cuCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzID0ga1JhbXBNU2VjICogZ2V0U2FtcGxlUmF0ZSgpIC8gQUFVRElPX01JTExJU19QRVJfU0VDT05EOwpAQCAtNTksOSArNjcsOSBAQAogfQogCiAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0UGF1c2UoKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0UGF1c2VfbCgpCiB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2tfbCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNzYsNyArODQsNyBAQAogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdEZsdXNoKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0Rmx1c2hfbCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKQEAgLTg2LDggKzk0LDEzIEBACiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLmZsdXNoU3RyZWFtKG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKIH0KIAotdm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6YWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIHsKLSAgICBpbnQ2NF90IHJlYWRDb3VudGVyID0gbUF1ZGlvRW5kcG9pbnQtPmdldERhdGFSZWFkQ291bnRlcigpOwordm9pZCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIHsKKyAgICAvLyBQcmV2ZW50IHN0YWxlIGRhdGEgZnJvbSBiZWluZyBwbGF5ZWQuCisgICAgbUF1ZGlvRW5kcG9pbnQtPmVyYXNlRGF0YU1lbW9yeSgpOworfQorCit2b2lkIEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjphZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luKSB7CisgICAgaW50NjRfdCByZWFkQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhUmVhZENvdW50ZXIoKSArIHNlcnZlck1hcmdpbjsKICAgICBpbnQ2NF90IHdyaXRlQ291bnRlciA9IG1BdWRpb0VuZHBvaW50LT5nZXREYXRhV3JpdGVDb3VudGVyKCk7CiAKICAgICAvLyBCdW1wIG9mZnNldCBzbyBjYWxsZXIgZG9lcyBub3Qgc2VlIHRoZSByZXRyb2dyYWRlIG1vdGlvbiBpbiBnZXRGcmFtZXNSZWFkKCkuCkBAIC0xNDUsNyArMTU4LDkgQEAKICAgICBpZiAobU5lZWRDYXRjaFVwLmlzUmVxdWVzdGVkKCkpIHsKICAgICAgICAgLy8gQ2F0Y2ggYW4gTU1BUCBwb2ludGVyIHRoYXQgaXMgYWxyZWFkeSBhZHZhbmNpbmcuCiAgICAgICAgIC8vIFRoaXMgd2lsbCBhdm9pZCBpbml0aWFsIHVuZGVycnVucyBjYXVzZWQgYnkgYSBzbG93IGNvbGQgc3RhcnQuCi0gICAgICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oKTsKKyAgICAgICAgLy8gV2UgYWRkIGEgb25lIGJ1cnN0IG1hcmdpbiBpbiBjYXNlIHRoZSBEU1AgYWR2YW5jZXMgYmVmb3JlIHdlIGNhbiB3cml0ZSB0aGUgZGF0YS4KKyAgICAgICAgLy8gVGhpcyBjYW4gaGVscCBwcmV2ZW50IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbSBmcm9tIGJlaW5nIHNraXBwZWQuCisgICAgICAgIGFkdmFuY2VDbGllbnRUb01hdGNoU2VydmVyUG9zaXRpb24oZ2V0RnJhbWVzUGVyQnVyc3QoKSk7CiAgICAgICAgIG1OZWVkQ2F0Y2hVcC5hY2tub3dsZWRnZSgpOwogICAgIH0KIApAQCAtMjg3LDcgKzMwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2tSZXN1bHQgPT0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKSB7CiAgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEludGVybmFsKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCmluZGV4IDJlOTMxNTcuLjAzYzk1N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwotdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCkBAIC0zNiw5ICszNSw5IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZSgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2VfbCgpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2hfbCgpIG92ZXJyaWRlOwogCiAgICAgYm9vbCBpc0ZsdXNoU3VwcG9ydGVkKCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAvLyBPbmx5IGltcGxlbWVudCBGTFVTSCBmb3IgT1VUUFVUIHN0cmVhbXMuCkBAIC02NSw3ICs2NCw5IEBACiAKIHByb3RlY3RlZDoKIAotICAgIHZvaWQgYWR2YW5jZUNsaWVudFRvTWF0Y2hTZXJ2ZXJQb3NpdGlvbigpIG92ZXJyaWRlOworICAgIHZvaWQgcHJlcGFyZUJ1ZmZlcnNGb3JTdGFydCgpIG92ZXJyaWRlOworCisgICAgdm9pZCBhZHZhbmNlQ2xpZW50VG9NYXRjaFNlcnZlclBvc2l0aW9uKGludDMyX3Qgc2VydmVyTWFyZ2luID0gMCkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIG9uRmx1c2hGcm9tU2VydmVyKCkgb3ZlcnJpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCmluZGV4IDg5NjU4NzUuLmQxMDNhY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcApAQCAtODcsNiArODcsMzAgQEAKICAgICBzdHJlYW1CdWlsZGVyLT5zZXREZXZpY2VJZChkZXZpY2VJZCk7CiB9CiAKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBhY2thZ2VOYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSkKK3sKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBvcHRpb25hbFBhY2thZ2VOYW1lOworICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxscHRyKSB7CisgICAgICBvcHRpb25hbFBhY2thZ2VOYW1lID0gc3RkOjpzdHJpbmcocGFja2FnZU5hbWUpOworICAgIH0KKyAgICAvLyBPbmx5IHN5c3RlbSBhcHBzIGNhbiByZWFkIHRoZSBvcCBwYWNrYWdlIG5hbWUuIEZvciByZWd1bGFyIGFwcHMgdGhlCisgICAgLy8gcmVndWxhciBwYWNrYWdlIG5hbWUgaXMgYSBzdWZmaWNpZW50IHJlcGxhY2VtZW50CisgICAgc3RyZWFtQnVpbGRlci0+c2V0T3BQYWNrYWdlTmFtZShvcHRpb25hbFBhY2thZ2VOYW1lKTsKK30KKworQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QXR0cmlidXRpb25UYWcoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF0dHJpYnV0aW9uVGFnKQoreworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IG9wdGlvbmFsQXR0clRhZzsKKyAgICBpZiAoYXR0cmlidXRpb25UYWcgIT0gbnVsbHB0cikgeworICAgICAgb3B0aW9uYWxBdHRyVGFnID0gc3RkOjpzdHJpbmcoYXR0cmlidXRpb25UYWcpOworICAgIH0KKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRBdHRyaWJ1dGlvblRhZyhvcHRpb25hbEF0dHJUYWcpOworfQorCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlKQogewpAQCAtMjA5LDcgKzIzMyw2IEBACiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gQ09NTU9OX0dFVF9GUk9NX0JVSUxERVJfT1JfUkVUVVJOKHN0cmVhbVB0cik7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0cmVhbUJ1aWxkZXItPmJ1aWxkKCZhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgYXVkaW9TdHJlYW0tPnJlZ2lzdGVyUGxheWVyQmFzZSgpOwogICAgICAgICAqc3RyZWFtUHRyID0gKEFBdWRpb1N0cmVhbSopIGF1ZGlvU3RyZWFtOwogICAgICAgICBpZCA9IGF1ZGlvU3RyZWFtLT5nZXRJZCgpOwogICAgIH0gZWxzZSB7CkBAIC0yNTUsMTcgKzI3OCwxNiBAQAogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CiAgICAgICAgIGFhdWRpb19zdHJlYW1faWRfdCBpZCA9IGF1ZGlvU3RyZWFtLT5nZXRJZCgpOwogICAgICAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCk7Ci0gICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zYWZlUmVsZWFzZSgpOwotICAgICAgICAvLyBzYWZlUmVsZWFzZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgorICAgICAgICByZXN1bHQgPSBhdWRpb1N0cmVhbS0+c2FmZVJlbGVhc2VDbG9zZSgpOworICAgICAgICAvLyBzYWZlUmVsZWFzZUNsb3NlIHdpbGwgb25seSBmYWlsIGlmIGNhbGxlZCBpbGxlZ2FsbHksIGZvciBleGFtcGxlLCBmcm9tIGEgY2FsbGJhY2suCiAgICAgICAgIC8vIFRoYXQgd291bGQgcmVzdWx0IGluIGRlbGV0aW5nIGFuIGFjdGl2ZSBzdHJlYW0sIHdoaWNoIHdvdWxkIGNhdXNlIGEgY3Jhc2guCiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMocyMldSkgZmFpbGVkLiBDbG9zZSBpdCBmcm9tIGFub3RoZXIgdGhyZWFkLiIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXVkaW9TdHJlYW0tPnVucmVnaXN0ZXJQbGF5ZXJCYXNlKCk7Ci0gICAgICAgICAgICAgLy8gTWFyayBDTE9TRUQgdG8ga2VlcCBkZXN0cnVjdG9ycyBmcm9tIGFzc2VydGluZy4KLSAgICAgICAgICAgIGF1ZGlvU3RyZWFtLT5jbG9zZUZpbmFsKCk7Ci0gICAgICAgICAgICBkZWxldGUgYXVkaW9TdHJlYW07CisgICAgICAgICAgICAvLyBBbGxvdyB0aGUgc3RyZWFtIHRvIGJlIGRlbGV0ZWQuCisgICAgICAgICAgICBBdWRpb1N0cmVhbUJ1aWxkZXI6OnN0b3BVc2luZ1N0cmVhbShhdWRpb1N0cmVhbSk7CiAgICAgICAgIH0KICAgICAgICAgQUxPR0QoIiVzKHMjJXUpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCwgcmVzdWx0KTsKICAgICB9CkBAIC0zNDksNyArMzcxLDggQEAKIAogICAgIC8vIERvbid0IGFsbG93IHdyaXRlcyB3aGVuIHBsYXlpbmcgd2l0aCBhIGNhbGxiYWNrLgogICAgIGlmIChhdWRpb1N0cmVhbS0+aXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSkgewotICAgICAgICBBTE9HRCgiQ2Fubm90IHdyaXRlIHRvIGEgY2FsbGJhY2sgc3RyZWFtIHdoZW4gcnVubmluZy4iKTsKKyAgICAgICAgLy8gQSBkZXZlbG9wZXIgcmVxdWVzdGVkIHRoaXMgd2FybmluZyBiZWNhdXNlIGl0IHdvdWxkIGhhdmUgc2F2ZWQgbG90cyBvZiBkZWJ1Z2dpbmcuCisgICAgICAgIEFMT0dXKCIlcygpIC0gQ2Fubm90IHdyaXRlIHRvIGEgY2FsbGJhY2sgc3RyZWFtIHdoZW4gcnVubmluZy4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCA1ZjQ1MjYxLi5hY2ZhYzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC0yNSw4ICsyNSw3IEBACiAKIC8vIFRPRE8gVGhlc2UgZGVmaW5lcyBzaG91bGQgYmUgbW92ZWQgdG8gYSBjZW50cmFsIHBsYWNlIGluIGF1ZGlvLgogI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gICAgICAgIDEKLS8vIFRPRE8gUmVtb3ZlIDggY2hhbm5lbCBsaW1pdGF0aW9uLgotI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRV9NQVggICAgICAgIEZDQ184CisjZGVmaW5lIFNBTVBMRVNfUEVSX0ZSQU1FX01BWCAgICAgICAgRkNDX0xJTUlUCiAjZGVmaW5lIFNBTVBMRV9SQVRFX0haX01JTiAgICAgICAgICAgODAwMAogLy8gSERNSSBzdXBwb3J0cyB1cCB0byAzMiBjaGFubmVscyBhdCAxNTM2MDAwIEh6LgogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggICAgICAgICAgIDE2MDAwMDAKQEAgLTQ4LDEzICs0NywxNyBAQAogICAgIG1JbnB1dFByZXNldCAgICAgICAgICA9IG90aGVyLm1JbnB1dFByZXNldDsKICAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBvdGhlci5tQWxsb3dlZENhcHR1cmVQb2xpY3k7CiAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSAgID0gb3RoZXIubUlzUHJpdmFjeVNlbnNpdGl2ZTsKKyAgICBtT3BQYWNrYWdlTmFtZSAgICAgICAgPSBvdGhlci5tT3BQYWNrYWdlTmFtZTsKKyAgICBtQXR0cmlidXRpb25UYWcgICAgICAgPSBvdGhlci5tQXR0cmlidXRpb25UYWc7CiB9CiAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgogICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgogICAgICAgICAgICAgYnJlYWs7IC8vIHZhbGlkCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRCgiYXVkaW9Gb3JtYXQgbm90IHZhbGlkLCBhdWRpb19mb3JtYXRfdCA9IDB4JTA4eCIsIGZvcm1hdCk7CkBAIC0yMDEsNCArMjA0LDggQEAKICAgICBBTE9HRCgibUlucHV0UHJlc2V0ICAgICAgICAgID0gJTZkIiwgbUlucHV0UHJlc2V0KTsKICAgICBBTE9HRCgibUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gJTZkIiwgbUFsbG93ZWRDYXB0dXJlUG9saWN5KTsKICAgICBBTE9HRCgibUlzUHJpdmFjeVNlbnNpdGl2ZSAgID0gJXMiLCBtSXNQcml2YWN5U2Vuc2l0aXZlID8gInRydWUiIDogImZhbHNlIik7CisgICAgQUxPR0QoIm1PcFBhY2thZ2VOYW1lICAgICAgICA9ICVzIiwgIW1PcFBhY2thZ2VOYW1lLmhhc192YWx1ZSgpID8KKyAgICAgICAgIihudWxsKSIgOiBtT3BQYWNrYWdlTmFtZS52YWx1ZSgpLmNfc3RyKCkpOworICAgIEFMT0dEKCJtQXR0cmlidXRpb25UYWcgICAgICAgPSAlcyIsICFtQXR0cmlidXRpb25UYWcuaGFzX3ZhbHVlKCkgPworICAgICAgICAiKG51bGwpIiA6IG1BdHRyaWJ1dGlvblRhZy52YWx1ZSgpLmNfc3RyKCkpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggM2U2NWIzNy4uNTczNzA1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC0xMzYsNiArMTM2LDIzIEBACiAgICAgICAgIG1Jc1ByaXZhY3lTZW5zaXRpdmUgPSBwcml2YWN5U2Vuc2l0aXZlOwogICAgIH0KIAorICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IGdldE9wUGFja2FnZU5hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtT3BQYWNrYWdlTmFtZTsKKyAgICB9CisKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiByZWV4YW1pbmUgaWYgSWRlbnRpdHkgY2FuIGJlIHVzZWQKKyAgICB2b2lkIHNldE9wUGFja2FnZU5hbWUoY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gb3BQYWNrYWdlTmFtZSkgeworICAgICAgICBtT3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gZ2V0QXR0cmlidXRpb25UYWcoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQXR0cmlidXRpb25UYWc7CisgICAgfQorCisgICAgdm9pZCBzZXRBdHRyaWJ1dGlvblRhZyhjb25zdCBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBhdHRyaWJ1dGlvblRhZykgeworICAgICAgICBtQXR0cmlidXRpb25UYWcgPSBhdHRyaWJ1dGlvblRhZzsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGJ5dGVzIHBlciBmcmFtZSBvZiBnZXRGb3JtYXQoKQogICAgICAqLwpAQCAtMTY3LDYgKzE4NCw4IEBACiAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCAgICAgICAgICAgICBtU2Vzc2lvbklkICAgICAgICAgICAgPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzUHJpdmFjeVNlbnNpdGl2ZSAgID0gZmFsc2U7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gICAgICBtT3BQYWNrYWdlTmFtZSAgICAgICAgPSB7fTsKKyAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiAgICAgIG1BdHRyaWJ1dGlvblRhZyAgICAgICA9IHt9OwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmNwcAppbmRleCA3ZjVkOGQ1Li4wZTViOGJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5jcHAKQEAgLTgwLDYgKzgwLDggQEAKICAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRk9STUFUX0lOVkFMSUQpOwogICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kxNik7CiAgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19GT1JNQVRfUENNX0kzMik7CiAgICAgfQogICAgIHJldHVybiAiVW5yZWNvZ25pemVkIjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCmluZGV4IGY1Yzc1Y2EuLjA5ZDk1MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcApAQCAtMzksMTUgKzM5LDIzIEBACiB9CiAKIEF1ZGlvU3RyZWFtOjpBdWRpb1N0cmVhbSgpCi0gICAgICAgIDogbVBsYXllckJhc2UobmV3IE15UGxheWVyQmFzZSh0aGlzKSkKKyAgICAgICAgOiBtUGxheWVyQmFzZShuZXcgTXlQbGF5ZXJCYXNlKCkpCiAgICAgICAgICwgbVN0cmVhbUlkKEFBdWRpb19nZXROZXh0U3RyZWFtSWQoKSkKICAgICAgICAgewotICAgIC8vIG1UaHJlYWQgaXMgYSBwdGhyZWFkX3Qgb2YgdW5rbm93biBzaXplIHNvIHdlIG5lZWQgbWVtc2V0LgotICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcygwKTsKIH0KIAogQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKKyAgICAvLyBQbGVhc2UgcHJlc2VydmUgdGhlc2UgbG9ncyBiZWNhdXNlIHRoZXJlIGhhdmUgYmVlbiBzZXZlcmFsIGJ1Z3MgcmVsYXRlZCB0bworICAgIC8vIEF1ZGlvU3RyZWFtIGRlbGV0aW9uIGFuZCBsYXRlIGNhbGxiYWNrcy4KKyAgICBBTE9HRCgiJXMocyMldSkgbVBsYXllckJhc2Ugc3Ryb25nQ291bnQgPSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0SWQoKSwgbVBsYXllckJhc2UtPmdldFN0cm9uZ0NvdW50KCkpOworCisgICAgQUxPR0VfSUYocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCksCisgICAgICAgICAgICAiJXMoKSBkZXN0cnVjdG9yIHJ1bm5pbmcgaW4gY2FsbGJhY2siLCBfX2Z1bmNfXyk7CisKKyAgICBBTE9HRV9JRihtSGFzVGhyZWFkLCAiJXMoKSBjYWxsYmFjayB0aHJlYWQgbmV2ZXIgam9pbigpZWQiLCBfX2Z1bmNfXyk7CisKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtNTUsOCArNjMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ+QXVkaW9TdHJlYW0oKSAtIHN0aWxsIGluIHVzZSwgc3RhdGUgPSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwotCi0gICAgbVBsYXllckJhc2UtPmNsZWFyUGFyZW50UmVmZXJlbmNlKCk7IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gdGhpcyBBdWRpb1N0cmVhbQogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyJiBidWlsZGVyKQpAQCAtMTA1LDE0ICsxMTEsMjMgQEAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtOjpsb2dPcGVuKCkgewordm9pZCBBdWRpb1N0cmVhbTo6bG9nT3BlbkFjdHVhbCgpIHsKICAgICBpZiAobU1ldHJpY3NJZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQotICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BFUkZPUk1BTkNFTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgIEF1ZGlvR2xvYmFsX2NvbnZlcnRQZXJmb3JtYW5jZU1vZGVUb1RleHQoZ2V0UGVyZm9ybWFuY2VNb2RlKCkpKQotICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NIQVJJTkdNT0RFLAotICAgICAgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFNoYXJpbmdNb2RlVG9UZXh0KGdldFNoYXJpbmdNb2RlKCkpKQotICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpMb2dJdGVtIGl0ZW0obU1ldHJpY3NJZCk7CisgICAgICAgIGl0ZW0uc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX09QRU4pCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QRVJGT1JNQU5DRU1PREVBQ1RVQUwsCisgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFBlcmZvcm1hbmNlTW9kZVRvVGV4dChnZXRQZXJmb3JtYW5jZU1vZGUoKSkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TSEFSSU5HTU9ERUFDVFVBTCwKKyAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U2hhcmluZ01vZGVUb1RleHQoZ2V0U2hhcmluZ01vZGUoKSkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9CVUZGRVJDQVBBQ0lUWUZSQU1FUywgZ2V0QnVmZmVyQ2FwYWNpdHkoKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0JVUlNURlJBTUVTLCBnZXRGcmFtZXNQZXJCdXJzdCgpKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRElSRUNUSU9OLAorICAgICAgICAgICAgICAgIEF1ZGlvR2xvYmFsX2NvbnZlcnREaXJlY3Rpb25Ub1RleHQoZ2V0RGlyZWN0aW9uKCkpKTsKKworICAgICAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKKyAgICAgICAgICAgIGl0ZW0uc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZRVJJSUQsIG1QbGF5ZXJCYXNlLT5nZXRQbGF5ZXJJSWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaXRlbS5yZWNvcmQoKTsKICAgICB9CiB9CiAKQEAgLTEyNywxMyArMTQyLDEzIEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RhcnQoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwotCiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKwogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICAvLyBJcyB0aGlzIGEgZ29vZCB0aW1lIHRvIHN0YXJ0PwogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTjoKQEAgLTE2MiwxNiArMTc3LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RTdGFydCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0U3RhcnRfbCgpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgotICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0YXJ0KCk7CisgICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RhcnRXaXRoU3RhdHVzKGdldERldmljZUlkKCkpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnN5c3RlbVBhdXNlKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKIAogICAgIGlmICghaXNQYXVzZVN1cHBvcnRlZCgpKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKQEAgLTE4Miw2ICsxOTYsNyBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICAvLyBQcm9jZWVkIHdpdGggcGF1c2luZy4KICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgpAQCAtMjEyLDEwICsyMjcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gcmVxdWVzdFBhdXNlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlcXVlc3RQYXVzZV9sKCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCi0gICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+cGF1c2UoKTsKKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5wYXVzZVdpdGhTdGF0dXMoKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIyNiw0NiArMjQxLDQwIEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKICAgICB9CiAKLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoInN0cmVhbSBjYW5ub3QgYmUgZmx1c2hlZCBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb19pc0ZsdXNoQWxsb3dlZChnZXRTdGF0ZSgpKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAotICAgIHJldHVybiByZXF1ZXN0Rmx1c2goKTsKKyAgICByZXR1cm4gcmVxdWVzdEZsdXNoX2woKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wSW50ZXJuYWwoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcF9sKCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCi0gICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOworICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3BXaXRoU3RhdHVzKCk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RvcEZyb21BcHAoKSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIC8vIFRoaXMgY2hlY2sgY2FuIGFuZCBzaG91bGQgYmUgZG9uZSBvdXRzaWRlIHRoZSBsb2NrLgogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgYnkgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2shIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNhZmVTdG9wKCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgLy8gV2Ugb25seSBjYWxsIHRoaXMgZm9yIGxvZ2dpbmcgaW4gImR1bXBzeXMgYXVkaW8iLiBTbyBpZ25vcmUgcmV0dXJuIGNvZGUuCi0gICAgICAgICh2b2lkKSBtUGxheWVyQmFzZS0+c3RvcCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBzeXN0ZW1TdG9wSW50ZXJuYWwoKTsKIH0KIAotLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wX2woKSB7CiAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgLy8gUHJvY2VlZCB3aXRoIHN0b3BwaW5nLgpAQCAtMjk3LDI2ICszMDYsNjEgQEAKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKLSAgICByZXR1cm4gcmVxdWVzdFN0b3AoKTsKKyAgICByZXR1cm4gcmVxdWVzdFN0b3BfbCgpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVSZWxlYXNlKCkgewotICAgIC8vIFRoaXMgZ2V0IHRlbXBvcmFyaWx5IHVubG9ja2VkIGluIHRoZSByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCi0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CiAgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9Ci0gICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKSB7CisgICAgLy8gVGhpcyBtYXkgZ2V0IHRlbXBvcmFyaWx5IHVubG9ja2VkIGluIHRoZSBNTUFQIHJlbGVhc2UoKSB3aGVuIGpvaW5pbmcgY2FsbGJhY2sgdGhyZWFkcy4KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKSB7IC8vIGFscmVhZHkgcmVsZWFzZWQ/CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogICAgIHJldHVybiByZWxlYXNlX2woKTsKIH0KIAorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlUmVsZWFzZUNsb3NlKCkgeworICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYW5ub3QgYmUgY2FsbGVkIGZyb20gYSBjYWxsYmFjayEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKKyAgICB9CisgICAgcmV0dXJuIHNhZmVSZWxlYXNlQ2xvc2VJbnRlcm5hbCgpOworfQorCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVSZWxlYXNlQ2xvc2VJbnRlcm5hbCgpIHsKKyAgICAvLyBUaGlzIGdldCB0ZW1wb3JhcmlseSB1bmxvY2tlZCBpbiB0aGUgTU1BUCByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIHJlbGVhc2VDbG9zZUZpbmFsX2woKTsKKyAgICByZXR1cm4gQUFVRElPX09LOworfQorCit2b2lkIEF1ZGlvU3RyZWFtOjpjbG9zZV9sKCkgeworICAgIC8vIFJlbGVhc2luZyB0aGUgc3RyZWFtIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byBDTE9TSU5HLgorICAgIGFzc2VydChnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7CisgICAgLy8gc2V0U3RhdGUoKSBwcmV2ZW50cyBhIHRyYW5zaXRpb24gZnJvbSBDTE9TSU5HIHRvIGFueSBzdGF0ZSBvdGhlciB0aGFuIENMT1NFRC4KKyAgICAvLyBTdGF0ZSBpcyBjaGVja2VkIGJ5IGRlc3RydWN0b3IuCisgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOworCisgICAgaWYgKCFtTWV0cmljc0lkLmVtcHR5KCkpIHsKKyAgICAgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVTVFJBTlNGRVJSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUID8gZ2V0RnJhbWVzV3JpdHRlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0RnJhbWVzUmVhZCgpKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfRU5EQUFVRElPU1RSRUFNKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9TdHJlYW06OnNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSkgewogICAgIEFMT0dEKCIlcyhzIyVkKSBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sIGdldElkKCksIG1TdGF0ZSwgc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBtU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKKyAgICB9CiAgICAgLy8gVHJhY2sgdHJhbnNpdGlvbiB0byBESVNDT05ORUNURUQgc3RhdGUuCi0gICAgaWYgKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEICYmIG1TdGF0ZSAhPSBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewogICAgICAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKICAgICAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0RJU0NPTk5FQ1QpCiAgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBVEUsIEF1ZGlvR2xvYmFsX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSkKQEAgLTMyNCwxOCArMzY4LDE4IEBACiAgICAgfQogICAgIC8vIENMT1NFRCBpcyBhIGZpbmFsIHN0YXRlCiAgICAgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICBBTE9HRSgiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TRUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOworICAgICAgICBBTE9HVygiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TRUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOwogCiAgICAgLy8gT25jZSBDTE9TSU5HLCB3ZSBjYW4gb25seSBtb3ZlIHRvIENMT1NFRCBzdGF0ZS4KICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcKICAgICAgICAgICAgICAgICYmIHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglZCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IENMT1NJTkciLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOworICAgICAgICBBTE9HVygiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TSU5HIiwgX19mdW5jX18sIGdldElkKCksIHN0YXRlKTsKIAogICAgIC8vIE9uY2UgRElTQ09OTkVDVEVELCB3ZSBjYW4gb25seSBtb3ZlIHRvIENMT1NJTkcgb3IgQ0xPU0VEIHN0YXRlLgogICAgIH0gZWxzZSBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVECiAgICAgICAgICAgICAgICAmJiAhKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORwogICAgICAgICAgICAgICAgICAgIHx8IHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSkgewotICAgICAgICBBTE9HRSgiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBESVNDT05ORUNURUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOworICAgICAgICBBTE9HVygiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBESVNDT05ORUNURUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOwogCiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gc3RhdGU7CkBAIC0zODcsMjIgKzQzMSwyOSBAQAogICAgIHJldHVybiBwcm9jUmVzdWx0OwogfQogCi0vLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIG5ldyB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVUaHJlYWQoKS4KKworLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBuZXcgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlVGhyZWFkX2woKS4KIC8vIEl0IGNvbnZlcnRzIHRoZSAnQycgZnVuY3Rpb24gY2FsbCB0byBhIEMrKyBtZXRob2QgY2FsbC4KIHN0YXRpYyB2b2lkKiBBdWRpb1N0cmVhbV9pbnRlcm5hbFRocmVhZFByb2Modm9pZCogdGhyZWFkQXJnKSB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gKEF1ZGlvU3RyZWFtICopIHRocmVhZEFyZzsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPndyYXBVc2VyVGhyZWFkKCk7CisgICAgLy8gUHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgZGVsZXRlZCB3aGlsZSBiZWluZyB1c2VkLgorICAgIC8vIFRoaXMgaXMganVzdCBmb3IgZXh0cmEgc2FmZXR5LiBJdCBpcyBwcm9iYWJseSBub3QgbmVlZGVkIGJlY2F1c2UKKyAgICAvLyB0aGlzIGNhbGxiYWNrIHNob3VsZCBiZSBqb2luZWQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgorICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiBwcm90ZWN0ZWRTdHJlYW0oYXVkaW9TdHJlYW0pOworICAgIC8vIEJhbGFuY2UgdGhlIGluY1N0cm9uZygpIGluIGNyZWF0ZVRocmVhZF9sKCkuCisgICAgcHJvdGVjdGVkU3RyZWFtLT5kZWNTdHJvbmcobnVsbHB0cik7CisgICAgcmV0dXJuIHByb3RlY3RlZFN0cmVhbS0+d3JhcFVzZXJUaHJlYWQoKTsKIH0KIAogLy8gVGhpcyBpcyBub3QgZXhwb3NlZCBpbiB0aGUgQVBJLgogLy8gQnV0IGl0IGlzIHN0aWxsIHVzZWQgaW50ZXJuYWxseSB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGZvciBNTUFQIG1vZGUuCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmNyZWF0ZVRocmVhZChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19hdWRpb190aHJlYWRfcHJvY190IHRocmVhZFByb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdGhyZWFkQXJnKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpjcmVhdGVUaHJlYWRfbChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fYXVkaW9fdGhyZWFkX3Byb2NfdCB0aHJlYWRQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB0aHJlYWRBcmcpCiB7CiAgICAgaWYgKG1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRocmVhZCgpIC0gbUhhc1RocmVhZCBhbHJlYWR5IHRydWUiKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgICAgICBBTE9HRCgiJXMoKSAtIHByZXZpb3VzIHRocmVhZCB3YXMgbm90IGpvaW5lZCwgam9pbiBub3cgdG8gYmUgc2FmZSIsIF9fZnVuY19fKTsKKyAgICAgICAgam9pblRocmVhZF9sKG51bGxwdHIpOwogICAgIH0KICAgICBpZiAodGhyZWFkUHJvYyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKQEAgLTQxMSwxMCArNDYyLDE2IEBACiAgICAgbVRocmVhZFByb2MgPSB0aHJlYWRQcm9jOwogICAgIG1UaHJlYWRBcmcgPSB0aHJlYWRBcmc7CiAgICAgc2V0UGVyaW9kTmFub3NlY29uZHMocGVyaW9kTmFub3NlY29uZHMpOworICAgIG1IYXNUaHJlYWQgPSB0cnVlOworICAgIC8vIFByZXZlbnQgdGhpcyBvYmplY3QgZnJvbSBnZXR0aW5nIGRlbGV0ZWQgYmVmb3JlIHRoZSB0aHJlYWQgaGFzIGEgY2hhbmNlIHRvIGNyZWF0ZQorICAgIC8vIGl0cyBzdHJvbmcgcG9pbnRlci4gQXNzdW1lIHRoZSB0aHJlYWQgd2lsbCBjYWxsIGRlY1N0cm9uZygpLgorICAgIHRoaXMtPmluY1N0cm9uZyhudWxscHRyKTsKICAgICBpbnQgZXJyID0gcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsIG51bGxwdHIsIEF1ZGlvU3RyZWFtX2ludGVybmFsVGhyZWFkUHJvYywgdGhpcyk7CiAgICAgaWYgKGVyciAhPSAwKSB7CiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IC1lcnJubzsKLSAgICAgICAgQUxPR0UoImNyZWF0ZVRocmVhZCgpIC0gcHRocmVhZF9jcmVhdGUoKSBmYWlsZWQsICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgLSBwdGhyZWFkX2NyZWF0ZSgpIGZhaWxlZCwgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgdGhpcy0+ZGVjU3Ryb25nKG51bGxwdHIpOyAvLyBCZWNhdXNlIHRoZSB0aHJlYWQgd29uJ3QgZG8gaXQuCisgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETyBVc2UgQUF1ZGlvVGhyZWFkIG9yIG1heWJlIEFuZHJvaWRUaHJlYWQKQEAgLTQyOSw0MSArNDg2LDQyIEBACiAgICAgICAgIGVyciA9IHB0aHJlYWRfc2V0bmFtZV9ucChtVGhyZWFkLCBuYW1lKTsKICAgICAgICAgQUxPR1dfSUYoKGVyciAhPSAwKSwgIkNvdWxkIG5vdCBzZXQgbmFtZSBvZiBBQXVkaW8gdGhyZWFkLiBlcnIgPSAlZCIsIGVycik7CiAKLSAgICAgICAgbUhhc1RocmVhZCA9IHRydWU7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogfQogCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZykgeworICAgIC8vIFRoaXMgbWF5IGdldCB0ZW1wb3JhcmlseSB1bmxvY2tlZCBpbiB0aGUgTU1BUCByZWxlYXNlKCkgd2hlbiBqb2luaW5nIGNhbGxiYWNrIHRocmVhZHMuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworICAgIHJldHVybiBqb2luVGhyZWFkX2wocmV0dXJuQXJnKTsKK30KKwogLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnLCBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyBfX3VudXNlZCkKLXsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6am9pblRocmVhZF9sKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICBpZiAoIW1IYXNUaHJlYWQpIHsKLSAgICAgICAgQUxPR0UoImpvaW5UaHJlYWQoKSAtIGJ1dCBoYXMgbm8gdGhyZWFkIik7CisgICAgICAgIEFMT0dEKCJqb2luVGhyZWFkKCkgLSBidXQgaGFzIG5vIHRocmVhZCBvciBhbHJlYWR5IGpvaW4oKWVkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgaXMgc3RvcHBpbmcgdGhlIHN0cmVhbSBiZWNhdXNlIHRoZSBhcHAgcGFzc2VkIGJhY2sgU1RPUAogICAgIC8vIHRoZW4gd2UgZG9uJ3QgbmVlZCB0byBqb2luKCkuIFRoZSB0aHJlYWQgaXMgYWxyZWFkeSBhYm91dCB0byBleGl0LgotICAgIGlmIChwdGhyZWFkX3NlbGYoKSAhPSBtVGhyZWFkKSB7CisgICAgaWYgKCFwdGhyZWFkX2VxdWFsKHB0aHJlYWRfc2VsZigpLCBtVGhyZWFkKSkgewogICAgICAgICAvLyBDYWxsZWQgZnJvbSBhbiBhcHAgdGhyZWFkLiBOb3QgdGhlIGNhbGxiYWNrLgogICAgICAgICAvLyBVbmxvY2sgYmVjYXVzZSB0aGUgY2FsbGJhY2sgbWF5IGJlIHRyeWluZyB0byBzdG9wIHRoZSBzdHJlYW0gYnV0IGlzIGJsb2NrZWQuCiAgICAgICAgIG1TdHJlYW1Mb2NrLnVubG9jaygpOwotI2lmIDAKLSAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQgZXF1aXZhbGVudCBvZiBwdGhyZWFkX3RpbWVkam9pbl9ucCgpCi0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyBhYnN0aW1lOwotICAgICAgICBpbnQgZXJyID0gcHRocmVhZF90aW1lZGpvaW5fbnAobVRocmVhZCwgcmV0dXJuQXJnLCAmYWJzdGltZSk7Ci0jZWxzZQogICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7Ci0jZW5kaWYKICAgICAgICAgbVN0cmVhbUxvY2subG9jaygpOwogICAgICAgICBpZiAoZXJyKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXMoKSBwdGhyZWFkX2pvaW4oKSByZXR1cm5zIGVyciA9ICVkIiwgX19mdW5jX18sIGVycik7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpIHB0aHJlYWRfam9pbiBzdWNjZWVkZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAvLyBQcmV2ZW50IGpvaW5pbmcgYSBzZWNvbmQgdGltZSwgd2hpY2ggaGFzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAgICAgICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCIlcygpIHB0aHJlYWRfam9pbigpIGNhbGxlZCBvbiBpdHNlbGYhIiwgX19mdW5jX18pOwogICAgIH0KLSAgICAvLyBUaGlzIG11c3QgYmUgc2V0IGZhbHNlIHNvIHRoYXQgdGhlIGNhbGxiYWNrIHRocmVhZCBjYW4gYmUgY3JlYXRlZAotICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCi0gICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgIHJldHVybiAocmVzdWx0ICE9IEFBVURJT19PSykgPyByZXN1bHQgOiBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0OwogfQogCkBAIC01MjAsMTEgKzU3OCwxOCBAQAogfQogCiAjaWYgQUFVRElPX1VTRV9WT0xVTUVfU0hBUEVSCi1hbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9TdHJlYW06OmFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAotICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbiBfX3VudXNlZCkgewotICAgIEFMT0dXKCJhcHBseVZvbHVtZVNoYXBlcigpIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICByZXR1cm4gYW5kcm9pZDo6bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzOjpvaygpOworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCA6OmFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSB7CisgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+IGF1ZGlvU3RyZWFtOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVBhcmVudExvY2spOworICAgICAgICBhdWRpb1N0cmVhbSA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIH0KKyAgICBpZiAoYXVkaW9TdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CiAjZW5kaWYKIApAQCAtNTM0LDI2ICs1OTksMzcgQEAKICAgICBkb1NldFZvbHVtZSgpOyAvLyBhcHBseSB0aGlzIGNoYW5nZQogfQogCi1BdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCkgOiBtUGFyZW50KHBhcmVudCkgewotfQotCi1BdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgewotfQotCi12b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpIHsKK3ZvaWQgQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6cmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKGNvbnN0IGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiYgcGFyZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVBhcmVudExvY2spOworICAgIG1QYXJlbnQgPSBwYXJlbnQ7CiAgICAgaWYgKCFtUmVnaXN0ZXJlZCkgewotICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwobVBhcmVudC0+Z2V0VXNhZ2UoKSkpOworICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwocGFyZW50LT5nZXRVc2FnZSgpKSwKKyAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpcGFyZW50LT5nZXRTZXNzaW9uSWQoKSk7CiAgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6dW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVBhcmVudExvY2spOwogICAgIGlmIChtUmVnaXN0ZXJlZCkgewogICAgICAgICBiYXNlRGVzdHJveSgpOwogICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOwogICAgIH0KIH0KIAorYW5kcm9pZDo6c3RhdHVzX3QgQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6cGxheWVyU2V0Vm9sdW1lKCkgeworICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiBhdWRpb1N0cmVhbTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1QYXJlbnRMb2NrKTsKKyAgICAgICAgYXVkaW9TdHJlYW0gPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICB9CisgICAgaWYgKGF1ZGlvU3RyZWFtKSB7CisgICAgICAgIC8vIE5vIHBhbiBhbmQgb25seSBsZWZ0IHZvbHVtZSBpcyB0YWtlbiBpbnRvIGFjY291bnQgZnJvbSBJUExheWVyIGludGVyZmFjZQorICAgICAgICBhdWRpb1N0cmVhbS0+c2V0RHVja0FuZE11dGVWb2x1bWUobVZvbHVtZU11bHRpcGxpZXJMICAvKiBtUGFuTXVsdGlwbGllckwgKi8pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7Cit9CisKIHZvaWQgQXVkaW9TdHJlYW06Ok15UGxheWVyQmFzZTo6ZGVzdHJveSgpIHsKICAgICB1bnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAppbmRleCBmYjcxYzM2Li45ODM1YzhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaApAQCAtMjAsMTMgKzIwLDE3IEBACiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotI2luY2x1ZGUgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIgotI2luY2x1ZGUgIm1lZGlhL1BsYXllckJhc2UuaCIKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9QbGF5ZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CisKICNpbmNsdWRlICJ1dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIgogI2luY2x1ZGUgInV0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIgogCkBAIC00NSw3ICs0OSw4IEBACiAvKioKICAqIEFBdWRpbyBhdWRpbyBzdHJlYW0uCiAgKi8KLWNsYXNzIEF1ZGlvU3RyZWFtIHsKKy8vIEJ5IGV4dGVuZGluZyBBdWRpb0RldmljZUNhbGxiYWNrLCB3ZSBhbHNvIGluaGVyaXQgZnJvbSBSZWZCYXNlLgorY2xhc3MgQXVkaW9TdHJlYW0gOiBwdWJsaWMgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgewogcHVibGljOgogCiAgICAgQXVkaW9TdHJlYW0oKTsKQEAgLTU0LDExICs1OSw2IEBACiAKIHByb3RlY3RlZDoKIAotICAgIC8qIEFzeW5jaHJvbm91cyByZXF1ZXN0cy4KLSAgICAgKiBVc2Ugd2FpdEZvclN0YXRlQ2hhbmdlKCkgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSA9IDA7Ci0KICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgc3RhdGUgdG8gc2VlIGlmIFBhdXNlIGlzIGN1cnJlbnRseSBsZWdhbC4KICAgICAgKgpAQCAtNzcsMTggKzc3LDIyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0UGF1c2UoKQotICAgIHsKKyAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCisgICAgICogVXNlIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCisgICAgICovCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0X2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgPSAwOworCisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgewogICAgICAgICAvLyBPbmx5IGltcGxlbWVudCB0aGlzIGZvciBPVVRQVVQgc3RyZWFtcy4KICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIHsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2hfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSB7CiAgICAgICAgIC8vIE9ubHkgaW1wbGVtZW50IHRoaXMgZm9yIE9VVFBVVCBzdHJlYW1zLgogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CiAgICAgfQogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3AoKSA9IDA7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSA9IDA7CiAKIHB1YmxpYzoKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCkBAIC0xMTQsMzYgKzExOCwzNyBAQAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyJiBidWlsZGVyKTsKIAogICAgIC8vIGxvZyB0byBNZWRpYU1ldHJpY3MKLSAgICB2aXJ0dWFsIHZvaWQgbG9nT3BlbigpOworICAgIHZpcnR1YWwgdm9pZCBsb2dPcGVuQWN0dWFsKCk7CiAgICAgdm9pZCBsb2dSZWxlYXNlQnVmZmVyU3RhdGUoKTsKIAorICAgIC8qIE5vdGUgYWJvdXQgbmFtaW5nIGZvciAicmVsZWFzZSIgIGFuZCAiY2xvc2UiIHJlbGF0ZWQgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIFRoZXNlIG5hbWVzIGFyZSBpbnRlbmRlZCB0byBtYXRjaCB0aGUgcHVibGljIEFBdWRpbyBBUEkuCisgICAgICogVGhlIG9yaWdpbmFsIEFBdWRpbyBBUEkgaGFkIGFuIEFBdWRpb1N0cmVhbV9jbG9zZSgpIGZ1bmN0aW9uIHRoYXQKKyAgICAgKiByZWxlYXNlZCB0aGUgaGFyZHdhcmUgYW5kIGRlbGV0ZWQgdGhlIHN0cmVhbS4gVGhhdCBtYWRlIGl0IGRpZmZpY3VsdAorICAgICAqIGJlY2F1c2UgYXBwcyB3YW50IHRvIHJlbGVhc2UgdGhlIEhXIEFTQVAgYnV0IGFyZSBub3QgaW4gYSBydXNoIHRvIGRlbGV0ZQorICAgICAqIHRoZSBzdHJlYW0gb2JqZWN0LiBTbyBpbiBSIHdlIGFkZGVkIGFuIEFBdWRpb1N0cmVhbV9yZWxlYXNlKCkgZnVuY3Rpb24KKyAgICAgKiB0aGF0IGp1c3QgcmVsZWFzZWQgdGhlIGhhcmR3YXJlLgorICAgICAqIFRoZSBBQXVkaW9TdHJlYW1fY2xvc2UoKSBtZXRob2QgcmVsZWFzZXMgaWYgbmVlZGVkIGFuZCB0aGVuIGNsb3Nlcy4KKyAgICAgKi8KKworcHJvdGVjdGVkOgogICAgIC8qKgogICAgICAqIEZyZWUgYW55IGhhcmR3YXJlIG9yIHN5c3RlbSByZXNvdXJjZXMgZnJvbSB0aGUgb3BlbigpIGNhbGwuCiAgICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHJlbGVhc2VfbCgpIG11bHRpcGxlIHRpbWVzLgogICAgICAqLwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlbGVhc2VfbCgpIHsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgewogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIAotICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZUZpbmFsKCkgewotICAgICAgICAvLyBTdGF0ZSBpcyBjaGVja2VkIGJ5IGRlc3RydWN0b3IuCi0gICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKLSAgICB9Ci0KICAgICAvKioKLSAgICAgKiBSZWxlYXNlIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KLSAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBuZWdhdGl2ZSBlcnJvci4KKyAgICAgKiBGcmVlIGFueSByZXNvdXJjZXMgbm90IGFscmVhZHkgZnJlZWQgYnkgcmVsZWFzZV9sKCkuCisgICAgICogQXNzdW1lIHJlbGVhc2VfbCgpIGFscmVhZHkgY2FsbGVkLgogICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlQ2xvc2VGaW5hbCgpIHsKLSAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHJlbGVhc2VfbCgpOyAvLyBUT0RPIHJldmlldyBsb2NraW5nCi0gICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2xvc2VGaW5hbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQorICAgIHZpcnR1YWwgdm9pZCBjbG9zZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spOwogCitwdWJsaWM6CiAgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gaWRlbnRpZnkgYSBzdHJlYW0gaW4gdGhlIGxvZ3Mgd2l0aG91dAogICAgIC8vIHJldmVhbGluZyBhbnkgcG9pbnRlcnMuCiAgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGdldElkKCkgewpAQCAtMTUyLDExICsxNTcsMTUgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHNldEJ1ZmZlclNpemUoaW50MzJfdCByZXF1ZXN0ZWRGcmFtZXMpID0gMDsKIAotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IGNyZWF0ZVRocmVhZChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgdGhyZWFkUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRocmVhZEFyZyk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGNyZWF0ZVRocmVhZChpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgdGhyZWFkUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnRocmVhZEFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0xVREVTKG1TdHJlYW1Mb2NrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRocmVhZF9sKHBlcmlvZE5hbm9zZWNvbmRzLCB0aHJlYWRQcm9jLCB0aHJlYWRBcmcpOworICAgIH0KIAotICAgIGFhdWRpb19yZXN1bHRfdCBqb2luVGhyZWFkKHZvaWQgKipyZXR1cm5BcmcsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgam9pblRocmVhZCh2b2lkICoqcmV0dXJuQXJnKTsKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyVGhyZWFkKCkgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMTgzLDExICsxOTIsMTEgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICAgICAgcmV0dXJuIG1GcmFtZXNQZXJCdXJzdDsKICAgICB9CiAKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3QgewpAQCAtMzI4LDYgKzMzNywxMCBAQAogICAgICAqLwogICAgIGJvb2wgY29sbGlkZXNXaXRoQ2FsbGJhY2soKSBjb25zdDsKIAorICAgIC8vIEltcGxlbWVudCBBdWRpb0RldmljZUNhbGxiYWNrCisgICAgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSBvdmVycmlkZSB7fTsKKwogICAgIC8vID09PT09PT09PT09PT09IEkvTyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAvLyBBIFN0cmVhbSB3aWxsIG9ubHkgaW1wbGVtZW50IHJlYWQoKSBvciB3cml0ZSgpIGRlcGVuZGluZyBvbiBpdHMgZGlyZWN0aW9uLgogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciBfX3VudXNlZCwKQEAgLTM2Niw3ICszNzksNyBAQAogICAgICAqLwogICAgIHZvaWQgcmVnaXN0ZXJQbGF5ZXJCYXNlKCkgewogICAgICAgICBpZiAoZ2V0RGlyZWN0aW9uKCkgPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIG1QbGF5ZXJCYXNlLT5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKKyAgICAgICAgICAgIG1QbGF5ZXJCYXNlLT5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5MywyMyArNDA2LDM3IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIGFuIGFwcCBjYWxsYmFjayByZXR1cm5zIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUC4KICAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wSW50ZXJuYWwoKTsKIAorICAgIC8qKgorICAgICAqIFNhZmVseSBSRUxFQVNFIGEgc3RyZWFtIGFmdGVyIHRha2luZyBtU3RyZWFtTG9jayBhbmQgY2hlY2tpbmcKKyAgICAgKiB0byBtYWtlIHN1cmUgd2UgYXJlIG5vdCBiZWluZyBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAgICAgKi8KICAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVJlbGVhc2UoKTsKIAorICAgIC8qKgorICAgICAqIFNhZmVseSBSRUxFQVNFIGFuZCBDTE9TRSBhIHN0cmVhbSBhZnRlciB0YWtpbmcgbVN0cmVhbUxvY2sgYW5kIGNoZWNraW5nCisgICAgICogdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgYmVpbmcgY2FsbGVkIGZyb20gYSBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVSZWxlYXNlQ2xvc2UoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlUmVsZWFzZUNsb3NlSW50ZXJuYWwoKTsKKwogcHJvdGVjdGVkOgogCiAgICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0gdm9sdW1lLgogICAgIGNsYXNzIE15UGxheWVyQmFzZSA6IHB1YmxpYyBhbmRyb2lkOjpQbGF5ZXJCYXNlIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IE15UGxheWVyQmFzZShBdWRpb1N0cmVhbSAqcGFyZW50KTsKKyAgICAgICAgTXlQbGF5ZXJCYXNlKCkge307CiAKLSAgICAgICAgdmlydHVhbCB+TXlQbGF5ZXJCYXNlKCk7CisgICAgICAgIHZpcnR1YWwgfk15UGxheWVyQmFzZSgpID0gZGVmYXVsdDsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmVnaXN0ZXIgZm9yIHZvbHVtZSBjaGFuZ2VzIGFuZCByZW1vdGUgY29udHJvbC4KICAgICAgICAgICovCi0gICAgICAgIHZvaWQgcmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKCk7CisgICAgICAgIHZvaWQgcmVnaXN0ZXJXaXRoQXVkaW9NYW5hZ2VyKGNvbnN0IGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiYgcGFyZW50KTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVW5SZWdpc3Rlci4KQEAgLTQyMSw4ICs0NDgsNiBAQAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBkZXN0cm95KCkgb3ZlcnJpZGU7CiAKLSAgICAgICAgdm9pZCBjbGVhclBhcmVudFJlZmVyZW5jZSgpIHsgbVBhcmVudCA9IG51bGxwdHI7IH0KLQogICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gc3RhcnQgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0YXJ0KCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwpAQCAtNDM4LDI4ICs0NjMsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCi0gICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclNldFZvbHVtZSgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8vIE5vIHBhbiBhbmQgb25seSBsZWZ0IHZvbHVtZSBpcyB0YWtlbiBpbnRvIGFjY291bnQgZnJvbSBJUExheWVyIGludGVyZmFjZQotICAgICAgICAgICAgbVBhcmVudC0+c2V0RHVja0FuZE11dGVWb2x1bWUobVZvbHVtZU11bHRpcGxpZXJMICAvKiAqIG1QYW5NdWx0aXBsaWVyTCAqLyk7Ci0gICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGU7CiAKICNpZiBBQVVESU9fVVNFX1ZPTFVNRV9TSEFQRVIKLSAgICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIG1QYXJlbnQtPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZ3VyYXRpb24sIG9wZXJhdGlvbik7Ci0gICAgICAgIH0KKyAgICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigpOwogI2VuZGlmCiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFJlc3VsdCgpIHsKICAgICAgICAgICAgIHJldHVybiBtUmVzdWx0OwogICAgICAgICB9CiAKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgcGxheWVySUlkIGlmIHJlZ2lzdGVyZWQsIC0xIG90aGVyd2lzZS4KKyAgICAgICAgaW50MzJfdCBnZXRQbGF5ZXJJSWQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVBJSWQ7CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6Ci0gICAgICAgIEF1ZGlvU3RyZWFtICAgICAgICAgICptUGFyZW50OwotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgbVJlc3VsdCA9IEFBVURJT19PSzsKLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CisgICAgICAgIC8vIFVzZSBhIHdlYWsgcG9pbnRlciBzbyB0aGUgQXVkaW9TdHJlYW0gY2FuIGJlIGRlbGV0ZWQuCisgICAgICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICBtUGFyZW50TG9jazsKKyAgICAgICAgYW5kcm9pZDo6d3A8QXVkaW9TdHJlYW0+IG1QYXJlbnQgR1VBUkRFRF9CWShtUGFyZW50TG9jayk7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBtUmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICB9OwogCiAgICAgLyoqCkBAIC00NzAsMzAgKzQ5NCwzMiBAQAogICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCi0gICAgICovCisgICAgLy8gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgdm9pZCBzZXRTYW1wbGVzUGVyRnJhbWUoaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpIHsKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KLSAgICAgKi8KKyAgICAvLyBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KKyAgICB2b2lkIHNldEZyYW1lc1BlckJ1cnN0KGludDMyX3QgZnJhbWVzUGVyQnVyc3QpIHsKKyAgICAgICAgbUZyYW1lc1BlckJ1cnN0ID0gZnJhbWVzUGVyQnVyc3Q7CisgICAgfQorCisgICAgLy8gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgdm9pZCBzZXRCdWZmZXJDYXBhY2l0eShpbnQzMl90IGJ1ZmZlckNhcGFjaXR5KSB7CisgICAgICAgIG1CdWZmZXJDYXBhY2l0eSA9IGJ1ZmZlckNhcGFjaXR5OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0U2hhcmluZ01vZGUoYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7CiAgICAgICAgIG1TaGFyaW5nTW9kZSA9IHNoYXJpbmdNb2RlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgotICAgICAqLworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgotICAgICAqLworICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRGV2aWNlRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KQEAgLTUwOCwxMCArNTM0LDE4IEBACiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KIAorICAgIC8vIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgIHZvaWQgc2V0U2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKSB7CiAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiAgICAgfQogCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNyZWF0ZVRocmVhZF9sKGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QgdGhyZWFkUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0aHJlYWRBcmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRVMobVN0cmVhbUxvY2spOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGpvaW5UaHJlYWRfbCh2b2lkICoqcmV0dXJuQXJnKSBSRVFVSVJFUyhtU3RyZWFtTG9jayk7CisKICAgICBzdGQ6OmF0b21pYzxib29sPiAgICBtQ2FsbGJhY2tFbmFibGVke2ZhbHNlfTsKIAogICAgIGZsb2F0ICAgICAgICAgICAgICAgIG1EdWNrQW5kTXV0ZVZvbHVtZSA9IDEuMGY7CkBAIC01NzgsMTEgKzYxMiwyMiBAQAogCiAgICAgc3RkOjpzdHJpbmcgbU1ldHJpY3NJZDsgLy8gc2V0IG9uY2UgZHVyaW5nIG9wZW4oKQogCisgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CisKIHByaXZhdGU6CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3BfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKTsKIAotICAgIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgIG1TdHJlYW1Mb2NrOworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlbiBjbG9zZSB0aGUgc3RyZWFtLgorICAgICAqLworICAgIHZvaWQgcmVsZWFzZUNsb3NlRmluYWxfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSB7CisgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORykgeyAvLyBub3QgYWxyZWFkeSByZWxlYXNlZD8KKyAgICAgICAgICAgIC8vIElnbm9yZSByZXN1bHQgYW5kIGtlZXAgY2xvc2luZy4KKyAgICAgICAgICAgICh2b2lkKSByZWxlYXNlX2woKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZV9sKCk7CisgICAgfQogCiAgICAgY29uc3QgYW5kcm9pZDo6c3A8TXlQbGF5ZXJCYXNlPiAgIG1QbGF5ZXJCYXNlOwogCkBAIC01OTUsNiArNjQwLDggQEAKICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgICAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgPSAwOwogCiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CkBAIC02MjAsOCArNjY3LDkgQEAKICAgICBzdGQ6OmF0b21pYzxwaWRfdD4gICAgICAgICAgbUVycm9yQ2FsbGJhY2tUaHJlYWR7Q0FMTEJBQ0tfVEhSRUFEX05PTkV9OwogCiAgICAgLy8gYmFja2dyb3VuZCB0aHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSGFzVGhyZWFkID0gZmFsc2U7Ci0gICAgcHRocmVhZF90ICAgICAgICAgICAgICAgICAgIG1UaHJlYWQ7IC8vIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCisgICAgLy8gVXNlIG1IYXNUaHJlYWQgdG8gcHJldmVudCBqb2luaW5nIHR3aWNlLCB3aGljaCBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSGFzVGhyZWFkIEdVQVJERURfQlkobVN0cmVhbUxvY2spID0gZmFsc2U7CisgICAgcHRocmVhZF90ICAgICAgICAgICAgICAgICAgIG1UaHJlYWQgIEdVQVJERURfQlkobVN0cmVhbUxvY2spID0ge307CiAKICAgICAvLyBUaGVzZSBhcmUgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgYW5kIHRoZW4gcmVhZCBieSB0aGUgYXVkaW8gcHRocmVhZC4KICAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiAgICAgICAgbVBlcmlvZE5hbm9zZWNvbmRzOyAvLyBmb3IgdHVuaW5nIFNDSEVEX0ZJRk8gdGhyZWFkcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAppbmRleCA2MGRhZDg0Li5lMDE1NTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcApAQCAtNDMsOCArNDMsNyBAQAogLy8gb24gdGhlIGVkZ2Ugb2YgYmVpbmcgcmlkaWN1bG91cy4KIC8vIFRPRE8gVGhlc2UgZGVmaW5lcyBzaG91bGQgYmUgbW92ZWQgdG8gYSBjZW50cmFsIHBsYWNlIGluIGF1ZGlvLgogI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRV9NSU4gICAgICAgIDEKLS8vIFRPRE8gUmVtb3ZlIDggY2hhbm5lbCBsaW1pdGF0aW9uLgotI2RlZmluZSBTQU1QTEVTX1BFUl9GUkFNRV9NQVggICAgICAgIEZDQ184CisjZGVmaW5lIFNBTVBMRVNfUEVSX0ZSQU1FX01BWCAgICAgICAgRkNDX0xJTUlUCiAjZGVmaW5lIFNBTVBMRV9SQVRFX0haX01JTiAgICAgICAgICAgODAwMAogLy8gSERNSSBzdXBwb3J0cyB1cCB0byAzMiBjaGFubmVscyBhdCAxNTM2MDAwIEh6LgogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggICAgICAgICAgIDE2MDAwMDAKQEAgLTYzLDI3ICs2MiwyNiBAQAogc3RhdGljIGFhdWRpb19yZXN1bHRfdCBidWlsZGVyX2NyZWF0ZVN0cmVhbShhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHJ5TU1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW0gKiphdWRpb1N0cmVhbVB0cikgewotICAgICphdWRpb1N0cmVhbVB0ciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiAmc3RyZWFtKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAogICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CiAKICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgogICAgICAgICAgICAgaWYgKHRyeU1NYXApIHsKLSAgICAgICAgICAgICAgICAqYXVkaW9TdHJlYW1QdHIgPSBuZXcgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUoQUF1ZGlvQmluZGVyQ2xpZW50OjpnZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEluc3RhbmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmF1ZGlvU3RyZWFtUHRyID0gbmV3IEF1ZGlvU3RyZWFtUmVjb3JkKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IEF1ZGlvU3RyZWFtUmVjb3JkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOgogICAgICAgICAgICAgaWYgKHRyeU1NYXApIHsKLSAgICAgICAgICAgICAgICAqYXVkaW9TdHJlYW1QdHIgPSBuZXcgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoQUF1ZGlvQmluZGVyQ2xpZW50OjpnZXRJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbUludGVybmFsUGxheShBQXVkaW9CaW5kZXJDbGllbnQ6OmdldEluc3RhbmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKmF1ZGlvU3RyZWFtUHRyID0gbmV3IEF1ZGlvU3RyZWFtVHJhY2soKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1UcmFjaygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTk4LDcgKzk2LDcgQEAKIC8vIEZhbGwgYmFjayB0byBMZWdhY3kgcGF0aCBpZiBNTUFQIG5vdCBhdmFpbGFibGUuCiAvLyBFeGFjdCBiZWhhdmlvciBpcyBjb250cm9sbGVkIGJ5IE1NYXBQb2xpY3kuCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1CdWlsZGVyOjpidWlsZChBdWRpb1N0cmVhbSoqIHN0cmVhbVB0cikgewotICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CisKICAgICBpZiAoc3RyZWFtUHRyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCkgc3RyZWFtUHRyIGlzIG51bGwiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKQEAgLTE3MSw0MSArMTY5LDQ5IEBACiAgICAgICAgIHNldFByaXZhY3lTZW5zaXRpdmUodHJ1ZSk7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gYnVpbGRlcl9jcmVhdGVTdHJlYW0oZ2V0RGlyZWN0aW9uKCksIHNoYXJpbmdNb2RlLCBhbGxvd01NYXAsICZhdWRpb1N0cmVhbSk7CisgICAgYW5kcm9pZDo6c3A8QXVkaW9TdHJlYW0+IGF1ZGlvU3RyZWFtOworICAgIHJlc3VsdCA9IGJ1aWxkZXJfY3JlYXRlU3RyZWFtKGdldERpcmVjdGlvbigpLCBzaGFyaW5nTW9kZSwgYWxsb3dNTWFwLCBhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gT3BlbiB0aGUgc3RyZWFtIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGJ1aWxkZXIuCiAgICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5vcGVuKCp0aGlzKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICpzdHJlYW1QdHIgPSBhdWRpb1N0cmVhbTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIGJvb2wgaXNNTWFwID0gYXVkaW9TdHJlYW0tPmlzTU1hcCgpOwotICAgICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9TdHJlYW0gPSBudWxscHRyOwotCiAgICAgICAgICAgICBpZiAoaXNNTWFwICYmIGFsbG93TGVnYWN5KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCkgTU1BUCBzdHJlYW0gZGlkIG5vdCBvcGVuIHNvIHRyeSBMZWdhY3kgcGF0aCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAvLyBJZiBNTUFQIHN0cmVhbSBmYWlsZWQgdG8gb3BlbiB0aGVuIFRSWSB1c2luZyBhIGxlZ2FjeSBzdHJlYW0uCiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlcl9jcmVhdGVTdHJlYW0oZ2V0RGlyZWN0aW9uKCksIHNoYXJpbmdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmYXVkaW9TdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBhdWRpb1N0cmVhbSk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPm9wZW4oKnRoaXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmVhbVB0ciA9IGF1ZGlvU3RyZWFtOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF1ZGlvU3RyZWFtOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TdHJlYW0gPSBudWxscHRyOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBhdWRpb1N0cmVhbS0+bG9nT3BlbigpOwotICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBhdWRpb1N0cmVhbS0+cmVnaXN0ZXJQbGF5ZXJCYXNlKCk7CisgICAgICAgICAgICBhdWRpb1N0cmVhbS0+bG9nT3BlbkFjdHVhbCgpOworICAgICAgICAgICAgKnN0cmVhbVB0ciA9IHN0YXJ0VXNpbmdTdHJlYW0oYXVkaW9TdHJlYW0pOworICAgICAgICB9IC8vIGVsc2UgYXVkaW9TdHJlYW0gd2lsbCBnbyBvdXQgb2Ygc2NvcGUgYW5kIGJlIGRlbGV0ZWQKICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitBdWRpb1N0cmVhbSAqQXVkaW9TdHJlYW1CdWlsZGVyOjpzdGFydFVzaW5nU3RyZWFtKGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtPiAmYXVkaW9TdHJlYW0pIHsKKyAgICAvLyBJbmNyZW1lbnQgdGhlIHNtYXJ0IHBvaW50ZXIgc28gaXQgd2lsbCBub3QgZ2V0IGRlbGV0ZWQgd2hlbgorICAgIC8vIHdlIHBhc3MgaXQgdG8gdGhlIEMgY2FsbGVyIGFuZCBpdCBnb2VzIG91dCBvZiBzY29wZS4KKyAgICAvLyBUaGUgQyBjb2RlIGNhbm5vdCBob2xkIGEgc21hcnQgcG9pbnRlciBzbyB3ZSBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIGluZGljYXRlIHRoYXQgdGhlIEMgYXBwIG93bnMgYSByZWZlcmVuY2UuCisgICAgYXVkaW9TdHJlYW0tPmluY1N0cm9uZyhudWxscHRyKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0uZ2V0KCk7Cit9CisKK3ZvaWQgQXVkaW9TdHJlYW1CdWlsZGVyOjpzdG9wVXNpbmdTdHJlYW0oQXVkaW9TdHJlYW0gKnN0cmVhbSkgeworICAgIC8vIFVuZG8gdGhlIGVmZmVjdCBvZiBzdGFydFVzaW5nU3RyZWFtKCkKKyAgICBhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gc3BBdWRpb1N0cmVhbShzdHJlYW0pOworICAgIEFMT0dWKCIlcygpIHN0cm9uZ0NvdW50ID0gJWQiLCBfX2Z1bmNfXywgc3BBdWRpb1N0cmVhbS0+Z2V0U3Ryb25nQ291bnQoKSk7CisgICAgc3BBdWRpb1N0cmVhbS0+ZGVjU3Ryb25nKG51bGxwdHIpOworfQorCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1CdWlsZGVyOjp2YWxpZGF0ZSgpIGNvbnN0IHsKIAogICAgIC8vIENoZWNrIGZvciB2YWx1ZXMgdGhhdCBhcmUgcmlkaWN1bG91c2x5IG91dCBvZiByYW5nZSB0byBwcmV2ZW50IG1hdGggb3ZlcmZsb3cgZXhwbG9pdHMuCkBAIC0yNzUsNCArMjgxLDggQEAKICAgICBBTE9HSSgidXNhZ2UgID0gJTZkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkLCBhbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICVkIiwKICAgICAgICAgICBnZXRVc2FnZSgpLCBnZXRDb250ZW50VHlwZSgpLCBnZXRJbnB1dFByZXNldCgpLCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKICAgICBBTE9HSSgicHJpdmFjeSBzZW5zaXRpdmUgPSAlcyIsIGlzUHJpdmFjeVNlbnNpdGl2ZSgpID8gInRydWUiIDogImZhbHNlIik7CisgICAgQUxPR0koIm9wUGFja2FnZU5hbWUgPSAlcyIsICFnZXRPcFBhY2thZ2VOYW1lKCkuaGFzX3ZhbHVlKCkgPworICAgICAgICAiKG51bGwpIiA6IGdldE9wUGFja2FnZU5hbWUoKS52YWx1ZSgpLmNfc3RyKCkpOworICAgIEFMT0dJKCJhdHRyaWJ1dGlvblRhZyA9ICVzIiwgIWdldEF0dHJpYnV0aW9uVGFnKCkuaGFzX3ZhbHVlKCkgPworICAgICAgICAiKG51bGwpIiA6IGdldEF0dHJpYnV0aW9uVGFnKCkudmFsdWUoKS5jX3N0cigpKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAppbmRleCBkNWZiODBkLi45ZjkzMzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCkBAIC0xMDgsOSArMTA4LDE2IEBACiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCB2YWxpZGF0ZSgpIGNvbnN0IG92ZXJyaWRlOwogCisKICAgICB2b2lkIGxvZ1BhcmFtZXRlcnMoKSBjb25zdDsKIAorICAgIC8vIE1hcmsgdGhlIHN0cmVhbSBzbyBpdCBjYW4gYmUgZGVsZXRlZC4KKyAgICBzdGF0aWMgdm9pZCBzdG9wVXNpbmdTdHJlYW0oQXVkaW9TdHJlYW0gKnN0cmVhbSk7CisKIHByaXZhdGU6CisgICAgLy8gRXh0cmFjdCBhIHJhdyBwb2ludGVyIHRoYXQgd2UgY2FuIHBhc3MgdG8gYSAnQycgYXBwLgorICAgIHN0YXRpYyBBdWRpb1N0cmVhbSAqc3RhcnRVc2luZ1N0cmVhbShhbmRyb2lkOjpzcDxBdWRpb1N0cmVhbT4gJnNwQXVkaW9TdHJlYW0pOworCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCA9IGZhbHNlOyAvLyBtdXN0IG1hdGNoIHNoYXJpbmcgbW9kZSByZXF1ZXN0ZWQKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICBtUGVyZm9ybWFuY2VNb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCmluZGV4IGY1MTEzZjIuLjVjMTE4ODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKQEAgLTMxLDQwICszMSwzNyBAQAogI2luY2x1ZGUgIkZpZm9CdWZmZXIuaCIKIAogdXNpbmcgYW5kcm9pZDo6Rmlmb0J1ZmZlcjsKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXJBbGxvY2F0ZWQ7Cit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVySW5kaXJlY3Q7CiB1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCi1GaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCitGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKSB7fQorCitGaWZvQnVmZmVyQWxsb2NhdGVkOjpGaWZvQnVmZmVyQWxsb2NhdGVkKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQorICAgICAgICA6IEZpZm9CdWZmZXIoYnl0ZXNQZXJGcmFtZSkKIHsKICAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXI+KGNhcGFjaXR5SW5GcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIC8vIGFsbG9jYXRlIGJ1ZmZlcgogICAgIGludDMyX3QgYnl0ZXNQZXJCdWZmZXIgPSBieXRlc1BlckZyYW1lICogY2FwYWNpdHlJbkZyYW1lczsKLSAgICBtU3RvcmFnZSA9IG5ldyB1aW50OF90W2J5dGVzUGVyQnVmZmVyXTsKLSAgICBtU3RvcmFnZU93bmVkID0gdHJ1ZTsKKyAgICBtSW50ZXJuYWxTdG9yYWdlID0gc3RkOjptYWtlX3VuaXF1ZTx1aW50OF90W10+KGJ5dGVzUGVyQnVmZmVyKTsKICAgICBBTE9HVigiJXMoKSBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCiAgICAgICAgICAgX19mdW5jX18sIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCi1GaWZvQnVmZmVyOjpGaWZvQnVmZmVyKCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKK0ZpZm9CdWZmZXJJbmRpcmVjdDo6Rmlmb0J1ZmZlckluZGlyZWN0KCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgICBjYXBhY2l0eUluRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgcmVhZEluZGV4QWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICogIHdyaXRlSW5kZXhBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKnJlYWRJbmRleEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWZvX2NvdW50ZXJfdCAqd3JpdGVJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogIGRhdGFTdG9yYWdlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICA6IG1CeXRlc1BlckZyYW1lKGJ5dGVzUGVyRnJhbWUpCi0gICAgICAgICwgbVN0b3JhZ2Uoc3RhdGljX2Nhc3Q8dWludDhfdCAqPihkYXRhU3RvcmFnZUFkZHJlc3MpKQorICAgICAgICA6IEZpZm9CdWZmZXIoYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgLCBtRXh0ZXJuYWxTdG9yYWdlKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGF0YVN0b3JhZ2VBZGRyZXNzKSkKIHsKICAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdD4oY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbmRleEFkZHJlc3MpOwotICAgIG1TdG9yYWdlT3duZWQgPSBmYWxzZTsKLX0KLQotRmlmb0J1ZmZlcjo6fkZpZm9CdWZmZXIoKSB7Ci0gICAgaWYgKG1TdG9yYWdlT3duZWQpIHsKLSAgICAgICAgZGVsZXRlW10gbVN0b3JhZ2U7Ci0gICAgfQogfQogCiBpbnQzMl90IEZpZm9CdWZmZXI6OmNvbnZlcnRGcmFtZXNUb0J5dGVzKGZpZm9fZnJhbWVzX3QgZnJhbWVzKSB7CkBAIC03NiwxNSArNzMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRJbmRleCkgewogICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gbnVsbHB0cjsKICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gMDsKKyAgICB1aW50OF90ICpzdG9yYWdlID0gZ2V0U3RvcmFnZSgpOwogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAwKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgY2FwYWNpdHkgPSBtRmlmby0+Z2V0Q2FwYWNpdHkoKTsKLSAgICAgICAgdWludDhfdCAqc291cmNlID0gJm1TdG9yYWdlW2NvbnZlcnRGcmFtZXNUb0J5dGVzKHN0YXJ0SW5kZXgpXTsKKyAgICAgICAgdWludDhfdCAqc291cmNlID0gJnN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwogICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gY2FwYWNpdHkpIHsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gc291cmNlOwogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmaXJzdEZyYW1lcyA9IGNhcGFjaXR5IC0gc3RhcnRJbmRleDsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMF0gPSBmaXJzdEZyYW1lczsKLSAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzFdID0gJm1TdG9yYWdlWzBdOworICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmc3RvcmFnZVswXTsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5udW1GcmFtZXNbMV0gPSBmcmFtZXNBdmFpbGFibGUgLSBmaXJzdEZyYW1lczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLT5kYXRhWzBdID0gc291cmNlOwpAQCAtMTkxLDYgKzE4OSw2IEBACiB2b2lkIEZpZm9CdWZmZXI6OmVyYXNlTWVtb3J5KCkgewogICAgIGludDMyX3QgbnVtQnl0ZXMgPSBjb252ZXJ0RnJhbWVzVG9CeXRlcyhnZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKCkpOwogICAgIGlmIChudW1CeXRlcyA+IDApIHsKLSAgICAgICAgbWVtc2V0KG1TdG9yYWdlLCAwLCAoc2l6ZV90KSBudW1CeXRlcyk7CisgICAgICAgIG1lbXNldChnZXRTdG9yYWdlKCksIDAsIChzaXplX3QpIG51bUJ5dGVzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCAwZDE4OGM0Li4zNzU0OGYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTM4LDE1ICszOCw5IEBACiAKIGNsYXNzIEZpZm9CdWZmZXIgewogcHVibGljOgotICAgIEZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lLCBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMpOworICAgIEZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lKTsKIAotICAgIEZpZm9CdWZmZXIoaW50MzJfdCBieXRlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzLAotICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKnJlYWRDb3VudGVyQWRkcmVzcywKLSAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90ICp3cml0ZUNvdW50ZXJBZGRyZXNzLAotICAgICAgICAgICAgICAgdm9pZCAqZGF0YVN0b3JhZ2VBZGRyZXNzKTsKLQotICAgIH5GaWZvQnVmZmVyKCk7CisgICAgdmlydHVhbCB+Rmlmb0J1ZmZlcigpID0gZGVmYXVsdDsKIAogICAgIGludDMyX3QgY29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpOwogCkBAIC0xMjEsMTkgKzExNSw1MyBAQAogICAgICAqLwogICAgIHZvaWQgZXJhc2VNZW1vcnkoKTsKIAotcHJpdmF0ZToKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgdWludDhfdCAqZ2V0U3RvcmFnZSgpIGNvbnN0ID0gMDsKIAogICAgIHZvaWQgZmlsbFdyYXBwaW5nQnVmZmVyKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSwgaW50MzJfdCBzdGFydEluZGV4KTsKIAogICAgIGNvbnN0IGludDMyX3QgICAgICAgICAgICAgbUJ5dGVzUGVyRnJhbWU7Ci0gICAgLy8gV2UgZG8gbm90IHVzZSBhIHN0ZDo6dW5pcXVlX3B0ciBmb3IgbVN0b3JhZ2UgYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHBvaW50ZXIgdG8KLSAgICAvLyBtZW1vcnkgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCB0cml2aWFsbHkuCi0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU3RvcmFnZSA9IG51bGxwdHI7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBtU3RvcmFnZU93bmVkID0gZmFsc2U7IC8vIGRpZCB0aGlzIG9iamVjdCBhbGxvY2F0ZSB0aGUgc3RvcmFnZT8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8Rmlmb0NvbnRyb2xsZXJCYXNlPiBtRmlmb3t9OwogfTsKIAorLy8gRGVmaW5lIHR3byBzdWJjbGFzc2VzIHRvIGhhbmRsZSB0aGUgdHdvIHdheXMgdGhhdCBzdG9yYWdlIGlzIGFsbG9jYXRlZC4KKworLy8gQWxsb2NhdGUgc3RvcmFnZSBpbnRlcm5hbGx5LgorY2xhc3MgRmlmb0J1ZmZlckFsbG9jYXRlZCA6IHB1YmxpYyBGaWZvQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBGaWZvQnVmZmVyQWxsb2NhdGVkKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKTsKKworcHJpdmF0ZToKKworICAgIHVpbnQ4X3QgKmdldFN0b3JhZ2UoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50ZXJuYWxTdG9yYWdlLmdldCgpOworICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSW50ZXJuYWxTdG9yYWdlOworfTsKKworLy8gQWxsb2NhdGUgc3RvcmFnZSBleHRlcm5hbGx5IGFuZCBwYXNzIGl0IGluLgorY2xhc3MgRmlmb0J1ZmZlckluZGlyZWN0IDogcHVibGljIEZpZm9CdWZmZXIgeworcHVibGljOgorICAgIC8vIFdlIHVzZSByYXcgcG9pbnRlcnMgYmVjYXVzZSB0aGUgbWVtb3J5IG1heSBiZQorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYW4gYWxsb2NhdGVkIGJsb2NrIGFuZCBjYW5ub3QgYmUgZGVsZXRlZCBkaXJlY3RseS4KKyAgICBGaWZvQnVmZmVySW5kaXJlY3QoaW50MzJfdCBieXRlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGNhcGFjaXR5SW5GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90KiByZWFkQ291bnRlckFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIGZpZm9fY291bnRlcl90KiB3cml0ZUNvdW50ZXJBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhU3RvcmFnZUFkZHJlc3MpOworCitwcml2YXRlOgorCisgICAgdWludDhfdCAqZ2V0U3RvcmFnZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1FeHRlcm5hbFN0b3JhZ2U7CisgICAgfTsKKworICAgIHVpbnQ4X3QgKm1FeHRlcm5hbFN0b3JhZ2UgPSBudWxscHRyOworfTsKKwogfSAgLy8gYW5kcm9pZAogCiAjZW5kaWYgLy9GSUZPX0ZJRk9fQlVGRkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJJbmRpcmVjdC5oCmluZGV4IDU4MzJkOWMuLmVjNDhlNTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckluZGlyZWN0LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVySW5kaXJlY3QuaApAQCAtMjcsNyArMjcsNyBAQAogLyoqCiAgKiBBIEZpZm9Db250cm9sbGVyQmFzZSB3aXRoIGNvdW50ZXJzIGV4dGVybmFsIHRvIHRoZSBjbGFzcy4KICAqCi0gKiBUaGUgYWN0dWFsIGNvcHVudGVycyBtYXkgYmUgc3RvcmVkIGluIHNlcGFyYXRlIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeQorICogVGhlIGFjdHVhbCBjb3VudGVycyBtYXkgYmUgc3RvcmVkIGluIHNlcGFyYXRlIHJlZ2lvbnMgb2Ygc2hhcmVkIG1lbW9yeQogICogd2l0aCBkaWZmZXJlbnQgYWNjZXNzIHJpZ2h0cy4KICAqLwogY2xhc3MgRmlmb0NvbnRyb2xsZXJJbmRpcmVjdCA6IHB1YmxpYyBGaWZvQ29udHJvbGxlckJhc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaAppbmRleCBlZGE0NmFlLi45NzI5MzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKIAogICAgIC8qKgotICAgICAqIER1bW15IHByb2Nlc3Nvci4gVGhlIHdvcmsgaGFwcGVucyBpbiB0aGUgcmVhZCgpIG1ldGhvZC4KKyAgICAgKiBEbyBub3RoaW5nLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgogICAgICAqCiAgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCiAgICAgICogQHBhcmFtIG51bUZyYW1lcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9GbG93Z3JhcGhVdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzUwNDEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvRmxvd2dyYXBoVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfVVRJTElUSUVTX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1VUSUxJVElFU19ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY2xhc3MgRmxvd2dyYXBoVXRpbGl0aWVzIHsKK3B1YmxpYzoKKy8vIFRoaXMgd2FzIGNvcGllZCBmcm9tIGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaAorLyoqCisgKiBDb252ZXJ0IGEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBhIFEwLjMxIGludGVnZXIgdmFsdWUuCisgKiBSb3VuZHMgdG8gbmVhcmVzdCwgdGllcyBhd2F5IGZyb20gMC4KKyAqCisgKiBWYWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWy0xLjAsIDEuMCkgYXJlIHByb3Blcmx5IGNsYW1wZWQgdG8gLTIxNDc0ODM2NDggYW5kIDIxNDc0ODM2NDcsCisgKiBpbmNsdWRpbmcgLUluZiBhbmQgK0luZi4gTmFOIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB1bmRlZmluZWQsIGFuZCBiZWhhdmlvciBtYXkgY2hhbmdlCisgKiBkZXBlbmRpbmcgb24gaGFyZHdhcmUgYW5kIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW50MzJfdCBjbGFtcDMyRnJvbUZsb2F0KGZsb2F0IGYpCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gKGZsb2F0KSgxVUwgPDwgMzEpOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBsaW1wb3MgPSAxLjsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgbGltbmVnID0gLTEuOworCisgICAgaWYgKGYgPD0gbGltbmVnKSB7CisgICAgICAgIHJldHVybiAtMHg4MDAwMDAwMDsgLyogb3IgMHg4MDAwMDAwMCAqLworICAgIH0gZWxzZSBpZiAoZiA+PSBsaW1wb3MpIHsKKyAgICAgICAgcmV0dXJuIDB4N2ZmZmZmZmY7CisgICAgfQorICAgIGYgKj0gc2NhbGU7CisgICAgLyogaW50ZWdlciBjb252ZXJzaW9uIGlzIHRocm91Z2ggdHJ1bmNhdGlvbiAodGhvdWdoIGludCB0byBmbG9hdCBpcyBub3QpLgorICAgICAqIGVuc3VyZSB0aGF0IHdlIHJvdW5kIHRvIG5lYXJlc3QsIHRpZXMgYXdheSBmcm9tIDAuCisgICAgICovCisgICAgcmV0dXJuIGYgPiAwID8gZiArIDAuNSA6IGYgLSAwLjU7Cit9CisKK307CisKKyNlbmRpZiAvLyBGTE9XR1JBUEhfVVRJTElUSUVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKaW5kZXggNjU5MjgyOC4uMGNiMDc3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kyNC5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaWZkZWYgX19BTkRST0lEX18KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CkBAIC0yNiw3ICsyNiw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CiAKLQogU2lua0kyNDo6U2lua0kyNChpbnQzMl90IGNoYW5uZWxDb3VudCkKICAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjg2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTMyLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkZsb3dncmFwaFV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNpbmtJMzIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU2lua0kzMjo6U2lua0kzMihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7fQorCitpbnQzMl90IFNpbmtJMzI6OnJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90ICppbnREYXRhID0gKGludDMyX3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX2kzMl9mcm9tX2Zsb2F0KGludERhdGEsIHNpZ25hbCwgbnVtU2FtcGxlcyk7CisgICAgICAgIGludERhdGEgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgc2lnbmFsICs9IG51bVNhbXBsZXM7CisjZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgKmludERhdGErKyA9IEZsb3dncmFwaFV0aWxpdGllczo6Y2xhbXAzMkZyb21GbG9hdCgqc2lnbmFsKyspOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQyM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kzMi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTMyX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTMyX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTMyIDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kzMihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisgICAgflNpbmtJMzIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kzMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmNwcAppbmRleCBmMzE5ODgwLi4wOTc5NTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAKQEAgLTE1LDcgKzE1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaWZkZWYgX19BTkRST0lEX18KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCmluZGV4IDM5ZjE0ZGEuLjJlZDZmMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5oCkBAIC0xNyw4ICsxNyw3IEBACiAjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKICNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMjRfSAogCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTMyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxNzdhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VJMzIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworU291cmNlSTMyOjpTb3VyY2VJMzIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTMyOjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgaW50MzJfdCAqaW50QmFzZSA9IHN0YXRpY19jYXN0PGNvbnN0IGludDMyX3QgKj4obURhdGEpOworICAgIGNvbnN0IGludDMyX3QgKmludERhdGEgPSAmaW50QmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kzMihmbG9hdERhdGEsIGludERhdGEsIG51bVNhbXBsZXMpOworI2Vsc2UKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqZmxvYXREYXRhKysgPSAqaW50RGF0YSsrICoga1NjYWxlOworICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGY5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMzIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTMyX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMzJfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkzMiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTMyKGludDMyX3QgY2hhbm5lbENvdW50KTsKKyAgICB+U291cmNlSTMyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrU2NhbGUgPSAxLjAgLyAoMVVMIDw8IDMxKTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kzMl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggYzA2Mjg4Mi4uZTk2ZTEzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtMzQsOCArMzQsNyBAQAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogQXVkaW9TdHJlYW1MZWdhY3k6OkF1ZGlvU3RyZWFtTGVnYWN5KCkKLSAgICAgICAgOiBBdWRpb1N0cmVhbSgpCi0gICAgICAgICwgbURldmljZUNhbGxiYWNrKG5ldyBTdHJlYW1EZXZpY2VDYWxsYmFjayh0aGlzKSkgeworICAgICAgICA6IEF1ZGlvU3RyZWFtKCkgewogfQogCiBBdWRpb1N0cmVhbUxlZ2FjeTo6fkF1ZGlvU3RyZWFtTGVnYWN5KCkgewpAQCAtOTUsMTAgKzk0LDE1IEBACiAgICAgICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmF1ZGlvQnVmZmVyID0gc3RhdGljX2Nhc3Q8QXVkaW9UcmFjazo6QnVmZmVyICo+KGluZm8pOwogICAgICAgICAgICAgaWYgKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBraWxsIHRoZSBzdHJlYW0gYW5kIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZXN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgLy8gVGhhdCBpcyBPSyBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgZGlzY29ubmVjdGVkLgogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIG5vIGRhdGEgYmVjYXVzZSBjYWxsYmFjayBkaXNhYmxlZCIpOwotICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkLCBzZXQgc2l6ZT0wIik7CisgICAgICAgICAgICAgICAgLy8gRG8gTk9UIHVzZSBTSVpFX1NUT1BfQ0FMTEJBQ0tTIGhlcmUgYmVjYXVzZSB0aGF0IHdpbGwga2lsbCB0aGUgc3RyZWFtIGFuZAorICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgaXQgZnJvbSBiZWluZyByZXN0YXJ0ZWQuIFRoaXMgY2FuIG9jY3VyIGJlY2F1c2Ugb2YgYSByYWNlIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgIC8vIGNhdXNlZCBieSBMZWdhY3kgY2FsbGJhY2tzIHJ1bm5pbmcgYWZ0ZXIgdGhlIHRyYWNrIGlzICJzdG9wcGVkIi4KKyAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwcm9jZXNzQ2FsbGJhY2tDb21tb24oKSBkYXRhLCBmcmFtZUNvdW50IGlzIHplcm8iKTsKQEAgLTEyNSw3ICsxMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxiYWNrUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtU3RvcEludGVybmFsKCk7CiAgICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSB0aGUgc3lzdGVtIGtlZXBzIHRyeWluZyB0byBjYWxsIHVzLgogICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tFbmFibGVkLnN0b3JlKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNjMsNyArMTY3LDExIEBACiB9CiAKIHZvaWQgQXVkaW9TdHJlYW1MZWdhY3k6OmZvcmNlRGlzY29ubmVjdChib29sIGVycm9yQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIGRpc2Nvbm5lY3QgaWYgYWxyZWFkeSBpbiB0aGVzZSBzdGF0ZXMuCisgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQKKyAgICAgICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HCisgICAgICAgICAgICAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECisgICAgICAgICAgICApIHsKICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwogICAgICAgICBpZiAoZXJyb3JDYWxsYmFja0VuYWJsZWQpIHsKICAgICAgICAgICAgIG1heWJlQ2FsbEVycm9yQ2FsbGJhY2soQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CkBAIC0yMDUsMjQgKzIxMywzMCBAQAogICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogfQogCi12b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCi17Cit2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5OjpvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IC8qIGF1ZGlvSW8gKi8sCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CiAgICAgLy8gRGV2aWNlIHJvdXRpbmcgaXMgYSBjb21tb24gc291cmNlIG9mIGVycm9ycyBhbmQgRElTQ09OTkVDVFMuCi0gICAgLy8gUGxlYXNlIGxlYXZlIHRoaXMgbG9nIGluIHBsYWNlLgotICAgIEFMT0dEKCIlcygpIGRldklkICVkID0+ICVkIiwgX19mdW5jX18sIChpbnQpIGdldERldmljZUlkKCksIChpbnQpZGV2aWNlSWQpOwotICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRCAmJiBnZXREZXZpY2VJZCgpICE9IGRldmljZUlkICYmCi0gICAgICAgICAgICBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgLy8gUGxlYXNlIGxlYXZlIHRoaXMgbG9nIGluIHBsYWNlLiBJZiB0aGVyZSBpcyBhIGJ1ZyB0aGVuIHRoaXMgbWlnaHQKKyAgICAvLyBnZXQgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gaGFzIGJlZW4gZGVsZXRlZCBzbyBsb2cgYmVmb3JlIHdlCisgICAgLy8gdG91Y2ggdGhlIHN0cmVhbSBvYmplY3QuCisgICAgQUxPR0QoIiVzKGRldmljZUlkID0gJWQpIiwgX19mdW5jX18sIChpbnQpZGV2aWNlSWQpOworICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFBVURJT19VTlNQRUNJRklFRAorICAgICAgICAgICAgJiYgZ2V0RGV2aWNlSWQoKSAhPSBkZXZpY2VJZAorICAgICAgICAgICAgJiYgZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRAorICAgICAgICAgICAgKSB7CiAgICAgICAgIC8vIE5vdGUgdGhhdCBpc0RhdGFDYWxsYmFja0FjdGl2ZSgpIGlzIGFmZmVjdGVkIGJ5IHN0YXRlIHNvIGNhbGwgaXQgYmVmb3JlIERJU0NPTk5FQ1RJTkcuCiAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBkYXRhIGNhbGxiYWNrIGFuZCB0aGUgc3RyZWFtIGlzIGFjdGl2ZSwgdGhlbiBhc2sgdGhlIGRhdGEgY2FsbGJhY2sKICAgICAgICAgLy8gdG8gRElTQ09OTkVDVCBhbmQgY2FsbCB0aGUgZXJyb3IgY2FsbGJhY2suCiAgICAgICAgIGlmIChpc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRCgib25BdWRpb0RldmljZVVwZGF0ZSgpIHJlcXVlc3QgRElTQ09OTkVDVCBpbiBkYXRhIGNhbGxiYWNrIGR1ZSB0byBkZXZpY2UgY2hhbmdlIik7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSByZXF1ZXN0IERJU0NPTk5FQ1QgaW4gZGF0YSBjYWxsYmFjaywgZGV2aWNlICVkID0+ICVkIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAoaW50KSBnZXREZXZpY2VJZCgpLCAoaW50KSBkZXZpY2VJZCk7CiAgICAgICAgICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSBkYXRhIGNhbGxiYWNrIGhhcyBhIGNoYW5jZSB0byBoYW5kbGUgdGhlCi0gICAgICAgICAgICAvLyByZXF1ZXN0IHRoZW4gdGhlIHJlcXVlc3RTdG9wKCkgYW5kIHJlcXVlc3RQYXVzZSgpIG1ldGhvZHMgd2lsbCBoYW5kbGUgaXQgYWZ0ZXIKKyAgICAgICAgICAgIC8vIHJlcXVlc3QgdGhlbiB0aGUgcmVxdWVzdFN0b3BfbCgpIGFuZCByZXF1ZXN0UGF1c2UoKSBtZXRob2RzIHdpbGwgaGFuZGxlIGl0IGFmdGVyCiAgICAgICAgICAgICAvLyB0aGUgY2FsbGJhY2sgaGFzIHN0b3BwZWQuCiAgICAgICAgICAgICBtUmVxdWVzdERpc2Nvbm5lY3QucmVxdWVzdCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIm9uQXVkaW9EZXZpY2VVcGRhdGUoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93Iik7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSBESVNDT05ORUNUIHRoZSBzdHJlYW0gbm93LCBkZXZpY2UgJWQgPT4gJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIChpbnQpIGdldERldmljZUlkKCksIChpbnQpIGRldmljZUlkKTsKICAgICAgICAgICAgIGZvcmNlRGlzY29ubmVjdCgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKaW5kZXggOWMyNGIyYi4uODhlZjI3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCkBAIC04NywyOSArODcsMTMgQEAKIAogcHJvdGVjdGVkOgogCi0gICAgY2xhc3MgU3RyZWFtRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgYW5kcm9pZDo6QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKLSAgICB7Ci0gICAgcHVibGljOgotCi0gICAgICAgIFN0cmVhbURldmljZUNhbGxiYWNrKEF1ZGlvU3RyZWFtTGVnYWN5ICpwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpIHt9Ci0gICAgICAgIHZpcnR1YWwgflN0cmVhbURldmljZUNhbGxiYWNrKCkge30KLQotICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7Ci0gICAgICAgICAgICBpZiAobVBhcmVudCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgbVBhcmVudC0+b25BdWRpb0RldmljZVVwZGF0ZShkZXZpY2VJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBBdWRpb1N0cmVhbUxlZ2FjeSAqbVBhcmVudDsKLSAgICB9OwotCiAgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEJlc3RUaW1lc3RhbXAoY2xvY2tpZF90IGNsb2NrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6RXh0ZW5kZWRUaW1lc3RhbXAgKmV4dGVuZGVkVGltZXN0YW1wKTsKIAotICAgIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICB2b2lkIG9uQXVkaW9EZXZpY2VVcGRhdGUoYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB0byBzZWUgd2hldGhlciBhIGNhbGxiYWNrIHRocmVhZCBoYXMgcmVxdWVzdGVkIGEgZGlzY29ubmVjdGVkLgpAQCAtMTI4LDYgKzExMiwxOCBAQAogICAgICAgICByZXR1cm4gbUZyYW1lc1JlYWQuaW5jcmVtZW50KGZyYW1lcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0IHRoZSBmcmFtZXNQZXJCdXJzdCBmcm9tIHRoZSB1bmRlcmx5aW5nIEFQSS4KKyAgICAgKiBAcmV0dXJuIGZyYW1lc1BlckJ1cnN0CisgICAgICovCisgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYnVmZmVyQ2FwYWNpdHkgZnJvbSB0aGUgdW5kZXJseWluZyBBUEkuCisgICAgICogQHJldHVybiBidWZmZXJDYXBhY2l0eSBpbiBmcmFtZXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgY29uc3QgPSAwOworCiAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBleGFjdCBtYXRjaGluZyBieSBNZWRpYU1ldHJpY3MuIFNvIGRvIG5vdCBjaGFuZ2UgaXQuCiAgICAgLy8gTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmg6IEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX0FBVURJTwogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciAgICAga0NhbGxlck5hbWVbXSA9ICJhYXVkaW8iOwpAQCAtMTQwLDcgKzEzNiw2IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUJsb2NrQWRhcHRlckJ5dGVzUGVyRnJhbWUgPSAwOwogICAgIGFhdWRpb193cmFwcGluZ19mcmFtZXNfdCAgIG1Qb3NpdGlvbldoZW5TdGFydGluZyA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IDA7Ci0gICAgY29uc3QgYW5kcm9pZDo6c3A8U3RyZWFtRGV2aWNlQ2FsbGJhY2s+ICAgbURldmljZUNhbGxiYWNrOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgICAgbVJlcXVlc3REaXNjb25uZWN0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggYjBkYzU5ZS4uZGM2Njc0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtMjIsMTQgKzIyLDE4IEBACiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCisjaW5jbHVkZSAiY29yZS9BdWRpb0dsb2JhbC5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgogI2luY2x1ZGUgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5oIgogCit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKQEAgLTg5LDggKzkzLDkgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEZvcm1hdCA9IGdldEZvcm1hdCgpOwogICAgIC8vIFByZXNlcnZlIGJlaGF2aW9yIG9mIEFQSSAyNgotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KIApAQCAtMTE4LDYgKzEyMyw3IEBACiAgICAgICAgIHNldERldmljZUZvcm1hdChnZXRGb3JtYXQoKSk7CiAgICAgfQogCisgICAgLy8gVG8gYXZvaWQgZ2xpdGNoaW5nLCBsZXQgQXVkaW9GbGluZ2VyIHBpY2sgdGhlIG9wdGltYWwgYnVyc3Qgc2l6ZS4KICAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KQEAgLTEyOCw3ICsxMzQsNiBAQAogICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUgPSBBdWRpb1JlY29yZDo6dHJhbnNmZXJfdHlwZTo6VFJBTlNGRVJfQ0FMTEJBQ0s7CiAgICAgICAgIGNhbGxiYWNrID0gZ2V0TGVnYWN5Q2FsbGJhY2soKTsKICAgICAgICAgY2FsbGJhY2tEYXRhID0gdGhpczsKLSAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICB9CiAgICAgbUNhbGxiYWNrQnVmZmVyU2l6ZSA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAKQEAgLTE1MiwxMyArMTU3LDIxIEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAorICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IGJ1aWxkZXIuZ2V0T3BQYWNrYWdlTmFtZSgpOworICAgIGF0dHJpYnV0aW9uU291cmNlLmF0dHJpYnV0aW9uVGFnID0gYnVpbGRlci5nZXRBdHRyaWJ1dGlvblRhZygpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7CiAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CiAKICAgICAgICAgbUF1ZGlvUmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKAotICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lIC8vIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lIFRPRE8gZG9lcyBub3QgY29tcGlsZQorICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlCiAgICAgICAgICk7CiAgICAgICAgIG1BdWRpb1JlY29yZC0+c2V0KAogICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CkBAIC0xODUsNyArMTk4LDcgQEAKICAgICAgICAgLy8gRGlkIHdlIGdldCBhIHZhbGlkIHRyYWNrPwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmluaXRDaGVjaygpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZWxlYXNlQ2xvc2VGaW5hbCgpOworICAgICAgICAgICAgc2FmZVJlbGVhc2VDbG9zZSgpOwogICAgICAgICAgICAgQUxPR0UoIm9wZW4oKSwgaW5pdENoZWNrKCkgcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgICAgIH0KQEAgLTIwNywxNSArMjIwLDE4IEBACiAKICAgICBtTWV0cmljc0lkID0gc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1JFQ09SRCkKICAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcobUF1ZGlvUmVjb3JkLT5nZXRQb3J0SWQoKSk7CisgICAgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QRVJGT1JNQU5DRU1PREUsCisgICAgICAgICAgICAgICAgIEF1ZGlvR2xvYmFsX2NvbnZlcnRQZXJmb3JtYW5jZU1vZGVUb1RleHQoYnVpbGRlci5nZXRQZXJmb3JtYW5jZU1vZGUoKSkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TSEFSSU5HTU9ERSwKKyAgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFNoYXJpbmdNb2RlVG9UZXh0KGJ1aWxkZXIuZ2V0U2hhcmluZ01vZGUoKSkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElOR0NMSUVOVCwgdG9TdHJpbmcocmVxdWVzdGVkRm9ybWF0KS5jX3N0cigpKS5yZWNvcmQoKTsKIAogICAgIC8vIEdldCB0aGUgYWN0dWFsIHZhbHVlcyBmcm9tIHRoZSBBdWRpb1JlY29yZC4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvUmVjb3JkLT5jaGFubmVsQ291bnQoKSk7Ci0KLSAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9SZWNvcmQtPmdldFNhbXBsZVJhdGUoKTsKLSAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKLSAgICAgICAgICAgICAib3BlbigpIHNhbXBsZVJhdGUgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwKLSAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGFjdHVhbFNhbXBsZVJhdGUpOwotICAgIHNldFNhbXBsZVJhdGUoYWN0dWFsU2FtcGxlUmF0ZSk7CisgICAgc2V0U2FtcGxlUmF0ZShtQXVkaW9SZWNvcmQtPmdldFNhbXBsZVJhdGUoKSk7CisgICAgc2V0QnVmZmVyQ2FwYWNpdHkoZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkpOworICAgIHNldEZyYW1lc1BlckJ1cnN0KGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpKTsKIAogICAgIC8vIFdlIG1heSBuZWVkIHRvIHBhc3MgdGhlIGRhdGEgdGhyb3VnaCBhIGJsb2NrIHNpemUgYWRhcHRlciB0byBndWFyYW50ZWUgY29uc3RhbnQgc2l6ZS4KICAgICBpZiAobUNhbGxiYWNrQnVmZmVyU2l6ZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKQEAgLTI4Miw3ICsyOTgsNyBAQAogICAgICAgICAgICAgOiAoYWF1ZGlvX3Nlc3Npb25faWRfdCkgbUF1ZGlvUmVjb3JkLT5nZXRTZXNzaW9uSWQoKTsKICAgICBzZXRTZXNzaW9uSWQoYWN0dWFsU2Vzc2lvbklkKTsKIAotICAgIG1BdWRpb1JlY29yZC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2spOworICAgIG1BdWRpb1JlY29yZC0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzKTsKIAogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CkBAIC0yOTEsMTYgKzMwNywzMiBAQAogICAgIC8vIFRPRE8gYWRkIGNsb3NlKCkgb3IgcmVsZWFzZSgpIHRvIEF1ZGlvRmxpbmdlcidzIEF1ZGlvUmVjb3JkIEFQSS4KICAgICAvLyAgVGhlbiBjYWxsIGl0IGZyb20gaGVyZQogICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORykgewotICAgICAgICBtQXVkaW9SZWNvcmQtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMpOwogICAgICAgICBsb2dSZWxlYXNlQnVmZmVyU3RhdGUoKTsKLSAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7Ci0gICAgICAgIG1GaXhlZEJsb2NrV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIC8vIERhdGEgY2FsbGJhY2tzIG1heSBzdGlsbCBiZSBydW5uaW5nIQogICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW06OnJlbGVhc2VfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7IC8vIGFscmVhZHkgcmVsZWFzZWQKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9TdHJlYW1SZWNvcmQ6OmNsb3NlX2woKSB7CisgICAgLy8gVGhlIGNhbGxiYWNrcyBhcmUgbm9ybWFsbHkgam9pbmVkIGluIHRoZSBBdWRpb1JlY29yZCBkZXN0cnVjdG9yLgorICAgIC8vIEJ1dCBpZiBhbm90aGVyIG9iamVjdCBoYXMgYSByZWZlcmVuY2UgdG8gdGhlIEF1ZGlvUmVjb3JkIHRoZW4KKyAgICAvLyBpdCB3aWxsIG5vdCBnZXQgZGVsZXRlZCBoZXJlLgorICAgIC8vIFNvIHdlIHNob3VsZCBqb2luIGNhbGxiYWNrcyBleHBsaWNpdGx5IGJlZm9yZSByZXR1cm5pbmcuCisgICAgLy8gVW5sb2NrIGFyb3VuZCB0aGUgam9pbiB0byBhdm9pZCBkZWFkbG9ja3MgaWYgdGhlIGNhbGxiYWNrIHRyaWVzIHRvIGxvY2suCisgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUAorICAgIG1TdHJlYW1Mb2NrLnVubG9jaygpOworICAgIG1BdWRpb1JlY29yZC0+c3RvcEFuZEpvaW5DYWxsYmFja3MoKTsKKyAgICBtU3RyZWFtTG9jay5sb2NrKCk7CisKKyAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKKyAgICAvLyBEbyBub3QgY2xvc2UgbUZpeGVkQmxvY2tSZWFkZXIuIEl0IGhhcyBhIHVuaXF1ZV9wdHIgdG8gaXRzIGJ1ZmZlcgorICAgIC8vIHNvIGl0IHdpbGwgY2xlYW4gdXAgYnkgaXRzZWxmLgorICAgIEF1ZGlvU3RyZWFtOjpjbG9zZV9sKCk7Cit9CisKIGNvbnN0IHZvaWQgKiBBdWRpb1N0cmVhbVJlY29yZDo6bWF5YmVDb252ZXJ0RGV2aWNlRGF0YShjb25zdCB2b2lkICphdWRpb0RhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgaWYgKG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyRmxvYXQuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG51bUZyYW1lcyA+IG1Gb3JtYXRDb252ZXJzaW9uQnVmZmVyU2l6ZUluRnJhbWVzLApAQCAtMzM2LDcgKzM2OCw3IEBACiAgICAgcmV0dXJuOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnJlcXVlc3RTdGFydCgpCithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1SZWNvcmQ6OnJlcXVlc3RTdGFydF9sKCkKIHsKICAgICBpZiAobUF1ZGlvUmVjb3JkLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMzYwLDcgKzM5Miw3IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtUmVjb3JkOjpyZXF1ZXN0U3RvcCgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVJlY29yZDo6cmVxdWVzdFN0b3BfbCgpIHsKICAgICBpZiAobUF1ZGlvUmVjb3JkLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KQEAgLTQ4Myw3ICs1MTUsNyBAQAogICAgIHJldHVybiBnZXRCdWZmZXJDYXBhY2l0eSgpOyAvLyBUT0RPIGltcGxlbWVudCBpbiBBdWRpb1JlY29yZD8KIH0KIAotaW50MzJfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdAoraW50MzJfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgY29uc3QKIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF1ZGlvUmVjb3JkLT5mcmFtZUNvdW50KCkpOwogfQpAQCAtNDkzLDggKzUyNSw3IEBACiAgICAgcmV0dXJuIDA7IC8vIFRPRE8gaW1wbGVtZW50IHdoZW4gQXVkaW9SZWNvcmQgc3VwcG9ydHMgaXQKIH0KIAotaW50MzJfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdAoteworaW50MzJfdCBBdWRpb1N0cmVhbVJlY29yZDo6Z2V0RnJhbWVzUGVyQnVyc3RGcm9tRGV2aWNlKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQXVkaW9SZWNvcmQtPmdldE5vdGlmaWNhdGlvblBlcmlvZEluRnJhbWVzKCkpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuaAppbmRleCBjNTk0NGM3Li42OTI2NTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJBQXVkaW9MZWdhY3kuaCIKICNpbmNsdWRlICJsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0ZpeGVkQmxvY2tXcml0ZXIuaCIKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKIApAQCAtMzksOSArNDAsNyBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICYgYnVpbGRlcikgb3ZlcnJpZGU7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlbGVhc2VfbCgpIG92ZXJyaWRlOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydCgpIG92ZXJyaWRlOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2VfbCgpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGNsb2NraWRfdCBjbG9ja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLApAQCAtNTUsMTQgKzU0LDEwIEBACiAKICAgICBpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCBvdmVycmlkZTsKIAotICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCBvdmVycmlkZTsKLQogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZTsKIAotICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCBvdmVycmlkZTsKLQogICAgIGFhdWRpb19yZXN1bHRfdCB1cGRhdGVTdGF0ZU1hY2hpbmUoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19kaXJlY3Rpb25fdCBnZXREaXJlY3Rpb24oKSBjb25zdCBvdmVycmlkZSB7CkBAIC03OCwxMyArNzMsMjEgQEAKIAogICAgIGNvbnN0IHZvaWQgKiBtYXliZUNvbnZlcnREZXZpY2VEYXRhKGNvbnN0IHZvaWQgKmF1ZGlvRGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOwogCitwcm90ZWN0ZWQ6CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0X2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdG9wX2woKSBSRVFVSVJFUyhtU3RyZWFtTG9jaykgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHlGcm9tRGV2aWNlKCkgY29uc3Qgb3ZlcnJpZGU7CisKIHByaXZhdGU6CiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9SZWNvcmQ+IG1BdWRpb1JlY29yZDsKICAgICAvLyBhZGFwdHMgYmV0d2VlbiB2YXJpYWJsZSBzaXplZCBibG9ja3MgYW5kIGZpeGVkIHNpemUgYmxvY2tzCiAgICAgRml4ZWRCbG9ja1dyaXRlciAgICAgICAgICAgICAgICAgbUZpeGVkQmxvY2tXcml0ZXI7CiAKICAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvUmVjb3JkIGFuZCB1c2UgaXQuCi0gICAgYW5kcm9pZDo6U3RyaW5nMTYgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CisgICAgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBtQXR0cmlidXRpb25Tb3VyY2U7CiAKICAgICAvLyBPbmx5IG9uZSB0eXBlIG9mIGNvbnZlcnNpb24gYnVmZmVyIGlzIHVzZWQuCiAgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+ICAgICAgICAgbUZvcm1hdENvbnZlcnNpb25CdWZmZXJGbG9hdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKaW5kZXggNDg2OTQ4MC4uMWQ0MTJjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAKQEAgLTIzLDE0ICsyMywxOCBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgorCisjaW5jbHVkZSAiY29yZS9BdWRpb0dsb2JhbC5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oIgogI2luY2x1ZGUgImxlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgiCisjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9GaXhlZEJsb2NrUmVhZGVyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gQXJiaXRyYXJ5IGFuZCBzb21ld2hhdCBnZW5lcm91cyBudW1iZXIgb2YgYnVyc3RzLgogI2RlZmluZSBERUZBVUxUX0JVUlNUU19QRVJfQlVGRkVSX0NBUEFDSVRZICAgICA4CiAKQEAgLTk2LDYgKzEwMCw3IEBACiAKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IChzaXplX3QpYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCisgICAgLy8gVG8gYXZvaWQgZ2xpdGNoaW5nLCBsZXQgQXVkaW9GbGluZ2VyIHBpY2sgdGhlIG9wdGltYWwgYnVyc3Qgc2l6ZS4KICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IDA7CiAKICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpCkBAIC0xMTgsOCArMTIzLDYgQEAKICAgICAgICAgICAgIC8vIFRha2UgYWR2YW50YWdlIG9mIGEgc3BlY2lhbCB0cmljayB0aGF0IGFsbG93cyB1cyB0byBjcmVhdGUgYSBidWZmZXIKICAgICAgICAgICAgIC8vIHRoYXQgaXMgc29tZSBtdWx0aXBsZSBvZiB0aGUgYnVyc3Qgc2l6ZS4KICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcyA9IDAgLSBERUZBVUxUX0JVUlNUU19QRVJfQlVGRkVSX0NBUEFDSVRZOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKICAgICAgICAgfQogICAgIH0KICAgICBtQ2FsbGJhY2tCdWZmZXJTaXplID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKQEAgLTE0OCw2ICsxNTEsNyBAQAogICAgIH07CiAKICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKCk7CisgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCiAgICAgbUF1ZGlvVHJhY2stPnNldCgKICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCAgLy8gaWdub3JlZCBiZWNhdXNlIHdlIHBhc3MgYXR0cmlidXRlcyBiZWxvdwogICAgICAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpLApAQCAtMTYzLDggKzE2Nyw3IEBACiAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICBzdHJlYW1UcmFuc2ZlclR5cGUsCiAgICAgICAgICAgICBOVUxMLCAgICAvLyBERUZBVUxUIGF1ZGlvX29mZmxvYWRfaW5mb190Ci0gICAgICAgICAgICBBVURJT19VSURfSU5WQUxJRCwgLy8gREVGQVVMVCB1aWQKLSAgICAgICAgICAgIC0xLCAgICAgIC8vIERFRkFVTFQgcGlkCisgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksIC8vIERFRkFVTFQgdWlkIGFuZCBwaWQKICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAogICAgICAgICAgICAgLy8gV0FSTklORyAtIElmIGRvTm90UmVjb25uZWN0IHNldCB0cnVlIHRoZW4gYXVkaW8gc3RvcHMgYWZ0ZXIgcGx1Z2dpbmcgYW5kIHVucGx1Z2dpbmcKICAgICAgICAgICAgIC8vIGhlYWRwaG9uZXMgYSBmZXcgdGltZXMuCkBAIC0xNzksMTMgKzE4MiwxOSBAQAogICAgIC8vIERpZCB3ZSBnZXQgYSB2YWxpZCB0cmFjaz8KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UcmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZWxlYXNlQ2xvc2VGaW5hbCgpOworICAgICAgICBzYWZlUmVsZWFzZUNsb3NlKCk7CiAgICAgICAgIEFMT0dFKCJvcGVuKCksIGluaXRDaGVjaygpIHJldHVybmVkICVkIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CiAgICAgfQogCiAgICAgbU1ldHJpY3NJZCA9IHN0ZDo6c3RyaW5nKEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSykKICAgICAgICAgICAgICsgc3RkOjp0b19zdHJpbmcobUF1ZGlvVHJhY2stPmdldFBvcnRJZCgpKTsKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BFUkZPUk1BTkNFTU9ERSwKKyAgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFBlcmZvcm1hbmNlTW9kZVRvVGV4dChidWlsZGVyLmdldFBlcmZvcm1hbmNlTW9kZSgpKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NIQVJJTkdNT0RFLAorICAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U2hhcmluZ01vZGVUb1RleHQoYnVpbGRlci5nZXRTaGFyaW5nTW9kZSgpKSkKKyAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HQ0xJRU5ULCB0b1N0cmluZyhnZXRGb3JtYXQoKSkuY19zdHIoKSkucmVjb3JkKCk7CiAKICAgICBkb1NldFZvbHVtZSgpOwogCkBAIC0xOTMsMTIgKzIwMiw5IEBACiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1BdWRpb1RyYWNrLT5jaGFubmVsQ291bnQoKSk7CiAgICAgc2V0Rm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7CiAgICAgc2V0RGV2aWNlRm9ybWF0KG1BdWRpb1RyYWNrLT5mb3JtYXQoKSk7Ci0KLSAgICBpbnQzMl90IGFjdHVhbFNhbXBsZVJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwotICAgIEFMT0dXX0lGKGFjdHVhbFNhbXBsZVJhdGUgIT0gZ2V0U2FtcGxlUmF0ZSgpLAotICAgICAgICAgICAgICJvcGVuKCkgc2FtcGxlUmF0ZSBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLAotICAgICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgYWN0dWFsU2FtcGxlUmF0ZSk7Ci0gICAgc2V0U2FtcGxlUmF0ZShhY3R1YWxTYW1wbGVSYXRlKTsKKyAgICBzZXRTYW1wbGVSYXRlKG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCkpOworICAgIHNldEJ1ZmZlckNhcGFjaXR5KGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpKTsKKyAgICBzZXRGcmFtZXNQZXJCdXJzdChnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSk7CiAKICAgICAvLyBXZSBtYXkgbmVlZCB0byBwYXNzIHRoZSBkYXRhIHRocm91Z2ggYSBibG9jayBzaXplIGFkYXB0ZXIgdG8gZ3VhcmFudGVlIGNvbnN0YW50IHNpemUuCiAgICAgaWYgKG1DYWxsYmFja0J1ZmZlclNpemUgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CkBAIC0yMjEsMTAgKzIyNyw3IEBACiAgICAgICAgICAgICA6IChhYXVkaW9fc2Vzc2lvbl9pZF90KSBtQXVkaW9UcmFjay0+Z2V0U2Vzc2lvbklkKCk7CiAgICAgc2V0U2Vzc2lvbklkKGFjdHVhbFNlc3Npb25JZCk7CiAKLSAgICBtSW5pdGlhbEJ1ZmZlckNhcGFjaXR5ID0gZ2V0QnVmZmVyQ2FwYWNpdHkoKTsKLSAgICBtSW5pdGlhbEZyYW1lc1BlckJ1cnN0ID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKLQotICAgIG1BdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CisgICAgbUF1ZGlvVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcyk7CiAKICAgICAvLyBVcGRhdGUgcGVyZm9ybWFuY2UgbW9kZSBiYXNlZCBvbiB0aGUgYWN0dWFsIHN0cmVhbSBmbGFncy4KICAgICAvLyBGb3IgZXhhbXBsZSwgaWYgdGhlIHNhbXBsZSByYXRlIGlzIG5vdCBhbGxvd2VkIHRoZW4geW91IHdvbid0IGdldCBhIEZBU1QgdHJhY2suCkBAIC0yNDAsMTEgKzI0MywxMSBAQAogCiAgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOyAvLyBFWENMVVNJVkUgbW9kZSBub3Qgc3VwcG9ydGVkIGluIGxlZ2FjeQogCi0gICAgLy8gTG9nIHdhcm5pbmcgaWYgd2UgZGlkIG5vdCBnZXQgd2hhdCB3ZSBhc2tlZCBmb3IuCi0gICAgQUxPR1dfSUYoYWN0dWFsRmxhZ3MgIT0gZmxhZ3MsCisgICAgLy8gTG9nIGlmIHdlIGRpZCBub3QgZ2V0IHdoYXQgd2UgYXNrZWQgZm9yLgorICAgIEFMT0dEX0lGKGFjdHVhbEZsYWdzICE9IGZsYWdzLAogICAgICAgICAgICAgICJvcGVuKCkgZmxhZ3MgY2hhbmdlZCBmcm9tIDB4JTA4WCB0byAweCUwOFgiLAogICAgICAgICAgICAgIGZsYWdzLCBhY3R1YWxGbGFncyk7Ci0gICAgQUxPR1dfSUYoYWN0dWFsUGVyZm9ybWFuY2VNb2RlICE9IHBlcmZNb2RlLAorICAgIEFMT0dEX0lGKGFjdHVhbFBlcmZvcm1hbmNlTW9kZSAhPSBwZXJmTW9kZSwKICAgICAgICAgICAgICAib3BlbigpIHBlcmZNb2RlIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgcGVyZk1vZGUsIGFjdHVhbFBlcmZvcm1hbmNlTW9kZSk7CiAKQEAgLTI1MywxOSArMjU2LDMyIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZWxlYXNlX2woKSB7CiAgICAgaWYgKGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjayk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMpOworICAgICAgICBBTE9HRV9JRihlcnIsICIlcygpIHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgZXJyKTsKICAgICAgICAgbG9nUmVsZWFzZUJ1ZmZlclN0YXRlKCk7Ci0gICAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgd2h5IGNsZWFyKCkgY2F1c2VzIGEgaGFuZyBpbiB0ZXN0X3ZhcmlvdXMuY3BwCi0gICAgICAgIC8vIGlmIEkgY2FsbCBjbG9zZSgpIGZyb20gYSBkYXRhIGNhbGxiYWNrLgotICAgICAgICAvLyBCdXQgdGhlIHNhbWUgdGhpbmcgaW4gQXVkaW9SZWNvcmQgaXMgT0shCi0gICAgICAgIC8vIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgICAgIG1GaXhlZEJsb2NrUmVhZGVyLmNsb3NlKCk7CisgICAgICAgIC8vIERhdGEgY2FsbGJhY2tzIG1heSBzdGlsbCBiZSBydW5uaW5nIQogICAgICAgICByZXR1cm4gQXVkaW9TdHJlYW06OnJlbGVhc2VfbCgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7IC8vIGFscmVhZHkgcmVsZWFzZWQKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9TdHJlYW1UcmFjazo6Y2xvc2VfbCgpIHsKKyAgICAvLyBUaGUgY2FsbGJhY2tzIGFyZSBub3JtYWxseSBqb2luZWQgaW4gdGhlIEF1ZGlvVHJhY2sgZGVzdHJ1Y3Rvci4KKyAgICAvLyBCdXQgaWYgYW5vdGhlciBvYmplY3QgaGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBBdWRpb1RyYWNrIHRoZW4KKyAgICAvLyBpdCB3aWxsIG5vdCBnZXQgZGVsZXRlZCBoZXJlLgorICAgIC8vIFNvIHdlIHNob3VsZCBqb2luIGNhbGxiYWNrcyBleHBsaWNpdGx5IGJlZm9yZSByZXR1cm5pbmcuCisgICAgLy8gVW5sb2NrIGFyb3VuZCB0aGUgam9pbiB0byBhdm9pZCBkZWFkbG9ja3MgaWYgdGhlIGNhbGxiYWNrIHRyaWVzIHRvIGxvY2suCisgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBjYWxsYmFjayByZXR1cm5zIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUAorICAgIG1TdHJlYW1Mb2NrLnVubG9jaygpOworICAgIG1BdWRpb1RyYWNrLT5zdG9wQW5kSm9pbkNhbGxiYWNrcygpOworICAgIG1TdHJlYW1Mb2NrLmxvY2soKTsKKyAgICBtQXVkaW9UcmFjay5jbGVhcigpOworICAgIC8vIERvIG5vdCBjbG9zZSBtRml4ZWRCbG9ja1JlYWRlci4gSXQgaGFzIGEgdW5pcXVlX3B0ciB0byBpdHMgYnVmZmVyCisgICAgLy8gc28gaXQgd2lsbCBjbGVhbiB1cCBieSBpdHNlbGYuCisgICAgQXVkaW9TdHJlYW06OmNsb3NlX2woKTsKK30KKwogdm9pZCBBdWRpb1N0cmVhbVRyYWNrOjpwcm9jZXNzQ2FsbGJhY2soaW50IGV2ZW50LCB2b2lkICppbmZvKSB7CiAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CkBAIC0yODEsOCArMjk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgfHwgbUF1ZGlvVHJhY2stPmZvcm1hdCgpICE9IGdldEZvcm1hdCgpCiAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCkgIT0gZ2V0U2FtcGxlUmF0ZSgpCiAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1RyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpICE9IGdldERldmljZUlkKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSAhPSBtSW5pdGlhbEJ1ZmZlckNhcGFjaXR5Ci0gICAgICAgICAgICAgICAgICAgIHx8IGdldEZyYW1lc1BlckJ1cnN0KCkgIT0gbUluaXRpYWxGcmFtZXNQZXJCdXJzdCkgeworICAgICAgICAgICAgICAgICAgICB8fCBnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSAhPSBnZXRCdWZmZXJDYXBhY2l0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgICAgICBwcm9jZXNzQ2FsbGJhY2tDb21tb24oQUFVRElPX0NBTExCQUNLX09QRVJBVElPTl9ESVNDT05ORUNURUQsIGluZm8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0yOTMsNyArMzA5LDcgQEAKICAgICByZXR1cm47CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RhcnQoKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFN0YXJ0X2woKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIG5vIEF1ZGlvVHJhY2siKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMzIwLDcgKzMzNiw3IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RQYXVzZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0UGF1c2VfbCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXMoKSBubyBBdWRpb1RyYWNrIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0zMzYsNyArMzUyLDcgQEAKICAgICByZXR1cm4gY2hlY2tGb3JEaXNjb25uZWN0UmVxdWVzdChmYWxzZSk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0Rmx1c2goKSB7CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoX2woKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtMzUwLDcgKzM2Niw3IEBACiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtVHJhY2s6OnJlcXVlc3RTdG9wX2woKSB7CiAgICAgaWYgKG1BdWRpb1RyYWNrLmdldCgpID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzKCkgbm8gQXVkaW9UcmFjayIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtNDcxLDcgKzQ4Nyw3IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdWRpb1RyYWNrLT5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKSk7CiB9CiAKLWludDMyX3QgQXVkaW9TdHJlYW1UcmFjazo6Z2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdAoraW50MzJfdCBBdWRpb1N0cmVhbVRyYWNrOjpnZXRCdWZmZXJDYXBhY2l0eUZyb21EZXZpY2UoKSBjb25zdAogewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpKTsKIH0KQEAgLTQ4MSw4ICs0OTcsNyBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQXVkaW9UcmFjay0+Z2V0VW5kZXJydW5Db3VudCgpKTsKIH0KIAotaW50MzJfdCBBdWRpb1N0cmVhbVRyYWNrOjpnZXRGcmFtZXNQZXJCdXJzdCgpIGNvbnN0Ci17CitpbnQzMl90IEF1ZGlvU3RyZWFtVHJhY2s6OmdldEZyYW1lc1BlckJ1cnN0RnJvbURldmljZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF1ZGlvVHJhY2stPmdldE5vdGlmaWNhdGlvblBlcmlvZEluRnJhbWVzKCkpOwogfQogCkBAIC01NTksNyArNTc0LDcgQEAKICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsgLy8gYSBub24tbmVnYXRpdmUgdmFsdWUgaXMgdGhlIHZvbHVtZSBzaGFwZXIgaWQuCiAgICAgICAgICAgICBBTE9HRSgiYXBwbHlWb2x1bWVTaGFwZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBzdGF0dXMpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0QoImFwcGx5Vm9sdW1lU2hhcGVyKCkiCiAgICAgICAgICAgICAgICAgICAgICAgIiBubyBBdWRpb1RyYWNrIGZvciB2b2x1bWUgY29udHJvbCBmcm9tIElQbGF5ZXIiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suaAppbmRleCA5M2ExZmY0Li5mNjA0ODcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5oCkBAIC00MiwxMiArNDIsMTUgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IEF1ZGlvU3RyZWFtQnVpbGRlciAmIGJ1aWxkZXIpIG92ZXJyaWRlOwogICAgIGFhdWRpb19yZXN1bHRfdCByZWxlYXNlX2woKSBvdmVycmlkZTsKKyAgICB2b2lkIGNsb3NlX2woKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnQoKSBvdmVycmlkZTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFBhdXNlKCkgb3ZlcnJpZGU7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RGbHVzaCgpIG92ZXJyaWRlOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RvcCgpIG92ZXJyaWRlOworcHJvdGVjdGVkOgorICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0U3RhcnRfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSAgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RQYXVzZV9sKCkgUkVRVUlSRVMobVN0cmVhbUxvY2spIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXF1ZXN0Rmx1c2hfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0b3BfbCgpIFJFUVVJUkVTKG1TdHJlYW1Mb2NrKSBvdmVycmlkZTsKIAorcHVibGljOgogICAgIGJvb2wgaXNGbHVzaFN1cHBvcnRlZCgpIGNvbnN0IG92ZXJyaWRlIHsKICAgICAgICAgLy8gT25seSBpbXBsZW1lbnQgRkxVU0ggZm9yIE9VVFBVVCBzdHJlYW1zLgogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY4LDggKzcxLDYgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKSBvdmVycmlkZTsKICAgICBpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdCgpY29uc3QgIG92ZXJyaWRlOwogICAgIGludDMyX3QgZ2V0WFJ1bkNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBpbnQ2NF90IGdldEZyYW1lc1JlYWQoKSBvdmVycmlkZTsKQEAgLTk1LDYgKzk2LDExIEBACiAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjptZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgb3ZlcnJpZGU7CiAjZW5kaWYKIAorcHJvdGVjdGVkOgorCisgICAgaW50MzJfdCBnZXRGcmFtZXNQZXJCdXJzdEZyb21EZXZpY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQzMl90IGdldEJ1ZmZlckNhcGFjaXR5RnJvbURldmljZSgpIGNvbnN0IG92ZXJyaWRlOworCiBwcml2YXRlOgogCiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QXVkaW9UcmFjaz4gbUF1ZGlvVHJhY2s7CkBAIC0xMDQsMTAgKzExMCw2IEBACiAKICAgICAvLyBUT0RPIGFkZCA2NC1iaXQgcG9zaXRpb24gcmVwb3J0aW5nIHRvIEF1ZGlvVHJhY2sgYW5kIHVzZSBpdC4KICAgICBhYXVkaW9fd3JhcHBpbmdfZnJhbWVzX3QgICAgICAgICBtUG9zaXRpb25XaGVuUGF1c2luZyA9IDA7Ci0KLSAgICAvLyBpbml0aWFsIEF1ZGlvVHJhY2sgZnJhbWUgY291bnQgYW5kIG5vdGlmaWNhdGlvbiBwZXJpb2QKLSAgICBpbnQzMl90IG1Jbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSAwOwotICAgIGludDMyX3QgbUluaXRpYWxGcmFtZXNQZXJCdXJzdCA9IDA7CiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGliYWF1ZGlvLm1hcC50eHQgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xpYmFhdWRpby5tYXAudHh0CmluZGV4IDJlMDBhYTUuLjFkZDQ0ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGliYWF1ZGlvLm1hcC50eHQKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dApAQCAtMjMsNiArMjMsOCBAQAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3k7ICMgaW50cm9kdWNlZD0yOQogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkOyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UHJpdmFjeVNlbnNpdGl2ZTsgICAjIGludHJvZHVjZWQ9MzAKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBhY2thZ2VOYW1lOyAgICMgaW50cm9kdWNlZD0zMQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QXR0cmlidXRpb25UYWc7ICAgIyBpbnRyb2R1Y2VkPTMxCiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlOwogICAgIEFBdWRpb1N0cmVhbV9jbG9zZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggOTAwN2IxMC4uZDc5NTcyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KICNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KIAogI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCkBAIC0xMzQsNiArMTM0LDEyIEBACiAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fSTI0X1BBQ0tFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMzI6CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFhdWRpb0Zvcm1hdCk7CkBAIC0xNTQsNiArMTYwLDEyIEBACiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kyNF9QQUNLRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0kzMjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFuZHJvaWRGb3JtYXQpOwpAQCAtMjMxLDcgKzI0Myw4IEBACiAgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgogICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKICAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiB8IEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkU7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OIHwgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIHBvbGljeSk7CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT05FOyAvLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IGQyZTQ4MDUuLjgyZWI3N2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDg5MzVkNTcuLjk4ZTk3MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiLAogICAgIGNmbGFnczogWwpAQCAtMTEsMTAgKzIwLDEyIEBACiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X21hcnNoYWxsaW5nLmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhYXVkaW8tYWlkbC1jcHAiLAogICAgICAgICAibGliYWF1ZGlvX2ludGVybmFsIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKICAgICBdLAogfQogCkBAIC0xOTgsOSArMjA5LDkgQEAKIH0KIAogY2NfdGVzdCB7Ci0gICAgbmFtZTogInRlc3Rfc3RvcF9oYW5nIiwKKyAgICBuYW1lOiAidGVzdF9jYWxsYmFja19yYWNlIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKLSAgICBzcmNzOiBbInRlc3Rfc3RvcF9oYW5nLmNwcCJdLAorICAgIHNyY3M6IFsidGVzdF9jYWxsYmFja19yYWNlLmNwcCJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhYXVkaW8iLAogICAgICAgICAibGliYmluZGVyIiwKQEAgLTIzOSwzICsyNTAsMTYgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogfQorCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Rpc2Nvbm5lY3RfcmFjZSIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Rpc2Nvbm5lY3RfcmFjZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hYXVkaW9fbW9ua2V5LmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2FhdWRpb19tb25rZXkuY3BwCmluZGV4IGJlNTQ4MzUuLmNjMjk2NzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2FhdWRpb19tb25rZXkuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2FhdWRpb19tb25rZXkuY3BwCkBAIC00NiwxMSArNDYsMTAgQEAKICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpOwogCiB2b2lkIEFBdWRpb01vbmtleUVycm9yQ2FsbGJhY2tQcm9jKAotICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKLSAgICAgICAgdm9pZCAqdXNlckRhdGEgX191bnVzZWQsCi0gICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgewotICAgIHByaW50ZigiRXJyb3IgQ2FsbGJhY2ssIGVycm9yOiAlZFxuIiwoaW50KWVycm9yKTsKLX0KKyAgICAgICAgQUF1ZGlvU3RyZWFtICogLyogc3RyZWFtICovLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKTsKKwogCiAvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4gT25seSB1c2UgdGhpcyBmcm9tIGEgc2luZ2xlIHRocmVhZC4KIGRvdWJsZSBuZXh0UmFuZG9tRG91YmxlKCkgewpAQCAtOTksNiArOTgsMTAgQEAKICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOOwogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShnZXRTdHJlYW0oKSwKICAgICAgICAgICAgIEFBVURJT19TVFJFQU1fU1RBVEVfVU5LTk9XTiwgJnN0YXRlLCAwKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBwcmludGYoIldBUk5JTkcgLSBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlIHJldHVybmVkIERJU0NPTk5FQ1RFRFxuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gT0sKKyAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTQsNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGZyYW1lc1JlYWQsCiAgICAgICAgICAgICAgICB4UnVucyk7CiAKLSAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPCBmcmFtZXNSZWFkKSB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HICYmIGZyYW1lc1dyaXR0ZW4gPCBmcmFtZXNSZWFkKSB7CiAgICAgICAgICAgICBwcmludGYoIldBUk5JTkcgLSBVTkRFUkZMT1cgLSBkaWZmID0gJWQgISEhISEhISEhISEhXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpIChmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCkpOwogICAgICAgICB9CkBAIC0xMzIsOCArMTM1LDIzIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAorICAgICAgICAvLyB1cGRhdGUgYW5kIHF1ZXJ5IHN0cmVhbSBzdGF0ZQorICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV047CisgICAgICAgIHN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKGdldFN0cmVhbSgpKTsKKyAgICAgICAgaWYgKHN0YXRlIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZSByZXR1cm5lZCAlZFxuIiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CisgICAgICAgICAgICBwcmludGYoIiMlZCwgQ2xvc2luZyBkaXNjb25uZWN0ZWQgc3RyZWFtLlxuIiwgZ2V0SW5kZXgoKSk7CisgICAgICAgICAgICByZXN1bHQgPSBjbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCiAgICAgICAgIGRvdWJsZSBkaWNlID0gbmV4dFJhbmRvbURvdWJsZSgpOwogICAgICAgICAvLyBTZWxlY3QgYW4gYWN0aW9uIGJhc2VkIG9uIGEgd2VpZ2h0ZWQgcHJvYmFiaWxpdHkuCisgICAgICAgIHByaW50ZigiICAgICIpOyAvLyBpbmRlbnQgYWN0aW9uCiAgICAgICAgIGlmIChkaWNlIDwgUFJPQl9TVEFSVCkgewogICAgICAgICAgICAgcHJpbnRmKCJzdGFydFxuIik7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGdldFN0cmVhbSgpKTsKQEAgLTIwMCw2ICsyMTgsMTAgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CiAgICAgfQogCisgICAgaW50IGdldEluZGV4KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluZGV4OworICAgIH0KKwogcHJpdmF0ZToKICAgICBjb25zdCBBQXVkaW9BcmdzUGFyc2VyICAqbUFyZ1BhcnNlcjsKICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgbUluZGV4OwpAQCAtMjIzLDYgKzI0NSwxMyBAQAogICAgIHJldHVybiBtb25rZXktPnJlbmRlckF1ZGlvKHN0cmVhbSwgYXVkaW9EYXRhLCBudW1GcmFtZXMpOwogfQogCit2b2lkIEFBdWRpb01vbmtleUVycm9yQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKiAvKiBzdHJlYW0gKi8sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBBQXVkaW9Nb25rZXkgKm1vbmtleSA9IChBQXVkaW9Nb25rZXkgKikgdXNlckRhdGE7CisgICAgcHJpbnRmKCIjJWQsIEVycm9yIENhbGxiYWNrLCBlcnJvcjogJWRcbiIsIG1vbmtleS0+Z2V0SW5kZXgoKSwgKGludCllcnJvcik7Cit9CiAKIHN0YXRpYyB2b2lkIHVzYWdlKCkgewogICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKaW5kZXggMTMwZWY0My4uNGRiYjIxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcApAQCAtMjYsNiArMjYsNyBAQAogdXNpbmcgYW5kcm9pZDo6Zmlmb19jb3VudGVyX3Q7CiB1c2luZyBhbmRyb2lkOjpGaWZvQ29udHJvbGxlcjsKIHVzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVySW5kaXJlY3Q7CiB1c2luZyBhbmRyb2lkOjpXcmFwcGluZ0J1ZmZlcjsKIAogVEVTVCh0ZXN0X2ZpZm9fY29udHJvbGxlciwgZmlmb19pbmRpY2VzKSB7CkBAIC0zMjUsNyArMzI2LDcgQEAKICAgICAgICAgdmVyaWZ5U3RvcmFnZUludGVncml0eSgpOwogICAgIH0KIAotICAgIEZpZm9CdWZmZXIgICAgIG1GaWZvQnVmZmVyOworICAgIEZpZm9CdWZmZXJJbmRpcmVjdCAgICAgbUZpZm9CdWZmZXI7CiAgICAgZmlmb19mcmFtZXNfdCAgbU5leHRXcml0ZUluZGV4ID0gMDsKICAgICBmaWZvX2ZyYW1lc190ICBtTmV4dFZlcmlmeUluZGV4ID0gMDsKICAgICBmaWZvX2ZyYW1lc190ICBtVGhyZXNob2xkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2FsbGJhY2tfcmFjZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jYWxsYmFja19yYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNkNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2FsbGJhY2tfcmFjZS5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRlc3Qgd2hldGhlciB0aGUgY2FsbGJhY2sgaXMgam9pbmVkIGJlZm9yZSB0aGUgY2xvc2UgZmluaXNoZXMuCisgKgorICogU3RhcnQgYSBzdHJlYW0gd2l0aCBhIGNhbGxiYWNrLgorICogVGhlIGNhbGxiYWNrIGp1c3Qgc2xlZXBzIGZvciBhIGxvbmcgdGltZS4KKyAqIFdoaWxlIHRoZSBjYWxsYmFjayBpcyBzbGVlcGluZywgY2xvc2UoKSB0aGUgc3RyZWFtIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICogVGhlbiBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIHdhcyBqb2luZWQgYmVmb3JlIHRoZSBjbG9zZSgpIHJldHVybnMuCisgKgorICogVGhpcyBjYW4gaGFuZyBpZiB0aGVyZSBhcmUgZGVhZGxvY2tzLiBTbyBtYWtlIHN1cmUgeW91IGdldCBhIFBBU1NFRCByZXN1bHQuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKworLy8gU2xlZXAgbG9uZyBlbm91Z2ggdGhhdCB0aGUgZm9yZWdyb3VuZCBoYXMgYSBjaGFuZ2UgdG8gY2FsbCBjbG9zZS4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWxsYmFja1NsZWVwTWljcm9zID0gNjAwICogMTAwMDsKKworY2xhc3MgQXVkaW9FbmdpbmUgeworcHVibGljOgorCisgICAgLy8gQ2hlY2sgZm9yIGEgY3Jhc2ggb3IgbGF0ZSBjYWxsYmFjayBpZiB3ZSBjbG9zZSB3aXRob3V0IHN0b3BwaW5nLgorICAgIHZvaWQgY2hlY2tDbG9zZUpvaW5zKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0KSB7CisKKyAgICAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjaworICAgICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgICAgICBtQ2FsbGJhY2tSZXN1bHQgPSBjYWxsYmFja1Jlc3VsdDsKKyAgICAgICAgc3RhcnRTdHJlYW1Gb3JTdGFsbChkaXJlY3Rpb24sIHBlcmZNb2RlKTsKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbGJhY2sgc3RhcnRzIGl0IHdpbGwgZ28gdG8gc2xlZXAuCisgICAgICAgIHdhaXRGb3JDYWxsYmFja1RvU3RhcnQoKTsKKworICAgICAgICBwcmludGYoImNhbGwgQUF1ZGlvU3RyZWFtX2Nsb3NlKClcbiIpOworICAgICAgICBBU1NFUlRfRkFMU0UobUNhbGxiYWNrRmluaXNoZWQpOyAvLyBTdGlsbCBzbGVlcGluZz8KKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShtU3RyZWFtKTsgLy8gTWF5IGhhbmcgaGVyZSEKKyAgICAgICAgQVNTRVJUX1RSVUUobUNhbGxiYWNrRmluaXNoZWQpOworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSgpIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworCisgICAgICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIG1FcnJvci5sb2FkKCkpOworICAgICAgICAvLyBEaWQgY2FsbGluZyBzdG9wKCkgZnJvbSBjYWxsYmFjayBmYWlsPyBJdCBzaG91bGQgaGF2ZS4KKyAgICAgICAgQVNTRVJUX05FKEFBVURJT19PSywgbVN0b3BSZXN1bHQubG9hZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBzdGFydFN0cmVhbUZvclN0YWxsKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciA9IG51bGxwdHI7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICAgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmJ1aWxkZXIpOworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworCisgICAgICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGJ1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIHRoaXMpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soYnVpbGRlciwgc19teUVycm9yQ2FsbGJhY2tQcm9jLCB0aGlzKTsKKworICAgICAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYnVpbGRlciwgJm1TdHJlYW0pOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShidWlsZGVyKTsKKyAgICAgICAgQVNTRVJUX0VRKEFBVURJT19PSywgcmVzdWx0KTsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQobVN0cmVhbSk7CisgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QKKyAgICAgICAgICAgIGFjdHVhbFBlcmZNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShtU3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgZGV2aWNlSWQsCisgICAgICAgICAgICAgICBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG1TdHJlYW0pOworICAgICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvckNhbGxiYWNrVG9TdGFydCgpIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgY2FsbGJhY2sgdG8gc2F5IGl0IGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgaW50IGNvdW50RG93bk1pbGxpcyA9IDIwMDA7CisgICAgICAgIGNvbnN0ZXhwciBpbnQgY291bnREb3duUGVyaW9kTWlsbGlzID0gNTA7CisgICAgICAgIHdoaWxlICghbUNhbGxiYWNrU3RhcnRlZCAmJiBjb3VudERvd25NaWxsaXMgPiAwKSB7CisgICAgICAgICAgICBwcmludGYoIldhaXRpbmcgZm9yIGNhbGxiYWNrIHRvIHN0YXJ0LCAlZFxuIiwgY291bnREb3duTWlsbGlzKTsKKyAgICAgICAgICAgIHVzbGVlcChjb3VudERvd25QZXJpb2RNaWxsaXMgKiAxMDAwKTsKKyAgICAgICAgICAgIGNvdW50RG93bk1pbGxpcyAtPSBjb3VudERvd25QZXJpb2RNaWxsaXM7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0xUKDAsIGNvdW50RG93bk1pbGxpcyk7CisgICAgICAgIEFTU0VSVF9UUlVFKG1DYWxsYmFja1N0YXJ0ZWQpOworICAgIH0KKworLy8gQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBmaWxscyB0aGUgYXVkaW8gb3V0cHV0IGJ1ZmZlci4KKyAgICBzdGF0aWMgYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3Qgc19teURhdGFDYWxsYmFja1Byb2MoCisgICAgICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgdm9pZCAqIC8qYXVkaW9EYXRhICovLAorICAgICAgICAgICAgaW50MzJfdCAvKiBudW1GcmFtZXMgKi8KKyAgICApIHsKKyAgICAgICAgQXVkaW9FbmdpbmUqIGVuZ2luZSA9IChBdWRpb0VuZ2luZSopIHVzZXJEYXRhOworICAgICAgICBlbmdpbmUtPm1DYWxsYmFja1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICB1c2xlZXAoa0NhbGxiYWNrU2xlZXBNaWNyb3MpOworICAgICAgICAvLyBpdCBpcyBpbGxlZ2FsIHRvIGNhbGwgc3RvcCgpIGZyb20gdGhlIGNhbGxiYWNrLiBJdCBzaG91bGQKKyAgICAgICAgLy8gcmV0dXJuIGFuIGVycm9yIGFuZCBub3QgaGFuZy4KKyAgICAgICAgZW5naW5lLT5tU3RvcFJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChzdHJlYW0pOworICAgICAgICBlbmdpbmUtPm1DYWxsYmFja0ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVuZ2luZS0+bUNhbGxiYWNrUmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW0gKiAvKiBzdHJlYW0gKi8sCisgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoQXVkaW9FbmdpbmUgKil1c2VyRGF0YTsKKyAgICAgICAgZW5naW5lLT5tRXJyb3IgPSBlcnJvcjsKKyAgICB9CisKKyAgICBBQXVkaW9TdHJlYW0qIG1TdHJlYW0gPSBudWxscHRyOworCisgICAgc3RkOjphdG9taWM8YWF1ZGlvX3Jlc3VsdF90PiBtRXJyb3J7QUFVRElPX09LfTsgLy8gd3JpdHRlbiBieSBlcnJvciBjYWxsYmFjaworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1DYWxsYmFja1N0YXJ0ZWR7ZmFsc2V9OyAgIC8vIHdyaXR0ZW4gYnkgZGF0YSBjYWxsYmFjaworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1DYWxsYmFja0ZpbmlzaGVke2ZhbHNlfTsgIC8vIHdyaXR0ZW4gYnkgZGF0YSBjYWxsYmFjaworICAgIHN0ZDo6YXRvbWljPGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90PiBtQ2FsbGJhY2tSZXN1bHR7QUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRX07CisgICAgc3RkOjphdG9taWM8YWF1ZGlvX3Jlc3VsdF90PiBtU3RvcFJlc3VsdHtBQVVESU9fT0t9OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRlbGwgdGhlIGNhbGxiYWNrIHRvIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFLgorCitURVNUKHRlc3RfY2xvc2VfdGltaW5nLCBhYXVkaW9fY2xvc2Vfam9pbnNfaW5wdXRfbm9uZSkgeworICAgIEF1ZGlvRW5naW5lIGVuZ2luZTsKKyAgICBlbmdpbmUuY2hlY2tDbG9zZUpvaW5zKEFBVURJT19ESVJFQ1RJT05fSU5QVVQsCisgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpOworfQorCitURVNUKHRlc3RfY2xvc2VfdGltaW5nLCBhYXVkaW9fY2xvc2Vfam9pbnNfb3V0cHV0X25vbmUpIHsKKyAgICBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgZW5naW5lLmNoZWNrQ2xvc2VKb2lucyhBQVVESU9fRElSRUNUSU9OX09VVFBVVCwKKyAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSk7Cit9CisKK1RFU1QodGVzdF9jbG9zZV90aW1pbmcsIGFhdWRpb19jbG9zZV9qb2luc19pbnB1dF9sb3dsYXQpIHsKKyAgICBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgZW5naW5lLmNoZWNrQ2xvc2VKb2lucyhBQVVESU9fRElSRUNUSU9OX0lOUFVULAorICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKKyAgICAgICAgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRSk7Cit9CisKK1RFU1QodGVzdF9jbG9zZV90aW1pbmcsIGFhdWRpb19jbG9zZV9qb2luc19vdXRwdXRfbG93bGF0KSB7CisgICAgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGVuZ2luZS5jaGVja0Nsb3NlSm9pbnMoQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsCisgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX0NPTlRJTlVFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRlbGwgdGhlIGNhbGxiYWNrIHRvIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AuCisKK1RFU1QodGVzdF9jbG9zZV90aW1pbmcsIGFhdWRpb19jbG9zZV9qb2luc19pbnB1dF9sb3dsYXRfc3RvcCkgeworICAgIEF1ZGlvRW5naW5lIGVuZ2luZTsKKyAgICBlbmdpbmUuY2hlY2tDbG9zZUpvaW5zKEFBVURJT19ESVJFQ1RJT05fSU5QVVQsCisgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApOworfQorCitURVNUKHRlc3RfY2xvc2VfdGltaW5nLCBhYXVkaW9fY2xvc2Vfam9pbnNfb3V0cHV0X2xvd2xhdF9zdG9wKSB7CisgICAgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGVuZ2luZS5jaGVja0Nsb3NlSm9pbnMoQUFVRElPX0RJUkVDVElPTl9PVVRQVVQsCisgICAgICAgIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApOworfQorCitURVNUKHRlc3RfY2xvc2VfdGltaW5nLCBhYXVkaW9fY2xvc2Vfam9pbnNfb3V0cHV0X25vbmVfc3RvcCkgeworICAgIEF1ZGlvRW5naW5lIGVuZ2luZTsKKyAgICBlbmdpbmUuY2hlY2tDbG9zZUpvaW5zKEFBVURJT19ESVJFQ1RJT05fT1VUUFVULAorICAgICAgICBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLAorICAgICAgICBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApOworfQorCitURVNUKHRlc3RfY2xvc2VfdGltaW5nLCBhYXVkaW9fY2xvc2Vfam9pbnNfaW5wdXRfbm9uZV9zdG9wKSB7CisgICAgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGVuZ2luZS5jaGVja0Nsb3NlSm9pbnMoQUFVRElPX0RJUkVDVElPTl9JTlBVVCwKKyAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKKyAgICAgICAgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Rpc2Nvbm5lY3RfcmFjZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9kaXNjb25uZWN0X3JhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9kaXNjb25uZWN0X3JhY2UuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUZXN0IHdoZXRoZXIgYW4gZXJyb3IgY2FsbGJhY2sgaXMgam9pbmVkIGJlZm9yZSB0aGUgY2xvc2UgZmluaXNoZXMuCisgKgorICogU3RhcnQgYSBzdHJlYW0gd2l0aCBhIGNhbGxiYWNrLgorICogVGhlIGNhbGxiYWNrIGp1c3Qgc2xlZXBzIGZvciBhIGxvbmcgdGltZS4KKyAqIFdoaWxlIHRoZSBjYWxsYmFjayBpcyBzbGVlcGluZywgY2xvc2UoKSB0aGUgc3RyZWFtIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICogVGhlbiBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGNhbGxiYWNrIHdhcyBqb2luZWQgYmVmb3JlIHRoZSBjbG9zZSgpIHJldHVybnMuCisgKgorICogVGhpcyBjYW4gaGFuZyBpZiB0aGVyZSBhcmUgZGVhZGxvY2tzLiBTbyBtYWtlIHN1cmUgeW91IGdldCBhIFBBU1NFRCByZXN1bHQuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisvLyBTbGVlcCBsb25nIGVub3VnaCB0aGF0IHRoZSBmb3JlZ3JvdW5kIGhhcyBhIGNoYW5jZSB0byBjYWxsIGNsb3NlLgorc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhbGxiYWNrU2xlZXBNaWxsaXMgPSAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1BvbGxTbGVlcE1pbGxpcyAgICAgPSAgMTAwOworCitzdGF0aWMgaW50IHNFcnJvckNvdW50ID0gMDsKKworI2RlZmluZSBNWV9BU1NFUlRfVFJVRShzdGF0ZW1lbnQpIFwKKyAgICBpZiAoIShzdGF0ZW1lbnQpKSB7IFwKKyAgICAgICAgcHJpbnRmKCJFUlJPUiBsaW5lOiVkIC0gIiAjc3RhdGVtZW50ICJcbiIsIF9fTElORV9fKTsgXAorICAgICAgICBzRXJyb3JDb3VudCsrOyBcCisgICAgICAgIHJldHVybiBmYWxzZTsgXAorICAgIH0KKworI2RlZmluZSBNWV9BU1NFUlRfRVEoYWEsYmIpIE1ZX0FTU0VSVF9UUlVFKCgoYWEpID09IChiYikpKQorI2RlZmluZSBNWV9BU1NFUlRfTkUoYWEsYmIpIE1ZX0FTU0VSVF9UUlVFKCgoYWEpICE9IChiYikpKQorCitjbGFzcyBBdWRpb0VuZ2luZSB7CitwdWJsaWM6CisKKyAgICAvLyBDaGVjayBmb3IgYSBjcmFzaCBvciBsYXRlIGNhbGxiYWNrIGlmIHdlIGNsb3NlIHdpdGhvdXQgc3RvcHBpbmcuCisgICAgYm9vbCBjaGVja0Nsb3NlSm9pbnMoYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYWxsU3RvcEZyb21DYWxsYmFjaykgeworICAgICAgICBtQ2FsbFN0b3BGcm9tQ2FsbGJhY2sgPSBjYWxsU3RvcEZyb21DYWxsYmFjazsKKworICAgICAgICBpZiAoIXN0YXJ0U3RyZWFtRm9yU3RhbGwoZGlyZWN0aW9uLCBwZXJmTW9kZSkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgcHJpbnRmKCIlcygpIC0gZGlyZWN0aW9uID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxTdG9wID0gJWRcbiIsCisgICAgICAgICAgICBfX2Z1bmNfXywgZGlyZWN0aW9uLCBwZXJmTW9kZSwgY2FsbFN0b3BGcm9tQ2FsbGJhY2spOworCisgICAgICAgIC8vIFdoZW4gdGhlIGNhbGxiYWNrIHN0YXJ0cyBpdCB3aWxsIGdvIHRvIHNsZWVwLgorICAgICAgICBpZiAoIXdhaXRGb3JDYWxsYmFja1RvU3RhcnQoKSkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHByaW50ZigiY2FsbCBBQXVkaW9TdHJlYW1fY2xvc2UoKVxuIik7CisgICAgICAgIE1ZX0FTU0VSVF9UUlVFKCFtQ2FsbGJhY2tGaW5pc2hlZCk7IC8vIFN0aWxsIHNsZWVwaW5nPworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX2Nsb3NlKG1TdHJlYW0pOyAvLyBNYXkgaGFuZyBoZXJlIQorICAgICAgICBpZiAobUNhbGxiYWNrU3RhcnRlZCkgeworICAgICAgICAgICAgTVlfQVNTRVJUX1RSVUUobUNhbGxiYWNrRmluaXNoZWQpOworICAgICAgICB9CisgICAgICAgIE1ZX0FTU0VSVF9FUShBQVVESU9fT0ssIHJlc3VsdCk7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtX2Nsb3NlKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisKKyAgICAgICAgTVlfQVNTRVJUX0VRKEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQsIG1FcnJvci5sb2FkKCkpOworICAgICAgICBpZiAobUNhbGxTdG9wRnJvbUNhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyBEaWQgY2FsbGluZyBzdG9wKCkgZnJvbSBjYWxsYmFjayBmYWlsPyBJdCBzaG91bGQgaGF2ZS4KKyAgICAgICAgICAgIE1ZX0FTU0VSVF9ORShBQVVESU9fT0ssIG1TdG9wUmVzdWx0LmxvYWQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBzdGFydFN0cmVhbUZvclN0YWxsKGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciA9IG51bGxwdHI7CisgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisKKyAgICAgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmJ1aWxkZXIpOworICAgICAgICBNWV9BU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworCisgICAgICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uKGJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGJ1aWxkZXIsIHBlcmZNb2RlKTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soYnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIHRoaXMpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soYnVpbGRlciwgc19teUVycm9yQ2FsbGJhY2tQcm9jLCB0aGlzKTsKKworICAgICAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYnVpbGRlciwgJm1TdHJlYW0pOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShidWlsZGVyKTsKKyAgICAgICAgTVlfQVNTRVJUX0VRKEFBVURJT19PSywgcmVzdWx0KTsKKworICAgICAgICAvLyBDaGVjayB0byBzZWUgd2hhdCBraW5kIG9mIHN0cmVhbSB3ZSBhY3R1YWxseSBnb3QuCisgICAgICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQobVN0cmVhbSk7CisgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QKKyAgICAgICAgICAgIGFjdHVhbFBlcmZNb2RlID0gQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShtU3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLAorICAgICAgICAgICAgICAgZGV2aWNlSWQsCisgICAgICAgICAgICAgICBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG1TdHJlYW0pOworICAgICAgICBNWV9BU1NFUlRfRVEoQUFVRElPX09LLCByZXN1bHQpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgd2FpdEZvckNhbGxiYWNrVG9TdGFydCgpIHsKKyAgICAgICAgLy8gV2FpdCBmb3IgY2FsbGJhY2sgdG8gc2F5IGl0IGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgaW50IGNvdW50RG93biA9IDEwICogMTAwMCAvIGtQb2xsU2xlZXBNaWxsaXM7CisgICAgICAgIHdoaWxlICghbUNhbGxiYWNrU3RhcnRlZCAmJiBjb3VudERvd24gPiAwKSB7CisgICAgICAgICAgICBpZiAoKGNvdW50RG93biAlIDUpID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIj09PT09IFBsZWFzZSBQTFVHIG9yIFVOUExVRyBoZWFkcGhvbmVzISA9PT09PT09ICVkXG4iLCBjb3VudERvd24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNsZWVwKGtQb2xsU2xlZXBNaWxsaXMgKiAxMDAwKTsKKyAgICAgICAgICAgIGNvdW50RG93bi0tOworICAgICAgICB9CisgICAgICAgIE1ZX0FTU0VSVF9UUlVFKGNvdW50RG93biA+IDApOworICAgICAgICBNWV9BU1NFUlRfVFJVRShtQ2FsbGJhY2tTdGFydGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorICAgIHN0YXRpYyBhYXVkaW9fZGF0YV9jYWxsYmFja19yZXN1bHRfdCBzX215RGF0YUNhbGxiYWNrUHJvYygKKyAgICAgICAgICAgIEFBdWRpb1N0cmVhbSAqIC8qIHN0cmVhbSAqLywKKyAgICAgICAgICAgIHZvaWQgKiAvKiB1c2VyRGF0YSAqLywKKyAgICAgICAgICAgIHZvaWQgKiAvKiBhdWRpb0RhdGEgKi8sCisgICAgICAgICAgICBpbnQzMl90IC8qIG51bUZyYW1lcyAqLworICAgICkgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtICogc3RyZWFtLAorICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCBlcnJvcikgeworICAgICAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgICAgIGVuZ2luZS0+bUVycm9yID0gZXJyb3I7CisgICAgICAgIGVuZ2luZS0+bUNhbGxiYWNrU3RhcnRlZCA9IHRydWU7CisgICAgICAgIHVzbGVlcChrQ2FsbGJhY2tTbGVlcE1pbGxpcyAqIDEwMDApOworICAgICAgICAvLyBpdCBpcyBpbGxlZ2FsIHRvIGNhbGwgc3RvcCgpIGZyb20gdGhlIGNhbGxiYWNrLiBJdCBzaG91bGQKKyAgICAgICAgLy8gcmV0dXJuIGFuIGVycm9yIGFuZCBub3QgaGFuZy4KKyAgICAgICAgaWYgKGVuZ2luZS0+bUNhbGxTdG9wRnJvbUNhbGxiYWNrKSB7CisgICAgICAgICAgICBlbmdpbmUtPm1TdG9wUmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgZW5naW5lLT5tQ2FsbGJhY2tGaW5pc2hlZCA9IHRydWU7CisgICAgfQorCisgICAgQUF1ZGlvU3RyZWFtKiBtU3RyZWFtID0gbnVsbHB0cjsKKworICAgIHN0ZDo6YXRvbWljPGFhdWRpb19yZXN1bHRfdD4gbUVycm9ye0FBVURJT19PS307IC8vIHdyaXR0ZW4gYnkgZXJyb3IgY2FsbGJhY2sKKyAgICBzdGQ6OmF0b21pYzxib29sPiBtQ2FsbFN0b3BGcm9tQ2FsbGJhY2t7ZmFsc2V9OworICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1DYWxsYmFja1N0YXJ0ZWR7ZmFsc2V9OyAgIC8vIHdyaXR0ZW4gYnkgZXJyb3IgY2FsbGJhY2sKKyAgICBzdGQ6OmF0b21pYzxib29sPiBtQ2FsbGJhY2tGaW5pc2hlZHtmYWxzZX07ICAvLyB3cml0dGVuIGJ5IGVycm9yIGNhbGxiYWNrCisgICAgc3RkOjphdG9taWM8YWF1ZGlvX3Jlc3VsdF90PiBtU3RvcFJlc3VsdHtBQVVESU9fT0t9OworfTsKKworaW50IG1haW4oaW50LCBjaGFyICoqKSB7CisgICAgLy8gUGFyYW1ldGVycyB0byB0ZXN0LgorICAgIHN0YXRpYyBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uc1tdID0ge0FBVURJT19ESVJFQ1RJT05fT1VUUFVULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUfTsKKyAgICBzdGF0aWMgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZXNbXSA9CisgICAgICAgIHtBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORX07CisgICAgc3RhdGljIGJvb2wgY2FsbFN0b3BzW10gPSB7IGZhbHNlLCB0cnVlIH07CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiVGVzdCBEaXNjb25uZWN0IFJhY2UgVjEuMFxuIik7CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgZm9yIChhdXRvIGNhbGxTdG9wIDogY2FsbFN0b3BzKSB7CisgICAgICAgIGZvciAoYXV0byBkaXJlY3Rpb24gOiBkaXJlY3Rpb25zKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gcGVyZk1vZGUgOiBwZXJmTW9kZXMpIHsKKyAgICAgICAgICAgICAgICBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgICAgICAgICAgICAgZW5naW5lLmNoZWNrQ2xvc2VKb2lucyhkaXJlY3Rpb24sIHBlcmZNb2RlLCBjYWxsU3RvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYoIkVycm9yIENvdW50ID0gJWQsICVzXG4iLCBzRXJyb3JDb3VudCwKKyAgICAgICAgICAgKChzRXJyb3JDb3VudCA9PSAwKSA/ICJQQVNTIiA6ICJGQUlMIikpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbWFyc2hhbGxpbmcuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbWFyc2hhbGxpbmcuY3BwCmluZGV4IGM1MWZiY2UuLjQ5MjEzZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X21hcnNoYWxsaW5nLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9tYXJzaGFsbGluZy5jcHAKQEAgLTMzLDYgKzMzLDI5IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitUIGNvcHkoY29uc3QgVCYgb2JqZWN0KSB7CisgICAgcmV0dXJuIFQob2JqZWN0KTsKK30KKwordGVtcGxhdGU8PgorU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBjb3B5PFNoYXJlZE1lbW9yeVBhcmNlbGFibGU+KGNvbnN0IFNoYXJlZE1lbW9yeVBhcmNlbGFibGUmIG9iamVjdCkgeworICAgIHJldHVybiBvYmplY3QuZHVwKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHdyaXRlVG9QYXJjZWwoY29uc3QgVCYgb2JqZWN0LCBQYXJjZWwqIHBhcmNlbCkgeworICAgIGNvcHkob2JqZWN0KS5wYXJjZWxhYmxlKCkud3JpdGVUb1BhcmNlbChwYXJjZWwpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorVCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIHBhcmNlbCkgeworICAgIHVzaW5nIFBhcmNlbFR5cGUgPSBzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUoc3RkOjpkZWNsdmFsPFQ+KCkucGFyY2VsYWJsZSgpKT47CisgICAgUGFyY2VsVHlwZSBwYXJjZWxhYmxlOworICAgIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgcmV0dXJuIFQoc3RkOjptb3ZlKHBhcmNlbGFibGUpKTsKK30KKwogLy8gVGVzdCBhZGRpbmcgb25lIHZhbHVlLgogVEVTVCh0ZXN0X21hcnNoYWxsaW5nLCBhYXVkaW9fb25lX3JlYWRfd3JpdGUpIHsKICAgICBQYXJjZWwgcGFyY2VsOwpAQCAtNDgsNyArNzEsNiBAQAogLy8gVGVzdCBTaGFyZWRNZW1vcnlQYXJjZWwuCiBURVNUKHRlc3RfbWFyc2hhbGxpbmcsIGFhdWRpb19zaGFyZWRfbWVtb3J5KSB7CiAgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBzaGFyZWRNZW1vcnlBOwotICAgIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgc2hhcmVkTWVtb3J5QjsKICAgICBjb25zdCBzaXplX3QgbWVtU2l6ZUJ5dGVzID0gODQwOwogICAgIHVuaXF1ZV9mZCBmZChhc2htZW1fY3JlYXRlX3JlZ2lvbigiVGVzdE1hcnNoYWxsaW5nIiwgbWVtU2l6ZUJ5dGVzKSk7CiAgICAgQVNTRVJUX0xFKDAsIGZkKTsKQEAgLTYzLDEwICs4NSwxMCBAQAogCiAgICAgUGFyY2VsIHBhcmNlbDsKICAgICBzaXplX3QgcG9zID0gcGFyY2VsLmRhdGFQb3NpdGlvbigpOwotICAgIHNoYXJlZE1lbW9yeUEud3JpdGVUb1BhcmNlbCgmcGFyY2VsKTsKKyAgICB3cml0ZVRvUGFyY2VsKHNoYXJlZE1lbW9yeUEsICZwYXJjZWwpOwogCiAgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbihwb3MpOwotICAgIHNoYXJlZE1lbW9yeUIucmVhZEZyb21QYXJjZWwoJnBhcmNlbCk7CisgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBzaGFyZWRNZW1vcnlCID0gcmVhZEZyb21QYXJjZWw8U2hhcmVkTWVtb3J5UGFyY2VsYWJsZT4ocGFyY2VsKTsKICAgICBFWFBFQ1RfRVEoc2hhcmVkTWVtb3J5QS5nZXRTaXplSW5CeXRlcygpLCBzaGFyZWRNZW1vcnlCLmdldFNpemVJbkJ5dGVzKCkpOwogCiAgICAgLy8gc2hvdWxkIHNlZSBzYW1lIHZhbHVlIGF0IHR3byBkaWZmZXJlbnQgYWRkcmVzc2VzCkBAIC04MSw3ICsxMDMsNiBAQAogVEVTVCh0ZXN0X21hcnNoYWxsaW5nLCBhYXVkaW9fc2hhcmVkX3JlZ2lvbikgewogICAgIFNoYXJlZE1lbW9yeVBhcmNlbGFibGUgc2hhcmVkTWVtb3JpZXNbMl07CiAgICAgU2hhcmVkUmVnaW9uUGFyY2VsYWJsZSBzaGFyZWRSZWdpb25BOwotICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgc2hhcmVkUmVnaW9uQjsKICAgICBjb25zdCBzaXplX3QgbWVtU2l6ZUJ5dGVzID0gODQwOwogICAgIHVuaXF1ZV9mZCBmZChhc2htZW1fY3JlYXRlX3JlZ2lvbigiVGVzdE1hcnNoYWxsaW5nIiwgbWVtU2l6ZUJ5dGVzKSk7CiAgICAgQVNTRVJUX0xFKDAsIGZkKTsKQEAgLTk3LDEwICsxMTgsMTAgQEAKIAogICAgIFBhcmNlbCBwYXJjZWw7CiAgICAgc2l6ZV90IHBvcyA9IHBhcmNlbC5kYXRhUG9zaXRpb24oKTsKLSAgICBzaGFyZWRSZWdpb25BLndyaXRlVG9QYXJjZWwoJnBhcmNlbCk7CisgICAgd3JpdGVUb1BhcmNlbChzaGFyZWRSZWdpb25BLCAmcGFyY2VsKTsKIAogICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24ocG9zKTsKLSAgICBzaGFyZWRSZWdpb25CLnJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOworICAgIFNoYXJlZFJlZ2lvblBhcmNlbGFibGUgc2hhcmVkUmVnaW9uQiA9IHJlYWRGcm9tUGFyY2VsPFNoYXJlZFJlZ2lvblBhcmNlbGFibGU+KHBhcmNlbCk7CiAKICAgICAvLyBzaG91bGQgc2VlIHNhbWUgdmFsdWUKICAgICB2b2lkICpyZWdpb24yOwpAQCAtMTEzLDcgKzEzNCw2IEBACiBURVNUKHRlc3RfbWFyc2hhbGxpbmcsIGFhdWRpb19yaW5nX2J1ZmZlcl9wYXJjZWxhYmxlKSB7CiAgICAgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZSBzaGFyZWRNZW1vcmllc1syXTsKICAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSByaW5nQnVmZmVyQTsKLSAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSByaW5nQnVmZmVyQjsKIAogICAgIGNvbnN0IHNpemVfdCBieXRlc1BlckZyYW1lID0gODsKICAgICBjb25zdCBzaXplX3QgZnJhbWVzUGVyQnVyc3QgPSAzMjsKQEAgLTE0NywxMSArMTY3LDExIEBACiAgICAgLy8gd3JpdGUgQSB0byBwYXJjZWwKICAgICBQYXJjZWwgcGFyY2VsOwogICAgIHNpemVfdCBwb3MgPSBwYXJjZWwuZGF0YVBvc2l0aW9uKCk7Ci0gICAgcmluZ0J1ZmZlckEud3JpdGVUb1BhcmNlbCgmcGFyY2VsKTsKKyAgICB3cml0ZVRvUGFyY2VsKHJpbmdCdWZmZXJBLCAmcGFyY2VsKTsKIAogICAgIC8vIHJlYWQgQiBmcm9tIHBhcmNlbAogICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24ocG9zKTsKLSAgICByaW5nQnVmZmVyQi5yZWFkRnJvbVBhcmNlbCgmcGFyY2VsKTsKKyAgICBSaW5nQnVmZmVyUGFyY2VsYWJsZSByaW5nQnVmZmVyQiA9IHJlYWRGcm9tUGFyY2VsPFJpbmdCdWZmZXJQYXJjZWxhYmxlPihwYXJjZWwpOwogCiAgICAgUmluZ0J1ZmZlckRlc2NyaXB0b3IgZGVzY3JpcHRvckI7CiAgICAgRVhQRUNUX0VRKEFBVURJT19PSywgcmluZ0J1ZmZlckIucmVzb2x2ZShzaGFyZWRNZW1vcmllcywgJmRlc2NyaXB0b3JCKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdG9wX2hhbmcuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RvcF9oYW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5N2I2Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9zdG9wX2hhbmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrCi0gKiBhbmQgdGhlbiBjbG9zZSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgotICovCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0jaW5jbHVkZSA8bXV0ZXg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aHJlYWQ+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+Ci0KLSNkZWZpbmUgRFVSQVRJT05fU0VDT05EUyAgIDUKLQotc3RydWN0IEF1ZGlvRW5naW5lIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICpidWlsZGVyID0gbnVsbHB0cjsKLSAgICBBQXVkaW9TdHJlYW0gICAgICAgICpzdHJlYW0gPSBudWxscHRyOwotICAgIHN0ZDo6dGhyZWFkICAgICAgICAgKnRocmVhZCA9IG51bGxwdHI7Ci0KLSAgICBzdGQ6OmF0b21pYzxib29sPiAgIHN0YXJ0ZWR7ZmFsc2V9OwotICAgIHN0ZDo6bXV0ZXggICAgICAgICAgZG9uZUxvY2s7IC8vIFVzZSBhIG11dGV4IHNvIHdlIGNhbiBzbGVlcCBvbiBpdCB3aGlsZSBqb2luKClpbmcuCi0gICAgc3RkOjphdG9taWM8Ym9vbD4gICBkb25le2ZhbHNlfTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBqb2luKCkgewotICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgYmxvY2sgaWYgdGhlIHRocmVhZCBpcyBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG11dGV4IGlzIHVzZWQgdG8gY2xvc2UoKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucwotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVmb3JlIHRoZSByZXF1ZXN0U3RvcCgpIGlzIGNhbGxlZC4KLSAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZG9uZUxvY2spOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaW50Zigiam9pbigpIGdvdCBtdXRleCBidXQgc3RyZWFtIG5vdCBkb25lISIpOwotICAgICAgICAgICAgICAgIHVzbGVlcCgxMCAqIDEwMDApOyAvLyBzbGVlcCB0aGVuIGNoZWNrIGFnYWluCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2Uoc3RyZWFtKTsKLSAgICAgICAgICAgIHN0cmVhbSA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19OwotCi0vLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgotc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAotICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgdm9pZCAqdXNlckRhdGEsCi0gICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKLSkgewotICAgICh2b2lkKSBzdHJlYW07Ci0gICAgKHZvaWQpIGF1ZGlvRGF0YTsKLSAgICAodm9pZCkgbnVtRnJhbWVzOwotICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZW5naW5lLT5kb25lTG9jayk7Ci0gICAgZW5naW5lLT5zdGFydGVkID0gdHJ1ZTsKLSAgICB1c2xlZXAoRFVSQVRJT05fU0VDT05EUyAqIDEwMDAgKiAxMDAwKTsgLy8gTWltaWMgU3ludGhNYXJrIHByb2NlZHVyZS4KLSAgICBlbmdpbmUtPmRvbmUgPSB0cnVlOwotICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7Ci19Ci0KLXN0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKLSAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKLSAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKLSAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKLSAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOwotfQotCi1zdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lKSB7Ci0gICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmVuZ2luZS0+YnVpbGRlcik7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcHJpbnRmKCJBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlciByZXR1cm5lZCAlcyIsCi0gICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGVuZ2luZS0+YnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIGVuZ2luZSk7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teUVycm9yQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOwotCi0gICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KLSAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oZW5naW5lLT5idWlsZGVyLCAmZW5naW5lLT5zdHJlYW0pOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgICh2b2lkKSBhcmdjOwotICAgICh2b2lkKSBhcmd2OwotICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBpbnQgZXJyb3JDb3VudCA9IDA7Ci0KLSAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCi0gICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KLSAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKLQotICAgIHByaW50ZigiVGVzdCBSZXR1cm4gU3RvcCBIYW5nIFYxLjBcbiIpOwotCi0gICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcHJpbnRmKCJzX09wZW5BdWRpb1N0cmVhbSByZXR1cm5lZCAlc1xuIiwKLSAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgotICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7Ci0gICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7Ci0gICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLCBkZXZpY2VJZCwgYWN0dWFsUGVyZk1vZGUpOwotCi0gICAgLy8gU3RhcnQgc3RyZWFtLgotICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZW5naW5lLnN0cmVhbSk7Ci0gICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBlcnJvckNvdW50Kys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGNvdW50ZXIgPSAwOwotICAgICAgICB3aGlsZSAoIWVuZ2luZS5zdGFydGVkKSB7Ci0gICAgICAgICAgICBwcmludGYoIldhaXRpbmcgZm9yIHN0cmVhbSB0byBzdGFydCwgJWRcbiIsIGNvdW50ZXIrKyk7Ci0gICAgICAgICAgICB1c2xlZXAoNSAqIDEwMDApOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgbW9yZSBtZXNzYWdlcyAlZCBzZWNvbmRzIGFmdGVyIHRoaXMuIElmIG5vdCB0aGVuIHRoZSB0ZXN0IGZhaWxlZCFcbiIsCi0gICAgICAgICAgICAgICBEVVJBVElPTl9TRUNPTkRTKTsKLSAgICAgICAgcmVzdWx0ID0gZW5naW5lLmpvaW4oKTsgLy8gVGhpcyBtaWdodCBoYW5nIQotICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShlbmdpbmUuYnVpbGRlcik7Ci0gICAgICAgIGVuZ2luZS5idWlsZGVyID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOwotCi0gICAgcmV0dXJuIGVycm9yQ291bnQgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF92YXJpb3VzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCmluZGV4IGEyMGM3OTkuLmNiZjg2M2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3ZhcmlvdXMuY3BwCkBAIC0zMyw2ICszMywxMSBAQAogICAgICAgICB2b2lkICphdWRpb0RhdGEsCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzCiApIHsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihzdHJlYW0pOworICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkgeworICAgICAgICByZXR1cm4gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9DT05USU5VRTsKKyAgICB9CisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgdG8gYWxsIHplcm9zLgogICAgIGludCBjaGFubmVscyA9IEFBdWRpb1N0cmVhbV9nZXRDaGFubmVsQ291bnQoc3RyZWFtKTsKICAgICBpbnQgbnVtU2FtcGxlcyA9IGNoYW5uZWxzICogbnVtRnJhbWVzOwogICAgIGJvb2wgYWxsWmVyb3MgPSB0cnVlOwpAQCAtNDgsNyArNTMsOCBAQAogY29uc3RleHByIGludDY0X3QgTkFOT1NfUEVSX01JTExJU0VDT05EID0gMTAwMCAqIDEwMDA7CiAKIHZvaWQgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCi0gICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGFhdWRpb0J1aWxkZXIgPSBudWxscHRyOwogICAgIEFBdWRpb1N0cmVhbSogYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKIApAQCAtNjEsNiArNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGFhdWRpb0J1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihhYXVkaW9CdWlsZGVyLCBkaXJlY3Rpb24pOwogICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KGFhdWRpb0J1aWxkZXIsIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKIAogICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCkBAIC04OCwxNCArOTUsMjggQEAKICAgICAvLyBXZSBzaG91bGQgTk9UIGJlIGFibGUgdG8gc3RhcnQgb3IgY2hhbmdlIGEgc3RyZWFtIGFmdGVyIGl0IGhhcyBiZWVuIHJlbGVhc2VkLgogICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HLCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtKSk7Ci0gICAgRVhQRUNUX0VRKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKGFhdWRpb1N0cmVhbSkpOworICAgIC8vIFBhdXNlIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIE9VVFBVVC4KKyAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CisgICAgICAgIEVYUEVDVF9FUShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSwKKyAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoYWF1ZGlvU3RyZWFtKSk7CisgICAgfQogICAgIEVYUEVDVF9FUShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcsIEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUsIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKICAgICBFWFBFQ1RfRVEoQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HLCBBQXVkaW9TdHJlYW1fZ2V0U3RhdGUoYWF1ZGlvU3RyZWFtKSk7CiAKICAgICAvLyBEb2VzIHRoaXMgY3Jhc2g/Ci0gICAgRVhQRUNUX0xUKDAsIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGFhdWRpb1N0cmVhbSkpOwotICAgIEVYUEVDVF9MVCgwLCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihhYXVkaW9TdHJlYW0pKTsKKyAgICBFWFBFQ1RfR1QoQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dUKEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGFhdWRpb1N0cmVhbSksIDApOworICAgIEVYUEVDVF9HVChBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dFKEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoYWF1ZGlvU3RyZWFtKSwgMCk7CisgICAgRVhQRUNUX0dUKEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGFhdWRpb1N0cmVhbSksIDApOworICAgIEVYUEVDVF9HVChBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKGFhdWRpb1N0cmVhbSksIDApOworCisgICAgaW50NjRfdCB0aW1lc3RhbXBGcmFtZXMgPSAwOworICAgIGludDY0X3QgdGltZXN0YW1wTmFub3MgPSAwOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKGFhdWRpb1N0cmVhbSwgQ0xPQ0tfTU9OT1RPTklDLAorICAgICAgICAgICAgJnRpbWVzdGFtcEZyYW1lcywgJnRpbWVzdGFtcE5hbm9zKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgfHwgcmVzdWx0ID09IEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEKTsKIAogICAgIC8vIFZlcmlmeSBDbG9zaW5nIFN0YXRlLiBEb2VzIHRoaXMgY3Jhc2g/CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlID0gQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOOwpAQCAtMTA3LDIwICsxMjgsNDIgQEAKICAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7CiB9CiAKLVRFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9ub25lKSB7CitURVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2Vfbm9uZV9vdXRwdXQpIHsKICAgICBjaGVja1JlbGVhc2VUaGVuQ2xvc2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwKLSAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKKyAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELAorICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOwogICAgIC8vIE5vIEVYQ0xVU0lWRSBzdHJlYW1zIHdpdGggTU9ERV9OT05FLgogfQogCi1URVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2VfbG93X3NoYXJlZCkgewotICAgIGNoZWNrUmVsZWFzZVRoZW5DbG9zZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwKLSAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9ub25lX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsCisgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCwKKyAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIC8vIE5vIEVYQ0xVU0lWRSBzdHJlYW1zIHdpdGggTU9ERV9OT05FLgogfQogCi1URVNUKHRlc3RfdmFyaW91cywgYWF1ZGlvX3JlbGVhc2VfY2xvc2VfbG93X2V4Y2x1c2l2ZSkgeworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19yZWxlYXNlX2Nsb3NlX2xvd19zaGFyZWRfb3V0cHV0KSB7CiAgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAotICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUpOworICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9sb3dfc2hhcmVkX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKK30KKworVEVTVCh0ZXN0X3ZhcmlvdXMsIGFhdWRpb19yZWxlYXNlX2Nsb3NlX2xvd19leGNsdXNpdmVfb3V0cHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX09VVFBVVCk7Cit9CisKK1RFU1QodGVzdF92YXJpb3VzLCBhYXVkaW9fcmVsZWFzZV9jbG9zZV9sb3dfZXhjbHVzaXZlX2lucHV0KSB7CisgICAgY2hlY2tSZWxlYXNlVGhlbkNsb3NlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUsCisgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKIH0KIAogZW51bSBGdW5jdGlvblRvQ2FsbCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BaWRsQ29udmVyc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxZTdmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FpZGxDb252ZXJzaW9uLmNwcApAQCAtMCwwICsxLDIzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFpZGxDb252ZXJzaW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibWVkaWEvQWlkbENvbnZlcnNpb24uaCIKKworI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWxpdGllcworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGJhc2U6OnVuZXhwZWN0ZWQ7CisKK25hbWVzcGFjZSB7CisKK2VudW0gY2xhc3MgRGlyZWN0aW9uIHsKKyAgICBJTlBVVCwgT1VUUFVUCit9OworCitDb252ZXJzaW9uUmVzdWx0PERpcmVjdGlvbj4gZGlyZWN0aW9uKG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6Tk9ORToKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6U0VTU0lPTjoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOgorICAgICAgICAgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6Tk9ORToKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gbXVzdCBiZSBsaXN0ZWQgIC1XZXJyb3IsLVdzd2l0Y2gKKyAgICAgICAgICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpTT1VSQ0U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb246OklOUFVUOworICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNJTks6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb246Ok9VVFBVVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpNSVg6CisgICAgICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpOT05FOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAorICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNJTks6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb246OklOUFVUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8RGlyZWN0aW9uPiBkaXJlY3Rpb24oYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9OT05FOgorICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OOgorICAgICAgICAgICAgYnJlYWs7ICAvLyBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAorICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6CisgICAgICAgICAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9OT05FOgorICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAorICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX1NPVVJDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6SU5QVVQ7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU0lOSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6T1VUUFVUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKKyAgICAgICAgICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9ST0xFX05PTkU6CisgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIG11c3QgYmUgbGlzdGVkICAtV2Vycm9yLC1Xc3dpdGNoCisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU09VUkNFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uOjpPVVRQVVQ7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU0lOSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbjo6SU5QVVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENvbnZlcnRlcnMKKworc3RhdHVzX3QgYWlkbDJsZWdhY3lfc3RyaW5nKHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCwgY2hhciogZGVzdCwgc2l6ZV90IG1heFNpemUpIHsKKyAgICBpZiAoYWlkbC5zaXplKCkgPiBtYXhTaXplIC0gMSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhaWRsLmNvcHkoZGVzdCwgYWlkbC5zaXplKCkpOworICAgIGRlc3RbYWlkbC5zaXplKCldID0gJ1wwJzsKKyAgICByZXR1cm4gT0s7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpzdHJpbmc+IGxlZ2FjeTJhaWRsX3N0cmluZyhjb25zdCBjaGFyKiBsZWdhY3ksIHNpemVfdCBtYXhTaXplKSB7CisgICAgaWYgKGxlZ2FjeSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGlmIChzdHJubGVuKGxlZ2FjeSwgbWF4U2l6ZSkgPT0gbWF4U2l6ZSkgeworICAgICAgICAvLyBObyBudWxsLXRlcm1pbmF0b3IuCisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZyhsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZHVsZV9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19tb2R1bGVfaGFuZGxlX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9faGFuZGxlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19pb19oYW5kbGVfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChhdWRpb19pb19oYW5kbGVfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fcG9ydF9oYW5kbGVfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX3BvcnRfaGFuZGxlX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BhdGNoX2hhbmRsZV90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX2hhbmRsZV90X2ludDMyX3QoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VuaXF1ZV9pZF90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3VuaXF1ZV9pZF90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fdW5pcXVlX2lkX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QoYXVkaW9fdW5pcXVlX2lkX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19od19zeW5jX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19od19zeW5jX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2h3X3N5bmNfdF9pbnQzMl90KGF1ZGlvX2h3X3N5bmNfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8cGlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxwaWRfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWRfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8dWlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDx1aWRfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWRfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nMTY+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCkgeworICAgIHJldHVybiBTdHJpbmcxNihhaWRsLmRhdGEoKSwgYWlkbC5zaXplKCkpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIGxlZ2FjeSkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZyhTdHJpbmc4KGxlZ2FjeSkuY19zdHIoKSk7Cit9CisKKy8vIFRPRE8gYi8xODIzOTI3Njk6IGNyZWF0ZSBhbiBvcHRpb25hbCAtPiBvcHRpb25hbCB1dGlsCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+PgorYWlkbDJsZWdhY3lfb3B0aW9uYWxfc3RyaW5nX3ZpZXdfb3B0aW9uYWxfU3RyaW5nMTYoc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZ192aWV3PiBhaWRsKSB7CisgICAgaWYgKCFhaWRsLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIENvbnZlcnNpb25SZXN1bHQ8U3RyaW5nMTY+IGNvbnZlcnNpb24gPQorICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nMTYoYWlkbC52YWx1ZSgpKSk7CisgICAgcmV0dXJuIGNvbnZlcnNpb24udmFsdWUoKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nX3ZpZXc+PgorbGVnYWN5MmFpZGxfb3B0aW9uYWxfU3RyaW5nMTZfb3B0aW9uYWxfc3RyaW5nKHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+IGxlZ2FjeSkgeworICBpZiAoIWxlZ2FjeS5oYXNfdmFsdWUoKSkgeworICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgIH0KKyAgQ29udmVyc2lvblJlc3VsdDxzdGQ6OnN0cmluZz4gY29udmVyc2lvbiA9CisgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKGxlZ2FjeS52YWx1ZSgpKSk7CisgIHJldHVybiBjb252ZXJzaW9uLnZhbHVlKCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nOD4gYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChzdGQ6OnN0cmluZ192aWV3IGFpZGwpIHsKKyAgICByZXR1cm4gU3RyaW5nOChhaWRsLmRhdGEoKSwgYWlkbC5zaXplKCkpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmc4X3N0cmluZyhjb25zdCBTdHJpbmc4JiBsZWdhY3kpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcobGVnYWN5LmNfc3RyKCkpOworfQorCisvLyBUaGUgbGVnYWN5IGVudW0gaXMgdW5uYW1lZC4gVGh1cywgd2UgdXNlIGludDMyX3QuCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1R5cGVfaW50MzJfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpTQU1QTEVfUkFURToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6R0FJTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworLy8gVGhlIGxlZ2FjeSBlbnVtIGlzIHVubmFtZWQuIFRodXMsIHdlIHVzZSBpbnQzMl90LgorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4gbGVnYWN5MmFpZGxfaW50MzJfdF9BdWRpb1BvcnRDb25maWdUeXBlKAorICAgICAgICBpbnQzMl90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OlNBTVBMRV9SQVRFOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Q0hBTk5FTF9NQVNLOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6Rk9STUFUOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfQ09ORklHX0dBSU46CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkdBSU47CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9DT05GSUdfRkxBR1M6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZMQUdTOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHVuc2lnbmVkIGludD4gYWlkbDJsZWdhY3lfaW50MzJfdF9jb25maWdfbWFzayhpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dW5zaWduZWQgaW50LCBpbnQzMl90LCBpbnQsIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPigKKyAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1R5cGVfaW50MzJfdCwKKyAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZ1R5cGUgZW51bSBpcyBpbmRleC1iYXNlZC4KKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlPiwKKyAgICAgICAgICAgIC8vIEFVRElPX1BPUlRfQ09ORklHXyogZmxhZ3MgYXJlIG1hc2stYmFzZWQuCisgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8dW5zaWduZWQgaW50LCBpbnQ+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KHVuc2lnbmVkIGludCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgdW5zaWduZWQgaW50LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZSwgaW50PigKKyAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfaW50MzJfdF9BdWRpb1BvcnRDb25maWdUeXBlLAorICAgICAgICAgICAgLy8gQVVESU9fUE9SVF9DT05GSUdfKiBmbGFncyBhcmUgbWFzay1iYXNlZC4KKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8dW5zaWduZWQ+LAorICAgICAgICAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnVHlwZSBlbnVtIGlzIGluZGV4LWJhc2VkLgorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZT4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGludDMyX3QgYWlkbCkgeworICAgIC8vIFRPRE8oeXRhaSk6IHNob3VsZCB3ZSBjb252ZXJ0IGJpdC1ieS1iaXQ/CisgICAgLy8gT25lIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSByZXByZXNlbnRhdGlvbiBpcyBib3RoIG9wYXF1ZSBhbmQgaXMgZGlmZmVyZW50IGJhc2VkIG9uIHRoZQorICAgIC8vIGNvbnRleHQgKGlucHV0IHZzLiBvdXRwdXQpLiBDYW4gZGV0ZXJtaW5lIGJhc2VkIG9uIHR5cGUgYW5kIHJvbGUsIGFzIHBlciB1c2VJbkNoYW5uZWxNYXNrKCkuCisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19jaGFubmVsX21hc2tfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChhdWRpb19jaGFubmVsX21hc2tfdCBsZWdhY3kpIHsKKyAgICAvLyBUT0RPKHl0YWkpOiBzaG91bGQgd2UgY29udmVydCBiaXQtYnktYml0PworICAgIC8vIE9uZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVwcmVzZW50YXRpb24gaXMgYm90aCBvcGFxdWUgYW5kIGlzIGRpZmZlcmVudCBiYXNlZCBvbiB0aGUKKyAgICAvLyBjb250ZXh0IChpbnB1dCB2cy4gb3V0cHV0KS4gQ2FuIGRldGVybWluZSBiYXNlZCBvbiB0eXBlIGFuZCByb2xlLCBhcyBwZXIgdXNlSW5DaGFubmVsTWFzaygpLgorICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19jb25maWdfZXZlbnQ+IGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoCisgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9SRUdJU1RFUkVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9PUEVORUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX09QRU5FRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpPVVRQVVRfQ0xPU0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9DTE9TRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9SRUdJU1RFUkVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX1JFR0lTVEVSRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6SU5QVVRfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX09QRU5FRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50OjpJTlBVVF9DTE9TRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfQ0xPU0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OkNMSUVOVF9TVEFSVEVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NMSUVOVF9TVEFSVEVEOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2NvbmZpZ19ldmVudF9BdWRpb0lvQ29uZmlnRXZlbnQoCisgICAgICAgIGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9SRUdJU1RFUkVEOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6T1VUUFVUX09QRU5FRDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9DTE9TRUQ7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX1JFR0lTVEVSRUQ7CisgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX09QRU5FRDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW9Db25maWdFdmVudDo6SU5QVVRfQ0xPU0VEOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OklOUFVUX0NPTkZJR19DSEFOR0VEOworICAgICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQ6OkNMSUVOVF9TVEFSVEVEOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfcm9sZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Um9sZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9ST0xFX05PTkU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpTSU5LOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfUk9MRV9TSU5LOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRSb2xlPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKAorICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9OT05FOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvcnRSb2xlOjpOT05FOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFJvbGU6OlNPVVJDRTsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU0lOSzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U0lOSzsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3R5cGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpOT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfVFlQRV9OT05FOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0U6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6TUlYOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OlNFU1NJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9UWVBFX1NFU1NJT047CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUoCisgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6REVWSUNFOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfU0VTU0lPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6U0VTU0lPTjsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4gYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoCisgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhaWRsKSB7CisgICAgLy8gVGhpcyByZWxpZXMgb24gQXVkaW9Gb3JtYXQgYmVpbmcga2VwdCBpbiBzeW5jIHdpdGggYXVkaW9fZm9ybWF0X3QuCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KSA9PSBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSkgeworICAgIC8vIFRoaXMgcmVsaWVzIG9uIEF1ZGlvRm9ybWF0IGJlaW5nIGtlcHQgaW4gc3luYyB3aXRoIGF1ZGlvX2Zvcm1hdF90LgorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCkgPT0gc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4obGVnYWN5KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdChtZWRpYTo6QXVkaW9HYWluTW9kZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkpPSU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9KT0lOVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Q0hBTk5FTFM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpSQU1QOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0dBSU5fTU9ERV9SQU1QOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Nb2RlPiBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9BdWRpb0dhaW5Nb2RlKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fR0FJTl9NT0RFX0pPSU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpKT0lOVDsKKyAgICAgICAgY2FzZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvR2Fpbk1vZGU6OkNIQU5ORUxTOworICAgICAgICBjYXNlIEFVRElPX0dBSU5fTU9ERV9SQU1QOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0dhaW5Nb2RlOjpSQU1QOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fbW9kZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGF1ZGlvX2dhaW5fbW9kZV90LCBpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9HYWluTW9kZV9hdWRpb19nYWluX21vZGVfdCwKKyAgICAgICAgICAgIC8vIEF1ZGlvR2Fpbk1vZGUgaXMgaW5kZXgtYmFzZWQuCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9HYWluTW9kZT4sCisgICAgICAgICAgICAvLyBBVURJT19HQUlOX01PREVfKiBjb25zdGFudHMgYXJlIG1hc2stYmFzZWQuCisgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8YXVkaW9fZ2Fpbl9tb2RlX3QsIGF1ZGlvX2dhaW5fbW9kZV90Pik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKGF1ZGlvX2dhaW5fbW9kZV90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCBhdWRpb19nYWluX21vZGVfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGUsIGF1ZGlvX2dhaW5fbW9kZV90PigKKyAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfQXVkaW9HYWluTW9kZSwKKyAgICAgICAgICAgIC8vIEFVRElPX0dBSU5fTU9ERV8qIGNvbnN0YW50cyBhcmUgbWFzay1iYXNlZC4KKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9fZ2Fpbl9tb2RlX3Q+LAorICAgICAgICAgICAgLy8gQXVkaW9HYWluTW9kZSBpcyBpbmRleC1iYXNlZC4KKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvR2Fpbk1vZGU+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19kZXZpY2VzX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGludDMyX3QgYWlkbCkgeworICAgIC8vIFRPRE8oeXRhaSk6IGJpdGZpZWxkPworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fZGV2aWNlc190PihhaWRsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChhdWRpb19kZXZpY2VzX3QgbGVnYWN5KSB7CisgICAgLy8gVE9ETyh5dGFpKTogYml0ZmllbGQ/CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2dhaW5fY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0dhaW5Db25maWcmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUsIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGUpIHsKKyAgICBhdWRpb19nYWluX2NvbmZpZyBsZWdhY3k7CisgICAgbGVnYWN5LmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGFpZGwuaW5kZXgpKTsKKyAgICBsZWdhY3kubW9kZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2dhaW5fbW9kZV90X21hc2soYWlkbC5tb2RlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gVkFMVUVfT1JfUkVUVVJOKGRpcmVjdGlvbihyb2xlLCB0eXBlKSkgPT0gRGlyZWN0aW9uOjpJTlBVVDsKKyAgICBjb25zdCBib29sIGlzSm9pbnQgPSBiaXRtYXNrSXNTZXQoYWlkbC5tb2RlLCBtZWRpYTo6QXVkaW9HYWluTW9kZTo6Sk9JTlQpOworICAgIHNpemVfdCBudW1WYWx1ZXMgPSBpc0pvaW50ID8gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaXNJbnB1dCA/IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGxlZ2FjeS5jaGFubmVsX21hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGxlZ2FjeS5jaGFubmVsX21hc2spOworICAgIGlmIChhaWRsLnZhbHVlcy5zaXplKCkgIT0gbnVtVmFsdWVzIHx8IGFpZGwudmFsdWVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kudmFsdWVzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgIGxlZ2FjeS52YWx1ZXNbaV0gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC52YWx1ZXNbaV0pKTsKKyAgICB9CisgICAgbGVnYWN5LnJhbXBfZHVyYXRpb25fbXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5yYW1wRHVyYXRpb25NcykpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2FpbkNvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKAorICAgICAgICBjb25zdCBhdWRpb19nYWluX2NvbmZpZyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7CisgICAgbWVkaWE6OkF1ZGlvR2FpbkNvbmZpZyBhaWRsOworICAgIGFpZGwuaW5kZXggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5pbmRleCkpOworICAgIGFpZGwubW9kZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobGVnYWN5Lm1vZGUpKTsKKyAgICBhaWRsLmNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS5jaGFubmVsX21hc2spKTsKKyAgICBjb25zdCBib29sIGlzSW5wdXQgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKSA9PSBEaXJlY3Rpb246OklOUFVUOworICAgIGNvbnN0IGJvb2wgaXNKb2ludCA9IChsZWdhY3kubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgIT0gMDsKKyAgICBzaXplX3QgbnVtVmFsdWVzID0gaXNKb2ludCA/IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzSW5wdXQgPyBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhsZWdhY3kuY2hhbm5lbF9tYXNrKTsKKyAgICBhaWRsLnZhbHVlcy5yZXNpemUobnVtVmFsdWVzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVZhbHVlczsgKytpKSB7CisgICAgICAgIGFpZGwudmFsdWVzW2ldID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudmFsdWVzW2ldKSk7CisgICAgfQorICAgIGFpZGwucmFtcER1cmF0aW9uTXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5yYW1wX2R1cmF0aW9uX21zKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkZBU1Q6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19GQVNUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OkhXX0hPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlJBVzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19JTlBVVF9GTEFHX1JBVzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpTWU5DOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfU1lOQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpNTUFQX05PSVJROgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpWT0lQX1RYOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfVk9JUF9UWDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpIV19BVl9TWU5DOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fSU5QVVRfRkxBR19ESVJFQ1Q7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9BdWRpb0lucHV0RmxhZ3MoCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX05PTkU6CisgICAgICAgICAgICBicmVhazsgLy8gc2hvdWxkbid0IGdldCBoZXJlLiBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfRkFTVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpGQVNUOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpIV19IT1RXT1JEOworICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0ZMQUdfUkFXOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M6OlJBVzsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6U1lOQzsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlE6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6TU1BUF9OT0lSUTsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFg6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6Vk9JUF9UWDsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvSW5wdXRGbGFnczo6SFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9GTEFHX0RJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9JbnB1dEZsYWdzOjpESVJFQ1Q7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UFJJTUFSWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpGQVNUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0ZBU1Q7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkRFRVBfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpDT01QUkVTU19PRkZMT0FEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OkhXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6VFRTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1RUUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX1JBVzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6U1lOQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19TWU5DOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU86CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpESVJFQ1RfUENNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ007CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok1NQVBfTk9JUlE6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Vk9JUF9SWDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJTkNBTExfTVVTSUM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb091dHB1dEZsYWdzPiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9BdWRpb091dHB1dEZsYWdzKAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX05PTkU6CisgICAgICAgICAgICBicmVhazsgLy8gc2hvdWxkbid0IGdldCBoZXJlLiBtdXN0IGJlIGxpc3RlZCAgLVdlcnJvciwtV3N3aXRjaAorICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlBSSU1BUlk7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RkFTVDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6REVFUF9CVUZGRVI7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6Q09NUFJFU1NfT0ZGTE9BRDsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkc6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6Ok5PTl9CTE9DS0lORzsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpIV19BVl9TWU5DOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1RUUzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6VFRTOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1JBVzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6UkFXOworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlNZTkM7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJRUM5NThfTk9OQVVESU87CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9PdXRwdXRGbGFnczo6RElSRUNUX1BDTTsKKyAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJROgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpNTUFQX05PSVJROworICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlg6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M6OlZPSVBfUlg7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpJTkNBTExfTVVTSUM7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzOjpHQVBMRVNTX09GRkxPQUQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCisgICAgICAgIGludDMyX3QgYWlkbCkgeworICAgIHVzaW5nIExlZ2FjeU1hc2sgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OworCisgICAgTGVnYWN5TWFzayBjb252ZXJ0ZWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAoY29udmVydEJpdG1hc2s8TGVnYWN5TWFzaywgaW50MzJfdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCwgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncz4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvSW5wdXRGbGFnc19hdWRpb19pbnB1dF9mbGFnc190LAorICAgICAgICAgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9JbnB1dEZsYWdzPiwKKyAgICAgICAgICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPExlZ2FjeU1hc2ssIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KSkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190Pihjb252ZXJ0ZWQpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSkgeworICAgIHVzaW5nIExlZ2FjeU1hc2sgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+OworCisgICAgTGVnYWN5TWFzayBsZWdhY3lNYXNrID0gc3RhdGljX2Nhc3Q8TGVnYWN5TWFzaz4obGVnYWN5KTsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgbWVkaWE6OkF1ZGlvSW5wdXRGbGFncywgYXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBsZWdhY3lNYXNrLCBsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X0F1ZGlvSW5wdXRGbGFncywKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9faW5wdXRfZmxhZ3NfdD4sCisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PGludDMyX3QsIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9tYXNrKAorICAgICAgICBpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8YXVkaW9fb3V0cHV0X2ZsYWdzX3QsCisgICAgICAgICAgICBpbnQzMl90LAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QsCisgICAgICAgICAgICBtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4oCisgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb091dHB1dEZsYWdzX2F1ZGlvX291dHB1dF9mbGFnc190LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+LAorICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPGF1ZGlvX291dHB1dF9mbGFnc190LCBhdWRpb19vdXRwdXRfZmxhZ3NfdD4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzaygKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KSB7CisgICAgdXNpbmcgTGVnYWN5TWFzayA9IHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+OworCisgICAgTGVnYWN5TWFzayBsZWdhY3lNYXNrID0gc3RhdGljX2Nhc3Q8TGVnYWN5TWFzaz4obGVnYWN5KTsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwgTGVnYWN5TWFzaywgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3MsIGF1ZGlvX291dHB1dF9mbGFnc190PigKKyAgICAgICAgICAgIGxlZ2FjeU1hc2ssIGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X0F1ZGlvT3V0cHV0RmxhZ3MsCisgICAgICAgICAgICBpbmRleFRvRW51bV9iaXRtYXNrPGF1ZGlvX291dHB1dF9mbGFnc190PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvT3V0cHV0RmxhZ3M+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19mbGFncz4gYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0ZsYWdzJiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgYXVkaW9faW9fZmxhZ3MgbGVnYWN5OworICAgIERpcmVjdGlvbiBkaXIgPSBWQUxVRV9PUl9SRVRVUk4oZGlyZWN0aW9uKHJvbGUsIHR5cGUpKTsKKyAgICBzd2l0Y2ggKGRpcikgeworICAgICAgICBjYXNlIERpcmVjdGlvbjo6SU5QVVQ6IHsKKyAgICAgICAgICAgIGxlZ2FjeS5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBpbnB1dCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRGlyZWN0aW9uOjpPVVRQVVQ6IHsKKyAgICAgICAgICAgIGxlZ2FjeS5vdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG91dHB1dCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvSW9GbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKAorICAgICAgICBjb25zdCBhdWRpb19pb19mbGFncyYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlKSB7CisgICAgbWVkaWE6OkF1ZGlvSW9GbGFncyBhaWRsOworCisgICAgRGlyZWN0aW9uIGRpciA9IFZBTFVFX09SX1JFVFVSTihkaXJlY3Rpb24ocm9sZSwgdHlwZSkpOworICAgIHN3aXRjaCAoZGlyKSB7CisgICAgICAgIGNhc2UgRGlyZWN0aW9uOjpJTlBVVDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuaW5wdXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEaXJlY3Rpb246Ok9VVFBVVDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5vdXRwdXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0JiBhaWRsKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dCBsZWdhY3k7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC50eXBlKSk7CisgICAgUkVUVVJOX0lGX0VSUk9SKGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmFkZHJlc3MsIGxlZ2FjeS5hZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dF9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHQmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdEZXZpY2VFeHQgYWlkbDsKKyAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5LmFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdHJlYW1fdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6REVGQVVMVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpWT0lDRV9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlNZU1RFTToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJJTkc6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BTEFSTTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpOT1RJRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpCTFVFVE9PVEhfU0NPOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkVORk9SQ0VEX0FVRElCTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RFRNRjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpUVFM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1RUUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQVNTSVNUQU5UOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlJFUk9VVElORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUkVST1VUSU5HOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlBBVENIOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fREVGQVVMVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpERUZBVUxUOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlZPSUNFX0NBTEw7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpTWVNURU07CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6UklORzsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6TVVTSUM7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFMQVJNOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6Tk9USUZJQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkJMVUVUT09USF9TQ087CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6RU5GT1JDRURfQVVESUJMRTsKKyAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpEVE1GOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZTo6VFRTOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OkFDQ0VTU0lCSUxJVFk7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpBU1NJU1RBTlQ7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JFUk9VVElORzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpSRVJPVVRJTkc7CisgICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1BBVENIOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGU6OlBBVENIOworICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9DQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlOjpDQUxMX0FTU0lTVEFOVDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zb3VyY2VfdD4gYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpJTlZBTElEOgorICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBoYXZlIGFuIGVudW0KKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpERUZBVUxUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9ERUZBVUxUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6Ok1JQzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfTUlDOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1VQTElOSzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX0RPV05MSU5LOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkNBTUNPUkRFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1JFQ09HTklUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlJFTU9URV9TVUJNSVg6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6VU5QUk9DRVNTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpFQ0hPX1JFRkVSRU5DRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Rk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0ZNX1RVTkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkhPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU09VUkNFX0hPVFdPUkQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU291cmNlVHlwZT4gbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9JTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OklOVkFMSUQ7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6REVGQVVMVDsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6Ok1JQzsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OlZPSUNFX1VQTElOSzsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfRE9XTkxJTks7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ0FMTDsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkNBTUNPUkRFUjsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpSRU1PVEVfU1VCTUlYOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpVTlBST0NFU1NFRDsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU291cmNlVHlwZTo6Vk9JQ0VfUEVSRk9STUFOQ0U7CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU6OkVDSE9fUkVGRVJFTkNFOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpGTV9UVU5FUjsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlOjpIT1RXT1JEOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Nlc3Npb25fdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxhdWRpb19zZXNzaW9uX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGF1ZGlvX3Nlc3Npb25fdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKKy8vIFRoaXMgdHlwZSBpcyB1bm5hbWVkIGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLCB0aHVzIHdlIG5hbWUgaXQgaGVyZS4KK3VzaW5nIGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZSA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZT4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UmIGFpZGwsIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGUpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0X3VzZWNhc2UgbGVnYWN5OworCisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFJvbGU6Ok5PTkU6CisgICAgICAgICAgICAvLyBKdXN0IHZlcmlmeSB0aGF0IHRoZSB1bmlvbiBpcyBlbXB0eS4KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgdW5zcGVjaWZpZWQpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U09VUkNFOgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBidWcuIEEgU09VUkNFIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHN0cmVhbSBmaWVsZC4KKyAgICAgICAgICAgIGxlZ2FjeS5zdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc3RyZWFtKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0Um9sZTo6U0lOSzoKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgYnVnLiBBIFNJTksgcm9sZSBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGZpZWxkLgorICAgICAgICAgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgc291cmNlKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUwoIlNob3VsZG4ndCBnZXQgaGVyZSIpOyAvLyB3aXRoIC1XZXJyb3IsLVdzd2l0Y2ggbWF5IGNvbXBpbGUtdGltZSBmYWlsCit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2U+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHRfdXNlY2FzZSYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UgYWlkbDsKKworICAgIHN3aXRjaCAocm9sZSkgeworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9OT05FOgorICAgICAgICAgICAgVU5JT05fU0VUKGFpZGwsIHVuc3BlY2lmaWVkLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1JPTEVfU09VUkNFOgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBidWcuIEEgU09VUkNFIHJvbGUgY29ycmVzcG9uZHMgdG8gdGhlIHN0cmVhbSBmaWVsZC4KKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzdHJlYW0sIFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUobGVnYWN5LnN0cmVhbSkpKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfUk9MRV9TSU5LOgorICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBidWcuIEEgU0lOSyByb2xlIGNvcnJlc3BvbmRzIHRvIHRoZSBzb3VyY2UgZmllbGQuCisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQgbGVnYWN5OworICAgIGxlZ2FjeS5od19tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QoYWlkbC5od01vZHVsZSkpOworICAgIGxlZ2FjeS5oYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChhaWRsLmhhbmRsZSkpOworICAgIGxlZ2FjeS51c2VjYXNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UoYWlkbC51c2VjYXNlLCByb2xlKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnTWl4RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdNaXhFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQgYWlkbDsKKyAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLmhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5oYW5kbGUpKTsKKyAgICBhaWRsLnVzZWNhc2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZShsZWdhY3kudXNlY2FzZSwgcm9sZSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCBsZWdhY3k7CisgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX3Nlc3Npb25fZXh0JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCBhaWRsOworICAgIGFpZGwuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChsZWdhY3kuc2Vzc2lvbikpOworICAgIHJldHVybiBhaWRsOworfQorCisvLyBUaGlzIHR5cGUgaXMgdW5uYW1lZCBpbiB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiwgdGh1cyB3ZSBuYW1lIGl0IGhlcmUuCit1c2luZyBhdWRpb19wb3J0X2NvbmZpZ19leHQgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZzo6ZXh0KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0V4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSkgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnX2V4dCBsZWdhY3k7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok5PTkU6CisgICAgICAgICAgICAvLyBKdXN0IHZlcmlmeSB0aGF0IHRoZSB1bmlvbiBpcyBlbXB0eS4KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgdW5zcGVjaWZpZWQpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6OkRFVklDRToKKyAgICAgICAgICAgIGxlZ2FjeS5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIGxlZ2FjeS5taXggPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dChWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIG1peCkpLCByb2xlKSk7CisgICAgICAgICAgICByZXR1cm4gbGVnYWN5OworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpTRVNTSU9OOgorICAgICAgICAgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzZXNzaW9uKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnX2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0V4dCBhaWRsOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZGV2aWNlKSkpOworICAgICAgICAgICAgcmV0dXJuIGFpZGw7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBtaXgsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dChsZWdhY3kubWl4LCByb2xlKSkpOworICAgICAgICAgICAgcmV0dXJuIGFpZGw7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX1NFU1NJT046CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnPiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBsZWdhY3k7CisgICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLmlkKSk7CisgICAgbGVnYWN5LnJvbGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdChhaWRsLnJvbGUpKTsKKyAgICBsZWdhY3kudHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KGFpZGwudHlwZSkpOworICAgIGxlZ2FjeS5jb25maWdfbWFzayA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2NvbmZpZ19tYXNrKGFpZGwuY29uZmlnTWFzaykpOworICAgIGlmIChiaXRtYXNrSXNTZXQoYWlkbC5jb25maWdNYXNrLCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZTo6U0FNUExFX1JBVEUpKSB7CisgICAgICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLnNhbXBsZVJhdGUpKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpDSEFOTkVMX01BU0spKSB7CisgICAgICAgIGxlZ2FjeS5jaGFubmVsX21hc2sgPQorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpGT1JNQVQpKSB7CisgICAgICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICB9CisgICAgaWYgKGJpdG1hc2tJc1NldChhaWRsLmNvbmZpZ01hc2ssIG1lZGlhOjpBdWRpb1BvcnRDb25maWdUeXBlOjpHQUlOKSkgeworICAgICAgICBsZWdhY3kuZ2FpbiA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0dhaW5Db25maWdfYXVkaW9fZ2Fpbl9jb25maWcoYWlkbC5nYWluLCBhaWRsLnJvbGUsIGFpZGwudHlwZSkpOworICAgIH0KKyAgICBpZiAoYml0bWFza0lzU2V0KGFpZGwuY29uZmlnTWFzaywgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU6OkZMQUdTKSkgeworICAgICAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Jb0ZsYWdzX2F1ZGlvX2lvX2ZsYWdzKGFpZGwuZmxhZ3MsIGFpZGwucm9sZSwgYWlkbC50eXBlKSk7CisgICAgfQorICAgIGxlZ2FjeS5leHQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnRXh0KGFpZGwuZXh0LCBhaWRsLnR5cGUsIGFpZGwucm9sZSkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBhaWRsOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOworICAgIGFpZGwucm9sZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKGxlZ2FjeS5yb2xlKSk7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLmNvbmZpZ01hc2sgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfY29uZmlnX21hc2tfaW50MzJfdChsZWdhY3kuY29uZmlnX21hc2spKTsKKyAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKKyAgICAgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICB9CisgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBhaWRsLmNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgfQorICAgIGlmIChsZWdhY3kuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIH0KKyAgICBpZiAobGVnYWN5LmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgeworICAgICAgICBhaWRsLmdhaW4gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9jb25maWdfQXVkaW9HYWluQ29uZmlnKAorICAgICAgICAgICAgICAgIGxlZ2FjeS5nYWluLCBsZWdhY3kucm9sZSwgbGVnYWN5LnR5cGUpKTsKKyAgICB9CisgICAgaWYgKGxlZ2FjeS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9fZmxhZ3NfQXVkaW9Jb0ZsYWdzKGxlZ2FjeS5mbGFncywgbGVnYWN5LnJvbGUsIGxlZ2FjeS50eXBlKSk7CisgICAgfQorICAgIGFpZGwuZXh0ID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb1BvcnRDb25maWdFeHQobGVnYWN5LmV4dCwgbGVnYWN5LnR5cGUsIGxlZ2FjeS5yb2xlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RydWN0IGF1ZGlvX3BhdGNoPiBhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9QYXRjaCYgYWlkbCkgeworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBsZWdhY3k7CisgICAgbGVnYWN5LmlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcGF0Y2hfaGFuZGxlX3QoYWlkbC5pZCkpOworICAgIGxlZ2FjeS5udW1fc2lua3MgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5zaW5rcy5zaXplKCkpKTsKKyAgICBpZiAobGVnYWN5Lm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlZ2FjeS5udW1fc2lua3M7ICsraSkgeworICAgICAgICBsZWdhY3kuc2lua3NbaV0gPQorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5zaW5rc1tpXSkpOworICAgIH0KKyAgICBsZWdhY3kubnVtX3NvdXJjZXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oYWlkbC5zb3VyY2VzLnNpemUoKSkpOworICAgIGlmIChsZWdhY3kubnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZWdhY3kubnVtX3NvdXJjZXM7ICsraSkgeworICAgICAgICBsZWdhY3kuc291cmNlc1tpXSA9CisgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ19hdWRpb19wb3J0X2NvbmZpZyhhaWRsLnNvdXJjZXNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9QYXRjaD4gbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfQXVkaW9QYXRjaCgKKyAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9QYXRjaCBhaWRsOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChsZWdhY3kuaWQpKTsKKworICAgIGlmIChsZWdhY3kubnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVnYWN5Lm51bV9zaW5rczsgKytpKSB7CisgICAgICAgIGFpZGwuc2lua3MucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcobGVnYWN5LnNpbmtzW2ldKSkpOworICAgIH0KKyAgICBpZiAobGVnYWN5Lm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbGVnYWN5Lm51bV9zb3VyY2VzOyArK2kpIHsKKyAgICAgICAgYWlkbC5zb3VyY2VzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKGxlZ2FjeS5zb3VyY2VzW2ldKSkpOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpIHsKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5KG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpKTsKKyAgICBsZWdhY3ktPm1Jb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwuaW9IYW5kbGUpKTsKKyAgICBsZWdhY3ktPm1QYXRjaCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKGFpZGwucGF0Y2gpKTsKKyAgICBsZWdhY3ktPm1TYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnNhbXBsaW5nUmF0ZSkpOworICAgIGxlZ2FjeS0+bUZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOworICAgIGxlZ2FjeS0+bUNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGFpZGwuY2hhbm5lbE1hc2spKTsKKyAgICBsZWdhY3ktPm1GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS0+bUZyYW1lQ291bnRIQUwgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50SEFMKSk7CisgICAgbGVnYWN5LT5tTGF0ZW5jeSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwubGF0ZW5jeSkpOworICAgIGxlZ2FjeS0+bVBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yIGFpZGw7CisgICAgYWlkbC5pb0hhbmRsZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bUlvSGFuZGxlKSk7CisgICAgYWlkbC5wYXRjaCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKGxlZ2FjeS0+bVBhdGNoKSk7CisgICAgYWlkbC5zYW1wbGluZ1JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS0+bVNhbXBsaW5nUmF0ZSkpOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS0+bUZvcm1hdCkpOworICAgIGFpZGwuY2hhbm5lbE1hc2sgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jaGFubmVsX21hc2tfdF9pbnQzMl90KGxlZ2FjeS0+bUNoYW5uZWxNYXNrKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50KSk7CisgICAgYWlkbC5mcmFtZUNvdW50SEFMID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihsZWdhY3ktPm1GcmFtZUNvdW50SEFMKSk7CisgICAgYWlkbC5sYXRlbmN5ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3ktPm1MYXRlbmN5KSk7CisgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS0+bVBvcnRJZCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQ2xpZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0NsaWVudF9BdWRpb0NsaWVudCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ2xpZW50JiBhaWRsKSB7CisgICAgQXVkaW9DbGllbnQgbGVnYWN5OworICAgIGxlZ2FjeS5jbGllbnRUaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhaWRsLmNsaWVudFRpZCkpOworICAgIGxlZ2FjeS5hdHRyaWJ1dGlvblNvdXJjZSA9IGFpZGwuYXR0cmlidXRpb25Tb3VyY2U7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9DbGllbnQ+IGxlZ2FjeTJhaWRsX0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KAorICAgICAgICBjb25zdCBBdWRpb0NsaWVudCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvQ2xpZW50IGFpZGw7CisgICAgYWlkbC5jbGllbnRUaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChsZWdhY3kuY2xpZW50VGlkKSk7CisgICAgYWlkbC5hdHRyaWJ1dGlvblNvdXJjZSA9IGxlZ2FjeS5hdHRyaWJ1dGlvblNvdXJjZTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb250ZW50X3R5cGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvQ29udGVudFR5cGVfYXVkaW9fY29udGVudF90eXBlX3QobWVkaWE6OkF1ZGlvQ29udGVudFR5cGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpTUEVFQ0g6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TVVTSUM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpNT1ZJRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfTU9WSUU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlNPTklGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlPgorbGVnYWN5MmFpZGxfYXVkaW9fY29udGVudF90eXBlX3RfQXVkaW9Db250ZW50VHlwZShhdWRpb19jb250ZW50X3R5cGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0NvbnRlbnRUeXBlOjpVTktOT1dOOworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6OlNQRUVDSDsKKyAgICAgICAgY2FzZSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvQ29udGVudFR5cGU6Ok1VU0lDOworICAgICAgICBjYXNlIEFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6TU9WSUU7CisgICAgICAgIGNhc2UgQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Db250ZW50VHlwZTo6U09OSUZJQ0FUSU9OOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3VzYWdlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QobWVkaWE6OkF1ZGlvVXNhZ2UgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1VOS05PV047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok1FRElBOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX01FRElBOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFMQVJNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FMQVJNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpHQU1FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0dBTUU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfQVNTSVNUQU5UOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9DQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6RU1FUkdFTkNZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX0VNRVJHRU5DWTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6U0FGRVRZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VTQUdFX1NBRkVUWTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVVNBR0VfVkVISUNMRV9TVEFUVVM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVXNhZ2U6OkFOTk9VTkNFTUVOVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VU0FHRV9BTk5PVU5DRU1FTlQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXNhZ2U+CitsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UoYXVkaW9fdXNhZ2VfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlVOS05PV047CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok1FRElBOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZPSUNFX0NPTU1VTklDQVRJT047CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpWT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFMQVJNOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6Tk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6Ok5PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpOT1RJRklDQVRJT05fRVZFTlQ7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkFTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkdBTUU7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlZJUlRVQUxfU09VUkNFOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6QVNTSVNUQU5UOworICAgICAgICBjYXNlIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpDQUxMX0FTU0lTVEFOVDsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9FTUVSR0VOQ1k6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OkVNRVJHRU5DWTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9TQUZFVFk6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVXNhZ2U6OlNBRkVUWTsKKyAgICAgICAgY2FzZSBBVURJT19VU0FHRV9WRUhJQ0xFX1NUQVRVUzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Vc2FnZTo6VkVISUNMRV9TVEFUVVM7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfQU5OT1VOQ0VNRU5UOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VzYWdlOjpBTk5PVU5DRU1FTlQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZmxhZ3NfbWFza190PgorYWlkbDJsZWdhY3lfQXVkaW9GbGFnX2F1ZGlvX2ZsYWdzX21hc2tfdChtZWRpYTo6QXVkaW9GbGFnIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpBVURJQklMSVRZX0VORk9SQ0VEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpTRUNVUkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19TRUNVUkU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6U0NPOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfU0NPOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkJFQUNPTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0JFQUNPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpIV19BVl9TWU5DOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpIV19IT1RXT1JEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfSFdfSE9UV09SRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpCWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6OkJZUEFTU19NVVRFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfQllQQVNTX01VVEU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6TE9XX0xBVEVOQ1k6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19MT1dfTEFURU5DWTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpERUVQX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX0RFRVBfQlVGRkVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6Ok5PX01FRElBX1BST0pFQ1RJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0ZsYWc6Ok1VVEVfSEFQVElDOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTVVURV9IQVBUSUM7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRmxhZzo6Tk9fU1lTVEVNX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9GbGFnOjpDQVBUVVJFX1BSSVZBVEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEU7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRmxhZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9BdWRpb0ZsYWcoYXVkaW9fZmxhZ3NfbWFza190IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19OT05FOgorICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6QVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX1NFQ1VSRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpTRUNVUkU7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19TQ086CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6U0NPOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQkVBQ09OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkJFQUNPTjsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0hXX0FWX1NZTkM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6SFdfQVZfU1lOQzsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0hXX0hPVFdPUkQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6SFdfSE9UV09SRDsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkJZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfQllQQVNTX01VVEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6QllQQVNTX01VVEU7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19MT1dfTEFURU5DWToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpMT1dfTEFURU5DWTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0RFRVBfQlVGRkVSOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0ZsYWc6OkRFRVBfQlVGRkVSOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpOT19NRURJQV9QUk9KRUNUSU9OOworICAgICAgICBjYXNlIEFVRElPX0ZMQUdfTVVURV9IQVBUSUM6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRmxhZzo6TVVURV9IQVBUSUM7CisgICAgICAgIGNhc2UgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpOT19TWVNURU1fQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9GbGFnOjpDQVBUVVJFX1BSSVZBVEU7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZmxhZ3NfbWFza190PgorYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19mbGFnc19tYXNrX3RfbWFzayhpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8YXVkaW9fZmxhZ3NfbWFza190LCBpbnQzMl90LCBhdWRpb19mbGFnc19tYXNrX3QsIG1lZGlhOjpBdWRpb0ZsYWc+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9GbGFnX2F1ZGlvX2ZsYWdzX21hc2tfdCwgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRmxhZz4sCisgICAgICAgICAgICBlbnVtVG9NYXNrX2JpdG1hc2s8YXVkaW9fZmxhZ3NfbWFza190LCBhdWRpb19mbGFnc19tYXNrX3Q+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhhdWRpb19mbGFnc19tYXNrX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRCaXRtYXNrPGludDMyX3QsIGF1ZGlvX2ZsYWdzX21hc2tfdCwgbWVkaWE6OkF1ZGlvRmxhZywgYXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X0F1ZGlvRmxhZywKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8YXVkaW9fZmxhZ3NfbWFza190PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRmxhZz4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2F0dHJpYnV0ZXNfdD4KK2FpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGFpZGwpIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbGVnYWN5OworICAgIGxlZ2FjeS5jb250ZW50X3R5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbnRlbnRUeXBlX2F1ZGlvX2NvbnRlbnRfdHlwZV90KGFpZGwuY29udGVudFR5cGUpKTsKKyAgICBsZWdhY3kudXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Vc2FnZV9hdWRpb191c2FnZV90KGFpZGwudXNhZ2UpKTsKKyAgICBsZWdhY3kuc291cmNlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhaWRsLnNvdXJjZSkpOworICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2ZsYWdzX21hc2tfdF9tYXNrKGFpZGwuZmxhZ3MpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwudGFncywgbGVnYWN5LnRhZ3MsIHNpemVvZihsZWdhY3kudGFncykpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhaWRsOworICAgIGFpZGwuY29udGVudFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGxlZ2FjeS5jb250ZW50X3R5cGUpKTsKKyAgICBhaWRsLnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShsZWdhY3kudXNhZ2UpKTsKKyAgICBhaWRsLnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUobGVnYWN5LnNvdXJjZSkpOworICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhsZWdhY3kuZmxhZ3MpKTsKKyAgICBhaWRsLnRhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS50YWdzLCBzaXplb2YobGVnYWN5LnRhZ3MpKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90KG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6RUxFTUVOVEFSWV9TVFJFQU06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlOjpIQU5ETEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0hBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUoYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZTo6Tk9ORTsKKyAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfRUxFTUVOVEFSWV9TVFJFQU06CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkVMRU1FTlRBUllfU1RSRUFNOworICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9IQU5ETEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU6OkhBTkRMRTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19vZmZsb2FkX2luZm9fdD4KK2FpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGFpZGwpIHsKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBsZWdhY3k7CisgICAgbGVnYWN5LnZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLnZlcnNpb24pKTsKKyAgICBsZWdhY3kuc2l6ZSA9IHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCk7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICBsZWdhY3kuZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICBsZWdhY3kuc3RyZWFtX3R5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChhaWRsLnN0cmVhbVR5cGUpKTsKKyAgICBsZWdhY3kuYml0X3JhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmJpdFJhdGUpKTsKKyAgICBsZWdhY3kuZHVyYXRpb25fdXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGFpZGwuZHVyYXRpb25VcykpOworICAgIGxlZ2FjeS5oYXNfdmlkZW8gPSBhaWRsLmhhc1ZpZGVvOworICAgIGxlZ2FjeS5pc19zdHJlYW1pbmcgPSBhaWRsLmlzU3RyZWFtaW5nOworICAgIGxlZ2FjeS5iaXRfd2lkdGggPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLmJpdFdpZHRoKSk7CisgICAgbGVnYWN5Lm9mZmxvYWRfYnVmZmVyX3NpemUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLm9mZmxvYWRCdWZmZXJTaXplKSk7CisgICAgbGVnYWN5LnVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChhaWRsLnVzYWdlKSk7CisgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbW9kZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QoYWlkbC5lbmNhcHN1bGF0aW9uTW9kZSkpOworICAgIGxlZ2FjeS5jb250ZW50X2lkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihhaWRsLmNvbnRlbnRJZCkpOworICAgIGxlZ2FjeS5zeW5jX2lkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihhaWRsLnN5bmNJZCkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8+CitsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyBhaWRsOworICAgIC8vIFZlcnNpb24gMC4xIGZpZWxkcy4KKyAgICBpZiAobGVnYWN5LnNpemUgPCBvZmZzZXRvZihhdWRpb19vZmZsb2FkX2luZm9fdCwgdXNhZ2UpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190Ojp1c2FnZSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYWlkbC52ZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kudmVyc2lvbikpOworICAgIGFpZGwuY29uZmlnLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zYW1wbGVfcmF0ZSkpOworICAgIGFpZGwuY29uZmlnLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5jb25maWcuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKyAgICBhaWRsLnN0cmVhbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShsZWdhY3kuc3RyZWFtX3R5cGUpKTsKKyAgICBhaWRsLmJpdFJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5iaXRfcmF0ZSkpOworICAgIGFpZGwuZHVyYXRpb25VcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obGVnYWN5LmR1cmF0aW9uX3VzKSk7CisgICAgYWlkbC5oYXNWaWRlbyA9IGxlZ2FjeS5oYXNfdmlkZW87CisgICAgYWlkbC5pc1N0cmVhbWluZyA9IGxlZ2FjeS5pc19zdHJlYW1pbmc7CisgICAgYWlkbC5iaXRXaWR0aCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmJpdF93aWR0aCkpOworICAgIGFpZGwub2ZmbG9hZEJ1ZmZlclNpemUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5vZmZsb2FkX2J1ZmZlcl9zaXplKSk7CisgICAgYWlkbC51c2FnZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UobGVnYWN5LnVzYWdlKSk7CisKKyAgICAvLyBWZXJzaW9uIDAuMiBmaWVsZHMuCisgICAgaWYgKGxlZ2FjeS52ZXJzaW9uID49IEFVRElPX09GRkxPQURfSU5GT19WRVJTSU9OXzBfMikgeworICAgICAgICBpZiAobGVnYWN5LnNpemUgPAorICAgICAgICAgICAgb2Zmc2V0b2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QsIHN5bmNfaWQpICsgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190OjpzeW5jX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgICAgICBhaWRsLmVuY2Fwc3VsYXRpb25Nb2RlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl9tb2RlKSk7CisgICAgICAgIGFpZGwuY29udGVudElkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kuY29udGVudF9pZCkpOworICAgICAgICBhaWRsLnN5bmNJZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5LnN5bmNfaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fY29uZmlnX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGFpZGwpIHsKKyAgICBhdWRpb19jb25maWdfdCBsZWdhY3k7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICBsZWdhY3kub2ZmbG9hZF9pbmZvID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChhaWRsLm9mZmxvYWRJbmZvKSk7CisgICAgbGVnYWN5LmZyYW1lX2NvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Db25maWc+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25zdCBhdWRpb19jb25maWdfdCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvQ29uZmlnIGFpZGw7CisgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIGFpZGwub2ZmbG9hZEluZm8gPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGxlZ2FjeS5vZmZsb2FkX2luZm8pKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS5mcmFtZV9jb3VudCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ19iYXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBhaWRsKSB7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBsZWdhY3k7CisgICAgbGVnYWN5LnNhbXBsZV9yYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoYWlkbC5jaGFubmVsTWFzaykpOworICAgIGxlZ2FjeS5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYWlkbC5mb3JtYXQpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2U+CitsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZShjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGFpZGw7CisgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuc2FtcGxlX3JhdGUpKTsKKyAgICBhaWRsLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChsZWdhY3kuY2hhbm5lbF9tYXNrKSk7CisgICAgYWlkbC5mb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobGVnYWN5LmZvcm1hdCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPElNZW1vcnk+PgorYWlkbDJsZWdhY3lfU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGNvbnN0IG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uJiBhaWRsKSB7CisgICAgc3A8SU1lbW9yeT4gbGVnYWN5OworICAgIGlmICghY29udmVydFNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoYWlkbCwgJmxlZ2FjeSkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4KK2xlZ2FjeTJhaWRsX0lNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KSB7CisgICAgbWVkaWE6OlNoYXJlZEZpbGVSZWdpb24gYWlkbDsKKyAgICBpZiAoIWNvbnZlcnRJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGxlZ2FjeSwgJmFpZGwpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PHNwPElNZW1vcnk+PgorYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoY29uc3Qgc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4mIGFpZGwpIHsKKyAgICBzcDxJTWVtb3J5PiBsZWdhY3k7CisgICAgaWYgKCFjb252ZXJ0TnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KGFpZGwsICZsZWdhY3kpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4+CitsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KSB7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4gYWlkbDsKKyAgICBpZiAoIWNvbnZlcnROdWxsYWJsZUlNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24obGVnYWN5LCAmYWlkbCkpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9UaW1lc3RhbXA+CithaWRsMmxlZ2FjeV9BdWRpb1RpbWVzdGFtcEludGVybmFsX0F1ZGlvVGltZXN0YW1wKGNvbnN0IG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsJiBhaWRsKSB7CisgICAgQXVkaW9UaW1lc3RhbXAgbGVnYWN5OworICAgIGxlZ2FjeS5tUG9zaXRpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLnBvc2l0aW9uKSk7CisgICAgbGVnYWN5Lm1UaW1lLnR2X3NlYyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuc2VjKSk7CisgICAgbGVnYWN5Lm1UaW1lLnR2X25zZWMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsLm5zZWMpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsPgorbGVnYWN5MmFpZGxfQXVkaW9UaW1lc3RhbXBfQXVkaW9UaW1lc3RhbXBJbnRlcm5hbChjb25zdCBBdWRpb1RpbWVzdGFtcCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvVGltZXN0YW1wSW50ZXJuYWwgYWlkbDsKKyAgICBhaWRsLnBvc2l0aW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubVBvc2l0aW9uKSk7CisgICAgYWlkbC5zZWMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGxlZ2FjeS5tVGltZS50dl9zZWMpKTsKKyAgICBhaWRsLm5zZWMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5tVGltZS50dl9uc2VjKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXVpZF90PgorYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBhaWRsKSB7CisgICAgYXVkaW9fdXVpZF90IGxlZ2FjeTsKKyAgICBsZWdhY3kudGltZUxvdyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KGFpZGwudGltZUxvdykpOworICAgIGxlZ2FjeS50aW1lTWlkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MTZfdD4oYWlkbC50aW1lTWlkKSk7CisgICAgbGVnYWN5LnRpbWVIaUFuZFZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLnRpbWVIaUFuZFZlcnNpb24pKTsKKyAgICBsZWdhY3kuY2xvY2tTZXEgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHVpbnQxNl90PihhaWRsLmNsb2NrU2VxKSk7CisgICAgaWYgKGFpZGwubm9kZS5zaXplKCkgIT0gc3RkOjpzaXplKGxlZ2FjeS5ub2RlKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBzdGQ6OmNvcHkoYWlkbC5ub2RlLmJlZ2luKCksIGFpZGwubm9kZS5lbmQoKSwgbGVnYWN5Lm5vZGUpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXVpZD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoY29uc3QgYXVkaW9fdXVpZF90JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9VdWlkIGFpZGw7CisgICAgYWlkbC50aW1lTG93ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kudGltZUxvdykpOworICAgIGFpZGwudGltZU1pZCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LnRpbWVNaWQpKTsKKyAgICBhaWRsLnRpbWVIaUFuZFZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS50aW1lSGlBbmRWZXJzaW9uKSk7CisgICAgYWlkbC5jbG9ja1NlcSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obGVnYWN5LmNsb2NrU2VxKSk7CisgICAgc3RkOjpjb3B5KGxlZ2FjeS5ub2RlLCBsZWdhY3kubm9kZSArIHN0ZDo6c2l6ZShsZWdhY3kubm9kZSksIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLm5vZGUpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxlZmZlY3RfZGVzY3JpcHRvcl90PgorYWlkbDJsZWdhY3lfRWZmZWN0RGVzY3JpcHRvcl9lZmZlY3RfZGVzY3JpcHRvcl90KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBhaWRsKSB7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBsZWdhY3k7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChhaWRsLnR5cGUpKTsKKyAgICBsZWdhY3kudXVpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGFpZGwudXVpZCkpOworICAgIGxlZ2FjeS5hcGlWZXJzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDx1aW50MzJfdD4oYWlkbC5hcGlWZXJzaW9uKSk7CisgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRSZWludGVycHJldDx1aW50MzJfdD4oYWlkbC5mbGFncykpOworICAgIGxlZ2FjeS5jcHVMb2FkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MTZfdD4oYWlkbC5jcHVMb2FkKSk7CisgICAgbGVnYWN5Lm1lbW9yeVVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MTZfdD4oYWlkbC5tZW1vcnlVc2FnZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUihhaWRsMmxlZ2FjeV9zdHJpbmcoYWlkbC5uYW1lLCBsZWdhY3kubmFtZSwgc2l6ZW9mKGxlZ2FjeS5uYW1lKSkpOworICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmltcGxlbWVudG9yLCBsZWdhY3kuaW1wbGVtZW50b3IsIHNpemVvZihsZWdhY3kuaW1wbGVtZW50b3IpKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4KK2xlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciBhaWRsOworICAgIGFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKGxlZ2FjeS50eXBlKSk7CisgICAgYWlkbC51dWlkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQobGVnYWN5LnV1aWQpKTsKKyAgICBhaWRsLmFwaVZlcnNpb24gPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeS5hcGlWZXJzaW9uKSk7CisgICAgYWlkbC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5LmZsYWdzKSk7CisgICAgYWlkbC5jcHVMb2FkID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kuY3B1TG9hZCkpOworICAgIGFpZGwubWVtb3J5VXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5tZW1vcnlVc2FnZSkpOworICAgIGFpZGwubmFtZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9zdHJpbmcobGVnYWN5Lm5hbWUsIHNpemVvZihsZWdhY3kubmFtZSkpKTsKKyAgICBhaWRsLmltcGxlbWVudG9yID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5pbXBsZW1lbnRvciwgc2l6ZW9mKGxlZ2FjeS5pbXBsZW1lbnRvcikpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfTk9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpGUkFNRVdPUktfVFVORVI6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFX0ZSQU1FV09SS19UVU5FUjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfRFZCX0FEX0RFU0NSSVBUT1I7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSgKKyAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19FTkNBUFNVTEFUSU9OX01FVEFEQVRBX1RZUEVfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpOT05FOworICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9GUkFNRVdPUktfVFVORVI6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZTo6RlJBTUVXT1JLX1RVTkVSOworICAgICAgICBjYXNlIEFVRElPX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRV9EVkJfQURfREVTQ1JJUFRPUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlOjpEVkJfQURfREVTQ1JJUFRPUjsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8dWludDMyX3QsCisgICAgICAgICAgICBpbnQzMl90LAorICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QsCisgICAgICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZT4oCisgICAgICAgICAgICBhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDx1aW50MzJfdCwgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Q+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKHVpbnQzMl90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LAorICAgICAgICAgICAgdWludDMyX3QsCisgICAgICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKKyAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PigKKyAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZSwKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2luZGV4PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbW9kZV90PiwKKyAgICAgICAgICAgIGVudW1Ub01hc2tfaW5kZXg8aW50MzJfdCwgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwKKyAgICAgICAgICAgIGludDMyX3QsCisgICAgICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCwKKyAgICAgICAgICAgIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGU+KAorICAgICAgICAgICAgYWlkbCwgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90LAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZT4sCisgICAgICAgICAgICBlbnVtVG9NYXNrX2luZGV4PHVpbnQzMl90LCBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdD4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayh1aW50MzJfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydEJpdG1hc2s8aW50MzJfdCwKKyAgICAgICAgICAgIHVpbnQzMl90LAorICAgICAgICAgICAgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSwKKyAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PigKKyAgICAgICAgICAgIGxlZ2FjeSwgbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLAorICAgICAgICAgICAgaW5kZXhUb0VudW1faW5kZXg8YXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3Q+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPik7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcyBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOjpMT1c6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTEFURU5DWV9MT1c7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOjpOT1JNQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTEFURU5DWV9OT1JNQUw7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4TGF0ZW5jeUNsYXNzPgorbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcygKKyAgICAgICAgYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0xBVEVOQ1lfTE9XOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6TE9XOworICAgICAgICBjYXNlIEFVRElPX0xBVEVOQ1lfTk9STUFMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzczo6Tk9STUFMOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfZGV2aWNlX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydERldmljZUV4dF9hdWRpb19wb3J0X2RldmljZV9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCYgYWlkbCkgeworICAgIGF1ZGlvX3BvcnRfZGV2aWNlX2V4dCBsZWdhY3k7CisgICAgbGVnYWN5Lmh3X21vZHVsZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChhaWRsLmh3TW9kdWxlKSk7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoYWlkbC5kZXZpY2UudHlwZSkpOworICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X3N0cmluZyhhaWRsLmRldmljZS5hZGRyZXNzLCBsZWdhY3kuYWRkcmVzcywgc2l6ZW9mKGxlZ2FjeS5hZGRyZXNzKSkpOworICAgIGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21vZGVzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGFpZGwuZW5jYXBzdWxhdGlvbk1vZGVzKSk7CisgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayhhaWRsLmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dChjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQgYWlkbDsKKyAgICBhaWRsLmh3TW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5od19tb2R1bGUpKTsKKyAgICBhaWRsLmRldmljZS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS50eXBlKSk7CisgICAgYWlkbC5kZXZpY2UuYWRkcmVzcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3N0cmluZyhsZWdhY3kuYWRkcmVzcywgc2l6ZW9mKGxlZ2FjeS5hZGRyZXNzKSkpOworICAgIGFpZGwuZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21vZGVzKSk7CisgICAgYWlkbC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGxlZ2FjeS5lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVzKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9taXhfZXh0PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsKSB7CisgICAgYXVkaW9fcG9ydF9taXhfZXh0IGxlZ2FjeTsKKyAgICBsZWdhY3kuaHdfbW9kdWxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGwuaHdNb2R1bGUpKTsKKyAgICBsZWdhY3kuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbC5oYW5kbGUpKTsKKyAgICBsZWdhY3kubGF0ZW5jeV9jbGFzcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TGF0ZW5jeUNsYXNzX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QoYWlkbC5sYXRlbmN5Q2xhc3MpKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRNaXhFeHQ+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGNvbnN0IGF1ZGlvX3BvcnRfbWl4X2V4dCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydE1peEV4dCBhaWRsOworICAgIGFpZGwuaHdNb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobGVnYWN5Lmh3X21vZHVsZSkpOworICAgIGFpZGwuaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QobGVnYWN5LmhhbmRsZSkpOworICAgIGFpZGwubGF0ZW5jeUNsYXNzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fbWl4X2xhdGVuY3lfY2xhc3NfdF9BdWRpb01peExhdGVuY3lDbGFzcyhsZWdhY3kubGF0ZW5jeV9jbGFzcykpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQ+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQmIGFpZGwpIHsKKyAgICBhdWRpb19wb3J0X3Nlc3Npb25fZXh0IGxlZ2FjeTsKKyAgICBsZWdhY3kuc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb24pKTsKKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dF9BdWRpb1BvcnRTZXNzaW9uRXh0KGNvbnN0IGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnRTZXNzaW9uRXh0IGFpZGw7CisgICAgYWlkbC5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKKy8vIFRoaXMgdHlwZSBpcyB1bm5hbWVkIGluIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLCB0aHVzIHdlIG5hbWUgaXQgaGVyZS4KK3VzaW5nIGF1ZGlvX3BvcnRfdjdfZXh0ID0gZGVjbHR5cGUoYXVkaW9fcG9ydF92Nzo6ZXh0KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3X2V4dD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0RXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0RXh0JiBhaWRsLCBtZWRpYTo6QXVkaW9Qb3J0VHlwZSB0eXBlKSB7CisgICAgYXVkaW9fcG9ydF92N19leHQgbGVnYWN5OworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpOT05FOgorICAgICAgICAgICAgLy8gSnVzdCB2ZXJpZnkgdGhhdCB0aGUgdW5pb24gaXMgZW1wdHkuCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oVU5JT05fR0VUKGFpZGwsIHVuc3BlY2lmaWVkKSk7CisgICAgICAgICAgICByZXR1cm4gbGVnYWN5OworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0U6CisgICAgICAgICAgICBsZWdhY3kuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihVTklPTl9HRVQoYWlkbCwgZGV2aWNlKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9ydFR5cGU6Ok1JWDoKKyAgICAgICAgICAgIGxlZ2FjeS5taXggPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydE1peEV4dF9hdWRpb19wb3J0X21peF9leHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBtaXgpKSkpOworICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb3J0VHlwZTo6U0VTU0lPTjoKKyAgICAgICAgICAgIGxlZ2FjeS5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFNlc3Npb25FeHRfYXVkaW9fcG9ydF9zZXNzaW9uX2V4dCgKKyAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKFVOSU9OX0dFVChhaWRsLCBzZXNzaW9uKSkpKTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTCgiU2hvdWxkbid0IGdldCBoZXJlIik7IC8vIHdpdGggLVdlcnJvciwtV3N3aXRjaCBtYXkgY29tcGlsZS10aW1lIGZhaWwKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0RXh0PiBsZWdhY3kyYWlkbF9BdWRpb1BvcnRFeHQoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfdjdfZXh0JiBsZWdhY3ksIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0RXh0IGFpZGw7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX05PTkU6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdW5zcGVjaWZpZWQsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfZGV2aWNlX2V4dF9BdWRpb1BvcnREZXZpY2VFeHQobGVnYWN5LmRldmljZSkpKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgbWl4LAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X21peF9leHRfQXVkaW9Qb3J0TWl4RXh0KGxlZ2FjeS5taXgpKSk7CisgICAgICAgICAgICByZXR1cm4gYWlkbDsKKyAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfU0VTU0lPTjoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Nlc3Npb25fZXh0X0F1ZGlvUG9ydFNlc3Npb25FeHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIHJldHVybiBhaWRsOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJTaG91bGRuJ3QgZ2V0IGhlcmUiKTsgLy8gd2l0aCAtV2Vycm9yLC1Xc3dpdGNoIG1heSBjb21waWxlLXRpbWUgZmFpbAorfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Byb2ZpbGU+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKSB7CisgICAgYXVkaW9fcHJvZmlsZSBsZWdhY3k7CisgICAgbGVnYWN5LmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChhaWRsLmZvcm1hdCkpOworCisgICAgaWYgKGFpZGwuc2FtcGxpbmdSYXRlcy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LnNhbXBsZV9yYXRlcykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgY29udmVydFJhbmdlKGFpZGwuc2FtcGxpbmdSYXRlcy5iZWdpbigpLCBhaWRsLnNhbXBsaW5nUmF0ZXMuZW5kKCksIGxlZ2FjeS5zYW1wbGVfcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3QsIHVuc2lnbmVkIGludD4pKTsKKyAgICBsZWdhY3kubnVtX3NhbXBsZV9yYXRlcyA9IGFpZGwuc2FtcGxpbmdSYXRlcy5zaXplKCk7CisKKyAgICBpZiAoYWlkbC5jaGFubmVsTWFza3Muc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5jaGFubmVsX21hc2tzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5jaGFubmVsTWFza3MuYmVnaW4oKSwgYWlkbC5jaGFubmVsTWFza3MuZW5kKCksIGxlZ2FjeS5jaGFubmVsX21hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QpKTsKKyAgICBsZWdhY3kubnVtX2NoYW5uZWxfbWFza3MgPSBhaWRsLmNoYW5uZWxNYXNrcy5zaXplKCk7CisKKyAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl90eXBlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdChhaWRsLmVuY2Fwc3VsYXRpb25UeXBlKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfYXVkaW9fcHJvZmlsZV9BdWRpb1Byb2ZpbGUoY29uc3QgYXVkaW9fcHJvZmlsZSYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUHJvZmlsZSBhaWRsOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KGxlZ2FjeS5mb3JtYXQpKTsKKworICAgIGlmIChsZWdhY3kubnVtX3NhbXBsZV9yYXRlcyA+IHN0ZDo6c2l6ZShsZWdhY3kuc2FtcGxlX3JhdGVzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LnNhbXBsZV9yYXRlcywgbGVnYWN5LnNhbXBsZV9yYXRlcyArIGxlZ2FjeS5udW1fc2FtcGxlX3JhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLnNhbXBsaW5nUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQsIGludDMyX3Q+KSk7CisKKyAgICBpZiAobGVnYWN5Lm51bV9jaGFubmVsX21hc2tzID4gc3RkOjpzaXplKGxlZ2FjeS5jaGFubmVsX21hc2tzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobGVnYWN5LmNoYW5uZWxfbWFza3MsIGxlZ2FjeS5jaGFubmVsX21hc2tzICsgbGVnYWN5Lm51bV9jaGFubmVsX21hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmNoYW5uZWxNYXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdCkpOworCisgICAgYWlkbC5lbmNhcHN1bGF0aW9uVHlwZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUoCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5lbmNhcHN1bGF0aW9uX3R5cGUpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluPgorYWlkbDJsZWdhY3lfQXVkaW9HYWluX2F1ZGlvX2dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCkgeworICAgIGF1ZGlvX2dhaW4gbGVnYWN5OworICAgIGxlZ2FjeS5tb2RlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZ2Fpbl9tb2RlX3RfbWFzayhhaWRsLm1vZGUpKTsKKyAgICBsZWdhY3kuY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19jaGFubmVsX21hc2tfdChhaWRsLmNoYW5uZWxNYXNrKSk7CisgICAgbGVnYWN5Lm1pbl92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLm1pblZhbHVlKSk7CisgICAgbGVnYWN5Lm1heF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50PihhaWRsLm1heFZhbHVlKSk7CisgICAgbGVnYWN5LmRlZmF1bHRfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludD4oYWlkbC5kZWZhdWx0VmFsdWUpKTsKKyAgICBsZWdhY3kuc3RlcF92YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLnN0ZXBWYWx1ZSkpOworICAgIGxlZ2FjeS5taW5fcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLm1pblJhbXBNcykpOworICAgIGxlZ2FjeS5tYXhfcmFtcF9tcyA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsLm1heFJhbXBNcykpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvR2Fpbj4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fQXVkaW9HYWluKGNvbnN0IGF1ZGlvX2dhaW4mIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb0dhaW4gYWlkbDsKKyAgICBhaWRsLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKGxlZ2FjeS5tb2RlKSk7CisgICAgYWlkbC5jaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobGVnYWN5LmNoYW5uZWxfbWFzaykpOworICAgIGFpZGwubWluVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5taW5fdmFsdWUpKTsKKyAgICBhaWRsLm1heFZhbHVlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWF4X3ZhbHVlKSk7CisgICAgYWlkbC5kZWZhdWx0VmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5kZWZhdWx0X3ZhbHVlKSk7CisgICAgYWlkbC5zdGVwVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5zdGVwX3ZhbHVlKSk7CisgICAgYWlkbC5taW5SYW1wTXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGxlZ2FjeS5taW5fcmFtcF9tcykpOworICAgIGFpZGwubWF4UmFtcE1zID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsZWdhY3kubWF4X3JhbXBfbXMpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgYWlkbCkgeworICAgIGF1ZGlvX3BvcnRfdjcgbGVnYWN5OworICAgIGxlZ2FjeS5pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5pZCkpOworICAgIGxlZ2FjeS5yb2xlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydFJvbGVfYXVkaW9fcG9ydF9yb2xlX3QoYWlkbC5yb2xlKSk7CisgICAgbGVnYWN5LnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdChhaWRsLnR5cGUpKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoYWlkbDJsZWdhY3lfc3RyaW5nKGFpZGwubmFtZSwgbGVnYWN5Lm5hbWUsIHNpemVvZihsZWdhY3kubmFtZSkpKTsKKworICAgIGlmIChhaWRsLnByb2ZpbGVzLnNpemUoKSA+IHN0ZDo6c2l6ZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoYWlkbC5wcm9maWxlcy5iZWdpbigpLCBhaWRsLnByb2ZpbGVzLmVuZCgpLCBsZWdhY3kuYXVkaW9fcHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZSkpOworICAgIGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMgPSBhaWRsLnByb2ZpbGVzLnNpemUoKTsKKworICAgIGlmIChhaWRsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycy5zaXplKCkgPiBzdGQ6OnNpemUobGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzKSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UoYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuYmVnaW4oKSwgYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5LmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IpKTsKKyAgICBsZWdhY3kubnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzID0gYWlkbC5leHRyYUF1ZGlvRGVzY3JpcHRvcnMuc2l6ZSgpOworCisgICAgaWYgKGFpZGwuZ2FpbnMuc2l6ZSgpID4gc3RkOjpzaXplKGxlZ2FjeS5nYWlucykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgUkVUVVJOX0lGX0VSUk9SKGNvbnZlcnRSYW5nZShhaWRsLmdhaW5zLmJlZ2luKCksIGFpZGwuZ2FpbnMuZW5kKCksIGxlZ2FjeS5nYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKSk7CisgICAgbGVnYWN5Lm51bV9nYWlucyA9IGFpZGwuZ2FpbnMuc2l6ZSgpOworCisgICAgbGVnYWN5LmFjdGl2ZV9jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoYWlkbC5hY3RpdmVDb25maWcpKTsKKyAgICBsZWdhY3kuZXh0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvUG9ydEV4dChhaWRsLmV4dCwgYWlkbC50eXBlKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF92N19BdWRpb1BvcnQoY29uc3QgYXVkaW9fcG9ydF92NyYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBhaWRsOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5pZCkpOworICAgIGFpZGwucm9sZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKGxlZ2FjeS5yb2xlKSk7CisgICAgYWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobGVnYWN5LnR5cGUpKTsKKyAgICBhaWRsLm5hbWUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfc3RyaW5nKGxlZ2FjeS5uYW1lLCBzaXplb2YobGVnYWN5Lm5hbWUpKSk7CisKKyAgICBpZiAobGVnYWN5Lm51bV9hdWRpb19wcm9maWxlcyA+IHN0ZDo6c2l6ZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuYXVkaW9fcHJvZmlsZXMsIGxlZ2FjeS5hdWRpb19wcm9maWxlcyArIGxlZ2FjeS5udW1fYXVkaW9fcHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGFpZGwucHJvZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKSk7CisKKyAgICBpZiAobGVnYWN5Lm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA+IHN0ZDo6c2l6ZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMpKSB7CisgICAgICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIFJFVFVSTl9JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShsZWdhY3kuZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5leHRyYV9hdWRpb19kZXNjcmlwdG9ycyArIGxlZ2FjeS5udW1fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhaWRsLmV4dHJhQXVkaW9EZXNjcmlwdG9ycyksCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JfRXh0cmFBdWRpb0Rlc2NyaXB0b3IpKTsKKworICAgIGlmIChsZWdhY3kubnVtX2dhaW5zID4gc3RkOjpzaXplKGxlZ2FjeS5nYWlucykpIHsKKyAgICAgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgY29udmVydFJhbmdlKGxlZ2FjeS5nYWlucywgbGVnYWN5LmdhaW5zICsgbGVnYWN5Lm51bV9nYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoYWlkbC5nYWlucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4pKTsKKworICAgIGFpZGwuYWN0aXZlQ29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKGxlZ2FjeS5hY3RpdmVfY29uZmlnKSk7CisgICAgYWlkbC5leHQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9Qb3J0RXh0KGxlZ2FjeS5leHQsIGxlZ2FjeS50eXBlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Nb2RlX2F1ZGlvX21vZGVfdChtZWRpYTo6QXVkaW9Nb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5WQUxJRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfQ1VSUkVOVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpOT1JNQUw6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9OT1JNQUw7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTW9kZTo6UklOR1RPTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9SSU5HVE9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ0FMTDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Nb2RlOjpDQUxMX1NDUkVFTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RFX0NBTExfU0NSRUVOOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01vZGU+CitsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKGF1ZGlvX21vZGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5WQUxJRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTlZBTElEOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ1VSUkVOVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpDVVJSRU5UOworICAgICAgICBjYXNlIEFVRElPX01PREVfTk9STUFMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6Ok5PUk1BTDsKKyAgICAgICAgY2FzZSBBVURJT19NT0RFX1JJTkdUT05FOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01vZGU6OlJJTkdUT05FOworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5fQ0FMTDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DQUxMOworICAgICAgICBjYXNlIEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Nb2RlOjpJTl9DT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX01PREVfQ0FMTF9TQ1JFRU46CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTW9kZTo6Q0FMTF9TQ1JFRU47CisgICAgICAgIGNhc2UgQVVESU9fTU9ERV9DTlQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb191bmlxdWVfaWRfdXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1VuaXF1ZUlkVXNlX2F1ZGlvX3VuaXF1ZV9pZF91c2VfdChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlVOU1BFQ0lGSUVEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9VU0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlNFU1NJT046CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpNT0RVTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEU7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OkVGRkVDVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6UEFUQ0g6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6T1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9VU0VfT1VUUFVUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpJTlBVVDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19VTklRVUVfSURfVVNFX0lOUFVUOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpDTElFTlQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5JUVVFX0lEX1VTRV9DTElFTlQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U+CitsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdXNlX3RfQXVkaW9VbmlxdWVJZFVzZShhdWRpb191bmlxdWVfaWRfdXNlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpVTlNQRUNJRklFRDsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT046CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlNFU1NJT047CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6Ok1PRFVMRTsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6RUZGRUNUOworICAgICAgICBjYXNlIEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0g6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OlBBVENIOworICAgICAgICBjYXNlIEFVRElPX1VOSVFVRV9JRF9VU0VfT1VUUFVUOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlOjpPVVRQVVQ7CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9JTlBVVDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZTo6SU5QVVQ7CisgICAgICAgIGNhc2UgQVVESU9fVU5JUVVFX0lEX1VTRV9DTElFTlQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2U6OkNMSUVOVDsKKyAgICAgICAgY2FzZSBBVURJT19VTklRVUVfSURfVVNFX01BWDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHZvbHVtZV9ncm91cF90PgorYWlkbDJsZWdhY3lfaW50MzJfdF92b2x1bWVfZ3JvdXBfdChpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PHZvbHVtZV9ncm91cF90PihhaWRsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfdm9sdW1lX2dyb3VwX3RfaW50MzJfdCh2b2x1bWVfZ3JvdXBfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8cHJvZHVjdF9zdHJhdGVneV90PgorYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9wcm9kdWN0X3N0cmF0ZWd5X3RfaW50MzJfdChwcm9kdWN0X3N0cmF0ZWd5X3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2R1YWxfbW9ub19tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0R1YWxNb25vTW9kZV9hdWRpb19kdWFsX21vbm9fbW9kZV90KG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZSBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRHVhbE1vbm9Nb2RlOjpPRkY6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRFVBTF9NT05PX01PREVfT0ZGOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZTo6TFI6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRFVBTF9NT05PX01PREVfTFI7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvRHVhbE1vbm9Nb2RlOjpMTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19EVUFMX01PTk9fTU9ERV9MTDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGU6OlJSOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RVQUxfTU9OT19NT0RFX1JSOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2R1YWxfbW9ub19tb2RlX3RfQXVkaW9EdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX09GRjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGU6Ok9GRjsKKyAgICAgICAgY2FzZSBBVURJT19EVUFMX01PTk9fTU9ERV9MUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGU6OkxSOworICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX0xMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZTo6TEw7CisgICAgICAgIGNhc2UgQVVESU9fRFVBTF9NT05PX01PREVfUlI6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRHVhbE1vbm9Nb2RlOjpSUjsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb190aW1lc3RyZXRjaF9mYWxsYmFja19tb2RlX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdChpbnQzMl90IGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdF9pbnQzMl90KGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdCBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGxlZ2FjeSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90KGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8YXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Q+KGFpZGwpOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9hdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdF9pbnQzMl90KGF1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4obGVnYWN5KTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wbGF5YmFja19yYXRlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1BsYXliYWNrUmF0ZV9hdWRpb19wbGF5YmFja19yYXRlX3QoY29uc3QgbWVkaWE6OkF1ZGlvUGxheWJhY2tSYXRlJiBhaWRsKSB7CisgICAgYXVkaW9fcGxheWJhY2tfcmF0ZV90IGxlZ2FjeTsKKyAgICBsZWdhY3kubVNwZWVkID0gYWlkbC5zcGVlZDsKKyAgICBsZWdhY3kubVBpdGNoID0gYWlkbC5waXRjaDsKKyAgICBsZWdhY3kubUZhbGxiYWNrTW9kZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90KGFpZGwuZmFsbGJhY2tNb2RlKSk7CisgICAgbGVnYWN5Lm1TdHJldGNoTW9kZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3QoYWlkbC5zdHJldGNoTW9kZSkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUGxheWJhY2tSYXRlPgorbGVnYWN5MmFpZGxfYXVkaW9fcGxheWJhY2tfcmF0ZV90X0F1ZGlvUGxheWJhY2tSYXRlKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvUGxheWJhY2tSYXRlIGFpZGw7CisgICAgYWlkbC5zcGVlZCA9IGxlZ2FjeS5tU3BlZWQ7CisgICAgYWlkbC5waXRjaCA9IGxlZ2FjeS5tUGl0Y2g7CisgICAgYWlkbC5mYWxsYmFja01vZGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb190aW1lc3RyZXRjaF9mYWxsYmFja19tb2RlX3RfaW50MzJfdChsZWdhY3kubUZhbGxiYWNrTW9kZSkpOworICAgIGFpZGwuc3RyZXRjaE1vZGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdF9pbnQzMl90KGxlZ2FjeS5tU3RyZXRjaE1vZGUpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zdGFuZGFyZF90PgorYWlkbDJsZWdhY3lfQXVkaW9TdGFuZGFyZF9hdWRpb19zdGFuZGFyZF90KG1lZGlhOjpBdWRpb1N0YW5kYXJkIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVEFOREFSRF9OT05FOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1N0YW5kYXJkOjpFRElEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUQU5EQVJEX0VESUQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RhbmRhcmQ+CitsZWdhY3kyYWlkbF9hdWRpb19zdGFuZGFyZF90X0F1ZGlvU3RhbmRhcmQoYXVkaW9fc3RhbmRhcmRfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEFVRElPX1NUQU5EQVJEX05PTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvU3RhbmRhcmQ6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fU1RBTkRBUkRfRURJRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9TdGFuZGFyZDo6RURJRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yPgorYWlkbDJsZWdhY3lfRXh0cmFBdWRpb0Rlc2NyaXB0b3JfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgbWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yJiBhaWRsKSB7CisgICAgYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvciBsZWdhY3k7CisgICAgbGVnYWN5LnN0YW5kYXJkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChhaWRsLnN0YW5kYXJkKSk7CisgICAgaWYgKGFpZGwuYXVkaW9EZXNjcmlwdG9yLnNpemUoKSA+IEVYVFJBX0FVRElPX0RFU0NSSVBUT1JfU0laRSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBsZWdhY3kuZGVzY3JpcHRvcl9sZW5ndGggPSBhaWRsLmF1ZGlvRGVzY3JpcHRvci5zaXplKCk7CisgICAgc3RkOjpjb3B5KGFpZGwuYXVkaW9EZXNjcmlwdG9yLmJlZ2luKCksIGFpZGwuYXVkaW9EZXNjcmlwdG9yLmVuZCgpLAorICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGxlZ2FjeS5kZXNjcmlwdG9yKSk7CisgICAgbGVnYWN5LmVuY2Fwc3VsYXRpb25fdHlwZSA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCgKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5lbmNhcHN1bGF0aW9uVHlwZSkpOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPgorbGVnYWN5MmFpZGxfYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcl9FeHRyYUF1ZGlvRGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgYXVkaW9fZXh0cmFfYXVkaW9fZGVzY3JpcHRvciYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yIGFpZGw7CisgICAgYWlkbC5zdGFuZGFyZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zdGFuZGFyZF90X0F1ZGlvU3RhbmRhcmQobGVnYWN5LnN0YW5kYXJkKSk7CisgICAgaWYgKGxlZ2FjeS5kZXNjcmlwdG9yX2xlbmd0aCA+IEVYVFJBX0FVRElPX0RFU0NSSVBUT1JfU0laRSkgeworICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICBhaWRsLmF1ZGlvRGVzY3JpcHRvci5yZXNpemUobGVnYWN5LmRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICBzdGQ6OmNvcHkobGVnYWN5LmRlc2NyaXB0b3IsIGxlZ2FjeS5kZXNjcmlwdG9yICsgbGVnYWN5LmRlc2NyaXB0b3JfbGVuZ3RoLAorICAgICAgICAgICAgICBhaWRsLmF1ZGlvRGVzY3JpcHRvci5iZWdpbigpKTsKKyAgICBhaWRsLmVuY2Fwc3VsYXRpb25UeXBlID0KKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZW5jYXBzdWxhdGlvbl90eXBlKSk7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZSYgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpOT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0VOQ0FQU1VMQVRJT05fVFlQRV9OT05FOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfSUVDNjE5Mzc7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKAorICAgICAgICBjb25zdCBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCAmIGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX05PTkU6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fRU5DQVBTVUxBVElPTl9UWVBFX0lFQzYxOTM3OgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25UeXBlOjpJRUM2MTkzNzsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxUcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyPgorYWlkbDJsZWdhY3lfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvX1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXIoCisgICAgICAgIGNvbnN0IG1lZGlhOjpUcmFja1NlY29uZGFyeU91dHB1dEluZm8mIGFpZGwpIHsKKyAgICBUcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXI7CisgICAgdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpci5maXJzdCA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KGFpZGwucG9ydElkKSk7CisgICAgdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpci5zZWNvbmQgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fcG9ydF9oYW5kbGVfdD4+KAorICAgICAgICAgICAgICAgICAgICBhaWRsLnNlY29uZGFyeU91dHB1dElkcywgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdCkpOworICAgIHJldHVybiB0cmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpUcmFja1NlY29uZGFyeU91dHB1dEluZm8+CitsZWdhY3kyYWlkbF9UcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyX1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbygKKyAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpciYgbGVnYWN5KSB7CisgICAgbWVkaWE6OlRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbyB0cmFja1NlY29uZGFyeU91dHB1dEluZm87CisgICAgdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLnBvcnRJZCA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGxlZ2FjeS5maXJzdCkpOworICAgIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mby5zZWNvbmRhcnlPdXRwdXRJZHMgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kuc2Vjb25kLCBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KSk7CisgICAgcmV0dXJuIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDBjNDBjYmIuLjljMzA3ZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtMSw3ICsxLDE3IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKQEAgLTEyLDYgKzIyLDIxIEBACiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImF1ZGlvZmxpbmdlci1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb3BvbGljeS1haWRsLWNwcCIsCisgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMjEsMTAgKzQ2LDE2IEBACiAgICAgICAgICJBdWRpb1BvbGljeS5jcHAiLAogICAgICAgICAiQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwIiwKICAgICAgICAgIkF1ZGlvVm9sdW1lR3JvdXAuY3BwIiwKKyAgICAgICAgIlBvbGljeUFpZGxDb252ZXJzaW9uLmNwcCIKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCkBAIC0zOCwxOCArNjksMjUgQEAKICAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50IiwKIAogICAgIGFpZGw6IHsKICAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImFpZGwiXSwKICAgICAgICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsIiwKKyAgICAgICAgICAgICJmcmFtZXdvcmtzL2F2L2FpZGwiLAogICAgICAgICBdLAogICAgIH0sCiAKQEAgLTU3LDggKzk1LDYgQEAKICAgICAgICAgLy8gQUlETCBmaWxlcyBmb3IgYXVkaW9jbGllbnQgaW50ZXJmYWNlcwogICAgICAgICAvLyBUaGUgaGVhZGVycyBmb3IgdGhlc2UgaW50ZXJmYWNlcyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhbnkgbW9kdWxlcyB0aGF0CiAgICAgICAgIC8vIGluY2x1ZGUgbGliYXVkaW9jbGllbnQsIGF0IHRoZSBwYXRoICJhaWRsL3BhY2thZ2UvcGF0aC9CbkZvby5oIgotICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGxfY2FsbGJhY2siLAotICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGxfcHJpdmF0ZSIsCiAgICAgICAgICI6bGliYXVkaW9jbGllbnRfYWlkbCIsCiAKICAgICAgICAgIkF1ZGlvRWZmZWN0LmNwcCIsCkBAIC02NywxOSArMTAzLDE5IEBACiAgICAgICAgICJBdWRpb1RyYWNrLmNwcCIsCiAgICAgICAgICJBdWRpb1RyYWNrU2hhcmVkLmNwcCIsCiAgICAgICAgICJJQXVkaW9GbGluZ2VyLmNwcCIsCi0gICAgICAgICJJQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCIsCi0gICAgICAgICJJQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCIsCi0gICAgICAgICJJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCIsCi0gICAgICAgICJJQXVkaW9UcmFjay5jcHAiLAotICAgICAgICAiSUVmZmVjdC5jcHAiLAotICAgICAgICAiSUVmZmVjdENsaWVudC5jcHAiLAogICAgICAgICAiVG9uZUdlbmVyYXRvci5jcHAiLAogICAgICAgICAiUGxheWVyQmFzZS5jcHAiLAogICAgICAgICAiUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmNwcCIsCiAgICAgICAgICJUcmFja1BsYXllckJhc2UuY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAogICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYXVkaW9wb2xpY3kiLApAQCAtOTMsMTYgKzEyOSwyNCBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuYmxvZyIsCiAgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlidmlicmF0b3IiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby8iLAogICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlL21lZGlhIiwgImFpZGwiCisgICAgICAgICJpbmNsdWRlL21lZGlhIiwKKyAgICAgICAgImFpZGwiLAogICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLApAQCAtMTEwLDEwICsxNTQsMTYgQEAKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCisgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAiZWZmZWN0LWFpZGwtY3BwIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCisgICAgXSwKIAotICAgIC8vIGZvciBtZW1vcnkgaGVhcCBhbmFseXNpcwogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJlZmZlY3QtYWlkbC1jcHAiLAorICAgICAgICAvLyBmb3IgbWVtb3J5IGhlYXAgYW5hbHlzaXMKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC1jcHAiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCkBAIC0xMjEsMTMgKzE3MSw5MSBAQAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCiAgICAgXSwKICAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZCA6IFsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKIH0KIAorLy8gVGhpcyBpcyBpbnRlbmRlZCBmb3IgY2xpZW50cyBuZWVkaW5nIHRvIGluY2x1ZGUgQWlkbENvbnZlcnNpb25VdGlsLmgsIHdpdGhvdXQgZHJhZ2dpbmcgaW4gYSBsb3Qgb2YgZXh0cmEKKy8vIGRlcGVuZGVuY2llcy4KK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgc3JjczogWyJBaWRsQ29udmVyc2lvbi5jcHAiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbl91dGlsIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic2htZW1jb21wYXQiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICBdLAorICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKwogLy8gQUlETCBpbnRlcmZhY2UgYmV0d2VlbiBsaWJhdWRpb2NsaWVudCBhbmQgZnJhbWV3b3JrLmphcgogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnRfYWlkbCIsCkBAIC0xMzcsMzAgKzI2NSwyMjEgQEAKICAgICBwYXRoOiAiYWlkbCIsCiB9CiAKLS8vIFVzZWQgdG8gc3RyaXAgdGhlICJhaWRsLyIgZnJvbSB0aGUgcGF0aCwgc28gdGhlIGJ1aWxkIHN5c3RlbSBjYW4gcHJlZGljdCB0aGUKLS8vIG91dHB1dCBmaWxlbmFtZS4KLWZpbGVncm91cCB7Ci0gICAgbmFtZTogImxpYmF1ZGlvY2xpZW50X2FpZGxfcHJpdmF0ZSIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsIiwKLSAgICBdLAotICAgIHBhdGg6ICJhaWRsIiwKLX0KLQotLy8gQUlETCBpbnRlcmZhY2UgZm9yIGF1ZGlvIHRyYWNrIGNhbGxiYWNrCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9haWRsX2NhbGxiYWNrIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5haWRsIiwKLSAgICBdLAotICAgIHBhdGg6ICJhaWRsIiwKLX0KLQogYWlkbF9pbnRlcmZhY2UgewogICAgIG5hbWU6ICJjYXB0dXJlX3N0YXRlX2xpc3RlbmVyLWFpZGwiLAogICAgIHVuc3RhYmxlOiB0cnVlLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lDYXB0dXJlU3RhdGVMaXN0ZW5lci5haWRsIiwKICAgICBdLAogfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogImVmZmVjdC1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lFZmZlY3RDbGllbnQuYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbCIsCisgICAgXSwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhdWRpb2NsaWVudC10eXBlcy1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NsaWVudC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbmZpZ0Jhc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db250ZW50VHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0R1YWxNb25vTW9kZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9JbnB1dEZsYWdzLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvRmxhZ3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Nb2RlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZEluZm8uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BhdGNoLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUGxheWJhY2tSYXRlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdEZXZpY2VFeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ01peEV4dC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydEV4dC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Um9sZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU291cmNlVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVW5pcXVlSWRVc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Vc2FnZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFja1NlY29uZGFyeU91dHB1dEluZm8uYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIiwKKyAgICBdLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgICAgICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeS10eXBlcy1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peENhbGxiYWNrRmxhZy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peE1hdGNoQ3JpdGVyaW9uLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peFJvdXRlRmxhZy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peFR5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkTW9kZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvbGljeURldmljZVN0YXRlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VVc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9EZXZpY2VSb2xlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsIiwKKyAgICBdLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgICAgICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogImF1ZGlvZmxpbmdlci1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlUmVjb3JkUmVxdWVzdC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXNwb25zZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9SZW5kZXJQb3NpdGlvbi5haWRsIiwKKworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhdWRpb19jb21tb24tYWlkbCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwiLAorICAgICAgICAiZWZmZWN0LWFpZGwiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbCIsCisgICAgXSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgYmFja2VuZDogeworICAgICAgICBjcHA6IHsKKyAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAiYXVkaW9wb2xpY3ktYWlkbCIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9HZXRJbnB1dEZvckF0dHJSZXNwb25zZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9HZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwiLAorICAgIF0sCisgICAgaW1wb3J0czogWworICAgICAgICAiYXVkaW9fY29tbW9uLWFpZGwiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbCIsCisgICAgICAgICJhdWRpb3BvbGljeS10eXBlcy1haWRsIiwKKyAgICAgICAgImNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsIiwKKyAgICBdLAorCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgICAgICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKaW5kZXggMWVlNjkzMC4uODNiZjVhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCkBAIC0yMCw0OCArMjAsNDYgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KKworI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpIFwKKyAgICB7IGF1dG8gX3RtcCA9ICh4KTsgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKLSAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19jb250ZW50X3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7Ci0gICAgbUF0dHJpYnV0ZXMudXNhZ2UgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKLSAgICBtQXR0cmlidXRlcy5zb3VyY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7Ci0gICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOwotICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC0+cmVhZEludDMyKCkgPT0gMSk7Ci0gICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgewotICAgICAgICBzdGQ6OnN0cmluZyB0YWdzOwotICAgICAgICByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZ0YWdzKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnN0cm5jcHkobUF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdHJjcHkobUF0dHJpYnV0ZXMudGFncywgIiIpOwotICAgIH0KLSAgICBtU3RyZWFtVHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOwotICAgIG1Hcm91cElkID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHBhcmNlbC0+cmVhZFVpbnQzMigpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7CisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4IGFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihhaWRsLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpOworICAgICp0aGlzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMoYWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAotewotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5jb250ZW50X3R5cGUpKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMudXNhZ2UpKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuc291cmNlKSk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmZsYWdzKSk7Ci0gICAgaWYgKHN0cmxlbihtQXR0cmlidXRlcy50YWdzKSA9PSAwKSB7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMSk7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtQXR0cmlidXRlcy50YWdzKTsKLSAgICB9Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7Ci0gICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXggYWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0F0dHJpYnV0ZXNfQXVkaW9BdHRyaWJ1dGVzRXgoKnRoaXMpKTsKKyAgICByZXR1cm4gYWlkbC53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4PgorbGVnYWN5MmFpZGxfQXVkaW9BdHRyaWJ1dGVzX0F1ZGlvQXR0cmlidXRlc0V4KGNvbnN0IEF1ZGlvQXR0cmlidXRlcyYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4IGFpZGw7CisgICAgYWlkbC5hdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGxlZ2FjeS5nZXRBdHRyaWJ1dGVzKCkpKTsKKyAgICBhaWRsLnN0cmVhbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShsZWdhY3kuZ2V0U3RyZWFtVHlwZSgpKSk7CisgICAgYWlkbC5ncm91cElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3QobGVnYWN5LmdldEdyb3VwSWQoKSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvQXR0cmlidXRlcz4KK2FpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0V4X0F1ZGlvQXR0cmlidXRlcyhjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGFpZGwpIHsKKyAgICByZXR1cm4gQXVkaW9BdHRyaWJ1dGVzKFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3ZvbHVtZV9ncm91cF90KGFpZGwuZ3JvdXBJZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLnN0cmVhbVR5cGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwuYXR0cmlidXRlcykpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IDNlYWQ2Y2IuLjZhZDU0ODMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTIzLDc3ICsyMyw0NSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCi0jaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9TaG1lbUNvbXBhdC5oPgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotCisjZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgXAorICAgIH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewordXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7Cit1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlOworCituYW1lc3BhY2UgeworCisvLyBDb3B5IGZyb20gYSByYXcgcG9pbnRlciArIHNpemUgaW50byBhIHZlY3RvciBvZiBieXRlcy4KK3ZvaWQgYXBwZW5kVG9CdWZmZXIoY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIpIHsKKyAgICBjb25zdCB1aW50OF90KiBwID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YSk7CisgICAgYnVmZmVyLT5pbnNlcnQoYnVmZmVyLT5lbmQoKSwgcCwgcCArIHNpemUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Qcm9iZShmYWxzZSksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCitBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpCisgICAgOiBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpCiB7CiB9CiAKLQotQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUKLSAgICAgICAgICAgICAgICApCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtUHJvYmUoZmFsc2UpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQotewotICAgIEF1dG9NdXRleCBsb2NrKG1Db25zdHJ1Y3RMb2NrKTsKLSAgICBtU3RhdHVzID0gc2V0KHR5cGUsIHV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOwotfQotCi1BdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAotICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAotICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgYm9vbCBwcm9iZQotICAgICAgICAgICAgICAgICkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Qcm9iZShmYWxzZSksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCi17Ci0gICAgZWZmZWN0X3V1aWRfdCB0eXBlOwotICAgIGVmZmVjdF91dWlkX3QgKnBUeXBlID0gTlVMTDsKLSAgICBlZmZlY3RfdXVpZF90IHV1aWQ7Ci0gICAgZWZmZWN0X3V1aWRfdCAqcFV1aWQgPSBOVUxMOwotCi0gICAgQUxPR1YoIkNvbnN0cnVjdG9yIHN0cmluZ1xuIC0gdHlwZTogJXNcbiAtIHV1aWQ6ICVzIiwgdHlwZVN0ciwgdXVpZFN0cik7Ci0KLSAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBwVHlwZSA9ICZ0eXBlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcFV1aWQgPSAmdXVpZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEF1dG9NdXRleCBsb2NrKG1Db25zdHJ1Y3RMb2NrKTsKLSAgICBtU3RhdHVzID0gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBpbywgZGV2aWNlLCBwcm9iZSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCkBAIC0xMDQsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICBib29sIHByb2JlKQogewotICAgIHNwPElFZmZlY3Q+IGlFZmZlY3Q7CisgICAgc3A8bWVkaWE6OklFZmZlY3Q+IGlFZmZlY3Q7CiAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICBpbnQgZW5hYmxlZDsKIApAQCAtMTM5LDEzICsxMDcsMzUgQEAKICAgICBtRGVzY3JpcHRvci50eXBlID0gKih0eXBlICE9IE5VTEwgPyB0eXBlIDogRUZGRUNUX1VVSURfTlVMTCk7CiAgICAgbURlc2NyaXB0b3IudXVpZCA9ICoodXVpZCAhPSBOVUxMID8gdXVpZCA6IEVGRkVDVF9VVUlEX05VTEwpOwogCisgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCiAgICAgbUlFZmZlY3RDbGllbnQgPSBuZXcgRWZmZWN0Q2xpZW50KHRoaXMpOwotICAgIG1DbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWQpKTsKKyAgICBwaWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKIAotICAgIGlFZmZlY3QgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZUVmZmVjdCgoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKSZtRGVzY3JpcHRvciwKLSAgICAgICAgICAgIG1JRWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgaW8sIG1TZXNzaW9uSWQsIGRldmljZSwgbU9wUGFja2FnZU5hbWUsIG1DbGllbnRQaWQsCi0gICAgICAgICAgICBwcm9iZSwgJm1TdGF0dXMsICZtSWQsICZlbmFibGVkKTsKKyAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCByZXF1ZXN0OworICAgIHJlcXVlc3QuZGVzYyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9lZmZlY3RfZGVzY3JpcHRvcl90X0VmZmVjdERlc2NyaXB0b3IobURlc2NyaXB0b3IpKTsKKyAgICByZXF1ZXN0LmNsaWVudCA9IG1JRWZmZWN0Q2xpZW50OworICAgIHJlcXVlc3QucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICByZXF1ZXN0Lm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbykpOworICAgIHJlcXVlc3Quc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChtU2Vzc2lvbklkKSk7CisgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoZGV2aWNlKSk7CisgICAgcmVxdWVzdC5hdHRyaWJ1dGlvblNvdXJjZSA9IG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsKKyAgICByZXF1ZXN0LnByb2JlID0gcHJvYmU7CisKKyAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICBtU3RhdHVzID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgJnJlc3BvbnNlKTsKKworICAgIGlmIChtU3RhdHVzID09IE9LKSB7CisgICAgICAgIG1JZCA9IHJlc3BvbnNlLmlkOworICAgICAgICBlbmFibGVkID0gcmVzcG9uc2UuZW5hYmxlZDsKKyAgICAgICAgaUVmZmVjdCA9IHJlc3BvbnNlLmVmZmVjdDsKKyAgICAgICAgbURlc2NyaXB0b3IgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChyZXNwb25zZS5kZXNjKSk7CisgICAgfQogCiAgICAgLy8gSW4gcHJvYmUgbW9kZSwgd2Ugc3RvcCBoZXJlIGFuZCByZXR1cm4gdGhlIHN0YXR1czogdGhlIElFZmZlY3QgaW50ZXJmYWNlIHRvCiAgICAgLy8gYXVkaW8gZmxpbmdlciB3aWxsIG5vdCBiZSByZXRhaW5lZC4gaW5pdENoZWNrKCkgd2lsbCByZXR1cm4gdGhlIGNyZWF0aW9uIHN0YXR1cwpAQCAtMTY2LDggKzE1NiwxMCBAQAogCiAgICAgbUVuYWJsZWQgPSAodm9sYXRpbGUgaW50MzJfdCllbmFibGVkOwogCi0gICAgY2JsayA9IGlFZmZlY3QtPmdldENibGsoKTsKLSAgICBpZiAoY2JsayA9PSAwKSB7CisgICAgaWYgKG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uIHNobWVtOworICAgICAgICAgICAgIWlFZmZlY3QtPmdldENibGsoJnNobWVtKS5pc09rKCkKKyAgICAgICAgICAgIHx8ICFjb252ZXJ0U2hhcmVkRmlsZVJlZ2lvblRvSU1lbW9yeShzaG1lbSwgJmNibGspCisgICAgICAgICAgICB8fCBjYmxrID09IDApIHsKICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CkBAIC0xODUsMTUgKzE3Nyw0MyBAQAogCiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoaUVmZmVjdCktPmxpbmtUb0RlYXRoKG1JRWZmZWN0Q2xpZW50KTsKICAgICBBTE9HVigic2V0KCkgJXAgT0sgZWZmZWN0OiAlcyBpZDogJWQgc3RhdHVzICVkIGVuYWJsZWQgJWQgcGlkICVkIiwgdGhpcywgbURlc2NyaXB0b3IubmFtZSwgbUlkLAotICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQsIG1DbGllbnRQaWQpOworICAgICAgICAgICAgbVN0YXR1cywgbUVuYWJsZWQsIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQpOwogCiAgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihtU2Vzc2lvbklkKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIHBpZCwgdWlkKTsKICAgICB9CiAKICAgICByZXR1cm4gbVN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCisgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKKyAgICAgICAgICAgICAgICBib29sIHByb2JlKQoreworICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IG51bGxwdHI7CisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gbnVsbHB0cjsKKworICAgIEFMT0dWKCJBdWRpb0VmZmVjdDo6c2V0IHN0cmluZ1xuIC0gdHlwZTogJXNcbiAtIHV1aWQ6ICVzIiwKKyAgICAgICAgICAgIHR5cGVTdHIgPyB0eXBlU3RyIDogIm51bGxwdHIiLCB1dWlkU3RyID8gdXVpZFN0ciA6ICJudWxscHRyIik7CisKKyAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgeworICAgICAgICBwVHlwZSA9ICZ0eXBlOworICAgIH0KKyAgICBpZiAoc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKSA9PSBOT19FUlJPUikgeworICAgICAgICBwVXVpZCA9ICZ1dWlkOworICAgIH0KKworICAgIHJldHVybiBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKK30KKwogCiBBdWRpb0VmZmVjdDo6fkF1ZGlvRWZmZWN0KCkKIHsKQEAgLTIwMSw3ICsyMjEsOCBAQAogCiAgICAgaWYgKCFtUHJvYmUgJiYgKG1TdGF0dXMgPT0gTk9fRVJST1IgfHwgbVN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykpIHsKICAgICAgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JRWZmZWN0ICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1JRWZmZWN0LT5kaXNjb25uZWN0KCk7CkBAIC0yNDIsMTUgKzI2MywxOSBAQAogICAgIH0KIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChlbmFibGVkICE9IG1FbmFibGVkKSB7CisgICAgICAgIFN0YXR1cyBiczsKKwogICAgICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICAgICAgQUxPR1YoImVuYWJsZSAlcCIsIHRoaXMpOwotICAgICAgICAgICAgc3RhdHVzID0gbUlFZmZlY3QtPmVuYWJsZSgpOworICAgICAgICAgICAgYnMgPSBtSUVmZmVjdC0+ZW5hYmxlKCZzdGF0dXMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoImRpc2FibGUgJXAiLCB0aGlzKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1JRWZmZWN0LT5kaXNhYmxlKCk7CisgICAgICAgICAgICBicyA9IG1JRWZmZWN0LT5kaXNhYmxlKCZzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIGlmICghYnMuaXNPaygpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhicyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwpAQCAtMjgzLDcgKzMwOCwyMCBAQAogICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUlFZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgY21kU2l6ZSwgY21kRGF0YSwgcmVwbHlTaXplLCByZXBseURhdGEpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGE7CisgICAgYXBwZW5kVG9CdWZmZXIoY21kRGF0YSwgY21kU2l6ZSwgJmRhdGEpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3BvbnNlOworCisgICAgU3RhdHVzIGJzID0gbUlFZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgZGF0YSwgKnJlcGx5U2l6ZSwgJnJlc3BvbnNlLCAmc3RhdHVzKTsKKyAgICBpZiAoIWJzLmlzT2soKSkgeworICAgICAgICBzdGF0dXMgPSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhicyk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbWVtY3B5KHJlcGx5RGF0YSwgcmVzcG9uc2UuZGF0YSgpLCByZXNwb25zZS5zaXplKCkpOworICAgICAgICAqcmVwbHlTaXplID0gcmVzcG9uc2Uuc2l6ZSgpOworICAgIH0KIAogICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfRU5BQkxFIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9ESVNBQkxFKSB7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTI5OCw3ICszMzYsNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnNldFBhcmFtZXRlcihlZmZlY3RfcGFyYW1fdCAqcGFyYW0pCiB7CiAgICAgaWYgKG1Qcm9iZSkgewpAQCAtMzEyLDE0ICszNDksMjcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKGludCk7CiAgICAgdWludDMyX3QgcHNpemUgPSAoKHBhcmFtLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpICsgcGFyYW0tPnZzaXplOwogCiAgICAgQUxPR1YoInNldFBhcmFtZXRlcjogcGFyYW06ICVkLCBwYXJhbTI6ICVkIiwgKihpbnQgKilwYXJhbS0+ZGF0YSwKICAgICAgICAgICAgIChwYXJhbS0+cHNpemUgPT0gOCkgPyAqKChpbnQgKilwYXJhbS0+ZGF0YSArIDEpOiAtMSk7CiAKLSAgICByZXR1cm4gbUlFZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHNpemVvZiAoZWZmZWN0X3BhcmFtX3QpICsgcHNpemUsIHBhcmFtLCAmc2l6ZSwKLSAgICAgICAgICAgICZwYXJhbS0+c3RhdHVzKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbWQ7CisgICAgYXBwZW5kVG9CdWZmZXIocGFyYW0sIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwc2l6ZSwgJmNtZCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIFN0YXR1cyBicyA9IG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYnMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBhc3NlcnQocmVzcG9uc2Uuc2l6ZSgpID09IHNpemVvZihpbnQpKTsKKyAgICBtZW1jcHkoJnBhcmFtLT5zdGF0dXMsIHJlc3BvbnNlLmRhdGEoKSwgcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0UGFyYW1ldGVyRGVmZXJyZWQoZWZmZWN0X3BhcmFtX3QgKnBhcmFtKQpAQCAtMzY0LDggKzQxNCwxOCBAQAogICAgIGlmIChtQ2Jsay0+Y2xpZW50SW5kZXggPT0gMCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHVpbnQzMl90IHNpemUgPSAwOwotICAgIHJldHVybiBtSUVmZmVjdC0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQsIDAsIE5VTEwsICZzaXplLCBOVUxMKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbWQ7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIFN0YXR1cyBicyA9IG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYnMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6Z2V0UGFyYW1ldGVyKGVmZmVjdF9wYXJhbV90ICpwYXJhbSkKQEAgLTM4Nyw4ICs0NDcsMTggQEAKICAgICB1aW50MzJfdCBwc2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAoKHBhcmFtLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpICsKICAgICAgICAgICAgIHBhcmFtLT52c2l6ZTsKIAotICAgIHJldHVybiBtSUVmZmVjdC0+Y29tbWFuZChFRkZFQ1RfQ01EX0dFVF9QQVJBTSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBhcmFtLT5wc2l6ZSwgcGFyYW0sCi0gICAgICAgICAgICAmcHNpemUsIHBhcmFtKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY21kOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3BvbnNlOworICAgIGFwcGVuZFRvQnVmZmVyKHBhcmFtLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcGFyYW0tPnBzaXplLCAmY21kKTsKKworICAgIFN0YXR1cyBicyA9IG1JRWZmZWN0LT5jb21tYW5kKEVGRkVDVF9DTURfR0VUX1BBUkFNLCBjbWQsIHBzaXplLCAmcmVzcG9uc2UsICZzdGF0dXMpOworICAgIGlmICghYnMuaXNPaygpKSB7CisgICAgICAgIHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGJzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgbWVtY3B5KHBhcmFtLCByZXNwb25zZS5kYXRhKCksIHJlc3BvbnNlLnNpemUoKSk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogCkBAIC00MzYsMTkgKzUwNiwxOCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0VmZmVjdDo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXBseURhdGEpCit2b2lkIEF1ZGlvRWZmZWN0Ojpjb21tYW5kRXhlY3V0ZWQoaW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXBseURhdGEpCiB7Ci0gICAgaWYgKGNtZERhdGEgPT0gTlVMTCB8fCByZXBseURhdGEgPT0gTlVMTCkgeworICAgIGlmIChjbWREYXRhLmVtcHR5KCkgfHwgcmVwbHlEYXRhLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChtQ2JmICE9IE5VTEwgJiYgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTSkgewotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqY21kID0gKGVmZmVjdF9wYXJhbV90ICopY21kRGF0YTsKLSAgICAgICAgY21kLT5zdGF0dXMgPSAqKGludDMyX3QgKilyZXBseURhdGE7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNtZERhdGFDb3B5KGNtZERhdGEpOworICAgICAgICBlZmZlY3RfcGFyYW1fdCogY21kID0gcmVpbnRlcnByZXRfY2FzdDxlZmZlY3RfcGFyYW1fdCAqPihjbWREYXRhQ29weS5kYXRhKCkpOworICAgICAgICBjbWQtPnN0YXR1cyA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QgKj4ocmVwbHlEYXRhLmRhdGEoKSk7CiAgICAgICAgIG1DYmYoRVZFTlRfUEFSQU1FVEVSX0NIQU5HRUQsIG1Vc2VyRGF0YSwgY21kKTsKICAgICB9CiB9CkBAIC00ODMsOSArNTUyLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKIHsKKyAgICBpZiAoZGVzY3JpcHRvcnMgPT0gbnVsbHB0ciB8fCBjb3VudCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CisKKyAgICBpbnQzMl90IGF1ZGlvU2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QoYXVkaW9TZXNzaW9uKSk7CisgICAgbWVkaWE6OkludCBjb3VudEFpZGw7CisgICAgY291bnRBaWRsLnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oKmNvdW50KSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+IHJldEFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb1Nlc3Npb25BaWRsLCAmY291bnRBaWRsLCAmcmV0QWlkbCkpKTsKKyAgICAqY291bnQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oY291bnRBaWRsLnZhbHVlKSk7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihjb252ZXJ0UmFuZ2UocmV0QWlkbC5iZWdpbigpLCByZXRBaWRsLmVuZCgpLCBkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpCkBAIC01MjUsNyArNjA4LDE4IEBACiAgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKICAgICB9CiAKLSAgICByZXR1cm4gYXBzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworICAgIG1lZGlhOjpBdWRpb1V1aWQgdHlwZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodHlwZSkpOworICAgIG1lZGlhOjpBdWRpb1V1aWQgdXVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQodXVpZCkpOworICAgIHN0ZDo6c3RyaW5nIG9wUGFja2FnZU5hbWVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX1N0cmluZzE2X3N0cmluZyhvcFBhY2thZ2VOYW1lKSk7CisgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShzb3VyY2UpKTsKKyAgICBpbnQzMl90IHJldEFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCh0eXBlQWlkbCwgb3BQYWNrYWdlTmFtZUFpZGwsIHV1aWRBaWRsLCBwcmlvcml0eSwgc291cmNlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0QWlkbCkpKTsKKyAgICAqaWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QocmV0QWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKQEAgLTU1Nyw3ICs2NTEsMTggQEAKICAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOwogICAgIH0KIAotICAgIHJldHVybiBhcHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKKyAgICBtZWRpYTo6QXVkaW9VdWlkIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHR5cGUpKTsKKyAgICBtZWRpYTo6QXVkaW9VdWlkIHV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKHV1aWQpKTsKKyAgICBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcob3BQYWNrYWdlTmFtZSkpOworICAgIG1lZGlhOjpBdWRpb1VzYWdlIHVzYWdlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UodXNhZ2UpKTsKKyAgICBpbnQzMl90IHJldEFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCh0eXBlQWlkbCwgb3BQYWNrYWdlTmFtZUFpZGwsIHV1aWRBaWRsLCBwcmlvcml0eSwgdXNhZ2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXRBaWRsKSkpOworICAgICppZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChyZXRBaWRsKSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKQEAgLTU2NSw3ICs2NzAsOCBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICByZXR1cm4gYXBzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKKyAgICBpbnQzMl90IGlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChpZCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWRBaWRsKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQpAQCAtNTczLDcgKzY3OSw4IEBACiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIHJldHVybiBhcHMtPnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpOworICAgIGludDMyX3QgaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KGlkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZEFpZGwpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IDA1MjIwOTkuLmMyZjcyMjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKQEAgLTg1LDcgKzg1LDcgQEAKICAgICBtRGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgbURldmljZUFkZHJlc3MgPSBwYXJjZWwtPnJlYWRTdHJpbmc4KCk7CiAgICAgbUNiRmxhZ3MgPSAodWludDMyX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICBtQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlID0gcGFyY2VsLT5yZWFkQm9vbCgpOworICAgIG1BbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZSA9IHBhcmNlbC0+cmVhZEJvb2woKTsKICAgICBtVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQgPSBwYXJjZWwtPnJlYWRCb29sKCk7CiAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgaWYgKHNpemUgPiBNQVhfQ1JJVEVSSUFfUEVSX01JWCkgewpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1EZXZpY2VUeXBlKTsKICAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtRGV2aWNlQWRkcmVzcyk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYkZsYWdzKTsKLSAgICBwYXJjZWwtPndyaXRlQm9vbChtQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlKTsKKyAgICBwYXJjZWwtPndyaXRlQm9vbChtQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmUpOwogICAgIHBhcmNlbC0+d3JpdGVCb29sKG1Wb2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZCk7CiAgICAgc2l6ZV90IHNpemUgPSBtQ3JpdGVyaWEuc2l6ZSgpOwogICAgIGlmIChzaXplID4gTUFYX0NSSVRFUklBX1BFUl9NSVgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCBjZmY3MmZkLi5mOTgwMjdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0xOSw1NSArMTksNDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KKworI2RlZmluZSBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHgpIFwKKyAgICB7IGF1dG8gX3RtcCA9ICh4KTsgaWYgKF90bXAgIT0gT0spIHJldHVybiBfdG1wOyB9CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpOwotICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGU7Ci0gICAgICAgIHJldCA9IGF0dHJpYnV0ZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOwotICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHJpYnV0ZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKK3N0YXR1c190IEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneSBhaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoYWlkbC5yZWFkRnJvbVBhcmNlbChwYXJjZWwpKTsKKyAgICAqdGhpcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qcm9kdWN0U3RyYXRlZ3koYWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Ci17Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1JZCkpOwotICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSk7Ci0gICAgc2l6ZV90IHNpemUgPSBtQXVkaW9BdHRyaWJ1dGVzLnNpemUoKTsKLSAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgeworICAgIG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneSBhaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZHVjdFN0cmF0ZWd5KCp0aGlzKSk7CisgICAgcmV0dXJuIGFpZGwud3JpdGVUb1BhcmNlbChwYXJjZWwpOworfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZShtQXVkaW9BdHRyaWJ1dGVzW2ldKTsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gYXR0cmlidXRlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgZmluYWxTaXplLS07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7Ci0gICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihmaW5hbFNpemUpOwotICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZHVjdFN0cmF0ZWd5PgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9kdWN0U3RyYXRlZ3koY29uc3QgQXVkaW9Qcm9kdWN0U3RyYXRlZ3kmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneSBhaWRsOworICAgIGFpZGwubmFtZSA9IGxlZ2FjeS5nZXROYW1lKCk7CisgICAgYWlkbC5hdWRpb0F0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeD4+KAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvQXR0cmlidXRlc19BdWRpb0F0dHJpYnV0ZXNFeCkpOworICAgIGFpZGwuaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfcHJvZHVjdF9zdHJhdGVneV90X2ludDMyX3QobGVnYWN5LmdldElkKCkpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2R1Y3RTdHJhdGVneT4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneSYgYWlkbCkgeworICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgICAgIGFpZGwubmFtZSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsLmF1ZGlvQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMpKSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3Byb2R1Y3Rfc3RyYXRlZ3lfdChhaWRsLmlkKSkpOwogfQogCiAvLyBLZWVwIGluIHN5bmMgd2l0aCBhbmRyb2lkL21lZGlhL2F1ZGlvcG9saWN5L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5I2F0dHJpYnV0ZU1hdGNoZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCBkZjQ3ZGVmLi5hMWQzYmRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0zOCw2ICszOCwxMCBAQAogI2RlZmluZSBXQUlUX1BFUklPRF9NUyAgICAgICAgICAxMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7Cit1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIHN0YXRpYwpAQCAtMTAzLDYgKzEwNyw3IEBACiAgICAgICAgIG1NZXRyaWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJsYXN0RXJyb3IuY29kZSIsIChpbnQzMl90KW1MYXN0RXJyb3IpOwogICAgICAgICBtTWV0cmljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJsYXN0RXJyb3IuYXQiLCBtTGFzdEVycm9yRnVuYy5jX3N0cigpKTsKICAgICB9CisgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAibG9nU2Vzc2lvbklkIiwgcmVjb3JkLT5tTG9nU2Vzc2lvbklkLmNfc3RyKCkpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqc3RhdGVUb1N0cmluZyhib29sIGFjdGl2ZSkgewpAQCAtMTIxLDEyICsxMjYsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLUF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZChjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKLSAgICA6IG1BY3RpdmUoZmFsc2UpLCBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKLSAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCi0gICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLCBtUm91dGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCi0gICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24oTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCksCitBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmY2xpZW50KQorICAgIDogbUFjdGl2ZShmYWxzZSksIG1TdGF0dXMoTk9fSU5JVCksIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZShjbGllbnQpLAorICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLAorICAgICAgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLCBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVNlbGVjdGVkTWljRGlyZWN0aW9uKE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQpLAogICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24oTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKQogewogfQpAQCAtMTM2LDcgKzE0MCw3IEBACiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBjbGllbnQsCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKQEAgLTE0NCwyNCArMTQ4LDI0IEBACiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlLAogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAogICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pCiAgICAgOiBtQWN0aXZlKGZhbHNlKSwKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksCi0gICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZShjbGllbnQpLAogICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1Qcm94eShOVUxMKQogeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QobUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnVpZCkpOworICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QobUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnBpZCkpOwogICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKLSAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uLCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pOworICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkLCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgIG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbik7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtMTc3LDIxICsxODEsOSBAQAogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KW1TdGF0dXMpCiAgICAgICAgIC5yZWNvcmQoKTsKIAorICAgIHN0b3BBbmRKb2luQ2FsbGJhY2tzKCk7IC8vIGNoZWNrcyBtU3RhdHVzCisKICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBjYWxsYmFjayBmdW5jdGlvbiBleGl0cyBpbiB0aGUgY2FzZSB3aGVyZQotICAgICAgICAvLyBpdCBpcyBsb29waW5nIG9uIGJ1ZmZlciBlbXB0eSBjb25kaXRpb24gaW4gb2J0YWluQnVmZmVyKCkuCi0gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgY2FsbGJhY2sgdGhyZWFkIHdpbGwgbmV2ZXIgZXhpdC4KLSAgICAgICAgc3RvcCgpOwotICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7Ci0gICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAvLyBzZWUgY29tbWVudCBpbiBBdWRpb1JlY29yZC5oCi0gICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotICAgICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAotICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwotICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKQEAgLTE5OSwxMCArMTkxLDMyIEBACiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2Vzc2lvbklkKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgcGlkKTsKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9SZWNvcmQ6OnN0b3BBbmRKb2luQ2FsbGJhY2tzKCkgeworICAgIC8vIFByZXZlbnQgbnVsbHB0ciBjcmFzaCBpZiBpdCBkaWQgbm90IG9wZW4gcHJvcGVybHkuCisgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybjsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGNhbGxiYWNrIGZ1bmN0aW9uIGV4aXRzIGluIHRoZSBjYXNlIHdoZXJlCisgICAgLy8gaXQgaXMgbG9vcGluZyBvbiBidWZmZXIgZW1wdHkgY29uZGl0aW9uIGluIG9idGFpbkJ1ZmZlcigpLgorICAgIC8vIE90aGVyd2lzZSB0aGUgY2FsbGJhY2sgdGhyZWFkIHdpbGwgbmV2ZXIgZXhpdC4KKyAgICBzdG9wKCk7CisgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CisgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXQoKTsgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvUmVjb3JkLmgKKyAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLmNsZWFyKCk7CisgICAgfQorICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIFRoaXMgbWF5IG5vdCBzdG9wIGFsbCBvZiB0aGVzZSBkZXZpY2UgY2FsbGJhY2tzIQorICAgICAgICAvLyBUT0RPOiBBZGQgc29tZSBzb3J0IG9mIHByb3RlY3Rpb24uCisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCwgbVBvcnRJZCk7CisgICAgfQorfQogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldCgKICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCkBAIC0yMjEsMjYgKzIzNSw0MSBAQAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCi0gICAgICAgIGZsb2F0IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbikKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uLAorICAgICAgICBpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKLSAgICBwaWRfdCBjYWxsaW5nUGlkOwotICAgIHBpZF90IG15UGlkOwogCiAgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KICAgICBBTE9HVigiJXMoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKLSAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBvcFBhY2thZ2VOYW1lICVzICIKKyAgICAgICAgICAibm90aWZpY2F0aW9uRnJhbWVzICV1LCBzZXNzaW9uSWQgJWQsIHRyYW5zZmVyVHlwZSAlZCwgZmxhZ3MgJSN4LCBhdHRyaWJ1dGlvblNvdXJjZSAlcyIKICAgICAgICAgICAidWlkICVkLCBwaWQgJWQiLAogICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOworICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSwgdWlkLCBwaWQpOworCisgICAgLy8gVE9ETyBiLzE4MjM5MjU1MzogcmVmYWN0b3Igb3IgcmVtb3ZlCisgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBwaWRfdCBteVBpZCA9IGdldHBpZCgpOworICAgIHBpZF90IGFkalBpZCA9IHBpZDsKKyAgICBpZiAocGlkID09IC0xIHx8IChjYWxsaW5nUGlkICE9IG15UGlkKSkgeworICAgICAgICBhZGpQaWQgPSBjYWxsaW5nUGlkOworICAgIH0KKyAgICBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChhZGpQaWQpKTsKKworICAgIHVpZF90IGFkalVpZCA9IHVpZDsKKyAgICBpZiAodWlkID09IC0xIHx8IChjYWxsaW5nUGlkICE9IG15UGlkKSkgeworICAgICAgICBhZGpVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfQorICAgIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGFkalVpZCkpOwogCiAgICAgbVRyYWNrZXIucmVzZXQobmV3IFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpKTsKIAogICAgIG1TZWxlY3RlZERldmljZUlkID0gc2VsZWN0ZWREZXZpY2VJZDsKICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBzZWxlY3RlZE1pY0RpcmVjdGlvbjsKICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbjsKKyAgICBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNczsKIAogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgpAQCAtMjc5LDcgKzMwOCw4IEBACiAgICAgICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSA9IGlucHV0U291cmNlOwogICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAgICAgICAgICAgICAgICB8fCBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuZmxhZ3MgfCBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCkBAIC0zMjgsMTkgKzM1OCw2IEBACiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAotICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgbXlQaWQgPSBnZXRwaWQoKTsKLSAgICBpZiAodWlkID09IEFVRElPX1VJRF9JTlZBTElEIHx8IChjYWxsaW5nUGlkICE9IG15UGlkKSkgewotICAgICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7Ci0gICAgfQotICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBwaWQ7Ci0gICAgfQotCiAgICAgbU9yaWdGbGFncyA9IG1GbGFncyA9IGZsYWdzOwogICAgIG1DYmYgPSBjYmY7CiAKQEAgLTM1Myw3ICszNzAsNyBAQAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCiAgICAgewogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovKTsKICAgICB9CiAKICAgICBBTE9HVigiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKQEAgLTM3NCw3ICszOTEsNyBAQAogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CiAgICAgbU5ld1Bvc2l0aW9uID0gMDsKICAgICBtVXBkYXRlUGVyaW9kID0gMDsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgYWRqUGlkLCBhZGpVaWQpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluT3ZlcnJ1biA9IGZhbHNlOwpAQCAtNDQwLDcgKzQ1Nyw3IEBACiAgICAgbUFjdGl2ZSA9IHRydWU7CiAKICAgICBpZiAoIShmbGFncyAmIENCTEtfSU5WQUxJRCkpIHsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvUmVjb3JkLT5zdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobUF1ZGlvUmVjb3JkLT5zdGFydChldmVudCwgdHJpZ2dlclNlc3Npb24pKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgZmxhZ3MgfD0gQ0JMS19JTlZBTElEOwogICAgICAgICB9CkBAIC03MzEsMTcgKzc0OCwxOCBAQAogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1Mb2NrIGhlbGQKLXN0YXR1c190IEF1ZGlvUmVjb3JkOjpjcmVhdGVSZWNvcmRfbChjb25zdCBNb2R1bG88dWludDMyX3Q+ICZlcG9jaCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6Y3JlYXRlUmVjb3JkX2woY29uc3QgTW9kdWxvPHVpbnQzMl90PiAmZXBvY2gpCiB7CiAgICAgY29uc3QgaW50NjRfdCBiZWdpbk5zID0gc3lzdGVtVGltZSgpOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRJbnB1dCBpbnB1dDsKICAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRPdXRwdXQgb3V0cHV0OwogICAgIGF1ZGlvX3Nlc3Npb25fdCBvcmlnaW5hbFNlc3Npb25JZDsKLSAgICBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiByZWNvcmQ7CiAgICAgdm9pZCAqaU1lbVBvaW50ZXI7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrOwogICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4Q3JlYXRlQXR0ZW1wdHMgPSAzOworICAgIGludDMyX3QgcmVtYWluaW5nQXR0ZW1wdHMgPSBrTWF4Q3JlYXRlQXR0ZW1wdHM7CiAKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CkBAIC03ODMsMTUgKzgwMSwxMyBAQAogICAgIGlucHV0LmNvbmZpZy5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7CiAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQgPSBtQ2xpZW50VWlkOwotICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID0gbUNsaWVudFBpZDsKKyAgICBpbnB1dC5jbGllbnRJbmZvLmF0dHJpYnV0aW9uU291cmNlID0gbUNsaWVudEF0dHJpYnV0aW9uU291cmNlOwogICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gLTE7CiAgICAgaWYgKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAobUF1ZGlvUmVjb3JkVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkID0gbUF1ZGlvUmVjb3JkVGhyZWFkLT5nZXRUaWQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpbnB1dC5vcFBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKICAgICBpbnB1dC5yaWlkID0gbVRyYWNrZXItPmdldFJpaWQoKTsKIAogICAgIGlucHV0LmZsYWdzID0gbUZsYWdzOwpAQCAtODAyLDE3ICs4MTgsMjkgQEAKICAgICBpbnB1dC5zZWxlY3RlZERldmljZUlkID0gbVNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgaW5wdXQuc2Vzc2lvbklkID0gbVNlc3Npb25JZDsKICAgICBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CisgICAgaW5wdXQubWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXM7CiAKLSAgICByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPmNyZWF0ZVJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICBkbyB7CisgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVSZWNvcmQoVkFMVUVfT1JfRkFUQUwoaW5wdXQudG9BaWRsKCkpLCByZXNwb25zZSk7CisgICAgICAgIG91dHB1dCA9IFZBTFVFX09SX0ZBVEFMKElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZE91dHB1dDo6ZnJvbUFpZGwocmVzcG9uc2UpKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyAhPSBGQUlMRURfVFJBTlNBQ1RJT04gfHwgLS1yZW1haW5pbmdBdHRlbXB0cyA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFJTEVEX1RSQU5TQUNUSU9OIGhhcHBlbnMgdW5kZXIgdmVyeSBzcGVjaWZpYyBjb25kaXRpb25zIGNhdXNpbmcgYSBzdGF0ZSBtaXNtYXRjaAorICAgICAgICAvLyBiZXR3ZWVuIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFuZCBhdWRpbyBmbGluZ2VyIGR1cmluZyB0aGUgaW5wdXQgc3RyZWFtIG9wZW4gc2VxdWVuY2UKKyAgICAgICAgLy8gYW5kIGNhbiBiZSByZWNvdmVyZWQgYnkgcmV0cnlpbmcuCisgICAgICAgIC8vIExlYXZlIHRpbWUgZm9yIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZyBhbmQgcmFuZG9taXplIGRlbGF5CisgICAgICAgIC8vIHRvIHJlZHVjZSB0aGUgcHJvYmFiaWxpdHkgb2YgY29uY3VycmVudCByZXRyaWVzIGluIGxvY2tlZCBzdGVwcy4KKyAgICAgICAgdXNsZWVwKCgyMCArIHJhbmQoKSAlIDMwKSAqIDEwMDAwKTsKKyAgICB9IHdoaWxlICgxKTsKIAotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0gICAgQUxPR19BU1NFUlQocmVjb3JkICE9IDApOworICAgIEFMT0dfQVNTRVJUKG91dHB1dC5hdWRpb1JlY29yZCAhPSAwKTsKIAogICAgIC8vIEF1ZGlvRmxpbmdlciBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBJL08gaGFuZGxlLAogICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KQEAgLTg3MCw3ICs4OTgsNyBAQAogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9Ci0gICAgbUF1ZGlvUmVjb3JkID0gcmVjb3JkOworICAgIG1BdWRpb1JlY29yZCA9IG91dHB1dC5hdWRpb1JlY29yZDsKICAgICBtQ2Jsa01lbW9yeSA9IG91dHB1dC5jYmxrOwogICAgIG1CdWZmZXJNZW1vcnkgPSBvdXRwdXQuYnVmZmVyczsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CkBAIC05MDAsNiArOTI4LDEwIEBACiAgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5pbnB1dElkLCBvdXRwdXQucG9ydElkKTsKICAgICB9CiAKKyAgICBpZiAoIW1TaGFyZWRBdWRpb1BhY2thZ2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgbUF1ZGlvUmVjb3JkLT5zaGFyZUF1ZGlvSGlzdG9yeShtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSwgbVNoYXJlZEF1ZGlvU3RhcnRNcyk7CisgICAgfQorCiAgICAgbVBvcnRJZCA9IG91dHB1dC5wb3J0SWQ7CiAgICAgLy8gV2UgcmV0YWluIGEgY29weSBvZiB0aGUgSS9PIGhhbmRsZSwgYnV0IGRvbid0IG93biB0aGUgcmVmZXJlbmNlCiAgICAgbUlucHV0ID0gb3V0cHV0LmlucHV0SWQ7CkBAIC05MjksNiArOTYxLDcgQEAKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfT1JJR0lOQUxGTEFHUywgdG9TdHJpbmcobU9yaWdGbGFncykuY19zdHIoKSkKICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU0VTU0lPTklELCAoaW50MzJfdCltU2Vzc2lvbklkKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9UUkFDS0lELCBtUG9ydElkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9MT0dTRVNTSU9OSUQsIG1Mb2dTZXNzaW9uSWQpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NPVVJDRSwgdG9TdHJpbmcobUF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9USFJFQURJRCwgKGludDMyX3Qpb3V0cHV0LmlucHV0SWQpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFTEVDVEVEREVWSUNFSUQsIChpbnQzMl90KW1TZWxlY3RlZERldmljZUlkKQpAQCAtMTA5Miw3ICsxMTI1LDcgQEAKICAgICB9CiAKICAgICBpZiAoc3NpemVfdCh1c2VyU2l6ZSkgPCAwIHx8IChidWZmZXIgPT0gTlVMTCAmJiB1c2VyU2l6ZSAhPSAwKSkgewotICAgICAgICAvLyBzYW5pdHktY2hlY2suIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKKyAgICAgICAgLy8gVmFsaWRhdGlvbi4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KICAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCiAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKQEAgLTEzMTksNyArMTM1Miw3IEBACiAgICAgICAgIG1DYmYoRVZFTlRfTU9SRV9EQVRBLCBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCByZWFkU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogIEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdChyZWFkU2l6ZSkpOwpAQCAtMTQxMSwxNCArMTQ0NCwxNCBAQAogICAgIC8vIEl0IHdpbGwgYWxzbyBkZWxldGUgdGhlIHN0cm9uZyByZWZlcmVuY2VzIG9uIHByZXZpb3VzIElBdWRpb1JlY29yZCBhbmQgSU1lbW9yeQogICAgIE1vZHVsbzx1aW50MzJfdD4gcG9zaXRpb24obVByb3h5LT5nZXRQb3NpdGlvbigpKTsKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7Ci0gICAgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICByZXN1bHQgPSBjcmVhdGVSZWNvcmRfbChwb3NpdGlvbik7CiAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQWN0aXZlKSB7CiAgICAgICAgICAgICAvLyBjYWxsYmFjayB0aHJlYWQgb3Igc3luYyBldmVudCBoYXNuJ3QgY2hhbmdlZAogICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBmYWlscyBpZiB3ZSBoYXZlIGEgbmV3IEF1ZGlvRmxpbmdlciBpbnN0YW5jZQotICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5zdGFydCgKLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9TQU1FLCBBVURJT19TRVNTSU9OX05PTkUpLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1BdWRpb1JlY29yZC0+c3RhcnQoCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfU0FNRSwgQVVESU9fU0VTU0lPTl9OT05FKSk7CiAgICAgICAgIH0KICAgICAgICAgbUZyYW1lc1JlYWRTZXJ2ZXJPZmZzZXQgPSBtRnJhbWVzUmVhZDsgLy8gc2VydmVyIHJlc2V0cyB0byB6ZXJvIHNvIHdlIG5lZWQgYW4gb2Zmc2V0LgogICAgIH0KQEAgLTE1MDgsNyArMTU0MSwxMyBAQAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykudHJhbnNhY3Rpb25FcnJvcigpOworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+IG1pY3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcygmbWljcykpOworICAgIGFjdGl2ZU1pY3JvcGhvbmVzLT5yZXNpemUobWljcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzdGF0dXMgPT0gT0sgJiYgaSA8IG1pY3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RhdHVzID0gYWN0aXZlTWljcm9waG9uZXMtPmF0KGkpLnJlYWRGcm9tUGFyY2VsYWJsZShtaWNzW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCkBAIC0xNTI0LDcgKzE1NjMsNyBAQAogICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbikudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbikpOwogICAgIH0KIH0KIApAQCAtMTU0MCwxMCArMTU3OSwzOSBAQAogICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOwogICAgIH0KIH0KIAordm9pZCBBdWRpb1JlY29yZDo6c2V0TG9nU2Vzc2lvbklkKGNvbnN0IGNoYXIgKmxvZ1Nlc3Npb25JZCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKGxvZ1Nlc3Npb25JZCA9PSBudWxscHRyKSBsb2dTZXNzaW9uSWQgPSAiIjsgIC8vIGFuIGVtcHR5IHN0cmluZyBpcyBhbiB1bnNldCBzZXNzaW9uIGlkLgorICAgIGlmIChtTG9nU2Vzc2lvbklkID09IGxvZ1Nlc3Npb25JZCkgcmV0dXJuOworCisgICAgIG1Mb2dTZXNzaW9uSWQgPSBsb2dTZXNzaW9uSWQ7CisgICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQorICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRMT0dTRVNTSU9OSUQpCisgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9MT0dTRVNTSU9OSUQsIGxvZ1Nlc3Npb25JZCkKKyAgICAgICAgIC5yZWNvcmQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNoYXJlQXVkaW9IaXN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZWRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNoYXJlZFN0YXJ0TXMpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtQXVkaW9SZWNvcmQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBtQXVkaW9SZWNvcmQtPnNoYXJlQXVkaW9IaXN0b3J5KHNoYXJlZFBhY2thZ2VOYW1lLCBzaGFyZWRTdGFydE1zKSk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9IHNoYXJlZFBhY2thZ2VOYW1lOworICAgICAgICBtU2hhcmVkQXVkaW9TdGFydE1zID0gc2hhcmVkU3RhcnRNczsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggNjM1N2RhNC4uZjFlZWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtMTksMjIgKzE5LDQwIEBACiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5DYXB0dXJlU3RhdGVMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0dldElucHV0Rm9yQXR0clJlc3BvbnNlLmg+CisKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoeCkgXAorICAgICh7IGF1dG8gX3RtcCA9ICh4KTsgXAorICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gYWlkbF91dGlsczo6YmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoX3RtcC5lcnJvcigpKTsgXAorICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQorCisjZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gX3RtcDsgXAorICAgIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Cit1c2luZyBhaWRsX3V0aWxzOjpzdGF0dXNURnJvbUJpbmRlclN0YXR1czsKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgbWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2U7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiAvLyBjbGllbnQgc2luZ2xldG9uIGZvciBBdWRpb0ZsaW5nZXIgYmluZGVyIGludGVyZmFjZQogTXV0ZXggQXVkaW9TeXN0ZW06OmdMb2NrOwpAQCAtNDUsMzYgKzYzLDYyIEBACiBzdGQ6OnNldDxhdWRpb19lcnJvcl9jYWxsYmFjaz4gQXVkaW9TeXN0ZW06OmdBdWRpb0Vycm9yQ2FsbGJhY2tzOwogZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgQXVkaW9TeXN0ZW06OmdEeW5Qb2xpY3lDYWxsYmFjayA9IE5VTEw7CiByZWNvcmRfY29uZmlnX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnUmVjb3JkQ29uZmlnQ2FsbGJhY2sgPSBOVUxMOworcm91dGluZ19jYWxsYmFjayBBdWRpb1N5c3RlbTo6Z1JvdXRpbmdDYWxsYmFjayA9IE5VTEw7CiAKIC8vIFJlcXVpcmVkIHRvIGJlIGhlbGQgd2hpbGUgY2FsbGluZyBpbnRvIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci4KK2NsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbDsKKwogTXV0ZXggZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyTG9jazsKLXNwPEF1ZGlvU3lzdGVtOjpDYXB0dXJlU3RhdGVMaXN0ZW5lcj4gZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyID0gbnVsbHB0cjsKK3NwPENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbD4gZ1NvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyID0gbnVsbHB0cjsKKworLy8gQmluZGVyIGZvciB0aGUgQXVkaW9GbGluZ2VyIHNlcnZpY2UgdGhhdCdzIHBhc3NlZCB0byB0aGlzIGNsaWVudCBwcm9jZXNzIGZyb20gdGhlIHN5c3RlbSBzZXJ2ZXIuCisvLyBUaGlzIGFsbG93cyBzcGVjaWZpYyBpc29sYXRlZCBwcm9jZXNzZXMgdG8gYWNjZXNzIHRoZSBhdWRpbyBzeXN0ZW0uIEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZQorLy8gSG90d29yZERldGVjdGlvblNlcnZpY2UuCitzcDxJQmluZGVyPiBnQXVkaW9GbGluZ2VyQmluZGVyID0gbnVsbHB0cjsKKwordm9pZCBBdWRpb1N5c3RlbTo6c2V0QXVkaW9GbGluZ2VyQmluZGVyKGNvbnN0IHNwPElCaW5kZXI+JiBhdWRpb0ZsaW5nZXIpIHsKKyAgICBpZiAoYXVkaW9GbGluZ2VyLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgIT0gbWVkaWE6OklBdWRpb0ZsaW5nZXJTZXJ2aWNlOjpkZXNjcmlwdG9yKSB7CisgICAgICAgIEFMT0dFKCJzZXRBdWRpb0ZsaW5nZXJCaW5kZXI6IHJlY2VpdmVkIGEgYmluZGVyIG9mIHR5cGUgJXMiLAorICAgICAgICAgICAgICBTdHJpbmc4KGF1ZGlvRmxpbmdlci0+Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBpZiAoZ0F1ZGlvRmxpbmdlciAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJzZXRBdWRpb0ZsaW5nZXJCaW5kZXI6IGlnbm9yaW5nOyBBdWRpb0ZsaW5nZXIgY29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdBdWRpb0ZsaW5nZXJCaW5kZXIgPSBhdWRpb0ZsaW5nZXI7Cit9CiAKIC8vIGVzdGFibGlzaCBiaW5kZXIgaW50ZXJmYWNlIHRvIEF1ZGlvRmxpbmdlciBzZXJ2aWNlCi1jb25zdCBzcDxJQXVkaW9GbGluZ2VyPiBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKQoteworY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCkgewogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmOwogICAgIHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjOwogICAgIGJvb2wgcmVwb3J0Tm9FcnJvciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgaWYgKGdBdWRpb0ZsaW5nZXIgPT0gMCkgewotICAgICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5hdWRpb19mbGluZ2VyIikpOwotICAgICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvRmxpbmdlciBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7IC8vIDAuNSBzCi0gICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKyAgICAgICAgICAgIGlmIChnQXVkaW9GbGluZ2VyQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBiaW5kZXIgPSBnQXVkaW9GbGluZ2VyQmluZGVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihJQXVkaW9GbGluZ2VyOjpERUZBVUxUX1NFUlZJQ0VfTkFNRSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvRmxpbmdlciBub3QgcHVibGlzaGVkLCB3YWl0aW5nLi4uIik7CisgICAgICAgICAgICAgICAgICAgIHVzbGVlcCg1MDAwMDApOyAvLyAwLjUgcworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdBdWRpb0ZsaW5nZXJDbGllbnQgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdBdWRpb0ZsaW5nZXJDbGllbnQgPSBuZXcgQXVkaW9GbGluZ2VyQ2xpZW50KCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcG9ydE5vRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChnQXVkaW9GbGluZ2VyQ2xpZW50KTsKLSAgICAgICAgICAgIGdBdWRpb0ZsaW5nZXIgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9GbGluZ2VyPihiaW5kZXIpOworICAgICAgICAgICAgZ0F1ZGlvRmxpbmdlciA9IG5ldyBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyKAorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SUF1ZGlvRmxpbmdlclNlcnZpY2U+KGJpbmRlcikpOwogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnQXVkaW9GbGluZ2VyID09IDApOwogICAgICAgICAgICAgYWZjID0gZ0F1ZGlvRmxpbmdlckNsaWVudDsKICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBjYWxsYmFja3MgY2FuIGJlIHJlY2VpdmVkIGJ5IGdBdWRpb0ZsaW5nZXJDbGllbnQKQEAgLTkxLDggKzEzNSw3IEBACiAgICAgcmV0dXJuIGFmOwogfQogCi1jb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9GbGluZ2VyQ2xpZW50KCkKLXsKK2NvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ+IEF1ZGlvU3lzdGVtOjpnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKSB7CiAgICAgLy8gY2FsbGluZyBnZXRfYXVkaW9fZmxpbmdlcigpIHdpbGwgaW5pdGlhbGl6ZSBnQXVkaW9GbGluZ2VyQ2xpZW50IGlmIG5lZWRlZAogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKQEAgLTEwMCw4ICsxNDMsNyBAQAogICAgIHJldHVybiBnQXVkaW9GbGluZ2VyQ2xpZW50OwogfQogCi1zcDxBdWRpb0lvRGVzY3JpcHRvcj4gQXVkaW9TeXN0ZW06OmdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKLXsKK3NwPEF1ZGlvSW9EZXNjcmlwdG9yPiBBdWRpb1N5c3RlbTo6Z2V0SW9EZXNjcmlwdG9yKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2M7CiAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKICAgICBpZiAoYWZjICE9IDApIHsKQEAgLTExMCw4ICsxNTIsNyBAQAogICAgIHJldHVybiBkZXNjOwogfQogCi0vKiBzdGF0aWMgKi8gc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNoZWNrQXVkaW9GbGluZ2VyKCkKLXsKKy8qIHN0YXRpYyAqLyBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Y2hlY2tBdWRpb0ZsaW5nZXIoKSB7CiAgICAgaWYgKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiKSkgIT0gMCkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtMTIwLDQ3ICsxNjEsNDEgQEAKIAogLy8gRklYTUUgRGVjbGFyZSBpbiBiaW5kZXIgb3Bjb2RlIG9yZGVyLCBzaW1pbGFybHkgdG8gSUF1ZGlvRmxpbmdlci5oIGFuZCBJQXVkaW9GbGluZ2VyLmNwcAogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6bXV0ZU1pY3JvcGhvbmUoYm9vbCBzdGF0ZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShib29sIHN0YXRlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldE1pY011dGUoc3RhdGUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoYm9vbCogc3RhdGUpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoYm9vbCogc3RhdGUpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICpzdGF0ZSA9IGFmLT5nZXRNaWNNdXRlKCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgYWYtPnNldE1hc3RlclZvbHVtZSh2YWx1ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTXV0ZShib29sIG11dGUpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTXV0ZShib29sIG11dGUpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGFmLT5zZXRNYXN0ZXJNdXRlKG11dGUpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1hc3RlclZvbHVtZShmbG9hdCogdm9sdW1lKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1hc3RlclZvbHVtZShmbG9hdCogdm9sdW1lKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAqdm9sdW1lID0gYWYtPm1hc3RlclZvbHVtZSgpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1hc3Rlck11dGUoYm9vbCogbXV0ZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJNdXRlKGJvb2wqIG11dGUpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICptdXRlID0gYWYtPm1hc3Rlck11dGUoKTsKQEAgLTE2OCw4ICsyMDMsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CkBAIC0xNzcsOCArMjExLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIG11dGUpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlKSB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMTg3LDggKzIyMCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0KiB2b2x1bWUsCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMTk2LDggKzIyOCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCogbXV0ZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sKiBtdXRlKSB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgcmV0dXJuIEJBRF9WQUxVRTsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtMjA1LDIzICsyMzYsMjAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKICAgICBpZiAodWludDMyX3QobW9kZSkgPj0gQVVESU9fTU9ERV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldE1vZGUobW9kZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhZi0+c2V0UGFyYW1ldGVycyhpb0hhbmRsZSwga2V5VmFsdWVQYWlycyk7CiB9CiAKLVN0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpCi17CitTdHJpbmc4IEF1ZGlvU3lzdGVtOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4KCIiKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIHJlc3VsdDsKQEAgLTIzMCwxMyArMjU4LDExIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKICAgICByZXR1cm4gc2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwga2V5VmFsdWVQYWlycyk7CiB9CiAKLVN0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKLXsKK1N0cmluZzggQXVkaW9TeXN0ZW06OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgewogICAgIHJldHVybiBnZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBrZXlzKTsKIH0KIApAQCAtMjQ4LDE2ICsyNzQsMTQgQEAKIHN0YXRpYyBjb25zdCBmbG9hdCBkQkNvbnZlcnQgPSAtZEJQZXJTdGVwICogMi4zMDI1ODUwOTNmIC8gMjAuMGY7CiBzdGF0aWMgY29uc3QgZmxvYXQgZEJDb252ZXJ0SW52ZXJzZSA9IDEuMGYgLyBkQkNvbnZlcnQ7CiAKLWZsb2F0IEF1ZGlvU3lzdGVtOjpsaW5lYXJUb0xvZyhpbnQgdm9sdW1lKQoteworZmxvYXQgQXVkaW9TeXN0ZW06OmxpbmVhclRvTG9nKGludCB2b2x1bWUpIHsKICAgICAvLyBmbG9hdCB2ID0gdm9sdW1lID8gZXhwKGZsb2F0KDEwMCAtIHZvbHVtZSkgKiBkQkNvbnZlcnQpIDogMDsKICAgICAvLyBBTE9HRCgibGluZWFyVG9Mb2coJWQpPSVmIiwgdm9sdW1lLCB2KTsKICAgICAvLyByZXR1cm4gdjsKICAgICByZXR1cm4gdm9sdW1lID8gZXhwKGZsb2F0KDEwMCAtIHZvbHVtZSkgKiBkQkNvbnZlcnQpIDogMDsKIH0KIAotaW50IEF1ZGlvU3lzdGVtOjpsb2dUb0xpbmVhcihmbG9hdCB2b2x1bWUpCi17CitpbnQgQXVkaW9TeXN0ZW06OmxvZ1RvTGluZWFyKGZsb2F0IHZvbHVtZSkgewogICAgIC8vIGludCB2ID0gdm9sdW1lID8gMTAwIC0gaW50KGRCQ29udmVydEludmVyc2UgKiBsb2codm9sdW1lKSArIDAuNSkgOiAwOwogICAgIC8vIEFMT0dEKCJsb2dUb2xpbmVhciglZCk9JWYiLCB2LCB2b2x1bWUpOwogICAgIC8vIHJldHVybiB2OwpAQCAtMjY2LDMxICsyOTAsMzAgQEAKIAogLyogc3RhdGljICovIHNpemVfdCBBdWRpb1N5c3RlbTo6Y2FsY3VsYXRlTWluRnJhbWVDb3VudCgKICAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXMsIHVpbnQzMl90IGFmRnJhbWVDb3VudCwgdWludDMyX3QgYWZTYW1wbGVSYXRlLAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCAvKiwgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKQoteworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBmbG9hdCBzcGVlZCAvKiwgdWludDMyX3Qgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKSB7CiAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5CiAgICAgdWludDMyX3QgbWluQnVmQ291bnQgPSBhZkxhdGVuY3lNcyAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkgLyBhZlNhbXBsZVJhdGUpOwogICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKICAgICAgICAgbWluQnVmQ291bnQgPSAyOwogICAgIH0KICNpZiAwCi0gICAgLy8gVGhlIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgcGFyYW1ldGVyIGlzIG5vdCB5ZXQgdXNlZCBmb3Igbm9uLWZhc3QgdHJhY2tzLAotICAgIC8vIGJ1dCBrZWVwaW5nIHRoZSBjb2RlIGhlcmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYWRkIGxhdGVyLgotICAgIGlmIChtaW5CdWZDb3VudCA8IG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEpIHsKLSAgICAgICAgbWluQnVmQ291bnQgPSBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOwotICAgIH0KKyAgICAgICAgLy8gVGhlIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgcGFyYW1ldGVyIGlzIG5vdCB5ZXQgdXNlZCBmb3Igbm9uLWZhc3QgdHJhY2tzLAorICAgICAgICAvLyBidXQga2VlcGluZyB0aGUgY29kZSBoZXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBsYXRlci4KKyAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSkgeworICAgICAgICAgICAgbWluQnVmQ291bnQgPSBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxOworICAgICAgICB9CiAjZW5kaWYKICAgICBBTE9HVigiY2FsY3VsYXRlTWluRnJhbWVDb3VudCBhZkxhdGVuY3kgJXUgIGFmRnJhbWVDb3VudCAldSAgYWZTYW1wbGVSYXRlICV1ICAiCi0gICAgICAgICAgICAic2FtcGxlUmF0ZSAldSAgc3BlZWQgJWYgIG1pbkJ1ZkNvdW50OiAldSIgLyoiICBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxICV1IiovLAotICAgICAgICAgICAgYWZMYXRlbmN5TXMsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwgbWluQnVmQ291bnQKLSAgICAgICAgICAgIC8qLCBub3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOworICAgICAgICAgICJzYW1wbGVSYXRlICV1ICBzcGVlZCAlZiAgbWluQnVmQ291bnQ6ICV1IiAvKiIgIG5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgJXUiKi8sCisgICAgICAgICAgYWZMYXRlbmN5TXMsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwgbWluQnVmQ291bnQKKyAgICAvKiwgbm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSovKTsKICAgICByZXR1cm4gbWluQnVmQ291bnQgKiBzb3VyY2VGcmFtZXNOZWVkZWRXaXRoVGltZXN0cmV0Y2goCiAgICAgICAgICAgICBzYW1wbGVSYXRlLCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc3BlZWQpOwogfQogCiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoteworc3RhdHVzX3QKK0F1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUodWludDMyX3QqIHNhbXBsaW5nUmF0ZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OwogCiAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKQEAgLTMwNiw4ICszMjksNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2FtcGxpbmdSYXRlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IGdldElvRGVzY3JpcHRvcihpb0hhbmRsZSk7CkBAIC0zMjYsOCArMzQ4LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KHNpemVfdCogZnJhbWVDb3VudCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoc2l6ZV90KiBmcmFtZUNvdW50LCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQ7CiAKICAgICBpZiAoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewpAQCAtMzQzLDggKzM2NCw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50KSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IGdldElvRGVzY3JpcHRvcihpb0hhbmRsZSk7CkBAIC0zNjMsOCArMzgzLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRMYXRlbmN5KHVpbnQzMl90KiBsYXRlbmN5LCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSh1aW50MzJfdCogbGF0ZW5jeSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OwogCiAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKQEAgLTM4MCw4ICszOTksNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TGF0ZW5jeShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbGF0ZW5jeSkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBsYXRlbmN5KSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldElvRGVzY3JpcHRvcihvdXRwdXQpOwpAQCAtMzk3LDggKzQxNSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgc2l6ZV90KiBidWZmU2l6ZSkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIHNpemVfdCogYnVmZlNpemUpIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQwNiwyNCArNDIzLDIxIEBACiAgICAgcmV0dXJuIGFmYy0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGJ1ZmZTaXplKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZhbHVlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZhbHVlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPnNldFZvaWNlVm9sdW1lKHZhbHVlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgdWludDMyX3QgKmhhbEZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHNwRnJhbWVzKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgdWludDMyX3QqIGhhbEZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHNwRnJhbWVzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAogICAgIHJldHVybiBhZi0+Z2V0UmVuZGVyUG9zaXRpb24oaGFsRnJhbWVzLCBkc3BGcmFtZXMsIG91dHB1dCk7CiB9CiAKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCi17Cit1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIHJlc3VsdDsKQEAgLTQzMyw0NyArNDQ3LDQxIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKLXsKK2F1ZGlvX3VuaXF1ZV9pZF90IEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpIHsKICAgICAvLyBNdXN0IG5vdCB1c2UgQUYgYXMgSURzIHdpbGwgcmUtcm9sbCBvbiBhdWRpb3NlcnZlciByZXN0YXJ0LCBiLzEzMDM2OTUyOS4KICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURTsKICAgICByZXR1cm4gYWYtPm5ld0F1ZGlvVW5pcXVlSWQodXNlKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCwgdWlkX3QgdWlkKQotewordm9pZCBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKICAgICAgICAgYWYtPmFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCwgdWlkKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQpCi17Cit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmICE9IDApIHsKICAgICAgICAgYWYtPnJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7CiAgICAgfQogfQogCi1hdWRpb19od19zeW5jX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQoteworYXVkaW9faHdfc3luY190IEF1ZGlvU3lzdGVtOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fSFdfU1lOQ19JTlZBTElEOwogICAgIHJldHVybiBhZi0+Z2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKHNlc3Npb25JZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzeXN0ZW1SZWFkeSgpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3lzdGVtUmVhZHkoKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBhZi0+c3lzdGVtUmVhZHkoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnRIQUwoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQpCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGZyYW1lQ291bnQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gZ2V0SW9EZXNjcmlwdG9yKGlvSGFuZGxlKTsKQEAgLTQ5NSw4ICs1MDMsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpjbGVhcklvQ2FjaGUoKQotewordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpjbGVhcklvQ2FjaGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtSW9EZXNjcmlwdG9ycy5jbGVhcigpOwogICAgIG1JbkJ1ZmZTaXplID0gMDsKQEAgLTUwNSw4ICs1MTIsNyBAQAogICAgIG1JbkNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKLXsKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXIuY2xlYXIoKTsKQEAgLTUyMCwxMSArNTI2LDE4IEBACiAgICAgQUxPR1coIkF1ZGlvRmxpbmdlciBzZXJ2ZXIgZGllZCEiKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50Ojppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpIHsKK1N0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50Ojppb0NvbmZpZ0NoYW5nZWQoCisgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgX2V2ZW50LAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIF9pb0Rlc2MpIHsKKyAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvSW9Db25maWdFdmVudF9hdWRpb19pb19jb25maWdfZXZlbnQoX2V2ZW50KSk7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYygKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0lvRGVzY3JpcHRvcl9BdWRpb0lvRGVzY3JpcHRvcihfaW9EZXNjKSkpOworCiAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIGV2ZW50ICVkIiwgZXZlbnQpOwogCi0gICAgaWYgKGlvRGVzYyA9PSAwIHx8IGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CisgICAgaWYgKGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm4gU3RhdHVzOjpvaygpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+IGNhbGxiYWNrc1RvQ2FsbDsKQEAgLTUzMyw5NSArNTQ2LDEwMiBAQAogICAgICAgICBhdXRvIGNhbGxiYWNrcyA9IHN0ZDo6bWFwPGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PigpOwogCiAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgotICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgotICAgICAgICBjYXNlIEFVRElPX0lOUFVUX09QRU5FRDoKLSAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOiB7Ci0gICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgorICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfUkVHSVNURVJFRDoKKyAgICAgICAgICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9SRUdJU1RFUkVEOiB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3ICVzICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPworICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/CisgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CisgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDogeworICAgICAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgY2xvc2luZyB1bmtub3duICVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpICVzICVkIGNsb3NlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOworCisgICAgICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZERlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgbW9kaWZ5aW5nIHVua25vd24gJXMhICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCkgeworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VJZCAhPSBpb0Rlc2MtPmdldERldmljZUlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBpb0Rlc2MtPmdldERldmljZUlkKCk7CiAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGl0LT5zZWNvbmQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyBjb25maWcgZm9yICVzICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCAiCisgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tU2FtcGxpbmdSYXRlLCBpb0Rlc2MtPm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+bUZyYW1lQ291bnRIQUwsCisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXREZXZpY2VJZCgpKTsKKwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIG5ldyAlcyAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggY2hhbm5lbCBtYXNrICUjeCAiCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9PUEVORUQgfHwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX1JFR0lTVEVSRUQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiIDogImlucHV0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5lZCIgOiAicmVnaXN0ZXJlZCIsCi0gICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6Ci0gICAgICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOiB7Ci0gICAgICAgICAgICBpZiAoZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgY2xvc2luZyB1bmtub3duICVzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgJXMgJWQgY2xvc2VkIiwKLSAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKLQotICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZXJhc2UoaW9EZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewotICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKLQotICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgewotICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDogeworICAgICAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yX2woaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBBVURJT19DTElFTlRfU1RBUlRFRCAgaW8gJWQgcG9ydCAlZCBudW0gY2FsbGJhY2tzICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVBvcnRJZCwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb2xkRGVzYy0+bVBhdGNoID0gaW9EZXNjLT5tUGF0Y2g7CiAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY2JrcyA9IGl0LT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gY2Jrcy5maW5kKGlvRGVzYy0+bVBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdDIgIT0gY2Jrcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmVtcGxhY2UoaW9EZXNjLT5tUG9ydElkLCBpdDItPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IG9sZERlc2MtPmdldERldmljZUlkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKLSAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAlI3ggZnJhbWVDb3VudCAlenUgZnJhbWVDb3VudEhBTCAlenUgZGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsCi0gICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlLCBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUsIGlvRGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tQ2hhbm5lbE1hc2ssIGlvRGVzYy0+bUZyYW1lQ291bnQsIGlvRGVzYy0+bUZyYW1lQ291bnRIQUwsCi0gICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7Ci0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDogewotICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBBVURJT19DTElFTlRfU1RBUlRFRCAgaW8gJWQgcG9ydCAlZCBudW0gY2FsbGJhY2tzICV6dSIsCi0gICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVBvcnRJZCwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7Ci0gICAgICAgICAgICBvbGREZXNjLT5tUGF0Y2ggPSBpb0Rlc2MtPm1QYXRjaDsKLSAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byBjYmtzID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPm1Qb3J0SWQpOwotICAgICAgICAgICAgICAgIGlmIChpdDIgIT0gY2Jrcy5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lbXBsYWNlKGlvRGVzYy0+bVBvcnRJZCwgaXQyLT5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGF1dG8gd3BDYmsgOiBjYWxsYmFja3MpIHsKQEAgLTYzOCwxMiArNjU4LDEzIEBACiAgICAgICAgIC8vIElmIGNhbGxiYWNrc1RvQ2FsbCBpcyBub3QgZW1wdHksIGl0IGltcGxpZXMgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAogICAgICAgICBjYi0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlSWQpOwogICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKQoteworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwpAQCAtNjU1LDcgKzY3Niw3IEBACiAgICAgICAgIHNpemVfdCBpbkJ1ZmZTaXplID0gYWYtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgaWYgKGluQnVmZlNpemUgPT0gMCkgewogICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUgZmFpbGVkIHNhbXBsZVJhdGUgJWQgZm9ybWF0ICUjeCBjaGFubmVsTWFzayAlI3giLAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICAvLyBBIGJlbmlnbiByYWNlIGlzIHBvc3NpYmxlIGhlcmU6IHdlIGNvdWxkIG92ZXJ3cml0ZSBhIGZyZXNoZXIgY2FjaGUgZW50cnkKQEAgLTY3Miw4ICs2OTMsOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldElvRGVzY3JpcHRvcl9sKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKQoteworc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+CitBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJb0Rlc2NyaXB0b3JfbChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjOwogICAgIHNzaXplX3QgaW5kZXggPSBtSW9EZXNjcmlwdG9ycy5pbmRleE9mS2V5KGlvSGFuZGxlKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewpAQCAtNjgyLDE5ICs3MDMsMTkgQEAKICAgICByZXR1cm4gZGVzYzsKIH0KIAotc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKLXsKK3NwPEF1ZGlvSW9EZXNjcmlwdG9yPiBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJb0Rlc2NyaXB0b3IoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHJldHVybiBnZXRJb0Rlc2NyaXB0b3JfbChpb0hhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi17CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgQUxPR1YoIiVzIGF1ZGlvSW8gJWQgcG9ydElkICVkIiwgX19mdW5jX18sIGF1ZGlvSW8sIHBvcnRJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBhdXRvJiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW1wbGFjZShhdWRpb0lvLCBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPj4oKSkuZmlyc3QtPnNlY29uZDsKKyAgICBhdXRvJiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW1wbGFjZSgKKyAgICAgICAgICAgIGF1ZGlvSW8sCisgICAgICAgICAgICBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPj4oKSkuZmlyc3QtPnNlY29uZDsKICAgICBhdXRvIHJlc3VsdCA9IGNhbGxiYWNrcy50cnlfZW1wbGFjZShwb3J0SWQsIGNhbGxiYWNrKTsKICAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtNzA0LDggKzcyNSw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCwgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi17CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgQUxPR1YoIiVzIGF1ZGlvSW8gJWQgcG9ydElkICVkIiwgX19mdW5jX18sIGF1ZGlvSW8sIHBvcnRJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoYXVkaW9Jbyk7CkBAIC03MjEsOCArNzQxLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8qIHN0YXRpYyAqLyB1aW50cHRyX3QgQXVkaW9TeXN0ZW06OmFkZEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpCi17CisvKiBzdGF0aWMgKi8gdWludHB0cl90IEF1ZGlvU3lzdGVtOjphZGRFcnJvckNhbGxiYWNrKGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrRXJyb3JDYWxsYmFja3MpOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2tzLmluc2VydChjYik7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihjYik7CkBAIC03MzYsMjIgKzc1NSwyNSBAQAogLyogc3RhdGljICovIHZvaWQgQXVkaW9TeXN0ZW06OnJlcG9ydEVycm9yKHN0YXR1c190IGVycikgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0Vycm9yQ2FsbGJhY2tzKTsKICAgICBmb3IgKGF1dG8gY2FsbGJhY2sgOiBnQXVkaW9FcnJvckNhbGxiYWNrcykgewotICAgICAgY2FsbGJhY2soZXJyKTsKKyAgICAgICAgY2FsbGJhY2soZXJyKTsKICAgICB9CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb1N5c3RlbTo6c2V0RHluUG9saWN5Q2FsbGJhY2soZHluYW1pY19wb2xpY3lfY2FsbGJhY2sgY2IpCi17CisvKnN0YXRpYyovIHZvaWQgQXVkaW9TeXN0ZW06OnNldER5blBvbGljeUNhbGxiYWNrKGR5bmFtaWNfcG9saWN5X2NhbGxiYWNrIGNiKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICBnRHluUG9saWN5Q2FsbGJhY2sgPSBjYjsKIH0KIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXRSZWNvcmRDb25maWdDYWxsYmFjayhyZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiKQoteworLypzdGF0aWMqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXRSZWNvcmRDb25maWdDYWxsYmFjayhyZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICBnUmVjb3JkQ29uZmlnQ2FsbGJhY2sgPSBjYjsKIH0KIAorLypzdGF0aWMqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXRSb3V0aW5nQ2FsbGJhY2socm91dGluZ19jYWxsYmFjayBjYikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9jayk7CisgICAgZ1JvdXRpbmdDYWxsYmFjayA9IGNiOworfQorCiAvLyBjbGllbnQgc2luZ2xldG9uIGZvciBBdWRpb1BvbGljeVNlcnZpY2UgYmluZGVyIGludGVyZmFjZQogLy8gcHJvdGVjdGVkIGJ5IGdMb2NrQVBTCiBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZTsKQEAgLTc1OSw4ICs3ODEsNyBAQAogCiAKIC8vIGVzdGFibGlzaCBiaW5kZXIgaW50ZXJmYWNlIHRvIEF1ZGlvUG9saWN5IHNlcnZpY2UKLWNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKQoteworY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpIHsKICAgICBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBhcDsKICAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGFwYzsKICAgICB7CkBAIC04MDAsOCArODIxLDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkKLXsKK3ZvaWQgQXVkaW9TeXN0ZW06Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47CiAgICAgYXBzLT5vbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwpAQCAtODA5LDEzICs4MjksMTIgQEAKIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9ICIiOworICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSAiIjsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gIiI7CiAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIApAQCAtODI1LDI2ICs4NDQsNDYgQEAKICAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQotICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKKworICAgIG1lZGlhOjpBdWRpb0RldmljZSBkZXZpY2VBaWRsOworICAgIGRldmljZUFpZGwudHlwZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgZGV2aWNlQWlkbC5hZGRyZXNzID0gYWRkcmVzczsKKworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKHN0YXRlKSksCisgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoZW5jb2RlZEZvcm1hdCkpKSk7CiB9CiAKIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiAKLSAgICByZXR1cm4gYXBzLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4geworICAgICAgICBtZWRpYTo6QXVkaW9EZXZpY2UgZGV2aWNlQWlkbDsKKyAgICAgICAgZGV2aWNlQWlkbC50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgICAgICBkZXZpY2VBaWRsLmFkZHJlc3MgPSBkZXZpY2VfYWRkcmVzczsKKworICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSByZXN1bHQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBhcHMtPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2VBaWRsLCAmcmVzdWx0KSkpOworCisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb1BvbGljeURldmljZVN0YXRlX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdChyZXN1bHQpOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9ICIiOworICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSAiIjsKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gIiI7CiAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIApAQCAtODU0LDI5NCArODkzLDUyOCBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7CisKKyAgICBtZWRpYTo6QXVkaW9EZXZpY2UgZGV2aWNlQWlkbDsKKyAgICBkZXZpY2VBaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIGRldmljZUFpZGwuYWRkcmVzcyA9IGFkZHJlc3M7CisKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2VBaWRsLCBuYW1lLCBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChlbmNvZGVkRm9ybWF0KSkpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlLCB1aWRfdCB1aWQpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUsIHVpZF90IHVpZCkgewogICAgIGlmICh1aW50MzJfdChzdGF0ZSkgPj0gQVVESU9fTU9ERV9DTlQpIHJldHVybiBCQURfVkFMVUU7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIHJldHVybiBhcHMtPnNldFBob25lU3RhdGUoc3RhdGUsIHVpZCk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0UGhvbmVTdGF0ZSgKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShzdGF0ZSkpLAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoteworc3RhdHVzX3QKK0F1ZGlvU3lzdGVtOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKKworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+c2V0Rm9yY2VVc2UoCisgICAgICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90X0F1ZGlvUG9saWN5Rm9yY2VVc2UodXNhZ2UpKSwKKyAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190X0F1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnKSkpKTsKIH0KIAotYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1N5c3RlbTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoteworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1N5c3RlbTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKLSAgICByZXR1cm4gYXBzLT5nZXRGb3JjZVVzZSh1c2FnZSk7CisKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4geworICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZSB1c2FnZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90X0F1ZGlvUG9saWN5Rm9yY2VVc2UodXNhZ2UpKTsKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIGNvbmZpZ0FpZGw7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBhcHMtPmdldEZvcmNlVXNlKHVzYWdlQWlkbCwgJmNvbmZpZ0FpZGwpKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb1BvbGljeUZvcmNlZENvbmZpZ19hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190KGNvbmZpZ0FpZGwpOworICAgIH0oKTsKKworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpOwogfQogCiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17CithdWRpb19pb19oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBhcHMtPmdldE91dHB1dChzdHJlYW0pOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2hhbmRsZV90PiB7CisgICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICAgICAgaW50MzJfdCBvdXRwdXRBaWRsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXRPdXRwdXQoc3RyZWFtQWlkbCwgJm91dHB1dEFpZGwpKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dEFpZGwpOworICAgIH0oKTsKKworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fSU9fSEFORExFX05PTkUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QqIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCogc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QqIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90Piogc2Vjb25kYXJ5T3V0cHV0cykgeworICAgIGlmIChhdHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIE5VTEwgYXVkaW8gYXR0cmlidXRlcyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBOVUxMIG91dHB1dCAtIHNob3VsZG4ndCBoYXBwZW4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIE5VTEwgc2VsZWN0ZWREZXZpY2VJZCAtIHNob3VsZG4ndCBoYXBwZW4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwb3J0SWQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgTlVMTCBwb3J0SWQgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc2Vjb25kYXJ5T3V0cHV0cyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCBwaWQsIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHNlY29uZGFyeU91dHB1dHMpOworCisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cikpOworICAgIGludDMyX3Qgc2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb24pKTsKKyAgICBtZWRpYTo6QXVkaW9Db25maWcgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnKSk7CisgICAgaW50MzJfdCBmbGFnc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CisgICAgaW50MzJfdCBzZWxlY3RlZERldmljZUlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QoKnNlbGVjdGVkRGV2aWNlSWQpKTsKKworICAgIG1lZGlhOjpHZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UgcmVzcG9uc2VBaWRsOworCisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyQWlkbCwgc2Vzc2lvbkFpZGwsIGF0dHJpYnV0aW9uU291cmNlLCBjb25maWdBaWRsLCBmbGFnc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZEFpZGwsICZyZXNwb25zZUFpZGwpKSk7CisKKyAgICAqb3V0cHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVzcG9uc2VBaWRsLm91dHB1dCkpOworCisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHJlc3BvbnNlQWlkbC5zdHJlYW0pKTsKKyAgICB9CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHJlc3BvbnNlQWlkbC5zZWxlY3RlZERldmljZUlkKSk7CisgICAgKnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHJlc3BvbnNlQWlkbC5wb3J0SWQpKTsKKyAgICAqc2Vjb25kYXJ5T3V0cHV0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4+KAorICAgICAgICAgICAgcmVzcG9uc2VBaWRsLnNlY29uZGFyeU91dHB1dHMsIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QpKTsKKworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChwb3J0SWQpOworCisgICAgaW50MzJfdCBwb3J0SWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c3RhcnRPdXRwdXQocG9ydElkQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KHBvcnRJZCk7CisKKyAgICBpbnQzMl90IHBvcnRJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zdG9wT3V0cHV0KHBvcnRJZEFpZGwpKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLXsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuOwotICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOworCisgICAgYXV0byBzdGF0dXMgPSBbJl0oKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIGludDMyX3QgcG9ydElkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgICAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWRBaWRsKSkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworCisgICAgLy8gSWdub3JlIHN0YXR1cy4KKyAgICAodm9pZCkgc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90KiBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90KiBwb3J0SWQpIHsKKyAgICBpZiAoYXR0ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIgTlVMTCBhdHRyIC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyIE5VTEwgaW5wdXQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImdldElucHV0Rm9yQXR0ciBOVUxMIHNlbGVjdGVkRGV2aWNlSWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gYXBzLT5nZXRJbnB1dEZvckF0dHIoCi0gICAgICAgICAgICBhdHRyLCBpbnB1dCwgcmlpZCwgc2Vzc2lvbiwgcGlkLCB1aWQsIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworCisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cikpOworICAgIGludDMyX3QgaW5wdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KCppbnB1dCkpOworICAgIGludDMyX3QgcmlpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3VuaXF1ZV9pZF90X2ludDMyX3QocmlpZCkpOworICAgIGludDMyX3Qgc2Vzc2lvbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb24pKTsKKyAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKmNvbmZpZykpOworICAgIGludDMyX3QgZmxhZ3NBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pbnB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOworICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KCpzZWxlY3RlZERldmljZUlkKSk7CisKKyAgICBtZWRpYTo6R2V0SW5wdXRGb3JBdHRyUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXRJbnB1dEZvckF0dHIoYXR0ckFpZGwsIGlucHV0QWlkbCwgcmlpZEFpZGwsIHNlc3Npb25BaWRsLCBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICBjb25maWdBaWRsLCBmbGFnc0FpZGwsIHNlbGVjdGVkRGV2aWNlSWRBaWRsLCAmcmVzcG9uc2UpKSk7CisKKyAgICAqaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVzcG9uc2UuaW5wdXQpKTsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocmVzcG9uc2Uuc2VsZWN0ZWREZXZpY2VJZCkpOworICAgICpwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChyZXNwb25zZS5wb3J0SWQpKTsKKworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQpOworCisgICAgaW50MzJfdCBwb3J0SWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c3RhcnRJbnB1dChwb3J0SWRBaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wSW5wdXQocG9ydElkKTsKKworICAgIGludDMyX3QgcG9ydElkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnN0b3BJbnB1dChwb3J0SWRBaWRsKSk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLXsKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47Ci0gICAgYXBzLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKKworICAgIGF1dG8gc3RhdHVzID0gWyZdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBpbnQzMl90IHBvcnRJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKKyAgICAgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnJlbGVhc2VJbnB1dChwb3J0SWRBaWRsKSkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworCisgICAgLy8gSWdub3JlIHN0YXR1cy4KKyAgICAodm9pZCkgc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisKKyAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgaW50MzJfdCBpbmRleE1pbkFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleE1pbikpOworICAgIGludDMyX3QgaW5kZXhNYXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXhNYXgpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtQWlkbCwgaW5kZXhNaW5BaWRsLCBpbmRleE1heEFpZGwpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgsIGRldmljZSk7CisKKyAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgaW50MzJfdCBpbmRleEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleCkpOworICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5zZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1BaWRsLCBkZXZpY2VBaWRsLCBpbmRleEFpZGwpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwgaW5kZXgsIGRldmljZSk7CisKKyAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICBpbnQzMl90IGluZGV4QWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW1BaWRsLCBkZXZpY2VBaWRsLCAmaW5kZXhBaWRsKSkpOworICAgIGlmIChpbmRleCAhPSBudWxscHRyKSB7CisgICAgICAgICppbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgsIGRldmljZSk7CisKKyAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKKyAgICBpbnQzMl90IGluZGV4QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7CisgICAgaW50MzJfdCBkZXZpY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19kZXZpY2VzX3RfaW50MzJfdChkZXZpY2UpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyQWlkbCwgZGV2aWNlQWlkbCwgaW5kZXhBaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOworICAgIGludDMyX3QgZGV2aWNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgaW50MzJfdCBpbmRleEFpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJBaWRsLCBkZXZpY2VBaWRsLCAmaW5kZXhBaWRsKSkpOworICAgIGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihpbmRleEFpZGwpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCYgaW5kZXgpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCk7CisKKyAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ckFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKKyAgICBpbnQzMl90IGluZGV4QWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ckFpZGwsICZpbmRleEFpZGwpKSk7CisgICAgaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4QWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgaW50JiBpbmRleCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4KTsKKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19hdHRyaWJ1dGVzX3RfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwoYXR0cikpOworICAgIGludDMyX3QgaW5kZXhBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyQWlkbCwgJmluZGV4QWlkbCkpKTsKKyAgICBpbmRleCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CisgICAgcmV0dXJuIE9LOwogfQogCi11aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Citwcm9kdWN0X3N0cmF0ZWd5X3QgQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+IHsKKyAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgICAgICBpbnQzMl90IHJlc3VsdEFpZGw7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbUFpZGwsICZyZXN1bHRBaWRsKSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3QocmVzdWx0QWlkbCk7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoUFJPRFVDVF9TVFJBVEVHWV9OT05FKTsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoteworYXVkaW9fZGV2aWNlc190IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICByZXR1cm4gYXBzLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSk7CisKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZGV2aWNlc190PiB7CisgICAgICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICAgICAgaW50MzJfdCByZXN1bHRBaWRsOworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgYXBzLT5nZXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbUFpZGwsICZyZXN1bHRBaWRsKSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QocmVzdWx0QWlkbCk7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fREVWSUNFX05PTkUpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICpkZXZpY2VzKSB7CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzJiBhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKiBkZXZpY2VzKSB7CiAgICAgaWYgKGRldmljZXMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGFhLCBkZXZpY2VzKTsKKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCBhYUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9BdHRyaWJ1dGVzX0F1ZGlvQXR0cmlidXRlc0V4KGFhKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiByZXRBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGFhQWlkbCwgJnJldEFpZGwpKSk7CisgICAgKmRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPigKKyAgICAgICAgICAgICAgICAgICAgcmV0QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBPSzsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQoteworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICAvLyBGSVhNRSBjaGFuZ2UgcmV0dXJuIHR5cGUgdG8gc3RhdHVzX3QsIGFuZCByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQgaGVyZQogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19oYW5kbGVfdD4geworICAgICAgICBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciBkZXNjQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9lZmZlY3RfZGVzY3JpcHRvcl90X0VmZmVjdERlc2NyaXB0b3IoKmRlc2MpKTsKKyAgICAgICAgaW50MzJfdCByZXRBaWRsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5nZXRPdXRwdXRGb3JFZmZlY3QoZGVzY0FpZGwsICZyZXRBaWRsKSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChyZXRBaWRsKTsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX0lPX0hBTkRMRV9OT05FKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworCisgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IgZGVzY0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKCpkZXNjKSk7CisgICAgaW50MzJfdCBpb0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW8pKTsKKyAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3Qoc3RyYXRlZ3kpKTsKKyAgICBpbnQzMl90IHNlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uKSk7CisgICAgaW50MzJfdCBpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihpZCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+cmVnaXN0ZXJFZmZlY3QoZGVzY0FpZGwsIGlvQWlkbCwgc3RyYXRlZ3lBaWRsLCBzZXNzaW9uQWlkbCwgaWRBaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+dW5yZWdpc3RlckVmZmVjdChpZCk7CisKKyAgICBpbnQzMl90IGlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGlkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT51bnJlZ2lzdGVyRWZmZWN0KGlkQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKKworICAgIGludDMyX3QgaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50MzJfdD4oaWQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPnNldEVmZmVjdEVuYWJsZWQoaWRBaWRsLCBlbmFibGVkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjptb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjptb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaWRzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihpZHMsIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90LCBpbnQ+KSk7CisgICAgaW50MzJfdCBpb0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW8pKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5tb3ZlRWZmZWN0c1RvSW8oaWRzQWlkbCwgaW9BaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCogc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sKiBzdGF0ZSwgdWludDMyX3QgaW5QYXN0TXMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGlmIChzdGF0ZSA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgICpzdGF0ZSA9IGFwcy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIGludDMyX3QgaW5QYXN0TXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5QYXN0TXMpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW1BaWRsLCBpblBhc3RNc0FpZGwsIHN0YXRlKSkpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wqIHN0YXRlLAotICAgICAgICB1aW50MzJfdCBpblBhc3RNcykKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqc3RhdGUgPSBhcHMtPmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIGludDMyX3QgaW5QYXN0TXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5QYXN0TXMpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbUFpZGwsIGluUGFzdE1zQWlkbCwgc3RhdGUpKSk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc3RyZWFtLCBib29sKiBzdGF0ZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzdHJlYW0sIGJvb2wqIHN0YXRlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAqc3RhdGUgPSBhcHMtPmlzU291cmNlQWN0aXZlKHN0cmVhbSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShzdHJlYW0pKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5pc1NvdXJjZUFjdGl2ZShzdHJlYW1BaWRsLCBzdGF0ZSkpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCkKLXsKK3VpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKICAgICByZXR1cm4gYWYtPmdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKIH0KIAotc2l6ZV90IEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpCi17CitzaXplX3QgQXVkaW9TeXN0ZW06OmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKICAgICByZXR1cm4gYWYtPmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRMb3dSYW1EZXZpY2UoaXNMb3dSYW1EZXZpY2UsIHRvdGFsTWVtb3J5KTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCkKLXsKK3ZvaWQgQXVkaW9TeXN0ZW06OmNsZWFyQXVkaW9Db25maWdDYWNoZSgpIHsKICAgICAvLyBjYWxsZWQgYnkgcmVzdG9yZVRyYWNrX2woKSwgd2hpY2ggbmVlZHMgbmV3IElBdWRpb0ZsaW5nZXIgYW5kIElBdWRpb1BvbGljeVNlcnZpY2UgaW5zdGFuY2VzCiAgICAgQUxPR1YoImNsZWFyQXVkaW9Db25maWdDYWNoZSgpIik7CiAgICAgewpAQCAtMTE2MCw3NCArMTQzMywxNTIgQEAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4mIHN5c3RlbVVzYWdlcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSBudWxscHRyKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKHN5c3RlbVVzYWdlcyk7CisKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Vc2FnZT4gc3lzdGVtVXNhZ2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPj4oc3lzdGVtVXNhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZSkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcyhzeXN0ZW1Vc2FnZXNBaWRsKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgeworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZCwgZmxhZ3MpOworCisgICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOworICAgIGludDMyX3QgY2FwdHVyZVBvbGljeUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhjYXB0dXJlUG9saWN5KSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkQWlkbCwgY2FwdHVyZVBvbGljeUFpZGwpKTsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQotewotICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSIpOworYXVkaW9fb2ZmbG9hZF9tb2RlX3QgQXVkaW9TeXN0ZW06OmdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSB7CisgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7Ci0gICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGFwcy0+aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19vZmZsb2FkX21vZGVfdD4geworICAgICAgICBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyBpbmZvQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX2luZm9fdF9BdWRpb09mZmxvYWRJbmZvKGluZm8pKTsKKyAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUgcmV0QWlkbDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKAorICAgICAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0T2ZmbG9hZFN1cHBvcnQoaW5mb0FpZGwsICZyZXRBaWRsKSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkTW9kZV9hdWRpb19vZmZsb2FkX21vZGVfdChyZXRBaWRsKTsKKyAgICB9KCk7CisKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKHN0YXRpY19jYXN0PGF1ZGlvX29mZmxvYWRfbW9kZV90PigwKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKLXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIG51bV9wb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyogcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBnZW5lcmF0aW9uKSB7CisgICAgaWYgKG51bV9wb3J0cyA9PSBudWxscHRyIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgZ2VuZXJhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCBudW1fcG9ydHMsIHBvcnRzLCBnZW5lcmF0aW9uKTsKKworICAgIG1lZGlhOjpBdWRpb1BvcnRSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfcm9sZV90X0F1ZGlvUG9ydFJvbGUocm9sZSkpOworICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUodHlwZSkpOworICAgIG1lZGlhOjpJbnQgbnVtUG9ydHNBaWRsOworICAgIG51bVBvcnRzQWlkbC52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1fcG9ydHMpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qb3J0PiBwb3J0c0FpZGw7CisgICAgaW50MzJfdCBnZW5lcmF0aW9uQWlkbDsKKworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmxpc3RBdWRpb1BvcnRzKHJvbGVBaWRsLCB0eXBlQWlkbCwgJm51bVBvcnRzQWlkbCwgJnBvcnRzQWlkbCwgJmdlbmVyYXRpb25BaWRsKSkpOworICAgICpudW1fcG9ydHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KG51bVBvcnRzQWlkbC52YWx1ZSkpOworICAgICpnZW5lcmF0aW9uID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihnZW5lcmF0aW9uQWlkbCkpOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoY29udmVydFJhbmdlKHBvcnRzQWlkbC5iZWdpbigpLCBwb3J0c0FpZGwuZW5kKCksIHBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KSk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyogcG9ydCkgeworICAgIGlmIChwb3J0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldEF1ZGlvUG9ydChwb3J0KTsKKworICAgIG1lZGlhOjpBdWRpb1BvcnQgcG9ydEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdjdfQXVkaW9Qb3J0KCpwb3J0KSk7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Z2V0QXVkaW9Qb3J0KHBvcnRBaWRsLCAmcG9ydEFpZGwpKSk7CisgICAgKnBvcnQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvUG9ydF9hdWRpb19wb3J0X3Y3KHBvcnRBaWRsKSk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUpIHsKKyAgICBpZiAocGF0Y2ggPT0gbnVsbHB0ciB8fCBoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKKworICAgIG1lZGlhOjpBdWRpb1BhdGNoIHBhdGNoQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKCpwYXRjaCkpOworICAgIGludDMyX3QgaGFuZGxlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdCgqaGFuZGxlKSk7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEFpZGwsIGhhbmRsZUFpZGwsICZoYW5kbGVBaWRsKSkpOworICAgICpoYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcGF0Y2hfaGFuZGxlX3QoaGFuZGxlQWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CisKKyAgICBpbnQzMl90IGhhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX2hhbmRsZV90X2ludDMyX3QoaGFuZGxlKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQqIG51bV9wYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBnZW5lcmF0aW9uKSB7CisgICAgaWYgKG51bV9wYXRjaGVzID09IG51bGxwdHIgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgZ2VuZXJhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzLCBnZW5lcmF0aW9uKTsKKworCisgICAgbWVkaWE6OkludCBudW1QYXRjaGVzQWlkbDsKKyAgICBudW1QYXRjaGVzQWlkbC52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1fcGF0Y2hlcykpOworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiBwYXRjaGVzQWlkbDsKKyAgICBpbnQzMl90IGdlbmVyYXRpb25BaWRsOworCisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+bGlzdEF1ZGlvUGF0Y2hlcygmbnVtUGF0Y2hlc0FpZGwsICZwYXRjaGVzQWlkbCwgJmdlbmVyYXRpb25BaWRsKSkpOworICAgICpudW1fcGF0Y2hlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4obnVtUGF0Y2hlc0FpZGwudmFsdWUpKTsKKyAgICAqZ2VuZXJhdGlvbiA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oZ2VuZXJhdGlvbkFpZGwpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKGNvbnZlcnRSYW5nZShwYXRjaGVzQWlkbC5iZWdpbigpLCBwYXRjaGVzQWlkbC5lbmQoKSwgcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BhdGNoX2F1ZGlvX3BhdGNoKSk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGNvbmZpZykgeworICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIGNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKCpjb25maWcpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIApAQCAtMTI0Myw4ICsxNTk0LDcgQEAKIH0KIAogLypzdGF0aWMqLwotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKQEAgLTEyNTksOCArMTYwOSw3IEBACiAgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIApAQCAtMTI3NSw4ICsxNjI0LDcgQEAKICAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCkBAIC0xMjkzLDggKzE2NDEsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKICAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLXsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTEzMTEsOCArMTY1OCw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAogICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoteworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewogICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CiAgICAgaWYgKGFmYyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTMyMCw4ICsxNjY2LDcgQEAKICAgICByZXR1cm4gYWZjLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBhdWRpb0lvLCBwb3J0SWQpOwogfQogCi1hdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCi17CithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gZ2V0SW9EZXNjcmlwdG9yKGF1ZGlvSW8pOwpAQCAtMTMzMSwyMjQgKzE2NzYsMzU0IEBACiAgICAgcmV0dXJuIGRlc2MtPmdldERldmljZUlkKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QqIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCogZGV2aWNlKSB7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCBpb0hhbmRsZSA9PSBudWxscHRyIHx8IGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbiwgaW9IYW5kbGUsIGRldmljZSk7CisKKyAgICBtZWRpYTo6U291bmRUcmlnZ2VyU2Vzc2lvbiByZXRBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCZyZXRBaWRsKSkpOworICAgICpzZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChyZXRBaWRsLnNlc3Npb24pKTsKKyAgICAqaW9IYW5kbGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmV0QWlkbC5pb0hhbmRsZSkpOworICAgICpkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KHJldEFpZGwuZGV2aWNlKSk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24pOworCisgICAgaW50MzJfdCBzZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbikpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb25BaWRsKSk7CiB9CiAKLWF1ZGlvX21vZGVfdCBBdWRpb1N5c3RlbTo6Z2V0UGhvbmVTdGF0ZSgpCi17CithdWRpb19tb2RlX3QgQXVkaW9TeXN0ZW06OmdldFBob25lU3RhdGUoKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBBVURJT19NT0RFX0lOVkFMSUQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0UGhvbmVTdGF0ZSgpOworCisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4geworICAgICAgICBtZWRpYTo6QXVkaW9Nb2RlIHJldEFpZGw7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldFBob25lU3RhdGUoJnJldEFpZGwpKSk7CisgICAgICAgIHJldHVybiBhaWRsMmxlZ2FjeV9BdWRpb01vZGVfYXVkaW9fbW9kZV90KHJldEFpZGwpOworICAgIH0oKTsKKworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoQVVESU9fTU9ERV9JTlZBTElEKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzLCByZWdpc3RyYXRpb24pOworCisgICAgc2l6ZV90IG1peGVzU2l6ZSA9IHN0ZDo6bWluKG1peGVzLnNpemUoKSwgc2l6ZV90e01BWF9NSVhFU19QRVJfUE9MSUNZfSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvTWl4PiBtaXhlc0FpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShtaXhlcy5iZWdpbigpLCBtaXhlcy5iZWdpbigpICsgbWl4ZXNTaXplLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIobWl4ZXNBaWRsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb01peCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXNBaWRsLCByZWdpc3RyYXRpb24pKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKKworICAgIGludDMyX3QgdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkQWlkbCwgZGV2aWNlc0FpZGwpKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5yZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7CisKKyAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRBaWRsKSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCi17CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKHVzZXJJZCwgZGV2aWNlcyk7CisKKyAgICBpbnQzMl90IHVzZXJJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90Pih1c2VySWQpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyh1c2VySWRBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+cmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyh1c2VySWQpOworICAgIGludDMyX3QgdXNlcklkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KHVzZXJJZCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCogcG9ydElkKSB7CisgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbHB0ciB8fCBwb3J0SWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOworCisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBzb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX0F1ZGlvUG9ydENvbmZpZygqc291cmNlKSk7CisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJpYnV0ZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCgqYXR0cmlidXRlcykpOworICAgIGludDMyX3QgcG9ydElkQWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZUFpZGwsIGF0dHJpYnV0ZXNBaWRsLCAmcG9ydElkQWlkbCkpKTsKKyAgICAqcG9ydElkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocG9ydElkQWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOworCisgICAgaW50MzJfdCBwb3J0SWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZEFpZGwpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zZXRNYXN0ZXJNb25vKG1vbm8pOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldE1hc3Rlck1vbm8obW9ubykpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWFzdGVyTW9ubyhib29sICptb25vKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1hc3Rlck1vbm8oYm9vbCogbW9ubykgeworICAgIGlmIChtb25vID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5nZXRNYXN0ZXJNb25vKG1vbm8pOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPmdldE1hc3Rlck1vbm8obW9ubykpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0KiBiYWxhbmNlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYWYtPmdldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7CiB9CiAKLWZsb2F0IEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVEQihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworZmxvYXQKK0F1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWVEQihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOQU47Ci0gICAgcmV0dXJuIGFwcy0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxmbG9hdD4geworICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgIGludDMyX3QgaW5kZXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihpbmRleCkpOworICAgICAgICBpbnQzMl90IGRldmljZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoZGV2aWNlKSk7CisgICAgICAgIGZsb2F0IHJldEFpZGw7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBhcHMtPmdldFN0cmVhbVZvbHVtZURCKHN0cmVhbUFpZGwsIGluZGV4QWlkbCwgZGV2aWNlQWlkbCwgJnJldEFpZGwpKSk7CisgICAgICAgIHJldHVybiByZXRBaWRsOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKE5BTik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBtaWNyb3Bob25lcykgewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgcmV0dXJuIGFmLT5nZXRNaWNyb3Bob25lcyhtaWNyb3Bob25lcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7Ci0gIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICBpZiAoYWYgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICByZXR1cm4gYWYtPnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+c2V0QXVkaW9IYWxQaWRzKHBpZHMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQqIG51bVN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc3Vycm91bmRGb3JtYXRzRW5hYmxlZCkgeworICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPT0gbnVsbHB0ciB8fCAoKm51bVN1cnJvdW5kRm9ybWF0cyAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Vycm91bmRGb3JtYXRzID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkID09IG51bGxwdHIpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0U3Vycm91bmRGb3JtYXRzKAotICAgICAgICAgICAgbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsIHJlcG9ydGVkKTsKKyAgICBtZWRpYTo6SW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgbnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtU3Vycm91bmRGb3JtYXRzKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBzdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIHN0ZDo6dmVjdG9yPGJvb2w+IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldFN1cnJvdW5kRm9ybWF0cygmbnVtU3Vycm91bmRGb3JtYXRzQWlkbCwgJnN1cnJvdW5kRm9ybWF0c0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Vycm91bmRGb3JtYXRzRW5hYmxlZEFpZGwpKSk7CisKKyAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KG51bVN1cnJvdW5kRm9ybWF0c0FpZGwudmFsdWUpKTsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKAorICAgICAgICAgICAgY29udmVydFJhbmdlKHN1cnJvdW5kRm9ybWF0c0FpZGwuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzQWlkbC5lbmQoKSwgc3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KSk7CisgICAgc3RkOjpjb3B5KHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRBaWRsLmVuZCgpLAorICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50KiBudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QqIHN1cnJvdW5kRm9ybWF0cykgeworICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPT0gbnVsbHB0ciB8fCAoKm51bVN1cnJvdW5kRm9ybWF0cyAhPSAwICYmIHN1cnJvdW5kRm9ybWF0cyA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKKyAgICBtZWRpYTo6SW50IG51bVN1cnJvdW5kRm9ybWF0c0FpZGw7CisgICAgbnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PigqbnVtU3Vycm91bmRGb3JtYXRzKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiBzdXJyb3VuZEZvcm1hdHNBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKCZudW1TdXJyb3VuZEZvcm1hdHNBaWRsLCAmc3Vycm91bmRGb3JtYXRzQWlkbCkpKTsKKworICAgICpudW1TdXJyb3VuZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4obnVtU3Vycm91bmRGb3JtYXRzQWlkbC52YWx1ZSkpOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzQWlkbC5iZWdpbigpLCBzdXJyb3VuZEZvcm1hdHNBaWRsLmVuZCgpLCBzdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQotewotICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKIAotICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBhdWRpb0Zvcm1hdEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb0Zvcm1hdEFpZGwsIGVuYWJsZWQpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQotewotICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCi0gICAgcmV0dXJuIGFwcy0+c2V0QTExeVNlcnZpY2VzVWlkcyh1aWRzKTsKKyAgICBpbnQzMl90IHVpZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+c2V0QXNzaXN0YW50VWlkKHVpZEFpZGwpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEN1cnJlbnRJbWVVaWQodWlkX3QgdWlkKQotewotICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAKLSAgICByZXR1cm4gYXBzLT5zZXRDdXJyZW50SW1lVWlkKHVpZCk7CisgICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZEFpZGwpKTsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCi17CitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdWlkc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4odWlkcywgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhhcHMtPnNldEExMXlTZXJ2aWNlc1VpZHModWlkc0FpZGwpKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldEN1cnJlbnRJbWVVaWQodWlkX3QgdWlkKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGludDMyX3QgdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRDdXJyZW50SW1lVWlkKHVpZEFpZGwpKTsKK30KKworYm9vbCBBdWRpb1N5c3RlbTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7CisgICAgICAgIGJvb2wgcmV0VmFsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5pc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCZyZXRWYWwpKSk7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfSgpOworICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKSB7Ci0gICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+Ci0gICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4qIGZvcm1hdHMpIHsKKyAgICBpZiAoZm9ybWF0cyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4KKyAgICAgICAgICAgICYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoZm9ybWF0cyk7CisKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+IGZvcm1hdHNBaWRsOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmZvcm1hdHNBaWRsKSkpOworICAgICpmb3JtYXRzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+Pihmb3JtYXRzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdCkpOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yJiBzdHJhdGVnaWVzKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4gc3RyYXRlZ2llc0FpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoJnN0cmF0ZWdpZXNBaWRsKSkpOworICAgIHN0cmF0ZWdpZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3Rvcj4oc3RyYXRlZ2llc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1Byb2R1Y3RTdHJhdGVneSkpOworICAgIHJldHVybiBPSzsKIH0KIAotYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoteworYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKICAgICBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogc3RyYXRlZ2llcykgeworICAgIGZvciAoY29uc3QgYXV0byYgc3RyYXRlZ3kgOiBzdHJhdGVnaWVzKSB7CiAgICAgICAgIGF1dG8gYXR0clZlY3QgPSBzdHJhdGVneS5nZXRBdWRpb0F0dHJpYnV0ZXMoKTsKLSAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZzdHJlYW1dKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5nZXRTdHJlYW1UeXBlKCkgPT0gc3RyZWFtOyB9KTsKKyAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZzdHJlYW1dKGNvbnN0IGF1dG8mIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFN0cmVhbVR5cGUoKSA9PSBzdHJlYW07CisgICAgICAgIH0pOwogICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CiAgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0QXR0cmlidXRlcygpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVzIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgQUxPR0UoImludmFsaWQgc3RyZWFtIHR5cGUgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIGF0dHJpYnV0ZXMiLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOwogICAgIHJldHVybiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOwogfQogCi1hdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKLXsKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyKSB7CiAgICAgcHJvZHVjdF9zdHJhdGVneV90IHBzSWQ7CiAgICAgc3RhdHVzX3QgcmV0ID0gQXVkaW9TeXN0ZW06OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzKGF0dHIpLCBwc0lkKTsKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJubyBzdHJhdGVneSBmb3VuZCBmb3IgYXR0cmlidXRlcyAlcyIsICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIm5vIHN0cmF0ZWd5IGZvdW5kIGZvciBhdHRyaWJ1dGVzICVzIiwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CiAgICAgfQogICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CiAgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7Ci0gICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmF0ZWd5IDogc3RyYXRlZ2llcykgewogICAgICAgICBpZiAoc3RyYXRlZ3kuZ2V0SWQoKSA9PSBwc0lkKSB7CiAgICAgICAgICAgICBhdXRvIGF0dHJWZWN0ID0gc3RyYXRlZ3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJmF0dHJdKGNvbnN0IGF1dG8gJnJlZkF0dHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkF0dHIuZ2V0QXR0cmlidXRlcygpLCBhdHRyKTsgfSk7CisgICAgICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJmF0dHJdKGNvbnN0IGF1dG8mIHJlZkF0dHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmQXR0ci5nZXRBdHRyaWJ1dGVzKCksIGF0dHIpOworICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXItPmdldFN0cmVhbVR5cGUoKTsKICAgICAgICAgICAgIH0KQEAgLTE1NTksMTI1ICsyMDM0LDI3NCBAQAogICAgICAgICAgICAgLy8gdmlydHVhbCBzb3VyY2UgaXMgbm90IGV4cGVjdGVkIHRvIGhhdmUgYW4gYXNzb2NpYXRlZCBwcm9kdWN0IHN0cmF0ZWd5CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGF0dHJpYnV0ZXMgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIHN0cmVhbSIsICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGF0dHJpYnV0ZXMgJXMgd2hlbiBjb252ZXJ0aW5nIHRvIHN0cmVhbSIsIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyYgYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QmIHByb2R1Y3RTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEscHJvZHVjdFN0cmF0ZWd5KTsKKworICAgIG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCBhYUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9BdHRyaWJ1dGVzX0F1ZGlvQXR0cmlidXRlc0V4KGFhKSk7CisgICAgaW50MzJfdCBwcm9kdWN0U3RyYXRlZ3lBaWRsOworCisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhYUFpZGwsIGZhbGxiYWNrT25EZWZhdWx0LAorICAgICAgICAgICAgJnByb2R1Y3RTdHJhdGVneUFpZGwpKSk7CisgICAgcHJvZHVjdFN0cmF0ZWd5ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KHByb2R1Y3RTdHJhdGVneUFpZGwpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yJiBncm91cHMpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXA+IGdyb3Vwc0FpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUigKKyAgICAgICAgICAgIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGFwcy0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKCZncm91cHNBaWRsKSkpOworICAgIGdyb3VwcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3I+KGdyb3Vwc0FpZGwsIGFpZGwybGVnYWN5X0F1ZGlvVm9sdW1lR3JvdXApKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMmIGFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCYgdm9sdW1lR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQpIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgdm9sdW1lR3JvdXApOworCisgICAgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4IGFhQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0F0dHJpYnV0ZXNfQXVkaW9BdHRyaWJ1dGVzRXgoYWEpKTsKKyAgICBpbnQzMl90IHZvbHVtZUdyb3VwQWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWFBaWRsLCBmYWxsYmFja09uRGVmYXVsdCwgJnZvbHVtZUdyb3VwQWlkbCkpKTsKKyAgICB2b2x1bWVHcm91cCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF92b2x1bWVfZ3JvdXBfdCh2b2x1bWVHcm91cEFpZGwpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c2V0UnR0RW5hYmxlZChlbmFibGVkKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5zZXRSdHRFbmFibGVkKGVuYWJsZWQpKTsKIH0KIAotYm9vbCBBdWRpb1N5c3RlbTo6aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpCi17Citib29sIEF1ZGlvU3lzdGVtOjppc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCkgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIGFwcy0+aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpOworCisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKKyAgICAgICAgYm9vbCByZXRBaWRsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoCisgICAgICAgICAgICAgICAgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYXBzLT5pc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCZyZXRBaWRsKSkpOworICAgICAgICByZXR1cm4gcmV0QWlkbDsKKyAgICB9KCk7CisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisKKyAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcHJvZHVjdF9zdHJhdGVneV90X2ludDMyX3Qoc3RyYXRlZ3kpKTsKKyAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQoteworc3RhdHVzX3QKK0F1ZGlvU3lzdGVtOjpyZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlKSB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5yZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgaW50MzJfdCBzdHJhdGVneUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3Byb2R1Y3Rfc3RyYXRlZ3lfdF9pbnQzMl90KHN0cmF0ZWd5KSk7CisgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5yZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHN0cmF0ZWd5QWlkbCwgcm9sZUFpZGwpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQoteworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgaW50MzJfdCBzdHJhdGVneUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3Byb2R1Y3Rfc3RyYXRlZ3lfdF9pbnQzMl90KHN0cmF0ZWd5KSk7CisgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgYXBzLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHN0cmF0ZWd5QWlkbCwgcm9sZUFpZGwsICZkZXZpY2VzQWlkbCkpKTsKKyAgICBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGF1ZGlvU291cmNlKSk7CisgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShyb2xlKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiBkZXZpY2VzQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBhcHMtPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZUFpZGwsIHJvbGVBaWRsLCBkZXZpY2VzQWlkbCkpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoYXVkaW9Tb3VyY2UpKTsKKyAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZGV2aWNlX3JvbGVfdF9EZXZpY2VSb2xlKHJvbGUpKTsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+IGRldmljZXNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsIGRldmljZXNBaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2VBaWRsLCByb2xlQWlkbCkpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShhdWRpb1NvdXJjZSkpOworICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUocm9sZSkpOworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4gZGV2aWNlc0FpZGw7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIGFwcy0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlQWlkbCwgcm9sZUFpZGwsICZkZXZpY2VzQWlkbCkpKTsKKyAgICBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIGNsYXNzIENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbCA6IHB1YmxpYyBtZWRpYTo6Qm5DYXB0dXJlU3RhdGVMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiBwdWJsaWM6CisgICAgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsKAorICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcywKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICAgICAgICAgICAgOiBtQXBzKGFwcyksIG1MaXN0ZW5lcihsaXN0ZW5lcikge30KKworICAgIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1BcHMtPnJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIodGhpcywgJmFjdGl2ZSkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtTGlzdGVuZXItPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTGlzdGVuZXItPm9uU3RhdGVDaGFuZ2VkKGFjdGl2ZSk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BcHMpLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9CisKICAgICBiaW5kZXI6OlN0YXR1cyBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpIG92ZXJyaWRlIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lckxvY2spOwotICAgICAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXItPm9uU3RhdGVDaGFuZ2VkKGFjdGl2ZSk7CisgICAgICAgIG1MaXN0ZW5lci0+b25TdGF0ZUNoYW5nZWQoYWN0aXZlKTsKICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIAogICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYpIG92ZXJyaWRlIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lckxvY2spOwotICAgICAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXItPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgbUxpc3RlbmVyLT5vblNlcnZpY2VEaWVkKCk7CiAgICAgICAgIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lciA9IG51bGxwdHI7CiAgICAgfQorCitwcml2YXRlOgorICAgIC8vIE5lZWQgdGhpcyBpbiBvcmRlciB0byBrZWVwIHRoZSBkZWF0aCByZWNlaXBlbnQgYWxpdmUuCisgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4gbUFwczsKKyAgICBzcDxBdWRpb1N5c3RlbTo6Q2FwdHVyZVN0YXRlTGlzdGVuZXI+IG1MaXN0ZW5lcjsKIH07CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpyZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAotICAgIGNvbnN0IHNwPENhcHR1cmVTdGF0ZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgY29uc3Qgc3A8Q2FwdHVyZVN0YXRlTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobGlzdGVuZXIgPT0gbnVsbHB0cik7CisKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0KICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIHNwPENhcHR1cmVTdGF0ZUxpc3RlbmVySW1wbD4gd3JhcHBlciA9IG5ldyBDYXB0dXJlU3RhdGVMaXN0ZW5lckltcGwoKTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXJMb2NrKTsKKyAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIgPSBuZXcgQ2FwdHVyZVN0YXRlTGlzdGVuZXJJbXBsKGFwcywgbGlzdGVuZXIpOworICAgIGdTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lci0+aW5pdCgpOwogCi0gICAgYm9vbCBhY3RpdmU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgYXBzLT5yZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKHdyYXBwZXIsICZhY3RpdmUpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbGlzdGVuZXItPm9uU2VydmljZURpZWQoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBnU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBsaXN0ZW5lci0+b25TdGF0ZUNoYW5nZWQoYWN0aXZlKTsKLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihhcHMpOwotICAgIGJpbmRlci0+bGlua1RvRGVhdGgod3JhcHBlcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VmlicmF0b3JJbmZvcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcykgeworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT5zZXRWaWJyYXRvckluZm9zKHZpYnJhdG9ySW5mb3MpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvUG9ydENhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKQoteworICAgICAgICBjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1BdWRpb1BvcnRDYWxsYmFja3NbaV0gPT0gY2FsbGJhY2spIHsKQEAgLTE2ODksOCArMjMxMyw3IEBACiB9CiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpyZW1vdmVBdWRpb1BvcnRDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKQEAgLTE3MDYsMjYgKzIzMjksMjUgQEAKIH0KIAogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCi17CitTdGF0dXMgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKQoteworU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc1tpXS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKLXsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXSA9PSBjYWxsYmFjaykgewpAQCAtMTczNyw4ICsyMzU5LDcgQEAKIH0KIAogaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCi17CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgewpAQCAtMTc1MywyMCArMjM3NCwyNiBAQAogICAgIHJldHVybiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKLXsKK1N0YXR1cyBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGludDMyX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXBMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoZ3JvdXApKTsKKyAgICBpbnQgZmxhZ3NMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50PihmbGFncykpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwTGVnYWN5LCBmbGFnc0xlZ2FjeSk7CiAgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCi0gICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCi17Ci0gICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsIHJlZ0lkLnN0cmluZygpLCBzdGF0ZSk7CitTdGF0dXMgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKSB7CisgICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsIHJlZ0lkLmNfc3RyKCksIHN0YXRlKTsKKworICAgIFN0cmluZzggcmVnSWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmc4KHJlZ0lkKSk7CisgICAgaW50IHN0YXRlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludD4oc3RhdGUpKTsKICAgICBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBjYiA9IE5VTEw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKQEAgLTE3NzQsMTkgKzI0MDEsMjAgQEAKICAgICB9CiAKICAgICBpZiAoY2IgIT0gTlVMTCkgewotICAgICAgICBjYihEWU5BTUlDX1BPTElDWV9FVkVOVF9NSVhfU1RBVEVfVVBEQVRFLCByZWdJZCwgc3RhdGUpOworICAgICAgICBjYihEWU5BTUlDX1BPTElDWV9FVkVOVF9NSVhfU1RBVEVfVVBEQVRFLCByZWdJZExlZ2FjeSwgc3RhdGVMZWdhY3kpOwogICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgeworU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgaW50MzJfdCBldmVudCwKKyAgICAgICAgY29uc3QgbWVkaWE6OlJlY29yZENsaWVudEluZm8mIGNsaWVudEluZm8sCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+JiBjbGllbnRFZmZlY3RzLAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBkZXZpY2VDb25maWcsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0cywKKyAgICAgICAgaW50MzJfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UpIHsKICAgICByZWNvcmRfY29uZmlnX2NhbGxiYWNrIGNiID0gTlVMTDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChBdWRpb1N5c3RlbTo6Z0xvY2spOwpAQCAtMTc5NCwxMyArMjQyMiw0NSBAQAogICAgIH0KIAogICAgIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CisgICAgICAgIGludCBldmVudExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQ+KGV2ZW50KSk7CisgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IGNsaWVudEluZm9MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9SZWNvcmRDbGllbnRJbmZvX3JlY29yZF9jbGllbnRfaW5mb190KGNsaWVudEluZm8pKTsKKyAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjbGllbnRDb25maWdMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjbGllbnRDb25maWcpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0c0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4+KAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZ0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGRldmljZUNvbmZpZykpOworICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90Pj4oCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfRWZmZWN0RGVzY3JpcHRvcl9lZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChwYXRjaEhhbmRsZSkpOworICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2VMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3Qoc291cmNlKSk7CisgICAgICAgIGNiKGV2ZW50TGVnYWN5LCAmY2xpZW50SW5mb0xlZ2FjeSwgJmNsaWVudENvbmZpZ0xlZ2FjeSwgY2xpZW50RWZmZWN0c0xlZ2FjeSwKKyAgICAgICAgICAgJmRldmljZUNvbmZpZ0xlZ2FjeSwgZWZmZWN0c0xlZ2FjeSwgcGF0Y2hIYW5kbGVMZWdhY3ksIHNvdXJjZUxlZ2FjeSk7CiAgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQoteworU3RhdHVzIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uUm91dGluZ1VwZGF0ZWQoKSB7CisgICAgcm91dGluZ19jYWxsYmFjayBjYiA9IE5VTEw7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKKyAgICAgICAgY2IgPSBnUm91dGluZ0NhbGxiYWNrOworICAgIH0KKworICAgIGlmIChjYiAhPSBOVUxMKSB7CisgICAgICAgIGNiKCk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKQEAgLTE4MTgsNCArMjQ3OCwyOCBAQAogICAgIEFMT0dXKCJBdWRpb1BvbGljeVNlcnZpY2Ugc2VydmVyIGRpZWQhIik7CiB9CiAKK0NvbnZlcnNpb25SZXN1bHQ8cmVjb3JkX2NsaWVudF9pbmZvX3Q+CithaWRsMmxlZ2FjeV9SZWNvcmRDbGllbnRJbmZvX3JlY29yZF9jbGllbnRfaW5mb190KGNvbnN0IG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvJiBhaWRsKSB7CisgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbGVnYWN5OworICAgIGxlZ2FjeS5yaWlkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoYWlkbC5yaWlkKSk7CisgICAgbGVnYWN5LnVpZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGFpZGwudWlkKSk7CisgICAgbGVnYWN5LnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3QoYWlkbC5zZXNzaW9uKSk7CisgICAgbGVnYWN5LnNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYWlkbC5zb3VyY2UpKTsKKyAgICBsZWdhY3kucG9ydF9pZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5wb3J0SWQpKTsKKyAgICBsZWdhY3kuc2lsZW5jZWQgPSBhaWRsLnNpbGVuY2VkOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OlJlY29yZENsaWVudEluZm8+CitsZWdhY3kyYWlkbF9yZWNvcmRfY2xpZW50X2luZm9fdF9SZWNvcmRDbGllbnRJbmZvKGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190JiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6UmVjb3JkQ2xpZW50SW5mbyBhaWRsOworICAgIGFpZGwucmlpZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KGxlZ2FjeS5yaWlkKSk7CisgICAgYWlkbC51aWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChsZWdhY3kudWlkKSk7CisgICAgYWlkbC5zZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGxlZ2FjeS5zZXNzaW9uKSk7CisgICAgYWlkbC5zb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKGxlZ2FjeS5zb3VyY2UpKTsKKyAgICBhaWRsLnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QobGVnYWN5LnBvcnRfaWQpKTsKKyAgICBhaWRsLnNpbGVuY2VkID0gbGVnYWN5LnNpbGVuY2VkOworICAgIHJldHVybiBhaWRsOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDMyMTI5ZjAuLjVmODAyZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgpAQCAtMzEsNyArMzIsNiBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgpAQCAtNDIsMTAgKzQyLDEzIEBACiAjZGVmaW5lIFdBSVRfU1RSRUFNX0VORF9USU1FT1VUX1NFQyAgICAgMTIwCiBzdGF0aWMgY29uc3QgaW50IGtNYXhMb29wQ291bnROb3RpZmljYXRpb25zID0gMzI7CiAKK3VzaW5nIDo6YW5kcm9pZDo6YWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB1c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogLy8gVE9ETzogTW92ZSB0byBhIHNlcGFyYXRlIC5oCiAKQEAgLTE2Myw5ICsxNjYsMjAgQEAKIGJvb2wgQXVkaW9UcmFjazo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKICAgICBBTE9HVigiJXMoKSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYXBzLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworCisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKKyAgICAgICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBjb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbmZpZykpOworICAgICAgICBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cmlidXRlc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgYm9vbCByZXRBaWRsOworICAgICAgICBSRVRVUk5fSUZfRVJST1IoYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgYXBzLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWdBaWRsLCBhdHRyaWJ1dGVzQWlkbCwgJnJldEFpZGwpKSk7CisgICAgICAgIHJldHVybiByZXRBaWRsOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xOTYsNiArMjEwLDcgQEAKICAgICBtTWV0cmljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJlbmNvZGluZyIsIHRvU3RyaW5nKHRyYWNrLT5tRm9ybWF0KS5jX3N0cigpKTsKICAgICBtTWV0cmljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXRyYWNrLT5tRnJhbWVDb3VudCk7CiAgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiYXR0cmlidXRlcyIsIHRvU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAibG9nU2Vzc2lvbklkIiwgdHJhY2stPm1Mb2dTZXNzaW9uSWQuY19zdHIoKSk7CiB9CiAKIC8vIGhhbmQgdGhlIHVzZXIgYSBzbmFwc2hvdCBvZiB0aGUgbWV0cmljcy4KQEAgLTIxMCw3ICsyMjUsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLUF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soKQorQXVkaW9UcmFjazo6QXVkaW9UcmFjaygpIDogQXVkaW9UcmFjayhBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCkpCit7Cit9CisKK0F1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLAogICAgICAgbVN0YXRlKFNUQVRFX1NUT1BQRUQpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLApAQCAtMjE4LDExICsyMzcsMTIgQEAKICAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlKGF0dHJpYnV0aW9uU291cmNlKSwKICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2sobmV3IEF1ZGlvVHJhY2tDYWxsYmFjaygpKQogewogICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOwogICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVU5LTk9XTjsKLSAgICBtQXR0cmlidXRlcy5mbGFncyA9IDB4MDsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IEFVRElPX0ZMQUdfTk9ORTsKICAgICBzdHJjcHkobUF0dHJpYnV0ZXMudGFncywgIiIpOwogfQogCkBAIC0yMzksOCArMjU5LDcgQEAKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAogICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAogICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkLApAQCAtMjU2LDggKzI3NSw4IEBACiAKICAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLCB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCisgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZSwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogQXVkaW9UcmFjazo6QXVkaW9UcmFjaygKQEAgLTI3Myw4ICsyOTIsNyBAQAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQpCkBAIC0yOTEsNyArMzA5LDcgQEAKICAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0LCBtYXhSZXF1aXJlZFNwZWVkKTsKKyAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLCBwQXR0cmlidXRlcywgZG9Ob3RSZWNvbm5lY3QsIG1heFJlcXVpcmVkU3BlZWQpOwogfQogCiBBdWRpb1RyYWNrOjp+QXVkaW9UcmFjaygpCkBAIC0zMDksMzAgKzMyNyw0MiBAQAogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFUVVMsIChpbnQzMl90KW1TdGF0dXMpCiAgICAgICAgIC5yZWNvcmQoKTsKIAorICAgIHN0b3BBbmRKb2luQ2FsbGJhY2tzKCk7IC8vIGNoZWNrcyBtU3RhdHVzCisKICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBjYWxsYmFjayBmdW5jdGlvbiBleGl0cyBpbiB0aGUgY2FzZSB3aGVyZQotICAgICAgICAvLyBpdCBpcyBsb29waW5nIG9uIGJ1ZmZlciBmdWxsIGNvbmRpdGlvbiBpbiBvYnRhaW5CdWZmZXIoKS4KLSAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB0aHJlYWQgd2lsbCBuZXZlciBleGl0LgotICAgICAgICBzdG9wKCk7Ci0gICAgICAgIGlmIChtQXVkaW9UcmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtUHJveHktPmludGVycnVwdCgpOwotICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9UcmFjay5oCi0gICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci0gICAgICAgICAgICBtQXVkaW9UcmFja1RocmVhZC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKLSAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOwotICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1RyYWNrKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1TaGFyZWRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgICAgICBwaWRfdCBjbGllbnRQaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICAgICAgQUxPR1YoIiVzKCVkKSwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBjbGllbnRQaWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIGNsaWVudFBpZCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvVHJhY2s6OnN0b3BBbmRKb2luQ2FsbGJhY2tzKCkgeworICAgIC8vIFByZXZlbnQgbnVsbHB0ciBjcmFzaCBpZiBpdCBkaWQgbm90IG9wZW4gcHJvcGVybHkuCisgICAgaWYgKG1TdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybjsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGNhbGxiYWNrIGZ1bmN0aW9uIGV4aXRzIGluIHRoZSBjYXNlIHdoZXJlCisgICAgLy8gaXQgaXMgbG9vcGluZyBvbiBidWZmZXIgZnVsbCBjb25kaXRpb24gaW4gb2J0YWluQnVmZmVyKCkuCisgICAgLy8gT3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB0aHJlYWQgd2lsbCBuZXZlciBleGl0LgorICAgIHN0b3AoKTsKKyAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgeyAvLyBub3QgdGhyZWFkIHNhZmUKKyAgICAgICAgbVByb3h5LT5pbnRlcnJ1cHQoKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9UcmFjay5oCisgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQuY2xlYXIoKTsKKyAgICB9CisgICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIFRoaXMgbWF5IG5vdCBzdG9wIGFsbCBvZiB0aGVzZSBkZXZpY2UgY2FsbGJhY2tzIQorICAgICAgICAvLyBUT0RPOiBBZGQgc29tZSBzb3J0IG9mIHByb3RlY3Rpb24uCisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOworICAgICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CiAKQEAgLTM1MSw4ICszODEsNyBAQAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCiAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCiAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCkBAIC0zNjIsMTMgKzM5MSwxNSBAQAogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKIAogICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCiAgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCiAgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOworICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBhdHRyaWJ1dGlvblNvdXJjZS51aWQsIGF0dHJpYnV0aW9uU291cmNlLnBpZCk7CiAKICAgICBtVGhyZWFkQ2FuQ2FsbEphdmEgPSB0aHJlYWRDYW5DYWxsSmF2YTsKICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IHNlbGVjdGVkRGV2aWNlSWQ7CkBAIC00NDEsNyArNDcyLDcgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgIG1PcmlnaW5hbFN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwpAQCAtNDUwLDcgKzQ4MSw3IEBACiAgICAgICAgICAgICAgICAgIiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwotICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICBtT3JpZ2luYWxTdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgICAgIGF1ZGlvX2ZsYWdzX3RvX2F1ZGlvX291dHB1dF9mbGFncyhtQXR0cmlidXRlcy5mbGFncywgJmZsYWdzKTsKICAgICB9CiAKQEAgLTQ1OCw3ICs0ODksNyBAQAogICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0lFQzYxOTM3KSB7IC8vIEhETUkgcGFzcy10aHJvdWdoPwotICAgICAgICBtQXR0cmlidXRlcy5mbGFncyB8PSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU87CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKTsKICAgICB9CiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCkBAIC01MjksNiArNTYwLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtT2ZmbG9hZEluZm8gPSBOVUxMOwogICAgICAgICBtZW1zZXQoJm1PZmZsb2FkSW5mb0NvcHksIDAsIHNpemVvZihhdWRpb19vZmZsb2FkX2luZm9fdCkpOworICAgICAgICBtT2ZmbG9hZEluZm9Db3B5ID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKICAgICB9CiAKICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0gPSAxLjBmOwpAQCAtNTYzLDE3ICs1OTUsMTYgQEAKICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpOwogICAgIH0KICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gMDsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNTUzOiByZWZhY3RvciBvciByZW1vdmUKKyAgICBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKGF0dHJpYnV0aW9uU291cmNlKTsKICAgICBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIG15UGlkID0gZ2V0cGlkKCk7Ci0gICAgaWYgKHVpZCA9PSBBVURJT19VSURfSU5WQUxJRCB8fCAoY2FsbGluZ1BpZCAhPSBteVBpZCkpIHsKLSAgICAgICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtQ2xpZW50VWlkID0gdWlkOworICAgIGlmICh1aWQgPT0gLTEgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7CisgICAgICAgIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSk7CiAgICAgfQotICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBwaWQ7CisgICAgaWYgKHBpZCA9PSAocGlkX3QpLTEgfHwgKGNhbGxpbmdQaWQgIT0gbXlQaWQpKSB7CisgICAgICAgIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGNhbGxpbmdQaWQpKTsKICAgICB9CiAgICAgbUF1eEVmZmVjdElkID0gMDsKICAgICBtT3JpZ0ZsYWdzID0gbUZsYWdzID0gZmxhZ3M7CkBAIC02MTIsNyArNjQzLDcgQEAKICAgICBtUmVsZWFzZWQgPSAwOwogICAgIG1TdGFydE5zID0gMDsKICAgICBtU3RhcnRGcm9tWmVyb1VzID0gMDsKLSAgICBBdWRpb1N5c3RlbTo6YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQsIG1DbGllbnRVaWQpOworICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgcGlkLCB1aWQpOwogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKQEAgLTYzNSw2ICs2NjYsNDAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldCgKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrLAorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNhbGxiYWNrX3QgY2JmLAorICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKKyAgICAgICAgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKKyAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCisgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCisgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKK3sKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QodWlkKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWQpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgcmV0dXJuIHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLCBzaGFyZWRCdWZmZXIsCisgICAgICAgICAgICB0aHJlYWRDYW5DYWxsSmF2YSwgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIG9mZmxvYWRJbmZvLCBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCwgbWF4UmVxdWlyZWRTcGVlZCwgc2VsZWN0ZWREZXZpY2VJZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c3RhcnQoKQpAQCAtNzM1LDcgKzgwMCw3IEBACiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FuZCh+KENCTEtfU1RSRUFNX0VORF9ET05FIHwgQ0JMS19ESVNBQkxFRCksICZtQ2Jsay0+bUZsYWdzKTsKIAogICAgIGlmICghKGZsYWdzICYgQ0JMS19JTlZBTElEKSkgewotICAgICAgICBzdGF0dXMgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCZzdGF0dXMpOwogICAgICAgICBpZiAoc3RhdHVzID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBDQkxLX0lOVkFMSUQ7CiAgICAgICAgIH0KQEAgLTEwMzYsNiArMTEwMSw1MyBAQAogICAgIHJldHVybiBtT3JpZ2luYWxTYW1wbGVSYXRlOwogfQogCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc2V0RHVhbE1vbm9Nb2RlX2wobW9kZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnNldER1YWxNb25vTW9kZV9sKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkKK3sKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgbUF1ZGlvVHJhY2stPnNldER1YWxNb25vTW9kZShWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZHVhbF9tb25vX21vZGVfdF9BdWRpb0R1YWxNb25vTW9kZShtb2RlKSkpKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSBtRHVhbE1vbm9Nb2RlID0gbW9kZTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgbWVkaWE6OkF1ZGlvRHVhbE1vbm9Nb2RlIG1lZGlhTW9kZTsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtQXVkaW9UcmFjay0+Z2V0RHVhbE1vbm9Nb2RlKCZtZWRpYU1vZGUpKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICptb2RlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0R1YWxNb25vTW9kZV9hdWRpb19kdWFsX21vbm9fbW9kZV90KG1lZGlhTW9kZSkpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbF9sKGxldmVsZEIpOworfQorCitzdGF0dXNfdCBBdWRpb1RyYWNrOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxfbChmbG9hdCBsZXZlbGRCKQoreworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIG1BdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxkQiA9IGxldmVsZEI7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobUF1ZGlvVHJhY2stPmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChsZXZlbGRCKSk7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTEwNDMsNyArMTE1NSwxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1BdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wbGF5YmFja19yYXRlX3RfQXVkaW9QbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKSkpKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMTA4LDkgKzEyMjYsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiBBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSBjb25zdAorY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIEF1ZGlvVHJhY2s6OmdldFBsYXliYWNrUmF0ZSgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICBtZWRpYTo6QXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlVGVtcDsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2stPmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoJnBsYXliYWNrUmF0ZVRlbXApKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeyAvLyB1cGRhdGUgbG9jYWwgdmVyc2lvbiBpZiBjaGFuZ2VkLgorICAgICAgICAgICAgbVBsYXliYWNrUmF0ZSA9CisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUGxheWJhY2tSYXRlX2F1ZGlvX3BsYXliYWNrX3JhdGVfdChwbGF5YmFja1JhdGVUZW1wKS52YWx1ZSgpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiBtUGxheWJhY2tSYXRlOwogfQogCkBAIC0xMTY1LDYgKzEyOTIsNDYgQEAKICAgICByZXR1cm4gZmluYWxCdWZmZXJTaXplOwogfQogCitzc2l6ZV90IEF1ZGlvVHJhY2s6OmdldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fCBtUHJveHkuZ2V0KCkgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIChzc2l6ZV90KSBtUHJveHktPmdldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKTsKK30KKworc3NpemVfdCBBdWRpb1RyYWNrOjpzZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKHNpemVfdCBzdGFydFRocmVzaG9sZEluRnJhbWVzKQoreworICAgIGlmIChzdGFydFRocmVzaG9sZEluRnJhbWVzID4gSU5UMzJfTUFYIHx8IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPT0gMCkgeworICAgICAgICAvLyBjb250cmFjdHVhbGx5IHdlIGNvdWxkIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZXNob2xkIGluIGZyYW1lcworICAgICAgICAvLyB0byBpbmRpY2F0ZSB0aGUgcmVxdWVzdCB3YXMgaWdub3JlZCwgYnV0IHdlIHJldHVybiBhbiBlcnJvciBoZXJlLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgLy8gV2UgZG8gbm90IHBlcm1pdCBjYWxsaW5nIHNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKSBiZXR3ZWVuIHRoZSBBdWRpb1RyYWNrCisgICAgLy8gZGVmYXVsdCBjdG9yIEF1ZGlvVHJhY2soKSBhbmQgc2V0KC4uLikgYnV0IHJhdGhlciBmYWlsIHN1Y2ggYW4gYXR0ZW1wdC4KKyAgICAvLyAoVG8gZG8gc28gd291bGQgcmVxdWlyZSBhIGNhY2hlZCBtT3JpZ1N0YXJ0VGhyZXNob2xkSW5GcmFtZXMgYW5kIHdlIG1heQorICAgIC8vIG5vdCBoYXZlIHByb3BlciB2YWxpZGF0aW9uIGZvciB0aGUgYWN0dWFsIHNldCB2YWx1ZSkuCisgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwgbVByb3h5LmdldCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IHVpbnQzMl90IG9yaWdpbmFsID0gbVByb3h5LT5nZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKCk7CisgICAgY29uc3QgdWludDMyX3QgZmluYWwgPSBtUHJveHktPnNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyk7CisgICAgaWYgKG9yaWdpbmFsICE9IGZpbmFsKSB7CisgICAgICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQorICAgICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUU1RBUlRUSFJFU0hPTEQpCisgICAgICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfU1RBUlRUSFJFU0hPTERGUkFNRVMsIChpbnQzMl90KWZpbmFsKQorICAgICAgICAgICAgICAgIC5yZWNvcmQoKTsKKyAgICAgICAgaWYgKG9yaWdpbmFsID4gZmluYWwpIHsKKyAgICAgICAgICAgIC8vIHJlc3RhcnQgdHJhY2sgaWYgaXQgd2FzIGRpc2FibGVkIGJ5IGF1ZGlvZmxpbmdlciBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4KKyAgICAgICAgICAgIC8vIGFuZCB3ZSByZWR1Y2VkIHRoZSBudW1iZXIgb2YgZnJhbWVzIGZvciB0aGUgdGhyZXNob2xkLgorICAgICAgICAgICAgcmVzdGFydElmRGlzYWJsZWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmluYWw7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldExvb3AodWludDMyX3QgbG9vcFN0YXJ0LCB1aW50MzJfdCBsb29wRW5kLCBpbnQgbG9vcENvdW50KQogewogICAgIGlmIChtU2hhcmVkQnVmZmVyID09IDAgfHwgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CkBAIC0xNDI4LDcgKzE1OTUsOCBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQsICZzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7CiAgICAgfQpAQCAtMTQzNyw5ICsxNjA1LDYgQEAKIAogYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1RyYWNrOjpzdHJlYW1UeXBlKCkgY29uc3QKIHsKLSAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKG1BdHRyaWJ1dGVzKTsKLSAgICB9CiAgICAgcmV0dXJuIG1TdHJlYW1UeXBlOwogfQogCkBAIC0xNTIwLDggKzE2ODUsOSBAQAogICAgIH0KIAogICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQgaW5wdXQ7Ci0gICAgaWYgKG1TdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIGlucHV0LmF0dHIgPSBBdWRpb1N5c3RlbTo6c3RyZWFtVHlwZVRvQXR0cmlidXRlcyhtU3RyZWFtVHlwZSk7CisgICAgaWYgKG1PcmlnaW5hbFN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgLy8gTGVnYWN5OiBUaGlzIGlzIGJhc2VkIG9uIG9yaWdpbmFsIHBhcmFtZXRlcnMgZXZlbiBpZiB0aGUgdHJhY2sgaXMgcmVjcmVhdGVkLgorICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobU9yaWdpbmFsU3RyZWFtVHlwZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW5wdXQuYXR0ciA9IG1BdHRyaWJ1dGVzOwogICAgIH0KQEAgLTE1MzAsOCArMTY5Niw3IEBACiAgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKICAgICBpbnB1dC5jb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKICAgICBpbnB1dC5jb25maWcub2ZmbG9hZF9pbmZvID0gbU9mZmxvYWRJbmZvQ29weTsKLSAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZCA9IG1DbGllbnRVaWQ7Ci0gICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPSBtQ2xpZW50UGlkOworICAgIGlucHV0LmNsaWVudEluZm8uYXR0cmlidXRpb25Tb3VyY2UgPSBtQ2xpZW50QXR0cmlidXRpb25Tb3VyY2U7CiAgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQgPSAtMTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICAvLyBJdCBpcyBjdXJyZW50bHkgbWVhbmluZ2xlc3MgdG8gcmVxdWVzdCBTQ0hFRF9GSUZPIGZvciBhIEphdmEgdGhyZWFkLiAgRXZlbiBpZiB0aGUKQEAgLTE1NTYsMTEgKzE3MjEsMTMgQEAKICAgICBpbnB1dC5zZXNzaW9uSWQgPSBtU2Vzc2lvbklkOwogICAgIGlucHV0LmF1ZGlvVHJhY2tDYWxsYmFjayA9IG1BdWRpb1RyYWNrQ2FsbGJhY2s7CiAKLSAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dCBvdXRwdXQ7CisgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgc3RhdHVzID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhWQUxVRV9PUl9GQVRBTChpbnB1dC50b0FpZGwoKSksIHJlc3BvbnNlKTsKIAotICAgIHNwPElBdWRpb1RyYWNrPiB0cmFjayA9IGF1ZGlvRmxpbmdlci0+Y3JlYXRlVHJhY2soaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dCBvdXRwdXR7fTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG91dHB1dCA9IFZBTFVFX09SX0ZBVEFMKElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrT3V0cHV0Ojpmcm9tQWlkbChyZXNwb25zZSkpOworICAgIH0KIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0Lm91dHB1dElkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIG91dHB1dCAlZCIsCkBAIC0xNTcwLDEyICsxNzM3LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgZ290byBleGl0OwogICAgIH0KLSAgICBBTE9HX0FTU0VSVCh0cmFjayAhPSAwKTsKKyAgICBBTE9HX0FTU0VSVChvdXRwdXQuYXVkaW9UcmFjayAhPSAwKTsKIAogICAgIG1GcmFtZUNvdW50ID0gb3V0cHV0LmZyYW1lQ291bnQ7CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKICAgICBtUm91dGVkRGV2aWNlSWQgPSBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZDsKICAgICBtU2Vzc2lvbklkID0gb3V0cHV0LnNlc3Npb25JZDsKKyAgICBtU3RyZWFtVHlwZSA9IG91dHB1dC5zdHJlYW1UeXBlOwogCiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKICAgICBpZiAobU9yaWdpbmFsU2FtcGxlUmF0ZSA9PSAwKSB7CkBAIC0xNTkyLDcgKzE3NjAsOSBAQAogICAgIC8vIHNvIHdlIGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyBpdC4KIAogICAgIC8vIEZJWE1FIGNvbXBhcmUgdG8gQXVkaW9SZWNvcmQKLSAgICBzcDxJTWVtb3J5PiBpTWVtID0gdHJhY2stPmdldENibGsoKTsKKyAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uPiBzZnI7CisgICAgb3V0cHV0LmF1ZGlvVHJhY2stPmdldENibGsoJnNmcik7CisgICAgc3A8SU1lbW9yeT4gaU1lbSA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KHNmcikpOwogICAgIGlmIChpTWVtID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwpAQCAtMTYxMyw3ICsxNzgzLDcgQEAKICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9Ci0gICAgbUF1ZGlvVHJhY2sgPSB0cmFjazsKKyAgICBtQXVkaW9UcmFjayA9IG91dHB1dC5hdWRpb1RyYWNrOwogICAgIG1DYmxrTWVtb3J5ID0gaU1lbTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKQEAgLTE2NjksNyArMTgzOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgbUF1ZGlvVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQsICZzdGF0dXMpOwogCiAgICAgLy8gSWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgZG9uJ3QgbGV0IHRoZSByZXF1ZXN0ZWQgZnJhbWVDb3VudAogICAgIC8vIGRlY3JlYXNlLiAgVGhpcyBjYW4gY29uZnVzZSBjbGllbnRzIHRoYXQgY2FjaGUgZnJhbWVDb3VudCgpLgpAQCAtMTcwNSw2ICsxODc1LDEzIEBACiAgICAgbVByb3h5LT5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlVGVtcCk7CiAgICAgbVByb3h5LT5zZXRNaW5pbXVtKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QpOwogCisgICAgaWYgKG1EdWFsTW9ub01vZGUgIT0gQVVESU9fRFVBTF9NT05PX01PREVfT0ZGKSB7CisgICAgICAgIHNldER1YWxNb25vTW9kZV9sKG1EdWFsTW9ub01vZGUpOworICAgIH0KKyAgICBpZiAobUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbGRCICE9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgeworICAgICAgICBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxfbChtQXVkaW9EZXNjcmlwdGlvbk1peExldmVsZEIpOworICAgIH0KKwogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKQEAgLTE3MjAsNiArMTg5Nyw4IEBACiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0ZMQUdTLCB0b1N0cmluZyhtRmxhZ3MpLmNfc3RyKCkpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MsIHRvU3RyaW5nKG1PcmlnRmxhZ3MpLmNfc3RyKCkpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1NFU1NJT05JRCwgKGludDMyX3QpbVNlc3Npb25JZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTE9HU0VTU0lPTklELCBtTG9nU2Vzc2lvbklkKQorICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZRVJJSUQsIG1QbGF5ZXJJSWQpCiAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1RSQUNLSUQsIG1Qb3J0SWQpIC8vIGR1cCBmcm9tIGtleQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9DT05URU5UVFlQRSwgdG9TdHJpbmcobUF0dHJpYnV0ZXMuY29udGVudF90eXBlKS5jX3N0cigpKQogICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9VU0FHRSwgdG9TdHJpbmcobUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpCkBAIC0xOTEzLDcgKzIwOTIsOCBAQAogICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwotICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoJnN0YXR1cyk7CiAgICAgfQogfQogCkBAIC0xOTM2LDcgKzIxMTYsNyBAQAogICAgIH0KIAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7Ci0gICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAorICAgICAgICAvLyBWYWxpZGF0aW9uOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgogICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwpAQCAtMjMyNiw3ICsyNTA2LDcgQEAKICAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CkBAIC0yNDcwLDYgKzI2NTAsMTAgQEAKICAgICAgICAgc3RhdGljUG9zaXRpb24gPSBtU3RhdGljUHJveHktPmdldFBvc2l0aW9uKCkudW5zaWduZWRWYWx1ZSgpOwogICAgIH0KIAorICAgIC8vIHNhdmUgdGhlIG9sZCBzdGFydFRocmVzaG9sZCBhbmQgZnJhbWVjb3VudAorICAgIGNvbnN0IHVpbnQzMl90IG9yaWdpbmFsU3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA9IG1Qcm94eS0+Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpOworICAgIGNvbnN0IHVpbnQzMl90IG9yaWdpbmFsRnJhbWVDb3VudCA9IG1Qcm94eS0+ZnJhbWVDb3VudCgpOworCiAgICAgLy8gU2VlIGIvNzQ0MDkyNjcuIENvbm5lY3RpbmcgdG8gYSBCVCBBMkRQIGRldmljZSBzdXBwb3J0aW5nIG11bHRpcGxlIGNvZGVjcwogICAgIC8vIGNhdXNlcyBhIGxvdCBvZiBjaHVybiBvbiB0aGUgc2VydmljZSBzaWRlLCBhbmQgaXQgY2FuIHJlamVjdCBzdGFydGluZwogICAgIC8vIHBsYXliYWNrIG9mIGEgcHJldmlvdXNseSBjcmVhdGVkIHRyYWNrLiBNYXkgYWxzbyBhcHBseSB0byBvdGhlciBjYXNlcy4KQEAgLTI1MjEsMTEgKzI3MDUsMjkgQEAKICAgICAgICAgICAgIGlmIChzaGFwZXIuaXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgICAgICBvcGVyYXRpb25Ub0VuZC0+c2V0Tm9ybWFsaXplZFRpbWUoMS5mKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoc2hhcGVyLm1Db25maWd1cmF0aW9uLCBvcGVyYXRpb25Ub0VuZCk7CisgICAgICAgICAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgICAgICBzaGFwZXIubUNvbmZpZ3VyYXRpb24tPndyaXRlVG9QYXJjZWxhYmxlKCZjb25maWcpOworICAgICAgICAgICAgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiBvcGVyYXRpb247CisgICAgICAgICAgICBvcGVyYXRpb25Ub0VuZC0+d3JpdGVUb1BhcmNlbGFibGUoJm9wZXJhdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlnLCBvcGVyYXRpb24sICZzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfSk7CiAKKyAgICAgICAgLy8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgc3RhcnQgdGhyZXNob2xkIGlmIGRpZmZlcmVudCB0aGFuIGZyYW1lQ291bnQuCisgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgIT0gb3JpZ2luYWxGcmFtZUNvdW50KSB7CisgICAgICAgICAgICAvLyBOb3RlOiBtUHJveHktPnNldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKSBjYWxsIGlzIGluIHRoZSBQcm94eQorICAgICAgICAgICAgLy8gYW5kIGRvZXMgbm90IHRyaWdnZXIgYSByZXN0YXJ0LgorICAgICAgICAgICAgLy8gKEFsc28gQ0JMS19ESVNBQkxFRCBpcyBub3Qgc2V0LCBidWZmZXJzIGFyZSBlbXB0eSBhZnRlciB0cmFjayByZWNyZWF0aW9uKS4KKyAgICAgICAgICAgIC8vIEFueSBzdGFydCB3b3VsZCBiZSB0cmlnZ2VyZWQgb24gdGhlIG1TdGF0ZSA9PSBBQ1RJVkUgY2hlY2sgYmVsb3cuCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjdXJyZW50VGhyZXNob2xkID0KKyAgICAgICAgICAgICAgICAgICAgbVByb3h5LT5zZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKG9yaWdpbmFsU3RhcnRUaHJlc2hvbGRJbkZyYW1lcyk7CisgICAgICAgICAgICBBTE9HRF9JRihvcmlnaW5hbFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgIT0gY3VycmVudFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgIiVzKCVkKSBzdGFydFRocmVzaG9sZEluRnJhbWVzIGNoYW5naW5nIGZyb20gJXUgdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgb3JpZ2luYWxTdGFydFRocmVzaG9sZEluRnJhbWVzLCBjdXJyZW50VGhyZXNob2xkKTsKKyAgICAgICAgfQogICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoJnJlc3VsdCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gc2VydmVyIHJlc2V0cyB0byB6ZXJvIHNvIHdlIG9mZnNldAogICAgICAgICBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCA9CkBAIC0yNTk1LDcgKzI3OTcsOSBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIG1BdWRpb1RyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMuY19zdHIoKSwgJnN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkKQEAgLTI2MDcsNyArMjgxMSw5IEBACiAgICAgQUxPR1YoIiVzKCVkKTogUHJlc2VudGF0aW9uSWQvUHJvZ3JhbUlkWyVzXSIsCiAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGFyYW0udG9TdHJpbmcoKS5zdHJpbmcoKSk7CiAKLSAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIG1BdWRpb1RyYWNrLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkuY19zdHIoKSwgJnN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9UcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCkBAIC0yNjE2LDExICsyODIyLDE2IEBACiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIG1Wb2x1bWVIYW5kbGVyLT5zZXRJZElmTmVjZXNzYXJ5KGNvbmZpZ3VyYXRpb24pOwotICAgIFZvbHVtZVNoYXBlcjo6U3RhdHVzIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgIG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICBjb25maWd1cmF0aW9uLT53cml0ZVRvUGFyY2VsYWJsZSgmY29uZmlnKTsKKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyT3BlcmF0aW9uIG9wOworICAgIG9wZXJhdGlvbi0+d3JpdGVUb1BhcmNlbGFibGUoJm9wKTsKKyAgICBWb2x1bWVTaGFwZXI6OlN0YXR1cyBzdGF0dXM7CisgICAgbUF1ZGlvVHJhY2stPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZywgb3AsICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICBpZiAocmVzdG9yZVRyYWNrX2woImFwcGx5Vm9sdW1lU2hhcGVyIikgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5hcHBseVZvbHVtZVNoYXBlcihjb25maWd1cmF0aW9uLCBvcGVyYXRpb24pOworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPmFwcGx5Vm9sdW1lU2hhcGVyKGNvbmZpZywgb3AsICZzdGF0dXMpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdGF0dXMgPj0gMCkgewpAQCAtMjY0MCwxMCArMjg1MSwyMCBAQAogc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gQXVkaW9UcmFjazo6Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKLSAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBzdGF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShpZCk7CisgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6Vm9sdW1lU2hhcGVyU3RhdGU+IHZzczsKKyAgICBtQXVkaW9UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQsICZ2c3MpOworICAgIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IHN0YXRlOworICAgIGlmICh2c3MuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgc3RhdGUgPSBuZXcgVm9sdW1lU2hhcGVyOjpTdGF0ZSgpOworICAgICAgICBzdGF0ZS0+cmVhZEZyb21QYXJjZWxhYmxlKHZzcy52YWx1ZSgpKTsKKyAgICB9CiAgICAgaWYgKHN0YXRlLmdldCgpID09IG51bGxwdHIgJiYgKG1DYmxrLT5tRmxhZ3MgJiBDQkxLX0lOVkFMSUQpICE9IDApIHsKICAgICAgICAgaWYgKHJlc3RvcmVUcmFja19sKCJnZXRWb2x1bWVTaGFwZXJTdGF0ZSIpID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRWb2x1bWVTaGFwZXJTdGF0ZShpZCk7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQsICZ2c3MpOworICAgICAgICAgICAgaWYgKHZzcy5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gbmV3IFZvbHVtZVNoYXBlcjo6U3RhdGUoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+cmVhZEZyb21QYXJjZWxhYmxlKHZzcy52YWx1ZSgpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3RhdGU7CkBAIC0yNzM3LDcgKzI5NTgsMTEgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpKSB7CiAgICAgICAgIC8vIHVzZSBCaW5kZXIgdG8gZ2V0IHRpbWVzdGFtcAotICAgICAgICBzdGF0dXMgPSBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsIHRzOworICAgICAgICBtQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKCZ0cywgJnN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X0F1ZGlvVGltZXN0YW1wSW50ZXJuYWxfQXVkaW9UaW1lc3RhbXAodHMpKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHJlYWQgdGltZXN0YW1wIGZyb20gc2hhcmVkIG1lbW9yeQogICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCBldHM7CkBAIC0zMDU4LDggKzMyODMsNiBAQAogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaWQoJWQpIHN0YXR1cyglZCksIHN0YXRlKCVkKSwgc2Vzc2lvbiBJZCglZCksIGZsYWdzKCUjeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdHJlYW0gdHlwZSglZCksIGxlZnQgLSByaWdodCB2b2x1bWUoJWYsICVmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKG1BdHRyaWJ1dGVzKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfTEVGVF0sIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9SSUdIVF0pOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKQEAgLTMwOTYsNiArMzMxOSwzMSBAQAogICAgIHJldHVybiBtUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCk7CiB9CiAKK3ZvaWQgQXVkaW9UcmFjazo6c2V0TG9nU2Vzc2lvbklkKGNvbnN0IGNoYXIgKmxvZ1Nlc3Npb25JZCkKK3sKKyAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChsb2dTZXNzaW9uSWQgPT0gbnVsbHB0cikgbG9nU2Vzc2lvbklkID0gIiI7ICAvLyBhbiBlbXB0eSBzdHJpbmcgaXMgYW4gdW5zZXQgc2Vzc2lvbiBpZC4KKyAgICBpZiAobUxvZ1Nlc3Npb25JZCA9PSBsb2dTZXNzaW9uSWQpIHJldHVybjsKKworICAgICBtTG9nU2Vzc2lvbklkID0gbG9nU2Vzc2lvbklkOworICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULCBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUTE9HU0VTU0lPTklEKQorICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfTE9HU0VTU0lPTklELCBsb2dTZXNzaW9uSWQpCisgICAgICAgICAucmVjb3JkKCk7Cit9CisKK3ZvaWQgQXVkaW9UcmFjazo6c2V0UGxheWVySUlkKGludCBwbGF5ZXJJSWQpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtUGxheWVySUlkID09IHBsYXllcklJZCkgcmV0dXJuOworCisgICAgbVBsYXllcklJZCA9IHBsYXllcklJZDsKKyAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKKyAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRQTEFZRVJJSUQpCisgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX1BMQVlFUklJRCwgcGxheWVySUlkKQorICAgICAgICAucmVjb3JkKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCBmMWY4ZjljLi4zNTcxOWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1RyYWNrU2hhcmVkIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTMzLDYgKzM0LDIxIEBACiAgICAgcmV0dXJuIHNpemVvZihUKSA+IHNpemVvZihzaXplX3QpICYmIHggPiAoVCkgU0laRV9NQVggPyBTSVpFX01BWCA6IHggPCAwID8gMCA6IChzaXplX3QpIHg7CiB9CiAKKy8vIGNvbXBpbGUtdGltZSBzYWZlIGF0b21pY3MuIFRPRE86IHVwZGF0ZSBhbGwgbWV0aG9kcyB0byB1c2UgaXQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBhbmRyb2lkX2F0b21pY19sb2FkKGNvbnN0IHZvbGF0aWxlIFQqIGFkZHIpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihUKSA9PSBzaXplb2Yoc3RkOjphdG9taWM8VD4pKTsgLy8gbm8gZXh0cmEgc3luYyBkYXRhIHJlcXVpcmVkLgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjphdG9taWM8VD46OmlzX2Fsd2F5c19sb2NrX2ZyZWUpOyAvLyBubyBoYXNoIGxvY2sgc29tZXdoZXJlLgorICAgIHJldHVybiBhdG9taWNfbG9hZCgoc3RkOjphdG9taWM8VD4qKWFkZHIpOyAgICAgICAgICAvLyBtZW1vcnlfb3JkZXJfc2VxX2NzdAorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgYW5kcm9pZF9hdG9taWNfc3RvcmUoY29uc3Qgdm9sYXRpbGUgVCogYWRkciwgVCB2YWx1ZSkgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IHNpemVvZihzdGQ6OmF0b21pYzxUPikpOyAvLyBubyBleHRyYSBzeW5jIGRhdGEgcmVxdWlyZWQuCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmF0b21pYzxUPjo6aXNfYWx3YXlzX2xvY2tfZnJlZSk7IC8vIG5vIGhhc2ggbG9jayBzb21ld2hlcmUuCisgICAgYXRvbWljX3N0b3JlKChzdGQ6OmF0b21pYzxUPiopYWRkciwgdmFsdWUpOyAgICAgICAgIC8vIG1lbW9yeV9vcmRlcl9zZXFfY3N0Cit9CisKIC8vIGluY3JlbWVudFNlcXVlbmNlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuZXh0IHNlcXVlbmNlIHZhbHVlCiAvLyBmb3IgdGhlIGxvb3AgYW5kIHBvc2l0aW9uIHNlcXVlbmNlIGNvdW50ZXJzLiAgSXQgc2hvdWxkIHJldHVybgogLy8gYSB2YWx1ZSBiZXR3ZWVuICJvdGhlciIgKyAxIGFuZCAib3RoZXIiICsgSU5UMzJfTUFYLCB0aGUgY2hvaWNlIG9mCkBAIC01MSw2ICs2Nyw3IEBACiAgICAgOiBtU2VydmVyKDApLCBtRnV0ZXgoMCksIG1NaW5pbXVtKDApCiAgICAgLCBtVm9sdW1lTFIoR0FJTl9NSU5JRkxPQVRfUEFDS0VEX1VOSVRZKSwgbVNhbXBsZVJhdGUoMCksIG1TZW5kTGV2ZWwoMCkKICAgICAsIG1CdWZmZXJTaXplSW5GcmFtZXMoMCkKKyAgICAsIG1TdGFydFRocmVzaG9sZEluRnJhbWVzKDApIC8vIGZpbGxlZCBpbiBieSB0aGUgc2VydmVyLgogICAgICwgbUZsYWdzKDApCiB7CiAgICAgbWVtc2V0KCZ1LCAwLCBzaXplb2YodSkpOwpAQCAtNjYsNiArODMsMjYgQEAKIHsKIH0KIAordWludDMyX3QgUHJveHk6OmdldFN0YXJ0VGhyZXNob2xkSW5GcmFtZXMoKSBjb25zdAoreworICAgIGNvbnN0IHVpbnQzMl90IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPQorICAgICAgICAgICBhbmRyb2lkX2F0b21pY19sb2FkKCZtQ2Jsay0+bVN0YXJ0VGhyZXNob2xkSW5GcmFtZXMpOworICAgIGlmIChzdGFydFRocmVzaG9sZEluRnJhbWVzID09IDAgfHwgc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA+IG1GcmFtZUNvdW50KSB7CisgICAgICAgIEFMT0dEKCIlczogc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyAldSBub3QgYmV0d2VlbiAxIGFuZCBmcmFtZUNvdW50ICV6dSwgIgorICAgICAgICAgICAgICAgICJzZXR0aW5nIHRvIGZyYW1lQ291bnQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGFydFRocmVzaG9sZEluRnJhbWVzLCBtRnJhbWVDb3VudCk7CisgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXJ0VGhyZXNob2xkSW5GcmFtZXM7Cit9CisKK3VpbnQzMl90IFByb3h5OjpzZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKHVpbnQzMl90IHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMpCit7CisgICAgY29uc3QgdWludDMyX3QgYWN0dWFsID0gc3RkOjptaW4oKHNpemVfdClzdGFydFRocmVzaG9sZEluRnJhbWVzLCBmcmFtZUNvdW50KCkpOworICAgIGFuZHJvaWRfYXRvbWljX3N0b3JlKCZtQ2Jsay0+bVN0YXJ0VGhyZXNob2xkSW5GcmFtZXMsIGFjdHVhbCk7CisgICAgcmV0dXJuIGFjdHVhbDsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIENsaWVudFByb3h5OjpDbGllbnRQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsIHNpemVfdCBmcmFtZUNvdW50LApAQCAtNjYzLDYgKzcwMCw3IEBACiAgICAgLCBtVGltZXN0YW1wTXV0YXRvcigmY2Jsay0+bUV4dGVuZGVkVGltZXN0YW1wUXVldWUpCiB7CiAgICAgY2Jsay0+bUJ1ZmZlclNpemVJbkZyYW1lcyA9IGZyYW1lQ291bnQ7CisgICAgY2Jsay0+bVN0YXJ0VGhyZXNob2xkSW5GcmFtZXMgPSBmcmFtZUNvdW50OwogfQogCiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKQEAgLTkwMCwxMSArOTM4LDggQEAKICAgICB9CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CiAKLSAgICBpbnQzMl90IGZsdXNoID0gY2Jsay0+dS5tU3RyZWFtaW5nLm1GbHVzaDsKLSAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7Ci0gICAgICAgIC8vIEZJWE1FIHNob3VsZCByZXR1cm4gYW4gYWNjdXJhdGUgdmFsdWUsIGJ1dCBvdmVyLWVzdGltYXRlIGlzIGJldHRlciB0aGFuIHVuZGVyLWVzdGltYXRlCi0gICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKLSAgICB9CisgICAgZmx1c2hCdWZmZXJJZk5lZWRlZCgpOworCiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwogICAgIHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCmluZGV4IGU3OWEzNjIuLjM2MWY3YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCkBAIC0yMSw2NCArMjEsNTcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oPgorCisjZGVmaW5lIFJFVFVSTl9TVEFUVVNfSUZfRVJST1IoeCkgXAorICAgIHsgYXV0byBfdG1wID0gKHgpOyBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7IH0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKIHsKLSAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7Ci0gICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBtR3JvdXBJZCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKLSAgICAgICAgYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlLmdldEF0dHJpYnV0ZXMoKSk7Ci0gICAgfQotICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7Ci0gICAgICAgIG1TdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgbWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXAgYWlkbDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKGFpZGwucmVhZEZyb21QYXJjZWwocGFyY2VsKSk7CisgICAgKnRoaXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvVm9sdW1lR3JvdXAoYWlkbCkpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQXVkaW9Wb2x1bWVHcm91cDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKIHsKLSAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtR3JvdXBJZCkpOwotICAgIHNpemVfdCBzaXplID0gbUF1ZGlvQXR0cmlidXRlcy5zaXplKCk7Ci0gICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKHNpemUpOwotICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOwotICAgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlcyA6IG1BdWRpb0F0dHJpYnV0ZXMpIHsKLSAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZShhdHRyaWJ1dGVzKTsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gYXR0cmlidXRlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgZmluYWxTaXplLS07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7Ci0gICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihmaW5hbFNpemUpOwotICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtU3RyZWFtcy5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogbVN0cmVhbXMpIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0cmVhbSkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgbWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXAgYWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9Wb2x1bWVHcm91cCgqdGhpcykpOworICAgIHJldHVybiBhaWRsLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Wb2x1bWVHcm91cD4KK2xlZ2FjeTJhaWRsX0F1ZGlvVm9sdW1lR3JvdXAoY29uc3QgQXVkaW9Wb2x1bWVHcm91cCYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXAgYWlkbDsKKyAgICBhaWRsLmdyb3VwSWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdm9sdW1lX2dyb3VwX3RfaW50MzJfdChsZWdhY3kuZ2V0SWQoKSkpOworICAgIGFpZGwubmFtZSA9IGxlZ2FjeS5nZXROYW1lKCk7CisgICAgYWlkbC5hdWRpb0F0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbD4+KAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kuZ2V0QXVkaW9BdHRyaWJ1dGVzKCksCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCkpOworICAgIGFpZGwuc3RyZWFtcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvU3RyZWFtVHlwZT4+KGxlZ2FjeS5nZXRTdHJlYW1UeXBlcygpLAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUpKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworQ29udmVyc2lvblJlc3VsdDxBdWRpb1ZvbHVtZUdyb3VwPgorYWlkbDJsZWdhY3lfQXVkaW9Wb2x1bWVHcm91cChjb25zdCBtZWRpYTo6QXVkaW9Wb2x1bWVHcm91cCYgYWlkbCkgeworICAgIHJldHVybiBBdWRpb1ZvbHVtZUdyb3VwKAorICAgICAgICAgICAgYWlkbC5uYW1lLAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoYWlkbC5ncm91cElkKSksCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk4oY29udmVydENvbnRhaW5lcjxBdHRyaWJ1dGVzVmVjdG9yPigKKyAgICAgICAgICAgICAgICAgICAgYWlkbC5hdWRpb0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdCkpLAorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRDb250YWluZXI8U3RyZWFtVHlwZVZlY3Rvcj4oCisgICAgICAgICAgICAgICAgICAgIGFpZGwuc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3QpKQorICAgICk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKaW5kZXggMTZkMjIzMi4uY2FlODFmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAKQEAgLTI0LDE1ODggKzI0LDEyMDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1lbnVtIHsKLSAgICBDUkVBVEVfVFJBQ0sgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIENSRUFURV9SRUNPUkQsCi0gICAgU0FNUExFX1JBVEUsCi0gICAgUkVTRVJWRUQsICAgLy8gb2Jzb2xldGUsIHdhcyBDSEFOTkVMX0NPVU5UCi0gICAgRk9STUFULAotICAgIEZSQU1FX0NPVU5ULAotICAgIExBVEVOQ1ksCi0gICAgU0VUX01BU1RFUl9WT0xVTUUsCi0gICAgU0VUX01BU1RFUl9NVVRFLAotICAgIE1BU1RFUl9WT0xVTUUsCi0gICAgTUFTVEVSX01VVEUsCi0gICAgU0VUX1NUUkVBTV9WT0xVTUUsCi0gICAgU0VUX1NUUkVBTV9NVVRFLAotICAgIFNUUkVBTV9WT0xVTUUsCi0gICAgU1RSRUFNX01VVEUsCi0gICAgU0VUX01PREUsCi0gICAgU0VUX01JQ19NVVRFLAotICAgIEdFVF9NSUNfTVVURSwKLSAgICBTRVRfUkVDT1JEX1NJTEVOQ0VELAotICAgIFNFVF9QQVJBTUVURVJTLAotICAgIEdFVF9QQVJBTUVURVJTLAotICAgIFJFR0lTVEVSX0NMSUVOVCwKLSAgICBHRVRfSU5QVVRCVUZGRVJTSVpFLAotICAgIE9QRU5fT1VUUFVULAotICAgIE9QRU5fRFVQTElDQVRFX09VVFBVVCwKLSAgICBDTE9TRV9PVVRQVVQsCi0gICAgU1VTUEVORF9PVVRQVVQsCi0gICAgUkVTVE9SRV9PVVRQVVQsCi0gICAgT1BFTl9JTlBVVCwKLSAgICBDTE9TRV9JTlBVVCwKLSAgICBJTlZBTElEQVRFX1NUUkVBTSwKLSAgICBTRVRfVk9JQ0VfVk9MVU1FLAotICAgIEdFVF9SRU5ERVJfUE9TSVRJT04sCi0gICAgR0VUX0lOUFVUX0ZSQU1FU19MT1NULAotICAgIE5FV19BVURJT19VTklRVUVfSUQsCi0gICAgQUNRVUlSRV9BVURJT19TRVNTSU9OX0lELAotICAgIFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwKLSAgICBRVUVSWV9OVU1fRUZGRUNUUywKLSAgICBRVUVSWV9FRkZFQ1QsCi0gICAgR0VUX0VGRkVDVF9ERVNDUklQVE9SLAotICAgIENSRUFURV9FRkZFQ1QsCi0gICAgTU9WRV9FRkZFQ1RTLAotICAgIExPQURfSFdfTU9EVUxFLAotICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFLAotICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCwKLSAgICBTRVRfTE9XX1JBTV9ERVZJQ0UsCi0gICAgTElTVF9BVURJT19QT1JUUywKLSAgICBHRVRfQVVESU9fUE9SVCwKLSAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCi0gICAgUkVMRUFTRV9BVURJT19QQVRDSCwKLSAgICBMSVNUX0FVRElPX1BBVENIRVMsCi0gICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAotICAgIEdFVF9BVURJT19IV19TWU5DX0ZPUl9TRVNTSU9OLAotICAgIFNZU1RFTV9SRUFEWSwKLSAgICBGUkFNRV9DT1VOVF9IQUwsCi0gICAgR0VUX01JQ1JPUEhPTkVTLAotICAgIFNFVF9NQVNURVJfQkFMQU5DRSwKLSAgICBHRVRfTUFTVEVSX0JBTEFOQ0UsCi0gICAgU0VUX0VGRkVDVF9TVVNQRU5ERUQsCi0gICAgU0VUX0FVRElPX0hBTF9QSURTCi19OwordXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7Cit1c2luZyBiaW5kZXI6OlN0YXR1czsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAogCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7ICBcCisgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7IFwKKyAgICAgfSkKIAotY2xhc3MgQnBBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvRmxpbmdlcj4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEF1ZGlvRmxpbmdlcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPihpbXBsKQotICAgIHsKKyNkZWZpbmUgUkVUVVJOX1NUQVRVU19JRl9FUlJPUih4KSAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGF1dG8gX3RtcCA9ICh4KTsgICAgICAgICAgICAgIFwKKyAgICAgICBpZiAoX3RtcCAhPSBPSykgcmV0dXJuIF90bXA7ICBcCiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJQXVkaW9UcmFjaz4gY3JlYXRlVHJhY2soY29uc3QgQ3JlYXRlVHJhY2tJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5wdXQud3JpdGVUb1BhcmNlbCgmZGF0YSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfVFJBQ0ssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgdHJhbnNhY3Rpb24gZXJyb3IgJWQiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICpzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgfQotICAgICAgICAqc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmICgqc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2sgcmV0dXJuZWQgZXJyb3IgJWQiLCAqc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgfQotICAgICAgICB0cmFjayA9IGludGVyZmFjZV9jYXN0PElBdWRpb1RyYWNrPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICBpZiAodHJhY2sgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrIHJldHVybmVkIGFuIE5VTEwgSUF1ZGlvVHJhY2sgd2l0aCBzdGF0dXMgT0siKTsKLSAgICAgICAgICAgICpzdGF0dXMgPSBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHRyYWNrOworI2RlZmluZSBSRVRVUk5fQklOREVSX0lGX0VSUk9SKHgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXV0byBfdG1wID0gKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmIChfdG1wICE9IE9LKSByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChfdG1wKTsgIFwKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IGNyZWF0ZVJlY29yZChjb25zdCBDcmVhdGVSZWNvcmRJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmVjb3JkT3V0cHV0JiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gcmVjb3JkOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnB1dC53cml0ZVRvUGFyY2VsKCZkYXRhKTsKLQotICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9SRUNPUkQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkIHRyYW5zYWN0aW9uIGVycm9yICVkIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAqc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICByZXR1cm4gcmVjb3JkOwotICAgICAgICB9Ci0gICAgICAgICpzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKCpzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgZXJyb3IgJWQiLCAqc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiByZWNvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZWNvcmQgPSBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SUF1ZGlvUmVjb3JkPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICBpZiAocmVjb3JkID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQgcmV0dXJuZWQgYSBOVUxMIElBdWRpb1JlY29yZCB3aXRoIHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgKnN0YXR1cyA9IERFQURfT0JKRUNUOwotICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlY29yZDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNBTVBMRV9SQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgLy8gUkVTRVJWRUQgZm9yIGNoYW5uZWxDb3VudCgpCi0KLSAgICB2aXJ0dWFsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGT1JNQVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZm9ybWF0X3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEZSQU1FX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExBVEVOQ1ksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdCh2YWx1ZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX1ZPTFVNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIG11dGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG11dGVkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQVNURVJfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgZmxvYXQgbWFzdGVyVm9sdW1lKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNQVNURVJfVk9MVU1FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEZsb2F0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIG1hc3Rlck11dGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE1BU1RFUl9NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUZsb2F0KGJhbGFuY2UpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfQkFMQU5DRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgKmJhbGFuY2UgPSByZXBseS5yZWFkRmxvYXQoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUZsb2F0KHZhbHVlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NUUkVBTV9WT0xVTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtdXRlZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfU1RSRUFNX01VVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGZsb2F0IHN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVFJFQU1fVk9MVU1FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEZsb2F0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIHN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVFJFQU1fTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2RlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NT0RFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01JQ19NVVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGdldE1pY011dGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSUNfTVVURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUkVDT1JEX1NJTEVOQ0VELCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChrZXlWYWx1ZVBhaXJzKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QQVJBTUVURVJTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoa2V5cyk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRTdHJpbmc4KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzYW1wbGVSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRCVUZGRVJTSVpFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLSAgICB7Ci0gICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0ciB8fCBjb25maWcgPT0gbnVsbHB0ciB8fCBkZXZpY2UgPT0gbnVsbHB0ciB8fCBsYXRlbmN5TXMgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwotICAgICAgICBkYXRhLndyaXRlUGFyY2VsYWJsZSgqZGV2aWNlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBmbGFncyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXQoKSByZXR1cm5lZCBvdXRwdXQsICVkIiwgKm91dHB1dCk7Ci0gICAgICAgIHJlcGx5LnJlYWQoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKLSAgICAgICAgKmxhdGVuY3lNcyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQxKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQyKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fRFVQTElDQVRFX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIChhdWRpb19pb19oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1VTUEVORF9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBvdXRwdXQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVTVE9SRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCi0gICAgewotICAgICAgICBpZiAoaW5wdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobW9kdWxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpkZXZpY2UpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChhZGRyZXNzKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNvdXJjZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgKmlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICpkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZUlucHV0KGludCBpbnB1dCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbnB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRV9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElOVkFMSURBVEVfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlRmxvYXQodm9sdW1lKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9WT0lDRV9WT0xVTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMsCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUkVOREVSX1BPU0lUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgdWludDMyX3QgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoaGFsRnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqaGFsRnJhbWVzID0gdG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG1wID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoZHNwRnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gdG1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGlvSGFuZGxlKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVF9GUkFNRVNfTE9TVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChORVdfQVVESU9fVU5JUVVFX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaWQ7Ci0gICAgfQotCi0gICAgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIG92ZXJyaWRlCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCl1aWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQUNRVUlSRV9BVURJT19TRVNTSU9OX0lELCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgaW50IHBpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihhdWRpb1Nlc3Npb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fU0VTU0lPTl9JRCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqbnVtRWZmZWN0cykgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9OVU1fRUZGRUNUUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtRWZmZWN0cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAqbnVtRWZmZWN0cyA9ICh1aW50MzJfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJlcGx5LnJlYWQocERlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZSA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShwVXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZShwVHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihwcmVmZXJyZWRUeXBlRmxhZyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfRUZGRUNUX0RFU0NSSVBUT1IsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwbHkucmVhZChwRGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0OwotICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUocERlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7Ci0gICAgICAgIGlmIChkYXRhLndyaXRlUGFyY2VsYWJsZShkZXZpY2UpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBwaWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocHJvYmUgPyAxIDogMCk7Ci0KLSAgICAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZUVmZmVjdCBlcnJvcjogJXMiLCBzdHJlcnJvcigtbFN0YXR1cykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbFN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IHRtcCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGlkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqaWQgPSB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0bXAgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChlbmFibGVkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqZW5hYmxlZCA9IHRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdCA9IGludGVyZmFjZV9jYXN0PElFZmZlY3Q+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXBseS5yZWFkKHBEZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewotICAgICAgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZWZmZWN0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzcmNPdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGRzdE91dHB1dCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNT1ZFX0VGRkVDVFMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihlZmZlY3RJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3VzcGVuZGVkID8gMSA6IDApOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0VGRkVDVF9TVVNQRU5ERUQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhuYW1lKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExPQURfSFdfTU9EVUxFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCkgcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJJTUFSWV9PVVRQVVRfU0FNUExJTkdfUkFURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSBvdmVycmlkZQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotCi0gICAgICAgIHN0YXRpY19hc3NlcnQoTk9fRVJST1IgPT0gMCwgIk5PX0VSUk9SIG11c3QgYmUgMCIpOwotICAgICAgICByZXR1cm4gZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSkKLSAgICAgICAgICAgICAgICA/OiBkYXRhLndyaXRlSW50MzIoKGludCkgaXNMb3dSYW1EZXZpY2UpCi0gICAgICAgICAgICAgICAgPzogZGF0YS53cml0ZUludDY0KHRvdGFsTWVtb3J5KQotICAgICAgICAgICAgICAgID86IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTE9XX1JBTV9ERVZJQ0UsIGRhdGEsICZyZXBseSkKLSAgICAgICAgICAgICAgICA/OiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKQotICAgIHsKLSAgICAgICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICpudW1fcG9ydHMgPT0gMCB8fCBwb3J0cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BvcnRzKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUE9SVFMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmVwbHkucmVhZChwb3J0cywgKm51bV9wb3J0cyAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKLSAgICB7Ci0gICAgICAgIGlmIChwb3J0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BVURJT19QT1JULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8Ci0gICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwbHkucmVhZChwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQotICAgIHsKLSAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQotICAgIHsKLSAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKm51bV9wYXRjaGVzID09IDAgfHwgcGF0Y2hlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqbnVtX3BhdGNoZXMpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QQVRDSEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8Ci0gICAgICAgICAgICAgICAgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmVwbHkucmVhZChwYXRjaGVzLCAqbnVtX3BhdGNoZXMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQotICAgIHsKLSAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fUE9SVF9DT05GSUcsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0FVRElPX0hXX1NZTkNfRk9SX1NFU1NJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19IV19TWU5DX0lOVkFMSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChhdWRpb19od19zeW5jX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmV0dXJuIHJlbW90ZSgpLT50cmFuc2FjdChTWVNURU1fUkVBRFksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBpb0hhbmRsZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGUkFNRV9DT1VOVF9IQUwsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50NjQoKTsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlDUk9QSE9ORVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkUGFyY2VsYWJsZVZlY3RvcihtaWNyb3Bob25lcyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWRzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoYXV0byBwaWQgOiBwaWRzKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX0hBTF9QSURTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgLy8gbWFrZSBzdXJlIHRyYW5zYWN0aW9ucyByZXNlcnZlZCB0byBBdWRpb1BvbGljeU1hbmFnZXIgZG8gbm90IGNvbWUgZnJvbSBvdGhlciBwcm9jZXNzZXMKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKLSAgICAgICAgY2FzZSBTRVRfU1RSRUFNX01VVEU6Ci0gICAgICAgIGNhc2UgT1BFTl9PVVRQVVQ6Ci0gICAgICAgIGNhc2UgT1BFTl9EVVBMSUNBVEVfT1VUUFVUOgotICAgICAgICBjYXNlIENMT1NFX09VVFBVVDoKLSAgICAgICAgY2FzZSBTVVNQRU5EX09VVFBVVDoKLSAgICAgICAgY2FzZSBSRVNUT1JFX09VVFBVVDoKLSAgICAgICAgY2FzZSBPUEVOX0lOUFVUOgotICAgICAgICBjYXNlIENMT1NFX0lOUFVUOgotICAgICAgICBjYXNlIElOVkFMSURBVEVfU1RSRUFNOgotICAgICAgICBjYXNlIFNFVF9WT0lDRV9WT0xVTUU6Ci0gICAgICAgIGNhc2UgTU9WRV9FRkZFQ1RTOgotICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfU1VTUEVOREVEOgotICAgICAgICBjYXNlIExPQURfSFdfTU9EVUxFOgotICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6Ci0gICAgICAgIGNhc2UgR0VUX0FVRElPX1BPUlQ6Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOgotICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6Ci0gICAgICAgIGNhc2UgTElTVF9BVURJT19QQVRDSEVTOgotICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzoKLSAgICAgICAgY2FzZSBTRVRfUkVDT1JEX1NJTEVOQ0VEOgotICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIC8vIHJldHVybiBzdGF0dXMgb25seSBmb3Igbm9uIHZvaWQgbWV0aG9kcwotICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRfUkVDT1JEX1NJTEVOQ0VEOgotICAgICAgICAgICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+IChJTlZBTElEX09QRVJBVElPTikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9ucyBjb21lIGZyb20gc3lzdGVtIGNvbXBvbmVudHMKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX1ZPTFVNRToKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01VVEU6Ci0gICAgICAgIGNhc2UgU0VUX01PREU6Ci0gICAgICAgIGNhc2UgU0VUX01JQ19NVVRFOgotICAgICAgICBjYXNlIFNFVF9MT1dfUkFNX0RFVklDRToKLSAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6Ci0gICAgICAgIGNhc2UgU0VUX0FVRElPX0hBTF9QSURTOiB7Ci0gICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCi0gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoSU5WQUxJRF9PUEVSQVRJT04pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBXaGl0ZWxpc3Qgb2YgcmVsZXZhbnQgZXZlbnRzIHRvIHRyaWdnZXIgbG9nIG1lcmdpbmcuCi0gICAgLy8gTG9nIG1lcmdpbmcgc2hvdWxkIGFjdGl2YXRlIGR1cmluZyBhdWRpbyBhY3Rpdml0eSBvZiBhbnkga2luZC4gVGhpcyBhcmUgY29uc2lkZXJlZCB0aGUKLSAgICAvLyBtb3N0IHJlbGV2YW50IGV2ZW50cy4KLSAgICAvLyBUT0RPIHNob3VsZCBzZWxlY3QgbW9yZSB3aXNlbHkgdGhlIGl0ZW1zIGZyb20gdGhlIGxpc3QKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6Ci0gICAgICAgIGNhc2UgQ1JFQVRFX1JFQ09SRDoKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX1ZPTFVNRToKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01VVEU6Ci0gICAgICAgIGNhc2UgU0VUX01JQ19NVVRFOgotICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOgotICAgICAgICBjYXNlIENSRUFURV9FRkZFQ1Q6Ci0gICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7Ci0gICAgICAgICAgICByZXF1ZXN0TG9nTWVyZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb0ZsaW5nZXIgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOwotICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7Ci0KLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIENyZWF0ZVRyYWNrSW5wdXQgaW5wdXQ7Ci0gICAgICAgICAgICBpZiAoaW5wdXQucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoREVBRF9PQkpFQ1QpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0OwotCi0gICAgICAgICAgICBzcDxJQXVkaW9UcmFjaz4gdHJhY2s9IGNyZWF0ZVRyYWNrKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwotCi0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCh0cmFjayAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcih0cmFjaykpOwotICAgICAgICAgICAgb3V0cHV0LndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENSRUFURV9SRUNPUkQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIENyZWF0ZVJlY29yZElucHV0IGlucHV0OwotICAgICAgICAgICAgaWYgKGlucHV0LnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKERFQURfT0JKRUNUKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCBvdXRwdXQ7Ci0KLSAgICAgICAgICAgIHNwPG1lZGlhOjpJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IGNyZWF0ZVJlY29yZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7Ci0KLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHJlY29yZCAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihyZWNvcmQpKTsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZVRvUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTQU1QTEVfUkFURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzYW1wbGVSYXRlKChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICAvLyBSRVNFUlZFRCBmb3IgY2hhbm5lbENvdW50KCkKLQotICAgICAgICBjYXNlIEZPUk1BVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBmb3JtYXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEZSQU1FX0NPVU5UOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoIGZyYW1lQ291bnQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExBVEVOQ1k6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggbGF0ZW5jeSgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX01BU1RFUl9WT0xVTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0TWFzdGVyVm9sdW1lKGRhdGEucmVhZEZsb2F0KCkpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX01BU1RFUl9NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1hc3Rlck11dGUoZGF0YS5yZWFkSW50MzIoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBNQVNURVJfVk9MVU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQoIG1hc3RlclZvbHVtZSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgTUFTVEVSX01VVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggbWFzdGVyTXV0ZSgpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX01BU1RFUl9CQUxBTkNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldE1hc3RlckJhbGFuY2UoZGF0YS5yZWFkRmxvYXQoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfTUFTVEVSX0JBTEFOQ0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBmbG9hdCBmOwotICAgICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWFzdGVyQmFsYW5jZSgmZik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICh2b2lkKXJlcGx5LT53cml0ZUZsb2F0KGYpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmbG9hdCB2b2x1bWUgPSBkYXRhLnJlYWRGbG9hdCgpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHNldFN0cmVhbVZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCkgc3RyZWFtLCB2b2x1bWUsIG91dHB1dCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfU1RSRUFNX01VVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIGRhdGEucmVhZEludDMyKCkpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX1ZPTFVNRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IG91dHB1dCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVGbG9hdCggc3RyZWFtVm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KSBzdHJlYW0sIG91dHB1dCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIHN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpIHN0cmVhbSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTU9ERTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX21vZGVfdCBtb2RlID0gKGF1ZGlvX21vZGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNb2RlKG1vZGUpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX01JQ19NVVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHN0YXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNaWNNdXRlKHN0YXRlKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9NSUNfTVVURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBnZXRNaWNNdXRlKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfUkVDT1JEX1NJTEVOQ0VEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHBvcnRJZCwgc2lsZW5jZWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnMoZGF0YS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleVZhbHVlUGFpcnMpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfUEFSQU1FVEVSUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgU3RyaW5nOCBrZXlzKGRhdGEucmVhZFN0cmluZzgoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGdldFBhcmFtZXRlcnMoaW9IYW5kbGUsIGtleXMpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFJFR0lTVEVSX0NMSUVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb0ZsaW5nZXJDbGllbnQ+KAotICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZWdpc3RlckNsaWVudChjbGllbnQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9JTlBVVEJVRkZFUlNJWkU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaykgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBPUEVOX09VVFBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShBVURJT19ERVZJQ0VfTk9ORSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgICAgIGlmICgoc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZShkZXZpY2UuZ2V0KCkpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSAwOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXMgPSBvcGVuT3V0cHV0KG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywgZGV2aWNlLCAmbGF0ZW5jeU1zLCBmbGFncyk7Ci0gICAgICAgICAgICBBTE9HVigiT1BFTl9PVVRQVVQgb3V0cHV0LCAlZCIsIG91dHB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW91dHB1dCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxhdGVuY3lNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgT1BFTl9EVVBMSUNBVEVfT1VUUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdCkgb3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQxLCBvdXRwdXQyKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xPU0VfT1VUUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY2xvc2VPdXRwdXQoKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU1VTUEVORF9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdXNwZW5kT3V0cHV0KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFU1RPUkVfT1VUUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdG9yZU91dHB1dCgoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBPUEVOX0lOUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IChhdWRpb19tb2R1bGVfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOwotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9wZW5JbnB1dChtb2R1bGUsICZpbnB1dCwgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KSBpbnB1dCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xPU0VfSU5QVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjbG9zZUlucHV0KChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSURBVEVfU1RSRUFNOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGludmFsaWRhdGVTdHJlYW0oc3RyZWFtKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGZsb2F0IHZvbHVtZSA9IGRhdGEucmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggc2V0Vm9pY2VWb2x1bWUodm9sdW1lKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9SRU5ERVJfUE9TSVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBoYWxGcmFtZXMgPSAwOwotICAgICAgICAgICAgdWludDMyX3QgZHNwRnJhbWVzID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFJlbmRlclBvc2l0aW9uKCZoYWxGcmFtZXMsICZkc3BGcmFtZXMsIG91dHB1dCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZHNwRnJhbWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9JTlBVVF9GUkFNRVNfTE9TVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE5FV19BVURJT19VTklRVUVfSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihuZXdBdWRpb1VuaXF1ZUlkKChhdWRpb191bmlxdWVfaWRfdXNlX3QpIGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBBQ1FVSVJFX0FVRElPX1NFU1NJT05fSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNvbnN0IHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChhdWRpb1Nlc3Npb24sIHBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUVVFUllfTlVNX0VGRkVDVFM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KW51bUVmZmVjdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUVVFUllfRUZGRUNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBxdWVyeUVmZmVjdChkYXRhLnJlYWRJbnQzMigpLCAmZGVzYyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZCA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTM5NDE3MTg5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGUgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEzOTQxNzE4OSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZGVzYyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENSRUFURV9FRkZFQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2MgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkwNTk1MSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8SUVmZmVjdENsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUVmZmVjdENsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgICAgICAgICBpZiAoKHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGUoJmRldmljZSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHByb2JlID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotCi0gICAgICAgICAgICBpbnQgaWQgPSAwOwotICAgICAgICAgICAgaW50IGVuYWJsZWQgPSAwOwotCi0gICAgICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3QgPSBjcmVhdGVFZmZlY3QoJmRlc2MsIGNsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgc2Vzc2lvbklkLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsIHBpZCwgcHJvYmUsICZzdGF0dXMsICZpZCwgJmVuYWJsZWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVuYWJsZWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGVmZmVjdCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlKCZkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIE1PVkVfRUZGRUNUUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG1vdmVFZmZlY3RzKHNlc3Npb24sIHNyY091dHB1dCwgZHN0T3V0cHV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgZWZmZWN0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHN1c3BlbmRlZCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKLSAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3RJZCwgc2Vzc2lvbklkLCBzdXNwZW5kZWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIExPQURfSFdfTU9EVUxFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobG9hZEh3TW9kdWxlKGRhdGEucmVhZENTdHJpbmcoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfUFJJTUFSWV9PVVRQVVRfRlJBTUVfQ09VTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IGlzTG93UmFtRGV2aWNlOwotICAgICAgICAgICAgaW50NjRfdCB0b3RhbE1lbW9yeTsKLSAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZEludDMyKCZpc0xvd1JhbURldmljZSkgPzoKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50NjQoJnRvdGFsTWVtb3J5KSA/OgotICAgICAgICAgICAgICAgICAgICBzZXRMb3dSYW1EZXZpY2UoaXNMb3dSYW1EZXZpY2UgIT0gMCwgdG90YWxNZW1vcnkpOwotICAgICAgICAgICAgKHZvaWQpcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1Qb3J0c1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIG51bVBvcnRzUmVxID0gTUFYX0lURU1TX1BFUl9MSVNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVBvcnRzID0gbnVtUG9ydHNSZXE7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BvcnQgKiljYWxsb2MobnVtUG9ydHNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwotICAgICAgICAgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1BvcnRzKCZudW1Qb3J0cywgcG9ydHMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG51bVBvcnRzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiBudW1Qb3J0cykgewotICAgICAgICAgICAgICAgICAgICBudW1Qb3J0c1JlcSA9IG51bVBvcnRzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocG9ydHMsIG51bVBvcnRzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKHBvcnRzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJnBvcnQsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmcG9ydCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgZGF0YS5yZWFkKCZwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjM5MDU5NTEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGU7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlcyA9IG51bVBhdGNoZXNSZXE7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BhdGNoICopY2FsbG9jKG51bVBhdGNoZXNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICAgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUGF0Y2hlcygmbnVtUGF0Y2hlcywgcGF0Y2hlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUGF0Y2hlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBudW1QYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBudW1QYXRjaGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocGF0Y2hlcywgbnVtUGF0Y2hlc1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocGF0Y2hlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0FVRElPX1BPUlRfQ09ORklHOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZzsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEdFVF9BVURJT19IV19TWU5DX0ZPUl9TRVNTSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTWVNURU1fUkVBRFk6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzeXN0ZW1SZWFkeSgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEZSQU1FX0NPVU5UX0hBTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KCBmcmFtZUNvdW50SEFMKChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKSkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBHRVRfTUlDUk9QSE9ORVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IG1pY3JvcGhvbmVzOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWljcm9waG9uZXMoJm1pY3JvcGhvbmVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlUGFyY2VsYWJsZVZlY3RvcihtaWNyb3Bob25lcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBTRVRfQVVESU9fSEFMX1BJRFM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxwaWRfdD4gcGlkczsKLSAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGludDMyX3QgcGlkOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9ICBkYXRhLnJlYWRJbnQzMigmcGlkKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpZHMucHVzaF9iYWNrKHBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRBdWRpb0hhbFBpZHMocGlkcykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdD4gSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dDo6dG9BaWRsKCkgY29uc3QgeworICAgIG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QgYWlkbDsKKyAgICBhaWRsLmF0dHIgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGF0dHIpKTsKKyAgICBhaWRsLmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICBhaWRsLmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoY2xpZW50SW5mbykpOworICAgIGFpZGwuc2hhcmVkQnVmZmVyID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKHNoYXJlZEJ1ZmZlcikpOworICAgIGFpZGwubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOworICAgIGFpZGwuc3BlZWQgPSBzcGVlZDsKKyAgICBhaWRsLmF1ZGlvVHJhY2tDYWxsYmFjayA9IGF1ZGlvVHJhY2tDYWxsYmFjazsKKyAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOworICAgIGFpZGwuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oZnJhbWVDb3VudCkpOworICAgIGFpZGwubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obm90aWZpY2F0aW9uRnJhbWVDb3VudCkpOworICAgIGFpZGwuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChzZWxlY3RlZERldmljZUlkKSk7CisgICAgYWlkbC5zZXNzaW9uSWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIGFpZGw7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NvbnZlcnNpb25SZXN1bHQ8SUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dD4KK0lBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrSW5wdXQ6OmZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGFpZGwpIHsKKyAgICBJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja0lucHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYWlkbC5hdHRyKSk7CisgICAgbGVnYWN5LmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChhaWRsLmNvbmZpZykpOworICAgIGxlZ2FjeS5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGFpZGwuY2xpZW50SW5mbykpOworICAgIGxlZ2FjeS5zaGFyZWRCdWZmZXIgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfTnVsbGFibGVTaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoYWlkbC5zaGFyZWRCdWZmZXIpKTsKKyAgICBsZWdhY3kubm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5ub3RpZmljYXRpb25zUGVyQnVmZmVyKSk7CisgICAgbGVnYWN5LnNwZWVkID0gYWlkbC5zcGVlZDsKKyAgICBsZWdhY3kuYXVkaW9UcmFja0NhbGxiYWNrID0gYWlkbC5hdWRpb1RyYWNrQ2FsbGJhY2s7CisgICAgbGVnYWN5LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfbWFzayhhaWRsLmZsYWdzKSk7CisgICAgbGVnYWN5LmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgbGVnYWN5Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBsZWdhY3kuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZT4KK0lBdWRpb0ZsaW5nZXI6OkNyZWF0ZVRyYWNrT3V0cHV0Ojp0b0FpZGwoKSBjb25zdCB7CisgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UgYWlkbDsKKyAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOworICAgIGFpZGwuZnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oZnJhbWVDb3VudCkpOworICAgIGFpZGwubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obm90aWZpY2F0aW9uRnJhbWVDb3VudCkpOworICAgIGFpZGwuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChzZWxlY3RlZERldmljZUlkKSk7CisgICAgYWlkbC5zZXNzaW9uSWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgYWlkbC5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihzYW1wbGVSYXRlKSk7CisgICAgYWlkbC5zdHJlYW1UeXBlID0gIFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbVR5cGUpKTsKKyAgICBhaWRsLmFmRnJhbWVDb3VudCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4oYWZGcmFtZUNvdW50KSk7CisgICAgYWlkbC5hZlNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGFmU2FtcGxlUmF0ZSkpOworICAgIGFpZGwuYWZMYXRlbmN5TXMgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KGFmTGF0ZW5jeU1zKSk7CisgICAgYWlkbC5vdXRwdXRJZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dElkKSk7CisgICAgYWlkbC5wb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgIGFpZGwuYXVkaW9UcmFjayA9IGF1ZGlvVHJhY2s7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8SUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tPdXRwdXQ+CitJQXVkaW9GbGluZ2VyOjpDcmVhdGVUcmFja091dHB1dDo6ZnJvbUFpZGwoCisgICAgICAgIGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlJiBhaWRsKSB7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tPdXRwdXQgbGVnYWN5OworICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soYWlkbC5mbGFncykpOworICAgIGxlZ2FjeS5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5ub3RpZmljYXRpb25GcmFtZUNvdW50KSk7CisgICAgbGVnYWN5LnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5zZWxlY3RlZERldmljZUlkKSk7CisgICAgbGVnYWN5LnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb25JZCkpOworICAgIGxlZ2FjeS5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LnN0cmVhbVR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChhaWRsLnN0cmVhbVR5cGUpKTsKKyAgICBsZWdhY3kuYWZGcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuYWZGcmFtZUNvdW50KSk7CisgICAgbGVnYWN5LmFmU2FtcGxlUmF0ZSA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGwuYWZTYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmFmTGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5hZkxhdGVuY3lNcykpOworICAgIGxlZ2FjeS5vdXRwdXRJZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGFpZGwub3V0cHV0SWQpKTsKKyAgICBsZWdhY3kucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnBvcnRJZCkpOworICAgIGxlZ2FjeS5hdWRpb1RyYWNrID0gYWlkbC5hdWRpb1RyYWNrOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3Q+CitJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRJbnB1dDo6dG9BaWRsKCkgY29uc3QgeworICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0IGFpZGw7CisgICAgYWlkbC5hdHRyID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2F0dHJpYnV0ZXNfdF9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbChhdHRyKSk7CisgICAgYWlkbC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoY29uZmlnKSk7CisgICAgYWlkbC5jbGllbnRJbmZvID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX0F1ZGlvQ2xpZW50X0F1ZGlvQ2xpZW50KGNsaWVudEluZm8pKTsKKyAgICBhaWRsLnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChyaWlkKSk7CisgICAgYWlkbC5tYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcykpOworICAgIGFpZGwuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKKyAgICBhaWRsLmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KGZyYW1lQ291bnQpKTsKKyAgICBhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDY0X3Q+KG5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBhaWRsLnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3Qoc2VsZWN0ZWREZXZpY2VJZCkpOworICAgIGFpZGwuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb25JZCkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0PgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkSW5wdXQ6OmZyb21BaWRsKAorICAgICAgICBjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgYWlkbCkgeworICAgIElBdWRpb0ZsaW5nZXI6OkNyZWF0ZVJlY29yZElucHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuYXR0ciA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhaWRsLmF0dHIpKTsKKyAgICBsZWdhY3kuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGFpZGwuY29uZmlnKSk7CisgICAgbGVnYWN5LmNsaWVudEluZm8gPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoYWlkbC5jbGllbnRJbmZvKSk7CisgICAgbGVnYWN5LnJpaWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChhaWRsLnJpaWQpKTsKKyAgICBsZWdhY3kubWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oYWlkbC5tYXhTaGFyZWRBdWRpb0hpc3RvcnlNcykpOworICAgIGxlZ2FjeS5mbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lucHV0X2ZsYWdzX3RfbWFzayhhaWRsLmZsYWdzKSk7CisgICAgbGVnYWN5LmZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5mcmFtZUNvdW50KSk7CisgICAgbGVnYWN5Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsLm5vdGlmaWNhdGlvbkZyYW1lQ291bnQpKTsKKyAgICBsZWdhY3kuc2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBsZWdhY3kuc2Vzc2lvbklkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGFpZGwuc2Vzc2lvbklkKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2U+CitJQXVkaW9GbGluZ2VyOjpDcmVhdGVSZWNvcmRPdXRwdXQ6OnRvQWlkbCgpIGNvbnN0IHsKKyAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2UgYWlkbDsKKyAgICBhaWRsLmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfaW50MzJfdF9tYXNrKGZsYWdzKSk7CisgICAgYWlkbC5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihmcmFtZUNvdW50KSk7CisgICAgYWlkbC5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90Pihub3RpZmljYXRpb25GcmFtZUNvdW50KSk7CisgICAgYWlkbC5zZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBhaWRsLnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChzZXNzaW9uSWQpKTsKKyAgICBhaWRsLnNhbXBsZVJhdGUgPSBWQUxVRV9PUl9SRVRVUk4oY29udmVydEludGVncmFsPGludDMyX3Q+KHNhbXBsZVJhdGUpKTsKKyAgICBhaWRsLmlucHV0SWQgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dElkKSk7CisgICAgYWlkbC5jYmxrID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKGNibGspKTsKKyAgICBhaWRsLmJ1ZmZlcnMgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfTnVsbGFibGVJTWVtb3J5X1NoYXJlZEZpbGVSZWdpb24oYnVmZmVycykpOworICAgIGFpZGwucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKKyAgICBhaWRsLmF1ZGlvUmVjb3JkID0gYXVkaW9SZWNvcmQ7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8SUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0PgorSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0Ojpmcm9tQWlkbCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBhaWRsKSB7CisgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlUmVjb3JkT3V0cHV0IGxlZ2FjeTsKKyAgICBsZWdhY3kuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soYWlkbC5mbGFncykpOworICAgIGxlZ2FjeS5mcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGwuZnJhbWVDb3VudCkpOworICAgIGxlZ2FjeS5ub3RpZmljYXRpb25GcmFtZUNvdW50ID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbC5ub3RpZmljYXRpb25GcmFtZUNvdW50KSk7CisgICAgbGVnYWN5LnNlbGVjdGVkRGV2aWNlSWQgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoYWlkbC5zZWxlY3RlZERldmljZUlkKSk7CisgICAgbGVnYWN5LnNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhaWRsLnNlc3Npb25JZCkpOworICAgIGxlZ2FjeS5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbC5zYW1wbGVSYXRlKSk7CisgICAgbGVnYWN5LmlucHV0SWQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChhaWRsLmlucHV0SWQpKTsKKyAgICBsZWdhY3kuY2JsayA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShhaWRsLmNibGspKTsKKyAgICBsZWdhY3kuYnVmZmVycyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9OdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25fSU1lbW9yeShhaWRsLmJ1ZmZlcnMpKTsKKyAgICBsZWdhY3kucG9ydElkID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChhaWRsLnBvcnRJZCkpOworICAgIGxlZ2FjeS5hdWRpb1JlY29yZCA9IGFpZGwuYXVkaW9SZWNvcmQ7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcgorCitBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlclNlcnZpY2U+IGRlbGVnYXRlKSA6IG1EZWxlZ2F0ZShkZWxlZ2F0ZSkge30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Y3JlYXRlVHJhY2soY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSYgb3V0cHV0KSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Y3JlYXRlVHJhY2soaW5wdXQsICZvdXRwdXQpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Y3JlYXRlUmVjb3JkKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2UmIG91dHB1dCkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmNyZWF0ZVJlY29yZChpbnB1dCwgJm91dHB1dCkpOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgaW9IYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW9IYW5kbGUpKTsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zYW1wbGVSYXRlKGlvSGFuZGxlQWlkbCwgJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworYXVkaW9fZm9ybWF0X3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Zm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19mb3JtYXRfdD4geworICAgICAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmZvcm1hdChvdXRwdXRBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8c2l6ZV90PiB7CisgICAgICAgIGludDMyX3QgaW9IYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW9IYW5kbGUpKTsKKyAgICAgICAgaW50NjRfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5mcmFtZUNvdW50KGlvSGFuZGxlQWlkbCwgJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PiB7CisgICAgICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmxhdGVuY3kob3V0cHV0QWlkbCwgJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0TWFzdGVyVm9sdW1lKHZhbHVlKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldE1hc3Rlck11dGUobXV0ZWQpKTsKK30KKworZmxvYXQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6bWFzdGVyVm9sdW1lKCkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxmbG9hdD4geworICAgICAgICBmbG9hdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5tYXN0ZXJWb2x1bWUoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBhaWRsUmV0OworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwLmYpOworfQorCitib29sIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om1hc3Rlck11dGUoKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PGJvb2w+IHsKKyAgICAgICAgYm9vbCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5tYXN0ZXJNdXRlKCZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gYWlkbFJldDsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoZmFsc2UpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIHsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCogYmFsYW5jZSkgY29uc3R7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Z2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CisgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtQWlkbCwgdmFsdWUsIG91dHB1dEFpZGwpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6c2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCkgeworICAgIG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUFpZGwsIG11dGVkKSk7Cit9CisKK2Zsb2F0IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8ZmxvYXQ+IHsKKyAgICAgICAgbWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICAgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgICAgICBmbG9hdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5zdHJlYW1Wb2x1bWUoc3RyZWFtQWlkbCwgb3V0cHV0QWlkbCwgJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBhaWRsUmV0OworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwLmYpOworfQorCitib29sIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8Ym9vbD4geworICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3N0cmVhbV90eXBlX3RfQXVkaW9TdHJlYW1UeXBlKHN0cmVhbSkpOworICAgICAgICBib29sIGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPnN0cmVhbU11dGUoc3RyZWFtQWlkbCwgJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBhaWRsUmV0OworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICBtZWRpYTo6QXVkaW9Nb2RlIG1vZGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19tb2RlX3RfQXVkaW9Nb2RlKG1vZGUpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRNb2RlKG1vZGVBaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldE1pY011dGUoc3RhdGUpKTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRNaWNNdXRlKCkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxib29sPiB7CisgICAgICAgIGJvb2wgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0TWljTXV0ZSgmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGFpZGxSZXQ7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKGZhbHNlKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRSZWNvcmRTaWxlbmNlZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBpbnQzMl90IHBvcnRJZEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChwb3J0SWQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0UmVjb3JkU2lsZW5jZWQocG9ydElkQWlkbCwgc2lsZW5jZWQpKTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgICh2b2lkKSByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKKyAgICBpbnQzMl90IGlvSGFuZGxlQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgIHN0ZDo6c3RyaW5nIGtleVZhbHVlUGFpcnNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX1N0cmluZzhfc3RyaW5nKGtleVZhbHVlUGFpcnMpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zZXRQYXJhbWV0ZXJzKGlvSGFuZGxlQWlkbCwga2V5VmFsdWVQYWlyc0FpZGwpKTsKK30KKworU3RyaW5nOCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKQorY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxTdHJpbmc4PiB7CisgICAgICAgIGludDMyX3QgaW9IYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW9IYW5kbGUpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5c0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcoa2V5cykpOworICAgICAgICBzdGQ6OnN0cmluZyBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRQYXJhbWV0ZXJzKGlvSGFuZGxlQWlkbCwga2V5c0FpZGwsICZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoU3RyaW5nOCgpKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkgeworICAgIG1EZWxlZ2F0ZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRJbnB1dEJ1ZmZlclNpemUodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxzaXplX3Q+IHsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlQWlkbCA9IFZBTFVFX09SX1JFVFVSTihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oc2FtcGxlUmF0ZSkpOworICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZm9ybWF0QWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChmb3JtYXQpKTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsTWFza0FpZGwgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdChjaGFubmVsTWFzaykpOworICAgICAgICBpbnQ2NF90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlQWlkbCwgZm9ybWF0QWlkbCwgY2hhbm5lbE1hc2tBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPHNpemVfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogcmVzcG9uc2UpIHsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5vcGVuT3V0cHV0KHJlcXVlc3QsIHJlc3BvbnNlKSk7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MikgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19pb19oYW5kbGVfdD4geworICAgICAgICBpbnQzMl90IG91dHB1dDFBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0MSkpOworICAgICAgICBpbnQzMl90IG91dHB1dDJBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0MikpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MUFpZGwsIG91dHB1dDJBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKKyAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Y2xvc2VPdXRwdXQob3V0cHV0QWlkbCkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzdXNwZW5kT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgeworICAgIGludDMyX3Qgb3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT5zdXNwZW5kT3V0cHV0KG91dHB1dEFpZGwpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6cmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKKyAgICBpbnQzMl90IG91dHB1dEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+cmVzdG9yZU91dHB1dChvdXRwdXRBaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6Om9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIHJlc3BvbnNlKSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+b3BlbklucHV0KHJlcXVlc3QsIHJlc3BvbnNlKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpIHsKKyAgICBpbnQzMl90IGlucHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPmNsb3NlSW5wdXQoaW5wdXRBaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmludmFsaWRhdGVTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKKyAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW1BaWRsKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCogaGFsRnJhbWVzLCB1aW50MzJfdCogZHNwRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCB7CisgICAgaW50MzJfdCBvdXRwdXRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG91dHB1dCkpOworICAgIG1lZGlhOjpSZW5kZXJQb3NpdGlvbiBhaWRsUmV0OworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBtRGVsZWdhdGUtPmdldFJlbmRlclBvc2l0aW9uKG91dHB1dEFpZGwsICZhaWRsUmV0KSkpOworICAgIGlmIChoYWxGcmFtZXMgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFsRnJhbWVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGxSZXQuaGFsRnJhbWVzKSk7CisgICAgfQorICAgIGlmIChkc3BGcmFtZXMgIT0gbnVsbHB0cikgeworICAgICAgICAqZHNwRnJhbWVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGFpZGxSZXQuZHNwRnJhbWVzKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBbJl0oKSAtPiBDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PiB7CisgICAgICAgIGludDMyX3QgaW9IYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoaW9IYW5kbGUpKTsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRJbnB1dEZyYW1lc0xvc3QoaW9IYW5kbGVBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oYWlkbFJldCk7CisgICAgfSgpOworICAgIC8vIEZhaWx1cmUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKDApOworfQorCithdWRpb191bmlxdWVfaWRfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdW5pcXVlX2lkX3Q+IHsKKyAgICAgICAgbWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2UgdXNlQWlkbCA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdXNlX3RfQXVkaW9VbmlxdWVJZFVzZSh1c2UpKTsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5uZXdBdWRpb1VuaXF1ZUlkKHVzZUFpZGwsICZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihBVURJT19VTklRVUVfSURfQUxMT0NBVEUpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKKyAgICBbJl0oKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3QoYXVkaW9TZXNzaW9uKSk7CisgICAgICAgIGludDMyX3QgcGlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChwaWQpKTsKKyAgICAgICAgaW50MzJfdCB1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHVpZCkpOworICAgICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5hY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uQWlkbCwgcGlkQWlkbCwgdWlkQWlkbCkpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgeworICAgIFsmXSgpIC0+IHN0YXR1c190IHsKKyAgICAgICAgaW50MzJfdCBhdWRpb1Nlc3Npb25BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19zZXNzaW9uX3RfaW50MzJfdChhdWRpb1Nlc3Npb24pKTsKKyAgICAgICAgaW50MzJfdCBwaWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZCkpOworICAgICAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uQWlkbCwgcGlkQWlkbCkpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCogbnVtRWZmZWN0cykgY29uc3QgeworICAgIGludDMyX3QgYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgbURlbGVnYXRlLT5xdWVyeU51bWJlckVmZmVjdHMoJmFpZGxSZXQpKSk7CisgICAgaWYgKG51bUVmZmVjdHMgIT0gbnVsbHB0cikgeworICAgICAgICAqbnVtRWZmZWN0cyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsUmV0KSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QKK0F1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgY29uc3QgeworICAgIGludDMyX3QgaW5kZXhBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXgpKTsKKyAgICBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciBhaWRsUmV0OworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBtRGVsZWdhdGUtPnF1ZXJ5RWZmZWN0KGluZGV4QWlkbCwgJmFpZGxSZXQpKSk7CisgICAgaWYgKHBEZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoYWlkbFJldCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogcEVmZmVjdFVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIHBUeXBlVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSBjb25zdCB7CisgICAgbWVkaWE6OkF1ZGlvVXVpZCBlZmZlY3RVdWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb191dWlkX3RfQXVkaW9VdWlkKCpwRWZmZWN0VVVJRCkpOworICAgIG1lZGlhOjpBdWRpb1V1aWQgdHlwZVV1aWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoKnBUeXBlVVVJRCkpOworICAgIGludDMyX3QgcHJlZmVycmVkVHlwZUZsYWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihwcmVmZXJyZWRUeXBlRmxhZykpOworICAgIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yIGFpZGxSZXQ7CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0RWZmZWN0RGVzY3JpcHRvcihlZmZlY3RVdWlkQWlkbCwgdHlwZVV1aWRBaWRsLCBwcmVmZXJyZWRUeXBlRmxhZ0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpZGxSZXQpKSk7CisgICAgaWYgKHBEZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBEZXNjcmlwdG9yID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoYWlkbFJldCkpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmNyZWF0ZUVmZmVjdChjb25zdCBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UqIHJlc3BvbnNlKSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+Y3JlYXRlRWZmZWN0KHJlcXVlc3QsIHJlc3BvbnNlKSk7Cit9CisKK3N0YXR1c190CitBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjptb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSB7CisgICAgaW50MzJfdCBzZXNzaW9uQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbikpOworICAgIGludDMyX3Qgc3JjT3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KHNyY091dHB1dCkpOworICAgIGludDMyX3QgZHN0T3V0cHV0QWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGRzdE91dHB1dCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIG1EZWxlZ2F0ZS0+bW92ZUVmZmVjdHMoc2Vzc2lvbkFpZGwsIHNyY091dHB1dEFpZGwsIGRzdE91dHB1dEFpZGwpKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSB7CisgICAgWyZdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBpbnQzMl90IGVmZmVjdElkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KGVmZmVjdElkKSk7CisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc2Vzc2lvbl90X2ludDMyX3Qoc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPnNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3RJZEFpZGwsIHNlc3Npb25JZEFpZGwsIHN1c3BlbmRlZCkpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpsb2FkSHdNb2R1bGUoY29uc3QgY2hhciogbmFtZSkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19tb2R1bGVfaGFuZGxlX3Q+IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZUFpZGwobmFtZSk7CisgICAgICAgIGludDMyX3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+bG9hZEh3TW9kdWxlKG5hbWVBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSgpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+IHsKKyAgICAgICAgaW50MzJfdCBhaWRsUmV0OworICAgICAgICBSRVRVUk5fSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCZhaWRsUmV0KSkpOworICAgICAgICByZXR1cm4gY29udmVydEludGVncmFsPHVpbnQzMl90PihhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpIHsKKyAgICBhdXRvIHJlc3VsdCA9IFsmXSgpIC0+IENvbnZlcnNpb25SZXN1bHQ8c2l6ZV90PiB7CisgICAgICAgIGludDY0X3QgYWlkbFJldDsKKyAgICAgICAgUkVUVVJOX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Z2V0UHJpbWFyeU91dHB1dEZyYW1lQ291bnQoJmFpZGxSZXQpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0SW50ZWdyYWw8c2l6ZV90PihhaWRsUmV0KTsKKyAgICB9KCk7CisgICAgLy8gRmFpbHVyZSBpcyBpZ25vcmVkLgorICAgIHJldHVybiByZXN1bHQudmFsdWVfb3IoMCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlLCB0b3RhbE1lbW9yeSkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcqIHBvcnQpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0IHBvcnRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydCgqcG9ydCkpOworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRBdWRpb1BvcnQocG9ydEFpZGwsICZhaWRsUmV0KSkpOworICAgICpwb3J0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92NyhhaWRsUmV0KSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUpIHsKKyAgICBtZWRpYTo6QXVkaW9QYXRjaCBwYXRjaEFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX0F1ZGlvUGF0Y2goKnBhdGNoKSk7CisgICAgaW50MzJfdCBhaWRsUmV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KAorICAgICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkpOworICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBhaWRsUmV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KCpoYW5kbGUpKTsKKyAgICB9CisgICAgUkVUVVJOX1NUQVRVU19JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgIG1EZWxlZ2F0ZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEFpZGwsICZhaWRsUmV0KSkpOworICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICAqaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BhdGNoX2hhbmRsZV90KGFpZGxSZXQpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBpbnQzMl90IGhhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX2hhbmRsZV90X2ludDMyX3QoaGFuZGxlKSk7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlQWlkbCkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCogbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2hlcykgeworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiBhaWRsUmV0OworICAgIGludDMyX3QgbWF4UGF0Y2hlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KCpudW1fcGF0Y2hlcykpOworICAgIFJFVFVSTl9TVEFUVVNfSUZfRVJST1Ioc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoCisgICAgICAgICAgICBtRGVsZWdhdGUtPmxpc3RBdWRpb1BhdGNoZXMobWF4UGF0Y2hlcywgJmFpZGxSZXQpKSk7CisgICAgKm51bV9wYXRjaGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihhaWRsUmV0LnNpemUoKSkpOworICAgIHJldHVybiBjb252ZXJ0UmFuZ2UoYWlkbFJldC5iZWdpbigpLCBhaWRsUmV0LmVuZCgpLCBwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9QYXRjaF9hdWRpb19wYXRjaCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGNvbmZpZykgeworICAgIG1lZGlhOjpBdWRpb1BvcnRDb25maWcgY29uZmlnQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19BdWRpb1BvcnRDb25maWcoKmNvbmZpZykpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWdBaWRsKSk7Cit9CisKK2F1ZGlvX2h3X3N5bmNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxhdWRpb19od19zeW5jX3Q+IHsKKyAgICAgICAgaW50MzJfdCBzZXNzaW9uSWRBaWRsID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb25JZCkpOworICAgICAgICBpbnQzMl90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihzZXNzaW9uSWRBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faHdfc3luY190KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICByZXR1cm4gcmVzdWx0LnZhbHVlX29yKEFVRElPX0hXX1NZTkNfSU5WQUxJRCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnN5c3RlbVJlYWR5KCkgeworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnN5c3RlbVJlYWR5KCkpOworfQorCitzaXplX3QgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcjo6ZnJhbWVDb3VudEhBTChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QgeworICAgIGF1dG8gcmVzdWx0ID0gWyZdKCkgLT4gQ29udmVyc2lvblJlc3VsdDxzaXplX3Q+IHsKKyAgICAgICAgaW50MzJfdCBpb0hhbmRsZUFpZGwgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpb0hhbmRsZSkpOworICAgICAgICBpbnQ2NF90IGFpZGxSZXQ7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUihzdGF0dXNURnJvbUJpbmRlclN0YXR1cygKKyAgICAgICAgICAgICAgICBtRGVsZWdhdGUtPmZyYW1lQ291bnRIQUwoaW9IYW5kbGVBaWRsLCAmYWlkbFJldCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRJbnRlZ3JhbDxzaXplX3Q+KGFpZGxSZXQpOworICAgIH0oKTsKKyAgICAvLyBGYWlsdXJlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcigwKTsKK30KKworc3RhdHVzX3QKK0F1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OmdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIG1pY3JvcGhvbmVzKSB7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4gYWlkbFJldDsKKyAgICBSRVRVUk5fU1RBVFVTX0lGX0VSUk9SKHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgbURlbGVnYXRlLT5nZXRNaWNyb3Bob25lcygmYWlkbFJldCkpKTsKKyAgICBpZiAobWljcm9waG9uZXMgIT0gbnVsbHB0cikgeworICAgICAgICAqbWljcm9waG9uZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPj4oYWlkbFJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6YWlkbDJsZWdhY3lfTWljcm9waG9uZUluZm8pKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcGlkc0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4ocGlkcywgbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdCkpOworICAgIHJldHVybiBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhtRGVsZWdhdGUtPnNldEF1ZGlvSGFsUGlkcyhwaWRzQWlkbCkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJDbGllbnRBZGFwdGVyOjpzZXRWaWJyYXRvckluZm9zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+JiB2aWJyYXRvckluZm9zKSB7CisgICAgcmV0dXJuIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKG1EZWxlZ2F0ZS0+c2V0VmlicmF0b3JJbmZvcyh2aWJyYXRvckluZm9zKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXI6OnVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCYgdHJhY2tTZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OlRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbz4gdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvcyA9CisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpUcmFja1NlY29uZGFyeU91dHB1dEluZm8+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1NlY29uZGFyeU91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpcl9UcmFja1NlY29uZGFyeU91dHB1dEluZm8pKTsKKyAgICByZXR1cm4gc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMobURlbGVnYXRlLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb3MpKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyCitBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyKAorICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpEZWxlZ2F0ZT4mIGRlbGVnYXRlKSA6IG1EZWxlZ2F0ZShkZWxlZ2F0ZSkge30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+b25UcmFuc2FjdFdyYXBwZXIoc3RhdGljX2Nhc3Q8RGVsZWdhdGU6OlRyYW5zYWN0aW9uQ29kZT4oY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CisgICAgcmV0dXJuIG1EZWxlZ2F0ZS0+ZHVtcChmZCwgYXJncyk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNyZWF0ZVRyYWNrKHJlcXVlc3QsICpfYWlkbF9yZXR1cm4pKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNyZWF0ZVJlY29yZChyZXF1ZXN0LCAqX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzYW1wbGVSYXRlKGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPnNhbXBsZVJhdGUoaW9IYW5kbGVMZWdhY3kpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZvcm1hdChpbnQzMl90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KG1EZWxlZ2F0ZS0+Zm9ybWF0KG91dHB1dExlZ2FjeSkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6ZnJhbWVDb3VudChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGlvSGFuZGxlKSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50NjRfdD4obURlbGVnYXRlLT5mcmFtZUNvdW50KGlvSGFuZGxlTGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpsYXRlbmN5KGludDMyX3Qgb3V0cHV0LCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPmxhdGVuY3kob3V0cHV0TGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldE1hc3RlclZvbHVtZSh2YWx1ZSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TWFzdGVyTXV0ZShib29sIG11dGVkKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRNYXN0ZXJNdXRlKG11dGVkKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjptYXN0ZXJWb2x1bWUoZmxvYXQqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPm1hc3RlclZvbHVtZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjptYXN0ZXJNdXRlKGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtRGVsZWdhdGUtPm1hc3Rlck11dGUoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldE1hc3RlckJhbGFuY2UoZmxvYXQqIF9haWRsX3JldHVybikgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+Z2V0TWFzdGVyQmFsYW5jZShfYWlkbF9yZXR1cm4pKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0KSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qob3V0cHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCB2YWx1ZSwgb3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRTdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSwgbXV0ZWQpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbURlbGVnYXRlLT5zdHJlYW1Wb2x1bWUoc3RyZWFtTGVnYWN5LCBvdXRwdXRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW0pKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbURlbGVnYXRlLT5zdHJlYW1NdXRlKHN0cmVhbUxlZ2FjeSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldE1vZGUobWVkaWE6OkF1ZGlvTW9kZSBtb2RlKSB7CisgICAgYXVkaW9fbW9kZV90IG1vZGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobW9kZSkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TW9kZShtb2RlTGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnNldE1pY011dGUoc3RhdGUpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldE1pY011dGUoYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IG1EZWxlZ2F0ZS0+Z2V0TWljTXV0ZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRSZWNvcmRTaWxlbmNlZChpbnQzMl90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkgeworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWQpKTsKKyAgICBtRGVsZWdhdGUtPnNldFJlY29yZFNpbGVuY2VkKHBvcnRJZExlZ2FjeSwgc2lsZW5jZWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0UGFyYW1ldGVycyhpbnQzMl90IGlvSGFuZGxlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5VmFsdWVQYWlycykgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICBTdHJpbmc4IGtleVZhbHVlUGFpcnNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nOChrZXlWYWx1ZVBhaXJzKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRQYXJhbWV0ZXJzKGlvSGFuZGxlTGVnYWN5LCBrZXlWYWx1ZVBhaXJzTGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRQYXJhbWV0ZXJzKGludDMyX3QgaW9IYW5kbGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICBTdHJpbmc4IGtleXNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzgoa2V5cykpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcobURlbGVnYXRlLT5nZXRQYXJhbWV0ZXJzKGlvSGFuZGxlTGVnYWN5LCBrZXlzTGVnYWN5KSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCkgeworICAgIG1EZWxlZ2F0ZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzaywgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZUxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPHVpbnQzMl90PihzYW1wbGVSYXRlKSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KGZvcm1hdCkpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QoY2hhbm5lbE1hc2spKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1EZWxlZ2F0ZS0+Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGVMZWdhY3ksIGZvcm1hdExlZ2FjeSwgY2hhbm5lbE1hc2tMZWdhY3kpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihzaXplKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6Om9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5vcGVuT3V0cHV0KHJlcXVlc3QsIF9haWRsX3JldHVybikpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6b3BlbkR1cGxpY2F0ZU91dHB1dChpbnQzMl90IG91dHB1dDEsIGludDMyX3Qgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDFMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQxKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dDIpKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCByZXN1bHQgPSBtRGVsZWdhdGUtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0MUxlZ2FjeSwgb3V0cHV0MkxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Y2xvc2VPdXRwdXQoaW50MzJfdCBvdXRwdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPmNsb3NlT3V0cHV0KG91dHB1dExlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3VzcGVuZE91dHB1dChpbnQzMl90IG91dHB1dCkgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KG91dHB1dCkpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c3VzcGVuZE91dHB1dChvdXRwdXRMZWdhY3kpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnJlc3RvcmVPdXRwdXQoaW50MzJfdCBvdXRwdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnJlc3RvcmVPdXRwdXQob3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5vcGVuSW5wdXQocmVxdWVzdCwgX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjbG9zZUlucHV0KGludDMyX3QgaW5wdXQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGlucHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5jbG9zZUlucHV0KGlucHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjppbnZhbGlkYXRlU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1MZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbUxlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworU3RhdHVzCitBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRSZW5kZXJQb3NpdGlvbihpbnQzMl90IG91dHB1dCwgbWVkaWE6OlJlbmRlclBvc2l0aW9uKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChvdXRwdXQpKTsKKyAgICB1aW50MzJfdCBoYWxGcmFtZXNMZWdhY3k7CisgICAgdWludDMyX3QgZHNwRnJhbWVzTGVnYWN5OworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IoCisgICAgICAgICAgICBtRGVsZWdhdGUtPmdldFJlbmRlclBvc2l0aW9uKCZoYWxGcmFtZXNMZWdhY3ksICZkc3BGcmFtZXNMZWdhY3ksIG91dHB1dExlZ2FjeSkpOworICAgIF9haWRsX3JldHVybi0+aGFsRnJhbWVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaGFsRnJhbWVzTGVnYWN5KSk7CisgICAgX2FpZGxfcmV0dXJuLT5kc3BGcmFtZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90Pihkc3BGcmFtZXNMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0SW5wdXRGcmFtZXNMb3N0KGludDMyX3QgaW9IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW9IYW5kbGUpKTsKKyAgICB1aW50MzJfdCByZXN1bHQgPSBtRGVsZWdhdGUtPmdldElucHV0RnJhbWVzTG9zdChpb0hhbmRsZUxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoY29udmVydEludGVncmFsPGludDMyX3Q+KHJlc3VsdCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bmV3QXVkaW9VbmlxdWVJZChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSB1c2UsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2VMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VbmlxdWVJZFVzZV9hdWRpb191bmlxdWVfaWRfdXNlX3QodXNlKSk7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5uZXdBdWRpb1VuaXF1ZUlkKHVzZUxlZ2FjeSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMKK0F1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQzMl90IGF1ZGlvU2Vzc2lvbiwgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhdWRpb1Nlc3Npb24pKTsKKyAgICBwaWRfdCBwaWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QocGlkKSk7CisgICAgdWlkX3QgdWlkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZCkpOworICAgIG1EZWxlZ2F0ZS0+YWNxdWlyZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvU2Vzc2lvbkxlZ2FjeSwgcGlkTGVnYWN5LCB1aWRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoaW50MzJfdCBhdWRpb1Nlc3Npb24sIGludDMyX3QgcGlkKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChhdWRpb1Nlc3Npb24pKTsKKyAgICBwaWRfdCBwaWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QocGlkKSk7CisgICAgbURlbGVnYXRlLT5yZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9TZXNzaW9uTGVnYWN5LCBwaWRMZWdhY3kpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpxdWVyeU51bWJlckVmZmVjdHMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3QgcmVzdWx0OworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IobURlbGVnYXRlLT5xdWVyeU51bWJlckVmZmVjdHMoJnJlc3VsdCkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4ocmVzdWx0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzCitBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpxdWVyeUVmZmVjdChpbnQzMl90IGluZGV4LCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSB7CisgICAgdWludDMyX3QgaW5kZXhMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oaW5kZXgpKTsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IHJlc3VsdDsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+cXVlcnlFZmZlY3QoaW5kZXhMZWdhY3ksICZyZXN1bHQpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcihyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3IqIF9haWRsX3JldHVybikgeworICAgIGVmZmVjdF91dWlkX3QgZWZmZWN0VXVpZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KGVmZmVjdFVVSUQpKTsKKyAgICBlZmZlY3RfdXVpZF90IHR5cGVVdWlkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodHlwZVVVSUQpKTsKKyAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZ0xlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBjb252ZXJ0UmVpbnRlcnByZXQ8dWludDMyX3Q+KHByZWZlcnJlZFR5cGVGbGFnKSk7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCByZXN1bHQ7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmdldEVmZmVjdERlc2NyaXB0b3IoJmVmZmVjdFV1aWRMZWdhY3ksICZ0eXBlVXVpZExlZ2FjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRUeXBlRmxhZ0xlZ2FjeSwgJnJlc3VsdCkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKHJlc3VsdCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSogX2FpZGxfcmV0dXJuKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgX2FpZGxfcmV0dXJuKSk7Cit9CisKK1N0YXR1cworQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bW92ZUVmZmVjdHMoaW50MzJfdCBzZXNzaW9uLCBpbnQzMl90IHNyY091dHB1dCwgaW50MzJfdCBkc3RPdXRwdXQpIHsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbkxlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3Qoc3JjT3V0cHV0KSk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0TGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoZHN0T3V0cHV0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtRGVsZWdhdGUtPm1vdmVFZmZlY3RzKHNlc3Npb25MZWdhY3ksIHNyY091dHB1dExlZ2FjeSwgZHN0T3V0cHV0TGVnYWN5KSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50MzJfdCBlZmZlY3RJZCwgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSB7CisgICAgaW50IGVmZmVjdElkTGVnYWN5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0UmVpbnRlcnByZXQ8aW50PihlZmZlY3RJZCkpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWRMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbklkKSk7CisgICAgbURlbGVnYXRlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0SWRMZWdhY3ksIHNlc3Npb25JZExlZ2FjeSwgc3VzcGVuZGVkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bG9hZEh3TW9kdWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5sb2FkSHdNb2R1bGUobmFtZS5jX3N0cigpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19tb2R1bGVfaGFuZGxlX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtRGVsZWdhdGUtPmdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUigKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihtRGVsZWdhdGUtPmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworCit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjpzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0TG93UmFtRGV2aWNlKGlzTG93UmFtRGV2aWNlLCB0b3RhbE1lbW9yeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3BvcnRfdjcgcG9ydExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcocG9ydCkpOworICAgIFJFVFVSTl9CSU5ERVJfSUZfRVJST1IobURlbGVnYXRlLT5nZXRBdWRpb1BvcnQoJnBvcnRMZWdhY3kpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChwb3J0TGVnYWN5KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3QgbWVkaWE6OkF1ZGlvUGF0Y2gmIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2hMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2gocGF0Y2gpKTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdCgqX2FpZGxfcmV0dXJuKSk7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoTGVnYWN5LCAmaGFuZGxlTGVnYWN5KSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIobGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChoYW5kbGVMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goaW50MzJfdCBoYW5kbGUpIHsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChoYW5kbGUpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtRGVsZWdhdGUtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZUxlZ2FjeSkpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6bGlzdEF1ZGlvUGF0Y2hlcyhpbnQzMl90IG1heENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiogX2FpZGxfcmV0dXJuKSB7CisgICAgdW5zaWduZWQgaW50IGNvdW50ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihtYXhDb3VudCkpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oTUFYX0lURU1TX1BFUl9MSVNUKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3BhdGNoW10+IHBhdGNoZXNMZWdhY3kobmV3IGF1ZGlvX3BhdGNoW2NvdW50XSk7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihtRGVsZWdhdGUtPmxpc3RBdWRpb1BhdGNoZXMoJmNvdW50LCBwYXRjaGVzTGVnYWN5LmdldCgpKSk7CisgICAgUkVUVVJOX0JJTkRFUl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoJnBhdGNoZXNMZWdhY3lbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2hlc0xlZ2FjeVtjb3VudF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKl9haWRsX3JldHVybiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBjb25maWcpIHsKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBjb25maWdMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnX2F1ZGlvX3BvcnRfY29uZmlnKGNvbmZpZykpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWdMZWdhY3kpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihpbnQzMl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZExlZ2FjeSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVIoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uSWQpKTsKKyAgICBhdWRpb19od19zeW5jX3QgcmVzdWx0ID0gbURlbGVnYXRlLT5nZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oc2Vzc2lvbklkTGVnYWN5KTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihsZWdhY3kyYWlkbF9hdWRpb19od19zeW5jX3RfaW50MzJfdChyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c3lzdGVtUmVhZHkoKSB7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT5zeXN0ZW1SZWFkeSgpKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OmZyYW1lQ291bnRIQUwoaW50MzJfdCBpb0hhbmRsZSwgaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGVMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpb0hhbmRsZSkpOworICAgIHNpemVfdCByZXN1bHQgPSBtRGVsZWdhdGUtPmZyYW1lQ291bnRIQUwoaW9IYW5kbGVMZWdhY3kpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRJbnRlZ3JhbDxpbnQ2NF90PihyZXN1bHQpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6Z2V0TWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+IHJlc3VsdExlZ2FjeTsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+Z2V0TWljcm9waG9uZXMoJnJlc3VsdExlZ2FjeSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvRGF0YT4+KAorICAgICAgICAgICAgcmVzdWx0TGVnYWN5LCBtZWRpYTo6bGVnYWN5MmFpZGxfTWljcm9waG9uZUluZm8pKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBwaWRzKSB7CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHNMZWdhY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxwaWRfdD4+KHBpZHMsIGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QpKTsKKyAgICBSRVRVUk5fQklOREVSX0lGX0VSUk9SKG1EZWxlZ2F0ZS0+c2V0QXVkaW9IYWxQaWRzKHBpZHNMZWdhY3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6c2V0VmlicmF0b3JJbmZvcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvPiYgdmlicmF0b3JJbmZvcykgeworICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1EZWxlZ2F0ZS0+c2V0VmlicmF0b3JJbmZvcyh2aWJyYXRvckluZm9zKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXJTZXJ2ZXJBZGFwdGVyOjp1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6VHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvPiYgdHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvcykgeworICAgIFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcCB0cmFja1NlY29uZGFyeU91dHB1dHMgPQorICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX0JJTkRFUihjb252ZXJ0Q29udGFpbmVyPFRyYWNrU2Vjb25kYXJ5T3V0cHV0c01hcD4oCisgICAgICAgICAgICAgICAgICAgIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb3MsCisgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb19UcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyKSk7CisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobURlbGVnYXRlLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykpOworfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2ViN2RjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvRmxpbmdlckNsaWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgSU9fQ09ORklHX0NIQU5HRUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OCi19OwotCi1jbGFzcyBCcEF1ZGlvRmxpbmdlckNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyQ2xpZW50PgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwQXVkaW9GbGluZ2VyQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXJDbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZXZlbnQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpaW9EZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICBkYXRhLndyaXRlKCZpb0Rlc2MtPm1QYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tU2FtcGxpbmdSYXRlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlvRGVzYy0+bUZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1DaGFubmVsTWFzayk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChpb0Rlc2MtPm1GcmFtZUNvdW50KTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KGlvRGVzYy0+bUZyYW1lQ291bnRIQUwpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tTGF0ZW5jeSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1Qb3J0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU9fQ09ORklHX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXJDbGllbnQsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXJDbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkF1ZGlvRmxpbmdlckNsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgIGNhc2UgSU9fQ09ORklHX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQgPSAoYXVkaW9faW9fY29uZmlnX2V2ZW50KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmaW9EZXNjLT5tUGF0Y2gsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1Gb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgaW9EZXNjLT5tRnJhbWVDb3VudEhBTCA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpb0Rlc2MtPm1MYXRlbmN5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlvRGVzYy0+bVBvcnRJZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvRGVzYyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGFmODRiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjgwNSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIklBdWRpb1BvbGljeVNlcnZpY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0lDYXB0dXJlU3RhdGVMaXN0ZW5lci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIG1lZGlhOjpJQ2FwdHVyZVN0YXRlTGlzdGVuZXI7Ci0KLWVudW0gewotICAgIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgR0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLAotICAgIEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSwKLSAgICBTRVRfUEhPTkVfU1RBVEUsCi0gICAgU0VUX1JJTkdFUl9NT0RFLCAgICAvLyByZXNlcnZlZCwgbm8gbG9uZ2VyIHVzZWQKLSAgICBTRVRfRk9SQ0VfVVNFLAotICAgIEdFVF9GT1JDRV9VU0UsCi0gICAgR0VUX09VVFBVVCwKLSAgICBTVEFSVF9PVVRQVVQsCi0gICAgU1RPUF9PVVRQVVQsCi0gICAgUkVMRUFTRV9PVVRQVVQsCi0gICAgR0VUX0lOUFVUX0ZPUl9BVFRSLAotICAgIFNUQVJUX0lOUFVULAotICAgIFNUT1BfSU5QVVQsCi0gICAgUkVMRUFTRV9JTlBVVCwKLSAgICBJTklUX1NUUkVBTV9WT0xVTUUsCi0gICAgU0VUX1NUUkVBTV9WT0xVTUUsCi0gICAgR0VUX1NUUkVBTV9WT0xVTUUsCi0gICAgU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLAotICAgIEdFVF9WT0xVTUVfQVRUUklCVVRFUywKLSAgICBHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywKLSAgICBHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywKLSAgICBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwKLSAgICBHRVRfT1VUUFVUX0ZPUl9FRkZFQ1QsCi0gICAgUkVHSVNURVJfRUZGRUNULAotICAgIFVOUkVHSVNURVJfRUZGRUNULAotICAgIElTX1NUUkVBTV9BQ1RJVkUsCi0gICAgSVNfU09VUkNFX0FDVElWRSwKLSAgICBHRVRfREVWSUNFU19GT1JfU1RSRUFNLAotICAgIFFVRVJZX0RFRkFVTFRfUFJFX1BST0NFU1NJTkcsCi0gICAgU0VUX0VGRkVDVF9FTkFCTEVELAotICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCi0gICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQsCi0gICAgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsCi0gICAgTElTVF9BVURJT19QT1JUUywKLSAgICBHRVRfQVVESU9fUE9SVCwKLSAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCi0gICAgUkVMRUFTRV9BVURJT19QQVRDSCwKLSAgICBMSVNUX0FVRElPX1BBVENIRVMsCi0gICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAotICAgIFJFR0lTVEVSX0NMSUVOVCwKLSAgICBHRVRfT1VUUFVUX0ZPUl9BVFRSLAotICAgIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT04sCi0gICAgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwKLSAgICBHRVRfUEhPTkVfU1RBVEUsCi0gICAgUkVHSVNURVJfUE9MSUNZX01JWEVTLAotICAgIFNUQVJUX0FVRElPX1NPVVJDRSwKLSAgICBTVE9QX0FVRElPX1NPVVJDRSwKLSAgICBTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVELAotICAgIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRCwKLSAgICBTRVRfTUFTVEVSX01PTk8sCi0gICAgR0VUX01BU1RFUl9NT05PLAotICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCLAotICAgIEdFVF9TVVJST1VORF9GT1JNQVRTLAotICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRCwKLSAgICBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAotICAgIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCi0gICAgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKLSAgICBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULAotICAgIFNFVF9BU1NJU1RBTlRfVUlELAotICAgIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsCi0gICAgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwKLSAgICBTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwKLSAgICBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwKLSAgICBTRVRfVVNFUklEX0RFVklDRV9BRkZJTklUWSwKLSAgICBSRU1PVkVfVVNFUklEX0RFVklDRV9BRkZJTklUWSwKLSAgICBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsCi0gICAgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsCi0gICAgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLAotICAgIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUywKLSAgICBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTLAotICAgIFNFVF9TVVBQT1JURURfU1lTVEVNX1VTQUdFUywKLSAgICBTRVRfQUxMT1dFRF9DQVBUVVJFX1BPTElDWSwKLSAgICBNT1ZFX0VGRkVDVFNfVE9fSU8sCi0gICAgU0VUX1JUVF9FTkFCTEVELAotICAgIElTX0NBTExfU0NSRUVOX01PREVfU1VQUE9SVEVELAotICAgIFNFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAotICAgIFJFTU9WRV9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAotICAgIEdFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAotICAgIEdFVF9ERVZJQ0VTX0ZPUl9BVFRSSUJVVEVTLAotICAgIEFVRElPX01PRFVMRVNfVVBEQVRFRCwgIC8vIG9uZXdheQotICAgIFNFVF9DVVJSRU5UX0lNRV9VSUQsCi0gICAgUkVHSVNURVJfU09VTkRUUklHR0VSX0NBUFRVUkVfU1RBVEVfTElTVEVORVIsCi19OwotCi0jZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0Ci0KLWNsYXNzIEJwQXVkaW9Qb2xpY3lTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElBdWRpb1BvbGljeVNlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBBdWRpb1BvbGljeVNlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdGUpKTsKLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfbmFtZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGVuY29kZWRGb3JtYXQpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX2FkZHJlc3MpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwotICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUsIHVpZF90IHVpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0ZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BIT05FX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHVzYWdlKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGNvbmZpZykpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ZPUkNFX1VTRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4odXNhZ2UpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9GT1JDRV9VU0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0cmVhbSkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIG91dHB1dCAtIHNob3VsZG4ndCBoYXBwZW4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBzZWxlY3RlZERldmljZUlkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlY29uZGFyeU91dHB1dHMgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigqc3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihmbGFncykpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKCpzZWxlY3RlZERldmljZUlkKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigqcG9ydElkKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT1VUUFVUX0ZPUl9BVFRSLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IGxTdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICpzdHJlYW0gPSBsU3RyZWFtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnJlc2l6ZShyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVhZChzZWNvbmRhcnlPdXRwdXRzLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5zaXplKCkgKiBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RBUlRfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpcG9ydElkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfT1VUUFVULCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImdldElucHV0Rm9yQXR0ciBOVUxMIGF0dHIgLSBzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyIE5VTEwgaW5wdXQgLSBzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIgTlVMTCBzZWxlY3RlZERldmljZUlkIC0gc2hvdWxkbid0IGhhcHBlbiIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9ydElkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIgTlVMTCBwb3J0SWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgZGF0YS53cml0ZShhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqaW5wdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmlpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7Ci0gICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKnBvcnRJZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfSU5QVVRfRk9SX0FUVFIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgKmlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1BfSU5QVVQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9JTlBVVCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4TWluKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4TWF4KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElOSVRfU1RSRUFNX1ZPTFVNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0cmVhbSkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TVFJFQU1fVk9MVU1FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0cmVhbSkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKLQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkVBTV9WT0xVTUUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGludCBsSW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKGluZGV4KSAqaW5kZXggPSBsSW5kZXg7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZGV2aWNlKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVk9MVU1FX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpbmRleCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdHJlYW0pKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9ERVZJQ0VTX0ZPUl9TVFJFQU0sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09VVFBVVF9GT1JfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdHJhdGVneSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9FRkZFQ1RfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgb3ZlcnJpZGUKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpZHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChhdXRvIGlkIDogaWRzKSB7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpbyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChNT1ZFX0VGRkVDVFNfVE9fSU8sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaW5QYXN0TXMpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfU1RSRUFNX0FDVElWRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGluUGFzdE1zKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSVNfU09VUkNFX0FDVElWRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQotICAgIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3JzID09IE5VTEwgfHwgY291bnQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYXVkaW9TZXNzaW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpjb3VudCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9ERUZBVUxUX1BSRV9QUk9DRVNTSU5HLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgdWludDMyX3QgcmV0Q291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKHJldENvdW50ICE9IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bURlc2MgPSAocmV0Q291bnQgPCAqY291bnQpID8gcmV0Q291bnQgOiAqY291bnQ7Ci0gICAgICAgICAgICByZXBseS5yZWFkKGRlc2NyaXB0b3JzLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkgKiBudW1EZXNjKTsKLSAgICAgICAgfQotICAgICAgICAqY291bnQgPSByZXRDb3VudDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4mIHN5c3RlbVVzYWdlcykgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3lzdGVtVXNhZ2VzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoYXV0byBzeXN0ZW1Vc2FnZSA6IHN5c3RlbVVzYWdlcykgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN5c3RlbVVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NVUFBPUlRFRF9TWVNURU1fVVNBR0VTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MpIG92ZXJyaWRlIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQUxMT1dFRF9DQVBUVVJFX1BPTElDWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCZpbmZvLCBzaXplb2YoYXVkaW9fb2ZmbG9hZF9pbmZvX3QpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElTX09GRkxPQURfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZSgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gTk9fRVJST1IgPyBzdGF0aWNfY2FzdDxib29sPihyZXBseS5yZWFkSW50MzIoKSkgOiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCi0gICAgewotICAgICAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSAocG9ydHMgPT0gTlVMTCkgPyAwIDogKm51bV9wb3J0czsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJvbGUpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodHlwZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Qb3J0c1JlcSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BPUlRTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAqbnVtX3BvcnRzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAobnVtUG9ydHNSZXEgPiAqbnVtX3BvcnRzKSB7Ci0gICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSAqbnVtX3BvcnRzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocG9ydHMsIG51bVBvcnRzUmVxICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCi0gICAgewotICAgICAgICBpZiAocG9ydCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQVVESU9fUE9SVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgICAgIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJlcGx5LnJlYWQocG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQotICAgIHsKLSAgICAgICAgaWYgKHBhdGNoID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShwYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICBkYXRhLndyaXRlKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfQVVESU9fUEFUQ0gsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwKLSAgICAgICAgICAgICAgICAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXBseS5yZWFkKGhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlKCZoYW5kbGUsIHNpemVvZihhdWRpb19wYXRjaF9oYW5kbGVfdCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9BVURJT19QQVRDSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQotICAgIHsKLSAgICAgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgdW5zaWduZWQgaW50IG51bVBhdGNoZXNSZXEgPSAocGF0Y2hlcyA9PSBOVUxMKSA/IDAgOiAqbnVtX3BhdGNoZXM7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1QYXRjaGVzUmVxKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUEFUQ0hFUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgKm51bV9wYXRjaGVzID0gKHVuc2lnbmVkIGludClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+ICpudW1fcGF0Y2hlcykgewotICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSAqbnVtX3BhdGNoZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IDApIHsKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkKHBhdGNoZXMsIG51bVBhdGNoZXNSZXEgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCi0gICAgewotICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZShjb25maWcsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NPTkZJRywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkID8gMSA6IDApOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQgPyAxIDogMCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCi0gICAgewotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBOVUxMIHx8IGlvSGFuZGxlID09IE5VTEwgfHwgZGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAqZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1NPVU5EVFJJR0dFUl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BIT05FX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTU9ERV9JTlZBTElEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoYXVkaW9fbW9kZV90KXJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocmVnaXN0cmF0aW9uID8gMSA6IDApOwotICAgICAgICBzaXplX3Qgc2l6ZSA9IG1peGVzLnNpemUoKTsKLSAgICAgICAgaWYgKHNpemUgPiBNQVhfTUlYRVNfUEVSX1BPTElDWSkgewotICAgICAgICAgICAgc2l6ZSA9IE1BWF9NSVhFU19QRVJfUE9MSUNZOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgIGlmIChtaXhlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7Ci0gICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX1BPTElDWV9NSVhFUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgcG9ydElkID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZShzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgZGF0YS53cml0ZShhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obW9ubykpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9NT05PLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKQotICAgIHsKLSAgICAgICAgaWYgKG1vbm8gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFTVEVSX01PTk8sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgKm1vbm8gPSBzdGF0aWNfY2FzdDxib29sPihyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGZsb2F0IGdldFN0cmVhbVZvbHVtZURCKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0cmVhbSkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGluZGV4KSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJFQU1fVk9MVU1FX0RCLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTkFOOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkRmxvYXQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkKLSAgICB7Ci0gICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPT0gTlVMTCB8fCAoKm51bVN1cnJvdW5kRm9ybWF0cyAhPSAwICYmCi0gICAgICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSAqbnVtU3Vycm91bmRGb3JtYXRzOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKG51bVN1cnJvdW5kRm9ybWF0c1JlcSk7Ci0gICAgICAgIGRhdGEud3JpdGVCb29sKHJlcG9ydGVkKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVVJST1VORF9GT1JNQVRTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gcmVwbHkucmVhZFVpbnQzMigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiAqbnVtU3Vycm91bmRGb3JtYXRzKSB7Ci0gICAgICAgICAgICAgICAgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gKm51bVN1cnJvdW5kRm9ybWF0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZChzdXJyb3VuZEZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgKiBzaXplb2YoYXVkaW9fZm9ybWF0X3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWQoc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVN1cnJvdW5kRm9ybWF0c1JlcSAqIHNpemVvZihib29sKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgZGF0YS53cml0ZUJvb2woZW5hYmxlZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCi0gICAgewotICAgICAgICBpZiAoZm9ybWF0cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBsaXN0X3NpemUgPSByZXBseS5yZWFkVWludDMyKCk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0X3NpemU7IGkrKykgewotICAgICAgICAgICAgZm9ybWF0cy0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihyZXBseS5yZWFkSW50MzIoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLQotICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUodHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwotICAgICAgICBkYXRhLndyaXRlKHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgdXNhZ2UpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUodHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwotICAgICAgICBkYXRhLndyaXRlKHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc291cmNlKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FTU0lTVEFOVF9VSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChhdXRvIHVpZCA6IHVpZHMpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQTExWV9TRVJWSUNFU19VSURTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDdXJyZW50SW1lVWlkKHVpZF90IHVpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NVUlJFTlRfSU1FX1VJRCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7Ci0gICAgICAgIHNpemVfdCBzaXplID0gZGV2aWNlcy5zaXplKCk7Ci0gICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOwotICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKLSAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7Ci0gICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwKLSAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotCi0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzZXJJZCk7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOwotICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOwotICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7Ci0gICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKSB7Ci0gICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2VySWQpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQotICAgICAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVVNFUklEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpIHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkIiwgX19mdW5jX18pOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG51bVN0cmF0ZWdpZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmF0ZWdpZXM7IGkrKykgewotICAgICAgICAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3kgc3RyYXRlZ3k7Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdHJhdGVneS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHJlYWQgc3RyYXRlZ2llcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgc3RyYXRlZ2llcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayhzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFhLndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBwcm9kdWN0U3RyYXRlZ3kgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfQVVESU9fVk9MVU1FX0dST1VQUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG51bUdyb3VwcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtR3JvdXBzOyBpKyspIHsKLSAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXAgZ3JvdXA7Ci0gICAgICAgICAgICBzdGF0dXMgPSBncm91cC5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHJlYWQgdm9sdW1lIGdyb3VwcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdyb3Vwcy5wdXNoX2JhY2soZ3JvdXApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFhLndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lR3JvdXAgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihlbmFibGVkKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUlRUX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfQ0FMTF9TQ1JFRU5fTU9ERV9TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEJvb2woKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmF0ZWd5KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCi0gICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAotICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cmF0ZWd5KSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKLSAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IGRldmljZS5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgKmRldmljZXMpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoZGV2aWNlcyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGFhLndyaXRlVG9QYXJjZWwoJmRhdGEpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREVWSUNFU19GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24gZmFpbGVkLCByZXR1cm4gZXJyb3IKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgLy8gQVBNIG1ldGhvZCBjYWxsIGZhaWxlZCwgcmV0dXJuIGVycm9yCi0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IG51bWJlck9mRGV2aWNlcyA9IChzaXplX3QpcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtYmVyT2ZEZXZpY2VzOyBpKyspIHsKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgaWYgKGRldmljZS5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmcmVwbHkpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy0+cHVzaF9iYWNrKGRldmljZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQVVESU9fTU9EVUxFU19VUERBVEVELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyLAotICAgICAgICAgICAgYm9vbCogcmVzdWx0KSBvdmVycmlkZSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICBzdGF0dXMgPQotICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cyA9IGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0KLSAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9TT1VORFRSSUdHRVJfQ0FQVFVSRV9TVEFURV9MSVNURU5FUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEJvb2wocmVzdWx0KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbnMgcmVzZXJ2ZWQgdG8gQXVkaW9GbGluZ2VyIGRvIG5vdCBjb21lIGZyb20gb3RoZXIgcHJvY2Vzc2VzCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgU1RBUlRfT1VUUFVUOgotICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOgotICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOgotICAgICAgICBjYXNlIEdFVF9JTlBVVF9GT1JfQVRUUjoKLSAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDoKLSAgICAgICAgY2FzZSBTVE9QX0lOUFVUOgotICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6Ci0gICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOgotICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDoKLSAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDoKLSAgICAgICAgY2FzZSBTRVRfRUZGRUNUX0VOQUJMRUQ6Ci0gICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjoKLSAgICAgICAgY2FzZSBNT1ZFX0VGRkVDVFNfVE9fSU86Ci0gICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKLSAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCi0gICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOgotICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURToKLSAgICAgICAgY2FzZSBIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0U6Ci0gICAgICAgIGNhc2UgU0VUX1BIT05FX1NUQVRFOgotLy9GSVhNRTogQWxsb3cgU0VUX0ZPUkNFX1VTRSBjYWxscyBmcm9tIHN5c3RlbSBhcHBzIHVudGlsIGEgYmV0dGVyIHVzZSBjYXNlIHJvdXRpbmcgQVBJIGlzIGF2YWlsYWJsZQotLy8gICAgICBjYXNlIFNFVF9GT1JDRV9VU0U6Ci0gICAgICAgIGNhc2UgSU5JVF9TVFJFQU1fVk9MVU1FOgotICAgICAgICBjYXNlIFNFVF9TVFJFQU1fVk9MVU1FOgotICAgICAgICBjYXNlIFJFR0lTVEVSX1BPTElDWV9NSVhFUzoKLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX01PTk86Ci0gICAgICAgIGNhc2UgR0VUX1NVUlJPVU5EX0ZPUk1BVFM6Ci0gICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOgotICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOgotICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6Ci0gICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6Ci0gICAgICAgIGNhc2UgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFk6Ci0gICAgICAgIGNhc2UgU0VUX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFk6Ci0gICAgICAgIGNhc2UgUkVNT1ZFX1VTRVJJRF9ERVZJQ0VfQUZGSU5JVFk6Ci0gICAgICAgIGNhc2UgR0VUX09GRkxPQURfRk9STUFUU19BMkRQOgotICAgICAgICBjYXNlIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUzoKLSAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTOgotICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046Ci0gICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjoKLSAgICAgICAgY2FzZSBTRVRfUlRUX0VOQUJMRUQ6Ci0gICAgICAgIGNhc2UgSVNfQ0FMTF9TQ1JFRU5fTU9ERV9TVVBQT1JURUQ6Ci0gICAgICAgIGNhc2UgU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6Ci0gICAgICAgIGNhc2UgU0VUX1NVUFBPUlRFRF9TWVNURU1fVVNBR0VTOgotICAgICAgICBjYXNlIFJFTU9WRV9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgotICAgICAgICBjYXNlIEdFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgotICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9BVFRSSUJVVEVTOgotICAgICAgICBjYXNlIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZOgotICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDoKLSAgICAgICAgY2FzZSBTRVRfQ1VSUkVOVF9JTUVfVUlEOgotICAgICAgICBjYXNlIFJFR0lTVEVSX1NPVU5EVFJJR0dFUl9DQVBUVVJFX1NUQVRFX0xJU1RFTkVSOiB7Ci0gICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgdGFnKCJJQXVkaW9Qb2xpY3lTZXJ2aWNlIGNvbW1hbmQgIiArIHN0ZDo6dG9fc3RyaW5nKGNvZGUpKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGFnLmNfc3RyKCkpOwotCi0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUgZm9yIGRldmljZSAldSIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNGb3JtYXQpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PiAoZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IEdFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBIQU5ETEVfREVWSUNFX0NPTkZJR19DSEFOR0UgZm9yIGRldmljZSAldSIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4gKGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNGb3JtYXQpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfUEhPTkVfU1RBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldFBob25lU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgIChhdWRpb19tb2RlX3QpIGRhdGEucmVhZEludDMyKCksCi0gICAgICAgICAgICAgICAgICAgICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKSkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9GT1JDRV9VU0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90PigKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZykpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9GT1JDRV9VU0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90PigKLSAgICAgICAgICAgICAgICAgICAgZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGdldEZvcmNlVXNlKHVzYWdlKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX09VVFBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gZ2V0T3V0cHV0KHN0cmVhbSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0FUVFI6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHIpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwotICAgICAgICAgICAgYm9vbCBoYXNTdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBpZiAoaGFzU3RyZWFtKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWc7Ci0gICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgcGlkLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiByZXBseS0+d3JpdGUoc2Vjb25kYXJ5T3V0cHV0cy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQocG9ydElkKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChwb3J0SWQpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVsZWFzZU91dHB1dChwb3J0SWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0lOUFVUX0ZPUl9BVFRSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7fTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHIpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQgPSAoYXVkaW9fdW5pcXVlX2lkX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aWRfdCB1aWQgPSAodWlkX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7Ci0gICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ19iYXNlX3QpKTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgcmlpZCwgc2Vzc2lvbiwgcGlkLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbnB1dCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUF9JTlBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wSW5wdXQocG9ydElkKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgUkVMRUFTRV9JTlBVVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVsZWFzZUlucHV0KHBvcnRJZCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJTklUX1NUUkVBTV9WT0xVTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGludCBpbmRleE1pbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgaW5kZXhNYXggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90Pihpbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4saW5kZXhNYXgpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX1NUUkVBTV9WT0xVTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sICZpbmRleCwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKGdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX1ZPTFVNRV9BVFRSSUJVVEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGRldmljZSkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9WT0xVTUVfQVRUUklCVVRFUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX01BWF9WT0xVTUVfRk9SX0FUVFJJQlVURVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIHN0YXR1cyA9IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9TVFJFQU06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQ+KGdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0ge307Ci0gICAgICAgICAgICBpZiAoZGF0YS5yZWFkKCZkZXNjLCBzaXplb2YoZGVzYykpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MzEyNjEwNiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKHZvaWQpc2FuaXRpemVFZmZlY3REZXNjcmlwdG9yKCZkZXNjKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgmZGVzYyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50PihvdXRwdXQpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmZGVzYywgc2l6ZW9mKGRlc2MpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzMxMjYxMDYiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICh2b2lkKXNhbml0aXplRWZmZWN0RGVzY3JpcHRvcigmZGVzYyk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgaWQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlZ2lzdGVyRWZmZWN0KCZkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4odW5yZWdpc3RlckVmZmVjdChpZCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfRU5BQkxFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWQgPSBzdGF0aWNfY2FzdCA8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIE1PVkVfRUZGRUNUU19UT19JTzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gaWRzOwotICAgICAgICAgICAgaW50MzJfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaWQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KG1vdmVFZmZlY3RzVG9JbyhpZHMsIGlvKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNfU1RSRUFNX0FDVElWRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9ICh1aW50MzJfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpICk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU19TVFJFQU1fQUNUSVZFX1JFTU9URUxZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gKHVpbnQzMl90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMiggaXNTdHJlYW1BY3RpdmVSZW1vdGVseShzdHJlYW0sIGluUGFzdE1zKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNfU09VUkNFX0FDVElWRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBpc1NvdXJjZUFjdGl2ZShzb3VyY2UpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgUVVFUllfREVGQVVMVF9QUkVfUFJPQ0VTU0lORzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgY291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGNvdW50ID4gQXVkaW9FZmZlY3Q6OmtNYXhQcmVQcm9jZXNzaW5nKSB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBBdWRpb0VmZmVjdDo6a01heFByZVByb2Nlc3Npbmc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCByZXRDb3VudCA9IGNvdW50OwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMgPSBuZXcgZWZmZWN0X2Rlc2NyaXB0b3JfdFtjb3VudF17fTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgJnJldENvdW50KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBOT19NRU1PUlkpIHsKLSAgICAgICAgICAgICAgICByZXRDb3VudCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXRDb3VudCk7Ci0gICAgICAgICAgICBpZiAocmV0Q291bnQgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChyZXRDb3VudCA8IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ID0gcmV0Q291bnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShkZXNjcmlwdG9ycywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpICogY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVsZXRlW10gZGVzY3JpcHRvcnM7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBJU19PRkZMT0FEX1NVUFBPUlRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSB7fTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmaW5mbywgc2l6ZW9mKGF1ZGlvX29mZmxvYWRfaW5mb190KSk7Ci0gICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNTdXBwb3J0ZWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0ge307Ci0gICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gKGF1ZGlvX3BvcnRfcm9sZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlID0gKGF1ZGlvX3BvcnRfdHlwZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7Ci0gICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHMgPSBudW1Qb3J0c1JlcTsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyA9Ci0gICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgYXVkaW9fcG9ydCAqKWNhbGxvYyhudW1Qb3J0c1JlcSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7Ci0gICAgICAgICAgICBpZiAocG9ydHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qb3J0cyhyb2xlLCB0eXBlLCAmbnVtUG9ydHMsIHBvcnRzLCAmZ2VuZXJhdGlvbik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUG9ydHMpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVBvcnRzUmVxID4gbnVtUG9ydHMpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtUG9ydHNSZXEgPSBudW1Qb3J0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHBvcnRzLCBudW1Qb3J0c1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydCkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdlbmVyYXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShwb3J0cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwotICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmcG9ydCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkxMjIwMiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb3J0KCZwb3J0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKCZwb3J0LCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQ1JFQVRFX0FVRElPX1BBVENIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0ge307Ci0gICAgICAgICAgICBkYXRhLnJlYWQoJnBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMzkxMjIwMiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmhhbmRsZSwgc2l6ZW9mKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFJFTEVBU0VfQVVESU9fUEFUQ0g6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2YoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BBVENIRVM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAobnVtUGF0Y2hlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlcyA9IG51bVBhdGNoZXNSZXE7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGF1ZGlvX3BhdGNoICopY2FsbG9jKG51bVBhdGNoZXNSZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwotICAgICAgICAgICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9QYXRjaGVzKCZudW1QYXRjaGVzLCBwYXRjaGVzLCAmZ2VuZXJhdGlvbik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtUGF0Y2hlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVBhdGNoZXNSZXEgPiBudW1QYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bVBhdGNoZXNSZXEgPSBudW1QYXRjaGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUocGF0Y2hlcywgbnVtUGF0Y2hlc1JlcSAqIHNpemVvZihzdHJ1Y3QgYXVkaW9fcGF0Y2gpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZW5lcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUocGF0Y2hlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFVF9BVURJT19QT1JUX0NPTkZJRzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBjb25maWcgPSB7fTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKSk7Ci0gICAgICAgICAgICAodm9pZClzYW5pdGl6ZUF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFJFR0lTVEVSX0NMSUVOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KAotICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZWdpc3RlckNsaWVudChjbGllbnQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZGF0YS5yZWFkSW50MzIoKSA9PSAxKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGRhdGEucmVhZEludDMyKCkgPT0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkU7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlc3Npb24pOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX1BIT05FX1NUQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpZ2V0UGhvbmVTdGF0ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFJFR0lTVEVSX1BPTElDWV9NSVhFUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgcmVnaXN0cmF0aW9uID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgVmVjdG9yPEF1ZGlvTWl4PiBtaXhlczsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfTUlYRVNfUEVSX1BPTElDWSkgewotICAgICAgICAgICAgICAgIHNpemUgPSBNQVhfTUlYRVNfUEVSX1BPTElDWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9NaXggbWl4OwotICAgICAgICAgICAgICAgIGlmIChtaXgucmVhZEZyb21QYXJjZWwoKFBhcmNlbCopJmRhdGEpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVzLmFkZChtaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RBUlRfQVVESU9fU09VUkNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZSA9IHt9OwotICAgICAgICAgICAgZGF0YS5yZWFkKCZzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKLSAgICAgICAgICAgICh2b2lkKXNhbml0aXplQXVkaW9Qb3J0Q29uZmlnKCZzb3VyY2UpOwotICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJnBvcnRJZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNUT1BfQVVESU9fU09VUkNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9NQVNURVJfTU9OTzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgbW9ubyA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TWFzdGVyTW9ubyhtb25vKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfTUFTVEVSX01PTk86IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIG1vbm87Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJNb25vKCZtb25vKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obW9ubykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX1NUUkVBTV9WT0xVTUVfREI6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHN0YXRpY19jYXN0IDxpbnQ+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZFVpbnQzMigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUZsb2F0KGdldFN0cmVhbVZvbHVtZURCKHN0cmVhbSwgaW5kZXgsIGRldmljZSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHNSZXEgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKLSAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBib29sIHJlcG9ydGVkID0gZGF0YS5yZWFkQm9vbCgpOwotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IG51bVN1cnJvdW5kRm9ybWF0c1JlcTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMgPSAoYXVkaW9fZm9ybWF0X3QgKiljYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgIG51bVN1cnJvdW5kRm9ybWF0cywgc2l6ZW9mKGF1ZGlvX2Zvcm1hdF90KSk7Ci0gICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkID0gKGJvb2wgKiljYWxsb2MobnVtU3Vycm91bmRGb3JtYXRzLCBzaXplb2YoYm9vbCkpOwotICAgICAgICAgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0c1JlcSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBmcmVlKHN1cnJvdW5kRm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFN1cnJvdW5kRm9ybWF0cygKLSAgICAgICAgICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKG51bVN1cnJvdW5kRm9ybWF0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0c1JlcSA+IG51bVN1cnJvdW5kRm9ybWF0cykgewotICAgICAgICAgICAgICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBudW1TdXJyb3VuZEZvcm1hdHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShzdXJyb3VuZEZvcm1hdHMsIG51bVN1cnJvdW5kRm9ybWF0c1JlcSAqIHNpemVvZihhdWRpb19mb3JtYXRfdCkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgKiBzaXplb2YoYm9vbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHMpOwotICAgICAgICAgICAgZnJlZShzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VUX1NVUlJPVU5EX0ZPUk1BVF9FTkFCTEVEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWQgPSBkYXRhLnJlYWRCb29sKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR0VUX09GRkxPQURfRk9STUFUU19BMkRQOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGVuY29kaW5nRm9ybWF0czsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmVuY29kaW5nRm9ybWF0cyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzLnNpemUoKSkpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmNvZGluZ0Zvcm1hdHMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzW2ldKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGNhc2UgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCkpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IHVpZDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZ1aWQpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBzZXRBc3Npc3RhbnRVaWQodWlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiB1aWRzOwotICAgICAgICAgICAgaW50MzJfdCBzaXplOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewotICAgICAgICAgICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHVpZDsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAgZGF0YS5yZWFkSW50MzIoJnVpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aWRzLnB1c2hfYmFjayh1aWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gc2V0QTExeVNlcnZpY2VzVWlkcyh1aWRzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVCb29sKGlzU3VwcG9ydGVkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZS5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNFVF9VU0VSSURfREVWSUNFX0FGRklOSVRZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgY29uc3QgaW50IHVzZXJJZCA9IChpbnQpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFJFTU9WRV9VU0VSSURfREVWSUNFX0FGRklOSVRZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgY29uc3QgaW50IHVzZXJJZCA9IChpbnQpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKHVzZXJJZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzdHJhdGVnaWVzLnNpemUoKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmF0ZWdpZXNbaV0ud3JpdGVUb1BhcmNlbChyZXBseSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgewotICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmluYWxTaXplKTsKLSAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRyaWJ1dGVzLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5OwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBzdHJhdGVneSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDxpbnQ+KHN0cmF0ZWd5KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgZ3JvdXBzOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gZ3JvdXBzLnNpemUoKTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3Vwc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOwotICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRyaWJ1dGVzLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cDsKLSAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBncm91cCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oZ3JvdXApKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VUX1NVUFBPUlRFRF9TWVNURU1fVVNBR0VTOiB7Ci0gICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiBzeXN0ZW1Vc2FnZXM7Ci0KLSAgICAgICAgICAgICBpbnQzMl90IHNpemU7Ci0gICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKLSAgICAgICAgICAgICAgICAgc2l6ZSA9IE1BWF9JVEVNU19QRVJfTElTVDsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBzeXN0ZW1Vc2FnZUludDsKLSAgICAgICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnN5c3RlbVVzYWdlSW50KTsKLSAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3Qgc3lzdGVtVXNhZ2UgPSBzdGF0aWNfY2FzdDxhdWRpb191c2FnZV90PihzeXN0ZW1Vc2FnZUludCk7Ci0gICAgICAgICAgICAgICAgIHN5c3RlbVVzYWdlcy5wdXNoX2JhY2soc3lzdGVtVXNhZ2UpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBzdGF0dXMgPSBzZXRTdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMoc3lzdGVtVXNhZ2VzKTsKLSAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRVRfQUxMT1dFRF9DQVBUVVJFX1BPTElDWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpZF90IHVpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkLCBmbGFncyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTRVRfUlRUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWQgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFJ0dEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBJU19DQUxMX1NDUkVFTl9NT0RFX1NVUFBPUlRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgaXNBdmFpbGFibGUgPSBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVCb29sKGlzQXZhaWxhYmxlKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBtYXJzaGFsbF9zdGF0dXMgPSBkZXZpY2Uud3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICBpZiAobWFyc2hhbGxfc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWxsX3N0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEdFVF9ERVZJQ0VTX0ZPUl9BVFRSSUJVVEVTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRyaWJ1dGVzLnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzOwotICAgICAgICAgICAgc3RhdHVzID0gZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVzKCksICZkZXZpY2VzKTsKLSAgICAgICAgICAgIC8vIHJlcGx5IGRhdGEgZm9ybWF0dGVkIGFzOgotICAgICAgICAgICAgLy8gIC0gKGludDMyKSBtZXRob2QgY2FsbCByZXN1bHQgZnJvbSBBUE0KLSAgICAgICAgICAgIC8vICAtIChpbnQzMikgbnVtYmVyIG9mIGRldmljZXMgKG4pIGlmIG1ldGhvZCBjYWxsIHJldHVybmVkIE5PX0VSUk9SCi0gICAgICAgICAgICAvLyAgLSBuIEF1ZGlvRGV2aWNlVHlwZUFkZHIgICAgICAgICBpZiBtZXRob2QgY2FsbCByZXR1cm5lZCBOT19FUlJPUgotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS0+d3JpdGVJbnQzMihkZXZpY2VzLnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGRldmljZS53cml0ZVRvUGFyY2VsKHJlcGx5KTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfQ1VSUkVOVF9JTUVfVUlEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCB1aWQ7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gc2V0Q3VycmVudEltZVVpZCh1aWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBSRUdJU1RFUl9TT1VORFRSSUdHRVJfQ0FQVFVSRV9TVEFURV9MSVNURU5FUjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpOwotICAgICAgICAgICAgaWYgKGJpbmRlciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPElDYXB0dXJlU3RhdGVMaXN0ZW5lcj4KLSAgICAgICAgICAgICAgICBsaXN0ZW5lciA9IGludGVyZmFjZV9jYXN0PElDYXB0dXJlU3RhdGVMaXN0ZW5lcj4oCi0gICAgICAgICAgICAgICAgYmluZGVyKTsKLSAgICAgICAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgcmV0OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgICAgICByZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKGxpc3RlbmVyLCAmcmV0KTsKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmVyIHJldHVybmVkIHVuZXhwZWN0ZWQgc3RhdHVzIGNvZGU6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZUJvb2wocmV0KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotLyoqIHJldHVybnMgdHJ1ZSBpZiBzdHJpbmcgb3ZlcmZsb3cgd2FzIHByZXZlbnRlZCBieSB6ZXJvIHRlcm1pbmF0aW9uICovCi10ZW1wbGF0ZSA8c2l6ZV90IHNpemU+Ci1zdGF0aWMgYm9vbCBwcmV2ZW50U3RyaW5nT3ZlcmZsb3coY2hhciAoJnMpW3NpemVdKSB7Ci0gICAgaWYgKHN0cm5sZW4ocywgc2l6ZSkgPCBzaXplKSByZXR1cm4gZmFsc2U7Ci0gICAgc1tzaXplIC0gMV0gPSAnXDAnOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIpCi17Ci0gICAgY29uc3Qgc2l6ZV90IHRhZ3NNYXhTaXplID0gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFOwotICAgIGlmIChzdHJubGVuKGF0dHItPnRhZ3MsIHRhZ3NNYXhTaXplKSA+PSB0YWdzTWF4U2l6ZSkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjY4OTUzOTUwIik7IC8vIFNhZmV0eU5ldCBsb2dnaW5nCi0gICAgfQotICAgIGF0dHItPnRhZ3NbdGFnc01heFNpemUgLSAxXSA9ICdcMCc7Ci19Ci0KLS8qKiByZXR1cm5zIEJBRF9WQUxVRSBpZiBzYW5pdGl6YXRpb24gd2FzIHJlcXVpcmVkLiAqLwotc3RhdHVzX3QgQm5BdWRpb1BvbGljeVNlcnZpY2U6OnNhbml0aXplRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjKQotewotICAgIGlmIChwcmV2ZW50U3RyaW5nT3ZlcmZsb3coZGVzYy0+bmFtZSkKLSAgICAgICAgfCAvKiBhbHdheXMgKi8gcHJldmVudFN0cmluZ092ZXJmbG93KGRlc2MtPmltcGxlbWVudG9yKSkgewotICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjczMTI2MTA2Iik7IC8vIFNhZmV0eU5ldCBsb2dnaW5nCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqIHJldHVybnMgQkFEX1ZBTFVFIGlmIHNhbml0aXphdGlvbiB3YXMgcmVxdWlyZWQuICovCi1zdGF0dXNfdCBCbkF1ZGlvUG9saWN5U2VydmljZTo6c2FuaXRpemVBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnKiBjb25maWcpCi17Ci0gICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCi0gICAgICAgIHByZXZlbnRTdHJpbmdPdmVyZmxvdyhjb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcykpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTU4MGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZW51bSB7Ci0gICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgUEFUQ0hfTElTVF9VUERBVEUsCi0gICAgTUlYX1NUQVRFX1VQREFURSwKLSAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsCi0gICAgVk9MVU1FX0dST1VQX0NIQU5HRUQsCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbmxpbmUgdm9pZCByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZykgewotICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICBjb25maWctPmNoYW5uZWxfbWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICBjb25maWctPmZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKLX0KLQotaW5saW5lIHZvaWQgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZykKLXsKLSAgICBkYXRhLndyaXRlVWludDMyKGNvbmZpZy0+c2FtcGxlX3JhdGUpOwotICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY29uZmlnLT5mb3JtYXQpOwotfQotCi1pbmxpbmUgdm9pZCByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgewotICAgIGNsaWVudEluZm8tPnJpaWQgPSAoYXVkaW9fdW5pcXVlX2lkX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgY2xpZW50SW5mby0+dWlkID0gKHVpZF90KSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICBjbGllbnRJbmZvLT5zZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICBjbGllbnRJbmZvLT5zb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgZGF0YS5yZWFkKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgIGNsaWVudEluZm8tPnNpbGVuY2VkID0gZGF0YS5yZWFkQm9vbCgpOwotfQotCi1pbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7Ci0gICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5yaWlkKTsKLSAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKLSAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOwotICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKLSAgICBkYXRhLndyaXRlKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgIGRhdGEud3JpdGVCb29sKGNsaWVudEluZm8tPnNpbGVuY2VkKTsKLX0KLQotaW5saW5lIHZvaWQgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmVmZmVjdHMpIHsKLSAgICBpbnQzMl90IG51bUVmZmVjdHMgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgewotICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGVmZmVjdDsKLSAgICAgICAgaWYgKGRhdGEucmVhZCgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAoKmVmZmVjdHMpLnB1c2hfYmFjayhlZmZlY3QpOwotICAgIH0KLX0KLQotaW5saW5lIHZvaWQgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChQYXJjZWwmIGRhdGEsIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMpIHsKLSAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgZWZmZWN0cy5zaXplKCkpOwotICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogZWZmZWN0cykgewotICAgICAgICBpZiAoZGF0YS53cml0ZSgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgQnBBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4KLXsKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUE9SVF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGdyb3VwKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFZPTFVNRV9HUk9VUF9DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChyZWdJZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0ZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwotICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7Ci0gICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgY2xpZW50RWZmZWN0cyk7Ci0gICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKLSAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBlZmZlY3RzKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICBjYXNlIFBPUlRfTElTVF9VUERBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICBjYXNlIFBBVENIX0xJU1RfVVBEQVRFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIGNhc2UgVk9MVU1FX0dST1VQX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihkYXRhLnJlYWRVaW50MzIoKSk7Ci0gICAgICAgICAgICBpbnQgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIGNhc2UgTUlYX1NUQVRFX1VQREFURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0cmluZzggcmVnSWQgPSBkYXRhLnJlYWRTdHJpbmc4KCk7Ci0gICAgICAgICAgICBpbnQzMl90IHN0YXRlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgZXZlbnQgPSAoaW50KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgY2xpZW50SW5mbzsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7Ci0gICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwotICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOwotICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmNsaWVudEVmZmVjdHMpOwotICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmRldmljZUNvbmZpZyk7Ci0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOwotICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmVmZmVjdHMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxOWU3YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJJQXVkaW9UcmFjayIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBtZWRpYTo6Vm9sdW1lU2hhcGVyOwotCi1lbnVtIHsKLSAgICBHRVRfQ0JMSyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU1RBUlQsCi0gICAgU1RPUCwKLSAgICBGTFVTSCwKLSAgICBSRVNFUlZFRCwgLy8gd2FzIE1VVEUKLSAgICBQQVVTRSwKLSAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKLSAgICBTRVRfUEFSQU1FVEVSUywKLSAgICBTRUxFQ1RfUFJFU0VOVEFUSU9OLAotICAgIEdFVF9USU1FU1RBTVAsCi0gICAgU0lHTkFMLAotICAgIEFQUExZX1ZPTFVNRV9TSEFQRVIsCi0gICAgR0VUX1ZPTFVNRV9TSEFQRVJfU1RBVEUsCi19OwotCi1jbGFzcyBCcEF1ZGlvVHJhY2sgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUF1ZGlvVHJhY2s+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBBdWRpb1RyYWNrKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElBdWRpb1RyYWNrPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0JMSywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY2JsayA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoY2JsayAhPSAwICYmIGNibGstPnVuc2VjdXJlUG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjYmxrLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNibGs7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJzdGFydCgpIGVycm9yOiAlcyIsIHN0cmVycm9yKC1zdGF0dXMpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGTFVTSCwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVVTRSwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGVmZmVjdElkKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSF9BVVhfRUZGRUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJhdHRhY2hBdXhFZmZlY3QoKSBlcnJvcjogJXMiLCBzdHJlcnJvcigtc3RhdHVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoa2V5VmFsdWVQYWlycyk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUEFSQU1FVEVSUywgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmVzZW50YXRpb25JZCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihwcm9ncmFtSWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VMRUNUX1BSRVNFTlRBVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1RJTUVTVEFNUCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZS50dl9zZWMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUudHZfbnNlYyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbCgpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTSUdOQUwsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25maWd1cmF0aW9uLmdldCgpID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICA/IGRhdGEud3JpdGVJbnQzMigwKQotICAgICAgICAgICAgICAgIDogIGRhdGEud3JpdGVJbnQzMigxKQotICAgICAgICAgICAgICAgICAgICA/OiBjb25maWd1cmF0aW9uLT53cml0ZVRvUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlcjo6U3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXMgPSBvcGVyYXRpb24uZ2V0KCkgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgID8gc3RhdHVzID0gZGF0YS53cml0ZUludDMyKDApCi0gICAgICAgICAgICAgICAgOiBkYXRhLndyaXRlSW50MzIoMSkKLSAgICAgICAgICAgICAgICAgICAgPzogb3BlcmF0aW9uLT53cml0ZVRvUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIFZvbHVtZVNoYXBlcjo6U3RhdHVzKHN0YXR1cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IHJlbW90ZVZvbHVtZVNoYXBlclN0YXR1czsKLSAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFQUExZX1ZPTFVNRV9TSEFQRVIsIGRhdGEsICZyZXBseSkKLSAgICAgICAgICAgICAgICAgPzogcmVwbHkucmVhZEludDMyKCZyZW1vdGVWb2x1bWVTaGFwZXJTdGF0dXMpOwotCi0gICAgICAgIHJldHVybiBWb2x1bWVTaGFwZXI6OlN0YXR1cyhzdGF0dXMgPzogcmVtb3RlVm9sdW1lU2hhcGVyU3RhdHVzKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLQotICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9TSEFQRVJfU1RBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6U3RhdGU+IHN0YXRlID0gbmV3IFZvbHVtZVNoYXBlcjo6U3RhdGU7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXRlLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvVHJhY2ssICJhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5BdWRpb1RyYWNrOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGdldENibGsoKSkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVJUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXJ0KCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNUT1A6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEZMVVNIOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGZsdXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUEFVU0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcGF1c2UoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEFUVEFDSF9BVVhfRUZGRUNUOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGF0dGFjaEF1eEVmZmVjdChkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1BBUkFNRVRFUlM6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RyaW5nOCBrZXlWYWx1ZVBhaXJzKGRhdGEucmVhZFN0cmluZzgoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRUxFQ1RfUFJFU0VOVEFUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdFByZXNlbnRhdGlvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1RJTUVTVEFNUDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGltZXN0YW1wLm1Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGltZXN0YW1wLm1UaW1lLnR2X3NlYyk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodGltZXN0YW1wLm1UaW1lLnR2X25zZWMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNJR05BTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzaWduYWwoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBBUFBMWV9WT0xVTUVfU0hBUEVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4gY29uZmlndXJhdGlvbjsKLSAgICAgICAgICAgIHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiBvcGVyYXRpb247Ci0KLSAgICAgICAgICAgIGludDMyX3QgcHJlc2VudDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZwcmVzZW50KTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcHJlc2VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjb25maWd1cmF0aW9uLT5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXMgPzogZGF0YS5yZWFkSW50MzIoJnByZXNlbnQpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBwcmVzZW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBvcGVyYXRpb24tPnJlYWRGcm9tUGFyY2VsKCZkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpYXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9TSEFQRVJfU1RBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGlkOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJmlkKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBzdGF0ZSA9IGdldFZvbHVtZVNoYXBlclN0YXRlKGlkKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGUtPndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lFZmZlY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQ3ZGZmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lFZmZlY3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiSUVmZmVjdCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIE1heGltdW0gY29tbWFuZC9yZXBseSBzaXplIGV4cGVjdGVkCi0jZGVmaW5lIEVGRkVDVF9QQVJBTV9TSVpFX01BWCAgICAgICA2NTUzNgotCi1lbnVtIHsKLSAgICBFTkFCTEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIERJU0FCTEUsCi0gICAgQ09NTUFORCwKLSAgICBESVNDT05ORUNULAotICAgIEdFVF9DQkxLCi19OwotCi1jbGFzcyBCcEVmZmVjdDogcHVibGljIEJwSW50ZXJmYWNlPElFZmZlY3Q+Ci17Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBFZmZlY3QoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUVmZmVjdD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZW5hYmxlKCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJlbmFibGUiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQUJMRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHN0YXR1c190IGRpc2FibGUoKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRpc2FibGUiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0FCTEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCi0gICAgewotICAgICAgICBBTE9HVigiY29tbWFuZCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoY21kQ29kZSk7Ci0gICAgICAgIGludCBzaXplID0gY21kU2l6ZTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgICAgIGRhdGEud3JpdGUocENtZERhdGEsIHNpemUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwUmVwbHlTaXplID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZSA9ICpwUmVwbHlTaXplOwotICAgICAgICB9Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzaXplKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ09NTUFORCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKHBSZXBseVNpemUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAqcFJlcGx5U2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoc2l6ZSAhPSAwICYmIHBSZXBseURhdGEgIT0gTlVMTCAmJiBwUmVwbHlTaXplICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcGx5LnJlYWQocFJlcGx5RGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICAqcFJlcGx5U2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc2Nvbm5lY3QoKQotICAgIHsKLSAgICAgICAgQUxPR1YoImRpc2Nvbm5lY3QiKTsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERJU0NPTk5FQ1QsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUVmZmVjdDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DQkxLLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjYmxrICE9IDAgJiYgY2Jsay0+dW5zZWN1cmVQb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNibGsuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2JsazsKLSAgICB9Ci0gfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEVmZmVjdCwgImFuZHJvaWQubWVkaWEuSUVmZmVjdCIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuRWZmZWN0OjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgRU5BQkxFOiB7Ci0gICAgICAgICAgICBBTE9HVigiRU5BQkxFIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZW5hYmxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgRElTQUJMRTogewotICAgICAgICAgICAgQUxPR1YoIkRJU0FCTEUiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihkaXNhYmxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09NTUFORDogewotICAgICAgICAgICAgQUxPR1YoIkNPTU1BTkQiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgY2hhciAqY21kID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChjbWRTaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNtZFNpemUgPiBFRkZFQ1RfUEFSQU1fU0laRV9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjbWQgPSAoY2hhciAqKWNhbGxvYyhjbWRTaXplLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAoY21kID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoY21kLCBjbWRTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseVN6ID0gcmVwbHlTaXplOwotICAgICAgICAgICAgY2hhciAqcmVzcCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAocmVwbHlTaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcGx5U2l6ZSA+IEVGRkVDVF9QQVJBTV9TSVpFX01BWCkgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzcCA9IChjaGFyICopY2FsbG9jKHJlcGx5U2l6ZSwgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3AgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBmcmVlKGNtZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKE5PX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tYW5kKGNtZENvZGUsIGNtZFNpemUsIGNtZCwgJnJlcGx5U3osIHJlc3ApOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwbHlTeiA8IHJlcGx5U2l6ZSkgewotICAgICAgICAgICAgICAgICAgICByZXBseVNpemUgPSByZXBseVN6OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXBseVNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXBseVNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHJlc3AsIHJlcGx5U2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNtZCkgewotICAgICAgICAgICAgICAgIGZyZWUoY21kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXNwKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShyZXNwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6IHsKLSAgICAgICAgICAgIEFMT0dWKCJESVNDT05ORUNUIik7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUVmZmVjdCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0Q2JsaygpKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lFZmZlY3RDbGllbnQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUVmZmVjdENsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmM2N2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUVmZmVjdENsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJJRWZmZWN0Q2xpZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBDT05UUk9MX1NUQVRVU19DSEFOR0VEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBFTkFCTEVfU1RBVFVTX0NIQU5HRUQsCi0gICAgQ09NTUFORF9FWEVDVVRFRAotfTsKLQotY2xhc3MgQnBFZmZlY3RDbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJRWZmZWN0Q2xpZW50PgotewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwRWZmZWN0Q2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJjb250cm9sU3RhdHVzQ2hhbmdlZCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0Q2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWNvbnRyb2xHcmFudGVkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENPTlRST0xfU1RBVFVTX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLQotICAgIHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQpCi0gICAgewotICAgICAgICBBTE9HVigiZW5hYmxlU3RhdHVzQ2hhbmdlZCIpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRWZmZWN0Q2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKHVpbnQzMl90KWVuYWJsZWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX1NUQVRVU19DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpCi0gICAgewotICAgICAgICBBTE9HVigiY29tbWFuZEV4ZWN1dGVkIik7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElFZmZlY3RDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjbWRDb2RlKTsKLSAgICAgICAgaW50IHNpemUgPSBjbWRTaXplOwotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOwotICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgZGF0YS53cml0ZShwQ21kRGF0YSwgc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZSA9IHJlcGx5U2l6ZTsKLSAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNpemUpOwotICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgZGF0YS53cml0ZShwUmVwbHlEYXRhLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ09NTUFORF9FWEVDVVRFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7Ci0gICAgfQotCi19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50LCAiYW5kcm9pZC5tZWRpYS5JRWZmZWN0Q2xpZW50Iik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5FZmZlY3RDbGllbnQ6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBDT05UUk9MX1NUQVRVU19DSEFOR0VEOiB7Ci0gICAgICAgICAgICBBTE9HVigiQ09OVFJPTF9TVEFUVVNfQ0hBTkdFRCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3RDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgaGFzQ29udHJvbCA9IChib29sKWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjb250cm9sU3RhdHVzQ2hhbmdlZChoYXNDb250cm9sKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBFTkFCTEVfU1RBVFVTX0NIQU5HRUQ6IHsKLSAgICAgICAgICAgIEFMT0dWKCJFTkFCTEVfU1RBVFVTX0NIQU5HRUQiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRWZmZWN0Q2xpZW50LCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGVuYWJsZWQgPSAoYm9vbClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDT01NQU5EX0VYRUNVVEVEOiB7Ci0gICAgICAgICAgICBBTE9HVigiQ09NTUFORF9FWEVDVVRFRCIpOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElFZmZlY3RDbGllbnQsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IGNtZENvZGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjaGFyICpjbWQgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGNtZFNpemUpIHsKLSAgICAgICAgICAgICAgICBjbWQgPSAoY2hhciAqKW1hbGxvYyhjbWRTaXplKTsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoY21kLCBjbWRTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBjaGFyICpyZXNwID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChyZXBseVNpemUpIHsKLSAgICAgICAgICAgICAgICByZXNwID0gKGNoYXIgKiltYWxsb2MocmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQocmVzcCwgcmVwbHlTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbW1hbmRFeGVjdXRlZChjbWRDb2RlLCBjbWRTaXplLCBjbWQsIHJlcGx5U2l6ZSwgcmVzcCk7Ci0gICAgICAgICAgICBpZiAoY21kKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShjbWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3ApIHsKLSAgICAgICAgICAgICAgICBmcmVlKHJlc3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCmluZGV4IDQ4MmI5ZmIuLjAzNGQxNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKQEAgLTEsMyArMSw0IEBACiBna2FzdGVuQGdvb2dsZS5jb20KK2h1bmdhQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUGxheWVyQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9QbGF5ZXJCYXNlLmNwcAppbmRleCBiMGM2OGU1Li40NDZhNThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9QbGF5ZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9QbGF5ZXJCYXNlLmNwcApAQCAtMTUsMjAgKzE1LDIzIEBACiAgKi8KIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9QbGF5ZXJCYXNlLmg+CiAKICNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIG1pbihhLCBiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7Cit1c2luZyBhaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVDsKK3VzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uOwordXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbjsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUGxheWVyQmFzZTo6UGxheWVyQmFzZSgpIDogQm5QbGF5ZXIoKSwKICAgICAgICAgbVBhbk11bHRpcGxpZXJMKDEuMGYpLCBtUGFuTXVsdGlwbGllclIoMS4wZiksCiAgICAgICAgIG1Wb2x1bWVNdWx0aXBsaWVyTCgxLjBmKSwgbVZvbHVtZU11bHRpcGxpZXJSKDEuMGYpLAotICAgICAgICBtUElJZChQTEFZRVJfUElJRF9JTlZBTElEKSwgbUxhc3RSZXBvcnRlZEV2ZW50KFBMQVlFUl9TVEFURV9VTktOT1dOKQorICAgICAgICBtUElJZChQTEFZRVJfUElJRF9JTlZBTElEKSwgbUxhc3RSZXBvcnRlZEV2ZW50KFBMQVlFUl9TVEFURV9VTktOT1dOKSwKKyAgICAgICAgbUxhc3RSZXBvcnRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiAgICAgQUxPR0QoIlBsYXllckJhc2U6OlBsYXllckJhc2UoKSIpOwogICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBhdWRpbyBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKQEAgLTQ2LDExICs0OSwxMiBAQAogICAgIGJhc2VEZXN0cm95KCk7CiB9CiAKLXZvaWQgUGxheWVyQmFzZTo6aW5pdChwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKK3ZvaWQgUGxheWVyQmFzZTo6aW5pdChwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKICAgICBpZiAobUF1ZGlvTWFuYWdlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvUGxheWVyIHJlYWxpemU6IG5vIGF1ZGlvIHNlcnZpY2UsIHBsYXllciB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVBJSWQgPSBtQXVkaW9NYW5hZ2VyLT50cmFja1BsYXllcihwbGF5ZXJUeXBlLCB1c2FnZSwgQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIHRoaXMpOworICAgICAgICBtUElJZCA9IG1BdWRpb01hbmFnZXItPnRyYWNrUGxheWVyKHBsYXllclR5cGUsIHVzYWdlLCBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgdGhpcywKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQpOwogICAgIH0KIH0KIApAQCAtNjIsMTQgKzY2LDI2IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIFBsYXllckJhc2U6OnNlcnZpY2VQbGF5ZXJFdmVudChwbGF5ZXJfc3RhdGVfdCBldmVudCkgewordm9pZCBQbGF5ZXJCYXNlOjpzZXJ2aWNlUGxheWVyRXZlbnQocGxheWVyX3N0YXRlX3QgZXZlbnQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKICAgICBpZiAobUF1ZGlvTWFuYWdlciAhPSAwKSB7Ci0gICAgICAgIC8vIG9ubHkgcmVwb3J0IHN0YXRlIGNoYW5nZQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVBsYXllclN0YXRlTG9jayk7Ci0gICAgICAgIGlmIChldmVudCAhPSBtTGFzdFJlcG9ydGVkRXZlbnQKLSAgICAgICAgICAgICAgICAmJiBtUElJZCAhPSBQTEFZRVJfUElJRF9JTlZBTElEKSB7Ci0gICAgICAgICAgICBtTGFzdFJlcG9ydGVkRXZlbnQgPSBldmVudDsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXItPnBsYXllckV2ZW50KG1QSUlkLCBldmVudCk7CisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUlkTG9jayk7CisgICAgICAgICAgICBjaGFuZ2VkID0gbUxhc3RSZXBvcnRlZERldmljZUlkICE9IGRldmljZUlkOworICAgICAgICAgICAgbUxhc3RSZXBvcnRlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVBsYXllclN0YXRlTG9jayk7CisgICAgICAgICAgICAvLyBQTEFZRVJfVVBEQVRFX0RFVklDRV9JRCBpcyBub3Qgc2F2ZWQgYXMgYW4gYWN0dWFsIHN0YXRlLCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAvLyBkZXZpY2UgSUQgb25seS4KKyAgICAgICAgICAgIGlmICgoZXZlbnQgIT0gUExBWUVSX1VQREFURV9ERVZJQ0VfSUQpICYmIChldmVudCAhPSBtTGFzdFJlcG9ydGVkRXZlbnQpKSB7CisgICAgICAgICAgICAgICAgbUxhc3RSZXBvcnRlZEV2ZW50ID0gZXZlbnQ7CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5nZWQgJiYgKG1QSUlkICE9IFBMQVlFUl9QSUlEX0lOVkFMSUQpKSB7CisgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLT5wbGF5ZXJFdmVudChtUElJZCwgZXZlbnQsIGRldmljZUlkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTgyLDE0ICs5OCwxOCBAQAogfQogCiAvL0ZJWE1FIHRlbXBvcmFyeSBtZXRob2Qgd2hpbGUgc29tZSBwbGF5ZXIgc3RhdGUgaXMgb3V0c2lkZSBvZiB0aGlzIGNsYXNzCi12b2lkIFBsYXllckJhc2U6OnJlcG9ydEV2ZW50KHBsYXllcl9zdGF0ZV90IGV2ZW50KSB7Ci0gICAgc2VydmljZVBsYXllckV2ZW50KGV2ZW50KTsKK3ZvaWQgUGxheWVyQmFzZTo6cmVwb3J0RXZlbnQocGxheWVyX3N0YXRlX3QgZXZlbnQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBzZXJ2aWNlUGxheWVyRXZlbnQoZXZlbnQsIGRldmljZUlkKTsKIH0KIAotc3RhdHVzX3QgUGxheWVyQmFzZTo6c3RhcnRXaXRoU3RhdHVzKCkgewordm9pZCBQbGF5ZXJCYXNlOjpiYXNlVXBkYXRlRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgeworICAgIHNlcnZpY2VQbGF5ZXJFdmVudChQTEFZRVJfVVBEQVRFX0RFVklDRV9JRCwgZGV2aWNlSWQpOworfQorCitzdGF0dXNfdCBQbGF5ZXJCYXNlOjpzdGFydFdpdGhTdGF0dXMoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IHBsYXllclN0YXJ0KCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzZXJ2aWNlUGxheWVyRXZlbnQoUExBWUVSX1NUQVRFX1NUQVJURUQpOworICAgICAgICBzZXJ2aWNlUGxheWVyRXZlbnQoUExBWUVSX1NUQVRFX1NUQVJURUQsIGRldmljZUlkKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygiUGxheWVyQmFzZTo6c3RhcnQoKSBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgfQpAQCAtOTksMTggKzExOSwxOCBAQAogc3RhdHVzX3QgUGxheWVyQmFzZTo6cGF1c2VXaXRoU3RhdHVzKCkgewogICAgIHN0YXR1c190IHN0YXR1cyA9IHBsYXllclBhdXNlKCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzZXJ2aWNlUGxheWVyRXZlbnQoUExBWUVSX1NUQVRFX1BBVVNFRCk7CisgICAgICAgIHNlcnZpY2VQbGF5ZXJFdmVudChQTEFZRVJfU1RBVEVfUEFVU0VELCBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygiUGxheWVyQmFzZTo6cGF1c2UoKSBlcnJvciAlZCIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQogc3RhdHVzX3QgUGxheWVyQmFzZTo6c3RvcFdpdGhTdGF0dXMoKSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGxheWVyU3RvcCgpOworCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzZXJ2aWNlUGxheWVyRXZlbnQoUExBWUVSX1NUQVRFX1NUT1BQRUQpOworICAgICAgICBzZXJ2aWNlUGxheWVyRXZlbnQoUExBWUVSX1NUQVRFX1NUT1BQRUQsIEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJQbGF5ZXJCYXNlOjpzdG9wKCkgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgIH0KQEAgLTEyMSw3ICsxNDEsMTIgQEAKIC8vIEltcGxlbWVudGF0aW9uIG9mIElQbGF5ZXIKIGJpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnN0YXJ0KCkgewogICAgIEFMT0dEKCJQbGF5ZXJCYXNlOjpzdGFydCgpIGZyb20gSVBsYXllciIpOwotICAgICh2b2lkKXN0YXJ0V2l0aFN0YXR1cygpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUlkTG9jayk7CisgICAgICAgIGRldmljZUlkID0gbUxhc3RSZXBvcnRlZERldmljZUlkOworICAgIH0KKyAgICAodm9pZClzdGFydFdpdGhTdGF0dXMoZGV2aWNlSWQpOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIApAQCAtMTQ5LDcgKzE3NCw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HVygiUGxheWVyQmFzZTo6c2V0Vm9sdW1lKCkgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFBsYXllckJhc2U6OnNldFBhbihmbG9hdCBwYW4pIHsKQEAgLTE2OSw3ICsxOTQsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coIlBsYXllckJhc2U6OnNldFBhbigpIGVycm9yICVkIiwgc3RhdHVzKTsKICAgICB9Ci0gICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBQbGF5ZXJCYXNlOjpzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zIF9fdW51c2VkKSB7CkBAIC0xNzgsOCArMjAzLDggQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24gX191bnVzZWQsCi0gICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uIF9fdW51c2VkKSB7CisgICAgICAgICAgICBjb25zdCBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uIF9fdW51c2VkLAorICAgICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyT3BlcmF0aW9uJiBvcGVyYXRpb24gX191bnVzZWQpIHsKICAgICBBTE9HVygiYXBwbHlWb2x1bWVTaGFwZXIoKSBpcyBub3Qgc3VwcG9ydGVkIik7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUG9saWN5QWlkbENvbnZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmRiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9Qb2xpY3lBaWRsQ29udmVyc2lvbi5jcHAKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlBvbGljeUFpZGxDb252ZXJzaW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAibWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaCIKKworI2luY2x1ZGUgIm1lZGlhL0FpZGxDb252ZXJzaW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgYmFzZTo6dW5leHBlY3RlZDsKKworQ29udmVyc2lvblJlc3VsdDx2b2x1bWVfZ3JvdXBfdD4KK2FpZGwybGVnYWN5X2ludDMyX3Rfdm9sdW1lX2dyb3VwX3QoaW50MzJfdCBhaWRsKSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDx2b2x1bWVfZ3JvdXBfdD4oYWlkbCk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4KK2xlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3Qodm9sdW1lX2dyb3VwX3QgbGVnYWN5KSB7CisgICAgcmV0dXJuIGNvbnZlcnRSZWludGVycHJldDxpbnQzMl90PihsZWdhY3kpOworfQorCitDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgorYWlkbDJsZWdhY3lfQXVkaW9NaXhUeXBlX3VpbnQzMl90KG1lZGlhOjpBdWRpb01peFR5cGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peFR5cGU6OlBMQVlFUlM6CisgICAgICAgICAgICByZXR1cm4gTUlYX1RZUEVfUExBWUVSUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9NaXhUeXBlOjpSRUNPUkRFUlM6CisgICAgICAgICAgICByZXR1cm4gTUlYX1RZUEVfUkVDT1JERVJTOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peFR5cGU+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFR5cGUodWludDMyX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBNSVhfVFlQRV9QTEFZRVJTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peFR5cGU6OlBMQVlFUlM7CisgICAgICAgIGNhc2UgTUlYX1RZUEVfUkVDT1JERVJTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb01peFR5cGU6OlJFQ09SREVSUzsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4Q2FsbGJhY2tGbGFnX3VpbnQzMl90KG1lZGlhOjpBdWRpb01peENhbGxiYWNrRmxhZyBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4Q2FsbGJhY2tGbGFnOjpOT1RJRllfQUNUSVZJVFk6CisgICAgICAgICAgICByZXR1cm4gQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eTsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9NaXhDYWxsYmFja0ZsYWc+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peENhbGxiYWNrRmxhZyh1aW50MzJfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHk6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTWl4Q2FsbGJhY2tGbGFnOjpOT1RJRllfQUNUSVZJVFk7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdF9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwgaW50MzJfdCwgdWludDMyX3QsIG1lZGlhOjpBdWRpb01peENhbGxiYWNrRmxhZz4oCisgICAgICAgICAgICBhaWRsLAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhDYWxsYmFja0ZsYWdfdWludDMyX3QsCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9NaXhDYWxsYmFja0ZsYWc+LAorICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPHVpbnQzMl90LCB1aW50MzJfdD4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peENhbGxiYWNrRmxhZ19tYXNrKHVpbnQzMl90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCB1aW50MzJfdCwgbWVkaWE6OkF1ZGlvTWl4Q2FsbGJhY2tGbGFnLCB1aW50MzJfdD4oCisgICAgICAgICAgICBsZWdhY3ksCisgICAgICAgICAgICBsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peENhbGxiYWNrRmxhZywKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8dWludDMyX3Q+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9NaXhDYWxsYmFja0ZsYWc+KTsKK30KKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4Um91dGVGbGFnX3VpbnQzMl90KG1lZGlhOjpBdWRpb01peFJvdXRlRmxhZyBhaWRsKSB7CisgICAgc3dpdGNoIChhaWRsKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4Um91dGVGbGFnOjpSRU5ERVI6CisgICAgICAgICAgICByZXR1cm4gTUlYX1JPVVRFX0ZMQUdfUkVOREVSOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peFJvdXRlRmxhZzo6TE9PUF9CQUNLOgorICAgICAgICAgICAgcmV0dXJuIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSzsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9NaXhSb3V0ZUZsYWc+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZyh1aW50MzJfdCBsZWdhY3kpIHsKKyAgICBzd2l0Y2ggKGxlZ2FjeSkgeworICAgICAgICBjYXNlIE1JWF9ST1VURV9GTEFHX1JFTkRFUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9NaXhSb3V0ZUZsYWc6OlJFTkRFUjsKKyAgICAgICAgY2FzZSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0s6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvTWl4Um91dGVGbGFnOjpMT09QX0JBQ0s7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peFJvdXRlRmxhZ191aW50MzJfdF9tYXNrKGludDMyX3QgYWlkbCkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazx1aW50MzJfdCwgaW50MzJfdCwgdWludDMyX3QsIG1lZGlhOjpBdWRpb01peFJvdXRlRmxhZz4oCisgICAgICAgICAgICBhaWRsLAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhSb3V0ZUZsYWdfdWludDMyX3QsCisgICAgICAgICAgICBpbmRleFRvRW51bV9pbmRleDxtZWRpYTo6QXVkaW9NaXhSb3V0ZUZsYWc+LAorICAgICAgICAgICAgZW51bVRvTWFza19iaXRtYXNrPHVpbnQzMl90LCB1aW50MzJfdD4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZ19tYXNrKHVpbnQzMl90IGxlZ2FjeSkgeworICAgIHJldHVybiBjb252ZXJ0Qml0bWFzazxpbnQzMl90LCB1aW50MzJfdCwgbWVkaWE6OkF1ZGlvTWl4Um91dGVGbGFnLCB1aW50MzJfdD4oCisgICAgICAgICAgICBsZWdhY3ksCisgICAgICAgICAgICBsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZywKKyAgICAgICAgICAgIGluZGV4VG9FbnVtX2JpdG1hc2s8dWludDMyX3Q+LAorICAgICAgICAgICAgZW51bVRvTWFza19pbmRleDxpbnQzMl90LCBtZWRpYTo6QXVkaW9NaXhSb3V0ZUZsYWc+KTsKK30KKworLy8gVGhpcyB0eXBlIGlzIHVubmFtZWQgaW4gdGhlIG9yaWdpbmFsIGRlZmluaXRpb24sIHRodXMgd2UgbmFtZSBpdCBoZXJlLgordXNpbmcgQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlID0gZGVjbHR5cGUoQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6bVZhbHVlKTsKKworQ29udmVyc2lvblJlc3VsdDxBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWU+CithaWRsMmxlZ2FjeV9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUmIGFpZGwsCisgICAgICAgIHVpbnQzMl90KiBydWxlKSB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlIGxlZ2FjeTsKKyAgICAqcnVsZSA9IDA7CisgICAgc3dpdGNoIChhaWRsLmdldFRhZygpKSB7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZTo6dXNhZ2U6CisgICAgICAgICAgICBsZWdhY3kubVVzYWdlID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QoVU5JT05fR0VUKGFpZGwsIHVzYWdlKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAqcnVsZSB8PSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRTsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlOjpzb3VyY2U6CisgICAgICAgICAgICBsZWdhY3kubVNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KFVOSU9OX0dFVChhaWRsLCBzb3VyY2UpLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICpydWxlIHw9IFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOworICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKKworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWU6OnVpZDoKKyAgICAgICAgICAgIGxlZ2FjeS5tVWlkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KFVOSU9OX0dFVChhaWRsLCB1aWQpLnZhbHVlKCkpKTsKKyAgICAgICAgICAgICpydWxlIHw9IFJVTEVfTUFUQ0hfVUlEOworICAgICAgICAgICAgcmV0dXJuIGxlZ2FjeTsKKworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWU6OnVzZXJJZDoKKyAgICAgICAgICAgIGxlZ2FjeS5tVXNlcklkID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50PihVTklPTl9HRVQoYWlkbCwgdXNlcklkKS52YWx1ZSgpKSk7CisgICAgICAgICAgICAqcnVsZSB8PSBSVUxFX01BVENIX1VTRVJJRDsKKyAgICAgICAgICAgIHJldHVybiBsZWdhY3k7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZSgKKyAgICAgICAgY29uc3QgQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlJiBsZWdhY3ksCisgICAgICAgIHVpbnQzMl90IHJ1bGUpIHsKKyAgICBtZWRpYTo6QXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlIGFpZGw7CisgICAgc3dpdGNoIChydWxlKSB7CisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3VzYWdlX3RfQXVkaW9Vc2FnZShsZWdhY3kubVVzYWdlKSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgICAgIFVOSU9OX1NFVChhaWRsLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZShsZWdhY3kubVNvdXJjZSkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdWlkLCBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChsZWdhY3kubVVpZCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VU0VSSUQ6CisgICAgICAgICAgICBVTklPTl9TRVQoYWlkbCwgdXNlcklkLCBWQUxVRV9PUl9SRVRVUk4oY29udmVydFJlaW50ZXJwcmV0PHVpbnQzMl90PihsZWdhY3kubVVzZXJJZCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworICAgIH0KKyAgICByZXR1cm4gYWlkbDsKK30KKworCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+CithaWRsMmxlZ2FjeV9BdWRpb01peE1hdGNoQ3JpdGVyaW9uKGNvbnN0IG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uJiBhaWRsKSB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBsZWdhY3k7CisgICAgbGVnYWN5Lm1WYWx1ZSA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZShhaWRsLnZhbHVlLCAmbGVnYWN5Lm1SdWxlKSk7CisgICAgaWYgKGFpZGwuaW52ZXJ0KSB7CisgICAgICAgIGxlZ2FjeS5tUnVsZSB8PSBSVUxFX0VYQ0xVU0lPTl9NQVNLOworICAgIH0KKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uPgorbGVnYWN5MmFpZGxfQXVkaW9NaXhNYXRjaENyaXRlcmlvbihjb25zdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbiBhaWRsOworICAgIHVpbnQzMl90IHJ1bGUgPSBsZWdhY3kubVJ1bGU7CisgICAgaWYgKHJ1bGUgJiBSVUxFX0VYQ0xVU0lPTl9NQVNLKSB7CisgICAgICAgIGFpZGwuaW52ZXJ0ID0gdHJ1ZTsKKyAgICAgICAgcnVsZSAmPSB+UlVMRV9FWENMVVNJT05fTUFTSzsKKyAgICB9CisgICAgYWlkbC52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWUobGVnYWN5Lm1WYWx1ZSwgcnVsZSkpOworICAgIHJldHVybiBhaWRsOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvTWl4PgorYWlkbDJsZWdhY3lfQXVkaW9NaXgoY29uc3QgbWVkaWE6OkF1ZGlvTWl4JiBhaWRsKSB7CisgICAgQXVkaW9NaXggbGVnYWN5OworICAgIFJFVFVSTl9JRl9FUlJPUihjb252ZXJ0UmFuZ2UoYWlkbC5jcml0ZXJpYS5iZWdpbigpLCBhaWRsLmNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKGxlZ2FjeS5tQ3JpdGVyaWEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9NaXhNYXRjaENyaXRlcmlvbikpOworICAgIGxlZ2FjeS5tTWl4VHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb01peFR5cGVfdWludDMyX3QoYWlkbC5taXhUeXBlKSk7CisgICAgbGVnYWN5Lm1Gb3JtYXQgPSBWQUxVRV9PUl9SRVRVUk4oYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoYWlkbC5mb3JtYXQpKTsKKyAgICBsZWdhY3kubVJvdXRlRmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb01peFJvdXRlRmxhZ191aW50MzJfdF9tYXNrKGFpZGwucm91dGVGbGFncykpOworICAgIGxlZ2FjeS5tRGV2aWNlVHlwZSA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChhaWRsLmRldmljZS50eXBlKSk7CisgICAgbGVnYWN5Lm1EZXZpY2VBZGRyZXNzID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzgoYWlkbC5kZXZpY2UuYWRkcmVzcykpOworICAgIGxlZ2FjeS5tQ2JGbGFncyA9IFZBTFVFX09SX1JFVFVSTihhaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdF9tYXNrKGFpZGwuY2JGbGFncykpOworICAgIGxlZ2FjeS5tQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmUgPSBhaWRsLmFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlOworICAgIGxlZ2FjeS5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQgPSBhaWRsLnZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkOworICAgIHJldHVybiBsZWdhY3k7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTWl4PgorbGVnYWN5MmFpZGxfQXVkaW9NaXgoY29uc3QgQXVkaW9NaXgmIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb01peCBhaWRsOworICAgIGFpZGwuY3JpdGVyaWEgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb01peE1hdGNoQ3JpdGVyaW9uPj4oCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeS5tQ3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24pKTsKKyAgICBhaWRsLm1peFR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhUeXBlKGxlZ2FjeS5tTWl4VHlwZSkpOworICAgIGFpZGwuZm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGxlZ2FjeS5tRm9ybWF0KSk7CisgICAgYWlkbC5yb3V0ZUZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhSb3V0ZUZsYWdfbWFzayhsZWdhY3kubVJvdXRlRmxhZ3MpKTsKKyAgICBhaWRsLmRldmljZS50eXBlID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGxlZ2FjeS5tRGV2aWNlVHlwZSkpOworICAgIGFpZGwuZGV2aWNlLmFkZHJlc3MgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcobGVnYWN5Lm1EZXZpY2VBZGRyZXNzKSk7CisgICAgYWlkbC5jYkZsYWdzID0gVkFMVUVfT1JfUkVUVVJOKGxlZ2FjeTJhaWRsX3VpbnQzMl90X0F1ZGlvTWl4Q2FsbGJhY2tGbGFnX21hc2sobGVnYWN5Lm1DYkZsYWdzKSk7CisgICAgYWlkbC5hbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZSA9IGxlZ2FjeS5tQWxsb3dQcml2aWxlZ2VkTWVkaWFQbGF5YmFja0NhcHR1cmU7CisgICAgYWlkbC52b2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZCA9IGxlZ2FjeS5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQ7CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZV9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QobWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlOjpVTkFWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlOjpBVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGU+CitsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3RfQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZShhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlOjpVTkFWQUlMQUJMRTsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZTo6QVZBSUxBQkxFOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQ05UOgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Qb2xpY3lGb3JjZVVzZV9hdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpDT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZTo6TUVESUE6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZTo6UkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpET0NLOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZTo6U1lTVEVNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpIRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpFTkNPREVEX1NVUlJPVU5EOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZTo6VklCUkFURV9SSU5HSU5HOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HOworICAgIH0KKyAgICByZXR1cm4gdW5leHBlY3RlZChCQURfVkFMVUUpOworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlPgorbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90X0F1ZGlvUG9saWN5Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpDT01NVU5JQ0FUSU9OOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUE6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2U6Ok1FRElBOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpSRUNPUkQ7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpET0NLOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpTWVNURU07CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZTo6SERNSV9TWVNURU1fQVVESU87CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpFTkNPREVEX1NVUlJPVU5EOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlOjpWSUJSQVRFX1JJTkdJTkc7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190PgorYWlkbDJsZWdhY3lfQXVkaW9Qb2xpY3lGb3JjZWRDb25maWdfYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdChtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWcgYWlkbCkgeworICAgIHN3aXRjaCAoYWlkbCkgeworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OlNQRUFLRVI6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpIRUFEUEhPTkVTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6QlRfU0NPOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ087CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpCVF9BMkRQOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6V0lSRURfQUNDRVNTT1JZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlk7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpCVF9DQVJfRE9DSzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0s7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpCVF9ERVNLX0RPQ0s6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkFOQUxPR19ET0NLOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkRJR0lUQUxfRE9DSzoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6Tk9fQlRfQTJEUDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OlNZU1RFTV9FTkZPUkNFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6SERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEOworICAgICAgICBjYXNlIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6RU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkVOQ09ERURfU1VSUk9VTkRfQUxXQVlTOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUzsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkVOQ09ERURfU1VSUk9VTkRfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc+CitsZWdhY3kyYWlkbF9hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190X0F1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6Ok5PTkU7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpTUEVBS0VSOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6SEVBRFBIT05FUzsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6QlRfU0NPOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9BMkRQOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6QlRfQTJEUDsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6V0lSRURfQUNDRVNTT1JZOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9DQVJfRE9DSzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkJUX0NBUl9ET0NLOworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9ERVNLX0RPQ0s6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpCVF9ERVNLX0RPQ0s7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6QU5BTE9HX0RPQ0s7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSzoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkRJR0lUQUxfRE9DSzsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6Ok5PX0JUX0EyRFA7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OlNZU1RFTV9FTkZPUkNFRDsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnOjpIRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRDsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZWRDb25maWc6OkVOQ09ERURfU1VSUk9VTkRfTkVWRVI7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6RU5DT0RFRF9TVVJST1VORF9BTFdBWVM7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZzo6RU5DT0RFRF9TVVJST1VORF9NQU5VQUw7CisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxkZXZpY2Vfcm9sZV90PgorYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KG1lZGlhOjpEZXZpY2VSb2xlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6RGV2aWNlUm9sZTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfUk9MRV9OT05FOworICAgICAgICBjYXNlIG1lZGlhOjpEZXZpY2VSb2xlOjpQUkVGRVJSRUQ6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX1JPTEVfUFJFRkVSUkVEOworICAgICAgICBjYXNlIG1lZGlhOjpEZXZpY2VSb2xlOjpESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiBERVZJQ0VfUk9MRV9ESVNBQkxFRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RGV2aWNlUm9sZT4KK2xlZ2FjeTJhaWRsX2RldmljZV9yb2xlX3RfRGV2aWNlUm9sZShkZXZpY2Vfcm9sZV90IGxlZ2FjeSkgeworICAgIHN3aXRjaCAobGVnYWN5KSB7CisgICAgICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6RGV2aWNlUm9sZTo6Tk9ORTsKKyAgICAgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkRldmljZVJvbGU6OlBSRUZFUlJFRDsKKyAgICAgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiBtZWRpYTo6RGV2aWNlUm9sZTo6RElTQUJMRUQ7CisgICAgfQorICAgIHJldHVybiB1bmV4cGVjdGVkKEJBRF9WQUxVRSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb2ZmbG9hZF9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb09mZmxvYWRNb2RlX2F1ZGlvX29mZmxvYWRfbW9kZV90KG1lZGlhOjpBdWRpb09mZmxvYWRNb2RlIGFpZGwpIHsKKyAgICBzd2l0Y2ggKGFpZGwpIHsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZTo6Tk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGU6OlNVUFBPUlRFRDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX1NVUFBPUlRFRDsKKyAgICAgICAgY2FzZSBtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZTo6R0FQTEVTU19TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9HQVBMRVNTX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfbW9kZV90X0F1ZGlvT2ZmbG9hZE1vZGUoYXVkaW9fb2ZmbG9hZF9tb2RlX3QgbGVnYWN5KSB7CisgICAgc3dpdGNoIChsZWdhY3kpIHsKKyAgICAgICAgY2FzZSBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGU6Ok5PVF9TVVBQT1JURUQ7CisgICAgICAgIGNhc2UgQVVESU9fT0ZGTE9BRF9TVVBQT1JURUQ6CisgICAgICAgICAgICByZXR1cm4gbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGU6OlNVUFBPUlRFRDsKKyAgICAgICAgY2FzZSBBVURJT19PRkZMT0FEX0dBUExFU1NfU1VQUE9SVEVEOgorICAgICAgICAgICAgcmV0dXJuIG1lZGlhOjpBdWRpb09mZmxvYWRNb2RlOjpHQVBMRVNTX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIHVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggMDUwYWQ2NS4uZTVlODQ5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVG9uZUdlbmVyYXRvciIKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTI1LDYgKzI3LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiAvLyBEZXNjcmlwdG9ycyBmb3IgYWxsIGF2YWlsYWJsZSB0b25lcyAoU2VlIFRvbmVHZW5lcmF0b3I6OlRvbmVEZXNjcmlwdG9yIGNsYXNzIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKQogY29uc3QgVG9uZUdlbmVyYXRvcjo6VG9uZURlc2NyaXB0b3IgVG9uZUdlbmVyYXRvcjo6c1RvbmVEZXNjcmlwdG9yc1tdID0gewpAQCAtNzQwLDYgKzc0MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKICAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCiAgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SQURJT19BQ0sKKyAgICAgICAgeyAuc2VnbWVudHMgPSB7IHsgLmR1cmF0aW9uID0gMTAwMCwgLndhdmVGcmVxID0geyA0MDAsIDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAyMDAwLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKKyAgICAgICAgICAucmVwZWF0Q250ID0gVG9uZUdlbmVyYXRvcjo6VE9ORUdFTl9JTkYsCisgICAgICAgICAgLnJlcGVhdFNlZ21lbnQgPSAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9KQVBBTl9SSU5HVE9ORQogICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAzNzUsIC53YXZlRnJlcSA9IHsgNDAwLCAwIH0sIDAsIDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMzc1LCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgeyAuZHVyYXRpb24gPSAwICwgLndhdmVGcmVxID0geyAwIH0sIDAsIDB9fSwKQEAgLTg1Myw2ICs4NjEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICB7IC5kdXJhdGlvbiA9IDAgLCAud2F2ZUZyZXEgPSB7IDAgfSwgMCwgMH19LAogICAgICAgICAgIC5yZXBlYXRDbnQgPSBUb25lR2VuZXJhdG9yOjpUT05FR0VOX0lORiwKICAgICAgICAgICAucmVwZWF0U2VnbWVudCA9IDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ORV9JTkRJQV9SSU5HVE9ORQorICAgICAgICB7IC5zZWdtZW50cyA9IHsgeyAuZHVyYXRpb24gPSAxMDAwLCAud2F2ZUZyZXEgPSB7IDQ0MCwgNDgwLCAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMjAwMCwgLndhdmVGcmVxID0geyAwIH0sIDAsIDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgLmR1cmF0aW9uID0gMCAsIC53YXZlRnJlcSA9IHsgMCB9LCAwLCAwfX0sCisgICAgICAgICAgLnJlcGVhdENudCA9IFRvbmVHZW5lcmF0b3I6OlRPTkVHRU5fSU5GLAorICAgICAgICAgIC5yZXBlYXRTZWdtZW50ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT05FX1RXX1JJTkdUT05FCiB9OwogCiAvLyBVc2VkIGJ5IFRvbmVHZW5lcmF0b3I6OmdldFRvbmVGb3JSZWdpb24oKSB0byBjb252ZXJ0IHVzZXIgc3BlY2lmaWVkIHN1cGVydmlzb3J5IHRvbmUgdHlwZQpAQCAtODc2LDcgKzg4OSw3IEBACiAgICAgICAgICAgICBUT05FX1NVUF9SQURJT19OT1RBVkFJTCwgICAgIC8vIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMCiAgICAgICAgICAgICBUT05FX1NVUF9FUlJPUiwgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0VSUk9SCiAgICAgICAgICAgICBUT05FX1NVUF9DQUxMX1dBSVRJTkcsICAgICAgIC8vIFRPTkVfU1VQX0NBTExfV0FJVElORwotICAgICAgICAgICAgVE9ORV9TVVBfUklOR1RPTkUgICAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQorICAgICAgICAgICAgVE9ORV9KQVBBTl9SSU5HVE9ORSAgICAgICAgICAvLyBUT05FX1NVUF9SSU5HVE9ORQogICAgICAgICB9LAogICAgICAgICB7ICAgLy8gR0IKICAgICAgICAgICAgIFRPTkVfQU5TSV9ESUFMLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRElBTApAQCAtOTM3LDYgKzk1MCwxNiBAQAogICAgICAgICAgICAgVE9ORV9TVVBfRVJST1IsICAgICAgICAgICAgICAvLyBUT05FX1NVUF9FUlJPUgogICAgICAgICAgICAgVE9ORV9JTkRJQV9DQUxMX1dBSVRJTkcsICAgICAvLyBUT05FX1NVUF9DQUxMX1dBSVRJTkcKICAgICAgICAgICAgIFRPTkVfSU5ESUFfUklOR1RPTkUgICAgICAgICAgLy8gVE9ORV9TVVBfUklOR1RPTkUKKyAgICAgICAgfSwKKyAgICAgICAgeyAgIC8vIFRBSVdBTgorICAgICAgICAgICAgVE9ORV9TVVBfRElBTCwgICAgICAgICAgICAgICAvLyBUT05FX1NVUF9ESUFMCisgICAgICAgICAgICBUT05FX1NVUF9CVVNZLCAgICAgICAgICAgICAgIC8vIFRPTkVfU1VQX0JVU1kKKyAgICAgICAgICAgIFRPTkVfU1VQX0NPTkdFU1RJT04sICAgICAgICAgLy8gVE9ORV9TVVBfQ09OR0VTVElPTgorICAgICAgICAgICAgVE9ORV9TVVBfUkFESU9fQUNLLCAgICAgICAgICAvLyBUT05FX1NVUF9SQURJT19BQ0sKKyAgICAgICAgICAgIFRPTkVfU1VQX1JBRElPX05PVEFWQUlMLCAgICAgLy8gVE9ORV9TVVBfUkFESU9fTk9UQVZBSUwKKyAgICAgICAgICAgIFRPTkVfU1VQX0VSUk9SLCAgICAgICAgICAgICAgLy8gVE9ORV9TVVBfRVJST1IKKyAgICAgICAgICAgIFRPTkVfU1VQX0NBTExfV0FJVElORywgICAgICAgLy8gVE9ORV9TVVBfQ0FMTF9XQUlUSU5HCisgICAgICAgICAgICBUT05FX1RXX1JJTkdUT05FICAgICAgICAgICAgIC8vIFRPTkVfU1VQX1JJTkdUT05FCiAgICAgICAgIH0KIH07CiAKQEAgLTk2NCw3ICs5ODcsOSBAQAogLy8gICAgICAgIG5vbmUKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVG9uZUdlbmVyYXRvcjo6VG9uZUdlbmVyYXRvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGZsb2F0IHZvbHVtZSwgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSkgeworVG9uZUdlbmVyYXRvcjo6VG9uZUdlbmVyYXRvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGZsb2F0IHZvbHVtZSwgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSwKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZSkKKyAgICAgICAgOiBtT3BQYWNrYWdlTmFtZShzdGQ6Om1vdmUob3BQYWNrYWdlTmFtZSkpIHsKIAogICAgIEFMT0dWKCJUb25lR2VuZXJhdG9yIGNvbnN0cnVjdG9yOiBzdHJlYW1UeXBlPSVkLCB2b2x1bWU9JWYiLCBzdHJlYW1UeXBlLCB2b2x1bWUpOwogCkBAIC0xMDEwLDYgKzEwMzUsOCBAQAogICAgICAgICBtUmVnaW9uID0gSVJFTEFORDsKICAgICB9IGVsc2UgaWYgKHN0cnN0cih2YWx1ZSwgImluIikgIT0gTlVMTCkgewogICAgICAgICBtUmVnaW9uID0gSU5ESUE7CisgICAgfSBlbHNlIGlmIChzdHJzdHIodmFsdWUsICJ0dyIpICE9IE5VTEwpIHsKKyAgICAgICAgbVJlZ2lvbiA9IFRBSVdBTjsKICAgICB9IGVsc2UgewogICAgICAgICBtUmVnaW9uID0gQ0VQVDsKICAgICB9CkBAIC0xMjMzLDcgKzEyNjAsMTEgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBib29sIFRvbmVHZW5lcmF0b3I6OmluaXRBdWRpb1RyYWNrKCkgewogICAgIC8vIE9wZW4gYXVkaW8gdHJhY2sgaW4gbW9ubywgUENNIDE2Yml0LCBkZWZhdWx0IHNhbXBsaW5nIHJhdGUuCi0gICAgbXBBdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gbU9wUGFja2FnZU5hbWU7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIG1wQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKGF0dHJpYnV0aW9uU291cmNlKTsKICAgICBBTE9HVigiQXVkaW9UcmFjayglcCkgY3JlYXRlZCIsIG1wQXVkaW9UcmFjay5nZXQoKSk7CiAKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cjsKQEAgLTEyNTksOCArMTI5MCw3IEBACiAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCiAgICAgICAgICAgICBudWxscHRyLAotICAgICAgICAgICAgQVVESU9fVUlEX0lOVkFMSUQsCi0gICAgICAgICAgICAtMSwKKyAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgJmF0dHIpOwogICAgIC8vIFNldCBjYWxsZXIgbmFtZSBzbyBpdCBjYW4gYmUgbG9nZ2VkIGluIGRlc3RydWN0b3IuCiAgICAgLy8gTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmg6IEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX1RPTkVHRU5FUkFUT1IKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9UcmFja1BsYXllckJhc2UuY3BwCmluZGV4IDBhOTE0ZmMuLjE4OGYzMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RyYWNrUGxheWVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVHJhY2tQbGF5ZXJCYXNlLmNwcApAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL1RyYWNrUGxheWVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0KK3VzaW5nIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUOwogdXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzMsOSArMzMsMTUgQEAKICAgICBkb0Rlc3Ryb3koKTsKIH0KIAotdm9pZCBUcmFja1BsYXllckJhc2U6OmluaXQoQXVkaW9UcmFjayogcGF0LCBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKLSAgICBQbGF5ZXJCYXNlOjppbml0KHBsYXllclR5cGUsIHVzYWdlKTsKK3ZvaWQgVHJhY2tQbGF5ZXJCYXNlOjppbml0KEF1ZGlvVHJhY2sqIHBhdCwgcGxheWVyX3R5cGVfdCBwbGF5ZXJUeXBlLCBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSB7CisgICAgUGxheWVyQmFzZTo6aW5pdChwbGF5ZXJUeXBlLCB1c2FnZSwgc2Vzc2lvbklkKTsKICAgICBtQXVkaW9UcmFjayA9IHBhdDsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgeworICAgICAgICBtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2sgPSBuZXcgU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2soKnRoaXMpOworICAgICAgICBtQXVkaW9UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2spOworICAgICAgICBtQXVkaW9UcmFjay0+c2V0UGxheWVySUlkKG1QSUlkKTsgLy8gc2V0IGluIFBsYXllckJhc2U6OmluaXQoKS4KKyAgICB9CiB9CiAKIHZvaWQgVHJhY2tQbGF5ZXJCYXNlOjpkZXN0cm95KCkgewpAQCAtNDMsOSArNDksMjMgQEAKICAgICBiYXNlRGVzdHJveSgpOwogfQogCitUcmFja1BsYXllckJhc2U6OlNlbGZBdWRpb0RldmljZUNhbGxiYWNrOjpTZWxmQXVkaW9EZXZpY2VDYWxsYmFjayhQbGF5ZXJCYXNlJiBzZWxmKSA6CisgICAgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2soKSwgbVNlbGYoc2VsZikgeworfQorCitUcmFja1BsYXllckJhc2U6OlNlbGZBdWRpb0RldmljZUNhbGxiYWNrOjp+U2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2soKSB7Cit9CisKK3ZvaWQgVHJhY2tQbGF5ZXJCYXNlOjpTZWxmQXVkaW9EZXZpY2VDYWxsYmFjazo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgbVNlbGYuYmFzZVVwZGF0ZURldmljZUlkKGRldmljZUlkKTsKK30KKwogdm9pZCBUcmFja1BsYXllckJhc2U6OmRvRGVzdHJveSgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewogICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOworICAgICAgICBtQXVkaW9UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2spOworICAgICAgICBtU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZXJlIG1heSBzdGlsbCBiZSBhbm90aGVyIHJlZmVyZW5jZSBpbiBwb3N0LXVubG9jayBwaGFzZSBvZiBTZXRQbGF5U3RhdGUKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKICAgICB9CkBAIC0xMDYsMTEgKzEyNiwxNyBAQAogCiAKIGJpbmRlcjo6U3RhdHVzIFRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgIGNvbnN0IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24mIG9wZXJhdGlvbikgeworICAgICAgICBjb25zdCBtZWRpYTo6Vm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiYgb3BlcmF0aW9uKSB7CiAKLSAgICBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+IHNwQ29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0gICAgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+IHNwT3BlcmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKG9wZXJhdGlvbik7CisgICAgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBzcENvbmZpZ3VyYXRpb24gPSBuZXcgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uKCk7CisgICAgc3A8Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+IHNwT3BlcmF0aW9uID0gbmV3IFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uKCk7CisKKyAgICBzdGF0dXNfdCBzID0gc3BDb25maWd1cmF0aW9uLT5yZWFkRnJvbVBhcmNlbGFibGUoY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgID86IHNwT3BlcmF0aW9uLT5yZWFkRnJvbVBhcmNlbGFibGUob3BlcmF0aW9uKTsKKyAgICBpZiAocyAhPSBPSykgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qocyk7CisgICAgfQogCiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKICAgICAgICAgQUxPR0QoIlRyYWNrUGxheWVyQmFzZTo6YXBwbHlWb2x1bWVTaGFwZXIoKSBmcm9tIElQbGF5ZXIiKTsKQEAgLTExOCw3ICsxNDQsNyBAQAogICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeyAvLyBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBpcyB0aGUgdm9sdW1lIHNoYXBlciBpZC4KICAgICAgICAgICAgIEFMT0dFKCJUcmFja1BsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgc3RhdHVzKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dEKCJUcmFja1BsYXllckJhc2U6OmFwcGx5Vm9sdW1lU2hhcGVyKCkiCiAgICAgICAgICAgICAgICIgbm8gQXVkaW9UcmFjayBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBJUGxheWVyIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzRXguYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXNFeC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTAyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzRXguYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXMgQysrIHR5cGUuCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9BdHRyaWJ1dGVzRXggeworICAgIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJpYnV0ZXM7CisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIHZvbHVtZV9ncm91cF90LiAqLworICAgIGludCBncm91cElkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTlkZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db250ZW50VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXNhZ2U7CisKKy8qKgorICogVGhlICJJbnRlcm5hbCIgc3VmZml4IG9mIHRoaXMgdHlwZSBuYW1lIGlzIHRvIGRpc2FtYmlndWF0ZSBpdCBmcm9tIHRoZQorICogYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMgU0RLIHR5cGUuCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgeworICAgIEF1ZGlvQ29udGVudFR5cGUgY29udGVudFR5cGU7CisgICAgQXVkaW9Vc2FnZSB1c2FnZTsKKyAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIC8vIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9GbGFnLgorICAgIGludCBmbGFnczsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyB0YWdzOyAvKiBVVEY4ICovCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NsaWVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGZlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9DbGllbnQuYWlkbApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvQ2xpZW50IHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgcGlkX3QuICovCisgICAgaW50IGNsaWVudFRpZDsKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM5N2QzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9PZmZsb2FkSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Db25maWcgeworICAgIGludCBzYW1wbGVSYXRlOworICAgIC8qKgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgorICAgICAqIFRPRE8oeXRhaSk6IENyZWF0ZSBhIGRlc2lnbmF0ZWQgdHlwZS4KKyAgICAgKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworICAgIEF1ZGlvT2ZmbG9hZEluZm8gb2ZmbG9hZEluZm87CisgICAgbG9uZyBmcmFtZUNvdW50OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTNjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Db25maWdCYXNlLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb0NvbmZpZ0Jhc2UgeworICAgIGludCBzYW1wbGVSYXRlOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19jaGFubmVsX21hc2tfdC4gKi8KKyAgICBpbnQgY2hhbm5lbE1hc2s7CisgICAgQXVkaW9Gb3JtYXQgZm9ybWF0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvQ29udGVudFR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNGZiYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0NvbnRlbnRUeXBlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvQ29udGVudFR5cGUgeworICAgIFVOS05PV04gPSAwLAorICAgIFNQRUVDSCA9IDEsCisgICAgTVVTSUMgPSAyLAorICAgIE1PVklFID0gMywKKyAgICBTT05JRklDQVRJT04gPSA0LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjAwNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9EZXZpY2UgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuICovCisgICAgaW50IHR5cGU7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgYWRkcmVzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0R1YWxNb25vTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRHVhbE1vbm9Nb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyMjBjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0R1YWxNb25vTW9kZS5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvLyBUT0RPKGIvMTc1MTY3MTQ5KTogUmVjb25jaWxlIEF1ZGlvRHVhbE1vbm9Nb2RlIHdpdGggZnJhbWV3b3JrLW1lZGlhLXNvdXJjZXMKKworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9EdWFsTW9ub01vZGUgeworICAgIE9GRiA9IDAsCisgICAgTFIgPSAxLAorICAgIExMID0gMiwKKyAgICBSUiA9IDMsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzYWRmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGUuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZSB7CisgICAgTk9ORSA9IDAsCisgICAgRlJBTUVXT1JLX1RVTkVSID0gMSwKKyAgICBEVkJfQURfREVTQ1JJUFRPUiA9IDIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA0ZTgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuYWlkbApAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgeworICAgICBOT05FID0gMCwKKyAgICAgRUxFTUVOVEFSWV9TVFJFQU0gPSAxLAorICAgICBIQU5ETEUgPSAyLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4YTYwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBBdWRpbyBlbmNhcHN1bGF0aW9uIHR5cGUgaXMgdXNlZCB0byBkZXNjcmliZSBpZiB0aGUgYXVkaW8gZGF0YSBzaG91bGQgYmUgc2VudCB3aXRoIGEgcGFydGljdWxhcgorICogZW5jYXBzdWxhdGlvbiB0eXBlIG9yIG5vdC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgeworICAgIE5PTkUgICAgID0gMCwKKyAgICBJRUM2MTkzNyA9IDEsCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvRmxhZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YjQ5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb0ZsYWcgeworICAgIEFVRElCSUxJVFlfRU5GT1JDRUQgPSAwLAorICAgIFNFQ1VSRSA9IDEsCisgICAgU0NPID0gMiwKKyAgICBCRUFDT04gPSAzLAorICAgIEhXX0FWX1NZTkMgPSA0LAorICAgIEhXX0hPVFdPUkQgPSA1LAorICAgIEJZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZID0gNiwKKyAgICBCWVBBU1NfTVVURSA9IDcsCisgICAgTE9XX0xBVEVOQ1kgPSA4LAorICAgIERFRVBfQlVGRkVSID0gOSwKKyAgICBOT19NRURJQV9QUk9KRUNUSU9OID0gMTAsCisgICAgTVVURV9IQVBUSUMgPSAxMSwKKyAgICBOT19TWVNURU1fQ0FQVFVSRSA9IDEyLAorICAgIENBUFRVUkVfUFJJVkFURSA9IDEzLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OGIyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluLmFpZGwKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9HYWluIHsKKyAgICBpbnQgaW5kZXg7CisgICAgYm9vbGVhbiB1c2VJbkNoYW5uZWxNYXNrOworICAgIGJvb2xlYW4gdXNlRm9yVm9sdW1lOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvR2Fpbk1vZGUuICovCisgICAgaW50IG1vZGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLworICAgIGludCBjaGFubmVsTWFzazsKKyAgICBpbnQgbWluVmFsdWU7CisgICAgaW50IG1heFZhbHVlOworICAgIGludCBkZWZhdWx0VmFsdWU7CisgICAgaW50IHN0ZXBWYWx1ZTsKKyAgICBpbnQgbWluUmFtcE1zOworICAgIGludCBtYXhSYW1wTXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9HYWluQ29uZmlnLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzYzJkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Db25maWcuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb0dhaW5Db25maWcgeworICAgIC8qKiBJbmRleCBvZiB0aGUgY29ycmVzcG9uZGluZyBhdWRpb19nYWluIGluIHRoZSBhdWRpb19wb3J0IGdhaW5zW10gdGFibGUuICovCisgICAgaW50IGluZGV4OworCisgICAgLyoqIE1vZGUgcmVxdWVzdGVkIGZvciB0aGlzIGNvbW1hbmQuIEJpdGZpZWxkIGluZGV4ZWQgYnkgQXVkaW9HYWluTW9kZS4gKi8KKyAgICBpbnQgbW9kZTsKKworICAgIC8qKgorICAgICAqIENoYW5uZWxzIHdoaWNoIGdhaW4gdmFsdWUgZm9sbG93cy4gTi9BIGluIGpvaW50IG1vZGUuCisgICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuCisgICAgICovCisgICAgaW50IGNoYW5uZWxNYXNrOworCisgICAgLyoqCisgICAgICogR2FpbiB2YWx1ZXMgaW4gbWlsbGliZWxzLgorICAgICAqIEZvciBlYWNoIGNoYW5uZWwgb3JkZXJlZCBmcm9tIExTYiB0byBNU2IgaW4gY2hhbm5lbCBtYXNrLiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpcyAxIGluIGpvaW50CisgICAgICogbW9kZSwgb3RoZXJ3aXNlIGVxdWFscyB0aGUgbnVtYmVyIG9mIGJpdHMgaW1wbGllZCBieSBjaGFubmVsTWFzay4KKyAgICAgKi8KKyAgICBpbnRbXSAgdmFsdWVzOworCisgICAgLyoqIFJhbXAgZHVyYXRpb24gaW4gbXMuICovCisgICAgaW50IHJhbXBEdXJhdGlvbk1zOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiOWYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0dhaW5Nb2RlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb0dhaW5Nb2RlIHsKKyAgICBKT0lOVCAgICA9IDAsCisgICAgQ0hBTk5FTFMgPSAxLAorICAgIFJBTVAgICAgID0gMiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lucHV0RmxhZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMwZWIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9JbnB1dEZsYWdzIHsKKyAgICBGQVNUICAgICAgID0gMCwKKyAgICBIV19IT1RXT1JEID0gMSwKKyAgICBSQVcgICAgICAgID0gMiwKKyAgICBTWU5DICAgICAgID0gMywKKyAgICBNTUFQX05PSVJRID0gNCwKKyAgICBWT0lQX1RYICAgID0gNSwKKyAgICBIV19BVl9TWU5DID0gNiwKKyAgICBESVJFQ1QgICAgID0gNywKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvQ29uZmlnRXZlbnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb0lvQ29uZmlnRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYyM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9Db25maWdFdmVudC5haWRsCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb0lvQ29uZmlnRXZlbnQgeworICAgIE9VVFBVVF9SRUdJU1RFUkVEID0gMCwKKyAgICBPVVRQVVRfT1BFTkVEID0gMSwKKyAgICBPVVRQVVRfQ0xPU0VEID0gMiwKKyAgICBPVVRQVVRfQ09ORklHX0NIQU5HRUQgPSAzLAorICAgIElOUFVUX1JFR0lTVEVSRUQgPSA0LAorICAgIElOUFVUX09QRU5FRCA9IDUsCisgICAgSU5QVVRfQ0xPU0VEID0gNiwKKyAgICBJTlBVVF9DT05GSUdfQ0hBTkdFRCA9IDcsCisgICAgQ0xJRU5UX1NUQVJURUQgPSA4LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZlZjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmFpZGwKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Jb0Rlc2NyaXB0b3IgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgaW9IYW5kbGU7CisgICAgQXVkaW9QYXRjaCBwYXRjaDsKKyAgICBpbnQgc2FtcGxpbmdSYXRlOworICAgIEF1ZGlvRm9ybWF0IGZvcm1hdDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fY2hhbm5lbF9tYXNrX3QuICovCisgICAgaW50IGNoYW5uZWxNYXNrOworICAgIGxvbmcgZnJhbWVDb3VudDsKKyAgICBsb25nIGZyYW1lQ291bnRIQUw7CisgICAgLyoqIE9ubHkgdmFsaWQgZm9yIG91dHB1dC4gKi8KKyAgICBpbnQgbGF0ZW5jeTsKKyAgICAvKioKKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LgorICAgICAqIHZhbGlkIGZvciBldmVudCBBVURJT19DTElFTlRfU1RBUlRFRC4KKyAgICAgKi8KKyAgICBpbnQgcG9ydElkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9GbGFncy5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvSW9GbGFncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjI1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Jb0ZsYWdzLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIEF1ZGlvSW9GbGFncyB7CisgICAgLyoqIEJpdG1hc2sgaW5kZXhlZCBieSBBdWRpb0lucHV0RmxhZ3MuICovCisgICAgaW50IGlucHV0OworICAgIC8qKiBCaXRtYXNrIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFncy4gKi8KKyAgICBpbnQgb3V0cHV0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXguYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDczMzcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4LmFpZGwKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4Q2FsbGJhY2tGbGFnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhNYXRjaENyaXRlcmlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4Um91dGVGbGFnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NaXhUeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb01peCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbltdIGNyaXRlcmlhOworICAgIEF1ZGlvTWl4VHlwZSBtaXhUeXBlOworICAgIEF1ZGlvQ29uZmlnIGZvcm1hdDsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb01peFJvdXRlRmxhZy4gKi8KKyAgICBpbnQgcm91dGVGbGFnczsKKyAgICBBdWRpb0RldmljZSBkZXZpY2U7CisgICAgLyoqIEZsYWdzIGluZGljYXRpbmcgd2hpY2ggY2FsbGJhY2tzIHRvIHVzZS4gQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb01peENhbGxiYWNrRmxhZy4gKi8KKyAgICBpbnQgY2JGbGFnczsKKyAgICAvKiogSWdub3JlIHRoZSBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04gKi8KKyAgICBib29sZWFuIGFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlOworICAgIC8qKiBJbmRpY2F0ZXMgaWYgdGhlIGNhbGxlciBjYW4gY2FwdHVyZSB2b2ljZSBjb21tdW5pY2F0aW9uIG91dHB1dCAqLworICAgIGJvb2xlYW4gdm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhDYWxsYmFja0ZsYWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peENhbGxiYWNrRmxhZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhDYWxsYmFja0ZsYWcuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9NaXhDYWxsYmFja0ZsYWcgeworICAgIE5PVElGWV9BQ1RJVklUWSA9IDAsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peExhdGVuY3lDbGFzcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MGIzNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIHsKKyAgICBMT1cgPSAwLAorICAgIE5PUk1BTCA9IDEsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzYzZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24uYWlkbApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peE1hdGNoQ3JpdGVyaW9uVmFsdWU7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24geworICAgIC8qKiBXaGVuIHRydWUsIHJ1bGUgYmVjb21lcyAiZXhjbHVkZSIgaW5zdGVhZCBvZiAiaW5jbHVkZSIuICovCisgICAgYm9vbGVhbiBpbnZlcnQ7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlIHZhbHVlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNmE5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhNYXRjaENyaXRlcmlvblZhbHVlLmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Vc2FnZTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb25WYWx1ZSB7CisgICAgQXVkaW9Vc2FnZSB1c2FnZSA9IEF1ZGlvVXNhZ2UuVU5LTk9XTjsKKyAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyB1aWRfdC4gKi8KKyAgICBpbnQgdWlkOworICAgIGludCB1c2VySWQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhSb3V0ZUZsYWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peFJvdXRlRmxhZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2NlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhSb3V0ZUZsYWcuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvTWl4Um91dGVGbGFnIHsKKyAgICBSRU5ERVIgPSAwLAorICAgIExPT1BfQkFDSyA9IDEsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9NaXhUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MDZkYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01peFR5cGUuYWlkbApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvTWl4VHlwZSB7CisgICAgUExBWUVSUyA9IDAsCisgICAgUkVDT1JERVJTID0gMSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY3ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5haWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Nb2RlIHsKKyAgICBJTlZBTElEID0gLTIsCisgICAgQ1VSUkVOVCA9IC0xLAorICAgIE5PUk1BTCA9IDAsCisgICAgUklOR1RPTkUgPSAxLAorICAgIElOX0NBTEwgPSAyLAorICAgIElOX0NPTU1VTklDQVRJT04gPSAzLAorICAgIENBTExfU0NSRUVOID0gNCwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRJbmZvLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NmIzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9PZmZsb2FkSW5mby5haWRsCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VzYWdlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuYXVkaW8uY29tbW9uLkF1ZGlvRm9ybWF0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb09mZmxvYWRJbmZvIHsKKyAgICAvKiogVmVyc2lvbiBvZiB0aGUgaW5mbyBzdHJ1Y3R1cmUuIEludGVycHJldGVkIGFzIGEgdWludDE2X3QgdmVyc2lvbiBjb25zdGFudC4gKi8KKyAgICBpbnQgdmVyc2lvbjsKKyAgICAvKiogQXVkaW8gY29uZmlndXJhdGlvbi4gKi8KKyAgICBBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnOworICAgIC8qKiBTdHJlYW0gdHlwZS4gKi8KKyAgICBBdWRpb1N0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAvKiogQml0IHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAqLworICAgIGludCBiaXRSYXRlOworICAgIC8qKiBEdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMsIC0xIGlmIHVua25vd24uICovCisgICAgbG9uZyBkdXJhdGlvblVzOworICAgIC8qKiB0cnVlIGlmIHN0cmVhbSBpcyB0aWVkIHRvIGEgdmlkZW8gc3RyZWFtLiAqLworICAgIGJvb2xlYW4gaGFzVmlkZW87CisgICAgLyoqIHRydWUgaWYgc3RyZWFtaW5nLCBmYWxzZSBpZiBsb2NhbCBwbGF5YmFjay4gKi8KKyAgICBib29sZWFuIGlzU3RyZWFtaW5nOworICAgIGludCBiaXRXaWR0aDsKKyAgICAvKiogT2ZmbG9hZCBmcmFnbWVudCBzaXplLiAqLworICAgIGludCBvZmZsb2FkQnVmZmVyU2l6ZTsKKyAgICBBdWRpb1VzYWdlIHVzYWdlOworICAgIEF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgZW5jYXBzdWxhdGlvbk1vZGU7CisgICAgLyoqIENvbnRlbnQgaWQgZnJvbSB0dW5lciBIQUwgKDAgaWYgbm9uZSkuICovCisgICAgaW50IGNvbnRlbnRJZDsKKyAgICAvKiogU3luYyBpZCBmcm9tIHR1bmVyIEhBTCAoMCBpZiBub25lKS4gKi8KKyAgICBpbnQgc3luY0lkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZE1vZGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRNb2RlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVhNDRmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb09mZmxvYWRNb2RlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb09mZmxvYWRNb2RlIHsKKyAgICBOT1RfU1VQUE9SVEVEID0gMCwKKyAgICBTVVBQT1JURUQgPSAxLAorICAgIEdBUExFU1NfU1VQUE9SVEVEID0gMgorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvT3V0cHV0RmxhZ3MuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViZDhmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb091dHB1dEZsYWdzLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb091dHB1dEZsYWdzIHsKKyAgICBESVJFQ1QgICAgICAgICAgID0gMCwKKyAgICBQUklNQVJZICAgICAgICAgID0gMSwKKyAgICBGQVNUICAgICAgICAgICAgID0gMiwKKyAgICBERUVQX0JVRkZFUiAgICAgID0gMywKKyAgICBDT01QUkVTU19PRkZMT0FEID0gNCwKKyAgICBOT05fQkxPQ0tJTkcgICAgID0gNSwKKyAgICBIV19BVl9TWU5DICAgICAgID0gNiwKKyAgICBUVFMgICAgICAgICAgICAgID0gNywKKyAgICBSQVcgICAgICAgICAgICAgID0gOCwKKyAgICBTWU5DICAgICAgICAgICAgID0gOSwKKyAgICBJRUM5NThfTk9OQVVESU8gID0gMTAsCisgICAgRElSRUNUX1BDTSAgICAgICA9IDExLAorICAgIE1NQVBfTk9JUlEgICAgICAgPSAxMiwKKyAgICBWT0lQX1JYICAgICAgICAgID0gMTMsCisgICAgSU5DQUxMX01VU0lDICAgICA9IDE0LAorICAgIEdBUExFU1NfT0ZGTE9BRCAgPSAxNSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BhdGNoLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QYXRjaC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTlmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QYXRjaC5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydENvbmZpZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9QYXRjaCB7CisgICAgLyoqCisgICAgICogUGF0Y2ggdW5pcXVlIElELgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX3BhdGNoX2hhbmRsZV90LgorICAgICAqLworICAgIGludCBpZDsKKyAgICBBdWRpb1BvcnRDb25maWdbXSBzb3VyY2VzOworICAgIEF1ZGlvUG9ydENvbmZpZ1tdIHNpbmtzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUGxheWJhY2tSYXRlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9QbGF5YmFja1JhdGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjlkMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUGxheWJhY2tSYXRlLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBUaGUgQXVkaW9QbGF5YmFja1JhdGUuCisgKgorICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zLgorICogVE9ETyhiLzE3NTE2NjgxNSk6IFJlY29uY2lsZSB3aXRoIGZyYW1ld29yay1tZWRpYS1zb3VyY2VzIFBsYXliYWNrUGFyYW1zLmFpZGwuCisgKiAgICAgICBBcyB0aGlzIGlzIHVzZWQgZm9yIG5hdGl2ZSB3aXJlIHNlcmlhbGl6YXRpb24sIG5vIG5lZWQgdG8gZGVmaW5lCisgKiAgICAgICBhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdCBhbmQgYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90IGVudW1zCisgKiAgICAgICB1bnRpbCB3ZSBhdHRlbXB0IHRvIHVuaWZ5IHdpdGggUGxheWJhY2tQYXJhbXMuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUGxheWJhY2tSYXRlIHsKKyAgICAvKiogU3BlZWQgb2YgYXVkaW8gcGxheWJhY2ssID49IDAuZiwgMS5mIG5vbWluYWwgKHN5c3RlbSBsaW1pdHMgYXJlIGZ1cnRoZXIgcmVzdHJpY3RpdmUpICovCisgICAgZmxvYXQgc3BlZWQ7CisgICAgLyoqIFBpdGNoIG9mIGF1ZGlvLCA+PSAwLmYsIDEuZiBub21pbmFsIChzeXN0ZW0gbGltaXRzIGFyZSBmdXJ0aGVyIHJlc3RyaWN0aXZlKSAqLworICAgIGZsb2F0IHBpdGNoOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdCAqLworICAgIGludCBzdHJldGNoTW9kZTsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90ICovCisgICAgaW50IGZhbGxiYWNrTW9kZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvbGljeURldmljZVN0YXRlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDcyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZS5haWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSB7CisgICAgVU5BVkFJTEFCTEUgPSAwLAorICAgIEFWQUlMQUJMRSA9IDEsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZVVzZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VVc2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmIwNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VVc2UuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvUG9saWN5Rm9yY2VVc2UgeworICAgIENPTU1VTklDQVRJT04gPSAwLAorICAgIE1FRElBID0gMSwKKyAgICBSRUNPUkQgPSAyLAorICAgIERPQ0sgPSAzLAorICAgIFNZU1RFTSA9IDQsCisgICAgSERNSV9TWVNURU1fQVVESU8gPSA1LAorICAgIEVOQ09ERURfU1VSUk9VTkQgPSA2LAorICAgIFZJQlJBVEVfUklOR0lORyA9IDcsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvbGljeUZvcmNlZENvbmZpZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTVkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIHsKKyAgICBOT05FID0gMCwKKyAgICBTUEVBS0VSID0gMSwKKyAgICBIRUFEUEhPTkVTID0gMiwKKyAgICBCVF9TQ08gPSAzLAorICAgIEJUX0EyRFAgPSA0LAorICAgIFdJUkVEX0FDQ0VTU09SWSA9IDUsCisgICAgQlRfQ0FSX0RPQ0sgPSA2LAorICAgIEJUX0RFU0tfRE9DSyA9IDcsCisgICAgQU5BTE9HX0RPQ0sgPSA4LAorICAgIERJR0lUQUxfRE9DSyA9IDksCisgICAgTk9fQlRfQTJEUCA9IDEwLCAvKiBBMkRQIHNpbmsgaXMgbm90IHByZWZlcnJlZCB0byBzcGVha2VyIG9yIHdpcmVkIEhTICovCisgICAgU1lTVEVNX0VORk9SQ0VEID0gMTEsCisgICAgSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQgPSAxMiwKKyAgICBFTkNPREVEX1NVUlJPVU5EX05FVkVSID0gMTMsCisgICAgRU5DT0RFRF9TVVJST1VORF9BTFdBWVMgPSAxNCwKKyAgICBFTkNPREVEX1NVUlJPVU5EX01BTlVBTCA9IDE1LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGU1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0LmFpZGwKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9HYWluOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0RXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1Byb2ZpbGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5FeHRyYUF1ZGlvRGVzY3JpcHRvcjsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0IHsKKyAgICAvKiogUG9ydCB1bmlxdWUgSUQuIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCisgICAgaW50IGlkOworICAgIC8qKiBTaW5rIG9yIHNvdXJjZS4gKi8KKyAgICBBdWRpb1BvcnRSb2xlIHJvbGU7CisgICAgLyoqIERldmljZSwgbWl4IC4uLiAqLworICAgIEF1ZGlvUG9ydFR5cGUgdHlwZTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBuYW1lOworICAgIC8qKiBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKS4gKi8KKyAgICBBdWRpb1Byb2ZpbGVbXSBwcm9maWxlczsKKyAgICAvKioKKyAgICAgKiBFeHRyYUF1ZGlvRGVzY3JpcHRvcnMgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydC4gVGhlIGZvcm1hdCBpcyBub3QgdW5yZWNvZ25pemVkIHRvIHRoZQorICAgICAqIHBsYXRmb3JtLiBUaGUgYXVkaW8gY2FwYWJpbGl0eSBpcyBkZXNjcmliZWQgYnkgYSBoYXJkd2FyZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIEV4dHJhQXVkaW9EZXNjcmlwdG9yW10gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIC8qKiBHYWluIGNvbnRyb2xsZXJzLiAqLworICAgIEF1ZGlvR2FpbltdIGdhaW5zOworICAgIC8qKiBDdXJyZW50IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4gKi8KKyAgICBBdWRpb1BvcnRDb25maWcgYWN0aXZlQ29uZmlnOworICAgIEF1ZGlvUG9ydEV4dCBleHQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkMzBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWcuYWlkbApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0dhaW5Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0lvRmxhZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdFeHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Um9sZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9ydFR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydENvbmZpZyB7CisgICAgLyoqCisgICAgICogUG9ydCB1bmlxdWUgSUQuCisgICAgICogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4KKyAgICAgKi8KKyAgICBpbnQgaWQ7CisgICAgLyoqIFNpbmsgb3Igc291cmNlLiAqLworICAgIEF1ZGlvUG9ydFJvbGUgcm9sZTsKKyAgICAvKiogRGV2aWNlLCBtaXggLi4uICovCisgICAgQXVkaW9Qb3J0VHlwZSB0eXBlOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvUG9ydENvbmZpZ1R5cGUuICovCisgICAgaW50IGNvbmZpZ01hc2s7CisgICAgLyoqIFNhbXBsaW5nIHJhdGUgaW4gSHouICovCisgICAgaW50IHNhbXBsZVJhdGU7CisgICAgLyoqCisgICAgICogQ2hhbm5lbCBtYXNrLCBpZiBhcHBsaWNhYmxlLgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LgorICAgICAqIFRPRE86IGJpdG1hc2s/CisgICAgICovCisgICAgaW50IGNoYW5uZWxNYXNrOworICAgIC8qKgorICAgICAqIEZvcm1hdCwgaWYgYXBwbGljYWJsZS4KKyAgICAgKi8KKyAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7CisgICAgLyoqIEdhaW4gdG8gYXBwbHksIGlmIGFwcGxpY2FibGUuICovCisgICAgQXVkaW9HYWluQ29uZmlnIGdhaW47CisgICAgLyoqIEZyYW1ld29yayBvbmx5OiBIV19BVl9TWU5DLCBESVJFQ1QsIC4uLiAqLworICAgIEF1ZGlvSW9GbGFncyBmbGFnczsKKyAgICBBdWRpb1BvcnRDb25maWdFeHQgZXh0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWFhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0LmFpZGwKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0IHsKKyAgICAvKioKKyAgICAgKiBNb2R1bGUgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0by4KKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19tb2R1bGVfaGFuZGxlX3QuCisgICAgICovCisgICAgaW50IGh3TW9kdWxlOworICAgIC8qKgorICAgICAqIERldmljZSB0eXBlIChlLmcgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKS4KKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19kZXZpY2VzX3QuCisgICAgICogVE9ETzogQ29udmVydCB0byBhIHN0YW5kYWxvbmUgQUlETCByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgdHlwZTsKKyAgICAvKiogRGV2aWNlIGFkZHJlc3MuICIiIGlmIE4vQS4gKi8KKyAgICBAdXRmOEluQ3BwIFN0cmluZyBhZGRyZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ0V4dC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjM1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnRXh0LmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnTWl4RXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIEF1ZGlvUG9ydENvbmZpZ0V4dCB7CisgICAgLyoqCisgICAgICogVGhpcyByZXByZXNlbnRzIGFuIGVtcHR5IHVuaW9uLiBWYWx1ZSBpcyBpZ25vcmVkLgorICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcworICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7CisgICAgLyoqIERldmljZSBzcGVjaWZpYyBpbmZvLiAqLworICAgIEF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dCBkZXZpY2U7CisgICAgLyoqIE1peCBzcGVjaWZpYyBpbmZvLiAqLworICAgIEF1ZGlvUG9ydENvbmZpZ01peEV4dCBtaXg7CisgICAgLyoqIFNlc3Npb24gc3BlY2lmaWMgaW5mby4gKi8KKyAgICBBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0IHNlc3Npb247Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyMjZmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHQuYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRDb25maWdNaXhFeHQgeworICAgIC8qKgorICAgICAqIE1vZHVsZSB0aGUgc3RyZWFtIGlzIGF0dGFjaGVkIHRvLgorICAgICAqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KKyAgICAgKi8KKyAgICBpbnQgaHdNb2R1bGU7CisgICAgLyoqCisgICAgICogSS9PIGhhbmRsZSBvZiB0aGUgaW5wdXQvb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4KKyAgICAgKi8KKyAgICBpbnQgaGFuZGxlOworICAgIEF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UgdXNlY2FzZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdNaXhFeHRVc2VDYXNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWYwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnTWl4RXh0VXNlQ2FzZS5haWRsCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU291cmNlVHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIEF1ZGlvUG9ydENvbmZpZ01peEV4dFVzZUNhc2UgeworICAgIC8qKgorICAgICAqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6Ok5PTkUgcm9sZS4KKyAgICAgKiBUaGlzIHJlcHJlc2VudHMgYW4gZW1wdHkgdmFsdWUgKHZhbHVlIGlzIGlnbm9yZWQpLgorICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugd2l0aCB0aGUgY2Fub25pY2FsIHJlcHJlc2VudGF0aW9uIGZvciBhbiBlbXB0eSB1bmlvbiwgYXMgc29vbiBhcyBpdCBpcworICAgICAqICAgICAgICAgICAgIGVzdGFibGlzaGVkLgorICAgICAqLworICAgIGJvb2xlYW4gdW5zcGVjaWZpZWQ7CisgICAgLyoqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6OlNPVVJDRSByb2xlLiAqLworICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW07CisgICAgLyoqIFRoaXMgdG8gYmUgc2V0IGlmIHRoZSBjb250YWluaW5nIGNvbmZpZyBoYXMgdGhlIEF1ZGlvUG9ydFJvbGU6OlNJTksgcm9sZS4gKi8KKyAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjYmY2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0LmFpZGwKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Qb3J0Q29uZmlnU2Vzc2lvbkV4dCB7CisgICAgaW50IHNlc3Npb247Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIyYjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydENvbmZpZ1R5cGUuYWlkbApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvUG9ydENvbmZpZ1R5cGUgeworICAgIFNBTVBMRV9SQVRFICA9IDAsCisgICAgQ0hBTk5FTF9NQVNLID0gMSwKKyAgICBGT1JNQVQgICAgICAgPSAyLAorICAgIEdBSU4gICAgICAgICA9IDMsCisgICAgRkxBR1MgICAgICAgID0gNCwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnREZXZpY2VFeHQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU4ZjIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydERldmljZUV4dC5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnREZXZpY2VFeHQgeworICAgIC8qKiBNb2R1bGUgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0by4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLworICAgIGludCBod01vZHVsZTsKKyAgICBBdWRpb0RldmljZSBkZXZpY2U7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9FbmNhcHN1bGF0aW9uTW9kZS4gKi8KKyAgICBpbnQgZW5jYXBzdWxhdGlvbk1vZGVzOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS4gKi8KKyAgICBpbnQgZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RXh0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNzg0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnREZXZpY2VFeHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRNaXhFeHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRTZXNzaW9uRXh0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gQXVkaW9Qb3J0RXh0IHsKKyAgICAvKioKKyAgICAgKiBUaGlzIHJlcHJlc2VudHMgYW4gZW1wdHkgdW5pb24uIFZhbHVlIGlzIGlnbm9yZWQuCisgICAgICogVE9ETyh5dGFpKTogcmVwbGFjZSB3aXRoIHRoZSBjYW5vbmljYWwgcmVwcmVzZW50YXRpb24gZm9yIGFuIGVtcHR5IHVuaW9uLCBhcyBzb29uIGFzIGl0IGlzCisgICAgICogICAgICAgICAgICAgZXN0YWJsaXNoZWQuCisgICAgICovCisgICAgYm9vbGVhbiB1bnNwZWNpZmllZDsKKyAgICAvKiogRGV2aWNlIHNwZWNpZmljIGluZm8uICovCisgICAgQXVkaW9Qb3J0RGV2aWNlRXh0IGRldmljZTsKKyAgICAvKiogTWl4IHNwZWNpZmljIGluZm8uICovCisgICAgQXVkaW9Qb3J0TWl4RXh0IG1peDsKKyAgICAvKiogU2Vzc2lvbiBzcGVjaWZpYyBpbmZvLiAqLworICAgIEF1ZGlvUG9ydFNlc3Npb25FeHQgc2Vzc2lvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRNaXhFeHQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNkYjhlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5haWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWl4TGF0ZW5jeUNsYXNzOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1BvcnRNaXhFeHQgeworICAgIC8qKiBNb2R1bGUgdGhlIHN0cmVhbSBpcyBhdHRhY2hlZCB0by4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLworICAgIGludCBod01vZHVsZTsKKyAgICAvKiogSS9PIGhhbmRsZSBvZiB0aGUgaW5wdXQvb3V0cHV0IHN0cmVhbS4gSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCisgICAgaW50IGhhbmRsZTsKKyAgICAvKiogTGF0ZW5jeSBjbGFzcyAqLworICAgIEF1ZGlvTWl4TGF0ZW5jeUNsYXNzIGxhdGVuY3lDbGFzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRSb2xlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Um9sZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmVmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Um9sZS5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Qb3J0Um9sZSB7CisgICAgTk9ORSA9IDAsCisgICAgU09VUkNFID0gMSwKKyAgICBTSU5LID0gMiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRTZXNzaW9uRXh0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2ExNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5haWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUG9ydFNlc3Npb25FeHQgeworICAgIC8qKiBBdWRpbyBzZXNzaW9uLiBJbnRlcnByZXRlZCBhcyBhdWRpb19zZXNzaW9uX3QuICovCisgICAgaW50IHNlc3Npb247Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0VHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFR5cGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZhZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUG9ydFR5cGUuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvUG9ydFR5cGUgeworICAgIE5PTkUgPSAwLAorICAgIERFVklDRSA9IDEsCisgICAgTUlYID0gMiwKKyAgICBTRVNTSU9OID0gMywKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjNGE0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0V4OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1Byb2R1Y3RTdHJhdGVneSB7CisgICAgLyoqIEludGVycHJldGVkIGFzIHByb2R1Y3Rfc3RyYXRlZ3lfdC4gKi8KKyAgICBpbnQgaWQ7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKKyAgICBBdWRpb0F0dHJpYnV0ZXNFeFtdIGF1ZGlvQXR0cmlidXRlczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIyODhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvUHJvZmlsZS5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRW5jYXBzdWxhdGlvblR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIEF1ZGlvUHJvZmlsZSB7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKKyAgICAvKiogVGhlIGZvcm1hdCBmb3IgYW4gYXVkaW8gcHJvZmlsZSBzaG91bGQgb25seSBiZSBzZXQgd2hlbiBpbml0aWFsaXplZC4gKi8KKyAgICBBdWRpb0Zvcm1hdCBmb3JtYXQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2NoYW5uZWxfbWFza190LiAqLworICAgIGludFtdIGNoYW5uZWxNYXNrczsKKyAgICBpbnRbXSBzYW1wbGluZ1JhdGVzOworICAgIGJvb2xlYW4gaXNEeW5hbWljRm9ybWF0OworICAgIGJvb2xlYW4gaXNEeW5hbWljQ2hhbm5lbHM7CisgICAgYm9vbGVhbiBpc0R5bmFtaWNSYXRlOworICAgIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgZW5jYXBzdWxhdGlvblR5cGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Tb3VyY2VUeXBlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Tb3VyY2VUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3M2I5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1NvdXJjZVR5cGUuYWlkbApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvU291cmNlVHlwZSB7CisgICAgSU5WQUxJRCA9IC0xLAorICAgIERFRkFVTFQgPSAwLAorICAgIE1JQyA9IDEsCisgICAgVk9JQ0VfVVBMSU5LID0gMiwKKyAgICBWT0lDRV9ET1dOTElOSyA9IDMsCisgICAgVk9JQ0VfQ0FMTCA9IDQsCisgICAgQ0FNQ09SREVSID0gNSwKKyAgICBWT0lDRV9SRUNPR05JVElPTiA9IDYsCisgICAgVk9JQ0VfQ09NTVVOSUNBVElPTiA9IDcsCisgICAgUkVNT1RFX1NVQk1JWCA9IDgsCisgICAgVU5QUk9DRVNTRUQgPSA5LAorICAgIFZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCisgICAgRUNIT19SRUZFUkVOQ0UgPSAxOTk3LAorICAgIEZNX1RVTkVSID0gMTk5OCwKKyAgICAvKioKKyAgICAgKiBBIGxvdy1wcmlvcml0eSwgcHJlZW1wdGlibGUgYXVkaW8gc291cmNlIGZvciBmb3IgYmFja2dyb3VuZCBzb2Z0d2FyZQorICAgICAqIGhvdHdvcmQgZGV0ZWN0aW9uLiBTYW1lIHR1bmluZyBhcyBWT0lDRV9SRUNPR05JVElPTi4KKyAgICAgKiBVc2VkIG9ubHkgaW50ZXJuYWxseSBieSB0aGUgZnJhbWV3b3JrLgorICAgICAqLworICAgIEhPVFdPUkQgPSAxOTk5LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RhbmRhcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMWQwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1N0YW5kYXJkLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogVGhlIGF1ZGlvIHN0YW5kYXJkIHRoYXQgZGVzY3JpYmUgYXVkaW8gcGxheWJhY2svY2FwdHVyZSBjYXBhYmlsaXRlcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIEF1ZGlvU3RhbmRhcmQgeworICAgIE5PTkUgPSAwLAorICAgIEVESUQgPSAxLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvU3RyZWFtVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Nzc4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9TdHJlYW1UeXBlLmFpZGwKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBBdWRpb1N0cmVhbVR5cGUgeworICAgIERFRkFVTFQgPSAtMSwKKyAgICBWT0lDRV9DQUxMID0gMCwKKyAgICBTWVNURU0gPSAxLAorICAgIFJJTkcgPSAyLAorICAgIE1VU0lDID0gMywKKyAgICBBTEFSTSA9IDQsCisgICAgTk9USUZJQ0FUSU9OID0gNSwKKyAgICBCTFVFVE9PVEhfU0NPID0gNiwKKyAgICBFTkZPUkNFRF9BVURJQkxFID0gNywKKyAgICBEVE1GID0gOCwKKyAgICBUVFMgPSA5LAorICAgIEFDQ0VTU0lCSUxJVFkgPSAxMCwKKyAgICBBU1NJU1RBTlQgPSAxMSwKKyAgICAvKiogRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcy4gT25seSB1c2VkIGJ5IHRoZSBhdWRpbyBwb2xpY3kgKi8KKyAgICBSRVJPVVRJTkcgPSAxMiwKKyAgICAvKiogRm9yIGF1ZGlvIGZsaW5nZXIgdHJhY2tzIHZvbHVtZS4gT25seSB1c2VkIGJ5IHRoZSBhdWRpb2ZsaW5nZXIgKi8KKyAgICBQQVRDSCA9IDEzLAorICAgIC8qKiBzdHJlYW0gZm9yIGNvcnJlc3BvbmRpbmcgdG8gQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQgKi8KKyAgICBDQUxMX0FTU0lTVEFOVCA9IDE0LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiZmI1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBUaGUgIkludGVybmFsIiB0aW1lc3RhbXAgaXMgaW50ZW5kZWQgdG8gZGlzYW1iaWd1YXRlIGZyb20gdGhlIGFuZHJvaWQubWVkaWEuQXVkaW9UaW1lc3RhbXAgdHlwZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9UaW1lc3RhbXBJbnRlcm5hbCB7CisgICAgLyoqIEEgZnJhbWUgcG9zaXRpb24gaW4gQXVkaW9UcmFjazo6Z2V0UG9zaXRpb24oKSB1bml0cy4gKi8KKyAgICBpbnQgcG9zaXRpb247CisgICAgLyoqIGNvcnJlc3BvbmRpbmcgQ0xPQ0tfTU9OT1RPTklDIHdoZW4gZnJhbWUgaXMgZXhwZWN0ZWQgdG8gcHJlc2VudC4gKi8KKyAgICBsb25nIHNlYzsKKyAgICBpbnQgbnNlYzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VbmlxdWVJZFVzZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjZkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9VbmlxdWVJZFVzZS5haWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9VbmlxdWVJZFVzZSB7CisgICAgVU5TUEVDSUZJRUQgPSAwLAorICAgIFNFU1NJT04gPSAxLCAvLyBhdWRpb19zZXNzaW9uX3QKKyAgICAgICAgICAgICAgICAgLy8gZm9yIGFsbG9jYXRlZCBzZXNzaW9ucywgbm90IHNwZWNpYWwgQVVESU9fU0VTU0lPTl8qCisgICAgTU9EVUxFID0gMiwgIC8vIGF1ZGlvX21vZHVsZV9oYW5kbGVfdAorICAgIEVGRkVDVCA9IDMsICAvLyBhdWRpb19lZmZlY3RfaGFuZGxlX3QKKyAgICBQQVRDSCA9IDQsICAgLy8gYXVkaW9fcGF0Y2hfaGFuZGxlX3QKKyAgICBPVVRQVVQgPSA1LCAgLy8gYXVkaW9faW9faGFuZGxlX3QKKyAgICBJTlBVVCA9IDYsICAgLy8gYXVkaW9faW9faGFuZGxlX3QKKyAgICBDTElFTlQgPSA3LCAgLy8gY2xpZW50LXNpZGUgcGxheWVycyBhbmQgcmVjb3JkZXJzCisgICAgICAgICAgICAgICAgIC8vIEZJWE1FIHNob3VsZCBtb3ZlIHRvIGEgc2VwYXJhdGUgbmFtZXNwYWNlOworICAgICAgICAgICAgICAgICAvLyB0aGVzZSBJRHMgYXJlIGFsbG9jYXRlZCBieSBBdWRpb0ZsaW5nZXIgb24gY2xpZW50IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgIC8vIGJ1dCBhcmUgbmV2ZXIgdXNlZCBieSBBdWRpb0ZsaW5nZXIKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1VzYWdlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Vc2FnZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Vc2FnZS5haWRsCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gQXVkaW9Vc2FnZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgTUVESUEgPSAxLAorICAgIFZPSUNFX0NPTU1VTklDQVRJT04gPSAyLAorICAgIFZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyA9IDMsCisgICAgQUxBUk0gPSA0LAorICAgIE5PVElGSUNBVElPTiA9IDUsCisgICAgTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSA9IDYsCisgICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCA9IDcsCisgICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCA9IDgsCisgICAgTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCA9IDksCisgICAgTk9USUZJQ0FUSU9OX0VWRU5UID0gMTAsCisgICAgQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZID0gMTEsCisgICAgQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFID0gMTIsCisgICAgQVNTSVNUQU5DRV9TT05JRklDQVRJT04gPSAxMywKKyAgICBHQU1FID0gMTQsCisgICAgVklSVFVBTF9TT1VSQ0UgPSAxNSwKKyAgICBBU1NJU1RBTlQgPSAxNiwKKyAgICBDQUxMX0FTU0lTVEFOVCA9IDE3LAorICAgIEVNRVJHRU5DWSA9IDEwMDAsCisgICAgU0FGRVRZID0gMTAwMSwKKyAgICBWRUhJQ0xFX1NUQVRVUyA9IDEwMDIsCisgICAgQU5OT1VOQ0VNRU5UID0gMTAwMywKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1V1aWQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE5MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVXVpZC5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBBdWRpb1V1aWQgeworICAgIGludCB0aW1lTG93OworICAgIGludCB0aW1lTWlkOworICAgIGludCB0aW1lSGlBbmRWZXJzaW9uOworICAgIGludCBjbG9ja1NlcTsKKyAgICBieXRlW10gbm9kZTsgIC8vIExlbmd0aCA9IDYKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVmlicmF0b3JJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4ZmMzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9BdWRpb1ZpYnJhdG9ySW5mby5haWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICogQSBjbGFzcyBmb3IgdmlicmF0b3IgaW5mb3JtYXRpb24uIFRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgaW4gSGFwdGljR2VuZXJhdG9yIGVmZmVjdC4KKyAqLworcGFyY2VsYWJsZSBBdWRpb1ZpYnJhdG9ySW5mbyB7CisgICAgaW50IGlkOworICAgIGZsb2F0IHJlc29uYW50RnJlcXVlbmN5OworICAgIGZsb2F0IHFGYWN0b3I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI5YTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvU3RyZWFtVHlwZTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQXVkaW9Wb2x1bWVHcm91cCB7CisgICAgLyoqIEludGVycHJldGVkIGFzIHZvbHVtZV9ncm91cF90LiAqLworICAgIGludCBncm91cElkOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIG5hbWU7CisgICAgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxbXSBhdWRpb0F0dHJpYnV0ZXM7CisgICAgQXVkaW9TdHJlYW1UeXBlW10gc3RyZWFtczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVFZmZlY3RSZXF1ZXN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjc0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklFZmZlY3RDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKKy8qKgorICogSW5wdXQgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVFZmZlY3QoKSBtZXRob2QuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIENyZWF0ZUVmZmVjdFJlcXVlc3QgeworICAgIEVmZmVjdERlc2NyaXB0b3IgZGVzYzsKKyAgICBAbnVsbGFibGUgSUVmZmVjdENsaWVudCBjbGllbnQ7CisgICAgaW50IHByaW9yaXR5OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgb3V0cHV0OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19zZXNzaW9uX3QuICovCisgICAgaW50IHNlc3Npb25JZDsKKyAgICBBdWRpb0RldmljZSBkZXZpY2U7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBib29sZWFuIHByb2JlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvQ3JlYXRlRWZmZWN0UmVzcG9uc2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE2NDBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmFpZGwKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklFZmZlY3Q7CisKKy8qKgorICogT3V0cHV0IGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlRWZmZWN0KCkgbWV0aG9kLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVFZmZlY3RSZXNwb25zZSB7CisgICAgaW50IGlkOworICAgIGJvb2xlYW4gZW5hYmxlZDsKKyAgICBAbnVsbGFibGUgSUVmZmVjdCBlZmZlY3Q7CisgICAgRWZmZWN0RGVzY3JpcHRvciBkZXNjOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzYzI0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnQmFzZTsKKworLyoqCisgKiBDcmVhdGVSZWNvcmRSZXF1ZXN0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKKyAqIHdoZW4gY2FsbGluZyBjcmVhdGVSZWNvcmQoKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IEF1ZGlvRmxpbmdlcgorICogYW5kIHJldHVybmVkIGluIENyZWF0ZVJlY29yZFJlc3BvbnNlIG9iamVjdC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgQ3JlYXRlUmVjb3JkUmVxdWVzdCB7CisgICAgQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cjsKKyAgICBBdWRpb0NvbmZpZ0Jhc2UgY29uZmlnOworICAgIEF1ZGlvQ2xpZW50IGNsaWVudEluZm87CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3VuaXF1ZV9pZF90LiAqLworICAgIGludCByaWlkOworICAgIGludCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNczsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb0lucHV0RmxhZ3MuICovCisgICAgaW50IGZsYWdzOworICAgIGxvbmcgZnJhbWVDb3VudDsKKyAgICBsb25nIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCisgICAgaW50IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgaW50IHNlc3Npb25JZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVJlY29yZFJlc3BvbnNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4YjNmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5haWRsCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CisKKy8qKgorICogQ3JlYXRlUmVjb3JkUmVzcG9uc2UgY29udGFpbnMgYWxsIG91dHB1dCBhcmd1bWVudHMgcmV0dXJuZWQgYnkgQXVkaW9GbGluZ2VyIHRvIEF1ZGlvUmVjb3JkCisgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CisgKiBDcmVhdGVSZWNvcmRSZXF1ZXN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVSZWNvcmRSZXNwb25zZSB7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9JbnB1dEZsYWdzLiAqLworICAgIGludCBmbGFnczsKKyAgICBsb25nIGZyYW1lQ291bnQ7CisgICAgbG9uZyBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBzZWxlY3RlZERldmljZUlkOworICAgIGludCBzZXNzaW9uSWQ7CisgICAgaW50IHNhbXBsZVJhdGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpbnB1dElkOworICAgIEBudWxsYWJsZSBTaGFyZWRGaWxlUmVnaW9uIGNibGs7CisgICAgQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gYnVmZmVyczsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgcG9ydElkOworICAgIC8qKiBUaGUgbmV3bHkgY3JlYXRlZCByZWNvcmQuICovCisgICAgQG51bGxhYmxlIElBdWRpb1JlY29yZCBhdWRpb1JlY29yZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1JlcXVlc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTRiM2NhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc0ludGVybmFsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9DbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5TaGFyZWRGaWxlUmVnaW9uOworCisvKioKKyAqIENyZWF0ZVRyYWNrSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvVHJhY2sgdG8gQXVkaW9GbGluZ2VyCisgKiB3aGVuIGNhbGxpbmcgY3JlYXRlVHJhY2soKSBpbmNsdWRpbmcgYXJndW1lbnRzIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGJ5IEF1ZGlvRmxpbmdlcgorICogYW5kIHJldHVybmVkIGluIENyZWF0ZVRyYWNrUmVzcG9uc2Ugb2JqZWN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVUcmFja1JlcXVlc3QgeworICAgIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHI7CisgICAgQXVkaW9Db25maWcgY29uZmlnOworICAgIEF1ZGlvQ2xpZW50IGNsaWVudEluZm87CisgICAgQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gc2hhcmVkQnVmZmVyOworICAgIGludCBub3RpZmljYXRpb25zUGVyQnVmZmVyOworICAgIGZsb2F0IHNwZWVkOworICAgIElBdWRpb1RyYWNrQ2FsbGJhY2sgYXVkaW9UcmFja0NhbGxiYWNrOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIG9wUGFja2FnZU5hbWU7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9PdXRwdXRGbGFncy4gKi8KKyAgICBpbnQgZmxhZ3M7CisgICAgbG9uZyBmcmFtZUNvdW50OworICAgIGxvbmcgbm90aWZpY2F0aW9uRnJhbWVDb3VudDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBpbnQgc2Vzc2lvbklkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0NyZWF0ZVRyYWNrUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NzNmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmFpZGwKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvVHJhY2s7CisKKy8qKgorICogQ3JlYXRlVHJhY2tPdXRwdXQgY29udGFpbnMgYWxsIG91dHB1dCBhcmd1bWVudHMgcmV0dXJuZWQgYnkgQXVkaW9GbGluZ2VyIHRvIEF1ZGlvVHJhY2sKKyAqIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFjaygpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCBhcyBJL08gZm9yIHVwZGF0ZSBieQorICogQ3JlYXRlVHJhY2tSZXF1ZXN0LgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBDcmVhdGVUcmFja1Jlc3BvbnNlIHsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzLiAqLworICAgIGludCBmbGFnczsKKyAgICBsb25nIGZyYW1lQ291bnQ7CisgICAgbG9uZyBub3RpZmljYXRpb25GcmFtZUNvdW50OworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBzZWxlY3RlZERldmljZUlkOworICAgIGludCBzZXNzaW9uSWQ7CisgICAgaW50IHNhbXBsZVJhdGU7CisgICAgQXVkaW9TdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgbG9uZyBhZkZyYW1lQ291bnQ7CisgICAgaW50IGFmU2FtcGxlUmF0ZTsKKyAgICBpbnQgYWZMYXRlbmN5TXM7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBvdXRwdXRJZDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgcG9ydElkOworICAgIC8qKiBUaGUgbmV3bHkgY3JlYXRlZCB0cmFjay4gKi8KKyAgICBAbnVsbGFibGUgSUF1ZGlvVHJhY2sgYXVkaW9UcmFjazsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9EZXZpY2VSb2xlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRGV2aWNlUm9sZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRGV2aWNlUm9sZS5haWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBEZXZpY2VSb2xlIHsKKyAgICAvKiogRGVmYXVsdCByb3V0aW5nIHJ1bGVzIGFuZCBwcmlvcml0eSBhcHBseS4gKi8KKyAgICBOT05FID0gMCwKKyAgICAvKiBEZXZpY2VzIGFyZSBzcGVjaWZpZWQgYXMgcHJlZmVycmVkIGRldmljZXMuICovCisgICAgUFJFRkVSUkVEID0gMSwKKyAgICAvKiBEZXZpY2VzIGNhbm5vdCBiZSB1c2VkLiAqLworICAgIERJU0FCTEVEID0gMiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTNkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRWZmZWN0RGVzY3JpcHRvci5haWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgRWZmZWN0RGVzY3JpcHRvciB7CisgICAgLyoqIFVVSUQgb2YgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QuICovCisgICAgQXVkaW9VdWlkIHR5cGU7CisgICAgLyoqIFVVSUQgZm9yIHRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4gKi8KKyAgICBBdWRpb1V1aWQgdXVpZDsKKyAgICAvKiogVmVyc2lvbiBvZiB0aGUgZWZmZWN0IGNvbnRyb2wgQVBJIGltcGxlbWVudGVkLiAqLworICAgIGludCBhcGlWZXJzaW9uOworICAgIC8qKiBFZmZlY3QgZW5naW5lIGNhcGFiaWxpdGllcy9yZXF1aXJlbWVudHMgZmxhZ3MuICovCisgICAgaW50IGZsYWdzOworICAgIC8qKiBDUFUgbG9hZCBpbmRpY2F0aW9uLi4gKi8KKyAgICBpbnQgY3B1TG9hZDsKKyAgICAvKiogRGF0YSBNZW1vcnkgdXNhZ2UuLiAqLworICAgIGludCBtZW1vcnlVc2FnZTsKKyAgICAvKiogSHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUuICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbmFtZTsKKyAgICAvKiogSHVtYW4gcmVhZGFibGUgZWZmZWN0IGltcGxlbWVudG9yIG5hbWUuICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgaW1wbGVtZW50b3I7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNWI2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvRXh0cmFBdWRpb0Rlc2NyaXB0b3IuYWlkbApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0VuY2Fwc3VsYXRpb25UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdGFuZGFyZDsKKworLyoqCisgKiBUaGUgYXVkaW8gZGVzY3JpcHRvciB0aGF0IGRlc2NpYmVzIHBsYXliYWNrL2NhcHR1cmUgY2FwYWJpbGl0aWVzIGFjY29yZGluZyB0bworICogYSBwYXJ0aWN1bGFyIHN0YW5kYXJkLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBFeHRyYUF1ZGlvRGVzY3JpcHRvciB7CisgICAgQXVkaW9TdGFuZGFyZCBzdGFuZGFyZDsKKyAgICBieXRlW10gYXVkaW9EZXNjcmlwdG9yOworICAgIEF1ZGlvRW5jYXBzdWxhdGlvblR5cGUgZW5jYXBzdWxhdGlvblR5cGU7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0SW5wdXRGb3JBdHRyUmVzcG9uc2UuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9HZXRJbnB1dEZvckF0dHJSZXNwb25zZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTYxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0SW5wdXRGb3JBdHRyUmVzcG9uc2UuYWlkbApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBHZXRJbnB1dEZvckF0dHJSZXNwb25zZSB7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpbnB1dDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fcG9ydF9oYW5kbGVfdC4gKi8KKyAgICBpbnQgcG9ydElkOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0dldE91dHB1dEZvckF0dHJSZXNwb25zZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NGZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBHZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgb3V0cHV0OworICAgIEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW07CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCisgICAgaW50IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3BvcnRfaGFuZGxlX3QuICovCisgICAgaW50IHBvcnRJZDsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3RbXS4gKi8KKyAgICBpbnRbXSBzZWNvbmRhcnlPdXRwdXRzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYzMxYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Jb0NvbmZpZ0V2ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Jb0Rlc2NyaXB0b3I7CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIEF1ZGlvRmxpbmdlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJQXVkaW9GbGluZ2VyQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoQXVkaW9Jb0NvbmZpZ0V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0lvRGVzY3JpcHRvciBpb0Rlc2MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvRmxpbmdlclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNhZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGF0Y2g7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1N0cmVhbVR5cGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1VuaXF1ZUlkVXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9VdWlkOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9WaWJyYXRvckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVFZmZlY3RSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlRWZmZWN0UmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVSZWNvcmRSZXF1ZXN0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQ3JlYXRlUmVjb3JkUmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVUcmFja1JlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5DcmVhdGVUcmFja1Jlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuT3BlbklucHV0UmVxdWVzdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk9wZW5JbnB1dFJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuT3Blbk91dHB1dFJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5PcGVuT3V0cHV0UmVzcG9uc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5FZmZlY3REZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1JlY29yZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklBdWRpb1RyYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWljcm9waG9uZUluZm9EYXRhOworaW1wb3J0IGFuZHJvaWQubWVkaWEuUmVuZGVyUG9zaXRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFja1NlY29uZGFyeU91dHB1dEluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5hdWRpby5jb21tb24uQXVkaW9Gb3JtYXQ7CisKKy8qKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUF1ZGlvRmxpbmdlclNlcnZpY2UgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYXVkaW8gdHJhY2sgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlciwgb3IgbnVsbCBpZiB0aGUgdHJhY2sgY2Fubm90IGJlCisgICAgICogY3JlYXRlZC4KKyAgICAgKi8KKyAgICBDcmVhdGVUcmFja1Jlc3BvbnNlIGNyZWF0ZVRyYWNrKGluIENyZWF0ZVRyYWNrUmVxdWVzdCByZXF1ZXN0KTsKKworICAgIENyZWF0ZVJlY29yZFJlc3BvbnNlIGNyZWF0ZVJlY29yZChpbiBDcmVhdGVSZWNvcmRSZXF1ZXN0IHJlcXVlc3QpOworCisgICAgLy8gRklYTUUgU3VycHJpc2luZ2x5LCBmb3JtYXQvbGF0ZW5jeSBkb24ndCB3b3JrIGZvciBpbnB1dCBoYW5kbGVzCisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIHRoZSBhdWRpbyBoYXJkd2FyZSBzdGF0ZS4gVGhpcyBzdGF0ZSBuZXZlciBjaGFuZ2VzLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSBjYWNoZWQuCisgICAgICovCisgICAgaW50IHNhbXBsZVJhdGUoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlKTsKKworICAgIEF1ZGlvRm9ybWF0IGZvcm1hdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKworICAgIGxvbmcgZnJhbWVDb3VudChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgaW50IGxhdGVuY3koaW50ICAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworCisgICAgLyoKKyAgICAgKiBTZXRzL2dldHMgdGhlIGF1ZGlvIGhhcmR3YXJlIHN0YXRlLiBUaGlzIHdpbGwgcHJvYmFibHkgYmUgdXNlZCBieQorICAgICAqIHRoZSBwcmVmZXJlbmNlIHBhbmVsLCBtb3N0bHkuCisgICAgICovCisgICAgdm9pZCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpOworICAgIHZvaWQgc2V0TWFzdGVyTXV0ZShib29sZWFuIG11dGVkKTsKKworICAgIGZsb2F0IG1hc3RlclZvbHVtZSgpOworICAgIGJvb2xlYW4gbWFzdGVyTXV0ZSgpOworCisgICAgdm9pZCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOworICAgIGZsb2F0IGdldE1hc3RlckJhbGFuY2UoKTsKKworICAgIC8qCisgICAgICogU2V0L2dldHMgc3RyZWFtIHR5cGUgc3RhdGUuIFRoaXMgd2lsbCBwcm9iYWJseSBiZSB1c2VkIGJ5CisgICAgICogdGhlIHByZWZlcmVuY2UgcGFuZWwsIG1vc3RseS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwgaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CisgICAgdm9pZCBzZXRTdHJlYW1NdXRlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGJvb2xlYW4gbXV0ZWQpOworICAgIGZsb2F0IHN0cmVhbVZvbHVtZShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICBib29sZWFuIHN0cmVhbU11dGUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSk7CisKKyAgICAvLyBzZXQgYXVkaW8gbW9kZS4KKyAgICB2b2lkIHNldE1vZGUoQXVkaW9Nb2RlIG1vZGUpOworCisgICAgLy8gbWljIG11dGUvc3RhdGUKKyAgICB2b2lkIHNldE1pY011dGUoYm9vbGVhbiBzdGF0ZSk7CisgICAgYm9vbGVhbiBnZXRNaWNNdXRlKCk7CisgICAgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZChpbnQgLyogYXVkaW9fcG9ydF9oYW5kbGVfdCAqLyBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNpbGVuY2VkKTsKKworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGtleVZhbHVlUGFpcnMpOworICAgIEB1dGY4SW5DcHAgU3RyaW5nIGdldFBhcmFtZXRlcnMoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcga2V5cyk7CisKKyAgICAvLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgorICAgIC8vIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBdWRpb0ZsaW5nZXIgZGlzcmVnYXJkcyBhbnkgcmVnaXN0cmF0aW9ucyBhZnRlciB0aGUgZmlyc3QuCisgICAgLy8gVGh1cyB0aGUgSUF1ZGlvRmxpbmdlckNsaWVudCBtdXN0IGJlIGEgc2luZ2xldG9uIHBlciBwcm9jZXNzLgorICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoSUF1ZGlvRmxpbmdlckNsaWVudCBjbGllbnQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGF1ZGlvIHJlY29yZGluZyBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAgICAvLyBGSVhNRSBUaGlzIEFQSSBhc3N1bWVzIGEgcm91dGUsIGFuZCBzbyBzaG91bGQgYmUgZGVwcmVjYXRlZC4KKyAgICBsb25nIGdldElucHV0QnVmZmVyU2l6ZShpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2NoYW5uZWxfbWFza190ICovIGNoYW5uZWxNYXNrKTsKKworICAgIE9wZW5PdXRwdXRSZXNwb25zZSBvcGVuT3V0cHV0KGluIE9wZW5PdXRwdXRSZXF1ZXN0IHJlcXVlc3QpOworICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvcGVuRHVwbGljYXRlT3V0cHV0KGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQyKTsKKyAgICB2b2lkIGNsb3NlT3V0cHV0KGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworICAgIHZvaWQgc3VzcGVuZE91dHB1dChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gb3V0cHV0KTsKKyAgICB2b2lkIHJlc3RvcmVPdXRwdXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIG91dHB1dCk7CisKKyAgICBPcGVuSW5wdXRSZXNwb25zZSBvcGVuSW5wdXQoaW4gT3BlbklucHV0UmVxdWVzdCByZXF1ZXN0KTsKKyAgICB2b2lkIGNsb3NlSW5wdXQoaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlucHV0KTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKTsKKworICAgIHZvaWQgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIFJlbmRlclBvc2l0aW9uIGdldFJlbmRlclBvc2l0aW9uKGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBvdXRwdXQpOworCisgICAgaW50IGdldElucHV0RnJhbWVzTG9zdChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgaW50IC8qIGF1ZGlvX3VuaXF1ZV9pZF90ICovIG5ld0F1ZGlvVW5pcXVlSWQoQXVkaW9VbmlxdWVJZFVzZSB1c2UpOworCisgICAgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoaW50IC8qIGF1ZGlvX3Nlc3Npb25fdCAqLyBhdWRpb1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBpZF90ICovIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogdWlkX3QgKi8gdWlkKTsKKyAgICB2b2lkIHJlbGVhc2VBdWRpb1Nlc3Npb25JZChpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGlkX3QgKi8gcGlkKTsKKworICAgIGludCBxdWVyeU51bWJlckVmZmVjdHMoKTsKKworICAgIEVmZmVjdERlc2NyaXB0b3IgcXVlcnlFZmZlY3QoaW50IGluZGV4KTsKKworICAgIC8qKiBwcmVmZXJyZWRUeXBlRmxhZyBpcyBpbnRlcnByZXRlZCBhcyBhIHVpbnQzMl90IHdpdGggdGhlICJlZmZlY3QgZmxhZyIgZm9ybWF0LiAqLworICAgIEVmZmVjdERlc2NyaXB0b3IgZ2V0RWZmZWN0RGVzY3JpcHRvcihpbiBBdWRpb1V1aWQgZWZmZWN0VVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9VdWlkIHR5cGVVVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZmVycmVkVHlwZUZsYWcpOworCisgICAgQ3JlYXRlRWZmZWN0UmVzcG9uc2UgY3JlYXRlRWZmZWN0KGluIENyZWF0ZUVmZmVjdFJlcXVlc3QgcmVxdWVzdCk7CisKKyAgICB2b2lkIG1vdmVFZmZlY3RzKGludCAvKiBhdWRpb19zZXNzaW9uX3QgKi8gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gZHN0T3V0cHV0KTsKKworICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN1c3BlbmRlZCk7CisKKyAgICBpbnQgLyogYXVkaW9fbW9kdWxlX2hhbmRsZV90ICovIGxvYWRId01vZHVsZShAdXRmOEluQ3BwIFN0cmluZyBuYW1lKTsKKworICAgIC8vIGhlbHBlcnMgZm9yIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLmdldFByb3BlcnR5KCksIHNlZSBkZXNjcmlwdGlvbiB0aGVyZSBmb3IgbWVhbmluZworICAgIC8vIEZJWE1FIG1vdmUgdGhlc2UgQVBJcyB0byBBdWRpb1BvbGljeSB0byBwZXJtaXQgYSBtb3JlIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uCisgICAgLy8gdGhhdCBsb29rcyBvbiBwcmltYXJ5IGRldmljZSBmb3IgYSBzdHJlYW0gd2l0aCBmYXN0IGZsYWcsIHByaW1hcnkgZmxhZywgb3IgZmlyc3Qgb25lLgorICAgIGludCBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgbG9uZyBnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudCgpOworCisgICAgLy8gSW50ZW5kZWQgZm9yIEF1ZGlvU2VydmljZSB0byBpbmZvcm0gQXVkaW9GbGluZ2VyIG9mIGRldmljZSdzIGxvdyBSQU0gYXR0cmlidXRlLAorICAgIC8vIGFuZCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZS4gIEZvciBhIGRlZmluaXRpb24gb2Ygd2hhdCAibG93IFJBTSIgbWVhbnMsIHNlZQorICAgIC8vIGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlci5pc0xvd1JhbURldmljZSgpLiAgVGhlIHRvdGFsTWVtb3J5IHBhcmFtZXRlcgorICAgIC8vIGlzIG9idGFpbmVkIGZyb20gYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyLk1lbW9yeUluZm8udG90YWxNZW0uCisgICAgdm9pZCBzZXRMb3dSYW1EZXZpY2UoYm9vbGVhbiBpc0xvd1JhbURldmljZSwgbG9uZyB0b3RhbE1lbW9yeSk7CisKKyAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCisgICAgQXVkaW9Qb3J0IGdldEF1ZGlvUG9ydChpbiBBdWRpb1BvcnQgcG9ydCk7CisKKyAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLworICAgIGludCAvKiBhdWRpb19wYXRjaF9oYW5kbGVfdCAqLyBjcmVhdGVBdWRpb1BhdGNoKGluIEF1ZGlvUGF0Y2ggcGF0Y2gpOworCisgICAgLyogUmVsZWFzZSBhbiBhdWRpbyBwYXRjaCAqLworICAgIHZvaWQgcmVsZWFzZUF1ZGlvUGF0Y2goaW50IC8qIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICovIGhhbmRsZSk7CisKKyAgICAvKiBMaXN0IGV4aXN0aW5nIGF1ZGlvIHBhdGNoZXMgKi8KKyAgICBBdWRpb1BhdGNoW10gbGlzdEF1ZGlvUGF0Y2hlcyhpbnQgbWF4Q291bnQpOworICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyAgICB2b2lkIHNldEF1ZGlvUG9ydENvbmZpZyhpbiBBdWRpb1BvcnRDb25maWcgY29uZmlnKTsKKworICAgIC8qIEdldCB0aGUgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSB1c2VkIGZvciBhbiBhdWRpbyBzZXNzaW9uICovCisgICAgaW50IC8qIGF1ZGlvX2h3X3N5bmNfdCAqLyBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oaW50IC8qIGF1ZGlvX3Nlc3Npb25fdCAqLyBzZXNzaW9uSWQpOworCisgICAgLyogSW5kaWNhdGUgSkFWQSBzZXJ2aWNlcyBhcmUgcmVhZHkgKHNjaGVkdWxpbmcsIHBvd2VyIG1hbmFnZW1lbnQgLi4uKSAqLworICAgIG9uZXdheSB2b2lkIHN5c3RlbVJlYWR5KCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBhdWRpbyBIQUwgYnVmZmVyLgorICAgIGxvbmcgZnJhbWVDb3VudEhBTChpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW9IYW5kbGUpOworCisgICAgLyogTGlzdCBhdmFpbGFibGUgbWljcm9waG9uZXMgYW5kIHRoZWlyIGNoYXJhY3RlcmlzdGljcyAqLworICAgIE1pY3JvcGhvbmVJbmZvRGF0YVtdIGdldE1pY3JvcGhvbmVzKCk7CisKKyAgICB2b2lkIHNldEF1ZGlvSGFsUGlkcyhpbiBpbnRbXSAvKiBwaWRfdFtdICovIHBpZHMpOworCisgICAgLy8gU2V0IHZpYnJhdG9ycycgaW5mb3JtYXRpb24uCisgICAgLy8gVGhlIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIEhhcHRpY0dlbmVyYXRvci4KKyAgICB2b2lkIHNldFZpYnJhdG9ySW5mb3MoaW4gQXVkaW9WaWJyYXRvckluZm9bXSB2aWJyYXRvckluZm9zKTsKKworICAgIC8vIFVwZGF0ZSBzZWNvbmRhcnkgb3V0cHV0cy4KKyAgICAvLyBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIHRoZXJlIGlzIGEgZHluYW1pYyBwb2xpY3kgcmVnaXN0ZXJlZC4KKyAgICB2b2lkIHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgICAgICBpbiBUcmFja1NlY29uZGFyeU91dHB1dEluZm9bXSB0cmFja1NlY29uZGFyeU91dHB1dEluZm9zKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMzk1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5haWRsCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLmF1ZGlvLmNvbW1vbi5BdWRpb0Zvcm1hdDsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzRXg7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9EZXZpY2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01peDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvT2ZmbG9hZEluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb09mZmxvYWRNb2RlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9QYXRjaDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9saWN5RGV2aWNlU3RhdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvbGljeUZvcmNlZENvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUG9saWN5Rm9yY2VVc2U7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRDb25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb1BvcnRSb2xlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0VHlwZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUHJvZHVjdFN0cmF0ZWd5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9TdHJlYW1UeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Vc2FnZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVXVpZDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvVm9sdW1lR3JvdXA7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5EZXZpY2VSb2xlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkdldElucHV0Rm9yQXR0clJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuR2V0T3V0cHV0Rm9yQXR0clJlc3BvbnNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklDYXB0dXJlU3RhdGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkludDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNvdW5kVHJpZ2dlclNlc3Npb247CisKKy8qKgorICogSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSUF1ZGlvUG9saWN5U2VydmljZSB7CisgICAgb25ld2F5IHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKKworICAgIHZvaWQgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGluIEF1ZGlvRGV2aWNlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb1BvbGljeURldmljZVN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCk7CisKKyAgICBBdWRpb1BvbGljeURldmljZVN0YXRlIGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShpbiBBdWRpb0RldmljZSBkZXZpY2UpOworCisgICAgdm9pZCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoaW4gQXVkaW9EZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gQXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCk7CisKKyAgICB2b2lkIHNldFBob25lU3RhdGUoQXVkaW9Nb2RlIHN0YXRlLCBpbnQgLyogdWlkX3QgKi8gdWlkKTsKKworICAgIHZvaWQgc2V0Rm9yY2VVc2UoQXVkaW9Qb2xpY3lGb3JjZVVzZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIGNvbmZpZyk7CisKKyAgICBBdWRpb1BvbGljeUZvcmNlZENvbmZpZyBnZXRGb3JjZVVzZShBdWRpb1BvbGljeUZvcmNlVXNlIHVzYWdlKTsKKworICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBnZXRPdXRwdXQoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSk7CisKKyAgICBHZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UgZ2V0T3V0cHV0Rm9yQXR0cihpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19zZXNzaW9uX3QgKi8gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWdzICovIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19wb3J0X2hhbmRsZV90ICovIHNlbGVjdGVkRGV2aWNlSWQpOworCisgICAgdm9pZCBzdGFydE91dHB1dChpbnQgLyogYXVkaW9fcG9ydF9oYW5kbGVfdCAqLyBwb3J0SWQpOworCisgICAgdm9pZCBzdG9wT3V0cHV0KGludCAvKiBhdWRpb19wb3J0X2hhbmRsZV90ICovIHBvcnRJZCk7CisKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXQoaW50IC8qIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKi8gcG9ydElkKTsKKworICAgIEdldElucHV0Rm9yQXR0clJlc3BvbnNlIGdldElucHV0Rm9yQXR0cihpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9faW9faGFuZGxlX3QgKi8gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb191bmlxdWVfaWRfdCAqLyByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ29uZmlnQmFzZSBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvSW5wdXRGbGFncyAqLyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKi8gc2VsZWN0ZWREZXZpY2VJZCk7CisKKworICAgIHZvaWQgc3RhcnRJbnB1dChpbnQgLyogYXVkaW9fcG9ydF9oYW5kbGVfdCAqLyBwb3J0SWQpOworCisgICAgdm9pZCBzdG9wSW5wdXQoaW50IC8qIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKi8gcG9ydElkKTsKKworICAgIHZvaWQgcmVsZWFzZUlucHV0KGludCAvKiBhdWRpb19wb3J0X2hhbmRsZV90ICovIHBvcnRJZCk7CisKKyAgICB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworCisgICAgdm9pZCBzZXRTdHJlYW1Wb2x1bWVJbmRleChBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworCisgICAgaW50IGdldFN0cmVhbVZvbHVtZUluZGV4KEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKworICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2RldmljZXNfdCAqLyBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKKworICAgIGludCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKworICAgIGludCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwgYXR0cik7CisKKyAgICBpbnQgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHIpOworCisgICAgaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBnZXRTdHJhdGVneUZvclN0cmVhbShBdWRpb1N0cmVhbVR5cGUgc3RyZWFtKTsKKworICAgIGludCAvKiBiaXRtYXNrIG9mIGF1ZGlvX2RldmljZXNfdCAqLyBnZXREZXZpY2VzRm9yU3RyZWFtKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pOworCisgICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhpbiBBdWRpb0F0dHJpYnV0ZXNFeCBhdHRyKTsKKworICAgIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBnZXRPdXRwdXRGb3JFZmZlY3QoaW4gRWZmZWN0RGVzY3JpcHRvciBkZXNjKTsKKworICAgIHZvaWQgcmVnaXN0ZXJFZmZlY3QoaW4gRWZmZWN0RGVzY3JpcHRvciBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX2lvX2hhbmRsZV90ICovIGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhdWRpb19zZXNzaW9uX3QgKi8gc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CisKKyAgICB2b2lkIHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKworICAgIHZvaWQgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICB2b2lkIG1vdmVFZmZlY3RzVG9JbyhpbiBpbnRbXSBpZHMsIGludCAvKiBhdWRpb19pb19oYW5kbGVfdCAqLyBpbyk7CisKKyAgICBib29sZWFuIGlzU3RyZWFtQWN0aXZlKEF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludCBpblBhc3RNcyk7CisKKyAgICBib29sZWFuIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50IGluUGFzdE1zKTsKKworICAgIGJvb2xlYW4gaXNTb3VyY2VBY3RpdmUoQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBPbiBpbnB1dCwgY291bnQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGFycmF5LgorICAgICAqIE9uIG91dHB1dCwgY291bnQgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cywgd2hpY2ggbWF5IGJlIGxhcmdlciB0aGFuIHRoZSBhcnJheSBzaXplLgorICAgICAqIFBhc3NpbmcgJzAnIG9uIGlucHV0IGFuZCBpbnNwZWN0aW5nIHRoZSB2YWx1ZSBvbiBvdXRwdXQgaXMgYSBjb21tb24gd2F5IG9mIGRldGVybWluaW5nIHRoZQorICAgICAqIG51bWJlciBvZiBlbGVtZW50cyB3aXRob3V0IGFjdHVhbGx5IHJldHJpZXZpbmcgdGhlbS4KKyAgICAgKi8KKyAgICBFZmZlY3REZXNjcmlwdG9yW10gcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhpbnQgLyogYXVkaW9fc2Vzc2lvbl90ICovIGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm91dCBJbnQgY291bnQpOworCisgICAgaW50IC8qIGF1ZGlvX3VuaXF1ZV9pZF90ICovIGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoaW4gQXVkaW9VdWlkIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb1V1aWQgdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSk7CisKKyAgICBpbnQgLyogYXVkaW9fdW5pcXVlX2lkX3QgKi8gYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChpbiBBdWRpb1V1aWQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvVXVpZCB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1VzYWdlIHVzYWdlKTsKKworICAgIHZvaWQgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpbnQgLyogYXVkaW9fdW5pcXVlX2lkX3QgKi8gaWQpOworCisgICAgdm9pZCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGludCAvKiBhdWRpb191bmlxdWVfaWRfdCAqLyBpZCk7CisKKyAgICB2b2lkIHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcyhpbiBBdWRpb1VzYWdlW10gc3lzdGVtVXNhZ2VzKTsKKworICAgIHZvaWQgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50IC8qIHVpZF90ICovIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBCaXRtYXNrIG9mIEF1ZGlvRmxhZ3MgKi8gY2FwdHVyZVBvbGljeSk7CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKKyAgICAgKiBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkLgorICAgICAqLworICAgIEF1ZGlvT2ZmbG9hZE1vZGUgZ2V0T2ZmbG9hZFN1cHBvcnQoaW4gQXVkaW9PZmZsb2FkSW5mbyBpbmZvKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzYW1wbGUgcmF0ZSwgY2hhbm5lbCBtYXNrIGFuZCBmbGFncy4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGluIEF1ZGlvQ29uZmlnQmFzZSBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCBhdHRyaWJ1dGVzKTsKKworICAgIC8qKgorICAgICAqIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzLiBSZXR1cm5zIHRoZSBnZW5lcmF0aW9uLgorICAgICAqCisgICAgICogT24gaW5wdXQsIGNvdW50IHJlcHJlc2VudHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSByZXR1cm5lZCBhcnJheS4KKyAgICAgKiBPbiBvdXRwdXQsIGNvdW50IGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMsIHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgYXJyYXkgc2l6ZS4KKyAgICAgKiBQYXNzaW5nICcwJyBvbiBpbnB1dCBhbmQgaW5zcGVjdGluZyB0aGUgdmFsdWUgb24gb3V0cHV0IGlzIGEgY29tbW9uIHdheSBvZiBkZXRlcm1pbmluZyB0aGUKKyAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aG91dCBhY3R1YWxseSByZXRyaWV2aW5nIHRoZW0uCisgICAgICovCisgICAgaW50IGxpc3RBdWRpb1BvcnRzKEF1ZGlvUG9ydFJvbGUgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb3J0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBpbm91dCBJbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIG91dCBBdWRpb1BvcnRbXSBwb3J0cyk7CisKKyAgICAvKiogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4gKi8KKyAgICBBdWRpb1BvcnQgZ2V0QXVkaW9Qb3J0KGluIEF1ZGlvUG9ydCBwb3J0KTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgorICAgICAqIFRoZSBoYW5kbGUgYXJndW1lbnQgaXMgdXNlZCB3aGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIHBhdGNoLgorICAgICAqLworICAgIGludCAvKiBhdWRpb19wYXRjaF9oYW5kbGVfdCAqLyBjcmVhdGVBdWRpb1BhdGNoKGluIEF1ZGlvUGF0Y2ggcGF0Y2gsIGludCBoYW5kbGUpOworCisgICAgLyoqIFJlbGVhc2UgYW4gYXVkaW8gcGF0Y2guICovCisgICAgdm9pZCByZWxlYXNlQXVkaW9QYXRjaChpbnQgLyogYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKi8gaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIExpc3QgZXhpc3RpbmcgYXVkaW8gcGF0Y2hlcy4gUmV0dXJucyB0aGUgZ2VuZXJhdGlvbi4KKyAgICAgKgorICAgICAqIE9uIGlucHV0LCBjb3VudCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuCisgICAgICogT24gb3V0cHV0LCBjb3VudCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGFycmF5IHNpemUuCisgICAgICogUGFzc2luZyAnMCcgb24gaW5wdXQgYW5kIGluc3BlY3RpbmcgdGhlIHZhbHVlIG9uIG91dHB1dCBpcyBhIGNvbW1vbiB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlCisgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgorICAgICAqLworICAgIGludCBsaXN0QXVkaW9QYXRjaGVzKGlub3V0IEludCBjb3VudCwgb3V0IEF1ZGlvUGF0Y2hbXSBwYXRjaGVzKTsKKworICAgIC8qKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLiAqLworICAgIHZvaWQgc2V0QXVkaW9Qb3J0Q29uZmlnKGluIEF1ZGlvUG9ydENvbmZpZyBjb25maWcpOworCisgICAgdm9pZCByZWdpc3RlckNsaWVudChJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IGNsaWVudCk7CisKKyAgICB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKTsKKworICAgIFNvdW5kVHJpZ2dlclNlc3Npb24gYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oKTsKKworICAgIHZvaWQgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oaW50IC8qIGF1ZGlvX3Nlc3Npb25fdCAqLyBzZXNzaW9uKTsKKworICAgIEF1ZGlvTW9kZSBnZXRQaG9uZVN0YXRlKCk7CisKKyAgICB2b2lkIHJlZ2lzdGVyUG9saWN5TWl4ZXMoaW4gQXVkaW9NaXhbXSBtaXhlcywgYm9vbGVhbiByZWdpc3RyYXRpb24pOworCisgICAgdm9pZCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKGludCAvKiB1aWRfdCAqLyB1aWQsIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CisKKyAgICB2b2lkIHJlbW92ZVVpZERldmljZUFmZmluaXRpZXMoaW50IC8qIHVpZF90ICovIHVpZCk7CisKKyAgICB2b2lkIHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgaW4gQXVkaW9EZXZpY2VbXSBkZXZpY2VzKTsKKworICAgIHZvaWQgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKKworICAgIGludCAvKiBhdWRpb19wb3J0X2hhbmRsZV90ICovIHN0YXJ0QXVkaW9Tb3VyY2UoaW4gQXVkaW9Qb3J0Q29uZmlnIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQXR0cmlidXRlc0ludGVybmFsIGF0dHJpYnV0ZXMpOworCisgICAgdm9pZCBzdG9wQXVkaW9Tb3VyY2UoaW50IC8qIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKi8gcG9ydElkKTsKKworICAgIHZvaWQgc2V0TWFzdGVyTW9ubyhib29sZWFuIG1vbm8pOworCisgICAgYm9vbGVhbiBnZXRNYXN0ZXJNb25vKCk7CisKKyAgICBmbG9hdCBnZXRTdHJlYW1Wb2x1bWVEQihBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQgaW5kZXgsIGludCAvKiBhdWRpb19kZXZpY2VzX3QgKi8gZGV2aWNlKTsKKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlcyBzdXBwb3J0ZWQgc3Vycm91bmQgZm9ybWF0cyBhbmQgdGhlaXIgZW5hYmxlZCBzdGF0ZSBpbiBmb3JtYXRzIGFuZCBmb3JtYXRzRW5hYmxlZC4KKyAgICAgKgorICAgICAqIE9uIGlucHV0LCBjb3VudCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuCisgICAgICogT24gb3V0cHV0LCBjb3VudCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGFycmF5IHNpemUuCisgICAgICogUGFzc2luZyAnMCcgb24gaW5wdXQgYW5kIGluc3BlY3RpbmcgdGhlIHZhbHVlIG9uIG91dHB1dCBpcyBhIGNvbW1vbiB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlCisgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgorICAgICAqLworICAgIHZvaWQgZ2V0U3Vycm91bmRGb3JtYXRzKGlub3V0IEludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgQXVkaW9Gb3JtYXRbXSBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCBib29sZWFuW10gZm9ybWF0c0VuYWJsZWQpOworCisgICAgLyoqCisgICAgICogUG9wdWxhdGVzIHRoZSBzdXJyb3VuZCBmb3JtYXRzIHJlcG9ydGVkIGJ5IHRoZSBIRE1JIGRldmljZXMgaW4gZm9ybWF0cy4KKyAgICAgKgorICAgICAqIE9uIGlucHV0LCBjb3VudCByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuCisgICAgICogT24gb3V0cHV0LCBjb3VudCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGFycmF5IHNpemUuCisgICAgICogUGFzc2luZyAnMCcgb24gaW5wdXQgYW5kIGluc3BlY3RpbmcgdGhlIHZhbHVlIG9uIG91dHB1dCBpcyBhIGNvbW1vbiB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlCisgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgcmV0cmlldmluZyB0aGVtLgorICAgICAqLworICAgIHZvaWQgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoaW5vdXQgSW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IEF1ZGlvRm9ybWF0W10gZm9ybWF0cyk7CisKKyAgICBBdWRpb0Zvcm1hdFtdIGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoKTsKKworICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEF1ZGlvRm9ybWF0IGF1ZGlvRm9ybWF0LCBib29sZWFuIGVuYWJsZWQpOworCisgICAgdm9pZCBzZXRBc3Npc3RhbnRVaWQoaW50IC8qIHVpZF90ICovIHVpZCk7CisKKyAgICB2b2lkIHNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKGludCAvKiB1aWRfdCAqLyB1aWQpOworCisgICAgdm9pZCBzZXRBMTF5U2VydmljZXNVaWRzKGluIGludFtdIC8qIHVpZF90W10gKi8gdWlkcyk7CisKKyAgICB2b2lkIHNldEN1cnJlbnRJbWVVaWQoaW50IC8qIHVpZF90ICovIHVpZCk7CisKKyAgICBib29sZWFuIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5W10gbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoKTsKKyAgICBpbnQgLyogcHJvZHVjdF9zdHJhdGVneV90ICovIGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzRXggYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFsbGJhY2tPbkRlZmF1bHQpOworCisgICAgQXVkaW9Wb2x1bWVHcm91cFtdIGxpc3RBdWRpb1ZvbHVtZUdyb3VwcygpOworICAgIGludCAvKiB2b2x1bWVfZ3JvdXBfdCAqLyBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoaW4gQXVkaW9BdHRyaWJ1dGVzRXggYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZhbGxiYWNrT25EZWZhdWx0KTsKKworICAgIHZvaWQgc2V0UnR0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgYm9vbGVhbiBpc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCk7CisKKyAgICB2b2lkIHNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koaW50IC8qIHByb2R1Y3Rfc3RyYXRlZ3lfdCAqLyBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0RldmljZVtdIGRldmljZXMpOworCisgICAgdm9pZCByZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5KGludCAvKiBwcm9kdWN0X3N0cmF0ZWd5X3QgKi8gc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VSb2xlIHJvbGUpOworCisgICAgQXVkaW9EZXZpY2VbXSBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KGludCAvKiBwcm9kdWN0X3N0cmF0ZWd5X3QgKi8gc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSk7CisKKyAgICB2b2lkIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CisKKyAgICB2b2lkIGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CisKKyAgICB2b2lkIHJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvRGV2aWNlW10gZGV2aWNlcyk7CisKKyAgICB2b2lkIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KEF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVJvbGUgcm9sZSk7CisKKyAgICBBdWRpb0RldmljZVtdIGdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUm9sZSByb2xlKTsKKworICAgIGJvb2xlYW4gcmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcihJQ2FwdHVyZVN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3ODJiOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmFpZGwKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWdCYXNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuRWZmZWN0RGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlJlY29yZENsaWVudEluZm87CisKKy8qKgorICoge0BoaWRlfQorICovCitvbmV3YXkgaW50ZXJmYWNlIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgeworICAgIC8qKiBOb3RpZmllcyBhIGNoYW5nZSBvZiB2b2x1bWUgZ3JvdXAuICovCisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGludCAvKiB2b2x1bWVfZ3JvdXBfdCAqLyBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAgICAvKiogTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLiAqLworICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgLyoqIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBhdGNoIGNvbmZpZ3VyYXRpb24uICovCisgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgLyoqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBtaXhpbmcgc3RhdGUgb2YgYSBzcGVjaWZpYyBtaXggaW4gYSBkeW5hbWljIGF1ZGlvIHBvbGljeS4gKi8KKyAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKEB1dGY4SW5DcHAgU3RyaW5nIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlKTsKKyAgICAvKiogTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24uICovCisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFJlY29yZENsaWVudEluZm8gY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBBdWRpb0NvbmZpZ0Jhc2UgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEVmZmVjdERlc2NyaXB0b3JbXSBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEF1ZGlvQ29uZmlnQmFzZSBkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gRWZmZWN0RGVzY3JpcHRvcltdIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICovIHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2UpOworICAgICAvKiogTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcm91dGluZyAqLworICAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAppbmRleCBlY2Y1OGI2Li40NGVmODBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0xNiw5ICsxNiwxMyBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1pY3JvcGhvbmVJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWljcm9waG9uZUluZm9EYXRhOwogCi0vKiBOYXRpdmUgY29kZSBtdXN0IHNwZWNpZnkgbmFtZXNwYWNlIG1lZGlhIChtZWRpYTo6SUF1ZGlvUmVjb3JkKSB3aGVuIHJlZmVycmluZyB0byB0aGlzIGNsYXNzICovCisvKioKKyAqIE5hdGl2ZSBjb2RlIG11c3Qgc3BlY2lmeSBuYW1lc3BhY2UgbWVkaWEgKG1lZGlhOjpJQXVkaW9SZWNvcmQpIHdoZW4gcmVmZXJyaW5nIHRvIHRoaXMgY2xhc3MuCisgKgorICoge0BoaWRlfQorICovCiBpbnRlcmZhY2UgSUF1ZGlvUmVjb3JkIHsKIAogICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwpAQCAtMzUsNyArMzksNyBAQAogCiAgIC8qIEdldCBhIGxpc3Qgb2YgY3VycmVudCBhY3RpdmUgbWljcm9waG9uZXMuCiAgICAqLwotICB2b2lkIGdldEFjdGl2ZU1pY3JvcGhvbmVzKG91dCBNaWNyb3Bob25lSW5mb1tdIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9EYXRhW10gYWN0aXZlTWljcm9waG9uZXMpOwogCiAgIC8qIFNldCB0aGUgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKS4KICAgICovCkBAIC00NCw0ICs0OCw2IEBACiAgIC8qIFNldCB0aGUgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykuCiAgICAqLwogICB2b2lkIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICB2b2lkIHNoYXJlQXVkaW9IaXN0b3J5KEB1dGY4SW5DcHAgU3RyaW5nIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsIGxvbmcgc2hhcmVkQXVkaW9TdGFydE1zKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ODkyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFjay5haWRsCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0R1YWxNb25vTW9kZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvUGxheWJhY2tSYXRlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9UaW1lc3RhbXBJbnRlcm5hbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyU3RhdGU7CisKKy8qKgorICogVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgbWV0aG9kcyByZXR1cm5pbmcgaW50IGV4cGVjdCBpdCB0byBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXR1c190LgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElBdWRpb1RyYWNrIHsKKyAgICAvKiogR2V0IHRoaXMgdHJhY2sncyBjb250cm9sIGJsb2NrICovCisgICAgQG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gZ2V0Q2JsaygpOworCisgICAgLyoqCisgICAgICogQWZ0ZXIgaXQncyBjcmVhdGVkIHRoZSB0cmFjayBpcyBub3QgYWN0aXZlLiBDYWxsIHN0YXJ0KCkgdG8KKyAgICAgKiBtYWtlIGl0IGFjdGl2ZS4KKyAgICAgKi8KKyAgICBpbnQgc3RhcnQoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgYSB0cmFjay4gSWYgc2V0LCB0aGUgY2FsbGJhY2sgd2lsbCBjZWFzZSBiZWluZyBjYWxsZWQgYW5kCisgICAgICogb2J0YWluQnVmZmVyIHdpbGwgcmV0dXJuIGFuIGVycm9yLiBCdWZmZXJzIHRoYXQgYXJlIGFscmVhZHkgcmVsZWFzZWQKKyAgICAgKiB3aWxsIGNvbnRpbnVlIHRvIGJlIHByb2Nlc3NlZCwgdW5sZXNzL3VudGlsIGZsdXNoKCkgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZvaWQgc3RvcCgpOworCisgICAgLyoqCisgICAgICogRmx1c2ggYSBzdG9wcGVkIG9yIHBhdXNlZCB0cmFjay4gQWxsIHBlbmRpbmcvcmVsZWFzZWQgYnVmZmVycyBhcmUgZGlzY2FyZGVkLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBpZiB0aGUgdHJhY2sgaXMgbm90IHN0b3BwZWQgb3IgcGF1c2VkLgorICAgICAqLworICAgIHZvaWQgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFBhdXNlIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAorICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCisgICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHBhdXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggdHJhY2sgYXV4aWxpYXJ5IG91dHB1dCB0byBzcGVjaWZpZWQgZWZmZWN0LiBVc2UgZWZmZWN0SWQgPSAwCisgICAgICogdG8gZGV0YWNoIHRyYWNrIGZyb20gZWZmZWN0LgorICAgICAqLworICAgIGludCBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKKworICAgIC8qKiBTZW5kIHBhcmFtZXRlcnMgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlLiAqLworICAgIGludCBzZXRQYXJhbWV0ZXJzKEB1dGY4SW5DcHAgU3RyaW5nIGtleVZhbHVlUGFpcnMpOworCisgICAgLyoqIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4gKi8KKyAgICBpbnQgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvKiogUmV0dXJuIE5PX0VSUk9SIGlmIHRpbWVzdGFtcCBpcyB2YWxpZC4gKi8KKyAgICBpbnQgZ2V0VGltZXN0YW1wKG91dCBBdWRpb1RpbWVzdGFtcEludGVybmFsIHRpbWVzdGFtcCk7CisKKyAgICAvKiogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2suICovCisgICAgdm9pZCBzaWduYWwoKTsKKworICAgIC8qKiBTZXRzIHRoZSB2b2x1bWUgc2hhcGVyLiBSZXR1cm5zIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXR1cy4gKi8KKyAgICBpbnQgYXBwbHlWb2x1bWVTaGFwZXIoaW4gVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBWb2x1bWVTaGFwZXJPcGVyYXRpb24gb3BlcmF0aW9uKTsKKworICAgIC8qKiBHZXRzIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXRlLiAqLworICAgIEBudWxsYWJsZSBWb2x1bWVTaGFwZXJTdGF0ZSBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBEdWFsTW9ub01vZGUgc2V0dGluZyBhc3NvY2lhdGVkIHdpdGggdGhpcyBBdWRpb1RyYWNrLgorICAgICAqLworICAgIEF1ZGlvRHVhbE1vbm9Nb2RlIGdldER1YWxNb25vTW9kZSgpOworCisgICAgLyoqCisgICAgICogU2V0cyBEdWFsTW9ub01vZGUgc2V0dGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHNldER1YWxNb25vTW9kZShpbiBBdWRpb0R1YWxNb25vTW9kZSBtb2RlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbC4KKyAgICAgKi8KKyAgICBmbG9hdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEF1ZGlvUGxheWJhY2tSYXRlLgorICAgICAqLworICAgIEF1ZGlvUGxheWJhY2tSYXRlIGdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIEF1ZGlvUGxheWJhY2tSYXRlLgorICAgICAqLworICAgIHZvaWQgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhpbiBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmFpZGwKaW5kZXggMjE1NTNiNS4uZjU5M2UyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suYWlkbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2tDYWxsYmFjay5haWRsCkBAIC0xNyw3ICsxNyw3IEBACiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKIC8qKgotICogQGhpZGUKKyAqIHtAaGlkZX0KICAqLwogaW50ZXJmYWNlIElBdWRpb1RyYWNrQ2FsbGJhY2sgewogICAgIG9uZXdheSB2b2lkIG9uQ29kZWNGb3JtYXRDaGFuZ2VkKGluIGJ5dGVbXSBhdWRpb01ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FwdHVyZVN0YXRlTGlzdGVuZXIuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQ2FwdHVyZVN0YXRlTGlzdGVuZXIuYWlkbAppbmRleCA4NTAyMjgyLi4zYjIyMDZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUNhcHR1cmVTdGF0ZUxpc3RlbmVyLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lDYXB0dXJlU3RhdGVMaXN0ZW5lci5haWRsCkBAIC0xNiw2ICsxNiw5IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAorLyoqCisgKiB7QGhpZGV9CisgKi8KIGludGVyZmFjZSBJQ2FwdHVyZVN0YXRlTGlzdGVuZXIgewogICAgIHZvaWQgc2V0Q2FwdHVyZVN0YXRlKGJvb2xlYW4gYWN0aXZlKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2NkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdC5haWRsCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlNoYXJlZEZpbGVSZWdpb247CisKKy8qKgorICogVGhlIElFZmZlY3QgaW50ZXJmYWNlIGVuYWJsZXMgY29udHJvbCBvZiB0aGUgZWZmZWN0IG1vZHVsZSBhY3Rpdml0eSBhbmQgcGFyYW1ldGVycy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJRWZmZWN0IHsKKyAgICAvKioKKyAgICAgKiBBY3RpdmF0ZXMgdGhlIGVmZmVjdCBtb2R1bGUgYnkgY29ubmVjdGluZyBpdCB0byB0aGUgYXVkaW8gcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgc3RhdHVzX3QgY29kZS4KKyAgICAgKi8KKyAgICBpbnQgZW5hYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWFjdGl2YXRlcyB0aGUgZWZmZWN0IG1vZHVsZSBieSBkaXNjb25uZWN0aW5nIGl0IGZyb20gdGhlIGF1ZGlvIHBhdGguCisgICAgICogQHJldHVybiBhIHN0YXR1c190IGNvZGUuCisgICAgICovCisgICAgaW50IGRpc2FibGUoKTsKKworICAgIC8qKgorICAgICAqIFNlbmRzIGNvbnRyb2wsIHJlYWRzIG9yIHdyaXRlcyBwYXJhbWV0ZXJzLiBTYW1lIGJlaGF2aW9yIGFzIHRoZSBjb21tYW5kKCkgbWV0aG9kIGluIHRoZQorICAgICAqIGVmZmVjdCBjb250cm9sIGludGVyZmFjZS4KKyAgICAgKiBSZWZlciB0byBzeXN0ZW0vYXVkaW9fZWZmZWN0LmggZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhbGlkIGNvbW1hbmQgY29kZXMgYW5kIHRoZWlyCisgICAgICogYXNzb2NpYXRlZCBwYXJhbWV0ZXIgYW5kIHJldHVybiBtZXNzYWdlcy4gVGhlIGNtZERhdGEgYW5kIHJlc3BvbnNlIHBhcmFtZXRlcnMgYXJlIGV4cGVjdGVkIHRvCisgICAgICogY29udGFpbiB0aGUgcmVzcGVjdGl2ZSB0eXBlcyBpbiBhIHN0YW5kYXJkIEMgbWVtb3J5IGxheW91dC4KKyAgICAgKgorICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugb3BhcXVlIGJ5dGUgYXJyYXlzIHdpdGggc3Ryb25nbHkgdHlwZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBpbnQgY29tbWFuZChpbnQgY21kQ29kZSwgaW4gYnl0ZVtdIGNtZERhdGEsIGludCBtYXhSZXNwb25zZVNpemUsIG91dCBieXRlW10gcmVzcG9uc2UpOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdHMgdGhlIElFZmZlY3QgaW50ZXJmYWNlIGZyb20gdGhlIGVmZmVjdCBtb2R1bGUuCisgICAgICogVGhpcyB3aWxsIGFsc28gZGVsZXRlIHRoZSBlZmZlY3QgbW9kdWxlIGFuZCByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lIGluIHRoZSBsaWJyYXJ5IGlmIHRoaXMKKyAgICAgKiBpcyB0aGUgbGFzdCBjbGllbnQgZGlzY29ubmVjdGVkLiBUbyByZWxlYXNlIGNvbnRyb2wgb2YgdGhlIGVmZmVjdCBtb2R1bGUsIHRoZSBhcHBsaWNhdGlvbiBjYW4KKyAgICAgKiBkaXNjb25uZWN0IG9yIGRlbGV0ZSB0aGUgSUVmZmVjdCBpbnRlcmZhY2UuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHNoYXJlZCBtZW1vcnkgYXJlYSB1c2VkIHRvIHBhc3MgbXVsdGlwbGUgcGFyYW1ldGVycyB0byB0aGUgZWZmZWN0CisgICAgICogbW9kdWxlIHdpdGhvdXQgbXVsdGlwbHlpbmcgdGhlIGJpbmRlciBjYWxscy4KKyAgICAgKgorICAgICAqIFRPRE8oeXRhaSk6IEV4cGxhaW4gaG93IHRoaXMgc2hvdWxkIGJlIHVzZWQgZXhhY3RseS4KKyAgICAgKi8KKyAgICBTaGFyZWRGaWxlUmVnaW9uIGdldENibGsoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JRWZmZWN0Q2xpZW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmJjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUVmZmVjdENsaWVudC5haWRsCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogQSBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGdldHRpbmcgZWZmZWN0LXJlbGF0ZWQgbm90aWZpY2F0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJRWZmZWN0Q2xpZW50IHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiBncmFudGluZyBjb250cm9sIG92ZXIgdGhlIGVmZmVjdCB0byB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW0gY29udHJvbEdyYW50ZWQgdHJ1ZSBpZmYgdGhlIGFwcGxpY2F0aW9uIGhhcyB0aGUgY29udHJvbCBvZiB0aGUgZWZmZWN0IG1vZHVsZS4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sZWFuIGNvbnRyb2xHcmFudGVkKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgZWZmZWN0IGhhcyBiZWVuIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFJlY2VpdmVkIG9ubHkgaWYgdGhlIGNsaWVudCBpcyBub3QKKyAgICAgKiBjdXJyZW50bHkgY29udHJvbGxpbmcgdGhlIGVmZmVjdC4KKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIGlmIHRoZSBlZmZlY3QgbW9kdWxlIGhhcyBiZWVuIGFjdGl2YXRlZCwgZmFsc2UgaWYgZGVhY3RpdmF0ZWQuCisgICAgICovCisgICAgb25ld2F5IHZvaWQgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogQSBjb21tYW5kIGhhcyBiZWVuIHNlbmQgdG8gdGhlIGVmZmVjdCBlbmdpbmUuIFJlY2VpdmVkIG9ubHkgaWYgdGhlIGNsaWVudCBpcyBub3QgY3VycmVudGx5CisgICAgICogY29udHJvbGxpbmcgdGhlIGVmZmVjdC4gU2VlIElFZmZlY3QuY29tbWFuZCgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIGJ1ZmZlciBjb250ZW50cy4KKyAgICAgKgorICAgICAqIFRPRE8oeXRhaSk6IHJlcGxhY2Ugb3BhcXVlIGJ5dGUgYXJyYXlzIHdpdGggc3Ryb25nbHkgdHlwZWQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBjb21tYW5kRXhlY3V0ZWQoaW50IGNtZENvZGUsIGluIGJ5dGVbXSBjbWREYXRhLCBpbiBieXRlW10gcmVwbHlEYXRhKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JUGxheWVyLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSVBsYXllci5haWRsCmluZGV4IGE5MGZjZGQuLjQzYmI3ZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JUGxheWVyLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lQbGF5ZXIuYWlkbApAQCAtMTYsMTEgKzE2LDExIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVTaGFwZXIuT3BlcmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlck9wZXJhdGlvbjsKIAogLyoqCi0gKiBAaGlkZQorICoge0BoaWRlfQogICovCiBpbnRlcmZhY2UgSVBsYXllciB7CiAgICAgb25ld2F5IHZvaWQgc3RhcnQoKTsKQEAgLTI5LDYgKzI5LDYgQEAKICAgICBvbmV3YXkgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sKTsKICAgICBvbmV3YXkgdm9pZCBzZXRQYW4oZmxvYXQgcGFuKTsKICAgICBvbmV3YXkgdm9pZCBzZXRTdGFydERlbGF5TXMoaW50IGRlbGF5TXMpOwotICAgIG9uZXdheSB2b2lkIGFwcGx5Vm9sdW1lU2hhcGVyKGluIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBPcGVyYXRpb24gb3BlcmF0aW9uKTsKKyAgICBvbmV3YXkgdm9pZCBhcHBseVZvbHVtZVNoYXBlcihpbiBWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gVm9sdW1lU2hhcGVyT3BlcmF0aW9uIG9wZXJhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNGQ2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JbnQuYWlkbApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYW4gJ2ludCcsIHB1dHRpbmcgaXQgaW4gYSBwYXJjZWxhYmxlLCBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhbgorICogaW5vdXQgcGFyYW1ldGVyLCBiZSBtYWRlIEBudWxsYWJsZSwgZXRjLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBJbnQgeworICAgIGludCB2YWx1ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9NaWNyb3Bob25lSW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTQ2Y2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL01pY3JvcGhvbmVJbmZvLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWE7Ci0KLXBhcmNlbGFibGUgTWljcm9waG9uZUluZm8gY3BwX2hlYWRlciAibWVkaWEvTWljcm9waG9uZUluZm8uaCI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU1NTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlcXVlc3QuYWlkbApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRGV2aWNlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBPcGVuSW5wdXRSZXF1ZXN0IHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fbW9kdWxlX2hhbmRsZV90LiAqLworICAgIGludCBtb2R1bGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2lvX2hhbmRsZV90LiAqLworICAgIGludCBpbnB1dDsKKyAgICBBdWRpb0NvbmZpZyBjb25maWc7CisgICAgQXVkaW9EZXZpY2UgZGV2aWNlOworICAgIEF1ZGlvU291cmNlVHlwZSBzb3VyY2U7CisgICAgLyoqIEJpdG1hc2ssIGluZGV4ZWQgYnkgQXVkaW9JbnB1dEZsYWcuICovCisgICAgaW50IGZsYWdzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3BlbklucHV0UmVzcG9uc2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjEzYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5JbnB1dFJlc3BvbnNlLmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Db25maWc7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0RldmljZTsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgT3BlbklucHV0UmVzcG9uc2UgeworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgaW5wdXQ7CisgICAgQXVkaW9Db25maWcgY29uZmlnOworICAgIEF1ZGlvRGV2aWNlIGRldmljZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVxdWVzdC5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXF1ZXN0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiMTJlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVxdWVzdC5haWRsCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQ29uZmlnOworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Qb3J0OworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBPcGVuT3V0cHV0UmVxdWVzdCB7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4gKi8KKyAgICBpbnQgbW9kdWxlOworICAgIEF1ZGlvQ29uZmlnIGNvbmZpZzsKKyAgICAvKiogVHlwZSBtdXN0IGJlIERFVklDRS4gKi8KKyAgICBBdWRpb1BvcnQgZGV2aWNlOworICAgIC8qKiBCaXRtYXNrLCBpbmRleGVkIGJ5IEF1ZGlvT3V0cHV0RmxhZy4gKi8KKyAgICBpbnQgZmxhZ3M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlc3BvbnNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MTk2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9PcGVuT3V0cHV0UmVzcG9uc2UuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0NvbmZpZzsKKworLyoqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgT3Blbk91dHB1dFJlc3BvbnNlIHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9faW9faGFuZGxlX3QuICovCisgICAgaW50IG91dHB1dDsKKyAgICBBdWRpb0NvbmZpZyBjb25maWc7CisgICAgaW50IGxhdGVuY3lNczsKKyAgICAvKiogQml0bWFzaywgaW5kZXhlZCBieSBBdWRpb091dHB1dEZsYWcuICovCisgICAgaW50IGZsYWdzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1JlY29yZENsaWVudEluZm8uYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4MDQ2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZWNvcmRDbGllbnRJbmZvLmFpZGwKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Tb3VyY2VUeXBlOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBSZWNvcmRDbGllbnRJbmZvIHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fdW5pcXVlX2lkX3QuICovCisgICAgaW50IHJpaWQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIHVpZF90LiAqLworICAgIGludCB1aWQ7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX3Nlc3Npb25fdC4gKi8KKyAgICBpbnQgc2Vzc2lvbjsKKyAgICBBdWRpb1NvdXJjZVR5cGUgc291cmNlOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19wb3J0X2hhbmRsZV90LiAqLworICAgIGludCBwb3J0SWQ7CisgICAgYm9vbGVhbiBzaWxlbmNlZDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZW5kZXJQb3NpdGlvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1JlbmRlclBvc2l0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkYzE3YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9SZW5kZXJQb3NpdGlvbi5haWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFJlbmRlclBvc2l0aW9uIHsKKyAgICBpbnQgaGFsRnJhbWVzOworICAgIGludCBkc3BGcmFtZXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvU291bmRUcmlnZ2VyU2Vzc2lvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI5ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1NvdW5kVHJpZ2dlclNlc3Npb24uYWlkbApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBTb3VuZFRyaWdnZXJTZXNzaW9uIHsKKyAgICAvKiogSW50ZXJwcmV0ZWQgYXMgYXVkaW9fc2Vzc2lvbl90LiAqLworICAgIGludCBzZXNzaW9uOworICAgIC8qKiBJbnRlcnByZXRlZCBhcyBhdWRpb19pb19oYW5kbGVfdC4gKi8KKyAgICBpbnQgaW9IYW5kbGU7CisgICAgLyoqIEludGVycHJldGVkIGFzIGF1ZGlvX2RldmljZXNfdC4gKi8KKyAgICBpbnQgZGV2aWNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mby5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzMyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLmFpZGwKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBUaGlzIGlzIGEgY2xhc3MgdGhhdCBjb250YWlucyBwb3J0IGhhbmRsZSBmb3IgYSB0cmFjayBhbmQgaGFuZGxlcyBmb3IgYWxsIHNlY29uZGFyeQorICogb3V0cHV0cyBvZiB0aGUgdHJhY2suCisgKiBAaGlkZQorICovCitwYXJjZWxhYmxlIFRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbyB7CisgICAgaW50IHBvcnRJZDsgLy8gYXVkaW9fcG9ydF9oYW5kbGVfdAorICAgIGludFtdIHNlY29uZGFyeU91dHB1dElkczsgLy8gYXVkaW9faW9faGFuZGxlX3RbXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvQ29uZmlndXJhdGlvbi5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9Db25maWd1cmF0aW9uLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGU2MGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9Db25maWd1cmF0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlcjsKLQotcGFyY2VsYWJsZSBDb25maWd1cmF0aW9uIGNwcF9oZWFkZXIgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyL09wZXJhdGlvbi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkwZDlkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvT3BlcmF0aW9uLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhLlZvbHVtZVNoYXBlcjsKLQotcGFyY2VsYWJsZSBPcGVyYXRpb24gY3BwX2hlYWRlciAibWVkaWEvVm9sdW1lU2hhcGVyLmgiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9TdGF0ZS5haWRsIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlci9TdGF0ZS5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEyMmI4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIvU3RhdGUuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQubWVkaWEuVm9sdW1lU2hhcGVyOwotCi1wYXJjZWxhYmxlIFN0YXRlIGNwcF9oZWFkZXIgIm1lZGlhL1ZvbHVtZVNoYXBlci5oIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5MGFhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImF1ZGlvZmxpbmdlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImF1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA3LjAtZW51bXMiLAorICAgICAgICAiZWZmZWN0LWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY2dyb3VwcmMiLAorICAgICAgICAibGliY2dyb3VwcmNfZm9ybWF0IiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJqc29uY3BwIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzc2VydmljZSIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGliYXVkaW9mbGluZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL1JFQURNRS5tZCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNmM0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw4MCBAQAorIyBGdXp6ZXIgZm9yIGxpYmF1ZGlvZmxpbmdlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGliYXVkaW9mbGluZ2VyIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLiBUaGUgZnV6emVyCitjb3ZlcnMgbGliYXVkaW9mbGluZ2VyIEFQSXMgYXMgY2FsbGVkIGZyb20gbGliYXVkaW9jbGllbnQgdGhyb3VnaCBJUEMuCisKK2xpYmF1ZGlvZmxpbmdlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBVbmlxdWUgSURzIChwYXJhbWV0ZXIgbmFtZTogYHVuaXF1ZUlkYCkKKzIuIEF1ZGlvIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgbW9kZWApCiszLiBTZXNzaW9uIElEIChwYXJhbWV0ZXIgbmFtZTogYHNlc3Npb25JZGApCis0LiBFbmNhcHN1bGF0aW9uIE1vZGUgKHBhcmFtZXRlciBuYW1lOiBgZW5jYXBzdWxhdGlvbk1vZGVgKQorNS4gQXVkaW8gUG9ydCBSb2xlIChwYXJhbWV0ZXIgbmFtZTogYHBvcnRSb2xlYCkKKzYuIEF1ZGlvIFBvcnQgVHlwZSAocGFyYW1ldGVyIG5hbWU6IGBwb3J0VHlwZWApCis3LiBBdWRpbyBTdHJlYW0gVHlwZSAocGFyYW1ldGVyIG5hbWU6IGBzdHJlYW1UeXBlYCkKKzguIEF1ZGlvIEZvcm1hdCAocGFyYW1ldGVyIG5hbWU6IGBmb3JtYXRgKQorOS4gQXVkaW8gQ2hhbm5lbCBNYXNrIChwYXJhbWV0ZXIgbmFtZTogYGNoYW5uZWxNYXNrYCkKKzEwLiBVc2FnZSAocGFyYW1ldGVyIG5hbWU6IGB1c2FnZWApCisxMS4gQXVkaW8gQ29udGVudCBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGNvbnRlbnRUeXBlYCkKKzEyLiBJbnB1dCBTb3VyY2UgKHBhcmFtZXRlciBuYW1lOiBgaW5wdXRTb3VyY2VgKQorMTMuIElucHV0IEZsYWdzIChwYXJhbWV0ZXIgbmFtZTogYGlucHV0RmxhZ3NgKQorMTQuIE91dHB1dCBGbGFncyAocGFyYW1ldGVyIG5hbWU6IGBvdXRwdXRGbGFnc2ApCisxNS4gQXVkaW8gR2FpbiBNb2RlIChwYXJhbWV0ZXIgbmFtZTogYGdhaW5Nb2RlYCkKKzE2LiBBdWRpbyBEZXZpY2UgKHBhcmFtZXRlciBuYW1lOiBgZGV2aWNlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGB1bmlxdWVJZGAgICB8IDAuIGBBVURJT19VTklRVUVfSURfVVNFX1VOU1BFQ0lGSUVEYCAxLiBgQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OYCAyLiBgQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEVgIDMuIGBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVGAgNC4gYEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0hgIDUuIGBBVURJT19VTklRVUVfSURfVVNFX09VVFBVVGAgNi4gYEFVRElPX1VOSVFVRV9JRF9VU0VfSU5QVVRgIDcuIGBBVURJT19VTklRVUVfSURfVVNFX0NMSUVOVGAgOC4gYEFVRElPX1VOSVFVRV9JRF9VU0VfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyCit8IGBtb2RlYCAgIHwgMC5gQVVESU9fTU9ERV9JTlZBTElEYCAxLiBgQVVESU9fTU9ERV9DVVJSRU5UYCAyLiBgIEFVRElPX01PREVfTk9STUFMYCAzLiBgQVVESU9fTU9ERV9SSU5HVE9ORWAgNC4gYEFVRElPX01PREVfSU5fQ0FMTGAgNS4gYEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTmAgNi4gYEFVRElPX01PREVfQ0FMTF9TQ1JFRU5gIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBzZXNzaW9uSWRgICAgfCAwLiBgQVVESU9fU0VTU0lPTl9OT05FYCAxLiBgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0VgIDIuIGBBVURJT19TRVNTSU9OX0RFVklDRWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYGVuY2Fwc3VsYXRpb25Nb2RlYCAgIHwgMC4gYEFVRElPX0VOQ0FQU1VMQVRJT05fTU9ERV9OT05FYCAxLiBgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0VMRU1FTlRBUllfU1RSRUFNYCAyLiBgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0hBTkRMRWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlcnwKK3wgYHBvcnRSb2xlYCAgIHwgMC4gYEFVRElPX1BPUlRfUk9MRV9OT05FYCAxLiBgQVVESU9fUE9SVF9ST0xFX1NPVVJDRWAgMi4gYEFVRElPX1BPUlRfUk9MRV9TSU5LYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgcG9ydFR5cGVgICAgfCAwLiBgQVVESU9fUE9SVF9UWVBFX05PTkVgIDEuIGBBVURJT19QT1JUX1RZUEVfREVWSUNFYCAyLiBgQVVESU9fUE9SVF9UWVBFX01JWGAgMy4gYEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OYHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBzdHJlYW1UeXBlYCB8IDE1IHZhbHVlcyBvZiB0eXBlIGBhdWRpb19zdHJlYW1fdHlwZV90YCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgZm9ybWF0YCB8IDc3IHZhbHVlcyBvZiB0eXBlIGBhdWRpb19mb3JtYXRfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGNoYW5uZWxNYXNrYCB8IDgzIHZhbHVlcyBvZiB0eXBlIGBhdWRpb19jaGFubmVsX21hc2tfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYHVzYWdlYCB8IDIyIHZhbHVlcyBvZiB0eXBlIGBhdWRpb191c2FnZV90YCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgY29udGVudFR5cGVgIHwgNSB2YWx1ZXMgb2YgdHlwZSBgYXVkaW9fY29udGVudF90eXBlX3RgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBpbnB1dFNvdXJjZWAgfCAxNCB2YWx1ZXMgb2YgdHlwZSBgYXVkaW9fc291cmNlX3RgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBpbnB1dEZsYWdzYCB8IDkgdmFsdWVzIG9mIHR5cGUgYGF1ZGlvX2lucHV0X2ZsYWdzX3RgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBvdXRwdXRGbGFnc2AgfCAxNiB2YWx1ZXMgb2YgdHlwZSBgYXVkaW9fb3V0cHV0X2ZsYWdzX3RgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBnYWluTW9kZWAgfCAzIHZhbHVlcyBvZiB0eXBlIGBhdWRpb19nYWluX21vZGVfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGRldmljZWAgfCA2NiB2YWx1ZXMgb2YgdHlwZSBgYXVkaW9fZGV2aWNlc190YCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2Vzbid0IGBleGl0KClgIG9uIGFueSBpbnB1dCBhbmQgdGhlcmVieSBpbmNyZWFzaW5nIHRoZQorY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYXVkaW9mbGluZ2VyX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgYXVkaW9mbGluZ2VyX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2F1ZGlvZmxpbmdlcl9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvZnV6emVyL2F1ZGlvZmxpbmdlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwM2M2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9mdXp6ZXIvYXVkaW9mbGluZ2VyX2Z1enplci5jcHAKQEAgLTAsMCArMSw3MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCisvKioKKyAqIE5PVEUKKyAqIDEpIFRoZSBpbnB1dCB0byBBdWRpb0ZsaW5nZXIgYmluZGVyIGNhbGxzIGFyZSBmdXp6ZWQgaW4gdGhpcyBmdXp6ZXIKKyAqIDIpIEF1ZGlvRmxpbmdlciBjcmFzaGVzIGR1ZSB0byB0aGUgZnV6emVyIGFyZSBkZXRlY3RlZCBieSB0aGUKKyAgICAgIEJpbmRlciBEZWF0aFJlY2lwaWVudCwgd2hlcmUgdGhlIGZ1enplciBhYm9ydHMgaWYgQXVkaW9GbGluZ2VyIGRpZXMKKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9WN18wLWVudW1zLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1JlY29yZC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKKyNkZWZpbmUgTUFYX1NUUklOR19MRU5HVEggMjU2CisjZGVmaW5lIE1BWF9BUlJBWV9MRU5HVEggMjU2CisKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5TYW1wbGVSYXRlSHogPSA0MDAwOworY29uc3RleHByIGludDMyX3Qga01heFNhbXBsZVJhdGVIeiA9IDE5MjAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtTYW1wbGVSYXRlVW5zcGVjaWZpZWQgPSAwOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSB4c2QgewordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YXVkaW86OnBvbGljeTo6Y29uZmlndXJhdGlvbjo6VjdfMDsKK30KKwordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKworY29uc3RleHByIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCBrVW5pcXVlSWRzW10gPSB7CisgICAgQVVESU9fVU5JUVVFX0lEX1VTRV9VTlNQRUNJRklFRCwgQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OLCBBVURJT19VTklRVUVfSURfVVNFX01PRFVMRSwKKyAgICBBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCwgICAgICBBVURJT19VTklRVUVfSURfVVNFX1BBVENILCAgIEFVRElPX1VOSVFVRV9JRF9VU0VfT1VUUFVULAorICAgIEFVRElPX1VOSVFVRV9JRF9VU0VfSU5QVVQsICAgICAgIEFVRElPX1VOSVFVRV9JRF9VU0VfQ0xJRU5ULCAgQVVESU9fVU5JUVVFX0lEX1VTRV9NQVgsCit9OworCitjb25zdGV4cHIgYXVkaW9fbW9kZV90IGtNb2Rlc1tdID0geworICAgIEFVRElPX01PREVfSU5WQUxJRCwgQVVESU9fTU9ERV9DVVJSRU5ULCAgICAgICAgICBBVURJT19NT0RFX05PUk1BTCwgICAgIEFVRElPX01PREVfUklOR1RPTkUsCisgICAgQVVESU9fTU9ERV9JTl9DQUxMLCBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04sIEFVRElPX01PREVfQ0FMTF9TQ1JFRU59OworCitjb25zdGV4cHIgYXVkaW9fc2Vzc2lvbl90IGtTZXNzaW9uSWRbXSA9IHtBVURJT19TRVNTSU9OX05PTkUsIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9ERVZJQ0V9OworCitjb25zdGV4cHIgYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3Qga0VuY2Fwc3VsYXRpb25bXSA9IHsKKyAgICBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfTk9ORSwKKyAgICBBVURJT19FTkNBUFNVTEFUSU9OX01PREVfRUxFTUVOVEFSWV9TVFJFQU0sCisgICAgQVVESU9fRU5DQVBTVUxBVElPTl9NT0RFX0hBTkRMRSwKK307CisKK2NvbnN0ZXhwciBhdWRpb19wb3J0X3JvbGVfdCBrUG9ydFJvbGVzW10gPSB7CisgICAgQVVESU9fUE9SVF9ST0xFX05PTkUsCisgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwKKyAgICBBVURJT19QT1JUX1JPTEVfU0lOSywKK307CisKK2NvbnN0ZXhwciBhdWRpb19wb3J0X3R5cGVfdCBrUG9ydFR5cGVzW10gPSB7CisgICAgQVVESU9fUE9SVF9UWVBFX05PTkUsCisgICAgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICBBVURJT19QT1JUX1RZUEVfTUlYLAorICAgIEFVRElPX1BPUlRfVFlQRV9TRVNTSU9OLAorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFgsIHR5cGVuYW1lIEZVTkM+CitzdGQ6OnZlY3RvcjxUPiBnZXRGbGFncyhjb25zdCB4c2RjX2VudW1fcmFuZ2U8WD4gJnJhbmdlLCBjb25zdCBGVU5DICZmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZpbmRTdHJpbmcgPSB7fSkgeworICAgIHN0ZDo6dmVjdG9yPFQ+IHZlYzsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnhzZEVudW1WYWwgOiByYW5nZSkgeworICAgICAgICBUIGVudW1WYWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVudW1TdHJpbmcgPSB0b1N0cmluZyh4c2RFbnVtVmFsKTsKKyAgICAgICAgaWYgKGVudW1TdHJpbmcuZmluZChmaW5kU3RyaW5nKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgZnVuYyhlbnVtU3RyaW5nLmNfc3RyKCksICZlbnVtVmFsKSkgeworICAgICAgICAgICAgdmVjLnB1c2hfYmFjayhlbnVtVmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmVjOworfQorCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD4ga1N0cmVhbXR5cGVzID0KKyAgICBnZXRGbGFnczxhdWRpb19zdHJlYW1fdHlwZV90LCB4c2Q6OkF1ZGlvU3RyZWFtVHlwZSwgZGVjbHR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfZnJvbV9zdHJpbmcpPigKKyAgICAgICAgeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9TdHJlYW1UeXBlPnt9LCBhdWRpb19zdHJlYW1fdHlwZV9mcm9tX3N0cmluZyk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4ga0Zvcm1hdHMgPQorICAgIGdldEZsYWdzPGF1ZGlvX2Zvcm1hdF90LCB4c2Q6OkF1ZGlvRm9ybWF0LCBkZWNsdHlwZShhdWRpb19mb3JtYXRfZnJvbV9zdHJpbmcpPigKKyAgICAgICAgeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Gb3JtYXQ+e30sIGF1ZGlvX2Zvcm1hdF9mcm9tX3N0cmluZyk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4ga0NoYW5uZWxNYXNrcyA9CisgICAgZ2V0RmxhZ3M8YXVkaW9fY2hhbm5lbF9tYXNrX3QsIHhzZDo6QXVkaW9DaGFubmVsTWFzaywgZGVjbHR5cGUoYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKT4oCisgICAgICAgIHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s+e30sIGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiBrVXNhZ2VzID0KKyAgICBnZXRGbGFnczxhdWRpb191c2FnZV90LCB4c2Q6OkF1ZGlvVXNhZ2UsIGRlY2x0eXBlKGF1ZGlvX3VzYWdlX2Zyb21fc3RyaW5nKT4oCisgICAgICAgIHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvVXNhZ2U+e30sIGF1ZGlvX3VzYWdlX2Zyb21fc3RyaW5nKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NvbnRlbnRfdHlwZV90PiBrQ29udGVudFR5cGUgPQorICAgIGdldEZsYWdzPGF1ZGlvX2NvbnRlbnRfdHlwZV90LCB4c2Q6OkF1ZGlvQ29udGVudFR5cGUsIGRlY2x0eXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV9mcm9tX3N0cmluZyk+KAorICAgICAgICB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NvbnRlbnRUeXBlPnt9LCBhdWRpb19jb250ZW50X3R5cGVfZnJvbV9zdHJpbmcpOworCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fc291cmNlX3Q+IGtJbnB1dFNvdXJjZXMgPQorICAgIGdldEZsYWdzPGF1ZGlvX3NvdXJjZV90LCB4c2Q6OkF1ZGlvU291cmNlLCBkZWNsdHlwZShhdWRpb19zb3VyY2VfZnJvbV9zdHJpbmcpPigKKyAgICAgICAgeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Tb3VyY2U+e30sIGF1ZGlvX3NvdXJjZV9mcm9tX3N0cmluZyk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19nYWluX21vZGVfdD4ga0dhaW5Nb2RlcyA9CisgICAgZ2V0RmxhZ3M8YXVkaW9fZ2Fpbl9tb2RlX3QsIHhzZDo6QXVkaW9HYWluTW9kZSwgZGVjbHR5cGUoYXVkaW9fZ2Fpbl9tb2RlX2Zyb21fc3RyaW5nKT4oCisgICAgICAgIHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvR2Fpbk1vZGU+e30sIGF1ZGlvX2dhaW5fbW9kZV9mcm9tX3N0cmluZyk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IGtEZXZpY2VzID0KKyAgICBnZXRGbGFnczxhdWRpb19kZXZpY2VzX3QsIHhzZDo6QXVkaW9EZXZpY2UsIGRlY2x0eXBlKGF1ZGlvX2RldmljZV9mcm9tX3N0cmluZyk+KAorICAgICAgICB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0RldmljZT57fSwgYXVkaW9fZGV2aWNlX2Zyb21fc3RyaW5nKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2lucHV0X2ZsYWdzX3Q+IGtJbnB1dEZsYWdzID0KKyAgICBnZXRGbGFnczxhdWRpb19pbnB1dF9mbGFnc190LCB4c2Q6OkF1ZGlvSW5PdXRGbGFnLCBkZWNsdHlwZShhdWRpb19pbnB1dF9mbGFnX2Zyb21fc3RyaW5nKT4oCisgICAgICAgIHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvSW5PdXRGbGFnPnt9LCBhdWRpb19pbnB1dF9mbGFnX2Zyb21fc3RyaW5nLCAiX0lOUFVUXyIpOworCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGtPdXRwdXRGbGFncyA9CisgICAgZ2V0RmxhZ3M8YXVkaW9fb3V0cHV0X2ZsYWdzX3QsIHhzZDo6QXVkaW9Jbk91dEZsYWcsIGRlY2x0eXBlKGF1ZGlvX291dHB1dF9mbGFnX2Zyb21fc3RyaW5nKT4oCisgICAgICAgIHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvSW5PdXRGbGFnPnt9LCBhdWRpb19vdXRwdXRfZmxhZ19mcm9tX3N0cmluZywgIl9PVVRQVVRfIik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3Qgc2l6ZT4KK1QgZ2V0VmFsdWUoRnV6emVkRGF0YVByb3ZpZGVyICpmZHAsIGNvbnN0IFQgKCZhcnIpW3NpemVdKSB7CisgICAgcmV0dXJuIGFycltmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oMCwgc2l6ZSAtIDEpXTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIGdldFZhbHVlKEZ1enplZERhdGFQcm92aWRlciAqZmRwLCBzdGQ6OnZlY3RvcjxUPiB2ZWMpIHsKKyAgICByZXR1cm4gdmVjW2ZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCB2ZWMuc2l6ZSgpIC0gMSldOworfQorCitpbnQzMl90IGdldFNhbXBsZVJhdGUoRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIHsKKyAgICBpZiAoZmRwLT5Db25zdW1lQm9vbCgpKSB7CisgICAgICAgIHJldHVybiBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oa01pblNhbXBsZVJhdGVIeiwga01heFNhbXBsZVJhdGVIeik7CisgICAgfQorICAgIHJldHVybiBrU2FtcGxlUmF0ZVVuc3BlY2lmaWVkOworfQorCitjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJikgeyBhYm9ydCgpOyB9Cit9OworCitjbGFzcyBBdWRpb0ZsaW5nZXJGdXp6ZXIgeworICAgcHVibGljOgorICAgIEF1ZGlvRmxpbmdlckZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBwcm9jZXNzKCk7CisKKyAgIHByaXZhdGU6CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIG1GZHA7CisgICAgdm9pZCBpbnZva2VBdWRpb1RyYWNrKCk7CisgICAgdm9pZCBpbnZva2VBdWRpb1JlY29yZCgpOworICAgIHN0YXR1c190IGludm9rZUF1ZGlvRWZmZWN0KCk7CisgICAgdm9pZCBpbnZva2VBdWRpb1N5c3RlbSgpOworICAgIHN0YXR1c190IGludm9rZUF1ZGlvSW5wdXREZXZpY2UoKTsKKyAgICBzdGF0dXNfdCBpbnZva2VBdWRpb091dHB1dERldmljZSgpOworICAgIHZvaWQgaW52b2tlQXVkaW9QYXRjaCgpOworCisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7Cit9OworCitBdWRpb0ZsaW5nZXJGdXp6ZXI6OkF1ZGlvRmxpbmdlckZ1enplcihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgOiBtRmRwKGRhdGEsIHNpemUpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiKSk7CisgICAgaWYgKGJpbmRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOworICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlckZ1enplcjo6aW52b2tlQXVkaW9UcmFjaygpIHsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgmbUZkcCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZ2V0VmFsdWUoJm1GZHAsIGtGb3JtYXRzKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGdldFZhbHVlKCZtRmRwLCBrQ2hhbm5lbE1hc2tzKTsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IHN0YXRpY19jYXN0PHNpemVfdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOworICAgIGludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICB1aW50MzJfdCB1c2VTaGFyZWRCdWZmZXIgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBnZXRWYWx1ZSgmbUZkcCwga091dHB1dEZsYWdzKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gZ2V0VmFsdWUoJm1GZHAsIGtTZXNzaW9uSWQpOworICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBnZXRWYWx1ZSgmbUZkcCwga1VzYWdlcyk7CisgICAgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUgPSBnZXRWYWx1ZSgmbUZkcCwga0NvbnRlbnRUeXBlKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcjsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IGhlYXAgPSBudWxscHRyOworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKworICAgIGJvb2wgb2ZmbG9hZCA9IGZhbHNlOworICAgIGJvb2wgZmFzdCA9ICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSAhPSAwKTsKKworICAgIGlmICh1c2VTaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICBzaXplX3QgaGVhcFNpemUgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogZnJhbWVDb3VudDsKKyAgICAgICAgaGVhcCA9IG5ldyBNZW1vcnlEZWFsZXIoaGVhcFNpemUsICJBdWRpb1RyYWNrIEhlYXAgQmFzZSIpOworICAgICAgICBzaGFyZWRCdWZmZXIgPSBoZWFwLT5hbGxvY2F0ZShoZWFwU2l6ZSk7CisgICAgICAgIGZyYW1lQ291bnQgPSAwOworICAgICAgICBub3RpZmljYXRpb25GcmFtZXMgPSAwOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIG9mZmxvYWQgPSB0cnVlOworICAgIH0KKworICAgIGF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gY29udGVudFR5cGU7CisgICAgYXR0cmlidXRlcy51c2FnZSA9IHVzYWdlOworICAgIHNwPEF1ZGlvVHJhY2s+IHRyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKKworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoZ2V0cGlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgdHJhY2stPnNldChBVURJT19TVFJFQU1fREVGQVVMVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG51bGxwdHIsCisgICAgICAgICAgICAgICBudWxscHRyLCBub3RpZmljYXRpb25GcmFtZXMsIHNoYXJlZEJ1ZmZlciwgZmFsc2UsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICgoZmFzdCAmJiBzaGFyZWRCdWZmZXIgPT0gMCkgfHwgb2ZmbG9hZCkgPyBBdWRpb1RyYWNrOjpUUkFOU0ZFUl9DQUxMQkFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgICAgICAgICBvZmZsb2FkID8gJm9mZmxvYWRJbmZvIDogbnVsbHB0ciwgYXR0cmlidXRpb25Tb3VyY2UsICZhdHRyaWJ1dGVzLCBmYWxzZSwgMS4wZiwKKyAgICAgICAgICAgICAgIEFVRElPX1BPUlRfSEFORExFX05PTkUpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgdHJhY2suY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0cmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHRyYWNrLT5sYXRlbmN5KCk7CisgICAgdHJhY2stPmdldFVuZGVycnVuQ291bnQoKTsKKyAgICB0cmFjay0+c3RyZWFtVHlwZSgpOworICAgIHRyYWNrLT5jaGFubmVsQ291bnQoKTsKKyAgICB0cmFjay0+Z2V0Tm90aWZpY2F0aW9uUGVyaW9kSW5GcmFtZXMoKTsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplSW5GcmFtZXMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICB0cmFjay0+c2V0QnVmZmVyU2l6ZUluRnJhbWVzKGJ1ZmZlclNpemVJbkZyYW1lcyk7CisgICAgdHJhY2stPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpOworCisgICAgaW50NjRfdCBkdXJhdGlvbiA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgdHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pOworICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcjIgPSB0cmFjay0+c2hhcmVkQnVmZmVyKCk7CisgICAgdHJhY2stPnNldENhbGxlck5hbWUobUZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKE1BWF9TVFJJTkdfTEVOR1RIKSk7CisKKyAgICB0cmFjay0+c2V0Vm9sdW1lKG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCksIG1GZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCkpOworICAgIHRyYWNrLT5zZXRWb2x1bWUobUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSk7CisgICAgdHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKworICAgIGZsb2F0IGF1eEVmZmVjdFNlbmRMZXZlbDsKKyAgICB0cmFjay0+Z2V0QXV4RWZmZWN0U2VuZExldmVsKCZhdXhFZmZlY3RTZW5kTGV2ZWwpOworICAgIHRyYWNrLT5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoJm1GZHApKTsKKyAgICB0cmFjay0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHRyYWNrLT5nZXRPcmlnaW5hbFNhbXBsZVJhdGUoKTsKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHt9OworICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQgPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIHBsYXliYWNrUmF0ZS5tUGl0Y2ggPSBtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpOworICAgIHRyYWNrLT5zZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTsKKyAgICB0cmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgdHJhY2stPnNldExvb3AobUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCksIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgICB0cmFjay0+c2V0TWFya2VyUG9zaXRpb24obUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOworCisgICAgdWludDMyX3QgbWFya2VyID0ge307CisgICAgdHJhY2stPmdldE1hcmtlclBvc2l0aW9uKCZtYXJrZXIpOworICAgIHRyYWNrLT5zZXRQb3NpdGlvblVwZGF0ZVBlcmlvZChtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisKKyAgICB1aW50MzJfdCB1cGRhdGVQZXJpb2QgPSB7fTsKKyAgICB0cmFjay0+Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoJnVwZGF0ZVBlcmlvZCk7CisgICAgdHJhY2stPnNldFBvc2l0aW9uKG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpKTsKKyAgICB1aW50MzJfdCBwb3NpdGlvbiA9IHt9OworICAgIHRyYWNrLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOworICAgIHRyYWNrLT5nZXRCdWZmZXJQb3NpdGlvbigmcG9zaXRpb24pOworICAgIHRyYWNrLT5yZWxvYWQoKTsKKyAgICB0cmFjay0+c3RhcnQoKTsKKyAgICB0cmFjay0+cGF1c2UoKTsKKyAgICB0cmFjay0+Zmx1c2goKTsKKyAgICB0cmFjay0+c3RvcCgpOworICAgIHRyYWNrLT5zdG9wcGVkKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyRnV6emVyOjppbnZva2VBdWRpb1JlY29yZCgpIHsKKyAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoJm1GZHApOworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZ2V0VmFsdWUoJm1GZHAsIGtGb3JtYXRzKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGdldFZhbHVlKCZtRmRwLCBrQ2hhbm5lbE1hc2tzKTsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gZ2V0VmFsdWUoJm1GZHAsIGtJbnB1dEZsYWdzKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gZ2V0VmFsdWUoJm1GZHAsIGtTZXNzaW9uSWQpOworICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlID0gZ2V0VmFsdWUoJm1GZHAsIGtJbnB1dFNvdXJjZXMpOworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICBib29sIGZhc3QgPSAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMCk7CisKKyAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IGlucHV0U291cmNlOworCisgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IHN0ZDo6c3RyaW5nKG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBzcDxBdWRpb1JlY29yZD4gcmVjb3JkID0gbmV3IEF1ZGlvUmVjb3JkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICByZWNvcmQtPnNldChBVURJT19TT1VSQ0VfREVGQVVMVCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZhbHNlLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgZmFzdCA/IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9DQUxMQkFDSyA6IEF1ZGlvUmVjb3JkOjpUUkFOU0ZFUl9ERUZBVUxULCBmbGFncywKKyAgICAgICAgICAgICAgICBnZXR1aWQoKSwgZ2V0cGlkKCksICZhdHRyaWJ1dGVzLCBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWNvcmQtPmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZWNvcmQtPmxhdGVuY3koKTsKKyAgICByZWNvcmQtPmZvcm1hdCgpOworICAgIHJlY29yZC0+Y2hhbm5lbENvdW50KCk7CisgICAgcmVjb3JkLT5mcmFtZUNvdW50KCk7CisgICAgcmVjb3JkLT5mcmFtZVNpemUoKTsKKyAgICByZWNvcmQtPmlucHV0U291cmNlKCk7CisgICAgcmVjb3JkLT5nZXROb3RpZmljYXRpb25QZXJpb2RJbkZyYW1lcygpOworICAgIHJlY29yZC0+c3RhcnQoKTsKKyAgICByZWNvcmQtPnN0b3AoKTsKKyAgICByZWNvcmQtPnN0b3BwZWQoKTsKKworICAgIHVpbnQzMl90IG1hcmtlciA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIHJlY29yZC0+c2V0TWFya2VyUG9zaXRpb24obWFya2VyKTsKKyAgICByZWNvcmQtPmdldE1hcmtlclBvc2l0aW9uKCZtYXJrZXIpOworCisgICAgdWludDMyX3QgdXBkYXRlUGVyaW9kID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgcmVjb3JkLT5zZXRQb3NpdGlvblVwZGF0ZVBlcmlvZCh1cGRhdGVQZXJpb2QpOworICAgIHJlY29yZC0+Z2V0UG9zaXRpb25VcGRhdGVQZXJpb2QoJnVwZGF0ZVBlcmlvZCk7CisKKyAgICB1aW50MzJfdCBwb3NpdGlvbjsKKyAgICByZWNvcmQtPmdldFBvc2l0aW9uKCZwb3NpdGlvbik7CisKKyAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7CisgICAgcmVjb3JkLT5nZXRUaW1lc3RhbXAoJnRpbWVzdGFtcCk7CisgICAgcmVjb3JkLT5nZXRTZXNzaW9uSWQoKTsKKyAgICByZWNvcmQtPmdldENhbGxlck5hbWUoKTsKKyAgICBhbmRyb2lkOjpBdWRpb1JlY29yZDo6QnVmZmVyIGF1ZGlvQnVmZmVyOworICAgIGludDMyX3Qgd2FpdENvdW50ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBzaXplX3Qgbm9uQ29udGlnID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKSk7CisgICAgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IHN0YXRpY19jYXN0PHNpemVfdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpOworICAgIHJlY29yZC0+b2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgd2FpdENvdW50LCAmbm9uQ29udGlnKTsKKyAgICBib29sIGJsb2NraW5nID0gZmFsc2U7CisgICAgcmVjb3JkLT5yZWFkKGF1ZGlvQnVmZmVyLnJhdywgYXVkaW9CdWZmZXIuc2l6ZSwgYmxvY2tpbmcpOworICAgIHJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCk7CisgICAgcmVjb3JkLT5nZXRGbGFncygpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBhY3RpdmVNaWNyb3Bob25lczsKKyAgICByZWNvcmQtPmdldEFjdGl2ZU1pY3JvcGhvbmVzKCZhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgcmVjb3JkLT5yZWxlYXNlQnVmZmVyKCZhdWRpb0J1ZmZlcik7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fcG9ydF9oYW5kbGVfdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgcmVjb3JkLT5zZXRJbnB1dERldmljZShkZXZpY2VJZCk7CisgICAgcmVjb3JkLT5nZXRJbnB1dERldmljZSgpOworICAgIHJlY29yZC0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICByZWNvcmQtPmdldFBvcnRJZCgpOworfQorCitzdHJ1Y3QgRWZmZWN0Q2xpZW50IDogcHVibGljIGFuZHJvaWQ6Om1lZGlhOjpCbkVmZmVjdENsaWVudCB7CisgICAgRWZmZWN0Q2xpZW50KCkge30KKyAgICBiaW5kZXI6OlN0YXR1cyBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgYmluZGVyOjpTdGF0dXMgZW5hYmxlU3RhdHVzQ2hhbmdlZChib29sIGVuYWJsZWQgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKyAgICBiaW5kZXI6OlN0YXR1cyBjb21tYW5kRXhlY3V0ZWQoaW50MzJfdCBjbWRDb2RlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmY21kRGF0YSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnJlcGx5RGF0YSBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorfTsKKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyRnV6emVyOjppbnZva2VBdWRpb0VmZmVjdCgpIHsKKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgdHlwZS50aW1lTG93ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgdHlwZS50aW1lTWlkID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7CisgICAgdHlwZS50aW1lSGlBbmRWZXJzaW9uID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDE2X3Q+KCk7CisgICAgdHlwZS5jbG9ja1NlcSA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQxNl90PigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgKytpKSB7CisgICAgICAgIHR5cGUubm9kZVtpXSA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgICAgfQorCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgZGVzY3JpcHRvci50eXBlID0gdHlwZTsKKyAgICBkZXNjcmlwdG9yLnV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKworICAgIHNwPEVmZmVjdENsaWVudD4gZWZmZWN0Q2xpZW50KG5ldyBFZmZlY3RDbGllbnQoKSk7CisKKyAgICBjb25zdCBpbnQzMl90IHByaW9yaXR5ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc2Vzc2lvbl90PihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbyA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgc3RkOjpzdHJpbmcgb3BQYWNrYWdlTmFtZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nPihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKKworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKCFhZikgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QgcmVxdWVzdHt9OworICAgIHJlcXVlc3QuZGVzYyA9CisgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKGRlc2NyaXB0b3IpKTsKKyAgICByZXF1ZXN0LmNsaWVudCA9IGVmZmVjdENsaWVudDsKKyAgICByZXF1ZXN0LnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmVxdWVzdC5vdXRwdXQgPSBpbzsKKyAgICByZXF1ZXN0LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2UpKTsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICByZXF1ZXN0LmF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKKyAgICByZXF1ZXN0LmF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChnZXRwaWQoKSkpOworICAgIHJlcXVlc3QucHJvYmUgPSBmYWxzZTsKKworICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSByZXNwb25zZXt9OworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5jcmVhdGVFZmZlY3QocmVxdWVzdCwgJnJlc3BvbnNlKTsKKworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGRlc2NyaXB0b3IgPQorICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0VmZmVjdERlc2NyaXB0b3JfZWZmZWN0X2Rlc2NyaXB0b3JfdChyZXNwb25zZS5kZXNjKSk7CisKKyAgICB1aW50MzJfdCBudW1FZmZlY3RzOworICAgIGFmLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworCisgICAgdWludDMyX3QgcXVlcnlJbmRleCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIGFmLT5xdWVyeUVmZmVjdChxdWVyeUluZGV4LCAmZGVzY3JpcHRvcik7CisKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGdldERlc2NyaXB0b3I7CisgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKCZkZXNjcmlwdG9yLnV1aWQsICZkZXNjcmlwdG9yLnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZ2V0RGVzY3JpcHRvcik7CisKKyAgICBzZXNzaW9uSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zZXNzaW9uX3Q+KG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBhZi0+bW92ZUVmZmVjdHMoc2Vzc2lvbklkLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisKKyAgICBpbnQgZWZmZWN0SWQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIHNlc3Npb25JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3Nlc3Npb25fdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgYWYtPnNldEVmZmVjdFN1c3BlbmRlZChlZmZlY3RJZCwgc2Vzc2lvbklkLCBtRmRwLkNvbnN1bWVCb29sKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJGdXp6ZXI6Omludm9rZUF1ZGlvU3lzdGVtKCkgeworICAgIEF1ZGlvU3lzdGVtOjptdXRlTWljcm9waG9uZShtRmRwLkNvbnN1bWVCb29sKCkpOworICAgIEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJNdXRlKG1GZHAuQ29uc3VtZUJvb2woKSk7CisgICAgQXVkaW9TeXN0ZW06OnNldE1hc3RlclZvbHVtZShtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyQmFsYW5jZShtRmRwLkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUobUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSk7CisKKyAgICBmbG9hdCB2b2x1bWU7CisgICAgQXVkaW9TeXN0ZW06OmdldE1hc3RlclZvbHVtZSgmdm9sdW1lKTsKKworICAgIGJvb2wgc3RhdGU7CisgICAgQXVkaW9TeXN0ZW06OmdldE1hc3Rlck11dGUoJnN0YXRlKTsKKyAgICBBdWRpb1N5c3RlbTo6aXNNaWNyb3Bob25lTXV0ZWQoJnN0YXRlKTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gZ2V0VmFsdWUoJm1GZHAsIGtTdHJlYW10eXBlcyk7CisgICAgQXVkaW9TeXN0ZW06OnNldFN0cmVhbU11dGUoZ2V0VmFsdWUoJm1GZHAsIGtTdHJlYW10eXBlcyksIG1GZHAuQ29uc3VtZUJvb2woKSk7CisKKyAgICBzdHJlYW0gPSBnZXRWYWx1ZSgmbUZkcCwga1N0cmVhbXR5cGVzKTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgYXVkaW9fbW9kZV90IG1vZGUgPSBnZXRWYWx1ZSgmbUZkcCwga01vZGVzKTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0TW9kZShtb2RlKTsKKworICAgIHNpemVfdCBmcmFtZUNvdW50OworICAgIHN0cmVhbSA9IGdldFZhbHVlKCZtRmRwLCBrU3RyZWFtdHlwZXMpOworICAgIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCZmcmFtZUNvdW50LCBzdHJlYW0pOworCisgICAgdWludDMyX3QgbGF0ZW5jeTsKKyAgICBzdHJlYW0gPSBnZXRWYWx1ZSgmbUZkcCwga1N0cmVhbXR5cGVzKTsKKyAgICBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmbGF0ZW5jeSwgc3RyZWFtKTsKKworICAgIHN0cmVhbSA9IGdldFZhbHVlKCZtRmRwLCBrU3RyZWFtdHlwZXMpOworICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCAmdm9sdW1lLCBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIHN0cmVhbSA9IGdldFZhbHVlKCZtRmRwLCBrU3RyZWFtdHlwZXMpOworICAgIEF1ZGlvU3lzdGVtOjpnZXRTdHJlYW1NdXRlKHN0cmVhbSwgJnN0YXRlKTsKKworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZTsKKyAgICBBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCksICZzYW1wbGluZ1JhdGUpOworCisgICAgQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnQobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwgJmZyYW1lQ291bnQpOworICAgIEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCksICZsYXRlbmN5KTsKKyAgICBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUobUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKSk7CisKKyAgICB1aW50MzJfdCBoYWxGcmFtZXM7CisgICAgdWludDMyX3QgZHNwRnJhbWVzOworICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLCAmaGFsRnJhbWVzLCAmZHNwRnJhbWVzKTsKKworICAgIEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZyYW1lc0xvc3QobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1bmlxdWVJZFVzZSA9IGdldFZhbHVlKCZtRmRwLCBrVW5pcXVlSWRzKTsKKyAgICBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCh1bmlxdWVJZFVzZSk7CisKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gZ2V0VmFsdWUoJm1GZHAsIGtTZXNzaW9uSWQpOworICAgIHBpZF90IHBpZCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IGdldHBpZCgpIDogbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICB1aWRfdCB1aWQgPSBtRmRwLkNvbnN1bWVCb29sKCkgPyBnZXR1aWQoKSA6IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIHBpZCwgdWlkKTsKKworICAgIHBpZCA9IG1GZHAuQ29uc3VtZUJvb2woKSA/IGdldHBpZCgpIDogbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBzZXNzaW9uSWQgPSBnZXRWYWx1ZSgmbUZkcCwga1Nlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIHBpZCk7CisKKyAgICBzZXNzaW9uSWQgPSBnZXRWYWx1ZSgmbUZkcCwga1Nlc3Npb25JZCk7CisgICAgQXVkaW9TeXN0ZW06OmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihzZXNzaW9uSWQpOworCisgICAgQXVkaW9TeXN0ZW06OnN5c3RlbVJlYWR5KCk7CisgICAgQXVkaW9TeXN0ZW06OmdldEZyYW1lQ291bnRIQUwobUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSwgJmZyYW1lQ291bnQpOworCisgICAgc2l6ZV90IGJ1ZmZTaXplOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBnZXRTYW1wbGVSYXRlKCZtRmRwKTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBnZXRWYWx1ZSgmbUZkcCwga0Zvcm1hdHMpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZ2V0VmFsdWUoJm1GZHAsIGtDaGFubmVsTWFza3MpOworICAgIEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgJmJ1ZmZTaXplKTsKKworICAgIEF1ZGlvU3lzdGVtOjpnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CisgICAgQXVkaW9TeXN0ZW06OmdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCk7CisgICAgQXVkaW9TeXN0ZW06OnNldExvd1JhbURldmljZShtRmRwLkNvbnN1bWVCb29sKCksIG1GZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBtaWNyb3Bob25lczsKKyAgICBBdWRpb1N5c3RlbTo6Z2V0TWljcm9waG9uZXMoJm1pY3JvcGhvbmVzKTsKKworICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzOworICAgIHBpZHMuaW5zZXJ0KHBpZHMuYmVnaW4oKSwgZ2V0cGlkKCkpOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbUZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KDIsIE1BWF9BUlJBWV9MRU5HVEgpOyArK2kpIHsKKyAgICAgICAgcGlkcy5pbnNlcnQocGlkcy5iZWdpbigpICsgaSwgc3RhdGljX2Nhc3Q8cGlkX3Q+KG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpKTsKKyAgICB9CisgICAgQXVkaW9TeXN0ZW06OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmICghYWYpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhZi0+c2V0UmVjb3JkU2lsZW5jZWQobUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCksIG1GZHAuQ29uc3VtZUJvb2woKSk7CisKKyAgICBmbG9hdCBiYWxhbmNlID0gbUZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxmbG9hdD4oKTsKKyAgICBhZi0+Z2V0TWFzdGVyQmFsYW5jZSgmYmFsYW5jZSk7CisgICAgYWYtPmludmFsaWRhdGVTdHJlYW0oc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4obUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCkpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyRnV6emVyOjppbnZva2VBdWRpb0lucHV0RGV2aWNlKCkgeworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKCFhZikgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGNvbmZpZy5mcmFtZV9jb3VudCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIFN0cmluZzggYWRkcmVzcyA9IHN0YXRpY19jYXN0PFN0cmluZzg+KG1GZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworCisgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGdldFZhbHVlKCZtRmRwLCBrQ2hhbm5lbE1hc2tzKTsKKyAgICBjb25maWcuZm9ybWF0ID0gZ2V0VmFsdWUoJm1GZHAsIGtGb3JtYXRzKTsKKworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uYml0X3JhdGUgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmJpdF93aWR0aCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY29udGVudF9pZCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gZ2V0VmFsdWUoJm1GZHAsIGtDaGFubmVsTWFza3MpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZHVyYXRpb25fdXMgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZW5jYXBzdWxhdGlvbl9tb2RlID0gZ2V0VmFsdWUoJm1GZHAsIGtFbmNhcHN1bGF0aW9uKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGdldFZhbHVlKCZtRmRwLCBrRm9ybWF0cyk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5oYXNfdmlkZW8gPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5pc19zdHJlYW1pbmcgPSBtRmRwLkNvbnN1bWVCb29sKCk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGdldFNhbXBsZVJhdGUoJm1GZHApOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZCA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc3RyZWFtX3R5cGUgPSBnZXRWYWx1ZSgmbUZkcCwga1N0cmVhbXR5cGVzKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLnVzYWdlID0gZ2V0VmFsdWUoJm1GZHAsIGtVc2FnZXMpOworCisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gZ2V0U2FtcGxlUmF0ZSgmbUZkcCk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0VmFsdWUoJm1GZHAsIGtEZXZpY2VzKTsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBnZXRWYWx1ZSgmbUZkcCwga0lucHV0U291cmNlcyk7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGdldFZhbHVlKCZtRmRwLCBrSW5wdXRGbGFncyk7CisKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcy5jX3N0cigpKTsKKworICAgIG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0IHJlcXVlc3R7fTsKKyAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7CisgICAgcmVxdWVzdC5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dCkpOworICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZyhjb25maWcpKTsKKyAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VUeXBlQWRkcikpOworICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKKworICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSByZXNwb25zZXt9OworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuSW5wdXQocmVxdWVzdCwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19tb2R1bGVfaGFuZGxlX3QocmVzcG9uc2UuaW5wdXQpKTsKKyAgICBhZi0+Y2xvc2VJbnB1dChpbnB1dCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXJGdXp6ZXI6Omludm9rZUF1ZGlvT3V0cHV0RGV2aWNlKCkgeworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKCFhZikgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0ge307CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBjb25maWcuZnJhbWVfY291bnQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSBzdGF0aWNfY2FzdDxTdHJpbmc4PihtRmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBnZXRWYWx1ZSgmbUZkcCwga0NoYW5uZWxNYXNrcyk7CisKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmJpdF9yYXRlID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5iaXRfd2lkdGggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGdldFZhbHVlKCZtRmRwLCBrQ2hhbm5lbE1hc2tzKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNvbnRlbnRfaWQgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmR1cmF0aW9uX3VzID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLmVuY2Fwc3VsYXRpb25fbW9kZSA9IGdldFZhbHVlKCZtRmRwLCBrRW5jYXBzdWxhdGlvbik7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBnZXRWYWx1ZSgmbUZkcCwga0Zvcm1hdHMpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uaGFzX3ZpZGVvID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uaXNfc3RyZWFtaW5nID0gbUZkcC5Db25zdW1lQm9vbCgpOworICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBnZXRTYW1wbGVSYXRlKCZtRmRwKTsKKyAgICBjb25maWcub2ZmbG9hZF9pbmZvLnN0cmVhbV90eXBlID0gZ2V0VmFsdWUoJm1GZHAsIGtTdHJlYW10eXBlcyk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zeW5jX2lkID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgY29uZmlnLm9mZmxvYWRfaW5mby51c2FnZSA9IGdldFZhbHVlKCZtRmRwLCBrVXNhZ2VzKTsKKworICAgIGNvbmZpZy5mb3JtYXQgPSBnZXRWYWx1ZSgmbUZkcCwga0Zvcm1hdHMpOworICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGdldFNhbXBsZVJhdGUoJm1GZHApOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShnZXRWYWx1ZSgmbUZkcCwga0RldmljZXMpKTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IGdldFZhbHVlKCZtRmRwLCBrT3V0cHV0RmxhZ3MpOworCisgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0IHJlcXVlc3R7fTsKKyAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlIHJlc3BvbnNle307CisKKyAgICByZXF1ZXN0Lm1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kdWxlX2hhbmRsZV90X2ludDMyX3QobW9kdWxlKSk7CisgICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIHJlcXVlc3QuZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2UpKTsKKyAgICByZXF1ZXN0LmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5vcGVuT3V0cHV0KHJlcXVlc3QsICZyZXNwb25zZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIG91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChyZXNwb25zZS5vdXRwdXQpKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEgPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGFmLT5vcGVuRHVwbGljYXRlT3V0cHV0KG91dHB1dCwgb3V0cHV0MSk7CisgICAgYWYtPnN1c3BlbmRPdXRwdXQob3V0cHV0KTsKKyAgICBhZi0+cmVzdG9yZU91dHB1dChvdXRwdXQpOworICAgIGFmLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXJGdXp6ZXI6Omludm9rZUF1ZGlvUGF0Y2goKSB7CisgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoIWFmKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoID0ge307CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKworICAgIHBhdGNoLmlkID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIHBhdGNoLm51bV9zaW5rcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7ICsraSkgeworICAgICAgICBwYXRjaC5zb3VyY2VzW2ldLmNvbmZpZ19tYXNrID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbaV0uY2hhbm5lbF9tYXNrID0gZ2V0VmFsdWUoJm1GZHAsIGtDaGFubmVsTWFza3MpOworICAgICAgICBwYXRjaC5zb3VyY2VzW2ldLmZvcm1hdCA9IGdldFZhbHVlKCZtRmRwLCBrRm9ybWF0cyk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbaV0uZ2Fpbi5jaGFubmVsX21hc2sgPSBnZXRWYWx1ZSgmbUZkcCwga0NoYW5uZWxNYXNrcyk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbaV0uZ2Fpbi5pbmRleCA9IG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbaV0uZ2Fpbi5tb2RlID0gZ2V0VmFsdWUoJm1GZHAsIGtHYWluTW9kZXMpOworICAgICAgICBwYXRjaC5zb3VyY2VzW2ldLmdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgICAgICBwYXRjaC5zb3VyY2VzW2ldLmlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KG1GZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgICAgICBwYXRjaC5zb3VyY2VzW2ldLnJvbGUgPSBnZXRWYWx1ZSgmbUZkcCwga1BvcnRSb2xlcyk7CisgICAgICAgIHBhdGNoLnNvdXJjZXNbaV0uc2FtcGxlX3JhdGUgPSBnZXRTYW1wbGVSYXRlKCZtRmRwKTsKKyAgICAgICAgcGF0Y2guc291cmNlc1tpXS50eXBlID0gZ2V0VmFsdWUoJm1GZHAsIGtQb3J0VHlwZXMpOworCisgICAgICAgIHBhdGNoLnNpbmtzW2ldLmNvbmZpZ19tYXNrID0gbUZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgICAgIHBhdGNoLnNpbmtzW2ldLmNoYW5uZWxfbWFzayA9IGdldFZhbHVlKCZtRmRwLCBrQ2hhbm5lbE1hc2tzKTsKKyAgICAgICAgcGF0Y2guc2lua3NbaV0uZm9ybWF0ID0gZ2V0VmFsdWUoJm1GZHAsIGtGb3JtYXRzKTsKKyAgICAgICAgcGF0Y2guc2lua3NbaV0uZ2Fpbi5jaGFubmVsX21hc2sgPSBnZXRWYWx1ZSgmbUZkcCwga0NoYW5uZWxNYXNrcyk7CisgICAgICAgIHBhdGNoLnNpbmtzW2ldLmdhaW4uaW5kZXggPSBtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICBwYXRjaC5zaW5rc1tpXS5nYWluLm1vZGUgPSBnZXRWYWx1ZSgmbUZkcCwga0dhaW5Nb2Rlcyk7CisgICAgICAgIHBhdGNoLnNpbmtzW2ldLmdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgICAgICBwYXRjaC5zaW5rc1tpXS5pZCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihtRmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgcGF0Y2guc2lua3NbaV0ucm9sZSA9IGdldFZhbHVlKCZtRmRwLCBrUG9ydFJvbGVzKTsKKyAgICAgICAgcGF0Y2guc2lua3NbaV0uc2FtcGxlX3JhdGUgPSBnZXRTYW1wbGVSYXRlKCZtRmRwKTsKKyAgICAgICAgcGF0Y2guc2lua3NbaV0udHlwZSA9IGdldFZhbHVlKCZtRmRwLCBrUG9ydFR5cGVzKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVuc2lnbmVkIGludCBudW1fcGF0Y2hlcyA9IG1GZHAuQ29uc3VtZUludGVncmFsPHVpbnQzMl90PigpOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaGVzID0ge307CisgICAgYWYtPmxpc3RBdWRpb1BhdGNoZXMoJm51bV9wYXRjaGVzLCAmcGF0Y2hlcyk7CisgICAgYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyRnV6emVyOjpwcm9jZXNzKCkgeworICAgIGludm9rZUF1ZGlvRWZmZWN0KCk7CisgICAgaW52b2tlQXVkaW9JbnB1dERldmljZSgpOworICAgIGludm9rZUF1ZGlvT3V0cHV0RGV2aWNlKCk7CisgICAgaW52b2tlQXVkaW9QYXRjaCgpOworICAgIGludm9rZUF1ZGlvUmVjb3JkKCk7CisgICAgaW52b2tlQXVkaW9TeXN0ZW0oKTsKKyAgICBpbnZva2VBdWRpb1RyYWNrKCk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEF1ZGlvRmxpbmdlckZ1enplciBhdWRpb0Z1enplcihkYXRhLCBzaXplKTsKKyAgICBhdWRpb0Z1enplci5wcm9jZXNzKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNjljNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb24uaApAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0ludGVybmFsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Db25maWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQ29uZmlnQmFzZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9EdWFsTW9ub01vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9FbmNhcHN1bGF0aW9uVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9GbGFnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0dhaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbk1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvSW5wdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Jb0NvbmZpZ0V2ZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhMYXRlbmN5Q2xhc3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTW9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9PdXRwdXRGbGFncy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9QbGF5YmFja1JhdGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0RGV2aWNlRXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnRFeHQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydE1peEV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0U2Vzc2lvbkV4dC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcEludGVybmFsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1VuaXF1ZUlkVXNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FZmZlY3REZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gbWF4U2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgQy1zdHJpbmcgYnVmZmVyIChpbmNsdWRpbmcgdGhlIDAtdGVybWluYXRvciksIE5PVCB0aGUgbWF4IGxlbmd0aCBvZgorLy8gdGhlIHN0cmluZy4KK3N0YXR1c190IGFpZGwybGVnYWN5X3N0cmluZyhzdGQ6OnN0cmluZ192aWV3IGFpZGwsIGNoYXIqIGRlc3QsIHNpemVfdCBtYXhTaXplKTsKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpzdHJpbmc+IGxlZ2FjeTJhaWRsX3N0cmluZyhjb25zdCBjaGFyKiBsZWdhY3ksIHNpemVfdCBtYXhTaXplKTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19tb2R1bGVfaGFuZGxlX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2lvX2hhbmRsZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoYXVkaW9faW9faGFuZGxlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2hhbmRsZV90PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX3BvcnRfaGFuZGxlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdW5pcXVlX2lkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChhdWRpb191bmlxdWVfaWRfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2h3X3N5bmNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19od19zeW5jX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9faHdfc3luY190X2ludDMyX3QoYXVkaW9faHdfc3luY190IGxlZ2FjeSk7CisKKy8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnVHlwZV9pbnQzMl90KAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnVHlwZSBhaWRsKTsKKy8vIFRoZSBsZWdhY3kgZW51bSBpcyB1bm5hbWVkLiBUaHVzLCB3ZSB1c2UgaW50MzJfdC4KK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1R5cGU+IGxlZ2FjeTJhaWRsX2ludDMyX3RfQXVkaW9Qb3J0Q29uZmlnVHlwZSgKKyAgICAgICAgaW50MzJfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHVuc2lnbmVkIGludD4gYWlkbDJsZWdhY3lfaW50MzJfdF9jb25maWdfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9jb25maWdfbWFza19pbnQzMl90KHVuc2lnbmVkIGludCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NoYW5uZWxfbWFza190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxwaWRfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KHBpZF90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWlkX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCh1aWRfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PFN0cmluZzg+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzgoc3RkOjpzdHJpbmdfdmlldyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpzdHJpbmc+IGxlZ2FjeTJhaWRsX1N0cmluZzhfc3RyaW5nKGNvbnN0IFN0cmluZzgmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8U3RyaW5nMTY+IGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KHN0ZDo6c3RyaW5nX3ZpZXcgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6c3RyaW5nPiBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcoY29uc3QgU3RyaW5nMTYmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxTdHJpbmcxNj4+CithaWRsMmxlZ2FjeV9vcHRpb25hbF9zdHJpbmdfdmlld19vcHRpb25hbF9TdHJpbmcxNihzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nX3ZpZXc+IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nX3ZpZXc+PgorbGVnYWN5MmFpZGxfb3B0aW9uYWxfU3RyaW5nMTZfb3B0aW9uYWxfc3RyaW5nKHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fY29uZmlnX2V2ZW50PiBhaWRsMmxlZ2FjeV9BdWRpb0lvQ29uZmlnRXZlbnRfYXVkaW9faW9fY29uZmlnX2V2ZW50KAorICAgICAgICBtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Jb0NvbmZpZ0V2ZW50PiBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KAorICAgICAgICBhdWRpb19pb19jb25maWdfZXZlbnQgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3JvbGVfdD4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Um9sZV9hdWRpb19wb3J0X3JvbGVfdCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRSb2xlPiBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKAorICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfdHlwZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9Qb3J0VHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydFR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUoCisgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZm9ybWF0X3Q+IGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4gbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQoCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9tb2RlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW5Nb2RlX2F1ZGlvX2dhaW5fbW9kZV90KG1lZGlhOjpBdWRpb0dhaW5Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X0F1ZGlvR2Fpbk1vZGUoYXVkaW9fZ2Fpbl9tb2RlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19nYWluX21vZGVfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fbW9kZV90X2ludDMyX3RfbWFzayhhdWRpb19nYWluX21vZGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2RldmljZXNfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QoYXVkaW9fZGV2aWNlc190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbl9jb25maWc+IGFpZGwybGVnYWN5X0F1ZGlvR2FpbkNvbmZpZ19hdWRpb19nYWluX2NvbmZpZygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvR2FpbkNvbmZpZyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW5Db25maWc+IGxlZ2FjeTJhaWRsX2F1ZGlvX2dhaW5fY29uZmlnX0F1ZGlvR2FpbkNvbmZpZygKKyAgICAgICAgY29uc3QgYXVkaW9fZ2Fpbl9jb25maWcmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW5wdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfQXVkaW9JbnB1dEZsYWdzX2F1ZGlvX2lucHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb0lucHV0RmxhZ3MgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lucHV0RmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lucHV0X2ZsYWdzX3RfQXVkaW9JbnB1dEZsYWdzKAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IGFpZGwybGVnYWN5X0F1ZGlvT3V0cHV0RmxhZ3NfYXVkaW9fb3V0cHV0X2ZsYWdzX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb091dHB1dEZsYWdzIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9PdXRwdXRGbGFncz4gbGVnYWN5MmFpZGxfYXVkaW9fb3V0cHV0X2ZsYWdzX3RfQXVkaW9PdXRwdXRGbGFncygKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19pbnB1dF9mbGFnc190PiBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lucHV0X2ZsYWdzX3RfbWFzaygKKyAgICAgICAgaW50MzJfdCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8aW50MzJfdD4gbGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4gYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9tYXNrKAorICAgICAgICBpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PiBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9faW9fZmxhZ3M+IGFpZGwybGVnYWN5X0F1ZGlvSW9GbGFnc19hdWRpb19pb19mbGFncygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9GbGFncyYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRmxhZ3M+IGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2ZsYWdzX0F1ZGlvSW9GbGFncygKKyAgICAgICAgY29uc3QgYXVkaW9faW9fZmxhZ3MmIGxlZ2FjeSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9jb25maWdfZGV2aWNlX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ0RldmljZUV4dF9hdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0KAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ0RldmljZUV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfY29uZmlnX2RldmljZV9leHRfQXVkaW9Qb3J0Q29uZmlnRGV2aWNlRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19kZXZpY2VfZXh0JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+IGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9TdHJlYW1UeXBlPiBsZWdhY3kyYWlkbF9hdWRpb19zdHJlYW1fdHlwZV90X0F1ZGlvU3RyZWFtVHlwZSgKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3NvdXJjZV90PiBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoCisgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1NvdXJjZVR5cGU+IGxlZ2FjeTJhaWRsX2F1ZGlvX3NvdXJjZV90X0F1ZGlvU291cmNlVHlwZSgKKyAgICAgICAgYXVkaW9fc291cmNlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19zZXNzaW9uX3Q+IGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+IGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KGF1ZGlvX3Nlc3Npb25fdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ+IGFpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZ01peEV4dCYgYWlkbCwgbWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnRDb25maWdNaXhFeHQ+IGxlZ2FjeTJhaWRsX0F1ZGlvUG9ydENvbmZpZ01peEV4dCgKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWdfbWl4X2V4dCYgbGVnYWN5LCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHRfYXVkaW9fcG9ydF9jb25maWdfc2Vzc2lvbl9leHQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZ1Nlc3Npb25FeHQ+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dF9BdWRpb1BvcnRDb25maWdTZXNzaW9uRXh0KAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZ19zZXNzaW9uX2V4dCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2NvbmZpZz4gYWlkbDJsZWdhY3lfQXVkaW9Qb3J0Q29uZmlnX2F1ZGlvX3BvcnRfY29uZmlnKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydENvbmZpZz4gbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9jb25maWdfQXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxzdHJ1Y3QgYXVkaW9fcGF0Y2g+IGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2goCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1BhdGNoJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUGF0Y2g+IGxlZ2FjeTJhaWRsX2F1ZGlvX3BhdGNoX0F1ZGlvUGF0Y2goCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0lvRGVzY3JpcHRvcj4+IGFpZGwybGVnYWN5X0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3ImIGFpZGwpOworCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0lvRGVzY3JpcHRvcj4gbGVnYWN5MmFpZGxfQXVkaW9Jb0Rlc2NyaXB0b3JfQXVkaW9Jb0Rlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxBdWRpb0NsaWVudD4gYWlkbDJsZWdhY3lfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NsaWVudCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NsaWVudD4gbGVnYWN5MmFpZGxfQXVkaW9DbGllbnRfQXVkaW9DbGllbnQoCisgICAgICAgIGNvbnN0IEF1ZGlvQ2xpZW50JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9Db250ZW50VHlwZV9hdWRpb19jb250ZW50X3R5cGVfdChtZWRpYTo6QXVkaW9Db250ZW50VHlwZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29udGVudFR5cGU+CitsZWdhY3kyYWlkbF9hdWRpb19jb250ZW50X3R5cGVfdF9BdWRpb0NvbnRlbnRUeXBlKGF1ZGlvX2NvbnRlbnRfdHlwZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXNhZ2VfdD4KK2FpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdChtZWRpYTo6QXVkaW9Vc2FnZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXNhZ2U+CitsZWdhY3kyYWlkbF9hdWRpb191c2FnZV90X0F1ZGlvVXNhZ2UoYXVkaW9fdXNhZ2VfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2ZsYWdzX21hc2tfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRmxhZ19hdWRpb19mbGFnc19tYXNrX3QobWVkaWE6OkF1ZGlvRmxhZyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRmxhZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2ZsYWdzX21hc2tfdF9BdWRpb0ZsYWcoYXVkaW9fZmxhZ3NfbWFza190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZmxhZ3NfbWFza190PgorYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19mbGFnc19tYXNrX3RfbWFzayhpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fZmxhZ3NfbWFza190X2ludDMyX3RfbWFzayhhdWRpb19mbGFnc19tYXNrX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19hdHRyaWJ1dGVzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsPgorbGVnYWN5MmFpZGxfYXVkaW9fYXR0cmlidXRlc190X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3QobWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvbk1vZGUgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0VuY2Fwc3VsYXRpb25Nb2RlPgorbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tb2RlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZShhdWRpb19lbmNhcHN1bGF0aW9uX21vZGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfaW5mb190PgorYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkSW5mb19hdWRpb19vZmZsb2FkX2luZm9fdChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb09mZmxvYWRJbmZvPgorbGVnYWN5MmFpZGxfYXVkaW9fb2ZmbG9hZF9pbmZvX3RfQXVkaW9PZmZsb2FkSW5mbyhjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19jb25maWdfdD4KK2FpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0NvbmZpZz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbnN0IGF1ZGlvX2NvbmZpZ190JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2NvbmZpZ19iYXNlX3Q+CithaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvQ29uZmlnQmFzZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ19iYXNlX3RfQXVkaW9Db25maWdCYXNlKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8c3A8SU1lbW9yeT4+CithaWRsMmxlZ2FjeV9TaGFyZWRGaWxlUmVnaW9uX0lNZW1vcnkoY29uc3QgbWVkaWE6OlNoYXJlZEZpbGVSZWdpb24mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4KK2xlZ2FjeTJhaWRsX0lNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxzcDxJTWVtb3J5Pj4KK2FpZGwybGVnYWN5X051bGxhYmxlU2hhcmVkRmlsZVJlZ2lvbl9JTWVtb3J5KGNvbnN0IHN0ZDo6b3B0aW9uYWw8bWVkaWE6OlNoYXJlZEZpbGVSZWdpb24+JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4+CitsZWdhY3kyYWlkbF9OdWxsYWJsZUlNZW1vcnlfU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxBdWRpb1RpbWVzdGFtcD4KK2FpZGwybGVnYWN5X0F1ZGlvVGltZXN0YW1wSW50ZXJuYWxfQXVkaW9UaW1lc3RhbXAoY29uc3QgbWVkaWE6OkF1ZGlvVGltZXN0YW1wSW50ZXJuYWwmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9UaW1lc3RhbXBJbnRlcm5hbD4KK2xlZ2FjeTJhaWRsX0F1ZGlvVGltZXN0YW1wX0F1ZGlvVGltZXN0YW1wSW50ZXJuYWwoY29uc3QgQXVkaW9UaW1lc3RhbXAmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdXVpZF90PgorYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvVXVpZD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3V1aWRfdF9BdWRpb1V1aWQoY29uc3QgYXVkaW9fdXVpZF90JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGVmZmVjdF9kZXNjcmlwdG9yX3Q+CithaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoY29uc3QgbWVkaWE6OkVmZmVjdERlc2NyaXB0b3ImIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4KK2xlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZV90KAorICAgICAgICBtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlPgorbGVnYWN5MmFpZGxfYXVkaW9fZW5jYXBzdWxhdGlvbl9tZXRhZGF0YV90eXBlX3RfQXVkaW9FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlKAorICAgICAgICBhdWRpb19lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHVpbnQzMl90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uTW9kZV9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25Nb2RlX21hc2sodWludDMyX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9BdWRpb0VuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVfbWFzayh1aW50MzJfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peExhdGVuY3lDbGFzc19hdWRpb19taXhfbGF0ZW5jeV9jbGFzc190KAorICAgICAgICBtZWRpYTo6QXVkaW9NaXhMYXRlbmN5Q2xhc3MgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peExhdGVuY3lDbGFzcz4KK2xlZ2FjeTJhaWRsX2F1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3RfQXVkaW9NaXhMYXRlbmN5Q2xhc3MoCisgICAgICAgIGF1ZGlvX21peF9sYXRlbmN5X2NsYXNzX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X2RldmljZV9leHQ+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnREZXZpY2VFeHRfYXVkaW9fcG9ydF9kZXZpY2VfZXh0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0RGV2aWNlRXh0PgorbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9kZXZpY2VfZXh0X0F1ZGlvUG9ydERldmljZUV4dChjb25zdCBhdWRpb19wb3J0X2RldmljZV9leHQmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcG9ydF9taXhfZXh0PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0TWl4RXh0X2F1ZGlvX3BvcnRfbWl4X2V4dChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0TWl4RXh0JiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9ydE1peEV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfbWl4X2V4dF9BdWRpb1BvcnRNaXhFeHQoY29uc3QgYXVkaW9fcG9ydF9taXhfZXh0JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvcnRfc2Vzc2lvbl9leHQ+CithaWRsMmxlZ2FjeV9BdWRpb1BvcnRTZXNzaW9uRXh0X2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydFNlc3Npb25FeHQmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb3J0U2Vzc2lvbkV4dD4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfc2Vzc2lvbl9leHRfQXVkaW9Qb3J0U2Vzc2lvbkV4dChjb25zdCBhdWRpb19wb3J0X3Nlc3Npb25fZXh0JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3Byb2ZpbGU+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVfYXVkaW9fcHJvZmlsZShjb25zdCBtZWRpYTo6QXVkaW9Qcm9maWxlJiBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3Byb2ZpbGVfQXVkaW9Qcm9maWxlKGNvbnN0IGF1ZGlvX3Byb2ZpbGUmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZ2Fpbj4KK2FpZGwybGVnYWN5X0F1ZGlvR2Fpbl9hdWRpb19nYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgorbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9BdWRpb0dhaW4oY29uc3QgYXVkaW9fZ2FpbiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb19wb3J0X3Y3PgorYWlkbDJsZWdhY3lfQXVkaW9Qb3J0X2F1ZGlvX3BvcnRfdjcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnQ+CitsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChjb25zdCBhdWRpb19wb3J0X3Y3JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3QobWVkaWE6OkF1ZGlvTW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvTW9kZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX21vZGVfdF9BdWRpb01vZGUoYXVkaW9fbW9kZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdW5pcXVlX2lkX3VzZV90PgorYWlkbDJsZWdhY3lfQXVkaW9VbmlxdWVJZFVzZV9hdWRpb191bmlxdWVfaWRfdXNlX3QobWVkaWE6OkF1ZGlvVW5pcXVlSWRVc2UgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1VuaXF1ZUlkVXNlPgorbGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3VzZV90X0F1ZGlvVW5pcXVlSWRVc2UoYXVkaW9fdW5pcXVlX2lkX3VzZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dm9sdW1lX2dyb3VwX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X3ZvbHVtZV9ncm91cF90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF92b2x1bWVfZ3JvdXBfdF9pbnQzMl90KHZvbHVtZV9ncm91cF90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fZHVhbF9tb25vX21vZGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvRHVhbE1vbm9Nb2RlX2F1ZGlvX2R1YWxfbW9ub19tb2RlX3QobWVkaWE6OkF1ZGlvRHVhbE1vbm9Nb2RlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGU+CitsZWdhY3kyYWlkbF9hdWRpb19kdWFsX21vbm9fbW9kZV90X0F1ZGlvRHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxhdWRpb190aW1lc3RyZXRjaF9mYWxsYmFja19tb2RlX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90X2ludDMyX3QoYXVkaW9fdGltZXN0cmV0Y2hfZmFsbGJhY2tfbW9kZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Q+CithaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9hdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdF9pbnQzMl90KGF1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fcGxheWJhY2tfcmF0ZV90PgorYWlkbDJsZWdhY3lfQXVkaW9QbGF5YmFja1JhdGVfYXVkaW9fcGxheWJhY2tfcmF0ZV90KGNvbnN0IG1lZGlhOjpBdWRpb1BsYXliYWNrUmF0ZSYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BsYXliYWNrUmF0ZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BsYXliYWNrX3JhdGVfdF9BdWRpb1BsYXliYWNrUmF0ZShjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8YXVkaW9fc3RhbmRhcmRfdD4KK2FpZGwybGVnYWN5X0F1ZGlvU3RhbmRhcmRfYXVkaW9fc3RhbmRhcmRfdChtZWRpYTo6QXVkaW9TdGFuZGFyZCBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvU3RhbmRhcmQ+CitsZWdhY3kyYWlkbF9hdWRpb19zdGFuZGFyZF90X0F1ZGlvU3RhbmRhcmQoYXVkaW9fc3RhbmRhcmRfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3I+CithaWRsMmxlZ2FjeV9FeHRyYUF1ZGlvRGVzY3JpcHRvcl9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3ImIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6RXh0cmFBdWRpb0Rlc2NyaXB0b3I+CitsZWdhY3kyYWlkbF9hdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yX0V4dHJhQXVkaW9EZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBhdWRpb19leHRyYV9hdWRpb19kZXNjcmlwdG9yJiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90PgorYWlkbDJsZWdhY3lfQXVkaW9FbmNhcHN1bGF0aW9uVHlwZV9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRW5jYXBzdWxhdGlvblR5cGUmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9FbmNhcHN1bGF0aW9uVHlwZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90X0F1ZGlvRW5jYXBzdWxhdGlvblR5cGUoCisgICAgICAgIGNvbnN0IGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90ICYgbGVnYWN5KTsKKwordXNpbmcgVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpciA9IHN0ZDo6cGFpcjxhdWRpb19wb3J0X2hhbmRsZV90LCBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4+OworQ29udmVyc2lvblJlc3VsdDxUcmFja1NlY29uZGFyeU91dHB1dEluZm9QYWlyPgorYWlkbDJsZWdhY3lfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvX1RyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXIoCisgICAgICAgIGNvbnN0IG1lZGlhOjpUcmFja1NlY29uZGFyeU91dHB1dEluZm8mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6VHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvPgorbGVnYWN5MmFpZGxfVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvUGFpcl9UcmFja1NlY29uZGFyeU91dHB1dEluZm8oCisgICAgICAgIGNvbnN0IFRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb1BhaXImIGxlZ2FjeSk7CisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTJiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9leHBlY3RlZC5oPgorI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIENvbnZlcnNpb25SZXN1bHQgPSBiYXNlOjpleHBlY3RlZDxULCBzdGF0dXNfdD47CisKKy8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3Igd29ya2luZyB3aXRoIENvbnZlcnNpb25SZXN1bHQsIHVzZWZ1bCBmb3Igd3JpdGluZyBjb252ZXJ0ZWQgZm9yIGFnZ3JlZ2F0ZQorLy8gdHlwZXMuCisKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXV0byBfdG1wID0gKHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFfdG1wLm9rKCkpIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKF90bXAuZXJyb3IoKSk7IFwKKyAgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9KQorCisjZGVmaW5lIFJFVFVSTl9JRl9FUlJPUihyZXN1bHQpIFwKKyAgICBpZiAoc3RhdHVzX3QgX3RtcCA9IChyZXN1bHQpOyBfdG1wICE9IE9LKSByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChfdG1wKTsKKworI2RlZmluZSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKHgpICAgICAgICAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gX3RtcC5lcnJvcigpOyBcCisgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgIFwKKyAgICAgfSkKKworI2RlZmluZSBWQUxVRV9PUl9GQVRBTChyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXV0byBfdG1wID0gKHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIV90bXAub2soKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbjogJXMgTGluZTogJWQgRmFpbGVkIHJlc3VsdCAoJWQpIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfdG1wLmVycm9yKCkpOyAgICAgXAorICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSkKKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdG8gc2FmZWx5IGNhc3QgYmV0d2VlbiBpbnRlZ3JhbCB0eXBlcywgcmVzcGVjdGluZyBsaW1pdHMgb2YgdGhlIGRlc3RpbmF0aW9uCisgKiB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KK0NvbnZlcnNpb25SZXN1bHQ8VG8+IGNvbnZlcnRJbnRlZ3JhbChGcm9tIGZyb20pIHsKKyAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGlzIHJlcXVpcmVkIGZvciBzaWduZWQgLyB2cy4gdW5zaWduZWQgY29tcGFyaXNvbnMsIHNpbmNlIG90aGVyd2lzZSB3ZSBtYXkKKyAgICAvLyBoYXZlIHRoZSBzaWduZWQgY29udmVydGVkIHRvIHVuc2lnbmVkIGFuZCBwcm9kdWNlIHdyb25nIHJlc3VsdHMuCisgICAgaWYgKHN0ZDo6aXNfc2lnbmVkX3Y8RnJvbT4gJiYgIXN0ZDo6aXNfc2lnbmVkX3Y8VG8+KSB7CisgICAgICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID4gc3RkOjpudW1lcmljX2xpbWl0czxUbz46Om1heCgpKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChCQURfVkFMVUUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdGQ6OmlzX3NpZ25lZF92PFRvPiAmJiAhc3RkOjppc19zaWduZWRfdjxGcm9tPikgeworICAgICAgICBpZiAoZnJvbSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VG8+OjptYXgoKSkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcm9tIDwgc3RkOjpudW1lcmljX2xpbWl0czxUbz46Om1pbigpIHx8IGZyb20gPiBzdGQ6Om51bWVyaWNfbGltaXRzPFRvPjo6bWF4KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRvPihmcm9tKTsKK30KKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdG8gc2FmZWx5IGNhc3QgYmV0d2VlbiB0eXBlcywgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgdGhlIHNhbWUgc2l6ZSwgYnV0CisgKiBpbnRlcnByZXRlZCBkaWZmZXJlbnRseS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitDb252ZXJzaW9uUmVzdWx0PFRvPiBjb252ZXJ0UmVpbnRlcnByZXQoRnJvbSBmcm9tKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRvPihmcm9tKTsKK30KKworLyoqCisgKiBBIGdlbmVyaWMgdGVtcGxhdGUgdGhhdCBoZWxwcyBjb252ZXJ0IGNvbnRhaW5lcnMgb2YgY29udmVydGlibGUgdHlwZXMsIHVzaW5nIGl0ZXJhdG9ycy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvciwgdHlwZW5hbWUgT3V0cHV0SXRlcmF0b3IsIHR5cGVuYW1lIEZ1bmM+CitzdGF0dXNfdCBjb252ZXJ0UmFuZ2UoSW5wdXRJdGVyYXRvciBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBJbnB1dEl0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRJdGVyYXRvciBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24pIHsKKyAgICBmb3IgKElucHV0SXRlcmF0b3IgaXRlciA9IHN0YXJ0OyBpdGVyICE9IGVuZDsgKytpdGVyLCArK291dCkgeworICAgICAgICAqb3V0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhpdGVtQ29udmVyc2lvbigqaXRlcikpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8qKgorICogQSBnZW5lcmljIHRlbXBsYXRlIHRoYXQgaGVscHMgY29udmVydCBjb250YWluZXJzIG9mIGNvbnZlcnRpYmxlIHR5cGVzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBPdXRwdXRDb250YWluZXIsIHR5cGVuYW1lIElucHV0Q29udGFpbmVyLCB0eXBlbmFtZSBGdW5jPgorQ29udmVyc2lvblJlc3VsdDxPdXRwdXRDb250YWluZXI+Citjb252ZXJ0Q29udGFpbmVyKGNvbnN0IElucHV0Q29udGFpbmVyJiBpbnB1dCwgY29uc3QgRnVuYyYgaXRlbUNvbnZlcnNpb24pIHsKKyAgICBPdXRwdXRDb250YWluZXIgb3V0cHV0OworICAgIGF1dG8gaW5zID0gc3RkOjppbnNlcnRlcihvdXRwdXQsIG91dHB1dC5iZWdpbigpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBpbnB1dCkgeworICAgICAgICAqaW5zID0gVkFMVUVfT1JfUkVUVVJOKGl0ZW1Db252ZXJzaW9uKGl0ZW0pKTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhlIGNvZGUgYmVsb3cgZXN0YWJsaXNoZXM6CisvLyBJbnRlZ3JhbFR5cGVPZjxUPiwgd2hpY2ggd29ya3MgZm9yIGVpdGhlciBpbnRlZ3JhbCB0eXBlcyAoaW4gd2hpY2ggY2FzZSBpdCBldmFsdWF0ZXMgdG8gVCksIG9yCisvLyBlbnVtIHR5cGVzIChpbiB3aGljaCBjYXNlIGl0IGV2YWx1YXRlcyB0byBzdGQ6OnVuZGVybHlpbmdfdHlwZV9UPFQ+KS4KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfaW50ZWdyYWxfdjxUPiB8fCBzdGQ6OmlzX2VudW1fdjxUPj4+CitzdHJ1Y3QgSW50ZWdyYWxUeXBlT2ZTdHJ1Y3QgeworICAgIHVzaW5nIFR5cGUgPSBUOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbnRlZ3JhbFR5cGVPZlN0cnVjdDxULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfZW51bV92PFQ+Pj4geworICAgIHVzaW5nIFR5cGUgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZV90PFQ+OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3VzaW5nIEludGVncmFsVHlwZU9mID0gdHlwZW5hbWUgSW50ZWdyYWxUeXBlT2ZTdHJ1Y3Q8VD46OlR5cGU7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWxpdGllcyBmb3IgaGFuZGxpbmcgYml0bWFza3MuCisKK3RlbXBsYXRlPHR5cGVuYW1lIEVudW0+CitFbnVtIGluZGV4VG9FbnVtX2luZGV4KGludCBpbmRleCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtX3Y8RW51bT4gfHwgc3RkOjppc19pbnRlZ3JhbF92PEVudW0+KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RW51bT4oaW5kZXgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBFbnVtPgorRW51bSBpbmRleFRvRW51bV9iaXRtYXNrKGludCBpbmRleCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtX3Y8RW51bT4gfHwgc3RkOjppc19pbnRlZ3JhbF92PEVudW0+KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RW51bT4oMSA8PCBpbmRleCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIE1hc2ssIHR5cGVuYW1lIEVudW0+CitNYXNrIGVudW1Ub01hc2tfYml0bWFzayhFbnVtIGUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bV92PEVudW0+IHx8IHN0ZDo6aXNfaW50ZWdyYWxfdjxFbnVtPik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2VudW1fdjxNYXNrPiB8fCBzdGQ6OmlzX2ludGVncmFsX3Y8TWFzaz4pOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNYXNrPihlKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgTWFzaywgdHlwZW5hbWUgRW51bT4KK01hc2sgZW51bVRvTWFza19pbmRleChFbnVtIGUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZW51bV92PEVudW0+IHx8IHN0ZDo6aXNfaW50ZWdyYWxfdjxFbnVtPik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2VudW1fdjxNYXNrPiB8fCBzdGQ6OmlzX2ludGVncmFsX3Y8TWFzaz4pOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNYXNrPihzdGF0aWNfY2FzdDxzdGQ6Om1ha2VfdW5zaWduZWRfdDxJbnRlZ3JhbFR5cGVPZjxNYXNrPj4+KDEpCisgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGUpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRGVzdE1hc2ssIHR5cGVuYW1lIFNyY01hc2ssIHR5cGVuYW1lIERlc3RFbnVtLCB0eXBlbmFtZSBTcmNFbnVtPgorQ29udmVyc2lvblJlc3VsdDxEZXN0TWFzaz4gY29udmVydEJpdG1hc2soCisgICAgICAgIFNyY01hc2sgc3JjLCBjb25zdCBzdGQ6OmZ1bmN0aW9uPENvbnZlcnNpb25SZXN1bHQ8RGVzdEVudW0+KFNyY0VudW0pPiYgZW51bUNvbnZlcnNpb24sCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248U3JjRW51bShpbnQpPiYgc3JjSW5kZXhUb0VudW0sCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248RGVzdE1hc2soRGVzdEVudW0pPiYgZGVzdEVudW1Ub01hc2spIHsKKyAgICB1c2luZyBVbnNpZ25lZERlc3RNYXNrID0gc3RkOjptYWtlX3Vuc2lnbmVkX3Q8SW50ZWdyYWxUeXBlT2Y8RGVzdE1hc2s+PjsKKyAgICB1c2luZyBVbnNpZ25lZFNyY01hc2sgPSBzdGQ6Om1ha2VfdW5zaWduZWRfdDxJbnRlZ3JhbFR5cGVPZjxTcmNNYXNrPj47CisKKyAgICBVbnNpZ25lZERlc3RNYXNrIGRlc3QgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERlc3RNYXNrPigwKTsKKyAgICBVbnNpZ25lZFNyY01hc2sgdXNyYyA9IHN0YXRpY19jYXN0PFVuc2lnbmVkU3JjTWFzaz4oc3JjKTsKKworICAgIGludCBzcmNCaXRJbmRleCA9IDA7CisgICAgd2hpbGUgKHVzcmMgIT0gMCkgeworICAgICAgICBpZiAodXNyYyAmIDEpIHsKKyAgICAgICAgICAgIFNyY0VudW0gc3JjRW51bSA9IHNyY0luZGV4VG9FbnVtKHNyY0JpdEluZGV4KTsKKyAgICAgICAgICAgIERlc3RFbnVtIGRlc3RFbnVtID0gVkFMVUVfT1JfUkVUVVJOKGVudW1Db252ZXJzaW9uKHNyY0VudW0pKTsKKyAgICAgICAgICAgIERlc3RNYXNrIGRlc3RNYXNrID0gZGVzdEVudW1Ub01hc2soZGVzdEVudW0pOworICAgICAgICAgICAgZGVzdCB8PSBkZXN0TWFzazsKKyAgICAgICAgfQorICAgICAgICArK3NyY0JpdEluZGV4OworICAgICAgICB1c3JjID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVzdE1hc2s+KGRlc3QpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBNYXNrLCB0eXBlbmFtZSBFbnVtPgorYm9vbCBiaXRtYXNrSXNTZXQoTWFzayBtYXNrLCBFbnVtIGluZGV4KSB7CisgICAgcmV0dXJuIChtYXNrICYgZW51bVRvTWFza19pbmRleDxNYXNrLCBFbnVtPihpbmRleCkpICE9IDA7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIEFJREwgdW5pb25zLgorLy8gVU5JT05fR0VUKG9iaiwgZmllbGRuYW1lKSByZXR1cm5zIGEgQ29udmVyc2lvblJlc3VsdDxUPiBjb250YWluaW5nIGVpdGhlciB0aGUgc3Ryb25nbHktdHlwZWQKKy8vICAgdmFsdWUgb2YgdGhlIHJlc3BlY3RpdmUgZmllbGQsIG9yIEJBRF9WQUxVRSBpZiB0aGUgdW5pb24gaXMgbm90IHNldCB0byB0aGUgcmVxdWVzdGVkIGZpZWxkLgorLy8gVU5JT05fU0VUKG9iaiwgZmllbGRuYW1lLCB2YWx1ZSkgc2V0cyB0aGUgcmVxdWVzdGVkIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDo6VGFnIHRhZz4KK3VzaW5nIFVuaW9uRmllbGRUeXBlID0gc3RkOjpkZWNheV90PGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxUPigpLnRlbXBsYXRlIGdldDx0YWc+KCkpPjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDo6VGFnIHRhZz4KK0NvbnZlcnNpb25SZXN1bHQ8VW5pb25GaWVsZFR5cGU8VCwgdGFnPj4gdW5pb25HZXRGaWVsZChjb25zdCBUJiB1KSB7CisgICAgaWYgKHUuZ2V0VGFnKCkgIT0gdGFnKSB7CisgICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKEJBRF9WQUxVRSk7CisgICAgfQorICAgIHJldHVybiB1LnRlbXBsYXRlIGdldDx0YWc+KCk7Cit9CisKKyNkZWZpbmUgVU5JT05fR0VUKHUsIGZpZWxkKSBcCisgICAgdW5pb25HZXRGaWVsZDxzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUodSk+LCBzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUodSk+OjpUYWc6OmZpZWxkPih1KQorCisjZGVmaW5lIFVOSU9OX1NFVCh1LCBmaWVsZCwgdmFsdWUpIFwKKyAgICAodSkuc2V0PHN0ZDo6ZGVjYXlfdDxkZWNsdHlwZSh1KT46OlRhZzo6ZmllbGQ+KHZhbHVlKQorCituYW1lc3BhY2UgYWlkbF91dGlscyB7CisKKy8qKgorICogUmV0dXJuIHRoZSBlcXVpdmFsZW50IEFuZHJvaWQgc3RhdHVzX3QgZnJvbSBhIGJpbmRlciBleGNlcHRpb24gY29kZS4KKyAqCisgKiBHZW5lcmFsbHkgb25lIHNob3VsZCB1c2Ugc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoKSBpbnN0ZWFkLgorICoKKyAqIEV4Y2VwdGlvbiBjb2RlcyBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gYSByZW1vdGUgSmF2YSBzZXJ2aWNlIGV4Y2VwdGlvbiwgdHJhbnNsYXRlCisgKiB0aGVtIGZvciB1c2Ugb24gdGhlIE5hdGl2ZSBzaWRlLgorICoKKyAqIE5vdGU6IGZvciBFWF9UUkFOU0FDVElPTl9GQUlMRUQgYW5kIEVYX1NFUlZJQ0VfU1BFQ0lGSUMgYSBtb3JlIGRldGFpbGVkIGVycm9yIGNvZGUKKyAqIGNhbiBiZSBmb3VuZCBmcm9tIHRyYW5zYWN0aW9uRXJyb3IoKSBvciBzZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKS4KKyAqLworc3RhdGljIGlubGluZSBzdGF0dXNfdCBzdGF0dXNURnJvbUV4Y2VwdGlvbkNvZGUoaW50MzJfdCBleGNlcHRpb25Db2RlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YmluZGVyOworICAgIHN3aXRjaCAoZXhjZXB0aW9uQ29kZSkgeworICAgICAgICBjYXNlIFN0YXR1czo6RVhfTk9ORToKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkVYX1NFQ1VSSVRZOiAvLyBKYXZhIFNlY3VyaXR5RXhjZXB0aW9uLCByZXRocm93cyBsb2NhbGx5IGluIEphdmEKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkVYX0JBRF9QQVJDRUxBQkxFOiAvLyBKYXZhIEJhZFBhcmNlbGFibGVFeGNlcHRpb24sIHJldGhyb3dzIGluIEphdmEKKyAgICAgICAgY2FzZSBTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQ6IC8vIEphdmEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCByZXRocm93cyBpbiBKYXZhCisgICAgICAgIGNhc2UgU3RhdHVzOjpFWF9OVUxMX1BPSU5URVI6IC8vIEphdmEgTnVsbFBvaW50ZXJFeGNlcHRpb24sIHJldGhyb3dzIGluIEphdmEKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFOiAvLyBKYXZhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgcmV0aHJvd3MgaW4gSmF2YQorICAgICAgICBjYXNlIFN0YXR1czo6RVhfVU5TVVBQT1JURURfT1BFUkFUSU9OOiAvLyBKYXZhIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLCByZXRocm93cworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFN0YXR1czo6RVhfSEFTX1JFUExZX0hFQURFUjogLy8gTmF0aXZlIHN0cmljdG1vZGUgdmlvbGF0aW9uCisgICAgICAgIGNhc2UgU3RhdHVzOjpFWF9QQVJDRUxBQkxFOiAvLyBKYXZhIGJvb3RjbGFzcyBsb2FkZXIgKG5vdCBzdGFuZGFyZCBleGNlcHRpb24pLCByZXRocm93cworICAgICAgICBjYXNlIFN0YXR1czo6RVhfTkVUV09SS19NQUlOX1RIUkVBRDogLy8gSmF2YSBOZXR3b3JrT25NYWluVGhyZWFkRXhjZXB0aW9uLCByZXRocm93cworICAgICAgICBjYXNlIFN0YXR1czo6RVhfVFJBTlNBQ1RJT05fRkFJTEVEOiAvLyBOYXRpdmUgLSBzZWUgZXJyb3IgY29kZQorICAgICAgICBjYXNlIFN0YXR1czo6RVhfU0VSVklDRV9TUEVDSUZJQzogIC8vIEphdmEgU2VydmljZVNwZWNpZmljRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldGhyb3dzIGluIEphdmEgd2l0aCBpbnRlZ2VyIGVycm9yIGNvZGUKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworLyoqCisgKiBSZXR1cm4gdGhlIGVxdWl2YWxlbnQgQW5kcm9pZCBzdGF0dXNfdCBmcm9tIGEgYmluZGVyIHN0YXR1cy4KKyAqCisgKiBVc2VkIHRvIGhhbmRsZSBlcnJvcnMgZnJvbSBhIEFJREwgbWV0aG9kIGRlY2xhcmF0aW9uCisgKgorICogW29uZXdheV0gdm9pZCBtZXRob2QodHlwZTAgcGFyYW0wLCAuLi4pCisgKgorICogb3IgdGhlIGZvbGxvd2luZyAod2hlcmUgcmV0dXJuX3R5cGUgaXMgbm90IGEgc3RhdHVzX3QpCisgKgorICogcmV0dXJuX3R5cGUgbWV0aG9kKHR5cGUwIHBhcmFtMCwgLi4uKQorICovCitzdGF0aWMgaW5saW5lIHN0YXR1c190IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGNvbnN0IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgJnN0YXR1cykgeworICAgIHJldHVybiBzdGF0dXMuaXNPaygpID8gT0sgLy8gY2hlY2sgT0ssCisgICAgICAgIDogc3RhdHVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpIC8vIHNlcnZpY2Utc2lkZSBlcnJvciwgbm90IHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmcm9tU2VydmljZVNwZWNpZmljRXJyb3IpCisgICAgICAgID86IHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkgLy8gYSBuYXRpdmUgYmluZGVyIHRyYW5zYWN0aW9uIGVycm9yIChmcm9tU3RhdHVzVCkKKyAgICAgICAgPzogc3RhdHVzVEZyb21FeGNlcHRpb25Db2RlKHN0YXR1cy5leGNlcHRpb25Db2RlKCkpOyAvLyBhIHNlcnZpY2Utc2lkZSBlcnJvciB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFuZGFyZCBKYXZhIGV4Y2VwdGlvbiAoZnJvbUV4Y2VwdGlvbkNvZGUpCit9CisKKy8qKgorICogUmV0dXJuIGEgYmluZGVyOjpTdGF0dXMgZnJvbSBuYXRpdmUgc2VydmljZSBzdGF0dXMuCisgKgorICogVGhpcyBpcyB1c2VkIGZvciBtZXRob2RzIG5vdCByZXR1cm5pbmcgYW4gZXhwbGljaXQgc3RhdHVzX3QsCisgKiB3aGVyZSBKYXZhIGNhbGxlcnMgZXhwZWN0IGFuIGV4Y2VwdGlvbiwgbm90IGFuIGludGVnZXIgcmV0dXJuIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgIHN0YXR1c190IHN0YXR1cywgY29uc3QgY2hhciAqb3B0aW9uYWxNZXNzYWdlID0gbnVsbHB0cikgeworICAgIGNvbnN0IGNoYXIgKiBjb25zdCBlbXB0eUlmTnVsbCA9IG9wdGlvbmFsTWVzc2FnZSA9PSBudWxscHRyID8gIiIgOiBvcHRpb25hbE1lc3NhZ2U7CisgICAgLy8gRnJvbSBiaW5kZXI6OlN0YXR1cyBpbnN0cnVjdGlvbnM6CisgICAgLy8gIFByZWZlciBhIGdlbmVyaWMgZXhjZXB0aW9uIGNvZGUgd2hlbiBwb3NzaWJsZSwgdGhlbiBhIHNlcnZpY2Ugc3BlY2lmaWMKKyAgICAvLyAgY29kZSwgYW5kIGZpbmFsbHkgYSBzdGF0dXNfdCBmb3IgbG93IGxldmVsIGZhaWx1cmVzIG9yIGxlZ2FjeSBzdXBwb3J0LgorICAgIC8vICBFeGNlcHRpb24gY29kZXMgYW5kIHNlcnZpY2Ugc3BlY2lmaWMgZXJyb3JzIG1hcCB0byBuaWNlciBleGNlcHRpb25zIGZvcgorICAgIC8vICBKYXZhIGNsaWVudHMuCisKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpiaW5kZXI7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgICAgIGNhc2UgUEVSTUlTU0lPTl9ERU5JRUQ6IC8vIHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIG9uIEphdmEgc2lkZQorICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9TRUNVUklUWSwgZW1wdHlJZk51bGwpOworICAgICAgICBjYXNlIEJBRF9WQUxVRTogLy8gdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG9uIEphdmEgc2lkZQorICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoU3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULCBlbXB0eUlmTnVsbCk7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046IC8vIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBvbiBKYXZhIHNpZGUKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKFN0YXR1czo6RVhfSUxMRUdBTF9TVEFURSwgZW1wdHlJZk51bGwpOworICAgIH0KKworICAgIC8vIEEgc2VydmljZSBzcGVjaWZpYyBlcnJvciB3aWxsIG5vdCBzaG93IG9uIHN0YXR1cy50cmFuc2FjdGlvbkVycm9yKCkgc28KKyAgICAvLyBiZSBzdXJlIHRvIHVzZSBzdGF0dXNURnJvbUJpbmRlclN0YXR1cygpIGZvciByZWxpYWJsZSBlcnJvciBoYW5kbGluZy4KKworICAgIC8vIHRocm93IGEgU2VydmljZVNwZWNpZmljRXhjZXB0aW9uLgorICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0dXMsIGVtcHR5SWZOdWxsKTsKK30KKworCit9IC8vIG5hbWVzcGFjZSBhaWRsX3V0aWxzCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaAppbmRleCAwMDFjNjI5Li4yNGJkMTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTE3LDcgKzE3LDkgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlc0V4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgpAQCAtNTcsNCArNTksMTAgQEAKICAgICB2b2x1bWVfZ3JvdXBfdCBtR3JvdXBJZCA9IFZPTFVNRV9HUk9VUF9OT05FOwogfTsKIAorLy8gQUlETCBjb252ZXJzaW9uIHJvdXRpbmVzLgorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXg+CitsZWdhY3kyYWlkbF9BdWRpb0F0dHJpYnV0ZXNfQXVkaW9BdHRyaWJ1dGVzRXgoY29uc3QgQXVkaW9BdHRyaWJ1dGVzJiBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb0F0dHJpYnV0ZXM+CithaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4JiBhaWRsKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmluZGV4IDI0N2FmOWUuLjNiZThjZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQ2xpZW50LmgKQEAgLTE4LDM4ICsxOCwxOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX0NMSUVOVF9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fQ0xJRU5UX0gKIAotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK2NsYXNzIEF1ZGlvQ2xpZW50IHsKICBwdWJsaWM6CiAgICAgQXVkaW9DbGllbnQoKSA6Ci0gICAgICAgIGNsaWVudFVpZCgtMSksIGNsaWVudFBpZCgtMSksIGNsaWVudFRpZCgtMSksIHBhY2thZ2VOYW1lKCIiKSB7fQorICAgICAgICBjbGllbnRUaWQoLTEpIHt9CiAKLSAgICB1aWRfdCBjbGllbnRVaWQ7Ci0gICAgcGlkX3QgY2xpZW50UGlkOwogICAgIHBpZF90IGNsaWVudFRpZDsKLSAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZTsKLQotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgIGNsaWVudFVpZCA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgICAgIGNsaWVudFBpZCA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgICAgIGNsaWVudFRpZCA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgICAgIHBhY2thZ2VOYW1lID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNsaWVudFVpZCk7Ci0gICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihjbGllbnRQaWQpOwotICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoY2xpZW50VGlkKTsKLSAgICAgICAgcGFyY2VsLT53cml0ZVN0cmluZzE2KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KKyAgICBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKaW5kZXggOGU0NDZlYS4uNWRmZTVmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKQEAgLTI5LDYgKzI5LDggQEAKIHVzaW5nIEF0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19hdHRyaWJ1dGVzX3Q+OwogdXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OwogCit1c2luZyBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAgPSBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4+OworCiBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbGhzLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJocykKIHsKICAgICByZXR1cm4gbGhzLnVzYWdlID09IHJocy51c2FnZSAmJiBsaHMuY29udGVudF90eXBlID09IHJocy5jb250ZW50X3R5cGUgJiYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAppbmRleCBjYjc2MjUyLi4zYzE5ZWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCkBAIC0yMSwxNiArMjEsMTYgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lFZmZlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuRWZmZWN0Q2xpZW50LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzM3LDE4ICszMzcsMjMgQEAKICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6CiAgICAgICoKLSAgICAgKiBvcFBhY2thZ2VOYW1lOiAgICAgIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiBjbGllbnQ6ICAgICAgQXR0cmlidXRpb24gc291cmNlIGZvciBhcHAtb3AgY2hlY2tzCiAgICAgICovCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworICAgIGV4cGxpY2l0IEF1ZGlvRWZmZWN0KGNvbnN0IGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGNsaWVudCk7CiAKKyAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCisgICAgICogVGhlIGVmZmVjdCBlbmdpbmUgaXMgYWxzbyBkZXN0cm95ZWQgaWYgdGhpcyBBdWRpb0VmZmVjdCB3YXMgdGhlIGxhc3QgY29udHJvbGxpbmcKKyAgICAgKiB0aGUgZW5naW5lLgorICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvRWZmZWN0KCk7CiAKLSAgICAvKiBDb25zdHJ1Y3Rvci4KKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9FZmZlY3QuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqCiAgICAgICogdHlwZTogIHR5cGUgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHV1aWQgaXMgc3BlY2lmaWVkLiBUaGlzIGNvcnJlc3BvbmRzIHRvCiAgICAgICogICAgICAgIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LgotICAgICAqIG9wUGFja2FnZU5hbWU6ICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCiAgICAgICogdXVpZDogIFV1aWQgb2YgZWZmZWN0IGNyZWF0ZWQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLiBUaGlzIHV1aWQgY29ycmVzcG9uZHMgdG8KICAgICAgKiAgICAgICAgYSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIG9mIGFuIGVmZmVjdCB0eXBlLgogICAgICAqIHByaW9yaXR5OiAgICByZXF1ZXN0ZWQgcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sOiB0aGUgcHJpb3JpdHkgbGV2ZWwgY29ycmVzcG9uZHMgdG8gdGhlCkBAIC0zNTYsNyArMzYxLDcgQEAKICAgICAgKiAgICAgIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCiAgICAgICogY2JmOiAgICAgICAgIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIChzZWUgZWZmZWN0X2NhbGxiYWNrX3QpCiAgICAgICogdXNlcjogICAgICAgIHBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBzZXNzaW9uSUQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgorICAgICAqIHNlc3Npb25JZDogICBhdWRpbyBzZXNzaW9uIHRoaXMgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8uCiAgICAgICogICAgICBJZiBlcXVhbCB0byBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHRoZSBlZmZlY3Qgd2lsbCBiZSBnbG9iYWwgdG8KICAgICAgKiAgICAgIHRoZSBvdXRwdXQgbWl4LiAgT3RoZXJ3aXNlLCB0aGUgZWZmZWN0IHdpbGwgYmUgYXBwbGllZCB0byBhbGwgcGxheWVycwogICAgICAqICAgICAgKEF1ZGlvVHJhY2sgb3IgTWVkaWFQTGF5ZXIpIHdpdGhpbiB0aGUgc2FtZSBhdWRpbyBzZXNzaW9uLgpAQCAtMzY5LDQ2ICszNzQsMTMgQEAKICAgICAgKiAgICAgICAgSW4gdGhpcyBtb2RlLCBubyBJRWZmZWN0IGludGVyZmFjZSB0byBBdWRpb0ZsaW5nZXIgaXMgY3JlYXRlZCBhbmQgYWxsIGFjdGlvbnMKICAgICAgKiAgICAgICAgYmVzaWRlcyBnZXR0ZXJzIGltcGxlbWVudGVkIGluIGNsaWVudCBBdWRpb0VmZmVjdCBvYmplY3QgYXJlIG5vIG9wcwogICAgICAqICAgICAgICBhZnRlciBlZmZlY3QgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgLSBOT19FUlJPUiBvciBBTFJFQURZX0VYSVNUUzogc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgorICAgICAqICAtIElOVkFMSURfT1BFUkFUSU9OOiBBdWRpb0VmZmVjdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlcgorICAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIGZsaW5nZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCiAgICAgICovCi0KLSAgICBBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBOVUxMLAotICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKLSAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7Ci0KLSAgICAvKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAgICAgIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggdHlwZSBhbmQgdXVpZCBzcGVjaWZpZWQgYnkgY2hhcmFjdGVyIHN0cmluZ3MKLSAgICAgKi8KLSAgICBBdWRpb0VmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7Ci0KLSAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb0VmZmVjdCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCi0gICAgICogVGhlIGVmZmVjdCBlbmdpbmUgaXMgYWxzbyBkZXN0cm95ZWQgaWYgdGhpcyBBdWRpb0VmZmVjdCB3YXMgdGhlIGxhc3QgY29udHJvbGxpbmcKLSAgICAgKiB0aGUgZW5naW5lLgotICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfkF1ZGlvRWZmZWN0KCk7Ci0KLSAgICAvKiBJbml0aWFsaXplIGFuIHVuaW5pdGlhbGl6ZWQgQXVkaW9FZmZlY3QuCi0gICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKLSAgICAqICAtIE5PX0VSUk9SIG9yIEFMUkVBRFlfRVhJU1RTOiBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCi0gICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9FZmZlY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZAotICAgICogIC0gQkFEX1ZBTFVFOiBpbnZhbGlkIHBhcmFtZXRlcgotICAgICogIC0gTk9fSU5JVDogYXVkaW8gZmxpbmdlciBvciBhdWRpbyBoYXJkd2FyZSBub3QgaW5pdGlhbGl6ZWQKLSAgICAqICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKQEAgLTQxOCw2ICszOTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7CisgICAgLyoKKyAgICAgKiBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHR5cGUgYW5kIHV1aWQgc3BlY2lmaWVkIGJ5IGNoYXJhY3RlciBzdHJpbmdzLgorICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlID0ge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSA9IGZhbHNlKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZAogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9FZmZlY3QgQVBJLgpAQCAtNTQ3LDkwICs1MzEsNjcgQEAKICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhQcmVQcm9jZXNzaW5nID0gMTA7CiAKIHByb3RlY3RlZDoKLSAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQ7ICAgICAgICAgICAvLyBlbmFibGUgc3RhdGUKLSAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eTsgICAgICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCi0gICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXM7ICAgICAgICAgICAgLy8gZWZmZWN0IHN0YXR1cwotICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJvYmU7ICAgICAgICAgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcworICAgICBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsgLy8gc291cmNlIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICBib29sICAgICAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIGVuYWJsZSBzdGF0ZQorICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYOyAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1Qcmlvcml0eSA9IDA7ICAgICAgLy8gcHJpb3JpdHkgZm9yIGVmZmVjdCBjb250cm9sCisgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOyAgLy8gZWZmZWN0IHN0YXR1cworICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJvYmUgPSBmYWxzZTsgICAgIC8vIGVmZmVjdCBjcmVhdGVkIGluIHByb2JlIG1vZGU6IGFsbCBjb21tYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBubyBvcHMgYmVjYXVzZSBtSUVmZmVjdCBpcyBOVUxMCi0gICAgIGVmZmVjdF9jYWxsYmFja190ICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXR1cywgY29udHJvbCBhbmQKKyAgICAgZWZmZWN0X2NhbGxiYWNrX3QgICAgICAgbUNiZiA9IG51bGxwdHI7ICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciBjaGFuZ2VzIG5vdGlmaWNhdGlvbnMKLSAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOyAgICAgICAgICAvLyBjbGllbnQgY29udGV4dCBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KLSAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3I7ICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgotICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQ7ICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECisgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YSA9IG51bGxwdHI7Ly8gY2xpZW50IGNvbnRleHQgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgICAgIG1EZXNjcmlwdG9yID0ge307ICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbUlkID0gLTE7ICAgICAgICAgICAvLyBzeXN0ZW0gd2lkZSB1bmlxdWUgZWZmZWN0IGVuZ2luZSBpbnN0YW5jZSBJRAogICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgICAgIC8vIE11dGV4IGZvciBtRW5hYmxlZCBhY2Nlc3MKLSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUNvbnN0cnVjdExvY2s7ICAgICAvLyBNdXRleCBmb3IgaW50ZWdyYWxpdHkgY29uc3RydWN0aW9uCiAKLSAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7ICAgICAvLyBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCiAKICAgICAgLy8gSUVmZmVjdENsaWVudAogICAgICB2aXJ0dWFsIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCk7CiAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7Ci0gICAgIHZpcnR1YWwgdm9pZCBjb21tYW5kRXhlY3V0ZWQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSwKLSAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKKyAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZChpbnQzMl90IGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlcGx5RGF0YSk7CiAKIHByaXZhdGU6CiAKICAgICAgLy8gSW1wbGVtZW50cyB0aGUgSUVmZmVjdENsaWVudCBpbnRlcmZhY2UKICAgICBjbGFzcyBFZmZlY3RDbGllbnQgOgotICAgICAgICBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3RDbGllbnQsIHB1YmxpYyBhbmRyb2lkOjpJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgICAgICBwdWJsaWMgbWVkaWE6OkJuRWZmZWN0Q2xpZW50LCBwdWJsaWMgYW5kcm9pZDo6SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICB7CiAgICAgcHVibGljOgogCiAgICAgICAgIEVmZmVjdENsaWVudChBdWRpb0VmZmVjdCAqZWZmZWN0KSA6IG1FZmZlY3QoZWZmZWN0KXt9CiAKICAgICAgICAgLy8gSUVmZmVjdENsaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgY29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkgeworICAgICAgICBiaW5kZXI6OlN0YXR1cyBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSBvdmVycmlkZSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoY29udHJvbEdyYW50ZWQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgeworICAgICAgICBiaW5kZXI6OlN0YXR1cyBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgY29tbWFuZEV4ZWN1dGVkKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXBseURhdGEpIG92ZXJyaWRlIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWZmZWN0LT5jb21tYW5kRXhlY3V0ZWQoCi0gICAgICAgICAgICAgICAgICAgIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZERhdGEsIHJlcGx5RGF0YSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmJpbmRlckRpZWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjQxLDEyICs2MDIsMTAgQEAKIAogICAgIHZvaWQgYmluZGVyRGllZCgpOwogCi0gICAgc3A8SUVmZmVjdD4gICAgICAgICAgICAgbUlFZmZlY3Q7ICAgICAgICAgICAvLyBJRWZmZWN0IGJpbmRlciBpbnRlcmZhY2UKKyAgICBzcDxtZWRpYTo6SUVmZmVjdD4gICAgICBtSUVmZmVjdDsgICAgICAgICAgIC8vIElFZmZlY3QgYmluZGVyIGludGVyZmFjZQogICAgIHNwPEVmZmVjdENsaWVudD4gICAgICAgIG1JRWZmZWN0Q2xpZW50OyAgICAgLy8gSUVmZmVjdENsaWVudCBpbXBsZW1lbnRhdGlvbgogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKLSAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCi0gICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCA9IChwaWRfdCktMTsKLSAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkID0gKHVpZF90KS0xOworICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrID0gbnVsbHB0cjsgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCmluZGV4IDAwZmUyNzguLjA4YjNkYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAgIFN0cmluZzggICAgICAgICBtRGV2aWNlQWRkcmVzczsKICAgICB1aW50MzJfdCAgICAgICAgbUNiRmxhZ3M7IC8vIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggY2FsbGJhY2tzIHRvIHVzZSwgc2VlIGtDYkZsYWcqCiAgICAgLyoqIElnbm9yZSB0aGUgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OICovCi0gICAgYm9vbCAgICAgICAgICAgIG1BbGxvd1ByaXZpbGVnZWRQbGF5YmFja0NhcHR1cmUgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgICAgbUFsbG93UHJpdmlsZWdlZE1lZGlhUGxheWJhY2tDYXB0dXJlID0gZmFsc2U7CiAgICAgLyoqIEluZGljYXRlcyBpZiB0aGUgY2FsbGVyIGNhbiBjYXB0dXJlIHZvaWNlIGNvbW11bmljYXRpb24gb3V0cHV0ICovCiAgICAgYm9vbCAgICAgICAgICAgIG1Wb2ljZUNvbW11bmljYXRpb25DYXB0dXJlQWxsb3dlZCA9IGZhbHNlOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaAppbmRleCA3NDQxMDk1Li5iNTViNTA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0xNyw2ICsxNyw4IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTYyLDUgKzY0LDExIEBACiAKIHVzaW5nIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9Qcm9kdWN0U3RyYXRlZ3k+OwogCisvLyBBSURMIGNvbnZlcnNpb24gcm91dGluZXMuCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4KK2xlZ2FjeTJhaWRsX0F1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IEF1ZGlvUHJvZHVjdFN0cmF0ZWd5JiBsZWdhY3kpOworQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2R1Y3RTdHJhdGVneT4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneSYgYWlkbCk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDJmNjY2NTguLjMyNjkxOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5oIgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTQ4LDkgKzE0OSw5IEBACiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqCi0gICAgICogb3BQYWNrYWdlTmFtZTogICAgICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcHMuCisgICAgICogY2xpZW50OiAgICAgICAgICBUaGUgYXR0cmlidXRpb24gc291cmNlIG9mIHRoZSBvd25lciBvZiB0aGUgcmVjb3JkCiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZChjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBjbGllbnQpOwogCiAgICAgLyogQ3JlYXRlcyBhbiBBdWRpb1JlY29yZCBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KQEAgLTE2Myw3ICsxNjQsNyBAQAogICAgICAqIGZvcm1hdDogICAgICAgICAgICAgQXVkaW8gZm9ybWF0IChlLmcgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgZm9yIHNpZ25lZAogICAgICAqICAgICAgICAgICAgICAgICAgICAgMTYgYml0cyBwZXIgc2FtcGxlKS4KICAgICAgKiBjaGFubmVsTWFzazogICAgICAgIENoYW5uZWwgbWFzaywgc3VjaCB0aGF0IGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCi0gICAgICogb3BQYWNrYWdlTmFtZTogICAgICBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcHMuCisgICAgICogY2xpZW50OiAgICAgICAgICAgICBUaGUgYXR0cmlidXRpb24gc291cmNlIG9mIHRoZSBvd25lciBvZiB0aGUgcmVjb3JkCiAgICAgICogZnJhbWVDb3VudDogICAgICAgICBNaW5pbXVtIHNpemUgb2YgdHJhY2sgUENNIGJ1ZmZlciBpbiBmcmFtZXMuIFRoaXMgZGVmaW5lcyB0aGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uJ3MgY29udHJpYnV0aW9uIHRvIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSBvZiB0aGUgdHJhY2suICBUaGUgYWN0dWFsIHNpemUgc2VsZWN0ZWQgYnkgdGhlIEF1ZGlvUmVjb3JkIGNvdWxkCkBAIC0xODYsNyArMTg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCkBAIC0xOTQsOCArMTk1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CkBAIC0yNDIsNyArMjQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDApOwogCiAgICAgLyogUmVzdWx0IG9mIGNvbnN0cnVjdGluZyB0aGUgQXVkaW9SZWNvcmQuIFRoaXMgbXVzdCBiZSBjaGVja2VkIGZvciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uCiAgICAgICogYmVmb3JlIHVzaW5nIGFueSBBdWRpb1JlY29yZCBBUEkgKGV4Y2VwdCBmb3Igc2V0KCkpLCBiZWNhdXNlIHVzaW5nCkBAIC0zMDQsNiArMzA0LDE5IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICBib29sICAgICAgICBzdG9wcGVkKCkgY29uc3Q7CiAKKyAgICAvKiBDYWxscyBzdG9wKCkgYW5kIHRoZW4gd2FpdCBmb3IgYWxsIG9mIHRoZSBjYWxsYmFja3MgdG8gcmV0dXJuLgorICAgICAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGlmIHN0b3AoKSBvciBwYXVzZSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgZGVzdHJ1Y3Rvci4gQnV0IHNpbmNlIEF1ZGlvUmVjb3JkCisgICAgICogaXMgcmVmIGNvdW50ZWQsIHRoZSBkZXN0cnVjdG9yIG1heSBiZSBjYWxsZWQgbGF0ZXIgdGhhbiBkZXNpcmVkLgorICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBleHBsaWNpdGx5IGFzIHBhcnQgb2YgY2xvc2luZyBhbiBBdWRpb1JlY29yZAorICAgICAqIGlmIHlvdSB3YW50IHRvIGJlIGNlcnRhaW4gdGhhdCBjYWxsYmFja3MgaGF2ZSBjb21wbGV0ZWx5IGZpbmlzaGVkLgorICAgICAqCisgICAgICogVGhpcyBpcyBub3QgdGhyZWFkIHNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIG9uZSB0aHJlYWQsCisgICAgICogaWRlYWxseSBhcyB0aGUgQXVkaW9SZWNvcmQgaXMgYmVpbmcgY2xvc2VkLgorICAgICAqLworICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcEFuZEpvaW5DYWxsYmFja3MoKTsKKwogICAgIC8qIFJldHVybiB0aGUgc2luayBzYW1wbGUgcmF0ZSBmb3IgdGhpcyByZWNvcmQgdHJhY2sgaW4gSHouCiAgICAgICogSWYgc3BlY2lmaWVkIGFzIHplcm8gaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIHRoaXMgd2lsbCBiZSB0aGUgc291cmNlIHNhbXBsZSByYXRlLgogICAgICAqIFVubGlrZSBBdWRpb1RyYWNrLCB0aGUgc2FtcGxlIHJhdGUgaXMgY29uc3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHNvIGRvZXNuJ3QgbmVlZCBhIGxvY2suCkBAIC01NzgsNiArNTkxLDE2IEBACiAgICAgICAqLwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OwogCisgICAgLyogU2V0cyB0aGUgTG9nU2Vzc2lvbklkIGZpZWxkIHdoaWNoIGlzIHVzZWQgZm9yIG1ldHJpY3MgYXNzb2NpYXRpb24gb2YKKyAgICAgKiB0aGlzIG9iamVjdCB3aXRoIG90aGVyIG9iamVjdHMuIEEgbnVsbHB0ciBvciBlbXB0eSBzdHJpbmcgY2xlYXJzCisgICAgICogdGhlIGxvZ1Nlc3Npb25JZC4KKyAgICAgKi8KKyAgICAgICAgICAgIHZvaWQgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IGNoYXIgKmxvZ1Nlc3Npb25JZCk7CisKKworICAgICAgICAgICAgc3RhdHVzX3Qgc2hhcmVBdWRpb0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaGFyZWRTdGFydE1zKTsKKwogICAgICAvKgogICAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgogICAgICAgKi8KQEAgLTYzMiw3ICs2NTUsNyBAQAogCiAgICAgICAgICAgICAvLyBjYWxsZXIgbXVzdCBob2xkIGxvY2sgb24gbUxvY2sgZm9yIGFsbCBfbCBtZXRob2RzCiAKLSAgICAgICAgICAgIHN0YXR1c190IGNyZWF0ZVJlY29yZF9sKGNvbnN0IE1vZHVsbzx1aW50MzJfdD4gJmVwb2NoLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBjcmVhdGVSZWNvcmRfbChjb25zdCBNb2R1bG88dWludDMyX3Q+ICZlcG9jaCk7CiAKICAgICAgICAgICAgIC8vIEZJWE1FIGVudW0gaXMgZmFzdGVyIHRoYW4gc3RyY21wKCkgZm9yIHBhcmFtZXRlciAnZnJvbScKICAgICAgICAgICAgIHN0YXR1c190IHJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKTsKQEAgLTY3Myw3ICs2OTYsNyBAQAogCiAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1czsKIAotICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lOyAgICAgICAgIC8vIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wcy4KKyAgICBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG1DbGllbnRBdHRyaWJ1dGlvblNvdXJjZTsgLy8gT3duZXIncyBhdHRyaWJ1dGlvbiBzb3VyY2UKIAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGN1cnJlbnQgSUF1ZGlvUmVjb3JkLCB2YWx1ZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGJhY2sgYnkgQXVkaW9GbGluZ2VyIHRvIHRoZSBjbGllbnQKQEAgLTcwMSw2ICs3MjQsMTQgQEAKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgICAgICAgICAgICAgICAgICAgIC8vIElkIGZyb20gQXVkaW8gUG9saWN5IE1hbmFnZXIKKworICAgIC8qKgorICAgICAqIG1Mb2dTZXNzaW9uSWQgaXMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhpcyBBdWRpb1JlY29yZCBmb3IgdGhlIG1ldHJpY3Mgc2VydmljZS4KKyAgICAgKiBJdCBtYXkgYmUgdW5pcXVlIG9yIHNoYXJlZCB3aXRoIG90aGVyIG9iamVjdHMuICBBbiBlbXB0eSBzdHJpbmcgbWVhbnMgdGhlCisgICAgICogbG9nU2Vzc2lvbklkIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgbUxvZ1Nlc3Npb25JZHt9OworCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCkBAIC03NDAsOCArNzcxLDYgQEAKIAogICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgIG1EZWF0aE5vdGlmaWVyOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TZXF1ZW5jZTsgICAgICAgICAgICAgIC8vIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBJQXVkaW9SZWNvcmQgYXR0ZW1wdAotICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1DbGllbnRVaWQ7Ci0gICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgICAgICBtQXR0cmlidXRlczsKIAogICAgIC8vIEZvciBEZXZpY2UgU2VsZWN0aW9uIEFQSQpAQCAtNzU1LDYgKzc4NCwxMCBAQAogICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgbVNlbGVjdGVkTWljRGlyZWN0aW9uOwogICAgIGZsb2F0IG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uOwogCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID0gMDsKKyAgICBzdGQ6OnN0cmluZyAgICAgICAgICAgICAgICBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9IHt9OworICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRBdWRpb1N0YXJ0TXMgPSAwOworCiBwcml2YXRlOgogICAgIGNsYXNzIE1lZGlhTWV0cmljcyB7CiAgICAgICBwdWJsaWM6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKaW5kZXggMTljMmNiZC4uOGJhMjNhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaApAQCAtMTksMTMgKzE5LDE2IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMzUsOCArMzgsMjcgQEAKICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHsKKyAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkOworICAgIHVpZF90IHVpZDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0X2lkOworICAgIGJvb2wgc2lsZW5jZWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gcmVjb3JkX2NsaWVudF9pbmZvX3Q7CisKKy8vIEFJREwgY29udmVyc2lvbiBmdW5jdGlvbnMuCitDb252ZXJzaW9uUmVzdWx0PHJlY29yZF9jbGllbnRfaW5mb190PgorYWlkbDJsZWdhY3lfUmVjb3JkQ2xpZW50SW5mb19yZWNvcmRfY2xpZW50X2luZm9fdChjb25zdCBtZWRpYTo6UmVjb3JkQ2xpZW50SW5mbyYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvPgorbGVnYWN5MmFpZGxfcmVjb3JkX2NsaWVudF9pbmZvX3RfUmVjb3JkQ2xpZW50SW5mbyhjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCYgbGVnYWN5KTsKKwogdHlwZWRlZiB2b2lkICgqYXVkaW9fZXJyb3JfY2FsbGJhY2spKHN0YXR1c190IGVycik7CiB0eXBlZGVmIHZvaWQgKCpkeW5hbWljX3BvbGljeV9jYWxsYmFjaykoaW50IGV2ZW50LCBTdHJpbmc4IHJlZ0lkLCBpbnQgdmFsKTsKIHR5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwKQEAgLTQ3LDExICs2OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKK3R5cGVkZWYgdm9pZCAoKnJvdXRpbmdfY2FsbGJhY2spKCk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7Ci1jbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwogY2xhc3MgU3RyaW5nODsKIAorbmFtZXNwYWNlIG1lZGlhIHsKK2NsYXNzIElBdWRpb1BvbGljeVNlcnZpY2U7Cit9CisKIGNsYXNzIEF1ZGlvU3lzdGVtCiB7CiBwdWJsaWM6CkBAIC0xMjAsNiArMTQ2LDEyIEBACiAKICAgICBzdGF0aWMgdm9pZCBzZXREeW5Qb2xpY3lDYWxsYmFjayhkeW5hbWljX3BvbGljeV9jYWxsYmFjayBjYik7CiAgICAgc3RhdGljIHZvaWQgc2V0UmVjb3JkQ29uZmlnQ2FsbGJhY2socmVjb3JkX2NvbmZpZ19jYWxsYmFjayk7CisgICAgc3RhdGljIHZvaWQgc2V0Um91dGluZ0NhbGxiYWNrKHJvdXRpbmdfY2FsbGJhY2sgY2IpOworCisgICAgLy8gU2V0cyB0aGUgYmluZGVyIHRvIHVzZSBmb3IgYWNjZXNzaW5nIHRoZSBBdWRpb0ZsaW5nZXIgc2VydmljZS4gVGhpcyBlbmFibGVzIHRoZSBzeXN0ZW0gc2VydmVyCisgICAgLy8gdG8gZ3JhbnQgc3BlY2lmaWMgaXNvbGF0ZWQgcHJvY2Vzc2VzIGFjY2VzcyB0byB0aGUgYXVkaW8gc3lzdGVtLiBDdXJyZW50bHkgdXNlZCBvbmx5IGZvciB0aGUKKyAgICAvLyBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZS4KKyAgICBzdGF0aWMgdm9pZCBzZXRBdWRpb0ZsaW5nZXJCaW5kZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGF1ZGlvRmxpbmdlcik7CiAKICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gb2J0YWluIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGhhbmRsZQogICAgIHN0YXRpYyBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiBnZXRfYXVkaW9fZmxpbmdlcigpOwpAQCAtMjM5LDggKzI3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCkBAIC0yNTYsOSArMjg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCkBAIC0yODgsNyArMzE3LDcgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKIAotICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcyk7CkBAIC0yOTYsNyArMzI1LDcgQEAKICAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwpAQCAtMzA3LDcgKzMzNiw3IEBACiAgICAgLy8gYW5kIG91dHB1dCBjb25maWd1cmF0aW9uIGNhY2hlIChnT3V0cHV0cykKICAgICBzdGF0aWMgdm9pZCBjbGVhckF1ZGlvQ29uZmlnQ2FjaGUoKTsKIAotICAgIHN0YXRpYyBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBzdGF0aWMgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2U+IGdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogCiAgICAgLy8gaGVscGVycyBmb3IgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIuZ2V0UHJvcGVydHkoKSwgc2VlIGRlc2NyaXB0aW9uIHRoZXJlIGZvciBtZWFuaW5nCiAgICAgc3RhdGljIHVpbnQzMl90IGdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKQEAgLTMxNywxMSArMzQ2LDEyIEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+JiBzeXN0ZW1Vc2FnZXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgY2FwdHVyZVBvbGljeSk7CiAKLSAgICAvLyBDaGVjayBpZiBodyBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKLSAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCi0gICAgc3RhdGljIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKTsKKyAgICAvLyBJbmRpY2F0ZSBpZiBodyBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKKyAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkIGFuZCB3aGVuIHBvc3NpYmxlCisgICAgLy8gaWYgZ2FwbGVzcyB0cmFuc2l0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHN0YXRpYyBhdWRpb19vZmZsb2FkX21vZGVfdCBnZXRPZmZsb2FkU3VwcG9ydChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbyk7CiAKICAgICAvLyBjaGVjayBwcmVzZW5jZSBvZiBhdWRpbyBmbGluZ2VyIHNlcnZpY2UuCiAgICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiBiaW5kaW5nIHRvIHNlcnZpY2Ugc3VjY2VlZHMsIERFQURfT0JKRUNUIG90aGVyd2lzZQpAQCAtMzMxLDExICszNjEsMTEgQEAKICAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwogCiAgICAgLyogR2V0IGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOwogCiAgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KICAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMzYxLDExICszOTEsMTEgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCk7CiAKQEAgLTM5MywyNyArNDIzLDMwIEBACiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCiAgICAgc3RhdGljIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCk7CisgICAgc3RhdGljIHN0YXR1c190IHNldEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkKHVpZF90IHVpZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Q3VycmVudEltZVVpZCh1aWRfdCB1aWQpOwogCiAgICAgc3RhdGljIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICBib29sIGZhbGxiYWNrT25EZWZhdWx0ID0gdHJ1ZSk7CiAKICAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisgICAgc3RhdGljIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKIApAQCAtNDI1LDEzICs0NTgsMjkgQEAKICAgICAgKi8KICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcyk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogCi0gICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpOwogCi0gICAgc3RhdGljIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgc3RhdGljIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwpAQCAtNTEzLDkgKzU2MiwxMSBAQAogCiAgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRWaWJyYXRvckluZm9zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpOworCiBwcml2YXRlOgogCi0gICAgY2xhc3MgQXVkaW9GbGluZ2VyQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsIHB1YmxpYyBCbkF1ZGlvRmxpbmdlckNsaWVudAorICAgIGNsYXNzIEF1ZGlvRmxpbmdlckNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LCBwdWJsaWMgbWVkaWE6OkJuQXVkaW9GbGluZ2VyQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9GbGluZ2VyQ2xpZW50KCkgOgpAQCAtNTM1LDkgKzU4Niw5IEBACiAKICAgICAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYW4gb3V0cHV0IG9yIGlucHV0OiBrZWVwcyB0aGUgY2FjaGVkCiAgICAgICAgIC8vIHZhbHVlcyBmb3Igb3V0cHV0L2lucHV0IHBhcmFtZXRlcnMgdXAtdG8tZGF0ZSBpbiBjbGllbnQgcHJvY2VzcwotICAgICAgICB2aXJ0dWFsIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYyk7Ci0KKyAgICAgICAgYmluZGVyOjpTdGF0dXMgaW9Db25maWdDaGFuZ2VkKAorICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvSW9EZXNjcmlwdG9yJiBpb0Rlc2MpIG92ZXJyaWRlOwogCiAgICAgICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLApAQCAtNTYzLDcgKzYxNCw3IEBACiAgICAgfTsKIAogICAgIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZUNsaWVudDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbWVkaWE6OkJuQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KCkgewpAQCAtNTgxLDE4ICs2MzIsMjEgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CiAKICAgICAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoaW50MzJfdCBncm91cCwgaW50MzJfdCBmbGFncykgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpIG92ZXJyaWRlOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICBpbnQzMl90IGV2ZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvJiBjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0NvbmZpZ0Jhc2UmIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4mIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0cywKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgc291cmNlKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgb25Sb3V0aW5nVXBkYXRlZCgpOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CkBAIC02MTksNiArNjczLDcgQEAKICAgICBzdGF0aWMgc3RkOjpzZXQ8YXVkaW9fZXJyb3JfY2FsbGJhY2s+IGdBdWRpb0Vycm9yQ2FsbGJhY2tzOwogICAgIHN0YXRpYyBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBnRHluUG9saWN5Q2FsbGJhY2s7CiAgICAgc3RhdGljIHJlY29yZF9jb25maWdfY2FsbGJhY2sgZ1JlY29yZENvbmZpZ0NhbGxiYWNrOworICAgIHN0YXRpYyByb3V0aW5nX2NhbGxiYWNrIGdSb3V0aW5nQ2FsbGJhY2s7CiAKICAgICBzdGF0aWMgc2l6ZV90IGdJbkJ1ZmZTaXplOwogICAgIC8vIHByZXZpb3VzIHBhcmFtZXRlcnMgZm9yIHJlY29yZGluZyBidWZmZXIgc2l6ZSBxdWVyaWVzCkBAIC02MjYsNyArNjgxLDcgQEAKICAgICBzdGF0aWMgYXVkaW9fZm9ybWF0X3QgZ1ByZXZJbkZvcm1hdDsKICAgICBzdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ1ByZXZJbkNoYW5uZWxNYXNrOwogCi0gICAgc3RhdGljIHNwPElBdWRpb1BvbGljeVNlcnZpY2U+IGdBdWRpb1BvbGljeVNlcnZpY2U7CisgICAgc3RhdGljIHNwPG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBnQXVkaW9Qb2xpY3lTZXJ2aWNlOwogfTsKIAogfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCmluZGV4IDBkYmQ4NDIuLmNiMDA5OTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oCkBAIC0xNywyMCArMTcsMjcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT1RSQUNLX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01vZHVsby5oPgorI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvVHJhY2tDYWxsYmFjay5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUF1ZGlvVHJhY2suaCIKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrQ2FsbGJhY2suaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0cnVjdCBhdWRpb190cmFja19jYmxrX3Q7CkBAIC0xNzcsNiArMTg0LDggQEAKICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soKTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayhjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZVN0YXRlKTsKKwogICAgIC8qIENyZWF0ZXMgYW4gQXVkaW9UcmFjayBvYmplY3QgYW5kIHJlZ2lzdGVycyBpdCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KICAgICAgKiBVbnNwZWNpZmllZCB2YWx1ZXMgYXJlIHNldCB0byBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcy4KQEAgLTIyMywxMCArMjMyLDEwIEBACiAgICAgICogdHJhbnNmZXJUeXBlOiAgICAgICBIb3cgZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byBBdWRpb1RyYWNrLgogICAgICAqIG9mZmxvYWRJbmZvOiAgICAgICAgSWYgbm90IE5VTEwsIHByb3ZpZGVzIG9mZmxvYWQgcGFyYW1ldGVycyBmb3IKICAgICAgKiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkuCi0gICAgICogdWlkOiAgICAgICAgICAgICAgICBVc2VyIElEIG9mIHRoZSBhcHAgd2hpY2ggaW5pdGlhbGx5IHJlcXVlc3RlZCB0aGlzIEF1ZGlvVHJhY2sKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZvciBwb3dlciBtYW5hZ2VtZW50IHRyYWNraW5nLCBvciAtMSBmb3IgY3VycmVudCB1c2VyIElELgotICAgICAqIHBpZDogICAgICAgICAgICAgICAgUHJvY2VzcyBJRCBvZiB0aGUgYXBwIHdoaWNoIGluaXRpYWxseSByZXF1ZXN0ZWQgdGhpcyBBdWRpb1RyYWNrCi0gICAgICogICAgICAgICAgICAgICAgICAgICBmb3IgcG93ZXIgbWFuYWdlbWVudCB0cmFja2luZywgb3IgLTEgZm9yIGN1cnJlbnQgcHJvY2VzcyBJRC4KKyAgICAgKiBhdHRyaWJ1dGlvblNvdXJjZTogIFRoZSBhdHRyaWJ1dGlvbiBzb3VyY2Ugb2YgdGhlIGFwcCB3aGljaCBpbml0aWFsbHkgcmVxdWVzdGVkIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2suCisgICAgICogICAgICAgICAgICAgICAgICAgICBJbmNsdWRlcyB0aGUgVUlEIGFuZCBQSUQgZm9yIHBvd2VyIG1hbmFnZW1lbnQgdHJhY2tpbmcsIG9yIC0xIGZvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB1c2VyL3Byb2Nlc3MgSUQsIHBsdXMgdGhlIHBhY2thZ2UgbmFtZS4KICAgICAgKiBwQXR0cmlidXRlczogICAgICAgIElmIG5vdCBOVUxMLCBzdXBlcnNlZGVzIHN0cmVhbVR5cGUgZm9yIHVzZSBjYXNlIHNlbGVjdGlvbi4KICAgICAgKiBkb05vdFJlY29ubmVjdDogICAgIElmIHNldCB0byB0cnVlLCBBdWRpb1RyYWNrIHdvbid0IGF1dG9tYXRpY2FsbHkgcmVjcmVhdGUgdGhlIElBdWRpb1RyYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kZXIgdG8gQXVkaW9GbGluZ2VyLgpAQCAtMjUzLDggKzI2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSA9IFRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmLApAQCAtMjg0LDggKzI5Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCA9IEFVRElPX1VJRF9JTlZBTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7CkBAIC0zMzIsNiArMzQxLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyX3R5cGUgdHJhbnNmZXJUeXBlID0gVFJBTlNGRVJfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAvLyBGSVhNRShiLzE2OTg4OTcxNCk6IFZlbmRvciBjb2RlIGRlcGVuZHMgb24gdGhlIG9sZCBtZXRob2Qgc2lnbmF0dXJlIGF0IGxpbmsgdGltZQorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfdCBjYmYgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkQ2FuQ2FsbEphdmEgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkICA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUgPSBUUkFOU0ZFUl9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCkBAIC00MDIsNiArNDMyLDE5IEBACiAgICAgICovCiAgICAgICAgICAgICBzc2l6ZV90ICAgICBzZXRCdWZmZXJTaXplSW5GcmFtZXMoc2l6ZV90IHNpemUpOwogCisgICAgLyogUmV0dXJucyB0aGUgc3RhcnQgdGhyZXNob2xkIG9uIHRoZSBidWZmZXIgZm9yIGF1ZGlvIHN0cmVhbWluZworICAgICAqIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgdGhlIEF1ZGlvVHJhY2sgaXMgbm90IGluaXRpYWxpemVkLgorICAgICAqLworICAgICAgICAgICAgc3NpemVfdCAgICAgZ2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpIGNvbnN0OworCisgICAgLyogU2V0cyB0aGUgc3RhcnQgdGhyZXNob2xkIGluIGZyYW1lcyBvbiB0aGUgYnVmZmVyIGZvciBhdWRpbyBzdHJlYW1pbmcuCisgICAgICoKKyAgICAgKiBNYXkgYmUgY2xhbXBlZCBpbnRlcm5hbGx5LiBSZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWUgc2V0LCBvciBhIG5lZ2F0aXZlCisgICAgICogdmFsdWUgaWYgdGhlIEF1ZGlvVHJhY2sgaXMgbm90IGluaXRpYWxpemVkIG9yIGlmIHRoZSBpbnB1dAorICAgICAqIGlzIHplcm8gb3IgZ3JlYXRlciB0aGFuIElOVF9NQVguCisgICAgICovCisgICAgICAgICAgICBzc2l6ZV90ICAgICBzZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKHNpemVfdCBzdGFydFRocmVzaG9sZEluRnJhbWVzKTsKKwogICAgIC8qIFJldHVybiB0aGUgc3RhdGljIGJ1ZmZlciBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIG9yIDAgZm9yIHN0cmVhbWluZyBtb2RlICovCiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKQEAgLTQzOSw2ICs0ODIsMTkgQEAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3AoKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0b3BwZWQoKSBjb25zdDsKIAorICAgIC8qIENhbGwgc3RvcCgpIGFuZCB0aGVuIHdhaXQgZm9yIGFsbCBvZiB0aGUgY2FsbGJhY2tzIHRvIHJldHVybi4KKyAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBpZiBzdG9wKCkgb3IgcGF1c2UoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGRlc3RydWN0b3IuIEJ1dCBzaW5jZSBBdWRpb1RyYWNrCisgICAgICogaXMgcmVmIGNvdW50ZWQsIHRoZSBkZXN0cnVjdG9yIG1heSBiZSBjYWxsZWQgbGF0ZXIgdGhhbiBkZXNpcmVkLgorICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBleHBsaWNpdGx5IGFzIHBhcnQgb2YgY2xvc2luZyBhbiBBdWRpb1RyYWNrCisgICAgICogaWYgeW91IHdhbnQgdG8gYmUgY2VydGFpbiB0aGF0IGNhbGxiYWNrcyBoYXZlIGNvbXBsZXRlbHkgZmluaXNoZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG5vdCB0aHJlYWQgc2FmZSBhbmQgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gb25lIHRocmVhZCwKKyAgICAgKiBpZGVhbGx5IGFzIHRoZSBBdWRpb1RyYWNrIGlzIGJlaW5nIGNsb3NlZC4KKyAgICAgKi8KKyAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BBbmRKb2luQ2FsbGJhY2tzKCk7CisKICAgICAvKiBGbHVzaCBhIHN0b3BwZWQgb3IgcGF1c2VkIHRyYWNrLiBBbGwgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGlzIGRpc2NhcmRlZCBpbW1lZGlhdGVseS4KICAgICAgKiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIGRyYWluaW5nIHRoZSBidWZmZXJzIHdpdGhvdXQgbWl4aW5nIG9yIG91dHB1dC4KICAgICAgKiBGbHVzaCBpcyBpbnRlbmRlZCBmb3Igc3RyZWFtaW5nIG1vZGUsIGZvciBleGFtcGxlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gbm9uLWNvbnRpZ3VvdXMgY29udGVudC4KQEAgLTQ4Niw2ICs1NDIsMTggQEAKICAgICAgKi8KICAgICAgICAgICAgIHVpbnQzMl90ICAgIGdldE9yaWdpbmFsU2FtcGxlUmF0ZSgpIGNvbnN0OwogCisgICAgLyogU2V0cyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIG9uIHRoZSBvdXRwdXQgZGV2aWNlLiAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSk7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gc2V0dGluZy4gKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBjb25zdDsKKworICAgIC8qIFNldHMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4gKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKTsKKworICAgIC8qIFJldHVybnMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4gKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgY29uc3Q7CisKICAgICAvKiBTZXQgc291cmNlIHBsYXliYWNrIHJhdGUgZm9yIHRpbWVzdHJldGNoCiAgICAgICogMS4wIGlzIG5vcm1hbCBzcGVlZDogPCAxLjAgaXMgc2xvd2VyLCA+IDEuMCBpcyBmYXN0ZXIKICAgICAgKiAxLjAgaXMgbm9ybWFsIHBpdGNoOiA8IDEuMCBpcyBsb3dlciBwaXRjaCwgPiAxLjAgaXMgaGlnaGVyIHBpdGNoCkBAIC00OTksNyArNTY3LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKIAogICAgIC8qIFJldHVybiBjdXJyZW50IHBsYXliYWNrIHJhdGUgKi8KLSAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiBnZXRQbGF5YmFja1JhdGUoKSBjb25zdDsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiBnZXRQbGF5YmFja1JhdGUoKTsKIAogICAgIC8qIEVuYWJsZXMgbG9vcGluZyBhbmQgc2V0cyB0aGUgc3RhcnQgYW5kIGVuZCBwb2ludHMgb2YgbG9vcGluZy4KICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3Igc3RhdGljIGJ1ZmZlciBtb2RlLgpAQCAtNjIxLDkgKzY4OSw3IEBACiAgICAgICogIGhhbmRsZSBvbiBhdWRpbyBoYXJkd2FyZSBvdXRwdXQsIG9yIEFVRElPX0lPX0hBTkRMRV9OT05FIGlmIHRoZQogICAgICAqICB0cmFjayBuZWVkZWQgdG8gYmUgcmUtY3JlYXRlZCBidXQgdGhhdCBmYWlsZWQKICAgICAgKi8KLXByaXZhdGU6CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAgICBnZXRPdXRwdXQoKSBjb25zdDsKLXB1YmxpYzoKIAogICAgIC8qIFNlbGVjdHMgdGhlIGF1ZGlvIGRldmljZSB0byB1c2UgZm9yIG91dHB1dCBvZiB0aGlzIEF1ZGlvVHJhY2suIEEgdmFsdWUgb2YKICAgICAgKiBBVURJT19QT1JUX0hBTkRMRV9OT05FIGluZGljYXRlcyBkZWZhdWx0IChBdWRpb1BvbGljeU1hbmFnZXIpIHJvdXRpbmcuCkBAIC05NDcsNiArMTAxMywyMyBAQAogICAgICAqLwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OwogCisgICAgLyogU2V0cyB0aGUgTG9nU2Vzc2lvbklkIGZpZWxkIHdoaWNoIGlzIHVzZWQgZm9yIG1ldHJpY3MgYXNzb2NpYXRpb24gb2YKKyAgICAgKiB0aGlzIG9iamVjdCB3aXRoIG90aGVyIG9iamVjdHMuIEEgbnVsbHB0ciBvciBlbXB0eSBzdHJpbmcgY2xlYXJzCisgICAgICogdGhlIGxvZ1Nlc3Npb25JZC4KKyAgICAgKi8KKyAgICAgICAgICAgIHZvaWQgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IGNoYXIgKmxvZ1Nlc3Npb25JZCk7CisKKyAgICAvKiBTZXRzIHRoZSBwbGF5ZXJJSWQgZmllbGQgdG8gYXNzb2NpYXRlIHRoZSBBdWRpb1RyYWNrIHdpdGggYW4gaW50ZXJmYWNlIG1hbmFnZWQgYnkKKyAgICAgKiBBdWRpb1NlcnZpY2UuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIHRoZW4gdGhlIHBsYXllcklJZCBpcyByZXBvcnRlZCBhcyAtMQorICAgICAqIChub3QgYXNzb2NpYXRlZCB3aXRoIGFuIEF1ZGlvU2VydmljZSBwbGF5ZXIgaW50ZXJmYWNlKS4KKyAgICAgKgorICAgICAqIEZvciBtZXRyaWNzIHB1cnBvc2VzLCB3ZSBrZWVwIHRoZSBwbGF5ZXJJSWQgYXNzb2NpYXRpb24gaW4gdGhlIG5hdGl2ZQorICAgICAqIGNsaWVudCBBdWRpb1RyYWNrIHRvIGltcHJvdmUgdGhlIHJvYnVzdG5lc3MgdW5kZXIgdHJhY2sgcmVzdG9yYXRpb24uCisgICAgICovCisgICAgICAgICAgICB2b2lkIHNldFBsYXllcklJZChpbnQgcGxheWVySUlkKTsKKwogICAgICAgICAgICAgdm9pZCBzZXRBdWRpb1RyYWNrQ2FsbGJhY2soY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2stPnNldEF1ZGlvVHJhY2tDYWxsYmFjayhjYWxsYmFjayk7CiAgICAgICAgICAgICB9CkBAIC0xMDQzLDggKzExMjYsMTQgQEAKIAogICAgICAgICAgICAgdm9pZCAgICAgdXBkYXRlUm91dGVkRGV2aWNlSWRfbCgpOwogCisgICAgICAgICAgICAvKiBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuICovCisgICAgICAgICAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGVfbChhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpOworCisgICAgICAgICAgICAvKiBTZXRzIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuICovCisgICAgICAgICAgICBzdGF0dXNfdCBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWxfbChmbG9hdCBsZXZlbGRCKTsKKwogICAgIC8vIE5leHQgNCBmaWVsZHMgbWF5IGJlIGNoYW5nZWQgaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCi0gICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CisgICAgc3A8bWVkaWE6OklBdWRpb1RyYWNrPiAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCkBAIC0xMDc1LDggKzExNjQsOSBAQAogCiAgICAgLy8gY29uc3RhbnQgYWZ0ZXIgY29uc3RydWN0b3Igb3Igc2V0KCkKICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtRm9ybWF0OyAgICAgICAgICAgICAgICAvLyBhcyByZXF1ZXN0ZWQgYnkgY2xpZW50LCBub3QgZm9yY2VkIHRvIDE2LWJpdAotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlOyAgICAgICAgICAgIC8vIG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUIGltcGxpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIEF1ZGlvVHJhY2sgaGFzIHZhbGlkIGF0dHJpYnV0ZXMKKyAgICAvLyBtT3JpZ2luYWxTdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUIGltcGxpZXMgdGhpcyBBdWRpb1RyYWNrIGhhcyB2YWxpZCBhdHRyaWJ1dGVzCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbU9yaWdpbmFsU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudDsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICBtQ2hhbm5lbE1hc2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbVNoYXJlZEJ1ZmZlcjsKQEAgLTEyMTAsNiArMTMwMCwxOSBAQAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUG9ydElkOyAgICAgICAgICAgICAgICAgICAgLy8gSWQgZnJvbSBBdWRpbyBQb2xpY3kgTWFuYWdlcgogCisgICAgLyoqCisgICAgICogbVBsYXllcklJZCBpcyB0aGUgcGxheWVyIGlkIG9mIHRoZSBBdWRpb1RyYWNrIHVzZWQgYnkgQXVkaW9NYW5hZ2VyLgorICAgICAqIEZvciBhbiBBdWRpb1RyYWNrIGNyZWF0ZWQgYnkgdGhlIEphdmEgaW50ZXJmYWNlLCB0aGlzIGlzIGdlbmVyYWxseSBzZXQgb25jZS4KKyAgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGxheWVySUlkID0gLTE7ICAvLyBBdWRpb01hbmFnZXIuaCBQTEFZRVJfUElJRF9JTlZBTElECisKKyAgICAvKioKKyAgICAgKiBtTG9nU2Vzc2lvbklkIGlzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoaXMgQXVkaW9UcmFjayBmb3IgdGhlIG1ldHJpY3Mgc2VydmljZS4KKyAgICAgKiBJdCBtYXkgYmUgdW5pcXVlIG9yIHNoYXJlZCB3aXRoIG90aGVyIG9iamVjdHMuICBBbiBlbXB0eSBzdHJpbmcgbWVhbnMgdGhlCisgICAgICogbG9nU2Vzc2lvbklkIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgbUxvZ1Nlc3Npb25JZHt9OworCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNQcmlvcml0eTsgICAgICAgICAgLy8gYmVmb3JlIHN0YXJ0KCkKQEAgLTEyNDgsMTEgKzEzNTEsMTQgQEAKIAogICAgIHNwPERlYXRoTm90aWZpZXI+ICAgICAgIG1EZWF0aE5vdGlmaWVyOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1TZXF1ZW5jZTsgICAgICAgICAgICAgIC8vIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBJQXVkaW9UcmFjayBhdHRlbXB0Ci0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKLSAgICBwaWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkOworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgbUNsaWVudEF0dHJpYnV0aW9uU291cmNlOwogCiAgICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+IG1EZXZpY2VDYWxsYmFjazsKIAorICAgIC8vIENhY2hlZCB2YWx1ZXMgdG8gcmVzdG9yZSBhbG9uZyB3aXRoIHRoZSBBdWRpb1RyYWNrLgorICAgIGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbUR1YWxNb25vTW9kZSA9IEFVRElPX0RVQUxfTU9OT19NT0RFX09GRjsKKyAgICBmbG9hdCBtQXVkaW9EZXNjcmlwdGlvbk1peExldmVsZEIgPSAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisKIHByaXZhdGU6CiAgICAgY2xhc3MgTWVkaWFNZXRyaWNzIHsKICAgICAgIHB1YmxpYzoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKaW5kZXggOWE2ZWEwNy4uOTQ2ZDU4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKQEAgLTE3LDYgKzE3LDggQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KQEAgLTUxLDQgKzUzLDEwIEBACiAKIHVzaW5nIEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1ZvbHVtZUdyb3VwPjsKIAorLy8gQUlETCBjb252ZXJzaW9uIHJvdXRpbmVzLgorQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Wb2x1bWVHcm91cD4KK2xlZ2FjeTJhaWRsX0F1ZGlvVm9sdW1lR3JvdXAoY29uc3QgQXVkaW9Wb2x1bWVHcm91cCYgbGVnYWN5KTsKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9Wb2x1bWVHcm91cD4KK2FpZGwybGVnYWN5X0F1ZGlvVm9sdW1lR3JvdXAoY29uc3QgbWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXAmIGFpZGwpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCmluZGV4IDYxMmNlN2EuLjBlMDU5ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oCkBAIC0yNCwxMDEgKzI0LDU3IEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1RyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUVmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0lFZmZlY3RDbGllbnQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9WaWJyYXRvckluZm8uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0JuQXVkaW9GbGluZ2VyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQnBBdWRpb0ZsaW5nZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlcXVlc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0NyZWF0ZUVmZmVjdFJlc3BvbnNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVSZWNvcmRSZXNwb25zZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvQ3JlYXRlVHJhY2tSZXF1ZXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9DcmVhdGVUcmFja1Jlc3BvbnNlLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1RyYWNrLmgiCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JRWZmZWN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9JRWZmZWN0Q2xpZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXF1ZXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9PcGVuSW5wdXRSZXNwb25zZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvT3Blbk91dHB1dFJlcXVlc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL09wZW5PdXRwdXRSZXNwb25zZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvVHJhY2tTZWNvbmRhcnlPdXRwdXRJbmZvLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jbGFzcyBJQXVkaW9GbGluZ2VyIDogcHVibGljIElJbnRlcmZhY2UKLXsKK2NsYXNzIElBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXIpOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX1NFUlZJQ0VfTkFNRVtdID0gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOworCisgICAgdmlydHVhbCB+SUF1ZGlvRmxpbmdlcigpID0gZGVmYXVsdDsKIAogICAgIC8qIENyZWF0ZVRyYWNrSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvVHJhY2sgdG8gQXVkaW9GbGluZ2VyCiAgICAgICogd2hlbiBjYWxsaW5nIGNyZWF0ZVRyYWNrKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgdXBkYXRlZCBieSBBdWRpb0ZsaW5nZXIKICAgICAgKiBhbmQgcmV0dXJuZWQgaW4gQ3JlYXRlVHJhY2tPdXRwdXQgb2JqZWN0CiAgICAgICovCi0gICAgY2xhc3MgQ3JlYXRlVHJhY2tJbnB1dCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKKyAgICBjbGFzcyBDcmVhdGVUcmFja0lucHV0IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdHRyLnRhZ3NbQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0xXSA9ICdcMCc7Ci0gICAgICAgICAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNsaWVudEluZm8ucmVhZEZyb21QYXJjZWwocGFyY2VsKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgcGl0ZmFsbHMgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhlIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciA9IGludGVyZmFjZV9jYXN0PElNZW1vcnk+KHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDAgfHwgc2hhcmVkQnVmZmVyLT51bnNlY3VyZVBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZpY2F0aW9uc1BlckJ1ZmZlciA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcGVlZCA9IHBhcmNlbC0+cmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICBhdWRpb1RyYWNrQ2FsbGJhY2sgPSBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4oCi0gICAgICAgICAgICAgICAgICAgIHBhcmNlbC0+cmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgIGZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnNlc3Npb25JZCwgc2l6ZW9mKGF1ZGlvX3Nlc3Npb25fdCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGUgewotICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICAodm9pZCljbGllbnRJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNoYXJlZEJ1ZmZlcikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIobm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlRmxvYXQoc3BlZWQpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihhdWRpb1RyYWNrQ2FsbGJhY2spKTsKLQotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiBpbnB1dCAqLwogICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cjsKICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnOwpAQCAtMTM0LDUwICs5MCwxNyBAQAogICAgICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVDb3VudDsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOwogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkOworCisgICAgICAgIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdD4gdG9BaWRsKCkgY29uc3Q7CisgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVRyYWNrSW5wdXQ+IGZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGFpZGwpOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVUcmFja091dHB1dCBjb250YWlucyBhbGwgb3V0cHV0IGFyZ3VtZW50cyByZXR1cm5lZCBieSBBdWRpb0ZsaW5nZXIgdG8gQXVkaW9UcmFjawogICAgICAqIHdoZW4gY2FsbGluZyBjcmVhdGVUcmFjaygpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZCBhcyBJL08gZm9yIHVwZGF0ZSBieQogICAgICAqIENyZWF0ZVRyYWNrSW5wdXQuCiAgICAgICovCi0gICAgY2xhc3MgQ3JlYXRlVHJhY2tPdXRwdXQgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgY2xhc3MgQ3JlYXRlVHJhY2tPdXRwdXQgewogICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX291dHB1dF9mbGFnc190KSk7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLQotICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICBzYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICBhZkZyYW1lQ291bnQgPSBwYXJjZWwtPnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGFmTGF0ZW5jeU1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLQotICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlVWludDMyKHNhbXBsZVJhdGUpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoYWZTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMihhZkxhdGVuY3lNcyk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50OwpAQCAtMTg3LDcwICsxMTAsMzAgQEAKIAogICAgICAgICAvKiBvdXRwdXQgKi8KICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwogICAgICAgICBzaXplX3QgICBhZkZyYW1lQ291bnQ7CiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKICAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXM7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dElkOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICAgICAgc3A8bWVkaWE6OklBdWRpb1RyYWNrPiBhdWRpb1RyYWNrOworCisgICAgICAgIENvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2U+IHRvQWlkbCgpIGNvbnN0OworICAgICAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxDcmVhdGVUcmFja091dHB1dD4gZnJvbUFpZGwoY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UmIGFpZGwpOwogICAgIH07CiAKICAgICAvKiBDcmVhdGVSZWNvcmRJbnB1dCBjb250YWlucyBhbGwgaW5wdXQgYXJndW1lbnRzIHNlbnQgYnkgQXVkaW9SZWNvcmQgdG8gQXVkaW9GbGluZ2VyCiAgICAgICogd2hlbiBjYWxsaW5nIGNyZWF0ZVJlY29yZCgpIGluY2x1ZGluZyBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYnkgQXVkaW9GbGluZ2VyCiAgICAgICogYW5kIHJldHVybmVkIGluIENyZWF0ZVJlY29yZE91dHB1dCBvYmplY3QKICAgICAgKi8KLSAgICBjbGFzcyBDcmVhdGVSZWNvcmRJbnB1dCA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKKyAgICBjbGFzcyBDcmVhdGVSZWNvcmRJbnB1dCB7CiAgICAgcHVibGljOgotICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgLyogaW5wdXQgYXJndW1lbnRzKi8KLSAgICAgICAgICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXR0ci50YWdzW0FVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtMV0gPSAnXDAnOwotICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2xpZW50SW5mby5yZWFkRnJvbVBhcmNlbChwYXJjZWwpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZyaWlkLCBzaXplb2YoYXVkaW9fdW5pcXVlX2lkX3QpKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOwotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZSB7Ci0gICAgICAgICAgICAvKiBpbnB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwotICAgICAgICAgICAgKHZvaWQpY2xpZW50SW5mby53cml0ZVRvUGFyY2VsKHBhcmNlbCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZyaWlkLCBzaXplb2YoYXVkaW9fdW5pcXVlX2lkX3QpKTsKLQotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQ2NChub3RpZmljYXRpb25GcmFtZUNvdW50KTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnNlbGVjdGVkRGV2aWNlSWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZXNzaW9uSWQsIHNpemVvZihhdWRpb19zZXNzaW9uX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCiAgICAgICAgIC8qIGlucHV0ICovCiAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOwogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgQXVkaW9DbGllbnQgY2xpZW50SW5mbzsKLSAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZDsKKyAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNczsKIAogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKQEAgLTI1OCw3NyArMTQxLDE3IEBACiAgICAgICAgIHNpemVfdCBub3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQ7CisKKyAgICAgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdD4gdG9BaWRsKCkgY29uc3Q7CisgICAgICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PENyZWF0ZVJlY29yZElucHV0PiBmcm9tQWlkbChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgYWlkbCk7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZE91dHB1dCBjb250YWlucyBhbGwgb3V0cHV0IGFyZ3VtZW50cyByZXR1cm5lZCBieSBBdWRpb0ZsaW5nZXIgdG8gQXVkaW9SZWNvcmQKICAgICAgKiB3aGVuIGNhbGxpbmcgY3JlYXRlUmVjb3JkKCkgaW5jbHVkaW5nIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIGFzIEkvTyBmb3IgdXBkYXRlIGJ5CiAgICAgICogQ3JlYXRlUmVjb3JkSW5wdXQuCiAgICAgICovCi0gICAgY2xhc3MgQ3JlYXRlUmVjb3JkT3V0cHV0IDogcHVibGljIFBhcmNlbGFibGUgeworICAgIGNsYXNzIENyZWF0ZVJlY29yZE91dHB1dCB7CiAgICAgcHVibGljOgotICAgICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCi0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOwotICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhcmNlbC0+cmVhZEludDY0KCk7Ci0gICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZUNvdW50ID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2VsZWN0ZWREZXZpY2VJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7Ci0KLSAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZFVpbnQzMigpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZpbnB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKLSAgICAgICAgICAgIGlmIChwYXJjZWwtPnJlYWRJbnQzMigpICE9IDApIHsKLSAgICAgICAgICAgICAgICBjYmxrID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeT4ocGFyY2VsLT5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkKLSAgICAgICAgICAgICAgICAvLyAgICAgICBwaXRmYWxscyAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAvLyAgICAgICB0aGUgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICAgICAgaWYgKGNibGsgPT0gMCB8fCBjYmxrLT51bnNlY3VyZVBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZEludDMyKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihwYXJjZWwtPnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eQotICAgICAgICAgICAgICAgIC8vICAgICAgIHBpdGZhbGxzIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcwotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoZSBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVycyA9PSAwIHx8IGJ1ZmZlcnMtPnVuc2VjdXJlUG9pbnRlcigpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmZmxhZ3MsIHNpemVvZihhdWRpb19pbnB1dF9mbGFnc190KSk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQobm90aWZpY2F0aW9uRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZzZWxlY3RlZERldmljZUlkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmc2Vzc2lvbklkLCBzaXplb2YoYXVkaW9fc2Vzc2lvbl90KSk7Ci0KLSAgICAgICAgICAgIC8qIG91dHB1dCBhcmd1bWVudHMqLwotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZVVpbnQzMihzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmlucHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gMCkgewotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNibGspKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlcnMgIT0gMCkgewotICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlcnMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQ7CkBAIC0zNDIsMjEgKzE2NSwyNiBAQAogICAgICAgICBzcDxJTWVtb3J5PiBjYmxrOwogICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICAgICAgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gYXVkaW9SZWNvcmQ7CisKKyAgICAgICAgQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2U+IHRvQWlkbCgpIGNvbnN0OworICAgICAgICBzdGF0aWMgQ29udmVyc2lvblJlc3VsdDxDcmVhdGVSZWNvcmRPdXRwdXQ+CisgICAgICAgIGZyb21BaWRsKGNvbnN0IG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSYgYWlkbCk7CiAgICAgfTsKIAotICAgIC8vIGludmFyaWFudCBvbiBleGl0IGZvciBhbGwgQVBJcyB0aGF0IHJldHVybiBhbiBzcDw+OgotICAgIC8vICAgKHJldHVybiB2YWx1ZSAhPSAwKSA9PSAoKnN0YXR1cyA9PSBOT19FUlJPUikKLQogICAgIC8qIGNyZWF0ZSBhbiBhdWRpbyB0cmFjayBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgotICAgICAqIHJldHVybiBudWxsIGlmIHRoZSB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKiBUaGUgYXVkaW9UcmFjayBmaWVsZCB3aWxsIGJlIG51bGwgaWYgdGhlIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkIGFuZCB0aGUgc3RhdHVzIHdpbGwgcmVmbGVjdAorICAgICAqIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzcDxJQXVkaW9UcmFjaz4gY3JlYXRlVHJhY2soY29uc3QgQ3JlYXRlVHJhY2tJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVHJhY2tPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlJiBvdXRwdXQpID0gMDsKIAotICAgIHZpcnR1YWwgc3A8bWVkaWE6OklBdWRpb1JlY29yZD4gY3JlYXRlUmVjb3JkKGNvbnN0IENyZWF0ZVJlY29yZElucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKSA9IDA7CisgICAgLyogY3JlYXRlIGFuIGF1ZGlvIHJlY29yZCBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggQXVkaW9GbGluZ2VyLgorICAgICAqIFRoZSBhdWRpb1JlY29yZCBmaWVsZCB3aWxsIGJlIG51bGwgaWYgdGhlIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkIGFuZCB0aGUgc3RhdHVzIHdpbGwgcmVmbGVjdAorICAgICAqIGZhaWx1cmUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZWNvcmQoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSYgb3V0cHV0KSA9IDA7CiAKICAgICAvLyBGSVhNRSBTdXJwcmlzaW5nbHksIGZvcm1hdC9sYXRlbmN5IGRvbid0IHdvcmsgZm9yIGlucHV0IGhhbmRsZXMKIApAQCAtNDEyLDMyICsyNDAsMjQgQEAKICAgICAvLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBhdWRpbyBpbnB1dC9vdXRwdXQgY2hhbmdlIGFuZCB0cmFjayBub3RpZmljYXRpb25zLgogICAgIC8vIEZvciBhIGdpdmVuIGNhbGxpbmcgcGlkLCBBdWRpb0ZsaW5nZXIgZGlzcmVnYXJkcyBhbnkgcmVnaXN0cmF0aW9ucyBhZnRlciB0aGUgZmlyc3QuCiAgICAgLy8gVGh1cyB0aGUgSUF1ZGlvRmxpbmdlckNsaWVudCBtdXN0IGJlIGEgc2luZ2xldG9uIHBlciBwcm9jZXNzLgotICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSA9IDA7CiAKICAgICAvLyByZXRyaWV2ZSB0aGUgYXVkaW8gcmVjb3JkaW5nIGJ1ZmZlciBzaXplIGluIGJ5dGVzCiAgICAgLy8gRklYTUUgVGhpcyBBUEkgYXNzdW1lcyBhIHJvdXRlLCBhbmQgc28gc2hvdWxkIGJlIGRlcHJlY2F0ZWQuCiAgICAgdmlydHVhbCBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogcmVzcG9uc2UpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDIpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VzcGVuZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIHJlc3BvbnNlKSA9IDA7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52YWxpZGF0ZVN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwpAQCAtNDYzLDIwICsyODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3A8SUVmZmVjdD4gY3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciBkb2Vzbid0IHRha2Ugb3ZlciBoYW5kbGUgcmVmZXJlbmNlIGZyb20gY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbGxpbmdQYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9iZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlKiByZXNwb25zZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CkBAIC00OTksMTIgKzMwNyw4IEBACiAgICAgLy8gaXMgb2J0YWluZWQgZnJvbSBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXIuTWVtb3J5SW5mby50b3RhbE1lbS4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KSA9IDA7CiAKLSAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMpID0gMDsKLQogICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSA9IDA7CiAKICAgICAvKiBDcmVhdGUgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtNTMyLDI0ICszMzYsMzA0IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSA9IDA7CisKKyAgICAvLyBTZXQgdmlicmF0b3JzJyBpbmZvcm1hdGlvbi4KKyAgICAvLyBUaGUgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIEhhcHRpY0dlbmVyYXRvci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpYnJhdG9ySW5mb3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+JiB2aWJyYXRvckluZm9zKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgPSAwOwogfTsKIAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuQXVkaW9GbGluZ2VyIDogcHVibGljIEJuSW50ZXJmYWNlPElBdWRpb0ZsaW5nZXI+Ci17CisvKioKKyAqIEEgY2xpZW50LXNpZGUgYWRhcHRlciwgd3JhcHBpbmcgYW4gSUF1ZGlvRmxpbmdlclNlcnZpY2UgaW5zdGFuY2UgYW5kIHByZXNlbnRpbmcgaXQgYXMgYW4KKyAqIElBdWRpb0ZsaW5nZXIuIEludGVuZGVkIHRvIGJlIHVzZWQgYnkgbGVnYWN5IGNsaWVudCBjb2RlIHRoYXQgd2FzIHdyaXR0ZW4gYWdhaW5zdCBJQXVkaW9GbGluZ2VyLAorICogYmVmb3JlIElBdWRpb0ZsaW5nZXJTZXJ2aWNlIHdhcyBpbnRyb2R1Y2VkIGFzIGFuIEFJREwgc2VydmljZS4KKyAqIE5ldyBjbGllbnRzIHNob3VsZCBub3QgdXNlIHRoaXMgYWRhcHRlciwgYnV0IHJhdGhlciBJQXVkaW9GbGluZ2VyU2VydmljZSBkaXJlY3RseSwgdmlhCisgKiBCcEF1ZGlvRmxpbmdlclNlcnZpY2UuCisgKi8KK2NsYXNzIEF1ZGlvRmxpbmdlckNsaWVudEFkYXB0ZXIgOiBwdWJsaWMgSUF1ZGlvRmxpbmdlciB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7CisgICAgZXhwbGljaXQgQXVkaW9GbGluZ2VyQ2xpZW50QWRhcHRlcihjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlclNlcnZpY2U+IGRlbGVnYXRlKTsKIAotICAgIC8vIFJlcXVlc3RzIG1lZGlhLmxvZyB0byBzdGFydCBtZXJnaW5nIGxvZyBidWZmZXJzCi0gICAgdmlydHVhbCB2b2lkIHJlcXVlc3RMb2dNZXJnZSgpID0gMDsKKyAgICBzdGF0dXNfdCBjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlVHJhY2tSZXNwb25zZSYgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjcmVhdGVSZWNvcmQoY29uc3QgbWVkaWE6OkNyZWF0ZVJlY29yZFJlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVzcG9uc2UmIG91dHB1dCkgb3ZlcnJpZGU7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGZyYW1lQ291bnQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IG92ZXJyaWRlOworICAgIHVpbnQzMl90IGxhdGVuY3koYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkgb3ZlcnJpZGU7CisgICAgZmxvYXQgbWFzdGVyVm9sdW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBtYXN0ZXJNdXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0KiBiYWxhbmNlKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpIG92ZXJyaWRlOworICAgIGZsb2F0IHN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBnZXRNaWNNdXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCBzaWxlbmNlZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIG92ZXJyaWRlOworICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykKKyAgICBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZTsKKyAgICBzaXplX3QgZ2V0SW5wdXRCdWZmZXJTaXplKHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN1c3BlbmRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZXN0b3JlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgb3BlbklucHV0KGNvbnN0IG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIHJlc3BvbnNlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbnZhbGlkYXRlU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90KiBoYWxGcmFtZXMsIHVpbnQzMl90KiBkc3BGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSBjb25zdCBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBnZXRJbnB1dEZyYW1lc0xvc3QoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0IG92ZXJyaWRlOworICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sIHBpZF90IHBpZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90KiBudW1FZmZlY3RzKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBxdWVyeUVmZmVjdCh1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogcEVmZmVjdFVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBwVHlwZVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVFZmZlY3RSZXNwb25zZSogcmVzcG9uc2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgb3ZlcnJpZGU7CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyKiBuYW1lKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCkgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGdldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50KCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyogcG9ydCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QqIGhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCogbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoZXMpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGNvbmZpZykgb3ZlcnJpZGU7CisgICAgYXVkaW9faHdfc3luY190IGdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpIG92ZXJyaWRlOworICAgIHNpemVfdCBmcmFtZUNvdW50SEFMKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBtaWNyb3Bob25lcykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0VmlicmF0b3JJbmZvcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8+JiB2aWJyYXRvckluZm9zKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyU2VydmljZT4gbURlbGVnYXRlOwogfTsKIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoqCisgKiBBIHNlcnZlci1zaWRlIGFkYXB0ZXIsIHdyYXBwaW5nIGFuIElBdWRpb0ZsaW5nZXIgaW5zdGFuY2UgYW5kIHByZXNlbnRpbmcgaXQgYXMgYW4KKyAqIElBdWRpb0ZsaW5nZXJTZXJ2aWNlLiBJbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGxlZ2FjeSBzZXJ2ZXIgY29kZSB0aGF0IHdhcyB3cml0dGVuIGFnYWluc3QKKyAqIElBdWRpb0ZsaW5nZXIsIGJlZm9yZSBJQXVkaW9GbGluZ2VyU2VydmljZSB3YXMgaW50cm9kdWNlZCBhcyBhbiBBSURMIHNlcnZpY2UuCisgKiBOZXcgc2VydmVycyBzaG91bGQgbm90IHVzZSB0aGlzIGFkYXB0ZXIsIGJ1dCByYXRoZXIgaW1wbGVtZW50IElBdWRpb0ZsaW5nZXJTZXJ2aWNlIGRpcmVjdGx5LCB2aWEKKyAqIEJuQXVkaW9GbGluZ2VyU2VydmljZS4KKyAqLworY2xhc3MgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlciA6IHB1YmxpYyBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICB1c2luZyBTdGF0dXMgPSBiaW5kZXI6OlN0YXR1czsKKworICAgIC8qKgorICAgICAqIExlZ2FjeSBzZXJ2ZXIgc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBpbiBvcmRlciB0byBiZSB3cmFwcGVkLgorICAgICAqLworICAgIGNsYXNzIERlbGVnYXRlIDogcHVibGljIElBdWRpb0ZsaW5nZXIgeworICAgIHByb3RlY3RlZDoKKyAgICAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI7CisKKyAgICAgICAgZW51bSBjbGFzcyBUcmFuc2FjdGlvbkNvZGUgeworICAgICAgICAgICAgQ1JFQVRFX1RSQUNLID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlVHJhY2ssCisgICAgICAgICAgICBDUkVBVEVfUkVDT1JEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlUmVjb3JkLAorICAgICAgICAgICAgU0FNUExFX1JBVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zYW1wbGVSYXRlLAorICAgICAgICAgICAgRk9STUFUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZm9ybWF0LAorICAgICAgICAgICAgRlJBTUVfQ09VTlQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9mcmFtZUNvdW50LAorICAgICAgICAgICAgTEFURU5DWSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2xhdGVuY3ksCisgICAgICAgICAgICBTRVRfTUFTVEVSX1ZPTFVNRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1hc3RlclZvbHVtZSwKKyAgICAgICAgICAgIFNFVF9NQVNURVJfTVVURSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1hc3Rlck11dGUsCisgICAgICAgICAgICBNQVNURVJfVk9MVU1FID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbWFzdGVyVm9sdW1lLAorICAgICAgICAgICAgTUFTVEVSX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9tYXN0ZXJNdXRlLAorICAgICAgICAgICAgU0VUX1NUUkVBTV9WT0xVTUUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRTdHJlYW1Wb2x1bWUsCisgICAgICAgICAgICBTRVRfU1RSRUFNX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRTdHJlYW1NdXRlLAorICAgICAgICAgICAgU1RSRUFNX1ZPTFVNRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3N0cmVhbVZvbHVtZSwKKyAgICAgICAgICAgIFNUUkVBTV9NVVRFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc3RyZWFtTXV0ZSwKKyAgICAgICAgICAgIFNFVF9NT0RFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0TW9kZSwKKyAgICAgICAgICAgIFNFVF9NSUNfTVVURSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldE1pY011dGUsCisgICAgICAgICAgICBHRVRfTUlDX01VVEUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRNaWNNdXRlLAorICAgICAgICAgICAgU0VUX1JFQ09SRF9TSUxFTkNFRCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldFJlY29yZFNpbGVuY2VkLAorICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRQYXJhbWV0ZXJzLAorICAgICAgICAgICAgR0VUX1BBUkFNRVRFUlMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRQYXJhbWV0ZXJzLAorICAgICAgICAgICAgUkVHSVNURVJfQ0xJRU5UID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fcmVnaXN0ZXJDbGllbnQsCisgICAgICAgICAgICBHRVRfSU5QVVRCVUZGRVJTSVpFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0SW5wdXRCdWZmZXJTaXplLAorICAgICAgICAgICAgT1BFTl9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9vcGVuT3V0cHV0LAorICAgICAgICAgICAgT1BFTl9EVVBMSUNBVEVfT1VUUFVUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fb3BlbkR1cGxpY2F0ZU91dHB1dCwKKyAgICAgICAgICAgIENMT1NFX09VVFBVVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2Nsb3NlT3V0cHV0LAorICAgICAgICAgICAgU1VTUEVORF9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zdXNwZW5kT3V0cHV0LAorICAgICAgICAgICAgUkVTVE9SRV9PVVRQVVQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9yZXN0b3JlT3V0cHV0LAorICAgICAgICAgICAgT1BFTl9JTlBVVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX29wZW5JbnB1dCwKKyAgICAgICAgICAgIENMT1NFX0lOUFVUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY2xvc2VJbnB1dCwKKyAgICAgICAgICAgIElOVkFMSURBVEVfU1RSRUFNID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05faW52YWxpZGF0ZVN0cmVhbSwKKyAgICAgICAgICAgIFNFVF9WT0lDRV9WT0xVTUUgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRWb2ljZVZvbHVtZSwKKyAgICAgICAgICAgIEdFVF9SRU5ERVJfUE9TSVRJT04gPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRSZW5kZXJQb3NpdGlvbiwKKyAgICAgICAgICAgIEdFVF9JTlBVVF9GUkFNRVNfTE9TVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldElucHV0RnJhbWVzTG9zdCwKKyAgICAgICAgICAgIE5FV19BVURJT19VTklRVUVfSUQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9uZXdBdWRpb1VuaXF1ZUlkLAorICAgICAgICAgICAgQUNRVUlSRV9BVURJT19TRVNTSU9OX0lEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fYWNxdWlyZUF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19TRVNTSU9OX0lEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fcmVsZWFzZUF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgUVVFUllfTlVNX0VGRkVDVFMgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9xdWVyeU51bWJlckVmZmVjdHMsCisgICAgICAgICAgICBRVUVSWV9FRkZFQ1QgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9xdWVyeUVmZmVjdCwKKyAgICAgICAgICAgIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldEVmZmVjdERlc2NyaXB0b3IsCisgICAgICAgICAgICBDUkVBVEVfRUZGRUNUID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fY3JlYXRlRWZmZWN0LAorICAgICAgICAgICAgTU9WRV9FRkZFQ1RTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbW92ZUVmZmVjdHMsCisgICAgICAgICAgICBMT0FEX0hXX01PRFVMRSA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2xvYWRId01vZHVsZSwKKyAgICAgICAgICAgIEdFVF9QUklNQVJZX09VVFBVVF9TQU1QTElOR19SQVRFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIEdFVF9QUklNQVJZX09VVFBVVF9GUkFNRV9DT1VOVCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX2dldFByaW1hcnlPdXRwdXRGcmFtZUNvdW50LAorICAgICAgICAgICAgU0VUX0xPV19SQU1fREVWSUNFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0TG93UmFtRGV2aWNlLAorICAgICAgICAgICAgR0VUX0FVRElPX1BPUlQgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9nZXRBdWRpb1BvcnQsCisgICAgICAgICAgICBDUkVBVEVfQVVESU9fUEFUQ0ggPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9jcmVhdGVBdWRpb1BhdGNoLAorICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3JlbGVhc2VBdWRpb1BhdGNoLAorICAgICAgICAgICAgTElTVF9BVURJT19QQVRDSEVTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fbGlzdEF1ZGlvUGF0Y2hlcywKKyAgICAgICAgICAgIFNFVF9BVURJT19QT1JUX0NPTkZJRyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3NldEF1ZGlvUG9ydENvbmZpZywKKyAgICAgICAgICAgIEdFVF9BVURJT19IV19TWU5DX0ZPUl9TRVNTSU9OID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uLAorICAgICAgICAgICAgU1lTVEVNX1JFQURZID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc3lzdGVtUmVhZHksCisgICAgICAgICAgICBGUkFNRV9DT1VOVF9IQUwgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9mcmFtZUNvdW50SEFMLAorICAgICAgICAgICAgR0VUX01JQ1JPUEhPTkVTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0TWljcm9waG9uZXMsCisgICAgICAgICAgICBTRVRfTUFTVEVSX0JBTEFOQ0UgPSBtZWRpYTo6Qm5BdWRpb0ZsaW5nZXJTZXJ2aWNlOjpUUkFOU0FDVElPTl9zZXRNYXN0ZXJCYWxhbmNlLAorICAgICAgICAgICAgR0VUX01BU1RFUl9CQUxBTkNFID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fZ2V0TWFzdGVyQmFsYW5jZSwKKyAgICAgICAgICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVEID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0RWZmZWN0U3VzcGVuZGVkLAorICAgICAgICAgICAgU0VUX0FVRElPX0hBTF9QSURTID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0QXVkaW9IYWxQaWRzLAorICAgICAgICAgICAgU0VUX1ZJQlJBVE9SX0lORk9TID0gbWVkaWE6OkJuQXVkaW9GbGluZ2VyU2VydmljZTo6VFJBTlNBQ1RJT05fc2V0VmlicmF0b3JJbmZvcywKKyAgICAgICAgICAgIFVQREFURV9TRUNPTkRBUllfT1VUUFVUUyA9IG1lZGlhOjpCbkF1ZGlvRmxpbmdlclNlcnZpY2U6OlRSQU5TQUNUSU9OX3VwZGF0ZVNlY29uZGFyeU91dHB1dHMsCisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuZCBvcHRpb25hbCBob29rLCBjYWxsZWQgb24gZXZlcnkgdHJhbnNhY3Rpb24sIGFsbG93aW5nIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0byBiZQorICAgICAgICAgKiBwZXJmb3JtZWQgYmVmb3JlL2FmdGVyIHRoZSB1bnBhcmNlbGluZyAgb2Z0aGUgZGF0YSBhbmQgZGlzcGF0Y2hpbmcgdG8gdGhlIHJlc3BlY3RpdmUKKyAgICAgICAgICogbWV0aG9kLiBVc2VmdWwgZm9yIGJ1bGsgb3BlcmF0aW9ucywgc3VjaCBhcyBsb2dnaW5nIG9yIHBlcm1pc3Npb24gY2hlY2tzLgorICAgICAgICAgKiBUaGUgaW1wbGVtZW50ZXIgaXMgcmVzcG9uc2libGUgdG8gaW52b2tlIHRoZSBwcm92aWRlZCBkZWxlZ2F0ZSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlCisgICAgICAgICAqIGFjdHVhbCBvblRyYW5zYWN0KCksIHVubGVzcyBhbiBlcnJvciBvY2N1cnMuCisgICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMganVzdCBhIHBhc3MtdGhyb3VnaCB0byB0aGUgZGVsZWdhdGUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3RXcmFwcGVyKFRyYW5zYWN0aW9uQ29kZSBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+JiBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgKHZvaWQpIGNvZGU7CisgICAgICAgICAgICAodm9pZCkgZGF0YTsKKyAgICAgICAgICAgICh2b2lkKSBmbGFnczsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIG9wdGlvbmFsIGhvb2sgZm9yIGltcGxlbWVudGluZyBkaWFnbm9zdGljcyBkdW1waW5nLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgICAgICAgICAgKHZvaWQpIGZkOworICAgICAgICAgICAgKHZvaWQpIGFyZ3M7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9OworCisgICAgZXhwbGljaXQgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlPiYgZGVsZWdhdGUpOworCisgICAgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgY3JlYXRlVHJhY2soY29uc3QgbWVkaWE6OkNyZWF0ZVRyYWNrUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVRyYWNrUmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2FtcGxlUmF0ZShpbnQzMl90IGlvSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBmb3JtYXQoaW50MzJfdCBvdXRwdXQsIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZnJhbWVDb3VudChpbnQzMl90IGlvSGFuZGxlLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBsYXRlbmN5KGludDMyX3Qgb3V0cHV0LCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdmFsdWUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBtYXN0ZXJWb2x1bWUoZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG1hc3Rlck11dGUoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0U3RyZWFtVm9sdW1lKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBmbG9hdCB2YWx1ZSwgaW50MzJfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRTdHJlYW1NdXRlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBib29sIG11dGVkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMKKyAgICBzdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0sIGludDMyX3Qgb3V0cHV0LCBmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc3RyZWFtTXV0ZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0TW9kZShtZWRpYTo6QXVkaW9Nb2RlIG1vZGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRNaWNNdXRlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFJlY29yZFNpbGVuY2VkKGludDMyX3QgcG9ydElkLCBib29sIHNpbGVuY2VkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0UGFyYW1ldGVycyhpbnQzMl90IGlvSGFuZGxlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5VmFsdWVQYWlycykgb3ZlcnJpZGU7CisgICAgU3RhdHVzCisgICAgZ2V0UGFyYW1ldGVycyhpbnQzMl90IGlvSGFuZGxlLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5cywgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0SW5wdXRCdWZmZXJTaXplKGludDMyX3Qgc2FtcGxlUmF0ZSwgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2ssIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5PdXRwdXQoY29uc3QgbWVkaWE6Ok9wZW5PdXRwdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5EdXBsaWNhdGVPdXRwdXQoaW50MzJfdCBvdXRwdXQxLCBpbnQzMl90IG91dHB1dDIsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNsb3NlT3V0cHV0KGludDMyX3Qgb3V0cHV0KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc3VzcGVuZE91dHB1dChpbnQzMl90IG91dHB1dCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHJlc3RvcmVPdXRwdXQoaW50MzJfdCBvdXRwdXQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBvcGVuSW5wdXQoY29uc3QgbWVkaWE6Ok9wZW5JbnB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNsb3NlSW5wdXQoaW50MzJfdCBpbnB1dCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGludmFsaWRhdGVTdHJlYW0obWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW0pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRSZW5kZXJQb3NpdGlvbihpbnQzMl90IG91dHB1dCwgbWVkaWE6OlJlbmRlclBvc2l0aW9uKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRJbnB1dEZyYW1lc0xvc3QoaW50MzJfdCBpb0hhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgbmV3QXVkaW9VbmlxdWVJZChtZWRpYTo6QXVkaW9VbmlxdWVJZFVzZSB1c2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGFjcXVpcmVBdWRpb1Nlc3Npb25JZChpbnQzMl90IGF1ZGlvU2Vzc2lvbiwgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcmVsZWFzZUF1ZGlvU2Vzc2lvbklkKGludDMyX3QgYXVkaW9TZXNzaW9uLCBpbnQzMl90IHBpZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHF1ZXJ5TnVtYmVyRWZmZWN0cyhpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBxdWVyeUVmZmVjdChpbnQzMl90IGluZGV4LCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiBlZmZlY3RVVUlELCBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBjcmVhdGVFZmZlY3QoY29uc3QgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG1vdmVFZmZlY3RzKGludDMyX3Qgc2Vzc2lvbiwgaW50MzJfdCBzcmNPdXRwdXQsIGludDMyX3QgZHN0T3V0cHV0KSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0RWZmZWN0U3VzcGVuZGVkKGludDMyX3QgZWZmZWN0SWQsIGludDMyX3Qgc2Vzc2lvbklkLCBib29sIHN1c3BlbmRlZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGxvYWRId01vZHVsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0UHJpbWFyeU91dHB1dFNhbXBsaW5nUmF0ZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRQcmltYXJ5T3V0cHV0RnJhbWVDb3VudChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRMb3dSYW1EZXZpY2UoYm9vbCBpc0xvd1JhbURldmljZSwgaW50NjRfdCB0b3RhbE1lbW9yeSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEF1ZGlvUG9ydChjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBwb3J0LCBtZWRpYTo6QXVkaW9Qb3J0KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IG1lZGlhOjpBdWRpb1BhdGNoJiBwYXRjaCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgcmVsZWFzZUF1ZGlvUGF0Y2goaW50MzJfdCBoYW5kbGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBsaXN0QXVkaW9QYXRjaGVzKGludDMyX3QgbWF4Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRBdWRpb1BvcnRDb25maWcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgY29uZmlnKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0QXVkaW9Id1N5bmNGb3JTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzeXN0ZW1SZWFkeSgpIG92ZXJyaWRlOworICAgIFN0YXR1cyBmcmFtZUNvdW50SEFMKGludDMyX3QgaW9IYW5kbGUsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHBpZHMpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRWaWJyYXRvckluZm9zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpIG92ZXJyaWRlOworICAgIFN0YXR1cyB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OlRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mbz4mIHRyYWNrU2Vjb25kYXJ5T3V0cHV0SW5mb3MpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXI6OkRlbGVnYXRlPiBtRGVsZWdhdGU7Cit9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDgwYmM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQVVESU9GTElOR0VSQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9JQVVESU9GTElOR0VSQ0xJRU5UX0gKLQotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSUF1ZGlvRmxpbmdlckNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXJDbGllbnQpOwotCi0gICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gaW5wdXQvb3V0cHV0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYykgPSAwOwotCi19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5BdWRpb0ZsaW5nZXJDbGllbnQgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUF1ZGlvRmxpbmdlckNsaWVudD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSUFVRElPRkxJTkdFUkNMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjFjMDdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotLy8gTXVzdCBiZSBwcmUtZGVjbGFyZWQsIG9yIGVsc2UgdGhlcmUgaXNuJ3QgYSBnb29kIHdheSB0byBnZW5lcmF0ZSBhIGhlYWRlcgotLy8gbGlicmFyeS4KLWNsYXNzIElDYXB0dXJlU3RhdGVMaXN0ZW5lcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZSk7Ci0KLSAgICAvLwotICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2UgaW50ZXJmYWNlIChzZWUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgZm9yIG1ldGhvZCBkZXNjcmlwdGlvbnMpCi0gICAgLy8KLSAgICB2aXJ0dWFsIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgPSAwOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlLCB1aWRfdCB1aWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgPSAwOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcykgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCAgICAgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgYm9vbCAgICAgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBib29sICAgICBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcyhjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiYgc3lzdGVtVXNhZ2VzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgPSAwOwotICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzdHJlYW0gdHlwZSwgc2FtcGxlIHJhdGUsCi0gICAgLy8gYml0IHJhdGUsIGR1cmF0aW9uLCB2aWRlbyBhbmQgc3RyZWFtaW5nIG9yIG9mZmxvYWQgcHJvcGVydHkgaXMgZW5hYmxlZAotICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pID0gMDsKLQotICAgIC8vIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgZ2l2ZW4gZm9ybWF0LCBzYW1wbGUgcmF0ZSwgY2hhbm5lbCBtYXNrIGFuZCBmbGFncy4KLSAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKLQotICAgIC8qIExpc3QgYXZhaWxhYmxlIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKSA9IDA7Ci0KLSAgICAvKiBHZXQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpID0gMDsKLQotICAgIC8qIENyZWF0ZSBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7Ci0KLSAgICAvKiBSZWxlYXNlIGFuIGF1ZGlvIHBhdGNoICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKLQotICAgIC8qIExpc3QgZXhpc3RpbmcgYXVkaW8gcGF0Y2hlcyAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOwotICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQotICAgICAgICAgICAgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwotICAgIHZpcnR1YWwgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDdXJyZW50SW1lVWlkKHVpZF90IHVpZCkgPSAwOwotCi0gICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgICAgIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7Ci0KLSAgICAvLyBUaGUgcmV0dXJuIGNvZGUgaGVyZSBpcyBvbmx5IGludGVuZGVkIHRvIHJlcHJlc2VudCB0cmFuc3BvcnQgZXJyb3JzLiBUaGUKLSAgICAvLyBhY3R1YWwgc2VydmVyIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE5PX0VSUk9SLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGVMaXN0ZW5lcigKLSAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklDYXB0dXJlU3RhdGVMaXN0ZW5lcj4mIGxpc3RlbmVyLAotICAgICAgICBib29sKiByZXN1bHQpID0gMDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkF1ZGlvUG9saWN5U2VydmljZSA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotcHJpdmF0ZToKLSAgICB2b2lkIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0cik7Ci0gICAgc3RhdHVzX3Qgc2FuaXRpemVFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2MpOwotICAgIHN0YXR1c190IHNhbml0aXplQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogY29uZmlnKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2IzMWVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gewotICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQ7Ci0gICAgdWlkX3QgdWlkOwotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOwotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRfaWQ7Ci0gICAgYm9vbCBzaWxlbmNlZDsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyByZWNvcmRfY2xpZW50X2luZm9fdDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7Ci0KLSAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiB2b2x1bWUgZ3JvdXAKLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7Ci0gICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7Ci0gICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpID0gMDsKLSAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgbWl4aW5nIHN0YXRlIG9mIGEgc3BlY2lmaWMgbWl4IGluIGEgZHluYW1pYyBhdWRpbyBwb2xpY3kKLSAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwotICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHJlY29yZGluZyBjb25maWd1cmF0aW9uCi0gICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpID0gMDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNzg2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQVVESU9UUkFDS19ICi0jZGVmaW5lIEFORFJPSURfSUFVRElPVFJBQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSUF1ZGlvVHJhY2sgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoQXVkaW9UcmFjayk7Ci0KLSAgICAvKiBHZXQgdGhpcyB0cmFjaydzIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KLSAgICAvKiBBZnRlciBpdCdzIGNyZWF0ZWQgdGhlIHRyYWNrIGlzIG5vdCBhY3RpdmUuIENhbGwgc3RhcnQoKSB0bwotICAgICAqIG1ha2UgaXQgYWN0aXZlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKSA9IDA7Ci0KLSAgICAvKiBTdG9wIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAotICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7Ci0KLSAgICAvKiBGbHVzaCBhIHN0b3BwZWQgb3IgcGF1c2VkIHRyYWNrLiBBbGwgcGVuZGluZy9yZWxlYXNlZCBidWZmZXJzIGFyZSBkaXNjYXJkZWQuCi0gICAgICogVGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IGlmIHRoZSB0cmFjayBpcyBub3Qgc3RvcHBlZCBvciBwYXVzZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBmbHVzaCgpID0gMDsKLQotICAgIC8qIFBhdXNlIGEgdHJhY2suIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkIGFuZAotICAgICAqIG9idGFpbkJ1ZmZlciB3aWxsIHJldHVybiBhbiBlcnJvci4gQnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICogd2lsbCBjb250aW51ZSB0byBiZSBwcm9jZXNzZWQsIHVubGVzcy91bnRpbCBmbHVzaCgpIGlzIGNhbGxlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBhdXNlKCkgPSAwOwotCi0gICAgLyogQXR0YWNoIHRyYWNrIGF1eGlsaWFyeSBvdXRwdXQgdG8gc3BlY2lmaWVkIGVmZmVjdC4gVXNlIGVmZmVjdElkID0gMAotICAgICAqIHRvIGRldGFjaCB0cmFjayBmcm9tIGVmZmVjdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpID0gMDsKLQotICAgIC8qIFNlbmQgcGFyYW1ldGVycyB0byB0aGUgYXVkaW8gaGFyZHdhcmUgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgPSAwOwotCi0gICAgLyogU2VsZWN0cyB0aGUgcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7Ci0KLSAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwotCi0gICAgLyogU2lnbmFsIHRoZSBwbGF5YmFjayB0aHJlYWQgZm9yIGEgY2hhbmdlIGluIGNvbnRyb2wgYmxvY2sgKi8KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpID0gMDsKLQotICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgKi8KLSAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKLSAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7Ci0KLSAgICAvKiBnZXRzIHRoZSB2b2x1bWUgc2hhcGVyIHN0YXRlICovCi0gICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuQXVkaW9UcmFjayA6IHB1YmxpYyBCbkludGVyZmFjZTxJQXVkaW9UcmFjaz4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSUFVRElPVFJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwNDg2OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUVGRkVDVF9ICi0jZGVmaW5lIEFORFJPSURfSUVGRkVDVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJRWZmZWN0OiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNhYmxlKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuRWZmZWN0OiBwdWJsaWMgQm5JbnRlcmZhY2U8SUVmZmVjdD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lFRkZFQ1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0Q2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3RDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3OGM5OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lFZmZlY3RDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfSUVGRkVDVENMSUVOVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJRWZmZWN0Q2xpZW50OiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRWZmZWN0Q2xpZW50KTsKLQotICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkVmZmVjdENsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElFZmZlY3RDbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JRUZGRUNUQ0xJRU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUGxheWVyQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKaW5kZXggZTdhOGFiYy4uMjNiNmJmZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9QbGF5ZXJCYXNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KICNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuUGxheWVyLmgiCiAKQEAgLTQwLDE5ICs0MSwyMSBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgc2V0UGFuKGZsb2F0IHBhbikgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBzZXRTdGFydERlbGF5TXMoaW50MzJfdCBkZWxheU1zKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiYgb3BlcmF0aW9uKSBvdmVycmlkZTsKIAotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRXaXRoU3RhdHVzKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGFydFdpdGhTdGF0dXMoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBwYXVzZVdpdGhTdGF0dXMoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BXaXRoU3RhdHVzKCk7CiAKICAgICAgICAgICAgIC8vRklYTUUgdGVtcG9yYXJ5IG1ldGhvZCB3aGlsZSBzb21lIHBsYXllciBzdGF0ZSBpcyBvdXRzaWRlIG9mIHRoaXMgY2xhc3MKLSAgICAgICAgICAgIHZvaWQgcmVwb3J0RXZlbnQocGxheWVyX3N0YXRlX3QgZXZlbnQpOworICAgICAgICAgICAgdm9pZCByZXBvcnRFdmVudChwbGF5ZXJfc3RhdGVfdCBldmVudCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisKKyAgICAgICAgICAgIHZvaWQgYmFzZVVwZGF0ZURldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwogCiBwcm90ZWN0ZWQ6CiAKLSAgICAgICAgICAgIHZvaWQgaW5pdChwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOworICAgICAgICAgICAgdm9pZCBpbml0KHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAgICAgICAgICAgICB2b2lkIGJhc2VEZXN0cm95KCk7CiAKICAgICAvL0lQbGF5ZXIgbWV0aG9kcyBoYW5kbGVycyBmb3IgZGVyaXZlZCBjbGFzc2VzCkBAIC02OCwyMCArNzEsMjQgQEAKICAgICBmbG9hdCBtUGFuTXVsdGlwbGllckwsIG1QYW5NdWx0aXBsaWVyUjsKICAgICBmbG9hdCBtVm9sdW1lTXVsdGlwbGllckwsIG1Wb2x1bWVNdWx0aXBsaWVyUjsKIAorICAgIC8vIHBsYXllciBpbnRlcmZhY2UgSUQsIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBsYXllciBpbiB0aGUgc3lzdGVtCisgICAgLy8gZWZmZWN0aXZlbHkgY29uc3QgYWZ0ZXIgUGxheWVyQmFzZTo6aW5pdCgpLgorICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG1QSUlkOworCiBwcml2YXRlOgogICAgICAgICAgICAgLy8gcmVwb3J0IGV2ZW50cyB0byBBdWRpb1NlcnZpY2UKLSAgICAgICAgICAgIHZvaWQgc2VydmljZVBsYXllckV2ZW50KHBsYXllcl9zdGF0ZV90IGV2ZW50KTsKKyAgICAgICAgICAgIHZvaWQgc2VydmljZVBsYXllckV2ZW50KHBsYXllcl9zdGF0ZV90IGV2ZW50LCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKICAgICAgICAgICAgIHZvaWQgc2VydmljZVJlbGVhc2VQbGF5ZXIoKTsKIAogICAgIC8vIG5hdGl2ZSBpbnRlcmZhY2UgdG8gQXVkaW9TZXJ2aWNlCiAgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUF1ZGlvTWFuYWdlcj4gbUF1ZGlvTWFuYWdlcjsKIAotICAgIC8vIHBsYXllciBpbnRlcmZhY2UgSUQsIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHBsYXllciBpbiB0aGUgc3lzdGVtCi0gICAgYXVkaW9fdW5pcXVlX2lkX3QgbVBJSWQ7Ci0KICAgICAvLyBNdXRleCBmb3Igc3RhdGUgcmVwb3J0aW5nCiAgICAgTXV0ZXggbVBsYXllclN0YXRlTG9jazsKICAgICBwbGF5ZXJfc3RhdGVfdCBtTGFzdFJlcG9ydGVkRXZlbnQ7CisKKyAgICBNdXRleCBtRGV2aWNlSWRMb2NrOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUxhc3RSZXBvcnRlZERldmljZUlkOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Qb2xpY3lBaWRsQ29udmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3M2YyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1BvbGljeUFpZGxDb252ZXJzaW9uLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhDYWxsYmFja0ZsYWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvTWl4TGF0ZW5jeUNsYXNzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01peFJvdXRlRmxhZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9NaXhUeXBlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb01vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvT2ZmbG9hZE1vZGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VVc2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9EZXZpY2VSb2xlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvblV0aWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9saWN5RGV2aWNlU3RhdGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDb252ZXJzaW9uUmVzdWx0PHZvbHVtZV9ncm91cF90PgorYWlkbDJsZWdhY3lfaW50MzJfdF92b2x1bWVfZ3JvdXBfdChpbnQzMl90IGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxpbnQzMl90PgorbGVnYWN5MmFpZGxfdm9sdW1lX2dyb3VwX3RfaW50MzJfdCh2b2x1bWVfZ3JvdXBfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4KK2FpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF9wcm9kdWN0X3N0cmF0ZWd5X3RfaW50MzJfdChwcm9kdWN0X3N0cmF0ZWd5X3QgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDx1aW50MzJfdD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4VHlwZV91aW50MzJfdChtZWRpYTo6QXVkaW9NaXhUeXBlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9NaXhUeXBlPgorbGVnYWN5MmFpZGxfdWludDMyX3RfQXVkaW9NaXhUeXBlKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdChtZWRpYTo6QXVkaW9NaXhDYWxsYmFja0ZsYWcgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peENhbGxiYWNrRmxhZz4KK2xlZ2FjeTJhaWRsX3VpbnQzMl90X0F1ZGlvTWl4Q2FsbGJhY2tGbGFnKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peENhbGxiYWNrRmxhZ191aW50MzJfdF9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peENhbGxiYWNrRmxhZ19tYXNrKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peFJvdXRlRmxhZ191aW50MzJfdChtZWRpYTo6QXVkaW9NaXhSb3V0ZUZsYWcgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peFJvdXRlRmxhZz4KK2xlZ2FjeTJhaWRsX3VpbnQzMl90X0F1ZGlvTWl4Um91dGVGbGFnKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8dWludDMyX3Q+CithaWRsMmxlZ2FjeV9BdWRpb01peFJvdXRlRmxhZ191aW50MzJfdF9tYXNrKGludDMyX3QgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PGludDMyX3Q+CitsZWdhY3kyYWlkbF91aW50MzJfdF9BdWRpb01peFJvdXRlRmxhZ19tYXNrKHVpbnQzMl90IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24oY29uc3QgbWVkaWE6OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4KK2xlZ2FjeTJhaWRsX0F1ZGlvTWl4TWF0Y2hDcml0ZXJpb24oY29uc3QgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiYgbGVnYWN5KTsKKworQ29udmVyc2lvblJlc3VsdDxBdWRpb01peD4KK2FpZGwybGVnYWN5X0F1ZGlvTWl4KGNvbnN0IG1lZGlhOjpBdWRpb01peCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb01peD4KK2xlZ2FjeTJhaWRsX0F1ZGlvTWl4KGNvbnN0IEF1ZGlvTWl4JiBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9saWN5RGV2aWNlU3RhdGVfYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90KG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdD4KK2FpZGwybGVnYWN5X0F1ZGlvUG9saWN5Rm9yY2VVc2VfYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90KG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qb2xpY3lGb3JjZVVzZT4KK2xlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9mb3JjZV91c2VfdF9BdWRpb1BvbGljeUZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+CithaWRsMmxlZ2FjeV9BdWRpb1BvbGljeUZvcmNlZENvbmZpZ19hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190KG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZyBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnPgorbGVnYWN5MmFpZGxfYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdF9BdWRpb1BvbGljeUZvcmNlZENvbmZpZyhhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGxlZ2FjeSk7CisKK0NvbnZlcnNpb25SZXN1bHQ8ZGV2aWNlX3JvbGVfdD4KK2FpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChtZWRpYTo6RGV2aWNlUm9sZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkRldmljZVJvbGU+CitsZWdhY3kyYWlkbF9kZXZpY2Vfcm9sZV90X0RldmljZVJvbGUoZGV2aWNlX3JvbGVfdCBsZWdhY3kpOworCitDb252ZXJzaW9uUmVzdWx0PGF1ZGlvX29mZmxvYWRfbW9kZV90PgorYWlkbDJsZWdhY3lfQXVkaW9PZmZsb2FkTW9kZV9hdWRpb19vZmZsb2FkX21vZGVfdChtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZSBhaWRsKTsKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGU+CitsZWdhY3kyYWlkbF9hdWRpb19vZmZsb2FkX21vZGVfdF9BdWRpb09mZmxvYWRNb2RlKGF1ZGlvX29mZmxvYWRfbW9kZV90IGxlZ2FjeSk7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmluZGV4IDViMDY4OWEuLmE1NzU2MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfVE9ORUdFTkVSQVRPUl9IXwogI2RlZmluZSBBTkRST0lEX1RPTkVHRU5FUkFUT1JfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KKwogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgpAQCAtMTUyLDcgKzE1NCw4IEBACiAgICAgICAgIE5VTV9TVVBfVE9ORVMgPSBMQVNUX1NVUF9UT05FLUZJUlNUX1NVUF9UT05FKzEKICAgICB9OwogCi0gICAgVG9uZUdlbmVyYXRvcihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGZsb2F0IHZvbHVtZSwgYm9vbCB0aHJlYWRDYW5DYWxsSmF2YSA9IGZhbHNlKTsKKyAgICBUb25lR2VuZXJhdG9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgZmxvYXQgdm9sdW1lLCBib29sIHRocmVhZENhbkNhbGxKYXZhID0gZmFsc2UsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcFBhY2thZ2VOYW1lID0ge30pOwogICAgIH5Ub25lR2VuZXJhdG9yKCk7CiAKICAgICBib29sIHN0YXJ0VG9uZSh0b25lX3R5cGUgdG9uZVR5cGUsIGludCBkdXJhdGlvbk1zID0gLTEpOwpAQCAtMTkzLDYgKzE5Niw3IEBACiAgICAgICAgIFRPTkVfSkFQQU5fRElBTCwgICAgICAgICAgICAvLyBEaWFsIHRvbmU6IDQwMEh6LCBjb250aW51b3VzCiAgICAgICAgIFRPTkVfSkFQQU5fQlVTWSwgICAgICAgICAgICAvLyBCdXN5IHRvbmU6IDQwMEh6LCA1MDBtcyBPTiwgNTAwbXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfSkFQQU5fUkFESU9fQUNLLCAgICAgICAvLyBSYWRpbyBwYXRoIGFja25vd2xlZ21lbnQ6IDQwMEh6LCAxcyBPTiwgMnMgT0ZGLi4uCisgICAgICAgIFRPTkVfSkFQQU5fUklOR1RPTkUsICAgICAgICAvLyBSaW5nIFRvbmU6IDQwMCBIeiByZXBlYXRlZCBpbiBhIDEgcyBvbiwgMiBzIG9mZiBwYXR0ZXJuLgogICAgICAgICAvLyBHQiBTdXBlcnZpc29yeSB0b25lcwogICAgICAgICBUT05FX0dCX0JVU1ksICAgICAgICAgICAgICAgLy8gQnVzeSB0b25lOiA0MDAgSHosIDM3NW1zIE9OLCAzNzVtcyBPRkYuLi4KICAgICAgICAgVE9ORV9HQl9DT05HRVNUSU9OLCAgICAgICAgIC8vIENvbmdlc3Rpb24gVG9uZTogNDAwIEh6LCA0MDBtcyBPTiwgMzUwbXMgT0ZGLCAyMjVtcyBPTiwgNTI1bXMgT0ZGLi4uCkBAIC0yMTgsNiArMjIyLDcgQEAKICAgICAgICAgVE9ORV9JTkRJQV9DT05HRVNUSU9OLCAgICAgIC8vIENvbmdlc3Rpb24gdG9uZTogNDAwIEh6LCAyNTBtcyBPTiwgMjUwbXMgT0ZGLi4uCiAgICAgICAgIFRPTkVfSU5ESUFfQ0FMTF9XQUlUSU5HLCAgICAvLyBDYWxsIHdhaXRpbmcgdG9uZTogNDAwIEh6LCB0b25lIHJlcGVhdGVkIGluIGEgMC4ycyBvbiwgMC4xcyBvZmYsIDAuMnMgb24sIDcuNXMgb2ZmIHBhdHRlcm4uCiAgICAgICAgIFRPTkVfSU5ESUFfUklOR1RPTkUsICAgICAgICAvLyBSaW5nIHRvbmU6IDQwMCBIeiB0b25lIG1vZHVsYXRlZCB3aXRoIDI1SHosIDAuNCBvbiAwLjIgb2ZmIDAuNCBvbiAyLi4wIG9mZgorICAgICAgICBUT05FX1RXX1JJTkdUT05FLCAgICAgICAgICAgLy8gUmluZyBUb25lOiA0NDAgSHogKyA0ODAgSHogcmVwZWF0ZWQgd2l0aCBwYXR0ZXJuIDFzIG9uLCAzcyBvZmYuCiAgICAgICAgIE5VTV9BTFRFUk5BVEVfVE9ORVMKICAgICB9OwogCkBAIC0yMzAsNiArMjM1LDcgQEAKICAgICAgICAgSE9OR0tPTkcsCiAgICAgICAgIElSRUxBTkQsCiAgICAgICAgIElORElBLAorICAgICAgICBUQUlXQU4sCiAgICAgICAgIENFUFQsCiAgICAgICAgIE5VTV9SRUdJT05TCiAgICAgfTsKQEAgLTM0MSw2ICszNDcsOCBAQAogICAgIH07CiAKICAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgV2F2ZUdlbmVyYXRvciAqPiBtV2F2ZUdlbnM7ICAvLyBsaXN0IG9mIGFjdGl2ZSB3YXZlIGdlbmVyYXRvcnMuCisKKyAgICBzdGQ6OnN0cmluZyBtT3BQYWNrYWdlTmFtZTsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1RyYWNrUGxheWVyQmFzZS5oCmluZGV4IDY2ZTliM2IuLjgwMTI0YjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVHJhY2tQbGF5ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9UcmFja1BsYXllckJhc2UuaApAQCAtMjgsMTMgKzI4LDE0IEBACiAgICAgZXhwbGljaXQgVHJhY2tQbGF5ZXJCYXNlKCk7CiAgICAgdmlydHVhbCB+VHJhY2tQbGF5ZXJCYXNlKCk7CiAKLSAgICAgICAgICAgIHZvaWQgaW5pdChBdWRpb1RyYWNrKiBwYXQsIHBsYXllcl90eXBlX3QgcGxheWVyVHlwZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSk7CisgICAgICAgICAgICB2b2lkIGluaXQoQXVkaW9UcmFjayogcGF0LCBwbGF5ZXJfdHlwZV90IHBsYXllclR5cGUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7CiAKICAgICAvL0lQbGF5ZXIgaW1wbGVtZW50YXRpb24KICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbiYgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlck9wZXJhdGlvbiYgb3BlcmF0aW9uKTsKIAogICAgIC8vRklYTUUgbW92ZSB0byBwcm90ZWN0ZWQgZmllbGQsIHNvIGZhciBtYWRlIHB1YmxpYyB0byBtaW5pbWl6ZSBjaGFuZ2VzIHRvIEF1ZGlvVHJhY2sgbG9naWMKICAgICBzcDxBdWRpb1RyYWNrPiBtQXVkaW9UcmFjazsKQEAgLTUzLDggKzU0LDIwIEBACiAgICAgICAgICAgICB2b2lkIGRvRGVzdHJveSgpOwogICAgICAgICAgICAgc3RhdHVzX3QgZG9TZXRWb2x1bWUoKTsKIAorICAgICAgICAgICAgY2xhc3MgU2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgeworICAgICAgICAgICAgcHVibGljOgorICAgICAgICAgICAgICAgIFNlbGZBdWRpb0RldmljZUNhbGxiYWNrKFBsYXllckJhc2UmIHNlbGYpOworICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgdmlydHVhbCB+U2VsZkF1ZGlvRGV2aWNlQ2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBQbGF5ZXJCYXNlJiBtU2VsZjsKKyAgICAgICAgICAgIH07CisKICAgICAvLyB2b2x1bWUgY29taW5nIGZyb20gdGhlIHBsYXllciB2b2x1bWUgQVBJCiAgICAgZmxvYXQgbVBsYXllclZvbHVtZUwsIG1QbGF5ZXJWb2x1bWVSOworCisgICBzcDxTZWxmQXVkaW9EZXZpY2VDYWxsYmFjaz4gbVNlbGZBdWRpb0RldmljZUNhbGxiYWNrOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggMzUwYTc4MC4uZGVmN2NhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF90ZXN0c19kZWZhdWx0cyIsCiAgICAgY2ZsYWdzOiBbCkBAIC03LDYgKzE2LDE4IEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJhdWRpb19haWRsX3N0YXR1c190ZXN0cyIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbImF1ZGlvX2FpZGxfc3RhdHVzX3Rlc3RzLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2siLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3RyYWNrLmNwcCIsCkBAIC0xNiw2ICszNyw3IEBACiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCkBAIC0zOCw2ICs2MCw3IEBACiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGRhdGE6IFsicmVjb3JkX3Rlc3RfaW5wdXRfKi50eHQiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL2F1ZGlvX2FpZGxfc3RhdHVzX3Rlc3RzLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL2F1ZGlvX2FpZGxfc3RhdHVzX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE3MDkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvYXVkaW9fYWlkbF9zdGF0dXNfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFpZGxfdXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKworLy8gVGVzdHMgZm9yIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKCkgYW5kIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKCkuCisKKy8vIFNUQVRVU19UX1NNQUxMX1ZBTFVFX0xJTUlUIGlzIGFuIGFyYml0cmFyeSBsaW1pdCB3aGVyZSB3ZSBleGhhdXN0aXZlbHkgY2hlY2sgc3RhdHVzX3QgZXJyb3JzLgorLy8gSXQgaXMga25vd24gdGhhdCB0aGlzIGxpbWl0IGRvZXNuJ3QgY292ZXIgVU5LTk9XTl9FUlJPUiB+IElOVDMyX01JTi4KK2NvbnN0ZXhwciBzdGF0dXNfdCBTVEFUVVNfVF9TTUFMTF9WQUxVRV9MSU1JVCA9IC0xMDAwOworCisvLyBTbWFsbCBzdGF0dXMgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQgb24gcm91bmQgdHJpcAorVEVTVChhdWRpb19haWRsX3N0YXR1c190ZXN0cywgc3RhdHVzUm91bmRUcmlwU21hbGxWYWx1ZXMpIHsKKyAgICBmb3IgKHN0YXR1c190IHN0YXR1cyA9IDA7IHN0YXR1cyA+IFNUQVRVU19UX1NNQUxMX1ZBTFVFX0xJTUlUOyAtLXN0YXR1cykgeworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpKSk7CisgICAgfQorfQorCisvLyBTcGVjaWFsIHN0YXR1cyB2YWx1ZXMgYXJlIHByZXNlcnZlZCBvbiByb3VuZCB0cmlwLgorVEVTVChhdWRpb19haWRsX3N0YXR1c190ZXN0cywgc3RhdHVzUm91bmRUcmlwU3BlY2lhbFZhbHVlcykgeworICAgIGZvciAoc3RhdHVzX3Qgc3RhdHVzIDogeworICAgICAgICAgICAgT0ssCisgICAgICAgICAgICBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgTk9fTUVNT1JZLAorICAgICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICBCQURfVkFMVUUsCisgICAgICAgICAgICBCQURfVFlQRSwKKyAgICAgICAgICAgIE5BTUVfTk9UX0ZPVU5ELAorICAgICAgICAgICAgUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICBOT19JTklULAorICAgICAgICAgICAgQUxSRUFEWV9FWElTVFMsCisgICAgICAgICAgICBERUFEX09CSkVDVCwKKyAgICAgICAgICAgIEZBSUxFRF9UUkFOU0FDVElPTiwKKyAgICAgICAgICAgIEJBRF9JTkRFWCwKKyAgICAgICAgICAgIE5PVF9FTk9VR0hfREFUQSwKKyAgICAgICAgICAgIFdPVUxEX0JMT0NLLAorICAgICAgICAgICAgVElNRURfT1VULAorICAgICAgICAgICAgVU5LTk9XTl9UUkFOU0FDVElPTiwKKyAgICAgICAgICAgIEZEU19OT1RfQUxMT1dFRH0pIHsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKSkpOworICAgIH0KK30KKworLy8gQmluZGVyIGV4Y2VwdGlvbnMgc2hvdyBhcyBhbiBlcnJvciAobm90IGZpeGVkIGF0IHRoaXMgdGltZSk7IHRoZXNlIGNvbWUgZnJvbUV4Y2VwdGlvbkNvZGUoKS4KK1RFU1QoYXVkaW9fYWlkbF9zdGF0dXNfdGVzdHMsIGJpbmRlclN0YXR1c0V4Y2VwdGlvbnMpIHsKKyAgICBmb3IgKGludCBleGNlcHRpb25Db2RlIDogeworICAgICAgICAgICAgLy9TdGF0dXM6OkVYX05PTkUsCisgICAgICAgICAgICBTdGF0dXM6OkVYX1NFQ1VSSVRZLAorICAgICAgICAgICAgU3RhdHVzOjpFWF9CQURfUEFSQ0VMQUJMRSwKKyAgICAgICAgICAgIFN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgIFN0YXR1czo6RVhfTlVMTF9QT0lOVEVSLAorICAgICAgICAgICAgU3RhdHVzOjpFWF9JTExFR0FMX1NUQVRFLAorICAgICAgICAgICAgU3RhdHVzOjpFWF9ORVRXT1JLX01BSU5fVEhSRUFELAorICAgICAgICAgICAgU3RhdHVzOjpFWF9VTlNVUFBPUlRFRF9PUEVSQVRJT04sCisgICAgICAgICAgICAvL1N0YXR1czo6RVhfU0VSVklDRV9TUEVDSUZJQywgLS0gdGVzdGVkIGZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigpCisgICAgICAgICAgICBTdGF0dXM6OkVYX1BBUkNFTEFCTEUsCisgICAgICAgICAgICAvLyBUaGlzIGlzIHNwZWNpYWwgYW5kIEphdmEgc3BlY2lmaWM7IHNlZSBQYXJjZWwuamF2YS4KKyAgICAgICAgICAgIFN0YXR1czo6RVhfSEFTX1JFUExZX0hFQURFUiwKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgc3BlY2lhbCwgYW5kIGluZGljYXRlcyB0byBDKysgYmluZGVyIHByb3hpZXMgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uIGhhcyBmYWlsZWQgYXQgYSBsb3cgbGV2ZWwuCisgICAgICAgICAgICAvL1N0YXR1czo6RVhfVFJBTlNBQ1RJT05fRkFJTEVELCAtLSB0ZXN0ZWQgZnJvbVN0YXR1c1QoKS4KKyAgICAgICAgICAgIH0pIHsKKyAgICAgICAgQVNTRVJUX05FKE9LLCBzdGF0dXNURnJvbUJpbmRlclN0YXR1cyhTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKGV4Y2VwdGlvbkNvZGUpKSk7CisgICAgfQorfQorCisvLyBCaW5kZXIgdHJhbnNhY3Rpb24gZXJyb3JzIHNob3cgZXhhY3RseSBpbiBzdGF0dXNfdDsgdGhlc2UgY29tZSBmcm9tU3RhdHVzVCgpLgorVEVTVChhdWRpb19haWRsX3N0YXR1c190ZXN0cywgYmluZGVyU3RhdHVzVHJhbnNhY3Rpb25FcnJvcikgeworICAgIGZvciAoc3RhdHVzX3Qgc3RhdHVzIDogeworICAgICAgICAgICAgT0ssIC8vIE5vdGU6IGZyb21TdGF0dXNUIGRvZXMgY2hlY2sgaWYgdGhpcyBpcyAwLCBzbyB0aGlzIGlzIG5vIGVycm9yLgorICAgICAgICAgICAgVU5LTk9XTl9FUlJPUiwKKyAgICAgICAgICAgIE5PX01FTU9SWSwKKyAgICAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgQkFEX1ZBTFVFLAorICAgICAgICAgICAgQkFEX1RZUEUsCisgICAgICAgICAgICBOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgIFBFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgTk9fSU5JVCwKKyAgICAgICAgICAgIEFMUkVBRFlfRVhJU1RTLAorICAgICAgICAgICAgREVBRF9PQkpFQ1QsCisgICAgICAgICAgICBGQUlMRURfVFJBTlNBQ1RJT04sCisgICAgICAgICAgICBCQURfSU5ERVgsCisgICAgICAgICAgICBOT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICBXT1VMRF9CTE9DSywKKyAgICAgICAgICAgIFRJTUVEX09VVCwKKyAgICAgICAgICAgIFVOS05PV05fVFJBTlNBQ1RJT04sCisgICAgICAgICAgICBGRFNfTk9UX0FMTE9XRUR9KSB7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKSkpOworICAgIH0KK30KKworLy8gQmluZGVyIHNlcnZpY2Ugc3BlY2lmaWMgZXJyb3JzIHNob3cgaW4gc3RhdHVzX3Q7IHRoZXNlIGNvbWUgZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKCkuCitURVNUKGF1ZGlvX2FpZGxfc3RhdHVzX3Rlc3RzLCBiaW5kZXJTdGF0dXNTZXJ2aWNlU3BlY2lmaWNFcnJvcikgeworICAgIC8vIGZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigpIHN0aWxsIHN0b3JlcyBleGNlcHRpb24gY29kZSBpZiBzdGF0dXMgaXMgMC4KKyAgICBmb3IgKHN0YXR1c190IHN0YXR1cyA9IC0xOyBzdGF0dXMgPiBTVEFUVVNfVF9TTUFMTF9WQUxVRV9MSU1JVDsgLS1zdGF0dXMpIHsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgc3RhdHVzVEZyb21CaW5kZXJTdGF0dXMoU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdHVzKSkpOworICAgIH0KK30KKworLy8gQmluZGVyIHN0YXR1cyB3aXRoIG1lc3NhZ2UuCitURVNUKGF1ZGlvX2FpZGxfc3RhdHVzX3Rlc3RzLCBiaW5kZXJTdGF0dXNNZXNzYWdlKSB7CisgICAgY29uc3QgU3RyaW5nOCBtZXNzYWdlKCJhYmNkIik7CisgICAgZm9yIChzdGF0dXNfdCBzdGF0dXMgPSAtMTsgc3RhdHVzID4gU1RBVFVTX1RfU01BTExfVkFMVUVfTElNSVQ7IC0tc3RhdHVzKSB7CisgICAgICAgIGNvbnN0IFN0YXR1cyBiaW5kZXJTdGF0dXMgPSBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMsIG1lc3NhZ2UuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGJpbmRlclN0YXR1cykpOworICAgICAgICBBU1NFUlRfRVEobWVzc2FnZSwgYmluZGVyU3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvdGVzdF9jcmVhdGVfYXVkaW9yZWNvcmQuY3BwCmluZGV4IGNmNmE3MzQuLjFjYmNiNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL3Rlc3RfY3JlYXRlX2F1ZGlvcmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy90ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CkBAIC0zMiwxOSArMzMsMjUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCiBpbnQgdGVzdFJlY29yZChGSUxFICppbnB1dEZpbGUsIGludCBvdXRwdXRGaWxlRmQpCiB7CiAgICAgY2hhciBsaW5lW01BWF9JTlBVVF9GSUxFX0xJTkVfTEVOR1RIXTsKICAgICB1aW50MzJfdCB0ZXN0Q291bnQgPSAwOwogICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKICAgICBpbnQgcmV0ID0gMDsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gc3RkOjpzdHJpbmcoUEFDS0FHRV9OQU1FKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAKICAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmQ+IHJlY29yZCA9IG5ldyBBdWRpb1JlY29yZChBVURJT19TT1VSQ0VfREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHNhbXBsZVJhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9NT05PLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KFBBQ0tBR0VfTkFNRSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlKTsKICAgICAgICAgaWYgKHJlY29yZCA9PSAwIHx8IHJlY29yZC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHdyaXRlKG91dHB1dEZpbGVGZCwgIkVycm9yIGNyZWF0aW5nIEF1ZGlvUmVjb3JkXG4iLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKCJFcnJvciBjcmVhdGluZyBBdWRpb1JlY29yZFxuIikpOwpAQCAtOTAsNyArOTcsNyBAQAogICAgICAgICBtZW1zZXQoJmF0dHJpYnV0ZXMsIDAsIHNpemVvZihhdHRyaWJ1dGVzKSk7CiAgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gaW5wdXRTb3VyY2U7CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmQ+IHJlY29yZCA9IG5ldyBBdWRpb1JlY29yZChTdHJpbmcxNihQQUNLQUdFX05BTUUpKTsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmQ+IHJlY29yZCA9IG5ldyBBdWRpb1JlY29yZChhdHRyaWJ1dGlvblNvdXJjZSk7CiAKICAgICAgICAgcmVjb3JkLT5zZXQoQVVESU9fU09VUkNFX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggNTQ4YjA4MC4uM2JlZjU1YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTUsMTMgKzE0LDI3IEBACiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uX3V0aWwiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uX3V0aWwiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAogICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImF1ZGlvY2xpZW50LXR5cGVzLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMjksNiArNTIsOCBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLApAQCAtMzcsNiArNjIsMTEgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICBdLAorCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCmluZGV4IGI0NDA0M2EuLmM1ZDdkYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0RldmljZVR5cGVBZGRyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKQEAgLTE1LDEzICsxNSw1OSBAQAogICovCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8cmVnZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBTVVBQUkVTU0VEID0gIlNVUFBSRVNTRUQiOworc3RhdGljIGNvbnN0IHN0ZDo6cmVnZXggTUFDX0FERFJFU1NfUkVHRVgoIihbMC05YS1mQS1GXXsyfTopezV9WzAtOWEtZkEtRl17Mn0iKTsKKworYm9vbCBpc1NlbnN0aXZlQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgeworICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGFkZHJlc3MsIE1BQ19BRERSRVNTX1JFR0VYKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzb2NrYWRkcl9zdG9yYWdlIHNzNDsKKyAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQsIGFkZHJlc3MuY19zdHIoKSwgJnNzNCkgPiAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNvY2thZGRyX3N0b3JhZ2Ugc3M2OworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGFkZHJlc3MuY19zdHIoKSwgJnNzNikgPiAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworQXVkaW9EZXZpY2VUeXBlQWRkcjo6QXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIDoKKyAgICAgICAgbVR5cGUodHlwZSksIG1BZGRyZXNzKGFkZHJlc3MpIHsKKyAgICBtSXNBZGRyZXNzU2Vuc2l0aXZlID0gaXNTZW5zdGl2ZUFkZHJlc3MobUFkZHJlc3MpOworfQorCiBjb25zdCBjaGFyKiBBdWRpb0RldmljZVR5cGVBZGRyOjpnZXRBZGRyZXNzKCkgY29uc3QgewogICAgIHJldHVybiBtQWRkcmVzcy5jX3N0cigpOwogfQogCitjb25zdCBzdGQ6OnN0cmluZyYgQXVkaW9EZXZpY2VUeXBlQWRkcjo6YWRkcmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFkZHJlc3M7Cit9CisKK3ZvaWQgQXVkaW9EZXZpY2VUeXBlQWRkcjo6c2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcykgeworICAgIG1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBtSXNBZGRyZXNzU2Vuc2l0aXZlID0gaXNTZW5zdGl2ZUFkZHJlc3MobUFkZHJlc3MpOworfQorCiBib29sIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OmVxdWFscyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBvdGhlcikgY29uc3QgewogICAgIHJldHVybiBtVHlwZSA9PSBvdGhlci5tVHlwZSAmJiBtQWRkcmVzcyA9PSBvdGhlci5tQWRkcmVzczsKIH0KQEAgLTM2LDE0ICs4MiwzNCBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBBdWRpb0RldmljZVR5cGVBZGRyOjpvcGVyYXRvcj09KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJnJocykgY29uc3QgeworICAgIHJldHVybiBlcXVhbHMocmhzKTsKK30KKworYm9vbCBBdWRpb0RldmljZVR5cGVBZGRyOjpvcGVyYXRvciE9KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJnJocykgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PShyaHMpOworfQorCiB2b2lkIEF1ZGlvRGV2aWNlVHlwZUFkZHI6OnJlc2V0KCkgewogICAgIG1UeXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgbUFkZHJlc3MgPSAiIjsKKyAgICBzZXRBZGRyZXNzKCIiKTsKK30KKworc3RkOjpzdHJpbmcgQXVkaW9EZXZpY2VUeXBlQWRkcjo6dG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbykgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07CisgICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgbVR5cGU7CisgICAgLy8gSVAgYW5kIE1BQyBhZGRyZXNzIGFyZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwcmVzc2VkCisgICAgLy8gaXMgYGluY2x1ZGVTZW5zaXRpdmVJbmZvYCBpcyBmYWxzZS4KKyAgICBzc3RyZWFtIDw8ICIsQDoiCisgICAgICAgICAgICA8PCAoIWluY2x1ZGVTZW5zaXRpdmVJbmZvICYmIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPyBTVVBQUkVTU0VEIDogbUFkZHJlc3MpOworICAgIHJldHVybiBzc3RyZWFtLnN0cigpOwogfQogCiBzdGF0dXNfdCBBdWRpb0RldmljZVR5cGVBZGRyOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgewogICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbVR5cGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICB1aW50MzJfdCByYXdEZXZpY2VUeXBlOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZyYXdEZXZpY2VUeXBlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgbVR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHJhd0RldmljZVR5cGUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1BZGRyZXNzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNjQsNCArMTMwLDQ0IEBACiAgICAgcmV0dXJuIGRldmljZVR5cGVzOwogfQogCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBleGNsdWRlRGV2aWNlVHlwZUFkZHJzRnJvbSgKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlc1RvRXhjbHVkZSkgeworICAgIHN0ZDo6c2V0PEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXNUb0V4Y2x1ZGVTZXQoCisgICAgICAgICAgICBkZXZpY2VzVG9FeGNsdWRlLmJlZ2luKCksIGRldmljZXNUb0V4Y2x1ZGUuZW5kKCkpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgcmVtYWluZWREZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICBpZiAoZGV2aWNlc1RvRXhjbHVkZVNldC5jb3VudChkZXZpY2UpID09IDApIHsKKyAgICAgICAgICAgIHJlbWFpbmVkRGV2aWNlcy5wdXNoX2JhY2soZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVtYWluZWREZXZpY2VzOworfQorCitzdGQ6OnN0cmluZyBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVBZGRycy5iZWdpbigpOyBpdCAhPSBkZXZpY2VUeXBlQWRkcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0ICE9IGRldmljZVR5cGVBZGRycy5iZWdpbigpKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIiAiOworICAgICAgICB9CisgICAgICAgIHN0cmVhbSA8PCBpdC0+dG9TdHJpbmcoaW5jbHVkZVNlbnNpdGl2ZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RyZWFtLnN0cigpOworfQorCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlVHlwZUFkZHI+CithaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgYWlkbCkgeworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGFpZGwudHlwZSkpOworICAgIHJldHVybiBBdWRpb0RldmljZVR5cGVBZGRyKHR5cGUsIGFpZGwuYWRkcmVzcyk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvRGV2aWNlPgorbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBsZWdhY3kpIHsKKyAgICBtZWRpYTo6QXVkaW9EZXZpY2UgYWlkbDsKKyAgICBhaWRsLnR5cGUgPSBWQUxVRV9PUl9SRVRVUk4obGVnYWN5MmFpZGxfYXVkaW9fZGV2aWNlc190X2ludDMyX3QobGVnYWN5Lm1UeXBlKSk7CisgICAgYWlkbC5hZGRyZXNzID0gbGVnYWN5LmdldEFkZHJlc3MoKTsKKyAgICByZXR1cm4gYWlkbDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvR2Fpbi5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAppbmRleCAwZDI4MzM1Li4xZGVlOTM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcApAQCAtMTI5LDM4ICsxMjksNTEgQEAKICAgICAgICAgICAgbUdhaW4ubWF4X3JhbXBfbXMgPT0gb3RoZXItPm1HYWluLm1heF9yYW1wX21zOwogfQogCi1zdGF0dXNfdCBBdWRpb0dhaW46OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIGNvbnN0Ci17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIobUluZGV4KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtVXNlSW5DaGFubmVsTWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2wobVVzZUZvclZvbHVtZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5tb2RlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLmNoYW5uZWxfbWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1HYWluLm1pbl92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1HYWluLm1heF92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1HYWluLmRlZmF1bHRfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4uc3RlcF92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5taW5fcmFtcF9tcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4ubWF4X3JhbXBfbXMpOwotICAgIHJldHVybiBzdGF0dXM7CitzdGF0dXNfdCBBdWRpb0dhaW46OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBtZWRpYTo6QXVkaW9HYWluIHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHdyaXRlVG9QYXJjZWxhYmxlKCZwYXJjZWxhYmxlKQorICAgICAgICA/OiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9HYWluOjpyZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwgKnBhcmNlbCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtSW5kZXgpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Vc2VJbkNoYW5uZWxNYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtVXNlRm9yVm9sdW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLm1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4uY2hhbm5lbF9tYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUdhaW4ubWluX3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUdhaW4ubWF4X3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUdhaW4uZGVmYXVsdF92YWx1ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5zdGVwX3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLm1pbl9yYW1wX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5tYXhfcmFtcF9tcyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKK3N0YXR1c190IEF1ZGlvR2Fpbjo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvR2FpbiogcGFyY2VsYWJsZSkgY29uc3QgeworICAgIHBhcmNlbGFibGUtPmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUluZGV4KSk7CisgICAgcGFyY2VsYWJsZS0+dXNlSW5DaGFubmVsTWFzayA9IG1Vc2VJbkNoYW5uZWxNYXNrOworICAgIHBhcmNlbGFibGUtPnVzZUZvclZvbHVtZSA9IG1Vc2VGb3JWb2x1bWU7CisgICAgcGFyY2VsYWJsZS0+bW9kZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19nYWluX21vZGVfdF9pbnQzMl90X21hc2sobUdhaW4ubW9kZSkpOworICAgIHBhcmNlbGFibGUtPmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUdhaW4uY2hhbm5lbF9tYXNrKSk7CisgICAgcGFyY2VsYWJsZS0+bWluVmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5taW5fdmFsdWUpKTsKKyAgICBwYXJjZWxhYmxlLT5tYXhWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1heF92YWx1ZSkpOworICAgIHBhcmNlbGFibGUtPmRlZmF1bHRWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uZGVmYXVsdF92YWx1ZSkpOworICAgIHBhcmNlbGFibGUtPnN0ZXBWYWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLnN0ZXBfdmFsdWUpKTsKKyAgICBwYXJjZWxhYmxlLT5taW5SYW1wTXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihtR2Fpbi5taW5fcmFtcF9tcykpOworICAgIHBhcmNlbGFibGUtPm1heFJhbXBNcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KG1HYWluLm1heF9yYW1wX21zKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSB7CisgICAgbWVkaWE6OkF1ZGlvR2FpbiBwYXJjZWxhYmxlOworICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKKyAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOworfQorCitzdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBwYXJjZWxhYmxlKSB7CisgICAgbUluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmluZGV4KSk7CisgICAgbVVzZUluQ2hhbm5lbE1hc2sgPSBwYXJjZWxhYmxlLnVzZUluQ2hhbm5lbE1hc2s7CisgICAgbVVzZUZvclZvbHVtZSA9IHBhcmNlbGFibGUudXNlRm9yVm9sdW1lOworICAgIG1HYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKHBhcmNlbGFibGUubW9kZSkpOworICAgIG1HYWluLmNoYW5uZWxfbWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KHBhcmNlbGFibGUuY2hhbm5lbE1hc2spKTsKKyAgICBtR2Fpbi5taW5fdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUubWluVmFsdWUpKTsKKyAgICBtR2Fpbi5tYXhfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUubWF4VmFsdWUpKTsKKyAgICBtR2Fpbi5kZWZhdWx0X3ZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50PihwYXJjZWxhYmxlLmRlZmF1bHRWYWx1ZSkpOworICAgIG1HYWluLnN0ZXBfdmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUuc3RlcFZhbHVlKSk7CisgICAgbUdhaW4ubWluX3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUubWluUmFtcE1zKSk7CisgICAgbUdhaW4ubWF4X3JhbXBfbXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KHBhcmNlbGFibGUubWF4UmFtcE1zKSk7CisgICAgcmV0dXJuIE9LOwogfQogCiBib29sIEF1ZGlvR2FpbnM6OmVxdWFscyhjb25zdCBBdWRpb0dhaW5zICZvdGhlcikgY29uc3QKQEAgLTE5Niw0ICsyMDksMzQgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvR2Fpbj4+CithaWRsMmxlZ2FjeV9BdWRpb0dhaW4oY29uc3QgbWVkaWE6OkF1ZGlvR2FpbiYgYWlkbCkgeworICAgIHNwPEF1ZGlvR2Fpbj4gbGVnYWN5ID0gbmV3IEF1ZGlvR2FpbigwLCBmYWxzZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGVnYWN5LT5yZWFkRnJvbVBhcmNlbGFibGUoYWlkbCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gbGVnYWN5OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0dhaW4+CitsZWdhY3kyYWlkbF9BdWRpb0dhaW4oY29uc3Qgc3A8QXVkaW9HYWluPiYgbGVnYWN5KSB7CisgICAgbWVkaWE6OkF1ZGlvR2FpbiBhaWRsOworICAgIHN0YXR1c190IHN0YXR1cyA9IGxlZ2FjeS0+d3JpdGVUb1BhcmNlbGFibGUoJmFpZGwpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGJhc2U6OnVuZXhwZWN0ZWQoc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIGFpZGw7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8QXVkaW9HYWlucz4KK2FpZGwybGVnYWN5X0F1ZGlvR2FpbnMoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvR2Fpbj4mIGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxBdWRpb0dhaW5zPihhaWRsLCBhaWRsMmxlZ2FjeV9BdWRpb0dhaW4pOworfQorCitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PgorbGVnYWN5MmFpZGxfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zJiBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPj4obGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb0dhaW4pOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCmluZGV4IGY5ODg2OTAuLmZhZmFiZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCkBAIC0xNiw3ICsxNiw5IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9ydCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM4LDYgKzQwLDM2IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IGF1ZGlvX3BvcnRfdjcgJnBvcnQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQubnVtX2F1ZGlvX3Byb2ZpbGVzOyArK2kpIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmZvcm1hdCwKKyAgICAgICAgICAgICAgICBDaGFubmVsTWFza1NldChwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmNoYW5uZWxfbWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLmNoYW5uZWxfbWFza3MgKworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC5hdWRpb19wcm9maWxlcy0+bnVtX2NoYW5uZWxfbWFza3MpLAorICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVTZXQocG9ydC5hdWRpb19wcm9maWxlc1tpXS5zYW1wbGVfcmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLnNhbXBsZV9yYXRlcyArCisgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LmF1ZGlvX3Byb2ZpbGVzW2ldLm51bV9zYW1wbGVfcmF0ZXMpLAorICAgICAgICAgICAgICAgIHBvcnQuYXVkaW9fcHJvZmlsZXNbaV0uZW5jYXBzdWxhdGlvbl90eXBlKTsKKyAgICAgICAgaWYgKCFtUHJvZmlsZXMuY29udGFpbnMocHJvZmlsZSkpIHsKKyAgICAgICAgICAgIGFkZEF1ZGlvUHJvZmlsZShwcm9maWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydC5udW1fZXh0cmFfYXVkaW9fZGVzY3JpcHRvcnM7ICsraSkgeworICAgICAgICBhdXRvIGNvbnZlcnRlZFJlc3VsdCA9IGxlZ2FjeTJhaWRsX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JfRXh0cmFBdWRpb0Rlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgcG9ydC5leHRyYV9hdWRpb19kZXNjcmlwdG9yc1tpXSk7CisgICAgICAgIGlmICghY29udmVydGVkUmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcywgZmFpbGVkIHRvIGNvbnZlcnQgZXh0cmEgYXVkaW8gZGVzY3JpcHRvciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OmZpbmQobUV4dHJhQXVkaW9EZXNjcmlwdG9ycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkUmVzdWx0LnZhbHVlKCkpID09IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShjb252ZXJ0ZWRSZXN1bHQudmFsdWUoKSkpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0IHsKICAgICAvLyBUT0RPOiB1cGRhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIGF1ZGlvX3BvcnQgc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBuZXcgcHJvZmlsZSBkZWZpbml0aW9uLgogICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbjogZmxhdGVuaW5nIHRoZSBBdWRpb1Byb2ZpbGUgaW50byBhdWRpb19wb3J0IHN0cnVjdHVyZS4KQEAgLTYyLDIxICs5NCw1NiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKLSAgICBwb3J0LT50eXBlID0gbVR5cGU7Ci0gICAgc3RybGNweShwb3J0LT5uYW1lLCBtTmFtZS5jX3N0cigpLCBBVURJT19QT1JUX01BWF9OQU1FX0xFTik7CisgICAgdG9BdWRpb1BvcnRCYXNlKHBvcnQpOwogICAgIHBvcnQtPm51bV9zYW1wbGVfcmF0ZXMgPSBmbGF0ZW5lZFJhdGVzLnNpemUoKTsKICAgICBwb3J0LT5udW1fY2hhbm5lbF9tYXNrcyA9IGZsYXRlbmVkQ2hhbm5lbHMuc2l6ZSgpOwogICAgIHBvcnQtPm51bV9mb3JtYXRzID0gZmxhdGVuZWRGb3JtYXRzLnNpemUoKTsKICAgICBzdGQ6OmNvcHkoZmxhdGVuZWRSYXRlcy5iZWdpbigpLCBmbGF0ZW5lZFJhdGVzLmVuZCgpLCBwb3J0LT5zYW1wbGVfcmF0ZXMpOwogICAgIHN0ZDo6Y29weShmbGF0ZW5lZENoYW5uZWxzLmJlZ2luKCksIGZsYXRlbmVkQ2hhbm5lbHMuZW5kKCksIHBvcnQtPmNoYW5uZWxfbWFza3MpOwogICAgIHN0ZDo6Y29weShmbGF0ZW5lZEZvcm1hdHMuYmVnaW4oKSwgZmxhdGVuZWRGb3JtYXRzLmVuZCgpLCBwb3J0LT5mb3JtYXRzKTsKK30KIAotICAgIEFMT0dWKCJBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KCkgbnVtIGdhaW5zICV6dSIsIG1HYWlucy5zaXplKCkpOwordm9pZCBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdCB7CisgICAgdG9BdWRpb1BvcnRCYXNlKHBvcnQpOworICAgIHBvcnQtPm51bV9hdWRpb19wcm9maWxlcyA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogbVByb2ZpbGVzKSB7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVTZXQgJnNhbXBsZVJhdGVzID0gcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKTsKKyAgICAgICAgICAgIGNvbnN0IENoYW5uZWxNYXNrU2V0ICZjaGFubmVsTWFza3MgPSBwcm9maWxlLT5nZXRDaGFubmVscygpOwogCi0gICAgcG9ydC0+bnVtX2dhaW5zID0gc3RkOjptaW4obUdhaW5zLnNpemUoKSwgKHNpemVfdCkgQVVESU9fUE9SVF9NQVhfR0FJTlMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydC0+bnVtX2dhaW5zOyBpKyspIHsKLSAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPmdldEdhaW4oKTsKKyAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlcy5zaXplKCkgPiBBVURJT19QT1JUX01BWF9TQU1QTElOR19SQVRFUyB8fAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3Muc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUyB8fAorICAgICAgICAgICAgICAgICAgICBwb3J0LT5udW1fYXVkaW9fcHJvZmlsZXMgPj0gQVVESU9fUE9SVF9NQVhfQVVESU9fUFJPRklMRVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGJhaWxpbmcgb3V0OiBjYW5ub3QgZXhwb3J0IHByb2ZpbGVzIHRvIHBvcnQgY29uZmlnIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvJiBkc3RQcm9maWxlID0gcG9ydC0+YXVkaW9fcHJvZmlsZXNbcG9ydC0+bnVtX2F1ZGlvX3Byb2ZpbGVzKytdOworICAgICAgICAgICAgZHN0UHJvZmlsZS5mb3JtYXQgPSBwcm9maWxlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIGRzdFByb2ZpbGUubnVtX3NhbXBsZV9yYXRlcyA9IHNhbXBsZVJhdGVzLnNpemUoKTsKKyAgICAgICAgICAgIHN0ZDo6Y29weShzYW1wbGVSYXRlcy5iZWdpbigpLCBzYW1wbGVSYXRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiZWdpbihkc3RQcm9maWxlLnNhbXBsZV9yYXRlcykpOworICAgICAgICAgICAgZHN0UHJvZmlsZS5udW1fY2hhbm5lbF9tYXNrcyA9IGNoYW5uZWxNYXNrcy5zaXplKCk7CisgICAgICAgICAgICBzdGQ6OmNvcHkoY2hhbm5lbE1hc2tzLmJlZ2luKCksIGNoYW5uZWxNYXNrcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiZWdpbihkc3RQcm9maWxlLmNoYW5uZWxfbWFza3MpKTsKKyAgICAgICAgICAgIGRzdFByb2ZpbGUuZW5jYXBzdWxhdGlvbl90eXBlID0gcHJvZmlsZS0+Z2V0RW5jYXBzdWxhdGlvblR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBvcnQtPm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycyA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXNjIDogbUV4dHJhQXVkaW9EZXNjcmlwdG9ycykgeworICAgICAgICBpZiAocG9ydC0+bnVtX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzID49IEFVRElPX1BPUlRfTUFYX0VYVFJBX0FVRElPX0RFU0NSSVBUT1JTKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGJhaWxpbmcgb3V0OiBjYW5ub3QgZXhwb3J0IGV4dHJhIGF1ZGlvIGRlc2NyaXB0b3IgdG8gcG9ydCBjb25maWciLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGNvbnZlcnRlZFJlc3VsdCA9IGFpZGwybGVnYWN5X0V4dHJhQXVkaW9EZXNjcmlwdG9yX2F1ZGlvX2V4dHJhX2F1ZGlvX2Rlc2NyaXB0b3IoZGVzYyk7CisgICAgICAgIGlmICghY29udmVydGVkUmVzdWx0Lm9rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgZXh0cmEgYXVkaW8gZGVzY3JpcHRvciIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBvcnQtPmV4dHJhX2F1ZGlvX2Rlc2NyaXB0b3JzW3BvcnQtPm51bV9leHRyYV9hdWRpb19kZXNjcmlwdG9ycysrXSA9CisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGNvbnZlcnRlZFJlc3VsdC52YWx1ZSgpKTsKICAgICB9CiB9CiAKQEAgLTg4LDYgKzE1NSwyMiBAQAogICAgICAgICBzdGQ6OnN0cmluZyBwcm9maWxlc1N0cjsKICAgICAgICAgbVByb2ZpbGVzLmR1bXAoJnByb2ZpbGVzU3RyLCBzcGFjZXMpOwogICAgICAgICBkc3QtPmFwcGVuZChwcm9maWxlc1N0cik7CisgICAgICAgIGlmICghbUV4dHJhQXVkaW9EZXNjcmlwdG9ycy5lbXB0eSgpKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gZXh0cmEgYXVkaW8gZGVzY3JpcHRvcnM6IFxuIiwgc3BhY2VzLCAiIikpOworICAgICAgICAgICAgY29uc3QgaW50IGVhZFNwYWNlcyA9IHNwYWNlcyArIDQ7CisgICAgICAgICAgICBjb25zdCBpbnQgZGVzY1NwYWNlcyA9IGVhZFNwYWNlcyArIDQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkc3QtPmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzIGV4dHJhIGF1ZGlvIGRlc2NyaXB0b3IgJXp1OlxuIiwgZWFkU3BhY2VzLCAiIiwgaSkpOworICAgICAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgIiUqcy0gc3RhbmRhcmQ6ICV1XG4iLCBkZXNjU3BhY2VzLCAiIiwgbUV4dHJhQXVkaW9EZXNjcmlwdG9yc1tpXS5zdGFuZGFyZCkpOworICAgICAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBkZXNjcmlwdG9yOiIsIGRlc2NTcGFjZXMsICIiKSk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIHYgOiBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzW2ldLmF1ZGlvRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiAlMDJ4IiwgdikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGlmIChtR2FpbnMuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBnYWluczpcbiIsIHNwYWNlcywgIiIpKTsKQEAgLTExMiwzNyArMTk1LDQxIEBACiAgICAgICAgICAgIG1OYW1lLmNvbXBhcmUob3RoZXItPmdldE5hbWUoKSkgPT0gMCAmJgogICAgICAgICAgICBtVHlwZSA9PSBvdGhlci0+Z2V0VHlwZSgpICYmCiAgICAgICAgICAgIG1Sb2xlID09IG90aGVyLT5nZXRSb2xlKCkgJiYKLSAgICAgICAgICAgbVByb2ZpbGVzLmVxdWFscyhvdGhlci0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgICAgbVByb2ZpbGVzLmVxdWFscyhvdGhlci0+Z2V0QXVkaW9Qcm9maWxlcygpKSAmJgorICAgICAgICAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID09IG90aGVyLT5nZXRFeHRyYUF1ZGlvRGVzY3JpcHRvcnMoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAogewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1UeXBlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1Sb2xlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZShtUHJvZmlsZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKG1HYWlucykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBzdGF0dXM7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOworICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKKyAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1UeXBlKSA9PSBzaXplb2YodWludDMyX3QpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMihyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJm1UeXBlKSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1Sb2xlKSA9PSBzaXplb2YodWludDMyX3QpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMihyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJm1Sb2xlKSkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIG1Qcm9maWxlcy5jbGVhcigpOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmbVByb2ZpbGVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgbUdhaW5zLmNsZWFyKCk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZtR2FpbnMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gc3RhdHVzOworc3RhdHVzX3QgQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdCB7CisgICAgcGFyY2VsYWJsZS0+bmFtZSA9IG1OYW1lOworICAgIHBhcmNlbGFibGUtPnR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfdHlwZV90X0F1ZGlvUG9ydFR5cGUobVR5cGUpKTsKKyAgICBwYXJjZWxhYmxlLT5yb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3JvbGVfdF9BdWRpb1BvcnRSb2xlKG1Sb2xlKSk7CisgICAgcGFyY2VsYWJsZS0+cHJvZmlsZXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZmlsZVZlY3RvcihtUHJvZmlsZXMpKTsKKyAgICBwYXJjZWxhYmxlLT5leHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworICAgIHBhcmNlbGFibGUtPmdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9BdWRpb0dhaW5zKG1HYWlucykpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gcGFyY2VsYWJsZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpCisgICAgICAgID86IHJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSkgeworICAgIG1OYW1lID0gcGFyY2VsYWJsZS5uYW1lOworICAgIG1UeXBlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRUeXBlX2F1ZGlvX3BvcnRfdHlwZV90KHBhcmNlbGFibGUudHlwZSkpOworICAgIG1Sb2xlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KHBhcmNlbGFibGUucm9sZSkpOworICAgIG1Qcm9maWxlcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlVmVjdG9yKHBhcmNlbGFibGUucHJvZmlsZXMpKTsKKyAgICBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzID0gcGFyY2VsYWJsZS5leHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgbUdhaW5zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0dhaW5zKHBhcmNlbGFibGUuZ2FpbnMpKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIC8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KQEAgLTI0Myw0NSArMzMwLDU2IEBACiAgICAgICAgICAgIG1HYWluLnJhbXBfZHVyYXRpb25fbXMgPT0gb3RoZXItPm1HYWluLnJhbXBfZHVyYXRpb25fbXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobVNhbXBsaW5nUmF0ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1DaGFubmVsTWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1JZCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIC8vIFdyaXRlIG1HYWluIHRvIHBhcmNlbC4KLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtR2Fpbi5pbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5tb2RlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLmNoYW5uZWxfbWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXMoc3RkOjpiZWdpbihtR2Fpbi52YWx1ZXMpLCBzdGQ6OmVuZChtR2Fpbi52YWx1ZXMpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMlZlY3Rvcih2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gc3RhdHVzOworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyBwYXJjZWxhYmxlOworICAgIHJldHVybiB3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZSkKKyAgICAgICAgPzogcGFyY2VsYWJsZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1TYW1wbGluZ1JhdGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtRm9ybWF0KSA9PSBzaXplb2YodWludDMyX3QpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMihyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJm1Gb3JtYXQpKSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1DaGFubmVsTWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1JZCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIC8vIFJlYWQgbUdhaW4gZnJvbSBwYXJjZWwuCi0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMigmbUdhaW4uaW5kZXgpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ucmFtcF9kdXJhdGlvbl9tcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0ZDo6dmVjdG9yPGludD4gdmFsdWVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzJWZWN0b3IoJnZhbHVlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICh2YWx1ZXMuc2l6ZSgpICE9IHN0ZDo6c2l6ZShtR2Fpbi52YWx1ZXMpKSB7CitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb1BvcnRDb25maWcqIHBhcmNlbGFibGUpIGNvbnN0IHsKKyAgICBwYXJjZWxhYmxlLT5zYW1wbGVSYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obVNhbXBsaW5nUmF0ZSkpOworICAgIHBhcmNlbGFibGUtPmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQobUZvcm1hdCkpOworICAgIHBhcmNlbGFibGUtPmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUNoYW5uZWxNYXNrKSk7CisgICAgcGFyY2VsYWJsZS0+aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChtSWQpKTsKKyAgICBwYXJjZWxhYmxlLT5nYWluLmluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4uaW5kZXgpKTsKKyAgICBwYXJjZWxhYmxlLT5nYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fZ2Fpbl9tb2RlX3RfaW50MzJfdF9tYXNrKG1HYWluLm1vZGUpKTsKKyAgICBwYXJjZWxhYmxlLT5nYWluLmNoYW5uZWxNYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2NoYW5uZWxfbWFza190X2ludDMyX3QobUdhaW4uY2hhbm5lbF9tYXNrKSk7CisgICAgcGFyY2VsYWJsZS0+Z2Fpbi5yYW1wRHVyYXRpb25NcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obUdhaW4ucmFtcF9kdXJhdGlvbl9tcykpOworICAgIHBhcmNlbGFibGUtPmdhaW4udmFsdWVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PigKKyAgICAgICAgICAgIG1HYWluLnZhbHVlcywgY29udmVydEludGVncmFsPGludDMyX3QsIGludD4pKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIHsKKyAgICBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnIHBhcmNlbGFibGU7CisgICAgcmV0dXJuIHBhcmNlbGFibGUucmVhZEZyb21QYXJjZWwocGFyY2VsKQorICAgICAgICA/OiByZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIHBhcmNlbGFibGUpIHsKKyAgICBtU2FtcGxpbmdSYXRlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLnNhbXBsZVJhdGUpKTsKKyAgICBtRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChwYXJjZWxhYmxlLmZvcm1hdCkpOworICAgIG1DaGFubmVsTWFzayA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KHBhcmNlbGFibGUuY2hhbm5lbE1hc2spKTsKKyAgICBtSWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwYXJjZWxhYmxlLmlkKSk7CisgICAgbUdhaW4uaW5kZXggPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZ2Fpbi5pbmRleCkpOworICAgIG1HYWluLm1vZGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19nYWluX21vZGVfdF9tYXNrKHBhcmNlbGFibGUuZ2Fpbi5tb2RlKSk7CisgICAgbUdhaW4uY2hhbm5lbF9tYXNrID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fY2hhbm5lbF9tYXNrX3QocGFyY2VsYWJsZS5nYWluLmNoYW5uZWxNYXNrKSk7CisgICAgbUdhaW4ucmFtcF9kdXJhdGlvbl9tcyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dW5zaWduZWQgaW50PihwYXJjZWxhYmxlLmdhaW4ucmFtcER1cmF0aW9uTXMpKTsKKyAgICBpZiAocGFyY2VsYWJsZS5nYWluLnZhbHVlcy5zaXplKCkgPiBzdGQ6OnNpemUobUdhaW4udmFsdWVzKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzdGQ6OmNvcHkodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgbUdhaW4udmFsdWVzKTsKLSAgICByZXR1cm4gc3RhdHVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyY2VsYWJsZS5nYWluLnZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgICBtR2Fpbi52YWx1ZXNbaV0gPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KHBhcmNlbGFibGUuZ2Fpbi52YWx1ZXNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IDkxYmUzNDYuLjhhYzNmNzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCkBAIC01OCwxMCArNTgsMTggQEAKIEF1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxNYXNrU2V0ICZjaGFubmVsTWFza3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6CisgICAgICAgIEF1ZGlvUHJvZmlsZShmb3JtYXQsIGNoYW5uZWxNYXNrcywgc2FtcGxpbmdSYXRlQ29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIEFVRElPX0VOQ0FQU1VMQVRJT05fVFlQRV9OT05FKSB7fQorCitBdWRpb1Byb2ZpbGU6OkF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90IGVuY2Fwc3VsYXRpb25UeXBlKSA6CiAgICAgICAgIG1OYW1lKCIiKSwKICAgICAgICAgbUZvcm1hdChmb3JtYXQpLAogICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCi0gICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIHt9CisgICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pLAorICAgICAgICBtRW5jYXBzdWxhdGlvblR5cGUoZW5jYXBzdWxhdGlvblR5cGUpIHt9CiAKIHZvaWQgQXVkaW9Qcm9maWxlOjpzZXRDaGFubmVscyhjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzKQogewpAQCAtMTE2LDYgKzEyNCw5IEBACiAgICAgICAgIH0KICAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQorCisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgIiUqcy0gZW5jYXBzdWxhdGlvbiB0eXBlOiAlI3hcbiIsIHNwYWNlcywgIiIsIG1FbmNhcHN1bGF0aW9uVHlwZSkpOwogfQogCiBib29sIEF1ZGlvUHJvZmlsZTo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIG90aGVyKSBjb25zdApAQCAtMTI3LDQ1ICsxMzgsODMgQEAKICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPT0gb3RoZXItPmdldFNhbXBsZVJhdGVzKCkgJiYKICAgICAgICAgICAgbUlzRHluYW1pY0Zvcm1hdCA9PSBvdGhlci0+aXNEeW5hbWljRm9ybWF0KCkgJiYKICAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID09IG90aGVyLT5pc0R5bmFtaWNDaGFubmVscygpICYmCi0gICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID09IG90aGVyLT5pc0R5bmFtaWNSYXRlKCk7CisgICAgICAgICAgIG1Jc0R5bmFtaWNSYXRlID09IG90aGVyLT5pc0R5bmFtaWNSYXRlKCkgJiYKKyAgICAgICAgICAgbUVuY2Fwc3VsYXRpb25UeXBlID09IG90aGVyLT5nZXRFbmNhcHN1bGF0aW9uVHlwZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Ci17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUZvcm1hdCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHN0ZDo6dmVjdG9yPGludD4gdmFsdWVzKG1DaGFubmVsTWFza3MuYmVnaW4oKSwgbUNoYW5uZWxNYXNrcy5lbmQoKSk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IodmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgdmFsdWVzLmNsZWFyKCk7Ci0gICAgdmFsdWVzLmFzc2lnbihtU2FtcGxpbmdSYXRlcy5iZWdpbigpLCBtU2FtcGxpbmdSYXRlcy5lbmQoKSk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IodmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSXNEeW5hbWljRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSXNEeW5hbWljQ2hhbm5lbHMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Jc0R5bmFtaWNSYXRlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHN0YXR1czsKK0F1ZGlvUHJvZmlsZSYgQXVkaW9Qcm9maWxlOjpvcGVyYXRvcj0oY29uc3QgQXVkaW9Qcm9maWxlJiBvdGhlcikgeworICAgIG1OYW1lID0gb3RoZXIubU5hbWU7CisgICAgbUZvcm1hdCA9IG90aGVyLm1Gb3JtYXQ7CisgICAgbUNoYW5uZWxNYXNrcyA9IG90aGVyLm1DaGFubmVsTWFza3M7CisgICAgbVNhbXBsaW5nUmF0ZXMgPSBvdGhlci5tU2FtcGxpbmdSYXRlczsKKyAgICBtRW5jYXBzdWxhdGlvblR5cGUgPSBvdGhlci5tRW5jYXBzdWxhdGlvblR5cGU7CisgICAgbUlzRHluYW1pY0Zvcm1hdCA9IG90aGVyLm1Jc0R5bmFtaWNGb3JtYXQ7CisgICAgbUlzRHluYW1pY0NoYW5uZWxzID0gb3RoZXIubUlzRHluYW1pY0NoYW5uZWxzOworICAgIG1Jc0R5bmFtaWNSYXRlID0gb3RoZXIubUlzRHluYW1pY1JhdGU7CisgICAgcmV0dXJuICp0aGlzOwogfQogCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtRm9ybWF0KSA9PSBzaXplb2YodWludDMyX3QpKTsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMihyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJm1Gb3JtYXQpKSkgIT0gTk9fRVJST1IpIHsKK3N0YXR1c190IEF1ZGlvUHJvZmlsZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVModG9QYXJjZWxhYmxlKCkpOworICAgIHJldHVybiBwYXJjZWxhYmxlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyB9CisKK0NvbnZlcnNpb25SZXN1bHQ8bWVkaWE6OkF1ZGlvUHJvZmlsZT4KK0F1ZGlvUHJvZmlsZTo6dG9QYXJjZWxhYmxlKCkgY29uc3QgeworICAgIG1lZGlhOjpBdWRpb1Byb2ZpbGUgcGFyY2VsYWJsZTsKKyAgICBwYXJjZWxhYmxlLm5hbWUgPSBtTmFtZTsKKyAgICBwYXJjZWxhYmxlLmZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTihsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdChtRm9ybWF0KSk7CisgICAgcGFyY2VsYWJsZS5jaGFubmVsTWFza3MgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihtQ2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY2hhbm5lbF9tYXNrX3RfaW50MzJfdCkpOworICAgIHBhcmNlbGFibGUuc2FtcGxpbmdSYXRlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50MzJfdD4+KG1TYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydEludGVncmFsPGludDMyX3QsIHVpbnQzMl90PikpOworICAgIHBhcmNlbGFibGUuaXNEeW5hbWljRm9ybWF0ID0gbUlzRHluYW1pY0Zvcm1hdDsKKyAgICBwYXJjZWxhYmxlLmlzRHluYW1pY0NoYW5uZWxzID0gbUlzRHluYW1pY0NoYW5uZWxzOworICAgIHBhcmNlbGFibGUuaXNEeW5hbWljUmF0ZSA9IG1Jc0R5bmFtaWNSYXRlOworICAgIHBhcmNlbGFibGUuZW5jYXBzdWxhdGlvblR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdF9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlKG1FbmNhcHN1bGF0aW9uVHlwZSkpOworICAgIHJldHVybiBwYXJjZWxhYmxlOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbWVkaWE6OkF1ZGlvUHJvZmlsZSBwYXJjZWxhYmxlOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7IHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbHVlczsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZ2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7Ci0gICAgbUNoYW5uZWxNYXNrcy5pbnNlcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Ci0gICAgdmFsdWVzLmNsZWFyKCk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRJbnQzMlZlY3RvcigmdmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICBtU2FtcGxpbmdSYXRlcy5pbnNlcnQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtSXNEeW5hbWljRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRCb29sKCZtSXNEeW5hbWljQ2hhbm5lbHMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Jc0R5bmFtaWNSYXRlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICAqdGhpcyA9ICpWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3A8QXVkaW9Qcm9maWxlPj4KK0F1ZGlvUHJvZmlsZTo6ZnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUHJvZmlsZSYgcGFyY2VsYWJsZSkgeworICAgIHNwPEF1ZGlvUHJvZmlsZT4gbGVnYWN5ID0gbmV3IEF1ZGlvUHJvZmlsZSgpOworICAgIGxlZ2FjeS0+bU5hbWUgPSBwYXJjZWxhYmxlLm5hbWU7CisgICAgbGVnYWN5LT5tRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOKGFpZGwybGVnYWN5X0F1ZGlvRm9ybWF0X2F1ZGlvX2Zvcm1hdF90KHBhcmNlbGFibGUuZm9ybWF0KSk7CisgICAgbGVnYWN5LT5tQ2hhbm5lbE1hc2tzID0gVkFMVUVfT1JfUkVUVVJOKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxDaGFubmVsTWFza1NldD4ocGFyY2VsYWJsZS5jaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2NoYW5uZWxfbWFza190KSk7CisgICAgbGVnYWN5LT5tU2FtcGxpbmdSYXRlcyA9IFZBTFVFX09SX1JFVFVSTigKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8U2FtcGxlUmF0ZVNldD4ocGFyY2VsYWJsZS5zYW1wbGluZ1JhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0SW50ZWdyYWw8dWludDMyX3QsIGludDMyX3Q+KSk7CisgICAgbGVnYWN5LT5tSXNEeW5hbWljRm9ybWF0ID0gcGFyY2VsYWJsZS5pc0R5bmFtaWNGb3JtYXQ7CisgICAgbGVnYWN5LT5tSXNEeW5hbWljQ2hhbm5lbHMgPSBwYXJjZWxhYmxlLmlzRHluYW1pY0NoYW5uZWxzOworICAgIGxlZ2FjeS0+bUlzRHluYW1pY1JhdGUgPSBwYXJjZWxhYmxlLmlzRHluYW1pY1JhdGU7CisgICAgbGVnYWN5LT5tRW5jYXBzdWxhdGlvblR5cGUgPSBWQUxVRV9PUl9SRVRVUk4oCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0VuY2Fwc3VsYXRpb25UeXBlX2F1ZGlvX2VuY2Fwc3VsYXRpb25fdHlwZV90KAorICAgICAgICAgICAgICAgICAgICBwYXJjZWxhYmxlLmVuY2Fwc3VsYXRpb25UeXBlKSk7CisgICAgcmV0dXJuIGxlZ2FjeTsKK30KKworQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpIHsKKyAgICByZXR1cm4gQXVkaW9Qcm9maWxlOjpmcm9tUGFyY2VsYWJsZShhaWRsKTsKK30KKworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSkgeworICAgIHJldHVybiBsZWdhY3ktPnRvUGFyY2VsYWJsZSgpOwogfQogCiBzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCkBAIC0yNTgsNiArMzA3LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y29udGFpbnMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcHJvZmlsZSkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGF1ZGlvUHJvZmlsZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb1Byb2ZpbGUtPmVxdWFscyhwcm9maWxlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiB2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAogewogICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpKTsKQEAgLTMwNCw0ICszNjMsNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICB9KTsKIH0KIAorQ29udmVyc2lvblJlc3VsdDxBdWRpb1Byb2ZpbGVWZWN0b3I+CithaWRsMmxlZ2FjeV9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4mIGFpZGwpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxBdWRpb1Byb2ZpbGVWZWN0b3I+KGFpZGwsIGFpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZSk7Cit9CisKK0NvbnZlcnNpb25SZXN1bHQ8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZmlsZT4+CitsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGVWZWN0b3IoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBsZWdhY3kpIHsKKyAgICByZXR1cm4gY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPj4obGVnYWN5LCBsZWdhY3kyYWlkbF9BdWRpb1Byb2ZpbGUpOworfQorCitBdWRpb1Byb2ZpbGVWZWN0b3IgaW50ZXJzZWN0QXVkaW9Qcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIHByb2ZpbGVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgcHJvZmlsZXMyKQoreworICAgIHN0ZDo6bWFwPGF1ZGlvX2Zvcm1hdF90LCBzdGQ6OnBhaXI8Q2hhbm5lbE1hc2tTZXQsIFNhbXBsZVJhdGVTZXQ+PiBpbmZvczI7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogcHJvZmlsZXMyKSB7CisgICAgICAgIGluZm9zMi5lbXBsYWNlKHByb2ZpbGUtPmdldEZvcm1hdCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHByb2ZpbGUtPmdldENoYW5uZWxzKCksIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpKTsKKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIHByb2ZpbGVzOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IHByb2ZpbGVzMSkgeworICAgICAgICBjb25zdCBhdXRvIGl0ID0gaW5mb3MyLmZpbmQocHJvZmlsZS0+Z2V0Rm9ybWF0KCkpOworICAgICAgICBpZiAoaXQgPT0gaW5mb3MyLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDaGFubmVsTWFza1NldCBjaGFubmVsTWFza3MgPSBTZXRJbnRlcnNlY3Rpb24ocHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwgaXQtPnNlY29uZC5maXJzdCk7CisgICAgICAgIGlmIChjaGFubmVsTWFza3MuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgU2FtcGxlUmF0ZVNldCBzYW1wbGVSYXRlcyA9IFNldEludGVyc2VjdGlvbihwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBpdC0+c2Vjb25kLnNlY29uZCk7CisgICAgICAgIGlmIChzYW1wbGVSYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcm9maWxlcy5wdXNoX2JhY2sobmV3IEF1ZGlvUHJvZmlsZShwcm9maWxlLT5nZXRGb3JtYXQoKSwgY2hhbm5lbE1hc2tzLCBzYW1wbGVSYXRlcykpOworICAgIH0KKyAgICByZXR1cm4gcHJvZmlsZXM7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCmluZGV4IDNkYmUzN2QuLjVjZmVhODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKQEAgLTQwLDExICs0MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKICAgICAgICAgbURldmljZVR5cGVBZGRyKGRldmljZVR5cGVBZGRyKQogewotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7Ci0gICAgICAgIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9ICIwIjsKKyAgICBpZiAobURldmljZVR5cGVBZGRyLmFkZHJlc3MoKS5lbXB0eSgpICYmIGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG1EZXZpY2VUeXBlQWRkci5tVHlwZSkpIHsKKyAgICAgICAgbURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MoIjAiKTsKICAgICB9CiB9CiAKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsKKyAgICBtRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcyhhZGRyZXNzKTsKK30KKwogdm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKQEAgLTc2LDEzICs4MSwxMiBAQAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7CiAgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlQWRkci5tVHlwZSk7Ci0gICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+aWQgPSBtSWQ7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGVBZGRyLm1UeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuZW5jYXBzdWxhdGlvbl9tb2RlcyA9IG1FbmNhcHN1bGF0aW9uTW9kZXM7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5lbmNhcHN1bGF0aW9uX21ldGFkYXRhX3R5cGVzID0gbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzOwotICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtRGV2aWNlVHlwZUFkZHIuZ2V0QWRkcmVzcygpKTsKKyAgICB0b0F1ZGlvUG9ydEludGVybmFsKHBvcnQpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3QgeworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9BdWRpb1BvcnQoKSB2NyBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZUFkZHIubVR5cGUpOworICAgIHRvQXVkaW9Qb3J0SW50ZXJuYWwocG9ydCk7CiB9CiAKIHN0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjpzZXRFbmNhcHN1bGF0aW9uTW9kZXModWludDMyX3QgZW5jYXBzdWxhdGlvbk1vZGVzKSB7CkBAIC0xMTgsMjMgKzEyMiwyMSBAQAogICAgICAgICAgICAgc3BhY2VzLCAiIiwgOjphbmRyb2lkOjp0b1N0cmluZyhtRGV2aWNlVHlwZUFkZHIubVR5cGUpLmNfc3RyKCkpKTsKIAogICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICIlKnMtIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIG1vZGVzOiAldSIsIHNwYWNlcywgIiIsIG1FbmNhcHN1bGF0aW9uTW9kZXMpKTsKKyAgICAgICAgICAgICIlKnMtIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIG1vZGVzOiAldVxuIiwgc3BhY2VzLCAiIiwgbUVuY2Fwc3VsYXRpb25Nb2RlcykpOwogICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICIlKnMtIHN1cHBvcnRlZCBlbmNhcHN1bGF0aW9uIG1ldGFkYXRhIHR5cGVzOiAldSIsCisgICAgICAgICAgICAiJSpzLSBzdXBwb3J0ZWQgZW5jYXBzdWxhdGlvbiBtZXRhZGF0YSB0eXBlczogJXVcbiIsCiAgICAgICAgICAgICBzcGFjZXMsICIiLCBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKTsKIAotICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKKyAgICBpZiAobURldmljZVR5cGVBZGRyLmFkZHJlc3MoKS5zaXplKCkgIT0gMCkgewogICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoCiAgICAgICAgICAgICAgICAgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpKTsKICAgICB9CiAgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvU3RyaW5nKCkgY29uc3QKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdAogewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07Ci0gICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgdHlwZSgpIDw8ICIsQDoiIDw8IG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsKLSAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKKyAgICByZXR1cm4gbURldmljZVR5cGVBZGRyLnRvU3RyaW5nKGluY2x1ZGVTZW5zaXRpdmVJbmZvKTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6bG9nKCkgY29uc3QKQEAgLTE1NCwyNiArMTU2LDUzIEBACiAgICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5lcXVhbHMob3RoZXItPm1EZXZpY2VUeXBlQWRkcik7CiB9CiAKKwogc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0CiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBBdWRpb1BvcnQ6OndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBBdWRpb1BvcnRDb25maWc6OndyaXRlVG9QYXJjZWwocGFyY2VsKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZShtRGV2aWNlVHlwZUFkZHIpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUVuY2Fwc3VsYXRpb25Nb2RlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gc3RhdHVzOworICAgIG1lZGlhOjpBdWRpb1BvcnQgcGFyY2VsYWJsZTsKKyAgICByZXR1cm4gd3JpdGVUb1BhcmNlbGFibGUoJnBhcmNlbGFibGUpCisgICAgICAgID86IHBhcmNlbGFibGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKChzdGF0dXMgPSBBdWRpb1BvcnQ6OnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0Q29uZmlnOjpyZWFkRnJvbVBhcmNlbChwYXJjZWwpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKLSAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUoJm1EZXZpY2VUeXBlQWRkcikpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtRW5jYXBzdWxhdGlvbk1vZGVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7Ci0gICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBzdGF0dXM7CitzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6d3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3QgeworICAgIEF1ZGlvUG9ydDo6d3JpdGVUb1BhcmNlbGFibGUocGFyY2VsYWJsZSk7CisgICAgQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsYWJsZSgmcGFyY2VsYWJsZS0+YWN0aXZlQ29uZmlnKTsKKyAgICBwYXJjZWxhYmxlLT5pZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KG1JZCkpOworCisgICAgbWVkaWE6OkF1ZGlvUG9ydERldmljZUV4dCBleHQ7CisgICAgZXh0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhtRGV2aWNlVHlwZUFkZHIpKTsKKyAgICBleHQuZW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhtRW5jYXBzdWxhdGlvbk1vZGVzKSk7CisgICAgZXh0LmVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgIFVOSU9OX1NFVChwYXJjZWxhYmxlLT5leHQsIGRldmljZSwgc3RkOjptb3ZlKGV4dCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSB7CisgICAgbWVkaWE6OkF1ZGlvUG9ydCBwYXJjZWxhYmxlOworICAgIHJldHVybiBwYXJjZWxhYmxlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCkKKyAgICAgICAgPzogcmVhZEZyb21QYXJjZWxhYmxlKHBhcmNlbGFibGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6cmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpIHsKKyAgICBpZiAocGFyY2VsYWJsZS50eXBlICE9IG1lZGlhOjpBdWRpb1BvcnRUeXBlOjpERVZJQ0UpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbGFibGUocGFyY2VsYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICA/OiBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsYWJsZShwYXJjZWxhYmxlLmFjdGl2ZUNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1lZGlhOjpBdWRpb1BvcnREZXZpY2VFeHQgZXh0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhVTklPTl9HRVQocGFyY2VsYWJsZS5leHQsIGRldmljZSkpOworICAgIG1EZXZpY2VUeXBlQWRkciA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGV4dC5kZXZpY2UpKTsKKyAgICBtRW5jYXBzdWxhdGlvbk1vZGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1vZGVfbWFzayhleHQuZW5jYXBzdWxhdGlvbk1vZGVzKSk7CisgICAgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZV9tYXNrKGV4dC5lbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcykpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIGRldmljZXMpCkBAIC0xOTcsNCArMjI2LDI0IEBACiAgICAgcmV0dXJuIGRldmljZVR5cGVBZGRyczsKIH0KIAorQ29udmVyc2lvblJlc3VsdDxzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4+CithaWRsMmxlZ2FjeV9EZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0JiBhaWRsKSB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IHJlc3VsdCA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVzdWx0LT5yZWFkRnJvbVBhcmNlbGFibGUoYWlkbCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5leHBlY3RlZChzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnQ+CitsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGxlZ2FjeSkgeworICAgIG1lZGlhOjpBdWRpb1BvcnQgYWlkbDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBsZWdhY3ktPndyaXRlVG9QYXJjZWxhYmxlKCZhaWRsKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBiYXNlOjp1bmV4cGVjdGVkKHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBhaWRsOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0NvbnRhaW5lcnMuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCmluZGV4IDcyZmRhNDkuLjIwNGIzNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCkBAIC01MCw2ICs1MCwxNSBAQAogICAgIHJldHVybiBpbnRlcnNlY3Rpb247CiB9CiAKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgc3RkOjpzZXQ8VD4gU2V0SW50ZXJzZWN0aW9uKGNvbnN0IHN0ZDo6c2V0PFQ+JiBhLCBjb25zdCBzdGQ6OnNldDxUPiBiKSB7CisgICAgc3RkOjpzZXQ8VD4gaW50ZXJzZWN0aW9uOworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihhLmJlZ2luKCksIGEuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYmVnaW4oKSwgYi5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbnNlcnRlcihpbnRlcnNlY3Rpb24sIGludGVyc2VjdGlvbi5iZWdpbigpKSk7CisgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKK30KKwogc3RhdGljIGlubGluZSBDaGFubmVsTWFza1NldCBhc0luTWFzayhjb25zdCBDaGFubmVsTWFza1NldCYgY2hhbm5lbE1hc2tzKSB7CiAgICAgQ2hhbm5lbE1hc2tTZXQgaW5NYXNrU2V0OwogICAgIGZvciAoY29uc3QgYXV0byAmY2hhbm5lbCA6IGNoYW5uZWxNYXNrcykgewpAQCAtOTYsNyArMTA1LDcgQEAKIHN0YXRpYyBpbmxpbmUgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGVzVG9CaXRNYXNrKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSB7CiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgZm9yIChhdXRvIGRldmljZVR5cGUgOiBkZXZpY2VUeXBlcykgewotICAgICAgICB0eXBlcyB8PSBkZXZpY2VUeXBlOworICAgICAgICB0eXBlcyA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4odHlwZXMgfCBkZXZpY2VUeXBlKTsKICAgICB9CiAgICAgcmV0dXJuIHR5cGVzOwogfQpAQCAtMTMxLDQgKzE0MCw0IEBACiBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcyk7CiAKIAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaAppbmRleCA2MGVhNzhlLi44ZWRjYzU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oCkBAIC0xOSwzNiArMTksNTMgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uVXRpbC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBdWRpb0RldmljZVR5cGVBZGRyIDogcHVibGljIFBhcmNlbGFibGUgeworY2xhc3MgQXVkaW9EZXZpY2VUeXBlQWRkciA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3B1YmxpYzoKICAgICBBdWRpb0RldmljZVR5cGVBZGRyKCkgPSBkZWZhdWx0OwogCi0gICAgQXVkaW9EZXZpY2VUeXBlQWRkcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpIDoKLSAgICAgICAgICAgIG1UeXBlKHR5cGUpLCBtQWRkcmVzcyhhZGRyZXNzKSB7fQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKIAogICAgIGNvbnN0IGNoYXIqIGdldEFkZHJlc3MoKSBjb25zdDsKIAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKCkgY29uc3Q7CisKKyAgICB2b2lkIHNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpOworCisgICAgYm9vbCBpc0FkZHJlc3NTZW5zaXRpdmUoKTsKKwogICAgIGJvb2wgZXF1YWxzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdDsKIAogICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHImIG9wZXJhdG9yPSAoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYpID0gZGVmYXVsdDsKIAogICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdDsKIAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiByaHMpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIHJocykgY29uc3Q7CisKICAgICB2b2lkIHJlc2V0KCk7CiAKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvPWZhbHNlKSBjb25zdDsKKwogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fZGV2aWNlc190IG1UeXBlID0gQVVESU9fREVWSUNFX05PTkU7CisKK3ByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgbUFkZHJlc3M7CisgICAgYm9vbCBtSXNBZGRyZXNzU2Vuc2l0aXZlOwogfTsKIAogdXNpbmcgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciA9IHN0ZDo6dmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+OwpAQCAtNTgsNCArNzUsMjEgQEAKICAqLwogRGV2aWNlVHlwZVNldCBnZXRBdWRpb0RldmljZVR5cGVzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRycyk7CiAKLX0KKy8qKgorICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBBdWRpb0RldmljZVR5cGVBZGRycyB0aGF0IGFyZSBzaG93biBpbiBgZGV2aWNlc2AgYnV0IG5vdAorICogaW4gYGRldmljZXNUb0V4Y2x1ZGVgCisgKi8KK0F1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXNUb0V4Y2x1ZGUpOworCitzdGQ6OnN0cmluZyBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvPWZhbHNlKTsKKworLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvRGV2aWNlVHlwZUFkZHI+CithaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb0RldmljZT4KK2xlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgbGVnYWN5KTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaAppbmRleCA4NTlmMWU3Li5hMDZiNjg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaApAQCAtMTYsOCArMTYsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtNzIsNiArNzQsOSBAQAogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKIAorICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWxhYmxlKG1lZGlhOjpBdWRpb0dhaW4qIHBhcmNlbGFibGUpIGNvbnN0OworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsYWJsZShjb25zdCBtZWRpYTo6QXVkaW9HYWluJiBwYXJjZWxhYmxlKTsKKwogcHJpdmF0ZToKICAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CiAgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47CkBAIC03OSw2ICs4NCwxMiBAQAogICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VGb3JWb2x1bWUgPSBmYWxzZTsKIH07CiAKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb0dhaW4+PgorYWlkbDJsZWdhY3lfQXVkaW9HYWluKGNvbnN0IG1lZGlhOjpBdWRpb0dhaW4mIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9HYWluPgorbGVnYWN5MmFpZGxfQXVkaW9HYWluKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIGxlZ2FjeSk7CisKIGNsYXNzIEF1ZGlvR2FpbnMgOiBwdWJsaWMgc3RkOjp2ZWN0b3I8c3A8QXVkaW9HYWluPiA+LCBwdWJsaWMgUGFyY2VsYWJsZQogewogcHVibGljOgpAQCAtMTA0LDQgKzExNSwxMCBAQAogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKIH07CiAKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxBdWRpb0dhaW5zPgorYWlkbDJsZWdhY3lfQXVkaW9HYWlucyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9HYWluPiYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0dhaW4+PgorbGVnYWN5MmFpZGxfQXVkaW9HYWlucyhjb25zdCBBdWRpb0dhaW5zJiBsZWdhY3kpOworCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCmluZGV4IDNjMDEzY2IuLjFjZWUxYzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9ydC5oCkBAIC0xNyw3ICsxNywxMSBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL21lZGlhL0F1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQXVkaW9Qb3J0Q29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9FeHRyYUF1ZGlvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgpAQCAtNDgsNiArNTIsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAorICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHZvaWQgYWRkQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpIHsKICAgICAgICAgbVByb2ZpbGVzLmFkZChwcm9maWxlKTsKICAgICB9CkBAIC02Miw4ICs2OCwxOCBAQAogICAgIHZvaWQgc2V0QXVkaW9Qcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKSB7IG1Qcm9maWxlcyA9IHByb2ZpbGVzOyB9CiAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZnZXRBdWRpb1Byb2ZpbGVzKCkgeyByZXR1cm4gbVByb2ZpbGVzOyB9CiAKKyAgICB2b2lkIHNldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gZXh0cmFBdWRpb0Rlc2NyaXB0b3JzKSB7CisgICAgICAgIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnMgPSBleHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFeHRyYUF1ZGlvRGVzY3JpcHRvcj4gJmdldEV4dHJhQXVkaW9EZXNjcmlwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIG1FeHRyYUF1ZGlvRGVzY3JpcHRvcnM7CisgICAgfQorCiAgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOwogCisgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBhdWRpb19wb3J0X3Y3JiBwb3J0KTsKKwogICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3QgewogICAgICAgICBpZiAoaW5kZXggPCAwIHx8IChzaXplX3QpaW5kZXggPj0gbUdhaW5zLnNpemUoKSkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTg2LDEyICsxMDIsMzEgQEAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0KiBwYXJjZWxhYmxlKSBjb25zdDsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcGFyY2VsYWJsZSk7CisKICAgICBBdWRpb0dhaW5zIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwogcHJvdGVjdGVkOgogICAgIHN0ZDo6c3RyaW5nICBtTmFtZTsKICAgICBhdWRpb19wb3J0X3R5cGVfdCBtVHlwZTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbVByb2ZpbGVzOyAvLyBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKQorCisgICAgLy8gQXVkaW8gY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGRlZmluZWQgYnkgaGFyZHdhcmUgZGVzY3JpcHRvcnMgd2hlbiB0aGUgZm9ybWF0IGlzIHVucmVjb2duaXplZAorICAgIC8vIGJ5IHRoZSBwbGF0Zm9ybSwgZS5nLiBzaG9ydCBhdWRpbyBkZXNjcmlwdG9yIGluIEVESUQgZm9yIEhETUkuCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkV4dHJhQXVkaW9EZXNjcmlwdG9yPiBtRXh0cmFBdWRpb0Rlc2NyaXB0b3JzOworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydF92Nz46OnZhbHVlLCBpbnQ+ID0gMD4KKyAgICB2b2lkIHRvQXVkaW9Qb3J0QmFzZShUKiBwb3J0KSBjb25zdCB7CisgICAgICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKKyAgICAgICAgcG9ydC0+dHlwZSA9IG1UeXBlOworICAgICAgICBzdHJsY3B5KHBvcnQtPm5hbWUsIG1OYW1lLmNfc3RyKCksIEFVRElPX1BPUlRfTUFYX05BTUVfTEVOKTsKKyAgICAgICAgcG9ydC0+bnVtX2dhaW5zID0gc3RkOjptaW4obUdhaW5zLnNpemUoKSwgKHNpemVfdCkgQVVESU9fUE9SVF9NQVhfR0FJTlMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQtPm51bV9nYWluczsgaSsrKSB7CisgICAgICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+Z2V0R2FpbigpOworICAgICAgICB9CisgICAgfQogfTsKIAogCkBAIC0xMTksNiArMTU0LDggQEAKIAogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwogICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsYWJsZShtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnKiBwYXJjZWxhYmxlKSBjb25zdDsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbGFibGUoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgcGFyY2VsYWJsZSk7CiAKIHByb3RlY3RlZDoKICAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZSA9IDB1OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaAppbmRleCA3MzAxMzhhLi42YTM2ZTc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2ZpbGUuaApAQCAtMTksOCArMTksMTAgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTM2LDYgKzM4LDEwIEBACiAgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcywKICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbik7CisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgZW5jYXBzdWxhdGlvblR5cGUpOwogCiAgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQogICAgIGNvbnN0IENoYW5uZWxNYXNrU2V0ICZnZXRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFza3M7IH0KQEAgLTY2LDYgKzcyLDExIEBACiAKICAgICBib29sIGlzRHluYW1pYygpIHsgcmV0dXJuIG1Jc0R5bmFtaWNGb3JtYXQgfHwgbUlzRHluYW1pY0NoYW5uZWxzIHx8IG1Jc0R5bmFtaWNSYXRlOyB9CiAKKyAgICBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCBnZXRFbmNhcHN1bGF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1FbmNhcHN1bGF0aW9uVHlwZTsgfQorICAgIHZvaWQgc2V0RW5jYXBzdWxhdGlvblR5cGUoYXVkaW9fZW5jYXBzdWxhdGlvbl90eXBlX3QgZW5jYXBzdWxhdGlvblR5cGUpIHsKKyAgICAgICAgbUVuY2Fwc3VsYXRpb25UeXBlID0gZW5jYXBzdWxhdGlvblR5cGU7CisgICAgfQorCiAgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIpIGNvbnN0OwpAQCAtNzMsNyArODQsMTEgQEAKICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAKKyAgICBDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1Byb2ZpbGU+IHRvUGFyY2VsYWJsZSgpIGNvbnN0OworICAgIHN0YXRpYyBDb252ZXJzaW9uUmVzdWx0PHNwPEF1ZGlvUHJvZmlsZT4+IGZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIHBhcmNlbGFibGUpOworCiBwcml2YXRlOgorCiAgICAgc3RkOjpzdHJpbmcgIG1OYW1lOwogICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7IC8vIFRoZSBmb3JtYXQgZm9yIGFuIGF1ZGlvIHByb2ZpbGUgc2hvdWxkIG9ubHkgYmUgc2V0IHdoZW4gaW5pdGlhbGl6ZWQuCiAgICAgQ2hhbm5lbE1hc2tTZXQgbUNoYW5uZWxNYXNrczsKQEAgLTgyLDggKzk3LDE5IEBACiAgICAgYm9vbCBtSXNEeW5hbWljRm9ybWF0ID0gZmFsc2U7CiAgICAgYm9vbCBtSXNEeW5hbWljQ2hhbm5lbHMgPSBmYWxzZTsKICAgICBib29sIG1Jc0R5bmFtaWNSYXRlID0gZmFsc2U7CisKKyAgICBhdWRpb19lbmNhcHN1bGF0aW9uX3R5cGVfdCBtRW5jYXBzdWxhdGlvblR5cGUgPSBBVURJT19FTkNBUFNVTEFUSU9OX1RZUEVfTk9ORTsKKworICAgIEF1ZGlvUHJvZmlsZSgpID0gZGVmYXVsdDsKKyAgICBBdWRpb1Byb2ZpbGUmIG9wZXJhdG9yPShjb25zdCBBdWRpb1Byb2ZpbGUmIG90aGVyKTsKIH07CiAKKy8vIENvbnZlcnNpb24gcm91dGluZXMsIGFjY29yZGluZyB0byBBaWRsQ29udmVyc2lvbi5oIGNvbnZlbnRpb25zLgorQ29udmVyc2lvblJlc3VsdDxzcDxBdWRpb1Byb2ZpbGU+PgorYWlkbDJsZWdhY3lfQXVkaW9Qcm9maWxlKGNvbnN0IG1lZGlhOjpBdWRpb1Byb2ZpbGUmIGFpZGwpOworQ29udmVyc2lvblJlc3VsdDxtZWRpYTo6QXVkaW9Qcm9maWxlPgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIGxlZ2FjeSk7CisKIGNsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+PiwgcHVibGljIFBhcmNlbGFibGUKIHsKIHB1YmxpYzoKQEAgLTEwNSw2ICsxMzEsOCBAQAogICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdDsKICAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CiAKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4mIHByb2ZpbGUpIGNvbnN0OworCiAgICAgdmlydHVhbCB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKICAgICBib29sIGVxdWFscyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG90aGVyKSBjb25zdDsKQEAgLTExNSw0ICsxNDMsMTMgQEAKIAogYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJnJpZ2h0KTsKIAorLy8gQ29udmVyc2lvbiByb3V0aW5lcywgYWNjb3JkaW5nIHRvIEFpZGxDb252ZXJzaW9uLmggY29udmVudGlvbnMuCitDb252ZXJzaW9uUmVzdWx0PEF1ZGlvUHJvZmlsZVZlY3Rvcj4KK2FpZGwybGVnYWN5X0F1ZGlvUHJvZmlsZVZlY3Rvcihjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Qcm9maWxlPiYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2ZpbGU+PgorbGVnYWN5MmFpZGxfQXVkaW9Qcm9maWxlVmVjdG9yKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgbGVnYWN5KTsKKworQXVkaW9Qcm9maWxlVmVjdG9yIGludGVyc2VjdEF1ZGlvUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBwcm9maWxlczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIHByb2ZpbGVzMik7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCmluZGV4IGFmMDQ3MjEuLjE0MGNlMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9BdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KQEAgLTQxLDggKzQyLDggQEAKICAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yQmFzZSgpIHt9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tVHlwZTsgfQotICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3M7IH0KLSAgICB2b2lkIHNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gYWRkcmVzczsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLmFkZHJlc3MoKTsgfQorICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcyk7CiAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZ2V0RGV2aWNlVHlwZUFkZHIoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHI7IH0KIAogICAgIC8vIEF1ZGlvUG9ydENvbmZpZwpAQCAtNTQsNiArNTUsNyBAQAogCiAgICAgLy8gQXVkaW9Qb3J0CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0OwogCiAgICAgc3RhdHVzX3Qgc2V0RW5jYXBzdWxhdGlvbk1vZGVzKHVpbnQzMl90IGVuY2Fwc3VsYXRpb25Nb2Rlcyk7CiAgICAgc3RhdHVzX3Qgc2V0RW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXModWludDMyX3QgZW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXMpOwpAQCAtNjEsMTcgKzYzLDM5IEBACiAgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwKICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvID0gbnVsbHB0ciwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAgICAgdm9pZCBsb2coKSBjb25zdDsKLSAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgc3RyaW5nIHRvIGRlc2NyaWJlIHRoZSBEZXZpY2VEZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVTZW5zaXRpdmVJbmZvIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHdoZW4gaXQgaXMgdHJ1ZS4KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIERldmljZURlc2NyaXB0b3IuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbyA9IGZhbHNlKSBjb25zdDsKIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgb3RoZXIpIGNvbnN0OwogCiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwogCisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbGFibGUobWVkaWE6OkF1ZGlvUG9ydCogcGFyY2VsYWJsZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWxhYmxlKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBhcmNlbGFibGUpOworCiBwcm90ZWN0ZWQ6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBtRGV2aWNlVHlwZUFkZHI7CiAgICAgdWludDMyX3QgbUVuY2Fwc3VsYXRpb25Nb2RlcyA9IDA7CiAgICAgdWludDMyX3QgbUVuY2Fwc3VsYXRpb25NZXRhZGF0YVR5cGVzID0gMDsKK3ByaXZhdGU6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnRfdjc+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgdm9pZCB0b0F1ZGlvUG9ydEludGVybmFsKFQqIHBvcnQpIGNvbnN0IHsKKyAgICAgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOworICAgICAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGVBZGRyLm1UeXBlOworICAgICAgICBwb3J0LT5leHQuZGV2aWNlLmVuY2Fwc3VsYXRpb25fbW9kZXMgPSBtRW5jYXBzdWxhdGlvbk1vZGVzOworICAgICAgICBwb3J0LT5leHQuZGV2aWNlLmVuY2Fwc3VsYXRpb25fbWV0YWRhdGFfdHlwZXMgPSBtRW5jYXBzdWxhdGlvbk1ldGFkYXRhVHlwZXM7CisgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtRGV2aWNlVHlwZUFkZHIuZ2V0QWRkcmVzcygpKTsKKyAgICB9CiB9OwogCiB1c2luZyBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciA9IHN0ZDo6dmVjdG9yPHNwPERldmljZURlc2NyaXB0b3JCYXNlPj47CkBAIC04Nyw0ICsxMTEsMTAgQEAKICAqLwogQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VUeXBlQWRkcnNGcm9tRGVzY3JpcHRvcnMoY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIGRldmljZXMpOwogCisvLyBDb252ZXJzaW9uIHJvdXRpbmVzLCBhY2NvcmRpbmcgdG8gQWlkbENvbnZlcnNpb24uaCBjb252ZW50aW9ucy4KK0NvbnZlcnNpb25SZXN1bHQ8c3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+PgorYWlkbDJsZWdhY3lfRGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgYWlkbCk7CitDb252ZXJzaW9uUmVzdWx0PG1lZGlhOjpBdWRpb1BvcnQ+CitsZWdhY3kyYWlkbF9EZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGxlZ2FjeSk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZjI1OGIxNC4uYmI5YTVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCmluZGV4IDE3MDlkMWUuLmJkMjRjODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWwiLAogCkBAIC0xNCwxMCArMjMsMTAgQEAKICAgICBdLAogCiAgICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsQDIuMCIsCiAgICAgICAgICJsaWJhdWRpb2hhbEA0LjAiLAogICAgICAgICAibGliYXVkaW9oYWxANS4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDYuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA3LjAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMzAsNiArMzksNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAogICAgIF0KIH0KIApAQCAtNjIsOCArNzIsNiBAQAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCiAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgc3RyZWFtIGludGVyZmFjZSBpbmNsdWRlcyBtZWRpYS9NaWNyb3Bob25lSW5mby5oCi0gICAgLy8gd2hpY2ggaXMgbm90IGluIGFueSBsaWJyYXJ5IGJ1dCBoYXMgYSBkZXBlbmRlbmN5IG9uIGhlYWRlcnMgZnJvbSBsaWJiaW5kZXIuCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmluZGVyX2hlYWRlcnMiXSwKLQotICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYmluZGVyX2hlYWRlcnMiXSwKKyAgICBoZWFkZXJfbGliczogWyJhdi1oZWFkZXJzIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJhdi1oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5jcHAKaW5kZXggNTk4NWVmMC4uZTQyMGQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMzEsMTAgKzMxLDEwIEBACiAvKiogU3VwcG9ydGVkIEhBTCB2ZXJzaW9ucywgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4KICAqLwogY29uc3QgY2hhciogc0F1ZGlvSEFMVmVyc2lvbnNbXSA9IHsKKyAgICAiNy4wIiwKICAgICAiNi4wIiwKICAgICAiNS4wIiwKICAgICAiNC4wIiwKLSAgICAiMi4wIiwKICAgICBudWxscHRyCiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKaW5kZXggMTQ1NmFiNi4uNzFiMTdlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUwpAQCAtMSwyICsxIEBACi1rcm9jYXJkQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icAppbmRleCA5NjdmYmExLi5hMmM2ZThhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKIApAQCAtMjYsNiArMzUsNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24tdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAogICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLApAQCAtNTMsMjkgKzYzLDE1IEBACiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKLSAgICBuYW1lOiAibGliYXVkaW9oYWxAMi4wIiwKLSAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0AyLjAiLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE1BSk9SX1ZFUlNJT049MiIsCi0gICAgICAgICItRE1JTk9SX1ZFUlNJT049MCIsCi0gICAgICAgICItaW5jbHVkZSBjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25NYWNyby5oIiwKLSAgICBdCi19Ci0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9oYWxANC4wIiwKICAgICBkZWZhdWx0czogWyJsaWJhdWRpb2hhbF9kZWZhdWx0Il0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A0LjAtdXRpbCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj00IiwKQEAgLTkxLDcgKzg3LDkgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDUuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wLXV0aWwiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpb0A1LjAtdXRpbCIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ETUFKT1JfVkVSU0lPTj01IiwKQEAgLTEwNyw3ICsxMDUsOSBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANi4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDYuMC11dGlsIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDYuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA2LjAtdXRpbCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDYuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDYuMC11dGlsIiwKICAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTYiLApAQCAtMTE2LDMgKzExNiwyMCBAQAogICAgIF0KIH0KIAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA3LjAiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvaGFsX2RlZmF1bHQiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDcuMC11dGlsIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEA3LjAtdXRpbCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvQDcuMC11dGlsIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTciLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAppbmRleCBlYmVkNWZkLi4zMmVhYTMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtNTAsMTIgKzUwLDIwIEBACiAgICAgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfU1VQX0VOQ0FQU1VMQVRJT05fTUVUQURBVEFfVFlQRVMpLAogICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpID09IE5PX0VSUk9SOwogCisgICAgY29uc3QgYm9vbCBrZWVwRGVsYXlWYWx1ZSA9CisgICAgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlBZGRpdGlvbmFsT3V0cHV0RGV2aWNlRGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpID09IE5PX0VSUk9SIHx8CisgICAgICAgICAgICBoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNYXhBZGRpdGlvbmFsT3V0cHV0RGV2aWNlRGVsYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpID09IE5PX0VSUk9SOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIFN0cmluZzgga2V5OwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CiAgICAgICAgIGlmICgoa2VlcEZvcm1hdFZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0KSB8fAotICAgICAgICAgICAgKGtlZXBSb3V0aW5nVmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSkgeworICAgICAgICAgICAgKGtlZXBSb3V0aW5nVmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSB8fAorICAgICAgICAgICAgKGtlZXBEZWxheVZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5KSB8fAorICAgICAgICAgICAgKGtlZXBEZWxheVZhbHVlICYmIGtleSA9PSBBdWRpb1BhcmFtZXRlcjo6a2V5TWF4QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5KSkgewogICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIga2VlcFZhbHVlUGFyYW07CiAgICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwogICAgICAgICAgICAga2VlcFZhbHVlUGFyYW0uYWRkKGtleSwgdmFsdWUpOwpAQCAtMTEyLDEyOSArMTIwLDUgQEAKICAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwogfQogCi0jaWYgTUFKT1JfVkVSU0lPTiA+PSA0Ci0vLyBUT0RPOiBVc2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGhhbCB3aGVuIGl0IG1vdmVzIHRvIGEgdXRpbCBsaWJyYXJ5Lgotc3RhdGljIHN0ZDo6c3RyaW5nIGRldmljZUFkZHJlc3NUb0hhbChjb25zdCBEZXZpY2VBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgLy8gSEFMIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzcyBpcyBOVUwtdGVybWluYXRlZC4KLSAgICBjaGFyIGhhbEFkZHJlc3NbQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTl07Ci0gICAgbWVtc2V0KGhhbEFkZHJlc3MsIDAsIHNpemVvZihoYWxBZGRyZXNzKSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGhhbERldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oYWRkcmVzcy5kZXZpY2UpOwotICAgIGlmIChnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKS5jb3VudChoYWxEZXZpY2UpID4gMCB8fAotICAgICAgICBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1swXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1sxXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1syXSwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLm1hY1szXSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s0XSwgYWRkcmVzcy5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgfSBlbHNlIGlmIChoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9JUCB8fCBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0lQKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVkLiVkLiVkLiVkIiwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMF0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzFdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFsyXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbM10pOwotICAgIH0gZWxzZSBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKS5jb3VudChoYWxEZXZpY2UpID4gMCB8fAotICAgICAgICAgICAgICAgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpLmNvdW50KGhhbERldmljZSkgPiAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwgYWRkcmVzcy5hZGRyZXNzLmFsc2EuY2FyZCwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICB9IGVsc2UgaWYgKGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUyB8fCBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JVUykgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuYnVzQWRkcmVzcy5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggfHwKLSAgICAgICAgICAgICAgIGhhbERldmljZSA9PSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlcyIsIGFkZHJlc3MuclN1Ym1peEFkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfQotICAgIHJldHVybiBoYWxBZGRyZXNzOwotfQotCi0vL2xvY2FsIGNvbnZlcnNpb24gaGVscGVycwotCi1zdGF0aWMgYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7Ci0gICAgc3dpdGNoIChtYXBwaW5nKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOwotICAgIH0KLX0KLQotc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfbG9jYXRpb25fdCBsb2NhdGlvblRvSGFsKEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uIGxvY2F0aW9uKSB7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFk6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6TUFJTkJPRFlfTU9WQUJMRToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZX01PVkFCTEU7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlBFUklQSEVSQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9QRVJJUEhFUkFMOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBsb2NhdGlvblRvSGFsIGNvbnZlcnNpb24gJWQiLCBsb2NhdGlvbik7Ci0gICAgfQotfQotc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uYWxpdHlfdCBkaXJlY3Rpb25hbGl0eVRvSGFsKEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5IGRpcikgewotICAgIHN3aXRjaCAoZGlyKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpPTU5JOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfT01OSTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6QklfRElSRUNUSU9OQUw6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9CSV9ESVJFQ1RJT05BTDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6Q0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6SFlQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9IWVBFUl9DQVJESU9JRDsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6U1VQRVJfQ0FSRElPSUQ6Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9ESVJFQ1RJT05BTElUWV9TVVBFUl9DQVJESU9JRDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gZGlyZWN0aW9uYWxpdHlUb0hhbCBjb252ZXJzaW9uICVkIiwgZGlyKTsKLSAgICB9Ci19Ci0KLXZvaWQgbWljcm9waG9uZUluZm9Ub0hhbChjb25zdCBNaWNyb3Bob25lSW5mbyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCkgewotICAgIGlmIChwRHN0ICE9IE5VTEwpIHsKLSAgICAgICAgc25wcmludGYocERzdC0+ZGV2aWNlX2lkLCBzaXplb2YocERzdC0+ZGV2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgc3JjLmRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICBwRHN0LT5kZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHNyYy5kZXZpY2VBZGRyZXNzLmRldmljZSk7Ci0gICAgICAgIHNucHJpbnRmKHBEc3QtPmFkZHJlc3MsIHNpemVvZihwRHN0LT5hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgIiVzIiwgZGV2aWNlQWRkcmVzc1RvSGFsKHNyYy5kZXZpY2VBZGRyZXNzKS5jX3N0cigpKTsKLSAgICAgICAgaWYgKHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgPiBBVURJT19DSEFOTkVMX0NPVU5UX01BWCkgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJXp1IGNoYW5uZWxNYXBwaW5nIGVsZW1lbnRzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAotICAgICAgICAgICAgICAgICAgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBjaDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSAmJiBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gY2hhbm5lbE1hcHBpbmdUb0hhbChzcmMuY2hhbm5lbE1hcHBpbmdbY2hdKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKDsgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgewotICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IEFVRElPX01JQ1JPUEhPTkVfQ0hBTk5FTF9NQVBQSU5HX1VOVVNFRDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5sb2NhdGlvbiA9IGxvY2F0aW9uVG9IYWwoc3JjLmxvY2F0aW9uKTsKLSAgICAgICAgcERzdC0+Z3JvdXAgPSAoYXVkaW9fbWljcm9waG9uZV9ncm91cF90KXNyYy5ncm91cDsKLSAgICAgICAgcERzdC0+aW5kZXhfaW5fdGhlX2dyb3VwID0gKHVuc2lnbmVkIGludClzcmMuaW5kZXhJblRoZUdyb3VwOwotICAgICAgICBwRHN0LT5zZW5zaXRpdml0eSA9IHNyYy5zZW5zaXRpdml0eTsKLSAgICAgICAgcERzdC0+bWF4X3NwbCA9IHNyYy5tYXhTcGw7Ci0gICAgICAgIHBEc3QtPm1pbl9zcGwgPSBzcmMubWluU3BsOwotICAgICAgICBwRHN0LT5kaXJlY3Rpb25hbGl0eSA9IGRpcmVjdGlvbmFsaXR5VG9IYWwoc3JjLmRpcmVjdGlvbmFsaXR5KTsKLSAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSAodW5zaWduZWQgaW50KXNyYy5mcmVxdWVuY3lSZXNwb25zZS5zaXplKCk7Ci0gICAgICAgIGlmIChwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA+IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICVkIGZyZXF1ZW5jeSByZXNwb25zZXMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcywgQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUyk7Ci0gICAgICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlczsgaysrKSB7Ci0gICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzBdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmZyZXF1ZW5jeTsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMV1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10ubGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnggPSBzcmMucG9zaXRpb24ueDsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnkgPSBzcmMucG9zaXRpb24ueTsKLSAgICAgICAgcERzdC0+Z2VvbWV0cmljX2xvY2F0aW9uLnogPSBzcmMucG9zaXRpb24uejsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueCA9IHNyYy5vcmllbnRhdGlvbi54OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi55ID0gc3JjLm9yaWVudGF0aW9uLnk7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnogPSBzcmMub3JpZW50YXRpb24uejsKLSAgICB9Ci19Ci0jZW5kaWYKLQogfSAgLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmluZGV4IGZiM2JiOWQuLjU5MTIyYzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmgKQEAgLTgyLDEyICs4Miw2IEBACiAgICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKIH07CiAKLSNpZiBNQUpPUl9WRVJTSU9OID49IDQKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87Ci12b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOwotI2VuZGlmCi0KIH0gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsSGlkbC5jcHAKaW5kZXggN2QwZDgzZC4uMDJkNjZhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwCkBAIC0xOSwyMiArMTksMjQgQEAKICNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JUHJpbWFyeURldmljZS5oKQorI2luY2x1ZGUgPEhpZGxVdGlscy5oPgogI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KIAogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCisjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkNvcmVVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiAKQEAgLTQ2LDQ3ICs0OCw2IEBACiAKIHVzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7CiAKLW5hbWVzcGFjZSB7Ci0KLXN0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7Ci0gICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKLQotICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgaWYgKGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpLmNvdW50KGRldmljZSkgPiAwCi0gICAgICAgICAgICB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSVAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9JUCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKS5jb3VudChkZXZpY2UpID4gMAotICAgICAgICAgICAgfHwgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpLmNvdW50KGRldmljZSkgPiAwKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUyB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JVUykgewotICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAotICAgICAgICAgICAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCiBEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCiAgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCiAgICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKQEAgLTIxMiw3ICsxNzMsNyBAQAogICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKICAgICBSZXN1bHQgcmV0dmFsOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCiAgICAgICAgICAgICBoaWRsQ29uZmlnLApAQCAtMjM0LDE2ICsxOTUsMjIgQEAKICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgZmFsc2UgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBDb3JlVXRpbHM6OkF1ZGlvT3V0cHV0RmxhZ3MgaGlkbEZsYWdzOworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBDb3JlVXRpbHM6OmF1ZGlvT3V0cHV0RmxhZ3NGcm9tSGFsKGZsYWdzLCAmaGlkbEZsYWdzKTsgc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorICAgICAgICAgICAgaGFuZGxlLCBoaWRsRGV2aWNlLCBoaWRsQ29uZmlnLCBoaWRsRmxhZ3MsCiAjaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiAgICAgICAgICAgICB7fSAvKiBtZXRhZGF0YSAqLywKICNlbmRpZgpAQCAtMjY5LDM5ICsyMzYsNTQgQEAKICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsIHRydWUgLyppc0lucHV0Ki8sICZoaWRsQ29uZmlnKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBDb3JlVXRpbHM6OkF1ZGlvSW5wdXRGbGFncyBoaWRsRmxhZ3M7CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA1CisgICAgLy8gU29tZSBmbGFncyB3ZXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpOworI2VuZGlmCisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6YXVkaW9JbnB1dEZsYWdzRnJvbUhhbChmbGFncywgJmhpZGxGbGFncyk7IHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCiAgICAgYXV0byBzaW5rTWV0YWRhdGEgPSBBdWRpb1NvdXJjZShzb3VyY2UpOwogI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CiAgICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQogICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKLSAgICBTaW5rTWV0YWRhdGEgc2lua01ldGFkYXRhID0ge3t7IC5zb3VyY2UgPSBBdWRpb1NvdXJjZShzb3VyY2UpLCAuZ2FpbiA9IDEgfX19OworICAgIEF1ZGlvU291cmNlIGhpZGxTb3VyY2U7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IEhpZGxVdGlsczo6YXVkaW9Tb3VyY2VGcm9tSGFsKHNvdXJjZSwgJmhpZGxTb3VyY2UpOyBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gc3RkOjptb3ZlKGhpZGxTb3VyY2UpLCAuZ2FpbiA9IDEgfX19OwogI2VuZGlmCiAjaWYgTUFKT1JfVkVSU0lPTiA8IDUKICAgICAodm9pZClvdXRwdXREZXZpY2U7CiAgICAgKHZvaWQpb3V0cHV0RGV2aWNlQWRkcmVzczsKICNlbHNlCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CisgICAgKHZvaWQpSGlkbFV0aWxzOjphdWRpb0NoYW5uZWxNYXNrRnJvbUhhbCgKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfTk9ORSwgdHJ1ZSAvKmlzSW5wdXQqLywgJnNpbmtNZXRhZGF0YS50cmFja3NbMF0uY2hhbm5lbE1hc2spOworI2VuZGlmCiAgICAgaWYgKG91dHB1dERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICBEZXZpY2VBZGRyZXNzIGhpZGxPdXRwdXREZXZpY2U7Ci0gICAgICAgIHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmhpZGxPdXRwdXREZXZpY2UpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgICAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gQ29yZVV0aWxzOjpkZXZpY2VBZGRyZXNzRnJvbUhhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmhpZGxPdXRwdXREZXZpY2UpOyBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrc1swXS5kZXN0aW5hdGlvbi5kZXZpY2Uoc3RkOjptb3ZlKGhpZGxPdXRwdXREZXZpY2UpKTsKICAgICB9CiAjZW5kaWYKLSNpZiBNQUpPUl9WRVJTSU9OIDw9IDUKLSAgICAvLyBTb21lIGZsYWdzIHdlcmUgc3BlY2lmaWMgdG8gZnJhbWV3b3JrIGFuZCBtdXN0IG5vdCBsZWFrIHRvIHRoZSBIQUwuCi0gICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyAmIH5BVURJT19JTlBVVF9GTEFHX0RJUkVDVCk7Ci0jZW5kaWYKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBFbnVtQml0ZmllbGQ8QXVkaW9JbnB1dEZsYWc+KGZsYWdzKSwKLSAgICAgICAgICAgIHNpbmtNZXRhZGF0YSwKKyAgICAgICAgICAgIGhhbmRsZSwgaGlkbERldmljZSwgaGlkbENvbmZpZywgaGlkbEZsYWdzLCBzaW5rTWV0YWRhdGEsCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CkBAIC0zNzIsNyArMzU0LDggQEAKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVsZWFzZUF1ZGlvUGF0Y2giLCBtRGV2aWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaCkpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBIYWxQb3J0Pgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0SW1wbChIYWxQb3J0ICpwb3J0KSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwogICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKQEAgLTM4OCw2ICszNzEsMzAgQEAKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwogfQogCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIHsKKyAgICByZXR1cm4gZ2V0QXVkaW9Qb3J0SW1wbChwb3J0KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSB7CisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CisgICAgcmV0dXJuIGdldEF1ZGlvUG9ydEltcGwocG9ydCk7CisjZWxzZQorICAgIHN0cnVjdCBhdWRpb19wb3J0IGF1ZGlvUG9ydCA9IHt9OworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOworICAgIGlmICghYXVkaW9fcG9wdWxhdGVfYXVkaW9fcG9ydChwb3J0LCAmYXVkaW9Qb3J0KSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBvcHVsYXRlIGxlZ2FjeSBhdWRpbyBwb3J0IGZyb20gYXVkaW9fcG9ydF92NyIpOworICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworI2VuZGlmCit9CisKIHN0YXR1c190IERldmljZUhhbEhpZGw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwogICAgIEF1ZGlvUG9ydENvbmZpZyBoaWRsQ29uZmlnOwpAQCAtNDExLDcgKzQxOCw3IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CiAgICAgICAgICAgICAvL2NvbnZlcnQKLSAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgKHZvaWQpQ29yZVV0aWxzOjptaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKICAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CiAgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKICAgICAgICAgfQpAQCAtNDU2LDYgKzQ2MywxOCBAQAogICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisKKyAgICAvLyBUT0RPKGIvMTExOTk3ODY3LCBiLzE3NzI3MTk1OCkgIFdvcmthcm91bmQgLSByZW1vdmUgd2hlbiBmaXhlZC4KKyAgICAvLyBBIEJpbmRlciB0cmFuc21pdHRlZCBmZCBtYXkgbm90IGNsb3NlIGltbWVkaWF0ZWx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uIGIvMTExOTk3ODY3CisgICAgLy8gd2hlbiB0aGUgcmVtb3RlIGJpbmRlciB0aHJlYWQgcmVtb3ZlcyB0aGUgbGFzdCByZWZjb3VudCB0byB0aGUgZmQgYmxvY2tzIGluIHRoZQorICAgIC8vIGtlcm5lbCBmb3IgYmluZGVyIGFjdGl2aXR5LiBXZSBzZW5kIGEgQmluZGVyIHBpbmcoKSBjb21tYW5kIHRvIHVuYmxvY2sgdGhlIHRocmVhZAorICAgIC8vIGFuZCBjb21wbGV0ZSB0aGUgZmQgY2xvc2UgLyByZWxlYXNlLgorICAgIC8vCisgICAgLy8gU2VlIERldmljZUhhbEhpZGw6OmR1bXAoKSwgRWZmZWN0SGFsSGlkbDo6ZHVtcCgpLCBTdHJlYW1IYWxIaWRsOjpkdW1wKCksCisgICAgLy8gICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoKS4KKworICAgICh2b2lkKW1EZXZpY2UtPnBpbmcoKTsgLy8gc3luY2hyb25vdXMgQmluZGVyIGNhbGwKKwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAppbmRleCBkMzQyZDRhLi4yYzg0N2NmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CiAKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKKwogICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCkBAIC0xMjgsNiArMTMxLDggQEAKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCiAgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbFBvcnQ+IHN0YXR1c190IGdldEF1ZGlvUG9ydEltcGwoSGFsUG9ydCAqcG9ydCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcAppbmRleCA4MDIxZDkyLi5hZjdkYzFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmNwcApAQCAtMTgwLDYgKzE4MCwyMiBAQAogICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKIH0KIAorc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgeworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICAvLyBnZXRfYXVkaW9fcG9ydF92NyBpcyBtYW5kYXRvcnkgaWYgbGVnYWN5IEhBTCBzdXBwb3J0IHRoaXMgQVBJIHZlcnNpb24uCisgICAgICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydF92NyhtRGV2LCBwb3J0KTsKKyAgICB9CisjZW5kaWYKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQgPSB7fTsKKyAgICBhdWRpb19wb3B1bGF0ZV9hdWRpb19wb3J0KHBvcnQsICZhdWRpb1BvcnQpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGF1ZGlvX3BvcHVsYXRlX2F1ZGlvX3BvcnRfdjcoJmF1ZGlvUG9ydCwgcG9ydCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKICAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApCiAgICAgICAgIHJldHVybiBtRGV2LT5zZXRfYXVkaW9fcG9ydF9jb25maWcobURldiwgY29uZmlnKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuaAppbmRleCBkODVlMmE3Li40NmI1MTBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCkBAIC0xMDAsNiArMTAwLDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKIAorICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOworCiAgICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKQEAgLTExNCw2ICsxMTcsOCBAQAogICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOwogICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOwogCisgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9CisKICAgcHJpdmF0ZToKICAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKIApAQCAtMTI0LDggKzEyOSw2IEBACiAKICAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgogICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcAppbmRleCBjYWY1NzVjLi41MWFkMTQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5jcHAKQEAgLTIzLDEyICsyMywxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDx1dGlsL0VmZmVjdFV0aWxzLmg+CisKICNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkVmZmVjdFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwpAQCAtNDIsNiArNDMsMTAgQEAKIAogRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKICAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgeworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgaGFsRGVzY3JpcHRvcnt9OworICAgIGlmIChFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKCZoYWxEZXNjcmlwdG9yKSA9PSBOT19FUlJPUikgeworICAgICAgICBtSXNJbnB1dCA9IChoYWxEZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzsKKyAgICB9CiB9CiAKIEVmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgewpAQCAtNTYsNTkgKzYxLDYgQEAKIH0KIAogLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gRW51bUJpdGZpZWxkPEF1ZGlvQ2hhbm5lbE1hc2s+KGhhbENvbmZpZy5jaGFubmVscyk7Ci0gICAgY29uZmlnLT5mb3JtYXQgPSBBdWRpb0Zvcm1hdChoYWxDb25maWcuZm9ybWF0KTsKLSAgICBjb25maWctPmFjY2Vzc01vZGUgPSBFZmZlY3RCdWZmZXJBY2Nlc3MoaGFsQ29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGNvbmZpZy0+bWFzayA9IEVudW1CaXRmaWVsZDxFZmZlY3RDb25maWdQYXJhbWV0ZXJzPihoYWxDb25maWcubWFzayk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKSB7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIuZnJhbWVDb3VudCA9IDA7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXIucmF3ID0gTlVMTDsKLSAgICBoYWxDb25maWctPnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGluZ1JhdGVIejsKLSAgICBoYWxDb25maWctPmNoYW5uZWxzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbmZpZy5jaGFubmVscyk7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+Zm9ybWF0ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmZvcm1hdCk7Ci0gICAgaGFsQ29uZmlnLT5hY2Nlc3NNb2RlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLmFjY2Vzc01vZGUpOwotICAgIGhhbENvbmZpZy0+bWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ0Zyb21IYWwoY29uc3QgZWZmZWN0X2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdENvbmZpZyogY29uZmlnKSB7Ci0gICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcuaW5wdXRDZmcsICZjb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5vdXRwdXRDZmcsICZjb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdUb0hhbChjb25zdCBFZmZlY3RDb25maWcmIGNvbmZpZywgZWZmZWN0X2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcuaW5wdXRDZmcsICZoYWxDb25maWctPmlucHV0Q2ZnKTsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdUb0hhbChjb25maWcub3V0cHV0Q2ZnLCAmaGFsQ29uZmlnLT5vdXRwdXRDZmcpOwotfQotCi0vLyBzdGF0aWMKIHN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKICAgICBzd2l0Y2ggKHJlc3VsdCkgewogICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKQEAgLTI2OSw3ICsyMjEsNyBAQAogICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdFV0aWxzOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CkBAIC0yODcsNiArMjM5LDE4IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKworICAgIC8vIFRPRE8oYi8xMTE5OTc4NjcsIGIvMTc3MjcxOTU4KSAgV29ya2Fyb3VuZCAtIHJlbW92ZSB3aGVuIGZpeGVkLgorICAgIC8vIEEgQmluZGVyIHRyYW5zbWl0dGVkIGZkIG1heSBub3QgY2xvc2UgaW1tZWRpYXRlbHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24gYi8xMTE5OTc4NjcKKyAgICAvLyB3aGVuIHRoZSByZW1vdGUgYmluZGVyIHRocmVhZCByZW1vdmVzIHRoZSBsYXN0IHJlZmNvdW50IHRvIHRoZSBmZCBibG9ja3MgaW4gdGhlCisgICAgLy8ga2VybmVsIGZvciBiaW5kZXIgYWN0aXZpdHkuIFdlIHNlbmQgYSBCaW5kZXIgcGluZygpIGNvbW1hbmQgdG8gdW5ibG9jayB0aGUgdGhyZWFkCisgICAgLy8gYW5kIGNvbXBsZXRlIHRoZSBmZCBjbG9zZSAvIHJlbGVhc2UuCisgICAgLy8KKyAgICAvLyBTZWUgRGV2aWNlSGFsSGlkbDo6ZHVtcCgpLCBFZmZlY3RIYWxIaWRsOjpkdW1wKCksIFN0cmVhbUhhbEhpZGw6OmR1bXAoKSwKKyAgICAvLyAgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cygpLgorCisgICAgKHZvaWQpbUVmZmVjdC0+cGluZygpOyAvLyBzeW5jaHJvbm91cyBCaW5kZXIgY2FsbAorCiAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBPSyA6IEZBSUxFRF9UUkFOU0FDVElPTjsKIH0KIApAQCAtMzAxLDE0ICsyNjUsMTYgQEAKICAgICAgICAgcmV0ID0gbUVmZmVjdC0+Z2V0Q29uZmlnKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewogICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKICAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICAgICAgRWZmZWN0VXRpbHM6OmVmZmVjdENvbmZpZ1RvSGFsKAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewogICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKICAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICAgICAgRWZmZWN0VXRpbHM6OmVmZmVjdENvbmZpZ1RvSGFsKAorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICB9CkBAIC0zMzIsNyArMjk4LDcgQEAKICAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKICAgICB9CiAgICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgRWZmZWN0VXRpbHM6OmVmZmVjdENvbmZpZ0Zyb21IYWwoKmhhbENvbmZpZywgbUlzSW5wdXQsICZoaWRsQ29uZmlnKTsKICAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyA/CiAgICAgICAgICAgICBtRWZmZWN0LT5zZXRDb25maWcoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cikgOgogICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnUmV2ZXJzZShoaWRsQ29uZmlnLCBudWxscHRyLCBudWxscHRyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKaW5kZXggMWYyMzhjMC4uOGU0NjYzOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKQEAgLTY1LDkgKzY1LDYgQEAKIAogICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9CiAKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQogICBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7CiAgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVzdWx0LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CkBAIC03OSwxNCArNzYsOSBAQAogICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwogICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisgICAgYm9vbCBtSXNJbnB1dCA9IGZhbHNlOwogCiAgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKIAogICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAppbmRleCA5MTkyYTMxLi5mMDQyYjkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0xOSwxMyArMTksMTYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAKKyNpbmNsdWRlIDxVdWlkVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlsL0VmZmVjdFV0aWxzLmg+CisKICNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCiAjaW5jbHVkZSAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpVdWlkVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkVmZmVjdFV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zNyw3ICs0MCw3IEBACiAKIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNwPElFZmZlY3RzRmFjdG9yeT4gZWZmZWN0c0ZhY3RvcnkpCiAgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIEFMT0dfQVNTRVJUKGVmZmVjdHNGYWN0b3J5ICE9IG51bGxwdHIsICJQcm92aWRlZCBJRGV2aWNlc0ZhY3Rvcnkgc2VydmljZSBpcyBOVUxMIik7CisgICAgQUxPR19BU1NFUlQoZWZmZWN0c0ZhY3RvcnkgIT0gbnVsbHB0ciwgIlByb3ZpZGVkIElFZmZlY3RzRmFjdG9yeSBzZXJ2aWNlIGlzIE5VTEwiKTsKICAgICBtRWZmZWN0c0ZhY3RvcnkgPSBlZmZlY3RzRmFjdG9yeTsKIH0KIApAQCAtNzYsNyArNzksNyBAQAogICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKICAgICB9CiAgICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7CisgICAgRWZmZWN0VXRpbHM6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtODUsMTMgKzg4LDEzIEBACiAgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwogICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgVXVpZFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CiAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCiAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgewogICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CiAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgRWZmZWN0VXRpbHM6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICBpZiAocmV0LmlzT2soKSkgewpAQCAtMTA3LDcgKzExMCw3IEBACiAgICAgICAgIGludDMyX3QgZGV2aWNlSWQgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgewogICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBVdWlkVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldDsKICNpZiBNQUpPUl9WRVJTSU9OID49IDYKQEAgLTE0Niw2ICsxNDksMTggQEAKICAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CiAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisKKyAgICAvLyBUT0RPKGIvMTExOTk3ODY3LCBiLzE3NzI3MTk1OCkgIFdvcmthcm91bmQgLSByZW1vdmUgd2hlbiBmaXhlZC4KKyAgICAvLyBBIEJpbmRlciB0cmFuc21pdHRlZCBmZCBtYXkgbm90IGNsb3NlIGltbWVkaWF0ZWx5IGR1ZSB0byBhIHJhY2UgY29uZGl0aW9uIGIvMTExOTk3ODY3CisgICAgLy8gd2hlbiB0aGUgcmVtb3RlIGJpbmRlciB0aHJlYWQgcmVtb3ZlcyB0aGUgbGFzdCByZWZjb3VudCB0byB0aGUgZmQgYmxvY2tzIGluIHRoZQorICAgIC8vIGtlcm5lbCBmb3IgYmluZGVyIGFjdGl2aXR5LiBXZSBzZW5kIGEgQmluZGVyIHBpbmcoKSBjb21tYW5kIHRvIHVuYmxvY2sgdGhlIHRocmVhZAorICAgIC8vIGFuZCBjb21wbGV0ZSB0aGUgZmQgY2xvc2UgLyByZWxlYXNlLgorICAgIC8vCisgICAgLy8gU2VlIERldmljZUhhbEhpZGw6OmR1bXAoKSwgRWZmZWN0SGFsSGlkbDo6ZHVtcCgpLCBTdHJlYW1IYWxIaWRsOjpkdW1wKCksCisgICAgLy8gICAgIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoKS4KKworICAgICh2b2lkKW1FZmZlY3RzRmFjdG9yeS0+cGluZygpOyAvLyBzeW5jaHJvbm91cyBCaW5kZXIgY2FsbAorCiAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaAppbmRleCBkZWNlMWJiLi41ZmE4NWU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKIAorICAgIHZpcnR1YWwgZmxvYXQgZ2V0SGFsVmVyc2lvbigpIHsgcmV0dXJuIE1BSk9SX1ZFUlNJT04gKyAoZmxvYXQpTUlOT1JfVkVSU0lPTiAvIDEwOyB9CisKICAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9QYXJhbWV0ZXJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWI3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1BhcmFtZXRlclV0aWxzLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworbmFtZXNwYWNlIHV0aWxzIHsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwCmluZGV4IDI3MjZlMzYuLjEyOWIxYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMTcsMTcgKzE3LDIzIEBACiAjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8SGlkbFV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbC9Db3JlVXRpbHMuaD4KKwogI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKICNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiUGFyYW1ldGVyVXRpbHMuaCIKICNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCiAKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6Q29yZVV0aWxzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CkBAIC00OSwyNCArNTUsMTcgQEAKIAogICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCiAgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyIC8qICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSAqLykgewotICAgICAgICAvLyBPYnRhaW4gYXVkaW8gcHJvcGVydGllcyAoc2VlIFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygpIGJlbG93KS4KLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgICAgICBbJl0oYXV0byBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChzciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKSk7Ci0gICAgICAgICAgICB9KTsKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgIGlmICgvKiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgJiYgKi8KKyAgICAgICAgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZjb25maWcpID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmNoYW5uZWxfbWFzaywgY29uZmlnLmZvcm1hdCk7CiAgICAgfQogfQogCiBTdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKLSAgICBtU3RyZWFtID0gbnVsbHB0cjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOworICAgIC8vIFRoZSBsYXN0IHN0ZXAgaXMgdG8gZmx1c2ggYWxsIGJpbmRlciBjb21tYW5kcyBzbyB0aGF0IHRoZSBkZWxldGlvbgorICAgIC8vIG9mIElTdHJlYW1JbiAvIElTdHJlYW1PdXQgKG1TdHJlYW0pIGlzIGlzc3VlZCB3aXRoIGxlc3MgZGVsYXkuIFNlZSBiLzM1Mzk0NjI5LgorICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiB9CiAKIHN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CkBAIC03OCwyNiArNzcsMzMgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgeworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZ0Jhc2UpIHsKKyAgICAqY29uZmlnQmFzZSA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwogICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyNpZiBNQUpPUl9WRVJTSU9OIDw9IDYKICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAogICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7Ci0gICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKKyAgICAgICAgICAgICAgICBjb25maWdCYXNlLT5zYW1wbGVfcmF0ZSA9IHNyOworICAgICAgICAgICAgICAgIGNvbmZpZ0Jhc2UtPmNoYW5uZWxfbWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtKTsKKyAgICAgICAgICAgICAgICBjb25maWdCYXNlLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CiAgICAgICAgICAgICB9KTsKICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKKyNlbHNlCisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBzdGF0dXNfdCBjb252ZXJzaW9uU3RhdHVzID0gQkFEX1ZBTFVFOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvblN0YXR1cyA9IEhpZGxVdGlsczo6YXVkaW9Db25maWdCYXNlVG9IYWwoY29uZmlnLCBjb25maWdCYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0LCByZXR2YWwpOyBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnNpb25TdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisjZW5kaWYKIH0KIAogc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CkBAIC0xNTIsNiArMTU4LDE4IEBACiAgICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwogICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKKworICAgIC8vIFRPRE8oYi8xMTE5OTc4NjcsIGIvMTc3MjcxOTU4KSAgV29ya2Fyb3VuZCAtIHJlbW92ZSB3aGVuIGZpeGVkLgorICAgIC8vIEEgQmluZGVyIHRyYW5zbWl0dGVkIGZkIG1heSBub3QgY2xvc2UgaW1tZWRpYXRlbHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24gYi8xMTE5OTc4NjcKKyAgICAvLyB3aGVuIHRoZSByZW1vdGUgYmluZGVyIHRocmVhZCByZW1vdmVzIHRoZSBsYXN0IHJlZmNvdW50IHRvIHRoZSBmZCBibG9ja3MgaW4gdGhlCisgICAgLy8ga2VybmVsIGZvciBiaW5kZXIgYWN0aXZpdHkuIFdlIHNlbmQgYSBCaW5kZXIgcGluZygpIGNvbW1hbmQgdG8gdW5ibG9jayB0aGUgdGhyZWFkCisgICAgLy8gYW5kIGNvbXBsZXRlIHRoZSBmZCBjbG9zZSAvIHJlbGVhc2UuCisgICAgLy8KKyAgICAvLyBTZWUgRGV2aWNlSGFsSGlkbDo6ZHVtcCgpLCBFZmZlY3RIYWxIaWRsOjpkdW1wKCksIFN0cmVhbUhhbEhpZGw6OmR1bXAoKSwKKyAgICAvLyAgICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cygpLgorCisgICAgKHZvaWQpbVN0cmVhbS0+cGluZygpOyAvLyBzeW5jaHJvbm91cyBCaW5kZXIgY2FsbAorCiAgICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwogICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKIH0KQEAgLTIyNSw2ICsyNDMsMjQgQEAKICAgICByZXR1cm4gZ2V0QnVmZmVyU2l6ZShzaXplKTsKIH0KIAorc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0SGFsUGlkKHBpZF90ICpwaWQpIHsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OkRlYnVnSW5mbzsKKyAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKKworICAgIERlYnVnSW5mbyBkZWJ1Z0luZm87CisgICAgYXV0byByZXQgPSBtU3RyZWFtLT5nZXREZWJ1Z0luZm8oWyZdIChjb25zdCBhdXRvICZpbmZvKSB7CisgICAgICAgIGRlYnVnSW5mbyA9IGluZm87CisgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKGRlYnVnSW5mby5waWQgIT0gKGludClJU2VydmljZU1hbmFnZXI6OlBpZENvbnN0YW50OjpOT19QSUQpIHsKKyAgICAgICAgKnBpZCA9IGRlYnVnSW5mby5waWQ7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCiBib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7CiAgICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0yODUsNyArMzIxLDcgQEAKICAgICB9CiAKICAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworICAgIGNvbnN0IHdwPFN0cmVhbU91dEhhbEhpZGw+IG1TdHJlYW07CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTI5NiwyMSArMzMyLDE5IEBACiAKIFN0cmVhbU91dEhhbEhpZGw6On5TdHJlYW1PdXRIYWxIaWRsKCkgewogICAgIGlmIChtU3RyZWFtICE9IDApIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKKyAgICAgICAgaWYgKG1DYWxsYmFjay5sb2FkKCkudW5zYWZlX2dldCgpKSB7CiAgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKICAgICAgICAgfQogI2lmIE1BSk9SX1ZFUlNJT04gPj0gNgotICAgICAgICBpZiAobUV2ZW50Q2FsbGJhY2sudW5zYWZlX2dldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrLmxvYWQoKS51bnNhZmVfZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgcHJvY2Vzc1JldHVybigic2V0RXZlbnRDYWxsYmFjayIsCiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW0tPnNldEV2ZW50Q2FsbGJhY2sobnVsbHB0cikpOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwogICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgbUNhbGxiYWNrID0gbnVsbHB0cjsKKyAgICBtRXZlbnRDYWxsYmFjayA9IG51bGxwdHI7CiAgICAgaWYgKG1FZkdyb3VwKSB7CiAgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CiAgICAgfQpAQCAtMzYzLDcgKzM5Nyw3IEBACiAKICAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgewogICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCi0gICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2subG9hZCgpLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTQ1Myw3ICs0ODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBoYWxUaHJlYWRJbmZvKSB7CiAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKICAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwpAQCAtNDYyLDggKzQ5NiwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwogICAgICAgICAgICAgICAgICAgICB9CisjaWYgTUFKT1JfVkVSU0lPTiA8PSA2CiAgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOwogICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm87CisjZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKICAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKQEAgLTQ4NCw2ICs1MjIsMTEgQEAKICAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNworICAgIGlmIChzdGF0dXNfdCBzdGF0dXMgPSBnZXRIYWxQaWQoJmhhbFRocmVhZFBpZCk7IHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbmRpZgogICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CiAKICAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwpAQCAtNTk3LDMxICs2NDAsNDUgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKLS8qKiBUcmFuc2Zvcm0gYSBzdGFuZGFyZCBjb2xsZWN0aW9uIHRvIGFuIEhJREwgdmVjdG9yLiAqLwotdGVtcGxhdGUgPGNsYXNzIFZhbHVlcywgY2xhc3MgRWxlbWVudENvbnZlcnRlcj4KLXN0YXRpYyBhdXRvIHRyYW5zZm9ybVRvSGlkbFZlYyhjb25zdCBWYWx1ZXMmIHZhbHVlcywgRWxlbWVudENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICBoaWRsX3ZlYzxkZWNsdHlwZShjb252ZXJ0ZXIoKnZhbHVlcy5iZWdpbigpKSk+IHJlc3VsdHt2YWx1ZXMuc2l6ZSgpfTsKLSAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotICAgIHRyYW5zZm9ybShiZWdpbih2YWx1ZXMpLCBlbmQodmFsdWVzKSwgYmVnaW4ocmVzdWx0KSwgY29udmVydGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YSgKICAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKLSAgICBDUFBfVkVSU0lPTjo6U291cmNlTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc291cmNlTWV0YWRhdGEudHJhY2tzLAotICAgICAgICAgICAgICBbXShjb25zdCBwbGF5YmFja190cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFBsYXliYWNrVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAudXNhZ2U9c3RhdGljX2Nhc3Q8QXVkaW9Vc2FnZT4obWV0YWRhdGEudXNhZ2UpLAotICAgICAgICAgICAgICAgICAgICAuY29udGVudFR5cGU9c3RhdGljX2Nhc3Q8QXVkaW9Db250ZW50VHlwZT4obWV0YWRhdGEuY29udGVudF90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU291cmNlTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworICAgIENQUF9WRVJTSU9OOjpTb3VyY2VNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c291cmNlTWV0YWRhdGFGcm9tSGFsVjcoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGFkYXRhLnRyYWNrcywgdHJ1ZSAvKmlnbm9yZU5vblZlbmRvclRhZ3MqLywgJmhpZGxNZXRhZGF0YSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGlkbE1ldGFkYXRhKSk7CiB9CiAjZW5kaWYKIAogI2lmIE1BSk9SX1ZFUlNJT04gPCA2CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgIGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRFdmVudENhbGxiYWNrKAogICAgICAgICBjb25zdCBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VFdmVudENhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKICAgICAvLyBDb2RlYyBmb3JtYXQgY2FsbGJhY2sgaXMgc3VwcG9ydGVkIHN0YXJ0aW5nIGZyb20gYXVkaW8gSEFMIFY2LjAKQEAgLTYyOSw2ICs2ODYsNzMgQEAKIH0KICNlbHNlCiAKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0RHVhbE1vbm9Nb2RlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBEdWFsTW9ub01vZGUgaGlkbE1vZGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbW9kZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2R1YWxfbW9ub19tb2RlX3Q+KGhpZGxNb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RHVhbE1vbm9Nb2RlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0RHVhbE1vbm9Nb2RlIiwgbVN0cmVhbS0+c2V0RHVhbE1vbm9Nb2RlKHN0YXRpY19jYXN0PER1YWxNb25vTW9kZT4obW9kZSkpKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCBoaWRsTGV2ZWxkQikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpsZXZlbGRCID0gaGlkbExldmVsZEI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwiLCBtU3RyZWFtLT5zZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgUGxheWJhY2tSYXRlIGhpZGxQbGF5YmFja1JhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCA9IGhpZGxQbGF5YmFja1JhdGUuc3BlZWQ7CisgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoID0gaGlkbFBsYXliYWNrUmF0ZS5waXRjaDsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tU3RyZXRjaE1vZGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fdGltZXN0cmV0Y2hfc3RyZXRjaF9tb2RlX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxQbGF5YmFja1JhdGUudGltZXN0cmV0Y2hNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tRmFsbGJhY2tNb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbFBsYXliYWNrUmF0ZS5mYWxsYmFja01vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCisgICAgICAgICAgICAic2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyIsIG1TdHJlYW0tPnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgUGxheWJhY2tSYXRle3BsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoTW9kZT4ocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRpbWVzdHJldGNoRmFsbGJhY2tNb2RlPihwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSl9KSk7Cit9CisKICNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dEV2ZW50Q2FsbGJhY2suaCkKIAogbmFtZXNwYWNlIHsKQEAgLTY2NiwyOCArNzkwLDI4IEBACiAjZW5kaWYKIAogdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbldyaXRlUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwogICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uV3JpdGVSZWFkeSIpOwogICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKIH0KIAogdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkRyYWluUmVhZHkoKSB7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOwogICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRHJhaW5SZWFkeSIpOwogICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKIH0KIAogdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkVycm9yKCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvYWQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKICAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkVycm9yIik7CiAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKIH0KIAogdm9pZCBTdHJlYW1PdXRIYWxIaWRsOjpvbkNvZGVjRm9ybWF0Q2hhbmdlZChjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzx1aW50OF90PiYgbWV0YWRhdGFCcykgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IGNhbGxiYWNrID0gbUV2ZW50Q2FsbGJhY2sucHJvbW90ZSgpOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IGNhbGxiYWNrID0gbUV2ZW50Q2FsbGJhY2subG9hZCgpLnByb21vdGUoKTsKICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgcmV0dXJuOwogICAgIEFMT0dWKCJhc3luY0NvZGVjRm9ybWF0Q2FsbGJhY2sgJXMiLCBfX2Z1bmNfXyk7CiAgICAgY2FsbGJhY2stPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKG1ldGFkYXRhQnMpOwpAQCAtNzAxLDggKzgyNSw2IEBACiBTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CiAgICAgaWYgKG1TdHJlYW0gIT0gMCkgewogICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAgICAgfQogICAgIGlmIChtRWZHcm91cCkgewogICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwpAQCAtNzk3LDcgKzkxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8mIGhhbFRocmVhZEluZm8pIHsKICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwogICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewogICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CkBAIC04MDYsOCArOTI4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyNpZiBNQUpPUl9WRVJTSU9OIDw9IDYKICAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CiAgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mbzsKKyNlbmRpZgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewpAQCAtODI4LDYgKzk1NCwxMSBAQAogICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IGdldEhhbFBpZCgmaGFsVGhyZWFkUGlkKTsgc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorI2VuZGlmCiAgICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKIAogICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7CkBAIC04OTAsNyArMTAyMSw3IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CiAgICAgICAgICAgICAvLyBjb252ZXJ0Ci0gICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgICh2b2lkKUNvcmVVdGlsczo6bWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7CiAgICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwogICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7CiAgICAgICAgIH0KQEAgLTkwMCwxNSArMTAzMSwxMyBAQAogCiBzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdAogICAgICAgICBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBDUFBfVkVSU0lPTjo6U2lua01ldGFkYXRhIGhhbE1ldGFkYXRhID0gewotICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNpbmtNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHJlY29yZF90cmFja19tZXRhZGF0YSYgbWV0YWRhdGEpIC0+IFJlY29yZFRyYWNrTWV0YWRhdGEgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKLSAgICAgICAgICAgICAgICAgICAgLnNvdXJjZT1zdGF0aWNfY2FzdDxBdWRpb1NvdXJjZT4obWV0YWRhdGEuc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgLmdhaW49bWV0YWRhdGEuZ2FpbiwKLSAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgIH0pfTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7CisgICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKHN0YXR1c190IHN0YXR1cyA9IENvcmVVdGlsczo6c2lua01ldGFkYXRhRnJvbUhhbFY3KAorICAgICAgICAgICAgICAgICAgICBzaW5rTWV0YWRhdGEudHJhY2tzLCB0cnVlIC8qaWdub3JlTm9uVmVuZG9yVGFncyovLCAmaGlkbE1ldGFkYXRhKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigidXBkYXRlU2lua01ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKGhpZGxNZXRhZGF0YSkpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKaW5kZXggODhmODU4Ny4uOTcwOTAzYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU3luY2hyb25pemF0aW9uLmg+CiAKICNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgogI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCkBAIC00OCwyMSArNDksMTQgQEAKIGNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAogewogICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KICAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwogCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworICAgIC8vIFJldHVybiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzdHJlYW06CisgICAgLy8gICAtIGNoYW5uZWwgbWFzazsKKyAgICAvLyAgIC0gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAvLyAgIC0gc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKTsKIAogICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CkBAIC0xMDAsMTEgKzk0LDEyIEBACiAgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCiAgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwogCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisgICAgflN0cmVhbUhhbEhpZGwoKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKIAorICAgIHN0YXR1c190IGdldEhhbFBpZChwaWRfdCAqcGlkKTsKKwogICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwogCiAgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgpAQCAtMTEyLDcgKzEwNyw3IEBACiAKICAgcHJpdmF0ZToKICAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBJU3RyZWFtICogY29uc3QgbVN0cmVhbTsKICAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwogICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKIH07CkBAIC0xNzMsNiArMTY4LDI0IEBACiAgICAgdm9pZCBvbkRyYWluUmVhZHkoKTsKICAgICB2b2lkIG9uRXJyb3IoKTsKIAorICAgIC8vIFJldHVybnMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBzZXR0aW5nLgorICAgIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIER1YWwgTW9ubyBtb2RlIHByZXNlbnRhdGlvbiBvbiB0aGUgb3V0cHV0IGRldmljZS4KKyAgICBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KKyAgICBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpIG92ZXJyaWRlOworCisgICAgLy8gU2V0cyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgorICAgIHN0YXR1c190IHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSBvdmVycmlkZTsKKworICAgIC8vIFJldHJpZXZlcyBjdXJyZW50IHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycy4KKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKKworICAgIC8vIFNldHMgdGhlIHBsYXliYWNrIHJhdGUgcGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgcGxheWJhY2sgYmVoYXZpb3IuCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7CisKICAgICBzdGF0dXNfdCBzZXRFdmVudENhbGxiYWNrKGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgb3ZlcnJpZGU7CiAKICAgICAvLyBNZXRob2RzIHVzZWQgYnkgU3RyZWFtQ29kZWNGb3JtYXRDYWxsYmFjayAoSElETCkuCkBAIC0xODQsOSArMTk3LDkgQEAKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwogICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFdyaXRlU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CiAKLSAgICB3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gbUNhbGxiYWNrOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IG1FdmVudENhbGxiYWNrOwotICAgIHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07CisgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+IG1FdmVudENhbGxiYWNrOworICAgIGNvbnN0IHNwPElTdHJlYW1PdXQ+IG1TdHJlYW07CiAgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROwogICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwpAQCAtMjQyLDcgKzI1NSw3IEBACiAgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKICAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CiAKLSAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07CisgICAgY29uc3Qgc3A8SVN0cmVhbUluPiBtU3RyZWFtOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CiAgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKaW5kZXggNjliZTMwMy4uMzRiZDVkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTE3LDEzICsxNywxNCBAQAogI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxMb2NhbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJQYXJhbWV0ZXJVdGlscy5oIgogI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CkBAIC00NSwzMSArNDYsMTUgQEAKICAgICBtRGV2aWNlLmNsZWFyKCk7CiB9CiAKLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKICAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSkgeworICAgIGNvbmZpZ0Jhc2UtPnNhbXBsZV9yYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIGNvbmZpZ0Jhc2UtPmNoYW5uZWxfbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICBjb25maWdCYXNlLT5mb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjQxLDE5ICsyMjYsNTUgQEAKICAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7CiB9CiAKK3ZvaWQgU3RyZWFtT3V0SGFsTG9jYWw6OmRvVXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgc3RkOjp2ZWN0b3I8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGE+IGhhbFRyYWNrczsKKyAgICBoYWxUcmFja3MucmVzZXJ2ZShzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8mIG1ldGFkYXRhIDogc291cmNlTWV0YWRhdGEudHJhY2tzKSB7CisgICAgICAgIHBsYXliYWNrX3RyYWNrX21ldGFkYXRhIGhhbFRyYWNrTWV0YWRhdGE7CisgICAgICAgIHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX2Zyb21fdjcoJmhhbFRyYWNrTWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgIGhhbFRyYWNrcy5wdXNoX2JhY2soaGFsVHJhY2tNZXRhZGF0YSk7CisgICAgfQorICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tfY291bnQgPSBoYWxUcmFja3Muc2l6ZSgpLAorICAgICAgICAudHJhY2tzID0gaGFsVHJhY2tzLmRhdGEoKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJmhhbE1ldGFkYXRhKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNwordm9pZCBTdHJlYW1PdXRIYWxMb2NhbDo6ZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV92N190IG1ldGFkYXRhIHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Y3Kj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhX3Y3KG1TdHJlYW0sICZtZXRhZGF0YSk7Cit9CisjZW5kaWYKKwogc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgeworI2lmIE1BSk9SX1ZFUlNJT04gPCA3CiAgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YShzb3VyY2VNZXRhZGF0YSk7CisjZWxzZQorICAgIGlmIChtRGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhKHNvdXJjZU1ldGFkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YV92NyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgZG9VcGRhdGVTb3VyY2VNZXRhZGF0YVY3KHNvdXJjZU1ldGFkYXRhKTsKKyAgICB9CisjZW5kaWYKICAgICByZXR1cm4gT0s7CiB9CiAKKwogc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewogICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwpAQCAtMjc1LDYgKzI5NiwzNiBAQAogICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7CiB9CiAKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfZHVhbF9tb25vX21vZGUgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfZHVhbF9tb25vX21vZGUobVN0cmVhbSwgbW9kZSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9kdWFsX21vbm9fbW9kZSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9kdWFsX21vbm9fbW9kZShtU3RyZWFtLCBtb2RlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2F1ZGlvX2Rlc2NyaXB0aW9uX21peF9sZXZlbChtU3RyZWFtLCBsZXZlbGRCKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9hdWRpb19kZXNjcmlwdGlvbl9taXhfbGV2ZWwgPT0gbnVsbHB0cikgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfYXVkaW9fZGVzY3JpcHRpb25fbWl4X2xldmVsKG1TdHJlYW0sIGxldmVsZEIpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhhdWRpb19wbGF5YmFja19yYXRlX3QqIHBsYXliYWNrUmF0ZSkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyhtU3RyZWFtLCBwbGF5YmFja1JhdGUpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfcGxheWJhY2tfcmF0ZV9wYXJhbWV0ZXJzID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BsYXliYWNrX3JhdGVfcGFyYW1ldGVycyhtU3RyZWFtLCAmcGxheWJhY2tSYXRlKTsKK30KKwogc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldEV2ZW50Q2FsbGJhY2soCiAgICAgICAgIGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgewogICAgIGlmIChtU3RyZWFtLT5zZXRfZXZlbnRfY2FsbGJhY2sgPT0gbnVsbHB0cikgewpAQCAtMzAzLDcgKzM1NCwxMSBAQAogICAgIGlmIChjYWxsYmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgICAgIGNhc2UgU1RSRUFNX0VWRU5UX0NCS19UWVBFX0NPREVDX0ZPUk1BVF9DSEFOR0VEOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKHN0ZDo6YmFzaWNfc3RyaW5nPHVpbnQ4X3Q+KCh1aW50OF90KilwYXJhbSkpOworICAgICAgICAgICAgLy8gdm9pZCogcGFyYW0gaXMgdGhlIGJ5dGUgc3RyaW5nIGJ1ZmZlciBmcm9tIGJ5dGVfc3RyaW5nX2Zyb21fYXVkaW9fbWV0YWRhdGEoKS4KKyAgICAgICAgICAgIC8vIEFzIHRoZSBieXRlIHN0cmluZyBidWZmZXIgbWF5IGhhdmUgZW1iZWRkZWQgemVyb2VzLCB3ZSBjYW5ub3QgdXNlIHN0cmxlbigpCisgICAgICAgICAgICBjYWxsYmFjay0+b25Db2RlY0Zvcm1hdENoYW5nZWQoc3RkOjpiYXNpY19zdHJpbmc8dWludDhfdD4oCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXRpbHM6Om1ldGFkYXRhOjpkYXRhQnl0ZVN0cmluZ0xlbigoY29uc3QgdWludDhfdCopcGFyYW0pKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCIlcyB1bmtub3duIGV2ZW50ICVkIiwgX19mdW5jX18sIGV2ZW50KTsKQEAgLTM1MiwxNiArNDA3LDUxIEBACiAgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7CiB9CiAKLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK3ZvaWQgU3RyZWFtSW5IYWxMb2NhbDo6ZG9VcGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBzdGQ6OnZlY3RvcjxyZWNvcmRfdHJhY2tfbWV0YWRhdGE+IGhhbFRyYWNrczsKKyAgICBoYWxUcmFja3MucmVzZXJ2ZShzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSk7CisgICAgZm9yIChhdXRvJiBtZXRhZGF0YSA6IHNpbmtNZXRhZGF0YS50cmFja3MpIHsKKyAgICAgICAgcmVjb3JkX3RyYWNrX21ldGFkYXRhIGhhbFRyYWNrTWV0YWRhdGE7CisgICAgICAgIHJlY29yZF90cmFja19tZXRhZGF0YV9mcm9tX3Y3KCZoYWxUcmFja01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICBoYWxUcmFja3MucHVzaF9iYWNrKGhhbFRyYWNrTWV0YWRhdGEpOwogICAgIH0KLSAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrX2NvdW50ID0gaGFsVHJhY2tzLnNpemUoKSwKKyAgICAgICAgLnRyYWNrcyA9IGhhbFRyYWNrcy5kYXRhKCksCisgICAgfTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmaGFsTWV0YWRhdGEpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA+PSA3Cit2b2lkIFN0cmVhbUluSGFsTG9jYWw6OmRvVXBkYXRlU2lua01ldGFkYXRhVjcoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3Y3X3QgaGFsTWV0YWRhdGEgewogICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKICAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Y3Kj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAogICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YV92NyhtU3RyZWFtLCAmaGFsTWV0YWRhdGEpOworfQorI2VuZGlmCisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgeworI2lmIE1BSk9SX1ZFUlNJT04gPCA3CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAgLy8gbm90IHN1cHBvcnRlZCBieSB0aGUgSEFMCisgICAgfQorICAgIGRvVXBkYXRlU2lua01ldGFkYXRhKHNpbmtNZXRhZGF0YSk7CisjZWxzZQorICAgIGlmIChtRGV2aWNlLT52ZXJzaW9uKCkgPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047ICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBIQUwKKyAgICAgICAgfQorICAgICAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YShzaW5rTWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YV92NyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047ICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBIQUwKKyAgICAgICAgfQorICAgICAgICBkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KHNpbmtNZXRhZGF0YSk7CisgICAgfQorI2VuZGlmCiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKaW5kZXggZDE3ZjlmMy4uYjI2MDQ5NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMjgsMjEgKzI4LDE0IEBACiBjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQogewogICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KICAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwogCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworICAgIC8vIFJldHVybiB0aGUgYmFzZSBjb25maWd1cmF0aW9uIG9mIHRoZSBzdHJlYW06CisgICAgLy8gICAtIGNoYW5uZWwgbWFzazsKKyAgICAvLyAgIC0gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAvLyAgIC0gc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcyhhdWRpb19jb25maWdfYmFzZV90ICpjb25maWdCYXNlKTsKIAogICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CkBAIC0xNTYsNiArMTQ5LDI0IEBACiAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KICAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwogCisgICAgLy8gUmV0dXJucyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIHNldHRpbmcuCisgICAgc3RhdHVzX3QgZ2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpIG92ZXJyaWRlOworCisgICAgLy8gU2V0cyB0aGUgRHVhbCBNb25vIG1vZGUgcHJlc2VudGF0aW9uIG9uIHRoZSBvdXRwdXQgZGV2aWNlLgorICAgIHN0YXR1c190IHNldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90IG1vZGUpIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJucyB0aGUgQXVkaW8gRGVzY3JpcHRpb24gTWl4IGxldmVsIGluIGRCLgorICAgIHN0YXR1c190IGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQikgb3ZlcnJpZGU7CisKKyAgICAvLyBTZXRzIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuCisgICAgc3RhdHVzX3Qgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIG92ZXJyaWRlOworCisgICAgLy8gUmV0cmlldmVzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzLgorICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpIG92ZXJyaWRlOworCisgICAgLy8gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBwYXJhbWV0ZXJzIHRoYXQgY29udHJvbCBwbGF5YmFjayBiZWhhdmlvci4KKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKSBvdmVycmlkZTsKKwogICAgIHN0YXR1c190IHNldEV2ZW50Q2FsbGJhY2soY29uc3Qgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlRXZlbnRDYWxsYmFjaz4mIGNhbGxiYWNrKSBvdmVycmlkZTsKIAogICBwcml2YXRlOgpAQCAtMTczLDYgKzE4NCw5IEBACiAgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKIAogICAgIHN0YXRpYyBpbnQgYXN5bmNFdmVudENhbGxiYWNrKHN0cmVhbV9ldmVudF9jYWxsYmFja190eXBlX3QgZXZlbnQsIHZvaWQgKnBhcmFtLCB2b2lkICpjb29raWUpOworCisgICAgdm9pZCBkb1VwZGF0ZVNvdXJjZU1ldGFkYXRhVjcoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKTsKKyAgICB2b2lkIGRvVXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKTsKIH07CiAKIGNsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CkBAIC0yMjcsNiArMjQxLDkgQEAKICAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwogCiAgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOworCisgICAgdm9pZCBkb1VwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSk7CisgICAgdm9pZCBkb1VwZGF0ZVNpbmtNZXRhZGF0YVY3KGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKaW5kZXggNWZkMzkxMi4uZjZhNTU0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwYTQyYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKLQotI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi90eXBlcy5oKQotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKLW5hbWVzcGFjZSB1dGlscyB7Ci0KLSNpZiBNQUpPUl9WRVJTSU9OID09IDIKLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KLVJldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhrZXlzLCBjYWxsYmFjayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKLSAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGtleXMpOwotfQotI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0Ci10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+Ci1SZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGtleXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgcmV0dXJuIG9iamVjdC0+Z2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzLCBjYWxsYmFjayk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotUmV0dXJuPFJlc3VsdD4gc2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgewotICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cyk7Ci19Ci0jZW5kaWYKLQotfSAvLyBuYW1lc3BhY2UgdXRpbHMKLX0gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggMWUwNGIyMS4uMjllZjAxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC0xMDYsNiArMTA2LDkgQEAKICAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CiAKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSA9IDA7CisKICAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAppbmRleCAzYTc2ZjlmLi45ZmI1NmFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCkBAIC00Niw2ICs0Niw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCkgPSAwOwogCisgICAgdmlydHVhbCBmbG9hdCBnZXRIYWxWZXJzaW9uKCkgPSAwOworCiAgICAgc3RhdGljIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGUoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggZTMwY2I3Mi4uMmJlMTJmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0zMSwyMSArMzEsMjcgQEAKIGNsYXNzIFN0cmVhbUhhbEludGVyZmFjZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKIHsKICAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpID0gMDsKLQogICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgPSAwOwogCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgPSAwOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpID0gMDsKKyAgICAvLyBSZXR1cm4gdGhlIGJhc2UgY29uZmlndXJhdGlvbiBvZiB0aGUgc3RyZWFtOgorICAgIC8vICAgLSBjaGFubmVsIG1hc2s7CisgICAgLy8gICAtIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgLy8gICAtIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnQmFzZSkgPSAwOwogCiAgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSA9IDA7CisgICAgaW5saW5lIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgICAgICBjb25zdCBzdGF0dXNfdCByZXN1bHQgPSBnZXRBdWRpb1Byb3BlcnRpZXMoJmNvbmZpZyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IG51bGxwdHIpICpzYW1wbGVSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgaWYgKG1hc2sgIT0gbnVsbHB0cikgKm1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxscHRyKSAqZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAogICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgPSAwOwpAQCAtMTU4LDE0ICsxNjQsMzMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSA9IDA7CiAKICAgICBzdHJ1Y3QgU291cmNlTWV0YWRhdGEgewotICAgICAgICBzdGQ6OnZlY3RvcjxwbGF5YmFja190cmFja19tZXRhZGF0YV90PiB0cmFja3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Y3X3Q+IHRyYWNrczsKICAgICB9OworCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KICAgICAgKiBAcGFyYW0gc291cmNlTWV0YWRhdGEgRGVzY3JpcHRpb24gb2YgdGhlIGF1ZGlvIHRoYXQgaXMgcGxheWVkIGJ5IHRoZSBjbGllbnRzLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSA9IDA7CiAKKyAgICAvLyBSZXR1cm5zIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gc2V0dGluZy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1YWxNb25vTW9kZShhdWRpb19kdWFsX21vbm9fbW9kZV90KiBtb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBEdWFsIE1vbm8gbW9kZSBwcmVzZW50YXRpb24gb24gdGhlIG91dHB1dCBkZXZpY2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBBdWRpbyBEZXNjcmlwdGlvbiBNaXggbGV2ZWwgaW4gZEIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIGxldmVsZEIpID0gMDsKKworICAgIC8vIFNldHMgdGhlIEF1ZGlvIERlc2NyaXB0aW9uIE1peCBsZXZlbCBpbiBkQi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKSA9IDA7CisKKyAgICAvLyBSZXRyaWV2ZXMgY3VycmVudCBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBwbGF5YmFjayByYXRlIHBhcmFtZXRlcnMgdGhhdCBjb250cm9sIHBsYXliYWNrIGJlaGF2aW9yLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycyhjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFdmVudENhbGxiYWNrKGNvbnN0IHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUV2ZW50Q2FsbGJhY2s+JiBjYWxsYmFjaykgPSAwOwogCiAgIHByb3RlY3RlZDoKQEAgLTE5Nyw3ICsyMjIsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKIAogICAgIHN0cnVjdCBTaW5rTWV0YWRhdGEgewotICAgICAgICBzdGQ6OnZlY3RvcjxyZWNvcmRfdHJhY2tfbWV0YWRhdGFfdD4gdHJhY2tzOworICAgICAgICBzdGQ6OnZlY3RvcjxyZWNvcmRfdHJhY2tfbWV0YWRhdGFfdjdfdD4gdHJhY2tzOwogICAgIH07CiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwCmluZGV4IDM5YjBjZWIuLjMwOTc2NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfZGVmYXVsdHMiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKaW5kZXggMWEzMTQyMC4uZDg1ZTJlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcApAQCAtNzksMTAgKzc5LDE0IEBACiAgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09ICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQotICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKLSAgICB0cmFja0NoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7Ci0gICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7Ci0gICAgbWl4ZXJDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih0cmFja0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICB0cmFja0NoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgdHJhY2tDaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVySGFwdGljQ2hhbm5lbE1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oCisgICAgICAgICAgICBtaXhlckNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICBtaXhlckNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOwpAQCAtMzYyLDcgKzM2Niw4IEBACiAgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwogICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAodHJhY2stPm1NaXhlckNoYW5uZWxNYXNrIHwgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC00MDcsNyArNDEyLDggQEAKICAgICAgICAgY2FzZSBNSVhFUl9DSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2sgPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOwotICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrLAorICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y2hhbm5lbE1hc2sgfCB0cmFjay0+bUhhcHRpY0NoYW5uZWxNYXNrKSwKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CkBAIC00MjMsNyArNDI5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgSEFQVElDX0lOVEVOU0lUWTogewotICAgICAgICAgICAgY29uc3QgaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PGhhcHRpY19pbnRlbnNpdHlfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgY29uc3Qgb3M6OkhhcHRpY1NjYWxlIGhhcHRpY0ludGVuc2l0eSA9IHN0YXRpY19jYXN0PG9zOjpIYXB0aWNTY2FsZT4odmFsdWVJbnQpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ICE9IGhhcHRpY0ludGVuc2l0eSkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OwogICAgICAgICAgICAgfQpAQCAtNTMzLDkgKzUzOSwxMCBAQAogICAgIFRyYWNrKiB0ID0gc3RhdGljX2Nhc3Q8VHJhY2sqPih0cmFjayk7CiAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IHQtPmNoYW5uZWxNYXNrOwotICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOworICAgIHQtPm1IYXB0aWNDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICB0LT5tSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1IYXB0aWNDaGFubmVsTWFzayk7Ci0gICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBjaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwogICAgIHQtPmNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgQUxPR1ZfSUYoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCiAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7CkBAIC01NDUsNyArNTUyLDcgQEAKICAgICB0LT5tUGxheWJhY2tSYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwogICAgIC8vIGhhcHRpYwogICAgIHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsKLSAgICB0LT5tSGFwdGljSW50ZW5zaXR5ID0gSEFQVElDX1NDQUxFX05PTkU7CisgICAgdC0+bUhhcHRpY0ludGVuc2l0eSA9IG9zOjpIYXB0aWNTY2FsZTo6Tk9ORTsKICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKICAgICB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPSAwOwogICAgIHQtPm1BZGp1c3RJbkNoYW5uZWxDb3VudCA9IHQtPmNoYW5uZWxDb3VudCArIHQtPm1IYXB0aWNDaGFubmVsQ291bnQ7CkBAIC01OTAsMTkgKzU5NywxMiBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IGdldFRyYWNrKG5hbWUpOwogICAgICAgICAgICAgaWYgKHQtPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICBmbG9hdCBnYW1tYSA9IHQtPmdldEhhcHRpY1NjYWxlR2FtbWEoKTsKLSAgICAgICAgICAgICAgICBmbG9hdCBtYXhBbXBsaXR1ZGVSYXRpbyA9IHQtPmdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCk7CiAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyID0gKHVpbnQ4X3QqKXBhaXIuZmlyc3QgKyBtRnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQtPm1NaXhlckZvcm1hdCkgewogICAgICAgICAgICAgICAgIC8vIE1peGVyIGZvcm1hdCBzaG91bGQgYmUgQVVESU9fRk9STUFUX1BDTV9GTE9BVC4KICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6IHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZvdXQgPSAoZmxvYXQqKSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXVsID0gZm91dFtpXSA+PSAwID8gMS4wIDogLTEuMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdXRbaV0gPSBwb3dmKGZhYnNmKGZvdXRbaV0gLyBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCksIGdhbW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1heEFtcGxpdHVkZVJhdGlvICogSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgKiBtdWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3M6OnNjYWxlSGFwdGljRGF0YSgoZmxvYXQqKSBidWZmZXIsIHNhbXBsZUNvdW50LCB0LT5tSGFwdGljSW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtTWl4ZXJGb3JtYXQ6ICUjeCIsIHQtPm1NaXhlckZvcm1hdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlckJhc2UuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJCYXNlLmNwcAppbmRleCBhNTRlMjJmLi5mMzBlYjU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyQmFzZS5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9NaXhlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTEyOTUsOCArMTI5NiwyOSBAQAogCiAvLyBOZWVkcyB0byBkZXJpdmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgKGNvbnN0ZXhwcikuICBDb3VsZCBiZSB0YXJnZXRlZCB0byBnbwogLy8gdG8gYSBNT05PVk9MIG1peHR5cGUgYmFzZWQgb24gTUFYX05VTV9WT0xVTUVTLCBidXQgdGhhdCdzIGFuIHVubmVjZXNzYXJ5IGNvbXBsaWNhdGlvbi4KLSNkZWZpbmUgTUlYVFlQRV9NT05PVk9MKG1peHR5cGUpICgobWl4dHlwZSkgPT0gTUlYVFlQRV9NVUxUSSA/IE1JWFRZUEVfTVVMVElfTU9OT1ZPTCA6IFwKLSAgICAgICAgKG1peHR5cGUpID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkgPyBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wgOiAobWl4dHlwZSkpCisKK2NvbnN0ZXhwciBpbnQgTUlYVFlQRV9NT05PVk9MKGludCBtaXh0eXBlLCBpbnQgY2hhbm5lbHMpIHsKKyAgICBpZiAoY2hhbm5lbHMgPD0gRkNDXzIpIHsKKyAgICAgICAgcmV0dXJuIG1peHR5cGU7CisgICAgfSBlbHNlIGlmIChtaXh0eXBlID09IE1JWFRZUEVfTVVMVEkpIHsKKyAgICAgICAgcmV0dXJuIE1JWFRZUEVfTVVMVElfTU9OT1ZPTDsKKyAgICB9IGVsc2UgaWYgKG1peHR5cGUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWSkgeworICAgICAgICByZXR1cm4gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtaXh0eXBlOworICAgIH0KK30KKworLy8gSGVscGVyIHRvIG1ha2UgYSBmdW5jdGlvbmFsIGFycmF5IGZyb20gdm9sdW1lUmFtcE11bHRpLgordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRWLCB0eXBlbmFtZSBUQSwgdHlwZW5hbWUgVEFWLAorICAgICAgICAgIHN0ZDo6c2l6ZV90IC4uLiBJcz4KK3N0YXRpYyBjb25zdGV4cHIgYXV0byBtYWtlVlJNQXJyYXkoc3RkOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4pCit7CisgICAgdXNpbmcgRiA9IHZvaWQoKikoVE8qLCBzaXplX3QsIGNvbnN0IFRJKiwgVEEqLCBUViosIGNvbnN0IFRWKiwgVEFWKiwgVEFWKTsKKyAgICByZXR1cm4gc3RkOjphcnJheTxGLCBzaXplb2YuLi4oSXMpPnsKKyAgICAgICAgICAgIHsgJnZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSwgSXMgKyAxKSwgSXMgKyAxLCBUTywgVEksIFRWLCBUQSwgVEFWPiAuLi59CisgICAgICAgIH07Cit9CiAKIC8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKICAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKQEAgLTEzMDgsNDAgKzEzMzAsMjYgQEAKIHN0YXRpYyB2b2lkIHZvbHVtZVJhbXBNdWx0aSh1aW50MzJfdCBjaGFubmVscywgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgVFYgKnZvbCwgY29uc3QgVFYgKnZvbGluYywgVEFWICp2b2xhLCBUQVYgdm9sYWluYykKIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRSwgMT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEUsIDI+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDM+KG91dCwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgND4ob3V0LAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA1PihvdXQsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDY+KG91dCwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNz4ob3V0LAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA4PihvdXQsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOwotICAgICAgICBicmVhazsKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdm9sdW1lUmFtcE11bHRpQXJyYXkgPQorICAgICAgICAgICAgbWFrZVZSTUFycmF5PE1JWFRZUEUsIFRPLCBUSSwgVFYsIFRBLCBUQVY+KHN0ZDo6bWFrZV9pbmRleF9zZXF1ZW5jZTxGQ0NfTElNSVQ+KCkpOworICAgIGlmIChjaGFubmVscyA+IDAgJiYgY2hhbm5lbHMgPD0gdm9sdW1lUmFtcE11bHRpQXJyYXkuc2l6ZSgpKSB7CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aUFycmF5W2NoYW5uZWxzIC0gMV0ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGNoYW5uZWwgY291bnQ6JWQiLCBfX2Z1bmNfXywgY2hhbm5lbHMpOwogICAgIH0KIH0KIAorLy8gSGVscGVyIHRvIG1ha2UgYSBmdW5jdGlvbmFsIGFycmF5IGZyb20gdm9sdW1lTXVsdGkuCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVYsCisgICAgICAgICAgc3RkOjpzaXplX3QgLi4uIElzPgorc3RhdGljIGNvbnN0ZXhwciBhdXRvIG1ha2VWTUFycmF5KHN0ZDo6aW5kZXhfc2VxdWVuY2U8SXMuLi4+KQoreworICAgIHVzaW5nIEYgPSB2b2lkKCopKFRPKiwgc2l6ZV90LCBjb25zdCBUSSosIFRBKiwgY29uc3QgVFYqLCBUQVYpOworICAgIHJldHVybiBzdGQ6OmFycmF5PEYsIHNpemVvZi4uLihJcyk+eworICAgICAgICAgICAgeyAmdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUsIElzICsgMSksIElzICsgMSwgVE8sIFRJLCBUViwgVEEsIFRBVj4gLi4uIH0KKyAgICAgICAgfTsKK30KKwogLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQogICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAogICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKQEAgLTEzNTIsMzEgKzEzNjAsMTIgQEAKIHN0YXRpYyB2b2lkIHZvbHVtZU11bHRpKHVpbnQzMl90IGNoYW5uZWxzLCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBjb25zdCBUViAqdm9sLCBUQVYgdm9sYSkKIHsKLSAgICBzd2l0Y2ggKGNoYW5uZWxzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCAxPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgMj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgMz4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgND4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNz4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgOD4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOwotICAgICAgICBicmVhazsKKyAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdm9sdW1lTXVsdGlBcnJheSA9CisgICAgICAgICAgICBtYWtlVk1BcnJheTxNSVhUWVBFLCBUTywgVEksIFRWLCBUQSwgVEFWPihzdGQ6Om1ha2VfaW5kZXhfc2VxdWVuY2U8RkNDX0xJTUlUPigpKTsKKyAgICBpZiAoY2hhbm5lbHMgPiAwICYmIGNoYW5uZWxzIDw9IHZvbHVtZU11bHRpQXJyYXkuc2l6ZSgpKSB7CisgICAgICAgIHZvbHVtZU11bHRpQXJyYXlbY2hhbm5lbHMgLSAxXShvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGNoYW5uZWwgY291bnQ6JWQiLCBfX2Z1bmNfXywgY2hhbm5lbHMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyT3BzLmgKaW5kZXggODBiZDA5My4uY2Q0N2RjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXJPcHMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlck9wcy5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fTUlYRVJfT1BTX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19NSVhFUl9PUFNfSAogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gSGFjayB0byBtYWtlIHN0YXRpY19hc3NlcnQgd29yayBpbiBhIGNvbnN0ZXhwcgpAQCAtMjMxLDIwICsyMzMsMjMgQEAKICAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwKICAgICAgICAgdHlwZW5hbWUgRj4KIHZvaWQgc3RlcmVvVm9sdW1lSGVscGVyKFRPKiYgb3V0LCBjb25zdCBUSSomIGluLCBjb25zdCBUViAqdm9sLCBGIGYpIHsKLSAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOID4gMCAmJiBOQ0hBTiA8PSA4KTsKKyAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOID4gMCAmJiBOQ0hBTiA8PSBGQ0NfTElNSVQpOwogICAgIHN0YXRpY19hc3NlcnQoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAogICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTAotICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCk7CisgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5ECisgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCk7CiAgICAgYXV0byBwcm9jID0gW10oYXV0byYgYSwgY29uc3QgYXV0byYgYikgewogICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wKLSAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSB7CisgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORAorICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSB7CiAgICAgICAgICAgICBhICs9IGI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhID0gYjsKICAgICAgICAgfQogICAgIH07CiAgICAgYXV0byBpbnAgPSBbJmluXSgpIC0+IGNvbnN0IFRJJiB7Ci0gICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgeworICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQKKyAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgewogICAgICAgICAgICAgcmV0dXJuICppbjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAqaW4rKzsKQEAgLTI4OCw2ICsyOTMsMTYgQEAKICAgICAvLyBOQ0hBTiA9PSA4CiAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIHZvbFswXSkpOyAvLyBzaWRlIGxlZnQKICAgICBwcm9jKCpvdXQrKywgZihpbnAoKSwgdm9sWzFdKSk7IC8vIHNpZGUgcmlnaHQKKyAgICBpZiBjb25zdGV4cHIgKE5DSEFOID4gRkNDXzgpIHsKKyAgICAgICAgLy8gTXV0ZXMgdG8gemVybyBleHRlbmRlZCBzdXJyb3VuZCBjaGFubmVscy4KKyAgICAgICAgLy8gNy4xLjQgaGFzIHRoZSBjb3JyZWN0IGJlaGF2aW9yLgorICAgICAgICAvLyAyMi4yIGhhcyB0aGUgYmVoYXZpb3IgdGhhdCBGTEMgYW5kIEZSQyB3aWxsIGJlIG1peGVkIGluc3RlYWQKKyAgICAgICAgLy8gb2YgU0wgYW5kIFNSIGFuZCBMRkUgd2lsbCBiZSBjZW50ZXIsIG5vdCBsZWZ0LgorICAgICAgICBmb3IgKGludCBpID0gODsgaSA8IE5DSEFOOyArK2kpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIHVzaW5nIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpjaGFubmVsczo6a1NpZGVGcm9tQ2hhbm5lbElkeAorICAgICAgICAgICAgcHJvYygqb3V0KyssIGYoaW5wKCksIDAuZikpOworICAgICAgICB9CisgICAgfQogfQogCiAvKgpAQCAtMzEyLDYgKzMyNyw4IEBACiAgKiAgIFRWL1RBVjogaW50MzJfdCAoVTQuMjgpIG9yIGludDE2X3QgKFU0LjEyKSBvciBmbG9hdAogICogICBJbnB1dCBjaGFubmVsIGNvdW50IGlzIDEuCiAgKiAgIHZvbDogcmVwcmVzZW50cyB2b2x1bWUgYXJyYXkuCisgKiAgIFRoaXMgdXNlcyBzdGVyZW8gYmFsYW5jZWQgdm9sdW1lIHZvbFswXSBhbmQgdm9sWzFdLgorICogICBCZWZvcmUgUiwgdGhpcyB3YXMgYSBmdWxsIHZvbHVtZSBhcnJheSBidXQgd2FzIGNhbGxlZCBvbmx5IGZvciBjaGFubmVscyA8PSAyLgogICoKICAqICAgVGhpcyBhY2N1bXVsYXRlcyBpbnRvIHRoZSBvdXQgcG9pbnRlci4KICAqCkBAIC0zNTYsMTcgKzM3MywxMyBAQAogICAgICAgICBkbyB7CiAgICAgICAgICAgICBUQSBhdXhhY2N1bSA9IDA7CiAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluLCB2b2xbaV0sICZhdXhhY2N1bSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluKys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KCppbisrLCB2b2xbaV0sICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CkBAIC0zODMsMTEgKzM5NiwxMyBAQAogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKKyAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgewogICAgICAgICAgICAgICAgIHN0ZXJlb1ZvbHVtZUhlbHBlcjxNSVhUWVBFLCBOQ0hBTj4oCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsIGluLCB2b2wsIFsmYXV4YWNjdW1dIChhdXRvICZhLCBjb25zdCBhdXRvICZiKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNaXhNdWxBdXg8VE8sIFRJLCBUViwgVEE+KGEsIGIsICZhdXhhY2N1bSk7CiAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgaW4gKz0gMTsKICAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQpIGluICs9IDI7CiAgICAgICAgICAgICAgICAgdm9sWzBdICs9IHZvbGluY1swXTsKICAgICAgICAgICAgICAgICB2b2xbMV0gKz0gdm9saW5jWzFdOwpAQCAtNDAxLDE3ICs0MTYsMTMgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkbyB7CiAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bDxUTywgVEksIFRWPigqaW4sIHZvbFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGluKys7CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluKyssIHZvbFtpXSk7CiAgICAgICAgICAgICAgICAgICAgIHZvbFtpXSArPSB2b2xpbmNbaV07CkBAIC00MjgsMTAgKzQzOSwxMiBAQAogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MCiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wKKyAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgewogICAgICAgICAgICAgICAgIHN0ZXJlb1ZvbHVtZUhlbHBlcjxNSVhUWVBFLCBOQ0hBTj4ob3V0LCBpbiwgdm9sLCBbXSAoYXV0byAmYSwgY29uc3QgYXV0byAmYikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWl4TXVsPFRPLCBUSSwgVFY+KGEsIGIpOwogICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpIGluICs9IDE7CiAgICAgICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSBpbiArPSAyOwogICAgICAgICAgICAgICAgIHZvbFswXSArPSB2b2xpbmNbMF07CiAgICAgICAgICAgICAgICAgdm9sWzFdICs9IHZvbGluY1sxXTsKQEAgLTQ1NCwxNSArNDY3LDEyIEBACiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIFRBIGF1eGFjY3VtID0gMDsKICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJKSB7CisgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA8PSAyKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgKm91dCsrICs9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewotICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsQXV4PFRPLCBUSSwgVFYsIFRBPigqaW4sIHZvbFtpXSwgJmF1eGFjY3VtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW4rKzsKICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TQVZFT05MWSkgeworICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoTkNIQU4gPD0gMik7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9IE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oKmluKyssIHZvbFtpXSwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzYsMTEgKzQ4NiwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wKICAgICAgICAgICAgICAgICAgICAgfHwgTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTAorICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTU9OT0VYUEFORAogICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfU1RFUkVPRVhQQU5EKSB7CiAgICAgICAgICAgICAgICAgc3RlcmVvVm9sdW1lSGVscGVyPE1JWFRZUEUsIE5DSEFOPigKICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgaW4sIHZvbCwgWyZhdXhhY2N1bV0gKGF1dG8gJmEsIGNvbnN0IGF1dG8gJmIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE11bEF1eDxUTywgVEksIFRWLCBUQT4oYSwgYiwgJmF1eGFjY3VtKTsKICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSBpbiArPSAxOwogICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgaW4gKz0gMjsKICAgICAgICAgICAgIH0gZWxzZSAvKiBjb25zdGV4cHIgKi8gewogICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoZGVwZW5kZW50X2ZhbHNlPE1JWFRZUEU+LCAiaW52YWxpZCBtaXh0eXBlIik7CkBAIC00OTAsMTYgKzUwMiwxNCBAQAogICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8vIEFMT0dEKCJNaXh0eXBlOiVkIE5DSEFOOiVkIiwgTUlYVFlQRSwgTkNIQU4pOwogICAgICAgICAgICAgaWYgY29uc3RleHByIChNSVhUWVBFID09IE1JWFRZUEVfTVVMVEkpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfYXNzZXJ0KE5DSEFOIDw9IDIpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTkNIQU47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAqb3V0KysgKz0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQ0hBTjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXQrKyArPSBNaXhNdWw8VE8sIFRJLCBUVj4oKmluLCB2b2xbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbisrOwogICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZKSB7CisgICAgICAgICAgICAgICAgc3RhdGljX2Fzc2VydChOQ0hBTiA8PSAyKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5DSEFOOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gTWl4TXVsPFRPLCBUSSwgVFY+KCppbisrLCB2b2xbaV0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTUxMywxMCArNTIzLDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTAogICAgICAgICAgICAgICAgICAgICB8fCBNSVhUWVBFID09IE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MCisgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5ECiAgICAgICAgICAgICAgICAgICAgIHx8IE1JWFRZUEUgPT0gTUlYVFlQRV9TVEVSRU9FWFBBTkQpIHsKICAgICAgICAgICAgICAgICBzdGVyZW9Wb2x1bWVIZWxwZXI8TUlYVFlQRSwgTkNIQU4+KG91dCwgaW4sIHZvbCwgW10gKGF1dG8gJmEsIGNvbnN0IGF1dG8gJmIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE11bDxUTywgVEksIFRWPihhLCBiKTsKICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZiBjb25zdGV4cHIgKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSBpbiArPSAxOwogICAgICAgICAgICAgICAgIGlmIGNvbnN0ZXhwciAoTUlYVFlQRSA9PSBNSVhUWVBFX1NURVJFT0VYUEFORCkgaW4gKz0gMjsKICAgICAgICAgICAgIH0gZWxzZSAvKiBjb25zdGV4cHIgKi8gewogICAgICAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoZGVwZW5kZW50X2ZhbHNlPE1JWFRZUEU+LCAiaW52YWxpZCBtaXh0eXBlIik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCBjNzYxYjM4Li41MTY3M2Q3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICBtUGhhc2VGcmFjdGlvbigwKSwKICAgICAgICAgbVF1YWxpdHkocXVhbGl0eSkgewogCi0gICAgY29uc3QgaW50IG1heENoYW5uZWxzID0gcXVhbGl0eSA8IERZTl9MT1dfUVVBTElUWSA/IDIgOiA4OworICAgIGNvbnN0IGludCBtYXhDaGFubmVscyA9IHF1YWxpdHkgPCBEWU5fTE9XX1FVQUxJVFkgPyBGQ0NfMiA6IEZDQ19MSU1JVDsKICAgICBpZiAoaW5DaGFubmVsQ291bnQgPCAxCiAgICAgICAgICAgICB8fCBpbkNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxzKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQgJWQgcXVhbGl0eSAlZCBjaGFubmVscyIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlYzU2YjAwLi4yMjkyYjE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTU0Niw2NCArNTQ1LDc2IEBACiAgICAgLy8gTm90ZTogQSBzdHJpZGUgb2YgMiBpcyBhY2hpZXZlZCB3aXRoIG5vbi1TSU1EIHByb2Nlc3NpbmcuCiAgICAgaW50IHN0cmlkZSA9ICgoYy5tSGFsZk51bUNvZWZzICYgNykgPT0gMCkgPyAxNiA6IDI7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdHJpZGUgPCAxNiwgIlJlc2FtcGxlciBzdHJpZGUgbXVzdCBiZSAxNiBvciBtb3JlIik7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50IDwgMSB8fCBtQ2hhbm5lbENvdW50ID4gOCwKLSAgICAgICAgICAgICJSZXNhbXBsZXIgY2hhbm5lbHMoJWQpIG11c3QgYmUgYmV0d2VlbiAxIHRvIDgiLCBtQ2hhbm5lbENvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPCAxIHx8IG1DaGFubmVsQ291bnQgPiBGQ0NfTElNSVQsCisgICAgICAgICAgICAiUmVzYW1wbGVyIGNoYW5uZWxzKCVkKSBtdXN0IGJlIGJldHdlZW4gMSB0byAlZCIsIG1DaGFubmVsQ291bnQsIEZDQ19MSU1JVCk7CiAgICAgLy8gc3RyaWRlIDE2IChmYWxscyBiYWNrIHRvIHN0cmlkZSAyIGZvciBtYWNoaW5lcyB0aGF0IGRvIG5vdCBzdXBwb3J0IE5FT04pCisKKworLy8gRm9yIG5vdyB1c2UgYSAjZGVmaW5lIGFzIGEgY29tcGlsZXIgZ2VuZXJhdGVkIGZ1bmN0aW9uIHRhYmxlIHJlcXVpcmVzIHJlbmFtaW5nLgorI3ByYWdtYSBwdXNoX21hY3JvKCJBVURJT1JFU0FNUExFUkRZTl9DQVNFIikKKyN1bmRlZiBBVURJT1JFU0FNUExFUkRZTl9DQVNFCisjZGVmaW5lIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoQ0hBTk5FTCwgTE9DS0VEKSBcCisgICAgY2FzZSBDSEFOTkVMOiBpZiBjb25zdGV4cHIgKENIQU5ORUwgPD0gRkNDX0xJTUlUKSB7XAorICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTxDSEFOTkVMLCBMT0NLRUQsIDE2PjsgXAorICAgIH0gYnJlYWsKKwogICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDEsIHRydWUsIDE2PjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwyLCB0cnVlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MywgdHJ1ZSwgMTY+OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDQsIHRydWUsIDE2PjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw1LCB0cnVlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NiwgdHJ1ZSwgMTY+OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDcsIHRydWUsIDE2PjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw4LCB0cnVlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxLCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgyLCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgzLCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg0LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg1LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg2LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg3LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg4LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg5LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxMCwgdHJ1ZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTEsIHRydWUpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDEyLCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxMywgdHJ1ZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTQsIHRydWUpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDE1LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxNiwgdHJ1ZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTcsIHRydWUpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDE4LCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxOSwgdHJ1ZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMjAsIHRydWUpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDIxLCB0cnVlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgyMiwgdHJ1ZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMjMsIHRydWUpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDI0LCB0cnVlKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCAobUNoYW5uZWxDb3VudCkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTwxLCBmYWxzZSwgMTY+OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDIsIGZhbHNlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8MywgZmFsc2UsIDE2PjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw0LCBmYWxzZSwgMTY+OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDUsIGZhbHNlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgbVJlc2FtcGxlRnVuYyA9ICZBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGU8NiwgZmFsc2UsIDE2PjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICBtUmVzYW1wbGVGdW5jID0gJkF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZTw3LCBmYWxzZSwgMTY+OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgIG1SZXNhbXBsZUZ1bmMgPSAmQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlPDgsIGZhbHNlLCAxNj47Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxLCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMiwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDMsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg0LCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoNSwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDYsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSg3LCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoOCwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDksIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxMCwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDExLCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTIsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxMywgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDE0LCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTUsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxNiwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDE3LCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMTgsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgxOSwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDIwLCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMjEsIGZhbHNlKTsKKyAgICAgICAgQVVESU9SRVNBTVBMRVJEWU5fQ0FTRSgyMiwgZmFsc2UpOworICAgICAgICBBVURJT1JFU0FNUExFUkRZTl9DQVNFKDIzLCBmYWxzZSk7CisgICAgICAgIEFVRElPUkVTQU1QTEVSRFlOX0NBU0UoMjQsIGZhbHNlKTsKICAgICAgICAgfQogICAgIH0KKyNwcmFnbWEgcG9wX21hY3JvKCJBVURJT1JFU0FNUExFUkRZTl9DQVNFIikKKwogI2lmZGVmIERFQlVHX1JFU0FNUExFUgogICAgIHByaW50ZigiY2hhbm5lbHM6JWQgICVzICBzdHJpZGU6JWQgICVzICBjb2VmOiVkICBzaGlmdDolZFxuIiwKICAgICAgICAgICAgIG1DaGFubmVsQ291bnQsIGxvY2tlZCA/ICJsb2NrZWQiIDogImludGVycG9sYXRlZCIsCkBAIC02MzYsNyArNjQ3LDcgQEAKICAgICBjb25zdCB1aW50MzJfdCBwaGFzZVdyYXBMaW1pdCA9IGMubUwgPDwgYy5tU2hpZnQ7CiAgICAgc2l6ZV90IGluRnJhbWVDb3VudCA9IChwaGFzZUluY3JlbWVudCAqICh1aW50NjRfdClvdXRGcmFtZUNvdW50ICsgcGhhc2VGcmFjdGlvbikKICAgICAgICAgICAgIC8gcGhhc2VXcmFwTGltaXQ7Ci0gICAgLy8gc2FuaXR5IGNoZWNrIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KKyAgICAvLyB2YWxpZGF0ZSB0aGF0IGluRnJhbWVDb3VudCBpcyBpbiBzaWduZWQgMzIgYml0IGludGVnZXIgcmFuZ2UuCiAgICAgQUxPR19BU1NFUlQoMCA8PSBpbkZyYW1lQ291bnQgJiYgaW5GcmFtZUNvdW50IDwgKDFVIDw8IDMxKSk7CiAKICAgICAvL0FMT0dWKCJpbkZyYW1lQ291bnQ6JWQgIG91dEZyYW1lQ291bnQ6JWQiCkBAIC02NDYsNyArNjU3LDcgQEAKICAgICAvLyBOT1RFOiBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIGNvZGUgaGVyZS4gcmVnaXN0ZXIKICAgICAvLyBwcmVzc3VyZSBpcyB2ZXJ5IGhpZ2ggYW5kIGEgc21hbGwgY2hhbmdlIG1pZ2h0IGNhdXNlIHRoZSBjb21waWxlcgogICAgIC8vIHRvIGdlbmVyYXRlIGZhciBsZXNzIGVmZmljaWVudCBjb2RlLgotICAgIC8vIEFsd2F5cyBzYW5pdHkgY2hlY2sgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KKyAgICAvLyBBbHdheXMgdmFsaWRhdGUgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KIAogICAgIC8vIHRoZSBmb2xsb3dpbmcgbG9naWMgaXMgYSBiaXQgY29udm9sdXRlZCB0byBrZWVwIHRoZSBtYWluIHByb2Nlc3NpbmcgbG9vcAogICAgIC8vIGFzIHRpZ2h0IGFzIHBvc3NpYmxlIHdpdGggcmVnaXN0ZXIgYWxsb2NhdGlvbi4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCA5YjcwYTFjLi4xZmNmZmNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC0zODEsNyArMzgxLDcgQEAKICAgICAvLyBOT1RFOiBiZSB2ZXJ5IGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgdGhlIGNvZGUgaGVyZS4gcmVnaXN0ZXIKICAgICAvLyBwcmVzc3VyZSBpcyB2ZXJ5IGhpZ2ggYW5kIGEgc21hbGwgY2hhbmdlIG1pZ2h0IGNhdXNlIHRoZSBjb21waWxlcgogICAgIC8vIHRvIGdlbmVyYXRlIGZhciBsZXNzIGVmZmljaWVudCBjb2RlLgotICAgIC8vIEFsd2F5cyBzYW5pdHkgY2hlY2sgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KKyAgICAvLyBBbHdheXMgdmFsaWRhdGUgdGhlIHJlc3VsdCB3aXRoIG9iamR1bXAgb3IgdGVzdC1yZXNhbXBsZS4KIAogICAgIGlmIChMT0NLRUQpIHsKICAgICAgICAgLy8gbG9ja2VkIHBvbHlwaGFzZSAobm8gaW50ZXJwb2xhdGlvbikKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggNWEwM2EwZC4uZjJjMzg2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTQwNCw3ICs0MDQsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgLy8gY29tcHV0ZSB0aGUgaW5kZXggb2YgdGhlIGNvZWZmaWNpZW50IG9uIHRoZSBwb3NpdGl2ZSBzaWRlIGFuZAogICAgIC8vIG5lZ2F0aXZlIHNpZGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5icAppbmRleCBkYzcwMzEwLi40ZWE3NWU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2F1ZGlvLXJlc2FtcGxlci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpby1yZXNhbXBsZXIiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmgKaW5kZXggM2Y3Y2Q0OC4uNzBlYWZlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApAQCAtMjIsMTAgKzIyLDEwIEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQnVmZmVyUHJvdmlkZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uVXRpbHMuaD4KIAogLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKICNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXJCYXNlOjpVTklUWV9HQUlOX0lOVApAQCAtNTUsMzIgKzU1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBwbGF5YmFjayByYXRlLgogICAgIH07CiAKLSAgICB0eXBlZGVmIGVudW0geyAvLyBIYXB0aWMgaW50ZW5zaXR5LCBzaG91bGQga2VlcCBjb25zaXN0ZW50IHdpdGggVmlicmF0b3JTZXJ2aWNlCi0gICAgICAgIEhBUFRJQ19TQ0FMRV9NVVRFID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTVVURSwKLSAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfVkVSWV9MT1csCi0gICAgICAgIEhBUFRJQ19TQ0FMRV9MT1cgPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9MT1csCi0gICAgICAgIEhBUFRJQ19TQ0FMRV9OT05FID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTk9ORSwKLSAgICAgICAgSEFQVElDX1NDQUxFX0hJR0ggPSBvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlOjpTQ0FMRV9ISUdILAotICAgICAgICBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfVkVSWV9ISUdILAotICAgIH0gaGFwdGljX2ludGVuc2l0eV90OwotICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX1ZFUllfTE9XX1JBVElPID0gMi4wZiAvIDMuMGY7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBIQVBUSUNfU0NBTEVfTE9XX1JBVElPID0gMy4wZiAvIDQuMGY7Ci0gICAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBmbG9hdCBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCA9IDEuMGY7Ci0KLSAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNfaW50ZW5zaXR5X3QgaGFwdGljSW50ZW5zaXR5KSB7Ci0gICAgICAgIHN3aXRjaCAoaGFwdGljSW50ZW5zaXR5KSB7Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX01VVEU6Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX05PTkU6Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgQXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKICAgICAgICAgICAgIDogQXVkaW9NaXhlckJhc2UoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSkgewogICAgICAgICBwdGhyZWFkX29uY2UoJnNPbmNlQ29udHJvbCwgJnNJbml0Um91dGluZSk7CkBAIC0xNzAsNyArMTQ0LDcgQEAKIAogICAgICAgICAvLyBIYXB0aWMKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZDsKLSAgICAgICAgaGFwdGljX2ludGVuc2l0eV90ICAgbUhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgb3M6OkhhcHRpY1NjYWxlICAgICAgbUhhcHRpY0ludGVuc2l0eTsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUhhcHRpY0NoYW5uZWxNYXNrOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtSGFwdGljQ2hhbm5lbENvdW50OwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtTWl4ZXJIYXB0aWNDaGFubmVsTWFzazsKQEAgLTE4MCwzOCArMTU0LDYgQEAKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7Ci0KLSAgICAgICAgZmxvYXQgZ2V0SGFwdGljU2NhbGVHYW1tYSgpIGNvbnN0IHsKLSAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgotICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6Ci0gICAgICAgICAgICByZXR1cm4gMi4wZjsKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgotICAgICAgICAgICAgcmV0dXJuIDEuNWY7Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6Ci0gICAgICAgICAgICByZXR1cm4gMC41ZjsKLSAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgotICAgICAgICAgICAgcmV0dXJuIDAuMjVmOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IGdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCkgY29uc3QgewotICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCi0gICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgewotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKLSAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfVkVSWV9MT1dfUkFUSU87Ci0gICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKLSAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfTE9XX1JBVElPOwotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgotICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6Ci0gICAgICAgICAgICByZXR1cm4gMS4wZjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwLjBmOwotICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9OwogCiAgICAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gZ2V0VHJhY2soaW50IG5hbWUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXJCYXNlLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyQmFzZS5oCmluZGV4IGNmODRiODMuLjM0MTk4MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXJCYXNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlckJhc2UuaApAQCAtNDUsOCArNDUsNyBAQAogewogcHVibGljOgogICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdW5sZXNzIHVuZGVybHlpbmcgY29kZSBjaGFuZ2VzLgotICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiA4IGNoYW5uZWxzIGZvciBvdXRwdXQuCi0gICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gRkNDXzg7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gRkNDX0xJTUlUOwogICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX05VTV9WT0xVTUVTID0gRkNDXzI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFVOSVRZX0dBSU5fSU5UID0gMHgxMDAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKaW5kZXggMWIzOTA2Ny4uMjAwYTRjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgewogICAgIGlmIChwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSA9PSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19GQUlMICYmCi0gICAgICAgICAgICAocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSA9PSBBVURJT19USU1FU1RSRVRDSF9TVFJFVENIX1NQRUVDSCB8fAorICAgICAgICAgICAgKHBsYXliYWNrUmF0ZS5tU3RyZXRjaE1vZGUgPT0gQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9WT0lDRSB8fAogICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlID09IEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfREVGQVVMVCkpIHsKICAgICAgICAgLy90ZXN0IHNvbmljIHNwZWNpZmljIGNvbnN0cmFpbnRzCiAgICAgICAgIHJldHVybiBwbGF5YmFja1JhdGUubVNwZWVkID49IFRJTUVTVFJFVENIX1NPTklDX1NQRUVEX01JTiAmJgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCAxOGFjZWY3Li4zODU2ODE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDE0IEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgbGliYXVkaW9wcm9jZXNzaW5nCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icAppbmRleCAxZGY0N2I3Li44ZmI2ZmZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfZnV6eiB7CiAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfcmVzYW1wbGVyX2Z1enplciIsCiAgIHNyY3M6IFsKQEAgLTgsMyArMTcsMTQgQEAKICAgICAibGlic25kZmlsZSIsCiAgIF0sCiB9CisKK2NjX2Z1enogeworICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplciIsCisgIHNyY3M6IFsKKyAgICAibGliYXVkaW9wcm9jZXNzaW5nX3JlY29yZF9idWZmZXJfY29udmVydGVyX2Z1enplci5jcHAiLAorICBdLAorICBkZWZhdWx0czogWyJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyJdLAorICBzdGF0aWNfbGliczogWworICAgICJsaWJzbmRmaWxlIiwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX2Z1enpfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY1OTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfZnV6el91dGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTElCQVVESU9QUk9DRVNTSU5HX0ZVWlpfVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0xJQkFVRElPUFJPQ0VTU0lOR19GVVpaX1VUSUxTX0gKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQcm92aWRlciA6IHB1YmxpYyBBdWRpb0J1ZmZlclByb3ZpZGVyIHsKKyAgY29uc3Qgdm9pZCogbUFkZHI7ICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgY29uc3Qgc2l6ZV90IG1OdW1GcmFtZXM7ICAvLyB0b3RhbCBmcmFtZXMKKyAgY29uc3Qgc2l6ZV90IG1GcmFtZVNpemU7ICAvLyBzaXplIG9mIGVhY2ggZnJhbWUgaW4gYnl0ZXMKKyAgc2l6ZV90IG1OZXh0RnJhbWU7ICAgICAgICAvLyBpbmRleCBvZiBuZXh0IGZyYW1lIHRvIHByb3ZpZGUKKyAgc2l6ZV90IG1VbnJlbDsgICAgICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIG5vdCB5ZXQgcmVsZWFzZWQKKyBwdWJsaWM6CisgIFByb3ZpZGVyKGNvbnN0IHZvaWQqIGFkZHIsIHNpemVfdCBmcmFtZXMsIHNpemVfdCBmcmFtZVNpemUpCisgICAgICA6IG1BZGRyKGFkZHIpLAorICAgICAgICBtTnVtRnJhbWVzKGZyYW1lcyksCisgICAgICAgIG1GcmFtZVNpemUoZnJhbWVTaXplKSwKKyAgICAgICAgbU5leHRGcmFtZSgwKSwKKyAgICAgICAgbVVucmVsKDApIHt9CisgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWUpIHsKKyAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IG1OdW1GcmFtZXMgLSBtTmV4dEZyYW1lOworICAgIH0KKyAgICBtVW5yZWwgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgaWYgKGJ1ZmZlci0+ZnJhbWVDb3VudCA+IDApIHsKKyAgICAgIGJ1ZmZlci0+cmF3ID0gKGNoYXIqKW1BZGRyICsgbUZyYW1lU2l6ZSAqIG1OZXh0RnJhbWU7CisgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1ZmZlci0+cmF3ID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICB9CisgIHZvaWQgcmVsZWFzZUJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtVW5yZWwpIHsKKyAgICAgIG1OZXh0RnJhbWUgKz0gbVVucmVsOworICAgICAgbVVucmVsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgbU5leHRGcmFtZSArPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgICBtVW5yZWwgLT0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgIH0KKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgIGJ1ZmZlci0+cmF3ID0gbnVsbHB0cjsKKyAgfQorICB2b2lkIHJlc2V0KCkgeyBtTmV4dEZyYW1lID0gMDsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9MSUJBVURJT1BST0NFU1NJTkdfRlVaWl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19yZWNvcmRfYnVmZmVyX2NvbnZlcnRlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVjb3JkX2J1ZmZlcl9jb252ZXJ0ZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc1OThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVjb3JkX2J1ZmZlcl9jb252ZXJ0ZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJsaWJhdWRpb3Byb2Nlc3NpbmdfZnV6el91dGlscy5oIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3RleHByIGludCBNQVhfRlJBTUVTID0gMTAyNDsKKworI2RlZmluZSBBVURJT19GT1JNQVRfUENNX01BSU4gMAorCisvLyBDb3BpZWQgYW5kIHNpbXBsaWZpZWQgZnJvbSBhdWRpby1oYWwtZW51bXMuaD9sPTU3MQorY29uc3RleHByIHVpbnQzMl90IEZVWlpfQVVESU9fRk9STUFUU1tdID0geworICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl8xNl9CSVQsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiB8IEFVRElPX0ZPUk1BVF9QQ01fU1VCXzhfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl8zMl9CSVQsCisgIEFVRElPX0ZPUk1BVF9QQ01fTUFJTiB8IEFVRElPX0ZPUk1BVF9QQ01fU1VCXzhfMjRfQklULAorICBBVURJT19GT1JNQVRfUENNX01BSU4gfCBBVURJT19GT1JNQVRfUENNX1NVQl9GTE9BVCwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOIHwgQVVESU9fRk9STUFUX1BDTV9TVUJfMjRfQklUX1BBQ0tFRCwKKyAgMHgwMTAwMDAwMHUsCisgIDB4MDIwMDAwMDB1LAorICAweDAzMDAwMDAwdSwKKyAgMHgwNDAwMDAwMHUsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9NQUlOLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTEMsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9TU1IsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MVFAsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9IRV9WMSwKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX1NDQUxBQkxFLAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfRVJMQywKKyAgQVVESU9fRk9STUFUX0FBQyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xELAorICBBVURJT19GT1JNQVRfQUFDIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjIsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9FTEQsCisgIEFVRElPX0ZPUk1BVF9BQUMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9YSEUsCisgIDB4MDUwMDAwMDB1LAorICAweDA2MDAwMDAwdSwKKyAgMHgwNzAwMDAwMHUsCisgIDB4MDgwMDAwMDB1LAorICAweDA5MDAwMDAwdSwKKyAgMHgwQTAwMDAwMHUsCisgIEFVRElPX0ZPUk1BVF9FX0FDMyB8IEFVRElPX0ZPUk1BVF9FX0FDM19TVUJfSk9DLAorICAweDBCMDAwMDAwdSwKKyAgMHgwQzAwMDAwMHUsCisgIDB4MEQwMDAwMDB1LAorICAweDBFMDAwMDAwdSwKKyAgMHgxMDAwMDAwMHUsCisgIDB4MTEwMDAwMDB1LAorICAweDEyMDAwMDAwdSwKKyAgMHgxMzAwMDAwMHUsCisgIDB4MTQwMDAwMDB1LAorICAweDE1MDAwMDAwdSwKKyAgMHgxNjAwMDAwMHUsCisgIDB4MTcwMDAwMDB1LAorICAweDE4MDAwMDAwdSwKKyAgMHgxOTAwMDAwMHUsCisgIDB4MUEwMDAwMDB1LAorICAweDFCMDAwMDAwdSwKKyAgMHgxQzAwMDAwMHUsCisgIDB4MUQwMDAwMDB1LAorICAweDFFMDAwMDAwdSwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTUFJTiwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTEMsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX1NTUiwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfTFRQLAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9IRV9WMSwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfU0NBTEFCTEUsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0VSTEMsCisgIEFVRElPX0ZPUk1BVF9BQUNfQURUUyB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0xELAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9IRV9WMiwKKyAgQVVESU9fRk9STUFUX0FBQ19BRFRTIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfRUxELAorICBBVURJT19GT1JNQVRfQUFDX0FEVFMgfCBBVURJT19GT1JNQVRfQUFDX1NVQl9YSEUsCisgIDB4MUYwMDAwMDB1LAorICAweDIwMDAwMDAwdSwKKyAgMHgyMTAwMDAwMHUsCisgIDB4MjIwMDAwMDB1LAorICAweDIzMDAwMDAwdSwKKyAgMHgyNDAwMDAwMHUsCisgIEFVRElPX0ZPUk1BVF9NQVQgfCBBVURJT19GT1JNQVRfTUFUX1NVQl8xXzAsCisgIEFVRElPX0ZPUk1BVF9NQVQgfCBBVURJT19GT1JNQVRfTUFUX1NVQl8yXzAsCisgIEFVRElPX0ZPUk1BVF9NQVQgfCBBVURJT19GT1JNQVRfTUFUX1NVQl8yXzEsCisgIDB4MjUwMDAwMDB1LAorICBBVURJT19GT1JNQVRfQUFDX0xBVE0gfCBBVURJT19GT1JNQVRfQUFDX1NVQl9MQywKKyAgQVVESU9fRk9STUFUX0FBQ19MQVRNIHwgQVVESU9fRk9STUFUX0FBQ19TVUJfSEVfVjEsCisgIEFVRElPX0ZPUk1BVF9BQUNfTEFUTSB8IEFVRElPX0ZPUk1BVF9BQUNfU1VCX0hFX1YyLAorICAweDI2MDAwMDAwdSwKKyAgMHgyNzAwMDAwMHUsCisgIDB4MjgwMDAwMDB1LAorICAweDI5MDAwMDAwdSwKKyAgMHgyQTAwMDAwMHUsCisgIDB4MkIwMDAwMDB1LAorICAweEZGRkZGRkZGdSwKKyAgQVVESU9fRk9STUFUX1BDTV9NQUlOLAorICBBVURJT19GT1JNQVRfUENNLAorfTsKK2NvbnN0ZXhwciBzaXplX3QgTlVNX0FVRElPX0ZPUk1BVFMgPSBzdGQ6OnNpemUoRlVaWl9BVURJT19GT1JNQVRTKTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwKGRhdGEsIHNpemUpOworICBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKworICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBzcmNDaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc3JjRm9ybWF0ID0KKyAgICAgIChhdWRpb19mb3JtYXRfdClGVVpaX0FVRElPX0ZPUk1BVFNbZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBOVU1fQVVESU9fRk9STUFUUyAtIDEpXTsKKyAgY29uc3QgdWludDMyX3Qgc3JjU2FtcGxlUmF0ZSA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMSwgMHg3ZmZmZmZmZik7CisgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KWZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICBjb25zdCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQgPQorICAgICAgKGF1ZGlvX2Zvcm1hdF90KUZVWlpfQVVESU9fRk9STUFUU1tmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQ+KDAsIE5VTV9BVURJT19GT1JNQVRTIC0gMSldOworICBjb25zdCB1aW50MzJfdCBkc3RTYW1wbGVSYXRlID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigxLCAweDdmZmZmZmZmKTsKKworICAvLyBDZXJ0YWluIGZvcm1hdHMgd2lsbCByZXN1bHQgaW4gTE9HX0FMV0FZU19GQVRBTCBlcnJvcnMgdGhhdCBhcmVuJ3QgaW50ZXJlc3RpbmcgY3Jhc2hlcworICAvLyBmb3IgZnV6emluZy4gIERvbid0IHVzZSB0aG9zZSBvbmVzLgorICBjb25zdCB1aW50MzJfdCBkc3RDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhkc3RDaGFubmVsTWFzayk7CisgIGNvbnN0ZXhwciBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSA9CisgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOworICBjb25zdCBpbnQgbWF4Q2hhbm5lbHMgPQorICAgICAgcXVhbGl0eSA8IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFkgPyAyIDogODsKKyAgaWYgKGRzdENoYW5uZWxDb3VudCA8IDEgfHwgZHN0Q2hhbm5lbENvdW50ID4gbWF4Q2hhbm5lbHMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IHVpbnQzMl90IHNyY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHNyY0NoYW5uZWxNYXNrKTsKKyAgaWYgKHNyY0NoYW5uZWxDb3VudCA8IDEgfHwgc3JjQ2hhbm5lbENvdW50ID4gbWF4Q2hhbm5lbHMpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb252ZXJ0ZXIoc3JjQ2hhbm5lbE1hc2ssIHNyY0Zvcm1hdCwgc3JjU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFubmVsTWFzaywgZHN0Rm9ybWF0LCBkc3RTYW1wbGVSYXRlKTsKKyAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgIHJldHVybiAwOworICB9CisKKyAgY29uc3QgdWludDMyX3Qgc3JjRnJhbWVTaXplID0gc3JjQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShzcmNGb3JtYXQpOworICBjb25zdCBpbnQgc3JjTnVtRnJhbWVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCBNQVhfRlJBTUVTKTsKKyAgY29uc3RleHByIHNpemVfdCBtZXRhZGF0YVNpemUgPSAyICsgMyAqIHNpemVvZihpbnQpICsgMiAqIHNpemVvZihmbG9hdCk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlucHV0RGF0YSA9IGZkcC5Db25zdW1lQnl0ZXM8dWludDhfdD4oCisgICAgICBtZXRhZGF0YVNpemUgKyAoc3JjRnJhbWVTaXplICogc3JjTnVtRnJhbWVzKSk7CisgIFByb3ZpZGVyIHByb3ZpZGVyKGlucHV0RGF0YS5kYXRhKCksIHNyY051bUZyYW1lcywgc3JjRnJhbWVTaXplKTsKKworICBjb25zdCB1aW50MzJfdCBkc3RGcmFtZVNpemUgPSBkc3RDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGRzdEZvcm1hdCk7CisgIGNvbnN0IHNpemVfdCBmcmFtZXMgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9GUkFNRVMgKyAxKTsKKyAgaW50OF90IGRzdFtkc3RGcmFtZVNpemUgKiBmcmFtZXNdOworICBtZW1zZXQoZHN0LCAwLCBzaXplb2YoaW50OF90KSAqIGRzdEZyYW1lU2l6ZSAqIGZyYW1lcyk7CisKKyAgLy8gQWRkIGEgc21hbGwgbnVtYmVyIG9mIGxvb3BzIHRvIHNlZSBpZiByZXBlYXRlZCBjYWxscyB0byBjb252ZXJ0IGNhdXNlCisgIC8vIGFueSBjaGFuZ2UgaW4gYmVoYXZpb3IuCisgIGNvbnN0IGludCBudW1Mb29wcyA9IGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludD4oMSwgMyk7CisgIGZvciAoaW50IGxvb3AgPSAwOyBsb29wIDwgbnVtTG9vcHM7ICsrbG9vcCkgeworICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50PigwLCAxKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBjb252ZXJ0ZXIucmVzZXQoKTsKKyAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICBjYXNlIDE6CisgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KGRzdCwgJnByb3ZpZGVyLCBmcmFtZXMpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVzYW1wbGVyX2Z1enplci5jcHAKaW5kZXggOTM4YzYxMC4uNjVjOWEzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVzYW1wbGVyX2Z1enplci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9saWJhdWRpb3Byb2Nlc3NpbmdfcmVzYW1wbGVyX2Z1enplci5jcHAKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgImxpYmF1ZGlvcHJvY2Vzc2luZ19mdXp6X3V0aWxzLmgiCisKICNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwpAQCAtNTMsNDYgKzU1LDYgQEAKICAgICBBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKIH07CiAKLWNsYXNzIFByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotICBjb25zdCB2b2lkKiBtQWRkcjsgICAgICAgIC8vIGJhc2UgYWRkcmVzcwotICBjb25zdCBzaXplX3QgbU51bUZyYW1lczsgIC8vIHRvdGFsIGZyYW1lcwotICBjb25zdCBzaXplX3QgbUZyYW1lU2l6ZTsgIC8vIHNpemUgb2YgZWFjaCBmcmFtZSBpbiBieXRlcwotICBzaXplX3QgbU5leHRGcmFtZTsgICAgICAgIC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gcHJvdmlkZQotICBzaXplX3QgbVVucmVsOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgbm90IHlldCByZWxlYXNlZAotIHB1YmxpYzoKLSAgUHJvdmlkZXIoY29uc3Qgdm9pZCogYWRkciwgc2l6ZV90IGZyYW1lcywgc2l6ZV90IGZyYW1lU2l6ZSkKLSAgICAgIDogbUFkZHIoYWRkciksCi0gICAgICAgIG1OdW1GcmFtZXMoZnJhbWVzKSwKLSAgICAgICAgbUZyYW1lU2l6ZShmcmFtZVNpemUpLAotICAgICAgICBtTmV4dEZyYW1lKDApLAotICAgICAgICBtVW5yZWwoMCkge30KLSAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGUgewotICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgewotICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWU7Ci0gICAgfQotICAgIG1VbnJlbCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgewotICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciopbUFkZHIgKyBtRnJhbWVTaXplICogbU5leHRGcmFtZTsKLSAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgYnVmZmVyLT5yYXcgPSBudWxscHRyOwotICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKLSAgICB9Ci0gIH0KLSAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIHsKLSAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7Ci0gICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKLSAgICAgIG1VbnJlbCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICB9Ci0gICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7Ci0gIH0KLSAgdm9pZCByZXNldCgpIHsgbU5leHRGcmFtZSA9IDA7IH0KLX07Ci0KIGF1ZGlvX2Zvcm1hdF90IGNob29zZUZvcm1hdChBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlucHV0X2J5dGUpIHsKICAgc3dpdGNoIChxdWFsaXR5KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvbWl4ZXJvcHNfYmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCmluZGV4IDg2ZjU0MjkuLjdhNGM1YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9taXhlcm9wc19iZW5jaG1hcmsuY3BwCkBAIC03NCwyOCArNzQsMzIgQEAKICAgICB9CiB9CiAKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVEksIDIpOwotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgMik7CisvLyBNVUxUSSBtb2RlIGFuZCBNVUxUSV9TQVZFT05MWSBtb2RlIGFyZSBub3QgdXNlZCBieSBBdWRpb01peGVyIGZvciBjaGFubmVscyA+IDIsCisvLyB3aGljaCBpcyBlbnN1cmVkIGJ5IGEgc3RhdGljX2Fzc2VydCAod29uJ3QgY29tcGlsZSBmb3IgdGhvc2UgY29uZmlndXJhdGlvbnMpLgorLy8gU28gd2UgYmVuY2htYXJrIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCBhbmQgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MIGNvbXBhcmVkCisvLyB3aXRoIE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MIGFuZCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTC4KK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCwgMik7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wsIDIpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDIpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wsIDIpOwogCi1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJLCA0KTsKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIDQpOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9NT05PVk9MLCA0KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfTU9OT1ZPTCwgNCk7CiBCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NURVJFT1ZPTCwgNCk7CiBCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTCwgNCk7CiAKLUJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVEksIDUpOwotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgNSk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX01PTk9WT0wsIDUpOworQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLCA1KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU1RFUkVPVk9MLCA1KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfU0FWRU9OTFlfU1RFUkVPVk9MLCA1KTsKIAotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSSwgOCk7Ci1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCA4KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVSYW1wTXVsdGksIE1JWFRZUEVfTVVMVElfTU9OT1ZPTCwgOCk7CitCRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lUmFtcE11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX01PTk9WT0wsIDgpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDgpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZVJhbXBNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9TVEVSRU9WT0wsIDgpOwogCi1CRU5DSE1BUktfVEVNUExBVEUoQk1fVm9sdW1lTXVsdGksIE1JWFRZUEVfTVVMVEksIDgpOwotQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZU11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCA4KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVNdWx0aSwgTUlYVFlQRV9NVUxUSV9NT05PVk9MLCA4KTsKK0JFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVNdWx0aSwgTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MLCA4KTsKIEJFTkNITUFSS19URU1QTEFURShCTV9Wb2x1bWVNdWx0aSwgTUlYVFlQRV9NVUxUSV9TVEVSRU9WT0wsIDgpOwogQkVOQ0hNQVJLX1RFTVBMQVRFKEJNX1ZvbHVtZU11bHRpLCBNSVhUWVBFX01VTFRJX1NBVkVPTkxZX1NURVJFT1ZPTCwgOCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LW1peGVyLmNwcAppbmRleCBiYzlkMmE2Li4xYmJiODYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1taXhlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCkBAIC0yNDEsNyArMjQxLDggQEAKICAgICAvLyBzZXQgdXAgdGhlIHRyYWNrcy4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByb3ZpZGVycy5zaXplKCk7ICsraSkgewogICAgICAgICAvL3ByaW50ZigidHJhY2sgJWQgb3V0IG9mICVkXG4iLCBpLCBwcm92aWRlcnMuc2l6ZSgpKTsKLSAgICAgICAgdWludDMyX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocHJvdmlkZXJzW2ldLmdldE51bUNoYW5uZWxzKCkpOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHByb3ZpZGVyc1tpXS5nZXROdW1DaGFubmVscygpKTsKICAgICAgICAgY29uc3QgaW50IG5hbWUgPSBpOwogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBtaXhlci0+Y3JlYXRlKAogICAgICAgICAgICAgICAgIG5hbWUsIGNoYW5uZWxNYXNrLCBmb3JtYXRzW2ldLCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQuYnAKaW5kZXggNmU4Y2ExZC4uMWFiMWRlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJjcHVzdGF0cyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcCBiL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAppbmRleCA0Yjc1NDlmLi5lNzFhN2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKKysrIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmRhdGFzb3VyY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvQW5kcm9pZC5icAppbmRleCBmMTkxYzIxLi5lMGM2ODA4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJkYXRhc291cmNlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmRhdGFzb3VyY2UiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJkYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5LmNwcCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCmluZGV4IGJiNmEwOGMuLmY5MWUzZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCkBAIC02NSw2ICs2NSw5IEBACiAgICAgICAgIHNwPEhUVFBCYXNlPiBtZWRpYUhUVFAgPSBodHRwU291cmNlOwogICAgICAgICBpZiAobWVkaWFIVFRQID09IE5VTEwpIHsKICAgICAgICAgICAgIG1lZGlhSFRUUCA9IHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KENyZWF0ZU1lZGlhSFRUUChodHRwU2VydmljZSkuZ2V0KCkpOworICAgICAgICAgICAgaWYgKG1lZGlhSFRUUCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwppbmRleCA3ZjlhZTgxLi5iNzgzMmVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUworKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMSw0ICsxLDMgQEAKIGh1bmdhQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQogcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icAppbmRleCA4NDkzZTMwLi5iMDJkY2I2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTEsNCArMSwxMyBAQAogLy8gRWZmZWN0IGNvbmZpZ3VyYXRpb24KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmVmZmVjdHNjb25maWciLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKaW5kZXggMjZlYWFmOC4uMTY5NjIzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIHRlbXBsYXRlIDw+CiBib29sIHN0cmluZ1RvU3RyZWFtVHlwZShjb25zdCBjaGFyICpzdHJlYW1OYW1lLCBhdWRpb19kZXZpY2VzX3QqIHR5cGUpIHsKLSAgICByZXR1cm4gZGV2aWNlRnJvbVN0cmluZyhzdHJlYW1OYW1lLCAqdHlwZSk7CisgICAgcmV0dXJuIERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1OYW1lLCAqdHlwZSk7CiB9CiAKIC8qKiBQYXJzZSBhIGxpYnJhcnkgeG1sIG5vdGUgYW5kIHB1c2ggdGhlIHJlc3VsdCBpbiBsaWJyYXJpZXMgb3IgcmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUuICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwKaW5kZXggMmU1ZjUyOS4uOTNhMjE4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLnhtbApAQCAtMjEsNiArMjEsNyBAQAogICAgICAgICA8bGlicmFyeSBuYW1lPSJkb3dubWl4IiBwYXRoPSJsaWJkb3dubWl4LnNvIi8+CiAgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImxvdWRuZXNzX2VuaGFuY2VyIiBwYXRoPSJsaWJsZG5obmNyLnNvIi8+CiAgICAgICAgIDxsaWJyYXJ5IG5hbWU9ImR5bmFtaWNzX3Byb2Nlc3NpbmciIHBhdGg9ImxpYmR5bnByb2Muc28iLz4KKyAgICAgICAgPGxpYnJhcnkgbmFtZT0iaGFwdGljX2dlbmVyYXRvciIgcGF0aD0ibGliaGFwdGljZ2VuZXJhdG9yLnNvIi8+CiAgICAgPC9saWJyYXJpZXM+CiAKICAgICA8IS0tIGxpc3Qgb2YgZWZmZWN0cyB0byBsb2FkLgpAQCAtNTgsNiArNTksNyBAQAogICAgICAgICA8ZWZmZWN0IG5hbWU9ImRvd25taXgiIGxpYnJhcnk9ImRvd25taXgiIHV1aWQ9IjkzZjA0NDUyLWU0ZmUtNDFjYy05MWY5LWU0NzViNmQxZDY5ZiIvPgogICAgICAgICA8ZWZmZWN0IG5hbWU9ImxvdWRuZXNzX2VuaGFuY2VyIiBsaWJyYXJ5PSJsb3VkbmVzc19lbmhhbmNlciIgdXVpZD0iZmE0MTUzMjktMjAzNC00YmVhLWI1ZGMtNWIzODFjOGQxZTJjIi8+CiAgICAgICAgIDxlZmZlY3QgbmFtZT0iZHluYW1pY3NfcHJvY2Vzc2luZyIgbGlicmFyeT0iZHluYW1pY3NfcHJvY2Vzc2luZyIgdXVpZD0iZTBlNjUzOWItMTc4MS03MjYxLTY3NmYtNmQ3NTczNjk2MzQwIi8+CisgICAgICAgIDxlZmZlY3QgbmFtZT0iaGFwdGljX2dlbmVyYXRvciIgbGlicmFyeT0iaGFwdGljX2dlbmVyYXRvciIgdXVpZD0iOTdjNGFjZDEtOGI4Mi00ZjJmLTgzMmUtYzJmZTVkN2E5OTMxIi8+CiAgICAgPC9lZmZlY3RzPgogCiAgICAgPCEtLSBBdWRpbyBwcmUgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb25zLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAppbmRleCAyYTJmMzZlLi5iMjZkMDI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icApAQCAtMSw5ICsxLDI4IEBACiAvLyBNdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgbGlicmFyeQotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJkb3dubWl4IiwKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2Rvd25taXhfbGljZW5zZSIsCisgICAgXSwKK30KIAorLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19kb3dubWl4X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJkb3dubWl4IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICB2ZW5kb3I6IHRydWUsCi0gICAgc3JjczogWyJFZmZlY3REb3dubWl4LmMiXSwKKyAgICBzcmNzOiBbIkVmZmVjdERvd25taXguY3BwIl0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0xNCw3ICszMyw2IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlVJTERfRkxPQVQiLAogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWFjNGY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdERvd25taXgiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLQotI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKLQotLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYIGRlZmluZWQsIHN0cmljdGx5IGZvciB0ZXN0aW5nCi0vLyNkZWZpbmUgRE9XTk1JWF9URVNUX0NIQU5ORUxfSU5ERVggMAotLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwotLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotI2RlZmluZSBNSU5VU18zX0RCX0lOX0ZMT0FUIDAuNzA3MTA2NzhmIC8vIC0zZEIgPSAwLjcwNzEwNjc4ZgotY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0jZWxzZQotI2RlZmluZSBNSU5VU18zX0RCX0lOX1ExOV8xMiAyODk2IC8vIC0zZEIgPSAwLjcwNyAqIDJeMTIgPSAyODk2Ci1jb25zdCBhdWRpb19mb3JtYXRfdCBnVGFyZ2V0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0jZW5kaWYKLQotLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgotdHlwZWRlZiBlbnVtIHsKLSAgICBDSEFOTkVMX01BU0tfUVVBRF9CQUNLID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAotICAgIENIQU5ORUxfTUFTS19RVUFEX1NJREUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCi0gICAgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKLSAgICBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAotICAgIENIQU5ORUxfTUFTS183UE9JTlQxID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKLX0gZG93bm1peF9pbnB1dF9jaGFubmVsX21hc2tfdDsKLQotLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZG93bm1peCBlZmZlY3QKLWNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0Rvd25taXhJbnRlcmZhY2UgPSB7Ci0gICAgICAgIERvd25taXhfUHJvY2VzcywKLSAgICAgICAgRG93bm1peF9Db21tYW5kLAotICAgICAgICBEb3dubWl4X0dldERlc2NyaXB0b3IsCi0gICAgICAgIE5VTEwgLyogbm8gcHJvY2Vzc19yZXZlcnNlIGZ1bmN0aW9uLCBubyByZWZlcmVuY2Ugc3RyZWFtIG5lZWRlZCAqLwotfTsKLQotLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAotX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgLm5hbWUgPSAiRG93bm1peCBMaWJyYXJ5IiwKLSAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgLmNyZWF0ZV9lZmZlY3QgPSBEb3dubWl4TGliX0NyZWF0ZSwKLSAgICAucmVsZWFzZV9lZmZlY3QgPSBEb3dubWl4TGliX1JlbGVhc2UsCi0gICAgLmdldF9kZXNjcmlwdG9yID0gRG93bm1peExpYl9HZXREZXNjcmlwdG9yLAotfTsKLQotCi0vLyBBT1NQIGluc2VydCBkb3dubWl4IFVVSUQ6IDkzZjA0NDUyLWU0ZmUtNDFjYy05MWY5LWU0NzViNmQxZDY5Zgotc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0Rvd25taXhEZXNjcmlwdG9yID0gewotICAgICAgICBFRkZFQ1RfVUlJRF9ET1dOTUlYX18sIC8vdHlwZQotICAgICAgICB7MHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fSwgLy8gdXVpZAotICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfRklSU1QsCi0gICAgICAgIDAsIC8vRklYTUUgd2hhdCB2YWx1ZSBzaG91bGQgYmUgcmVwb3J0ZWQ/IC8vIGNwdSBsb2FkCi0gICAgICAgIDAsIC8vRklYTUUgd2hhdCB2YWx1ZSBzaG91bGQgYmUgcmVwb3J0ZWQ/IC8vIG1lbW9yeSB1c2FnZQotICAgICAgICAiTXVsdGljaGFubmVsIERvd25taXggVG8gU3RlcmVvIiwgLy8gaHVtYW4gcmVhZGFibGUgZWZmZWN0IG5hbWUKLSAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBpbXBsZW1lbnRvciBuYW1lCi19OwotCi0vLyBnRGVzY3JpcHRvcnMgY29udGFpbnMgcG9pbnRlcnMgdG8gYWxsIGRlZmluZWQgZWZmZWN0IGRlc2NyaXB0b3IgaW4gdGhpcyBsaWJyYXJ5Ci1zdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqIGNvbnN0IGdEZXNjcmlwdG9yc1tdID0gewotICAgICAgICAmZ0Rvd25taXhEZXNjcmlwdG9yCi19OwotCi0vLyBudW1iZXIgb2YgZWZmZWN0cyBpbiB0aGlzIGxpYnJhcnkKLWNvbnN0IGludCBrTmJFZmZlY3RzID0gc2l6ZW9mKGdEZXNjcmlwdG9ycykgLyBzaXplb2YoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKTsKLSNpZmRlZiBCVUlMRF9GTE9BVAotc3RhdGljIExWTV9GTE9BVCBjbGFtcF9mbG9hdChMVk1fRkxPQVQgYSkgewotICAgIGlmIChhID4gMS4wZikgewotICAgICAgICByZXR1cm4gMS4wZjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYSA8IC0xLjBmKSB7Ci0gICAgICAgIHJldHVybiAtMS4wZjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiBhOwotICAgIH0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUZXN0IGNvZGUKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIERPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYCi0vLyBzdHJpY3RseSBmb3IgdGVzdGluZywgbG9ncyB0aGUgaW5kaWNlcyBvZiB0aGUgY2hhbm5lbHMgZm9yIGEgZ2l2ZW4gbWFzaywKLS8vIHVzZXMgdGhlIHNhbWUgY29kZSBhcyBEb3dubWl4X2ZvbGRHZW5lcmljKCkKLXZvaWQgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbih1aW50MzJfdCBtYXNrKSB7Ci0gICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yIDB4JSIgUFJJeDMyICI6IiwgbWFzayk7Ci0gICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscwotICAgIGlmIChtYXNrICYga1Vuc3VwcG9ydGVkKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyAodG9wIG9yIGZyb250IGxlZnQvcmlnaHQgb2YgY2VudGVyKSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIHZlcmlmeSBoYXMgRkwvRlIKLSAgICBpZiAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgewotICAgICAgICBBTE9HRSgiRnJvbnQgY2hhbm5lbHMgbXVzdCBiZSBwcmVzZW50Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gdmVyaWZ5IHVzZXMgU0lERSBhcyBhIHBhaXIgKG9rIGlmIG5vdCB1c2luZyBTSURFIGF0IGFsbCkKLSAgICBib29sIGhhc1NpZGVzID0gZmFsc2U7Ci0gICAgaWYgKChtYXNrICYga1NpZGVzKSAhPSAwKSB7Ci0gICAgICAgIGlmICgobWFzayAmIGtTaWRlcykgIT0ga1NpZGVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2lkZSBjaGFubmVscyBtdXN0IGJlIHVzZWQgYXMgYSBwYWlyIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaGFzU2lkZXMgPSB0cnVlOwotICAgIH0KLSAgICAvLyB2ZXJpZnkgdXNlcyBCQUNLIGFzIGEgcGFpciAob2sgaWYgbm90IHVzaW5nIEJBQ0sgYXQgYWxsKQotICAgIGJvb2wgaGFzQmFja3MgPSBmYWxzZTsKLSAgICBpZiAoKG1hc2sgJiBrQmFja3MpICE9IDApIHsKLSAgICAgICAgaWYgKChtYXNrICYga0JhY2tzKSAhPSBrQmFja3MpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCYWNrIGNoYW5uZWxzIG11c3QgYmUgdXNlZCBhcyBhIHBhaXIiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBoYXNCYWNrcyA9IHRydWU7Ci0gICAgfQotCi0gICAgY29uc3QgaW50IG51bUNoYW4gPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobWFzayk7Ci0gICAgY29uc3QgYm9vbCBoYXNGQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKTsKLSAgICBjb25zdCBib29sIGhhc0xGRSA9Ci0gICAgICAgICAgICAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKSA9PSBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZKTsKLSAgICBjb25zdCBib29sIGhhc0JDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKTsKLSAgICAvLyBjb21wdXRlIGF0IHdoYXQgaW5kZXggZWFjaCBjaGFubmVsIGlzOiBzYW1wbGVzIHdpbGwgYmUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAgICAvLyAgIEZMIEZSIEZDIExGRSBCTCBCUiBCQyBTTCBTUgotICAgIC8vIHdoZW4gYSBjaGFubmVsIGlzIG5vdCBwcmVzZW50LCBpdHMgaW5kZXggaXMgc2V0IHRvIHRoZSBzYW1lIGFzIHRoZSBpbmRleCBvZiB0aGUgcHJlY2VkaW5nCi0gICAgLy8gY2hhbm5lbAotICAgIGNvbnN0IGludCBpbmRleEZDICA9IGhhc0ZDICAgID8gMiAgICAgICAgICAgIDogMTsgICAgICAgIC8vIGZyb250IGNlbnRlcgotICAgIGNvbnN0IGludCBpbmRleExGRSA9IGhhc0xGRSAgID8gaW5kZXhGQyArIDEgIDogaW5kZXhGQzsgIC8vIGxvdyBmcmVxdWVuY3kKLSAgICBjb25zdCBpbnQgaW5kZXhCTCAgPSBoYXNCYWNrcyA/IGluZGV4TEZFICsgMSA6IGluZGV4TEZFOyAvLyBiYWNrIGxlZnQKLSAgICBjb25zdCBpbnQgaW5kZXhCUiAgPSBoYXNCYWNrcyA/IGluZGV4QkwgKyAxICA6IGluZGV4Qkw7ICAvLyBiYWNrIHJpZ2h0Ci0gICAgY29uc3QgaW50IGluZGV4QkMgID0gaGFzQkMgICAgPyBpbmRleEJSICsgMSAgOiBpbmRleEJSOyAgLy8gYmFjayBjZW50ZXIKLSAgICBjb25zdCBpbnQgaW5kZXhTTCAgPSBoYXNTaWRlcyA/IGluZGV4QkMgKyAxICA6IGluZGV4QkM7ICAvLyBzaWRlIGxlZnQKLSAgICBjb25zdCBpbnQgaW5kZXhTUiAgPSBoYXNTaWRlcyA/IGluZGV4U0wgKyAxICA6IGluZGV4U0w7ICAvLyBzaWRlIHJpZ2h0Ci0KLSAgICBBTE9HSSgiICBGTCBGUiBGQyBMRkUgQkwgQlIgQkMgU0wgU1IiKTsKLSAgICBBTE9HSSgiICAgJWQgICVkICAlZCAgICVkICAlZCAgJWQgICVkICAlZCAgJWQiLAotICAgICAgICAgICAgMCwgMSwgaW5kZXhGQywgaW5kZXhMRkUsIGluZGV4QkwsIGluZGV4QlIsIGluZGV4QkMsIGluZGV4U0wsIGluZGV4U1IpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBib29sIERvd25taXhfdmFsaWRDaGFubmVsTWFzayh1aW50MzJfdCBtYXNrKQotewotICAgIGlmICghbWFzaykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIGNoZWNrIGFnYWluc3QgdW5zdXBwb3J0ZWQgY2hhbm5lbHMKLSAgICBpZiAobWFzayAmIGtVbnN1cHBvcnRlZCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY2hhbm5lbHMgKHRvcCBvciBmcm9udCBsZWZ0L3JpZ2h0IG9mIGNlbnRlcikiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyB2ZXJpZnkgaGFzIEZML0ZSCi0gICAgaWYgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHsKLSAgICAgICAgQUxPR0UoIkZyb250IGNoYW5uZWxzIG11c3QgYmUgcHJlc2VudCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIHZlcmlmeSB1c2VzIFNJREUgYXMgYSBwYWlyIChvayBpZiBub3QgdXNpbmcgU0lERSBhdCBhbGwpCi0gICAgaWYgKChtYXNrICYga1NpZGVzKSAhPSAwKSB7Ci0gICAgICAgIGlmICgobWFzayAmIGtTaWRlcykgIT0ga1NpZGVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU2lkZSBjaGFubmVscyBtdXN0IGJlIHVzZWQgYXMgYSBwYWlyIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gdmVyaWZ5IHVzZXMgQkFDSyBhcyBhIHBhaXIgKG9rIGlmIG5vdCB1c2luZyBCQUNLIGF0IGFsbCkKLSAgICBpZiAoKG1hc2sgJiBrQmFja3MpICE9IDApIHsKLSAgICAgICAgaWYgKChtYXNrICYga0JhY2tzKSAhPSBrQmFja3MpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCYWNrIGNoYW5uZWxzIG11c3QgYmUgdXNlZCBhcyBhIHBhaXIiKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBFZmZlY3QgQVBJIGltcGxlbWVudGF0aW9uCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCi0KLWludDMyX3QgRG93bm1peExpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQgX191bnVzZWQsCi0gICAgICAgIGludDMyX3QgaW9JZCBfX3VudXNlZCwKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7Ci0gICAgaW50IHJldDsKLSAgICBpbnQgaTsKLSAgICBkb3dubWl4X21vZHVsZV90ICptb2R1bGU7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKLQotICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpIik7Ci0KLSNpZmRlZiBET1dOTUlYX1RFU1RfQ0hBTk5FTF9JTkRFWAotICAgIC8vIHNob3VsZCB3b3JrICh3b24ndCBsb2cgYW4gZXJyb3IpCi0gICAgQUxPR0koIkRPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYOiBzaG91bGQgd29yazoiKTsKLSAgICBEb3dubWl4X3Rlc3RJbmRleENvbXB1dGF0aW9uKEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7Ci0gICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihDSEFOTkVMX01BU0tfUVVBRF9TSURFIHwgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSyk7Ci0gICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOwotICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSyB8IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKTsKLSAgICAvLyBzaG91bGRuJ3Qgd29yayAod2lsbCBsb2cgYW4gZXJyb3IsIHdvbid0IGRpc3BsYXkgY2hhbm5lbCBpbmRpY2VzKQotICAgIEFMT0dJKCJET1dOTUlYX1RFU1RfQ0hBTk5FTF9JTkRFWDogc2hvdWxkIE5PVCB3b3JrOiIpOwotICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQpOwotICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZIHwgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUKTsKLSAgICBEb3dubWl4X3Rlc3RJbmRleENvbXB1dGF0aW9uKEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCk7Ci0gICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUKTsKLSNlbmRpZgotCi0gICAgaWYgKHBIYW5kbGUgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMCA7IGkgPCBrTmJFZmZlY3RzIDsgaSsrKSB7Ci0gICAgICAgIGRlc2MgPSBnRGVzY3JpcHRvcnNbaV07Ci0gICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmRlc2MtPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA9PSBrTmJFZmZlY3RzKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIG1vZHVsZSA9IG1hbGxvYyhzaXplb2YoZG93bm1peF9tb2R1bGVfdCkpOwotCi0gICAgbW9kdWxlLT5pdGZlID0gJmdEb3dubWl4SW50ZXJmYWNlOwotCi0gICAgbW9kdWxlLT5jb250ZXh0LnN0YXRlID0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEOwotCi0gICAgcmV0ID0gRG93bm1peF9Jbml0KG1vZHVsZSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgQUxPR1coIkRvd25taXhMaWJfQ3JlYXRlKCkgaW5pdCBmYWlsZWQiKTsKLSAgICAgICAgZnJlZShtb2R1bGUpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdCkgbW9kdWxlOwotCi0gICAgQUxPR1YoIkRvd25taXhMaWJfQ3JlYXRlKCkgJXAgLCBzaXplICV6dSIsIG1vZHVsZSwgc2l6ZW9mKGRvd25taXhfbW9kdWxlX3QpKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLWludDMyX3QgRG93bm1peExpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKLSAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKiloYW5kbGU7Ci0KLSAgICBBTE9HVigiRG93bm1peExpYl9SZWxlYXNlKCkgJXAiLCBoYW5kbGUpOwotICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBwRHdtTW9kdWxlLT5jb250ZXh0LnN0YXRlID0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEOwotCi0gICAgZnJlZShwRHdtTW9kdWxlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQzMl90IERvd25taXhMaWJfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIEFMT0dWKCJEb3dubWl4TGliX0dldERlc2NyaXB0b3IoKSIpOwotICAgIGludCBpOwotCi0gICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKLSAgICAgICAgQUxPR0UoIkRvd25taXhMaWJfQ3JlYXRlKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBBTE9HVigiRG93bm1peExpYl9HZXREZXNjcmlwdG9yKCkgbmIgZWZmZWN0cz0lZCIsIGtOYkVmZmVjdHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBrTmJFZmZlY3RzOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIkRvd25taXhMaWJfR2V0RGVzY3JpcHRvcigpIGk9JWQiLCBpKTsKLSAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0Rlc2NyaXB0b3JzW2ldLT51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgIG1lbWNweShwRGVzY3JpcHRvciwgZ0Rlc2NyaXB0b3JzW2ldLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOwotICAgICAgICAgICAgQUxPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IgLSBVVUlEIG1hdGNoZWQgZG93bm1peCB0eXBlICVkLCBVVUlEID0gJSIgUFJJeDMyLAotICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAtRUlOVkFMOwotfQotCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0vKi0tLSBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KLQotc3RhdGljIGludCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCi0gICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgewotCi0gICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlcjsKLSAgICBpbnQxNl90ICpwU3JjLCAqcERzdDsKLSAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKilzZWxmOwotCi0gICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKLSAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAotICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcERvd25taXhlciA9IChkb3dubWl4X29iamVjdF90KikgJnBEd21Nb2R1bGUtPmNvbnRleHQ7Ci0KLSAgICBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYW4gdW5pbml0aWFsaXplZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfSBlbHNlIGlmIChwRG93bm1peGVyLT5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEKSB7Ci0gICAgICAgIEFMT0dFKCJEb3dubWl4X1Byb2Nlc3MgZXJyb3I6IHRyeWluZyB0byB1c2UgYSBub24tY29uZmlndXJlZCBkb3dubWl4ZXIiKTsKLSAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwotICAgIH0KLQotICAgIHBTcmMgPSBpbkJ1ZmZlci0+czE2OwotICAgIHBEc3QgPSBvdXRCdWZmZXItPnMxNjsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OwotCi0gICAgY29uc3QgYm9vbCBhY2N1bXVsYXRlID0KLSAgICAgICAgICAgIChwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7Ci0gICAgY29uc3QgdWludDMyX3QgZG93bm1peElucHV0Q2hhbm5lbE1hc2sgPSBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHM7Ci0KLSAgICBzd2l0Y2gocERvd25taXhlci0+dHlwZSkgewotCi0gICAgICBjYXNlIERPV05NSVhfVFlQRV9TVFJJUDoKLSAgICAgICAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgcFNyY1swXSk7Ci0gICAgICAgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgcFNyY1sxXSk7Ci0gICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7Ci0gICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBwU3JjWzBdOwotICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IHBTcmNbMV07Ci0gICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7Ci0gICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKLSNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKLSAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKLSAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwgZG93bm1peElucHV0Q2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgLy8gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gZm9ybWF0cwotICAgICAgICBzd2l0Y2goKGRvd25taXhfaW5wdXRfY2hhbm5lbF9tYXNrX3QpZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9CQUNLOgotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS19RVUFEX1NJREU6Ci0gICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tUXVhZChwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfQkFDSzoKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfNVBPSU5UMV9TSURFOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTVQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS183UE9JTlQxOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbTdQb2ludDEocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNdWx0aWNoYW5uZWwgY29uZmlndXJhdGlvbiAweCUiIFBSSXgzMiAiIGlzIG5vdCBzdXBwb3J0ZWQiLCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZWxzZSAvKkJVSUxEX0ZMT0FUKi8KLS8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLwotCi1zdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKLSAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLCBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKSB7Ci0KLSAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOwotICAgIExWTV9GTE9BVCAqcFNyYywgKnBEc3Q7Ci0gICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopc2VsZjsKLQotICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8Ci0gICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKLSAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OwotCi0gICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgewotICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGFuIHVuaW5pdGlhbGl6ZWQgZG93bm1peGVyIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0gZWxzZSBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgewotICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGEgbm9uLWNvbmZpZ3VyZWQgZG93bm1peGVyIik7Ci0gICAgICAgIHJldHVybiAtRU5PREFUQTsKLSAgICB9Ci0KLSAgICBwU3JjID0gKExWTV9GTE9BVCAqKSBpbkJ1ZmZlci0+czE2OwotICAgIHBEc3QgPSAoTFZNX0ZMT0FUICopIG91dEJ1ZmZlci0+czE2OwotICAgIHNpemVfdCBudW1GcmFtZXMgPSBvdXRCdWZmZXItPmZyYW1lQ291bnQ7Ci0KLSAgICBjb25zdCBib29sIGFjY3VtdWxhdGUgPQotICAgICAgICAgICAgKHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKLSAgICBjb25zdCB1aW50MzJfdCBkb3dubWl4SW5wdXRDaGFubmVsTWFzayA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKLQotICAgIHN3aXRjaChwRG93bm1peGVyLT50eXBlKSB7Ci0KLSAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX1NUUklQOgotICAgICAgICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgcFNyY1swXSk7Ci0gICAgICAgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIHBTcmNbMV0pOwotICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OwotICAgICAgICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICBwRHN0WzBdID0gcFNyY1swXTsKLSAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBwU3JjWzFdOwotICAgICAgICAgICAgICAgICAgcFNyYyArPSBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50OwotICAgICAgICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRE9XTk1JWF9UWVBFX0ZPTEQ6Ci0jaWZkZWYgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSCi0gICAgICAgICAgLy8gYnlwYXNzIHRoZSBvcHRpbWl6ZWQgZG93bm1peCByb3V0aW5lcyBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCi0gICAgICAgICAgaWYgKCFEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKLSAgICAgICAgICAgICAgQUxPR0UoIk11bHRpY2hhbm5lbCBjb25maWd1cmF0aW9uIDB4JSIgUFJJeDMyICIgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIC8vIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKLSAgICAgICAgc3dpdGNoKChkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190KWRvd25taXhJbnB1dENoYW5uZWxNYXNrKSB7Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLX1FVQURfQkFDSzoKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfUVVBRF9TSURFOgotICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5ORUxfTUFTS181UE9JTlQxX0JBQ0s6Ci0gICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLXzVQT0lOVDFfU0lERToKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb201UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDSEFOTkVMX01BU0tfN1BPSU5UMToKLSAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKLSAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gMHglIiBQUkl4MzIgIiBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBEb3dubWl4X0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgIHZvaWQgKnBDbWREYXRhLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0KLSAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKikgc2VsZjsKLSAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyOwotCi0gICAgaWYgKHBEd21Nb2R1bGUgPT0gTlVMTCB8fCBwRHdtTW9kdWxlLT5jb250ZXh0LnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBwRG93bm1peGVyID0gKGRvd25taXhfb2JqZWN0X3QqKSAmcER3bU1vZHVsZS0+Y29udGV4dDsKLQotICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCAlIiBQUkl1MzIgIiBjbWRTaXplICUiIFBSSXUzMiwgY21kQ29kZSwgY21kU2l6ZSk7Ci0KLSAgICBzd2l0Y2ggKGNtZENvZGUpIHsKLSAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKLSAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gRG93bm1peF9Jbml0KHBEd21Nb2R1bGUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpCi0gICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSBEb3dubWl4X0NvbmZpZ3VyZShwRHdtTW9kdWxlLAotICAgICAgICAgICAgICAgIChlZmZlY3RfY29uZmlnX3QgKilwQ21kRGF0YSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKLSAgICAgICAgRG93bm1peF9SZXNldChwRG93bm1peGVyLCBmYWxzZSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTToKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAlIiBQUkl1MzIgIiwgcFJlcGx5RGF0YTogJXAiLAotICAgICAgICAgICAgICAgIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8Ci0gICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChpbnQpIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcmVwID0gKGVmZmVjdF9wYXJhbV90ICopIHBSZXBseURhdGE7Ci0gICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcGFyYW0gJSIgUFJJZDMyICIsIHJlcGx5U2l6ZSAlIiBQUkl1MzIsCi0gICAgICAgICAgICAgICAgKihpbnQzMl90ICopcmVwLT5kYXRhLCByZXAtPnZzaXplKTsKLSAgICAgICAgcmVwLT5zdGF0dXMgPSBEb3dubWl4X2dldFBhcmFtZXRlcihwRG93bm1peGVyLCAqKGludDMyX3QgKilyZXAtPmRhdGEsICZyZXAtPnZzaXplLAotICAgICAgICAgICAgICAgIHJlcC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgcmVwLT52c2l6ZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOgotICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIGNtZFNpemUgJWQgcENtZERhdGEgJXAsICpyZXBseVNpemUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgIiwgcFJlcGx5RGF0YSAlcCIsIGNtZFNpemUsIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgKGNtZFNpemUgPCAoaW50KShzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkKLSAgICAgICAgICAgICAgICB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSAoaW50KXNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgZWZmZWN0X3BhcmFtX3QgKmNtZCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKLSAgICAgICAgaWYgKGNtZC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjYzNjYyOTM4Iik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBEb3dubWl4X3NldFBhcmFtZXRlcihwRG93bm1peGVyLCAqKGludDMyX3QgKiljbWQtPmRhdGEsCi0gICAgICAgICAgICAgICAgY21kLT52c2l6ZSwgY21kLT5kYXRhICsgc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNX0RFRkVSUkVEOgotICAgICAgICAvL0ZJWE1FIGltcGxlbWVudAotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQgbm90IHN1cHBvcnRlZCwgRklYTUUiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVDoKLSAgICAgICAgLy9GSVhNRSBpbXBsZW1lbnQKLSAgICAgICAgQUxPR1coIkRvd25taXhfQ29tbWFuZCBjb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCBub3Qgc3VwcG9ydGVkLCBGSVhNRSIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6Ci0gICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlICE9IERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOwotICAgICAgICB9Ci0gICAgICAgIHBEb3dubWl4ZXItPnN0YXRlID0gRE9XTk1JWF9TVEFURV9BQ1RJVkU7Ci0gICAgICAgIEFMT0dWKCJFRkZFQ1RfQ01EX0VOQUJMRSgpIE9LIik7Ci0gICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6Ci0gICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlICE9IERPV05NSVhfU1RBVEVfQUNUSVZFKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKLSAgICAgICAgfQotICAgICAgICBwRG93bm1peGVyLT5zdGF0ZSA9IERPV05NSVhfU1RBVEVfSU5JVElBTElaRUQ7Ci0gICAgICAgIEFMT0dWKCJFRkZFQ1RfQ01EX0RJU0FCTEUoKSBPSyIpOwotICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgotICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRklYTUUgY2hhbmdlIHR5cGUgaWYgcGxheWluZyBvbiBoZWFkc2V0IHZzIHNwZWFrZXIKLSAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6IDB4JTA4IiBQUkl4MzIsICoodWludDMyX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IHsKLSAgICAgICAgLy8gYXVkaW8gb3V0cHV0IGlzIGFsd2F5cyBzdGVyZW8gPT4gMiBjaGFubmVsIHZvbHVtZXMKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAoaW50KXNpemVvZih1aW50MzJfdCkgKiAyKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAvLyBGSVhNRSBjaGFuZ2Ugdm9sdW1lCi0gICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgbm90IHN1cHBvcnRlZCwgRklYTUUiKTsKLSAgICAgICAgZmxvYXQgbGVmdCA9IChmbG9hdCkoKih1aW50MzJfdCAqKXBDbWREYXRhKSAvICgxIDw8IDI0KTsKLSAgICAgICAgZmxvYXQgcmlnaHQgPSAoZmxvYXQpKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSkgLyAoMSA8PCAyNCk7Ci0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBsZWZ0ICVmLCByaWdodCAlZiAiLCBsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKLSAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAoaW50KXNpemVvZih1aW50MzJfdCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERTogJSIgUFJJdTMyLCAqKHVpbnQzMl90ICopcENtZERhdGEpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6Ci0gICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9JTlBVVF9ERVZJQ0U6Ci0gICAgICAgIC8vIHRoZXNlIGNvbW1hbmRzIGFyZSBpZ25vcmVkIGJ5IGEgZG93bm1peCBlZmZlY3QKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGludmFsaWQgY29tbWFuZCAlIiBQUkl1MzIsIGNtZENvZGUpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1pbnQgRG93bm1peF9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikKLXsKLSAgICBkb3dubWl4X21vZHVsZV90ICpwRHdubXhNb2R1bGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSBzZWxmOwotCi0gICAgaWYgKHBEd25teE1vZHVsZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBwRHdubXhNb2R1bGUtPmNvbnRleHQuc3RhdGUgPT0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG1lbWNweShwRGVzY3JpcHRvciwgJmdEb3dubWl4RGVzY3JpcHRvciwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRG93bm1peCBpbnRlcm5hbCBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfSW5pdCgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBJbml0aWFsaXplIGRvd25taXggY29udGV4dCBhbmQgYXBwbHkgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gKgotICogSW5wdXRzOgotICogIHBEd21Nb2R1bGUgICAgcG9pbnRlciB0byBkb3dubWl4IGVmZmVjdCBtb2R1bGUKLSAqCi0gKiBPdXRwdXRzOgotICoKLSAqIFJldHVybnM6Ci0gKiAgMCAgICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcwotICoKLSAqIFNpZGUgRWZmZWN0czoKLSAqICB1cGRhdGVzOgotICogICAgICAgICAgIHBEd21Nb2R1bGUtPmNvbnRleHQudHlwZQotICogICAgICAgICAgIHBEd21Nb2R1bGUtPmNvbnRleHQuYXBwbHlfdm9sdW1lX2NvcnJlY3Rpb24KLSAqICAgICAgICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcKLSAqICAgICAgICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnCi0gKiAgICAgICAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZQotICogICAgICAgICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCi0gKiAgICAgICAgICAgcER3bU1vZHVsZS0+Y29udGV4dC5zdGF0ZQotICogIGRvZXNuJ3Qgc2V0OgotICogICAgICAgICAgIHBEd21Nb2R1bGUtPml0ZmUKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1pbnQgRG93bm1peF9Jbml0KGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUpIHsKLQotICAgIEFMT0dWKCJEb3dubWl4X0luaXQgbW9kdWxlICVwIiwgcER3bU1vZHVsZSk7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBtZW1zZXQoJnBEd21Nb2R1bGUtPmNvbnRleHQsIDAsIHNpemVvZihkb3dubWl4X29iamVjdF90KSk7Ci0KLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKLQotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7Ci0KLSAgICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCi0gICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7Ci0KLSAgICByZXQgPSBEb3dubWl4X0NvbmZpZ3VyZShwRHdtTW9kdWxlLCAmcER3bU1vZHVsZS0+Y29uZmlnLCB0cnVlKTsKLSAgICBpZiAocmV0ICE9IDApIHsKLSAgICAgICAgQUxPR1YoIkRvd25taXhfSW5pdCBlcnJvciAlZCBvbiBtb2R1bGUgJXAiLCByZXQsIHBEd21Nb2R1bGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBEd21Nb2R1bGUtPmNvbnRleHQuc3RhdGUgPSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X0NvbmZpZ3VyZSgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiAgU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcER3bU1vZHVsZSAgcG9pbnRlciB0byBkb3dubWl4IGVmZmVjdCBtb2R1bGUKLSAqICBwQ29uZmlnICAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dAotICogICAgICAgICAgICAgICAgICBhbmQgb3V0cHV0IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbgotICogIGluaXQgICAgICAgIHRydWUgaWYgY2FsbGVkIGZyb20gaW5pdCBmdW5jdGlvbgotICoKLSAqIE91dHB1dHM6Ci0gKgotICogUmV0dXJuczoKLSAqICAwICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcwotICoKLSAqIFNpZGUgRWZmZWN0czoKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1pbnQgRG93bm1peF9Db25maWd1cmUoZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnLCBib29sIGluaXQpIHsKLQotICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIgPSAmcER3bU1vZHVsZS0+Y29udGV4dDsKLQotICAgIC8vIENoZWNrIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIGJ1aWxkIG9wdGlvbnMsIGFuZCBlZmZlY3QgY2FwYWJpbGl0aWVzCi0gICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyAhPSBET1dOTUlYX09VVFBVVF9DSEFOTkVMUwotICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gZ1RhcmdldEZvcm1hdAotICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQpIHsKLSAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnZhbGlkIGNvbmZpZyIpOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAoJnBEd21Nb2R1bGUtPmNvbmZpZyAhPSBwQ29uZmlnKSB7Ci0gICAgICAgIG1lbWNweSgmcER3bU1vZHVsZS0+Y29uZmlnLCBwQ29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7Ci0gICAgfQotCi0gICAgaWYgKGluaXQpIHsKLSAgICAgICAgcERvd25taXhlci0+dHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOwotICAgICAgICBwRG93bm1peGVyLT5hcHBseV92b2x1bWVfY29ycmVjdGlvbiA9IGZhbHNlOwotICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0gODsgLy8gbWF0Y2hlcyBkZWZhdWx0IGlucHV0IG9mIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBlZmZlY3QsIGRvIG5vdCBhbGxvdyBhIGJsYW5rIG9yIHVuc3VwcG9ydGVkIGNoYW5uZWwgbWFzawotICAgICAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW5wdXQgY2hhbm5lbCBtYXNrKDB4JXgpIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBwRG93bm1peGVyLT5pbnB1dF9jaGFubmVsX2NvdW50ID0KLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIH0KLQotICAgIERvd25taXhfUmVzZXQocERvd25taXhlciwgaW5pdCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfUmVzZXQoKQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBQdXJwb3NlOgotICogIFJlc2V0IGludGVybmFsIHN0YXRlcy4KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcERvd25taXhlciAgIHBvaW50ZXIgdG8gZG93bm1peCBjb250ZXh0Ci0gKiAgaW5pdCAgICAgICAgIHRydWUgaWYgY2FsbGVkIGZyb20gaW5pdCBmdW5jdGlvbgotICoKLSAqIE91dHB1dHM6Ci0qCi0gKiBSZXR1cm5zOgotICogIDAgICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcwotICoKLSAqIFNpZGUgRWZmZWN0czoKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1pbnQgRG93bm1peF9SZXNldChkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyIF9fdW51c2VkLCBib29sIGluaXQgX191bnVzZWQpIHsKLSAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfc2V0UGFyYW1ldGVyKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIFNldCBhIERvd25taXggcGFyYW1ldGVyCi0gKgotICogSW5wdXRzOgotICogIHBEb3dubWl4ZXIgICAgaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKLSAqICBwYXJhbSAgICAgICAgIHBhcmFtZXRlcgotICogIHBWYWx1ZSAgICAgICAgcG9pbnRlciB0byBwYXJhbWV0ZXIgdmFsdWUKLSAqICBzaXplICAgICAgICAgIHZhbHVlIHNpemUKLSAqCi0gKiBPdXRwdXRzOgotICoKLSAqIFJldHVybnM6Ci0gKiAgMCAgICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcwotICoKLSAqIFNpZGUgRWZmZWN0czoKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSkgewotCi0gICAgaW50MTZfdCB2YWx1ZTE2OwotICAgIEFMT0dWKCJEb3dubWl4X3NldFBhcmFtZXRlciwgY29udGV4dCAlcCwgcGFyYW0gJSIgUFJJZDMyICIsIHZhbHVlMTYgJSIgUFJJZDE2ICIsIHZhbHVlMzIgJSIgUFJJZDMyLAotICAgICAgICAgICAgcERvd25taXhlciwgcGFyYW0sICooaW50MTZfdCAqKXBWYWx1ZSwgKihpbnQzMl90ICopcFZhbHVlKTsKLQotICAgIHN3aXRjaCAocGFyYW0pIHsKLQotICAgICAgY2FzZSBET1dOTUlYX1BBUkFNX1RZUEU6Ci0gICAgICAgIGlmIChzaXplICE9IHNpemVvZihkb3dubWl4X3R5cGVfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlcihET1dOTUlYX1BBUkFNX1RZUEUpIGludmFsaWQgc2l6ZSAlIiBQUkl1MzIgIiwgc2hvdWxkIGJlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgIHNpemUsIHNpemVvZihkb3dubWl4X3R5cGVfdCkpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUxNiA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgQUxPR1YoInNldCBET1dOTUlYX1BBUkFNX1RZUEUsIHR5cGUgJSIgUFJJZDE2LCB2YWx1ZTE2KTsKLSAgICAgICAgaWYgKCEoKHZhbHVlMTYgPiBET1dOTUlYX1RZUEVfSU5WQUxJRCkgJiYgKHZhbHVlMTYgPD0gRE9XTk1JWF9UWVBFX0xBU1QpKSkgewotICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyIGludmFsaWQgRE9XTk1JWF9QQVJBTV9UWVBFIHZhbHVlICUiIFBSSWQxNiwgdmFsdWUxNik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBEb3dubWl4ZXItPnR5cGUgPSAoZG93bm1peF90eXBlX3QpIHZhbHVlMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJSIgUFJJZDMyLCBwYXJhbSk7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLX0KLQotICAgIHJldHVybiAwOwotfSAvKiBlbmQgRG93bm1peF9zZXRQYXJhbWV0ZXIgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZ2V0UGFyYW1ldGVyKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIEdldCBhIERvd25taXggcGFyYW1ldGVyCi0gKgotICogSW5wdXRzOgotICogIHBEb3dubWl4ZXIgICAgaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKLSAqICBwYXJhbSAgICAgICAgIHBhcmFtZXRlcgotICogIHBWYWx1ZSAgICAgICAgcG9pbnRlciB0byB2YXJpYWJsZSB0byBob2xkIHJldHJpZXZlZCB2YWx1ZQotICogIHBTaXplICAgICAgICAgcG9pbnRlciB0byB2YWx1ZSBzaXplOiBtYXhpbXVtIHNpemUgYXMgaW5wdXQKLSAqCi0gKiBPdXRwdXRzOgotICogICpwVmFsdWUgdXBkYXRlZCB3aXRoIHBhcmFtZXRlciB2YWx1ZQotICogICpwU2l6ZSB1cGRhdGVkIHdpdGggYWN0dWFsIHZhbHVlIHNpemUKLSAqCi0gKiBSZXR1cm5zOgotICogIDAgICAgICAgICAgICAgaW5kaWNhdGVzIHN1Y2Nlc3MKLSAqCi0gKiBTaWRlIEVmZmVjdHM6Ci0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLWludCBEb3dubWl4X2dldFBhcmFtZXRlcihkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBpbnQzMl90IHBhcmFtLCB1aW50MzJfdCAqcFNpemUsIHZvaWQgKnBWYWx1ZSkgewotICAgIGludDE2X3QgKnBWYWx1ZTE2OwotCi0gICAgc3dpdGNoIChwYXJhbSkgewotCi0gICAgY2FzZSBET1dOTUlYX1BBUkFNX1RZUEU6Ci0gICAgICBpZiAoKnBTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgQUxPR0UoIkRvd25taXhfZ2V0UGFyYW1ldGVyIGludmFsaWQgcGFyYW1ldGVyIHNpemUgJSIgUFJJdTMyICIgZm9yIERPV05NSVhfUEFSQU1fVFlQRSIsICpwU2l6ZSk7Ci0gICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICB9Ci0gICAgICBwVmFsdWUxNiA9IChpbnQxNl90ICopcFZhbHVlOwotICAgICAgKnBWYWx1ZTE2ID0gKGludDE2X3QpIHBEb3dubWl4ZXItPnR5cGU7Ci0gICAgICAqcFNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICBBTE9HVigiRG93bm1peF9nZXRQYXJhbWV0ZXIgRE9XTk1JWF9QQVJBTV9UWVBFIGlzICUiIFBSSWQxNiwgKnBWYWx1ZTE2KTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlIiBQUklkMTYsIHBhcmFtKTsKLSAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfSAvKiBlbmQgRG93bm1peF9nZXRQYXJhbWV0ZXIgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb21RdWFkKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSBxdWFkIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICBxdWFkIGF1ZGlvIHNhbXBsZXMgdG8gZG93bm1peAotICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBxdWFkIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBSTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIFJSCi0gICAgaWYgKGFjY3VtdWxhdGUpIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gRkwgKyBSTAotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wMTYocERzdFswXSArICgocFNyY1swXSArIHBTcmNbMl0pID4+IDEpKTsKLSAgICAgICAgICAgIC8vIEZSICsgUlIKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHBEc3RbMV0gKyAoKHBTcmNbMV0gKyBwU3JjWzNdKSA+PiAxKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIEZMICsgUkwKLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KChwU3JjWzBdICsgcFNyY1syXSkgPj4gMSk7Ci0gICAgICAgICAgICAvLyBGUiArIFJSCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNigocFNyY1sxXSArIHBTcmNbM10pID4+IDEpOwotICAgICAgICAgICAgcFNyYyArPSA0OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBEb3dubWl4X2ZvbGRGcm9tUXVhZChMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIFJMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgUlIKLSAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBGTCArIFJMCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArICgocFNyY1swXSArIHBTcmNbMl0pIC8gMi4wZikpOwotICAgICAgICAgICAgLy8gRlIgKyBSUgotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMV0gKyAoKHBTcmNbMV0gKyBwU3JjWzNdKSAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gNDsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gRkwgKyBSTAotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKTsKLSAgICAgICAgICAgIC8vIEZSICsgUlIKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdCgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZik7Ci0gICAgICAgICAgICBwU3JjICs9IDQ7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggYSA1LjEgc2lnbmFsIHRvIHN0ZXJlbwotICoKLSAqIElucHV0czoKLSAqICBwU3JjICAgICAgIDUuMSBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgNS4xIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJQbHVzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0Ci0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDAgaXMgRkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMSBpcyBGUgotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAyIGlzIEZDCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDMgaXMgTEZFCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDQgaXMgUkwKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNSBpcyBSUgotICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAotICAgIC8vIGZvciBldmVyeSBzYW1wbGUKLSAgICBpZiAoYWNjdW11bGF0ZSkgewotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKLSAgICAgICAgICAgIGx0ID0gKHBTcmNbMF0gPDwgMTIpICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyAocFNyY1s0XSA8PCAxMik7Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKLSAgICAgICAgICAgIHJ0ID0gKHBTcmNbMV0gPDwgMTIpICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyAocFNyY1s1XSA8PCAxMik7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihwRHN0WzBdICsgKGx0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihwRHN0WzFdICsgKHJ0ID4+IDEzKSk7Ci0gICAgICAgICAgICBwU3JjICs9IDY7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7IC8vIHNhbWUgY29kZSBhcyBhYm92ZSBidXQgd2l0aG91dCBhZGRpbmcgYW5kIGNsYW1waW5nIHBEc3RbaV0gdG8gaXRzZWxmCi0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIChwU3JjWzRdIDw8IDEyKTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMikgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIChwU3JjWzVdIDw8IDEyKTsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXAxNihsdCA+PiAxMyk7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wMTYocnQgPj4gMTMpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBTcmMgKz0gNjsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgRG93bm1peF9mb2xkRnJvbTVQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotICAgIExWTV9GTE9BVCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQotICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgUkwKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s0XTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSUgotICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzVdOwotICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7Ci0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gNjsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQotICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAotICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOwotICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCi0gICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07Ci0gICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgotICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcFNyYyArPSA2OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MSgpCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFB1cnBvc2U6Ci0gKiBkb3dubWl4IGEgNy4xIHNpZ25hbCB0byBzdGVyZW8KLSAqCi0gKiBJbnB1dHM6Ci0gKiAgcFNyYyAgICAgICA3LjEgYXVkaW8gc2FtcGxlcyB0byBkb3dubWl4Ci0gKiAgbnVtRnJhbWVzICB0aGUgbnVtYmVyIG9mIDcuMSBmcmFtZXMgdG8gZG93bm1peAotICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAotICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKLSAqCi0gKiBPdXRwdXRzOgotICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKLSAgICBpbnQzMl90IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKLSAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKSArIGNlbnRlclBsdXNMZmVDb250cmliICsgKHBTcmNbNl0gPDwgMTIpICsgKHBTcmNbNF0gPDwgMTIpOwotICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKLSAgICAgICAgICAgIHJ0ID0gKHBTcmNbMV0gPDwgMTIpICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyAocFNyY1s3XSA8PCAxMikgKyAocFNyY1s1XSA8PCAxMik7Ci0gICAgICAgICAgICAvL2FjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KHBEc3RbMF0gKyAobHQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHBEc3RbMV0gKyAocnQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gODsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgIH0KLSAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAotICAgICAgICAgICAgbHQgPSAocFNyY1swXSA8PCAxMikgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIChwU3JjWzZdIDw8IDEyKSArIChwU3JjWzRdIDw8IDEyKTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCi0gICAgICAgICAgICBydCA9IChwU3JjWzFdIDw8IDEyKSArIGNlbnRlclBsdXNMZmVDb250cmliICsgKHBTcmNbN10gPDwgMTIpICsgKHBTcmNbNV0gPDwgMTIpOwotICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KGx0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihydCA+PiAxMyk7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcFNyYyArPSA4OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0gICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQwotICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCi0gICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKLSAgICAvLyBzYW1wbGUgYXQgaW5kZXggNiBpcyBTTAotICAgIC8vIHNhbXBsZSBhdCBpbmRleCA3IGlzIFNSCi0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQotICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7Ci0gICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAotICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKLSAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCi0gICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbN10gKyBwU3JjWzVdOwotICAgICAgICAgICAgLy9hY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOwotICAgICAgICAgICAgcFNyYyArPSA4OwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwotICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07Ci0gICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgotICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKLSAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwU3JjICs9IDg7Ci0gICAgICAgICAgICBwRHN0ICs9IDI7Ci0gICAgICAgICAgICBudW1GcmFtZXMtLTsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEb3dubWl4X2ZvbGRHZW5lcmljKCkKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogUHVycG9zZToKLSAqIGRvd25taXggdG8gc3RlcmVvIGEgbXVsdGljaGFubmVsIHNpZ25hbCB3aG9zZSBmb3JtYXQgaXM6Ci0gKiAgLSBoYXMgRkwvRlIKLSAqICAtIGlmIHVzaW5nIEFVRElPX0NIQU5ORUxfT1VUX1NJREUqLCBpdCBjb250YWlucyBib3RoIGxlZnQgYW5kIHJpZ2h0Ci0gKiAgLSBpZiB1c2luZyBBVURJT19DSEFOTkVMX09VVF9CQUNLKiwgaXQgY29udGFpbnMgYm90aCBsZWZ0IGFuZCByaWdodAotICogIC0gZG9lc24ndCB1c2UgYW55IG9mIHRoZSBBVURJT19DSEFOTkVMX09VVF9UT1AqIGNoYW5uZWxzCi0gKiAgLSBkb2Vzbid0IHVzZSBhbnkgb2YgdGhlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UXypfT0ZfQ0VOVEVSIGNoYW5uZWxzCi0gKiBPbmx5IGhhbmRsZXMgY2hhbm5lbCBtYXNrcyBub3QgZW51bWVyYXRlZCBpbiBkb3dubWl4X2lucHV0X2NoYW5uZWxfbWFza190Ci0gKgotICogSW5wdXRzOgotICogIG1hc2sgICAgICAgdGhlIGNoYW5uZWwgbWFzayBvZiBwU3JjCi0gKiAgcFNyYyAgICAgICBtdWx0aWNoYW5uZWwgYXVkaW8gYnVmZmVyIHRvIGRvd25taXgKLSAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgbXVsdGljaGFubmVsIGZyYW1lcyB0byBkb3dubWl4Ci0gKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCi0gKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQotICoKLSAqIE91dHB1dHM6Ci0gKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKLSAqCi0gKiBSZXR1cm5zOiBmYWxzZSBpZiBtdWx0aWNoYW5uZWwgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICB1aW50MzJfdCBtYXNrLCBpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgewotCi0gICAgaWYgKCFEb3dubWl4X3ZhbGlkQ2hhbm5lbE1hc2sobWFzaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IGJvb2wgaGFzU2lkZXMgPSAobWFzayAmIGtTaWRlcykgIT0gMDsKLSAgICBjb25zdCBib29sIGhhc0JhY2tzID0gKG1hc2sgJiBrQmFja3MpICE9IDA7Ci0KLSAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKLSAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOwotICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KLSAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOwotICAgIGNvbnN0IGJvb2wgaGFzQkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOwotICAgIC8vIGNvbXB1dGUgYXQgd2hhdCBpbmRleCBlYWNoIGNoYW5uZWwgaXM6IHNhbXBsZXMgd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICAgIC8vICAgRkwgRlIgRkMgTEZFIEJMIEJSIEJDIFNMIFNSCi0gICAgLy8gd2hlbiBhIGNoYW5uZWwgaXMgbm90IHByZXNlbnQsIGl0cyBpbmRleCBpcyBzZXQgdG8gdGhlIHNhbWUgYXMgdGhlIGluZGV4IG9mIHRoZSBwcmVjZWRpbmcKLSAgICAvLyBjaGFubmVsCi0gICAgY29uc3QgaW50IGluZGV4RkMgID0gaGFzRkMgICAgPyAyICAgICAgICAgICAgOiAxOyAgICAgICAgLy8gZnJvbnQgY2VudGVyCi0gICAgY29uc3QgaW50IGluZGV4TEZFID0gaGFzTEZFICAgPyBpbmRleEZDICsgMSAgOiBpbmRleEZDOyAgLy8gbG93IGZyZXF1ZW5jeQotICAgIGNvbnN0IGludCBpbmRleEJMICA9IGhhc0JhY2tzID8gaW5kZXhMRkUgKyAxIDogaW5kZXhMRkU7IC8vIGJhY2sgbGVmdAotICAgIGNvbnN0IGludCBpbmRleEJSICA9IGhhc0JhY2tzID8gaW5kZXhCTCArIDEgIDogaW5kZXhCTDsgIC8vIGJhY2sgcmlnaHQKLSAgICBjb25zdCBpbnQgaW5kZXhCQyAgPSBoYXNCQyAgICA/IGluZGV4QlIgKyAxICA6IGluZGV4QlI7ICAvLyBiYWNrIGNlbnRlcgotICAgIGNvbnN0IGludCBpbmRleFNMICA9IGhhc1NpZGVzID8gaW5kZXhCQyArIDEgIDogaW5kZXhCQzsgIC8vIHNpZGUgbGVmdAotICAgIGNvbnN0IGludCBpbmRleFNSICA9IGhhc1NpZGVzID8gaW5kZXhTTCArIDEgIDogaW5kZXhTTDsgIC8vIHNpZGUgcmlnaHQKLQotICAgIGludDMyX3QgbHQsIHJ0LCBjZW50ZXJzTGZlQ29udHJpYjsgLy8gc2FtcGxlcyBpbiBRMTkuMTIgZm9ybWF0Ci0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCi0gICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7Ci0gICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KLSAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KLSAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQotICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9RMTlfMTI7Ci0gICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCi0gICAgICAgICAgICBsdCA9IChwU3JjWzBdIDw8IDEyKTsKLSAgICAgICAgICAgIHJ0ID0gKHBTcmNbMV0gPDwgMTIpOwotICAgICAgICAgICAgLy8gbWl4IGluIHNpZGVzIGFuZCBiYWNrcwotICAgICAgICAgICAgaWYgKGhhc1NpZGVzKSB7Ci0gICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleFNMXSA8PCAxMjsKLSAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4U1JdIDw8IDEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhhc0JhY2tzKSB7Ci0gICAgICAgICAgICAgICAgbHQgKz0gcFNyY1tpbmRleEJMXSA8PCAxMjsKLSAgICAgICAgICAgICAgICBydCArPSBwU3JjW2luZGV4QlJdIDw8IDEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbHQgKz0gY2VudGVyc0xmZUNvbnRyaWI7Ci0gICAgICAgICAgICBydCArPSBjZW50ZXJzTGZlQ29udHJpYjsKLSAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KHBEc3RbMF0gKyAobHQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcDE2KHBEc3RbMV0gKyAocnQgPj4gMTMpKTsKLSAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICAgICAgLy8gY29tcHV0ZSBjb250cmlidXRpb24gb2YgRkMsIEJDIGFuZCBMRkUKLSAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliID0gMDsKLSAgICAgICAgICAgIGlmIChoYXNGQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEZDXTsgfQotICAgICAgICAgICAgaWYgKGhhc0xGRSkgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4TEZFXTsgfQotICAgICAgICAgICAgaWYgKGhhc0JDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4QkNdOyB9Ci0gICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiAqPSBNSU5VU18zX0RCX0lOX1ExOV8xMjsKLSAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKLSAgICAgICAgICAgIGx0ID0gKHBTcmNbMF0gPDwgMTIpOwotICAgICAgICAgICAgcnQgPSAocFNyY1sxXSA8PCAxMik7Ci0gICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCi0gICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKLSAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdIDw8IDEyOwotICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl0gPDwgMTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKLSAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdIDw8IDEyOwotICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl0gPDwgMTI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKLSAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOwotICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcDE2KGx0ID4+IDEzKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCi0gICAgICAgICAgICBwRHN0WzFdID0gY2xhbXAxNihydCA+PiAxMyk7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQotICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0jZWxzZQotYm9vbCBEb3dubWl4X2ZvbGRHZW5lcmljKAotICAgICAgICB1aW50MzJfdCBtYXNrLCBMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7Ci0KLSAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgYm9vbCBoYXNTaWRlcyA9IChtYXNrICYga1NpZGVzKSAhPSAwOwotICAgIGNvbnN0IGJvb2wgaGFzQmFja3MgPSAobWFzayAmIGtCYWNrcykgIT0gMDsKLQotICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOwotICAgIGNvbnN0IGJvb2wgaGFzRkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpID09IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUik7Ci0gICAgY29uc3QgYm9vbCBoYXNMRkUgPQotICAgICAgICAgICAgKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSk7Ci0gICAgY29uc3QgYm9vbCBoYXNCQyA9ICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7Ci0gICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0gICAgLy8gICBGTCBGUiBGQyBMRkUgQkwgQlIgQkMgU0wgU1IKLSAgICAvLyB3aGVuIGEgY2hhbm5lbCBpcyBub3QgcHJlc2VudCwgaXRzIGluZGV4IGlzIHNldCB0byB0aGUgc2FtZSBhcyB0aGUgaW5kZXggb2YgdGhlIHByZWNlZGluZwotICAgIC8vIGNoYW5uZWwKLSAgICBjb25zdCBpbnQgaW5kZXhGQyAgPSBoYXNGQyAgICA/IDIgICAgICAgICAgICA6IDE7ICAgICAgICAvLyBmcm9udCBjZW50ZXIKLSAgICBjb25zdCBpbnQgaW5kZXhMRkUgPSBoYXNMRkUgICA/IGluZGV4RkMgKyAxICA6IGluZGV4RkM7ICAvLyBsb3cgZnJlcXVlbmN5Ci0gICAgY29uc3QgaW50IGluZGV4QkwgID0gaGFzQmFja3MgPyBpbmRleExGRSArIDEgOiBpbmRleExGRTsgLy8gYmFjayBsZWZ0Ci0gICAgY29uc3QgaW50IGluZGV4QlIgID0gaGFzQmFja3MgPyBpbmRleEJMICsgMSAgOiBpbmRleEJMOyAgLy8gYmFjayByaWdodAotICAgIGNvbnN0IGludCBpbmRleEJDICA9IGhhc0JDICAgID8gaW5kZXhCUiArIDEgIDogaW5kZXhCUjsgIC8vIGJhY2sgY2VudGVyCi0gICAgY29uc3QgaW50IGluZGV4U0wgID0gaGFzU2lkZXMgPyBpbmRleEJDICsgMSAgOiBpbmRleEJDOyAgLy8gc2lkZSBsZWZ0Ci0gICAgY29uc3QgaW50IGluZGV4U1IgID0gaGFzU2lkZXMgPyBpbmRleFNMICsgMSAgOiBpbmRleFNMOyAgLy8gc2lkZSByaWdodAotCi0gICAgTFZNX0ZMT0FUIGx0LCBydCwgY2VudGVyc0xmZUNvbnRyaWI7Ci0gICAgLy8gY29kZSBpcyBtb3N0bHkgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSB0d28gdmFsdWVzIG9mIGFjY3VtdWxhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIHRoZSB0ZXN0Ci0gICAgLy8gZm9yIGV2ZXJ5IHNhbXBsZQotICAgIGlmIChhY2N1bXVsYXRlKSB7Ci0gICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKLSAgICAgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCi0gICAgICAgICAgICBjZW50ZXJzTGZlQ29udHJpYiA9IDA7Ci0gICAgICAgICAgICBpZiAoaGFzRkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhGQ107IH0KLSAgICAgICAgICAgIGlmIChoYXNMRkUpIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07IH0KLSAgICAgICAgICAgIGlmIChoYXNCQykgIHsgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleEJDXTsgfQotICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgKj0gTUlOVVNfM19EQl9JTl9GTE9BVDsKLSAgICAgICAgICAgIC8vIGFsd2F5cyBoYXMgRkwvRlIKLSAgICAgICAgICAgIGx0ID0gcFNyY1swXTsKLSAgICAgICAgICAgIHJ0ID0gcFNyY1sxXTsKLSAgICAgICAgICAgIC8vIG1peCBpbiBzaWRlcyBhbmQgYmFja3MKLSAgICAgICAgICAgIGlmIChoYXNTaWRlcykgewotICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhTTF07Ci0gICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleFNSXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoYXNCYWNrcykgewotICAgICAgICAgICAgICAgIGx0ICs9IHBTcmNbaW5kZXhCTF07Ci0gICAgICAgICAgICAgICAgcnQgKz0gcFNyY1tpbmRleEJSXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGx0ICs9IGNlbnRlcnNMZmVDb250cmliOwotICAgICAgICAgICAgcnQgKz0gY2VudGVyc0xmZUNvbnRyaWI7Ci0gICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCi0gICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOwotICAgICAgICAgICAgcFNyYyArPSBudW1DaGFuOwotICAgICAgICAgICAgcERzdCArPSAyOwotICAgICAgICAgICAgbnVtRnJhbWVzLS07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAvLyBjb21wdXRlIGNvbnRyaWJ1dGlvbiBvZiBGQywgQkMgYW5kIExGRQotICAgICAgICAgICAgY2VudGVyc0xmZUNvbnRyaWIgPSAwOwotICAgICAgICAgICAgaWYgKGhhc0ZDKSAgeyBjZW50ZXJzTGZlQ29udHJpYiArPSBwU3JjW2luZGV4RkNdOyB9Ci0gICAgICAgICAgICBpZiAoaGFzTEZFKSB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhMRkVdOyB9Ci0gICAgICAgICAgICBpZiAoaGFzQkMpICB7IGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107IH0KLSAgICAgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7Ci0gICAgICAgICAgICAvLyBhbHdheXMgaGFzIEZML0ZSCi0gICAgICAgICAgICBsdCA9IHBTcmNbMF07Ci0gICAgICAgICAgICBydCA9IHBTcmNbMV07Ci0gICAgICAgICAgICAvLyBtaXggaW4gc2lkZXMgYW5kIGJhY2tzCi0gICAgICAgICAgICBpZiAoaGFzU2lkZXMpIHsKLSAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4U0xdOwotICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhTUl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzQmFja3MpIHsKLSAgICAgICAgICAgICAgICBsdCArPSBwU3JjW2luZGV4QkxdOwotICAgICAgICAgICAgICAgIHJ0ICs9IHBTcmNbaW5kZXhCUl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsdCArPSBjZW50ZXJzTGZlQ29udHJpYjsKLSAgICAgICAgICAgIHJ0ICs9IGNlbnRlcnNMZmVDb250cmliOwotICAgICAgICAgICAgLy8gc3RvcmUgaW4gZGVzdGluYXRpb24KLSAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChsdCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChydCAvIDIuMGYpOyAvLyBkaWZmZXJzIGZyb20gd2hlbiBhY2N1bXVsYXRlIGlzIHRydWUgYWJvdmUKLSAgICAgICAgICAgIHBTcmMgKz0gbnVtQ2hhbjsKLSAgICAgICAgICAgIHBEc3QgKz0gMjsKLSAgICAgICAgICAgIG51bUZyYW1lcy0tOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwMGJjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmNwcApAQCAtMCwwICsxLDExMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkVmZmVjdERvd25taXgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiRWZmZWN0RG93bm1peC5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYIGRlZmluZWQsIHN0cmljdGx5IGZvciB0ZXN0aW5nCisvLyNkZWZpbmUgRE9XTk1JWF9URVNUX0NIQU5ORUxfSU5ERVggMAorLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZworLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCisKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCBNX1NRUlQxXzIgLy8gLTNkQiA9IDAuNzA3MTA2NzgKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQsCisgICAgRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBET1dOTUlYX1NUQVRFX0FDVElWRSwKK30gZG93bm1peF9zdGF0ZV90OworCisvKiBwYXJhbWV0ZXJzIGZvciBlYWNoIGRvd25taXhlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRvd25taXhfc3RhdGVfdCBzdGF0ZTsKKyAgICBkb3dubWl4X3R5cGVfdCB0eXBlOworICAgIGJvb2wgYXBwbHlfdm9sdW1lX2NvcnJlY3Rpb247CisgICAgdWludDhfdCBpbnB1dF9jaGFubmVsX2NvdW50OworfSBkb3dubWl4X29iamVjdF90OworCit0eXBlZGVmIHN0cnVjdCBkb3dubWl4X21vZHVsZV9zIHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICppdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgZG93bm1peF9vYmplY3RfdCBjb250ZXh0OworfSBkb3dubWl4X21vZHVsZV90OworCisKKy8vIEF1ZGlvIEVmZmVjdCBBUEkKK3N0YXRpYyBpbnQzMl90IERvd25taXhMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQzMl90IGlvSWQsCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSk7CitzdGF0aWMgaW50MzJfdCBEb3dubWl4TGliX1JlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSk7CitzdGF0aWMgaW50MzJfdCBEb3dubWl4TGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworc3RhdGljIGludDMyX3QgRG93bm1peF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpOworc3RhdGljIGludDMyX3QgRG93bm1peF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLAorICAgICAgICB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7CitzdGF0aWMgaW50MzJfdCBEb3dubWl4X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKKworLy8gSW50ZXJuYWwgbWV0aG9kcworc3RhdGljIGludCBEb3dubWl4X0luaXQoZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSk7CitzdGF0aWMgaW50IERvd25taXhfQ29uZmlndXJlKGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KTsKK3N0YXRpYyBpbnQgRG93bm1peF9SZXNldChkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBib29sIGluaXQpOworc3RhdGljIGludCBEb3dubWl4X3NldFBhcmFtZXRlcigKKyAgICAgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKTsKK3N0YXRpYyBpbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoCisgICAgICAgIGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90ICpwU2l6ZSwgdm9pZCAqcFZhbHVlKTsKK3N0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb21RdWFkKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3N0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb201UG9pbnQxKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3N0YXRpYyB2b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKK3N0YXRpYyBib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgZG93bm1peCBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0Rvd25taXhJbnRlcmZhY2UgPSB7CisgICAgICAgIERvd25taXhfUHJvY2VzcywKKyAgICAgICAgRG93bm1peF9Db21tYW5kLAorICAgICAgICBEb3dubWl4X0dldERlc2NyaXB0b3IsCisgICAgICAgIE5VTEwgLyogbm8gcHJvY2Vzc19yZXZlcnNlIGZ1bmN0aW9uLCBubyByZWZlcmVuY2Ugc3RyZWFtIG5lZWRlZCAqLworfTsKKworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAorX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQorYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgLm5hbWUgPSAiRG93bm1peCBMaWJyYXJ5IiwKKyAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCisgICAgLmNyZWF0ZV9lZmZlY3QgPSBEb3dubWl4TGliX0NyZWF0ZSwKKyAgICAucmVsZWFzZV9lZmZlY3QgPSBEb3dubWl4TGliX1JlbGVhc2UsCisgICAgLmdldF9kZXNjcmlwdG9yID0gRG93bm1peExpYl9HZXREZXNjcmlwdG9yLAorfTsKKworLy8gQU9TUCBpbnNlcnQgZG93bm1peCBVVUlEOiA5M2YwNDQ1Mi1lNGZlLTQxY2MtOTFmOS1lNDc1YjZkMWQ2OWYKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdEb3dubWl4RGVzY3JpcHRvciA9IHsKKyAgICAgICAgRUZGRUNUX1VJSURfRE9XTk1JWF9fLCAvL3R5cGUKKyAgICAgICAgezB4OTNmMDQ0NTIsIDB4ZTRmZSwgMHg0MWNjLCAweDkxZjksIHsweGU0LCAweDc1LCAweGI2LCAweGQxLCAweGQ2LCAweDlmfX0sIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCisgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNULAorICAgICAgICAwLCAvL0ZJWE1FIHdoYXQgdmFsdWUgc2hvdWxkIGJlIHJlcG9ydGVkPyAvLyBjcHUgbG9hZAorICAgICAgICAwLCAvL0ZJWE1FIHdoYXQgdmFsdWUgc2hvdWxkIGJlIHJlcG9ydGVkPyAvLyBtZW1vcnkgdXNhZ2UKKyAgICAgICAgIk11bHRpY2hhbm5lbCBEb3dubWl4IFRvIFN0ZXJlbyIsIC8vIGh1bWFuIHJlYWRhYmxlIGVmZmVjdCBuYW1lCisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiAvLyBodW1hbiByZWFkYWJsZSBlZmZlY3QgaW1wbGVtZW50b3IgbmFtZQorfTsKKworLy8gZ0Rlc2NyaXB0b3JzIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGFsbCBkZWZpbmVkIGVmZmVjdCBkZXNjcmlwdG9yIGluIHRoaXMgbGlicmFyeQorc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKKyAgICAgICAgJmdEb3dubWl4RGVzY3JpcHRvcgorfTsKKworLy8gbnVtYmVyIG9mIGVmZmVjdHMgaW4gdGhpcyBsaWJyYXJ5Citjb25zdCBpbnQga05iRWZmZWN0cyA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgY2xhbXBfZmxvYXQoZmxvYXQgdmFsdWUpIHsKKyAgICByZXR1cm4gZm1pbihmbWF4KHZhbHVlLCAtMS5mKSwgMS5mKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUZXN0IGNvZGUKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmZGVmIERPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYCisvLyBzdHJpY3RseSBmb3IgdGVzdGluZywgbG9ncyB0aGUgaW5kaWNlcyBvZiB0aGUgY2hhbm5lbHMgZm9yIGEgZ2l2ZW4gbWFzaywKKy8vIHVzZXMgdGhlIHNhbWUgY29kZSBhcyBEb3dubWl4X2ZvbGRHZW5lcmljKCkKK3ZvaWQgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbih1aW50MzJfdCBtYXNrKSB7CisgICAgQUxPR0koIlRlc3RpbmcgaW5kZXggY29tcHV0YXRpb24gZm9yICUjeDoiLCBtYXNrKTsKKyAgICAvLyBjaGVjayBhZ2FpbnN0IHVuc3VwcG9ydGVkIGNoYW5uZWxzCisgICAgaWYgKG1hc2sgJiBrVW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGNoYW5uZWxzICh0b3Agb3IgZnJvbnQgbGVmdC9yaWdodCBvZiBjZW50ZXIpIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gdmVyaWZ5IGhhcyBGTC9GUgorICAgIGlmICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CisgICAgICAgIEFMT0dFKCJGcm9udCBjaGFubmVscyBtdXN0IGJlIHByZXNlbnQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB2ZXJpZnkgdXNlcyBTSURFIGFzIGEgcGFpciAob2sgaWYgbm90IHVzaW5nIFNJREUgYXQgYWxsKQorICAgIGJvb2wgaGFzU2lkZXMgPSBmYWxzZTsKKyAgICBpZiAoKG1hc2sgJiBrU2lkZXMpICE9IDApIHsKKyAgICAgICAgaWYgKChtYXNrICYga1NpZGVzKSAhPSBrU2lkZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTaWRlIGNoYW5uZWxzIG11c3QgYmUgdXNlZCBhcyBhIHBhaXIiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBoYXNTaWRlcyA9IHRydWU7CisgICAgfQorICAgIC8vIHZlcmlmeSB1c2VzIEJBQ0sgYXMgYSBwYWlyIChvayBpZiBub3QgdXNpbmcgQkFDSyBhdCBhbGwpCisgICAgYm9vbCBoYXNCYWNrcyA9IGZhbHNlOworICAgIGlmICgobWFzayAmIGtCYWNrcykgIT0gMCkgeworICAgICAgICBpZiAoKG1hc2sgJiBrQmFja3MpICE9IGtCYWNrcykgeworICAgICAgICAgICAgQUxPR0UoIkJhY2sgY2hhbm5lbHMgbXVzdCBiZSB1c2VkIGFzIGEgcGFpciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGhhc0JhY2tzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgbnVtQ2hhbiA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtYXNrKTsKKyAgICBjb25zdCBib29sIGhhc0ZDID0gKChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSA9PSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpOworICAgIGNvbnN0IGJvb2wgaGFzTEZFID0KKyAgICAgICAgICAgICgobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpID09IEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpOworICAgIGNvbnN0IGJvb2wgaGFzQkMgPSAoKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUikgPT0gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOworICAgIC8vIGNvbXB1dGUgYXQgd2hhdCBpbmRleCBlYWNoIGNoYW5uZWwgaXM6IHNhbXBsZXMgd2lsbCBiZSBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorICAgIC8vICAgRkwgRlIgRkMgTEZFIEJMIEJSIEJDIFNMIFNSCisgICAgLy8gd2hlbiBhIGNoYW5uZWwgaXMgbm90IHByZXNlbnQsIGl0cyBpbmRleCBpcyBzZXQgdG8gdGhlIHNhbWUgYXMgdGhlIGluZGV4IG9mIHRoZSBwcmVjZWRpbmcKKyAgICAvLyBjaGFubmVsCisgICAgY29uc3QgaW50IGluZGV4RkMgID0gaGFzRkMgICAgPyAyICAgICAgICAgICAgOiAxOyAgICAgICAgLy8gZnJvbnQgY2VudGVyCisgICAgY29uc3QgaW50IGluZGV4TEZFID0gaGFzTEZFICAgPyBpbmRleEZDICsgMSAgOiBpbmRleEZDOyAgLy8gbG93IGZyZXF1ZW5jeQorICAgIGNvbnN0IGludCBpbmRleEJMICA9IGhhc0JhY2tzID8gaW5kZXhMRkUgKyAxIDogaW5kZXhMRkU7IC8vIGJhY2sgbGVmdAorICAgIGNvbnN0IGludCBpbmRleEJSICA9IGhhc0JhY2tzID8gaW5kZXhCTCArIDEgIDogaW5kZXhCTDsgIC8vIGJhY2sgcmlnaHQKKyAgICBjb25zdCBpbnQgaW5kZXhCQyAgPSBoYXNCQyAgICA/IGluZGV4QlIgKyAxICA6IGluZGV4QlI7ICAvLyBiYWNrIGNlbnRlcgorICAgIGNvbnN0IGludCBpbmRleFNMICA9IGhhc1NpZGVzID8gaW5kZXhCQyArIDEgIDogaW5kZXhCQzsgIC8vIHNpZGUgbGVmdAorICAgIGNvbnN0IGludCBpbmRleFNSICA9IGhhc1NpZGVzID8gaW5kZXhTTCArIDEgIDogaW5kZXhTTDsgIC8vIHNpZGUgcmlnaHQKKworICAgIEFMT0dJKCIgIEZMIEZSIEZDIExGRSBCTCBCUiBCQyBTTCBTUiIpOworICAgIEFMT0dJKCIgICAlZCAgJWQgICVkICAgJWQgICVkICAlZCAgJWQgICVkICAlZCIsCisgICAgICAgICAgICAwLCAxLCBpbmRleEZDLCBpbmRleExGRSwgaW5kZXhCTCwgaW5kZXhCUiwgaW5kZXhCQywgaW5kZXhTTCwgaW5kZXhTUik7Cit9CisjZW5kaWYKKworc3RhdGljIGJvb2wgRG93bm1peF92YWxpZENoYW5uZWxNYXNrKHVpbnQzMl90IG1hc2spCit7CisgICAgaWYgKCFtYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gY2hlY2sgYWdhaW5zdCB1bnN1cHBvcnRlZCBjaGFubmVscworICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyKSB7CisgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjaGFubmVscyBpbiAldSIsIG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfMjJQT0lOVDIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVmZmVjdCBBUEkgaW1wbGVtZW50YXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLSBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gLS0tKi8KKworc3RhdGljIGludDMyX3QgRG93bm1peExpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgaW50MzJfdCAvKiBzZXNzaW9uSWQgKi8sCisgICAgICAgIGludDMyX3QgLyogaW9JZCAqLywKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKSB7CisgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKyAgICBkb3dubWl4X21vZHVsZV90ICptb2R1bGU7CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKKworICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpIik7CisKKyNpZmRlZiBET1dOTUlYX1RFU1RfQ0hBTk5FTF9JTkRFWAorICAgIC8vIHNob3VsZCB3b3JrICh3b24ndCBsb2cgYW4gZXJyb3IpCisgICAgQUxPR0koIkRPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYOiBzaG91bGQgd29yazoiKTsKKyAgICBEb3dubWl4X3Rlc3RJbmRleENvbXB1dGF0aW9uKEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCB8CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7CisgICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUgfCBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0spOworICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOworICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIHwgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpOworICAgIC8vIHNob3VsZG4ndCB3b3JrICh3aWxsIGxvZyBhbiBlcnJvciwgd29uJ3QgZGlzcGxheSBjaGFubmVsIGluZGljZXMpCisgICAgQUxPR0koIkRPV05NSVhfVEVTVF9DSEFOTkVMX0lOREVYOiBzaG91bGQgTk9UIHdvcms6Iik7CisgICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSB8IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCk7CisgICAgRG93bm1peF90ZXN0SW5kZXhDb21wdXRhdGlvbihBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUIHwgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgfCBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQpOworICAgIERvd25taXhfdGVzdEluZGV4Q29tcHV0YXRpb24oQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUKTsKKyAgICBEb3dubWl4X3Rlc3RJbmRleENvbXB1dGF0aW9uKEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCB8IEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQpOworI2VuZGlmCisKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IGtOYkVmZmVjdHMgOyBpKyspIHsKKyAgICAgICAgZGVzYyA9IGdEZXNjcmlwdG9yc1tpXTsKKyAgICAgICAgaWYgKG1lbWNtcCh1dWlkLCAmZGVzYy0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IGtOYkVmZmVjdHMpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgbW9kdWxlID0gbmV3IGRvd25taXhfbW9kdWxlX3R7fTsKKworICAgIG1vZHVsZS0+aXRmZSA9ICZnRG93bm1peEludGVyZmFjZTsKKworICAgIG1vZHVsZS0+Y29udGV4dC5zdGF0ZSA9IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRDsKKworICAgIHJldCA9IERvd25taXhfSW5pdChtb2R1bGUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJEb3dubWl4TGliX0NyZWF0ZSgpIGluaXQgZmFpbGVkIik7CisgICAgICAgIGZyZWUobW9kdWxlKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpIG1vZHVsZTsKKworICAgIEFMT0dWKCJEb3dubWl4TGliX0NyZWF0ZSgpICVwICwgc2l6ZSAlenUiLCBtb2R1bGUsIHNpemVvZihkb3dubWl4X21vZHVsZV90KSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgRG93bm1peExpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlID0gKGRvd25taXhfbW9kdWxlX3QgKiloYW5kbGU7CisKKyAgICBBTE9HVigiRG93bm1peExpYl9SZWxlYXNlKCkgJXAiLCBoYW5kbGUpOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBwRHdtTW9kdWxlLT5jb250ZXh0LnN0YXRlID0gRE9XTk1JWF9TVEFURV9VTklOSVRJQUxJWkVEOworCisgICAgZGVsZXRlIHBEd21Nb2R1bGU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQzMl90IERvd25taXhMaWJfR2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBBTE9HVigiRG93bm1peExpYl9HZXREZXNjcmlwdG9yKCkiKTsKKyAgICBpbnQgaTsKKworICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgICAgIEFMT0dFKCJEb3dubWl4TGliX0NyZWF0ZSgpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgQUxPR1YoIkRvd25taXhMaWJfR2V0RGVzY3JpcHRvcigpIG5iIGVmZmVjdHM9JWQiLCBrTmJFZmZlY3RzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwga05iRWZmZWN0czsgaSsrKSB7CisgICAgICAgIEFMT0dWKCJEb3dubWl4TGliX0dldERlc2NyaXB0b3IoKSBpPSVkIiwgaSk7CisgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmdEZXNjcmlwdG9yc1tpXS0+dXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkocERlc2NyaXB0b3IsIGdEZXNjcmlwdG9yc1tpXSwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKKyAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIGRvd25taXggdHlwZSAlZCwgVVVJRCA9ICUjeCIsCisgICAgICAgICAgICAgICAgIGksIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLworCitzdGF0aWMgaW50MzJfdCBEb3dubWl4X1Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90IHNlbGYsCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikgeworCisgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlcjsKKyAgICBmbG9hdCAqcFNyYywgKnBEc3Q7CisgICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopc2VsZjsKKworICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwgfHwKKyAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHBEb3dubWl4ZXIgPSAoZG93bm1peF9vYmplY3RfdCopICZwRHdtTW9kdWxlLT5jb250ZXh0OworCisgICAgaWYgKHBEb3dubWl4ZXItPnN0YXRlID09IERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGFuIHVuaW5pdGlhbGl6ZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAocERvd25taXhlci0+c3RhdGUgPT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Qcm9jZXNzIGVycm9yOiB0cnlpbmcgdG8gdXNlIGEgbm9uLWNvbmZpZ3VyZWQgZG93bm1peGVyIik7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBwU3JjID0gaW5CdWZmZXItPmYzMjsKKyAgICBwRHN0ID0gb3V0QnVmZmVyLT5mMzI7CisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKKworICAgIGNvbnN0IGJvb2wgYWNjdW11bGF0ZSA9CisgICAgICAgICAgICAocER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOworICAgIGNvbnN0IHVpbnQzMl90IGRvd25taXhJbnB1dENoYW5uZWxNYXNrID0gcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworCisgICAgc3dpdGNoKHBEb3dubWl4ZXItPnR5cGUpIHsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfU1RSSVA6CisgICAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyBwU3JjWzBdKTsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgcFNyY1sxXSk7CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgIHBEc3RbMF0gPSBwU3JjWzBdOworICAgICAgICAgICAgICAgICAgcERzdFsxXSA9IHBTcmNbMV07CisgICAgICAgICAgICAgICAgICBwU3JjICs9IHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQ7CisgICAgICAgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBET1dOTUlYX1RZUEVfRk9MRDoKKyNpZmRlZiBET1dOTUlYX0FMV0FZU19VU0VfR0VORVJJQ19ET1dOTUlYRVIKKyAgICAgICAgICAvLyBieXBhc3MgdGhlIG9wdGltaXplZCBkb3dubWl4IHJvdXRpbmVzIGZvciB0aGUgY29tbW9uIGZvcm1hdHMKKyAgICAgICAgICBpZiAoIURvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzaywgcFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKSkgeworICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBkb3dubWl4SW5wdXRDaGFubmVsTWFzayk7CisgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAvLyBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBmb3JtYXRzCisgICAgICAgIHN3aXRjaCAoZG93bm1peElucHV0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s6CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFOgorICAgICAgICAgICAgRG93bm1peF9mb2xkRnJvbVF1YWQocFNyYywgcERzdCwgbnVtRnJhbWVzLCBhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU6CisgICAgICAgICAgICBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShwU3JjLCBwRHN0LCBudW1GcmFtZXMsIGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMToKKyAgICAgICAgICAgIERvd25taXhfZm9sZEZyb203UG9pbnQxKHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICghRG93bm1peF9mb2xkR2VuZXJpYygKKyAgICAgICAgICAgICAgICAgICAgZG93bm1peElucHV0Q2hhbm5lbE1hc2ssIHBTcmMsIHBEc3QsIG51bUZyYW1lcywgYWNjdW11bGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTXVsdGljaGFubmVsIGNvbmZpZ3VyYXRpb24gJSN4IGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGRvd25taXhJbnB1dENoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDMyX3QgRG93bm1peF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworCisgICAgZG93bm1peF9tb2R1bGVfdCAqcER3bU1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopIHNlbGY7CisgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlcjsKKworICAgIGlmIChwRHdtTW9kdWxlID09IE5VTEwgfHwgcER3bU1vZHVsZS0+Y29udGV4dC5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcERvd25taXhlciA9IChkb3dubWl4X29iamVjdF90KikgJnBEd21Nb2R1bGUtPmNvbnRleHQ7CisKKyAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgJXUgY21kU2l6ZSAldSIsIGNtZENvZGUsIGNtZFNpemUpOworCisgICAgc3dpdGNoIChjbWRDb2RlKSB7CisgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IERvd25taXhfSW5pdChwRHdtTW9kdWxlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0NPTkZJRzoKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQorICAgICAgICAgICAgICAgIHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gRG93bm1peF9Db25maWd1cmUocER3bU1vZHVsZSwKKyAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopcENtZERhdGEsIGZhbHNlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgIERvd25taXhfUmVzZXQocERvd25taXhlciwgZmFsc2UpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBwQ21kRGF0YSAlcCwgKnJlcGx5U2l6ZSAldSwgcFJlcGx5RGF0YTogJXAiLAorICAgICAgICAgICAgICAgIHBDbWREYXRhLCAqcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IChpbnQpKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpIHx8CisgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChpbnQpIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcmVwID0gKGVmZmVjdF9wYXJhbV90ICopIHBSZXBseURhdGE7CisgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIEFMT0dWKCJEb3dubWl4X0NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gcGFyYW0gJWQsIHJlcGx5U2l6ZSAldSIsCisgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcmVwLT5kYXRhLCByZXAtPnZzaXplKTsKKyAgICAgICAgcmVwLT5zdGF0dXMgPSBEb3dubWl4X2dldFBhcmFtZXRlcihwRG93bm1peGVyLCAqKGludDMyX3QgKilyZXAtPmRhdGEsICZyZXAtPnZzaXplLAorICAgICAgICAgICAgICAgIHJlcC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgcmVwLT52c2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIHBDbWREYXRhICVwLCAqcmVwbHlTaXplICV1IgorICAgICAgICAgICAgICAgICIsIHBSZXBseURhdGEgJXAiLCBjbWRTaXplLCBwQ21kRGF0YSwgKnJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IChjbWRTaXplIDwgKGludCkoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpCisgICAgICAgICAgICAgICAgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gKGludClzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGVmZmVjdF9wYXJhbV90ICpjbWQgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgIGlmIChjbWQtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2MzY2MjkzOCIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gRG93bm1peF9zZXRQYXJhbWV0ZXIocERvd25taXhlciwgKihpbnQzMl90ICopY21kLT5kYXRhLAorICAgICAgICAgICAgICAgIGNtZC0+dnNpemUsIGNtZC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQ6CisgICAgICAgIC8vRklYTUUgaW1wbGVtZW50CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9ERUZFUlJFRCBub3Qgc3VwcG9ydGVkLCBGSVhNRSIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUOgorICAgICAgICAvL0ZJWE1FIGltcGxlbWVudAorICAgICAgICBBTE9HVygiRG93bm1peF9Db21tYW5kIGNvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU1fQ09NTUlUIG5vdCBzdXBwb3J0ZWQsIEZJWE1FIik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFRkZFQ1RfQ01EX0VOQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocERvd25taXhlci0+c3RhdGUgIT0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcERvd25taXhlci0+c3RhdGUgPSBET1dOTUlYX1NUQVRFX0FDVElWRTsKKyAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocERvd25taXhlci0+c3RhdGUgIT0gRE9XTk1JWF9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBEb3dubWl4ZXItPnN0YXRlID0gRE9XTk1JWF9TVEFURV9JTklUSUFMSVpFRDsKKyAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gKGludClzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRSBjaGFuZ2UgdHlwZSBpZiBwbGF5aW5nIG9uIGhlYWRzZXQgdnMgc3BlYWtlcgorICAgICAgICBBTE9HVigiRG93bm1peF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0RFVklDRTogJSN4IiwgKih1aW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRTogeworICAgICAgICAvLyBhdWRpbyBvdXRwdXQgaXMgYWx3YXlzIHN0ZXJlbyA9PiAyIGNoYW5uZWwgdm9sdW1lcworICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSAqIDIpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FIGNoYW5nZSB2b2x1bWUKKyAgICAgICAgQUxPR1coIkRvd25taXhfQ29tbWFuZCBjb21tYW5kIEVGRkVDVF9DTURfU0VUX1ZPTFVNRSBub3Qgc3VwcG9ydGVkLCBGSVhNRSIpOworICAgICAgICBmbG9hdCBsZWZ0ID0gKGZsb2F0KSgqKHVpbnQzMl90ICopcENtZERhdGEpIC8gKDEgPDwgMjQpOworICAgICAgICBmbG9hdCByaWdodCA9IChmbG9hdCkoKigodWludDMyX3QgKilwQ21kRGF0YSArIDEpKSAvICgxIDw8IDI0KTsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IGxlZnQgJWYsIHJpZ2h0ICVmICIsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgorICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IChpbnQpc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIkRvd25taXhfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOiAldSIsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRToKKyAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0lOUFVUX0RFVklDRToKKyAgICAgICAgLy8gdGhlc2UgY29tbWFuZHMgYXJlIGlnbm9yZWQgYnkgYSBkb3dubWl4IGVmZmVjdAorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dXKCJEb3dubWl4X0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICV1IiwgY21kQ29kZSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50MzJfdCBEb3dubWl4X0dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQoreworICAgIGRvd25taXhfbW9kdWxlX3QgKnBEd25teE1vZHVsZSA9IChkb3dubWl4X21vZHVsZV90ICopIHNlbGY7CisKKyAgICBpZiAocER3bm14TW9kdWxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBEd25teE1vZHVsZS0+Y29udGV4dC5zdGF0ZSA9PSBET1dOTUlYX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbWVtY3B5KHBEZXNjcmlwdG9yLCAmZ0Rvd25taXhEZXNjcmlwdG9yLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEb3dubWl4IGludGVybmFsIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRG93bm1peF9Jbml0KCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIEluaXRpYWxpemUgZG93bm1peCBjb250ZXh0IGFuZCBhcHBseSBkZWZhdWx0IHBhcmFtZXRlcnMKKyAqCisgKiBJbnB1dHM6CisgKiAgcER3bU1vZHVsZSAgICBwb2ludGVyIHRvIGRvd25taXggZWZmZWN0IG1vZHVsZQorICoKKyAqIE91dHB1dHM6CisgKgorICogUmV0dXJuczoKKyAqICAwICAgICAgICAgICAgIGluZGljYXRlcyBzdWNjZXNzCisgKgorICogU2lkZSBFZmZlY3RzOgorICogIHVwZGF0ZXM6CisgKiAgICAgICAgICAgcER3bU1vZHVsZS0+Y29udGV4dC50eXBlCisgKiAgICAgICAgICAgcER3bU1vZHVsZS0+Y29udGV4dC5hcHBseV92b2x1bWVfY29ycmVjdGlvbgorICogICAgICAgICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZworICogICAgICAgICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcKKyAqICAgICAgICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlCisgKiAgICAgICAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUKKyAqICAgICAgICAgICBwRHdtTW9kdWxlLT5jb250ZXh0LnN0YXRlCisgKiAgZG9lc24ndCBzZXQ6CisgKiAgICAgICAgICAgcER3bU1vZHVsZS0+aXRmZQorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgRG93bm1peF9Jbml0KGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUpIHsKKworICAgIEFMT0dWKCJEb3dubWl4X0luaXQgbW9kdWxlICVwIiwgcER3bU1vZHVsZSk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBtZW1zZXQoJnBEd21Nb2R1bGUtPmNvbnRleHQsIDAsIHNpemVvZihkb3dubWl4X29iamVjdF90KSk7CisKKyAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CisKKyAgICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICByZXQgPSBEb3dubWl4X0NvbmZpZ3VyZShwRHdtTW9kdWxlLCAmcER3bU1vZHVsZS0+Y29uZmlnLCB0cnVlKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgQUxPR1YoIkRvd25taXhfSW5pdCBlcnJvciAlZCBvbiBtb2R1bGUgJXAiLCByZXQsIHBEd21Nb2R1bGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBEd21Nb2R1bGUtPmNvbnRleHQuc3RhdGUgPSBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVEOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEb3dubWl4X0NvbmZpZ3VyZSgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiAgU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KKyAqCisgKiBJbnB1dHM6CisgKiAgcER3bU1vZHVsZSAgcG9pbnRlciB0byBkb3dubWl4IGVmZmVjdCBtb2R1bGUKKyAqICBwQ29uZmlnICAgICBwb2ludGVyIHRvIGVmZmVjdF9jb25maWdfdCBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnB1dAorICogICAgICAgICAgICAgICAgICBhbmQgb3V0cHV0IGF1ZGlvIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbgorICogIGluaXQgICAgICAgIHRydWUgaWYgY2FsbGVkIGZyb20gaW5pdCBmdW5jdGlvbgorICoKKyAqIE91dHB1dHM6CisgKgorICogUmV0dXJuczoKKyAqICAwICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcworICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdGF0aWMgaW50IERvd25taXhfQ29uZmlndXJlKGRvd25taXhfbW9kdWxlX3QgKnBEd21Nb2R1bGUsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZywgYm9vbCBpbml0KSB7CisKKyAgICBkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyID0gJnBEd21Nb2R1bGUtPmNvbnRleHQ7CisKKyAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQorICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCisgICAgICAgIHx8IHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBBTE9HRSgiRG93bm1peF9Db25maWd1cmUgZXJyb3I6IGludmFsaWQgY29uZmlnIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmICgmcER3bU1vZHVsZS0+Y29uZmlnICE9IHBDb25maWcpIHsKKyAgICAgICAgbWVtY3B5KCZwRHdtTW9kdWxlLT5jb25maWcsIHBDb25maWcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKKyAgICB9CisKKyAgICBpZiAoaW5pdCkgeworICAgICAgICBwRG93bm1peGVyLT50eXBlID0gRE9XTk1JWF9UWVBFX0ZPTEQ7CisgICAgICAgIHBEb3dubWl4ZXItPmFwcGx5X3ZvbHVtZV9jb3JyZWN0aW9uID0gZmFsc2U7CisgICAgICAgIHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQgPSA4OyAvLyBtYXRjaGVzIGRlZmF1bHQgaW5wdXQgb2YgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHdoZW4gY29uZmlndXJpbmcgdGhlIGVmZmVjdCwgZG8gbm90IGFsbG93IGEgYmxhbmsgb3IgdW5zdXBwb3J0ZWQgY2hhbm5lbCBtYXNrCisgICAgICAgIGlmICghRG93bm1peF92YWxpZENoYW5uZWxNYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKSkgeworICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnB1dCBjaGFubmVsIG1hc2soMHgleCkgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHBEb3dubWl4ZXItPmlucHV0X2NoYW5uZWxfY291bnQgPQorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisgICAgfQorCisgICAgRG93bm1peF9SZXNldChwRG93bm1peGVyLCBpbml0KTsKKworICAgIHJldHVybiAwOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRG93bm1peF9SZXNldCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiAgUmVzZXQgaW50ZXJuYWwgc3RhdGVzLgorICoKKyAqIElucHV0czoKKyAqICBwRG93bm1peGVyICAgcG9pbnRlciB0byBkb3dubWl4IGNvbnRleHQKKyAqICBpbml0ICAgICAgICAgdHJ1ZSBpZiBjYWxsZWQgZnJvbSBpbml0IGZ1bmN0aW9uCisgKgorICogT3V0cHV0czoKKyoKKyAqIFJldHVybnM6CisgKiAgMCAgICAgICAgICAgIGluZGljYXRlcyBzdWNjZXNzCisgKgorICogU2lkZSBFZmZlY3RzOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKK3N0YXRpYyBpbnQgRG93bm1peF9SZXNldChkb3dubWl4X29iamVjdF90KiAvKiBwRG93bm1peGVyICovLCBib29sIC8qIGluaXQgKi8pIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICByZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERvd25taXhfc2V0UGFyYW1ldGVyKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIFNldCBhIERvd25taXggcGFyYW1ldGVyCisgKgorICogSW5wdXRzOgorICogIHBEb3dubWl4ZXIgICAgaGFuZGxlIHRvIGluc3RhbmNlIGRhdGEKKyAqICBwYXJhbSAgICAgICAgIHBhcmFtZXRlcgorICogIHBWYWx1ZSAgICAgICAgcG9pbnRlciB0byBwYXJhbWV0ZXIgdmFsdWUKKyAqICBzaXplICAgICAgICAgIHZhbHVlIHNpemUKKyAqCisgKiBPdXRwdXRzOgorICoKKyAqIFJldHVybnM6CisgKiAgMCAgICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcworICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBEb3dubWl4X3NldFBhcmFtZXRlcigKKyAgICAgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqcFZhbHVlKSB7CisKKyAgICBpbnQxNl90IHZhbHVlMTY7CisgICAgQUxPR1YoIkRvd25taXhfc2V0UGFyYW1ldGVyLCBjb250ZXh0ICVwLCBwYXJhbSAlZCwgdmFsdWUxNiAlZCwgdmFsdWUzMiAlZCIsCisgICAgICAgICAgICBwRG93bm1peGVyLCBwYXJhbSwgKihpbnQxNl90ICopcFZhbHVlLCAqKGludDMyX3QgKilwVmFsdWUpOworCisgICAgc3dpdGNoIChwYXJhbSkgeworCisgICAgICBjYXNlIERPV05NSVhfUEFSQU1fVFlQRToKKyAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGRvd25taXhfdHlwZV90KSkgeworICAgICAgICAgICAgQUxPR0UoIkRvd25taXhfc2V0UGFyYW1ldGVyKERPV05NSVhfUEFSQU1fVFlQRSkgaW52YWxpZCBzaXplICV1LCBzaG91bGQgYmUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSwgc2l6ZW9mKGRvd25taXhfdHlwZV90KSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZTE2ID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICBBTE9HVigic2V0IERPV05NSVhfUEFSQU1fVFlQRSwgdHlwZSAlZCIsIHZhbHVlMTYpOworICAgICAgICBpZiAoISgodmFsdWUxNiA+IERPV05NSVhfVFlQRV9JTlZBTElEKSAmJiAodmFsdWUxNiA8PSBET1dOTUlYX1RZUEVfTEFTVCkpKSB7CisgICAgICAgICAgICBBTE9HRSgiRG93bm1peF9zZXRQYXJhbWV0ZXIgaW52YWxpZCBET1dOTUlYX1BBUkFNX1RZUEUgdmFsdWUgJWQiLCB2YWx1ZTE2KTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcERvd25taXhlci0+dHlwZSA9IChkb3dubWl4X3R5cGVfdCkgdmFsdWUxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJEb3dubWl4X3NldFBhcmFtZXRlciB1bmtub3duIHBhcmFtZXRlciAlZCIsIHBhcmFtKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorfQorCisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBEb3dubWl4X3NldFBhcmFtZXRlciAqLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRG93bm1peF9nZXRQYXJhbWV0ZXIoKQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQdXJwb3NlOgorICogR2V0IGEgRG93bm1peCBwYXJhbWV0ZXIKKyAqCisgKiBJbnB1dHM6CisgKiAgcERvd25taXhlciAgICBoYW5kbGUgdG8gaW5zdGFuY2UgZGF0YQorICogIHBhcmFtICAgICAgICAgcGFyYW1ldGVyCisgKiAgcFZhbHVlICAgICAgICBwb2ludGVyIHRvIHZhcmlhYmxlIHRvIGhvbGQgcmV0cmlldmVkIHZhbHVlCisgKiAgcFNpemUgICAgICAgICBwb2ludGVyIHRvIHZhbHVlIHNpemU6IG1heGltdW0gc2l6ZSBhcyBpbnB1dAorICoKKyAqIE91dHB1dHM6CisgKiAgKnBWYWx1ZSB1cGRhdGVkIHdpdGggcGFyYW1ldGVyIHZhbHVlCisgKiAgKnBTaXplIHVwZGF0ZWQgd2l0aCBhY3R1YWwgdmFsdWUgc2l6ZQorICoKKyAqIFJldHVybnM6CisgKiAgMCAgICAgICAgICAgICBpbmRpY2F0ZXMgc3VjY2VzcworICoKKyAqIFNpZGUgRWZmZWN0czoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBEb3dubWl4X2dldFBhcmFtZXRlcigKKyAgICAgICAgZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpIHsKKyAgICBpbnQxNl90ICpwVmFsdWUxNjsKKworICAgIHN3aXRjaCAocGFyYW0pIHsKKworICAgIGNhc2UgRE9XTk1JWF9QQVJBTV9UWVBFOgorICAgICAgaWYgKCpwU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgIEFMT0dFKCJEb3dubWl4X2dldFBhcmFtZXRlciBpbnZhbGlkIHBhcmFtZXRlciBzaXplICV1IGZvciBET1dOTUlYX1BBUkFNX1RZUEUiLCAqcFNpemUpOworICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgfQorICAgICAgcFZhbHVlMTYgPSAoaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICpwVmFsdWUxNiA9IChpbnQxNl90KSBwRG93bm1peGVyLT50eXBlOworICAgICAgKnBTaXplID0gc2l6ZW9mKGludDE2X3QpOworICAgICAgQUxPR1YoIkRvd25taXhfZ2V0UGFyYW1ldGVyIERPV05NSVhfUEFSQU1fVFlQRSBpcyAlZCIsICpwVmFsdWUxNik7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBBTE9HRSgiRG93bm1peF9nZXRQYXJhbWV0ZXIgdW5rbm93biBwYXJhbWV0ZXIgJWQiLCBwYXJhbSk7CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30gLyogZW5kIERvd25taXhfZ2V0UGFyYW1ldGVyICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEb3dubWl4X2ZvbGRGcm9tUXVhZCgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBkb3dubWl4IGEgcXVhZCBzaWduYWwgdG8gc3RlcmVvCisgKgorICogSW5wdXRzOgorICogIHBTcmMgICAgICAgcXVhZCBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKKyAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgcXVhZCBmcmFtZXMgdG8gZG93bm1peAorICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAorICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKKyAqCisgKiBPdXRwdXRzOgorICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoZmxvYXQgKnBTcmMsIGZsb2F0ICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgUkwKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBSUgorICAgIGlmIChhY2N1bXVsYXRlKSB7CisgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKKyAgICAgICAgICAgIC8vIEZMICsgUkwKKyAgICAgICAgICAgIHBEc3RbMF0gPSBjbGFtcF9mbG9hdChwRHN0WzBdICsgKChwU3JjWzBdICsgcFNyY1syXSkgLyAyLjBmKSk7CisgICAgICAgICAgICAvLyBGUiArIFJSCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArICgocFNyY1sxXSArIHBTcmNbM10pIC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBGTCArIFJMCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQoKHBTcmNbMF0gKyBwU3JjWzJdKSAvIDIuMGYpOworICAgICAgICAgICAgLy8gRlIgKyBSUgorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KChwU3JjWzFdICsgcFNyY1szXSkgLyAyLjBmKTsKKyAgICAgICAgICAgIHBTcmMgKz0gNDsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERvd25taXhfZm9sZEZyb201UG9pbnQxKCkKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUHVycG9zZToKKyAqIGRvd25taXggYSA1LjEgc2lnbmFsIHRvIHN0ZXJlbworICoKKyAqIElucHV0czoKKyAqICBwU3JjICAgICAgIDUuMSBhdWRpbyBzYW1wbGVzIHRvIGRvd25taXgKKyAqICBudW1GcmFtZXMgIHRoZSBudW1iZXIgb2YgNS4xIGZyYW1lcyB0byBkb3dubWl4CisgKiAgYWNjdW11bGF0ZSB3aGV0aGVyIHRvIG1peCAod2hlbiB0cnVlKSB0aGUgcmVzdWx0IG9mIHRoZSBkb3dubWl4IHdpdGggdGhlIGNvbnRlbnRzIG9mIHBEc3QsCisgKiAgICAgICAgICAgICAgIG9yIG92ZXJ3cml0ZSBwRHN0ICh3aGVuIGZhbHNlKQorICoKKyAqIE91dHB1dHM6CisgKiAgcERzdCAgICAgICBkb3dubWl4ZWQgc3RlcmVvIGF1ZGlvIHNhbXBsZXMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShmbG9hdCAqcFNyYywgZmxvYXQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSkgeworICAgIGZsb2F0IGx0LCBydCwgY2VudGVyUGx1c0xmZUNvbnRyaWI7IC8vIHNhbXBsZXMgaW4gUTE5LjEyIGZvcm1hdAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAwIGlzIEZMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDEgaXMgRlIKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMiBpcyBGQworICAgIC8vIHNhbXBsZSBhdCBpbmRleCAzIGlzIExGRQorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA0IGlzIFJMCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDUgaXMgUlIKKyAgICAvLyBjb2RlIGlzIG1vc3RseSBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIHR3byB2YWx1ZXMgb2YgYWNjdW11bGF0ZSB0byBhdm9pZCByZXBlYXRpbmcgdGhlIHRlc3QKKyAgICAvLyBmb3IgZXZlcnkgc2FtcGxlCisgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBSTAorICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJSCisgICAgICAgICAgICBydCA9IHBTcmNbMV0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBhY2N1bXVsYXRlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQocERzdFswXSArIChsdCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBEc3RbMV0gPSBjbGFtcF9mbG9hdChwRHN0WzFdICsgKHJ0IC8gMi4wZikpOworICAgICAgICAgICAgcFNyYyArPSA2OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzYW1lIGNvZGUgYXMgYWJvdmUgYnV0IHdpdGhvdXQgYWRkaW5nIGFuZCBjbGFtcGluZyBwRHN0W2ldIHRvIGl0c2VsZgorICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vIHN0b3JlIGluIGRlc3RpbmF0aW9uCisgICAgICAgICAgICBwRHN0WzBdID0gY2xhbXBfZmxvYXQobHQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocnQgLyAyLjBmKTsgLy8gZGlmZmVycyBmcm9tIHdoZW4gYWNjdW11bGF0ZSBpcyB0cnVlIGFib3ZlCisgICAgICAgICAgICBwU3JjICs9IDY7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBEb3dubWl4X2ZvbGRGcm9tN1BvaW50MSgpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBkb3dubWl4IGEgNy4xIHNpZ25hbCB0byBzdGVyZW8KKyAqCisgKiBJbnB1dHM6CisgKiAgcFNyYyAgICAgICA3LjEgYXVkaW8gc2FtcGxlcyB0byBkb3dubWl4CisgKiAgbnVtRnJhbWVzICB0aGUgbnVtYmVyIG9mIDcuMSBmcmFtZXMgdG8gZG93bm1peAorICogIGFjY3VtdWxhdGUgd2hldGhlciB0byBtaXggKHdoZW4gdHJ1ZSkgdGhlIHJlc3VsdCBvZiB0aGUgZG93bm1peCB3aXRoIHRoZSBjb250ZW50cyBvZiBwRHN0LAorICogICAgICAgICAgICAgICBvciBvdmVyd3JpdGUgcERzdCAod2hlbiBmYWxzZSkKKyAqCisgKiBPdXRwdXRzOgorICogIHBEc3QgICAgICAgZG93bm1peGVkIHN0ZXJlbyBhdWRpbyBzYW1wbGVzCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3ZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoZmxvYXQgKnBTcmMsIGZsb2F0ICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpIHsKKyAgICBmbG9hdCBsdCwgcnQsIGNlbnRlclBsdXNMZmVDb250cmliOyAvLyBzYW1wbGVzIGluIFExOS4xMiBmb3JtYXQKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMCBpcyBGTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCAxIGlzIEZSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDIgaXMgRkMKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggMyBpcyBMRkUKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNCBpcyBSTAorICAgIC8vIHNhbXBsZSBhdCBpbmRleCA1IGlzIFJSCisgICAgLy8gc2FtcGxlIGF0IGluZGV4IDYgaXMgU0wKKyAgICAvLyBzYW1wbGUgYXQgaW5kZXggNyBpcyBTUgorICAgIC8vIGNvZGUgaXMgbW9zdGx5IGR1cGxpY2F0ZWQgYmV0d2VlbiB0aGUgdHdvIHZhbHVlcyBvZiBhY2N1bXVsYXRlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGUgdGVzdAorICAgIC8vIGZvciBldmVyeSBzYW1wbGUKKyAgICBpZiAoYWNjdW11bGF0ZSkgeworICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOworICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKKyAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CisgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgorICAgICAgICAgICAgcnQgPSBwU3JjWzFdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzddICsgcFNyY1s1XTsKKyAgICAgICAgICAgIC8vYWNjdW11bGF0ZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KHBEc3RbMF0gKyAobHQgLyAyLjBmKSk7CisgICAgICAgICAgICBwRHN0WzFdID0gY2xhbXBfZmxvYXQocERzdFsxXSArIChydCAvIDIuMGYpKTsKKyAgICAgICAgICAgIHBTcmMgKz0gODsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIG51bUZyYW1lcy0tOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gc2FtZSBjb2RlIGFzIGFib3ZlIGJ1dCB3aXRob3V0IGFkZGluZyBhbmQgY2xhbXBpbmcgcERzdFtpXSB0byBpdHNlbGYKKyAgICAgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICAgICAgLy8gY2VudGVyUGx1c0xmZUNvbnRyaWIgPSBGQygtM2RCKSArIExGRSgtM2RCKQorICAgICAgICAgICAgY2VudGVyUGx1c0xmZUNvbnRyaWIgPSAocFNyY1syXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpCisgICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKTsKKyAgICAgICAgICAgIC8vIEZMICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTTCArIFJMCisgICAgICAgICAgICBsdCA9IHBTcmNbMF0gKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIHBTcmNbNl0gKyBwU3JjWzRdOworICAgICAgICAgICAgLy8gRlIgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNSICsgUlIKKyAgICAgICAgICAgIHJ0ID0gcFNyY1sxXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s3XSArIHBTcmNbNV07CisgICAgICAgICAgICAvLyBzdG9yZSBpbiBkZXN0aW5hdGlvbgorICAgICAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGx0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KHJ0IC8gMi4wZik7IC8vIGRpZmZlcnMgZnJvbSB3aGVuIGFjY3VtdWxhdGUgaXMgdHJ1ZSBhYm92ZQorICAgICAgICAgICAgcFNyYyArPSA4OworICAgICAgICAgICAgcERzdCArPSAyOworICAgICAgICAgICAgbnVtRnJhbWVzLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRG93bm1peF9mb2xkR2VuZXJpYygpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFB1cnBvc2U6CisgKiBkb3dubWl4IHRvIHN0ZXJlbyBhIG11bHRpY2hhbm5lbCBzaWduYWwgb2YgYXJiaXRyYXJ5IGNoYW5uZWwgcG9zaXRpb24gbWFzay4KKyAqCisgKiBJbnB1dHM6CisgKiAgbWFzayAgICAgICB0aGUgY2hhbm5lbCBtYXNrIG9mIHBTcmMKKyAqICBwU3JjICAgICAgIG11bHRpY2hhbm5lbCBhdWRpbyBidWZmZXIgdG8gZG93bm1peAorICogIG51bUZyYW1lcyAgdGhlIG51bWJlciBvZiBtdWx0aWNoYW5uZWwgZnJhbWVzIHRvIGRvd25taXgKKyAqICBhY2N1bXVsYXRlIHdoZXRoZXIgdG8gbWl4ICh3aGVuIHRydWUpIHRoZSByZXN1bHQgb2YgdGhlIGRvd25taXggd2l0aCB0aGUgY29udGVudHMgb2YgcERzdCwKKyAqICAgICAgICAgICAgICAgb3Igb3ZlcndyaXRlIHBEc3QgKHdoZW4gZmFsc2UpCisgKgorICogT3V0cHV0czoKKyAqICBwRHN0ICAgICAgIGRvd25taXhlZCBzdGVyZW8gYXVkaW8gc2FtcGxlcworICoKKyAqIFJldHVybnM6IGZhbHNlIGlmIG11bHRpY2hhbm5lbCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZAorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitib29sIERvd25taXhfZm9sZEdlbmVyaWMoCisgICAgICAgIHVpbnQzMl90IG1hc2ssIGZsb2F0ICpwU3JjLCBmbG9hdCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKSB7CisKKyAgICBpZiAoIURvd25taXhfdmFsaWRDaGFubmVsTWFzayhtYXNrKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvbnN0IGludCBudW1DaGFuID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1hc2spOworCisgICAgLy8gY29tcHV0ZSBhdCB3aGF0IGluZGV4IGVhY2ggY2hhbm5lbCBpczogc2FtcGxlcyB3aWxsIGJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgLy8gICBGTCAgRlIgIEZDICAgIExGRSAgIEJMICBCUiAgQkMgICAgU0wgIFNSCisgICAgLy8KKyAgICAvLyAgKHRyYW5zZmVyIG1hdHJpeCkKKyAgICAvLyAgIEZMICBGUiAgRkMgICAgTEZFICAgQkwgIEJSICBCQyAgICBTTCAgU1IKKyAgICAvLyAgIDAuNSAgICAgMC4zNTMgMC4zNTMgMC41ICAgICAwLjM1MyAwLjUKKyAgICAvLyAgICAgICAwLjUgMC4zNTMgMC4zNTMgICAgIDAuNSAwLjM1MyAgICAgMC41CisKKyAgICAvLyBkZXJpdmUgdGhlIGluZGljZXMgZm9yIHRoZSB0cmFuc2ZlciBtYXRyaXggY29sdW1ucyB0aGF0IGhhdmUgbm9uLXplcm8gdmFsdWVzLgorICAgIGludCBpbmRleEZMID0gLTE7CisgICAgaW50IGluZGV4RlIgPSAtMTsKKyAgICBpbnQgaW5kZXhGQyA9IC0xOworICAgIGludCBpbmRleExGRSA9IC0xOworICAgIGludCBpbmRleEJMID0gLTE7CisgICAgaW50IGluZGV4QlIgPSAtMTsKKyAgICBpbnQgaW5kZXhCQyA9IC0xOworICAgIGludCBpbmRleFNMID0gLTE7CisgICAgaW50IGluZGV4U1IgPSAtMTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAodW5zaWduZWQgdG1wID0gbWFzazsKKyAgICAgICAgICh0bXAgJiAoQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSB8IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSKSkgIT0gMDsKKyAgICAgICAgICsraW5kZXgpIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbG93ZXN0Qml0ID0gdG1wICYgLShzaWduZWQpdG1wOworICAgICAgICBzd2l0Y2ggKGxvd2VzdEJpdCkgeworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQ6CisgICAgICAgICAgICBpbmRleEZMID0gaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDoKKyAgICAgICAgICAgIGluZGV4RlIgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUjoKKyAgICAgICAgICAgIGluZGV4RkMgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1k6CisgICAgICAgICAgICBpbmRleExGRSA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUOgorICAgICAgICAgICAgaW5kZXhCTCA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVDoKKyAgICAgICAgICAgIGluZGV4QlIgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSOgorICAgICAgICAgICAgaW5kZXhCQyA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUOgorICAgICAgICAgICAgaW5kZXhTTCA9IGluZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVDoKKyAgICAgICAgICAgIGluZGV4U1IgPSBpbmRleDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRtcCBePSBsb3dlc3RCaXQ7CisgICAgfQorCisgICAgLy8gV2l0aCBnb29kIGJyYW5jaCBwcmVkaWN0aW9uLCB0aGlzIHNob3VsZCBydW4gcmVhc29uYWJseSBmYXN0LgorICAgIC8vIEFsc28gY29uc2lkZXIgdXNpbmcgYSB0cmFuc2ZlciBtYXRyaXggZm9ybS4KKyAgICB3aGlsZSAobnVtRnJhbWVzKSB7CisgICAgICAgIC8vIGNvbXB1dGUgY29udHJpYnV0aW9uIG9mIEZDLCBCQyBhbmQgTEZFCisgICAgICAgIGZsb2F0IGNlbnRlcnNMZmVDb250cmliID0gMDsKKyAgICAgICAgaWYgKGluZGV4RkMgPj0gMCkgY2VudGVyc0xmZUNvbnRyaWIgPSBwU3JjW2luZGV4RkNdOworICAgICAgICBpZiAoaW5kZXhMRkUgPj0gMCkgY2VudGVyc0xmZUNvbnRyaWIgKz0gcFNyY1tpbmRleExGRV07CisgICAgICAgIGlmIChpbmRleEJDID49IDApIGNlbnRlcnNMZmVDb250cmliICs9IHBTcmNbaW5kZXhCQ107CisgICAgICAgIGNlbnRlcnNMZmVDb250cmliICo9IE1JTlVTXzNfREJfSU5fRkxPQVQ7CisKKyAgICAgICAgZmxvYXQgY2hbMl07CisgICAgICAgIGNoWzBdID0gY2VudGVyc0xmZUNvbnRyaWI7CisgICAgICAgIGNoWzFdID0gY2VudGVyc0xmZUNvbnRyaWI7CisKKyAgICAgICAgLy8gbWl4IGluIGxlZnQgLyByaWdodCBjaGFubmVscworICAgICAgICBpZiAoaW5kZXhGTCA+PSAwKSBjaFswXSArPSBwU3JjW2luZGV4RkxdOworICAgICAgICBpZiAoaW5kZXhGUiA+PSAwKSBjaFsxXSArPSBwU3JjW2luZGV4RlJdOworCisgICAgICAgIGlmIChpbmRleFNMID49IDApIGNoWzBdICs9IHBTcmNbaW5kZXhTTF07CisgICAgICAgIGlmIChpbmRleFNSID49IDApIGNoWzFdICs9IHBTcmNbaW5kZXhTUl07IC8vIG5vdGUgcGFpciBjaGVja3MgZW5mb3JjZSB0aGlzIGlmIGluZGV4U0wgIT0gMAorCisgICAgICAgIGlmIChpbmRleEJMID49IDApIGNoWzBdICs9IHBTcmNbaW5kZXhCTF07CisgICAgICAgIGlmIChpbmRleEJSID49IDApIGNoWzFdICs9IHBTcmNbaW5kZXhCUl07IC8vIG5vdGUgcGFpciBjaGVja3MgZW5mb3JjZSB0aGlzIGlmIGluZGV4QkwgIT0gMAorCisgICAgICAgIC8vIHNjYWxlIHRvIHByZXZlbnQgb3ZlcmZsb3cuCisgICAgICAgIGNoWzBdICo9IDAuNWY7CisgICAgICAgIGNoWzFdICo9IDAuNWY7CisKKyAgICAgICAgaWYgKGFjY3VtdWxhdGUpIHsKKyAgICAgICAgICAgIGNoWzBdICs9IHBEc3RbMF07CisgICAgICAgICAgICBjaFsxXSArPSBwRHN0WzFdOworICAgICAgICB9CisKKyAgICAgICAgcERzdFswXSA9IGNsYW1wX2Zsb2F0KGNoWzBdKTsKKyAgICAgICAgcERzdFsxXSA9IGNsYW1wX2Zsb2F0KGNoWzFdKTsKKyAgICAgICAgcFNyYyArPSBudW1DaGFuOworICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgIG51bUZyYW1lcy0tOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5oCmluZGV4IGMxYmUwZjIuLjEyMDY1MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguaApAQCAtMTgsOTcgKzE4LDkgQEAKICNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RET1dOTUlYX0hfCiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogZGVmaW5pdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0jZGVmaW5lIERPV05NSVhfT1VUUFVUX0NIQU5ORUxTIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0jZGVmaW5lIExWTV9GTE9BVCBmbG9hdAotI2VuZGlmCi10eXBlZGVmIGVudW0gewotICAgIERPV05NSVhfU1RBVEVfVU5JTklUSUFMSVpFRCwKLSAgICBET1dOTUlYX1NUQVRFX0lOSVRJQUxJWkVELAotICAgIERPV05NSVhfU1RBVEVfQUNUSVZFLAotfSBkb3dubWl4X3N0YXRlX3Q7Ci0KLS8qIHBhcmFtZXRlcnMgZm9yIGVhY2ggZG93bm1peGVyICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZG93bm1peF9zdGF0ZV90IHN0YXRlOwotICAgIGRvd25taXhfdHlwZV90IHR5cGU7Ci0gICAgYm9vbCBhcHBseV92b2x1bWVfY29ycmVjdGlvbjsKLSAgICB1aW50OF90IGlucHV0X2NoYW5uZWxfY291bnQ7Ci19IGRvd25taXhfb2JqZWN0X3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgZG93bm1peF9tb2R1bGVfcyB7Ci0gICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOwotICAgIGRvd25taXhfb2JqZWN0X3QgY29udGV4dDsKLX0gZG93bm1peF9tb2R1bGVfdDsKLQotY29uc3QgdWludDMyX3Qga1NpZGVzID0gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUIHwgQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVDsKLWNvbnN0IHVpbnQzMl90IGtCYWNrcyA9IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCB8IEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQ7Ci1jb25zdCB1aW50MzJfdCBrVW5zdXBwb3J0ZWQgPQotICAgICAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiB8IEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiB8Ci0gICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgfAotICAgICAgICBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCB8Ci0gICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIgfAotICAgICAgICBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgfAotICAgICAgICBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUIHwKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSIHwKLSAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBFZmZlY3QgQVBJCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLWludDMyX3QgRG93bm1peExpYl9DcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCi0gICAgICAgIGludDMyX3QgaW9JZCwKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKLWludDMyX3QgRG93bm1peExpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpOwotaW50MzJfdCBEb3dubWl4TGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi1zdGF0aWMgaW50IERvd25taXhfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKLSAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLAotICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKLXN0YXRpYyBpbnQgRG93bm1peF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICB1aW50MzJfdCBjbWRTaXplLAotICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKLSAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSk7Ci1zdGF0aWMgaW50IERvd25taXhfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBpbnRlcm5hbCBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotaW50IERvd25taXhfSW5pdChkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlKTsKLWludCBEb3dubWl4X0NvbmZpZ3VyZShkb3dubWl4X21vZHVsZV90ICpwRHdtTW9kdWxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGJvb2wgaW5pdCk7Ci1pbnQgRG93bm1peF9SZXNldChkb3dubWl4X29iamVjdF90ICpwRG93bm1peGVyLCBib29sIGluaXQpOwotaW50IERvd25taXhfc2V0UGFyYW1ldGVyKGRvd25taXhfb2JqZWN0X3QgKnBEb3dubWl4ZXIsIGludDMyX3QgcGFyYW0sIHVpbnQzMl90IHNpemUsIHZvaWQgKnBWYWx1ZSk7Ci1pbnQgRG93bm1peF9nZXRQYXJhbWV0ZXIoZG93bm1peF9vYmplY3RfdCAqcERvd25taXhlciwgaW50MzJfdCBwYXJhbSwgdWludDMyX3QgKnBTaXplLCB2b2lkICpwVmFsdWUpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIERvd25taXhfZm9sZEZyb21RdWFkKExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwotdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShMVk1fRkxPQVQgKnBTcmMsIExWTV9GTE9BVCAqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLXZvaWQgRG93bm1peF9mb2xkRnJvbTdQb2ludDEoTFZNX0ZMT0FUICpwU3JjLCBMVk1fRkxPQVQgKnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci1ib29sIERvd25taXhfZm9sZEdlbmVyaWMoCi0gICAgICAgIHVpbnQzMl90IG1hc2ssIExWTV9GTE9BVCAqcFNyYywgTFZNX0ZMT0FUICpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwotI2Vsc2UKLXZvaWQgRG93bm1peF9mb2xkRnJvbVF1YWQoaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwotdm9pZCBEb3dubWl4X2ZvbGRGcm9tNVBvaW50MShpbnQxNl90ICpwU3JjLCBpbnQxNl90KnBEc3QsIHNpemVfdCBudW1GcmFtZXMsIGJvb2wgYWNjdW11bGF0ZSk7Ci12b2lkIERvd25taXhfZm9sZEZyb203UG9pbnQxKGludDE2X3QgKnBTcmMsIGludDE2X3QqcERzdCwgc2l6ZV90IG51bUZyYW1lcywgYm9vbCBhY2N1bXVsYXRlKTsKLWJvb2wgRG93bm1peF9mb2xkR2VuZXJpYygKLSAgICAgICAgdWludDMyX3QgbWFzaywgaW50MTZfdCAqcFNyYywgaW50MTZfdCpwRHN0LCBzaXplX3QgbnVtRnJhbWVzLCBib29sIGFjY3VtdWxhdGUpOwotI2VuZGlmCisvLyBVc2UgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiB0byBvYnRhaW4gdGhlIERvd25taXggbGlicmFyeSBpbmZvcm1hdGlvbi4KKy8vIGV4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOwogCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVERPV05NSVhfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjE0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvYmVuY2htYXJrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorLy8gQnVpbGQgdGVzdGJlbmNoIGZvciBkb3dubWl4IG1vZHVsZS4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfZG93bm1peF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19kb3dubWl4X2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2JlbmNobWFyayB7CisgICAgbmFtZTogImRvd25taXhfYmVuY2htYXJrIiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmRvd25taXgiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAiZG93bm1peF9iZW5jaG1hcmsuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvYmVuY2htYXJrL2Rvd25taXhfYmVuY2htYXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTE2OWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L2JlbmNobWFyay9kb3dubWl4X2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0RG93bm1peC5oIgorCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hhbm5lbFBvc2l0aW9uTWFza3NbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZULAorICAgIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiwKKyAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKKyAgICBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNCwKKyAgICBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfMTNQT0lOVF8zNjBSQSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yMlBPSU5UMiwKK307CisKK3N0YXRpYyBjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBkb3dubWl4X3V1aWQgPSB7CisgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0ZyYW1lQ291bnQgPSAxMDAwOworCisvKgorUGl4ZWwgM1hMCitkb3dubWl4X2JlbmNobWFyazoKKyAgI0JNX0Rvd25taXgvMCAgICAgNDcyMyBucyAgICA0NzA4IG5zICAgICAgIDE0ODY5NAorICAjQk1fRG93bm1peC8xICAgICA0NzE3IG5zICAgIDQ3MDIgbnMgICAgICAgMTQ4ODczCisgICNCTV9Eb3dubWl4LzIgICAgIDQ4MDMgbnMgICAgNDc4OCBucyAgICAgICAxNDU4OTMKKyAgI0JNX0Rvd25taXgvMyAgICAgNTA1NiBucyAgICA1MDQxIG5zICAgICAgIDEzOTExMAorICAjQk1fRG93bm1peC80ICAgICA0NzEwIG5zICAgIDQ2OTYgbnMgICAgICAgMTQ5NjI1CisgICNCTV9Eb3dubWl4LzUgICAgIDE1MTQgbnMgICAgMTUwOSBucyAgICAgICA0NjM2OTQKKyAgI0JNX0Rvd25taXgvNiAgICAgMTUxMyBucyAgICAxNTA5IG5zICAgICAgIDQ2MzQ1MQorICAjQk1fRG93bm1peC83ICAgICAxNTE2IG5zICAgIDE1MTEgbnMgICAgICAgNDYzODk5CisgICNCTV9Eb3dubWl4LzggICAgIDQ0NDUgbnMgICAgNDQzMSBucyAgICAgICAxNTc4MzEKKyAgI0JNX0Rvd25taXgvOSAgICAgNTA4MSBucyAgICA1MDY1IG5zICAgICAgIDEzODQxMgorICAjQk1fRG93bm1peC8xMCAgICA0MzU0IG5zICAgIDQzNDEgbnMgICAgICAgMTYxMjQ3CisgICNCTV9Eb3dubWl4LzExICAgIDQ0MTEgbnMgICAgNDM5NyBucyAgICAgICAxNTg4OTMKKyAgI0JNX0Rvd25taXgvMTIgICAgNDQzNCBucyAgICA0NDIwIG5zICAgICAgIDE1Nzk5MgorICAjQk1fRG93bm1peC8xMyAgICA0ODQ1IG5zICAgIDQ4MzAgbnMgICAgICAgMTQ0ODczCisgICNCTV9Eb3dubWl4LzE0ICAgIDQ4NTEgbnMgICAgNDgzNSBucyAgICAgICAxNDQ5NTQKKyAgI0JNX0Rvd25taXgvMTUgICAgNDg4NCBucyAgICA0ODcwIG5zICAgICAgIDE0NDIzMworICAjQk1fRG93bm1peC8xNiAgICA1ODMyIG5zICAgIDU4MTMgbnMgICAgICAgMTIwNTY1CisgICNCTV9Eb3dubWl4LzE3ICAgIDUyNDEgbnMgICAgNTIyNCBucyAgICAgICAxMzM5MjcKKyAgI0JNX0Rvd25taXgvMTggICAgNTA0NCBucyAgICA1MDI4IG5zICAgICAgIDEzOTEzMQorICAjQk1fRG93bm1peC8xOSAgICA1MjQ0IG5zICAgIDUyMjcgbnMgICAgICAgMTMyMzE1CisgICNCTV9Eb3dubWl4LzIwICAgIDU5NDMgbnMgICAgNTkyMyBucyAgICAgICAxMTc3NTkKKyAgI0JNX0Rvd25taXgvMjEgICAgNTk5MCBucyAgICA1OTcxIG5zICAgICAgIDExNzI2MworICAjQk1fRG93bm1peC8yMiAgICA0NDY4IG5zICAgIDQ0NTQgbnMgICAgICAgMTU2Njg5CisgICNCTV9Eb3dubWl4LzIzICAgIDczMDYgbnMgICAgNzI4NiBucyAgICAgICAgOTU5MTEKKy0tCitkb3dubWl4X2JlbmNobWFyazogKGdlbmVyaWMgZm9sZCkKKyAgI0JNX0Rvd25taXgvMCAgICAgNDcyMiBucyAgICA0NzA3IG5zICAgICAgIDE0OTg0NworICAjQk1fRG93bm1peC8xICAgICA0NzE0IG5zICAgIDQ2OTggbnMgICAgICAgMTQ4NzQ4CisgICNCTV9Eb3dubWl4LzIgICAgIDQ3OTQgbnMgICAgNDc3OSBucyAgICAgICAxNDU2NjEKKyAgI0JNX0Rvd25taXgvMyAgICAgNTA1MyBucyAgICA1MDM1IG5zICAgICAgIDEzOTE3MgorICAjQk1fRG93bm1peC80ICAgICA0Njk1IG5zICAgIDQ2NzggbnMgICAgICAgMTQ5NzYyCisgICNCTV9Eb3dubWl4LzUgICAgIDQzODEgbnMgICAgNDM2OCBucyAgICAgICAxNTk2NzUKKyAgI0JNX0Rvd25taXgvNiAgICAgNDM4NyBucyAgICA0MzczIG5zICAgICAgIDE2MDI2NworICAjQk1fRG93bm1peC83ICAgICA0NzMyIG5zICAgIDQ3MTcgbnMgICAgICAgMTQ4NTE0CisgICNCTV9Eb3dubWl4LzggICAgIDQ0MzAgbnMgICAgNDQxNSBucyAgICAgICAxNTgxMzMKKyAgI0JNX0Rvd25taXgvOSAgICAgNTEwMSBucyAgICA1MDg0IG5zICAgICAgIDEzODM1MworICAjQk1fRG93bm1peC8xMCAgICA0MzU2IG5zICAgIDQzNDMgbnMgICAgICAgMTYwODIxCisgICNCTV9Eb3dubWl4LzExICAgIDQzOTcgbnMgICAgNDM4MyBucyAgICAgICAxNTk5OTUKKyAgI0JNX0Rvd25taXgvMTIgICAgNDQzOCBucyAgICA0NDI0IG5zICAgICAgIDE1ODExNworICAjQk1fRG93bm1peC8xMyAgICA1MjQzIG5zICAgIDUyMjYgbnMgICAgICAgMTMzODYzCisgICNCTV9Eb3dubWl4LzE0ICAgIDUyNTkgbnMgICAgNTI0MiBucyAgICAgICAxMzE4NTUKKyAgI0JNX0Rvd25taXgvMTUgICAgNTI0NSBucyAgICA1MjI4IG5zICAgICAgIDEzMzY4NgorICAjQk1fRG93bm1peC8xNiAgICA1ODI5IG5zICAgIDU4MDkgbnMgICAgICAgMTIwNTQzCisgICNCTV9Eb3dubWl4LzE3ICAgIDUyNDUgbnMgICAgNTIyOCBucyAgICAgICAxMzM1MzMKKyAgI0JNX0Rvd25taXgvMTggICAgNTkzNSBucyAgICA1OTE2IG5zICAgICAgIDExODI4MgorICAjQk1fRG93bm1peC8xOSAgICA1MjYzIG5zICAgIDUyNDUgbnMgICAgICAgMTMzNjU3CisgICNCTV9Eb3dubWl4LzIwICAgIDU5OTggbnMgICAgNTk3OCBucyAgICAgICAxMTQ2OTMKKyAgI0JNX0Rvd25taXgvMjEgICAgNTk4OSBucyAgICA1OTY5IG5zICAgICAgIDExNzQ1MAorICAjQk1fRG93bm1peC8yMiAgICA0NDQyIG5zICAgIDQ0MzEgbnMgICAgICAgMTU3OTEzCisgICNCTV9Eb3dubWl4LzIzICAgIDczMDkgbnMgICAgNzI5MCBucyAgICAgICAgOTU3OTcKKyovCisKK3N0YXRpYyB2b2lkIEJNX0Rvd25taXgoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGtDaGFubmVsUG9zaXRpb25NYXNrc1tzdGF0ZS5yYW5nZSgwKV07CisgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CisgICAgY29uc3QgaW50IHNhbXBsZVJhdGUgPSA0ODAwMDsKKworICAgIC8vIEluaXRpYWxpemUgaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKGNoYW5uZWxNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChrRnJhbWVDb3VudCAqIDIpOworICAgIGZvciAoYXV0byYgaW4gOiBpbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAgICAgICAmZG93bm1peF91dWlkLCAxLCAxLCAmZWZmZWN0SGFuZGxlKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZV9lZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWd7fTsKKyAgICBjb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IG51bGxwdHI7CisgICAgY29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBudWxscHRyOworICAgIGNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICAgIGNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICBjb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKKyAgICBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICAgIGNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgY29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICAgIGNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisKKyAgICBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsgLy8gb3V0cHV0IGFsd2F5cyBzdGVyZW8KKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNvbW1hbmQgZW5hYmxlIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJlcGx5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJ1biB0aGUgdGVzdAorICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGlucHV0LmRhdGEoKSk7CisgICAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShvdXRwdXQuZGF0YSgpKTsKKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IGtGcmFtZUNvdW50LCAuZjMyID0gaW5wdXQuZGF0YSgpfTsKKyAgICAgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBvdXRwdXQuZGF0YSgpfTsKKyAgICAgICAgKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKworICAgICAgICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgICB9CisKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBEb3dubWl4QXJncyhiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIGIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpc3RkOjpzaXplKGtDaGFubmVsUG9zaXRpb25NYXNrcyk7IGkrKykgeworICAgICAgICBiLT5BcmdzKHtpfSk7CisgICAgfQorfQorCitCRU5DSE1BUksoQk1fRG93bm1peCktPkFwcGx5KERvd25taXhBcmdzKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjNhZmM1NC4uNDk0MDExNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw1MiBAQAogLy8gQnVpbGQgdGVzdGJlbmNoIGZvciBkb3dubWl4IG1vZHVsZS4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfZG93bm1peF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19kb3dubWl4X2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIFRoaXMgaXMgYSBndGVzdCB1bml0IHRlc3QuCisvLworLy8gVXNlICJhdGVzdCBkb3dubWl4X3Rlc3RzIiB0byBydW4uCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4X3Rlc3RzIiwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZG93bm1peCIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJkb3dubWl4X3Rlc3RzLmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKK30KKworLy8gVGhpcyBpcyBhIHRlc3QgYXBwbGljYXRpb24gd2hpY2ggZ2VuZXJhdGVzIGRvd25taXhlZCBmaWxlcyBmb3IgcmVncmVzc2lvbgorLy8gYW5hbHlzaXMuCisvLworLy8gU2VlIGJ1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggZm9yIGEgdGVzdCBzY3JpcHQgdGhhdCB1c2VzIHRoaXMKKy8vIHRlc3QgYXBwbGljYXRpb24gYW5kIG91dHB1dHMgdGhlbiBjb21wYXJlcyBmaWxlcyBpbiBhIGxvY2FsIGRpcmVjdG9yeQorLy8gb24gZGV2aWNlICgvZGF0YS9sb2NhbC90bXAvZG93bm1peHRlc3QvKS4KIGNjX3Rlc3QgewogICAgIG5hbWU6ImRvd25taXh0ZXN0IiwKICAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCmluZGV4IGQwZmFlYmUuLjhhYWRmYmYgMTAwNzU1Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0zOSw4ICszOSw3IEBACiBlY2hvICJ0ZXN0aW5nIERvd25taXgiCiBhZGIgc2hlbGwgbWtkaXIgJHRlc3RkaXIKIAotYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgXAotJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCiBhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgogCiAjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peF90ZXN0cy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peF90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiN2EzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4X3Rlc3RzLmNwcApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJFZmZlY3REb3dubWl4LmgiCisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9TdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hhbm5lbFBvc2l0aW9uTWFza3NbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZULCAvLyBMZWdhY3k6IHRoZSBkb3dubWl4IGVmZmVjdCB0cmVhdHMgTU9OTyBhcyBGUk9OVF9MRUZUIG9ubHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEF1ZGlvTWl4ZXIgaW50ZXJwcmV0cyBNT05PIGFzIGEgc3BlY2lhbCBjYXNlIHJlcXVpcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgcmVwbGljYXRpb24sIGJ5cGFzc2luZyB0aGUgZG93bm1peCBlZmZlY3QuCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQ0LAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCwKKyAgICBBVURJT19DSEFOTkVMX09VVF8xM1BPSU5UXzM2MFJBLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzIyUE9JTlQyLAorfTsKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ29uc2lkZXJlZENoYW5uZWxzID0KKyAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEgfCBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUik7CisKKy8vIERvd25taXggZG9lc24ndCBjaGFuZ2Ugd2l0aCBzYW1wbGUgcmF0ZQorc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1NhbXBsZVJhdGVzW10gPSB7CisgICAgNDgwMDAsCit9OworCisvLyBPdXIgbmVhciBleHBlY3RhdGlvbiBpcyAxNnggdGhlIGJpdCB0aGF0IGRvZXNuJ3QgZml0IHRoZSBtYW50aXNzYS4KKy8vIHRoaXMgd29ya3Mgc28gbG9uZyBhcyB3ZSBhZGQgdmFsdWVzIGNsb3NlIGluIGV4cG9uZW50IHdpdGggZWFjaCBvdGhlcgorLy8gcmVhbGl6aW5nIHRoYXQgZXJyb3JzIGFjY3VtdWxhdGUgYXMgdGhlIHNxcnQgb2YgTiAocmFuZG9tIHdhbGssIGxsbiwgZXRjKS4KKyNkZWZpbmUgRVhQRUNUX05FQVJfRVBTSUxPTihlLCB2KSBFWFBFQ1RfTkVBUigoZSksICh2KSwgXAorICAgICAgICBhYnMoKGUpICogc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUoZSk+Pjo6ZXBzaWxvbigpICogOCkpCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgYXV0byBjaGFubmVsU3RhdGlzdGljcyhjb25zdCBzdGQ6OnZlY3RvcjxUPiYgaW5wdXQsIHNpemVfdCBjaGFubmVscykgeworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPFQ+PiByZXN1bHQoY2hhbm5lbHMpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZXMgPSBpbnB1dC5zaXplKCkgLyBjaGFubmVsczsKKyAgICBpZiAoZnJhbWVzID4gMCkgeworICAgICAgICBjb25zdCBmbG9hdCAqZnB0ciA9IGlucHV0LmRhdGEoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBjaGFubmVsczsgKytqKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W2pdLmFkZCgqZnB0cisrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1c2luZyBEb3dubWl4UGFyYW0gPSBzdGQ6OnR1cGxlPGludCAvKiBzYW1wbGUgcmF0ZSAqLywgIGludCAvKiBjaGFubmVsIG1hc2sgKi8+OworY2xhc3MgRG93bm1peFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPERvd25taXhQYXJhbT4geworcHVibGljOgorICAgIHN0YXRpYyBjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBkb3dubWl4X3V1aWRfID0geworICAgICAgICAweDkzZjA0NDUyLCAweGU0ZmUsIDB4NDFjYywgMHg5MWY5LCB7MHhlNCwgMHg3NSwgMHhiNiwgMHhkMSwgMHhkNiwgMHg5Zn19OworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IEZSQU1FX0xFTkdUSCA9IDI1NjsKKworICAgIHZvaWQgdGVzdEJhbGFuY2UoaW50IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpjaGFubmVsczsKKworICAgICAgICBzaXplX3QgZnJhbWVzID0gMTAwOworICAgICAgICB1bnNpZ25lZCBvdXRDaGFubmVscyA9IDI7CisgICAgICAgIHVuc2lnbmVkIGluQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gaW5wdXQoZnJhbWVzICogaW5DaGFubmVscyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRwdXQoZnJhbWVzICogb3V0Q2hhbm5lbHMpOworCisgICAgICAgIGRvdWJsZSBzYXZlZFBvd2VyWzMyXVsyXXt9OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBjaGFubmVsID0gY2hhbm5lbE1hc2s7IGNoYW5uZWwgIT0gMDsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSBfX2J1aWx0aW5fY3R6KGNoYW5uZWwpOworICAgICAgICAgICAgQVNTRVJUX0xUKGluZGV4LCBGQ0NfMjQpOworICAgICAgICAgICAgY29uc3QgaW50IHBhaXJJbmRleCA9IHBhaXJJZHhGcm9tQ2hhbm5lbElkeChpbmRleCk7CisgICAgICAgICAgICBjb25zdCBBVURJT19HRU9NRVRSWV9TSURFIHNpZGUgPSBzaWRlRnJvbUNoYW5uZWxJZHgoaW5kZXgpOworICAgICAgICAgICAgY29uc3QgaW50IGNoYW5uZWxCaXQgPSAxIDw8IGluZGV4OworICAgICAgICAgICAgY2hhbm5lbCAmPSB+Y2hhbm5lbEJpdDsKKworICAgICAgICAgICAgLy8gR2VuZXJhdGUgYSArMSwgLTEgYWx0ZXJuYXRpbmcgc3RyZWFtIGluIG9uZSBjaGFubmVsLCB3aGljaCBoYXMgdmFyaWFuY2UgMS4KKyAgICAgICAgICAgIGF1dG8gaW5kYXRhID0gaW5wdXQuZGF0YSgpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGZyYW1lczsgKytqKSB7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBrID0gMDsgayA8IGluQ2hhbm5lbHM7ICsraykgeworICAgICAgICAgICAgICAgICAgICAqaW5kYXRhKysgPSAoayA9PSBpKSA/IChqICYgMSA/IC0xIDogMSkgOiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ1bihzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywgaW5wdXQsIG91dHB1dCwgZnJhbWVzKTsKKworICAgICAgICAgICAgYXV0byBzdGF0cyA9IGNoYW5uZWxTdGF0aXN0aWNzKG91dHB1dCwgMiAvKiBjaGFubmVscyAqLyk7CisgICAgICAgICAgICAvLyBwcmludGYoInBvd2VyOiAlcyAlc1xuIiwgc3RhdHNbMF0udG9TdHJpbmcoKS5jX3N0cigpLCBzdGF0c1sxXS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgZG91YmxlIHBvd2VyWzJdID0geyBzdGF0c1swXS5nZXRWYXJpYW5jZSgpLCBzdGF0c1sxXS5nZXRWYXJpYW5jZSgpIH07CisKKyAgICAgICAgICAgIC8vIENoZWNrIHN5bW1ldHJpYyBwb3dlciBmb3IgcGFpciBjaGFubmVscyBvbiBleGNoYW5nZSBvZiBsZWZ0L3JpZ2h0IHBvc2l0aW9uLgorICAgICAgICAgICAgLy8gdG8gZG8gdGhpcywgd2Ugc2F2ZSBwcmV2aW91cyBwb3dlciBtZWFzdXJlbWVudHMuCisgICAgICAgICAgICBpZiAocGFpckluZGV4ID49IDAgJiYgcGFpckluZGV4IDwgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUl9FUFNJTE9OKHBvd2VyWzBdLCBzYXZlZFBvd2VyW3BhaXJJbmRleF1bMV0pOworICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSX0VQU0lMT04ocG93ZXJbMV0sIHNhdmVkUG93ZXJbcGFpckluZGV4XVswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYXZlZFBvd2VyW2luZGV4XVswXSA9IHBvd2VyWzBdOworICAgICAgICAgICAgc2F2ZWRQb3dlcltpbmRleF1bMV0gPSBwb3dlclsxXTsKKworICAgICAgICAgICAgLy8gQ29uZmlybSBleGFjdGx5IHRoZSBtaXggYW1vdW50IHByZXNjcmliZWQgYnkgdGhlIGV4aXN0aW5nIGRvd25taXggZWZmZWN0LgorICAgICAgICAgICAgLy8gRm9yIGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBkb3dubWl4IGVmZmVjdCwgdGhlIG5lYXJuZXNzIG5lZWRzIHRvIGJlIHJlbGF4ZWQKKyAgICAgICAgICAgIC8vIHRvIGNvbXBhcmUgYmVoYXZpb3IgUyBvciBlYXJsaWVyLgorICAgICAgICAgICAgaWYgKChjaGFubmVsQml0ICYga0NvbnNpZGVyZWRDaGFubmVscykgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGZvciBjaGFubmVscyBub3QgY29uc2lkZXJlZCwgZXhwZWN0IDAgcG93ZXIgZm9yIGxlZ2FjeSBkb3dubWl4CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKDAuZiwgcG93ZXJbMF0pOworICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzFdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0ZXhwciBmbG9hdCBQT1dFUl9UT0xFUkFOQ0UgPSAwLjAxOyAgLy8gZm9yIHZhcmlhbmNlIHN1bSBlcnJvci4KKyAgICAgICAgICAgIHN3aXRjaCAoc2lkZSkgeworICAgICAgICAgICAgY2FzZSBBVURJT19HRU9NRVRSWV9TSURFX0xFRlQ6CisgICAgICAgICAgICAgICAgRVhQRUNUX05FQVIoMC4yNWYsIHBvd2VyWzBdLCBQT1dFUl9UT0xFUkFOQ0UpOworICAgICAgICAgICAgICAgIEVYUEVDVF9FUSgwLmYsIHBvd2VyWzFdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fR0VPTUVUUllfU0lERV9SSUdIVDoKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoMC5mLCBwb3dlclswXSk7CisgICAgICAgICAgICAgICAgRVhQRUNUX05FQVIoMC4yNWYsIHBvd2VyWzFdLCBQT1dFUl9UT0xFUkFOQ0UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVURJT19HRU9NRVRSWV9TSURFX0NFTlRFUjoKKyAgICAgICAgICAgICAgICBFWFBFQ1RfTkVBUigwLjEyNWYsIHBvd2VyWzBdLCBQT1dFUl9UT0xFUkFOQ0UpOworICAgICAgICAgICAgICAgIEVYUEVDVF9ORUFSKDAuMTI1ZiwgcG93ZXJbMV0sIFBPV0VSX1RPTEVSQU5DRSk7CisgICAgICAgICAgICAgICAgRVhQRUNUX05FQVJfRVBTSUxPTihwb3dlclswXSwgcG93ZXJbMV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBydW4oaW50IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBpbnB1dCwgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBvdXRwdXQsIHNpemVfdCBmcmFtZXMpIHsKKyAgICAgICAgcmVjb25maWcoc2FtcGxlUmF0ZSwgY2hhbm5lbE1hc2spOworCisgICAgICAgIEFTU0VSVF9FUShmcmFtZXMgKiBpbnB1dENoYW5uZWxDb3VudF8sIGlucHV0LnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9FUShmcmFtZXMgKiBvdXRwdXRDaGFubmVsQ291bnRfLCBvdXRwdXQuc2l6ZSgpKTsKKworICAgICAgICBjb25zdCBpbnQzMl90IHNlc3Npb25JZCA9IDA7CisgICAgICAgIGNvbnN0IGludDMyX3QgaW9JZCA9IDA7CisgICAgICAgIGludDMyX3QgZXJyID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgKKyAgICAgICAgICAgICAgICAmZG93bm1peF91dWlkXywgc2Vzc2lvbklkLCBpb0lkLCAgJmhhbmRsZV8pOworICAgICAgICBBU1NFUlRfRVEoMCwgZXJyKTsKKworICAgICAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICogY29uc3QgZG93bm1peEFwaSA9ICpoYW5kbGVfOworICAgICAgICBpbnQzMl90IHJlcGx5ID0gMDsKKyAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gKHVpbnQzMl90KXNpemVvZihyZXBseSk7CisgICAgICAgIGVyciA9IChkb3dubWl4QXBpLT5jb21tYW5kKSgKKyAgICAgICAgICAgICAgICBoYW5kbGVfLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICZjb25maWdfLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBBU1NFUlRfRVEoMCwgZXJyKTsKKyAgICAgICAgZXJyID0gKGRvd25taXhBcGktPmNvbW1hbmQpKAorICAgICAgICAgICAgICAgIGhhbmRsZV8sIEVGRkVDVF9DTURfRU5BQkxFLAorICAgICAgICAgICAgICAgIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOworCisgICAgICAgIHByb2Nlc3MoaW5wdXQsIG91dHB1dCwgZnJhbWVzKTsKKyAgICAgICAgZXJyID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoaGFuZGxlXyk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBlcnIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJlY29uZmlnKGludCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgeworICAgICAgICBjb25maWdfLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgICAgICBjb25maWdfLmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIGNvbmZpZ18uaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgY29uZmlnXy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgY29uZmlnXy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICAgICAgICBjb25maWdfLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgICAgICBjb25maWdfLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgICAgICAgIGNvbmZpZ18ub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIGNvbmZpZ18ub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGNvbmZpZ18ub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBudWxscHRyOworICAgICAgICBjb25maWdfLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICAgICAgICBjb25maWdfLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgICAgICAgY29uZmlnXy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBjb25maWdfLmlucHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CisgICAgICAgIGlucHV0Q2hhbm5lbENvdW50XyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWdfLmlucHV0Q2ZnLmNoYW5uZWxzKTsKKworICAgICAgICBjb25maWdfLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBjb25maWdfLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsgLy8gb3V0cHV0IGFsd2F5cyBzdGVyZW8KKyAgICAgICAgb3V0cHV0Q2hhbm5lbENvdW50XyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWdfLm91dHB1dENmZy5jaGFubmVscyk7CisgICAgfQorCisgICAgdm9pZCBwcm9jZXNzKHN0ZDo6dmVjdG9yPGZsb2F0PiAmaW5wdXQsIHN0ZDo6dmVjdG9yPGZsb2F0PiAmb3V0cHV0LCBzaXplX3QgZnJhbWVzKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKiBjb25zdCBkb3dubWl4QXBpID0gKmhhbmRsZV87CisKKyAgICAgICAgZm9yIChzaXplX3QgcG9zID0gMDsgcG9zIDwgZnJhbWVzOykgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHRyYW5zZmVyID0gc3RkOjptaW4oZnJhbWVzIC0gcG9zLCBGUkFNRV9MRU5HVEgpOworICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXJ7LmZyYW1lQ291bnQgPSB0cmFuc2ZlciwKKyAgICAgICAgICAgICAgICAuZjMyID0gaW5wdXQuZGF0YSgpICsgcG9zICogaW5wdXRDaGFubmVsQ291bnRffTsKKyAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90IG91dGJ1ZmZlcnsuZnJhbWVDb3VudCA9IHRyYW5zZmVyLAorICAgICAgICAgICAgICAgIC5mMzIgPSBvdXRwdXQuZGF0YSgpICsgcG9zICogb3V0cHV0Q2hhbm5lbENvdW50X307CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVyciA9IChkb3dubWl4QXBpLT5wcm9jZXNzKShoYW5kbGVfLCAmaW5idWZmZXIsICZvdXRidWZmZXIpOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGVycik7CisgICAgICAgICAgICBwb3MgKz0gdHJhbnNmZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlZmZlY3RfaGFuZGxlX3QgaGFuZGxlX3t9OworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWdfe307CisgICAgaW50IG91dHB1dENoYW5uZWxDb3VudF97fTsKKyAgICBpbnQgaW5wdXRDaGFubmVsQ291bnRfe307Cit9OworCitURVNUX1AoRG93bm1peFRlc3QsIGJhc2ljKSB7CisgICAgdGVzdEJhbGFuY2Uoa1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSwKKyAgICAgICAgICAgIGtDaGFubmVsUG9zaXRpb25NYXNrc1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIERvd25taXhUZXN0QWxsLCBEb3dubWl4VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKAorICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClzdGQ6OnNpemUoa1NhbXBsZVJhdGVzKSksCisgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KXN0ZDo6c2l6ZShrQ2hhbm5lbFBvc2l0aW9uTWFza3MpKQorICAgICAgICAgICAgICAgICkpOworCitpbnQgbWFpbihpbnQgYXJnYywgLyogY29uc3QgKi8gY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peHRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcAppbmRleCA3MWY4M2U1Li40MDc2MzIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peHRlc3QuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNkZWZpbmUgTUFYX05VTV9DSEFOTkVMUyA4CiAKIHN0cnVjdCBkb3dubWl4X2NudHh0X3MgewotICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CiAgIGVmZmVjdF9oYW5kbGVfdCBoYW5kbGU7CiAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CiAKQEAgLTg3LDEzICs4NiwxMiBAQAogfQogCiBpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7Ci0gIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7Ci0gIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7Ci0gIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSA9IHBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gKmVmZmVjdEhhbmRsZTsKICAgaW50MzJfdCBlcnIgPSAwOwogICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CiAKLSAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgIGVyciA9IChEb3dubWl4X2FwaS0+Y29tbWFuZCkoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CiAgIGlmIChlcnIgIT0gMCkgewpAQCAtMTAxLDcgKzk5LDcgQEAKICAgICByZXR1cm4gZXJyOwogICB9CiAKLSAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICBlcnIgPSAoKERvd25taXhfYXBpLT5jb21tYW5kKSkoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZlcnIpOwogICBpZiAoZXJyICE9IDApIHsKICAgICBBTE9HRSgiRG93bm1peCBjb21tYW5kIHRvIGVuYWJsZSBlZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOwpAQCAtMTEyLDkgKzExMCw4IEBACiAKIGludDMyX3QgRG93bm1peEV4ZWN1dGUoZG93bm1peF9jbnR4dF9zICpwRGVzY3JpcHRvciwgRklMRSAqZmlucCwKICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqZm91dCkgewotICBlZmZlY3RfaGFuZGxlX3QgKmVmZmVjdEhhbmRsZSA9ICZwRGVzY3JpcHRvci0+aGFuZGxlOwotICBkb3dubWl4X21vZHVsZV90ICpkb3dubWl4RWZmZWN0SGFuZGxlID0gKGRvd25taXhfbW9kdWxlX3QgKikqZWZmZWN0SGFuZGxlOwotICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICpEb3dubWl4X2FwaSA9IGRvd25taXhFZmZlY3RIYW5kbGUtPml0ZmU7CisgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBwRGVzY3JpcHRvci0+aGFuZGxlOworICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zICpEb3dubWl4X2FwaSA9ICplZmZlY3RIYW5kbGU7CiAKICAgY29uc3QgaW50IG51bUZpbGVDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1GaWxlQ2hhbm5lbHM7CiAgIGNvbnN0IGludCBudW1Qcm9jZXNzQ2hhbm5lbHMgPSBwRGVzY3JpcHRvci0+bnVtUHJvY2Vzc0NoYW5uZWxzOwpAQCAtMTUwLDcgKzE0Nyw3IEBACiAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGluRmxvYXQuZGF0YSgpLCBpblMxNi5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTkdUSCAqIG51bVByb2Nlc3NDaGFubmVscyk7CiAKLSAgICBjb25zdCBpbnQzMl90IGVyciA9IChEb3dubWl4X2FwaS0+cHJvY2VzcykoKmVmZmVjdEhhbmRsZSwgcGluYnVmLCBwb3V0YnVmKTsKKyAgICBjb25zdCBpbnQzMl90IGVyciA9IChEb3dubWl4X2FwaS0+cHJvY2VzcykoZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOwogICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKICAgICAgIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwCmluZGV4IGVhZmM0ODMuLjg0MTMxYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5icApAQCAtMTMsNiArMTMsMjUgQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBEeW5hbWljc1Byb2Nlc3NpbmcgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfZHluYW1pY3Nwcm9jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfZHluYW1pY3Nwcm9jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliZHlucHJvYyIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKaW5kZXggZGRiZmRkOC4uMjI4MzhhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJlZmZlY3RzX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwppbmRleCBmY2VmMzZmLi5lMjM1MzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgICAgIH0KICAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CiAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7Ci0gICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIHN0dWIgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZwogICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKICAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAogICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKaW5kZXggNTA1YmU3Yy4uMzBhOTAwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsaXN0UHVzaChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHN1YkVmZmVjdExpc3QpOwogCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBzdHViIGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKICAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECiAgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2MDk1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEhhcHRpY0dlbmVyYXRvciBsaWJyYXJ5CitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliaGFwdGljZ2VuZXJhdG9yIiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAiLAorICAgICAgICAiUHJvY2Vzc29ycy5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1PMiIsIC8vIFR1cm5pbmcgb24gdGhlIG9wdGltaXphdGlvbiBpbiBvcmRlciB0byByZWR1Y2UgZWZmZWN0IHByb2Nlc3NpbmcgdGltZS4KKyAgICAgICAgICAgICAgIC8vIFRoZSBsYXRlbmN5IGlzIGFyb3VuZCAxLzUgbGVzcyB0aGFuIHdpdGhvdXQgdGhlIG9wdGltaXphdGlvbi4KKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLWZmYXN0LW1hdGgiLCAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIG5vbi16ZXJvIGNvZWZmaWNpZW50cyBvcHRpbWl6YXRpb24gZm9yCisgICAgICAgICAgICAgICAgICAgICAgIC8vIEJpcXVhZEZpbHRlci4gVHJ5IHRoZSBiaXF1YWRfZmlsdGVyX2JlbmNobWFyayB0ZXN0IGluIGF1ZGlvX3V0aWxzCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGgvd2l0aG91dCBgLWZmYXN0LW1hdGhgIGZvciBtb3JlIGNvbnRleHQuCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTIwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIRyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVmZmVjdEhhcHRpY0dlbmVyYXRvci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2hhcHRpY2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCitzdGF0aWMgY29uc3RleHByIGZsb2F0IERFRkFVTFRfUkVTT05BTlRfRlJFUVVFTkNZID0gMTUwLjBmOworc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBERUZBVUxUX0JTRl9aRVJPX1EgPSA4LjBmOworc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBERUZBVUxUX0JTRl9QT0xFX1EgPSA0LjBmOworCisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCithdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgICAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgICAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgICAgICAubmFtZSA9ICJIYXB0aWNHZW5lcmF0b3IgTGlicmFyeSIsCisgICAgICAgIC5pbXBsZW1lbnRvciA9ICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IiwKKyAgICAgICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3I6OkhhcHRpY0dlbmVyYXRvckxpYl9DcmVhdGUsCisgICAgICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvcjo6SGFwdGljR2VuZXJhdG9yTGliX1JlbGVhc2UsCisgICAgICAgIC5nZXRfZGVzY3JpcHRvciA9IGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvcjo6SGFwdGljR2VuZXJhdG9yTGliX0dldERlc2NyaXB0b3IsCit9OworCituYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yIHsKKworLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgaGFwdGljIGdlbmVyYXRvciBlZmZlY3QKK2NvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0hhcHRpY0dlbmVyYXRvckludGVyZmFjZSA9IHsKKyAgICAgICAgSGFwdGljR2VuZXJhdG9yX1Byb2Nlc3MsCisgICAgICAgIEhhcHRpY0dlbmVyYXRvcl9Db21tYW5kLAorICAgICAgICBIYXB0aWNHZW5lcmF0b3JfR2V0RGVzY3JpcHRvciwKKyAgICAgICAgbnVsbHB0ciAvKiBubyBwcm9jZXNzX3JldmVyc2UgZnVuY3Rpb24sIG5vIHJlZmVyZW5jZSBzdHJlYW0gbmVlZGVkICovCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZmZlY3QgRGVzY3JpcHRvcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBVVUlEcyBmb3IgZWZmZWN0IHR5cGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSBodHRwOi8vd3d3Lml0dS5pbnQvSVRVLVQvYXNuMS91dWlkLmh0bWwKKy8vIEhhcHRpYyBHZW5lcmF0b3IKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdIZ0Rlc2NyaXB0b3IgPSB7CisgICAgICAgIEZYX0lJRF9IQVBUSUNHRU5FUkFUT1JfLCAvLyB0eXBlCisgICAgICAgIHsweDk3YzRhY2QxLCAweDhiODIsIDB4NGYyZiwgMHg4MzJlLCB7MHhjMiwgMHhmZSwgMHg1ZCwgMHg3YSwgMHg5OSwgMHgzMX19LCAvLyB1dWlkCisgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAorICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCwKKyAgICAgICAgMCwgLy8gRklYTUUgd2hhdCB2YWx1ZSBzaG91bGQgYmUgcmVwb3J0ZWQ/IC8vIGNwdSBsb2FkCisgICAgICAgIDAsIC8vIEZJWE1FIHdoYXQgdmFsdWUgc2hvdWxkIGJlIHJlcG9ydGVkPyAvLyBtZW1vcnkgdXNhZ2UKKyAgICAgICAgIkhhcHRpYyBHZW5lcmF0b3IiLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGZ1bmN0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgeworCitpbnQgSGFwdGljR2VuZXJhdG9yX0luaXQoc3RydWN0IEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQpIHsKKyAgICBjb250ZXh0LT5pdGZlID0gJmdIYXB0aWNHZW5lcmF0b3JJbnRlcmZhY2U7CisKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgY29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSAwOworICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSAwOworICAgIGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBudWxscHRyOworICAgIGNvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gbnVsbHB0cjsKKyAgICBjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICAgIG1lbXNldChjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsU291cmNlLCAwLCBzaXplb2YoY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbFNvdXJjZSkpOworICAgIGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgY29udGV4dC0+cGFyYW0uYXVkaW9DaGFubmVsQ291bnQgPSAwOworICAgIGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0ludGVuc2l0eSA9IG9zOjpIYXB0aWNTY2FsZTo6TVVURTsKKworICAgIGNvbnRleHQtPnBhcmFtLnJlc29uYW50RnJlcXVlbmN5ID0gREVGQVVMVF9SRVNPTkFOVF9GUkVRVUVOQ1k7CisgICAgY29udGV4dC0+cGFyYW0uYnBmUSA9IDEuMGY7CisgICAgY29udGV4dC0+cGFyYW0uc2xvd0Vudk5vcm1hbGl6YXRpb25Qb3dlciA9IC0wLjhmOworICAgIGNvbnRleHQtPnBhcmFtLmJzZlplcm9RID0gREVGQVVMVF9CU0ZfWkVST19ROworICAgIGNvbnRleHQtPnBhcmFtLmJzZlBvbGVRID0gREVGQVVMVF9CU0ZfUE9MRV9ROworICAgIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25Db3JuZXJGcmVxdWVuY3kgPSAzMDAuMGY7CisgICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbklucHV0R2FpbiA9IDAuM2Y7CisgICAgY29udGV4dC0+cGFyYW0uZGlzdG9ydGlvbkN1YmVUaHJlc2hvbGQgPSAwLjFmOworICAgIGNvbnRleHQtPnBhcmFtLmRpc3RvcnRpb25PdXRwdXRHYWluID0gMS41ZjsKKworICAgIGNvbnRleHQtPnN0YXRlID0gSEFQVElDR0VORVJBVE9SX1NUQVRFX0lOSVRJQUxJWkVEOworICAgIHJldHVybiAwOworfQorCit2b2lkIGFkZEJpcXVhZEZpbHRlcigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKGZsb2F0ICosIGNvbnN0IGZsb2F0ICosIHNpemVfdCk+PiAmcHJvY2Vzc2luZ0NoYWluLAorICAgICAgICBzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yUHJvY2Vzc29yc1JlY29yZCAmcHJvY2Vzc29yc1JlY29yZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gZmlsdGVyKSB7CisgICAgLy8gVGhlIHByb2Nlc3MgY2hhaW4gY2FwdHVyZXMgdGhlIHNoYXJlZCBwb2ludGVyIG9mIHRoZSBmaWx0ZXIgaW4gbGFtYmRhLgorICAgIC8vIFRoZSBwcm9jZXNzIHJlY29yZCB3aWxsIGtlZXAgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgZmlsdGVyIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzCisgICAgLy8gdGhlIGZpbHRlciBvdXRzaWRlIG9mIHRoZSBwcm9jZXNzIGNoYWluLgorICAgIHByb2Nlc3NvcnNSZWNvcmQuZmlsdGVycy5wdXNoX2JhY2soZmlsdGVyKTsKKyAgICBwcm9jZXNzaW5nQ2hhaW4ucHVzaF9iYWNrKFtmaWx0ZXJdKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGZpbHRlci0+cHJvY2VzcyhvdXQsIGluLCBmcmFtZUNvdW50KTsKKyAgICB9KTsKK30KKworLyoqCisgKiBcYnJpZWYgYnVpbGQgaGFwdGljIGdlbmVyYXRvciBwcm9jZXNzaW5nIGNoYWluLgorICoKKyAqIFxwYXJhbSBwcm9jZXNzaW5nQ2hhaW4KKyAqIFxwYXJhbSBwcm9jZXNzb3JzUmVjb3JkIGEgc3RydWN0dXJlIHRvIGNhY2hlIGFsbCB0aGUgc2hhcmVkIHBvaW50ZXJzIGZvciBwcm9jZXNzb3JzCisgKiBccGFyYW0gc2FtcGxlUmF0ZSB0aGUgYXVkaW8gc2FtcGxpbmcgcmF0ZS4gVXNlIGEgZmxvYXQgaGVyZSBhcyBpdCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgZmlsdGVycworICogXHBhcmFtIGNoYW5uZWxDb3VudCBoYXB0aWMgY2hhbm5lbCBjb3VudAorICovCit2b2lkIEhhcHRpY0dlbmVyYXRvcl9idWlsZFByb2Nlc3NpbmdDaGFpbigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKGZsb2F0KiwgY29uc3QgZmxvYXQqLCBzaXplX3QpPj4mIHByb2Nlc3NpbmdDaGFpbiwKKyAgICAgICAgc3RydWN0IEhhcHRpY0dlbmVyYXRvclByb2Nlc3NvcnNSZWNvcmQmIHByb2Nlc3NvcnNSZWNvcmQsIGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgIGNvbnN0IHN0cnVjdCBIYXB0aWNHZW5lcmF0b3JQYXJhbSogcGFyYW0pIHsKKyAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50ID0gcGFyYW0tPmhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICBmbG9hdCBoaWdoUGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDUwLjBmOworICAgIGF1dG8gaHBmID0gY3JlYXRlSFBGMihoaWdoUGFzc0Nvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBocGYpOworICAgIGZsb2F0IGxvd1Bhc3NDb3JuZXJGcmVxdWVuY3kgPSA5MDAwLjBmOworICAgIGF1dG8gbHBmID0gY3JlYXRlTFBGMihsb3dQYXNzQ29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgIGFkZEJpcXVhZEZpbHRlcihwcm9jZXNzaW5nQ2hhaW4sIHByb2Nlc3NvcnNSZWNvcmQsIGxwZik7CisKKyAgICBhdXRvIHJhbXAgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJhbXA+KGNoYW5uZWxDb3VudCk7ICAvLyByYW1wID0gaGFsZi13YXZlIHJlY3RpZmllci4KKyAgICAvLyBUaGUgcHJvY2VzcyBjaGFpbiBjYXB0dXJlcyB0aGUgc2hhcmVkIHBvaW50ZXIgb2YgdGhlIHJhbXAgaW4gbGFtYmRhLiBJdCB3aWxsIGJlIHRoZSBvbmx5CisgICAgLy8gcmVmZXJlbmNlIHRvIHRoZSByYW1wLgorICAgIC8vIFRoZSBwcm9jZXNzIHJlY29yZCB3aWxsIGtlZXAgYSB3ZWFrIHBvaW50ZXIgdG8gdGhlIHJhbXAgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MKKyAgICAvLyB0aGUgcmFtcCBvdXRzaWRlIG9mIHRoZSBwcm9jZXNzIGNoYWluLgorICAgIHByb2Nlc3NvcnNSZWNvcmQucmFtcHMucHVzaF9iYWNrKHJhbXApOworICAgIHByb2Nlc3NpbmdDaGFpbi5wdXNoX2JhY2soW3JhbXBdKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIHJhbXAtPnByb2Nlc3Mob3V0LCBpbiwgZnJhbWVDb3VudCk7CisgICAgfSk7CisKKyAgICBoaWdoUGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDYwLjBmOworICAgIGhwZiA9IGNyZWF0ZUhQRjIoaGlnaFBhc3NDb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgaHBmKTsKKyAgICBsb3dQYXNzQ29ybmVyRnJlcXVlbmN5ID0gNzAwLjBmOworICAgIGxwZiA9IGNyZWF0ZUxQRjIobG93UGFzc0Nvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBscGYpOworCisgICAgbG93UGFzc0Nvcm5lckZyZXF1ZW5jeSA9IDQwMC4wZjsKKyAgICBscGYgPSBjcmVhdGVMUEYyKGxvd1Bhc3NDb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgbHBmKTsKKyAgICBsb3dQYXNzQ29ybmVyRnJlcXVlbmN5ID0gNTAwLjBmOworICAgIGxwZiA9IGNyZWF0ZUxQRjIobG93UGFzc0Nvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBscGYpOworCisgICAgYXV0byBicGYgPSBjcmVhdGVCUEYocGFyYW0tPnJlc29uYW50RnJlcXVlbmN5LCBwYXJhbS0+YnBmUSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBwcm9jZXNzb3JzUmVjb3JkLmJwZiA9IGJwZjsKKyAgICBhZGRCaXF1YWRGaWx0ZXIocHJvY2Vzc2luZ0NoYWluLCBwcm9jZXNzb3JzUmVjb3JkLCBicGYpOworCisgICAgZmxvYXQgbm9ybWFsaXphdGlvblBvd2VyID0gcGFyYW0tPnNsb3dFbnZOb3JtYWxpemF0aW9uUG93ZXI7CisgICAgLy8gVGhlIHByb2Nlc3MgY2hhaW4gY2FwdHVyZXMgdGhlIHNoYXJlZCBwb2ludGVyIG9mIHRoZSBzbG93IGVudmVsb3BlIGluIGxhbWJkYS4gSXQgd2lsbAorICAgIC8vIGJlIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGUgc2xvdyBlbnZlbG9wZS4KKyAgICAvLyBUaGUgcHJvY2VzcyByZWNvcmQgd2lsbCBrZWVwIGEgd2VhayBwb2ludGVyIHRvIHRoZSBzbG93IGVudmVsb3BlIHNvIHRoYXQgaXQgaXMgcG9zc2libGUKKyAgICAvLyB0byBhY2Nlc3MgdGhlIHNsb3cgZW52ZWxvcGUgb3V0c2lkZSBvZiB0aGUgcHJvY2VzcyBjaGFpbi4KKyAgICBhdXRvIHNsb3dFbnYgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNsb3dFbnZlbG9wZT4oICAvLyBTbG93RW52ZWxvcGUgPSBwYXJ0aWFsIG5vcm1hbGl6ZXIsIG9yIEFHQy4KKyAgICAgICAgICAgIDUuMGYgLyplbnZDb3JuZXJGcmVxdWVuY3kqLywgc2FtcGxlUmF0ZSwgbm9ybWFsaXphdGlvblBvd2VyLAorICAgICAgICAgICAgMC4wMWYgLyplbnZPZmZzZXQqLywgY2hhbm5lbENvdW50KTsKKyAgICBwcm9jZXNzb3JzUmVjb3JkLnNsb3dFbnZzLnB1c2hfYmFjayhzbG93RW52KTsKKyAgICBwcm9jZXNzaW5nQ2hhaW4ucHVzaF9iYWNrKFtzbG93RW52XShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICBzbG93RW52LT5wcm9jZXNzKG91dCwgaW4sIGZyYW1lQ291bnQpOworICAgIH0pOworCisKKyAgICBhdXRvIGJzZiA9IGNyZWF0ZUJTRigKKyAgICAgICAgICAgIHBhcmFtLT5yZXNvbmFudEZyZXF1ZW5jeSwgcGFyYW0tPmJzZlplcm9RLCBwYXJhbS0+YnNmUG9sZVEsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgICAgcHJvY2Vzc29yc1JlY29yZC5ic2YgPSBic2Y7CisgICAgYWRkQmlxdWFkRmlsdGVyKHByb2Nlc3NpbmdDaGFpbiwgcHJvY2Vzc29yc1JlY29yZCwgYnNmKTsKKworICAgIC8vIFRoZSBwcm9jZXNzIGNoYWluIGNhcHR1cmVzIHRoZSBzaGFyZWQgcG9pbnRlciBvZiB0aGUgRGlzdG9ydGlvbiBpbiBsYW1iZGEuIEl0IHdpbGwKKyAgICAvLyBiZSB0aGUgb25seSByZWZlcmVuY2UgdG8gdGhlIERpc3RvcnRpb24uCisgICAgLy8gVGhlIHByb2Nlc3MgcmVjb3JkIHdpbGwga2VlcCBhIHdlYWsgcG9pbnRlciB0byB0aGUgRGlzdG9ydGlvbiBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlCisgICAgLy8gdG8gYWNjZXNzIHRoZSBEaXN0b3J0aW9uIG91dHNpZGUgb2YgdGhlIHByb2Nlc3MgY2hhaW4uCisgICAgYXV0byBkaXN0b3J0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxEaXN0b3J0aW9uPigKKyAgICAgICAgICAgIHBhcmFtLT5kaXN0b3J0aW9uQ29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlLCBwYXJhbS0+ZGlzdG9ydGlvbklucHV0R2FpbiwKKyAgICAgICAgICAgIHBhcmFtLT5kaXN0b3J0aW9uQ3ViZVRocmVzaG9sZCwgcGFyYW0tPmRpc3RvcnRpb25PdXRwdXRHYWluLCBjaGFubmVsQ291bnQpOworICAgIHByb2Nlc3NvcnNSZWNvcmQuZGlzdG9ydGlvbnMucHVzaF9iYWNrKGRpc3RvcnRpb24pOworICAgIHByb2Nlc3NpbmdDaGFpbi5wdXNoX2JhY2soW2Rpc3RvcnRpb25dKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGRpc3RvcnRpb24tPnByb2Nlc3Mob3V0LCBpbiwgZnJhbWVDb3VudCk7CisgICAgfSk7Cit9CisKK2ludCBIYXB0aWNHZW5lcmF0b3JfQ29uZmlndXJlKHN0cnVjdCBIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykgeworICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBjb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgY29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gY29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0IHx8CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgfHwKKyAgICAgICAgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBjb25maWctPm91dHB1dENmZy5jaGFubmVscyB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAoJmNvbnRleHQtPmNvbmZpZyAhPSBjb25maWcpIHsKKyAgICAgICAgY29udGV4dC0+cHJvY2Vzc2luZ0NoYWluLmNsZWFyKCk7CisgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuZmlsdGVycy5jbGVhcigpOworICAgICAgICBjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLnJhbXBzLmNsZWFyKCk7CisgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuc2xvd0VudnMuY2xlYXIoKTsKKyAgICAgICAgY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5kaXN0b3J0aW9ucy5jbGVhcigpOworICAgICAgICBtZW1jcHkoJmNvbnRleHQtPmNvbmZpZywgY29uZmlnLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSk7CisgICAgICAgIGNvbnRleHQtPnBhcmFtLmF1ZGlvQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICgoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgIGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgICAgICAoKGF1ZGlvX2NoYW5uZWxfbWFza190KSBjb25maWctPm91dHB1dENmZy5jaGFubmVscykgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICBBTE9HX0FTU0VSVChjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsQ291bnQgPD0gMiwKKyAgICAgICAgICAgICAgICAgICAgImhhcHRpYyBjaGFubmVsIGNvdW50KCV6dSkgaXMgdG9vIGxhcmdlIiwKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgY29udGV4dC0+YXVkaW9EYXRhQnl0ZXNQZXJGcmFtZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZSgKKyAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5hdWRpb0NoYW5uZWxDb3VudCwgKGF1ZGlvX2Zvcm1hdF90KSBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHVzZSB0aGUgZmlyc3QgYXVkaW8gY2hhbm5lbCB0byBnZW5lcmF0ZSBoYXB0aWMgY2hhbm5lbHMuCisgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5oYXB0aWNDaGFubmVsU291cmNlW2ldID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEhhcHRpY0dlbmVyYXRvcl9idWlsZFByb2Nlc3NpbmdDaGFpbihjb250ZXh0LT5wcm9jZXNzaW5nQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dC0+cGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IEhhcHRpY0dlbmVyYXRvcl9SZXNldChzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCkgeworICAgIGZvciAoYXV0byYgZmlsdGVyIDogY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5maWx0ZXJzKSB7CisgICAgICAgIGZpbHRlci0+Y2xlYXIoKTsKKyAgICB9CisgICAgZm9yIChhdXRvJiBzbG93RW52IDogY29udGV4dC0+cHJvY2Vzc29yc1JlY29yZC5zbG93RW52cykgeworICAgICAgICBzbG93RW52LT5jbGVhcigpOworICAgIH0KKyAgICBmb3IgKGF1dG8mIGRpc3RvcnRpb24gOiBjb250ZXh0LT5wcm9jZXNzb3JzUmVjb3JkLmRpc3RvcnRpb25zKSB7CisgICAgICAgIGRpc3RvcnRpb24tPmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgSGFwdGljR2VuZXJhdG9yX1NldFBhcmFtZXRlcihzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdmFsdWUpIHsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBIR19QQVJBTV9IQVBUSUNfSU5URU5TSVRZOiB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxscHRyIHx8IHNpemUgIT0gKHVpbnQzMl90KSAoMiAqIHNpemVvZihpbnQpKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaW50IGlkID0gKihpbnQgKikgdmFsdWU7CisgICAgICAgIG9zOjpIYXB0aWNTY2FsZSBoYXB0aWNJbnRlbnNpdHkgPSBzdGF0aWNfY2FzdDxvczo6SGFwdGljU2NhbGU+KCooKGludCAqKSB2YWx1ZSArIDEpKTsKKyAgICAgICAgaWYgKGhhcHRpY0ludGVuc2l0eSA9PSBvczo6SGFwdGljU2NhbGU6Ok1VVEUpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnBhcmFtLmlkMkludGVuc2l0eS5lcmFzZShpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5pZDJJbnRlbnNpdHkuZW1wbGFjZShpZCwgaGFwdGljSW50ZW5zaXR5KTsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byZbaWQsIGludGVuc2l0eV0gOiBjb250ZXh0LT5wYXJhbS5pZDJJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnBhcmFtLm1heEhhcHRpY0ludGVuc2l0eSA9IHN0ZDo6bWF4KAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHksIGludGVuc2l0eSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgSEdfUEFSQU1fVklCUkFUT1JfSU5GTzogeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbHB0ciB8fCBzaXplICE9IDIgKiBzaXplb2YoZmxvYXQpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCByZXNvbmFudEZyZXF1ZW5jeSA9ICooZmxvYXQqKSB2YWx1ZTsKKyAgICAgICAgY29uc3QgZmxvYXQgcUZhY3RvciA9ICooKGZsb2F0ICopIHZhbHVlICsgMSk7CisgICAgICAgIGNvbnRleHQtPnBhcmFtLnJlc29uYW50RnJlcXVlbmN5ID0KKyAgICAgICAgICAgICAgICBpc25hbihyZXNvbmFudEZyZXF1ZW5jeSkgPyBERUZBVUxUX1JFU09OQU5UX0ZSRVFVRU5DWSA6IHJlc29uYW50RnJlcXVlbmN5OworICAgICAgICBjb250ZXh0LT5wYXJhbS5ic2ZaZXJvUSA9IGlzbmFuKHFGYWN0b3IpID8gREVGQVVMVF9CU0ZfUE9MRV9RIDogcUZhY3RvcjsKKyAgICAgICAgY29udGV4dC0+cGFyYW0uYnNmUG9sZVEgPSBjb250ZXh0LT5wYXJhbS5ic2ZaZXJvUSAvIDIuMGY7CisKKyAgICAgICAgaWYgKGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnBmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnBmLT5zZXRDb2VmZmljaWVudHMoCisgICAgICAgICAgICAgICAgICAgIGJwZkNvZWZzKGNvbnRleHQtPnBhcmFtLnJlc29uYW50RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5icGZRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnNmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRleHQtPnByb2Nlc3NvcnNSZWNvcmQuYnNmLT5zZXRDb2VmZmljaWVudHMoCisgICAgICAgICAgICAgICAgICAgIGJzZkNvZWZzKGNvbnRleHQtPnBhcmFtLnJlc29uYW50RnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5wYXJhbS5ic2ZaZXJvUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+cGFyYW0uYnNmUG9sZVEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpKTsKKyAgICAgICAgfQorICAgICAgICBIYXB0aWNHZW5lcmF0b3JfUmVzZXQoY29udGV4dCk7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HVygiVW5rbm93biBwYXJhbTogJWQiLCBwYXJhbSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFxicmllZiBydW4gdGhlIHByb2Nlc3NpbmcgY2hhaW4gdG8gZ2VuZXJhdGUgaGFwdGljIGRhdGEgZnJvbSBhdWRpbyBkYXRhCisgKgorICogXHBhcmFtIHByb2Nlc3NpbmdDaGFpbiB0aGUgcHJvY2Vzc2luZyBjaGFpbiBmb3IgZ2VuZXJhdGluZyBoYXB0aWMgZGF0YQorICogXHBhcmFtIGJ1ZjEgYSBidWZmZXIgY29udGFpbnMgcmF3IGF1ZGlvIGRhdGEKKyAqIFxwYXJhbSBidWYyIGEgYnVmZmVyIHRoYXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGtlZXAgYWxsIHRoZSBkYXRhCisgKiBccGFyYW0gZnJhbWVDb3VudCBmcmFtZSBjb3VudCBvZiB0aGUgZGF0YQorICogXHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAqLworZmxvYXQqIEhhcHRpY0dlbmVyYXRvcl9ydW5Qcm9jZXNzaW5nQ2hhaW4oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChmbG9hdCosIGNvbnN0IGZsb2F0Kiwgc2l6ZV90KT4+JiBwcm9jZXNzaW5nQ2hhaW4sCisgICAgICAgIGZsb2F0KiBidWYxLCBmbG9hdCogYnVmMiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBmbG9hdCAqaW4gPSBidWYxOworICAgIGZsb2F0ICpvdXQgPSBidWYyOworICAgIGZvciAoY29uc3QgYXV0byBwcm9jZXNzaW5nRnVuYyA6IHByb2Nlc3NpbmdDaGFpbikgeworICAgICAgICBwcm9jZXNzaW5nRnVuYyhvdXQsIGluLCBmcmFtZUNvdW50KTsKKyAgICAgICAgc3RkOjpzd2FwKGluLCBvdXQpOworICAgIH0KKyAgICByZXR1cm4gaW47Cit9CisKK30gLy8gbmFtZXNwYWNlIChhbm9ueW1vdXMpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdCBBUEkgSW1wbGVtZW50YXRpb24KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyotLS0gRWZmZWN0IExpYnJhcnkgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uIC0tLSovCisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yTGliX0NyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW9JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKmhhbmRsZSkgeworICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0ciB8fCB1dWlkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0hnRGVzY3JpcHRvci51dWlkLCBzaXplb2YoKnV1aWQpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQgPSBuZXcgSGFwdGljR2VuZXJhdG9yQ29udGV4dDsKKyAgICBIYXB0aWNHZW5lcmF0b3JfSW5pdChjb250ZXh0KTsKKworICAgICpoYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KSBjb250ZXh0OworICAgIEFMT0dWKCIlcyBjb250ZXh0IGlzICVwIiwgX19mdW5jX18sIGNvbnRleHQpOworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEhhcHRpY0dlbmVyYXRvckxpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0ID0gKEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKikgaGFuZGxlOworICAgIGRlbGV0ZSBjb250ZXh0OworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEhhcHRpY0dlbmVyYXRvckxpYl9HZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIHsKKworICAgIGlmIChkZXNjcmlwdG9yID09IG51bGxwdHIgfHwgdXVpZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKG1lbWNtcCh1dWlkLCAmZ0hnRGVzY3JpcHRvci51dWlkLCBzaXplb2YoKnV1aWQpKSA9PSAwKSB7CisgICAgICAgICpkZXNjcmlwdG9yID0gZ0hnRGVzY3JpcHRvcjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAtLS0qLworCitpbnQzMl90IEhhcHRpY0dlbmVyYXRvcl9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90ICpvdXRCdWZmZXIpIHsKKyAgICBIYXB0aWNHZW5lcmF0b3JDb250ZXh0ICpjb250ZXh0ID0gKEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKikgc2VsZjsKKworICAgIGlmIChpbkJ1ZmZlciA9PSBudWxscHRyIHx8IGluQnVmZmVyLT5yYXcgPT0gbnVsbHB0cgorICAgICAgICAgICAgfHwgb3V0QnVmZmVyID09IG51bGxwdHIgfHwgb3V0QnVmZmVyLT5yYXcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBUaGUgYXVkaW8gZGF0YSBtdXN0IG5vdCBiZSBtb2RpZmllZCBidXQganVzdCB3cml0dGVuIHRvCisgICAgLy8gb3V0cHV0IGJ1ZmZlciBhY2NvcmRpbmcgdGhlIGFjY2VzcyBtb2RlLgorICAgIHNpemVfdCBhdWRpb0J5dGVzID0gY29udGV4dC0+YXVkaW9EYXRhQnl0ZXNQZXJGcmFtZSAqIGluQnVmZmVyLT5mcmFtZUNvdW50OworICAgIHNpemVfdCBhdWRpb1NhbXBsZUNvdW50ID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiBjb250ZXh0LT5wYXJhbS5hdWRpb0NoYW5uZWxDb3VudDsKKyAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworICAgICAgICBpZiAoY29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9TYW1wbGVDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywgaW5CdWZmZXItPnJhdywgYXVkaW9CeXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29udGV4dC0+c3RhdGUgIT0gSEFQVElDR0VORVJBVE9SX1NUQVRFX0FDVElWRSkgeworICAgICAgICBBTE9HRSgiU3RhdGUoJWQpIGlzIG5vdCBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfQUNUSVZFIHdoZW4gY2FsbGluZyAlcyIsCisgICAgICAgICAgICAgICAgY29udGV4dC0+c3RhdGUsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC1FTk9EQVRBOworICAgIH0KKworICAgIGlmIChjb250ZXh0LT5wYXJhbS5tYXhIYXB0aWNJbnRlbnNpdHkgPT0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFKSB7CisgICAgICAgIC8vIEhhcHRpYyBjaGFubmVscyBhcmUgbXV0ZWQsIG5vdCBuZWVkIHRvIGdlbmVyYXRlIGhhcHRpYyBkYXRhLgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBSZXNpemUgYnVmZmVyIGlmIHRoZSBoYXB0aWMgc2FtcGxlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBidWZmZXIgc2l6ZS4KKyAgICBzaXplX3QgaGFwdGljU2FtcGxlQ291bnQgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICBpZiAoaGFwdGljU2FtcGxlQ291bnQgPiBjb250ZXh0LT5pbnB1dEJ1ZmZlci5zaXplKCkpIHsKKyAgICAgICAgLy8gVGhlIGNvbnRleHQtPmlucHV0QnVmZmVyIGFuZCBjb250ZXh0LT5vdXRwdXRCdWZmZXIgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUsCisgICAgICAgIC8vIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIGhhcHRpYyBzYW1wbGUgY291bnQuCisgICAgICAgIGNvbnRleHQtPmlucHV0QnVmZmVyLnJlc2l6ZShoYXB0aWNTYW1wbGVDb3VudCk7CisgICAgICAgIGNvbnRleHQtPm91dHB1dEJ1ZmZlci5yZXNpemUoaGFwdGljU2FtcGxlQ291bnQpOworICAgIH0KKworICAgIC8vIENvbnN0cnVjdCBpbnB1dCBidWZmZXIgYWNjb3JkaW5nIHRvIGhhcHRpYyBjaGFubmVsIHNvdXJjZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5CdWZmZXItPmZyYW1lQ291bnQ7ICsraSkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNvbnRleHQtPnBhcmFtLmhhcHRpY0NoYW5uZWxDb3VudDsgKytqKSB7CisgICAgICAgICAgICBjb250ZXh0LT5pbnB1dEJ1ZmZlcltpICogY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbENvdW50ICsgal0gPQorICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+ZjMyW2kgKiBjb250ZXh0LT5wYXJhbS5hdWRpb0NoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGV4dC0+cGFyYW0uaGFwdGljQ2hhbm5lbFNvdXJjZVtqXV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCogaGFwdGljT3V0QnVmZmVyID0gSGFwdGljR2VuZXJhdG9yX3J1blByb2Nlc3NpbmdDaGFpbigKKyAgICAgICAgICAgIGNvbnRleHQtPnByb2Nlc3NpbmdDaGFpbiwgY29udGV4dC0+aW5wdXRCdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgY29udGV4dC0+b3V0cHV0QnVmZmVyLmRhdGEoKSwgaW5CdWZmZXItPmZyYW1lQ291bnQpOworICAgIG9zOjpzY2FsZUhhcHRpY0RhdGEoaGFwdGljT3V0QnVmZmVyLCBoYXB0aWNTYW1wbGVDb3VudCwgY29udGV4dC0+cGFyYW0ubWF4SGFwdGljSW50ZW5zaXR5KTsKKworICAgIC8vIEZvciBoYXB0aWMgZGF0YSwgdGhlIGhhcHRpYyBwbGF5YmFjayB0aHJlYWQgd2lsbCBjb3B5IHRoZSBkYXRhIGZyb20gZWZmZWN0IGlucHV0IGJ1ZmZlciwKKyAgICAvLyB3aGljaCBjb250YWlucyBoYXB0aWMgZGF0YSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyLgorICAgIC8vIEluIHRoYXQgY2FzZSwgY29weSBoYXB0aWMgZGF0YSB0byBpbnB1dCBidWZmZXIgaW5zdGVhZCBvZiBvdXRwdXQgYnVmZmVyLgorICAgIC8vIE5vdGU6IHRoaXMgbWF5IG5vdCB3b3JrIHdpdGggcnBjL2JpbmRlciBjYWxscworICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoc3RhdGljX2Nhc3Q8Y2hhcio+KGluQnVmZmVyLT5yYXcpICsgYXVkaW9CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90Pihjb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXB0aWNPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFwdGljU2FtcGxlQ291bnQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgSGFwdGljR2VuZXJhdG9yX0NvbW1hbmQoZWZmZWN0X2hhbmRsZV90IHNlbGYsIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNtZERhdGEsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnJlcGx5RGF0YSkgeworICAgIEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQgPSAoSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqKSBzZWxmOworCisgICAgaWYgKGNvbnRleHQgPT0gbnVsbHB0ciB8fCBjb250ZXh0LT5zdGF0ZSA9PSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBBTE9HVigiSGFwdGljR2VuZXJhdG9yX0NvbW1hbmQgY29tbWFuZCAldSBjbWRTaXplICV1IiwgY21kQ29kZSwgY21kU2l6ZSk7CisKKyAgICBzd2l0Y2ggKGNtZENvZGUpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6CisgICAgICAgICAgICBpZiAocmVwbHlEYXRhID09IG51bGxwdHIgfHwgcmVwbHlTaXplID09IG51bGxwdHIgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQgKikgcmVwbHlEYXRhID0gSGFwdGljR2VuZXJhdG9yX0luaXQoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0NPTkZJRzoKKyAgICAgICAgICAgIGlmIChjbWREYXRhID09IG51bGxwdHIgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQorICAgICAgICAgICAgICAgIHx8IHJlcGx5RGF0YSA9PSBudWxscHRyIHx8IHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50ICopIHJlcGx5RGF0YSA9IEhhcHRpY0dlbmVyYXRvcl9Db25maWd1cmUoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIChlZmZlY3RfY29uZmlnX3QgKikgY21kRGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6CisgICAgICAgICAgICBIYXB0aWNHZW5lcmF0b3JfUmVzZXQoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX1BBUkFNOgorICAgICAgICAgICAgQUxPR1YoIkhhcHRpY0dlbmVyYXRvcl9Db21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNIGNtZERhdGEgJXAsIgorICAgICAgICAgICAgICAgICAgIipyZXBseVNpemUgJXUsIHJlcGx5RGF0YTogJXAiLAorICAgICAgICAgICAgICAgICAgY21kRGF0YSwgKnJlcGx5U2l6ZSwgcmVwbHlEYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06IHsKKyAgICAgICAgICAgIEFMT0dWKCJIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBjbWRTaXplICVkIGNtZERhdGEgJXAsICIKKyAgICAgICAgICAgICAgICAgICIqcmVwbHlTaXplICV1LCByZXBseURhdGEgJXAiLCBjbWRTaXplLCBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgcmVwbHlTaXplID8gKnJlcGx5U2l6ZSA6IDAsIHJlcGx5RGF0YSk7CisgICAgICAgICAgICBpZiAoY21kRGF0YSA9PSBudWxscHRyIHx8IChjbWRTaXplIDwgKGludCkgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkpKQorICAgICAgICAgICAgICAgIHx8IHJlcGx5RGF0YSA9PSBudWxscHRyIHx8IHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSAoaW50KSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpjbWQgPSAoZWZmZWN0X3BhcmFtX3QgKikgY21kRGF0YTsKKyAgICAgICAgICAgICooaW50ICopIHJlcGx5RGF0YSA9IEhhcHRpY0dlbmVyYXRvcl9TZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsICooaW50MzJfdCAqKSBjbWQtPmRhdGEsIGNtZC0+dnNpemUsIGNtZC0+ZGF0YSArIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgICAgICBpZiAocmVwbHlEYXRhID09IG51bGxwdHIgfHwgcmVwbHlTaXplID09IG51bGxwdHIgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRleHQtPnN0YXRlICE9IEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC0+c3RhdGUgPSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfQUNUSVZFOworICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgICAgICooaW50ICopIHJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKKyAgICAgICAgICAgIGlmIChyZXBseURhdGEgPT0gbnVsbHB0ciB8fCByZXBseVNpemUgPT0gbnVsbHB0ciB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udGV4dC0+c3RhdGUgIT0gSEFQVElDR0VORVJBVE9SX1NUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC0+c3RhdGUgPSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgICAgICBBTE9HVigiRUZGRUNUX0NNRF9ESVNBQkxFKCkgT0siKTsKKyAgICAgICAgICAgICooaW50ICopIHJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1ZPTFVNRToKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0U6CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERToKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiSGFwdGljR2VuZXJhdG9yX0NvbW1hbmQgaW52YWxpZCBjb21tYW5kICV1IiwgY21kQ29kZSk7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgeworICAgIEhhcHRpY0dlbmVyYXRvckNvbnRleHQgKmNvbnRleHQgPSAoSGFwdGljR2VuZXJhdG9yQ29udGV4dCAqKSBzZWxmOworCisgICAgaWYgKGNvbnRleHQgPT0gbnVsbHB0ciB8fAorICAgICAgICBjb250ZXh0LT5zdGF0ZSA9PSBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfVU5JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBtZW1jcHkoZGVzY3JpcHRvciwgJmdIZ0Rlc2NyaXB0b3IsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6YXVkaW9fZWZmZWN0OjpoYXB0aWNfZ2VuZXJhdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL0VmZmVjdEhhcHRpY0dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Yjc0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9FZmZlY3RIYXB0aWNHZW5lcmF0b3IuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9FRkZFQ1RIQVBUSUNHRU5FUkFUT1JfSF8KKyNkZWZpbmUgQU5EUk9JRF9FRkZFQ1RIQVBUSUNHRU5FUkFUT1JfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvblV0aWxzLmg+CisKKyNpbmNsdWRlICJQcm9jZXNzb3JzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3IgeworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9uCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VudW0gaGFwdGljZ2VuZXJhdG9yX3N0YXRlX3QgeworICAgIEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9VTklOSVRJQUxJWkVELAorICAgIEhBUFRJQ0dFTkVSQVRPUl9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBIQVBUSUNHRU5FUkFUT1JfU1RBVEVfQUNUSVZFLAorfTsKKworLy8gcGFyYW1ldGVycyBmb3IgZWFjaCBoYXB0aWMgZ2VuZXJhdG9yCitzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yUGFyYW0geworICAgIHVpbnQzMl90IGhhcHRpY0NoYW5uZWxTb3VyY2VbMl07IC8vIFRoZSBhdWRpbyBjaGFubmVscyB1c2VkIHRvIGdlbmVyYXRlIGhhcHRpYyBjaGFubmVscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgY2hhbm5lbCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSEFQVElDX0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBjaGFubmVsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBIQVBUSUNfQgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSB3aWxsIGJlIG9mZnNldCBvZiBhdWRpbyBjaGFubmVsCisgICAgdWludDMyX3QgYXVkaW9DaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50OworCisgICAgLy8gQSBtYXAgZnJvbSB0cmFjayBpZCB0byBoYXB0aWMgaW50ZW5zaXR5LgorICAgIHN0ZDo6bWFwPGludCwgb3M6OkhhcHRpY1NjYWxlPiBpZDJJbnRlbnNpdHk7CisgICAgb3M6OkhhcHRpY1NjYWxlIG1heEhhcHRpY0ludGVuc2l0eTsgLy8gbWF4IGludGVuc2l0eSB3aWxsIGJlIHVzZWQgdG8gc2NhbGUgaGFwdGljIGRhdGEuCisKKyAgICBmbG9hdCByZXNvbmFudEZyZXF1ZW5jeTsKKyAgICBmbG9hdCBicGZROworICAgIGZsb2F0IHNsb3dFbnZOb3JtYWxpemF0aW9uUG93ZXI7CisgICAgZmxvYXQgYnNmWmVyb1E7CisgICAgZmxvYXQgYnNmUG9sZVE7CisgICAgZmxvYXQgZGlzdG9ydGlvbkNvcm5lckZyZXF1ZW5jeTsKKyAgICBmbG9hdCBkaXN0b3J0aW9uSW5wdXRHYWluOworICAgIGZsb2F0IGRpc3RvcnRpb25DdWJlVGhyZXNob2xkOworICAgIGZsb2F0IGRpc3RvcnRpb25PdXRwdXRHYWluOworfTsKKworLy8gQSBzdHJ1Y3R1cmUgdG8ga2VlcCBhbGwgc2hhcmVkIHBvaW50ZXJzIGZvciBhbGwgcHJvY2Vzc29ycyBpbiBIYXB0aWNHZW5lcmF0b3IuCitzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yUHJvY2Vzc29yc1JlY29yZCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4+IGZpbHRlcnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFJhbXA+PiByYW1wczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8U2xvd0VudmVsb3BlPj4gc2xvd0VudnM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPERpc3RvcnRpb24+PiBkaXN0b3J0aW9uczsKKworICAgIC8vIENhY2hlIGJhbmQtcGFzcyBmaWx0ZXIgYW5kIGJhbmQtc3RvcCBmaWx0ZXIgZm9yIHVwZGF0aW5nIHBhcmFtZXRlcnMKKyAgICAvLyBhY2NvcmRpbmcgdG8gdmlicmF0b3IgaW5mbworICAgIHN0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGJwZjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBic2Y7Cit9OworCisvLyBBIHN0cnVjdHVyZSB0byBrZWVwIGFsbCB0aGUgY29udGV4dCBmb3IgSGFwdGljR2VuZXJhdG9yLgorc3RydWN0IEhhcHRpY0dlbmVyYXRvckNvbnRleHQgeworICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKyAgICBoYXB0aWNnZW5lcmF0b3Jfc3RhdGVfdCBzdGF0ZTsKKyAgICBzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yUGFyYW0gcGFyYW07CisgICAgc2l6ZV90IGF1ZGlvRGF0YUJ5dGVzUGVyRnJhbWU7CisKKyAgICAvLyBBIGNhY2hlIGZvciBhbGwgc2hhcmVkIHBvaW50ZXJzIG9mIHRoZSBIYXB0aWNHZW5lcmF0b3IKKyAgICBzdHJ1Y3QgSGFwdGljR2VuZXJhdG9yUHJvY2Vzc29yc1JlY29yZCBwcm9jZXNzb3JzUmVjb3JkOworCisgICAgLy8gVXNpbmcgYSB2ZWN0b3Igb2YgZnVuY3Rpb25zIHRvIHJlY29yZCB0aGUgcHJvY2Vzc2luZyBjaGFpbiBmb3IgaGFwdGljLWdlbmVyYXRpbmcgYWxnb3JpdGhtLgorICAgIC8vIFRoZSB0aHJlZSBwYXJhbWV0ZXJzIG9mIHRoZSBwcm9jZXNzaW5nIGZ1bmN0aW9ucyBhcmUgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyLCBwb2ludGVyIHRvCisgICAgLy8gaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBjb3VudC4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoZmxvYXQqLCBjb25zdCBmbG9hdCosIHNpemVfdCk+PiBwcm9jZXNzaW5nQ2hhaW47CisKKyAgICAvLyBpbnB1dEJ1ZmZlciBpcyB3aGVyZSB0byBrZWVwIGlucHV0IGJ1ZmZlciBmb3IgdGhlIGdlbmVyYXRpbmcgYWxnb3JpdGhtLiBJdCB3aWxsIGJlCisgICAgLy8gY29uc3RydWN0ZWQgYWNjb3JkaW5nIHRvIEhhcHRpY0dlbmVyYXRvclBhcmFtLmhhcHRpY0NoYW5uZWxTb3VyY2UuCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0QnVmZmVyOworCisgICAgLy8gb3V0cHV0QnVmZmVyIGlzIGEgYnVmZmVyIGhhdmluZyB0aGUgc2FtZSBsZW5ndGggYXMgaW5wdXRCdWZmZXIuIEl0IGNhbiBiZSB1c2VkIGFzCisgICAgLy8gaW50ZXJtZWRpYXRlIGJ1ZmZlciBpbiB0aGUgZ2VuZXJhdGluZyBhbGdvcml0aG0uCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dEJ1ZmZlcjsKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVmZmVjdCBBUEkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqaGFuZGxlKTsKKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JMaWJfUmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKTsKKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JMaWJfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JfUHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAqb3V0QnVmZmVyKTsKKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JfQ29tbWFuZChlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVwbHlEYXRhKTsKKworaW50MzJfdCBIYXB0aWNHZW5lcmF0b3JfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcik7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvcgorCisjZW5kaWYgLy8gQU5EUk9JRF9FRkZFQ1RIQVBUSUNHRU5FUkFUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKcmVuYW1lIHRvIG1lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL1Byb2Nlc3NvcnMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvUHJvY2Vzc29ycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlM2E3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvaGFwdGljZ2VuZXJhdG9yL1Byb2Nlc3NvcnMuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RIR19Qcm9jZXNzb3JzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKworI2luY2x1ZGUgIlByb2Nlc3NvcnMuaCIKKworI2lmIGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2lmbmRlZiBVU0VfTkVPTgorI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgVVNFX05FT04gKGZhbHNlKQorI2VuZGlmCisjaWYgVVNFX05FT04KKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkOjphdWRpb19lZmZlY3Q6OmhhcHRpY19nZW5lcmF0b3IgeworCitmbG9hdCBnZXRSZWFsUG9sZVooZmxvYXQgY29ybmVyRnJlcXVlbmN5LCBmbG9hdCBzYW1wbGVSYXRlKSB7CisgICAgLy8gVGhpcyB3aWxsIGJlIGEgcG9sZSBvZiBhIGZpcnN0IG9yZGVyIGZpbHRlci4KKyAgICBmbG9hdCByZWFsUG9sZVMgPSAtMiAqIE1fUEkgKiBjb3JuZXJGcmVxdWVuY3k7CisgICAgcmV0dXJuIGV4cChyZWFsUG9sZVMgLyBzYW1wbGVSYXRlKTsgLy8gemVyby1wb2xlIG1hdGNoaW5nCit9CisKK3N0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGdldENvbXBsZXhQb2xlWihmbG9hdCByaW5naW5nRnJlcXVlbmN5LCBmbG9hdCBxLCBmbG9hdCBzYW1wbGVSYXRlKSB7CisgICAgLy8gVGhpcyBpcyB0aGUgcG9sZSBmb3IgMS8oc14yICsgcy9xICsgMSkgaW4gbm9ybWFsaXplZCBmcmVxdWVuY3kuIFRoZSBvdGhlciBwb2xlIGlzCisgICAgLy8gdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIHRoaXMuCisgICAgZmxvYXQgcG9sZUltYWdTID0gMiAqIE1fUEkgKiByaW5naW5nRnJlcXVlbmN5OworICAgIGZsb2F0IHBvbGVSZWFsUyA9IC1wb2xlSW1hZ1MgLyAoMiAqIHEpOworICAgIGZsb2F0IHBvbGVSYWRpdXMgPSBleHAocG9sZVJlYWxTIC8gc2FtcGxlUmF0ZSk7CisgICAgZmxvYXQgcG9sZUltYWdaID0gcG9sZVJhZGl1cyAqIHNpbihwb2xlSW1hZ1MgLyBzYW1wbGVSYXRlKTsKKyAgICBmbG9hdCBwb2xlUmVhbFogPSBwb2xlUmFkaXVzICogY29zKHBvbGVJbWFnUyAvIHNhbXBsZVJhdGUpOworICAgIHJldHVybiB7cG9sZVJlYWxaLCBwb2xlSW1hZ1p9OworfQorCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBSYW1wCisKK1JhbXA6OlJhbXAoc2l6ZV90IGNoYW5uZWxDb3VudCkgOiBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCkge30KKwordm9pZCBSYW1wOjpwcm9jZXNzKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBzaXplX3QgaSA9IDA7CisjaWYgVVNFX05FT04KKyAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBmcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICBmbG9hdDMyeDJfdCBhbGxaZXJvID0gdmR1cF9uX2YzMigwLjBmKTsKKyAgICB3aGlsZSAoaSArIDEgPCBzYW1wbGVDb3VudCkgeworICAgICAgICB2c3QxX2YzMihvdXQsIHZtYXhfZjMyKHZsZDFfZjMyKGluKSwgYWxsWmVybykpOworICAgICAgICBpbiArPSAyOworICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgaSArPSAyOworICAgIH0KKyNlbmRpZiAvLyBVU0VfTkVPTgorICAgIGZvciAoOyBpIDwgZnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7ICsraSkgeworICAgICAgICAqb3V0ID0gKmluID49IDAuMGYgPyAqaW4gOiAwLjBmOworICAgICAgICBvdXQrKzsKKyAgICAgICAgaW4rKzsKKyAgICB9Cit9CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIFNsb3dFbnZlbG9wZQorCitTbG93RW52ZWxvcGU6OlNsb3dFbnZlbG9wZSgKKyAgICAgICAgZmxvYXQgY29ybmVyRnJlcXVlbmN5LAorICAgICAgICBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICBmbG9hdCBub3JtYWxpemF0aW9uUG93ZXIsCisgICAgICAgIGZsb2F0IGVudk9mZnNldCwKKyAgICAgICAgc2l6ZV90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBtTHBmKGNyZWF0ZUxQRihjb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCkpLAorICAgICAgICAgIG1Ob3JtYWxpemF0aW9uUG93ZXIobm9ybWFsaXphdGlvblBvd2VyKSwKKyAgICAgICAgICBtRW52T2Zmc2V0KGVudk9mZnNldCksCisgICAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9CisKK3ZvaWQgU2xvd0VudmVsb3BlOjpwcm9jZXNzKGZsb2F0KiBvdXQsIGNvbnN0IGZsb2F0KiBpbiwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICBzaXplX3Qgc2FtcGxlQ291bnQgPSBmcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICBpZiAoc2FtcGxlQ291bnQgPiBtTHBmT3V0QnVmZmVyLnNpemUoKSkgeworICAgICAgICBtTHBmT3V0QnVmZmVyLnJlc2l6ZShzYW1wbGVDb3VudCk7CisgICAgICAgIG1McGZJbkJ1ZmZlci5yZXNpemUoc2FtcGxlQ291bnQpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyArK2kpIHsKKyAgICAgICAgbUxwZkluQnVmZmVyW2ldID0gZmFicyhpbltpXSk7CisgICAgfQorICAgIG1McGYtPnByb2Nlc3MobUxwZk91dEJ1ZmZlci5kYXRhKCksIG1McGZJbkJ1ZmZlci5kYXRhKCksIGZyYW1lQ291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgeworICAgICAgICBvdXRbaV0gPSBpbltpXSAqIHBvdyhtTHBmT3V0QnVmZmVyW2ldICsgbUVudk9mZnNldCwgbU5vcm1hbGl6YXRpb25Qb3dlcik7CisgICAgfQorfQorCit2b2lkIFNsb3dFbnZlbG9wZTo6c2V0Tm9ybWFsaXphdGlvblBvd2VyKGZsb2F0IG5vcm1hbGl6YXRpb25Qb3dlcikgeworICAgIG1Ob3JtYWxpemF0aW9uUG93ZXIgPSBub3JtYWxpemF0aW9uUG93ZXI7Cit9CisKK3ZvaWQgU2xvd0VudmVsb3BlOjpjbGVhcigpIHsKKyAgICBtTHBmLT5jbGVhcigpOworfQorCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBkaXN0b3J0aW9uCisKK0Rpc3RvcnRpb246OkRpc3RvcnRpb24oCisgICAgICAgIGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgZmxvYXQgaW5wdXRHYWluLAorICAgICAgICBmbG9hdCBjdWJlVGhyZXNob2xkLAorICAgICAgICBmbG9hdCBvdXRwdXRHYWluLAorICAgICAgICBzaXplX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IG1McGYoY3JlYXRlTFBGMihjb3JuZXJGcmVxdWVuY3ksIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCkpLAorICAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAorICAgICAgICAgIG1Db3JuZXJGcmVxdWVuY3koY29ybmVyRnJlcXVlbmN5KSwKKyAgICAgICAgICBtSW5wdXRHYWluKGlucHV0R2FpbiksCisgICAgICAgICAgbUN1YmVUaHJlc2hvbGQoY3ViZVRocmVzaG9sZCksCisgICAgICAgICAgbU91dHB1dEdhaW4ob3V0cHV0R2FpbiksCisgICAgICAgICAgbUNoYW5uZWxDb3VudChjaGFubmVsQ291bnQpIHt9CisKK3ZvaWQgRGlzdG9ydGlvbjo6cHJvY2VzcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgc2l6ZV90IHNhbXBsZUNvdW50ID0gZnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgaWYgKHNhbXBsZUNvdW50ID4gbUxwZkluQnVmZmVyLnNpemUoKSkgeworICAgICAgICBtTHBmSW5CdWZmZXIucmVzaXplKHNhbXBsZUNvdW50KTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgKytpKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IHggPSBtSW5wdXRHYWluICogaW5baV07CisgICAgICAgIG1McGZJbkJ1ZmZlcltpXSA9IHggKiB4ICogeCAvIChtQ3ViZVRocmVzaG9sZCArIHggKiB4KTsgIC8vICJDb3JpbmciIG5vbmxpbmVhcml0eS4KKyAgICB9CisgICAgbUxwZi0+cHJvY2VzcyhvdXQsIG1McGZJbkJ1ZmZlci5kYXRhKCksIGZyYW1lQ291bnQpOyAgLy8gUmVkdWNlIDMqRiBjb21wb25lbnRzLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBmbG9hdCB4ID0gb3V0W2ldOworICAgICAgICBvdXRbaV0gPSBtT3V0cHV0R2FpbiAqIHggLyAoMS4wZiArIGZhYnMoeCkpOyAgLy8gU29mdCBsaW1pdGVyLgorICAgIH0KK30KKwordm9pZCBEaXN0b3J0aW9uOjpzZXRDb3JuZXJGcmVxdWVuY3koZmxvYXQgY29ybmVyRnJlcXVlbmN5KSB7CisgICAgbUNvcm5lckZyZXF1ZW5jeSA9IGNvcm5lckZyZXF1ZW5jeTsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQgPSBscGZDb2Vmcyhjb3JuZXJGcmVxdWVuY3ksIG1TYW1wbGVSYXRlKTsKKyAgICBtTHBmLT5zZXRDb2VmZmljaWVudHMoY29lZmZpY2llbnQpOworfQorCit2b2lkIERpc3RvcnRpb246OnNldElucHV0R2FpbihmbG9hdCBpbnB1dEdhaW4pIHsKKyAgICBtSW5wdXRHYWluID0gaW5wdXRHYWluOworfQorCit2b2lkIERpc3RvcnRpb246OnNldEN1YmVUaHJlaG9sZChmbG9hdCBjdWJlVGhyZXNob2xkKSB7CisgICAgbUN1YmVUaHJlc2hvbGQgPSBjdWJlVGhyZXNob2xkOworfQorCit2b2lkIERpc3RvcnRpb246OnNldE91dHB1dEdhaW4oZmxvYXQgb3V0cHV0R2FpbikgeworICAgIG1PdXRwdXRHYWluID0gb3V0cHV0R2FpbjsKK30KKwordm9pZCBEaXN0b3J0aW9uOjpjbGVhcigpIHsKKyAgICBtTHBmLT5jbGVhcigpOworfQorCisKKy8vIEltcGxlbWVudGF0aW9uIG9mIGhlbHBlciBmdW5jdGlvbnMKKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGNhc2NhZGVGaXJzdE9yZGVyRmlsdGVycyhjb25zdCBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgJmNvZWZzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyAmY29lZnMyKSB7CisgICAgYXNzZXJ0KGNvZWZzMVsyXSA9PSAwLjBmKTsKKyAgICBhc3NlcnQoY29lZnMyWzJdID09IDAuMGYpOworICAgIGFzc2VydChjb2VmczFbNF0gPT0gMC4wZik7CisgICAgYXNzZXJ0KGNvZWZzMls0XSA9PSAwLjBmKTsKKyAgICByZXR1cm4ge2NvZWZzMVswXSAqIGNvZWZzMlswXSwKKyAgICAgICAgICAgIGNvZWZzMVswXSAqIGNvZWZzMlsxXSArIGNvZWZzMVsxXSAqIGNvZWZzMlswXSwKKyAgICAgICAgICAgIGNvZWZzMVsxXSAqIGNvZWZzMlsxXSwKKyAgICAgICAgICAgIGNvZWZzMVszXSArIGNvZWZzMlszXSwKKyAgICAgICAgICAgIGNvZWZzMVszXSAqIGNvZWZzMlszXX07Cit9CisKK0JpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBscGZDb2Vmcyhjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQ7CisgICAgZmxvYXQgcmVhbFBvbGVaID0gZ2V0UmVhbFBvbGVaKGNvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSk7CisgICAgLy8gVGhpcyBpcyBhIHplcm8gYXQgbnlxdWlzdAorICAgIGNvZWZmaWNpZW50WzBdID0gMC41ZiAqICgxIC0gcmVhbFBvbGVaKTsKKyAgICBjb2VmZmljaWVudFsxXSA9IGNvZWZmaWNpZW50WzBdOworICAgIGNvZWZmaWNpZW50WzJdID0gMC4wZjsKKyAgICBjb2VmZmljaWVudFszXSA9IC1yZWFsUG9sZVo7IC8vIFRoaXMgaXMgdHJhZGl0aW9uYWwgMS8ocysxKSBmaWx0ZXIKKyAgICBjb2VmZmljaWVudFs0XSA9IDAuMGY7CisgICAgcmV0dXJuIGNvZWZmaWNpZW50OworfQorCitCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgYnBmQ29lZnMoY29uc3QgZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQ7CisgICAgY29uc3QgYXV0byBbcmVhbCwgaW1nXSA9IGdldENvbXBsZXhQb2xlWihyaW5naW5nRnJlcXVlbmN5LCBxLCBzYW1wbGVSYXRlKTsKKyAgICAvLyBOb3RlOiB0aGlzIGlzIG5vdCBhIHN0YW5kYXJkIGNvb2tib29rIEJQRiwgYnV0IGEgbG93IHBhc3MgZmlsdGVyIHdpdGggemVybyBhdCBEQworICAgIGNvZWZmaWNpZW50WzBdID0gMS4wZjsKKyAgICBjb2VmZmljaWVudFsxXSA9IC0xLjBmOworICAgIGNvZWZmaWNpZW50WzJdID0gMC4wZjsKKyAgICBjb2VmZmljaWVudFszXSA9IC0yICogcmVhbDsKKyAgICBjb2VmZmljaWVudFs0XSA9IHJlYWwgKiByZWFsICsgaW1nICogaW1nOworICAgIHJldHVybiBjb2VmZmljaWVudDsKK30KKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGJzZkNvZWZzKGNvbnN0IGZsb2F0IHJpbmdpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgenEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudDsKKyAgICBjb25zdCBhdXRvIFt6ZXJvUmVhbCwgemVyb0ltZ10gPSBnZXRDb21wbGV4UG9sZVoocmluZ2luZ0ZyZXF1ZW5jeSwgenEsIHNhbXBsZVJhdGUpOworICAgIGZsb2F0IHplcm9Db2VmZjEgPSAtMiAqIHplcm9SZWFsOworICAgIGZsb2F0IHplcm9Db2VmZjIgPSB6ZXJvUmVhbCogemVyb1JlYWwgKyB6ZXJvSW1nICogemVyb0ltZzsKKyAgICBjb25zdCBhdXRvIFtwb2xlUmVhbCwgcG9sZUltZ10gPSBnZXRDb21wbGV4UG9sZVoocmluZ2luZ0ZyZXF1ZW5jeSwgcHEsIHNhbXBsZVJhdGUpOworICAgIGZsb2F0IHBvbGVDb2VmZjEgPSAtMiAqIHBvbGVSZWFsOworICAgIGZsb2F0IHBvbGVDb2VmZjIgPSBwb2xlUmVhbCAqIHBvbGVSZWFsICsgcG9sZUltZyAqIHBvbGVJbWc7CisgICAgY29uc3QgZmxvYXQgbm9ybSA9ICgxLjBmICsgcG9sZUNvZWZmMSArIHBvbGVDb2VmZjIpIC8gKDEuMGYgKyB6ZXJvQ29lZmYxICsgemVyb0NvZWZmMik7CisgICAgY29lZmZpY2llbnRbMF0gPSAxLjBmICogbm9ybTsKKyAgICBjb2VmZmljaWVudFsxXSA9IHplcm9Db2VmZjEgKiBub3JtOworICAgIGNvZWZmaWNpZW50WzJdID0gemVyb0NvZWZmMiAqIG5vcm07CisgICAgY29lZmZpY2llbnRbM10gPSBwb2xlQ29lZmYxOworICAgIGNvZWZmaWNpZW50WzRdID0gcG9sZUNvZWZmMjsKKyAgICByZXR1cm4gY29lZmZpY2llbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUxQRihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KSB7CisgICAgQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGNvZWZmaWNpZW50ID0gbHBmQ29lZnMoY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIYXB0aWNCaXF1YWRGaWx0ZXI+KGNoYW5uZWxDb3VudCwgY29lZmZpY2llbnQpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVMUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudCA9IGxwZkNvZWZzKGNvcm5lckZyZXF1ZW5jeSwgc2FtcGxlUmF0ZSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGFwdGljQmlxdWFkRmlsdGVyPigKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCwgY2FzY2FkZUZpcnN0T3JkZXJGaWx0ZXJzKGNvZWZmaWNpZW50LCBjb2VmZmljaWVudCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVIUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCkgeworICAgIEJpcXVhZEZpbHRlckNvZWZmaWNpZW50cyBjb2VmZmljaWVudDsKKyAgICAvLyBOb3RlOiB0aGlzIGlzIHZhbGlkIG9ubHkgd2hlbiBjb3JuZXIgZnJlcXVlbmN5IGlzIGxlc3MgdGhhbiBueXF1aXN0IC8gMi4KKyAgICBmbG9hdCByZWFsUG9sZVogPSBnZXRSZWFsUG9sZVooY29ybmVyRnJlcXVlbmN5LCBzYW1wbGVSYXRlKTsKKworICAgIC8vIE5vdGU6IHRoaXMgaXMgYSB6ZXJvIGF0IERDCisgICAgY29lZmZpY2llbnRbMF0gPSAwLjVmICogKDEgKyByZWFsUG9sZVopOworICAgIGNvZWZmaWNpZW50WzFdID0gLWNvZWZmaWNpZW50WzBdOworICAgIGNvZWZmaWNpZW50WzJdID0gMC4wZjsKKyAgICBjb2VmZmljaWVudFszXSA9IC1yZWFsUG9sZVo7CisgICAgY29lZmZpY2llbnRbNF0gPSAwLjBmOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhhcHRpY0JpcXVhZEZpbHRlcj4oCisgICAgICAgICAgICBjaGFubmVsQ291bnQsIGNhc2NhZGVGaXJzdE9yZGVyRmlsdGVycyhjb2VmZmljaWVudCwgY29lZmZpY2llbnQpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlQlBGKGNvbnN0IGZsb2F0IHJpbmdpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQgPSBicGZDb2VmcyhyaW5naW5nRnJlcXVlbmN5LCBxLCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIYXB0aWNCaXF1YWRGaWx0ZXI+KGNoYW5uZWxDb3VudCwgY29lZmZpY2llbnQpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVCU0YoY29uc3QgZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB6cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBwcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpIHsKKyAgICBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgY29lZmZpY2llbnQgPSBic2ZDb2VmcyhyaW5naW5nRnJlcXVlbmN5LCB6cSwgcHEsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEhhcHRpY0JpcXVhZEZpbHRlcj4oY2hhbm5lbENvdW50LCBjb2VmZmljaWVudCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvUHJvY2Vzc29ycy5oIGIvbWVkaWEvbGliZWZmZWN0cy9oYXB0aWNnZW5lcmF0b3IvUHJvY2Vzc29ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Y2E3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2hhcHRpY2dlbmVyYXRvci9Qcm9jZXNzb3JzLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9FRkZFQ1RfSEFQVElDX0dFTkVSQVRPUl9QUk9DRVNTT1JTX0hfCisjZGVmaW5lIF9FRkZFQ1RfSEFQVElDX0dFTkVSQVRPUl9QUk9DRVNTT1JTX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKwordXNpbmcgSGFwdGljQmlxdWFkRmlsdGVyID0gYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxmbG9hdD47Cit1c2luZyBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgPSBzdGQ6OmFycmF5PGZsb2F0LCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPjsKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvciB7CisKKy8vIEEgY2xhc3MgcHJvdmlkaW5nIGEgcHJvY2VzcyBmdW5jdGlvbiB0aGF0IG1ha2VzIGlucHV0IGRhdGEgbm9uLW5lZ2F0aXZlLgorY2xhc3MgUmFtcCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFtcChzaXplX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKK307CisKKworY2xhc3MgU2xvd0VudmVsb3BlIHsKK3B1YmxpYzoKKyAgICBTbG93RW52ZWxvcGUoZmxvYXQgY29ybmVyRnJlcXVlbmN5LCBmbG9hdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICBmbG9hdCBub3JtYWxpemF0aW9uUG93ZXIsIGZsb2F0IGVudk9mZnNldCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBzaXplX3QgZnJhbWVDb3VudCk7CisKKyAgICB2b2lkIHNldE5vcm1hbGl6YXRpb25Qb3dlcihmbG9hdCBub3JtYWxpemF0aW9uUG93ZXIpOworCisgICAgdm9pZCBjbGVhcigpOworCitwcml2YXRlOgorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IG1McGY7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1McGZJbkJ1ZmZlcjsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUxwZk91dEJ1ZmZlcjsKKyAgICBmbG9hdCBtTm9ybWFsaXphdGlvblBvd2VyOworICAgIGNvbnN0IGZsb2F0IG1FbnZPZmZzZXQ7CisgICAgY29uc3QgZmxvYXQgbUNoYW5uZWxDb3VudDsKK307CisKKworLy8gQSBjbGFzcyBwcm92aWRpbmcgYSBwcm9jZXNzIGZ1bmN0aW9uIHRoYXQgY29tcHJlc3NpdmVseSBkaXN0b3J0cyBhIHdhdmVmb3JtcworY2xhc3MgRGlzdG9ydGlvbiB7CitwdWJsaWM6CisgICAgRGlzdG9ydGlvbihmbG9hdCBjb3JuZXJGcmVxdWVuY3ksIGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICBmbG9hdCBpbnB1dEdhaW4sIGZsb2F0IGN1YmVUaHJlc2hvbGQsCisgICAgICAgICAgICAgICBmbG9hdCBvdXRwdXRHYWluLCBzaXplX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIHNpemVfdCBmcmFtZUNvdW50KTsKKworICAgIHZvaWQgc2V0Q29ybmVyRnJlcXVlbmN5KGZsb2F0IGNvcm5lckZyZXF1ZW5jeSk7CisgICAgdm9pZCBzZXRJbnB1dEdhaW4oZmxvYXQgaW5wdXRHYWluKTsKKyAgICB2b2lkIHNldEN1YmVUaHJlaG9sZChmbG9hdCBjdWJlVGhyZXNob2xkKTsKKyAgICB2b2lkIHNldE91dHB1dEdhaW4oZmxvYXQgb3V0cHV0R2Fpbik7CisKKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gbUxwZjsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbUxwZkluQnVmZmVyOworICAgIGZsb2F0IG1TYW1wbGVSYXRlOworICAgIGZsb2F0IG1Db3JuZXJGcmVxdWVuY3k7CisgICAgZmxvYXQgbUlucHV0R2FpbjsKKyAgICBmbG9hdCBtQ3ViZVRocmVzaG9sZDsKKyAgICBmbG9hdCBtT3V0cHV0R2FpbjsKKyAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbnMKKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGNhc2NhZGVGaXJzdE9yZGVyRmlsdGVycyhjb25zdCBCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgJmNvZWZzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzICZjb2VmczIpOworCitCaXF1YWRGaWx0ZXJDb2VmZmljaWVudHMgbHBmQ29lZnMoY29uc3QgZmxvYXQgY29ybmVyRnJlcXVlbmN5LCBjb25zdCBmbG9hdCBzYW1wbGVSYXRlKTsKKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGJwZkNvZWZzKGNvbnN0IGZsb2F0IHJpbmdpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGVSYXRlKTsKKworQmlxdWFkRmlsdGVyQ29lZmZpY2llbnRzIGJzZkNvZWZzKGNvbnN0IGZsb2F0IHJpbmdpbmdGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgenEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSk7CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUxQRihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50KTsKKworLy8gQ3JlYXRlIHR3byBjYXNjYWRlZCBMUEYgd2l0aCBzYW1lIGNvcm5lciBmcmVxdWVuY3kuCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVMUEYyKGNvbnN0IGZsb2F0IGNvcm5lckZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKKy8vIENyZWF0ZSB0d28gY2FzY2FkZWQgSFBGIHdpdGggc2FtZSBjb3JuZXIgZnJlcXVlbmN5Lgorc3RkOjpzaGFyZWRfcHRyPEhhcHRpY0JpcXVhZEZpbHRlcj4gY3JlYXRlSFBGMihjb25zdCBmbG9hdCBjb3JuZXJGcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjaGFubmVsQ291bnQpOworCitzdGQ6OnNoYXJlZF9wdHI8SGFwdGljQmlxdWFkRmlsdGVyPiBjcmVhdGVCUEYoY29uc3QgZmxvYXQgcmluZ2luZ0ZyZXF1ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKK3N0ZDo6c2hhcmVkX3B0cjxIYXB0aWNCaXF1YWRGaWx0ZXI+IGNyZWF0ZUJTRihjb25zdCBmbG9hdCByaW5naW5nRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHpxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6OmF1ZGlvX2VmZmVjdDo6aGFwdGljX2dlbmVyYXRvcgorCisjZW5kaWYgLy8gX0VGRkVDVF9IQVBUSUNfR0VORVJBVE9SX1BST0NFU1NPUlNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvQW5kcm9pZC5icAppbmRleCA1YTEzYWY2Li5iY2Q2OTQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKIC8vIExvdWRuZXNzRW5oYW5jZXIgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfbG91ZG5lc3NfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19sb3VkbmVzc19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmxkbmhuY3IiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS8uY2xhbmctZm9ybWF0IGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vLmNsYW5nLWZvcm1hdApAQCAtMCwwICsxLDE1IEBACitCYXNlZE9uU3R5bGU6IEdvb2dsZQorU3RhbmRhcmQ6IENwcDExCitBY2Nlc3NNb2RpZmllck9mZnNldDogLTIKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0NvbHVtbkxpbWl0OiAxMDAKK0NvbW1lbnRQcmFnbWFzOiBOT0xJTlQ6LioKK0Rlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCitJbmNsdWRlQmxvY2tzOiBQcmVzZXJ2ZQorSW5kZW50V2lkdGg6IDQKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitQb2ludGVyQWxpZ25tZW50OiBMZWZ0CitUYWJXaWR0aDogNAorVXNlVGFiOiBOZXZlcgorIyBGb2xsb3dpbmcgYXJlIHNwZWNpZmljIHRvIGxpYmVmZmVjdHMvbHZtCitTb3J0SW5jbHVkZXM6IGZhbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyNWI4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2JlbmNobWFyayB7CisgICAgbmFtZTogImx2bV9iZW5jaG1hcmsiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbImx2bV9iZW5jaG1hcmsuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmJ1bmRsZXdyYXBwZXIiLAorICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY19iZW5jaG1hcmsgeworICAgIG5hbWU6ICJyZXZlcmJfYmVuY2htYXJrIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKKyAgICBdLAorICAgIHNyY3M6IFsicmV2ZXJiX2JlbmNobWFyay5jcHAiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicmV2ZXJiIiwKKyAgICAgICAgImxpYnJldmVyYndyYXBwZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvbHZtX2JlbmNobWFyay5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYjY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9iZW5jaG1hcmtzL2x2bV9iZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07Citjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKKyAgICAgICAgLy8gTlhQIFNXIEJhc3NCb29zdAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCisgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgRXF1YWxpemVyCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgVm9sdW1lCisgICAgICAgIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKKworY29uc3RleHByIHNpemVfdCBrRnJhbWVDb3VudCA9IDIwNDg7CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hNYXNrc1tdID0geworICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yLCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTAsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMSwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTMsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTYsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTksIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjIsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0LAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtQ2hNYXNrcyA9IHN0ZDo6c2l6ZShrQ2hNYXNrcyk7Citjb25zdGV4cHIgaW50IGtTYW1wbGVSYXRlID0gNDQxMDA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBIHRlc3QgcmVzdWx0IHJ1bm5pbmcgb24gUGl4ZWwgMyBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdC4KKyAqIDA6IEJhc3MgQm9vc3QsIDE6IFZpcnR1YWxpemVyLCAyOiBFcXVhbGl6ZXIsIDM6IFZvbHVtZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJlbmNobWFyayAgICAgICAgICAgVGltZSAgICAgICAgICAgICBDUFUgICBJdGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQk1fTFZNLzEvMCAgICAgICA1MjEyMyBucyAgICAgICAgNTE5NzEgbnMgICAgICAgIDEzNDM3CisgKiBCTV9MVk0vMS8xICAgICAgIDc1Mzk3IG5zICAgICAgICA3NTE3NSBucyAgICAgICAgIDkzODIKKyAqIEJNX0xWTS8xLzIgICAgICAgNDAyNTMgbnMgICAgICAgIDQwMTQwIG5zICAgICAgICAxNzQxOAorICogQk1fTFZNLzEvMyAgICAgICAxOTkxOCBucyAgICAgICAgMTk4NjAgbnMgICAgICAgIDM1MjMwCisgKiBCTV9MVk0vMi8wICAgICAgIDYyNDU1IG5zICAgICAgICA2MjI4MyBucyAgICAgICAgMTEyMTQKKyAqIEJNX0xWTS8yLzEgICAgICAxMTAwODYgbnMgICAgICAgMTA5NzUxIG5zICAgICAgICAgNjM1MAorICogQk1fTFZNLzIvMiAgICAgICA0NDAxNyBucyAgICAgICAgNDM4OTAgbnMgICAgICAgIDE1OTgyCisgKiBCTV9MVk0vMi8zICAgICAgIDIxNjYwIG5zICAgICAgICAyMTU5NiBucyAgICAgICAgMzI1NjgKKyAqIEJNX0xWTS8zLzAgICAgICAgNzE5MjUgbnMgICAgICAgIDcxNjk4IG5zICAgICAgICAgOTc0NQorICogQk1fTFZNLzMvMSAgICAgIDExNzA0MyBucyAgICAgICAxMTY3NTQgbnMgICAgICAgICA2MDA3CisgKiBCTV9MVk0vMy8yICAgICAgIDQ4ODk5IG5zICAgICAgICA0ODc4MSBucyAgICAgICAgMTQzMzQKKyAqIEJNX0xWTS8zLzMgICAgICAgMjM2MDcgbnMgICAgICAgIDIzNTQwIG5zICAgICAgICAyOTczOQorICogQk1fTFZNLzQvMCAgICAgICA4MTI5NiBucyAgICAgICAgODEwOTUgbnMgICAgICAgICA4NjMyCisgKiBCTV9MVk0vNC8xICAgICAgMTIyNDM1IG5zICAgICAgIDEyMjEzMiBucyAgICAgICAgIDU3MzMKKyAqIEJNX0xWTS80LzIgICAgICAgNTM3NDQgbnMgICAgICAgIDUzNjEyIG5zICAgICAgICAxMzA2OAorICogQk1fTFZNLzQvMyAgICAgICAyNTg0NiBucyAgICAgICAgMjU3ODMgbnMgICAgICAgIDI3MTg4CisgKiBCTV9MVk0vNS8wICAgICAgIDk4NTU3IG5zICAgICAgICA5ODMxMSBucyAgICAgICAgIDcxMjAKKyAqIEJNX0xWTS81LzEgICAgICAxMzE2MjYgbnMgICAgICAgMTMxMjY5IG5zICAgICAgICAgNTI5NgorICogQk1fTFZNLzUvMiAgICAgICA2Njg5MiBucyAgICAgICAgNjY3MzIgbnMgICAgICAgIDEwNDU4CisgKiBCTV9MVk0vNS8zICAgICAgIDMxNzk3IG5zICAgICAgICAzMTcyMSBucyAgICAgICAgMjIwOTIKKyAqIEJNX0xWTS82LzAgICAgICAxMTE4ODAgbnMgICAgICAgMTExNTk2IG5zICAgICAgICAgNjI3OAorICogQk1fTFZNLzYvMSAgICAgIDE0MDIwNyBucyAgICAgICAxMzk4NDYgbnMgICAgICAgICA1MDAwCisgKiBCTV9MVk0vNi8yICAgICAgIDc1NjgzIG5zICAgICAgICA3NTQ5NiBucyAgICAgICAgIDkyNTMKKyAqIEJNX0xWTS82LzMgICAgICAgMzc2NjkgbnMgICAgICAgIDM3NTcxIG5zICAgICAgICAxODY2MworICogQk1fTFZNLzcvMCAgICAgIDEyODI2NSBucyAgICAgICAxMjc5NTcgbnMgICAgICAgICA1NDcwCisgKiBCTV9MVk0vNy8xICAgICAgMTQ5NTIyIG5zICAgICAgIDE0OTE1OSBucyAgICAgICAgIDQ2OTkKKyAqIEJNX0xWTS83LzIgICAgICAgOTIwMjQgbnMgICAgICAgIDkxNzk4IG5zICAgICAgICAgNzYzMQorICogQk1fTFZNLzcvMyAgICAgICA0MzM3MiBucyAgICAgICAgNDMyNjggbnMgICAgICAgIDE2MTgxCisgKiBCTV9MVk0vOC8wICAgICAgMTQxODk3IG5zICAgICAgIDE0MTU0OCBucyAgICAgICAgIDQ5NDUKKyAqIEJNX0xWTS84LzEgICAgICAxNTgwNjIgbnMgICAgICAgMTU3NjYxIG5zICAgICAgICAgNDQzOAorICogQk1fTFZNLzgvMiAgICAgICA5ODA0MiBucyAgICAgICAgOTc4MDEgbnMgICAgICAgICA3MTUxCisgKiBCTV9MVk0vOC8zICAgICAgIDQ5MDQ0IG5zICAgICAgICA0ODkyMyBucyAgICAgICAgMTQzMTQKKyAqIEJNX0xWTS85LzAgICAgICAxNzQ2OTIgbnMgICAgICAgMTc0MjI4IG5zICAgICAgICAgNDAyNgorICogQk1fTFZNLzkvMSAgICAgIDE4MzA0OCBucyAgICAgICAxODI1NjAgbnMgICAgICAgICAzODM0CisgKiBCTV9MVk0vOS8yICAgICAgMTMxMDIwIG5zICAgICAgIDEzMDY3NSBucyAgICAgICAgIDUzNDcKKyAqIEJNX0xWTS85LzMgICAgICAgNzExMDIgbnMgICAgICAgIDcwOTE1IG5zICAgICAgICAgOTgwMQorICogQk1fTFZNLzEwLzAgICAgIDE4OTA3OSBucyAgICAgICAxODg1NzYgbnMgICAgICAgICAzNjk5CisgKiBCTV9MVk0vMTAvMSAgICAgMTg3OTg5IG5zICAgICAgIDE4NzQ3MiBucyAgICAgICAgIDM3MzcKKyAqIEJNX0xWTS8xMC8yICAgICAxNDAwOTMgbnMgICAgICAgMTM5NzE3IG5zICAgICAgICAgNTAwNworICogQk1fTFZNLzEwLzMgICAgICA3ODE3NSBucyAgICAgICAgNzc5NjMgbnMgICAgICAgICA4OTE5CisgKiBCTV9MVk0vMTEvMCAgICAgMjA3NTc3IG5zICAgICAgIDIwNzAwNyBucyAgICAgICAgIDMzNzEKKyAqIEJNX0xWTS8xMS8xICAgICAxOTgxODYgbnMgICAgICAgMTk3NjQwIG5zICAgICAgICAgMzUzNQorICogQk1fTFZNLzExLzIgICAgIDE1NzIxNCBucyAgICAgICAxNTY3ODYgbnMgICAgICAgICA0NDU5CisgKiBCTV9MVk0vMTEvMyAgICAgIDg1OTEyIG5zICAgICAgICA4NTY4MSBucyAgICAgICAgIDgxNTMKKyAqIEJNX0xWTS8xMi8wICAgICAyMjA4NjEgbnMgICAgICAgMjIwMjY1IG5zICAgICAgICAgMzE2OQorICogQk1fTFZNLzEyLzEgICAgIDIwODc1OSBucyAgICAgICAyMDgxODQgbnMgICAgICAgICAzMzU1CisgKiBCTV9MVk0vMTIvMiAgICAgMTY1NTMzIG5zICAgICAgIDE2NTA4OCBucyAgICAgICAgIDQyMzQKKyAqIEJNX0xWTS8xMi8zICAgICAgOTI2MTYgbnMgICAgICAgIDkyMzY0IG5zICAgICAgICAgNzUyOAorICogQk1fTFZNLzEzLzAgICAgIDIzODU3MyBucyAgICAgICAyMzc5MjAgbnMgICAgICAgICAyOTQ1CisgKiBCTV9MVk0vMTMvMSAgICAgMjE5MTMwIG5zICAgICAgIDIxODUyMCBucyAgICAgICAgIDMyMDkKKyAqIEJNX0xWTS8xMy8yICAgICAxODMxOTMgbnMgICAgICAgMTgyNjkyIG5zICAgICAgICAgMzgzMAorICogQk1fTFZNLzEzLzMgICAgIDEwMDU0NiBucyAgICAgICAxMDAyNzQgbnMgICAgICAgICA3MDA1CisgKiBCTV9MVk0vMTQvMCAgICAgMjU0ODIwIG5zICAgICAgIDI1NDEzNSBucyAgICAgICAgIDI3NDgKKyAqIEJNX0xWTS8xNC8xICAgICAyMzAxNjEgbnMgICAgICAgMjI5NTMwIG5zICAgICAgICAgMzA0OQorICogQk1fTFZNLzE0LzIgICAgIDE5MjE5NSBucyAgICAgICAxOTE2NzEgbnMgICAgICAgICAzNjM1CisgKiBCTV9MVk0vMTQvMyAgICAgMTA3NzcwIG5zICAgICAgIDEwNzQ3NyBucyAgICAgICAgIDY1MDIKKyAqIEJNX0xWTS8xNS8wICAgICAyNzM2OTUgbnMgICAgICAgMjcyOTU0IG5zICAgICAgICAgMjUzMQorICogQk1fTFZNLzE1LzEgICAgIDI0MDcxOCBucyAgICAgICAyNDAwNDkgbnMgICAgICAgICAyODAxCisgKiBCTV9MVk0vMTUvMiAgICAgMjIwOTE0IG5zICAgICAgIDIyMDMwOSBucyAgICAgICAgIDMxOTEKKyAqIEJNX0xWTS8xNS8zICAgICAxMjQzMjEgbnMgICAgICAgMTIzOTc4IG5zICAgICAgICAgNTY2NAorICogQk1fTFZNLzE2LzAgICAgIDI4NTc2OSBucyAgICAgICAyODQ5NjkgbnMgICAgICAgICAyNDU5CisgKiBCTV9MVk0vMTYvMSAgICAgMjUxNjkyIG5zICAgICAgIDI1MDk4MyBucyAgICAgICAgIDI3ODkKKyAqIEJNX0xWTS8xNi8yICAgICAyMjQ1NTQgbnMgICAgICAgMjIzOTE3IG5zICAgICAgICAgMzEzMgorICogQk1fTFZNLzE2LzMgICAgIDEyMjA0OCBucyAgICAgICAxMjE3MDYgbnMgICAgICAgICA1NzUzCisgKiBCTV9MVk0vMTcvMCAgICAgMzEwMDI3IG5zICAgICAgIDMwOTE1NCBucyAgICAgICAgIDIyNjYKKyAqIEJNX0xWTS8xNy8xICAgICAyNjIwMDggbnMgICAgICAgMjYxMjU5IG5zICAgICAgICAgMjY4MQorICogQk1fTFZNLzE3LzIgICAgIDI0NzUzMCBucyAgICAgICAyNDY4MjcgbnMgICAgICAgICAyODQyCisgKiBCTV9MVk0vMTcvMyAgICAgMTI5NTEzIG5zICAgICAgIDEyOTE0NiBucyAgICAgICAgIDU0MTgKKyAqIEJNX0xWTS8xOC8wICAgICAzMjI3NTUgbnMgICAgICAgMzIxODQ0IG5zICAgICAgICAgMjE3MworICogQk1fTFZNLzE4LzEgICAgIDI2MzI2NiBucyAgICAgICAyNjI1MTQgbnMgICAgICAgICAyNjcxCisgKiBCTV9MVk0vMTgvMiAgICAgMjU3NjA2IG5zICAgICAgIDI1Njg3NSBucyAgICAgICAgIDI3MzEKKyAqIEJNX0xWTS8xOC8zICAgICAxMzY1NTAgbnMgICAgICAgMTM2MTY0IG5zICAgICAgICAgNTEyOQorICogQk1fTFZNLzE5LzAgICAgIDMzODU1MSBucyAgICAgICAzMzc1OTEgbnMgICAgICAgICAyMDY5CisgKiBCTV9MVk0vMTkvMSAgICAgMjc1OTI5IG5zICAgICAgIDI3NTEzNCBucyAgICAgICAgIDI1MzUKKyAqIEJNX0xWTS8xOS8yICAgICAyNzAzMzEgbnMgICAgICAgMjY5NTU0IG5zICAgICAgICAgMjU5NgorICogQk1fTFZNLzE5LzMgICAgIDE0NDU1MSBucyAgICAgICAxNDQxMzggbnMgICAgICAgICA0ODM4CisgKiBCTV9MVk0vMjAvMCAgICAgMzUyNjMzIG5zICAgICAgIDM1MTYxNyBucyAgICAgICAgIDE5OTMKKyAqIEJNX0xWTS8yMC8xICAgICAyODY2MDcgbnMgICAgICAgMjg1NzEzIG5zICAgICAgICAgMjM3MQorICogQk1fTFZNLzIwLzIgICAgIDI4MzU0MSBucyAgICAgICAyODI2ODkgbnMgICAgICAgICAyNDA3CisgKiBCTV9MVk0vMjAvMyAgICAgMTUyMzU1IG5zICAgICAgIDE1MTkwNCBucyAgICAgICAgIDQ2MDQKKyAqIEJNX0xWTS8yMS8wICAgICAzNzA1NTcgbnMgICAgICAgMzY5NDU2IG5zICAgICAgICAgMTg4OQorICogQk1fTFZNLzIxLzEgICAgIDI5ODI1MSBucyAgICAgICAyOTczNTEgbnMgICAgICAgICAyMzUyCisgKiBCTV9MVk0vMjEvMiAgICAgMjk2ODA2IG5zICAgICAgIDI5NTkxNyBucyAgICAgICAgIDIzNjQKKyAqIEJNX0xWTS8yMS8zICAgICAxNjAyMTIgbnMgICAgICAgMTU5NzM1IG5zICAgICAgICAgNDMzMAorICogQk1fTFZNLzIyLzAgICAgIDM4NjQzMSBucyAgICAgICAzODUyMjQgbnMgICAgICAgICAxODI2CisgKiBCTV9MVk0vMjIvMSAgICAgMzA4OTAxIG5zICAgICAgIDMwNzkyNSBucyAgICAgICAgIDIyNzMKKyAqIEJNX0xWTS8yMi8yICAgICAzMDkwNzcgbnMgICAgICAgMzA4MTQwIG5zICAgICAgICAgMjI3NAorICogQk1fTFZNLzIyLzMgICAgIDE2NzQ5MiBucyAgICAgICAxNjY5ODcgbnMgICAgICAgICA0MTk0CisgKiBCTV9MVk0vMjMvMCAgICAgNDA0NDU1IG5zICAgICAgIDQwMzIxOCBucyAgICAgICAgIDE3MjkKKyAqIEJNX0xWTS8yMy8xICAgICAzMjIwMjYgbnMgICAgICAgMzIxMDE0IG5zICAgICAgICAgMjE4NworICogQk1fTFZNLzIzLzIgICAgIDMyNjYxNiBucyAgICAgICAzMjU2MjMgbnMgICAgICAgICAyMTUyCisgKiBCTV9MVk0vMjMvMyAgICAgMTc1ODczIG5zICAgICAgIDE3NTMyOCBucyAgICAgICAgIDQwMDcKKyAqIEJNX0xWTS8yNC8wICAgICA0MTY5NDkgbnMgICAgICAgNDE1Njc2IG5zICAgICAgICAgMTY4NAorICogQk1fTFZNLzI0LzEgICAgIDMyOTgwMyBucyAgICAgICAzMjg3NzkgbnMgICAgICAgICAyMTI4CisgKiBCTV9MVk0vMjQvMiAgICAgMzM3NjQ4IG5zICAgICAgIDMzNjYyNiBucyAgICAgICAgIDIwODAKKyAqIEJNX0xWTS8yNC8zICAgICAxODMxOTIgbnMgICAgICAgMTgyNjM0IG5zICAgICAgICAgMzgyNAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIEJNX0xWTShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIGNvbnN0IHNpemVfdCBjaE1hc2sgPSBrQ2hNYXNrc1tzdGF0ZS5yYW5nZSgwKSAtIDFdOworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgdXVpZCA9IGtFZmZlY3RVdWlkc1tzdGF0ZS5yYW5nZSgxKV07CisgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaE1hc2spOworCisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4oY2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorCisgICAgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSA9IG51bGxwdHI7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZ1dWlkLCAxLCAxLCAmZWZmZWN0SGFuZGxlKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZV9lZmZlY3QgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWd7fTsKKyAgICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBrU2FtcGxlUmF0ZTsKKyAgICBjb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb21tYW5kIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNvbW1hbmQgZW5hYmxlIGNhbGwgcmV0dXJuZWQgZXJyb3IgJWRcbiIsIHJlcGx5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJ1biB0aGUgdGVzdAorICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChrRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKGlucHV0LmRhdGEoKSk7CisgICAgICAgIGJlbmNobWFyazo6RG9Ob3RPcHRpbWl6ZShvdXRwdXQuZGF0YSgpKTsKKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IGtGcmFtZUNvdW50LCAuZjMyID0gaW5wdXQuZGF0YSgpfTsKKyAgICAgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBvdXRwdXQuZGF0YSgpfTsKKyAgICAgICAgKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKworICAgICAgICBiZW5jaG1hcms6OkNsb2JiZXJNZW1vcnkoKTsKKyAgICB9CisKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBMVk1BcmdzKGJlbmNobWFyazo6aW50ZXJuYWw6OkJlbmNobWFyayogYikgeworICAgIGZvciAoaW50IGkgPSBGQ0NfMTsgaSA8PSBrTnVtQ2hNYXNrczsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX0xWTSktPkFwcGx5KExWTUFyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vYmVuY2htYXJrcy9yZXZlcmJfYmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvcmV2ZXJiX2JlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhN2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2JlbmNobWFya3MvcmV2ZXJiX2JlbmNobWFyay5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgorCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtFZmZlY3RVdWlkc1tdID0geworICAgICAgICB7MHgxNzJjZGYwMCwKKyAgICAgICAgIDB4YTNiYywKKyAgICAgICAgIDB4MTFkZiwKKyAgICAgICAgIDB4YTcyZiwKKyAgICAgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtaW5zZXJ0IG1vZGUKKyAgICAgICAgezB4ZjI5YTE0MDAsCisgICAgICAgICAweGEzYmIsCisgICAgICAgICAweDExZGYsCisgICAgICAgICAweDhkZGMsCisgICAgICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWF1eCBtb2RlCit9OworCitjb25zdGV4cHIgc2l6ZV90IGtOdW1FZmZlY3RVdWlkcyA9IHN0ZDo6c2l6ZShrRWZmZWN0VXVpZHMpOworCitjb25zdGV4cHIgc2l6ZV90IGtGcmFtZUNvdW50ID0gMjA0ODsKKworY29uc3RleHByIGludCBrUHJlc2V0c1tdID0geworICAgICAgICBSRVZFUkJfUFJFU0VUX05PTkUsICAgICAgUkVWRVJCX1BSRVNFVF9TTUFMTFJPT00sICBSRVZFUkJfUFJFU0VUX01FRElVTVJPT00sCisgICAgICAgIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NLCBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsIFJFVkVSQl9QUkVTRVRfTEFSR0VIQUxMLAorICAgICAgICBSRVZFUkJfUFJFU0VUX1BMQVRFLAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtUHJlc2V0cyA9IHN0ZDo6c2l6ZShrUHJlc2V0cyk7CisKK2NvbnN0ZXhwciBpbnQga1NhbXBsZVJhdGUgPSA0NDEwMDsKKworaW50IHJldmVyYlNldENvbmZpZ1BhcmFtKHVpbnQzMl90IHBhcmFtVHlwZSwgdWludDMyX3QgcGFyYW1WYWx1ZSwgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSkgeworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7cGFyYW1UeXBlLCBwYXJhbVZhbHVlfTsKKyAgICBhdXRvIGVmZmVjdFBhcmFtID0gKGVmZmVjdF9wYXJhbV90KiltYWxsb2Moc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgZWZmZWN0UGFyYW0tPnBzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVswXSk7CisgICAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgICAgaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSksIGVmZmVjdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiUmV2ZXJiIHNldCBjb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHJlcGx5OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSB0ZXN0IHJlc3VsdCBydW5uaW5nIG9uIFBpeGVsIDMgd2l0aCBmb3IgY29tcGFyaXNvbi4KKyAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBwcmVzZXQgbGV2ZWwgaWQuCisgKiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGVmZmVjdC4KKyAqIDA6IHByZXNldC1pbnNlcnQgbW9kZSwgMTogcHJlc2V0LWF1eCBtb2RlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmVuY2htYXJrICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgIENQVSAgIEl0ZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBCTV9SRVZFUkIvMC8wICAgICAgMTkzMTIgbnMgICAgICAgIDE5MjQ5IG5zICAgICAgICAzNjI4MgorICogQk1fUkVWRVJCLzAvMSAgICAgICA1NjEzIG5zICAgICAgICAgNTU5NiBucyAgICAgICAxMjUwMzIKKyAqIEJNX1JFVkVSQi8xLzAgICAgIDYwNTQ1MyBucyAgICAgICA2MDM3MTQgbnMgICAgICAgICAxMTMxCisgKiBCTV9SRVZFUkIvMS8xICAgICA1ODk0MjEgbnMgICAgICAgNTg3NzU4IG5zICAgICAgICAgMTE2MQorICogQk1fUkVWRVJCLzIvMCAgICAgNjA1NzYwIG5zICAgICAgIDYwNDAwNiBucyAgICAgICAgIDExMzEKKyAqIEJNX1JFVkVSQi8yLzEgICAgIDU4OTQzNCBucyAgICAgICA1ODc3NzcgbnMgICAgICAgICAxMTYxCisgKiBCTV9SRVZFUkIvMy8wICAgICA2MDU1NzQgbnMgICAgICAgNjAzODI4IG5zICAgICAgICAgMTEzMQorICogQk1fUkVWRVJCLzMvMSAgICAgNTg5NTY2IG5zICAgICAgIDU4Nzg2MiBucyAgICAgICAgIDExNjIKKyAqIEJNX1JFVkVSQi80LzAgICAgIDYwNTYzNCBucyAgICAgICA2MDM4OTQgbnMgICAgICAgICAxMTMxCisgKiBCTV9SRVZFUkIvNC8xICAgICA1ODk1MDYgbnMgICAgICAgNTg3ODU2IG5zICAgICAgICAgMTE2MQorICogQk1fUkVWRVJCLzUvMCAgICAgNjA1NjQ0IG5zICAgICAgIDYwMzkyOSBucyAgICAgICAgIDExMzEKKyAqIEJNX1JFVkVSQi81LzEgICAgIDU4OTU5MiBucyAgICAgICA1ODc4NjMgbnMgICAgICAgICAxMTYxCisgKiBCTV9SRVZFUkIvNi8wICAgICA2MTA1NDQgbnMgICAgICAgNjA4NTYxIG5zICAgICAgICAgMTEzMQorICogQk1fUkVWRVJCLzYvMSAgICAgNTg5Njg2IG5zICAgICAgIDU4Nzg3MSBucyAgICAgICAgIDExNjEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBCTV9SRVZFUkIoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBzaXplX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGNvbnN0IHNpemVfdCBwcmVzZXQgPSBrUHJlc2V0c1tzdGF0ZS5yYW5nZSgwKV07CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCB1dWlkID0ga0VmZmVjdFV1aWRzW3N0YXRlLnJhbmdlKDEpXTsKKyAgICBjb25zdCBzaXplX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7CisKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihjaE1hc2spOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGlucHV0KGtGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KGtGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKyAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKKyAgICAgICAgaW4gPSBkaXMoZ2VuKTsKKyAgICB9CisKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJnV1aWQsIDEsIDEsICZlZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZ3t9OworICAgIGNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGtTYW1wbGVSYXRlOworICAgIGNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaE1hc2s7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGludCBzdGF0dXMgPSByZXZlcmJTZXRDb25maWdQYXJhbShSRVZFUkJfUEFSQU1fUFJFU0VULCBwcmVzZXQsIGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHJldmVyYiBwcmVzZXQuIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUnVuIHRoZSB0ZXN0CisgICAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaW5wdXQuZGF0YSgpKTsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG91dHB1dC5kYXRhKCkpOworCisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0ga0ZyYW1lQ291bnQsIC5mMzIgPSBpbnB1dC5kYXRhKCl9OworICAgICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSBrRnJhbWVDb3VudCwgLmYzMiA9IG91dHB1dC5kYXRhKCl9OworICAgICAgICAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5CdWZmZXIsICZvdXRCdWZmZXIpOworCisgICAgICAgIGJlbmNobWFyazo6Q2xvYmJlck1lbW9yeSgpOworICAgIH0KKworICAgIHN0YXRlLlNldENvbXBsZXhpdHlOKHN0YXRlLnJhbmdlKDApKTsKKworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoInJlbGVhc2VfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFJFVkVSQkFyZ3MoYmVuY2htYXJrOjppbnRlcm5hbDo6QmVuY2htYXJrKiBiKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUHJlc2V0czsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bUVmZmVjdFV1aWRzOyArK2opIHsKKyAgICAgICAgICAgIGItPkFyZ3Moe2ksIGp9KTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX1JFVkVSQiktPkFwcGx5KFJFVkVSQkFyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAppbmRleCAxZjJhNWUxLi43OTk4ODc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACiAvLyBNdXNpYyBidW5kbGUKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2x2bV9saWJfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19sdm1fbGliX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibXVzaWNidW5kbGUiLAogCkBAIC05LDYgKzI4LDcgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jcHAiLAogICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAiLApAQCAtMzAsNyArNTAsNiBAQAogICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwIiwKQEAgLTQwLDU4ICs1OSwyMCBAQAogICAgICAgICAiRXEvc3JjL0xWRVFOQl9Jbml0LmNwcCIsCiAgICAgICAgICJFcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwIiwKICAgICAgICAgIkVxL3NyYy9MVkVRTkJfVGFibGVzLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0luc3RBbGxvYy5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMTYuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvbXVsdDNzXzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAiLAogICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAiLApAQCAtMTMyLDEzICsxMTMsMTQgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIgorICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgXSwKICAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItRFNVUFBPUlRfTUMiLAotCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLApAQCAtMTU2LDI3ICsxMzgsMTkgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jcHAiLAotICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAiLAogICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCIsCiAgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuY3BwIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAiLAotICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmNwcCIsCiAgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcCIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwIiwKICAgICAgICAgIkNvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwIiwKQEAgLTIwMywxMCArMTc3LDExIEBACiAgICAgICAgICJSZXZlcmIvbGliIiwKICAgICAgICAgIkNvbW1vbi9saWIiLAogICAgIF0sCi0KKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKICAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0KICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDk0OGQ3OWMuLmU2MGFkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC02OSwxNSArNjksMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWREJFX05SX01FTU9SWV9SRUdJT05TICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwotCiAvKiBCYXNzIEVuaGFuY2VtZW50IGVmZmVjdCBsZXZlbCAqLwotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDNEQiAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgICAgICAgICAgICA2Ci0jZGVmaW5lIExWREJFX0VGRkVDVF8wOURCICAgICAgICAgICAgOQotI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAgICAgICAgICAgIDEyCi0jZGVmaW5lIExWREJFX0VGRkVDVF8xNURCICAgICAgICAgICAgMTUKKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzAzREIgMyAvKiBFZmZlY3QgZGVmaW5lcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgTFZEQkVfRUZGRUNUXzA2REIgNgorI2RlZmluZSBMVkRCRV9FRkZFQ1RfMDlEQiA5CisjZGVmaW5lIExWREJFX0VGRkVDVF8xMkRCIDEyCisjZGVmaW5lIExWREJFX0VGRkVDVF8xNURCIDE1CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04Niw1MiArODMsMzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAgICAqTFZEQkVfSGFuZGxlX3Q7Cit0eXBlZGVmIHZvaWQqIExWREJFX0hhbmRsZV90OwogCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWREJFX09GRiAgICAgID0gMCwKLSAgICBMVkRCRV9PTiAgICAgICA9IDEsCi0gICAgTFZEQkVfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCi19IExWREJFX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVkRCRV9PRkYgPSAwLCBMVkRCRV9PTiA9IDEsIExWREJFX01PREVfTUFYID0gTFZNX01BWElOVF8zMiB9IExWREJFX01vZGVfZW47CiAKIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkRCRV9IUEZfT0ZGID0gMCwKLSAgICBMVkRCRV9IUEZfT04gID0gMSwKKyAgICBMVkRCRV9IUEZfT04gPSAxLAogICAgIExWREJFX0hQRl9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZpbHRlclNlbGVjdF9lbjsKIAogLyogVm9sdW1lIGNvbnRyb2wgKi8KLXR5cGVkZWYgZW51bQotewordHlwZWRlZiBlbnVtIHsKICAgICBMVkRCRV9WT0xVTUVfT0ZGID0gMCwKLSAgICBMVkRCRV9WT0xVTUVfT04gID0gMSwKKyAgICBMVkRCRV9WT0xVTUVfT04gPSAxLAogICAgIExWREJFX1ZPTFVNRV9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX1ZvbHVtZV9lbjsKIAotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkRCRV9QRVJTSVNURU5UICAgICAgPSAwLAotICAgIExWREJFX1BFUlNJU1RFTlRfREFUQSA9IDEsCi0gICAgTFZEQkVfUEVSU0lTVEVOVF9DT0VGID0gMiwKLSAgICBMVkRCRV9TQ1JBVENIICAgICAgICAgPSAzLAotICAgIExWREJFX01FTU9SWV9NQVggICAgICA9IExWTV9NQVhJTlRfMzIKLQotfSBMVkRCRV9NZW1vcnlUeXBlc19lbjsKLQogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZEQkVfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgTFZEQkVfQUxJR05NRU5URVJST1IgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSBhbGlnbm1lbnQgZXJyb3IgKi8KLSAgICBMVkRCRV9OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCi0gICAgTFZEQkVfU0laRUVSUk9SICAgICAgPSA0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29ycmVjdCBzdHJ1Y3R1cmUgc2l6ZSAqLwotICAgIExWREJFX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgordHlwZWRlZiBlbnVtIHsKKyAgICBMVkRCRV9TVUNDRVNTID0gMCwgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZEQkVfTlVMTEFERFJFU1MgPSAxLCAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWREJFX1RPT01BTllTQU1QTEVTID0gMiwgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZEQkVfU1RBVFVTX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfUmV0dXJuU3RhdHVzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE1OCw0MCArMTM0LDM4IEBACiAvKgogICogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5CiAgKi8KLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV81NUh6ICAgICAgIDEKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6ICAgICAgIDIKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV83OEh6ICAgICAgIDQKLSNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV85MEh6ICAgICAgIDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IDQKKyNkZWZpbmUgTFZEQkVfQ0FQX0NFTlRSRV85MEh6IDgKIAotdHlwZWRlZiBlbnVtCi17Cit0eXBlZGVmIGVudW0gewogICAgIExWREJFX0NFTlRSRV81NUhaID0gMCwKICAgICBMVkRCRV9DRU5UUkVfNjZIWiA9IDEsCiAgICAgTFZEQkVfQ0VOVFJFXzc4SFogPSAyLAogICAgIExWREJFX0NFTlRSRV85MEhaID0gMywKLSAgICBMVkRCRV9DRU5UUkVfTUFYICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkRCRV9DRU5UUkVfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9DZW50cmVGcmVxX2VuOwogCiAvKgogICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKICAqLwotI2RlZmluZSBMVkRCRV9DQVBfRlNfODAwMCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExWREJFX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwICAgICAgICAgICAgICAgNAotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTYwMDAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIExWREJFX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAotI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDEwMjQKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgMjA0OAotI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIExWREJFX0NBUF9GU184MDAwIDEKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzExMDI1IDIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzEyMDAwIDQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE2MDAwIDgKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzIyMDUwIDE2CisjZGVmaW5lIExWREJFX0NBUF9GU18yNDAwMCAzMgorI2RlZmluZSBMVkRCRV9DQVBfRlNfMzIwMDAgNjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzQ0MTAwIDEyOAorI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgMjU2CisjZGVmaW5lIExWREJFX0NBUF9GU184ODIwMCA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgNDA5NgogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkRCRV9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWREJFX0ZTXzgwMDAgPSAwLAogICAgIExWREJFX0ZTXzExMDI1ID0gMSwKICAgICBMVkRCRV9GU18xMjAwMCA9IDIsCiAgICAgTFZEQkVfRlNfMTYwMDAgPSAzLApAQCAtMjA0LDcgKzE3OCw3IEBACiAgICAgTFZEQkVfRlNfOTYwMDAgPSAxMCwKICAgICBMVkRCRV9GU18xNzY0MDAgPSAxMSwKICAgICBMVkRCRV9GU18xOTIwMDAgPSAxMiwKLSAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkRCRV9GU19NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0ZzX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxMyw0NCArMTg3LDI1IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIGFsaWdubWVudCBpbiBieXRlcyAqLwotICAgIExWREJFX01lbW9yeVR5cGVzX2VuICAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwotfSBMVkRCRV9NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkRCRV9NZW1vcnlSZWdpb25fdCAgICBSZWdpb25bTFZEQkVfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWREJFX01lbVRhYl90OwotCiAvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWREJFX01vZGVfZW4gICAgICAgICAgIE9wZXJhdGluZ01vZGU7Ci0gICAgTFZEQkVfRnNfZW4gICAgICAgICAgICAgU2FtcGxlUmF0ZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsKLSAgICBMVkRCRV9DZW50cmVGcmVxX2VuICAgICBDZW50cmVGcmVxdWVuY3k7Ci0gICAgTFZEQkVfRmlsdGVyU2VsZWN0X2VuICAgSFBGU2VsZWN0OwotICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWREJFX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsKKyAgICBMVkRCRV9Gc19lbiBTYW1wbGVSYXRlOworICAgIExWTV9JTlQxNiBFZmZlY3RMZXZlbDsKKyAgICBMVkRCRV9DZW50cmVGcmVxX2VuIENlbnRyZUZyZXF1ZW5jeTsKKyAgICBMVkRCRV9GaWx0ZXJTZWxlY3RfZW4gSFBGU2VsZWN0OworICAgIExWREJFX1ZvbHVtZV9lbiBWb2x1bWVDb250cm9sOworICAgIExWTV9JTlQxNiBWb2x1bWVkQjsKKyAgICBMVk1fSU5UMTYgSGVhZHJvb21kQjsKKyAgICBMVk1fSU5UMTYgTnJDaGFubmVsczsKIAogfSBMVkRCRV9QYXJhbXNfdDsKIAogLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgY2FwYWJpbGl0aWVzICovCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBDZW50cmVGcmVxdWVuY3k7ICAgICAgICAgIC8qIENlbnRyZSBmcmVxdWVuY3kgY2FwYWJpbGl0aWVzICovCi0gICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fVUlOVDE2IFNhbXBsZVJhdGU7ICAgICAgLyogU2FtcGxpbmcgcmF0ZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVk1fVUlOVDE2IENlbnRyZUZyZXF1ZW5jeTsgLyogQ2VudHJlIGZyZXF1ZW5jeSBjYXBhYmlsaXRpZXMgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgICAgLyogTWF4aW11bSBibG9jayBzaXplIGluIHNhbXBsZSBwYWlycyAqLwogfSBMVkRCRV9DYXBhYmlsaXRpZXNfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjEsNzUgKzIxNiwzOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCi0vKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCi0vKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBMVkRCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICovCi0vKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCi0vKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWREJFX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpOwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZEQkVfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkRCRV9EZUluaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUxLDggKzI3MCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzc0LDggKzI5Miw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRDYXBhYmlsaXRpZXMoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MTQsOCArMzMyLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQzNyw5ICszNTQsNyBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAogI2VuZGlmIC8qIF9fTFZEQkVfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKaW5kZXggYjM2NGRhZS4uMzBlMTY5MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaApAQCAtMjQsNyArMjQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZEQkVfU0NBTEVTSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgMTAgLyogQXMgYSBwb3dlciBvZiAyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzIsMjg5ICszMiwyODkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTg4NDlmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS45MTc2OThmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk1ODg0OWYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzOTAwMWYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwODA3ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk2NjkwOWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkzMzgxOGYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY2OTA5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU1NzMyZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTY2OTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTY4NjUwZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM3MzAwZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Njg2NTBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTkzMjdmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk2MDEzOGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzM1ODhmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDcxNzZmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzU4OGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTQ5NGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTY5OTUyZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzY3MWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1NTM0M2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc3NjcxZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc3ODYzZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzgxMDVmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTUxZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU3MTAyZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45Nzg1NTFmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk2NjJmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTg2NmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODEwNDJmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjIwODRmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MTA0MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NDc0NmYpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0ODYxZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MzA5N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2NjE5NGYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzMDk3ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg4OTMxZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODg5OTJmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgzNTM5ZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY3MDc5ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODM1MzlmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODk4MzFmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKKy8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9BMCAwLjk1ODg0OWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0ExICgtMS45MTc2OThmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgMC45NTg4NDlmCisjZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAoLTEuOTM5MDAxZikKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0IyIDAuOTQwODA3ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EwIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICgtMS45MzM4MThmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyIDAuOTY2OTA5ZgorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IxICgtMS45NTU3MzJmKQorI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0IyIDAuOTU2NjkwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EwIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICgtMS45MzczMDBmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyIDAuOTY4NjUwZgorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IxICgtMS45NTkzMjdmKQorI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0IyIDAuOTYwMTM4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EwIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICgtMS45NDcxNzZmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyIDAuOTczNTg4ZgorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IxICgtMS45Njk0OTRmKQorI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0IyIDAuOTY5OTUyZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EwIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICgtMS45NTUzNDNmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyIDAuOTc3NjcxZgorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IxICgtMS45Nzc4NjNmKQorI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0IyIDAuOTc4MTA1ZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EwIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICgtMS45NTcxMDJmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyIDAuOTc4NTUxZgorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IxICgtMS45Nzk2NjJmKQorI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0IyIDAuOTc5ODY2ZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EwIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICgtMS45NjIwODRmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyIDAuOTgxMDQyZgorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IxICgtMS45ODQ3NDZmKQorI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0IyIDAuOTg0ODYxZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EwIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICgtMS45NjYxOTRmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyIDAuOTgzMDk3ZgorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IxICgtMS45ODg5MzFmKQorI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0IyIDAuOTg4OTkyZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EwIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICgtMS45NjcwNzlmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyIDAuOTgzNTM5ZgorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IxICgtMS45ODk4MzFmKQorI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyIDAuOTg5ODgyZgogCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNjM2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ0NjZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDQ4MWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMCAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAoLTEuOTcxNjM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMSAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAwLjk5NDQ4MWYKIAotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjA4MGYpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0OTE1ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTAgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgKC0xLjk3MjA4MGYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgMC45ODYwNDBmCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjEgKC0xLjk5NDkxNWYpCisjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgMC45OTQ5MjhmCiAKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQzNjZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzIzM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjM3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMCAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTEgKC0xLjk3NDM2NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EyIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMSAoLTEuOTk3MjMzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjIgMC45OTcyMzdmCiAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQ1ODhmKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzQ1OGYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3NDYxZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAwLjk4NzI5NGYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgKC0xLjk3NDU4OGYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyIDAuOTg3Mjk0ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAoLTEuOTk3NDU4ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgMC45OTc0NjFmCiAKLSAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAwLjk1MzAxNmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkwNjAzMmYpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTUzMDE2ZgotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI2ODEwZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMC45MjkzOTZmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYyNjM4ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI1Mjc1ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjI2MzhmCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDY4ODFmKQotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0ODI1NmYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjQ3MThmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Mjk0MzVmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NDcxOGYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MTE5NmYpCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTUyMzU5ZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MDYyMmYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0MTI0NGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTcwNjIyZgotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYzMzk0ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjQwNTJmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1NTA5ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUxMDE5ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzU1MDlmCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM0MzZmKQotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3Mzc4NGYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NzY1NjNmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMxMjVmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NjU2M2YKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTU5NGYpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc1ODg5ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3OTU0N2YKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1OTA5M2YpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc5NTQ3ZgotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgxNjk1ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE4NjFmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgyMDEwZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY0MDE5ZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODIwMTBmCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MThmKQotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjgwNWYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODI1NDBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjUwNzlmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4MjU0MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Nzc5N2YpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg3ODcxZgorLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwIDAuOTUzMDE2ZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQTEgKC0xLjkwNjAzMmYpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMiAwLjk1MzAxNmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0IxICgtMS45MjY4MTBmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgMC45MjkzOTZmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTEgKC0xLjkyNTI3NWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTIgMC45NjI2MzhmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjEgKC0xLjk0Njg4MWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQjIgMC45NDgyNTZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTEgKC0xLjkyOTQzNWYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTIgMC45NjQ3MThmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjEgKC0xLjk1MTE5NmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQjIgMC45NTIzNTlmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTAgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTEgKC0xLjk0MTI0NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTIgMC45NzA2MjJmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjEgKC0xLjk2MzM5NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQjIgMC45NjQwNTJmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTEgKC0xLjk1MTAxOWYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTIgMC45NzU1MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjEgKC0xLjk3MzQzNmYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQjIgMC45NzM3ODRmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTEgKC0xLjk1MzEyNWYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTIgMC45NzY1NjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjEgKC0xLjk3NTU5NGYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQjIgMC45NzU4ODlmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTAgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTEgKC0xLjk1OTA5M2YpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTIgMC45Nzk1NDdmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjEgKC0xLjk4MTY5NWYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQjIgMC45ODE4NjFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTEgKC0xLjk2NDAxOWYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTIgMC45ODIwMTBmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjEgKC0xLjk4NjcxOGYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQjIgMC45ODY4MDVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTEgKC0xLjk2NTA3OWYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTIgMC45ODI1NDBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjEgKC0xLjk4Nzc5N2YpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQjIgMC45ODc4NzFmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EwIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0ExICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IxICgtMS45OTMzNTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IyIDAuOTkzMzgxZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMCAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMSAoLTEuOTcxMDc3ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAwLjk4NTUzOWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAoLTEuOTkzODk4ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMiAwLjk5MzkxN2YKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EwIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMSAoLTEuOTczODIwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTIgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IxICgtMS45OTY2NzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMiAwLjk5NjY4NWYKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDA4NmYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2OTQ5ZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY5NTRmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EwIDAuOTg3MDQzZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMSAoLTEuOTc0MDg2ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTIgMC45ODcwNDNmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IxICgtMS45OTY5NDlmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9CMiAwLjk5Njk1NGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NDY2OTNmCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMS44OTMzODdmKQotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjk0NjY5M2YKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxMzUxN2YpCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTE3MTA1ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk1Nzk5OWYKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjkxNTk5OGYpCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3OTk5ZgotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTM3MjI5ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45MzkxNDBmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTYwNDQ2ZgotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTIwODkyZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjA0NDZmCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NDIzMjZmKQotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk0Mzk0NGYKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45NjczOTdmCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45MzQ3OTRmKQotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk2NzM5N2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1Njc0MGYpCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3NjU2ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk3MzE1NmYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0NjMxM2YpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTczMTU2ZgotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4NjA3ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NjkwOTJmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc0Mzk4ZgotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ4Nzk3ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45NzQzOThmCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzExNTdmKQotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk3MTU2OGYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45Nzc5MThmCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTU4MzZmKQotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk3NzkxOGYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3ODM2N2YpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTc4NTk5ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4MDgyNGYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2MTY0OWYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgwODI0ZgotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg0MzAzZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MjVmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxNDUwZgotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYyOTAwZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODE0NTBmCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODU1NzhmKQotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTY4MWYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0EwIDAuOTQ2NjkzZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTEgKC0xLjg5MzM4N2YpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAwLjk0NjY5M2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICgtMS45MTM1MTdmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQjIgMC45MTcxMDVmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTAgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgKC0xLjkxNTk5OGYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgMC45NTc5OTlmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjEgKC0xLjkzNzIyOWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQjIgMC45MzkxNDBmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTAgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgKC0xLjkyMDg5MmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgMC45NjA0NDZmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjEgKC0xLjk0MjMyNmYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQjIgMC45NDM5NDRmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTAgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgKC0xLjkzNDc5NGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgMC45NjczOTdmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjEgKC0xLjk1Njc0MGYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQjIgMC45NTc2NTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTAgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgKC0xLjk0NjMxM2YpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgMC45NzMxNTZmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjEgKC0xLjk2ODYwN2YpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQjIgMC45NjkwOTJmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTAgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgKC0xLjk0ODc5N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgMC45NzQzOThmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjEgKC0xLjk3MTE1N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQjIgMC45NzE1NjhmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTAgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgKC0xLjk1NTgzNmYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgMC45Nzc5MThmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjEgKC0xLjk3ODM2N2YpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQjIgMC45Nzg1OTlmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTAgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgKC0xLjk2MTY0OWYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgMC45ODA4MjRmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjEgKC0xLjk4NDMwM2YpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQjIgMC45ODQ0MjVmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTAgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgKC0xLjk2MjkwMGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgMC45ODE0NTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjEgKC0xLjk4NTU3OGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgMC45ODU2ODFmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjkzNTZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjE1MWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTgyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EwIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICgtMS45NjkzNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IxICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyIDAuOTkyMTgyZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5OTg0ZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI3ODlmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgxNWYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMCAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAoLTEuOTY5OTg0ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAwLjk4NDk5MmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMSAoLTEuOTkyNzg5ZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAwLjk5MjgxNWYKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzIyNGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MDc2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYwODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EwIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMSAoLTEuOTczMjI0ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTIgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IxICgtMS45OTYwNzZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMiAwLjk5NjA4M2YKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzUzOWYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Mzk0ZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY0MDFmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwIDAuOTg2NzY5ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAoLTEuOTczNTM5ZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgMC45ODY3NjlmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICgtMS45OTYzOTRmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMiAwLjk5NjQwMWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuODgwODI1ZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk0MDQxMmYKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTAwMjMxZikKLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjkwNDk3N2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTA2NzY2ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MzM4M2YKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI3NTc5ZikKLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzMDExMWYKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTEyMzg3ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk1NjE5M2YKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTMzNDU5ZikKLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjkzNTYwM2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTI4MzY1ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDE4M2YKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUwMDg3ZikKLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk1MTMwM2YKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQxNjE4ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MDgwOWYKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYzNzc4ZikKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NDQyM2YKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTQ0NDc3ZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3MjIzOWYKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY2NzIxZikKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk2NzI2NmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTUyNTg0ZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NjI5MmYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc1MDQwZikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk3NTM0N2YKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTU5MjgyZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk3OTY0MWYKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgxODg4ZikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MjA1MGYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTYwNzI0ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MDM2MmYKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgzMzU5ZikKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwIDAuOTQwNDEyZgorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTEgKC0xLjg4MDgyNWYpCisjZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9BMiAwLjk0MDQxMmYKKyNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0IxICgtMS45MDAyMzFmKQorI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQjIgMC45MDQ5NzdmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTAgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTEgKC0xLjkwNjc2NmYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQTIgMC45NTMzODNmCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgKC0xLjkyNzU3OWYpCisjZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgMC45MzAxMTFmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTAgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTEgKC0xLjkxMjM4N2YpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQTIgMC45NTYxOTNmCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgKC0xLjkzMzQ1OWYpCisjZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgMC45MzU2MDNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTAgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTEgKC0xLjkyODM2NWYpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQTIgMC45NjQxODNmCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgKC0xLjk1MDA4N2YpCisjZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgMC45NTEzMDNmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTAgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTEgKC0xLjk0MTYxOGYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQTIgMC45NzA4MDlmCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgKC0xLjk2Mzc3OGYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgMC45NjQ0MjNmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTAgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTEgKC0xLjk0NDQ3N2YpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQTIgMC45NzIyMzlmCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgKC0xLjk2NjcyMWYpCisjZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgMC45NjcyNjZmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTAgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTEgKC0xLjk1MjU4NGYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQTIgMC45NzYyOTJmCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgKC0xLjk3NTA0MGYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgMC45NzUzNDdmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTAgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTEgKC0xLjk1OTI4MmYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQTIgMC45Nzk2NDFmCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgKC0xLjk4MTg4OGYpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgMC45ODIwNTBmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTAgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTEgKC0xLjk2MDcyNGYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQTIgMC45ODAzNjJmCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgKC0xLjk4MzM1OWYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgMC45ODM0OTdmCiAKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjgxNjhmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDk0NGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkwOTg1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0ExICgtMS45NjgxNjhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICgtMS45OTA5NDRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IyIDAuOTkwOTg1ZgogCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4ODkyZikKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTE2ODBmKQotI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMSAoLTEuOTY4ODkyZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAwLjk4NDQ0NmYKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAoLTEuOTkxNjgwZikKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMiAwLjk5MTcxNGYKIAotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjYyOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NDcyZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU0ODJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAwLjk5NTQ4MmYKIAotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgotI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1ODQwZikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EwIDAuOTg2NDk2ZgorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMSAoLTEuOTcyOTkyZikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTIgMC45ODY0OTZmCisjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0IxICgtMS45OTU4NDBmKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMiAwLjk5NTg0OGYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMjMsMjg4ICszMjMsMjg4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNTVIeiAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MTk3ZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDkxOTdmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Nzk1NDVmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzkzZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2NjkxZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDY2OTFmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODU0ODhmKQotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDY0ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MTUwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDYxNTBmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45ODY3MzNmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3NTU3ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NjIwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQ2MjBmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTAxODlmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjUzZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMzU3ZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMzNTdmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI5NjRmKQotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMjA5ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAzMDg1ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMwODVmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM1NTJmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTkzNzU5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMzE1ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIzMTVmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTUxOTlmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzE2ZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjgxZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE2ODFmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY1MzdmKQotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2NTk5ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxNTQ1ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE1NDVmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY4MjNmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTAgMC4wMDkxOTdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0EyICgtMC4wMDkxOTdmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgKC0xLjk3OTU0NWYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9CMiAwLjk4MTM5M2YKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMCAwLjAwNjY5MWYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMiAoLTAuMDA2NjkxZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMSAoLTEuOTg1NDg4ZikKKyNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9CMiAwLjk4NjQ2NGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMCAwLjAwNjE1MGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMiAoLTAuMDA2MTUwZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMSAoLTEuOTg2NzMzZikKKyNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9CMiAwLjk4NzU1N2YKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMCAwLjAwNDYyMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMiAoLTAuMDA0NjIwZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMSAoLTEuOTkwMTg5ZikKKyNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9CMiAwLjk5MDY1M2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMCAwLjAwMzM1N2YKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMiAoLTAuMDAzMzU3ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMSAoLTEuOTkyOTY0ZikKKyNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9CMiAwLjk5MzIwOWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMCAwLjAwMzA4NWYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMiAoLTAuMDAzMDg1ZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMSAoLTEuOTkzNTUyZikKKyNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9CMiAwLjk5Mzc1OWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMCAwLjAwMjMxNWYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMiAoLTAuMDAyMzE1ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMSAoLTEuOTk1MTk5ZikKKyNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9CMiAwLjk5NTMxNmYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMCAwLjAwMTY4MWYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMiAoLTAuMDAxNjgxZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMSAoLTEuOTk2NTM3ZikKKyNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9CMiAwLjk5NjU5OWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMCAwLjAwMTU0NWYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMiAoLTAuMDAxNTQ1ZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMSAoLTEuOTk2ODIzZikKKyNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9CMiAwLjk5Njg3NWYKIAotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwODMxZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA4MzFmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTgzMjFmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MzM4ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EwIDAuMDAwODMxZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0EyICgtMC4wMDA4MzFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IxICgtMS45OTgzMjFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzU1X0IyIDAuOTk4MzM4ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA3NjJmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDc2MmYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQ2MWYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTg0NzdmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTAgMC4wMDA3NjJmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQTIgKC0wLjAwMDc2MmYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjEgKC0xLjk5ODQ2MWYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNTVfQjIgMC45OTg0NzdmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDQxNmYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNDE2ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk5MTY0ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5OTE2OWYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQTAgMC4wMDA0MTZmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAoLTAuMDAwNDE2ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNTVfQjEgKC0xLjk5OTE2NGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IyIDAuOTk5MTY5ZgogCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTIzNGYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkyMzhmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwIDAuMDAwMzgxZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgKC0wLjAwMDM4MWYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICgtMS45OTkyMzRmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM1NV9CMiAwLjk5OTIzOGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNjQ4ZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDEyNjQ4ZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NzE3NjBmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzQ0MTJmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwOTIwOWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwOTIwOWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTc5OTY2ZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTgxMzY4ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDg0NjhmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDg0NjhmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MTY4NWYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4Mjg2OWYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA2MzY0ZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA2MzY0ZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODY0NTdmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODcxMjRmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNDYyNmYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDYyNmYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwMjg4ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkwNjQxZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDQyNTJmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDQyNTJmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTEwMGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MTM5OGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAzMTkyZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAzMTkyZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTMzNzRmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTM1NDFmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMjMxOGYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjMxOGYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1MjIxZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk1MzA5ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDIxMzFmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIxMzFmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTYxNWYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwIDAuMDEyNjQ4ZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMiAoLTAuMDEyNjQ4ZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICgtMS45NzE3NjBmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQjIgMC45NzQ0MTJmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTAgMC4wMDkyMDlmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTIgKC0wLjAwOTIwOWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjEgKC0xLjk3OTk2NmYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQjIgMC45ODEzNjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTAgMC4wMDg0NjhmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTIgKC0wLjAwODQ2OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjEgKC0xLjk4MTY4NWYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQjIgMC45ODI4NjlmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTAgMC4wMDYzNjRmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTIgKC0wLjAwNjM2NGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjEgKC0xLjk4NjQ1N2YpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQjIgMC45ODcxMjRmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTAgMC4wMDQ2MjZmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTIgKC0wLjAwNDYyNmYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjEgKC0xLjk5MDI4OGYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQjIgMC45OTA2NDFmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTAgMC4wMDQyNTJmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTIgKC0wLjAwNDI1MmYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjEgKC0xLjk5MTEwMGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQjIgMC45OTEzOThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTAgMC4wMDMxOTJmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTIgKC0wLjAwMzE5MmYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjEgKC0xLjk5MzM3NGYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQjIgMC45OTM1NDFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTAgMC4wMDIzMThmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTIgKC0wLjAwMjMxOGYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjEgKC0xLjk5NTIyMWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQjIgMC45OTUzMDlmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTAgMC4wMDIxMzFmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTIgKC0wLjAwMjEzMWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjEgKC0xLjk5NTYxNWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgMC45OTU2OTBmCiAKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTAgMC4wMDExNDZmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgKC0wLjAwMTE0NmYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjEgKC0xLjk5NzY4NGYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjIgMC45OTc3MDhmCiAKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTAgMC4wMDEwNTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgKC0wLjAwMTA1NWYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjEgKC0xLjk5Nzg2OGYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgMC45OTc4OTFmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EwIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTIgKC0wLjAwMDU3M2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IxICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAwLjk5ODg1M2YKIAotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDUyOGYpCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICgtMS45OTg5MzlmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg5NDVmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EwIDAuMDAwNTI4ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgKC0wLjAwMDUyOGYpCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0IxICgtMS45OTg5MzlmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMiAwLjk5ODk0NWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDE4NTcyZgotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDE4NTcyZikKLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45NTg3NDVmKQotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjI0MjdmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxMzU0NWYKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMzU0NWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTcwNjQ3ZikKLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTcyNTk2ZgotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTI0NThmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMTI0NThmKQotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzE0OGYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk3NDc5NWYKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA5MzczZgotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA5MzczZikKLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45ODAxMDhmKQotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45ODEwMzdmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwNjgxOWYKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNjgxOWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTg1NzE0ZikKLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTg2MjA0ZgotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDYyNjhmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDYyNjhmKQotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NjkwNGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk4NzMxOGYKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA0NzA5ZgotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDA0NzA5ZikKLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTAyNDBmKQotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTA0NzNmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMzQyMWYKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzQyMWYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyOTU1ZikKLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzMDc4ZgotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDMxNDRmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDMxNDRmKQotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzUzNWYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5MzYzOWYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwIDAuMDE4NTcyZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAoLTAuMDE4NTcyZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0IxICgtMS45NTg3NDVmKQorI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQjIgMC45NjI0MjdmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTAgMC4wMTM1NDVmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgKC0wLjAxMzU0NWYpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgKC0xLjk3MDY0N2YpCisjZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgMC45NzI1OTZmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTAgMC4wMTI0NThmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgKC0wLjAxMjQ1OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgKC0xLjk3MzE0OGYpCisjZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgMC45NzQ3OTVmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTAgMC4wMDkzNzNmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgKC0wLjAwOTM3M2YpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgKC0xLjk4MDEwOGYpCisjZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgMC45ODEwMzdmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTAgMC4wMDY4MTlmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgKC0wLjAwNjgxOWYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgKC0xLjk4NTcxNGYpCisjZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgMC45ODYyMDRmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTAgMC4wMDYyNjhmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgKC0wLjAwNjI2OGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgKC0xLjk4NjkwNGYpCisjZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgMC45ODczMThmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTAgMC4wMDQ3MDlmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgKC0wLjAwNDcwOWYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgKC0xLjk5MDI0MGYpCisjZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgMC45OTA0NzNmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTAgMC4wMDM0MjFmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgKC0wLjAwMzQyMWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgKC0xLjk5Mjk1NWYpCisjZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgMC45OTMwNzhmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTAgMC4wMDMxNDRmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgKC0wLjAwMzE0NGYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgKC0xLjk5MzUzNWYpCisjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgMC45OTM2MzlmCiAKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDE2OTNmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNjkzZikKLSNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjU4MmYpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk2NjE1ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EwIDAuMDAxNjkzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0EyICgtMC4wMDE2OTNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IxICgtMS45OTY1ODJmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyIDAuOTk2NjE1ZgogCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTU1NWYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAxNTU1NWYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY4NjBmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTY4OTFmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTAgMC4wMDE1NTVmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTIgKC0wLjAwMTU1NTVmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICgtMS45OTY4NjBmKQorI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IyIDAuOTk2ODkxZgogCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDg0N2YKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDg0N2YpCi0jZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4Mjk4ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4MzA2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMCAwLjAwMDg0N2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EyICgtMC4wMDA4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9CMSAoLTEuOTk4Mjk4ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgMC45OTgzMDZmCiAKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzc4ZgotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NzhmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDM3ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4NDQ0ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMCAwLjAwMDc3OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EyICgtMC4wMDA3NzhmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9CMSAoLTEuOTk4NDM3ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjIgMC45OTg0NDRmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI3NjBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyMjc2MGYpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk0OTA3M2YpCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45NTM5NTNmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY2MTlmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjYxOWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Mzc5MWYpCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjYzNzdmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTUyODlmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxNTI4OWYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2Njg4MmYpCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NjkwNjdmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMTE1MTFmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAxMTUxMWYpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NTQ3N2YpCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45NzY3MTFmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgzNzlmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwODM3OWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4MjM5NWYpCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODMwNDdmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDc3MDRmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNzcwNGYpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Mzg2M2YpCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0MTRmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDU3ODlmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNTc4OWYpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4Nzk3N2YpCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODgyODhmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQyMDdmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwNDIwN2YpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTMyNGYpCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTE0ODhmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM4NjdmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMzg2N2YpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjAzOGYpCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAwLjAyMjc2MGYKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgKC0wLjAyMjc2MGYpCisjZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9CMSAoLTEuOTQ5MDczZikKKyNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0IyIDAuOTUzOTUzZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EwIDAuMDE2NjE5ZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICgtMC4wMTY2MTlmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICgtMS45NjM3OTFmKQorI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyIDAuOTY2Mzc3ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EwIDAuMDE1Mjg5ZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICgtMC4wMTUyODlmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICgtMS45NjY4ODJmKQorI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyIDAuOTY5MDY3ZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EwIDAuMDExNTExZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICgtMC4wMTE1MTFmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICgtMS45NzU0NzdmKQorI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyIDAuOTc2NzExZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EwIDAuMDA4Mzc5ZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICgtMC4wMDgzNzlmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICgtMS45ODIzOTVmKQorI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyIDAuOTgzMDQ3ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EwIDAuMDA3NzA0ZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICgtMC4wMDc3MDRmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICgtMS45ODM4NjNmKQorI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyIDAuOTg0NDE0ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EwIDAuMDA1Nzg5ZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICgtMC4wMDU3ODlmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICgtMS45ODc5NzdmKQorI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyIDAuOTg4Mjg4ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EwIDAuMDA0MjA3ZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICgtMC4wMDQyMDdmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICgtMS45OTEzMjRmKQorI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyIDAuOTkxNDg4ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EwIDAuMDAzODY3ZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICgtMC4wMDM4NjdmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICgtMS45OTIwMzhmKQorI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyIDAuOTkyMTc3ZgogCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIwODNmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMjA4M2YpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NTc5MWYpCi0jZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4MzVmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTAgMC4wMDIwODNmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQTIgKC0wLjAwMjA4M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjEgKC0xLjk5NTc5MWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjOTBfQjIgMC45OTU4MzVmCiAKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMTkxM2YKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDE5MTNmKQotI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjEzNGYpCi0jZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYxNzRmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgMC4wMDE5MTNmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgKC0wLjAwMTkxM2YpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgKC0xLjk5NjEzNGYpCisjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjIgMC45OTYxNzRmCiAKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMTA0MmYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDQyZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3OTA0ZikKLSNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzkxNWYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQTAgMC4wMDEwNDJmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAoLTAuMDAxMDQyZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjOTBfQjEgKC0xLjk5NzkwNGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IyIDAuOTk3OTE1ZgogCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKLSNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgwNzVmKQotI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDg1ZgorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9BMCAwLjAwMDk1OGYKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICgtMC4wMDA5NThmKQorI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMSAoLTEuOTk4MDc1ZikKKyNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjIgMC45OTgwODVmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjEzLDc0ICs2MTMsNzQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEFHQyBUaW1lIGNvbnN0YW50cyAqLwotI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44NDEzOTVmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg4MjIyM2YKLSNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMjUxZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45MTcyNzZmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjkzOTI2N2YKLSNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ0MDYxZgotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45NTc3NDVmCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTE1OGYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAwLjg0MTM5NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczExMDI1IDAuODgyMjIzZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTIwMDAgMC44OTEyNTFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNjAwMCAwLjkxNzI3NmYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczIyMDUwIDAuOTM5MjY3ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzMjQwMDAgMC45NDQwNjFmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMzMjAwMCAwLjk1Nzc0NWYKKyNkZWZpbmUgQUdDX0FUVEFDS19GczQ0MTAwIDAuOTY5MTU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzNDgwMDAgMC45NzE2MjhmCiAKLSNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ1OGYKLSNkZWZpbmUgQUdDX0FUVEFDS19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTcxMmYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE5OWYKLSNkZWZpbmUgQUdDX0FUVEFDS19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgzMGYKKyNkZWZpbmUgQUdDX0FUVEFDS19Gczg4MjAwIDAuOTg0NDU4ZgorI2RlZmluZSBBR0NfQVRUQUNLX0ZzOTYwMDAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgMC45OTIxOTlmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgMC45OTI4MzBmCiAKLSNkZWZpbmUgREVDQVlfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFQ0FZX1NISUZUIDEwCiAKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDQyZgotI2RlZmluZSBBR0NfREVDQVlfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzBmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAyOGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDIxZgotI2RlZmluZSBBR0NfREVDQVlfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTVmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxNGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEwZgotI2RlZmluZSBBR0NfREVDQVlfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwN2YKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODAwMCAwLjAwMDA0MmYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTEwMjUgMC4wMDAwMzBmCisjZGVmaW5lIEFHQ19ERUNBWV9GczEyMDAwIDAuMDAwMDI4ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNjAwMCAwLjAwMDAyMWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjIwNTAgMC4wMDAwMTVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczI0MDAwIDAuMDAwMDE0ZgorI2RlZmluZSBBR0NfREVDQVlfRnMzMjAwMCAwLjAwMDAxMGYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDQxMDAgMC4wMDAwMDhmCisjZGVmaW5lIEFHQ19ERUNBWV9GczQ4MDAwIDAuMDAwMDA3ZgogCi0jZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzOGYKLSNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgotI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxODhmCi0jZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKKyNkZWZpbmUgQUdDX0RFQ0FZX0ZzODgyMDAgMC4wMDAwMDM4ZgorI2RlZmluZSBBR0NfREVDQVlfRlM5NjAwMCAwLjAwMDAwMzVmCisjZGVmaW5lIEFHQ19ERUNBWV9GczE3NjQwMCAwLjAwMDAwMTg4ZgorI2RlZmluZSBBR0NfREVDQVlfRlMxOTIwMDAgMC4wMDAwMDE3NWYKIAogLyogQUdDIEdhaW4gc2V0dGluZ3MgKi8KLSNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQUdDX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgQUdDX1RBUkdFVExFVkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg4NTUzZgotI2RlZmluZSBBR0NfSFBGR0FJTl8wZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MTI1MzhmCi0jZGVmaW5lIEFHQ19HQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgotI2RlZmluZSBBR0NfR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjIwMThmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc3ODI3OWYKLSNkZWZpbmUgQUdDX0dBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8zZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTUyNjJmCi0jZGVmaW5lIEFHQ19HQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxMjUzOGYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgotI2RlZmluZSBBR0NfR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41ODQ4OTNmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTg4NmYKLSNkZWZpbmUgQUdDX0dBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgotI2RlZmluZSBBR0NfSFBGR0FJTl82ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS44MTgzODNmCi0jZGVmaW5lIEFHQ19HQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5NTI2MmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fN2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgotI2RlZmluZSBBR0NfR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMzg3MjFmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzhkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjU0ODEzNGYKLSNkZWZpbmUgQUdDX0dBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgotI2RlZmluZSBBR0NfSFBGR0FJTl85ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi45ODEwNzJmCi0jZGVmaW5lIEFHQ19HQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjgxODM4M2YKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgotI2RlZmluZSBBR0NfR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xNjIyNzhmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzExZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAxMTg3MmYKLSNkZWZpbmUgQUdDX0dBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNC42MjM0MTNmCi0jZGVmaW5lIEFHQ19HQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjk4MTA3MmYKLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMzA5NTczZgotI2RlZmluZSBBR0NfR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy40NjY4MzZmCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzE0ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICA2LjA3OTQ1OGYKLSNkZWZpbmUgQUdDX0dBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgotI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgNi45NDMyODJmCi0jZGVmaW5lIEFHQ19HQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LjYyMzQxM2YKKyNkZWZpbmUgQUdDX0dBSU5fU0NBTEUgMzEgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIEFHQ19HQUlOX1NISUZUIDQgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBBR0NfVEFSR0VUTEVWRUwgMC45ODg1NTNmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzBkQiAwLjQxMjUzOGYKKyNkZWZpbmUgQUdDX0dBSU5fMGRCIDAuMDAwMDAwZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xZEIgMC41ODQ4OTNmCisjZGVmaW5lIEFHQ19HQUlOXzFkQiAwLjEyMjAxOGYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fMmRCIDAuNzc4Mjc5ZgorI2RlZmluZSBBR0NfR0FJTl8yZEIgMC4yNTg5MjVmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzNkQiAwLjk5NTI2MmYKKyNkZWZpbmUgQUdDX0dBSU5fM2RCIDAuNDEyNTM4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl80ZEIgMS4yMzg3MjFmCisjZGVmaW5lIEFHQ19HQUlOXzRkQiAwLjU4NDg5M2YKKyNkZWZpbmUgQUdDX0hQRkdBSU5fNWRCIDEuNTExODg2ZgorI2RlZmluZSBBR0NfR0FJTl81ZEIgMC43NzgyNzlmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzZkQiAxLjgxODM4M2YKKyNkZWZpbmUgQUdDX0dBSU5fNmRCIDAuOTk1MjYyZgorI2RlZmluZSBBR0NfSFBGR0FJTl83ZEIgMi4xNjIyNzhmCisjZGVmaW5lIEFHQ19HQUlOXzdkQiAxLjIzODcyMWYKKyNkZWZpbmUgQUdDX0hQRkdBSU5fOGRCIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfR0FJTl84ZEIgMS41MTE4ODZmCisjZGVmaW5lIEFHQ19IUEZHQUlOXzlkQiAyLjk4MTA3MmYKKyNkZWZpbmUgQUdDX0dBSU5fOWRCIDEuODE4MzgzZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMGRCIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfR0FJTl8xMGRCIDIuMTYyMjc4ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMWRCIDQuMDExODcyZgorI2RlZmluZSBBR0NfR0FJTl8xMWRCIDIuNTQ4MTM0ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xMmRCIDQuNjIzNDEzZgorI2RlZmluZSBBR0NfR0FJTl8xMmRCIDIuOTgxMDcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xM2RCIDUuMzA5NTczZgorI2RlZmluZSBBR0NfR0FJTl8xM2RCIDMuNDY2ODM2ZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNGRCIDYuMDc5NDU4ZgorI2RlZmluZSBBR0NfR0FJTl8xNGRCIDQuMDExODcyZgorI2RlZmluZSBBR0NfSFBGR0FJTl8xNWRCIDYuOTQzMjgyZgorI2RlZmluZSBBR0NfR0FJTl8xNWRCIDQuNjIzNDEzZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY4OSwzOCArNjg5LDM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBWb2x1bWUgY29udHJvbCBnYWluICovCi0jZGVmaW5lIFZPTFVNRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCi0jZGVmaW5lIFZPTFVNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCisjZGVmaW5lIFZPTFVNRV9NQVggMCAgIC8qIEluIGRCcyAqLworI2RlZmluZSBWT0xVTUVfU0hJRlQgMCAvKiBJbiBkQnMgKi8KIAogLyogVm9sdW1lIGNvbnRyb2wgdGltZSBjb25zdGFudHMgKi8KLSNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgVk9MX1RDX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjQ2OTBmCi0jZGVmaW5lIFZPTF9UQ19GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDE3OTc3ZgotI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjUyOWYKLSNkZWZpbmUgVk9MX1RDX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTI0MjJmCi0jZGVmaW5lIFZPTF9UQ19GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA5MDI5ZgotI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODI5OWYKLSNkZWZpbmUgVk9MX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDYyMzFmCi0jZGVmaW5lIFZPTF9UQ19GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0NTI1ZgotI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDE1OGYKLSNkZWZpbmUgVk9MX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDIyNjNmCi0jZGVmaW5lIFZPTF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDc5ZgotI2RlZmluZSBWT0xfVENfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTEzMWYKLSNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDEwMzlmCi0jZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLwotI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCi0jZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLwotI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCi0jZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwotI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCisjZGVmaW5lIFZPTF9UQ19TSElGVCAyMSAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZzODAwMCAwLjAyNDY5MGYKKyNkZWZpbmUgVk9MX1RDX0ZzMTEwMjUgMC4wMTc5NzdmCisjZGVmaW5lIFZPTF9UQ19GczEyMDAwIDAuMDE2NTI5ZgorI2RlZmluZSBWT0xfVENfRnMxNjAwMCAwLjAxMjQyMmYKKyNkZWZpbmUgVk9MX1RDX0ZzMjIwNTAgMC4wMDkwMjlmCisjZGVmaW5lIFZPTF9UQ19GczI0MDAwIDAuMDA4Mjk5ZgorI2RlZmluZSBWT0xfVENfRnMzMjAwMCAwLjAwNjIzMWYKKyNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgMC4wMDQ1MjVmCisjZGVmaW5lIFZPTF9UQ19GczQ4MDAwIDAuMDA0MTU4ZgorI2RlZmluZSBWT0xfVENfRnM4ODIwMCAwLjAwMjI2M2YKKyNkZWZpbmUgVk9MX1RDX0ZzOTYwMDAgMC4wMDIwNzlmCisjZGVmaW5lIFZPTF9UQ19GczE3NjQwMCAwLjAwMTEzMWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTkyMDAwIDAuMDAxMDM5ZgorI2RlZmluZSBNSVhfVENfRnM4MDAwIDI5MzY1ICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5NjE1MSAqLworI2RlZmluZSBNSVhfVENfRnMxMTAyNSAzMDIzMCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLworI2RlZmluZSBNSVhfVENfRnMxMjAwMCAzMDQyMiAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyODQxNSAqLworI2RlZmluZSBNSVhfVENfRnMxNjAwMCAzMDk3OCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NTM4NyAqLworI2RlZmluZSBNSVhfVENfRnMyMjA1MCAzMTQ1MSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLworI2RlZmluZSBNSVhfVENfRnMyNDAwMCAzMTU1NCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2Mjk1NiAqLworI2RlZmluZSBNSVhfVENfRnMzMjAwMCAzMTg1MCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLworI2RlZmluZSBNSVhfVENfRnM0NDEwMCAzMjA5NyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLworI2RlZmluZSBNSVhfVENfRnM0ODAwMCAzMjE1MCAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTE1MCAqLwogLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk3MDQgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0MzAKLSNkZWZpbmUgTUlYX1RDX0ZzOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI0NTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLworI2RlZmluZSBNSVhfVENfRnM4ODIwMCAzMjQzMAorI2RlZmluZSBNSVhfVENfRnM5NjAwMCAzMjQ1NiAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDUzMCAqLwogLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQ4MzggKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI1OTgKLSNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzI2MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MjUyNCAqLworI2RlZmluZSBNSVhfVENfRnMxNzY0MDAgMzI1OTgKKyNkZWZpbmUgTUlYX1RDX0ZzMTkyMDAwIDMyNjExIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyNTI0ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwCmluZGV4IDUzZmVhZTguLjlmZTgxMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jcHAKQEAgLTIxLDYgKzIxLDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCkBAIC00NywxNSArNDksMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldFBhcmFtZXRlcnMoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwogCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZEQkVfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NywxNSArNzYsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0Q2FwYWJpbGl0aWVzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAxLDM1ICs5OCwzMCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgICAgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCit2b2lkIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgewogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7CisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPQorICAgICAgICAgICAgKExWTV9VSU5UMTYpKChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGUgKworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMSArIExWREJFX0ZTXzE5MjAwMCkpKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlFfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7CisgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgTFZEQkVfSFBGX1RhYmxlW09mZnNldF0uQTAsIExWREJFX0hQRl9UYWJsZVtPZmZzZXRdLkExLCBMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XS5BMiwKKyAgICAgICAgICAgIC0oTFZEQkVfSFBGX1RhYmxlW09mZnNldF0uQjEpLCAtKExWREJFX0hQRl9UYWJsZVtPZmZzZXRdLkIyKX07CisgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkCisgICAgICAgICAgICAtPnNldENvZWZmaWNpZW50czxzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KGNvZWZzKTsKIAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKICAgICAgKi8KLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOworICAgIGNvZWZzID0ge0xWREJFX0JQRl9UYWJsZVtPZmZzZXRdLkEwLCAwLjAsIC0oTFZEQkVfQlBGX1RhYmxlW09mZnNldF0uQTApLAorICAgICAgICAgICAgIC0oTFZEQkVfQlBGX1RhYmxlW09mZnNldF0uQjEpLCAtKExWREJFX0JQRl9UYWJsZVtPZmZzZXRdLkIyKX07CisgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkCisgICAgICAgICAgICAtPnNldENvZWZmaWNpZW50czxzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KGNvZWZzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0NSwyOSArMTM3LDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCit2b2lkIExWREJFX1NldEFHQyhMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKSB7CiAgICAgLyoKICAgICAgKiBHZXQgdGhlIGF0dGFjayBhbmQgZGVjYXkgdGltZSBjb25zdGFudHMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0gTFZEQkVfQUdDX0FUVEFDS19UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIEF0dGFjayBtdWx0aXBsaWVyICovCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ICA9IExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBEZWNheSBtdWx0aXBsZXIgKi8KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0KKyAgICAgICAgICAgIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIEF0dGFjayBtdWx0aXBsaWVyICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ID0KKyAgICAgICAgICAgIExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgLyogRGVjYXkgbXVsdGlwbGVyICovCiAKICAgICAvKgogICAgICAqIEdldCB0aGUgYm9vc3QgZ2FpbgogICAgICAqLwotICAgIGlmIChwUGFyYW1zLT5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19IUEZHQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb24gKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gICA9IExWREJFX0FHQ19HQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCisgICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pIHsKKyAgICAgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW4gPQorICAgICAgICAgICAgICAgIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkVmZmVjdExldmVsXTsgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLworICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluID0KKyAgICAgICAgICAgICAgICBMVkRCRV9BR0NfR0FJTl9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5FZmZlY3RMZXZlbF07IC8qIEhpZ2ggcGFzcyBmaWx0ZXIgb2ZmICovCiAgICAgfQogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19UYXJnZXQgPSBBR0NfVEFSR0VUTEVWRUw7Ci0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5MywyOSArMTgyLDIyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewordm9pZCBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkRCRV9QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgZEJTaGlmdHM7ICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiBkQk9mZnNldDsgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiBWb2x1bWUgPSAwOyAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwotCi0gICAgTFZNX0ZMT0FUICAgICAgICBkQlNoaWZ0c19mYWM7CisgICAgTFZNX0ZMT0FUIGRCU2hpZnRzX2ZhYzsKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgaWYgZW5hYmxlZAogICAgICAqLwotICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVDb250cm9sID09IExWREJFX1ZPTFVNRV9PTikKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPlZvbHVtZUNvbnRyb2wgPT0gTFZEQkVfVk9MVU1FX09OKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKICAgICAgICAgICovCi0gICAgICAgIGlmICAocFBhcmFtcy0+Vm9sdW1lZEIgPiBWT0xVTUVfTUFYKQotICAgICAgICB7CisgICAgICAgIGlmIChwUGFyYW1zLT5Wb2x1bWVkQiA+IFZPTFVNRV9NQVgpIHsKICAgICAgICAgICAgIFZvbHVtZSA9IFZPTFVNRV9NQVg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5Wb2x1bWVkQjsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMyw4ICsyMDUsOCBAQAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBnYWluIGFuZCBzaGlmdHMKICAgICAgKi8KLSAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KLSAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSg2ICsgVm9sdW1lICUgNik7IC8qIEdldCB0aGUgZEJzIDAtNSAqLworICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCiAKICAgICBkQlNoaWZ0c19mYWMgPSAoTFZNX0ZMT0FUKSgxIDw8IGRCU2hpZnRzKTsKICAgICAvKgpAQCAtMjMyLDI3ICsyMTQsMjMgQEAKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSAoTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgLyBkQlNoaWZ0c19mYWM7Ci0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lVEMgICAgPSBMVkRCRV9Wb2x1bWVUQ1RhYmxlWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgIC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDID0KKyAgICAgICAgICAgIExWREJFX1ZvbHVtZVRDVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07IC8qIFZvbHVtZSB1cGRhdGUgdGltZSBjb25zdGFudCAqLwogCiAgICAgLyoKICAgICAgKiBXaGVuIERCRSBpcyBkaXNhYmxlZCB1c2UgdGhlIGJ5cGFzcyB2b2x1bWUgY29udHJvbAogICAgICAqLwotICAgIGlmKGRCU2hpZnRzID4gMCkKLSAgICB7CisgICAgaWYgKGRCU2hpZnRzID4gMCkgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwogICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NSVhFUl9UQywgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yOTIsMjEgKzI3MCwyNSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0NvbnRyb2woTFZEQkVfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMpCi17CitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZEQkVfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QqIHBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKIAotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKLQorICAgIC8qCisgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzICE9IHBQYXJhbXMtPk5yQ2hhbm5lbHMpIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgICAgIG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4ocFBhcmFtcy0+TnJDaGFubmVscykpOworICAgIH0KICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgZmlsdGVycwogICAgICAqLwogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICE9IHBQYXJhbXMtPkNlbnRyZUZyZXF1ZW5jeSkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzICE9IHBQYXJhbXMtPk5yQ2hhbm5lbHMpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgIT0gcFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5KSkgeworICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KICAgICB9CiAKICAgICAvKgpAQCAtMzE0LDE2ICsyOTYsMTQgQEAKICAgICAgKi8KICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICE9IHBQYXJhbXMtPkVmZmVjdExldmVsKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICE9IHBQYXJhbXMtPkhQRlNlbGVjdCkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRBR0MocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCi0gICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAhPSBwUGFyYW1zLT5IUEZTZWxlY3QpKSB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAKLSAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIExWREJFX0JZUEFTU19NSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgIH0KIAogICAgIC8qCkBAIC0zMzIsMTkgKzMxMiwxNiBAQAogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgIT0gcFBhcmFtcy0+Vm9sdW1lZEIpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICE9IHBQYXJhbXMtPkhlYWRyb29tZEIpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICE9IHBQYXJhbXMtPlZvbHVtZUNvbnRyb2wpKQotICAgIHsKLSAgICAgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkgeworICAgICAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgIC8qIE5ldyBwYXJhbWV0ZXJzICovCiAgICAgfQogCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpIHsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDApOwogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CiAgICAgfQotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRiAmJiBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKSB7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDApOwogICAgIH0KQEAgLTM1NCw1ICszMzEsNSBAQAogICAgICAqLwogICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CiAKLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcAppbmRleCBhZDc3Njk2Li5iMTEzZjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuY3BwCkBAIC0yMSwyMDkgKzIxLDkzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiTFZEQkUuaCIKICNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgKi8KLS8qICAgIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX01lbW9yeShMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKLSAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfSW5zdGFuY2VfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uQWxpZ25tZW50ICAgID0gTFZEQkVfSU5TVEFOQ0VfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0RhdGFfRkxPQVRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb2VmIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLkFsaWdubWVudCAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9TQ1JBVENIX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZEQkVfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAqLwotLyogICAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICovCi0vKiAgICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICovCi0vKiAgICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgKi8KLS8qICAgIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAqLwotLyogICAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBidW5kbGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfQUxJR05NRU5URVJST1IgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KLS8qICAgIExWREJFX05VTExBRERSRVNTICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCi0vKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICBNaXhHYWluOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWREJFX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0KiBwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUIE1peEdhaW47CiAKICAgICAvKgotICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKICAgICAgKi8KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAqcGhJbnN0YW5jZSA9IChMVkRCRV9IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzczsKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBuZXcgTFZEQkVfSW5zdGFuY2VfdHt9OwogICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzIGFuZCBpbmNvcnJlY3RseSBhbGlnbmVkIGRhdGEKLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxMVkRCRV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzICUgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0uQWxpZ25tZW50KSE9MCl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX0FMSUdOTUVOVEVSUk9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgICBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CiAKICAgICAvKgogICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKIAotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICAgPSAgICBMVkRCRV9DRU5UUkVfNTVIWjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICAgICA9ICAgIDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAgICAgICAgPSAgICAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAgICAgICAgID0gICAgTFZEQkVfSFBGX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICA9ICAgIExWREJFX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICA9ICAgIExWREJFX0ZTXzgwMDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAgICAgPSAgICBMVkRCRV9WT0xVTUVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICAgICAgICAgID0gICAgMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DRU5UUkVfNTVIWjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID0gTFZEQkVfSFBGX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgPSBMVkRCRV9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZUNvbnRyb2wgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gRkNDXzI7CiAKICAgICAvKgotICAgICAqIFNldCBwb2ludGVyIHRvIGRhdGEgYW5kIGNvZWYgbWVtb3J5CisgICAgICogQ3JlYXRlIHBvaW50ZXIgdG8gZGF0YSBhbmQgY29lZiBtZW1vcnkKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBEYXRhID0KLSAgICAgICAgIChMVkRCRV9EYXRhX0ZMT0FUX3QgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0gICAgcEluc3RhbmNlLT5wQ29lZiA9Ci0gICAgICAgICAoTFZEQkVfQ29lZl9GTE9BVF90ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIHBJbnN0YW5jZS0+cERhdGEgPSAoTFZEQkVfRGF0YV9GTE9BVF90KiljYWxsb2MoMSwgc2l6ZW9mKCoocEluc3RhbmNlLT5wRGF0YSkpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBMVkRCRV9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgLyoKKyAgICAgKiBDcmVhdGUgYmlxdWFkIGluc3RhbmNlCisgICAgICovCisgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzKSk7CisgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkLnJlc2V0KG5ldyBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4oRkNDXzEpKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgZmlsdGVycwogICAgICAqLwotICAgIExWREJFX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgdGFwcyBhbmQgY29lZmZpY2llbnRzICovCisgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsIC8qIFNldCB0aGUgZmlsdGVyIHRhcHMgYW5kIGNvZWZmaWNpZW50cyAqLwogICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCiAgICAgICovCi0gICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsIC8qIFNldCB0aGUgQUdDIGdhaW4gKi8KICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfR2FpbiA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19NYXhHYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCB0byB0aGUgYmFzcyBib29zdCBzZXR0aW5nICovCisgICAgLyogRGVmYXVsdCB0byB0aGUgYmFzcyBib29zdCBzZXR0aW5nICovCiAKICAgICAvLyBpbml0aWFsaXplIHRoZSBtaXhlciB3aXRoIHNvbWUgZml4ZXMgdmFsdWVzIHNpbmNlIG90aGVyd2lzZSBMVkRCRV9TZXRWb2x1bWUgZW5kcyB1cAogICAgIC8vIHJlYWRpbmcgdW5pbml0aWFsaXplZCBkYXRhCkBAIC0yMzMsMTEgKzExNywxMSBAQAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgdm9sdW1lCiAgICAgICovCi0gICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgVm9sdW1lICovCisgICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgLyogU2V0IHRoZSBWb2x1bWUgKi8KICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAogICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZSA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLworICAgIC8qIEluaXRpYWxpc2UgYXMgdGhlIHRhcmdldCAqLwogICAgIE1peEdhaW4gPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgTWl4R2FpbiwgTWl4R2Fpbik7CiAKQEAgLTI1OSwxMSArMTQzLDExIEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0wOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAwOwogCi0gICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAotICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKQEAgLTI3MSwxMCArMTU1LDM0IEBACiAgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwogICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSAwOwogICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCAxLjAsIDEuMCk7Ci0gICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgTFZEQkVfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKIAotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWREJFX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZEQkVfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkRCRV9EZUluaXQoTFZEQkVfSGFuZGxlX3QqIHBoSW5zdGFuY2UpIHsKKyAgICBMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZEQkVfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CisgICAgaWYgKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBEYXRhICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRGF0YSk7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKaW5kZXggZjNmYWFlZC4uN2FjNWRiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCkBAIC0zMyw3ICszMyw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZEQkUuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVkRCRS5oIiAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiTFZDX01peGVyLmgiCiAjaW5jbHVkZSAiQUdDLmgiCkBAIC00NSwyOCArNDYsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lICAgIExWREJFX0lOVkFMSUQgICAgICAgICAgICAweEZGRkYgICAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZEQkVfSU5WQUxJRCAweEZGRkYgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwogCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFICAgICAgICAgMCAgICAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMSAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMiAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgICAvKiBPZmZzZXQgdG8gZGF0YSBzY3JhdGNoIG1lbW9yeSByZWdpb24gKi8KLQotI2RlZmluZSBMVkRCRV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBkYXRhICovCi0jZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwotCi0jaWZkZWYgU1VQUE9SVF9NQwotLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCi0jZWxzZQotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotCi0jZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KLSNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLworI2RlZmluZSBMVkRCRV9NSVhFUl9UQyA1ICAgICAgICAgIC8qIE1peGVyIHRpbWUgICovCisjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAxMDAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc2LDM3ICs1OSwzMCBAQAogCiAvKiBEYXRhIHN0cnVjdHVyZSAqLwogLyogRGF0YSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogQUdDIHBhcmFtZXRlcnMgKi8KLSAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICBBR0NJbnN0YW5jZTsgICAgICAgIC8qIEFHQyBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90IEFHQ0luc3RhbmNlOyAvKiBBR0MgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCiAgICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KLSAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgSFBGVGFwczsgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAgQlBGVGFwczsgICAgICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgICAgICAgQnlwYXNzVm9sdW1lOyAgICAgICAvKiBCeXBhc3Mgdm9sdW1lIHNjYWxlciAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBmb3IgQ2xpY2sgUmVtb3ZhbCAqLworICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCBCeXBhc3NWb2x1bWU7ICAgIC8qIEJ5cGFzcyB2b2x1bWUgc2NhbGVyICovCisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0IEJ5cGFzc01peGVyOyAgICAgLyogQnlwYXNzIE1peGVyIGZvciBDbGljayBSZW1vdmFsICovCiAKIH0gTFZEQkVfRGF0YV9GTE9BVF90OwogCi0vKiBDb2VmcyBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogUHJvY2VzcyB2YXJpYWJsZXMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgSFBGSW5zdGFuY2U7ICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwotfSBMVkRCRV9Db2VmX0ZMT0FUX3Q7CisKIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLwotICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluc3RhbmNlIGNhcGFiaWxpdGllcyAqLworICAgIExWREJFX1BhcmFtc190IFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWREJFX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBEYXRhIGFuZCBjb2VmZmljaWVudCBwb2ludGVycyAqLwotICAgIExWREJFX0RhdGFfRkxPQVRfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KLSAgICBMVkRCRV9Db2VmX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyAgICBMVkRCRV9EYXRhX0ZMT0FUX3QqIHBEYXRhOyAvKiBJbnN0YW5jZSBkYXRhICovCisgICAgdm9pZCogcFNjcmF0Y2g7ICAgICAgICAgICAgLyogc2NyYXRjaCBwb2ludGVyICovCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIHBIUEZCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgZm9yIEhQRiAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwQlBGQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBCUEYgKi8KIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTUsMTMgKzkxLDEwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIExWREJFX1NldEFHQyhMVkRCRV9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkICAgIExWREJFX1NldFZvbHVtZShMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZEQkVfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkICAgIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKK3ZvaWQgTFZEQkVfU2V0RmlsdGVycyhMVkRCRV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWREJFX1BhcmFtc190KiBwUGFyYW1zKTsKIAotI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLworI2VuZGlmIC8qIF9fTFZEQkVfUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcAppbmRleCBiNGE3MWM3Li4wOTY5MDUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwCkBAIC0yMCwxMyArMjAsMTQgQEAKIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KIAotI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldAogI2luY2x1ZGUgIkxWREJFLmgiCiAjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJBR0MuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTczLDE3OSArNzQsMTAzIEBACiAvKiAgICAgb3ZlcmFsbCBlbmQgdG8gZW5kIGdhaW4gaXMgb2RCLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCBoSW5zdGFuY2UsCi0gICAgY29uc3QgTFZNX0ZMT0FUICpwSW5EYXRhLAotICAgIExWTV9GTE9BVCAqcE91dERhdGEsCi0gICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoCisgICAgICAgIExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogewotICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWREJFX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKLSAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwotICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQotICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKLSNlbHNlCi0gIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgotICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwotCi0gIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCi0gIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLQotICAvKgotICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgotICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCi0gICAqLwotICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOwotCi0gIC8qCi0gICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KLSAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCi0gICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgotICAgKgotICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgotICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KLSAgICovCi0gIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87Ci0KLSAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQotICAgKi8KLSAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICB7Ci0gICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwotICB9Ci0KLSAgLyoKLSAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCi0gICAqLwotICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKLSAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCi0gICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQotICB7Ci0gICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKLSAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCi0gICAgICAgIHBTY3JhdGNoLAotICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisgICAgLyogU3BhY2UgdG8gc3RvcmUgREJFIHBhdGggY29tcHV0YXRpb24gKi8KKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKKyAgICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgorICAgICAqIE5yU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaC4KICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKLSAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwotICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKLSNlbmRpZgorICAgIExWTV9GTE9BVCogY29uc3QgcE1vbm8gPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKKworICAgIC8qCisgICAgICogVFJJQ0tZOiBwTW9ubyBpcyB1c2VkIGFuZCBkaXNjYXJkZWQgYnkgdGhlIERCRSBwYXRoLgorICAgICAqICAgICAgICAgc28gaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgZm9yIHRoZSBwU2NyYXRjaFZvbAorICAgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgICAqCisgICAgICogU3BhY2UgdG8gc3RvcmUgVm9sdW1lIENvbnRyb2wgcGF0aCBjb21wdXRhdGlvbi4KKyAgICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAgKi8KKyAgICBpZiAoTnJGcmFtZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpIHsKKyAgICAgICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFNvdXJjZSAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwotICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBGcm9tMmlUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwotI2VuZGlmCisgICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pIHx8CisgICAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pICE9CisgICAgICAgICBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKSB7CisgICAgICAgIC8vIG1ha2UgY29weSBvZiBpbnB1dCBkYXRhCisgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKIAotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KLSAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wSFBGQmlxdWFkLT5wcm9jZXNzKHBTY3JhdGNoLCBwU2NyYXRjaCwgTnJGcmFtZXMpOworICAgICAgICB9CiAKLSAgICAvKgotICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAotICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgKi8KLSAgICAgICAgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgICAgICovCi0gICAgICAgIE5yQ2hhbm5lbHMpOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCi0jZWxzZQotICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KLSAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICBOckZyYW1lcyk7Ci0jZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vbm8sICAgICAgICAgICAgICAgLyogTW9ubyBkZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKIAotICAgIGZvciAoTFZNX0lOVDMyIGlpID0gMDsgaWkgPCBOclNhbXBsZXM7ICsraWkpIHsKLSAgICAgIC8vVE9ETzogcmVwbGFjZSB3aXRoIGV4aXN0aW5nIGNsYW1waW5nIGZ1bmN0aW9uCi0gICAgICBpZiAocFNjcmF0Y2hbaWldIDwgLTEuMCkgewotICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmIChwU2NyYXRjaFtpaV0gPiAxLjApIHsKLSAgICAgICAgcFNjcmF0Y2hbaWldID0gMS4wOwotICAgICAgfQorICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQlBGQmlxdWFkLT5wcm9jZXNzKHBNb25vLCBwTW9ubywgTnJGcmFtZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAorICAgICAgICAgKi8KKyAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoJnBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLCAvKiBJbnN0YW5jZSBwb2ludGVyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTW9ubywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY2xlYXIgREJFIHByb2Nlc3NlZCBwYXRoCisgICAgICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBjbGVhciBEQkUgcHJvY2Vzc2VkIHBhdGgKLSAgICBtZW1zZXQocFNjcmF0Y2gsIDAsIHNpemVvZigqcFNjcmF0Y2gpICogTnJTYW1wbGVzKTsKLSAgfQogCi0gIC8qIEJ5cGFzcyBWb2x1bWUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT0ZGIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRil8fAotICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkKLSAgICAgICAgICAhPUxWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpCi0gIHsKKyAgICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09GRikgfHwKKyAgICAgICAgKExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkgIT0KKyAgICAgICAgIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKSkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKKyAgICAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwgcEluRGF0YSwgcFNjcmF0Y2hWb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICAgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CisgICAgfQogCiAgICAgLyoKLSAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcEluRGF0YSwKLSAgICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCi0gICAgICAgIHBJbkRhdGEsCi0gICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCi0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKLSAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKLSAgfQotCi0gIC8qCi0gICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAotICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKLSAgICAgIHBTY3JhdGNoLAotICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgcFNjcmF0Y2gsCi0gICAgICBwU2NyYXRjaFZvbCwKLSAgICAgIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwotI2VuZGlmCi0gIHJldHVybiBMVkRCRV9TVUNDRVNTOworICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwgcFNjcmF0Y2gsIHBTY3JhdGNoVm9sLCBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworICAgIHJldHVybiBMVkRCRV9TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcAppbmRleCA3Mjg1NzVjLi4xYjk1ODEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgIkxWREJFLmgiCi0jaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCiAjaW5jbHVkZSAiTFZEQkVfVGFibGVzLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKQEAgLTM2LDI3NSArMzYsMTE5IEBACiAgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCiAgKi8KIGNvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW10gPSB7Ci0gICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODAwMF9GYzU1X0ExLAotICAgICBIUEZfRnM4MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMxMTAyNV9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczExMDI1X0ZjNTVfQTEsCi0gICAgIEhQRl9GczExMDI1X0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMX0sCi0gICAge0hQRl9GczEyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxNjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMTYwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMyMjA1MF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczIyMDUwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczIyMDUwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMX0sCi0gICAge0hQRl9GczI0MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMzIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMzMjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMzMjAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMzIwMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM0NDEwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczQ4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAotICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczgwMDBfRmM1NV9BMSwgSFBGX0ZzODAwMF9GYzU1X0EwLCAtSFBGX0ZzODAwMF9GYzU1X0IyLCAtSFBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczExMDI1X0ZjNTVfQTIsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczExMDI1X0ZjNTVfQTEsIEhQRl9GczExMDI1X0ZjNTVfQTAsIC1IUEZfRnMxMTAyNV9GYzU1X0IyLCAtSFBGX0ZzMTEwMjVfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxMjAwMF9GYzU1X0EyLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMjAwMF9GYzU1X0ExLCBIUEZfRnMxMjAwMF9GYzU1X0EwLCAtSFBGX0ZzMTIwMDBfRmM1NV9CMiwgLUhQRl9GczEyMDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMTYwMDBfRmM1NV9BMiwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMSwgSFBGX0ZzMTYwMDBfRmM1NV9BMCwgLUhQRl9GczE2MDAwX0ZjNTVfQjIsIC1IUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0ZjNTVfQTIsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0ZjNTVfQTEsIEhQRl9GczIyMDUwX0ZjNTVfQTAsIC1IUEZfRnMyMjA1MF9GYzU1X0IyLCAtSFBGX0ZzMjIwNTBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9GYzU1X0EyLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyNDAwMF9GYzU1X0ExLCBIUEZfRnMyNDAwMF9GYzU1X0EwLCAtSFBGX0ZzMjQwMDBfRmM1NV9CMiwgLUhQRl9GczI0MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfRmM1NV9BMiwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMSwgSFBGX0ZzMzIwMDBfRmM1NV9BMCwgLUhQRl9GczMyMDAwX0ZjNTVfQjIsIC1IUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0ZjNTVfQTIsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTEsIEhQRl9GczQ0MTAwX0ZjNTVfQTAsIC1IUEZfRnM0NDEwMF9GYzU1X0IyLCAtSFBGX0ZzNDQxMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9GYzU1X0EyLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0ODAwMF9GYzU1X0ExLCBIUEZfRnM0ODAwMF9GYzU1X0EwLCAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfRmM1NV9BMSwgSFBGX0ZzODgyMDBfRmM1NV9BMCwgLUhQRl9Gczg4MjAwX0ZjNTVfQjIsIC1IUEZfRnM4ODIwMF9GYzU1X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsIEhQRl9Gczk2MDAwX0ZjNTVfQTAsIC1IUEZfRnM5NjAwMF9GYzU1X0IyLCAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfRmM1NV9BMiwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9GYzU1X0ExLCBIUEZfRnMxNzY0MDBfRmM1NV9BMCwgLUhQRl9GczE3NjQwMF9GYzU1X0IyLCAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMSwgSFBGX0ZzMTkyMDAwX0ZjNTVfQTAsIC1IUEZfRnMxOTIwMDBfRmM1NV9CMiwgLUhQRl9GczE5MjAwMF9GYzU1X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0hQRl9GczgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczgwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzODAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzODAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzODAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMTEwMjVfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMTAyNV9GYzY2X0ExLAotICAgICBIUEZfRnMxMTAyNV9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTEwMjVfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczExMDI1X0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxMjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczEyMDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczEyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMTIwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE2MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTYwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTYwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMjIwNTBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyMjA1MF9GYzY2X0ExLAotICAgICBIUEZfRnMyMjA1MF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMjIwNTBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMyNDAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczI0MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczI0MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMjQwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczMyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMzIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMzIwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzNDQxMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0NDEwMF9GYzY2X0ExLAotICAgICBIUEZfRnM0NDEwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzNDQxMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnM0ODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ4MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczQ4MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzODgyMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzOTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnM5NjAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxNzY0MDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczE3NjQwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0hQRl9GczgwMDBfRmM2Nl9BMiwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4MDAwX0ZjNjZfQTEsIEhQRl9GczgwMDBfRmM2Nl9BMCwgLUhQRl9GczgwMDBfRmM2Nl9CMiwgLUhQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMxMTAyNV9GYzY2X0EyLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMTAyNV9GYzY2X0ExLCBIUEZfRnMxMTAyNV9GYzY2X0EwLCAtSFBGX0ZzMTEwMjVfRmM2Nl9CMiwgLUhQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTIwMDBfRmM2Nl9BMiwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMSwgSFBGX0ZzMTIwMDBfRmM2Nl9BMCwgLUhQRl9GczEyMDAwX0ZjNjZfQjIsIC1IUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczE2MDAwX0ZjNjZfQTIsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE2MDAwX0ZjNjZfQTEsIEhQRl9GczE2MDAwX0ZjNjZfQTAsIC1IUEZfRnMxNjAwMF9GYzY2X0IyLCAtSFBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9GYzY2X0EyLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyMjA1MF9GYzY2X0ExLCBIUEZfRnMyMjA1MF9GYzY2X0EwLCAtSFBGX0ZzMjIwNTBfRmM2Nl9CMiwgLUhQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfRmM2Nl9BMiwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMSwgSFBGX0ZzMjQwMDBfRmM2Nl9BMCwgLUhQRl9GczI0MDAwX0ZjNjZfQjIsIC1IUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0ZjNjZfQTIsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0ZjNjZfQTEsIEhQRl9GczMyMDAwX0ZjNjZfQTAsIC1IUEZfRnMzMjAwMF9GYzY2X0IyLCAtSFBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9GYzY2X0EyLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0NDEwMF9GYzY2X0ExLCBIUEZfRnM0NDEwMF9GYzY2X0EwLCAtSFBGX0ZzNDQxMDBfRmM2Nl9CMiwgLUhQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfRmM2Nl9BMiwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMSwgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0ZjNjZfQTIsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0ZjNjZfQTEsIEhQRl9Gczg4MjAwX0ZjNjZfQTAsIC1IUEZfRnM4ODIwMF9GYzY2X0IyLCAtSFBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM5NjAwMF9GYzY2X0ExLCBIUEZfRnM5NjAwMF9GYzY2X0EwLCAtSFBGX0ZzOTYwMDBfRmM2Nl9CMiwgLUhQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0ZjNjZfQTIsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEsIEhQRl9GczE5MjAwMF9GYzY2X0EwLCAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjIsIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCiAKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzc4X0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTEsCi0gICAgIEhQRl9Gczg4MjAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMX0sCi0gICAge0hQRl9Gczk2MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTc2NDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE3NjQwMF9GYzc4X0ExLAotICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE5MjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzODAwMF9GYzc4X0ExLCBIUEZfRnM4MDAwX0ZjNzhfQTAsIC1IUEZfRnM4MDAwX0ZjNzhfQjIsIC1IUEZfRnM4MDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMTEwMjVfRmM3OF9BMiwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMSwgSFBGX0ZzMTEwMjVfRmM3OF9BMCwgLUhQRl9GczExMDI1X0ZjNzhfQjIsIC1IUEZfRnMxMTAyNV9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczEyMDAwX0ZjNzhfQTIsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczEyMDAwX0ZjNzhfQTEsIEhQRl9GczEyMDAwX0ZjNzhfQTAsIC1IUEZfRnMxMjAwMF9GYzc4X0IyLCAtSFBGX0ZzMTIwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMxNjAwMF9GYzc4X0EyLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxNjAwMF9GYzc4X0ExLCBIUEZfRnMxNjAwMF9GYzc4X0EwLCAtSFBGX0ZzMTYwMDBfRmM3OF9CMiwgLUhQRl9GczE2MDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfRmM3OF9BMiwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMSwgSFBGX0ZzMjIwNTBfRmM3OF9BMCwgLUhQRl9GczIyMDUwX0ZjNzhfQjIsIC1IUEZfRnMyMjA1MF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0ZjNzhfQTIsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0ZjNzhfQTEsIEhQRl9GczI0MDAwX0ZjNzhfQTAsIC1IUEZfRnMyNDAwMF9GYzc4X0IyLCAtSFBGX0ZzMjQwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9GYzc4X0EyLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMzMjAwMF9GYzc4X0ExLCBIUEZfRnMzMjAwMF9GYzc4X0EwLCAtSFBGX0ZzMzIwMDBfRmM3OF9CMiwgLUhQRl9GczMyMDAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfRmM3OF9BMiwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMSwgSFBGX0ZzNDQxMDBfRmM3OF9BMCwgLUhQRl9GczQ0MTAwX0ZjNzhfQjIsIC1IUEZfRnM0NDEwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0ZjNzhfQTIsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0ZjNzhfQTEsIEhQRl9GczQ4MDAwX0ZjNzhfQTAsIC1IUEZfRnM0ODAwMF9GYzc4X0IyLCAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9GYzc4X0EyLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLCBIUEZfRnM4ODIwMF9GYzc4X0EwLCAtSFBGX0ZzODgyMDBfRmM3OF9CMiwgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfRmM3OF9BMSwgSFBGX0ZzOTYwMDBfRmM3OF9BMCwgLUhQRl9Gczk2MDAwX0ZjNzhfQjIsIC1IUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEsIEhQRl9GczE3NjQwMF9GYzc4X0EwLCAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjIsIC1IUEZfRnMxNzY0MDBfRmM3OF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfRmM3OF9BMiwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLCBIUEZfRnMxOTIwMDBfRmM3OF9BMCwgLUhQRl9GczE5MjAwMF9GYzc4X0IyLCAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAogCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM4MDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxMTAyNV9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczExMDI1X0ZjOTBfQTEsCi0gICAgIEhQRl9GczExMDI1X0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTEwMjVfRmM5MF9CMX0sCi0gICAge0hQRl9GczEyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxNjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxNjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczE2MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMyMjA1MF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczIyMDUwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczIyMDUwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMjIwNTBfRmM5MF9CMX0sCi0gICAge0hQRl9GczI0MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMzIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMzMjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMzMjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczMyMDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnM0NDEwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzNDQxMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczQ4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorICAgICAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczgwMDBfRmM5MF9BMSwgSFBGX0ZzODAwMF9GYzkwX0EwLCAtSFBGX0ZzODAwMF9GYzkwX0IyLCAtSFBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczExMDI1X0ZjOTBfQTIsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczExMDI1X0ZjOTBfQTEsIEhQRl9GczExMDI1X0ZjOTBfQTAsIC1IUEZfRnMxMTAyNV9GYzkwX0IyLCAtSFBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMxMjAwMF9GYzkwX0EyLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMxMjAwMF9GYzkwX0ExLCBIUEZfRnMxMjAwMF9GYzkwX0EwLCAtSFBGX0ZzMTIwMDBfRmM5MF9CMiwgLUhQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMTYwMDBfRmM5MF9BMiwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTYwMDBfRmM5MF9BMSwgSFBGX0ZzMTYwMDBfRmM5MF9BMCwgLUhQRl9GczE2MDAwX0ZjOTBfQjIsIC1IUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0ZjOTBfQTIsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0ZjOTBfQTEsIEhQRl9GczIyMDUwX0ZjOTBfQTAsIC1IUEZfRnMyMjA1MF9GYzkwX0IyLCAtSFBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9GYzkwX0EyLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnMyNDAwMF9GYzkwX0ExLCBIUEZfRnMyNDAwMF9GYzkwX0EwLCAtSFBGX0ZzMjQwMDBfRmM5MF9CMiwgLUhQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfRmM5MF9BMiwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfRmM5MF9BMSwgSFBGX0ZzMzIwMDBfRmM5MF9BMCwgLUhQRl9GczMyMDAwX0ZjOTBfQjIsIC1IUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0ZjOTBfQTIsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTEsIEhQRl9GczQ0MTAwX0ZjOTBfQTAsIC1IUEZfRnM0NDEwMF9GYzkwX0IyLCAtSFBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9GYzkwX0EyLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLCBIUEZfRnM0ODAwMF9GYzkwX0EwLCAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9CiAKLSAgICAsCi0gICAge0hQRl9Gczg4MjAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzODgyMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9Gczg4MjAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM5NjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM5NjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzOTYwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxNzY0MDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczE3NjQwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IxfQorICAgICAgICAsCisgICAgICAgIHtIUEZfRnM4ODIwMF9GYzkwX0EyLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBIUEZfRnM4ODIwMF9GYzkwX0ExLCBIUEZfRnM4ODIwMF9GYzkwX0EwLCAtSFBGX0ZzODgyMDBfRmM5MF9CMiwgLUhQRl9Gczg4MjAwX0ZjOTBfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfRmM5MF9BMiwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwgSFBGX0ZzOTYwMDBfRmM5MF9BMCwgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9GYzkwX0EyLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEsIEhQRl9GczE3NjQwMF9GYzkwX0EwLCAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjIsIC1IUEZfRnMxNzY0MDBfRmM5MF9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLCBIUEZfRnMxOTIwMDBfRmM5MF9BMCwgLUhQRl9GczE5MjAwMF9GYzkwX0IyLCAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjF9CiAKIH07CiAKQEAgLTMxMiwxNzAgKzE1NiwxMTcgQEAKICAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKICAqLwogY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMTEwMjVfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwKLSAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAotICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMjIwNTBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzNDQxMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCi0gICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKLSAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAotICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKLSAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM1NV9CMiwgLUJQRl9GczgwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzU1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM1NV9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNTVfQjIsIC1CUEZfRnMxMjAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IyLCAtQlBGX0ZzMTYwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzU1X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM1NV9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNTVfQjIsIC1CUEZfRnMyNDAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IyLCAtQlBGX0ZzMzIwMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzU1X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM1NV9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjIsIC1CUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNTVfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IyLCAtQlBGX0ZzODgyMDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNTVfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNTVfQjIsIC1CUEZfRnMxNzY0MDBfRmM1NV9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNjZIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMiwgLUJQRl9GczgwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzY2X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMiwgLUJQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM2Nl9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjIsIC1CUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNjZfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IyLCAtQlBGX0ZzMTYwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzY2X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMiwgLUJQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM2Nl9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjIsIC1CUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNjZfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IyLCAtQlBGX0ZzMzIwMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzY2X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMiwgLUJQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjIsIC1CUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLCAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCisgICAgICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgICAgIHtCUEZfRnM4MDAwX0ZjNzhfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczgwMDBfRmM3OF9CMiwgLUJQRl9GczgwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMxMTAyNV9GYzc4X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMiwgLUJQRl9GczExMDI1X0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMTIwMDBfRmM3OF9BMCwgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjIsIC1CUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczE2MDAwX0ZjNzhfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IyLCAtQlBGX0ZzMTYwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnMyMjA1MF9GYzc4X0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMiwgLUJQRl9GczIyMDUwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMjQwMDBfRmM3OF9BMCwgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjIsIC1CUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9GczMyMDAwX0ZjNzhfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IyLCAtQlBGX0ZzMzIwMDBfRmM3OF9CMX0sCisgICAgICAgIHtCUEZfRnM0NDEwMF9GYzc4X0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMiwgLUJQRl9GczQ0MTAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyAgICAgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLCAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgICAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCisgICAgICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKIAotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQotICAgICwKLSAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KKyAgICAgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAge0JQRl9GczgwMDBfRmM5MF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzODAwMF9GYzkwX0IyLCAtQlBGX0ZzODAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczExMDI1X0ZjOTBfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IyLCAtQlBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMxMjAwMF9GYzkwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMiwgLUJQRl9GczEyMDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMTYwMDBfRmM5MF9BMCwgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjIsIC1CUEZfRnMxNjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczIyMDUwX0ZjOTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IyLCAtQlBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMyNDAwMF9GYzkwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMiwgLUJQRl9GczI0MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzMzIwMDBfRmM5MF9BMCwgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjIsIC1CUEZfRnMzMjAwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczQ0MTAwX0ZjOTBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IyLCAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMiwgLUJQRl9GczQ4MDAwX0ZjOTBfQjF9LAorICAgICAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjIsIC1CUEZfRnM4ODIwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLCAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAgICAgIHtCUEZfRnMxNzY0MDBfRmM5MF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMiwgLUJQRl9GczE3NjQwMF9GYzkwX0IxfSwKKyAgICAgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IyLCAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjF9CiAKIH07CiAKQEAgLTQ4Nyw3NyArMjc4LDM0IEBACiAKIC8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLwogY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKLSAgICBBR0NfQVRUQUNLX0ZzODAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzMTEwMjUsCi0gICAgQUdDX0FUVEFDS19GczEyMDAwLAotICAgIEFHQ19BVFRBQ0tfRnMxNjAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzMjIwNTAsCi0gICAgQUdDX0FUVEFDS19GczI0MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMzMjAwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCi0gICAgQUdDX0FUVEFDS19GczQ4MDAwCi0gICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAotICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKLSAgICAsQUdDX0FUVEFDS19GczE3NjQwMAotICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisgICAgICAgIEFHQ19BVFRBQ0tfRnM4MDAwLCAgQUdDX0FUVEFDS19GczExMDI1LCBBR0NfQVRUQUNLX0ZzMTIwMDAsIEFHQ19BVFRBQ0tfRnMxNjAwMCwKKyAgICAgICAgQUdDX0FUVEFDS19GczIyMDUwLCBBR0NfQVRUQUNLX0ZzMjQwMDAsIEFHQ19BVFRBQ0tfRnMzMjAwMCwgQUdDX0FUVEFDS19GczQ0MTAwLAorICAgICAgICBBR0NfQVRUQUNLX0ZzNDgwMDAsIEFHQ19BVFRBQ0tfRnM4ODIwMCwgQUdDX0FUVEFDS19Gczk2MDAwLCBBR0NfQVRUQUNLX0ZzMTc2NDAwLAorICAgICAgICBBR0NfQVRUQUNLX0ZzMTkyMDAwCiAKIH07CiAKIC8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7Ci0gICAgQUdDX0RFQ0FZX0ZzODAwMCwKLSAgICBBR0NfREVDQVlfRnMxMTAyNSwKLSAgICBBR0NfREVDQVlfRnMxMjAwMCwKLSAgICBBR0NfREVDQVlfRnMxNjAwMCwKLSAgICBBR0NfREVDQVlfRnMyMjA1MCwKLSAgICBBR0NfREVDQVlfRnMyNDAwMCwKLSAgICBBR0NfREVDQVlfRnMzMjAwMCwKLSAgICBBR0NfREVDQVlfRnM0NDEwMCwKLSAgICBBR0NfREVDQVlfRnM0ODAwMAotICAgICxBR0NfREVDQVlfRnM4ODIwMAotICAgICxBR0NfREVDQVlfRlM5NjAwMAotICAgICxBR0NfREVDQVlfRnMxNzY0MDAKLSAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7QUdDX0RFQ0FZX0ZzODAwMCwgIEFHQ19ERUNBWV9GczExMDI1LCBBR0NfREVDQVlfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfREVDQVlfRnMxNjAwMCwgQUdDX0RFQ0FZX0ZzMjIwNTAsIEFHQ19ERUNBWV9GczI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHQ19ERUNBWV9GczMyMDAwLCBBR0NfREVDQVlfRnM0NDEwMCwgQUdDX0RFQ0FZX0ZzNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX0RFQ0FZX0ZzODgyMDAsIEFHQ19ERUNBWV9GUzk2MDAwLCBBR0NfREVDQVlfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUdDX0RFQ0FZX0ZTMTkyMDAwCiAKIH07CiAKIC8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCiBjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKLSAgICBBR0NfR0FJTl8wZEIsCi0gICAgQUdDX0dBSU5fMWRCLAotICAgIEFHQ19HQUlOXzJkQiwKLSAgICBBR0NfR0FJTl8zZEIsCi0gICAgQUdDX0dBSU5fNGRCLAotICAgIEFHQ19HQUlOXzVkQiwKLSAgICBBR0NfR0FJTl82ZEIsCi0gICAgQUdDX0dBSU5fN2RCLAotICAgIEFHQ19HQUlOXzhkQiwKLSAgICBBR0NfR0FJTl85ZEIsCi0gICAgQUdDX0dBSU5fMTBkQiwKLSAgICBBR0NfR0FJTl8xMWRCLAotICAgIEFHQ19HQUlOXzEyZEIsCi0gICAgQUdDX0dBSU5fMTNkQiwKLSAgICBBR0NfR0FJTl8xNGRCLAotICAgIEFHQ19HQUlOXzE1ZEJ9OworICAgICAgICBBR0NfR0FJTl8wZEIsICBBR0NfR0FJTl8xZEIsICBBR0NfR0FJTl8yZEIsICBBR0NfR0FJTl8zZEIsIEFHQ19HQUlOXzRkQiwgIEFHQ19HQUlOXzVkQiwKKyAgICAgICAgQUdDX0dBSU5fNmRCLCAgQUdDX0dBSU5fN2RCLCAgQUdDX0dBSU5fOGRCLCAgQUdDX0dBSU5fOWRCLCBBR0NfR0FJTl8xMGRCLCBBR0NfR0FJTl8xMWRCLAorICAgICAgICBBR0NfR0FJTl8xMmRCLCBBR0NfR0FJTl8xM2RCLCBBR0NfR0FJTl8xNGRCLCBBR0NfR0FJTl8xNWRCfTsKIAogLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfSFBGR0FJTl9UYWJsZVtdID0gewotICAgIEFHQ19IUEZHQUlOXzBkQiwKLSAgICBBR0NfSFBGR0FJTl8xZEIsCi0gICAgQUdDX0hQRkdBSU5fMmRCLAotICAgIEFHQ19IUEZHQUlOXzNkQiwKLSAgICBBR0NfSFBGR0FJTl80ZEIsCi0gICAgQUdDX0hQRkdBSU5fNWRCLAotICAgIEFHQ19IUEZHQUlOXzZkQiwKLSAgICBBR0NfSFBGR0FJTl83ZEIsCi0gICAgQUdDX0hQRkdBSU5fOGRCLAotICAgIEFHQ19IUEZHQUlOXzlkQiwKLSAgICBBR0NfSFBGR0FJTl8xMGRCLAotICAgIEFHQ19IUEZHQUlOXzExZEIsCi0gICAgQUdDX0hQRkdBSU5fMTJkQiwKLSAgICBBR0NfSFBGR0FJTl8xM2RCLAotICAgIEFHQ19IUEZHQUlOXzE0ZEIsCi0gICAgQUdDX0hQRkdBSU5fMTVkQn07CisgICAgICAgIEFHQ19IUEZHQUlOXzBkQiwgIEFHQ19IUEZHQUlOXzFkQiwgIEFHQ19IUEZHQUlOXzJkQiwgIEFHQ19IUEZHQUlOXzNkQiwKKyAgICAgICAgQUdDX0hQRkdBSU5fNGRCLCAgQUdDX0hQRkdBSU5fNWRCLCAgQUdDX0hQRkdBSU5fNmRCLCAgQUdDX0hQRkdBSU5fN2RCLAorICAgICAgICBBR0NfSFBGR0FJTl84ZEIsICBBR0NfSFBGR0FJTl85ZEIsICBBR0NfSFBGR0FJTl8xMGRCLCBBR0NfSFBGR0FJTl8xMWRCLAorICAgICAgICBBR0NfSFBGR0FJTl8xMmRCLCBBR0NfSFBGR0FJTl8xM2RCLCBBR0NfSFBGR0FJTl8xNGRCLCBBR0NfSFBGR0FJTl8xNWRCfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NjYsNDUgKzMxNCwyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KLWNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gewotICAgIDAuNTAwMDAwZiwgICAgICAgICAvKiAtNmRCICovCi0gICAgMC41NjIzNDFmLCAgICAgICAgIC8qIC01ZEIgKi8KLSAgICAwLjYzMDk1N2YsICAgICAgICAgLyogLTRkQiAqLwotICAgIDAuNzA3OTQ2ZiwgICAgICAgICAvKiAtM2RCICovCi0gICAgMC43OTQzMjhmLCAgICAgICAgIC8qIC0yZEIgKi8KLSAgICAwLjg5MTI1MWYsICAgICAgICAgLyogLTFkQiAqLwotICAgIDEuMDAwMDAwZn07ICAgICAgICAvKiAgMGRCICovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHswLjUwMDAwMGYsICAvKiAtNmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MjM0MWYsICAvKiAtNWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjYzMDk1N2YsICAvKiAtNGRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzk0NmYsICAvKiAtM2RCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5NDMyOGYsICAvKiAtMmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjg5MTI1MWYsICAvKiAtMWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMGZ9OyAvKiAgMGRCICovCiAKIGNvbnN0IExWTV9GTE9BVCBMVkRCRV9Wb2x1bWVUQ1RhYmxlW10gPSB7Ci0gICAgVk9MX1RDX0ZzODAwMCwKLSAgICBWT0xfVENfRnMxMTAyNSwKLSAgICBWT0xfVENfRnMxMjAwMCwKLSAgICBWT0xfVENfRnMxNjAwMCwKLSAgICBWT0xfVENfRnMyMjA1MCwKLSAgICBWT0xfVENfRnMyNDAwMCwKLSAgICBWT0xfVENfRnMzMjAwMCwKLSAgICBWT0xfVENfRnM0NDEwMCwKLSAgICBWT0xfVENfRnM0ODAwMAotICAgICxWT0xfVENfRnM4ODIwMAotICAgICxWT0xfVENfRnM5NjAwMAotICAgICxWT0xfVENfRnMxNzY0MDAKLSAgICAsVk9MX1RDX0ZzMTkyMDAwCi19OworICAgICAgICBWT0xfVENfRnM4MDAwLCAgVk9MX1RDX0ZzMTEwMjUsICBWT0xfVENfRnMxMjAwMCwgVk9MX1RDX0ZzMTYwMDAsIFZPTF9UQ19GczIyMDUwLAorICAgICAgICBWT0xfVENfRnMyNDAwMCwgVk9MX1RDX0ZzMzIwMDAsICBWT0xfVENfRnM0NDEwMCwgVk9MX1RDX0ZzNDgwMDAsIFZPTF9UQ19Gczg4MjAwLAorICAgICAgICBWT0xfVENfRnM5NjAwMCwgVk9MX1RDX0ZzMTc2NDAwLCBWT0xfVENfRnMxOTIwMDB9OwogCiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7CiAKLSAgICBNSVhfVENfRnM4MDAwLAotICAgIE1JWF9UQ19GczExMDI1LAotICAgIE1JWF9UQ19GczEyMDAwLAotICAgIE1JWF9UQ19GczE2MDAwLAotICAgIE1JWF9UQ19GczIyMDUwLAotICAgIE1JWF9UQ19GczI0MDAwLAotICAgIE1JWF9UQ19GczMyMDAwLAotICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwCi0gICAgLE1JWF9UQ19Gczg4MjAwCi0gICAgLE1JWF9UQ19Gczk2MDAwCi0gICAgLE1JWF9UQ19GczE3NjQwMAotICAgICxNSVhfVENfRnMxOTIwMDAKKyAgICAgICAgTUlYX1RDX0ZzODAwMCwgIE1JWF9UQ19GczExMDI1LCAgTUlYX1RDX0ZzMTIwMDAsIE1JWF9UQ19GczE2MDAwLCBNSVhfVENfRnMyMjA1MCwKKyAgICAgICAgTUlYX1RDX0ZzMjQwMDAsIE1JWF9UQ19GczMyMDAwLCAgTUlYX1RDX0ZzNDQxMDAsIE1JWF9UQ19GczQ4MDAwLCBNSVhfVENfRnM4ODIwMCwKKyAgICAgICAgTUlYX1RDX0ZzOTYwMDAsIE1JWF9UQ19GczE3NjQwMCwgTUlYX1RDX0ZzMTkyMDAwCiAKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL2xpYi9MVk0uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCmluZGV4IGU0ZTg0NTAuLmM5MGM1Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oCkBAIC02NywzMSArNjcsMjggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KLSNkZWZpbmUgTFZNX0NTX0VGRkVDVF9OT05FICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwJSBlZmZlY3QsIG1pbmltdW0gdmFsdWUgKi8KLSNkZWZpbmUgTFZNX0NTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgIDE2Mzg0ICAgICAvKiA1MCUgZWZmZWN0ICovCi0jZGVmaW5lIExWTV9DU19FRkZFQ1RfTUVEICAgICAgICAgICAgICAgICAyNDU3NiAgICAgLyogNzUlIGVmZmVjdCAqLwotI2RlZmluZSBMVk1fQ1NfRUZGRUNUX0hJR0ggICAgICAgICAgICAgICAgMzI3NjcgICAgIC8qIDEwMCUgZWZmZWN0LCBtYXhpbXVtIHZhbHVlICovCisjZGVmaW5lIExWTV9DU19FRkZFQ1RfTk9ORSAwICAgICAvKiAwJSBlZmZlY3QsIG1pbmltdW0gdmFsdWUgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9MT1cgMTYzODQgIC8qIDUwJSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9NRUQgMjQ1NzYgIC8qIDc1JSBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0NTX0VGRkVDVF9ISUdIIDMyNzY3IC8qIDEwMCUgZWZmZWN0LCBtYXhpbXVtIHZhbHVlICovCiAKIC8qIFRyZWJsZSBlbmhhbmNlbWVudCAqLwotI2RlZmluZSBMVk1fVEVfTE9XX01JUFMgICAgICAgICAgICAgICAgICAgMzI3NjcKKyNkZWZpbmUgTFZNX1RFX0xPV19NSVBTIDMyNzY3CiAKIC8qIEJhc3MgZW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KLSNkZWZpbmUgTFZNX0JFXzBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwZEIgYm9vc3QsIG5vIGVmZmVjdCAqLwotI2RlZmluZSBMVk1fQkVfM0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgIC8qICszZEIgYm9vc3QgKi8KLSNkZWZpbmUgTFZNX0JFXzZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICAgICAvKiArNmRCIGJvb3N0ICovCi0jZGVmaW5lIExWTV9CRV85REIgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgLyogKzlkQiBib29zdCAqLwotI2RlZmluZSBMVk1fQkVfMTJEQiAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgIC8qICsxMmRCIGJvb3N0ICovCi0jZGVmaW5lIExWTV9CRV8xNURCICAgICAgICAgICAgICAgICAgICAgICAgICAxNSAgICAgLyogKzE1ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzBEQiAwICAgLyogMGRCIGJvb3N0LCBubyBlZmZlY3QgKi8KKyNkZWZpbmUgTFZNX0JFXzNEQiAzICAgLyogKzNkQiBib29zdCAqLworI2RlZmluZSBMVk1fQkVfNkRCIDYgICAvKiArNmRCIGJvb3N0ICovCisjZGVmaW5lIExWTV9CRV85REIgOSAgIC8qICs5ZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzEyREIgMTIgLyogKzEyZEIgYm9vc3QgKi8KKyNkZWZpbmUgTFZNX0JFXzE1REIgMTUgLyogKzE1ZEIgYm9vc3QgKi8KIAogLyogTi1CYW5kIEVxdWFsaXplciAqLwotI2RlZmluZSBMVk1fRVFfTkJBTkRTICAgICAgICAgICAgICAgICAgICAgICAgIDUgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlcXVhbGl6ZXIgKi8KKyNkZWZpbmUgTFZNX0VRX05CQU5EUyA1IC8qIE51bWJlciBvZiBiYW5kcyBmb3IgZXF1YWxpemVyICovCiAKIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgTFZNX0hFQURST09NX01BWF9OQkFORFMgICAgICAgICAgICAgICA1CisjZGVmaW5lIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIDUKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMCwxMjMgKzk3LDg5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2UgaGFuZGxlICovCi10eXBlZGVmIHZvaWQgKkxWTV9IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogTFZNX0hhbmRsZV90OwogCiAvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVk1fQUxJR05NRU5URVJST1IgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZNX05VTExBRERSRVNTICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgID0gMywgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KLSAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgID0gNCwgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgTFZNX1dST05HQVVESU9USU1FICAgICA9IDUsICAgICAgICAgICAgICAgICAgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCi0gICAgTFZNX0FMR09SSVRITURJU0FCTEVEICA9IDYsICAgICAgICAgICAgICAgICAgICAgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KLSAgICBMVk1fQUxHT1JJVEhNUFNBICAgICAgID0gNywgICAgICAgICAgICAgICAgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1NVQ0NFU1MgPSAwLCAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KKyAgICBMVk1fQUxJR05NRU5URVJST1IgPSAxLCAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCisgICAgTFZNX05VTExBRERSRVNTID0gMiwgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVk1fT1VUT0ZSQU5HRSA9IDMsICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KKyAgICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgPSA0LCAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCisgICAgTFZNX1dST05HQVVESU9USU1FID0gNSwgICAgLyogV3JvbmcgdGltZSB2YWx1ZSBmb3IgYXVkaW8gdGltZSovCisgICAgTFZNX0FMR09SSVRITURJU0FCTEVEID0gNiwgLyogQWxnb3JpdGhtIGlzIGRpc2FibGVkKi8KKyAgICBMVk1fQUxHT1JJVEhNUFNBID0gNywgICAgICAvKiBBbGdvcml0aG0gUFNBIHJldHVybnMgYW4gZXJyb3IgKi8KICAgICBMVk1fUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1JldHVyblN0YXR1c19lbjsKIAogLyogQnVmZmVyIE1hbmFnZW1lbnQgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX01BTkFHRURfQlVGRkVSUyAgID0gMCwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX01BTkFHRURfQlVGRkVSUyA9IDAsCiAgICAgTFZNX1VOTUFOQUdFRF9CVUZGRVJTID0gMSwKLSAgICBMVk1fQlVGRkVSU19EVU1NWSAgICAgPSBMVk1fTUFYRU5VTQorICAgIExWTV9CVUZGRVJTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0J1ZmZlck1vZGVfZW47CiAKIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0hFQURQSE9ORVMgICAgICAgICAgICAgPSAwLAotICAgIExWTV9FWF9IRUFEUEhPTkVTICAgICAgICAgID0gMSwKLSAgICBMVk1fU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit0eXBlZGVmIGVudW0geworICAgIExWTV9IRUFEUEhPTkVTID0gMCwKKyAgICBMVk1fRVhfSEVBRFBIT05FUyA9IDEsCisgICAgTFZNX1NQRUFLRVJUWVBFX01BWCA9IExWTV9NQVhFTlVNCiB9IExWTV9PdXRwdXREZXZpY2VUeXBlX2VuOwogCiAvKiBWaXJ0dWFsaXplciBtb2RlIHNlbGVjdGlvbiovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQ09OQ0VSVFNPVU5EICAgICAgID0gMCwKLSAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZICAgPSBMVk1fTUFYRU5VTQordHlwZWRlZiBlbnVtIHsKKyAgICBMVk1fQ09OQ0VSVFNPVU5EID0gMCwKKyAgICBMVk1fVklSVFVBTElaRVJUWVBFX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1ZpcnR1YWxpemVyVHlwZV9lbjsKIAogLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX0VRTkJfT0ZGICAgPSAwLAotICAgIExWTV9FUU5CX09OICAgID0gMSwKLSAgICBMVk1fRVFOQl9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9FUU5CX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fRVFOQl9PRkYgPSAwLCBMVk1fRVFOQl9PTiA9IDEsIExWTV9FUU5CX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fRVFOQl9Nb2RlX2VuOwogCiAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfT0ZGICAgPSAwLAotICAgIExWTV9CRV9PTiAgICA9IDEsCi0gICAgTFZNX0JFX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX0JFX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fQkVfT0ZGID0gMCwgTFZNX0JFX09OID0gMSwgTFZNX0JFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fQkVfTW9kZV9lbjsKIAogLyogQmFzcyBFbmhhbmNlbWVudCBjZW50cmUgZnJlcXVlbmN5IHNlbGVjdGlvbiBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfQ0VOVFJFXzU1SHogID0gMCwKLSAgICBMVk1fQkVfQ0VOVFJFXzY2SHogID0gMSwKLSAgICBMVk1fQkVfQ0VOVFJFXzc4SHogID0gMiwKLSAgICBMVk1fQkVfQ0VOVFJFXzkwSHogID0gMywKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0JFX0NFTlRSRV81NUh6ID0gMCwKKyAgICBMVk1fQkVfQ0VOVFJFXzY2SHogPSAxLAorICAgIExWTV9CRV9DRU5UUkVfNzhIeiA9IDIsCisgICAgTFZNX0JFX0NFTlRSRV85MEh6ID0gMywKICAgICBMVk1fQkVfQ0VOVFJFX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0JFX0NlbnRyZUZyZXFfZW47CiAKIC8qIEJhc3MgRW5oYW5jZW1lbnQgSFBGIHNlbGVjdGlvbiBjb250cm9sICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkVfSFBGX09GRiAgID0gMCwKLSAgICBMVk1fQkVfSFBGX09OICAgID0gMSwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0JFX0hQRl9PRkYgPSAwLAorICAgIExWTV9CRV9IUEZfT04gPSAxLAogICAgIExWTV9CRV9IUEZfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuOwogCiAvKiBWb2x1bWUgQ29udHJvbCBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1ZDX09GRiAgID0gMCwKLSAgICBMVk1fVkNfT04gICAgPSAxLAotICAgIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9WQ19Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1ZDX09GRiA9IDAsIExWTV9WQ19PTiA9IDEsIExWTV9WQ19EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1ZDX01vZGVfZW47CiAKIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBvcGVyYXRpbmcgbW9kZSAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1RFX09GRiAgID0gMCwKLSAgICBMVk1fVEVfT04gICAgPSAxLAotICAgIExWTV9URV9EVU1NWSA9IExWTV9NQVhFTlVNCi19IExWTV9URV9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1RFX09GRiA9IDAsIExWTV9URV9PTiA9IDEsIExWTV9URV9EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1RFX01vZGVfZW47CiAKIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgb3BlcmF0aW5nIG1vZGUgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9IRUFEUk9PTV9PRkYgICA9IDAsCi0gICAgTFZNX0hFQURST09NX09OICAgID0gMSwKK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX0hFQURST09NX09GRiA9IDAsCisgICAgTFZNX0hFQURST09NX09OID0gMSwKICAgICBMVk1fSGVhZHJvb21fRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fSGVhZHJvb21fTW9kZV9lbjsKIAotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZNX1BTQV9TUEVFRF9TTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IHNsb3cgc3BlZWQgKi8KLSAgICBMVk1fUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgbWVkaXVtIHNwZWVkICovCi0gICAgTFZNX1BTQV9TUEVFRF9GQVNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZWFrIGRlY2F5aW5nIGF0IGZhc3Qgc3BlZWQgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1BTQV9TUEVFRF9TTE9XLCAgIC8qIFBlYWsgZGVjYXlpbmcgYXQgc2xvdyBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfTUVESVVNLCAvKiBQZWFrIGRlY2F5aW5nIGF0IG1lZGl1bSBzcGVlZCAqLworICAgIExWTV9QU0FfU1BFRURfRkFTVCwgICAvKiBQZWFrIGRlY2F5aW5nIGF0IGZhc3Qgc3BlZWQgKi8KICAgICBMVk1fUFNBX1NQRUVEX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1BTQV9EZWNheVNwZWVkX2VuOwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fUFNBX09GRiAgID0gMCwKLSAgICBMVk1fUFNBX09OICAgID0gMSwKLSAgICBMVk1fUFNBX0RVTU1ZID0gTFZNX01BWEVOVU0KLX0gTFZNX1BTQV9Nb2RlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZNX1BTQV9PRkYgPSAwLCBMVk1fUFNBX09OID0gMSwgTFZNX1BTQV9EVU1NWSA9IExWTV9NQVhFTlVNIH0gTFZNX1BTQV9Nb2RlX2VuOwogCiAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFZlcnNpb25OdW1iZXI7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZm9ybWF0IFguWVkuWlogKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICAgICAgKnBQbGF0Zm9ybTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgbGlicmFyeSBwbGF0Zm9ybSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0NIQVIqIHBWZXJzaW9uTnVtYmVyOyAvKiBQb2ludGVyIHRvIHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgZm9ybWF0IFguWVkuWlogKi8KKyAgICBMVk1fQ0hBUiogcFBsYXRmb3JtOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGxpYnJhcnkgcGxhdGZvcm0gdHlwZSAqLwogfSBMVk1fVmVyc2lvbkluZm9fc3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjI1LDkzICsxODgsODAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWTV9NZW1UYWJfdDsKLQogLyogTi1CYW5kIGVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgIC8qIEJhbmQgZ2FpbiBpbiBkQiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGcmVxdWVuY3k7ICAgICAgICAgICAgICAvKiBCYW5kIGNlbnRyZSBmcmVxdWVuY3kgaW4gSHogKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgLyogQmFuZCBxdWFsaXR5IGZhY3RvciAoeDEwMCkgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSU5UMTYgR2FpbjsgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCisgICAgTFZNX1VJTlQxNiBGcmVxdWVuY3k7IC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgUUZhY3RvcjsgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICh4MTAwKSAqLwogfSBMVk1fRVFOQl9CYW5kRGVmX3Q7CiAKIC8qIEhlYWRyb29tIGJhbmQgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTGltaXRfTG93OyAgICAgICAgICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMaW1pdF9IaWdoOyAgICAgICAgICAgICAvKiBIaWdoIGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBIZWFkcm9vbV9PZmZzZXQ7ICAgICAgICAvKiBIZWFkcm9vbSA9IGJpZ2dlc3QgYmFuZCBnYWluIC0gSGVhZHJvb21fT2Zmc2V0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQxNiBMaW1pdF9Mb3c7ICAgICAgLyogTG93IGZyZXF1ZW5jeSBsaW1pdCBvZiB0aGUgYmFuZCBpbiBIZXJ0eiAqLworICAgIExWTV9VSU5UMTYgTGltaXRfSGlnaDsgICAgIC8qIEhpZ2ggZnJlcXVlbmN5IGxpbWl0IG9mIHRoZSBiYW5kIGluIEhlcnR6ICovCisgICAgTFZNX0lOVDE2IEhlYWRyb29tX09mZnNldDsgLyogSGVhZHJvb20gPSBiaWdnZXN0IGJhbmQgZ2FpbiAtIEhlYWRyb29tX09mZnNldCAqLwogfSBMVk1fSGVhZHJvb21CYW5kRGVmX3Q7CiAKIC8qIENvbnRyb2wgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsgICAgICAgICAgLyogQnVuZGxlIG9wZXJhdGluZyBtb2RlIE9uL0J5cGFzcyAqLwotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLwotICAgIExWTV9Gb3JtYXRfZW4gICAgICAgICAgICAgICBTb3VyY2VGb3JtYXQ7ICAgICAgICAgICAvKiBJbnB1dCBkYXRhIGZvcm1hdCAqLwotICAgIExWTV9PdXRwdXREZXZpY2VUeXBlX2VuICAgICBTcGVha2VyVHlwZTsgICAgICAgICAgICAvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KKyAgICBMVk1fTW9kZV9lbiBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAgLyogQnVuZGxlIG9wZXJhdGluZyBtb2RlIE9uL0J5cGFzcyAqLworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9Gb3JtYXRfZW4gU291cmNlRm9ybWF0OyAgICAgICAgICAvKiBJbnB1dCBkYXRhIGZvcm1hdCAqLworICAgIExWTV9PdXRwdXREZXZpY2VUeXBlX2VuIFNwZWFrZXJUeXBlOyAvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KIAogICAgIC8qIENvbmNlcnQgU291bmQgVmlydHVhbGl6ZXIgcGFyYW1ldGVycyovCi0gICAgTFZNX01vZGVfZW4gICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZTsgLyogVmlydHVhbGl6ZXIgb3BlcmF0aW5nIG1vZGUgT24vT2ZmICovCi0gICAgTFZNX1ZpcnR1YWxpemVyVHlwZV9lbiAgICAgIFZpcnR1YWxpemVyVHlwZTsgICAgICAgICAgLyogVmlydHVhbGl6ZXIgdHlwZTogQ29uY2VydFNvdW5kICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7ICAgLyogVmlydHVhbGl6ZXIgcmV2ZXJiIGxldmVsIGluICUgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgQ1NfRWZmZWN0TGV2ZWw7ICAgICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGVmZmVjdCBsZXZlbCAqLworICAgIExWTV9Nb2RlX2VuIFZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZTsgICAvKiBWaXJ0dWFsaXplciBvcGVyYXRpbmcgbW9kZSBPbi9PZmYgKi8KKyAgICBMVk1fVmlydHVhbGl6ZXJUeXBlX2VuIFZpcnR1YWxpemVyVHlwZTsgLyogVmlydHVhbGl6ZXIgdHlwZTogQ29uY2VydFNvdW5kICovCisgICAgTFZNX1VJTlQxNiBWaXJ0dWFsaXplclJldmVyYkxldmVsOyAgICAgIC8qIFZpcnR1YWxpemVyIHJldmVyYiBsZXZlbCBpbiAlICovCisgICAgTFZNX0lOVDE2IENTX0VmZmVjdExldmVsOyAgICAgICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsICovCiAKICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fRVFOQl9Nb2RlX2VuICAgICAgICAgICAgRVFOQl9PcGVyYXRpbmdNb2RlOyAgICAgLyogTi1CYW5kIEVxdWFsaXNlciBvcGVyYXRpbmcgbW9kZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBFUU5CX05CYW5kczsgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAgICAgKnBFUU5CX0JhbmREZWZpbml0aW9uOyAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fRVFOQl9Nb2RlX2VuIEVRTkJfT3BlcmF0aW5nTW9kZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX1VJTlQxNiBFUU5CX05CYW5kczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90KiBwRVFOQl9CYW5kRGVmaW5pdGlvbjsgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KIAogICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIExWTV9CRV9Nb2RlX2VuICAgICAgICAgICAgICBCRV9PcGVyYXRpbmdNb2RlOyAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEJFX0VmZmVjdExldmVsOyAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgZWZmZWN0IGxldmVsICovCi0gICAgTFZNX0JFX0NlbnRyZUZyZXFfZW4gICAgICAgIEJFX0NlbnRyZUZyZXE7ICAgICAgICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9CRV9GaWx0ZXJTZWxlY3RfZW4gICAgICBCRV9IUEY7ICAgICAgICAgICAgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGhpZ2ggcGFzcyBmaWx0ZXIgc2VsZWN0b3IgKi8KKyAgICBMVk1fQkVfTW9kZV9lbiBCRV9PcGVyYXRpbmdNb2RlOyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IG9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0lOVDE2IEJFX0VmZmVjdExldmVsOyAgICAgICAgICAgLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KKyAgICBMVk1fQkVfQ2VudHJlRnJlcV9lbiBCRV9DZW50cmVGcmVxOyAvKiBCYXNzIEVuaGFuY2VtZW50IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fQkVfRmlsdGVyU2VsZWN0X2VuIEJFX0hQRjsgICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IGhpZ2ggcGFzcyBmaWx0ZXIgc2VsZWN0b3IgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVm9sdW1lIENvbnRyb2wgc2V0dGluZyBpbiBkQnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVkNfQmFsYW5jZTsgICAgICAgICAgICAgLyogTGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgKC05NiB0byA5NiBkQiksIC12ZSB2YWx1ZXMgcmVkdWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsKi8KKyAgICBMVk1fSU5UMTYgVkNfRWZmZWN0TGV2ZWw7IC8qIFZvbHVtZSBDb250cm9sIHNldHRpbmcgaW4gZEJzICovCisgICAgTFZNX0lOVDE2IFZDX0JhbGFuY2U7ICAgICAvKiBMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiAoLTk2IHRvIDk2IGRCKSwgLXZlIHZhbHVlcyByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsKi8KIAogICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1RFX01vZGVfZW4gICAgICAgICAgICAgIFRFX09wZXJhdGluZ01vZGU7ICAgICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBPbi9PZmYgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVEVfRWZmZWN0TGV2ZWw7ICAgICAgICAgLyogVHJlYmxlIEVuaGFuY2VtZW50IGdhaW4gZEJzICovCisgICAgTFZNX1RFX01vZGVfZW4gVEVfT3BlcmF0aW5nTW9kZTsgLyogVHJlYmxlIEVuaGFuY2VtZW50IE9uL09mZiAqLworICAgIExWTV9JTlQxNiBURV9FZmZlY3RMZXZlbDsgICAgICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBnYWluIGRCcyAqLwogCiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCi0gICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7Ci0gICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBDaE1hc2s7Ci0jZW5kaWYKKyAgICBMVk1fUFNBX01vZGVfZW4gUFNBX0VuYWJsZTsKKyAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gUFNBX1BlYWtEZWNheVJhdGU7IC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyIENoTWFzazsKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCiAvKiBJbnN0YW5jZSBQYXJhbWV0ZXIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVk1fQnVmZmVyTW9kZV9lbiAgICAgICAgICAgQnVmZmVyTW9kZTsgICAgICAgICAgICAgLyogQnVmZmVyIG1hbmFnZW1lbnQgbW9kZSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLworICAgIExWTV9CdWZmZXJNb2RlX2VuIEJ1ZmZlck1vZGU7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IG1vZGUgKi8KKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsgICAgICAvKiBNYXhpbXVtIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSAqLwogCiAgICAgLyogTi1CYW5kIEVxdWFsaXNlciAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBFUU5CX051bUJhbmRzOyAgICAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBlcXVhbGlzZXIgYmFuZHMgKi8KKyAgICBMVk1fVUlOVDE2IEVRTkJfTnVtQmFuZHM7IC8qIE1heGltdW0gbnVtYmVyIG9mIGVxdWFsaXNlciBiYW5kcyAqLwogCiAgICAgLyogUFNBICovCi0gICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9JbmNsdWRlZDsgICAgICAgICAgICAvKiBDb250cm9scyB0aGUgaW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFBTQTogT04vT0ZGICovCisgICAgTFZNX1BTQV9Nb2RlX2VuIFBTQV9JbmNsdWRlZDsgLyogQ29udHJvbHMgdGhlIGluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBQU0E6IE9OL09GRiAqLwogfSBMVk1fSW5zdFBhcmFtc190OwogCiAvKiBIZWFkcm9vbSBtYW5hZ2VtZW50IHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0hlYWRyb29tX01vZGVfZW4gICAgICAgIEhlYWRyb29tX09wZXJhdGluZ01vZGU7IC8qIEhlYWRyb29tIENvbnRyb2wgT24vT2ZmICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgICAgICpwSGVhZHJvb21EZWZpbml0aW9uOyAgIC8qIFBvaW50ZXIgdG8gaGVhZHJvb20gYmFuZHMgZGVmaW5pdGlvbiAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOSGVhZHJvb21CYW5kczsgICAgICAgICAvKiBOdW1iZXIgb2YgaGVhZHJvb20gYmFuZHMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSGVhZHJvb21fTW9kZV9lbiBIZWFkcm9vbV9PcGVyYXRpbmdNb2RlOyAvKiBIZWFkcm9vbSBDb250cm9sIE9uL09mZiAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCogcEhlYWRyb29tRGVmaW5pdGlvbjsgIC8qIFBvaW50ZXIgdG8gaGVhZHJvb20gYmFuZHMgZGVmaW5pdGlvbiAqLworICAgIExWTV9VSU5UMTYgTkhlYWRyb29tQmFuZHM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBoZWFkcm9vbSBiYW5kcyAqLwogCiB9IExWTV9IZWFkcm9vbVBhcmFtc190OwogCkBAIC0zMzksNTUgKzI4OSwxOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0VmVyc2lvbkluZm8oTFZNX1ZlcnNpb25JbmZvX3N0ICAqcFZlcnNpb24pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RQYXJhbXMgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAqLwotLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRWZXJzaW9uSW5mbyhMVk1fVmVyc2lvbkluZm9fc3QqIHBWZXJzaW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLwotLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBwb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5OSw5ICszMTIsMjQgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICpwSW5zdFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWTV9JbnN0UGFyYW1zX3QqIHBJbnN0UGFyYW1zKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQyMSw3ICszNDksNyBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NDMsOCArMzcxLDcgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ2Niw4ICszOTMsNyBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDk5LDExICs0MjUsOCBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMsIExWTV9VSU5UMzIgQXVkaW9UaW1lKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUyNCw4ICs0NDcsOCBAQAogLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICpwSGVhZHJvb21QYXJhbXMpOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0SGVhZHJvb21QYXJhbXMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190KiBwSGVhZHJvb21QYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQ2LDggKzQ2OSw4IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NzQsMTAgKzQ5Nyw4IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bSggTFZNX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwQ3VycmVudFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bShMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fVUlOVDgqIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBQYXN0UGVha3MsIExWTV9JTlQzMiBBdWRpb1RpbWUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTk5LDggKzUyMCw2IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAotI2VuZGlmICAgICAgLyogX19MVk1fSF9fICovCi0KKyNlbmRpZiAvKiBfX0xWTV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKaW5kZXggZTI0MWNkZC4uY2VhOTY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jcHAKQEAgLTQ3LDY5ICs0Nyw1MiBAQAogLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0U3BlY3RydW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcEN1cnJlbnRQZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgICpwSW5zdGFuY2UgICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRTcGVjdHJ1bShMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fVUlOVDgqIHBDdXJyZW50UGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBQYXN0UGVha3MsIExWTV9JTlQzMiBBdWRpb1RpbWUpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICpoUFNBSW5zdGFuY2U7Ci0gICAgTFZQU0FfUkVUVVJOICAgICAgICAgICBMVlBTQV9TdGF0dXM7CisgICAgcExWUFNBX0hhbmRsZV90KiBoUFNBSW5zdGFuY2U7CisgICAgTFZQU0FfUkVUVVJOIExWUFNBX1N0YXR1czsKIAotICAgIGlmKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLwotICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkICE9IExWTV9QU0FfT04pIHsKICAgICAgICAgcmV0dXJuIExWTV9TVUNDRVNTOwogICAgIH0KIAotICAgIGhQU0FJbnN0YW5jZSA9IChwTFZQU0FfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKKyAgICBoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90KilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKIAotICAgIGlmKChwQ3VycmVudFBlYWtzID09IExWTV9OVUxMKSB8fAotICAgICAgICAocFBhc3RQZWFrcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocEN1cnJlbnRQZWFrcyA9PSBMVk1fTlVMTCkgfHwgKHBQYXN0UGVha3MgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CiAgICAgfQogCiAgICAgLyogSWYgUFNBIG1vZHVsZSBpcyBkaXNhYmxlZCwgZG8gbm90aGluZyAqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGU9PUxWTV9QU0FfT0ZGKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09GRikgewogICAgICAgICByZXR1cm4gTFZNX0FMR09SSVRITURJU0FCTEVEOwogICAgIH0KIAotICAgIExWUFNBX1N0YXR1cyA9IExWUFNBX0dldFNwZWN0cnVtKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZQU0FfVGltZSkgKEF1ZGlvVGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBDdXJyZW50UGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UOCopIHBQYXN0UGVha3MgKTsKKyAgICBMVlBTQV9TdGF0dXMgPSBMVlBTQV9HZXRTcGVjdHJ1bShoUFNBSW5zdGFuY2UsIChMVlBTQV9UaW1lKShBdWRpb1RpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDgqKXBDdXJyZW50UGVha3MsIChMVk1fVUlOVDgqKXBQYXN0UGVha3MpOwogCi0gICAgaWYoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgIHsKLSAgICAgICAgaWYoTFZQU0FfU3RhdHVzID09IExWUFNBX0VSUk9SX1dST05HVElNRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fV1JPTkdBVURJT1RJTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9OVUxMQUREUkVTUzsKKyAgICBpZiAoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgIGlmIChMVlBTQV9TdGF0dXMgPT0gTFZQU0FfRVJST1JfV1JPTkdUSU1FKSB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZNX1dST05HQVVESU9USU1FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWTV9OVUxMQUREUkVTUzsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTMyLDE1ICsxMTUsMTIgQEAKIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKCBMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKIAogICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KLSAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgRXJyb3IgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCBwUGFyYW1zKTsKICAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX1RSVUU7CiAgICAgcmV0dXJuIEVycm9yOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAKaW5kZXggM2FlZGRiYi4uMWQ5MTNkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcApAQCAtNDksMTA5ICs0OSw5MCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0lOVDE2ICAgICAgICBTYW1wbGVDb3VudDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCB0aGlzIGNhbGwgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgIE51bVNhbXBsZXM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwotICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKLSNlbmRpZgordm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqKiBwUHJvY2Vzc2VkLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JTlQxNiBTYW1wbGVDb3VudDsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLworICAgIExWTV9JTlQxNiBOdW1TYW1wbGVzOyAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KKyAgICBMVk1fRkxPQVQqIHBTdGFydDsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0J1ZmZlcl90KiBwQnVmZmVyOworICAgIExWTV9GTE9BVCogcERlc3Q7CisgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwogICAgICAqLwotICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOworICAgIHBCdWZmZXIgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CiAgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKICAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcwogICAgICAgICAgKi8KICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOwotICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RDQUxMOwogICAgIH0KLSAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7ICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzICovCi0gICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyB0byBvdXRwdXQgaXMgc2FtZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyAgICBwU3RhcnQgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7IC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAwOyAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCBhbmQgdXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKLSAgICB7CisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpIHsKICAgICAgICAgLyoKICAgICAgICAgICogUHJvY2VzcyB0aGUgbWF4aW11bSBib2NrIHNpemUgb2Ygc2FtcGxlcy4KICAgICAgICAgICovCiAgICAgICAgIFNhbXBsZUNvdW50ID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBMYXN0IGNhbGwgZm9yIHRoZSBibG9jaywgc28gY2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyBhbmQgc2FtcGxlcyB0byBwcm9jZXNzCi0gICAgICAgICAgKi8KLSAgICAgICAgTFZNX0lOVDE2ICAgTnVtRnJhbWVzOworICAgICAgICAgKi8KKyAgICAgICAgTFZNX0lOVDE2IE51bUZyYW1lczsKIAotICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgTnVtRnJhbWVzICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwogICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKICAgICAgICAgICovCi0gICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQotICAgICAgICB7CisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB7CiAgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7IC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KIAogICAgIC8qCiAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGRlbGF5IGJ1ZmZlciBhcyByZXF1aXJlZAogICAgICAqLwotICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCi0gICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkKLSAgICB7Ci0gICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAvKiBOdW1iZXIgb2YgZGVsYXkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLworICAgIGlmICgoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8IChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpICYmCisgICAgICAgIChwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyAhPSAwKSkgeworICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgbGVmdCBhbmQgcmlnaHQgKi8KICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSBzYW1wbGUgY291bnQgKi8KLSAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgLyogVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyICovCiAgICAgfQogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzIGZvciB0aGlzIGNhbGwgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiAwKQotICAgIHsKLSAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCisgICAgaWYgKE51bVNhbXBsZXMgPiAwKSB7CisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICBwU3RhcnQgKz0gTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKQEAgLTE2MSwzMyArMTQyLDMwIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgICogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgYW5kIGlucHV0IHBvaW50ZXIKKyAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgogICAgICAqLwogICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLwotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7Ci0gICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOworICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCiAKICAgICAvKgogICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCiAgICAgICovCi0gICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCi0gICAgeworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpIHx8IChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpKSB7CiAgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7Ci0gICAgICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLSAgICAgICAgcFN0YXJ0ICAgICs9IE51bUNoYW5uZWxzICogU2FtcGxlQ291bnQ7IC8qIE9mZnNldCBieSB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0gICAgICAgIGlmIChOdW1TYW1wbGVzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBTdGFydCA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCArPSBOdW1DaGFubmVscyAqIFNhbXBsZUNvdW50OyAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKSB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogTnVtU2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogVXBkYXRlIHRoZSBkZWxheSBzYW1wbGUgY291bnQKICAgICAgICAgICovCi0gICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICAgICA9IE51bVNhbXBsZXM7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLworICAgICAgICBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyA9IE51bVNhbXBsZXM7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCiAgICAgfQogfQogCkBAIC0yMTMsMzMgKzE5MSwyNSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK3ZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZEluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCoqIHBUb1Byb2Nlc3MsIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCi0gICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKSB7CisgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKnBOdW1TYW1wbGVzOyAvKiBHZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gZmlyc3QgY2FsbCAqLworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgPSAqcFRvUHJvY2VzczsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBJL08gcG9pbnRlcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9ICpwUHJvY2Vzc2VkOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKSB7CiAgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI5LDMyICsyOTksMTcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Cit2b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsIExWTV9GTE9BVCoqIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqKiBwUHJvY2Vzc2VkLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgd2hpY2ggbW9kZSwgbWFuYWdlZCBvciB1bm1hbmFnZWQKICAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4oaEluc3RhbmNlLCBwSW5EYXRhLCBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBwTnVtU2FtcGxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluKGhJbnN0YW5jZSwgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgcE51bVNhbXBsZXMpOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzc3LDE5NiArMzMyLDEyNCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7Cit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCogcEJ1ZmZlciA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2IFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2IE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUKiBwU3RhcnQ7CisgICAgTFZNX0ZMT0FUKiBwRGVzdDsKKyAgICBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKICNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKICAgICAgKi8KICAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwotICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICBwU3RhcnQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawotICAgICAgKi8KLSAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCi0gICAgeworICAgICAqLworICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgewogICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBkZXN0aW5hdGlvbiAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7IC8qIEluaXRpYWxpc2UgdGhlIGRlc3RpbmF0aW9uICovCiAgICAgfQotICAgIHBEZXN0ID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCiAKICAgICAvKgogICAgICAqIElmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub24temVybyB0aGVuIHRoZXJlIGFyZSBzdGlsbCBzYW1wbGVzIHRvIHNlbmQgdG8KICAgICAgKiB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAqLwotICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgotICAgICAgICAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApKQotICAgIHsKKyAgICBpZiAoKE51bVNhbXBsZXMgIT0gMCkgJiYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAhPSAwKSkgewogICAgICAgICAvKgogICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA8PSBOdW1TYW1wbGVzKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0jZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSNlbmRpZgorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLwotI2VuZGlmCi0gICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgdG8gdGhlIG91dHB1dAogICAgICAqLwotICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgotICAgICAgICAoU2FtcGxlQ291bnQgIT0gMCkpCi0gICAgewotICAgICAgICBpZiAoU2FtcGxlQ291bnQgPD0gTnVtU2FtcGxlcykKLSAgICAgICAgeworICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJiAoU2FtcGxlQ291bnQgIT0gMCkpIHsKKyAgICAgICAgaWYgKFNhbXBsZUNvdW50IDw9IE51bVNhbXBsZXMpIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IGFsbCBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBwRGVzdCAgICAgICs9IE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgotICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIEZyYW1lQ291bnQ7ICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCisgICAgICAgICAgICBTYW1wbGVDb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbmRpZgorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cwotICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICBwU3RhcnQgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZWxzZQotICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgotICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RhcnQgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKgogICAgICAqIENvcHkgdGhlIHJlbWFpbmluZyBwcm9jZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlcgogICAgICAqLwotICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbHNlCi0gICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogRnJhbWVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTU3NCwxMCArNDU3LDEwIEBACiAgICAgLyoKICAgICAgKiBwb2ludGVycywgY291bnRzIGFuZCBzZXQgZGVmYXVsdCBidWZmZXIgcHJvY2Vzc2luZwogICAgICAqLwotICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSAgICAgID0gTFZNX01BWEJMT0NLQ0FMTDsgICAgICAgICAgICAgICAgICAgLyogU2V0IGZvciB0aGUgZGVmYXVsdCBjYWxsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCisgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gTnVtU2FtcGxlczsgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwRGVzdDsgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTUFYQkxPQ0tDQUxMOyAvKiBTZXQgZm9yIHRoZSBkZWZhdWx0IGNhbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBzaXplICovCiAgICAgLyogVGhpcyB3aWxsIHRlcm1pbmF0ZSB0aGUgbG9vcCB3aGVuIGFsbCBzYW1wbGVzIHByb2Nlc3NlZCAqLwogICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKIH0KQEAgLTYwMSw0NCArNDg0LDI3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoTFZNX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIC8qIE1vbm8gaW5wdXQgaXMgcHJvY2Vzc2VkIGFzIHN0ZXJlbyBieSBMVk0gbW9kdWxlICovCi0gICAgICAgIE51bUNoYW5uZWxzID0gMjsKLSAgICB9Cit2b2lkIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX1VJTlQxNiogcE51bVNhbXBsZXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogI3VuZGVmIE5yRnJhbWVzCi0jZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpIC8vIGFsaWFzIGZvciBjbGFyaXR5Ci0jZWxzZQotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotI2VuZGlmCisjZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpICAvLyBhbGlhcyBmb3IgY2xhcml0eQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgc2FtcGxlIGNvdW50cwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKLSNlbHNlCi0gICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIDIpOwotI2VuZGlmCi0gICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtICpwTnVtU2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50ICovCisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICs9CisgICAgICAgICAgICAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiBOdW1DaGFubmVscyk7IC8qIFVwZGF0ZSB0aGUgSS9PIHBvaW50ZXJzICovCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyArPSAoTFZNX0lOVDE2KShOckZyYW1lcyAqIE51bUNoYW5uZWxzKTsKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPQorICAgICAgICAgICAgKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KIAogICAgIC8qCiAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcwogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkgewogICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKICAgICB9CiB9CkBAIC02OTgsMjUgKzU2NCwxNSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwordm9pZCBMVk1fQnVmZmVyT3V0KExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLCBwT3V0RGF0YSwgcE51bVNhbXBsZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoaEluc3RhbmNlLCBwTnVtU2FtcGxlcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCmluZGV4IDgxMmY4ZTUuLmMwMmNhYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKQEAgLTI0LDgzMiArMjQsODMyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUcmVibGVCb29zdENvcm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCi0jZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBUcmVibGVCb29zdENvcm5lciA4MDAwCisjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSA0CisjZGVmaW5lIFRyZWJsZUJvb3N0U3RlcHMgMTUKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAyMjA1MEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMzg0MzQKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzE1OTkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA4MTU1NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4ODQ3NQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTI5OTQzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjQwMDkwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xODQyMzIKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODU4MDEKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI0NTE0NQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNDg4NwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzEzNDkxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDU2NTQxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zOTAxNzcKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAyMDE0NCkKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNzAwMzMKLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NjIxOQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTA2MTg3KQotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM3MDAzMwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTcyNzYxCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDI3MjgpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgxMDgyCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwNDkpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODAyNjIwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40MzI1ODgpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTM4OTg5Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41Njg5NTYpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxOTk3Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43MjE5NjQpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjYzNjc0Ci0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44OTM2NDEpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDU2MzAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wODYyNjcpCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzcwMDMzCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwIDEuMDM4NDM0CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0ExIDAuMzMxNTk5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EwIDEuMDgxNTU3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0ExIDAuMjg4NDc1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EwIDEuMTI5OTQzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExIDAuMjQwMDkwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwIDEuMTg0MjMyCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0ExIDAuMTg1ODAxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EwIDEuMjQ1MTQ1CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0ExIDAuMTI0ODg3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EwIDEuMzEzNDkxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExIDAuMDU2NTQxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwIDEuMzkwMTc3CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICgtMC4wMjAxNDQpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwIDEuNDc2MjE5CisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICgtMC4xMDYxODcpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwIDEuNTcyNzYxCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICgtMC4yMDI3MjgpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IxIDAuMzcwMDMzCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgMS42ODEwODIKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0ExICgtMC4zMTEwNDkpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTAgMS44MDI2MjAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICgtMC40MzI1ODgpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQTAgMS45Mzg5ODkKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0ExICgtMC41Njg5NTYpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgMi4wOTE5OTcKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0ExICgtMC43MjE5NjQpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTAgMi4yNjM2NzQKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICgtMC44OTM2NDEpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQTAgMi40NTYzMDAKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0ExICgtMS4wODYyNjcpCisjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgMC4zNzAwMzMKKyNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDI0MDAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA0NDY2MgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyMzI4NwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk0NzczCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTczMTc2Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xNTA5OTkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMTY5NTAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIxNDA4NgotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1Mzg2MwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjg0ODcwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMTY5MjEpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM2NDI5MQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTYzNDIpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTM0MDMKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE4NTQ1NCkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNjc5NDkKLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjU1MzM4OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg1NDQwKQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2Nzk0OQotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjY1NTc0Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTc2MjUpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzkxNDQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41MjM0OTkpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTMyNjgyCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NjQ3MzMpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDkxMTQ4Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjMxOTkpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjY4OTUwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wMDEwMDEpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDY4NDQ3Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yMDA0OTgpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjkyMjg3Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40MjQzMzgpCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjY3OTQ5Ci0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwIDEuMDQ0NjYyCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0ExIDAuMjIzMjg3CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EwIDEuMDk0NzczCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0ExIDAuMTczMTc2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EwIDEuMTUwOTk5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExIDAuMTE2OTUwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwIDEuMjE0MDg2CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0ExIDAuMDUzODYzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EwIDEuMjg0ODcwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0ExICgtMC4wMTY5MjEpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EwIDEuMzY0MjkxCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0ExICgtMC4wOTYzNDIpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EwIDEuNDUzNDAzCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0ExICgtMC4xODU0NTQpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EwIDEuNTUzMzg5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0ExICgtMC4yODU0NDApCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EwIDEuNjY1NTc0CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0ExICgtMC4zOTc2MjUpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxIDAuMjY3OTQ5CisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQTAgMS43OTE0NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0ExICgtMC41MjM0OTkpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgMS45MzI2ODIKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0ExICgtMC42NjQ3MzMpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTAgMi4wOTExNDgKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICgtMC44MjMxOTkpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQTAgMi4yNjg5NTAKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0ExICgtMS4wMDEwMDEpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgMi40Njg0NDcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0ExICgtMS4yMDA0OTgpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTAgMi42OTIyODcKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICgtMS40MjQzMzgpCisjZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQjEgMC4yNjc5NDkKKyNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDMyMDAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA2MTAwOQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDYxMDA5KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEyOTQ2MwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjEyOTQ2MykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMDYyNjcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMDYyNjcpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yOTI0NDcKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MjQ0NykKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM4OTE0MAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzg5MTQwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5NzYzMQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ5NzYzMSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MTkzNjEKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42MTkzNjEpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzU1OTQzCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzU1OTQzKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjkwOTE5MQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjkwOTE5MSkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDgxMTM5Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDgxMTM5KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjI3NDA2NwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjc0MDY3KQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDkwNTM2Ci0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQ5MDUzNikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDAwMDApCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMi43MzM0MTgKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjczMzQxOCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4wMDU5MzYKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAwNTkzNikKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjMxMTcwNwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4zMTE3MDcpCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EwIDEuMDYxMDA5CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0ExICgtMC4wNjEwMDkpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwIDEuMTI5NDYzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0ExICgtMC4xMjk0NjMpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EwIDEuMjA2MjY3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICgtMC4yMDYyNjcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EwIDEuMjkyNDQ3CisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0ExICgtMC4yOTI0NDcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwIDEuMzg5MTQwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0ExICgtMC4zODkxNDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EwIDEuNDk3NjMxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICgtMC40OTc2MzEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EwIDEuNjE5MzYxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0ExICgtMC42MTkzNjEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwIDEuNzU1OTQzCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0ExICgtMC43NTU5NDMpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EwIDEuOTA5MTkxCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICgtMC45MDkxOTEpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IxICgtMC4wMDAwMDApCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQTAgMi4wODExMzkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICgtMS4wODExMzkpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTAgMi4yNzQwNjcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0ExICgtMS4yNzQwNjcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgMi40OTA1MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0ExICgtMS40OTA1MzYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQTAgMi43MzM0MTgKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICgtMS43MzM0MTgpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTAgMy4wMDU5MzYKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0ExICgtMi4wMDU5MzYpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgMy4zMTE3MDcKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0ExICgtMi4zMTE3MDcpCisjZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQjEgKC0wLjAwMDAwMCkKKyNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDQ0MTAwSHogKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA3NDM2NAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjkzMjU3KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTU3ODAxCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNzY2OTUpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1MTQyMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC40NzAzMTMpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNTY0NjEKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NTM1NSkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ3NDMyMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjkzMjEzKQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MDY1NTkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODI1NDUzKQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43NTQ5MzUKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTczODI4KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTIxNDE0Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDAzMDgpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4xMDgyMDgKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMyNzEwMSkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMxNzc5MwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MzY2ODcpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41NTI5NTIKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzcxODQ2KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE2ODA1Ci0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjAzNTY5OCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTg4OTQpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMTI4NTIKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzMTc0NikKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjQ0NTAyMwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi42NjM5MTYpCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjE4ODk0KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy44MTc3MjQKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMDM2NjE4KQotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxODg5NCkKLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMCAxLjA3NDM2NAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAoLTAuMjkzMjU3KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMCAxLjE1NzgwMQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMSAoLTAuMzc2Njk1KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAxLjI1MTQyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMSAoLTAuNDcwMzEzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMCAxLjM1NjQ2MQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAoLTAuNTc1MzU1KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMCAxLjQ3NDMyMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMSAoLTAuNjkzMjEzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAxLjYwNjU1OQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMSAoLTAuODI1NDUzKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMCAxLjc1NDkzNQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAoLTAuOTczODI4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMCAxLjkyMTQxNAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMSAoLTEuMTQwMzA4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAyLjEwODIwOAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMSAoLTEuMzI3MTAxKQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMSAoLTAuMjE4ODk0KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwIDIuMzE3NzkzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMSAoLTEuNTM2Njg3KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwIDIuNTUyOTUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9BMSAoLTEuNzcxODQ2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwIDIuODE2ODA1CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAoLTIuMDM1Njk4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwIDMuMTEyODUyCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMSAoLTIuMzMxNzQ2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwIDMuNDQ1MDIzCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9BMSAoLTIuNjYzOTE2KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwIDMuODE3NzI0CisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAoLTMuMDM2NjE4KQorI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICgtMC4yMTg4OTQpCisjZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9CMiAwLjAwMDAwMAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDc3MzU3Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMzQ1MzA2KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NDE1MgotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQzMjEwMSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNjE1MzgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41Mjk0ODgpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjM3MDgwNwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42Mzg3NTcpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ5MzQwOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjEzNTkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS42MzA5NzEKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg5ODkyMCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc4NTMxOAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMDUzMjY3KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTg0OTgKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjI2NDQ3KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE1MjgwOQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyMDc1OCkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzcwODI5Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNjM4Nzc4KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjE1NDUyCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg4MzQwMSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg4OTkyNAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xNTc4NzMpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTk3ODg2Ci0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi40NjU4MzUpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yNjc5NDkpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDM0MjUKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuODExMzc0KQotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMy45MzExMjcKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4xOTkwNzYpCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2Nzk0OSkKLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCisvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EwIDEuMDc3MzU3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0ExICgtMC4zNDUzMDYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwIDEuMTY0MTUyCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0ExICgtMC40MzIxMDEpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EwIDEuMjYxNTM4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICgtMC41Mjk0ODgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EwIDEuMzcwODA3CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0ExICgtMC42Mzg3NTcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwIDEuNDkzNDA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0ExICgtMC43NjEzNTkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EwIDEuNjMwOTcxCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICgtMC44OTg5MjApCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EwIDEuNzg1MzE4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0ExICgtMS4wNTMyNjcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwIDEuOTU4NDk4CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0ExICgtMS4yMjY0NDcpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EwIDIuMTUyODA5CisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICgtMS40MjA3NTgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IxICgtMC4yNjc5NDkpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQTAgMi4zNzA4MjkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICgtMS42Mzg3NzgpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTAgMi42MTU0NTIKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0ExICgtMS44ODM0MDEpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgMi44ODk5MjQKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0ExICgtMi4xNTc4NzMpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQTAgMy4xOTc4ODYKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICgtMi40NjU4MzUpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTAgMy41NDM0MjUKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0ExICgtMi44MTEzNzQpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgMy45MzExMjcKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0ExICgtMy4xOTkwNzYpCisjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjEgKC0wLjI2Nzk0OSkKKyNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyIDAuMDAwMDAwCiAKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgODgyMDAgKi8KIC8qIEdhaW4gPSAxLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wOTQzNzRmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjQxMjU2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTAgMS4wOTQzNzRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0ExICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMCAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgKC0wLjc0NzE0NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMzE5MDc0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg2NTk1NmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwIDEuMzE5MDc0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMSAoLTAuODY1OTU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS40NTIzODBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuOTk5MjYzZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTAgMS40NTIzODBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0ExICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMCAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgKC0xLjE0ODgzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNzY5Nzc3ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjMxNjY1OWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwIDEuNzY5Nzc3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMSAoLTEuMzE2NjU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSA3LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS45NTgwNzhmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNTA0OTYwZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTAgMS45NTgwNzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0ExICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMCAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgKC0xLjcxNjIzOGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNDA2NDEyZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk1MzI5NWYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwIDIuNDA2NDEyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMSAoLTEuOTUzMjk1ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY3MjM5NWYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjE5Mjc3ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0EwIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgKC0yLjIxOTI3N2YpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEwX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi45NzA4MzJmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjUxNzcxNGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCAyLjk3MDgzMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0ExICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMV9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjExX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgMy4zMDU2ODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9BMSAoLTIuODUyNTY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEyX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xMl9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjY4MTM5NGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMjI4Mjc2ZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKLSNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0EwIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgKC0zLjIyODI3NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xM19BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjEzX0IxICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC4xMDI5NDdmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjY0OTgzMGYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU0Njg4MmYpCi0jZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCA0LjEwMjk0N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0ExICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNF9CMSAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE0X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQotI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgNC41NzU5MzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9BMSAoLTQuMTIyODIwZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjE1X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgKC0wLjU0Njg4MmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xNV9CMiAwLjAwMDAwMGYKIAogLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA5NjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDk2MjMzCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjczNTgzKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwNDIwOAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc4MTU1OCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zMjUzNTgKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45MDI3MDgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ2MTI5MQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4wMzg2NDEpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYxMzgxMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xOTExNjApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43ODQ5MzkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjM2MjI4OSkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuOTc2OTQ5Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41NTQyOTkpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE5MjM4NwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43Njk3MzgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW44X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTc3MzUwKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi40MzQxMTMKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wMTE0NjQpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyLjcwNTMzNQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTIuMjgyNjg1KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMDA5NjUwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjU4NzAwMCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4zNTEwOTcKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTI4NDQ3KQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNzM0MjA3Ci0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zMTE1NTgpCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0LjE2NDA2NAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc0MTQxNCkKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjQ2MzcxCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjIzNzIxKQotI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NzczNTApCi0jZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAorLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMCAxLjA5NjIzMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMSAoLTAuNjczNTgzKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMCAxLjIwNDIwOAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMSAoLTAuNzgxNTU4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMCAxLjMyNTM1OAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMSAoLTAuOTAyNzA4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMCAxLjQ2MTI5MQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMSAoLTEuMDM4NjQxKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMCAxLjYxMzgxMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMSAoLTEuMTkxMTYwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMCAxLjc4NDkzOQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMSAoLTEuMzYyMjg5KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluNl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA3LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMCAxLjk3Njk0OQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMSAoLTEuNTU0Mjk5KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMCAyLjE5MjM4NworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMSAoLTEuNzY5NzM4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMCAyLjQzNDExMworI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMSAoLTIuMDExNDY0KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMSAoLTAuNTc3MzUwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluOV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwIDIuNzA1MzM1CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9BMSAoLTIuMjgyNjg1KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEwX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0EwIDMuMDA5NjUwCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9BMSAoLTIuNTg3MDAwKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjExX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0EwIDMuMzUxMDk3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9BMSAoLTIuOTI4NDQ3KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTJfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEyX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xMl9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwIDMuNzM0MjA3CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19BMSAoLTMuMzExNTU4KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTNfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjEzX0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwIDQuMTY0MDY0CisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9BMSAoLTMuNzQxNDE0KQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE0X0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0EwIDQuNjQ2MzcxCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9BMSAoLTQuMjIzNzIxKQorI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IxICgtMC41NzczNTApCisjZGVmaW5lIEhQRl9Gczk2MDAwX0dhaW4xNV9CMiAwLjAwMDAwMAogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE3NjQwMCAqLwogLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDY3MTFmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg1NTgwN2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9BMCAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICgtMC44NTU4MDdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjFfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yMjY0NDNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3NTUzOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9BMCAxLjIyNjQ0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0ExICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMl9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4yX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAxLjM2MDc4NGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0ExICgtMS4xMDk4ODBmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4zX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS41MTE1MTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjI2MDYxM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9BMCAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICgtMS4yNjA2MTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjRfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS42ODA2NDNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjQyOTczOWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9BMCAxLjY4MDY0M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0ExICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW41X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAxLjg3MDQwNWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0ExICgtMS42MTk1MDFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjZfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW42X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wODMzMjFmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjgzMjQxN2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19BMCAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICgtMS44MzI0MTdmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjdfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluN19CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi4zMjIyMTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjA3MTMxM2YpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9BMCAyLjMyMjIxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0ExICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW44X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAyLjU5MDI2M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0ExICgtMi4zMzkzNTlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjlfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW45X0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg5MTAxNmYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjY0MDExMmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgMi44OTEwMTZmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTEgKC0yLjY0MDExMmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMjI4NDY1ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuOTc3NTYxZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAzLjIyODQ2NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSAoLTIuOTc3NTYxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy42MDcwOTBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4zNTYxODZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwIDMuNjA3MDkwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0ExICgtMy4zNTYxODZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IyIDAuMDAwMDAwZgogLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0EwICAgICAgICAgICAgICAgICAgICAgICAgICA0LjAzMTkxNGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjc4MTAxMGYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgNC4wMzE5MTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTEgKC0zLjc4MTAxMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTIgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjIgMC4wMDAwMDBmCiAvKiBHYWluID0gMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTA4NTc1ZgotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQuMjU3NjcxZikKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCA0LjUwODU3NWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSAoLTQuMjU3NjcxZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMiAwLjAwMDAwMGYKIC8qIEdhaW4gPSAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wNDMzOTdmCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC43OTI0OTNmKQotI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCi0jZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwIDUuMDQzMzk3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0ExICgtNC43OTI0OTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EyIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IyIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDE5MjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMDc4MjMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODc1MTUwKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI4ODAzCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjEzMCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjQ1NDQKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMTMxODcxKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxNjg0OQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yODQxNzYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjY4NzczNwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNDU1MDY0KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODc5NDc3Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuNjQ2ODA0KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA5NDYxMwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjg2MTk0MCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzY3MzI3KQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzM1OTk5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4xMDMzMjYpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjA2ODM5Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjM3NDE2NikKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDIuOTEwNzI2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjc4MDUzKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yNTE2OTMKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjAxOTAyMCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc2NzMyNykKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjM0MjY0Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy40MDE1OTEpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDYzNTE2Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuODMwODQzKQotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTQ1MTQ1Ci0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4zMTI0NzIpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDg1NTQyCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljg1Mjg2OCkKLSNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwIDEuMTA3ODIzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9BMSAoLTAuODc1MTUwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMV9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQTAgMS4yMjg4MDMKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0ExICgtMC45OTYxMzApCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjJfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4yX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19BMCAxLjM2NDU0NAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQTEgKC0xLjEzMTg3MSkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4zX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluM19CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjNfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0EwIDEuNTE2ODQ5CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9BMSAoLTEuMjg0MTc2KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW40X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQTAgMS42ODc3MzcKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0ExICgtMS40NTUwNjQpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjVfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW41X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9BMCAxLjg3OTQ3NworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQTEgKC0xLjY0NjgwNCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW42X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluNl9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjZfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0EwIDIuMDk0NjEzCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19BMSAoLTEuODYxOTQwKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjdfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW43X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluN19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQTAgMi4zMzU5OTkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0ExICgtMi4xMDMzMjYpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOF9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjhfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW44X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9BMCAyLjYwNjgzOQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQTEgKC0yLjM3NDE2NikKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW45X0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluOV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjlfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQTAgMi45MTA3MjYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSAoLTIuNjc4MDUzKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEwX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTBfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCAzLjI1MTY5MworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0ExICgtMy4wMTkwMjApCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTFfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjExX0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwIDMuNjM0MjY0CisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQTEgKC0zLjQwMTU5MSkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEyX0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTJfQjIgMC4wMDAwMDAKKy8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQTAgNC4wNjM1MTYKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19BMSAoLTMuODMwODQzKQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjEzX0EyIDAuMDAwMDAwCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTNfQjEgKC0wLjc2NzMyNykKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xM19CMiAwLjAwMDAwMAorLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCA0LjU0NTE0NQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0ExICgtNC4zMTI0NzIpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTRfQTIgMC4wMDAwMDAKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMSAoLTAuNzY3MzI3KQorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE0X0IyIDAuMDAwMDAwCisvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwIDUuMDg1NTQyCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQTEgKC00Ljg1Mjg2OCkKKyNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMiAwLjAwMDAwMAorI2RlZmluZSBIUEZfRnMxOTIwMDBfR2FpbjE1X0IxICgtMC43NjczMjcpCisjZGVmaW5lIEhQRl9GczE5MjAwMF9HYWluMTVfQjIgMC4wMDAwMDAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAKaW5kZXggZmYyYzkwYS4uYjJhMzVkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcApAQCAtNTAsNzggKzUwLDYyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9ICpwUGFyYW1zOwogCi0gICAgaWYoCi0gICAgICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgICAgICAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCi0gICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCi0gICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgotICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKLSNlbHNlCi0gICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8Ci0jZW5kaWYKLSAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQotICAgIHsKKyAgICBpZiAoCisgICAgICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICgocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgfHwKKyAgICAgICAgICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJgorICAgICAgICAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgfHwKKyAgICAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSB8fAorICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gcFBhcmFtcy0+TnJDaGFubmVsczsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5DaE1hc2sgICAgID0gcFBhcmFtcy0+Q2hNYXNrOwotI2VuZGlmCisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ2hNYXNrID0gcFBhcmFtcy0+Q2hNYXNrOwogICAgIC8qCiAgICAgICogQ2luZW1hIFNvdW5kIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZigocFBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpCi0gICAgeworICAgIGlmICgocFBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgIT0gTFZNX0NPTkNFUlRTT1VORCkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKLSAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocFBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPCBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCkKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPkNTX0VmZmVjdExldmVsIDwgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBOLUJhbmQgRXF1YWxpemVyCiAgICAgICovCi0gICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCiAgICAgLyogRGVmaW5pdGlvbiBwb2ludGVyICovCi0gICAgaWYgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9PSBMVk1fTlVMTCkgJiYKLSAgICAgICAgKHBQYXJhbXMtPkVRTkJfTkJhbmRzICE9IDApKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID09IExWTV9OVUxMKSAmJiAocFBhcmFtcy0+RVFOQl9OQmFuZHMgIT0gMCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIApAQCAtMTI5LDM1ICsxMTMsMzEgQEAKICAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2IGk7CiAKLSAgICAgICAgaWYgKHBQYXJhbXMtPkVRTkJfTkJhbmRzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFtcy0+RVFOQl9OQmFuZHM7IGkrKykgewogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8Ci0gICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKLSAgICB7CisgICAgaWYgKC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PRkYpICYmCisgICAgICAgICAocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09OKSkgfHwKKyAgICAgICAgKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KICAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLwogICAgIHsKICAgICAgICAgTFZNX0lOVDE2IGk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8Ci0gICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAotICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8Ci0gICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA8IExWTV9FUU5CX01JTl9CQU5EX0ZSRVEpIHx8CisgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPiBMVk1fRVFOQl9NQVhfQkFORF9GUkVRKSkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSB8fAorICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiA+IExWTV9FUU5CX01BWF9CQU5EX0dBSU4pKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSB8fAorICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciA+IExWTV9FUU5CX01BWF9RRkFDVE9SKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTY2LDI0ICsxNDYsMjUgQEAKICAgICAvKgogICAgICAqIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycwogICAgICAqLwotICAgIGlmKCgocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT0ZGKSAmJiAocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT04pKSAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCApIHx8IChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgKSl8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV81NUh6KSAmJiAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzY2SHopICAgICAgICAgICAmJgotICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzc4SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfOTBIeikpICAgICAgICAgICB8fAotICAgICAgICAoKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09GRikgJiYgKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09OKSkpCi0gICAgeworICAgIGlmICgoKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09GRikgJiYgKHBQYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgIT0gTFZNX0JFX09OKSkgfHwKKyAgICAgICAgKChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHx8CisgICAgICAgICAocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKSkgfHwKKyAgICAgICAgKChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNTVIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYKKyAgICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfOTBIeikpIHx8CisgICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZigocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPCBMVk1fVkNfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCApKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsIDwgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCkgfHwKKyAgICAgICAgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQotICAgIGlmKChwUGFyYW1zLT5WQ19CYWxhbmNlIDwgTFZNX1ZDX0JBTEFOQ0VfTUlOICkgfHwgKHBQYXJhbXMtPlZDX0JhbGFuY2UgPiBMVk1fVkNfQkFMQU5DRV9NQVggKSkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zLT5WQ19CYWxhbmNlIDwgTFZNX1ZDX0JBTEFOQ0VfTUlOKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCkBAIC0xOTEsMjIgKzE3MiwyMSBAQAogICAgICAqIFBTQSBwYXJhbWV0ZXJzCiAgICAgICovCiAgICAgaWYgKCgoTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbilwUGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA+IExWUFNBX1NQRUVEX0hJR0gpIHx8Ci0gICAgICAgIChwUGFyYW1zLT5QU0FfRW5hYmxlID4gTFZNX1BTQV9PTikpCi0gICAgeworICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCi0gICAgKiBTZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhlcmUgYXJlIG5ldyBwYXJhbWV0ZXJzIHRvIHVzZQotICAgICoKLSAgICAqIFByb3RlY3QgdGhlIGNvcHkgb2YgdGhlIG5ldyBwYXJhbWV0ZXJzIGZyb20gaW50ZXJydXB0cyB0byBhdm9pZCBwb3NzaWJsZSBwcm9ibGVtcwotICAgICogd2l0aCBsb3NzIGNvbnRyb2wgcGFyYW1ldGVycy4gVGhpcyBwcm9ibGVtIGNhbiBvY2N1ciBpZiB0aGlzIGNvbnRyb2wgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUKLSAgICAqIHRoYW4gb25jZSBiZWZvcmUgYSBjYWxsIHRvIHRoZSBwcm9jZXNzIGZ1bmN0aW9uLiBJZiB0aGUgcHJvY2VzcyBmdW5jdGlvbiBpbnRlcnJ1cHRzCi0gICAgKiB0aGUgY29weSB0byBOZXdQYXJhbXMgdGhlbiBvbmUgZnJhbWUgbWF5IGhhdmUgbWl4ZWQgcGFyYW1ldGVycywgc29tZSBvbGQgYW5kIHNvbWUgbmV3LgotICAgICovCisgICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKKyAgICAgKgorICAgICAqIFByb3RlY3QgdGhlIGNvcHkgb2YgdGhlIG5ldyBwYXJhbWV0ZXJzIGZyb20gaW50ZXJydXB0cyB0byBhdm9pZCBwb3NzaWJsZSBwcm9ibGVtcworICAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCisgICAgICogdGhhbiBvbmNlIGJlZm9yZSBhIGNhbGwgdG8gdGhlIHByb2Nlc3MgZnVuY3Rpb24uIElmIHRoZSBwcm9jZXNzIGZ1bmN0aW9uIGludGVycnVwdHMKKyAgICAgKiB0aGUgY29weSB0byBOZXdQYXJhbXMgdGhlbiBvbmUgZnJhbWUgbWF5IGhhdmUgbWl4ZWQgcGFyYW1ldGVycywgc29tZSBvbGQgYW5kIHNvbWUgbmV3LgorICAgICAqLwogICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjMwLDE2ICsyMTAsMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgcG9pbnRlcgogICAgICAqLwotICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOwpAQCAtMjQ4LDE3ICsyMjUsMTYgQEAKICAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICAgICAgTFZNX0lOVDE2IGk7CiAKICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzICE9IDApCi0gICAgICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+TmV3UGFyYW1zLkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnNbaV0gPSBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldOwotICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OZXdQYXJhbXMuRVFOQl9OQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnNbaV0gPSBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldOworICAgICAgICAgICAgfQogICAgICAgICBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnM7CiAgICAgfQogCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWTV9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNzQsNTYgKzI1MCw0MiBAQAogLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKLXsKLSAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIGV4dGVybiBGT19GTE9BVF9MU2h4X0NvZWZzX3QgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IDA7CisgICAgTFZNX0lOVDE2IE9mZnNldDsKKyAgICBMVk1fSU5UMTYgRWZmZWN0TGV2ZWwgPSAwOwogCiAgICAgLyoKICAgICAgKiBMb2FkIHRoZSBjb2VmZmljaWVudHMKICAgICAgKi8KLSAgICBpZiAoKHBQYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJgotICAgICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSA+PSBUcmVibGVCb29zdE1pblJhdGUpICYmCi0gICAgICAgIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPiAwKSkKLSAgICB7Ci0gICAgICAgIGlmKChwUGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpICYmCi0gICAgICAgICAgICAoKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9IRUFEUEhPTkVTKXx8Ci0gICAgICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0VYX0hFQURQSE9ORVMpKSkKLSAgICAgICAgeworICAgIGlmICgocFBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlID49IFRyZWJsZUJvb3N0TWluUmF0ZSkgJiYKKyAgICAgICAgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmIChwUGFyYW1zLT5URV9FZmZlY3RMZXZlbCA+IDApKSB7CisgICAgICAgIGlmICgocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgorICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUykgfHwKKyAgICAgICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPT0gTFZNX0VYX0hFQURQSE9ORVMpKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBFZmZlY3RMZXZlbCA9IHBQYXJhbXMtPlRFX0VmZmVjdExldmVsOwogICAgICAgICAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fVFJVRTsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOwotICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7Ci0KKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmVibGVCb29zdFN0ZXBzICogKHBQYXJhbXMtPlNhbXBsZVJhdGUgLSBUcmVibGVCb29zdE1pblJhdGUpKTsKICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9GTE9BVCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgICAgIExWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0uQTAsIExWTV9UcmVibGVCb29zdENvZWZzW09mZnNldF0uQTEsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgLShMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdLkIxKSwgMC4wfTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFRFQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KHBQYXJhbXMtPk5yQ2hhbm5lbHMsIGNvZWZzKSk7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiBEaXNhYmxlIHRoZSB0cmVibGUgYm9vc3QKICAgICAgICAgICovCkBAIC0zNDUsOTQgKzMwNyw3NiBAQAogLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCAgICBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCU2hpZnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNmRCIHNoaWZ0cyAqLwotICAgIExWTV9VSU5UMTYgICAgICBkQk9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhYmxlIG9mZnNldCAqLwotICAgIExWTV9JTlQxNiAgICAgICBWb2x1bWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlcXVpcmVkIHZvbHVtZSBpbiBkQnMgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgIFRlbXA7Cit2b2lkIExWTV9TZXRWb2x1bWUoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgZEJTaGlmdHM7ICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiBkQk9mZnNldDsgIC8qIFRhYmxlIG9mZnNldCAqLworICAgIExWTV9JTlQxNiBWb2x1bWUgPSAwOyAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKICAgICAvKgogICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKICAgICAgKi8KLSAgICAgaWYgIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IDApCi0gICAgIHsKLSAgICAgICAgIFZvbHVtZSA9IDA7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbDsKLSAgICAgfQorICAgIGlmIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IDApIHsKKyAgICAgICAgVm9sdW1lID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbDsKKyAgICB9CiAKLSAgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLwotICAgICBpZihWb2x1bWUgPiAtNjApICAvKiBMaW1pdCB2b2x1bWUgbG9zcyB0byBQU0EgTGltaXRzKi8KLSAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNikoLVZvbHVtZSk7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KLSAgICAgZWxzZQotICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KTYwOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisgICAgLyogQ29tcGVuc2F0ZSB0aGlzIHZvbHVtZSBpbiBQU0EgcGxvdCAqLworICAgIGlmIChWb2x1bWUgPiAtNjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpbWl0IHZvbHVtZSBsb3NzIHRvIFBTQSBMaW1pdHMqLworICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gKExWTV9JTlQxNikoLVZvbHVtZSk7IC8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCisgICAgZWxzZQorICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0ID0gKExWTV9JTlQxNik2MDsgLyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KIAogICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgPSAwOwogCiAgICAgLyoKICAgICAgKiBTZXQgdm9sdW1lIGNvbnRyb2wgYW5kIEFWTCB2b2x1bWVzIGFjY29yZGluZyB0byBoZWFkcm9vbSBhbmQgdm9sdW1lIHVzZXIgc2V0dGluZwogICAgICAqLwotICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCi0gICAgeworICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSB7CiAgICAgICAgIC8qIERlZmF1bHQgU2l0dWF0aW9uIHdpdGggbm8gQVZMIGFuZCBubyBSUyAqLwotICAgICAgICBpZihwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZvbHVtZSA+IC1wSW5zdGFuY2UtPkhlYWRyb29tKQotICAgICAgICAgICAgICAgIFZvbHVtZSA9IChMVk1fSU5UMTYpLXBJbnN0YW5jZS0+SGVhZHJvb207CisgICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pIHsKKyAgICAgICAgICAgIGlmIChWb2x1bWUgPiAtcEluc3RhbmNlLT5IZWFkcm9vbSkgVm9sdW1lID0gKExWTV9JTlQxNiktcEluc3RhbmNlLT5IZWFkcm9vbTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogQWN0aXZhdGUgdm9sdW1lIGNvbnRyb2wgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICA9IExWTV9UUlVFOwotICAgIGlmIChWb2x1bWUgIT0gMCkKLSAgICB7CisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fVFJVRTsKKyAgICBpZiAoVm9sdW1lICE9IDApIHsKICAgICAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IFZvbHVtZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCID0gMDsKICAgICB9CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCiAgICAgICovCi0gICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoKC1Wb2x1bWUpICUgNik7ICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwotICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KKyAgICBkQk9mZnNldCA9IChMVk1fVUlOVDE2KSgoLVZvbHVtZSkgJSA2KTsgLyogR2V0IHRoZSBkQnMgMC01ICovCisgICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLwogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBpZihkQlNoaWZ0cyA9PSAwKQotICAgIHsKKyAgICBpZiAoZEJTaGlmdHMgPT0gMCkgewogICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKLSAgICAgICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICB9IGVsc2UgewogICAgICAgICBUZW1wID0gTFZNX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XTsKLSAgICAgICAgd2hpbGUoZEJTaGlmdHMpIHsKKyAgICAgICAgd2hpbGUgKGRCU2hpZnRzKSB7CiAgICAgICAgICAgICBUZW1wID0gVGVtcCAvIDIuMGY7CiAgICAgICAgICAgICBkQlNoaWZ0cy0tOwogICAgICAgICB9CiAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBUZW1wKTsKICAgICB9CiAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwotICAgIGlmKHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKSB7CiAgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9WQ19NSVhFUl9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwogICAgIH0KIH0KIApAQCAtNDUzLDQzICszOTcsMzkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgTFZNX1NldEhlYWRyb29tKExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgaWksIGpqOwotICAgIExWTV9JTlQxNiAgIEhlYWRyb29tID0gMDsKLSAgICBMVk1fSU5UMTYgICBNYXhHYWluID0gMDsKK3ZvaWQgTFZNX1NldEhlYWRyb29tKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIExWTV9JTlQxNiBIZWFkcm9vbSA9IDA7CisgICAgTFZNX0lOVDE2IE1heEdhaW4gPSAwOwogCi0gICAgaWYgKCgoTFZFUU5CX01vZGVfZW4pcFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKLSAgICAgICAgICAgJiYgKHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9PSBMVk1fSEVBRFJPT01fT04pKQotICAgIHsKKyAgICBpZiAoKChMVkVRTkJfTW9kZV9lbilwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKSAmJgorICAgICAgICAocEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID09IExWTV9IRUFEUk9PTV9PTikpIHsKICAgICAgICAgLyogRmluZCB0eXBpY2FsIGhlYWRyb29tIHZhbHVlICovCi0gICAgICAgIGZvcihqaiA9IDA7IGpqIDwgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgamorKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOyBqaisrKSB7CiAgICAgICAgICAgICBNYXhHYWluID0gMDsKLSAgICAgICAgICAgIGZvciggaWkgPSAwOyBpaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5ID49IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfTG93KSAmJgotICAgICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5IDw9IHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfSGlnaCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uR2FpbiA+IE1heEdhaW4pCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpaV0uRnJlcXVlbmN5ID49CisgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0xvdykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5GcmVxdWVuY3kgPD0KKyAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uTGltaXRfSGlnaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluID4gTWF4R2FpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgTWF4R2FpbiA9IHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2lpXS5HYWluOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZigoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KSA+IEhlYWRyb29tKXsKLSAgICAgICAgICAgICAgICBIZWFkcm9vbSA9IChMVk1fSU5UMTYpKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCk7CisgICAgICAgICAgICBpZiAoKE1heEdhaW4gLSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkhlYWRyb29tX09mZnNldCkgPgorICAgICAgICAgICAgICAgIEhlYWRyb29tKSB7CisgICAgICAgICAgICAgICAgSGVhZHJvb20gPSAoTFZNX0lOVDE2KSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1heEdhaW4gLQorICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgaWYoSGVhZHJvb20gPCAwKQotICAgICAgICAgICAgSGVhZHJvb20gPSAwOworICAgICAgICBpZiAoSGVhZHJvb20gPCAwKSBIZWFkcm9vbSA9IDA7CiAgICAgfQotICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAoTFZNX1VJTlQxNilIZWFkcm9vbSA7Ci0KKyAgICBwSW5zdGFuY2UtPkhlYWRyb29tID0gKExWTV9VSU5UMTYpSGVhZHJvb207CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTEwLDMyICs0NTAsMjYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgaEluc3RhbmNlKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgTG9jYWxQYXJhbXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBDb3VudCA9IDU7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UpIHsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBMb2NhbFBhcmFtczsKKyAgICBMVk1fSU5UMTYgQ291bnQgPSA1OwogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycyBidXQgbWFrZSBzdXJlIHRoZXkgZGlkbid0IGNoYW5nZSB3aGlsZSBjb3B5aW5nCiAgICAgICovCi0gICAgZG8KLSAgICB7CisgICAgZG8gewogICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogICAgICAgICBMb2NhbFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOwogICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtczsKICAgICAgICAgQ291bnQtLTsKLSAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmCi0gICAgICAgICAgICAgKENvdW50ID4gMCkpOworICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYgKENvdW50ID4gMCkpOwogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIHBJbnN0YW5jZS0+TnJDaGFubmVscyA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CiAgICAgcEluc3RhbmNlLT5DaE1hc2sgPSBMb2NhbFBhcmFtcy5DaE1hc2s7Ci0jZW5kaWYKIAogICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLwotICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCi0gICAgeworICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KSB7CiAgICAgICAgIExWTV9DbGVhckF1ZGlvQnVmZmVycyhwSW5zdGFuY2UpOwogICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwogICAgIH0KQEAgLTU0NywzMSArNDgxLDI3IEBACiAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAhPSBMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX09wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSkgfHwKICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IExvY2FsUGFyYW1zLlNwZWFrZXJUeXBlKSkKLSAgICB7Ci0gICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gTG9jYWxQYXJhbXMuU3BlYWtlclR5cGUpKSB7CisgICAgICAgIExWTV9TZXRUcmVibGVCb29zdChwSW5zdGFuY2UsICZMb2NhbFBhcmFtcyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGhlYWRyb29tIGlmIHJlcXVpcmVkCiAgICAgICovCi0gICAgICAgIExWTV9TZXRIZWFkcm9vbShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fU2V0SGVhZHJvb20ocEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAvKiBOZXcgcGFyYW1ldGVycyAqLwogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIHZvbHVtZSBpZiByZXF1aXJlZAogICAgICAqLwogICAgIHsKLSAgICAgICAgTFZNX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAmTG9jYWxQYXJhbXMpOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisgICAgICAgIExWTV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7IC8qIE5ldyBwYXJhbWV0ZXJzICovCiAgICAgfQogICAgIC8qIEFwcGx5IGJhbGFuY2UgY2hhbmdlcyovCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuVkNfQmFsYW5jZSAhPSBMb2NhbFBhcmFtcy5WQ19CYWxhbmNlKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuVkNfQmFsYW5jZSAhPSBMb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSB7CiAgICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKLSAgICAgICAgeworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8IDApIHsKICAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CiAgICAgICAgICAgICAvKiBEcm9wIGluIHJpZ2h0IGNoYW5uZWwgdm9sdW1lKi8KICAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKQEAgLTU4Myw5ICs1MTMsNyBAQAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlID4wKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+IDApIHsKICAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7CiAgICAgICAgICAgICAvKiBEcm9wIGluIGxlZnQgY2hhbm5lbCB2b2x1bWUqLwogICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoKC1Mb2NhbFBhcmFtcy5WQ19CYWxhbmNlKSA8PCA0KSk7CkBAIC01OTcsNjMgKzUyNSw1NCBAQAogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOwogICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwogICAgICAgICAgICAgLyogTm8gZHJvcCovCiAgICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgVGFyZ2V0X0Zsb2F0KTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKIAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgLyoKICAgICAgKiBVcGRhdGUgdGhlIGJhc3MgZW5oYW5jZW1lbnQKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgICAgICBEQkVfU3RhdHVzOwotICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgREJFX1BhcmFtczsKLSAgICAgICAgTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgICpoREJFSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZTsKKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuIERCRV9TdGF0dXM7CisgICAgICAgIExWREJFX1BhcmFtc190IERCRV9QYXJhbXM7CisgICAgICAgIExWREJFX0hhbmRsZV90KiBoREJFSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QqKXBJbnN0YW5jZS0+aERCRUluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgbmV3IHBhcmFtZXRlcnMKICAgICAgICAgICovCi0gICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQotICAgICAgICB7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikgewogICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IChMVkRCRV9Nb2RlX2VuKUxvY2FsUGFyYW1zLkJFX09wZXJhdGluZ01vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgREJFX1BhcmFtcy5TYW1wbGVSYXRlICAgICAgID0gKExWREJFX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIERCRV9QYXJhbXMuRWZmZWN0TGV2ZWwgICAgICA9IExvY2FsUGFyYW1zLkJFX0VmZmVjdExldmVsOwotICAgICAgICBEQkVfUGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSAgPSAoTFZEQkVfQ2VudHJlRnJlcV9lbilMb2NhbFBhcmFtcy5CRV9DZW50cmVGcmVxOwotICAgICAgICBEQkVfUGFyYW1zLkhQRlNlbGVjdCAgICAgICAgPSAoTFZEQkVfRmlsdGVyU2VsZWN0X2VuKUxvY2FsUGFyYW1zLkJFX0hQRjsKLSAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIERCRV9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKLSNlbmRpZgorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkJFX0VmZmVjdExldmVsOworICAgICAgICBEQkVfUGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ID0gKExWREJFX0ZpbHRlclNlbGVjdF9lbilMb2NhbFBhcmFtcy5CRV9IUEY7CisgICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiA9IDA7CisgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCA9IExWREJFX1ZPTFVNRV9PRkY7CisgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgPSAwOworICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKICAgICAgICAgICovCi0gICAgICAgIERCRV9TdGF0dXMgPSBMVkRCRV9Db250cm9sKGhEQkVJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9QYXJhbXMpOworICAgICAgICBEQkVfU3RhdHVzID0gTFZEQkVfQ29udHJvbChoREJFSW5zdGFuY2UsICZEQkVfUGFyYW1zKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCiAgICAgICAgICAqLwotICAgICAgICBpZiAoREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pREJFX1N0YXR1cyk7CisgICAgICAgIGlmIChEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiAoKExWTV9SZXR1cm5TdGF0dXNfZW4pREJFX1N0YXR1cyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgpAQCAtNjY2LDE2OCArNTg1LDEzMiBAQAogICAgICAqIFVwZGF0ZSB0aGUgTi1CYW5kIEVxdWFsaXNlcgogICAgICAqLwogICAgIHsKLSAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgICAgIEVRTkJfU3RhdHVzOwotICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICAgICAgRVFOQl9QYXJhbXM7Ci0gICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgICAqaEVRTkJJbnN0YW5jZSA9IChMVkVRTkJfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2U7CisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gRVFOQl9TdGF0dXM7CisgICAgICAgIExWRVFOQl9QYXJhbXNfdCBFUU5CX1BhcmFtczsKKyAgICAgICAgTFZFUU5CX0hhbmRsZV90KiBoRVFOQkluc3RhbmNlID0gKExWRVFOQl9IYW5kbGVfdCopcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgbmV3IHBhcmFtZXRlcnMKICAgICAgICAgICovCiAKLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSBMVkVRTkJfQllQQVNTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IChMVkVRTkJfTW9kZV9lbilMb2NhbFBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGU7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gKExWRVFOQl9Nb2RlX2VuKUxvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZTsKICAgICAgICAgfQogCi0gICAgICAgIEVRTkJfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZFUU5CX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIEVRTkJfUGFyYW1zLk5CYW5kcyAgICAgICAgICAgPSBMb2NhbFBhcmFtcy5FUU5CX05CYW5kczsKLSAgICAgICAgRVFOQl9QYXJhbXMucEJhbmREZWZpbml0aW9uICA9IChMVkVRTkJfQmFuZERlZl90ICopTG9jYWxQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247Ci0gICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworICAgICAgICBFUU5CX1BhcmFtcy5TYW1wbGVSYXRlID0gKExWRVFOQl9Gc19lbilMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBFUU5CX1BhcmFtcy5OQmFuZHMgPSBMb2NhbFBhcmFtcy5FUU5CX05CYW5kczsKKyAgICAgICAgRVFOQl9QYXJhbXMucEJhbmREZWZpbml0aW9uID0gKExWRVFOQl9CYW5kRGVmX3QqKUxvY2FsUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOworICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX1NURVJFTzsKICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogTm90ZTogQ3VycmVudGx5IFNvdXJjZUZvcm1hdCBmaWVsZCBvZiBFUU5CIGlzIG5vdCBiZWVuCiAgICAgICAgICAqICAgICAgIHVzZWQgYnkgdGhlIG1vZHVsZS4KICAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKQotICAgICAgICB7CisgICAgICAgIGVsc2UgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKSB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTVVMVElDSEFOTkVMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwotICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICBFUU5CX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwotI2VuZGlmCisgICAgICAgIEVRTkJfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCiAgICAgICAgICAqLwogICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCi0gICAgICAgICAgICAoTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKSkKLSAgICAgICAgeworICAgICAgICAgICAgKExvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9PSBMVk1fRVFOQl9PTikpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwogICAgICAgICAgKi8KLSAgICAgICAgRVFOQl9TdGF0dXMgPSBMVkVRTkJfQ29udHJvbChoRVFOQkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX1BhcmFtcyk7CisgICAgICAgIEVRTkJfU3RhdHVzID0gTFZFUU5CX0NvbnRyb2woaEVRTkJJbnN0YW5jZSwgJkVRTkJfUGFyYW1zKTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCiAgICAgICAgICAqLwotICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIGlmIChFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIGNvbmNlcnQgc291bmQKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBDU19TdGF0dXM7Ci0gICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgICAgICBDU19QYXJhbXM7Ci0gICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgICAqaENTSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aENTSW5zdGFuY2U7Ci0gICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKyAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gQ1NfU3RhdHVzOworICAgICAgICBMVkNTX1BhcmFtc190IENTX1BhcmFtczsKKyAgICAgICAgTFZDU19IYW5kbGVfdCogaENTSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdCopcEluc3RhbmNlLT5oQ1NJbnN0YW5jZTsKKyAgICAgICAgTFZNX01vZGVfZW4gQ29tcHJlc3Nvck1vZGUgPSBMVk1fTU9ERV9PTjsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CiAgICAgICAgIH0KIAotICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKKyAgICAgICAgICAgIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKSB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgPSBMVkNTX0VYX0hFQURQSE9ORVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgPSBMVkNTX0hFQURQSE9ORVM7CiAgICAgICAgIH0KIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogQ29uY2VydCBzb3VuZCBtb2R1bGUgcHJvY2Vzc2VzIG9ubHkgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzCiAgICAgICAgICAqIGRhdGEuIFNvIHRoZSBTb3VyY2UgRm9ybWF0IGlzIHNldCB0byBMVkNTX1NURVJFTyBmb3IgbXVsdGljaGFubmVsCiAgICAgICAgICAqIGlucHV0IGFsc28uCiAgICAgICAgICAqLwogICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8gfHwKLSAgICAgICAgICAgIExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTVVMVElDSEFOTkVMKQotI2Vsc2UKLSAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCi0jZW5kaWYKLSAgICAgICAgeworICAgICAgICAgICAgTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NVUxUSUNIQU5ORUwpIHsKICAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX1NURVJFTzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX01PTk9JTlNURVJFTzsgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWQ1NfTU9OT0lOU1RFUkVPOyAgICAgICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCi0gICAgICAgIH0KLSAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwogICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOwogICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZW5kaWYKKyAgICAgICAgQ1NfUGFyYW1zLk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCiAgICAgICAgICAqLwogICAgICAgICBpZiAoKChMVk1fTW9kZV9lbilMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAgICAgKChMVkNTX01vZGVzX2VuKUxvY2FsUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikpCi0gICAgICAgIHsKKyAgICAgICAgICAgICgoTFZDU19Nb2Rlc19lbilMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9UUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ1NfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKICAgICAgICAgfQogCi0gICAgICAgIENTX1BhcmFtcy5Db21wcmVzc29yTW9kZT1Db21wcmVzc29yTW9kZTsKKyAgICAgICAgQ1NfUGFyYW1zLkNvbXByZXNzb3JNb2RlID0gQ29tcHJlc3Nvck1vZGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcwogICAgICAgICAgKi8KLSAgICAgICAgQ1NfU3RhdHVzID0gTFZDU19Db250cm9sKGhDU0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNTX1BhcmFtcyk7CisgICAgICAgIENTX1N0YXR1cyA9IExWQ1NfQ29udHJvbChoQ1NJbnN0YW5jZSwgJkNTX1BhcmFtcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAogICAgICAgICAgKi8KLSAgICAgICAgaWYgKENTX1N0YXR1cyAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilDU19TdGF0dXMpOworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilDU19TdGF0dXMpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKICAgICAgKi8KICAgICB7Ci0gICAgICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBQU0FfU3RhdHVzOwotICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgUFNBX1BhcmFtczsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90ICopcEluc3RhbmNlLT5oUFNBSW5zdGFuY2U7CisgICAgICAgIExWUFNBX1JFVFVSTiBQU0FfU3RhdHVzOworICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgUFNBX1BhcmFtczsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90KiBoUFNBSW5zdGFuY2UgPSAocExWUFNBX0hhbmRsZV90KilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCkBAIC04MzgsMjMgKzcyMSwxOSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCiAgICAgICAgICAqLwotICAgICAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkPT1MVk1fUFNBX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQ29udHJvbChoUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgJlBTQV9QYXJhbXMpOworICAgICAgICBpZiAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSB7CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQ29udHJvbChoUFNBSW5zdGFuY2UsICZQU0FfUGFyYW1zKTsKIAotICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgbmV3IHNldHRpbmdzCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzICgoTFZQU0FfSW5zdGFuY2VQcl90KiloUFNBSW5zdGFuY2UpOwotICAgICAgICAgICAgaWYoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pUFNBX1N0YXR1cyk7CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncygoTFZQU0FfSW5zdGFuY2VQcl90KiloUFNBSW5zdGFuY2UpOworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODYzLDkgKzc0Miw5IEBACiAgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIGFuZCBjbGVhciB0aGUgZmxhZwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPSBMVk1fRkFMU0U7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMgPSAgTG9jYWxQYXJhbXM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMgPSBMb2NhbFBhcmFtczsKIAotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODg3LDM2ICs3NjYsMzAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldEhlYWRyb29tUGFyYW1zKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgICAqcEhlYWRyb29tUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpLCBOQmFuZHM7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2IGlpLCBOQmFuZHM7CiAKICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSGVhZHJvb21QYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9Ci0gICAgaWYgKChwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzICE9IDApICYmIChwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgIT0gMCkgJiYKKyAgICAgICAgKHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIC8qIENvbnNpZGVyIG9ubHkgdGhlIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTIGZpcnN0IGJhbmRzKi8KLSAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKQotICAgIHsKKyAgICBpZiAocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA+IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTKSB7CiAgICAgICAgIE5CYW5kcyA9IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIE5CYW5kcyA9IHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHM7CiAgICAgfQogICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSBOQmFuZHM7CiAKICAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgTkJhbmRzOyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBOQmFuZHM7IGlpKyspIHsKICAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldID0gcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uW2lpXTsKICAgICB9CiAKQEAgLTkyNCw3ICs3OTcsNyBAQAogICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk0NywyOSArODIwLDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICpwSGVhZHJvb21QYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QqIHBIZWFkcm9vbVBhcmFtcykgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fVUlOVDE2IGlpOwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgcEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7CiAKICAgICAvKiBDb3B5IHNldHRpbmdzIGluIG1lbW9yeSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgaWkrKykgewogICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmc1tpaV0gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmc1tpaV07CiAgICAgfQogCiAgICAgcEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID0gcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnM7CiAgICAgcEhlYWRyb29tUGFyYW1zLT5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlOwotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVk1fU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTg4LDE4ICs4NTgsMTQgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2sodm9pZCogcEJ1bmRsZUhhbmRsZSwgdm9pZCogcERhdGEsIExWTV9JTlQxNiBjYWxsYmFja0lkKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopcEJ1bmRsZUhhbmRsZTsKIAotICAgICh2b2lkKSBwRGF0YTsKKyAgICAodm9pZClwRGF0YTsKIAotICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHhGRjAwKXsKKyAgICBzd2l0Y2ggKGNhbGxiYWNrSWQgJiAweEZGMDApIHsKICAgICAgICAgY2FzZSBBTEdPUklUSE1fQ1NfSUQ6Ci0gICAgICAgICAgICBzd2l0Y2goY2FsbGJhY2tJZCAmIDB4MDBGRikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbGJhY2tJZCAmIDB4MDBGRikgewogICAgICAgICAgICAgICAgIGNhc2UgTFZDU19FVkVOVF9BTEdPRkY6CiAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwMDgsOCArODc0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFMR09SSVRITV9FUU5CX0lEOgotICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxiYWNrSWQgJiAweDAwRkYpIHsKICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9FVkVOVF9BTEdPRkY6CiAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA0MCwyMSArOTA1LDE3IEBACiAvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSkKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKLSAgICBMVk1fRkxPQVQgICAgVGFyZ2V0OworTFZNX0lOVDMyIExWTV9WQ0NhbGxCYWNrKHZvaWQqIHBCdW5kbGVIYW5kbGUsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwgc2hvcnQgQ2FsbEJhY2tQYXJhbSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKXBCdW5kbGVIYW5kbGU7CisgICAgTFZNX0ZMT0FUIFRhcmdldDsKIAotICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7Ci0gICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CisgICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOworICAgICh2b2lkKUNhbGxCYWNrUGFyYW07CiAKICAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKICAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLwogICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKLSAgICBpZihUYXJnZXQgPT0gMS4wZikKLSAgICB7CisgICAgaWYgKFRhcmdldCA9PSAxLjBmKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOwogICAgIH0KICAgICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcAppbmRleCA1NjIwNTI5Li4xMmI4NmYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwCkBAIC0yMCw1NzggKzIwLDk1IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCi0vKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLwotLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KLSAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCi0gKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcwotICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCi0gKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKgotICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKLSAqICAgVG90YWwgTWVtb3J5IHNpemU6Ci0gKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgotICogICBUb3RhbCBNZW1vcnkgc2l6ZToKLSAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCi0gKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKLSAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCi0gKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKLSAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQotICoKLSAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6Ci0gKiAgIFRvdGFsIE1lbW9yeSBzaXplOgotICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKLSAqICAgVG90YWwgTWVtb3J5IFNpemU6Ci0gKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCi0gKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAotICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQotICoKLSAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgotICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCi0gKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCi0gKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKLSAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgotICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKLSAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCi0gKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCi0gKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAotICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAotICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCi0gKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtW0xWTV9OUl9NRU1PUllfUkVHSU9OU107Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCi0gICAgewotICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKLSAgICAgKi8KLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KLSAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcwotICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKLSAgICB9Ci0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotCi0gICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7Ci0gICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKLSAgICB9Ci0KLSAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKLSAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCi0gICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIGFuZCBidW5kbGUgc2NyYXRjaCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7Ci0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihMVk1fRkxPQVQpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAgICAgIC8qIFNjcmF0Y2ggYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0KLSAgICAvKgotICAgICAqIE4tQmFuZCBFcXVhbGl6ZXIgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sICAgICAgLyogTG9jYWwgc3RvcmFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBVc2VyIHN0b3JhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0KLSAgICAvKgotICAgICAqIENvbmNlcnQgU291bmQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgewotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7Ci0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cnVjdHVyZXMKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7Ci0gICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgIERCRV9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9NZW1vcnkoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotCi0gICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgZXF1YWxpc2VyIHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgLyogRm9yIE4tQmFuZCBFcXVhbGlzZXIgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgRVFOQl9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID4gQWxnU2NyYXRjaFNpemUpIEFsZ1NjcmF0Y2hTaXplID0gRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLQotICAgIC8qCi0gICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7Ci0gICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKLSAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOwotCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0KLSAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQotICAgIHsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKLSAgICB7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOwotICAgIH0KLQotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKLSAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCi0gICAgewotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotCi19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwaEluc3RhbmNlLCBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgYXJlIE5VTEwqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90ICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgKnBJbnN0UGFyYW1zKQotewotCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgU3RhdHVzID0gTFZNX1NVQ0NFU1M7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBBbGxvY01lbVtMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWTV9JbnN0UGFyYW1zX3QqIHBJbnN0UGFyYW1zKSB7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBTdGF0dXMgPSBMVk1fU1VDQ0VTUzsKKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlOworICAgIExWTV9JTlQxNiBpOworICAgIExWTV9VSU5UMTYgSW50ZXJuYWxCbG9ja1NpemU7CisgICAgTFZNX0lOVDMyIEJ1bmRsZVNjcmF0Y2hTaXplOwogCiAgICAgLyoKICAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCiAgICAgICovCi0gICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycwotICAgICAqLwotICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplICE9IDApICYmCi0gICAgICAgICAgICAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVk1fTlVMTEFERFJFU1MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKICAgICAgKiBDaGVjayB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwogICAgICAqLwotICAgIGlmKCAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX01BTkFHRURfQlVGRkVSUykgJiYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9VTk1BTkFHRURfQlVGRkVSUykgKQotICAgIHsKKyAgICBpZiAoKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmCisgICAgICAgIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmKCBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyA+IDMyICkKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzID4gMzIpIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0gICAgaWYocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICkgKQotICAgICAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpIHsKKyAgICAgICAgaWYgKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUpIHx8CisgICAgICAgICAgICAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpKSB7CiAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSApCi0gICAgICAgIHsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSkgfHwKKyAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSkgewogICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7CisgICAgaWYgKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPiBMVk1fUFNBX09OKSB7CiAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwogICAgIH0KIAogICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcworICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCiAgICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgfQorICAgICpwaEluc3RhbmNlID0gbmV3IExWTV9JbnN0YW5jZV90e307CisgICAgcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKKworICAgIHBJbnN0YW5jZS0+SW5zdFBhcmFtcyA9ICpwSW5zdFBhcmFtczsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgKiBDcmVhdGUgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAogICAgICAqLwotICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOwotICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUsIHBhcmFtZXRlcnMgYW5kIGNhcGFiaWxpdGllcwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgPSAqcE1lbW9yeVRhYmxlOwotICAgIHBJbnN0YW5jZS0+SW5zdFBhcmFtcyAgICAgPSAqcEluc3RQYXJhbXM7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFuZCBpbml0aWFsc2UgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50Ci0gICAgICovCi0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotICAgIGlmIChJbnRlcm5hbEJsb2NrU2l6ZSA8IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpCi0gICAgeworICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKAorICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYKKyAgICAgICAgICAgIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSB7CiAgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKICAgICB9CiAKICAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKSB7CiAgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUFYX0lOVEVSTkFMX0JMT0NLU0laRTsKICAgICB9CiAgICAgcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CkBAIC01OTksNDAgKzExNiw0NiBAQAogICAgIC8qCiAgICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgYnVmZmVycwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCi0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgeworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgQnVuZGxlU2NyYXRjaFNpemUgPQorICAgICAgICAgICAgKExWTV9JTlQzMikoMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IGNhbGxvYygxLCBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cFNjcmF0Y2ggPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykgewogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2VkIGJ1ZmZlcnMgcmVxdWlyZWQKICAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSAoTFZNX0J1ZmZlcl90ICopCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOwotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IChMVk1fRkxPQVQgKikKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAvKiBTY3JhdGNoIDEgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7IC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCA9CisgICAgICAgICAgICAgICAgKExWTV9CdWZmZXJfdCopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQpKSk7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CisKKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+cFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOworCisgICAgICAgIG1lbXNldChwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLCAwLAorICAgICAgICAgICAgICAgIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICoKKyAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlclswXSkpOworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9CisgICAgICAgICAgICAgICAgTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5CdWZmZXJTdGF0ZSA9CisgICAgICAgICAgICAgICAgTFZNX0ZJUlNUQ0FMTDsgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgPSAwOwogCiAgICAgLyoKICAgICAgKiBTZXQgY2FsbGJhY2sKQEAgLTY0MiwzMzggKzE2NSwyNTcgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLSNlbHNlCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgID0gKExWTV9URV9EYXRhX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotCi0gICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5URV9BY3RpdmUgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgPSBMVk1fRkFMU0U7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgdm9sdW1lIGNvbnRyb2wgYW5kIGluaXRpYWxpc2UgQ3VycmVudCB0byBUYXJnZXQKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX1ZDQ2FsbEJhY2s7CiAKLSAgICAvKiBJbiBtYW5hZ2VkIGJ1ZmZlcmluZywgc3RhcnQgd2l0aCBsb3cgc2lnbmFsIGxldmVsIGFzIGRlbGF5IGluIGJ1ZmZlciBtYW5hZ2VtZW50IGNhdXNlcyBhIGNsaWNrKi8KLSAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7CisgICAgLyogSW4gbWFuYWdlZCBidWZmZXJpbmcsIHN0YXJ0IHdpdGggbG93IHNpZ25hbCBsZXZlbCBhcyBkZWxheSBpbiBidWZmZXIgbWFuYWdlbWVudCBjYXVzZXMgYQorICAgICAqIGNsaWNrKi8KKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykgewogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOwogICAgIH0KIAotICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIExWTV9GU184MDAwLCAyKTsKIAotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSAgICAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgPSBMVk1fRkFMU0U7CiAKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fVkNDYWxsQmFjazsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7Ci0gICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSwgTFZNX1ZDX01JWEVSX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRlNfODAwMCwgMik7CiAKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fVkNDYWxsQmFjazsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7Ci0gICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgTFZNX1ZDX01JWEVSX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRlNfODAwMCwgMik7CiAKICAgICAvKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCisgICAgICogQ3JlYXRlIHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0KLSAgICAgICAgKExWTV9FUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOwotICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPQotICAgICAgICAoTFZNX0VRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9IChMVk1fRVFOQl9CYW5kRGVmX3QqKWNhbGxvYyhwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyA9IChMVk1fRVFOQl9CYW5kRGVmX3QqKWNhbGxvYyhwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkNTX0hhbmRsZV90IGhDU0luc3RhbmNlOyAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgQ1NfQ2FwYWJpbGl0aWVzOyAvKiBJbml0aWFsIGNhcGFiaWxpdGllcyAqLworICAgICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgZGVmYXVsdCBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsICAgID0gMTAwOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclR5cGUgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICA9IExWTV9NT0RFX09GRjsKLSAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CiAgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAmcEluc3RhbmNlLT5DU19JbnN0YW5jZTsKLSAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAvKgogICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCi0gICAgICAgIGhDU0luc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCi0KKyAgICAgICAgaENTSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCisgICAgICAgIExWQ1NfU3RhdHVzID0gTFZDU19Jbml0KCZoQ1NJbnN0YW5jZSwgLyogQ3JlYXRlIGFuZCBpbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMsIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOworICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7ICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgIExWREJFX1N0YXR1czsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkRCRV9IYW5kbGVfdCBoREJFSW5zdGFuY2U7ICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgREJFX0NhcGFiaWxpdGllczsgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT0ZGOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxICAgID0gTFZNX0JFX0NFTlRSRV81NUh6OwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCAgID0gMDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfSFBGICAgICAgICAgICA9IExWTV9CRV9IUEZfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV81NUh6OworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0hQRiA9IExWTV9CRV9IUEZfT0ZGOwogCi0gICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfODgyMDAgfCBMVkRCRV9DQVBfRlNfOTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTc2NDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKIAotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgICAgICAgID0gJnBJbnN0YW5jZS0+REJFX0luc3RhbmNlOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplKTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCi0gICAgICAgIGhEQkVJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCi0gICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX0luaXQoJmhEQkVJbnN0YW5jZSwgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOwotICAgICAgICBpZiAoTFZEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilMVkRCRV9TdGF0dXMpOwotICAgICAgICBwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSA9IGhEQkVJbnN0YW5jZTsgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIGhEQkVJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9Jbml0KCZoREJFSW5zdGFuY2UsIC8qIENyZWF0ZSBhbmQgaW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzLCBwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgaWYgKExWREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CisgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIE4tQmFuZCBFcXVhbGlzZXIgbW9kdWxlCiAgICAgICovCiAgICAgewotICAgICAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgaEVRTkJJbnN0YW5jZTsgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICBFUU5CX01lbVRhYjsgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgIEVRTkJfQ2FwYWJpbGl0aWVzOyAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gICBMVkVRTkJfU3RhdHVzOyAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVkVRTkJfSGFuZGxlX3QgaEVRTkJJbnN0YW5jZTsgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgRVFOQl9DYXBhYmlsaXRpZXM7IC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1N0YXR1czsgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgID0gTFZNX0VRTkJfT0ZGOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICA9IDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09GRjsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9OQmFuZHMgPSAwOwogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOwotICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9IExWTV9GQUxTRTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgICAgICAgID0gcEluc3RhbmNlLT5DYWxsQmFjazsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlICA9ICh2b2lkKilwSW5zdGFuY2U7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgPQorICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwKKyAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMCB8CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU184ODIwMCB8IExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKLSAgICAgICAgICovCi0gICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgPSBwSW5zdGFuY2UtPkNhbGxCYWNrOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCiAgICAgICAgICAqLwotICAgICAgICBoRVFOQkluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLwotICAgICAgICBMVkVRTkJfU3RhdHVzID0gTFZFUU5CX0luaXQoJmhFUU5CSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilMVkVRTkJfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlID0gaEVRTkJJbnN0YW5jZTsgICAgICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBoRVFOQkluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX1N0YXR1cyA9IExWRVFOQl9Jbml0KCZoRVFOQkluc3RhbmNlLCAvKiBDcmVhdGUgYW5kIGluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcywgcEluc3RhbmNlLT5wU2NyYXRjaCk7CisgICAgICAgIGlmIChMVkVRTkJfU3RhdHVzICE9IExWRVFOQl9TVUNDRVNTKSByZXR1cm4gKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOworICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KICAgICAgKi8KICAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCAqKQotICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCAqKQotICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCopY2FsbG9jKAorICAgICAgICAgICAgICAgIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTLCBzaXplb2YoKihwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcykpKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCopY2FsbG9jKAorICAgICAgICAgICAgICAgIExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTLCBzaXplb2YoKihwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcykpKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID09IExWTV9OVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgICAgICB9CiAKICAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCiAgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOwogICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfTG93ID0gMjA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblswXS5MaW1pdF9IaWdoID0gNDk5OTsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCA9IDM7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCA9IDI0MDAwOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uSGVhZHJvb21fT2Zmc2V0ID0gNDsKICAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOwogCi0gICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPTA7CisgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb20gPSAwOwogICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQogICAgICAqLwogICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOwotICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgaFBTQUluc3RhbmNlID0gTFZNX05VTEw7IC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICBMVlBTQV9SRVRVUk4gUFNBX1N0YXR1czsgICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKIAotICAgICAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkPT1MVk1fUFNBX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uICAgPSAoTFZNX1VJTlQxNikgNTAwOwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDIwNDg7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgOTsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMucEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgICA9ICZGaWx0ZXJzUGFyYW1zWzBdOwotICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlBvc3RHYWluICAgICAgICAgICA9IChMVk1fSU5UMTYpICAwOworICAgICAgICBpZiAocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gKExWTV9VSU5UMTYpNTAwOworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KTIwNDg7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLm5CYW5kcyA9IChMVk1fVUlOVDE2KTk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykgeworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uQ2VudGVyRnJlcXVlbmN5ID0gKExWTV9VSU5UMTYpMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgPSAoTFZNX1VJTlQxNikxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiA9IChMVk1fSU5UMTYpMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IENvZWYgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7Ci0KICAgICAgICAgICAgIC8qSW5pdGlhbGlzZSBQU0EgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkZzID0gTFZNX0ZTXzQ4MDAwOwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICA9IExWUFNBX1NQRUVEX01FRElVTTsKLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Jbml0ICgmaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiKTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCA9IExWUFNBX1NQRUVEX01FRElVTTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gKExWTV9GTE9BVCopY2FsbG9jKE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUsIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBQU0FJbnB1dCA9PSBMVk1fTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfSW5pdCgmaFBTQUluc3RhbmNlLCAmcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLCBwSW5zdGFuY2UtPnBTY3JhdGNoKTsKIAotICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fQUxHT1JJVEhNUFNBKTsKKyAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoTFZNX1JldHVyblN0YXR1c19lbilMVk1fQUxHT1JJVEhNUFNBKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBoUFNBSW5zdGFuY2U7IC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IExWTV9OVUxMOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgID0gTFZNX1BTQV9PRkY7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPSBMVk1fUFNBX09GRjsKICAgICB9CiAKICAgICAvKgpAQCAtOTkyLDIwICs0MzQsMTEzIEBACiAgICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9WQ19NQVNLOwogICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fUFNBX01BU0s7CiAKLSAgICBpZigoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAgJiBMVk1fQ1NfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9EQkVfTUFTSykhPTApIHx8Ci0gICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0VRTkJfTUFTSykhPTApfHwKLSAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVEVfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9WQ19NQVNLKSE9MCkpCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlICAgID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDE7CisgICAgaWYgKCgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0NTX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0RCRV9NQVNLKSAhPSAwKSB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9FUU5CX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1RFX01BU0spICE9IDApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX1ZDX01BU0spICE9IDApKSB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIHBJbnN0YW5jZS0+QmxpY2tTaXplTXVsdGlwbGUgPSAxOwogICAgIH0KIAotICAgIHJldHVybihTdGF0dXMpOworICAgIHJldHVybiAoU3RhdHVzKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0RlbEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KKy8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZNX0RlbEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCogcGhJbnN0YW5jZSkgeworICAgIExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworCisgICAgaWYgKHBJbnN0YW5jZS0+cFNjcmF0Y2ggIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IExWTV9OVUxMOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZWQgYnVmZmVycyByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gTFZNX05VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAorICAgICAqLworCisgICAgLyoKKyAgICAgKiBGcmVlIHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPSBMVk1fTlVMTDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlLWluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZDU19EZUluaXQoJnBJbnN0YW5jZS0+aENTSW5zdGFuY2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGUtaW5pdGlhbGlzZSB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5oREJFSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZEQkVfRGVJbml0KCZwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBOLUJhbmQgRXF1YWxpc2VyIG1vZHVsZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgTFZFUU5CX0RlSW5pdCgmcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZyZWUgSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkuCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzID0gTFZNX05VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBQU0EgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWUFNBX0RlSW5pdCgmcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UpOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wUFNBSW5wdXQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBQU0FJbnB1dCk7CisgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gTFZNX05VTEw7CisgICAgfQorCisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICByZXR1cm47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTAyNyw0OCArNTYyLDM2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgIGhJbnN0YW5jZSkKLXsKLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOyAvKiBQb2ludGVyIHRvIEluc3RhbmNlICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgaEluc3RhbmNlKSB7CisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90KiloSW5zdGFuY2U7IC8qIFBvaW50ZXIgdG8gSW5zdGFuY2UgKi8KKyAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsKIAotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCl7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwogICAgIH0KIAotICAgIC8qIFNhdmUgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KKyAgICAvKiBTYXZlIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKIAogICAgIC8qU2F2ZSB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyovCiAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKIAotICAgIC8qICBSZXRyaWV2ZSBhbGxvY2F0ZWQgYnVmZmVycyBpbiBtZW10YWIgKi8KLSAgICBMVk1fR2V0TWVtb3J5VGFibGUoaEluc3RhbmNlLCAmTWVtVGFiLCAgTFZNX05VTEwpOwotCiAgICAgLyogIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KICAgICBJbnN0UGFyYW1zID0gcEluc3RhbmNlLT5JbnN0UGFyYW1zOwogCiAgICAgLyogIENhbGwgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSB0byByZS1pbml0aWFsaXNlIHRoZSBidW5kbGUgKi8KLSAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoICZoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOwotCi0gICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgLyogUmVzdG9yZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscyAqLwogICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UsICZQYXJhbXMpOwogCiAgICAgLypSZXN0b3JlIHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzKi8KICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2Vsc2UKLSAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7Ci0jZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggZGRhYWM5OS4uNjNjODNjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0zMywxNCArMzMsMTUgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZNLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaWZlVmliZXMgKi8KLSNpbmNsdWRlICJMVk1fQ29tbW9uLmgiICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExpZmVWaWJlcyBjb21tb24gKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBsaWJyYXJ5ICovCi0jaW5jbHVkZSAiTFZDX01peGVyLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXhlciBsaWJyYXJ5ICovCi0jaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25jZXJ0IFNvdW5kICovCi0jaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgKi8KLSNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIiAgICAgICAgICAgICAgICAgICAgIC8qIE4tQmFuZCBlcXVhbGlzZXIgKi8KLSNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiICAgICAgICAgICAgICAgICAgICAgIC8qIFBhcmFtZXRyaWMgU3BlY3RydW0gQW5hbHl6ZXIgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVk0uaCIgICAgICAgICAgICAvKiBMaWZlVmliZXMgKi8KKyNpbmNsdWRlICJMVk1fQ29tbW9uLmgiICAgICAvKiBMaWZlVmliZXMgY29tbW9uICovCisjaW5jbHVkZSAiQklRVUFELmgiICAgICAgICAgLyogQmlxdWFkIGxpYnJhcnkgKi8KKyNpbmNsdWRlICJMVkNfTWl4ZXIuaCIgICAgICAvKiBNaXhlciBsaWJyYXJ5ICovCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiICAgLyogQ29uY2VydCBTb3VuZCAqLworI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiIC8qIE4tQmFuZCBlcXVhbGlzZXIgKi8KKyNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiICAvKiBQYXJhbWV0cmljIFNwZWN0cnVtIEFuYWx5emVyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDksNjMgKzUwLDY0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lIExWTV9JTlZBTElEICAgICAgICAgICAgICAgICAgICAgMHhGRkZGICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZNX0lOVkFMSUQgMHhGRkZGIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KIAogLyogTWVtb3J5ICovCi0jZGVmaW5lIExWTV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAgIC8qIDMyLWJpdCBmb3Igc3RydWN0dXJlcyAqLwotI2RlZmluZSBMVk1fRklSU1RDQUxMICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGaXJzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX01BWEJMT0NLQ0FMTCAgICAgICAgICAgICAgICAxICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGNhbGxzIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX0xBU1RDQUxMICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogTGFzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KLSNkZWZpbmUgTFZNX0ZJUlNUTEFTVENBTEwgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2luZ2xlIGNhbGwgZm9yIHNtYWxsIG51bWJlciBvZiBzYW1wbGVzICovCisjZGVmaW5lIExWTV9JTlNUQU5DRV9BTElHTiA0IC8qIDMyLWJpdCBmb3Igc3RydWN0dXJlcyAqLworI2RlZmluZSBMVk1fRklSU1RDQUxMIDAgICAgICAvKiBGaXJzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX01BWEJMT0NLQ0FMTCAxICAgLyogTWF4aW11bSBibG9jayBzaXplIGNhbGxzIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX0xBU1RDQUxMIDIgICAgICAgLyogTGFzdCBjYWxsIHRvIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTFZNX0ZJUlNUTEFTVENBTEwgMyAgLyogU2luZ2xlIGNhbGwgZm9yIHNtYWxsIG51bWJlciBvZiBzYW1wbGVzICovCiAKIC8qIEJsb2NrIFNpemUgKi8KLSNkZWZpbmUgTFZNX01JTl9NQVhCTE9DS1NJWkUgICAgICAgICAgICAxNiAgICAgICAgLyogTWluaW11bSBNYXhCbG9ja1NpemUgTGltaXQqLwotI2RlZmluZSBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICAgIDgxOTEgICAgICAvKiBNYXhpbXVtIE1heEJsb2NrU3ppZSBMaW1pdCBmb3IgTWFuYWdlZCBCdWZmZXIgTW9kZSovCi0jZGVmaW5lIExWTV9VTk1BTkFHRURfTUFYX01BWEJMT0NLU0laRSAgNDA5NiAgICAgIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBVbm1hbmFnZWQgQnVmZmVyIE1vZGUgKi8KKyNkZWZpbmUgTFZNX01JTl9NQVhCTE9DS1NJWkUgMTYgICAgICAgICAgIC8qIE1pbmltdW0gTWF4QmxvY2tTaXplIExpbWl0Ki8KKyNkZWZpbmUgTFZNX01BTkFHRURfTUFYX01BWEJMT0NLU0laRSA4MTkxIC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBNYW5hZ2VkIEJ1ZmZlciBNb2RlKi8KKyNkZWZpbmUgTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFIFwKKyAgICA0MDk2IC8qIE1heGltdW0gTWF4QmxvY2tTemllIExpbWl0IGZvciBVbm1hbmFnZWQgQnVmZmVyIE1vZGUgKi8KIAotI2RlZmluZSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICAgICAgICAgIDgxMjggICAgICAvKiBNYXhpbXVtIG11bHRpcGxlIG9mIDY0ICBiZWxvdyA4MTkxKi8KKyNkZWZpbmUgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSA4MTI4IC8qIE1heGltdW0gbXVsdGlwbGUgb2YgNjQgIGJlbG93IDgxOTEqLwogCi0jZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgICAgICAgICAgMTYgICAgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCAgICAgICAgIDQgICAgICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgICAgICAgICAgMHhGRkYwICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgMTYgICAgIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSAqLworI2RlZmluZSBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCA0ICAgICAvKiBNaW5pbXVtIGludGVybmFsIGJsb2NrIHNpemUgYXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIE1JTl9JTlRFUk5BTF9CTE9DS01BU0sgMHhGRkYwIC8qIE1pbmltdW0gaW50ZXJuYWwgYmxvY2sgc2l6ZSBtYXNrICovCiAKLSNkZWZpbmUgTFZNX1BTQV9EWU5BTUlDUkFOR0UgICAgICAgICAgICA2MCAgICAgICAgLyogU3BlY3RyYWwgRHluYW1pYyByYW5nZTogdXNlZCBmb3Igb2Zmc2V0aW5nIG91dHB1dCovCi0jZGVmaW5lIExWTV9QU0FfQkFSSEVJR0hUICAgICAgICAgICAgICAgMTI3ICAgICAgIC8qIFNwZWN0cmFsIEJhciBIZWlnaHQqLworI2RlZmluZSBMVk1fUFNBX0RZTkFNSUNSQU5HRSA2MCAvKiBTcGVjdHJhbCBEeW5hbWljIHJhbmdlOiB1c2VkIGZvciBvZmZzZXRpbmcgb3V0cHV0Ki8KKyNkZWZpbmUgTFZNX1BTQV9CQVJIRUlHSFQgMTI3ICAgLyogU3BlY3RyYWwgQmFyIEhlaWdodCovCiAKLSNkZWZpbmUgTFZNX1RFX01JTl9FRkZFQ1RMRVZFTCAgICAgICAgICAwICAgICAgICAgLypURSBNaW5pbXVtIEVmZmVjdExldmVsKi8KLSNkZWZpbmUgTFZNX1RFX01BWF9FRkZFQ1RMRVZFTCAgICAgICAgICAxNSAgICAgICAgLypURSBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCisjZGVmaW5lIExWTV9URV9NSU5fRUZGRUNUTEVWRUwgMCAgLypURSBNaW5pbXVtIEVmZmVjdExldmVsKi8KKyNkZWZpbmUgTFZNX1RFX01BWF9FRkZFQ1RMRVZFTCAxNSAvKlRFIE1heGltdW0gRWZmZWN0IGxldmVsKi8KIAotI2RlZmluZSBMVk1fVkNfTUlOX0VGRkVDVExFVkVMICAgICAgICAgICgtOTYpICAgICAvKlZDIE1pbmltdW0gRWZmZWN0TGV2ZWwqLwotI2RlZmluZSBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICAgICAgICAgIDAgICAgICAgICAvKlZDIE1heGltdW0gRWZmZWN0IGxldmVsKi8KKyNkZWZpbmUgTFZNX1ZDX01JTl9FRkZFQ1RMRVZFTCAoLTk2KSAvKlZDIE1pbmltdW0gRWZmZWN0TGV2ZWwqLworI2RlZmluZSBMVk1fVkNfTUFYX0VGRkVDVExFVkVMIDAgICAgIC8qVkMgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLwogCi0jZGVmaW5lIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwgICAgICAgICAgMCAgICAgICAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCi0jZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgICAgICAgICAgMTUgICAgICAgIC8qQkUgTWF4aW11bSBFZmZlY3QgbGV2ZWwqLworI2RlZmluZSBMVk1fQkVfTUlOX0VGRkVDVExFVkVMIDAgIC8qQkUgTWluaW11bSBFZmZlY3RMZXZlbCovCisjZGVmaW5lIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgMTUgLypCRSBNYXhpbXVtIEVmZmVjdCBsZXZlbCovCiAKLSNkZWZpbmUgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSAgICAgICAgICAyMCAgICAgICAgLypFUU5CIE1pbmltdW0gQmFuZCBGcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NQVhfQkFORF9GUkVRICAgICAgICAgIDI0MDAwICAgICAvKkVRTkIgTWF4aW11bSBCYW5kIEZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0dBSU4gICAgICAgICAgKC0xNSkgICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfR0FJTiAgICAgICAgICAxNSAgICAgICAgLypFUU5CIE1heGltdW0gQmFuZCBGcmVxdWVuY3kqLwotI2RlZmluZSBMVk1fRVFOQl9NSU5fUUZBQ1RPUiAgICAgICAgICAgIDI1ICAgICAgICAvKkVRTkIgTWluaW11bSBRIEZhY3RvciovCi0jZGVmaW5lIExWTV9FUU5CX01BWF9RRkFDVE9SICAgICAgICAgICAgMTIwMCAgICAgIC8qRVFOQiBNYXhpbXVtIFEgRmFjdG9yKi8KLSNkZWZpbmUgTFZNX0VRTkJfTUlOX0xQRl9GUkVRICAgICAgICAgICAxMDAwICAgICAgLypFUU5CIE1pbmltdW0gTG93IFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCi0jZGVmaW5lIExWTV9FUU5CX01JTl9IUEZfRlJFUSAgICAgICAgICAgMjAgICAgICAgIC8qRVFOQiBNaW5pbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KLSNkZWZpbmUgTFZNX0VRTkJfTUFYX0hQRl9GUkVRICAgICAgICAgICAxMDAwICAgICAgLypFUU5CIE1heGltdW0gSGlnaCBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fQkFORF9GUkVRIDIwICAgIC8qRVFOQiBNaW5pbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0JBTkRfRlJFUSAyNDAwMCAvKkVRTkIgTWF4aW11bSBCYW5kIEZyZXF1ZW5jeSovCisjZGVmaW5lIExWTV9FUU5CX01JTl9CQU5EX0dBSU4gKC0xNSkgLypFUU5CIE1pbmltdW0gQmFuZCBGcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NQVhfQkFORF9HQUlOIDE1ICAgIC8qRVFOQiBNYXhpbXVtIEJhbmQgRnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUlOX1FGQUNUT1IgMjUgICAgICAvKkVRTkIgTWluaW11bSBRIEZhY3RvciovCisjZGVmaW5lIExWTV9FUU5CX01BWF9RRkFDVE9SIDEyMDAgICAgLypFUU5CIE1heGltdW0gUSBGYWN0b3IqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fTFBGX0ZSRVEgMTAwMCAgIC8qRVFOQiBNaW5pbXVtIExvdyBQYXNzIENvcm5lciBmcmVxdWVuY3kqLworI2RlZmluZSBMVk1fRVFOQl9NSU5fSFBGX0ZSRVEgMjAgICAgIC8qRVFOQiBNaW5pbXVtIEhpZ2ggUGFzcyBDb3JuZXIgZnJlcXVlbmN5Ki8KKyNkZWZpbmUgTFZNX0VRTkJfTUFYX0hQRl9GUkVRIDEwMDAgICAvKkVRTkIgTWF4aW11bSBIaWdoIFBhc3MgQ29ybmVyIGZyZXF1ZW5jeSovCiAKLSNkZWZpbmUgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwgICAgICAgICAwICAgICAgICAgLypDUyBNaW5pbXVtIEVmZmVjdCBMZXZlbCovCi0jZGVmaW5lIExWTV9DU19NQVhfUkVWRVJCX0xFVkVMICAgICAgICAgMTAwICAgICAgIC8qQ1MgTWF4aW11bSBSZXZlcmIgTGV2ZWwqLwotI2RlZmluZSBMVk1fVklSVFVBTElaRVJfTUFYX1JFVkVSQl9MRVZFTCAxMDAgICAgICAvKlZpdHJ1YWxpemVyIE1heGltdW0gUmV2ZXJiIExldmVsKi8KKyNkZWZpbmUgTFZNX0NTX01JTl9FRkZFQ1RfTEVWRUwgMCAgICAgICAgICAgIC8qQ1MgTWluaW11bSBFZmZlY3QgTGV2ZWwqLworI2RlZmluZSBMVk1fQ1NfTUFYX1JFVkVSQl9MRVZFTCAxMDAgICAgICAgICAgLypDUyBNYXhpbXVtIFJldmVyYiBMZXZlbCovCisjZGVmaW5lIExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMIDEwMCAvKlZpdHJ1YWxpemVyIE1heGltdW0gUmV2ZXJiIExldmVsKi8KIAotI2RlZmluZSBMVk1fVkNfTUlYRVJfVElNRSAgICAgICAgICAgICAgMTAwICAgICAgIC8qVkMgbWl4ZXIgdGltZSovCi0jZGVmaW5lIExWTV9WQ19CQUxBTkNFX01BWCAgICAgICAgICAgICA5NiAgICAgICAgLypWQyBiYWxhbmNlIG1heCB2YWx1ZSovCi0jZGVmaW5lIExWTV9WQ19CQUxBTkNFX01JTiAgICAgICAgICAgICAoLTk2KSAgICAgLypWQyBiYWxhbmNlIG1pbiB2YWx1ZSovCisjZGVmaW5lIExWTV9WQ19NSVhFUl9USU1FIDEwMCAgICAvKlZDIG1peGVyIHRpbWUqLworI2RlZmluZSBMVk1fVkNfQkFMQU5DRV9NQVggOTYgICAgLypWQyBiYWxhbmNlIG1heCB2YWx1ZSovCisjZGVmaW5lIExWTV9WQ19CQUxBTkNFX01JTiAoLTk2KSAvKlZDIGJhbGFuY2UgbWluIHZhbHVlKi8KIAogLyogQWxnb3JpdGhtIG1hc2tzICovCi0jZGVmaW5lIExWTV9DU19NQVNLICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMVk1fRVFOQl9NQVNLICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTFZNX0RCRV9NQVNLICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExWTV9WQ19NQVNLICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgTFZNX1RFX01BU0sgICAgICAgICAgICAgICAgICAgICAzMgotI2RlZmluZSBMVk1fUFNBX01BU0sgICAgICAgICAgICAgICAgICAgIDIwNDgKKyNkZWZpbmUgTFZNX0NTX01BU0sgMQorI2RlZmluZSBMVk1fRVFOQl9NQVNLIDIKKyNkZWZpbmUgTFZNX0RCRV9NQVNLIDQKKyNkZWZpbmUgTFZNX1ZDX01BU0sgMTYKKyNkZWZpbmUgTFZNX1RFX01BU0sgMzIKKyNkZWZpbmUgTFZNX1BTQV9NQVNLIDIwNDgKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTMsMTMzICsxMTUsOTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgLyogQnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICBUeXBlOyAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9JbnRNZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVk1fSW50TWVtVGFiX3Q7Ci0KIC8qIEJ1ZmZlciBNYW5hZ2VtZW50ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCi0jZW5kaWYKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCi0jZW5kaWYKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KKyAgICBMVk1fSU5UMTYgQnVmZmVyU3RhdGU7IC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyAgICBMVk1fRkxPQVQgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworICAgIExWTV9JTlQxNiBJbkRlbGF5U2FtcGxlczsgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisgICAgTFZNX0lOVDE2IE91dERlbGF5U2FtcGxlczsgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisgICAgTFZNX0lOVDE2IFNhbXBsZXNUb091dHB1dDsgLyogU2FtcGxlcyB0byB3cml0ZSB0byB0aGUgb3V0cHV0ICovCiB9IExWTV9CdWZmZXJfdDsKIAotLyogRmlsdGVyIHRhcHMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLwotfSBMVk1fVEVfRGF0YV90OwogCi0vKiBDb2VmZmljaWVudHMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLX0gTFZNX1RFX0NvZWZzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogUHVibGljIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgUGFyYW1zOyAgICAgICAgICAgICAvKiBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IFBhcmFtczsgIC8qIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCiAgICAgLyogUHJpdmF0ZSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgQ29udHJvbFBlbmRpbmc7ICAgICAvKiBDb250cm9sIGZsYWcgdG8gaW5kaWNhdGUgdXBkYXRlIHBlbmRpbmcgKi8KLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBOZXdQYXJhbXM7ICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KKyAgICBMVk1fVUlOVDE2IENvbnRyb2xQZW5kaW5nOyAgICAgLyogQ29udHJvbCBmbGFnIHRvIGluZGljYXRlIHVwZGF0ZSBwZW5kaW5nICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBOZXdQYXJhbXM7IC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KIAogICAgIC8qIEJ1ZmZlciBjb250cm9sICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KLSAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyAgICBMVk1fSU5UMTYgSW50ZXJuYWxCbG9ja1NpemU7ICAgICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KKyAgICBMVk1fQnVmZmVyX3QqIHBCdWZmZXJNYW5hZ2VtZW50OyAvKiBCdWZmZXIgbWFuYWdlbWVudCB2YXJpYWJsZXMgKi8KKyAgICBMVk1fSU5UMTYgU2FtcGxlc1RvUHJvY2VzczsgICAgICAvKiBJbnB1dCBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLworICAgIExWTV9GTE9BVCogcElucHV0U2FtcGxlczsgICAgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgTFZNX0ZMT0FUKiBwT3V0cHV0U2FtcGxlczsgICAgICAgLyogRXh0ZXJuYWwgb3V0cHV0IHNhbXBsZSBwb2ludGVyICovCiAKICAgICAvKiBDb25maWd1cmF0aW9uIG51bWJlciAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb25OdW1iZXI7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQmxpY2tTaXplTXVsdGlwbGU7CisgICAgTFZNX0lOVDMyIENvbmZpZ3VyYXRpb25OdW1iZXI7CisgICAgTFZNX0lOVDMyIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIERDX1JlbW92YWxJbnN0YW5jZTsgLyogREMgcmVtb3ZhbCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kICovCi0gICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgaENTSW5zdGFuY2U7ICAgICAgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgIENTX0luc3RhbmNlOyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIENTX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCisgICAgTFZDU19IYW5kbGVfdCBoQ1NJbnN0YW5jZTsgICAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWQ1NfSW5zdGFuY2VfdCBDU19JbnN0YW5jZTsgLyogQ29uY2VydCBTb3VuZCBpbnN0YW5jZSAqLworICAgIExWTV9JTlQxNiBDU19BY3RpdmU7ICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBFcXVhbGl6ZXIgKi8KLSAgICBMVkVRTkJfSGFuZGxlX3QgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgICAgRVFOQl9JbnN0YW5jZTsgICAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIGluc3RhbmNlICovCi0gICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgKnBFUU5CX0JhbmREZWZzOyAgICAvKiBMb2NhbCBzdG9yYWdlIGZvciBuZXcgZGVmaW5pdGlvbnMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqcEVRTkJfVXNlckRlZnM7ICAgIC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFUU5CX0FjdGl2ZTsgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIExWRVFOQl9IYW5kbGVfdCBoRVFOQkluc3RhbmNlOyAgICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZFUU5CX0luc3RhbmNlX3QgRVFOQl9JbnN0YW5jZTsgICAgLyogTi1CYW5kIEVxdWFsaXNlciBpbnN0YW5jZSAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCogcEVRTkJfQmFuZERlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIG5ldyBkZWZpbml0aW9ucyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCogcEVRTkJfVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fSU5UMTYgRVFOQl9BY3RpdmU7ICAgICAgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCAqLwotICAgIExWREJFX0hhbmRsZV90ICAgICAgICAgIGhEQkVJbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLwotICAgIExWREJFX0luc3RhbmNlX3QgICAgICAgIERCRV9JbnN0YW5jZTsgICAgICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KKyAgICBMVkRCRV9IYW5kbGVfdCBoREJFSW5zdGFuY2U7ICAgLyogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWREJFX0luc3RhbmNlX3QgREJFX0luc3RhbmNlOyAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgREJFX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAKICAgICAvKiBWb2x1bWUgQ29udHJvbCAqLwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgIFZDX1ZvbHVtZTsgICAgICAgICAgLyogVm9sdW1lIHNjYWxlciAqLwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCisgICAgTFZNaXhlcjNfMVN0X0ZMT0FUX3N0IFZDX1ZvbHVtZTsgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgVkNfQmFsYW5jZU1peDsgLyogVkMgYmFsYW5jZSBtaXhlciAqLworICAgIExWTV9JTlQxNiBWQ19Wb2x1bWVkQjsgICAgICAgICAgICAgICAvKiBHYWluIGluIGRCICovCisgICAgTFZNX0lOVDE2IFZDX0FjdGl2ZTsgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIExWTV9JTlQxNiBWQ19BVkxGaXhlZFZvbHVtZTsgICAgICAgICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCiAKICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgKi8KLSAgICBMVk1fVEVfRGF0YV90ICAgICAgICAgICAqcFRFX1RhcHM7ICAgICAgICAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCi0gICAgTFZNX1RFX0NvZWZzX3QgICAgICAgICAgKnBURV9TdGF0ZTsgICAgICAgICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBURV9BY3RpdmU7ICAgICAgICAgIC8qIENvbnRyb2wgZmxhZyAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwVEVCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fSU5UMTYgVEVfQWN0aXZlOyAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIEhlYWRyb29tICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgTmV3SGVhZHJvb21QYXJhbXM7ICAgLyogTmV3IGhlYWRyb29tIHBhcmFtZXRlcnMgcGVuZGluZyB1cGRhdGUgKi8KLSAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICBIZWFkcm9vbVBhcmFtczsgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCi0gICAgTFZNX0hlYWRyb29tQmFuZERlZl90ICAgKnBIZWFkcm9vbV9Vc2VyRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgdGhlIHVzZXIncyBkZWZpbml0aW9ucyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEhlYWRyb29tOyAgICAgICAgICAgIC8qIFZhbHVlIG9mIHRoZSBjdXJyZW50IGhlYWRyb29tICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgTmV3SGVhZHJvb21QYXJhbXM7ICAgIC8qIE5ldyBoZWFkcm9vbSBwYXJhbWV0ZXJzIHBlbmRpbmcgdXBkYXRlICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QqIHBIZWFkcm9vbV9CYW5kRGVmczsgLyogTG9jYWwgc3RvcmFnZSBmb3IgbmV3IGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tQmFuZERlZl90KiBwSGVhZHJvb21fVXNlckRlZnM7IC8qIExvY2FsIHN0b3JhZ2UgZm9yIHRoZSB1c2VyJ3MgZGVmaW5pdGlvbnMgKi8KKyAgICBMVk1fVUlOVDE2IEhlYWRyb29tOyAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgb2YgdGhlIGN1cnJlbnQgaGVhZHJvb20gKi8KIAogICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyICovCi0gICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgaFBTQUluc3RhbmNlOyAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICBQU0FfSW5zdGFuY2U7ICAgICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIGluc3RhbmNlICovCi0gICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgUFNBX0luaXRQYXJhbXM7ICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgUFNBX0NvbnRyb2xQYXJhbXM7ICAvKiBTcGVjdHJ1bSBBbmFseXplciBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBQU0FfR2Fpbk9mZnNldDsgICAgIC8qIFRvbmUgY29udHJvbCBmbGFnICovCi0gICAgTFZNX0NhbGxiYWNrICAgICAgICAgICAgQ2FsbEJhY2s7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLworICAgIHBMVlBTQV9IYW5kbGVfdCBoUFNBSW5zdGFuY2U7ICAgICAgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90IFBTQV9JbnN0YW5jZTsgICAgICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBpbnN0YW5jZSAqLworICAgIExWUFNBX0luaXRQYXJhbXNfdCBQU0FfSW5pdFBhcmFtczsgICAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBQU0FfQ29udHJvbFBhcmFtczsgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgTFZNX0lOVDE2IFBTQV9HYWluT2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLworICAgIExWTV9DYWxsYmFjayBDYWxsQmFjazsKKyAgICBMVk1fRkxPQVQqIHBQU0FJbnB1dDsgLyogUFNBIGlucHV0IHBvaW50ZXIgKi8KIAotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KKyAgICBMVk1fSU5UMTYgTm9TbW9vdGhWb2x1bWU7IC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCisgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyIENoTWFzazsKKyAgICB2b2lkKiBwU2NyYXRjaDsgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIqLwogCiB9IExWTV9JbnN0YW5jZV90OwogCkBAIC0yNDksMzIgKzIxMSwxOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSk7CitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UpOwogCi12b2lkICAgIExWTV9TZXRUcmVibGVCb29zdCggTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLXZvaWQgICAgTFZNX1NldFZvbHVtZSggIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwordm9pZCBMVk1fU2V0Vm9sdW1lKExWTV9JbnN0YW5jZV90KiBwSW5zdGFuY2UsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVk1fSU5UMzIgICAgTFZNX1ZDQ2FsbEJhY2sodm9pZCogICBwQnVuZGxlSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgQ2FsbEJhY2tQYXJhbSk7CitMVk1fSU5UMzIgTFZNX1ZDQ2FsbEJhY2sodm9pZCogcEJ1bmRsZUhhbmRsZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLCBzaG9ydCBDYWxsQmFja1BhcmFtKTsKIAotdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLXZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKLXZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7Cit2b2lkIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwgTFZNX0ZMT0FUKiogcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCoqIHBQcm9jZXNzZWQsIExWTV9VSU5UMTYqIHBOdW1TYW1wbGVzKTsKK3ZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2KiBwTnVtU2FtcGxlcyk7CiAKLUxWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCAgICAgdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCk7CitMVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayh2b2lkKiBwQnVuZGxlSGFuZGxlLCB2b2lkKiBwRGF0YSwgTFZNX0lOVDE2IGNhbGxiYWNrSWQpOwogCi0jZW5kaWYgICAgICAvKiBfX0xWTV9QUklWQVRFX0hfXyAqLwotCisjZW5kaWYgLyogX19MVk1fUFJJVkFURV9IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcAppbmRleCBkYzg2Y2ZkLi40ZWVhMDRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgogCkBAIC01MSwyNzkgKzUyLDE2NiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBTYW1wbGVDb3VudCA9IE51bVNhbXBsZXM7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0ICAgICA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7Ci0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIE5yQ2hhbm5lbHMgID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ2hNYXNrICAgICAgPSBwSW5zdGFuY2UtPkNoTWFzazsKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMsIExWTV9VSU5UMzIgQXVkaW9UaW1lKSB7CisgICAgTFZNX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCogcElucHV0ID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQqIHBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUKilwSW5EYXRhOworICAgIExWTV9GTE9BVCogcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gU3RhdHVzOworICAgIExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworICAgIExWTV9JTlQzMiBDaE1hc2sgPSBwSW5zdGFuY2UtPkNoTWFzazsKICNkZWZpbmUgTnJGcmFtZXMgU2FtcGxlQ291bnQgIC8vIGFsaWFzIGZvciBjbGFyaXR5Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2hlY2sgdmFsaWQgcG9pbnRzIGhhdmUgYmVlbiBnaXZlbgogICAgICAqLwotICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIEZvciB1bm1hbmFnZWQgbW9kZSBvbmx5CiAgICAgICovCi0gICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgIC8qCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykgeworICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgYSBnb29kIG11bHRpcGxlICh1bm1hbmFnZWQgbW9kZSBvbmx5KQogICAgICAgICAgKi8KLSAgICAgICAgaWYoKE51bVNhbXBsZXMgJSBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKKyAgICAgICAgaWYgKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fSU5WQUxJRE5VTVNBTVBMRVMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2hlY2sgdGhlIGJ1ZmZlciBhbGlnbm1lbnQKICAgICAgICAgICovCi0gICAgICAgIGlmKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVk1fQUxJR05NRU5URVJST1IpOworICAgICAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fQUxJR05NRU5URVJST1IpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CiAgICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgeworICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKSB7CiAgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KICAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSAgICAgICAgQ2hNYXNrICAgICA9IHBJbnN0YW5jZS0+Q2hNYXNrOwotI2VuZGlmCisgICAgICAgIENoTWFzayA9IHBJbnN0YW5jZS0+Q2hNYXNrOwogCi0gICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKLSAgICAgICAgeworICAgICAgICBpZiAoU3RhdHVzICE9IExWTV9TVUNDRVNTKSB7CiAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQotICAgIHsKLSAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKLSAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgTnJDaGFubmVscyA9IDI7Ci0gICAgICAgIENoTWFzayAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKgogICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKICAgICAgKi8KLSAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKLSAgICB7CisgICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApIHsKICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKICAgICAgICAgICovCi0gICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKyAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwgcElucHV0LCAmcFRvUHJvY2VzcywgJnBQcm9jZXNzZWQsICZTYW1wbGVDb3VudCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgogICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KICAgICAgICAgICovCi0gICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgICh2b2lkKUxWQ1NfUHJvY2VzcyhwSW5zdGFuY2UtPmhDU0luc3RhbmNlLCAvKiBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBTYW1wbGVDb3VudCk7CiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSB2b2x1bWUgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQotICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCi0jZW5kaWYKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsIHBUb1Byb2Nlc3MsIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkgeworICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLCBwUHJvY2Vzc2VkLCBTYW1wbGVDb3VudCk7CiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRCRV9BY3RpdmUgPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywgcFByb2Nlc3NlZCwgU2FtcGxlQ291bnQpOwogICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBDb3B5IGFsbCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgorICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgLyogQ29weSBhbGwgc2FtcGxlcyAqLwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgdHJlYmxlIGJvb3N0IGlmIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLSNlbmRpZgotCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wVEVCaXF1YWQtPnByb2Nlc3MocFByb2Nlc3NlZCwgcFByb2Nlc3NlZCwgTnJGcmFtZXMpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWRbaV0gPSBMVk1fQ2xhbXAocFByb2Nlc3NlZFtpXSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoTWFzayk7Ci0jZWxzZQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKLSNlbmRpZgorICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LCBwUHJvY2Vzc2VkLCBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgTnJDaGFubmVscywgQ2hNYXNrKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKLSAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpIHsKKyAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwgcEluc3RhbmNlLT5wUFNBSW5wdXQsIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKLSNlbmRpZgogCi0gICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7CisgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoU2FtcGxlQ291bnQpLCBBdWRpb1RpbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogREMgcmVtb3ZhbAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLSNlbmRpZgorICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLCBwUHJvY2Vzc2VkLCBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgTnJDaGFubmVscyk7CiAgICAgICAgIH0KICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgICAqLwotICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOwotCisgICAgICAgIExWTV9CdWZmZXJPdXQoaEluc3RhbmNlLCBwT3V0RGF0YSwgJlNhbXBsZUNvdW50KTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZNX1NVQ0NFU1MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcAppbmRleCA2NjM5MmUyLi44NjAxOTZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmNwcApAQCAtMzAsNDMxICszMCwyOTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1GT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKK0ZPX0ZMT0FUX0xTaHhfQ29lZnNfdCBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0gewogCi0gICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsIC1IUEZfRnMyMjA1MF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsIC1IUEZfRnMyMjA1MF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsIC1IUEZfRnMyMjA1MF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTJfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLCAtSFBGX0ZzMjIwNTBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTVfQTAsIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwgLUhQRl9GczI0MDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjJfQTAsIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwgLUhQRl9GczI0MDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjVfQTAsIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwgLUhQRl9GczI0MDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjhfQTAsIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwgLUhQRl9GczI0MDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwgLUhQRl9GczI0MDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMzJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9BMCwgLUhQRl9GczMyMDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9BMCwgLUhQRl9GczMyMDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19BMCwgLUhQRl9GczMyMDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9BMCwgLUhQRl9GczMyMDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19BMCwgLUhQRl9GczMyMDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsIC1IUEZfRnMzMjAwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjFfQjEsfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xNV9CMX0sCisgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0ExLCAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSwKKyAgICAgICAgfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfQTAsIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwgLUhQRl9GczQ0MTAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfQTAsIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwgLUhQRl9GczQ0MTAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfQTAsIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwgLUhQRl9GczQ0MTAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwgLUhQRl9GczQ0MTAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwLCAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAogCi0gICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQotICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogNDhrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMV9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjNfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNF9BMCwgLUhQRl9GczQ4MDAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjZfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluN19BMCwgLUhQRl9GczQ4MDAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjlfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCwgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTJfQjF9LAorICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19BMCwgLUhQRl9GczQ4MDAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLCAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsIC1IUEZfRnM0ODAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiA4OGtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xX0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4yX0ExLCAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLCAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjNfQTAsIC1IUEZfRnM4ODIwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNF9BMSwgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNF9BMCwgLUhQRl9Gczg4MjAwX0dhaW40X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW41X0ExLCAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjZfQTAsIC1IUEZfRnM4ODIwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluN19BMSwgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICBIUEZfRnM4ODIwMF9HYWluN19BMCwgLUhQRl9Gczg4MjAwX0dhaW43X0IxfSwKKyAgICAgICAge0hQRl9Gczg4MjAwX0dhaW44X0ExLCAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLCAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjlfQTAsIC1IUEZfRnM4ODIwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTBfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMF9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTFfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMl9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xM19BMCwgLUhQRl9Gczg4MjAwX0dhaW4xM19CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTRfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNV9BMCwgLUhQRl9Gczg4MjAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogOTZrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTVfQjF9LAorICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjJfQTEsIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMl9BMCwgLUhQRl9Gczk2MDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4zX0ExLCAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW40X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjVfQTEsIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluNV9BMCwgLUhQRl9Gczk2MDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW42X0ExLCAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW43X0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjhfQTEsIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluOF9BMCwgLUhQRl9Gczk2MDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW45X0ExLCAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEwX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMV9BMSwgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTFfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjEyX0ExLCAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjEzX0EwLCAtSFBGX0ZzOTYwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNF9BMSwgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTRfQTAsIC1IUEZfRnM5NjAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE1X0ExLCAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCiAKLSAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKyAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjFfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4yX0ExLCAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMl9BMCwgLUhQRl9GczE3NjQwMF9HYWluMl9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjRfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW41X0ExLCAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNV9BMCwgLUhQRl9GczE3NjQwMF9HYWluNV9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjZfQTEsIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjdfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW44X0ExLCAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOF9BMCwgLUhQRl9GczE3NjQwMF9HYWluOF9CMX0sCisgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjlfQTEsIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLCAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTBfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTFfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTFfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjExX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTJfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTNfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTRfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTRfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjE0X0IxfSwKKyAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTVfQTEsIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKIAotICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9Ci0gICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIC8qIDE5MmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjFfQTEsIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4yX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluM19BMSwgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluM19BMCwgLUhQRl9GczE5MjAwMF9HYWluM19CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjRfQTEsIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW41X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW41X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNl9BMSwgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluNl9BMCwgLUhQRl9GczE5MjAwMF9HYWluNl9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjdfQTEsIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW44X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW44X0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOV9BMSwgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluOV9BMCwgLUhQRl9GczE5MjAwMF9HYWluOV9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEwX0ExLCAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCwgLUhQRl9GczE5MjAwMF9HYWluMTFfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSwgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEyX0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xMl9CMX0sCisgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEzX0ExLCAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCwgLUhQRl9GczE5MjAwMF9HYWluMTRfQjF9LAorICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSwgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE1X0EwLCAtSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDYzLDE0ICszMjksMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCi1jb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7Ci0gICAgMS4wMDBmLCAgICAgICAgICAgICAvKiAgMGRCICovCi0gICAgMC44OTFmLCAgICAgICAgICAgICAvKiAtMWRCICovCi0gICAgMC43OTRmLCAgICAgICAgICAgICAvKiAtMmRCICovCi0gICAgMC43MDhmLCAgICAgICAgICAgICAvKiAtM2RCICovCi0gICAgMC42MzFmLCAgICAgICAgICAgICAvKiAtNGRCICovCi0gICAgMC41NjJmLCAgICAgICAgICAgICAvKiAtNWRCICovCi0gICAgMC41MDFmfTsgICAgICAgICAgICAvKiAtNmRCICovCitjb25zdCBMVk1fRkxPQVQgTFZNX1ZvbHVtZVRhYmxlW10gPSB7MS4wMDBmLCAgLyogIDBkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxZiwgIC8qIC0xZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5NGYsICAvKiAtMmRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDhmLCAgLyogLTNkQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMxZiwgIC8qIC00ZEIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MmYsICAvKiAtNWRCICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDFmfTsgLyogLTZkQiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ3OCwyNCArMzQzLDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAgICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgICAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAzMjU4MCAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1IDMyNjMyIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAzMjY0MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgMzI2NzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwIDMyNzAwIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAzMjcwNSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgMzI3MjEgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwIDMyNzM0IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCisjZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAzMjczNyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwogCi1jb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0gewotICAgIExWTV9NSVhfVENfRnM4MDAwLAotICAgIExWTV9NSVhfVENfRnMxMTAyNSwKLSAgICBMVk1fTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZNX01JWF9UQ19GczE2MDAwLAotICAgIExWTV9NSVhfVENfRnMyMjA1MCwKLSAgICBMVk1fTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZNX01JWF9UQ19GczMyMDAwLAotICAgIExWTV9NSVhfVENfRnM0NDEwMCwKLSAgICBMVk1fTUlYX1RDX0ZzNDgwMDB9OwotCitjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0ge0xWTV9NSVhfVENfRnM4MDAwLCAgTFZNX01JWF9UQ19GczExMDI1LCBMVk1fTUlYX1RDX0ZzMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NSVhfVENfRnMxNjAwMCwgTFZNX01JWF9UQ19GczIyMDUwLCBMVk1fTUlYX1RDX0ZzMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NSVhfVENfRnMzMjAwMCwgTFZNX01JWF9UQ19GczQ0MTAwLCBMVk1fTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCmluZGV4IGZjODIxOTQuLmNmMmZiNWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKQEAgLTMzLDcgKzMzLDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworZXh0ZXJuIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1LDQgKzQ1LDMgQEAKIGV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdOwogCiAjZW5kaWYgLyogX19MVk1fVEFCTEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IGJlZjdmYTEuLjMxYzgyMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0zMSwxNiArMzEsMTUgQEAKIC8qICAgIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUICBBR0NfR2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgQUdDX01heEdhaW47ICAgICAgICAgICAgICAgICAgICAgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgIFZvbHVtZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICBBR0NfVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICBBR0NfQXR0YWNrOyAgICAgICAgICAgICAgICAgICAgICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgQUdDX0RlY2F5OyAgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFHQ19HYWluOyAgICAvKiBUaGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfTWF4R2FpbjsgLyogVGhlIG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgVm9sdW1lOyAgICAgIC8qIFRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgICAgICAvKiBUaGUgdGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIEFHQ19UYXJnZXQ7ICAvKiBBR0MgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUIEFHQ19BdHRhY2s7ICAvKiBBR0MgYXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfRGVjYXk7ICAgLyogQUdDIGRlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCBWb2x1bWVUQzsgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90OwogCkBAIC00OSwxOSArNDgsMTEgQEAKIC8qICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwotI2VuZGlmCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCogcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBTdFNyYywgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHBNb25vU3JjLCAgICAgICAgICAgICAgIC8qIE1vbm8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERzdCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOckZyYW1lcywgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnJDaGFubmVscyk7ICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCiAKLSNlbmRpZiAgLyogX19BR0NfSF9fICovCi0KKyNlbmRpZiAvKiBfX0FHQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggYzA1MGNkMC4uMDBiNTM5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTIyLDI4MSArMjIsNjcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFRoZSBtZW1vcnkgcmVnaW9uIGNyZWF0ZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgaW5zdGFuY2UgaXMgdHlwZWNhc3QKICAgICAgKiBpbnRvIGFub3RoZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIGFuZCBhbiBhcnJheSBvZiBmaWx0ZXIKICAgICAgKiBjb2VmZmljaWVudHMuIEluIG9uZSBjYXNlIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyB1c2VkIGZvciBzdG9yaW5nCiAgICAgICogREMgY29tcG9uZW50IG9mIGNoYW5uZWxzCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICpwU3RvcmFnZTsKKyAgICBMVk1fRkxPQVQqIHBTdG9yYWdlOwogICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLSNlbmRpZgogfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBCaXF1YWQgY29lZmZpY2llbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgQTI7ICAgLyogIGEyICAqLwotICAgIExWTV9GTE9BVCAgQTE7ICAgLyogIGExICAqLwotICAgIExWTV9GTE9BVCAgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLwotICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMjsgLyogIGEyICAqLworICAgIExWTV9GTE9BVCBBMTsgLyogIGExICAqLworICAgIExWTV9GTE9BVCBBMDsgLyogIGEwICAqLworICAgIExWTV9GTE9BVCBCMjsgLyogLWIyISAqLworICAgIExWTV9GTE9BVCBCMTsgLyogLWIxISAqLwogfSBCUV9GTE9BVF9Db2Vmc190OwogCiAvKioqIEZpcnN0IG9yZGVyIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIEExOyAgIC8qICBhMSAgKi8KLSAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEExOyAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCiB9IEZPX0ZMT0FUX0NvZWZzX3Q7CiAKIC8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzIHdpdGggU2hpZnQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIEExOyAgICAvKiAgYTEgICovCi0gICAgTFZNX0ZMT0FUIEEwOyAgICAvKiAgYTAgICovCi0gICAgTFZNX0ZMT0FUIEIxOyAgICAvKiAtYjEhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEExOyAvKiAgYTEgICovCisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCiB9IEZPX0ZMT0FUX0xTaHhfQ29lZnNfdDsKIC8qKiogQmFuZCBwYXNzIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTA7IC8qICBhMCAgKi8KKyAgICBMVk1fRkxPQVQgQjI7IC8qIC1iMiEgKi8KKyAgICBMVk1fRkxPQVQgQjE7IC8qIC1iMSEgKi8KIH0gQlBfRkxPQVRfQ29lZnNfdDsKIAogLyoqKiBQZWFraW5nIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0ZMT0FUIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLwotICAgIExWTV9GTE9BVCAgRzsgICAvKiBHYWluICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEEwOyAvKiAgYTAgICovCisgICAgTFZNX0ZMT0FUIEIyOyAvKiAtYjIhICovCisgICAgTFZNX0ZMT0FUIEIxOyAvKiAtYjEhICovCisgICAgTFZNX0ZMT0FUIEc7ICAvKiBHYWluICovCiB9IFBLX0ZMT0FUX0NvZWZzX3Q7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBUQVBTIFRZUEUgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIFR5cGVzIHVzZWQgZm9yIGZpcnN0IG9yZGVyIGFuZCBzaGVsdmluZyBmaWx0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwotfSBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgLyogTFZNX01BWF9DSEFOTkVMUyBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKSBdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiAyKSBdOyAgLyogVHdvIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotI2VuZGlmCi19IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OwotCi0vKioqIFR5cGVzIHVzZWQgZm9yIGJpcXVhZCwgYmFuZCBwYXNzIGFuZCBwZWFraW5nIGZpbHRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLX0gQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07Ci0jZWxzZQotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwotI2VuZGlmCi19IEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190OwotLyogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbnMgYXJlIGNoYW5nZWQgdG8gc2F0aXNmeSBRQUMgcnVsZXM6IE5hbWUgc2hvdWxkIGJlIFVuaXF1ZSB3aXRoaW5nIDE2IGNoYXJhY3RlcnMqLwotI2RlZmluZSBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICBJbml0X0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxCi0jZGVmaW5lIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICAgICAgIFRXT19CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQklRVUFEIEZJTFRFUlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCi12b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLXZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLXZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7Ci0KLXZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogRklSU1QgT1JERVIgRklMVEVSUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0xTaHhfQ29lZnNfdCAgICAgKnBDb2VmKTsKLQotdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gUFJPVE9UWVBFUzogQkFORCBQQVNTIEZJTFRFUlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAqcENvZWYpOwotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0vKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci12b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0KLS8qKiogMzIgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLXZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IERDIFJFTU9WQUwgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCBTVEVSRU8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSk7CiAKLXZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Ci0KLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiogX0JJUVVBRF9IXyAqKi8KLQorI2VuZGlmIC8qKiBfQklRVUFEX0hfICoqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCmluZGV4IDViN2NiMWIuLjJmYzc4YjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKQEAgLTM1LDIxICszNSwyMSBAQAogdHlwZWRlZiBzdHJ1Y3QgLyogQ29tcHJlc3NvciBzdGF0ZSAqLwogewogICAgIC8qIE5vcm1hbGlzZXIgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0F0dGFjazsgICAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBOb3JtX0RlY2F5OyAgICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQzMiAgIE5vcm1JbnQ7ICAgICAgICAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KLSAgICBMVk1fSU5UMTYgICBTaGlmdDsgICAgICAgICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KLSAgICBMVk1fSU5UMTYgICBUaHJlc2hvbGQ7ICAgICAgICAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9BdHRhY2s7IC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIHRoZSBOb3JtYWxpc2VyIGludGVncmF0b3IgKi8KKyAgICBMVk1fSU5UMTYgTm9ybV9EZWNheTsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgdGhlIE5vcm1hbGlzZXIgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQzMiBOb3JtSW50OyAgICAgLyogTm9ybWFsaXNlciBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMTYgU2hpZnQ7ICAgICAgIC8qIFNoaWZ0IGdhaW4gKi8KKyAgICBMVk1fSU5UMTYgVGhyZXNob2xkOyAgIC8qIFRhcmdldCB0aHJlc2hvbGQgKi8KIAogICAgIC8qIENvbXByZXNzb3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGVuOyAgICAgICAgIC8qIEF0dGVudWF0aW9uIGFwcGxpZWQgYmVmb3JlIHNvZnQga25lZSBjb21wcmVzc29yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9BdHRhY2tfUzsgICAgICAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCi0gICAgTFZNX0lOVDE2ICAgQ29tcF9EZWNheV9TOyAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50IG9mIHNsb3cgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0F0dGFja19GOyAgICAgIC8qIEF0dGFjayB0aW1lIGNvbnN0YW50IG9mIGZhc3QgdGhlIGludGVncmF0b3IgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wX0RlY2F5X0Y7ICAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLwotICAgIExWTV9JTlQxNiAgIFNvZnRDbGlwR2FpbjsgICAgICAgLyogU29mdCBjbGlwIGdhaW4gY29udHJvbCAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRTbG93OyAgICAgICAgLyogQ29tcHJlc3NvciBzbG93IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwotICAgIExWTV9JTlQzMiAgIENvbXBJbnRGYXN0OyAgICAgICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGVuOyAgICAvKiBBdHRlbnVhdGlvbiBhcHBsaWVkIGJlZm9yZSBzb2Z0IGtuZWUgY29tcHJlc3NvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19TOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiB0aGUgc2xvdyBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfUzsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2Ygc2xvdyB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBDb21wX0F0dGFja19GOyAvKiBBdHRhY2sgdGltZSBjb25zdGFudCBvZiBmYXN0IHRoZSBpbnRlZ3JhdG9yICovCisgICAgTFZNX0lOVDE2IENvbXBfRGVjYXlfRjsgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQgb2YgZmFzdCB0aGUgaW50ZWdyYXRvciAqLworICAgIExWTV9JTlQxNiBTb2Z0Q2xpcEdhaW47ICAvKiBTb2Z0IGNsaXAgZ2FpbiBjb250cm9sICovCisgICAgTFZNX0lOVDMyIENvbXBJbnRTbG93OyAgIC8qIENvbXByZXNzb3Igc2xvdyBpbnRlZ3JhdG9yIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBMVk1fSU5UMzIgQ29tcEludEZhc3Q7ICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwogCiB9IENvbXBMaW1fSW5zdGFuY2VfdDsKIApAQCAtNTgsMTAgKzU4LDcgQEAKIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKTsKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgR2FpbiwgTFZNX0ZMT0FUKiBwRGF0YUluLCBMVk1fRkxPQVQqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBCbG9ja0xlbmd0aCk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKaW5kZXggMWVlYjMyMS4uMGJhNTIyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvRmlsdGVyLmgKQEAgLTI3LDI2ICsyNywyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklORVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBGSUxURVJfTE9TUyAgICAgMzI3MzAgICAgICAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLwotI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAgICAwLjk5ODg0OWYKKyNkZWZpbmUgRklMVEVSX0xPU1MgMzI3MzAgLyogLTAuMDFkQiBsb3NzIHRvIGF2b2lkIHdyYXBwaW5nIGR1ZSB0byBiYW5kIHJpcHBsZSAqLworI2RlZmluZSBGSUxURVJfTE9TU19GTE9BVCAwLjk5ODg0OWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0ZMT0FUIExWTV9Qb3dlcjEwKCAgIExWTV9GTE9BVCAgWCk7CitMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUIFgpOwogCi1MVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBYKTsKLUxWTV9GTE9BVCAgIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICBGYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlKTsKK0xWTV9GTE9BVCBMVk1fUG9seW5vbWlhbChMVk1fVUlOVDE2IE4sIExWTV9GTE9BVCogcENvZWZmaWNpZW50cywgTFZNX0ZMT0FUIFgpOworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gU2FtcGxlUmF0ZSk7CiAKLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgICBMVk1fRkxPQVQgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpOworTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpOwogCi1MVk1fRkxPQVQgTFZNX0ZPX0hQRiggICAgTFZNX0ZMT0FUICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKK0xWTV9GTE9BVCBMVk1fRk9fSFBGKExWTV9GTE9BVCB3LCBGT19GTE9BVF9Db2Vmc190KiBwQ29lZmZzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qKiBfRklMVEVSX0hfICoqLwotCisjZW5kaWYgLyoqIF9GSUxURVJfSF8gKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU4NGU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0luc3RBbGxvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0lOU1RBTExPQ19IX18KLSNkZWZpbmUgX19JTlNUQUxMT0NfSF9fCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotLyogIFR5cGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgVG90YWxTaXplOyAgICAgIC8qICBBY2N1bXVsYXRpdmUgdG90YWwgbWVtb3J5IHNpemUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1aW50cHRyX3QgICAgICAgICAgICAgICBwTmV4dE1lbWJlcjsgICAgLyogIFBvaW50ZXIgdG8gdGhlIG5leHQgaW5zdGFuY2UgbWVtYmVyIHRvIGJlIGFsbG9jYXRlZCAqLwotfSAgIElOU1RfQUxMT0M7Ci0KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQotICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKLSAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5Ci0gKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCi0gKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgotICogIFJlbWFya3MgICAgIDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgKnBtcywgdm9pZCAqU3RhcnRBZGRyICk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfQWRkTWVtYmVyKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICBTaXplIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldyBhZGRlZCBtZW1iZXIKLSAqICBSZXR1cm5zICAgICA6IEEgcG9pbnRlciB0byB0aGUgbmV3IGFkZGVkIG1lbWJlcgotICogIERlc2NyaXB0aW9uIDogQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldyBtZW1iZXIgaW4gdGhlIGluc3RhbmNlIG1lbW9yeSBhbmQgcmV0dXJucwotICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIHRoaXMgbmV3IG1lbWJlci4gIFRoZSBzdGFydCBhZGRyZXNzIG9mIGFsbCBtZW1iZXJzIHdpbGwKLSAgICAgICAgICAgICAgICAgIGJlIDMyIGJpdCBhbGxpZ25lZC4KLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCogSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAqcG1zLCBMVk1fVUlOVDMyIFNpemUgKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19HZXRUb3RhbCgpCi0gKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQotICogIFJldHVybnMgICAgIDogVGhlIGluc3RhbmNlIG1lbW9yeSBzaXplCi0gKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIGluc3RhbmNlIG1lbW9yeSBzaXplCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWTV9VSU5UMzIgSW5zdEFsbG9jX0dldFRvdGFsKCBJTlNUX0FMTE9DICpwbXMpOwotCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGxSZXQoICAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKipwdHIpOwotCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpOwotCi12b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSk7Ci0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgICAgICAgICAgICAgKnBtcyk7Ci0KLSNlbmRpZiAvKiBfX0pCU19JTlNUQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmgKaW5kZXggNDlmMTZhZC4uZDNkMTI4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaApAQCAtMzksMTIgKzM5LDExIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQWxnb3JpdGhtIGlkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lIEFMR09SSVRITV9OT05FX0lEICAgICAgMHgwMDAwCi0jZGVmaW5lIEFMR09SSVRITV9DU19JRCAgICAgICAgMHgwMTAwCi0jZGVmaW5lIEFMR09SSVRITV9FUU5CX0lEICAgICAgMHgwMjAwCi0jZGVmaW5lIEFMR09SSVRITV9EQkVfSUQgICAgICAgMHgwMzAwCi0jZGVmaW5lIEFMR09SSVRITV9WQ19JRCAgICAgICAgMHgwNTAwCi0jZGVmaW5lIEFMR09SSVRITV9URV9JRCAgICAgICAgMHgwNjAwCisjZGVmaW5lIEFMR09SSVRITV9OT05FX0lEIDB4MDAwMAorI2RlZmluZSBBTEdPUklUSE1fQ1NfSUQgMHgwMTAwCisjZGVmaW5lIEFMR09SSVRITV9FUU5CX0lEIDB4MDIwMAorI2RlZmluZSBBTEdPUklUSE1fREJFX0lEIDB4MDMwMAorI2RlZmluZSBBTEdPUklUSE1fVkNfSUQgMHgwNTAwCisjZGVmaW5lIEFMR09SSVRITV9URV9JRCAweDA2MDAKIAotI2VuZGlmICAgICAgLyogX19MVk1fQ09NTU9OX0hfXyAqLwotCisjZW5kaWYgLyogX19MVk1fQ09NTU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oCmluZGV4IDFhMTUxMjUuLmI5ODQ3NDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKQEAgLTI4LDMxICsyOCwzNiBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAotICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCi0gICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XAotICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9tYXNrPTB4MDAwMEZGRkY7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gKChMVk1fSU5UMzIpKChMVk1fSU5UMTYpKChBKT4+MTYpKSooKExWTV9JTlQxNikoKEIpPj4xNikpICk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ITD0gKChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEEpPj4xNikpKSA7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9MSD0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSooKExWTV9JTlQxNikoKEIpPj4xNikpKTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPSAoTFZNX0lOVDMyKSgoQSkmTVVMMzJ4MzJJTlRPMzJfbWFzaykqKExWTV9JTlQzMikoKEIpJk1VTDMyeDMySU5UTzMyX21hc2spO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcD0gKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEwmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEgmTVVMMzJ4MzJJTlRPMzJfbWFzaykrKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMPj4xNikmTVVMMzJ4MzJJTlRPMzJfbWFzayk7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD0gTVVMMzJ4MzJJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfSEw+PjE2KSsoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSD4+MTYpKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXA+PjE2KTtcCi0gICAgICAgIE1VTDMyeDMySU5UTzMyX0xMPU1VTDMyeDMySU5UTzMyX0xMKyhMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0hMPDwxNikrKExWTV9JTlQzMikoTVVMMzJ4MzJJTlRPMzJfTEg8PDE2KTtcCi0gICAgICAgIGlmKHNoaWZ0VmFsdWU8MzIpXAotICAgICAgICB7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9ISD1NVUwzMngzMklOVE8zMl9ISDw8KDMyLXNoaWZ0VmFsdWUpO1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfbWFzaz0oKExWTV9JTlQzMikxPDwoMzItc2hpZnRWYWx1ZSkpLTE7XAotICAgICAgICBNVUwzMngzMklOVE8zMl9MTD0oTVVMMzJ4MzJJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpJk1VTDMyeDMySU5UTzMyX21hc2s7XAotICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMj1NVUwzMngzMklOVE8zMl9ISHxNVUwzMngzMklOVE8zMl9MTDtcCi0gICAgICAgIH1cCi0gICAgICAgIGVsc2VcCi0gICAgICAge1wKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDI9KExWTV9JTlQzMilNVUwzMngzMklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMzIpO1wKLSAgICAgICB9XAotICAgICAgIChDKSA9IE1VTDMyeDMySU5UTzMyX3RlbXAyO1wKLSAgICAgICB9CisjZGVmaW5lIE1VTDMyeDMySU5UTzMyKEEsIEIsIEMsIFNoaWZ0UikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMVk1fSU5UMzIgTVVMMzJ4MzJJTlRPMzJfdGVtcCwgTVVMMzJ4MzJJTlRPMzJfdGVtcDIsIE1VTDMyeDMySU5UTzMyX21hc2ssICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfSEgsIE1VTDMyeDMySU5UTzMyX0hMLCBNVUwzMngzMklOVE8zMl9MSCwgTVVMMzJ4MzJJTlRPMzJfTEw7ICAgIFwKKyAgICAgICAgTFZNX0lOVDMyIHNoaWZ0VmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaGlmdFZhbHVlID0gKFNoaWZ0Uik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX21hc2sgPSAweDAwMDBGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfSEggPSAoKExWTV9JTlQzMikoKExWTV9JTlQxNikoKEEpID4+IDE2KSkgKiAoKExWTV9JTlQxNikoKEIpID4+IDE2KSkpOyAgXAorICAgICAgICBNVUwzMngzMklOVE8zMl9ITCA9ICgoTFZNX0lOVDMyKSgoQikmTVVMMzJ4MzJJTlRPMzJfbWFzaykgKiAoKExWTV9JTlQxNikoKEEpID4+IDE2KSkpOyBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xIID0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSAqICgoTFZNX0lOVDE2KSgoQikgPj4gMTYpKSk7IFwKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKChBKSZNVUwzMngzMklOVE8zMl9tYXNrKSAqIChMVk1fSU5UMzIpKChCKSZNVUwzMngzMklOVE8zMl9tYXNrKTsgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX3RlbXAgPSAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCAmIE1VTDMyeDMySU5UTzMyX21hc2spICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX0xIICYgTVVMMzJ4MzJJTlRPMzJfbWFzaykgKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoKE1VTDMyeDMySU5UTzMyX0xMID4+IDE2KSAmIE1VTDMyeDMySU5UTzMyX21hc2spOyAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0hIID0gTVVMMzJ4MzJJTlRPMzJfSEggKyAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCA+PiAxNikgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSCA+PiAxNikgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKE1VTDMyeDMySU5UTzMyX3RlbXAgPj4gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDMySU5UTzMyX0xMID0gTVVMMzJ4MzJJTlRPMzJfTEwgKyAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9ITCA8PCAxNikgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShNVUwzMngzMklOVE8zMl9MSCA8PCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2hpZnRWYWx1ZSA8IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl9ISCA9IE1VTDMyeDMySU5UTzMyX0hIIDw8ICgzMiAtIHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyX21hc2sgPSAoKExWTV9JTlQzMikxIDw8ICgzMiAtIHNoaWZ0VmFsdWUpKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfTEwgPSAoTVVMMzJ4MzJJTlRPMzJfTEwgPj4gc2hpZnRWYWx1ZSkgJiBNVUwzMngzMklOVE8zMl9tYXNrOyAgICAgICBcCisgICAgICAgICAgICBNVUwzMngzMklOVE8zMl90ZW1wMiA9IE1VTDMyeDMySU5UTzMyX0hIIHwgTVVMMzJ4MzJJTlRPMzJfTEw7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzJfdGVtcDIgPSAoTFZNX0lOVDMyKU1VTDMyeDMySU5UTzMyX0hIID4+IChzaGlmdFZhbHVlIC0gMzIpOyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKEMpID0gTVVMMzJ4MzJJTlRPMzJfdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIE1VTDMyeDE2SU5UTzMyKEEsQixDLFNoaWZ0UikKQEAgLTY1LDI1ICs3MCwyNCBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVUwzMngxNklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAotICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDE2SU5UTzMyX21hc2ssTVVMMzJ4MTZJTlRPMzJfSEgsTVVMMzJ4MTZJTlRPMzJfTEw7XAotICAgICAgICAgTFZNX0lOVDMyICBzaGlmdFZhbHVlO1wKLSAgICAgICAgc2hpZnRWYWx1ZSA9IChTaGlmdFIpO1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfbWFzaz0weDAwMDBGRkZGO1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9ICgoTFZNX0lOVDMyKShCKSooKExWTV9JTlQxNikoKEEpPj4xNikpKTtcCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyX0xMPSAoKExWTV9JTlQzMikoKEEpJk1VTDMyeDE2SU5UTzMyX21hc2spKihCKSk7XAotICAgICAgICBpZihzaGlmdFZhbHVlPDE2KVwKLSAgICAgICAge1wKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEg9KExWTV9JTlQzMikoKExWTV9VSU5UMzIpTVVMMzJ4MTZJTlRPMzJfSEg8PCgxNi1zaGlmdFZhbHVlKSk7XAotICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEgrKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfTEw+PnNoaWZ0VmFsdWUpO1wKLSAgICAgICAgfVwKLSAgICAgICAgZWxzZSBpZihzaGlmdFZhbHVlPDMyKSB7XAotICAgICAgICBNVUwzMngxNklOVE8zMl9ISD0oTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMTYpKTtcCi0gICAgICAgIChDKT1NVUwzMngxNklOVE8zMl9ISCsoTFZNX0lOVDMyKShNVUwzMngxNklOVE8zMl9MTD4+c2hpZnRWYWx1ZSk7XAotICAgICAgICB9XAotICAgICAgICBlbHNlIHtcCi0gICAgICAgIChDKT1NVUwzMngxNklOVE8zMl9ISD4+KHNoaWZ0VmFsdWUtMTYpO31cCi0gICAgICAgIH0KKyNkZWZpbmUgTVVMMzJ4MTZJTlRPMzIoQSwgQiwgQywgU2hpZnRSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMVk1fSU5UMzIgTVVMMzJ4MTZJTlRPMzJfbWFzaywgTVVMMzJ4MTZJTlRPMzJfSEgsIE1VTDMyeDE2SU5UTzMyX0xMOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTFZNX0lOVDMyIHNoaWZ0VmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNoaWZ0VmFsdWUgPSAoU2hpZnRSKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNVUwzMngxNklOVE8zMl9tYXNrID0gMHgwMDAwRkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzJfSEggPSAoKExWTV9JTlQzMikoQikgKiAoKExWTV9JTlQxNikoKEEpID4+IDE2KSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1VTDMyeDE2SU5UTzMyX0xMID0gKChMVk1fSU5UMzIpKChBKSZNVUwzMngxNklOVE8zMl9tYXNrKSAqIChCKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2hpZnRWYWx1ZSA8IDE2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpTVVMMzJ4MTZJTlRPMzJfSEggPDwgKDE2IC0gc2hpZnRWYWx1ZSkpOyBcCisgICAgICAgICAgICAoQykgPSBNVUwzMngxNklOVE8zMl9ISCArIChMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMID4+IHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0VmFsdWUgPCAzMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyX0hIID0gKExWTV9JTlQzMikoTVVMMzJ4MTZJTlRPMzJfSEggPj4gKHNoaWZ0VmFsdWUgLSAxNikpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAoQykgPSBNVUwzMngxNklOVE8zMl9ISCArIChMVk1fSU5UMzIpKE1VTDMyeDE2SU5UTzMyX0xMID4+IHNoaWZ0VmFsdWUpOyAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChDKSA9IE1VTDMyeDE2SU5UTzMyX0hIID4+IChzaGlmdFZhbHVlIC0gMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQpAQCAtOTEsMTYgKzk1LDE2IEBACiAKICAgICAgICAgQSxCIGFuZCBDIGFyZSAzMiBiaXQgU0lHTkVEIG51bWJlcnMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgQUREMl9TQVRfMzJ4MzIoQSxCLEMpICAgXAotICAgICAgICB7KEMpPShBKSsoQik7XAotICAgICAgICAgaWYgKCgoKEMpIF4gKEEpKSAmICgoQykgXiAoQikpKSA+PiAzMSlcCi0gICAgICAgICAgICB7XAotICAgICAgICAgICAgICAgIGlmKChBKTwwKVwKLSAgICAgICAgICAgICAgICAgICAgKEMpPTB4ODAwMDAwMDBsO1wKLSAgICAgICAgICAgICAgICBlbHNlXAotICAgICAgICAgICAgICAgICAgICAoQyk9MHg3RkZGRkZGRmw7XAotICAgICAgICAgICAgfVwKLSAgICAgICAgfQorI2RlZmluZSBBREQyX1NBVF8zMngzMihBLCBCLCBDKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChDKSA9IChBKSArIChCKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKCgoQykgXiAoQSkpICYgKChDKSBeIChCKSkpID4+IDMxKSB7IFwKKyAgICAgICAgICAgIGlmICgoQSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKEMpID0gMHg4MDAwMDAwMGw7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoQykgPSAweDdGRkZGRkZGbDsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogI2VuZGlmIC8qIF9MVk1fTUFDUk9TX0hfICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKaW5kZXggZGJmOWU2YS4uNzVmNDc4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKQEAgLTM3LDggKzM3LDcgQEAKIC8qICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyoKICAgICAgKiBUaGUgbWVtb3J5IGFyZWEgY3JlYXRlZCB1c2luZyB0aGlzIHN0cnVjdHVyZSBpcyBpbnRlcm5hbGx5CiAgICAgICogdHlwZWNhc3QgdG8gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBhbmQgdXNlZC4KQEAgLTUxLDE0ICs1MCwxMyBAQAogCiB9IExWTV9UaW1lcl9JbnN0YW5jZV90OwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiAgU2FtcGxpbmdSYXRlOwotICAgIExWTV9JTlQxNiAgVGltZUluTXM7Ci0gICAgTFZNX0lOVDMyICBDYWxsQmFja1BhcmFtOwotICAgIHZvaWQgICAgICAgKnBDYWxsQmFja1BhcmFtczsKLSAgICB2b2lkICAgICAgICpwQ2FsbGJhY2tJbnN0YW5jZTsKLSAgICB2b2lkICAgICAgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBTYW1wbGluZ1JhdGU7CisgICAgTFZNX0lOVDE2IFRpbWVJbk1zOworICAgIExWTV9JTlQzMiBDYWxsQmFja1BhcmFtOworICAgIHZvaWQqIHBDYWxsQmFja1BhcmFtczsKKyAgICB2b2lkKiBwQ2FsbGJhY2tJbnN0YW5jZTsKKyAgICB2b2lkICgqcENhbGxCYWNrKSh2b2lkKiwgdm9pZCosIExWTV9JTlQzMik7CiAKIH0gTFZNX1RpbWVyX1BhcmFtc190OwogCkBAIC02NiwxNCArNjQsMTIgQEAKIC8qICBGVU5DVElPTiBQUk9UT1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKTsKK3ZvaWQgTFZNX1RpbWVyX0luaXQoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX1RpbWVyX1BhcmFtc190KiBwUGFyYW1zKTsKIAotdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplICk7Cit2b2lkIExWTV9UaW1lcihMVk1fVGltZXJfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fSU5UMTYgQmxvY2tTaXplKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgRU5EIE9GIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qIF9fTFZNX1RJTUVSX0hfXyAqLworI2VuZGlmIC8qIF9fTFZNX1RJTUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4YjY4N2Y2Li43Y2ZhZjI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjYsNTMgKzI2LDM0IEBACiAjZGVmaW5lIExWTV9UWVBFU19ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMVk1fTlVMTCAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgcG9pbnRlciAqLworI2RlZmluZSBMVk1fTlVMTCAwIC8qIE5VTEwgcG9pbnRlciAqLwogCi0jZGVmaW5lIExWTV9UUlVFICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgLyogQm9vbGVhbnMgKi8KLSNkZWZpbmUgTFZNX0ZBTFNFICAgICAgICAgICAgICAgMAorI2RlZmluZSBMVk1fVFJVRSAxIC8qIEJvb2xlYW5zICovCisjZGVmaW5lIExWTV9GQUxTRSAwCiAKLSNkZWZpbmUgTFZNX01BWElOVF84ICAgICAgICAgICAgMTI3ICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLwotI2RlZmluZSBMVk1fTUFYSU5UXzE2ICAgICAgICAgICAzMjc2NwotI2RlZmluZSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAyMTQ3NDgzNjQ3Ci0jZGVmaW5lIExWTV9NQVhFTlVNICAgICAgICAgICAgIDIxNDc0ODM2NDcKKyNkZWZpbmUgTFZNX01BWElOVF84IDEyNyAvKiBNYXhpbXVtIHBvc2l0aXZlIGludGVnZXIgc2l6ZSAqLworI2RlZmluZSBMVk1fTUFYSU5UXzE2IDMyNzY3CisjZGVmaW5lIExWTV9NQVhJTlRfMzIgMjE0NzQ4MzY0NworI2RlZmluZSBMVk1fTUFYRU5VTSAyMTQ3NDgzNjQ3CiAKLSNkZWZpbmUgTFZNX01PRFVMRUlEX01BU0sgICAgICAgMHhGRjAwICAgICAgICAgICAgICAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxpbmcgbW9kdWxlIElEIGZyb20gY2FsbGJhY2tJZCAqLwotI2RlZmluZSBMVk1fRVZFTlRJRF9NQVNLICAgICAgICAweDAwRkYgICAgICAgICAgICAgIC8qIE1hc2sgdG8gZXh0cmFjdCB0aGUgY2FsbGJhY2sgZXZlbnQgZnJvbSBjYWxsYmFja0lkICovCisjZGVmaW5lIExWTV9NT0RVTEVJRF9NQVNLIDB4RkYwMCAvKiBNYXNrIHRvIGV4dHJhY3QgdGhlIGNhbGxpbmcgbW9kdWxlIElEIGZyb20gY2FsbGJhY2tJZCAqLworI2RlZmluZSBMVk1fRVZFTlRJRF9NQVNLIDB4MDBGRiAgLyogTWFzayB0byBleHRyYWN0IHRoZSBjYWxsYmFjayBldmVudCBmcm9tIGNhbGxiYWNrSWQgKi8KIAogLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAgICAgIDAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSAgICAgIDEgICAvKiBPZmZzZXQgdG8gdGhlIHBlcnNpc3RlbnQgZGF0YSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgICAyICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGNvZWZmaWNpZW50IG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAgICAgIDMgICAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAwIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIDEgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLworI2RlZmluZSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGIFwKKyAgICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCisjZGVmaW5lIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgMyAvKiBPZmZzZXQgdG8gdGVtcG9yYXJ5IG1lbW9yeSByZWdpb24gKi8KIAotI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwotCi0vKiBNZW1vcnkgcGFydGl0aW9uIHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04wICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiAxc3QgbWVtb3J5IHBhcnRpdGlvbiAqLwotI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjEgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIDJuZCBtZW1vcnkgcGFydGl0aW9uICovCi0jZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMiAgICAgIDIgICAgICAgICAgICAgICAgICAgLyogM3JkIG1lbW9yeSBwYXJ0aXRpb24gKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04zICAgICAgMyAgICAgICAgICAgICAgICAgICAvKiA0dGggbWVtb3J5IHBhcnRpdGlvbiAqLwotCi0vKiBVc2UgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX1BFUlNJU1RFTlQgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIFBlcnNpc3RlbnQgbWVtb3J5IHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9TQ1JBVENIICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBTY3JhdGNoICBtZW1vcnkgdHlwZSAqLwotCi0vKiBBY2Nlc3MgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX0lOVEVSTkFMICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIChmYXN0KSBhY2Nlc3MgbWVtb3J5ICovCi0jZGVmaW5lIExWTV9NRU1fRVhURVJOQUwgICAgICAgIDggICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgKHNsb3cpIGFjY2VzcyBtZW1vcnkgKi8KLQotLyogUGxhdGZvcm0gc3BlY2lmaWMgKi8KLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlQgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMCtMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfREFUQSAgICAgKExWTV9NRU1fUEFSVElUSU9OMStMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfQ09FRiAgICAgKExWTV9NRU1fUEFSVElUSU9OMitMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1NDUkFUQ0ggICAgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMytMVk1fTUVNX1NDUkFUQ0grTFZNX01FTV9JTlRFUk5BTCkKKyNkZWZpbmUgTFZNX05SX01FTU9SWV9SRUdJT05TIDQgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MCwzMyArNjEsMjggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgICAgIGNoYXIgICAgICAgICAgICAgICAgTFZNX0NIQVI7ICAgICAgICAgICAvKiBBU0NJSSBjaGFyYWN0ZXIgKi8KK3R5cGVkZWYgY2hhciBMVk1fQ0hBUjsgLyogQVNDSUkgY2hhcmFjdGVyICovCiAKLXR5cGVkZWYgICAgIGludDhfdCAgICAgICAgICAgICAgTFZNX0lOVDg7ICAgICAgICAgICAvKiBTaWduZWQgOC1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdWludDhfdCAgICAgICAgICAgICBMVk1fVUlOVDg7ICAgICAgICAgIC8qIFVuc2lnbmVkIDgtYml0IHdvcmQgKi8KK3R5cGVkZWYgaW50OF90IExWTV9JTlQ4OyAgIC8qIFNpZ25lZCA4LWJpdCB3b3JkICovCit0eXBlZGVmIHVpbnQ4X3QgTFZNX1VJTlQ4OyAvKiBVbnNpZ25lZCA4LWJpdCB3b3JkICovCiAKLXR5cGVkZWYgICAgIGludDE2X3QgICAgICAgICAgICAgTFZNX0lOVDE2OyAgICAgICAgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KLXR5cGVkZWYgICAgIHVpbnQxNl90ICAgICAgICAgICAgTFZNX1VJTlQxNjsgICAgICAgICAvKiBVbnNpZ25lZCAxNi1iaXQgd29yZCAqLwordHlwZWRlZiBpbnQxNl90IExWTV9JTlQxNjsgICAvKiBTaWduZWQgMTYtYml0IHdvcmQgKi8KK3R5cGVkZWYgdWludDE2X3QgTFZNX1VJTlQxNjsgLyogVW5zaWduZWQgMTYtYml0IHdvcmQgKi8KIAotdHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwotdHlwZWRlZiAgICAgdWludDMyX3QgICAgICAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCi10eXBlZGVmICAgICBpbnQ2NF90ICAgICAgICAgICAgIExWTV9JTlQ2NDsgICAgICAgICAgLyogU2lnbmVkIDY0LWJpdCB3b3JkICovCit0eXBlZGVmIGludDMyX3QgTFZNX0lOVDMyOyAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiB1aW50MzJfdCBMVk1fVUlOVDMyOyAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwordHlwZWRlZiBpbnQ2NF90IExWTV9JTlQ2NDsgICAvKiBTaWduZWQgNjQtYml0IHdvcmQgKi8KIAotI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLmYKKyNkZWZpbmUgTFZNX01BWEZMT0FUIDEuZgogCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIExWTV9GTE9BVDsgICAgICAgICAgLyogc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCAqLwordHlwZWRlZiBmbG9hdCBMVk1fRkxPQVQ7IC8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKi8KIAogLy8gU2VsZWN0IHdoZXRoZXIgd2UgZXhwb3NlIGludDE2X3Qgb3IgZmxvYXQgYnVmZmVycy4KIAotI2RlZmluZSAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi10eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKKyNkZWZpbmUgRUZGRUNUX0JVRkZFUl9GT1JNQVQgQVVESU9fRk9STUFUX1BDTV9GTE9BVAordHlwZWRlZiBmbG9hdCBlZmZlY3RfYnVmZmVyX3Q7CiAKLQotI2lmZGVmIFNVUFBPUlRfTUMKLSNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyA4IC8vIEZDQ184Ci0jZWxzZQotI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDIgLy8gRkNDXzIKLSNlbmRpZgorI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIEZDQ18yNAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE1LDI5ICs5MSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE9wZXJhdGluZyBtb2RlICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fTU9ERV9PRkYgICAgPSAwLAotICAgIExWTV9NT0RFX09OICAgICA9IDEsCi0gICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KLX0gTFZNX01vZGVfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fTU9ERV9PRkYgPSAwLCBMVk1fTU9ERV9PTiA9IDEsIExWTV9NT0RFX0RVTU1ZID0gTFZNX01BWEVOVU0gfSBMVk1fTW9kZV9lbjsKIAogLyogRm9ybWF0ICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKLSAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKLSAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCi0jZW5kaWYKLSAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KK3R5cGVkZWYgZW51bSB7CisgICAgTFZNX1NURVJFTyA9IDAsCisgICAgTFZNX01PTk9JTlNURVJFTyA9IDEsCisgICAgTFZNX01PTk8gPSAyLAorICAgIExWTV9NVUxUSUNIQU5ORUwgPSAzLAorICAgIExWTV9TT1VSQ0VfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVk1fRm9ybWF0X2VuOwogCiAvKiBMVk0gc2FtcGxpbmcgcmF0ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9GU184MDAwICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWTV9GU184MDAwID0gMCwKICAgICBMVk1fRlNfMTEwMjUgPSAxLAogICAgIExWTV9GU18xMjAwMCA9IDIsCiAgICAgTFZNX0ZTXzE2MDAwID0gMywKQEAgLTE1MCw0MiArMTE3LDMzIEBACiAgICAgTFZNX0ZTXzk2MDAwID0gMTAsCiAgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAogICAgIExWTV9GU18xOTIwMDAgPSAxMiwKLSAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCisgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTSAtIDEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0ZzX2VuOwogCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWTV9QRVJTSVNURU5UX1NMT1dfREFUQSAgICA9IExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEsCi0gICAgTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgID0gTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQSwKLSAgICBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUYgICAgPSBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGLAotICAgIExWTV9URU1QT1JBUllfRkFTVCAgICAgICAgICA9IExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QsCi0gICAgTFZNX01FTU9SWVRZUEVfRFVNTVkgICAgICAgID0gTFZNX01BWEVOVU0KLX0gTFZNX01lbW9yeVR5cGVzX2VuOwotCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZNX01lbW9yeVR5cGVzX2VuICAgICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZNX01lbW9yeVJlZ2lvbl9zdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fTWVtb3J5UmVnaW9uX3N0ICAgICAgICAgUmVnaW9uW0xWTV9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZNX01lbW9yeVRhYmxlX3N0Oworc3RhdGljIGlubGluZSBMVk1fRnNfZW4gbHZtRnNGb3JTYW1wbGVSYXRlKGludCBzYW1wbGVSYXRlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPGludCwgTFZNX0ZzX2VuPiBrTFZNRnNNYXAgPSB7CisgICAgICAgICAgICB7ODAwMCwgTFZNX0ZTXzgwMDB9LCAgICB7MTEwMjUsIExWTV9GU18xMTAyNX0sIHsxMjAwMCwgTFZNX0ZTXzEyMDAwfSwKKyAgICAgICAgICAgIHsxNjAwMCwgTFZNX0ZTXzE2MDAwfSwgIHsyMjA1MCwgTFZNX0ZTXzIyMDUwfSwgezI0MDAwLCBMVk1fRlNfMjQwMDB9LAorICAgICAgICAgICAgezMyMDAwLCBMVk1fRlNfMzIwMDB9LCAgezQ0MTAwLCBMVk1fRlNfNDQxMDB9LCB7NDgwMDAsIExWTV9GU180ODAwMH0sCisgICAgICAgICAgICB7ODgyMDAsIExWTV9GU184ODIwMH0sICB7OTYwMDAsIExWTV9GU185NjAwMH0sIHsxNzY0MDAsIExWTV9GU18xNzY0MDB9LAorICAgICAgICAgICAgezE5MjAwMCwgTFZNX0ZTXzE5MjAwMH19OworICAgIGlmIChrTFZNRnNNYXAuZmluZChzYW1wbGVSYXRlKSAhPSBrTFZNRnNNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGtMVk1Gc01hcC5hdChzYW1wbGVSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIExWTV9GU19JTlZBTElEOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0YW5kYXJkIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKHZvaWQgICAgICAgICAgKnBDYWxsYmFja0RhdGEsICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBkYXRhIHN0cnVjdHVyZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwordHlwZWRlZiBMVk1fSU5UMzIgKCpMVk1fQ2FsbGJhY2spKAorICAgICAgICB2b2lkKiBwQ2FsbGJhY2tEYXRhLCAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGRhdGEgc3RydWN0dXJlICovCisgICAgICAgIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwgLyogR2VuZXJhbCBwdXJwb3NlIHBvaW50ZXIgKGUuZy4gdG8gYSBkYXRhIHN0cnVjdHVyZSBuZWVkZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spICovCisgICAgICAgIExWTV9JTlQxNiBHZW5lcmFsUHVycG9zZSk7IC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTkzLDQgKzE1MSw0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZW5kaWYgIC8qIExWTV9UWVBFU19IICovCisjZW5kaWYgLyogTFZNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IGIyZTAxOTUuLmJhNjA1ZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMjQsODAgKzI0LDYyIEBACiAgICBJTlNUQU5DRSBNRU1PUlkgVFlQRSBERUZJTklUSU9OCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KLSAgICBMVk1fRkxPQVQgICBUYXJnZXQ7ICAgICAgICAgICAgICAgICAgLyogVGFyZ2V0IHZhbHVlLiAgU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgKi8KLSAgICBMVk1fRkxPQVQgICBDdXJyZW50OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCB2YWx1ZS4gIFNldCBieSB0aGUgbWl4ZXIgZnVuY3Rpb24uICovCi0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTsgICAgICAgICAgIC8qIFBhcmFtZXRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY2FsYmFjayBmdW5jdGlvbiAqLwotICAgIHZvaWQgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFscGhhOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQuIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgICAgICAgIC8qIFRhcmdldCB2YWx1ZS4gIFNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCisgICAgTFZNX0ZMT0FUIEN1cnJlbnQ7ICAgICAgIC8qIEN1cnJlbnQgdmFsdWUuICBTZXQgYnkgdGhlIG1peGVyIGZ1bmN0aW9uLiAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDsgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtOyAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkKiBwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlOyAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBNaXhfMVN0X0NsbF9GTE9BVF90OwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBbHBoYTE7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0MTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50MTsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7Ci0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7Ci0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIEFscGhhMTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0MTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrU2V0MTsKKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbTE7CisgICAgdm9pZCogcENhbGxiYWNrSGFuZGxlMTsKKyAgICB2b2lkKiBwR2VuZXJhbFB1cnBvc2UxOwogICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2sxOwogCi0gICAgTFZNX0ZMT0FUICAgQWxwaGEyOyAgICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoaXMgbG9jYXRpb24gaXMgcGFzc2VkIGFzIGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBNaXhfMVN0X0NsbF90IGluIHNvbWUgZnVuY3Rpb25zICovCi0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0MjsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50MjsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDI7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTI7Ci0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTI7Ci0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTI7CisgICAgTFZNX0ZMT0FUIEFscGhhMjsgLyogV2FybmluZyB0aGUgYWRkcmVzcyBvZiB0aGlzIGxvY2F0aW9uIGlzIHBhc3NlZCBhcyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KKyAgICBMVk1fRkxPQVQgVGFyZ2V0MjsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDI7CisgICAgTFZNX0lOVDE2IENhbGxiYWNrU2V0MjsKKyAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbTI7CisgICAgdm9pZCogcENhbGxiYWNrSGFuZGxlMjsKKyAgICB2b2lkKiBwR2VuZXJhbFB1cnBvc2UyOwogICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOwogfSBNaXhfMlN0X0NsbF9GTE9BVF90OwogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKK0xWTV9GTE9BVCBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgdGMsIExWTV9VSU5UMzIgRnMsIExWTV9VSU5UMTYgTnVtQ2hhbm5lbHMpOwogCi12b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoTWl4XzFTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCi12b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAotdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwordm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLXZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLXZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVCggICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaAppbmRleCBhZTU0NDE5Li4zNmM0Y2QyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIC8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0KKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwpAQCAtMzAsNyArMzAsMTMgQEAKIAogLyogQWJzb2x1dGUgdmFsdWUgaW5jbHVkaW5nIHRoZSBjb3JuZXIgY2FzZSBmb3IgdGhlIGV4dHJlbWUgbmVnYXRpdmUgdmFsdWUgKi8KIAotTFZNX0ZMT0FUICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICAgaW5wdXQpOworc3RhdGljIGlubGluZSBMVk1fRkxPQVQgQWJzX0Zsb2F0KExWTV9GTE9BVCBpbnB1dCkgeworICAgIHJldHVybiBmYWJzKGlucHV0KTsKK30KKworc3RhdGljIGlubGluZSBMVk1fRkxPQVQgTFZNX0NsYW1wKExWTV9GTE9BVCB2YWwpIHsKKyAgICByZXR1cm4gZm1pbihmbWF4KHZhbCwgLTEuMGYpLCAxLjBmKTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKQEAgLTQ0LDcgKzUwLDYgQEAKICAqICAgICAgICAgICAgICAgICAgKDE1LT4wMSkgPSBkZWNpbWFsIHBhcnQKICAqICBSZXR1cm5zICAgICA6IExpbiB2YWx1ZSBmb3JtYXQgMS4xNi4xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCk7CitMVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2IGRiX2ZpeCk7CiAKLSNlbmRpZiAgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLwotCisjZW5kaWYgLyogX19TQ0FMQVJBUklUSE1FVElDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IGIyN2JhYzUuLjEwZjM1MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTI0LDEyNyArMjQsNDEgQEAKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTG9hZENvbnN0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Cit2b2lkIENvcHlfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQqIFN0ZXJlb091dCwgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwogCi12b2lkIENvcHlfRmxvYXQoICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotdm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKlN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIE11bHQzc19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogbm90ZTogSW4gTXVsdDNzXzE2eDE2KCkgc2F0dXJhdGlvbiBvZiByZXN1bHQgaXMgbm90IHRha2VuIGNhcmUgd2hlbiAgICAgICAgICAgKgotICogICAgICAgb3ZlcmZsb3cgb2NjdXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgRm9yIGV4YW1wbGUgd2hlbiAqc3JjID0gMHg4MDAwLCB2YWwgPSAqMHg4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgVGhlIGZ1bmN0aW9uIGdpdmVzIHRoZSBvdXRwdXQgYXMgMHg4MDAwIGluc3RlYWQgb2YgMHg3ZmZmICAgICAgICAgICAgICAgKgotICogICAgICAgVGhpcyBpcyB0aGUgb25seSBjYXNlIHdoaWNoIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gVmVjdG9yX0FyaXRobWV0aWMuZG9jIGluIC9kb2MgZm9sZGVyICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTXVsdDNzX0Zsb2F0KCAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBub3RlOiBJbiBNdWx0M3NfMzJ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCi0gKiAgICAgICBvdmVyZmxvdyBvY2N1cnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBGb3IgZXhhbXBsZSB3aGVuICpzcmMgPSAweDgwMDAwMDAsIHZhbCA9ICoweDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICBUaGUgZnVuY3Rpb24gZ2l2ZXMgdGhlIG91dHB1dCBhcyAweDgwMDAwMDAgaW5zdGVhZCBvZiAweDdmZmZmZmZmICAgICAgICAqCi0gKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGV4dHJlbWUgY29uZGl0aW9uIHdoaWNoIGlzIGdpdmluZyB1bmV4cGVjdGVkIHJlc3VsdCAgICAqCi0gKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNdWx0M3NfMzJ4MTYoICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLXZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwotICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICA7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi12b2lkIERlbGF5V3JpdGVfMzIoICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci12b2lkIEFkZDJfU2F0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgTWFjM3NfU2F0X0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwordm9pZCBEZWxheU1peF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZGVsYXksICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAgLyogRGVsYXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYqIHBPZmZzZXQsICAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwgICAgICAgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAqLwordm9pZCBBZGQyX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIFNISUZUIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbik7Cit2b2lkIFNoaWZ0X1NhdF9GbG9hdChjb25zdCBMVk1fSU5UMTYgdmFsLCBjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgQVVESU8gRk9STUFUIENPTlZFUlNJT04gRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLXZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAordm9pZCBNb25vVG8ySV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKK3ZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTVNUbzJpX1NhdF9GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLXZvaWQgSm9pblRvMmlfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY0wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEludDE2TFNoaWZ0VG9JbnQzMl8xNngzMihjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7Ci0KLXZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCAgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaGlmdCApOwordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTSwgY29uc3QgTFZNX0ZMT0FUKiBzcmNTLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBGcm9tMmlUb01TX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdE0sIExWTV9GTE9BVCogZHN0UywgTFZNX0lOVDE2IG4pOwordm9pZCBKb2luVG8yaV9GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyY0wsIGNvbnN0IExWTV9GTE9BVCogc3JjUiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAgLyogX1ZFQ1RPUl9BUklUSE1FVElDX0hfICovCisjZW5kaWYgLyogX1ZFQ1RPUl9BUklUSE1FVElDX0hfICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKaW5kZXggZTE4YWE3OC4uNzhmMzI5ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJBR0MuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKQEAgLTMwLDE1MSArMjksMTMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBWT0xfVENfU0hJRlQgMjEgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIERFQ0FZX1NISUZUIDEwICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgVk9MX1RDX0ZMT0FUIDIuMGYgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9GQUNfRkxPQVQgNjQuMGYgLyogQXMgYSBwb3dlciBvZiAyICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBcHBseSBBR0MgYW5kIG1peCBzaWduYWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RTcmMgICAtLS0tLS0tLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIF9fX19fXyAgICAgICBffF8gICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCAgIHwgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb25vU3JjIC0tPnwgQUdDICB8LS0tLT58ICsgfC0tLS0tPnwgVm9sdW1lIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tPiAgICAqLwotLyogICAgICAgICAgICAgfCBHYWluIHwgICAgIHxfX198ICAgICAgfCBHYWluICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCi0vKiAgICAgICAgICAgICB8X19fX19ffCAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgIC98XCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fICAgICBfX19fX19fXyAgICB8ICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgfCAgICAgICAgfCAgIHwgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IEFHQyBHYWluIHw8LS18IFBlYWsgICB8PC0tfCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlICAgfCAgIHwgRGV0ZWN0IHwgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU3RlcmVvSW4gICAgICAgICAgICAgICBTdGVyZW8gc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNb25vSW4gICAgICAgICAgICAgICAgIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFN0ZXJlb091dCAgICAgICAgICAgICAgU3RlcmVvIGRlc3RpbmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi17Ci0KLSAgICAvKgotICAgICAqIEdlbmVyYWwgdmFyaWFibGVzCi0gICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCi0gICAgTFZNX0ZMT0FUICAgICAgIExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzYW1wbGUgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgUmlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBzYW1wbGUgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KLQotICAgIC8qCi0gICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOy8qIERlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCi0gICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLwotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLwotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLwotICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKLSAgICAgICAgICovCi0gICAgICAgIExlZnQgID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBsZWZ0IHNhbXBsZSAqLwotICAgICAgICBSaWdodCA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgcmlnaHQgc2FtcGxlICovCi0gICAgICAgIE1vbm8gID0gKnBNb25vU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKLSAgICAgICAgICovCi0gICAgICAgIExlZnQgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCi0gICAgICAgIFJpZ2h0ICs9IChNb25vICogQUdDX011bHQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICAgICAqLwotICAgICAgICBMZWZ0ICA9IExlZnQgICogVm9sX011bHQ7Ci0gICAgICAgIFJpZ2h0ID0gUmlnaHQgKiBWb2xfTXVsdDsKLSAgICAgICAgKnBEc3QrKyA9IExlZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCi0gICAgICAgICpwRHN0KysgPSBSaWdodDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCi0gICAgICAgICAqLwotICAgICAgICBBYnNQZWFrID0gQWJzX0Zsb2F0KExlZnQpID4gQWJzX0Zsb2F0KFJpZ2h0KSA/IEFic19GbG9hdChMZWZ0KSA6IEFic19GbG9hdChSaWdodCk7Ci0gICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFHQ19HYWluIC09IChBR0NfRGVjYXkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFHQ19HYWluICs9IChBR0NfRGVjYXkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCi0gICAgICAgICAqLwotICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOwotCi0gICAgcmV0dXJuOwotfQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDksOTMgKzcwLDgwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLQordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogcE1vbm9TcmMsIExWTV9GTE9BVCogcERzdCwgTFZNX1VJTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOckNoYW5uZWxzKSB7CiAgICAgLyoKICAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcwogICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICBpLCBqajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLwotICAgIExWTV9GTE9BVCAgICAgICBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSB2YWx1ZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLworICAgIExWTV9VSU5UMTYgaSwgamo7ICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCBTYW1wbGVWYWw7IC8qIFNhbXBsZSB2YWx1ZSAqLworICAgIExWTV9GTE9BVCBNb25vOyAgICAgIC8qIE1vbm8gc2FtcGxlICovCisgICAgTFZNX0ZMT0FUIEFic1BlYWs7ICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KKyAgICBMVk1fRkxPQVQgQUdDX011bHQ7ICAvKiBTaG9ydCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBWb2xfTXVsdDsgIC8qIFNob3J0IHZvbHVtZSAqLwogCiAgICAgLyoKICAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcwogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIExWTV9GTE9BVCBBR0NfR2FpbiA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCBBR0NfTWF4R2FpbiA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47IC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUIEFHQ19BdHRhY2sgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgLyogQXR0YWNrIHNjYWxlciAqLwogICAgIC8qIERlY2F5IHNjYWxlciAqLwotICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7Ci0gICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KLSAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisgICAgTFZNX0ZMT0FUIEFHQ19EZWNheSA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsKKyAgICBMVk1fRkxPQVQgQUdDX1RhcmdldCA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgVm9sX0N1cnJlbnQgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUIFZvbF9UYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCBWb2xfVEMgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCiAKICAgICAvKgogICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCiAgICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIGZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IE5yRnJhbWVzOyBpKyspIC8qIEZvciBlYWNoIGZyYW1lICovCiAgICAgewotCiAgICAgICAgIC8qCiAgICAgICAgICAqIEdldCB0aGUgc2NhbGVycwogICAgICAgICAgKi8KLSAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0ZMT0FUKShBR0NfR2Fpbik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIEFHQyBnYWluICovCi0gICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9GTE9BVCkoVm9sX0N1cnJlbnQpOyAgICAgICAgICAgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLworICAgICAgICBBR0NfTXVsdCA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgLyogR2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgLyogR2V0IHRoZSB2b2x1bWUgZ2FpbiAqLwogCiAgICAgICAgIEFic1BlYWsgPSAwLjBmOwogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIGlucHV0IHNhbXBsZXMKICAgICAgICAgICovCi0gICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhbXBsZVZhbCAgPSAqcE1jU3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNhbXBsZSB2YWx1ZSBvZiBqaiBDaGFubmVsKi8KLSAgICAgICAgICAgIE1vbm8gICAgICAgPSAqcE1vbm9TcmM7ICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCisgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspIHsKKyAgICAgICAgICAgIFNhbXBsZVZhbCA9ICpwTWNTcmMrKzsgLyogR2V0IHRoZSBzYW1wbGUgdmFsdWUgb2YgamogQ2hhbm5lbCovCisgICAgICAgICAgICBNb25vID0gKnBNb25vU3JjOyAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIGlucHV0IHNpZ25hbAogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTYW1wbGVWYWwgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCArPSAoTW9ubyAqIEFHQ19NdWx0KTsgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU2FtcGxlVmFsICA9IFNhbXBsZVZhbCAgKiBWb2xfTXVsdDsKKyAgICAgICAgICAgIFNhbXBsZVZhbCA9IFNhbXBsZVZhbCAqIFZvbF9NdWx0OwogCi0gICAgICAgICAgICAqcERzdCsrID0gU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAgICAgKnBEc3QrKyA9IExWTV9DbGFtcChTYW1wbGVWYWwpOyAvKiBTYXZlIHRoZSByZXN1bHRzICovCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoU2FtcGxlVmFsKSA+IEFic1BlYWsgPyBBYnNfRmxvYXQoU2FtcGxlVmFsKSA6IEFic1BlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQotICAgICAgICB7CisgICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIEFHQ19HYWluID0gQUdDX0dhaW4gKiBBR0NfQXR0YWNrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIHNtYWxsIHNvIGluY3JlYXNlIHRoZSBnYWluCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChBR0NfR2FpbiA+IEFHQ19NYXhHYWluKQotICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pIHsKICAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMwMywxNSArMTUxLDE0IEBACiAgICAgICAgIC8qCiAgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgogICAgICAgICAgKi8KLSAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCiAgICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOwogCiAgICAgcmV0dXJuOwogfQotI2VuZGlmIC8qU1VQUE9SVF9NQyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxMzgwOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BYnNfMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0vKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwotCi0jaW5jbHVkZSAgICAiU2NhbGFyQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogQWJzXzMyKCkKLSAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgotICogIE91dHB1dCAgICAgIDoKLSAqICBSZXR1cm5zICAgICA6IEFic29sdXRlIHZhbHVlCi0gKiAgRGVzY3JpcHRpb24gOiBBYnNvbHV0ZSB2YWx1ZSB3aXRoIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgY29ybmVyIGNhc2UKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX0lOVDMyICAgIEFic18zMihMVk1fSU5UMzIgICAgaW5wdXQpCi17Ci0gICAgaWYoaW5wdXQgPCAgMCkKLSAgICB7Ci0gICAgICAgIGlmIChpbnB1dCA9PSAoTFZNX0lOVDMyKSgweDgwMDAwMDAwVSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRoZSBjb3JuZXIgY2FzZSwgc28gc2V0IHRvIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCi0gICAgICAgICAgICBpbnB1dD0oTFZNX0lOVDMyKSAweDdmZmZmZmZmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLwotICAgICAgICAgICAgaW5wdXQgPSAoTFZNX0lOVDMyKSgtaW5wdXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLX0KLUxWTV9GTE9BVCAgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgIGlucHV0KQotewotICAgIGlmKGlucHV0IDwgIDApCi0gICAgewotICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCi0gICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0OwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc4ZmU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEFERDJfU0FUXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBBZGQyX1NhdF8xNngxNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIFRlbXA7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSAqc3JjKSArICgoTFZNX0lOVDMyKSAqZHN0KTsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMHg3RkZGOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpVGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcAppbmRleCBhNDhlNjY4Li4xOTgxZWRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwCkBAIC0xOCw2OSArMTgsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTkNMVURFIEZJTEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIGEsYixjOwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGE9KnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgYj0qZHN0OwotICAgICAgICBjPWErYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGE8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqZHN0ID0gYzsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBBZGQyX1NhdF9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9GTE9BVCBUZW1wOwogICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKnNyYykgKyAoKExWTV9GTE9BVCkgKmRzdCk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgIFRlbXAgPSAqc3JjKysgKyAqZHN0OworICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcCk7CiAgICAgfQogICAgIHJldHVybjsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTVlMDdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqICgoKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSk7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjZjMTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDAwYjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JQXzFJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0KLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYgLypfQlBfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDRkMDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi17Ci0gICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVClwSW5zdGFuY2U7Ci0KLSAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8vIHluTD0gKEEwICogKHgobilMIC0geChuLTIpTCApKQotICAgICAgICB0ZW1wbCA9IChMVk1fRkxPQVQpICpwRGF0YUluIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogdGVtcGw7Ci0KLSAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCi0gICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkpCi0gICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLSAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICpwRGF0YU91dCsrID0gKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgIH0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTUwMzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJhbmQgcGFzcyBmaWx0ZXIgKEJJUVVBRCkgICAgICAgICAgICAgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBUaGUgY29lZmZpY2llbnRzIGFyZSBtb2RpZmllZCBpbiB0aGUgaW5pdCgpIGZ1bmN0aW9uIHN1Y2ggdGhhdCBsb3dlciAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaGFsZiB3b3JkIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lIGFuZCBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgICAgICAgICAgICAqLwotLyogICAgICAgIHdvcmQgaXMgbWFkZSB0byBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICBSZWFzb246IEZvciBNSVBTIGVmZmNpZW5jeSx3ZSBhcmUgdXNpbmcgRFNQIDMyKjE2IG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgaW5zdHJ1Y3Rpb24uIEJ1dCB3ZSBoYXZlIDMyKjMyIG11bHRpcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSByZWFsaXplZCBieSB0d28gMzIqMTYgICAgKi8KLS8qICAgICAgIG11bHRpcGxpY2F0aW9uLiBCdXQgMTZ0aCBiaXQgaW4gdGhlIDMyIGJpdCB3b3JkIGlzIG5vdCBhIHNpZ24gYml0LiBTbyB0aGlzIGlzIGRvbmUgICovCi0vKiAgICAgICBieSBwdXR0aW5nIDE2dGggYml0IHRvIHplcm8gYW5kIGxvc3Npbmcgb25lIGJpdCBwcmVjaXNpb24gYnkgZGl2aXNpb24gb2YgbG93ZXIgICAgICAqLwotLyogICAgICAgaGFsZiB3b3JkIGJ5IDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9GTE9BVCAqKSBwVGFwczsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSAgcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSAgcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNzU0ZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JQXzFJX0QxNkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQzMiAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0Zsb2F0OwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKl9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYTIwNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgICogeShuLTEpTCAgKSApCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0geW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotCi0gICAgICAgIH0KLQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2QwYjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxYzY2YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXwotI2RlZmluZSBfQlBfMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDJfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0gICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRmxvYXQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0KLSNlbmRpZiAvKl9CUF8xSV9EMzJGMzJDTExfVFJDX1dSQV8wMl9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlY2M0MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTEgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgtQjEgICogeShuLTEpTCAgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGI1ZDA2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzIDsKLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkMzQ1ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1s1XTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKl9CUV8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2JjNWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAtQjEgICogeShuLTEpTAotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0KLSAgICAgICAgfQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2MWQ5YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2lmbmRlZiBfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMUlfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCi17Ci0gICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotI2VuZGlmIC8qX0JRXzFJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MDY5MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOwotCi0gICAgdGVtcCA9IHBDb2VmLT5BMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkExOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNkOTE4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107Ci0KLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAotCi0gICAgICAgIH0KLQotICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3NDc0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLQotICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5blI9QTIgICogeChuLTIpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvLyB5blIrPUExICAqIHgobi0xKVIKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKVIKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgICogeShuLTIpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLQotICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAgKiB5KG4tMSlSICApCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0Ci0KLSAgICAgICAgfQotCi0gICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3Y2JjZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICAgIHRlbXAgPSBwQ29lZi0+QTI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTlhMGU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLwotICBMVk1fSU5UMTYgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAotewotICAgIExWTV9GTE9BVCAqICAgcERlbGF5czsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgKi8KLSAgICBMVk1fRkxPQVQgICAgIGNvZWZzWzVdOyAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLQotI2VuZGlmIC8qIF9CUV8ySV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMWM5N2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAqIHgobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMSogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCogeChuKUwgICAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9LUIyKnkobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5bkwrPS1CMSp5KG4tMSlMICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICogeChuLTIpUiAqLwotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvKiB5blIrPUExKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwKiB4KG4pUiAgICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzk2ZGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICApKSovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICApKSovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgICogeShuLTEpUiAgKSkgICovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotCi0gICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JmZjFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDM4OGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQlFfMklfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfQlFfMklfRDE2RjMyQ1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmc1s1XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRkxPQVQ7Ci10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotCi0jZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODU0MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDFiYTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KLSAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCi0gICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLSAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotCi0gICAgICAgIH0KLQotICAgIH0KLQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxCi0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscwotCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscwotCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCi0KLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKLSAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KLSAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9Ci0gICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZiAvKlNVUFBPUlRfTUMqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJhOWUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwotICAgIHRlbXAgPSBwQ29lZi0+QTI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWI2NDc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLQotLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwotLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KLXsKLSAgTFZNX0lOVDMyICogICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLQotI2VuZGlmIC8qIF9CUV8ySV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvbXBMaW1fcHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKaW5kZXggMDZhMjFjMy4uOWM3YTk2YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29tcExpbV9wcml2YXRlLmgKQEAgLTI4LDE3ICsyOCwxNiBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEZTXzQ4SyAgICAgIDQ4MDAwCisjZGVmaW5lIEZTXzQ4SyA0ODAwMAogCi0jZGVmaW5lIElOVEVHRVJfMTYgIDB4RkZGRiAvKiAgIDY1NTM1Ki8KLSNkZWZpbmUgSU5URUdFUl8xNSAgMHg3RkZGIC8qICAgMzI3NjcqLworI2RlZmluZSBJTlRFR0VSXzE2IDB4RkZGRiAvKiAgIDY1NTM1Ki8KKyNkZWZpbmUgSU5URUdFUl8xNSAweDdGRkYgLyogICAzMjc2NyovCiAKLSNkZWZpbmUgR0FJTl82REIgICAgMQotI2RlZmluZSBHQUlOXzEyREIgICAyCi0jZGVmaW5lIEdBSU5fMThEQiAgIDMKLSNkZWZpbmUgR0FJTl8yNERCICAgNAorI2RlZmluZSBHQUlOXzZEQiAxCisjZGVmaW5lIEdBSU5fMTJEQiAyCisjZGVmaW5lIEdBSU5fMThEQiAzCisjZGVmaW5lIEdBSU5fMjREQiA0CiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9QUklWQVRFXyAqLwogCiAvKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAppbmRleCAzYTUwNTU0Li4xZmU3NDcwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcApAQCAtMTgsMTMwICsxOCw2NSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gQ09QWV8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQ29weV8xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIGlmIChzcmMgPiBkc3QpCi0gICAgewotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHNyYyArPSBuIC0gMTsKLSAgICAgICAgZHN0ICs9IG4gLSAxOwotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgICAgICBkc3QtLTsKLSAgICAgICAgICAgIHNyYy0tOwotICAgICAgICB9Ci0gICAgfQotCit2b2lkIENvcHlfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIG1lbW1vdmUoZHN0LCBzcmMsIG4gKiBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgcmV0dXJuOwogfQotdm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgaWYgKHNyYyA+IGRzdCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3JjICs9IG4gLSAxOwotICAgICAgICBkc3QgKz0gbiAtIDE7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdC0tOwotICAgICAgICAgICAgc3JjLS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgU1VQUE9SVF9NQwogLy8gRXh0cmFjdCBvdXQgdGhlIHN0ZXJlbyBjaGFubmVsIHBhaXIgZnJvbSBtdWx0aWNoYW5uZWwgc291cmNlLgotdm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwotICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKLXsKK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIHsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBpZiAoTnJDaGFubmVscyA+PSAyKQotICAgIHsKLSAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikgeworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKICAgICAgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKICAgICAgICAgICAgIGRzdCArPSAyOwogICAgICAgICAgICAgc3JjICs9IE5yQ2hhbm5lbHM7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoTnJDaGFubmVscyA9PSAxKQotICAgIHsgICAvLyBub3QgZXhwZWN0ZWQgdG8gb2NjdXIsIHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MuCisgICAgfSBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpIHsgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KICAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOwogICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOwotICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CiAgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMF07CiAgICAgICAgICAgICBkc3QgLT0gMjsKLSAgICAgICAgICAgIHNyYyAtLTsKKyAgICAgICAgICAgIHNyYy0tOwogICAgICAgICB9CiAgICAgfQogfQogCiAvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIFN0ZXJlb091dCwgdG8gZHN0Lgotdm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMqLwotICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKLXsKK3ZvaWQgQ29weV9GbG9hdF9TdGVyZW9fTWMoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIGNvbnN0IExWTV9GTE9BVCogU3RlcmVvT3V0LCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIHsKICAgICBMVk1fSU5UMTYgaWksIGpqOwogCi0gICAgLy8gcGFjayBkc3Qgd2l0aCBzdGVyZW8gaW5mb3JtYXRpb24gb2YgU3RlcmVvT3V0Ci0gICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgotICAgIFN0ZXJlb091dCArPSAyICogKE5yRnJhbWVzIC0gMSk7Ci0gICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKLSAgICBzcmMgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOwotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGRzdFsxXSA9IFN0ZXJlb091dFsxXTsKLSAgICAgICAgZHN0WzBdID0gU3RlcmVvT3V0WzBdOyAvLyBjb3B5IDEgYmVmb3JlIDAgaXMgcmVxdWlyZWQgZm9yIE5yQ2hhbm5lbHMgPT0gMy4KLSAgICAgICAgZm9yIChqaiA9IDI7IGpqIDwgTnJDaGFubmVsczsgamorKykKLSAgICAgICAgewotICAgICAgICAgICAgZHN0W2pqXSA9IHNyY1tqal07CisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gRkNDXzIpIHsKKyAgICAgICAgLy8gcGFjayBkc3Qgd2l0aCBzdGVyZW8gaW5mb3JtYXRpb24gb2YgU3RlcmVvT3V0CisgICAgICAgIC8vIHRvZ2V0aGVyIHdpdGggdGhlIHVwcGVyIGNoYW5uZWxzIG9mIHNyYy4KKyAgICAgICAgU3RlcmVvT3V0ICs9IDIgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICAgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIGRzdFsxXSA9IFN0ZXJlb091dFsxXTsKKyAgICAgICAgICAgIGRzdFswXSA9IFN0ZXJlb091dFswXTsgIC8vIGNvcHkgMSBiZWZvcmUgMCBpcyByZXF1aXJlZCBmb3IgTnJDaGFubmVscyA9PSAzLgorICAgICAgICAgICAgZm9yIChqaiA9IEZDQ18yOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspIHsKKyAgICAgICAgICAgICAgICBkc3RbampdID0gc3JjW2pqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCAtPSBOckNoYW5uZWxzOworICAgICAgICAgICAgc3JjIC09IE5yQ2hhbm5lbHM7CisgICAgICAgICAgICBTdGVyZW9PdXQgLT0gMjsKICAgICAgICAgfQotICAgICAgICBkc3QgICAgLT0gTnJDaGFubmVsczsKLSAgICAgICAgc3JjICAgIC09IE5yQ2hhbm5lbHM7Ci0gICAgICAgIFN0ZXJlb091dCAtPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIENvcHlfRmxvYXQoKGNvbnN0IExWTV9GTE9BVCopU3RlcmVvT3V0LCAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilkc3QsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7ICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAgICAgfQogfQotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuY3BwCmluZGV4IDVlNzczMzUuLjJjMjA2MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmNwcApAQCAtMjUsMTMgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWEhBUkRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKK3ZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKE1peF8yU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyLCBUZW1wMzsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7CkBAIC0zOSw3ICszNSw3IEBACiAgICAgQ3VycmVudDFTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQxKTsKICAgICBDdXJyZW50MlNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDIpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0peworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAxID0gKnNyYzErKzsKICAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7CiAgICAgICAgIFRlbXAyID0gKnNyYzIrKzsKQEAgLTQ3LDExICs0MywxMSBAQAogICAgICAgICBUZW1wMiA9IChUZW1wMSAvIDIuMGYpICsgKFRlbXAzIC8gMi4wZik7CiAgICAgICAgIGlmIChUZW1wMiA+IDAuNWYpCiAgICAgICAgICAgICBUZW1wMiA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAyIDwgLTAuNWYgKQorICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmKQogICAgICAgICAgICAgVGVtcDIgPSAtMS4wZjsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgVGVtcDIgPSAoVGVtcDIgKiAyKTsKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXAyOworICAgICAgICAqZHN0KysgPSBUZW1wMjsKICAgICB9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKaW5kZXggOGY1YzBhZS4uYjdmNGI1NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTE4LDcyICsxOCw1NCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOwotICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKLSAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKLSAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7Ci0gICAgTFZNX0lOVDE2ICAgICBpaSxqajsKK3ZvaWQgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCBUZW1wMSwgVGVtcDIsIFRlbXAzOworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnRUaW1lc0FscGhhOworICAgIExWTV9JTlQxNiBpaSwgamo7CiAKICAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KICAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwogCi0gICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgoMS4wZiAtcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldCk7Ci0gICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCl7Ci0gICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0oTFZNX0ZMT0FUKSgyLjBmIC8gMjE0NzQ4MzY0Ny4wZik7IC8qIENlaWwqLworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KSB7CisgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KICAgICB9CiAKLSAgICBpZiAoT3V0TG9vcCl7Ci0KKyAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CiAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKIAotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgIFRlbXAxID0gKnNyYysrOwotICAgICAgICBUZW1wMiA9ICpkc3Q7Ci0KLSAgICAgICAgVGVtcDMgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7Ci0KLSAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKLSAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7Ci0KLSAgICAgICAgKmRzdCsrID0gVGVtcDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKLQotICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7Ci0gICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKLQotICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKKyAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIFRlbXAxID0gKnNyYysrOwogICAgICAgICAgICAgVGVtcDIgPSAqZHN0OwogCiAgICAgICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICBUZW1wMSA9IFRlbXAyICsgVGVtcDM7CisgICAgICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcDIgKyBUZW1wMyk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChUZW1wMSA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcDEgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcDEgPCAtMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wMSA9IC0xLjBmOwotICAgICAgICAgICAgKmRzdCsrID0gVGVtcDE7CisgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IHBJbnN0YW5jZS0+Q3VycmVudCAqIHBJbnN0YW5jZS0+QWxwaGE7CisgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKKworICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wMiArIFRlbXAzKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCmluZGV4IDZmZjc4NTMuLjYxYTQ3NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmNwcApAQCAtMjUsMTIgKzI1LDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKK3ZvaWQgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDEsIFRlbXAyOwogICAgIExWTV9JTlQxNiBPdXRMb29wOwogICAgIExWTV9JTlQxNiBJbkxvb3A7CiAgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CkBAIC00MSwxOSArMzgsMTcgQEAKICAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KICAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwogCi0gICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSA9ICgxLjBmIC0gcEluc3RhbmNlLT5BbHBoYSkgKiBwSW5zdGFuY2UtPlRhcmdldDsgLyogZmxvYXQgKiBmbG9hdCBpbiBmbG9hdCAqLwotICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA+PSBwSW5zdGFuY2UtPkN1cnJlbnQpCi0gICAgeworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPQorICAgICAgICAgICAgKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkgewogICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9IChMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCiAgICAgfQogCi0gICAgaWYgKE91dExvb3AgIT0gMCkKLSAgICB7CisgICAgaWYgKE91dExvb3AgIT0gMCkgewogICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IChwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhKTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CiAgICAgICAgICAgICBzcmMrKzsKIApAQCAtNjMsMzcgKzU4LDM2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICBzcmMrKzsKIAotICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICAgICAgKmRzdCA9IFRlbXAyOwotICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICBkc3QrKzsKIAotICAgICAgICAgICAgVGVtcDEgPSAqc3JjOwotICAgICAgICAgICAgc3JjKys7CisgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgc3JjKys7CiAKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAKLSAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKLSAgICAgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOwogCi0gICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgIGRzdCsrOwogCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgIHNyYysrOworICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgZHN0Kys7CiAgICAgfQogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAKaW5kZXggYTdjZTRkMy4uNmU4NTlmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcApAQCAtMTQsNTQgKzE0LDEwIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKLSAgICAgICAgTFZNX0ZMT0FUIERpZmY7Ci0gICAgICAgIExWTV9JTlQzMiBqOwotICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7Ci0gICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7Ci0gICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewotICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9Ci0gICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7Ci0gICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQotICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7Ci0gICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9Ci0gICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOwotICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotICAgICAgICB9Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOwotICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOwotCi0gICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAvKgogICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCiAgKgpAQCAtNzksMzcgKzM1LDI1IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKLSAgICAgICAgTFZNX0ZMT0FUIERpZmY7Ci0gICAgICAgIExWTV9JTlQzMiBqOwotICAgICAgICBMVk1fSU5UMzIgaTsKLSAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVk1fRkxPQVQqIHBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcERhdGFPdXQsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fRkxPQVQqIENoREM7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0lOVDMyIGo7CisgICAgTFZNX0lOVDMyIGk7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYylwSW5zdGFuY2U7CiAKLSAgICAgICAgQ2hEQyA9ICZwQmlxdWFkU3RhdGUtPkNoRENbMF07Ci0gICAgICAgIGZvciAoaiA9IE5yRnJhbWVzIC0gMTsgaiA+PSAwOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLwotICAgICAgICAgICAgZm9yIChpID0gTnJDaGFubmVscyAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoQ2hEQ1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQotICAgICAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIENoRENbaV0gLT0gRENfRkxPQVRfU1RFUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBDaERDW2ldICs9IERDX0ZMT0FUX1NURVA7IH0KKyAgICBDaERDID0gJnBCaXF1YWRTdGF0ZS0+Q2hEQ1swXTsKKyAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLworICAgICAgICBmb3IgKGkgPSBOckNoYW5uZWxzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoQ2hEQ1tpXSk7CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gTFZNX0NsYW1wKERpZmYpOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgQ2hEQ1tpXSAtPSBEQ19GTE9BVF9TVEVQOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDaERDW2ldICs9IERDX0ZMT0FUX1NURVA7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQotCiAgICAgfQotI2VuZGlmCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCmluZGV4IGJlZWUxMTIuLmMxNjcxOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0xNywyMCArMTcsMTAgQEAKIAogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLXZvaWQgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQotewotICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGUgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgICAgICAgID0gMC4wZjsKLSAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgICAgICAgPSAwLjBmOwotfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEluc3RhbmNlKQotewotICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlICA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7Cit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqIHBJbnN0YW5jZSkgeworICAgIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpcEluc3RhbmNlOwogICAgIExWTV9JTlQzMiBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspIHsKICAgICAgICAgcEJpcXVhZFN0YXRlLT5DaERDW2ldID0gMC4wZjsKICAgICB9CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA2NTA4YjczLi44ZjQ1OWQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOCwyMSArMTgsMTcgQEAKICNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAotI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAwLjAwMDAwMDIzODRmCiAKIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlXwotewotICAgIExWTV9GTE9BVCAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLwotICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KLX1GaWx0ZXJfRkxPQVRfU3RhdGU7Ci10eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOwotI2lmZGVmIFNVUFBPUlRfTUMKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfTWNfCi17Ci0gICAgTFZNX0ZMT0FUICBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAgICAgLyogQ2hhbm5lbERDICAqLwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV8geworICAgIExWTV9GTE9BVCBMZWZ0REM7ICAvKiBMZWZ0REMgICovCisgICAgTFZNX0ZMT0FUIFJpZ2h0REM7IC8qIFJpZ2h0REMgICovCit9IEZpbHRlcl9GTE9BVF9TdGF0ZTsKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlKiBQRmlsdGVyX0ZMT0FUX1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18geworICAgIExWTV9GTE9BVCBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAvKiBDaGFubmVsREMgICovCiB9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKLXR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7Ci0jZW5kaWYKK3R5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jKiBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jOwogI2VuZGlmIC8qIF9EQ18ySV9EMTZfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWZhZTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBEZWxheUFsbFBhc3NfMzJ4MzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIERlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyKCAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgY29lZmYsICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBjb2VmZmljaWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgRGVsYXlPZmZzZXQsICAgICAgICAgICAgICAgLyogU2ltcGxlIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgKnBBbGxQYXNzT2Zmc2V0LCAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGRlbGF5IG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgIHNhbXBsZXMgKi8KLXsKLSAgICBMVk1fSU5UMTYgICBpOwotICAgIExWTV9VSU5UMTYgICBBbGxQYXNzT2Zmc2V0ID0gKnBBbGxQYXNzT2Zmc2V0OwotICAgIExWTV9JTlQzMiAgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgICBhLGIsYzsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgewotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKGRlbGF5W0FsbFBhc3NPZmZzZXRdLCBjb2VmZiwgdGVtcCwgMTUpCi0gICAgICAgIGEgPSB0ZW1wOwotICAgICAgICBiID0gZGVsYXlbRGVsYXlPZmZzZXRdOwotICAgICAgICBEZWxheU9mZnNldCsrOwotCi0gICAgICAgIGMgPSBhICsgYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSAhPSAwKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoYSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqZHN0ID0gYzsKLSAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoYywgLWNvZWZmLCB0ZW1wLCAxNSkKLSAgICAgICAgYSA9IHRlbXA7Ci0gICAgICAgIGIgPSBkZWxheVtBbGxQYXNzT2Zmc2V0XTsKLSAgICAgICAgYyA9IGEgKyBiOwotICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpIT0wKSAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYoYSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWxheVtBbGxQYXNzT2Zmc2V0XSA9IGM7Ci0gICAgICAgIEFsbFBhc3NPZmZzZXQrKzsKLQotICAgICAgICAvKiBNYWtlIHRoZSBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KLSAgICAgICAgaWYgKERlbGF5T2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGF5T2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChBbGxQYXNzT2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFsbFBhc3NPZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KLSAgICAqcEFsbFBhc3NPZmZzZXQgPSBBbGxQYXNzT2Zmc2V0OwotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuY3BwCmluZGV4IDUyZDI2M2YuLmEzNDY2MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAKQEAgLTIxLDQ1ICsyMSw1NSBAQAogCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit2b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRlbGF5LCAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBzaXplLCAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2KiBwT2Zmc2V0LCAgIC8qIERlbGF5IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiwgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwogewotICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgTFZNX0lOVDE2ICAgT2Zmc2V0ICA9ICpwT2Zmc2V0OwotICAgIExWTV9JTlQxNiAgIHRlbXA7CisgICAgTFZNX0lOVDE2IGk7CisgICAgTFZNX0lOVDE2IE9mZnNldCA9ICpwT2Zmc2V0OworICAgIExWTV9GTE9BVCB0ZW1wOwogCi0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpICsgKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKLSAgICAgICAgKmRzdCA9IHRlbXA7Ci0gICAgICAgIGRzdCsrOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gRkNDXzEpIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGY7CisgICAgICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOwogCi0gICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwotICAgICAgICBPZmZzZXQrKzsKLSAgICAgICAgc3JjKys7CisgICAgICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgICAgIE9mZnNldCsrOworICAgICAgICAgICAgc3JjKys7CiAKLSAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKLSAgICAgICAgKmRzdCA9IHRlbXA7Ci0gICAgICAgIGRzdCsrOworICAgICAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgICAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLworICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKCpkc3QgKyAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZjsKKyAgICAgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICAgICAgZHN0Kys7CiAKLSAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7Ci0gICAgICAgIE9mZnNldCsrOwotICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgICAgICBzcmMrKzsKIAotICAgICAgICAvKiBNYWtlIHRoZSByZXZlcmIgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGY7CisgICAgICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgICAgIE9mZnNldCsrOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkgeworICAgICAgICAgICAgICAgIE9mZnNldCA9IDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY4LDQ3ICs3OCwzIEBACiAKICAgICByZXR1cm47CiB9Ci12b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7Ci0gICAgTFZNX0ZMT0FUICAgdGVtcDsKLQotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwotICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwotICAgICAgICBkc3QrKzsKLQotICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKLSAgICAgICAgT2Zmc2V0Kys7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCAgICAgICAgICAgID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVCkoKmRzdCAtIChMVk1fRkxPQVQpZGVsYXlbT2Zmc2V0XSkgLyAyLjBmKTsKLSAgICAgICAgKmRzdCAgICAgICAgICAgID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgZGVsYXlbT2Zmc2V0XSA9ICpzcmM7Ci0gICAgICAgIE9mZnNldCsrOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBNYWtlIHRoZSByZXZlcmIgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCi0gICAgKnBPZmZzZXQgPSBPZmZzZXQ7Ci0KLSAgICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWNkZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBEZWxheU1peF8xNngxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRGVsYXlXcml0ZV8zMihjb25zdCBMVk1fSU5UMzIgICpzcmMsICAgICAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwT2Zmc2V0LCAgICAgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuKSAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKExWTV9JTlQxNikqcE9mZnNldDsKLQotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwotICAgICAgICBPZmZzZXQrKzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChPZmZzZXQgPj0gc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCi0gICAgKnBPZmZzZXQgPSAoTFZNX1VJTlQxNilPZmZzZXQ7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjBkNjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjEyMjVlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjNkZjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIqICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDE2ICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzNdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19RmlsdGVyX1N0YXRlX0ZMT0FUOwotCi10eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotI2VuZGlmIC8qIF9GT18xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWZhZDcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgIGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICB9Ci0KLSAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUyOTVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOwotCi0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci19Ci0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkMTM4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0jZGVmaW5lIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCi0KLS8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KLS8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVF8KLXsKLSAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9TdGF0ZV9GTE9BVDsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZiAvKiBfRk9fMUlfRDMyRjMyQ0xMX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhODE5YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLUFTU1VNUFRJT05TOgotQ09FRlMtCi1wQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAotcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5TaGlmdCAgICBpcyBTaGlmdCB2YWx1ZQotREVMQVlTLQotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTMwIGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgIHluTCx5blI7Ci0gICAgICAgIExWTV9GTE9BVCAgIFRlbXA7Ci0gICAgICAgIExWTV9GTE9BVCAgIE5lZ1NhdFZhbHVlOwotICAgICAgICBMVk1fSU5UMTYgICBpaTsKLQotICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvLyB5bkwgPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLSAgICAgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKLSAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKLSAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5MICs9IFRlbXA7Ci0gICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKLSAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5SICs9IFRlbXA7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0geW5SOyAvLyBVcGRhdGUgeShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUgotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KLSAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB5blIgPSAxLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKLSAgICAgICAgfQotCi0gICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQVNTVU1QVElPTlM6Ci1DT0VGUy0KLXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi1wQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAotcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCi1ERUxBWVMtCi1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAotVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQotCi1QQVJBTUVURVJTOgotIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQotIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCi0gcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KLSBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKLSBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscwotCi1SRVRVUk5TOgotIHZvaWQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICAgeW47Ci0gICAgICAgIExWTV9GTE9BVCAgIFRlbXA7Ci0gICAgICAgIExWTV9JTlQxNiAgIGlpOwotICAgICAgICBMVk1fSU5UMTYgICBjaDsKLSAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOwotICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOwotICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKLSAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07Ci0gICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOwotCi0gICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCi0gICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKLQotICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCi0gICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCi0gICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKLSAgICAgICAgICAgICAgICB5biArPSBUZW1wOwotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgcERlbGF5c1sxXSA9IHluOyAvLyBVcGRhdGUgeShuLTEpCi0gICAgICAgICAgICAgICAgcERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKQotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCi0gICAgICAgICAgICAgICAgaWYgKHluID4gMS4wZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluID0gMS4wZjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHluIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgeW4gPSAtMS4wZjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW47Ci0gICAgICAgICAgICAgICAgcERlbGF5cyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcERlbGF5cyAtPSBOckNoYW5uZWxzICogMjsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWI5NzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjI1MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KLSNkZWZpbmUgX0ZPXzJJX0QxNkYzMkNTU19MU0hYX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICAgIExWTV9GTE9BVCAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotfUZpbHRlcl9GbG9hdF9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfRmxvYXRfU3RhdGUgKiBQRmlsdGVyX0Zsb2F0X1N0YXRlIDsKLSNlbmRpZiAvKiBfRk9fMklfRDE2RjMyQ1NTX0xTSFhfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKaW5kZXggYjVkYjhmNC4uOGViM2U3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaApAQCAtMzAsMjYgKzMwLDIzIEBACiAgKiBCaXF1YWQgd2l0aCBjb2VmZmljaWVudHMgQTAsIEExLCBBMiwgQjEgYW5kIEIyIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICBBMDsKLSAgICBMVk1fRkxPQVQgICBBMTsKLSAgICBMVk1fRkxPQVQgICBBMjsKLSAgICBMVk1fRkxPQVQgICBCMTsKLSAgICBMVk1fRkxPQVQgICBCMjsKLSAgICBMVk1fVUlOVDE2ICBTY2FsZTsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgQTA7CisgICAgTFZNX0ZMT0FUIEExOworICAgIExWTV9GTE9BVCBBMjsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3Q7CiAvKgogICogQmlxdWFkIHdpdGggY29lZmZpY2llbnRzIEEwLCBBMSBhbmQgQjEgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgIEEwOwotICAgIExWTV9GTE9BVCAgIEExOwotICAgIExWTV9GTE9BVCAgIEIxOwotICAgIExWTV9VSU5UMTYgIFNjYWxlOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQTE7CisgICAgTFZNX0ZMT0FUIEIxOworICAgIExWTV9VSU5UMTYgU2NhbGU7CiB9IEJpcXVhZEEwMUIxQ29lZnNTUF90OwogCi0jZW5kaWYgICAgICAvKiBGSUxURVJTX0ggKi8KLQorI2VuZGlmIC8qIEZJTFRFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAppbmRleCBjM2Y2NjQ4Li5lMmY4YzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcApAQCAtMjEsNDcgKzIxLDEwIEBACiAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0Owordm9pZCBGcm9tMmlUb01TX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdE0sIExWTV9GTE9BVCogZHN0UywgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgdGVtcDEsIGxlZnQsIHJpZ2h0OwogICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSAoTFZNX0lOVDMyKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIHJpZ2h0ID0gKExWTV9JTlQzMikqc3JjOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOwotICAgICAgICAqZHN0TSA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdE0rKzsKLQotICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQtcmlnaHQpPj4xOwotICAgICAgICAqZHN0UyA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdFMrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIEZyb20yaVRvTVNfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0TSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0UywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDEsbGVmdCxyaWdodDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIGxlZnQgPSAoTFZNX0ZMT0FUKSpzcmM7CiAgICAgICAgIHNyYysrOwogCkBAIC02OSwxNiArMzIsMTUgQEAKICAgICAgICAgc3JjKys7CiAKICAgICAgICAgLyogQ29tcHV0ZSBNIHNpZ25hbCovCi0gICAgICAgIHRlbXAxID0gIChsZWZ0ICsgcmlnaHQpIC8gMi4wZjsKKyAgICAgICAgdGVtcDEgPSAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CiAgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKICAgICAgICAgZHN0TSsrOwogCiAgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLwotICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgIHRlbXAxID0gKGxlZnQgLSByaWdodCkgLyAyLjBmOwogICAgICAgICAqZHN0UyA9IChMVk1fRkxPQVQpdGVtcDE7CiAgICAgICAgIGRzdFMrKzsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU4ZWU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBGcm9tMmlUb01vbm9fMTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEZyb20yaVRvTW9ub18xNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQzMiBUZW1wOwotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgVGVtcCArPSAoTFZNX0lOVDMyKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgID0gKExWTV9JTlQxNikoVGVtcCA+PjEpOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAKaW5kZXggYTg2ODhiNC4uMDM5ZWUxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwCkBAIC0yMSw0MCArMjEsMTEgQEAKIAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIFRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIEZyb20yaVRvTW9ub19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIEZyb20yaVRvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCBUZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAgPSAoKnNyYyk7CiAgICAgICAgIHNyYysrOwogCkBAIC02Nyw3ICszOCw2IEBACiAKICAgICByZXR1cm47CiB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQKICAqCkBAIC04NSwxOSArNTUsMTQgQEAKICAqICB2b2lkCiAgKgogICovCi12b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpCi17Cit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CiAgICAgTFZNX0lOVDE2IGlpLCBqajsKICAgICBMVk1fRkxPQVQgVGVtcDsKIAotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIFRlbXAgPSAwLjBmOwotICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CiAgICAgICAgICAgICBUZW1wICs9ICgqc3JjKTsKICAgICAgICAgICAgIHNyYysrOwogICAgICAgICB9CkBAIC0xMDcsNiArNzIsMyBAQAogCiAgICAgcmV0dXJuOwogfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzliZjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdCgpCi0gKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgU3RhcnRBZGRyIC0gQmFzZSBhZGRyZXNzIG9mIHRoZSBpbnN0YW5jZSBtZW1vcnkKLSAqICBSZXR1cm5zICAgICA6IEVycm9yIGNvZGUKLSAqICBEZXNjcmlwdGlvbiA6IEluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSBkaXN0cmlidXRpb24gYW5kIG1lbW9yeSBzaXplIGNhbGN1bGF0aW9uIGZ1bmN0aW9uCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpTdGFydEFkZHIgKQotewotICAgIHBtcy0+VG90YWxTaXplID0gMzsKLSAgICBwbXMtPnBOZXh0TWVtYmVyID0gKCgodWludHB0cl90KVN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfQWRkTWVtYmVyKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICBTaXplIC0gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldyBhZGRlZCBtZW1iZXIKLSAqICBSZXR1cm5zICAgICA6IEEgcG9pbnRlciB0byB0aGUgbmV3IGFkZGVkIG1lbWJlcgotICogIERlc2NyaXB0aW9uIDogQWxsb2NhdGVzIHNwYWNlIGZvciBhIG5ldyBtZW1iZXIgaW4gdGhlIGluc3RhbmNlIG1lbW9yeSBhbmQgcmV0dXJucwotICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIHRoaXMgbmV3IG1lbWJlci4gIFRoZSBzdGFydCBhZGRyZXNzIG9mIGFsbCBtZW1iZXJzIHdpbGwKLSAgICAgICAgICAgICAgICAgIGJlIDMyIGJpdCBhbGxpZ25lZC4KLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyKCBJTlNUX0FMTE9DICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgU2l6ZSApCi17Ci0gICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLwotICAgIE5ld01lbWJlckFkZHJlc3MgPSAodm9pZCopcG1zLT5wTmV4dE1lbWJlcjsKLQotICAgIFNpemUgPSAoKFNpemUgKyAzKSAmIChMVk1fVUlOVDMyKX4zKTsgLyogQ2VpbCB0aGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIGZvdXIgKi8KLQotICAgIHBtcy0+VG90YWxTaXplICs9IFNpemU7Ci0gICAgcG1zLT5wTmV4dE1lbWJlciArPSBTaXplOwotCi0gICAgcmV0dXJuKE5ld01lbWJlckFkZHJlc3MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcykKLXsKLSAgICBpZiAocG1zLT5Ub3RhbFNpemUgPiAzKQotICAgIHsKLSAgICAgICAgcmV0dXJuKHBtcy0+VG90YWxTaXplKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBObyBtZW1vcnkgYWRkZWQgKi8KLSAgICB9Ci19Ci0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlKQotewotICAgIHVpbnRwdHJfdCBTdGFydEFkZHI7Ci0KLSAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwotCi0gICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLQotICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLSAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwotCi0gICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIGFycmF5IG9mIGZvdXIgSU5TVF9BTExPQyBpbnN0YW5jZXMKLSAqICBSZXR1cm5zICAgICA6IE5vdGhpbmcKLSAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb24gcmVzZXJ2ZXMgU2l6ZSBvZiAzIGJ5dGVzIGZvciBhbGwgbWVtb3J5IHJlZ2lvbnMgYW5kCi0gKiAgICAgICAgICAgICAgICBpbnRpYWxpemVzIHBOZXh0TWVtYmVyIGZvciBhbGwgcmVnaW9ucyB0byAwCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgSW5zdEFsbG9jX0luaXRBbGxfTlVMTCggSU5TVF9BTExPQyAgKnBtcykKLXsKLSAgICBwbXNbMF0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAwOwotCi0gICAgcG1zWzFdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzFdLnBOZXh0TWVtYmVyID0gMDsKLQotICAgIHBtc1syXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1syXS5wTmV4dE1lbWJlciA9IDA7Ci0KLSAgICBwbXNbM10uVG90YWxTaXplID0gMzsKLSAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAwOwotCi19Ci0KLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgIFNpemVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKLXsKLSAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBjb3Zlcml0eVtyZXR1cm5lZF9wb2ludGVyXSBJZ25vcmUgY292ZXJpdHkgd2FybmluZyB0aGF0IHB0ciBpcyBub3QgdXNlZCAqLwotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSBMVk1fTlVMTDsKLQotICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKLX0KLQotdm9pZCogICBJbnN0QWxsb2NfQWRkTWVtYmVyQWxsUmV0KCAgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgKnBtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgU2l6ZVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICoqcHRyKQotewotICAgIHB0clswXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOwotICAgIHB0clsxXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOwotICAgIHB0clsyXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLCBTaXplW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOwotICAgIHB0clszXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdLCBTaXplW0xWTV9URU1QT1JBUllfRkFTVF0pOwotCi0gICAgcmV0dXJuIChwdHJbMF0pOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMDllNGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIElOVDE2TFNISUZUVE9JTlQzMl8xNlgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKGNvbnN0IExWTV9JTlQxNiAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgIHNoaWZ0ICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBzcmMgKz0gbi0xOwotICAgIGRzdCArPSBuLTE7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSAoICgoTFZNX0lOVDMyKSpzcmMpIDw8IHNoaWZ0KTsKLSAgICAgICAgc3JjLS07Ci0gICAgICAgIGRzdC0tOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzk5ODBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gSU5UMzJSU0hJRlRUT0lOVDE2X1NBVF8zMlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICkKLXsKLSAgICBMVk1fSU5UMzIgdGVtcDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAqc3JjID4+IHNoaWZ0OwotICAgICAgICBzcmMrKzsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0pvaW5UbzJpXzMyeDMyLmNwcAppbmRleCAwNWRmNjU2Li42YzdjOGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwCkBAIC0yMSw0NyArMjEsMTQgQEAKIAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEpvaW5UbzJpXzMyeDMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBKb2luVG8yaV8zMngzMiggY29uc3QgTFZNX0lOVDMyICAgICpzcmNMLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgc3JjTCArPSBuLTE7Ci0gICAgc3JjUiArPSBuLTE7Ci0gICAgZHN0ICArPSAoKDIqbiktMSk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSAqc3JjUjsKLSAgICAgICAgZHN0LS07Ci0gICAgICAgIHNyY1ItLTsKLQotICAgICAgICAqZHN0ID0gKnNyY0w7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmNMLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotdm9pZCBKb2luVG8yaV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAgICpzcmNMLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmNSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgbiApCi17Cit2b2lkIEpvaW5UbzJpX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTCwgY29uc3QgTFZNX0ZMT0FUKiBzcmNSLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7CiAKICAgICBzcmNMICs9IG4gLSAxOwogICAgIHNyY1IgKz0gbiAtIDE7Ci0gICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworICAgIGRzdCArPSAoKDIgKiBuKSAtIDEpOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICpkc3QgPSAqc3JjUjsKICAgICAgICAgZHN0LS07CiAgICAgICAgIHNyY1ItLTsKQEAgLTc0LDQgKzQxLDMgQEAKICAgICByZXR1cm47CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcAppbmRleCAxNGQ2MWJkLi5kNjcwYjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcApAQCAtMTgsNjcgKzE4LDE5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOwotICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwotCi0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMi0+Q3VycmVudCk7Ci0gICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7Ci0gICAgfQotCi19Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckNoYW5uZWxzKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fRkxPQVQgVGVtcDsKICAgICBMVk1fSU5UMTYgaWksIGpqOwotICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZVtqal0pOwotICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UxLT5DdXJyZW50KTsKLSAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykgeworICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZVtqal0pOworICAgICAgICAgICAgVGVtcCA9ICAqc3JjKysgKiBwSW5zdGFuY2UxLT5DdXJyZW50OworICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICB9CiAgICAgfQogfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggODQxZmExZS4uNDE3YzFmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKQEAgLTE4LDM4ICsxOCwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBMVk1fRkxPQVQgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UyLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgVGVtcDsKICAgICBMVk1fSU5UMTYgaWk7CiAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOwogICAgIExWTV9GTE9BVCBDdXJyZW50MjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwogCi0gICAgQ3VycmVudDEgPSAocEluc3RhbmNlMS0+Q3VycmVudCk7Ci0gICAgQ3VycmVudDIgPSAocEluc3RhbmNlMi0+Q3VycmVudCk7CisgICAgQ3VycmVudDEgPSBwSW5zdGFuY2UxLT5DdXJyZW50OworICAgIEN1cnJlbnQyID0gcEluc3RhbmNlMi0+Q3VycmVudDsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcCA9ICgoKExWTV9GTE9BVCkqKHNyYzErKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQxKSkgKwotICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKSooc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKLSAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgVGVtcCA9ICAqc3JjMSsrICogQ3VycmVudDEgKyAqc3JjMisrICogQ3VycmVudDI7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICB9CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcAppbmRleCAzMTgxMzhkLi5kOGMyNWM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0xOCwxMDIgKzE4LDcyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLQotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpLGpqOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fRkxPQVQgICBUZW1wOwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAogICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwogICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CiAKLSAgICBpZihDdXJyZW50IDwgVGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApeworICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSB7CisgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0xMzEsMjEgKzEwMSwxNiBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJDaGFubmVscykKLXsKLQotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpLCBqajsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOwotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcDsKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgIExWTV9GTE9BVCBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgVGVtcDsKIAogICAgIC8qCiAgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KQEAgLTE2MCw5MCArMTI1LDUyIEBACiAgICAgICAgIGlmIChPdXRMb29wKSB7CiAgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwogICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIE5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKLSAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogCi0gICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKLQorICAgICAgICAgICAgICAgIFRlbXAgPSAqZHN0ICsgKnNyYysrICogQ3VycmVudDsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBMVk1fQ2xhbXAoVGVtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCAqIE5yQ2hhbm5lbHM7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICpkc3QgKyAqc3JjKysgKiBDdXJyZW50OworICAgICAgICAgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKIAotICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7Ci0KKyAgICAgICAgICAgICAgICBUZW1wID0gKmRzdCArICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKFRlbXApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7CiB9CiAKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCmluZGV4IDFmNGIwOGEuLjA5NjhjZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCkBAIC0xOCwxNzYgKzE4LDM4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgTFZNX0ZMT0FUIEFERDJfU0FUX0ZMT0FUKExWTV9GTE9BVCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGMpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgdGVtcCA9IGEgKyBiIDsKLSAgICBpZiAodGVtcCA8IC0xLjBmKQotICAgICAgICBjID0gLTEuMGY7Ci0gICAgZWxzZSBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIGMgPSAxLjBmOwotICAgIGVsc2UKLSAgICAgICAgYyA9IHRlbXA7Ci0gICAgcmV0dXJuIGM7CitzdGF0aWMgaW5saW5lIExWTV9GTE9BVCBBREQyX1NBVF9GTE9BVChMVk1fRkxPQVQgYSwgTFZNX0ZMT0FUIGIpIHsKKyAgICByZXR1cm4gTFZNX0NsYW1wKGEgKyBiKTsKIH0KLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQotewotICAgIExWTV9JTlQxNiAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlTCA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlUiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwotCi0gICAgTFZNX0ZMT0FUICAgRGVsdGFMID0gcEluc3RhbmNlTC0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudEwgPSBwSW5zdGFuY2VMLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7Ci0KLSAgICBMVk1fRkxPQVQgICBEZWx0YVIgPSBwSW5zdGFuY2VSLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50UiA9IHBJbnN0YW5jZVItPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKLQotICAgIExWTV9GTE9BVCAgIFRlbXAgPSAwOwotCi0gICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCi0gICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKLQotICAgIGlmIChPdXRMb29wKQotICAgIHsKLSAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICB7Ci0gICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKLSAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCi0gICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOwotICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQotICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wICogMjsgaWkgIT0gMDsgaWkgLT0gMikKLSAgICAgICAgewotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gSW5Mb29wICogMjsgaWkgIT0gMDsgaWktPTIpCi0gICAgewotICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOwotICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgewotICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7Ci0gICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQotICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0KLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKLSAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICB9Ci0gICAgcEluc3RhbmNlTC0+Q3VycmVudCA9IEN1cnJlbnRMOwotICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKLQotfQotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBMVk1fSU5UMzIgICBpaSwgY2g7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcCA9MC4wZjsKLSAgICBMVk1fRkxPQVQgICB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKLSAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgIHsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMzIgaWksIGNoOworICAgIExWTV9GTE9BVCB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIHRlbXBDdXJyZW50W2NoXSA9IHB0ckluc3RhbmNlW2NoXS0+Q3VycmVudDsKICAgICB9Ci0gICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSA+IDA7IGlpLS0pCi0gICAgewotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gcHRySW5zdGFuY2VbY2hdOwotICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOwotICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgQ3VycmVudCA9IHRlbXBDdXJyZW50W2NoXTsKLSAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudCwgRGVsdGEsIFRlbXApOwotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgPiAwOyBpaS0tKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSBwdHJJbnN0YW5jZVtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOworICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgeworICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBBREQyX1NBVF9GTE9BVChDdXJyZW50LCBEZWx0YSk7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqZHN0KysgPSAqc3JjKysgKiBDdXJyZW50OwogICAgICAgICAgICAgdGVtcEN1cnJlbnRbY2hdID0gQ3VycmVudDsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQotICAgIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgIHB0ckluc3RhbmNlW2NoXS0+Q3VycmVudCA9IHRlbXBDdXJyZW50W2NoXTsKICAgICB9CiB9Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcAppbmRleCA1ZDhhYWRjLi5mYzQ2NGU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcApAQCAtMTgsNyArMTgsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiAjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCiAjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgpAQCAtMjYsODYgKzI1LDYyIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICBpaTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOwotICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fRkxPQVQgICBUZW1wOwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTFZNX0lOVDE2IE91dExvb3A7CisgICAgTFZNX0lOVDE2IEluTG9vcDsKKyAgICBMVk1fSU5UMzIgaWk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKIAogICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwogICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CiAKLSAgICBpZihDdXJyZW50PFRhcmdldCl7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgQ3VycmVudCA9IExWTV9DbGFtcChDdXJyZW50ICsgRGVsdGEpOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7Ci0gICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7Ci0gICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwotCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBMVk1fQ2xhbXAoQ3VycmVudCArIERlbHRhKTsKIAotICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IDEuMGY7Ci0gICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgVGVtcCA9IC0xLjBmOwotCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpICk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoT3V0TG9vcCkgewogICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgQ3VycmVudCA9IFRhcmdldDsKIAotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEKICAqCkBAIC0xMjMsMjAgKzk4LDE1IEBACiAgKiAgdm9pZAogICoKICAqLwotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWksIGpqOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OwotICAgIExWTV9GTE9BVCAgIFRlbXA7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBMVk1fSU5UMTYgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgSW5Mb29wOworICAgIExWTV9JTlQzMiBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnQgPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKIAogICAgIC8qCiAgICAgICogU2FtZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIG9uIGNvbnNlY3V0aXZlIGZyYW1lcy4KQEAgLTE0Nyw3MyArMTE3LDUwIEBACiAgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCiAgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CiAKLSAgICBpZiAoQ3VycmVudDxUYXJnZXQpIHsKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgewogICAgICAgICBpZiAoT3V0TG9vcCkgewotCi0gICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwotICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKLQotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBMVk1fQ2xhbXAoQ3VycmVudCArIERlbHRhKTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCiAgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkgewotICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCA9IExWTV9DbGFtcChDdXJyZW50ICsgRGVsdGEpOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKLSAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7Ci0KLSAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKLSAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7Ci0KLSAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7Ci0KLSAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkgKiAoc3JjKyspICogQ3VycmVudCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKE91dExvb3ApIHsKICAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIEN1cnJlbnQgPSBUYXJnZXQ7CiAKICAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgewotICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KSBDdXJyZW50ID0gVGFyZ2V0OwogCi0gICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMDsgamotLSkgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSAqIChzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpICogKHNyYysrKSAqIEN1cnJlbnQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKaW5kZXggMmJlYzNiZS4uMjcwYzdlMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0yNywzOSArMjcsMzUgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBNSVhJTlNPRlRfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CiAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKQEAgLTcwLDExMSArNjYsMTIgQEAKICAgICAgICBIQVJEIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAoSGFyZE1peGluZyl7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpewotICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKLSAgICAgICAgICAgICAgICAvKiBJbiBjYXNlIHRoZSBMVkNvcmUgZnVuY3Rpb24gd291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotI2lmZGVmIFNVUFBPUlRfTUMKLS8qCi0gKiBGVU5DVElPTjogICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUCi0gKgotICogREVTQ1JJUFRJT046Ci0gKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAotICoKLSAqIFBBUkFNRVRFUlM6Ci0gKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgotICogIHNyYyAgICAgICAgICAgIFNvdXJjZQotICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCi0gKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcwotICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscwotICoKLSAqIFJFVFVSTlM6Ci0gKiAgdm9pZAotICoKLSAqLwotdm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscykKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogICAgIGlmIChIYXJkTWl4aW5nKSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKSB7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzKk5yQ2hhbm5lbHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5UYXJnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwogICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIH0KQEAgLTE5MywxNSArOTAsOTcgQEAKICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwogICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKSB7CisgICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApIHsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCmluZGV4IDMxNTNhZGEuLmIwYWExNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKQEAgLTI5LDE0NCArMjksMTE4IEBACiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAogCiAjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKChzaXplb2YoYSkpIC8gKHNpemVvZigqKGEpKSkpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAorICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwogLyogVGhpcyB0aHJlc2hvbGQgaXMgdXNlZCB0byBkZWNpZGUgb24gdGhlIHByb2Nlc3NpbmcgdG8gYmUgYXBwbGllZCBvbgogICogZnJvbnQgY2VudGVyIGFuZCBiYWNrIGNlbnRlciBjaGFubmVscwogICovCiAjZGVmaW5lIExWTV9WT0xfQkFMX1RIUiAoMC4wMDAwMTZmKQotdm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUIChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIENoTWFzaykKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfbGZlID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICBUYXJnZXRfY3RyID0ge0xWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVR9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBNaXhQcml2SW5zdFs0XSA9IHtwSW5zdGFuY2UxLCBwSW5zdGFuY2UyLCAmVGFyZ2V0X2N0ciwgJlRhcmdldF9sZmV9OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlW05yQ2hhbm5lbHNdOwordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQzMiBOckNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBDaE1hc2spIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0IFRhcmdldF9sZmUgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgVGFyZ2V0X2N0ciA9IHtMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTIgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwTWl4UHJpdkluc3RbNF0gPSB7cEluc3RhbmNlMSwgcEluc3RhbmNlMiwgJlRhcmdldF9jdHIsICZUYXJnZXRfbGZlfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlW05yQ2hhbm5lbHNdOwogCi0gICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oQ2hNYXNrKQotICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7CisgICAgaWYgKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oQ2hNYXNrKSA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKSB7CisgICAgICAgIGludCBsb29wTGltaXQgPSAoTnJDaGFubmVscyA9PSBGQ0NfMSkgPyBOckNoYW5uZWxzIDogRkNDXzI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9vcExpbWl0OyBpKyspIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFtpXTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE5yQ2hhbm5lbHM7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGludCBpID0gbG9vcExpbWl0OyBpIDwgTnJDaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiBDb21iaW5lIHdpdGggc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL0JhbGFuY2UuY3BwCiAgICAgICAgIC8vIENvbnN0YW50cyBpbiBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW8tYmFzZS5oCiAgICAgICAgIC8vICdtaXhJbnN0SWR4JyBpcyB1c2VkIHRvIG1hcCB0aGUgYXBwcm9wcmlhdGUgbWl4ZXIgaW5zdGFuY2UgZm9yIGVhY2ggY2hhbm5lbC4KICAgICAgICAgY29uc3QgaW50IG1peEluc3RJZHhbXSA9IHsKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQgICAgICAgICAgICA9IDB4MXUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAotICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSICAgICAgICAgID0gMHg0dSwKLSAgICAgICAgICAgIDMsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kgICAgICAgICA9IDB4OHUsCi0gICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfUklHSFQgICAgICAgICAgICA9IDB4MjB1LAotICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIgID0gMHg0MHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKLSAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfQ0VOVEVSICAgICAgICAgICA9IDB4MTAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCAgICAgICAgICAgICA9IDB4MjAwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKLSAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9DRU5URVIgICAgICAgICAgICA9IDB4ODAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9MRUZUICAgICAgICA9IDB4MTAwMHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAotICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUICAgICAgID0gMHg0MDAwdSwKLSAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQgICAgICAgICA9IDB4ODAwMHUsCi0gICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKLSAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUICAgICAgICA9IDB4MjAwMDB1LAotICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCAgICAgICAgID0gMHg0MDAwMHUsCi0gICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdQorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUICAgICAgICAgICAgPSAweDF1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCAgICAgICAgICAgPSAweDJ1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDR1LAorICAgICAgICAgICAgICAgIDMsICAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDh1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0xFRlQgICAgICAgICAgICAgPSAweDEwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHgyMHUsCisgICAgICAgICAgICAgICAgMCwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICA9IDB4NDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgPSAweDgwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIgICAgICAgICAgID0gMHgxMDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgICAgICAgICAgICAgPSAweDIwMHUsCisgICAgICAgICAgICAgICAgMSwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQgICAgICAgICAgICA9IDB4NDAwdSwKKyAgICAgICAgICAgICAgICAyLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUiAgICAgICAgICAgID0gMHg4MDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCAgICAgICAgPSAweDEwMDB1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfQ0VOVEVSICAgICAgPSAweDIwMDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgICAgICAgPSAweDQwMDB1LAorICAgICAgICAgICAgICAgIDAsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUICAgICAgICAgPSAweDgwMDB1LAorICAgICAgICAgICAgICAgIDIsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIgICAgICAgPSAweDEwMDAwdSwKKyAgICAgICAgICAgICAgICAxLCAgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQgICAgICAgID0gMHgyMDAwMHUsCisgICAgICAgICAgICAgICAgMCwgIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQgICAgICAgICA9IDB4NDAwMDB1LAorICAgICAgICAgICAgICAgIDEsICAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCAgICAgICAgPSAweDgwMDAwdQogICAgICAgICB9OwotICAgICAgICBpZiAocEluc3RhbmNlMS0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUiB8fAotICAgICAgICAgICAgcEluc3RhbmNlMi0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUikKLSAgICAgICAgewotICAgICAgICAgICAgVGFyZ2V0X2N0ci5UYXJnZXQgID0gMC4wZjsKKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIgfHwgcEluc3RhbmNlMi0+VGFyZ2V0IDw9IExWTV9WT0xfQkFMX1RIUikgeworICAgICAgICAgICAgVGFyZ2V0X2N0ci5UYXJnZXQgPSAwLjBmOwogICAgICAgICAgICAgVGFyZ2V0X2N0ci5DdXJyZW50ID0gMC4wZjsKLSAgICAgICAgICAgIFRhcmdldF9jdHIuRGVsdGEgICA9IDAuMGY7CisgICAgICAgICAgICBUYXJnZXRfY3RyLkRlbHRhID0gMC4wZjsKICAgICAgICAgfQogICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWR4QXJyU2l6ZSA9IEFSUkFZX1NJWkUobWl4SW5zdElkeCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBjaGFubmVsID0gQ2hNYXNrOyBjaGFubmVsICE9MCA7ICsraSkKLSAgICAgICAgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgY2hhbm5lbCA9IENoTWFzazsgY2hhbm5lbCAhPSAwOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpZHggPSBfX2J1aWx0aW5fY3R6KGNoYW5uZWwpOwotICAgICAgICAgICAgaWYgKGlkeCA8IGlkeEFyclNpemUpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWR4IDwgaWR4QXJyU2l6ZSkgewogICAgICAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFttaXhJbnN0SWR4W2lkeF1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjaGFubmVsICY9IH4oMSA8PCBpZHgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKSB7CiAgICAgICAgIC8vIFRPRE86IGNvbWJpbmUgc2ltaWxhciBjaGVja3MgYmVsb3cuCi0gICAgICAgIGlmIChwSW5zdGFuY2UxLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQKLSAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKLSAgICAgICAgeworICAgICAgICBpZiAocEluc3RhbmNlMS0+RGVsdGEgPT0gTFZNX01BWEZMT0FUIHx8CisgICAgICAgICAgICBBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkgewogICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsKICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZTItPkRlbHRhID09IExWTV9NQVhGTE9BVAotICAgICAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkgeworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZTItPkRlbHRhID09IExWTV9NQVhGTE9BVCB8fAorICAgICAgICAgICAgICAgIEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKSB7CiAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CiAgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKICAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEgKCZwSW5zdGFuY2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQSgmcEluc3RhbmNlWzBdLCBzcmMsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzQsMTkgKzE0OCwxMyBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nID09IFRSVUUpCi0gICAgewotICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgTnJGcmFtZXMqTnJDaGFubmVscyk7CisgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSkgeworICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKCYocEluc3RhbmNlWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCgmKHBJbnN0YW5jZVswXSksIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5NCwxNzIgKzE2MiwzNCBAQAogICAgICAgIENBTEwgQkFDSwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOwogICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQotICAgICAgICB7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9Ci0jZW5kaWYKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMS4wZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OwotICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OwotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwotICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBIQVJEIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoSGFyZE1peGluZykKLSAgICB7Ci0gICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IDEuMGYpICYmIChwSW5zdGFuY2UyLT5UYXJnZXQgPT0gMS4wZikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCi0gICAgewotICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAKaW5kZXggNGQyMjlkYS4uNWE2N2JkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcApAQCAtMTksNiArMTksNyBAQAogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCkBAIC0yNywzOSArMjgsMzUgQEAKICAgIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVk1peGVyM19NSVhTT0ZUXzFTVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+RGVsdGEgPT0gMS4wZikgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgIH0gZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZXsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCiAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CiAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwpAQCAtNzAsMzkgKzY3LDM3IEBACiAgICAgICAgSEFSRCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKEhhcmRNaXhpbmcpeworICAgIGlmIChIYXJkTWl4aW5nKSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQotICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIG4gKiBzaXplb2YoKmRzdCkpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCiAgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBuKTsKLSAgICAgICAgICAgIGVsc2UgaWYoc3JjICE9IGRzdCkKKyAgICAgICAgICAgIGVsc2UgaWYgKHNyYyAhPSBkc3QpCiAgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDQUxMIEJBQ0sKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOwogICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykoCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0xMjAsNDAgKzExNSwzMiBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBOckNoYW5uZWxzKQotewotICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwotICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpIHsKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwogCi0gICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgcmV0dXJuOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFNPRlQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwogICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgfSBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCiAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2NCwxNCArMTUxLDEzIEBACiAKICAgICBpZiAoSGFyZE1peGluZykgewogICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIE5yRnJhbWVzICogTnJDaGFubmVscyAqIHNpemVvZigqZHN0KSk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKICAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBlbHNlIGlmIChzcmMgIT0gZHN0KQogICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NiwxNSArMTcyLDEzIEBACiAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7CiAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKICAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApIHsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spIChcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spKAorICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLSNlbmRpZgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcAppbmRleCA1NGFiNzlkLi44ODJhOGNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwCkBAIC0yNSw0OSArMjUsMzkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKLXsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZTEgPQorICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0KikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UyID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKIAotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChuIDw9IDApIHJldHVybjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBTT0ZUIE1JWElORwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7Ci0gICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNleworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBuKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkgJiYgKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIG4pOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fAorICAgICAgICAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgbik7CisgICAgICAgIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4pOworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgSEFSRCBNSVhJTkcKICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CiAgICAgfQogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAogICoKQEAgLTg2LDQ4ICs3NiwzOCBAQAogICogIHZvaWQKICAqCiAgKi8KLXZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQotewotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UxID0KKyAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlMiA9CisgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CiAKLSAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworICAgIGlmIChOckZyYW1lcyA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7Ci0gICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgIH0KLSAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCi0gICAgewotICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOwotICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7Ci0gICAgfQotICAgIGVsc2V7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMyLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwKKyAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYzEsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9IGVsc2UgewogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgIEhBUkQgTUlYSU5HCiAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggY2U0MmQyZS4uMWViMmRlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTI1LDM0ICsyNSwzMSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIExWTWl4ZXIzX3N0IHN0cnVjdHVyZSBzdG9yZXMgSW5zdGFuY2UgcGFyYW1ldGVycyBmb3Igb25lIGF1ZGlvIHN0cmVhbSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSBzaGlmdCBwYXJhbWV0ZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tTZXQ7ICAgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgUHJpdmF0ZVBhcmFtc1szXTsgLyogUHJpdmF0ZSBJbnN0YW5jZSBwYXJhbXMgZm9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW8gU3RyZWFtIHNoaWZ0IHBhcmFtZXRlciAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1NldDsgICAgICAvKiBCb29sZWFuLiAgU2hvdWxkIGJlIHNldCBieSBjYWxsaW5nIGFwcGxpY2F0aW9uIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLworICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtOyAgICAvKiBQYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNhbGJhY2sgZnVuY3Rpb24gKi8KKyAgICB2b2lkKiBwQ2FsbGJhY2tIYW5kbGU7ICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgdm9pZCogcEdlbmVyYWxQdXJwb3NlOyAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLworICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAvKiBQb2ludGVyIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogfSBMVk1peGVyM19GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzFdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIG9uZSBBdWRpbyBTdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1peGVyM19GTE9BVF9zdCBNaXhlclN0cmVhbVsxXTsgLyogSW5zdGFuY2UgUGFyYW1zIGZvciBvbmUgQXVkaW8gU3RyZWFtICovCiB9IExWTWl4ZXIzXzFTdF9GTE9BVF9zdDsKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNaXhlcjNfRkxPQVRfc3QgTWl4ZXJTdHJlYW1bMl07IC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVMgKEhJR0ggTEVWRUwgRlVOQ1RJT05TKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZSB1bmlxdWUgd2l0aGluIGZpcnN0IDE2IGNoYXJhY3RlcnMgICovCi0jZGVmaW5lICAgIExWTWl4ZXIzX01peFNvZnRfMVN0X0QxNkMzMV9TQVQgICBMVk1peGVyM18xU3RfRDE2QzMxX1NBVF9NaXhTb2Z0Ci0jZGVmaW5lICAgIExWTWl4ZXIzX01peEluU29mdF9EMTZDMzFfU0FUICAgICBMVk1peGVyM19EMTZDMzFfU0FUX01peEluU29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfMlN0X0QxNkMzMV9TQVRfTWl4U29mdAotI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzNTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAorI2RlZmluZSBMVk1peGVyM19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUIExWTWl4ZXIzXzFTdF9EMTZDMzFfU0FUX01peFNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQgTFZNaXhlcjNfRDE2QzMxX1NBVF9NaXhJblNvZnQKKyNkZWZpbmUgTFZNaXhlcjNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCBMVk1peGVyM18yU3RfRDE2QzMxX1NBVF9NaXhTb2Z0CisjZGVmaW5lIExWTWl4ZXIzX01peFNvZnRfM1N0X0QxNkMzMV9TQVQgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAogCiAvKioqIEdlbmVyYWwgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNjIsODUgKzU5LDQ5IEBACiAvKiB0aGVuIHRoZSBjYWxjdWxhdGlvbiB3aWxsIGdpdmUgYW4gaW5jb3JyZWN0IHZhbHVlIGZvciBhbHBoYSwgc2VlIHRoZSBtaXhlciAgICAgKi8KIC8qIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgIFRhcmdldEdhaW4pOwotTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK3ZvaWQgTFZDX01peGVyX1NldFRhcmdldChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0ZMT0FUIFRhcmdldEdhaW4pOworTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pOwogCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKTsKK0xWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSk7CiAKLXZvaWQgTFZDX01peGVyX0luaXQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBUYXJnZXRHYWluLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50R2Fpbik7Cit2b2lkIExWQ19NaXhlcl9Jbml0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbiwgTFZNX0ZMT0FUIEN1cnJlbnRHYWluKTsKIAotdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7Cit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0sIExWTV9JTlQzMiBUY19taWxsaXNlYywgTFZNX0ZzX2VuIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOdW1DaGFubmVscyk7CiAKLXZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fSU5UMzIgVGNfbWlsbGlzZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuIEZzLCBMVk1fSU5UMTYgTnVtQ2hhbm5lbHMpOwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pOwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IE5yRnJhbWVzLCBMVk1fSU5UMTYgTnJDaGFubmVscyk7CiAKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRm9yIGFwcGx5aW5nIGRpZmZlcmVudCBnYWlucyB0byBMZWZ0IGFuZCByaWdodCBjaGVubmFscyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVswXSBhcHBsaWVzIHRvIExlZnQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE1peGVyU3RyZWFtWzFdIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBOckNoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKTsKLSNlbmRpZgotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIGRzdCwgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQzMiBOckNoYW5uZWxzLCBMVk1fSU5UMzIgQ2hNYXNrKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfSF9fCi0KKyNlbmRpZiAgLy8jaWZuZGVmIF9fTFZDX01JWEVSX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwCmluZGV4IGQwYjUwZTYuLjAzZGU4YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jcHAKQEAgLTMwLDEwICszMCw5IEBACiAvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQotewotICAgIExWTV9GTE9BVCAgICAgICBDdXJyZW50R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pIHsKKyAgICBMVk1fRkxPQVQgQ3VycmVudEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKICAgICBDdXJyZW50R2FpbiA9IHBJbnN0YW5jZS0+Q3VycmVudDsgIC8vIEN1cnJlbnRHYWluCiAgICAgcmV0dXJuIEN1cnJlbnRHYWluOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmNwcAppbmRleCAzYWU1YmE0Li4yMWViYWMxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAKQEAgLTMwLDEwICszMCw5IEBACiAvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QqIHBTdHJlYW0pIHsKKyAgICBMVk1fRkxPQVQgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCogcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0KilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwogCiAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgogICAgIHJldHVybiBUYXJnZXRHYWluOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwCmluZGV4IGM5ZmQzNDQuLmUzN2Y2MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jcHAKQEAgLTQ0LDE0ICs0NCwxMCBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKQotewordm9pZCBMVkNfTWl4ZXJfSW5pdChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0ZMT0FUIFRhcmdldEdhaW4sIExWTV9GTE9BVCBDdXJyZW50R2FpbikgewogICAgIExWTV9GTE9BVCBNYXhHYWluID0gVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICBpZihDdXJyZW50R2FpbiA+IE1heEdhaW4pCi0gICAgICAgIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKLSAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50R2FpbjsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZiAoQ3VycmVudEdhaW4gPiBNYXhHYWluKSBNYXhHYWluID0gQ3VycmVudEdhaW47CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnRHYWluOyAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCAxMjNkMjJiLi45MjA2ZmFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTI2LDU0ICsyNiwzNiBAQAogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIAogLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ7ICAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIFRhcmdldCBHYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAvKm51bWJlciBzcGVjaWZ5aW5nIHZhbHVlIG9mIEN1cnJlbnQgR2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCisgICAgTFZNX0ZMT0FUIFRhcmdldDsgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgVGFyZ2V0IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgQ3VycmVudDsgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBDdXJyZW50IEdhaW4gKi8KKyAgICBMVk1fRkxPQVQgRGVsdGE7ICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBEZWx0YSBHYWluICovCiB9IE1peF9Qcml2YXRlX0ZMT0FUX3N0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMVkNvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQgICAgTFZDb3JlX0luU29mdF9EMzJDMzFfU0FUCi0jZGVmaW5lIExWQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBICBMVkNvcmVfU29mdF8xU3RfRDMyQzMxX1dSQQotI2RlZmluZSBMVkNvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCAgTFZDb3JlX0hhcmRfMlN0X0QzMkMzMV9TQVQKKyNkZWZpbmUgTFZDb3JlX01peEluU29mdF9EMzJDMzFfU0FUIExWQ29yZV9JblNvZnRfRDMyQzMxX1NBVAorI2RlZmluZSBMVkNvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSBMVkNvcmVfU29mdF8xU3RfRDMyQzMxX1dSQQorI2RlZmluZSBMVkNvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCBMVkNvcmVfSGFyZF8yU3RfRDMyQzMxX1NBVAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotI2lmZGVmIFNVUFBPUlRfTUMKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwSW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwdHJJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbik7Cit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0KiBwSW5zdGFuY2UxLCBMVk1peGVyM19GTE9BVF9zdCogcEluc3RhbmNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHNyYzEsIGNvbnN0IExWTV9GTE9BVCogc3JjMiwgTFZNX0ZMT0FUKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODEsMTggKzYzLDggQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKLXZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBKE1peF9Qcml2YXRlX0ZMT0FUX3N0KiogcHRySW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBOckZyYW1lcywgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAwLDIxICs3Miw3IEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCi12b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7Cit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVChNaXhfUHJpdmF0ZV9GTE9BVF9zdCoqIHB0ckluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgTnJGcmFtZXMsIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKIAotLyoqKiAzMiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwotCisjZW5kaWYgIC8vI2lmbmRlZiBfX0xWQ19NSVhFUl9QUklWQVRFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAppbmRleCA0N2IwY2VjLi5kODAxNWM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcApAQCAtNDMsOSArNDMsNyBAQAogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIFRhcmdldEdhaW4pCi17Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBnYWluIFRhcmdldAordm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX0ZMT0FUX3N0KiBwU3RyZWFtLCBMVk1fRkxPQVQgVGFyZ2V0R2FpbikgeworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgcEluc3RhbmNlLT5UYXJnZXQgPSBUYXJnZXRHYWluOyAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCmluZGV4IDFhOGRhN2EuLjcxNWI5MDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCkBAIC00NCwzNiArNDQsMzMgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKLXsKLSAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0MTY2N2YsLyo5NjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLCBMVk1fRnNfZW4gRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY3ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KIAotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0KiBwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CiAgICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107CiAgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKLSAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgIGlmIChUY19taWxsaXNlYyA9PSAwKQogICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKICAgICBlbHNlCiAgICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKIAotICAgIGlmKERlbHRhID09IDApCi0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KKyAgICBpZiAoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAvKiBJZiBUaW1lIENvbnN0YW50IGlzIHNvIGxhcmdlIHRoYXQgRGVsdGEgaXMgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KICAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAppbmRleCBmMzM1YTFlLi5jZjg0NjEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcApAQCAtNDQsNTcgKzQ0LDUwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQotewotICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KK3ZvaWQgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudChMVk1peGVyM19GTE9BVF9zdCogcFN0cmVhbSwgTFZNX0lOVDMyIFRjX21pbGxpc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiBGcywgTFZNX0lOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX0ZMT0FUIERlbHRhVGFibGVbMTNdID0gezAuNTAwMDAwZiwgIC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwgIC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsICAvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLCAgLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwgIC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsICAvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLCAgLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwgIC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsICAvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDUzNTJmLCAgLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwgIC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsICAvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07IC8qMTkyMDAwKi8KICAgICBMVk1fRkxPQVQgVGNfbWlsbGlzZWNfZmxvYXQ7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QqIHBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKICAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKIAotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0OworICAgIExWTV9GTE9BVCBDdXJyZW50OworICAgIExWTV9GTE9BVCBUYXJnZXQ7CiAKLSAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7CisgICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7CiAKICAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLwogICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CiAgICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CiAKLSAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCi0gICAgeworICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkgewogICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKLSAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKLSAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OworICAgICAgICBpZiAoVGNfbWlsbGlzZWNfZmxvYXQgPCAwKSBUY19taWxsaXNlY19mbG9hdCA9IC1UY19taWxsaXNlY19mbG9hdDsKIAotICAgICAgICBpZihUY19taWxsaXNlYyA9PSAwKQorICAgICAgICBpZiAoVGNfbWlsbGlzZWMgPT0gMCkKICAgICAgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBEZWx0YSA9IERlbHRhIC8gVGNfbWlsbGlzZWNfZmxvYXQ7CiAKLSAgICAgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgaWYgKERlbHRhID09IDApCiAgICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLworICAgIH0gZWxzZSB7CisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgLyogTWluaW11bSB2YWx1ZSBmb3IgcHJvcGVyIGNhbGwtYmFja3MgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXR0aW5nIGl0IHRvIHplcm8gaGFzIHNvbWUgcHJvYmxlbXMsIHRvIGJlIGNvcnJlY3RlZCkgKi8KICAgICB9CiAKLSAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAgICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQorICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCmluZGV4IDI0OTdkMjkuLjU5MDk1ZGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCkBAIC02NywzMSArNjcsMTkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fSFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ci0gICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworTFZNX0ZMT0FUIExWTV9GT19IUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwgQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLCAwLjk5OTgwMWYsICAtMC40OTc4MjRmLCAwLjMyMjkzN2YsICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwgIC0wLjAzMjEwMmYsIDAuMDA4MTYzZiwgIC0wLjAwMTI1MmYsIDAuMDAwMDg5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgICAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKIAotICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KLSAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLwotICAgIFkgPSBZIC0gMC41ZjsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisgICAgcENvZWZmcy0+QjEgPSAtWTsgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZID0gWSAvIDIuMGY7ICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFkgPSBZIC0gMC41ZjsgICAgIC8qIEEwPVk9KEIxLzIgLSAwLjUpKi8KIAotICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOyAgICAgICAgICAgICAgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLwotICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0b3JlIEExPS1BMCovCisgICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7IC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLworICAgIHBDb2VmZnMtPkExID0gLXBDb2VmZnMtPkEwOyAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLwogCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCmluZGV4IDdiYzYwNDYuLjkxOTY0ZmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCkBAIC02NywyNSArNjcsMTUgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLUxWTV9GTE9BVCBMVk1fRk9fTFBGKCAgIExWTV9GTE9BVCAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXSA9IHstMC45OTk5OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4MDFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNDk3ODI0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzIyOTM3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjE4MDg4MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4NzY1OGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMzIxMDJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDgxNjNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMjUyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDg5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKLSAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41Ci0gICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKLSAgICBZID0gWSArIDAuNWY7ICAgICAvLyBBMD1ZPShCMS8yICsgMC41KQorTFZNX0ZMT0FUIExWTV9GT19MUEYoTFZNX0ZMT0FUIHcsIEZPX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZnMpIHsKKyAgICBMVk1fRkxPQVQgWSwKKyAgICAgICAgICAgIENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwgMC45OTk4MDFmLCAtMC40OTc4MjRmLCAwLjMyMjkzN2YsIC0wLjE4MDg4MGYsIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwgMC4wMDgxNjNmLCAtMC4wMDEyNTJmLCAwLjAwMDA4OWYsIDB9OworICAgIFkgPSBMVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAvLyBBMD0oMStCMSkvMj0gQjEvMiArIDAuNQorICAgIFkgPSBZIC8gMi4wZjsgICAgICAvLyBBMD1ZPUIxLzIKKyAgICBZID0gWSArIDAuNWY7ICAgICAgLy8gQTA9WT0oQjEvMiArIDAuNSkKIAogICAgIHBDb2VmZnMtPkEwID0gWSAqIEZJTFRFUl9MT1NTX0ZMT0FUOwogICAgIHBDb2VmZnMtPkExID0gcENvZWZmcy0+QTA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmNwcAppbmRleCAyYTdjY2EyLi41ZjI1Njc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jcHAKQEAgLTI1LDQxICsyNSwzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAgICAgICAgMTcyNzEwODgyNiAgLyogSW4gUTQxIGZvcm1hdCAqLwotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNSAgICAgICAxMjUzMjMwODk0ICAvKiBJbiBRNDEgZm9ybWF0ICovCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwICAgICAgIDExNTE0MDU4ODQgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMCAxNzI3MTA4ODI2ICAvKiBJbiBRNDEgZm9ybWF0ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1IDEyNTMyMzA4OTQgLyogSW4gUTQxIGZvcm1hdCAqLworI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMCAxMTUxNDA1ODg0IC8qIEluIFE0MSBmb3JtYXQgKi8KIAotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAgICAxMiAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KLSNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgICAgMTMgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAgICAxNCAgICAgICAgICAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLwotI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgICAgICAgIDAuMDAwNzg1Mzk4ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMTAyNV9mICAgICAgIDAuMDAwNTY5OTAzZgotI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMF9mICAgICAgIDAuMDAwNTIzNTk5ZgotI2RlZmluZSBMVlZETF8yUGlCeV8xNjAwMF9mICAgICAgIDAuMDAwMzkyNzAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8yMjA1MF9mICAgICAgIDAuMDAwMjg0OTUyZgotI2RlZmluZSBMVlZETF8yUGlCeV8yNDAwMF9mICAgICAgIDAuMDAwMjYxODAwZgotI2RlZmluZSBMVlZETF8yUGlCeV8zMjAwMF9mICAgICAgIDAuMDAwMTk2MzUwZgotI2RlZmluZSBMVlZETF8yUGlCeV80NDEwMF9mICAgICAgIDAuMDAwMTQyNDc2ZgotI2RlZmluZSBMVlZETF8yUGlCeV80ODAwMF9mICAgICAgIDAuMDAwMTMwOTAwZgorI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMSAxMiAvKiBRZm9ybWF0IHNoaWZ0IGZvciA4a0h6LCAxMS4wMjVrSHogYW5kIDEya0h6IGkuZS4gMTI9NDEtMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDIgMTMgLyogUWZvcm1hdCBzaGlmdCBmb3IgMTZrSHosIDIyLjA1MGtIeiBhbmQgMjRrSHogaS5lLiAxMz00Mi0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeUZzX1NISUZUMyAxNCAvKiBRZm9ybWF0IHNoaWZ0IGZvciAzMmtIeiwgNDQuMWtIeiBhbmQgNDhrSHogaS5lLiAxND00My0yOSAqLworI2RlZmluZSBMVlZETF8yUGlCeV84MDAwX2YgMC4wMDA3ODUzOThmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgMC4wMDA1Njk5MDNmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgMC4wMDA1MjM1OTlmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgMC4wMDAzOTI3MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgMC4wMDAyODQ5NTJmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgMC4wMDAyNjE4MDBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgMC4wMDAxOTYzNTBmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgMC4wMDAxNDI0NzZmCisjZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgMC4wMDAxMzA5MDBmCiAKLSNkZWZpbmUgTFZWRExfMlBpQnlfODgyMDBfZiAgICAgICAwLjAwMDA3MTIzOGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTc2NDAwX2YgICAgICAwLjAwMDAzNTYxOWYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzExMDI1X2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTYwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8yNDAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMzIwMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80ODAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV84ODIwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV85NjAwMF9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xNzY0MDBfZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTkyMDAwX2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworI2RlZmluZSBMVlZETF8yUGlCeV84ODIwMF9mIDAuMDAwMDcxMjM4ZgorI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNzY0MDBfZiAwLjAwMDAzNTYxOWYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgMC4wMDAwMzI3MjVmCitjb25zdCBMVk1fRkxPQVQgTFZWRExfMlBpT25Gc1RhYmxlW10gPSB7CisgICAgICAgIExWVkRMXzJQaUJ5XzgwMDBfZiwgIExWVkRMXzJQaUJ5XzExMDI1X2YsIExWVkRMXzJQaUJ5XzEyMDAwX2YsIExWVkRMXzJQaUJ5XzE2MDAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzIyMDUwX2YsIExWVkRMXzJQaUJ5XzI0MDAwX2YsIExWVkRMXzJQaUJ5XzMyMDAwX2YsIExWVkRMXzJQaUJ5XzQ0MTAwX2YsCisgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YsIExWVkRMXzJQaUJ5Xzg4MjAwX2YsIExWVkRMXzJQaUJ5Xzk2MDAwX2YsIExWVkRMXzJQaUJ5XzE3NjQwMF9mLAorICAgICAgICBMVlZETF8yUGlCeV8xOTIwMDBfZn07CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NywxMCArNjgsOCBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgdz0yKnBpKkZjL0ZzIGluIFEyLjI5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKLXsKLSAgICBMVk1fRkxPQVQgICB3OworTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyIEZjLCBMVk1fRnNfZW4gRnMpIHsKKyAgICBMVk1fRkxPQVQgdzsKICAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107CiAgICAgcmV0dXJuIHc7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKaW5kZXggMjQ0ZjA5ZC4uMzFkY2FhNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtMzMsMTA5ICszMywxMDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIDUwICAgICAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCi0jZGVmaW5lIEFMUEhBXzAgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDgwNzY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLwotI2RlZmluZSBBTFBIQV8xICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3OTU3NyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KLSNkZWZpbmUgQUxQSEFfMiAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Nzc4OTIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCi0jZGVmaW5lIEFMUEhBXzMgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDc1NTEwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLwotI2RlZmluZSBBTFBIQV80ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ3MjE0MSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KLSNkZWZpbmUgQUxQSEFfNSAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0NjczNzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCi0jZGVmaW5lIEFMUEhBXzYgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDYwNjQyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLwotI2RlZmluZSBBTFBIQV83ICAgICAgICAgICAgICAgICAgICAgICAgMjE0NzQ1MTExOCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KLSNkZWZpbmUgQUxQSEFfOCAgICAgICAgICAgICAgICAgICAgICAgIDIxNDc0Mzc2NTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCi0jZGVmaW5lIEFMUEhBXzkgICAgICAgICAgICAgICAgICAgICAgICAyMTQ3NDE4NjA4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLwotI2RlZmluZSBBTFBIQV8xMCAgICAgICAgICAgICAgICAgICAgICAgMjE0NzM5MTY4MyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KLSNkZWZpbmUgQUxQSEFfMTEgICAgICAgICAgICAgICAgICAgICAgIDIxNDczNTM2MTEgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCi0jZGVmaW5lIEFMUEhBXzEyICAgICAgICAgICAgICAgICAgICAgICAyMTQ3Mjk5Nzc5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLwotI2RlZmluZSBBTFBIQV8xMyAgICAgICAgICAgICAgICAgICAgICAgMjE0NzIyMzY2MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KLSNkZWZpbmUgQUxQSEFfMTQgICAgICAgICAgICAgICAgICAgICAgIDIxNDcxMTYwMzcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCi0jZGVmaW5lIEFMUEhBXzE1ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2OTYzODY1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLwotI2RlZmluZSBBTFBIQV8xNiAgICAgICAgICAgICAgICAgICAgICAgMjE0Njc0ODcxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KLSNkZWZpbmUgQUxQSEFfMTcgICAgICAgICAgICAgICAgICAgICAgIDIxNDY0NDQ1MjIgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCi0jZGVmaW5lIEFMUEhBXzE4ICAgICAgICAgICAgICAgICAgICAgICAyMTQ2MDE0NDcyICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLwotI2RlZmluZSBBTFBIQV8xOSAgICAgICAgICAgICAgICAgICAgICAgMjE0NTQwNjUyNyAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KLSNkZWZpbmUgQUxQSEFfMjAgICAgICAgICAgICAgICAgICAgICAgIDIxNDQ1NDcxODggICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCi0jZGVmaW5lIEFMUEhBXzIxICAgICAgICAgICAgICAgICAgICAgICAyMTQzMzMyNjY5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLwotI2RlZmluZSBBTFBIQV8yMiAgICAgICAgICAgICAgICAgICAgICAgMjE0MTYxNjUxNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KLSNkZWZpbmUgQUxQSEFfMjMgICAgICAgICAgICAgICAgICAgICAgIDIxMzkxOTIyMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCi0jZGVmaW5lIEFMUEhBXzI0ICAgICAgICAgICAgICAgICAgICAgICAyMTM1NzY4OTM5ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLwotI2RlZmluZSBBTFBIQV8yNSAgICAgICAgICAgICAgICAgICAgICAgMjEzMDkzNzc3NCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KLSNkZWZpbmUgQUxQSEFfMjYgICAgICAgICAgICAgICAgICAgICAgIDIxMjQxMjUxNTMgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCi0jZGVmaW5lIEFMUEhBXzI3ICAgICAgICAgICAgICAgICAgICAgICAyMTE0NTI5MjYzICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLwotI2RlZmluZSBBTFBIQV8yOCAgICAgICAgICAgICAgICAgICAgICAgMjEwMTAzNDYxMiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KLSNkZWZpbmUgQUxQSEFfMjkgICAgICAgICAgICAgICAgICAgICAgIDIwODIxMDAwMzAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCi0jZGVmaW5lIEFMUEhBXzMwICAgICAgICAgICAgICAgICAgICAgICAyMDU1NjE3Mzk4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLwotI2RlZmluZSBBTFBIQV8zMSAgICAgICAgICAgICAgICAgICAgICAgMjAxODc0NDgyNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KLSNkZWZpbmUgQUxQSEFfMzIgICAgICAgICAgICAgICAgICAgICAgIDE5Njc3MzMwMTUgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCi0jZGVmaW5lIEFMUEhBXzMzICAgICAgICAgICAgICAgICAgICAgICAxODk3Nzk0NTg3ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLwotI2RlZmluZSBBTFBIQV8zNCAgICAgICAgICAgICAgICAgICAgICAgMTgwMzEyMzIzNCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KLSNkZWZpbmUgQUxQSEFfMzUgICAgICAgICAgICAgICAgICAgICAgIDE2NzcyNjIyMjAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCi0jZGVmaW5lIEFMUEhBXzM2ICAgICAgICAgICAgICAgICAgICAgICAxNTE0MTQyNjc1ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLwotI2RlZmluZSBBTFBIQV8zNyAgICAgICAgICAgICAgICAgICAgICAgMTMxMDE5Nzg3NSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KLSNkZWZpbmUgQUxQSEFfMzggICAgICAgICAgICAgICAgICAgICAgIDEwNjc4MTM0ODAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCi0jZGVmaW5lIEFMUEhBXzM5ICAgICAgICAgICAgICAgICAgICAgICAgNzk5NjAxMzcxICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLwotI2RlZmluZSBBTFBIQV80MCAgICAgICAgICAgICAgICAgICAgICAgIDUzMTE4MzA0OSAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KLSNkZWZpbmUgQUxQSEFfNDEgICAgICAgICAgICAgICAgICAgICAgICAyOTc5MDQwMDcgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCi0jZGVmaW5lIEFMUEhBXzQyICAgICAgICAgICAgICAgICAgICAgICAgMTMxNDk5NzY4ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLwotI2RlZmluZSBBTFBIQV80MyAgICAgICAgICAgICAgICAgICAgICAgICA0MTM3NTI4MiAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KLSNkZWZpbmUgQUxQSEFfNDQgICAgICAgICAgICAgICAgICAgICAgICAgIDgwNjU4OTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCi0jZGVmaW5lIEFMUEhBXzQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgNzk5MDc2ICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLwotI2RlZmluZSBBTFBIQV80NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KLSNkZWZpbmUgQUxQSEFfNDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTkgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCi0jZGVmaW5lIEFMUEhBXzQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwotI2RlZmluZSBBTFBIQV80OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KLSNkZWZpbmUgQUxQSEFfNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFscGhhX1RhYmxlU2l6ZSA1MCAgLyogVGhlIG51bWJlciBvZiB0YWJsZSBlbnRpcmVzICovCisjZGVmaW5lIEFMUEhBXzAgMjE0NzQ4MDc2OSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5OSAqLworI2RlZmluZSBBTFBIQV8xIDIxNDc0Nzk1NzcgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTggKi8KKyNkZWZpbmUgQUxQSEFfMiAyMTQ3NDc3ODkyICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTk3ICovCisjZGVmaW5lIEFMUEhBXzMgMjE0NzQ3NTUxMCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk5NiAqLworI2RlZmluZSBBTFBIQV80IDIxNDc0NzIxNDEgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5OTUgKi8KKyNkZWZpbmUgQUxQSEFfNSAyMTQ3NDY3Mzc3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTkyICovCisjZGVmaW5lIEFMUEhBXzYgMjE0NzQ2MDY0MiAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk4OSAqLworI2RlZmluZSBBTFBIQV83IDIxNDc0NTExMTggIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5ODUgKi8KKyNkZWZpbmUgQUxQSEFfOCAyMTQ3NDM3NjUxICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTc5ICovCisjZGVmaW5lIEFMUEhBXzkgMjE0NzQxODYwOCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTk3MCAqLworI2RlZmluZSBBTFBIQV8xMCAyMTQ3MzkxNjgzIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk5NTcgKi8KKyNkZWZpbmUgQUxQSEFfMTEgMjE0NzM1MzYxMSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5OTM5ICovCisjZGVmaW5lIEFMUEhBXzEyIDIxNDcyOTk3NzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTkxNCAqLworI2RlZmluZSBBTFBIQV8xMyAyMTQ3MjIzNjYyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk4NzkgKi8KKyNkZWZpbmUgQUxQSEFfMTQgMjE0NzExNjAzNyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5ODI5ICovCisjZGVmaW5lIEFMUEhBXzE1IDIxNDY5NjM4NjUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTc1OCAqLworI2RlZmluZSBBTFBIQV8xNiAyMTQ2NzQ4NzEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTk2NTggKi8KKyNkZWZpbmUgQUxQSEFfMTcgMjE0NjQ0NDUyMiAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk5NTE2ICovCisjZGVmaW5lIEFMUEhBXzE4IDIxNDYwMTQ0NzIgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5OTMxNiAqLworI2RlZmluZSBBTFBIQV8xOSAyMTQ1NDA2NTI3IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTkwMzMgKi8KKyNkZWZpbmUgQUxQSEFfMjAgMjE0NDU0NzE4OCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk4NjMzICovCisjZGVmaW5lIEFMUEhBXzIxIDIxNDMzMzI2NjkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5ODA2NyAqLworI2RlZmluZSBBTFBIQV8yMiAyMTQxNjE2NTE0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTcyNjggKi8KKyNkZWZpbmUgQUxQSEFfMjMgMjEzOTE5MjIxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTk2MTM5ICovCisjZGVmaW5lIEFMUEhBXzI0IDIxMzU3Njg5MzkgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk5NDU0NSAqLworI2RlZmluZSBBTFBIQV8yNSAyMTMwOTM3Nzc0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45OTIyOTUgKi8KKyNkZWZpbmUgQUxQSEFfMjYgMjEyNDEyNTE1MyAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTg5MTIzICovCisjZGVmaW5lIEFMUEhBXzI3IDIxMTQ1MjkyNjMgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk4NDY1NCAqLworI2RlZmluZSBBTFBIQV8yOCAyMTAxMDM0NjEyIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NzgzNzAgKi8KKyNkZWZpbmUgQUxQSEFfMjkgMjA4MjEwMDAzMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTY5NTUzICovCisjZGVmaW5lIEFMUEhBXzMwIDIwNTU2MTczOTggLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjk1NzIyMSAqLworI2RlZmluZSBBTFBIQV8zMSAyMDE4NzQ0ODI0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC45NDAwNTEgKi8KKyNkZWZpbmUgQUxQSEFfMzIgMTk2NzczMzAxNSAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuOTE2Mjk3ICovCisjZGVmaW5lIEFMUEhBXzMzIDE4OTc3OTQ1ODcgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjg4MzcyOSAqLworI2RlZmluZSBBTFBIQV8zNCAxODAzMTIzMjM0IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC44Mzk2NDUgKi8KKyNkZWZpbmUgQUxQSEFfMzUgMTY3NzI2MjIyMCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNzgxMDM2ICovCisjZGVmaW5lIEFMUEhBXzM2IDE1MTQxNDI2NzUgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjcwNTA3OCAqLworI2RlZmluZSBBTFBIQV8zNyAxMzEwMTk3ODc1IC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC42MTAxMDggKi8KKyNkZWZpbmUgQUxQSEFfMzggMTA2NzgxMzQ4MCAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuNDk3MjM5ICovCisjZGVmaW5lIEFMUEhBXzM5IDc5OTYwMTM3MSAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjM3MjM0MyAqLworI2RlZmluZSBBTFBIQV80MCA1MzExODMwNDkgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4yNDczNTEgKi8KKyNkZWZpbmUgQUxQSEFfNDEgMjk3OTA0MDA3ICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMTM4NzIyICovCisjZGVmaW5lIEFMUEhBXzQyIDEzMTQ5OTc2OCAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjA2MTIzNCAqLworI2RlZmluZSBBTFBIQV80MyA0MTM3NTI4MiAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMTkyNjcgKi8KKyNkZWZpbmUgQUxQSEFfNDQgODA2NTg5OSAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAzNzU2ICovCisjZGVmaW5lIEFMUEhBXzQ1IDc5OTA3NiAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDM3MiAqLworI2RlZmluZSBBTFBIQV80NiAzMDM5OCAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMTQgKi8KKyNkZWZpbmUgQUxQSEFfNDcgMjk5ICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCisjZGVmaW5lIEFMUEhBXzQ4IDAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLworI2RlZmluZSBBTFBIQV80OSAwICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IEFscGhhID0gMC4wMDAwMDAgKi8KKyNkZWZpbmUgQUxQSEFfNTAgMCAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMyAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5MmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNiAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTg5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF83ICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5ODVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzggICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk3OWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfOSAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTcwZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMCAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5NTdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzExICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTkzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTE0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xMyAgICAgICAgICAgICAgICAgICAgICAgMC45OTk4NzlmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE0ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgyOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTUgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5NzU4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xNiAgICAgICAgICAgICAgICAgICAgICAgMC45OTk2NThmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzE3ICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTUxNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMTggICAgICAgICAgICAgICAgICAgICAgIDAuOTk5MzE2ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8xOSAgICAgICAgICAgICAgICAgICAgICAgMC45OTkwMzNmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIwICAgICAgICAgICAgICAgICAgICAgICAwLjk5ODYzM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjEgICAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDY3ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTcyNjhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzIzICAgICAgICAgICAgICAgICAgICAgICAwLjk5NjEzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjQgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0NTQ1ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yNSAgICAgICAgICAgICAgICAgICAgICAgMC45OTIyOTVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI2ICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTEyM2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMjcgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NjU0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8yOCAgICAgICAgICAgICAgICAgICAgICAgMC45NzgzNzBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzI5ICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTU1M2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzAgICAgICAgICAgICAgICAgICAgICAgIDAuOTU3MjIxZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zMSAgICAgICAgICAgICAgICAgICAgICAgMC45NDAwNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzMyICAgICAgICAgICAgICAgICAgICAgICAwLjkxNjI5N2YKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzMgICAgICAgICAgICAgICAgICAgICAgIDAuODgzNzI5ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNCAgICAgICAgICAgICAgICAgICAgICAgMC44Mzk2NDVmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM1ICAgICAgICAgICAgICAgICAgICAgICAwLjc4MTAzNmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzYgICAgICAgICAgICAgICAgICAgICAgIDAuNzA1MDc4ZgotI2RlZmluZSBBTFBIQV9GbG9hdF8zNyAgICAgICAgICAgICAgICAgICAgICAgMC42MTAxMDhmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzM4ICAgICAgICAgICAgICAgICAgICAgICAwLjQ5NzIzOWYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfMzkgICAgICAgICAgICAgICAgICAgICAgIDAuMzcyMzQzZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MCAgICAgICAgICAgICAgICAgICAgICAgMC4yNDczNTFmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQxICAgICAgICAgICAgICAgICAgICAgICAwLjEzODcyMmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDIgICAgICAgICAgICAgICAgICAgICAgIDAuMDYxMjM0ZgotI2RlZmluZSBBTFBIQV9GbG9hdF80MyAgICAgICAgICAgICAgICAgICAgICAgMC4wMTkyNjdmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMzc1NmYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDUgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzcyZgotI2RlZmluZSBBTFBIQV9GbG9hdF80NiAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMTRmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQUxQSEFfRmxvYXRfNDggICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBBTFBIQV9GbG9hdF80OSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIEFMUEhBX0Zsb2F0XzUwICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMCAwLjk5OTk5OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMSAwLjk5OTk5OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMiAwLjk5OTk5N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMyAwLjk5OTk5NmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNCAwLjk5OTk5NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNSAwLjk5OTk5MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNiAwLjk5OTk4OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNyAwLjk5OTk4NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOCAwLjk5OTk3OWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfOSAwLjk5OTk3MGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTAgMC45OTk5NTdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzExIDAuOTk5OTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xMiAwLjk5OTkxNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTMgMC45OTk4NzlmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE0IDAuOTk5ODI5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xNSAwLjk5OTc1OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTYgMC45OTk2NThmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzE3IDAuOTk5NTE2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8xOCAwLjk5OTMxNmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMTkgMC45OTkwMzNmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIwIDAuOTk4NjMzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yMSAwLjk5ODA2N2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjIgMC45OTcyNjhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzIzIDAuOTk2MTM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNCAwLjk5NDU0NWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjUgMC45OTIyOTVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI2IDAuOTg5MTIzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8yNyAwLjk4NDY1NGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMjggMC45NzgzNzBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzI5IDAuOTY5NTUzZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMCAwLjk1NzIyMWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzEgMC45NDAwNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzMyIDAuOTE2Mjk3ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zMyAwLjg4MzcyOWYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzQgMC44Mzk2NDVmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM1IDAuNzgxMDM2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zNiAwLjcwNTA3OGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfMzcgMC42MTAxMDhmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzM4IDAuNDk3MjM5ZgorI2RlZmluZSBBTFBIQV9GbG9hdF8zOSAwLjM3MjM0M2YKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDAgMC4yNDczNTFmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQxIDAuMTM4NzIyZgorI2RlZmluZSBBTFBIQV9GbG9hdF80MiAwLjA2MTIzNGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDMgMC4wMTkyNjdmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ0IDAuMDAzNzU2ZgorI2RlZmluZSBBTFBIQV9GbG9hdF80NSAwLjAwMDM3MmYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDYgMC4wMDAwMTRmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ3IDAuMDAwMDAwZgorI2RlZmluZSBBTFBIQV9GbG9hdF80OCAwLjAwMDAwMGYKKyNkZWZpbmUgQUxQSEFfRmxvYXRfNDkgMC4wMDAwMDBmCisjZGVmaW5lIEFMUEhBX0Zsb2F0XzUwIDAuMDAwMDAwZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKaW5kZXggNzNkYTJjZi4uM2VjMTAzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jcHAKQEAgLTU2LDgzICs1NiwzNyBAQAogLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICBQcm9kdWN0OwotICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OwotICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7Ci0gICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7Ci0gICAgTFZNX1VJTlQxNiAgU2hpZnQ7Ci0gICAgTFZNX0ZMT0FUICAgRGlmZjsKLSAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CitMVk1fRkxPQVQgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyIHRjLCBMVk1fVUlOVDMyIEZzLCBMVk1fVUlOVDE2IE51bUNoYW5uZWxzKSB7CisgICAgTFZNX1VJTlQzMiBQcm9kdWN0OworICAgIExWTV9GTE9BVCBQcm9kdWN0RmxvYXQ7CisgICAgTFZNX0lOVDE2IEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUIEludGVycG9sYXRlOworICAgIExWTV9VSU5UMTYgU2hpZnQ7CisgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgTFZNX0ZMT0FUIFRhYmxlW10gPSB7CisgICAgICAgICAgICBBTFBIQV9GbG9hdF8wLCAvKiBMb2cgc3BhY2VkIGxvb2stdXAgdGFibGUgKi8KKyAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsICBBTFBIQV9GbG9hdF8yLCAgQUxQSEFfRmxvYXRfMywgIEFMUEhBX0Zsb2F0XzQsICBBTFBIQV9GbG9hdF81LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNiwgIEFMUEhBX0Zsb2F0XzcsICBBTFBIQV9GbG9hdF84LCAgQUxQSEFfRmxvYXRfOSwgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTEsIEFMUEhBX0Zsb2F0XzEyLCBBTFBIQV9GbG9hdF8xMywgQUxQSEFfRmxvYXRfMTQsIEFMUEhBX0Zsb2F0XzE1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTYsIEFMUEhBX0Zsb2F0XzE3LCBBTFBIQV9GbG9hdF8xOCwgQUxQSEFfRmxvYXRfMTksIEFMUEhBX0Zsb2F0XzIwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsIEFMUEhBX0Zsb2F0XzIyLCBBTFBIQV9GbG9hdF8yMywgQUxQSEFfRmxvYXRfMjQsIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjYsIEFMUEhBX0Zsb2F0XzI3LCBBTFBIQV9GbG9hdF8yOCwgQUxQSEFfRmxvYXRfMjksIEFMUEhBX0Zsb2F0XzMwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzEsIEFMUEhBX0Zsb2F0XzMyLCBBTFBIQV9GbG9hdF8zMywgQUxQSEFfRmxvYXRfMzQsIEFMUEhBX0Zsb2F0XzM1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsIEFMUEhBX0Zsb2F0XzM3LCBBTFBIQV9GbG9hdF8zOCwgQUxQSEFfRmxvYXRfMzksIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDEsIEFMUEhBX0Zsb2F0XzQyLCBBTFBIQV9GbG9hdF80MywgQUxQSEFfRmxvYXRfNDQsIEFMUEhBX0Zsb2F0XzQ1LAorICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDYsIEFMUEhBX0Zsb2F0XzQ3LCBBTFBIQV9GbG9hdF80OCwgQUxQSEFfRmxvYXRfNDksIEFMUEhBX0Zsb2F0XzUwfTsKIAogICAgIC8qIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiB0aGUgdGltZSBjb25zdGFudCBhbmQgdGhlIHNhbXBsZSByYXRlICovCi0gICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAgLyogU3RlcmVvIHZhbHVlICovCisgICAgUHJvZHVjdCA9ICgodGMgPj4gMTYpICogKExWTV9VSU5UMzIpRnMpIDw8IDEzOyAvKiBTdGVyZW8gdmFsdWUgKi8KICAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7CiAKLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7IC8qIE1vbm8gdmFsdWUgKi8KICAgICB9CiAKICAgICAvKiBOb3JtYWxpemUgdG8gZ2V0IHRoZSB0YWJsZSBpbmRleCBhbmQgaW50ZXJwb2xhdGlvbiBmYWN0b3IgKi8KLSAgICBmb3IgKFNoaWZ0ID0gMDsgU2hpZnQgPCAoKEFscGhhX1RhYmxlU2l6ZSAtIDEpIC8gMik7IFNoaWZ0KyspCi0gICAgewotICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgICAgICB7CisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKSB7CisgICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApICE9IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0MCw4ICs5NCw3IEBACiAgICAgfQogICAgIFNoaWZ0ID0gKExWTV9VSU5UMTYpKChTaGlmdCA8PCAxKSk7CiAKLSAgICBpZiAoKFByb2R1Y3QgJiAweDQwMDAwMDAwKT09MCkKLSAgICB7CisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCkgPT0gMCkgewogICAgICAgICBTaGlmdCsrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwCmluZGV4IDJjM2U5ZWMuLjgzODI1MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jcHAKQEAgLTQwLDMzICs0MCwyNSBAQAogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgIFgpCi17CitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLCBMVk1fRkxPQVQqIHBDb2VmZmljaWVudHMsIExWTV9GTE9BVCBYKSB7CiAgICAgTFZNX0lOVDMyIGk7Ci0gICAgTFZNX0ZMT0FUIFksQSxYVGVtcCxUZW1wLHNpZ247CisgICAgTFZNX0ZMT0FUIFksIEEsIFhUZW1wLCBUZW1wLCBzaWduOwogCiAgICAgWSA9ICpwQ29lZmZpY2llbnRzOyAvKiBZPUEwKi8KICAgICBwQ29lZmZpY2llbnRzKys7CiAKLSAgICBpZihYID09IC0xLjBmKQotICAgIHsKKyAgICBpZiAoWCA9PSAtMS4wZikgewogICAgICAgICBUZW1wID0gLTE7CiAgICAgICAgIHNpZ24gPSBUZW1wOwotICAgICAgICBmb3IoaSA9IDE7IGkgPD0gTjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTjsgaSsrKSB7CiAgICAgICAgICAgICBZICs9ICgoKnBDb2VmZmljaWVudHMpICogc2lnbik7CiAgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CiAgICAgICAgICAgICBzaWduICo9IFRlbXA7CiAgICAgICAgIH0KIAotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIFhUZW1wID0gWDsKLSAgICAgICAgZm9yKGkgPSBOLTE7IGkgPj0gMDsgaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IE4gLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgQSA9ICpwQ29lZmZpY2llbnRzOwogICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jcHAKaW5kZXggYWU4ZTlkMS4uODU1OTZhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmNwcApAQCAtNTMsMjMgKzUzLDEwIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1MVk1fRkxPQVQgTFZNX1Bvd2VyMTAoTFZNX0ZMT0FUICAgICBYKQotewotICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM109ezAuOTk5OTA2ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjMwMjQ3NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi42NTI3NjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDM1NDk0ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjE2NTY2N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41Mzc2NzZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjEzMTkyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA2OTYwM2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTY1NTNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA0MzczZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMTgxN2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzNjdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OwotICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsCi0gICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICBYKTsKK0xWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgWCkgeworICAgIExWTV9GTE9BVCBZLCBDb2VmZmljaWVudHNbMTNdID0gezAuOTk5OTA2ZiwgMi4zMDI0NzVmLCAyLjY1Mjc2NWYsIDIuMDM1NDk0ZiwgMS4xNjU2NjdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTM3Njc2ZiwgMC4yMTMxOTJmLCAwLjA2OTYwM2YsIDAuMDE2NTUzZiwgMC4wMDQzNzNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwgMC4wMDAzNjdmLCAwfTsKKyAgICBZID0gTFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpMTEsIENvZWZmaWNpZW50cywgWCk7CiAgICAgcmV0dXJuIFk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyLmNwcAppbmRleCA1OTk1ZjU0Li5iZTdjOGU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lci5jcHAKQEAgLTI2LDE5ICsyNiwxNiBAQAogLyogIFRJTUVSIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgIEJsb2NrU2l6ZSApewordm9pZCBMVk1fVGltZXIoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX0lOVDE2IEJsb2NrU2l6ZSkgeworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqIHBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QqKXBJbnN0YW5jZTsKIAotICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOwotICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7Ci0KLSAgICBpZiAocEluc3RhbmNlUHItPlRpbWVyQXJtZWQpeworICAgIGlmIChwSW5zdGFuY2VQci0+VGltZXJBcm1lZCkgewogICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyAtPSBCbG9ja1NpemU7Ci0gICAgICAgIGlmIChwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcyA8PSAwKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzIDw9IDApIHsKICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMDsKLSAgICAgICAgICAgICgqcEluc3RhbmNlUHItPnBDYWxsQmFjaykgKCBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSApOworICAgICAgICAgICAgKCpwSW5zdGFuY2VQci0+cENhbGxCYWNrKShwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UsIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2tQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmNwcAppbmRleCAzMDE1MDU3Li5iZmQ2YmNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuY3BwCkBAIC0zMywyMCArMzMsMjAgQEAKIC8qICBJTklUIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKXsKK3ZvaWQgTFZNX1RpbWVyX0luaXQoTFZNX1RpbWVyX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZNX1RpbWVyX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCogcEluc3RhbmNlUHI7CisgICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCopcEluc3RhbmNlOwogCi0gICAgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqcEluc3RhbmNlUHI7Ci0gICAgcEluc3RhbmNlUHIgPSAoTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCAqKXBJbnN0YW5jZTsKLQotICAgIHBJbnN0YW5jZVByLT5DYWxsQmFja1BhcmFtICAgICA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07Ci0gICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyAgID0gKExWTV9JTlQzMiAqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKKyAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSA9IHBQYXJhbXMtPkNhbGxCYWNrUGFyYW07CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFja1BhcmFtcyA9IChMVk1fSU5UMzIqKXBQYXJhbXMtPnBDYWxsQmFja1BhcmFtczsKICAgICBwSW5zdGFuY2VQci0+cENhbGxiYWNrSW5zdGFuY2UgPSBwUGFyYW1zLT5wQ2FsbGJhY2tJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrICAgICAgICAgPSBwUGFyYW1zLT5wQ2FsbEJhY2s7Ci0gICAgcEluc3RhbmNlUHItPlRpbWVyQXJtZWQgICAgICAgID0gMTsKKyAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrID0gcFBhcmFtcy0+cENhbGxCYWNrOworICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkID0gMTsKIAotICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSxPbmVPdmVyVGhvdXNhbmRJblEyNCxwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywxNik7ICAvKiAoUTAgKiBRMjQpID4+MTYgaW50byBROCovCi0gICAgTVVMMzJ4MTZJTlRPMzIocEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMscFBhcmFtcy0+VGltZUluTXMscEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMsOCk7ICAvKiAoUTggKiBRMCkgPj44IGludG8gUTAqLworICAgIE1VTDMyeDE2SU5UTzMyKHBQYXJhbXMtPlNhbXBsaW5nUmF0ZSwgT25lT3ZlclRob3VzYW5kSW5RMjQsIHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgIDE2KTsgLyogKFEwICogUTI0KSA+PjE2IGludG8gUTgqLworICAgIE1VTDMyeDE2SU5UTzMyKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLCBwUGFyYW1zLT5UaW1lSW5NcywKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2VQci0+UmVtYWluaW5nVGltZUluU2FtcGxlcywgOCk7IC8qIChROCAqIFEwKSA+PjggaW50byBRMCovCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmgKaW5kZXggYTM3MmI4Mi4uM2U4YWJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0yNCwxNCArMjQsMTMgQEAKIC8qICBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOwotICAgIExWTV9JTlQzMiAgQ2FsbEJhY2tQYXJhbTsKLSAgICBMVk1fSU5UMzIgICpwQ2FsbEJhY2tQYXJhbXM7Ci0gICAgdm9pZCAgKnBDYWxsYmFja0luc3RhbmNlOwotICAgIHZvaWQgICgqcENhbGxCYWNrKSh2b2lkKix2b2lkKixMVk1fSU5UMzIpOwotICAgIExWTV9JTlQxNiBUaW1lckFybWVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvb2xlYW4sIHRydWUgYmV0d2VlbiBpbml0IGFuZCBjYWxsYmFjayAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBSZW1haW5pbmdUaW1lSW5TYW1wbGVzOworICAgIExWTV9JTlQzMiBDYWxsQmFja1BhcmFtOworICAgIExWTV9JTlQzMiogcENhbGxCYWNrUGFyYW1zOworICAgIHZvaWQqIHBDYWxsYmFja0luc3RhbmNlOworICAgIHZvaWQgKCpwQ2FsbEJhY2spKHZvaWQqLCB2b2lkKiwgTFZNX0lOVDMyKTsKKyAgICBMVk1fSU5UMTYgVGltZXJBcm1lZDsgLyogQm9vbGVhbiwgdHJ1ZSBiZXR3ZWVuIGluaXQgYW5kIGNhbGxiYWNrICovCiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdDsKIApAQCAtMzksNCArMzgsNCBAQAogLyogIEVORCBPRiBIRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmICAvKiBMVk1fVElNRVJfUFJJVkFURV9IICovCisjZW5kaWYgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xvYWRDb25zdF8xNi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OGNhMGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIExvYWRDb25zdF8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTG9hZENvbnN0XzE2KGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSB2YWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc4OTc1Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTG9hZENvbnN0XzMyCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSB2YWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCmluZGV4IDFlYTc2NWEuLmU1YzZmMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCkBAIC0xOCw3NCArMTgsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBJTkNMVURFIEZJTEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiAgTVNUTzJJX1NBVF8xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTVNUbzJpX1NhdF8xNngxNihjb25zdCBMVk1fSU5UMTYgICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgKnNyY1MsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIHRlbXAsbVZhbCxzVmFsOwordm9pZCBNU1RvMmlfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjTSwgY29uc3QgTFZNX0ZMT0FUKiBzcmNTLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBMVk1fRkxPQVQgdGVtcCwgbVZhbCwgc1ZhbDsKICAgICBMVk1fSU5UMTYgaWk7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIG1WYWw9KExWTV9JTlQzMikqc3JjTTsKLSAgICAgICAgc3JjTSsrOwotCi0gICAgICAgIHNWYWw9KExWTV9JTlQzMikqc3JjUzsKLSAgICAgICAgc3JjUysrOwotCi0gICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotCi0gICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLXZvaWQgTVNUbzJpX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1MsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXAsbVZhbCxzVmFsOwotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICBtVmFsID0gKExWTV9GTE9BVCkqc3JjTTsKICAgICAgICAgc3JjTSsrOwogCkBAIC05MywzOCArMzMsMTEgQEAKICAgICAgICAgc3JjUysrOwogCiAgICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0xLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKKyAgICAgICAgKmRzdCsrID0gTFZNX0NsYW1wKHRlbXApOwogCiAgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0gMS4wZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kys7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcCh0ZW1wKTsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg0MjUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgICVjcmVhdGVkX2J5OiAgICBzcmEgJSAoQ00vUykKLSAgICAgJW5hbWU6ICAgICAgICAgIE1hYzNzX1NhdF8xNngxNi5jICUgKENNL1MpCi0gICAgICV2ZXJzaW9uOiAgICAgICAxICUgKENNL1MpCi0gICAgICVkYXRlX2NyZWF0ZWQ6ICBGcmkgTm92IDEzIDEyOjA3OjEzIDIwMDkgJSAoQ00vUykKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNYWMzU18xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTWFjM3NfU2F0XzE2eDE2KCBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fSU5UMTYgc3JjdmFsOwotICAgIExWTV9JTlQzMiBUZW1wLGRJblZhbDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsPSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgPSAoc3JjdmFsICp2YWwpPj4xNTsKLQotICAgICAgICBkSW5WYWwgID0gKExWTV9JTlQzMikqZHN0OwotCi0gICAgICAgIFRlbXAgPSBUZW1wICsgZEluVmFsOwotCi0gICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KVRlbXA7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcAppbmRleCA1ZDU1NjRmLi4yNGJkZjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAKQEAgLTE4LDg1ICsxOCwxOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNQUMzU18xNlgxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTWFjM3NfU2F0XzMyeDE2KCAgY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTWFjM3NfU2F0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCogc3JjLCBjb25zdCBMVk1fRkxPQVQgdmFsLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIHNyY3ZhbCx0ZW1wLCBkSW5WYWwsIGRPdXRWYWw7CiAKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbD0qc3JjOwotICAgICAgICBzcmMrKzsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICBMVk1fRkxPQVQgVGVtcCA9ICpzcmMrKyAqIHZhbDsKKyAgICAgICAgVGVtcCArPSAqZHN0OwogCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKLQotICAgICAgICAgICAgZEluVmFsICA9ICpkc3Q7Ci0gICAgICAgIGRPdXRWYWwgPSB0ZW1wICsgZEluVmFsOwotCi0gICAgICAgIGlmICgoKChkT3V0VmFsIF4gdGVtcCkgJiAoZE91dFZhbCBeIGRJblZhbCkpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRlbXA8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqZHN0ID0gZE91dFZhbDsKLSAgICAgICAgZHN0Kys7CisgICAgICAgICpkc3QrKyA9IExWTV9DbGFtcChUZW1wKTsKICAgICB9CiAKICAgICByZXR1cm47CiB9Ci12b2lkIE1hYzNzX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fRkxPQVQgc3JjdmFsOwotICAgIExWTV9GTE9BVCBUZW1wLGRJblZhbDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsID0gKnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgVGVtcCA9IHNyY3ZhbCAqIHZhbDsKLQotICAgICAgICBkSW5WYWwgID0gKExWTV9GTE9BVCkqZHN0OwotICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKLQotICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwCmluZGV4IDdjN2IzNmYuLjk2NjM5OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTI2LDMzICsyNiwyOSBAQAogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCi17Cit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKE1peF8xU3RfQ2xsX0ZMT0FUX3QqIHBJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgewogICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgfSBlbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgfWVsc2V7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwogICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwogICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKQEAgLTYzLDExICs1OSwxMSBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKSB7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQogICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKLSAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOwogICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBjaGFuZ2VkIHRoZSBDdXJyZW50IHZhbHVlICovCkBAIC04MSwxNiArNzcsMTUgQEAKICAgICAvKiBDYWxsIGJhY2sgYmVmb3JlIHRoZSBoYXJkIG1peGluZywgYmVjYXVzZSBpbiB0aGlzIGNhc2UsIGhhcmQgbWl4aW5nIG1ha2VzCiAgICAgICAgdXNlIG9mIHRoZSBjb3JlIHNvZnQgbWl4IGZ1bmN0aW9uIHdoaWNoIGNhbiBjaGFuZ2UgdGhlIEN1cnJlbnQgdmFsdWUhICAgICAgKi8KIAotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCkgewogICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKShwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKaW5kZXggZDMzMjVlYy4uNThhOTEwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICAgIElOQ0xVREUgRklMRVMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgogI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKIApAQCAtMjYsMzMgKzI3LDI5IEBACiAgICBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAorI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKK3ZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQShNaXhfMVN0X0NsbF9GTE9BVF90KiBwSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogc3JjLCBMVk1fRkxPQVQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgewogICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CiAKLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKLSAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgIH0gZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCisgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSkgewogICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgIH1lbHNleworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKICAgICAgICAgICAgIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQShwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKQEAgLTYzLDE0ICs2MCwxMiBAQAogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICBpZiAoSGFyZE1peGluZykgewogICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBkc3QsIG4pOwotICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilzcmMsIChMVk1fRkxPQVQqKWRzdCwgKExWTV9JTlQxNikobikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldChkc3QsIDAsIG4gKiBzaXplb2YoKmRzdCkpOworICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpIHsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KSBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXNyYywgKExWTV9GTE9BVCopZHN0LCAoTFZNX0lOVDE2KShuKSk7CisgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgcEluc3RhbmNlLT5DdXJyZW50LCBkc3QsIG4pOwogICAgIH0KIApAQCAtNzgsMTYgKzczLDE1IEBACiAgICAgICAgQ0FMTCBCQUNLCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCkgewogICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwogICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApIHsKKyAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKShwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKaW5kZXggYjAwMjczOC4uYWJhODUzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKQEAgLTI1LDQyICsyNSwzNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47Cit2b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoTWl4XzJTdF9DbGxfRkxPQVRfdCogcEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUKiBzcmMyLCBMVk1fRkxPQVQqIGRzdCwgTFZNX0lOVDE2IG4pIHsKKyAgICBpZiAobiA8PSAwKSByZXR1cm47CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgU09GVCBNSVhJTkcKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpIHsKICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwotICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCgoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEhBUkQgTUlYSU5HCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGVsc2UKLSAgICB7CisgICAgZWxzZSB7CiAgICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCiAgICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKAotICAgICAgICAgICAgICAgICAgICAoTWl4XzFTdF9DbGxfRkxPQVRfdCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICAgICAgKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLworICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwogICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCi0gICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOworICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMxLCBzcmMyLCBkc3QsIG4pOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKaW5kZXggMWQ2NTNiYi4uZTFlNjJjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaApAQCAtMjYsMTMgKzI2LDEzIEBACiAKICNkZWZpbmUgUE9JTlRfWkVST19PTkVfREIgMjQ3MzgwNSAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBzaWduYWwgPSAoMTBeKDAuMDEvMjApIC0xKSAqIDJeMzEgKi8KIAotI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLworI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAgICAgICAgIFwKKyAgICAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCisgICAgICAgICAgICAgICAgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2VuZGlmIC8vI2lmbmRlZiBfX01JWEVSX1BSSVZBVEVfSF9fCi0KKyNlbmRpZiAgLy8jaWZuZGVmIF9fTUlYRVJfUFJJVkFURV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFkNzk4ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNb25vVG8ySV8xNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTW9ub1RvMklfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgZHN0LS07Ci0KLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwCmluZGV4IDYwM2QxZmMuLmVmM2U2MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jcHAKQEAgLTIxLDQwICsyMSwxMiBAQAogCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTW9ub1RvMklfMzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgZHN0LS07Ci0KLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci12b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKK3ZvaWQgTW9ub1RvMklfRmxvYXQoY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgewogICAgIExWTV9JTlQxNiBpaTsKICAgICBzcmMgKz0gKG4gLSAxKTsKICAgICBkc3QgKz0gKChuICogMikgLSAxKTsKIAotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkgewogICAgICAgICAqZHN0ID0gKnNyYzsKICAgICAgICAgZHN0LS07CiAKQEAgLTY1LDQgKzM3LDMgQEAKIAogICAgIHJldHVybjsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jcHAKaW5kZXggMzcwYzM5YS4uYmFiZmVmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuY3BwCkBAIC0yMiw0MSArMjIsMTEgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRlVOQ1RJT04gTVVMVDNTXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBNdWx0M3NfMzJ4MTYoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsPSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKLQotICAgICAgICAqZHN0ID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotdm9pZCBNdWx0M3NfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCi0gICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Cit2b2lkIE11bHQzc19GbG9hdChjb25zdCBMVk1fRkxPQVQqIHNyYywgY29uc3QgTFZNX0ZMT0FUIHZhbCwgTFZNX0ZMT0FUKiBkc3QsIExWTV9JTlQxNiBuKSB7CiAgICAgTFZNX0lOVDE2IGlpOwogICAgIExWTV9GTE9BVCB0ZW1wOwogCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgeworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7CiAgICAgICAgIHNyYysrOwogICAgICAgICAqZHN0ID0gdGVtcDsKQEAgLTY0LDQgKzM0LDMgQEAKICAgICB9CiAgICAgcmV0dXJuOwogfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAKaW5kZXggMzZkMTE0OS4uZjNhMWE2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmNwcApAQCAtNjEsMjIgKzYxLDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIE5vbkxpbkNvbXBfRDE2KExWTV9JTlQxNiAgICAgICAgR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCkKLXsKLQotICAgIExWTV9JTlQxNiAgICAgICAgICAgIFNhbXBsZTsgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IHNhbXBsZXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICBTYW1wbGVObzsgICAgICAgICAgICAgICAgLyogU2FtcGxlIGluZGV4ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgVGVtcDsKK3ZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgR2FpbiwgTFZNX0ZMT0FUKiBwRGF0YUluLCBMVk1fRkxPQVQqIHBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBCbG9ja0xlbmd0aCkgeworICAgIExWTV9GTE9BVCBTYW1wbGU7ICAgLyogSW5wdXQgc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiBTYW1wbGVObzsgLyogU2FtcGxlIGluZGV4ICovCisgICAgTFZNX0ZMT0FUIFRlbXA7CiAKICAgICAvKgogICAgICAqIFByb2Nlc3MgYSBibG9jayBvZiBzYW1wbGVzCiAgICAgICovCi0gICAgZm9yKFNhbXBsZU5vID0gMDsgU2FtcGxlTm88QmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCi0gICAgewotCisgICAgZm9yIChTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspIHsKICAgICAgICAgLyoKICAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKICAgICAgICAgICovCkBAIC04OCw2NCArODIsMTIgQEAKICAgICAgICAgICogaGFybW9uaWMgZGlzdG9ydGlvbi4gVGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBpcyBjb250cm9sIGJ5IHRoZQogICAgICAgICAgKiBnYWluIGZhY3RvcgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKChMVk1fSU5UMzIpU2FtcGxlICE9IC0zMjc2OCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMTYpKChTYW1wbGUgKiBTYW1wbGUpID4+IDE1KTsKLSAgICAgICAgICAgIGlmKFNhbXBsZSA+MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlIC0gVGVtcCkpID4+IDE1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKExWTV9JTlQxNikoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSA+PiAxNSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2F2ZSB0aGUgb3V0cHV0Ci0gICAgICAgICAqLwotICAgICAgICAqcERhdGFPdXQgPSBTYW1wbGU7Ci0gICAgICAgIHBEYXRhT3V0Kys7Ci0KLSAgICB9Ci0KLX0KLXZvaWQgTm9uTGluQ29tcF9GbG9hdChMVk1fRkxPQVQgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQotewotCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICBUZW1wOwotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcwotICAgICAqLwotICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vIDwgQmxvY2tMZW5ndGg7IFNhbXBsZU5vKyspCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAotICAgICAgICAgKi8KLSAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47Ci0gICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgotICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCi0gICAgICAgICAqIGdhaW4gZmFjdG9yCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKQotICAgICAgICB7CisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpIHsKICAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOwotICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIGlmIChTYW1wbGUgPiAwKSB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjJmOTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgR2FpbiwgaW4gUTExIGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPSAoQTAgICogKHgobilMIC0geChuLTIpTCAgKSApKi8KLSAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLSAgICAgICAgICAgIHluTCA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjEgKiB5KG4tMSlMICApICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MTz0gKChHYWluICogeW5MICkpICovCi0gICAgICAgICAgICB5bkxPID0geW5MICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5MTz0oIHluTE8gKyB4KG4pTCAgKSovCi0gICAgICAgICAgICB5bkxPICs9ICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj0gKEEwICAqICh4KG4pUiAgLSB4KG4tMilSICApICkgKi8KLSAgICAgICAgICAgIHRlbXBsID0gKCoocERhdGFJbiArIDEpKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLSAgICAgICAgICAgIHluUiA9IHRlbXBsICogcEJpcXVhZFN0YXRlLT5jb2Vmc1swXTsKLQotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgICogeShuLTIpUiAgKSApICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAgKiB5KG4tMSlSICApICkgICAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gICogeW5SICkpICovCi0gICAgICAgICAgICB5blJPID0geW5SICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5STz0oIHluUk8gKyB4KG4pUiAgKSovCi0gICAgICAgICAgICB5blJPICs9ICgqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQgPSB5bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSNpZmRlZiBTVVBQT1JUX01DCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURFTEFZUy0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bwotcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bwotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKLQotcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCi0KLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCi1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKLSAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOwotICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07Ci0KLSAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCi0gICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgICAgIHluICs9IHRlbXA7Ci0KLSAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KLSAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKLQotICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLwotICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLwotICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KLSAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLwotICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KLSAgICAgICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KLSAgICAgICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkZTFkZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGFhNTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZjljN2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLSNlbmRpZiAvKiBfUEtfMklfRDMyRjMyQ0xMR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjMDVkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi12b2lkICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gcENvZWYtPkc7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjOTI0YzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotI2RlZmluZSBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwotCi0vKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCi0vKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi0KLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRmxvYXRfCi17Ci0gICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGVfRmxvYXQ7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GbG9hdCA7Ci10eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwotewotICBMVk1fSU5UMzIgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KLSAgTFZNX0lOVDMyICAgICAgICAgY29lZnNbNV07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0KLSNlbmRpZiAvKiBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwCmluZGV4IDk3YTA0YzEuLmY1NGJhOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAKQEAgLTI0LDU1ICsyNCwzOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFNoaWZ0X1NhdF92MzJ4djMyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgU2hpZnRfU2F0X0Zsb2F0IChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQotewotICAgIExWTV9GTE9BVCAgIHRlbXA7Ci0gICAgTFZNX0lOVDMyICAgaWksaWo7Ci0gICAgTFZNX0lOVDE2ICAgUlNoaWZ0Owordm9pZCBTaGlmdF9TYXRfRmxvYXQoY29uc3QgTFZNX0lOVDE2IHZhbCwgY29uc3QgTFZNX0ZMT0FUKiBzcmMsIExWTV9GTE9BVCogZHN0LCBMVk1fSU5UMTYgbikgeworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIExWTV9JTlQzMiBpaSwgaWo7CisgICAgTFZNX0lOVDE2IFJTaGlmdDsKIAotICAgIGlmKHZhbCA+IDApCi0gICAgewotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgeworICAgIGlmICh2YWwgPiAwKSB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOwogICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IHZhbDsgaWorKykKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaWogPSAwOyBpaiA8IHZhbDsgaWorKykgewogICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICogMjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYodGVtcCA+IDEuMCkKLSAgICAgICAgICAgICAgICB0ZW1wID0gMS4wOwotICAgICAgICAgICAgaWYodGVtcCA8IC0xLjApCi0gICAgICAgICAgICAgICAgdGVtcCA9IC0xLjA7CisgICAgICAgICAgICBpZiAodGVtcCA+IDEuMCkgdGVtcCA9IDEuMDsKKyAgICAgICAgICAgIGlmICh0ZW1wIDwgLTEuMCkgdGVtcCA9IC0xLjA7CiAKICAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CiAgICAgICAgICAgICBkc3QrKzsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKHZhbCA8IDApCi0gICAgewotICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisgICAgfSBlbHNlIGlmICh2YWwgPCAwKSB7CisgICAgICAgIFJTaGlmdCA9IChMVk1fSU5UMTYpKC12YWwpOwogCi0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKSB7CiAgICAgICAgICAgICB0ZW1wID0gKExWTV9GTE9BVCkqc3JjOwogICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgICAgICBmb3IoaWogPSAwOyBpaiA8IFJTaGlmdDsgaWorKykKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaWogPSAwOyBpaiA8IFJTaGlmdDsgaWorKykgewogICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wIC8gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CiAgICAgICAgICAgICBkc3QrKzsKICAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihzcmMgIT0gZHN0KQotICAgICAgICB7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNyYyAhPSBkc3QpIHsKICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwCmluZGV4IDRkYTIwMTMuLjIxNDM0NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAKQEAgLTU3LDE3ICs1NywxNiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIEZPVVJfT1ZFUl9TSVggICAgMjE4NDYgICAgICAgICAgICAgICAgICAvKiAoNCAvIDYpICogMl4xNSAqLwotI2RlZmluZSBTSVhfREIgICAgICAgICAgIDk2ICAgICAgICAgICAgICAgICAgICAgLyogNiAqIDE2IG9yIDZkQiBpbiBRMTEuNCBmb3JtYXQgKi8KLSNkZWZpbmUgRklSU1RfQ09FRl9ORUcgICAxNDg4NDMwNQotI2RlZmluZSBGSVJTVF9DT0VGX1BPUyAgIDc0NDIxNTIgICAgICAgICAgICAgICAgLyogRklSU1RfQ09FRl9ORUcgLyAyICovCi0jZGVmaW5lIFNFQ09ORF9DT0VGICAgICAgMzg4MzYKLSNkZWZpbmUgTUFYX1ZBTFVFICAgICAgICAxNTM2ICAgICAgICAgICAgICAgICAgIC8qIDk2ICogMTYgKi8KKyNkZWZpbmUgRk9VUl9PVkVSX1NJWCAyMTg0NiAvKiAoNCAvIDYpICogMl4xNSAqLworI2RlZmluZSBTSVhfREIgOTYgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCisjZGVmaW5lIEZJUlNUX0NPRUZfTkVHIDE0ODg0MzA1CisjZGVmaW5lIEZJUlNUX0NPRUZfUE9TIDc0NDIxNTIgLyogRklSU1RfQ09FRl9ORUcgLyAyICovCisjZGVmaW5lIFNFQ09ORF9DT0VGIDM4ODM2CisjZGVmaW5lIE1BWF9WQUxVRSAxNTM2IC8qIDk2ICogMTYgKi8KIAotTFZNX0ZMT0FUICAgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKLXsKLSAgICBMVk1fRkxPQVQgICAgZEJfRmxvYXQ7Ci0gICAgTFZNX0ZMT0FUICAgIExpbkZsb2F0OworTFZNX0ZMT0FUIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiBkYl9maXgpIHsKKyAgICBMVk1fRkxPQVQgZEJfRmxvYXQ7CisgICAgTFZNX0ZMT0FUIExpbkZsb2F0OwogCiAgICAgZEJfRmxvYXQgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKWRiX2ZpeCAvIDE2LjBmKTsKICAgICBMaW5GbG9hdCA9IHBvdygxMCwgZEJfRmxvYXQgLyAyMC4wKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDkyNTYwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBNVUxUM1NfMTZYMTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE11bHQzc18xNngxNiggY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIHRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKSgqc3JjKSAqIChMVk1fSU5UMzIpdmFsOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAqZHN0ID0gKExWTV9JTlQxNikodGVtcCA+PiAxNSk7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAppbmRleCBjNWRkZjc3Li5mMWFmY2Q2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKQEAgLTg2LDE2ICs4Niw5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUgKi8KLSNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRSAgICAgICAgICAwICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAgMSAgIC8qIE9mZnNldCB0byBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgIDIgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KLSNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIICAgICAgICAgICAzICAgLyogT2Zmc2V0IHRvIGRhdGEgc2NyYXRjaCBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwotCiAvKiBDYWxsYmFjayBldmVudHMgKi8KLSNkZWZpbmUgTFZFUU5CX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwICAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCi0jZGVmaW5lIExWRVFOQl9FVkVOVF9BTEdPRkYgICAgICAgICAgICAgICAgIDB4MDAwMSAgICAvKiBFUU5CIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLworI2RlZmluZSBMVkVRTkJfRVZFTlRfTk9ORSAweDAwMDAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLworI2RlZmluZSBMVkVRTkJfRVZFTlRfQUxHT0ZGIDB4MDAwMSAvKiBFUU5CIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTA0LDQyICs5NywyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotdHlwZWRlZiB2b2lkICpMVkVRTkJfSGFuZGxlX3Q7Cit0eXBlZGVmIHZvaWQqIExWRVFOQl9IYW5kbGVfdDsKIAogLyogT3BlcmF0aW5nIG1vZGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfQllQQVNTICAgPSAwLAotICAgIExWRVFOQl9PTiAgICAgICA9IDEsCi0gICAgTFZFUU5CX01PREVfTUFYID0gTFZNX01BWElOVF8zMgotfSBMVkVRTkJfTW9kZV9lbjsKK3R5cGVkZWYgZW51bSB7IExWRVFOQl9CWVBBU1MgPSAwLCBMVkVRTkJfT04gPSAxLCBMVkVRTkJfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyIH0gTFZFUU5CX01vZGVfZW47CiAKIC8qIEZpbHRlciBtb2RlIGNvbnRyb2wgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9GSUxURVJfT0ZGICAgPSAwLAotICAgIExWRVFOQl9GSUxURVJfT04gICAgPSAxLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVkVRTkJfRklMVEVSX09GRiA9IDAsCisgICAgTFZFUU5CX0ZJTFRFUl9PTiA9IDEsCiAgICAgTFZFUU5CX0ZJTFRFUl9EVU1NWSA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZpbHRlck1vZGVfZW47CiAKLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZFUU5CX1BFUlNJU1RFTlQgICAgICA9IDAsCi0gICAgTFZFUU5CX1BFUlNJU1RFTlRfREFUQSA9IDEsCi0gICAgTFZFUU5CX1BFUlNJU1RFTlRfQ09FRiA9IDIsCi0gICAgTFZFUU5CX1NDUkFUQ0ggICAgICAgICA9IDMsCi0gICAgTFZFUU5CX01FTU9SWV9NQVggICAgICA9IExWTV9NQVhJTlRfMzIKLX0gTFZFUU5CX01lbW9yeVR5cGVzX2VuOwotCiAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVkVRTkJfQUxJR05NRU5URVJST1IgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLwotICAgIExWRVFOQl9OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLwotICAgIExWRVFOQl9UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KLSAgICBMVkVRTkJfU1RBVFVTX01BWCAgICAgPSBMVk1fTUFYSU5UXzMyCit0eXBlZGVmIGVudW0geworICAgIExWRVFOQl9TVUNDRVNTID0gMCwgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZFUU5CX0FMSUdOTUVOVEVSUk9SID0gMSwgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLworICAgIExWRVFOQl9OVUxMQUREUkVTUyA9IDIsICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCisgICAgTFZFUU5CX1RPT01BTllTQU1QTEVTID0gMywgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCisgICAgTFZFUU5CX1NUQVRVU19NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9SZXR1cm5TdGF0dXNfZW47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTY2LDM5ICsxNDIsMzUgQEAKIC8qCiAgKiBTdXBwb3J0ZWQgc291cmNlIGRhdGEgZm9ybWF0cwogICovCi0jZGVmaW5lIExWRVFOQl9DQVBfU1RFUkVPICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTyAgICAgICAgICAgIDIKKyNkZWZpbmUgTFZFUU5CX0NBUF9TVEVSRU8gMQorI2RlZmluZSBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTyAyCiAKLXR5cGVkZWYgZW51bQotewotICAgIExWRVFOQl9TVEVSRU8gICAgICAgPSAwLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVkVRTkJfU1RFUkVPID0gMCwKICAgICBMVkVRTkJfTU9OT0lOU1RFUkVPID0gMSwKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZFUU5CX01VTFRJQ0hBTk5FTCA9IDIsCi0jZW5kaWYKLSAgICBMVkVRTkJfU09VUkNFX01BWCAgID0gTFZNX01BWElOVF8zMgorICAgIExWRVFOQl9TT1VSQ0VfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfU291cmNlRm9ybWF0X2VuOwogCiAvKgogICogU3VwcG9ydGVkIHNhbXBsZSByYXRlcyBpbiBzYW1wbGVzIHBlciBzZWNvbmQKICAqLwotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzgwMDAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMTAyNSAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTIwMDAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE2MDAwICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18yMjA1MCAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzI0MDAwICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0Ci0jZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184MDAwIDEKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xMTAyNSAyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTIwMDAgNAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE2MDAwIDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18yMjA1MCAxNgorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzI0MDAwIDMyCisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgNjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAxMjgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAyNTYKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwIDIwNDgKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgNDA5NgogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfRlNfODAwMCAgPSAwLAordHlwZWRlZiBlbnVtIHsKKyAgICBMVkVRTkJfRlNfODAwMCA9IDAsCiAgICAgTFZFUU5CX0ZTXzExMDI1ID0gMSwKICAgICBMVkVRTkJfRlNfMTIwMDAgPSAyLAogICAgIExWRVFOQl9GU18xNjAwMCA9IDMsCkBAIC0yMTEsNyArMTgzLDcgQEAKICAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKICAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCiAgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAotICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKKyAgICBMVkVRTkJfRlNfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjIwLDU4ICsxOTIsMzggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSByZWdpb24gZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAgICAgLyogUmVnaW9uIGFsaWdubWVudCBpbiBieXRlcyAqLwotICAgIExWRVFOQl9NZW1vcnlUeXBlc19lbiAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWRVFOQl9NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkVRTkJfTWVtb3J5UmVnaW9uX3QgICAgICAgUmVnaW9uW0xWRVFOQl9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZFUU5CX01lbVRhYl90OwotCiAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBHYWluOyAgICAgICAgICAgICAgICAgICAvKiBCYW5kIGdhaW4gaW4gZEIgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRnJlcXVlbmN5OyAgICAgICAgICAgICAgLyogQmFuZCBjZW50cmUgZnJlcXVlbmN5IGluIEh6ICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSU5UMTYgR2FpbjsgICAgICAgLyogQmFuZCBnYWluIGluIGRCICovCisgICAgTFZNX1VJTlQxNiBGcmVxdWVuY3k7IC8qIEJhbmQgY2VudHJlIGZyZXF1ZW5jeSBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgUUZhY3RvcjsgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICovCiB9IExWRVFOQl9CYW5kRGVmX3Q7CiAKIC8qIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgTFZFUU5CX01vZGVfZW4gICAgICAgICAgICAgIE9wZXJhdGluZ01vZGU7Ci0gICAgTFZFUU5CX0ZzX2VuICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgTFZFUU5CX1NvdXJjZUZvcm1hdF9lbiAgICAgIFNvdXJjZUZvcm1hdDsKKyAgICBMVkVRTkJfTW9kZV9lbiBPcGVyYXRpbmdNb2RlOworICAgIExWRVFOQl9Gc19lbiBTYW1wbGVSYXRlOworICAgIExWRVFOQl9Tb3VyY2VGb3JtYXRfZW4gU291cmNlRm9ybWF0OwogCiAgICAgLyogRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzICovCi0gICAgTFZFUU5CX0JhbmREZWZfdCAgICAgICAgICAgICpwQmFuZERlZmluaXRpb247ICAgICAgIC8qIFBvaW50ZXIgdG8gZXF1YWxpc2VyIGRlZmluaXRpb25zICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOwotI2VuZGlmCisgICAgTFZNX1VJTlQxNiBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KKyAgICBMVkVRTkJfQmFuZERlZl90KiBwQmFuZERlZmluaXRpb247IC8qIFBvaW50ZXIgdG8gZXF1YWxpc2VyIGRlZmluaXRpb25zICovCisgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHM7CiB9IExWRVFOQl9QYXJhbXNfdDsKIAogLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7CisgICAgTFZNX1VJTlQxNiBTYW1wbGVSYXRlOwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFNvdXJjZUZvcm1hdDsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBNYXhCYW5kczsKKyAgICBMVk1fVUlOVDE2IFNvdXJjZUZvcm1hdDsKKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsKKyAgICBMVk1fVUlOVDE2IE1heEJhbmRzOwogCiAgICAgLyogQ2FsbGJhY2sgcGFyYW1ldGVycyAqLwotICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgICAgICBDYWxsQmFjazsgICAgICAgICAgICAgICAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCdW5kbGVJbnN0YW5jZTsgICAgICAgLyogQnVuZGxlIGluc3RhbmNlIGhhbmRsZSAqLworICAgIExWTV9DYWxsYmFjayBDYWxsQmFjazsgLyogQnVuZGxlIGNhbGxiYWNrICovCisgICAgdm9pZCogcEJ1bmRsZUluc3RhbmNlOyAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCiAKIH0gTFZFUU5CX0NhcGFiaWxpdGllc190OwogCkBAIC0yODMsNzggKzIzNSw0MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLwotLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLwotLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KLS8qICBMVkVRTkJfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxpc2VyIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIHBDYXBhYmlsaXRpZXMgb3IgcGhJbnN0YW5jZSBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYWxsb2NhdGVkIG1lbW9yeSBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICAgICovCi0vKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywgdm9pZCogcFNjcmF0Y2gpOwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZFUU5CX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkVRTkJfRGVJbml0KExWRVFOQl9IYW5kbGVfdCogcGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNzcsOCArMjk0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAxLDggKzMxNyw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMoTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDI2LDggKzM0Miw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcyk7CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsIExWRVFOQl9QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NTEsMTAgKzM2Niw3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcyk7CiAKLSNlbmRpZiAgICAgIC8qIF9fTFZFUU5CX18gKi8KLQorI2VuZGlmIC8qIF9fTFZFUU5CX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmNwcAppbmRleCBjM2MwZmFkLi5mOGE1ZjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ2FsY0NvZWYuY3BwCkBAIC0xMTEsNDMgKzExMSwzNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAqcENvZWZmaWNpZW50cykKLXsKLQotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0dhaW5UYWJsZVtdOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW107CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZFUU5CX0JhbmREZWZfdCogcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cykgeworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZFUU5CX0dhaW5UYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVkVRTkJfRFRhYmxlW107CiAKICAgICAvKgogICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KICAgICAgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CisgICAgTFZNX0lOVDE2IEdhaW4gPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKKyAgICBMVk1fVUlOVDE2IEZyZXF1ZW5jeSA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7CiAgICAgLyogQXMgbWVudGlvbmVkIGluIGVmZmVjdGJ1bmRsZS5oICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBRRmFjdG9yICAgICA9IChMVk1fRkxPQVQpcEZpbHRlckRlZmluaXRpb24tPlFGYWN0b3IgLyAxMDAuMGY7CisgICAgTFZNX0ZMT0FUIFFGYWN0b3IgPSAoTFZNX0ZMT0FUKXBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yIC8gMTAwLjBmOwogCiAgICAgLyoKICAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCiAgICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7CisgICAgTFZNX0ZMT0FUIFQwOworICAgIExWTV9GTE9BVCBEOworICAgIExWTV9GTE9BVCBBMDsKKyAgICBMVk1fRkxPQVQgQjE7CisgICAgTFZNX0ZMT0FUIEIyOwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwogICAgICAqLwotICAgIFQwID0gRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIGlmIChHYWluID49IDApCi0gICAgewotICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbiArIDE1XTsgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxIC8gKDEgKyBHKSAgaWYgR2FpbmRCIDwgIDAgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107IC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbiArIDE1XTsgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLwogICAgIH0KIAogICAgIC8qCkBAIC0xNjQsNyArMTU4LDcgQEAKICAgICBwQ29lZmZpY2llbnRzLT5BMCA9IDIgKiBBMDsKICAgICBwQ29lZmZpY2llbnRzLT5CMSA9IDIgKiBCMTsKICAgICBwQ29lZmZpY2llbnRzLT5CMiA9IDIgKiBCMjsKLSAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbiArIDE1XTsKKyAgICBwQ29lZmZpY2llbnRzLT5HID0gTFZFUU5CX0dhaW5UYWJsZVtHYWluICsgMTVdOwogCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWRVFOQl9TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKaW5kZXggNjMyOTE4MS4uYzQ0YTliZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmgKQEAgLTIzLDc4ICsyMyw3OCBAQAogLyogR2FpbiB0YWJsZSBmb3IgKDEwXihHYWluLzIwKSAtIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgyMjE3MmYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODAwNDc0ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NzYxMjhmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0ODgxMWYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzE4MTYyZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42ODM3NzJmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY0NTE4N2YpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjAxODkzZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NTMzMTZmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjQ5ODgxM2YpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNDM3NjU5ZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNjkwNDNmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5MjA1NGYpCi0jZGVmaW5lIExWRVFOQl9HYWluX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjA1NjcyZikKLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMDg3NDlmKQotI2RlZmluZSBMVkVRTkJfR2Fpbl8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTIyMDE4ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU4OTI1ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8zX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDEyNTM4ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl80X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTg0ODkzZgotI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzc4Mjc5ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl82X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk1MjYyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl83X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjM4NzIxZgotI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTExODg2ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl85X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuODE4MzgzZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMTYyMjc4ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNTQ4MTM0ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTgxMDcyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgotI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNV9kQiAoLTAuODIyMTcyZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgKC0wLjgwMDQ3NGYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICgtMC43NzYxMjhmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxMl9kQiAoLTAuNzQ4ODExZikKKyNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTFfZEIgKC0wLjcxODE2MmYpCisjZGVmaW5lIExWRVFOQl9HYWluX05lZzEwX2RCICgtMC42ODM3NzJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc5X2RCICgtMC42NDUxODdmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc4X2RCICgtMC42MDE4OTNmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc3X2RCICgtMC41NTMzMTZmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc2X2RCICgtMC40OTg4MTNmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc1X2RCICgtMC40Mzc2NTlmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWc0X2RCICgtMC4zNjkwNDNmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWczX2RCICgtMC4yOTIwNTRmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcyX2RCICgtMC4yMDU2NzJmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxX2RCICgtMC4xMDg3NDlmKQorI2RlZmluZSBMVkVRTkJfR2Fpbl8wX2RCIDAuMDAwMDAwZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCIDAuMTIyMDE4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8yX2RCIDAuMjU4OTI1ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8zX2RCIDAuNDEyNTM4ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl80X2RCIDAuNTg0ODkzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl81X2RCIDAuNzc4Mjc5ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl82X2RCIDAuOTk1MjYyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl83X2RCIDEuMjM4NzIxZgorI2RlZmluZSBMVkVRTkJfR2Fpbl84X2RCIDEuNTExODg2ZgorI2RlZmluZSBMVkVRTkJfR2Fpbl85X2RCIDEuODE4MzgzZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xMF9kQiAyLjE2MjI3OGYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTFfZEIgMi41NDgxMzRmCisjZGVmaW5lIExWRVFOQl9HYWluXzEyX2RCIDIuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAzLjQ2NjgzNmYKKyNkZWZpbmUgTFZFUU5CX0dhaW5fMTRfZEIgNC4wMTE4NzJmCisjZGVmaW5lIExWRVFOQl9HYWluXzE1X2RCIDQuNjIzNDEzZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZyZXF1ZW5jeSB0YWJsZSBmb3IgMipQaS9GcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzg1ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1NzBmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDUyNGYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMzkzZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAyODVmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8yNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDI2MmYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTk2ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxNDJmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzgwMDAgMC4wMDA3ODVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAwLjAwMDU3MGYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwIDAuMDAwNTI0ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgMC4wMDAzOTNmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAwLjAwMDI4NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwIDAuMDAwMjYyZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgMC4wMDAxOTZmCisjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAwLjAwMDE0MmYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwIDAuMDAwMTMxZgogCi0jZGVmaW5lIExWRVFOQl8yUGlPbl84ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA3MWYKLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDY1ZgotI2RlZmluZSBMVkVRTkJfMlBpT25fMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzZmCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzg4MjAwIDAuMDAwMDcxZgorI2RlZmluZSBMVkVRTkJfMlBpT25fOTYwMDAgMC4wMDAwNjVmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xNzY0MDAgMC4wMDAwMzZmCisjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgMC4wMDAwMzNmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS42MjM0MTNmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTg3MmYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2ODM2ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy45ODEwNzJmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0ODEzNGYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMjc4ZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc5X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi44MTgzODNmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTg4NmYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4NzIxZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc2X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS45OTUyNjJmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3ODI3OWYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0ODkzZgotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWczX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS40MTI1MzhmCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODkyNWYKLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIyMDE4ZgotI2RlZmluZSBMVkVRTkJfMTAwRF8wX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDBmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCIDUuNjIzNDEzZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxNF9kQiA1LjAxMTg3MmYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTNfZEIgNC40NjY4MzZmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCIDMuOTgxMDcyZgorI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMV9kQiAzLjU0ODEzNGYKKyNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTBfZEIgMy4xNjIyNzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgMi44MTgzODNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzhfZEIgMi41MTE4ODZmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzdfZEIgMi4yMzg3MjFmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgMS45OTUyNjJmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzVfZEIgMS43NzgyNzlmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzRfZEIgMS41ODQ4OTNmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgMS40MTI1MzhmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzJfZEIgMS4yNTg5MjVmCisjZGVmaW5lIExWRVFOQl8xMDBEX05lZzFfZEIgMS4xMjIwMThmCisjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgMS4wMDAwMDBmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcAppbmRleCA2YmI0YTdlLi43ZTVjYWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcApAQCAtMjEsNiArMjEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgIkxWRVFOQi5oIgogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgpAQCAtMzIsOCArMzMsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KLSNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisjZGVmaW5lIExPV19GUkVRIDI5OCAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgSElHSF9GUkVRIDM4NiAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTYsMjMgKzU3LDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRQYXJhbWV0ZXJzKExWRVFOQl9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICpwUGFyYW1zKQoteworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotCi0gICAvKgorICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKICAgICB9CiAKICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwogCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWRVFOQl9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk2LDIwICs5MywxNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKQoteworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0Q2FwYWJpbGl0aWVzKExWRVFOQl9IYW5kbGVfdCBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAogICAgICpwQ2FwYWJpbGl0aWVzID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXM7CiAKLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTM0LDMzICsxMjgsMzAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkICAgIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0gICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KK3ZvaWQgTFZFUU5CX1NldEZpbHRlcnMoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWRVFOQl9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAgLyogU2FtcGxlIHJhdGUgKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBRIGZhY3RvciAqLworICAgIExWTV9VSU5UMTYgaTsgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVk1fVUlOVDMyIGZzID0KKyAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWRVFOQl9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGVdOyAvKiBTYW1wbGUgcmF0ZSAqLworICAgIExWTV9VSU5UMzIgZmM7ICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIExWTV9JTlQxNiBRRmFjdG9yOyAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KIAogICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOwogCi0gICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyYW1zLT5OQmFuZHM7IGkrKykgewogICAgICAgICAvKgogICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwogICAgICAgICAgKi8KLSAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisgICAgICAgIGZjID0gKExWTV9VSU5UMzIpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeTsgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7IC8qIEdldCB0aGUgYmFuZCBRIGZhY3RvciAqLwogCiAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OyAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBmb3Igb3V0IG9mIHJhbmdlIGZyZXF1ZW5jaWVzCiAgICAgICAgICAqLwotICAgICAgICBpZiAoZmMgPiAoZnMgPj4gMSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGZjID4gKGZzID4+IDEpKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX091dE9mUmFuZ2U7CiAgICAgICAgIH0KIApAQCAtMTY4LDcgKzE1OSw2IEBACiAgICAgICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9uIHRvIHBlcnNpc3RhbnQgbWVtb3J5CiAgICAgICAgICAqLwogICAgICAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0gPSBwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV07Ci0KICAgICB9CiB9CiAKQEAgLTE4Niw0NiArMTc2LDQ0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQotewordm9pZCBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UpIHsKKyAgICBMVk1fVUlOVDE2IGk7ICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuIEJpcXVhZFR5cGU7IC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCi0gICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgQmlxdWFkVHlwZTsgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLwotCisgICAgcEluc3RhbmNlLT5nYWluLnJlc2l6ZShwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMpOwogICAgIC8qCiAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgogICAgICAqLwotICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kczsgaSsrKQotICAgIHsKLQorICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHM7IGkrKykgewogICAgICAgICAvKgogICAgICAgICAgKiBDaGVjayBiYW5kIHR5cGUgZm9yIGNvcnJlY3QgaW5pdGlhbGlzYXRpb24gbWV0aG9kIGFuZCByZWNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAqLwogICAgICAgICBCaXF1YWRUeXBlID0gcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXTsKLSAgICAgICAgc3dpdGNoICAoQmlxdWFkVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7CisgICAgICAgIHN3aXRjaCAoQmlxdWFkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OiB7CisgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCBDb2VmZmljaWVudHM7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgTFZFUU5CX1NpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwgJkNvZWZmaWNpZW50cyk7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5nYWluW2ldID0gQ29lZmZpY2llbnRzLkc7CisgICAgICAgICAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLkEwLCAwLjAsIC0oQ29lZmZpY2llbnRzLkEwKSwgLShDb2VmZmljaWVudHMuQjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgLShDb2VmZmljaWVudHMuQjIpfTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPmVxQmlxdWFkW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29lZmZpY2llbnRzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Vmcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzksMjAgKzIyNyw5IEBACiAvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKLQotICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKLSAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwotCi0gICAgaWYgKE51bVRhcHMgIT0gMCkKLSAgICB7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwordm9pZCBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2UpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBJbnN0YW5jZS0+ZXFCaXF1YWQuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcEluc3RhbmNlLT5lcUJpcXVhZFtpXS5jbGVhcigpOwogICAgIH0KIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjc3LDU2ICsyNTQsNDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICBiQ2hhbmdlICAgID0gTFZNX0ZBTFNFOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgIGkgPSAwOwotICAgIExWRVFOQl9Nb2RlX2VuICAgICAgIE9wZXJhdGluZ01vZGVTYXZlIDsKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZFUU5CX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9JTlQxNiBiQ2hhbmdlID0gTFZNX0ZBTFNFOworICAgIExWTV9JTlQxNiBpID0gMDsKKyAgICBMVkVRTkJfTW9kZV9lbiBPcGVyYXRpbmdNb2RlU2F2ZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKICAgICB9CiAKLSAgICBpZigocFBhcmFtcy0+TkJhbmRzICE9MCkgJiYgKHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbj09TFZNX05VTEwpKQotICAgIHsKKyAgICBpZiAoKHBQYXJhbXMtPk5CYW5kcyAhPSAwKSAmJiAocFBhcmFtcy0+cEJhbmREZWZpbml0aW9uID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIE9wZXJhdGluZ01vZGVTYXZlID0gcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZTsKIAogICAgIC8qIFNldCB0aGUgYWxwaGEgZmFjdG9yIG9mIHRoZSBtaXhlciAqLwotICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpCi0gICAgewotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpIHsKKyAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQllQQVNTX01JWEVSX1RDLCAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JZUEFTU19NSVhFUl9UQywgKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOwogICAgIH0KIAotICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCi0gICAgewotCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgIT0gcFBhcmFtcy0+TkJhbmRzKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMucEJhbmREZWZpbml0aW9uICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbikgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQpKSB7CiAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8Ci0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8Ci0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKLSAgICAgICAgICAgIHsKLQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwUGFyYW1zLT5OQmFuZHM7IGkrKykgeworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uRnJlcXVlbmN5ICE9CisgICAgICAgICAgICAgICAgIHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kpIHx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluKSB8fAorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uUUZhY3RvciAhPSBwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uUUZhY3RvcikpIHsKICAgICAgICAgICAgICAgICBiQ2hhbmdlID0gTFZNX1RSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTMzNSwxOSArMzAzLDI0IEBACiAgICAgLy8gRHVyaW5nIG9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24sIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIG1vZGUKICAgICAvLyBpcyBzdGlsbCBMVkVRTkJfT04sIGJ1dCB0aGUgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZGlzYWJsZWQgaW4gdGhlIHVwcGVyIGxheWVycy4KICAgICAvLyBtb2RlQ2hhbmdlIGhhbmRsZXMgdGhpcyBzcGVjaWFsIHJhY2UgY29uZGl0aW9uLgotICAgIGNvbnN0IGludCAvKiBib29sICovIG1vZGVDaGFuZ2UgPSBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlCi0gICAgICAgICAgICB8fCAoT3BlcmF0aW5nTW9kZVNhdmUgPT0gTFZFUU5CX09OCi0gICAgICAgICAgICAgICAgICAgICYmIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgJiYgTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCk7CisgICAgY29uc3QgaW50IC8qIGJvb2wgKi8gbW9kZUNoYW5nZSA9CisgICAgICAgICAgICBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlIHx8CisgICAgICAgICAgICAoT3BlcmF0aW5nTW9kZVNhdmUgPT0gTFZFUU5CX09OICYmIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gJiYKKyAgICAgICAgICAgICBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAwKTsKKworICAgIC8qCisgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+ZXFCaXF1YWQucmVzaXplKHBQYXJhbXMtPk5CYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4ocFBhcmFtcy0+TnJDaGFubmVscykpOworICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsKIAogICAgIGlmIChiQ2hhbmdlIHx8IG1vZGVDaGFuZ2UpIHsKLQogICAgICAgICAvKgogICAgICAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgaGFzIGNoYW5nZWQgY2xlYXIgdGhlIGhpc3RvcnkKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5ICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgLyogQ2xlYXIgdGhlIGhpc3RvcnkgKi8KICAgICAgICAgfQogCiAgICAgICAgIC8qCkBAIC0zNTgsNDUgKzMzMSw0NSBAQAogICAgICAgICAvKgogICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBleGNlcHQgaWYgdGhlIGFsZ28gaXMgc3dpdGNoZWQgb2ZmCiAgICAgICAgICAqLwotICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWRVFOQl9CWVBBU1MpeworICAgICAgICBpZiAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkVRTkJfQllQQVNTKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUmVzZXQgdGhlIGZpbHRlcnMgYXMgYWxsIHBhcmFtZXRlcnMgY291bGQgaGF2ZSBjaGFuZ2VkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWRVFOQl9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIExWRVFOQl9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAvKiBOZXcgcGFyYW1ldGVycyAqLwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKHBJbnN0YW5jZSk7IC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KICAgICAgICAgfQogCiAgICAgICAgIGlmIChtb2RlQ2hhbmdlKSB7Ci0gICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikgewogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDEuMGYpOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAuMGYpOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KICAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBpbnRyb2R1Y2UgYSBzdGF0ZSByYWNlIGNvbmRpdGlvbiBpZiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQgYWdhaW4KICAgICAgICAgICAgICAgICAvLyB3aGlsZSBpbiB0cmFuc2l0aW9uLiAgVGhpcyBpcyBmaXhlZCBpbiB0aGUgbW9kZUNoYW5nZSBsb2dpYy4KICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAuMGYpOwogICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IDE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQllQQVNTX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwogICAgICAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9UUlVFOwogICAgICAgICB9Ci0KICAgICB9Ci0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWRVFOQl9TVUNDRVNTKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDgsMjMgKzM4MSwyMiBAQAogLyogIHRyYW5zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrICh2b2lkKiBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IENhbGxiYWNrUGFyYW0pCi17Ci0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrICA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrOworTFZNX0lOVDMyIExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKSB7CisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWTV9DYWxsYmFjayBDYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrOwogCi0gICAgKHZvaWQpIHBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClwR2VuZXJhbFB1cnBvc2U7CiAKLSAgICAgLyoKLSAgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKLSAgICAgICovCi0gICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApICYmCi0gICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworICAgIC8qCisgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKKyAgICAgKi8KKyAgICBpZiAoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApICYmCisgICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKSB7CiAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwotICAgICAgICBpZiAoQ2FsbEJhY2sgIT0gTFZNX05VTEwpewotICAgICAgICAgICAgQ2FsbEJhY2socEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwgQUxHT1JJVEhNX0VRTkJfSUR8TFZFUU5CX0VWRU5UX0FMR09GRik7CisgICAgICAgIGlmIChDYWxsQmFjayAhPSBMVk1fTlVMTCkgeworICAgICAgICAgICAgQ2FsbEJhY2socEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIEFMR09SSVRITV9FUU5CX0lEIHwgTFZFUU5CX0VWRU5UX0FMR09GRik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAKaW5kZXggMjcxYTkxNC4uMzQ3MzI2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAKQEAgLTIxLDMwMiArMjEsMTI3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiTFZFUU5CLmgiCiAjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJJbnN0QWxsb2MuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4gLyogRm9yIG1lbXNldCAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7Ci0KLSAgICBpZigocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKXx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfSU5TVEFOQ0VfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0YW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpKTsKLSAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOwotICAgICAgICAvKiBCaXF1YWQgdHlwZXMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0YW50IGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0NPRUZfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgPSBMVk1fTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIFdoZW4gcENhcGFiaWxpdGllcyBvciBwTWVtb3J5VGFibGVpcyBvciBwaEluc3RhbmNlIGFyZSBOVUxMICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZm9yIGEgbWVtb3J5IHJlZ2lvbiB3aXRoIGEgbm9uLXplcm8gc2l6ZS4gICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAtIG1hbGxvYyBmYWlsdXJlICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0luaXQoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoteworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCogcENhcGFiaWxpdGllcywgdm9pZCogcFNjcmF0Y2gpIHsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlOwogCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgTWVtU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgaTsKKyAgICAqcGhJbnN0YW5jZSA9IG5ldyBMVkVRTkJfSW5zdGFuY2VfdHt9OworICAgIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopKnBoSW5zdGFuY2U7CiAKLSAgICAvKgotICAgICAqIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkVRTkJfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAotICAgICAqLwotCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKLQotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOwotICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KICAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZSBhbmQKLSAgICAgKiBzZXQgdGhlIHN0cnVjdHVyZSBwb2ludGVycwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgICAgPSAqcE1lbW9yeVRhYmxlOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBjb2VmZmljaWVudCBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CisgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IHBTY3JhdGNoOwogCiAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLwotICAgIHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQgPSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBkYXRhIG1lbW9yeQotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzKTsKLQotICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgPSAoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwotICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpOwotICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyAgPSAoTFZFUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CisgICAgTFZNX1VJTlQzMiBNZW1TaXplID0gcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoKihwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMpKTsKKyAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgPSAoTFZFUU5CX0JhbmREZWZfdCopY2FsbG9jKDEsIE1lbVNpemUpOworICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CiAgICAgLy8gY2xlYXIgYWxsIHRoZSBiYW5kcywgc2V0dGluZyB0aGVpciBnYWluIHRvIDAsIG90aGVyd2lzZSB3aGVuIGFwcGx5aW5nIG5ldyBwYXJhbXMsCiAgICAgLy8gaXQgd2lsbCBjb21wYXJlIGFnYWluc3QgdW5pbml0aWFsaXplZCB2YWx1ZXMKICAgICBtZW1zZXQocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zLCAwLCBNZW1TaXplKTsKLSAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSk7Ci0gICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IChMVkVRTkJfQmlxdWFkVHlwZV9lbiAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwogCi0gICAgLyoKLSAgICAgKiBJbnRlcm5hbGx5IG1hcCwgc3RydWN0dXJlIGFuZCBhbGxpZ24gc2NyYXRjaCBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOworICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoKihwSW5zdGFuY2UtPnBCaXF1YWRUeXBlKSkpOworICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPSAoTFZFUU5CX0JpcXVhZFR5cGVfZW4qKWNhbGxvYygxLCBNZW1TaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KIAotICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9GTE9BVCopcFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kcyAgICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkVRTkJfQllQQVNTOwogICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9GU184MDAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9TVEVSRU87CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWRVFOQl9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKICAgICAgKi8KLSAgICBMVkVRTkJfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgdHlwZXMgKi8KKyAgICBMVkVRTkJfU2V0RmlsdGVycyhwSW5zdGFuY2UsIC8qIFNldCB0aGUgZmlsdGVyIHR5cGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKIAotICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLQotICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkocEluc3RhbmNlKTsgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgZmlsdGVyIGhpc3RvcnkgKi8KLQogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSAodm9pZCopcEluc3RhbmNlOwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2s7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDA7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9ICh2b2lkKilwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKIAotICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0gICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwLCBMVk1fRlNfODAwMCwgMik7CiAKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgMS4wZik7CiAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOwogCi0gICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgID0gTFZNX0ZBTFNFOworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CiAKLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZFUU5CX1NVQ0NFU1MpOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIExWRVFOQl9Jbml0IGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAordm9pZCBMVkVRTkJfRGVJbml0KExWRVFOQl9IYW5kbGVfdCogcGhJbnN0YW5jZSkgeworICAgIExWRVFOQl9JbnN0YW5jZV90KiBwSW5zdGFuY2U7CisgICAgaWYgKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QqKSpwaEluc3RhbmNlOworCisgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wQmlxdWFkVHlwZSAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUpOworICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gTFZNX05VTEw7CisgICAgfQorICAgIGRlbGV0ZSBwSW5zdGFuY2U7CisgICAgKnBoSW5zdGFuY2UgPSBMVk1fTlVMTDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA0MGZhY2ZiLi4yMjI1ZmVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC0yNCw3ICsyNCw4IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiTFZFUU5CLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhbGxpbmcgb3IgQXBwbGljYXRpb24gbGF5ZXIgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVkVRTkIuaCIgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLwogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWQ19NaXhlci5oIgogCkBAIC0zNSwyMSArMzYsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgTFZFUU5CX0lOVkFMSUQgICAgICAgICAgICAgIDB4RkZGRiAgICAgICAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwotCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLwotI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0vKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDIpCi0jZWxzZQotI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZW5kaWYKLSNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hfQUxJR04gICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCi0KLSNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAgICAgIDEwMCAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIFRDICovCisjZGVmaW5lIExWRVFOQl9JTlZBTElEIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAxMDAgLyogQnlwYXNzIE1peGVyIFRDICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OCwxMyArNDYsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKK3R5cGVkZWYgZW51bSB7CiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdCA9IC0xLAogICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb24gPSAwLAogICAgIExWRVFOQl9Eb3VibGVQcmVjaXNpb24gPSAxLAotICAgIExWRVFOQl9PdXRPZlJhbmdlICAgICAgPSAyLAotICAgIExWRVFOQl9CSVFVQURUWVBFX01BWCAgPSBMVk1fTUFYSU5UXzMyCisgICAgTFZFUU5CX091dE9mUmFuZ2UgPSAyLAorICAgIExWRVFOQl9CSVFVQURUWVBFX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0JpcXVhZFR5cGVfZW47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzQsMjggKzYxLDI4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCisgICAgdm9pZCogcFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KKyAgICBMVkVRTkJfUGFyYW1zX3QgUGFyYW1zOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgTFZFUU5CX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBBbGlnbmVkIG1lbW9yeSBwb2ludGVycyAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAqcEZhc3RUZW1wb3Jhcnk7ICAgICAgICAvKiBGYXN0IHRlbXBvcmFyeSBkYXRhIGJhc2UgYWRkcmVzcyAqLworICAgIExWTV9GTE9BVCogcEZhc3RUZW1wb3Jhcnk7IC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCiAKLSAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwRVFOQl9UYXBzX0Zsb2F0OyAgICAgICAgLyogRXF1YWxpc2VyIFRhcHMgKi8KLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdDsgLyogU3RhdGUgZm9yIGVhY2ggZmlsdGVyIGJhbmQgKi8KKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBlcUJpcXVhZDsgICAgICAgICAgICAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlcyAqLworICAgIHN0ZDo6dmVjdG9yPExWTV9GTE9BVD4gZ2FpbjsgLyogR2FpbiB2YWx1ZXMgZm9yIGFsbCBiYW5kcyovCiAKICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIGNhbGwgYmFjayAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICAgICAgTkJhbmRzOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KLSAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgICAgICpwQmFuZERlZmluaXRpb25zOyAgLyogRmlsdGVyIGJhbmQgZGVmaW5pdGlvbnMgKi8KLSAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiAgICAgICAgICAgICpwQmlxdWFkVHlwZTsgICAgICAgLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLworICAgIExWTV9VSU5UMTYgTkJhbmRzOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLworICAgIExWRVFOQl9CYW5kRGVmX3QqIHBCYW5kRGVmaW5pdGlvbnM7IC8qIEZpbHRlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4qIHBCaXF1YWRUeXBlOyAgLyogRmlsdGVyIGJpcXVhZCB0eXBlcyAqLwogCiAgICAgLyogQnlwYXNzIHZhcmlhYmxlICovCi0gICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICBCeXBhc3NNaXhlcjsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgQnlwYXNzTWl4ZXI7CiAKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCisgICAgTFZNX0lOVDE2IGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KIAogfSBMVkVRTkJfSW5zdGFuY2VfdDsKIApAQCAtMTA1LDE3ICs5MiwxNSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpOwordm9pZCBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCogcEluc3RhbmNlLCBMVkVRTkJfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi12b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSk7Cit2b2lkIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSk7CiAKLXZvaWQgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShMVkVRTkJfSW5zdGFuY2VfdCAqcEluc3RhbmNlKTsKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cyk7Cit2b2lkIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSk7CitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZFUU5CX0JhbmREZWZfdCogcEZpbHRlckRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cyk7CiAKLUxWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkICpwR2VuZXJhbFB1cnBvc2UsIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKTsKK0xWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayh2b2lkKiBoSW5zdGFuY2UsIHZvaWQqIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CiAKICNlbmRpZiAvKiBfX0xWRVFOQl9QUklWQVRFX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwCmluZGV4IDY1ZWZmNTMuLmIxNzdkZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIFNISUZUICAgICAgIDEzCisjZGVmaW5lIFNISUZUIDEzCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OCw4OSArNTgsNjAgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwotICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCi0gICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZWxzZQotICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgorTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcygKKyAgICAgICAgTFZFUU5CX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSB7ICAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCisgICAgTFZFUU5CX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKICAgICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCi0gICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLwotICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQotICAgIHsKKyAgICBpZiAoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkgewogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CisgICAgTFZNX0ZMT0FUKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQotICAgICovCi0gICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICAgIHsKKyAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICovCisgICAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7CiAgICAgICAgIHJldHVybiBMVkVRTkJfVE9PTUFOWVNBTVBMRVM7CiAgICAgfQogCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQotICAgIHsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pIHsKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoTFZNX1VJTlQxNiBpID0gMDsgaSA8IHBJbnN0YW5jZS0+TkJhbmRzOyBpKyspCi0gICAgICAgICAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKExWTV9VSU5UMTYgaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBDaGVjayBpZiBiYW5kIGlzIG5vbi16ZXJvIGRCIGdhaW4KICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLkdhaW4gIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOwotCisgICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBUZW1wID0gcFNjcmF0Y2ggKyBOclNhbXBsZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5lcUJpcXVhZFtpXS5wcm9jZXNzKHBUZW1wLCBwU2NyYXRjaCwgTnJGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gZ2FpbiA9IHBJbnN0YW5jZS0+Z2FpbltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgTnJTYW1wbGVzOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2hbal0gKz0gcFRlbXBbal0gKiBnYWluOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNTAsNDQgKzEyMSwyNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7Ci0jZW5kaWYKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpIHsKKyAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLCBwU2NyYXRjaCwgcEluRGF0YSwgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwogICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNleworICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyoKICAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgICAgICAgICAgICAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKSB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBBbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIExWRVFOQl9TVUNDRVNTOwotCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmNwcAppbmRleCAwNjI4MTE0Li5kNzlkN2M5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jcHAKQEAgLTM1LDIwICszNSw5IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1jb25zdCBMVk1fVUlOVDMyICAgIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKLX07Citjb25zdCBMVk1fVUlOVDMyIExWRVFOQl9TYW1wbGVSYXRlVGFiW10gPSB7ODAwMCwgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01OSw3NCArNDgsMzQgQEAKIC8qCiAgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKICAqLwotY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXSA9IHtMVkVRTkJfMlBpT25fODAwMCwgICAgICAvKiA4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTEwMjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjIwNTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80ODAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fODgyMDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xNzY0MDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE5MjAwMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0geworICAgICAgICBMVkVRTkJfMlBpT25fODAwMCwgLyogOGtTL3MgKi8KKyAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LCBMVkVRTkJfMlBpT25fMTIwMDAsIExWRVFOQl8yUGlPbl8xNjAwMCwgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLCBMVkVRTkJfMlBpT25fMzIwMDAsIExWRVFOQl8yUGlPbl80NDEwMCwgIExWRVFOQl8yUGlPbl80ODAwMCwKKyAgICAgICAgTFZFUU5CXzJQaU9uXzg4MjAwLCBMVkVRTkJfMlBpT25fOTYwMDAsIExWRVFOQl8yUGlPbl8xNzY0MDAsIExWRVFOQl8yUGlPbl8xOTIwMDB9OwogCiAvKgogICogR2FpbiB0YWJsZQogICovCi1jb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9HYWluVGFibGVbXSA9IHtMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzExX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTBfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc5X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc2X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWczX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8wX2RCLCAgICAgICAgICAgIC8qIDBkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl80X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl83X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzExX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTVfZEJ9OyAgICAgICAgICAvKiArMTVkQiBnYWluICovCitjb25zdCBMVk1fRkxPQVQgTFZFUU5CX0dhaW5UYWJsZVtdID0geworICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxNF9kQiwgTFZFUU5CX0dhaW5fTmVnMTNfZEIsIExWRVFOQl9HYWluX05lZzEyX2RCLCBMVkVRTkJfR2Fpbl9OZWcxMV9kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTBfZEIsIExWRVFOQl9HYWluX05lZzlfZEIsICBMVkVRTkJfR2Fpbl9OZWc4X2RCLCAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fTmVnNl9kQiwgIExWRVFOQl9HYWluX05lZzVfZEIsICBMVkVRTkJfR2Fpbl9OZWc0X2RCLCAgTFZFUU5CX0dhaW5fTmVnM19kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fTmVnMl9kQiwgIExWRVFOQl9HYWluX05lZzFfZEIsICBMVkVRTkJfR2Fpbl8wX2RCLCAvKiAwZEIgZ2FpbiAqLworICAgICAgICBMVkVRTkJfR2Fpbl8xX2RCLCAgICAgTFZFUU5CX0dhaW5fMl9kQiwgICAgIExWRVFOQl9HYWluXzNfZEIsICAgICBMVkVRTkJfR2Fpbl80X2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLCAgICAgTFZFUU5CX0dhaW5fNl9kQiwgICAgIExWRVFOQl9HYWluXzdfZEIsICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICBMVkVRTkJfR2Fpbl85X2RCLCAgICAgTFZFUU5CX0dhaW5fMTBfZEIsICAgIExWRVFOQl9HYWluXzExX2RCLCAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgTFZFUU5CX0dhaW5fMTNfZEIsICAgIExWRVFOQl9HYWluXzE0X2RCLCAgICBMVkVRTkJfR2Fpbl8xNV9kQn07IC8qICsxNWRCIGdhaW4gKi8KIC8qCiAgKiBEIHRhYmxlIGZvciAxMDAgLyAoR2FpbiArIDEpCiAgKi8KLWNvbnN0IExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTBfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzhfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzVfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCitjb25zdCBMVk1fRkxPQVQgTFZFUU5CX0RUYWJsZVtdID0geworICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNV9kQiwgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwgTFZFUU5CXzEwMERfTmVnMTNfZEIsIExWRVFOQl8xMDBEX05lZzEyX2RCLCBMVkVRTkJfMTAwRF9OZWcxMV9kQiwKKyAgICAgICAgTFZFUU5CXzEwMERfTmVnMTBfZEIsIExWRVFOQl8xMDBEX05lZzlfZEIsICBMVkVRTkJfMTAwRF9OZWc4X2RCLCAgTFZFUU5CXzEwMERfTmVnN19kQiwKKyAgICAgICAgTFZFUU5CXzEwMERfTmVnNl9kQiwgIExWRVFOQl8xMDBEX05lZzVfZEIsICBMVkVRTkJfMTAwRF9OZWc0X2RCLCAgTFZFUU5CXzEwMERfTmVnM19kQiwKKyAgICAgICAgTFZFUU5CXzEwMERfTmVnMl9kQiwgIExWRVFOQl8xMDBEX05lZzFfZEIsICBMVkVRTkJfMTAwRF8wX2RCfTsgLyogMGRCIGdhaW4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRmlsdGVyIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0MiwxMyArOTEsMTMgQEAKICAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKICAqICsxLjAgdG8gLTEuMAogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Db3NDb2VmW10gPSB7MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLworY29uc3QgTFZNX0lOVDE2IExWRVFOQl9Db3NDb2VmW10gPSB7MywgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgLyogYTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgLyogYTUgKi8KIAogLyoKICAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKQEAgLTE2NCw5ICsxMTMsOCBAQAogICoKICAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9EUENvc0NvZWZbXSA9IHsxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotCitjb25zdCBMVk1fSU5UMTYgTFZFUU5CX0RQQ29zQ29lZltdID0gezEsICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQ0fTsgIC8qIGEzICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5oCmluZGV4IGE3MWVlYjkuLmFiNTExOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5oCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1leHRlcm4gY29uc3QgTFZNX1VJTlQzMiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOCwxNyArMzgsMTcgQEAKIC8qCiAgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOwogCiAvKgogICogR2FpbiB0YWJsZQogICovCi1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVkVRTkJfR2FpblRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWRVFOQl9HYWluVGFibGVbXTsKIAogLyoKICAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0RUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCBMVkVRTkJfRFRhYmxlW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjUsNyArNjUsNyBAQAogICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQogICogKzEuMCB0byAtMS4wCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9Db3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWRVFOQl9Db3NDb2VmW107CiAKIC8qCiAgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246CkBAIC04MSw2ICs4MSw2IEBACiAgKgogICogQ29zKHgpID0gMS4wIC0gQ29zRXJyKHgpCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9EUENvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZFUU5CX0RQQ29zQ29lZltdOwogCiAjZW5kaWYgLyogX19MVkVRTkJfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKaW5kZXggOGM5MWVhOS4uODJlOTRkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCkBAIC00MSwxMSArNDEsMTEgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lIExWUkVWX0JMT0NLU0laRV9NVUxUSVBMRSAgICAgICAgICAgICAgICAxICAgICAgIC8qIFByb2Nlc3NpbmcgYmxvY2sgc2l6ZSBtdWx0aXBsZSAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAvKiBNYXhpbXVtIGRlY2F5IHRpbWUgaXMgNzAwMG1zICovCisjZGVmaW5lIExWUkVWX0JMT0NLU0laRV9NVUxUSVBMRSAxIC8qIFByb2Nlc3NpbmcgYmxvY2sgc2l6ZSBtdWx0aXBsZSAqLworI2RlZmluZSBMVlJFVl9NQVhfVDYwIDcwMDAgICAgICAgICAvKiBNYXhpbXVtIGRlY2F5IHRpbWUgaXMgNzAwMG1zICovCiAKIC8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWUkVWX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICA0ICAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLworI2RlZmluZSBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUyA0IC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTMsMjQgKzUzLDIyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogSW5zdGFuY2UgaGFuZGxlICovCi10eXBlZGVmIHZvaWQgKkxWUkVWX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBMVlJFVl9IYW5kbGVfdDsKIAogLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUkVWX1NVQ0NFU1MgICAgICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIExWUkVWX05VTExBRERSRVNTICAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLwotICAgIExWUkVWX09VVE9GUkFOR0UgICAgICAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXQgb2YgcmFuZ2UgY29udHJvbCBwYXJhbWV0ZXIgKi8KLSAgICBMVlJFVl9JTlZBTElETlVNU0FNUExFUyAgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlJFVl9TVUNDRVNTID0gMCwgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCisgICAgTFZSRVZfTlVMTEFERFJFU1MgPSAxLCAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWUkVWX09VVE9GUkFOR0UgPSAyLCAgICAgICAgLyogT3V0IG9mIHJhbmdlIGNvbnRyb2wgcGFyYW1ldGVyICovCisgICAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgPSAzLCAvKiBJbnZhbGlkIG51bWJlciBvZiBzYW1wbGVzICovCiAgICAgTFZSRVZfUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZSRVZfUmV0dXJuU3RhdHVzX2VuOwogCiAvKiBSZXZlcmIgZGVsYXkgbGluZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUkVWX0RFTEFZTElORVNfMSAgICAgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPbmUgZGVsYXkgbGluZSAqLwotICAgIExWUkVWX0RFTEFZTElORVNfMiAgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUd28gZGVsYXkgbGluZXMgKi8KLSAgICBMVlJFVl9ERUxBWUxJTkVTXzQgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm91ciBkZWxheSBsaW5lcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlJFVl9ERUxBWUxJTkVTXzEgPSAxLCAvKiBPbmUgZGVsYXkgbGluZSAqLworICAgIExWUkVWX0RFTEFZTElORVNfMiA9IDIsIC8qIFR3byBkZWxheSBsaW5lcyAqLworICAgIExWUkVWX0RFTEFZTElORVNfNCA9IDQsIC8qIEZvdXIgZGVsYXkgbGluZXMgKi8KICAgICBMVlJFVl9ERUxBWUxJTkVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZSRVZfTnVtRGVsYXlMaW5lc19lbjsKIApAQCAtODAsNDEgKzc4LDMzIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9NZW1vcnlSZWdpb25fc3QgICAgICAgIFJlZ2lvbltMVlJFVl9OUl9NRU1PUllfUkVHSU9OU107ICAvKiBPbmUgZGVmaW5pdGlvbiBmb3IgZWFjaCByZWdpb24gKi8KLX0gTFZSRVZfTWVtb3J5VGFibGVfc3Q7Ci0KIC8qIENvbnRyb2wgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZTsgICAgICAgICAgLyogT3BlcmF0aW5nIG1vZGUgKi8KLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgKi8KLSAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0ICovCisgICAgTFZNX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsgIC8qIE9wZXJhdGluZyBtb2RlICovCisgICAgTFZNX0ZzX2VuIFNhbXBsZVJhdGU7ICAgICAgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX0Zvcm1hdF9lbiBTb3VyY2VGb3JtYXQ7IC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLwogCiAgICAgLyogUGFyYW1ldGVycyBmb3IgUkVWICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIExldmVsOyAgICAgICAgICAgICAgICAgIC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgTFBGOyAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyLCBpbiBIeiAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBIUEY7ICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyLCBpbiBIeiAqLworICAgIExWTV9VSU5UMTYgTGV2ZWw7IC8qIExldmVsLCAwIHRvIDEwMCByZXByZXNlbnRpbmcgcGVyY2VudGFnZSBvZiByZXZlcmIgKi8KKyAgICBMVk1fVUlOVDMyIExQRjsgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCisgICAgTFZNX1VJTlQzMiBIUEY7ICAgLyogSGlnaCBwYXNzIGZpbHRlciwgaW4gSHogKi8KIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEYW1waW5nOyAgICAgICAgICAgICAgICAvKiBEYW1waW5nICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFJvb21TaXplOyAgICAgICAgICAgICAgIC8qIFNpbXVsYXRlZCByb29tIHNpemUsIDEgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gc2l6ZSAqLworICAgIExWTV9VSU5UMTYgVDYwOyAgICAgIC8qIERlY2F5IHRpbWUgY29uc3RhbnQsIGluIG1zICovCisgICAgTFZNX1VJTlQxNiBEZW5zaXR5OyAgLyogRWNobyBkZW5zaXR5LCAwIHRvIDEwMCBmb3IgbWluaW11bSB0byBtYXhpbXVtIGRlbnNpdHkgKi8KKyAgICBMVk1fVUlOVDE2IERhbXBpbmc7ICAvKiBEYW1waW5nICovCisgICAgTFZNX1VJTlQxNiBSb29tU2l6ZTsgLyogU2ltdWxhdGVkIHJvb20gc2l6ZSwgMSB0byAxMDAgZm9yIG1pbmltdW0gdG8gbWF4aW11bSBzaXplICovCiAKIH0gTFZSRVZfQ29udHJvbFBhcmFtc19zdDsKIAogLyogSW5zdGFuY2UgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsgICAgICAgICAgIC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCisgICAgTFZNX1VJTlQxNiBNYXhCbG9ja1NpemU7IC8qIE1heGltdW0gcHJvY2Vzc2luZyBibG9jayBzaXplICovCiAKICAgICAvKiBSZXZlcmIgKi8KLSAgICBMVk1fRm9ybWF0X2VuICAgICAgICAgICAgICAgU291cmNlRm9ybWF0OyAgICAgICAgICAgLyogU291cmNlIGRhdGEgZm9ybWF0cyB0byBzdXBwb3J0ICovCi0gICAgTFZSRVZfTnVtRGVsYXlMaW5lc19lbiAgICAgIE51bURlbGF5czsgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2YgZGVsYXkgbGluZXMsIDEsIDIgb3IgNCAqLworICAgIExWTV9Gb3JtYXRfZW4gU291cmNlRm9ybWF0OyAgICAgICAvKiBTb3VyY2UgZGF0YSBmb3JtYXRzIHRvIHN1cHBvcnQgKi8KKyAgICBMVlJFVl9OdW1EZWxheUxpbmVzX2VuIE51bURlbGF5czsgLyogVGhlIG51bWJlciBvZiBkZWxheSBsaW5lcywgMSwgMiBvciA0ICovCiAKIH0gTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3Q7CiAKQEAgLTEyNiw0NiArMTE2LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBMVlJFViBtb2R1bGUgbWVtb3J5IHJlcXVpcmVtZW50cyB0byBzdXBwb3J0ICAgICAqLwotLyogIG1lbW9yeSBhbGxvY2F0aW9uLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJldHVybiB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwcm92aWRlZCAgICovCi0vKiAgZHVyaW5nIG1lbW9yeSBhbGxvY2F0aW9uIHRvIHN1cHBvcnQgZnJlZWluZyBvZiBtZW1vcnkgd2hlbiB0aGUgTFZSRVYgbW9kdWxlIGlzIG5vICAgKi8KLS8qICBsb25nZXIgcmVxdWlyZWQuIEl0IGlzIGNhbGxlZCBpbiB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIGFsbG9jYXRlZCAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSBhZGRyZXNzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaEluc3RhbmNlID0gTlVMTCB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwb2ludGVycyAqLwotLyogIHdpbGwgYmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWVpbmcgbWVtb3J5LCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUgdGhlICAgICAqLwotLyogIG1lbW9yeSB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyAgICAgICAgICAgICovCi0vKiAgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwTWVtb3J5VGFibGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHJlcXVlc3RpbmcgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgcEluc3RhbmNlUGFyYW1zICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldE1lbW9yeVRhYmxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICpwSW5zdGFuY2VQYXJhbXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTc5LDcgKzEyOSw2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwSW5zdGFuY2VQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE5MCw5ICsxMzksMjUgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZShMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgICpwSW5zdGFuY2VQYXJhbXMpOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90KiBwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0KiBwSW5zdGFuY2VQYXJhbXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0ZyZWVJbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBhbGxvY2F0aW9ucyBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgZnJlZSBpbnN0YW5jZSBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfRnJlZUluc3RhbmNlKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMTQsOCArMTc5LDggQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0KiBwQ29udHJvbFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzYsOCArMjAxLDggQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcE5ld1BhcmFtcyk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QqIHBOZXdQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjU3LDcgKzIyMiw3IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSk7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI4MCwxMSArMjQ1LDkgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgY29uc3QgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKIAotI2VuZGlmICAgICAgLyogX19MVlJFVl9IX18gKi8KKyNlbmRpZiAvKiBfX0xWUkVWX0hfXyAqLwogCiAvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcAppbmRleCAxZjBkMzliLi5iNzg4M2Y1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcApAQCAtMjAsNiArMjAsOCBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkZpbHRlci5oIgogCkBAIC00MSwxNjAgKzQzLDEzMCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCi17Ci0KLSAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKLSAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QqIHBQcml2YXRlKSB7CisgICAgTFZNX01vZGVfZW4gT3BlcmF0aW5nTW9kZTsKKyAgICBMVk1fSU5UMzIgTnVtYmVyT2ZEZWxheUxpbmVzOwogCiAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLwotICAgIGlmKHBQcml2YXRlID09IExWTV9OVUxMKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUgPT0gTFZNX05VTEwpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIE9wZXJhdGluZ01vZGUgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGU7CiAKLSAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7CisgICAgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDQ7Ci0gICAgfQotICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgeworICAgIH0gZWxzZSBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBoaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cwogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuSFBGKSAgICAgICAgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7Ci0gICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkhQRikgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9GTE9BVCBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCBDb2VmZnM7CiAKICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CiAgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOwotICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgY29uc3Qgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgIENvZWZmcy5BMCwgQ29lZmZzLkExLCAwLjAsIC0oQ29lZmZzLkIxKSwgMC4wfTsKKyAgICAgICAgcFByaXZhdGUtPnBSZXZIUEZCaXF1YWQucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihGQ0NfMSwgY29lZnMpKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cwogICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7Ci0gICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxQRikgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9GTE9BVCBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCBDb2VmZnM7CiAKICAgICAgICAgQ29lZmZzLkEwID0gMTsKICAgICAgICAgQ29lZmZzLkExID0gMDsKICAgICAgICAgQ29lZmZzLkIxID0gMDsKLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYgPD0gKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKSB7CiAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpIHsKICAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgJkNvZWZmcyk7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgY29uc3Qgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgIENvZWZmcy5BMCwgQ29lZmZzLkExLCAwLjAsIC0oQ29lZmZzLkIxKSwgMC4wfTsKKyAgICAgICAgcFByaXZhdGUtPnBSZXZMUEZCaXF1YWQucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihGQ0NfMSwgY29lZnMpKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgcm9vbSBzaXplIHBhcmFtZXRlcgogICAgICAqLwotICAgIGlmKCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgewogICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcwogICAgICAgICAgKiAwJSAgIC0tIDEwbXMKICAgICAgICAgICogNTAlICAtLSA2NW1zCiAgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKICAgICAgICAgICovCi0gICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7CisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgKiAxMSkgKyA1KSAvIDEwKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCiAgICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CiAgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotCi0gICAgICAgIExWTV9VSU5UMzIgIFRlbXA7Ci0gICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOwotICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwotICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKLSAgICAgICAgTFZNX0lOVDE2ICAgaTsKLSAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKLSAgICAgICAgTFZNX0lOVDE2ICAgTWF4VF9EZWxheVtdICA9IHtMVlJFVl9NQVhfVDBfREVMQVksIExWUkVWX01BWF9UMV9ERUxBWSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMl9ERUxBWSwgTFZSRVZfTUFYX1QzX0RFTEFZfTsKLSAgICAgICAgTFZNX0lOVDE2ICAgTWF4QVBfRGVsYXlbXSA9IHtMVlJFVl9NQVhfQVAwX0RFTEFZLCBMVlJFVl9NQVhfQVAxX0RFTEFZLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX1VJTlQzMiBUZW1wOworICAgICAgICBMVk1fSU5UMzIgQVBEZWxheVNpemU7CisgICAgICAgIExWTV9JTlQzMiBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOworICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgTFZNX0ZMT0FUIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CiAKICAgICAgICAgLyoKICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQogICAgICAgICAgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wMTsgIC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7IC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLwogCi0gICAgICAgICAgICAgICAgVGVtcDE9KExWTV9GTE9BVClEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICAgICAgVGVtcDEgPSAoTFZNX0ZMT0FUKURlbGF5TGVuZ3RoU2FtcGxlczsKICAgICAgICAgICAgICAgICBUZW1wID0gKExWTV9VSU5UMzIpKFRlbXAxICogU2NhbGVUYWJsZVtpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBUZW1wID0gRGVsYXlMZW5ndGhTYW1wbGVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQVBEZWxheVNpemUgPSBUZW1wICAvIDE1MDA7CisgICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgLyAxNTAwOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQogICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKKyAgICAgICAgICAgIFRlbXAgPSAoTFZSRVZfTUFYX1RfREVMQVlbaV0gLSBMVlJFVl9NQVhfQVBfREVMQVlbaV0pICogRnMgLyAxOTIwMDA7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+RGVsYXlfQVBbaV0gPSBwUHJpdmF0ZS0+VFtpXSAtIFRlbXA7CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBTZXQgdGhlIHRhcCBzZWxlY3Rpb24KICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikgewogICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIHRhcCBCICovCi0gICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXAgLSBBUERlbGF5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2ldID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFRlbXAgLSBBUERlbGF5U2l6ZV07CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldID0gQVBEZWxheVNpemU7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMDsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAxLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQiB0byB0YXAgQSAqLwotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wIC0gQVBEZWxheVNpemVdOwotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSA9IEFQRGVsYXlTaXplOwogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMS4wZjsKICAgICAgICAgICAgIH0KQEAgLTIwMiwyMiArMTc0LDE3IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogU2V0IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gdGhlIHNtYWxsZXN0IGRlbGF5IHNpemUKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiAgID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKQotICAgICAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IFRlbXA7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSkgewogICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKSB7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikgewogICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsKICAgICAgICAgfQogCkBAIC0yMjYsOCArMTkzLDcgQEAKICAgICAgICAgICovCiAgICAgICAgIC8qIEp1c3QgYXMgYSBwcmVjYXVzaW9uLCBidXQgbm8gcHJvYmxlbSBpZiB3ZSByZW1vdmUgdGhpcyBsaW5lICAgICAgKi8KICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5NYXhCbGtMZW4gLSAyOwotICAgICAgICBpZihwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk1heEJsb2NrU2l6ZSkKLSAgICAgICAgeworICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5NYXhCbG9ja1NpemUpIHsKICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5NYXhCbG9ja1NpemU7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMzUsNzIgKzIwMSw2MSBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQKICAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EYW1waW5nKSAgICB8fAorICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpIHx8CiAgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotCi0gICAgICAgIExWTV9JTlQzMiAgICAgICBUZW1wOwotICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7Ci0gICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgIGk7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICBEYW1waW5nICAgICAgPSAoTFZNX0lOVDE2KSgocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICogMTAwKSArIDEwMDApOwotICAgICAgICBMVk1fRkxPQVQgICAgICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl8wX29uXzQsIExWUkVWX1RfM19Qb3dlcl8xX29uXzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNH07CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkpIHsKKyAgICAgICAgTFZNX0lOVDMyIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCBPbWVnYTsKKyAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCBDb2VmZnM7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBMVk1fSU5UMTYgRGFtcGluZyA9IChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgKiAxMDApICsgMTAwMCk7CisgICAgICAgIExWTV9GTE9BVCBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyXzBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfM19vbl80fTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIKICAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgVGVtcCA9IERhbXBpbmc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihUZW1wIDw9IChMVk1fSU5UMzIpKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoVGVtcCA8PSAoTFZNX0lOVDMyKShMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKSB7CiAgICAgICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EoVGVtcCwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKICAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQ29lZmZzLkEwID0gMTsKICAgICAgICAgICAgICAgICBDb2VmZnMuQTEgPSAwOwogICAgICAgICAgICAgICAgIENvZWZmcy5CMSA9IDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzW2ldLCAmQ29lZmZzKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPiBjb2VmcyA9IHsKKyAgICAgICAgICAgICAgICAgICAgQ29lZmZzLkEwLCBDb2VmZnMuQTEsIDAuMCwgLShDb2VmZnMuQjEpLCAwLjB9OworICAgICAgICAgICAgcFByaXZhdGUtPnJldkxQRkJpcXVhZFtpXS5yZXNldCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihGQ0NfMSwgY29lZnMpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIEFsbC1wYXNzIGZpbHRlciBtaXhlciB0aW1lIGNvbnN0YW50cwogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAogICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBBbHBoYTsKLSAgICAgICAgTFZNX0ZMT0FUICAgQWxwaGFUYXA7CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpIHsKKyAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgIExWTV9GTE9BVCBBbHBoYTsKKyAgICAgICAgTFZNX0ZMT0FUIEFscGhhVGFwOwogCiAgICAgICAgIEFscGhhID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCAxKTsKIAogICAgICAgICBBbHBoYVRhcCA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQVBfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIDEpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGExICAgICAgID0gQWxwaGFUYXA7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMiAgICAgICA9IEFscGhhVGFwOwotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQWxwaGEgICAgPSBBbHBoYTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSA9IEFscGhhOwogICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKICAgICAgICAgfQogICAgIH0KQEAgLTMwOCwxNTAgKzI2MywxMjEgQEAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KICAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKICAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgICAgICAgIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQotICAgIHsKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fRkxPQVQgR1s0XTsgLyogRmVlZGJhY2sgZ2FpbiAoUTcuMjQpICovCiAKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR1s0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gKFE3LjI0KSAqLwotCi0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwID09IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwID09IDApIHsKICAgICAgICAgICAgIEdbM10gPSAwOwogICAgICAgICAgICAgR1syXSA9IDA7CiAgICAgICAgICAgICBHWzFdID0gMDsKICAgICAgICAgICAgIEdbMF0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDE7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMjsKLSAgICAgICAgICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAxOworICAgICAgICAgICAgTFZNX0ZMT0FUIFRlbXAyOworICAgICAgICAgICAgTFZNX0lOVDE2IGk7CisgICAgICAgICAgICBMVk1fRkxPQVQgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07CiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBGb3IgZWFjaCBkZWxheSBsaW5lCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykgewogICAgICAgICAgICAgICAgIFRlbXAxID0gKDMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zICogU2NhbGVUYWJsZVtpXSkgLyBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MDsKLSAgICAgICAgICAgICAgICBpZihUZW1wMSA+PSAoNCkpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUZW1wMSA+PSAoNCkpIHsKICAgICAgICAgICAgICAgICAgICAgR1tpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoKFRlbXAxID49ICgyKSkpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKFRlbXAxID49ICgyKSkpIHsKICAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOwogICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CiAgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKE51bWJlck9mRGVsYXlMaW5lcyA9PSAxKQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoTnVtYmVyT2ZEZWxheUxpbmVzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgR1tpXSA9IFRlbXAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wRzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcEc7CiAgICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKLSAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICAgICAgR1tpXSA9IFRlbXBHOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIFNldCB1cCB0aGUgZmVlZGJhY2sgbWl4ZXJzIGZvciBmb3VyIGRlbGF5IGxpbmVzICovCi0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLlRhcmdldD1HWzBdOwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5UYXJnZXQ9R1sxXTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uVGFyZ2V0PUdbMl07Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLlRhcmdldD1HWzNdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQgPSBHWzBdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5UYXJnZXQgPSBHWzFdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5UYXJnZXQgPSBHWzJdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQgPSBHWzNdOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KICAgICAgKi8KLSAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiBJbmRleD0wOworICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApKSB7CisgICAgICAgIExWTV9JTlQzMiBJbmRleCA9IDA7CiAgICAgICAgIExWTV9GTE9BVCBJbmRleF9GTE9BVDsKLSAgICAgICAgTFZNX0lOVDMyIGk9MDsKLSAgICAgICAgTFZNX0ZMT0FUIEdhaW49MDsKLSAgICAgICAgTFZNX0lOVDMyIFJvb21TaXplPTA7CisgICAgICAgIExWTV9JTlQzMiBpID0gMDsKKyAgICAgICAgTFZNX0ZMT0FUIEdhaW4gPSAwOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemUgPSAwOwogICAgICAgICBMVk1fRkxPQVQgVDYwOwogICAgICAgICBMVk1fRkxPQVQgQ29lZnNbNV07CiAKLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSA9PSAwKQotICAgICAgICB7CisgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApIHsKICAgICAgICAgICAgIFJvb21TaXplID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFJvb21TaXplID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplOwogICAgICAgICB9CiAKLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgPCAxMDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwIDwgMTAwKSB7CiAgICAgICAgICAgICBUNjAgPSAxMDAgKiBMVlJFVl9UNjBfU0NBTEU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBUNjAgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAqIExWUkVWX1Q2MF9TQ0FMRTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIEZpbmQgdGhlIG5lYXJlc3Qgcm9vbSBzaXplIGluIHRhYmxlICovCi0gICAgICAgIGZvcihpID0gMDsgaSA8IDI0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFJvb21TaXplIDw9IExWUkVWX0dhaW5Qb2x5VGFibGVbaV1bMF0pCi0gICAgICAgICAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoUm9vbVNpemUgPD0gTFZSRVZfR2FpblBvbHlUYWJsZVtpXVswXSkgewogICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKQotICAgICAgICB7CisgICAgICAgIGlmIChSb29tU2l6ZSA9PSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSkgewogICAgICAgICAgICAgLyogVGFrZSB0YWJsZSB2YWx1ZXMgaWYgdGhlIHJvb20gc2l6ZSBpcyBpbiB0YWJsZSAqLwotICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpIC0gMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENvZWZzWzRdID0gMDsKLSAgICAgICAgICAgIEdhaW4gPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAgLyogUS4yNCByZXN1bHQgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgICAgIEdhaW4gPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgLyogUS4yNCByZXN1bHQgKi8KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBnYWluIGJldHdlZW4gbmVhcmVzdCByb29tIHNpemVzICovCiAKLSAgICAgICAgICAgIExWTV9GTE9BVCBHYWluMSxHYWluMjsKLSAgICAgICAgICAgIExWTV9JTlQzMiBUb3RfRGlzdCxEaXN0OworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLCBHYWluMjsKKyAgICAgICAgICAgIExWTV9JTlQzMiBUb3RfRGlzdCwgRGlzdDsKIAotICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKKyAgICAgICAgICAgIFRvdF9EaXN0ID0gKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0gLQorICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4IC0gMV1bMF07CiAgICAgICAgICAgICBEaXN0ID0gUm9vbVNpemUgLSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4IC0gMV1bMF07CiAKICAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBmaXJzdCAqLwotICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdW2ldOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIENvZWZzW2kgLSAxXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVtpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENvZWZzWzRdID0gMDsKIAotICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgLyogUS4yNCByZXN1bHQgKi8KIAogICAgICAgICAgICAgLyogR2V0IGdhaW4gZm9yIHNlY29uZCAqLwotICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpIC0gMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIENvZWZzWzRdID0gMDsKIAotICAgICAgICAgICAgR2FpbjIgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICAgICAgR2FpbjIgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgLyogUS4yNCByZXN1bHQgKi8KIAogICAgICAgICAgICAgLyogTGluZWFyIEludGVycG9sYXRlIHRoZSBnYWluICovCiAgICAgICAgICAgICBHYWluID0gR2FpbjEgKyAoKChHYWluMiAtIEdhaW4xKSAqIERpc3QpIC8gKFRvdF9EaXN0KSk7CkBAIC00NjEsMzIgKzM4NywyNyBAQAogICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQogICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKICAgICAgICAgICovCi0gICAgICAgIGlmKEdhaW4gPCAxKQotICAgICAgICB7CisgICAgICAgIGlmIChHYWluIDwgMSkgewogICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcFByaXZhdGUtPkdhaW4gPSAxIC8gR2FpbjsKICAgICAgICAgfQogCiAgICAgICAgIEluZGV4X0ZMT0FUID0gMTAwLjBmIC8gKExWTV9GTE9BVCkoMTAwICsgcFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCk7CiAgICAgICAgIHBQcml2YXRlLT5HYWluID0gcFByaXZhdGUtPkdhaW4gKiBJbmRleF9GTE9BVDsKLSAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAocFByaXZhdGUtPkdhaW4qSW5kZXhfRkxPQVQpIC8gMjsKKyAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgPSAocFByaXZhdGUtPkdhaW4gKiBJbmRleF9GTE9BVCkgLyAyOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBhbGwgcGFzcyBjb21iIGZpbHRlciBjb2VmZmljaWVudAogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgPT0gTFZNX1RSVUUpKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDE2ICAgaTsKLSAgICAgICAgTFZNX0ZMT0FUICAgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSkgeworICAgICAgICBMVk1fSU5UMTYgaTsKKyAgICAgICAgTFZNX0ZMT0FUIGIgPSAoTFZNX0ZMT0FUKXBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAqIExWUkVWX0JfOF9vbl8xMDAwOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICA9IGI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCA9IGI7CiAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSBiOwogICAgICAgICB9CiAgICAgfQpAQCAtNDk0LDExICs0MTUsMTAgQEAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQKICAgICAgKi8KLSAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgICB8fAotICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIE1PTk8gZm9ybWF0ICovCi0gICAgICAgIExWTV9GTE9BVCAgICBBbHBoYTsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpKSB7CisgICAgICAgIExWTV9VSU5UMTYgTnVtQ2hhbm5lbHMgPSAxOyAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KKyAgICAgICAgTFZNX0ZMT0FUIEFscGhhOwogCiAgICAgICAgIEFscGhhID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9GRUVEQkFDS01JWEVSX1RDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCkBAIC01MDgsNjcgKzQyOCw1NSBAQAogICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5BbHBoYSA9IEFscGhhOwogICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5BbHBoYSA9IEFscGhhOwogCi0gICAgICAgIE51bUNoYW5uZWxzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHdheXMgc3RlcmVvIG91dHB1dCAqLwotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9CWVBBU1NNSVhFUl9UQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIE51bUNoYW5uZWxzKTsKKyAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOyAvKiBBbHdheXMgc3RlcmVvIG91dHB1dCAqLworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExID0gTFZNX01peGVyX1RpbWVDb25zdGFudCgKKyAgICAgICAgICAgICAgICBMVlJFVl9CWVBBU1NNSVhFUl9UQywgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwogICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGEyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKLSAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSAgICA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuQWxwaGEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOwogICAgIH0KIAogICAgIC8qCiAgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cwogICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICYmCisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pKSB7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCkgLyAxMDAuMGY7CiAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKLSAgICAgICAgaWYgKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApICYmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpKQotICAgICAgICB7CisgICAgICAgIGlmICgocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKSAmJiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX0ZBTFNFKSkgewogICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9UUlVFOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICE9IDApCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gMCkgewogICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUpCi0gICAgewotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gKExWTV9GTE9BVCkocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCApIC8gMTAwLjBmOworICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkgeworICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwpIC8gMTAwLjBmOwogICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwogCiAgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSAgICAgICAgICAgICAgICAgICAgICA9IExWTV9NT0RFX09OOwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApIHsKICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgaWYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkgewogICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAweDAwMDAwMDAwOwogICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwogICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9UUlVFOwotICAgICAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgPSAwLjAzMTI1ZjsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ID0gMC4wMzEyNWY7CiAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyogIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIHRvIEFwcGx5TmV3IHNldHRpbmdzIGZvcmNlIHRoZSBjdXJyZW50IHRvIHRoZSB0YXJnZXQgXAogICAgICAgICB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdCAqLwotICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CiAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOwogICAgIH0KQEAgLTU4Miw4ICs0OTAsNyBAQAogICAgIC8qCiAgICAgICogVXBkYXRlIGZsYWcKICAgICAgKi8KLSAgICBpZihwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fVFJVRSkKLSAgICB7CisgICAgaWYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKSB7CiAgICAgICAgIHBQcml2YXRlLT5iRmlyc3RDb250cm9sID0gTFZNX0ZBTFNFOwogICAgIH0KIApAQCAtNjA2LDEyICs1MTMsOSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0lOVDMyIEJ5cGFzc01peGVyX0NhbGxiYWNrICh2b2lkICpwQ2FsbGJhY2tEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBHZW5lcmFsUHVycG9zZSApCi17Ci0KLSAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopcENhbGxiYWNrRGF0YTsKK0xWTV9JTlQzMiBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkKiBwQ2FsbGJhY2tEYXRhLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEdlbmVyYWxQdXJwb3NlKSB7CisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KilwQ2FsbGJhY2tEYXRhOwogCiAgICAgLyoKICAgICAgKiBBdm9pZCBidWlsZCB3YXJuaW5ncwpAQCAtNjIzLDExICs1MjcsMTAgQEAKICAgICAgKiBUdXJuIG9mZgogICAgICAqLwogICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9UUlVFOworICAgIHBMVlJFVl9Qcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOwogICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKChMVlJFVl9IYW5kbGVfdClwQ2FsbGJhY2tEYXRhKTsKIAogICAgIHJldHVybiAwOwogfQogCiAvKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAKaW5kZXggNTg2NTM5Zi4uYmUzNTA1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcApAQCAtNDEsMTcgKzQxLDE0IEBACiAvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSkKLXsKLQotICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UpIHsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCogcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQogCkBAIC01OSwzOCArNTYsMTIgQEAKICAgICAgKiBDbGVhciBhbGwgZmlsdGVyIHRhcCBkYXRhLCBkZWxheS1saW5lcyBhbmQgb3RoZXIgc2lnbmFsIHJlbGF0ZWQgZGF0YQogICAgICAqLwogCi0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLAotICAgICAgICAyKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsCi0gICAgICAgIDIpOwotICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzNdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzJdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgIHsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgIHsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFJldkhQRkJpcXVhZC0+Y2xlYXIoKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFJldkxQRkJpcXVhZC0+Y2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXM7IGkrKykgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cmV2TFBGQmlxdWFkW2ldLT5jbGVhcigpOworICAgICAgICBtZW1zZXQocExWUkVWX1ByaXZhdGUtPnBEZWxheV9UW2ldLCAwLCBMVlJFVl9NQVhfVF9ERUxBWVtpXSAqCisgICAgICAgICAgICAgICAgc2l6ZW9mKHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXVswXSkpOwogICAgIH0KICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcAppbmRleCBlMGIwMTQyLi5mODU4Yjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCkBAIC00MiwxNyArNDIsMTQgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpCi17Ci0KLSAgICBMVlJFVl9JbnN0YW5jZV9zdCAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0KiBwQ29udHJvbFBhcmFtcykgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwogICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocENvbnRyb2xQYXJhbXMgPT0gTFZNX05VTEwpKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcAppbmRleCA2OGY4ODNhLi4zYTYzNjk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJJbnN0QWxsb2MuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM0LDcgKzMzLDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDUsMjAxICs0Myw3MiBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldEluc3RhbmNlSGFuZGxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0ICAgKnBJbnN0YW5jZVBhcmFtcykKLXsKLQotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKLSAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgICAqcExWUkVWX1ByaXZhdGU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QqIHBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QqIHBJbnN0YW5jZVBhcmFtcykgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZTsKKyAgICBMVk1fSU5UMTYgaTsKKyAgICBMVk1fVUlOVDE2IE1heEJsb2NrU2l6ZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7CisgICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQotICAgIC8qIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTFZSRVZfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCiAgICAgLyoKICAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKICAgICAgKi8KICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCi0gICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplID09IDApCi0gICAgeworICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAogICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLwotICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSYmCi0gICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpJiYKLSAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSAmJgorICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18yKSAmJgorICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKICAgICAvKgotICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyk7Ci0KLSAgICAvKgotICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCi0gICAgICovCi0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICAvKgogICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgICpwaEluc3RhbmNlID0gbmV3IExWUkVWX0luc3RhbmNlX3N0e307CiAgICAgfQotICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7Ci0gICAgcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKyAgICBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopKnBoSW5zdGFuY2U7CiAKLSAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7Ci0gICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDNfREVMQVk7Ci0gICAgfQotICAgIGVsc2UgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT1MVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAxX0RFTEFZOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAwX0RFTEFZOworICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKKyAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQX0RFTEFZWzNdOworICAgIH0gZWxzZSBpZiAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKSB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUF9ERUxBWVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVBfREVMQVlbMF07CiAgICAgfQogCi0gICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgIGlmIChNYXhCbG9ja1NpemUgPiBwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkgeworICAgICAgICBNYXhCbG9ja1NpemUgPSBwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZTsKICAgICB9CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgZGF0YSwgY29lZmZpY2llbnQgYW5kIHRlbXBvcmFyeSBtZW1vcnkgcG9pbnRlcnMKICAgICAgKi8KLSAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEgPSAoTFZSRVZfRmFzdERhdGFfc3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOwotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9Ci0gICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gICAgID0KLSAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgTFZSRVZfTUFYX1QzX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsyXSwgTFZSRVZfTUFYX1QyX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gID0gKExWTV9GTE9BVCAqKQotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IChMVk1fRkxPQVQgKikKLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCi0gICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXM7IGkrKykgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV0gPSAoTFZNX0ZMT0FUKiljYWxsb2MoTFZSRVZfTUFYX1RfREVMQVlbaV0sIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSAoTFZNX0ZMT0FUKiljYWxsb2MoTWF4QmxvY2tTaXplLCBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgfQogICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCi0gICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5UWzJdICAgICAgICAgPSBMVlJFVl9NQVhfVDJfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPlRbM10gICAgICAgICA9IExWUkVWX01BWF9UM19ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsgICAgICAgLyogU2VsZWN0IHNtb290aGluZyBBIHRvIEIgKi8KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IExWUkVWX0RFTEFZTElORVNfNDsgaSsrKSB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5UW2ldID0gTFZSRVZfTUFYX1RfREVMQVlbaV07CisgICAgfQorICAgIHBMVlJFVl9Qcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOyAvKiBTZWxlY3Qgc21vb3RoaW5nIEEgdG8gQiAqLwogCi0gICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiAgICAgICA9Ci0gICAgICAgIChMVlJFVl9GYXN0Q29lZl9zdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsKICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaCAgICAgICAgPQotICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4QmxvY2tTaXplKTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKiljYWxsb2MoTWF4QmxvY2tTaXplLCBzaXplb2YoTFZNX0ZMT0FUKSk7CiAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0KLSAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplICogMikpOworICAgIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlID0gKExWTV9GTE9BVCopY2FsbG9jKEZDQ18yICogTWF4QmxvY2tTaXplLCBzaXplb2YoTFZNX0ZMT0FUKSk7CiAKICAgICAvKgogICAgICAqIFNhdmUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQpAQCAtMjQ5LDEwNSArMTE4LDE1MyBAQAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGludmFsaWQKICAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlICAgID0gTFZNX0ZTX0lOVkFMSUQ7CisgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU19JTlZBTElEOwogICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9EVU1NWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgID0gTFZNX1NPVVJDRV9EVU1NWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVk1fU09VUkNFX0RVTU1ZOwogCi0gICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICAgICAgID0gTFZNX1RSVUU7Ci0gICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5iRmlyc3RDb250cm9sID0gTFZNX1RSVUU7CisgICAgcExWUkVWX1ByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOwogCiAgICAgLyoKICAgICAgKiBTZXQgbWl4ZXIgcGFyYW1ldGVycwogICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiAgICA9IHBMVlJFVl9Qcml2YXRlOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgICAgICAgICAgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgICAgICAgICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgICAgICAgICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UxICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazEgICAgICAgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQxICAgICAgICA9IExWTV9GQUxTRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgICAgICAgICAgICA9IDB4MDAwMDAwMDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsYmFja0hhbmRsZTIgPSBwTFZSRVZfUHJpdmF0ZTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucEdlbmVyYWxQdXJwb3NlMiA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbEJhY2syID0gQnlwYXNzTWl4ZXJfQ2FsbGJhY2s7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tQYXJhbTEgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUxID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMSA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDEgPSBMVk1fRkFMU0U7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gMHgwMDAwMDAwMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CiAKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Um9vbVNpemVJbm1zICAgICAgICAgICAgICAgICAgICA9IDEwMDsgIC8vIDEwMCBtc2VjCisgICAgcExWUkVWX1ByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwMDsgIC8vIDEwMCBtc2VjCiAKICAgICAvKgogICAgICAqICBTZXQgdGhlIG91dHB1dCBnYWluIG1peGVyIHBhcmFtZXRlcnMKICAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBHZW5lcmFsUHVycG9zZSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1NldCAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DdXJyZW50ICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAwLjAzMTI1ZjsvLzB4MDNmZmZmZmY7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrU2V0ID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCA9IDAuMDMxMjVmOyAgLy8gMHgwM2ZmZmZmZjsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IDAuMDMxMjVmOyAgIC8vIDB4MDNmZmZmZmY7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgQWxsLVBhc3MgRmlsdGVyIG1peGVycwogICAgICAqLwotICAgIGZvciAoaT0wOyBpPDQ7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKICAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbGJhY2tIYW5kbGUyID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucEdlbmVyYWxQdXJwb3NlMiA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazIgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDIgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkN1cnJlbnQyICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0xICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazIgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0xID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbGJhY2tIYW5kbGUxID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucEdlbmVyYWxQdXJwb3NlMSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazEgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDEgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkN1cnJlbnQxICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgICAgICAgICAgPSAxOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsQmFjazEgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DYWxsYmFja1NldDEgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDEgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAxOwogICAgICAgICAvKiBGZWVkZm9yd2FyZCBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLkN1cnJlbnQgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgPSAwOwogICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DdXJyZW50ICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uQ2FsbGJhY2tTZXQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgPSAwOwogICAgICAgICAvKiBGZWVkYmFjayBnYWluIG1peGVyICovCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrUGFyYW0gICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbGJhY2tIYW5kbGUgID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBHZW5lcmFsUHVycG9zZSAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucENhbGxCYWNrICAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DYWxsYmFja1NldCAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DdXJyZW50ICAgICAgICAgID0gMDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uVGFyZ2V0ICAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrUGFyYW0gPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5DYWxsYmFja1NldCA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ3VycmVudCA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLlRhcmdldCA9IDA7CiAgICAgfQogICAgIC8qIERlbGF5IHRhcCBpbmRleCAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVswXSA9IExWUkVWX01BWF9BUDBfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMV0gPSBMVlJFVl9NQVhfQVAxX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzJdID0gTFZSRVZfTUFYX0FQMl9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVszXSA9IExWUkVWX01BWF9BUDNfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IExWUkVWX0RFTEFZTElORVNfNDsgaSsrKSB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSA9IExWUkVWX01BWF9BUF9ERUxBWVtpXTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplW2ldID0gTFZSRVZfTUFYX0FQX0RFTEFZW2ldOworICAgIH0KKworICAgIHBMVlJFVl9Qcml2YXRlLT5wUmV2SFBGQmlxdWFkLnJlc2V0KAorICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihMVk1fTUFYX0NIQU5ORUxTKSk7CisgICAgcExWUkVWX1ByaXZhdGUtPnBSZXZMUEZCaXF1YWQucmVzZXQoCisgICAgICAgICAgICBuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KExWTV9NQVhfQ0hBTk5FTFMpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWUkVWX0RFTEFZTElORVNfNDsgaSsrKSB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5yZXZMUEZCaXF1YWRbaV0ucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihMVk1fTUFYX0NIQU5ORUxTKSk7CisgICAgfQogCiAgICAgTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoKnBoSW5zdGFuY2UpOwogCiAgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfRnJlZUluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdGhlIGludGVybmFsIGFsbG9jYXRpb25zIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU1VDQ0VTUyAgICAgICAgICBmcmVlIGluc3RhbmNlIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgIEluc3RhbmNlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9GcmVlSW5zdGFuY2UoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlKSB7CisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgTFZSRVZfSW5zdGFuY2Vfc3QqIHBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0KiloSW5zdGFuY2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXM7IGkrKykgeworICAgICAgICBpZiAocExWUkVWX1ByaXZhdGUtPnBEZWxheV9UW2ldKSB7CisgICAgICAgICAgICBmcmVlKHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXSk7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV0gPSBMVk1fTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldKSB7CisgICAgICAgICAgICBmcmVlKHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSk7CisgICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBMVk1fTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoKSB7CisgICAgICAgIGZyZWUocExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSkgeworICAgICAgICBmcmVlKHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgPSBMVk1fTlVMTDsKKyAgICB9CisKKyAgICBkZWxldGUgcExWUkVWX1ByaXZhdGU7CisgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Cit9CiAvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk5MzNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJJbnN0QWxsb2MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYWxsb2NhdGVkICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlIGFkZHJlc3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwTWVtb3J5VGFibGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHJlcXVlc3RpbmcgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgcEluc3RhbmNlUGFyYW1zICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldE1lbW9yeVRhYmxlKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICpwSW5zdGFuY2VQYXJhbXMpCi17Ci0KLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBTbG93RGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0RGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBGYXN0Q29lZjsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBUZW1wb3Jhcnk7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCi0gICAgICovCi0gICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlciAqLwotICAgIGlmIChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgYWxsIGluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIGluIHJhbmdlCi0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZVBhcmFtcyAhPSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENhbGwgZm9yIG1lbW9yeSBhbGxvY2F0aW9uLCBzbyBjaGVjayB0aGUgcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgLyogQ2hlY2sgZm9yIGEgbm9uLXplcm8gYmxvY2sgc2l6ZSAqLwotICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBmb3IgYSB2YWxpZCBudW1iZXIgb2YgZGVsYXkgbGluZXMgKi8KLSAgICAgICAgaWYgKChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzEpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18yKSAmJgotICAgICAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBJbnN0QWxsb2MgaW5zdGFuY2VzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0luaXQoJlNsb3dEYXRhLCAgKHZvaWQgKilMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgKHZvaWQgKilMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3RDb2VmLCAgKHZvaWQgKilMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJlRlbXBvcmFyeSwgKHZvaWQgKilMVk1fTlVMTCk7Ci0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBmb3IgbnVsbCBwb2ludGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZVBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWUkVWX05VTExBRERSRVNTKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNlbGVjdCB0aGUgbWF4aW11bSBpbnRlcm5hbCBibG9jayBzaXplCi0gICAgICAgICAqLwotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgewotICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU18yKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAxX0RFTEFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKE1heEJsb2NrU2l6ZT5wSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2xvdyBkYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmU2xvd0RhdGEsIHNpemVvZihMVlJFVl9JbnN0YW5jZV9zdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmU2xvd0RhdGEpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX1NMT1dfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGZhc3QgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsKLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMl9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RlbnQgZmFzdCBjb2VmZmljaWVudCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkZhc3RDb2VmKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGVtcG9yYXJ5IGZhc3QgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MjsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLwotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDE7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZUZW1wb3JhcnkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICA9IExWTV9URU1QT1JBUllfRkFTVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUKLSAgICAgICAgICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwTFZSRVZfUHJpdmF0ZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWUkVWX1NVQ0NFU1MpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IDJjMjdjNmUuLjlhMmY5Y2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTIzLDYgKzIzLDggQEAKIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JpcXVhZEZpbHRlci5oPgogI2luY2x1ZGUgIkxWUkVWLmgiCiAjaW5jbHVkZSAiTFZSRVZfVGFibGVzLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCkBAIC0zNyw2MyArMzksNjMgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBHZW5lcmFsICovCi0jZGVmaW5lIE9ORV9PVkVSX1NRUlRfVFdPICAgICAgICAgICAgMC43MDcxMDdmICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgICAgMC4wMDhmICAgICAgICAgICAvKiAwLjggKiAyXjMxICovCi0jZGVmaW5lIExWUkVWX0hFQURST09NICAgICAgICAgICAgICAgICAgIDAuMjVmICAgICAgICAgICAvKiAtMTJkQiAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfMl85X0lOUTI5ICAgICAgICAgICAgICAgICAgIDIuOWYgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCi0jZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAwLjcwNzk0NTdmICAgICAgICAgICAvKiAtM2RCIGluIFExNSBmb3JtYXQgKi8KKyNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gMC43MDcxMDdmIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgMC4wMDhmICAgIC8qIDAuOCAqIDJeMzEgKi8KKyNkZWZpbmUgTFZSRVZfSEVBRFJPT00gMC4yNWYgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLworI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgMi45ZiAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZSRVZfTUlOM0RCIDAuNzA3OTQ1N2YgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLwogCiAvKiBJbnRlbmFsIGNvbnN0YW50cyAqLwotI2RlZmluZSBMVlJFVl9MUF9Qb2x5X09yZGVyICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgTFZSRVZfTFBfUG9seV9PcmRlciA0CisjZGVmaW5lIExWUkVWX0xQX1BvbHlfU2hpZnQgNQogCi0jZGVmaW5lIExWUkVWX1Q2MF9TQ0FMRSAgICAgICAgICAgICAgICAwLjAwMDE0MmYgICAgICAgICAgIC8qKDEvNzAwMCkgKi8KKyNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFIDAuMDAwMTQyZiAvKigxLzcwMDApICovCiAKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAgICAgICAgICAgICAgMS4wZgotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMV9vbl80ICAgICAgICAgMS4zMTYwNzRmCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgICAgICAgICAxLjczMjA1MWYKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNCAgICAgICAgIDIuMjc5NTA3ZgotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQgICAgICAgICAxLjBmICAgICAgICAvKiAzXigtMC80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80ICAgIDAuNzU5ODM2ZiAgICAgICAgLyogM14oLTEvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAgICAwLjU3NzM1MGYgICAgICAgIC8qIDNeKC0yLzQpICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQgICAgMC40Mzg2OTFmICAgICAgICAvKiAzXigtMy80KSAqIDJeMTUgKi8KKyNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzBfb25fNCAxLjBmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8xX29uXzQgMS4zMTYwNzRmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8yX29uXzQgMS43MzIwNTFmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8zX29uXzQgMi4yNzk1MDdmCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCAxLjBmICAgICAgLyogM14oLTAvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAwLjc1OTgzNmYgLyogM14oLTEvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCAwLjU3NzM1MGYgLyogM14oLTIvNCkgKiAyXjE1ICovCisjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAwLjQzODY5MWYgLyogM14oLTMvNCkgKiAyXjE1ICovCiAKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgICAgICAgICAgICAgICAxMDEwOAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCi0jZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAgICAgICAgICAgICAgIDEzMzA0Ci0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgMTc1MDgKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgICAgICAgICAgICAgICAyMzA0MAotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgICAgICAgICAgICAgICA2NzQwCi0gICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDg4NzIKLSAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwotI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZICAgICAgICAgICAgICAxMTY3MgotICAgIC8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80KSA+PiAxNSkgLyAxNTAwICovCi0jZGVmaW5lIExWUkVWX01BWF9BUDBfREVMQVkgICAgICAgICAgICAgIDE1MzYwCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDNfREVMQVkgMTAxMDgKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80KSA+PiAxNSkgLyAxMDAwICovCisjZGVmaW5lIExWUkVWX01BWF9UMl9ERUxBWSAxMzMwNAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZIDE3NTA4CisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTAwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfVDBfREVMQVkgMjMwNDAKKy8qICgoMTkyMDAwICogMTIwICogTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80KSA+PiAxNSkgLyAxNTAwICovCisjZGVmaW5lIExWUkVWX01BWF9BUDNfREVMQVkgNjc0MAorLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KKyNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSA4ODcyCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAxX0RFTEFZIDExNjcyCisvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLworI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZIDE1MzYwCiAKLSNkZWZpbmUgTFZSRVZfQllQQVNTTUlYRVJfVEMgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQqLwotI2RlZmluZSBMVlJFVl9BTExQQVNTX1RDICAgICAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgdGltZSBjb25zdGFudCAqLwotI2RlZmluZSBMVlJFVl9BTExQQVNTX1RBUF9UQyAgICAgICAgICAgICAxMDAwMCAgICAgICAgICAgLyogQWxsLXBhc3MgZmlsdGVyIGRlbHkgdGFwIGNoYW5nZSAqLwotI2RlZmluZSBMVlJFVl9GRUVEQkFDS01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBGZWVkYmFjayBtaXhlciB0aW1lIGNvbnN0YW50Ki8KLSNkZWZpbmUgTFZSRVZfT1VUUFVUR0FJTl9TSElGVCAgICAgICAgICAgICAgNSAgICAgICAgICAgLyogQml0cyBzaGlmdCBmb3Igb3V0cHV0IGdhaW4gY29ycmVjdGlvbiAqLworI2RlZmluZSBMVlJFVl9CWVBBU1NNSVhFUl9UQyAxMDAwICAvKiBCeXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEMgMTAwMCAgICAgIC8qIEFsbC1wYXNzIGZpbHRlciB0aW1lIGNvbnN0YW50ICovCisjZGVmaW5lIExWUkVWX0FMTFBBU1NfVEFQX1RDIDEwMDAwIC8qIEFsbC1wYXNzIGZpbHRlciBkZWx5IHRhcCBjaGFuZ2UgKi8KKyNkZWZpbmUgTFZSRVZfRkVFREJBQ0tNSVhFUl9UQyAxMDAgLyogRmVlZGJhY2sgbWl4ZXIgdGltZSBjb25zdGFudCovCisjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgNSAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyogUGFyYW1ldGVyIGxpbWl0cyAqLwotI2RlZmluZSBMVlJFVl9OVU1fRlMgICAgICAgICAgICAgICAgICAgICAgIDEzICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3VwcG9ydGVkIHNhbXBsZSByYXRlcyAqLworI2RlZmluZSBMVlJFVl9OVU1fRlMgMTMgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KIAotI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCi0jZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KLSNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgICAgICAgICAgICAgICA1MCAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIGxpbWl0cyAqLwotI2RlZmluZSBMVlJFVl9NQVhfTFBGX0NPUk5FUiAgICAgICAgICAgIDIzOTk5Ci0jZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSICAgICAgICAgICAgICAgMjAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCi0jZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSICAgICAgICAgICAgIDEwMDAKLSNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgICAgICAgICAgNzAwMCAgICAgICAgICAgLyogTWF4aW11bSBUNjAgdGltZSBpbiBtcyAqLwotI2RlZmluZSBMVlJFVl9NQVhfREVOU0lUWSAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAvKiBNYXhpbXVtIGRlbnNpdHksIDEwMCUgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCi0jZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gcm9vbSBzaXplLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWEJMS1NJWkVfTElNSVQgNjQgLyogTWF4aW11bSBibG9jayBzaXplIGxvdyBsaW1pdCAqLworI2RlZmluZSBMVlJFVl9NQVhfTEVWRUwgMTAwICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KKyNkZWZpbmUgTFZSRVZfTUlOX0xQRl9DT1JORVIgNTAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9MUEZfQ09STkVSIDIzOTk5CisjZGVmaW5lIExWUkVWX01JTl9IUEZfQ09STkVSIDIwIC8qIEhpZ2ggcGFzcyBmaWxyZXIgbGltaXRzICovCisjZGVmaW5lIExWUkVWX01BWF9IUEZfQ09STkVSIDEwMDAKKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCA3MDAwICAgICAvKiBNYXhpbXVtIFQ2MCB0aW1lIGluIG1zICovCisjZGVmaW5lIExWUkVWX01BWF9ERU5TSVRZIDEwMCAgLyogTWF4aW11bSBkZW5zaXR5LCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9EQU1QSU5HIDEwMCAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCisjZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAxMDAgLyogTWF4aW11bSByb29tIHNpemUsIDEwMCUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMSw3MyArMTAzLDU3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBGYXN0IGRhdGEgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190IEhQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBMUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCBSZXZMUFRhcHNbNF07ICAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgdGFwcyAqLwotCi19IExWUkVWX0Zhc3REYXRhX3N0OwotCi0vKiBGYXN0IGNvZWZmaWNpZW50IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIEhQQ29lZnM7ICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIExQQ29lZnM7ICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2TFBDb2Vmc1s0XTsgICAgICAgIC8qIFJldmVyYiBsb3cgcGFzcyBmaWx0ZXJzIGNvZWZmaWNpZW50cyAqLwotCi19IExWUkVWX0Zhc3RDb2VmX3N0OwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsICovCi0gICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAvKiBJbml0aWFsaXNhdGlvbiB0aW1lIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICBNZW1vcnlUYWJsZTsgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyBmcm9tIHRoZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nIGFwcGxpY2F0aW9uICovCi0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkNvbnRyb2xQZW5kaW5nOyAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIG5ldyBwYXJhbWV0ZXJzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUgKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiRmlyc3RDb250cm9sOyAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCi0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIG1peCBsZXZlbCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCUgYW5kIHRoZSByZXZlcmIgY2FuIGJlIGRpc2FibGVkICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgUm9vbVNpemVJbm1zOyAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGZvciBpbnRlcm5hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RhbmNlUGFyYW1zOyAvKiBJbml0aWFsaXNhdGlvbiB0aW1lIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEN1cnJlbnRQYXJhbXM7ICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBOZXdQYXJhbXM7ICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZyBhcHBsaWNhdGlvbiAqLworICAgIExWTV9DSEFSIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIG5ldyBwYXJhbWV0ZXJzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGF2YWlsYWJsZSAqLworICAgIExWTV9DSEFSIGJGaXJzdENvbnRyb2w7ICAgICAgICAgICAgICAgICAvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRyb2wgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCisgICAgTFZNX0NIQVIgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLworICAgIExWTV9JTlQzMiBSb29tU2l6ZUlubXM7ICAgICAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLworICAgIExWTV9JTlQzMiBNYXhCbGtMZW47ICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCi0gICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIExWUkVWX0Zhc3RDb2VmX3N0ICAgICAgICpwRmFzdENvZWY7ICAgICAgICAgICAgICAgLyogRmFzdCBjb2VmZmljaWVudCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoRGVsYXlMaW5lWzRdOyAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAvKiBNdWx0aSB1c3NnZSBzY3JhdGNoICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBJbnB1dFNhdmU7ICAgICAgICAgICAgICAvKiBSZXZlcmIgYmxvY2sgaW5wdXQgc2F2ZSBmb3IgZHJ5L3dldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW5nKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgcFJldkhQRkJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgSFBGICovCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIHBSZXZMUEZCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgZm9yIExQRiAqLworICAgIHN0ZDo6YXJyYXk8c3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4sIExWUkVWX0RFTEFZTElORVNfND4KKyAgICAgICAgICAgIHJldkxQRkJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgUmV2ZXJiIExQRiAqLworICAgIExWTV9GTE9BVCogcFNjcmF0Y2hEZWxheUxpbmVbTFZSRVZfREVMQVlMSU5FU180XTsgLyogRGVsYXkgbGluZSBzY3JhdGNoIG1lbW9yeSAqLworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7ICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KKyAgICBMVk1fRkxPQVQqIHBJbnB1dFNhdmU7ICAgICAgICAgICAvKiBSZXZlcmIgYmxvY2sgaW5wdXQgc2F2ZSBmb3IgZHJ5L3dldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluZyovCiAKICAgICAvKiBGZWVkYmFjayBtYXRyaXggKi8KLSAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBGZWVkYmFja01peGVyWzRdOyAgICAgICAgIC8qIE1peGVyIGZvciBQb3AgYW5kIENsaWNrIFN1cHJlc3Npb24gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5IGZlZWRiYWNrIEdhaW4gKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IEZlZWRiYWNrTWl4ZXJbTFZSRVZfREVMQVlMSU5FU180XTsgLyogTWl4ZXIgZm9yIFBvcCBhbmQgQ2xpY2sgU3VwcHJlc3Npb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2VkIGJ5IGZlZWRiYWNrIEdhaW4gKi8KIAogICAgIC8qIEFsbC1QYXNzIEZpbHRlciAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFRbNF07ICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgLyogUG9pbnRlciB0byBkZWxheSBidWZmZXJzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgRGVsYXlfQVBbNF07ICAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gQVAgZGVsYXkgYnVmZmVyIHN0YXJ0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQUJfU2VsZWN0aW9uOyAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgQiB0byBBICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBBIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQl9EZWxheVNpemVbNF07ICAgICAgICAgICAvKiBCIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBPZmZzZXRBWzRdOyAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQiBkZWxheSB0YXAgKi8KLSAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9BUFRhcHNbNF07ICAgICAgICAgIC8qIFNtb290aGVkIEFQIGRlbGF5IG1peGVyICovCi0gICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgTWl4ZXJfU0dGZWVkYmFja1s0XTsgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KLSAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgIC8qIFNtb290aGVkIEFQIGZlZWRmb3J3YXJkIGdhaW4gKi8KKyAgICBMVk1fSU5UMzIgVFtMVlJFVl9ERUxBWUxJTkVTXzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCogcERlbGF5X1RbTFZSRVZfREVMQVlMSU5FU180XTsgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KKyAgICBMVk1fSU5UMzIgRGVsYXlfQVBbTFZSRVZfREVMQVlMSU5FU180XTsgICAgICAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLworICAgIExWTV9JTlQxNiBBQl9TZWxlY3Rpb247ICAgICAgICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gQiB3aGVuIDEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIEIgdG8gQSAqLworICAgIExWTV9JTlQzMiBBX0RlbGF5U2l6ZVtMVlJFVl9ERUxBWUxJTkVTXzRdOyAgICAgICAgICAgICAgICAvKiBBIGRlbGF5IGxlbmd0aCBpbiBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyIEJfRGVsYXlTaXplW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAgICAgICAgICAgIC8qIEIgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KKyAgICBMVk1fRkxPQVQqIHBPZmZzZXRBW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQSBkZWxheSB0YXAgKi8KKyAgICBMVk1fRkxPQVQqIHBPZmZzZXRCW0xWUkVWX0RFTEFZTElORVNfNF07ICAgICAgICAgICAgICAgICAgLyogT2Zmc2V0IGZvciB0aGUgQiBkZWxheSB0YXAgKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90IE1peGVyX0FQVGFwc1tMVlJFVl9ERUxBWUxJTkVTXzRdOyAgICAgLyogU21vb3RoZWQgQVAgZGVsYXkgbWl4ZXIgKi8KKyAgICBNaXhfMVN0X0NsbF9GTE9BVF90IE1peGVyX1NHRmVlZGJhY2tbTFZSRVZfREVMQVlMSU5FU180XTsgLyogU21vb3RoZWQgU0FmZWVkYmFjayBnYWluICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCBNaXhlcl9TR0ZlZWRmb3J3YXJkW0xWUkVWX0RFTEFZTElORVNfNF07IC8qIFNtb290aGVkIEFQIGZlZWRmb3J3YXJkIGdhaW4gKi8KIAogICAgIC8qIE91dHB1dCBnYWluICovCi0gICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBEcnkvd2V0IG1peGVyICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR2FpbjsgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlIHNpZ25hbCBwb3dlciAqLwotICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEdhaW5NaXhlcjsgICAgICAgICAgICAgICAgLyogR2FpbiBzbW9vdGhpbmcgKi8KKyAgICBNaXhfMlN0X0NsbF9GTE9BVF90IEJ5cGFzc01peGVyOyAvKiBEcnkvd2V0IG1peGVyICovCisgICAgTFZNX0ZMT0FUIEdhaW47ICAgICAgICAgICAgICAgICAgLyogR2FpbiBhcHBsaWVkIHRvIG91dHB1dCB0byBtYWludGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCisgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCBHYWluTWl4ZXI7ICAgLyogR2FpbiBzbW9vdGhpbmcgKi8KIAogfSBMVlJFVl9JbnN0YW5jZV9zdDsKIApAQCAtMTc3LDE1ICsxNjMsMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWUkVWX1JldHVyblN0YXR1c19lbiAgIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MoTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwUHJpdmF0ZSk7Ci12b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotTFZNX0lOVDMyICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sodm9pZCAgICAgICAqcENhbGxiYWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgR2VuZXJhbFB1cnBvc2UgKTsKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzKExWUkVWX0luc3RhbmNlX3N0KiBwUHJpdmF0ZSk7Cit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCogcElucHV0LCBMVk1fRkxPQVQqIHBPdXRwdXQsIExWUkVWX0luc3RhbmNlX3N0KiBwUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKTsKK0xWTV9JTlQzMiBCeXBhc3NNaXhlcl9DYWxsYmFjayh2b2lkKiBwQ2FsbGJhY2tEYXRhLCB2b2lkKiBwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEdlbmVyYWxQdXJwb3NlKTsKIAotI2VuZGlmICAvKiogX19MVlJFVl9QUklWQVRFX0hfXyAqKi8KKyNlbmRpZiAvKiogX19MVlJFVl9QUklWQVRFX0hfXyAqKi8KIAogLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAKaW5kZXggMzVmOWFkOC4uZjljMzI2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAKQEAgLTQ1LDQzICs0NSwzNyBAQAogLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgIE51bVNhbXBsZXMpCi17Ci0gICBMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOwotICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5wdXQgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7Ci0gICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQgPSBwT3V0RGF0YTsKLSAgIExWTV9JTlQzMiAgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzLCBSZW1haW5pbmdTYW1wbGVzOwotICAgTFZNX0lOVDMyICAgICAgICAgICAgIGZvcm1hdCA9IDE7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIGNvbnN0IExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWUkVWX0luc3RhbmNlX3N0KiBwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCopaEluc3RhbmNlOworICAgIExWTV9GTE9BVCogcElucHV0ID0gKExWTV9GTE9BVCopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQqIHBPdXRwdXQgPSBwT3V0RGF0YTsKKyAgICBMVk1fSU5UMzIgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKKyAgICBMVk1fSU5UMzIgZm9ybWF0ID0gMTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KIAogICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgbmV3IGNvbnRyb2xzIHNldHRpbmdzIGlmIHJlcXVpcmVkCiAgICAgICovCi0gICAgaWYocExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKLSAgICB7Ci0gICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIGVycm9yQ29kZTsKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkgeworICAgICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gZXJyb3JDb2RlOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIENsZWFyIHRoZSBwZW5kaW5nIGZsYWcgYW5kIHVwZGF0ZSB0aGUgY29udHJvbCBzZXR0aW5ncwogICAgICAgICAgKi8KICAgICAgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKIAotICAgICAgICBlcnJvckNvZGUgPSBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChwTFZSRVZfUHJpdmF0ZSk7CisgICAgICAgIGVycm9yQ29kZSA9IExWUkVWX0FwcGx5TmV3U2V0dGluZ3MocExWUkVWX1ByaXZhdGUpOwogCi0gICAgICAgIGlmKGVycm9yQ29kZSAhPSBMVlJFVl9TVUNDRVNTKQotICAgICAgICB7CisgICAgICAgIGlmIChlcnJvckNvZGUgIT0gTFZSRVZfU1VDQ0VTUykgewogICAgICAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKICAgICAgICAgfQogICAgIH0KQEAgLTg5LDI3ICs4MywyMyBAQAogICAgIC8qCiAgICAgICogVHJhcCB0aGUgY2FzZSB3aGVyZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVyby4KICAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKQotICAgIHsKKyAgICBpZiAoTnVtU2FtcGxlcyA9PSAwKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwogICAgIH0KIAogICAgIC8qCiAgICAgICogSWYgT0ZGIGNvcHkgYW5kIHJlZm9ybWF0IHRoZSBkYXRhIGFzIG5lY2Vzc2FyeQogICAgICAqLwotICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKLSAgICB7Ci0gICAgICAgIGlmKHBJbnB1dCAhPSBwT3V0cHV0KQotICAgICAgICB7CisgICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKSB7CisgICAgICAgIGlmIChwSW5wdXQgIT0gcE91dHB1dCkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGNvbnZlcnQgdG8gc3RlcmVvIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTyl7CisgICAgICAgICAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKSB7CiAgICAgICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocElucHV0LCBwT3V0cHV0LCBOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29weV9GbG9hdChwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwgcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSkpOyAgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExOCwzMSArMTA4LDI2IEBACiAKICAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQzMilOdW1TYW1wbGVzOwogCi0gICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykKLSAgICB7CisgICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgewogICAgICAgICBmb3JtYXQgPSAyOwogICAgIH0KIAotICAgIHdoaWxlIChSZW1haW5pbmdTYW1wbGVzIT0wKQotICAgIHsKKyAgICB3aGlsZSAoUmVtYWluaW5nU2FtcGxlcyAhPSAwKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFByb2Nlc3MgdGhlIGRhdGEKICAgICAgICAgICovCiAKLSAgICAgICAgaWYoUmVtYWluaW5nU2FtcGxlcyA+ICBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW47CisgICAgICAgIGlmIChSZW1haW5pbmdTYW1wbGVzID4gcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbikgeworICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9IHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW47CiAgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQxNikoUmVtYWluaW5nU2FtcGxlcyAtIFNhbXBsZXNUb1Byb2Nlc3MpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9IFJlbWFpbmluZ1NhbXBsZXM7CiAgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gMDsKICAgICAgICAgfQogCiAgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOwotICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOwotICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyAgICAgICAgcElucHV0ID0gKExWTV9GTE9BVCopKHBJbnB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogZm9ybWF0KSk7CisgICAgICAgIHBPdXRwdXQgPSAoTFZNX0ZMT0FUKikocE91dHB1dCArIChTYW1wbGVzVG9Qcm9jZXNzICogMikpOyAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKICAgICB9CiAKICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKQEAgLTE3MCwxNiArMTU1LDE1IEBACiAvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQotewotICAgIExWTV9JTlQxNiAgIGosIHNpemU7Ci0gICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7Ci0gICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKLSAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7Ci0gICAgTFZNX0ZMT0FUICAgKnBJbjsKLSAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKLSAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7Cit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCogcElucHV0LCBMVk1fRkxPQVQqIHBPdXRwdXQsIExWUkVWX0luc3RhbmNlX3N0KiBwUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZNX0lOVDE2IGosIHNpemU7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXlMaW5lOworICAgIExWTV9GTE9BVCogcERlbGF5TGluZUlucHV0ID0gcFByaXZhdGUtPnBTY3JhdGNoOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUKiBwSW47CisgICAgTFZNX0ZMT0FUKiBwVGVtcCA9IHBQcml2YXRlLT5wSW5wdXRTYXZlOworICAgIExWTV9JTlQzMiBOdW1iZXJPZkRlbGF5TGluZXM7CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgpAQCAtMTk2LDg1ICsxODAsNjEgQEAKICAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKICAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7CisgICAgfSBlbHNlIGlmIChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikgewogICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CiAgICAgfQogCi0gICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQotICAgIHsKKyAgICBpZiAocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKSB7CiAgICAgICAgIHBJbiA9IHBJbnB1dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICAvKgogICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgogICAgICAgICAgKi8KIAotICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LCBwVGVtcCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgcEluID0gcFRlbXA7CiAgICAgfQogCi0gICAgTXVsdDNzX0Zsb2F0KHBJbiwKLSAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVlJFVl9IRUFEUk9PTSwKLSAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgTXVsdDNzX0Zsb2F0KHBJbiwgKExWTV9GTE9BVClMVlJFVl9IRUFEUk9PTSwgcFRlbXAsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKICAgICAvKgogICAgICAqICBIaWdoIHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICBwUHJpdmF0ZS0+cFJldkhQRkJpcXVhZC0+cHJvY2VzcyhwVGVtcCwgcFRlbXAsIE51bVNhbXBsZXMpOworCiAgICAgLyoKICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCiAgICAgICovCi0gICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICBwUHJpdmF0ZS0+cFJldkxQRkJpcXVhZC0+cHJvY2VzcyhwVGVtcCwgcFRlbXAsIE51bVNhbXBsZXMpOwogCiAgICAgLyoKICAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKICAgICAgKi8KIAotICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQotICAgIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspIHsKICAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKIAogICAgICAgICAvKgogICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCiAgICAgICAgICAqLwogICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sIHBQcml2YXRlLT5wT2Zmc2V0QVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbal0sIHBEZWxheUxpbmUsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKICAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCi0gICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KKyAgICAgICAgQ29weV9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLCBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7IC8qIDMyLWJpdCBkYXRhICovCiAgICAgICAgIC8qIEFwcGx5IHRoZSBzbW9vdGhlZCBmZWVkYmFjayBhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLwotICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tqXSwgcERlbGF5TGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIGRlbGF5IGxpbmUgKi8KICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAgICAvKiBJbnZlcnQgc2luY2UgdGhlIGZlZWRiYWNrIGNvZWZmaWNpZW50IGlzIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLwpAQCAtMjgzLDkgKzI0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBvdXRwdXQgKi8KLSAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICBNYWMzc19TYXRfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLCAxLjBmLCBwRGVsYXlMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAogICAgICAgICAvKgpAQCAtMjk2LDM0ICsyNTQsMjYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogIExvdyBwYXNzIGZpbHRlcgogICAgICAgICAgKi8KLSAgICAgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIHBQcml2YXRlLT5yZXZMUEZCaXF1YWRbal0tPnByb2Nlc3MocERlbGF5TGluZSwgcERlbGF5TGluZSwgTnVtU2FtcGxlcyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiAgQXBwbHkgcm90YXRpb24gbWF0cml4IGFuZCBkZWxheSBzYW1wbGVzCiAgICAgICovCi0gICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCi0gICAgewotCi0gICAgICAgIENvcHlfRmxvYXQocFRlbXAsCi0gICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LAotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspIHsKKyAgICAgICAgQ29weV9GbG9hdChwVGVtcCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqICBSb3RhdGlvbiBtYXRyaXggbWl4CiAgICAgICAgICAqLwotICAgICAgICBzd2l0Y2goaikKLSAgICAgICAgeworICAgICAgICBzd2l0Y2ggKGopIHsKICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDI6CkBAIC0zMzEsNjEgKzI4MSw1MiBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAzIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBEZWxheUxpbmVJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQorICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwgcERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgcERlbGF5TGluZUlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLCBwRGVsYXlMaW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgY29udHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAyLDU0ICszNDMsMzcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogIERlbGF5IHNhbXBsZXMKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQocERlbGF5TGluZUlucHV0LAotICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMpKTsgLyogMzItYml0IGRhdGEgKi8KICAgICB9CiAKICAgICAvKgogICAgICAqICBDcmVhdGUgc3RlcmVvIG91dHB1dAogICAgICAqLwotICAgIHN3aXRjaChwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzKQotICAgIHsKKyAgICBzd2l0Y2ggKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpIHsKICAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzQ6Ci0gICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKIAotICAgICAgICAgICAgSm9pblRvMmlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6CiAKLSAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOworICAgICAgICAgICAgQ29weV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIHBTY3JhdGNoLCAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CiAKLSAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwgcFNjcmF0Y2gsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcFNjcmF0Y2gsIHBUZW1wLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTFZSRVZfREVMQVlMSU5FU18xOgotICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwVGVtcCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC00NjAsMjUgKzM4NCwxNCBAQAogICAgICAqLwogCiAgICAgc2l6ZSA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSk7Ci0gICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsIHBUZW1wLCBwVGVtcCwgcE91dHB1dCwgc2l6ZSk7CiAKICAgICAvKiBBcHBseSBHYWluKi8KIAotICAgIFNoaWZ0X1NhdF9GbG9hdChMVlJFVl9PVVRQVVRHQUlOX1NISUZULAotICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwgcE91dHB1dCwgcE91dHB1dCwgc2l6ZSk7CiAKLSAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLCBwT3V0cHV0LCBwT3V0cHV0LCBzaXplKTsKIAogICAgIHJldHVybjsKIH0KIC8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcAppbmRleCAyYTc1NTU5Li5lNWEwYmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCkBAIC00Miw4NCArNDIsNjcgQEAKIC8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcE5ld1BhcmFtcykKLXsKLQotICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QqIHBOZXdQYXJhbXMpIHsKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCogcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QqKWhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKICAgICAgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgeworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2hlY2sgYWxsIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgYXJlIGluIHJhbmdlCiAgICAgICovCi0gICAgaWYoICAgICgocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICgKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICAmJgotICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ4MDAwKQotICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKLSAgICAgICAgKQotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgICAgICAgJiYKLSAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKLSAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICAgICAgICAgJiYKLSAgICAgICAgICAgIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpKQotI2Vsc2UKLSAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQotI2VuZGlmCi0gICAgeworICAgIGlmICgoKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSB8fAorICAgICAgICAoKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMzIwMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180NDEwMCkgJiYKKyAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJgorICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpIHx8CisgICAgICAgICgocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICYmCisgICAgICAgICAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSkgewogICAgICAgICByZXR1cm4gKExWUkVWX09VVE9GUkFOR0UpOwogICAgIH0KIAotICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbCA+IExWUkVWX01BWF9MRVZFTCkKLSAgICB7CisgICAgaWYgKHBOZXdQYXJhbXMtPkxldmVsID4gTFZSRVZfTUFYX0xFVkVMKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmICgocE5ld1BhcmFtcy0+TFBGIDwgTFZSRVZfTUlOX0xQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5MUEYgPiBMVlJFVl9NQVhfTFBGX0NPUk5FUikpCi0gICAgeworICAgIGlmICgocE5ld1BhcmFtcy0+TFBGIDwgTFZSRVZfTUlOX0xQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5MUEYgPiBMVlJFVl9NQVhfTFBGX0NPUk5FUikpIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKChwTmV3UGFyYW1zLT5IUEYgPCBMVlJFVl9NSU5fSFBGX0NPUk5FUikgfHwgKHBOZXdQYXJhbXMtPkhQRiA+IExWUkVWX01BWF9IUEZfQ09STkVSKSkKLSAgICB7CisgICAgaWYgKChwTmV3UGFyYW1zLT5IUEYgPCBMVlJFVl9NSU5fSFBGX0NPUk5FUikgfHwgKHBOZXdQYXJhbXMtPkhQRiA+IExWUkVWX01BWF9IUEZfQ09STkVSKSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAocE5ld1BhcmFtcy0+VDYwID4gTFZSRVZfTUFYX1Q2MCkKLSAgICB7CisgICAgaWYgKHBOZXdQYXJhbXMtPlQ2MCA+IExWUkVWX01BWF9UNjApIHsKICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CiAgICAgfQogCi0gICAgaWYgKHBOZXdQYXJhbXMtPkRlbnNpdHkgPiBMVlJFVl9NQVhfREVOU0lUWSkKLSAgICB7CisgICAgaWYgKHBOZXdQYXJhbXMtPkRlbnNpdHkgPiBMVlJFVl9NQVhfREVOU0lUWSkgewogICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKICAgICB9CiAKLSAgICBpZiAocE5ld1BhcmFtcy0+RGFtcGluZyA+IExWUkVWX01BWF9EQU1QSU5HKQotICAgIHsKKyAgICBpZiAocE5ld1BhcmFtcy0+RGFtcGluZyA+IExWUkVWX01BWF9EQU1QSU5HKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAotICAgIGlmIChwTmV3UGFyYW1zLT5Sb29tU2l6ZSA+IExWUkVWX01BWF9ST09NU0laRSkKLSAgICB7CisgICAgaWYgKHBOZXdQYXJhbXMtPlJvb21TaXplID4gTFZSRVZfTUFYX1JPT01TSVpFKSB7CiAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ29weSB0aGUgbmV3IHBhcmFtZXRlcnMgYW5kIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGV5IGFyZSBhdmFpbGFibGUKICAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+TmV3UGFyYW1zICAgICAgID0gKnBOZXdQYXJhbXM7CisgICAgcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtcyA9ICpwTmV3UGFyYW1zOwogICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKIAogICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAKaW5kZXggNWNkNjIzZS4uYmI2Y2YxMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuY3BwCkBAIC0yOSwyNiArMjksMTcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK2NvbnN0IExWTV9JTlQxNiBMVlJFVl9NQVhfVF9ERUxBWVtdID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBMVlJFVl9NQVhfVDJfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDNfREVMQVl9OworY29uc3QgTFZNX0lOVDE2IExWUkVWX01BWF9BUF9ERUxBWVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKIC8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLwotY29uc3QgTFZNX1VJTlQzMiBMVk1fRnNUYWJsZVtdID0gewotICAgIDgwMDAgLAotICAgIDExMDI1LAotICAgIDEyMDAwLAotICAgIDE2MDAwLAotICAgIDIyMDUwLAotICAgIDI0MDAwLAotICAgIDMyMDAwLAotICAgIDQ0MTAwLAotICAgIDQ4MDAwLAotICAgIDg4MjAwLAotICAgIDk2MDAwLAotICAgIDE3NjQwMCwKLSAgICAxOTIwMDAKLX07Citjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7ODAwMCwgIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAgMjQwMDAsIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMH07CiAvKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KLUxWTV9VSU5UMzIgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KXsKLSAgICBpZiAoRnNJbmRleCA+IExWTV9GU18xOTIwMDApCi0gICAgICAgIHJldHVybiAwOworTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpIHsKKyAgICBpZiAoRnNJbmRleCA+IExWTV9GU18xOTIwMDApIHJldHVybiAwOwogCiAgICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7CiB9CkBAIC03MywzMCArNjQsMTc0IEBACiAgICovCiAKIC8qIE5vcm1hbGl6aW5nIG91dHB1dCBpbmNsdWRpbmcgUmV2ZXJiIExldmVsIHBhcnQgKG9ubHkgc2hpZnQgdXApKi8KLWNvbnN0IExWTV9GTE9BVCBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XT17ezEsMS4wNDU5MDlmLDcuNjgxMDk4ZiwtNy4yMTE1MDBmLDMuMDI1NjA1Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwxLjA4ODE5NGYsMTAuMjkxNzQ5ZiwtMTEuNTEzNzg3Ziw1LjI2NTgxN2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMsMC45ODg5MTlmLDguMjk5OTU2ZiwtOC45MjA4NjJmLDMuOTc5ODA2Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NCwxLjAzNTkyN2YsMTAuMTgyNTY3ZiwtMTAuMzQ2MTM0Ziw0LjU0NjUzM2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUsMS4xMzAzMTNmLDEyLjUzODcyN2YsLTEzLjYyNzAyM2YsNi4xNjUyMDhmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2LDEuMDYwNzQzZiw4LjA5MTcxM2YsLTguNTg4MDc5ZiwzLjgzNDIzMGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcsMS4wNDAzODFmLDEwLjQwNjU2NmYsLTExLjE3NjY1MGYsNS4wNzUxMzJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4LDEuMDI2OTQ0Ziw4LjM4NzMwMmYsLTguNjg5Nzk2ZiwzLjg5NTg2M2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezksMS4wMTMzMTJmLDkuNzI3MjM2ZiwtMTAuNTM0MTY1Ziw0Ljc0MjI3MmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwLDAuOTk2MDk1Ziw4LjQ5MjI0OWYsLTcuOTQ3Njc3ZiwzLjQ3ODkxN2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEzLDEuMDc5MzQ2Ziw4Ljg5NDQyNWYsLTkuNjQxNzY4Ziw0LjQzNDQ0MmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE1LDAuOTk0MzI3Ziw3LjQ0MTMzNWYsLTguMDAzOTc5ZiwzLjU4MTE3N2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE3LDAuOTkxMDY3Ziw3LjIwODM3M2YsLTcuMjU3ODU5ZiwzLjE2Nzc3NGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIwLDEuMDMzNDQ1Ziw3LjQ3NjM3MWYsLTcuNTQ2OTYwZiwzLjM2OTcwM2YsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezI1LDAuOTgyODMwZiw1LjkxMzg2N2YsLTUuNjM4NDQ4ZiwyLjQyMDkzMmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwLDAuOTI4NzgyZiw1LjAzNTM0M2YsLTQuNDkyMTA0ZiwxLjg0NDkwNGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQwLDAuOTUzNzE0Ziw1LjA2MDIzMmYsLTQuNDcyMjA0ZiwxLjgyOTY0MmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezUwLDAuODk5MjU4Ziw0LjI3MzM1N2YsLTMuNTM3NDkyZiwxLjM4NzU3NmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYwLDAuOTQzNTg0Ziw0LjA5MzIyOGYsLTMuNDY5NjU4ZiwxLjQxMDkxMWYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwLDAuOTI2MDIxZiwzLjk3MzEyNWYsLTMuMzMxOTg1ZiwxLjM0NDY5MGYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezc1LDAuODk0ODUzZiwyLjg3MTc0N2YsLTEuNDM4NzU4ZiwwLjMxMTg1NmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezgwLDAuOTM1MTIyZiwyLjk5MTg1N2YsLTIuMDM4ODgyZiwwLjY4NjM5NWYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezkwLDAuOTUzODcyZiwyLjg4MDMxNWYsLTIuMTIyMzY1ZiwwLjc4NDAzMmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwwLjk1MTAwNWYsMi44OTQyOTRmLC0yLjAwOTA4NmYsMC42OTgzMTZmLH0sCitjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV0gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIDEuMDQ1OTA5ZiwKKyAgICAgICAgICAgICAgICA3LjY4MTA5OGYsCisgICAgICAgICAgICAgICAgLTcuMjExNTAwZiwKKyAgICAgICAgICAgICAgICAzLjAyNTYwNWYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAyLAorICAgICAgICAgICAgICAgIDEuMDg4MTk0ZiwKKyAgICAgICAgICAgICAgICAxMC4yOTE3NDlmLAorICAgICAgICAgICAgICAgIC0xMS41MTM3ODdmLAorICAgICAgICAgICAgICAgIDUuMjY1ODE3ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgMC45ODg5MTlmLAorICAgICAgICAgICAgICAgIDguMjk5OTU2ZiwKKyAgICAgICAgICAgICAgICAtOC45MjA4NjJmLAorICAgICAgICAgICAgICAgIDMuOTc5ODA2ZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDQsCisgICAgICAgICAgICAgICAgMS4wMzU5MjdmLAorICAgICAgICAgICAgICAgIDEwLjE4MjU2N2YsCisgICAgICAgICAgICAgICAgLTEwLjM0NjEzNGYsCisgICAgICAgICAgICAgICAgNC41NDY1MzNmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNSwKKyAgICAgICAgICAgICAgICAxLjEzMDMxM2YsCisgICAgICAgICAgICAgICAgMTIuNTM4NzI3ZiwKKyAgICAgICAgICAgICAgICAtMTMuNjI3MDIzZiwKKyAgICAgICAgICAgICAgICA2LjE2NTIwOGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA2LAorICAgICAgICAgICAgICAgIDEuMDYwNzQzZiwKKyAgICAgICAgICAgICAgICA4LjA5MTcxM2YsCisgICAgICAgICAgICAgICAgLTguNTg4MDc5ZiwKKyAgICAgICAgICAgICAgICAzLjgzNDIzMGYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA3LAorICAgICAgICAgICAgICAgIDEuMDQwMzgxZiwKKyAgICAgICAgICAgICAgICAxMC40MDY1NjZmLAorICAgICAgICAgICAgICAgIC0xMS4xNzY2NTBmLAorICAgICAgICAgICAgICAgIDUuMDc1MTMyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgMS4wMjY5NDRmLAorICAgICAgICAgICAgICAgIDguMzg3MzAyZiwKKyAgICAgICAgICAgICAgICAtOC42ODk3OTZmLAorICAgICAgICAgICAgICAgIDMuODk1ODYzZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDksCisgICAgICAgICAgICAgICAgMS4wMTMzMTJmLAorICAgICAgICAgICAgICAgIDkuNzI3MjM2ZiwKKyAgICAgICAgICAgICAgICAtMTAuNTM0MTY1ZiwKKyAgICAgICAgICAgICAgICA0Ljc0MjI3MmYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgICAwLjk5NjA5NWYsCisgICAgICAgICAgICAgICAgOC40OTIyNDlmLAorICAgICAgICAgICAgICAgIC03Ljk0NzY3N2YsCisgICAgICAgICAgICAgICAgMy40Nzg5MTdmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMTMsCisgICAgICAgICAgICAgICAgMS4wNzkzNDZmLAorICAgICAgICAgICAgICAgIDguODk0NDI1ZiwKKyAgICAgICAgICAgICAgICAtOS42NDE3NjhmLAorICAgICAgICAgICAgICAgIDQuNDM0NDQyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDE1LAorICAgICAgICAgICAgICAgIDAuOTk0MzI3ZiwKKyAgICAgICAgICAgICAgICA3LjQ0MTMzNWYsCisgICAgICAgICAgICAgICAgLTguMDAzOTc5ZiwKKyAgICAgICAgICAgICAgICAzLjU4MTE3N2YsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAxNywKKyAgICAgICAgICAgICAgICAwLjk5MTA2N2YsCisgICAgICAgICAgICAgICAgNy4yMDgzNzNmLAorICAgICAgICAgICAgICAgIC03LjI1Nzg1OWYsCisgICAgICAgICAgICAgICAgMy4xNjc3NzRmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgMjAsCisgICAgICAgICAgICAgICAgMS4wMzM0NDVmLAorICAgICAgICAgICAgICAgIDcuNDc2MzcxZiwKKyAgICAgICAgICAgICAgICAtNy41NDY5NjBmLAorICAgICAgICAgICAgICAgIDMuMzY5NzAzZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDI1LAorICAgICAgICAgICAgICAgIDAuOTgyODMwZiwKKyAgICAgICAgICAgICAgICA1LjkxMzg2N2YsCisgICAgICAgICAgICAgICAgLTUuNjM4NDQ4ZiwKKyAgICAgICAgICAgICAgICAyLjQyMDkzMmYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAzMCwKKyAgICAgICAgICAgICAgICAwLjkyODc4MmYsCisgICAgICAgICAgICAgICAgNS4wMzUzNDNmLAorICAgICAgICAgICAgICAgIC00LjQ5MjEwNGYsCisgICAgICAgICAgICAgICAgMS44NDQ5MDRmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNDAsCisgICAgICAgICAgICAgICAgMC45NTM3MTRmLAorICAgICAgICAgICAgICAgIDUuMDYwMjMyZiwKKyAgICAgICAgICAgICAgICAtNC40NzIyMDRmLAorICAgICAgICAgICAgICAgIDEuODI5NjQyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDUwLAorICAgICAgICAgICAgICAgIDAuODk5MjU4ZiwKKyAgICAgICAgICAgICAgICA0LjI3MzM1N2YsCisgICAgICAgICAgICAgICAgLTMuNTM3NDkyZiwKKyAgICAgICAgICAgICAgICAxLjM4NzU3NmYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA2MCwKKyAgICAgICAgICAgICAgICAwLjk0MzU4NGYsCisgICAgICAgICAgICAgICAgNC4wOTMyMjhmLAorICAgICAgICAgICAgICAgIC0zLjQ2OTY1OGYsCisgICAgICAgICAgICAgICAgMS40MTA5MTFmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgNzAsCisgICAgICAgICAgICAgICAgMC45MjYwMjFmLAorICAgICAgICAgICAgICAgIDMuOTczMTI1ZiwKKyAgICAgICAgICAgICAgICAtMy4zMzE5ODVmLAorICAgICAgICAgICAgICAgIDEuMzQ0NjkwZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDc1LAorICAgICAgICAgICAgICAgIDAuODk0ODUzZiwKKyAgICAgICAgICAgICAgICAyLjg3MTc0N2YsCisgICAgICAgICAgICAgICAgLTEuNDM4NzU4ZiwKKyAgICAgICAgICAgICAgICAwLjMxMTg1NmYsCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICA4MCwKKyAgICAgICAgICAgICAgICAwLjkzNTEyMmYsCisgICAgICAgICAgICAgICAgMi45OTE4NTdmLAorICAgICAgICAgICAgICAgIC0yLjAzODg4MmYsCisgICAgICAgICAgICAgICAgMC42ODYzOTVmLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgOTAsCisgICAgICAgICAgICAgICAgMC45NTM4NzJmLAorICAgICAgICAgICAgICAgIDIuODgwMzE1ZiwKKyAgICAgICAgICAgICAgICAtMi4xMjIzNjVmLAorICAgICAgICAgICAgICAgIDAuNzg0MDMyZiwKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAwLjk1MTAwNWYsCisgICAgICAgICAgICAgICAgMi44OTQyOTRmLAorICAgICAgICAgICAgICAgIC0yLjAwOTA4NmYsCisgICAgICAgICAgICAgICAgMC42OTgzMTZmLAorICAgICAgICB9LAogfTsKIC8qIEVuZCBvZiBmaWxlICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKaW5kZXggZTEwMGQ4YS4uNzIzZDFmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKQEAgLTMxLDExICszMSwxMyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotZXh0ZXJuIGNvbnN0ICAgIExWTV9VSU5UMzIgIExWTV9Gc1RhYmxlW107Ci1leHRlcm4gICAgICAgICAgTFZNX1VJTlQzMiAgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW107CitleHRlcm4gTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOwogCi1leHRlcm4gY29uc3QgICAgTFZNX0ZMT0FUICAgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV07CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlJFVl9NQVhfVF9ERUxBWVtdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlJFVl9NQVhfQVBfREVMQVlbXTsKIAotI2VuZGlmICAvKiogX0xWUkVWX1RBQkxFU19IXyAqKi8KKyNlbmRpZiAvKiogX0xWUkVWX1RBQkxFU19IXyAqKi8KIAogLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL2xpYi9MVlBTQS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKaW5kZXggYzlmYTdhZC4uODVlM2FiOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmgKQEAgLTIyLDI1NSArMjIsMTkxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ09OU1RBTlRTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lICAgICBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgIDQgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRZUEVTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVlBTQV9QRVJTSVNURU5UICAgICAgPSBMVk1fUEVSU0lTVEVOVCwKLSAgICBMVlBTQV9QRVJTSVNURU5UX0RBVEEgPSBMVk1fUEVSU0lTVEVOVF9EQVRBLAotICAgIExWUFNBX1BFUlNJU1RFTlRfQ09FRiA9IExWTV9QRVJTSVNURU5UX0NPRUYsCi0gICAgTFZQU0FfU0NSQVRDSCAgICAgICAgID0gTFZNX1NDUkFUQ0gsCi0gICAgTFZQU0FfTUVNT1JZX0RVTU1ZID0gTFZNX01BWElOVF8zMiAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBMVlBTQV9NZW1vcnlUeXBlc19lbjsKLQogLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkIGNvbnRyb2wgcGFyYW1ldGVycyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZQU0FfU1BFRURfTE9XLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX1NQRUVEX01FRElVTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVkaXVtIHNwZWVkIGxldmVsICAgZGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9TUEVFRF9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfU1BFRURfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSAzMiBiaXRzIGVudW0sIGRvbid0IHVzZSBpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlBTQV9TUEVFRF9MT1csICAgIC8qIExvdyBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfU1BFRURfTUVESVVNLCAvKiBNZWRpdW0gc3BlZWQgbGV2ZWwgICBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1NQRUVEX0hJR0gsICAgLyogSGlnaCBzcGVlZCBsZXZlbCAgIGRldGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9TUEVFRF9EVU1NWSA9IExWTV9NQVhJTlRfMzIgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICovCiB9IExWUFNBX0xldmVsRGV0ZWN0U3BlZWRfZW47CiAKIC8qIEZpbHRlciBjb250cm9sIHBhcmFtZXRlcnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgQ2VudGVyRnJlcXVlbmN5OyAgICAgICAgICAgICAvKiBDZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBiYW5kLXBhc3MgZmlsdGVyIChpbiBIeikgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgLyogUXVhbGl0eSBmYWN0b3Igb2YgdGhlIGZpbHRlciAgICAgICAgICAgICAoaW4gMS8xMDApICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICBQb3N0R2FpbjsgICAgICAgICAgICAgICAgICAgIC8qIFBvc3RnYWluIHRvIGFwcGx5IGFmdGVyIHRoZSBmaWx0ZXJpbmcgICAgKGluIGRCIFExNi4wKSAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQxNiBDZW50ZXJGcmVxdWVuY3k7IC8qIENlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGJhbmQtcGFzcyBmaWx0ZXIgKGluIEh6KSAqLworICAgIExWTV9VSU5UMTYgUUZhY3RvcjsgLyogUXVhbGl0eSBmYWN0b3Igb2YgdGhlIGZpbHRlciAgICAgICAgICAgICAoaW4gMS8xMDApICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fSU5UMTYgUG9zdEdhaW47IC8qIFBvc3RnYWluIHRvIGFwcGx5IGFmdGVyIHRoZSBmaWx0ZXJpbmcgICAgKGluIGRCIFExNi4wKSAgICAgICAgICAgICovCiAKIH0gTFZQU0FfRmlsdGVyUGFyYW1fdDsKIAogLyogTFZQU0EgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgIC8qIFNwZWN0cmFsIGRhdGEgYnVmZmVyIGR1cmF0aW9uIGluIHRpbWUgKG1zIGluIFExNi4wKSAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTWF4SW5wdXRCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIGV4cGVjdGVkIGlucHV0IGJsb2NrIHNpemUgKGluIHNhbXBsZXMpICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG5CYW5kczsgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICpwRmlsdGVyc1BhcmFtczsgICAgICAgICAgICAgIC8qIFBvaW50cyB0byBuQmFuZHMgZmlsdGVyIHBhcmFtIHN0cnVjdHVyZXMgZm9yIGZpbHRlcnMgc2V0dGluZ3MgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX1VJTlQxNgorICAgICAgICAgICAgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247IC8qIFNwZWN0cmFsIGRhdGEgYnVmZmVyIGR1cmF0aW9uIGluIHRpbWUgKG1zIGluIFExNi4wKSAqLworICAgIExWTV9VSU5UMTYgTWF4SW5wdXRCbG9ja1NpemU7ICAgICAgIC8qIE1heGltdW0gZXhwZWN0ZWQgaW5wdXQgYmxvY2sgc2l6ZSAoaW4gc2FtcGxlcykgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IG5CYW5kczsgLyogTnVtYmVyIG9mIGJhbmRzIG9mIHRoZSBTQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9GaWx0ZXJQYXJhbV90KgorICAgICAgICAgICAgcEZpbHRlcnNQYXJhbXM7IC8qIFBvaW50cyB0byBuQmFuZHMgZmlsdGVyIHBhcmFtIHN0cnVjdHVyZXMgZm9yIGZpbHRlcnMgc2V0dGluZ3MgICAgICovCiAKIH0gTFZQU0FfSW5pdFBhcmFtc190LCAqcExWUFNBX0luaXRQYXJhbXNfdDsKIAogLyogTFZQU0EgY29udHJvbCBwYXJhbWV0ZXJzICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgIEZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxpbmcgcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuICBMZXZlbERldGVjdGlvblNwZWVkOyAgICAgICAgIC8qIExldmVsIGRldGVjdGlvbiBzcGVlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZzX2VuIEZzOyAvKiBJbnB1dCBzYW1wbGluZyByYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX0xldmVsRGV0ZWN0U3BlZWRfZW4gTGV2ZWxEZXRlY3Rpb25TcGVlZDsgLyogTGV2ZWwgZGV0ZWN0aW9uIHNwZWVkICovCiAKIH0gTFZQU0FfQ29udHJvbFBhcmFtc190LCAqcExWUFNBX0NvbnRyb2xQYXJhbXNfdDsKIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9NZW1vcnlUeXBlc19lbiAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBMVlBTQV9NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVlBTQV9NZW1vcnlSZWdpb25fdCAgICAgICBSZWdpb25bTFZQU0FfTlJfTUVNT1JZX1JFR0lPTlNdOy8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IExWUFNBX01lbVRhYl90OwotCiAvKiBBdWRpbyB0aW1lIHR5cGUgKi8KIHR5cGVkZWYgTFZNX0lOVDMyIExWUFNBX1RpbWU7CiAKIC8qIE1vZHVsZSBpbnN0YW5jZSBIYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAqcExWUFNBX0hhbmRsZV90OwordHlwZWRlZiB2b2lkKiBwTFZQU0FfSGFuZGxlX3Q7CiAKIC8qIExWUFNBIHJldHVybiBjb2RlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZQU0FfT0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZnVuY3Rpb24gcmFuIHdpdGhvdXQgYW55IHByb2JsZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQSBwYXJhbWV0ZXIgaXMgaW5jb3JyZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9FUlJPUl9XUk9OR1RJTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFuIGluY29ycmVjdCBBdWRpb1RpbWUgaXMgdXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfRVJST1JfTlVMTEFERFJFU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBIHBvaW50ZXIgaGFzIGEgTlVMTCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX1JFVFVSTl9EVU1NWSA9IExWTV9NQVhJTlRfMzIgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTFZQU0FfT0ssIC8qIFRoZSBmdW5jdGlvbiByYW4gd2l0aG91dCBhbnkgcHJvYmxlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNLCAvKiBBIHBhcmFtZXRlciBpcyBpbmNvcnJlY3QgKi8KKyAgICBMVlBTQV9FUlJPUl9XUk9OR1RJTUUsICAgLyogQW4gaW5jb3JyZWN0IEF1ZGlvVGltZSBpcyB1c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUywgLyogQSBwb2ludGVyIGhhcyBhIE5VTEwgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVlBTQV9SRVRVUk5fRFVNTVkgPSBMVk1fTUFYSU5UXzMyIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAqLwogfSBMVlBTQV9SRVRVUk47CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OUyBQUk9UT1RZUEUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfTWVtb3J5ICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICpwSW5pdFBhcmFtcyAgICApOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0UGFyYW1zICAgICAgICAgIEluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udHJvbFBhcmFtcyAgICAgICBDb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYXJlYSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdChwTFZQU0FfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWUFNBX0luaXRQYXJhbXNfdCogcEluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBDb250cm9sUGFyYW1zLCB2b2lkKiBwU2NyYXRjaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBpbiBMVlBTQV9Jbml0IGNhbGwgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9EZUluaXQocExWUFNBX0hhbmRsZV90KiBwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQ29udHJvbCAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdGlhbGl6ZXMgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICovCisvKiAgQ29udHJvbHMgdGhlIExWUFNBIG1vZHVsZS4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICovCisvKiAgcE5ld1BhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluaXRQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDb250cm9sUGFyYW1zICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfQ29udHJvbChwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBOZXdQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Qcm9jZXNzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb250cm9scyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogKi8KKy8qICBUaGUgcHJvY2VzcyBjYWxjdWxhdGVzIHRoZSBsZXZlbHMgb2YgdGhlIGZyZXF1ZW5jeSBiYW5kcy4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTmV3UGFyYW1zICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICovCisvKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAqLworLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICBQbGF5YmFjayB0aW1lIG9mIHRoZSBmaXJzdCBpbnB1dCBzYW1wbGUgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApOworTFZQU0FfUkVUVVJOIExWUFNBX1Byb2Nlc3MocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBJbnB1dEJsb2NrU2l6ZSwgTFZQU0FfVGltZSBBdWRpb1RpbWUpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRTcGVjdHJ1bSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICovCisvKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgVGltZSB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGF0ICovCisvKiAgcEN1cnJlbnRWYWx1ZXMgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBidWZmZXIgOiBDdXJyZW50IGxldmVsIHZhbHVlcyBvdXRwdXQgKi8KKy8qICBwUGVha1ZhbHVlcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGJ1ZmZlciA6IFBlYWsgbGV2ZWwgdmFsdWVzIG91dHB1dCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0ocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfVGltZSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDgqIHBDdXJyZW50VmFsdWVzLCBMVk1fVUlOVDgqIHBQZWFrVmFsdWVzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhlIHByb2Nlc3MgY2FsY3VsYXRlcyB0aGUgbGV2ZWxzIG9mIHRoZSBmcmVxdWVuY3kgYmFuZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICovCisvKiAgR2V0IHRoZSBjdXJyZW50IGNvbnRyb2wgcGFyYW1ldGVycyBvZiB0aGUgTFZQU0EgbW9kdWxlLiAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBMVlBTQV9JbnB1dFNhbXBsZXMgUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbnB1dEJsb2NrU2l6ZSAgICAgIE51bWJlciBvZiBtb25vIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQXVkaW9UaW1lICAgICAgICAgICBQbGF5YmFjayB0aW1lIG9mIHRoZSBmaXJzdCBpbnB1dCBzYW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgKi8KKy8qIFJFVFVSTlM6ICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSBUaW1lIHRvIHJldHJpZXZlIHRoZSB2YWx1ZXMgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEN1cnJlbnRWYWx1ZXMgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBidWZmZXIgOiBDdXJyZW50IGxldmVsIHZhbHVlcyBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQZWFrVmFsdWVzICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgYnVmZmVyIDogUGVhayBsZXZlbCB2YWx1ZXMgb3V0cHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0gICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBDdXJyZW50VmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAqcFBlYWtWYWx1ZXMgICAgICAgICAgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyhwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBMVlBTQSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogKi8KKy8qICBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgb2YgdGhlIExWUFNBIG1vZHVsZS4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgKi8KKy8qIFJFVFVSTlM6ICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAqLworLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgKnBQYXJhbXMgICAgICApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgb2YgdGhlIExWUFNBIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfR2V0SW5pdFBhcmFtcyAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICpwUGFyYW1zICAgICAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0luaXRQYXJhbXNfdCogcFBhcmFtcyk7CiAKICNlbmRpZiAvKiBfTFZQU0FfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCmluZGV4IGRlYWZhYTcuLjhlNjM1MDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAKQEAgLTE1LDMwICsxNSwyNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgICAgIkxWUFNBLmgiCi0jaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgotI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlICJMVlBTQS5oIgorI2luY2x1ZGUgIkxWUFNBX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLSNkZWZpbmUgICAgIExPV19GUkVRICAgICAgICAgICAgMjk4ICAgICAgICAgICAgIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCi0jZGVmaW5lICAgICBISUdIX0ZSRVEgICAgICAgICAgIDM4NiAgICAgICAgICAgICAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLworI2RlZmluZSBMT1dfRlJFUSAyOTggIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCisjZGVmaW5lIEhJR0hfRlJFUSAzODYgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KIAotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAqcENvZWZmaWNpZW50cyk7CitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZQU0FfRmlsdGVyUGFyYW1fdCogcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKTsKIAotTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CitMVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiBGcywgTFZQU0FfRmlsdGVyUGFyYW1fdCogcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190KiBwQ29lZmZpY2llbnRzKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKTsKIAotTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpOworTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NiwyOSArNTIsMjMgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcE5ld1BhcmFtcyAgICAgKQoteworTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wocExWUFNBX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwTmV3UGFyYW1zKSB7CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKIAotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBOZXdQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBOZXdQYXJhbXMgPT0gTFZNX05VTEwpKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KLSAgICBpZihwTmV3UGFyYW1zLT5GcyA+PSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIGlmIChwTmV3UGFyYW1zLT5GcyA+PSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CiAgICAgfQotICAgIGlmKHBOZXdQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7CisgICAgaWYgKHBOZXdQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKICAgICB9CiAKICAgICBwTFZQU0FfSW5zdC0+TmV3UGFyYW1zID0gKnBOZXdQYXJhbXM7CiAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9UUlVFOwogCi0gICAgcmV0dXJuKExWUFNBX09LKTsKKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTk2LDIwICs4NiwxNyBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICpwUGFyYW1zICkKLXsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX0NvbnRyb2xQYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CiAKLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CiAgICAgfQogCi0gICAgcFBhcmFtcy0+RnMgICAgICAgICAgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzOwotICAgIHBQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgICAgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkOworICAgIHBQYXJhbXMtPkZzID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnM7CisgICAgcFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQ7CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTI3LDIyICsxMTQsMTkgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAqcFBhcmFtcyApCi17Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0SW5pdFBhcmFtcyhwTFZQU0FfSGFuZGxlX3QgaEluc3RhbmNlLCBMVlBTQV9Jbml0UGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QqIHBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwogCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwogICAgIH0KIAotICAgIHBQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uICAgPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247Ci0gICAgcFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZTsKLSAgICBwUGFyYW1zLT5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBwUGFyYW1zLT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zOworICAgIHBQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgIHBQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID0gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplOworICAgIHBQYXJhbXMtPm5CYW5kcyA9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgcFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgPSBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXM7CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYzLDQ2ICsxNDcsNDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCkKLXsKK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzKExWUFNBX0luc3RhbmNlUHJfdCogcEluc3QpIHsKICAgICBMVk1fVUlOVDE2IGlpOwogICAgIExWTV9VSU5UMTYgRnJlcTsKLSAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7Ci0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKLSAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107Ci0gICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190IFBhcmFtczsKKyAgICBleHRlcm4gTFZNX0lOVDE2IExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOworICAgIGV4dGVybiBMVk1fVUlOVDE2IExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOwogCi0gICAgaWYocEluc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgaWYgKHBJbnN0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgUGFyYW1zID0gcEluc3QtPk5ld1BhcmFtczsKIAogICAgIC8qIE1vZGlmaWVzIGZpbHRlcnMgdHlwZXMgYW5kIGNvZWZmaWNpZW50cywgY2xlYXIgdGhlIHRhcHMgYW5kCiAgICAgICAgcmUtaW5pdGlhbGl6ZXMgcGFyYW1ldGVycyBpZiBzYW1wbGUgZnJlcXVlbmN5IGhhcyBjaGFuZ2VkICAgICovCi0gICAgaWYoUGFyYW1zLkZzICE9IHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzKQotICAgIHsKKyAgICBpZiAoUGFyYW1zLkZzICE9IHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzKSB7CiAgICAgICAgIHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gUGFyYW1zLkZzOwogCiAgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNlbnRlciBmcmVxZXVuY2llcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBzYW1wbGUgcmF0ZSAqLwotICAgICAgICBGcmVxID0gKExWTV9VSU5UMTYpICgoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpIC8gKHBJbnN0LT5uQmFuZHMgKyAxKSk7Ci0gICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA9IChMVk1fVUlOVDE2KSAoRnJlcSAqIGlpKTsKKyAgICAgICAgRnJlcSA9IChMVk1fVUlOVDE2KSgoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10gPj4gMSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdC0+bkJhbmRzICsgMSkpOworICAgICAgICBmb3IgKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKSB7CisgICAgICAgICAgICBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWkgLSAxXS5DZW50ZXJGcmVxdWVuY3kgPSAoTFZNX1VJTlQxNikoRnJlcSAqIGlpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsZXZhbnQgZmlsdGVycy4gSWYgdGhlIGNlbnRlciBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlciBpcwogICAgICAgICAgICBiaWdnZXIgdGhhbiB0aGUgbnlxdWlzdCBmcmVxdWVuY3ksIHRoZW4gdGhlIGZpbHRlciBpcyBub3QgcmVsZXZhbnQgYW5kIGRvZXNuJ3QKICAgICAgICAgICAgbmVlZCB0byBiZSB1c2VkICovCi0gICAgICAgIGZvcihpaSA9IHBJbnN0LT5uQmFuZHM7IGlpID4gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpLTFdLkNlbnRlckZyZXF1ZW5jeSA8IChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXT4+MSkpCi0gICAgICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIGlmIChwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWkgLSAxXS5DZW50ZXJGcmVxdWVuY3kgPAorICAgICAgICAgICAgICAgIChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXSA+PiAxKSkgewogICAgICAgICAgICAgICAgIHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzID0gaWk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlIGJpcXVhZCBpbnN0YW5jZQorICAgICAgICAgKi8KKyAgICAgICAgcEluc3QtPnNwZWNCaXF1YWQucmVzaXplKHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KEZDQ18xKSk7CiAgICAgICAgIExWUFNBX1NldEJQRmlsdGVyc1R5cGUocEluc3QsICZQYXJhbXMpOwogICAgICAgICBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwogICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwpAQCAtMjExLDE5ICsxOTYsMTQgQEAKICAgICAgICAgcEluc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IDA7CiAgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3IgPSBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbUGFyYW1zLkZzXTsKICAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gMDsKLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCAocEluc3QtPm5CYW5kcyAqIHBJbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpOyBpaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IChwSW5zdC0+bkJhbmRzICogcEluc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCk7IGlpKyspIHsKICAgICAgICAgICAgIHBJbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnRbaWldID0gMDsKICAgICAgICAgfQotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5CYW5kczsgaWkrKykgewogICAgICAgICAgICAgcEluc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9IDA7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCkKLSAgICAgICAgeworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAhPSBwSW5zdC0+Q3VycmVudFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkKSB7CiAgICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjUzLDQ3ICsyMzMsNDMgQEAKIC8qICAgICAgICAgIFNpbmdsZSBwcmVjaXNpb24gICAgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQotewotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGlpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmcyA9IChMVk1fVUlOVDMyKUxWUFNBX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+RnNdOyAgICAgIC8qIFNhbXBsZSByYXRlICovCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgUUZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCitMVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0LCBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiBMVlBTQV9TYW1wbGVSYXRlVGFiW107IC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisgICAgTFZNX1VJTlQxNiBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWTV9VSU5UMzIgZnMgPSAoTFZNX1VJTlQzMilMVlBTQV9TYW1wbGVSYXRlVGFiWyhMVk1fVUlOVDE2KXBQYXJhbXMtPkZzXTsgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fVUlOVDMyIGZjOyAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fSU5UMTYgUUZhY3RvcjsgLyogRmlsdGVyIFEgZmFjdG9yICovCiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspIHsKICAgICAgICAgLyoKICAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKICAgICAgICAgICovCi0gICAgICAgIGZjID0gKExWTV9VSU5UMzIpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0oTFZNX0lOVDE2KSBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldCisgICAgICAgICAgICAgICAgICAgICAuQ2VudGVyRnJlcXVlbmN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yOyAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KIAogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAogICAgICAgICAgKi8KLSAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCi0gICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkKLSAgICAgICAgeworICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPQorICAgICAgICAgICAgICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjsgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYgKFFGYWN0b3IgPiAzMDApKQotICAgICAgICAgICAgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCgoTE9XX0ZSRVEgKiBmcykgPCAoZmMgPDwgMTUpKSAmJiAoKGZjIDw8IDE1KSA8IChISUdIX0ZSRVEgKiBmcykpICYmCisgICAgICAgICAgICAgICAgKFFGYWN0b3IgPiAzMDApKSB7CiAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpCi0gICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMTQsNjAgKzI5MCw1OSBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBpaTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1VJTlQxNiBpaTsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgogICAgICAqLwotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoICAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKSB7CisgICAgICAgIHN3aXRjaCAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKSB7CisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjogeworICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgQ29lZmZpY2llbnRzOwogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLCAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICZwSW5zdC0+cEJQX0luc3RhbmNlc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEJQX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmFycmF5PExWTV9GTE9BVCwgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OmtCaXF1YWROdW1Db2Vmcz4gY29lZnMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudHMuQTAsIDAuMCwgLShDb2VmZmljaWVudHMuQTApLCAtKENvZWZmaWNpZW50cy5CMSksCisgICAgICAgICAgICAgICAgICAgICAgICAtKENvZWZmaWNpZW50cy5CMil9OworICAgICAgICAgICAgICAgIHBJbnN0LT5zcGVjQmlxdWFkW2lpXQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvZWZmaWNpZW50czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6IHsKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190IENvZWZmaWNpZW50czsKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLCAmcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKIAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICgmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjphcnJheTxMVk1fRkxPQVQsIGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjprQmlxdWFkTnVtQ29lZnM+IGNvZWZzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLkEwLCAwLjAsIC0oQ29lZmZpY2llbnRzLkEwKSwgLShDb2VmZmljaWVudHMuQjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgLShDb2VmZmljaWVudHMuQjIpfTsKKyAgICAgICAgICAgICAgICBwSW5zdC0+c3BlY0JpcXVhZFtpaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb2VmZmljaWVudHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zODgsMjYgKzM2MywyMCBAQAogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKLXsKLSAgICBMVk1fVUlOVDE2ICAgICBpaTsKLSAgICBMVk1fRnNfZW4gICAgICBGcyA9IHBQYXJhbXMtPkZzOwotICAgIFFQRF9GTE9BVF9Db2VmcyAgKnBDb2VmZmljaWVudHM7Ci0gICAgZXh0ZXJuICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoTFZQU0FfSW5zdGFuY2VQcl90KiBwSW5zdCwgTFZQU0FfQ29udHJvbFBhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZNX1VJTlQxNiBpaTsKKyAgICBMVk1fRnNfZW4gRnMgPSBwUGFyYW1zLT5GczsKKyAgICBRUERfRkxPQVRfQ29lZnMqIHBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuIFFQRF9GTE9BVF9Db2VmcyBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKIAotICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworICAgIHBDb2VmZmljaWVudHMgPQorICAgICAgICAgICAgJkxWUFNBX1FQRF9GbG9hdF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKIAotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgTFZQU0FfUVBEX0luaXRfRmxvYXQgKCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wUVBEX1RhcHNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvZWZmaWNpZW50cyApOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKSB7CisgICAgICAgIExWUFNBX1FQRF9Jbml0X0Zsb2F0KCZwSW5zdC0+cFFQRF9TdGF0ZXNbaWldLCAmcEluc3QtPnBRUERfVGFwc1tpaV0sIHBDb2VmZmljaWVudHMpOwogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7Ci0KKyAgICByZXR1cm4gKExWUFNBX09LKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NDMsNDkgKzQxMiw0NiBAQAogLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKQotewotCi0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdOworTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgRnMsIExWUFNBX0ZpbHRlclBhcmFtX3QqIHBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCogcENvZWZmaWNpZW50cykgeworICAgIGV4dGVybiBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKIAogICAgIC8qCiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQ09TX1QwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICBMVk1fRkxPQVQgVDA7CisgICAgTFZNX0ZMT0FUIEQ7CisgICAgTFZNX0ZMT0FUIEEwOworICAgIExWTV9GTE9BVCBCMTsKKyAgICBMVk1fRkxPQVQgQjI7CisgICAgTFZNX0ZMT0FUIER0MDsKKyAgICBMVk1fRkxPQVQgQjJfRGVuOworICAgIExWTV9GTE9BVCBCMl9OdW07CisgICAgTFZNX0ZMT0FUIENPU19UMDsKKyAgICBMVk1fRkxPQVQgY29lZjsKKyAgICBMVk1fRkxPQVQgZmFjdG9yOworICAgIExWTV9GTE9BVCB0MDsKKyAgICBMVk1fSU5UMTYgaTsKIAogICAgIC8qCiAgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKyAgICBMVk1fRkxPQVQgRnJlcXVlbmN5ID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgUUZhY3RvciA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCi0gICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKyAgICBUMCA9IEZyZXF1ZW5jeSAqIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW0ZzXTsgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KKyAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAogICAgICAqLwotICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIER0MCA9IFQwIC8gMjA0ODsKICAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOwogICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7CiAgICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7CkBAIC00OTUsMjAgKzQ2MSwxOSBAQAogICAgICAqCiAgICAgICogIENvcyArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNgogICAgICAqLwotICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLwotICAgIHQwID0gVDAgOwotICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KLSAgICBDT1NfVDAgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQotICAgIHsKLSAgICAgICAgY29lZiAgICA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCi0gICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgID0gKGZhY3RvciAqIHQwKSA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLworICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy8yICovCisgICAgdDAgPSBUMDsKKyAgICBmYWN0b3IgPSAxLjBmOyAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCisgICAgQ09TX1QwID0gMC4wZjsgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07IC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCisgICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciA9IChmYWN0b3IgKiB0MCk7ICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLwogICAgIH0KLSAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAgICAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKyAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCiAKLSAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKSAqIChDT1NfVDApOyAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCi0gICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgKyBCMikgLyAyOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KKyAgICBCMSA9ICgoTFZNX0ZMT0FUKTAuNSAtIEIyKSAqIChDT1NfVDApOyAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCisgICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgKyBCMikgLyAyOyAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLwogCiAgICAgLyoKICAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQpAQCAtNTE3LDcgKzQ4Miw3IEBACiAgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7CiAgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2MSw0OSArNTI2LDQ2IEBACiAvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9CUERvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2IEZzLCBMVlBTQV9GaWx0ZXJQYXJhbV90KiBwRmlsdGVyUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QqIHBDb2VmZmljaWVudHMpIHsKKyAgICBleHRlcm4gTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKIAogICAgIC8qCiAgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQ29zRXJyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKyAgICBMVk1fRkxPQVQgVDA7CisgICAgTFZNX0ZMT0FUIEQ7CisgICAgTFZNX0ZMT0FUIEEwOworICAgIExWTV9GTE9BVCBCMTsKKyAgICBMVk1fRkxPQVQgQjI7CisgICAgTFZNX0ZMT0FUIER0MDsKKyAgICBMVk1fRkxPQVQgQjJfRGVuOworICAgIExWTV9GTE9BVCBCMl9OdW07CisgICAgTFZNX0ZMT0FUIENvc0VycjsKKyAgICBMVk1fRkxPQVQgY29lZjsKKyAgICBMVk1fRkxPQVQgZmFjdG9yOworICAgIExWTV9GTE9BVCB0MDsKKyAgICBMVk1fSU5UMTYgaTsKIAogICAgIC8qCiAgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgogICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKKyAgICBMVk1fRkxPQVQgRnJlcXVlbmN5ID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKKyAgICBMVk1fRkxPQVQgUUZhY3RvciA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CiAKICAgICAvKgogICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCiAgICAgICovCi0gICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgRCA9IDMyMDA7ICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCi0gICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KKyAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KKyAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CiAgICAgICovCi0gICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgRHQwID0gVDAgLyAyMDQ4OwogICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CiAgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKICAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKQEAgLTYxMywyNSArNTc1LDI0IEBACiAgICAgICoKICAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0CiAgICAgICovCi0gICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KKyAgICBUMCA9IFQwICogMC45OTQ3NTBmOyAvKiBTY2FsZSB0byAxLjAgaW4gMTYtYml0IGZvciByYW5nZSAwIHRvIGZzLzUwICovCiAgICAgdDAgPSBUMDsKLSAgICBmYWN0b3IgPSAxLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRvIDEuMCBmb3IgdGhlIGEwIGNvZWZmaWNpZW50ICovCi0gICAgQ29zRXJyID0gMC4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCi0gICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgPSBMVlBTQV9GbG9hdF9EUENvc0NvZWZbaV07ICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLworICAgIGZhY3RvciA9IDEuMGY7IC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KKyAgICBDb3NFcnIgPSAwLjBmOyAvKiBJbml0aWFsaXNlIHRoZSBlcnJvciB0byB6ZXJvICovCisgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICBjb2VmID0gTFZQU0FfRmxvYXRfRFBDb3NDb2VmW2ldOyAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwogICAgICAgICBDb3NFcnIgKz0gZmFjdG9yICogY29lZjsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCi0gICAgICAgIGZhY3RvciA9IGZhY3RvciAqIHQwOyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KKyAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KICAgICB9Ci0gICAgQ29zRXJyID0gQ29zRXJyICogMjsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworICAgIENvc0VyciA9IENvc0VyciAqIDI7IC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KIAogICAgIC8qCiAgICAgICogQ2FsY3VsYXRlIHRoZSBCMSBhbmQgQTAgY29lZmZpY2llbnRzCiAgICAgICovCi0gICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICovCi0gICAgQTAgPSBCMSAqIENvc0VyciA7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIpICogY29zZXJyKHQwKSAqLwotICAgIEIxIC09IEEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgKi8KLSAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSAgKyBCMikgLyAyOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMik7ICAgICAvKiBCMSA9ICgwLjUgLSBiMikgKi8KKyAgICBBMCA9IEIxICogQ29zRXJyOyAgICAgICAgICAgICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIpICogY29zZXJyKHQwKSAqLworICAgIEIxIC09IEEwOyAgICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSArIEIyKSAvIDI7IC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KIAogICAgIC8qCiAgICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKQEAgLTY0MCw3ICs2MDEsNyBAQAogICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7CiAgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY1OCwyNCArNjE5LDEwIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0KQotewotICAgIExWTV9JTlQ4ICAgICAgICpwVGFwQWRkcmVzczsKLSAgICBMVk1fVUlOVDMyICAgICAgIGk7Ci0KLSAgICAvKiBCYW5kIFBhc3MgZmlsdGVycyB0YXBzICovCi0gICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDggKilwSW5zdC0+cEJQX1RhcHM7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCk7IGkrKykKLSAgICB7Ci0gICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKLSAgICB9Ci0gICAgLyogUXVhc2ktcGVhayBmaWx0ZXJzIHRhcHMgKi8KLSAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wUVBEX1RhcHM7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KTsgaSsrKQotICAgIHsKLSAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwSW5zdC0+c3BlY0JpcXVhZC5zaXplKCk7IGkrKykgeworICAgICAgICBwSW5zdC0+c3BlY0JpcXVhZFtpXS5jbGVhcigpOwogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcAppbmRleCA5ZmNkODJmLi5hMGYyOGIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwCkBAIC0xNSwyMyArMTUsMjMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICAgICJMVlBTQS5oIgotI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKLSNpbmNsdWRlICAgICJJbnN0QWxsb2MuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJMVlBTQS5oIgorI2luY2x1ZGUgIkxWUFNBX1ByaXZhdGUuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdGlhbGl6ZSB0aGUgTFZQU0EgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgSW5pdGlhbGl6ZSB0aGUgTFZQU0EgbW9kdWxlIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluaXRQYXJhbXMgICAgICAgICAgSW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBDb250cm9sUGFyYW1zICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICBNZW1vcnkgdGFibGUgdGhhdCBjb250YWlucyBtZW1vcnkgYXJlYXMgZGVmaW5pdGlvbiAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYXJlYSAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5LDc1ICszOSwxOSBAQAogLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0luaXQgICAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgICpwSW5pdFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICAqcENvbnRyb2xQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSApCi17Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAgICpwTFZQU0FfSW5zdDsKLSAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgZXJyb3JDb2RlICAgICAgID0gTFZQU0FfT0s7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIGlpOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgICAgICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbXTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gMDsKLQotICAgIC8qIEludHNfQWxsb2MgaW5zdGFuY2VzLCBuZWVkZWQgZm9yIG1lbW9yeSBhbGlnbm1lbnQgbWFuYWdlbWVudCAqLwotICAgIElOU1RfQUxMT0MgICAgICAgICAgSW5zdGFuY2U7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBTY3JhdGNoOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgRGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIENvZWY7Ci0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBDb250cm9sUGFyYW1zID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotICAgIGlmKCAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID4gTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04pICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPCBMVlBTQV9OQkFORFNNSU4pICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zID09IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgfQotICAgIGZvcihpaSA9IDA7IGlpIDwgcEluaXRQYXJhbXMtPm5CYW5kczsgaWkrKykKLSAgICB7Ci0gICAgICAgIGlmKChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeSA+IExWUFNBX01BWENFTlRFUkZSRVEpIHx8Ci0gICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA+IExWUFNBX01BWFBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPCBMVlBTQV9NSU5RRkFDVE9SKSAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPiBMVlBTQV9NQVhRRkFDVE9SKSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgLypJbnN0X0FsbG9jIGluc3RhbmNlcyBpbml0aWFsaXphdGlvbiAqLwotICAgIEluc3RBbGxvY19Jbml0KCAmSW5zdGFuY2UgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJlNjcmF0Y2ggICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmQ29lZiAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7CitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdChwTFZQU0FfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWUFNBX0luaXRQYXJhbXNfdCogcEluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QqIHBDb250cm9sUGFyYW1zLCB2b2lkKiBwU2NyYXRjaCkgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3Q7CisgICAgTFZQU0FfUkVUVVJOIGVycm9yQ29kZSA9IExWUFNBX09LOworICAgIExWTV9VSU5UMzIgaWk7CisgICAgZXh0ZXJuIExWTV9GTE9BVCBMVlBTQV9GbG9hdF9HYWluVGFibGVbXTsKKyAgICBMVk1fVUlOVDMyIEJ1ZmZlckxlbmd0aCA9IDA7CiAKICAgICAvKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZCAqLwotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSApOwotICAgIH0KLSAgICBwTFZQU0FfSW5zdCA9KExWUFNBX0luc3RhbmNlUHJfdCopKnBoSW5zdGFuY2U7CisgICAgKnBoSW5zdGFuY2UgPSBuZXcgTFZQU0FfSW5zdGFuY2VQcl90e307CisgICAgcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKIAotICAgIC8qIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUzsgaWkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV0uU2l6ZSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGUuUmVnaW9uW2lpXSA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKIAogICAgIC8qIEluaXRpYWxpemUgbW9kdWxlJ3MgaW50ZXJuYWwgcGFyYW1ldGVycyAqLwogICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fRkFMU0U7CkBAIC0xMTcsODEgKzYxLDEzMiBAQAogICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gTFZNX0ZTX0RVTU1ZOwogICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBMVlBTQV9TUEVFRF9EVU1NWTsKIAotICAgIHsgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCi0gICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOwotICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7CisgICAgeyAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCisgICAgICAgIExWTV9JTlQzMiBTREJEID0gKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247CisgICAgICAgIExWTV9JTlQzMiBJUlRJID0gKExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OwogICAgICAgICBMVk1fSU5UMzIgQkw7CiAKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoU0RCRCxJUlRJLEJMLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoU0RCRCwgSVJUSSwgQkwsIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkKIAotICAgICAgICBCdWZmZXJMZW5ndGg9KExWTV9VSU5UMzIpQkw7CisgICAgICAgICAgICAgICAgQnVmZmVyTGVuZ3RoID0gKExWTV9VSU5UMzIpQkw7CiAgICAgfQogCi0gICAgaWYoKEJ1ZmZlckxlbmd0aCAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpICE9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbikKLSAgICB7CisgICAgaWYgKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pIHsKICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aCArIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aDsKICAgICB9CiAKICAgICAvKiBBc3NpZ24gdGhlIHBvaW50ZXJzICovCi0gICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgPQotICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgID0gKExWUFNBX0ZpbHRlclBhcmFtX3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkpOwotICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IChMVk1fVUlOVDggKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSk7Ci0gICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzICAgICAgICAgICAgID0gKExWTV9VSU5UOCAqKQotICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSk7Ci0gICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICopCi0gICAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pKTsKLSAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyAgICAgICAgICA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqKQotICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IChRUERfRkxPQVRfU3RhdGVfdCAqKQotICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpKTsKLQotICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAgICAgICAgICAgICAgID0gKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gKFFQRF9GTE9BVF9UYXBzX3QgKikKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkpOworICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zID0KKyAgICAgICAgICAgIChMVk1fRkxPQVQqKWNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFBvc3RHYWlucykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBQb3N0R2FpbnMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgPSAoTFZQU0FfRmlsdGVyUGFyYW1fdCopY2FsbG9jKAorICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID0gKExWTV9VSU5UOCopY2FsbG9jKAorICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcywgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPQorICAgICAgICAgICAgKExWTV9VSU5UOCopY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gPSAoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4qKWNhbGxvYygKKyAgICAgICAgICAgIHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyA9CisgICAgICAgICAgICAoUVBEX0ZMT0FUX1N0YXRlX3QqKWNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMpKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgPQorICAgICAgICAgICAgKFFQRF9GTE9BVF9UYXBzX3QqKWNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFFQRF9UYXBzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKiBDb3B5IGZpbHRlcnMgcGFyYW1ldGVycyBpbiB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAqLwotICAgIGZvcihpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykKLSAgICB7CisgICAgZm9yIChpaSA9IDA7IGlpIDwgcExWUFNBX0luc3QtPm5CYW5kczsgaWkrKykgewogICAgICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldID0gcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXTsKICAgICB9CiAKICAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPSBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW5dOworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0KKyAgICAgICAgICAgICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbMTUgKyBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluXTsKICAgICB9CiAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwogCiAgICAgLyogSW5pdGlhbGl6ZSBjb250cm9sIGRlcGVuZGFudCBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCi0gICAgZXJyb3JDb2RlID0gTFZQU0FfQ29udHJvbCAoKnBoSW5zdGFuY2UsIHBDb250cm9sUGFyYW1zKTsKKyAgICBlcnJvckNvZGUgPSBMVlBTQV9Db250cm9sKCpwaEluc3RhbmNlLCBwQ29udHJvbFBhcmFtcyk7CiAKLSAgICBpZihlcnJvckNvZGUhPTApCi0gICAgeworICAgIGlmIChlcnJvckNvZGUgIT0gMCkgewogICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwogICAgIH0KIAotICAgIGVycm9yQ29kZSA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKHBMVlBTQV9JbnN0KTsKKyAgICBlcnJvckNvZGUgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzKHBMVlBTQV9JbnN0KTsKIAotICAgIGlmKGVycm9yQ29kZSE9MCkKLSAgICB7CisgICAgaWYgKGVycm9yQ29kZSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBlcnJvckNvZGU7CiAgICAgfQogCi0gICAgcmV0dXJuKGVycm9yQ29kZSk7CisgICAgcmV0dXJuIChlcnJvckNvZGUpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgaW4gTFZQU0FfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfRGVJbml0KHBMVlBTQV9IYW5kbGVfdCogcGhJbnN0YW5jZSkgeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKKyAgICBpZiAocExWUFNBX0luc3QgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBQb3N0R2FpbnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfVGFwcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID0gTFZNX05VTEw7CisgICAgfQorICAgIGRlbGV0ZSBwTFZQU0FfSW5zdDsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmY2JlNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotCi0gICAgSW5zdEFsbG9jX0luaXQoICZJbnN0YW5jZSAgICwgTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCAmU2NyYXRjaCAgICAsIExWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZDb2VmICAgICAgICwgTFZNX05VTEwpOwotCi0gICAgaWYoKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkgfHwgKHBJbml0UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLQotICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLwotICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fRkxPQVQpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgYXMgTVVMMzJ4MzJJTlRPMzIgd29ya3Mgb24gTFZNX0lOVDMyIG9ubHkqLwotICAgICAgICAgICAgTFZNX0lOVDMyIFNEQkQ9KExWTV9JTlQzMilwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247Ci0gICAgICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgQkw7Ci0KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsSVJUSSxCTCxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCi0gICAgICAgICAgICBCdWZmZXJMZW5ndGg9KExWTV9VSU5UMzIpQkw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBCdWZmZXJMZW5ndGgrKzsKLSAgICAgICAgfQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX1VJTlQ4KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4pICk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZJbnN0YW5jZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJlNjcmF0Y2gsIDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSApOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTY3JhdGNoKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWUFNBX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGNvZWZmaWNpZW50cyBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfU3RhdGVfdCkgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZEYXRhKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAppbmRleCA2MTk4N2I1Li42MDVhMjJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpZm5kZWYgX0xWUFNBX1BSSVZBVEVfSF8KICNkZWZpbmUgX0xWUFNBX1BSSVZBVEVfSF8KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0JpcXVhZEZpbHRlci5oPgogI2luY2x1ZGUgIkxWUFNBLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAjaW5jbHVkZSAiTFZQU0FfUVBELmgiCkBAIC0yNyw5NSArMjgsOTkgQEAKICAgIENPTlNUQU5UIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5ICovCi0jZGVmaW5lIExWUFNBX0lOU1RBTkNFX0FMSUdOICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX0NPRUZfQUxJR04gICAgICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIExWUFNBX0RBVEFfQUxJR04gICAgICAgICAgICAgICAgIDQgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFIDEzIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEIFwKKyAgICAzIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgLyogT2Zmc2V0IHRvIGluc3RhbmNlIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMyAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gXAorICAgIDQwMDAgLyogTWF4aW11bSBsZW5ndGggaW4gbXMgb2YgdGhlIGxldmVscyBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSBcCisgICAgNTAwMCAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGxlbmd0aCBpbiBtb25vIHNhbXBsZXMgb2YgdGhlIGJsb2NrIHRvIHByb2Nlc3MgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05CQU5EU01JTiAxICAvKiBNaW5pbXVtIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX05CQU5EU01BWCAzMCAvKiBNYXhpbXVtIG51bWJlciBvZiBmcmVxdWVuY3kgYmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWENFTlRFUkZSRVEgXAorICAgIDIwMDAwIC8qIE1heGltdW0gcG9zc2libGUgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUlOUE9TVEdBSU4gXAorICAgICgtMTUpICAgICAgICAgICAgICAgICAgICAgLyogTWluaW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBMVlBTQV9NQVhQT1NUR0FJTiAxNSAgLyogTWF4aW11bSBwb3NzaWJsZSBwb3N0IGdhaW4gICovCisjZGVmaW5lIExWUFNBX01JTlFGQUNUT1IgMjUgICAvKiBNaW5pbXVtIHBvc3NpYmxlIFEgZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIExWUFNBX01BWFFGQUNUT1IgMTIwMCAvKiBNYXhpbXVtIHBvc3NpYmxlIFEgZmFjdG9yICovCiAKLSNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gICAgICAgICAgNDAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1zIG9mIHRoZSBsZXZlbHMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUgICAgICAgICAgNTAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1vbm8gc2FtcGxlcyBvZiB0aGUgYmxvY2sgdG8gcHJvY2VzcyAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTkJBTkRTTUlOICAgICAgICAgICAgICAgICAgMSAgICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTkJBTkRTTUFYICAgICAgICAgICAgICAgICAgMzAgICAgIC8qIE1heGltdW0gbnVtYmVyIG9mIGZyZXF1ZW5jeSBiYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYQ0VOVEVSRlJFUSAgICAgICAgICAgICAgMjAwMDAgIC8qIE1heGltdW0gcG9zc2libGUgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUlOUE9TVEdBSU4gICAgICAgICAgICAgICgtMTUpICAgIC8qIE1pbmltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYUE9TVEdBSU4gICAgICAgICAgICAgICAgMTUgICAgIC8qIE1heGltdW0gcG9zc2libGUgcG9zdCBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUlOUUZBQ1RPUiAgICAgICAgICAgICAgICAgMjUgICAgIC8qIE1pbmltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYUUZBQ1RPUiAgICAgICAgICAgICAgICAgMTIwMCAgIC8qIE1heGltdW0gcG9zc2libGUgUSBmYWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUiBcCisgICAgMHg0MTExIC8qIERlY2F5IGZhY3RvciBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUIFwKKyAgICAxNCAvKiBEZWNheSBzaGlmdCBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgICovCiAKLSNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWUZBQ1RPUiAgICAgICAgMHg0MTExIC8qIERlY2F5IGZhY3RvciBmb3IgdGhlIG1heGltdW0gdmFsdWVzIGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfTUFYTEVWRUxERUNBWVNISUZUICAgICAgICAgMTQgICAgIC8qIERlY2F5IHNoaWZ0IGZvciB0aGUgbWF4aW11bSB2YWx1ZXMgY2FsY3VsYXRpb24gICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTFZQU0FfTUFYVU5TSUdORURDSEFSIDB4RkYKIAotI2RlZmluZSBMVlBTQV9NQVhVTlNJR05FRENIQVIgICAgICAgICAgICAweEZGCi0KLSNkZWZpbmUgTFZQU0FfRnNJbnZlcnRTaGlmdCAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgTFZQU0FfR0FJTlNISUZUICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTFZQU0FfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgTFZQU0FfRnNJbnZlcnRTaGlmdCAzMQorI2RlZmluZSBMVlBTQV9HQUlOU0hJRlQgMTEKKyNkZWZpbmUgTFZQU0FfRlJFUVNISUZUIDI1CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBUWVBFUyBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSAgICAgICAweDAwMTQgICAgLyogMjAgbXMgKDUwSHopIGluIFExNi4wICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiAgICAweDA2NjYgICAgLyogMS8yMG1zIGxlZnQgc2hpZnRlZCBieSAxNSAgKi8KLSNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0ICAxNQorI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lIDB4MDAxNCAgICAvKiAyMCBtcyAoNTBIeikgaW4gUTE2LjAgICAgICAqLworI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52IDB4MDY2NiAvKiAxLzIwbXMgbGVmdCBzaGlmdGVkIGJ5IDE1ICAqLworI2RlZmluZSBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQgMTUKIAogLyogUHJlY2lzaW9uIG9mIHRoZSBmaWx0ZXIgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlciwgICAgLyogU2ltcGxlIHByZWNpc2lvbiAqLwotICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlciAgICAgLyogRG91YmxlIHByZWNpc2lvbiAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXIsIC8qIFNpbXBsZSBwcmVjaXNpb24gKi8KKyAgICBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXIgIC8qIERvdWJsZSBwcmVjaXNpb24gKi8KIH0gTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW47CiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgICAgIGJDb250cm9sUGVuZGluZzsgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgaW5jYXRpbmcgYSBjaGFuZ2Ugb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5CYW5kczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE1heElucHV0QmxvY2tTaXplOyAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0NIQVIgYkNvbnRyb2xQZW5kaW5nOyAgICAgLyogRmxhZyBpbmNhdGluZyBhIGNoYW5nZSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzICAgICAqLworICAgIExWTV9VSU5UMTYgbkJhbmRzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyBvZiB0aGUgc3BlY3RydW0gYW5hbHl6ZXIgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgTWF4SW5wdXRCbG9ja1NpemU7IC8qIE1heGltdW0gaW5wdXQgZGF0YSBidWZmZXIgc2l6ZSAqLwogCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOworICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCBDdXJyZW50UGFyYW1zOyAvKiBDdXJyZW50IGNvbnRyb2wgcGFyYW1ldGVycyBvZiB0aGUgbW9kdWxlICovCisgICAgTFZQU0FfQ29udHJvbFBhcmFtc190IE5ld1BhcmFtczsgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICovCisgICAgdm9pZCogcFNjcmF0Y2g7CisgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAotICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICpwQlBGaWx0ZXJzUHJlY2lzaW9uOyAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAqLwotICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOwotICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLwotICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwQlBfVGFwczsKKyAgICBMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiogcEJQRmlsdGVyc1ByZWNpc2lvbjsgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbHRlciBwcmVjaXNpb24gZm9yIGVhY2ggYmFuZCAqLworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPj4KKyAgICAgICAgICAgIHNwZWNCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2VzICovCiAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgaW5zdGFuY2UgZm9yIGVhY2ggYmFuZCAqLwotICAgIFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgICAgICAgICAgICpwUVBEX1N0YXRlczsKKyAgICBRUERfRkxPQVRfU3RhdGVfdCogcFFQRF9TdGF0ZXM7CiAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCi0gICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsKKyAgICBRUERfRkxPQVRfVGFwc190KiBwUVBEX1RhcHM7CiAKICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcG9zdC1maWx0ZXIgZ2FpbnMgZm9yIGVhY2ggYmFuZCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwUG9zdEdhaW5zOwotICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgICAgICpwRmlsdGVyc1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG9mIHRoZSBmaWx0ZXJzIHBhcmFtZXRlcnMgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9GTE9BVCogcFBvc3RHYWluczsKKyAgICBMVlBTQV9GaWx0ZXJQYXJhbV90KgorICAgICAgICAgICAgcEZpbHRlcnNQYXJhbXM7IC8qIENvcHkgb2YgdGhlIGZpbHRlcnMgcGFyYW1ldGVycyBmcm9tIHRoZSBpbnB1dCBwYXJhbWV0ZXJzICovCiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblNhbXBsZXNCdWZmZXJVcGRhdGU7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbWFrZSAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OyAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIGtub3cgd2hlbiB0byBwdXQgYSBuZXcgdmFsdWUgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgblJlbGV2YW50RmlsdGVyczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHJlbGV2ZW50IGZpbHRlcnMgZGVwZW5kaW5nIG9uIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQgYmFuZHMgY2VudGVyIGZyZXF1ZW5jeSAgICAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTG9jYWxTYW1wbGVzQ291bnQ7ICAgICAgICAgICAgICAgICAgLyogQ291bnRlciB1c2VkIHRvIHVwZGF0ZSB0aGUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDE2IG5TYW1wbGVzQnVmZmVyVXBkYXRlOyAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtYWtlIDIwbXMgICAgKi8KKyAgICBMVk1fSU5UMzIgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OyAvKiBDb3VudGVyIHVzZWQgdG8ga25vdyB3aGVuIHRvIHB1dCBhIG5ldyB2YWx1ZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBuUmVsZXZhbnRGaWx0ZXJzOyAgLyogTnVtYmVyIG9mIHJlbGV2YW50IGZpbHRlcnMgZGVwZW5kaW5nIG9uIHNhbXBsaW5nIGZyZXF1ZW5jeSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kcyBjZW50ZXIgZnJlcXVlbmN5ICAgICAgICAqLworICAgIExWTV9VSU5UMTYgTG9jYWxTYW1wbGVzQ291bnQ7IC8qIENvdW50ZXIgdXNlZCB0byB1cGRhdGUgdGhlIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAqLwogCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERvd25TYW1wbGluZ0ZhY3RvcjsgICAgICAgICAgICAgICAgIC8qIERvd24gc2FtcGxpbmcgZmFjdG9yIGRlcGVuZGluZyBvbiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIERvd25TYW1wbGluZ0NvdW50OyAgICAgICAgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCBmb3IgdGhlIGRvd25zYW1wbGluZyBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQxNiBEb3duU2FtcGxpbmdGYWN0b3I7IC8qIERvd24gc2FtcGxpbmcgZmFjdG9yIGRlcGVuZGluZyBvbiB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5ICovCisgICAgTFZNX1VJTlQxNiBEb3duU2FtcGxpbmdDb3VudDsgIC8qIENvdW50ZXIgdXNlZCBmb3IgdGhlIGRvd25zYW1wbGluZyBoYW5kbGluZyAgKi8KIAotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsgICAgICAgICAvKiBMZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB0aW1lIChtcykgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgICpwU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7ICAgICAgICAgICAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICAgICpwU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOyAgICAvKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB3cml0dGluZyBwb2ludGVyIG9mIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWUFNBX1RpbWUgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU7ICAgICAgICAvKiBBdWRpb1RpbWUgYXQgd2hpY2ggdGhlIGxhc3QgdmFsdWUgc2F2ZSBvY2N1cmVkIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJMZW5ndGg7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3BlY3RydW0gZGF0YSB2YWx1ZSB0aGF0IHRoZSBidWZmZXIgY2FuIGNvbnRhaW4gKHBlciBiYW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uLzIwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWTV9VSU5UMTYgU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247ICAgICAgLyogTGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gdGltZSAobXMpIGRlZmluZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgTFZNX1VJTlQ4KiBwU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7ICAgICAgICAvKiBTdGFydGluZyBhZGRyZXNzIG9mIHRoZSBidWZmZXIgICAgICAgICovCisgICAgTFZNX1VJTlQ4KiBwU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOyAvKiBDdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB3cml0aW5nIHBvaW50ZXIgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIExWUFNBX1RpbWUgU3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lOyAvKiBBdWRpb1RpbWUgYXQgd2hpY2ggdGhlIGxhc3QgdmFsdWUgc2F2ZSBvY2N1cnJlZCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDMyCisgICAgICAgICAgICBTcGVjdHJhbERhdGFCdWZmZXJMZW5ndGg7IC8qIE51bWJlciBvZiBzcGVjdHJ1bSBkYXRhIHZhbHVlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGVyIGJhbmQpID0gU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24vMjBtcyAqLwogCi0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAgKnBQcmV2aW91c1BlYWtzOyAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyB0byBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwcmV2aW91cyBwZWFrIHZhbHVlIG9mIHRoZSBsZXZlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uLiBUaG9zZSB2YWx1ZXMgYXJlIGRlY3JlbWVudGVkIGFmdGVyIGVhY2ggY2FsbCB0byB0aGUgR2V0U3BlY3RydW0gZnVuY3Rpb24gICAgICAgICAgKi8KKyAgICBMVk1fVUlOVDgqIHBQcmV2aW91c1BlYWtzOyAvKiBQb2ludHMgdG8gYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgcHJldmlvdXMgcGVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiB0aGUgbGV2ZWwgZGV0ZWN0aW9uLiBUaG9zZSB2YWx1ZXMgYXJlIGRlY3JlbWVudGVkIGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY2FsbCB0byB0aGUgR2V0U3BlY3RydW0gZnVuY3Rpb24gICAgICAgICAgKi8KIAotfUxWUFNBX0luc3RhbmNlUHJfdCwgKnBMVlBTQV9JbnN0YW5jZVByX3Q7Cit9IExWUFNBX0luc3RhbmNlUHJfdCwgKnBMVlBTQV9JbnN0YW5jZVByX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTlMgUFJPVE9UWVBFCkBAIC0xMzUsNiArMTQwLDYgQEAKIC8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCk7CitMVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyhMVlBTQV9JbnN0YW5jZVByX3QqIHBJbnN0KTsKIAogI2VuZGlmIC8qIF9MVlBTQV9QUklWQVRFX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcAppbmRleCA4MWE4OGM1Li5jODljNGY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwCkBAIC0xNSwyMyArMTUsMjMgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICAgICJMVlBTQS5oIgotI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKLSNpbmNsdWRlICAgICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAgICAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWUFNBLmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKLSNkZWZpbmUgTFZNX01JTklOVF8zMiAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgTFZNX01JTklOVF8zMiAweDgwMDAwMDAwCiAKIHN0YXRpYyBMVk1fSU5UMzIgbXVsdDMyeDMyaW4zMl9zaGlmdHIoTFZNX0lOVDMyIGEsIExWTV9JTlQzMiBiLCBMVk1fSU5UMzIgYykgewotICBMVk1fSU5UNjQgcmVzdWx0ID0gKChMVk1fSU5UNjQpYSAqIGIpID4+IGM7CisgICAgTFZNX0lOVDY0IHJlc3VsdCA9ICgoTFZNX0lOVDY0KWEgKiBiKSA+PiBjOwogCi0gIGlmIChyZXN1bHQgPj0gSU5UMzJfTUFYKSB7Ci0gICAgcmV0dXJuIElOVDMyX01BWDsKLSAgfSBlbHNlIGlmIChyZXN1bHQgPD0gSU5UMzJfTUlOKSB7Ci0gICAgcmV0dXJuIElOVDMyX01JTjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKExWTV9JTlQzMilyZXN1bHQ7Ci0gIH0KKyAgICBpZiAocmVzdWx0ID49IElOVDMyX01BWCkgeworICAgICAgICByZXR1cm4gSU5UMzJfTUFYOworICAgIH0gZWxzZSBpZiAocmVzdWx0IDw9IElOVDMyX01JTikgeworICAgICAgICByZXR1cm4gSU5UMzJfTUlOOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAoTFZNX0lOVDMyKXJlc3VsdDsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NCw0MiArNTQsMzYgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKK0xWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWTV9GTE9BVCogcExWUFNBX0lucHV0U2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgSW5wdXRCbG9ja1NpemUsIExWUFNBX1RpbWUgQXVkaW9UaW1lKQogCiB7Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGlpOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEF1ZGlvVGltZUluYzsKLSAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW107Ci0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBXcml0ZV9TYXZlOyAgICAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2Nlc3MgICovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQqIHBTY3JhdGNoOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgQXVkaW9UaW1lSW5jOworICAgIGV4dGVybiBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKKyAgICBMVk1fVUlOVDgqIHBXcml0ZV9TYXZlOyAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2Nlc3MgICovCiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgQ0hFQ0sgUEFSQU1FVEVSUwogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBMVlBTQV9JbnB1dFNhbXBsZXMgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm4gKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKICAgICB9Ci0gICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIGlmIChJbnB1dEJsb2NrU2l6ZSA9PSAwIHx8IElucHV0QmxvY2tTaXplID4gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplKSB7CisgICAgICAgIHJldHVybiAoTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKICAgICB9Ci0KLSAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5wU2NyYXRjaDsKICAgICBwV3JpdGVfU2F2ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOwogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIEFQUExZIE5FVyBTRVRUSU5HUyBJRiBORUVERUQKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKKyAgICBpZiAocExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkgewogICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKLSAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOworICAgICAgICBMVlBTQV9BcHBseU5ld1NldHRpbmdzKHBMVlBTQV9JbnN0KTsKICAgICB9CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05OSwzOSArOTMsMzAgQEAKICAgICBDb3B5X0Zsb2F0KHBMVlBTQV9JbnB1dFNhbXBsZXMsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKICAgICBTaGlmdF9TYXRfRmxvYXQoLTEsIHBTY3JhdGNoLCBwU2NyYXRjaCwgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CiAKLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKLSAgICB7Ci0gICAgICAgIHN3aXRjaChwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0pCi0gICAgICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykgeworICAgICAgICBzd2l0Y2ggKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkgewogICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6Ci0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5zcGVjQmlxdWFkW2lpXS5wcm9jZXNzKHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPnNwZWNCaXF1YWRbaWldLnByb2Nlc3MocFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgICAoIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7CisgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0KHBMVlBTQV9JbnN0LCBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7CiAgICAgfQogCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFVQREFURSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gICAgaWYocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlX1NhdmUpCi0gICAgeworICAgIGlmIChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkgewogICAgICAgICBBdWRpb1RpbWVJbmMgPSBtdWx0MzJ4MzJpbjMyX3NoaWZ0cigKICAgICAgICAgICAgICAgICAoQXVkaW9UaW1lICsgKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ICogMTAwMCkpLAogICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCkBAIC0xMzksNyArMTI0LDcgQEAKICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKICAgICB9CiAKLSAgICByZXR1cm4oTFZQU0FfT0spOworICAgIHJldHVybiAoTFZQU0FfT0spOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYyLDk5ICsxNDcsOTUgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEdldFNwZWN0cnVtQXVkaW9UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAqcEN1cnJlbnRWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwUGVha1ZhbHVlcyAgICAgICAgICAgKQorTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtKHBMVlBTQV9IYW5kbGVfdCBoSW5zdGFuY2UsIExWUFNBX1RpbWUgR2V0U3BlY3RydW1BdWRpb1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4KiBwQ3VycmVudFZhbHVlcywgTFZNX1VJTlQ4KiBwUGVha1ZhbHVlcykKIAogeworICAgIExWUFNBX0luc3RhbmNlUHJfdCogcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgTFZNX0lOVDMyIFN0YXR1c0RlbHRhLCBpaTsKKyAgICBMVk1fVUlOVDgqIHBSZWFkOwogCi0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFN0YXR1c0RlbHRhLCBpaTsKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFJlYWQ7Ci0KLSAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcEN1cnJlbnRWYWx1ZXMgPT0gTFZNX05VTEwgfHwgcFBlYWtWYWx1ZXMgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcEN1cnJlbnRWYWx1ZXMgPT0gTFZNX05VTEwgfHwgcFBlYWtWYWx1ZXMgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuIChMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CiAgICAgfQogCiAgICAgLyogRmlyc3QgZmluZCB0aGUgcGxhY2Ugd2hlcmUgdG8gbG9vayBpbiB0aGUgc3RhdHVzIGJ1ZmZlciAqLwotICAgIGlmKEdldFNwZWN0cnVtQXVkaW9UaW1lIDw9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpCi0gICAgewotICAgICAgICBNVUwzMngzMklOVE8zMigocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52LFN0YXR1c0RlbHRhLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCk7Ci0gICAgICAgIGlmKChTdGF0dXNEZWx0YSAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpICE9IChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpKQotICAgICAgICB7CisgICAgaWYgKEdldFNwZWN0cnVtQXVkaW9UaW1lIDw9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsIFN0YXR1c0RlbHRhLCBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpOworICAgICAgICBpZiAoKFN0YXR1c0RlbHRhICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0KKyAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpKSB7CiAgICAgICAgICAgICBTdGF0dXNEZWx0YSArPSAxOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyogVGhpcyBwYXJ0IGhhbmRsZXMgdGhlIHdyYXAgYXJvdW5kICovCi0gICAgICAgIE1VTDMyeDMySU5UTzMyKCgocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIChMVk1fSU5UMzIpTFZNX01JTklOVF8zMikgKyAoKExWTV9JTlQzMilMVk1fTUFYSU5UXzMyIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpKSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52LFN0YXR1c0RlbHRhLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkKLSAgICAgICAgaWYoKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkpICE9ICgoTFZNX0lOVDMyKSgocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIChMVk1fSU5UMzIpTFZNX01JTklOVF8zMikgKyAoKExWTV9JTlQzMilMVk1fTUFYSU5UXzMyIC0gR2V0U3BlY3RydW1BdWRpb1RpbWUpKSkpCi0gICAgICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoCisgICAgICAgICAgICAgICAgKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArCisgICAgICAgICAgICAgICAgICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLAorICAgICAgICAgICAgICAgIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsIFN0YXR1c0RlbHRhLAorICAgICAgICAgICAgICAgIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkgaWYgKCgoTFZNX0lOVDMyKShTdGF0dXNEZWx0YSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0lOVDMyKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTFZQU0FfSW5zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZNX01JTklOVF8zMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fSU5UMzIpTFZNX01BWElOVF8zMiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUpKSkpIHsKICAgICAgICAgICAgIFN0YXR1c0RlbHRhICs9IDE7CiAgICAgICAgIH0KICAgICB9CiAgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgZGVzaXJlZCBsZXZlbCBpcyBub3QgdG9vICJvbGQiIChzZWUgMi4xMCBpbiBMVlBTQV9EZXNpZ25Ob3Rlcy5kb2MpKi8KLSAgICBpZigKLSAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpJiYKLSAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPjApKSYmCi0gICAgICAgICAoKChMVk1fSU5UMzIpKC1HZXRTcGVjdHJ1bUF1ZGlvVGltZSArIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpKT5MVk1fTUFYSU5UXzMyKSl8fAorICAgIGlmICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkgJiYKKyAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPCAwKSAmJiAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA+IDApKSAmJgorICAgICAgICAgKCgoTFZNX0lOVDMyKSgtR2V0U3BlY3RydW1BdWRpb1RpbWUgKyBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSkgPgorICAgICAgICAgIExWTV9NQVhJTlRfMzIpKSB8fAogCi0gICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lID4gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgotICAgICAgICAgKCgoR2V0U3BlY3RydW1BdWRpb1RpbWU+PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZT49MCkpfHwKLSAgICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lPD0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKXx8Ci0gICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPD0wKSkmJgotICAgICAgICAgKCgoTFZNX0lOVDMyKShHZXRTcGVjdHJ1bUF1ZGlvVGltZSAtIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpKTxMVk1fTUFYSU5UXzMyKSkpKXx8CisgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSAmJgorICAgICAgICAgKCgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPj0gMCkgJiYgKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgPj0gMCkpIHx8CisgICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8PSAwKSAmJiAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA8PSAwKSkgfHwKKyAgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZSA+PSAwKSAmJiAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA8PSAwKSkgJiYKKyAgICAgICAgICAgKCgoTFZNX0lOVDMyKShHZXRTcGVjdHJ1bUF1ZGlvVGltZSAtIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUpKSA8CisgICAgICAgICAgICBMVk1fTUFYSU5UXzMyKSkpKSB8fAogCi0gICAgICAgIChTdGF0dXNEZWx0YSA+IChMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCkgfHwKLSAgICAgICAgKCFTdGF0dXNEZWx0YSkpCi0gICAgewotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDdXJyZW50VmFsdWVzW2lpXSAgPSAwOwotICAgICAgICAgICAgcFBlYWtWYWx1ZXNbaWldICAgICAgPSAwOworICAgICAgICAoU3RhdHVzRGVsdGEgPiAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpIHx8ICghU3RhdHVzRGVsdGEpKSB7CisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspIHsKKyAgICAgICAgICAgIHBDdXJyZW50VmFsdWVzW2lpXSA9IDA7CisgICAgICAgICAgICBwUGVha1ZhbHVlc1tpaV0gPSAwOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgICAgIHJldHVybiAoTFZQU0FfT0spOwogICAgIH0KICAgICAvKiBTZXQgdGhlIHJlYWRpbmcgcG9pbnRlciAqLwotICAgIGlmKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkKLSAgICB7Ci0gICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgKyAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIGlmICgoTFZNX0lOVDMyKShTdGF0dXNEZWx0YSAqIHBMVlBTQV9JbnN0LT5uQmFuZHMpID4KKyAgICAgICAgKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyIC0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCkpIHsKKyAgICAgICAgcFJlYWQgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciArCisgICAgICAgICAgICAgICAgKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggLSAoTFZNX1VJTlQzMilTdGF0dXNEZWx0YSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICB9IGVsc2UgeworICAgICAgICBwUmVhZCA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOwogICAgIH0KIAogICAgIC8qIFJlYWQgdGhlIHN0YXR1cyBidWZmZXIgYW5kIGZpbGwgdGhlIG91dHB1dCBidWZmZXJzICovCi0gICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQotICAgIHsKKyAgICBmb3IgKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKSB7CiAgICAgICAgIHBDdXJyZW50VmFsdWVzW2lpXSA9IHBSZWFkW2lpXTsKLSAgICAgICAgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA8PSBwUmVhZFtpaV0pCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPD0gcFJlYWRbaWldKSB7CiAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gcFJlYWRbaWldOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSAhPSAwKQotICAgICAgICB7CisgICAgICAgIH0gZWxzZSBpZiAocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSAhPSAwKSB7CiAgICAgICAgICAgICBMVk1fSU5UMzIgdGVtcDsKICAgICAgICAgICAgIC8qUmUtY29tcHV0ZSBtYXggdmFsdWVzIGZvciBkZWNheSAqLwogICAgICAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pOwotICAgICAgICAgICAgdGVtcCA9ICgodGVtcCAqIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IpPj5MVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQpOworICAgICAgICAgICAgdGVtcCA9ICgodGVtcCAqIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IpID4+IExWUFNBX01BWExFVkVMREVDQVlTSElGVCk7CiAgICAgICAgICAgICAvKiBJZiB0aGUgZ2FpbiBoYXMgbm8gZWZmZWN0LCAiaGVscCIgdGhlIHZhbHVlIHRvIGluY3JlYXNlICovCi0gICAgICAgICAgICBpZih0ZW1wID09IChMVlBTQV9NQVhVTlNJR05FRENIQVIgLSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldKSkKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IChMVlBTQV9NQVhVTlNJR05FRENIQVIgLSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldKSkgewogICAgICAgICAgICAgICAgIHRlbXAgKz0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCiAgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPiBMVlBTQV9NQVhVTlNJR05FRENIQVIpID8gTFZQU0FfTUFYVU5TSUdORURDSEFSIDogdGVtcDsKICAgICAgICAgICAgIC8qIFN0b3JlIG5ldyBtYXggbGV2ZWwgKi8KLSAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSAgKExWTV9VSU5UOCkoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gdGVtcCk7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gKExWTV9VSU5UOCkoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gdGVtcCk7CiAgICAgICAgIH0KIAogICAgICAgICBwUGVha1ZhbHVlc1tpaV0gPSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldOwogICAgIH0KIAotICAgIHJldHVybihMVlBTQV9PSyk7CisgICAgcmV0dXJuIChMVlBTQV9PSyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKaW5kZXggNjA5YTQ4NS4uMmY3NTJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApAQCAtMjAsNDEgKzIwLDM1IEBACiAKICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGVsYXk7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwotICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZnNbMl07ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLX1RUERfU3RhdGVfdCwgKnBRUERfU3RhdGVfdDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fSU5UMzIqIHBEZWxheTsgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCisgICAgTFZNX0lOVDMyIENvZWZzWzJdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IFFQRF9TdGF0ZV90LCAqcFFQRF9TdGF0ZV90OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwRGVsYXk7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi19UVBEX0ZMT0FUX1N0YXRlX3QsICpwUVBEX0ZMT0FUX1N0YXRlX3Q7CisgICAgTFZNX0ZMT0FUKiBwRGVsYXk7CisgICAgTFZNX0ZMT0FUIENvZWZzWzJdOyAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCit9IFFQRF9GTE9BVF9TdGF0ZV90LCAqcFFQRF9GTE9BVF9TdGF0ZV90OwogCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiBLUDsgICAgLypzaG91bGQgc3RvcmUgYTAqLwotICAgIExWTV9JTlQzMiBLTTsgICAgLypzaG91bGQgc3RvcmUgYjIqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9JTlQzMiBLUDsgLypzaG91bGQgc3RvcmUgYTAqLworICAgIExWTV9JTlQzMiBLTTsgLypzaG91bGQgc3RvcmUgYjIqLwogCiB9IFFQRF9DMzJfQ29lZnMsICpQUVBEX0MzMl9Db2VmczsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fRkxPQVQgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KLSAgICBMVk1fRkxPQVQgS007ICAgIC8qc2hvdWxkIHN0b3JlIGIyKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVk1fRkxPQVQgS1A7IC8qc2hvdWxkIHN0b3JlIGEwKi8KKyAgICBMVk1fRkxPQVQgS007IC8qc2hvdWxkIHN0b3JlIGIyKi8KIAogfSBRUERfRkxPQVRfQ29lZnMsICpQUVBEX0ZMT0FUX0NvZWZzOwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIExWTV9JTlQzMiBTdG9yYWdlWzFdOwogCiB9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKIAotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICBMVk1fRkxPQVQgU3RvcmFnZVsxXTsKIAogfSBRUERfRkxPQVRfVGFwc190LCAqcFFQRF9GTE9BVF9UYXBzX3Q7CkBAIC03MiwxNSArNjYsMTEgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX1Byb2Nlc3MgKCAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7Cit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzKHZvaWQqIGhJbnN0YW5jZSwgTFZNX0lOVDE2KiBwSW5TYW1wcywgTFZNX0lOVDE2IG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgpOwogCi12b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOwordm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCh2b2lkKiBoSW5zdGFuY2UsIExWTV9GTE9BVCogcEluU2FtcHMsIExWTV9JTlQxNiBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQmFuZEluZGV4KTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk2LDEzICs4Niw5IEBACiAvKiBSRVRVUk5TOiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Jbml0ICggICBRUERfU3RhdGVfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUVBEX1RhcHNfdCAgICAgICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgKnBDb2VmICAgICApOwordm9pZCBMVlBTQV9RUERfSW5pdChRUERfU3RhdGVfdCogcEluc3RhbmNlLCBRUERfVGFwc190KiBwVGFwcywgUVBEX0MzMl9Db2VmcyogcENvZWYpOwogCi12b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICggICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgKnBDb2VmICAgICApOwordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdChRUERfRkxPQVRfU3RhdGVfdCogcEluc3RhbmNlLCBRUERfRkxPQVRfVGFwc190KiBwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzKiBwQ29lZik7CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmNwcAppbmRleCAyZGJmNjk0Li5jNTAyM2MzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAKQEAgLTMyLDIwICszMiwxNSBAQAogLyogUkVUVVJOUzogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBMVlBTQV9RUERfSW5pdCAoICAgcFFQRF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICkKLXsKLSAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gcENvZWYtPktQOwotICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9IHBDb2VmLT5LTTsKK3ZvaWQgTFZQU0FfUVBEX0luaXQocFFQRF9TdGF0ZV90IHBRUERfU3RhdGUsIFFQRF9UYXBzX3QqIHBUYXBzLCBRUERfQzMyX0NvZWZzKiBwQ29lZikgeworICAgIHBRUERfU3RhdGUtPnBEZWxheSA9IHBUYXBzLT5TdG9yYWdlOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdID0gcENvZWYtPktQOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdID0gcENvZWYtPktNOwogfQogCi12b2lkIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICggICBwUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgcFFQRF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMgICAgICAgICAgKnBDb2VmICAgICApCi17Ci0gICAgcFFQRF9TdGF0ZS0+cERlbGF5ICA9IHBUYXBzLT5TdG9yYWdlOwotICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LUCk7Ci0gICAgcFFQRF9TdGF0ZS0+Q29lZnNbMV0gID0gKChMVk1fRkxPQVQpcENvZWYtPktNKTsKK3ZvaWQgTFZQU0FfUVBEX0luaXRfRmxvYXQocFFQRF9GTE9BVF9TdGF0ZV90IHBRUERfU3RhdGUsIFFQRF9GTE9BVF9UYXBzX3QqIHBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfQ29lZnMqIHBDb2VmKSB7CisgICAgcFFQRF9TdGF0ZS0+cERlbGF5ID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdID0gKChMVk1fRkxPQVQpcENvZWYtPktNKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwCmluZGV4IDg4MDU0MjAuLmUzMDFjZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmNwcApAQCAtMzQsMTUgKzM0LDExIEBACiAvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFZhbHVlICAgKTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayhwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLCBMVk1fSU5UMTYgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBWYWx1ZSk7CiAKLXZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKTsKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdChwTFZQU0FfSW5zdGFuY2VQcl90IHBMVlBTQV9JbnN0LCBMVk1fVUlOVDgqKiBwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBCYW5kSW5kZXgsIExWTV9GTE9BVCBWYWx1ZSk7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NiwzOCArNTIsMzQgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKLXsKLQordm9pZCBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCh2b2lkKiBoSW5zdGFuY2UsIExWTV9GTE9BVCogcEluU2FtcHMsIExWTV9JTlQxNiBudW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQmFuZEluZGV4KSB7CiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIFBBUkFNRVRFUlMKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotICAgIFFQRF9GTE9BVF9TdGF0ZV90ICpwUVBEU3RhdGUgPSAgKFFQRF9GTE9BVF9TdGF0ZV90KikmcExWUFNBX0luc3QtPnBRUERfU3RhdGVzW0JhbmRJbmRleF07CisgICAgTFZQU0FfSW5zdGFuY2VQcl90KiBwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBRUERfRkxPQVRfU3RhdGVfdCogcFFQRFN0YXRlID0gKFFQRF9GTE9BVF9TdGF0ZV90KikmcExWUFNBX0luc3QtPnBRUERfU3RhdGVzW0JhbmRJbmRleF07CiAKICAgICAvKiBQb2ludGVyIHRvIHRhcHMgKi8KLSAgICBMVk1fRkxPQVQqIHBEZWxheSAgPSBwUVBEU3RhdGUtPnBEZWxheTsKKyAgICBMVk1fRkxPQVQqIHBEZWxheSA9IHBRUERTdGF0ZS0+cERlbGF5OwogCiAgICAgLyogUGFyYW1ldGVycyBuZWVkZWQgZHVyaW5nIHF1YXNpIHBlYWsgY2FsY3VsYXRpb25zICovCi0gICAgTFZNX0ZMT0FUICAgWDA7Ci0gICAgTFZNX0ZMT0FUICAgdGVtcCx0ZW1wMjsKLSAgICBMVk1fRkxPQVQgICBhY2N1OwotICAgIExWTV9GTE9BVCAgIFhnMDsKLSAgICBMVk1fRkxPQVQgICBEMDsKLSAgICBMVk1fRkxPQVQgICBWMCA9IChMVk1fRkxPQVQpKCpwRGVsYXkpOworICAgIExWTV9GTE9BVCBYMDsKKyAgICBMVk1fRkxPQVQgdGVtcCwgdGVtcDI7CisgICAgTFZNX0ZMT0FUIGFjY3U7CisgICAgTFZNX0ZMT0FUIFhnMDsKKyAgICBMVk1fRkxPQVQgRDA7CisgICAgTFZNX0ZMT0FUIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7CiAKICAgICAvKiBGaWx0ZXIncyBjb2VmICovCi0gICAgTFZNX0ZMT0FUICAgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOwotICAgIExWTV9GTE9BVCAgIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKKyAgICBMVk1fRkxPQVQgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOworICAgIExWTV9GTE9BVCBLbSA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzFdKSk7CiAKLSAgICBMVk1fSU5UMTYgICBpaSA9IG51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2IGlpID0gbnVtU2FtcGxlczsKIAotICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOwotICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7Ci0gICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKKyAgICBMVk1fVUlOVDgqIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworICAgIExWTV9JTlQzMiBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgIExWTV9VSU5UMTYgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBJTklUSUFMSVpBVElPTgpAQCAtOTcsMjkgKzg5LDI3IEBACiAgICAgLyogQ29ycmVjdCBhbHNvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAqLwogICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSAoTFZNX0lOVDE2KXBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCk7CiAKLSAgICB3aGlsZSAoaWkgPiAwKQotICAgIHsKKyAgICB3aGlsZSAoaWkgPiAwKSB7CiAgICAgICAgIC8qIEFwcGx5IHBvc3QgZ2FpbiAqLwogICAgICAgICAvKiAtIDEgdG8gY29tcGVuc2F0ZSBzY2FsaW5nIGluIHByb2Nlc3MgZnVuY3Rpb24qLwogICAgICAgICBYMCA9ICgqcEluU2FtcHMpICogcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbQmFuZEluZGV4XTsKICAgICAgICAgcEluU2FtcHMgPSBwSW5TYW1wcyArIERvd25TYW1wbGluZ0ZhY3RvcjsKIAogICAgICAgICAvKiBTYXR1cmF0ZSBhbmQgdGFrZSBhYnNvbHV0ZSB2YWx1ZSAqLwotICAgICAgICBpZihYMCA8IDAuMGYpCi0gICAgICAgICAgICBYMCA9IC1YMDsKKyAgICAgICAgaWYgKFgwIDwgMC4wZikgWDAgPSAtWDA7CiAgICAgICAgIGlmIChYMCA+IDEuMGYpCiAgICAgICAgICAgICBYZzAgPSAxLjBmOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBYZzAgPVgwOworICAgICAgICAgICAgWGcwID0gWDA7CiAKICAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KLSAgICAgICAgRDAgID0gWGcwIC0gVjA7CisgICAgICAgIEQwID0gWGcwIC0gVjA7CiAKICAgICAgICAgdGVtcDIgPSBEMDsKIAogICAgICAgICBhY2N1ID0gdGVtcDIgKiBLcDsKLSAgICAgICAgRDAgICAgPSBEMCAvIDIuMGY7Ci0gICAgICAgIGlmIChEMCA8IDAuMGYpeworICAgICAgICBEMCA9IEQwIC8gMi4wZjsKKyAgICAgICAgaWYgKEQwIDwgMC4wZikgewogICAgICAgICAgICAgRDAgPSAtRDA7CiAgICAgICAgIH0KIApAQCAtMTMwLDE3ICsxMjAsMTMgQEAKIAogICAgICAgICBpZiAoYWNjdSA+IDEuMGYpCiAgICAgICAgICAgICBhY2N1ID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZihhY2N1IDwgMC4wZikKKyAgICAgICAgZWxzZSBpZiAoYWNjdSA8IDAuMGYpCiAgICAgICAgICAgICBhY2N1ID0gMC4wZjsKIAogICAgICAgICBWMCA9IGFjY3U7CiAKLSAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOworICAgICAgICBpZiAoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkgeworICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdChwTFZQU0FfSW5zdCwgJnBXcml0ZSwgQmFuZEluZGV4LCBWMCk7CiAKICAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCAtPSBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGU7CiAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgPSAoTFZNX1VJTlQxNikobnVtU2FtcGxlcyAtIGlpKTsKQEAgLTE0OCw3ICsxMzQsNiBAQAogICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgKz0gRG93blNhbXBsaW5nRmFjdG9yOwogCiAgICAgICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSBEb3duU2FtcGxpbmdGYWN0b3IpOwotCiAgICAgfQogCiAgICAgLyogU3RvcmUgbGFzdCB0YXBzIGluIG1lbW9yeSAqLwpAQCAtMTU2LDIwICsxNDEsMTUgQEAKIAogICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24gYWZ0ZXIgbGFzdCBiYW5kIHByb2Nlc3NpbmcsCiAgICAgICAgdXBkYXRlIHRoZSBwYXJhbWV0ZXJzLiAqLwotICAgIGlmKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMgLSAxKSkKLSAgICB7CisgICAgaWYgKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMgLSAxKSkgewogICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKICAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKICAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCi0gICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKLSAgICAgICAgICAgIHsKKyAgICAgICAgaWYgKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpICYmCisgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkgeworICAgICAgICAgICAgaWYgKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9PSAyMjApIHsKICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTk0LDM3ICsxNzQsMjkgQEAKIC8qIFJFVFVSTlM6ICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX1dyaXRlUGVhayggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZhbHVlICAgKQotewotICAgIExWTV9VSU5UOCAqcFdyaXRlID0gKnBwV3JpdGU7Cit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsocExWUFNBX0luc3RhbmNlUHJfdCBwTFZQU0FfSW5zdCwgTFZNX1VJTlQ4KiogcHBXcml0ZSwgTFZNX0lOVDE2IEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgVmFsdWUpIHsKKyAgICBMVk1fVUlOVDgqIHBXcml0ZSA9ICpwcFdyaXRlOwogCiAgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KLSAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZT4+Nyk7CisgICAgKihwV3JpdGUgKyBCYW5kSW5kZXgpID0gKExWTV9VSU5UOCkoVmFsdWUgPj4gNyk7CiAgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKLSAgICB7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArCisgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKSB7CiAgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CiAgICAgfQogCiAgICAgKnBwV3JpdGUgPSBwV3JpdGU7Ci0KIH0KLXZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqKnBwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKQotewotICAgIExWTV9VSU5UOCAqcFdyaXRlID0gKnBwV3JpdGU7Cit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQocExWUFNBX0luc3RhbmNlUHJfdCBwTFZQU0FfSW5zdCwgTFZNX1VJTlQ4KiogcHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQmFuZEluZGV4LCBMVk1fRkxPQVQgVmFsdWUpIHsKKyAgICBMVk1fVUlOVDgqIHBXcml0ZSA9ICpwcFdyaXRlOwogCiAgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KICAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSAqIDI1Nik7CiAgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKLSAgICB7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArCisgICAgICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKSB7CiAgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuY3BwCmluZGV4IDlmMGFhMDIuLjRmYmZmNmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuY3BwCkBAIC0zNCwxOSArMzQsOSBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCitjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHs4MDAwLCAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsIDQ4MDAwLCA4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwfTsgLyogMTkya1MvcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4LDIwICs0OCwxMSBAQAogICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCiAgKiBmcmVxdWVuY3kKICAqLwotY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW10gPSB7ICAgIDI2ODQzNSwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0MjE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MzkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDI0MzQ4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMTc0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY29uc3QgTFZNX1VJTlQzMiBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW10gPSB7CisgICAgICAgIDI2ODQzNSwgLyogOGtTL3MgICovCisgICAgICAgIDE5NDc4MywgMTc4OTU3LCAxMzQyMTgsIDk3MzkxLCA4OTQ3OCwgNjcxMDksCisgICAgICAgIDQ4Njk2LCAgNDQ3MzksICAyNDM0OCwgIDIyMzY5LCAxMjE3NCwgMTExODUgLyogMTkya1MvcyAqLworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MywyMCArNjQsMTAgQEAKICAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCiAgKiBkdXJpbmcgMjBtcwogICovCi1jb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gID0geyAgIDE2MCwgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fVUlOVDE2IExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gPSB7CisgICAgICAgIDE2MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAyMjAsIDI0MCwgMzIwLCA0NDEsIDQ4MCwgNjQwLCA4ODIsIDk2MCwgMTc2NCwgMTkyMCwgMzUyOCwgMzg0MCAvKiAxOTJrUy9zICovCit9OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRG93biBzYW1wbGluZyBmYWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTA2LDIwICs3NywyNSBAQAogLyoKICAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGRvd24gc2FtcGxpbmcgZmFjdG9yCiAgKi8KLWNvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW10gID0geyAgICAgNSwgICAgICAgICAgICAgICAgICAgIC8qIDgwMDAgIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgICAgICAgICAgICAgICAgICAgIC8qIDExMDI1IFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgIC8qIDEyMDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgIC8qIDE2MDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsICAgICAgICAgICAgICAgICAgIC8qIDIyMDUwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgIC8qIDI0MDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsICAgICAgICAgICAgICAgICAgIC8qIDMyMDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgIC8qIDQ0MTAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjAgICAgICAgICAgICAgICAgICAgLyogODgyMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMCAgICAgICAgICAgICAgICAgIC8qIDE3NjQwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NvbnN0IExWTV9VSU5UMTYgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW10gPSB7CisgICAgICAgIDUsICAvKiA4MDAwICBTL3MgICovCisgICAgICAgIDcsICAvKiAxMTAyNSBTL3MgICovCisgICAgICAgIDgsICAvKiAxMjAwMCBTL3MgICovCisgICAgICAgIDEwLCAvKiAxNjAwMCBTL3MgICovCisgICAgICAgIDE1LCAvKiAyMjA1MCBTL3MgICovCisgICAgICAgIDE2LCAvKiAyNDAwMCBTL3MgICovCisgICAgICAgIDIxLCAvKiAzMjAwMCBTL3MgICovCisgICAgICAgIDMwLCAvKiA0NDEwMCBTL3MgICovCisgICAgICAgIDMyICAvKiA0ODAwMCBTL3MgICovCisgICAgICAgICwKKyAgICAgICAgNjAgLyogODgyMDAgUy9zICAqLworICAgICAgICAsCisgICAgICAgIDY0IC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgLAorICAgICAgICAxMjAgLyogMTc2NDAwIFMvcyAgKi8KKyAgICAgICAgLAorICAgICAgICAxMjggLyoxOTIwMDAgUy9zICAqLworfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzAsMTAyICsxMDYsMzQgQEAKIC8qCiAgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKICAqLwotY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdID0geyAgMjYzNTQsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fSU5UMTYgTFZQU0FfVHdvUGlPbkZzVGFibGVbXSA9IHsKKyAgICAgICAgMjYzNTQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAqLworICAgICAgICAxOTEyMywgMTc1NjksIDEzMTc3LCA5NTYxLCA4Nzg1LCA2NTg4LCA0NzgxLCA0MzkyLCAyMzkwLCAyMTk2LCAxMTk1LCAxMDk4IC8qIDE5MmtTL3MgKi8KK307CiAKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDAuODA0Mjg0N2YsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTgzNjA1NGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNjE3OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MDIxNDIzZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjkxNzg3NGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2ODEwNTFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMDEwNTU5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA3Mjk0NzZmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzNjQ3MzhmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Citjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXSA9IHsKKyAgICAgICAgMC44MDQyODQ3ZiwgLyogOGtTL3MgKi8KKyAgICAgICAgMC41ODM2MDU0ZiwgMC41MzYxNzk2ZiwgMC40MDIxNDIzZiwgMC4yOTE3ODc0ZiwgMC4yNjgxMDUxZiwgMC4yMDEwNTU5ZiwKKyAgICAgICAgMC4xNDU5MDg5ZiwgMC4xMzQwMzcyZiwgMC4wNzI5NDc2ZiwgMC4wNjcwMTg2ZiwgMC4wMzY0NzM4ZiwgMC4wMzM1MDkzZiAvKiAxOTJrUy9zICovCit9OwogCiAvKgogICogR2FpbiB0YWJsZQogICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0dhaW5UYWJsZVtdID0geyAgIDM2NCwgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCwgICAgICAgICAvKiAwZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjk3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTc4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjY2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NzZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworY29uc3QgTFZNX0lOVDE2IExWUFNBX0dhaW5UYWJsZVtdID0gezM2NCwgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwgIDQ1OCwgIDUxNCwgIDU3NywgIDY0NywgIDcyNiwgICA4MTUsICA5MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNiwgMTE1MSwgMTI5MiwgMTQ0OSwgMTYyNiwgMTgyNSwgIDIwNDgsIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI5NywgMjU3OCwgMjg5MiwgMzI0NSwgMzY0MSwgNDA5NiwgIDQ1ODQsIDUxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc3MiwgNjQ3NiwgNzI2NiwgODE1MywgOTE0OCwgMTAyNjQsIDExNTc2fTsgLyogKzE1ZEIgZ2FpbiAqLwogCi1jb25zdCBMVk1fRkxPQVQgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdPXsgIDAuMTc3NzM0Mzc1ZiwgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTIxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjIzNjMyODEyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTA5NzY1NjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI4MTczODI4MWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzE1OTE3OTY4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNTQ0OTIxODdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM5Nzk0OTIxOGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQ2Mjg5MDYyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDA5NzY1NjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjU2MjAxMTcxOGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNjMwODU5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MDc1MTk1MzFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjc5Mzk0NTMxMmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuODkxMTEzMjgxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wMDAwMDAwMDBmLCAgICAgICAgIC8qIDBkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTIxNTgyMDMxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4yNTg3ODkwNjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQxMjEwOTM3NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNTg0NDcyNjU2ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS43Nzc4MzIwMzFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjAwMDAwMDAwMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMjM4MjgxMjUwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi41MTE3MTg3NTBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjgxODM1OTM3NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMTYyMTA5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy41NDc4NTE1NjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjk4MDk1NzAzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNDY2Nzk2ODc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wMTE3MTg3NTBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjY1MjM0Mzc1MGZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLworY29uc3QgTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdID0geworICAgICAgICAwLjE3NzczNDM3NWYsIC8qIC0xNWRCIGdhaW4gKi8KKyAgICAgICAgMC4xOTkyMTg3NTBmLCAwLjIyMzYzMjgxMmYsIDAuMjUwOTc2NTYyZiwgMC4yODE3MzgyODFmLCAwLjMxNTkxNzk2OGYsCisgICAgICAgIDAuMzU0NDkyMTg3ZiwgMC4zOTc5NDkyMThmLCAwLjQ0NjI4OTA2MmYsIDAuNTAwOTc2NTYyZiwgMC41NjIwMTE3MThmLAorICAgICAgICAwLjYzMDg1OTM3NWYsIDAuNzA3NTE5NTMxZiwgMC43OTM5NDUzMTJmLCAwLjg5MTExMzI4MWYsIDEuMDAwMDAwMDAwZiwgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgMS4xMjE1ODIwMzFmLCAxLjI1ODc4OTA2MmYsIDEuNDEyMTA5Mzc1ZiwgMS41ODQ0NzI2NTZmLCAxLjc3NzgzMjAzMWYsCisgICAgICAgIDIuMDAwMDAwMDAwZiwgMi4yMzgyODEyNTBmLCAyLjUxMTcxODc1MGYsIDIuODE4MzU5Mzc1ZiwgMy4xNjIxMDkzNzVmLAorICAgICAgICAzLjU0Nzg1MTU2MmYsIDMuOTgwOTU3MDMxZiwgNC40NjY3OTY4NzVmLCA1LjAxMTcxODc1MGYsIDUuNjUyMzQzNzUwZn07IC8qICsxNWRCIGdhaW4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI0MSwyMCArMTQ5LDIwIEBACiAgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCiAgKiArMS4wIHRvIC0xLjAKICAqLwotY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KLWNvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdID0geyAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDM4ZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDk4NmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE5Nzc1ZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA4MTUxNDlmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzI0MjA0MmYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg5NjIwNmZ9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCitjb25zdCBMVk1fSU5UMTYgTFZQU0FfQ29zQ29lZltdID0gezMsICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2LCAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgIC8qIGE1ICovCitjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfQ29zQ29lZltdID0gezMsICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAzOGYsICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDk4NmYsICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE5Nzc1ZiwgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA4MTUxNDlmLCAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC43MjQyMDQyZiwgICAvKiBhNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4yODk2MjA2Zn07IC8qIGE1ICovCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgogICoKQEAgLTI2OSwxMDEgKzE3NywxMDAgQEAKICAqCiAgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKICAqLwotY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9EUENvc0NvZWZbXSA9IHsgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi1jb25zdCBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW10gPSB7MS4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDgzMTFmLCAgICAgICAgICAgICAgICAgLyogYTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwNjE3OTk5ZiwgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMzQyODFmfTsgICAgICAgICAgICAgICAgLyogYTMgKi8KK2NvbnN0IExWTV9JTlQxNiBMVlBTQV9EUENvc0NvZWZbXSA9IHsxLCAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAvKiBhMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgIC8qIGExICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY1ODYsICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAvKiBhMyAqLworY29uc3QgTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdID0gezEuMGYsICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAwMDgzMTFmLCAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwNjE3OTk5ZiwgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTM0MjgxZn07IC8qIGEzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBRdWFzaSBwZWFrIGZpbHRlciBjb2VmZmljaWVudHMgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IFFQRF9DMzJfQ29lZnMgICAgIExWUFNBX1FQRF9Db2Vmc1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwweDAwQ0I5QjE3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEQyNDJFNywweDAwQ0VEMTFEfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwweDAwRDkxNjc5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MENFRkQyQiwweDAwQ0I5QjE3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwweDAwRDkxNjc5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEQ5NEJBRiwweDAwRDVCN0U3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MEUxMzczOSwweDAwREQ3Q0QzfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwweDAwRDkxNjc5fSwgIC8qIDQ4a1MvcyAqLworY29uc3QgUVBEX0MzMl9Db2VmcyBMVlBTQV9RUERfQ29lZnNbXSA9IHsKKyAgICAgICAgLyogOGtTL3MgICovIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBDRUZEMkIsIDB4MDBDQjlCMTd9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRDI0MkU3LCAweDAwQ0VEMTFEfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwgMHgwMEQ5MTY3OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBDRUZEMkIsIDB4MDBDQjlCMTd9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LCAweDAwREQ3Q0QzfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwgMHgwMEQ5MTY3OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEOTRCQUYsIDB4MDBENUI3RTd9LAorICAgICAgICB7KExWTV9JTlQzMikweDgwRTEzNzM5LCAweDAwREQ3Q0QzfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4MERDQkFGNSwgMHgwMEQ5MTY3OX0sIC8qIDQ4a1MvcyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwweDA1NUMyMkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTlEMjk2NywweDA1NzBGMDA3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywweDA1QjM0RDc5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NTg3NTEzRCwweDA1NUMyMkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywweDA1QjM0RDc5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUNDMTAxOCwweDA1OUQ4RjY5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywweDA1QjM0RDc5fSwgIC8qIDQ4a1MvcyAqLworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTUVESVVNICovCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU4NzUxM0QsIDB4MDU1QzIyQ0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg1OUQyOTY3LCAweDA1NzBGMDA3fSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywgMHgwNUIzNEQ3OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU4NzUxM0QsIDB4MDU1QzIyQ0Z9LAorICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LCAweDA1Q0ZBNkNGfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywgMHgwNUIzNEQ3OX0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4ODVDQzEwMTgsIDB4MDU5RDhGNjl9LAorICAgICAgICB7KExWTV9JTlQzMikweDg2MDBDN0I5LCAweDA1Q0ZBNkNGfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHg4NUUyRUZBQywgMHgwNUIzNEQ3OX0sIC8qIDQ4a1MvcyAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMTE1RUE3QSwweDFDREIzRjVDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMTg0NzVGMCwweDFEMkM4M0EyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMTE1RUE3QSwweDFDREIzRjVDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwweDFFMkE1MzJFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMjZGRjZCRCwweDFERDgxNTMwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhMVk1fSU5UMzIpMHhBMkUxRTk1MCwweDFFMkE1MzJFfX07IC8qIDQ4a1MvcyAqLworICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfSElHSCAgICAqLworICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLCAweDFDREIzRjVDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMTg0NzVGMCwgMHgxRDJDODNBMn0sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsIDB4MUUyQTUzMkV9LAorICAgICAgICB7KExWTV9JTlQzMikweEExMTVFQTdBLCAweDFDREIzRjVDfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMzc1QjJDNiwgMHgxRTk0M0JCQ30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsIDB4MUUyQTUzMkV9LAorICAgICAgICB7KExWTV9JTlQzMikweEEyNkZGNkJELCAweDFERDgxNTMwfSwKKyAgICAgICAgeyhMVk1fSU5UMzIpMHhBMzc1QjJDNiwgMHgxRTk0M0JCQ30sCisgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsIDB4MUUyQTUzMkV9fTsgLyogNDhrUy9zICovCiAKLWNvbnN0IFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW10gPSB7Citjb25zdCBRUERfRkxPQVRfQ29lZnMgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW10gPSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzU4MzMzMzIxMjg4MjNmLDAuMDA2MzExNTQ5MzM5NDQzNGZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwwLjAwNjIxMzU1NjUwOTQ2NTBmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMzNjg2NjMzNTk0MzM0ZiwwLjAwNjUyMjE2NzAwODM3MDJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2MTQxMzA0NjkwMzkwOGYsMC4wNDI1MDkwODIyMzkxMjEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLDAuMDQxODc0MjY2Njk1MjMxMmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDcwOTk5NTUzNzk5NjNmLDAuMDQzODcwODU1NTg4NDY1OWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzA5NTgxMzUzMzI5MTIyZiwwLjIzMzE1NjgyMjYyMTgyMjRmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgLyogOGtTL3MgICovIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCisgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwgMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgIHstMC45OTM1ODMzMzMyMTI4ODIzZiwgMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTM2ODMxOTg5MzI1NTgzZiwgMC4wMDYyMTM1NTY1MDk0NjUwZn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwgMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgIHstMC45OTMzNjg2NjMzNTk0MzM0ZiwgMC4wMDY1MjIxNjcwMDgzNzAyZn0sCisgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwgMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgIC8qIDQ4a1MvcyAqLworICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsIDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsIDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAorICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsIDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsIDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAorICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsIDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAvKiA4a1MvcyAgKi8gLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KKyAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLCAwLjA0MTg3NDI2NjY5NTIzMTJmfSwKKyAgICAgICAgey0wLjk1NjE0MTMwNDY5MDM5MDhmLCAwLjA0MjUwOTA4MjIzOTEyMTJmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1NjgwNzk0MjU5NTMzMjlmLCAwLjA0MTg3NDI2NjY5NTIzMTJmfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLCAwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgey0wLjk1NDcwOTk5NTUzNzk5NjNmLCAwLjA0Mzg3MDg1NTU4ODQ2NTlmfSwKKyAgICAgICAgLy97MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKKyAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLCAwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwgMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwgMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwgMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwgMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwgMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgIC8qIDhrUy9zICAqLyAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KKyAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLCAwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLCAwLjIyNzkyMDk2NTI5MTU1OTdmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLCAwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLCAwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgey0wLjczMDk1ODEzNTMzMjkxMjJmLCAwLjIzMzE1NjgyMjYyMTgyMjRmfSwKKyAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLCAwLjIzODg5ODcyMjQ1NDkwNTVmfSwKKyAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwgMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwgMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwgMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCisgICAgICAgIHstMC43MjI5NzA2MzE5MDQ5MDAxZiwgMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwgMC4yMzU2NjY2NTQwNzI3MDE5Zn19OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oCmluZGV4IDY1ODcyZmUuLmM3NzFkYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmgKQEAgLTI3LDcgKzI3LDcgQEAKICAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAogICogZnJlcXVlbmN5CiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDMyIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOSw3ICszOSw3IEBACiAgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKICAqIGZyZXF1ZW5jeQogICovCi1leHRlcm4gY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW107CitleHRlcm4gY29uc3QgTFZNX1VJTlQzMiBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTEsNyArNTEsNyBAQAogICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKICAqIGR1cmluZyAyMG1zCiAgKi8KLWV4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW107CitleHRlcm4gY29uc3QgTFZNX1VJTlQxNiBMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYyLDcgKzYyLDcgQEAKIC8qCiAgKiBUYWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBkb3duIHNhbXBsaW5nIGZhY3RvcgogICovCi1leHRlcm4gY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2IExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTczLDE0ICs3MywxNCBAQAogLyoKICAqIFRhYmxlIGZvciAyICogUGkgLyBGcwogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOwotZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZQU0FfVHdvUGlPbkZzVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKIAogLyoKICAqIEdhaW4gdGFibGUKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW107Ci1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZQU0FfR2FpblRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk3LDggKzk3LDggQEAKICAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKICAqICsxLjAgdG8gLTEuMAogICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Db3NDb2VmW107Ci1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWUFNBX0Nvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfQ29zQ29lZltdOwogCiAvKgogICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgpAQCAtMTE0LDE1ICsxMTQsMTUgQEAKICAqCiAgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKICAqLwotZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfRFBDb3NDb2VmW107Ci1leHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdOworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVlBTQV9EUENvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGNvbnN0IFFQRF9DMzJfQ29lZnMgICAgIExWUFNBX1FQRF9Db2Vmc1tdOwotZXh0ZXJuIGNvbnN0IFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CitleHRlcm4gY29uc3QgUVBEX0MzMl9Db2VmcyBMVlBTQV9RUERfQ29lZnNbXTsKK2V4dGVybiBjb25zdCBRUERfRkxPQVRfQ29lZnMgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107CiAKICNlbmRpZiAvKiBfX0xWUFNBX1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggMGFkZmQxYi4uZmZlNzkwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTcxLDIxICs3MSwxNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgIDAgICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgIDEgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAyICAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgIDMgICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIEVmZmVjdCBMZXZlbCAqLwotI2RlZmluZSBMVkNTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgICAgIDE2Mzg0ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDUwJSAqLwotI2RlZmluZSBMVkNTX0VGRkVDVF9NRURJVU0gICAgICAgICAgICAgICAgIDI0NTc2ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDc1JSAqLwotI2RlZmluZSBMVkNTX0VGRkVDVF9ISUdIICAgICAgICAgICAgICAgICAgIDMyNzY3ICAgIC8qIEVmZmVjdCBTY2FsaW5nIDEwMCUgKi8KKyNkZWZpbmUgTFZDU19FRkZFQ1RfTE9XIDE2Mzg0ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDUwJSAqLworI2RlZmluZSBMVkNTX0VGRkVDVF9NRURJVU0gMjQ1NzYgLyogRWZmZWN0IHNjYWxpbmcgNzUlICovCisjZGVmaW5lIExWQ1NfRUZGRUNUX0hJR0ggMzI3NjcgICAvKiBFZmZlY3QgU2NhbGluZyAxMDAlICovCiAKIC8qIENhbGxiYWNrIGV2ZW50cyAqLwotI2RlZmluZSBMVkNTX0VWRU5UX05PTkUgICAgICAgICAgICAgICAgICAgMHgwMDAwICAgIC8qIE5vdCBhIHZhbGlkIGV2ZW50ICovCi0jZGVmaW5lIExWQ1NfRVZFTlRfQUxHT0ZGICAgICAgICAgICAgICAgICAweDAwMDEgICAgLyogQ1MgaGFzIGNvbXBsZXRlZCBzd2l0Y2ggb2ZmICovCisjZGVmaW5lIExWQ1NfRVZFTlRfTk9ORSAweDAwMDAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLworI2RlZmluZSBMVkNTX0VWRU5UX0FMR09GRiAweDAwMDEgLyogQ1MgaGFzIGNvbXBsZXRlZCBzd2l0Y2ggb2ZmICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NCw3MCArODcsNDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLXR5cGVkZWYgdm9pZCAqTFZDU19IYW5kbGVfdDsKK3R5cGVkZWYgdm9pZCogTFZDU19IYW5kbGVfdDsKIAogLyogT3BlcmF0aW5nIG1vZGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX09GRiA9IDAsCi0gICAgTFZDU19PTiAgPSAxNSwKLSAgICBMVkNTX01BWCA9IExWTV9NQVhFTlVNCi19IExWQ1NfTW9kZXNfZW47Ci0KLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZDU19TQ1JBVENIICAgICAgICA9IDAsCi0gICAgTFZDU19EQVRBICAgICAgICAgICA9IDEsCi0gICAgTFZDU19DT0VGRklDSUVOVCAgICA9IDIsCi0gICAgTFZDU19QRVJTSVNURU5UICAgICA9IDMsCi0gICAgTFZDU19NRU1PUllUWVBFX01BWCA9IExWTV9NQVhFTlVNCi19IExWQ1NfTWVtb3J5VHlwZXNfZW47Cit0eXBlZGVmIGVudW0geyBMVkNTX09GRiA9IDAsIExWQ1NfT04gPSAxNSwgTFZDU19NQVggPSBMVk1fTUFYRU5VTSB9IExWQ1NfTW9kZXNfZW47CiAKIC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWQ1NfU1VDQ0VTUyAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuIGZyb20gYSByb3V0aW5lICovCi0gICAgTFZDU19BTElHTk1FTlRFUlJPUiA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsaWdubWVudCBlcnJvciAqLwotICAgIExWQ1NfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCi0gICAgTFZDU19UT09NQU5ZU0FNUExFUyA9IDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCi0gICAgTFZDU19JTlZBTElEQlVGRkVSICA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgLyogSW52YWxpZCBidWZmZXIgcHJvY2Vzc2luZyByZXF1ZXN0ICovCi0gICAgTFZDU19TVEFUVVNNQVggICAgICA9IExWTV9NQVhFTlVNCit0eXBlZGVmIGVudW0geworICAgIExWQ1NfU1VDQ0VTUyA9IDAsICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLworICAgIExWQ1NfTlVMTEFERFJFU1MgPSAxLCAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWQ1NfVE9PTUFOWVNBTVBMRVMgPSAyLCAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KKyAgICBMVkNTX1NUQVRVU01BWCA9IExWTV9NQVhFTlVNCiB9IExWQ1NfUmV0dXJuU3RhdHVzX2VuOwogCiAvKgogICogU291cmNlIGRhdGEgZm9ybWF0cwogICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX1NURVJFTyAgICAgICA9IDAsCit0eXBlZGVmIGVudW0geworICAgIExWQ1NfU1RFUkVPID0gMCwKICAgICBMVkNTX01PTk9JTlNURVJFTyA9IDEsCi0gICAgTFZDU19TT1VSQ0VNQVggICAgPSBMVk1fTUFYRU5VTQorICAgIExWQ1NfU09VUkNFTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19Tb3VyY2VGb3JtYXRfZW47CiAKIC8qCiAgKiBTdXBwb3J0ZWQgb3V0cHV0IGRldmljZXMKICAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZDU19IRUFEUEhPTkVTICAgICAgICAgICAgID0gMCwKLSAgICBMVkNTX0VYX0hFQURQSE9ORVMgICAgICAgICAgPSAxLAotICAgIExWQ1NfU1BFQUtFUlRZUEVfTUFYICAgICAgICA9IExWTV9NQVhFTlVNCit0eXBlZGVmIGVudW0geworICAgIExWQ1NfSEVBRFBIT05FUyA9IDAsCisgICAgTFZDU19FWF9IRUFEUEhPTkVTID0gMSwKKyAgICBMVkNTX1NQRUFLRVJUWVBFX01BWCA9IExWTV9NQVhFTlVNCiB9IExWQ1NfU3BlYWtlclR5cGVfZW47CiAKIC8qCiAgKiBTcGVha2VyIENvZWZmaWNpZW50cyBUYWJsZQogICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIHZvaWQgICAgKnBUYWJsZTE7Ci0gICAgdm9pZCAgICAqcFRhYmxlMjsKLSAgICB2b2lkICAgICpwVGFibGUzOwotICAgIHZvaWQgICAgKnBUYWJsZTQ7Ci0gICAgdm9pZCAgICAqcFRhYmxlNTsKLSAgICB2b2lkICAgICpwVGFibGU2OwotICAgIHZvaWQgICAgKnBUYWJsZTc7Ci0gICAgdm9pZCAgICAqcFRhYmxlODsKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiBwVGFibGUxOworICAgIHZvaWQqIHBUYWJsZTI7CisgICAgdm9pZCogcFRhYmxlMzsKKyAgICB2b2lkKiBwVGFibGU0OworICAgIHZvaWQqIHBUYWJsZTU7CisgICAgdm9pZCogcFRhYmxlNjsKKyAgICB2b2lkKiBwVGFibGU3OworICAgIHZvaWQqIHBUYWJsZTg7CiB9IExWQ1NfQ1NNU19Db2VmX1RhYmxlc190OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2Niw0NCArMTM4LDI2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgKi8KLSAgICBMVkNTX01lbW9yeVR5cGVzX2VuICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZDU19NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkNTX01lbW9yeVJlZ2lvbl90IFJlZ2lvbltMVkNTX05SX01FTU9SWV9SRUdJT05TXTsgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCi19IExWQ1NfTWVtVGFiX3Q7Ci0KIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICBPcGVyYXRpbmdNb2RlOyAgICAgICAgICAvKiBBbGdvcml0aG0gbW9kZSAqLwotICAgIExWQ1NfU3BlYWtlclR5cGVfZW4gICAgIFNwZWFrZXJUeXBlOyAgICAgICAgICAgIC8qIE91dHB1dCBkZXZpY2UgdHlwZSAqLwotICAgIExWQ1NfU291cmNlRm9ybWF0X2VuICAgIFNvdXJjZUZvcm1hdDsgICAgICAgICAgIC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLwotICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgIENvbXByZXNzb3JNb2RlOyAgICAgICAgIC8qIE5vbi1MaW5lYXIgQ29tcHJlc3NvciBNb2RlICovCi0gICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsgICAgICAgICAgICAgLyogU2FtcGxpbmcgcmF0ZSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsOyAgICAgICAgICAgIC8qIEVmZmVjdCBsZXZlbCAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFJldmVyYkxldmVsOyAgICAgICAgICAgIC8qIFJldmVyYiBsZXZlbCBpbiAlICovCi0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7Ci0jZW5kaWYKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBMVkNTX01vZGVzX2VuIE9wZXJhdGluZ01vZGU7ICAgICAgIC8qIEFsZ29yaXRobSBtb2RlICovCisgICAgTFZDU19TcGVha2VyVHlwZV9lbiBTcGVha2VyVHlwZTsgICAvKiBPdXRwdXQgZGV2aWNlIHR5cGUgKi8KKyAgICBMVkNTX1NvdXJjZUZvcm1hdF9lbiBTb3VyY2VGb3JtYXQ7IC8qIFNvdXJjZSBkYXRhIGZvcm1hdCAqLworICAgIExWTV9Nb2RlX2VuIENvbXByZXNzb3JNb2RlOyAgICAgICAgLyogTm9uLUxpbmVhciBDb21wcmVzc29yIE1vZGUgKi8KKyAgICBMVk1fRnNfZW4gU2FtcGxlUmF0ZTsgICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KKyAgICBMVk1fSU5UMTYgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgIC8qIEVmZmVjdCBsZXZlbCAqLworICAgIExWTV9VSU5UMTYgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KKyAgICBMVk1fSU5UMzIgTnJDaGFubmVsczsKIH0gTFZDU19QYXJhbXNfdDsKIAogLyogQ29uY2VydCBTb3VuZCBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgaW4gc2FtcGxlIHBhaXJzICovCisgICAgTFZNX1VJTlQxNiBNYXhCbG9ja1NpemU7IC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KIAogICAgIC8qIENhbGxiYWNrIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjazsgICAgICAgICAgICAgICAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJ1bmRsZUluc3RhbmNlOyAgICAgICAvKiBCdW5kbGUgaW5zdGFuY2UgaGFuZGxlICovCisgICAgTFZNX0NhbGxiYWNrIENhbGxCYWNrOyAvKiBCdW5kbGUgY2FsbGJhY2sgKi8KKyAgICB2b2lkKiBwQnVuZGxlSW5zdGFuY2U7IC8qIEJ1bmRsZSBpbnN0YW5jZSBoYW5kbGUgKi8KIAogfSBMVkNTX0NhcGFiaWxpdGllc190OwogCkBAIC0yMTMsODIgKzE2Nyw0NCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCi0vKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcywgb2YgdGhlc2Ugb25seSB0aGUgYnVmZmVyIHByb2Nlc3Npbmcgc2V0dGluZyBpcyAgICAgKi8KLS8qICB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KLS8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KLS8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLwotLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgc2NyYXRjaCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QqIHBoSW5zdGFuY2UsIExWQ1NfQ2FwYWJpbGl0aWVzX3QqIHBDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFNjcmF0Y2gpOwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX01lbW9yeShMVkNTX0hhbmRsZV90ICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAgICovCi0vKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAgICovCi0vKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICAgKi8KLS8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgICAqLwotLyogIExWQ1NfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfQWxpZ25tZW50RXJyb3IgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IG9uIGluY29ycmVjdCBhbGlnbm1lbnQgICAgICAgICAgICovCi0vKiAgTFZDU19OdWxsQWRkcmVzcyAgICAgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcmVlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBMVkNTX0luaXQgY2FsbCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDU19EZUluaXQoTFZDU19IYW5kbGVfdCogcGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMTAsOCArMjI2LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0dldFBhcmFtZXRlcnMoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzMyLDggKzI0Nyw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTYsOSArMjcwLDcgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2VzcyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIExWQ1NfSCAqLworI2VuZGlmIC8qIExWQ1NfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcAppbmRleCBiYTE1MmMwLi5mODA1ZmNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcApAQCAtMzIsOSArMzIsOCBAQAogLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayggICBMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW0pOworTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjUsMjkgKzY0LDIyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW47Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBDdXJyZW50OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OwotICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGU7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IE9mZnNldDsKKyAgICBMVk1fRkxPQVQgR2FpbjsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0J5cGFzc01peF90KiBwQ29uZmlnID0gKExWQ1NfQnlwYXNzTWl4X3QqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKKyAgICBjb25zdCBHYWluX3QqIHBPdXRwdXRHYWluVGFibGU7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgdHJhbnNpdGlvbiBnYWluCiAgICAgICovCi0gICAgaWYgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pICYmCi0gICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICYmIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnN0aW9uICovCi0gICAgICAgICkKLSAgICB7CisgICAgaWYgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pICYmIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCisgICAgICAgIChwSW5zdGFuY2UtPk1TVGFyZ2V0MSAhPSAweDdGRkYpIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9mZi0+b24gdHJhbnNpdGlvbiAqLworICAgICkgewogICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gKChMVk1fRkxPQVQpcFBhcmFtcy0+RWZmZWN0TGV2ZWwgLyAzMjc2Nyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7CisgICAgfSBlbHNlIHsKICAgICAgICAgLyogU2VsZWN0IG5vIGVmZmVjdCBsZXZlbCAqLwogICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gMDsKICAgICB9CkBAIC05NSwxOCArODcsMTkgQEAKICAgICAvKgogICAgICAqIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGdhaW4gdGFibGUgb2Zmc2V0CiAgICAgICovCi0gICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKSk7CisgICAgT2Zmc2V0ID0KKyAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgKiAoMSArIExWQ1NfRVhfSEVBRFBIT05FUykpKTsKICAgICBwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOwogCiAgICAgLyoKICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHByb2Nlc3NlZCBwYXRoCiAgICAgICovCi0gICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOwogCiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MTsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDE7CiAKICAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKICAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKQEAgLTExNiw4ICsxMDksOCBAQAogICAgIC8qCiAgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCiAgICAgICovCi0gICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDEuMCAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOworICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqCisgICAgICAgICAgICAgICAgICAgICAgICgxLjAgLSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKTsKICAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIEdhaW47CiAgICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7CiAgICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAoTFZNX0ZMT0FUKShHYWluKSwgQ3VycmVudCk7CkBAIC0xMjUsNyArMTE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKICAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgPSBoSW5zdGFuY2U7Ci0gICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQ9MTsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IDE7CiAgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZDU19NaXhlckNhbGxiYWNrOwogCiAgICAgLyoKQEAgLTEzNyw0NSArMTMwLDQyIEBACiAgICAgICogQ29ycmVjdCBnYWluIGZvciB0aGUgZWZmZWN0IGxldmVsCiAgICAgICovCiAgICAgewotICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW5Db3JyZWN0OwotICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4xOwotICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEdhaW4yOworICAgICAgICBMVk1fRkxPQVQgR2FpbkNvcnJlY3Q7CisgICAgICAgIExWTV9GTE9BVCBHYWluMTsKKyAgICAgICAgTFZNX0ZMT0FUIEdhaW4yOwogCiAgICAgICAgIEdhaW4xID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwogICAgICAgICBHYWluMiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKICAgICAgICAgLyoKICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KICAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICAgICAgewotICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5GdWxsICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKSB7CisgICAgICAgICAgICBHYWluQ29ycmVjdCA9IChMVk1fRkxPQVQpKHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluRnVsbCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKSk7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCk7Ci0gICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpOwotCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KTsKKyAgICAgICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBnYWluIHZhbHVlcwogICAgICAgICAgKi8KICAgICAgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcENvbmZpZy0+T3V0cHV0X1NoaWZ0OwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxHYWluMSk7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCBHYWluMSk7CiAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKLSAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjIpOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgR2FpbjIpOwogICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci0KKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDUsMzkgKzE5NSwzMSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBVbnByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgICAgICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICAgICAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCogcFVucHJvY2Vzc2VkLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpIHsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBMVkNTX0J5cGFzc01peF90KiBwQ29uZmlnID0gKExWQ1NfQnlwYXNzTWl4X3QqKSZwSW5zdGFuY2UtPkJ5cGFzc01peDsKKyAgICBMVk1fVUlOVDE2IGRlc3ROdW1TYW1wbGVzID0KKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IEZDQ18xKSA/IE51bVNhbXBsZXMgOiBGQ0NfMiAqIE51bVNhbXBsZXM7CiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBieXBhc3MgbWl4ZXIgaXMgZW5hYmxlZAogICAgICAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfQllQQVNTTUlYU1dJVENIKSAhPSAwKQotICAgIHsKKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX0JZUEFTU01JWFNXSVRDSCkgIT0gMCkgewogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSB0aGUgYnlwYXNzIG1peAogICAgICAgICAgKi8KLSAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopIHBVbnByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwgcFByb2Nlc3NlZCwgKExWTV9GTE9BVCopcFVucHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgKExWTV9JTlQxNilkZXN0TnVtU2FtcGxlcyk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IG91dHB1dCBnYWluIGNvcnJlY3Rpb24gc2hpZnQKICAgICAgICAgICovCi0gICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisgICAgICAgIFNoaWZ0X1NhdF9GbG9hdCgoTFZNX0lOVDE2KXBDb25maWctPk91dHB1dF9TaGlmdCwgKExWTV9GTE9BVCopcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgKExWTV9JTlQxNilkZXN0TnVtU2FtcGxlcyk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ1LDIyICsyMjcsMTggQEAKIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01peGVyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiBMVkNTX01peGVyQ2FsbGJhY2soTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBDYWxsYmFja1BhcmFtKQotewotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayhMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgdm9pZCogcEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSkgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCi0gICAodm9pZClwR2VuZXJhbFB1cnBvc2U7CisgICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOwogCiAgICAgLyoKICAgICAgKiBPZmYgdHJhbnNpdGlvbiBoYXMgY29tcGxldGVkIGluIEhlYWRwaG9uZSBtb2RlCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICAgICAmJgotICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMHgwMDAwKSYmICAvKiB0aGlzIGluZGljYXRlcyBhbiBvbi0+b2ZmIHRyYW5zaXRpb24gKi8KLSAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPT0gTFZDU19IRUFEUEhPTkUpICYmIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uKSAmJgorICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMHgwMDAwKSAmJiAvKiB0aGlzIGluZGljYXRlcyBhbiBvbi0+b2ZmIHRyYW5zaXRpb24gKi8KKyAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpIHsKICAgICAgICAgLyogU2V0IG9wZXJhdGluZyBtb2RlIHRvIE9GRiAqLwogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZDU19PRkY7CiAKQEAgLTI2OCwyMSArMjQ2LDE3IEBACiAgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CiAKICAgICAgICAgLyogU2lnbmFsIHRvIHRoZSBidW5kbGUgKi8KLSAgICAgICAgaWYoKCpwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjaykgIT0gTFZNX05VTEwpewotICAgICAgICAgICAgKCpwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjaykocEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwsCisgICAgICAgIGlmICgoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKSAhPSBMVk1fTlVMTCkgeworICAgICAgICAgICAgKCpwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjaykocEluc3RhbmNlLT5DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlLCBMVk1fTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTEdPUklUSE1fQ1NfSUQgfCBMVkNTX0VWRU5UX0FMR09GRikpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgICYmCi0gICAgICAgIChwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9PSAxKSAmJgotICAgICAgICAocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSl7Ci0KKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAmJiAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMSkgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkpIHsKICAgICAgICAgLyogRXhpdCB0cmFuc2l0aW9uIHN0YXRlICovCiAgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fRkFMU0U7CiAgICAgfQogCiAgICAgcmV0dXJuIDE7CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAppbmRleCBmY2Q4ZWUzLi42OWFmY2JiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCkBAIC0zMywyMCArMzMsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIEJ5cGFzcyBtaXhlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Cit0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KLSAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPdXRwdXRfU2hpZnQ7ICAgICAgICAgICAgICAgLyogQ29ycmVjdGluZyBnYWluIG91dHB1dCBzaGlmdCAqLworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCBNaXhlcl9JbnN0YW5jZTsgLyogTWl4ZXIgaW5zdGFuY2UgKi8KKyAgICBMVk1fVUlOVDE2IE91dHB1dF9TaGlmdDsgICAgICAgICAgICAgIC8qIENvcnJlY3RpbmcgZ2FpbiBvdXRwdXQgc2hpZnQgKi8KIAogfSBMVkNTX0J5cGFzc01peF90OwogCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIE91dHB1dCBnYWluIHNldHRpbmdzLCBHYWluID0gKExvc3MvMzI3NjgpICogMl5TaGlmdCAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgU2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2hpZnRzIHJlcXVpcmVkICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLworICAgIExWTV9VSU5UMTYgU2hpZnQ7ICAgICAvKiBMZWZ0IHNoaWZ0cyByZXF1aXJlZCAqLworICAgIExWTV9GTE9BVCBMb3NzOyAgICAgICAvKiBMb3NzIHJlcXVpcmVkICovCisgICAgTFZNX0ZMT0FUIFVucHJvY0xvc3M7IC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLwogfSBHYWluX3Q7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTQsMTMgKzUyLDEwIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAqcFBhcmFtcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpOwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICp1blByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQqIHVuUHJvY2Vzc2VkLCBMVk1fRkxPQVQqIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIEJZUEFTU01JWF9IICovCisjZW5kaWYgLyogQllQQVNTTUlYX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmNwcAppbmRleCA1MGRiMDNkLi44OWYyZjNiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwCkBAIC00NSwxNSArNDUsMTIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0dldFBhcmFtZXRlcnMoTFZDU19IYW5kbGVfdCAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVkNTX1BhcmFtc190KiBwUGFyYW1zKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAKICAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzUsMzQgKzcyLDI5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Db250cm9sKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICpwUGFyYW1zKQotewotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBPZmZzZXQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgICAgICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBlcnI7Ci0gICAgTFZDU19Nb2Rlc19lbiAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGVTYXZlID0gcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9JTlQxNiBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworICAgIExWQ1NfTW9kZXNfZW4gT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOwogCi0gICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKLSAgICB7CisgICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkgewogICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlNhbXBsaW5nUmF0ZSA9IExWQ1NfU2FtcGxlUmF0ZVRhYmxlW3BQYXJhbXMtPlNhbXBsZVJhdGVdOwogICAgIH0KIAogICAgIC8qCiAgICAgICogSWYgdGhlIHJldmVyYiBsZXZlbCBoYXMgY2hhbmdlZAogICAgICAqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQotICAgIHsKLSAgICAgICAgZXJyPUxWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKSB7CisgICAgICAgIGVyciA9IExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogICAgIH0KIAogICAgIC8qCiAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgaGFzIGNoYW5nZWQgdGhlbiBwZXJmb3JtIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbgogICAgICAqLwogICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAotICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgewotICAgICAgICBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKSB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90KiBwTFZDU19Wb2xDb3JyZWN0VGFibGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogT3V0cHV0IGRldmljZQpAQCAtMTE0LDE1ICsxMDYsMTYgQEAKICAgICAgICAgICovCiAgICAgICAgIC8qIFVzZSBpbnRlcm5hbCBjb2VmZmljaWVudCB0YWJsZSAqLwogICAgICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQqKDErTFZDU19FWF9IRUFEUEhPTkVTKSk7CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICogKDEgKyBMVkNTX0VYX0hFQURQSE9ORVMpKTsKIAogICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKIAogICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwogICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOwogICAgICAgICB7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgR2FpbjsKLSAgICAgICAgICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGUgPSAoR2Fpbl90KikmTFZDU19PdXRwdXRHYWluVGFibGVbMF07CisgICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjsKKyAgICAgICAgICAgIGNvbnN0IEdhaW5fdCogcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyk7CiAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluKTsKIApAQCAtMTMzLDIyICsxMjYsMTggQEAKIAogICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCBHYWluKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKICAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKICAgICAgICAgfQogCi0gICAgICAgIGVycj1MVkNTX1NFbmhhbmNlckluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfU0VuaGFuY2VySW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCi0gICAgICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvckluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCi0gICAgICAgIGVycj1MVkNTX0VxdWFsaXNlckluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfRXF1YWxpc2VySW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCi0gICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCiAgICAgfQogCkBAIC0xNTYsMzAgKzE0NSwyNiBAQAogICAgICAqIENoZWNrIGlmIHRoZSBlZmZlY3QgbGV2ZWwgb3Igc291cmNlIGZvcm1hdCBoYXMgY2hhbmdlZAogICAgICAqLwogICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKLSAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkKLSAgICB7Ci0gICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisgICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQpKSB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90KiBwTFZDU19Wb2xDb3JyZWN0VGFibGU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogR2V0IHRoZSB2b2x1bWUgY29ycmVjdGlvbiBwYXJhbWV0ZXJzCiAgICAgICAgICAqLwogICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KICAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07Ci0gICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAqICgxICsgTFZDU19FWF9IRUFEUEhPTkVTKSk7CiAKICAgICAgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlW09mZnNldF07CiAKICAgICAgICAgLyogVXBkYXRlIHRoZSBlZmZlY3QgbGV2ZWwgYW5kIGFscGhhLW1peGVyIGdhaW5zICovCi0gICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisgICAgICAgIGVyciA9IExWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsIHBQYXJhbXMpOwogCi0gICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKGVyciAhPSBMVkNTX1NVQ0NFU1MpIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKKyAgICB9IGVsc2UgewogICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOwogICAgIH0KIApAQCAtMTg5LDQwICsxNzQsMzggQEAKICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOwogCiAgICAgLyogU3RheSBvbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCi0gICAgaWYoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUpIHx8Ci0gICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpKXsKLQorICAgIGlmICgocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpKSB7CiAgICAgICAgIC8qIFNldCB0aGUgcmV2ZXJiIGRlbGF5IHRpbWVvdXQgKi8KLSAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICE9IExWTV9UUlVFKSB7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CiAgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlRpbWVJbk1zID0KLSAgICAgICAgICAgIChMVk1fSU5UMTYpKCgocEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uLkRlbGF5U2l6ZSA8PCAyKQotICAgICAgICAgICAgL3BJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArIDEpOwotICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKCgocEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSBGQ0NfMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwSW5zdGFuY2UtPlJldmVyYmVyYXRpb24uRGVsYXlTaXplIDw8IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uLkRlbGF5U2l6ZSA8PCAyKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlNhbXBsaW5nUmF0ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgIExWTV9UaW1lcl9Jbml0KCZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsICZwSW5zdGFuY2UtPlRpbWVyUGFyYW1zKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLwotICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLCBwUGFyYW1zKTsKIAogICAgICAgICAvKiBDaGFuZ2UgdHJhbnNpdGlvbiBieXBhc3MgbWl4ZXIgc2V0dGluZ3MgaWYgbmVlZGVkIGRlcGVuZGluZyBvbiB0cmFuc2l0aW9uIHR5cGUgKi8KLSAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRil7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD1MVk1fTUFYSU5UXzE2OwotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKKyAgICAgICAgaWYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwID0gTFZNX01BWElOVF8xNjsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxID0gMDsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlU2F2ZTsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPUxWTV9NQVhJTlRfMTY7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD0wOworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDEgPSBMVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDAgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gZmxhZyAqLwogICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIzMywxMiArMjE2LDExIEBACiAvKiAgQ2FsbEJhY2sgZnVuY3Rpb24gb2YgdGhlIFRpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ1NfVGltZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKQotewotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKK3ZvaWQgTFZDU19UaW1lckNhbGxCYWNrKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCogcENhbGxCYWNrUGFyYW1zLCBMVk1fSU5UMzIgQ2FsbGJhY2tQYXJhbSkgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyogQXZvaWQgd2FybmluZ3MgYmVjYXVzZSBwQ2FsbEJhY2tQYXJhbXMgYW5kIENhbGxiYWNrUGFyYW0gYXJlIG5vdCB1c2VkKi8KLSAgICBpZigocENhbGxCYWNrUGFyYW1zICE9IExWTV9OVUxMKSB8fCAoQ2FsbGJhY2tQYXJhbSAhPSAwKSl7CisgICAgaWYgKChwQ2FsbEJhY2tQYXJhbXMgIT0gTFZNX05VTEwpIHx8IChDYWxsYmFja1BhcmFtICE9IDApKSB7CiAgICAgICAgIHBDYWxsQmFja1BhcmFtcyA9IGhJbnN0YW5jZTsKICAgICAgICAgQ2FsbGJhY2tQYXJhbSA9IDA7CiAgICAgICAgIHJldHVybjsKQEAgLTI0OCw0ICsyMzAsMyBAQAogCiAgICAgcmV0dXJuOwogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCmluZGV4IDQzMWI3ZTMuLjJiNjI4ZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgIkxWQ1MuaCIKICNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVkNTX0VxdWFsaXNlci5oIgpAQCAtNTMsNjggKzU0LDMxIEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgT2Zmc2V0OworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqIHBFcXVhbGlzZXJDb2VmVGFibGU7CiAKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YTsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOwotICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKLQotICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CiAgICAgLyoKICAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCiAgICAgICovCiAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeQogICAgICAgICAgKi8KICAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUgKyAocFBhcmFtcy0+U3BlYWtlclR5cGUgKiAoMSArIExWTV9GU180ODAwMCkpKTsKICAgICAgICAgcEVxdWFsaXNlckNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19FcXVhbGlzZXJDb2VmVGFibGVbMF07CiAKLSAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgZmlsdGVycyAqLwotICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCi0gICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkExOwotICAgICAgICBDb2VmZnMuQTIgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTI7Ci0gICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKLSAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIyOwotCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0lOVDE2KTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwotCi0gICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKLQotICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPiBjb2VmcyA9IHsKKyAgICAgICAgICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTAsIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMSwKKyAgICAgICAgICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTIsIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMSwKKyAgICAgICAgICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjJ9OworICAgICAgICBwSW5zdGFuY2UtPnBFcUJpcXVhZC5yZXNldChuZXcgYW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+KAorICAgICAgICAgICAgICAgIChwUGFyYW1zLT5OckNoYW5uZWxzID09IEZDQ18xKSA/IEZDQ18xIDogRkNDXzIsIGNvZWZzKSk7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzUsMzAgKzk5LDE3IEBACiAvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOwotCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBMVk1fRkxPQVQqIHBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCi0gICAgeworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKSB7CiAgICAgICAgIC8qIEFwcGx5IGZpbHRlciB0byB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgKi8KLSAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnRzLT5FcXVhbGlzZXJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wRXFCaXF1YWQtPnByb2Nlc3MocElucHV0T3V0cHV0LCBwSW5wdXRPdXRwdXQsIE51bVNhbXBsZXMpOwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAppbmRleCA5MThkOTMxLi41MjM3MzQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCkBAIC0yMywyMyArMjMsMTQgQEAKIC8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLCBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotfSBMVkNTX0VxdWFsaXNlcl90OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZNX0ZMT0FUKiBwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIEVRVUFMSVNFUl9IICovCisjZW5kaWYgLyogRVFVQUxJU0VSX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCmluZGV4IGM3ZWUyMzIuLjY5YzQ2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaApAQCAtMjQsMjAxICsyNCwyMDEgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjEyNTggKi8KLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyNzcyMAotI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIxNTEyNSkKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjkyMTg5OSkKLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MTE0NDEKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zODAzNDQpCi0jZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjMxMDk3KQotI2RlZmluZSBDU19TSURFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjYyMjQ3MCkKLSNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xMzA3NTkpCi0jZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAwLjIyNzcyMAorI2RlZmluZSBDU19NSURETEVfODAwMF9BMSAoLTAuMjE1MTI1KQorI2RlZmluZSBDU19NSURETEVfODAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfODAwMF9CMSAoLTAuOTIxODk5KQorI2RlZmluZSBDU19NSURETEVfODAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzgwMDBfQTAgMC42MTE0NDEKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0ExICgtMC4zODAzNDQpCisjZGVmaW5lIENTX1NJREVfODAwMF9BMiAoLTAuMjMxMDk3KQorI2RlZmluZSBDU19TSURFXzgwMDBfQjEgKC0wLjYyMjQ3MCkKKyNkZWZpbmUgQ1NfU0lERV84MDAwX0IyICgtMC4xMzA3NTkpCisjZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAxNQogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2Mjk0MyAqLwotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwODM4Ci0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjIxNTU5KQotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuOTQzMDU2KQotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjU1NzM3MgotI2RlZmluZSBDU19TSURFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjM5MTQ5MCkKLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICgtMC4xNjU4ODEpCi0jZGVmaW5lIENTX1NJREVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODgwNjA4KQotI2RlZmluZSBDU19TSURFXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDMyMzk3Ci0jZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EwIDAuMjMwODM4CisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMSAoLTAuMjIxNTU5KQorI2RlZmluZSBDU19NSURETEVfMTEwMjVfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0IxICgtMC45NDMwNTYpCisjZGVmaW5lIENTX01JRERMRV8xMTAyNV9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTEwMjVfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMCAwLjU1NzM3MgorI2RlZmluZSBDU19TSURFXzExMDI1X0ExICgtMC4zOTE0OTApCisjZGVmaW5lIENTX1NJREVfMTEwMjVfQTIgKC0wLjE2NTg4MSkKKyNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAoLTAuODgwNjA4KQorI2RlZmluZSBDU19TSURFXzExMDI1X0IyIDAuMDMyMzk3CisjZGVmaW5lIENTX1NJREVfMTEwMjVfU0NBTEUgMTUKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIxOTEgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjk5MzIKLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjIxNDM2KQotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMC45NDc2MTYpCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC41NTgzOTgKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zOTIyMTEpCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTY2MTg3KQotI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjg5MjU1MCkKLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAzMjg1NgotI2RlZmluZSBDU19TSURFXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgMC4yMjk5MzIKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0ExICgtMC4yMjE0MzYpCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTIwMDBfQjEgKC0wLjk0NzYxNikKKyNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xMjAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzEyMDAwX0EwIDAuNTU4Mzk4CisjZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgKC0wLjM5MjIxMSkKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9BMiAoLTAuMTY2MTg3KQorI2RlZmluZSBDU19TSURFXzEyMDAwX0IxICgtMC44OTI1NTApCisjZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgMC4wMzI4NTYKKyNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAxNQogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjM3MSAqLwotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMwNjM4Ci0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI0MjMyKQotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuOTYwNTUwKQotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMC40OTk2OTUKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMC4zNTU1NDMpCi0jZGVmaW5lIENTX1NJREVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTQ0MTUyKQotI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjA1MDc4OCkKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjE0NDEwNAotI2RlZmluZSBDU19TSURFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTAgMC4yMzA2MzgKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0ExICgtMC4yMjQyMzIpCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTYwMDBfQjEgKC0wLjk2MDU1MCkKKyNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xNjAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzE2MDAwX0EwIDAuNDk5Njk1CisjZGVmaW5lIENTX1NJREVfMTYwMDBfQTEgKC0wLjM1NTU0MykKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMiAoLTAuMTQ0MTUyKQorI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICgtMS4wNTA3ODgpCisjZGVmaW5lIENTX1NJREVfMTYwMDBfQjIgMC4xNDQxMDQKKyNkZWZpbmUgQ1NfU0lERV8xNjAwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MDc4MSAqLwotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjI4NzQ5Ci0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI0MTI4KQotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTAuOTcxMjYyKQotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNDQwMTEyCi0jZGVmaW5lIENTX1NJREVfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI2MTA5NikKLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTc5MDE2KQotI2RlZmluZSBDU19TSURFXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xMTY3ODYpCi0jZGVmaW5lIENTX1NJREVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgyNTA3Ci0jZGVmaW5lIENTX1NJREVfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMCAwLjIyODc0OQorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQTEgKC0wLjIyNDEyOCkKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8yMjA1MF9CMSAoLTAuOTcxMjYyKQorI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX1NDQUxFIDE1CisjZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgMC40NDAxMTIKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAoLTAuMjYxMDk2KQorI2RlZmluZSBDU19TSURFXzIyMDUwX0EyICgtMC4xNzkwMTYpCisjZGVmaW5lIENTX1NJREVfMjIwNTBfQjEgKC0xLjExNjc4NikKKyNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAwLjE4MjUwNworI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDI0MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxODgyICovCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjIzMDM5NQotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjI2MTE3KQotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk3MzU3MykKLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjQxNDc3MAotI2RlZmluZSBDU19TSURFXzI0MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg3MTgyKQotI2RlZmluZSBDU19TSURFXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMTI3NTg4KQotI2RlZmluZSBDU19TSURFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjI5NjQ4KQotI2RlZmluZSBDU19TSURFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yODIxNzcKLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0EwIDAuMjMwMzk1CisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAoLTAuMjI2MTE3KQorI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICgtMC45NzM1NzMpCisjZGVmaW5lIENTX01JRERMRV8yNDAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9BMCAwLjQxNDc3MAorI2RlZmluZSBDU19TSURFXzI0MDAwX0ExICgtMC4yODcxODIpCisjZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgKC0wLjEyNzU4OCkKKyNkZWZpbmUgQ1NfU0lERV8yNDAwMF9CMSAoLTEuMjI5NjQ4KQorI2RlZmluZSBDU19TSURFXzI0MDAwX0IyIDAuMjgyMTc3CisjZGVmaW5lIENTX1NJREVfMjQwMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjAzMjIgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjIyODQwMAotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjIyNTIxNCkKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjk4MDEyNikKLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzY0NTc5Ci0jZGVmaW5lIENTX1NJREVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjA3MzU1KQotI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjE1NzIyNCkKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4yNzQyMzEpCi0jZGVmaW5lIENTX1NJREVfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTI0OTUKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwIDAuMjI4NDAwCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9BMSAoLTAuMjI1MjE0KQorI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0IxICgtMC45ODAxMjYpCisjZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMzIwMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAwLjM2NDU3OQorI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICgtMC4yMDczNTUpCisjZGVmaW5lIENTX1NJREVfMzIwMDBfQTIgKC0wLjE1NzIyNCkKKyNkZWZpbmUgQ1NfU0lERV8zMjAwMF9CMSAoLTEuMjc0MjMxKQorI2RlZmluZSBDU19TSURFXzMyMDAwX0IyIDAuMzEyNDk1CisjZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjM4MzQgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM1OTMKLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjMxMjI1KQotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45ODU1NDUpCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjg0NTczCi0jZGVmaW5lIENTX1NJREVfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0wLjI1ODkxMCkKLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDI1NjYyKQotI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS41NzIyNDgpCi0jZGVmaW5lIENTX1NJREVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTg4Mzk5Ci0jZGVmaW5lIENTX1NJREVfNDQxMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQTAgMC4yMzM1OTMKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICgtMC4yMzEyMjUpCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjEgKC0wLjk4NTU0NSkKKyNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0EwIDAuMjg0NTczCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQTEgKC0wLjI1ODkxMCkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAoLTAuMDI1NjYyKQorI2RlZmluZSBDU19TSURFXzQ0MTAwX0IxICgtMS41NzIyNDgpCisjZGVmaW5lIENTX1NJREVfNDQxMDBfQjIgMC41ODgzOTkKKyNkZWZpbmUgQ1NfU0lERV80NDEwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2NDQwMiAqLwotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNDQ0NQotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yMzIyNjEpCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk4NjcxMykKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjcyNjA2Ci0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yNjY5NTIpCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDU2NTQpCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS42MTcxNDEpCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjYzMDQwNQotI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgMC4yMzQ0NDUKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0ExICgtMC4yMzIyNjEpCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfNDgwMDBfQjEgKC0wLjk4NjcxMykKKyNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV80ODAwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwIDAuMjcyNjA2CisjZGVmaW5lIENTX1NJREVfNDgwMDBfQTEgKC0wLjI2Njk1MikKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9BMiAoLTAuMDA1NjU0KQorI2RlZmluZSBDU19TSURFXzQ4MDAwX0IxICgtMS42MTcxNDEpCisjZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgMC42MzA0MDUKKyNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAxNAogCiAvKiBDb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCiAgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CiAgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQogICogZm9yIDQ0MTAwSHouCiAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM4NDZmCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzI2NTdmKQotI2RlZmluZSBDU19NSURETEVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5Mjc0N2YpCi0jZGVmaW5lIENTX01JRERMRV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19NSURETEVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMTU0MWYKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4OTU4NmYpCi0jZGVmaW5lIENTX1NJREVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDU4MDQ1ZgotI2RlZmluZSBDU19TSURFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzY1MzAwZikKLSNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43Njk4MTZmCi0jZGVmaW5lIENTX1NJREVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMCAwLjIzMzg0NmYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICgtMC4yMzI2NTdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTIgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMSAoLTAuOTkyNzQ3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfU0NBTEUgMTUKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMCAwLjIzMTU0MWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMSAoLTAuMjg5NTg2ZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAwLjA1ODA0NWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMSAoLTEuNzY1MzAwZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMiAwLjc2OTgxNmYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjUqLwogLyogaGlnaCBwYXNzIGZpbHRlciB3aXRoIGN1dG9mZiBmcmVxdWVuY3kgMTAyLjE4IEh6Ki8KLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzU1MzIKLSNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMjM0NDMyKQotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAwLjIzNTUzMgorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTEgKC0wLjIzNDQzMikKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMSAoLTAuOTkzMzM0KQorI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX1NDQUxFIDE1CiAvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCiAgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQogICovCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIyNDMyNmYKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yOTQ5MzdmKQotI2RlZmluZSBDU19TSURFXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wNzA2MTFmCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuNzkyMTY2ZikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk1ODMwZgotI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAwLjIyNDMyNmYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAoLTAuMjk0OTM3ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAwLjA3MDYxMWYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAoLTEuNzkyMTY2ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAwLjc5NTgzMGYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KICAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKICAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCiAgKiBmb3IgNDQxMDBIei4KICAqLwotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM5NzNmCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMzMzc4ZikKLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjM2N2YpCi0jZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTgzNmYKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMDc1NDRmKQotI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4xMDc3MDhmCi0jZGVmaW5lIENTX1NJREVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuODc2NTcyZikKLSNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuODc3NzcxZgotI2RlZmluZSBDU19TSURFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMCAwLjIzMzk3M2YKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAoLTAuMjMzMzc4ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMiAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMSAoLTAuOTk2MzY3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9TQ0FMRSAxNQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMCAwLjE5OTgzNmYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTEgKC0wLjMwNzU0NGYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyIDAuMTA3NzA4ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMSAoLTEuODc2NTcyZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjIgMC44Nzc3NzFmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFIDE0CiAKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAgMC4xNjg5Ki8KLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjQxMjE5Ci0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4yNDA2NTYpCi0jZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTk2NjYxKQotI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgMC4yNDEyMTkKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9BMSAoLTAuMjQwNjU2KQorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgKC0wLjk5NjY2MSkKKyNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFIDE1CiAvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCiAgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQogICovCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwIDAuMTk2MDM5ZgorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAoLTAuMzExMDI3ZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICgtMS44OTEzODBmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAwLjg5MjM0NjBmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFIDE0CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjI3LDEzMyArMjI3LDEzMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogUmV2ZXJiIGRlbGF5IHNldHRpbmdzIGluIHNhbXBsZXMgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haICAgICAgICAgICAgICAgICAgICAgOTMgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haICAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haICAgICAgICAgICAgICAgICAgIDEzOSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haICAgICAgICAgICAgICAgICAgIDE4NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haICAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDU1NyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haICAgICAgICAgICAgICAgICAgIDEwMjQgICAgICAgIC8qIFNhbXBsZSByYXRlIDg4LjJrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFogICAgICAgICAgICAgICAgICAgMTExNSAgICAgICAgLyogU2FtcGxlIHJhdGUgOTZrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haICAgICAgICAgICAgICAgICAgMjA0OCAgICAgICAgLyogU2FtcGxlIHJhdGUgMTc2LjRrUy9zICovCi0jZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haICAgICAgICAgICAgICAgICAgMjIyOSAgICAgICAgLyogU2FtcGxlIHJhdGUgMTk2a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTX01BWF9WQUwgICAgICAgICAgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiA5MyAgICAgLyogU2FtcGxlIHJhdGUgOGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiAxMjggICAvKiBTYW1wbGUgcmF0ZSAxMWtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xMktIWiAxMzkgICAvKiBTYW1wbGUgcmF0ZSAxMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiAxODYgICAvKiBTYW1wbGUgcmF0ZSAxNmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yMktIWiAyNTYgICAvKiBTYW1wbGUgcmF0ZSAyMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAyNzkgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAzNzIgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiA1MTIgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiA1NTcgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAxMDI0ICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haIDExMTUgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAyMDQ4IC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAyMjI5IC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haCiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQotI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNjY3MjcxKQotI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjY2ODE3OSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwIDAuNjY3MjcxCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICgtMC42NjcyNzEpCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IxICgtMC42NjgxNzkpCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl84MDAwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDAuNjk5NjM4Ci0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjY5OTYzOCkKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2KQotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTAgMC42OTk2MzgKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0ExICgtMC42OTk2MzgpCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQjEgKC0wLjc0OTA5NikKKyNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyIDAuMDAwMDAwCisjZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9TQ0FMRSAxNQogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgMC43MDY5MzEKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgKC0wLjcwNjkzMSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMSAgICAgICAgICAgICAgICAgICgtMC43NjczMjcpCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMiAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0EwIDAuNzA2OTMxCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAoLTAuNzA2OTMxKQorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICgtMC43NjczMjcpCisjZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuNzI4MjcyCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC43MjgyNzIpCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuODIwNjc5KQotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0EwIDAuNzI4MjcyCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAoLTAuNzI4MjcyKQorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTIgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICgtMC44MjA2NzkpCisjZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9CMiAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjIwNTBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EwICAgICAgICAgICAgICAgICAgICAgMC41MTYzOTYKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuNTE2Mzk2KQotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICgtMC41MTg1MTIpCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjI5MDk5MCkKLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EwIDAuNTE2Mzk2CisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTIgKC0wLjUxNjM5NikKKyNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICgtMC41MTg1MTIpCisjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAoLTAuMjkwOTkwKQorI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfU0NBTEUgMTUKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjQ3OTU2NQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuNDc5NTY1KQotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0wLjYzNzc0NSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgtMC4xOTg5MTIpCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMCAwLjQ3OTU2NQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EyICgtMC40Nzk1NjUpCisjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAoLTAuNjM3NzQ1KQorI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQjIgKC0wLjE5ODkxMikKKyNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjM4MDM0OQotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjM4MDM0OSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk1MDg3MykKLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuMDQ5MTI3Ci0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAwLjM4MDM0OQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0EyICgtMC4zODAzNDkpCisjZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9CMSAoLTAuOTUwODczKQorI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgMC4wNDkxMjcKKyNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX1NDQUxFIDE1CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAwLjI5NzM4OQotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NzM4OSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjIwMDQyMykKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjU2NTI5Ci0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAwLjI5NzM4OQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0EyICgtMC4yOTczODkpCisjZGVmaW5lIENTX1JFVkVSQl80NDEwMF9CMSAoLTEuMjAwNDIzKQorI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgMC4yNTY1MjkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFIDE0CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4yNzg2NjEKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjI3ODY2MSkKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS4yNTQ5OTMpCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC4zMDMzNDcKLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0EwIDAuMjc4NjYxCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgKC0wLjI3ODY2MSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IxICgtMS4yNTQ5OTMpCisjZGVmaW5lIENTX1JFVkVSQl80ODAwMF9CMiAwLjMwMzM0NworI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgMTQKIAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKLSNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCi0jZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQotI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwIDAuMTcxOTAxZgorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTEgMC4wMDAwMDBmCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9BMiAoLTAuMTcxOTAxZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IxICgtMS41NTM5NDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjIgKDAuNTcwMjQ4ZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX1NDQUxFIDE0CiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA5NjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCi0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4xNjAyNDg4Ci0jZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNjAyNDg4KQotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU4NTQxMykKLSNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwotI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTAgMC4xNjAyNDg4CisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9BMSAwLjAwMDAwMAorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTIgKC0wLjE2MDI0ODgpCisjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9CMSAoLTEuNTg1NDEzKQorI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgMC41OTkzNzcKKyNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX1NDQUxFIDE0CiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA5NDc2M2YKLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjA5NDc2M2YpCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjc1ODU5M2YpCi0jZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgKDAuNzYzMDkxZikKLSNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EwIDAuMDk0NzYzZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0ExIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCi0jZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wODc4MzY5KQotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NzY1NzY0KQotI2RlZmluZSBDU19SRVZFUkJfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc4MDQwNzYKLSNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgMC4wODc4MzY5CisjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTEgMC4wMDAwMDAKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMiAoLTAuMDg3ODM2OSkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMSAoLTEuNzc2NTc2NCkKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAwLjc4MDQwNzYKKyNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRSAxNAogCiAvKiBSZXZlcmIgR2FpbiBTZXR0aW5ncyAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gICAgICAgICAgICAgICAwLjgwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAgICAgICAgICAgICAgMS4wMDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4gICAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBQcm9jZXNzZWQgcGF0aCBnYWluICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4gICAgICAgICAgICAgICAgIDE4NDAzICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU5DT1JSRUNUICAgICAgICAgICAgIDEuMDA5MzQzICAgICAgICAgLyogRGVsYXkgbWl4ZXIgZ2FpbiBjb3JyZWN0aW9uICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0RFTEFZR0FJTiAwLjgwMDAwMCAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAxLjAwMDAwMCAgLyogQWxnb3JpdGhtIG91dHB1dCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1BST0NHQUlOIDE4NDAzICAgICAgIC8qIFByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KKyNkZWZpbmUgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTiAxODQwMyAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU5DT1JSRUNUIDEuMDA5MzQzIC8qIERlbGF5IG1peGVyIGdhaW4gY29ycmVjdGlvbiAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM2MywyMDUgKzM2MywyMDQgQEAKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzg0OTcgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzU0ODAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI2MzMxMgotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjYwMTc0OCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4yODA2ODEpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNDc1ODY1KQotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjQwODE1NCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMC45NDMzNTcKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTAuNDQ5MzQ1KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EyICAgICAgICAgICAgICAgICAgICgtMC4yMDk1OTQpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0wLjQ3NTg2NSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAoLTAuNDA4MTU0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMCAxLjI2MzMxMgorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAoLTAuNjAxNzQ4KQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAoLTAuMjgwNjgxKQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAoLTAuNDc1ODY1KQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAoLTAuNDA4MTU0KQorI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EwIDAuOTQzMzU3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgKC0wLjQ0OTM0NSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiAoLTAuMjA5NTk0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0IxICgtMC40NzU4NjUpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgKC0wLjQwODE1NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRSAxNQogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAyNzc2MSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2NzQ2MyAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgIDEuMTAxMTQ1Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgMC4xMzkwMjAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICgtMC44NjQ0MjMpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgMC4wMjQ1NDEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICgtMC45MDg5MzApCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgICAwLjk3NjA1OAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAoLTAuNjk1MzI2KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDkwODA5KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAoLTAuNjEwNTk0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAoLTAuMzExMTQ5KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTAgMS4xMDExNDUKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExIDAuMTM5MDIwCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMiAoLTAuODY0NDIzKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjEgMC4wMjQ1NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0IyICgtMC45MDg5MzApCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCAwLjk3NjA1OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSAoLTAuNjk1MzI2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiAoLTAuMDkwODA5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSAoLTAuNjEwNTk0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiAoLTAuMzExMTQ5KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAxNQogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzMjUyMSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MTAxNyAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMS4yNzY2NjEKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0xLjAxNzUxOSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjA0NDEyOCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjcyOTYxNikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgKC0wLjIwNDUzMikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTAgICAgICAgICAgICAgICAgIDEuMDA3MDk1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICgtMC44NzE5MTIpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAwLjAyMzIzMgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAgICAgICAgICAgICAgICAoLTAuNzQ1ODU3KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAgICAgICAgICAgICAgICAoLTAuMTg5MTcxKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTAgMS4yNzY2NjEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExICgtMS4wMTc1MTkpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9BMiAoLTAuMDQ0MTI4KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgKC0wLjcyOTYxNikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyICgtMC4yMDQ1MzIpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAxLjAwNzA5NQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSAoLTAuODcxOTEyKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiAwLjAyMzIzMgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSAoLTAuNzQ1ODU3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiAoLTAuMTg5MTcxKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRSAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjAzMTM3OCBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc3MDE2NCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjI4MTYyOQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMS4wNzU4NzIpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjA0MTM2NSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuNzI1MjM5KQotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMC4yMjQzNTgpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgMS4wODEwOTEKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICgtMC44NjcxODMpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAoLTAuMDcwMjQ3KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjUxNTEyMSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC40MjU4OTMpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9BMCAxLjI4MTYyOQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgKC0xLjA3NTg3MikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyICgtMC4wNDEzNjUpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNjAwMF9CMSAoLTAuNzI1MjM5KQorI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgKC0wLjIyNDM1OCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFIDE0CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EwIDEuMDgxMDkxCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICgtMC44NjcxODMpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICgtMC4wNzAyNDcpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICgtMC41MTUxMjEpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICgtMC40MjU4OTMpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFIDE0CiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDQxNTc2IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc3Nzc5ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAxLjM4ODYwNQotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAoLTEuMzA1Nzk5KQotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgICAgICAgICAgICAgICAgICAgMC4wMzk5MjIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgKC0wLjcxOTQ5NCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgKC0wLjI0MzI0NSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgMS4yNzI5MTAKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgICAgICAgICAgICAgICAgICAoLTEuMzQxMDE0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAwLjE2NzQ2MgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICgtMC42MTQyMTkpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgKC0wLjM0NTM4NCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EwIDEuMzg4NjA1CisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMSAoLTEuMzA1Nzk5KQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQTIgMC4wMzk5MjIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxICgtMC43MTk0OTQpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9CMiAoLTAuMjQzMjQ1KQorI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTAgMS4yNzI5MTAKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEgKC0xLjM0MTAxNCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIgMC4xNjc0NjIKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEgKC0wLjYxNDIxOSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgKC0wLjM0NTM4NCkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgMTQKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMzQ0OTUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzI0OTEgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjQwOTgzMgotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0xLjQ1NjUwNikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgICAwLjE1MTQxMAotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0wLjgwNDIwMSkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICgtMC4xNjM3ODMpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgMS4yOTkxOTgKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICgtMS40NTI0NDcpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyICAgICAgICAgICAgICAgICAgMC4yNDA0ODkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEgICAgICAgICAgICAgICAgICgtMC42NjkzMDMpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyICAgICAgICAgICAgICAgICAoLTAuMjk0OTg0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTAgMS40MDk4MzIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExICgtMS40NTY1MDYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9BMiAwLjE1MTQxMAorI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQjEgKC0wLjgwNDIwMSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyICgtMC4xNjM3ODMpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAxNAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCAxLjI5OTE5OAorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSAoLTEuNDUyNDQ3KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiAwLjI0MDQ4OQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAoLTAuNjY5MzAzKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAoLTAuMjk0OTg0KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAxNAogCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBcCiAgICBDUyBzY2FsZWQgd2l0aCAxLjA0NDU1OSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc4MDAwNiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxLjU2MDk4OAotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMS44Nzc3MjQpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMzg5NzQxCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjkwNzQxMCkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTAuMDcwNDg5KQotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgIDEuNzg1MDQ5Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExICAgICAgICAgICAgICAgICAoLTIuMjMzNDk3KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgIDAuNTI2NDMxCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAoLTAuNDQ1OTM5KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiAgICAgICAgICAgICAgICAgKC0wLjUyMjQ0NikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0EwIDEuNTYwOTg4CisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAoLTEuODc3NzI0KQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTIgMC4zODk3NDEKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICgtMC45MDc0MTApCisjZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9CMiAoLTAuMDcwNDg5KQorI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfU0NBTEUgMTQKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgMS43ODUwNDkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEgKC0yLjIzMzQ5NykKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIgMC41MjY0MzEKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEgKC0wLjQ0NTkzOSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIgKC0wLjUyMjQ0NikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEUgMTMKIAogLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgNDQxMDBIeiBzYW1wbGUgcmF0ZSwgXAogICAgQ1Mgc2NhbGVkIHdpdGggMS4wMjIxNzAgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NjMyODggKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgMS42MjM5OTMKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAoLTIuMjcwNzQzKQotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAwLjY4ODgyOQotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICgtMS4xMTcxOTApCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgIDAuMTMwMjA4Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDIuMDI4MzE1Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgKC0yLjg4MjQ1OSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgMC45MDQ1MzUKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAoLTAuNTkzMzA4KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICgtMC4zODU4MTYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAxLjYyMzk5MworI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQTEgKC0yLjI3MDc0MykKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyIDAuNjg4ODI5CisjZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9CMSAoLTEuMTE3MTkwKQorI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgMC4xMzAyMDgKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwIDIuMDI4MzE1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExICgtMi44ODI0NTkpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyIDAuOTA0NTM1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxICgtMC41OTMzMDgpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyICgtMC4zODU4MTYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFIDEzCiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIFwKICAgIENTIHNjYWxlZCB3aXRoIDEuMDE4NjM1IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYwNjQ4ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS42NDExNzcKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMi4zNjQ2ODcpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC43NTk5MTAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS4xNjY3NzQpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC4xNzgwNzQKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAyLjA5OTY1NQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgKC0zLjA2NTIyMCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAxLjAxMDQxNwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjYzNDAyMSkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4zNDczMzIpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMCAxLjY0MTE3NworI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTEgKC0yLjM2NDY4NykKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyIDAuNzU5OTEwCisjZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9CMSAoLTEuMTY2Nzc0KQorI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQjIgMC4xNzgwNzQKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwIDIuMDk5NjU1CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICgtMy4wNjUyMjApCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyIDEuMDEwNDE3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxICgtMC42MzQwMjEpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyICgtMC4zNDczMzIpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFIDEzCiAKIC8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCiAgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CiAgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQogICogZm9yIDQ0MTAwSHouCiAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQotI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMCAxLjc3MTg5OWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExICgtMi45MzA3NjJmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTIgMS4xNzIxNzVmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9CMSAoLTEuNDM4MzQ5ZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyIDAuNDQyNTIwZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfU0NBTEUgMTMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICgtNC40NjYxNTRmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMiAxLjgxMDMwNWYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICgtMC4wNjY2MTZmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAxMwogCi0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS43ODQ0OTcKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy4wMDE0MzUpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMS4yMjg0MjIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40Nzc4MDQpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgMC40ODEzNjkKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAyLjc1NzMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICgtNC42NzIxKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiAgICAgICAgICAgICAgICAgIDEuOTMxNwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9BMCAxLjc4NDQ5NworI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgKC0zLjAwMTQzNSkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyIDEuMjI4NDIyCisjZGVmaW5lIENTX0VRVUFMSVNFUl85NjAwMF9CMSAoLTEuNDc3ODA0KQorI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQjIgMC40ODEzNjkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EwIDIuNzU3MworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSAoLTQuNjcyMSkKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIgMS45MzE3CisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxICgtMC45NzE3MTgpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyICgtMC4wMjEyMTYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFIDEzCiAvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KICAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKICAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCiAgKiBmb3IgNDQxMDBIei4KICAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgotI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMCAxLjg4MzQ0MGYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAxLjUzNDcwMmYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSAoLTEuNjc0NjE0ZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAgMy4zNTUwNjhmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSAoLTYuMTEyNTc4ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyIDIuNzY0MTM1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEgKC0xLjI2ODUzM2YpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiAwLjI3MTI3N2YKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFIDEzCiAKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgMS44ODk1ODIKLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMuNDU2MTQwKQotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjU2OTg2NAotI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICgtMS43MDA3OTgpCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuNzAxODI0Ci0jZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAzLjQyNzMKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAoLTYuMjkzNikKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyICAgICAgICAgICAgICAgICAgMi44NzIwCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgKC0xLjMxMDc0KQotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIgICAgICAgICAgICAgICAgIDAuMzEzMTIKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQTAgMS44ODk1ODIKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSAoLTMuNDU2MTQwKQorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EyIDEuNTY5ODY0CisjZGVmaW5lIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEgKC0xLjcwMDc5OCkKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiAwLjcwMTgyNAorI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCAzLjQyNzMKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExICgtNi4yOTM2KQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIgMi44NzIwCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSAoLTEuMzEwNzQpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMiAwLjMxMzEyCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9TQ0FMRSAxMwogCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgICAgMC44NDc3NzM1ICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCBsb3NzICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICAgIDAuMjA4NzQ2NSAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCAqLwotI2RlZmluZSBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAwLjU2OTIyNSAgICAgICAgICAgLyogRVggT3V0cHV0IFNoaWZ0IGxvc3MgKi8KLSNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfR0FJTiAgICAgICAgICAgICAgICAgICAgMC4wNzc5NDQyNSAgICAgICAgIC8qIEVYIFVucHJvY2Vzc2VkIHBhdGggZ2FpbiAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAyICAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCisjZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAwLjg0Nzc3MzUgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLworI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOIDAuMjA4NzQ2NSAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUIDMgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KKyNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTIDAuNTY5MjI1IC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCisjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gMC4wNzc5NDQyNSAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KICNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAKaW5kZXggNjMwZWNmNy4uZGQxYmFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcApAQCAtMjAsOTkgKzIwLDExIEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJMVkNTLmgiCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCi0vKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiAgICAgICovCi0vKiAgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgICAgICAgICAgICAgICovCi0vKiAgY2FwYWJpbGl0aWVzIGFyZSBpZ25vcmVkIGFuZCB0aGUgbWVtb3J5IHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0luc3RhbmNlX3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZDU19QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19EYXRhX3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZDU19EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29lZmZpY2llbnQgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkNTX0NPRUZGSUNJRU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLwotICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZDU19TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTIwLDkxICszMiw5NSBAQAogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIExWTV9OVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICovCi0vKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICovCi0vKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gKi8KLS8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgLSBtYWxsb2MgZmFpbHVyZSAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLwotLyogIDMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGFzIHVzZWQgZm9yIHRoZSAgICAgKi8KLS8qICAgICAgY2FsbCB0byB0aGUgbWVtb3J5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgICAgICAgICAqcEluc3RhbmNlOwotICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICAgICAgICAgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90KiBwaEluc3RhbmNlLCBMVkNTX0NhcGFiaWxpdGllc190KiBwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBTY3JhdGNoKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2U7CisgICAgTFZDU19Wb2xDb3JyZWN0X3QqIHBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBuZXcgTFZDU19JbnN0YW5jZV90e307CiAgICAgfQotICAgIHBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKIAogICAgIC8qCiAgICAgICogU2F2ZSB0aGUgY2FwYWJpbGl0aWVzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOwogCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOworICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogU2V0IGFsbCBpbml0aWFsIHBhcmFtZXRlcnMgdG8gaW52YWxpZCB0byBmb3JjZSBhIGZ1bGwgaW5pdGlhbGlzYXRpb24KICAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICA9IExWQ1NfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICAgID0gTFZDU19TUEVBS0VSVFlQRV9NQVg7Ci0gICAgcEluc3RhbmNlLT5PdXRwdXREZXZpY2UgICAgICAgICAgPSBMVkNTX0hFQURQSE9ORTsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWQ1NfU09VUkNFTUFYOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9IExWQ1NfU1BFQUtFUlRZUEVfTUFYOworICAgIHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID0gTFZDU19IRUFEUEhPTkU7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TT1VSQ0VNQVg7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgPSBMVk1fRlNfSU5WQUxJRDsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgICAgPSAoTFZNX1VJTlQxNikweDgwMDA7Ci0gICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlICAgICAgICAgICAgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgICAgICAgICAgICA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKLSAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU19JTlZBTElEOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCA9IChMVk1fVUlOVDE2KTB4ODAwMDsKKyAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKKyAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9IDA7CiAKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKICAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLDAsMCk7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLCAwLCAwKTsKIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcwogICAgICAqLwotICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwPTA7Ci0gICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKLSAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuQ2FsbEJhY2tQYXJhbSAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFjayAgICAgICAgICAgICA9IExWQ1NfVGltZXJDYWxsQmFjazsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsYmFja0luc3RhbmNlICAgICA9IHBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFja1BhcmFtcyAgICAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwID0gMDsKKyAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MSA9IDA7CisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5DYWxsQmFja1BhcmFtID0gMDsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFjayA9IExWQ1NfVGltZXJDYWxsQmFjazsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsYmFja0luc3RhbmNlID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMucENhbGxCYWNrUGFyYW1zID0gTFZNX05VTEw7CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZyZWUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgdGhlIExWQ1NfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNTX0RlSW5pdChMVkNTX0hhbmRsZV90KiBwaEluc3RhbmNlKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KikqcGhJbnN0YW5jZTsKKyAgICBpZiAocEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZGVsZXRlIHBJbnN0YW5jZTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCmluZGV4IDE1NGVhNTUuLjU4ZTIxYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaApAQCAtMzMsMTEgKzMzLDEyIEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgIkxWQ1MuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbGluZyBvciBBcHBsaWNhdGlvbiBsYXllciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfU3RlcmVvRW5oYW5jZXIuaCIgICAgICAgICAgICAgICAgLyogU3RlcmVvIGVuaGFuY2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiICAgICAgICAgICAgICAgLyogUmV2ZXJiZXJhdGlvbiBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJMVkNTX0VxdWFsaXNlci5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEVxdWFsaXNlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJMVkNTX0J5cGFzc01peC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CaXF1YWRGaWx0ZXIuaD4KKyNpbmNsdWRlICJMVkNTLmgiICAgICAgICAgICAgICAgICAvKiBDYWxsaW5nIG9yIEFwcGxpY2F0aW9uIGxheWVyIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIiAgLyogU3RlcmVvIGVuaGFuY2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgiIC8qIFJldmVyYmVyYXRpb24gbW9kdWxlIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIgICAgICAgLyogRXF1YWxpc2VyIG1vZHVsZSBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiICAgICAgIC8qIEJ5cGFzcyBNaXhlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlICJMVk1fVGltZXIuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ3LDM1ICs0OCwyOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogQ29uZmlndXJhdGlvbiBzd2l0Y2ggY29udHJvbHMgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIICAgIDB4MDAwMSAgICAgIC8qIFN0ZXJlbyBlbmhhbmNlbWVudCBlbmFibGUgY29udHJvbCAqLwotI2RlZmluZSBMVkNTX1JFVkVSQlNXSVRDSCAgICAgICAgICAgMHgwMDAyICAgICAgLyogUmV2ZXJiZXJhdGlvbiBlbmFibGUgY29udHJvbCAqLwotI2RlZmluZSBMVkNTX0VRVUFMSVNFUlNXSVRDSCAgICAgICAgMHgwMDA0ICAgICAgLyogRXF1YWxpc2VyIGVuYWJsZSBjb250cm9sICovCi0jZGVmaW5lIExWQ1NfQllQQVNTTUlYU1dJVENIICAgICAgICAweDAwMDggICAgICAvKiBCeXBhc3MgbWl4ZXIgZW5hYmxlIGNvbnRyb2wgKi8KLSNkZWZpbmUgTFZDU19DT01QR0FJTkZSQU1FICAgICAgICAgIDY0ICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiB1cGRhdGUgaW50ZXJ2YWwgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIIDB4MDAwMSAvKiBTdGVyZW8gZW5oYW5jZW1lbnQgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgTFZDU19SRVZFUkJTV0lUQ0ggMHgwMDAyICAgICAgICAvKiBSZXZlcmJlcmF0aW9uIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfRVFVQUxJU0VSU1dJVENIIDB4MDAwNCAgICAgLyogRXF1YWxpc2VyIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfQllQQVNTTUlYU1dJVENIIDB4MDAwOCAgICAgLyogQnlwYXNzIG1peGVyIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIExWQ1NfQ09NUEdBSU5GUkFNRSA2NCAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHVwZGF0ZSBpbnRlcnZhbCAqLwogCiAvKiBNZW1vcnkgKi8KLSNpZmRlZiBTVVBQT1JUX01DCi0jZGVmaW5lIExWQ1NfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgICAgIDggICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0jZWxzZQotI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2VuZGlmCi0jaWZkZWYgU1VQUE9SVF9NQworI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTIDggLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwogLyoKICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBhcHBsaWVzIHByb2Nlc3Npbmcgb25seSBvbiB0aGUgZmlyc3QgdHdvCiAgKiBjaGFubmVscyBvZiBhIG11bHRpY2hhbm5lbCBpbnB1dC4gVGhlIGRhdGEgb2YgZmlyc3QgdHdvIGNoYW5uZWxzIGlzIGNvcGllZAogICogZnJvbSB0aGUgbXVsdGljaGFubmVsIGlucHV0IGludG8gc2NyYXRjaCBidWZmZXIuIFRoZSBidWZmZXJzIGFkZGVkIGhlcmUKICAqIGFyZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UKICAqLwotI2RlZmluZSBMVkNTX01DX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAyCi0jZW5kaWYKKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAyCiAKIC8qIEdlbmVyYWwgKi8KLSNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgTFZDU19CWVBBU1NfTUlYRVJfVEMgICAgICAgIDEwMCAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCisjZGVmaW5lIExWQ1NfSU5WQUxJRCAweEZGRkYgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCisjZGVmaW5lIExWQ1NfQllQQVNTX01JWEVSX1RDIDEwMCAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwogCiAvKiBBY2Nlc3MgdG8gZXh0ZXJuYWwgY29lZmZpY2llbnRzIHRhYmxlICovCi0jZGVmaW5lIExWQ1NfTlJfT0ZfRlMgICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgTFZDU19OUl9PRl9DSEFOX0NGRyAgICAgICAgICAgICAgMgorI2RlZmluZSBMVkNTX05SX09GX0ZTIDkKKyNkZWZpbmUgTFZDU19OUl9PRl9DSEFOX0NGRyAyCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODMsMTMgKzc4LDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi10eXBlZGVmIExWTV9VSU5UMTYgIExWQ1NfQ29uZmlndXJhdGlvbl90OyAgICAgICAvKiBJbnRlcm5hbCBhbGdvcml0aG0gY29uZmlndXJhdGlvbiAqLwordHlwZWRlZiBMVk1fVUlOVDE2IExWQ1NfQ29uZmlndXJhdGlvbl90OyAvKiBJbnRlcm5hbCBhbGdvcml0aG0gY29uZmlndXJhdGlvbiAqLwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX0hFQURQSE9ORSAgPSAwLAotICAgIExWQ1NfREVWSUNFX01BWCA9IExWTV9NQVhFTlVNCi19IExWQ1NfT3V0cHV0RGV2aWNlX2VuOwordHlwZWRlZiBlbnVtIHsgTFZDU19IRUFEUEhPTkUgPSAwLCBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTSB9IExWQ1NfT3V0cHV0RGV2aWNlX2VuOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTk4LDY1ICs4OSw1MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogVm9sdW1lIGNvcnJlY3Rpb24gc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9GTE9BVCAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwotICAgIExWTV9GTE9BVCAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KLSAgICBMVk1fRkxPQVQgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwotICAgIExWTV9GTE9BVCAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIExWTV9GTE9BVCBDb21wRnVsbDsgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCBDb21wTWluOyAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KKyAgICBMVk1fRkxPQVQgR2FpbkZ1bGw7IC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLworICAgIExWTV9GTE9BVCBHYWluTWluOyAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLwogfSBMVkNTX1ZvbENvcnJlY3RfdDsKIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewordHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCisgICAgTFZDU19QYXJhbXNfdCBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVkNTX0NhcGFiaWxpdGllc190IENhcGFiaWxpdGllczsgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBQcml2YXRlIHBhcmFtZXRlcnMgKi8KLSAgICBMVkNTX091dHB1dERldmljZV9lbiAgICBPdXRwdXREZXZpY2U7ICAgICAgIC8qIFNlbGVjdGVkIG91dHB1dCBkZXZpY2UgdHlwZSAqLwotICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgIFZvbENvcnJlY3Q7ICAgICAgICAgLyogVm9sdW1lIGNvcnJlY3Rpb24gc2V0dGluZ3MgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCisgICAgTFZDU19PdXRwdXREZXZpY2VfZW4gT3V0cHV0RGV2aWNlOyAvKiBTZWxlY3RlZCBvdXRwdXQgZGV2aWNlIHR5cGUgKi8KKyAgICBMVkNTX1ZvbENvcnJlY3RfdCBWb2xDb3JyZWN0OyAgICAgIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHNldHRpbmdzICovCisgICAgTFZNX0ZMT0FUIFRyYW5zaXRpb25HYWluOyAgICAgICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgQ29tcHJlc3NHYWluOyAgICAgICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLwogCiAgICAgLyogU3ViLWJsb2NrIGNvbmZpZ3VyYXRpb25zICovCi0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgU3RlcmVvRW5oYW5jZXI7ICAgICAvKiBTdGVyZW8gZW5oYW5jZXIgY29uZmlndXJhdGlvbiAqLwotICAgIExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgIFJldmVyYmVyYXRpb247ICAgICAgLyogUmV2ZXJiZXJhdGlvbiBjb25maWd1cmF0aW9uICovCi0gICAgTFZDU19FcXVhbGlzZXJfdCAgICAgICAgRXF1YWxpc2VyOyAgICAgICAgICAvKiBFcXVhbGlzZXIgY29uZmlndXJhdGlvbiAqLwotICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgICAgIEJ5cGFzc01peDsgICAgICAgICAgLyogQnlwYXNzIG1peGVyIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgU3RlcmVvRW5oYW5jZXI7IC8qIFN0ZXJlbyBlbmhhbmNlciBjb25maWd1cmF0aW9uICovCisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCBSZXZlcmJlcmF0aW9uOyAvKiBSZXZlcmJlcmF0aW9uIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBMVkNTX0J5cGFzc01peF90IEJ5cGFzc01peDsgICAgICAgICAgIC8qIEJ5cGFzcyBtaXhlciBjb25maWd1cmF0aW9uICovCiAKICAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBNU1RhcmdldDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXhlciBzdGF0ZSBjb250cm9sIHZhcmlhYmxlIGZvciBzbW9vdGggdHJhbnN0aW9uICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTVNUYXJnZXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zdGlvbiAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAgICAgICAgIC8qIE9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gZmxhZyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJUaW1lckRvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIGNvbXBsZXRpb24gZmxhZyAqLwotICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgIFRpbWVyUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIHBhcmFtZXRlcnMgKi8KLSAgICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICBUaW1lckluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBpbnN0YW5jZSAqLworICAgIExWTV9JTlQxNiBNU1RhcmdldDA7ICAgICAgICAgICAgICAgICAgLyogTWl4ZXIgc3RhdGUgY29udHJvbCB2YXJpYWJsZSBmb3Igc21vb3RoIHRyYW5zaXRpb24gKi8KKyAgICBMVk1fSU5UMTYgTVNUYXJnZXQxOyAgICAgICAgICAgICAgICAgIC8qIE1peGVyIHN0YXRlIGNvbnRyb2wgdmFyaWFibGUgZm9yIHNtb290aCB0cmFuc2l0aW9uICovCisgICAgTFZNX0lOVDE2IGJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uOyAvKiBPcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uIGZsYWcgKi8KKyAgICBMVk1fSU5UMTYgYlRpbWVyRG9uZTsgICAgICAgICAgICAgICAgIC8qIFRpbWVyIGNvbXBsZXRpb24gZmxhZyAqLworICAgIExWTV9UaW1lcl9QYXJhbXNfdCBUaW1lclBhcmFtczsgICAgICAgLyogVGltZXIgcGFyYW1ldGVycyAqLworICAgIExWTV9UaW1lcl9JbnN0YW5jZV90IFRpbWVySW5zdGFuY2U7ICAgLyogVGltZXIgaW5zdGFuY2UgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgcEVxQmlxdWFkOyAvKiBCaXF1YWQgZmlsdGVyIGluc3RhbmNlIGZvciBFcXVhbGlzZXIgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgcFJldkJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgUmV2ZXJiZXJhdGlvbiAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjphdWRpb191dGlsczo6QmlxdWFkRmlsdGVyPExWTV9GTE9BVD4+CisgICAgICAgICAgICBwU0VNaWRCaXF1YWQ7IC8qIEJpcXVhZCBmaWx0ZXIgaW5zdGFuY2UgZm9yIFN0ZXJlbyBlbmhhbmNlbWVudCBtaWQgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YXVkaW9fdXRpbHM6OkJpcXVhZEZpbHRlcjxMVk1fRkxPQVQ+PgorICAgICAgICAgICAgcFNFU2lkZUJpcXVhZDsgLyogQmlxdWFkIGZpbHRlciBpbnN0YW5jZSBmb3IgU3RlcmVvIGVuaGFuY2VtZW50IHNpZGUgKi8KKyAgICB2b2lkKiBwU2NyYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKIH0gTFZDU19JbnN0YW5jZV90OwogCi0vKiBDb2VmZmljaWVudCBTdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRXF1YWxpc2VyQmlxdWFkSW5zdGFuY2U7Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgUmV2ZXJiQmlxdWFkSW5zdGFuY2U7Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgU0VCaXF1YWRJbnN0YW5jZU1pZDsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlU2lkZTsKLX0gTFZDU19Db2VmZmljaWVudF90OwogCi0vKiBEYXRhIFN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOwotICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7Ci0gICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOwotICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7Ci19IExWQ1NfRGF0YV90Owordm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKTsKIAotdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKCAgIHZvaWQqIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwotCi0jZW5kaWYgICAgICAvKiBQUklWQVRFX0ggKi8KLQorI2VuZGlmIC8qIFBSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwCmluZGV4IDhlMDliZTIuLjZhZjBmNzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAKQEAgLTY1LDExNiArNjUsNzUgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0gICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgY29uc3QgTFZNX0ZMT0FUKiBwSW5wdXQ7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUKiBwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworICAgIExWTV9GTE9BVCogcFN0SW47CisgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKIAotICAgIC8qSW4gY2FzZSBvZiBtb25vIHByb2Nlc3NpbmcsIHN0ZXJlbyBpbnB1dCBpcyBjcmVhdGVkIGZyb20gbW9ubwotICAgICAqYW5kIHN0b3JlZCBpbiBwSW5EYXRhIGJlZm9yZSBhcHBseWluZyBhbnkgb2YgdGhlIGVmZmVjdHMuCi0gICAgICpIb3dldmVyIHdlIGRvIG5vdCB1cGRhdGUgdGhlIHZhbHVlIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMKLSAgICAgKmF0IHRoaXMgcG9pbnQuCi0gICAgICpTbyB0byB0cmVhdCB0aGUgcEluRGF0YSBhcyBzdGVyZW8gd2UgYXJlIHNldHRpbmcgY2hhbm5lbHMgdG8gMgotICAgICAqLwotICAgIGlmIChjaGFubmVscyA9PSAxKQotICAgIHsKLSAgICAgICAgY2hhbm5lbHMgPSAyOwotICAgIH0KLSNlbmRpZgotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKgogICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCiAgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgogICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KICAgICAgKi8KICAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOwotICAgIHBTdEluICA9IHBTY3JhdGNoICsgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gMikgKiBOckZyYW1lcyk7Ci0gICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCi0gICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgotICAgICAqLwotICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOwotICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKLSAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKLSAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOwotI2Vsc2UKLSAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKLSAgICB7Ci0gICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwotICAgICAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnVtU2FtcGxlcyk7Ci0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcElucHV0LCAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgcFN0SW4gPSBwU2NyYXRjaCArICgoTFZDU19TQ1JBVENIQlVGRkVSUyAtIDIpICogTnJGcmFtZXMpOworICAgIGlmIChjaGFubmVscyA9PSBGQ0NfMSkgeworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbkRhdGEsIChMVk1fRkxPQVQqKXBJbnB1dCwgKExWTV9JTlQxNilOckZyYW1lcyk7CisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcElucHV0LCAoTFZNX0ZMT0FUKilwU3RJbiwgKExWTV9JTlQxNilOckZyYW1lcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICAgICAqIGNvcGllZCBpbnRvIHBJbnB1dCBidWZmZXIKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQqKXBJbkRhdGEsIChMVk1fRkxPQVQqKXBJbnB1dCwgTnJGcmFtZXMsIGNoYW5uZWxzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5wdXQsIChMVk1fRkxPQVQqKXBTdEluLCAoTFZNX0lOVDE2KShGQ0NfMiAqIE5yRnJhbWVzKSk7CiAgICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFByb2Nlc3Npbmcgb3V0cGxhY2UgKi8KLSAgICAgICAgcElucHV0ID0gcEluRGF0YTsKLSAgICB9Ci0jZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLwotI2Vsc2UKLSAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLSNlbmRpZgorICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdEluLCAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMpOyAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgKi8KIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgogICAgICAqLwotICAgIGVyciA9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yKGhJbnN0YW5jZSwgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworICAgIGVyciA9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yKGhJbnN0YW5jZSwgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCiAKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwotICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyAgICBlcnIgPSBMVkNTX0VxdWFsaXNlcihoSW5zdGFuY2UsICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBieXBhc3MgbWl4ZXIKICAgICAgKi8KLSAgICBlcnIgPSBMVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisgICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgLyogUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCAodW5wcm9jZXNzZWQpIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KIAotICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgeworICAgIGlmIChlcnIgIT0gTFZDU19TVUNDRVNTKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisgICAgcmV0dXJuIChMVkNTX1NVQ0NFU1MpOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDIsMTcxICsxNjEsMTE3IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CiAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKkV4dHJhY3QgbnVtYmVyIG9mIENoYW5uZWxzIGluZm8qLwogICAgIExWTV9JTlQzMiBjaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisgICAgTFZNX1VJTlQxNiBkZXN0TnVtU2FtcGxlcyA9IChjaGFubmVscyA9PSBGQ0NfMSkgPyBOdW1TYW1wbGVzIDogRkNDXzIgKiBOdW1TYW1wbGVzOworICAgIExWTV9JTlQzMiBjb21wR2FpbkludGVydmFsID0KKyAgICAgICAgICAgIChjaGFubmVscyA9PSBGQ0NfMSkgPyBMVkNTX0NPTVBHQUlORlJBTUUgOiBGQ0NfMiAqIExWQ1NfQ09NUEdBSU5GUkFNRTsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKLSAgICBpZiAoY2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIGNoYW5uZWxzID0gMjsKLSAgICB9Ci0jZW5kaWYKICAgICAvKgogICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCiAgICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4oTFZDU19UT09NQU5ZU0FNUExFUyk7CisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpIHsKKyAgICAgICAgcmV0dXJuIChMVkNTX1RPT01BTllTQU1QTEVTKTsKICAgICB9CiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAogICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCi0gICAgICAgIExWTV9GTE9BVCAqcFN0ZXJlb091dDsKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikgeworICAgICAgICBMVk1fRkxPQVQqIHBTdGVyZW9PdXQ7CiAgICAgICAgIC8qCiAgICAgICAgICAqIExWQ1NfUHJvY2Vzc19DUyB1c2VzIG91dHB1dCBidWZmZXIgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIG91dHB1dHMgb2YgU3RlcmVvRW5oYW5jZXIsCiAgICAgICAgICAqIEVxdWFsaXplciwgUmV2ZXJiR2VuZXJhdG9yIGFuZCBCeXBhc3NNaXhlci4KICAgICAgICAgICogU28sIHRvIGF2b2lkIGkvbyBkYXRhIG92ZXJsYXBwaW5nLCB3aGVuIGkvbyBidWZmZXJzIGFyZSBjb21tb24sIHVzZSBzY3JhdGNoIGJ1ZmZlcgogICAgICAgICAgKiB0byBzdG9yZSBpbnRlcm1lZGlhdGUgb3V0cHV0cy4KICAgICAgICAgICovCi0gICAgICAgIGlmIChwT3V0RGF0YSA9PSBwSW5EYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeSBpcyB1c2VkIGluIDQgY2h1bmtzIG9mICgyICogTnJGcmFtZXMpIHNpemUuCi0gICAgICAgICAgICogRmlyc3QgY2h1bmsgb2YgbWVtb3J5IGlzIHVzZWQgYnkgTFZDU19TdGVyZW9FbmhhbmNlciBhbmQgTFZDU19SZXZlcmJHZW5lcmF0b3IsCi0gICAgICAgICAgICogc2Vjb25kIGFuZCBmb3VydGggYXJlIHVzZWQgYXMgaW5wdXQgYnVmZmVycyBieSBwSW5wdXQgYW5kIHBTdEluIGluIExWQ1NfUHJvY2Vzc19DUy4KLSAgICAgICAgICAgKiBIZW5jZSwgcFN0ZXJlb091dCBpcyBwb2ludGVkIHRvIHVzZSB1bnVzZWQgdGhpcmQgcG9ydGlvbiBvZiBzY3JhdGNoIG1lbW9yeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBTdGVyZW9PdXQgPSAoTFZNX0ZMT0FUICopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZDU19TQ1JBVENIQlVGRkVSUyAtIDQpICogTnJGcmFtZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeworICAgICAgICBpZiAocE91dERhdGEgPT0gcEluRGF0YSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5IGlzIHVzZWQgaW4gNCBjaHVua3Mgb2YgKDIgKiBOckZyYW1lcykgc2l6ZS4KKyAgICAgICAgICAgICAqIEZpcnN0IGNodW5rIG9mIG1lbW9yeSBpcyB1c2VkIGJ5IExWQ1NfU3RlcmVvRW5oYW5jZXIgYW5kIExWQ1NfUmV2ZXJiR2VuZXJhdG9yLAorICAgICAgICAgICAgICogc2Vjb25kIGFuZCBmb3VydGggYXJlIHVzZWQgYXMgaW5wdXQgYnVmZmVycyBieSBwSW5wdXQgYW5kIHBTdEluIGluIExWQ1NfUHJvY2Vzc19DUy4KKyAgICAgICAgICAgICAqIEhlbmNlLCBwU3RlcmVvT3V0IGlzIHBvaW50ZWQgdG8gdXNlIHVudXNlZCB0aGlyZCBwb3J0aW9uIG9mIHNjcmF0Y2ggbWVtb3J5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwU3RlcmVvT3V0ID0gKExWTV9GTE9BVCopcEluc3RhbmNlLT5wU2NyYXRjaCArICgoTFZDU19TQ1JBVENIQlVGRkVSUyAtIDQpICogTnJGcmFtZXMpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcFN0ZXJlb091dCA9IHBPdXREYXRhOwogICAgICAgICB9CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCiAgICAgICAgICAqLwotICAgICAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMpOwotI2Vsc2UKLSAgICAgICAgICAgIGVyciA9IExWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbmRpZgorICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLCBwSW5EYXRhLCBwU3RlcmVvT3V0LCBOckZyYW1lcyk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKICAgICAgICAgICovCi0gICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQotICAgICAgICB7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSAmJgorICAgICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKSkgewogICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4gPSBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbjsKICAgICAgICAgICAgIExWTV9GTE9BVCBDdXJyZW50MTsKIAogICAgICAgICAgICAgQ3VycmVudDEgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwotICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKCAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbiAgKiAoQ3VycmVudDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcEZ1bGwgKiAoQ3VycmVudDEpKSkpOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gKiAoQ3VycmVudDEpKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcEZ1bGwgKiAoQ3VycmVudDEpKSkpOwogCi0gICAgICAgICAgICBpZihOdW1TYW1wbGVzIDwgTFZDU19DT01QR0FJTkZSQU1FKQotICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTnJGcmFtZXMpKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTnVtU2FtcGxlcykpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBHYWluU3RlcDsKLSAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEZpbmFsR2FpbjsKLSAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcE91dFB0cjsKKyAgICAgICAgICAgIGlmIChOdW1TYW1wbGVzIDwgTFZDU19DT01QR0FJTkZSQU1FKSB7CisgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ZXJlb091dCwgcFN0ZXJlb091dCwgKExWTV9JTlQzMilkZXN0TnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCBHYWluU3RlcDsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgRmluYWxHYWluOworICAgICAgICAgICAgICAgIExWTV9JTlQxNiBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOworICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dFB0cjsKIAogICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAogICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KIAotICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ09NUEdBSU5GUkFNRSkgLyBOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fRkxPQVQpKCgoR2FpbiAtIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIExWQ1NfQ09NUEdBSU5GUkFNRSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7CiAKLSAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpIHsKICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID4gR2FpbikpCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IC0xOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKICAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwU3RlcmVvT3V0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBwT3V0UHRyID0gcE91dERhdGE7Ci0jZW5kaWYKIAotICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChTYW1wbGVUb1Byb2Nlc3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShHYWluICsgR2FpblN0ZXApOwotICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKQotICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQotICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoR2FpblN0ZXAgPCAwKSAmJiAoRmluYWxHYWluID4gR2FpbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSBGaW5hbEdhaW47CiAgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZihTYW1wbGVUb1Byb2Nlc3MgPiBMVkNTX0NPTVBHQUlORlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBMVkNTX0NPTVBHQUlORlJBTUUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIgKz0gKDIgKiBMVkNTX0NPTVBHQUlORlJBTUUpOworICAgICAgICAgICAgICAgICAgICBpZiAoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsIHBPdXRQdHIsIGNvbXBHYWluSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSBjb21wR2FpbkludGVydmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoU2FtcGxlVG9Qcm9jZXNzIC0gTFZDU19DT01QR0FJTkZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBTYW1wbGVUb1Byb2Nlc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwgcE91dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxzID09IEZDQ18xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKExWTV9JTlQzMikoU2FtcGxlVG9Qcm9jZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKExWTV9JTlQzMikoRkNDXzIgKiBTYW1wbGVUb1Byb2Nlc3MpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMzc0LDU3ICsyNzksMzMgQEAKICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKICAgICAgICAgfQogCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpewotCisgICAgICAgIGlmIChwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUmUtaW5pdCBieXBhc3MgbWl4IHdoZW4gdGltZXIgaGFzIGNvbXBsZXRlZAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkgJiYKLSAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPT0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gTFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKyAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLCAmcEluc3RhbmNlLT5QYXJhbXMpOwogCi0gICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBMVkNTX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgTFZNX1RpbWVyICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMVk1fVGltZXIoJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ZXJlb091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCi0gICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENvcHlfRmxvYXRfU3RlcmVvX01jKHBJbkRhdGEsIChjb25zdCBMVk1fRkxPQVQqKXBTdGVyZW9PdXQsIHBPdXREYXRhLCBOckZyYW1lcywgY2hhbm5lbHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KLSNlbHNlCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0jZW5kaWYKKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCopcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShjaGFubmVscyAqIE5yRnJhbWVzKSk7IC8qIEFsbCBDaGFubmVscyovCiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCmluZGV4IGQwZTZlMDkuLmRlMjNkMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCkBAIC0yMCw3ICsyMCw4IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJMVkNTLmgiCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIKQEAgLTU3LDMxICs1OCwxOSBAQAogLyogIDIuICBUaGUgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlsdGVyIGFyZSBuZWdhdGVkIHRvIGNhdXNlIGFuIGludmVyc2lvbi4gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIERlbGF5OwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHM7Ci0gICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgIENvZWZmczsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAqcFJldmVyYkNvZWZUYWJsZTsKLQotICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLQotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcykgeworICAgIExWTV9VSU5UMTYgRGVsYXk7CisgICAgTFZNX1VJTlQxNiBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCogcENvbmZpZyA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90KikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqIHBSZXZlcmJDb2VmVGFibGU7CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgogICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAogICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKICAgICAgKi8KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KIAogICAgIHsKICAgICAgICAgLyoKQEAgLTg5LDU5ICs3OCwzNiBAQAogICAgICAgICAgKi8KICAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07CiAKLSAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplICAgICAgPSAoTFZNX0lOVDE2KSgyICogRGVsYXkpOwotICAgICAgICBwQ29uZmlnLT5EZWxheU9mZnNldCAgICA9IDA7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBDb25maWctPlN0ZXJlb1NhbXBsZXMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplID0KKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+TnJDaGFubmVscyA9PSBGQ0NfMSkgPyAoTFZNX0lOVDE2KURlbGF5IDogKExWTV9JTlQxNikoRkNDXzIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ID0gMDsKKyAgICAgICAgbWVtc2V0KHBDb25maWctPlN0ZXJlb1NhbXBsZXMsIDAsIHNpemVvZihwQ29uZmlnLT5TdGVyZW9TYW1wbGVzKSk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldHVwIHRoZSBmaWx0ZXJzCiAgICAgICAgICAqLwogICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOwogICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1JldmVyYkNvZWZUYWJsZVswXTsKIAotICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCi0gICAgICAgIENvZWZmcy5BMCA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTI7Ci0gICAgICAgIENvZWZmcy5CMSA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMTsKLSAgICAgICAgQ29lZmZzLkIyID0gKExWTV9GTE9BVCktcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkIyOwotCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0KLSAgICAgICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOwotCi0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPiBjb2VmcyA9IHsKKyAgICAgICAgICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTAsIHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMSwKKyAgICAgICAgICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTIsIHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMSwKKyAgICAgICAgICAgICAgICBwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjJ9OworICAgICAgICBwSW5zdGFuY2UtPnBSZXZCaXF1YWQucmVzZXQobmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPigKKyAgICAgICAgICAgICAgICAocFBhcmFtcy0+TnJDaGFubmVscyA9PSBGQ0NfMSkgPyBGQ0NfMSA6IEZDQ18yLCBjb2VmcykpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldHVwIHRoZSBtaXhlcgogICAgICAgICAgKi8KICAgICAgICAgcENvbmZpZy0+UHJvY0dhaW4gPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlBST0MpOwotICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluICA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKKyAgICAgICAgcENvbmZpZy0+VW5wcm9jR2FpbiA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKICAgICB9CiAKLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiAgIFJldmVyYlBlcmNlbnRhZ2UgPSA4Mzg4NjsgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkgeworICAgICAgICBMVk1fSU5UMzIgUmV2ZXJiUGVyY2VudGFnZSA9IDgzODg2OyAgICAgICAgLy8gMSBQZXJjZW50IFJldmVyYiBpLmUgMS8xMDAgaW4gUSAyMyBmb3JtYXQKICAgICAgICAgUmV2ZXJiUGVyY2VudGFnZSAqPSBwUGFyYW1zLT5SZXZlcmJMZXZlbDsgIC8vIEFjdHVhbCBSZXZlcmIgTGV2ZWwgaW4gUSAyMyBmb3JtYXQKLSAgICAgICAgcENvbmZpZy0+UmV2ZXJiTGV2ZWwgPSAoKExWTV9GTE9BVCkoUmV2ZXJiUGVyY2VudGFnZT4+OCkpIC8gMzI3NjcuMGY7CisgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsID0gKChMVk1fRkxPQVQpKFJldmVyYlBlcmNlbnRhZ2UgPj4gOCkpIC8gMzI3NjcuMGY7CiAgICAgfQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTgxLDQ2ICsxNDcsMzggQEAKIC8qICAyLiAgVGhlIEdhaW4gaXMgY29tYmluZWQgd2l0aCB0aGUgTFBGIGFuZCBpbmNvcnBvcmF0ZWQgaW4gdG8gdGhlIGNvZWZmaWNpZW50cyAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCi17CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7CisgICAgTFZDU19JbnN0YW5jZV90KiBwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90KiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCogcENvbmZpZyA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90KikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CisgICAgTFZNX0lOVDMyIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyAgICBMVk1fVUlOVDE2IGRlc3ROdW1TYW1wbGVzID0KKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID09IEZDQ18xKSA/IE51bVNhbXBsZXMgOiBGQ0NfMiAqIE51bVNhbXBsZXM7CiAKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKLSAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBJbnN0YW5jZS0+cFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBpbiBvdXRwbGFjZSBwcm9jZXNzaW5nCiAgICAgICovCi0gICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCi0gICAgeworICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFJldmVyYiBub3QgcmVxdWlyZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCiAgICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbkRhdGEsICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KWRlc3ROdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwogICAgIH0KIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHJldmVyYiBpcyByZXF1aXJlZAogICAgICAqLwogICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLwotICAgIGlmICgoKChMVkNTX091dHB1dERldmljZV9lbilwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgXAorICAgIGlmICgoKChMVkNTX091dHB1dERldmljZV9lbilwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwKICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0VYX0hFQURQSE9ORVMpIHx8Ci0gICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IExWQ1NfU1RFUkVPKSkgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCi0gICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPTApKQotICAgIHsKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAmJgorICAgICAgICAvKiBGb3IgdmFsaWRhdGlvbiB0ZXN0aW5nICovCisgICAgICAgICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfUkVWRVJCU1dJVENIKSAhPSAwKSkgewogICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjMwLDM0ICsxODgsMjQgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSB0aGUgaW5wdXQgZGF0YSB0byB0aGUgc2NyYXRjaCBtZW1vcnkKICAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcEluRGF0YSwgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpZGVzdE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAKICAgICAgICAgLyoKICAgICAgICAgICogRmlsdGVyIHRoZSBkYXRhCiAgICAgICAgICAqLwotICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cFJldkJpcXVhZC0+cHJvY2VzcyhwU2NyYXRjaCwgcFNjcmF0Y2gsIE51bVNhbXBsZXMpOwogCi0gICAgICAgIE11bHQzc19GbG9hdCggKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICBNdWx0M3NfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsIHBDb25maWctPlJldmVyYkxldmVsLCAoTFZNX0ZMT0FUKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpZGVzdE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgdGhlIGRlbGF5IG1peAogICAgICAgICAgKi8KLSAgICAgICAgRGVsYXlNaXhfRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcENvbmZpZy0+RGVsYXlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPkRlbGF5T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCisgICAgICAgIERlbGF5TWl4X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAmcENvbmZpZy0+U3RlcmVvU2FtcGxlc1swXSwgcENvbmZpZy0+RGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgJnBDb25maWctPkRlbGF5T2Zmc2V0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMsIE51bUNoYW5uZWxzKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKaW5kZXggMWJjNDMzOC4uMDQ5ZWVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaApAQCAtMzIsOCArMzIsOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgICAgIEhFQURQSE9ORUdBSU5QUk9DICAgICAgICAgICBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTgotI2RlZmluZSAgICAgSEVBRFBIT05FR0FJTlVOUFJPQyAgICAgICAgIExWQ1NfSEVBRFBIT05FX1VOUFJPQ0dBSU4KKyNkZWZpbmUgSEVBRFBIT05FR0FJTlBST0MgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4KKyNkZWZpbmUgSEVBRFBIT05FR0FJTlVOUFJPQyBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIsMjAgKzQyLDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBSZXZlcmJlcmF0aW9uIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0KK3R5cGVkZWYgc3RydWN0IHsKICAgICAvKiBTdGVyZW8gZGVsYXkgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgRGVsYXlTaXplOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBEZWxheU9mZnNldDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUHJvY0dhaW47Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIFVucHJvY0dhaW47Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CisgICAgTFZNX0lOVDE2IERlbGF5U2l6ZTsKKyAgICBMVk1fSU5UMTYgRGVsYXlPZmZzZXQ7CisgICAgTFZNX0lOVDE2IFByb2NHYWluOworICAgIExWTV9JTlQxNiBVbnByb2NHYWluOworICAgIExWTV9GTE9BVCBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTX01BWF9WQUxdOwogICAgIC8qIFJldmVyYiBMZXZlbCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsKLSAgICAvKiBGaWx0ZXIgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKKyAgICBMVk1fRkxPQVQgUmV2ZXJiTGV2ZWw7CiB9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC02NCwxMSArNTksOCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAqcFBhcmFtcyk7Ci1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIGNvbnN0IExWTV9GTE9BVCogcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiBwT3V0cHV0LCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIFJFVkVSQl9IICovCisjZW5kaWYgLyogUkVWRVJCX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCmluZGV4IDdmZDg0NDQuLjNjYTI1ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlICJMVkNTLmgiCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19TdGVyZW9FbmhhbmNlci5oIgpAQCAtNDksOTYgKzUwLDM5IEBACiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKLSAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKLSAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOwotCi0gICAgcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCBoSW5zdGFuY2UsIExWQ1NfUGFyYW1zX3QqIHBQYXJhbXMpIHsKKyAgICBMVk1fVUlOVDE2IE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QqIHBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QqKWhJbnN0YW5jZTsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90KiBwU0VTaWRlQ29lZnM7CiAKICAgICAvKgogICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdXBkYXRlIHRoZSBmaWx0ZXJzCiAgICAgICovCiAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgeworICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUKICAgICAgICAgICovCiAgICAgICAgIC8qIE1pZCBmaWx0ZXIgKi8KICAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKIAotICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCi0gICAgICAgIENvZWZmc01pZC5BMCA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzTWlkLkExID0gKExWTV9GTE9BVCkgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkExOwotICAgICAgICBDb2VmZnNNaWQuQjEgPSAoTFZNX0ZMT0FUKS1MVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQjE7Ci0KLSAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwotCi0gICAgICAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzTWlkKTsKLQotICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgaWYoTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLlNjYWxlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOwotICAgICAgICB9CisgICAgICAgIHN0ZDo6YXJyYXk8TFZNX0ZMT0FULCBhbmRyb2lkOjphdWRpb191dGlsczo6a0JpcXVhZE51bUNvZWZzPiBjb2VmcyA9IHsKKyAgICAgICAgICAgICAgICBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTAsIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMSwgMC4wLAorICAgICAgICAgICAgICAgIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMSwgMC4wfTsKKyAgICAgICAgcEluc3RhbmNlLT5wU0VNaWRCaXF1YWQucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihGQ0NfMSwgY29lZnMpKTsKIAogICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7CiAgICAgICAgIHBTRVNpZGVDb2VmcyA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19TRVNpZGVDb2VmVGFibGVbMF07CiAKICAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOwotICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7Ci0gICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKLQotICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLCAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKLQotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOwotCi0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQorICAgICAgICBjb2VmcyA9IHtwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMCwgcFNFU2lkZUNvZWZzW09mZnNldF0uQTEsIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyLAorICAgICAgICAgICAgICAgICBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMSwgcFNFU2lkZUNvZWZzW09mZnNldF0uQjJ9OworICAgICAgICBwSW5zdGFuY2UtPnBTRVNpZGVCaXF1YWQucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OmF1ZGlvX3V0aWxzOjpCaXF1YWRGaWx0ZXI8TFZNX0ZMT0FUPihGQ0NfMSwgY29lZnMpKTsKICAgICB9CiAKLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKKyAgICByZXR1cm4gKExWQ1NfU1VDQ0VTUyk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE3OCw4NSArMTIyLDY3IEBACiAvKiAgMS4gIFRoZSBzaWRlIGZpbHRlciBpcyBub3QgdXNlZCBpbiBNb2JpbGUgU3BlYWtlciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgaEluc3RhbmNlLCBjb25zdCBMVk1fRkxPQVQqIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCogcE91dERhdGEsIExWTV9VSU5UMTYgTnVtU2FtcGxlcykgeworICAgIExWQ1NfSW5zdGFuY2VfdCogcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCopaEluc3RhbmNlOworICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCogcENvbmZpZyA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOworICAgIExWTV9GTE9BVCogcFNjcmF0Y2g7CisgICAgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUKilwSW5zdGFuY2UtPnBTY3JhdGNoOworICAgIExWTV9JTlQzMiBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisgICAgTFZNX1VJTlQxNiBkZXN0TnVtU2FtcGxlcyA9IChOdW1DaGFubmVscyA9PSBGQ0NfMSkgPyBOdW1TYW1wbGVzIDogRkNDXzIgKiBOdW1TYW1wbGVzOwogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCiAgICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQotICAgICAgICB7CisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCiAgICAgICAgICAqLwotICAgICAgICBGcm9tMmlUb01TX0Zsb2F0KHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChOdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICAvLyBDb3B5IHNhbWUgaW5wdXQgdG8gc2NyYXRjaCBhcyBNaWRkbGUgZGF0YQorICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwSW5EYXRhLCAoTFZNX0ZMT0FUKilwU2NyYXRjaCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZyb20yaVRvTVNfRmxvYXQocEluRGF0YSwgcFNjcmF0Y2gsIHBTY3JhdGNoICsgTnVtU2FtcGxlcywgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQotICAgICAgICB7Ci0gICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KilcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwQ29uZmlnLT5NaWRHYWluLCAgICAgIC8qIEdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wU0VNaWRCaXF1YWQtPnByb2Nlc3MocFNjcmF0Y2gsIHBTY3JhdGNoLCBOdW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE11bHQzc19GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcENvbmZpZy0+TWlkR2FpbiwgLyogR2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCiAgICAgICAgIH0KIAogICAgICAgICAvKgogICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyIHRoZSBzaWRlIHNpZ25hbCBvbmx5IGluIHN0ZXJlbyBtb2RlIGZvciBoZWFkcGhvbmVzCiAgICAgICAgICAqIGFuZCBpbiBhbGwgbW9kZXMgZm9yIG1vYmlsZSBzcGVha2VycwogICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVkNTX1NURVJFTykKLSAgICAgICAgewotICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVkNTX1NURVJFTykgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wU0VTaWRlQmlxdWFkLT5wcm9jZXNzKHBTY3JhdGNoICsgTnVtU2FtcGxlcywgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBmcm9tIG1pZGRsZSBhbmQgc2lkZSB0byBzdGVyZW8KLSAgICAgICAgICovCi0gICAgICAgIE1TVG8yaV9TYXRfRmxvYXQocFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIGlmIChOdW1DaGFubmVscyA9PSAxKSB7CisgICAgICAgICAgICAvLyBDb3B5IHByb2Nlc3NlZCBNaWRkbGUgZGF0YSBmcm9tIHNjcmF0Y2ggdG8gcE91dERhdGEKKyAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopcFNjcmF0Y2gsIChMVk1fRkxPQVQqKXBPdXREYXRhLCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvbnZlcnQgZnJvbSBtaWRkbGUgYW5kIHNpZGUgdG8gc3RlcmVvCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE1TVG8yaV9TYXRfRmxvYXQocFNjcmF0Y2gsIHBTY3JhdGNoICsgTnVtU2FtcGxlcywgcE91dERhdGEsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIH0KIAotICAgIH0KLSAgICBlbHNlCi0gICAgeworICAgIH0gZWxzZSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCiAgICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBJbkRhdGEsICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KWRlc3ROdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwogICAgIH0KIAotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworICAgIHJldHVybiAoTFZDU19TVUNDRVNTKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKaW5kZXggMTJhNTk4Mi4uMGJlZDU5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmgKQEAgLTI0LDggKzI0LDggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkxWQ1NfSGVhZHBob25lX0NvZWZmcy5oIiAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNSwyMSArMzUsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogU3RlcmVvIGVuaGFuY2VyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIC8qCi0gICAgICogTWlkZGxlIGZpbHRlcgotICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUKiwgTFZNX0ZMT0FUKiwgTFZNX0lOVDE2KTsKLQotICAgIC8qCi0gICAgICogU2lkZSBmaWx0ZXIKLSAgICAgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFZNX0ZMT0FUIE1pZEdhaW47IC8qIE1pZGRsZSBnYWluIGluIG1vYmlsZSBzcGVha2VyIG1vZGUgKi8KIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTgsMTIgKzQ1LDkgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKTsKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU0VuaGFuY2VySW5pdChMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgTFZDU19QYXJhbXNfdCogcFBhcmFtcyk7CiAKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90IGhJbnN0YW5jZSwgY29uc3QgTFZNX0ZMT0FUKiBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqIHBPdXREYXRhLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpOwogCi0jZW5kaWYgIC8qIFNURVJFT0VOSEFOQ0VfSCAqLworI2VuZGlmIC8qIFNURVJFT0VOSEFOQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcAppbmRleCBkNzlkYjYxLi41NWI1MjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcApAQCAtMjMsOSArMjMsOSBAQAogCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKLSNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmlxdWFkIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisjaW5jbHVkZSAiRmlsdGVycy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlICJMVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCIgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM1LDE0NCArMzUsNzUgQEAKIAogLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBtaWRkbGUgZmlsdGVyICovCiBjb25zdCBCaXF1YWRBMDFCMUNvZWZzU1BfdCBMVkNTX1NFTWlkQ29lZlRhYmxlW10gPSB7Ci0gICAge0NTX01JRERMRV84MDAwX0EwLCAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfODAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzgwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfODAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xMTAyNV9BMCwgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzExMDI1X0ExLAotICAgICBDU19NSURETEVfMTEwMjVfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTEwMjVfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTIwMDBfQTAsICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xMjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzEyMDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTYwMDBfQTEsCi0gICAgIENTX01JRERMRV8xNjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xNjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8yMjA1MF9BMCwgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzIyMDUwX0ExLAotICAgICBDU19NSURETEVfMjIwNTBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjIwNTBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMjQwMDBfQTAsICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8yNDAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzI0MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMzIwMDBfQTEsCi0gICAgIENTX01JRERMRV8zMjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8zMjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV80NDEwMF9BMCwgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLAotICAgICBDU19NSURETEVfNDQxMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDQxMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfNDgwMDBfQTAsICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV80ODAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzQ4MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ4MDAwX1NDQUxFfQotICAgICwKLSAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfODgyMDBfQTEsCi0gICAgIENTX01JRERMRV84ODIwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzk2MDAwX0EwLCAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfOTYwMDBfQTEsCi0gICAgIENTX01JRERMRV85NjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xNzY0MDBfQTAsICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTc2NDAwX0ExLAotICAgICBDU19NSURETEVfMTc2NDAwX0IxLAotICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfMTc2NDAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzE5MjAwMF9BMCwgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xOTIwMDBfQTEsCi0gICAgIENTX01JRERMRV8xOTIwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTkyMDAwX1NDQUxFfQotICAgIH07CisgICAgICAgIHtDU19NSURETEVfODAwMF9BMCwgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfODAwMF9BMSwgQ1NfTUlERExFXzgwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8xMTAyNV9BMCwgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzExMDI1X0ExLCBDU19NSURETEVfMTEwMjVfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8xMjAwMF9BMSwgQ1NfTUlERExFXzEyMDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMTIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMTYwMDBfQTEsIENTX01JRERMRV8xNjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV8yMjA1MF9BMCwgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzIyMDUwX0ExLCBDU19NSURETEVfMjIwNTBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV8yNDAwMF9BMSwgQ1NfTUlERExFXzI0MDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfMjQwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfMzIwMDBfQTEsIENTX01JRERMRV8zMjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV80NDEwMF9BMCwgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzQ0MTAwX0ExLCBDU19NSURETEVfNDQxMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX01JRERMRV80ODAwMF9BMSwgQ1NfTUlERExFXzQ4MDAwX0IxLCAoTFZNX1VJTlQxNilDU19NSURETEVfNDgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfTUlERExFXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19NSURETEVfODgyMDBfQTEsIENTX01JRERMRV84ODIwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTX01JRERMRV85NjAwMF9BMCwgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzk2MDAwX0ExLCBDU19NSURETEVfOTYwMDBfQjEsIChMVk1fVUlOVDE2KUNTX01JRERMRV85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzE3NjQwMF9BMSwgQ1NfTUlERExFXzE3NjQwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwgQ1NfTUlERExFXzE5MjAwMF9CMSwgKExWTV9VSU5UMTYpQ1NfTUlERExFXzE5MjAwMF9TQ0FMRX19OwogCiAvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIHNpZGUgZmlsdGVyICovCiBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfU0VTaWRlQ29lZlRhYmxlW10gPSB7Ci0gICAgLyogSGVhZHBob25lIFNpZGUgY29lZmZpY2llbnRzICovCi0gICAge0NTX1NJREVfODAwMF9BMCwgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzgwMDBfQTEsCi0gICAgIENTX1NJREVfODAwMF9BMiwKLSAgICAgQ1NfU0lERV84MDAwX0IxLAotICAgICBDU19TSURFXzgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzgwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzExMDI1X0EwLCAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTEwMjVfQTEsCi0gICAgIENTX1NJREVfMTEwMjVfQTIsCi0gICAgIENTX1NJREVfMTEwMjVfQjEsCi0gICAgIENTX1NJREVfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfU0lERV8xMjAwMF9BMCwgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzEyMDAwX0ExLAotICAgICBDU19TSURFXzEyMDAwX0EyLAotICAgICBDU19TSURFXzEyMDAwX0IxLAotICAgICBDU19TSURFXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTYwMDBfQTAsICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xNjAwMF9BMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9BMiwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTYwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzIyMDUwX0EwLCAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMjIwNTBfQTEsCi0gICAgIENTX1NJREVfMjIwNTBfQTIsCi0gICAgIENTX1NJREVfMjIwNTBfQjEsCi0gICAgIENTX1NJREVfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8yNDAwMF9BMCwgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzI0MDAwX0ExLAotICAgICBDU19TSURFXzI0MDAwX0EyLAotICAgICBDU19TSURFXzI0MDAwX0IxLAotICAgICBDU19TSURFXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMzIwMDBfQTAsICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8zMjAwMF9BMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9BMiwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMzIwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzQ0MTAwX0EwLCAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfNDQxMDBfQTEsCi0gICAgIENTX1NJREVfNDQxMDBfQTIsCi0gICAgIENTX1NJREVfNDQxMDBfQjEsCi0gICAgIENTX1NJREVfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV80ODAwMF9BMCwgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzQ4MDAwX0ExLAotICAgICBDU19TSURFXzQ4MDAwX0EyLAotICAgICBDU19TSURFXzQ4MDAwX0IxLAotICAgICBDU19TSURFXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KLSAgICAgLAotICAgIHtDU19TSURFXzg4MjAwX0EwLCAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfODgyMDBfQTEsCi0gICAgIENTX1NJREVfODgyMDBfQTIsCi0gICAgIENTX1NJREVfODgyMDBfQjEsCi0gICAgIENTX1NJREVfODgyMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODgyMDBfU0NBTEV9LAotICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzk2MDAwX0ExLAotICAgICBDU19TSURFXzk2MDAwX0EyLAotICAgICBDU19TSURFXzk2MDAwX0IxLAotICAgICBDU19TSURFXzk2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTc2NDAwX0EwLCAgICAgICAgICAvKjE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTc2NDAwX0ExLAotICAgICBDU19TSURFXzE3NjQwMF9BMiwKLSAgICAgQ1NfU0lERV8xNzY0MDBfQjEsCi0gICAgIENTX1NJREVfMTc2NDAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCi0gICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCi0gICAgIENTX1NJREVfMTkyMDAwX0EyLAotICAgICBDU19TSURFXzE5MjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KLX07CisgICAgICAgIC8qIEhlYWRwaG9uZSBTaWRlIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7Q1NfU0lERV84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfODAwMF9BMSwgQ1NfU0lERV84MDAwX0EyLCBDU19TSURFXzgwMDBfQjEsIENTX1NJREVfODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzExMDI1X0ExLCBDU19TSURFXzExMDI1X0EyLCBDU19TSURFXzExMDI1X0IxLCBDU19TSURFXzExMDI1X0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzEyMDAwX0ExLCBDU19TSURFXzEyMDAwX0EyLCBDU19TSURFXzEyMDAwX0IxLCBDU19TSURFXzEyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzE2MDAwX0ExLCBDU19TSURFXzE2MDAwX0EyLCBDU19TSURFXzE2MDAwX0IxLCBDU19TSURFXzE2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xNjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzIyMDUwX0ExLCBDU19TSURFXzIyMDUwX0EyLCBDU19TSURFXzIyMDUwX0IxLCBDU19TSURFXzIyMDUwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzI0MDAwX0ExLCBDU19TSURFXzI0MDAwX0EyLCBDU19TSURFXzI0MDAwX0IxLCBDU19TSURFXzI0MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzMyMDAwX0ExLCBDU19TSURFXzMyMDAwX0EyLCBDU19TSURFXzMyMDAwX0IxLCBDU19TSURFXzMyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8zMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzQ0MTAwX0ExLCBDU19TSURFXzQ0MTAwX0EyLCBDU19TSURFXzQ0MTAwX0IxLCBDU19TSURFXzQ0MTAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzQ4MDAwX0ExLCBDU19TSURFXzQ4MDAwX0EyLCBDU19TSURFXzQ4MDAwX0IxLCBDU19TSURFXzQ4MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzg4MjAwX0ExLCBDU19TSURFXzg4MjAwX0EyLCBDU19TSURFXzg4MjAwX0IxLCBDU19TSURFXzg4MjAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19TSURFXzk2MDAwX0ExLCBDU19TSURFXzk2MDAwX0EyLCBDU19TSURFXzk2MDAwX0IxLCBDU19TSURFXzk2MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE3NjQwMF9BMCwgLyoxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfU0lERV8xNzY0MDBfQTEsIENTX1NJREVfMTc2NDAwX0EyLCBDU19TSURFXzE3NjQwMF9CMSwgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19TSURFXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU19TSURFXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1NJREVfMTkyMDAwX0ExLCBDU19TSURFXzE5MjAwMF9BMiwgQ1NfU0lERV8xOTIwMDBfQjEsIENTX1NJREVfMTkyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xOTIwMDBfU0NBTEV9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODEsMTY3ICsxMTIsODcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19FcXVhbGlzZXJDb2VmVGFibGVbXSA9IHsKLSAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCi0gICAge0NTX0VRVUFMSVNFUl84MDAwX0EwLCAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfODAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzExMDI1X0EwLCAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0IxLAotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTIwMDBfQTAsICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMTIwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xNjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzIyMDUwX0EwLCAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0IxLAotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMjQwMDBfQTAsICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMjQwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8zMjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzQ0MTAwX0EwLCAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0IxLAotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfNDgwMDBfQTAsICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl84ODIwMF9BMCwgICAgIC8qIDg4a1MvcyBjb2VmZmllaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0ExLAotICAgICBDU19FUVVBTElTRVJfODgyMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfODgyMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfOTYwMDBfQTAsICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0EyLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMTc2NDAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKKyAgICAgICAgLyogSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLworICAgICAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQTEsIENTX0VRVUFMSVNFUl84MDAwX0EyLCBDU19FUVVBTElTRVJfODAwMF9CMSwgQ1NfRVFVQUxJU0VSXzgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLCBDU19FUVVBTElTRVJfMTEwMjVfQjEsIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTIwMDBfQTAsIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzEyMDAwX0EyLCBDU19FUVVBTElTRVJfMTIwMDBfQjEsIENTX0VRVUFMSVNFUl8xMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTYwMDBfQTAsIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzE2MDAwX0EyLCBDU19FUVVBTElTRVJfMTYwMDBfQjEsIENTX0VRVUFMSVNFUl8xNjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLCBDU19FUVVBTElTRVJfMjIwNTBfQjEsIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMjQwMDBfQTAsIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9BMSwgQ1NfRVFVQUxJU0VSXzI0MDAwX0EyLCBDU19FUVVBTElTRVJfMjQwMDBfQjEsIENTX0VRVUFMSVNFUl8yNDAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMzIwMDBfQTAsIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzMyMDAwX0EyLCBDU19FUVVBTElTRVJfMzIwMDBfQjEsIENTX0VRVUFMSVNFUl8zMjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLCBDU19FUVVBTElTRVJfNDQxMDBfQjEsIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfNDgwMDBfQTAsIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl80ODAwMF9BMSwgQ1NfRVFVQUxJU0VSXzQ4MDAwX0EyLCBDU19FUVVBTElTRVJfNDgwMDBfQjEsIENTX0VRVUFMSVNFUl80ODAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsIC8qIDg4a1MvcyBjb2VmZmllaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLCBDU19FUVVBTElTRVJfODgyMDBfQjEsIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfOTYwMDBfQTAsIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMSwgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyLCBDU19FUVVBTElTRVJfOTYwMDBfQjEsIENTX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCisgICAgICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAorICAgICAgICB7Q1NfRVFVQUxJU0VSXzE5MjAwMF9BMCwgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX0VRVUFMSVNFUl8xOTIwMDBfQTEsIENTX0VRVUFMSVNFUl8xOTIwMDBfQTIsIENTX0VRVUFMSVNFUl8xOTIwMDBfQjEsCisgICAgICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0IyLCAoTFZNX1VJTlQxNilDU19FUVVBTElTRVJfMTkyMDAwX1NDQUxFfSwKIAotICAgIC8qIENvbmNlcnQgU291bmQgRVggSGVhZHBob25lIGNvZWZmaWNpZW50cyAqLwotICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMCwgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCwgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCwgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMjQwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMCwgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl80NDEwMF9BMCwgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDQxMDBfU0NBTEV9LAotICAgIHtDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCwgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEV9Ci0gICAgLAotICAgIHtDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCwgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0EyLAotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl85NjAwMF9TQ0FMRX0sCi0gICAge0NTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCi0gICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0ExLAotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfMTkyMDAwX1NDQUxFfQotfTsKKyAgICAgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAgICAgIHtDU0VYX0VRVUFMSVNFUl84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEsIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IyLCAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSwgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIsIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSwgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIsIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSwgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIsIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICAgICAge0NTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLCBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjIsIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCisgICAgICAgIHtDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IyLCAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTAsMjAgKzIwMSwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogU3RlcmVvIGRlbGF5IHRhYmxlIGZvciBDb25jZXJ0IFNvdW5kICovCi1jb25zdCBMVk1fVUlOVDE2ICAgIExWQ1NfU3RlcmVvRGVsYXlDU1tdID0gewotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorY29uc3QgTFZNX1VJTlQxNiBMVkNTX1N0ZXJlb0RlbGF5Q1NbXSA9IHsKKyAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU184S0haLCAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTFLSFosIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFosCisgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFosICBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haLCBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAorICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haLCAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiwKKyAgICAgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFosIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiwKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zNzMsODcgKzIxNiw0NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1JldmVyYkNvZWZUYWJsZVtdID0gewotICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NfUkVWRVJCXzgwMDBfQTAsICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfODAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzgwMDBfQTIsCi0gICAgIENTX1JFVkVSQl84MDAwX0IxLAotICAgICBDU19SRVZFUkJfODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl84MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzExMDI1X0EwLCAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzExMDI1X0ExLAotICAgICBDU19SRVZFUkJfMTEwMjVfQTIsCi0gICAgIENTX1JFVkVSQl8xMTAyNV9CMSwKLSAgICAgQ1NfUkVWRVJCXzExMDI1X0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzEyMDAwX0EwLCAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMTIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xMjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzE2MDAwX0EwLCAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0ExLAotICAgICBDU19SRVZFUkJfMTYwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xNjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzIyMDUwX0EwLCAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0ExLAotICAgICBDU19SRVZFUkJfMjIwNTBfQTIsCi0gICAgIENTX1JFVkVSQl8yMjA1MF9CMSwKLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzI0MDAwX0EwLCAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0ExLAotICAgICBDU19SRVZFUkJfMjQwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8yNDAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzMyMDAwX0EwLCAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMzIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8zMjAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzQ0MTAwX0EwLCAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0ExLAotICAgICBDU19SRVZFUkJfNDQxMDBfQTIsCi0gICAgIENTX1JFVkVSQl80NDEwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfUkVWRVJCXzQ4MDAwX0EwLCAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0ExLAotICAgICBDU19SRVZFUkJfNDgwMDBfQTIsCi0gICAgIENTX1JFVkVSQl80ODAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQotICAgICwKLSAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAotICAgICBDU19SRVZFUkJfODgyMDBfQTIsCi0gICAgIENTX1JFVkVSQl84ODIwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAotICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCi0gICAgIENTX1JFVkVSQl85NjAwMF9BMiwKLSAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAotICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAotICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCi0gICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCi0gICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAotICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0IxLAotICAgICBDU19SRVZFUkJfMTkyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX0KLX07CisgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICAgICAge0NTX1JFVkVSQl84MDAwX0EwLCAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl84MDAwX0ExLCBDU19SRVZFUkJfODAwMF9BMiwgQ1NfUkVWRVJCXzgwMDBfQjEsIENTX1JFVkVSQl84MDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzExMDI1X0EwLCAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTEwMjVfQTEsIENTX1JFVkVSQl8xMTAyNV9BMiwgQ1NfUkVWRVJCXzExMDI1X0IxLCBDU19SRVZFUkJfMTEwMjVfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTEwMjVfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzEyMDAwX0EwLCAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTIwMDBfQTEsIENTX1JFVkVSQl8xMjAwMF9BMiwgQ1NfUkVWRVJCXzEyMDAwX0IxLCBDU19SRVZFUkJfMTIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzE2MDAwX0EwLCAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTYwMDBfQTEsIENTX1JFVkVSQl8xNjAwMF9BMiwgQ1NfUkVWRVJCXzE2MDAwX0IxLCBDU19SRVZFUkJfMTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzIyMDUwX0EwLCAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMjIwNTBfQTEsIENTX1JFVkVSQl8yMjA1MF9BMiwgQ1NfUkVWRVJCXzIyMDUwX0IxLCBDU19SRVZFUkJfMjIwNTBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMjIwNTBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzI0MDAwX0EwLCAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMjQwMDBfQTEsIENTX1JFVkVSQl8yNDAwMF9BMiwgQ1NfUkVWRVJCXzI0MDAwX0IxLCBDU19SRVZFUkJfMjQwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMjQwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzMyMDAwX0EwLCAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMzIwMDBfQTEsIENTX1JFVkVSQl8zMjAwMF9BMiwgQ1NfUkVWRVJCXzMyMDAwX0IxLCBDU19SRVZFUkJfMzIwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMzIwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzQ0MTAwX0EwLCAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfNDQxMDBfQTEsIENTX1JFVkVSQl80NDEwMF9BMiwgQ1NfUkVWRVJCXzQ0MTAwX0IxLCBDU19SRVZFUkJfNDQxMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfNDQxMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzQ4MDAwX0EwLCAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfNDgwMDBfQTEsIENTX1JFVkVSQl80ODAwMF9BMiwgQ1NfUkVWRVJCXzQ4MDAwX0IxLCBDU19SRVZFUkJfNDgwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfNDgwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfODgyMDBfQTEsIENTX1JFVkVSQl84ODIwMF9BMiwgQ1NfUkVWRVJCXzg4MjAwX0IxLCBDU19SRVZFUkJfODgyMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfOTYwMDBfQTEsIENTX1JFVkVSQl85NjAwMF9BMiwgQ1NfUkVWRVJCXzk2MDAwX0IxLCBDU19SRVZFUkJfOTYwMDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgICAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsIENTX1JFVkVSQl8xNzY0MDBfQTIsIENTX1JFVkVSQl8xNzY0MDBfQjEsIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKKyAgICAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLCBDU19SRVZFUkJfMTkyMDAwX0EyLCBDU19SRVZFUkJfMTkyMDAwX0IxLCBDU19SRVZFUkJfMTkyMDAwX0IyLAorICAgICAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzE5MjAwMF9TQ0FMRX19OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ2MSwyMCArMjYzLDE0IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotY29uc3QgR2Fpbl90IExWQ1NfT3V0cHV0R2FpblRhYmxlW10gPSB7Ci0gICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLAotICAgICBMVkNTX0hFQURQSE9ORV9HQUlOfSwKLSAgICB7TFZDU19FWF9IRUFEUEhPTkVfU0hJRlQsICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0hFQURQSE9ORV9TSElGVCwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59Ci19OworY29uc3QgR2Fpbl90IExWQ1NfT3V0cHV0R2FpblRhYmxlW10gPSB7e0xWQ1NfSEVBRFBIT05FX1NISUZULCAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLCBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLCBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MDEsMjQgKzI5NywxNCBAQAogLyogICAgICAgICAgMTAyNCAgICBpcyAtMTJkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKLSAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9LAotICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgMC4wMDAwMDBmLAotICAgICAxLjAwMDAyNGYsCi0gICAgIDEuNDEyNjQwZn0sCi0gICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICAwLjAwMDAwMGYsCi0gICAgIDEuMDAwMDI0ZiwKLSAgICAgMS40MTI2NDBmfSwKLSAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9Ci19OworY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHt7MC40MzMzNjJmLCAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYsIDEuMDAwMDI0ZiwgMS40MTI2NDBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuNDMzMzYyZiwgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmLCAxLjAwMDAyNGYsIDEuNDEyNjQwZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxLjAwMDAwMGYsIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYsIDEuMDAwMDI0ZiwgMS40MTI2NDBmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEuMDAwMDAwZiwgLyogRVggSGVhZHBob25lLCBtb25vIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZiwgMS4wMDAwMjRmLCAxLjQxMjY0MGZ9fTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MjYsNTEgKzMxMiwzMiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZDU19WT0xfVENfRnM4MDAwICAgICAgMzI1ODAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxMTAyNSAgICAgMzI2MzIgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxNjAwMCAgICAgMzI2NzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMyMjA1MCAgICAgMzI3MDAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMzMjAwMCAgICAgMzI3MjEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KLSNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgMzI1ODAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0MjYyNjk1ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTEwMjUgMzI2MzIgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTU4NDk2MDkgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxMjAwMCAzMjY0MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwIDMyNjc0IC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3MTMxMzQ4ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMjIwNTAgMzI3MDAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTc5MjQ4MDUgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMyNDAwMCAzMjcwNSAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwIDMyNzIxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4NTY1Njc0ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzNDQxMDAgMzI3MzQgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAzMjczNyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczg4MjAwIDMyNzUxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NDgxMDY2ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzOTYwMDAgXAorICAgIDMyNzUxIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NTExNzAzICovIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE3NjQwMCAzMjc1OSAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5NzQwNDk5ICovCisjZGVmaW5lIExWQ1NfVk9MX1RDX0ZzMTkyMDAwIFwKKyAgICAzMjc2MyAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KIAotY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxM10gPSB7TFZDU19WT0xfVENfRnM4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE2MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczMyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczg4MjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTc2NDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxOTIwMDAKLX07Citjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHsKKyAgICAgICAgTFZDU19WT0xfVENfRnM4MDAwLCAgTFZDU19WT0xfVENfRnMxMTAyNSwgTFZDU19WT0xfVENfRnMxMjAwMCwgTFZDU19WT0xfVENfRnMxNjAwMCwKKyAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwgTFZDU19WT0xfVENfRnMyNDAwMCwgTFZDU19WT0xfVENfRnMzMjAwMCwgTFZDU19WT0xfVENfRnM0NDEwMCwKKyAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwgTFZDU19WT0xfVENfRnM4ODIwMCwgTFZDU19WT0xfVENfRnM5NjAwMCwgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1jb25zdCBMVk1fSU5UMzIgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVsxM10gPSB7ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCi19OworY29uc3QgTFZNX0lOVDMyIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLCAgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsICAyNDAwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKaW5kZXggNTQ5MDY5OS4uNzY2ZjVmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApAQCAtMjQsNyArMjQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpbmNsdWRlICJCSVFVQUQuaCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpcXVhZCBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAvKiBCaXF1YWQgZGVmaW5pdGlvbnMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDYsMzUgKzEwNiwzNCBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWV4dGVybiBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKK2V4dGVybiBjb25zdCBMVk1fSU5UMzIgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKIAogLypTcGVha2VyIGNvZWZmaWVudCB0YWJsZXMqLwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1NFTWlkZGxlR2FpblRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfRXF1YWxpc2VyQ29lZlRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfU21hbGxfUmV2ZXJiQ29lZlRhYmxlW10gOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1N0ZXJlb0RlbGF5Q1M0TVNbXTsKLWV4dGVybiBHYWluX3QgICAgICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9PdXRwdXRHYWluVGFibGVbXTsKLWV4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgTFZDU19NU19TbWFsbF9Wb2xDb3JyZWN0VGFibGVbXTsKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19TbWFsbF9SZXZlcmJHYWluVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfU21hbGxfU0VNaWRkbGVHYWluVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfU21hbGxfU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX1NtYWxsX0VxdWFsaXNlckNvZWZUYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19TbWFsbF9SZXZlcmJDb2VmVGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfU21hbGxfU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCBMVkNTX01TX1NtYWxsX091dHB1dEdhaW5UYWJsZVtdOworZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfTVNfU21hbGxfVm9sQ29ycmVjdFRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX1NtYWxsX1JldmVyYkdhaW5UYWJsZVtdOwogCi1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX1NFTWlkZGxlR2FpblRhYmxlW107Ci1leHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgIExWQ1NfTVNfTWVkaXVtX1NFU2lkZUNvZWZUYWJsZVtdOwotZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICBMVkNTX01TX01lZGl1bV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiQ29lZlRhYmxlW10gOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX01lZGl1bV9TdGVyZW9EZWxheUNTNE1TW107Ci1leHRlcm4gR2Fpbl90ICAgICAgICAgICAgICAgICAgIExWQ1NfTVNfTWVkaXVtX091dHB1dEdhaW5UYWJsZVtdOwotZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX01lZGl1bV9Wb2xDb3JyZWN0VGFibGVbXTsKLWV4dGVybiBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgTFZDU19NU19NZWRpdW1fUmV2ZXJiR2FpblRhYmxlW107CitleHRlcm4gTFZNX1VJTlQxNiBMVkNTX01TX01lZGl1bV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19NZWRpdW1fU0VTaWRlQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX01lZGl1bV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTWVkaXVtX1JldmVyYkNvZWZUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19NZWRpdW1fU3RlcmVvRGVsYXlDUzRNU1tdOworZXh0ZXJuIEdhaW5fdCBMVkNTX01TX01lZGl1bV9PdXRwdXRHYWluVGFibGVbXTsKK2V4dGVybiBMVkNTX1ZvbENvcnJlY3RfdCBMVkNTX01TX01lZGl1bV9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfTWVkaXVtX1JldmVyYkdhaW5UYWJsZVtdOwogCi1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU0VNaWRkbGVHYWluVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9FcXVhbGlzZXJDb2VmVGFibGVbXTsKLWV4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAgTFZDU19NU19MYXJnZV9SZXZlcmJDb2VmVGFibGVbXSA7Ci1leHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfU3RlcmVvRGVsYXlDUzRNU1tdOwotZXh0ZXJuIEdhaW5fdCAgICAgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX091dHB1dEdhaW5UYWJsZVtdOwotZXh0ZXJuIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICBMVkNTX01TX0xhcmdlX1ZvbENvcnJlY3RUYWJsZVtdOwotZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX0xhcmdlX1JldmVyYkdhaW5UYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19MYXJnZV9TRU1pZGRsZUdhaW5UYWJsZVtdOworZXh0ZXJuIEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19NU19MYXJnZV9TRVNpZGVDb2VmVGFibGVbXTsKK2V4dGVybiBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfTVNfTGFyZ2VfRXF1YWxpc2VyQ29lZlRhYmxlW107CitleHRlcm4gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX01TX0xhcmdlX1JldmVyYkNvZWZUYWJsZVtdOworZXh0ZXJuIExWTV9VSU5UMTYgTFZDU19NU19MYXJnZV9TdGVyZW9EZWxheUNTNE1TW107CitleHRlcm4gR2Fpbl90IExWQ1NfTVNfTGFyZ2VfT3V0cHV0R2FpblRhYmxlW107CitleHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19NU19MYXJnZV9Wb2xDb3JyZWN0VGFibGVbXTsKK2V4dGVybiBMVk1fVUlOVDE2IExWQ1NfTVNfTGFyZ2VfUmV2ZXJiR2FpblRhYmxlW107CiAKICNlbmRpZiAvKiBfX0xWQ1NfVEFCTEVTX0hfXyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2NzRjMjQ2Li45OTM5ZWQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw2NCBAQAogLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRWZmZWN0UmV2ZXJiVGVzdCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdFJldmVyYlRlc3QuY3BwIiwKKyAgICAgICAgIkVmZmVjdFRlc3RIZWxwZXIuY3BwIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYnJldmVyYiIsCisgICAgICAgICJsaWJyZXZlcmJ3cmFwcGVyIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRWZmZWN0QnVuZGxlVGVzdCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdEJ1bmRsZVRlc3QuY3BwIiwKKyAgICAgICAgIkVmZmVjdFRlc3RIZWxwZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJ1bmRsZXdyYXBwZXIiLAorICAgICAgICAibGlibXVzaWNidW5kbGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogImx2bXRlc3QiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKQEAgLTQ0LDYgKzEwMyw0MCBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAicmV2ZXJiX3Rlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGd0ZXN0OiBmYWxzZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYiIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicmV2ZXJiIiwKKyAgICAgICAgImxpYnJldmVyYndyYXBwZXIiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAicmV2ZXJiX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJzbnIiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9FZmZlY3RCdW5kbGVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFmZmIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0QnVuZGxlVGVzdC5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJFZmZlY3RUZXN0SGVscGVyLmgiCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gVXBkYXRlIGlzQmFzc0Jvb3N0LCBpZiB0aGUgb3JkZXIgb2YgZWZmZWN0cyBpcyB1cGRhdGVkCitjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrRWZmZWN0VXVpZHNbXSA9IHsKKyAgICAgICAgLy8gTlhQIFNXIEJhc3NCb29zdAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gTlhQIFNXIFZpcnR1YWxpemVyCisgICAgICAgIHsweDFkNDAzM2MwLCAweDg1NTcsIDB4MTFkZiwgMHg5ZjJkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgRXF1YWxpemVyCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgVm9sdW1lCisgICAgICAgIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorfTsKKworc3RhdGljIGJvb2wgaXNCYXNzQm9vc3QoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgeworICAgIC8vIFVwZGF0ZSB0aGlzLCBpZiB0aGUgb3JkZXIgb2YgZWZmZWN0cyBpbiBrRWZmZWN0VXVpZHMgaXMgdXBkYXRlZAorICAgIHJldHVybiB1dWlkID09ICZrRWZmZWN0VXVpZHNbMF07Cit9CisKK2NvbnN0ZXhwciBzaXplX3Qga051bUVmZmVjdFV1aWRzID0gc3RkOjpzaXplKGtFZmZlY3RVdWlkcyk7CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludD4gU2luZ2xlRWZmZWN0VGVzdFBhcmFtOworY2xhc3MgU2luZ2xlRWZmZWN0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2luZ2xlRWZmZWN0VGVzdFBhcmFtPiB7CisgIHB1YmxpYzoKKyAgICBTaW5nbGVFZmZlY3RUZXN0KCkKKyAgICAgICAgOiBtQ2hNYXNrKEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUNoYW5uZWxDb3VudChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoTWFzaykpLAorICAgICAgICAgIG1TYW1wbGVSYXRlKEVmZmVjdFRlc3RIZWxwZXI6OmtTYW1wbGVSYXRlc1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwyPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCisgICAgICAgICAgbVV1aWQoJmtFZmZlY3RVdWlkc1tzdGQ6OmdldDw0PihHZXRQYXJhbSgpKV0pIHt9CisKKyAgICBjb25zdCBzaXplX3QgbUNoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVNhbXBsZVJhdGU7CisgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCBtTG9vcENvdW50OworICAgIGNvbnN0IHNpemVfdCBtVG90YWxGcmFtZUNvdW50OworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworfTsKKworLy8gVGVzdHMgYXBwbHlpbmcgYSBzaW5nbGUgZWZmZWN0CitURVNUX1AoU2luZ2xlRWZmZWN0VGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgPDwgImNoTWFzazogIiA8PCBtQ2hNYXNrIDw8ICIgc2FtcGxlUmF0ZTogIiA8PCBtU2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICA8PCAiIGZyYW1lQ291bnQ6ICIgPDwgbUZyYW1lQ291bnQgPDwgIiBsb29wQ291bnQ6ICIgPDwgbUxvb3BDb3VudCk7CisKKyAgICBFZmZlY3RUZXN0SGVscGVyIGVmZmVjdChtVXVpZCwgbUNoTWFzaywgbUNoTWFzaywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtTG9vcENvdW50KTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldENvbmZpZygpKTsKKworICAgIC8vIEluaXRpYWxpemUgaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dHB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obUNoTWFzayk7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKC0xLjBmLCAxLjBmKTsKKyAgICBmb3IgKGF1dG8mIGluIDogaW5wdXQpIHsKKyAgICAgICAgaW4gPSBkaXMoZ2VuKTsKKyAgICB9CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnByb2Nlc3MoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRWZmZWN0QnVuZGxlVGVzdEFsbCwgU2luZ2xlRWZmZWN0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtQ2hNYXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bVNhbXBsZVJhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtRnJhbWVDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1Mb29wQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtRWZmZWN0VXVpZHMpKSk7CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+IFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW07CitjbGFzcyBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtPiB7CisgIHB1YmxpYzoKKyAgICBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCgpCisgICAgICAgIDogbVNhbXBsZVJhdGUoRWZmZWN0VGVzdEhlbHBlcjo6a1NhbXBsZVJhdGVzW3N0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUZyYW1lQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0ZyYW1lQ291bnRzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbUxvb3BDb3VudChFZmZlY3RUZXN0SGVscGVyOjprTG9vcENvdW50c1tzdGQ6OmdldDwyPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQobUZyYW1lQ291bnQgKiBtTG9vcENvdW50KSwKKyAgICAgICAgICBtVXVpZCgma0VmZmVjdFV1aWRzW3N0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpXSkge30KKworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7Cit9OworCisvLyBDb21wYXJlcyBmaXJzdCB0d28gY2hhbm5lbHMgaW4gbXVsdGktY2hhbm5lbCBvdXRwdXQgdG8gc3RlcmVvIG91dHB1dCB3aGVuIHNhbWUgZWZmZWN0IGlzIGFwcGxpZWQKK1RFU1RfUChTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlIDw8ICIgZnJhbWVDb3VudDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbUZyYW1lQ291bnQgPDwgIiBsb29wQ291bnQ6ICIgPDwgbUxvb3BDb3VudCk7CisKKyAgICAvLyBJbml0aWFsaXplIG1vbm8gaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtb25vSW5wdXQobVRvdGFsRnJhbWVDb3VudCk7CisKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtU2FtcGxlUmF0ZSk7CisgICAgc3RkOjp1bmlmb3JtX3JlYWxfZGlzdHJpYnV0aW9uPD4gZGlzKC0xLjBmLCAxLjBmKTsKKyAgICBmb3IgKGF1dG8mIGluIDogbW9ub0lucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgc3RlcmVvIGJ5IHJlcGVhdGluZyBtb25vIGNoYW5uZWwgZGF0YQorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9JbnB1dChtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgIGFkanVzdF9jaGFubmVscyhtb25vSW5wdXQuZGF0YSgpLCBGQ0NfMSwgc3RlcmVvSW5wdXQuZGF0YSgpLCBGQ0NfMiwgc2l6ZW9mKGZsb2F0KSwKKyAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIHNpemVvZihmbG9hdCkgKiBGQ0NfMSk7CisKKyAgICAvLyBBcHBseSBlZmZlY3Qgb24gc3RlcmVvIGNoYW5uZWxzCisgICAgRWZmZWN0VGVzdEhlbHBlciBzdGVyZW9FZmZlY3QobVV1aWQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3QuY3JlYXRlRWZmZWN0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0ZXJlb0VmZmVjdC5zZXRDb25maWcoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gc3RlcmVvT3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnByb2Nlc3Moc3RlcmVvSW5wdXQuZGF0YSgpLCBzdGVyZW9PdXRwdXQuZGF0YSgpKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7CisKKyAgICAvLyBDb252ZXJ0IHN0ZXJlbyBmbG9hdCBkYXRhIHRvIHN0ZXJlbyBpbnQxNl90IHRvIGJlIHVzZWQgYXMgcmVmZXJlbmNlCisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gc3RlcmVvUmVmSTE2KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHN0ZXJlb1JlZkkxNi5kYXRhKCksIHN0ZXJlb091dHB1dC5kYXRhKCksIG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisKKyAgICBmb3IgKHNpemVfdCBjaE1hc2sgOiBFZmZlY3RUZXN0SGVscGVyOjprQ2hNYXNrcykgeworICAgICAgICBzaXplX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7CisgICAgICAgIEVmZmVjdFRlc3RIZWxwZXIgdGVzdEVmZmVjdChtVXVpZCwgY2hNYXNrLCBjaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0Q29uZmlnKCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB0ZXN0SW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgLy8gUmVwZWF0IG1vbm8gY2hhbm5lbCBkYXRhIHRvIGFsbCB0aGUgY2hhbm5lbHMKKyAgICAgICAgLy8gYWRqdXN0X2NoYW5uZWxzKCkgemVybyBmaWxscyBjaGFubmVscyA+IDIsIGhlbmNlIGNhbid0IGJlIHVzZWQgaGVyZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3RhbEZyYW1lQ291bnQ7ICsraSkgeworICAgICAgICAgICAgYXV0byogZnAgPSAmdGVzdElucHV0W2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgc3RkOjpmaWxsKGZwLCBmcCArIGNoYW5uZWxDb3VudCwgbW9ub0lucHV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB0ZXN0T3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnByb2Nlc3ModGVzdElucHV0LmRhdGEoKSwgdGVzdE91dHB1dC5kYXRhKCkpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5yZWxlYXNlRWZmZWN0KCkpOworCisgICAgICAgIC8vIEV4dHJhY3QgZmlyc3QgdHdvIGNoYW5uZWxzCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzdGVyZW9UZXN0T3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgICAgIGFkanVzdF9jaGFubmVscyh0ZXN0T3V0cHV0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBzdGVyZW9UZXN0T3V0cHV0LmRhdGEoKSwgRkNDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpLCBtVG90YWxGcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgdGVzdCBkYXRhIHRvIGludDE2X3QKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gc3RlcmVvVGVzdEkxNihtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc3RlcmVvVGVzdEkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RPdXRwdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKworICAgICAgICBpZiAoaXNCYXNzQm9vc3QobVV1aWQpKSB7CisgICAgICAgICAgICAvLyBTTlIgbXVzdCBiZSBhYm92ZSB0aGUgdGhyZXNob2xkCisgICAgICAgICAgICBmbG9hdCBzbnIgPSBjb21wdXRlU25yPGludDE2X3Q+KHN0ZXJlb1JlZkkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RJMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgICAgICAgICAgQVNTRVJUX0dUKHNuciwgRWZmZWN0VGVzdEhlbHBlcjo6a1NOUlRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIlNOUiAiIDw8IHNuciA8PCAiaXMgbG93ZXIgdGhhbiAiIDw8IEVmZmVjdFRlc3RIZWxwZXI6OmtTTlJUaHJlc2hvbGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoMCwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAoc3RlcmVvUmVmSTE2LmRhdGEoKSwgc3RlcmVvVGVzdEkxNi5kYXRhKCksIG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMikpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGaXJzdCB0d28gY2hhbm5lbHMgZG8gbm90IG1hdGNoIHdpdGggc3RlcmVvIG91dHB1dCBcbiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRWZmZWN0QnVuZGxlVGVzdEFsbCwgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6Q29tYmluZSg6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bVNhbXBsZVJhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtRnJhbWVDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1Mb29wQ291bnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClrTnVtRWZmZWN0VXVpZHMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFJldmVyYlRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0UmV2ZXJiVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0NTNlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFJldmVyYlRlc3QuY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfcHJlc2V0cmV2ZXJiLmg+CisjaW5jbHVkZSA8VmVjdG9yQXJpdGhtZXRpYy5oPgorCisjaW5jbHVkZSAiRWZmZWN0VGVzdEhlbHBlci5oIgordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtFZmZlY3RVdWlkc1tdID0geworICAgICAgICAvLyBOWFAgU1cgaW5zZXJ0IGVudmlyb25tZW50YWwgcmV2ZXJiCisgICAgICAgIHsweGM3YTUxMWEwLCAweGEzYmIsIDB4MTFkZiwgMHg4NjBlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBOWFAgU1cgaW5zZXJ0IHByZXNldCByZXZlcmIKKyAgICAgICAgezB4MTcyY2RmMDAsIDB4YTNiYywgMHgxMWRmLCAweGE3MmYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIE5YUCBTVyBhdXhpbGlhcnkgZW52aXJvbm1lbnRhbCByZXZlcmIKKyAgICAgICAgezB4NGEzODdmYzAsIDB4OGFiMywgMHgxMWRmLCAweDhiYWQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIE5YUCBTVyBhdXhpbGlhcnkgcHJlc2V0IHJldmVyYgorICAgICAgICB7MHhmMjlhMTQwMCwgMHhhM2JiLCAweDExZGYsIDB4OGRkYywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKK307CisKK2NvbnN0ZXhwciBzaXplX3Qga051bUVmZmVjdFV1aWRzID0gc3RkOjpzaXplKGtFZmZlY3RVdWlkcyk7CisKK3N0YXRpYyBib29sIGlzQXV4TW9kZShjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7CisgICAgLy8gVXBkYXRlIHRoaXMsIGlmIHRoZSBvcmRlciBvZiBlZmZlY3RzIGluIGtFZmZlY3RVdWlkcyBpcyB1cGRhdGVkCisgICAgcmV0dXJuICh1dWlkID09ICZrRWZmZWN0VXVpZHNbMl0gfHwgdXVpZCA9PSAma0VmZmVjdFV1aWRzWzNdKTsKK30KKworY29uc3RleHByIGludCBrUHJlc2V0c1tdID0geworICAgICAgICBSRVZFUkJfUFJFU0VUX05PTkUsICAgICAgUkVWRVJCX1BSRVNFVF9TTUFMTFJPT00sICBSRVZFUkJfUFJFU0VUX01FRElVTVJPT00sCisgICAgICAgIFJFVkVSQl9QUkVTRVRfTEFSR0VST09NLCBSRVZFUkJfUFJFU0VUX01FRElVTUhBTEwsIFJFVkVSQl9QUkVTRVRfTEFSR0VIQUxMLAorICAgICAgICBSRVZFUkJfUFJFU0VUX1BMQVRFLAorfTsKKworY29uc3RleHByIHNpemVfdCBrTnVtUHJlc2V0cyA9IHN0ZDo6c2l6ZShrUHJlc2V0cyk7CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RUZXN0UGFyYW07CitjbGFzcyBTaW5nbGVFZmZlY3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RUZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdFRlc3QoKQorICAgICAgICA6IG1TYW1wbGVSYXRlKEVmZmVjdFRlc3RIZWxwZXI6OmtTYW1wbGVSYXRlc1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1GcmFtZUNvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtGcmFtZUNvdW50c1tzdGQ6OmdldDwyPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1Mb29wQ291bnQoRWZmZWN0VGVzdEhlbHBlcjo6a0xvb3BDb3VudHNbc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtVG90YWxGcmFtZUNvdW50KG1GcmFtZUNvdW50ICogbUxvb3BDb3VudCksCisgICAgICAgICAgbVV1aWQoJmtFZmZlY3RVdWlkc1tzdGQ6OmdldDw0PihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1JbkNoTWFzayhpc0F1eE1vZGUobVV1aWQpID8gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3Nbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtSW5DaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1JbkNoTWFzaykpLAorICAgICAgICAgIG1PdXRDaE1hc2soRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3Nbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtT3V0Q2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtT3V0Q2hNYXNrKSksCisgICAgICAgICAgbVByZXNldChrUHJlc2V0c1tzdGQ6OmdldDw1PihHZXRQYXJhbSgpKV0pIHt9CisKKyAgICBjb25zdCBzaXplX3QgbVNhbXBsZVJhdGU7CisgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCBtTG9vcENvdW50OworICAgIGNvbnN0IHNpemVfdCBtVG90YWxGcmFtZUNvdW50OworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworICAgIGNvbnN0IHNpemVfdCBtSW5DaE1hc2s7CisgICAgY29uc3Qgc2l6ZV90IG1JbkNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbU91dENoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbU91dENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVByZXNldDsKK307CisKKy8vIFRlc3RzIGFwcGx5aW5nIGEgc2luZ2xlIGVmZmVjdAorVEVTVF9QKFNpbmdsZUVmZmVjdFRlc3QsIFNpbXBsZVByb2Nlc3MpIHsKKyAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpIDw8ICJvdXRDaE1hc2s6ICIgPDwgbU91dENoTWFzayA8PCAiIHNhbXBsZVJhdGU6ICIgPDwgbVNhbXBsZVJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudDogIiA8PCBtRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBsb29wQ291bnQ6ICIgPDwgbUxvb3BDb3VudCA8PCAiIHByZXNldDogIiA8PCBtUHJlc2V0KTsKKworICAgIEVmZmVjdFRlc3RIZWxwZXIgZWZmZWN0KG1VdWlkLCBtSW5DaE1hc2ssIG1PdXRDaE1hc2ssIG1TYW1wbGVSYXRlLCBtRnJhbWVDb3VudCwgbUxvb3BDb3VudCk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QuY3JlYXRlRWZmZWN0KCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRDb25maWcoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldFBhcmFtKFJFVkVSQl9QQVJBTV9QUkVTRVQsIG1QcmVzZXQpKTsKKworICAgIC8vIEluaXRpYWxpemUgaW5wdXQgYnVmZmVyIHdpdGggZGV0ZXJtaW5pc3RpYyBwc2V1ZG8tcmFuZG9tIHZhbHVlcworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBpbnB1dChtVG90YWxGcmFtZUNvdW50ICogbUluQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gb3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBtT3V0Q2hhbm5lbENvdW50KTsKKyAgICBzdGQ6Om1pbnN0ZF9yYW5kIGdlbihtT3V0Q2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIGZvciAoYXV0byYgaW4gOiBpbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucHJvY2VzcyhpbnB1dC5kYXRhKCksIG91dHB1dC5kYXRhKCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFZmZlY3RSZXZlcmJUZXN0QWxsLCBTaW5nbGVFZmZlY3RUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1DaE1hc2tzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtU2FtcGxlUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1GcmFtZUNvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bVByZXNldHMpKSk7CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQsIGludD4gU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbTsKK2NsYXNzIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0KCkKKyAgICAgICAgOiBtU2FtcGxlUmF0ZShFZmZlY3RUZXN0SGVscGVyOjprU2FtcGxlUmF0ZXNbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtRnJhbWVDb3VudChFZmZlY3RUZXN0SGVscGVyOjprRnJhbWVDb3VudHNbc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtTG9vcENvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtMb29wQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudChtRnJhbWVDb3VudCAqIG1Mb29wQ291bnQpLAorICAgICAgICAgIG1VdWlkKCZrRWZmZWN0VXVpZHNbc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtUHJlc2V0KGtQcmVzZXRzW3N0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpXSkge30KKworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7CisgICAgY29uc3Qgc2l6ZV90IG1QcmVzZXQ7Cit9OworCisvLyBDb21wYXJlcyBmaXJzdCB0d28gY2hhbm5lbHMgaW4gbXVsdGktY2hhbm5lbCBvdXRwdXQgdG8gc3RlcmVvIG91dHB1dCB3aGVuIHNhbWUgZWZmZWN0IGlzIGFwcGxpZWQKK1RFU1RfUChTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlIDw8ICIgZnJhbWVDb3VudDogIiA8PCBtRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50IDw8ICIgcHJlc2V0OiAiIDw8IG1QcmVzZXQpOworCisgICAgLy8gSW5pdGlhbGl6ZSBtb25vIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbW9ub0lucHV0KG1Ub3RhbEZyYW1lQ291bnQpOworCisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obVNhbXBsZVJhdGUpOworICAgIHN0ZDo6dW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpcygtMS4wZiwgMS4wZik7CisgICAgZm9yIChhdXRvJiBpbiA6IG1vbm9JbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKworICAgIC8vIEdlbmVyYXRlIHN0ZXJlbyBieSByZXBlYXRpbmcgbW9ubyBjaGFubmVsIGRhdGEKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gc3RlcmVvSW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBhZGp1c3RfY2hhbm5lbHMobW9ub0lucHV0LmRhdGEoKSwgRkNDXzEsIHN0ZXJlb0lucHV0LmRhdGEoKSwgRkNDXzIsIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQgKiBzaXplb2YoZmxvYXQpICogRkNDXzEpOworCisgICAgLy8gQXBwbHkgZWZmZWN0IG9uIHN0ZXJlbyBjaGFubmVscworICAgIEVmZmVjdFRlc3RIZWxwZXIgc3RlcmVvRWZmZWN0KAorICAgICAgICAgICAgbVV1aWQsIGlzQXV4TW9kZShtVXVpZCkgPyBBVURJT19DSEFOTkVMX09VVF9NT05PIDogQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGVyZW9FZmZlY3Quc2V0Q29uZmlnKCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0ZXJlb0VmZmVjdC5zZXRQYXJhbShSRVZFUkJfUEFSQU1fUFJFU0VULCBtUHJlc2V0KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gc3RlcmVvT3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnByb2Nlc3MoCisgICAgICAgICAgICAoaXNBdXhNb2RlKG1VdWlkKSA/IG1vbm9JbnB1dC5kYXRhKCkgOiBzdGVyZW9JbnB1dC5kYXRhKCkpLCBzdGVyZW9PdXRwdXQuZGF0YSgpKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc3RlcmVvRWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7CisKKyAgICAvLyBBdmVyYWdlIG9mIGJvdGggY2hhbm5lbHMgZGF0YSBpcyBzdG9yZWQgZm9yIG1vbm8gY29tcGFyaXNvbgorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtb25vT3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQpOworICAgIEZyb20yaVRvTW9ub19GbG9hdCgoY29uc3QgZmxvYXQqKXN0ZXJlb091dHB1dC5kYXRhKCksIG1vbm9PdXRwdXQuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50KTsKKworICAgIC8vIENvbnZlcnQgc3RlcmVvIGZsb2F0IGRhdGEgdG8gc3RlcmVvIGludDE2X3QgdG8gYmUgdXNlZCBhcyByZWZlcmVuY2UKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBzdGVyZW9SZWZJMTYobVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc3RlcmVvUmVmSTE2LmRhdGEoKSwgc3RlcmVvT3V0cHV0LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKTsKKworICAgIC8vIG1vbm8gaW50MTZfdCB0byBiZSB1c2VkIGFzIHJlZmVybmVjZSBmb3IgbW9ubyBjb21wYXJpc29uCisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gbW9ub1JlZkkxNihtVG90YWxGcmFtZUNvdW50KTsKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQobW9ub1JlZkkxNi5kYXRhKCksIG1vbm9PdXRwdXQuZGF0YSgpLCBtVG90YWxGcmFtZUNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IG91dENoTWFzayA6IEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzKSB7CisgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0Q2hNYXNrKTsKKyAgICAgICAgc2l6ZV90IGluQ2hNYXNrID0gaXNBdXhNb2RlKG1VdWlkKSA/IEFVRElPX0NIQU5ORUxfT1VUX01PTk8gOiBvdXRDaE1hc2s7CisKKyAgICAgICAgRWZmZWN0VGVzdEhlbHBlciB0ZXN0RWZmZWN0KG1VdWlkLCBpbkNoTWFzaywgb3V0Q2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcENvdW50KTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LmNyZWF0ZUVmZmVjdCgpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5zZXRDb25maWcoKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0UGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgbVByZXNldCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB0ZXN0SW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIG91dENoYW5uZWxDb3VudCk7CisKKyAgICAgICAgLy8gUmVwZWF0IG1vbm8gY2hhbm5lbCBkYXRhIHRvIGFsbCB0aGUgY2hhbm5lbHMKKyAgICAgICAgLy8gYWRqdXN0X2NoYW5uZWxzKCkgemVybyBmaWxscyBjaGFubmVscyA+IDIsIGhlbmNlIGNhbid0IGJlIHVzZWQgaGVyZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3RhbEZyYW1lQ291bnQ7ICsraSkgeworICAgICAgICAgICAgYXV0byogZnAgPSAmdGVzdElucHV0W2kgKiBvdXRDaGFubmVsQ291bnRdOworICAgICAgICAgICAgc3RkOjpmaWxsKGZwLCBmcCArIG91dENoYW5uZWxDb3VudCwgbW9ub0lucHV0W2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiB0ZXN0T3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBvdXRDaGFubmVsQ291bnQpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnByb2Nlc3MoCisgICAgICAgICAgICAgICAgKGlzQXV4TW9kZShtVXVpZCkgPyBtb25vSW5wdXQuZGF0YSgpIDogdGVzdElucHV0LmRhdGEoKSksIHRlc3RPdXRwdXQuZGF0YSgpKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgICAgICBpZiAob3V0Q2hhbm5lbENvdW50ID09IEZDQ18xKSB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSB0ZXN0IGRhdGEgdG8gaW50MTZfdAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gbW9ub1Rlc3RJMTYobVRvdGFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQobW9ub1Rlc3RJMTYuZGF0YSgpLCB0ZXN0T3V0cHV0LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAobW9ub1JlZkkxNi5kYXRhKCksIG1vbm9UZXN0STE2LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIk1vbm8gY2hhbm5lbCBkbyBub3QgbWF0Y2ggd2l0aCByZWZlcmVuY2Ugb3V0cHV0IFxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgZmlyc3QgdHdvIGNoYW5uZWxzCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gc3RlcmVvVGVzdE91dHB1dChtVG90YWxGcmFtZUNvdW50ICogRkNDXzIpOworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKHRlc3RPdXRwdXQuZGF0YSgpLCBvdXRDaGFubmVsQ291bnQsIHN0ZXJlb1Rlc3RPdXRwdXQuZGF0YSgpLCBGQ0NfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpLCBtVG90YWxGcmFtZUNvdW50ICogc2l6ZW9mKGZsb2F0KSAqIG91dENoYW5uZWxDb3VudCk7CisKKyAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHRlc3QgZGF0YSB0byBpbnQxNl90CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBzdGVyZW9UZXN0STE2KG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoc3RlcmVvVGVzdEkxNi5kYXRhKCksIHN0ZXJlb1Rlc3RPdXRwdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEZyYW1lQ291bnQgKiBGQ0NfMik7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLAorICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcChzdGVyZW9SZWZJMTYuZGF0YSgpLCBzdGVyZW9UZXN0STE2LmRhdGEoKSwgbVRvdGFsRnJhbWVDb3VudCAqIEZDQ18yKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkZpcnN0IHR3byBjaGFubmVscyBkbyBub3QgbWF0Y2ggd2l0aCBzdGVyZW8gb3V0cHV0IFxuIjsKKyAgICAgICAgfQorICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFZmZlY3RSZXZlcmJUZXN0QWxsLCBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtU2FtcGxlUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1GcmFtZUNvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1FZmZlY3RVdWlkcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bVByZXNldHMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1YzE1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJFZmZlY3RUZXN0SGVscGVyLmgiCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OmNyZWF0ZUVmZmVjdCgpIHsKKyAgICBpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdChtVXVpZCwgMSwgMSwgJm1FZmZlY3RIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJjcmVhdGVfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnJlbGVhc2VFZmZlY3QoKSB7CisgICAgaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KG1FZmZlY3RIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpzZXRDb25maWcoKSB7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZ3t9OworICAgIGNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIGNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IG1JbkNoTWFzazsKKyAgICBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gbU91dENoTWFzazsKKyAgICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKG1FZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInNldF9jb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAic2V0X2NvbmZpZyByZXBseSBub24gemVybyAiIDw8IHJlcGx5OworCisgICAgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKG1FZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJjbWRfZW5hYmxlIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgImNtZF9lbmFibGUgcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWx1ZSkgeworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7dHlwZSwgdmFsdWV9OworICAgIGF1dG8gZWZmZWN0UGFyYW0gPSBuZXcgZWZmZWN0X3BhcmFtX3Rbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpXTsKKyAgICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgICAgZWZmZWN0UGFyYW0tPnBzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVswXSk7CisgICAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgICAgZGVsZXRlW10gZWZmZWN0UGFyYW07CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInNldF9wYXJhbSByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKyAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfcGFyYW0gcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpwcm9jZXNzKGZsb2F0KiBpbnB1dCwgZmxvYXQqIG91dHB1dCkgeworICAgIGF1ZGlvX2J1ZmZlcl90IGluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5mMzIgPSBpbnB1dH07CisgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5mMzIgPSBvdXRwdXR9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxvb3BDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpLT5wcm9jZXNzKG1FZmZlY3RIYW5kbGUsICZpbkJ1ZmZlciwgJm91dEJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJwcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworCisgICAgICAgIGluQnVmZmVyLmYzMiArPSBtRnJhbWVDb3VudCAqIG1JbkNoYW5uZWxDb3VudDsKKyAgICAgICAgb3V0QnVmZmVyLmYzMiArPSBtRnJhbWVDb3VudCAqIG1PdXRDaGFubmVsQ291bnQ7CisgICAgfQorfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU0ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxyYW5kb20+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBmbG9hdCBjb21wdXRlU25yKGNvbnN0IFQqIHJlZiwgY29uc3QgVCogdHN0LCBzaXplX3QgY291bnQpIHsKKyAgICBkb3VibGUgc2lnbmFse307CisgICAgZG91YmxlIG5vaXNle307CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgY29uc3QgZG91YmxlIHZhbHVlKHJlZltpXSk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkaWZmKHRzdFtpXSAtIHZhbHVlKTsKKyAgICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7CisgICAgICAgIG5vaXNlICs9IGRpZmYgKiBkaWZmOworICAgIH0KKyAgICAvLyBJbml0aWFsaXplZCB0byBsYXJnZSB2YWx1ZSB0byBoYW5kbGUKKyAgICAvLyBjYXNlcyB3aGVyZSByZWYgYW5kIHRzdCBtYXRjaCBleGFjdGx5CisgICAgZmxvYXQgc25yID0gRkxUX01BWDsKKyAgICBpZiAoc2lnbmFsID4gMC4wZiAmJiBub2lzZSA+IDAuMGYpIHsKKyAgICAgICAgc25yID0gMTAuZiAqIGxvZyhzaWduYWwgLyBub2lzZSk7CisgICAgfQorICAgIHJldHVybiBzbnI7Cit9CisKK2NsYXNzIEVmZmVjdFRlc3RIZWxwZXIgeworICBwdWJsaWM6CisgICAgRWZmZWN0VGVzdEhlbHBlcihjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBzaXplX3QgaW5DaE1hc2ssIHNpemVfdCBvdXRDaE1hc2ssCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlUmF0ZSwgc2l6ZV90IGZyYW1lQ291bnQsIHNpemVfdCBsb29wQ291bnQpCisgICAgICAgIDogbVV1aWQodXVpZCksCisgICAgICAgICAgbUluQ2hNYXNrKGluQ2hNYXNrKSwKKyAgICAgICAgICBtSW5DaGFubmVsQ291bnQoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1JbkNoTWFzaykpLAorICAgICAgICAgIG1PdXRDaE1hc2sob3V0Q2hNYXNrKSwKKyAgICAgICAgICBtT3V0Q2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtT3V0Q2hNYXNrKSksCisgICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCisgICAgICAgICAgbUZyYW1lQ291bnQoZnJhbWVDb3VudCksCisgICAgICAgICAgbUxvb3BDb3VudChsb29wQ291bnQpIHt9CisgICAgdm9pZCBjcmVhdGVFZmZlY3QoKTsKKyAgICB2b2lkIHJlbGVhc2VFZmZlY3QoKTsKKyAgICB2b2lkIHNldENvbmZpZygpOworICAgIHZvaWQgc2V0UGFyYW0odWludDMyX3QgdHlwZSwgdWludDMyX3QgdmFsKTsKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIGlucHV0LCBmbG9hdCogb3V0cHV0KTsKKworICAgIC8vIENvcnJlc3BvbmRzIHRvIFNOUiBmb3IgMSBiaXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBpbnQxNl90IHNpZ25hbHMKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtTTlJUaHJlc2hvbGQgPSA5MC4zMDg5OTg7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtDaE1hc2tzW10gPSB7CisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLCAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLCAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLCAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCwgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSwgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLCAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMCwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMiwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNCwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNiwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOCwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMCwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMSwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMiwgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUNoTWFza3MgPSBzdGQ6OnNpemUoa0NoTWFza3MpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1NhbXBsZVJhdGVzW10gPSB7ODAwMCwgIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAgMjQwMDAsIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMH07CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTnVtU2FtcGxlUmF0ZXMgPSBzdGQ6OnNpemUoa1NhbXBsZVJhdGVzKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtGcmFtZUNvdW50c1tdID0gezQsIDIwNDh9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUZyYW1lQ291bnRzID0gc3RkOjpzaXplKGtGcmFtZUNvdW50cyk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTG9vcENvdW50c1tdID0gezEsIDR9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUxvb3BDb3VudHMgPSBzdGQ6OnNpemUoa0xvb3BDb3VudHMpOworCisgIHByaXZhdGU6CisgICAgY29uc3QgZWZmZWN0X3V1aWRfdCogbVV1aWQ7CisgICAgY29uc3Qgc2l6ZV90IG1JbkNoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtT3V0Q2hNYXNrOworICAgIGNvbnN0IHNpemVfdCBtT3V0Q2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgZWZmZWN0X2hhbmRsZV90IG1FZmZlY3RIYW5kbGV7fTsKK307Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKaW5kZXggYTk3YWNjOS4uNzU3MWEyNCAxMDA3NTUKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0yMyw3ICsyMyw3IEBACiBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogZWNobyAidGVzdGluZyBsdm0iCiBhZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKLWFkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyAkdGVzdGRpcgogYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvc25yL2FybTY0L3NuciAkdGVzdGRpcgogCiBFX1ZBTD0xCkBAIC01MywxNiArNTMsMTYgQEAKIGZsYWdzX2Fycj0oCiAgICAgIi1jc0UiCiAgICAgIi1lcUUiCi0gICAgIi10RSIKLSAgICAiLWNzRSAtdEUgLWVxRSIKKyAgICAiLXRFIC10cmVibGVMdmw6MTUiCisgICAgIi1jc0UgLXRFIC10cmVibGVMdmw6MTUgLWVxRSIKICAgICAiLWJFIC1NIgotICAgICItY3NFIC10RSIKLSAgICAiLWNzRSAtZXFFIiAiLXRFIC1lcUUiCi0gICAgIi1jc0UgLXRFIC1iRSAtTSAtZXFFIgotICAgICItdEUgLWVxRSAtdmNCYWw6OTYgLU0iCi0gICAgIi10RSAtZXFFIC12Y0JhbDotOTYgLU0iCi0gICAgIi10RSAtZXFFIC12Y0JhbDowIC1NIgotICAgICItdEUgLWVxRSAtYkUgLXZjQmFsOjMwIC1NIgorICAgICItY3NFIC10RSAtdHJlYmxlTHZsOjE1IgorICAgICItY3NFIC1lcUUiICItdEUgLXRyZWJsZUx2bDoxNSAtZXFFIgorICAgICItY3NFIC10RSAtdHJlYmxlTHZsOjE1IC1iRSAtTSAtZXFFIgorICAgICItdEUgLXRyZWJsZUx2bDoxNSAtZXFFIC12Y0JhbDo5NiAtTSIKKyAgICAiLXRFIC10cmVibGVMdmw6MTUgLWVxRSAtdmNCYWw6LTk2IC1NIgorICAgICItdEUgLXRyZWJsZUx2bDoxNSAtZXFFIC12Y0JhbDowIC1NIgorICAgICItdEUgLXRyZWJsZUx2bDoxNSAtZXFFIC1iRSAtdmNCYWw6MzAgLU0iCiApCiAKIGZzX2Fycj0oCkBAIC05MSw3ICs5MSw3IEBACiAgICAgZG8KICAgICAgICAgZm9yIGZzIGluICR7ZnNfYXJyWypdfQogICAgICAgICBkbwotICAgICAgICAgICAgZm9yIGNoTWFzayBpbiB7MC4uMjJ9CisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi4zOH0KICAgICAgICAgICAgIGRvCiAgICAgICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCiAgICAgICAgICAgICAgICAgICAgIC1vOiR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyAtY2hNYXNrOiRjaE1hc2sgLWZzOiRmcyAkZmxhZ3MKQEAgLTEwMiw2ICsxMDIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgKCgrK2Vycm9yX2NvdW50KSkKICAgICAgICAgICAgICAgICBmaQogCisgICAgICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtdmNCYWwgaXMgaW4gZmxhZ3MgYW5kIGNoTWFzayBpcyAwIChkdWUgdG8KKyAgICAgICAgICAgICAgICAjIHN0ZXJlbyBjb21wdXRhdGlvbikKKyAgICAgICAgICAgICAgICBpZiBbWyAkZmxhZ3MgPT0gKiItdmNCYWw6IiogXV0gJiYgW1sgJGNoTWFzayAtZXEgMCBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGZpCiAKICAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKICAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCAyIGNoYW5uZWxzKS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzJiMzcwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHNfcmV2ZXJiLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vYmFzaAorIworIyByZXZlcmIgdGVzdAorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworIyBsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvcmV2VGVzdCIKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gInRlc3RpbmcgcmV2ZXJiIgorYWRiIHNoZWxsIG1rZGlyIC1wICR0ZXN0ZGlyCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyAkdGVzdGRpcgorCitFX1ZBTD0xCitjbWRzPSJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9yZXZlcmJfdGVzdC9hcm0vcmV2ZXJiX3Rlc3QgJHRlc3RkaXIiCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDE2MDAwCisgICAgMjIwNTAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKK2ZsYWdzX2Fycj0oCisgICAgIi0tTSAtLWZjaCAxIgorICAgICItLWZjaCAyIgorKQorCisjIHJ1biByZXZlcmIgYXQgZGlmZmVyZW50IGNvbmZpZ3MsIHNhdmluZyBvbmx5IHRoZSBzdGVyZW8gY2hhbm5lbAorIyBwYWlyLgorZXJyb3JfY291bnQ9MAordGVzdGNhc2VfY291bnQ9MAorZm9yIGNtZCBpbiAiJHtjbWRzW0BdfSIKK2RvCisgICAgJGNtZAorICAgIGZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorICAgIGRvCisgICAgICAgIGZvciBwcmVzZXRfdmFsIGluIHswLi42fQorICAgICAgICBkbworICAgICAgICAgICAgZm9yIGZzIGluICR7ZnNfYXJyWypdfQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi4zOH0KKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICBhZGIgc2hlbGwgJHRlc3RkaXIvcmV2ZXJiX3Rlc3QgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnB1dCAkdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLWNoTWFzayAkY2hNYXNrICRmbGFncyAtLWZzICRmcyAtLXByZXNldCAkcHJlc2V0X3ZhbAorCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAgIGlmIFtbICIkY2hNYXNrIiAtZ3QgMCBdXSAmJiBbWyAkZmxhZ3MgIT0gKiItLWZjaCAyIiogXV0KKyAgICAgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5nbGUgY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCBjaGFubmVsKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzBfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdworICAgICAgICAgICAgICAgICAgICBlbGlmIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjbXAgcmV0dXJucyBFWElUX0ZBSUxVUkUgb24gbWlzbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAoKCsrdGVzdGNhc2VfY291bnQpKQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCitlY2hvICIkdGVzdGNhc2VfY291bnQgdGVzdHMgcGVyZm9ybWVkIgorZWNobyAiJGVycm9yX2NvdW50IGVycm9ycyIKK2V4aXQgJGVycm9yX2NvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCmluZGV4IGE0YWNlNmMuLmU2NTIyOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0zMywxOTggKzMzLDE2NSBAQAogI2RlZmluZSBBTE9HVlYgQUxPR1YKICNlbHNlCiAjZGVmaW5lIEFMT0dWVihhLi4uKSBcCi0gIGRvIHsgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKGZhbHNlKQorICAgIGRvIHsgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKGZhbHNlKQogI2VuZGlmCiAKLSNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCi0gICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgXAotfQorI2RlZmluZSBDSEVDS19BUkcoY29uZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiAjY29uZCk7IFwKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KKyNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJiYWQgbnVtYmVyIG9mIHNhbXBsZXMgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIHN0cnVjdCBsdm1Db25maWdQYXJhbXNfdCB7Ci0gIGludCAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICAgID0gNDQxMDA7Ci0gIGludCAgICAgICAgICAgICAgbnJDaGFubmVscyAgICAgID0gMjsKLSAgaW50ICAgICAgICAgICAgICBjaE1hc2sgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gIGludCAgICAgICAgICAgICAgdmNCYWwgICAgICAgICAgID0gMDsKLSAgaW50ICAgICAgICAgICAgICBmQ2hhbm5lbHMgICAgICAgPSAyOwotICBib29sICAgICAgICAgICAgIG1vbm9Nb2RlICAgICAgICA9IGZhbHNlOwotICBpbnQgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCA9IDA7Ci0gIGludCAgICAgICAgICAgICAgZXFQcmVzZXRMZXZlbCAgID0gMDsKLSAgaW50ICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAgICAgPSAyNTY7Ci0gIExWTV9CRV9Nb2RlX2VuICAgYmFzc0VuYWJsZSAgICAgID0gTFZNX0JFX09GRjsKLSAgTFZNX1RFX01vZGVfZW4gICB0cmVibGVFbmFibGUgICAgPSBMVk1fVEVfT0ZGOwotICBMVk1fRVFOQl9Nb2RlX2VuIGVxRW5hYmxlICAgICAgICA9IExWTV9FUU5CX09GRjsKLSAgTFZNX01vZGVfZW4gICAgICBjc0VuYWJsZSAgICAgICAgPSBMVk1fTU9ERV9PRkY7CisgICAgaW50IHNhbXBsaW5nRnJlcSA9IDQ0MTAwOworICAgIGludCBuckNoYW5uZWxzID0gMjsKKyAgICBpbnQgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGludCB2Y0JhbCA9IDA7CisgICAgaW50IGZDaGFubmVscyA9IDI7CisgICAgYm9vbCBtb25vTW9kZSA9IGZhbHNlOworICAgIGludCBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICAgIGludCBlcVByZXNldExldmVsID0gMDsKKyAgICBpbnQgZnJhbWVMZW5ndGggPSAyNTY7CisgICAgaW50IHRyZWJsZUVmZmVjdExldmVsID0gMDsKKyAgICBMVk1fQkVfTW9kZV9lbiBiYXNzRW5hYmxlID0gTFZNX0JFX09GRjsKKyAgICBMVk1fVEVfTW9kZV9lbiB0cmVibGVFbmFibGUgPSBMVk1fVEVfT0ZGOworICAgIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgPSBMVk1fRVFOQl9PRkY7CisgICAgTFZNX01vZGVfZW4gY3NFbmFibGUgPSBMVk1fTU9ERV9PRkY7CiB9OwogCiBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbHZtQ29uZmlnQ2hNYXNrW10gPSB7Ci0gICAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKLSAgICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKLSAgICBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCwKLSAgICAoMSA8PCA0KSAtIDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBLAotICAgICgxIDw8IDUpIC0gMSwKLSAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLLAotICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKLSAgICAoMSA8PCA2KSAtIDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKLSAgICAoMSA8PCA3KSAtIDEsCi0gICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiwKLSAgICBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAotICAgICgxIDw8IDgpIC0gMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEwLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEzLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTQsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE2LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTcsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE5LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjAsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yNCwKIH07CiAKLQogdm9pZCBwcmludFVzYWdlKCkgewotICBwcmludGYoIlxuVXNhZ2U6ICIpOwotICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gLWk6PGlucHV0X2ZpbGU+IC1vOjxvdXRfZmlsZT4gW29wdGlvbnNdXG4iKTsKLSAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGlucHV0ZmlsZT4gIGlzIHRoZSBpbnB1dCBmaWxlIG5hbWUiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7Ci0gIHByaW50ZigiXG4gICAgIDxvdXRwdXRmaWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKLSAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1oZWxwIChvcikgLWgiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtY2hNYXNrOjxjaGFubmVsX21hc2s+XG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDAgIC0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIpOwotICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDIgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMyAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDUgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLIik7Ci0gIHByaW50ZigiXG4gICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOwotICBwcmludGYoIlxuICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOwotICBwcmludGYoIlxuICAgICAgICAgOCAgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA0IGNoOiAoMSA8PCA0KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiIpOwotICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMSAtIEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDUgY2g6ICgxIDw8IDUpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxNCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE1IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTcgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA2IGNoOiAoMSA8PCA2KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDE4IC0gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSIpOwotICBwcmludGYoIlxuICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgIDIwIC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiIpOwotICBwcmludGYoIlxuICAgICAgICAgMjEgLSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIik7Ci0gIHByaW50ZigiXG4gICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOwotICBwcmludGYoIlxuICAgICAgICAgZGVmYXVsdCAwIik7Ci0gIHByaW50ZigiXG4gICAgIC12Y0JhbDo8TGVmdCBSaWdodCBCYWxhbmNlIGNvbnRyb2wgaW4gZEIgWy05NiB0byA5NiBkQl0+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgICAtdmUgdmFsdWVzIHJlZHVjZSBSaWdodCBjaGFubmVsIHdoaWxlICt2ZSB2YWx1ZSByZWR1Y2VzIExlZnQgY2hhbm5lbCIpOwotICBwcmludGYoIlxuICAgICAgICAgICAgICAgICBkZWZhdWx0IDAiKTsKLSAgcHJpbnRmKCJcbiAgICAgLWZjaDo8ZmlsZV9jaGFubmVscz4gKDEgdGhyb3VnaCA4KVxuXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLU0iKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOwotICBwcmludGYoIlxuICAgICAtYmFzc2x2bDo8ZWZmZWN0X2xldmVsPiIpOwotICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gJWQgLSAlZCBkZWZhdWx0IDAiLCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMLAotICAgIExWTV9CRV9NQVhfRUZGRUNUTEVWRUwpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1lcVByZXNldDo8cHJlc2V0IFZhbHVlPiIpOwotICBjb25zdCBzaXplX3QgbnVtUHJlc2V0THZscyAgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVByZXNldEx2bHM7ICsraSkgewotICAgIHByaW50ZigiXG4gICAgICAgICAgICV6dSAtICVzIiwgaSwgZ0VxdWFsaXplclByZXNldHNbaV0ubmFtZSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIDAiKTsKLSAgcHJpbnRmKCJcbiAgICAgLWJFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLXRFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgVHJlYmxlIEJvb3N0Iik7Ci0gIHByaW50ZigiXG4iKTsKLSAgcHJpbnRmKCJcbiAgICAgLWNzRSAiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIENvbmNlcnQgU3Vycm91bmQiKTsKLSAgcHJpbnRmKCJcbiIpOwotICBwcmludGYoIlxuICAgICAtZXFFICIpOwotICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgRXF1YWxpemVyIik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTHZtRWZmZWN0X2ZyZWUoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCi0vLwotLy8gSW5wdXRzOgotLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAotLy8KLS8vIE91dHB1dHM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTHZtRWZmZWN0X2ZyZWUoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7Ci0gIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gIExWTV9NZW1UYWJfdCBNZW1UYWI7Ci0KLSAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLwotICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotCi0gIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtRWZmZWN0X2ZyZWUiKQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApIHsKLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIEVORCAgIGZyZWVpbmcgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6IEx2bUVmZmVjdF9mcmVlIC0gdHJ5aW5nIHRvIGZyZWUgd2l0aCBOVUxMIHBvaW50ZXIgIgotICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAgRVJST1JcbiIsCi0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0KKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICAgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxpbnB1dGZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIExWTSBlZmZlY3RzIGFyZSBhcHBsaWVkIik7CisgICAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiXG4gICAgIC1jaE1hc2s6PGNoYW5uZWxfbWFzaz5cbiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICAgIHByaW50ZigiXG4gICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtdmNCYWw6PExlZnQgUmlnaHQgQmFsYW5jZSBjb250cm9sIGluIGRCIFstOTYgdG8gOTYgZEJdPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgICAtdmUgdmFsdWVzIHJlZHVjZSBSaWdodCBjaGFubmVsIHdoaWxlICt2ZSB2YWx1ZSByZWR1Y2VzIExlZnQgY2hhbm5lbCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQgMCIpOworICAgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLU0iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBIHZhbHVlIHRoYXQgcmFuZ2VzIGJldHdlZW4gJWQgLSAlZCBkZWZhdWx0IDAiLCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMLAorICAgICAgICAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7CisgICAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7CisgICAgICAgIHByaW50ZigiXG4gICAgICAgICAgICV6dSAtICVzIiwgaSwgZ0VxdWFsaXplclByZXNldHNbaV0ubmFtZSk7CiAgICAgfQotICB9Ci19IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworICAgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWJFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLXRFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgLWNzRSAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtZXFFICIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfaW5pdCgpCkBAIC0yMzksNTg2ICsyMDYsNDY3IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgewotICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworaW50IEx2bUJ1bmRsZV9pbml0KHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgTFZNX0NvbnRyb2xQYXJhbXNfdCogcGFyYW1zKSB7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKIAotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKLSAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAKLSAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7Ci0gICAgQUxPR1YoCi0gICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgotICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKIAotICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKLQotICAgIEFMT0dWKAotICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKLSAgICAgICAgIi0+IENhbGxlZCBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7Ci0gIH0KLQotICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICBMVk1fSW5zdFBhcmFtc190IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCi0gIExWTV9IZWFkcm9vbVBhcmFtc190IEhlYWRyb29tUGFyYW1zOyAgICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KLSAgTFZNX0hlYWRyb29tQmFuZERlZl90IEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107Ci0gIExWTV9NZW1UYWJfdCBNZW1UYWI7IC8qIE1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gIGJvb2wgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7Ci0KLSAgLyogU2V0IHRoZSBjYXBhYmlsaXRpZXMgKi8KLSAgSW5zdFBhcmFtcy5CdWZmZXJNb2RlID0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTOwotICBJbnN0UGFyYW1zLk1heEJsb2NrU2l6ZSA9IE1BWF9DQUxMX1NJWkU7Ci0gIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7Ci0gIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID0gTFZNX1BTQV9PTjsKLQotICAvKiBBbGxvY2F0ZSBtZW1vcnksIGZvcmNpbmcgYWxpZ25tZW50ICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwgJk1lbVRhYiwgJkluc3RQYXJhbXMpOwotCi0gIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKLSAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5ICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApIHsKLSAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7Ci0KLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKLSAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKICAgICB9Ci0gIH0KIAotICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCi0gICAqIHRoYXQgd2VyZQotICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCi0gICAqLwotICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7Ci0gICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKLSAgICAgICAgQUxPR0UoCi0gICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCi0gICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKLSAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgfQorICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworCisgICAgLyogU2V0IHRoZSBjYXBhYmlsaXRpZXMgKi8KKyAgICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7CisgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgICAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZJbnN0UGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgIgorICAgICAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgICAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgcGFyYW1zLT5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKworICAgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgICAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgICAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOworICAgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgfQotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0gIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CiAKLSAgLyogSW5pdGlhbGlzZSAqLwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKyAgICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKIAotICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKyAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CiAKLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgICAgcGFyYW1zLT5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKIAotICBBTE9HVigKLSAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCi0gICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT047CisgICAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgICAgcGFyYW1zLT5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIHBhcmFtcy0+QkVfSFBGID0gTFZNX0JFX0hQRl9PTjsKIAotICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCi0gIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKLSAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwotICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87Ci0gIHBhcmFtcy0+Q2hNYXNrICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICAgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKIAotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKIAotICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7Ci0gIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgcGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOwotICBwYXJhbXMtPkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PTjsKLSAgcGFyYW1zLT5FUU5CX05CYW5kcyA9IEZJVkVCQU5EX05VTUJBTkRTOwotICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOworICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgIgorICAgICAgICAgICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewotICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07Ci0gICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07Ci0gICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKLSAgfQorICAgIC8qIFNldCB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkhlYWRyb29tX09mZnNldCA9IDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gJkhlYWRyb29tQmFuZERlZlswXTsKKyAgICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICAgIEhlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKIAotICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOwotICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CiAKLSAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKLSAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7Ci0gIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7Ci0KLSAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKLSAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7Ci0gIHBhcmFtcy0+QkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKLSAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOwotCi0gIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7Ci0gIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKLQotICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKLSAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7Ci0KLSAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgTHZtU3RhdHVzID0KLSAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLQotICBBTE9HVigKLSAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCi0gICAgICAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLQotICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KLSAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOwotICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7Ci0gIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOwotICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKLSAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKLSAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7Ci0gIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOwotICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOwotICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7Ci0KLSAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLQotICBBTE9HVigKLSAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCi0gICAgICAiTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKLSAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7Ci0gIHJldHVybiAwOworICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc3NmdWxseSBjYWxsZWQgIgorICAgICAgICAgICJMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOworICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IEVuZCIpOworICAgIHJldHVybiAwOwogfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KIAotaW50IGx2bUNyZWF0ZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAotICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7Ci0gIGludCByZXQgPSAwOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTlVMTDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7Ci0gIGlmIChOVUxMID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpIHsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOwotCi0gIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZQotICAgKiBzZXQgdG8gdGhlIGdldAotICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKLSAgICogYXZvaWQKLSAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCi0gICAqLwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKLSAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOwotICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7Ci0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKLSAgfQotICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKLSAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOwotICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCwgcGFyYW1zKTsKLQotICBpZiAocmV0IDwgMCkgewotICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IGx2bUNyZWF0ZSgpIEJ1bmRsZSBpbml0IGZhaWxlZCIpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBsdm1Db250cm9sKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAotICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgKnBhcmFtcykgewotICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotCi0gIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KLSAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOwotICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7Ci0KLSAgcGFyYW1zLT5DaE1hc2sgICAgID0gcGx2bUNvbmZpZ1BhcmFtcy0+Y2hNYXNrOwotICBwYXJhbXMtPk5yQ2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOwotICBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDEpIHsKLSAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POwotICB9IGVsc2UgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA9PSAyKSB7Ci0gICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOwotICB9IGVsc2UgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA+IDIgJiYgcGFyYW1zLT5OckNoYW5uZWxzIDw9IDgpIHsgLy8gRkNDXzIgRkNDXzgKLSAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7Ci0gIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCi0gIExWTV9Gc19lbiBzYW1wbGVSYXRlOwotICBzd2l0Y2ggKHBsdm1Db25maWdQYXJhbXMtPnNhbXBsaW5nRnJlcSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTEwMjU6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzExMDI1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTIwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2MDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzIyMDUwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjQwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyMDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg4MjAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOTYwMDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzk2MDAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgcGFyYW1zLT5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLQotICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKLSAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOwotICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7Ci0gIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7Ci0KLSAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gIGNvbnN0IGludCBlcVByZXNldExldmVsID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFQcmVzZXRMZXZlbDsKLSAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICBCYW5kRGVmc1tpXS5HYWluID0KLSAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzWyhGSVZFQkFORF9OVU1CQU5EUyAqIGVxUHJlc2V0TGV2ZWwpICsgaV07Ci0gIH0KLSAgcGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcUVuYWJsZTsKLSAvLyBDYXV0aW9uOiByYXcgcG9pbnRlciB0byBzdGFjayBkYXRhLCBzdG9yZWQgaW4gaW5zdGFuY2UgYnkgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzLgotICBwYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID0gJkJhbmREZWZzWzBdOwotCi0gIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgcGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA9IDA7Ci0gIHBhcmFtcy0+VkNfQmFsYW5jZSA9IHBsdm1Db25maWdQYXJhbXMtPnZjQmFsOwotCi0gIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPnRyZWJsZUVuYWJsZTsKLQotICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT047Ci0KLSAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCi0gIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmJhc3NFbmFibGU7Ci0KLSAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgTHZtU3RhdHVzID0KLSAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOwotICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLQotICBMdm1TdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwotCi0gIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgbHZtRXhlY3V0ZShmbG9hdCAqZmxvYXRJbiwgZmxvYXQgKmZsb2F0T3V0LCBzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcykgewotICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKLSAgcmV0dXJuCi0gICAgICBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgZmxvYXRJbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgIGZsb2F0T3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVMZW5ndGgsIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCi19Ci0KLWludCBsdm1NYWluUHJvY2VzcyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICpwUGFyYW1zLAotICAgICAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zLAotICAgICAgICAgICAgICAgICAgIEZJTEUgKmZpbnAsCi0gICAgICAgICAgICAgICAgICAgRklMRSAqZm91dCkgewotICBpbnQgZXJyQ29kZSA9IGx2bUNvbnRyb2wocENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMsIHBQYXJhbXMpOwotICBpZiAoZXJyQ29kZSkgewotICAgIEFMT0dFKCJFcnJvcjogbHZtQ29udHJvbCByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKLSAgICByZXR1cm4gZXJyQ29kZTsKLSAgfQotCi0gIGNvbnN0IGludCBjaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOwotICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSBwbHZtQ29uZmlnUGFyYW1zLT5mcmFtZUxlbmd0aDsKLSAgY29uc3QgaW50IGZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7ICAvLyBwcm9jZXNzaW5nIHNpemUKLSAgY29uc3QgaW50IGlvQ2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZkNoYW5uZWxzOwotICBjb25zdCBpbnQgaW9GcmFtZVNpemUgPSBpb0NoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCk7IC8vIGZpbGUgbG9hZCBzaXplCi0gIGNvbnN0IGludCBtYXhDaGFubmVsQ291bnQgPSBzdGQ6Om1heChjaGFubmVsQ291bnQsIGlvQ2hhbm5lbENvdW50KTsKLSAgLyoKLSAgICogTW9ubyBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0byAyIGNoYW5uZWxzIGludGVybmFsbHkgaW4gdGhlIHByb2Nlc3MgY2FsbAotICAgKiBieSBjb3B5aW5nIHRoZSBzYW1lIGRhdGEgaW50byB0aGUgc2Vjb25kIGNoYW5uZWwuCi0gICAqIEhlbmNlIHdoZW4gY2hhbm5lbENvdW50IGlzIDEsIG91dHB1dCBidWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBmb3IKLSAgICogMiBjaGFubmVscy4gVGhlIG1lbUFsbG9jQ2hDb3VudCB0YWtlcyBjYXJlIG9mIGFsbG9jYXRpb24gb2Ygc3VmZmljaWVudAotICAgKiBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLgotICAgKi8KLSAgY29uc3QgaW50IG1lbUFsbG9jQ2hDb3VudCA9IChjaGFubmVsQ291bnQgPT0gMSA/IDIgOiBjaGFubmVsQ291bnQpOwotCi0gIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7Ci0gIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXQoZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOwotICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7Ci0gIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdE91dChmcmFtZUxlbmd0aCAqIG1lbUFsbG9jQ2hDb3VudCk7Ci0KLSAgaW50IGZyYW1lQ291bnRlciA9IDA7Ci0gIHdoaWxlIChmcmVhZChpbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZmlucCkgPT0gKHNpemVfdClmcmFtZUxlbmd0aCkgewotICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKLSAgICAgICAgYWRqdXN0X2NoYW5uZWxzKGluLmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIGluLmRhdGEoKSwgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CitpbnQgbHZtQ3JlYXRlKHN0cnVjdCBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgbHZtQ29uZmlnUGFyYW1zX3QqIHBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QqIHBhcmFtcykgeworICAgIGludCByZXQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBOVUxMOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSAoQnVuZGxlZEVmZmVjdENvbnRleHQqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7CisgICAgaWYgKE5VTEwgPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKIAotICAgIC8vIE1vbm8gbW9kZSB3aWxsIHJlcGxpY2F0ZSB0aGUgZmlyc3QgY2hhbm5lbCB0byBhbGwgb3RoZXIgY2hhbm5lbHMuCi0gICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBhdWRpbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZwotICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCi0gICAgaWYgKHBsdm1Db25maWdQYXJhbXMtPm1vbm9Nb2RlICYmIGNoYW5uZWxDb3VudCA+IDEpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBhdXRvICpmcCA9ICZmbG9hdEluW2kgKiBjaGFubmVsQ291bnRdOwotICAgICAgICAgICAgc3RkOjpmaWxsKGZwICsgMSwgZnAgKyBjaGFubmVsQ291bnQsICpmcCk7IC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgPSBMVk1fVFJVRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOworCisgICAgLyogU2F2ZWQgc3RyZW5ndGggaXMgdXNlZCB0byByZXR1cm4gdGhlIGV4YWN0IHN0cmVuZ3RoIHRoYXQgd2FzIHVzZWQgaW4gdGhlCisgICAgICogc2V0IHRvIHRoZSBnZXQKKyAgICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKKyAgICAgKiBhdm9pZAorICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgICAqLworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgICB9CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOworICAgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbHZtQ29udHJvbChzdHJ1Y3QgRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGx2bUNvbmZpZ1BhcmFtc190KiBwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCogcGFyYW1zKSB7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisKKyAgICBwYXJhbXMtPkNoTWFzayA9IHBsdm1Db25maWdQYXJhbXMtPmNoTWFzazsKKyAgICBwYXJhbXMtPk5yQ2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICAgIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICAgIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fU1RFUkVPOworICAgIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID4gRkNDXzIgJiYgcGFyYW1zLT5OckNoYW5uZWxzIDw9IEZDQ18yNCkgeworICAgICAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9NVUxUSUNIQU5ORUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHBhcmFtcy0+U2FtcGxlUmF0ZSA9IGx2bUZzRm9yU2FtcGxlUmF0ZShwbHZtQ29uZmlnUGFyYW1zLT5zYW1wbGluZ0ZyZXEpOworICAgIGlmIChwYXJhbXMtPlNhbXBsZVJhdGUgPT0gTFZNX0ZTX0lOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoImx2bUNvbnRyb2wgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5jc0VuYWJsZTsKKyAgICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgICAgcGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICAgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IHBsdm1Db25maWdQYXJhbXMtPmVxUHJlc2V0TGV2ZWw7CisgICAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgICAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uR2FpbiA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1soRklWRUJBTkRfTlVNQkFORFMgKiBlcVByZXNldExldmVsKSArIGldOworICAgIH0KKyAgICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOworICAgIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCisgICAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICAgIC8qIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgICBwYXJhbXMtPlZDX0JhbGFuY2UgPSBwbHZtQ29uZmlnUGFyYW1zLT52Y0JhbDsKKworICAgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOworICAgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFZmZlY3RMZXZlbDsKKworICAgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09OOworCisgICAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgICAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKKworICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbHZtRXhlY3V0ZShmbG9hdCogZmxvYXRJbiwgZmxvYXQqIGZsb2F0T3V0LCBzdHJ1Y3QgRWZmZWN0Q29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCogcGx2bUNvbmZpZ1BhcmFtcykgeworICAgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICAgIHJldHVybiBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICBmbG9hdE91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVMZW5ndGgsICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworfQorCitpbnQgbHZtTWFpblByb2Nlc3MoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QqIHBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QqIHBsdm1Db25maWdQYXJhbXMsIEZJTEUqIGZpbnAsIEZJTEUqIGZvdXQpIHsKKyAgICBpbnQgZXJyQ29kZSA9IGx2bUNvbnRyb2wocENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMsIHBQYXJhbXMpOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogbHZtQ29udHJvbCByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgICAgcmV0dXJuIGVyckNvZGU7CisgICAgfQorCisgICAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgICAgY29uc3QgaW50IGZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIHNpemVvZihmbG9hdCk7ICAvLyBwcm9jZXNzaW5nIHNpemUKKyAgICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5mQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAgLy8gZmlsZSBsb2FkIHNpemUKKyAgICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXQoZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgaW50IGZyYW1lQ291bnRlciA9IDA7CisgICAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmaW5wKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7CisgICAgICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgICAgIC8vIE1vbm8gbW9kZSB3aWxsIHJlcGxpY2F0ZSB0aGUgZmlyc3QgY2hhbm5lbCB0byBhbGwgb3RoZXIgY2hhbm5lbHMuCisgICAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICAgICAgaWYgKHBsdm1Db25maWdQYXJhbXMtPm1vbm9Nb2RlICYmIGNoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGF1dG8qIGZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICAgICAgc3RkOjpmaWxsKGZwICsgMSwgZnAgKyBjaGFubmVsQ291bnQsICpmcCk7ICAvLyByZXBsaWNhdGUgY2ggMAorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgICAgIGVyckNvZGUgPSBsdm1FeGVjdXRlKGZsb2F0SW4uZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zKTsKKyAgICAgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG5FcnJvcjogbHZtRXhlY3V0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJDb2RlOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpZnJhbWVTaXplOyAgLy8gZWxpbWluYXRlIHdhcm5pbmcKKyNlbHNlCisgICAgICAgIG1lbWNweShmbG9hdE91dC5kYXRhKCksIGZsb2F0SW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGZyYW1lU2l6ZSk7CisjZW5kaWYKKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgICAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOworICAgICAgICB9CisgICAgICAgICh2b2lkKWZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZvdXQpOworICAgICAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7CisgICAgfQorICAgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsdm1Db25maWdQYXJhbXNfdCBsdm1Db25maWdQYXJhbXN7fTsgIC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQorICAgIGNvbnN0IGNoYXIqIGluZmlsZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogb3V0ZmlsZSA9IG51bGxwdHI7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgICAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICAgICAgICBpbmZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLW86IiwgMykpIHsKKyAgICAgICAgICAgIG91dGZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZzOiIsIDQpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICAgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJgorICAgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYKKyAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKKyAgICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWRcbiIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoTWFzazoiLCA4KSkgeworICAgICAgICAgICAgY29uc3QgaW50IGNoTWFza0NvbmZpZ0lkeCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgICAgICAgaWYgKGNoTWFza0NvbmZpZ0lkeCA8IDAgfHwgKHNpemVfdCljaE1hc2tDb25maWdJZHggPj0gc3RkOjpzaXplKGx2bUNvbmZpZ0NoTWFzaykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgQ2hhbm5lbCBNYXNrIDogJWRcbiIsIGNoTWFza0NvbmZpZ0lkeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gbHZtQ29uZmlnQ2hNYXNrW2NoTWFza0NvbmZpZ0lkeF07CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuY2hNYXNrID0gY2hNYXNrOworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXZjQmFsOiIsIDcpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdmNCYWxhbmNlID0gYXRvaShhcmd2W2ldICsgNyk7CisgICAgICAgICAgICBpZiAodmNCYWxhbmNlID4gOTYgfHwgdmNCYWxhbmNlIDwgLTk2KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIHZvbHVtZSBiYWxhbmNlIHZhbHVlOiAlZFxuIiwgdmNCYWxhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy52Y0JhbCA9IHZjQmFsYW5jZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgeworICAgICAgICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOworICAgICAgICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBmaWxlIGNoYW5uZWxzIDogJWRcbiIsIGZDaGFubmVscyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGZDaGFubmVsczsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItTSIpKSB7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMubW9ub01vZGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgfHwKKyAgICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgQmFzcyBFZmZlY3QgTGV2ZWwgOiAlZFxuIiwgYmFzc0VmZmVjdExldmVsKTsKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFZmZlY3RMZXZlbCA9IGJhc3NFZmZlY3RMZXZlbDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgeworICAgICAgICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7CisgICAgICAgICAgICBjb25zdCBpbnQgbnVtUHJlc2V0THZscyA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgICAgICAgICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+PSBudW1QcmVzZXRMdmxzIHx8IGVxUHJlc2V0TGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgRXF1YWxpemVyIFByZXNldCA6ICVkXG4iLCBlcVByZXNldExldmVsKTsKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdHJlYmxlTHZsOiIsIDExKSkgeworICAgICAgICAgICAgY29uc3QgaW50IHRyZWJsZUVmZmVjdExldmVsID0gYXRvaShhcmd2W2ldICsgMTEpOworICAgICAgICAgICAgaWYgKHRyZWJsZUVmZmVjdExldmVsID4gTFZNX1RFX01BWF9FRkZFQ1RMRVZFTCB8fAorICAgICAgICAgICAgICAgIHRyZWJsZUVmZmVjdExldmVsIDwgTFZNX1RFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIFRyZWJsZSBFZmZlY3QgTGV2ZWwgOiAlZFxuIiwgdHJlYmxlRWZmZWN0TGV2ZWwpOworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRWZmZWN0TGV2ZWwgPSB0cmVibGVFZmZlY3RMZXZlbDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYkUiKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFbmFibGUgPSBMVk1fQkVfT047CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7CisgICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItY3NFIikpIHsKKyAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jc0VuYWJsZSA9IExWTV9NT0RFX09OOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQotI2lmbmRlZiBCWVBBU1NfRVhFQwotICAgIGVyckNvZGUgPSBsdm1FeGVjdXRlKGZsb2F0SW4uZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zKTsKLSAgICBpZiAoZXJyQ29kZSkgewotICAgICAgcHJpbnRmKCJcbkVycm9yOiBsdm1FeGVjdXRlIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOwotICAgICAgcmV0dXJuIGVyckNvZGU7Ci0gICAgfQogCi0gICAgKHZvaWQpZnJhbWVTaXplOyAvLyBlbGltaW5hdGUgd2FybmluZwotI2Vsc2UKLSAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOwotI2VuZGlmCi0gICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOwotICAgIGlmIChpb0NoYW5uZWxDb3VudCAhPSBjaGFubmVsQ291bnQpIHsKLSAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOwotICAgIH0KLSAgICAodm9pZCkgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZm91dCk7Ci0gICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOwotICB9Ci0gIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOwotICByZXR1cm4gMDsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgewotICBpZiAoYXJnYyA9PSAxKSB7Ci0gICAgcHJpbnRVc2FnZSgpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGx2bUNvbmZpZ1BhcmFtc190IGx2bUNvbmZpZ1BhcmFtc3t9OyAvLyBkZWZhdWx0IGluaXRpYWxpemUKLSAgY29uc3QgY2hhciAqaW5maWxlID0gbnVsbHB0cjsKLSAgY29uc3QgY2hhciAqb3V0ZmlsZSA9IG51bGxwdHI7Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICAgIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWk6IiwgMykpIHsKLSAgICAgIGluZmlsZSA9IGFyZ3ZbaV0gKyAzOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1vOiIsIDMpKSB7Ci0gICAgICBvdXRmaWxlID0gYXJndltpXSArIDM7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZzOiIsIDQpKSB7Ci0gICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7Ci0gICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgotICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKLSAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgotICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCi0gICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgewotICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBTYW1wbGluZyBGcmVxdWVuY3kgOiAlZFxuIiwgc2FtcGxpbmdGcmVxKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbHZtQ29uZmlnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IHNhbXBsaW5nRnJlcTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2hNYXNrOiIsIDgpKSB7Ci0gICAgICBjb25zdCBpbnQgY2hNYXNrQ29uZmlnSWR4ID0gYXRvaShhcmd2W2ldICsgOCk7Ci0gICAgICBpZiAoY2hNYXNrQ29uZmlnSWR4IDwgMCB8fCAoc2l6ZV90KWNoTWFza0NvbmZpZ0lkeCA+PSBzdGQ6OnNpemUobHZtQ29uZmlnQ2hNYXNrKSkgewotICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgQ2hhbm5lbCBNYXNrIDogJWRcbiIsIGNoTWFza0NvbmZpZ0lkeCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IGx2bUNvbmZpZ0NoTWFza1tjaE1hc2tDb25maWdJZHhdOwotICAgICAgbHZtQ29uZmlnUGFyYW1zLmNoTWFzayA9IGNoTWFzazsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoTWFzayk7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXZjQmFsOiIsIDcpKSB7Ci0gICAgICBjb25zdCBpbnQgdmNCYWxhbmNlID0gYXRvaShhcmd2W2ldICsgNyk7Ci0gICAgICBpZiAodmNCYWxhbmNlID4gOTYgfHwgdmNCYWxhbmNlIDwgLTk2KSB7Ci0gICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCB2b2x1bWUgYmFsYW5jZSB2YWx1ZTogJWRcbiIsIHZjQmFsYW5jZSk7Ci0gICAgICB9Ci0gICAgICBsdm1Db25maWdQYXJhbXMudmNCYWwgPSB2Y0JhbGFuY2U7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgewotICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOwotICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgewotICAgICAgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIG51bWJlciBvZiBmaWxlIGNoYW5uZWxzIDogJWRcbiIsIGZDaGFubmVscyk7Ci0gICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBmQ2hhbm5lbHM7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sIi1NIikpIHsKLSAgICAgICAgICBsdm1Db25maWdQYXJhbXMubW9ub01vZGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1iYXNzbHZsOiIsIDkpKSB7Ci0gICAgICBjb25zdCBpbnQgYmFzc0VmZmVjdExldmVsID0gYXRvaShhcmd2W2ldICsgOSk7Ci0gICAgICBpZiAoYmFzc0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCB8fCBiYXNzRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMKSB7Ci0gICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEJhc3MgRWZmZWN0IExldmVsIDogJWRcbiIsCi0gICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwpOworICAgIGlmIChpbmZpbGUgPT0gbnVsbHB0ciB8fCBvdXRmaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOwogICAgICAgICBwcmludFVzYWdlKCk7CiAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRWZmZWN0TGV2ZWwgPSBiYXNzRWZmZWN0TGV2ZWw7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWVxUHJlc2V0OiIsIDEwKSkgewotICAgICAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyAxMCk7Ci0gICAgICBjb25zdCBpbnQgbnVtUHJlc2V0THZscyA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7Ci0gICAgICBpZiAoZXFQcmVzZXRMZXZlbCA+PSBudW1QcmVzZXRMdmxzIHx8IGVxUHJlc2V0TGV2ZWwgPCAwKSB7Ci0gICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIEVxdWFsaXplciBQcmVzZXQgOiAlZFxuIiwgZXFQcmVzZXRMZXZlbCk7Ci0gICAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxUHJlc2V0TGV2ZWwgPSBlcVByZXNldExldmVsOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWJFIikpIHsKLSAgICAgIGx2bUNvbmZpZ1BhcmFtcy5iYXNzRW5hYmxlID0gTFZNX0JFX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWVxRSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMuZXFFbmFibGUgPSBMVk1fRVFOQl9PTjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi10RSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMudHJlYmxlRW5hYmxlID0gTFZNX1RFX09OOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWNzRSIpKSB7Ci0gICAgICBsdm1Db25maWdQYXJhbXMuY3NFbmFibGUgPSBMVk1fTU9ERV9PTjsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKLSAgICAgIHByaW50VXNhZ2UoKTsKLSAgICAgIHJldHVybiAwOwogICAgIH0KLSAgfQogCi0gIGlmIChpbmZpbGUgPT0gbnVsbHB0ciB8fCBvdXRmaWxlID09IG51bGxwdHIpIHsKLSAgICBwcmludGYoIkVycm9yOiBtaXNzaW5nIGlucHV0L291dHB1dCBmaWxlc1xuIik7Ci0gICAgcHJpbnRVc2FnZSgpOwotICAgIHJldHVybiAtMTsKLSAgfQorICAgIEZJTEUqIGZpbnAgPSBmb3BlbihpbmZpbGUsICJyYiIpOworICAgIGlmIChmaW5wID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzIiwgaW5maWxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKLSAgaWYgKGZpbnAgPT0gbnVsbHB0cikgewotICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7Ci0gICAgcmV0dXJuIC0xOwotICB9CisgICAgRklMRSogZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICAgIGlmIChmb3V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgICAgICBmY2xvc2UoZmlucCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOwotICBpZiAoZm91dCA9PSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIEVmZmVjdENvbnRleHQgY29udGV4dDsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsKKyAgICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgICAgaWYgKGVyckNvZGUgPT0gMCkgeworICAgICAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgICAgICBpZiAoZXJyQ29kZSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgICB9CiAgICAgZmNsb3NlKGZpbnApOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIEVmZmVjdENvbnRleHQgY29udGV4dDsKLSAgTFZNX0NvbnRyb2xQYXJhbXNfdCBwYXJhbXM7Ci0gIGludCBlcnJDb2RlID0gbHZtQ3JlYXRlKCZjb250ZXh0LCAmbHZtQ29uZmlnUGFyYW1zLCAmcGFyYW1zKTsKLSAgaWYgKGVyckNvZGUgPT0gMCkgewotICAgIGVyckNvZGUgPSBsdm1NYWluUHJvY2VzcygmY29udGV4dCwgJnBhcmFtcywgJmx2bUNvbmZpZ1BhcmFtcywgZmlucCwgZm91dCk7Ci0gICAgaWYgKGVyckNvZGUgIT0gMCkgewotICAgICAgcHJpbnRmKCJFcnJvcjogbHZtTWFpblByb2Nlc3MgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIixlcnJDb2RlKTsKKyAgICBmY2xvc2UoZm91dCk7CisgICAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoJmNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkVycm9yOiBsdm1DcmVhdGUgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIiwgZXJyQ29kZSk7Ci0gIH0KLSAgZmNsb3NlKGZpbnApOwotICBmY2xvc2UoZm91dCk7Ci0gIC8qIEZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXJzICovCi0gIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dCAhPSBudWxscHRyKSB7Ci0gICAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gbnVsbHB0cikgewotICAgICAgTHZtRWZmZWN0X2ZyZWUoJmNvbnRleHQpOwotICAgIH0KLSAgICBmcmVlKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0KTsKLSAgfQogCi0gIGlmIChlcnJDb2RlKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNjk3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3JldmVyYl90ZXN0LmNwcApAQCAtMCwwICsxLDQwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0UmV2ZXJiLmgiCisKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCisvLyBHbG9iYWwgVmFyaWFibGVzCitlbnVtIFJldmVyYlBhcmFtcyB7CisgICAgQVJHX0hFTFAgPSAxLAorICAgIEFSR19JTlBVVCwKKyAgICBBUkdfT1VUUFVULAorICAgIEFSR19GUywKKyAgICBBUkdfQ0hfTUFTSywKKyAgICBBUkdfUFJFU0VULAorICAgIEFSR19BVVgsCisgICAgQVJHX01PTk9fTU9ERSwKKyAgICBBUkdfRklMRV9DSCwKK307CisKK2NvbnN0IGVmZmVjdF91dWlkX3Qga1JldmVyYlV1aWRzW10gPSB7CisgICAgICAgIHsweDE3MmNkZjAwLAorICAgICAgICAgMHhhM2JjLAorICAgICAgICAgMHgxMWRmLAorICAgICAgICAgMHhhNzJmLAorICAgICAgICAgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHByZXNldC1pbnNlcnQgbW9kZQorICAgICAgICB7MHhmMjlhMTQwMCwKKyAgICAgICAgIDB4YTNiYiwKKyAgICAgICAgIDB4MTFkZiwKKyAgICAgICAgIDB4OGRkYywKKyAgICAgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtYXV4IG1vZGUKK307CisKKy8vIHN0cnVjdHVyZXMKK3N0cnVjdCByZXZlcmJDb25maWdQYXJhbXNfdCB7CisgICAgaW50IGZDaGFubmVscyA9IDI7CisgICAgaW50IG1vbm9Nb2RlID0gZmFsc2U7CisgICAgaW50IGZyYW1lTGVuZ3RoID0gMjU2OworICAgIGludCBwcmVzZXQgPSAwOworICAgIGludCBuckNoYW5uZWxzID0gMjsKKyAgICBpbnQgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIGludCBhdXhpbGlhcnkgPSAwOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrUmV2ZXJiQ29uZmlnQ2hNYXNrW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYsCisgICAgICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183LAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzksCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMCwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzExLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE0LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTUsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE3LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTgsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xOSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIwLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjEsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIzLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjQsCit9OworCitjb25zdGV4cHIgaW50IGtSZXZlcmJDb25maWdDaE1hc2tDb3VudCA9IHN0ZDo6c2l6ZShrUmV2ZXJiQ29uZmlnQ2hNYXNrKTsKKworaW50IHJldmVyYkNyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QqIHBFZmZlY3RIYW5kbGUsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZywgaW50IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvSWQsIGludCBhdXhGbGFnKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZrUmV2ZXJiVXVpZHNbYXV4RmxhZ10sIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJSZXZlcmIgY3JlYXRlIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCBwQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgICAgcmV0dXJuIHJlcGx5OworfQorCitpbnQgcmV2ZXJiU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICAgIGVmZmVjdF9wYXJhbV90KiBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICBlZmZlY3RQYXJhbS0+dnNpemUgPSBzaXplb2YocGFyYW1EYXRhWzFdKTsKKyAgICBpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgICAgZnJlZShlZmZlY3RQYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJSZXZlcmIgc2V0IGNvbmZpZyByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiBbb3B0aW9uc11cbiIpOworICAgIHByaW50ZigiXG53aGVyZSBvcHRpb25zIGFyZSwgIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIHBhdGggdG8gdGhlIGlucHV0IGZpbGUiKTsKKyAgICBwcmludGYoIlxuICAgICAtLW91dHB1dCA8b3V0cHV0ZmlsZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICAgIHByaW50ZigiXG4gICAgIC0taGVscCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIHByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1jaE1hc2sgPGNoYW5uZWxfbWFzaz5cbiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDAgIC0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEgIC0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMyAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA2ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDcgIC0gQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEwIC0gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDUgY2g6ICgxIDw8IDUpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEzIC0gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE1IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMTYgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE4IC0gQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDE5IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNyBjaDogKDEgPDwgNykgLSAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMjEgLSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMjIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA4IGNoOiAoMSA8PCA4KSAtIDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWZzIDxzYW1wbGluZ19mcmVxPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbiBIeiwgZGVmYXVsdCA0ODAwMC4iKTsKKyAgICBwcmludGYoIlxuICAgICAtLXByZXNldCA8cHJlc2V0X3ZhbHVlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSBOb25lIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIFNtYWxsIFJvb20iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAyIC0gTWVkaXVtIFJvb20iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAzIC0gTGFyZ2UgUm9vbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDQgLSBNZWRpdW0gSGFsbCIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBMYXJnZSBIYWxsIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgNiAtIFBsYXRlIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1mY2ggPGZpbGVfY2hhbm5lbHM+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzIGluIGlucHV0IGZpbGUgKDEgdGhyb3VnaCA4KSwgZGVmYXVsdCAxIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1NIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOworICAgIHByaW50ZigiXG4gICAgIC0tYXV4IDxhdXhpbGlhcnlfZmxhZz4gIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMCAtIEluc2VydCBNb2RlIG9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIGF1eGlsaWFyeSBNb2RlIG9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPT0gMSkgeworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgfQorICAgIHJldmVyYkNvbmZpZ1BhcmFtc190IHJldkNvbmZpZ1BhcmFtc3t9OyAgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgICAgY29uc3QgY2hhciogaW5wdXRGaWxlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBvdXRwdXRGaWxlID0gbnVsbHB0cjsKKworICAgIGNvbnN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKKyAgICAgICAgICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSEVMUH0sCisgICAgICAgICAgICB7ImlucHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19JTlBVVH0sCisgICAgICAgICAgICB7Im91dHB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfT1VUUFVUfSwKKyAgICAgICAgICAgIHsiZnMiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZTfSwKKyAgICAgICAgICAgIHsiY2hNYXNrIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19DSF9NQVNLfSwKKyAgICAgICAgICAgIHsicHJlc2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19QUkVTRVR9LAorICAgICAgICAgICAgeyJhdXgiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FVWH0sCisgICAgICAgICAgICB7Ik0iLCBub19hcmd1bWVudCwgJnJldkNvbmZpZ1BhcmFtcy5tb25vTW9kZSwgdHJ1ZX0sCisgICAgICAgICAgICB7ImZjaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRklMRV9DSH0sCisgICAgICAgICAgICB7bnVsbHB0ciwgMCwgbnVsbHB0ciwgMH0sCisgICAgfTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGNvbnN0IGludCBvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciogY29uc3QqKWFyZ3YsICJpOm86IiwgbG9uZ19vcHRzLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG9wdCA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgICAgIGNhc2UgQVJHX0hFTFA6CisgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgICAgICAgICBjYXNlIEFSR19JTlBVVDogeworICAgICAgICAgICAgICAgIGlucHV0RmlsZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19PVVRQVVQ6IHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGaWxlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0ZTOiB7CisgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLnNhbXBsZVJhdGUgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19DSF9NQVNLOiB7CisgICAgICAgICAgICAgICAgaW50IGNoTWFza0lkeCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hNYXNrSWR4IDwgMCBvciBjaE1hc2tJZHggPiBrUmV2ZXJiQ29uZmlnQ2hNYXNrQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNoYW5uZWwgTWFzayBpbmRleCBub3QgaW4gY29ycmVjdCByYW5nZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmNoTWFzayA9IGtSZXZlcmJDb25maWdDaE1hc2tbY2hNYXNrSWR4XTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX1BSRVNFVDogeworICAgICAgICAgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5wcmVzZXQgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BVVg6IHsKKyAgICAgICAgICAgICAgICByZXZDb25maWdQYXJhbXMuYXV4aWxpYXJ5ID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfTU9OT19NT0RFOiB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19GSUxFX0NIOiB7CisgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVzXG4iKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisKKyAgICBpZiAoaW5wdXRGcCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbnB1dEZpbGUpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChvdXRwdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIG91dHB1dCBmaWxlc1xuIik7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisKKyAgICBpZiAob3V0cHV0RnAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGUpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGludDMyX3Qgc2Vzc2lvbklkID0gMTsKKyAgICBpbnQzMl90IGlvSWQgPSAxOworICAgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gcmV2Q29uZmlnUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHJldkNvbmZpZ1BhcmFtcy5jaE1hc2s7CisgICAgY29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHJldmVyYkNyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGUgZWZmZWN0IGNhbGwgcmV0dXJuZWQgZXJyb3IgJWkiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICAoKmVmZmVjdEhhbmRsZSktPmNvbW1hbmQoZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX0VOQUJMRSwgMCwgbnVsbHB0ciwgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiU2V0Q29uZmlnUGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgKHVpbnQzMl90KXJldkNvbmZpZ1BhcmFtcy5wcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCByZXZlcmIgcHJlc2V0LiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICByZXZDb25maWdQYXJhbXMubnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhyZXZDb25maWdQYXJhbXMuY2hNYXNrKTsKKyAgICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLm5yQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcmV2Q29uZmlnUGFyYW1zLmZyYW1lTGVuZ3RoOworI2lmZGVmIEJZUEFTU19FWEVDCisgICAgY29uc3QgaW50IGZyYW1lU2l6ZSA9IChpbnQpY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKKyNlbmRpZgorICAgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgIGNvbnN0IGludCBtYXhDaGFubmVsQ291bnQgPSBzdGQ6Om1heChjaGFubmVsQ291bnQsIGlvQ2hhbm5lbENvdW50KTsKKworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdE91dChmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKworICAgIHdoaWxlIChmcmVhZChpbi5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgaW5wdXRGcC5nZXQoKSkgPT0gKHNpemVfdClmcmFtZUxlbmd0aCkgeworICAgICAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCisgICAgICAgIGlmIChyZXZDb25maWdQYXJhbXMubW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXV0byogZnAgPSAmZmxvYXRJbltpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgIC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyOworICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUNvdW50ID0gb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUxlbmd0aDsKKyAgICAgICAgaW5wdXRCdWZmZXIuZjMyID0gZmxvYXRJbi5kYXRhKCk7CisgICAgICAgIG91dHB1dEJ1ZmZlci5mMzIgPSBmbG9hdE91dC5kYXRhKCk7CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCplZmZlY3RIYW5kbGUpLT5wcm9jZXNzKGVmZmVjdEhhbmRsZSwgJmlucHV0QnVmZmVyLCAmb3V0cHV0QnVmZmVyKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIGNoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICAgICAgfQorICAgICAgICAodm9pZClmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBvdXRwdXRGcC5nZXQoKSk7CisgICAgICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIHJlbGVhc2UgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKaW5kZXggODg1OTk0Yy4uMGZlZjMzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwCkBAIC0yMiw4NCArMjIsODMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+Ci1zdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgewotICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKLSAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKLSAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7Ci0gIEEgc2lnbmFse307Ci0gIEEgbm9pc2V7fTsKK3N0ZDo6cGFpcjxBLCBBPiBnZXRTaWduYWxOb2lzZShGSUxFKiBmaW5wLCBGSUxFKiBmcmVmKSB7CisgICAgY29uc3RleHByIHNpemVfdCBmcmFtZXNpemUgPSAyNTY7CisgICAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgICBzdGQ6OnZlY3RvcjxUPiByZWYoZnJhbWVzaXplKTsKKyAgICBBIHNpZ25hbHt9OworICAgIEEgbm9pc2V7fTsKIAotICBmb3IgKDs7KSB7Ci0gICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOwotICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOwotICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgewotICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7Ci0gICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgICAgICBjb25zdCBzaXplX3QgcmVhZF9zYW1wbGVzX3JlZiA9IGZyZWFkKCZyZWZbMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmcmVmKTsKKyAgICAgICAgaWYgKHJlYWRfc2FtcGxlc19pbiAhPSByZWFkX3NhbXBsZXNfcmVmKSB7CisgICAgICAgICAgICBwcmludGYoImZpbGUgc2l6ZXMgZG8gbm90IG1hdGNoIChsYXN0ICV6dSAlenUpIiwgcmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICAgICAgICAgIHJlYWRfc2FtcGxlc19pbiA9IHN0ZDo6bWluKHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4ge3NpZ25hbCwgbm9pc2V9OworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVhZF9zYW1wbGVzX2luOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKKyAgICAgICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICAgICAgIHNpZ25hbCArPSB2YWx1ZSAqIHZhbHVlOworICAgICAgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB7IHNpZ25hbCwgbm9pc2UgfTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkX3NhbXBsZXNfaW47ICsraSkgewotICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKLSAgICAgICBjb25zdCBBIGRpZmYoQShpbltpXSkgLSB2YWx1ZSk7Ci0gICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7Ci0gICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7Ci0gICAgfQotICB9CiB9CiAKIHZvaWQgcHJpbnRVc2FnZSgpIHsKLSAgcHJpbnRmKCJcblVzYWdlOiAiKTsKLSAgcHJpbnRmKCJcbiAgICAgc25yIDxyZWZfZmlsZT4gPHRlc3RfZmlsZT4gW29wdGlvbnNdXG4iKTsKLSAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKLSAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHdpbGwgYmUgdGFrZW4gYXMgcHVyZSBzaWduYWwiKTsKLSAgcHJpbnRmKCJcbiAgICAgPHRlc3RfZmlsZT4gaXMgdGVzdCBmaWxlIGZvciBzbnIgY2FsY3VsYXRpb24iKTsKLSAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOwotICBwcmludGYoIlxuIik7Ci0gIHByaW50ZigiXG4gICAgIC1wY21fZm9ybWF0OjxwY20gZm9ybWF0IG9mIGlucHV0IGZpbGVzPiIpOwotICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOwotICBwcmludGYoIlxuICAgICAgICAgICAxIC0gMzIgYml0IGZsb2F0Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOwotICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7Ci0gIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSBuZWdhdGl2ZSBpbmZpbml0eVxuXG4iKTsKKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIHNuciA8cmVmX2ZpbGU+IDx0ZXN0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICAgIHByaW50ZigiXG4gICAgIDx0ZXN0X2ZpbGU+IGlzIHRlc3QgZmlsZSBmb3Igc25yIGNhbGN1bGF0aW9uIik7CisgICAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIlxuICAgICAtcGNtX2Zvcm1hdDo8cGNtIGZvcm1hdCBvZiBpbnB1dCBmaWxlcz4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOwogfQogCi1pbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7Ci0gIGlmIChhcmdjIDwgMykgewotICAgIHByaW50VXNhZ2UoKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50IHBjbV9mb3JtYXQgPSAwOwotICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7Ci0gIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKLSAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgewotICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7Ci0gICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9Ci0gIGlmIChmaW5wID09IG51bGxwdHIgfHwgZnJlZiA9PSBudWxscHRyKSB7Ci0gICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGludCByZXQgPSBFWElUX1NVQ0NFU1M7Ci0gIGF1dG8gc24gPSBwY21fZm9ybWF0ID09IDAKLSAgICAgID8gZ2V0U2lnbmFsTm9pc2U8c2hvcnQ+KGZpbnAsIGZyZWYpCi0gICAgICA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKLSAgaWYgKHNuLmZpcnN0ID4gMC5mICYmIHNuLnNlY29uZCA+IDAuZikgewotICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOwotICAgIC8vIGNvbXBhcmUgdGhlIG1lYXN1cmVkIHNuciB2YWx1ZSB3aXRoIHRocmVzaG9sZAotICAgIGlmIChzbnIgPCB0aHIpIHsKLSAgICAgIHByaW50ZigiJS42ZiBsZXNzIHRoYW4gdGhyZXNob2xkICUuNmZcbiIsIHNuciwgdGhyKTsKLSAgICAgIHJldCA9IEVYSVRfRkFJTFVSRTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgIGludCBwY21fZm9ybWF0ID0gMDsKKyAgICBmbG9hdCB0aHIgPSAtc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisgICAgRklMRSogZnJlZiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIEZJTEUqIGZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgICBmb3IgKGludCBpID0gMzsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXRocjoiLCA1KSkgeworICAgICAgICAgICAgdGhyID0gYXRvZihhcmd2W2ldICsgNSk7CisgICAgICAgIH0KICAgICB9Ci0gIH0KLSAgZmNsb3NlKGZpbnApOwotICBmY2xvc2UoZnJlZik7CisgICAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKyAgICBhdXRvIHNuID0KKyAgICAgICAgICAgIHBjbV9mb3JtYXQgPT0gMCA/IGdldFNpZ25hbE5vaXNlPHNob3J0PihmaW5wLCBmcmVmKSA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKKyAgICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOworICAgICAgICAvLyBjb21wYXJlIHRoZSBtZWFzdXJlZCBzbnIgdmFsdWUgd2l0aCB0aHJlc2hvbGQKKyAgICAgICAgaWYgKHNuciA8IHRocikgeworICAgICAgICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgICAgICAgICAgcmV0ID0gRVhJVF9GQUlMVVJFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmaW5wKTsKKyAgICBmY2xvc2UoZnJlZik7CiAKLSAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IGFmYzQyMjAuLmUxNjllM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTEsNSArMSwyNCBAQAogLy8gbXVzaWMgYnVuZGxlIHdyYXBwZXIKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX2x2bV93cmFwcGVyX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfbHZtX3dyYXBwZXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmJ1bmRsZXdyYXBwZXIiLAogCiAgICAgYXJjaDogewpAQCAtOSwxMSArMjgsMTEgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsiQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAiXSwKIAogICAgIGNwcGZsYWdzOiBbCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKLSAgICAgICAgIi1EU1VQUE9SVF9NQyIsCiAKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXJyb3IiLApAQCAtMjYsNyArNDUsNiBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKQEAgLTM5LDcgKzU3LDcgQEAKIH0KIAogLy8gcmV2ZXJiIHdyYXBwZXIKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJyZXZlcmJ3cmFwcGVyIiwKIAogICAgIGFyY2g6IHsKQEAgLTQ5LDYgKzY3LDcgQEAKICAgICB9LAogCiAgICAgdmVuZG9yOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIHNyY3M6IFsiUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAiXSwKIAogICAgIGNwcGZsYWdzOiBbCkBAIC02NSw3ICs4NCw2IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKaW5kZXggNmZjYTBlNy4uZGY2NDY3NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiB0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKICNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJCdW5kbGUiCi0jZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KQEAgLTQyLDI2ICs0MiwzMyBAQAogI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKICNkZWZpbmUgQUxPR1ZWIEFMT0dWCiAjZWxzZQotI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlIChmYWxzZSkKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIFwKKyAgICBkbyB7ICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlIChmYWxzZSkKICNlbmRpZgogCi0jZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKXtcCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fTlVMTEFERFJFU1Mpe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fQUxJR05NRU5URVJST1Ipe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJiYWQgYWxpZ25tZW50IHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAotICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKXtcCi0gICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAotICAgICAgICAgICAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAotICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0Upe1wKLSAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgYnkgJXMgaW4gJXNcbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fTlVMTEFERFJFU1MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fQUxJR05NRU5URVJST1IpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fSU5WQUxJRE5VTVNBTVBMRVMpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVk1fT1VUT0ZSQU5HRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCiAvLyBOYW1lc3BhY2VzCkBAIC03NCwyMCArODEsMjEgQEAKIGludCBTZXNzaW9uSW5kZXhbTFZNX01BWF9TRVNTSU9OU107CiAKIC8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotI2RlZmluZSBDSEVDS19BUkcoY29uZCkgeyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIjY29uZCk7ICAgICAgXAotICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19CisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCEoY29uZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCiAvLyBOWFAgU1cgQmFzc0Jvb3N0IFVVSUQKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0Jhc3NCb29zdERlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsweDA2MzRmMjIwLCAweGRkZDQsIDB4MTFkYiwgMHhhMGZjLCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfX0sCi0gICAgICAgIHsweDg2MzFmMzAwLCAweDcyZTIsIDB4MTFkZiwgMHhiNTdlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAvLyB1dWlkCisgICAgICAgIHsweDA2MzRmMjIwLCAweGRkZDQsIDB4MTFkYiwgMHhhMGZjLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICB7MHg4NjMxZjMwMCwgMHg3MmUyLCAweDExZGYsIDB4YjU3ZSwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHV1aWQKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQKLSAgICAgICAgfCBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCksCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQgfAorICAgICAgICAgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpLAogICAgICAgICBCQVNTX0JPT1NUX0NVUF9MT0FEX0FSTTlFLAogICAgICAgICBCVU5ETEVfTUVNX1VTQUdFLAogICAgICAgICAiRHluYW1pYyBCYXNzIEJvb3N0IiwKQEAgLTk5LDggKzEwNyw4IEBACiAgICAgICAgIHsweDM3Y2MyYzAwLCAweGRkZGQsIDB4MTFkYiwgMHg4NTc3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICB7MHgxZDQwMzNjMCwgMHg4NTU3LCAweDExZGYsIDB4OWYyZCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9MQVNUIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORAotICAgICAgICB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUIHwgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1QgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EIHwKKyAgICAgICAgIEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUsCiAgICAgICAgIEJVTkRMRV9NRU1fVVNBR0UsCiAgICAgICAgICJWaXJ0dWFsaXplciIsCkBAIC0xMDksOCArMTE3LDggQEAKIAogLy8gTlhQIFNXIEVxdWFsaXplciBVVUlECiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdFcXVhbGl6ZXJEZXNjcmlwdG9yID0gewotICAgICAgICB7MHgwYmVkNDMwMCwgMHhkZGQ2LCAweDExZGIsIDB4OGYzNCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdHlwZQotICAgICAgICB7MHhjZTc3MmYyMCwgMHg4NDdkLCAweDExZGYsIDB4YmIxNywgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgLy8gdXVpZCBFcSBOWFAKKyAgICAgICAgezB4MGJlZDQzMDAsIDB4ZGRkNiwgMHgxMWRiLCAweDhmMzQsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB0eXBlCisgICAgICAgIHsweGNlNzcyZjIwLCAweDg0N2QsIDB4MTFkZiwgMHhiYjE3LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZCBFcSBOWFAKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCiAgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCB8IEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgRVFVQUxJWkVSX0NVUF9MT0FEX0FSTTlFLApAQCAtMTIxLDggKzEyOSw4IEBACiAKIC8vIE5YUCBTVyBWb2x1bWUgVVVJRAogY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBnVm9sdW1lRGVzY3JpcHRvciA9IHsKLSAgICAgICAgezB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwKLSAgICAgICAgezB4MTE5MzQxYTAsIDB4ODQ2OSwgMHgxMWRmLCAweDgxZjksIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9fSwgLy91dWlkIFZPTCBOWFAKKyAgICAgICAgezB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIHsweDExOTM0MWEwLCAweDg0NjksIDB4MTFkZiwgMHg4MWY5LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZCBWT0wgTlhQCiAgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAogICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQgfCBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVCB8IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMKSwKICAgICAgICAgVk9MVU1FX0NVUF9MT0FEX0FSTTlFLApAQCAtMTMyLDc3ICsxNDAsNTAgQEAKIH07CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLXZvaWQgTHZtR2xvYmFsQnVuZGxlX2luaXQgICAgICAodm9pZCk7Ci1pbnQgIEx2bUJ1bmRsZV9pbml0ICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKLWludCAgTHZtRWZmZWN0X2VuYWJsZSAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwotaW50ICBMdm1FZmZlY3RfZGlzYWJsZSAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Ci12b2lkIEx2bUVmZmVjdF9mcmVlICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKLWludCAgRWZmZWN0X3NldENvbmZpZyAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7Ci12b2lkIEVmZmVjdF9nZXRDb25maWcgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwotaW50ICBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKLWludCAgQmFzc0Jvb3N0X2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKLWludCAgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKLWludCAgRXF1YWxpemVyX2dldFBhcmFtZXRlciAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50ICBWb2x1bWVfc2V0UGFyYW1ldGVyICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKTsKLWludCAgVm9sdW1lX2dldFBhcmFtZXRlciAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBib29sIGVuYWJsZWQpOwordm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCh2b2lkKTsKK2ludCBMdm1CdW5kbGVfaW5pdChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgTHZtRWZmZWN0X2VuYWJsZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgTHZtRWZmZWN0X2Rpc2FibGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQpOworaW50IEVmZmVjdF9zZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZyk7Cit2b2lkIEVmZmVjdF9nZXRDb25maWcoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZyk7CitpbnQgQmFzc0Jvb3N0X3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgVmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSk7CitpbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBWb2x1bWVfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKTsKK2ludCBWb2x1bWVfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBib29sIGVuYWJsZWQpOwogCiAvKiBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24gKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpb0lkIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAgKnBIYW5kbGUpeworZXh0ZXJuICJDIiBpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogaW9JZCBfX3VudXNlZCAqLywgZWZmZWN0X2hhbmRsZV90KiBwSGFuZGxlKSB7CiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IHNlc3Npb25ObyA9IC0xOwogICAgIGludCBpOwotICAgIEVmZmVjdENvbnRleHQgKnBDb250ZXh0ID0gTlVMTDsKKyAgICBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCA9IE5VTEw7CiAgICAgYm9vbCBuZXdCdW5kbGUgPSBmYWxzZTsKLSAgICBTZXNzaW9uQ29udGV4dCAqcFNlc3Npb25Db250ZXh0OworICAgIFNlc3Npb25Db250ZXh0KiBwU2Vzc2lvbkNvbnRleHQ7CiAKICAgICBBTE9HVigiXG5cdEVmZmVjdENyZWF0ZSBzdGFydCBzZXNzaW9uICVkIiwgc2Vzc2lvbklkKTsKIAotICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0ID0gLUVJTlZBTDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KIAotICAgIGlmKEx2bUluaXRGbGFnID09IExWTV9GQUxTRSl7CisgICAgaWYgKEx2bUluaXRGbGFnID09IExWTV9GQUxTRSkgewogICAgICAgICBMdm1Jbml0RmxhZyA9IExWTV9UUlVFOwogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBJbml0aWFsaXppbmcgYWxsIGdsb2JhbCBtZW1vcnkiKTsKICAgICAgICAgTHZtR2xvYmFsQnVuZGxlX2luaXQoKTsKQEAgLTIxMCw3ICsxOTEsNyBAQAogCiAgICAgLy8gRmluZCBzZXNzaW9uTm86IGlmIG9uZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHNlc3Npb25JZCB1c2UgaXQsCiAgICAgLy8gb3RoZXJ3aXNlIGNob29zZSB0aGUgZmlyc3QgYXZhaWxhYmxlIGVtcHR5IHNsb3QuCi0gICAgZm9yKGk9MDsgaTxMVk1fTUFYX1NFU1NJT05TOyBpKyspeworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX1NFU1NJT05TOyBpKyspIHsKICAgICAgICAgaWYgKFNlc3Npb25JbmRleFtpXSA9PSBzZXNzaW9uSWQpIHsKICAgICAgICAgICAgIHNlc3Npb25ObyA9IGk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTIzMiwxMDYgKzIxMywxMDIgQEAKICAgICBwQ29udGV4dCA9IG5ldyBFZmZlY3RDb250ZXh0OwogCiAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgY3JlYXRlIGluIHRoaXMgc2Vzc2lvbgotICAgIGlmKEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID09IExWTV9GQUxTRSl7CisgICAgaWYgKEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5iQnVuZGxlZEVmZmVjdHNFbmFibGVkID09IExWTV9GQUxTRSkgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBUaGlzIGlzIHRoZSBmaXJzdCBlZmZlY3QgaW4gY3VycmVudCBzZXNzaW9uSWQgJWQgc2Vzc2lvbk5vICVkIiwKLSAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25Obyk7CisgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvbk5vKTsKIAogICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9IExWTV9UUlVFOwotICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0ICAgICAgICA9IG5ldyBCdW5kbGVkRWZmZWN0Q29udGV4dDsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLnBCdW5kbGVkQ29udGV4dCA9IG5ldyBCdW5kbGVkRWZmZWN0Q29udGV4dDsKICAgICAgICAgbmV3QnVuZGxlID0gdHJ1ZTsKIAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gR2xvYmFsU2Vzc2lvbk1lbW9yeVtzZXNzaW9uTm9dLnBCdW5kbGVkQ29udGV4dDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbk5vICAgICAgICAgICAgICAgID0gc2Vzc2lvbk5vOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQgICAgICAgICAgICAgICAgPSBzZXNzaW9uSWQ7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkICAgICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgICAgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgICAgICAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkICAgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCAgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gPSBzZXNzaW9uTm87CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTlVMTDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5PdXRwdXREZXZpY2UgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lICAgICAgICAgICAgICAgICAgID0gMDsKLQorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOwogCiAgICAgICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAogICAgICAgICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwgYXZvaWQKICAgICAgICAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCiAgICAgICAgICAqLwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCAgICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCAgICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgICAgICAgICAgICAgICAgPSBQUkVTRVRfQ1VTVE9NOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkICAgICAgICAgICAgICAgPSAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgICAgICAgICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCAgICAgICAgICAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAgICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCAgICAgICAgICAgICAgID0gLTE7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiICAgICA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxICAgICA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+VmlydFN0cmVuZ3RoU2F2ZWQgPSAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DdXJQcmVzZXQgPSBQUkVTRVRfQ1VTVE9NOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9IE5VTEw7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmZyYW1lQ291bnQgPSAtMTsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgICAgIH0KLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0UHJvY2Vzc0NhbGxlZCAgICAgID0gMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbiAgICAgICAgICAgID0gMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0UHJvY2Vzc0NhbGxlZCA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW4gPSAwOwogCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgTHZtQnVuZGxlX2luaXQiKTsKICAgICAgICAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQpOwogCi0gICAgICAgIGlmIChyZXQgPCAwKXsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIEJ1bmRsZSBpbml0IGZhaWxlZCIpOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQXNzaWduaW5nIG1lbW9yeSBmb3IgcHJldmlvdXNseSBjcmVhdGVkIGVmZmVjdCBvbiBzZXNzaW9uTm8gJWQiLAotICAgICAgICAgICAgICAgIHNlc3Npb25Obyk7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPQotICAgICAgICAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbc2Vzc2lvbk5vXS5wQnVuZGxlZENvbnRleHQ7CisgICAgICAgICAgICAgIHNlc3Npb25Obyk7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSBHbG9iYWxTZXNzaW9uTWVtb3J5W3Nlc3Npb25Ob10ucEJ1bmRsZWRDb250ZXh0OwogICAgIH0KICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBwQnVuZGxlZENvbnRleHQgaXMgJXAiLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKIAogICAgIHBTZXNzaW9uQ29udGV4dCA9ICZHbG9iYWxTZXNzaW9uTWVtb3J5W3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25Ob107CiAKICAgICAvLyBDcmVhdGUgZWFjaCBFZmZlY3QKLSAgICBpZiAobWVtY21wKHV1aWQsICZnQmFzc0Jvb3N0RGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgIGlmIChtZW1jbXAodXVpZCwgJmdCYXNzQm9vc3REZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAvLyBDcmVhdGUgQmFzcyBCb29zdAogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fQkFTU19CT09TVCIpOwogICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJCYXNzSW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0gMDsKIAotICAgICAgICBwQ29udGV4dC0+aXRmZSAgICAgICA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOworICAgICAgICBwQ29udGV4dC0+aXRmZSA9ICZnTHZtRWZmZWN0SW50ZXJmYWNlOwogICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSA9IExWTV9CQVNTX0JPT1NUOwotICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVmlydHVhbGl6ZXJEZXNjcmlwdG9yLnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCl7CisgICAgfSBlbHNlIGlmIChtZW1jbXAodXVpZCwgJmdWaXJ0dWFsaXplckRlc2NyaXB0b3IudXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgIC8vIENyZWF0ZSBWaXJ0dWFsaXplcgogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fVklSVFVBTElaRVIiKTsKLSAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ9TFZNX1RSVUU7CisgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX1RSVUU7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOwogCi0gICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5pdGZlID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CiAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX1ZJUlRVQUxJWkVSOwotICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnRXF1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnRXF1YWxpemVyRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIEVxdWFsaXplcgogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fRVFVQUxJWkVSIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9IExWTV9UUlVFOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9IDA7CiAKLSAgICAgICAgcENvbnRleHQtPml0ZmUgICAgICAgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKKyAgICAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0x2bUVmZmVjdEludGVyZmFjZTsKICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUgPSBMVk1fRVFVQUxJWkVSOwotICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVm9sdW1lRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApeworICAgIH0gZWxzZSBpZiAobWVtY21wKHV1aWQsICZnVm9sdW1lRGVzY3JpcHRvci51dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKICAgICAgICAgLy8gQ3JlYXRlIFZvbHVtZQogICAgICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBFZmZlY3QgdG8gYmUgY3JlYXRlZCBpcyBMVk1fVk9MVU1FIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9IExWTV9UUlVFOwogCi0gICAgICAgIHBDb250ZXh0LT5pdGZlICAgICAgID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CisgICAgICAgIHBDb250ZXh0LT5pdGZlID0gJmdMdm1FZmZlY3RJbnRlcmZhY2U7CiAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlID0gTFZNX1ZPTFVNRTsKLSAgICB9Ci0gICAgZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBpbnZhbGlkIFVVSUQiKTsKICAgICAgICAgcmV0ID0gLUVJTlZBTDsKICAgICAgICAgZ290byBleGl0OwpAQCAtMzQ3LDY2ICszMjQsNjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICAgICAgfQotICAgICAgICBpZiAocEhhbmRsZSAhPSBOVUxMKQotICAgICAgICAgICpwSGFuZGxlID0gKGVmZmVjdF9oYW5kbGVfdClOVUxMOworICAgICAgICBpZiAocEhhbmRsZSAhPSBOVUxMKSAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgaWYgKHBIYW5kbGUgIT0gTlVMTCkKLSAgICAgICAgKnBIYW5kbGUgPSAoZWZmZWN0X2hhbmRsZV90KXBDb250ZXh0OworICAgICAgICBpZiAocEhhbmRsZSAhPSBOVUxMKSAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAgICAgfQogICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSBlbmQuLlxuXG4iKTsKICAgICByZXR1cm4gcmV0OwogfSAvKiBlbmQgRWZmZWN0Q3JlYXRlICovCiAKLWV4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSl7CitleHRlcm4gIkMiIGludCBFZmZlY3RSZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBoYW5kbGUpIHsKICAgICBBTE9HVigiXG5cdEVmZmVjdFJlbGVhc2Ugc3RhcnQgJXAiLCBoYW5kbGUpOwotICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopaGFuZGxlOworICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0ID0gKEVmZmVjdENvbnRleHQqKWhhbmRsZTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2Ugc3RhcnQgaGFuZGxlOiAlcCwgY29udGV4dCAlcCIsIGhhbmRsZSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCk7Ci0gICAgaWYgKHBDb250ZXh0ID09IE5VTEwpeworICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIFNlc3Npb25Db250ZXh0ICpwU2Vzc2lvbkNvbnRleHQgPSAmR2xvYmFsU2Vzc2lvbk1lbW9yeVtwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm9dOworICAgIFNlc3Npb25Db250ZXh0KiBwU2Vzc2lvbkNvbnRleHQgPSAmR2xvYmFsU2Vzc2lvbk1lbW9yeVtwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm9dOwogCiAgICAgLy8gQ2xlYXIgdGhlIGluc3RhbnRpYXRlZCBmbGFnIGZvciB0aGUgZWZmZWN0CiAgICAgLy8gcHJvdGVjdCBhZ2FpbnMgdGhlIGNhc2Ugd2hlcmUgYW4gZWZmZWN0IGlzIHVuLWluc3RhbnRpYXRlZCB3aXRob3V0IGJlaW5nIGRpc2FibGVkCiAKLSAgICBpbnQgJmVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOwotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgaW50JiBlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fQkFTU19CT09TVCBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YkJhc3NJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7Ci0gICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA+IDApIHsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CiAgICAgICAgIH0KICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOwotICAgIH0gZWxzZSBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICB9IGVsc2UgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9WSVJUVUFMSVpFUiBDbGVhcmluZyBnbG9iYWwgaW50c3RhbnRpYXRlZCBmbGFnIik7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCl7CisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKICAgICAgICAgfQogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKLSAgICB9IGVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9FUVVBTElaRVIgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOwotICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPUxWTV9GQUxTRTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKXsKKyAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKLSAgICB9IGVsc2UgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9WT0xVTUUgQ2xlYXJpbmcgZ2xvYmFsIGludHN0YW50aWF0ZWQgZmxhZyIpOwogICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJWb2x1bWVJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIC8vIFRoZXJlIGlzIG5vIHNhbXBsZXNUb0V4aXRDb3VudCBmb3Igdm9sdW1lIHNvIHdlIGFsc28gdXNlIHRoZSBkcmFpbiBmbGFnIHRvIGNoZWNrCiAgICAgICAgIC8vIGlmIHdlIHNob3VsZCBkZWNyZW1lbnQgdGhlIGVmZmVjdHMgZW5hYmxlZC4KLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9UUlVFCi0gICAgICAgICAgICAgICAgfHwgKGVmZmVjdEluRHJhaW4gJiAxIDw8IExWTV9WT0xVTUUpICE9IDApIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9UUlVFIHx8CisgICAgICAgICAgICAoZWZmZWN0SW5EcmFpbiAmIDEgPDwgTFZNX1ZPTFVNRSkgIT0gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdFJlbGVhc2UgOiBVbnN1cHBvcnRlZCBlZmZlY3RcblxuXG5cblxuXG5cbiIpOwogICAgIH0KLSAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7IC8vIG5vIG5lZWQgdG8gZHJhaW4gaWYgcmVsZWFzZWQKKyAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7ICAvLyBubyBuZWVkIHRvIGRyYWluIGlmIHJlbGVhc2VkCiAKICAgICAvLyBEaXNhYmxlIGVmZmVjdCwgaW4gdGhpcyBjYXNlIGlnbm9yZSBlcnJvcnMgKHJldHVybiBjb2RlcykKICAgICAvLyBpZiBhbiBlZmZlY3QgaGFzIGFscmVhZHkgYmVlbiBkaXNhYmxlZApAQCAtNDE0LDE3ICszODksMTUgQEAKIAogICAgIC8vIGlmIGFsbCBlZmZlY3RzIGFyZSBubyBsb25nZXIgaW5zdGFudGlhZWQgZnJlZSB0aGUgbHZtIG1lbW9yeSBhbmQgZGVsZXRlIEJ1bmRsZWRFZmZlY3RDb250ZXh0CiAgICAgaWYgKChwU2Vzc2lvbkNvbnRleHQtPmJCYXNzSW5zdGFudGlhdGVkID09IExWTV9GQUxTRSkgJiYKLSAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWb2x1bWVJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSAmJgotICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YkVxdWFsaXplckluc3RhbnRpYXRlZCA9PUxWTV9GQUxTRSkgJiYKLSAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJWaXJ0dWFsaXplckluc3RhbnRpYXRlZD09TFZNX0ZBTFNFKSkKLSAgICB7Ci0KKyAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZvbHVtZUluc3RhbnRpYXRlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQgPT0gTFZNX0ZBTFNFKSkgewogICAgICAgICAvLyBDbGVhciB0aGUgU2Vzc2lvbkluZGV4Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7Ci0gICAgICAgICAgICBpZihTZXNzaW9uSW5kZXhbaV0gPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTUFYX1NFU1NJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChTZXNzaW9uSW5kZXhbaV0gPT0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkKSB7CiAgICAgICAgICAgICAgICAgU2Vzc2lvbkluZGV4W2ldID0gTFZNX1VOVVNFRF9TRVNTSU9OOwotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IENsZWFyaW5nIFNlc3Npb25JbmRleCBTZXNzaW9uTm8gJWQgZm9yIFNlc3Npb25JZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogQ2xlYXJpbmcgU2Vzc2lvbkluZGV4IFNlc3Npb25ObyAlZCBmb3IgU2Vzc2lvbklkICVkXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQzMyw3ICs0MDYsNyBAQAogICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IEZyZWVpbmcgTFZNIEJ1bmRsZSBtZW1vcnlcbiIpOwotICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogRGVsZXRpbmcgTFZNIEJ1bmRsZSBjb250ZXh0ICVwXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKQEAgLTQ0OSwxMSArNDIyLDEwIEBACiAKIH0gLyogZW5kIEVmZmVjdFJlbGVhc2UgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MgPSBOVUxMOworZXh0ZXJuICJDIiBpbnQgRWZmZWN0R2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgeworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2MgPSBOVUxMOwogCi0gICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIkVmZmVjdEdldERlc2NyaXB0b3IoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtNDY5LDcgKzQ0MSw3IEBACiAgICAgfQogCiAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gIC1FSU5WQUw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAogICAgICpwRGVzY3JpcHRvciA9ICpkZXNjOwpAQCAtNDc3LDE1ICs0NDksMTUgQEAKICAgICByZXR1cm4gMDsKIH0gLyogZW5kIEVmZmVjdEdldERlc2NyaXB0b3IgKi8KIAotdm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpewordm9pZCBMdm1HbG9iYWxCdW5kbGVfaW5pdCgpIHsKICAgICBBTE9HVigiXHRMdm1HbG9iYWxCdW5kbGVfaW5pdCBzdGFydCIpOwotICAgIGZvcihpbnQgaT0wOyBpPExWTV9NQVhfU0VTU0lPTlM7IGkrKyl7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCAgID0gTFZNX0ZBTFNFOwotICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJWb2x1bWVJbnN0YW50aWF0ZWQgICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iRXF1YWxpemVySW5zdGFudGlhdGVkICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJhc3NJbnN0YW50aWF0ZWQgICAgICAgID0gTFZNX0ZBTFNFOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX01BWF9TRVNTSU9OUzsgaSsrKSB7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgR2xvYmFsU2Vzc2lvbk1lbW9yeVtpXS5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CisgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYkJhc3NJbnN0YW50aWF0ZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIEdsb2JhbFNlc3Npb25NZW1vcnlbaV0uYlZpcnR1YWxpemVySW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOwotICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLnBCdW5kbGVkQ29udGV4dCAgICAgICAgICA9IExWTV9OVUxMOworICAgICAgICBHbG9iYWxTZXNzaW9uTWVtb3J5W2ldLnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwogCiAgICAgICAgIFNlc3Npb25JbmRleFtpXSA9IExWTV9VTlVTRURfU0VTU0lPTjsKICAgICB9CkBAIC01MDQsMjAzICs0NzYsMTQwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1CdW5kbGVfaW5pdChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCl7CitpbnQgTHZtQnVuZGxlX2luaXQoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOwogCi0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgICA9IDQ0MTAwOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICAgPSBOVUxMOwotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQ09ORklHX0FMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyAgICAgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgICAgICAgICAgICAgICAgID0gNDQxMDA7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyICAgICA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgID0gTlVMTDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgID0gRUZGRUNUX0NPTkZJR19BTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAKICAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CiAKLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlICE9IE5VTEwpeworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKLSAgICAgICAgICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7Ci0KLSAgICAgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworICAgICAgICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKIAogICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKLSAgICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgICAgICAgICAgICAgIi0+IENhbGxlZCBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CiAgICAgfQogCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIHBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX0luc3RQYXJhbXNfdCAgICAgICAgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCi0gICAgTFZNX0VRTkJfQmFuZERlZl90ICAgICAgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAgICAgICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLwotICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIEhlYWRyb29tUGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLwotICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCAgIEhlYWRyb29tQmFuZERlZltMVk1fSEVBRFJPT01fTUFYX05CQU5EU107Ci0gICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX0ZBTFNFOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBwYXJhbXM7ICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICAgIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICAgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOwogCiAgICAgLyogU2V0IHRoZSBjYXBhYmlsaXRpZXMgKi8KLSAgICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgICAgICAgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7Ci0gICAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgICAgID0gTUFYX0NBTExfU0laRTsKLSAgICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgICAgPSBNQVhfTlVNX0JBTkRTOwotICAgIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkICAgICA9IExWTV9QU0FfT047CisgICAgSW5zdFBhcmFtcy5CdWZmZXJNb2RlID0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTOworICAgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgPSBNQVhfTlVNX0JBTkRTOworICAgIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID0gTFZNX1BTQV9PTjsKIAotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7Ci0KLSAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gICAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKLQotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7Ci0gICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucyB0aGF0IHdlcmUKLSAgICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCi0gICAgICovCi0gICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpewotICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOwotCi0gICAgLyogSW5pdGlhbGlzZSAqLwotICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOwotCi0gICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmSW5zdFBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOwogCiAgICAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLwogICAgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAgICAgID0gTFZNX01PREVfT047Ci0gICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgICAgICAgICAgPSBMVk1fRlNfNDQxMDA7Ci0gICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgICAgICAgICAgPSBMVk1fU1RFUkVPOwotICAgIHBhcmFtcy5TcGVha2VyVHlwZSAgICAgICAgICAgID0gTFZNX0hFQURQSE9ORVM7CisgICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgICBwYXJhbXMuU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgICBwYXJhbXMuU3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkNoTWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSNlbmRpZgogCiAgICAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAgID0gTFZNX01PREVfT0ZGOwotICAgIHBhcmFtcy5WaXJ0dWFsaXplclR5cGUgICAgICAgICAgICA9IExWTV9DT05DRVJUU09VTkQ7Ci0gICAgcGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgID0gMTAwOwotICAgIHBhcmFtcy5DU19FZmZlY3RMZXZlbCAgICAgICAgICAgICA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKyAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgIHBhcmFtcy5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgIHBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICAgIHBhcmFtcy5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKIAogICAgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICAgID0gTFZNX0VRTkJfT0ZGOwotICAgIHBhcmFtcy5FUU5CX05CYW5kcyAgICAgICAgICAgID0gRklWRUJBTkRfTlVNQkFORFM7Ci0gICAgcGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uICAgPSAmQmFuZERlZnNbMF07CisgICAgcGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09GRjsKKyAgICBwYXJhbXMuRVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgICBwYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CiAKLSAgICBmb3IgKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7IGkrKykKLSAgICB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CiAgICAgICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07Ci0gICAgICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgICA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07Ci0gICAgICAgIEJhbmREZWZzW2ldLkdhaW4gICAgICA9IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tpXTsKKyAgICAgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CiAgICAgfQogCiAgICAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5WQ19FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKLSAgICBwYXJhbXMuVkNfQmFsYW5jZSAgICAgICAgICAgICA9IDA7CisgICAgcGFyYW1zLlZDX0VmZmVjdExldmVsID0gMDsKKyAgICBwYXJhbXMuVkNfQmFsYW5jZSA9IDA7CiAKICAgICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5URV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX1RFX09GRjsKLSAgICBwYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7CisgICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCA9IDA7CiAKICAgICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlBTQV9FbmFibGUgICAgICAgICAgICAgPSBMVk1fUFNBX09GRjsKLSAgICBwYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICAgICA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKKyAgICBwYXJhbXMuUFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSA9IChMVk1fUFNBX0RlY2F5U3BlZWRfZW4pMDsKIAogICAgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX0JFX09GRjsKLSAgICBwYXJhbXMuQkVfRWZmZWN0TGV2ZWwgICAgICAgICA9IDA7Ci0gICAgcGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgICAgICAgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7Ci0gICAgcGFyYW1zLkJFX0hQRiAgICAgICAgICAgICAgICAgPSBMVk1fQkVfSFBGX09OOworICAgIHBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09GRjsKKyAgICBwYXJhbXMuQkVfRWZmZWN0TGV2ZWwgPSAwOworICAgIHBhcmFtcy5CRV9DZW50cmVGcmVxID0gTFZNX0JFX0NFTlRSRV85MEh6OworICAgIHBhcmFtcy5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOwogCiAgICAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgICAgID0gTFZNX1BTQV9PRkY7Ci0gICAgcGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlICAgICAgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKyAgICBwYXJhbXMuUFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICAgIHBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZSA9IExWTV9QU0FfU1BFRURfTUVESVVNOwogCiAgICAgLyogVEUgQ29udHJvbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOwotICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKKyAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsID0gMDsKIAotI2lmZGVmIFNVUFBPUlRfTUMKLSAgICBwYXJhbXMuTnJDaGFubmVscyAgICAgICAgICAgICA9Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwotICAgIHBhcmFtcy5DaE1hc2sgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCisgICAgcGFyYW1zLk5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKKyAgICBwYXJhbXMuQ2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJnBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgLyogU2V0IHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzICovCi0gICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOwotICAgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9IaWdoICAgICAgICAgPSA0OTk5OwotICAgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgICAgPSAwOwotICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOwotICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoICAgICAgICAgPSAyNDAwMDsKLSAgICBIZWFkcm9vbUJhbmREZWZbMV0uSGVhZHJvb21fT2Zmc2V0ICAgID0gMDsKLSAgICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uICAgID0gJkhlYWRyb29tQmFuZERlZlswXTsKKyAgICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfTG93ID0gMjA7CisgICAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggPSA0OTk5OworICAgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9Mb3cgPSA1MDAwOworICAgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoID0gMjQwMDA7CisgICAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgICAgSGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9ICZIZWFkcm9vbUJhbmREZWZbMF07CiAgICAgSGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IExWTV9IRUFEUk9PTV9PTjsKLSAgICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyAgICAgICAgID0gMjsKKyAgICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CiAKLSAgICBMdm1TdGF0dXMgPSBMVk1fU2V0SGVhZHJvb21QYXJhbXMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSGVhZHJvb21QYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldEhlYWRyb29tUGFyYW1zIiwgIkx2bUJ1bmRsZV9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0SGVhZHJvb21QYXJhbXNcbiIpOwogICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IEVuZCIpOwogICAgIHJldHVybiAwOwotfSAgIC8qIGVuZCBMdm1CdW5kbGVfaW5pdCAqLworfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfcHJvY2VzcygpCkBAIC03MTksMjUgKzYyOCwyMiBAQAogLy8gIHBPdXQ6ICAgICAgIHBvaW50ZXIgdG8gdXBkYXRlZCBzdGVyZW8gMTYgYml0IG91dHB1dCBkYXRhCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgTHZtQnVuZGxlX3Byb2Nlc3MoZWZmZWN0X2J1ZmZlcl90ICAqcEluLAotICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdCAgKnBPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KXsKLQotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICpwT3V0VG1wOworaW50IEx2bUJ1bmRsZV9wcm9jZXNzKGVmZmVjdF9idWZmZXJfdCogcEluLCBlZmZlY3RfYnVmZmVyX3QqIHBPdXQsIGludCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBlZmZlY3RfYnVmZmVyX3QqIHBPdXRUbXA7CiAgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQotICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAKLSAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUpIHsKICAgICAgICAgcE91dFRtcCA9IHBPdXQ7Ci0gICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgIH0gZWxzZSBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ICE9IGZyYW1lQ291bnQpIHsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChlZmZlY3RfYnVmZmVyX3QgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgKGVmZmVjdF9idWZmZXJfdCopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03NDksNyArNjU1LDYgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0KICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwpAQCAtNzU3LDE2ICs2NjIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1Byb2Nlc3MiLCAiTHZtQnVuZGxlX3Byb2Nlc3MiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLQotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpeworICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogTnJDaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICBwT3V0W2ldID0gcE91dFtpXSArIHBPdXRUbXBbaV07CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLworfSAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMoKQpAQCAtNzc5LDI5ICs2ODMsMjggQEAKIC8vIE91dHB1dHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgewotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KK3ZvaWQgRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMiKQotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBqdXN0IEdvdCAtPiAlZFxuIiwKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMganVzdCBHb3QgLT4gJWRcbiIsCiAgICAgLy8gICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOwotICAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKLSAgICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldOwotICAgICAgIH0KKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldOworICAgIH0KIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMiKQotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zIGp1c3QgU2V0IC0+ICVkXG4iLAorICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyBqdXN0IFNldCAtPiAlZFxuIiwKICAgICAvLyAgICAgICAgICBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb25bYmFuZF0uR2Fpbik7Ci0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MTYsMTkgKzcxOSwxOSBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgTHZtRWZmZWN0X2xpbWl0TGV2ZWwoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCit2b2lkIEx2bUVmZmVjdF9saW1pdExldmVsKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfbGltaXRMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IEdvdCAtPiAlZFxuIiwKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3QgR290IC0+ICVkXG4iLAogICAgIC8vICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltiYW5kXS5HYWluKTsKIAogICAgIGludCBnYWluQ29ycmVjdGlvbiA9IDA7Ci0gICAgLy9Db3VudCB0aGUgZW5lcmd5IGNvbnRyaWJ1dGlvbiBwZXIgYmFuZCBmb3IgRVEgYW5kIEJhc3NCb29zdCBvbmx5IGlmIHRoZXkgYXJlIGFjdGl2ZS4KKyAgICAvLyBDb3VudCB0aGUgZW5lcmd5IGNvbnRyaWJ1dGlvbiBwZXIgYmFuZCBmb3IgRVEgYW5kIEJhc3NCb29zdCBvbmx5IGlmIHRoZXkgYXJlIGFjdGl2ZS4KICAgICBmbG9hdCBlbmVyZ3lDb250cmlidXRpb24gPSAwOwogICAgIGZsb2F0IGVuZXJneUNyb3NzID0gMDsKICAgICBmbG9hdCBlbmVyZ3lCYXNzQm9vc3QgPSAwOwpAQCAtODM4LDg4ICs3NDEsODMgQEAKICAgICBib29sIGJiRW5hYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRTsKICAgICBib29sIHZpRW5hYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUU7CiAKLSAgICAvL0VRIGNvbnRyaWJ1dGlvbgorICAgIC8vIEVRIGNvbnRyaWJ1dGlvbgogICAgIGlmIChlcUVuYWJsZWQpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gLyAxNS4wOwogICAgICAgICAgICAgZmxvYXQgYmFuZENvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYW5kRW5lcmd5Q29lZmZpY2llbnRbaV07CiAgICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYmFuZEZhY3RvciAqIGJhbmRDb2VmZmljaWVudCAqIGJhbmRDb2VmZmljaWVudDsKLSAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKLSAgICAgICAgICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gYmFuZEVuZXJneTsKKyAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJhbmRFbmVyZ3k7CiAgICAgICAgIH0KIAotICAgICAgICAvL2Nyb3NzIEVRIGNvZWZmaWNpZW50cworICAgICAgICAvLyBjcm9zcyBFUSBjb2VmZmljaWVudHMKICAgICAgICAgZmxvYXQgYmFuZEZhY3RvclN1bSA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFMtMTsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yMSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKLSAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IyID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpKzFdLzE1LjA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFMgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IxID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSAvIDE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yMiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaSArIDFdIC8gMTUuMDsKIAogICAgICAgICAgICAgaWYgKGJhbmRGYWN0b3IxID4gMCAmJiBiYW5kRmFjdG9yMiA+IDApIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBjcm9zc0VuZXJneSA9IGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjIgKgotICAgICAgICAgICAgICAgICAgICAgICAgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBjcm9zc0VuZXJneSA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYW5kRmFjdG9yMSAqIGJhbmRGYWN0b3IyICogTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtpXTsKICAgICAgICAgICAgICAgICBiYW5kRmFjdG9yU3VtICs9IGJhbmRGYWN0b3IxICogYmFuZEZhY3RvcjI7CiAKLSAgICAgICAgICAgICAgICBpZiAoY3Jvc3NFbmVyZ3kgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbmVyZ3lDcm9zcyArPSBjcm9zc0VuZXJneTsKKyAgICAgICAgICAgICAgICBpZiAoY3Jvc3NFbmVyZ3kgPiAwKSBlbmVyZ3lDcm9zcyArPSBjcm9zc0VuZXJneTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBiYW5kRmFjdG9yU3VtIC09IDEuMDsKLSAgICAgICAgaWYgKGJhbmRGYWN0b3JTdW0gPiAwKQotICAgICAgICAgIGNyb3NzQ29ycmVjdGlvbiA9IGJhbmRGYWN0b3JTdW0gKiAwLjc7CisgICAgICAgIGlmIChiYW5kRmFjdG9yU3VtID4gMCkgY3Jvc3NDb3JyZWN0aW9uID0gYmFuZEZhY3RvclN1bSAqIDAuNzsKICAgICB9CiAKLSAgICAvL0Jhc3NCb29zdCBjb250cmlidXRpb24KKyAgICAvLyBCYXNzQm9vc3QgY29udHJpYnV0aW9uCiAgICAgaWYgKGJiRW5hYmxlZCkgewotICAgICAgICBmbG9hdCBib29zdEZhY3RvciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkvMTAwMC4wOworICAgICAgICBmbG9hdCBib29zdEZhY3RvciA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkgLyAxMDAwLjA7CiAgICAgICAgIGZsb2F0IGJvb3N0Q29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvZWZmaWNpZW50OwogCiAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBib29zdEZhY3RvciAqIGJvb3N0Q29lZmZpY2llbnQgKiBib29zdENvZWZmaWNpZW50OwogCiAgICAgICAgIGlmIChlcUVuYWJsZWQpIHsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgewotICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRGYWN0b3IgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CisgICAgICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gLyAxNS4wOwogICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRDcm9zc0NvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOwotICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRFbmVyZ3kgPSBib29zdEZhY3RvciAqIGJhbmRGYWN0b3IgKgotICAgICAgICAgICAgICAgICAgICBiYW5kQ3Jvc3NDb2VmZmljaWVudDsKLSAgICAgICAgICAgICAgICBpZiAoYmFuZEVuZXJneSA+IDApCi0gICAgICAgICAgICAgICAgICBlbmVyZ3lCYXNzQm9vc3QgKz0gYmFuZEVuZXJneTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYm9vc3RGYWN0b3IgKiBiYW5kRmFjdG9yICogYmFuZENyb3NzQ29lZmZpY2llbnQ7CisgICAgICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKSBlbmVyZ3lCYXNzQm9vc3QgKz0gYmFuZEVuZXJneTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8vVmlydHVhbGl6ZXIgY29udHJpYnV0aW9uCisgICAgLy8gVmlydHVhbGl6ZXIgY29udHJpYnV0aW9uCiAgICAgaWYgKHZpRW5hYmxlZCkgewotICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiAqCi0gICAgICAgICAgICAgICAgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbjsKKyAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9CisgICAgICAgICAgICAgICAgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiAqIExpbWl0TGV2ZWxfdmlydHVhbGl6ZXJDb250cmlidXRpb247CiAgICAgfQogCi0gICAgZG91YmxlIHRvdGFsRW5lcmd5RXN0aW1hdGlvbiA9IHNxcnQoZW5lcmd5Q29udHJpYnV0aW9uICsgZW5lcmd5Q3Jvc3MgKyBlbmVyZ3lCYXNzQm9vc3QpIC0KLSAgICAgICAgICAgIGNyb3NzQ29ycmVjdGlvbjsKKyAgICBkb3VibGUgdG90YWxFbmVyZ3lFc3RpbWF0aW9uID0KKyAgICAgICAgICAgIHNxcnQoZW5lcmd5Q29udHJpYnV0aW9uICsgZW5lcmd5Q3Jvc3MgKyBlbmVyZ3lCYXNzQm9vc3QpIC0gY3Jvc3NDb3JyZWN0aW9uOwogICAgIEFMT0dWKCIgVE9UQUwgZW5lcmd5IGVzdGltYXRpb246ICUwLjJmIGRCIiwgdG90YWxFbmVyZ3lFc3RpbWF0aW9uKTsKIAotICAgIC8vcm91bmRvZmYKKyAgICAvLyByb3VuZG9mZgogICAgIGludCBtYXhMZXZlbFJvdW5kID0gKGludCkodG90YWxFbmVyZ3lFc3RpbWF0aW9uICsgMC45OSk7CiAgICAgaWYgKG1heExldmVsUm91bmQgKyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPiAwKSB7CiAgICAgICAgIGdhaW5Db3JyZWN0aW9uID0gbWF4TGV2ZWxSb3VuZCArIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZTsKICAgICB9CiAKLSAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lIC0gZ2FpbkNvcnJlY3Rpb247CisgICAgQWN0aXZlUGFyYW1zLlZDX0VmZmVjdExldmVsID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lIC0gZ2FpbkNvcnJlY3Rpb247CiAgICAgaWYgKEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCA8IC05NikgewogICAgICAgICBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgPSAtOTY7CiAgICAgfQogICAgIEFMT0dWKCJcdFZvbDolZCwgR2FpbkNvcnJlY3Rpb246ICVkLCBBY3R1YWwgdm9sOiAlZCIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSwKLSAgICAgICAgICAgIGdhaW5Db3JyZWN0aW9uLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwpOworICAgICAgICAgIGdhaW5Db3JyZWN0aW9uLCBBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9saW1pdExldmVsIikKIAogICAgIEFMT0dWKCJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgcmV0dXJuOiVkIiwgKGludClMdm1TdGF0dXMpOwotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBTZXQgLT4gJWRcbiIsCisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2xpbWl0TGV2ZWwganVzdCBTZXQgLT4gJWRcbiIsCiAgICAgLy8gICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOwogCi0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfbGltaXRMZXZlbCBqdXN0IHNldCAoLTk2ZEIgLT4gMGRCKSAtPiAlZFxuIixBY3RpdmVQYXJhbXMuVkNfRWZmZWN0TGV2ZWwgKTsKLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgPT0gTFZNX1RSVUUpeworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9saW1pdExldmVsIGp1c3Qgc2V0ICgtOTZkQiAtPiAwZEIpIC0+ICVkXG4iLEFjdGl2ZVBhcmFtcy5WQ19FZmZlY3RMZXZlbCApOworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9PSBMVk1fVFJVRSkgewogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRWb2x1bWVOb1Ntb290aGluZyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCiAgICAgICAgIEFMT0dWKCJcdExWTV9WT0xVTUU6IERpc2FibGluZyBTbW9vdGhpbmcgZm9yIGZpcnN0IHZvbHVtZSBjaGFuZ2UgdG8gcmVtb3ZlIHNwaWtlcy9jbGlja3MiKTsKQEAgLTkzOSw0MiArODM3LDQxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBMdm1FZmZlY3RfZW5hYmxlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgc3RhcnQiKTsKK2ludCBMdm1FZmZlY3RfZW5hYmxlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBzdGFydCIpOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9lbmFibGUiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCi0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSA6IEVuYWJsaW5nIExWTV9CQVNTX0JPT1NUIik7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlICAgICAgID0gTFZNX0JFX09OOworICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZJUlRVQUxJWkVSIik7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09OOworICAgICAgICBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX0VRVUFMSVpFUiIpOwotICAgICAgICBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgICA9IExWTV9FUU5CX09OOworICAgICAgICBBY3RpdmVQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZW5hYmxlIDogRW5hYmxpbmcgTFZNX1ZPTFVNRSIpOwogICAgIH0KIAogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtRWZmZWN0X2VuYWJsZSIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdEx2bUVmZmVjdF9lbmFibGUgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2VuYWJsZSBlbmQiKTsKICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC05OTEsODIgKzg4OCw0NSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgTHZtRWZmZWN0X2Rpc2FibGUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgc3RhcnQiKTsKK2ludCBMdm1FZmZlY3RfZGlzYWJsZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIHN0YXJ0Iik7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUVmZmVjdF9kaXNhYmxlIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCi0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBEaXNhYmxpbmcgTFZNX0JBU1NfQk9PU1QiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLkJFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fQkVfT0ZGOworICAgICAgICBBY3RpdmVQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PRkY7CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKICAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgOiBEaXNhYmxpbmcgTFZNX1ZJUlRVQUxJWkVSIik7Ci0gICAgICAgIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09GRjsKKyAgICAgICAgQWN0aXZlUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSB7CiAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9kaXNhYmxlIDogRGlzYWJsaW5nIExWTV9FUVVBTElaRVIiKTsKLSAgICAgICAgQWN0aXZlUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZSAgICAgPSBMVk1fRVFOQl9PRkY7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgPSBMVk1fRVFOQl9PRkY7CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKKyAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgewogICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSA6IERpc2FibGluZyBMVk1fVk9MVU1FIik7CiAgICAgfQogCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1FZmZlY3RfZGlzYWJsZSIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRMdm1FZmZlY3RfZGlzYWJsZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0THZtRWZmZWN0X2Rpc2FibGUgZW5kIik7CiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwogICAgIHJldHVybiAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEx2bUVmZmVjdF9mcmVlKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgotLy8KLS8vIElucHV0czoKLS8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKLS8vCi0vLyBPdXRwdXRzOgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIEx2bUVmZmVjdF9mcmVlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7Ci0KLSAgICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotCi0gICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCi0KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpewotICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfSAgICAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFZmZlY3Rfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUHVycG9zZTogU2V0IGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbi4KQEAgLTEwODAsOSArOTQwLDkgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IEVmZmVjdF9zZXRDb25maWcoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyl7Ci0gICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZTsKLSAgICAvL0FMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgc3RhcnQiKTsKK2ludCBFZmZlY3Rfc2V0Q29uZmlnKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcpIHsKKyAgICBMVk1fRnNfZW4gU2FtcGxlUmF0ZTsKKyAgICAvLyBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIHN0YXJ0Iik7CiAKICAgICBDSEVDS19BUkcocENvbnRleHQgIT0gTlVMTCk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWcgIT0gTlVMTCk7CkBAIC0xMDkwLDEwNyArOTUwLDY0IEBACiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBDSEVDS19BUkcoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKSA8PSBMVk1fTUFYX0NIQU5ORUxTKTsKLSNlbHNlCi0gICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0jZW5kaWYKLSAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKLSAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFIHx8CisgICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKICAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKLSAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewotICAgIGNhc2UgODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAxNjAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAyMjA1MCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSAzMjAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0NDEwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfNDgwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA0ODAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgODgyMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4ODIwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgOTYwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA5NjAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc2NDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE3NjQwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE3NjQwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTkyMDAwOgotICAgICAgICBTYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBTYW1wbGVSYXRlID0gbHZtRnNGb3JTYW1wbGVSYXRlKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgaWYgKFNhbXBsZVJhdGUgPT0gTFZNX0ZTX0lOVkFMSUQpIHsKKyAgICAgICAgQUxPR1YoIkVmZmVjdF9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgKiBOckNoYW5uZWxzOwogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUgfHwKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrICE9IHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKSB7Ci0jZWxzZQotICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSl7Ci0jZW5kaWYKLQotICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7Ci0gICAgICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOworICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsKKyAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsKIAogICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGNoYW5nZSBzYW1wbGluZyByYXRlIHRvICVkIiwgU2FtcGxlUmF0ZSk7CiAKICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworICAgICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkVmZmVjdF9zZXRDb25maWciKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAogICAgICAgICBBY3RpdmVQYXJhbXMuU2FtcGxlUmF0ZSA9IFNhbXBsZVJhdGU7CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5OckNoYW5uZWxzID0gTnJDaGFubmVsczsKICAgICAgICAgQWN0aXZlUGFyYW1zLkNoTWFzayA9IHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzOwotI2VuZGlmCisKKyAgICAgICAgaWYgKE5yQ2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgQWN0aXZlUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9NT05POworICAgICAgICB9IGVsc2UgaWYgKE5yQ2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgQWN0aXZlUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgICAgIH0gZWxzZSBpZiAoTnJDaGFubmVscyA+IDIgJiYgTnJDaGFubmVscyA8PSBMVk1fTUFYX0NIQU5ORUxTKSB7CisgICAgICAgICAgICBBY3RpdmVQYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CiAKICAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJFZmZlY3Rfc2V0Q29uZmlnIikKLSAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7Ci0jZW5kaWYKIAogICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKLSAgICB9ZWxzZXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIEVuZC4uLi4iKTsKKyAgICAvLyBBTE9HVigiXHRFZmZlY3Rfc2V0Q29uZmlnIEVuZC4uLi4iKTsKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgRWZmZWN0X3NldENvbmZpZyAqLworfSAvKiBlbmQgRWZmZWN0X3NldENvbmZpZyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdF9nZXRDb25maWcoKQpAQCAtMTIwNiwxMCArMTAyMyw5IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgRWZmZWN0X2dldENvbmZpZyhFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKQotewordm9pZCBFZmZlY3RfZ2V0Q29uZmlnKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcpIHsKICAgICAqcENvbmZpZyA9IHBDb250ZXh0LT5jb25maWc7Ci19ICAgLyogZW5kIEVmZmVjdF9nZXRDb25maWcgKi8KK30gLyogZW5kIEVmZmVjdF9nZXRDb25maWcgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBCYXNzR2V0U3RyZW5ndGgoKQpAQCAtMTIyNSwzMiArMTA0MSwzMSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi11aW50MzJfdCBCYXNzR2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoKCkgKDAtMTAwMCkgLT4gJWRcbiIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKTsKK3VpbnQzMl90IEJhc3NHZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTEwMDApIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkJhc3NHZXRTdHJlbmd0aCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0QmFzc0dldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzR2V0U3RyZW5ndGggU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cmVuZ3RoIHJldHVybmVkIG1hdGNoZXMgdGhlIHN0cmVuZ3RoIHRoYXQgd2FzIHNldCBlYXJsaWVyICovCi0gICAgaWYoQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsICE9Ci0gICAgICAgKExWTV9JTlQxNikoKDE1KnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwKSl7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCAhPQorICAgICAgICAoTFZNX0lOVDE2KSgoMTUgKiBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCkgLyAxMDAwKSkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBCYXNzR2V0U3RyZW5ndGggbW9kdWxlIHN0cmVuZ3RoIGRvZXMgbm90IG1hdGNoIHNhdmVkU3RyZW5ndGggJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkJFX0VmZmVjdExldmVsLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCk7CisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKLSAgICAvL0FMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpIChzYXZlZCkgIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCApOworICAgIC8vIEFMT0dWKCJcdEJhc3NHZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKKyAgICAvLyBBTE9HVigiXHRCYXNzR2V0U3RyZW5ndGgoKSAoc2F2ZWQpICAtPiAlZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgKTsKICAgICByZXR1cm4gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQ7Ci19ICAgIC8qIGVuZCBCYXNzR2V0U3RyZW5ndGggKi8KK30gLyogZW5kIEJhc3NHZXRTdHJlbmd0aCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEJhc3NTZXRTdHJlbmd0aCgpCkBAIC0xMjY0LDM1ICsxMDc5LDM0IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgQmFzc1NldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCl7Ci0gICAgLy9BTE9HVigiXHRCYXNzU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOwordm9pZCBCYXNzU2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHN0cmVuZ3RoKSB7CisgICAgLy8gQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCVkKSIsIHN0cmVuZ3RoKTsKIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkID0gKGludClzdHJlbmd0aDsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQWN0aXZlUGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiQmFzc1NldFN0cmVuZ3RoIikKLSAgICAvL0FMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KLSAgICBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgICAgPSAoTFZNX0lOVDE2KSgoMTUqc3RyZW5ndGgpLzEwMDApOwotICAgIEFjdGl2ZVBhcmFtcy5CRV9DZW50cmVGcmVxICAgICA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgICBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgPSAoTFZNX0lOVDE2KSgoMTUgKiBzdHJlbmd0aCkgLyAxMDAwKTsKKyAgICBBY3RpdmVQYXJhbXMuQkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKIAotICAgIC8vQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoKCkgKDAtMTUpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5CRV9FZmZlY3RMZXZlbCApOworICAgIC8vIEFMT0dWKCJcdEJhc3NTZXRTdHJlbmd0aCgpICgwLTE1KSAgIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuQkVfRWZmZWN0TGV2ZWwgKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkJhc3NTZXRTdHJlbmd0aCIpCi0gICAgLy9BTE9HVigiXHRCYXNzU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0QmFzc1NldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKIAogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKLX0gICAgLyogZW5kIEJhc3NTZXRTdHJlbmd0aCAqLworfSAvKiBlbmQgQmFzc1NldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpCkBAIC0xMzA4LDIxICsxMTIyLDIzIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXVpbnQzMl90IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCAoMC0xMDAwKSAtPiAlZFxuIixwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCk7Cit1aW50MzJfdCBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCAoMC0xMDAwKSAtPgorICAgIC8vICVkXG4iLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWaXJ0dWFsaXplckdldFN0cmVuZ3RoIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyR2V0U3RyZW5ndGgoKSAoMC0xMDApICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsKjEwKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplckdldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJHZXRTdHJlbmd0aCgpICgwLTEwMCkgICAtPiAlZFxuIiwKKyAgICAvLyBBY3RpdmVQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbCoxMCk7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkOwotfSAgICAvKiBlbmQgZ2V0U3RyZW5ndGggKi8KK30gLyogZW5kIGdldFN0cmVuZ3RoICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVmlydHVhbGl6ZXJTZXRTdHJlbmd0aCgpCkBAIC0xMzM2LDMxICsxMTUyLDMxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgVmlydHVhbGl6ZXJTZXRTdHJlbmd0aChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3Qgc3RyZW5ndGgpewotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCglZCkiLCBzdHJlbmd0aCk7Ci0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwordm9pZCBWaXJ0dWFsaXplclNldFN0cmVuZ3RoKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBzdHJlbmd0aCkgeworICAgIC8vIEFMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGgoJWQpIiwgc3RyZW5ndGgpOworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gKGludClzdHJlbmd0aDsKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsJkFjdGl2ZVBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZpcnR1YWxpemVyU2V0U3RyZW5ndGgiKQotICAgIC8vQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgLyogVmlydHVhbGl6ZXIgcGFyYW1ldGVycyAqLwotICAgIEFjdGl2ZVBhcmFtcy5DU19FZmZlY3RMZXZlbCAgICAgICAgICAgICA9IChpbnQpKChzdHJlbmd0aCozMjc2NykvMTAwMCk7CisgICAgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsID0gKGludCkoKHN0cmVuZ3RoICogMzI3NjcpIC8gMTAwMCk7CiAKLSAgICBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtMTAwMCkgICAtPiAlZFxuIiwgc3RyZW5ndGggKTsKLSAgICBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtIDEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsICk7CisgICAgQUxPR1YoIlx0VmlydHVhbGl6ZXJTZXRTdHJlbmd0aCgpICgwLTEwMDApICAgLT4gJWRcbiIsIHN0cmVuZ3RoKTsKKyAgICBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoKCkgKDAtIDEwMCkgICAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkNTX0VmZmVjdExldmVsKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWaXJ0dWFsaXplclNldFN0cmVuZ3RoIikKLSAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyU2V0U3RyZW5ndGggU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplclNldFN0cmVuZ3RoIFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG5cbiIpOwogICAgIEx2bUVmZmVjdF9saW1pdExldmVsKHBDb250ZXh0KTsKLX0gICAgLyogZW5kIHNldFN0cmVuZ3RoICovCit9IC8qIGVuZCBzZXRTdHJlbmd0aCAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoKQpAQCAtMTM3NiwxNCArMTE5MiwxNCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgVmlydHVhbGl6ZXJJc0RldmljZVN1cHBvcnRlZChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHN3aXRjaCAoZGV2aWNlVHlwZSkgewotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgotICAgIC8vIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOiAgLy8gRm9yIFVTQiB0ZXN0aW5nIG9mIHRoZSB2aXJ0dWFsaXplciBvbmx5LgotICAgICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0IDoKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgorICAgICAgICAgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIH0KIApAQCAtMTQwMSw5ICsxMjE3LDkgQEAKIC8vICAwICAgICAgICAgICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGludCBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgIC8vIFRPRE86IHVwZGF0ZSB0byA4IGNoYW5uZWxzIHdoZW4gc3VwcG9ydGVkLgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgcmV0dXJuIFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlVHlwZSk7CkBAIC0xNDIzLDE2ICsxMjM5LDE2IEBACiAvLyAgMCAgICAgICAgICAgIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGFuZCB0aGUgdmlydHVhbGl6YXRpb24gbW9kZSBmb3JjZWQKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlKSB7CitpbnQgVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZShFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSkgewogICAgIEFMT0dWKCJWaXJ0dWFsaXplckZvcmNlVmlydHVhbGl6YXRpb25Nb2RlOiBmb3JjZWREZXY9MHgleCBlbmFibGVkPSVkIHRtcERpc2FibGVkPSVkIiwKLSAgICAgICAgICAgIGZvcmNlZERldmljZSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCwKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CisgICAgICAgICAgZm9yY2VkRGV2aWNlLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CiAgICAgaW50IHN0YXR1cyA9IDA7CiAgICAgYm9vbCB1c2VWaXJ0dWFsaXplciA9IGZhbHNlOwogCiAgICAgaWYgKFZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZm9yY2VkRGV2aWNlKSAhPSAwKSB7CiAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIC8vZm9yY2VkIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkLCBtYWtlIGl0IGJlaGF2ZSBhcyBhIHJlc2V0IG9mIGZvcmNlZCBtb2RlCisgICAgICAgICAgICAvLyBmb3JjZWQgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQsIG1ha2UgaXQgYmVoYXZlIGFzIGEgcmVzZXQgb2YgZm9yY2VkIG1vZGUKICAgICAgICAgICAgIGZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgICAgICAgICAgLy8gYnV0IHJldHVybiBhbiBlcnJvcgogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKQEAgLTE0NzIsOCArMTI4OCw4IEBACiAgICAgfQogCiAgICAgQUxPR1YoIlx0YWZ0ZXIgVmlydHVhbGl6ZXJGb3JjZVZpcnR1YWxpemF0aW9uTW9kZTogZW5hYmxlZD0lZCB0bXBEaXNhYmxlZD0lZCIsCi0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkKTsKKyAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkLAorICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCk7CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQ5OSwyMyArMTMxNSwyNCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBWaXJ0dWFsaXplckdldFNwZWFrZXJBbmdsZXMoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlIF9fdW51c2VkLCBpbnQzMl90ICpwU3BlYWtlckFuZ2xlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IC8qIGRldmljZVR5cGUgX191bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwU3BlYWtlckFuZ2xlcykgewogICAgIC8vIHRoZSBjaGFubmVsIGNvdW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgMSBvciAyCiAgICAgLy8gdGhlIGRldmljZSBpcyBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUgaGVhZHBob25lCiAgICAgLy8gdGhpcyB2aXJ0dWFsaXplciBpcyBhbHdheXMgdXNpbmcgMiB2aXJ0dWFsIHNwZWFrZXJzIGF0IC05MCBhbmQgOTBkZWcgb2YgYXppbXV0aCwgMGRlZyBvZgogICAgIC8vIGVsZXZhdGlvbiBidXQgdGhlIHJldHVybiBpbmZvcm1hdGlvbiBpcyBzaXplZCBmb3IgbmJDaGFubmVscyAqIDMsIHNvIHdlIGhhdmUgdG8gY29uc2lkZXIKICAgICAvLyB0aGUgKGZhbHNlIGhlcmUpIGNhc2Ugb2YgYSBzaW5nbGUgY2hhbm5lbCwgYW5kIHJldHVybiBvbmx5IDMgZmllbGRzLgogICAgIGlmIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spID09IDEpIHsKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsgLy8gc2FtZSBhcyBGUk9OVF9MRUZUCi0gICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgLy8gYXppbXV0aAotICAgICAgICAqcFNwZWFrZXJBbmdsZXMgPSAwOyAvLyBlbGV2YXRpb24KKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdClBVURJT19DSEFOTkVMX09VVF9NT05POyAgLy8gc2FtZSBhcyBGUk9OVF9MRUZUCisgICAgICAgICpwU3BlYWtlckFuZ2xlcysrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF6aW11dGgKKyAgICAgICAgKnBTcGVha2VyQW5nbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxldmF0aW9uCiAgICAgfSBlbHNlIHsKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdCkgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVDsKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAtOTA7IC8vIGF6aW11dGgKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAwOyAgIC8vIGVsZXZhdGlvbgotICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IChpbnQzMl90KSBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDsKKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdClBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUOworICAgICAgICAqcFNwZWFrZXJBbmdsZXMrKyA9IC05MDsgIC8vIGF6aW11dGgKKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAwOyAgICAvLyBlbGV2YXRpb24KKyAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSAoaW50MzJfdClBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVDsKICAgICAgICAgKnBTcGVha2VyQW5nbGVzKysgPSA5MDsgIC8vIGF6aW11dGgKLSAgICAgICAgKnBTcGVha2VyQW5nbGVzICAgPSAwOyAgIC8vIGVsZXZhdGlvbgorICAgICAgICAqcFNwZWFrZXJBbmdsZXMgPSAwOyAgICAgLy8gZWxldmF0aW9uCiAgICAgfQogfQogCkBAIC0xNTI5LDEwICsxMzQ2LDEwIEBACiAvLyAgIEFVRElPX0RFVklDRV9OT05FIGlmIHRoZSBlZmZlY3QgaXMgbm90IHZpcnR1YWxpemluZwogLy8gICBvciB0aGUgZGV2aWNlIHR5cGUgaWYgdGhlIGVmZmVjdCBpcyB2aXJ0dWFsaXppbmcKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYXVkaW9fZGV2aWNlc190IFZpcnR1YWxpemVyR2V0VmlydHVhbGl6YXRpb25Nb2RlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KSB7CithdWRpb19kZXZpY2VzX3QgVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQpIHsKICAgICBhdWRpb19kZXZpY2VzX3QgdmlydERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgICYmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQgPT0gTFZNX0ZBTFNFKSkgeworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgJiYKKyAgICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9PSBMVk1fRkFMU0UpKSB7CiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgIC8vIHZpcnR1YWxpemF0aW9uIG1vZGUgaXMgZm9yY2VkLCByZXR1cm4gdGhhdCBkZXZpY2UKICAgICAgICAgICAgIHZpcnREZXZpY2UgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2U7CkBAIC0xNTU3LDggKzEzNzQsOCBAQAogLy8gT3V0cHV0czoKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0QmFuZExldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQzMl90IGJhbmQpewotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyR2V0QmFuZExldmVsIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2JhbmRdICk7CitpbnQzMl90IEVxdWFsaXplckdldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MzJfdCBiYW5kKSB7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyR2V0QmFuZExldmVsIC0+ICVkXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2JhbmRdICk7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbYmFuZF0gKiAxMDA7CiB9CiAKQEAgLTE1NzYsMTQgKzEzOTMsMTQgQEAKIC8vIE91dHB1dHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgRXF1YWxpemVyU2V0QmFuZExldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQgYmFuZCwgc2hvcnQgR2Fpbil7Cit2b2lkIEVxdWFsaXplclNldEJhbmRMZXZlbChFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50IGJhbmQsIHNob3J0IEdhaW4pIHsKICAgICBpbnQgZ2FpblJvdW5kZWQ7Ci0gICAgaWYoR2FpbiA+IDApewotICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluKzUwKS8xMDApOwotICAgIH1lbHNlewotICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluLTUwKS8xMDApOworICAgIGlmIChHYWluID4gMCkgeworICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluICsgNTApIC8gMTAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnYWluUm91bmRlZCA9IChpbnQpKChHYWluIC0gNTApIC8gMTAwKTsKICAgICB9Ci0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwoJWQpLT4oJWQpIiwgR2FpbiwgZ2FpblJvdW5kZWQpOworICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplclNldEJhbmRMZXZlbCglZCktPiglZCkiLCBHYWluLCBnYWluUm91bmRlZCk7CiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltiYW5kXSA9IGdhaW5Sb3VuZGVkOwogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CiAKQEAgLTE2MDMsMjMgKzE0MjAsMjIgQEAKIC8vIE91dHB1dHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQzMl90IEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MzJfdCBiYW5kKXsKLSAgICBpbnQzMl90IEZyZXF1ZW5jeSA9MDsKK2ludDMyX3QgRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQzMl90IGJhbmQpIHsKKyAgICBpbnQzMl90IEZyZXF1ZW5jeSA9IDA7CiAKLSAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fRVFOQl9CYW5kRGVmX3QgICAgICAqQmFuZERlZjsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0VRTkJfQmFuZERlZl90KiBCYW5kRGVmOwogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBY3RpdmVQYXJhbXMpOworICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kiKQogCi0gICAgQmFuZERlZiAgID0gQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uOwotICAgIEZyZXF1ZW5jeSA9IChpbnQzMl90KUJhbmREZWZbYmFuZF0uRnJlcXVlbmN5KjEwMDA7ICAgICAvLyBDb252ZXJ0IHRvIG1pbGxpYmVscworICAgIEJhbmREZWYgPSBBY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247CisgICAgRnJlcXVlbmN5ID0gKGludDMyX3QpQmFuZERlZltiYW5kXS5GcmVxdWVuY3kgKiAxMDAwOyAgLy8gQ29udmVydCB0byBtaWxsaWJlbHMKIAotICAgIC8vQUxPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IC0+ICVkXG4iLCBGcmVxdWVuY3kgKTsKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplckdldENlbnRyZUZyZXF1ZW5jeSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5IC0+ICVkXG4iLCBGcmVxdWVuY3kgKTsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICByZXR1cm4gRnJlcXVlbmN5OwogfQogCkBAIC0xNjQxLDEwICsxNDU3LDEwIEBACiAvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQogLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0IF9fdW51c2VkLCBpbnQzMl90IGJhbmQsIHVpbnQzMl90ICpwTG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwSGkpeworaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kRnJlcVJhbmdlKEVmZmVjdENvbnRleHQqIC8qIHBDb250ZXh0IF9fdW51c2VkICovLCBpbnQzMl90IGJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBMb3csIHVpbnQzMl90KiBwSGkpIHsKICAgICAqcExvdyA9IGJhbmRGcmVxUmFuZ2VbYmFuZF1bMF07Ci0gICAgKnBIaSAgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzFdOworICAgICpwSGkgPSBiYW5kRnJlcVJhbmdlW2JhbmRdWzFdOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xNjY1LDE2ICsxNDgxLDE2IEBACiAvLyAgcExvdzogICAgICAgbG93ZXIgYmFuZCByYW5nZQogLy8gIHBMb3c6ICAgICAgIHVwcGVyIGJhbmQgcmFuZ2UKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50MzJfdCBFcXVhbGl6ZXJHZXRCYW5kKEVmZmVjdENvbnRleHQgKnBDb250ZXh0IF9fdW51c2VkLCB1aW50MzJfdCB0YXJnZXRGcmVxKXsKK2ludDMyX3QgRXF1YWxpemVyR2V0QmFuZChFZmZlY3RDb250ZXh0KiAvKiBwQ29udGV4dCBfX3VudXNlZCAqLywgdWludDMyX3QgdGFyZ2V0RnJlcSkgewogICAgIGludCBiYW5kID0gMDsKIAotICAgIGlmKHRhcmdldEZyZXEgPCBiYW5kRnJlcVJhbmdlWzBdWzBdKXsKKyAgICBpZiAodGFyZ2V0RnJlcSA8IGJhbmRGcmVxUmFuZ2VbMF1bMF0pIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfWVsc2UgaWYodGFyZ2V0RnJlcSA9PSBiYW5kRnJlcVJhbmdlWzBdWzBdKXsKKyAgICB9IGVsc2UgaWYgKHRhcmdldEZyZXEgPT0gYmFuZEZyZXFSYW5nZVswXVswXSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZm9yKGludCBpPTA7IGk8RklWRUJBTkRfTlVNQkFORFM7aSsrKXsKLSAgICAgICAgaWYoKHRhcmdldEZyZXEgPiBiYW5kRnJlcVJhbmdlW2ldWzBdKSYmKHRhcmdldEZyZXEgPD0gYmFuZEZyZXFSYW5nZVtpXVsxXSkpeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICBpZiAoKHRhcmdldEZyZXEgPiBiYW5kRnJlcVJhbmdlW2ldWzBdKSAmJiAodGFyZ2V0RnJlcSA8PSBiYW5kRnJlcVJhbmdlW2ldWzFdKSkgewogICAgICAgICAgICAgYmFuZCA9IGk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjk0LDcgKzE1MTAsNyBAQAogLy8gIHBDb250ZXh0OiAgICBlZmZlY3QgZW5naW5lIGNvbnRleHQKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludDMyX3QgRXF1YWxpemVyR2V0UHJlc2V0KEVmZmVjdENvbnRleHQgKnBDb250ZXh0KXsKK2ludDMyX3QgRXF1YWxpemVyR2V0UHJlc2V0KEVmZmVjdENvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldDsKIH0KIApAQCAtMTcxMSwxNCArMTUyNywxMiBAQAogLy8gIHByZXNldCAgICAgICBUaGUgcHJlc2V0IElELgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBFcXVhbGl6ZXJTZXRQcmVzZXQoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGludCBwcmVzZXQpewotCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQoJWQpIiwgcHJlc2V0KTsKK3ZvaWQgRXF1YWxpemVyU2V0UHJlc2V0KEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQgcHJlc2V0KSB7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0KCVkKSIsIHByZXNldCk7CiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gcHJlc2V0OwogCi0gICAgLy9BY3RpdmVQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07Ci0gICAgZm9yIChpbnQgaT0wOyBpPEZJVkVCQU5EX05VTUJBTkRTOyBpKyspCi0gICAgeworICAgIC8vIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXSA9CiAgICAgICAgICAgICAgICAgRVFOQl81QmFuZFNvZnRQcmVzZXRzW2kgKyBwcmVzZXQgKiBGSVZFQkFORF9OVU1CQU5EU107CiAgICAgfQpAQCAtMTcyNiwxMSArMTU0MCwxMSBAQAogICAgIEVxdWFsaXplclVwZGF0ZUFjdGl2ZVBhcmFtcyhwQ29udGV4dCk7CiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwogCi0gICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJTZXRQcmVzZXQgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyU2V0UHJlc2V0IFN1Y2Nlc3NmdWxseSBjYWxsZWQgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICByZXR1cm47CiB9CiAKLWludDMyX3QgRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpeworaW50MzJfdCBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkgewogICAgIHJldHVybiBzaXplb2YoZ0VxdWFsaXplclByZXNldHMpIC8gc2l6ZW9mKFByZXNldENvbmZpZyk7CiB9CiAKQEAgLTE3NDUsMTQgKzE1NTksMTQgQEAKIC8vIHByZXNldCAgICAgICBUaGUgcHJlc2V0IElELiBNdXN0IGJlIGxlc3MgdGhhbiBudW1iZXIgb2YgcHJlc2V0cy4KIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNvbnN0IGNoYXIgKiBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKGludDMyX3QgcHJlc2V0KXsKLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgc3RhcnQoJWQpIiwgcHJlc2V0KTsKK2NvbnN0IGNoYXIqIEVxdWFsaXplckdldFByZXNldE5hbWUoaW50MzJfdCBwcmVzZXQpIHsKKyAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJHZXRQcmVzZXROYW1lIHN0YXJ0KCVkKSIsIHByZXNldCk7CiAgICAgaWYgKHByZXNldCA9PSBQUkVTRVRfQ1VTVE9NKSB7CiAgICAgICAgIHJldHVybiAiQ3VzdG9tIjsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZ0VxdWFsaXplclByZXNldHNbcHJlc2V0XS5uYW1lOwogICAgIH0KLSAgICAvL0FMT0dWKCJcdEVxdWFsaXplckdldFByZXNldE5hbWUgZW5kKCVkKSIsIHByZXNldCk7CisgICAgLy8gQUxPR1YoIlx0RXF1YWxpemVyR2V0UHJlc2V0TmFtZSBlbmQoJWQpIiwgcHJlc2V0KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTc2Nyw4ICsxNTgxLDcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZVNldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IGxldmVsKXsKLQoraW50IFZvbHVtZVNldFZvbHVtZUxldmVsKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CiAgICAgaWYgKGxldmVsID4gMCB8fCBsZXZlbCA8IC05NjAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTE3ODIsNyArMTU5NSw3IEBACiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwogCiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBWb2x1bWVTZXRWb2x1bWVMZXZlbCAqLworfSAvKiBlbmQgVm9sdW1lU2V0Vm9sdW1lTGV2ZWwgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVHZXRWb2x1bWVMZXZlbCgpCkBAIC0xNzk0LDE1ICsxNjA3LDE0IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWb2x1bWVHZXRWb2x1bWVMZXZlbChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCAqbGV2ZWwpewotCitpbnQgVm9sdW1lR2V0Vm9sdW1lTGV2ZWwoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDE2X3QqIGxldmVsKSB7CiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICAqbGV2ZWwgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5sZXZlbFNhdmVkICogMTAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpsZXZlbCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSAqIDEwMDsKICAgICB9CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBWb2x1bWVHZXRWb2x1bWVMZXZlbCAqLworfSAvKiBlbmQgVm9sdW1lR2V0Vm9sdW1lTGV2ZWwgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVTZXRNdXRlKCkKQEAgLTE4MTUsMjMgKzE2MjcsMjMgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBWb2x1bWVTZXRNdXRlKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCB1aW50MzJfdCBtdXRlKXsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZVNldE11dGUgc3RhcnQoJWQpIiwgbXV0ZSk7CitpbnQzMl90IFZvbHVtZVNldE11dGUoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IG11dGUpIHsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRNdXRlIHN0YXJ0KCVkKSIsIG11dGUpOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkID0gbXV0ZTsKIAogICAgIC8qIFNldCBhcHByb3ByaWF0ZSB2b2x1bWUgbGV2ZWwgKi8KLSAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lID0gLTk2OwotICAgIH1lbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQ7CiAgICAgfQogCiAgICAgTHZtRWZmZWN0X2xpbWl0TGV2ZWwocENvbnRleHQpOwogCiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBzZXRNdXRlICovCit9IC8qIGVuZCBzZXRNdXRlICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lR2V0TXV0ZSgpCkBAIC0xODQ1LDI2ICsxNjU3LDI1IEBACiAvLyAgbXV0ZTogICAgICAgZW5hYmxlL2Rpc2FibGUgZmxhZwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDMyX3QgVm9sdW1lR2V0TXV0ZShFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgKm11dGUpewotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0TXV0ZSBzdGFydCIpOwotICAgIGlmKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX0ZBTFNFKXx8Ci0gICAgICAgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fVFJVRSkpeworaW50MzJfdCBWb2x1bWVHZXRNdXRlKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCogbXV0ZSkgeworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldE11dGUgc3RhcnQiKTsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHx8CisgICAgICAgIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPT0gTFZNX1RSVUUpKSB7CiAgICAgICAgICptdXRlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Yk11dGVFbmFibGVkOwogICAgICAgICByZXR1cm4gMDsKLSAgICB9ZWxzZXsKKyAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWb2x1bWVHZXRNdXRlIHJlYWQgYW4gaW52YWxpZCB2YWx1ZSBmcm9tIGNvbnRleHQgJWQiLAogICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRNdXRlIGVuZCIpOwotfSAgICAvKiBlbmQgZ2V0TXV0ZSAqLworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldE11dGUgZW5kIik7Cit9IC8qIGVuZCBnZXRNdXRlICovCiAKLWludDE2X3QgVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKGludDE2X3QgcG9zaXRpb24peworaW50MTZfdCBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24oaW50MTZfdCBwb3NpdGlvbikgewogICAgIGludDE2X3QgY29udmVydGVkUG9zaXRpb24gPSAwOwogCi0gICAgY29udmVydGVkUG9zaXRpb24gPSAoaW50MTZfdCkoKChmbG9hdClwb3NpdGlvbi8xMDAwKSo5Nik7CisgICAgY29udmVydGVkUG9zaXRpb24gPSAoaW50MTZfdCkoKChmbG9hdClwb3NpdGlvbiAvIDEwMDApICogOTYpOwogICAgIHJldHVybiBjb252ZXJ0ZWRQb3NpdGlvbjsKLQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4NzksNTUgKzE2OTAsNTUgQEAKIC8vIE91dHB1dHM6CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBpbnQxNl90IHBvc2l0aW9uKXsKLQotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWTV9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCYWxhbmNlID0gMDsKK2ludCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBwb3NpdGlvbikgeworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMTYgQmFsYW5jZSA9IDA7CiAKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gcG9zaXRpb247CiAgICAgQmFsYW5jZSA9IFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKLSAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIHN0YXJ0IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZCIsCisgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAKLSAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9UUlVFKXsKLQotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIHRvIGJlIHNldCBpcyAlZCAlZFxuIiwgcG9zaXRpb24sIEJhbGFuY2UpOworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iU3RlcmVvUG9zaXRpb25FbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIHRvIGJlIHNldCBpcyAlZCAlZFxuIiwgcG9zaXRpb24sIEJhbGFuY2UpOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gcG9zaXRpb247CiAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgZ290OiIKKyAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycworICAgICAgICAvLyBnb3Q6IgogICAgICAgICAvLyAgICAgIiAlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOwogCiAgICAgICAgIC8qIFZvbHVtZSBwYXJhbWV0ZXJzICovCi0gICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICA9IEJhbGFuY2U7Ci0gICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oKSAoLTk2ZEIgLT4gKzk2ZEIpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlICk7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlID0gQmFsYW5jZTsKKyAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oKSAoLTk2ZEIgLT4gKzk2ZEIpICAgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlCisgICAgICAgIC8vICk7CiAKICAgICAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQotICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgICAgICAvLyBBTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAKICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIikKLSAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6ICIKKyAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyBnb3Q6CisgICAgICAgIC8vICIKICAgICAgICAgLy8gICAgICIlZFxuIiwgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIFBvc2l0aW9uIGF0dGVtcHRpbmcgdG8gc2V0LCBidXQgbm90IGVuYWJsZWQgJWQgJWRcbiIsCisgICAgICAgIC8vIHBvc2l0aW9uLCBCYWxhbmNlKTsKICAgICB9Ci0gICAgZWxzZXsKLSAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBQb3NpdGlvbiBhdHRlbXB0aW5nIHRvIHNldCwgYnV0IG5vdCBlbmFibGVkICVkICVkXG4iLAotICAgICAgICAvL3Bvc2l0aW9uLCBCYWxhbmNlKTsKLSAgICB9Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiBlbmQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkXG4iLAotICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24gZW5kIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAlZFxuIiwKKyAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uICovCit9IC8qIGVuZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKCkKQEAgLTE5NDEsMzUgKzE3NTIsMzUgQEAKIC8vICBwb3NpdGlvbjogICAgICAgc3RlcmVvIHBvc2l0aW9uCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCAqcG9zaXRpb24pewotICAgIC8vQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQiKTsKK2ludDMyX3QgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCogcENvbnRleHQsIGludDE2X3QqIHBvc2l0aW9uKSB7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQiKTsKIAotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJhbGFuY2U7CisgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9JTlQxNiBiYWxhbmNlOwogCi0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBzdGFydCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkID0gJWQiLAotICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gc3RhcnQgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9ICVkIiwKKyAgICAvLyBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKIAogICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24iKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSk7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwogCiAgICAgYmFsYW5jZSA9IFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKIAotICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX1RSVUUpewotICAgICAgICBpZihiYWxhbmNlICE9IEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKXsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fVFJVRSkgeworICAgICAgICBpZiAoYmFsYW5jZSAhPSBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgKnBvc2l0aW9uID0gKExWTV9JTlQxNilwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkOyAgICAgLy8gQ29udmVydCBkQiB0byBtaWxsaWJlbHMKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIGVuZCByZXR1cm5pbmcgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9JWRcbiIsCi0gICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICAqcG9zaXRpb24gPSAoTFZNX0lOVDE2KXBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQ7ICAvLyBDb252ZXJ0IGRCIHRvIG1pbGxpYmVscworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uIGVuZCByZXR1cm5pbmcgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZAorICAgIC8vID0lZFxuIiwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAgICAgcmV0dXJuIDA7Ci19ICAgIC8qIGVuZCBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbiAqLworfSAvKiBlbmQgVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24gKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbigpCkBAIC0xOTgyLDQwICsxNzkzLDQwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDMyX3QgVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24oRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIHVpbnQzMl90IGVuYWJsZWQpewotICAgIC8vQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gc3RhcnQoKSIpOworaW50MzJfdCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgZW5hYmxlZCkgeworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHN0YXJ0KCkiKTsKIAogICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBlbmFibGVkOwogCi0gICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWTV9Db250cm9sUGFyYW1zX3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24iKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIHRvICVkLCBwb3NpdGlvbiB3YXMgJWRcbiIsCisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiB0byAlZCwgcG9zaXRpb24gd2FzICVkXG4iLAogICAgIC8vICAgICBlbmFibGVkLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSApOwogCiAgICAgLyogU2V0IGFwcHJvcHJpYXRlIHN0ZXJlbyBwb3NpdGlvbiAqLwotICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPT0gTFZNX0ZBTFNFKXsKKyAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHsKICAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgPSAwOwotICAgIH1lbHNlewotICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUNvbnZlcnRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSA9CisgICAgICAgICAgICAgICAgVm9sdW1lQ29udmVydFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQpOwogICAgIH0KIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotICAgIC8vQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiBlbmQoKVxuIik7CisgICAgLy8gQUxPR1YoIlx0Vm9sdW1lRW5hYmxlU3RlcmVvUG9zaXRpb24gU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uIGVuZCgpXG4iKTsKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIFZvbHVtZUVuYWJsZVN0ZXJlb1Bvc2l0aW9uICovCit9IC8qIGVuZCBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbiAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEJhc3NCb29zdF9nZXRQYXJhbWV0ZXIoKQpAQCAtMjAzOCwxMyArMTg0OSwxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgQmFzc0Jvb3N0X2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjA1NSwyOCArMTg2MywyNyBAQAogICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7CiAgICAgICAgIGNhc2UgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRDoKICAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEhfU1VQUE9SVEVEICV1IiwgX19mdW5jX18sICoodWludDMyX3QgKilwVmFsdWUpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gMTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCAldSIsIF9fZnVuY19fLCAqKHVpbnQzMl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBCQVNTQk9PU1RfUEFSQU1fU1RSRU5HVEg6CiAgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gQmFzc0dldFN0cmVuZ3RoKHBDb250ZXh0KTsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sICooaW50MTZfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IEJhc3NHZXRTdHJlbmd0aChwQ29udGV4dCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEJBU1NCT09TVF9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMjEwNCwxMyArMTkxMSwxMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgQmFzc0Jvb3N0X3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IEJhc3NCb29zdF9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjEyNiw3ICsxOTMwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY29uc3QgaW50MTZfdCBzdHJlbmd0aCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgc3RyZW5ndGggPSAqKGludDE2X3QqKXBWYWx1ZTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sIHN0cmVuZ3RoKTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgQkFTU0JPT1NUX1BBUkFNX1NUUkVOR1RIIENhbGxpbmcgQmFzc1NldFN0cmVuZ3RoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgQmFzc1NldFN0cmVuZ3RoKHBDb250ZXh0LCAoaW50MzJfdClzdHJlbmd0aCk7CkBAIC0yMTY0LDEzICsxOTY4LDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBWaXJ0dWFsaXplcl9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTIxODAsNDcgKzE5ODEsNDcgQEAKICAgICB9CiAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSF9TVVBQT1JURUQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBzZXQgKnBWYWx1ZVNpemUKIAotICAgICAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSA9IDE7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCAlZCIsIF9fZnVuY19fLCAqKHVpbnQzMl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBWYWx1ZSA9IDE7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIX1NVUFBPUlRFRCAlZCIsIF9fZnVuY19fLCAqKHVpbnQzMl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFZpcnR1YWxpemVyR2V0U3RyZW5ndGgocENvbnRleHQpOworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBWaXJ0dWFsaXplckdldFN0cmVuZ3RoKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TVFJFTkdUSCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxfU1BFQUtFUl9BTkdMRVM6IHsKICAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAzICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NQRUFLRVJfQU5HTEVTIGludmFsaWQgcGFyYW1TaXplOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1BFQUtFUl9BTkdMRVMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1TaXplKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgcGFyYW1zWzFdOwotICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJhbXNbMl07CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdClwYXJhbXNbMV07CisgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpcGFyYW1zWzJdOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbmJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7CiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2YWx1ZVNpemVSZXF1aXJlZCA9IDMgKiBuYkNoYW5uZWxzICogc2l6ZW9mKGludDMyX3QpOwogICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgdmFsdWVTaXplUmVxdWlyZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1BFQUtFUl9BTkdMRVMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9TUEVBS0VSX0FOR0xFUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yMjI5LDIzICsyMDMwLDIzIEBACiAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIGNvbmZpZ3VyYXRpb24gaXMgc3VwcG9ydGVkCiAgICAgICAgICAgICBzdGF0dXMgPSBWaXJ0dWFsaXplcklzQ29uZmlndXJhdGlvblN1cHBvcnRlZChjaGFubmVsTWFzaywgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUyBtYXNrPTB4JXggZGV2aWNlPTB4JXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTF9TUEVBS0VSX0FOR0xFUyBtYXNrPTB4JXggZGV2aWNlPTB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBpcyBzdXBwb3J0ZWQsIGdldCB0aGUgYW5nbGVzCi0gICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJHZXRTcGVha2VyQW5nbGVzKGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlLCAoaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAgICAgVmlydHVhbGl6ZXJHZXRTcGVha2VyQW5nbGVzKGNoYW5uZWxNYXNrLCBkZXZpY2VUeXBlLCAoaW50MzJfdCopcFZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxJWkFUSU9OX01PREU6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1ZJUlRVQUxJWkFUSU9OX01PREUgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZih1aW50MzJfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fVklSVFVBTElaQVRJT05fTU9ERSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gKHVpbnQzMl90KSBWaXJ0dWFsaXplckdldFZpcnR1YWxpemF0aW9uTW9kZShwQ29udGV4dCk7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwVmFsdWUgPSAodWludDMyX3QpVmlydHVhbGl6ZXJHZXRWaXJ0dWFsaXphdGlvbk1vZGUocENvbnRleHQpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTIyNzMsMTcgKzIwNzQsMTQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZpcnR1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgVmlydHVhbGl6ZXJfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIAotICAgIGlmIChwYXJhbVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICBpZiAocGFyYW1TaXplICE9IHNpemVvZihpbnQzMl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgogICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTIyOTUsNyArMjA5Myw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgc3RyZW5ndGggPSAqKGludDE2X3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHN0cmVuZ3RoID0gKihpbnQxNl90KilwVmFsdWU7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX1NUUkVOR1RIICVkIiwgX19mdW5jX18sIHN0cmVuZ3RoKTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVklSVFVBTElaRVJfUEFSQU1fU1RSRU5HVEggQ2FsbGluZyBWaXJ0dWFsaXplclNldFN0cmVuZ3RoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgVmlydHVhbGl6ZXJTZXRTdHJlbmd0aChwQ29udGV4dCwgKGludDMyX3Qpc3RyZW5ndGgpOwpAQCAtMjMwNSwxNiArMjEwMywxNiBAQAogICAgICAgICBjYXNlIFZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREU6IHsKICAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXMgVklSVFVBTElaRVJfUEFSQU1fRk9SQ0VfVklSVFVBTElaQVRJT05fTU9ERSBpbnZhbGlkIHZhbHVlU2l6ZTogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2NDQ3ODAwMyIpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gKGF1ZGlvX2RldmljZXNfdCkqKGludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpICogKGludDMyX3QqKXBWYWx1ZTsKICAgICAgICAgICAgIHN0YXR1cyA9IFZpcnR1YWxpemVyRm9yY2VWaXJ0dWFsaXphdGlvbk1vZGUocENvbnRleHQsIGRldmljZVR5cGUpOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWSVJUVUFMSVpFUl9QQVJBTV9GT1JDRV9WSVJUVUFMSVpBVElPTl9NT0RFIGRldmljZT0lI3ggcmVzdWx0PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRldmljZVR5cGUsIHN0YXR1cyk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZJUlRVQUxJWkVSX1BBUkFNX0ZPUkNFX1ZJUlRVQUxJWkFUSU9OX01PREUgZGV2aWNlPSUjeCByZXN1bHQ9JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlLCBzdGF0dXMpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yMzQ3LDEzICsyMTQ1LDEwIEBACiAvLyBTaWRlIEVmZmVjdHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgRXF1YWxpemVyX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpIHsKK2ludCBFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCB1aW50MzJfdCBwYXJhbVNpemUsIHZvaWQqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjM2MiwyMTEgKzIxNTcsMjEwIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBzd2l0Y2ggKHBhcmFtc1swXSkgewotICAgIGNhc2UgRVFfUEFSQU1fTlVNX0JBTkRTOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fTlVNX0JBTkRTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKLQotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX05VTV9CQU5EUyAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKLQotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUzoKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgICAgKih1aW50MTZfdCAqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTICV1IiwgX19mdW5jX18sICoodWludDE2X3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfQkFORCBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDE2X3QpOwotCi0gICAgICAgIGNvbnN0IGludDMyX3QgZnJlcXVlbmN5ID0gcGFyYW1zWzFdOwotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldEJhbmQocENvbnRleHQsIGZyZXF1ZW5jeSk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX0JBTkQgZnJlcXVlbmN5ICVkLCBiYW5kICV1IiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZnJlcXVlbmN5LCAqKHVpbnQxNl90ICopcFZhbHVlKTsKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9CQU5EX0xFVkVMOiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHBhcmFtU2l6ZSAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0KLSAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOwotICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgewotICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzODU5OCIpOwotICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9OVU1fQkFORFM6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX05VTV9CQU5EUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IChpbnQxNl90KUVxdWFsaXplckdldEJhbmRMZXZlbChwQ29udGV4dCwgYmFuZCk7Ci0gICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGJhbmQsICooaW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgfSBicmVhazsKKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKHVpbnQxNl90KTsKIAotICAgIGNhc2UgRVFfUEFSQU1fTEVWRUxfUkFOR0U6Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDIgKiBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9MRVZFTF9SQU5HRSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAqKHVpbnQxNl90KilwVmFsdWUgPSAodWludDE2X3QpRklWRUJBTkRfTlVNQkFORFM7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX05VTV9CQU5EUyAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDE2X3QpOwogCi0gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IC0xNTAwOwotICAgICAgICAqKChpbnQxNl90ICopcFZhbHVlICsgMSkgPSAxNTAwOwotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0xFVkVMX1JBTkdFIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlLCAqKChpbnQxNl90ICopcFZhbHVlICsgMSkpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFOiB7Ci0gICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKnBWYWx1ZVNpemUgPSAyICogc2l6ZW9mKGludDMyX3QpOwotCi0gICAgICAgIGNvbnN0IGludDMyX3QgYmFuZCA9IHBhcmFtc1sxXTsKLSAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKLSAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIyNDc5NDgiKTsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgYmFuZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgIGNhc2UgRVFfUEFSQU1fQ1VSX1BSRVNFVDoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UocENvbnRleHQsIGJhbmQsICh1aW50MzJfdCAqKXBWYWx1ZSwgKCh1aW50MzJfdCAqKXBWYWx1ZSArIDEpKTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgYmFuZCAlZCwgbWluICVkLCBtYXggJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kLCAqKGludDMyX3QgKilwVmFsdWUsICooKGludDMyX3QgKilwVmFsdWUgKyAxKSk7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7CiAKLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9DRU5URVJfRlJFUTogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXRQcmVzZXQocENvbnRleHQpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUICV1IiwgX19mdW5jX18sICoodWludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKIAotICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07Ci0gICAgICAgIGlmIChiYW5kIDwgMCB8fCBiYW5kID49IEZJVkVCQU5EX05VTUJBTkRTKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgaWYgKGJhbmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQzNjM0MSIpOwotICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgIGNhc2UgRVFfUEFSQU1fR0VUX05VTV9PRl9QUkVTRVRTOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9HRVRfTlVNX09GX1BSRVNFVFMgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gRXF1YWxpemVyR2V0Q2VudHJlRnJlcXVlbmN5KHBDb250ZXh0LCBiYW5kKTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiYW5kLCAqKGludDMyX3QgKilwVmFsdWUpOwotICAgIH0gYnJlYWs7CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7CiAKLSAgICBjYXNlIEVRX1BBUkFNX0dFVF9QUkVTRVRfTkFNRTogewotICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BSRVNFVF9OQU1FIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9ICh1aW50MTZfdClFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9OVU1fT0ZfUFJFU0VUUyAldSIsIF9fZnVuY19fLCAqKHVpbnQxNl90KilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMSkgewotICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzUzNjQwNyIpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CiAKLSAgICAgICAgY29uc3QgaW50MzJfdCBwcmVzZXQgPSBwYXJhbXNbMV07Ci0gICAgICAgIGlmICgocHJlc2V0IDwgMCAmJiBwcmVzZXQgIT0gUFJFU0VUX0NVU1RPTSkgfHwgIHByZXNldCA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkpIHsKLSAgICAgICAgICAgIGlmIChwcmVzZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQ0ODI1OCIpOwotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkIiwgX19mdW5jX18sIHByZXNldCk7CisgICAgICAgIGNhc2UgRVFfUEFSQU1fR0VUX0JBTkQ6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodWludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MTZfdCk7CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJlcXVlbmN5ID0gcGFyYW1zWzFdOworICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlID0gKHVpbnQxNl90KUVxdWFsaXplckdldEJhbmQocENvbnRleHQsIGZyZXF1ZW5jeSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0dFVF9CQU5EIGZyZXF1ZW5jeSAlZCwgYmFuZCAldSIsIF9fZnVuY19fLCBmcmVxdWVuY3ksCisgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBwYXJhbVNpemUgJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07CisgICAgICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDM4NTk4Iik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gKGludDE2X3QpRXF1YWxpemVyR2V0QmFuZExldmVsKHBDb250ZXh0LCBiYW5kKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIF9fZnVuY19fLCBiYW5kLCAqKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9MRVZFTF9SQU5HRToKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IDIgKiBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fTEVWRUxfUkFOR0UgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSAtMTUwMDsKKyAgICAgICAgICAgICooKGludDE2X3QqKXBWYWx1ZSArIDEpID0gMTUwMDsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fTEVWRUxfUkFOR0UgbWluICVkLCBtYXggJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90KilwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgKigoaW50MTZfdCopcFZhbHVlICsgMSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0U6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0ZSRVFfUkFOR0UgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gMiAqIHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjI0Nzk0OCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgRVFfUEFSQU1fQkFORF9GUkVRX1JBTkdFIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVxdWFsaXplckdldEJhbmRGcmVxUmFuZ2UocENvbnRleHQsIGJhbmQsICh1aW50MzJfdCopcFZhbHVlLCAoKHVpbnQzMl90KilwVmFsdWUgKyAxKSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX0JBTkRfRlJFUV9SQU5HRSBiYW5kICVkLCBtaW4gJWQsIG1heCAlZCIsIF9fZnVuY19fLCBiYW5kLAorICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcFZhbHVlLCAqKChpbnQzMl90KilwVmFsdWUgKyAxKSk7CisKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0NFTlRFUl9GUkVROiB7CisgICAgICAgICAgICBpZiAocGFyYW1TaXplIDwgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIHBhcmFtU2l6ZTogJXUiLCBfX2Z1bmNfXywgcGFyYW1TaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NFTlRFUl9GUkVRIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDM2MzQxIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKihpbnQzMl90KilwVmFsdWUgPSBFcXVhbGl6ZXJHZXRDZW50cmVGcmVxdWVuY3kocENvbnRleHQsIGJhbmQpOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DRU5URVJfRlJFUSBiYW5kICVkLCBmcmVxdWVuY3kgJWQiLCBfX2Z1bmNfXywgYmFuZCwKKyAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUU6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BSRVNFVF9OQU1FIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzUzNjQwNyIpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKChwcmVzZXQgPCAwICYmIHByZXNldCAhPSBQUkVTRVRfQ1VTVE9NKSB8fCBwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjQ0ODI1OCIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGFyKiBjb25zdCBuYW1lID0gKGNoYXIqKXBWYWx1ZTsKKyAgICAgICAgICAgIHN0cm5jcHkobmFtZSwgRXF1YWxpemVyR2V0UHJlc2V0TmFtZShwcmVzZXQpLCAqcFZhbHVlU2l6ZSAtIDEpOworICAgICAgICAgICAgbmFtZVsqcFZhbHVlU2l6ZSAtIDFdID0gMDsKKyAgICAgICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fR0VUX1BSRVNFVF9OQU1FIHByZXNldCAlZCwgbmFtZSAlcyBsZW4gJWQiLCBfX2Z1bmNfXywgcHJlc2V0LCBuYW1lLAorICAgICAgICAgICAgICAgICAgICpwVmFsdWVTaXplKTsKKworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogeworICAgICAgICAgICAgY29uc3RleHByIHVpbnQzMl90IHJlcXVpcmVkVmFsdWVTaXplID0gKDIgKyBGSVZFQkFORF9OVU1CQU5EUykgKiBzaXplb2YodWludDE2X3QpOworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgcmVxdWlyZWRWYWx1ZVNpemUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sICpwVmFsdWVTaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSByZXF1aXJlZFZhbHVlU2l6ZTsKKworICAgICAgICAgICAgaW50MTZfdCogcCA9IChpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHBbMF0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRQcmVzZXQocENvbnRleHQpOworICAgICAgICAgICAgcFsxXSA9IChpbnQxNl90KUZJVkVCQU5EX05VTUJBTkRTOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFsyICsgaV0gPSAoaW50MTZfdClFcXVhbGl6ZXJHZXRCYW5kTGV2ZWwocENvbnRleHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhciAqIGNvbnN0IG5hbWUgPSAoY2hhciAqKXBWYWx1ZTsKLSAgICAgICAgc3RybmNweShuYW1lLCBFcXVhbGl6ZXJHZXRQcmVzZXROYW1lKHByZXNldCksICpwVmFsdWVTaXplIC0gMSk7Ci0gICAgICAgIG5hbWVbKnBWYWx1ZVNpemUgLSAxXSA9IDA7Ci0gICAgICAgICpwVmFsdWVTaXplID0gc3RybGVuKG5hbWUpICsgMTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9HRVRfUFJFU0VUX05BTUUgcHJlc2V0ICVkLCBuYW1lICVzIGxlbiAlZCIsCi0gICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJlc2V0LCBuYW1lLCAqcFZhbHVlU2l6ZSk7Ci0KLSAgICB9IGJyZWFrOwotCi0gICAgY2FzZSBFUV9QQVJBTV9QUk9QRVJUSUVTOiB7Ci0gICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCByZXF1aXJlZFZhbHVlU2l6ZSA9ICgyICsgRklWRUJBTkRfTlVNQkFORFMpICogc2l6ZW9mKHVpbnQxNl90KTsKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgcmVxdWlyZWRWYWx1ZVNpemUpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICpwVmFsdWVTaXplID0gcmVxdWlyZWRWYWx1ZVNpemU7Ci0KLSAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOwotICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyIsIF9fZnVuY19fKTsKLSAgICAgICAgcFswXSA9IChpbnQxNl90KUVxdWFsaXplckdldFByZXNldChwQ29udGV4dCk7Ci0gICAgICAgIHBbMV0gPSAoaW50MTZfdClGSVZFQkFORF9OVU1CQU5EUzsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICBwWzIgKyBpXSA9IChpbnQxNl90KUVxdWFsaXplckdldEJhbmRMZXZlbChwQ29udGV4dCwgaSk7Ci0gICAgICAgIH0KLSAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoIiVzIGludmFsaWQgcGFyYW0gJWQiLCBfX2Z1bmNfXywgcGFyYW1zWzBdKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgQUxPR1ZWKCIlcyBlbmQgcGFyYW06ICVkLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSwgc3RhdHVzKTsKQEAgLTI1ODksMTMgKzIzODMsMTAgQEAKIC8vIE91dHB1dHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgRXF1YWxpemVyX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHBhcmFtU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgIHZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBWYWx1ZSkgeworaW50IEVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHBhcmFtU2l6ZSwgdm9pZCogcFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQzMl90ICpwYXJhbXMgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwYXJhbXMgPSAoaW50MzJfdCopcFBhcmFtOwogCiAgICAgQUxPR1ZWKCIlcyBzdGFydCIsIF9fZnVuY19fKTsKIApAQCAtMjYwNCw4NyArMjM5NSw4NyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKLSAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6IHsKLSAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0NVUl9QUkVTRVQgaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgdmFsdWVTaXplKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBpbnQzMl90IHByZXNldCA9IChpbnQzMl90KSoodWludDE2X3QgKilwVmFsdWU7Ci0KLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUICVkIiwgX19mdW5jX18sIHByZXNldCk7Ci0gICAgICAgIGlmIChwcmVzZXQgPj0gRXF1YWxpemVyR2V0TnVtUHJlc2V0cygpIHx8IHByZXNldCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgcHJlc2V0ICVkIiwgX19mdW5jX18sIHByZXNldCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCBwcmVzZXQpOwotICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKLSAgICAgICAgaWYgKHBhcmFtU2l6ZSA8IDIgKiBzaXplb2YoaW50MzJfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgcGFyYW1TaXplOiAldSIsIF9fZnVuY19fLCBwYXJhbVNpemUpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgaW50MzJfdCBiYW5kID0gIHBhcmFtc1sxXTsKLSAgICAgICAgY29uc3QgaW50MzJfdCBsZXZlbCA9IChpbnQzMl90KSooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGJhbmQgJWQsIGxldmVsICVkIiwgX19mdW5jX18sIGJhbmQsIGxldmVsKTsKLSAgICAgICAgaWYgKGJhbmQgPCAwIHx8IGJhbmQgPj0gRklWRUJBTkRfTlVNQkFORFMpIHsKLSAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgewotICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU2MjYiKTsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIGJhbmQgJWQiLCBfX2Z1bmNfXywgYmFuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBiYW5kLCBsZXZlbCk7Ci0gICAgfSBicmVhazsKLQotICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogewotICAgICAgICBBTE9HVlYoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MTZfdCAqcCA9IChpbnQxNl90ICopcFZhbHVlOwotICAgICAgICBpZiAoKGludClwWzBdID49IEVxdWFsaXplckdldE51bVByZXNldHMoKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCBwcmVzZXQgJWQiLCBfX2Z1bmNfXywgKGludClwWzBdKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAocFswXSA+PSAwKSB7Ci0gICAgICAgICAgICBFcXVhbGl6ZXJTZXRQcmVzZXQocENvbnRleHQsIChpbnQpcFswXSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgdmFsdWVTaXplUmVxdWlyZWQgPSAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZihpbnQxNl90KTsKLSAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCB2YWx1ZVNpemVSZXF1aXJlZCkgewotICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM3NTYzMzcxIik7Ci0gICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgdmFsdWVTaXplICV1IDwgJXUiLAotICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUsIHZhbHVlU2l6ZVJlcXVpcmVkKTsKLSAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGludClwWzFdICE9IEZJVkVCQU5EX05VTUJBTkRTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX1BST1BFUlRJRVMgaW52YWxpZCBiYW5kcyAlZCIsIF9fZnVuY19fLCAoaW50KXBbMV0pOworICAgICAgICBjYXNlIEVRX1BBUkFNX0NVUl9QUkVTRVQ6IHsKKyAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFcXVhbGl6ZXJTZXRCYW5kTGV2ZWwocENvbnRleHQsIGksIChpbnQpcFsyICsgaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBicmVhazsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcHJlc2V0ID0gKGludDMyX3QpICogKHVpbnQxNl90KilwVmFsdWU7CiAKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVigiJXMgaW52YWxpZCBwYXJhbSAlZCIsIF9fZnVuY19fLCBwYXJhbXNbMF0pOwotICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOwotICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQ1VSX1BSRVNFVCAlZCIsIF9fZnVuY19fLCBwcmVzZXQpOworICAgICAgICAgICAgaWYgKHByZXNldCA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkgfHwgcHJlc2V0IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9DVVJfUFJFU0VUIGludmFsaWQgcHJlc2V0ICVkIiwgX19mdW5jX18sIHByZXNldCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgcHJlc2V0KTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEVRX1BBUkFNX0JBTkRfTEVWRUw6IHsKKyAgICAgICAgICAgIGlmIChwYXJhbVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIEVRX1BBUkFNX0JBTkRfTEVWRUwgaW52YWxpZCBwYXJhbVNpemU6ICV1IiwgX19mdW5jX18sIHBhcmFtU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZVNpemUgPCBzaXplb2YoaW50MTZfdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBpbnZhbGlkIHZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGJhbmQgPSBwYXJhbXNbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGxldmVsID0gKGludDMyX3QpICogKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgRVFfUEFSQU1fQkFORF9MRVZFTCBiYW5kICVkLCBsZXZlbCAlZCIsIF9fZnVuY19fLCBiYW5kLCBsZXZlbCk7CisgICAgICAgICAgICBpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgIGlmIChiYW5kIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyMDk1NjI2Iik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBFUV9QQVJBTV9CQU5EX0xFVkVMIGludmFsaWQgYmFuZCAlZCIsIF9fZnVuY19fLCBiYW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVxdWFsaXplclNldEJhbmRMZXZlbChwQ29udGV4dCwgYmFuZCwgbGV2ZWwpOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgRVFfUEFSQU1fUFJPUEVSVElFUzogeworICAgICAgICAgICAgQUxPR1ZWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIiwgX19mdW5jX18pOworICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBFUV9QQVJBTV9QUk9QRVJUSUVTIGludmFsaWQgdmFsdWVTaXplICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDE2X3QqIHAgPSAoaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgaWYgKChpbnQpcFswXSA+PSBFcXVhbGl6ZXJHZXROdW1QcmVzZXRzKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHByZXNldCAlZCIsIF9fZnVuY19fLCAoaW50KXBbMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocFswXSA+PSAwKSB7CisgICAgICAgICAgICAgICAgRXF1YWxpemVyU2V0UHJlc2V0KHBDb250ZXh0LCAoaW50KXBbMF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdGV4cHIgdWludDMyX3QgdmFsdWVTaXplUmVxdWlyZWQgPSAoMiArIEZJVkVCQU5EX05VTUJBTkRTKSAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVTaXplIDwgdmFsdWVTaXplUmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNzU2MzM3MSIpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIHZhbHVlU2l6ZSAldSA8ICV1IiwgX19mdW5jX18sIHZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTaXplUmVxdWlyZWQpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpbnQpcFsxXSAhPSBGSVZFQkFORF9OVU1CQU5EUykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgRVFfUEFSQU1fUFJPUEVSVElFUyBpbnZhbGlkIGJhbmRzICVkIiwgX19mdW5jX18sIChpbnQpcFsxXSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRXF1YWxpemVyU2V0QmFuZExldmVsKHBDb250ZXh0LCBpLCAoaW50KXBbMiArIGldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dWKCIlcyBpbnZhbGlkIHBhcmFtICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgQUxPR1ZWKCIlcyBlbmQgcGFyYW06ICVkLCBzdGF0dXM6ICVkIiwgX19mdW5jX18sIHBhcmFtc1swXSwgc3RhdHVzKTsKQEAgLTI3MTIsMTMgKzI1MDMsMTAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFZvbHVtZV9nZXRQYXJhbWV0ZXIoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICBwYXJhbVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgVm9sdW1lX2dldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CiAgICAgaW50IHN0YXR1cyA9IDA7Ci0gICAgaW50MzJfdCAqcGFyYW1zID0gKGludDMyX3QgKilwUGFyYW07CisgICAgaW50MzJfdCogcGFyYW1zID0gKGludDMyX3QqKXBQYXJhbTsKIAogICAgIEFMT0dWVigiJXMgc3RhcnQiLCBfX2Z1bmNfXyk7CiAKQEAgLTI3MjgsMTkgKzI1MTYsMTkgQEAKICAgICB9CiAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHsKICAgICAgICAgY2FzZSBWT0xVTUVfUEFSQU1fTEVWRUw6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7IC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgIC8vIGxlZ2FjeTogY2hlY2sgZXF1YWxpdHkgaGVyZS4KICAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0xFVkVMIGludmFsaWQgKnBWYWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRWb2x1bWVMZXZlbChwQ29udGV4dCwgKGludDE2X3QgKikocFZhbHVlKSk7Ci0gICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QgKilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gVm9sdW1lR2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KikocFZhbHVlKSk7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9MRVZFTCAlZCIsIF9fZnVuY19fLCAqKGludDE2X3QqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9NQVhMRVZFTDoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAgLy8gbGVnYWN5OiBjaGVjayBlcXVhbGl0eSBoZXJlLgogICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fTUFYTEVWRUwgaW52YWxpZCAqcFZhbHVlU2l6ZSAldSIsIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3NDgsMjEgKzI1MzYsMjEgQEAKICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gc2V0ICpwVmFsdWVTaXplCiAKICAgICAgICAgICAgIC8vIGluIG1pbGxpYmVsCi0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSAwOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTUFYTEVWRUwgJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gMDsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX01BWExFVkVMICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgeyAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCi0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7ICAvLyBsZWdhY3k6IGNoZWNrIGVxdWFsaXR5IGhlcmUuCisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHNldCAqcFZhbHVlU2l6ZQogCi0gICAgICAgICAgICBWb2x1bWVHZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgKGludDE2X3QgKilwVmFsdWUpOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgKihpbnQxNl90ICopcFZhbHVlKTsKKyAgICAgICAgICAgIFZvbHVtZUdldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LCAoaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sICooaW50MTZfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX01VVEU6CkBAIC0yNzczLDIxICsyNTYxLDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAKLSAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZUdldE11dGUocENvbnRleHQsICh1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgJXUiLCBfX2Z1bmNfXywgKih1aW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVHZXRNdXRlKHBDb250ZXh0LCAodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX01VVEUgJXUiLCBfX2Z1bmNfXywgKih1aW50MzJfdCopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OOgogICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDMyX3QpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqcFZhbHVlU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiBpbnZhbGlkICpwVmFsdWVTaXplICV1IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQzMl90KTsKIAotICAgICAgICAgICAgKihpbnQzMl90ICopcFZhbHVlID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZDsKLSAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OICVkIiwgX19mdW5jX18sICooaW50MzJfdCAqKXBWYWx1ZSk7CisgICAgICAgICAgICAqKGludDMyX3QqKXBWYWx1ZSA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7CisgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTiAlZCIsIF9fZnVuY19fLCAqKGludDMyX3QqKXBWYWx1ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0yODE2LDEzICsyNjA0LDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBWb2x1bWVfc2V0UGFyYW1ldGVyKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgcGFyYW1TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgdmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFZhbHVlKSB7CitpbnQgVm9sdW1lX3NldFBhcmFtZXRlcihFZmZlY3RDb250ZXh0KiBwQ29udGV4dCwgdWludDMyX3QgcGFyYW1TaXplLCB2b2lkKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBhcmFtcyA9IChpbnQzMl90ICopcFBhcmFtOworICAgIGludDMyX3QqIHBhcmFtcyA9IChpbnQzMl90KilwUGFyYW07CiAKICAgICBBTE9HVlYoIiVzIHN0YXJ0IiwgX19mdW5jX18pOwogCkBAIC0yODM4LDcgKzI2MjMsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBpbnQxNl90IGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCBsZXZlbCA9ICooaW50MTZfdCopcFZhbHVlOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgJWQiLCBfX2Z1bmNfXywgbGV2ZWwpOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTEVWRUwgQ2FsbGluZyBWb2x1bWVTZXRWb2x1bWVMZXZlbCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IFZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCBsZXZlbCk7CkBAIC0yODUzLDcgKzI2MzgsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGUgPSAqKHVpbnQzMl90KilwVmFsdWU7CiAgICAgICAgICAgICBBTE9HVlYoIiVzIFZPTFVNRV9QQVJBTV9NVVRFICVkIiwgX19mdW5jX18sIG11dGUpOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fTVVURSBDYWxsaW5nIFZvbHVtZVNldE11dGUiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRNdXRlKHBDb250ZXh0LCBtdXRlKTsKQEAgLTI4NjIsMTUgKzI2NDcsMTYgQEAKIAogICAgICAgICBjYXNlIFZPTFVNRV9QQVJBTV9FTkFCTEVTVEVSRU9QT1NJVElPTjogewogICAgICAgICAgICAgaWYgKHZhbHVlU2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGludmFsaWQgdmFsdWVTaXplICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2YWx1ZVNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBWT0xVTUVfUEFSQU1fRU5BQkxFU1RFUkVPUE9TSVRJT04gaW52YWxpZCB2YWx1ZVNpemUgJXUiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uRW5hYmxlZCA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbkVuYWJsZWQgPSAqKHVpbnQzMl90KilwVmFsdWU7CiAgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVFbmFibGVTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgcG9zaXRpb25FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICA/OiBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID86IFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wb3NpdGlvblNhdmVkKTsKICAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OIGNhbGxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgfSBicmVhazsKIApAQCAtMjg4MSwxMyArMjY2NywxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHBvc2l0aW9uID0gKihpbnQxNl90ICopcFZhbHVlOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCBwb3NpdGlvbiA9ICooaW50MTZfdCopcFZhbHVlOwogICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gJWQiLCBfX2Z1bmNfXywgcG9zaXRpb24pOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gQ2FsbGluZyBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIEFMT0dWVigiJXMgVk9MVU1FX1BBUkFNX1NURVJFT1BPU0lUSU9OIENhbGxpbmcgVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbihwQ29udGV4dCwgcG9zaXRpb24pOwotICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gQ2FsbGVkIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgQUxPR1ZWKCIlcyBWT0xVTUVfUEFSQU1fU1RFUkVPUE9TSVRJT04gQ2FsbGVkIFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uIiwgX19mdW5jX18pOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yOTEyLDE4ICsyNjk2LDE1IEBACiAgKiAgUmVtYXJrcyAgICAgOgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLUxWTV9JTlQxNiBMVkNfVG9EQl9zMzJUb3MxNihMVk1fSU5UMzIgTGluX2ZpeCkKLXsKLSAgICBMVk1fSU5UMTYgICBkYl9maXg7Ci0gICAgTFZNX0lOVDE2ICAgU2hpZnQ7Ci0gICAgTFZNX0lOVDE2ICAgU21hbGxSZW1haW5kZXI7Ci0gICAgTFZNX1VJTlQzMiAgUmVtYWluZGVyID0gKExWTV9VSU5UMzIpTGluX2ZpeDsKK0xWTV9JTlQxNiBMVkNfVG9EQl9zMzJUb3MxNihMVk1fSU5UMzIgTGluX2ZpeCkgeworICAgIExWTV9JTlQxNiBkYl9maXg7CisgICAgTFZNX0lOVDE2IFNoaWZ0OworICAgIExWTV9JTlQxNiBTbWFsbFJlbWFpbmRlcjsKKyAgICBMVk1fVUlOVDMyIFJlbWFpbmRlciA9IChMVk1fVUlOVDMyKUxpbl9maXg7CiAKICAgICAvKiBDb3VudCBsZWFkaW5nIGJpdHMsIDEgY3ljbGUgaW4gYXNzZW1ibHkqLwotICAgIGZvciAoU2hpZnQgPSAwOyBTaGlmdDwzMjsgU2hpZnQrKykKLSAgICB7Ci0gICAgICAgIGlmICgoUmVtYWluZGVyICYgMHg4MDAwMDAwMFUpIT0wKQotICAgICAgICB7CisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgMzI7IFNoaWZ0KyspIHsKKyAgICAgICAgaWYgKChSZW1haW5kZXIgJiAweDgwMDAwMDAwVSkgIT0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgUmVtYWluZGVyID0gUmVtYWluZGVyIDw8IDE7CkBAIC0yOTM0LDkgKzI3MTUsOSBAQAogICAgICAqCiAgICAgICogZEIgPSAtOTYgKiBTaGlmdCArIDE2ICogKDggKiBSZW1haW5kZXIgLSAyICogUmVtYWluZGVyXjIpCiAgICAgICovCi0gICAgZGJfZml4ICAgID0gKExWTV9JTlQxNikoLTk2ICogU2hpZnQpOyAgICAgICAgICAgICAgIC8qIFNpeCBkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQqLworICAgIGRiX2ZpeCA9IChMVk1fSU5UMTYpKC05NiAqIFNoaWZ0KTsgLyogU2l4IGRCIHN0ZXBzIGluIFExMS40IGZvcm1hdCovCiAgICAgU21hbGxSZW1haW5kZXIgPSAoTFZNX0lOVDE2KSgoUmVtYWluZGVyICYgMHg3ZmZmZmZmZikgPj4gMjQpOwotICAgIGRiX2ZpeCA9IChMVk1fSU5UMTYpKGRiX2ZpeCArIFNtYWxsUmVtYWluZGVyICk7CisgICAgZGJfZml4ID0gKExWTV9JTlQxNikoZGJfZml4ICsgU21hbGxSZW1haW5kZXIpOwogICAgIFNtYWxsUmVtYWluZGVyID0gKExWTV9JTlQxNikoU21hbGxSZW1haW5kZXIgKiBTbWFsbFJlbWFpbmRlcik7CiAgICAgZGJfZml4ID0gKExWTV9JTlQxNikoZGJfZml4IC0gKExWTV9JTlQxNikoKExWTV9VSU5UMTYpU21hbGxSZW1haW5kZXIgPj4gOSkpOwogCkBAIC0yOTYwLDExICsyNzQxLDEwIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBFZmZlY3Rfc2V0RW5hYmxlZChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwgYm9vbCBlbmFibGVkKQotewotICAgIEFMT0dWKCIlcyBlZmZlY3RUeXBlICVkLCBlbmFibGVkICVkLCBjdXJyZW50bHkgZW5hYmxlZCAlZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUsIGVuYWJsZWQsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKLSAgICBpbnQgJmVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOworaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQqIHBDb250ZXh0LCBib29sIGVuYWJsZWQpIHsKKyAgICBBTE9HVigiJXMgZWZmZWN0VHlwZSAlZCwgZW5hYmxlZCAlZCwgY3VycmVudGx5IGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywgcENvbnRleHQtPkVmZmVjdFR5cGUsCisgICAgICAgICAgZW5hYmxlZCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworICAgIGludCYgZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47CiAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgLy8gQmFzcyBib29zdCBvciBWaXJ0dWFsaXplciBjYW4gYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgaWYgcGxheWluZyBvdmVyIGRldmljZSBzcGVha2VyIGR1ZQogICAgICAgICAvLyB0byB0aGVpciBuYXR1cmUuCkBAIC0yOTcyLDE1ICsyNzUyLDE1IEBACiAgICAgICAgIHN3aXRjaCAocENvbnRleHQtPkVmZmVjdFR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgTFZNX0JBU1NfQk9PU1Q6CiAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fVFJVRSkgewotICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBMVk1fQkFTU19CT09TVCBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIExWTV9CQVNTX0JPT1NUIGlzIGFscmVhZHkgZW5hYmxlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCl7CisgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX0JBU1NfQk9PU1QpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID0KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQqMC4xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgKiAwLjEpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgICAgIHRlbXBEaXNhYmxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjk4OSwxMiArMjc2OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3Rfc2V0RW5hYmxlZCgpIExWTV9FUVVBTElaRVIgaXMgYWxyZWFkeSBlbmFibGVkIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA8PSAwKXsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPD0gMCkgewogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fRVFVQUxJWkVSKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9Ci0gICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kKjAuMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kICogMC4xKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9UUlVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMVk1fVklSVFVBTElaRVI6CkBAIC0zMDAyLDEyICsyNzgyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZJUlRVQUxJWkVSIGlzIGFscmVhZHkgZW5hYmxlZCIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA8PSAwKXsKKyAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WSVJUVUFMSVpFUik7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9Ci0gICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kKjAuMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kICogMC4xKTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVmlydHVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgdGVtcERpc2FibGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzA4NCw0MSArMjg2NCwzOSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBMVkNfQ29udmVydF9Wb2xUb0RiKHVpbnQzMl90IHZvbCl7Ci0gICAgaW50MTZfdCAgZEI7CitpbnQxNl90IExWQ19Db252ZXJ0X1ZvbFRvRGIodWludDMyX3Qgdm9sKSB7CisgICAgaW50MTZfdCBkQjsKIAotICAgIGRCID0gTFZDX1RvREJfczMyVG9zMTYodm9sIDw8Nyk7Ci0gICAgZEIgPSAoZEIgKzgpPj40OwotICAgIGRCID0gKGRCIDwtOTYpID8gLTk2IDogZEIgOworICAgIGRCID0gTFZDX1RvREJfczMyVG9zMTYodm9sIDw8IDcpOworICAgIGRCID0gKGRCICsgOCkgPj4gNDsKKyAgICBkQiA9IChkQiA8IC05NikgPyAtOTYgOiBkQjsKIAogICAgIHJldHVybiBkQjsKIH0KIAotfSAvLyBuYW1lc3BhY2UKLX0gLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIGV4dGVybiAiQyIgewogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBQcm9jZXNzICovCi1pbnQgRWZmZWN0X3Byb2Nlc3MoZWZmZWN0X2hhbmRsZV90ICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgICAgICAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICpvdXRCdWZmZXIpewotICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7Ci0gICAgaW50ICAgIHN0YXR1cyA9IDA7Ci0gICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworaW50IEVmZmVjdF9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsIGF1ZGlvX2J1ZmZlcl90KiBvdXRCdWZmZXIpIHsKKyAgICBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0KilzZWxmOworICAgIGludCBzdGF0dXMgPSAwOworICAgIGludCBwcm9jZXNzU3RhdHVzID0gMDsKICAgICBjb25zdCBpbnQgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAotLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyBTdGFydCA6IEVuYWJsZWQgPSAlZCAgICAgQ2FsbGVkID0gJWQgKCU4ZCAlOGQgJThkKSIsCi0vL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCi0vLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiwKLS8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQsCi0vLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CisgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgU3RhcnQgOiBFbmFibGVkID0gJWQgICAgIENhbGxlZCA9ICVkICglOGQgJThkICU4ZCkiLAorICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCisgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIsCisgICAgLy8gICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCwKKyAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAKLSAgICBpZiAocENvbnRleHQgPT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpeworICAgIC8vIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKICAgICAvLyAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IEVmZmVjdCB0eXBlIGlzIEJBU1NfQk9PU1QiKTsKICAgICAvL31lbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpewogICAgIC8vICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogRWZmZWN0IHR5cGUgaXMgTFZNX0VRVUFMSVpFUiIpOwpAQCAtMzEyNiwxNSArMjkwNCwxNCBAQAogICAgIC8vICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogRWZmZWN0IHR5cGUgaXMgTFZNX1ZJUlRVQUxJWkVSIik7CiAgICAgLy99CiAKLSAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCAgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMICB8fAotICAgICAgICAgICAgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAotICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgIT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50KXsKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgfHwgb3V0QnVmZmVyID09IE5VTEwgfHwgb3V0QnVmZmVyLT5yYXcgPT0gTlVMTCB8fAorICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBFUlJPUiBOVUxMIElOUFVUIFBPSU5URVIgT1IgRlJBTUUgQ09VTlQgSVMgV1JPTkciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgaW50ICZlZmZlY3RQcm9jZXNzQ2FsbGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0UHJvY2Vzc0NhbGxlZDsKLSAgICBpbnQgJmVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOworICAgIGludCYgZWZmZWN0UHJvY2Vzc0NhbGxlZCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdFByb2Nlc3NDYWxsZWQ7CisgICAgaW50JiBlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKICAgICBpZiAoKGVmZmVjdFByb2Nlc3NDYWxsZWQgJiAxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKSAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJFZmZlY3QgJWQgYWxyZWFkeSBjYWxsZWQiLCBwQ29udGV4dC0+RWZmZWN0VHlwZSk7CiAgICAgICAgIGNvbnN0IGludCB1bmRyYWluZWRFZmZlY3RzID0gZWZmZWN0SW5EcmFpbiAmIH5lZmZlY3RQcm9jZXNzQ2FsbGVkOwpAQCAtMzE2NCwxMiArMjk0MSwxMiBAQAogICAgIH0KICAgICBlZmZlY3RQcm9jZXNzQ2FsbGVkIHw9IDEgPDwgcENvbnRleHQtPkVmZmVjdFR5cGU7CiAKLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKLSAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fQkFTU19CT09TVCBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPiAwKXsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fQkFTU19CT09TVCBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgdG8gdHVybiBvZmYgQkFTU19CT09TVCwgJWQgc2FtcGxlcyBsZWZ0IiwKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIDw9IDApIHsKQEAgLTMxODEsMjEgKzI5NTgsMjEgQEAKICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSkmJgotICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZPTFVNRSBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKKyAgICBpZiAoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID09IExWTV9GQUxTRSkgJiYKKyAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZPTFVNRSBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7CiAgICAgICAgIGlmICgoZWZmZWN0SW5EcmFpbiAmIDEgPDwgTFZNX1ZPTFVNRSkgIT0gMCkgewogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WT0xVTUUpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCi0gICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApeworICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSAmJgorICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPiAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxIDw9IDApIHsKQEAgLTMyMDcsMTMgKzI5ODQsMTIgQEAKICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSBmb3IgTFZNX0VRVUFMSVpFUiIpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpJiYKLSAgICAgICAgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUikpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IC09Ci0gICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3M6IFdhaXRpbmcgZm9yIHRvIHR1cm4gb2ZmIFZJUlRVQUxJWkVSLCAlZCBzYW1wbGVzIGxlZnQiLAorICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fRkFMU0UpICYmCisgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZJUlRVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApIHsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IDw9IDApIHsKQEAgLTMyMjYsMzcgKzMwMDIsMzQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmKHN0YXR1cyAhPSAtRU5PREFUQSl7CisgICAgaWYgKHN0YXR1cyAhPSAtRU5PREFUQSkgewogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkKys7CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPj0KLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKSB7Ci0KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpIHsKICAgICAgICAgLy8gV2UgZXhwZWN0IHRoZSAjIGVmZmVjdHMgY2FsbGVkIHRvIGJlIGVxdWFsIHRvICMgZWZmZWN0cyBlbmFibGVkIGluIHNlcXVlbmNlIChpbmNsdWRpbmcKICAgICAgICAgLy8gZHJhaW5pbmcgZWZmZWN0cykuICBXYXJuIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlIGR1ZSB0byBpbmNvbnNpc3RlbnQgY2FsbHMuCiAgICAgICAgIEFMT0dXX0lGKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPgotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICIlcyBOdW1iZXIgb2YgZWZmZWN0cyBjYWxsZWQgJWQgaXMgZ3JlYXRlciB0aGFuIG51bWJlciBvZiBlZmZlY3RzIGVuYWJsZWQgJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLAotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKLSAgICAgICAgZWZmZWN0UHJvY2Vzc0NhbGxlZCA9IDA7IC8vIHJlc2V0IG91ciBjb25zaXN0ZW5jeSBjaGVjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgIiVzIE51bWJlciBvZiBlZmZlY3RzIGNhbGxlZCAlZCBpcyBncmVhdGVyIHRoYW4gbnVtYmVyIG9mIGVmZmVjdHMgZW5hYmxlZCAlZCIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkLAorICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7CisgICAgICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQgPSAwOyAgLy8gcmVzZXQgb3VyIGNvbnNpc3RlbmN5IGNoZWNrLgogCi0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgICAgIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLAotICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAotICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgICAgIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QKKyAgICAgICAgLy8gJWQiLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKKyAgICAgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogCi0gICAgICAgIGlmIChzdGF0dXMgPT0gLUVOT0RBVEEpeworICAgICAgICBpZiAoc3RhdHVzID09IC1FTk9EQVRBKSB7CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIHByb2Nlc3NpbmcgbGFzdCBmcmFtZSIpOwogICAgICAgICB9CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOwogICAgICAgICAvKiBQcm9jZXNzIGFsbCB0aGUgYXZhaWxhYmxlIGZyYW1lcywgYmxvY2sgcHJvY2Vzc2luZyBpcwogICAgICAgICAgICBoYW5kbGVkIGludGVybmFsTFkgYnkgdGhlIExWTSBidW5kbGUgKi8KLSAgICAgICAgcHJvY2Vzc1N0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKGluQnVmZmVyLT5mMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKLSAgICAgICAgaWYgKHByb2Nlc3NTdGF0dXMgIT0gMCl7CisgICAgICAgIHByb2Nlc3NTdGF0dXMgPSBhbmRyb2lkOjpMdm1CdW5kbGVfcHJvY2VzcyhpbkJ1ZmZlci0+ZjMyLCBvdXRCdWZmZXItPmYzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwgcENvbnRleHQpOworICAgICAgICBpZiAocHJvY2Vzc1N0YXR1cyAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyByZXR1cm5lZCBlcnJvciAlZCIsIHByb2Nlc3NTdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gcHJvY2Vzc1N0YXR1czsKQEAgLTMyNjQsMTMzICszMDM3LDEyNiBAQAogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgTm90IENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QgJWQiLAotICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLAotICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MgTm90IENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGVmZmVjdHMgZW5hYmxlZCwgJWQgY2FsbGVkOiBFZmZlY3QKKyAgICAgICAgLy8gJWQiLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKKyAgICAgICAgLy8gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwogCiAgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsgKytpKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvdXRCdWZmZXItPnJhdyAhPSBpbkJ1ZmZlci0+cmF3KSB7Ci0gICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLT5yYXcsCi0gICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LAorICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKLX0gICAvKiBlbmQgRWZmZWN0X3Byb2Nlc3MgKi8KK30gLyogZW5kIEVmZmVjdF9wcm9jZXNzICovCiAKIC8vIFRoZSB2YWx1ZSBvZmZzZXQgb2YgYW4gZWZmZWN0IHBhcmFtZXRlciBpcyBjb21wdXRlZCBieSByb3VuZGluZyB1cAogLy8gdGhlIHBhcmFtZXRlciBzaXplIHRvIHRoZSBuZXh0IDMyIGJpdCBhbGlnbm1lbnQuCi1zdGF0aWMgaW5saW5lIHVpbnQzMl90IGNvbXB1dGVQYXJhbVZPZmZzZXQoY29uc3QgZWZmZWN0X3BhcmFtX3QgKnApIHsKLSAgICByZXR1cm4gKChwLT5wc2l6ZSArIHNpemVvZihpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpKSAqCi0gICAgICAgICAgICBzaXplb2YoaW50MzJfdCk7CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGNvbXB1dGVQYXJhbVZPZmZzZXQoY29uc3QgZWZmZWN0X3BhcmFtX3QqIHApIHsKKyAgICByZXR1cm4gKChwLT5wc2l6ZSArIHNpemVvZihpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpKSAqIHNpemVvZihpbnQzMl90KTsKIH0KIAogLyogRWZmZWN0IENvbnRyb2wgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uOiBDb21tYW5kICovCi1pbnQgRWZmZWN0X2NvbW1hbmQoZWZmZWN0X2hhbmRsZV90ICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKXsKLSAgICBFZmZlY3RDb250ZXh0ICogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCAqKSBzZWxmOworaW50IEVmZmVjdF9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkKiBwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcmVwbHlTaXplLCB2b2lkKiBwUmVwbHlEYXRhKSB7CisgICAgRWZmZWN0Q29udGV4dCogcENvbnRleHQgPSAoRWZmZWN0Q29udGV4dCopc2VsZjsKIAotICAgIC8vQUxPR1YoIlx0XG5FZmZlY3RfY29tbWFuZCBzdGFydCIpOworICAgIC8vIEFMT0dWKCJcdFxuRWZmZWN0X2NvbW1hbmQgc3RhcnQiKTsKIAotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9CQVNTX0JPT1NUIik7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX0JBU1NfQk9PU1QiKTsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKXsKLSAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBzZXR0aW5nIGNvbW1hbmQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fVklSVFVBTElaRVIiKTsKICAgICB9Ci0gICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7Ci0gICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fRVFVQUxJWkVSIik7CisgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgc2V0dGluZyBjb21tYW5kIGZvciBMVk1fRVFVQUxJWkVSIik7CiAgICAgfQotICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpewotICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZPTFVNRSIpOworICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIHNldHRpbmcgY29tbWFuZCBmb3IgTFZNX1ZPTFVNRSIpOwogICAgIH0KIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgSU5QVVRTIGFyZTogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBJTlBVVFMgYXJlOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOwogCiAgICAgLy8gSW5jYXNlIHdlIGRpc2FibGUgYW4gZWZmZWN0LCBuZXh0IHRpbWUgcHJvY2VzcyBpcwogICAgIC8vIGNhbGxlZCB0aGUgbnVtYmVyIG9mIGVmZmVjdCBjYWxsZWQgY291bGQgYmUgZ3JlYXRlcgogICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOwogCi0gICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBOdW1iZXJFZmZlY3RzQ2FsbGVkID0gJWQsIE51bWJlckVmZmVjdHNFbmFibGVkID0gJWQiLAorICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIE51bWJlckVmZmVjdHNDYWxsZWQgPSAlZCwgTnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAlZCIsCiAgICAgLy8gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsCiAgICAgLy8gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKTsKIAotICAgIHN3aXRjaCAoY21kQ29kZSl7CisgICAgc3dpdGNoIChjbWRDb2RlKSB7CiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9JTklUOgotICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiwgRUZGRUNUX0NNRF9JTklUOiBFUlJPUiBmb3IgZWZmZWN0IHR5cGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkVmZmVjdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopIHBSZXBseURhdGEgPSAwOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBzdGFydCIpOwotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpewotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9CQVNTX0JPT1NUIik7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBzdGFydCIpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9CQVNTX0JPT1NUIik7CiAgICAgICAgICAgICAgICAgYW5kcm9pZDo6QmFzc1NldFN0cmVuZ3RoKHBDb250ZXh0LCAwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WSVJUVUFMSVpFUil7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX1ZJUlRVQUxJWkVSIik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WSVJUVUFMSVpFUiIpOwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZpcnR1YWxpemVyU2V0U3RyZW5ndGgocENvbnRleHQsIDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0VRVUFMSVpFUiIpOworICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfSU5JVCBmb3IgTFZNX0VRVUFMSVpFUiIpOwogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkVxdWFsaXplclNldFByZXNldChwQ29udGV4dCwgMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9JTklUIGZvciBMVk1fVk9MVU1FIik7Ci0gICAgICAgICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAwKTsKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0lOSVQgZm9yIExWTV9WT0xVTUUiKTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0NPTkZJRyBzdGFydCIpOwotICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgID09IE5VTEwgfHwgY21kU2l6ZSAgICAgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgc3RhcnQiKTsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRDb25maWcocENvbnRleHQsIChlZmZlY3RfY29uZmlnX3QgKikgcENtZERhdGEpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0NPTkZJRyBlbmQiKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6RWZmZWN0X3NldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgZW5kIik7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfR0VUX0NPTkZJRzoKICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhbmRyb2lkOjpFZmZlY3RfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190ICopcFJlcGx5RGF0YSk7CisgICAgICAgICAgICBhbmRyb2lkOjpFZmZlY3RfZ2V0Q29uZmlnKHBDb250ZXh0LCAoZWZmZWN0X2NvbmZpZ190KilwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1JFU0VUIHN0YXJ0Iik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKICAgICAgICAgICAgIGFuZHJvaWQ6OkVmZmVjdF9zZXRDb25maWcocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1JFU0VUIGVuZCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1JFU0VUIGVuZCIpOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTp7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogeworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBzdGFydCIpOwogCi0gICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CkBAIC0zNDAxLDc1ICszMTY3LDYyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwYWRkZWRQYXJhbVNpemUgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogICAgICAgICAgICAgaWYgKChFRkZFQ1RfUEFSQU1fU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIDwgcGFkZGVkUGFyYW1TaXplKSB8fAotICAgICAgICAgICAgICAgIChFRkZFQ1RfUEFSQU1fU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIC0gcGFkZGVkUGFyYW1TaXplIDwKLSAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUpKSB7CisgICAgICAgICAgICAgICAgKEVGRkVDVF9QQVJBTV9TSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgLSBwYWRkZWRQYXJhbVNpemUgPCBwLT52c2l6ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogcGFkZGVkX3BzaXplIG9yIHZzaXplIHRvbyBiaWciKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkUmVwbHlTaXplID0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBhZGRlZFBhcmFtU2l6ZSArIHAtPnZzaXplOwogICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPCBleHBlY3RlZFJlcGx5U2l6ZSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVGRkVDVF9DTURfR0VUX1BBUkFNOiBtaW4uIHJlcGx5U2l6ZSAldSwgZ290ICV1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVwbHlTaXplLCAqcmVwbHlTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFJlcGx5U2l6ZSwgKnJlcGx5U2l6ZSk7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjcwNTQzOCIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgcENtZERhdGEsIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSk7CiAKLSAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QgKilwUmVwbHlEYXRhOworICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCopcFJlcGx5RGF0YTsKIAogICAgICAgICAgICAgdWludDMyX3Qgdm9mZnNldCA9IHBhZGRlZFBhcmFtU2l6ZTsKLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKXsKLSAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpCYXNzQm9vc3RfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAorICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9CQVNTX0JPT1NUKSB7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6QmFzc0Jvb3N0X2dldFBhcmFtZXRlcihwQ29udGV4dCwgcC0+cHNpemUsIHAtPmRhdGEsICZwLT52c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEJhc3NCb29zdF9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAiCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICIqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICpwUmVwbHlEYXRhICVkICIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBSZXBseURhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpewotICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGFuZHJvaWQ6OlZpcnR1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6VmlydHVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogCi0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9FUVVBTElaRVIpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgcC0+c3RhdHVzID0gYW5kcm9pZDo6RXF1YWxpemVyX2dldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpFcXVhbGl6ZXJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LCBwLT5wc2l6ZSwgcC0+ZGF0YSwgJnAtPnZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOwogCi0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICIKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAqcENtZERhdGEgJWQsICpyZXBseVNpemUgJWQsICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAiKnBSZXBseURhdGEgJTA4eCAlMDh4IiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0KSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcFJlcGx5RGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsKICAgICAgICAgICAgICAgICAvLyAgICAgICAgc2l6ZW9mKGludDMyX3QpKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKXsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKLSAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWb2x1bWVfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpWb2x1bWVfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsIHAtPmRhdGEgKyB2b2Zmc2V0KTsKIAotICAgICAgICAgICAgICAgIC8vQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgRUZGRUNUX0NNRF9HRVRfUEFSQU0gIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIipwQ21kRGF0YSAlZCwgKnJlcGx5U2l6ZSAlZCwgKnBSZXBseURhdGEgJWQgIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKQEAgLTM0NzcsMTIzICszMjMwLDExNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyB2b2Zmc2V0ICsgcC0+dnNpemU7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0dFVF9QQVJBTSBlbmQiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9HRVRfUEFSQU0gZW5kIik7CiAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06ewotICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCl7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQiLAorICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRCYXNzQm9vc3RfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUKKyAgICAgICAgICAgICAgICAvLyAlZCIsCiAgICAgICAgICAgICAgICAgLy8gICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgICAgICAvLyAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAgIC8vICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICAhPSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArc2l6ZW9mKGludDE2X3QpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAhPSAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArIHNpemVvZihpbnQxNl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEJhc3NCb29zdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCi0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRuQmFzc0Jvb3N0X2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgorICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdG5CYXNzQm9vc3RfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHNpemVvZihlZmZlY3RfcGFyYW1fdCkgaXMgICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnBzaXplIGlzICVkXG4iCiAgICAgICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnZzaXplIGlzICVkIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXG4iLAogICAgICAgICAgICAgICAgIC8vICAgICAgICBjbWRTaXplLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBwLT5wc2l6ZSwgcC0+dnNpemUgKTsKIAotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkJhc3NCb29zdF9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6QmFzc0Jvb3N0X3NldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsIHAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpewotICAgICAgICAgICAgICAvLyBXYXJuaW5nIHRoaXMgbG9nIHdpbGwgZmFpbCB0byBwcm9wZXJseSByZWFkIGFuIGludDMyX3QgdmFsdWUsIGFzc3VtZXMgaW50MTZfdAotICAgICAgICAgICAgICAvL0FMT0dWKCJcdFZpcnR1YWxpemVyX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkIiwKLSAgICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCi0gICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybmluZyB0aGlzIGxvZyB3aWxsIGZhaWwgdG8gcHJvcGVybHkgcmVhZCBhbiBpbnQzMl90IHZhbHVlLCBhc3N1bWVzIGludDE2X3QKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRWaXJ0dWFsaXplcl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZQorICAgICAgICAgICAgICAgIC8vICVkIiwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgc2l6ZW9mKGludDMyX3QpKSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgICA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWdhbCBwYXJhbWV0ZXJzIGFyZSBpbnQxNl90IG9yIGludDMyX3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUgICAgPiAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSArc2l6ZW9mKGludDMyX3QpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICtzaXplb2YoaW50MTZfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAvLyBsZWdhbCBwYXJhbWV0ZXJzIGFyZSBpbnQxNl90IG9yIGludDMyX3QKKyAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA+IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAorICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoaW50MTZfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBWaXJ0dWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCi0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRuVmlydHVhbGl6ZXJfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0blZpcnR1YWxpemVyX2NvbW1hbmQgY21kU2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRzaXplb2YoZWZmZWN0X3BhcmFtX3QpIGlzICAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT5wc2l6ZSBpcyAlZFxuIgogICAgICAgICAgICAgICAgIC8vICAgICAgICAiXHRwLT52c2l6ZSBpcyAlZCIKICAgICAgICAgICAgICAgICAvLyAgICAgICAgIlxuIiwKICAgICAgICAgICAgICAgICAvLyAgICAgICAgY21kU2l6ZSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSwgcC0+cHNpemUsIHAtPnZzaXplICk7CiAKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWaXJ0dWFsaXplcl9zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLCBwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUil7Ci0gICAgICAgICAgICAgICAvL0FMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOwotICAgICAgICAgICAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKLSAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAotICAgICAgICAgICAgICAgLy8gICAgICAgICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQxNl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSk7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0VRVUFMSVpFUikgeworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVxdWFsaXplcl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU0gc3RhcnQiKTsKKyAgICAgICAgICAgICAgICAvLyBBTE9HVigiXHRFcXVhbGl6ZXJfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQKKyAgICAgICAgICAgICAgICAvLyAiLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAorICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKworICAgICAgICAgICAgICAgIC8vICAgICAgICBzaXplb2YoaW50MzJfdCkpKTsKIAogICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRXF1YWxpemVyX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogY29uc3QgcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgdm9mZnNldCA9IGNvbXB1dGVQYXJhbVZPZmZzZXQocCk7CiAKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFcXVhbGl6ZXJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyB2b2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVxdWFsaXplcl9zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCwgcC0+cHNpemUsICh2b2lkKilwLT5kYXRhLCBwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSl7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigiXHRWb2x1bWVfY29tbWFuZCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBwYXJhbSAlZCwgKnJlcGx5U2l6ZSAlZCwgdmFsdWUgJWQgIiwKKyAgICAgICAgICAgIGlmIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVk9MVU1FKSB7CisgICAgICAgICAgICAgICAgLy8gQUxPR1YoIlx0Vm9sdW1lX2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX1NFVF9QQVJBTSBzdGFydCIpOworICAgICAgICAgICAgICAgIC8vIEFMT0dWKCJcdFZvbHVtZV9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDMyX3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkpLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwQ21kRGF0YSArIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgK3NpemVvZihpbnQzMl90KSkpOwogCi0gICAgICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSAgICA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFZvbHVtZV9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIGNvbnN0IHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZvZmZzZXQgPSBjb21wdXRlUGFyYW1WT2Zmc2V0KHApOwogCi0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6Vm9sdW1lX3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpWb2x1bWVfc2V0UGFyYW1ldGVyKHBDb250ZXh0LCBwLT5wc2l6ZSwgKHZvaWQqKXAtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPnZzaXplLCBwLT5kYXRhICsgdm9mZnNldCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfUEFSQU0gZW5kIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX1BBUkFNIGVuZCIpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CkBAIC0zNjAzLDU3ICszMzQ3LDU2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRFbmFibGVkKHBDb250ZXh0LCBMVk1fVFJVRSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRFbmFibGVkKHBDb250ZXh0LCBMVk1fVFJVRSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiBFRkZFQ1RfQ01EX0RJU0FCTEUgc3RhcnQiKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CiAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfRElTQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OkVmZmVjdF9zZXRFbmFibGVkKHBDb250ZXh0LCBMVk1fRkFMU0UpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpFZmZlY3Rfc2V0RW5hYmxlZChwQ29udGV4dCwgTFZNX0ZBTFNFKTsKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgotICAgICAgICB7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOiB7CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0RFVklDRSBzdGFydCIpOwotICAgICAgICAgICAgaWYgKHBDbWREYXRhICAgPT0gTlVMTCl7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdF9jb21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCBkZXZpY2UgPSAqKHVpbnQzMl90ICopcENtZERhdGE7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkgZGV2aWNlOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9ICooYXVkaW9fZGV2aWNlc190ICopcENtZERhdGE7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gZGV2aWNlOwogCiAgICAgICAgICAgICBpZiAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX0JBU1NfQk9PU1QpIHsKLSAgICAgICAgICAgICAgICBpZigoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSl7CisgICAgICAgICAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB8fAorICAgICAgICAgICAgICAgICAgICAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpIHx8CisgICAgICAgICAgICAgICAgICAgIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9CQVNTX0JPT1NUICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9CQVNfQk9PU1QiKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBkb2VzbnQgc3VwcG9ydCBiYXNzYm9vc3QgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5IGRpc2FibGVkCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBiYXNzYm9vc3QgdGhlIGVmZmVjdCBtdXN0IGJlIHRlbXBvcmFyaWx5IGRpc2FibGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlZmZlY3QgbXVzdCBzdGlsbCByZXBvcnQgaXRzIG9yaWdpbmFsIHN0YXRlIGFzIHRoaXMgY2FuIG9ubHkgYmUgY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgRU5BQkxFL0RJU0FCTEUgY29tbWFuZAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9CQVNTX0JPT1NUICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZGlzYWJsZShwQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fQkFTU19CT09TVCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopcENtZERhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGRldmljZSBzdXBwb3J0cyBiYXNzYm9vc3QgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkgZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNseSB0aGVuIHJlLWVuYWJsZSBpdAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX0JBU1NfQk9PU1QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Okx2bUVmZmVjdF9lbmFibGUocENvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOwpAQCAtMzY2NCwxMjkgKzM0MDcsMTI4IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgY2FzZSB1bmxlc3MgY29uZmlndXJhdGlvbiBpcyBmb3JjZWQKICAgICAgICAgICAgICAgICAgICAgaWYgKGFuZHJvaWQ6OlZpcnR1YWxpemVySXNEZXZpY2VTdXBwb3J0ZWQoZGV2aWNlKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIGludmFsaWQgZm9yIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCopcENtZERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfREVWSUNFIHRlbXBvcmFyeSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGEgZGV2aWNlIGRvZXNudCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHZpcnR1YWxpemVyIHRoZSBlZmZlY3QgbXVzdCBiZSB0ZW1wb3JhcmlseQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZWQgdGhlIGVmZmVjdCBtdXN0IHN0aWxsIHJlcG9ydCBpdHMgb3JpZ2luYWwgc3RhdGUgYXMgdGhpcyBjYW4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgYmUgY2hhbmdlZCBieSB0aGUgRU5BQkxFL0RJU0FCTEUgY29tbWFuZAogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSBkaXNhYmxlIExWTV9WSVJUVUFMSVpFUiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6THZtRWZmZWN0X2Rpc2FibGUocENvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UgZGV2aWNlIGlzIHZhbGlkIGZvciBMVk1fVklSVFVBTElaRVIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBkZXZpY2Ugc3VwcG9ydHMgdmlydHVhbGl6ZXIgYW5kIHRoZSBlZmZlY3QgaGFzIGJlZW4gdGVtcG9yYXJpbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2FibGVkIHByZXZpb3VzbHkgdGhlbiByZS1lbmFibGUgaXQKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSl7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVGRkVDVF9DTURfU0VUX0RFVklDRSByZS1lbmFibGUgTFZNX1ZJUlRVQUxJWkVSICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooaW50MzJfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGludDMyX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpMdm1FZmZlY3RfZW5hYmxlKHBDb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gLy8gZWxzZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGlzIGZvcmNlZCB0byBhIGNlcnRhaW4gZGV2aWNlLCBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgfSAgLy8gZWxzZSB2aXJ0dWFsaXphdGlvbiBtb2RlIGlzIGZvcmNlZCB0byBhIGNlcnRhaW4gZGV2aWNlLCBub3RoaW5nIHRvIGRvCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfU0VUX0RFVklDRSBlbmQiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOgotICAgICAgICB7CisgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICB1aW50MzJfdCBsZWZ0Vm9sdW1lLCByaWdodFZvbHVtZTsKLSAgICAgICAgICAgIGludDE2X3QgIGxlZnRkQiwgcmlnaHRkQjsKLSAgICAgICAgICAgIGludDE2X3QgIG1heGRCLCBwYW5kQjsKLSAgICAgICAgICAgIGludDMyX3QgIHZvbF9yZXRbMl0gPSB7MTw8MjQsMTw8MjR9OyAvLyBBcHBseSBubyB2b2x1bWUKLSAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgICAgICAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZNX1NVQ0NFU1M7ICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICAgICAgaW50MTZfdCBsZWZ0ZEIsIHJpZ2h0ZEI7CisgICAgICAgICAgICBpbnQxNl90IG1heGRCLCBwYW5kQjsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3JldFsyXSA9IHsxIDw8IDI0LCAxIDw8IDI0fTsgICAgIC8vIEFwcGx5IG5vIHZvbHVtZQorICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAgICAgICAgIC8vIGlmIHBSZXBseURhdGEgaXMgTlVMTCwgVk9MX0NUUkwgaXMgZGVsZWdhdGVkIHRvIGFub3RoZXIgZWZmZWN0Ci0gICAgICAgICAgICBpZihwUmVwbHlEYXRhID09IExWTV9OVUxMKXsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IExWTV9OVUxMKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCAyKnNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgPCAyICogc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGxlZnRWb2x1bWUgID0gKCgqKHVpbnQzMl90ICopcENtZERhdGEpKTsKLSAgICAgICAgICAgIHJpZ2h0Vm9sdW1lID0gKCgqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMSkpKTsKKyAgICAgICAgICAgIGxlZnRWb2x1bWUgPSAoKCoodWludDMyX3QqKXBDbWREYXRhKSk7CisgICAgICAgICAgICByaWdodFZvbHVtZSA9ICgoKigodWludDMyX3QqKXBDbWREYXRhICsgMSkpKTsKIAotICAgICAgICAgICAgaWYobGVmdFZvbHVtZSA9PSAweDEwMDAwMDApeworICAgICAgICAgICAgaWYgKGxlZnRWb2x1bWUgPT0gMHgxMDAwMDAwKSB7CiAgICAgICAgICAgICAgICAgbGVmdFZvbHVtZSAtPSAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocmlnaHRWb2x1bWUgPT0gMHgxMDAwMDAwKXsKKyAgICAgICAgICAgIGlmIChyaWdodFZvbHVtZSA9PSAweDEwMDAwMDApIHsKICAgICAgICAgICAgICAgICByaWdodFZvbHVtZSAtPSAxOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBDb252ZXJ0IHZvbHVtZSB0byBkQgotICAgICAgICAgICAgbGVmdGRCICA9IGFuZHJvaWQ6OkxWQ19Db252ZXJ0X1ZvbFRvRGIobGVmdFZvbHVtZSk7CisgICAgICAgICAgICBsZWZ0ZEIgPSBhbmRyb2lkOjpMVkNfQ29udmVydF9Wb2xUb0RiKGxlZnRWb2x1bWUpOwogICAgICAgICAgICAgcmlnaHRkQiA9IGFuZHJvaWQ6OkxWQ19Db252ZXJ0X1ZvbFRvRGIocmlnaHRWb2x1bWUpOwogCiAgICAgICAgICAgICBwYW5kQiA9IHJpZ2h0ZEIgLSBsZWZ0ZEI7CiAKICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBtYXggdm9sdW1lIGluIGRCCiAgICAgICAgICAgICBtYXhkQiA9IGxlZnRkQjsKLSAgICAgICAgICAgIGlmKHJpZ2h0ZEIgPiBtYXhkQil7CisgICAgICAgICAgICBpZiAocmlnaHRkQiA+IG1heGRCKSB7CiAgICAgICAgICAgICAgICAgbWF4ZEIgPSByaWdodGRCOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgU2Vzc2lvbjogJWQsIFNlc3Npb25JRDogJWQgVk9MVU1FIGlzICVkIGRCLCAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgU2Vzc2lvbjogJWQsIFNlc3Npb25JRDogJWQgVk9MVU1FIGlzICVkIGRCLCAiCiAgICAgICAgICAgICAvLyAgICAgICJlZmZlY3QgaXMgJWQiLAotICAgICAgICAgICAgLy9wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCwKKyAgICAgICAgICAgIC8vIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2Vzc2lvbklkLAogICAgICAgICAgICAgLy8oaW50MzJfdCltYXhkQiwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgaXMgJWQsIFJpZ2h0IGlzICVkIiwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgJWRkQiwgUmlnaHQgJWRkQiwgUG9zaXRpb24gJWRkQiIsCisgICAgICAgICAgICAvLyBBTE9HVigiXHRFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IExlZnQgaXMgJWQsIFJpZ2h0IGlzICVkIiwgbGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBMZWZ0ICVkZEIsIFJpZ2h0ICVkZEIsIFBvc2l0aW9uICVkZEIiLAogICAgICAgICAgICAgLy8gICAgICAgIGxlZnRkQiwgcmlnaHRkQiwgcGFuZEIpOwogCi0gICAgICAgICAgICBtZW1jcHkocFJlcGx5RGF0YSwgdm9sX3JldCwgc2l6ZW9mKGludDMyX3QpKjIpOwotICAgICAgICAgICAgYW5kcm9pZDo6Vm9sdW1lU2V0Vm9sdW1lTGV2ZWwocENvbnRleHQsIChpbnQxNl90KShtYXhkQioxMDApKTsKKyAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCB2b2xfcmV0LCBzaXplb2YoaW50MzJfdCkgKiAyKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OlZvbHVtZVNldFZvbHVtZUxldmVsKHBDb250ZXh0LCAoaW50MTZfdCkobWF4ZEIgKiAxMDApKTsKIAogICAgICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0gICAgICAgICAgICBMdm1TdGF0dXMgPUxWTV9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgICAgICBMdm1TdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiVm9sdW1lU2V0U3RlcmVvUG9zaXRpb24iKQotICAgICAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgICAgICAgICAvKiBWb2x1bWUgcGFyYW1ldGVycyAqLwotICAgICAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgID0gcGFuZEI7Ci0gICAgICAgICAgICBBTE9HVigiXHRcdFZvbHVtZVNldFN0ZXJlb1Bvc2l0aW9uKCkgKC05NmRCIC0+ICs5NmRCKS0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVkNfQmFsYW5jZSApOworICAgICAgICAgICAgQWN0aXZlUGFyYW1zLlZDX0JhbGFuY2UgPSBwYW5kQjsKKyAgICAgICAgICAgIEFMT0dWKCJcdFx0Vm9sdW1lU2V0U3RlcmVvUG9zaXRpb24oKSAoLTk2ZEIgLT4gKzk2ZEIpLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5WQ19CYWxhbmNlKTsKIAogICAgICAgICAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KLSAgICAgICAgICAgIEx2bVN0YXR1cyA9TFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwmQWN0aXZlUGFyYW1zKTsKKyAgICAgICAgICAgIEx2bVN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgICAgICAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiIpCi0gICAgICAgICAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0FVRElPX01PREU6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0RWZmZWN0X2NvbW1hbmQgZW5kLi4uXG5cbiIpOworICAgIC8vIEFMT0dWKCJcdEVmZmVjdF9jb21tYW5kIGVuZC4uLlxuXG4iKTsKICAgICByZXR1cm4gMDsKLX0gICAgLyogZW5kIEVmZmVjdF9jb21tYW5kICovCit9IC8qIGVuZCBFZmZlY3RfY29tbWFuZCAqLwogCiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IGdldF9kZXNjcmlwdG9yICovCi1pbnQgRWZmZWN0X2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90ICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQotewotICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7Ci0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYzsKK2ludCBFZmZlY3RfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIHsKKyAgICBFZmZlY3RDb250ZXh0KiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0KilzZWxmOworICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIGRlc2M7CiAKICAgICBpZiAocENvbnRleHQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJFZmZlY3RfZ2V0RGVzY3JpcHRvcigpIGludmFsaWQgcGFyYW0iKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgc3dpdGNoKHBDb250ZXh0LT5FZmZlY3RUeXBlKSB7CisgICAgc3dpdGNoIChwQ29udGV4dC0+RWZmZWN0VHlwZSkgewogICAgICAgICBjYXNlIExWTV9CQVNTX0JPT1NUOgogICAgICAgICAgICAgZGVzYyA9ICZhbmRyb2lkOjpnQmFzc0Jvb3N0RGVzY3JpcHRvcjsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzgwNiwyNiArMzU0OCwyNCBAQAogICAgICpwRGVzY3JpcHRvciA9ICpkZXNjOwogCiAgICAgcmV0dXJuIDA7Ci19ICAgLyogZW5kIEVmZmVjdF9nZXREZXNjcmlwdG9yICovCit9IC8qIGVuZCBFZmZlY3RfZ2V0RGVzY3JpcHRvciAqLwogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ0x2bUVmZmVjdEludGVyZmFjZSA9IHsKLSAgICBFZmZlY3RfcHJvY2VzcywKLSAgICBFZmZlY3RfY29tbWFuZCwKLSAgICBFZmZlY3RfZ2V0RGVzY3JpcHRvciwKLSAgICBOVUxMLAotfTsgICAgLyogZW5kIGdMdm1FZmZlY3RJbnRlcmZhY2UgKi8KKyAgICAgICAgRWZmZWN0X3Byb2Nlc3MsCisgICAgICAgIEVmZmVjdF9jb21tYW5kLAorICAgICAgICBFZmZlY3RfZ2V0RGVzY3JpcHRvciwKKyAgICAgICAgTlVMTCwKK307IC8qIGVuZCBnTHZtRWZmZWN0SW50ZXJmYWNlICovCiAKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKLV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLWF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7Ci0gICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKLSAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAotICAgIC5uYW1lID0gIkVmZmVjdCBCdW5kbGUgTGlicmFyeSIsCi0gICAgLmltcGxlbWVudG9yID0gIk5YUCBTb2Z0d2FyZSBMdGQuIiwKLSAgICAuY3JlYXRlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKLSAgICAucmVsZWFzZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RSZWxlYXNlLAotICAgIC5nZXRfZGVzY3JpcHRvciA9IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCitfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNID0geworICAgICAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAorICAgICAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAorICAgICAgICAubmFtZSA9ICJFZmZlY3QgQnVuZGxlIExpYnJhcnkiLAorICAgICAgICAuaW1wbGVtZW50b3IgPSAiTlhQIFNvZnR3YXJlIEx0ZC4iLAorICAgICAgICAuY3JlYXRlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdENyZWF0ZSwKKyAgICAgICAgLnJlbGVhc2VfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0UmVsZWFzZSwKKyAgICAgICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKIH07Ci0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggNTI0ZTEwMy4uZjNlNzg4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTIzLDE3NiArMjMsMTQ4IEBACiAjaW5jbHVkZSA8TFZNLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKLSNkZWZpbmUgRklWRUJBTkRfTlVNQkFORFMgICAgICAgICAgNQotI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICAgICA1Ci0jZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBMVk1fTUFYX1NFU1NJT05TICAgICAgICAgICAzMgotI2RlZmluZSBMVk1fVU5VU0VEX1NFU1NJT04gICAgICAgICBJTlRfTUFYCi0jZGVmaW5lIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUgIDE1MCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKLSNkZWZpbmUgVklSVFVBTElaRVJfQ1VQX0xPQURfQVJNOUUgMTIwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwotI2RlZmluZSBFUVVBTElaRVJfQ1VQX0xPQURfQVJNOUUgICAyMjAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCi0jZGVmaW5lIFZPTFVNRV9DVVBfTE9BRF9BUk05RSAgICAgIDAgICAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKLSNkZWZpbmUgQlVORExFX01FTV9VU0FHRSAgICAgICAgICAgMjUgICAgIC8vIEV4cHJlc3NlZCBpbiBrQgorI2RlZmluZSBGSVZFQkFORF9OVU1CQU5EUyA1CisjZGVmaW5lIE1BWF9OVU1fQkFORFMgNQorI2RlZmluZSBNQVhfQ0FMTF9TSVpFIDI1NgorI2RlZmluZSBMVk1fTUFYX1NFU1NJT05TIDMyCisjZGVmaW5lIExWTV9VTlVTRURfU0VTU0lPTiBJTlRfTUFYCisjZGVmaW5lIEJBU1NfQk9PU1RfQ1VQX0xPQURfQVJNOUUgMTUwICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIFZJUlRVQUxJWkVSX0NVUF9MT0FEX0FSTTlFIDEyMCAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAyMjAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIFZPTFVNRV9DVVBfTE9BRF9BUk05RSAwICAgICAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCisjZGVmaW5lIEJVTkRMRV9NRU1fVVNBR0UgMjUgICAgICAgICAgICAgLy8gRXhwcmVzc2VkIGluIGtCCiAKICNpZm5kZWYgT1BFTlNMX0VTX0hfCi1zdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfVk9MVU1FXyA9IHsgMHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfTsKLWNvbnN0IGVmZmVjdF91dWlkX3QgKiBjb25zdCBTTF9JSURfVk9MVU1FID0gJlNMX0lJRF9WT0xVTUVfOwotI2VuZGlmIC8vT1BFTlNMX0VTX0hfCitzdGF0aWMgY29uc3QgZWZmZWN0X3V1aWRfdCBTTF9JSURfVk9MVU1FXyA9IHsKKyAgICAgICAgMHgwOWU4ZWRlMCwgMHhkZGRlLCAweDExZGIsIDB4YjRmNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fTsKK2NvbnN0IGVmZmVjdF91dWlkX3QqIGNvbnN0IFNMX0lJRF9WT0xVTUUgPSAmU0xfSUlEX1ZPTFVNRV87CisjZW5kaWYgIC8vIE9QRU5TTF9FU19IXwogCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVk1fQkFTU19CT09TVCwKLSAgICBMVk1fVklSVFVBTElaRVIsCi0gICAgTFZNX0VRVUFMSVpFUiwKLSAgICBMVk1fVk9MVU1FCi19IGx2bV9lZmZlY3RfZW47Cit0eXBlZGVmIGVudW0geyBMVk1fQkFTU19CT09TVCwgTFZNX1ZJUlRVQUxJWkVSLCBMVk1fRVFVQUxJWkVSLCBMVk1fVk9MVU1FIH0gbHZtX2VmZmVjdF9lbjsKIAogLy8gUHJlc2V0IGNvbmZpZ3VyYXRpb24uCiBzdHJ1Y3QgUHJlc2V0Q29uZmlnIHsKICAgICAvLyBIdW1hbi1yZWFkYWJsZSBuYW1lLgotICAgIGNvbnN0IGNoYXIgKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICAgLy8gQW4gYXJyYXkgb2Ygc2l6ZSBuQmFuZHMgd2hlcmUgZWFjaCBlbGVtZW50IGlzIGEgY29uZmlndXJhdGlvbiBmb3IgdGhlCiAgICAgLy8gY29ycmVzcG9uZGluZyBiYW5kLgotICAgIC8vY29uc3QgQmFuZENvbmZpZyAqIGJhbmRDb25maWdzOworICAgIC8vIGNvbnN0IEJhbmRDb25maWcgKiBiYW5kQ29uZmlnczsKIH07CiAKIC8qIEJ1bmRsZWRFZmZlY3RDb250ZXh0IDogT25lIHBlciBzZXNzaW9uICovCi1zdHJ1Y3QgQnVuZGxlZEVmZmVjdENvbnRleHR7Ci0gICAgTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbk5vOyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHNlc3Npb24gbnVtYmVyICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uSWQ7ICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBpZCAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZvbHVtZUVuYWJsZWQ7ICAgICAgICAgICAvKiBGbGFnIGZvciBWb2x1bWUgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFcXVhbGl6ZXJFbmFibGVkOyAgICAgICAgLyogRmxhZyBmb3IgRVEgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJCYXNzRW5hYmxlZDsgICAgICAgICAgICAgLyogRmxhZyBmb3IgQmFzcyAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkJhc3NUZW1wRGlzYWJsZWQ7ICAgICAgICAvKiBGbGFnIGZvciBCYXNzIHRvIGJlIHJlLWVuYWJsZWQgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplckVuYWJsZWQ7ICAgICAgLyogRmxhZyBmb3IgVmlydHVhbGl6ZXIgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZDsgLyogRmxhZyBmb3IgZWZmZWN0IHRvIGJlIHJlLWVuYWJsZWQgKi8KLSAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICAgIG5PdXRwdXREZXZpY2U7ICAgICAgICAgICAgLyogT3V0cHV0IGRldmljZSBmb3IgdGhlIGVmZmVjdCAqLwotICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgICAgICAgICAgblZpcnR1YWxpemVyRm9yY2VkRGV2aWNlOyAvKiBGb3JjZWQgZGV2aWNlIHZpcnR1YWxpemF0aW9uIG1vZGUqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0VuYWJsZWQ7ICAgICAvKiBFZmZlY3RzIGluIHRoaXMgc2Vzc2lvbiAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRWZmZWN0c0NhbGxlZDsgICAgICAvKiBFZmZlY3RzIGNhbGxlZCBzbyBmYXIgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Vm9sdW1lOyAgICAgICAgICAgICAgLyogTm8gc21vb3RoaW5nIG9uIGZpcnN0IFZvbCBjaGFuZ2UgKi8KK3N0cnVjdCBCdW5kbGVkRWZmZWN0Q29udGV4dCB7CisgICAgTFZNX0hhbmRsZV90IGhJbnN0YW5jZTsgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgaW50IFNlc3Npb25ObzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBzZXNzaW9uIG51bWJlciAqLworICAgIGludCBTZXNzaW9uSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgc2Vzc2lvbiBpZCAqLworICAgIGJvb2wgYlZvbHVtZUVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIFZvbHVtZSAqLworICAgIGJvb2wgYkVxdWFsaXplckVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEVRICovCisgICAgYm9vbCBiQmFzc0VuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogRmxhZyBmb3IgQmFzcyAqLworICAgIGJvb2wgYkJhc3NUZW1wRGlzYWJsZWQ7ICAgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIEJhc3MgdG8gYmUgcmUtZW5hYmxlZCAqLworICAgIGJvb2wgYlZpcnR1YWxpemVyRW5hYmxlZDsgICAgICAgICAgICAgICAgIC8qIEZsYWcgZm9yIFZpcnR1YWxpemVyICovCisgICAgYm9vbCBiVmlydHVhbGl6ZXJUZW1wRGlzYWJsZWQ7ICAgICAgICAgICAgLyogRmxhZyBmb3IgZWZmZWN0IHRvIGJlIHJlLWVuYWJsZWQgKi8KKyAgICBhdWRpb19kZXZpY2VzX3Qgbk91dHB1dERldmljZTsgICAgICAgICAgICAvKiBPdXRwdXQgZGV2aWNlIGZvciB0aGUgZWZmZWN0ICovCisgICAgYXVkaW9fZGV2aWNlc190IG5WaXJ0dWFsaXplckZvcmNlZERldmljZTsgLyogRm9yY2VkIGRldmljZSB2aXJ0dWFsaXphdGlvbiBtb2RlKi8KKyAgICBpbnQgTnVtYmVyRWZmZWN0c0VuYWJsZWQ7ICAgICAgICAgICAgICAgICAvKiBFZmZlY3RzIGluIHRoaXMgc2Vzc2lvbiAqLworICAgIGludCBOdW1iZXJFZmZlY3RzQ2FsbGVkOyAgICAgICAgICAgICAgICAgIC8qIEVmZmVjdHMgY2FsbGVkIHNvIGZhciAqLworICAgIGJvb2wgZmlyc3RWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIHNtb290aGluZyBvbiBmaXJzdCBWb2wgY2hhbmdlICovCiAgICAgLy8gU2F2ZWQgcGFyYW1ldGVycyBmb3IgZWFjaCBlZmZlY3QgKi8KICAgICAvLyBCYXNzIEJvb3N0Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNzU3RyZW5ndGhTYXZlZDsgICAgICAgIC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCisgICAgaW50IEJhc3NTdHJlbmd0aFNhdmVkOyAvKiBDb252ZXJzaW9uIGJldHdlZW4gR2V0L1NldCAqLwogICAgIC8vIEVxdWFsaXplcgotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyUHJlc2V0OyAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHByZXNldCBiZWluZyB1c2VkICovCisgICAgaW50IEN1clByZXNldDsgLyogQ3VycmVudCBwcmVzZXQgYmVpbmcgdXNlZCAqLwogICAgIC8vIFZpcnR1YWx6ZXIKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRTdHJlbmd0aFNhdmVkOyAgICAgICAgLyogQ29udmVyc2lvbiBiZXR3ZWVuIEdldC9TZXQgKi8KKyAgICBpbnQgVmlydFN0cmVuZ3RoU2F2ZWQ7IC8qIENvbnZlcnNpb24gYmV0d2VlbiBHZXQvU2V0ICovCiAgICAgLy8gVm9sdW1lCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFNhdmVkOyAgICAgLyogZm9yIHdoZW4gbXV0ZSBpcyBzZXQsIGxldmVsIG11c3QgYmUgc2F2ZWQgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uU2F2ZWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTXV0ZUVuYWJsZWQ7ICAgLyogTXVzdCBzdG9yZSBhcyBtdXRlID0gLTk2ZEIgbGV2ZWwgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQ7Ci0gICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1BlclNlY29uZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXNUb0V4aXRDb3VudEVxOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlc1RvRXhpdENvdW50QmI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnRWaXJ0OwotICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICAgICAgICAgKndvcmtCdWZmZXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50OwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgYmFuZEdhaW5kQltGSVZFQkFORF9OVU1CQU5EU107Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU7Ci0jaWZkZWYgU1VQUE9SVF9NQwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCisgICAgaW50IGxldmVsU2F2ZWQ7IC8qIGZvciB3aGVuIG11dGUgaXMgc2V0LCBsZXZlbCBtdXN0IGJlIHNhdmVkICovCisgICAgaW50IHBvc2l0aW9uU2F2ZWQ7CisgICAgYm9vbCBiTXV0ZUVuYWJsZWQ7IC8qIE11c3Qgc3RvcmUgYXMgbXV0ZSA9IC05NmRCIGxldmVsICovCisgICAgYm9vbCBiU3RlcmVvUG9zaXRpb25FbmFibGVkOworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIGludCBTYW1wbGVzUGVyU2Vjb25kOworICAgIGludCBTYW1wbGVzVG9FeGl0Q291bnRFcTsKKyAgICBpbnQgU2FtcGxlc1RvRXhpdENvdW50QmI7CisgICAgaW50IFNhbXBsZXNUb0V4aXRDb3VudFZpcnQ7CisgICAgZWZmZWN0X2J1ZmZlcl90KiB3b3JrQnVmZmVyOworICAgIGludCBmcmFtZUNvdW50OworICAgIGludDMyX3QgYmFuZEdhaW5kQltGSVZFQkFORF9OVU1CQU5EU107CisgICAgaW50IHZvbHVtZTsKKyAgICBMVk1fSU5UMzIgQ2hNYXNrOwogCiAgICAgLyogQml0bWFzayB3aGV0aGVyIGRyYWluIGlzIGluIHByb2dyZXNzIGR1ZSB0byBkaXNhYmxpbmcgdGhlIGVmZmVjdC4KICAgICAgICBUaGUgY29ycmVzcG9uZGluZyBiaXQgdG8gYW4gZWZmZWN0IGlzIHNldCBieSAxIDw8IGx2bV9lZmZlY3RfZW4uICovCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluOworICAgIGludCBlZmZlY3RJbkRyYWluOwogCiAgICAgLyogQml0bWFzayB3aGV0aGVyIHByb2Nlc3MoKSB3YXMgY2FsbGVkIGZvciBhIHBhcnRpY3VsYXIgZWZmZWN0LgogICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGJpdCB0byBhbiBlZmZlY3QgaXMgc2V0IGJ5IDEgPDwgbHZtX2VmZmVjdF9lbi4gKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQ7CisgICAgaW50IGVmZmVjdFByb2Nlc3NDYWxsZWQ7CiB9OwogCiAvKiBTZXNzaW9uQ29udGV4dCA6IE9uZSBzZXNzaW9uICovCi1zdHJ1Y3QgU2Vzc2lvbkNvbnRleHR7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQnVuZGxlZEVmZmVjdHNFbmFibGVkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlZvbHVtZUluc3RhbnRpYXRlZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQmFzc0luc3RhbnRpYXRlZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJWaXJ0dWFsaXplckluc3RhbnRpYXRlZDsKLSAgICBCdW5kbGVkRWZmZWN0Q29udGV4dCAgICAgICAgICAgICpwQnVuZGxlZENvbnRleHQ7CitzdHJ1Y3QgU2Vzc2lvbkNvbnRleHQgeworICAgIGJvb2wgYkJ1bmRsZWRFZmZlY3RzRW5hYmxlZDsKKyAgICBib29sIGJWb2x1bWVJbnN0YW50aWF0ZWQ7CisgICAgYm9vbCBiRXF1YWxpemVySW5zdGFudGlhdGVkOworICAgIGJvb2wgYkJhc3NJbnN0YW50aWF0ZWQ7CisgICAgYm9vbCBiVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ7CisgICAgQnVuZGxlZEVmZmVjdENvbnRleHQqIHBCdW5kbGVkQ29udGV4dDsKIH07CiAKLXN0cnVjdCBFZmZlY3RDb250ZXh0ewotICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7Ci0gICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7Ci0gICAgbHZtX2VmZmVjdF9lbiAgICAgICAgICAgICAgICAgICBFZmZlY3RUeXBlOwotICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0ICAgICAgICAgICAgKnBCdW5kbGVkQ29udGV4dDsKK3N0cnVjdCBFZmZlY3RDb250ZXh0IHsKKyAgICBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zKiBpdGZlOworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgbHZtX2VmZmVjdF9lbiBFZmZlY3RUeXBlOworICAgIEJ1bmRsZWRFZmZlY3RDb250ZXh0KiBwQnVuZGxlZENvbnRleHQ7CiB9OwogCiAvKiBlbnVtZXJhdGVkIHBhcmFtZXRlciBzZXR0aW5ncyBmb3IgVm9sdW1lIGVmZmVjdCAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgVk9MVU1FX1BBUkFNX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTG1pbGxpYmVsID0gdHlwZWRlZiBTTHVpbnQxNiAoc2V0ICYgZ2V0KQotICAgIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCwgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKGdldCkKLSAgICBWT0xVTUVfUEFSQU1fTVVURSwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMYm9vbGVhbiAgPSB0eXBlZGVmIFNMdWludDMyIChzZXQgJiBnZXQpCi0gICAgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OLCAgICAgICAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQotICAgIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiwgICAgICAgICAgICAgIC8vIHR5cGUgU0xwZXJtaWxsZSA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKK3R5cGVkZWYgZW51bSB7CisgICAgVk9MVU1FX1BBUkFNX0xFVkVMLCAgICAgICAgICAgICAgICAgLy8gdHlwZSBTTG1pbGxpYmVsID0gdHlwZWRlZiBTTHVpbnQxNiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9NQVhMRVZFTCwgICAgICAgICAgICAgIC8vIHR5cGUgU0xtaWxsaWJlbCA9IHR5cGVkZWYgU0x1aW50MTYgKGdldCkKKyAgICBWT0xVTUVfUEFSQU1fTVVURSwgICAgICAgICAgICAgICAgICAvLyB0eXBlIFNMYm9vbGVhbiAgPSB0eXBlZGVmIFNMdWludDMyIChzZXQgJiBnZXQpCisgICAgVk9MVU1FX1BBUkFNX0VOQUJMRVNURVJFT1BPU0lUSU9OLCAgLy8gdHlwZSBTTGJvb2xlYW4gID0gdHlwZWRlZiBTTHVpbnQzMiAoc2V0ICYgZ2V0KQorICAgIFZPTFVNRV9QQVJBTV9TVEVSRU9QT1NJVElPTiwgICAgICAgIC8vIHR5cGUgU0xwZXJtaWxsZSA9IHR5cGVkZWYgU0x1aW50MTYgKHNldCAmIGdldCkKIH0gdF92b2x1bWVfcGFyYW1zOwogCiBzdGF0aWMgY29uc3QgaW50IFBSRVNFVF9DVVNUT00gPSAtMTsKIAotc3RhdGljIGNvbnN0IHVpbnQzMl90IGJhbmRGcmVxUmFuZ2VbRklWRUJBTkRfTlVNQkFORFNdWzJdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwMDAwLCAxMjAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEyMDAwMSwgNDYwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0NjAwMDEsIDE4MDAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE4MDAwMDEsIDcwMDAwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezcwMDAwMDEsIDIwMDAwMDAwfX07CitzdGF0aWMgY29uc3QgdWludDMyX3QgYmFuZEZyZXFSYW5nZVtGSVZFQkFORF9OVU1CQU5EU11bMl0gPSB7ezMwMDAwLCAxMjAwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMjAwMDEsIDQ2MDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQ2MDAwMSwgMTgwMDAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezE4MDAwMDEsIDcwMDAwMDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MDAwMDAxLCAyMDAwMDAwMH19OwogCi0vL05vdGU6IElmIHRoZXNlIGZyZXF1ZW5jaWVzIGNoYW5nZSwgcGxlYXNlIHVwZGF0ZSBMaW1pdExldmVsIHZhbHVlcyBhY2NvcmRpbmdseS4KLXN0YXRpYyBjb25zdCBMVk1fVUlOVDE2ICBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgICAgICAgICAgIC8qIEZyZXF1ZW5jaWVzIGluIEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwMDB9OworLy8gTm90ZTogSWYgdGhlc2UgZnJlcXVlbmNpZXMgY2hhbmdlLCBwbGVhc2UgdXBkYXRlIExpbWl0TGV2ZWwgdmFsdWVzIGFjY29yZGluZ2x5Lgorc3RhdGljIGNvbnN0IExWTV9VSU5UMTYgRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tdID0gezYwLCAvKiBGcmVxdWVuY2llcyBpbiBIeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMCwgOTEwLCAzNjAwLCAxNDAwMH07CiAKLXN0YXRpYyBjb25zdCBMVk1fVUlOVDE2IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LCAgICAgICAgICAgICAgIC8qIFEgZmFjdG9yIG11bHRpcGxpZWQgYnkgMTAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5Nn07CitzdGF0aWMgY29uc3QgTFZNX1VJTlQxNiBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW10gPSB7OTYsIC8qIFEgZmFjdG9yIG11bHRpcGxpZWQgYnkgMTAwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsIDk2LCA5NiwgOTZ9OwogCi1zdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmROb3JtYWxQcmVzZXRzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAwLCAzLCAgICAgICAvKiBOb3JtYWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCA1LCAtMywgNSwgNiwgICAgICAvKiBDbGFzc2ljYWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgLTYsIDcsIDEzLCAxMCwgICAvKiBEYW5jZSBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsICAgICAgIC8qIEZsYXQgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAtMiwgLTIsIDYsIC0zLCAgICAvKiBGb2xrIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgLTgsIDEzLCAtMSwgLTQsICAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgLTQsIDUsIDgsICAgICAvKiBIaXAgSG9wIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgNSwgLTQsIDUsIDksICAgICAgLyogSmF6eiBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsIDQsIDksIDQsIC01LCAgICAgIC8qIFBvcCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA2LCAtMSwgOCwgMTB9OyAgIC8qIFJvY2sgUHJlc2V0ICovCitzdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmROb3JtYWxQcmVzZXRzW10gPSB7MywgIDAsICAwLCAgMCwgIDMsICAgLyogTm9ybWFsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsICA1LCAgLTMsIDUsICA2LCAgIC8qIENsYXNzaWNhbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgLTYsIDcsICAxMywgMTAsICAvKiBEYW5jZSBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgICAvKiBGbGF0IFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsICAtMiwgLTIsIDYsICAtMywgIC8qIEZvbGsgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIC04LCAxMywgLTEsIC00LCAgLyogSGVhdnkgTWV0YWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDYsICAtNCwgNSwgIDgsICAgLyogSGlwIEhvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgNSwgIC00LCA1LCAgOSwgICAvKiBKYXp6IFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCA0LCAgOSwgIDQsICAtNSwgIC8qIFBvcCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgNiwgIC0xLCA4LCAgMTB9OyAvKiBSb2NrIFByZXNldCAqLwogCi1zdGF0aWMgY29uc3QgTFZNX0lOVDE2IEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDAsIDAsIDMsICAgICAgLyogTm9ybWFsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDMsIC0yLCA0LCA0LCAgICAgLyogQ2xhc3NpY2FsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsIDIsIDQsIDEsICAgICAgLyogRGFuY2UgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgICAgICAvKiBGbGF0IFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDAsIDAsIDIsIC0xLCAgICAgLyogRm9sayBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAxLCA5LCAzLCAwLCAgICAgIC8qIEhlYXZ5IE1ldGFsIFByZXNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDMsIDAsIDEsIDMsICAgICAgLyogSGlwIEhvcCBQcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAyLCAtMiwgMiwgNSwgICAgIC8qIEphenogUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMiwgNSwgMSwgLTIsICAgICAvKiBQb3AgUHJlc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMywgLTEsIDMsIDV9OyAgICAvKiBSb2NrIFByZXNldCAqLworc3RhdGljIGNvbnN0IExWTV9JTlQxNiBFUU5CXzVCYW5kU29mdFByZXNldHNbXSA9IHszLCAgMCwgMCwgIDAsIDMsICAvKiBOb3JtYWwgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsICAzLCAtMiwgNCwgNCwgIC8qIENsYXNzaWNhbCBQcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgIDAsIDIsICA0LCAxLCAgLyogRGFuY2UgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAwLCAgMCwgMCwgIC8qIEZsYXQgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsICAwLCAwLCAgMiwgLTEsIC8qIEZvbGsgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsICAxLCA5LCAgMywgMCwgIC8qIEhlYXZ5IE1ldGFsIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgMywgMCwgIDEsIDMsICAvKiBIaXAgSG9wIFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAgMiwgLTIsIDIsIDUsICAvKiBKYXp6IFByZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMiwgNSwgIDEsIC0yLCAvKiBQb3AgUHJlc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsICAzLCAtMSwgMywgNX07IC8qIFJvY2sgUHJlc2V0ICovCiAKLXN0YXRpYyBjb25zdCBQcmVzZXRDb25maWcgZ0VxdWFsaXplclByZXNldHNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ik5vcm1hbCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiQ2xhc3NpY2FsIn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJEYW5jZSJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRmxhdCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiRm9sayJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiSGVhdnkgTWV0YWwifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkhpcCBIb3AifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkphenoifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlBvcCJ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUm9jayJ9fTsKK3N0YXRpYyBjb25zdCBQcmVzZXRDb25maWcgZ0VxdWFsaXplclByZXNldHNbXSA9IHt7Ik5vcm1hbCJ9LCB7IkNsYXNzaWNhbCJ9LCAgIHsiRGFuY2UifSwgICB7IkZsYXQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkZvbGsifSwgICB7IkhlYXZ5IE1ldGFsIn0sIHsiSGlwIEhvcCJ9LCB7IkphenoifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlBvcCJ9LCAgICB7IlJvY2sifX07CiAKIC8qIFRoZSBmb2xsb3dpbmcgdGFibGVzIGhhdmUgYmVlbiBjb21wdXRlZCB1c2luZyB0aGUgYWN0dWFsIGxldmVscyBtZWFzdXJlZCBieSB0aGUgb3V0cHV0IG9mCiAgKiB3aGl0ZSBub2lzZSBvciBwaW5rIG5vaXNlIChJRUMyNjgtMSkgZm9yIHRoZSBFUSBhbmQgQmFzc0Jvb3N0IEVmZmVjdHMuIFRoZXNlIGFyZSBlc3RpbWF0ZXMgb2YKQEAgLTIwMSwxNCArMTczLDE0IEBACiAgKiB1cGRhdGVkLgogICovCiAKLXN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7Ci0gICAgICAgIDcuNTYsIDkuNjksIDkuNTksIDcuMzcsIDIuODh9Oworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHs3LjU2LCA5LjY5LCA5LjU5LCA3LjM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjg4fTsKIAotc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNyb3NzQ29lZmZpY2llbnRbRklWRUJBTkRfTlVNQkFORFMtMV0gPSB7Ci0gICAgICAgIDEyNi4wLCAxMTUuMCwgMTI1LjAsIDEwNC4wIH07CitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYW5kRW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EUyAtIDFdID0gezEyNi4wLCAxMTUuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI1LjAsIDEwNC4wfTsKIAogc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFzc0Jvb3N0RW5lcmd5Q3Jvc3NDb2VmZmljaWVudFtGSVZFQkFORF9OVU1CQU5EU10gPSB7Ci0gICAgICAgIDIyMS4yMSwgMjA4LjEwLCAyOC4xNiwgMC4wLCAwLjAgfTsKKyAgICAgICAgMjIxLjIxLCAyMDguMTAsIDI4LjE2LCAwLjAsIDAuMH07CiAKIHN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvZWZmaWNpZW50ID0gOS4wMDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggMzlmNWJiNi4uMjkwYTdiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiB0eXBlZGVmIGZsb2F0IExWTV9GTE9BVDsKICNlbmRpZgogI2RlZmluZSBMT0dfVEFHICJSZXZlcmIiCi0jZGVmaW5lIEFSUkFZX1NJWkUoYXJyYXkpIChzaXplb2YgKGFycmF5KSAvIHNpemVvZiAoYXJyYXkpWzBdKQorI2RlZmluZSBBUlJBWV9TSVpFKGFycmF5KSAoc2l6ZW9mKGFycmF5KSAvIHNpemVvZihhcnJheSlbMF0pCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KQEAgLTMzLDIzICszMywyOCBAQAogI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgogLy8gZnJvbSBSZXZlcmIvbGliCiAjaW5jbHVkZSAiTFZSRVYuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIHJldmVyYgogZXh0ZXJuICJDIiBjb25zdCBzdHJ1Y3QgZWZmZWN0X2ludGVyZmFjZV9zIGdSZXZlcmJJbnRlcmZhY2U7CiAKLSNkZWZpbmUgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpe1wKLSAgICAgICAgaWYgKChMdm1TdGF0dXMpID09IExWUkVWX05VTExBRERSRVNTKXtcCi0gICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICJcCi0gICAgICAgICAgICAgICAgICAgICJudWxsIHBvaW50ZXIgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTtcCi0gICAgICAgIH1cCi0gICAgICAgIGlmICgoTHZtU3RhdHVzKSA9PSBMVlJFVl9JTlZBTElETlVNU0FNUExFUyl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAotICAgICAgICAgICAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAotICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfT1VUT0ZSQU5HRSl7XAotICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiXAotICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYyk7XAotICAgICAgICB9XAorI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfTlVMTEFERFJFU1MpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZSRVZfT1VUT0ZSQU5HRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogLy8gTmFtZXNwYWNlcwpAQCAtODEsOCArODYsOCBAQAogCiAvLyBOWFAgU1cgYXV4aWxpYXJ5IGVudmlyb25tZW50YWwgcmV2ZXJiCiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsgMHg0ZSwgMHgyMywgMHg0ZCwgMHgwNiwgMHg4MywgMHg5ZSB9IH0sCi0gICAgICAgIHsgMHg0YTM4N2ZjMCwgMHg4YWIzLCAweDExZGYsIDB4OGJhZCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwKKyAgICAgICAgezB4YzJlNWQ1ZjAsIDB4OTRiZCwgMHg0NzYzLCAweDljYWMsIHsweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllfX0sCisgICAgICAgIHsweDRhMzg3ZmMwLCAweDhhYjMsIDB4MTFkZiwgMHg4YmFkLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKICAgICAgICAgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlksCiAgICAgICAgIExWUkVWX0NVUF9MT0FEX0FSTTlFLApAQCAtMTI4LDQyICsxMzMsMzkgQEAKIH07CiAKIC8vIGdEZXNjcmlwdG9ycyBjb250YWlucyBwb2ludGVycyB0byBhbGwgZGVmaW5lZCBlZmZlY3QgZGVzY3JpcHRvciBpbiB0aGlzIGxpYnJhcnkKLXN0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICogY29uc3QgZ0Rlc2NyaXB0b3JzW10gPSB7Ci0gICAgICAgICZnQXV4RW52UmV2ZXJiRGVzY3JpcHRvciwKLSAgICAgICAgJmdJbnNlcnRFbnZSZXZlcmJEZXNjcmlwdG9yLAotICAgICAgICAmZ0F1eFByZXNldFJldmVyYkRlc2NyaXB0b3IsCi0gICAgICAgICZnSW5zZXJ0UHJlc2V0UmV2ZXJiRGVzY3JpcHRvcgotfTsKK3N0YXRpYyBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBjb25zdCBnRGVzY3JpcHRvcnNbXSA9IHsKKyAgICAgICAgJmdBdXhFbnZSZXZlcmJEZXNjcmlwdG9yLCAmZ0luc2VydEVudlJldmVyYkRlc2NyaXB0b3IsICZnQXV4UHJlc2V0UmV2ZXJiRGVzY3JpcHRvciwKKyAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yfTsKIAotdHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBwcm9jZXNzX2J1ZmZlcl90OyAvLyBwcm9jZXNzIGluIGZsb2F0Cit0eXBlZGVmIGZsb2F0IHByb2Nlc3NfYnVmZmVyX3Q7ICAvLyBwcm9jZXNzIGluIGZsb2F0CiAKLXN0cnVjdCBSZXZlcmJDb250ZXh0ewotICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7Ci0gICAgZWZmZWN0X2NvbmZpZ190ICAgICAgICAgICAgICAgICBjb25maWc7Ci0gICAgTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAgICAgICBoSW5zdGFuY2U7Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJvb21MZXZlbDsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkSGZMZXZlbDsKLSAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVjYXlUaW1lOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREZWNheUhmUmF0aW87Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZFJldmVyYkxldmVsOwotICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZWREaWZmdXNpb247Ci0gICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERlbnNpdHk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRW5hYmxlZDsKLSAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7Ci0gICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqSW5GcmFtZXM7Ci0gICAgcHJvY2Vzc19idWZmZXJfdCAgICAgICAgICAgICAgICAqT3V0RnJhbWVzOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUluOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZU91dDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eGlsaWFyeTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldDsKLSAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIGN1clByZXNldDsKLSAgICB1aW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQcmVzZXQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzVG9FeGl0Q291bnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBsZWZ0Vm9sdW1lOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRWb2x1bWU7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICBwcmV2TGVmdFZvbHVtZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgIHByZXZSaWdodFZvbHVtZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZU1vZGU7CitzdHJ1Y3QgUmV2ZXJiQ29udGV4dCB7CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyogaXRmZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICAgIExWUkVWX0hhbmRsZV90IGhJbnN0YW5jZTsKKyAgICBpbnQxNl90IFNhdmVkUm9vbUxldmVsOworICAgIGludDE2X3QgU2F2ZWRIZkxldmVsOworICAgIGludDE2X3QgU2F2ZWREZWNheVRpbWU7CisgICAgaW50MTZfdCBTYXZlZERlY2F5SGZSYXRpbzsKKyAgICBpbnQxNl90IFNhdmVkUmV2ZXJiTGV2ZWw7CisgICAgaW50MTZfdCBTYXZlZERpZmZ1c2lvbjsKKyAgICBpbnQxNl90IFNhdmVkRGVuc2l0eTsKKyAgICBib29sIGJFbmFibGVkOworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIHByb2Nlc3NfYnVmZmVyX3QqIEluRnJhbWVzOworICAgIHByb2Nlc3NfYnVmZmVyX3QqIE91dEZyYW1lczsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZUluOworICAgIHNpemVfdCBidWZmZXJTaXplT3V0OworICAgIGJvb2wgYXV4aWxpYXJ5OworICAgIGJvb2wgcHJlc2V0OworICAgIHVpbnQxNl90IGN1clByZXNldDsKKyAgICB1aW50MTZfdCBuZXh0UHJlc2V0OworICAgIGludCBTYW1wbGVzVG9FeGl0Q291bnQ7CisgICAgTFZNX0lOVDE2IGxlZnRWb2x1bWU7CisgICAgTFZNX0lOVDE2IHJpZ2h0Vm9sdW1lOworICAgIExWTV9JTlQxNiBwcmV2TGVmdFZvbHVtZTsKKyAgICBMVk1fSU5UMTYgcHJldlJpZ2h0Vm9sdW1lOworICAgIGludCB2b2x1bWVNb2RlOwogfTsKIAogZW51bSB7CkBAIC0xNzQsNDQgKzE3NiwzOCBAQAogCiAjZGVmaW5lIFJFVkVSQl9ERUZBVUxUX1BSRVNFVCBSRVZFUkJfUFJFU0VUX05PTkUKIAotI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgIDAuNzVmIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKLSNkZWZpbmUgUkVWRVJCX1VOSVRfVk9MVU1FICAoMHgxMDAwKSAvLyAxLjAgaW4gNC4xMiBmb3JtYXQKKyNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgMC43NWYgICAgICAvLyAwLjc1IGluIDQuMTIgZm9ybWF0CisjZGVmaW5lIFJFVkVSQl9VTklUX1ZPTFVNRSAoMHgxMDAwKSAgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKLWludCAgUmV2ZXJiX2luaXQgICAgICAgICAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpOwotdm9pZCBSZXZlcmJfZnJlZSAgICAgICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCk7Ci1pbnQgIFJldmVyYl9zZXRDb25maWcgICAgICAgKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwotdm9pZCBSZXZlcmJfZ2V0Q29uZmlnICAgICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKTsKLWludCAgUmV2ZXJiX3NldFBhcmFtZXRlciAgICAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlLCBpbnQgdnNpemUpOwotaW50ICBSZXZlcmJfZ2V0UGFyYW1ldGVyICAgIChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpOwotaW50IFJldmVyYl9Mb2FkUHJlc2V0ICAgICAgIChSZXZlcmJDb250ZXh0ICAgKnBDb250ZXh0KTsKLWludCBSZXZlcmJfcGFyYW1WYWx1ZVNpemUgICAoaW50MzJfdCBwYXJhbSk7CitpbnQgUmV2ZXJiX2luaXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpOwordm9pZCBSZXZlcmJfZnJlZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCk7CitpbnQgUmV2ZXJiX3NldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK3ZvaWQgUmV2ZXJiX2dldENvbmZpZyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnKTsKK2ludCBSZXZlcmJfc2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSwgaW50IHZzaXplKTsKK2ludCBSZXZlcmJfZ2V0UGFyYW1ldGVyKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCB2b2lkKiBwUGFyYW0sIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpOworaW50IFJldmVyYl9Mb2FkUHJlc2V0KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KTsKK2ludCBSZXZlcmJfcGFyYW1WYWx1ZVNpemUoaW50MzJfdCBwYXJhbSk7CiAKIC8qIEVmZmVjdCBMaWJyYXJ5IEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbiAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHNlc3Npb25JZCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIGlvSWQgX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAqcEhhbmRsZSl7CitleHRlcm4gIkMiIGludCBFZmZlY3RDcmVhdGUoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgaW50MzJfdCAvKiBzZXNzaW9uSWQgX191bnVzZWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpb0lkIF9fdW51c2VkICovLCBlZmZlY3RfaGFuZGxlX3QqIHBIYW5kbGUpIHsKICAgICBpbnQgcmV0OwogICAgIGludCBpOwotICAgIGludCBsZW5ndGggPSBzaXplb2YoZ0Rlc2NyaXB0b3JzKSAvIHNpemVvZihjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICopOwotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqKTsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjOwogCiAgICAgQUxPR1YoIlx0XG5FZmZlY3RDcmVhdGUgc3RhcnQiKTsKIAotICAgIGlmIChwSGFuZGxlID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKKyAgICBpZiAocEhhbmRsZSA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RDcmVhdGUoKSBjYWxsZWQgd2l0aCBOVUxMIHBvaW50ZXIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgIGRlc2MgPSBnRGVzY3JpcHRvcnNbaV07Ci0gICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmRlc2MtPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkKLSAgICAgICAgICAgICAgICA9PSAwKSB7CisgICAgICAgIGlmIChtZW1jbXAodXVpZCwgJmRlc2MtPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLCBpLCBkZXNjLT51dWlkLnRpbWVMb3cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIyMSwxNiArMjE3LDE2IEBACiAgICAgICAgIHJldHVybiAtRU5PRU5UOwogICAgIH0KIAotICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0ID0gbmV3IFJldmVyYkNvbnRleHQ7CisgICAgUmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSBuZXcgUmV2ZXJiQ29udGV4dDsKIAotICAgIHBDb250ZXh0LT5pdGZlICAgICAgPSAmZ1JldmVyYkludGVyZmFjZTsKKyAgICBwQ29udGV4dC0+aXRmZSA9ICZnUmV2ZXJiSW50ZXJmYWNlOwogICAgIHBDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOwogCiAgICAgcENvbnRleHQtPmF1eGlsaWFyeSA9IGZhbHNlOwotICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKXsKKyAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICBwQ29udGV4dC0+YXV4aWxpYXJ5ID0gdHJ1ZTsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQVVYIik7Ci0gICAgfWVsc2V7CisgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gSU5TIik7CiAgICAgfQogCkBAIC0yNDEsMTQgKzIzNywxNCBAQAogICAgICAgICBwQ29udGV4dC0+Y3VyUHJlc2V0ID0gUkVWRVJCX1BSRVNFVF9MQVNUICsgMTsKICAgICAgICAgcENvbnRleHQtPm5leHRQcmVzZXQgPSBSRVZFUkJfREVGQVVMVF9QUkVTRVQ7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIFBSRVNFVCIpOwotICAgIH1lbHNleworICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIEVOVklST05NRU5UQUwiKTsKICAgICB9CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIFJldmVyYl9pbml0Iik7CiAgICAgcmV0ID0gUmV2ZXJiX2luaXQocENvbnRleHQpOwogCi0gICAgaWYgKHJldCA8IDApeworICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEVmZmVjdENyZWF0ZSgpIGluaXQgZmFpbGVkIik7CiAgICAgICAgIGRlbGV0ZSBwQ29udGV4dDsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI1NiwyNSArMjUyLDI1IEBACiAKICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKLQogICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAorICAgIGNoYW5uZWxzID0gKHBDb250ZXh0LT5hdXhpbGlhcnkgPT0gdHJ1ZSkgPyBjaGFubmVscyA6IEZDQ18yOwogICAgIC8vIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmV2ZXJiIHByb2Nlc3MgKCoyIGlzIGZvciBTVEVSRU8pCiAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogY2hhbm5lbHM7CiAgICAgcENvbnRleHQtPmJ1ZmZlclNpemVPdXQgPSBMVlJFVl9NQVhfRlJBTUVfU0laRSAqIHNpemVvZihwcm9jZXNzX2J1ZmZlcl90KSAqIEZDQ18yOwotICAgIHBDb250ZXh0LT5JbkZyYW1lcyAgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZUluLCAxIC8qIHNpemUgKi8pOwotICAgIHBDb250ZXh0LT5PdXRGcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYyhwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCwgMSAvKiBzaXplICovKTsKKyAgICBwQ29udGV4dC0+SW5GcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCopY2FsbG9jKHBDb250ZXh0LT5idWZmZXJTaXplSW4sIDEgLyogc2l6ZSAqLyk7CisgICAgcENvbnRleHQtPk91dEZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90KiljYWxsb2MocENvbnRleHQtPmJ1ZmZlclNpemVPdXQsIDEgLyogc2l6ZSAqLyk7CiAKICAgICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgJXAsIHNpemUgJXp1IiwgcENvbnRleHQsIHNpemVvZihSZXZlcmJDb250ZXh0KSk7CiAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIGVuZFxuIik7CiAgICAgcmV0dXJuIDA7CiB9IC8qIGVuZCBFZmZlY3RDcmVhdGUgKi8KIAotZXh0ZXJuICJDIiBpbnQgRWZmZWN0UmVsZWFzZShlZmZlY3RfaGFuZGxlX3QgaGFuZGxlKXsKLSAgICBSZXZlcmJDb250ZXh0ICogcENvbnRleHQgPSAoUmV2ZXJiQ29udGV4dCAqKWhhbmRsZTsKK2V4dGVybiAiQyIgaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkgeworICAgIFJldmVyYkNvbnRleHQqIHBDb250ZXh0ID0gKFJldmVyYkNvbnRleHQqKWhhbmRsZTsKIAogICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2UgJXAiLCBoYW5kbGUpOwotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBFZmZlY3RSZWxlYXNlIGNhbGxlZCB3aXRoIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0yODgsMTIgKzI4NCwxMSBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbmQgRWZmZWN0UmVsZWFzZSAqLwogCi1leHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CitleHRlcm4gIkMiIGludCBFZmZlY3RHZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CiAgICAgaW50IGk7Ci0gICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKik7CisgICAgaW50IGxlbmd0aCA9IHNpemVvZihnRGVzY3JpcHRvcnMpIC8gc2l6ZW9mKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqKTsKIAotICAgIGlmIChwRGVzY3JpcHRvciA9PSBOVUxMIHx8IHV1aWQgPT0gTlVMTCl7CisgICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yKCkgY2FsbGVkIHdpdGggTlVMTCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTMwMSw4ICsyOTYsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICBpZiAobWVtY21wKHV1aWQsICZnRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewogICAgICAgICAgICAgKnBEZXNjcmlwdG9yID0gKmdEZXNjcmlwdG9yc1tpXTsKLSAgICAgICAgICAgIEFMT0dWKCJFZmZlY3RHZXREZXNjcmlwdG9yIC0gVVVJRCBtYXRjaGVkIFJldmVyYiB0eXBlICVkLCBVVUlEID0gJXgiLAotICAgICAgICAgICAgICAgICBpLCBnRGVzY3JpcHRvcnNbaV0tPnV1aWQudGltZUxvdyk7CisgICAgICAgICAgICBBTE9HVigiRWZmZWN0R2V0RGVzY3JpcHRvciAtIFVVSUQgbWF0Y2hlZCBSZXZlcmIgdHlwZSAlZCwgVVVJRCA9ICV4IiwgaSwKKyAgICAgICAgICAgICAgICAgIGdEZXNjcmlwdG9yc1tpXS0+dXVpZC50aW1lTG93KTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtMzExLDEyICszMDYsMTMgQEAKIH0gLyogZW5kIEVmZmVjdEdldERlc2NyaXB0b3IgKi8KIAogLyogbG9jYWwgZnVuY3Rpb25zICovCi0jZGVmaW5lIENIRUNLX0FSRyhjb25kKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogSW52YWxpZCBhcmd1bWVudDogIiNjb25kKTsgICAgICBcCi0gICAgICAgIHJldHVybiAtRUlOVkFMOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gcHJvY2VzcygpCkBAIC0zMzUsOTEgKzMzMSwxMDEgQEAKIC8vICBwT3V0OiAgICAgICBwb2ludGVyIHRvIHVwZGF0ZWQgc3RlcmVvIDE2IGJpdCBvdXRwdXQgZGF0YQogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IHByb2Nlc3MoIGVmZmVjdF9idWZmZXJfdCAgICpwSW4sCi0gICAgICAgICAgICAgZWZmZWN0X2J1ZmZlcl90ICAgKnBPdXQsCi0gICAgICAgICAgICAgaW50ICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgIFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKLQoraW50IHByb2Nlc3MoZWZmZWN0X2J1ZmZlcl90KiBwSW4sIGVmZmVjdF9idWZmZXJfdCogcE91dCwgaW50IGZyYW1lQ291bnQsIFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgaW50IGNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7ICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIGludCBvdXRDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyk7CisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKLSAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KLSAgICBpZiAoIShjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IEZDQ18yKSApIHsKLSAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOworICAgIC8vIFJldmVyYiBvbmx5IGVmZmVjdHMgdGhlIHN0ZXJlbyBjaGFubmVscyBpbiBtdWx0aWNoYW5uZWwgc291cmNlLgorICAgIGlmIChjaGFubmVscyA8IDEgfHwgY2hhbm5lbHMgPiBMVk1fTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIEFMT0dFKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBjaGFubmVscyAlZCIsIGNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgc2l6ZV90IGluU2l6ZSA9IGZyYW1lQ291bnQgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBjaGFubmVsczsKICAgICBzaXplX3Qgb3V0U2l6ZSA9IGZyYW1lQ291bnQgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBGQ0NfMjsKLSAgICBpZiAocENvbnRleHQtPkluRnJhbWVzID09IE5VTEwgfHwKLSAgICAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPCBpblNpemUpIHsKKyAgICBpZiAocENvbnRleHQtPkluRnJhbWVzID09IE5VTEwgfHwgcENvbnRleHQtPmJ1ZmZlclNpemVJbiA8IGluU2l6ZSkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lcyk7CiAgICAgICAgIHBDb250ZXh0LT5idWZmZXJTaXplSW4gPSBpblNpemU7Ci0gICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcyA9IChwcm9jZXNzX2J1ZmZlcl90ICopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplSW4pOworICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplSW4pOwogICAgIH0KLSAgICBpZiAocENvbnRleHQtPk91dEZyYW1lcyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA8IG91dFNpemUpIHsKKyAgICBpZiAocENvbnRleHQtPk91dEZyYW1lcyA9PSBOVUxMIHx8IHBDb250ZXh0LT5idWZmZXJTaXplT3V0IDwgb3V0U2l6ZSkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5PdXRGcmFtZXMpOwogICAgICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IG91dFNpemU7Ci0gICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CisgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCopY2FsbG9jKDEsIHBDb250ZXh0LT5idWZmZXJTaXplT3V0KTsKICAgICB9CiAKLQogICAgIC8vIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCiAgICAgaWYgKChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCkgfHwgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCkpIHsKICAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRlbXBvcmFyeSBidWZmZXJzICIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLQogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5uZXh0UHJlc2V0ICE9IHBDb250ZXh0LT5jdXJQcmVzZXQpIHsKICAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CiAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCpwSW4pLCBkZWNsdHlwZSgqcENvbnRleHQtPkluRnJhbWVzKT46OnZhbHVlLAotICAgICAgICAgICAgICAgICJwSW4gYW5kIEluRnJhbWVzIG11c3QgYmUgc2FtZSB0eXBlIik7CisgICAgICAgICAgICAgICAgICAgICAgInBJbiBhbmQgSW5GcmFtZXMgbXVzdCBiZSBzYW1lIHR5cGUiKTsKICAgICAgICAgbWVtY3B5KHBDb250ZXh0LT5JbkZyYW1lcywgcEluLCBmcmFtZUNvdW50ICogY2hhbm5lbHMgKiBzaXplb2YoKnBJbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1vbm8gaW5wdXQgaXMgZHVwbGljYXRlZAorICAgICAgICBpZiAoY2hhbm5lbHMgPj0gRkNDXzIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzW0ZDQ18yICogaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2NoYW5uZWxzICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2NoYW5uZWxzICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGluc2VydCByZXZlcmIgaW5wdXQgaXMgYWx3YXlzIHN0ZXJlbwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgewotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKLSAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaSArIDFdID0gKHByb2Nlc3NfYnVmZmVyX3QpcEluWzIgKiBpICsgMV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzW0ZDQ18yICogaV0gPSBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2ldICogUkVWRVJCX1NFTkRfTEVWRUw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocENvbnRleHQtPnByZXNldCAmJiBwQ29udGV4dC0+Y3VyUHJlc2V0ID09IFJFVkVSQl9QUkVTRVRfTk9ORSkgewogICAgICAgICBtZW1zZXQocENvbnRleHQtPk91dEZyYW1lcywgMCwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIEZDQ18yKTsgLy9hbHdheXMgc3RlcmVvIGhlcmUKKyAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogRkNDXzIpOyAgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSAmJiBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgewotICAgICAgICAgICAgbWVtc2V0KHBDb250ZXh0LT5JbkZyYW1lcywgMCwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIHNpemVvZigqcENvbnRleHQtPk91dEZyYW1lcykgKiBjaGFubmVscyk7CisgICAgICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFICYmIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQgPiAwKSB7CisgICAgICAgICAgICBtZW1zZXQocENvbnRleHQtPkluRnJhbWVzLCAwLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwQ29udGV4dC0+T3V0RnJhbWVzKSAqIGNoYW5uZWxzKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFplcm9pbmcgJWQgc2FtcGxlcyBwZXIgZnJhbWUgYXQgdGhlIGVuZCBvZiBjYWxsIiwgY2hhbm5lbHMpOwogICAgICAgICB9CiAKICAgICAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcywgcHJvZHVjaW5nIGEgc3RlcmVvIG91dHB1dCAqLwotICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzLCAgICAgLyogSW5wdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lcywgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9Qcm9jZXNzKHBDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lcywgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMsIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCiAgICAgfQogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1Byb2Nlc3MiLCAicHJvY2VzcyIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKICAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgewogICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7IC8vIGFsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgLy8gTWl4IHdpdGggZHJ5IGlucHV0Ci0gICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW2ldICs9IHBJbltpXTsKKyAgICAgICAgaWYgKGNoYW5uZWxzID49IEZDQ18yKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIE1peCB3aXRoIGRyeSBpbnB1dAorICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpXSArPSBwSW5bY2hhbm5lbHMgKiBpXTsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdICs9IHBJbltjaGFubmVscyAqIGkgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gTWl4IHdpdGggZHJ5IGlucHV0CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICs9IHBJbltpXTsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdICs9IHBJbltpXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBhcHBseSB2b2x1bWUgd2l0aCByYW1wIGlmIG5lZWRlZAogICAgICAgICBpZiAoKHBDb250ZXh0LT5sZWZ0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSB8fAotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lKSAmJgotICAgICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID09IFJFVkVSQl9WT0xVTUVfUkFNUCkgeworICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSAhPSBwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lKSAmJgorICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPT0gUkVWRVJCX1ZPTFVNRV9SQU1QKSB7CiAgICAgICAgICAgICAvLyBGSVhNRTogc3RpbGwgdXNpbmcgaW50MTYgdm9sdW1lcy4KICAgICAgICAgICAgIC8vIEZvciByZWZlcmVuY2U6IFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAgICAgICAgICAgICBmbG9hdCB2bCA9IChmbG9hdClwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgLyA0MDk2OwpAQCAtNDUwLDIwICs0NTYsNTEgQEAKICAgICAgICAgfQogICAgIH0KIAotCi0gICAgLy8gQWNjdW11bGF0ZSBpZiByZXF1aXJlZAotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICAvL0FMT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgQUNDVU1VTEFURSIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7IC8vIGFsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgcE91dFtpXSArPSBwQ29udGV4dC0+T3V0RnJhbWVzW2ldOworICAgIGlmIChvdXRDaGFubmVscyA+IDIpIHsKKyAgICAgICAgLy8gQWNjdW11bGF0ZSBpZiByZXF1aXJlZAorICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBPdXRbb3V0Q2hhbm5lbHMgKiBpXSArPSBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV07CisgICAgICAgICAgICAgICAgcE91dFtvdXRDaGFubmVscyAqIGkgKyAxXSArPSBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwT3V0W291dENoYW5uZWxzICogaV0gPSBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV07CisgICAgICAgICAgICAgICAgcE91dFtvdXRDaGFubmVscyAqIGkgKyAxXSA9IHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9ZWxzZXsKLSAgICAgICAgLy9BTE9HVigiXHRCdWZmZXIgYWNjZXNzIGlzIFdSSVRFIik7Ci0gICAgICAgIG1lbWNweShwT3V0LCBwQ29udGV4dC0+T3V0RnJhbWVzLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwT3V0KSAqIEZDQ18yKTsKKyAgICAgICAgaWYgKCFwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIGNoYW5uZWxzIGFuZCBvdXRDaGFubmVscyBhcmUgZXhwZWN0ZWQgdG8gYmUgc2FtZS4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gRkNDXzI7IGogPCBvdXRDaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHBPdXRbb3V0Q2hhbm5lbHMgKiBpICsgal0gPSBwSW5bb3V0Q2hhbm5lbHMgKiBpICsgal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgaWYgKG91dENoYW5uZWxzID09IEZDQ18xKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcE91dFtpXSArPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocENvbnRleHQtPk91dEZyYW1lc1tpICogRkNDXzJdICsgcENvbnRleHQtPk91dEZyYW1lc1tpICogRkNDXzIgKyAxXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcE91dFtpXSArPSBwQ29udGV4dC0+T3V0RnJhbWVzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvdXRDaGFubmVscyA9PSBGQ0NfMSkgeworICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdCgoY29uc3QgcHJvY2Vzc19idWZmZXJfdCopcENvbnRleHQtPk91dEZyYW1lcywgcE91dCwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShwT3V0LCBwQ29udGV4dC0+T3V0RnJhbWVzLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwT3V0KSAqIEZDQ18yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgcHJvY2VzcyAqLworfSAvKiBlbmQgcHJvY2VzcyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFJldmVyYl9mcmVlKCkKQEAgLTQ3NywzMCArNTE0LDEyIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiX2ZyZWUoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewordm9pZCBSZXZlcmJfZnJlZShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgTWVtVGFiOwotCi0gICAgLyogRnJlZSB0aGUgYWxnb3JpdGhtIG1lbW9yeSAqLwotICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLQotICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiUmV2ZXJiX2ZyZWUiKQotCi0gICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKLSAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKLSAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IGZyZWUoKSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMiAiIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgIC8qIGVuZCBSZXZlcmJfZnJlZSAqLworICAgIEx2bVN0YXR1cyA9IExWUkVWX0ZyZWVJbnN0YW5jZShwQ29udGV4dC0+aEluc3RhbmNlKTsKKyAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfRnJlZUluc3RhbmNlIiwgIlJldmVyYl9mcmVlIikKK30gLyogZW5kIFJldmVyYl9mcmVlICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX3NldENvbmZpZygpCkBAIC01MTYsODkgKzUzNSw1OSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUmV2ZXJiX3NldENvbmZpZyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgZWZmZWN0X2NvbmZpZ190ICpwQ29uZmlnKXsKLSAgICBMVk1fRnNfZW4gICBTYW1wbGVSYXRlOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBzdGFydCIpOworaW50IFJldmVyYl9zZXRDb25maWcoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgeworICAgIExWTV9Gc19lbiBTYW1wbGVSYXRlOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgc3RhcnQiKTsKIAogICAgIENIRUNLX0FSRyhwQ29udGV4dCAhPSBOVUxMKTsKICAgICBDSEVDS19BUkcocENvbmZpZyAhPSBOVUxMKTsKIAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyAgICBpbnQgaW5wdXRDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKChwQ29udGV4dC0+YXV4aWxpYXJ5ICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pIHx8Ci0gICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpOwotICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKLSAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CisgICAgICAgICAgICAgICgoIXBDb250ZXh0LT5hdXhpbGlhcnkpICYmIChpbnB1dENoYW5uZWxzIDw9IExWTV9NQVhfQ0hBTk5FTFMpKSk7CisgICAgaW50IG91dHB1dENoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CisgICAgQ0hFQ0tfQVJHKG91dHB1dENoYW5uZWxzIDw9IExWTV9NQVhfQ0hBTk5FTFMpOworICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSB8fAorICAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2FsbGluZyBtZW1jcHkiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGNhbGxpbmcgbWVtY3B5Iik7CiAgICAgcENvbnRleHQtPmNvbmZpZyA9ICpwQ29uZmlnOwogCi0gICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKLSAgICBjYXNlIDgwMDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjA1MDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0NDEwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0ODAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4ODIwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzY0MDA6Ci0gICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE5MjAwMDoKLSAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWKCJcclJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKKyAgICBTYW1wbGVSYXRlID0gbHZtRnNGb3JTYW1wbGVSYXRlKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CisgICAgaWYgKFNhbXBsZVJhdGUgPT0gTFZNX0ZTX0lOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoIlJldmVyYl9zZXRDb25maWcgaW52YWxpZCBzYW1wbGluZyByYXRlICVkIiwgcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5TYW1wbGVSYXRlICE9IFNhbXBsZVJhdGUpIHsKKyAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7CisgICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOwogCi0gICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOwotICAgICAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7Ci0KLSAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGNoYW5nZSBzYW1wbGluZyByYXRlIHRvICVkIiwgU2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgY2hhbmdlIHNhbXBsaW5nIHJhdGUgdG8gJWQiLCBTYW1wbGVSYXRlKTsKIAogICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KLSAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFjdGl2ZVBhcmFtcyk7CisgICAgICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJfc2V0Q29uZmlnIikKLSAgICAgICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCiAgICAgICAgIEFjdGl2ZVBhcmFtcy5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKIAogICAgICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKIAogICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiX3NldENvbmZpZyIpCi0gICAgICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgU3VjY2Vzc2Z1bGx5IGNhbGxlZCBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5TYW1wbGVSYXRlID0gU2FtcGxlUmF0ZTsKLSAgICB9ZWxzZXsKLSAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIGtlZXAgc2FtcGxpbmcgcmF0ZSBhdCAlZCIsIFNhbXBsZVJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcga2VlcCBzYW1wbGluZyByYXRlIGF0ICVkIiwgU2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0Q29uZmlnIEVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRDb25maWcgRW5kIik7CiAgICAgcmV0dXJuIDA7Ci19ICAgLyogZW5kIFJldmVyYl9zZXRDb25maWcgKi8KK30gLyogZW5kIFJldmVyYl9zZXRDb25maWcgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBSZXZlcmJfZ2V0Q29uZmlnKCkKQEAgLTYxNCwxMCArNjAzLDkgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJfZ2V0Q29uZmlnKFJldmVyYkNvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpCi17Cit2b2lkIFJldmVyYl9nZXRDb25maWcoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCogcENvbmZpZykgewogICAgICpwQ29uZmlnID0gcENvbnRleHQtPmNvbmZpZzsKLX0gICAvKiBlbmQgUmV2ZXJiX2dldENvbmZpZyAqLworfSAvKiBlbmQgUmV2ZXJiX2dldENvbmZpZyAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFJldmVyYl9pbml0KCkKQEAgLTYzMSwzNSArNjE5LDM1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBSZXZlcmJfaW5pdChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CitpbnQgUmV2ZXJiX2luaXQoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBzdGFydCIpOwogCiAgICAgQ0hFQ0tfQVJHKHBDb250ZXh0ICE9IE5VTEwpOwogCi0gICAgaWYgKHBDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCl7CisgICAgaWYgKHBDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgewogICAgICAgICBSZXZlcmJfZnJlZShwQ29udGV4dCk7CiAgICAgfQogCi0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgewotICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9NT05POworICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKICAgICB9IGVsc2UgewotICAgICAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgfQotICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgID0gNDQxMDA7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgICAgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgICAgICAgICAgICAgICAgICAgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSAgICAgICAgICAgICAgICAgPSA0NDEwMDsKLSAgICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgICAgID0gTlVMTDsKKyAgICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICAgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llICAgICAgICA9IE5VTEw7Ci0gICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayAgICAgICAgICAgICAgICAgICAgICAgICA9IEVGRkVDVF9DT05GSUdfQUxMOworICAgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CisgICAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogCiAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSBSRVZFUkJfVU5JVF9WT0xVTUU7CiAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwpAQCAtNjY3LDEyMyArNjU1LDc1IEBACiAgICAgcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IFJFVkVSQl9WT0xVTUVfRkxBVDsKIAotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fRkFMU0U7CisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBwYXJhbXM7ICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX0luc3RhbmNlUGFyYW1zX3N0IEluc3RQYXJhbXM7ICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwYXJhbWV0ZXJzICovCiAKICAgICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLwotICAgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplICA9IE1BWF9DQUxMX1NJWkU7Ci0gICAgSW5zdFBhcmFtcy5Tb3VyY2VGb3JtYXQgID0gTFZNX1NURVJFTzsgICAgICAgICAgLy8gTWF4IGZvcm1hdCwgY291bGQgYmUgbW9ubyBkdXJpbmcgcHJvY2VzcwotICAgIEluc3RQYXJhbXMuTnVtRGVsYXlzICAgICA9IExWUkVWX0RFTEFZTElORVNfNDsKLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KLSAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKLQotICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRNZW1vcnlUYWJsZSIsICJSZXZlcmJfaW5pdCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gICAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKLQotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVlJFVl9FUlJPUiA6UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLCBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkgKTsKLSAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMgdGhhdCB3ZXJlCi0gICAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgotICAgICAqLwotICAgIGlmKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKXsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKLSAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDpSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgLSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworICAgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgICBJbnN0UGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87ICAvLyBNYXggZm9ybWF0LCBjb3VsZCBiZSBtb25vIGR1cmluZyBwcm9jZXNzCisgICAgSW5zdFBhcmFtcy5OdW1EZWxheXMgPSBMVlJFVl9ERUxBWUxJTkVTXzQ7CiAKICAgICAvKiBJbml0aWFsaXNlICovCiAgICAgcENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOwogCiAgICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKyAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPmhJbnN0YW5jZSwgJkluc3RQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJSZXZlcmJfaW5pdCIpCi0gICAgaWYoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChMdm1TdGF0dXMgIT0gTFZSRVZfU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKyAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWTV9HZXRJbnN0YW5jZUhhbmRsZVxuIik7CiAKICAgICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCiAgICAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLk9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT047Ci0gICAgcGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTXzQ0MTAwOwotICAgIHBDb250ZXh0LT5TYW1wbGVSYXRlICA9IExWTV9GU180NDEwMDsKKyAgICBwYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICAgIHBhcmFtcy5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICAgIHBDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOwogCi0gICAgaWYocENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PKXsKLSAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX01PTk87CisgICAgaWYgKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgeworICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ID0gTFZNX01PTk87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCAgID0gTFZNX1NURVJFTzsKKyAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CiAgICAgfQogCisgICAgaWYgKChwQ29udGV4dC0+YXV4aWxpYXJ5ID09IGZhbHNlKSAmJiAocGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykpIHsKKyAgICAgICAgcGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgICAgfQogICAgIC8qIFJldmVyYiBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLkxldmVsICAgICAgICAgID0gMDsKLSAgICBwYXJhbXMuTFBGICAgICAgICAgICAgPSAyMzk5OTsKLSAgICBwYXJhbXMuSFBGICAgICAgICAgICAgPSA1MDsKLSAgICBwYXJhbXMuVDYwICAgICAgICAgICAgPSAxNDkwOwotICAgIHBhcmFtcy5EZW5zaXR5ICAgICAgICA9IDEwMDsKLSAgICBwYXJhbXMuRGFtcGluZyAgICAgICAgPSAyMTsKLSAgICBwYXJhbXMuUm9vbVNpemUgICAgICAgPSAxMDA7CisgICAgcGFyYW1zLkxldmVsID0gMDsKKyAgICBwYXJhbXMuTFBGID0gMjM5OTk7CisgICAgcGFyYW1zLkhQRiA9IDUwOworICAgIHBhcmFtcy5UNjAgPSAxNDkwOworICAgIHBhcmFtcy5EZW5zaXR5ID0gMTAwOworICAgIHBhcmFtcy5EYW1waW5nID0gMjE7CisgICAgcGFyYW1zLlJvb21TaXplID0gMTAwOwogCi0gICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9IChwYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpLzEwMDA7CisgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9IChwYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIC8gMTAwMDsKIAogICAgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZSBzZXQgdG8gdGhlIGdldAogICAgICAqIGJlY2F1c2Ugd2UgbWFwIHRoZSBvcmlnaW5hbCBzdHJlbmd0aCByYW5nZSBvZiAwOjEwMDAgdG8gMToxNSwgYW5kIHRoaXMgd2lsbCBhdm9pZAogICAgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZwogICAgICAqLwotICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCAgICA9IC02MDAwOwotICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgICAgICA9IDA7Ci0gICAgcENvbnRleHQtPmJFbmFibGVkICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSAgICA9IHBhcmFtcy5UNjA7Ci0gICAgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvID0gcGFyYW1zLkRhbXBpbmcqMjA7Ci0gICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSAgICAgID0gcGFyYW1zLlJvb21TaXplKjEwOwotICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiAgICA9IHBhcmFtcy5EZW5zaXR5KjEwOwotICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsICA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9IC02MDAwOworICAgIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWwgPSAwOworICAgIHBDb250ZXh0LT5iRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUgPSBwYXJhbXMuVDYwOworICAgIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyA9IHBhcmFtcy5EYW1waW5nICogMjA7CisgICAgcENvbnRleHQtPlNhdmVkRGVuc2l0eSA9IHBhcmFtcy5Sb29tU2l6ZSAqIDEwOworICAgIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbiA9IHBhcmFtcy5EZW5zaXR5ICogMTA7CisgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSAtNjAwMDsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCi0gICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJnBhcmFtcyk7CiAKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiX2luaXQiKQotICAgIGlmKEx2bVN0YXR1cyAhPSBMVlJFVl9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoTHZtU3RhdHVzICE9IExWUkVWX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwogCi0gICAgQUxPR1YoIlx0UmV2ZXJiX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNzZnVsbHkgY2FsbGVkIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICBBTE9HVigiXHRSZXZlcmJfaW5pdCBFbmQiKTsKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgUmV2ZXJiX2luaXQgKi8KK30gLyogZW5kIFJldmVyYl9pbml0ICovCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiQ29udmVydExldmVsKCkKQEAgLTc5NiwyNyArNzM2LDIxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgUmV2ZXJiQ29udmVydExldmVsKGludDE2X3QgbGV2ZWwpewotICAgIHN0YXRpYyBpbnQxNl90IExldmVsQXJyYXlbMTAxXSA9Ci0gICAgewotICAgICAgIC0xMjAwMCwgLTQwMDAsICAtMzM5OCwgIC0zMDQ2LCAgLTI3OTYsICAtMjYwMywgIC0yNDQ0LCAgLTIzMTAsICAtMjE5NCwgIC0yMDkyLAotICAgICAgIC0yMDAwLCAgLTE5MTgsICAtMTg0MiwgIC0xNzczLCAgLTE3MDgsICAtMTY0OCwgIC0xNTkyLCAgLTE1NDAsICAtMTQ5MCwgIC0xNDQzLAotICAgICAgIC0xMzk4LCAgLTEzNTYsICAtMTMxNiwgIC0xMjc3LCAgLTEyNDAsICAtMTIwNSwgIC0xMTcxLCAgLTExMzgsICAtMTEwNiwgIC0xMDc2LAotICAgICAgIC0xMDQ2LCAgLTEwMTgsICAtOTkwLCAgIC05NjMsICAgLTkzOCwgICAtOTEyLCAgIC04ODgsICAgLTg2NCwgICAtODQxLCAgIC04MTgsCi0gICAgICAgLTc5NiwgICAtNzc1LCAgIC03NTQsICAgLTczNCwgICAtNzE0LCAgIC02OTQsICAgLTY3NSwgICAtNjU2LCAgIC02MzgsICAgLTYyMCwKLSAgICAgICAtNjAzLCAgIC01ODUsICAgLTU2OCwgICAtNTUyLCAgIC01MzYsICAgLTUyMCwgICAtNTA0LCAgIC00ODksICAgLTQ3NCwgICAtNDU5LAotICAgICAgIC00NDQsICAgLTQzMCwgICAtNDE2LCAgIC00MDIsICAgLTM4OCwgICAtMzc1LCAgIC0zNjEsICAgLTM0OCwgICAtMzM1LCAgIC0zMjMsCi0gICAgICAgLTMxMCwgICAtMjk4LCAgIC0yODYsICAgLTI3NCwgICAtMjYyLCAgIC0yNTAsICAgLTIzOSwgICAtMjI4LCAgIC0yMTYsICAgLTIwNSwKLSAgICAgICAtMTk0LCAgIC0xODQsICAgLTE3MywgICAtMTYyLCAgIC0xNTIsICAgLTE0MiwgICAtMTMyLCAgIC0xMjEsICAgLTExMiwgICAtMTAyLAotICAgICAgIC05MiwgICAgLTgyLCAgICAtNzMsICAgIC02NCwgICAgLTU0LCAgICAtNDUsICAgIC0zNiwgICAgLTI3LCAgICAtMTgsICAgIC05LAotICAgICAgIDAKLSAgICB9OworaW50MTZfdCBSZXZlcmJDb252ZXJ0TGV2ZWwoaW50MTZfdCBsZXZlbCkgeworICAgIHN0YXRpYyBpbnQxNl90IExldmVsQXJyYXlbMTAxXSA9IHsKKyAgICAgICAgICAgIC0xMjAwMCwgLTQwMDAsIC0zMzk4LCAtMzA0NiwgLTI3OTYsIC0yNjAzLCAtMjQ0NCwgLTIzMTAsIC0yMTk0LCAtMjA5MiwgLTIwMDAsIC0xOTE4LAorICAgICAgICAgICAgLTE4NDIsICAtMTc3MywgLTE3MDgsIC0xNjQ4LCAtMTU5MiwgLTE1NDAsIC0xNDkwLCAtMTQ0MywgLTEzOTgsIC0xMzU2LCAtMTMxNiwgLTEyNzcsCisgICAgICAgICAgICAtMTI0MCwgIC0xMjA1LCAtMTE3MSwgLTExMzgsIC0xMTA2LCAtMTA3NiwgLTEwNDYsIC0xMDE4LCAtOTkwLCAgLTk2MywgIC05MzgsICAtOTEyLAorICAgICAgICAgICAgLTg4OCwgICAtODY0LCAgLTg0MSwgIC04MTgsICAtNzk2LCAgLTc3NSwgIC03NTQsICAtNzM0LCAgLTcxNCwgIC02OTQsICAtNjc1LCAgLTY1NiwKKyAgICAgICAgICAgIC02MzgsICAgLTYyMCwgIC02MDMsICAtNTg1LCAgLTU2OCwgIC01NTIsICAtNTM2LCAgLTUyMCwgIC01MDQsICAtNDg5LCAgLTQ3NCwgIC00NTksCisgICAgICAgICAgICAtNDQ0LCAgIC00MzAsICAtNDE2LCAgLTQwMiwgIC0zODgsICAtMzc1LCAgLTM2MSwgIC0zNDgsICAtMzM1LCAgLTMyMywgIC0zMTAsICAtMjk4LAorICAgICAgICAgICAgLTI4NiwgICAtMjc0LCAgLTI2MiwgIC0yNTAsICAtMjM5LCAgLTIyOCwgIC0yMTYsICAtMjA1LCAgLTE5NCwgIC0xODQsICAtMTczLCAgLTE2MiwKKyAgICAgICAgICAgIC0xNTIsICAgLTE0MiwgIC0xMzIsICAtMTIxLCAgLTExMiwgIC0xMDIsICAtOTIsICAgLTgyLCAgIC03MywgICAtNjQsICAgLTU0LCAgIC00NSwKKyAgICAgICAgICAgIC0zNiwgICAgLTI3LCAgIC0xOCwgICAtOSwgICAgMH07CiAgICAgaW50MTZfdCBpOwogCi0gICAgZm9yKGkgPSAwOyBpIDwgMTAxOyBpKyspCi0gICAgewotICAgICAgIGlmKGxldmVsIDw9IExldmVsQXJyYXlbaV0pCi0gICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDE7IGkrKykgeworICAgICAgICBpZiAobGV2ZWwgPD0gTGV2ZWxBcnJheVtpXSkgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBpOwogfQpAQCAtODMyLDM3ICs3NjYsMzEgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJDb252ZXJ0SGZMZXZlbChpbnQxNl90IEhmbGV2ZWwpeworaW50MTZfdCBSZXZlcmJDb252ZXJ0SGZMZXZlbChpbnQxNl90IEhmbGV2ZWwpIHsKICAgICBpbnQxNl90IGk7CiAKLSAgICBzdGF0aWMgTFBGUGFpcl90IExQRkFycmF5Wzk3XSA9Ci0gICAgeyAgIC8vIExpbWl0IHJhbmdlIHRvIDUwIGZvciBMVlJFViBwYXJhbWV0ZXIgcmFuZ2UKLSAgICAgICAgey0xMDAwMCwgNTB9LCB7IC01MDAwLCA1MCB9LCB7IC00MDAwLCA1MH0sICB7IC0zMDAwLCAxNTh9LCB7IC0yMDAwLCA1MDJ9LAotICAgICAgICB7LTEwMDAsIDE2NjZ9LHsgLTkwMCwgMTg5N30sIHsgLTgwMCwgMjE2OX0sIHsgLTcwMCwgMjQ5Nn0sIHsgLTYwMCwgMjg5NX0sCi0gICAgICAgIHstNTAwLCAzNDAwfSwgeyAtNDAwLCA0MDY2fSwgeyAtMzAwLCA1MDExfSwgeyAtMjAwLCA2NTM3fSwgeyAtMTAwLCAgOTgyNn0sCi0gICAgICAgIHstOTksIDk4ODEgfSwgeyAtOTgsIDk5MzcgfSwgeyAtOTcsIDk5OTQgfSwgeyAtOTYsIDEwMDUyfSwgeyAtOTUsIDEwMTExfSwKLSAgICAgICAgey05NCwgMTAxNzF9LCB7IC05MywgMTAyMzF9LCB7IC05MiwgMTAyOTN9LCB7IC05MSwgMTAzNTZ9LCB7IC05MCwgMTA0MTl9LAotICAgICAgICB7LTg5LCAxMDQ4NH0sIHsgLTg4LCAxMDU0OX0sIHsgLTg3LCAxMDYxNn0sIHsgLTg2LCAxMDY4NH0sIHsgLTg1LCAxMDc1M30sCi0gICAgICAgIHstODQsIDEwODIzfSwgeyAtODMsIDEwODk1fSwgeyAtODIsIDEwOTY4fSwgeyAtODEsIDExMDQyfSwgeyAtODAsIDExMTE3fSwKLSAgICAgICAgey03OSwgMTExOTR9LCB7IC03OCwgMTEyNzJ9LCB7IC03NywgMTEzNTJ9LCB7IC03NiwgMTE0MzN9LCB7IC03NSwgMTE1MTZ9LAotICAgICAgICB7LTc0LCAxMTYwMH0sIHsgLTczLCAxMTY4Nn0sIHsgLTcyLCAxMTc3NH0sIHsgLTcxLCAxMTg2NH0sIHsgLTcwLCAxMTk1NX0sCi0gICAgICAgIHstNjksIDEyMDQ5fSwgeyAtNjgsIDEyMTQ0fSwgeyAtNjcsIDEyMjQyfSwgeyAtNjYsIDEyMzQxfSwgeyAtNjUsIDEyNDQzfSwKLSAgICAgICAgey02NCwgMTI1NDh9LCB7IC02MywgMTI2NTR9LCB7IC02MiwgMTI3NjN9LCB7IC02MSwgMTI4NzV9LCB7IC02MCwgMTI5OTB9LAotICAgICAgICB7LTU5LCAxMzEwN30sIHsgLTU4LCAxMzIyN30sIHsgLTU3LCAxMzM1MX0sIHsgLTU2LCAxMzQ3N30sIHsgLTU1LCAxMzYwN30sCi0gICAgICAgIHstNTQsIDEzNzQxfSwgeyAtNTMsIDEzODc4fSwgeyAtNTIsIDE0MDE5fSwgeyAtNTEsIDE0MTY0fSwgeyAtNTAsIDE0MzEzfSwKLSAgICAgICAgey00OSwgMTQ0Njd9LCB7IC00OCwgMTQ2MjZ9LCB7IC00NywgMTQ3ODl9LCB7IC00NiwgMTQ5NTh9LCB7IC00NSwgMTUxMzJ9LAotICAgICAgICB7LTQ0LCAxNTMxMn0sIHsgLTQzLCAxNTQ5OH0sIHsgLTQyLCAxNTY5MX0sIHsgLTQxLCAxNTg5MH0sIHsgLTQwLCAxNjA5N30sCi0gICAgICAgIHstMzksIDE2MzExfSwgeyAtMzgsIDE2NTM0fSwgeyAtMzcsIDE2NzY2fSwgeyAtMzYsIDE3MDA3fSwgeyAtMzUsIDE3MjU5fSwKLSAgICAgICAgey0zNCwgMTc1MjF9LCB7IC0zMywgMTc3OTV9LCB7IC0zMiwgMTgwODF9LCB7IC0zMSwgMTgzODF9LCB7IC0zMCwgMTg2OTZ9LAotICAgICAgICB7LTI5LCAxOTAyN30sIHsgLTI4LCAxOTM3NX0sIHsgLTI3LCAxOTc0Mn0sIHsgLTI2LCAyMDEyOX0sIHsgLTI1LCAyMDU0MH0sCi0gICAgICAgIHstMjQsIDIwOTc2fSwgeyAtMjMsIDIxNDM5fSwgeyAtMjIsIDIxOTM0fSwgeyAtMjEsIDIyNDYzfSwgeyAtMjAsIDIzMDMxfSwKLSAgICAgICAgey0xOSwgMjM2NDN9LCB7IC0xOCwgMjM5OTl9Ci0gICAgfTsKKyAgICBzdGF0aWMgTFBGUGFpcl90IExQRkFycmF5Wzk3XSA9IHsKKyAgICAgICAgICAgIC8vIExpbWl0IHJhbmdlIHRvIDUwIGZvciBMVlJFViBwYXJhbWV0ZXIgcmFuZ2UKKyAgICAgICAgICAgIHstMTAwMDAsIDUwfSwgey01MDAwLCA1MH0sICB7LTQwMDAsIDUwfSwgIHstMzAwMCwgMTU4fSwgey0yMDAwLCA1MDJ9LCB7LTEwMDAsIDE2NjZ9LAorICAgICAgICAgICAgey05MDAsIDE4OTd9LCB7LTgwMCwgMjE2OX0sIHstNzAwLCAyNDk2fSwgey02MDAsIDI4OTV9LCB7LTUwMCwgMzQwMH0sIHstNDAwLCA0MDY2fSwKKyAgICAgICAgICAgIHstMzAwLCA1MDExfSwgey0yMDAsIDY1Mzd9LCB7LTEwMCwgOTgyNn0sIHstOTksIDk4ODF9LCAgey05OCwgOTkzN30sICB7LTk3LCA5OTk0fSwKKyAgICAgICAgICAgIHstOTYsIDEwMDUyfSwgey05NSwgMTAxMTF9LCB7LTk0LCAxMDE3MX0sIHstOTMsIDEwMjMxfSwgey05MiwgMTAyOTN9LCB7LTkxLCAxMDM1Nn0sCisgICAgICAgICAgICB7LTkwLCAxMDQxOX0sIHstODksIDEwNDg0fSwgey04OCwgMTA1NDl9LCB7LTg3LCAxMDYxNn0sIHstODYsIDEwNjg0fSwgey04NSwgMTA3NTN9LAorICAgICAgICAgICAgey04NCwgMTA4MjN9LCB7LTgzLCAxMDg5NX0sIHstODIsIDEwOTY4fSwgey04MSwgMTEwNDJ9LCB7LTgwLCAxMTExN30sIHstNzksIDExMTk0fSwKKyAgICAgICAgICAgIHstNzgsIDExMjcyfSwgey03NywgMTEzNTJ9LCB7LTc2LCAxMTQzM30sIHstNzUsIDExNTE2fSwgey03NCwgMTE2MDB9LCB7LTczLCAxMTY4Nn0sCisgICAgICAgICAgICB7LTcyLCAxMTc3NH0sIHstNzEsIDExODY0fSwgey03MCwgMTE5NTV9LCB7LTY5LCAxMjA0OX0sIHstNjgsIDEyMTQ0fSwgey02NywgMTIyNDJ9LAorICAgICAgICAgICAgey02NiwgMTIzNDF9LCB7LTY1LCAxMjQ0M30sIHstNjQsIDEyNTQ4fSwgey02MywgMTI2NTR9LCB7LTYyLCAxMjc2M30sIHstNjEsIDEyODc1fSwKKyAgICAgICAgICAgIHstNjAsIDEyOTkwfSwgey01OSwgMTMxMDd9LCB7LTU4LCAxMzIyN30sIHstNTcsIDEzMzUxfSwgey01NiwgMTM0Nzd9LCB7LTU1LCAxMzYwN30sCisgICAgICAgICAgICB7LTU0LCAxMzc0MX0sIHstNTMsIDEzODc4fSwgey01MiwgMTQwMTl9LCB7LTUxLCAxNDE2NH0sIHstNTAsIDE0MzEzfSwgey00OSwgMTQ0Njd9LAorICAgICAgICAgICAgey00OCwgMTQ2MjZ9LCB7LTQ3LCAxNDc4OX0sIHstNDYsIDE0OTU4fSwgey00NSwgMTUxMzJ9LCB7LTQ0LCAxNTMxMn0sIHstNDMsIDE1NDk4fSwKKyAgICAgICAgICAgIHstNDIsIDE1NjkxfSwgey00MSwgMTU4OTB9LCB7LTQwLCAxNjA5N30sIHstMzksIDE2MzExfSwgey0zOCwgMTY1MzR9LCB7LTM3LCAxNjc2Nn0sCisgICAgICAgICAgICB7LTM2LCAxNzAwN30sIHstMzUsIDE3MjU5fSwgey0zNCwgMTc1MjF9LCB7LTMzLCAxNzc5NX0sIHstMzIsIDE4MDgxfSwgey0zMSwgMTgzODF9LAorICAgICAgICAgICAgey0zMCwgMTg2OTZ9LCB7LTI5LCAxOTAyN30sIHstMjgsIDE5Mzc1fSwgey0yNywgMTk3NDJ9LCB7LTI2LCAyMDEyOX0sIHstMjUsIDIwNTQwfSwKKyAgICAgICAgICAgIHstMjQsIDIwOTc2fSwgey0yMywgMjE0Mzl9LCB7LTIyLCAyMTkzNH0sIHstMjEsIDIyNDYzfSwgey0yMCwgMjMwMzF9LCB7LTE5LCAyMzY0M30sCisgICAgICAgICAgICB7LTE4LCAyMzk5OX19OwogCi0gICAgZm9yKGkgPSAwOyBpIDwgOTY7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmKEhmbGV2ZWwgPD0gTFBGQXJyYXlbaV0uUm9vbV9IRikKLSAgICAgICAgICAgIGJyZWFrOworICAgIGZvciAoaSA9IDA7IGkgPCA5NjsgaSsrKSB7CisgICAgICAgIGlmIChIZmxldmVsIDw9IExQRkFycmF5W2ldLlJvb21fSEYpIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gTFBGQXJyYXlbaV0uTFBGOwogfQpAQCAtODc5LDI2ICs4MDcsMjYgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJTZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21IZkxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUhmTGV2ZWwgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKIAogICAgIEFjdGl2ZVBhcmFtcy5MUEYgPSBSZXZlcmJDb252ZXJ0SGZMZXZlbChsZXZlbCk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tSGZMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29taGZMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKICAgICBwQ29udGV4dC0+U2F2ZWRIZkxldmVsID0gbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRIZlJvb21MZXZlbCBlbmQuLiBzYXZpbmcgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRIZlJvb21MZXZlbCBlbmQuLiBzYXZpbmcgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTkxMywzMCArODQxLDMxIEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDE2X3QgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworaW50MTZfdCBSZXZlcmJHZXRSb29tSGZMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgewogICAgIGludDE2X3QgbGV2ZWw7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBzdGFydCwgc2F2ZWQgbGV2ZWwgaXMgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBzdGFydCwgc2F2ZWQgbGV2ZWwgaXMgJWQiLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXRSb29tSGZMZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTFBGKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21IZkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MUEYpOwogCiAgICAgbGV2ZWwgPSBSZXZlcmJDb252ZXJ0SGZMZXZlbChwQ29udGV4dC0+U2F2ZWRIZkxldmVsKTsKIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBBY3RpdmVQYXJhbXMuTFBGTCAlZCwgcENvbnRleHQtPlNhdmVkSGZMZXZlbDogJWQsICIKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tSGZMZXZlbCgpIEFjdGl2ZVBhcmFtcy5MUEZMICVkLCBwQ29udGV4dC0+U2F2ZWRIZkxldmVsOiAlZCwgIgogICAgIC8vICAgICAiY29udmVydGVkIGxldmVsOiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxQRiwgcENvbnRleHQtPlNhdmVkSGZMZXZlbCwgbGV2ZWwpOwogCi0gICAgaWYoKGludDE2X3QpQWN0aXZlUGFyYW1zLkxQRiAhPSBsZXZlbCl7Ci0gICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJvb21IZkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAotICAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBsZXZlbCk7CisgICAgaWYgKChpbnQxNl90KUFjdGl2ZVBhcmFtcy5MUEYgIT0gbGV2ZWwpIHsKKyAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUhmTGV2ZWwoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgIgorICAgICAgICAgICAgICAiJWRcbiIsCisgICAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCwgbGV2ZWwpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUhmTGV2ZWwgZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZEhmTGV2ZWw7CiB9CiAKQEAgLTk1MiwzNSArODgxLDM1IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXZvaWQgUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpewotICAgIC8vQUxPR1YoIlxuXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgeworICAgIC8vIEFMT0dWKCJcblx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJldmVyYkxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CiAKICAgICAvLyBuZWVkcyB0byBzdWJ0cmFjdCBtYXggbGV2ZWxzIGZvciBib3RoIFJvb21MZXZlbCBhbmQgUmV2ZXJiTGV2ZWwKLSAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKKyAgICBDb21iaW5lZExldmVsID0gKGxldmVsICsgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKSAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUw7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKICAgICAvLyAgICAgIENvbWJpbmVkTGV2ZWwsIGxldmVsLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwpOwogCiAgICAgQWN0aXZlUGFyYW1zLkxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIFRyeWluZyB0byBzZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBUcnlpbmcgdG8gc2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0UmV2ZXJiTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0UmV2ZXJiTGV2ZWwoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSZXZlcmJMZXZlbCgpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGVuZCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCBpcyAlZFxuXG4iLAorICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJldmVyYkxldmVsIGVuZCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCBpcyAlZFxuXG4iLAogICAgIC8vICAgICBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCk7CiAgICAgcmV0dXJuOwogfQpAQCAtOTk2LDM3ICs5MjUsNDAgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJHZXRSZXZlcmJMZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCl7CitpbnQxNl90IFJldmVyYkdldFJldmVyYkxldmVsKFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CiAgICAgaW50MTZfdCBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVk1fSU5UMzIgQ29tYmluZWRMZXZlbDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VtIG9mIHJvb20gYW5kIHJldmVyYiBsZXZlbCBjb250cm9scwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldFJldmVyYkxldmVsIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgLy8gbmVlZHMgdG8gc3VidHJhY3QgbWF4IGxldmVscyBmb3IgYm90aCBSb29tTGV2ZWwgYW5kIFJldmVyYkxldmVsCi0gICAgQ29tYmluZWRMZXZlbCA9IChwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCArIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCktTFZSRVZfTUFYX1JFVkVSQl9MRVZFTDsKKyAgICBDb21iaW5lZExldmVsID0KKyAgICAgICAgICAgIChwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCArIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCkgLSBMVlJFVl9NQVhfUkVWRVJCX0xFVkVMOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIENvbWJpbmVkTGV2ZWwgaXMgJWQgPSAlZCArICVkXG4iLAotICAgIC8vQ29tYmluZWRMZXZlbCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKSBDb21iaW5lZExldmVsIGlzICVkID0gJWQgKyAlZFxuIiwKKyAgICAvLyBDb21iaW5lZExldmVsLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCwgcENvbnRleHQtPlNhdmVkUm9vbUxldmVsKTsKICAgICBsZXZlbCA9IFJldmVyYkNvbnZlcnRMZXZlbChDb21iaW5lZExldmVsKTsKIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKTogQWN0aXZlUGFyYW1zLkxldmVsOiAlZCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWw6ICVkLCAiCisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwoKTogQWN0aXZlUGFyYW1zLkxldmVsOiAlZCwgcENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWw6ICVkLCAiCiAgICAgLy8icENvbnRleHQtPlNhdmVkUm9vbUxldmVsOiAlZCwgQ29tYmluZWRMZXZlbDogJWQsIGNvbnZlcnRlZCBsZXZlbDogJWRcbiIsCi0gICAgLy9BY3RpdmVQYXJhbXMuTGV2ZWwsIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCwgQ29tYmluZWRMZXZlbCxsZXZlbCk7CisgICAgLy8gQWN0aXZlUGFyYW1zLkxldmVsLCBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCxwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwsCisgICAgLy8gQ29tYmluZWRMZXZlbCxsZXZlbCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpewotICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiAoaWdub3JlIGF0IHN0YXJ0IHVwKSBSZXZlcmJHZXRSZXZlcmJMZXZlbCgpIGhhcyB3cm9uZyBsZXZlbCAtPiAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkxldmVsICE9IGxldmVsKSB7CisgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IChpZ25vcmUgYXQgc3RhcnQgdXApIFJldmVyYkdldFJldmVyYkxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICIKKyAgICAgICAgICAgICAgIiVkXG4iLAorICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJldmVyYkxldmVsIGVuZFxuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0UmV2ZXJiTGV2ZWwgZW5kXG4iKTsKIAogICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbDsKIH0KQEAgLTEwNDMsMzAgKzk3NSwzMCBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldFJvb21MZXZlbChSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCBsZXZlbCl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwgc3RhcnQgKCVkKSIsIGxldmVsKTsKK3ZvaWQgUmV2ZXJiU2V0Um9vbUxldmVsKFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIHN0YXJ0ICglZCkiLCBsZXZlbCk7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXRSb29tTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgLy8gbmVlZHMgdG8gc3VidHJhY3QgbWF4IGxldmVscyBmb3IgYm90aCBSb29tTGV2ZWwgYW5kIFJldmVyYkxldmVsCi0gICAgQ29tYmluZWRMZXZlbCA9IChsZXZlbCArIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsKS1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMOworICAgIENvbWJpbmVkTGV2ZWwgPSAobGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCkgLSBMVlJFVl9NQVhfUkVWRVJCX0xFVkVMOwogICAgIEFjdGl2ZVBhcmFtcy5MZXZlbCA9IFJldmVyYkNvbnZlcnRMZXZlbChDb21iaW5lZExldmVsKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldFJvb21MZXZlbCIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXRSb29tTGV2ZWwoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkxldmVsKTsKIAogICAgIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0Um9vbUxldmVsIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldFJvb21MZXZlbCBlbmQiKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTEwODEsMzUgKzEwMTMsMzYgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MTZfdCBSZXZlcmJHZXRSb29tTGV2ZWwoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpeworaW50MTZfdCBSZXZlcmJHZXRSb29tTGV2ZWwoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKICAgICBpbnQxNl90IGxldmVsOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIHN0YXJ0Iik7CiAKLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICBDb21iaW5lZExldmVsOyAgICAgICAgICAgICAvLyBTdW0gb2Ygcm9vbSBhbmQgcmV2ZXJiIGxldmVsIGNvbnRyb2xzCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDMyIENvbWJpbmVkTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1bSBvZiByb29tIGFuZCByZXZlcmIgbGV2ZWwgY29udHJvbHMKIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXRSb29tTGV2ZWwiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuTGV2ZWwpOwogCiAgICAgLy8gbmVlZHMgdG8gc3VidHJhY3QgbWF4IGxldmVscyBmb3IgYm90aCBSb29tTGV2ZWwgYW5kIFJldmVyYkxldmVsCi0gICAgQ29tYmluZWRMZXZlbCA9IChwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbC1MVlJFVl9NQVhfUkVWRVJCX0xFVkVMKTsKKyAgICBDb21iaW5lZExldmVsID0KKyAgICAgICAgICAgIChwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwgKyBwQ29udGV4dC0+U2F2ZWRSZXZlcmJMZXZlbCAtIExWUkVWX01BWF9SRVZFUkJfTEVWRUwpOwogICAgIGxldmVsID0gUmV2ZXJiQ29udmVydExldmVsKENvbWJpbmVkTGV2ZWwpOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwsIExldmVsID0gJWQsIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbCA9ICVkLCAiCisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0Um9vbUxldmVsLCBMZXZlbCA9ICVkLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwgPSAlZCwgIgogICAgIC8vICAgICAicENvbnRleHQtPlNhdmVkUmV2ZXJiTGV2ZWwgPSAlZCwgQ29tYmluZWRMZXZlbCA9ICVkLCBsZXZlbCA9ICVkIiwKICAgICAvLyAgICAgQWN0aXZlUGFyYW1zLkxldmVsLCBwQ29udGV4dC0+U2F2ZWRSb29tTGV2ZWwsCiAgICAgLy8gICAgIHBDb250ZXh0LT5TYXZlZFJldmVyYkxldmVsLCBDb21iaW5lZExldmVsLCBsZXZlbCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpeworICAgIGlmIChBY3RpdmVQYXJhbXMuTGV2ZWwgIT0gbGV2ZWwpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogKGlnbm9yZSBhdCBzdGFydCB1cCkgUmV2ZXJiR2V0Um9vbUxldmVsKCkgaGFzIHdyb25nIGxldmVsIC0+ICVkICVkXG4iLAogICAgICAgICAgICAgICBBY3RpdmVQYXJhbXMuTGV2ZWwsIGxldmVsKTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldFJvb21MZXZlbCBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXRSb29tTGV2ZWwgZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZFJvb21MZXZlbDsKIH0KIApAQCAtMTEyNSwzNCArMTA1OCwzNSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldERlY2F5VGltZShSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgdWludDMyX3QgdGltZSl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgc3RhcnQgKCVkKSIsIHRpbWUpOwordm9pZCBSZXZlcmJTZXREZWNheVRpbWUoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIHVpbnQzMl90IHRpbWUpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgc3RhcnQgKCVkKSIsIHRpbWUpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5VGltZSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKIAogICAgIGlmICh0aW1lIDw9IExWUkVWX01BWF9UNjApIHsKICAgICAgICAgQWN0aXZlUGFyYW1zLlQ2MCA9IChMVk1fVUlOVDE2KXRpbWU7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICAgIEFjdGl2ZVBhcmFtcy5UNjAgPSBMVlJFVl9NQVhfVDYwOwogICAgIH0KIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlY2F5VGltZSIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjApOwogCi0gICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9IChBY3RpdmVQYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpLzEwMDA7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCBTYW1wbGVzVG9FeGl0Q291bnQtPiAlZFxuIixwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKKyAgICBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID0KKyAgICAgICAgICAgIChBY3RpdmVQYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIC8gMTAwMDsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUoKSBqdXN0IFNldCBTYW1wbGVzVG9FeGl0Q291bnQtPgorICAgIC8vICVkXG4iLHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOwogICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSA9IChpbnQxNl90KXRpbWU7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheVRpbWUgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlUaW1lIGVuZCIpOwogICAgIHJldHVybjsKIH0KIApAQCAtMTE2NywyNSArMTEwMSwyNSBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi11aW50MzJfdCBSZXZlcmJHZXREZWNheVRpbWUoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lIHN0YXJ0Iik7Cit1aW50MzJfdCBSZXZlcmJHZXREZWNheVRpbWUoUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXREZWNheVRpbWUiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5VGltZSgpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuVDYwKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlQ2MCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuVDYwICE9IHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSl7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5UNjAgIT0gcENvbnRleHQtPlNhdmVkRGVjYXlUaW1lKSB7CiAgICAgICAgIC8vIFRoaXMgd2lsbCBmYWlsIGlmIHRoZSBkZWNheSB0aW1lIGlzIHNldCB0byBtb3JlIHRoYW4gNzAwMAotICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZWNheVRpbWUoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCi0gICAgICAgICBBY3RpdmVQYXJhbXMuVDYwLCBwQ29udGV4dC0+U2F2ZWREZWNheVRpbWUpOworICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZWNheVRpbWUoKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsIEFjdGl2ZVBhcmFtcy5UNjAsCisgICAgICAgICAgICAgIHBDb250ZXh0LT5TYXZlZERlY2F5VGltZSk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheVRpbWUgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlUaW1lIGVuZCIpOwogICAgIHJldHVybiAodWludDMyX3QpQWN0aXZlUGFyYW1zLlQ2MDsKIH0KIApAQCAtMTIwMSwyNyArMTEzNSwyNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldERlY2F5SGZSYXRpbyhSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwgaW50MTZfdCByYXRpbyl7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW9lIHN0YXJ0ICglZCkiLCByYXRpbyk7Cit2b2lkIFJldmVyYlNldERlY2F5SGZSYXRpbyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCByYXRpbykgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpb2Ugc3RhcnQgKCVkKSIsIHJhdGlvKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbyBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZWNheUhmUmF0aW8oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRhbXBpbmcpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbyBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CiAKLSAgICBBY3RpdmVQYXJhbXMuRGFtcGluZyA9IChMVk1fSU5UMTYpKHJhdGlvLzIwKTsKKyAgICBBY3RpdmVQYXJhbXMuRGFtcGluZyA9IChMVk1fSU5UMTYpKHJhdGlvIC8gMjApOwogCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbygpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvKCkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKIAogICAgIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyA9IHJhdGlvOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVjYXlIZlJhdGlvIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlY2F5SGZSYXRpbyBlbmQiKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTEyMzYsMjQgKzExNzAsMjQgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBSZXZlcmJHZXREZWNheUhmUmF0aW8oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIHN0YXJ0Iik7CitpbnQzMl90IFJldmVyYkdldERlY2F5SGZSYXRpbyhSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbyBzdGFydCIpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAogICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJHZXREZWNheUhmUmF0aW8iKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlY2F5SGZSYXRpbygpIGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGFtcGluZyk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIFN1Y2Nlc3NmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EYW1waW5nKTsKIAotICAgIGlmKEFjdGl2ZVBhcmFtcy5EYW1waW5nICE9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyAvIDIwKSl7CisgICAgaWYgKEFjdGl2ZVBhcmFtcy5EYW1waW5nICE9IChMVk1fSU5UMTYpKHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyAvIDIwKSkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZWNheUhmUmF0aW8oKSBoYXMgd3JvbmcgbGV2ZWwgLT4gJWQgJWRcbiIsCi0gICAgICAgICBBY3RpdmVQYXJhbXMuRGFtcGluZywgcENvbnRleHQtPlNhdmVkRGVjYXlIZlJhdGlvKTsKKyAgICAgICAgICAgICAgQWN0aXZlUGFyYW1zLkRhbXBpbmcsIHBDb250ZXh0LT5TYXZlZERlY2F5SGZSYXRpbyk7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZWNheUhmUmF0aW8gZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVjYXlIZlJhdGlvIGVuZCIpOwogICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREZWNheUhmUmF0aW87CiB9CiAKQEAgLTEyNjksMjcgKzEyMDMsMjcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBSZXZlcmJTZXREaWZmdXNpb24oUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uIHN0YXJ0ICglZCkiLCBsZXZlbCk7Cit2b2lkIFJldmVyYlNldERpZmZ1c2lvbihSZXZlcmJDb250ZXh0KiBwQ29udGV4dCwgaW50MTZfdCBsZXZlbCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBzdGFydCAoJWQpIiwgbGV2ZWwpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERpZmZ1c2lvbiIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gU3VjY2VzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOwotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGlmZnVzaW9uKCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24oKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOwogCi0gICAgQWN0aXZlUGFyYW1zLkRlbnNpdHkgPSAoTFZNX0lOVDE2KShsZXZlbC8xMCk7CisgICAgQWN0aXZlUGFyYW1zLkRlbnNpdHkgPSAoTFZNX0lOVDE2KShsZXZlbCAvIDEwKTsKIAogICAgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERpZmZ1c2lvbiIpCi0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24oKSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLkRlbnNpdHkpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbigpIGp1c3QgU2V0IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuRGVuc2l0eSk7CiAKICAgICBwQ29udGV4dC0+U2F2ZWREaWZmdXNpb24gPSBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERpZmZ1c2lvbiBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREaWZmdXNpb24gZW5kIik7CiAgICAgcmV0dXJuOwogfQogCkBAIC0xMzA0LDI2ICsxMjM4LDI2IEBACiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludDMyX3QgUmV2ZXJiR2V0RGlmZnVzaW9uKFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBzdGFydCIpOworaW50MzJfdCBSZXZlcmJHZXREaWZmdXNpb24oUmV2ZXJiQ29udGV4dCogcENvbnRleHQpIHsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREaWZmdXNpb24gc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFRlbXA7CisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2IFRlbXA7CiAKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+aEluc3RhbmNlLCAmQWN0aXZlUGFyYW1zKTsKICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiUmV2ZXJiR2V0RGlmZnVzaW9uIikKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREaWZmdXNpb24ganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREaWZmdXNpb24gU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREaWZmdXNpb24ganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKIAotICAgIFRlbXAgPSAoTFZNX0lOVDE2KShwQ29udGV4dC0+U2F2ZWREaWZmdXNpb24vMTApOworICAgIFRlbXAgPSAoTFZNX0lOVDE2KShwQ29udGV4dC0+U2F2ZWREaWZmdXNpb24gLyAxMCk7CiAKLSAgICBpZihBY3RpdmVQYXJhbXMuRGVuc2l0eSAhPSBUZW1wKXsKKyAgICBpZiAoQWN0aXZlUGFyYW1zLkRlbnNpdHkgIT0gVGVtcCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREaWZmdXNpb24gaW52YWxpZCB2YWx1ZSAlZCAlZCIsIFRlbXAsIEFjdGl2ZVBhcmFtcy5EZW5zaXR5KTsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERpZmZ1c2lvbiBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREaWZmdXNpb24gZW5kIik7CiAgICAgcmV0dXJuIHBDb250ZXh0LT5TYXZlZERpZmZ1c2lvbjsKIH0KIApAQCAtMTMzOSwyNyArMTI3MywyNyBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFJldmVyYlNldERlbnNpdHkoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIGludDE2X3QgbGV2ZWwpewotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBzdGFydCAoJWQpIiwgbGV2ZWwpOwordm9pZCBSZXZlcmJTZXREZW5zaXR5KFJldmVyYkNvbnRleHQqIHBDb250ZXh0LCBpbnQxNl90IGxldmVsKSB7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBzdGFydCAoJWQpIiwgbGV2ZWwpOwogCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWUkVWX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVlJFVl9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYlNldERlbnNpdHkiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYlNldERlbnNpdHkgU3VjY2Vzc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJTZXREZW5zaXR5IGp1c3QgR290IC0+ICVkXG4iLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogCiAgICAgQWN0aXZlUGFyYW1zLlJvb21TaXplID0gKExWTV9JTlQxNikoKChsZXZlbCAqIDk5KSAvIDEwMDApICsgMSk7CiAKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyIsICJSZXZlcmJTZXREZW5zaXR5IikKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlbnNpdHkganVzdCBTZXQgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBqdXN0IFNldCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKIAogICAgIHBDb250ZXh0LT5TYXZlZERlbnNpdHkgPSBsZXZlbDsKLSAgICAvL0FMT0dWKCJcdFJldmVyYlNldERlbnNpdHkgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiU2V0RGVuc2l0eSBlbmQiKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTEzNzQsMjUgKzEzMDgsMjUgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50MzJfdCBSZXZlcmJHZXREZW5zaXR5KFJldmVyYkNvbnRleHQgKnBDb250ZXh0KXsKLSAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlbnNpdHkgc3RhcnQiKTsKK2ludDMyX3QgUmV2ZXJiR2V0RGVuc2l0eShSZXZlcmJDb250ZXh0KiBwQ29udGV4dCkgeworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlbnNpdHkgc3RhcnQiKTsKIAotICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAgQWN0aXZlUGFyYW1zOyAgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KLSAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVlJFVl9TVUNDRVNTOyAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFRlbXA7CisgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCisgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWUkVWX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgICAgTFZNX0lOVDE2IFRlbXA7CiAgICAgLyogR2V0IHRoZSBjdXJyZW50IHNldHRpbmdzICovCiAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzIiwgIlJldmVyYkdldERlbnNpdHkiKQotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBTdWNjZXNmdWxseSByZXR1cm5lZCBmcm9tIExWTV9HZXRDb250cm9sUGFyYW1ldGVyc1xuIik7Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5KCkganVzdCBHb3QgLT4gJWRcbiIsIEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBTdWNjZXNzZnVsbHkgcmV0dXJuZWQgZnJvbSBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnNcbiIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYkdldERlbnNpdHkoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKIAogICAgIFRlbXAgPSAoTFZNX0lOVDE2KSgoKHBDb250ZXh0LT5TYXZlZERlbnNpdHkgKiA5OSkgLyAxMDAwKSArIDEpOwogCi0gICAgaWYoVGVtcCAhPSBBY3RpdmVQYXJhbXMuUm9vbVNpemUpeworICAgIGlmIChUZW1wICE9IEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJHZXREZW5zaXR5IGludmFsaWQgdmFsdWUgJWQgJWQiLCBUZW1wLCBBY3RpdmVQYXJhbXMuUm9vbVNpemUpOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiR2V0RGVuc2l0eSBlbmQiKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IGVuZCIpOwogICAgIHJldHVybiBwQ29udGV4dC0+U2F2ZWREZW5zaXR5OwogfQogCkBAIC0xNDEwLDIwICsxMzQ0LDE5IEBACiAvLyBTaWRlIEVmZmVjdHM6CiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgUmV2ZXJiX0xvYWRQcmVzZXQoUmV2ZXJiQ29udGV4dCAgICpwQ29udGV4dCkKLXsKLSAgICAvL1RPRE86IGFkZCByZWZsZWN0aW9ucyBkZWxheSwgbGV2ZWwgYW5kIHJldmVyYiBkZWxheSB3aGVuIGVhcmx5IHJlZmxlY3Rpb25zIGFyZQoraW50IFJldmVyYl9Mb2FkUHJlc2V0KFJldmVyYkNvbnRleHQqIHBDb250ZXh0KSB7CisgICAgLy8gVE9ETzogYWRkIHJlZmxlY3Rpb25zIGRlbGF5LCBsZXZlbCBhbmQgcmV2ZXJiIGRlbGF5IHdoZW4gZWFybHkgcmVmbGVjdGlvbnMgYXJlCiAgICAgLy8gaW1wbGVtZW50ZWQKICAgICBwQ29udGV4dC0+Y3VyUHJlc2V0ID0gcENvbnRleHQtPm5leHRQcmVzZXQ7CiAKICAgICBpZiAocENvbnRleHQtPmN1clByZXNldCAhPSBSRVZFUkJfUFJFU0VUX05PTkUpIHsKLSAgICAgICAgY29uc3QgdF9yZXZlcmJfc2V0dGluZ3MgKnByZXNldCA9ICZzUmV2ZXJiUHJlc2V0c1twQ29udGV4dC0+Y3VyUHJlc2V0XTsKKyAgICAgICAgY29uc3QgdF9yZXZlcmJfc2V0dGluZ3MqIHByZXNldCA9ICZzUmV2ZXJiUHJlc2V0c1twQ29udGV4dC0+Y3VyUHJlc2V0XTsKICAgICAgICAgUmV2ZXJiU2V0Um9vbUxldmVsKHBDb250ZXh0LCBwcmVzZXQtPnJvb21MZXZlbCk7CiAgICAgICAgIFJldmVyYlNldFJvb21IZkxldmVsKHBDb250ZXh0LCBwcmVzZXQtPnJvb21IRkxldmVsKTsKICAgICAgICAgUmV2ZXJiU2V0RGVjYXlUaW1lKHBDb250ZXh0LCBwcmVzZXQtPmRlY2F5VGltZSk7CiAgICAgICAgIFJldmVyYlNldERlY2F5SGZSYXRpbyhwQ29udGV4dCwgcHJlc2V0LT5kZWNheUhGUmF0aW8pOwotICAgICAgICAvL3JlZmxlY3Rpb25zTGV2ZWwKLSAgICAgICAgLy9yZWZsZWN0aW9uc0RlbGF5CisgICAgICAgIC8vIHJlZmxlY3Rpb25zTGV2ZWwKKyAgICAgICAgLy8gcmVmbGVjdGlvbnNEZWxheQogICAgICAgICBSZXZlcmJTZXRSZXZlcmJMZXZlbChwQ29udGV4dCwgcHJlc2V0LT5yZXZlcmJMZXZlbCk7CiAgICAgICAgIC8vIHJldmVyYkRlbGF5CiAgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcHJlc2V0LT5kaWZmdXNpb24pOwpAQCAtMTQ1NCw5OSArMTM4Nyw5NiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUmV2ZXJiX2dldFBhcmFtZXRlcihSZXZlcmJDb250ZXh0ICpwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgKnBWYWx1ZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwVmFsdWUpeworaW50IFJldmVyYl9nZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIGludDMyX3QgKnBQYXJhbVRlbXAgPSAoaW50MzJfdCAqKXBQYXJhbTsKKyAgICBpbnQzMl90KiBwUGFyYW1UZW1wID0gKGludDMyX3QqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKLSAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7CisgICAgdF9yZXZlcmJfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzOwogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIHN0YXJ0Iik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlciBzdGFydCIpOwogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0KSB7CiAgICAgICAgIGlmIChwYXJhbSAhPSBSRVZFUkJfUEFSQU1fUFJFU0VUIHx8ICpwVmFsdWVTaXplIDwgc2l6ZW9mKHVpbnQxNl90KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KIAotICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gcENvbnRleHQtPm5leHRQcmVzZXQ7CisgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9IHBDb250ZXh0LT5uZXh0UHJlc2V0OwogICAgICAgICBBTE9HVigiZ2V0IFJFVkVSQl9QQVJBTV9QUkVTRVQsIHByZXNldCAlZCIsIHBDb250ZXh0LT5uZXh0UHJlc2V0KTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgc3dpdGNoIChwYXJhbSl7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTEyICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTMgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgaW52YWxpZCBwVmFsdWVTaXplNCAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFRkxFQ1RJT05TX0xFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTUgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKXsKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTYgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgotICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKGludDE2X3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2dldFBhcmFtZXRlcigpIGludmFsaWQgcFZhbHVlU2l6ZTcgJWQiLCAqcFZhbHVlU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU4ICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemU5ICVkIiwgKnBWYWx1ZVNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSBzaXplb2YoaW50MTZfdCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSAhPSBzaXplb2YoaW50MTZfdCkpeworICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplICE9IHNpemVvZihpbnQxNl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUxMCAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpwVmFsdWVTaXplID0gc2l6ZW9mKGludDE2X3QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHRfcmV2ZXJiX3NldHRpbmdzKSl7CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgIT0gc2l6ZW9mKHRfcmV2ZXJiX3NldHRpbmdzKSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBpbnZhbGlkIHBWYWx1ZVNpemUxMSAlZCIsICpwVmFsdWVTaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KQEAgLTE1NTgsOSArMTQ4OCw5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBwUHJvcGVydGllcyA9ICh0X3JldmVyYl9zZXR0aW5ncyAqKSBwVmFsdWU7CisgICAgcFByb3BlcnRpZXMgPSAodF9yZXZlcmJfc2V0dGluZ3MqKXBWYWx1ZTsKIAotICAgIHN3aXRjaCAocGFyYW0peworICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwgPSBSZXZlcmJHZXRSb29tTGV2ZWwocENvbnRleHQpOwogICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsID0gUmV2ZXJiR2V0Um9vbUhmTGV2ZWwocENvbnRleHQpOwpAQCAtMTU3NCw3NCArMTUwNCw3NCBAQAogICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlbnNpdHkgPSBSZXZlcmJHZXREZW5zaXR5KHBDb250ZXh0KTsKIAogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJvb21MZXZlbCAgICAgICAgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tTGV2ZWwpOworICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcm9vbUhGTGV2ZWwgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yb29tSEZMZXZlbCk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGVjYXlUaW1lICAgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRlY2F5VGltZSk7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlUaW1lKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkZWNheUhGUmF0aW8gICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVjYXlIRlJhdGlvKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5kZWNheUhGUmF0aW8pOwogICAgICAgICAgICAgQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTIFZhbHVlIGlzIHJlZmxlY3Rpb25zTGV2ZWwgJWQiLAotICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0xldmVsKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZWZsZWN0aW9uc0xldmVsKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyByZWZsZWN0aW9uc0RlbGF5ICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheSk7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+cmVmbGVjdGlvbnNEZWxheSk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmV2ZXJiRGVsYXkgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkRlbGF5KTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZXZlcmJEZWxheSk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgcmV2ZXJiTGV2ZWwgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPnJldmVyYkxldmVsKTsKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5yZXZlcmJMZXZlbCk7CiAgICAgICAgICAgICBBTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1BST1BFUlRJRVMgVmFsdWUgaXMgZGlmZnVzaW9uICAgICAgICAlZCIsCi0gICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmRpZmZ1c2lvbik7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGlmZnVzaW9uKTsKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyBWYWx1ZSBpcyBkZW5zaXR5ICAgICAgICAgICVkIiwKLSAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVuc2l0eSk7CisgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZGVuc2l0eSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgotICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0Um9vbUxldmVsKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0Um9vbUxldmVsKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgICAgICAgICAqKGludDE2X3QgKilwVmFsdWUgPSBSZXZlcmJHZXRSb29tSGZMZXZlbChwQ29udGV4dCk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFJldmVyYkdldFJvb21IZkxldmVsKHBDb250ZXh0KTsKIAotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUwgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVjYXlUaW1lKHBDb250ZXh0KTsKKyAgICAgICAgICAgICoodWludDMyX3QqKXBWYWx1ZSA9IFJldmVyYkdldERlY2F5VGltZShwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRSBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopcFZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTzoKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERlY2F5SGZSYXRpbyhwQ29udGV4dCk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFJldmVyYkdldERlY2F5SGZSYXRpbyhwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJT04gVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgotICAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldFJldmVyYkxldmVsKHBDb250ZXh0KTsKKyAgICAgICAgICAgICooaW50MTZfdCopcFZhbHVlID0gUmV2ZXJiR2V0UmV2ZXJiTGV2ZWwocENvbnRleHQpOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIFZhbHVlIGlzICVkIiwKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMIFZhbHVlIGlzICVkIiwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKilwVmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERpZmZ1c2lvbihwQ29udGV4dCk7CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9IFJldmVyYkdldERpZmZ1c2lvbihwQ29udGV4dCk7CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ESUZGVVNJT04gVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2dldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ESUZGVVNJT04gVmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSA9IFJldmVyYkdldERlbnNpdHkocENvbnRleHQpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFTlNJVFkgVmFsdWUgaXMgJWQiLAorICAgICAgICAgICAgKihpbnQxNl90KilwVmFsdWUgPSBSZXZlcmJHZXREZW5zaXR5KHBDb250ZXh0KTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVOU0lUWSBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6Ci0gICAgICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gMDsKKyAgICAgICAgICAgICoodWludDE2X3QqKXBWYWx1ZSA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAwOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNjUwLDcgKzE1ODAsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfZ2V0UGFyYW1ldGVyIGVuZCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIgZW5kIik7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0gLyogZW5kIFJldmVyYl9nZXRQYXJhbWV0ZXIgKi8KIApAQCAtMTY3MCwxNiArMTYwMCwxNiBAQAogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1pbnQgUmV2ZXJiX3NldFBhcmFtZXRlciAoUmV2ZXJiQ29udGV4dCAqcENvbnRleHQsIHZvaWQgKnBQYXJhbSwgdm9pZCAqcFZhbHVlLCBpbnQgdnNpemUpeworaW50IFJldmVyYl9zZXRQYXJhbWV0ZXIoUmV2ZXJiQ29udGV4dCogcENvbnRleHQsIHZvaWQqIHBQYXJhbSwgdm9pZCogcFZhbHVlLCBpbnQgdnNpemUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBpbnQxNl90IGxldmVsOwogICAgIGludDE2X3QgcmF0aW87CiAgICAgdWludDMyX3QgdGltZTsKLSAgICB0X3JldmVyYl9zZXR0aW5ncyAqcFByb3BlcnRpZXM7Ci0gICAgaW50MzJfdCAqcFBhcmFtVGVtcCA9IChpbnQzMl90ICopcFBhcmFtOworICAgIHRfcmV2ZXJiX3NldHRpbmdzKiBwUHJvcGVydGllczsKKyAgICBpbnQzMl90KiBwUGFyYW1UZW1wID0gKGludDMyX3QqKXBQYXJhbTsKICAgICBpbnQzMl90IHBhcmFtID0gKnBQYXJhbVRlbXArKzsKIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBzdGFydCIpOworICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgc3RhcnQiKTsKICAgICBpZiAocENvbnRleHQtPnByZXNldCkgewogICAgICAgICBpZiAocGFyYW0gIT0gUkVWRVJCX1BBUkFNX1BSRVNFVCkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjg5LDcgKzE2MTksNyBAQAogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MTZfdCBwcmVzZXQgPSAqKHVpbnQxNl90ICopcFZhbHVlOworICAgICAgICB1aW50MTZfdCBwcmVzZXQgPSAqKHVpbnQxNl90KilwVmFsdWU7CiAgICAgICAgIEFMT0dWKCJzZXQgUkVWRVJCX1BBUkFNX1BSRVNFVCwgcHJlc2V0ICVkIiwgcHJlc2V0KTsKICAgICAgICAgaWYgKHByZXNldCA+IFJFVkVSQl9QUkVTRVRfTEFTVCkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzAzLDEwICsxNjMzLDEwIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHN3aXRjaCAocGFyYW0peworICAgIHN3aXRjaCAocGFyYW0pIHsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKICAgICAgICAgICAgIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUyIpOwotICAgICAgICAgICAgcFByb3BlcnRpZXMgPSAodF9yZXZlcmJfc2V0dGluZ3MgKikgcFZhbHVlOworICAgICAgICAgICAgcFByb3BlcnRpZXMgPSAodF9yZXZlcmJfc2V0dGluZ3MqKXBWYWx1ZTsKICAgICAgICAgICAgIFJldmVyYlNldFJvb21MZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21MZXZlbCk7CiAgICAgICAgICAgICBSZXZlcmJTZXRSb29tSGZMZXZlbChwQ29udGV4dCwgcFByb3BlcnRpZXMtPnJvb21IRkxldmVsKTsKICAgICAgICAgICAgIFJldmVyYlNldERlY2F5VGltZShwQ29udGV4dCwgcFByb3BlcnRpZXMtPmRlY2F5VGltZSk7CkBAIC0xNzE2LDU1ICsxNjQ2LDU1IEBACiAgICAgICAgICAgICBSZXZlcmJTZXREZW5zaXR5KHBDb250ZXh0LCBwUHJvcGVydGllcy0+ZGVuc2l0eSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKLSAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JPT01fTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldFJvb21MZXZlbCIpOworICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldFJvb21MZXZlbCIpOwogICAgICAgICAgICAgUmV2ZXJiU2V0Um9vbUxldmVsKHBDb250ZXh0LCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUxldmVsIik7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMOgotICAgICAgICAgICAgbGV2ZWwgPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKTsKLSAgICAgICAgICAgIFJldmVyYlNldFJvb21IZkxldmVsKHBDb250ZXh0LCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6Ci0gICAgICAgICAgICB0aW1lID0gKih1aW50MzJfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FIHZhbHVlIGlzICVkIiwgdGltZSk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERlY2F5VGltZSIpOwotICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlUaW1lKHBDb250ZXh0LCB0aW1lKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZWNheVRpbWUiKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX0hGX1JBVElPOgotICAgICAgICAgICAgcmF0aW8gPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU8gdmFsdWUgaXMgJWQiLCByYXRpbyk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERlY2F5SGZSYXRpbyIpOwotICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0LCByYXRpbyk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvIik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21MZXZlbCIpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUw6Ci0gICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCAqKXBWYWx1ZTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9SRVZFUkJfTEVWRUwgdmFsdWUgaXMgJWQiLCBsZXZlbCk7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldFJldmVyYkxldmVsIik7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6CisgICAgICAgICAgICBsZXZlbCA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ST09NX0hGX0xFVkVMIHZhbHVlIGlzICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0Um9vbUhmTGV2ZWwiKTsKKyAgICAgICAgICAgIFJldmVyYlNldFJvb21IZkxldmVsKHBDb250ZXh0LCBsZXZlbCk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJvb21IZkxldmVsIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfVElNRToKKyAgICAgICAgICAgIHRpbWUgPSAqKHVpbnQzMl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUUgdmFsdWUgaXMgJWQiLCB0aW1lKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERlY2F5VGltZSIpOworICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlUaW1lKHBDb250ZXh0LCB0aW1lKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsZWQgUmV2ZXJiU2V0RGVjYXlUaW1lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9IRl9SQVRJTyB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERlY2F5SGZSYXRpbyIpOworICAgICAgICAgICAgUmV2ZXJiU2V0RGVjYXlIZlJhdGlvKHBDb250ZXh0LCByYXRpbyk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlY2F5SGZSYXRpbyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgICAgIGxldmVsID0gKihpbnQxNl90KilwVmFsdWU7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTCB2YWx1ZSBpcyAlZCIsIGxldmVsKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldFJldmVyYkxldmVsIik7CiAgICAgICAgICAgICBSZXZlcmJTZXRSZXZlcmJMZXZlbChwQ29udGV4dCwgbGV2ZWwpOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldFJldmVyYkxldmVsIik7Ci0gICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXRSZXZlcmJMZXZlbCIpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKLSAgICAgICAgICAgIHJhdGlvID0gKihpbnQxNl90ICopcFZhbHVlOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgUkVWRVJCX1BBUkFNX0RFQ0FZX0RJRkZVU0lPTiB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGlmZnVzaW9uIik7CisgICAgICAgICAgICByYXRpbyA9ICooaW50MTZfdCopcFZhbHVlOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIFJFVkVSQl9QQVJBTV9ERUNBWV9ESUZGVVNJT04gdmFsdWUgaXMgJWQiLCByYXRpbyk7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGluZyBSZXZlcmJTZXREaWZmdXNpb24iKTsKICAgICAgICAgICAgIFJldmVyYlNldERpZmZ1c2lvbihwQ29udGV4dCwgcmF0aW8pOwotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERpZmZ1c2lvbiIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREaWZmdXNpb24iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERU5TSVRZOgotICAgICAgICAgICAgcmF0aW8gPSAqKGludDE2X3QgKilwVmFsdWU7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfREVOU0lUWSB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxpbmcgUmV2ZXJiU2V0RGVuc2l0eSIpOworICAgICAgICAgICAgcmF0aW8gPSAqKGludDE2X3QqKXBWYWx1ZTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVDQVlfREVOU0lUWSB2YWx1ZSBpcyAlZCIsIHJhdGlvKTsKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIoKSBDYWxsaW5nIFJldmVyYlNldERlbnNpdHkiKTsKICAgICAgICAgICAgIFJldmVyYlNldERlbnNpdHkocENvbnRleHQsIHJhdGlvKTsKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlcigpIENhbGxlZCBSZXZlcmJTZXREZW5zaXR5Iik7CisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfc2V0UGFyYW1ldGVyKCkgQ2FsbGVkIFJldmVyYlNldERlbnNpdHkiKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19MRVZFTDoKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6CiAgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9ERUxBWToKQEAgLTE3NzQsNyArMTcwNCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJcdFJldmVyYl9zZXRQYXJhbWV0ZXIgZW5kIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3NldFBhcmFtZXRlciBlbmQiKTsKICAgICByZXR1cm4gc3RhdHVzOwogfSAvKiBlbmQgUmV2ZXJiX3NldFBhcmFtZXRlciAqLwogCkBAIC0xNzgzLDUyICsxNzEzLDQ2IEBACiAgKi8KIGludCBSZXZlcmJfcGFyYW1WYWx1ZVNpemUoaW50MzJfdCBwYXJhbSkgewogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIFJFVkVSQl9QQVJBTV9ST09NX0xFVkVMOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JPT01fSEZfTEVWRUw6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0xFVkVMOgotICAgICAgICByZXR1cm4gc2l6ZW9mKGludDE2X3QpOyAvLyBtaWxsaWJlbAotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFQ0FZX1RJTUU6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfREVMQVk6Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgotICAgICAgICByZXR1cm4gc2l6ZW9mKHVpbnQzMl90KTsgLy8gbWlsbGlzZWNvbmRzCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86Ci0gICAgY2FzZSBSRVZFUkJfUEFSQU1fRElGRlVTSU9OOgotICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RFTlNJVFk6Ci0gICAgICAgIHJldHVybiBzaXplb2YoaW50MTZfdCk7IC8vIHBlcm1pbGxlCi0gICAgY2FzZSBSRVZFUkJfUEFSQU1fUFJPUEVSVElFUzoKLSAgICAgICAgcmV0dXJuIHNpemVvZihzX3JldmVyYl9zZXR0aW5ncyk7IC8vIHN0cnVjdCBvZiBhbGwgcmV2ZXJiIHByb3BlcnRpZXMKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUk9PTV9IRl9MRVZFTDoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX1JFVkVSQl9MRVZFTDoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoaW50MTZfdCk7ICAvLyBtaWxsaWJlbAorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9ERUNBWV9USU1FOgorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVWRVJCX0RFTEFZOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZih1aW50MzJfdCk7ICAvLyBtaWxsaXNlY29uZHMKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVDQVlfSEZfUkFUSU86CisgICAgICAgIGNhc2UgUkVWRVJCX1BBUkFNX0RJRkZVU0lPTjoKKyAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoaW50MTZfdCk7ICAvLyBwZXJtaWxsZQorICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihzX3JldmVyYl9zZXR0aW5ncyk7ICAvLyBzdHJ1Y3Qgb2YgYWxsIHJldmVyYiBwcm9wZXJ0aWVzCiAgICAgfQogICAgIHJldHVybiBzaXplb2YoaW50MzJfdCk7CiB9CiAKLX0gLy8gbmFtZXNwYWNlCi19IC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBleHRlcm4gIkMiIHsKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogUHJvY2VzcyAqLwotaW50IFJldmVyYl9wcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAgICAgICppbkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90ICAgICAgICAgKm91dEJ1ZmZlcil7Ci0gICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKikgc2VsZjsKLSAgICBpbnQgICAgc3RhdHVzID0gMDsKK2ludCBSZXZlcmJfcHJvY2VzcyhlZmZlY3RfaGFuZGxlX3Qgc2VsZiwgYXVkaW9fYnVmZmVyX3QqIGluQnVmZmVyLCBhdWRpb19idWZmZXJfdCogb3V0QnVmZmVyKSB7CisgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCopc2VsZjsKKyAgICBpbnQgc3RhdHVzID0gMDsKIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfcHJvY2VzcygpIEVSUk9SIHBDb250ZXh0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMICB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwgIHx8Ci0gICAgICAgICAgICBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpeworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fCBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMIHx8CisgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfcHJvY2VzcygpIEVSUk9SIE5VTEwgSU5QVVQgUE9JTlRFUiBPUiBGUkFNRSBDT1VOVCBJUyBXUk9ORyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgLy9BTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX3Byb2Nlc3MoKSBDYWxsaW5nIHByb2Nlc3Mgd2l0aCAlZCBmcmFtZXMiLCBvdXRCdWZmZXItPmZyYW1lQ291bnQpOwogICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgZnJhbWVzLCBibG9jayBwcm9jZXNzaW5nIGlzIGhhbmRsZWQgaW50ZXJuYWxMWSBieSB0aGUgTFZNIGJ1bmRsZSAqLwotICAgIHN0YXR1cyA9IHByb2Nlc3MoICAgIGluQnVmZmVyLT5mMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKKyAgICBzdGF0dXMgPSBwcm9jZXNzKGluQnVmZmVyLT5mMzIsIG91dEJ1ZmZlci0+ZjMyLCBvdXRCdWZmZXItPmZyYW1lQ291bnQsIHBDb250ZXh0KTsKIAogICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIGlmIChwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgewpAQCAtMTg0MCw3MiArMTc2NCw2NyBAQAogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7Ci19ICAgLyogZW5kIFJldmVyYl9wcm9jZXNzICovCit9IC8qIGVuZCBSZXZlcmJfcHJvY2VzcyAqLwogCiAvKiBFZmZlY3QgQ29udHJvbCBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb246IENvbW1hbmQgKi8KLWludCBSZXZlcmJfY29tbWFuZChlZmZlY3RfaGFuZGxlX3QgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBSZXBseURhdGEpewotICAgIGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKiBwQ29udGV4dCA9IChhbmRyb2lkOjpSZXZlcmJDb250ZXh0ICopIHNlbGY7Ci0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICBBY3RpdmVQYXJhbXM7ICAgICAgICAgICAgICAvKiBDdXJyZW50IGNvbnRyb2wgUGFyYW1ldGVycyAqLwotICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzPUxWUkVWX1NVQ0NFU1M7ICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworaW50IFJldmVyYl9jb21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkKiBwQ21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcmVwbHlTaXplLCB2b2lkKiBwUmVwbHlEYXRhKSB7CisgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCopc2VsZjsKKyAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0IEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgLyogQ3VycmVudCBjb250cm9sIFBhcmFtZXRlcnMgKi8KKyAgICBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBFUlJPUiBwQ29udGV4dCA9PSBOVUxMIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgSU5QVVRTIGFyZTogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBJTlBVVFMgYXJlOiBjb21tYW5kICVkIGNtZFNpemUgJWQiLGNtZENvZGUsIGNtZFNpemUpOwogCi0gICAgc3dpdGNoIChjbWRDb2RlKXsKKyAgICBzd2l0Y2ggKGNtZENvZGUpIHsKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0lOSVQ6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfSU5JVCBzdGFydCIpOwogCi0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9JTklUOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0lOSVQ6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHOgotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUcgc3RhcnQiKTsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKikgcFJlcGx5RGF0YSA9IGFuZHJvaWQ6OlJldmVyYl9zZXRDb25maWcocENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2NvbmZpZ190ICopIHBDbWREYXRhKTsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gYW5kcm9pZDo6UmV2ZXJiX3NldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9DT05GSUc6CiAgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJRzogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYW5kcm9pZDo6UmV2ZXJiX2dldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCAqKXBSZXBseURhdGEpOworICAgICAgICAgICAgYW5kcm9pZDo6UmV2ZXJiX2dldENvbmZpZyhwQ29udGV4dCwgKGVmZmVjdF9jb25maWdfdCopcFJlcGx5RGF0YSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfUkVTRVQ6Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfUkVTRVQgc3RhcnQiKTsKICAgICAgICAgICAgIFJldmVyYl9zZXRDb25maWcocENvbnRleHQsICZwQ29udGV4dC0+Y29uZmlnKTsKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06ewotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9QQVJBTTogeworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QqIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBDbWREYXRhOwogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiXHRMVk1fRVJST1IgOiBwQ21kRGF0YSBpcyBOVUxMIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTE0LDE2MyArMTgzMywxNTYgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzQ3NTA5Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKKyAgICAgICAgICAgIGlmIChjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fCBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwKKyAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCBwQ21kRGF0YSwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKTsKIAotICAgICAgICAgICAgcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBSZXBseURhdGE7CisgICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90KilwUmVwbHlEYXRhOwogCiAgICAgICAgICAgICBpbnQgdm9mZnNldCA9ICgocC0+cHNpemUgLSAxKSAvIHNpemVvZihpbnQzMl90KSArIDEpICogc2l6ZW9mKGludDMyX3QpOwogCi0gICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpSZXZlcmJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT52c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CisgICAgICAgICAgICBwLT5zdGF0dXMgPSBhbmRyb2lkOjpSZXZlcmJfZ2V0UGFyYW1ldGVyKHBDb250ZXh0LCAodm9pZCopcC0+ZGF0YSwgJnAtPnZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgdm9mZnNldCk7CiAKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogCi0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIEVGRkVDVF9DTURfR0VUX1BBUkFNICIKICAgICAgICAgICAgIC8vICAgICAgICAiKnBDbWREYXRhICVkLCAqcmVwbHlTaXplICVkLCAqcFJlcGx5RGF0YSAlZCAiLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MzJfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSksCiAgICAgICAgICAgICAvLyAgICAgICAgKnJlcGx5U2l6ZSwKICAgICAgICAgICAgIC8vICAgICAgICAqKGludDE2X3QgKikoKGNoYXIgKilwUmVwbHlEYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHZvZmZzZXQpKTsKIAogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOnsKLQotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9QQVJBTTogeworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNIHN0YXJ0Iik7Ci0gICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIEVGRkVDVF9DTURfU0VUX1BBUkFNIHBhcmFtICVkLCAqcmVwbHlTaXplICVkLCB2YWx1ZSAlZCAiLAorICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfUEFSQU0gcGFyYW0gJWQsICpyZXBseVNpemUgJWQsIHZhbHVlICVkICIsCiAgICAgICAgICAgICAvLyAgICAgICAgKihpbnQzMl90ICopKChjaGFyICopcENtZERhdGEgKyBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSwKICAgICAgICAgICAgIC8vICAgICAgICAqcmVwbHlTaXplLAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKSgoY2hhciAqKXBDbWREYXRhICsgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihpbnQzMl90KSkpOwogCiAgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCAoY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKGludDMyX3QpKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8ICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgeworICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKikgcENtZERhdGE7CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAKLSAgICAgICAgICAgIGlmIChwLT5wc2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJcdDRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SLCBwc2l6ZSBpcyBub3Qgc2l6ZW9mKGludDMyX3QpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0bjVSZXZlcmJfY29tbWFuZCBjbWRTaXplIGlzICVkXG4iCisgICAgICAgICAgICAvLyBBTE9HVigiXHRuNVJldmVyYl9jb21tYW5kIGNtZFNpemUgaXMgJWRcbiIKICAgICAgICAgICAgIC8vICAgICAgICAiXHRzaXplb2YoZWZmZWN0X3BhcmFtX3QpIGlzICAlZFxuIgogICAgICAgICAgICAgLy8gICAgICAgICJcdHAtPnBzaXplIGlzICVkXG4iCiAgICAgICAgICAgICAvLyAgICAgICAgIlx0cC0+dnNpemUgaXMgJWQiCiAgICAgICAgICAgICAvLyAgICAgICAgIlxuIiwKICAgICAgICAgICAgIC8vICAgICAgICBjbWRTaXplLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBwLT5wc2l6ZSwgcC0+dnNpemUgKTsKIAotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gYW5kcm9pZDo6UmV2ZXJiX3NldFBhcmFtZXRlcihwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGEgKyBwLT5wc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+dnNpemUpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBhbmRyb2lkOjpSZXZlcmJfc2V0UGFyYW1ldGVyKHBDb250ZXh0LCAodm9pZCopcC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUsIHAtPnZzaXplKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgotICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKKyAgICAgICAgICAgIC8vIEFMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgogICAgICAgICAgICAgLy8gICAgICAgICJFRkZFQ1RfQ01EX0VOQUJMRSBzdGFydCIpOwogCi0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocENvbnRleHQtPmJFbmFibGVkID09IExWTV9UUlVFKXsKLSAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUi1FZmZlY3QgaXMgYWxyZWFkeSBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPmJFbmFibGVkID09IExWTV9UUlVFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRU5BQkxFOiBFUlJPUi1FZmZlY3QgaXMgYWxyZWFkeSBlbmFibGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgICAgICBwQ29udGV4dC0+YkVuYWJsZWQgPSBMVk1fVFJVRTsKICAgICAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwogICAgICAgICAgICAgTHZtU3RhdHVzID0gTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPmhJbnN0YW5jZSwgJkFjdGl2ZVBhcmFtcyk7CiAgICAgICAgICAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRUZGRUNUX0NNRF9FTkFCTEUiKQogICAgICAgICAgICAgcENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudCA9Ci0gICAgICAgICAgICAgICAgICAgIChBY3RpdmVQYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpLzEwMDA7CisgICAgICAgICAgICAgICAgICAgIChBY3RpdmVQYXJhbXMuVDYwICogcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIC8gMTAwMDsKICAgICAgICAgICAgIC8vIGZvcmNlIG5vIHZvbHVtZSByYW1wIGZvciBmaXJzdCBidWZmZXIgcHJvY2Vzc2VkIGFmdGVyIGVuYWJsaW5nIHRoZSBlZmZlY3QKICAgICAgICAgICAgIHBDb250ZXh0LT52b2x1bWVNb2RlID0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9GTEFUOwotICAgICAgICAgICAgLy9BTE9HVigiXHRFRkZFQ1RfQ01EX0VOQUJMRSBTYW1wbGVzVG9FeGl0Q291bnQgPSAlZCIsIHBDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnQpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0RUZGRUNUX0NNRF9FTkFCTEUgU2FtcGxlc1RvRXhpdENvdW50ID0gJWQiLCBwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEVGRkVDVF9DTURfRElTQUJMRToKLSAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyBBTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFIHN0YXJ0Iik7CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfRElTQUJMRTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHBDb250ZXh0LT5iRW5hYmxlZCA9PSBMVk1fRkFMU0UpewotICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUi1FZmZlY3QgaXMgbm90IHlldCBlbmFibGVkIik7Ci0gICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICBpZiAocENvbnRleHQtPmJFbmFibGVkID09IExWTV9GQUxTRSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgorICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0RJU0FCTEU6IEVSUk9SLUVmZmVjdCBpcyBub3QgeWV0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgIHBDb250ZXh0LT5iRW5hYmxlZCA9IExWTV9GQUxTRTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfVk9MVU1FOgotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICBjbWRTaXplICE9IDIgKiBzaXplb2YodWludDMyX3QpKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IDIgKiBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfVk9MVU1FOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9WT0xVTUU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IE5VTEwpIHsgLy8gd2UgaGF2ZSB2b2x1bWUgY29udHJvbAotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gKExWTV9JTlQxNikoKCoodWludDMyX3QgKilwQ21kRGF0YSArICgxIDw8IDExKSkgPj4gMTIpOwotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSA9IChMVk1fSU5UMTYpKCgqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMSkgKyAoMSA8PCAxMSkpID4+IDEyKTsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9ICgxIDw8IDI0KTsKLSAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxKSA9ICgxIDw8IDI0KTsKKyAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IE5VTEwpIHsgIC8vIHdlIGhhdmUgdm9sdW1lIGNvbnRyb2wKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+bGVmdFZvbHVtZSA9IChMVk1fSU5UMTYpKCgqKHVpbnQzMl90KilwQ21kRGF0YSArICgxIDw8IDExKSkgPj4gMTIpOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSA9IChMVk1fSU5UMTYpKCgqKCh1aW50MzJfdCopcENtZERhdGEgKyAxKSArICgxIDw8IDExKSkgPj4gMTIpOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAoMSA8PCAyNCk7CisgICAgICAgICAgICAgICAgKigodWludDMyX3QqKXBSZXBseURhdGEgKyAxKSA9ICgxIDw8IDI0KTsKICAgICAgICAgICAgICAgICBpZiAocENvbnRleHQtPnZvbHVtZU1vZGUgPT0gYW5kcm9pZDo6UkVWRVJCX1ZPTFVNRV9PRkYpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2Ugbm8gdm9sdW1lIHJhbXAgZm9yIGZpcnN0IGJ1ZmZlciBwcm9jZXNzZWQgYWZ0ZXIgZ2V0dGluZyB2b2x1bWUgY29udHJvbAogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IGFuZHJvaWQ6OlJFVkVSQl9WT0xVTUVfRkxBVDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyB3ZSBkb24ndCBoYXZlIHZvbHVtZSBjb250cm9sCisgICAgICAgICAgICB9IGVsc2UgeyAgLy8gd2UgZG9uJ3QgaGF2ZSB2b2x1bWUgY29udHJvbAogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5sZWZ0Vm9sdW1lID0gUkVWRVJCX1VOSVRfVk9MVU1FOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSA9IFJFVkVSQl9VTklUX1ZPTFVNRTsKICAgICAgICAgICAgICAgICBwQ29udGV4dC0+dm9sdW1lTW9kZSA9IGFuZHJvaWQ6OlJFVkVSQl9WT0xVTUVfT0ZGOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkVGRkVDVF9DTURfU0VUX1ZPTFVNRSBsZWZ0ICVkLCByaWdodCAlZCBtb2RlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUsIHBDb250ZXh0LT5yaWdodFZvbHVtZSwgIHBDb250ZXh0LT52b2x1bWVNb2RlKTsKKyAgICAgICAgICAgIEFMT0dWKCJFRkZFQ1RfQ01EX1NFVF9WT0xVTUUgbGVmdCAlZCwgcmlnaHQgJWQgbW9kZSAlZCIsIHBDb250ZXh0LT5sZWZ0Vm9sdW1lLAorICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lLCBwQ29udGV4dC0+dm9sdW1lTW9kZSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9BVURJT19NT0RFOgotICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9jb21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX0RFVklDRS9FRkZFQ1RfQ01EX1NFVF9WT0xVTUUvRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERSBzdGFydCIpOworICAgICAgICAgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCisgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfU0VUX0RFVklDRS9FRkZFQ1RfQ01EX1NFVF9WT0xVTUUvRUZGRUNUX0NNRF9TRVRfQVVESU9fTU9ERQorICAgICAgICAgICAgLy8gICAgICAgIHN0YXJ0Iik7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICJERUZBVUxUIHN0YXJ0ICVkIEVSUk9SIixjbWRDb2RlKTsKKyAgICAgICAgICAgICAgICAgICJERUZBVUxUIHN0YXJ0ICVkIEVSUk9SIiwKKyAgICAgICAgICAgICAgICAgIGNtZENvZGUpOwogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBlbmRcblxuIik7CisgICAgLy8gQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgZW5kXG5cbiIpOwogICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgUmV2ZXJiX2NvbW1hbmQgKi8KK30gLyogZW5kIFJldmVyYl9jb21tYW5kICovCiAKIC8qIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbjogZ2V0X2Rlc2NyaXB0b3IgKi8KLWludCBSZXZlcmJfZ2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpCi17Ci0gICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OlJldmVyYkNvbnRleHQgKilzZWxmOwotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7CitpbnQgUmV2ZXJiX2dldERlc2NyaXB0b3IoZWZmZWN0X2hhbmRsZV90IHNlbGYsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIHBEZXNjcmlwdG9yKSB7CisgICAgYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCogcENvbnRleHQgPSAoYW5kcm9pZDo6UmV2ZXJiQ29udGV4dCopc2VsZjsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjOwogCiAgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiUmV2ZXJiX2dldERlc2NyaXB0b3IoKSBpbnZhbGlkIHBhcmFtIik7CkBAIC0yMDk0LDI2ICsyMDA2LDI0IEBACiAgICAgKnBEZXNjcmlwdG9yID0gKmRlc2M7CiAKICAgICByZXR1cm4gMDsKLX0gICAvKiBlbmQgUmV2ZXJiX2dldERlc2NyaXB0b3IgKi8KK30gLyogZW5kIFJldmVyYl9nZXREZXNjcmlwdG9yICovCiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFJldmVyYiBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgZ1JldmVyYkludGVyZmFjZSA9IHsKLSAgICBSZXZlcmJfcHJvY2VzcywKLSAgICBSZXZlcmJfY29tbWFuZCwKLSAgICBSZXZlcmJfZ2V0RGVzY3JpcHRvciwKLSAgICBOVUxMLAotfTsgICAgLyogZW5kIGdSZXZlcmJJbnRlcmZhY2UgKi8KKyAgICAgICAgUmV2ZXJiX3Byb2Nlc3MsCisgICAgICAgIFJldmVyYl9jb21tYW5kLAorICAgICAgICBSZXZlcmJfZ2V0RGVzY3JpcHRvciwKKyAgICAgICAgTlVMTCwKK307IC8qIGVuZCBnUmV2ZXJiSW50ZXJmYWNlICovCiAKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKLV9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLWF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7Ci0gICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKLSAgICAudmVyc2lvbiA9IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OLAotICAgIC5uYW1lID0gIlJldmVyYiBMaWJyYXJ5IiwKLSAgICAuaW1wbGVtZW50b3IgPSAiTlhQIFNvZnR3YXJlIEx0ZC4iLAotICAgIC5jcmVhdGVfZWZmZWN0ID0gYW5kcm9pZDo6RWZmZWN0Q3JlYXRlLAotICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCi0gICAgLmdldF9kZXNjcmlwdG9yID0gYW5kcm9pZDo6RWZmZWN0R2V0RGVzY3JpcHRvciwKK19fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0gPSB7CisgICAgICAgIC50YWcgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9UQUcsCisgICAgICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCisgICAgICAgIC5uYW1lID0gIlJldmVyYiBMaWJyYXJ5IiwKKyAgICAgICAgLmltcGxlbWVudG9yID0gIk5YUCBTb2Z0d2FyZSBMdGQuIiwKKyAgICAgICAgLmNyZWF0ZV9lZmZlY3QgPSBhbmRyb2lkOjpFZmZlY3RDcmVhdGUsCisgICAgICAgIC5yZWxlYXNlX2VmZmVjdCA9IGFuZHJvaWQ6OkVmZmVjdFJlbGVhc2UsCisgICAgICAgIC5nZXRfZGVzY3JpcHRvciA9IGFuZHJvaWQ6OkVmZmVjdEdldERlc2NyaXB0b3IsCiB9OwotCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oCmluZGV4IDk2MjIzYTguLjIyN2Q5NTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5oCkBAIC0yMCwxNiArMjAsMTUgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9lbnZpcm9ubWVudGFscmV2ZXJiLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfcHJlc2V0cmV2ZXJiLmg+CiAKLSNkZWZpbmUgTUFYX05VTV9CQU5EUyAgICAgICAgICAgNQotI2RlZmluZSBNQVhfQ0FMTF9TSVpFICAgICAgICAgICAyNTYKLSNkZWZpbmUgTFZSRVZfTUFYX1Q2MCAgICAgICAgICAgNzAwMAotI2RlZmluZSBMVlJFVl9NQVhfUkVWRVJCX0xFVkVMICAyMDAwCi0jZGVmaW5lIExWUkVWX01BWF9GUkFNRV9TSVpFICAgIDI1NjAKLSNkZWZpbmUgTFZSRVZfQ1VQX0xPQURfQVJNOUUgICAgNDcwICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwotI2RlZmluZSBMVlJFVl9NRU1fVVNBR0UgICAgICAgICAoNzErKExWUkVWX01BWF9GUkFNRV9TSVpFPj43KSkgICAgIC8vIEV4cHJlc3NlZCBpbiBrQgorI2RlZmluZSBNQVhfTlVNX0JBTkRTIDUKKyNkZWZpbmUgTUFYX0NBTExfU0laRSAyNTYKKyNkZWZpbmUgTFZSRVZfTUFYX1Q2MCA3MDAwCisjZGVmaW5lIExWUkVWX01BWF9SRVZFUkJfTEVWRUwgMjAwMAorI2RlZmluZSBMVlJFVl9NQVhfRlJBTUVfU0laRSAyNTYwCisjZGVmaW5lIExWUkVWX0NVUF9MT0FEX0FSTTlFIDQ3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKKyNkZWZpbmUgTFZSRVZfTUVNX1VTQUdFICg3MSArIChMVlJFVl9NQVhfRlJBTUVfU0laRSA+PiA3KSkgIC8vIEV4cHJlc3NlZCBpbiBrQgogCi10eXBlZGVmIHN0cnVjdCBfTFBGUGFpcl90Ci17Cit0eXBlZGVmIHN0cnVjdCBfTFBGUGFpcl90IHsKICAgICBpbnQxNl90IFJvb21fSEY7CiAgICAgaW50MTZfdCBMUEY7CiB9IExQRlBhaXJfdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0IGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nLy5jbGFuZy1mb3JtYXQKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZjFiNGY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uLy4uL2J1aWxkL3Nvb25nL3NjcmlwdHMvc3lzdGVtLWNsYW5nLWZvcm1hdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKaW5kZXggYzg3NjM1Zi4uYzZlMDM2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTEsMzUgKzEsNjAgQEAKIC8vIGF1ZGlvIHByZXByb2Nlc3Npbmcgd3JhcHBlcgotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfcHJlcHJvY2Vzc2luZ19saWNlbnNlIiwKKyAgICBdLAorfQogCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3ByZXByb2Nlc3NpbmdfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb3ByZXByb2Nlc3NpbmctZGVmYXVsdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKLQotICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAotCi0gICAgc3JjczogWyJQcmVQcm9jZXNzaW5nLmNwcCJdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2F1ZGlvX3Byb2Nlc3NpbmcvaW5jbHVkZSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKLSAgICAgICAgImxpYnNwZWV4cmVzYW1wbGVyIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAotICAgIGNmbGFnczogWwotICAgICAgICAiLURXRUJSVENfUE9TSVgiLAotICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAid2VicnRjX2F1ZGlvX3Byb2Nlc3NpbmciLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAogICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcmVwcm9jZXNzaW5nLWRlZmF1bHRzIl0sCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisgICAgc3JjczogWyJQcmVQcm9jZXNzaW5nLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJ3ZWJydGNfYWJzbF9oZWFkZXJzIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCmluZGV4IDVmYWI1YmUuLjE5YThiMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKQEAgLTE4LDE1ICsxOCwxNSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2RlZmluZSBMT0dfVEFHICJQcmVQcm9jZXNzaW5nIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FnYy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X2FnYzIuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgotI2luY2x1ZGUgPG1vZHVsZV9jb21tb25fdHlwZXMuaD4KICNpbmNsdWRlIDxhdWRpb19wcm9jZXNzaW5nLmg+Ci0jaW5jbHVkZSAic3BlZXgvc3BlZXhfcmVzYW1wbGVyLmgiCisjaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgogCiAvLyB1bmRlZmluZSB0byBwZXJmb3JtIG11bHRpIGNoYW5uZWxzIEFQSSBmdW5jdGlvbmFsIHRlc3RzCiAvLyNkZWZpbmUgRFVBTF9NSUNfVEVTVApAQCAtMzksMjYgKzM5LDI2IEBACiAjZGVmaW5lIFBSRVBST0NfTlVNX1NFU1NJT05TIDgKIAogLy8gdHlwZXMgb2YgcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotZW51bSBwcmVwcm9jX2lkCi17Ci0gICAgUFJFUFJPQ19BR0MsICAgICAgICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCi0gICAgUFJFUFJPQ19BRUMsICAgICAgICAvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyCi0gICAgUFJFUFJPQ19OUywgICAgICAgICAvLyBOb2lzZSBTdXBwcmVzc29yCitlbnVtIHByZXByb2NfaWQgeworICAgIFBSRVBST0NfQUdDLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbAorICAgIFBSRVBST0NfQUdDMiwgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorICAgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICAgIFBSRVBST0NfTlMsICAgLy8gTm9pc2UgU3VwcHJlc3NvcgogICAgIFBSRVBST0NfTlVNX0VGRkVDVFMKIH07CiAKIC8vIFNlc3Npb24gc3RhdGUKIGVudW0gcHJlcHJvY19zZXNzaW9uX3N0YXRlIHsKLSAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfSU5JVCwgICAgICAgIC8vIGluaXRpYWxpemVkCi0gICAgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0NPTkZJRyAgICAgICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkCisgICAgUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0lOSVQsICAgLy8gaW5pdGlhbGl6ZWQKKyAgICBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkCiB9OwogCiAvLyBFZmZlY3QvUHJlcHJvY2Vzc29yIHN0YXRlCiBlbnVtIHByZXByb2NfZWZmZWN0X3N0YXRlIHsKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklULCAgICAgICAgIC8vIGluaXRpYWxpemVkCi0gICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRCwgICAgICAvLyB3ZWJSVEMgZW5naW5lIGNyZWF0ZWQKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUcsICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gcmVjZWl2ZWQvZGlzYWJsZWQKLSAgICBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUgICAgICAgIC8vIGFjdGl2ZS9lbmFibGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVCwgICAgIC8vIGluaXRpYWxpemVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRCwgIC8vIHdlYlJUQyBlbmdpbmUgY3JlYXRlZAorICAgIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRywgICAvLyBjb25maWd1cmF0aW9uIHJlY2VpdmVkL2Rpc2FibGVkCisgICAgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFICAgIC8vIGFjdGl2ZS9lbmFibGVkCiB9OwogCiAvLyBoYW5kbGUgb24gd2ViUlRDIGVuZ2luZQpAQCAtNzEsNzQgKzcxLDY2IEBACiAvLyBFZmZlY3Qgb3BlcmF0aW9uIHRhYmxlLiBGdW5jdGlvbnMgZm9yIGFsbCBwcmUgcHJvY2Vzc29ycyBhcmUgZGVjbGFyZWQgaW4gc1ByZVByb2NPcHNbXSB0YWJsZS4KIC8vIEZ1bmN0aW9uIHBvaW50ZXIgY2FuIGJlIG51bGwgaWYgbm8gYWN0aW9uIHJlcXVpcmVkLgogc3RydWN0IHByZXByb2Nfb3BzX3MgewotICAgIGludCAoKiBjcmVhdGUpKHByZXByb2NfZWZmZWN0X3QgKmZ4KTsKLSAgICBpbnQgKCogaW5pdCkocHJlcHJvY19lZmZlY3RfdCAqZngpOwotICAgIGludCAoKiByZXNldCkocHJlcHJvY19lZmZlY3RfdCAqZngpOwotICAgIHZvaWQgKCogZW5hYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgdm9pZCAoKiBkaXNhYmxlKShwcmVwcm9jX2VmZmVjdF90ICpmeCk7Ci0gICAgaW50ICgqIHNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB2b2lkICpwYXJhbSwgdm9pZCAqdmFsdWUpOwotICAgIGludCAoKiBnZXRfcGFyYW1ldGVyKShwcmVwcm9jX2VmZmVjdF90ICpmeCwgdm9pZCAqcGFyYW0sIHVpbnQzMl90ICpzaXplLCB2b2lkICp2YWx1ZSk7Ci0gICAgaW50ICgqIHNldF9kZXZpY2UpKHByZXByb2NfZWZmZWN0X3QgKmZ4LCB1aW50MzJfdCBkZXZpY2UpOworICAgIGludCAoKmNyZWF0ZSkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIGludCAoKmluaXQpKHByZXByb2NfZWZmZWN0X3QqIGZ4KTsKKyAgICBpbnQgKCpyZXNldCkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIHZvaWQgKCplbmFibGUpKHByZXByb2NfZWZmZWN0X3QqIGZ4KTsKKyAgICB2b2lkICgqZGlzYWJsZSkocHJlcHJvY19lZmZlY3RfdCogZngpOworICAgIGludCAoKnNldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QqIGZ4LCB2b2lkKiBwYXJhbSwgdm9pZCogdmFsdWUpOworICAgIGludCAoKmdldF9wYXJhbWV0ZXIpKHByZXByb2NfZWZmZWN0X3QqIGZ4LCB2b2lkKiBwYXJhbSwgdWludDMyX3QqIHNpemUsIHZvaWQqIHZhbHVlKTsKKyAgICBpbnQgKCpzZXRfZGV2aWNlKShwcmVwcm9jX2VmZmVjdF90KiBmeCwgdWludDMyX3QgZGV2aWNlKTsKIH07CiAKIC8vIEVmZmVjdCBjb250ZXh0CiBzdHJ1Y3QgcHJlcHJvY19lZmZlY3RfcyB7Ci0gICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqaXRmZTsKLSAgICB1aW50MzJfdCBwcm9jSWQ7ICAgICAgICAgICAgICAgIC8vIHR5cGUgb2YgcHJlIHByb2Nlc3NvciAoZW51bSBwcmVwcm9jX2lkKQotICAgIHVpbnQzMl90IHN0YXRlOyAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX2VmZmVjdF9zdGF0ZSkKLSAgICBwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbjsgICAgIC8vIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgotICAgIGNvbnN0IHByZXByb2Nfb3BzX3QgKm9wczsgICAgICAgLy8gZWZmZWN0IG9wcyB0YWJsZQotICAgIHByZXByb2NfZnhfaGFuZGxlX3QgZW5naW5lOyAgICAgLy8gaGFuZGxlIG9uIHdlYlJUQyBlbmdpbmUKLSAgICB1aW50MzJfdCB0eXBlOyAgICAgICAgICAgICAgICAgIC8vIHN1YnR5cGUgb2YgZWZmZWN0CisgICAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyogaXRmZTsKKyAgICB1aW50MzJfdCBwcm9jSWQ7ICAgICAgICAgICAgIC8vIHR5cGUgb2YgcHJlIHByb2Nlc3NvciAoZW51bSBwcmVwcm9jX2lkKQorICAgIHVpbnQzMl90IHN0YXRlOyAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX2VmZmVjdF9zdGF0ZSkKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbjsgIC8vIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGNvbnN0IHByZXByb2Nfb3BzX3QqIG9wczsgICAgLy8gZWZmZWN0IG9wcyB0YWJsZQorICAgIHByZXByb2NfZnhfaGFuZGxlX3QgZW5naW5lOyAgLy8gaGFuZGxlIG9uIHdlYlJUQyBlbmdpbmUKKyAgICB1aW50MzJfdCB0eXBlOyAgICAgICAgICAgICAgIC8vIHN1YnR5cGUgb2YgZWZmZWN0CiAjaWZkZWYgRFVBTF9NSUNfVEVTVAotICAgIGJvb2wgYXV4X2NoYW5uZWxzX29uOyAgICAgICAgICAgLy8gc3VwcG9ydCBhdXhpbGlhcnkgY2hhbm5lbHMKLSAgICBzaXplX3QgY3VyX2NoYW5uZWxfY29uZmlnOyAgICAgIC8vIGN1cnJlbnQgYXVjaWxpYXJ5IGNoYW5uZWwgY29uZmlndXJhdGlvbgorICAgIGJvb2wgYXV4X2NoYW5uZWxzX29uOyAgICAgICAvLyBzdXBwb3J0IGF1eGlsaWFyeSBjaGFubmVscworICAgIHNpemVfdCBjdXJfY2hhbm5lbF9jb25maWc7ICAvLyBjdXJyZW50IGF1Y2lsaWFyeSBjaGFubmVsIGNvbmZpZ3VyYXRpb24KICNlbmRpZgogfTsKIAogLy8gU2Vzc2lvbiBjb250ZXh0CiBzdHJ1Y3QgcHJlcHJvY19zZXNzaW9uX3MgewotICAgIHN0cnVjdCBwcmVwcm9jX2VmZmVjdF9zIGVmZmVjdHNbUFJFUFJPQ19OVU1fRUZGRUNUU107IC8vIGVmZmVjdHMgaW4gdGhpcyBzZXNzaW9uCi0gICAgdWludDMyX3Qgc3RhdGU7ICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUpCi0gICAgaW50IGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgIGludCBpbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBvZiBpbnB1dCBzdHJlYW0gdGhpcyBzZXNzaW9uIGlzIG9uCi0gICAgd2VicnRjOjpBdWRpb1Byb2Nlc3NpbmcqIGFwbTsgICAgICAgLy8gaGFuZGxlIG9uIHdlYlJUQyBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZSAoQVBNKQotICAgIHNpemVfdCBhcG1GcmFtZUNvdW50OyAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzaXplIGZvciB3ZWJSVEMgcHJvY2VzcyAoMTAgbXMpCi0gICAgdWludDMyX3QgYXBtU2FtcGxpbmdSYXRlOyAgICAgICAgICAgLy8gd2ViUlRDIEFQTSBzYW1wbGluZyByYXRlICg4LzE2IG9yIDMyIGtIeikKLSAgICBzaXplX3QgZnJhbWVDb3VudDsgICAgICAgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBiZWZvcmUgaW5wdXQgcmVzYW1wbGVyICggPD0+IGFwbUZyYW1lQ291bnQpCi0gICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOyAgICAgICAgICAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhdCBlZmZlY3QgcHJvY2VzcyBpbnRlcmZhY2UKLSAgICB1aW50MzJfdCBpbkNoYW5uZWxDb3VudDsgICAgICAgICAgICAvLyBpbnB1dCBjaGFubmVsIGNvdW50Ci0gICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50OyAgICAgICAgICAgLy8gb3V0cHV0IGNoYW5uZWwgY291bnQKLSAgICB1aW50MzJfdCBjcmVhdGVkTXNrOyAgICAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgY3Jlc3RlZCBwcmUgcHJvY2Vzc29ycwotICAgIHVpbnQzMl90IGVuYWJsZWRNc2s7ICAgICAgICAgICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCi0gICAgdWludDMyX3QgcHJvY2Vzc2VkTXNrOyAgICAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAotICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcHJvY0ZyYW1lOyAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIFByb2Nlc3NTdHJlYW0oKQotICAgIGludDE2X3QgKmluQnVmOyAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciB1c2VkIHdoZW4gcmVzYW1wbGluZwotICAgIHNpemVfdCBpbkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplIGluIGZyYW1lcwotICAgIHNpemVfdCBmcmFtZXNJbjsgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgaW4gaW5wdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqaW5SZXNhbXBsZXI7ICAgLy8gaGFuZGxlIG9uIGlucHV0IHNwZWV4IHJlc2FtcGxlcgotICAgIGludDE2X3QgKm91dEJ1ZjsgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgdXNlZCB3aGVuIHJlc2FtcGxpbmcKLSAgICBzaXplX3Qgb3V0QnVmU2l6ZTsgICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUgaW4gZnJhbWVzCi0gICAgc2l6ZV90IGZyYW1lc091dDsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBvdXRwdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqb3V0UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIG91dHB1dCBzcGVleCByZXNhbXBsZXIKLSAgICB1aW50MzJfdCByZXZDaGFubmVsQ291bnQ7ICAgICAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMgb24gcmV2ZXJzZSBzdHJlYW0KLSAgICB1aW50MzJfdCByZXZFbmFibGVkTXNrOyAgICAgICAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgZW5hYmxlZCBwcmUgcHJvY2Vzc29ycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGggcmV2ZXJzZSBjaGFubmVsCi0gICAgdWludDMyX3QgcmV2UHJvY2Vzc2VkTXNrOyAgICAgICAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIHdpdGggcmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwgYWxyZWFkeSBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAotICAgIHdlYnJ0Yzo6QXVkaW9GcmFtZSAqcmV2RnJhbWU7ICAgICAgIC8vIGF1ZGlvIGZyYW1lIHBhc3NlZCB0byB3ZWJSVEMgQU1QIEFuYWx5emVSZXZlcnNlU3RyZWFtKCkKLSAgICBpbnQxNl90ICpyZXZCdWY7ICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCi0gICAgc2l6ZV90IHJldkJ1ZlNpemU7ICAgICAgICAgICAgICAgICAgLy8gcmV2ZXJzZSBjaGFubmVsIGlucHV0IGJ1ZmZlciBzaXplCi0gICAgc2l6ZV90IGZyYW1lc1JldjsgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiByZXZlcnNlIGNoYW5uZWwgaW5wdXQgYnVmZmVyCi0gICAgU3BlZXhSZXNhbXBsZXJTdGF0ZSAqcmV2UmVzYW1wbGVyOyAgLy8gaGFuZGxlIG9uIHJldmVyc2UgY2hhbm5lbCBpbnB1dCBzcGVleCByZXNhbXBsZXIKKyAgICBzdHJ1Y3QgcHJlcHJvY19lZmZlY3RfcyBlZmZlY3RzW1BSRVBST0NfTlVNX0VGRkVDVFNdOyAgLy8gZWZmZWN0cyBpbiB0aGlzIHNlc3Npb24KKyAgICB1aW50MzJfdCBzdGF0ZTsgICAgICAgICAgICAgICAgLy8gY3VycmVudCBzdGF0ZSAoZW51bSBwcmVwcm9jX3Nlc3Npb25fc3RhdGUpCisgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICBpbnQgaW87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG9mIGlucHV0IHN0cmVhbSB0aGlzIHNlc3Npb24gaXMgb24KKyAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZyogYXBtOyAgLy8gaGFuZGxlIG9uIHdlYlJUQyBhdWRpbyBwcm9jZXNzaW5nIG1vZHVsZSAoQVBNKQorICAgIC8vIEF1ZGlvIFByb2Nlc3NpbmcgbW9kdWxlIGJ1aWxkZXIKKyAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZ0J1aWxkZXIgYXBfYnVpbGRlcjsKKyAgICAvLyBmcmFtZUNvdW50IHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMgdXNlZCBmb3IgcHJvY2Vzc2luZywgYW5kIG11c3QgcmVwcmVzZW50IDEwbXMuCisgICAgc2l6ZV90IGZyYW1lQ291bnQ7CisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlOyAgICAgLy8gc2FtcGxpbmcgcmF0ZSBhdCBlZmZlY3QgcHJvY2VzcyBpbnRlcmZhY2UKKyAgICB1aW50MzJfdCBpbkNoYW5uZWxDb3VudDsgICAvLyBpbnB1dCBjaGFubmVsIGNvdW50CisgICAgdWludDMyX3Qgb3V0Q2hhbm5lbENvdW50OyAgLy8gb3V0cHV0IGNoYW5uZWwgY291bnQKKyAgICB1aW50MzJfdCBjcmVhdGVkTXNrOyAgICAgICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgY3Jlc3RlZCBwcmUgcHJvY2Vzc29ycworICAgIHVpbnQzMl90IGVuYWJsZWRNc2s7ICAgICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCisgICAgdWludDMyX3QgcHJvY2Vzc2VkTXNrOyAgICAgLy8gYml0IGZpZWxkIGNvbnRhaW5pbmcgSURzIG9mIHByZSBwcm9jZXNzb3JzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3VuZAorICAgIC8vIGF1ZGlvIGNvbmZpZyBzdHJ1Y3V0cmUKKyAgICB3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnIGNvbmZpZzsKKyAgICB3ZWJydGM6OlN0cmVhbUNvbmZpZyBpbnB1dENvbmZpZzsgICAvLyBpbnB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIHdlYnJ0Yzo6U3RyZWFtQ29uZmlnIG91dHB1dENvbmZpZzsgIC8vIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIHVpbnQzMl90IHJldkNoYW5uZWxDb3VudDsgIC8vIG51bWJlciBvZiBjaGFubmVscyBvbiByZXZlcnNlIHN0cmVhbQorICAgIHVpbnQzMl90IHJldkVuYWJsZWRNc2s7ICAgIC8vIGJpdCBmaWVsZCBjb250YWluaW5nIElEcyBvZiBlbmFibGVkIHByZSBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCByZXZlcnNlIGNoYW5uZWwKKyAgICB1aW50MzJfdCByZXZQcm9jZXNzZWRNc2s7ICAvLyBiaXQgZmllbGQgY29udGFpbmluZyBJRHMgb2YgcHJlIHByb2Nlc3NvcnMgd2l0aCByZXZlcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbm5lbCBhbHJlYWR5IHByb2Nlc3NlZCBpbiBjdXJyZW50IHJvdW5kCisgICAgd2VicnRjOjpTdHJlYW1Db25maWcgcmV2Q29uZmlnOyAgICAgLy8gcmV2ZXJzZSBzdHJlYW0gY29uZmlndXJhdGlvbi4KIH07CiAKICNpZmRlZiBEVUFMX01JQ19URVNUCiBlbnVtIHsKLSAgICBQUkVQUk9DX0NNRF9EVUFMX01JQ19FTkFCTEUgPSBFRkZFQ1RfQ01EX0ZJUlNUX1BST1BSSUVUQVJZLCAvLyBlbmFibGUgZHVhbCBtaWMgbW9kZQotICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJULCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHBjbSBjYXB0dXJlCi0gICAgUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBwY20gY2FwdHVyZQorICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRSA9IEVGRkVDVF9DTURfRklSU1RfUFJPUFJJRVRBUlksICAvLyBlbmFibGUgZHVhbCBtaWMgbW9kZQorICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJULCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBwY20gY2FwdHVyZQorICAgIFBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHBjbSBjYXB0dXJlCiB9OwogCiBlbnVtIHsKQEAgLTE1MSwyNCArMTQzLDIyIEBACiB9OwogCiBjb25zdCBjaGFubmVsX2NvbmZpZ190IHNEdWFsTWljQ29uZmlnc1tDSEFOTkVMX0NGR19DTlRdID0gewotICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9NT05PICwgMH0sCi0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX1NURVJFTyAsIDB9LAotICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9GUk9OVCAsIEFVRElPX0NIQU5ORUxfSU5fQkFDS30sCi0gICAgICAgIHtBVURJT19DSEFOTkVMX0lOX1NURVJFTyAsIEFVRElPX0NIQU5ORUxfSU5fUklHSFR9Ci19OworICAgICAgICB7QVVESU9fQ0hBTk5FTF9JTl9NT05PLCAwfSwKKyAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCAwfSwKKyAgICAgICAge0FVRElPX0NIQU5ORUxfSU5fRlJPTlQsIEFVRElPX0NIQU5ORUxfSU5fQkFDS30sCisgICAgICAgIHtBVURJT19DSEFOTkVMX0lOX1NURVJFTywgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVH19OwogCiBib29sIHNIYXNBdXhDaGFubmVsc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKLSAgICAgICAgZmFsc2UsICAgLy8gUFJFUFJPQ19BR0MKKyAgICAgICAgZmFsc2UsICAvLyBQUkVQUk9DX0FHQwogICAgICAgICB0cnVlLCAgIC8vIFBSRVBST0NfQUVDCiAgICAgICAgIHRydWUsICAgLy8gUFJFUFJPQ19OUwogfTsKIAogYm9vbCBnRHVhbE1pY0VuYWJsZWQ7Ci1GSUxFICpnUGNtRHVtcEZoOworRklMRSogZ1BjbUR1bXBGaDsKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ1BjbUR1bXBMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICNlbmRpZgogCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFZmZlY3QgZGVzY3JpcHRvcnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzgsNjggKzE2OCw2OSBAQAogCiAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzQWdjRGVzY3JpcHRvciA9IHsKLSAgICAgICAgeyAweDBhOGFiZmUwLCAweDY1NGMsIDB4MTFlMCwgMHhiYTI2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB0eXBlCi0gICAgICAgIHsgMHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdXVpZAorICAgICAgICB7MHgwYThhYmZlMCwgMHg2NTRjLCAweDExZTAsIDB4YmEyNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHR5cGUKKyAgICAgICAgezB4YWE4MTMwZTAsIDB4NjZmYywgMHgxMWUwLCAweGJhZDAsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB1dWlkCiAgICAgICAgIEVGRkVDVF9DT05UUk9MX0FQSV9WRVJTSU9OLAotICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQ3xFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKLSAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQorICAgICAgICAoRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQyB8IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIG1lbW9yeSB1c2FnZQogICAgICAgICAiQXV0b21hdGljIEdhaW4gQ29udHJvbCIsCi0gICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgotfTsKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QifTsKKworLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAyCitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzQWdjMkRlc2NyaXB0b3IgPSB7CisgICAgICAgIHsweGFlM2M2NTNiLCAweGJlMTgsIDB4NGFiOCwgMHg4OTM4LCB7MHg0MSwgMHg4ZiwgMHgwYSwgMHg3ZiwgMHgwNiwgMHhhY319LCAgLy8gdHlwZQorICAgICAgICB7MHg4OWYzOGU2NSwgMHhkNGQyLCAweDRkNjQsIDB4YWQwZSwgezB4MmIsIDB4M2UsIDB4NzksIDB4OWUsIDB4YTgsIDB4ODZ9fSwgIC8vIHV1aWQKKyAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCisgICAgICAgICJBdXRvbWF0aWMgR2FpbiBDb250cm9sIDIiLAorICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCJ9OwogCiAvLyBBY291c3RpYyBFY2hvIENhbmNlbGxhdGlvbgogc3RhdGljIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0FlY0Rlc2NyaXB0b3IgPSB7Ci0gICAgICAgIHsgMHg3YjQ5MTQ2MCwgMHg4ZDRkLCAweDExZTAsIDB4YmQ2MSwgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH0gfSwgLy8gdHlwZQotICAgICAgICB7IDB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHV1aWQKKyAgICAgICAgezB4N2I0OTE0NjAsIDB4OGQ0ZCwgMHgxMWUwLCAweGJkNjEsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyB0eXBlCisgICAgICAgIHsweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdXVpZAogICAgICAgICBFRkZFQ1RfQ09OVFJPTF9BUElfVkVSU0lPTiwKLSAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0N8RUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgQ1BVIGxvYWQKLSAgICAgICAgMCwgLy9GSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKKyAgICAgICAgKEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfCBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EKSwKKyAgICAgICAgMCwgIC8vIEZJWE1FIGluZGljYXRlIENQVSBsb2FkCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBtZW1vcnkgdXNhZ2UKICAgICAgICAgIkFjb3VzdGljIEVjaG8gQ2FuY2VsZXIiLAotICAgICAgICAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIKLX07CisgICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0In07CiAKIC8vIE5vaXNlIHN1cHByZXNzaW9uCiBzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBzTnNEZXNjcmlwdG9yID0gewotICAgICAgICB7IDB4NThiNGIyNjAsIDB4OGUwNiwgMHgxMWUwLCAweGFhOGUsIHsgMHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYiB9IH0sIC8vIHR5cGUKLSAgICAgICAgeyAweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9LCAvLyB1dWlkCisgICAgICAgIHsweDU4YjRiMjYwLCAweDhlMDYsIDB4MTFlMCwgMHhhYThlLCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gdHlwZQorICAgICAgICB7MHhjMDZjODQwMCwgMHg4ZTA2LCAweDExZTAsIDB4OWNiNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIHV1aWQKICAgICAgICAgRUZGRUNUX0NPTlRST0xfQVBJX1ZFUlNJT04sCi0gICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DfEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpLAotICAgICAgICAwLCAvL0ZJWE1FIGluZGljYXRlIENQVSBsb2FkCi0gICAgICAgIDAsIC8vRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCisgICAgICAgIChFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHwgRUZGRUNUX0ZMQUdfREVWSUNFX0lORCksCisgICAgICAgIDAsICAvLyBGSVhNRSBpbmRpY2F0ZSBDUFUgbG9hZAorICAgICAgICAwLCAgLy8gRklYTUUgaW5kaWNhdGUgbWVtb3J5IHVzYWdlCiAgICAgICAgICJOb2lzZSBTdXBwcmVzc2lvbiIsCi0gICAgICAgICJUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IgotfTsKKyAgICAgICAgIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QifTsKIAotCi1zdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc0Rlc2NyaXB0b3JzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0gewotICAgICAgICAmc0FnY0Rlc2NyaXB0b3IsCi0gICAgICAgICZzQWVjRGVzY3JpcHRvciwKLSAgICAgICAgJnNOc0Rlc2NyaXB0b3IKLX07CitzdGF0aWMgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogc0Rlc2NyaXB0b3JzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0geyZzQWdjRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNBZ2MyRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNBZWNEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc05zRGVzY3JpcHRvcn07CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBIZWxwZXIgZnVuY3Rpb25zCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1jb25zdCBlZmZlY3RfdXVpZF90ICogY29uc3Qgc1V1aWRUb1ByZVByb2NUYWJsZVtQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKLSAgICAgICAgRlhfSUlEX0FHQywKLSAgICAgICAgRlhfSUlEX0FFQywKLSAgICAgICAgRlhfSUlEX05TCi19OworY29uc3QgZWZmZWN0X3V1aWRfdCogY29uc3Qgc1V1aWRUb1ByZVByb2NUYWJsZVtQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHtGWF9JSURfQUdDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9JSURfQUdDMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSUlEX0FFQywgRlhfSUlEX05TfTsKIAotCi1jb25zdCBlZmZlY3RfdXVpZF90ICogUHJvY0lkVG9VdWlkKGludCBwcm9jSWQpCi17Citjb25zdCBlZmZlY3RfdXVpZF90KiBQcm9jSWRUb1V1aWQoaW50IHByb2NJZCkgewogICAgIGlmIChwcm9jSWQgPj0gUFJFUFJPQ19OVU1fRUZGRUNUUykgewogICAgICAgICByZXR1cm4gRUZGRUNUX1VVSURfTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIHNVdWlkVG9QcmVQcm9jVGFibGVbcHJvY0lkXTsKIH0KIAotdWludDMyX3QgVXVpZFRvUHJvY0lkKGNvbnN0IGVmZmVjdF91dWlkX3QgKiB1dWlkKQotewordWludDMyX3QgVXVpZFRvUHJvY0lkKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKICAgICBzaXplX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CiAgICAgICAgIGlmIChtZW1jbXAodXVpZCwgc1V1aWRUb1ByZVByb2NUYWJsZVtpXSwgc2l6ZW9mKCp1dWlkKSkgPT0gMCkgewpAQCAtMjQ5LDE1ICsyNDAsMTMgQEAKICAgICByZXR1cm4gaTsKIH0KIAotYm9vbCBIYXNSZXZlcnNlU3RyZWFtKHVpbnQzMl90IHByb2NJZCkKLXsKK2Jvb2wgSGFzUmV2ZXJzZVN0cmVhbSh1aW50MzJfdCBwcm9jSWQpIHsKICAgICBpZiAocHJvY0lkID09IFBSRVBST0NfQUVDKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgKEFHQykKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNjYsNDk5ICsyNTUsNTM4IEBACiBzdGF0aWMgY29uc3QgaW50IGtBZ2NEZWZhdWx0Q29tcEdhaW4gPSA5Owogc3RhdGljIGNvbnN0IGJvb2wga0FnY0RlZmF1bHRMaW1pdGVyID0gdHJ1ZTsKIAotaW50ICBBZ2NJbml0IChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgQUxPR1YoIkFnY0luaXQiKTsKLSAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sICo+KGVmZmVjdC0+ZW5naW5lKTsKLSAgICBhZ2MtPnNldF9tb2RlKHdlYnJ0Yzo6R2FpbkNvbnRyb2w6OmtGaXhlZERpZ2l0YWwpOwotICAgIGFnYy0+c2V0X3RhcmdldF9sZXZlbF9kYmZzKGtBZ2NEZWZhdWx0VGFyZ2V0TGV2ZWwpOwotICAgIGFnYy0+c2V0X2NvbXByZXNzaW9uX2dhaW5fZGIoa0FnY0RlZmF1bHRDb21wR2Fpbik7Ci0gICAgYWdjLT5lbmFibGVfbGltaXRlcihrQWdjRGVmYXVsdExpbWl0ZXIpOworaW50IEFnYzJJbml0KHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIEFMT0dWKCJBZ2MySW5pdCIpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiID0gMC5mOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5sZXZlbF9lc3RpbWF0b3IgPQorICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5rUm1zOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYiA9IDIuZjsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgIEFnY0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPmdhaW5fY29udHJvbCgpOwotICAgIEFMT0dWKCJBZ2NDcmVhdGUgZ290IGFnYyAlcCIsIGFnYyk7Ci0gICAgaWYgKGFnYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJBZ2NDcmVhdGUgRXJyb3IiKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotICAgIGVmZmVjdC0+ZW5naW5lID0gc3RhdGljX2Nhc3Q8cHJlcHJvY19meF9oYW5kbGVfdD4oYWdjKTsKK2ludCBBZ2NJbml0KHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIEFMT0dWKCJBZ2NJbml0Iik7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyA9IGtBZ2NEZWZhdWx0VGFyZ2V0TGV2ZWw7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5jb21wcmVzc2lvbl9nYWluX2RiID0ga0FnY0RlZmF1bHRDb21wR2FpbjsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZV9saW1pdGVyID0ga0FnY0RlZmF1bHRMaW1pdGVyOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBZ2MyQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIEFnYzJJbml0KGVmZmVjdCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBZ2NDcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgQWdjSW5pdChlZmZlY3QpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWdjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcFZhbHVlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFZhbHVlKQoteworaW50IEFnYzJHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHVpbnQzMl90KiBwVmFsdWVTaXplLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QgKilwUGFyYW07Ci0gICAgdF9hZ2Nfc2V0dGluZ3MgKnBQcm9wZXJ0aWVzID0gKHRfYWdjX3NldHRpbmdzICopcFZhbHVlOwotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCopcFBhcmFtOworICAgIGFnYzJfc2V0dGluZ3NfdCogcFByb3BlcnRpZXMgPSAoYWdjMl9zZXR0aW5nc190KilwVmFsdWU7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgotICAgIGNhc2UgQUdDX1BBUkFNX0NPTVBfR0FJTjoKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7Ci0gICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKLSAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGJvb2wpKSB7Ci0gICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodF9hZ2Nfc2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0ZJWEVEX0RJR0lUQUxfR0FJTjoKKyAgICAgICAgICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZihmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDAuZjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9MRVZFTF9FU1RJTUFUT1I6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgICAgICAqcFZhbHVlU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0FEQVBUX0RJR0lfRVhUUkFfU0FUVVJBVElPTl9NQVJHSU46CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoZmxvYXQpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwLmY7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YoYWdjMl9zZXR0aW5nc190KSkgeworICAgICAgICAgICAgICAgICpwVmFsdWVTaXplID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCIsIHBhcmFtKTsKLSAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjMkdldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgotICAgICAgICAqKGludDE2X3QgKikgcFZhbHVlID0gKGludDE2X3QpKGFnYy0+dGFyZ2V0X2xldmVsX2RiZnMoKSAqIC0xMDApOwotICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVkIG1pbGxpQmVscyIsICooaW50MTZfdCAqKSBwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46Ci0gICAgICAgICooaW50MTZfdCAqKSBwVmFsdWUgPSAoaW50MTZfdCkoYWdjLT5jb21wcmVzc2lvbl9nYWluX2RiKCkgKiAxMDApOwotICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCAqKSBwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9MSU1JVEVSX0VOQToKLSAgICAgICAgKihib29sICopIHBWYWx1ZSA9IChib29sKWFnYy0+aXNfbGltaXRlcl9lbmFibGVkKCk7Ci0gICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBsaW1pdGVyIGVuYWJsZWQgJXMiLAotICAgICAgICAgICAgICgqKGludDE2X3QgKikgcFZhbHVlICE9IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCA9IChpbnQxNl90KShhZ2MtPnRhcmdldF9sZXZlbF9kYmZzKCkgKiAtMTAwKTsKLSAgICAgICAgcFByb3BlcnRpZXMtPmNvbXBHYWluID0gKGludDE2X3QpKGFnYy0+Y29tcHJlc3Npb25fZ2Fpbl9kYigpICogMTAwKTsKLSAgICAgICAgcFByb3BlcnRpZXMtPmxpbWl0ZXJFbmFibGVkID0gKGJvb2wpYWdjLT5pc19saW1pdGVyX2VuYWJsZWQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coIkFnY0dldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJWQiLCBwYXJhbSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOOgorICAgICAgICAgICAgKihmbG9hdCopcFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmZpeGVkX2RpZ2l0YWwuZ2Fpbl9kYik7CisgICAgICAgICAgICBBTE9HVigiQWdjMkdldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZiBkQiIsICooZmxvYXQqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0FEQVBUX0RJR0lfTEVWRUxfRVNUSU1BVE9SOgorICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gKHVpbnQzMl90KSgKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmxldmVsX2VzdGltYXRvcik7CisgICAgICAgICAgICBBTE9HVigiQWdjMkdldFBhcmFtZXRlcigpIGxldmVsIGVzdGltYXRvciAlZCIsCisgICAgICAgICAgICAgICAgICAqKHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6OkdhaW5Db250cm9sbGVyMjo6TGV2ZWxFc3RpbWF0b3IqKXBWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX0FEQVBUX0RJR0lfRVhUUkFfU0FUVVJBVElPTl9NQVJHSU46CisgICAgICAgICAgICAqKGZsb2F0KilwVmFsdWUgPSAoZmxvYXQpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYik7CisgICAgICAgICAgICBBTE9HVigiQWdjMkdldFBhcmFtZXRlcigpIGV4dHJhIHNhdHVyYXRpb24gbWFyZ2luICVmIGRCIiwgKihmbG9hdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fUFJPUEVSVElFUzoKKyAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5maXhlZERpZ2l0YWxHYWluID0KKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmZpeGVkX2RpZ2l0YWwuZ2Fpbl9kYik7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+bGV2ZWxfZXN0aW1hdG9yID0gKHVpbnQzMl90KSgKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmxldmVsX2VzdGltYXRvcik7CisgICAgICAgICAgICBwUHJvcGVydGllcy0+ZXh0cmFTYXR1cmF0aW9uTWFyZ2luID0KKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2MyR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitpbnQgQWdjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdm9pZCogcFBhcmFtLCB1aW50MzJfdCogcFZhbHVlU2l6ZSwgdm9pZCogcFZhbHVlKSB7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdF9hZ2Nfc2V0dGluZ3MqIHBQcm9wZXJ0aWVzID0gKHRfYWdjX3NldHRpbmdzKilwVmFsdWU7CisKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1RBUkdFVF9MRVZFTDoKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgorICAgICAgICAgICAgaWYgKCpwVmFsdWVTaXplIDwgc2l6ZW9mKGJvb2wpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBpZiAoKnBWYWx1ZVNpemUgPCBzaXplb2YodF9hZ2Nfc2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgKnBWYWx1ZVNpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2NHZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHgiLCBwYXJhbSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzICogLTEwMCk7CisgICAgICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGxldmVsICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICAgICAqKGludDE2X3QqKXBWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KShlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmNvbXByZXNzaW9uX2dhaW5fZGIgKiAtMTAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2NHZXRQYXJhbWV0ZXIoKSBjb21wIGdhaW4gJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX0xJTUlURVJfRU5BOgorICAgICAgICAgICAgKihib29sKilwVmFsdWUgPSAoYm9vbCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVfbGltaXRlcik7CisgICAgICAgICAgICBBTE9HVigiQWdjR2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwKKyAgICAgICAgICAgICAgICAgICgqKGludDE2X3QqKXBWYWx1ZSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCkoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyAqIC0xMDApOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmNvbXBHYWluID0KKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiAqIC0xMDApOworICAgICAgICAgICAgcFByb3BlcnRpZXMtPmxpbWl0ZXJFbmFibGVkID0KKyAgICAgICAgICAgICAgICAgICAgKGJvb2wpKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IEFnY1NldFBhcmFtZXRlciAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSkKLXsKK2ludCBBZ2MyU2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdm9pZCogcFBhcmFtLCB2b2lkKiBwVmFsdWUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKLSAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QgKilwUGFyYW07Ci0gICAgdF9hZ2Nfc2V0dGluZ3MgKnBQcm9wZXJ0aWVzID0gKHRfYWdjX3NldHRpbmdzICopcFZhbHVlOwotICAgIHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKmFnYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6R2FpbkNvbnRyb2wgKj4oZWZmZWN0LT5lbmdpbmUpOwotCisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgZmxvYXQgdmFsdWVGbG9hdCA9IDAuZjsKKyAgICBhZ2MyX3NldHRpbmdzX3QqIHBQcm9wZXJ0aWVzID0gKGFnYzJfc2V0dGluZ3NfdCopcFZhbHVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOwogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFHQ19QQVJBTV9UQVJHRVRfTEVWRUw6Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSB0YXJnZXQgbGV2ZWwgJWQgbWlsbGlCZWxzIiwgKihpbnQxNl90ICopcFZhbHVlKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5zZXRfdGFyZ2V0X2xldmVsX2RiZnMoLSgqKGludDE2X3QgKilwVmFsdWUgLyAxMDApKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBR0NfUEFSQU1fQ09NUF9HQUlOOgotICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIHN0YXR1cyA9IGFnYy0+c2V0X2NvbXByZXNzaW9uX2dhaW5fZGIoKihpbnQxNl90ICopcFZhbHVlIC8gMTAwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6Ci0gICAgICAgIEFMT0dWKCJBZ2NTZXRQYXJhbWV0ZXIoKSBsaW1pdGVyIGVuYWJsZWQgJXMiLCAqKGJvb2wgKilwVmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5lbmFibGVfbGltaXRlcigqKGJvb2wgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFHQ19QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBsZXZlbCAlZCwgZ2FpbiAlZCBsaW1pdGVyICVkIiwKLSAgICAgICAgICAgICBwUHJvcGVydGllcy0+dGFyZ2V0TGV2ZWwsCi0gICAgICAgICAgICAgcFByb3BlcnRpZXMtPmNvbXBHYWluLAotICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5saW1pdGVyRW5hYmxlZCk7Ci0gICAgICAgIHN0YXR1cyA9IGFnYy0+c2V0X3RhcmdldF9sZXZlbF9kYmZzKC0ocFByb3BlcnRpZXMtPnRhcmdldExldmVsIC8gMTAwKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgYnJlYWs7Ci0gICAgICAgIHN0YXR1cyA9IGFnYy0+c2V0X2NvbXByZXNzaW9uX2dhaW5fZGIocFByb3BlcnRpZXMtPmNvbXBHYWluIC8gMTAwKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSBicmVhazsKLSAgICAgICAgc3RhdHVzID0gYWdjLT5lbmFibGVfbGltaXRlcihwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWdjU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOOgorICAgICAgICAgICAgdmFsdWVGbG9hdCA9IChmbG9hdCkoKihpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgQUxPR1YoIkFnYzJTZXRQYXJhbWV0ZXIoKSBmaXhlZCBkaWdpdGFsIGdhaW4gJWYgZEIiLCB2YWx1ZUZsb2F0KTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZml4ZWRfZGlnaXRhbC5nYWluX2RiID0gdmFsdWVGbG9hdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9MRVZFTF9FU1RJTUFUT1I6CisgICAgICAgICAgICBBTE9HVigiQWdjMlNldFBhcmFtZXRlcigpIGxldmVsIGVzdGltYXRvciAlZCIsCisgICAgICAgICAgICAgICAgICAqKHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6OkdhaW5Db250cm9sbGVyMjo6TGV2ZWxFc3RpbWF0b3IqKXBWYWx1ZSk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwubGV2ZWxfZXN0aW1hdG9yID0KKyAgICAgICAgICAgICAgICAgICAgKCood2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNvbmZpZzo6R2FpbkNvbnRyb2xsZXIyOjpMZXZlbEVzdGltYXRvciopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTjoKKyAgICAgICAgICAgIHZhbHVlRmxvYXQgPSAoZmxvYXQpKCooaW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZ2MyU2V0UGFyYW1ldGVyKCkgZXh0cmEgc2F0dXJhdGlvbiBtYXJnaW4gJWYgZEIiLCB2YWx1ZUZsb2F0KTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuYWRhcHRpdmVfZGlnaXRhbC5leHRyYV9zYXR1cmF0aW9uX21hcmdpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgIHZhbHVlRmxvYXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0MyX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBBTE9HVigiQWdjMlNldFBhcmFtZXRlcigpIHByb3BlcnRpZXMgZ2FpbiAlZiwgbGV2ZWwgJWQgbWFyZ2luICVmIiwKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5maXhlZERpZ2l0YWxHYWluLCBwUHJvcGVydGllcy0+bGV2ZWxfZXN0aW1hdG9yLAorICAgICAgICAgICAgICAgICAgcFByb3BlcnRpZXMtPmV4dHJhU2F0dXJhdGlvbk1hcmdpbik7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmZpeGVkX2RpZ2l0YWwuZ2Fpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5maXhlZERpZ2l0YWxHYWluOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5hZGFwdGl2ZV9kaWdpdGFsLmxldmVsX2VzdGltYXRvciA9CisgICAgICAgICAgICAgICAgICAgICh3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpHYWluQ29udHJvbGxlcjI6OkxldmVsRXN0aW1hdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5sZXZlbF9lc3RpbWF0b3I7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIyLmFkYXB0aXZlX2RpZ2l0YWwuZXh0cmFfc2F0dXJhdGlvbl9tYXJnaW5fZGIgPQorICAgICAgICAgICAgICAgICAgICBwUHJvcGVydGllcy0+ZXh0cmFTYXR1cmF0aW9uTWFyZ2luOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWdjMlNldFBhcmFtZXRlcigpIHVua25vd24gcGFyYW0gJTA4eCB2YWx1ZSAlMDh4IiwgcGFyYW0sICoodWludDMyX3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisKKyAgICBBTE9HVigiQWdjMlNldFBhcmFtZXRlcigpIGRvbmUgc3RhdHVzICVkIiwgc3RhdHVzKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludCBBZ2NTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgeworICAgIGludCBzdGF0dXMgPSAwOworICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCopcFBhcmFtOworICAgIHRfYWdjX3NldHRpbmdzKiBwUHJvcGVydGllcyA9ICh0X2FnY19zZXR0aW5ncyopcFZhbHVlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fVEFSR0VUX0xFVkVMOgorICAgICAgICAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIHRhcmdldCBsZXZlbCAlZCBtaWxsaUJlbHMiLCAqKGludDE2X3QqKXBWYWx1ZSk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLnRhcmdldF9sZXZlbF9kYmZzID0KKyAgICAgICAgICAgICAgICAgICAgKC0oKihpbnQxNl90KilwVmFsdWUgLyAxMDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFHQ19QQVJBTV9DT01QX0dBSU46CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgY29tcCBnYWluICVkIG1pbGxpQmVscyIsICooaW50MTZfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgICgqKGludDE2X3QqKXBWYWx1ZSAvIDEwMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBR0NfUEFSQU1fTElNSVRFUl9FTkE6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgbGltaXRlciBlbmFibGVkICVzIiwgKihib29sKilwVmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIgPSAoKihib29sKilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUdDX1BBUkFNX1BST1BFUlRJRVM6CisgICAgICAgICAgICBBTE9HVigiQWdjU2V0UGFyYW1ldGVyKCkgcHJvcGVydGllcyBsZXZlbCAlZCwgZ2FpbiAlZCBsaW1pdGVyICVkIiwKKyAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT50YXJnZXRMZXZlbCwgcFByb3BlcnRpZXMtPmNvbXBHYWluLCBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS50YXJnZXRfbGV2ZWxfZGJmcyA9CisgICAgICAgICAgICAgICAgICAgIC0ocFByb3BlcnRpZXMtPnRhcmdldExldmVsIC8gMTAwKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuY29tcHJlc3Npb25fZ2Fpbl9kYiA9CisgICAgICAgICAgICAgICAgICAgIHBQcm9wZXJ0aWVzLT5jb21wR2FpbiAvIDEwMDsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjEuZW5hYmxlX2xpbWl0ZXIgPSBwUHJvcGVydGllcy0+bGltaXRlckVuYWJsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZ2NTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogCiAgICAgQUxPR1YoIkFnY1NldFBhcmFtZXRlcigpIGRvbmUgc3RhdHVzICVkIiwgc3RhdHVzKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQWdjRW5hYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICB3ZWJydGM6OkdhaW5Db250cm9sICphZ2MgPSBzdGF0aWNfY2FzdDx3ZWJydGM6OkdhaW5Db250cm9sICo+KGVmZmVjdC0+ZW5naW5lKTsKLSAgICBBTE9HVigiQWdjRW5hYmxlIGFnYyAlcCIsIGFnYyk7Ci0gICAgYWdjLT5FbmFibGUodHJ1ZSk7Cit2b2lkIEFnYzJFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMi5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCi12b2lkIEFnY0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIEFMT0dWKCJBZ2NEaXNhYmxlIik7Ci0gICAgd2VicnRjOjpHYWluQ29udHJvbCAqYWdjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpHYWluQ29udHJvbCAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgYWdjLT5FbmFibGUoZmFsc2UpOwordm9pZCBBZ2NFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZ2Fpbl9jb250cm9sbGVyMS5lbmFibGVkID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogfQogCit2b2lkIEFnYzJEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmdhaW5fY29udHJvbGxlcjIuZW5hYmxlZCA9IGZhbHNlOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7Cit9CiAKLXN0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNBZ2NPcHMgPSB7Ci0gICAgICAgIEFnY0NyZWF0ZSwKLSAgICAgICAgQWdjSW5pdCwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgQWdjRW5hYmxlLAotICAgICAgICBBZ2NEaXNhYmxlLAotICAgICAgICBBZ2NTZXRQYXJhbWV0ZXIsCi0gICAgICAgIEFnY0dldFBhcmFtZXRlciwKLSAgICAgICAgTlVMTAotfTsKK3ZvaWQgQWdjRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5nYWluX2NvbnRyb2xsZXIxLmVuYWJsZWQgPSBmYWxzZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOworfQogCitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzQWdjT3BzID0ge0FnY0NyZWF0ZSwgICAgICAgQWdjSW5pdCwgICAgICAgICBOVUxMLCBBZ2NFbmFibGUsIEFnY0Rpc2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnY1NldFBhcmFtZXRlciwgQWdjR2V0UGFyYW1ldGVyLCBOVUxMfTsKKworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FnYzJPcHMgPSB7QWdjMkNyZWF0ZSwgICAgICAgQWdjMkluaXQsICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2MyRW5hYmxlLCAgICAgICBBZ2MyRGlzYWJsZSwgQWdjMlNldFBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnYzJHZXRQYXJhbWV0ZXIsIE5VTEx9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlciAoQUVDKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIGNvbnN0IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OlJvdXRpbmdNb2RlIGtBZWNEZWZhdWx0TW9kZSA9Ci0gICAgICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtFYXJwaWVjZTsKLXN0YXRpYyBjb25zdCBib29sIGtBZWNEZWZhdWx0Q29tZm9ydE5vaXNlID0gdHJ1ZTsKIAotaW50ICBBZWNJbml0IChwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17CitpbnQgQWVjSW5pdChwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKICAgICBBTE9HVigiQWVjSW5pdCIpOwotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIGFlYy0+c2V0X3JvdXRpbmdfbW9kZShrQWVjRGVmYXVsdE1vZGUpOwotICAgIGFlYy0+ZW5hYmxlX2NvbWZvcnRfbm9pc2Uoa0FlY0RlZmF1bHRDb21mb3J0Tm9pc2UpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLmVjaG9fY2FuY2VsbGVyLm1vYmlsZV9tb2RlID0gdHJ1ZTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+QXBwbHlDb25maWcoZWZmZWN0LT5zZXNzaW9uLT5jb25maWcpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgIEFlY0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPmVjaG9fY29udHJvbF9tb2JpbGUoKTsKLSAgICBBTE9HVigiQWVjQ3JlYXRlIGdvdCBhZWMgJXAiLCBhZWMpOwotICAgIGlmIChhZWMgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiQWdjQ3JlYXRlIEVycm9yIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLSAgICBlZmZlY3QtPmVuZ2luZSA9IHN0YXRpY19jYXN0PHByZXByb2NfZnhfaGFuZGxlX3Q+KGFlYyk7Ci0gICAgQWVjSW5pdCAoZWZmZWN0KTsKK2ludCBBZWNDcmVhdGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgQWVjSW5pdChlZmZlY3QpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgQWVjR2V0UGFyYW1ldGVyKHByZXByb2NfZWZmZWN0X3QgICplZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplLAotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFZhbHVlKQoteworaW50IEFlY0dldFBhcmFtZXRlcihwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHZvaWQqIHBQYXJhbSwgdWludDMyX3QqIHBWYWx1ZVNpemUsIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKKyAgICB1aW50MzJfdCBwYXJhbSA9ICoodWludDMyX3QqKXBQYXJhbTsKIAogICAgIGlmICgqcFZhbHVlU2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgotICAgIGNhc2UgQUVDX1BBUkFNX1BST1BFUlRJRVM6Ci0gICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAxMDAwICogZWZmZWN0LT5zZXNzaW9uLT5hcG0tPnN0cmVhbV9kZWxheV9tcygpOwotICAgICAgICBBTE9HVigiQWVjR2V0UGFyYW1ldGVyKCkgZWNobyBkZWxheSAlZCB1cyIsICoodWludDMyX3QgKilwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWVjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgorICAgICAgICBjYXNlIEFFQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gMTAwMCAqIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5zdHJlYW1fZGVsYXlfbXMoKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNHZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzIiwgKih1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFFQ19QQVJBTV9NT0JJTEVfTU9ERToKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgICAgICAgICAgKih1aW50MzJfdCopcFZhbHVlID0gZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIubW9iaWxlX21vZGU7CisgICAgICAgICAgICBBTE9HVigiQWVjR2V0UGFyYW1ldGVyKCkgbW9iaWxlIG1vZGUgJWQgdXMiLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiQWVjR2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCopcFZhbHVlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IEFlY1NldFBhcmFtZXRlciAocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB2b2lkICpwUGFyYW0sIHZvaWQgKnBWYWx1ZSkKLXsKK2ludCBBZWNTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QgKilwVmFsdWU7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdWludDMyX3QgdmFsdWUgPSAqKHVpbnQzMl90KilwVmFsdWU7CiAKICAgICBzd2l0Y2ggKHBhcmFtKSB7Ci0gICAgY2FzZSBBRUNfUEFSQU1fRUNIT19ERUxBWToKLSAgICBjYXNlIEFFQ19QQVJBTV9QUk9QRVJUSUVTOgotICAgICAgICBzdGF0dXMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+c2V0X3N0cmVhbV9kZWxheV9tcyh2YWx1ZS8xMDAwKTsKLSAgICAgICAgQUxPR1YoIkFlY1NldFBhcmFtZXRlcigpIGVjaG8gZGVsYXkgJWQgdXMsIHN0YXR1cyAlZCIsIHZhbHVlLCBzdGF0dXMpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiQWVjU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgKih1aW50MzJfdCAqKXBWYWx1ZSk7Ci0gICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7Ci0gICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFFQ19QQVJBTV9FQ0hPX0RFTEFZOgorICAgICAgICBjYXNlIEFFQ19QQVJBTV9QUk9QRVJUSUVTOgorICAgICAgICAgICAgc3RhdHVzID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPnNldF9zdHJlYW1fZGVsYXlfbXModmFsdWUgLyAxMDAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNTZXRQYXJhbWV0ZXIoKSBlY2hvIGRlbGF5ICVkIHVzLCBzdGF0dXMgJWQiLCB2YWx1ZSwgc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFFQ19QQVJBTV9NT0JJTEVfTU9ERToKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgICAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIubW9iaWxlX21vZGUgPSB2YWx1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJBZWNTZXRQYXJhbWV0ZXIoKSBtb2JpbGUgbW9kZSAlZCB1cyIsIHZhbHVlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJBZWNTZXRQYXJhbWV0ZXIoKSB1bmtub3duIHBhcmFtICUwOHggdmFsdWUgJTA4eCIsIHBhcmFtLCAqKHVpbnQzMl90KilwVmFsdWUpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEFlY0VuYWJsZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqYWVjID0gc3RhdGljX2Nhc3Q8d2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZSAqPihlZmZlY3QtPmVuZ2luZSk7Ci0gICAgQUxPR1YoIkFlY0VuYWJsZSBhZWMgJXAiLCBhZWMpOwotICAgIGFlYy0+RW5hYmxlKHRydWUpOwordm9pZCBBZWNFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcuZWNob19jYW5jZWxsZXIuZW5hYmxlZCA9IHRydWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKIH0KIAotdm9pZCBBZWNEaXNhYmxlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKLSAgICBBTE9HVigiQWVjRGlzYWJsZSIpOwotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIGFlYy0+RW5hYmxlKGZhbHNlKTsKK3ZvaWQgQWVjRGlzYWJsZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QpIHsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5lY2hvX2NhbmNlbGxlci5lbmFibGVkID0gZmFsc2U7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKIH0KIAotaW50IEFlY1NldERldmljZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QsIHVpbnQzMl90IGRldmljZSkKLXsKK2ludCBBZWNTZXREZXZpY2UocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB1aW50MzJfdCBkZXZpY2UpIHsKICAgICBBTE9HVigiQWVjU2V0RGV2aWNlICUwOHgiLCBkZXZpY2UpOwotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKmFlYyA9IHN0YXRpY19jYXN0PHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGUgKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OlJvdXRpbmdNb2RlIG1vZGUgPSB3ZWJydGM6OkVjaG9Db250cm9sTW9iaWxlOjprUXVpZXRFYXJwaWVjZU9ySGVhZHNldDsKIAogICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBzd2l0Y2goZGV2aWNlKSB7Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgotICAgICAgICBtb2RlID0gd2VicnRjOjpFY2hvQ29udHJvbE1vYmlsZTo6a0VhcnBpZWNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKLSAgICAgICAgbW9kZSA9IHdlYnJ0Yzo6RWNob0NvbnRyb2xNb2JpbGU6OmtTcGVha2VycGhvbmU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgotICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6Ci0gICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBhZWMtPnNldF9yb3V0aW5nX21vZGUobW9kZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBwcmVwcm9jX29wc190IHNBZWNPcHMgPSB7Ci0gICAgICAgIEFlY0NyZWF0ZSwKLSAgICAgICAgQWVjSW5pdCwKLSAgICAgICAgTlVMTCwKLSAgICAgICAgQWVjRW5hYmxlLAotICAgICAgICBBZWNEaXNhYmxlLAotICAgICAgICBBZWNTZXRQYXJhbWV0ZXIsCi0gICAgICAgIEFlY0dldFBhcmFtZXRlciwKLSAgICAgICAgQWVjU2V0RGV2aWNlCi19Oworc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc0FlY09wcyA9IHtBZWNDcmVhdGUsICAgICAgIEFlY0luaXQsICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZWNFbmFibGUsICAgICAgIEFlY0Rpc2FibGUsICBBZWNTZXRQYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFlY0dldFBhcmFtZXRlciwgQWVjU2V0RGV2aWNlfTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE5vaXNlIFN1cHByZXNzaW9uIChOUykKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBjb25zdCB3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb246OkxldmVsIGtOc0RlZmF1bHRMZXZlbCA9IHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbjo6a01vZGVyYXRlOworc3RhdGljIGNvbnN0IHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6Ok5vaXNlU3VwcHJlc3Npb246OkxldmVsIGtOc0RlZmF1bHRMZXZlbCA9CisgICAgICAgIHdlYnJ0Yzo6QXVkaW9Qcm9jZXNzaW5nOjpDb25maWc6Ok5vaXNlU3VwcHJlc3Npb246OmtNb2RlcmF0ZTsKIAotaW50ICBOc0luaXQgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCkKLXsKK2ludCBOc0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgQUxPR1YoIk5zSW5pdCIpOwotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIG5zLT5zZXRfbGV2ZWwoa05zRGVmYXVsdExldmVsKTsKLSAgICB3ZWJydGM6OkNvbmZpZyBjb25maWc7Ci0gICAgc3RkOjp2ZWN0b3I8d2VicnRjOjpQb2ludD4gZ2VvbWV0cnk7Ci0gICAgLy8gVE9ETyhhbHVlYnMpOiBNYWtlIHRoZSBnZW9tZXRyeSBzZXR0YWJsZS4KLSAgICBnZW9tZXRyeS5wdXNoX2JhY2sod2VicnRjOjpQb2ludCgtMC4wM2YsIDAuZiwgMC5mKSk7Ci0gICAgZ2VvbWV0cnkucHVzaF9iYWNrKHdlYnJ0Yzo6UG9pbnQoLTAuMDFmLCAwLmYsIDAuZikpOwotICAgIGdlb21ldHJ5LnB1c2hfYmFjayh3ZWJydGM6OlBvaW50KDAuMDFmLCAwLmYsIDAuZikpOwotICAgIGdlb21ldHJ5LnB1c2hfYmFjayh3ZWJydGM6OlBvaW50KDAuMDNmLCAwLmYsIDAuZikpOwotICAgIC8vIFRoZSBnZW9tZXRyeSBuZWVkcyB0byBiZSBzZXQgd2l0aCBCZWFtZm9ybWluZyBlbmFibGVkLgotICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4oCi0gICAgICAgICAgICBuZXcgd2VicnRjOjpCZWFtZm9ybWluZyh0cnVlLCBnZW9tZXRyeSkpOwotICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5TZXRFeHRyYU9wdGlvbnMoY29uZmlnKTsKLSAgICBjb25maWcuU2V0PHdlYnJ0Yzo6QmVhbWZvcm1pbmc+KAotICAgICAgICAgICAgbmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcoZmFsc2UsIGdlb21ldHJ5KSk7Ci0gICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkdldENvbmZpZygpOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnLm5vaXNlX3N1cHByZXNzaW9uLmxldmVsID0ga05zRGVmYXVsdExldmVsOworICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5BcHBseUNvbmZpZyhlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyk7CiAgICAgZWZmZWN0LT50eXBlID0gTlNfVFlQRV9TSU5HTEVfQ0hBTk5FTDsKICAgICByZXR1cm4gMDsKIH0KIAotaW50ICBOc0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90ICplZmZlY3QpCi17Ci0gICAgd2VicnRjOjpOb2lzZVN1cHByZXNzaW9uICpucyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5ub2lzZV9zdXBwcmVzc2lvbigpOwotICAgIEFMT0dWKCJOc0NyZWF0ZSBnb3QgbnMgJXAiLCBucyk7Ci0gICAgaWYgKG5zID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIkFnY0NyZWF0ZSBFcnJvciIpOwotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0gICAgZWZmZWN0LT5lbmdpbmUgPSBzdGF0aWNfY2FzdDxwcmVwcm9jX2Z4X2hhbmRsZV90Pihucyk7Ci0gICAgTnNJbml0IChlZmZlY3QpOworaW50IE5zQ3JlYXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgeworICAgIE5zSW5pdChlZmZlY3QpOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgTnNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCAgKmVmZmVjdCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAqcFBhcmFtIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICpwVmFsdWVTaXplIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICpwVmFsdWUgX191bnVzZWQpCi17CitpbnQgTnNHZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogLyplZmZlY3QgX191bnVzZWQqLywgdm9pZCogLypwUGFyYW0gX191bnVzZWQqLywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogLypwVmFsdWVTaXplIF9fdW51c2VkKi8sIHZvaWQqIC8qcFZhbHVlIF9fdW51c2VkKi8pIHsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgTnNTZXRQYXJhbWV0ZXIgKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdm9pZCAqcFBhcmFtLCB2b2lkICpwVmFsdWUpCi17CitpbnQgTnNTZXRQYXJhbWV0ZXIocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB2b2lkKiBwUGFyYW0sIHZvaWQqIHBWYWx1ZSkgewogICAgIGludCBzdGF0dXMgPSAwOwotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIHVpbnQzMl90IHBhcmFtID0gKih1aW50MzJfdCAqKXBQYXJhbTsKLSAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QgKilwVmFsdWU7Ci0gICAgc3dpdGNoKHBhcmFtKSB7CisgICAgdWludDMyX3QgcGFyYW0gPSAqKHVpbnQzMl90KilwUGFyYW07CisgICAgdWludDMyX3QgdmFsdWUgPSAqKHVpbnQzMl90KilwVmFsdWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgc3dpdGNoIChwYXJhbSkgewogICAgICAgICBjYXNlIE5TX1BBUkFNX0xFVkVMOgotICAgICAgICAgICAgbnMtPnNldF9sZXZlbCgod2VicnRjOjpOb2lzZVN1cHByZXNzaW9uOjpMZXZlbCl2YWx1ZSk7CisgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5sZXZlbCA9CisgICAgICAgICAgICAgICAgICAgICh3ZWJydGM6OkF1ZGlvUHJvY2Vzc2luZzo6Q29uZmlnOjpOb2lzZVN1cHByZXNzaW9uOjpMZXZlbCl2YWx1ZTsKICAgICAgICAgICAgIEFMT0dWKCJOc1NldFBhcmFtZXRlcigpIGxldmVsICVkIiwgdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlNfUEFSQU1fVFlQRToKLSAgICAgICAgewotICAgICAgICAgICAgd2VicnRjOjpDb25maWcgY29uZmlnOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d2VicnRjOjpQb2ludD4gZ2VvbWV0cnk7Ci0gICAgICAgICAgICBib29sIGlzX2JlYW1mb3JtaW5nX2VuYWJsZWQgPQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9PSBOU19UWVBFX01VTFRJX0NIQU5ORUwgJiYgbnMtPmlzX2VuYWJsZWQoKTsKLSAgICAgICAgICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4oCi0gICAgICAgICAgICAgICAgICAgIG5ldyB3ZWJydGM6OkJlYW1mb3JtaW5nKGlzX2JlYW1mb3JtaW5nX2VuYWJsZWQsIGdlb21ldHJ5KSk7Ci0gICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+U2V0RXh0cmFPcHRpb25zKGNvbmZpZyk7Ci0gICAgICAgICAgICBlZmZlY3QtPnR5cGUgPSB2YWx1ZTsKLSAgICAgICAgICAgIEFMT0dWKCJOc1NldFBhcmFtZXRlcigpIHR5cGUgJWQiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIk5zU2V0UGFyYW1ldGVyKCkgdW5rbm93biBwYXJhbSAlMDh4IHZhbHVlICUwOHgiLCBwYXJhbSwgdmFsdWUpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKICAgICB9CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgTnNFbmFibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIEFMT0dWKCJOc0VuYWJsZSBucyAlcCIsIG5zKTsKLSAgICBucy0+RW5hYmxlKHRydWUpOwotICAgIGlmIChlZmZlY3QtPnR5cGUgPT0gTlNfVFlQRV9NVUxUSV9DSEFOTkVMKSB7Ci0gICAgICAgIHdlYnJ0Yzo6Q29uZmlnIGNvbmZpZzsKLSAgICAgICAgc3RkOjp2ZWN0b3I8d2VicnRjOjpQb2ludD4gZ2VvbWV0cnk7Ci0gICAgICAgIGNvbmZpZy5TZXQ8d2VicnRjOjpCZWFtZm9ybWluZz4obmV3IHdlYnJ0Yzo6QmVhbWZvcm1pbmcodHJ1ZSwgZ2VvbWV0cnkpKTsKLSAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlNldEV4dHJhT3B0aW9ucyhjb25maWcpOwotICAgIH0KK3ZvaWQgTnNFbmFibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+R2V0Q29uZmlnKCk7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5jb25maWcubm9pc2Vfc3VwcHJlc3Npb24uZW5hYmxlZCA9IHRydWU7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKIH0KIAotdm9pZCBOc0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQotewordm9pZCBOc0Rpc2FibGUocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0KSB7CiAgICAgQUxPR1YoIk5zRGlzYWJsZSIpOwotICAgIHdlYnJ0Yzo6Tm9pc2VTdXBwcmVzc2lvbiAqbnMgPSBzdGF0aWNfY2FzdDx3ZWJydGM6Ok5vaXNlU3VwcHJlc3Npb24gKj4oZWZmZWN0LT5lbmdpbmUpOwotICAgIG5zLT5FbmFibGUoZmFsc2UpOwotICAgIHdlYnJ0Yzo6Q29uZmlnIGNvbmZpZzsKLSAgICBzdGQ6OnZlY3Rvcjx3ZWJydGM6OlBvaW50PiBnZW9tZXRyeTsKLSAgICBjb25maWcuU2V0PHdlYnJ0Yzo6QmVhbWZvcm1pbmc+KG5ldyB3ZWJydGM6OkJlYW1mb3JtaW5nKGZhbHNlLCBnZW9tZXRyeSkpOwotICAgIGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5TZXRFeHRyYU9wdGlvbnMoY29uZmlnKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZyA9IGVmZmVjdC0+c2Vzc2lvbi0+YXBtLT5HZXRDb25maWcoKTsKKyAgICBlZmZlY3QtPnNlc3Npb24tPmNvbmZpZy5ub2lzZV9zdXBwcmVzc2lvbi5lbmFibGVkID0gZmFsc2U7CisgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFwcGx5Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbi0+Y29uZmlnKTsKIH0KIAotc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3Qgc05zT3BzID0gewotICAgICAgICBOc0NyZWF0ZSwKLSAgICAgICAgTnNJbml0LAotICAgICAgICBOVUxMLAotICAgICAgICBOc0VuYWJsZSwKLSAgICAgICAgTnNEaXNhYmxlLAotICAgICAgICBOc1NldFBhcmFtZXRlciwKLSAgICAgICAgTnNHZXRQYXJhbWV0ZXIsCi0gICAgICAgIE5VTEwKLX07CitzdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCBzTnNPcHMgPSB7TnNDcmVhdGUsICBOc0luaXQsICAgICAgICAgTlVMTCwgICAgICAgICAgIE5zRW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5zRGlzYWJsZSwgTnNTZXRQYXJhbWV0ZXIsIE5zR2V0UGFyYW1ldGVyLCBOVUxMfTsKIAotCi1zdGF0aWMgY29uc3QgcHJlcHJvY19vcHNfdCAqc1ByZVByb2NPcHNbUFJFUFJPQ19OVU1fRUZGRUNUU10gPSB7Ci0gICAgICAgICZzQWdjT3BzLAotICAgICAgICAmc0FlY09wcywKLSAgICAgICAgJnNOc09wcwotfTsKLQorc3RhdGljIGNvbnN0IHByZXByb2Nfb3BzX3QqIHNQcmVQcm9jT3BzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0geyZzQWdjT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzQWdjMk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc0FlY09wcywgJnNOc09wc307CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFZmZlY3QgZnVuY3Rpb25zCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi12b2lkIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIHVpbnQzMl90IHByb2NJZCwgYm9vbCBlbmFibGVkKTsKK3ZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpOwogCiBleHRlcm4gIkMiIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3Mgc0VmZmVjdEludGVyZmFjZTsKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZTsKIAotI2RlZmluZSBCQURfU1RBVEVfQUJPUlQoZnJvbSwgdG8pIFwKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiQmFkIHN0YXRlIHRyYW5zaXRpb24gZnJvbSAlZCB0byAlZCIsIGZyb20sIHRvKTsKKyNkZWZpbmUgQkFEX1NUQVRFX0FCT1JUKGZyb20sIHRvKSBMT0dfQUxXQVlTX0ZBVEFMKCJCYWQgc3RhdGUgdHJhbnNpdGlvbiBmcm9tICVkIHRvICVkIiwgZnJvbSwgdG8pOwogCi1pbnQgRWZmZWN0X1NldFN0YXRlKHByZXByb2NfZWZmZWN0X3QgKmVmZmVjdCwgdWludDMyX3Qgc3RhdGUpCi17CitpbnQgRWZmZWN0X1NldFN0YXRlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCwgdWludDMyX3Qgc3RhdGUpIHsKICAgICBpbnQgc3RhdHVzID0gMDsKICAgICBBTE9HVigiRWZmZWN0X1NldFN0YXRlIHByb2MgJWQsIG5ldyAlZCBvbGQgJWQiLCBlZmZlY3QtPnByb2NJZCwgc3RhdGUsIGVmZmVjdC0+c3RhdGUpOwotICAgIHN3aXRjaChzdGF0ZSkgewotICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfSU5JVDoKLSAgICAgICAgc3dpdGNoKGVmZmVjdC0+c3RhdGUpIHsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6Ci0gICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOwotICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCBmYWxzZSk7CisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPmRpc2FibGUoZWZmZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgc3dpdGNoIChlZmZlY3QtPnN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBlZmZlY3QtPm9wcy0+Y3JlYXRlKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICBzd2l0Y2ggKGVmZmVjdC0+c3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFZmZlY3RfU2V0U3RhdGUgaW52YWxpZCB0cmFuc2l0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9TWVM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOworICAgICAgICAgICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQUNUSVZFOgorICAgICAgICAgICAgc3dpdGNoIChlZmZlY3QtPnN0YXRlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgorICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsaW5nIGFuIGFscmVhZHkgZW5hYmxlZCBlZmZlY3QgaXMganVzdCBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHOgorICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZW5hYmxlKGVmZmVjdCk7CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQoZWZmZWN0LT5zZXNzaW9uLCBlZmZlY3QtPnByb2NJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgotICAgICAgICBzd2l0Y2goZWZmZWN0LT5zdGF0ZSkgewotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0lOSVQ6Ci0gICAgICAgICAgICBzdGF0dXMgPSBlZmZlY3QtPm9wcy0+Y3JlYXRlKGVmZmVjdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6Ci0gICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgc3dpdGNoKGVmZmVjdC0+c3RhdGUpIHsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgotICAgICAgICAgICAgQUxPR0UoIkVmZmVjdF9TZXRTdGF0ZSBpbnZhbGlkIHRyYW5zaXRpb24iKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IC1FTk9TWVM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6Ci0gICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOwotICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DUkVBVEVEOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQkFEX1NUQVRFX0FCT1JUKGVmZmVjdC0+c3RhdGUsIHN0YXRlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgc3dpdGNoKGVmZmVjdC0+c3RhdGUpIHsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQ6Ci0gICAgICAgICAgICBBTE9HRSgiRWZmZWN0X1NldFN0YXRlIGludmFsaWQgdHJhbnNpdGlvbiIpOwotICAgICAgICAgICAgc3RhdHVzID0gLUVOT1NZUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBSRVBST0NfRUZGRUNUX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgIC8vIGVuYWJsaW5nIGFuIGFscmVhZHkgZW5hYmxlZCBlZmZlY3QgaXMganVzdCBpZ25vcmVkCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6Ci0gICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZW5hYmxlKGVmZmVjdCk7Ci0gICAgICAgICAgICBTZXNzaW9uX1NldFByb2NFbmFibGVkKGVmZmVjdC0+c2Vzc2lvbiwgZWZmZWN0LT5wcm9jSWQsIHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBCQURfU1RBVEVfQUJPUlQoZWZmZWN0LT5zdGF0ZSwgc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEJBRF9TVEFURV9BQk9SVChlZmZlY3QtPnN0YXRlLCBzdGF0ZSk7CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgICBlZmZlY3QtPnN0YXRlID0gc3RhdGU7CkBAIC03NjYsOCArNzk0LDcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgRWZmZWN0X0luaXQocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LCB1aW50MzJfdCBwcm9jSWQpCi17CitpbnQgRWZmZWN0X0luaXQocHJlcHJvY19lZmZlY3RfdCogZWZmZWN0LCB1aW50MzJfdCBwcm9jSWQpIHsKICAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CiAgICAgICAgIGVmZmVjdC0+aXRmZSA9ICZzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZTsKICAgICB9IGVsc2UgewpAQCAtNzc5LDIxICs4MDYsMTcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IEVmZmVjdF9DcmVhdGUocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0LAotICAgICAgICAgICAgICAgcHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICppbnRlcmZhY2UpCi17CitpbnQgRWZmZWN0X0NyZWF0ZShwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QsIHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90KiBpbnRlcmZhY2UpIHsKICAgICBlZmZlY3QtPnNlc3Npb24gPSBzZXNzaW9uOwogICAgICppbnRlcmZhY2UgPSAoZWZmZWN0X2hhbmRsZV90KSZlZmZlY3QtPml0ZmU7CiAgICAgcmV0dXJuIEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NSRUFURUQpOwogfQogCi1pbnQgRWZmZWN0X1JlbGVhc2UocHJlcHJvY19lZmZlY3RfdCAqZWZmZWN0KQoteworaW50IEVmZmVjdF9SZWxlYXNlKHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCkgewogICAgIHJldHVybiBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUKTsKIH0KIAotCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gU2Vzc2lvbiBmdW5jdGlvbnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MDMsOCArODI2LDcgQEAKIHN0YXRpYyBjb25zdCBpbnQga1ByZXByb2NEZWZhdWx0U3IgPSAxNjAwMDsKIHN0YXRpYyBjb25zdCBpbnQga1ByZVByb2NEZWZhdWx0Q25sID0gMTsKIAotaW50IFNlc3Npb25fSW5pdChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbikKLXsKK2ludCBTZXNzaW9uX0luaXQocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24pIHsKICAgICBzaXplX3QgaTsKICAgICBpbnQgc3RhdHVzID0gMDsKIApAQCAtODEyLDEyOSArODM0LDY5IEBACiAgICAgc2Vzc2lvbi0+aWQgPSAwOwogICAgIHNlc3Npb24tPmlvID0gMDsKICAgICBzZXNzaW9uLT5jcmVhdGVkTXNrID0gMDsKLSAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTICYmIHN0YXR1cyA9PSAwOyBpKyspIHsKICAgICAgICAgc3RhdHVzID0gRWZmZWN0X0luaXQoJnNlc3Npb24tPmVmZmVjdHNbaV0sIGkpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi0KLWV4dGVybiAiQyIgaW50IFNlc3Npb25fQ3JlYXRlRWZmZWN0KHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9jSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICppbnRlcmZhY2UpCi17CitleHRlcm4gIkMiIGludCBTZXNzaW9uX0NyZWF0ZUVmZmVjdChwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgaW50MzJfdCBwcm9jSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QqIGludGVyZmFjZSkgewogICAgIGludCBzdGF0dXMgPSAtRU5PTUVNOwogCiAgICAgQUxPR1YoIlNlc3Npb25fQ3JlYXRlRWZmZWN0IHByb2NJZCAlZCwgY3JlYXRlZE1zayAlMDh4IiwgcHJvY0lkLCBzZXNzaW9uLT5jcmVhdGVkTXNrKTsKIAogICAgIGlmIChzZXNzaW9uLT5jcmVhdGVkTXNrID09IDApIHsKLSAgICAgICAgc2Vzc2lvbi0+YXBtID0gd2VicnRjOjpBdWRpb1Byb2Nlc3Npbmc6OkNyZWF0ZSgpOworICAgICAgICBzZXNzaW9uLT5hcG0gPSBzZXNzaW9uLT5hcF9idWlsZGVyLkNyZWF0ZSgpOwogICAgICAgICBpZiAoc2Vzc2lvbi0+YXBtID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBjb3VsZCBub3QgZ2V0IGFwbSBlbmdpbmUiKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3Qgd2VicnRjOjpQcm9jZXNzaW5nQ29uZmlnIHByb2Nlc3NpbmdfY29uZmlnID0gewotICAgICAgICAgICAge3trUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfSwKLSAgICAgICAgICAgICB7a1ByZXByb2NEZWZhdWx0U3IsIGtQcmVQcm9jRGVmYXVsdENubH0sCi0gICAgICAgICAgICAge2tQcmVwcm9jRGVmYXVsdFNyLCBrUHJlUHJvY0RlZmF1bHRDbmx9LAotICAgICAgICAgICAgIHtrUHJlcHJvY0RlZmF1bHRTciwga1ByZVByb2NEZWZhdWx0Q25sfX19OwotICAgICAgICBzZXNzaW9uLT5hcG0tPkluaXRpYWxpemUocHJvY2Vzc2luZ19jb25maWcpOwotICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUgPSBuZXcgd2VicnRjOjpBdWRpb0ZyYW1lKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uLT5wcm9jRnJhbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fQ3JlYXRlRWZmZWN0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhdWRpbyBmcmFtZSIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZSA9IG5ldyB3ZWJydGM6OkF1ZGlvRnJhbWUoKTsKLSAgICAgICAgaWYgKHNlc3Npb24tPnJldkZyYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBjb3VsZCBub3QgYWxsb2NhdGUgcmV2ZXJzZSBhdWRpbyBmcmFtZSIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgPSBrUHJlcHJvY0RlZmF1bHRTcjsKLSAgICAgICAgc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCA9IChrUHJlcHJvY0RlZmF1bHRTcikgLyAxMDA7Ci0gICAgICAgIHNlc3Npb24tPmZyYW1lQ291bnQgPSBzZXNzaW9uLT5hcG1GcmFtZUNvdW50OworICAgICAgICBzZXNzaW9uLT5mcmFtZUNvdW50ID0ga1ByZXByb2NEZWZhdWx0U3IgLyAxMDA7CiAgICAgICAgIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSA9IGtQcmVwcm9jRGVmYXVsdFNyOwogICAgICAgICBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9IGtQcmVQcm9jRGVmYXVsdENubDsKICAgICAgICAgc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ID0ga1ByZVByb2NEZWZhdWx0Q25sOwotICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPnNhbXBsZV9yYXRlX2h6XyA9IGtQcmVwcm9jRGVmYXVsdFNyOwotICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPm51bV9jaGFubmVsc18gPSBrUHJlUHJvY0RlZmF1bHRDbmw7CisgICAgICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihrUHJlcHJvY0RlZmF1bHRTcik7CisgICAgICAgIHNlc3Npb24tPmlucHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoa1ByZVByb2NEZWZhdWx0Q25sKTsKKyAgICAgICAgc2Vzc2lvbi0+b3V0cHV0Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihrUHJlcHJvY0RlZmF1bHRTcik7CisgICAgICAgIHNlc3Npb24tPm91dHB1dENvbmZpZy5zZXRfbnVtX2NoYW5uZWxzKGtQcmVQcm9jRGVmYXVsdENubCk7CiAgICAgICAgIHNlc3Npb24tPnJldkNoYW5uZWxDb3VudCA9IGtQcmVQcm9jRGVmYXVsdENubDsKLSAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPnNhbXBsZV9yYXRlX2h6XyA9IGtQcmVwcm9jRGVmYXVsdFNyOwotICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+bnVtX2NoYW5uZWxzXyA9IGtQcmVQcm9jRGVmYXVsdENubDsKKyAgICAgICAgc2Vzc2lvbi0+cmV2Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihrUHJlcHJvY0RlZmF1bHRTcik7CisgICAgICAgIHNlc3Npb24tPnJldkNvbmZpZy5zZXRfbnVtX2NoYW5uZWxzKGtQcmVQcm9jRGVmYXVsdENubCk7CiAgICAgICAgIHNlc3Npb24tPmVuYWJsZWRNc2sgPSAwOwogICAgICAgICBzZXNzaW9uLT5wcm9jZXNzZWRNc2sgPSAwOwogICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrID0gMDsKICAgICAgICAgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrID0gMDsKLSAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICBzZXNzaW9uLT5pbkJ1ZiA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPmluQnVmU2l6ZSA9IDA7Ci0gICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IE5VTEw7Ci0gICAgICAgIHNlc3Npb24tPm91dEJ1ZlNpemUgPSAwOwotICAgICAgICBzZXNzaW9uLT5yZXZSZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICBzZXNzaW9uLT5yZXZCdWYgPSBOVUxMOwotICAgICAgICBzZXNzaW9uLT5yZXZCdWZTaXplID0gMDsKICAgICB9CiAgICAgc3RhdHVzID0gRWZmZWN0X0NyZWF0ZSgmc2Vzc2lvbi0+ZWZmZWN0c1twcm9jSWRdLCBzZXNzaW9uLCBpbnRlcmZhY2UpOwogICAgIGlmIChzdGF0dXMgPCAwKSB7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIEFMT0dWKCJTZXNzaW9uX0NyZWF0ZUVmZmVjdCBPSyIpOwotICAgIHNlc3Npb24tPmNyZWF0ZWRNc2sgfD0gKDE8PHByb2NJZCk7CisgICAgc2Vzc2lvbi0+Y3JlYXRlZE1zayB8PSAoMSA8PCBwcm9jSWQpOwogICAgIHJldHVybiBzdGF0dXM7CiAKIGVycm9yOgogICAgIGlmIChzZXNzaW9uLT5jcmVhdGVkTXNrID09IDApIHsKLSAgICAgICAgZGVsZXRlIHNlc3Npb24tPnJldkZyYW1lOwotICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZSA9IE5VTEw7Ci0gICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5wcm9jRnJhbWU7Ci0gICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5hcG07Ci0gICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7IC8vIE5PTElOVChjbGFuZy1hbmFseXplci1jcGx1c3BsdXMuTmV3RGVsZXRlKQorICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgU2Vzc2lvbl9SZWxlYXNlRWZmZWN0KHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jX2VmZmVjdF90ICpmeCkKLXsKK2ludCBTZXNzaW9uX1JlbGVhc2VFZmZlY3QocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIHByZXByb2NfZWZmZWN0X3QqIGZ4KSB7CiAgICAgQUxPR1dfSUYoRWZmZWN0X1JlbGVhc2UoZngpICE9IDAsICIgRWZmZWN0X1JlbGVhc2UoKSBmYWlsZWQgZm9yIHByb2MgSUQgJWQiLCBmeC0+cHJvY0lkKTsKLSAgICBzZXNzaW9uLT5jcmVhdGVkTXNrICY9IH4oMTw8ZngtPnByb2NJZCk7CisgICAgc2Vzc2lvbi0+Y3JlYXRlZE1zayAmPSB+KDEgPDwgZngtPnByb2NJZCk7CiAgICAgaWYgKHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgewogICAgICAgICBkZWxldGUgc2Vzc2lvbi0+YXBtOwogICAgICAgICBzZXNzaW9uLT5hcG0gPSBOVUxMOwotICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cHJvY0ZyYW1lOwotICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUgPSBOVUxMOwotICAgICAgICBkZWxldGUgc2Vzc2lvbi0+cmV2RnJhbWU7Ci0gICAgICAgIHNlc3Npb24tPnJldkZyYW1lID0gTlVMTDsKLSAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPmluUmVzYW1wbGVyKTsKLSAgICAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7Ci0gICAgICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uLT5yZXZSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+cmV2UmVzYW1wbGVyKTsKLSAgICAgICAgICAgIHNlc3Npb24tPnJldlJlc2FtcGxlciA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIHNlc3Npb24tPmluQnVmOwotICAgICAgICBzZXNzaW9uLT5pbkJ1ZiA9IE5VTEw7Ci0gICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5vdXRCdWY7Ci0gICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IE5VTEw7Ci0gICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5yZXZCdWY7Ci0gICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IE5VTEw7Ci0KICAgICAgICAgc2Vzc2lvbi0+aWQgPSAwOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0KLWludCBTZXNzaW9uX1NldENvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCi17CitpbnQgU2Vzc2lvbl9TZXRDb25maWcocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIGVmZmVjdF9jb25maWdfdCogY29uZmlnKSB7CiAgICAgdWludDMyX3QgaW5DbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICB1aW50MzJfdCBvdXRDbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAKQEAgLTk0NCwxMTIgKzkwNiwyNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRDb25maWcgc3IgJWQgY25sICUwOHgiLAotICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwotICAgIGludCBzdGF0dXM7Ci0KLSAgICAvLyBBRUMgaW1wbGVtZW50YXRpb24gaXMgbGltaXRlZCB0byAxNmtIegotICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA+PSAzMjAwMCAmJiAhKHNlc3Npb24tPmNyZWF0ZWRNc2sgJiAoMSA8PCBQUkVQUk9DX0FFQykpKSB7Ci0gICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSA9IDMyMDAwOwotICAgIH0gZWxzZQotICAgIGlmIChjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA+PSAxNjAwMCkgewotICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgPSAxNjAwMDsKLSAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID49IDgwMDApIHsKLSAgICAgICAgc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlID0gODAwMDsKLSAgICB9Ci0KLSAgICBjb25zdCB3ZWJydGM6OlByb2Nlc3NpbmdDb25maWcgcHJvY2Vzc2luZ19jb25maWcgPSB7Ci0gICAgICB7e3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9LAotICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIG91dENubH0sCi0gICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9LAotICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIGluQ25sfX19OwotICAgIHN0YXR1cyA9IHNlc3Npb24tPmFwbS0+SW5pdGlhbGl6ZShwcm9jZXNzaW5nX2NvbmZpZyk7Ci0gICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQorICAgIEFMT0dWKCJTZXNzaW9uX1NldENvbmZpZyBzciAlZCBjbmwgJTA4eCIsIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlLAorICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpOwogCiAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlID0gY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGU7Ci0gICAgc2Vzc2lvbi0+YXBtRnJhbWVDb3VudCA9IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSAvIDEwMDsKLSAgICBpZiAoc2Vzc2lvbi0+c2FtcGxpbmdSYXRlID09IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSkgewotICAgICAgICBzZXNzaW9uLT5mcmFtZUNvdW50ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXNzaW9uLT5mcmFtZUNvdW50ID0gKHNlc3Npb24tPmFwbUZyYW1lQ291bnQgKiBzZXNzaW9uLT5zYW1wbGluZ1JhdGUpIC8KLSAgICAgICAgICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUgICsgMTsKLSAgICB9CisgICAgc2Vzc2lvbi0+ZnJhbWVDb3VudCA9IHNlc3Npb24tPnNhbXBsaW5nUmF0ZSAvIDEwMDsKICAgICBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9IGluQ25sOwogICAgIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCA9IG91dENubDsKLSAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPm51bV9jaGFubmVsc18gPSBpbkNubDsKLSAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPnNhbXBsZV9yYXRlX2h6XyA9IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZTsKKyAgICBzZXNzaW9uLT5pbnB1dENvbmZpZy5zZXRfc2FtcGxlX3JhdGVfaHooc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKTsKKyAgICBzZXNzaW9uLT5pbnB1dENvbmZpZy5zZXRfbnVtX2NoYW5uZWxzKGluQ25sKTsKKyAgICBzZXNzaW9uLT5vdXRwdXRDb25maWcuc2V0X3NhbXBsZV9yYXRlX2h6KHNlc3Npb24tPnNhbXBsaW5nUmF0ZSk7CisgICAgc2Vzc2lvbi0+b3V0cHV0Q29uZmlnLnNldF9udW1fY2hhbm5lbHMoaW5DbmwpOwogCiAgICAgc2Vzc2lvbi0+cmV2Q2hhbm5lbENvdW50ID0gaW5Dbmw7Ci0gICAgc2Vzc2lvbi0+cmV2RnJhbWUtPm51bV9jaGFubmVsc18gPSBpbkNubDsKLSAgICBzZXNzaW9uLT5yZXZGcmFtZS0+c2FtcGxlX3JhdGVfaHpfID0gc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlOwotCi0gICAgLy8gZm9yY2UgcHJvY2VzcyBidWZmZXIgcmVhbGxvY2F0aW9uCi0gICAgc2Vzc2lvbi0+aW5CdWZTaXplID0gMDsKLSAgICBzZXNzaW9uLT5vdXRCdWZTaXplID0gMDsKLSAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7Ci0gICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ID0gMDsKLQotCi0gICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwotICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IE5VTEw7Ci0gICAgfQotICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICBzcGVleF9yZXNhbXBsZXJfZGVzdHJveShzZXNzaW9uLT5vdXRSZXNhbXBsZXIpOwotICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBOVUxMOwotICAgIH0KLSAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+cmV2UmVzYW1wbGVyKTsKLSAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb24tPnNhbXBsaW5nUmF0ZSAhPSBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgaW50IGVycm9yOwotICAgICAgICBzZXNzaW9uLT5pblJlc2FtcGxlciA9IHNwZWV4X3Jlc2FtcGxlcl9pbml0KHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTQU1QTEVSX1FVQUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKLSAgICAgICAgaWYgKHNlc3Npb24tPmluUmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX1NldENvbmZpZyBDYW5ub3QgY3JlYXRlIHNwZWV4IHJlc2FtcGxlcjogJXMiLAotICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24tPm91dFJlc2FtcGxlciA9IHNwZWV4X3Jlc2FtcGxlcl9pbml0KHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0FNUExFUl9RVUFMSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcik7Ci0gICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIlNlc3Npb25fU2V0Q29uZmlnIENhbm5vdCBjcmVhdGUgc3BlZXggcmVzYW1wbGVyOiAlcyIsCi0gICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9zdHJlcnJvcihlcnJvcikpOwotICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX2Rlc3Ryb3koc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwotICAgICAgICAgICAgc2Vzc2lvbi0+aW5SZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID0gc3BlZXhfcmVzYW1wbGVyX2luaXQoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNBTVBMRVJfUVVBTElUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpOwotICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJTZXNzaW9uX1NldENvbmZpZyBDYW5ub3QgY3JlYXRlIHNwZWV4IHJlc2FtcGxlcjogJXMiLAotICAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPmluUmVzYW1wbGVyKTsKLSAgICAgICAgICAgIHNlc3Npb24tPmluUmVzYW1wbGVyID0gTlVMTDsKLSAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9kZXN0cm95KHNlc3Npb24tPm91dFJlc2FtcGxlcik7Ci0gICAgICAgICAgICBzZXNzaW9uLT5vdXRSZXNhbXBsZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICB9CisgICAgc2Vzc2lvbi0+cmV2Q29uZmlnLnNldF9zYW1wbGVfcmF0ZV9oeihzZXNzaW9uLT5zYW1wbGluZ1JhdGUpOworICAgIHNlc3Npb24tPnJldkNvbmZpZy5zZXRfbnVtX2NoYW5uZWxzKGluQ25sKTsKIAogICAgIHNlc3Npb24tPnN0YXRlID0gUFJFUFJPQ19TRVNTSU9OX1NUQVRFX0NPTkZJRzsKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBTZXNzaW9uX0dldENvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190ICpjb25maWcpCi17Cit2b2lkIFNlc3Npb25fR2V0Q29uZmlnKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QqIGNvbmZpZykgewogICAgIG1lbXNldChjb25maWcsIDAsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKICAgICBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNlc3Npb24tPnNhbXBsaW5nUmF0ZTsKICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwpAQCAtMTA2MCw0NiArOTM3LDMwIEBACiAgICAgICAgICAgICAoRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCk7CiB9CiAKLWludCBTZXNzaW9uX1NldFJldmVyc2VDb25maWcocHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb24sIGVmZmVjdF9jb25maWdfdCAqY29uZmlnKQoteworaW50IFNlc3Npb25fU2V0UmV2ZXJzZUNvbmZpZyhwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiwgZWZmZWN0X2NvbmZpZ190KiBjb25maWcpIHsKICAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gY29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBjb25maWctPm91dHB1dENmZy5mb3JtYXQgfHwKLSAgICAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCB8fAorICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnIHNyICVkIGNubCAlMDh4IiwKLSAgICAgICAgIGNvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlLCBjb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKKyAgICBBTE9HVigiU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnIHNyICVkIGNubCAlMDh4IiwgY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBpZiAoc2Vzc2lvbi0+c3RhdGUgPCBQUkVQUk9DX1NFU1NJT05fU1RBVEVfQ09ORklHKSB7CiAgICAgICAgIHJldHVybiAtRU5PU1lTOwogICAgIH0KICAgICBpZiAoY29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gc2Vzc2lvbi0+c2FtcGxpbmdSYXRlIHx8Ci0gICAgICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgdWludDMyX3QgaW5DbmwgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7Ci0gICAgY29uc3Qgd2VicnRjOjpQcm9jZXNzaW5nQ29uZmlnIHByb2Nlc3NpbmdfY29uZmlnID0gewotICAgICAgIHt7c3RhdGljX2Nhc3Q8aW50PihzZXNzaW9uLT5hcG1TYW1wbGluZ1JhdGUpLCBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudH0sCi0gICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIHNlc3Npb24tPm91dENoYW5uZWxDb3VudH0sCi0gICAgICAgIHtzdGF0aWNfY2FzdDxpbnQ+KHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZSksIGluQ25sfSwKLSAgICAgICAge3N0YXRpY19jYXN0PGludD4oc2Vzc2lvbi0+YXBtU2FtcGxpbmdSYXRlKSwgaW5Dbmx9fX07Ci0gICAgaW50IHN0YXR1cyA9IHNlc3Npb24tPmFwbS0+SW5pdGlhbGl6ZShwcm9jZXNzaW5nX2NvbmZpZyk7Ci0gICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQogICAgIHNlc3Npb24tPnJldkNoYW5uZWxDb3VudCA9IGluQ25sOwotICAgIHNlc3Npb24tPnJldkZyYW1lLT5udW1fY2hhbm5lbHNfID0gaW5Dbmw7Ci0gICAgc2Vzc2lvbi0+cmV2RnJhbWUtPnNhbXBsZV9yYXRlX2h6XyA9IHNlc3Npb24tPmFwbVNhbXBsaW5nUmF0ZTsKLSAgICAvLyBmb3JjZSBwcm9jZXNzIGJ1ZmZlciByZWFsbG9jYXRpb24KLSAgICBzZXNzaW9uLT5yZXZCdWZTaXplID0gMDsKLSAgICBzZXNzaW9uLT5mcmFtZXNSZXYgPSAwOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKHByZXByb2Nfc2Vzc2lvbl90ICpzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QgKmNvbmZpZykKLXsKK3ZvaWQgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uLCBlZmZlY3RfY29uZmlnX3QqIGNvbmZpZykgewogICAgIG1lbXNldChjb25maWcsIDAsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpKTsKICAgICBjb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNlc3Npb24tPnNhbXBsaW5nUmF0ZTsKICAgICBjb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IGNvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwpAQCAtMTEwOSwyNSArOTcwLDEwIEBACiAgICAgICAgICAgICAoRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfCBFRkZFQ1RfQ09ORklHX0ZPUk1BVCk7CiB9CiAKLXZvaWQgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChwcmVwcm9jX3Nlc3Npb25fdCAqc2Vzc2lvbiwgdWludDMyX3QgcHJvY0lkLCBib29sIGVuYWJsZWQpCi17Cit2b2lkIFNlc3Npb25fU2V0UHJvY0VuYWJsZWQocHJlcHJvY19zZXNzaW9uX3QqIHNlc3Npb24sIHVpbnQzMl90IHByb2NJZCwgYm9vbCBlbmFibGVkKSB7CiAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgaWYoc2Vzc2lvbi0+ZW5hYmxlZE1zayA9PSAwKSB7Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiA9IDA7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+aW5SZXNhbXBsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0ID0gMDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5vdXRSZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9yZXNldF9tZW0oc2Vzc2lvbi0+b3V0UmVzYW1wbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICBzZXNzaW9uLT5lbmFibGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CiAgICAgICAgIGlmIChIYXNSZXZlcnNlU3RyZWFtKHByb2NJZCkpIHsKLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiA9IDA7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcmVzZXRfbWVtKHNlc3Npb24tPnJldlJlc2FtcGxlcik7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXNzaW9uLT5yZXZFbmFibGVkTXNrIHw9ICgxIDw8IHByb2NJZCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTEzNiw4ICs5ODIsOCBAQAogICAgICAgICAgICAgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zayAmPSB+KDEgPDwgcHJvY0lkKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZCBwcm9jICVkLCBlbmFibGVkICVkIGVuYWJsZWRNc2sgJTA4eCByZXZFbmFibGVkTXNrICUwOHgiLAotICAgICAgICAgcHJvY0lkLCBlbmFibGVkLCBzZXNzaW9uLT5lbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKTsKKyAgICBBTE9HVigiU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZCBwcm9jICVkLCBlbmFibGVkICVkIGVuYWJsZWRNc2sgJTA4eCByZXZFbmFibGVkTXNrICUwOHgiLCBwcm9jSWQsCisgICAgICAgICAgZW5hYmxlZCwgc2Vzc2lvbi0+ZW5hYmxlZE1zaywgc2Vzc2lvbi0+cmV2RW5hYmxlZE1zayk7CiAgICAgc2Vzc2lvbi0+cHJvY2Vzc2VkTXNrID0gMDsKICAgICBpZiAoSGFzUmV2ZXJzZVN0cmVhbShwcm9jSWQpKSB7CiAgICAgICAgIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayA9IDA7CkBAIC0xMTUxLDggKzk5Nyw3IEBACiBzdGF0aWMgaW50IHNJbml0U3RhdHVzID0gMTsKIHN0YXRpYyBwcmVwcm9jX3Nlc3Npb25fdCBzU2Vzc2lvbnNbUFJFUFJPQ19OVU1fU0VTU0lPTlNdOwogCi1wcmVwcm9jX3Nlc3Npb25fdCAqUHJlUHJvY19HZXRTZXNzaW9uKGludDMyX3QgcHJvY0lkLCBpbnQzMl90ICBzZXNzaW9uSWQsIGludDMyX3QgIGlvSWQpCi17CitwcmVwcm9jX3Nlc3Npb25fdCogUHJlUHJvY19HZXRTZXNzaW9uKGludDMyX3QgcHJvY0lkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkKSB7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX1NFU1NJT05TOyBpKyspIHsKICAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pZCA9PSBzZXNzaW9uSWQpIHsKQEAgLTExNzIsNyArMTAxNyw2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLQogaW50IFByZVByb2NfSW5pdCgpIHsKICAgICBzaXplX3QgaTsKICAgICBpbnQgc3RhdHVzID0gMDsKQEAgLTExODcsOCArMTAzMSw3IEBACiAgICAgcmV0dXJuIHNJbml0U3RhdHVzOwogfQogCi1jb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpQcmVQcm9jX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCkKLXsKK2NvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QqIFByZVByb2NfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgewogICAgICAgICBpZiAobWVtY21wKCZzRGVzY3JpcHRvcnNbaV0tPnV1aWQsIHV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewpAQCAtMTE5OCwyMzQgKzEwNDEsODYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCiBleHRlcm4gIkMiIHsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqaW5CdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKm91dEJ1ZmZlcikKLXsKLSAgICBwcmVwcm9jX2VmZmVjdF90ICogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QgKilzZWxmOworaW50IFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QqIG91dEJ1ZmZlcikgeworICAgIHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90KilzZWxmOwogCi0gICAgaWYgKGVmZmVjdCA9PSBOVUxMKXsKKyAgICBpZiAoZWZmZWN0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzKCkgRVJST1IgZWZmZWN0ID09IE5VTEwiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQotICAgIHByZXByb2Nfc2Vzc2lvbl90ICogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCAqKWVmZmVjdC0+c2Vzc2lvbjsKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbiA9IChwcmVwcm9jX3Nlc3Npb25fdCopZWZmZWN0LT5zZXNzaW9uOwogCi0gICAgaWYgKGluQnVmZmVyID09IE5VTEwgIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCAgfHwKLSAgICAgICAgICAgIG91dEJ1ZmZlciA9PSBOVUxMIHx8IG91dEJ1ZmZlci0+cmF3ID09IE5VTEwpeworICAgIGlmIChpbkJ1ZmZlciA9PSBOVUxMIHx8IGluQnVmZmVyLT5yYXcgPT0gTlVMTCB8fCBvdXRCdWZmZXIgPT0gTlVMTCB8fCBvdXRCdWZmZXItPnJhdyA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcygpIEVSUk9SIGJhZCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHNlc3Npb24tPnByb2Nlc3NlZE1zayB8PSAoMTw8ZWZmZWN0LT5wcm9jSWQpOworICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coImluQnVmZmVyLT5mcmFtZUNvdW50ICV6dSBpcyBub3QgZXF1YWwgdG8gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBvdXRCdWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAKLS8vICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcyBJbiAlZCBmcmFtZXMgZW5hYmxlZE1zayAlMDh4IHByb2Nlc3NlZE1zayAlMDh4IiwKLS8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnByb2Nlc3NlZE1zayk7CisgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50ICE9IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coImluQnVmZmVyLT5mcmFtZUNvdW50ICV6dSAhPSAlenUgcmVwcmVzZW50aW5nIDEwbXMgYXQgc2FtcGxpbmcgcmF0ZSAlZCIsCisgICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5zYW1wbGluZ1JhdGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAKKyAgICBzZXNzaW9uLT5wcm9jZXNzZWRNc2sgfD0gKDEgPDwgZWZmZWN0LT5wcm9jSWQpOworCisgICAgLy8gICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzIEluICVkIGZyYW1lcyBlbmFibGVkTXNrICUwOHggcHJvY2Vzc2VkTXNrICUwOHgiLAorICAgIC8vICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQsIHNlc3Npb24tPmVuYWJsZWRNc2ssIHNlc3Npb24tPnByb2Nlc3NlZE1zayk7CiAgICAgaWYgKChzZXNzaW9uLT5wcm9jZXNzZWRNc2sgJiBzZXNzaW9uLT5lbmFibGVkTXNrKSA9PSBzZXNzaW9uLT5lbmFibGVkTXNrKSB7CiAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+cHJvY2Vzc2VkTXNrID0gMDsKLSAgICAgICAgc2l6ZV90IGZyYW1lc1JxID0gb3V0QnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICBzaXplX3QgZnJhbWVzV3IgPSAwOwotICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZXNPdXQ7Ci0gICAgICAgICAgICBpZiAob3V0QnVmZmVyLT5mcmFtZUNvdW50IDwgZnIpIHsKLSAgICAgICAgICAgICAgICBmciA9IG91dEJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiwKLSAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0IC09IGZyOwotICAgICAgICAgICAgZnJhbWVzV3IgKz0gZnI7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gZWZmZWN0LT5zZXNzaW9uLT5hcG0tPlByb2Nlc3NTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90KiBjb25zdClpbkJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgICAoY29uc3Qgd2VicnRjOjpTdHJlYW1Db25maWcpZWZmZWN0LT5zZXNzaW9uLT5pbnB1dENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHdlYnJ0Yzo6U3RyZWFtQ29uZmlnKWVmZmVjdC0+c2Vzc2lvbi0+b3V0cHV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCogY29uc3Qpb3V0QnVmZmVyLT5zMTYpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJQcm9jZXNzIFN0cmVhbSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50ID0gZnJhbWVzV3I7Ci0gICAgICAgIGlmIChmcmFtZXNXciA9PSBmcmFtZXNScSkgewotICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vzc2lvbi0+aW5SZXNhbXBsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc0luOwotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50IDwgZnIpIHsKLSAgICAgICAgICAgICAgICBmciA9IGluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPmluQnVmU2l6ZSA8IHNlc3Npb24tPmZyYW1lc0luICsgZnIpIHsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICpidWY7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWZTaXplID0gc2Vzc2lvbi0+ZnJhbWVzSW4gKyBmcjsKLSAgICAgICAgICAgICAgICBidWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+aW5CdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZlNpemUgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShzZXNzaW9uLT5pbkJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmID0gYnVmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPmluQnVmICsgc2Vzc2lvbi0+ZnJhbWVzSW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotI2lmZGVmIERVQUxfTUlDX1RFU1QKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ1BjbUR1bXBMb2NrKTsKLSAgICAgICAgICAgIGlmIChnUGNtRHVtcEZoICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmd3JpdGUoaW5CdWZmZXItPnJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgZnIgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSwgMSwgZ1BjbUR1bXBGaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNJbiArPSBmcjsKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzSW4gPCBzZXNzaW9uLT5mcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcHhfdWludDMyX3QgZnJJbiA9IHNlc3Npb24tPmZyYW1lc0luOwotICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPmluUmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5pbkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZySW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludGVybGVhdmVkX2ludChzZXNzaW9uLT5pblJlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPmluQnVmLAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNJbiAtIGZySW4pICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gLT0gZnJJbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNJbjsKLSAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCA8IGZyKSB7Ci0gICAgICAgICAgICAgICAgZnIgPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfICsgc2Vzc2lvbi0+ZnJhbWVzSW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotCi0jaWZkZWYgRFVBTF9NSUNfVEVTVAotICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGNtRHVtcExvY2spOwotICAgICAgICAgICAgaWYgKGdQY21EdW1wRmggIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZ3cml0ZShpbkJ1ZmZlci0+cmF3LAotICAgICAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpLCAxLCBnUGNtRHVtcEZoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGNtRHVtcExvY2spOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luICs9IGZyOwotICAgICAgICAgICAgaW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcjsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5mcmFtZXNJbiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc0luID0gMDsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPnNhbXBsZXNfcGVyX2NoYW5uZWxfID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLQotICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmFwbS0+UHJvY2Vzc1N0cmVhbShzZXNzaW9uLT5wcm9jRnJhbWUpOwotCi0gICAgICAgIGlmIChzZXNzaW9uLT5vdXRCdWZTaXplIDwgc2Vzc2lvbi0+ZnJhbWVzT3V0ICsgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewotICAgICAgICAgICAgaW50MTZfdCAqYnVmOwotICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmU2l6ZSA9IHNlc3Npb24tPmZyYW1lc091dCArIHNlc3Npb24tPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBidWYgPSAoaW50MTZfdCAqKXJlYWxsb2Moc2Vzc2lvbi0+b3V0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWZTaXplICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCA9IDA7Ci0gICAgICAgICAgICAgICAgZnJlZShzZXNzaW9uLT5vdXRCdWYpOwotICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgPSBidWY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2Vzc2lvbi0+b3V0UmVzYW1wbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHNweF91aW50MzJfdCBmck91dCA9IHNlc3Npb24tPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIHNwZWV4X3Jlc2FtcGxlcl9wcm9jZXNzX2ludChzZXNzaW9uLT5vdXRSZXNhbXBsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cHJvY0ZyYW1lLT5kYXRhXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWRfaW50KHNlc3Npb24tPm91dFJlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIHNlc3Npb24tPmZyYW1lc091dCAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgKz0gZnJPdXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+b3V0QnVmICsgc2Vzc2lvbi0+ZnJhbWVzT3V0ICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVDb3VudCAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNPdXQgKz0gc2Vzc2lvbi0+ZnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZXNPdXQ7Ci0gICAgICAgIGlmIChmcmFtZXNScSAtIGZyYW1lc1dyIDwgZnIpIHsKLSAgICAgICAgICAgIGZyID0gZnJhbWVzUnEgLSBmcmFtZXNXcjsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5zMTYgKyBmcmFtZXNXciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmLAotICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0IC09IGZyOwotICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKz0gZnI7Ci0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwogICAgIH0KIH0KIAotaW50IFByZVByb2Nlc3NpbmdGeF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwUmVwbHlEYXRhKQotewotICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKSBzZWxmOworaW50IFByZVByb2Nlc3NpbmdGeF9Db21tYW5kKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDbWREYXRhLCB1aW50MzJfdCogcmVwbHlTaXplLCB2b2lkKiBwUmVwbHlEYXRhKSB7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZWZmZWN0ID0gKHByZXByb2NfZWZmZWN0X3QqKXNlbGY7CiAKLSAgICBpZiAoZWZmZWN0ID09IE5VTEwpeworICAgIGlmIChlZmZlY3QgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAvL0FMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZDogY29tbWFuZCAlZCBjbWRTaXplICVkIixjbWRDb2RlLCBjbWRTaXplKTsKKyAgICAvLyBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQ6IGNvbW1hbmQgJWQgY21kU2l6ZSAlZCIsY21kQ29kZSwgY21kU2l6ZSk7CiAKLSAgICBzd2l0Y2ggKGNtZENvZGUpeworICAgIHN3aXRjaCAoY21kQ29kZSkgewogICAgICAgICBjYXNlIEVGRkVDVF9DTURfSU5JVDoKLSAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+aW5pdCkgewogICAgICAgICAgICAgICAgIGVmZmVjdC0+b3BzLT5pbml0KGVmZmVjdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9DT05GSUc6IHsKLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSAgICA9PSBOVUxMfHwKLSAgICAgICAgICAgICAgICBjbWRTaXplICAgICAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KXx8Ci0gICAgICAgICAgICAgICAgcFJlcGx5RGF0YSAgPT0gTlVMTHx8Ci0gICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogI2lmZGVmIERVQUxfTUlDX1RFU1QKQEAgLTE0MzYsNTUgKzExMzEsNTEgQEAKICAgICAgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmVuYWJsZWRNc2sgPSAwOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBTZXNzaW9uX1NldENvbmZpZyhlZmZlY3QtPnNlc3Npb24sIChlZmZlY3RfY29uZmlnX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IFNlc3Npb25fU2V0Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOwogI2lmZGVmIERVQUxfTUlDX1RFU1QKICAgICAgICAgICAgIGlmIChnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPnNlc3Npb24tPmVuYWJsZWRNc2sgPSBlbmFibGVkTXNrOwogICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgICAgICBpZiAoKihpbnQgKilwUmVwbHlEYXRhICE9IDApIHsKKyAgICAgICAgICAgIGlmICgqKGludCopcFJlcGx5RGF0YSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZWZmZWN0LT5zdGF0ZSAhPSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUcpOworICAgICAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0gRWZmZWN0X1NldFN0YXRlKGVmZmVjdCwgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ09ORklHKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9DT05GSUc6Ci0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSkgeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihlZmZlY3RfY29uZmlnX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFNlc3Npb25fR2V0Q29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCAqKXBSZXBseURhdGEpOworICAgICAgICAgICAgU2Vzc2lvbl9HZXRDb25maWcoZWZmZWN0LT5zZXNzaW9uLCAoZWZmZWN0X2NvbmZpZ190KilwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0U6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBTZXNzaW9uX1NldFJldmVyc2VDb25maWcoZWZmZWN0LT5zZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZmZlY3RfY29uZmlnX3QgKilwQ21kRGF0YSk7Ci0gICAgICAgICAgICBpZiAoKihpbnQgKilwUmVwbHlEYXRhICE9IDApIHsKKyAgICAgICAgICAgICooaW50KilwUmVwbHlEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbl9TZXRSZXZlcnNlQ29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCopcENtZERhdGEpOworICAgICAgICAgICAgaWYgKCooaW50KilwUmVwbHlEYXRhICE9IDApIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0U6Ci0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSl7CisgICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfQ09ORklHX1JFVkVSU0U6IEVSUk9SIik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbl9HZXRSZXZlcnNlQ29uZmlnKGVmZmVjdC0+c2Vzc2lvbiwgKGVmZmVjdF9jb25maWdfdCAqKXBDbWREYXRhKTsKKyAgICAgICAgICAgIFNlc3Npb25fR2V0UmV2ZXJzZUNvbmZpZyhlZmZlY3QtPnNlc3Npb24sIChlZmZlY3RfY29uZmlnX3QqKXBDbWREYXRhKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9SRVNFVDoKQEAgLTE0OTQsODAgKzExODUsNzQgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfUEFSQU06IHsKLSAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7CisgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCogcCA9IChlZmZlY3RfcGFyYW1fdCopcENtZERhdGE7CiAKICAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNtZFNpemUgPCAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHAtPnBzaXplKSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpKXsKKyAgICAgICAgICAgICAgICBjbWRTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9QQVJBTTogRVJST1IiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsIHBDbWREYXRhLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpOwogCi0gICAgICAgICAgICBwID0gKGVmZmVjdF9wYXJhbV90ICopcFJlcGx5RGF0YTsKKyAgICAgICAgICAgIHAgPSAoZWZmZWN0X3BhcmFtX3QqKXBSZXBseURhdGE7CiAKICAgICAgICAgICAgIGludCB2b2Zmc2V0ID0gKChwLT5wc2l6ZSAtIDEpIC8gc2l6ZW9mKGludDMyX3QpICsgMSkgKiBzaXplb2YoaW50MzJfdCk7CiAKICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+Z2V0X3BhcmFtZXRlcikgewotICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9IGVmZmVjdC0+b3BzLT5nZXRfcGFyYW1ldGVyKGVmZmVjdCwgcC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+dnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHZvZmZzZXQpOworICAgICAgICAgICAgICAgIHAtPnN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+Z2V0X3BhcmFtZXRlcihlZmZlY3QsIHAtPmRhdGEsICZwLT52c2l6ZSwgcC0+ZGF0YSArIHZvZmZzZXQpOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgdm9mZnNldCArIHAtPnZzaXplOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogCi0gICAgICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfUEFSQU06ewotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEx8fAotICAgICAgICAgICAgICAgICAgICBjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50MzJfdCkpeworICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX1BBUkFNOiB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplIDwgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQzMl90KSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfUEFSQU06IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKSBwQ21kRGF0YTsKKyAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90KiBwID0gKGVmZmVjdF9wYXJhbV90KilwQ21kRGF0YTsKIAotICAgICAgICAgICAgaWYgKHAtPnBzaXplICE9IHNpemVvZihpbnQzMl90KSl7CisgICAgICAgICAgICBpZiAocC0+cHNpemUgIT0gc2l6ZW9mKGludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX1BBUkFNOiBFUlJPUiwgcHNpemUgaXMgbm90IHNpemVvZihpbnQzMl90KSIpOworICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9QQVJBTTogRVJST1IsIHBzaXplIGlzIG5vdCBzaXplb2YoaW50MzJfdCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlZmZlY3QtPm9wcy0+c2V0X3BhcmFtZXRlcikgewotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IGVmZmVjdC0+b3BzLT5zZXRfcGFyYW1ldGVyKGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXAtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YSArIHAtPnBzaXplKTsKKyAgICAgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+c2V0X3BhcmFtZXRlcihlZmZlY3QsICh2b2lkKilwLT5kYXRhLCBwLT5kYXRhICsgcC0+cHNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6Ci0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9FTkFCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUpOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSBFZmZlY3RfU2V0U3RhdGUoZWZmZWN0LCBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkUpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6Ci0gICAgICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpeworICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplICE9IHNpemVvZihpbnQpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9ESVNBQkxFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhICA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IEVmZmVjdF9TZXRTdGF0ZShlZmZlY3QsIFBSRVBST0NfRUZGRUNUX1NUQVRFX0NPTkZJRyk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9JTlBVVF9ERVZJQ0U6Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgIGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YodWludDMyX3QpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogRUZGRUNUX0NNRF9TRVRfREVWSUNFOiBFUlJPUiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZWZmZWN0LT5vcHMtPnNldF9kZXZpY2UpIHsKLSAgICAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+c2V0X2RldmljZShlZmZlY3QsICoodWludDMyX3QgKilwQ21kRGF0YSk7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5vcHMtPnNldF9kZXZpY2UoZWZmZWN0LCAqKHVpbnQzMl90KilwQ21kRGF0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMTU3OCwzMCArMTI2MywzMCBAQAogI2lmZGVmIERVQUxfTUlDX1RFU1QKICAgICAgICAgLy8vLy8gdGVzdCBjb21tYW5kcyBzdGFydAogICAgICAgICBjYXNlIFBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRTogewotICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEx8fCBjbWRTaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTCB8fCBjbWRTaXplICE9IHNpemVvZih1aW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiUFJFUFJPQ19DTURfRFVBTF9NSUNfRU5BQkxFOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19FTkFCTEU6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnRHVhbE1pY0VuYWJsZWQgPSAqKGJvb2wgKilwQ21kRGF0YTsKKyAgICAgICAgICAgIGdEdWFsTWljRW5hYmxlZCA9ICooYm9vbCopcENtZERhdGE7CiAgICAgICAgICAgICBpZiAoZ0R1YWxNaWNFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24gPSBzSGFzQXV4Q2hhbm5lbHNbZWZmZWN0LT5wcm9jSWRdOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWZmZWN0LT5jdXJfY2hhbm5lbF9jb25maWcgPSAoZWZmZWN0LT5zZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSA/Ci0gICAgICAgICAgICAgICAgICAgIENIQU5ORUxfQ0ZHX01PTk8gOiBDSEFOTkVMX0NGR19TVEVSRU87CisgICAgICAgICAgICBlZmZlY3QtPmN1cl9jaGFubmVsX2NvbmZpZyA9CisgICAgICAgICAgICAgICAgICAgIChlZmZlY3QtPnNlc3Npb24tPmluQ2hhbm5lbENvdW50ID09IDEpID8gQ0hBTk5FTF9DRkdfTU9OTyA6IENIQU5ORUxfQ0ZHX1NURVJFTzsKIAogICAgICAgICAgICAgQUxPR1YoIlBSRVBST0NfQ01EX0RVQUxfTUlDX0VOQUJMRTogJXMiLCBnRHVhbE1pY0VuYWJsZWQgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiB7Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8IHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8IHJlcGx5U2l6ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBFUlJPUiIpOworICAgICAgICAgICAgICAgICAgICAgICJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVEFSVDogRVJST1IiKTsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KQEAgLTE2MTAsMjAgKzEyOTUsMTkgQEAKICAgICAgICAgICAgICAgICBmY2xvc2UoZ1BjbUR1bXBGaCk7CiAgICAgICAgICAgICAgICAgZ1BjbUR1bXBGaCA9IE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGFyICpwYXRoID0gc3RybmR1cCgoY2hhciAqKXBDbWREYXRhLCBjbWRTaXplKTsKLSAgICAgICAgICAgIGdQY21EdW1wRmggPSBmb3BlbigoY2hhciAqKXBhdGgsICJ3YiIpOworICAgICAgICAgICAgY2hhciogcGF0aCA9IHN0cm5kdXAoKGNoYXIqKXBDbWREYXRhLCBjbWRTaXplKTsKKyAgICAgICAgICAgIGdQY21EdW1wRmggPSBmb3BlbigoY2hhciopcGF0aCwgIndiIik7CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BjbUR1bXBMb2NrKTsKLSAgICAgICAgICAgIEFMT0dWKCJQUkVQUk9DX0NNRF9EVUFMX01JQ19QQ01fRFVNUF9TVEFSVDogcGF0aCAlcyBnUGNtRHVtcEZoICVwIiwKLSAgICAgICAgICAgICAgICAgIHBhdGgsIGdQY21EdW1wRmgpOworICAgICAgICAgICAgQUxPR1YoIlBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUQVJUOiBwYXRoICVzIGdQY21EdW1wRmggJXAiLCBwYXRoLCBnUGNtRHVtcEZoKTsKICAgICAgICAgICAgIEFMT0dFX0lGKGdQY21EdW1wRmggPD0gMCwgImdQY21EdW1wRmggb3BlbiBlcnJvciAlZCAlcyIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgZnJlZShwYXRoKTsKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YoaW50KTsKLSAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgKihpbnQqKXBSZXBseURhdGEgPSAwOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFBSRVBST0NfQ01EX0RVQUxfTUlDX1BDTV9EVU1QX1NUT1A6IHsKICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUDogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUDogRVJST1IiKTsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KQEAgLTE2MzUsMTE4ICsxMzE5LDExNiBAQAogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdQY21EdW1wTG9jayk7CiAgICAgICAgICAgICBBTE9HVigiUFJFUFJPQ19DTURfRFVBTF9NSUNfUENNX0RVTVBfU1RPUCIpOwogICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIC8vLy8vIHRlc3QgY29tbWFuZHMgZW5kCisgICAgICAgICAgICAqKGludCopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAvLy8vLyB0ZXN0IGNvbW1hbmRzIGVuZAogCiAgICAgICAgIGNhc2UgRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUzogewotICAgICAgICAgICAgaWYoIWdEdWFsTWljRW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCFnRHVhbE1pY0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMfHwgY21kU2l6ZSAhPSAyICogc2l6ZW9mKHVpbnQzMl90KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gMiAqIHNpemVvZih1aW50MzJfdCkgfHwgcFJlcGx5RGF0YSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgcmVwbHlTaXplID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9TVVBQT1JURURfQ09ORklHUzogRVJST1IiKTsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgqKHVpbnQzMl90ICopcENtZERhdGEgIT0gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIHx8Ci0gICAgICAgICAgICAgICAgICAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKKyAgICAgICAgICAgIGlmICgqKHVpbnQzMl90KilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGZlYXR1cmUgRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIG5vdCBzdXBwb3J0ZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGZ4ICVkIiwgZWZmZWN0LT5wcm9jSWQpOwotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgICAgICAgICAgICAgICAiIGZ4ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnByb2NJZCk7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CiAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaXplX3QgbnVtX2NvbmZpZ3MgPSAqKCh1aW50MzJfdCAqKXBDbWREYXRhICsgMSk7Ci0gICAgICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY29uZmlncyAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1fY29uZmlncyA9ICooKHVpbnQzMl90KilwQ21kRGF0YSArIDEpOworICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPCAoMiAqIHNpemVvZih1aW50MzJfdCkgKyBudW1fY29uZmlncyAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkpIHsKICAgICAgICAgICAgICAgICAqcmVwbHlTaXplID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgKigodWludDMyX3QgKilwUmVwbHlEYXRhICsgMSkgPSBDSEFOTkVMX0NGR19DTlQ7CisgICAgICAgICAgICAqKCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDEpID0gQ0hBTk5FTF9DRkdfQ05UOwogICAgICAgICAgICAgaWYgKG51bV9jb25maWdzIDwgQ0hBTk5FTF9DRkdfQ05UIHx8Ci0gICAgICAgICAgICAgICAgICAgICpyZXBseVNpemUgPCAoMiAqIHNpemVvZih1aW50MzJfdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5ORUxfQ0ZHX0NOVCAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkpIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8ICgyICogc2l6ZW9mKHVpbnQzMl90KSArIENIQU5ORUxfQ0ZHX0NOVCAqIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkpIHsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVOT01FTTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbnVtX2NvbmZpZ3MgPSBDSEFOTkVMX0NGR19DTlQ7Ci0gICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBSZXBseURhdGEgPSAwOworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfU1VQUE9SVEVEX0NPTkZJR1MgbnVtIGNvbmZpZyAlZCIsCiAgICAgICAgICAgICAgICAgICBudW1fY29uZmlncyk7CiAKICAgICAgICAgICAgICpyZXBseVNpemUgPSAyICogc2l6ZW9mKHVpbnQzMl90KSArIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpOwotICAgICAgICAgICAgKigodWludDMyX3QgKilwUmVwbHlEYXRhICsgMSkgPSBudW1fY29uZmlnczsKLSAgICAgICAgICAgIG1lbWNweSgodWludDMyX3QgKilwUmVwbHlEYXRhICsgMiwgJnNEdWFsTWljQ29uZmlncywgbnVtX2NvbmZpZ3MgKiBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpOwotICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICooKHVpbnQzMl90KilwUmVwbHlEYXRhICsgMSkgPSBudW1fY29uZmlnczsKKyAgICAgICAgICAgIG1lbWNweSgodWludDMyX3QqKXBSZXBseURhdGEgKyAyLCAmc0R1YWxNaWNDb25maWdzLAorICAgICAgICAgICAgICAgICAgIG51bV9jb25maWdzICogc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKTsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRzoKLSAgICAgICAgICAgIGlmKCFnRHVhbE1pY0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICghZ0R1YWxNaWNFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fAotICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICAgICAgKnJlcGx5U2l6ZSA8IHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpIHsKKyAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKHVpbnQzMl90KSB8fCBwUmVwbHlEYXRhID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICByZXBseVNpemUgPT0gTlVMTCB8fCAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCBjbWRDb2RlIENhc2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX0dFVF9GRUFUVVJFX0NPTkZJRzogRVJST1IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9HRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKih1aW50MzJfdCAqKXBDbWREYXRhICE9IEVGRkVDVF9GRUFUVVJFX0FVWF9DSEFOTkVMUyB8fCAhZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CisgICAgICAgICAgICBpZiAoKih1aW50MzJfdCopcENtZERhdGEgIT0gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIHx8ICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgeworICAgICAgICAgICAgICAgICoodWludDMyX3QqKXBSZXBseURhdGEgPSAtRU5PU1lTOwogICAgICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YodWludDMyX3QpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIEVGRkVDVF9DTURfR0VUX0ZFQVRVUkVfQ09ORklHIik7Ci0gICAgICAgICAgICAqKHVpbnQzMl90ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgICpyZXBseVNpemUgPSBzaXplb2YodWludDMyX3QpICsgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpOwotICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCAqKXBSZXBseURhdGEgKyAxLAotICAgICAgICAgICAgICAgICAgICZzRHVhbE1pY0NvbmZpZ3NbZWZmZWN0LT5jdXJfY2hhbm5lbF9jb25maWddLAorICAgICAgICAgICAgbWVtY3B5KCh1aW50MzJfdCopcFJlcGx5RGF0YSArIDEsICZzRHVhbE1pY0NvbmZpZ3NbZWZmZWN0LT5jdXJfY2hhbm5lbF9jb25maWddLAogICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRzogewogICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIEVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiAiCi0gICAgICAgICAgICAgICAgICAgICJnRHVhbE1pY0VuYWJsZWQgJWQgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24gJWQiLAorICAgICAgICAgICAgICAgICAgImdEdWFsTWljRW5hYmxlZCAlZCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiAlZCIsCiAgICAgICAgICAgICAgICAgICBnRHVhbE1pY0VuYWJsZWQsIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKTsKLSAgICAgICAgICAgIGlmKCFnRHVhbE1pY0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmICghZ0R1YWxNaWNFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocENtZERhdGEgPT0gTlVMTHx8IGNtZFNpemUgIT0gKHNpemVvZih1aW50MzJfdCkgKyBzaXplb2YoY2hhbm5lbF9jb25maWdfdCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihjaGFubmVsX2NvbmZpZ190KSkgfHwKKyAgICAgICAgICAgICAgICBwUmVwbHlEYXRhID09IE5VTEwgfHwgcmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUc6IEVSUk9SXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAicENtZERhdGEgJXAgY21kU2l6ZSAlZCBwUmVwbHlEYXRhICVwIHJlcGx5U2l6ZSAlcCAqcmVwbHlTaXplICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDbWREYXRhLCBjbWRTaXplLCBwUmVwbHlEYXRhLCByZXBseVNpemUsIHJlcGx5U2l6ZSA/ICpyZXBseVNpemUgOiAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUlxuIgorICAgICAgICAgICAgICAgICAgICAgICJwQ21kRGF0YSAlcCBjbWRTaXplICVkIHBSZXBseURhdGEgJXAgcmVwbHlTaXplICVwICpyZXBseVNpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIHBDbWREYXRhLCBjbWRTaXplLCBwUmVwbHlEYXRhLCByZXBseVNpemUsIHJlcGx5U2l6ZSA/ICpyZXBseVNpemUgOiAtMSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAgICAgICAgIGlmICgqKHVpbnQzMl90ICopcENtZERhdGEgIT0gRUZGRUNUX0ZFQVRVUkVfQVVYX0NIQU5ORUxTIHx8ICFlZmZlY3QtPmF1eF9jaGFubmVsc19vbikgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVOT1NZUzsKKyAgICAgICAgICAgIGlmICgqKHVpbnQzMl90KilwQ21kRGF0YSAhPSBFRkZFQ1RfRkVBVFVSRV9BVVhfQ0hBTk5FTFMgfHwgIWVmZmVjdC0+YXV4X2NoYW5uZWxzX29uKSB7CisgICAgICAgICAgICAgICAgKih1aW50MzJfdCopcFJlcGx5RGF0YSA9IC1FTk9TWVM7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdGeF9Db21tYW5kIGNtZENvZGUgQ2FzZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFRkZFQ1RfQ01EX1NFVF9GRUFUVVJFX0NPTkZJRzogRVJST1JcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ21kRGF0YSAlZCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBDbWREYXRhLCBlZmZlY3QtPmF1eF9jaGFubmVsc19vbik7CisgICAgICAgICAgICAgICAgICAgICAgIkVGRkVDVF9DTURfU0VUX0ZFQVRVUkVfQ09ORklHOiBFUlJPUlxuIgorICAgICAgICAgICAgICAgICAgICAgICJDbWREYXRhICVkIGVmZmVjdC0+YXV4X2NoYW5uZWxzX29uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwQ21kRGF0YSwgZWZmZWN0LT5hdXhfY2hhbm5lbHNfb24pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2l6ZV90IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9DRkdfQ05UO2krKykgewotICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoKHVpbnQzMl90ICopcENtZERhdGEgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNEdWFsTWljQ29uZmlnc1tpXSwgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9DRkdfQ05UOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKCh1aW50MzJfdCopcENtZERhdGEgKyAxLCAmc0R1YWxNaWNDb25maWdzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYW5uZWxfY29uZmlnX3QpKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpID09IENIQU5ORUxfQ0ZHX0NOVCkgewotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gLUVJTlZBTDsKICAgICAgICAgICAgICAgICBBTE9HVygiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUcgaW52YWxpZCBjb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAiWyUwOHhdLlslMDh4XSIsICooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSwgKigodWludDMyX3QgKilwQ21kRGF0YSArIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAiWyUwOHhdLlslMDh4XSIsCisgICAgICAgICAgICAgICAgICAgICAgKigodWludDMyX3QqKXBDbWREYXRhICsgMSksICooKHVpbnQzMl90KilwQ21kRGF0YSArIDIpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5jdXJfY2hhbm5lbF9jb25maWcgPSBpOwotICAgICAgICAgICAgICAgICoodWludDMyX3QgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilwUmVwbHlEYXRhID0gMDsKICAgICAgICAgICAgICAgICBBTE9HVigiUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQgRUZGRUNUX0NNRF9TRVRfRkVBVFVSRV9DT05GSUcgTmV3IGNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwgc0R1YWxNaWNDb25maWdzW2ldLm1haW5fY2hhbm5lbHMsIHNEdWFsTWljQ29uZmlnc1tpXS5hdXhfY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICJbJTA4eF0uWyUwOHhdIiwKKyAgICAgICAgICAgICAgICAgICAgICBzRHVhbE1pY0NvbmZpZ3NbaV0ubWFpbl9jaGFubmVscywgc0R1YWxNaWNDb25maWdzW2ldLmF1eF9jaGFubmVscyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOworICAgICAgICB9IGJyZWFrOwogI2VuZGlmCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE3NTQsMTEgKzE0MzYsOCBAQAogICAgIHJldHVybiAwOwogfQogCi0KLWludCBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvcihlZmZlY3RfaGFuZGxlX3QgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKQotewotICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKSBzZWxmOworaW50IFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBwRGVzY3JpcHRvcikgeworICAgIHByZXByb2NfZWZmZWN0X3QqIGVmZmVjdCA9IChwcmVwcm9jX2VmZmVjdF90KilzZWxmOwogCiAgICAgaWYgKGVmZmVjdCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzY5LDEzNyArMTQ0OCw4MSBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlKGVmZmVjdF9oYW5kbGVfdCAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnVmZmVyX3QgICAgKmluQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19idWZmZXJfdCAgICAqb3V0QnVmZmVyIF9fdW51c2VkKQotewotICAgIHByZXByb2NfZWZmZWN0X3QgKiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCAqKXNlbGY7CitpbnQgUHJlUHJvY2Vzc2luZ0Z4X1Byb2Nlc3NSZXZlcnNlKGVmZmVjdF9oYW5kbGVfdCBzZWxmLCBhdWRpb19idWZmZXJfdCogaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J1ZmZlcl90KiBvdXRCdWZmZXIpIHsKKyAgICBwcmVwcm9jX2VmZmVjdF90KiBlZmZlY3QgPSAocHJlcHJvY19lZmZlY3RfdCopc2VsZjsKIAotICAgIGlmIChlZmZlY3QgPT0gTlVMTCl7CisgICAgaWYgKGVmZmVjdCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dXKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UoKSBFUlJPUiBlZmZlY3QgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9Ci0gICAgcHJlcHJvY19zZXNzaW9uX3QgKiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90ICopZWZmZWN0LT5zZXNzaW9uOworICAgIHByZXByb2Nfc2Vzc2lvbl90KiBzZXNzaW9uID0gKHByZXByb2Nfc2Vzc2lvbl90KillZmZlY3QtPnNlc3Npb247CiAKLSAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCAgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMKXsKKyAgICBpZiAoaW5CdWZmZXIgPT0gTlVMTCB8fCBpbkJ1ZmZlci0+cmF3ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coIlByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZSgpIEVSUk9SIGJhZCBwb2ludGVyIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHNlc3Npb24tPnJldlByb2Nlc3NlZE1zayB8PSAoMTw8ZWZmZWN0LT5wcm9jSWQpOworICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBvdXRCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgQUxPR1coImluQnVmZmVyLT5mcmFtZUNvdW50ICV6dSBpcyBub3QgZXF1YWwgdG8gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBvdXRCdWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAKLS8vICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UgSW4gJWQgZnJhbWVzIHJldkVuYWJsZWRNc2sgJTA4eCByZXZQcm9jZXNzZWRNc2sgJTA4eCIsCi0vLyAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2spOworICAgIGlmIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCAhPSBzZXNzaW9uLT5mcmFtZUNvdW50KSB7CisgICAgICAgIEFMT0dXKCJpbkJ1ZmZlci0+ZnJhbWVDb3VudCAlenUgIT0gJXp1IHJlcHJlc2VudGluZyAxMG1zIGF0IHNhbXBsaW5nIHJhdGUgJWQiLAorICAgICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCwgc2Vzc2lvbi0+ZnJhbWVDb3VudCwgc2Vzc2lvbi0+c2FtcGxpbmdSYXRlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQogCisgICAgc2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrIHw9ICgxIDw8IGVmZmVjdC0+cHJvY0lkKTsKKworICAgIC8vICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UgSW4gJWQgZnJhbWVzIHJldkVuYWJsZWRNc2sgJTA4eCByZXZQcm9jZXNzZWRNc2sKKyAgICAvLyAgICAlMDh4IiwKKyAgICAvLyAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50LCBzZXNzaW9uLT5yZXZFbmFibGVkTXNrLCBzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2spOwogCiAgICAgaWYgKChzZXNzaW9uLT5yZXZQcm9jZXNzZWRNc2sgJiBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKSA9PSBzZXNzaW9uLT5yZXZFbmFibGVkTXNrKSB7CiAgICAgICAgIGVmZmVjdC0+c2Vzc2lvbi0+cmV2UHJvY2Vzc2VkTXNrID0gMDsKLSAgICAgICAgaWYgKHNlc3Npb24tPnJldlJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnIgPSBzZXNzaW9uLT5mcmFtZUNvdW50IC0gc2Vzc2lvbi0+ZnJhbWVzUmV2OwotICAgICAgICAgICAgaWYgKGluQnVmZmVyLT5mcmFtZUNvdW50IDwgZnIpIHsKLSAgICAgICAgICAgICAgICBmciA9IGluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPnJldkJ1ZlNpemUgPCBzZXNzaW9uLT5mcmFtZXNSZXYgKyBmcikgewotICAgICAgICAgICAgICAgIGludDE2X3QgKmJ1ZjsKLSAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWZTaXplID0gc2Vzc2lvbi0+ZnJhbWVzUmV2ICsgZnI7Ci0gICAgICAgICAgICAgICAgYnVmID0gKGludDE2X3QgKilyZWFsbG9jKHNlc3Npb24tPnJldkJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZlNpemUgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoc2Vzc2lvbi0+cmV2QnVmKTsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IGJ1ZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYgKyBzZXNzaW9uLT5mcmFtZXNSZXYgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwotCi0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgKz0gZnI7Ci0gICAgICAgICAgICBpbkJ1ZmZlci0+ZnJhbWVDb3VudCA9IGZyOwotICAgICAgICAgICAgaWYgKHNlc3Npb24tPmZyYW1lc1JldiA8IHNlc3Npb24tPmZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNweF91aW50MzJfdCBmckluID0gc2Vzc2lvbi0+ZnJhbWVzUmV2OwotICAgICAgICAgICAgc3B4X3VpbnQzMl90IGZyT3V0ID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3BlZXhfcmVzYW1wbGVyX3Byb2Nlc3NfaW50KHNlc3Npb24tPnJldlJlc2FtcGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPmRhdGFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcGVleF9yZXNhbXBsZXJfcHJvY2Vzc19pbnRlcmxlYXZlZF9pbnQoc2Vzc2lvbi0+cmV2UmVzYW1wbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmckluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZGcmFtZS0+ZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmck91dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+cmV2QnVmLAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiArIGZySW4gKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzUmV2IC0gZnJJbikgKiBzZXNzaW9uLT5pbkNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgICAgICBzZXNzaW9uLT5mcmFtZXNSZXYgLT0gZnJJbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNSZXY7Ci0gICAgICAgICAgICBpZiAoaW5CdWZmZXItPmZyYW1lQ291bnQgPCBmcikgewotICAgICAgICAgICAgICAgIGZyID0gaW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZW1jcHkoc2Vzc2lvbi0+cmV2RnJhbWUtPmRhdGFfICsgc2Vzc2lvbi0+ZnJhbWVzUmV2ICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgaW5CdWZmZXItPnMxNiwKLSAgICAgICAgICAgICAgICAgICBmciAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiArPSBmcjsKLSAgICAgICAgICAgIGluQnVmZmVyLT5mcmFtZUNvdW50ID0gZnI7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbi0+ZnJhbWVzUmV2IDwgc2Vzc2lvbi0+ZnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzUmV2ID0gMDsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBlZmZlY3QtPnNlc3Npb24tPmFwbS0+UHJvY2Vzc1JldmVyc2VTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90KiBjb25zdClpbkJ1ZmZlci0+czE2LAorICAgICAgICAgICAgICAgICAgICAoY29uc3Qgd2VicnRjOjpTdHJlYW1Db25maWcpZWZmZWN0LT5zZXNzaW9uLT5yZXZDb25maWcsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB3ZWJydGM6OlN0cmVhbUNvbmZpZyllZmZlY3QtPnNlc3Npb24tPnJldkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgKGludDE2X3QqIGNvbnN0KW91dEJ1ZmZlci0+czE2KTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUHJvY2VzcyBSZXZlcnNlIFN0cmVhbSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi0+cmV2RnJhbWUtPnNhbXBsZXNfcGVyX2NoYW5uZWxfID0gc2Vzc2lvbi0+YXBtRnJhbWVDb3VudDsKLSAgICAgICAgZWZmZWN0LT5zZXNzaW9uLT5hcG0tPkFuYWx5emVSZXZlcnNlU3RyZWFtKHNlc3Npb24tPnJldkZyYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwogICAgIH0KIH0KIAotCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBlZmZlY3QKIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3Mgc0VmZmVjdEludGVyZmFjZSA9IHsKLSAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcywKLSAgICBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCwKLSAgICBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvciwKLSAgICBOVUxMCi19OworICAgICAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcywgUHJlUHJvY2Vzc2luZ0Z4X0NvbW1hbmQsIFByZVByb2Nlc3NpbmdGeF9HZXREZXNjcmlwdG9yLCBOVUxMfTsKIAogY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBzRWZmZWN0SW50ZXJmYWNlUmV2ZXJzZSA9IHsKLSAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2VzcywKLSAgICBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCwKLSAgICBQcmVQcm9jZXNzaW5nRnhfR2V0RGVzY3JpcHRvciwKLSAgICBQcmVQcm9jZXNzaW5nRnhfUHJvY2Vzc1JldmVyc2UKLX07CisgICAgICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzLCBQcmVQcm9jZXNzaW5nRnhfQ29tbWFuZCwgUHJlUHJvY2Vzc2luZ0Z4X0dldERlc2NyaXB0b3IsCisgICAgICAgIFByZVByb2Nlc3NpbmdGeF9Qcm9jZXNzUmV2ZXJzZX07CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFZmZlY3QgTGlicmFyeSBJbnRlcmZhY2UgSW1wbGVtZW50YXRpb24KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWludCBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgaW9JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfaGFuZGxlX3QgICpwSW50ZXJmYWNlKQoteworaW50IFByZVByb2Nlc3NpbmdMaWJfQ3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2hhbmRsZV90KiBwSW50ZXJmYWNlKSB7CiAgICAgQUxPR1YoIkVmZmVjdENyZWF0ZTogdXVpZDogJTA4eCBzZXNzaW9uICVkIElPOiAlZCIsIHV1aWQtPnRpbWVMb3csIHNlc3Npb25JZCwgaW9JZCk7CiAKICAgICBpbnQgc3RhdHVzOwotICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2M7Ci0gICAgcHJlcHJvY19zZXNzaW9uX3QgKnNlc3Npb247CisgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCogZGVzYzsKKyAgICBwcmVwcm9jX3Nlc3Npb25fdCogc2Vzc2lvbjsKICAgICB1aW50MzJfdCBwcm9jSWQ7CiAKICAgICBpZiAoUHJlUHJvY19Jbml0KCkgIT0gMCkgewogICAgICAgICByZXR1cm4gc0luaXRTdGF0dXM7CiAgICAgfQotICAgIGRlc2MgPSAgUHJlUHJvY19HZXREZXNjcmlwdG9yKHV1aWQpOworICAgIGRlc2MgPSBQcmVQcm9jX0dldERlc2NyaXB0b3IodXVpZCk7CiAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HVygiRWZmZWN0Q3JlYXRlOiBmeCBub3QgZm91bmQgdXVpZDogJTA4eCIsIHV1aWQtPnRpbWVMb3cpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE5MjAsMTQgKzE1NDMsMTMgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgUHJlUHJvY2Vzc2luZ0xpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UpCi17CitpbnQgUHJlUHJvY2Vzc2luZ0xpYl9SZWxlYXNlKGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UpIHsKICAgICBBTE9HVigiRWZmZWN0UmVsZWFzZSBzdGFydCAlcCIsIGludGVyZmFjZSk7CiAgICAgaWYgKFByZVByb2NfSW5pdCgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHNJbml0U3RhdHVzOwogICAgIH0KIAotICAgIHByZXByb2NfZWZmZWN0X3QgKmZ4ID0gKHByZXByb2NfZWZmZWN0X3QgKilpbnRlcmZhY2U7CisgICAgcHJlcHJvY19lZmZlY3RfdCogZnggPSAocHJlcHJvY19lZmZlY3RfdCopaW50ZXJmYWNlOwogCiAgICAgaWYgKGZ4LT5zZXNzaW9uLT5pZCA9PSAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwpAQCAtMTkzNSwxNyArMTU1NywxNSBAQAogICAgIHJldHVybiBTZXNzaW9uX1JlbGVhc2VFZmZlY3QoZngtPnNlc3Npb24sIGZ4KTsKIH0KIAotaW50IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotCi0gICAgaWYgKHBEZXNjcmlwdG9yID09IE5VTEwgfHwgdXVpZCA9PSBOVUxMKXsKK2ludCBQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogcERlc2NyaXB0b3IpIHsKKyAgICBpZiAocERlc2NyaXB0b3IgPT0gTlVMTCB8fCB1dWlkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IFByZVByb2NfR2V0RGVzY3JpcHRvcih1dWlkKTsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90KiBkZXNjID0gUHJlUHJvY19HZXREZXNjcmlwdG9yKHV1aWQpOwogICAgIGlmIChkZXNjID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIlByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcigpIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gIC1FSU5WQUw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAogICAgIEFMT0dWKCJQcmVQcm9jZXNzaW5nTGliX0dldERlc2NyaXB0b3IoKSBnb3QgZnggJXMiLCBkZXNjLT5uYW1lKTsKQEAgLTE5NTUsMTUgKzE1NzUsMTMgQEAKIH0KIAogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAotX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKLSAgICAudGFnID0gQVVESU9fRUZGRUNUX0xJQlJBUllfVEFHLAotICAgIC52ZXJzaW9uID0gRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04sCi0gICAgLm5hbWUgPSAiQXVkaW8gUHJlcHJvY2Vzc2luZyBMaWJyYXJ5IiwKLSAgICAuaW1wbGVtZW50b3IgPSAiVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIsCi0gICAgLmNyZWF0ZV9lZmZlY3QgPSBQcmVQcm9jZXNzaW5nTGliX0NyZWF0ZSwKLSAgICAucmVsZWFzZV9lZmZlY3QgPSBQcmVQcm9jZXNzaW5nTGliX1JlbGVhc2UsCi0gICAgLmdldF9kZXNjcmlwdG9yID0gUHJlUHJvY2Vzc2luZ0xpYl9HZXREZXNjcmlwdG9yCi19OworX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTSA9IHsKKyAgICAgICAgLnRhZyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX1RBRywKKyAgICAgICAgLnZlcnNpb24gPSBFRkZFQ1RfTElCUkFSWV9BUElfVkVSU0lPTiwKKyAgICAgICAgLm5hbWUgPSAiQXVkaW8gUHJlcHJvY2Vzc2luZyBMaWJyYXJ5IiwKKyAgICAgICAgLmltcGxlbWVudG9yID0gIlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QiLAorICAgICAgICAuY3JlYXRlX2VmZmVjdCA9IFByZVByb2Nlc3NpbmdMaWJfQ3JlYXRlLAorICAgICAgICAucmVsZWFzZV9lZmZlY3QgPSBQcmVQcm9jZXNzaW5nTGliX1JlbGVhc2UsCisgICAgICAgIC5nZXRfZGVzY3JpcHRvciA9IFByZVByb2Nlc3NpbmdMaWJfR2V0RGVzY3JpcHRvcn07CiAKLX07IC8vIGV4dGVybiAiQyIKK307ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUkVBRE1FLm1kIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQ2Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1JFQURNRS5tZApAQCAtMCwwICsxLDcgQEAKKyMgUHJlcHJvY2Vzc2luZyBlZmZlY3RzCisKKyMjIExpbWl0YXRpb25zCistIFByZXByb2Nlc3NpbmcgZWZmZWN0cyBjdXJyZW50bHkgd29yayBvbiAxMG1zIHdvcnRoIG9mIGRhdGEgYW5kIGRvIG5vdCBzdXBwb3J0CisgIGFyYml0cmFyeSBmcmFtZSBjb3VudHMuIFRoaXMgbGltaWF0aW9uIGNvbWVzIGZyb20gdGhlIHVuZGVybHlpbmcgZWZmZWN0cyBpbgorICB3ZWJydGMgbW9kdWxlcworLSBUaGVyZSBpcyBjdXJyZW50bHkgbm8gYXBpIHRvIGNvbW11bmljYXRlIHRoaXMgcmVxdWlyZW1lbnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvYmVuY2htYXJrcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmNhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvYmVuY2htYXJrcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfcHJlcHJvY2Vzc2luZ19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19wcmVwcm9jZXNzaW5nX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2JlbmNobWFyayB7CisgICAgbmFtZTogInByZXByb2Nlc3NpbmdfYmVuY2htYXJrIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3ByZXByb2Nlc3NpbmctZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInByZXByb2Nlc3NpbmdfYmVuY2htYXJrLmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL3ByZXByb2Nlc3NpbmdfYmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9iZW5jaG1hcmtzL3ByZXByb2Nlc3NpbmdfYmVuY2htYXJrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTAxZDRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL2JlbmNobWFya3MvcHJlcHJvY2Vzc2luZ19iZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQSB0ZXN0IHJlc3VsdCBydW5uaW5nIG9uIFBpeGVsIDMgZm9yIGNvbXBhcmlzb24uCisgKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgY2hhbm5lbCBtYXNrIGluZGV4LgorICogVGhlIHNlY29uZCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBlZmZlY3QgaW5kZXguCisgKiAwOiBBdXRvbWF0aWMgR2FpbiBDb250cm9sLAorICogMTogQWNvdXN0aWMgRWNobyBDYW5jZWxlciwKKyAqIDI6IE5vaXNlIFN1cHByZXNzb3IsCisgKiAzOiBBdXRvbWF0aWMgR2FpbiBDb250cm9sIDIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQmVuY2htYXJrICAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgICBDUFUgICBJdGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEJNX1BSRVBST0NFU1NJTkcvMS8wICAgICAgIDQ4MTc5IG5zICAgICAgICA0ODA0MSBucyAgICAgICAgMTIzNDkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMS8xICAgICAgIDU3NTU5IG5zICAgICAgICA1NzQwMyBucyAgICAgICAgMTIyNzAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMS8yICAgICAgIDE3NTI0IG5zICAgICAgICAxNzQ2NiBucyAgICAgICAgMzk5ODIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMS8zICAgICAgICAyNjA4IG5zICAgICAgICAgMjU5OSBucyAgICAgICAyNjgzOTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMi8wICAgICAgIDk0MTk4IG5zICAgICAgICA5MzkyNiBucyAgICAgICAgIDc0NzAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMi8xICAgICAgMTA5MTk2IG5zICAgICAgIDEwODg5OSBucyAgICAgICAgIDY0NTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMi8yICAgICAgIDM0MDk4IG5zICAgICAgICAzMzk4NiBucyAgICAgICAgMjA1NzYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMi8zICAgICAgICAzMjMxIG5zICAgICAgICAgMzIyMSBucyAgICAgICAyMTY2MDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8wICAgICAgMTQxNTMyIG5zICAgICAgIDE0MTEzMiBucyAgICAgICAgIDUwMzAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8xICAgICAgMTYxMTk5IG5zICAgICAgIDE2MDc0NSBucyAgICAgICAgIDQzODcKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8yICAgICAgIDUwNjYzIG5zICAgICAgICA1MDUzNSBucyAgICAgICAgMTM2MTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMy8zICAgICAgICAzOTY3IG5zICAgICAgICAgMzk1NSBucyAgICAgICAxNzcwMDUKKyAqIEJNX1BSRVBST0NFU1NJTkcvNC8wICAgICAgMTg3MDMyIG5zICAgICAgIDE4NjQ4NiBucyAgICAgICAgIDM3MDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvNC8xICAgICAgMjEyODcyIG5zICAgICAgIDIxMjI2NCBucyAgICAgICAgIDMzMDQKKyAqIEJNX1BSRVBST0NFU1NJTkcvNC8yICAgICAgIDY3NjQ5IG5zICAgICAgICA2NzQ3NiBucyAgICAgICAgMTAxMjgKKyAqIEJNX1BSRVBST0NFU1NJTkcvNC8zICAgICAgICA0NzI4IG5zICAgICAgICAgNDcxMyBucyAgICAgICAxNDg1NDcKKyAqIEJNX1BSRVBST0NFU1NJTkcvNS8wICAgICAgMjMzODc0IG5zICAgICAgIDIzMzE4OCBucyAgICAgICAgIDI5NTQKKyAqIEJNX1BSRVBST0NFU1NJTkcvNS8xICAgICAgMjYyNzk4IG5zICAgICAgIDI2MjA1MiBucyAgICAgICAgIDI2ODAKKyAqIEJNX1BSRVBST0NFU1NJTkcvNS8yICAgICAgIDg0NTkyIG5zICAgICAgICA4NDM2OCBucyAgICAgICAgIDgyMDMKKyAqIEJNX1BSRVBST0NFU1NJTkcvNS8zICAgICAgICA1NDcyIG5zICAgICAgICAgNTQ1NSBucyAgICAgICAxMjc3ODQKKyAqIEJNX1BSRVBST0NFU1NJTkcvNi8wICAgICAgMjg0Nzc3IG5zICAgICAgIDI4MzkxMSBucyAgICAgICAgIDI0NjgKKyAqIEJNX1BSRVBST0NFU1NJTkcvNi8xICAgICAgMzE1NjMxIG5zICAgICAgIDMxNDcyNiBucyAgICAgICAgIDIyMzMKKyAqIEJNX1BSRVBST0NFU1NJTkcvNi8yICAgICAgMTAxMjAwIG5zICAgICAgIDEwMDkzMSBucyAgICAgICAgIDY4MDIKKyAqIEJNX1BSRVBST0NFU1NJTkcvNi8zICAgICAgICA2MTUyIG5zICAgICAgICAgNjEzMyBucyAgICAgICAxMTM5NTEKKyAqIEJNX1BSRVBST0NFU1NJTkcvNy8wICAgICAgMzI3MjA3IG5zICAgICAgIDMyNjE1MyBucyAgICAgICAgIDIxMTIKKyAqIEJNX1BSRVBST0NFU1NJTkcvNy8xICAgICAgMzY3NTEwIG5zICAgICAgIDM2NjQxMCBucyAgICAgICAgIDE5MTUKKyAqIEJNX1BSRVBST0NFU1NJTkcvNy8yICAgICAgMTE4NTc0IG5zICAgICAgIDExODI1MCBucyAgICAgICAgIDU3OTUKKyAqIEJNX1BSRVBST0NFU1NJTkcvNy8zICAgICAgICA2OTU2IG5zICAgICAgICAgNjkzNSBucyAgICAgICAxMDA3ODMKKyAqIEJNX1BSRVBST0NFU1NJTkcvOC8wICAgICAgMzcyNjAzIG5zICAgICAgIDM3MTQ3MCBucyAgICAgICAgIDE4ODAKKyAqIEJNX1BSRVBST0NFU1NJTkcvOC8xICAgICAgNDE4ODgyIG5zICAgICAgIDQxNzYyNSBucyAgICAgICAgIDE2ODUKKyAqIEJNX1BSRVBST0NFU1NJTkcvOC8yICAgICAgMTM2MTU1IG5zICAgICAgIDEzNTc3NyBucyAgICAgICAgIDQ5ODYKKyAqIEJNX1BSRVBST0NFU1NJTkcvOC8zICAgICAgICA3NzM0IG5zICAgICAgICAgNzcxMSBucyAgICAgICAgOTE1ODEKKyAqIEJNX1BSRVBST0NFU1NJTkcvOS8wICAgICAgNDI0Nzk1IG5zICAgICAgIDQyMzQ2NCBucyAgICAgICAgIDE2NTcKKyAqIEJNX1BSRVBST0NFU1NJTkcvOS8xICAgICAgNDY5MDczIG5zICAgICAgIDQ2NzY4NyBucyAgICAgICAgIDE1MDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvOS8yICAgICAgMTUzMTcwIG5zICAgICAgIDE1MjczNyBucyAgICAgICAgIDQ1MTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvOS8zICAgICAgICA4MzkzIG5zICAgICAgICAgODM2MyBucyAgICAgICAgODM2MDMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTAvMCAgICAgNDcyNDQwIG5zICAgICAgIDQ3MDkyNiBucyAgICAgICAgIDE0ODkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTAvMSAgICAgNTE2OTg0IG5zICAgICAgIDUxNTQ4MCBucyAgICAgICAgIDEwMDAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTAvMiAgICAgMTY4ODAyIG5zICAgICAgIDE2ODM0OCBucyAgICAgICAgIDQwOTcKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTAvMyAgICAgICA5MTI3IG5zICAgICAgICAgOTEwMCBucyAgICAgICAgNzY5MTMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTEvMCAgICAgNTA5NjkwIG5zICAgICAgIDUwODExMyBucyAgICAgICAgIDEzNjAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTEvMSAgICAgNTY5MDc2IG5zICAgICAgIDU2NzM5MCBucyAgICAgICAgIDEzMTAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTEvMiAgICAgMTg1Njc4IG5zICAgICAgIDE4NTE2NSBucyAgICAgICAgIDM3MjkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTEvMyAgICAgICA5Nzg5IG5zICAgICAgICAgOTc2MCBucyAgICAgICAgNzEzNDIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTIvMCAgICAgNTYzODU4IG5zICAgICAgIDU2MjEwOCBucyAgICAgICAgIDEyNzAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTIvMSAgICAgNjE5NjU2IG5zICAgICAgIDYxNzc5MSBucyAgICAgICAgIDExOTgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTIvMiAgICAgMjAyODgyIG5zICAgICAgIDIwMjMxNiBucyAgICAgICAgIDM0MDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTIvMyAgICAgIDEwNjEwIG5zICAgICAgICAxMDU3OSBucyAgICAgICAgNjYyODcKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTMvMCAgICAgNjAyOTQ0IG5zICAgICAgIDYwMTA5NCBucyAgICAgICAgIDExNjcKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTMvMSAgICAgNjc1NDAxIG5zICAgICAgIDY3MzI5MyBucyAgICAgICAgIDExMDcKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTMvMiAgICAgMjIwNjc3IG5zICAgICAgIDIyMDA1MSBucyAgICAgICAgIDMxMzEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTMvMyAgICAgIDExMzAxIG5zICAgICAgICAxMTI2NSBucyAgICAgICAgNjIwMjIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTQvMCAgICAgNjU5NDk1IG5zICAgICAgIDY1NzM3NSBucyAgICAgICAgIDEwNzEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTQvMSAgICAgNzI2NTUxIG5zICAgICAgIDcyNDI5NSBucyAgICAgICAgIDEwMjQKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTQvMiAgICAgMjM4NTk1IG5zICAgICAgIDIzNzkyMiBucyAgICAgICAgIDI5MDEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTQvMyAgICAgIDExOTQxIG5zICAgICAgICAxMTkwNiBucyAgICAgICAgNTg3ODgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTUvMCAgICAgNjk4Mzc3IG5zICAgICAgIDY5NjEzNCBucyAgICAgICAgIDEwMTQKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTUvMSAgICAgNzcyNTMyIG5zICAgICAgIDc3MDIxNyBucyAgICAgICAgICA5NjAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTUvMiAgICAgMjUzMjE5IG5zICAgICAgIDI1MjUwNSBucyAgICAgICAgIDI3MzYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTUvMyAgICAgIDEyNjY5IG5zICAgICAgICAxMjYzMiBucyAgICAgICAgNTU0NTIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTYvMCAgICAgNzQyMDU0IG5zICAgICAgIDczOTcwOCBucyAgICAgICAgICA5MzYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTYvMSAgICAgODI4MDI5IG5zICAgICAgIDgyNTQ4NCBucyAgICAgICAgICA5MDIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTYvMiAgICAgMjcyNDE5IG5zICAgICAgIDI3MTY1OCBucyAgICAgICAgIDI1NDUKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTYvMyAgICAgIDEzNDczIG5zICAgICAgICAxMzQzMSBucyAgICAgICAgNTIwODgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTcvMCAgICAgNzk0NDQ0IG5zICAgICAgIDc5MTkxNiBucyAgICAgICAgICA4OTEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTcvMSAgICAgODc5NDI5IG5zICAgICAgIDg3NjcwNCBucyAgICAgICAgICA4NDEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTcvMiAgICAgMjkwMDU5IG5zICAgICAgIDI4OTIxNiBucyAgICAgICAgIDIzOTEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTcvMyAgICAgIDE0MjU3IG5zICAgICAgICAxNDIxMCBucyAgICAgICAgNDk0MjUKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTgvMCAgICAgODUyMjIxIG5zICAgICAgIDg0OTQzMCBucyAgICAgICAgICA4MzkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTgvMSAgICAgOTMxMTIxIG5zICAgICAgIDkyODMwOCBucyAgICAgICAgICA3OTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTgvMiAgICAgMzA3OTk1IG5zICAgICAgIDMwNzEwNCBucyAgICAgICAgIDIyNTMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTgvMyAgICAgIDE0OTQ3IG5zICAgICAgICAxNDkwMCBucyAgICAgICAgNDY4NzIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTkvMCAgICAgODg4NzUyIG5zICAgICAgIDg4NTg5MyBucyAgICAgICAgICA3ODEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTkvMSAgICAgOTgzMzk4IG5zICAgICAgIDk4MDI4NSBucyAgICAgICAgICA3NTYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTkvMiAgICAgMzI1NjY5IG5zICAgICAgIDMyNDcwNSBucyAgICAgICAgIDIxMzIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMTkvMyAgICAgIDE1Njc3IG5zICAgICAgICAxNTYyOSBucyAgICAgICAgNDQ2OTMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjAvMCAgICAgOTMzNjUxIG5zICAgICAgIDkzMDY5NyBucyAgICAgICAgICA3NDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjAvMSAgICAxMDMzMzk2IG5zICAgICAgMTAzMDIzNSBucyAgICAgICAgICA3MTMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjAvMiAgICAgMzQyMDgxIG5zICAgICAgIDM0MTA3NyBucyAgICAgICAgIDIwMzEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjAvMyAgICAgIDE2NDIyIG5zICAgICAgICAxNjM3MCBucyAgICAgICAgNDI2MjIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjEvMCAgICAgOTgyNTIxIG5zICAgICAgIDk3OTM4OCBucyAgICAgICAgICA3MDYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjEvMSAgICAxMDg1MzQwIG5zICAgICAgMTA4MTkyNiBucyAgICAgICAgICA2ODIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjEvMiAgICAgMzYwODYyIG5zICAgICAgIDM1OTgxMCBucyAgICAgICAgIDE5MjYKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjEvMyAgICAgIDE3MTYxIG5zICAgICAgICAxNzEwNyBucyAgICAgICAgNDA4ODUKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjIvMCAgICAxMDQzNTYwIG5zICAgICAgMTA0MDIxOSBucyAgICAgICAgICA2NzgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjIvMSAgICAxMTM3MjAzIG5zICAgICAgMTEzMzY4NyBucyAgICAgICAgICA2NTMKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjIvMiAgICAgMzc3NDIxIG5zICAgICAgIDM3NjMxNSBucyAgICAgICAgIDE4NDEKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjIvMyAgICAgIDE3OTAzIG5zICAgICAgICAxNzg0NyBucyAgICAgICAgMzg5ODQKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjMvMCAgICAxMDkwMDk3IG5zICAgICAgMTA4NjUyMyBucyAgICAgICAgICA2NTAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjMvMSAgICAxMTk5MjY3IG5zICAgICAgMTE5NDIzMSBucyAgICAgICAgICA2MTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjMvMiAgICAgMzk1NDI5IG5zICAgICAgIDM5NDI2MyBucyAgICAgICAgIDE3NTkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjMvMyAgICAgIDE4ODc5IG5zICAgICAgICAxODgxOCBucyAgICAgICAgMzcyNDIKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjQvMCAgICAxMTI4NjM4IG5zICAgICAgMTEyNTA3NiBucyAgICAgICAgICA2MjkKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjQvMSAgICAxMjM5OTA5IG5zICAgICAgMTIzNjAxOSBucyAgICAgICAgICA1OTgKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjQvMiAgICAgNDE0Mjk0IG5zICAgICAgIDQxMzA1NSBucyAgICAgICAgIDE2ODAKKyAqIEJNX1BSRVBST0NFU1NJTkcvMjQvMyAgICAgIDE5NTgzIG5zICAgICAgICAxOTUyMSBucyAgICAgICAgMzU3NzEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjMi5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CisjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworY29uc3RleHByIGludCBrU2FtcGxlUmF0ZSA9IDE2MDAwOworY29uc3RleHByIGZsb2F0IGtUZW5NaWxsaVNlY1ZhbCA9IDAuMDE7Citjb25zdGV4cHIgdW5zaWduZWQgaW50IGtTdHJlYW1EZWxheU1zID0gMDsKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtFZmZlY3RVdWlkc1tdID0geworICAgICAgICAvLyBhZ2MgdXVpZAorICAgICAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwKKyAgICAgICAgLy8gYWVjIHV1aWQKKyAgICAgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sCisgICAgICAgIC8vIG5zICB1dWlkCisgICAgICAgIHsweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LAorICAgICAgICAvLyBhZ2MyIHV1aWQKKyAgICAgICAgezB4ODlmMzhlNjUsIDB4ZDRkMiwgMHg0ZDY0LCAweGFkMGUsIHsweDJiLCAweDNlLCAweDc5LCAweDllLCAweGE4LCAweDg2fX0sCit9OworY29uc3RleHByIHNpemVfdCBrTnVtRWZmZWN0VXVpZHMgPSBzdGQ6OnNpemUoa0VmZmVjdFV1aWRzKTsKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrQ2hNYXNrc1tdID0geworICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yLCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180LCAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcsICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCwgIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS185LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTAsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xMSwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTMsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE1LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTYsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xNywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzE4LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMTksIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMCwgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIxLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMjIsIEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yMywgQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzI0LAorfTsKK2NvbnN0ZXhwciBzaXplX3Qga051bUNoTWFza3MgPSBzdGQ6OnNpemUoa0NoTWFza3MpOworCisvLyB0eXBlcyBvZiBwcmUgcHJvY2Vzc2luZyBtb2R1bGVzCitlbnVtIFByZVByb2NJZCB7CisgICAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgICAgUFJFUFJPQ19BRUMsICAvLyBBY291c3RpYyBFY2hvIENhbmNlbGVyCisgICAgUFJFUFJPQ19OUywgICAvLyBOb2lzZSBTdXBwcmVzc29yCisgICAgUFJFUFJPQ19BR0MyLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbCAyCisgICAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworaW50IHByZVByb2NDcmVhdGVFZmZlY3QoZWZmZWN0X2hhbmRsZV90KiBwRWZmZWN0SGFuZGxlLCB1aW50MzJfdCBlZmZlY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NvbmZpZ190KiBwQ29uZmlnLCBpbnQgc2Vzc2lvbklkLCBpbnQgaW9JZCkgeworICAgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgma0VmZmVjdFV1aWRzW2VmZmVjdFR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGlvSWQsIHBFZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW8gUHJlcHJvY2Vzc2luZyBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGlmIChlZmZlY3RUeXBlID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlNldCBjb25maWcgcmV2ZXJzZSBjb21tYW5kIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbnQgc3RhdHVzID0gKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlNldCBjb25maWcgY29tbWFuZCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSwgdWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICAgIGVmZmVjdF9wYXJhbV90KiBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIHJldHVybiByZXBseTsKK30KKworc2hvcnQgcHJlUHJvY0dldFNob3J0VmFsKGZsb2F0IHBhcmFtVmFsdWUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2hvcnQ+KHBhcmFtVmFsdWUgKiBzdGQ6Om51bWVyaWNfbGltaXRzPHNob3J0Pjo6bWF4KCkpOworfQorCitzdGF0aWMgdm9pZCBCTV9QUkVQUk9DRVNTSU5HKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgY29uc3Qgc2l6ZV90IGNoTWFzayA9IGtDaE1hc2tzW3N0YXRlLnJhbmdlKDApIC0gMV07CisgICAgY29uc3Qgc2l6ZV90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoTWFzayk7CisKKyAgICBQcmVQcm9jSWQgZWZmZWN0VHlwZSA9IChQcmVQcm9jSWQpc3RhdGUucmFuZ2UoMSk7CisKKyAgICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgICAgaW50MzJfdCBpb0lkID0gMTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlID0gbnVsbHB0cjsKKyAgICBlZmZlY3RfY29uZmlnX3QgY29uZmlne307CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0ga1NhbXBsZVJhdGU7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IGNoTWFzazsKKyAgICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlLCBzdGF0ZS5yYW5nZSgxKSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkKTsKKyAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgcmVwbHkgPSAwOworICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgaWYgKGludCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShrU2FtcGxlUmF0ZSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4oY2hNYXNrKTsKKyAgICBzdGQ6OnVuaWZvcm1fcmVhbF9kaXN0cmlidXRpb248PiBkaXMoLTEuMGYsIDEuMGYpOworICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpIDogaW4pIHsKKyAgICAgICAgaSA9IHByZVByb2NHZXRTaG9ydFZhbChkaXMoZ2VuKSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBmYXJJbihmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgZm9yIChhdXRvJiBpIDogZmFySW4pIHsKKyAgICAgICAgaSA9IHByZVByb2NHZXRTaG9ydFZhbChkaXMoZ2VuKSk7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXQoZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gUnVuIHRoZSB0ZXN0CisgICAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoaW4uZGF0YSgpKTsKKyAgICAgICAgYmVuY2htYXJrOjpEb05vdE9wdGltaXplKG91dC5kYXRhKCkpOworICAgICAgICBiZW5jaG1hcms6OkRvTm90T3B0aW1pemUoZmFySW4uZGF0YSgpKTsKKworICAgICAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IChzaXplX3QpZnJhbWVMZW5ndGgsIC5zMTYgPSBpbi5kYXRhKCl9OworICAgICAgICBhdWRpb19idWZmZXJfdCBvdXRCdWZmZXIgPSB7LmZyYW1lQ291bnQgPSAoc2l6ZV90KWZyYW1lTGVuZ3RoLCAuczE2ID0gb3V0LmRhdGEoKX07CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGZhckluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gKHNpemVfdClmcmFtZUxlbmd0aCwgLnMxNiA9IGZhckluLmRhdGEoKX07CisKKyAgICAgICAgaWYgKFBSRVBST0NfQUVDID09IGVmZmVjdFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZVByb2NTZXRDb25maWdQYXJhbShlZmZlY3RIYW5kbGUsIEFFQ19QQVJBTV9FQ0hPX0RFTEFZLCBrU3RyZWFtRGVsYXlNcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicHJlUHJvY1NldENvbmZpZ1BhcmFtIHJldHVybmVkIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlKS0+cHJvY2VzcyhlZmZlY3RIYW5kbGUsICZpbkJ1ZmZlciwgJm91dEJ1ZmZlcik7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsIChpbnQpc3RhdGUucmFuZ2UoMSksIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSRVBST0NfQUVDID09IGVmZmVjdFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqZWZmZWN0SGFuZGxlKS0+cHJvY2Vzc19yZXZlcnNlKGVmZmVjdEhhbmRsZSwgJmZhckluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJcbkVycm9yOiBQcm9jZXNzIHJldmVyc2UgaSA9ICVkIHJldHVybmVkIHdpdGggZXJyb3IgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgKGludClzdGF0ZS5yYW5nZSgxKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYmVuY2htYXJrOjpDbG9iYmVyTWVtb3J5KCk7CisKKyAgICBzdGF0ZS5TZXRDb21wbGV4aXR5TihzdGF0ZS5yYW5nZSgwKSk7CisKKyAgICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KGVmZmVjdEhhbmRsZSk7IHN0YXR1cyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVwcm9jZXNzaW5nQXJncyhiZW5jaG1hcms6OmludGVybmFsOjpCZW5jaG1hcmsqIGIpIHsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSAoaW50KWtOdW1DaE1hc2tzOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAoaW50KWtOdW1FZmZlY3RVdWlkczsgKytqKSB7CisgICAgICAgICAgICBiLT5BcmdzKHtpLCBqfSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0JFTkNITUFSSyhCTV9QUkVQUk9DRVNTSU5HKS0+QXBwbHkocHJlcHJvY2Vzc2luZ0FyZ3MpOworCitCRU5DSE1BUktfTUFJTigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODBiMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OSBAQAorLy8gYXVkaW8gcHJlcHJvY2Vzc2luZyB1bml0IHRlc3QKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfcHJlcHJvY2Vzc2luZ19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGliZWZmZWN0c19wcmVwcm9jZXNzaW5nX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJFZmZlY3RQcmVwcm9jZXNzaW5nVGVzdCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcmVwcm9jZXNzaW5nLWRlZmF1bHRzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWworICAgICAgICAiRWZmZWN0UHJlcHJvY2Vzc2luZ1Rlc3QuY3BwIiwKKyAgICAgICAgIkVmZmVjdFRlc3RIZWxwZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkF1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJlcHJvY2Vzc2luZy1kZWZhdWx0cyJdLAorICAgIGd0ZXN0OiBmYWxzZSwKKyAgICBzcmNzOiBbIlByZVByb2Nlc3NpbmdUZXN0LmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3ByZXByb2Nlc3NpbmciLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvcnJlbGF0aW9uIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbImNvcnJlbGF0aW9uLmNwcCJdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGd0ZXN0OiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RQcmVwcm9jZXNzaW5nVGVzdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0UHJlcHJvY2Vzc2luZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MDA2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0UHJlcHJvY2Vzc2luZ1Rlc3QuY3BwCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiRWZmZWN0VGVzdEhlbHBlci5oIgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjMi5oPgorI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCitjb25zdGV4cHIgZWZmZWN0X3V1aWRfdCBrQUdDVXVpZCA9IHsKKyAgICAgICAgMHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fTsKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtBR0MyVXVpZCA9IHsKKyAgICAgICAgMHg4OWYzOGU2NSwgMHhkNGQyLCAweDRkNjQsIDB4YWQwZSwgezB4MmIsIDB4M2UsIDB4NzksIDB4OWUsIDB4YTgsIDB4ODZ9fTsKK2NvbnN0ZXhwciBlZmZlY3RfdXVpZF90IGtBRUNVdWlkID0geworICAgICAgICAweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19OworY29uc3RleHByIGVmZmVjdF91dWlkX3Qga05TVXVpZCA9IHsKKyAgICAgICAgMHhjMDZjODQwMCwgMHg4ZTA2LCAweDExZTAsIDB4OWNiNiwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fTsKKworc3RhdGljIGJvb2wgaXNBR0NFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCogdXVpZCkgeworICAgIHJldHVybiB1dWlkID09ICZrQUdDVXVpZDsKK30KK3N0YXRpYyBib29sIGlzQUdDMkVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkKSB7CisgICAgcmV0dXJuIHV1aWQgPT0gJmtBR0MyVXVpZDsKK30KK3N0YXRpYyBib29sIGlzQUVDRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKKyAgICByZXR1cm4gdXVpZCA9PSAma0FFQ1V1aWQ7Cit9CitzdGF0aWMgYm9vbCBpc05TRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQpIHsKKyAgICByZXR1cm4gdXVpZCA9PSAma05TVXVpZDsKK30KKworY29uc3RleHByIGludCBrQUdDVGFyZ2V0TGV2ZWxzW10gPSB7MCwgLTMwMCwgLTUwMCwgLTEwMDAsIC0zMTAwfTsKKworY29uc3RleHByIGludCBrQUdDQ29tcExldmVsc1tdID0gezAsIC0zMDAsIC01MDAsIC0xMDAwLCAtOTAwMH07CisKK2NvbnN0ZXhwciBzaXplX3Qga0FHQzJGaXhlZERpZ2l0YWxHYWluc1tdID0gezAsIDMsIDEwLCAyMCwgNDl9OworCitjb25zdGV4cHIgc2l6ZV90IGtBR0MyQWRhcHRHaWdpdGFsTGV2ZWxFc3RpbWF0b3JzW10gPSB7MCwgMX07CisKK2NvbnN0ZXhwciBzaXplX3Qga0FHQzJFeHRyYVNhdHVyYXRpb25NYXJnaW5zW10gPSB7MCwgMywgMTAsIDIwLCAxMDB9OworCitjb25zdGV4cHIgc2l6ZV90IGtBRUNFY2hvRGVsYXlzW10gPSB7MCwgMjUwLCA1MDB9OworCitjb25zdGV4cHIgc2l6ZV90IGtOU0xldmVsc1tdID0gezAsIDEsIDIsIDN9OworCitzdHJ1Y3QgQUdDUGFyYW1zIHsKKyAgICBpbnQgdGFyZ2V0TGV2ZWw7CisgICAgaW50IGNvbXBMZXZlbDsKK307CisKK3N0cnVjdCBBR0MyUGFyYW1zIHsKKyAgICBzaXplX3QgZml4ZWREaWdpdGFsR2FpbjsKKyAgICBzaXplX3QgYWRhcHREaWdpTGV2ZWxFc3RpbWF0b3I7CisgICAgc2l6ZV90IGV4dHJhU2F0dXJhdGlvbk1hcmdpbjsKK307CisKK3N0cnVjdCBBRUNQYXJhbXMgeworICAgIHNpemVfdCBlY2hvRGVsYXk7Cit9OworCitzdHJ1Y3QgTlNQYXJhbXMgeworICAgIHNpemVfdCBsZXZlbDsKK307CisKK3N0cnVjdCBQcmVQcm9jUGFyYW1zIHsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkOworICAgIHVuaW9uIHsKKyAgICAgICAgQUdDUGFyYW1zIGFnY1BhcmFtczsKKyAgICAgICAgQUdDMlBhcmFtcyBhZ2MyUGFyYW1zOworICAgICAgICBBRUNQYXJhbXMgYWVjUGFyYW1zOworICAgICAgICBOU1BhcmFtcyBuc1BhcmFtczsKKyAgICB9OworfTsKKworLy8gQ3JlYXRlIGEgbGlzdCBvZiBwcmUtcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgZm9yIHRlc3RpbmcKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxQcmVQcm9jUGFyYW1zPiBrUHJlUHJvY1BhcmFtcyA9IFtdIHsKKyAgICBzdGQ6OnZlY3RvcjxQcmVQcm9jUGFyYW1zPiByZXN1bHQ7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gdGFyZ2V0TGV2ZWwgOiBrQUdDVGFyZ2V0TGV2ZWxzKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byBjb21wTGV2ZWwgOiBrQUdDQ29tcExldmVscykgeworICAgICAgICAgICAgQUdDUGFyYW1zIGFnY1BhcmFtcyA9IHsudGFyZ2V0TGV2ZWwgPSB0YXJnZXRMZXZlbCwgLmNvbXBMZXZlbCA9IGNvbXBMZXZlbH07CisgICAgICAgICAgICBQcmVQcm9jUGFyYW1zIHBhcmFtcyA9IHsudXVpZCA9ICZrQUdDVXVpZCwgLmFnY1BhcmFtcyA9IGFnY1BhcmFtc307CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gZml4ZWREaWdpdGFsR2FpbiA6IGtBR0MyRml4ZWREaWdpdGFsR2FpbnMpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIGFkYXB0RGlnaUxldmVsRXN0aW1hdG9yIDoga0FHQzJBZGFwdEdpZ2l0YWxMZXZlbEVzdGltYXRvcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBleHRyYVNhdHVyYXRpb25NYXJnaW4gOiBrQUdDMkV4dHJhU2F0dXJhdGlvbk1hcmdpbnMpIHsKKyAgICAgICAgICAgICAgICBBR0MyUGFyYW1zIGFnYzJQYXJhbXMgPSB7LmZpeGVkRGlnaXRhbEdhaW4gPSBmaXhlZERpZ2l0YWxHYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRhcHREaWdpTGV2ZWxFc3RpbWF0b3IgPSBhZGFwdERpZ2lMZXZlbEVzdGltYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dHJhU2F0dXJhdGlvbk1hcmdpbiA9IGV4dHJhU2F0dXJhdGlvbk1hcmdpbn07CisgICAgICAgICAgICAgICAgUHJlUHJvY1BhcmFtcyBwYXJhbXMgPSB7LnV1aWQgPSAma0FHQzJVdWlkLCAuYWdjMlBhcmFtcyA9IGFnYzJQYXJhbXN9OworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byBlY2hvRGVsYXkgOiBrQUVDRWNob0RlbGF5cykgeworICAgICAgICBBRUNQYXJhbXMgYWVjUGFyYW1zID0gey5lY2hvRGVsYXkgPSBlY2hvRGVsYXl9OworICAgICAgICBQcmVQcm9jUGFyYW1zIHBhcmFtcyA9IHsudXVpZCA9ICZrQUVDVXVpZCwgLmFlY1BhcmFtcyA9IGFlY1BhcmFtc307CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyYW1zKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gbGV2ZWwgOiBrTlNMZXZlbHMpIHsKKyAgICAgICAgTlNQYXJhbXMgbnNQYXJhbXMgPSB7LmxldmVsID0gbGV2ZWx9OworICAgICAgICBQcmVQcm9jUGFyYW1zIHBhcmFtcyA9IHsudXVpZCA9ICZrTlNVdWlkLCAubnNQYXJhbXMgPSBuc1BhcmFtc307CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2socGFyYW1zKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30oKTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtUHJlUHJvY1BhcmFtcyA9IHN0ZDo6c2l6ZShrUHJlUHJvY1BhcmFtcyk7CisKK3ZvaWQgc2V0UHJlUHJvY1BhcmFtcyhjb25zdCBlZmZlY3RfdXVpZF90KiB1dWlkLCBFZmZlY3RUZXN0SGVscGVyJiBlZmZlY3QsIHNpemVfdCBwYXJhbUlkeCkgeworICAgIGNvbnN0IFByZVByb2NQYXJhbXMqIHBhcmFtcyA9ICZrUHJlUHJvY1BhcmFtc1twYXJhbUlkeF07CisgICAgaWYgKGlzQUdDRWZmZWN0KHV1aWQpKSB7CisgICAgICAgIGNvbnN0IEFHQ1BhcmFtcyogYWdjUGFyYW1zID0gJnBhcmFtcy0+YWdjUGFyYW1zOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0UGFyYW0oQUdDX1BBUkFNX1RBUkdFVF9MRVZFTCwgYWdjUGFyYW1zLT50YXJnZXRMZXZlbCkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3Quc2V0UGFyYW0oQUdDX1BBUkFNX0NPTVBfR0FJTiwgYWdjUGFyYW1zLT5jb21wTGV2ZWwpKTsKKyAgICB9IGVsc2UgaWYgKGlzQUdDMkVmZmVjdCh1dWlkKSkgeworICAgICAgICBjb25zdCBBR0MyUGFyYW1zKiBhZ2MyUGFyYW1zID0gJnBhcmFtcy0+YWdjMlBhcmFtczsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICAgICAgZWZmZWN0LnNldFBhcmFtKEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOLCBhZ2MyUGFyYW1zLT5maXhlZERpZ2l0YWxHYWluKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRQYXJhbShBR0MyX1BBUkFNX0FEQVBUX0RJR0lfTEVWRUxfRVNUSU1BVE9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdjMlBhcmFtcy0+YWRhcHREaWdpTGV2ZWxFc3RpbWF0b3IpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldFBhcmFtKEFHQzJfUEFSQU1fQURBUFRfRElHSV9FWFRSQV9TQVRVUkFUSU9OX01BUkdJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYzJQYXJhbXMtPmV4dHJhU2F0dXJhdGlvbk1hcmdpbikpOworICAgIH0gZWxzZSBpZiAoaXNBRUNFZmZlY3QodXVpZCkpIHsKKyAgICAgICAgY29uc3QgQUVDUGFyYW1zKiBhZWNQYXJhbXMgPSAmcGFyYW1zLT5hZWNQYXJhbXM7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRQYXJhbShBRUNfUEFSQU1fRUNIT19ERUxBWSwgYWVjUGFyYW1zLT5lY2hvRGVsYXkpKTsKKyAgICB9IGVsc2UgaWYgKGlzTlNFZmZlY3QodXVpZCkpIHsKKyAgICAgICAgY29uc3QgTlNQYXJhbXMqIG5zUGFyYW1zID0gJnBhcmFtcy0+bnNQYXJhbXM7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5zZXRQYXJhbShOU19QQVJBTV9MRVZFTCwgbnNQYXJhbXMtPmxldmVsKSk7CisgICAgfQorfQorCit0eXBlZGVmIHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RUZXN0UGFyYW07CitjbGFzcyBTaW5nbGVFZmZlY3RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxTaW5nbGVFZmZlY3RUZXN0UGFyYW0+IHsKKyAgcHVibGljOgorICAgIFNpbmdsZUVmZmVjdFRlc3QoKQorICAgICAgICA6IG1TYW1wbGVSYXRlKEVmZmVjdFRlc3RIZWxwZXI6OmtTYW1wbGVSYXRlc1tzdGQ6OmdldDwxPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1GcmFtZUNvdW50KG1TYW1wbGVSYXRlICogRWZmZWN0VGVzdEhlbHBlcjo6a1Rlbk1pbGxpU2VjVmFsKSwKKyAgICAgICAgICBtTG9vcENvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtMb29wQ291bnRzW3N0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudChtRnJhbWVDb3VudCAqIG1Mb29wQ291bnQpLAorICAgICAgICAgIG1DaE1hc2soRWZmZWN0VGVzdEhlbHBlcjo6a0NoTWFza3Nbc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSldKSwKKyAgICAgICAgICBtQ2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaE1hc2spKSwKKyAgICAgICAgICBtUGFyYW1JZHgoc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSkpLAorICAgICAgICAgIG1VdWlkKGtQcmVQcm9jUGFyYW1zW21QYXJhbUlkeF0udXVpZCl7fTsKKworICAgIGNvbnN0IHNpemVfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Mb29wQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1Ub3RhbEZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1DaE1hc2s7CisgICAgY29uc3Qgc2l6ZV90IG1DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90IG1QYXJhbUlkeDsKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKK307CisKKy8vIFRlc3RzIGFwcGx5aW5nIGEgc2luZ2xlIGVmZmVjdAorVEVTVF9QKFNpbmdsZUVmZmVjdFRlc3QsIFNpbXBsZVByb2Nlc3MpIHsKKyAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpIDw8ICIgY2hNYXNrOiAiIDw8IG1DaE1hc2sgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50IDw8ICIgcGFyYW1JZHggIiA8PCBtUGFyYW1JZHgpOworCisgICAgRWZmZWN0VGVzdEhlbHBlciBlZmZlY3QobVV1aWQsIG1DaE1hc2ssIG1TYW1wbGVSYXRlLCBtTG9vcENvdW50KTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZWZmZWN0LnNldENvbmZpZyhpc0FFQ0VmZmVjdChtVXVpZCkpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRQcmVQcm9jUGFyYW1zKG1VdWlkLCBlZmZlY3QsIG1QYXJhbUlkeCkpOworCisgICAgLy8gSW5pdGlhbGl6ZSBpbnB1dCBidWZmZXIgd2l0aCBkZXRlcm1pbmlzdGljIHBzZXVkby1yYW5kb20gdmFsdWVzCisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gaW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IG91dHB1dChtVG90YWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gZmFySW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgIHN0ZDo6bWluc3RkX3JhbmQgZ2VuKG1DaE1hc2spOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludDE2X3Q+IGRpcyhJTlQxNl9NSU4sIElOVDE2X01BWCk7CisgICAgZm9yIChhdXRvJiBpbiA6IGlucHV0KSB7CisgICAgICAgIGluID0gZGlzKGdlbik7CisgICAgfQorICAgIGlmIChpc0FFQ0VmZmVjdChtVXVpZCkpIHsKKyAgICAgICAgZm9yIChhdXRvJiBmYXJJbiA6IGZhcklucHV0KSB7CisgICAgICAgICAgICBmYXJJbiA9IGRpcyhnZW4pOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGVmZmVjdC5wcm9jZXNzKGlucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSwgaXNBRUNFZmZlY3QobVV1aWQpKSk7CisgICAgaWYgKGlzQUVDRWZmZWN0KG1VdWlkKSkgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucHJvY2Vzc19yZXZlcnNlKGZhcklucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSkpOworICAgIH0KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShlZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBQcmVQcm9jVGVzdEFsbCwgU2luZ2xlRWZmZWN0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpDb21iaW5lKDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtQ2hNYXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bVNhbXBsZVJhdGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6UmFuZ2UoMCwgKGludClFZmZlY3RUZXN0SGVscGVyOjprTnVtTG9vcENvdW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpa051bVByZVByb2NQYXJhbXMpKSk7CisKK3R5cGVkZWYgc3RkOjp0dXBsZTxpbnQsIGludCwgaW50PiBTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdFBhcmFtOworY2xhc3MgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08U2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3RQYXJhbT4geworICBwdWJsaWM6CisgICAgU2luZ2xlRWZmZWN0Q29tcGFyaXNvblRlc3QoKQorICAgICAgICA6IG1TYW1wbGVSYXRlKEVmZmVjdFRlc3RIZWxwZXI6OmtTYW1wbGVSYXRlc1tzdGQ6OmdldDwwPihHZXRQYXJhbSgpKV0pLAorICAgICAgICAgIG1GcmFtZUNvdW50KG1TYW1wbGVSYXRlICogRWZmZWN0VGVzdEhlbHBlcjo6a1Rlbk1pbGxpU2VjVmFsKSwKKyAgICAgICAgICBtTG9vcENvdW50KEVmZmVjdFRlc3RIZWxwZXI6OmtMb29wQ291bnRzW3N0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpXSksCisgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudChtRnJhbWVDb3VudCAqIG1Mb29wQ291bnQpLAorICAgICAgICAgIG1QYXJhbUlkeChzdGQ6OmdldDwyPihHZXRQYXJhbSgpKSksCisgICAgICAgICAgbVV1aWQoa1ByZVByb2NQYXJhbXNbbVBhcmFtSWR4XS51dWlkKXt9OworCisgICAgY29uc3Qgc2l6ZV90IG1TYW1wbGVSYXRlOworICAgIGNvbnN0IHNpemVfdCBtRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbUxvb3BDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVRvdGFsRnJhbWVDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVBhcmFtSWR4OworICAgIGNvbnN0IGVmZmVjdF91dWlkX3QqIG1VdWlkOworfTsKKworLy8gQ29tcGFyZXMgZmlyc3QgY2hhbm5lbCBpbiBtdWx0aS1jaGFubmVsIG91dHB1dCB0byBtb25vIG91dHB1dCB3aGVuIHNhbWUgZWZmZWN0IGlzIGFwcGxpZWQKK1RFU1RfUChTaW5nbGVFZmZlY3RDb21wYXJpc29uVGVzdCwgU2ltcGxlUHJvY2VzcykgeworICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIiBzYW1wbGVSYXRlOiAiIDw8IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGxvb3BDb3VudDogIiA8PCBtTG9vcENvdW50IDw8ICIgcGFyYW1JZHggIiA8PCBtUGFyYW1JZHgpOworCisgICAgLy8gSW5pdGlhbGl6ZSBtb25vIGlucHV0IGJ1ZmZlciB3aXRoIGRldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSB2YWx1ZXMKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vSW5wdXQobVRvdGFsRnJhbWVDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gbW9ub0ZhcklucHV0KG1Ub3RhbEZyYW1lQ291bnQpOworCisgICAgc3RkOjptaW5zdGRfcmFuZCBnZW4obVNhbXBsZVJhdGUpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludDE2X3Q+IGRpcyhJTlQxNl9NSU4sIElOVDE2X01BWCk7CisgICAgZm9yIChhdXRvJiBpbiA6IG1vbm9JbnB1dCkgeworICAgICAgICBpbiA9IGRpcyhnZW4pOworICAgIH0KKyAgICBpZiAoaXNBRUNFZmZlY3QobVV1aWQpKSB7CisgICAgICAgIGZvciAoYXV0byYgZmFySW4gOiBtb25vRmFySW5wdXQpIHsKKyAgICAgICAgICAgIGZhckluID0gZGlzKGdlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBcHBseSBlZmZlY3Qgb24gbW9ubyBjaGFubmVsCisgICAgRWZmZWN0VGVzdEhlbHBlciBtb25vRWZmZWN0KG1VdWlkLCBBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSwgbVNhbXBsZVJhdGUsIG1Mb29wQ291bnQpOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUobW9ub0VmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUobW9ub0VmZmVjdC5zZXRDb25maWcoaXNBRUNFZmZlY3QobVV1aWQpKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0UHJlUHJvY1BhcmFtcyhtVXVpZCwgbW9ub0VmZmVjdCwgbVBhcmFtSWR4KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiBtb25vT3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgbW9ub0VmZmVjdC5wcm9jZXNzKG1vbm9JbnB1dC5kYXRhKCksIG1vbm9PdXRwdXQuZGF0YSgpLCBpc0FFQ0VmZmVjdChtVXVpZCkpKTsKKyAgICBpZiAoaXNBRUNFZmZlY3QobVV1aWQpKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKG1vbm9FZmZlY3QucHJvY2Vzc19yZXZlcnNlKG1vbm9GYXJJbnB1dC5kYXRhKCksIG1vbm9PdXRwdXQuZGF0YSgpKSk7CisgICAgfQorICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKG1vbm9FZmZlY3QucmVsZWFzZUVmZmVjdCgpKTsKKworICAgIGZvciAoc2l6ZV90IGNoTWFzayA6IEVmZmVjdFRlc3RIZWxwZXI6OmtDaE1hc2tzKSB7CisgICAgICAgIHNpemVfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaE1hc2spOworCisgICAgICAgIEVmZmVjdFRlc3RIZWxwZXIgdGVzdEVmZmVjdChtVXVpZCwgY2hNYXNrLCBtU2FtcGxlUmF0ZSwgbUxvb3BDb3VudCk7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdEVmZmVjdC5jcmVhdGVFZmZlY3QoKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHRlc3RFZmZlY3Quc2V0Q29uZmlnKGlzQUVDRWZmZWN0KG1VdWlkKSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRQcmVQcm9jUGFyYW1zKG1VdWlkLCB0ZXN0RWZmZWN0LCBtUGFyYW1JZHgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiB0ZXN0SW5wdXQobVRvdGFsRnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludDE2X3Q+IHRlc3RGYXJJbnB1dChtVG90YWxGcmFtZUNvdW50ICogY2hhbm5lbENvdW50KTsKKworICAgICAgICAvLyBSZXBlYXQgbW9ubyBjaGFubmVsIGRhdGEgdG8gYWxsIHRoZSBjaGFubmVscworICAgICAgICAvLyBhZGp1c3RfY2hhbm5lbHMoKSB6ZXJvIGZpbGxzIGNoYW5uZWxzID4gMiwgaGVuY2UgY2FuJ3QgYmUgdXNlZCBoZXJlCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvdGFsRnJhbWVDb3VudDsgKytpKSB7CisgICAgICAgICAgICBhdXRvKiBmcElucHV0ID0gJnRlc3RJbnB1dFtpICogY2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgIHN0ZDo6ZmlsbChmcElucHV0LCBmcElucHV0ICsgY2hhbm5lbENvdW50LCBtb25vSW5wdXRbaV0pOworICAgICAgICB9CisgICAgICAgIGlmIChpc0FFQ0VmZmVjdChtVXVpZCkpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvdGFsRnJhbWVDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgYXV0byogZnBGYXJJbnB1dCA9ICZ0ZXN0RmFySW5wdXRbaSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICAgICAgc3RkOjpmaWxsKGZwRmFySW5wdXQsIGZwRmFySW5wdXQgKyBjaGFubmVsQ291bnQsIG1vbm9GYXJJbnB1dFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQxNl90PiB0ZXN0T3V0cHV0KG1Ub3RhbEZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICB0ZXN0RWZmZWN0LnByb2Nlc3ModGVzdElucHV0LmRhdGEoKSwgdGVzdE91dHB1dC5kYXRhKCksIGlzQUVDRWZmZWN0KG1VdWlkKSkpOworICAgICAgICBpZiAoaXNBRUNFZmZlY3QobVV1aWQpKSB7CisgICAgICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICAgICAgdGVzdEVmZmVjdC5wcm9jZXNzX3JldmVyc2UodGVzdEZhcklucHV0LmRhdGEoKSwgdGVzdE91dHB1dC5kYXRhKCkpKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh0ZXN0RWZmZWN0LnJlbGVhc2VFZmZlY3QoKSk7CisKKyAgICAgICAgLy8gQWRqdXN0IHRoZSB0ZXN0IG91dHB1dCB0byBtb25vIGNoYW5uZWwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MTZfdD4gbW9ub1Rlc3RPdXRwdXQobVRvdGFsRnJhbWVDb3VudCk7CisgICAgICAgIGFkanVzdF9jaGFubmVscyh0ZXN0T3V0cHV0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBtb25vVGVzdE91dHB1dC5kYXRhKCksIEZDQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDE2X3QpLCBtVG90YWxGcmFtZUNvdW50ICogc2l6ZW9mKGludDE2X3QpICogY2hhbm5lbENvdW50KTsKKworICAgICAgICBBU1NFUlRfRVEoMCwgbWVtY21wKG1vbm9PdXRwdXQuZGF0YSgpLCBtb25vVGVzdE91dHB1dC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvdGFsRnJhbWVDb3VudCAqIHNpemVvZihpbnQxNl90KSkpCisgICAgICAgICAgICAgICAgPDwgIk1vbm8gY2hhbm5lbCBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggd2l0aCByZWZlcmVuY2Ugb3V0cHV0IFxuIjsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgUHJlUHJvY1Rlc3RBbGwsIFNpbmdsZUVmZmVjdENvbXBhcmlzb25UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OkNvbWJpbmUoOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KUVmZmVjdFRlc3RIZWxwZXI6OmtOdW1TYW1wbGVSYXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlJhbmdlKDAsIChpbnQpRWZmZWN0VGVzdEhlbHBlcjo6a051bUxvb3BDb3VudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpSYW5nZSgwLCAoaW50KWtOdW1QcmVQcm9jUGFyYW1zKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjAwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvRWZmZWN0VGVzdEhlbHBlci5jcHAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkVmZmVjdFRlc3RIZWxwZXIuaCIKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OmNyZWF0ZUVmZmVjdCgpIHsKKyAgICBpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdChtVXVpZCwgMSwgMSwgJm1FZmZlY3RIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJjcmVhdGVfZWZmZWN0IHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnJlbGVhc2VFZmZlY3QoKSB7CisgICAgaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KG1FZmZlY3RIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJyZWxlYXNlX2VmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpzZXRDb25maWcoYm9vbCBjb25maWdSZXZlcnNlKSB7CisgICAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZ3t9OworICAgIGNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBjb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOworICAgIGNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBtQ2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworCisgICAgaW50IHN0YXR1cyA9ICgqbUVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X2NvbmZpZyByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKyAgICBBU1NFUlRfRVEocmVwbHksIDApIDw8ICJzZXRfY29uZmlnIHJlcGx5IG5vbiB6ZXJvICIgPDwgcmVwbHk7CisKKyAgICBpZiAoY29uZmlnUmV2ZXJzZSkgeworICAgICAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbW1hbmQobUVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgJmNvbmZpZywgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInNldF9jb25maWdfcmV2ZXJzZSByZXR1cm5lZCBhbiBlcnJvciAiIDw8IHN0YXR1czsKKyAgICAgICAgQVNTRVJUX0VRKHJlcGx5LCAwKSA8PCAic2V0X2NvbmZpZ19yZXZlcnNlIHJlcGx5IG5vbiB6ZXJvICIgPDwgcmVwbHk7CisgICAgfQorCisgICAgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKG1FZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJjbWRfZW5hYmxlIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgImNtZF9lbmFibGUgcmVwbHkgbm9uIHplcm8gIiA8PCByZXBseTsKK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpzZXRQYXJhbSh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCB2YWx1ZSkgeworICAgIGludCByZXBseSA9IDA7CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7dHlwZSwgdmFsdWV9OworICAgIGF1dG8gZWZmZWN0UGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QqKW1hbGxvYyhzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICBlZmZlY3RQYXJhbS0+dnNpemUgPSBzaXplb2YocGFyYW1EYXRhWzFdKTsKKyAgICBpbnQgc3RhdHVzID0gKCptRWZmZWN0SGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29tbWFuZChtRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHNpemVvZihwYXJhbURhdGEpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAic2V0X3BhcmFtIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworICAgIEFTU0VSVF9FUShyZXBseSwgMCkgPDwgInNldF9wYXJhbSByZXBseSBub24gemVybyAiIDw8IHJlcGx5OworfQorCit2b2lkIEVmZmVjdFRlc3RIZWxwZXI6OnByb2Nlc3MoaW50MTZfdCogaW5wdXQsIGludDE2X3QqIG91dHB1dCwgYm9vbCBzZXRBZWNFY2hvRGVsYXkpIHsKKyAgICBhdWRpb19idWZmZXJfdCBpbkJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50LCAuczE2ID0gaW5wdXR9OworICAgIGF1ZGlvX2J1ZmZlcl90IG91dEJ1ZmZlciA9IHsuZnJhbWVDb3VudCA9IG1GcmFtZUNvdW50LCAuczE2ID0gb3V0cHV0fTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Mb29wQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoc2V0QWVjRWNob0RlbGF5KSBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRQYXJhbShBRUNfUEFSQU1fRUNIT19ERUxBWSwga0FFQ0RlbGF5KSk7CisgICAgICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpLT5wcm9jZXNzKG1FZmZlY3RIYW5kbGUsICZpbkJ1ZmZlciwgJm91dEJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJwcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICIgPDwgc3RhdHVzOworCisgICAgICAgIGluQnVmZmVyLnMxNiArPSBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgICAgIG91dEJ1ZmZlci5zMTYgKz0gbUZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgIH0KK30KKwordm9pZCBFZmZlY3RUZXN0SGVscGVyOjpwcm9jZXNzX3JldmVyc2UoaW50MTZfdCogZmFySW5wdXQsIGludDE2X3QqIG91dHB1dCkgeworICAgIGF1ZGlvX2J1ZmZlcl90IGZhckluQnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5zMTYgPSBmYXJJbnB1dH07CisgICAgYXVkaW9fYnVmZmVyX3Qgb3V0QnVmZmVyID0gey5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQsIC5zMTYgPSBvdXRwdXR9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxvb3BDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBzdGF0dXMgPSAoKm1FZmZlY3RIYW5kbGUpLT5wcm9jZXNzX3JldmVyc2UobUVmZmVjdEhhbmRsZSwgJmZhckluQnVmZmVyLCAmb3V0QnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgInByb2Nlc3MgcmV0dXJuZWQgYW4gZXJyb3IgIiA8PCBzdGF0dXM7CisKKyAgICAgICAgZmFySW5CdWZmZXIuczE2ICs9IG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3V0QnVmZmVyLnMxNiArPSBtRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0VmZmVjdFRlc3RIZWxwZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3Y2Y3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9FZmZlY3RUZXN0SGVscGVyLmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGZsb2F0IGNvbXB1dGVTbnIoY29uc3QgVCogcmVmLCBjb25zdCBUKiB0c3QsIHNpemVfdCBjb3VudCkgeworICAgIGRvdWJsZSBzaWduYWx7fTsKKyAgICBkb3VibGUgbm9pc2V7fTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBkb3VibGUgdmFsdWUocmVmW2ldKTsKKyAgICAgICAgY29uc3QgZG91YmxlIGRpZmYodHN0W2ldIC0gdmFsdWUpOworICAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgfQorICAgIC8vIEluaXRpYWxpemVkIHRvIGxhcmdlIHZhbHVlIHRvIGhhbmRsZQorICAgIC8vIGNhc2VzIHdoZXJlIHJlZiBhbmQgdHN0IG1hdGNoIGV4YWN0bHkKKyAgICBmbG9hdCBzbnIgPSBGTFRfTUFYOworICAgIGlmIChzaWduYWwgPiAwLjBmICYmIG5vaXNlID4gMC4wZikgeworICAgICAgICBzbnIgPSAxMC5mICogbG9nKHNpZ25hbCAvIG5vaXNlKTsKKyAgICB9CisgICAgcmV0dXJuIHNucjsKK30KKworY2xhc3MgRWZmZWN0VGVzdEhlbHBlciB7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RUZXN0SGVscGVyKGNvbnN0IGVmZmVjdF91dWlkX3QqIHV1aWQsIHNpemVfdCBjaE1hc2ssIHNpemVfdCBzYW1wbGVSYXRlLCBzaXplX3QgbG9vcENvdW50KQorICAgICAgICA6IG1VdWlkKHV1aWQpLAorICAgICAgICAgIG1DaE1hc2soY2hNYXNrKSwKKyAgICAgICAgICBtQ2hhbm5lbENvdW50KGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaE1hc2spKSwKKyAgICAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKKyAgICAgICAgICBtRnJhbWVDb3VudChtU2FtcGxlUmF0ZSAqIGtUZW5NaWxsaVNlY1ZhbCksCisgICAgICAgICAgbUxvb3BDb3VudChsb29wQ291bnQpIHt9CisgICAgdm9pZCBjcmVhdGVFZmZlY3QoKTsKKyAgICB2b2lkIHJlbGVhc2VFZmZlY3QoKTsKKyAgICB2b2lkIHNldENvbmZpZyhib29sIGNvbmZpZ1JldmVyc2UpOworICAgIHZvaWQgc2V0UGFyYW0odWludDMyX3QgdHlwZSwgdWludDMyX3QgdmFsKTsKKyAgICB2b2lkIHByb2Nlc3MoaW50MTZfdCogaW5wdXQsIGludDE2X3QqIG91dHB1dCwgYm9vbCBzZXRBZWNFY2hvRGVsYXkpOworICAgIHZvaWQgcHJvY2Vzc19yZXZlcnNlKGludDE2X3QqIGZhcklucHV0LCBpbnQxNl90KiBvdXRwdXQpOworCisgICAgLy8gQ29ycmVzcG9uZHMgdG8gU05SIGZvciAxIGJpdCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGludDE2X3Qgc2lnbmFscworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1NOUlRocmVzaG9sZCA9IDkwLjMwODk5ODsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgYXVkaW9fY2hhbm5lbF9tYXNrX3Qga0NoTWFza3NbXSA9IHsKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQwUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQxUE9JTlQyLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxLAorICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LX01PTk8sCisgICAgICAgICAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTywKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga051bUNoTWFza3MgPSBzdGQ6OnNpemUoa0NoTWFza3MpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga1NhbXBsZVJhdGVzW10gPSB7ODAwMCwgIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1TYW1wbGVSYXRlcyA9IHN0ZDo6c2l6ZShrU2FtcGxlUmF0ZXMpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0xvb3BDb3VudHNbXSA9IHsxLCA0fTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtOdW1Mb29wQ291bnRzID0gc3RkOjpzaXplKGtMb29wQ291bnRzKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtBRUNEZWxheSA9IDA7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBlZmZlY3RfdXVpZF90KiBtVXVpZDsKKyAgICBjb25zdCBzaXplX3QgbUNoTWFzazsKKyAgICBjb25zdCBzaXplX3QgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgbVNhbXBsZVJhdGU7CisgICAgY29uc3Qgc2l6ZV90IG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCBtTG9vcENvdW50OworICAgIGVmZmVjdF9oYW5kbGVfdCBtRWZmZWN0SGFuZGxle307Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkOTNmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MuaD4KKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9hZ2MyLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBpbXBvcnRlZAorZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsb2NhbCBkZWZpbml0aW9ucworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gdHlwZXMgb2YgcHJlIHByb2Nlc3NpbmcgbW9kdWxlcworZW51bSBQcmVQcm9jSWQgeworICAgIFBSRVBST0NfQUdDLCAgLy8gQXV0b21hdGljIEdhaW4gQ29udHJvbAorICAgIFBSRVBST0NfQUdDMiwgIC8vIEF1dG9tYXRpYyBHYWluIENvbnRyb2wgMgorICAgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICAgIFBSRVBST0NfTlMsICAgLy8gTm9pc2UgU3VwcHJlc3NvcgorICAgIFBSRVBST0NfTlVNX0VGRkVDVFMKK307CisKK2VudW0gUHJlUHJvY1BhcmFtcyB7CisgICAgQVJHX0hFTFAgPSAxLAorICAgIEFSR19JTlBVVCwKKyAgICBBUkdfT1VUUFVULAorICAgIEFSR19GQVIsCisgICAgQVJHX0ZTLAorICAgIEFSR19DSF9NQVNLLAorICAgIEFSR19BR0NfVEdUX0xWTCwKKyAgICBBUkdfQUdDX0NPTVBfTFZMLAorICAgIEFSR19BRUNfREVMQVksCisgICAgQVJHX05TX0xWTCwKKyAgICBBUkdfQUdDMl9HQUlOLAorICAgIEFSR19BR0MyX0xWTCwKKyAgICBBUkdfQUdDMl9TQVRfTUdOLAorICAgIEFSR19GSUxFX0NIQU5ORUxTLAorICAgIEFSR19NT05PX01PREUKK307CisKK3N0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgeworICAgIGludCBzYW1wbGluZ0ZyZXEgPSAxNjAwMDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX01PTk87CisgICAgaW50IG5zTGV2ZWwgPSAwOyAgICAgICAgIC8vIGEgdmFsdWUgYmV0d2VlbiAwLTMKKyAgICBpbnQgYWdjVGFyZ2V0TGV2ZWwgPSAzOyAgLy8gaW4gZEIKKyAgICBpbnQgYWdjQ29tcExldmVsID0gOTsgICAgLy8gaW4gZEIKKyAgICBmbG9hdCBhZ2MyR2FpbiA9IDAuZjsgICAgICAgICAgICAgIC8vIGluIGRCCisgICAgZmxvYXQgYWdjMlNhdHVyYXRpb25NYXJnaW4gPSAyLmY7ICAvLyBpbiBkQgorICAgIGludCBhZ2MyTGV2ZWwgPSAwOyAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIGtSbXMoMCkgb3Iga1BlYWsoMSkKKyAgICBpbnQgYWVjRGVsYXkgPSAwOyAgLy8gaW4gbXMKKyAgICBpbnQgZmlsZUNoYW5uZWxzID0gMTsKKyAgICBpbnQgbW9ub01vZGUgPSAwOworfTsKKworY29uc3QgZWZmZWN0X3V1aWRfdCBrUHJlUHJvY1V1aWRzW1BSRVBST0NfTlVNX0VGRkVDVFNdID0geworICAgICAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIGFnYyB1dWlkCisgICAgICAgIHsweDg5ZjM4ZTY1LCAweGQ0ZDIsIDB4NGQ2NCwgMHhhZDBlLCB7MHgyYiwgMHgzZSwgMHg3OSwgMHg5ZSwgMHhhOCwgMHg4Nn19LCAgLy8gYWdjMiB1dWlkCisgICAgICAgIHsweGJiMzkyZWMwLCAweDhkNGQsIDB4MTFlMCwgMHhhODk2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gYWVjIHV1aWQKKyAgICAgICAgezB4YzA2Yzg0MDAsIDB4OGUwNiwgMHgxMWUwLCAweDljYjYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBucyAgdXVpZAorfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW10gPSB7CisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIsCisgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSwKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTywKKyAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9DQUxMX01PTk8sCit9OworCitjb25zdGV4cHIgaW50IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQgPSBzdGQ6OnNpemUoa1ByZVByb2NDb25maWdDaE1hc2spOworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgICAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgICBwcmludGYoIlxud2hlcmUgb3B0aW9ucyBhcmUsICIpOworICAgIHByaW50ZigiXG4gICAgIC0taW5wdXQgPGlucHV0ZmlsZT4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1vdXRwdXQgPG91dHB1dGZpbGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICAgIHByaW50ZigiXG4gICAgIC0tZnMgPHNhbXBsaW5nX2ZyZXE+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDE2MDAwLiIpOworICAgIHByaW50ZigiXG4gICAgIC0tY2hfbWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDAgIC0gQVVESU9fQ0hBTk5FTF9JTl9NT05PIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDEgIC0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMyAgLSBBVURJT19DSEFOTkVMX0lOXzYiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNCAgLSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgOCAgLSBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PIik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgIDEwIC0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTyAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyAiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgZGVmYXVsdCAwIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1mYXIgPGZhcmVuZF9maWxlPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIFBhdGggdG8gZmFyLWVuZCBmaWxlIG5lZWRlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24iKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFlYyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFY2hvIENhbmNlbGxhdGlvbiwgZGVmYXVsdCBkaXNhYmxlZCIpOworICAgIHByaW50ZigiXG4gICAgIC0tbnMiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgTm9pc2UgU3VwcHJlc3Npb24sIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFnYyIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBHYWluIENvbnRyb2wsIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFnYzIiKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgR2FpbiBDb250cm9sbGVyIDIsIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgICBwcmludGYoIlxuICAgICAtLW5zX2x2bCA8bnNfbGV2ZWw+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgMGRCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfdGd0X2x2bCA8dGFyZ2V0X2xldmVsPiIpOworICAgIHByaW50ZigiXG4gICAgICAgICAgIEFHQyBUYXJnZXQgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgM2RCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfY29tcF9sdmwgPGNvbXBfbGV2ZWw+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIENvbXAgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgOWRCIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1hZ2MyX2dhaW4gPGZpeGVkX2RpZ2l0YWxfZ2Fpbj4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBR0MgRml4ZWQgRGlnaXRhbCBHYWluIGluIGRCLCBkZWZhdWx0IHZhbHVlIDBkQiIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWdjMl9sdmwgPGxldmVsX2VzdGltYXRvcj4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBR0MgQWRhcHRpdmUgRGlnaXRhbCBMZXZlbCBFc3RpbWF0b3IsIGRlZmF1bHQgdmFsdWUga1JtcyIpOworICAgIHByaW50ZigiXG4gICAgIC0tYWdjMl9zYXRfbWduIDxzYXR1cmF0aW9uX21hcmdpbj4iKTsKKyAgICBwcmludGYoIlxuICAgICAgICAgICBBR0MgQWRhcHRpdmUgRGlnaXRhbCBTYXR1cmF0aW9uIE1hcmdpbiBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAyZEIiKTsKKyAgICBwcmludGYoIlxuICAgICAtLWFlY19kZWxheSA8ZGVsYXk+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgQUVDIGRlbGF5IHZhbHVlIGluIG1zLCBkZWZhdWx0IHZhbHVlIDBtcyIpOworICAgIHByaW50ZigiXG4gICAgIC0tZmNoIDxmaWxlQ2hhbm5lbHM+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBpbnB1dCBmaWxlIik7CisgICAgcHJpbnRmKCJcbiAgICAgLS1tb25vIDxNb25vIE1vZGU+Iik7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9kZSB0byBtYWtlIGRhdGEgb2YgYWxsIGNoYW5uZWxzIHRoZSBzYW1lIGFzIGZpcnN0IGNoYW5uZWwiKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QqIHBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QqIHBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5jcmVhdGVfZWZmZWN0KCZrUHJlUHJvY1V1aWRzW2VmZmVjdFR5cGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGlvSWQsIHBFZmZlY3RIYW5kbGUpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiQXVkaW8gUHJlcHJvY2Vzc2luZyBjcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIGlmIChlZmZlY3RUeXBlID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUdfUkVWRVJTRSwgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb25maWcsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgfQorICAgICgqKnBFZmZlY3RIYW5kbGUpCisgICAgICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksIHBDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJnJlcGx5KTsKKyAgICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgICAgaW50IHJlcGx5ID0gMDsKKyAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICAgIGVmZmVjdF9wYXJhbV90KiBlZmZlY3RQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICAgIG1lbWNweSgmZWZmZWN0UGFyYW0tPmRhdGFbMF0sICZwYXJhbURhdGFbMF0sIHNpemVvZihwYXJhbURhdGEpKTsKKyAgICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgICAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICAgIGZyZWUoZWZmZWN0UGFyYW0pOworICAgIHJldHVybiByZXBseTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICAgIGlmIChhcmdjID09IDEpIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIC8vIFByaW50IHRoZSBhcmd1bWVudHMgcGFzc2VkCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBpbnB1dEZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG91dHB1dEZpbGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIGZhckZpbGUgPSBudWxscHRyOworICAgIGludCBlZmZlY3RFbltQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHswfTsKKyAgICBzdHJ1Y3QgcHJlUHJvY0NvbmZpZ1BhcmFtc190IHByZVByb2NDZmdQYXJhbXMge307CisKKyAgICBjb25zdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7CisgICAgICAgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0hFTFB9LAorICAgICAgICAgICAgeyJpbnB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSU5QVVR9LAorICAgICAgICAgICAgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX09VVFBVVH0sCisgICAgICAgICAgICB7ImZhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRkFSfSwKKyAgICAgICAgICAgIHsiZnMiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZTfSwKKyAgICAgICAgICAgIHsiY2hfbWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQ0hfTUFTS30sCisgICAgICAgICAgICB7ImFnY190Z3RfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfVEdUX0xWTH0sCisgICAgICAgICAgICB7ImFnY19jb21wX2x2bCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDX0NPTVBfTFZMfSwKKyAgICAgICAgICAgIHsiYWdjMl9nYWluIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0MyX0dBSU59LAorICAgICAgICAgICAgeyJhZ2MyX2x2bCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDMl9MVkx9LAorICAgICAgICAgICAgeyJhZ2MyX3NhdF9tZ24iLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0FHQzJfU0FUX01HTn0sCisgICAgICAgICAgICB7ImFlY19kZWxheSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUVDX0RFTEFZfSwKKyAgICAgICAgICAgIHsibnNfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19OU19MVkx9LAorICAgICAgICAgICAgeyJhZWMiLCBub19hcmd1bWVudCwgJmVmZmVjdEVuW1BSRVBST0NfQUVDXSwgMX0sCisgICAgICAgICAgICB7ImFnYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BR0NdLCAxfSwKKyAgICAgICAgICAgIHsiYWdjMiIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BR0MyXSwgMX0sCisgICAgICAgICAgICB7Im5zIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX05TXSwgMX0sCisgICAgICAgICAgICB7ImZjaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRklMRV9DSEFOTkVMU30sCisgICAgICAgICAgICB7Im1vbm8iLCBub19hcmd1bWVudCwgJnByZVByb2NDZmdQYXJhbXMubW9ub01vZGUsIDF9LAorICAgICAgICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICAgIH07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBjb25zdCBpbnQgb3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2LCAiaTpvOiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CisgICAgICAgIGlmIChvcHQgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAob3B0KSB7CisgICAgICAgICAgICBjYXNlIEFSR19IRUxQOgorICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgQVJHX0lOUFVUOiB7CisgICAgICAgICAgICAgICAgaW5wdXRGaWxlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX09VVFBVVDogeworICAgICAgICAgICAgICAgIG91dHB1dEZpbGUgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfRkFSOiB7CisgICAgICAgICAgICAgICAgZmFyRmlsZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19GUzogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuc2FtcGxpbmdGcmVxID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQ0hfTUFTSzogeworICAgICAgICAgICAgICAgIGludCBjaE1hc2tJZHggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKGNoTWFza0lkeCA8IDAgb3IgY2hNYXNrSWR4ID4ga1ByZVByb2NDb25maWdDaE1hc2tDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2hhbm5lbCBNYXNrIGluZGV4IG5vdCBpbiBjb3JyZWN0IHJhbmdlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmNoTWFzayA9IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW2NoTWFza0lkeF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BR0NfVEdUX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjVGFyZ2V0TGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BR0NfQ09NUF9MVkw6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmFnY0NvbXBMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FHQzJfR0FJTjogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjMkdhaW4gPSBhdG9mKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19BR0MyX0xWTDogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWdjMkxldmVsID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBUkdfQUdDMl9TQVRfTUdOOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyU2F0dXJhdGlvbk1hcmdpbiA9IGF0b2Yob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQVJHX0FFQ19ERUxBWTogeworICAgICAgICAgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWVjRGVsYXkgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19OU19MVkw6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLm5zTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19GSUxFX0NIQU5ORUxTOiB7CisgICAgICAgICAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5maWxlQ2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFSR19NT05PX01PREU6IHsKKyAgICAgICAgICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLm1vbm9Nb2RlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVcbiIpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBpbnB1dEZwKGZvcGVuKGlucHV0RmlsZSwgInJiIiksICZmY2xvc2UpOworICAgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGlucHV0RmlsZSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBmYXJGcChmb3BlbihmYXJGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUVDXSkgeworICAgICAgICBpZiAoZmFyRmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFyIGVuZCBzaWduYWwgZmlsZSByZXF1aXJlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24gXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhckZwID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBmYXIgZW5kIHN0cmVhbSBmaWxlICVzXG4iLCBmYXJGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0IHN0YXQgc3RhdElucHV0LCBzdGF0RmFyOworICAgICAgICAodm9pZClmc3RhdChmaWxlbm8oaW5wdXRGcC5nZXQoKSksICZzdGF0SW5wdXQpOworICAgICAgICAodm9pZClmc3RhdChmaWxlbm8oZmFyRnAuZ2V0KCkpLCAmc3RhdEZhcik7CisgICAgICAgIGlmIChzdGF0SW5wdXQuc3Rfc2l6ZSAhPSBzdGF0RmFyLnN0X3NpemUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJOZWFyIGFuZCBmYXIgZW5kIHNpZ25hbHMgYXJlIG9mIGRpZmZlcmVudCBzaXplcyIpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxscHRyICYmIG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgICAgaW50MzJfdCBpb0lkID0gMTsKKyAgICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge251bGxwdHJ9OworICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CisgICAgY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gcHJlUHJvY0NmZ1BhcmFtcy5zYW1wbGluZ0ZyZXE7CisgICAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHByZVByb2NDZmdQYXJhbXMuY2hNYXNrOworICAgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisgICAgLy8gQ3JlYXRlIGFsbCB0aGUgZWZmZWN0IGhhbmRsZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NDcmVhdGVFZmZlY3QoJmVmZmVjdEhhbmRsZVtpXSwgaSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3JlYXRlIGVmZmVjdCBjYWxsIHJldHVybmVkIGVycm9yICVpIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgICBpZiAoZWZmZWN0RW5baV0gPT0gMSkgeworICAgICAgICAgICAgaW50IHJlcGx5ID0gMDsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZVtpXSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICAgICAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCBDb25maWcgUGFyYW1zIG9mIHRoZSBlZmZlY3RzCisgICAgaWYgKGVmZmVjdEVuW1BSRVBST0NfQUdDXSkgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUdDXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDIFRhcmdldCBMZXZlbC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQ19QQVJBTV9DT01QX0dBSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY0NvbXBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUdDXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDIENvbXAgR2Fpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RFbltQUkVQUk9DX0FHQzJdKSB7CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY1NldENvbmZpZ1BhcmFtKEFHQzJfUEFSQU1fRklYRURfRElHSVRBTF9HQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpcHJlUHJvY0NmZ1BhcmFtcy5hZ2MyR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfQUdDMl0pOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIEFHQzIgRml4ZWQgRGlnaXRhbCBHYWluLiBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDMl9QQVJBTV9BREFQVF9ESUdJX0xFVkVMX0VTVElNQVRPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWdjMkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0MyXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDMiBMZXZlbCBFc3RpbWF0b3IuIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0MyX1BBUkFNX0FEQVBUX0RJR0lfRVhUUkFfU0FUVVJBVElPTl9NQVJHSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClwcmVQcm9jQ2ZnUGFyYW1zLmFnYzJTYXR1cmF0aW9uTWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BR0MyXSk7CisgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgQUdDMiBTYXR1cmF0aW9uIE1hcmdpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlZmZlY3RFbltQUkVQUk9DX05TXSkgeworICAgICAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShOU19QQVJBTV9MRVZFTCwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMubnNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlNdKTsKKyAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBOb2lzZSBTdXBwcmVzc2lvbiBsZXZlbCBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIENhbGwKKyAgICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgICAgY29uc3QgaW50IGlvQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2socHJlUHJvY0NmZ1BhcmFtcy5jaE1hc2spOworICAgIGNvbnN0IGludCBmaWxlQ2hhbm5lbENvdW50ID0gcHJlUHJvY0NmZ1BhcmFtcy5maWxlQ2hhbm5lbHM7CisgICAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgIGNvbnN0IGludCBpbkZyYW1lU2l6ZSA9IGZpbGVDaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICAgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNob3J0PiBpbihmcmFtZUxlbmd0aCAqIGlvQ2hhbm5lbENvdW50KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIGlvQ2hhbm5lbENvdW50KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGZhckluKGZyYW1lTGVuZ3RoICogaW9DaGFubmVsQ291bnQpOworICAgICAgICBzaXplX3Qgc2FtcGxlc1JlYWQgPSBmcmVhZChpbi5kYXRhKCksIGluRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgaW5wdXRGcC5nZXQoKSk7CisgICAgICAgIGlmIChzYW1wbGVzUmVhZCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZUNoYW5uZWxDb3VudCAhPSBpb0NoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKGluLmRhdGEoKSwgZmlsZUNoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUxlbmd0aCAqIGluRnJhbWVTaXplKTsKKyAgICAgICAgICAgIGlmIChwcmVQcm9jQ2ZnUGFyYW1zLm1vbm9Nb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byogZnAgPSAmaW5baSAqIGlvQ2hhbm5lbENvdW50XTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmaWxsKGZwICsgMSwgZnAgKyBpb0NoYW5uZWxDb3VudCwgKmZwKTsgIC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXI7CisgICAgICAgIGF1ZGlvX2J1ZmZlcl90IGZhckluQnVmZmVye307CisgICAgICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUxlbmd0aDsKKyAgICAgICAgb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUxlbmd0aDsKKyAgICAgICAgaW5wdXRCdWZmZXIuczE2ID0gaW4uZGF0YSgpOworICAgICAgICBvdXRwdXRCdWZmZXIuczE2ID0gb3V0LmRhdGEoKTsKKworICAgICAgICBpZiAoZmFyRnAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2FtcGxlc1JlYWQgPSBmcmVhZChmYXJJbi5kYXRhKCksIGluRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgZmFyRnAuZ2V0KCkpOworICAgICAgICAgICAgaWYgKHNhbXBsZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlQ2hhbm5lbENvdW50ICE9IGlvQ2hhbm5lbENvdW50KSB7CisgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzKGZhckluLmRhdGEoKSwgZmlsZUNoYW5uZWxDb3VudCwgZmFySW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBpbkZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHByZVByb2NDZmdQYXJhbXMubW9ub01vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8qIGZwID0gJmZhckluW2kgKiBpb0NoYW5uZWxDb3VudF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGlvQ2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmFySW5CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgICAgICAgICAgZmFySW5CdWZmZXIuczE2ID0gZmFySW4uZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlZmZlY3RFbltpXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUVDX1BBUkFNX0VDSE9fREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19BRUNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicHJlUHJvY1NldENvbmZpZ1BhcmFtIHJldHVybmVkIEVycm9yICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9ICgqZWZmZWN0SGFuZGxlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByb2Nlc3MoZWZmZWN0SGFuZGxlW2ldLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cHJvY2Vzc19yZXZlcnNlKGVmZmVjdEhhbmRsZVtpXSwgJmZhckluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgcmV2ZXJzZSBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChvdXRwdXRGcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoZmlsZUNoYW5uZWxDb3VudCAhPSBpb0NoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgZmlsZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2FtcGxlc1dyaXR0ZW4gPQorICAgICAgICAgICAgICAgICAgICBmd3JpdGUob3V0LmRhdGEoKSwgaW5GcmFtZVNpemUsIG91dHB1dEJ1ZmZlci5mcmFtZUNvdW50LCBvdXRwdXRGcC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc2FtcGxlc1dyaXR0ZW4gIT0gb3V0cHV0QnVmZmVyLmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogT3V0cHV0IGZpbGUgd3JpdGluZyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7CisgICAgfQorICAgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICAgIC8vIFJlbGVhc2UgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcyBjcmVhdGVkCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9FRkZFQ1RTOyBpKyspIHsKKyAgICAgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdChlZmZlY3RIYW5kbGVbaV0pOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIHJlbGVhc2UgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzVkYTEzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vYmFzaAorIworIyBSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9BdWRpb1ByZVByb2Nlc3NpbmdUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBQcmVQcm9jZXNzaW5nIG1vZHVsZXMiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9zbnIvYXJtNjQvc25yICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2lmIFsgLXogIiQxIiBdCit0aGVuCisgICAgY21kcz0oImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QvYXJtNjQvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCAkdGVzdGRpciIKKyAgICAgICAgICAiYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvQXVkaW9QcmVQcm9jZXNzaW5nVGVzdC9hcm0vQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCAkdGVzdGRpciIKKykKK2VsaWYgWyAiJDEiID09ICIzMiIgXQordGhlbgorICAgIGNtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QvYXJtL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QgJHRlc3RkaXIiCitlbGlmIFsgIiQxIiA9PSAiNjQiIF0KK3RoZW4KKyAgICBjbWRzPSJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9BdWRpb1ByZVByb2Nlc3NpbmdUZXN0L2FybTY0L0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QgJHRlc3RkaXIiCitlbHNlCisgICAgZWNobyAiIgorICAgIGVjaG8gIkludmFsaWQgXCJ2YWxcIiIKKyAgICBlY2hvICJVc2FnZToiCisgICAgZWNobyAiICAgICAgIiQwIiBbdmFsXSIKKyAgICBlY2hvICIgICAgICB3aGVyZSwgdmFsIGNhbiBiZSBlaXRoZXIgMzIgb3IgNjQuIgorICAgIGVjaG8gIiIKKyAgICBlY2hvICIgICAgICBJZiB2YWwgaXMgbm90IHNwZWNpZmllZCB0aGVuIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgYmluYXJpZXMiCisgICAgZWNobyAiICAgICAgYXJlIHRlc3RlZC4iCisgICAgZXhpdCAkRV9WQUwKK2ZpCisKK2ZsYWdzX2Fycj0oCisgICAgIi0tYWdjIC0tbW9ubyIKKyAgICAiLS1ucyAtLW1vbm8iCisgICAgIi0tYWdjMiAtLW1vbm8iCisgICAgIi0tYWVjIC0tbW9ubyIKKykKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTEwMjUKKyAgICAxMjAwMAorICAgIDE2MDAwCisgICAgMjIwNTAKKyAgICAyNDAwMAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorKQorCisjIHJ1biBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhdCBkaWZmZXJlbnQgY29uZmlncywgc2F2aW5nIG9ubHkgdGhlIG1vbm8gY2hhbm5lbAorZXJyb3JfY291bnQ9MAordGVzdF9jb3VudD0wCitmb3IgY21kIGluICIke2NtZHNbQF19IgorZG8KKyAgICAkY21kCisgICAgZm9yIGZsYWdzIGluICIke2ZsYWdzX2FycltAXX0iCisgICAgZG8KKyAgICAgICAgZm9yIGZzIGluICR7ZnNfYXJyWypdfQorICAgICAgICBkbworICAgICAgICAgICAgZm9yIGNoTWFzayBpbiB7MC4uN30KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL0F1ZGlvUHJlUHJvY2Vzc2luZ1Rlc3QgJGZsYWdzIFwKKyAgICAgICAgICAgICAgICAgICAgLS1pICR0ZXN0ZGlyL3NpbmVzd2VlcHJhdy5yYXcgLS1mYXIgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyAtLWNoX21hc2sgJGNoTWFzayBcCisgICAgICAgICAgICAgICAgICAgIC0tZnMgJGZzIC0tZmNoIDEKKworICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yIHNoZWxsX3JldCBoZXJlIGlzIHplcm86ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICgoKytlcnJvcl9jb3VudCkpCisgICAgICAgICAgICAgICAgZmkKKworCisgICAgICAgICAgICAgICAgIyBzaW5nbGUgY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAgICAgIyBjb21wdXRhdGlvbiAoZmlyc3QgY2hhbm5lbCkuCisgICAgICAgICAgICAgICAgaWYgIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2hNYXNrKSlfJCgoZnMpKS5yYXcKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBjbXAgcmV0dXJuIEVYSVRfRkFJTFVSRSBvbiBtaXNtYXRjaC4KKyAgICAgICAgICAgICAgICBzaGVsbF9yZXQ9JD8KKyAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBlY2hvICJlcnJvcjogJHNoZWxsX3JldCIKKyAgICAgICAgICAgICAgICAgICAgKCgrK2Vycm9yX2NvdW50KSkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICgoKyt0ZXN0X2NvdW50KSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCitlY2hvICIkdGVzdF9jb3VudCB0ZXN0cyBwZXJmb3JtZWQiCitlY2hvICIkZXJyb3JfY291bnQgZXJyb3JzIgorZXhpdCAkZXJyb3JfY291bnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9jb3JyZWxhdGlvbi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTZmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvdGVzdHMvY29ycmVsYXRpb24uY3BwCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY29uc3RleHByIGludCBrTWluTG9vcExpbWl0VmFsdWUgPSAxOworY29uc3RleHByIGludCBrTnVtUGVha3MgPSAzOworCisvKiEKKyAgXGJyaWVmICAgICAgICAgICBDb21wdXRlIHRoZSBsZW5ndGggbm9ybWFsaXplZCBjb3JyZWxhdGlvbiBvZiB0d28gc2lnbmFscworCisgIFxzaWdYICAgICAgICAgICAgUG9pbnRlciB0byBzaWduYWwgMQorICBcc2lnWSAgICAgICAgICAgIFBvaW50ZXIgdG8gc2lnbmFsIDIKKyAgXGxlbiAgICAgICAgICAgICBMZW5ndGggb2Ygc2lnbmFscworICBcZW5hYmxlQ3Jvc3NDb3JyIEZsYWcgdG8gYmUgc2V0IHRvIDEgaWYgY3Jvc3MtY29ycmVsYXRpb24gaXMgbmVlZGVkCisKKyAgXHJldHVybiAgICAgICAgICBGaXJzdCB2YWx1ZSBpcyB2ZWN0b3Igb2YgY29ycmVsYXRpb24gcGVhayBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgU2Vjb25kIHZhbHVlIGlzIHZlY3RvciBvZiBjb3JyZWxhdGlvbiBwZWFrIHZhbHVlcworKi8KKworc3RhdGljIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxpbnQ+LCBzdGQ6OnZlY3RvcjxmbG9hdD4+IGNvcnJlbGF0aW9uKGNvbnN0IGludDE2X3QqIHNpZ1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogc2lnWSwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGVuYWJsZUNyb3NzQ29ycikgeworICAgIGZsb2F0IG1heENvcnJWYWwgPSAwLmYsIHByZXZDb3JyVmFsID0gMC5mOworICAgIGludCBkZWxheSA9IDAsIHBlYWtJbmRleCA9IDAsIGZsYWcgPSAwOworICAgIGludCBsb29wTGltID0gKDEgPT0gZW5hYmxlQ3Jvc3NDb3JyKSA/IGxlbiA6IGtNaW5Mb29wTGltaXRWYWx1ZTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBlYWtJbmRleFZlY3Qoa051bVBlYWtzLCAwKTsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcGVha1ZhbHVlVmVjdChrTnVtUGVha3MsIDAuZik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wTGltOyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29yclZhbCA9IDAuZjsKKyAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgY29yclZhbCArPSAoZmxvYXQpKHNpZ1hbal0gKiBzaWdZW2ogLSBpXSk7CisgICAgICAgIH0KKyAgICAgICAgY29yclZhbCAvPSBsZW4gLSBpOworICAgICAgICBpZiAoY29yclZhbCA+IG1heENvcnJWYWwpIHsKKyAgICAgICAgICAgIGRlbGF5ID0gaTsKKyAgICAgICAgICAgIG1heENvcnJWYWwgPSBjb3JyVmFsOworICAgICAgICB9CisgICAgICAgIC8vIENvcnJlbGF0aW9uIHBlYWtzIGFyZSBleHBlY3RlZCB0byBiZSBvYnNlcnZlZCBhdCBlcXVhbCBpbnRlcnZhbHMuIFRoZSBpbnRlcnZhbCBsZW5ndGggaXMKKyAgICAgICAgLy8gZXhwZWN0ZWQgdG8gbWF0Y2ggd2l0aCB3YXZlIHBlcmlvZC4KKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBibG9jayBvZiBjb2RlIHNhdmVzIHRoZSBmaXJzdCBrTnVtUGVha3MgbnVtYmVyIG9mIHBlYWtzIGFuZCB0aGUgaW5kZXggYXQKKyAgICAgICAgLy8gd2hpY2ggdGhleSBvY2N1ci4KKyAgICAgICAgaWYgKHBlYWtJbmRleCA8IGtOdW1QZWFrcykgeworICAgICAgICAgICAgaWYgKGNvcnJWYWwgPiBwcmV2Q29yclZhbCkgeworICAgICAgICAgICAgICAgIHBlYWtJbmRleFZlY3RbcGVha0luZGV4XSA9IGk7CisgICAgICAgICAgICAgICAgcGVha1ZhbHVlVmVjdFtwZWFrSW5kZXhdID0gY29yclZhbDsKKyAgICAgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMCA9PSBmbGFnKSB7CisgICAgICAgICAgICAgICAgcGVha0luZGV4Kys7CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBlYWtJbmRleCA9PSBrTnVtUGVha3MpIGJyZWFrOworICAgICAgICBwcmV2Q29yclZhbCA9IGNvcnJWYWw7CisgICAgfQorICAgIHJldHVybiB7cGVha0luZGV4VmVjdCwgcGVha1ZhbHVlVmVjdH07Cit9CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgICBwcmludGYoIlxuVXNhZ2U6ICIpOworICAgIHByaW50ZigiXG4gICAgIGNvcnJlbGF0aW9uIDxmaXJzdEZpbGU+IDxzZWNvbmRGaWxlPiBbZW5hYmxlQ3Jvc3NDb3JyXVxuIik7CisgICAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPGZpcnN0RmlsZT4gICAgICAgaXMgdGhlIGZpcnN0IGZpbGUgbmFtZSIpOworICAgIHByaW50ZigiXG4gICAgIDxzZWNvbmRGaWxlPiAgICAgIGlzIHRoZSBzZWNvbmQgZmlsZSBuYW1lIik7CisgICAgcHJpbnRmKCJcbiAgICAgW2VuYWJsZUNyb3NzQ29ycl0gaXMgZmxhZyB0byBzZXQgZm9yIGNyb3NzLWNvcnJlbGF0aW9uIChEZWZhdWx0IDEpXG5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgICAgaWYgKGFyZ2MgPCAzKSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGZJbnB1dDEoZm9wZW4oYXJndlsxXSwgInJiIiksICZmY2xvc2UpOworICAgIGlmIChmSW5wdXQxLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGZpbGUgJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGZJbnB1dDIoZm9wZW4oYXJndlsyXSwgInJiIiksICZmY2xvc2UpOworICAgIGlmIChmSW5wdXQyLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpbnQxNl90IGVuYWJsZUNyb3NzQ29yciA9ICg0ID09IGFyZ2MpID8gYXRvaShhcmd2WzNdKSA6IDE7CisKKyAgICBmc2VlayhmSW5wdXQxLmdldCgpLCAwTCwgU0VFS19FTkQpOworICAgIHVuc2lnbmVkIGludCBmaWxlU2l6ZTEgPSBmdGVsbChmSW5wdXQxLmdldCgpKTsKKyAgICByZXdpbmQoZklucHV0MS5nZXQoKSk7CisgICAgZnNlZWsoZklucHV0Mi5nZXQoKSwgMEwsIFNFRUtfRU5EKTsKKyAgICB1bnNpZ25lZCBpbnQgZmlsZVNpemUyID0gZnRlbGwoZklucHV0Mi5nZXQoKSk7CisgICAgcmV3aW5kKGZJbnB1dDIuZ2V0KCkpOworICAgIGlmIChmaWxlU2l6ZTEgIT0gZmlsZVNpemUyKSB7CisgICAgICAgIHByaW50ZigiXG5FcnJvcjogRmlsZSBzaXplcyBkaWZmZXJlbnRcbiIpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIHNpemVfdCBudW1GcmFtZXMgPSBmaWxlU2l6ZTEgLyBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludDE2X3RbXT4gaW5CdWZmZXIxKG5ldyBpbnQxNl90W251bUZyYW1lc10oKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludDE2X3RbXT4gaW5CdWZmZXIyKG5ldyBpbnQxNl90W251bUZyYW1lc10oKSk7CisKKyAgICBpZiAobnVtRnJhbWVzICE9IGZyZWFkKGluQnVmZmVyMS5nZXQoKSwgc2l6ZW9mKGludDE2X3QpLCBudW1GcmFtZXMsIGZJbnB1dDEuZ2V0KCkpKSB7CisgICAgICAgIHByaW50ZigiXG5FcnJvcjogVW5hYmxlIHRvIHJlYWQgJXp1IHNhbXBsZXMgZnJvbSBmaWxlICVzXG4iLCBudW1GcmFtZXMsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKworICAgIGlmIChudW1GcmFtZXMgIT0gZnJlYWQoaW5CdWZmZXIyLmdldCgpLCBzaXplb2YoaW50MTZfdCksIG51bUZyYW1lcywgZklucHV0Mi5nZXQoKSkpIHsKKyAgICAgICAgcHJpbnRmKCJcbkVycm9yOiBVbmFibGUgdG8gcmVhZCAlenUgc2FtcGxlcyBmcm9tIGZpbGUgJXNcbiIsIG51bUZyYW1lcywgYXJndlsyXSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgYXV0byBwYWlyQXV0b0NvcnIxID0gY29ycmVsYXRpb24oaW5CdWZmZXIxLmdldCgpLCBpbkJ1ZmZlcjEuZ2V0KCksIG51bUZyYW1lcywgZW5hYmxlQ3Jvc3NDb3JyKTsKKyAgICBhdXRvIHBhaXJBdXRvQ29ycjIgPSBjb3JyZWxhdGlvbihpbkJ1ZmZlcjIuZ2V0KCksIGluQnVmZmVyMi5nZXQoKSwgbnVtRnJhbWVzLCBlbmFibGVDcm9zc0NvcnIpOworCisgICAgLy8gRm9sbG93aW5nIGNvZGUgYmxvY2sgY2hlY2tzIHBpdGNoIHBlcmlvZCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGlucHV0IHNpZ25hbHMuIFRoZXkgbXVzdAorICAgIC8vIG1hdGNoIGFzIEFHQyBhcHBsaWVzIG9ubHkgZ2Fpbiwgbm8gZnJlcXVlbmN5IHJlbGF0ZWQgY29tcHV0YXRpb24gaXMgZG9uZS4KKyAgICBib29sIHBpdGNoTWF0Y2ggPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGFpckF1dG9Db3JyMS5maXJzdC5zaXplKCkgLSAxOyBpKyspIHsKKyAgICAgICAgaWYgKHBhaXJBdXRvQ29ycjEuZmlyc3RbaSArIDFdIC0gcGFpckF1dG9Db3JyMS5maXJzdFtpXSAhPQorICAgICAgICAgICAgcGFpckF1dG9Db3JyMi5maXJzdFtpICsgMV0gLSBwYWlyQXV0b0NvcnIyLmZpcnN0W2ldKSB7CisgICAgICAgICAgICBwaXRjaE1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwaXRjaE1hdGNoID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHBpdGNoTWF0Y2gpIHsKKyAgICAgICAgcHJpbnRmKCJBdXRvLWNvcnJlbGF0aW9uICA6IFBpdGNoIG1hdGNoZWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiQXV0by1jb3JyZWxhdGlvbiAgOiBQaXRjaCBtaXNtYXRjaFxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgaWYgKGVuYWJsZUNyb3NzQ29ycikgeworICAgICAgICBhdXRvIHBhaXJDcm9zc0NvcnIgPQorICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uKGluQnVmZmVyMS5nZXQoKSwgaW5CdWZmZXIyLmdldCgpLCBudW1GcmFtZXMsIGVuYWJsZUNyb3NzQ29ycik7CisKKyAgICAgICAgLy8gU2luY2UgQUdDIGFwcGxpZXMgb25seSBnYWluLCB0aGUgcGl0Y2ggaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBjcm9zcyBjb3JyZWxhdGlvbiBkYXRhCisgICAgICAgIC8vIG9mIGlucHV0IGFuZCBvdXRwdXQgaXMgZXhwZWN0ZWQgdG8gYmUgc2FtZSBhcyB0aGUgaW5wdXQgc2lnbmFsJ3MgcGl0Y2ggaW5mb3JtYXRpb24uCisgICAgICAgIHBpdGNoTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHBhaXJDcm9zc0NvcnIuZmlyc3Quc2l6ZSgpIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGFpckF1dG9Db3JyMS5maXJzdFtpICsgMV0gLSBwYWlyQXV0b0NvcnIxLmZpcnN0W2ldICE9CisgICAgICAgICAgICAgICAgcGFpckNyb3NzQ29yci5maXJzdFtpICsgMV0gLSBwYWlyQ3Jvc3NDb3JyLmZpcnN0W2ldKSB7CisgICAgICAgICAgICAgICAgcGl0Y2hNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGl0Y2hNYXRjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpdGNoTWF0Y2gpIHsKKyAgICAgICAgICAgIHByaW50ZigiQ3Jvc3MtY29ycmVsYXRpb24gOiBQaXRjaCBtYXRjaGVkIGZvciBBR0NcbiIpOworICAgICAgICAgICAgaWYgKHBhaXJBdXRvQ29ycjEuc2Vjb25kWzBdKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFeHBlY3RlZCBnYWluICAgICA6IChtYXhDcm9zc0NvcnIgLyBtYXhBdXRvQ29ycjEpID0gJWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXJDcm9zc0NvcnIuc2Vjb25kWzBdIC8gcGFpckF1dG9Db3JyMS5zZWNvbmRbMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJDcm9zcy1jb3JyZWxhdGlvbiA6IFBpdGNoIG1pc21hdGNoXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwCmluZGV4IGM2YWJiOWUuLjYyNTZlZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmVmZmVjdHByb3h5IiwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKaW5kZXggNDJlNDRmMC4uYmU5ZjhjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyBUaGlzIGlzIGEgZHVtbXkgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAorLy8gVGhpcyBpcyBhIHN0dWIgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAogLy8gR2V0RGVzY3JpcHRvciBjYWxsLiBMYXRlciBpbiB0aGUgZmFjdG9yeSwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKIC8vIFNXIHN1YiBlZmZlY3QgZGVzY3JpcHRvcgogLy8gcHJveHkgVVVJRCBhZjhkYTdlMC0yY2ExLTExZTMtYjcxZC0wMDAyYTVkNWM1MWIKQEAgLTExNiw2ICsxMTYsMTYgQEAKICAgICAgICAgcENvbnRleHQtPnN1YmVbU1VCX0ZYX09GRkxPQURdID0gc3ViZVsxXTsKICAgICAgICAgcENvbnRleHQtPmRlc2NbU1VCX0ZYX09GRkxPQURdID0gZGVzY1sxXTsKICAgICAgICAgcENvbnRleHQtPmFlbGlbU1VCX0ZYX09GRkxPQURdID0gYWVsaVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQm90aCBlZmZlY3RzIGhhdmUgKG9yIGRvbid0IGhhdmUpIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUwgZmxhZyIpOworICAgICAgICBkZWxldGVbXSBzdWJlOworICAgICAgICBkZWxldGVbXSBkZXNjOworICAgICAgICBkZWxldGVbXSBhZWxpOworICAgICAgICBkZWxldGVbXSBwQ29udGV4dC0+c3ViZTsKKyAgICAgICAgZGVsZXRlW10gcENvbnRleHQtPmRlc2M7CisgICAgICAgIGRlbGV0ZVtdIHBDb250ZXh0LT5hZWxpOworICAgICAgICBkZWxldGUgcENvbnRleHQ7CisgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBkZWxldGVbXSBkZXNjOwogICAgIGRlbGV0ZVtdIGFlbGk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyBiL21lZGlhL2xpYmVmZmVjdHMvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDQ4Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmggYi9tZWRpYS9saWJlZmZlY3RzL3Rlc3RsaWJzL0VmZmVjdHNNYXRoLmgKaW5kZXggMmE0NDM5OS4uZGQ0M2I0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy90ZXN0bGlicy9FZmZlY3RzTWF0aC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdGVzdGxpYnMvRWZmZWN0c01hdGguaApAQCAtMjUxLDIyICsyNTEsNiBAQAogKi8KIAogLyogdXNlIExGT19HQUlOX1RPX0NFTlRTIHRvIGNvbnZlcnQgdGhlIExGTyBnYWluIHZhbHVlIHRvIGNlbnRzICovCi0jaWYgMAotI2RlZmluZSAgICBET1VCTEVfTE9HMl8xMCAgICAoZG91YmxlKSAoMy4zMjE5MjgwOTQ4ODczNikgICAgLyogbG9nMigxMCkgKi8KLQotI2RlZmluZSAgICBET1VCTEVfTEZPX0dBSU5fVE9fQ0VOVFMgICAgKGRvdWJsZSkgICAgICAgICAgICAgICAgXAotICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAoRE9VQkxFX0xPRzJfMTApICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDEyMDAuMCAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDIwLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICkKLQotI2RlZmluZSAgICBMRk9fR0FJTl9UT19DRU5UUyAgICAoaW50MzJfdCkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIERPVUJMRV9MRk9fR0FJTl9UT19DRU5UUyAqICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgKDB4MUwgPDwgTlVNX0VHMV9GUkFDX0JJVFMpICAgICAgICAgICAgICAgICAgICBcCi0gICAgKQotI2VuZGlmCiAKICNkZWZpbmUgTEZPX0dBSU5fVE9fQ0VOVFMgKGludDMyX3QpICgxNjcxOTgxMTU2TCA+PiAoMjMgLSBOVU1fRUcxX0ZSQUNfQklUUykpCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkNjc4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFZpc3VhbGl6ZXIgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYmVmZmVjdHNfdmlzdWFsaXplcl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJlZmZlY3RzX3Zpc3VhbGl6ZXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJ2aXN1YWxpemVyIiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdFZpc3VhbGl6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItTzIiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliYXVkaW91dGlsc19oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlMmYzZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIFZpc3VhbGl6ZXIgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCUVmZmVjdFZpc3VhbGl6ZXIuY3BwCi0KLUxPQ0FMX0NGTEFHUys9IC1PMiAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotTE9DQUxfQ0ZMQUdTICs9IC1EQlVJTERfRkxPQVQgLURTVVBQT1JUX01DCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlibG9nIFwKLQlsaWJkbAotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEU6PSBsaWJ2aXN1YWxpemVyCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQotCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCmluZGV4IGY4Mzg4OTIuLjE1NTFlMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCkgcmV0dXJuIC1FSU5WQUw7CiAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICNpZmRlZiBTVVBQT1JUX01DCi0gICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzgpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ19MSU1JVCkgcmV0dXJuIC1FSU5WQUw7CiAjZWxzZQogICAgIGlmIChjaGFubmVsQ291bnQgIT0gRkNDXzIpIHJldHVybiAtRUlOVkFMOwogI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJoZWlmL0FuZHJvaWQuYnAKaW5kZXggN2Q1YTRlYi4uNmEzNDI3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmhlaWYvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliaGVpZiIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDNmZDNmYzMuLmU5OGQ3ZDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC01LDE4ICsyMiw0MiBAQAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImF2LWhlYWRlcnMiLAogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmd1aV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAiYXYtaGVhZGVycyIsCiAgICAgICAgICJsaWJndWlfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKK30KKwogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAibGlibWVkaWFfb214X2FpZGwiLAogICAgIHNyY3M6IFsKQEAgLTMzLDI4ICs3NCw2IEBACiAgICAgcGF0aDogImFpZGwiLAogfQogCi1maWxlZ3JvdXAgewotICAgIG5hbWU6ICJyZXNvdXJjZW1hbmFnZXJfYWlkbCIsCi0gICAgc3JjczogWwotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBhcmNlbC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5UGFyY2VsLmFpZGwiLAotICAgIF0sCi0gICAgcGF0aDogImFpZGwiLAotfQotCi1haWRsX2ludGVyZmFjZSB7Ci0gICAgbmFtZTogInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZSIsCi0gICAgdW5zdGFibGU6IHRydWUsCi0gICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKLSAgICBzcmNzOiBbCi0gICAgICAgICI6cmVzb3VyY2VtYW5hZ2VyX2FpZGwiLAotICAgIF0sCi19Ci0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFfb214IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtMjAzLDcgKzIyMiw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIApAQCAtMjIwLDYgKzIzOSwxNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMzA5LDE1ICszMzYsMTkgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAiam5pX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdi10eXBlcy1haWRsLWNwcCIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCkBAIC0zMzQsNiArMzY1LDcgQEAKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCkBAIC0zNDIsMTQgKzM3NCwxNyBAQAogICAgICAgICAibGliYW5kcm9pZGljdSIsCiAgICAgICAgIC8vImxpYnNvbml2b3giLAogICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgInJlc291cmNlbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfc3RhdGljX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtMzcyLDMgKzQwNywzOSBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIgorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCmluZGV4IDVjNmI5ODEuLjY0YmE5NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwCkBAIC0yNjgsNyArMjY4LDcgQEAKIAogICAgICAgICAgICAgICAgIHVjbnZfY29udmVydEV4KG1VdGY4Q29udiwgY29udiwgJnRhcmdldCwgdGFyZ2V0ICsgdGFyZ2V0TGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZSwgc291cmNlICsgc3RybGVuKHNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBUUlVFLCBUUlVFLCAmc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHRydWUsIHRydWUsICZzdGF0dXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKFVfRkFJTFVSRShzdGF0dXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJ1Y252X2NvbnZlcnRFeCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDM5Y2FmNTMuLmViNDM2ZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMzgsNyArMzgsOSBAQAogICAgIEZMQUdTLAogICAgIFNFVE1FRElBQ0FTLAogICAgIE5BTUUsCi0gICAgR0VUTUVUUklDUworICAgIEdFVE1FVFJJQ1MsCisgICAgU0VURU5UUllQT0lOVCwKKyAgICBTRVRMT0dTRVNTSU9OSUQKIH07CiAKIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3IgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yPiB7CkBAIC0xNDIsNiArMTQ0LDIwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5tOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RW50cnlQb2ludChFbnRyeVBvaW50IGVudHJ5UG9pbnQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oQnBNZWRpYUV4dHJhY3Rvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVudHJ5UG9pbnQpKTsKKyAgICAgICAgcmV0dXJuIHJlbW90ZSgpLT50cmFuc2FjdChTRVRFTlRSWVBPSU5ULCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzgmIGxvZ1Nlc3Npb25JZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhRXh0cmFjdG9yOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChsb2dTZXNzaW9uSWQpOworICAgICAgICByZXR1cm4gcmVtb3RlKCktPnRyYW5zYWN0KFNFVExPR1NFU1NJT05JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFFeHRyYWN0b3IsICJhbmRyb2lkLm1lZGlhLklNZWRpYUV4dHJhY3RvciIpOwpAQCAtMjMyLDYgKzI0OCwyNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChubSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRFTlRSWVBPSU5UOiB7CisgICAgICAgICAgICBBTE9HVigic2V0RW50cnlQb2ludCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCBlbnRyeVBvaW50OworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGF0YS5yZWFkSW50MzIoJmVudHJ5UG9pbnQpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHNldEVudHJ5UG9pbnQoRW50cnlQb2ludChlbnRyeVBvaW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUTE9HU0VTU0lPTklEOiB7CisgICAgICAgICAgICBBTE9HVigic2V0TG9nU2Vzc2lvbklkIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmc4IGxvZ1Nlc3Npb25JZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzgoJmxvZ1Nlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgIHNldExvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlYWEyZTYzLi5jODljMDIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTM1LDUzICszNSw2IEBACiAKIHVzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7CiAKLWVudW0gewotICAgIERJU0NPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIFNFVF9EQVRBX1NPVVJDRV9VUkwsCi0gICAgU0VUX0RBVEFfU09VUkNFX0ZELAotICAgIFNFVF9EQVRBX1NPVVJDRV9TVFJFQU0sCi0gICAgU0VUX0RBVEFfU09VUkNFX0NBTExCQUNLLAotICAgIFNFVF9CVUZGRVJJTkdfU0VUVElOR1MsCi0gICAgR0VUX0JVRkZFUklOR19TRVRUSU5HUywKLSAgICBQUkVQQVJFX0FTWU5DLAotICAgIFNUQVJULAotICAgIFNUT1AsCi0gICAgSVNfUExBWUlORywKLSAgICBTRVRfUExBWUJBQ0tfU0VUVElOR1MsCi0gICAgR0VUX1BMQVlCQUNLX1NFVFRJTkdTLAotICAgIFNFVF9TWU5DX1NFVFRJTkdTLAotICAgIEdFVF9TWU5DX1NFVFRJTkdTLAotICAgIFBBVVNFLAotICAgIFNFRUtfVE8sCi0gICAgR0VUX0NVUlJFTlRfUE9TSVRJT04sCi0gICAgR0VUX0RVUkFUSU9OLAotICAgIFJFU0VULAotICAgIE5PVElGWV9BVCwKLSAgICBTRVRfQVVESU9fU1RSRUFNX1RZUEUsCi0gICAgU0VUX0xPT1BJTkcsCi0gICAgU0VUX1ZPTFVNRSwKLSAgICBJTlZPS0UsCi0gICAgU0VUX01FVEFEQVRBX0ZJTFRFUiwKLSAgICBHRVRfTUVUQURBVEEsCi0gICAgU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwKLSAgICBBVFRBQ0hfQVVYX0VGRkVDVCwKLSAgICBTRVRfVklERU9fU1VSRkFDRVRFWFRVUkUsCi0gICAgU0VUX1BBUkFNRVRFUiwKLSAgICBHRVRfUEFSQU1FVEVSLAotICAgIFNFVF9SRVRSQU5TTUlUX0VORFBPSU5ULAotICAgIEdFVF9SRVRSQU5TTUlUX0VORFBPSU5ULAotICAgIFNFVF9ORVhUX1BMQVlFUiwKLSAgICBBUFBMWV9WT0xVTUVfU0hBUEVSLAotICAgIEdFVF9WT0xVTUVfU0hBUEVSX1NUQVRFLAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgUFJFUEFSRV9EUk0sCi0gICAgUkVMRUFTRV9EUk0sCi0gICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgU0VUX09VVFBVVF9ERVZJQ0UsCi0gICAgR0VUX1JPVVRFRF9ERVZJQ0VfSUQsCi0gICAgRU5BQkxFX0FVRElPX0RFVklDRV9DQUxMQkFDSywKLX07Ci0KIC8vIE1vZERybSBoZWxwZXJzCiBzdGF0aWMgc3RhdHVzX3QgcmVhZFZlY3Rvcihjb25zdCBQYXJjZWwmIHJlcGx5LCBWZWN0b3I8dWludDhfdD4mIHZlY3RvcikgewogICAgIHVpbnQzMl90IHNpemUgPSAwOwpAQCAtMTg4LDYgKzE0MSwxNSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChydHBQYXJhbXMpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RBVEFfU09VUkNFX1JUUCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciB0byB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2UKICAgICBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikKICAgICB7CkBAIC03MTIsNiArNjc0LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfUlRQOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmc4IHJ0cFBhcmFtcyA9IGRhdGEucmVhZFN0cmluZzgoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2UocnRwUGFyYW1zKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBTRVRfVklERU9fU1VSRkFDRVRFWFRVUkU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyID0KQEAgLTk4NSw3ICs5NTMsNyBAQAogICAgICAgICBjYXNlIFBSRVBBUkVfRFJNOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgdXVpZFsxNl07CisgICAgICAgICAgICB1aW50OF90IHV1aWRbMTZdID0ge307CiAgICAgICAgICAgICBkYXRhLnJlYWQodXVpZCwgc2l6ZW9mKHV1aWQpKTsKICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBkcm1TZXNzaW9uSWQ7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkVmVjdG9yKGRhdGEsIGRybVNlc3Npb25JZCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGJkMThhNDAuLjA3YzBhYzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNSw2ICszNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogZW51bSB7CiAgICAgQ1JFQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBDUkVBVEVfTUVESUFfUkVDT1JERVIsCkBAIC02MiwyMSArNjQsMjMgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LCBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGF1ZGlvU2Vzc2lvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZVBhcmNlbGFibGUoYXR0cmlidXRpb25Tb3VyY2UpOwogCiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFQbGF5ZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gY3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKKyAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOworICAgICAgICBkYXRhLndyaXRlUGFyY2VsYWJsZShhdHRyaWJ1dGlvblNvdXJjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfTUVESUFfUkVDT1JERVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVkaWFSZWNvcmRlcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CkBAIC0xMjcsMTQgKzEzMSwyMyBAQAogICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiBjbGllbnQgPQogICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllckNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyID0gY3JlYXRlKGNsaWVudCwgYXVkaW9TZXNzaW9uSWQpOworICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFBhcmNlbGFibGUoJmF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIgPSBjcmVhdGUoY2xpZW50LCBhdWRpb1Nlc3Npb25JZCwgYXR0cmlidXRpb25Tb3VyY2UpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBsYXllcikpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENSRUFURV9NRURJQV9SRUNPUkRFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWUgPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXI+IHJlY29yZGVyID0gY3JlYXRlTWVkaWFSZWNvcmRlcihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRQYXJjZWxhYmxlKCZhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyPiByZWNvcmRlciA9IGNyZWF0ZU1lZGlhUmVjb3JkZXIoYXR0cmlidXRpb25Tb3VyY2UpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJlY29yZGVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggYWM4NmY3Mi4uMTU0OTg4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNjYsNiArNjYsNyBAQAogICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0FDVElWRV9NSUNST1BIT05FUywKICAgICBHRVRfUE9SVF9JRCwKKyAgICBHRVRfUlRQX0RBVEFfVVNBR0UsCiAgICAgU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiwKICAgICBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRklFTERfRElNRU5TSU9OLAogICAgIFNFVF9QUklWQUNZX1NFTlNJVElWRSwKQEAgLTQ3Niw2ICs0NzcsMjMgQEAKICAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykKKyAgICB7CisgICAgICAgIEFMT0dWKCJnZXRSdHBEYXRhVXNhZ2UiKTsKKyAgICAgICAgaWYgKGJ5dGVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUlRQX0RBVEFfVVNBR0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0sKKyAgICAgICAgICAgICAgICB8fCAoc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgKmJ5dGVzID0gMDsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRVaW50NjQoYnl0ZXMpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYVJlY29yZGVyLCAiYW5kcm9pZC5tZWRpYS5JTWVkaWFSZWNvcmRlciIpOwpAQCAtNzU5LDYgKzc3NywxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX1JUUF9EQVRBX1VTQUdFOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1JUUF9EQVRBX1VTQUdFIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ5dGVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UnRwRGF0YVVzYWdlKCZieXRlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQ2NChieXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OOiB7CiAgICAgICAgICAgICBBTE9HVigiU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDYzNzMyMmYuLjY3ZDMzZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hEaXJzWzFdICsgZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hEaXJzWzJdICsgZmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hEaXJzWzNdICsgZmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAic3lzdGVtL2V0Yy9tZWRpYV9wcm9maWxlc19WMV8wLnhtbCIgLy8gU3lzdGVtIGZhbGxiYWNrCisgICAgICAgICAgICAgICAgICAgICAic3lzdGVtL2V0Yy9tZWRpYV9wcm9maWxlcy54bWwiIC8vIFN5c3RlbSBmYWxsYmFjawogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgIH0oKTsKICAgICBzdGF0aWMgc3RkOjphcnJheTxjaGFyIGNvbnN0KiwgNT4gY29uc3QgY1BhdGhzID0gewpAQCAtMTIxLDYgKzEyMSwxMSBAQAogICAgIHsiMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV8xMDgwUH0sCiAgICAgeyIyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQfSwKICAgICB7InF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9RVkdBfSwKKyAgICB7InZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1ZHQX0sCisgICAgeyI0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJfSwKKyAgICB7InFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1FIRH0sCisgICAgeyIyayIsIENBTUNPUkRFUl9RVUFMSVRZXzJLfSwKKyAgICB7IjhrdWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfOEtVSER9LAogCiAgICAgeyJ0aW1lbGFwc2Vsb3ciLCAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1d9LAogICAgIHsidGltZWxhcHNlaGlnaCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfSElHSH0sCkBAIC0xMzEsNiArMTM2LDEwIEBACiAgICAgeyJ0aW1lbGFwc2UxMDgwcCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMTA4MFB9LAogICAgIHsidGltZWxhcHNlMjE2MHAiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQfSwKICAgICB7InRpbWVsYXBzZXF2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0F9LAorICAgIHsidGltZWxhcHNldmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0F9LAorICAgIHsidGltZWxhcHNlNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJfSwKKyAgICB7InRpbWVsYXBzZXFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEfSwKKyAgICB7InRpbWVsYXBzZTJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yS30sCiAKICAgICB7ImhpZ2hzcGVlZGxvdyIsICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPV30sCiAgICAgeyJoaWdoc3BlZWRoaWdoIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9ISUdIfSwKQEAgLTEzOCwxOSArMTQ3LDExIEBACiAgICAgeyJoaWdoc3BlZWQ3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQfSwKICAgICB7ImhpZ2hzcGVlZDEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUH0sCiAgICAgeyJoaWdoc3BlZWQyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMjE2MFB9LAotCi0gICAgLy8gVmVuZG9yLXNwZWNpZmljIHByb2ZpbGVzCi0gICAgeyJ2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9WR0F9LAotICAgIHsiNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV80S0RDSX0sCi0gICAgeyJ0aW1lbGFwc2V2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1ZHQX0sCi0gICAgeyJ0aW1lbGFwc2U0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0l9LAogICAgIHsiaGlnaHNwZWVkY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9DSUZ9LAogICAgIHsiaGlnaHNwZWVkdmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9WR0F9LAogICAgIHsiaGlnaHNwZWVkNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzRLRENJfSwKLSAgICB7InFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1FIRH0sCi0gICAgeyIyayIsIENBTUNPUkRFUl9RVUFMSVRZXzJrfSwKLSAgICB7InRpbWVsYXBzZXFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEfSwKLSAgICB7InRpbWVsYXBzZTJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8ya30sCisKKyAgICAvLyBWZW5kb3Itc3BlY2lmaWMgcHJvZmlsZXMKIH07CiAKICNpZiBMT0dfTkRFQlVHCkBAIC0xNjgsNiArMTY5LDcgQEAKICAgICBBTE9HVigiZnJhbWUgd2lkdGg6ICVkIiwgY29kZWMubUZyYW1lV2lkdGgpOwogICAgIEFMT0dWKCJmcmFtZSBoZWlnaHQ6ICVkIiwgY29kZWMubUZyYW1lSGVpZ2h0KTsKICAgICBBTE9HVigiZnJhbWUgcmF0ZTogJWQiLCBjb2RlYy5tRnJhbWVSYXRlKTsKKyAgICBBTE9HVigicHJvZmlsZTogJWQiLCBjb2RlYy5tUHJvZmlsZSk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZApAQCAtMTc4LDYgKzE4MCw3IEBACiAgICAgQUxPR1YoImJpdCByYXRlOiAlZCIsIGNvZGVjLm1CaXRSYXRlKTsKICAgICBBTE9HVigic2FtcGxlIHJhdGU6ICVkIiwgY29kZWMubVNhbXBsZVJhdGUpOwogICAgIEFMT0dWKCJudW1iZXIgb2YgY2hhbm5lbHM6ICVkIiwgY29kZWMubUNoYW5uZWxzKTsKKyAgICBBTE9HVigicHJvZmlsZTogJWQiLCBjb2RlYy5tUHJvZmlsZSk7CiB9CiAKIC8qc3RhdGljKi8gdm9pZApAQCAtMjI5LDEwICsyMzIsMTEgQEAKICAgICByZXR1cm4gdGFnOwogfQogCi0vKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMqCi1NZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjKGNvbnN0IGNoYXIgKiphdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKKy8qc3RhdGljKi8gdm9pZAorTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcykKIHsKLSAgICBDSEVDSyghc3RyY21wKCJjb2RlYyIsICAgICBhdHRzWzBdKSAmJgorICAgIENIRUNLKG5hdHRzID49IDEwICYmCisgICAgICAgICAgIXN0cmNtcCgiY29kZWMiLCAgICAgYXR0c1swXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJiaXRSYXRlIiwgICBhdHRzWzJdKSAmJgogICAgICAgICAgICFzdHJjbXAoIndpZHRoIiwgICAgIGF0dHNbNF0pICYmCiAgICAgICAgICAgIXN0cmNtcCgiaGVpZ2h0IiwgICAgYXR0c1s2XSkgJiYKQEAgLTI0MCw0OSArMjQ0LDY5IEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvQ29kZWMgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKLSAgICAgICAgICAgIGF0b2koYXR0c1szXSksIGF0b2koYXR0c1s1XSksIGF0b2koYXR0c1s3XSksIGF0b2koYXR0c1s5XSkpOwotICAgIGxvZ1ZpZGVvQ29kZWMoKnZpZGVvQ29kZWMpOworICAgIGludCBwcm9maWxlID0gLTE7CisgICAgaWYgKG5hdHRzID49IDEyICYmICFzdHJjbXAoInByb2ZpbGUiLCBhdHRzWzEwXSkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGF0b2koYXR0c1sxMV0pOworICAgIH0KKworICAgIFZpZGVvQ29kZWMgdmlkZW9Db2RlYyB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx2aWRlb19lbmNvZGVyPihjb2RlYyksCisgICAgICAgICAgICBhdG9pKGF0dHNbM10pLCBhdG9pKGF0dHNbNV0pLCBhdG9pKGF0dHNbN10pLCBhdG9pKGF0dHNbOV0pLCBwcm9maWxlIH07CisgICAgbG9nVmlkZW9Db2RlYyh2aWRlb0NvZGVjKTsKIAogICAgIHNpemVfdCBuQ2FtY29yZGVyUHJvZmlsZXM7CiAgICAgQ0hFQ0soKG5DYW1jb3JkZXJQcm9maWxlcyA9IHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXMuc2l6ZSgpKSA+PSAxKTsKLSAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzW25DYW1jb3JkZXJQcm9maWxlcyAtIDFdLT5tVmlkZW9Db2RlYyA9IHZpZGVvQ29kZWM7Ci0gICAgcmV0dXJuIHZpZGVvQ29kZWM7CisgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlc1tuQ2FtY29yZGVyUHJvZmlsZXMgLSAxXS0+bVZpZGVvQ29kZWNzLmVtcGxhY2VfYmFjayh2aWRlb0NvZGVjKTsKIH0KIAotLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCisvKnN0YXRpYyovIHZvaWQKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZUF1ZGlvQ29kZWMoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgiY29kZWMiLCAgICAgIGF0dHNbMF0pICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gOCAmJgorICAgICAgICAgICFzdHJjbXAoImNvZGVjIiwgICAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImJpdFJhdGUiLCAgICBhdHRzWzJdKSAmJgogICAgICAgICAgICFzdHJjbXAoInNhbXBsZVJhdGUiLCBhdHRzWzRdKSAmJgogICAgICAgICAgICFzdHJjbXAoImNoYW5uZWxzIiwgICBhdHRzWzZdKSk7CiAgICAgY29uc3Qgc2l6ZV90IG5NYXBwaW5ncyA9IHNpemVvZihzQXVkaW9FbmNvZGVyTmFtZU1hcCkvc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwWzBdKTsKICAgICBjb25zdCBpbnQgY29kZWMgPSBmaW5kVGFnRm9yTmFtZShzQXVkaW9FbmNvZGVyTmFtZU1hcCwgbk1hcHBpbmdzLCBhdHRzWzFdKTsKLSAgICBDSEVDSyhjb2RlYyAhPSAtMSk7CisgICAgaWYgKGNvZGVjID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0NvZGVjIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPQotICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyhzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksCi0gICAgICAgICAgICBhdG9pKGF0dHNbM10pLCBhdG9pKGF0dHNbNV0pLCBhdG9pKGF0dHNbN10pKTsKLSAgICBsb2dBdWRpb0NvZGVjKCphdWRpb0NvZGVjKTsKKyAgICBpbnQgcHJvZmlsZSA9IC0xOworICAgIGlmIChuYXR0cyA+PSAxMCAmJiAhc3RyY21wKCJwcm9maWxlIiwgYXR0c1s4XSkpIHsKKyAgICAgICAgcHJvZmlsZSA9IGF0b2koYXR0c1s5XSk7CisgICAgfQorCisgICAgQXVkaW9Db2RlYyBhdWRpb0NvZGVjeworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZW5jb2Rlcj4oY29kZWMpLAorICAgICAgICAgICAgYXRvaShhdHRzWzNdKSwgYXRvaShhdHRzWzVdKSwgYXRvaShhdHRzWzddKSwgcHJvZmlsZSB9OworICAgIGxvZ0F1ZGlvQ29kZWMoYXVkaW9Db2RlYyk7CiAKICAgICBzaXplX3QgbkNhbWNvcmRlclByb2ZpbGVzOwogICAgIENIRUNLKChuQ2FtY29yZGVyUHJvZmlsZXMgPSBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLnNpemUoKSkgPj0gMSk7Ci0gICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlc1tuQ2FtY29yZGVyUHJvZmlsZXMgLSAxXS0+bUF1ZGlvQ29kZWMgPSBhdWRpb0NvZGVjOwotICAgIHJldHVybiBhdWRpb0NvZGVjOworICAgIHByb2ZpbGVzLT5tQ2FtY29yZGVyUHJvZmlsZXNbbkNhbWNvcmRlclByb2ZpbGVzIC0gMV0tPm1BdWRpb0NvZGVjcy5lbXBsYWNlX2JhY2soYXVkaW9Db2RlYyk7CiB9CisKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsICAgIGF0dHNbMF0pICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gNCAmJgorICAgICAgICAgICFzdHJjbXAoIm5hbWUiLCAgICBhdHRzWzBdKSAmJgogICAgICAgICAgICFzdHJjbXAoImVuYWJsZWQiLCBhdHRzWzJdKSk7CiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PGF1ZGlvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0yOTEsMTQgKzMxNSwxOCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCoKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cykKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKQogewotICAgIENIRUNLKCFzdHJjbXAoIm5hbWUiLCAgICBhdHRzWzBdKSAmJgorICAgIENIRUNLKG5hdHRzID49IDQgJiYKKyAgICAgICAgICAhc3RyY21wKCJuYW1lIiwgICAgYXR0c1swXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJlbmFibGVkIiwgYXR0c1syXSkpOwogCiAgICAgY29uc3Qgc2l6ZV90IG5NYXBwaW5ncyA9IHNpemVvZihzVmlkZW9EZWNvZGVyTmFtZU1hcCkvc2l6ZW9mKHNWaWRlb0RlY29kZXJOYW1lTWFwWzBdKTsKICAgICBjb25zdCBpbnQgY29kZWMgPSBmaW5kVGFnRm9yTmFtZShzVmlkZW9EZWNvZGVyTmFtZU1hcCwgbk1hcHBpbmdzLCBhdHRzWzFdKTsKLSAgICBDSEVDSyhjb2RlYyAhPSAtMSk7CisgICAgaWYgKGNvZGVjID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9EZWNvZGVyQ2FwIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcCAqY2FwID0KICAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvRGVjb2RlckNhcChzdGF0aWNfY2FzdDx2aWRlb19kZWNvZGVyPihjb2RlYykpOwpAQCAtMzA3LDkgKzMzNSwxMCBAQAogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCoKLU1lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cykKK01lZGlhUHJvZmlsZXM6OmNyZWF0ZVZpZGVvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKQogewotICAgIENIRUNLKCFzdHJjbXAoIm5hbWUiLCAgICAgICAgICAgYXR0c1swXSkgICYmCisgICAgQ0hFQ0sobmF0dHMgPj0gMjAgJiYKKyAgICAgICAgICAhc3RyY21wKCJuYW1lIiwgICAgICAgICAgIGF0dHNbMF0pICAmJgogICAgICAgICAgICFzdHJjbXAoImVuYWJsZWQiLCAgICAgICAgYXR0c1syXSkgICYmCiAgICAgICAgICAgIXN0cmNtcCgibWluQml0UmF0ZSIsICAgICBhdHRzWzRdKSAgJiYKICAgICAgICAgICAhc3RyY21wKCJtYXhCaXRSYXRlIiwgICAgIGF0dHNbNl0pICAmJgpAQCAtMzIyLDcgKzM1MSwxMCBAQAogCiAgICAgY29uc3Qgc2l6ZV90IG5NYXBwaW5ncyA9IHNpemVvZihzVmlkZW9FbmNvZGVyTmFtZU1hcCkvc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwWzBdKTsKICAgICBjb25zdCBpbnQgY29kZWMgPSBmaW5kVGFnRm9yTmFtZShzVmlkZW9FbmNvZGVyTmFtZU1hcCwgbk1hcHBpbmdzLCBhdHRzWzFdKTsKLSAgICBDSEVDSyhjb2RlYyAhPSAtMSk7CisgICAgaWYgKGNvZGVjID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlVmlkZW9FbmNvZGVyQ2FwIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcCAqY2FwID0KICAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvRW5jb2RlckNhcChzdGF0aWNfY2FzdDx2aWRlb19lbmNvZGVyPihjb2RlYyksCkBAIC0zMzMsOSArMzY1LDEwIEBACiB9CiAKIC8qc3RhdGljKi8gTWVkaWFQcm9maWxlczo6QXVkaW9FbmNvZGVyQ2FwKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpCiB7Ci0gICAgQ0hFQ0soIXN0cmNtcCgibmFtZSIsICAgICAgICAgIGF0dHNbMF0pICAmJgorICAgIENIRUNLKG5hdHRzID49IDE2ICYmCisgICAgICAgICAgIXN0cmNtcCgibmFtZSIsICAgICAgICAgIGF0dHNbMF0pICAmJgogICAgICAgICAgICFzdHJjbXAoImVuYWJsZWQiLCAgICAgICBhdHRzWzJdKSAgJiYKICAgICAgICAgICAhc3RyY21wKCJtaW5CaXRSYXRlIiwgICAgYXR0c1s0XSkgICYmCiAgICAgICAgICAgIXN0cmNtcCgibWF4Qml0UmF0ZSIsICAgIGF0dHNbNl0pICAmJgpAQCAtMzQ2LDcgKzM3OSwxMCBAQAogCiAgICAgY29uc3Qgc2l6ZV90IG5NYXBwaW5ncyA9IHNpemVvZihzQXVkaW9FbmNvZGVyTmFtZU1hcCkvc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwWzBdKTsKICAgICBjb25zdCBpbnQgY29kZWMgPSBmaW5kVGFnRm9yTmFtZShzQXVkaW9FbmNvZGVyTmFtZU1hcCwgbk1hcHBpbmdzLCBhdHRzWzFdKTsKLSAgICBDSEVDSyhjb2RlYyAhPSAtMSk7CisgICAgaWYgKGNvZGVjID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlQXVkaW9FbmNvZGVyQ2FwIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCAqY2FwID0KICAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcChzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksIGF0b2koYXR0c1s1XSksCkBAIC0zNTYsOSArMzkyLDEwIEBACiB9CiAKIC8qc3RhdGljKi8gb3V0cHV0X2Zvcm1hdAotTWVkaWFQcm9maWxlczo6Y3JlYXRlRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoY29uc3QgY2hhciAqKmF0dHMpCitNZWRpYVByb2ZpbGVzOjpjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKQogewotICAgIENIRUNLKCFzdHJjbXAoIm5hbWUiLCBhdHRzWzBdKSk7CisgICAgQ0hFQ0sobmF0dHMgPj0gMiAmJgorICAgICAgICAgICFzdHJjbXAoIm5hbWUiLCBhdHRzWzBdKSk7CiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID1zaXplb2Yoc0ZpbGVGb3JtYXRNYXApL3NpemVvZihzRmlsZUZvcm1hdE1hcFswXSk7CiAgICAgY29uc3QgaW50IGZvcm1hdCA9IGZpbmRUYWdGb3JOYW1lKHNGaWxlRm9ybWF0TWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwpAQCAtMzc3LDIwICs0MTQsMjggQEAKIH0KIAogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgotTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZShpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKQorTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKQogewotICAgIENIRUNLKCFzdHJjbXAoInF1YWxpdHkiLCAgICBhdHRzWzBdKSAmJgorICAgIENIRUNLKG5hdHRzID49IDYgJiYKKyAgICAgICAgICAhc3RyY21wKCJxdWFsaXR5IiwgICAgYXR0c1swXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJmaWxlRm9ybWF0IiwgYXR0c1syXSkgJiYKICAgICAgICAgICAhc3RyY21wKCJkdXJhdGlvbiIsICAgYXR0c1s0XSkpOwogCiAgICAgY29uc3Qgc2l6ZV90IG5Qcm9maWxlTWFwcGluZ3MgPSBzaXplb2Yoc0NhbWNvcmRlclF1YWxpdHlOYW1lTWFwKS8KICAgICAgICAgICAgIHNpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBxdWFsaXR5ID0gZmluZFRhZ0Zvck5hbWUoc0NhbWNvcmRlclF1YWxpdHlOYW1lTWFwLCBuUHJvZmlsZU1hcHBpbmdzLCBhdHRzWzFdKTsKLSAgICBDSEVDSyhxdWFsaXR5ICE9IC0xKTsKKyAgICBpZiAocXVhbGl0eSA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUgZmFpbGVkIHRvIGxvY2F0ZSBxdWFsaXR5ICVzIiwgYXR0c1sxXSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICBjb25zdCBzaXplX3QgbkZvcm1hdE1hcHBpbmdzID0gc2l6ZW9mKHNGaWxlRm9ybWF0TWFwKS9zaXplb2Yoc0ZpbGVGb3JtYXRNYXBbMF0pOwogICAgIGNvbnN0IGludCBmaWxlRm9ybWF0ID0gZmluZFRhZ0Zvck5hbWUoc0ZpbGVGb3JtYXRNYXAsIG5Gb3JtYXRNYXBwaW5ncywgYXR0c1szXSk7Ci0gICAgQ0hFQ0soZmlsZUZvcm1hdCAhPSAtMSk7CisgICAgaWYgKGZpbGVGb3JtYXQgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVDYW1jb3JkZXJQcm9maWxlIGZhaWxlZCB0byBsb2NhdGUgZmlsZSBmb3JtYXQgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKICAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSBjYW1lcmFJZDsKQEAgLTQxNiw5ICs0NjEsMTAgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBNZWRpYVByb2ZpbGVzOjphZGRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMpCit2b2lkIE1lZGlhUHJvZmlsZXM6OmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cywgc2l6ZV90IG5hdHRzKQogewotICAgIENIRUNLKCFzdHJjbXAoInF1YWxpdHkiLCBhdHRzWzBdKSk7CisgICAgQ0hFQ0sobmF0dHMgPj0gMiAmJgorICAgICAgICAgICFzdHJjbXAoInF1YWxpdHkiLCBhdHRzWzBdKSk7CiAgICAgaW50IHF1YWxpdHkgPSBhdG9pKGF0dHNbMV0pOwogICAgIEFMT0dWKCIlczogY2FtZXJhSWQ9JWQsIHF1YWxpdHk9JWQiLCBfX2Z1bmNfXywgY2FtZXJhSWQsIHF1YWxpdHkpOwogICAgIEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWxzICpsZXZlbHMgPSBmaW5kSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMoY2FtZXJhSWQpOwpAQCAtNDMzLDE4ICs0NzksMTkgQEAKIH0KIAogLypzdGF0aWMqLyBpbnQKLU1lZGlhUHJvZmlsZXM6OmdldENhbWVyYUlkKGNvbnN0IGNoYXIqKiBhdHRzKQorTWVkaWFQcm9maWxlczo6Z2V0Q2FtZXJhSWQoY29uc3QgY2hhcioqIGF0dHMsIHNpemVfdCBuYXR0cykKIHsKICAgICBpZiAoIWF0dHNbMF0pIHJldHVybiAwOyAgLy8gZGVmYXVsdCBjYW1lcmFJZCA9IDAKLSAgICBDSEVDSyghc3RyY21wKCJjYW1lcmFJZCIsIGF0dHNbMF0pKTsKKyAgICBDSEVDSyhuYXR0cyA+PSAyICYmCisgICAgICAgICAgIXN0cmNtcCgiY2FtZXJhSWQiLCBhdHRzWzBdKSk7CiAgICAgcmV0dXJuIGF0b2koYXR0c1sxXSk7CiB9CiAKLXZvaWQgTWVkaWFQcm9maWxlczo6YWRkU3RhcnRUaW1lT2Zmc2V0KGludCBjYW1lcmFJZCwgY29uc3QgY2hhcioqIGF0dHMpCit2b2lkIE1lZGlhUHJvZmlsZXM6OmFkZFN0YXJ0VGltZU9mZnNldChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzLCBzaXplX3QgbmF0dHMpCiB7CiAgICAgaW50IG9mZnNldFRpbWVNcyA9IDEwMDA7Ci0gICAgaWYgKGF0dHNbMl0pIHsKLSAgICAgICAgQ0hFQ0soIXN0cmNtcCgic3RhcnRPZmZzZXRNcyIsIGF0dHNbMl0pKTsKKyAgICBpZiAobmF0dHMgPj0gMyAmJiBhdHRzWzJdKSB7CisgICAgICAgIENIRUNLKG5hdHRzID49IDQgJiYgIXN0cmNtcCgic3RhcnRPZmZzZXRNcyIsIGF0dHNbMl0pKTsKICAgICAgICAgb2Zmc2V0VGltZU1zID0gYXRvaShhdHRzWzNdKTsKICAgICB9CiAKQEAgLTQ1NSwzMyArNTAyLDU4IEBACiAvKnN0YXRpYyovIHZvaWQKIE1lZGlhUHJvZmlsZXM6OnN0YXJ0RWxlbWVudEhhbmRsZXIodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQogewotICAgIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzID0gKE1lZGlhUHJvZmlsZXMgKikgdXNlckRhdGE7CisgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBhdHRyaWJ1dGVzCisgICAgc2l6ZV90IG5hdHRzID0gMDsKKyAgICB3aGlsZSAoYXR0c1tuYXR0c10pIHsKKyAgICAgICAgKytuYXR0czsKKyAgICB9CisKKyAgICBNZWRpYVByb2ZpbGVzICpwcm9maWxlcyA9IChNZWRpYVByb2ZpbGVzICopdXNlckRhdGE7CiAgICAgaWYgKHN0cmNtcCgiVmlkZW8iLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIGNyZWF0ZVZpZGVvQ29kZWMoYXR0cywgcHJvZmlsZXMpOworICAgICAgICBjcmVhdGVWaWRlb0NvZGVjKGF0dHMsIG5hdHRzLCBwcm9maWxlcyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBjcmVhdGVBdWRpb0NvZGVjKGF0dHMsIHByb2ZpbGVzKTsKKyAgICAgICAgY3JlYXRlQXVkaW9Db2RlYyhhdHRzLCBuYXR0cywgcHJvZmlsZXMpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJWaWRlb0VuY29kZXJDYXAiLCBuYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICBuYXR0cyA+PSA0ICYmCiAgICAgICAgICAgICAgICBzdHJjbXAoInRydWUiLCBhdHRzWzNdKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tVmlkZW9FbmNvZGVycy5hZGQoY3JlYXRlVmlkZW9FbmNvZGVyQ2FwKGF0dHMpKTsKKyAgICAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwKiBjYXAgPSBjcmVhdGVWaWRlb0VuY29kZXJDYXAoYXR0cywgbmF0dHMpOworICAgICAgICBpZiAoY2FwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBwcm9maWxlcy0+bVZpZGVvRW5jb2RlcnMuYWRkKGNhcCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiQXVkaW9FbmNvZGVyQ2FwIiwgbmFtZSkgPT0gMCAmJgorICAgICAgICAgICAgICAgbmF0dHMgPj0gNCAmJgogICAgICAgICAgICAgICAgc3RyY21wKCJ0cnVlIiwgYXR0c1szXSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUF1ZGlvRW5jb2RlcnMuYWRkKGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChhdHRzKSk7CisgICAgICAgIE1lZGlhUHJvZmlsZXM6OkF1ZGlvRW5jb2RlckNhcCogY2FwID0gY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGF0dHMsIG5hdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0VuY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgIG5hdHRzID49IDQgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjcmVhdGVWaWRlb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRGVjb2RlckNhcChhdHRzLCBuYXR0cyk7CisgICAgICAgIGlmIChjYXAgIT0gbnVsbHB0cikgeworICAgICAgICAgIHByb2ZpbGVzLT5tVmlkZW9EZWNvZGVycy5hZGQoY2FwKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJBdWRpb0RlY29kZXJDYXAiLCBuYW1lKSA9PSAwICYmCisgICAgICAgICAgICAgICBuYXR0cyA+PSA0ICYmCiAgICAgICAgICAgICAgICBzdHJjbXAoInRydWUiLCBhdHRzWzNdKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tQXVkaW9EZWNvZGVycy5hZGQoY3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGF0dHMpKTsKKyAgICAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwKiBjYXAgPSBjcmVhdGVBdWRpb0RlY29kZXJDYXAoYXR0cywgbmF0dHMpOworICAgICAgICBpZiAoY2FwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICBwcm9maWxlcy0+bUF1ZGlvRGVjb2RlcnMuYWRkKGNhcCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQiLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5tRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzLmFkZChjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChhdHRzKSk7CisgICAgICAgIHByb2ZpbGVzLT5tRW5jb2Rlck91dHB1dEZpbGVGb3JtYXRzLmFkZChjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChhdHRzLCBuYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJDYW1jb3JkZXJQcm9maWxlcyIsIG5hbWUpID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQgPSBnZXRDYW1lcmFJZChhdHRzKTsKLSAgICAgICAgcHJvZmlsZXMtPmFkZFN0YXJ0VGltZU9mZnNldChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7CisgICAgICAgIHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkID0gZ2V0Q2FtZXJhSWQoYXR0cywgbmF0dHMpOworICAgICAgICBwcm9maWxlcy0+YWRkU3RhcnRUaW1lT2Zmc2V0KHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzLCBuYXR0cyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJQcm9maWxlIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZCgKLSAgICAgICAgICAgIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIHByb2ZpbGVzLT5tQ2FtZXJhSWRzKSk7CisgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKiBwcm9maWxlID0gY3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgbmF0dHMsIHByb2ZpbGVzLT5tQ2FtZXJhSWRzKTsKKyAgICAgIGlmIChwcm9maWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcHJvZmlsZXMtPm1DYW1jb3JkZXJQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkltYWdlRW5jb2RpbmciLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgIHByb2ZpbGVzLT5hZGRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVsKHByb2ZpbGVzLT5tQ3VycmVudENhbWVyYUlkLCBhdHRzKTsKKyAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIG5hdHRzKTsKICAgICB9CiB9CiAKQEAgLTUzNSw4ICs2MDcsMjAgQEAKICAgICBpbml0UmVxdWlyZWRQcm9maWxlUmVmcyhtQ2FtZXJhSWRzKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwLCBuID0gbUNhbWNvcmRlclByb2ZpbGVzLnNpemUoKTsgaSA8IG47ICsraSkgewotICAgICAgICBpbnQgcHJvZHVjdCA9IG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVZpZGVvQ29kZWMtPm1GcmFtZVdpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1WaWRlb0NvZGVjLT5tRnJhbWVIZWlnaHQ7CisgICAgICAgIC8vIGVuc3VyZSBhdCBsZWFzdCBvbmUgdmlkZW8gYW5kIGF1ZGlvIHByb2ZpbGUgaXMgYWRkZWQKKyAgICAgICAgaWYgKG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVZpZGVvQ29kZWNzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlc1tpXS0+bVZpZGVvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgVklERU9fRU5DT0RFUl9IMjYzLCAxOTIwMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgICAgICAgICAgMTc2IC8qIHdpZHRoICovLCAxNDQgLyogaGVpZ2h0ICovLCAyMCAvKiBmcmFtZVJhdGUgKi8pOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1BdWRpb0NvZGVjcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1BdWRpb0NvZGVjcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgICAgICAgICA4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIDEgLyogY2hhbm5lbHMgKi8pOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByb2R1Y3QgPSBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1WaWRlb0NvZGVjc1swXS5tRnJhbWVXaWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgbUNhbWNvcmRlclByb2ZpbGVzW2ldLT5tVmlkZW9Db2RlY3NbMF0ubUZyYW1lSGVpZ2h0OwogCiAgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkgPSBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1RdWFsaXR5OwogICAgICAgICBpbnQgY2FtZXJhSWQgPSBtQ2FtY29yZGVyUHJvZmlsZXNbaV0tPm1DYW1lcmFJZDsKQEAgLTcwNSwzNCArNzg5LDM1IEBACiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlUWNpZlByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKIHsKLSAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAxMDAwMDAwLCAxNzYsIDE0NCwgMjApOwotCi0gICAgQXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9IG5ldyBBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7CiAgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gNjA7Ci0gICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwotICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgVklERU9fRU5DT0RFUl9IMjYzLCAxMDAwMDAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICAxNzYgLyogd2lkdGggKi8sIDE0NCAvKiBoZWlnaHQgKi8sIDIwIC8qIGZyYW1lUmF0ZSAqLyk7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgODAwMCAvKiBzYW1wbGVSYXRlICovLCAxIC8qIGNoYW5uZWxzICovKTsKKwogICAgIHJldHVybiBwcm9maWxlOwogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyVGltZUxhcHNlNDgwcFByb2ZpbGUoY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkKIHsKLSAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjICp2aWRlb0NvZGVjID0KLSAgICAgICAgbmV3IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMoVklERU9fRU5DT0RFUl9IMjYzLCAyMDAwMDAwMCwgNzIwLCA0ODAsIDIwKTsKLQotICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOwogICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKICAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBxdWFsaXR5OwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOwotICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKLSAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcHJvZmlsZS0+bVZpZGVvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIFZJREVPX0VOQ09ERVJfSDI2MywgMjAwMDAwMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDcyMCAvKiB3aWR0aCAqLywgNDgwIC8qIGhlaWdodCAqLywgMjAgLyogZnJhbWVSYXRlICovKTsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICA4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIDEgLyogY2hhbm5lbHMgKi8pOwogICAgIHJldHVybiBwcm9maWxlOwogfQogCkBAIC03NTksMzYgKzg0NCwzNCBAQAogLypzdGF0aWMqLyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKgogTWVkaWFQcm9maWxlczo6Y3JlYXRlRGVmYXVsdENhbWNvcmRlclFjaWZQcm9maWxlKGNhbWNvcmRlcl9xdWFsaXR5IHF1YWxpdHkpCiB7Ci0gICAgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAqdmlkZW9Db2RlYyA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpWaWRlb0NvZGVjKFZJREVPX0VOQ09ERVJfSDI2MywgMTkyMDAwLCAxNzYsIDE0NCwgMjApOwotCi0gICAgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyAqYXVkaW9Db2RlYyA9Ci0gICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjKEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCwgODAwMCwgMSk7Ci0KLSAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpwcm9maWxlID0gbmV3IE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU7CisgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IDA7CiAgICAgcHJvZmlsZS0+bUZpbGVGb3JtYXQgPSBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUDsKICAgICBwcm9maWxlLT5tUXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgcHJvZmlsZS0+bUR1cmF0aW9uID0gMzA7Ci0gICAgcHJvZmlsZS0+bVZpZGVvQ29kZWMgPSB2aWRlb0NvZGVjOwotICAgIHByb2ZpbGUtPm1BdWRpb0NvZGVjID0gYXVkaW9Db2RlYzsKKyAgICBwcm9maWxlLT5tVmlkZW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgVklERU9fRU5DT0RFUl9IMjYzLCAxOTIwMDAgLyogYml0cmF0ZSAqLywKKyAgICAgICAgICAgIDE3NiAvKiB3aWR0aCAqLywgMTQ0IC8qIGhlaWdodCAqLywgMjAgLyogZnJhbWVSYXRlICovKTsKKyAgICBwcm9maWxlLT5tQXVkaW9Db2RlY3MuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgQVVESU9fRU5DT0RFUl9BTVJfTkIsIDEyMjAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICA4MDAwIC8qIHNhbXBsZVJhdGUgKi8sIDEgLyogY2hhbm5lbHMgKi8pOwogICAgIHJldHVybiBwcm9maWxlOwogfQogCiAvKnN0YXRpYyovIE1lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGUqCiBNZWRpYVByb2ZpbGVzOjpjcmVhdGVEZWZhdWx0Q2FtY29yZGVyQ2lmUHJvZmlsZShjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KQogewotICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQotICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhWSURFT19FTkNPREVSX0gyNjMsIDM2MDAwMCwgMzUyLCAyODgsIDIwKTsKLQotICAgIEF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYyhBVURJT19FTkNPREVSX0FNUl9OQiwgMTIyMDAsIDgwMDAsIDEpOwogICAgIENhbWNvcmRlclByb2ZpbGUgKnByb2ZpbGUgPSBuZXcgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTsKICAgICBwcm9maWxlLT5tQ2FtZXJhSWQgPSAwOwogICAgIHByb2ZpbGUtPm1GaWxlRm9ybWF0ID0gT1VUUFVUX0ZPUk1BVF9USFJFRV9HUFA7CiAgICAgcHJvZmlsZS0+bVF1YWxpdHkgPSBxdWFsaXR5OwogICAgIHByb2ZpbGUtPm1EdXJhdGlvbiA9IDYwOwotICAgIHByb2ZpbGUtPm1WaWRlb0NvZGVjID0gdmlkZW9Db2RlYzsKLSAgICBwcm9maWxlLT5tQXVkaW9Db2RlYyA9IGF1ZGlvQ29kZWM7CisgICAgcHJvZmlsZS0+bVZpZGVvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIFZJREVPX0VOQ09ERVJfSDI2MywgMzYwMDAwIC8qIGJpdHJhdGUgKi8sCisgICAgICAgICAgICAzNTIgLyogd2lkdGggKi8sIDI4OCAvKiBoZWlnaHQgKi8sIDIwIC8qIGZyYW1lUmF0ZSAqLyk7CisgICAgcHJvZmlsZS0+bUF1ZGlvQ29kZWNzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIEFVRElPX0VOQ09ERVJfQU1SX05CLCAxMjIwMCAvKiBiaXRyYXRlICovLAorICAgICAgICAgICAgODAwMCAvKiBzYW1wbGVSYXRlICovLCAxIC8qIGNoYW5uZWxzICovKTsKICAgICByZXR1cm4gcHJvZmlsZTsKIH0KIApAQCAtMTA3Miw2ICsxMTU1LDM2IEBACiAgICAgcmV0dXJuIGluZGV4OwogfQogCitjb25zdCBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlICpNZWRpYVByb2ZpbGVzOjpnZXRDYW1jb3JkZXJQcm9maWxlKAorICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjYW1jb3JkZXJfcXVhbGl0eSBxdWFsaXR5KSBjb25zdCB7CisgICAgaW50IGluZGV4ID0gZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGNhbWVyYUlkLCBxdWFsaXR5KTsKKyAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIlRoZSBnaXZlbiBjYW1jb3JkZXIgcHJvZmlsZSBjYW1lcmEgJWQgcXVhbGl0eSAlZCBpcyBub3QgZm91bmQiLAorICAgICAgICAgICAgY2FtZXJhSWQsIHF1YWxpdHkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XTsKK30KKworc3RkOjp2ZWN0b3I8Y29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyAqPgorTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZTo6Z2V0QXVkaW9Db2RlY3MoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyAqPiByZXM7CisgICAgZm9yIChjb25zdCBNZWRpYVByb2ZpbGVzOjpBdWRpb0NvZGVjICZhYyA6IG1BdWRpb0NvZGVjcykgeworICAgICAgICByZXMucHVzaF9iYWNrKCZhYyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0ZDo6dmVjdG9yPGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKj4KK01lZGlhUHJvZmlsZXM6OkNhbWNvcmRlclByb2ZpbGU6OmdldFZpZGVvQ29kZWNzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKj4gcmVzOworICAgIGZvciAoY29uc3QgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyAmdmMgOiBtVmlkZW9Db2RlY3MpIHsKKyAgICAgICAgcmVzLnB1c2hfYmFjaygmdmMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCiBpbnQgTWVkaWFQcm9maWxlczo6Z2V0Q2FtY29yZGVyUHJvZmlsZVBhcmFtQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3QKQEAgLTEwODgsMTUgKzEyMDEsMTUgQEAKIAogICAgIGlmICghc3RyY21wKCJkdXJhdGlvbiIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUR1cmF0aW9uOwogICAgIGlmICghc3RyY21wKCJmaWxlLmZvcm1hdCIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUZpbGVGb3JtYXQ7Ci0gICAgaWYgKCFzdHJjbXAoInZpZC5jb2RlYyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWMtPm1Db2RlYzsKLSAgICBpZiAoIXN0cmNtcCgidmlkLndpZHRoIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlYy0+bUZyYW1lV2lkdGg7Ci0gICAgaWYgKCFzdHJjbXAoInZpZC5oZWlnaHQiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjLT5tRnJhbWVIZWlnaHQ7Ci0gICAgaWYgKCFzdHJjbXAoInZpZC5icHMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjLT5tQml0UmF0ZTsKLSAgICBpZiAoIXN0cmNtcCgidmlkLmZwcyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWMtPm1GcmFtZVJhdGU7Ci0gICAgaWYgKCFzdHJjbXAoImF1ZC5jb2RlYyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1Db2RlYzsKLSAgICBpZiAoIXN0cmNtcCgiYXVkLmJwcyIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1CaXRSYXRlOwotICAgIGlmICghc3RyY21wKCJhdWQuY2giLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjLT5tQ2hhbm5lbHM7Ci0gICAgaWYgKCFzdHJjbXAoImF1ZC5oeiIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bUF1ZGlvQ29kZWMtPm1TYW1wbGVSYXRlOworICAgIGlmICghc3RyY21wKCJ2aWQuY29kZWMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjc1swXS5tQ29kZWM7CisgICAgaWYgKCFzdHJjbXAoInZpZC53aWR0aCIsIG5hbWUpKSByZXR1cm4gbUNhbWNvcmRlclByb2ZpbGVzW2luZGV4XS0+bVZpZGVvQ29kZWNzWzBdLm1GcmFtZVdpZHRoOworICAgIGlmICghc3RyY21wKCJ2aWQuaGVpZ2h0IiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlY3NbMF0ubUZyYW1lSGVpZ2h0OworICAgIGlmICghc3RyY21wKCJ2aWQuYnBzIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tVmlkZW9Db2RlY3NbMF0ubUJpdFJhdGU7CisgICAgaWYgKCFzdHJjbXAoInZpZC5mcHMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1WaWRlb0NvZGVjc1swXS5tRnJhbWVSYXRlOworICAgIGlmICghc3RyY21wKCJhdWQuY29kZWMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjc1swXS5tQ29kZWM7CisgICAgaWYgKCFzdHJjbXAoImF1ZC5icHMiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjc1swXS5tQml0UmF0ZTsKKyAgICBpZiAoIXN0cmNtcCgiYXVkLmNoIiwgbmFtZSkpIHJldHVybiBtQ2FtY29yZGVyUHJvZmlsZXNbaW5kZXhdLT5tQXVkaW9Db2RlY3NbMF0ubUNoYW5uZWxzOworICAgIGlmICghc3RyY21wKCJhdWQuaHoiLCBuYW1lKSkgcmV0dXJuIG1DYW1jb3JkZXJQcm9maWxlc1tpbmRleF0tPm1BdWRpb0NvZGVjc1swXS5tU2FtcGxlUmF0ZTsKIAogICAgIEFMT0dFKCJUaGUgZ2l2ZW4gY2FtY29yZGVyIHByb2ZpbGUgcGFyYW0gaWQgJWQgbmFtZSAlcyBpcyBub3QgZm91bmQiLCBjYW1lcmFJZCwgbmFtZSk7CiAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcAppbmRleCAwOTM2YTk5Li5lYzUyYTQ5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcApAQCAtMzUsNyArMzUsNyBAQAogICAgIHRoaXMtPnZhbHVlID0gdmFsdWU7CiB9CiAKLU1lZGlhUmVzb3VyY2U6Ok1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgeworTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgewogICAgIHRoaXMtPnR5cGUgPSB0eXBlOwogICAgIHRoaXMtPnN1YlR5cGUgPSBTdWJUeXBlOjprVW5zcGVjaWZpZWRTdWJUeXBlOwogICAgIHRoaXMtPmlkID0gaWQ7CkBAIC00MywxMSArNDMsMTEgQEAKIH0KIAogLy9zdGF0aWMKLU1lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgYm9vbCB2aWRlbykgeworTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvLCBpbnQ2NF90IGluc3RhbmNlQ291bnQpIHsKICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZSgKICAgICAgICAgICAgIHNlY3VyZSA/IFR5cGU6OmtTZWN1cmVDb2RlYyA6IFR5cGU6OmtOb25TZWN1cmVDb2RlYywKICAgICAgICAgICAgIHZpZGVvID8gU3ViVHlwZTo6a1ZpZGVvQ29kZWMgOiBTdWJUeXBlOjprQXVkaW9Db2RlYywKLSAgICAgICAgICAgIDEpOworICAgICAgICAgICAgaW5zdGFuY2VDb3VudCk7CiB9CiAKIC8vc3RhdGljCkBAIC02NiwxMSArNjYsMTEgQEAKIH0KIAogLy9zdGF0aWMKLU1lZGlhUmVzb3VyY2UgTWVkaWFSZXNvdXJjZTo6RHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CitNZWRpYVJlc291cmNlIE1lZGlhUmVzb3VyY2U6OkRybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKICAgICByZXR1cm4gTWVkaWFSZXNvdXJjZShUeXBlOjprRHJtU2Vzc2lvbiwgaWQsIHZhbHVlKTsKIH0KIAotc3RhdGljIFN0cmluZzggYnl0ZXNUb0hleFN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZieXRlcykgeworc3RhdGljIFN0cmluZzggYnl0ZXNUb0hleFN0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYnl0ZXMpIHsKICAgICBTdHJpbmc4IHN0cjsKICAgICBmb3IgKGF1dG8gJmIgOiBieXRlcykgewogICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgYik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDEyYTg3ZDEuLmY2ODJiNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0xOCw4ICsxOCw4IEBACiAjZGVmaW5lIExPR19UQUcgIk1pZGlJb1dyYXBwZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCmluZGV4IDNhOWZiOGIuLjc5ODMxODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyZDUyMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuSVJlc291cmNlTWFuYWdlckNsaWVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVzb3VyY2VQYXJjZWw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOwotCi0vKioKLSAqIFJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlIHRoYXQga2VlcHMgdHJhY2sgb2YgbWVkaWEgcmVzb3VyY2UKLSAqIG93bmVkIGJ5IGNsaWVudHMsIGFuZCByZWNsYWltcyByZXNvdXJjZXMgYmFzZWQgb24gY29uZmlndXJlZCBwb2xpY2llcwotICogd2hlbiBuZWNlc3NhcnkuCi0gKgotICoge0BoaWRlfQotICovCi1pbnRlcmZhY2UgSVJlc291cmNlTWFuYWdlclNlcnZpY2UgewotICAgIGNvbnN0IEB1dGY4SW5DcHAgU3RyaW5nIGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzCi0gICAgICAgICAgICA9ICJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzIjsKLSAgICBjb25zdCBAdXRmOEluQ3BwIFN0cmluZyBrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMKLSAgICAgICAgICAgID0gInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiOwotCi0gICAgLyoqCi0gICAgICogQ29uZmlndXJlIHRoZSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHRvIGFkb3B0ZWQgcGFydGljdWxhciBwb2xpY2llcyB3aGVuCi0gICAgICogbWFuYWdpbmcgdGhlIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwb2xpY2llcyBhbiBhcnJheSBvZiBwb2xpY2llcyB0byBiZSBhZG9wdGVkLgotICAgICAqLwotICAgIHZvaWQgY29uZmlnKGluIE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWxbXSBwb2xpY2llcyk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjbGllbnQgdG8gYSBwcm9jZXNzIHdpdGggYSBsaXN0IG9mIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIG9mIHRoZSBjbGllbnQuCi0gICAgICogQHBhcmFtIHVpZCB1aWQgb2YgdGhlIGNsaWVudC4KLSAgICAgKiBAcGFyYW0gY2xpZW50SWQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNsaWVudCB3aXRoaW4gdGhlIHBpZC4KLSAgICAgKiBAcGFyYW0gY2xpZW50IGludGVyZmFjZSBmb3IgdGhlIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gY2FsbCB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIGFkZGVkLgotICAgICAqLwotICAgIHZvaWQgYWRkUmVzb3VyY2UoCi0gICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgaW50IHVpZCwKLSAgICAgICAgICAgIGxvbmcgY2xpZW50SWQsCi0gICAgICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCwKLSAgICAgICAgICAgIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIHRoZSBsaXN0ZWQgcmVzb3VyY2VzIGZyb20gYSBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcGlkIHBpZCBmcm9tIHdoaWNoIHRoZSBsaXN0IG9mIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIGZyb20gd2hpY2ggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHdpbGwgYmUgcmVtb3ZlZC4KLSAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIHJlc291cmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICB2b2lkIHJlbW92ZVJlc291cmNlKGludCBwaWQsIGxvbmcgY2xpZW50SWQsIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCByZXNvdXJjZXMgZnJvbSBhIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCBwaWQsIGxvbmcgY2xpZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlCi0gICAgICogY2FsbGluZyBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHBpZCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgotICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIHJlY2xhaW1lZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjbGFpbSB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gcmVjbGFpbVJlc291cmNlKGludCBjYWxsaW5nUGlkLCBpbiBNZWRpYVJlc291cmNlUGFyY2VsW10gcmVzb3VyY2VzKTsKLQotICAgIC8qKgotICAgICAqIE92ZXJyaWRlIHRoZSBwaWQgb2Ygb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHdpdGggdGhlIHBpZCBvZiB0aGUgcHJvY2VzcwotICAgICAqIHdobyBhY3R1YWxseSB1c2UgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3JpZ2luYWxQaWQgcGlkIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MuCi0gICAgICogQHBhcmFtIG5ld1BpZCBwaWQgb2YgdGhlIGFjdHVhbCBwcm9jZXNzIHdobyB1c2UgdGhlIHJlc291cmNlcy4KLSAgICAgKiAgICAgICAgcmVtb3ZlIGV4aXN0aW5nIG92ZXJyaWRlIG9uIG9yaWdpbmFsUGlkIGlmIG5ld1BpZCBpcyAtMS4KLSAgICAgKi8KLSAgICB2b2lkIG92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCk7Ci0KLSAgICAvKioKLSAgICAgKiBNYXJrIGEgY2xpZW50IGZvciBwZW5kaW5nIHJlbW92YWwKLSAgICAgKgotICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgotICAgICAqLwotICAgIHZvaWQgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludCBwaWQsIGxvbmcgY2xpZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9hbmRyb2lkL0lNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9hbmRyb2lkL0lNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDNlMDM1YWQuLmJiMWViOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvYW5kcm9pZC9JTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL2FuZHJvaWQvSU1lZGlhRXh0cmFjdG9yLmgKQEAgLTYzLDYgKzYzLDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKSA9IDA7CiAKICAgICB2aXJ0dWFsIFN0cmluZzggbmFtZSgpID0gMDsKKworICAgIGVudW0gY2xhc3MgRW50cnlQb2ludCB7CisgICAgICAgIFNESyA9IDEsCisgICAgICAgIE5ES19XSVRIX0pWTSA9IDIsCisgICAgICAgIE5ES19OT19KVk0gPSAzLAorICAgICAgICBPVEhFUiA9IDQsCisgICAgfTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RW50cnlQb2ludChFbnRyeVBvaW50IGVudHJ5UG9pbnQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzgmIGxvZ1Nlc3Npb25JZCkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAppbmRleCBhNGMwZWM2Li4yODY4NGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKQEAgLTU5LDYgKzU5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgc291cmNlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4mIHNvdXJjZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldEJ1ZmZlcmluZ1NldHRpbmdzKApAQCAtMTM2LDYgKzEzNyw1NiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOworcHJvdGVjdGVkOgorCisgICAgZnJpZW5kIGNsYXNzIElNZWRpYVBsYXllclRlc3Q7CisgICAgZW51bSB7CisgICAgICAgIERJU0NPTk5FQ1QgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgICAgICBTRVRfREFUQV9TT1VSQ0VfVVJMLAorICAgICAgICBTRVRfREFUQV9TT1VSQ0VfRkQsCisgICAgICAgIFNFVF9EQVRBX1NPVVJDRV9TVFJFQU0sCisgICAgICAgIFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywKKyAgICAgICAgU0VUX0RBVEFfU09VUkNFX1JUUCwKKyAgICAgICAgU0VUX0JVRkZFUklOR19TRVRUSU5HUywKKyAgICAgICAgR0VUX0JVRkZFUklOR19TRVRUSU5HUywKKyAgICAgICAgUFJFUEFSRV9BU1lOQywKKyAgICAgICAgU1RBUlQsCisgICAgICAgIFNUT1AsCisgICAgICAgIElTX1BMQVlJTkcsCisgICAgICAgIFNFVF9QTEFZQkFDS19TRVRUSU5HUywKKyAgICAgICAgR0VUX1BMQVlCQUNLX1NFVFRJTkdTLAorICAgICAgICBTRVRfU1lOQ19TRVRUSU5HUywKKyAgICAgICAgR0VUX1NZTkNfU0VUVElOR1MsCisgICAgICAgIFBBVVNFLAorICAgICAgICBTRUVLX1RPLAorICAgICAgICBHRVRfQ1VSUkVOVF9QT1NJVElPTiwKKyAgICAgICAgR0VUX0RVUkFUSU9OLAorICAgICAgICBSRVNFVCwKKyAgICAgICAgTk9USUZZX0FULAorICAgICAgICBTRVRfQVVESU9fU1RSRUFNX1RZUEUsCisgICAgICAgIFNFVF9MT09QSU5HLAorICAgICAgICBTRVRfVk9MVU1FLAorICAgICAgICBJTlZPS0UsCisgICAgICAgIFNFVF9NRVRBREFUQV9GSUxURVIsCisgICAgICAgIEdFVF9NRVRBREFUQSwKKyAgICAgICAgU0VUX0FVWF9FRkZFQ1RfU0VORF9MRVZFTCwKKyAgICAgICAgQVRUQUNIX0FVWF9FRkZFQ1QsCisgICAgICAgIFNFVF9WSURFT19TVVJGQUNFVEVYVFVSRSwKKyAgICAgICAgU0VUX1BBUkFNRVRFUiwKKyAgICAgICAgR0VUX1BBUkFNRVRFUiwKKyAgICAgICAgU0VUX1JFVFJBTlNNSVRfRU5EUE9JTlQsCisgICAgICAgIEdFVF9SRVRSQU5TTUlUX0VORFBPSU5ULAorICAgICAgICBTRVRfTkVYVF9QTEFZRVIsCisgICAgICAgIEFQUExZX1ZPTFVNRV9TSEFQRVIsCisgICAgICAgIEdFVF9WT0xVTUVfU0hBUEVSX1NUQVRFLAorICAgICAgICAvLyBNb2R1bGFyIERSTQorICAgICAgICBQUkVQQVJFX0RSTSwKKyAgICAgICAgUkVMRUFTRV9EUk0sCisgICAgICAgIC8vIEF1ZGlvUm91dGluZworICAgICAgICBTRVRfT1VUUFVUX0RFVklDRSwKKyAgICAgICAgR0VUX1JPVVRFRF9ERVZJQ0VfSUQsCisgICAgICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCisgICAgfTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggZjJlMjA2MC4uNjA3MDY3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI3LDYgKzI3LDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NCwxMCArNDcsMTMgQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUGxheWVyU2VydmljZSk7CiAKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lKSA9IDA7CisgICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gY3JlYXRlTWVkaWFSZWNvcmRlcigKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYU1ldGFkYXRhUmV0cmlldmVyPiBjcmVhdGVNZXRhZGF0YVJldHJpZXZlcigpID0gMDsKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUpID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCisgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFDb2RlY0xpc3Q+IGdldENvZGVjTGlzdCgpIGNvbnN0ID0gMDsKIAogICAgIC8vIENvbm5lY3RzIHRvIGEgcmVtb3RlIGRpc3BsYXkuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKaW5kZXggNjUxYmQ1ZS4uNmU2OTc4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApAQCAtNzgsNiArNzgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJ0cERhdGFVc2FnZSh1aW50NjRfdCAqYnl0ZXMpID0gMDsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggNGNjNWI5NS4uNGE4OThlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gY2FtY29yZGVyX3F1YWxpdHkgewpAQCAtMzcsOCArMzksOSBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1ZHQSA9IDksCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfNEtEQ0kgPSAxMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9RSEQgPSAxMSwKLSAgICBDQU1DT1JERVJfUVVBTElUWV8yayA9IDEyLAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gMTIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfMksgPSAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV84S1VIRCA9IDEzLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gMTMsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfU1RBUlQgPSAxMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTE9XICA9IDEwMDAsCkBAIC01Myw4ICs1Niw5IEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9WR0EgPSAxMDA5LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0kgPSAxMDEwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEID0gMTAxMSwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrID0gMTAxMiwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJLID0gMTAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzhLVUhEID0gMTAxMywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAxMywKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9TVEFSVCA9IDIwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MT1cgID0gMjAwMCwKQEAgLTk4LDYgKzEwMiwxOTMgQEAKICAgICBzdGF0aWMgTWVkaWFQcm9maWxlcyogZ2V0SW5zdGFuY2UoKTsKIAogICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gZW5jb2Rlci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgVmlkZW9Db2RlYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIHZpZGVvIGVuY29kZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvZGVjIGNvZGVjIHR5cGUKKyAgICAgICAgICogQHBhcmFtIGJpdHJhdGUgYml0cmF0ZSBpbiBicHMKKyAgICAgICAgICogQHBhcmFtIGZyYW1lV2lkdGggZnJhbWUgd2lkdGggaW4gcGl4ZWxzCisgICAgICAgICAqIEBwYXJhbSBmcmFtZUhlaWdodCBmcmFtZSBoZWlnaHQgaW4gcGl4ZWxzCisgICAgICAgICAqIEBwYXJhbSBmcmFtZVJhdGUgZnJhbWUgcmF0ZSBpbiBmcHMKKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgY29kZWMgcHJvZmlsZSAoZm9yIE1lZGlhQ29kZWMpIG9yIC0xIGZvciBub25lCisgICAgICAgICAqLworICAgICAgICBWaWRlb0NvZGVjKHZpZGVvX2VuY29kZXIgY29kZWMsIGludCBiaXRyYXRlLCBpbnQgZnJhbWVXaWR0aCwgaW50IGZyYW1lSGVpZ2h0LCBpbnQgZnJhbWVSYXRlLAorICAgICAgICAgICAgICAgICAgIGludCBwcm9maWxlID0gLTEpCisgICAgICAgICAgICA6IG1Db2RlYyhjb2RlYyksCisgICAgICAgICAgICAgIG1CaXRSYXRlKGJpdHJhdGUpLAorICAgICAgICAgICAgICBtRnJhbWVXaWR0aChmcmFtZVdpZHRoKSwKKyAgICAgICAgICAgICAgbUZyYW1lSGVpZ2h0KGZyYW1lSGVpZ2h0KSwKKyAgICAgICAgICAgICAgbUZyYW1lUmF0ZShmcmFtZVJhdGUpLAorICAgICAgICAgICAgICBtUHJvZmlsZShwcm9maWxlKSB7CisgICAgICAgIH0KKworICAgICAgICBWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgflZpZGVvQ29kZWMoKSB7fQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBjb2RlYyB0eXBlLiAqLworICAgICAgICB2aWRlb19lbmNvZGVyIGdldENvZGVjKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1Db2RlYzsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBiaXRyYXRlIGluIGJwcy4gKi8KKyAgICAgICAgaW50IGdldEJpdHJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUJpdFJhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgZnJhbWUgd2lkdGggaW4gcGl4ZWxzLiAqLworICAgICAgICBpbnQgZ2V0RnJhbWVXaWR0aCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtRnJhbWVXaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBmcmFtZSBoZWlnaHQgaW4gcGl4ZWxzLiAqLworICAgICAgICBpbnQgZ2V0RnJhbWVIZWlnaHQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUZyYW1lSGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGZyYW1lIHJhdGUgaW4gZnBzLiAqLworICAgICAgICBpbnQgZ2V0RnJhbWVSYXRlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1GcmFtZVJhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgY29kZWMgcHJvZmlsZSAob3IgLTEgZm9yIG5vIHByb2ZpbGUpLiAqLworICAgICAgICBpbnQgZ2V0UHJvZmlsZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUHJvZmlsZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlkZW9fZW5jb2RlciBtQ29kZWM7CisgICAgICAgIGludCBtQml0UmF0ZTsKKyAgICAgICAgaW50IG1GcmFtZVdpZHRoOworICAgICAgICBpbnQgbUZyYW1lSGVpZ2h0OworICAgICAgICBpbnQgbUZyYW1lUmF0ZTsKKyAgICAgICAgaW50IG1Qcm9maWxlOworICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQcm9maWxlczsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBmb3IgYW4gYXVkaW8gZW5jb2Rlci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQXVkaW9Db2RlYyB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhbiBhdWRpbyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2RlYyBjb2RlYyB0eXBlCisgICAgICAgICAqIEBwYXJhbSBiaXRyYXRlIGJpdHJhdGUgaW4gYnBzCisgICAgICAgICAqIEBwYXJhbSBzYW1wbGVSYXRlIHNhbXBsZSByYXRlIGluIEh6CisgICAgICAgICAqIEBwYXJhbSBjaGFubmVscyBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICogQHBhcmFtIHByb2ZpbGUgY29kZWMgcHJvZmlsZSAoZm9yIE1lZGlhQ29kZWMpIG9yIC0xIGZvciBub25lCisgICAgICAgICAqLworICAgICAgICBBdWRpb0NvZGVjKGF1ZGlvX2VuY29kZXIgY29kZWMsIGludCBiaXRyYXRlLCBpbnQgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxzLCBpbnQgcHJvZmlsZSA9IC0xKQorICAgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLAorICAgICAgICAgICAgICBtQml0UmF0ZShiaXRyYXRlKSwKKyAgICAgICAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCisgICAgICAgICAgICAgIG1DaGFubmVscyhjaGFubmVscyksCisgICAgICAgICAgICAgIG1Qcm9maWxlKHByb2ZpbGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIEF1ZGlvQ29kZWMoY29uc3QgQXVkaW9Db2RlYyYpID0gZGVmYXVsdDsKKworICAgICAgICB+QXVkaW9Db2RlYygpIHt9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGNvZGVjIHR5cGUuICovCisgICAgICAgIGF1ZGlvX2VuY29kZXIgZ2V0Q29kZWMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNvZGVjOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGJpdHJhdGUgaW4gYnBzLiAqLworICAgICAgICBpbnQgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQml0UmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBzYW1wbGUgcmF0ZSBpbiBIei4gKi8KKyAgICAgICAgaW50IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLiAqLworICAgICAgICBpbnQgZ2V0Q2hhbm5lbHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUNoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGNvZGVjIHByb2ZpbGUgKG9yIC0xIGZvciBubyBwcm9maWxlKS4gKi8KKyAgICAgICAgaW50IGdldFByb2ZpbGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVByb2ZpbGU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGF1ZGlvX2VuY29kZXIgbUNvZGVjOworICAgICAgICBpbnQgbUJpdFJhdGU7CisgICAgICAgIGludCBtU2FtcGxlUmF0ZTsKKyAgICAgICAgaW50IG1DaGFubmVsczsKKyAgICAgICAgaW50IG1Qcm9maWxlOworICAgICAgICBmcmllbmQgY2xhc3MgTWVkaWFQcm9maWxlczsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBmb3IgYSBjYW1jb3JkZXIgcHJvZmlsZS9lbmNvZGVyIHByb2ZpbGVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ2FtY29yZGVyUHJvZmlsZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiAgUmV0dXJucyBvbiBvcmRlcmVkIGxpc3Qgb2YgdGhlIHZpZGVvIGNvZGVjIGNvbmZpZ3VyYXRpb25zIGluCisgICAgICAgICAqICBkZWNyZWFzaW5nIHByZWZlcmVuY2UuIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgb25seSB2YWxpZAorICAgICAgICAgKiAgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZpZGVvQ29kZWMgKj4gZ2V0VmlkZW9Db2RlY3MoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogIFJldHVybnMgb24gb3JkZXJlZCBsaXN0IG9mIHRoZSBhdWRpbyBjb2RlYyBjb25maWd1cmF0aW9ucyBpbgorICAgICAgICAgKiAgZGVjcmVhc2luZyBwcmVmZXJlbmNlLiBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIG9ubHkgdmFsaWQKKyAgICAgICAgICogIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBBdWRpb0NvZGVjICo+IGdldEF1ZGlvQ29kZWNzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqIFJldHVybnMgdGhlIGRlZmF1bHQgZHVyYXRpb24gaW4gc2Vjb25kcy4gKi8KKyAgICAgICAgaW50IGdldER1cmF0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1EdXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgZmlsZSBmb3JtYXQuICovCisgICAgICAgIGludCBnZXRGaWxlRm9ybWF0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1GaWxlRm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgQ2FtY29yZGVyUHJvZmlsZShjb25zdCBDYW1jb3JkZXJQcm9maWxlJiBjb3B5KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgfkNhbWNvcmRlclByb2ZpbGUoKSA9IGRlZmF1bHQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBvYmplY3Qgd2l0aCBubyBhdWRpby92aWRlbyBwcm9maWxlcy4KKyAgICAgICAgICovCisgICAgICAgIENhbWNvcmRlclByb2ZpbGUoKQorICAgICAgICAgICAgOiBtQ2FtZXJhSWQoMCksCisgICAgICAgICAgICAgIG1GaWxlRm9ybWF0KE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKSwKKyAgICAgICAgICAgICAgbVF1YWxpdHkoQ0FNQ09SREVSX1FVQUxJVFlfSElHSCksCisgICAgICAgICAgICAgIG1EdXJhdGlvbigwKSB7fQorCisgICAgICAgIGludCBtQ2FtZXJhSWQ7CisgICAgICAgIG91dHB1dF9mb3JtYXQgbUZpbGVGb3JtYXQ7CisgICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IG1RdWFsaXR5OworICAgICAgICBpbnQgbUR1cmF0aW9uOworICAgICAgICBzdGQ6OnZlY3RvcjxWaWRlb0NvZGVjPiBtVmlkZW9Db2RlY3M7CisgICAgICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQ29kZWM+IG1BdWRpb0NvZGVjczsKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUHJvZmlsZXM7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIENhbWNvcmRlclByb2ZpbGUgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gY2FtZXJhIGF0CisgICAgICogdGhlIGdpdmVuIHF1YWxpdHkgbGV2ZWwsIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICovCisgICAgY29uc3QgQ2FtY29yZGVyUHJvZmlsZSAqZ2V0Q2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtIG5hbWUgZm9yIHRoZSBnaXZlbiBjYW1lcmEgYXQKICAgICAgKiB0aGUgZ2l2ZW4gcXVhbGl0eSBsZXZlbCwgb3IgLTEgaWYgZXJyb3IuCiAgICAgICoKQEAgLTIwMCw4NCArMzkxLDYgQEAKICAgICBNZWRpYVByb2ZpbGVzKCkge30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHVtbXkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgIH5NZWRpYVByb2ZpbGVzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBkZWxldGUgbWUKIAotICAgIHN0cnVjdCBWaWRlb0NvZGVjIHsKLSAgICAgICAgVmlkZW9Db2RlYyh2aWRlb19lbmNvZGVyIGNvZGVjLCBpbnQgYml0UmF0ZSwgaW50IGZyYW1lV2lkdGgsIGludCBmcmFtZUhlaWdodCwgaW50IGZyYW1lUmF0ZSkKLSAgICAgICAgICAgIDogbUNvZGVjKGNvZGVjKSwKLSAgICAgICAgICAgICAgbUJpdFJhdGUoYml0UmF0ZSksCi0gICAgICAgICAgICAgIG1GcmFtZVdpZHRoKGZyYW1lV2lkdGgpLAotICAgICAgICAgICAgICBtRnJhbWVIZWlnaHQoZnJhbWVIZWlnaHQpLAotICAgICAgICAgICAgICBtRnJhbWVSYXRlKGZyYW1lUmF0ZSkge30KLQotICAgICAgICBWaWRlb0NvZGVjKGNvbnN0IFZpZGVvQ29kZWMmIGNvcHkpIHsKLSAgICAgICAgICAgIG1Db2RlYyA9IGNvcHkubUNvZGVjOwotICAgICAgICAgICAgbUJpdFJhdGUgPSBjb3B5Lm1CaXRSYXRlOwotICAgICAgICAgICAgbUZyYW1lV2lkdGggPSBjb3B5Lm1GcmFtZVdpZHRoOwotICAgICAgICAgICAgbUZyYW1lSGVpZ2h0ID0gY29weS5tRnJhbWVIZWlnaHQ7Ci0gICAgICAgICAgICBtRnJhbWVSYXRlID0gY29weS5tRnJhbWVSYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgflZpZGVvQ29kZWMoKSB7fQotCi0gICAgICAgIHZpZGVvX2VuY29kZXIgbUNvZGVjOwotICAgICAgICBpbnQgbUJpdFJhdGU7Ci0gICAgICAgIGludCBtRnJhbWVXaWR0aDsKLSAgICAgICAgaW50IG1GcmFtZUhlaWdodDsKLSAgICAgICAgaW50IG1GcmFtZVJhdGU7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBBdWRpb0NvZGVjIHsKLSAgICAgICAgQXVkaW9Db2RlYyhhdWRpb19lbmNvZGVyIGNvZGVjLCBpbnQgYml0UmF0ZSwgaW50IHNhbXBsZVJhdGUsIGludCBjaGFubmVscykKLSAgICAgICAgICAgIDogbUNvZGVjKGNvZGVjKSwKLSAgICAgICAgICAgICAgbUJpdFJhdGUoYml0UmF0ZSksCi0gICAgICAgICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAotICAgICAgICAgICAgICBtQ2hhbm5lbHMoY2hhbm5lbHMpIHt9Ci0KLSAgICAgICAgQXVkaW9Db2RlYyhjb25zdCBBdWRpb0NvZGVjJiBjb3B5KSB7Ci0gICAgICAgICAgICBtQ29kZWMgPSBjb3B5Lm1Db2RlYzsKLSAgICAgICAgICAgIG1CaXRSYXRlID0gY29weS5tQml0UmF0ZTsKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gY29weS5tU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIG1DaGFubmVscyA9IGNvcHkubUNoYW5uZWxzOwotICAgICAgICB9Ci0KLSAgICAgICAgfkF1ZGlvQ29kZWMoKSB7fQotCi0gICAgICAgIGF1ZGlvX2VuY29kZXIgbUNvZGVjOwotICAgICAgICBpbnQgbUJpdFJhdGU7Ci0gICAgICAgIGludCBtU2FtcGxlUmF0ZTsKLSAgICAgICAgaW50IG1DaGFubmVsczsKLSAgICB9OwotCi0gICAgc3RydWN0IENhbWNvcmRlclByb2ZpbGUgewotICAgICAgICBDYW1jb3JkZXJQcm9maWxlKCkKLSAgICAgICAgICAgIDogbUNhbWVyYUlkKDApLAotICAgICAgICAgICAgICBtRmlsZUZvcm1hdChPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCksCi0gICAgICAgICAgICAgIG1RdWFsaXR5KENBTUNPUkRFUl9RVUFMSVRZX0hJR0gpLAotICAgICAgICAgICAgICBtRHVyYXRpb24oMCksCi0gICAgICAgICAgICAgIG1WaWRlb0NvZGVjKDApLAotICAgICAgICAgICAgICBtQXVkaW9Db2RlYygwKSB7fQotCi0gICAgICAgIENhbWNvcmRlclByb2ZpbGUoY29uc3QgQ2FtY29yZGVyUHJvZmlsZSYgY29weSkgewotICAgICAgICAgICAgbUNhbWVyYUlkID0gY29weS5tQ2FtZXJhSWQ7Ci0gICAgICAgICAgICBtRmlsZUZvcm1hdCA9IGNvcHkubUZpbGVGb3JtYXQ7Ci0gICAgICAgICAgICBtUXVhbGl0eSA9IGNvcHkubVF1YWxpdHk7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBjb3B5Lm1EdXJhdGlvbjsKLSAgICAgICAgICAgIG1WaWRlb0NvZGVjID0gbmV3IFZpZGVvQ29kZWMoKmNvcHkubVZpZGVvQ29kZWMpOwotICAgICAgICAgICAgbUF1ZGlvQ29kZWMgPSBuZXcgQXVkaW9Db2RlYygqY29weS5tQXVkaW9Db2RlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICB+Q2FtY29yZGVyUHJvZmlsZSgpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtVmlkZW9Db2RlYzsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9Db2RlYzsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBtQ2FtZXJhSWQ7Ci0gICAgICAgIG91dHB1dF9mb3JtYXQgbUZpbGVGb3JtYXQ7Ci0gICAgICAgIGNhbWNvcmRlcl9xdWFsaXR5IG1RdWFsaXR5OwotICAgICAgICBpbnQgbUR1cmF0aW9uOwotICAgICAgICBWaWRlb0NvZGVjICptVmlkZW9Db2RlYzsKLSAgICAgICAgQXVkaW9Db2RlYyAqbUF1ZGlvQ29kZWM7Ci0gICAgfTsKLQogICAgIHN0cnVjdCBWaWRlb0VuY29kZXJDYXAgewogICAgICAgICAvLyBVZ2x5IGNvbnN0cnVjdG9yCiAgICAgICAgIFZpZGVvRW5jb2RlckNhcCh2aWRlb19lbmNvZGVyIGNvZGVjLApAQCAtMzYyLDIzICs0NzUsMjMgQEAKICAgICAvLyBJZiB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIGV4aXN0LCB1c2UgdGhlIHNldHRpbmdzCiAgICAgLy8gZnJvbSB0aGUgeG1sCiAgICAgc3RhdGljIE1lZGlhUHJvZmlsZXMqIGNyZWF0ZUluc3RhbmNlRnJvbVhtbEZpbGUoY29uc3QgY2hhciAqeG1sKTsKLSAgICBzdGF0aWMgb3V0cHV0X2Zvcm1hdCBjcmVhdGVFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIFZpZGVvQ29kZWMqIGNyZWF0ZVZpZGVvQ29kZWMoY29uc3QgY2hhciAqKmF0dHMsIE1lZGlhUHJvZmlsZXMgKnByb2ZpbGVzKTsKLSAgICBzdGF0aWMgQXVkaW9Db2RlYyogY3JlYXRlQXVkaW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwotICAgIHN0YXRpYyBBdWRpb0RlY29kZXJDYXAqIGNyZWF0ZUF1ZGlvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIFZpZGVvRGVjb2RlckNhcCogY3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKLSAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVWaWRlb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwotICAgIHN0YXRpYyBBdWRpb0VuY29kZXJDYXAqIGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7CisgICAgc3RhdGljIG91dHB1dF9mb3JtYXQgY3JlYXRlRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CisgICAgc3RhdGljIHZvaWQgY3JlYXRlVmlkZW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CisgICAgc3RhdGljIHZvaWQgY3JlYXRlQXVkaW9Db2RlYyhjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CisgICAgc3RhdGljIEF1ZGlvRGVjb2RlckNhcCogY3JlYXRlQXVkaW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpOworICAgIHN0YXRpYyBWaWRlb0RlY29kZXJDYXAqIGNyZWF0ZVZpZGVvRGVjb2RlckNhcChjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzKTsKKyAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVWaWRlb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CisgICAgc3RhdGljIEF1ZGlvRW5jb2RlckNhcCogY3JlYXRlQXVkaW9FbmNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpOwogCiAgICAgc3RhdGljIENhbWNvcmRlclByb2ZpbGUqIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUoCi0gICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cywgVmVjdG9yPGludD4mIGNhbWVyYUlkcyk7CisgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyICoqYXR0cywgc2l6ZV90IG5hdHRzLCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKTsKIAotICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhSWQoY29uc3QgY2hhciAqKmF0dHMpOworICAgIHN0YXRpYyBpbnQgZ2V0Q2FtZXJhSWQoY29uc3QgY2hhciAqKmF0dHMsIHNpemVfdCBuYXR0cyk7CiAKLSAgICB2b2lkIGFkZFN0YXJ0VGltZU9mZnNldChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzKTsKKyAgICB2b2lkIGFkZFN0YXJ0VGltZU9mZnNldChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBzaXplX3QgbmF0dHMpOwogCiAgICAgSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbHMqIGZpbmRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhpbnQgY2FtZXJhSWQpIGNvbnN0OwotICAgIHZvaWQgYWRkSW1hZ2VFbmNvZGluZ1F1YWxpdHlMZXZlbChpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIqKiBhdHRzKTsKKyAgICB2b2lkIGFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwoaW50IGNhbWVyYUlkLCBjb25zdCBjaGFyKiogYXR0cywgc2l6ZV90IG5hdHRzKTsKIAogICAgIC8vIEN1c3RvbWl6ZWQgZWxlbWVudCB0YWcgaGFuZGxlciBmb3IgcGFyc2luZyB0aGUgeG1sIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBzdGF0aWMgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggODQ5M2Y2NC4uMmI3ODE4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCkBAIC0zMyw4ICszNCw4IEBACiBzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiAKIHN0cnVjdCBNZWRpYVJlY29yZGVyQmFzZSB7Ci0gICAgTWVkaWFSZWNvcmRlckJhc2UoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCi0gICAgICAgIDogbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkge30KKyAgICBleHBsaWNpdCBNZWRpYVJlY29yZGVyQmFzZShjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSkKKyAgICAgICAgOiBtQXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpIHt9CiAgICAgdmlydHVhbCB+TWVkaWFSZWNvcmRlckJhc2UoKSB7fQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCkgPSAwOwpAQCAtNzcsMTIgKzc4LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykgPSAwOwogCiAKIAogcHJvdGVjdGVkOgogCi0gICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CisgICAgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBtQXR0cmlidXRpb25Tb3VyY2U7CiAKIHByaXZhdGU6CiAgICAgTWVkaWFSZWNvcmRlckJhc2UoY29uc3QgTWVkaWFSZWNvcmRlckJhc2UgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCmluZGV4IGU3MzYyYzEuLjQ3MTI1MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCkBAIC0zNSwxMyArMzUsMTMgQEAKICAgICBNZWRpYVJlc291cmNlKCkgPSBkZWxldGU7CiAgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGludDY0X3QgdmFsdWUpOwogICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBTdWJUeXBlIHN1YlR5cGUsIGludDY0X3QgdmFsdWUpOwotICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CisgICAgTWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CiAKLSAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvKTsKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBDb2RlY1Jlc291cmNlKGJvb2wgc2VjdXJlLCBib29sIHZpZGVvLCBpbnQ2NF90IGluc3RhbmNlQ291bnQgPSAxKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBHcmFwaGljTWVtb3J5UmVzb3VyY2UoaW50NjRfdCB2YWx1ZSk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgQ3B1Qm9vc3RSZXNvdXJjZSgpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIFZpZGVvQmF0dGVyeVJlc291cmNlKCk7Ci0gICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgRHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPGludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKKyAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKTsKIH07CiAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoTWVkaWFSZXNvdXJjZTo6VHlwZSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCmluZGV4IDEzOGEwMTQuLmZiYTFhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCkBAIC03Myw2ICs3Myw5IEBACiAgICAgTUVUQURBVEFfS0VZX0NPTE9SX1JBTkdFICAgICA9IDM3LAogICAgIE1FVEFEQVRBX0tFWV9TQU1QTEVSQVRFICAgICAgPSAzOCwKICAgICBNRVRBREFUQV9LRVlfQklUU19QRVJfU0FNUExFID0gMzksCisgICAgTUVUQURBVEFfS0VZX1ZJREVPX0NPREVDX01JTUVfVFlQRSA9IDQwLAorICAgIE1FVEFEQVRBX0tFWV9YTVBfT0ZGU0VUICAgICAgPSA0MSwKKyAgICBNRVRBREFUQV9LRVlfWE1QX0xFTkdUSCAgICAgID0gNDIsCiAKICAgICAvLyBBZGQgbW9yZSBoZXJlLi4uCiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCmluZGV4IDIzMzVjNWEuLmRlNGM3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKQEAgLTI5LDEwICsyOSwxMyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCisjaW5jbHVkZSA8c3RyaW5nPgorCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjAsNiArNjMsNyBAQAogICAgIE1FRElBX01FVEFfREFUQSAgICAgICAgID0gMjAyLAogICAgIE1FRElBX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAogICAgIE1FRElBX1RJTUVfRElTQ09OVElOVUlUWSA9IDIxMSwKKyAgICBNRURJQV9JTVNfUlhfTk9USUNFICAgICA9IDMwMCwKICAgICBNRURJQV9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKIH07CiAKQEAgLTE3Nyw3ICsxODEsMTAgQEAKICAgICBLRVlfUEFSQU1FVEVSX1BMQVlCQUNLX1JBVEVfUEVSTUlMTEUgPSAxMzAwLCAgICAgICAgICAgICAgICAvLyBzZXQgb25seQogCiAgICAgLy8gU2V0IGEgUGFyY2VsIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIGEgcGFyY2VsbGVkIEphdmEgQXVkaW9BdHRyaWJ1dGUgaW5zdGFuY2UKLSAgICBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQorICAgIEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUyA9IDE0MDAsICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQorCisgICAgLy8gU2V0IGEgUGFyY2VsIGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiBSVFAgYXR0cmlidXRlCisgICAgS0VZX1BBUkFNRVRFUl9SVFBfQVRUUklCVVRFUyA9IDIwMDAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5CiB9OwogCiAvLyBLZWVwIElOVk9LRV9JRF8qIGluIHN5bmMgd2l0aCBNZWRpYVBsYXllci5qYXZhLgpAQCAtMjA1LDcgKzIxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElNZWRpYURlYXRoTm90aWZpZXIKIHsKIHB1YmxpYzoKLSAgICBNZWRpYVBsYXllcigpOworICAgIGV4cGxpY2l0IE1lZGlhUGxheWVyKGNvbnN0IGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUmIG1BdHRyaWJ1dGlvblNvdXJjZSA9CisgICAgICAgIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUoKSk7CiAgICAgfk1lZGlhUGxheWVyKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGllZCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTIxNyw2ICsyMjUsNyBAQAogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyTGlzdGVuZXI+JiBsaXN0ZW5lcik7CkBAIC0zMDgsNiArMzE3LDcgQEAKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludDsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkOworICAgIGNvbnN0IGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUgbUF0dHJpYnV0aW9uU291cmNlOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKaW5kZXggNmUyZDk0ZC4uZDU0ZmYzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmgKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NaWNyb3Bob25lSW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjI2LDcgKzIyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewogcHVibGljOgotICAgIE1lZGlhUmVjb3JkZXIoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworICAgIGV4cGxpY2l0IE1lZGlhUmVjb3JkZXIoY29uc3QgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogICAgIH5NZWRpYVJlY29yZGVyKCk7CiAKICAgICB2b2lkICAgICAgICBkaWVkKCk7CkBAIC0yNzAsNiArMjcxLDcgQEAKICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiAKICAgICBzdGF0dXNfdCAgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKKyAgICBzdGF0dXNfdCAgICBnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKTsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKQEAgLTI5MSw2ICsyOTMsOCBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtSXNPdXRwdXRGaWxlU2V0OwogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxvY2s7CisKKyAgICBvdXRwdXRfZm9ybWF0ICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdDsKIH07CiAKIH07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IDFmYWRjOTQuLjFjOWI5ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTQwLDggKzQwLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIG1lZGlhOjpWb2x1bWVTaGFwZXI7Cit1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCi1NZWRpYVBsYXllcjo6TWVkaWFQbGF5ZXIoKQorTWVkaWFQbGF5ZXI6Ok1lZGlhUGxheWVyKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICA6IG1BdHRyaWJ1dGlvblNvdXJjZShhdHRyaWJ1dGlvblNvdXJjZSkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKICAgICBtTGlzdGVuZXIgPSBOVUxMOwpAQCAtMTUyLDcgKzE1NCw3IEBACiAgICAgaWYgKHVybCAhPSBOVUxMKSB7CiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkKSk7CisgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXI+IHBsYXllcihzZXJ2aWNlLT5jcmVhdGUodGhpcywgbUF1ZGlvU2Vzc2lvbklkLCBtQXR0cmlidXRpb25Tb3VyY2UpKTsKICAgICAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKICAgICAgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMpKSkgewogICAgICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwpAQCAtMTY5LDcgKzE3MSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKKyAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIoc2VydmljZS0+Y3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCwgbUF0dHJpYnV0aW9uU291cmNlKSk7CiAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSkpIHsKICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwpAQCAtMTg1LDcgKzE4Nyw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKKyAgICAgICAgc3A8SU1lZGlhUGxheWVyPiBwbGF5ZXIoc2VydmljZS0+Y3JlYXRlKHRoaXMsIG1BdWRpb1Nlc3Npb25JZCwgbUF0dHJpYnV0aW9uU291cmNlKSk7CiAgICAgICAgIGlmICgoTk9fRVJST1IgIT0gZG9TZXRSZXRyYW5zbWl0RW5kcG9pbnQocGxheWVyKSkgfHwKICAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbGF5ZXItPnNldERhdGFTb3VyY2Uoc291cmNlKSkpIHsKICAgICAgICAgICAgIHBsYXllci5jbGVhcigpOwpAQCAtMTk1LDYgKzE5NywyMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShydHBQYXJhbXMpIik7CisgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBjb25zdCBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQsIG1BdHRyaWJ1dGlvblNvdXJjZSkpOworICAgICAgICBpZiAoKE5PX0VSUk9SICE9IGRvU2V0UmV0cmFuc21pdEVuZHBvaW50KHBsYXllcikpIHx8CisgICAgICAgICAgICAoTk9fRVJST1IgIT0gcGxheWVyLT5zZXREYXRhU291cmNlKHJ0cFBhcmFtcykpKSB7CisgICAgICAgICAgICBwbGF5ZXIuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBhdHRhY2hOZXdQbGF5ZXIocGxheWVyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTk0Myw2ICs5NjEsOSBAQAogICAgIGNhc2UgTUVESUFfTUVUQV9EQVRBOgogICAgICAgICBBTE9HVigiUmVjZWl2ZWQgdGltZWQgbWV0YWRhdGEgbWVzc2FnZSIpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX0lNU19SWF9OT1RJQ0U6CisgICAgICAgIEFMT0dWKCJSZWNlaXZlZCBJTVMgUnggbm90aWNlIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggNzA2NTVkNS4uY2YxMmMzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTMzLDYgKzMzLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRDYW1lcmEoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsCiAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KQogewpAQCAtMjQ0LDYgKzI0Niw3IEBACiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9FUlJPUjsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisgICAgbU91dHB1dEZvcm1hdCA9IChvdXRwdXRfZm9ybWF0KW9mOwogICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9SRUNPUkRFUl9EQVRBU09VUkNFX0NPTkZJR1VSRUQ7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ3OSw2ICs0ODIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNRURJQV9SRUNPUkRFUl9QUkVQQVJFRCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9SRUNPUkRFUl9FUlJPUikpOworCisgICAgLy8gRm9yIFJUUCB2aWRlbywgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgZHluYW1pY2FsbHkuCisgICAgaWYgKGlzSW52YWxpZFN0YXRlKSB7CisgICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1JFQ09SREVSX1JFQ09SRElORyAmJgorICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlApCisgICAgICAgICAgICBpc0ludmFsaWRTdGF0ZSA9IGZhbHNlOworICAgIH0KICAgICBpZiAoaXNJbnZhbGlkU3RhdGUpIHsKICAgICAgICAgQUxPR0UoInNldFBhcmFtZXRlcnMgaXMgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGU6ICVkIiwgbUN1cnJlbnRTdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTczNyw2ICs3NDcsNyBAQAogICAgIG1Jc0F1ZGlvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc1ZpZGVvRW5jb2RlclNldCA9IGZhbHNlOwogICAgIG1Jc091dHB1dEZpbGVTZXQgICA9IGZhbHNlOworICAgIG1PdXRwdXRGb3JtYXQgICAgICA9IE9VVFBVVF9GT1JNQVRfREVGQVVMVDsKIH0KIAogLy8gUmVsZWFzZSBzaG91bGQgYmUgT0sgaW4gYW55IHN0YXRlCkBAIC03NDksMTMgKzc2MCwxNCBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotTWVkaWFSZWNvcmRlcjo6TWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkgOiBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpCitNZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgJmF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICA6IG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKIAogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbU1lZGlhUmVjb3JkZXIgPSBzZXJ2aWNlLT5jcmVhdGVNZWRpYVJlY29yZGVyKG9wUGFja2FnZU5hbWUpOworICAgICAgICBtTWVkaWFSZWNvcmRlciA9IHNlcnZpY2UtPmNyZWF0ZU1lZGlhUmVjb3JkZXIoYXR0cmlidXRpb25Tb3VyY2UpOwogICAgIH0KICAgICBpZiAobU1lZGlhUmVjb3JkZXIgIT0gTlVMTCkgewogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfSURMRTsKQEAgLTkwNCw0ICs5MTYsMTQgQEAKICAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldFBvcnRJZChwb3J0SWQpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKQoreworICAgIEFMT0dWKCJnZXRSdHBEYXRhVXNhZ2UiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRSdHBEYXRhVXNhZ2UoYnl0ZXMpOworfQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvdGVzdHMvY29kZWNsaXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icAppbmRleCBhOTMwZDZlLi43ZGQwY2FhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9jb2RlY2xpc3QvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkNvZGVjTGlzdFRlc3QiLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS90ZXN0cy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDNiNWIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxOSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgbmFtZTogImxpYm1lZGlhX21ldGFkYXRhX2Z1enplciIsCisgIHNyY3M6IFsKKyAgICAibGlibWVkaWFfbWV0YWRhdGFfZnV6emVyLmNwcCIsCisgIF0sCisgIHNoYXJlZF9saWJzOiBbCisgICAgImxpYm1lZGlhIiwKKyAgICAibGliYmluZGVyIiwKKyAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2Z1enplci9saWJtZWRpYV9tZXRhZGF0YV9mdXp6ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvZnV6emVyL2xpYm1lZGlhX21ldGFkYXRhX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4ZTRlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL2Z1enplci9saWJtZWRpYV9tZXRhZGF0YV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8vVGhpcyBwcm9ncmFtIGZ1enplcyBNZXRhZGF0YS5jcHAKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgbWVkaWE7CisKK3N0YXRpYyBjb25zdCBmbG9hdCB3YW50X3Byb2IgPSAwLjU7CisKK2Jvb2wgYnl0ZXNSZW1haW4oRnV6emVkRGF0YVByb3ZpZGVyICpmZHApOworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcChkYXRhLCBzaXplKTsKKyAgICBQYXJjZWwgcDsKKyAgICBNZXRhZGF0YSBtZCA9IE1ldGFkYXRhKCZwKTsKKworICAgIG1kLmFwcGVuZEhlYWRlcigpOworICAgIHdoaWxlIChieXRlc1JlbWFpbigmZmRwKSkgeworCisgICAgICAgIGZsb2F0IGdvdF9wcm9iID0gZmRwLkNvbnN1bWVQcm9iYWJpbGl0eTxmbG9hdD4oKTsKKyAgICAgICAgaWYgKCFieXRlc1JlbWFpbigmZmRwKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ290X3Byb2IgPCB3YW50X3Byb2IpIHsKKyAgICAgICAgICAgIGludDMyX3Qga2V5X2Jvb2wgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgICAgICBpZiAoIWJ5dGVzUmVtYWluKCZmZHApKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHZhbF9ib29sID0gZmRwLkNvbnN1bWVCb29sKCk7CisgICAgICAgICAgICBtZC5hcHBlbmRCb29sKGtleV9ib29sLCB2YWxfYm9vbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQzMl90IGtleV9pbnQzMiA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgICAgIGlmICghYnl0ZXNSZW1haW4oJmZkcCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdmFsX2ludDMyID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgbWQuYXBwZW5kSW50MzIoa2V5X2ludDMyLCB2YWxfaW50MzIpOworICAgICAgICB9CisgICAgICAgIG1kLnVwZGF0ZUxlbmd0aCgpOworICAgIH0KKyAgICBtZC5yZXNldFBhcmNlbCgpOworICAgIHJldHVybiAwOworfQorCitib29sIGJ5dGVzUmVtYWluKEZ1enplZERhdGFQcm92aWRlciAqZmRwKXsKKyAgICByZXR1cm4gZmRwIC0+IHJlbWFpbmluZ19ieXRlcygpID4gMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS90ZXN0cy9tZWRpYXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvbWVkaWFwbGF5ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYzNWVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvbWVkaWFwbGF5ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYV9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJJTWVkaWFQbGF5ZXJUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiLCAibXRzIl0sCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJJTWVkaWFQbGF5ZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibWVkaWFfcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3Rlc3RzL21lZGlhcGxheWVyL0lNZWRpYVBsYXllclRlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWEvdGVzdHMvbWVkaWFwbGF5ZXIvSU1lZGlhUGxheWVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2MDkzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3Rlc3RzL21lZGlhcGxheWVyL0lNZWRpYVBsYXllclRlc3QuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIHVpbnQ4X3Qga01vY2tCeXRlQXJyYXlbMTZdID0ge307CisKKyBjbGFzcyBJTWVkaWFQbGF5ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworICBwcm90ZWN0ZWQ6CisgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFBSRVBBUkVfRFJNID0gSU1lZGlhUGxheWVyOjpQUkVQQVJFX0RSTTsKKworICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBtZWRpYVBsYXllcl8gPSBzcDxNZWRpYVBsYXllcj46Om1ha2UoKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VNYW5hZ2VyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gbWVkaWFQbGF5ZXJTZXJ2aWNlID0gc2VydmljZU1hbmFnZXItPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKKyAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBpTWVkaWFQbGF5ZXJTZXJ2aWNlID0KKyAgICAgICAgICAgIElNZWRpYVBsYXllclNlcnZpY2U6OmFzSW50ZXJmYWNlKG1lZGlhUGxheWVyU2VydmljZSk7CisgICAgaU1lZGlhUGxheWVyXyA9IGlNZWRpYVBsYXllclNlcnZpY2UtPmNyZWF0ZShtZWRpYVBsYXllcl8pOworICAgfQorCisgICBzcDxNZWRpYVBsYXllcj4gbWVkaWFQbGF5ZXJfOworICAgc3A8SU1lZGlhUGxheWVyPiBpTWVkaWFQbGF5ZXJfOworIH07CisKK1RFU1RfRihJTWVkaWFQbGF5ZXJUZXN0LCBQcmVwYXJlRHJtSW52YWxpZFRyYW5zYWN0aW9uKSB7CisgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihpTWVkaWFQbGF5ZXJfLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgIGRhdGEud3JpdGUoa01vY2tCeXRlQXJyYXksIDE2KTsKKworICAgIC8vIFdlIHdyaXRlIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUgZm9sbG93aW5nIHNlc3Npb24gaWQgYXJyYXkuIFNob3VsZCBiZSBkaXNjYXJkZWQuCisgICAgZGF0YS53cml0ZVVpbnQzMigyKTsKKyAgICBkYXRhLndyaXRlVW5wYWRkZWQoa01vY2tCeXRlQXJyYXksIDEpOworCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gSU1lZGlhUGxheWVyOjphc0JpbmRlcihpTWVkaWFQbGF5ZXJfKQorICAgICAgICAgICAgLT50cmFuc2FjdChQUkVQQVJFX0RSTSwgZGF0YSwgJnJlcGx5KTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCBCQURfVkFMVUUpOworfQorCitURVNUX0YoSU1lZGlhUGxheWVyVGVzdCwgUHJlcGFyZURybVZhbGlkVHJhbnNhY3Rpb24pIHsKKyAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKGlNZWRpYVBsYXllcl8tPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgZGF0YS53cml0ZShrTW9ja0J5dGVBcnJheSwgMTYpOworCisgICAgLy8gV2Ugd3JpdGUgYSBsZW5ndGggZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIGRhdGEuIFRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgdmFsaWQuCisgICAgZGF0YS53cml0ZVVpbnQzMigxKTsKKyAgICBkYXRhLndyaXRlKGtNb2NrQnl0ZUFycmF5LCAxKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IElNZWRpYVBsYXllcjo6YXNCaW5kZXIoaU1lZGlhUGxheWVyXykKKyAgICAgICAgICAgIC0+dHJhbnNhY3QoUFJFUEFSRV9EUk0sIGRhdGEsICZyZXBseSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgT0spOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKaW5kZXggMTYzNWY3MC4uMzZlMjgwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKwogeHNkX2NvbmZpZyB7CiAgICAgbmFtZTogIm1lZGlhX3Byb2ZpbGVzIiwKICAgICBzcmNzOiBbIm1lZGlhX3Byb2ZpbGVzLnhzZCJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwCmluZGV4IDU5OGU0MWIuLjgzYWI5NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhX2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogInZ0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjMzc3OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gVnRzVmFsaWRhdGVNZWRpYVByb2ZpbGVzCi1pbmNsdWRlIHRlc3QvdnRzL3Rvb2xzL2J1aWxkL0FuZHJvaWQuaG9zdF9jb25maWcubWsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkVGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ODcyMWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkVGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgVlRTIFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcy4iPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX3Byb2ZpbGVzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX3Byb2ZpbGVzLnhzZCIvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5WdHNNdWx0aURldmljZVRlc3QiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtbW9kdWxlLW5hbWUiIHZhbHVlPSJWdHNWYWxpZGF0ZU1lZGlhUHJvZmlsZXMiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3Qtc291cmNlIiB2YWx1ZT0iXzY0Yml0OjpEQVRBL25hdGl2ZXRlc3Q2NC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkMTQ2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vIHRoZXNlIGhlYWRlcnMgaW5jbHVkZSB0aGUgc3RydWN0dXJlIG9mIG5lZWRlZCBmdW5jdGlvbiBwb2ludGVycworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYWZvcm1hdHNoYXBlcl9oZWFkZXJzIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYWZvcm1hdHNoYXBlcl9kZWZhdWx0cyIsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNQcm9wZXJ0aWVzLmNwcCIsCisgICAgICAgICJDb2RlY1NlZWRpbmcuY3BwIiwKKyAgICAgICAgIkZvcm1hdFNoYXBlci5jcHAiLAorICAgICAgICAiTWFuYWdlU2hhcGluZ0NvZGVjcy5jcHAiLAorICAgICAgICAiVmlkZW9TaGFwZXIuY3BwIiwKKyAgICAgICAgIlZRQXBwbHkuY3BwIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwgICAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlcyBHVUFSREVEX0JZKCkKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhZm9ybWF0c2hhcGVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYWZvcm1hdHNoYXBlcl9kZWZhdWx0cyJdLAorCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisKKyAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQ29kZWNQcm9wZXJ0aWVzLmNwcCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0NvZGVjUHJvcGVydGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3YjY5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0NvZGVjUHJvcGVydGllcy5jcHAKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNQcm9wZXJ0aWVzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiQ29kZWNQcm9wZXJ0aWVzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKworLy8gd2UgYXJlbid0IGdvaW5nIHRvIG1lc3Mgd2l0aCBzaGFwaW5nIHBvaW50cyBkaW1lbnNpb25zIGJleW9uZCB0aGlzCitzdGF0aWMgY29uc3QgaW50MzJfdCBESU1FTlNJT05fTElNSVQgPSAxNjM4NDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhZm9ybWF0c2hhcGVyIHsKKworQ29kZWNQcm9wZXJ0aWVzOjpDb2RlY1Byb3BlcnRpZXMoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgbWVkaWFUeXBlKSB7CisgICAgQUxPR1YoIkNvZGVjUHJvcGVydGllcyglcywgJXMpIiwgbmFtZS5jX3N0cigpLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgbU5hbWUgPSBuYW1lOworICAgIG1NZWRpYVR5cGUgPSBtZWRpYVR5cGU7Cit9CisKK3N0ZDo6c3RyaW5nIENvZGVjUHJvcGVydGllczo6Z2V0TmFtZSgpeworICAgIHJldHVybiBtTmFtZTsKK30KKworc3RkOjpzdHJpbmcgQ29kZWNQcm9wZXJ0aWVzOjpnZXRNZWRpYVR5cGUoKXsKKyAgICByZXR1cm4gbU1lZGlhVHlwZTsKK30KKworaW50IENvZGVjUHJvcGVydGllczo6c3VwcG9ydGVkTWluaW11bVF1YWxpdHkoKSB7CisgICAgcmV0dXJuIG1NaW5pbXVtUXVhbGl0eTsKK30KK3ZvaWQgQ29kZWNQcm9wZXJ0aWVzOjpzZXRTdXBwb3J0ZWRNaW5pbXVtUXVhbGl0eShpbnQgdm1hZikgeworICAgIG1NaW5pbXVtUXVhbGl0eSA9IHZtYWY7Cit9CisKK3ZvaWQgQ29kZWNQcm9wZXJ0aWVzOjpzZXRNaXNzaW5nUXBCb29zdChkb3VibGUgYm9vc3QpIHsKKyAgICBtTWlzc2luZ1FwQm9vc3QgPSBib29zdDsKK30KK3ZvaWQgQ29kZWNQcm9wZXJ0aWVzOjpzZXRQaGFzZU91dChkb3VibGUgcGhhc2VvdXQpIHsKKyAgICBtUGhhc2VPdXQgPSBwaGFzZW91dDsKK30KKworLy8gd2hhdCBBUEkgaXMgdGhpcyBjb2RlYyBzZXQgdXAgZm9yIChlLmcuIEFQSSBvZiB0aGUgYXNzb2NpYXRlZCBwYXJ0aXRpb24pCisvLyB2ZW5kb3Itc2lkZSAoT0VNKSBjb2RlY3MgbWF5IGJlIG9sZGVyLCBkdWUgdG8gJ3ZlbmRvciBmcmVlemUnIGFuZCB0cmVibGUKK2ludCBDb2RlY1Byb3BlcnRpZXM6OnN1cHBvcnRlZEFwaSgpIHsKKyAgICByZXR1cm4gbUFwaTsKK30KKwordm9pZCBDb2RlY1Byb3BlcnRpZXM6OnNldEZlYXR1cmVWYWx1ZShzdGQ6OnN0cmluZyBrZXksIGludDMyX3QgdmFsdWUpIHsKKyAgICBBTE9HRCgic2V0RmVhdHVyZVZhbHVlKCVzLCVkKSIsIGtleS5jX3N0cigpLCB2YWx1ZSk7CisgICAgbUZlYXR1cmVzLmluc2VydCh7a2V5LCB2YWx1ZX0pOworCisgICAgaWYgKCFzdHJjbXAoa2V5LmNfc3RyKCksIEZFQVRVUkVfUXBCb3VuZHMpKSB7CisgICAgICAgIHNldFN1cHBvcnRzUXAoMSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGtleS5jX3N0cigpLCAidmlkZW8tbWluaW11bS1xdWFsaXR5IikpIHsKKyAgICAgICAgc2V0U3VwcG9ydGVkTWluaW11bVF1YWxpdHkoMSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGtleS5jX3N0cigpLCAidnEtbWluaW11bS1xdWFsaXR5IikpIHsgLy8gZnJvbSBwcm90b3R5cGluZworICAgICAgICBzZXRTdXBwb3J0ZWRNaW5pbXVtUXVhbGl0eSgxKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29kZWNQcm9wZXJ0aWVzOjpnZXRGZWF0dXJlVmFsdWUoc3RkOjpzdHJpbmcga2V5LCBpbnQzMl90ICp2YWx1ZXApIHsKKyAgICBBTE9HVigiZ2V0RmVhdHVyZVZhbHVlKCVzKSIsIGtleS5jX3N0cigpKTsKKyAgICBpZiAodmFsdWVwID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIG1hcHBlZCA9IG1GZWF0dXJlcy5maW5kKGtleSk7CisgICAgaWYgKG1hcHBlZCAhPSBtRmVhdHVyZXMuZW5kKCkpIHsKKyAgICAgICAgKnZhbHVlcCA9IG1hcHBlZC0+c2Vjb25kOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBUdW5pbmcgdmFsdWVzICh3aGljaCBkaWZmZXIgZnJvbSBGZWF0dXJlcykKKy8vIHRoaXMgaXMgd2hlcmUgd2Ugc2V0IHVwIHRoaW5ncyBsaWtlIHRhcmdldCBiaXRyYXRlcyBhbmQgUVAgcmFuZ2VzCisvLyBOQiB0aGUgdHVuaW5nIHZhbHVlcyBhcnJpdmUgYXMgYSBzdHJpbmcsIGFsbG93aW5nIHVzIHRvIGNvbnZlcnQgaXQgaW50byBhbiBhcHByb3ByaWF0ZQorLy8gZm9ybWF0IChpbnQsIGZsb2F0LCByYW5nZXMsIG90aGVyIGNvbWJpbmF0aW9ucykKKy8vCit2b2lkIENvZGVjUHJvcGVydGllczo6c2V0VHVuaW5nVmFsdWUoc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgIEFMT0dEKCJzZXRUdW5pbmdWYWx1ZSglcywlcykiLCBrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgbVR1bmluZ3MuaW5zZXJ0KHtrZXksIHZhbHVlfSk7CisKKyAgICBib29sIGxlZ2FsID0gZmFsc2U7CisgICAgLy8gTkI6IG9sZCBzY2hvb2wgc3RydG9sKCkgYmVjYXVzZSBzdGQ6OnN0b2koKSB0aHJvd3MgZXhjZXB0aW9ucworICAgIGlmICghc3RyY21wKGtleS5jX3N0cigpLCAidnEtdGFyZ2V0LXFwbWF4IikpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLmNfc3RyKCk7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIGludDMyX3QgaVZhbHVlID0gIHN0cnRvbChwLCAmcSwgMCk7CisgICAgICAgIGlmIChxICE9IHApIHsKKyAgICAgICAgICAgIHNldFRhcmdldFFwTWF4KGlWYWx1ZSk7CisgICAgICAgICAgICBsZWdhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGtleS5jX3N0cigpLCAidnEtdGFyZ2V0LXFwbWF4LSIsIHN0cmxlbigidnEtdGFyZ2V0LXFwbWF4LSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzb2x1dGlvbiA9IGtleS5zdWJzdHIoc3RybGVuKCJ2cS10YXJnZXQtcXBtYXgtIikpOworICAgICAgICAgICAgaWYgKHFwTWF4UG9pbnQocmVzb2x1dGlvbiwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgbGVnYWwgPSB0cnVlOworICAgICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXkuY19zdHIoKSwgInZxLXRhcmdldC1icHAiKSkgeworICAgICAgICBjb25zdCBjaGFyICpwID0gdmFsdWUuY19zdHIoKTsKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgZG91YmxlIGJwcCA9IHN0cnRvZChwLCAmcSk7CisgICAgICAgIGlmIChxICE9IHApIHsKKyAgICAgICAgICAgIHNldEJwcChicHApOworICAgICAgICAgICAgbGVnYWwgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChrZXkuY19zdHIoKSwgInZxLXRhcmdldC1icHAtIiwgc3RybGVuKCJ2cS10YXJnZXQtYnBwLSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzb2x1dGlvbiA9IGtleS5zdWJzdHIoc3RybGVuKCJ2cS10YXJnZXQtYnBwLSIpKTsKKyAgICAgICAgICAgIGlmIChicHBQb2ludChyZXNvbHV0aW9uLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBsZWdhbCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGtleS5jX3N0cigpLCAidnEtdGFyZ2V0LWJwcHgxMDAiKSkgeworICAgICAgICAvLyBsZWdhY3ksIHByb3RvdHlwaW5nCisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSB2YWx1ZS5jX3N0cigpOworICAgICAgICBjaGFyICpxOworICAgICAgICBpbnQzMl90IGlWYWx1ZSA9ICBzdHJ0b2wocCwgJnEsIDApOworICAgICAgICBpZiAocSAhPSBwKSB7CisgICAgICAgICAgICBkb3VibGUgYnBwID0gaVZhbHVlIC8gMTAwLjA7CisgICAgICAgICAgICBzZXRCcHAoYnBwKTsKKyAgICAgICAgICAgIGxlZ2FsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXkuY19zdHIoKSwgInZxLWJpdHJhdGUtcGhhc2VvdXQiKSkgeworICAgICAgICBjb25zdCBjaGFyICpwID0gdmFsdWUuY19zdHIoKTsKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgZG91YmxlIHBoYXNlb3V0ID0gc3RydG9kKHAsICZxKTsKKyAgICAgICAgaWYgKHEgIT0gcCkgeworICAgICAgICAgICAgc2V0UGhhc2VPdXQocGhhc2VvdXQpOworICAgICAgICAgICAgbGVnYWwgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGtleS5jX3N0cigpLCAidnEtYm9vc3QtbWlzc2luZy1xcCIpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSB2YWx1ZS5jX3N0cigpOworICAgICAgICBjaGFyICpxOworICAgICAgICBkb3VibGUgYm9vc3QgPSBzdHJ0b2QocCwgJnEpOworICAgICAgICBpZiAocSAhPSBwKSB7CisgICAgICAgICAgICBzZXRNaXNzaW5nUXBCb29zdChib29zdCk7CisgICAgICAgICAgICBsZWdhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBsZWdhbCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFsZWdhbCkgeworICAgICAgICBBTE9HVygic2V0VHVuaW5nVmFsdWUoKSB1bmFibGUgdG8gYXBwbHkgdHVuaW5nICclcycgd2l0aCB2YWx1ZSAnJXMnIiwKKyAgICAgICAgICAgICAga2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2Jvb2wgQ29kZWNQcm9wZXJ0aWVzOjpnZXRUdW5pbmdWYWx1ZShzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nICZ2YWx1ZSkgeworICAgIEFMT0dWKCJnZXRUdW5pbmdWYWx1ZSglcykiLCBrZXkuY19zdHIoKSk7CisgICAgYXV0byBtYXBwZWQgPSBtRmVhdHVyZXMuZmluZChrZXkpOworICAgIGlmIChtYXBwZWQgIT0gbUZlYXR1cmVzLmVuZCgpKSB7CisgICAgICAgIHZhbHVlID0gbWFwcGVkLT5zZWNvbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ29kZWNQcm9wZXJ0aWVzOjpicHBQb2ludChzdGQ6OnN0cmluZyByZXNvbHV0aW9uLCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworCisgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgIGRvdWJsZSBicHAgPSAtMTsKKworICAgIC8vIHJlc29sdXRpb24gaXMgIld4SCIsICJXKkgiIG9yIGEgc3RhbmRhcmQgbmFtZSBsaWtlICI3MjBwIgorICAgIGlmIChyZXNvbHV0aW9uID09ICIxMDgwcCIpIHsKKyAgICAgICAgd2lkdGggPSAxMDgwOyBoZWlnaHQgPSAxOTIwOworICAgIH0gZWxzZSBpZiAocmVzb2x1dGlvbiA9PSAiNzIwcCIpIHsKKyAgICAgICAgd2lkdGggPSA3MjA7IGhlaWdodCA9IDEyODA7CisgICAgfSBlbHNlIGlmIChyZXNvbHV0aW9uID09ICI1NDBwIikgeworICAgICAgICB3aWR0aCA9IDU0MDsgaGVpZ2h0ID0gOTYwOworICAgIH0gZWxzZSBpZiAocmVzb2x1dGlvbiA9PSAiNDgwcCIpIHsKKyAgICAgICAgd2lkdGggPSA0ODA7IGhlaWdodCA9IDg1NDsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgc2VwID0gcmVzb2x1dGlvbi5maW5kKCd4Jyk7CisgICAgICAgIGlmIChzZXAgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHNlcCA9IHJlc29sdXRpb24uZmluZCgnKicpOworICAgICAgICB9CisgICAgICAgIGlmIChzZXAgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gcGFyc2UgcmVzb2x1dGlvbjogJyVzJyIsIHJlc29sdXRpb24uY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdyA9IHJlc29sdXRpb24uc3Vic3RyKDAsIHNlcCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGggPSByZXNvbHV0aW9uLnN1YnN0cihzZXArMSk7CisKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IHcuY19zdHIoKTsKKyAgICAgICAgd2lkdGggPSBzdHJ0b2wocCwgJnEsIDApOworICAgICAgICBpZiAocSA9PSBwKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSAtMTsKKyAgICAgICAgfQorICAgICAgICBwID0gaC5jX3N0cigpOworICAgICAgICBoZWlnaHQgPSBzdHJ0b2wocCwgJnEsIDApOworICAgICAgICBpZiAocSA9PSBwKSB7CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgd2lkdGggPiBESU1FTlNJT05fTElNSVQgfHwgaGVpZ2h0ID4gRElNRU5TSU9OX0xJTUlUKSB7CisgICAgICAgICAgICBBTE9HVygidW5wYXJzZWFibGU6IHdpZHRoLCBoZWlnaHQgJyVzJyIsIHJlc29sdXRpb24uY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpwID0gdmFsdWUuY19zdHIoKTsKKyAgICBjaGFyICpxOworICAgIGJwcCA9IHN0cnRvZChwLCAmcSk7CisgICAgaWYgKHEgPT0gcCkgeworICAgICAgICBBTE9HVygidW5wYXJzZWFibGUgYnBwICclcyciLCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCBicHBfcG9pbnQgKnBvaW50ID0gKHN0cnVjdCBicHBfcG9pbnQqKSBtYWxsb2Moc2l6ZW9mKCpwb2ludCkpOworICAgIGlmIChwb2ludCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBicHAgcG9pbnQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBvaW50LT5waXhlbHMgPSB3aWR0aCAqIGhlaWdodDsKKyAgICBwb2ludC0+d2lkdGggPSB3aWR0aDsKKyAgICBwb2ludC0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHBvaW50LT5icHAgPSBicHA7CisKKyAgICBpZiAobUJwcFBvaW50cyA9PSBudWxscHRyKSB7CisgICAgICAgIHBvaW50LT5uZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgbUJwcFBvaW50cyA9IHBvaW50OworICAgIH0gZWxzZSBpZiAocG9pbnQtPnBpeGVscyA8IG1CcHBQb2ludHMtPnBpeGVscykgeworICAgICAgICAvLyBhdCB0aGUgZnJvbnQKKyAgICAgICAgcG9pbnQtPm5leHQgPSBtQnBwUG9pbnRzOworICAgICAgICBtQnBwUG9pbnRzID0gcG9pbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IGJwcF9wb2ludCAqYWZ0ZXIgPSBtQnBwUG9pbnRzOworICAgICAgICB3aGlsZSAoYWZ0ZXItPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChwb2ludC0+cGl4ZWxzID4gYWZ0ZXItPm5leHQtPnBpeGVscykgeworICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluc2VydCBiZWZvcmUgYWZ0ZXItPm5leHQKKyAgICAgICAgICAgIHBvaW50LT5uZXh0ID0gYWZ0ZXItPm5leHQ7CisgICAgICAgICAgICBhZnRlci0+bmV4dCA9IHBvaW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFmdGVyLT5uZXh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIGhhc24ndCBnb25lIGluIHlldAorICAgICAgICAgICAgcG9pbnQtPm5leHQgPSBudWxscHRyOworICAgICAgICAgICAgYWZ0ZXItPm5leHQgPSBwb2ludDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitkb3VibGUgQ29kZWNQcm9wZXJ0aWVzOjpnZXRCcHAoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAvLyBsb29rIGluIHRoZSBwZXItcmVzb2x1dGlvbiBsaXN0CisKKyAgICBpbnQzMl90IHBpeGVscyA9IHdpZHRoICogaGVpZ2h0OworCisgICAgaWYgKG1CcHBQb2ludHMpIHsKKyAgICAgICAgc3RydWN0IGJwcF9wb2ludCAqcG9pbnQgPSBtQnBwUG9pbnRzOworICAgICAgICB3aGlsZSAocG9pbnQgJiYgcG9pbnQtPnBpeGVscyA8IHBpeGVscykgeworICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9pbnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRCcHAodz0lZCxoPSVkKSByZXR1cm5zICVmIGZyb20gYnBwcG9pbnQgdz0lZCBoPSVkIiwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwb2ludC0+YnBwLCBwb2ludC0+d2lkdGgsIHBvaW50LT5oZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIHBvaW50LT5icHA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiZGVmYXVsdGluZyB0byAlZiBicHAiLCBtQnBwKTsKKyAgICByZXR1cm4gbUJwcDsKK30KKworYm9vbCBDb2RlY1Byb3BlcnRpZXM6OnFwTWF4UG9pbnQoc3RkOjpzdHJpbmcgcmVzb2x1dGlvbiwgc3RkOjpzdHJpbmcgdmFsdWUpIHsKKworICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICBpbnQgcXBNYXggPSBJTlQzMl9NQVg7CisKKyAgICAvLyByZXNvbHV0aW9uIGlzICJXeEgiLCAiVypIIiBvciBhIHN0YW5kYXJkIG5hbWUgbGlrZSAiNzIwcCIKKyAgICBpZiAocmVzb2x1dGlvbiA9PSAiMTA4MHAiKSB7CisgICAgICAgIHdpZHRoID0gMTA4MDsgaGVpZ2h0ID0gMTkyMDsKKyAgICB9IGVsc2UgaWYgKHJlc29sdXRpb24gPT0gIjcyMHAiKSB7CisgICAgICAgIHdpZHRoID0gNzIwOyBoZWlnaHQgPSAxMjgwOworICAgIH0gZWxzZSBpZiAocmVzb2x1dGlvbiA9PSAiNTQwcCIpIHsKKyAgICAgICAgd2lkdGggPSA1NDA7IGhlaWdodCA9IDk2MDsKKyAgICB9IGVsc2UgaWYgKHJlc29sdXRpb24gPT0gIjQ4MHAiKSB7CisgICAgICAgIHdpZHRoID0gNDgwOyBoZWlnaHQgPSA4NTQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHNlcCA9IHJlc29sdXRpb24uZmluZCgneCcpOworICAgICAgICBpZiAoc2VwID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzZXAgPSByZXNvbHV0aW9uLmZpbmQoJyonKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VwID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HVygidW5hYmxlIHRvIHBhcnNlIHJlc29sdXRpb246ICclcyciLCByZXNvbHV0aW9uLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHcgPSByZXNvbHV0aW9uLnN1YnN0cigwLCBzZXApOworICAgICAgICBzdGQ6OnN0cmluZyBoID0gcmVzb2x1dGlvbi5zdWJzdHIoc2VwKzEpOworCisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSB3LmNfc3RyKCk7CisgICAgICAgIHdpZHRoID0gc3RydG9sKHAsICZxLCAwKTsKKyAgICAgICAgaWYgKHEgPT0gcCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGguY19zdHIoKTsKKyAgICAgICAgaGVpZ2h0ID0gc3RydG9sKHAsICZxLCAwKTsKKyAgICAgICAgaWYgKHEgPT0gcCkgeworICAgICAgICAgICAgICAgIGhlaWdodCA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHdpZHRoID4gRElNRU5TSU9OX0xJTUlUIHx8IGhlaWdodCA+IERJTUVOU0lPTl9MSU1JVCkgeworICAgICAgICAgICAgQUxPR1coInVucGFyc2VhYmxlOiB3aWR0aCwgaGVpZ2h0ICclcyciLCByZXNvbHV0aW9uLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgY2hhciAqcCA9IHZhbHVlLmNfc3RyKCk7CisgICAgY2hhciAqcTsKKyAgICBxcE1heCA9IHN0cnRvbChwLCAmcSwgMCk7CisgICAgaWYgKHEgPT0gcCkgeworICAgICAgICBBTE9HVygidW5wYXJzZWFibGUgcXBtYXggJyVzJyIsIHZhbHVlLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gY29udmVydCB0byBvdXIgaW50ZXJuYWwgJ3Vuc3BlY2lmaWVkJyBub3RhdGlvbgorICAgIGlmIChxcE1heCA9PSAtMSkKKyAgICAgICAgcXBNYXggPSBJTlQzMl9NQVg7CisKKyAgICBzdHJ1Y3QgcXBtYXhfcG9pbnQgKnBvaW50ID0gKHN0cnVjdCBxcG1heF9wb2ludCopIG1hbGxvYyhzaXplb2YoKnBvaW50KSk7CisgICAgaWYgKHBvaW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHFwbWF4IHBvaW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwb2ludC0+cGl4ZWxzID0gd2lkdGggKiBoZWlnaHQ7CisgICAgcG9pbnQtPndpZHRoID0gd2lkdGg7CisgICAgcG9pbnQtPmhlaWdodCA9IGhlaWdodDsKKyAgICBwb2ludC0+cXBNYXggPSBxcE1heDsKKworICAgIGlmIChtUXBNYXhQb2ludHMgPT0gbnVsbHB0cikgeworICAgICAgICBwb2ludC0+bmV4dCA9IG51bGxwdHI7CisgICAgICAgIG1RcE1heFBvaW50cyA9IHBvaW50OworICAgIH0gZWxzZSBpZiAocG9pbnQtPnBpeGVscyA8IG1RcE1heFBvaW50cy0+cGl4ZWxzKSB7CisgICAgICAgIC8vIGF0IHRoZSBmcm9udAorICAgICAgICBwb2ludC0+bmV4dCA9IG1RcE1heFBvaW50czsKKyAgICAgICAgbVFwTWF4UG9pbnRzID0gcG9pbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHFwbWF4X3BvaW50ICphZnRlciA9IG1RcE1heFBvaW50czsKKyAgICAgICAgd2hpbGUgKGFmdGVyLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAocG9pbnQtPnBpeGVscyA+IGFmdGVyLT5uZXh0LT5waXhlbHMpIHsKKyAgICAgICAgICAgICAgICBhZnRlciA9IGFmdGVyLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpbnNlcnQgYmVmb3JlIGFmdGVyLT5uZXh0CisgICAgICAgICAgICBwb2ludC0+bmV4dCA9IGFmdGVyLT5uZXh0OworICAgICAgICAgICAgYWZ0ZXItPm5leHQgPSBwb2ludDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChhZnRlci0+bmV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBoYXNuJ3QgZ29uZSBpbiB5ZXQKKyAgICAgICAgICAgIHBvaW50LT5uZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFmdGVyLT5uZXh0ID0gcG9pbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IENvZGVjUHJvcGVydGllczo6dGFyZ2V0UXBNYXgoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICAvLyBsb29rIGluIHRoZSBwZXItcmVzb2x1dGlvbiBsaXN0CisKKyAgICBpbnQzMl90IHBpeGVscyA9IHdpZHRoICogaGVpZ2h0OworCisgICAgaWYgKG1RcE1heFBvaW50cykgeworICAgICAgICBzdHJ1Y3QgcXBtYXhfcG9pbnQgKnBvaW50ID0gbVFwTWF4UG9pbnRzOworICAgICAgICB3aGlsZSAocG9pbnQgJiYgcG9pbnQtPnBpeGVscyA8IHBpeGVscykgeworICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9pbnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJ0YXJnZXRRcE1heCh3PSVkLGg9JWQpIHJldHVybnMgJWQgZnJvbSBxcG1heF9wb2ludCB3PSVkIGg9JWQiLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBvaW50LT5xcE1heCwgcG9pbnQtPndpZHRoLCBwb2ludC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBwb2ludC0+cXBNYXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiZGVmYXVsdGluZyB0byAlZCBxcG1heCIsIG1UYXJnZXRRcE1heCk7CisgICAgcmV0dXJuIG1UYXJnZXRRcE1heDsKK30KKwordm9pZCBDb2RlY1Byb3BlcnRpZXM6OnNldFRhcmdldFFwTWF4KGludCBxcE1heCkgeworICAgIC8vIGNvbnZlcnQgdG8gb3VyIGludGVybmFsICd1bnNwZWNpZmllZCcgbm90YXRpb24KKyAgICBpZiAocXBNYXggPT0gLTEpCisgICAgICAgIHFwTWF4ID0gSU5UMzJfTUFYOworICAgIG1UYXJnZXRRcE1heCA9IHFwTWF4OworfQorCitzdGQ6OnN0cmluZyBDb2RlY1Byb3BlcnRpZXM6OmdldE1hcHBpbmcoc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyBraW5kKSB7CisgICAgQUxPR1YoImdldE1hcHBpbmcoa2V5ICVzLCBraW5kICVzICkiLCBrZXkuY19zdHIoKSwga2luZC5jX3N0cigpKTsKKyAgICAvL3BsYXkgd2l0aCBtTWFwcGluZ3MKKyAgICBhdXRvIG1hcHBlZCA9IG1NYXBwaW5ncy5maW5kKGtpbmQgKyAiLSIgKyBrZXkpOworICAgIGlmIChtYXBwZWQgIT0gbU1hcHBpbmdzLmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IG1hcHBlZC0+c2Vjb25kOworICAgICAgICBBTE9HVigiZ2V0TWFwcGluZyglcywgJXMpIC0+ICVzIiwga2V5LmNfc3RyKCksIGtpbmQuY19zdHIoKSwgcmVzdWx0LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBBTE9HVigibm9wZSwgcmV0dXJuIHVuY2hhbmdlZCBrZXkiKTsKKyAgICByZXR1cm4ga2V5OworfQorCisKKy8vIHJlYWxseSBhIGJpdCBvZiBkZWJ1Z2dpbmcgY29kZSBoZXJlLgordm9pZCBDb2RlY1Byb3BlcnRpZXM6OnNob3dNYXBwaW5ncygpIHsKKyAgICBBTE9HRCgiTWFwcGluZ3M6Iik7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IG1NYXBwaW5ncykgeworICAgICAgICAgY291bnQrKzsKKyAgICAgICAgIEFMT0dEKCInJXMnIC0+ICclcyciLCBrZXkuY19zdHIoKSwgdmFsdWUuY19zdHIoKSk7CisgICAgfQorICAgIEFMT0dEKCJ0b3RhbCAlZCBtYXBwaW5ncyIsIGNvdW50KTsKK30KKwordm9pZCBDb2RlY1Byb3BlcnRpZXM6OnNldE1hcHBpbmcoc3RkOjpzdHJpbmcga2luZCwgc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSkgeworICAgIEFMT0dWKCJzZXRNYXBwaW5nKCVzLCVzLCVzKSIsIGtpbmQuY19zdHIoKSwga2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIG1ldGFLZXkgPSBraW5kICsgIi0iICsga2V5OworICAgIG1NYXBwaW5ncy5pbnNlcnQoe21ldGFLZXksIHZhbHVlfSk7Cit9CisKK2NvbnN0IGNoYXIgKipDb2RlY1Byb3BlcnRpZXM6OmdldE1hcHBpbmdzKHN0ZDo6c3RyaW5nIGtpbmQsIGJvb2wgcmV2ZXJzZSkgeworICAgIEFMT0dWKCJnZXRNYXBwaW5ncyhraW5kICVzLCByZXZlcnNlICVkIiwga2luZC5jX3N0cigpLCByZXZlcnNlKTsKKyAgICAvLyBob3cgbWFueSBkbyB3ZSBuZWVkPworICAgIGludCBjb3VudCA9IG1NYXBwaW5ncy5zaXplKCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR1YoImVtcHR5IG1hcHBpbmdzIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihjaGFyICopICogKDIgKiBjb3VudCArIDIpOworICAgIGNvbnN0IGNoYXIgKipyZXN1bHQgPSAoY29uc3QgY2hhciAqKiltYWxsb2Moc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJubyBtZW1vcnkgdG8gcmV0dXJuIG1hcHBpbmdzIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBtZW1zZXQocmVzdWx0LCAnXDAnLCBzaXplKTsKKworICAgIGNvbnN0IGNoYXIgKipwcCA9IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtrZXksIHZhbHVlXSA6IG1NYXBwaW5ncykgeworICAgICAgICAvLyBzcGxpdCBvdXQgdGhlIGtpbmQva2V5CisgICAgICAgIHNpemVfdCBwb3MgPSBrZXkuZmluZCgnLScpOworICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRCgiaWdub3JpbmcgbWFsZm9ybWVkIGtleTogJXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhY3R1YWxLaW5kID0ga2V5LnN1YnN0cigwLHBvcyk7CisgICAgICAgIGlmIChraW5kLmxlbmd0aCgpICE9IDAgJiYga2luZCAhPSBhY3R1YWxLaW5kKSB7CisgICAgICAgICAgICBBTE9HRCgia2luZHMgZG9uJ3QgbWF0Y2g6IHdhbnQgJyVzJyBnb3QgJyVzJyIsIGtpbmQuY19zdHIoKSwgYWN0dWFsS2luZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgICAgICAvLyBjb2RlYyBzcGVjaWZpYyAtPiBzdGQgYWthICd1bm1hcHBpbmcnCisgICAgICAgICAgICBwcFswXSA9IHN0cmR1cCggdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICBwcFsxXSA9IHN0cmR1cCgga2V5LnN1YnN0cihwb3MrMSkuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBzdGQgLT4gY29kZWMgc3BlY2lmaWMKKyAgICAgICAgICAgIHBwWzBdID0gc3RyZHVwKCBrZXkuc3Vic3RyKHBvcysxKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHBwWzFdID0gc3RyZHVwKCB2YWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiICVzIC0+ICVzIiwgcHBbMF0sIHBwWzFdKTsKKyAgICAgICAgcHAgKz0gMjsKKyAgICB9CisKKyAgICBwcFswXSA9IG51bGxwdHI7CisgICAgcHBbMV0gPSBudWxscHRyOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit9IC8vIG5hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlcgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9Db2RlY1Byb3BlcnRpZXMuaCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0NvZGVjUHJvcGVydGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NmE0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9Db2RlY1Byb3BlcnRpZXMuaApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTElCTUVESUFGT1JNQVRTSEFQRVJfQ09ERUNQUk9QRVJUSUVTX0hfCisjZGVmaW5lIF9MSUJNRURJQUZPUk1BVFNIQVBFUl9DT0RFQ1BST1BFUlRJRVNfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIgeworCitjbGFzcyBDb2RlY1Byb3BlcnRpZXMgeworCisgIHB1YmxpYzoKKyAgICBDb2RlY1Byb3BlcnRpZXMoc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgbWVkaWFUeXBlKTsKKworICAgIC8vIHNlZWQgdGhlIGNvZGVjIHdpdGggc29tZSBwcmVjb25maWd1cmVkIHZhbHVlcworICAgIC8vIChlLmcuIG1lZGlhVHlwZS1ncmFudWxhcml0eSBkZWZhdWx0cykKKyAgICAvLyBydW5zIGZyb20gdGhlIGNvbnN0cnVjdG9yCisgICAgdm9pZCBTZWVkKCk7CisgICAgdm9pZCBGaW5pc2goKTsKKworICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBnZXRNZWRpYVR5cGUoKTsKKworICAgIC8vIGVzdGFibGlzaCBhIG1hcHBpbmcgZnJvbSBzdGFuZGFyZCAna2V5JyB0byBub24tc3RhbmRhcmQgJ3ZhbHVlJyBpbiB0aGUgbmFtZXNwYWNlICdraW5kJworICAgIHZvaWQgc2V0TWFwcGluZyhzdGQ6OnN0cmluZyBraW5kLCBzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlKTsKKworICAgIC8vIHRyYW5zbGF0ZSBmcm9tIGZyb20gc3RhbmRhcmQga2V5IHRvIG5vbi1zdGFuZGFyZCBrZXkKKyAgICAvLyByZXR1cm4gb3JpZ2luYWwgc3RhbmRhcmQga2V5IGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcKKyAgICBzdGQ6OnN0cmluZyBnZXRNYXBwaW5nKHN0ZDo6c3RyaW5nIGtleSwgc3RkOjpzdHJpbmcga2luZCk7CisKKyAgICAvLyByZXR1cm5zIGFuIGFycmF5IG9mIGNoYXIgKiwgd2hpY2ggYXJlIHBhaXJlZCAiZnJvbSIgYW5kICJ0byIgdmFsdWVzCisgICAgLy8gZm9yIG1hcHBpbmcgKG9yIHVubWFwcGluZykuIGl0J3MgYWx3YXlzIGV4cHJlc3NlZCBhcyBmcm9tLT50bworICAgIC8vIGFuZCAncmV2ZXJzZScgZGVzY3JpYmVzIHdoaWNoIHN0cmluZ3MgYXJlIHRvIGJlIG9uIHdoaWNoIHNpZGUuCisgICAgY29uc3QgY2hhciAqKmdldE1hcHBpbmdzKHN0ZDo6c3RyaW5nIGtpbmQsIGJvb2wgcmV2ZXJzZSk7CisKKyAgICAvLyBrZWVwIGEgbWFwIG9mIGFsbCBmZWF0dXJlcyBhbmQgdGhlaXIgcGFyYW1ldGVycworICAgIHZvaWQgc2V0RmVhdHVyZVZhbHVlKHN0ZDo6c3RyaW5nIGtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgYm9vbCBnZXRGZWF0dXJlVmFsdWUoc3RkOjpzdHJpbmcga2V5LCBpbnQzMl90ICp2YWx1ZXApOworCisgICAgLy8ga2VlcCBhIG1hcCBvZiBhbGwgdHVuaW5ncyBhbmQgdGhlaXIgcGFyYW1ldGVycworICAgIHZvaWQgc2V0VHVuaW5nVmFsdWUoc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisgICAgYm9vbCBnZXRUdW5pbmdWYWx1ZShzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nICZ2YWx1ZSk7CisKKyAgICAvLyBkb2VzIHRoZSBjb2RlYyBzdXBwb3J0IHRoZSBBbmRyb2lkIFMgbWluaW11bSBxdWFsaXR5IHJ1bGVzCisgICAgdm9pZCBzZXRTdXBwb3J0ZWRNaW5pbXVtUXVhbGl0eShpbnQgdm1hZik7CisgICAgaW50IHN1cHBvcnRlZE1pbmltdW1RdWFsaXR5KCk7CisKKyAgICAvLyBxcCBtYXggYm91bmQgdXNlZCB0byBjb21wZW5zYXRlIHdoZW4gU3VwcG9ydGVkTWluaW11bVF1YWxpdHkgPT0gMAorICAgIC8vIDAgPT0gbGV0IGEgc3lzdGVtIGRlZmF1bHQgaGFuZGxlIGl0CisgICAgdm9pZCBzZXRUYXJnZXRRcE1heChpbnQgcXBtYXgpOworICAgIGludCB0YXJnZXRRcE1heChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgICAvLyB0YXJnZXQgYml0cy1wZXItcGl4ZWwgKHBlciBzZWNvbmQpIGZvciBlbmNvZGluZyBvcGVyYXRpb25zLgorICAgIC8vIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgYSBtaW5pbXVtIGJpdHJhdGUgZm9yIGFueSBwYXJ0aWN1bGFyIHJlc29sdXRpb24uCisgICAgLy8gQSAxMDgwcCAoMTkyMCoxMDgwID0gMjA3MzYwMCBwaXhlbHMpIHRvIGJlIGVuY29kZWQgYXQgNU1icHMgaGFzIGEgYnBwID09IDIuNDEKKyAgICB2b2lkIHNldEJwcChkb3VibGUgYnBwKSB7IG1CcHAgPSBicHA7fQorICAgIGRvdWJsZSBnZXRCcHAoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgICAgLy8gRG9lcyB0aGlzIGNvZGVjIHN1cHBvcnQgUVAgYm91bmRpbmcKKyAgICAvLyBUaGUgZ2V0TWFwcGluZygpIG1ldGhvZHMgcHJvdmlkZSBhbnkgbmVlZGVkIG1hcHBpbmcgdG8gbm9uLXN0YW5kYXJkIGtleXMuCisgICAgdm9pZCBzZXRTdXBwb3J0c1FwKGJvb2wgc3VwcG9ydGVkKSB7IG1TdXBwb3J0c1FwID0gc3VwcG9ydGVkO30KKyAgICBib29sIHN1cHBvcnRzUXAoKSB7IHJldHVybiBtU3VwcG9ydHNRcDt9CisKKyAgICAvLyBkZWZpbmVzIG91ciByYW5nZSBvZiBvcGVyYXRpb24gLS0gbXVsdGlwbGllciBvbiB0aGUgZmxvb3IgYml0cmF0ZQorICAgIGRvdWJsZSBnZXRQaGFzZU91dCgpIHsgcmV0dXJuIG1QaGFzZU91dDsgfQorICAgIHZvaWQgc2V0UGhhc2VPdXQoZG91YmxlIG92ZXJhZ2VNdWx0aXBsaWVyKTsKKworICAgIC8vIGhvdyBtdWNoICgwLjIwID0gKzIwJSkgZG8gd2UgYWRkIGlmIFFwIGlzIHJlcXVlc3RlZCBidXQgdW5zdXBwb3J0ZWQKKyAgICBkb3VibGUgZ2V0TWlzc2luZ1FwQm9vc3QoKSB7cmV0dXJuIG1NaXNzaW5nUXBCb29zdDsgfQorICAgIHZvaWQgc2V0TWlzc2luZ1FwQm9vc3QoZG91YmxlIGJvb3N0KTsKKworICAgIGludCAgc3VwcG9ydGVkQXBpKCk7CisKKyAgICAvLyBhIGNvZGVjIGlzIG5vdCB1c2FibGUgdW50aWwgaXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIGl0cworICAgIC8vIG5hbWUvbWVkaWFUeXBlLgorICAgIGJvb2wgaXNSZWdpc3RlcmVkKCkgeyByZXR1cm4gbUlzUmVnaXN0ZXJlZDt9CisgICAgdm9pZCBzZXRSZWdpc3RlcmVkKGJvb2wgcmVnaXN0ZXJlZCkgeyBtSXNSZWdpc3RlcmVkID0gcmVnaXN0ZXJlZDt9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICBzdGQ6OnN0cmluZyBtTWVkaWFUeXBlOworICAgIGludCBtQXBpID0gMDsKKyAgICBpbnQgbU1pbmltdW1RdWFsaXR5ID0gMDsKKyAgICBpbnQgbVRhcmdldFFwTWF4ID0gSU5UMzJfTUFYOworICAgIGJvb2wgbVN1cHBvcnRzUXAgPSBmYWxzZTsKKyAgICBkb3VibGUgbUJwcCA9IDAuMDsKKworICAgIC8vIHRhcmdldCBiaXRyYXRlcyBhYm92ZSBmbG9vciAqIG1QaGFzZU91dCBhcmUgbGVmdCB1bnRvdWNoZWQKKyAgICBkb3VibGUgbVBoYXNlT3V0ID0gMS43NTsKKyAgICAvLyAyMCUgYnVtcCBpZiBRUCBpcyBjb25maWd1cmVkIGJ1dCBpdCBpcyB1bmF2YWlsYWJsZQorICAgIGRvdWJsZSBtTWlzc2luZ1FwQm9vc3QgPSAwLjIwOworCisgICAgLy8gYWxsb3cgZGlmZmVyZW50IHRhcmdldCBiaXRzLXBlci1waXhlbCBiYXNlZCBvbiByZXNvbHV0aW9uCisgICAgLy8gc2ltaWxhciB0byBjb2RlYyAncGVyZm9ybWFuY2UgcG9pbnRzJworICAgIC8vIHVzZXMgJ25leHQgbGFyZ2VzdCcgKGJ5IHBpeGVsIGNvdW50KSBwb2ludCBhcyBtaW5pbXVtIGJwcAorICAgIHN0cnVjdCBicHBfcG9pbnQgeworICAgICAgICBzdHJ1Y3QgYnBwX3BvaW50ICpuZXh0OworICAgICAgICBpbnQzMl90IHBpeGVsczsKKyAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBkb3VibGUgYnBwOworICAgIH07CisgICAgc3RydWN0IGJwcF9wb2ludCAqbUJwcFBvaW50cyA9IG51bGxwdHI7CisgICAgYm9vbCBicHBQb2ludChzdGQ6OnN0cmluZyByZXNvbHV0aW9uLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisKKyAgICAvLyBzYW1lIHRoaW5nIGZvciBxcG1heCAtLSBhbGxvdyBkaWZmZXJlbnQgb25lcyBiYXNlZCBvbiByZXNvbHV0aW9uCisgICAgLy8gYWxsb3cgZGlmZmVyZW50IHRhcmdldCBiaXRzLXBlci1waXhlbCBiYXNlZCBvbiByZXNvbHV0aW9uCisgICAgLy8gc2ltaWxhciB0byBjb2RlYyAncGVyZm9ybWFuY2UgcG9pbnRzJworICAgIC8vIHVzZXMgJ25leHQgbGFyZ2VzdCcgKGJ5IHBpeGVsIGNvdW50KSBwb2ludCBhcyBtaW5pbXVtIGJwcAorICAgIHN0cnVjdCBxcG1heF9wb2ludCB7CisgICAgICAgIHN0cnVjdCBxcG1heF9wb2ludCAqbmV4dDsKKyAgICAgICAgaW50MzJfdCBwaXhlbHM7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaW50IHFwTWF4OworICAgIH07CisgICAgc3RydWN0IHFwbWF4X3BvaW50ICptUXBNYXhQb2ludHMgPSBudWxscHRyOworICAgIGJvb2wgcXBNYXhQb2ludChzdGQ6OnN0cmluZyByZXNvbHV0aW9uLCBzdGQ6OnN0cmluZyB2YWx1ZSk7CisKKyAgICBzdGQ6Om11dGV4IG1NYXBwaW5nTG9jazsKKyAgICAvLyBYWFggZmlndXJlIG91dCB3aHkgSSdtIGhhdmluZyBwcm9ibGVtcyBnZXR0aW5nIGNvbXBpbGVyIHRvIGxpa2UgR1VBUkRFRF9CWQorICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbU1hcHBpbmdzIC8qR1VBUkRFRF9CWShtTWFwcGluZ0xvY2spKi8gOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+IG1GZWF0dXJlcyAvKkdVQVJERURfQlkobU1hcHBpbmdMb2NrKSovIDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1UdW5pbmdzIC8qR1VBUkRFRF9CWShtTWFwcGluZ0xvY2spKi8gOworCisgICAgLy8gU2VlZCgpIGFuZCBGaW5pc2goKSB1c2UgdGhpcyBhcyB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgYWRkTWVkaWFEZWZhdWx0cyhib29sIG92ZXJyaWRlYWJsZSk7CisKKyAgICBib29sIG1Jc1JlZ2lzdGVyZWQgPSBmYWxzZTsKKworICAgIC8vIGRlYnVnZ2luZyBvZiB3aGF0J3MgaW4gdGhlIG1hcHBpbmcgZGljdGlvbmFyeQorICAgIHZvaWQgc2hvd01hcHBpbmdzKCk7CisKKyAgICAvLyBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlY1Byb3BlcnRpZXMpOworfTsKKworZXh0ZXJuIENvZGVjUHJvcGVydGllcyAqZmluZENvZGVjKGNvbnN0IGNoYXIgKmNvZGVjTmFtZSwgY29uc3QgY2hhciAqbWVkaWFUeXBlKTsKK2V4dGVybiBDb2RlY1Byb3BlcnRpZXMgKnJlZ2lzdGVyQ29kZWMoQ29kZWNQcm9wZXJ0aWVzICpjb2RlYywgY29uc3QgY2hhciAqY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lZGlhVHlwZSk7CisKKworfSAvLyBuYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyAgX0xJQk1FRElBRk9STUFUU0hBUEVSX0NPREVDUFJPUEVSVElFU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvQ29kZWNTZWVkaW5nLmNwcCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0NvZGVjU2VlZGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhZDdhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0NvZGVjU2VlZGluZy5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWNTZWVkaW5nIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ29kZWNQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlciB7CisKKy8qCisgKiBhIGJsb2NrIG9mIHByZS1sb2FkZWQgdHVuaW5ncyBmb3IgY29kZWNzLgorICoKKyAqIHRoaW5ncyB0aGUgbGlicmFyeSBzZWVkcyBpbnRvIHRoZSBjb2RlY3Byb3BlcnRpZXMgYmFzZWQKKyAqIG9uIHRoZSBtZWRpYVR5cGUuCisgKiBYWFg6IHBhcnNpbmcgZnJvbSBhIGZpbGUgaXMgbGlrZWx5IGJldHRlciB0aGFuIGVtYmVkZGluZyBpbiBjb2RlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBvdmVycmlkZWFibGU7CisgICAgY29uc3QgY2hhciAqa2V5OworICAgIGNvbnN0IGNoYXIgKnZhbHVlOworfSBwcmVsb2FkVHVuaW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICptZWRpYVR5cGU7CisgICAgcHJlbG9hZFR1bmluZ190ICpmZWF0dXJlczsKK30gcHJlbG9hZFR1bmluZ3NfdDsKKworLyoKKyAqIGJwcCA9PSBiaXRzIHBlciBwaXhlbCBwZXIgc2Vjb25kLCBmb3IgMzBmcHMuCisgKi8KKworc3RhdGljIHByZWxvYWRUdW5pbmdfdCBmZWF0dXJlc0F2Y1tdID0geworICAgICAge3RydWUsICJ2cS10YXJnZXQtYnBwIiwgIjAifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LWJwcC0xMDgwcCIsICIxLjkwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNzIwcCIsICIyLjI1In0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNTQwcCIsICIyLjY1In0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNDgwcCIsICIzLjAwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtMzIweDI0MCIsICIwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1xcG1heCIsICItMSJ9LAorICAgICAge3RydWUsICJ2cS10YXJnZXQtcXBtYXgtMTA4MHAiLCAiNDUifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTcyMHAiLCAiNDMifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTU0MHAiLCAiNDIifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTQ4MHAiLCAiMzgifSwKKyAgICAgIHt0cnVlLCAidnEtYml0cmF0ZS1waGFzZW91dCIsICIxLjc1In0sCisgICAgICB7dHJ1ZSwgInZxLWJvb3N0LW1pc3NpbmctcXAiLCAiMC4yMCJ9LAorICAgICAge3RydWUsIG51bGxwdHIsIDB9Cit9OworCitzdGF0aWMgcHJlbG9hZFR1bmluZ190IGZlYXR1cmVzSGV2Y1tdID0geworICAgICAge3RydWUsICJ2cS10YXJnZXQtYnBwIiwgIjAifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LWJwcC0xMDgwcCIsICIxLjUwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNzIwcCIsICIxLjgwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNTQwcCIsICIyLjEwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtNDgwcCIsICIyLjMwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAtMzIweDI0MCIsICIwIn0sCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1xcG1heCIsICItMSJ9LAorICAgICAge3RydWUsICJ2cS10YXJnZXQtcXBtYXgtMTA4MHAiLCAiNDUifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTcyMHAiLCAiNDQifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTU0MHAiLCAiNDMifSwKKyAgICAgIHt0cnVlLCAidnEtdGFyZ2V0LXFwbWF4LTQ4MHAiLCAiNDIifSwKKyAgICAgIHt0cnVlLCAidnEtYml0cmF0ZS1waGFzZW91dCIsICIxLjc1In0sCisgICAgICB7dHJ1ZSwgInZxLWJvb3N0LW1pc3NpbmctcXAiLCAiMC4yMCJ9LAorICAgICAge3RydWUsIG51bGxwdHIsIDB9Cit9OworCitzdGF0aWMgcHJlbG9hZFR1bmluZ190IGZlYXR1cmVzR2VuZXJpY1ZpZGVvW10gPSB7CisgICAgICAgIC8vIDAgPT0gb2ZmCisgICAgICB7dHJ1ZSwgInZxLXRhcmdldC1icHAiLCAiMCJ9LAorICAgICAge3RydWUsIG51bGxwdHIsIDB9Cit9OworCitzdGF0aWMgcHJlbG9hZFR1bmluZ3NfdCBwcmVsb2FkVHVuaW5nc1tdID0geworICAgIHsgInZpZGVvL2F2YyIsIGZlYXR1cmVzQXZjfSwKKyAgICB7ICJ2aWRlby9oZXZjIiwgJmZlYXR1cmVzSGV2Y1swXX0sCisKKyAgICAvLyB3aWxkY2FyZCBmb3IgYW55IHZpZGVvIGZvcm1hdCBub3QgYWxyZWFkeSBjYXB0dXJlZAorICAgIHsgInZpZGVvLyoiLCAmZmVhdHVyZXNHZW5lcmljVmlkZW9bMF19LAorCisgICAgeyBudWxscHRyLCBudWxscHRyfQorfTsKKwordm9pZCBDb2RlY1Byb3BlcnRpZXM6OmFkZE1lZGlhRGVmYXVsdHMoYm9vbCBvdmVycmlkZWFibGUpIHsKKyAgICBBTE9HRCgiU2VlZDogY29kZWMgJXMsIG1lZGlhdHlwZSAlcywgb3ZlcnJpZGVhYmxlICVkIiwKKyAgICAgICAgICBtTmFtZS5jX3N0cigpLCBtTWVkaWFUeXBlLmNfc3RyKCksIG92ZXJyaWRlYWJsZSk7CisKKyAgICAvLyBsb2FkIG1lIHVwIHdpdGggaW5pdGlhbCBjb25maWd1cmF0aW9uIGRhdGEKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyA7IGkrKykgeworICAgICAgICBwcmVsb2FkVHVuaW5nc190ICpwID0gJnByZWxvYWRUdW5pbmdzW2ldOworICAgICAgICBpZiAocC0+bWVkaWFUeXBlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHN0cmNtcChwLT5tZWRpYVR5cGUsIG1NZWRpYVR5cGUuY19zdHIoKSkgPT0gMCkgeworICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnI7CisgICAgICAgIGlmICghZm91bmQgJiYgKHIgPSBzdHJjaHIocC0+bWVkaWFUeXBlLCAnKicpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAvLyB3aWxkY2FyZDsgY2hlY2sgdGhlIHByZWZpeAorICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHIgLSBwLT5tZWRpYVR5cGU7CisgICAgICAgICAgICBpZiAoc3RybmNtcChwLT5tZWRpYVR5cGUsIG1NZWRpYVR5cGUuY19zdHIoKSwgbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNlZWRpbmcgZnJvbSBtZWRpYVR5cGUgJyVzJyIsIHAtPm1lZGlhVHlwZSk7CisKKyAgICAgICAgLy8gd2FsayB0aHJvdWdoLCBmaWxsaW5nIHRoaW5ncworICAgICAgICBpZiAocC0+ZmVhdHVyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaj0wOzsgaisrKSB7CisgICAgICAgICAgICAgICAgcHJlbG9hZFR1bmluZ190ICpxID0gJnAtPmZlYXR1cmVzW2pdOworICAgICAgICAgICAgICAgIGlmIChxLT5rZXkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHEtPm92ZXJyaWRlYWJsZSAhPSBvdmVycmlkZWFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFR1bmluZ1ZhbHVlKHEtPmtleSwgcS0+dmFsdWUpOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigibG9hZGVkICVkIHByZXNldCB2YWx1ZXMiLCBjb3VudCk7Cit9CisKKy8vIGEgY2hhbmNlLCBhcyB3ZSBjcmVhdGUgdGhlIGNvZGVjIHRvIGluamVjdCBhbnkgZGVmYXVsdCBiZWhhdmlvcnMgd2Ugd2FudC4KKy8vIFhYWDogY29uc2lkZXIgd2hldGhlciB3ZSBuZWVkIHByZS9wb3N0IG9yIGp1c3QgcG9zdC4gaXQgYWZmZWN0cyB3aGF0IGNhbiBiZQorLy8gb3ZlcnJpZGRlbiBieSB3YXkgb2YgdGhlIGNvZGVjIFhNTAorLy8KK3ZvaWQgQ29kZWNQcm9wZXJ0aWVzOjpTZWVkKCkgeworICAgIEFMT0dWKCJTZWVkOiBmb3IgY29kZWMgJXMsIG1lZGlhdHlwZSAlcyIsIG1OYW1lLmNfc3RyKCksIG1NZWRpYVR5cGUuY19zdHIoKSk7CisgICAgYWRkTWVkaWFEZWZhdWx0cyh0cnVlKTsKK30KKwordm9pZCBDb2RlY1Byb3BlcnRpZXM6OkZpbmlzaCgpIHsKKyAgICBBTE9HVigiRmluaXNoOiBmb3IgY29kZWMgJXMsIG1lZGlhdHlwZSAlcyIsIG1OYW1lLmNfc3RyKCksIG1NZWRpYVR5cGUuY19zdHIoKSk7CisgICAgYWRkTWVkaWFEZWZhdWx0cyhmYWxzZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIG1lZGlhZm9ybWF0c2hhcGVyCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL0Zvcm1hdFNoYXBlci5jcHAgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9Gb3JtYXRTaGFwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MWY3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9Gb3JtYXRTaGFwZXIuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGb3JtYXRTaGFwZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKKyNpbmNsdWRlICJDb2RlY1Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJWaWRlb1NoYXBlci5oIgorI2luY2x1ZGUgIlZRb3BzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9mb3JtYXRzaGFwZXIvRm9ybWF0U2hhcGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlciB7CisKKy8vCisvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYW5kIHJlc3BvbnNpYmlsaXR5IGZvciBpbkZvcm1hdAorLy8KKworLy8KKy8vIHRoZSBpbnRlcmZhY2UgdG8gdGhlIG91dHNpZGUKKy8vCisKK2ludCBzaGFwZUZvcm1hdChzaGFwZXJIYW5kbGVfdCBzaGFwZXIsIEFNZWRpYUZvcm1hdCogaW5Gb3JtYXQsIGludCBmbGFncykgeworICAgIENvZGVjUHJvcGVydGllcyAqY29kZWMgPSAoQ29kZWNQcm9wZXJ0aWVzKikgc2hhcGVyOworICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFjb2RlYy0+aXNSZWdpc3RlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHRyYW5zZm9ybWF0aW9ucworICAgIC8vCisKKyAgICBzdGQ6OnN0cmluZyBtZWRpYVR5cGUgPSBjb2RlYy0+Z2V0TWVkaWFUeXBlKCk7CisgICAgaWYgKHN0cm5jbXAobWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgIC8vIHZpZGVvIHNwZWNpZmljIHNoYXBpbmcKKyAgICAgICAgKHZvaWQpIHZpZGVvU2hhcGVyKGNvZGVjLCBpbkZvcm1hdCwgZmxhZ3MpOworCisgICAgfSBlbHNlIGlmIChzdHJuY21wKG1lZGlhVHlwZS5jX3N0cigpLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAvLyBhdWRpbyBzcGVjaWZpYyBzaGFwaW5nCisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigidW5rbm93biBtZWRpYXR5cGUgJyVzJywgbGVmdCB1bnRvdWNoZWQiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHNldE1hcChzaGFwZXJIYW5kbGVfdCBzaGFwZXIsICBjb25zdCBjaGFyICpraW5kLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgQUxPR1YoInNldE1hcDoga2luZCAlcyBrZXkgJXMgLT4gdmFsdWUgJXMiLCBraW5kLCBrZXksIHZhbHVlKTsKKyAgICBDb2RlY1Byb3BlcnRpZXMgKmNvZGVjID0gKENvZGVjUHJvcGVydGllcyopIHNoYXBlcjsKKyAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIG11c3Qgbm90IHlldCBiZSByZWdpc3RlcmVkCisgICAgaWYgKGNvZGVjLT5pc1JlZ2lzdGVyZWQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29kZWMtPnNldE1hcHBpbmcoa2luZCwga2V5LCB2YWx1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzZXRGZWF0dXJlKHNoYXBlckhhbmRsZV90IHNoYXBlciwgY29uc3QgY2hhciAqZmVhdHVyZSwgaW50IHZhbHVlKSB7CisgICAgQUxPR1YoInNldF9mZWF0dXJlOiBmZWF0dXJlICVzIHZhbHVlICVkIiwgZmVhdHVyZSwgdmFsdWUpOworICAgIENvZGVjUHJvcGVydGllcyAqY29kZWMgPSAoQ29kZWNQcm9wZXJ0aWVzKikgc2hhcGVyOworICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gbXVzdCBub3QgeWV0IGJlIHJlZ2lzdGVyZWQKKyAgICBpZiAoY29kZWMtPmlzUmVnaXN0ZXJlZCgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBzYXZlIGEgbWFwIG9mIGFsbCBmZWF0dXJlcworICAgIGNvZGVjLT5zZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzZXRUdW5pbmcoc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICp0dW5pbmcsIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgQUxPR1YoInNldFR1bmluZzogdHVuaW5nICVzIHZhbHVlICVzIiwgdHVuaW5nLCB2YWx1ZSk7CisgICAgQ29kZWNQcm9wZXJ0aWVzICpjb2RlYyA9IChDb2RlY1Byb3BlcnRpZXMqKSBzaGFwZXI7CisgICAgaWYgKGNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBtdXN0IG5vdCB5ZXQgYmUgcmVnaXN0ZXJlZAorICAgIGlmIChjb2RlYy0+aXNSZWdpc3RlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIHNhdmUgYSBtYXAgb2YgYWxsIGZlYXR1cmVzCisgICAgY29kZWMtPnNldFR1bmluZ1ZhbHVlKHR1bmluZywgdmFsdWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgcm91dGluZXMgdGhhdCBtYW5hZ2UgZmluZGluZywgY3JlYXRpbmcsIGFuZCByZWdpc3RlcmluZyB0aGUgc2hhcGVycy4KKyAqLworCitzaGFwZXJIYW5kbGVfdCBmaW5kU2hhcGVyKGNvbnN0IGNoYXIgKmNvZGVjTmFtZSwgY29uc3QgY2hhciAqbWVkaWFUeXBlKSB7CisgICAgQ29kZWNQcm9wZXJ0aWVzICpjb2RlYyA9IGZpbmRDb2RlYyhjb2RlY05hbWUsIG1lZGlhVHlwZSk7CisgICAgcmV0dXJuIChzaGFwZXJIYW5kbGVfdCkgY29kZWM7Cit9CisKK3NoYXBlckhhbmRsZV90IGNyZWF0ZVNoYXBlcihjb25zdCBjaGFyICpjb2RlY05hbWUsIGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIENvZGVjUHJvcGVydGllcyAqY29kZWMgPSBuZXcgQ29kZWNQcm9wZXJ0aWVzKGNvZGVjTmFtZSwgbWVkaWFUeXBlKTsKKyAgICBpZiAoY29kZWMgIT0gbnVsbHB0cikgeworICAgICAgICBjb2RlYy0+U2VlZCgpOworICAgIH0KKyAgICByZXR1cm4gKHNoYXBlckhhbmRsZV90KSBjb2RlYzsKK30KKworc2hhcGVySGFuZGxlX3QgcmVnaXN0ZXJTaGFwZXIoc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICpjb2RlY05hbWUsIGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIEFMT0dWKCJyZWdpc3RlclNoYXBlcihoYW5kbGUsIGNvZGVjTmFtZSAlcywgbWVkaWFUeXBlICVzIiwgY29kZWNOYW1lLCBtZWRpYVR5cGUpOworICAgIENvZGVjUHJvcGVydGllcyAqY29kZWMgPSAoQ29kZWNQcm9wZXJ0aWVzKikgc2hhcGVyOworICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAvLyBtdXN0IG5vdCB5ZXQgYmUgcmVnaXN0ZXJlZAorICAgIGlmIChjb2RlYy0+aXNSZWdpc3RlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gYW55IGZpbmFsIGNsZWFudXAgZm9yIHRoZSBwYXJhbWV0ZXJzLiBUaGlzIGFsbG93cyB1cyB0byBvdmVycmlkZQorICAgIC8vIGJhZCBwYXJhbWV0ZXJzIGZyb20gYSBkZXZpY2VzIFhNTCBmaWxlLgorICAgIGNvZGVjLT5GaW5pc2goKTsKKworICAgIC8vIG1heSByZXR1cm4gYSBkaWZmZXJlbnQgY29kZWMsIGlmIHdlIGxvc3QgYSByYWNlLgorICAgIC8vIGlmIHNvLCByZWdpc3RlckNvZGVjKCkgcmVjbGFpbXMgdGhlIG9uZSB3ZSB0cmllZCB0byByZWdpc3RlciBmb3IgdXMuCisgICAgY29kZWMgPSByZWdpc3RlckNvZGVjKGNvZGVjLCBjb2RlY05hbWUsIG1lZGlhVHlwZSk7CisgICAgcmV0dXJuIChzaGFwZXJIYW5kbGVfdCkgY29kZWM7Cit9CisKKy8vIG1hcHBpbmcgJiB1bm1hcHBpbmcKKy8vIGdpdmUgbWUgdGhlIG1hcHBpbmdzIGZvciAna2luZCcuCisvLyBraW5kPT1udWxsIChvciBlbXB0eSBzdHJpbmcpLCBtZWFucyAqYWxsKiBtYXBwaW5ncworCitjb25zdCBjaGFyICoqZ2V0TWFwcGluZ3Moc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICpraW5kKSB7CisgICAgQ29kZWNQcm9wZXJ0aWVzICpjb2RlYyA9IChDb2RlY1Byb3BlcnRpZXMqKSBzaGFwZXI7CisgICAgaWYgKGNvZGVjID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChraW5kID09IG51bGxwdHIpCisgICAgICAgIGtpbmQgPSAiIjsKKworICAgIHJldHVybiBjb2RlYy0+Z2V0TWFwcGluZ3Moa2luZCwgLyogcmV2ZXJzZSAqLyBmYWxzZSk7Cit9CisKK2NvbnN0IGNoYXIgKipnZXRSZXZlcnNlTWFwcGluZ3Moc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICpraW5kKSB7CisgICAgQ29kZWNQcm9wZXJ0aWVzICpjb2RlYyA9IChDb2RlY1Byb3BlcnRpZXMqKSBzaGFwZXI7CisgICAgaWYgKGNvZGVjID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChraW5kID09IG51bGxwdHIpCisgICAgICAgIGtpbmQgPSAiIjsKKworICAgIHJldHVybiBjb2RlYy0+Z2V0TWFwcGluZ3Moa2luZCwgLyogcmV2ZXJzZSAqLyB0cnVlKTsKK30KKworCisvLyB0aGUgc3lzdGVtIGdyYWJzIHRoaXMgc3RydWN0dXJlCitfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCitleHRlcm4gIkMiIEZvcm1hdFNoYXBlck9wc190IHNoYXBlcl9vcHMgPSB7CisgICAgLnZlcnNpb24gPSBTSEFQRVJfVkVSU0lPTl9WMSwKKworICAgIC5maW5kU2hhcGVyID0gZmluZFNoYXBlciwKKyAgICAuY3JlYXRlU2hhcGVyID0gY3JlYXRlU2hhcGVyLAorICAgIC5zZXRNYXAgPSBzZXRNYXAsCisgICAgLnNldEZlYXR1cmUgPSBzZXRGZWF0dXJlLAorICAgIC5yZWdpc3RlclNoYXBlciA9IHJlZ2lzdGVyU2hhcGVyLAorCisgICAgLnNoYXBlRm9ybWF0ID0gc2hhcGVGb3JtYXQsCisgICAgLmdldE1hcHBpbmdzID0gZ2V0TWFwcGluZ3MsCisgICAgLmdldFJldmVyc2VNYXBwaW5ncyA9IGdldFJldmVyc2VNYXBwaW5ncywKKworICAgIC5zZXRUdW5pbmcgPSBzZXRUdW5pbmcsCit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL01hbmFnZVNoYXBpbmdDb2RlY3MuY3BwIGIvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvTWFuYWdlU2hhcGluZ0NvZGVjcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MWQwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL01hbmFnZVNoYXBpbmdDb2RlY3MuY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNYW5hZ2VTaGFwaW5nQ29kZWNzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCisjaW5jbHVkZSAiQ29kZWNQcm9wZXJ0aWVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlciB7CisKKy8vIG1hbmFnZSB0aGUgbGlzdCBvZiBjb2RlYyBpbmZvcm1hdGlvbi4KKy8vCisvLyBYWFg6IHRoZSBtdXRleCBoZXJlIGlzIHRvbyBoZWF2eTsgcmV3b3JrIHRoYXQuCisvLworCitzdGF0aWMgc3RkOjptdXRleCBzQ29kZWNNdXRleDsKK3N0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ29kZWNQcm9wZXJ0aWVzKj4gc0NvZGVjVHJhaXRzOworCitDb2RlY1Byb3BlcnRpZXMgKmZpbmRDb2RlYyhjb25zdCBjaGFyICpjb2RlY05hbWUsIGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIENvZGVjUHJvcGVydGllcyAqY29kZWMgPSBudWxscHRyOworCisgICAgLy8gc3ludGhlc2l6ZSBhIG5hbWUgZnJvbSBib3RoIGNvZGVjTmFtZSArIG1lZGlhVHlwZQorICAgIC8vIHNvbWUgY29kZWNzIHN1cHBvcnQgbXVsdGlwbGUgbWVkaWEgdHlwZXMgYW5kIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMKKyAgICAvLyBmb3IgZWFjaCBtZWRpYSB0eXBlCisgICAgLy8KKyAgICBzdGQ6OnN0cmluZyBjb2RlY0tleSA9IGNvZGVjTmFtZTsKKyAgICBjb2RlY0tleSArPSAiLSI7CisgICAgY29kZWNLZXkgKz0gbWVkaWFUeXBlOworCisgICAgc3RkOjpsb2NrX2d1YXJkICBfbChzQ29kZWNNdXRleCk7CisKKyAgICBhdXRvIGl0ID0gc0NvZGVjVHJhaXRzLmZpbmQoY29kZWNLZXkpOworICAgIGlmIChpdCAhPSBzQ29kZWNUcmFpdHMuZW5kKCkpIHsKKyAgICAgICAgY29kZWMgPSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIHJldHVybiBjb2RlYzsKK30KKworQ29kZWNQcm9wZXJ0aWVzICpyZWdpc3RlckNvZGVjKENvZGVjUHJvcGVydGllcyAqY29kZWMsIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKworICAgIENvZGVjUHJvcGVydGllcyAqcmVnaXN0ZXJlZENvZGVjID0gbnVsbHB0cjsKKworICAgIGlmIChjb2RlYy0+aXNSZWdpc3RlcmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gc3ludGhlc2l6ZSBhIG5hbWUgZnJvbSBib3RoIGNvZGVjTmFtZSArIG1lZGlhVHlwZQorICAgIC8vIHNvbWUgY29kZWNzIHN1cHBvcnQgbXVsdGlwbGUgbWVkaWEgdHlwZXMgYW5kIG1heSBoYXZlIGRpZmZlcmVudCBjYXBhYmlsaXRpZXMKKyAgICAvLyBmb3IgZWFjaCBtZWRpYSB0eXBlCisgICAgLy8KKyAgICBzdGQ6OnN0cmluZyBjb2RlY0tleSA9IGNvZGVjTmFtZTsKKyAgICBjb2RlY0tleSArPSAiLSI7CisgICAgY29kZWNLZXkgKz0gbWVkaWFUeXBlOworCisgICAgc3RkOjpsb2NrX2d1YXJkICBfbChzQ29kZWNNdXRleCk7CisKKyAgICBhdXRvIGl0ID0gc0NvZGVjVHJhaXRzLmZpbmQoY29kZWNLZXkpOworICAgIGlmIChpdCAhPSBzQ29kZWNUcmFpdHMuZW5kKCkpIHsKKyAgICAgICAgcmVnaXN0ZXJlZENvZGVjID0gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBpZiAocmVnaXN0ZXJlZENvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIG9uZSB0aGF0IHdhcyBwYXNzZWQgdG8gdXMKKyAgICAgICAgQUxPR1YoIkNyZWF0aW5nIGVudHJ5IGZvciBjb2RlYyAlcywgbWVkaWFUeXBlICVzLCBrZXkgJXMiLCBjb2RlY05hbWUsIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgY29kZWNLZXkuY19zdHIoKSk7CisgICAgICAgIHNDb2RlY1RyYWl0cy5pbnNlcnQoe2NvZGVjS2V5LCBjb2RlY30pOworICAgICAgICByZWdpc3RlcmVkQ29kZWMgPSBjb2RlYzsKKyAgICAgICAgY29kZWMtPnNldFJlZ2lzdGVyZWQodHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb25lIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdXNlIHRoYXQKKyAgICAgICAgLy8gYW5kIGRpc2NhcmQgdGhlIGNhbmRpZGF0ZQorICAgICAgICBkZWxldGUgY29kZWM7CisgICAgICAgIGNvZGVjID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVnaXN0ZXJlZENvZGVjOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZRQXBwbHkuY3BwIGIvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvVlFBcHBseS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZjQ0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZRQXBwbHkuY3BwCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWUUFwcGx5IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCisjaW5jbHVkZSAiVlFvcHMuaCIKKyNpbmNsdWRlICJDb2RlY1Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJWaWRlb1NoYXBlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIgeworCisKKy8vIHRoZXNlIGFyZSBhbGwgTkRLIzMxIGFuZCB3ZSBydW4gYXMgTkRLIzI5ICh0byBiZSB3aXRoaW4gdGhlIG1vZHVsZSkKKy8vIHRoZSBfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgMzEsICopIGNvbnN0cnVjdHMgZGlkbid0IHdvcmsgZm9yIG1lLgorLy8KKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX01BWAkidmlkZW8tcXAtbWF4IgorI2RlZmluZQlBTUVESUFGT1JNQVRfVklERU9fUVBfTUlOCSJ2aWRlby1xcC1taW4iCisKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUFYCSJ2aWRlby1xcC1iLW1heCIKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOCSJ2aWRlby1xcC1iLW1pbiIKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUFYCSJ2aWRlby1xcC1pLW1heCIKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUlOCSJ2aWRlby1xcC1pLW1pbiIKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUFYCSJ2aWRlby1xcC1wLW1heCIKKyNkZWZpbmUJQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUlOCSJ2aWRlby1xcC1wLW1pbiIKKworLy8gZGVmaW5lZCBpbiB0aGUgU0RLLCBidXQgbm90IGluIHRoZSBOREsKKy8vCitzdGF0aWMgY29uc3QgaW50IEJJVFJBVEVfTU9ERV9WQlIgPSAxOworCisKKy8vCisvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYW5kIHJlc3BvbnNpYmlsaXR5IGZvciBpbkZvcm1hdAorLy8KK2ludCBWUUFwcGx5KENvZGVjUHJvcGVydGllcyAqY29kZWMsIHZxT3BzX3QgKmluZm8sIEFNZWRpYUZvcm1hdCogaW5Gb3JtYXQsIGludCBmbGFncykgeworICAgIEFMT0dWKCJjb2RlY05hbWUgJXMgaW5Gb3JtYXQgJXAgZmxhZ3MgeCV4IiwgY29kZWMtPmdldE5hbWUoKS5jX3N0cigpLCBpbkZvcm1hdCwgZmxhZ3MpOworICAgICh2b2lkKSBpbmZvOyAvLyB1bnVzZWQgZm9yIG5vdworCisgICAgaW50MzJfdCBiaXRSYXRlTW9kZSA9IC0xOworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIoaW5Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFLCAmYml0UmF0ZU1vZGUpCisgICAgICAgICYmIGJpdFJhdGVNb2RlICE9IEJJVFJBVEVfTU9ERV9WQlIpIHsKKyAgICAgICAgQUxPR0QoIm1pbnF1YWxpdHk6IGFwcGxpZXMgb25seSB0byBWQlIgZW5jb2RpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gb25seSBwcm9jZWVkIGlmIHdlJ3JlIGluIHRoZSBoYW5kaGVsZCBjYXRlZ29yeS4KKyAgICAvLyBXZSBlbWJlZCB0aGlzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29kZWMgcmVjb3JkIHdoZW4gd2UgYnVpbGQgdXAgZmVhdHVyZXMKKyAgICAvLyBhbmQgcGFzcyB0aGVtIGluIGZyb20gTWVkaWFDb2RlYzsgaXQncyB0aGUgZWFzaWVzdCBwbGFjZSB0byBzdG9yZSBpdAorICAgIC8vCisgICAgLy8gVE9ETzogbWFrZSBhICNkZWZpbmUgZm9yICcgX3ZxX2VsaWdpYmxlLmRldmljZScgaGVyZSBhbmQgaW4gTWVkaWFDb2RlYy5jcHAKKyAgICAvLworICAgIGludDMyX3QgaXNWUUVsaWdpYmxlID0gMDsKKyAgICAodm9pZCkgY29kZWMtPmdldEZlYXR1cmVWYWx1ZSgiX3ZxX2VsaWdpYmxlLmRldmljZSIsICZpc1ZRRWxpZ2libGUpOworICAgIGlmICghaXNWUUVsaWdpYmxlKSB7CisgICAgICAgIEFMT0dEKCJtaW5xdWFsaXR5OiBub3QgYW4gZWxpZ2libGUgZGV2aWNlIGNsYXNzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGxvb2sgYXQgcmVzb2x1dGlvbiB0byBkZXRlcm1pbmUgaWYgd2Ugd2FudCBhbnkgc2hhcGluZy9tb2RpZmljYXRpb24gYXQgYWxsLgorICAgIC8vCisgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc2hhcGUgKG9yIGFzayB0aGUgdW5kZXJseWluZyBjb2RlYyB0byBzaGFwZSkgZm9yCisgICAgLy8gcmVzb2x1dGlvbiByYW5nZSAgMzIweDI0MCA8IHRhcmdldCA8PSAxOTIweDEwODAKKyAgICAvLyBOQjogdGhlIDwgdnMgPD0sIHRoYXQgaXMgZGVsaWJlcmF0ZS4KKyAgICAvLworCisgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgKHZvaWQpIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihpbkZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgKHZvaWQpIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihpbkZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQpOworICAgIGludDY0X3QgcGl4ZWxzID0gKChpbnQ2NF90KXdpZHRoKSAqIGhlaWdodDsKKworICAgIGJvb2wgZWxpZ2libGVTaXplID0gdHJ1ZTsKKyAgICBpZiAocGl4ZWxzIDw9IDMyMCAqIDI0MCkgeworICAgICAgICBlbGlnaWJsZVNpemUgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHBpeGVscyA+IDE5MjAgKiAxMDg4KSB7CisgICAgICAgIGVsaWdpYmxlU2l6ZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghZWxpZ2libGVTaXplKSB7CisgICAgICAgIC8vIHdlIHdvbid0IHNoYXBlLCBhbmQgYXNrIHRoYXQgdGhlIGNvZGVjIG5vdCBzaGFwZQorICAgICAgICBBTE9HRCgibWlucXVhbGl0eTogJWR4JWQgb3V0c2lkZSBvZiBzaGFwaW5nIHJhbmdlIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihpbkZvcm1hdCwgImFuZHJvaWQuX2VuY29kaW5nLXF1YWxpdHktbGV2ZWwiLCAwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGNvZGVjLT5zdXBwb3J0ZWRNaW5pbXVtUXVhbGl0eSgpID4gMCkgeworICAgICAgICAvLyBoYXZlIHRoZSBjb2RlYy1wcm92aWRlZCBtaW5pbXVtIHF1YWxpdHkgYmVoYXZpb3IgdG8gd29yayBhdCBpdAorICAgICAgICBBTE9HRCgibWlucXVhbGl0eTogY29kZWMgY2xhaW1zIHRvIGltcGxlbWVudCBtaW5xdWFsaXR5PSVkIiwKKyAgICAgICAgICAgICAgY29kZWMtPnN1cHBvcnRlZE1pbmltdW1RdWFsaXR5KCkpOworCisgICAgICAgIC8vIHRlbGwgdGhlIHVuZGVybHlpbmcgY29kZWMgdG8gZG8gaXRzIHRoaW5nOyB3ZSB3b24ndCB0cnkgdG8gc2Vjb25kIGd1ZXNzLgorICAgICAgICAvLyBkZWZhdWx0IHRvIDEsIGFrYSBTX0hBTkRIRUxEOworICAgICAgICBpbnQzMl90IHF1YWxpdHlUYXJnZXQgPSAxOworICAgICAgICAodm9pZCkgY29kZWMtPmdldEZlYXR1cmVWYWx1ZSgiX3F1YWxpdHkudGFyZ2V0IiwgJnF1YWxpdHlUYXJnZXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoaW5Gb3JtYXQsICJhbmRyb2lkLl9lbmNvZGluZy1xdWFsaXR5LWxldmVsIiwgcXVhbGl0eVRhcmdldCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGxldCB0aGUgY29kZWMga25vdyB0aGF0IHdlJ2xsIGJlIGVuZm9yY2luZyB0aGUgbWluaW11bSBxdWFsaXR5IHN0YW5kYXJkcworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihpbkZvcm1hdCwgImFuZHJvaWQuX2VuY29kaW5nLXF1YWxpdHktbGV2ZWwiLCAwKTsKKworICAgIC8vCisgICAgLy8gY29uc2lkZXIgYW55IGFuZCBhbGwgdG9vbHMgYXZhaWxhYmxlCisgICAgLy8gLS0gcXAKKyAgICAvLyAtLSBtaW5pbXVtIGJpdHMtcGVyLXBpeGVsCisgICAgLy8KKyAgICBpbnQ2NF90IGJpdHJhdGVDaG9zZW4gPSAwOworICAgIGludDMyX3QgcXBDaG9zZW4gPSBJTlQzMl9NQVg7CisKKyAgICBpbnQ2NF90IGJpdHJhdGVDb25maWd1cmVkID0gMDsKKyAgICBpbnQzMl90IGJpdHJhdGVDb25maWd1cmVkVG1wID0gMDsKKyAgICAodm9pZCkgQU1lZGlhRm9ybWF0X2dldEludDMyKGluRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0cmF0ZUNvbmZpZ3VyZWRUbXApOworICAgIGJpdHJhdGVDb25maWd1cmVkID0gYml0cmF0ZUNvbmZpZ3VyZWRUbXA7CisgICAgYml0cmF0ZUNob3NlbiA9IGJpdHJhdGVDb25maWd1cmVkOworCisgICAgLy8gd2lkdGgsIGhlaWdodCwgYW5kIHBpeGVscyBhcmUgY2FsY3VsYXRlZCBhYm92ZQorCisgICAgZG91YmxlIG1pbmltdW1CcHAgPSBjb2RlYy0+Z2V0QnBwKHdpZHRoLCBoZWlnaHQpOworCisgICAgaW50NjRfdCBiaXRyYXRlRmxvb3IgPSBwaXhlbHMgKiBtaW5pbXVtQnBwOworICAgIGludDY0X3QgYml0cmF0ZUNlaWxpbmcgPSBiaXRyYXRlRmxvb3IgKiBjb2RlYy0+Z2V0UGhhc2VPdXQoKTsKKyAgICBpZiAoYml0cmF0ZUZsb29yID4gSU5UMzJfTUFYKSBiaXRyYXRlRmxvb3IgPSBJTlQzMl9NQVg7CisgICAgaWYgKGJpdHJhdGVDZWlsaW5nID4gSU5UMzJfTUFYKSBiaXRyYXRlQ2VpbGluZyA9IElOVDMyX01BWDsKKworICAgIC8vIGlmIHdlIGFyZSBmYXIgZW5vdWdoIGFib3ZlIHRoZSB0YXJnZXQgYnBwLCBsZWF2ZSBpdCBhbG9uZQorICAgIC8vCisgICAgQUxPR1YoImJpdHJhdGU6IGNvbmZpZ3VyZWQgJSIgUFJJZDY0ICIgZmxvb3IgJSIgUFJJZDY0LCBiaXRyYXRlQ29uZmlndXJlZCwgYml0cmF0ZUZsb29yKTsKKyAgICBpZiAoYml0cmF0ZUNvbmZpZ3VyZWQgPj0gYml0cmF0ZUNlaWxpbmcpIHsKKyAgICAgICAgQUxPR1YoImhpZ2ggZW5vdWdoIGJpdHJhdGU6IGNvbmZpZ3VyZWQgJSIgUFJJZDY0ICIgPj0gY2VpbGluZyAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgYml0cmF0ZUNvbmZpZ3VyZWQsIGJpdHJhdGVDZWlsaW5nKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gcmFpc2UgYW55dGhpbmcgYmVsb3cgdGhlIGJpdHJhdGUgZmxvb3IKKyAgICBpZiAoYml0cmF0ZUNvbmZpZ3VyZWQgPCBiaXRyYXRlRmxvb3IpIHsKKyAgICAgICAgQUxPR0QoInJhaXNlIGJpdHJhdGU6IGNvbmZpZ3VyZWQgJSIgUFJJZDY0ICIgdG8gZmxvb3IgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIGJpdHJhdGVDb25maWd1cmVkLCBiaXRyYXRlRmxvb3IpOworICAgICAgICBiaXRyYXRlQ2hvc2VuID0gYml0cmF0ZUZsb29yOworICAgIH0KKworICAgIGJvb2wgcXBQcmVzZW50ID0gaGFzUXBNYXgoaW5Gb3JtYXQpOworCisgICAgLy8gY2FsY3VsYXRlIGEgdGFyZ2V0IFFQIHZhbHVlCisgICAgaW50MzJfdCBxcG1heCA9IGNvZGVjLT50YXJnZXRRcE1heCh3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAoIXFwUHJlc2VudCkgeworICAgICAgICAvLyB1c2VyIGRpZG4ndCwgc28gc2hhcGVyIHdpbnMKKyAgICAgICAgaWYgKHFwbWF4ICE9IElOVDMyX01BWCkgeworICAgICAgICAgICAgQUxPR1YoImNob29zaW5nIHFwPSVkIiwgcXBtYXgpOworICAgICAgICAgICAgcXBDaG9zZW4gPSBxcG1heDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocXBtYXggPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIHNoYXBlciBkaWRuJ3Qgc28gdXNlciB3aW5zCisgICAgICAgIHFwQ2hvc2VuID0gSU5UMzJfTUFYOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoaW5Gb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9NQVgsICZxcENob3Nlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gYm90aCBzaWRlcyB3YW50IGl0LCBjaG9vc2UgbW9zdCByZXN0cmljdGl2ZQorICAgICAgICBpbnQzMl90IHZhbHVlID0gSU5UMzJfTUFYOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoaW5Gb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9NQVgsICZ2YWx1ZSk7CisgICAgICAgIHFwQ2hvc2VuID0gc3RkOjptaW4ocXBtYXgsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBpZiBRUCBpcyBkZXNpcmVkIGJ1dCBub3Qgc3VwcG9ydGVkLCBjb21wZW5zYXRlIHdpdGggYWRkaXRpb25hbCBiaXRzCisgICAgaWYgKCFjb2RlYy0+c3VwcG9ydHNRcCgpKSB7CisgICAgICAgIGlmIChxcENob3NlbiAhPSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGludDY0X3QgYm9vc3QgPSBiaXRyYXRlQ2hvc2VuICogY29kZWMtPmdldE1pc3NpbmdRcEJvb3N0KCk7CisgICAgICAgICAgICBBTE9HRCgibWlucXVhbGl0eTogcmVxdWVzdGVkIFFQIHVuc3VwcG9ydGVkLCBib29zdCBiaXRyYXRlICUiIFBSSWQ2NCAiIGJ5ICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBiaXRyYXRlQ2hvc2VuLCBib29zdCk7CisgICAgICAgICAgICBiaXRyYXRlQ2hvc2VuID0gIGJpdHJhdGVDaG9zZW4gKyBib29zdDsKKyAgICAgICAgICAgIHFwQ2hvc2VuID0gSU5UMzJfTUFYOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGltaXRzCisgICAgLy8gYXBwbHkgb3VyIGNob3NlbiB2YWx1ZXMKKyAgICAvLworICAgIGlmIChxcENob3NlbiAhPSBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0QoIm1pbnF1YWxpdHkgYnkgUVA6IGluamVjdCAlcz0lZCIsIEFNRURJQUZPUk1BVF9WSURFT19RUF9NQVgsIHFwQ2hvc2VuKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGluRm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfTUFYLCBxcENob3Nlbik7CisKKyAgICAgICAgLy8gY2FsbGVyIChWaWRlb1NoYXBlcikgaGFuZGxlcyBzcHJlYWRpbmcgdGhpcyBhY3Jvc3MgdGhlIHN1YmZyYW1lcworICAgIH0KKworICAgIGlmIChiaXRyYXRlQ2hvc2VuICE9IGJpdHJhdGVDb25maWd1cmVkKSB7CisgICAgICAgIGlmIChiaXRyYXRlQ2hvc2VuID4gYml0cmF0ZUNlaWxpbmcpIHsKKyAgICAgICAgICAgIEFMT0dEKCJtaW5xdWFsaXR5OiBiaXRyYXRlIGluY3JlYXNlIGNsYW1wZWQgYXQgY2VpbGluZyAlIiBQUklkNjQsICBiaXRyYXRlQ2VpbGluZyk7CisgICAgICAgICAgICBiaXRyYXRlQ2hvc2VuID0gYml0cmF0ZUNlaWxpbmc7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIm1pbnF1YWxpdHkvdGFyZ2V0IGJpdHJhdGUgcmFpc2VkIGZyb20gJSIgUFJJZDY0ICIgdG8gJSIgUFJJZDY0ICIgYnBzIiwKKyAgICAgICAgICAgICAgYml0cmF0ZUNvbmZpZ3VyZWQsIGJpdHJhdGVDaG9zZW4pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoaW5Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWJpdHJhdGVDaG9zZW4pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2Jvb2wgaGFzUXBNYXhQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBpbnQzMl90IHZhbHVlOworCisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCwgJnZhbHVlKQorICAgICAgICB8fCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfSV9NSU4sICZ2YWx1ZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NQVgsICZ2YWx1ZSkKKyAgICAgICAgfHwgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUlOLCAmdmFsdWUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUFYLCAmdmFsdWUpCisgICAgICAgIHx8IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01JTiwgJnZhbHVlKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGhhc1FwTWF4R2xvYmFsKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgaW50MzJfdCB2YWx1ZTsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX01BWCwgJnZhbHVlKQorICAgICAgICB8fCBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfTUlOLCAmdmFsdWUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaGFzUXBNYXgoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBpZiAoaGFzUXBNYXhHbG9iYWwoZm9ybWF0KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGhhc1FwTWF4UGVyRnJhbWVUeXBlKGZvcm1hdCk7Cit9CisKK3ZvaWQgcXBTcHJlYWRQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIGludCBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcGxvdywgaW50IHFwaGlnaCwgYm9vbCBvdmVycmlkZSkgeworCisgICAgIHFwU3ByZWFkTWluUGVyRnJhbWVUeXBlKGZvcm1hdCwgcXBsb3csIG92ZXJyaWRlKTsKKyAgICAgcXBTcHJlYWRNYXhQZXJGcmFtZVR5cGUoZm9ybWF0LCBkZWx0YSwgcXBoaWdoLCBvdmVycmlkZSk7CisgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1pbjxtYXggZm9yIGFsbCB0aGUgUVAgZmllbGRzLgorICAgICBxcFZlcmlmeU1pbk1heE9yZGVyaW5nKGZvcm1hdCk7Cit9CisKK3ZvaWQgcXBTcHJlYWRNYXhQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIGludCBkZWx0YSwgaW50IHFwaGlnaCwgYm9vbCBvdmVycmlkZSkgeworICAgIEFMT0dWKCJmb3JtYXQgJXAgZGVsdGEgJWQgIGhpICVkIG92ZXJyaWRlICVkIiwgZm9ybWF0LCBkZWx0YSwgcXBoaWdoLCBvdmVycmlkZSk7CisKKyAgICBpbnQzMl90IHFwT2ZmZXJlZCA9IDA7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9NQVgsICZxcE9mZmVyZWQpKSB7CisgICAgICAgIC8vIHByb3BhZ2F0ZSB0byBmcmFtZS1zcGVjaWZpYyBrZXlzLCBjaG9vc2luZyBtb3N0IHJlc3RyaWN0aXZlCisgICAgICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvbid0IHZpb2xhdGUgbWluPD1tYXggcnVsZXMKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBtYXhJID0gSU5UMzJfTUFYOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUFYLCAmbWF4SSk7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gc3RkOjptaW4oe3FwT2ZmZXJlZCwgcXBoaWdoLCBtYXhJfSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfSV9NQVgsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IG1heFAgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NQVgsICZtYXhQKTsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBzdGQ6Om1pbih7KHN0ZDo6bWluKHFwT2ZmZXJlZCwgSU5UMzJfTUFYLTEqZGVsdGEpICsgMSpkZWx0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBoaWdoLCBtYXhQfSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NQVgsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IG1heEIgPSBJTlQzMl9NQVg7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NQVgsICZtYXhCKTsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBzdGQ6Om1pbih7KHN0ZDo6bWluKHFwT2ZmZXJlZCwgSU5UMzJfTUFYLTIqZGVsdGEpICsgMipkZWx0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBoaWdoLCBtYXhCfSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfQl9NQVgsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBxcFNwcmVhZE1pblBlckZyYW1lVHlwZShBTWVkaWFGb3JtYXQgKmZvcm1hdCwgaW50IHFwbG93LCBib29sIG92ZXJyaWRlKSB7CisgICAgQUxPR1YoImZvcm1hdCAlcCBsbyAlZCBvdmVycmlkZSAlZCIsIGZvcm1hdCwgcXBsb3csIG92ZXJyaWRlKTsKKworICAgIGludDMyX3QgcXBPZmZlcmVkID0gMDsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX01JTiwgJnFwT2ZmZXJlZCkpIHsKKyAgICAgICAgaW50IHZhbHVlID0gc3RkOjptYXgocXBsb3csIHFwT2ZmZXJlZCk7CisgICAgICAgIC8vIHByb3BhZ2F0ZSB0byBmcmFtZS1zcGVjaWZpYyBrZXlzLCB1c2UgbG93ZXN0IG9mIHRoaXMgYW5kIGV4aXN0aW5nIHBlci1mcmFtZSB2YWx1ZQorICAgICAgICBpbnQzMl90IG1pbkkgPSBJTlQzMl9NQVg7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01JTiwgJm1pbkkpOworICAgICAgICBpbnQzMl90IHNldEkgPSBzdGQ6Om1pbih2YWx1ZSwgbWluSSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01JTiwgc2V0SSk7CisKKyAgICAgICAgaW50MzJfdCBtaW5QID0gSU5UMzJfTUFYOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NSU4sICZtaW5QKTsKKyAgICAgICAgaW50MzJfdCBzZXRQID0gc3RkOjptaW4odmFsdWUsIG1pblApOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NSU4sIHNldFApOworCisgICAgICAgIGludDMyX3QgbWluQiA9IElOVDMyX01BWDsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOLCAmbWluQik7CisgICAgICAgIGludDMyX3Qgc2V0QiA9IHN0ZDo6bWluKHZhbHVlLCBtaW5CKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOLCBzZXRCKTsKKyAgICB9Cit9CisKKy8vIFhYWCB3aGV0aGVyIHdlIGFsbG93IG1pbj09bWF4LCBvciBpZiB3ZSdsbCBpbnNpc3QgdGhhdCBtaW48bWF4Cit2b2lkIHFwVmVyaWZ5TWluTWF4T3JkZXJpbmcoQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICAvLyBlbnN1cmUgdGhhdCB3ZSBkb24ndCB2aW9sYXRlIG1pbjw9bWF4IHJ1bGVzCisgICAgaW50MzJfdCBtYXhJID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgbWluSSA9IElOVDMyX01JTjsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUFYLCAmbWF4SSkKKyAgICAgICAgJiYgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUlOLCAmbWluSSkKKyAgICAgICAgJiYgbWluSSA+IG1heEkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0lfTUlOLCBtYXhJKTsKKyAgICB9CisgICAgaW50MzJfdCBtYXhQID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgbWluUCA9IElOVDMyX01JTjsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUFYLCAmbWF4UCkKKyAgICAgICAgJiYgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUlOLCAmbWluUCkKKyAgICAgICAgJiYgbWluUCA+IG1heFApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUlOLCBtYXhQKTsKKyAgICB9CisgICAgaW50MzJfdCBtYXhCID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgbWluQiA9IElOVDMyX01JTjsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUFYLCAmbWF4QikKKyAgICAgICAgJiYgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOLCAmbWluQikKKyAgICAgICAgJiYgbWluQiA+IG1heEIpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOLCBtYXhCKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlcgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvVlFvcHMuaCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZRb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjY2UxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZRb3BzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBMSUJNRURJQUZPUk1BVFNIQVBFUl9WUU9QU19IXworI2RlZmluZSBMSUJNRURJQUZPUk1BVFNIQVBFUl9WUU9QU19IXworCisjaW5jbHVkZSAiQ29kZWNQcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhZm9ybWF0c2hhcGVyIHsKKworLy8gcGFyYW1ldGVyaXplZCBpbmZvIGZvciB0aGUgZGlmZmVyZW50IG1lZGlhVHlwZSB0eXBlcwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm1lZGlhVHlwZTsKKworICAgIGludDMyX3QgcXBNaW47ICAgICAgLy8gY29kZWMgdHlwZSBsaW1pdCAoZS5nLiBoMjY0LCBub3QgYzIuYW5kcm9pZC5hdmMuZW5jb2RlcikKKyAgICBpbnQzMl90IHFwTWF4OworICAgIGludDMyX3QgcXBEZWx0YTsgICAgLy8gZnJvbSBJIHRvIFAgdG8gQgorCit9IHZxT3BzX3Q7CisKK2ludCBWUUFwcGx5KENvZGVjUHJvcGVydGllcyAqY29kZWMsIHZxT3BzX3QgKmluZm8sIEFNZWRpYUZvcm1hdCogaW5Gb3JtYXQsIGludCBmbGFncyk7CisKKy8vIHNwcmVhZCB0aGUgb3ZlcmFsbCBRUCBzZXR0aW5nIHRvIGFueSB1bi1zZXQgcGVyLWZyYW1lLXR5cGUgc2V0dGluZ3MKK3ZvaWQgcXBTcHJlYWRQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIGludCBkZWx0YSwgaW50IHFwbG93LCBpbnQgcXBoaWdoLCBib29sIG92ZXJyaWRlKTsKK3ZvaWQgcXBTcHJlYWRNYXhQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIGludCBkZWx0YSwgaW50IHFwaGlnaCwgYm9vbCBvdmVycmlkZSk7Cit2b2lkIHFwU3ByZWFkTWluUGVyRnJhbWVUeXBlKEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBpbnQgcXBsb3csIGJvb2wgb3ZlcnJpZGUpOwordm9pZCBxcFZlcmlmeU1pbk1heE9yZGVyaW5nKEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKKworLy8gZG9lcyB0aGUgZm9ybWF0IGhhdmUgUVAgYm91bmRpbmcgZW50cmllcworYm9vbCBoYXNRcE1heChBTWVkaWFGb3JtYXQgKmZvcm1hdCk7Citib29sIGhhc1FwTWF4R2xvYmFsKEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKK2Jvb2wgaGFzUXBNYXhQZXJGcmFtZVR5cGUoQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTElCTUVESUFGT1JNQVRTSEFQRVJfVlFPUFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZpZGVvU2hhcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZpZGVvU2hhcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjhiNTBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvVmlkZW9TaGFwZXIuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvU2hhcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCisjaW5jbHVkZSAiQ29kZWNQcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiVmlkZW9TaGFwZXIuaCIKKyNpbmNsdWRlICJWUW9wcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIgeworCisvLyBtZWRpYXR5cGUtc3BlY2lmaWMgb3BlcmF0aW9ucworCit2cU9wc190IG1lZGlhSW5mb1tdID0geworICAgIHsKKyAgICAgICAgLm1lZGlhVHlwZSA9ICJ2aWRlby9hdmMiLAorICAgICAgICAucXBNaW4gPSAwLAorICAgICAgICAucXBNYXggPSA1MSwKKyAgICAgICAgLnFwRGVsdGEgPSAzLAorICAgIH0sCisgICAgeworICAgICAgICAubWVkaWFUeXBlID0gInZpZGVvL2hldmMiLAorICAgICAgICAucXBNaW4gPSAwLAorICAgICAgICAucXBNYXggPSA1MSwKKyAgICAgICAgLnFwRGVsdGEgPSAzLAorICAgIH0sCisgICAgeworICAgICAgICAubWVkaWFUeXBlID0gTlVMTCwgICAgICAgICAgICAgICAgLy8gbWF0Y2hlcyBldmVyeXRoaW5nLCBpdCBtdXN0IGNvbWUgbGFzdAorICAgICAgICAucXBNaW4gPSBJTlQzMl9NSU4sCisgICAgICAgIC5xcE1heCA9IElOVDMyX01BWCwKKyAgICAgICAgLnFwRGVsdGEgPSAzLAorICAgIH0KK307CitpbnQgbk1lZGlhSW5mb3MgPSBzaXplb2YobWVkaWFJbmZvKSAvIHNpemVvZihtZWRpYUluZm9bMF0pOworCisvLworLy8gQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGFuZCByZXNwb25zaWJpbGl0eSBmb3IgaW5Gb3JtYXQKKy8vCisKK2ludCB2aWRlb1NoYXBlcihDb2RlY1Byb3BlcnRpZXMgKmNvZGVjLCBBTWVkaWFGb3JtYXQqIGluRm9ybWF0LCBpbnQgZmxhZ3MpIHsKKyAgICBpZiAoY29kZWMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEFMT0dWKCJjb2RlYyAlcyBpbkZvcm1hdCAlcCBmbGFncyB4JXgiLCBjb2RlYy0+Z2V0TmFtZSgpLmNfc3RyKCksIGluRm9ybWF0LCBmbGFncyk7CisKKyAgICBpbnQgaXg7CisKKyAgICBzdGQ6OnN0cmluZyBtZWRpYVR5cGUgPSBjb2RlYy0+Z2V0TWVkaWFUeXBlKCk7CisgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBjb21lIG91dCBvZiB0aGlzIHdpdGggYSBzZWxlY3Rpb24sIGJlY2F1c2UgdGhlIGZpbmFsIGVudHJ5CisgICAgLy8gaXMgZGVsaWJlcmFseSBhIE5VTEwgLS0gc28gdGhhdCBpdCB3aWxsIGFjdCBhcyBhIGRlZmF1bHQKKyAgICBmb3IoaXggPSAwOyBtZWRpYUluZm9baXhdLm1lZGlhVHlwZSAhPSBOVUxMOyBpeCsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobWVkaWFUeXBlLmNfc3RyKCksIG1lZGlhSW5mb1tpeF0ubWVkaWFUeXBlKSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXggPj0gbk1lZGlhSW5mb3MpIHsKKyAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMgLi4uLi4KKyAgICB9CisKKyAgICB2cU9wc190ICppbmZvID0gJm1lZGlhSW5mb1tpeF07CisKKyAgICAvLyBhcHBseSBhbnkgcXVhbGl0eSB0cmFuc2Zvcm1zIGluIGhlcmUuLgorICAgICh2b2lkKSBWUUFwcGx5KGNvZGVjLCBpbmZvLCBpbkZvcm1hdCwgZmxhZ3MpOworCisgICAgLy8gV2UgYWx3YXlzIHNwcmVhZCBhbnkgUVAgcGFyYW1ldGVycy4KKyAgICAvLyBTb21ldGltZXMgaXQncyBzb21ldGhpbmcgd2UgaW5zZXJ0ZWQgaGVyZSwgc29tZXRpbWVzIGl0J3MgYSB2YWx1ZSB0aGF0IHRoZSB1c2VyIGluamVjdGVkLgorICAgIC8vCisgICAgcXBTcHJlYWRQZXJGcmFtZVR5cGUoaW5Gb3JtYXQsIGluZm8tPnFwRGVsdGEsIGluZm8tPnFwTWluLCBpbmZvLT5xcE1heCwgLyogb3ZlcnJpZGUgKi8gdHJ1ZSk7CisKKyAgICAvLworICAgIHJldHVybiAwOworCit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYWZvcm1hdHNoYXBlcgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvVmlkZW9TaGFwZXIuaCBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZpZGVvU2hhcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMWIxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL1ZpZGVvU2hhcGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBMSUJNRURJQUZPUk1BVFNIQVBFUl9WSURFT1NIQVBFUl9IXworI2RlZmluZSBMSUJNRURJQUZPUk1BVFNIQVBFUl9WSURFT1NIQVBFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIgeworCisvKgorICogcnVucyB0aHJvdWdoIHZpZGVvLXNwZWNpZmljIHNoYXBpbmcgb3BlcmF0aW9ucyBmb3IgdGhlIGNvZGVjL2Zvcm1hdCBjb21iaW5hdGlvbi4KKyAqIHVwZGF0ZXMgaW5Gb3JtYXQgaW4gcGxhY2UuCisgKi8KK2ludCB2aWRlb1NoYXBlcihDb2RlY1Byb3BlcnRpZXMgKmNvZGVjLCAgQU1lZGlhRm9ybWF0KiBpbkZvcm1hdCwgaW50IGZsYWdzKTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhZm9ybWF0c2hhcGVyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIExJQk1FRElBRk9STUFUU0hBUEVSX1ZJREVPU0hBUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9leHBvcnRzLmxkcyBiL21lZGlhL2xpYm1lZGlhZm9ybWF0c2hhcGVyL2V4cG9ydHMubGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWNhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9leHBvcnRzLmxkcwpAQCAtMCwwICsxLDYgQEAKK3sKKyAgICBnbG9iYWw6CisgICAgICAgIHNoYXBlcl9vcHM7CisgICAgbG9jYWw6CisgICAgICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvaW5jbHVkZS9tZWRpYS9mb3JtYXRzaGFwZXIvRm9ybWF0U2hhcGVyLmggYi9tZWRpYS9saWJtZWRpYWZvcm1hdHNoYXBlci9pbmNsdWRlL21lZGlhL2Zvcm1hdHNoYXBlci9Gb3JtYXRTaGFwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc0N2NjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFmb3JtYXRzaGFwZXIvaW5jbHVkZS9tZWRpYS9mb3JtYXRzaGFwZXIvRm9ybWF0U2hhcGVyLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgc3lzdGVtLXNpZGUgZm9sa3MKKyAqIHVzZSB0byBpbnZva2Ugb3BlcmF0aW9ucyB3aXRoaW4gdGhlIE1lZGlhRm9ybWF0IHNoYXBpbmcgbGlicmFyeQorICoKKyAqIFRoaXMgaXMgdGhlIGluY2x1ZGUgZmlsZSB0aGUgb3V0c2lkZSB3b3JsZCB1c2VzLgorICovCisKKyNpZm5kZWYgTElCTUVESUFGT1JNQVRTSEFQRVJfRk9STUFUU0hBUEVSX0hfCisjZGVmaW5lIExJQk1FRElBRk9STUFUU0hBUEVSX0ZPUk1BVFNIQVBFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIgeworCisvKgorICogQW4gb3BhcXVlIGhhbmRsZSBjbGllbnRzIHVzZSB0byByZWZlciB0byBjb2RlYyttZWRpYXR5cGUgYmVpbmcgc2hhcGVkLgorICovCit0eXBlZGVmIHZvaWQgKCpzaGFwZXJIYW5kbGVfdCk7CisKKy8qCisgKiBzaGFwZUZvcm1hdCBhcHBsaWVzIGFueSByZS1zaGFwaW5nIG9uIHRoZSBwYXNzZWQgQU1lZGlhRm9ybWF0LgorICogVGhlIHVwZGF0ZWQgZm9ybWF0IGlzIHJldHVybmVkIGluLXBsYWNlLgorICovCit0eXBlZGVmIGludCAoKnNoYXBlRm9ybWF0X3QpKHNoYXBlckhhbmRsZV90IHNoYXBlckhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBpbkZvcm1hdCwgaW50IGZsYWdzKTsKKworLyoKKyAqIGdldE1hcHBpbmcgcmV0dXJucyBhbnkgbWFwcGluZ3MgZnJvbSBzdGFuZGFyZCBrZXlzIHRvIGNvZGVjLXNwZWNpZmljIGtleXMuCisgKiBUaGUgcmV0dXJuIGlzIGEgdmVjdG9yIG9mIGNvbnN0IGNoYXIqIHdoaWNoIGFyZSBzZXQgdXAgaW4gcGFpcnMKKyAqIG9mICJmcm9tIiwgYW5kICJ0byIuCisgKiBUaGlzIGFycmF5IGlzIGFsd2F5cyBmaW5pc2hlZCB3aXRoIGEgcGFpciBvZiBudWxscyAodG8gaW5kaWNhdGUgYSBudWxsIGZyb20KKyAqIGFuZCBhIG51bGwgdG8pCisgKi8KKwordHlwZWRlZiBjb25zdCBjaGFyICoqKCpnZXRNYXBwaW5nc190KShzaGFwZXJIYW5kbGVfdCBzaGFwZXJIYW5kbGUsIGNvbnN0IGNoYXIgKmtpbmQpOworCisvKgorICogUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgc2hhcGVySGFuZGxlIGZvciB0aGUgc3BlY2lmaWVkIGNvZGVjIGFuZCBtZWRpYXR5cGUuCisgKiBJZiBub25lIGV4aXN0cywgaXQgcmV0dXJucyBudWxsLgorICovCit0eXBlZGVmIHNoYXBlckhhbmRsZV90ICgqZmluZFNoYXBlcl90KShjb25zdCBjaGFyICpjb2RlY05hbWUsIGNvbnN0IGNoYXIgKm1lZGlhVHlwZSk7CisKKy8qCisgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGFuIGVtcHR5IHNoYXBlckhhbmRsZSB0aGF0IHRoZSBjbGllbnQgY2FuIHBvcHVsYXRlIHVzaW5nIHRoZQorICogc2V0RmVhdHVyZSgpIGFuZCBzZXRNYXAoKSBvcGVyYXRpb25zLgorICovCit0eXBlZGVmIHNoYXBlckhhbmRsZV90ICgqY3JlYXRlU2hhcGVyX3QpKGNvbnN0IGNoYXIgKmNvZGVjTmFtZSwgY29uc3QgY2hhciAqbWVkaWFUeXBlKTsKKworLyoKKyAqIFJlZ2lzdGVycyB0aGUgaW5kaWNhdGVkIHNoYXBlckhhbmRsZSBmb3IgdGhlIGluZGljYXRlZCBjb2RlYyBhbmQgbWVkaWF0eXBlLgorICogVGhpcyBjYWxsIHJldHVybnMgdGhlIHNoYXBlckhhbmRsZSB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIGZ1cnRoZXIgc2hhcGVyIG9wZXJhdGlvbnMuCisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IGlmIGFub3RoZXIKKyAqIHNoYXBlcmluZm8gd2FzIHJlZ2lzdGVyZWQgd2hpbGUgdGhlIHBhc3NlZCBvbmUgd2FzIGJlaW5nIGNvbmZpZ3VyZWQuCisgKi8KK3R5cGVkZWYgc2hhcGVySGFuZGxlX3QgKCpyZWdpc3RlclNoYXBlcl90KShzaGFwZXJIYW5kbGVfdCBzaGFwZXIsIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVkaWFUeXBlKTsKKworLyoKKyAqIGVzdGFibGlzaGVzIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBzdGFuZGFyZCBrZXkgImZyb20iIGFuZCB0aGUgY29kZWMtc3BlY2lmaWMga2V5ICJ0byIKKyAqIGluIHRoZSAia2luZCIgbmFtZXNwYWNlLiBUaGlzIG1hcHBpbmcgaXMgc3BlY2lmaWMgdG8gdGhlIGluZGljYXRlZCBjb2RlY05hbWUgd2hlbgorICogZW5jb2RpbmcgZm9yIHRoZSBpbmRpY2F0ZWQgbWVkaWFUeXBlLgorICovCit0eXBlZGVmIGludCAoKnNldE1hcF90KShzaGFwZXJIYW5kbGVfdCBzaGFwZXIsIGNvbnN0IGNoYXIgKmtpbmQsIGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvKTsKKworLyoKKyAqIGVzdGFibGlzaGVzIHRoYXQgY29kZWMgImNvZGVjTmFtZSIgZW5jb2RpbmcgZm9yICJtZWRpYVR5cGUiIHN1cHBvcnRzIHRoZSBpbmRpY2F0ZWQKKyAqIGZlYXR1cmUgYXQgdGhlIGluZGljYXRlZCB2YWx1ZQorICovCit0eXBlZGVmIGludCAoKnNldEZlYXR1cmVfdCkoc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICpmZWF0dXJlLCBpbnQgdmFsdWUpOworCisvKgorICogZXN0YWJsaXNoZXMgdGhhdCBjb2RlYyAiY29kZWNOYW1lIiBlbmNvZGluZyBmb3IgIm1lZGlhVHlwZSIgc3VwcG9ydHMgdGhlIGluZGljYXRlZAorICogdHVuaW5nIGF0IHRoZSBpbmRpY2F0ZWQgdmFsdWUKKyAqLwordHlwZWRlZiBpbnQgKCpzZXRUdW5pbmdfdCkoc2hhcGVySGFuZGxlX3Qgc2hhcGVyLCBjb25zdCBjaGFyICpmZWF0dXJlLCBjb25zdCBjaGFyICogdmFsdWUpOworCisvKgorICogVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgdGhlIGNsaWVudCB3aWxsIGltcGxlbWVudCBhIGZsb3cgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHdoZW4KKyAqIHNldHRpbmcgdXAgYW4gZW5jb2RpbmcuCisgKgorICogaWYgKChzaGFwZXI9Zm9ybWF0U2hhcGVyb3BzLT5maW5kU2hhcGVyKGNvZGVjTmFtZSwgbWVkaWFUeXBlKSkgPT0gTlVMTCkgeworICogICAgIGZvciAoYWxsIGNvZGVjIGZlYXR1cmVzKSB7CisgKiAgICAgICAgIGdldCBmZWF0dXJlIG5hbWUsIGZlYXR1cmUgdmFsdWUKKyAqICAgICAgICAgZm9ybWF0U2hhcGVyb3BzLT5zZXRGZWF0dXJlKHNoYXBlciwsIGZlYXR1cmVuYW1lLCBmZWF0dXJldmFsdWUpCisgKiAgICAgfQorICogICAgIGZvciAoYWxsIGNvZGVjIG1hcHBpbmdzKSB7CisgKiAgICAgICAgIGdldCBtYXBwaW5nICdraW5kJywgbWFwcGluZyAnZnJvbScsIG1hcHBpbmcgJ3RvJworICogICAgICAgICBmb3JtYXRTaGFwZXJvcHMtPnNldE1hcChzaGFwZXIsIGtpbmQsIGZyb20sIHRvKQorICogICAgIH0KKyAqIH0KKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRm9ybWF0U2hhcGVyT3BzIHsKKyAgICBjb25zdCB1aW50MzJfdCB2ZXJzaW9uOworCisgICAgLyoKKyAgICAgKiBmaW5kLCBjcmVhdGUsIHNldHVwLCBhbmQgcmVnaXN0ZXIgdGhlIHNoYXBlciBpbmZvCisgICAgICovCisgICAgZmluZFNoYXBlcl90IGZpbmRTaGFwZXI7CisgICAgY3JlYXRlU2hhcGVyX3QgY3JlYXRlU2hhcGVyOworICAgIHNldE1hcF90IHNldE1hcDsKKyAgICBzZXRGZWF0dXJlX3Qgc2V0RmVhdHVyZTsKKyAgICByZWdpc3RlclNoYXBlcl90IHJlZ2lzdGVyU2hhcGVyOworCisgICAgLyoKKyAgICAgKiB1c2UgdGhlIHNoYXBlciBpbmZvCisgICAgICovCisgICAgc2hhcGVGb3JtYXRfdCBzaGFwZUZvcm1hdDsKKyAgICBnZXRNYXBwaW5nc190IGdldE1hcHBpbmdzOworICAgIGdldE1hcHBpbmdzX3QgZ2V0UmV2ZXJzZU1hcHBpbmdzOworCisgICAgc2V0VHVuaW5nX3Qgc2V0VHVuaW5nOworCisgICAgLy8gYWRkaXRpb25zIGhhcHBlbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKK30gRm9ybWF0U2hhcGVyT3BzX3Q7CisKKy8vIHZlcnNpb25pbmYgaW5mb3JtYXRpb24KK2NvbnN0IHVpbnQzMl90IFNIQVBFUl9WRVJTSU9OX1VOS05PV04gPSAwOworY29uc3QgdWludDMyX3QgU0hBUEVSX1ZFUlNJT05fVjEgPSAxOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFmb3JtYXRzaGFwZXIKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTElCTUVESUFGT1JNQVRTSEFQRVJfRk9STUFUU0hBUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icAppbmRleCA2ZmNiYzdiLi45YjU0MTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwyOSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5ibHVldG9vdGgudXBkYXRhYmxlIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCiB9CiAKIGNjX2xpYnJhcnkgewpAQCAtMTIsNyArMzMsMTEgQEAKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUGFyYW1ldGVyLmNwcCIsCisgICAgICAgICJBdWRpb1ZhbGlkYXRvci5jcHAiLAorICAgICAgICAiVHlwZUNvbnZlcnRlci5jcHAiLAorICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XZXh0cmEiLApAQCAtMjcsNCArNTIsMTAgQEAKICAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKICAgICBdLAogICAgIGNsYW5nOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAKaW5kZXggZmM4MzA2Yy4uMzgyYTkyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtNTcsNiArNTcsMTAgQEAKIC8vICAgICAgICBBVURJT19QQVJBTUVURVJfREVWSUNFX1NVUF9FTkNBUFNVTEFUSU9OX01PREVTOwogLy8gY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VTdXBwb3J0ZWRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9CiAvLyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0RFVklDRV9TVVBfRU5DQVBTVUxBVElPTl9NRVRBREFUQV9UWVBFUzsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5ID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0RFVklDRV9BRERJVElPTkFMX09VVFBVVF9ERUxBWTsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5TWF4QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5ID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX0RFVklDRV9NQVhfQURESVRJT05BTF9PVVRQVVRfREVMQVk7CiAKIEF1ZGlvUGFyYW1ldGVyOjpBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQXVkaW9WYWxpZGF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGRiZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1ZhbGlkYXRvci5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9WYWxpZGF0b3IuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogcmV0dXJucyB0cnVlIGlmIHN0cmluZyBpcyBvdmVyZmxvdyAqLwordGVtcGxhdGUgPHNpemVfdCBzaXplPgorYm9vbCBjaGVja1N0cmluZ092ZXJmbG93KGNvbnN0IGNoYXIgKCZzKVtzaXplXSkgeworICAgIHJldHVybiBzdHJubGVuKHMsIHNpemUpID49IHNpemU7Cit9CisKK3N0YXR1c190IHNhZmV0eU5ldExvZyhzdGF0dXNfdCBzdGF0dXMsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiAhYnVnTnVtYmVyLmVtcHR5KCkpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsIGJ1Z051bWJlci5kYXRhKCkpOyAvLyBTYWZldHlOZXQgbG9nZ2luZworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgY29uc3Qgc2l6ZV90IHRhZ3NNYXhTaXplID0gQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFOworICAgIGlmIChzdHJubGVuKGF0dHIudGFncywgdGFnc01heFNpemUpID49IHRhZ3NNYXhTaXplKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChjaGVja1N0cmluZ092ZXJmbG93KGRlc2MubmFtZSkKKyAgICAgICAgfCAvKiBhbHdheXMgKi8gY2hlY2tTdHJpbmdPdmVyZmxvdyhkZXNjLmltcGxlbWVudG9yKSkgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBzYWZldHlOZXRMb2coc3RhdHVzLCBidWdOdW1iZXIpOworfQorCitzdGF0dXNfdCBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnRDb25maWcoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgY29uZmlnLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoY29uZmlnLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICBjaGVja1N0cmluZ092ZXJmbG93KGNvbmZpZy5leHQuZGV2aWNlLmFkZHJlc3MpKSB7CisgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7Cit9CisKK25hbWVzcGFjZSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBzdHJ1Y3QgYXVkaW9fcG9ydD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnRfdjc+Ojp2YWx1ZSwgaW50PiA9IDA+CitzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVBdWRpb1BvcnRJbnRlcm5hbChjb25zdCBUJiBwb3J0LCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlciA9IHt9KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKGNoZWNrU3RyaW5nT3ZlcmZsb3cocG9ydC5uYW1lKSkgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnRDb25maWcocG9ydC5hY3RpdmVfY29uZmlnKSAhPSBOT19FUlJPUikgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwb3J0LnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICBjaGVja1N0cmluZ092ZXJmbG93KHBvcnQuZXh0LmRldmljZS5hZGRyZXNzKSkgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBzYWZldHlOZXRMb2coc3RhdHVzLCBidWdOdW1iZXIpOworfQorCit9IC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnQoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0JiBwb3J0LCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKK3sKKyAgICByZXR1cm4gdmFsaWRhdGVBdWRpb1BvcnRJbnRlcm5hbChwb3J0LCBidWdOdW1iZXIpOworfQorCitzdGF0dXNfdCBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnQoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X3Y3JiBwb3J0LCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlcikKK3sKKyAgICByZXR1cm4gdmFsaWRhdGVBdWRpb1BvcnRJbnRlcm5hbChwb3J0LCBidWdOdW1iZXIpOworfQorCisvKiogcmV0dXJucyBCQURfVkFMVUUgaWYgc2FuaXRpemF0aW9uIHdhcyByZXF1aXJlZC4gKi8KK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUGF0Y2goCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCYgcGF0Y2gsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChwYXRjaC5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChwYXRjaC5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKHZhbGlkYXRlQXVkaW9Qb3J0Q29uZmlnKHBhdGNoLnNvdXJjZXNbaV0pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC5udW1fc2lua3M7IGkrKykgeworICAgICAgICBpZiAodmFsaWRhdGVBdWRpb1BvcnRDb25maWcocGF0Y2guc2lua3NbaV0pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNhZmV0eU5ldExvZyhzdGF0dXMsIGJ1Z051bWJlcik7Cit9CisKKy8qIHN0YXRpYyAqLworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpCit7CisgICAgY29uc3RleHByIGZsb2F0IE1BWF9BVURJT19ERVNDUklQVElPTl9NSVhfTEVWRUwgPSA0OC5mOworICAgIHJldHVybiBzdGQ6OmlzbmFuKGxldmVsZEIpIHx8IGxldmVsZEIgPiBNQVhfQVVESU9fREVTQ1JJUFRJT05fTUlYX0xFVkVMID8gQkFEX1ZBTFVFIDogT0s7Cit9CisKKy8qIHN0YXRpYyAqLworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlRHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgZHVhbE1vbm9Nb2RlKQoreworICAgIHN3aXRjaCAoZHVhbE1vbm9Nb2RlKSB7CisgICAgICAgIGNhc2UgQVVESU9fRFVBTF9NT05PX01PREVfT0ZGOgorICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX0xSOgorICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX0xMOgorICAgICAgICBjYXNlIEFVRElPX0RVQUxfTU9OT19NT0RFX1JSOgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qIHN0YXRpYyAqLworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlUGxheWJhY2tSYXRlRmFsbGJhY2tNb2RlKAorICAgICAgICBhdWRpb190aW1lc3RyZXRjaF9mYWxsYmFja19tb2RlX3QgZmFsbGJhY2tNb2RlKQoreworICAgIHN3aXRjaCAoZmFsbGJhY2tNb2RlKSB7CisgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfQ1VUX1JFUEVBVDoKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgY29hcnNlIHNvdW5kaW5nIHRpbWVzdHJldGNoaW5nIHVzZWQgZm9yIGludGVybmFsIGRlYnVnZ2luZywKKyAgICAgICAgICAgIC8vIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuCisgICAgICAgICAgICBicmVhazsgLy8gd2FybmluZyBpZiBub3QgbGlzdGVkLgorICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX0ZBTExCQUNLX0RFRkFVTFQ6CisgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfTVVURToKKyAgICAgICAgY2FzZSBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19GQUlMOgorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKiBzdGF0aWMgKi8KK3N0YXR1c190IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZVBsYXliYWNrUmF0ZVN0cmV0Y2hNb2RlKAorICAgICAgICBhdWRpb190aW1lc3RyZXRjaF9zdHJldGNoX21vZGVfdCBzdHJldGNoTW9kZSkKK3sKKyAgICBzd2l0Y2ggKHN0cmV0Y2hNb2RlKSB7CisgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfU1RSRVRDSF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX1RJTUVTVFJFVENIX1NUUkVUQ0hfVk9JQ0U6CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qIHN0YXRpYyAqLworc3RhdHVzX3QgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlUGxheWJhY2tSYXRlKAorICAgICAgICBjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkKK3sKKyAgICBpZiAocGxheWJhY2tSYXRlLm1TcGVlZCA8IDAuZiB8fCBwbGF5YmFja1JhdGUubVBpdGNoIDwgMC5mKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIHJldHVybiB2YWxpZGF0ZVBsYXliYWNrUmF0ZUZhbGxiYWNrTW9kZShwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSkgPzoKKyAgICAgICAgICAgIHZhbGlkYXRlUGxheWJhY2tSYXRlU3RyZXRjaE1vZGUocGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1OTRiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJsaWJtZWRpYV9oZWxwZXJfdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCmluZGV4IDYzODJjZTQuLmQzYTUxN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC0xOCwzMDcgKzE4LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0jZGVmaW5lIE1BS0VfU1RSSU5HX0ZST01fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KKyNkZWZpbmUgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKGVudW12YWwpIHsgI2VudW12YWwsIGVudW12YWwgfQogI2RlZmluZSBURVJNSU5BVE9SIHsgLmxpdGVyYWwgPSBudWxscHRyIH0KIAotdGVtcGxhdGUgPD4KLWNvbnN0IE91dHB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX05PTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9JUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQlVTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9QUk9YWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQ0hPX0NBTkNFTExFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCksCi0gICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NUVUIpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUlfQVJDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9TUERJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9JUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fUFJPWFkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSwKLSAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9TVFVCKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBPdXRwdXRGbGFnQ29udmVydGVyOjpUYWJsZSBPdXRwdXRGbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19GQVNUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX1RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX1JBVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX1NZTkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1RfUENNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IElucHV0RmxhZ0NvbnZlcnRlcjo6VGFibGUgSW5wdXRGbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19OT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19GQVNUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19SQVcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1NZTkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0RJUkVDVCksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgRm9ybWF0Q29udmVydGVyOjpUYWJsZSBGb3JtYXRDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzMyX0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01QMyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfTkIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQU1SX1dCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTUFJTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1NTUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTFRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU0NBTEFCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0VSTEMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19IRV9WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRUxEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19YSEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTUFJTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19TU1IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTFRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1NDQUxBQkxFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0VSTEMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfRUxEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1hIRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9WT1JCSVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9PUFVTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FDMyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FX0FDMyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9EVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRFRTX0hEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0lFQzYxOTM3KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FVlJDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkNCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkNXQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FVlJDTlcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FESUYpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfV01BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1dNQV9QUk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQU1SX1dCX1BMVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTVAyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1FDRUxQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RTRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9GTEFDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FMQUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1NCQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFhfSEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUM0KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xEQUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzX0pPQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMV8wKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9MQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEFUTV9IRV9WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9DRUxUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFhfQURBUFRJVkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTEhEQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MSERDX0xMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFhfVFdTUCksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9UUkkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9UUklfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0spLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1BFTlRBKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQ0KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNlBPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UNCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OT19IQVBUSUNfQSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0FCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPX0hBUFRJQ19BQiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgSW5wdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fNiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMFBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9DQUxMX01PTk8pLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jb25zdCBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OlRhYmxlIENoYW5uZWxJbmRleENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMSl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzIpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zIiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18zKX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNCl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzUpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS182KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNyIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNyl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzgiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzgpfSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBHYWluTW9kZUNvbnZlcnRlcjo6VGFibGUgR2Fpbk1vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19HQUlOX01PREVfSk9JTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19HQUlOX01PREVfUkFNUCksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9ERUZBVUxUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fU1lTVEVNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQUxBUk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fRFRNRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9UVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9BU1NJU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUkVST1VUSU5HKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1BBVENIKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0NBTExfQVNTSVNUQU5UKSwKLSAgICBURVJNSU5BVE9SCi19OwotCiB0ZW1wbGF0ZTw+CiBjb25zdCBBdWRpb01vZGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvTW9kZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfSU5WQUxJRCksCkBAIC0zMzEsNjIgKzMzLDYgQEAKICAgICBURVJNSU5BVE9SCiB9OwogCi10ZW1wbGF0ZTw+Ci1jb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU1BFRUNIKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01PVklFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVU5LTk9XTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX01FRElBKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FMQVJNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfR0FNRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9FTUVSR0VOQ1kpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9TQUZFVFkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9WRUhJQ0xFX1NUQVRVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FOTk9VTkNFTUVOVCksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IFNvdXJjZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFNvdXJjZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfREVGQVVMVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9NSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfQ0FNQ09SREVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9GTV9UVU5FUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9IT1RXT1JEKSwKLSAgICBURVJNSU5BVE9SCi19OwotCiB0ZW1wbGF0ZSA8PgogY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX05PTkUpLApAQCAtNDA5LDYgKzU1LDcgQEAKIAogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dEZsYWdUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxGb3JtYXRUcmFpdHM+OwpAQCAtNDIyLDExICs2OSw2IEBACiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvRmxhZ1RyYWl0cz47CiAKLWJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpIHsKLSAgICByZXR1cm4gSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKSB8fAotICAgICAgICAgICAgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxEZXZpY2UsIGRldmljZSk7Ci19Ci0KIFNhbXBsZVJhdGVUcmFpdHM6OkNvbGxlY3Rpb24gc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzYW1wbGluZ1JhdGVzLCBjb25zdCBjaGFyICpkZWwpCiB7CkBAIC00NDYsMjEgKzg4LDIwIEBACiBhdWRpb19mb3JtYXRfdCBmb3JtYXRGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBkZWZhdWx0Rm9ybWF0KQogewogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICBpZiAobGl0ZXJhbEZvcm1hdC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0OworICAgIGlmICghbGl0ZXJhbEZvcm1hdC5lbXB0eSgpICYmIEZvcm1hdENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRm9ybWF0LCBmb3JtYXQpKSB7CisgICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgfQotICAgIEZvcm1hdENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRm9ybWF0LCBmb3JtYXQpOwotICAgIHJldHVybiBmb3JtYXQ7CisgICAgcmV0dXJuIGRlZmF1bHRGb3JtYXQ7CiB9CiAKIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbENoYW5uZWxzKQogewogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzOwotICAgIGlmICghT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsQ2hhbm5lbHMsIGNoYW5uZWxzKSAmJgotICAgICAgICAgICAgIUlucHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsQ2hhbm5lbHMsIGNoYW5uZWxzKSkgewotICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgIGlmICghbGl0ZXJhbENoYW5uZWxzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyhsaXRlcmFsQ2hhbm5lbHMuY19zdHIoKSwgJmNoYW5uZWxzKSkgeworICAgICAgICByZXR1cm4gY2hhbm5lbHM7CiAgICAgfQotICAgIHJldHVybiBjaGFubmVsczsKKyAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9JTlZBTElEOwogfQogCiBDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmggYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKaW5kZXggNjZkOGRmYi4uOWE2Y2E4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApAQCAtMTA0LDYgKzEwNCw5IEBACiAgICAgLy8gc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlEZXZpY2VTdXBwb3J0ZWRFbmNhcHN1bGF0aW9uTW9kZXM7CiAgICAgLy8gc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlEZXZpY2VTdXBwb3J0ZWRFbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlczsKIAorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5TWF4QWRkaXRpb25hbE91dHB1dERldmljZURlbGF5OworCiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHRvU3RyaW5nSW1wbCh0cnVlKTsgfQogICAgIFN0cmluZzgga2V5c1RvU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gdG9TdHJpbmdJbXBsKGZhbHNlKTsgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvVmFsaWRhdG9yLmggYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvVmFsaWRhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjMmZhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvQXVkaW9WYWxpZGF0b3IuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19WQUxJREFUT1JfSF8KKyNkZWZpbmUgQU5EUk9JRF9BVURJT19WQUxJREFUT1JfSF8KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZ192aWV3PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQXVkaW9WYWxpZGF0b3IgaXMgYSBjbGFzcyB0byB2YWxpZGF0ZSBhdWRpbyBkYXRhIGluIGJpbmRlciBjYWxsLiBOT19FUlJPUiB3aWxsIGJlIHJldHVybmVkIG9ubHkKKyAqIHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZGF0YS4KKyAqLworY2xhc3MgQXVkaW9WYWxpZGF0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybiBCQURfVkFMVUUuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlciA9IHt9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZWZmZWN0IGRlc2NyaXB0b3IuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm4gQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlciA9IHt9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gYXVkaW8gcG9ydCBjb25maWcuCisgICAgICogT3RoZXJ3aXNlLCByZXR1cm4gQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyYgY29uZmlnLCBzdGQ6OnN0cmluZ192aWV3IGJ1Z051bWJlciA9IHt9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBvbmx5IHdoZW4gdGhlcmUgaXMgbm8gZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gYXVkaW8gcG9ydC4KKyAgICAgKiBPdGhlcndpc2UsIHJldHVybiBCQURfVkFMVUUuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHZhbGlkYXRlQXVkaW9Qb3J0KAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnQmIHBvcnQsIHN0ZDo6c3RyaW5nX3ZpZXcgYnVnTnVtYmVyID0ge30pOworCisgICAgLyoqCisgICAgICogUmV0dXJuIE5PX0VSUk9SIG9ubHkgd2hlbiB0aGVyZSBpcyBubyBlcnJvciB3aXRoIHRoZSBnaXZlbiBhdWRpb19wb3J0X3Y3LgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVBdWRpb1BvcnQoCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF92NyYgcG9ydCwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1Igb25seSB3aGVuIHRoZXJlIGlzIG5vIGVycm9yIHdpdGggdGhlIGdpdmVuIGF1ZGlvIHBhdGNoLgorICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoJiBwYXRjaCwgc3RkOjpzdHJpbmdfdmlldyBidWdOdW1iZXIgPSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gTk9fRVJST1IgaWYgbGV2ZWxkQiBpcyBhY2NlcHRhYmxlLCBvdGhlcndpc2UgQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCBsZXZlbGRCKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBpZiBkdWFsTW9ub01vZGUgaXMgb25lIG9mIHRoZSBlbnVtIHZhbHVlcywgb3RoZXJ3aXNlIEJBRF9WQUxVRS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgdmFsaWRhdGVEdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBkdWFsTW9ub01vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIE5PX0VSUk9SIGlmIGZhbGxiYWNrTW9kZSBpcyBvbmUgb2YgdGhlIGVudW0gdmFsdWVzLCBvdGhlcndpc2UgQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZVBsYXliYWNrUmF0ZUZhbGxiYWNrTW9kZSgKKyAgICAgICAgICAgIGF1ZGlvX3RpbWVzdHJldGNoX2ZhbGxiYWNrX21vZGVfdCBmYWxsYmFja01vZGUpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIE5PX0VSUk9SIGlmIGZhbGxiYWNrTW9kZSBpcyBvbmUgb2YgdGhlIGVudW0gdmFsdWVzLCBvdGhlcndpc2UgQkFEX1ZBTFVFLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCB2YWxpZGF0ZVBsYXliYWNrUmF0ZVN0cmV0Y2hNb2RlKGF1ZGlvX3RpbWVzdHJldGNoX3N0cmV0Y2hfbW9kZV90IHN0cmV0Y2hNb2RlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBOT19FUlJPUiBpZiBwbGF5YmFja1JhdGUgaXMgYWNjZXB0YWJsZSAtIHRoZSBlbnVtcyBhcmUgY29ycmVjdCBhbmQgdGhlCisgICAgICogcmF0ZSBhbmQgc3BlZWQgbm9uLW5lZ2F0aXZlLCBvdGhlcndpc2UgQkFEX1ZBTFVFLgorICAgICAqCisgICAgICogVGhpcyBpcyBhIGJhc2ljIGJvdW5kcyBjaGVjayAtIHRoZSBzeXN0ZW0gbWlnaHQgaGF2ZSBzdHJpY3RlciByZXF1aXJlbWVudHMgZm9yCisgICAgICogcGxheWJhY2tSYXRlIG9uIGEgcGFydGljdWxhciBzdHJlYW0gLyBkZXZpY2UuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHZhbGlkYXRlUGxheWJhY2tSYXRlKGNvbnN0IGF1ZGlvX3BsYXliYWNrX3JhdGVfdCYgcGxheWJhY2tSYXRlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLypBTkRST0lEX0FVRElPX1ZBTElEQVRPUl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDAxMTQ5OGEuLjQyY2NiNWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC0yNCw4ICsyNCw2IEBACiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSAiY29udmVydC5oIgpAQCAtNDMsMTYgKzQxLDYgQEAKICAgICB9CiB9OwogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBUIFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLSAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLSAgICB9Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgU2V0VHJhaXRzCiB7CiAgICAgdHlwZWRlZiBUIFR5cGU7CkBAIC0xMDgsMTMgKzk2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwogCi0gICAgc3RhdGljIHVpbnQzMl90IG1hc2tGcm9tU3RyaW5nKAorICAgIHN0YXRpYyB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgbWFza0Zyb21TdHJpbmcoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIAogICAgIHN0YXRpYyB2b2lkIG1hc2tUb1N0cmluZygKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOworICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsCisgICAgICAgICAgICBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIAogcHJvdGVjdGVkOgorICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIHVzZSBtVGFibGUgZm9yIHRvL2Zyb20gc3RyaW5nIGNvbnZlcnNpb25zCisgICAgLy8gb2YgZWFjaCBpbmRpdmlkdWFsIGVudW0gdmFsdWUuCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIG1heSBiZSBzcGVjaWFsaXplZCB0byB1c2UgZXh0ZXJuYWwgY29udmVydGVycyBpbnN0ZWFkLgorICAgIHN0YXRpYyBib29sIHRvU3RyaW5nSW1wbChjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKTsKKyAgICBzdGF0aWMgYm9vbCBmcm9tU3RyaW5nSW1wbChjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnJlc3VsdCk7CisKICAgICBzdHJ1Y3QgVGFibGUgewogICAgICAgICBjb25zdCBjaGFyICpsaXRlcmFsOwogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CkBAIC0xMjQsMjYgKzExOSwyMiBAQAogfTsKIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6dG9TdHJpbmcoY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKLXsKK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IG1UYWJsZVtpXS5saXRlcmFsOyBpKyspIHsKICAgICAgICAgaWYgKG1UYWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgewogICAgICAgICAgICAgc3RyID0gbVRhYmxlW2ldLmxpdGVyYWw7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBjaGFyIHJlc3VsdFs2NF07Ci0gICAgc25wcmludGYocmVzdWx0LCBzaXplb2YocmVzdWx0KSwgIlVua25vd24gZW51bSB2YWx1ZSAlZCIsIHZhbHVlKTsKLSAgICBzdHIgPSByZXN1bHQ7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotaW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojpmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmcmVzdWx0KQoteworaW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgewogICAgICAgICBpZiAoc3RyY21wKG1UYWJsZVtpXS5saXRlcmFsLCBzdHIuY19zdHIoKSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgbVRhYmxlW2ldLmxpdGVyYWwpOwogICAgICAgICAgICAgcmVzdWx0ID0gbVRhYmxlW2ldLnZhbHVlOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTE1Miw2ICsxNDMsMjYgQEAKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6dG9TdHJpbmcoY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKK3sKKyAgICBjb25zdCBib29sIHN1Y2Nlc3MgPSB0b1N0cmluZ0ltcGwodmFsdWUsIHN0cik7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGNoYXIgcmVzdWx0WzY0XTsKKyAgICAgICAgc25wcmludGYocmVzdWx0LCBzaXplb2YocmVzdWx0KSwgIlVua25vd24gZW51bSB2YWx1ZSAlZCIsIHZhbHVlKTsKKyAgICAgICAgc3RyID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gc3VjY2VzczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6ZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnJlc3VsdCkKK3sKKyAgICBjb25zdCBib29sIHN1Y2Nlc3MgPSBmcm9tU3RyaW5nSW1wbChzdHIsIHJlc3VsdCk7CisgICAgQUxPR1ZfSUYoc3VjY2VzcywgInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgc3RyLmNfc3RyKCkpOworICAgIHJldHVybiBzdWNjZXNzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgogaW5saW5lIHZvaWQgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojpjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLAogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCiAgICAgICAgIGNvbnN0IGNoYXIgKmRlbCkKQEAgLTE2OCw3ICsxNzksOCBAQAogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotaW5saW5lIHVpbnQzMl90IFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsKQoraW5saW5lIHR5cGVuYW1lIFRyYWl0czo6VHlwZSBUeXBlQ29udmVydGVyPFRyYWl0cz46Om1hc2tGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCiB7CiAgICAgY2hhciAqbGl0ZXJhbCA9IHN0cmR1cChzdHIuY19zdHIoKSk7CiAgICAgdWludDMyX3QgdmFsdWUgPSAwOwpAQCAtMTc5LDIwICsxOTEsMjQgQEAKICAgICAgICAgfQogICAgIH0KICAgICBmcmVlKGxpdGVyYWwpOwotICAgIHJldHVybiB2YWx1ZTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgVHJhaXRzOjpUeXBlPih2YWx1ZSk7CiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgdm9pZCBUeXBlQ29udmVydGVyPFRyYWl0cz46Om1hc2tUb1N0cmluZyh1aW50MzJfdCBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCitpbmxpbmUgdm9pZCBUeXBlQ29udmVydGVyPFRyYWl0cz46Om1hc2tUb1N0cmluZygKKyAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCkKIHsKICAgICBpZiAobWFzayAhPSAwKSB7CiAgICAgICAgIGJvb2wgZmlyc3RfZmxhZyA9IHRydWU7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBtVGFibGVbaV0ubGl0ZXJhbDsgaSsrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihtVGFibGVbaV0udmFsdWUpOwotICAgICAgICAgICAgaWYgKG1UYWJsZVtpXS52YWx1ZSAhPSAwICYmICgobWFzayAmIHZhbHVlKSA9PSB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X2ZsYWcpIHN0ciArPSBkZWw7Ci0gICAgICAgICAgICAgICAgZmlyc3RfZmxhZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN0ciArPSBtVGFibGVbaV0ubGl0ZXJhbDsKKyAgICAgICAgZm9yIChzaXplX3QgYml0ID0gMDsgYml0IDwgc2l6ZW9mKHVpbnQzMl90KSAqIDg7ICsrYml0KSB7CisgICAgICAgICAgICB1aW50MzJfdCBmbGFnID0gMXUgPDwgYml0OworICAgICAgICAgICAgaWYgKChmbGFnICYgbWFzaykgPT0gZmxhZykgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdfc3RyOworICAgICAgICAgICAgICAgIGlmICh0b1N0cmluZyhzdGF0aWNfY2FzdDx0eXBlbmFtZSBUcmFpdHM6OlR5cGU+KGZsYWcpLCBmbGFnX3N0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9mbGFnKSBzdHIgKz0gZGVsOworICAgICAgICAgICAgICAgICAgICBmaXJzdF9mbGFnID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN0ciArPSBmbGFnX3N0cjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMjAwLDYgKzIxNiw3IEBACiAgICAgfQogfQogCit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8RGV2aWNlVHJhaXRzPiBEZXZpY2VDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPiBPdXRwdXREZXZpY2VDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+IElucHV0RGV2aWNlQ29udmVydGVyOwogdHlwZWRlZiBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+IE91dHB1dEZsYWdDb252ZXJ0ZXI7CkBAIC0yMTYsMjMgKzIzMywyMjcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPiBBdWRpb0ZsYWdDb252ZXJ0ZXI7CiAKLXRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBPdXRwdXRGbGFnQ29udmVydGVyOjpUYWJsZSBPdXRwdXRGbGFnQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgSW5wdXRGbGFnQ29udmVydGVyOjpUYWJsZSBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBGb3JtYXRDb252ZXJ0ZXI6OlRhYmxlIEZvcm1hdENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IENoYW5uZWxJbmRleENvbnZlcnRlcjo6VGFibGUgQ2hhbm5lbEluZGV4Q29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgR2Fpbk1vZGVDb252ZXJ0ZXI6OlRhYmxlIEdhaW5Nb2RlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvTW9kZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Nb2RlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXTsKIAotYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSk7Cit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxEZXZpY2VUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IERldmljZVRyYWl0czo6VHlwZSAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19kZXZpY2VfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxEZXZpY2VUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgRGV2aWNlVHJhaXRzOjpUeXBlICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fZGV2aWNlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBPdXRwdXREZXZpY2VUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodmFsdWUpKSB7CisgICAgICAgIHN0ciA9IGF1ZGlvX2RldmljZV90b19zdHJpbmcodmFsdWUpOworICAgICAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBPdXRwdXREZXZpY2VUcmFpdHM6OlR5cGUgJnJlc3VsdCkgeworICAgIE91dHB1dERldmljZVRyYWl0czo6VHlwZSB0ZW1wOworICAgIGlmIChhdWRpb19kZXZpY2VfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZ0ZW1wKSAmJgorICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0ZW1wKSkgeworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgSW5wdXREZXZpY2VUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh2YWx1ZSkpIHsKKyAgICAgICAgc3RyID0gYXVkaW9fZGV2aWNlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICAgIHJldHVybiAhc3RyLmVtcHR5KCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgSW5wdXREZXZpY2VUcmFpdHM6OlR5cGUgJnJlc3VsdCkgeworICAgIElucHV0RGV2aWNlVHJhaXRzOjpUeXBlIHRlbXA7CisgICAgaWYgKGF1ZGlvX2RldmljZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnRlbXApICYmCisgICAgICAgICAgICBhdWRpb19pc19pbnB1dF9kZXZpY2UodGVtcCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXRGbGFnVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2lucHV0X2ZsYWdfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxJbnB1dEZsYWdUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9faW5wdXRfZmxhZ3NfdCAmcmVzdWx0KSB7CisgICAgcmV0dXJuIGF1ZGlvX2lucHV0X2ZsYWdfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19vdXRwdXRfZmxhZ190b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19vdXRwdXRfZmxhZ19mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fZm9ybWF0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8Rm9ybWF0VHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2Zvcm1hdF90ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fZm9ybWF0X2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8T3V0cHV0Q2hhbm5lbFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza190b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPE91dHB1dENoYW5uZWxUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnJlc3VsdCkgeworICAgIE91dHB1dENoYW5uZWxUcmFpdHM6OlR5cGUgdGVtcDsKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmdGVtcCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9jaGFubmVsKHRlbXApKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPElucHV0Q2hhbm5lbFRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKSB7CisgICAgc3RyID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8SW5wdXRDaGFubmVsVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZyZXN1bHQpIHsKKyAgICBJbnB1dENoYW5uZWxUcmFpdHM6OlR5cGUgdGVtcDsKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmdGVtcCkgJiYKKyAgICAgICAgICAgIGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwodGVtcCkpIHsKKyAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8Q2hhbm5lbEluZGV4VHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19jaGFubmVsX2luZGV4X21hc2tfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxDaGFubmVsSW5kZXhUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnJlc3VsdCkgeworICAgIENoYW5uZWxJbmRleFRyYWl0czo6VHlwZSB0ZW1wOworICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZ0ZW1wKSAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbih0ZW1wKSA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFN0cmVhbVRyYWl0cz46OnRvU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19zdHJlYW1fdHlwZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFN0cmVhbVRyYWl0cz46OmZyb21TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBhdWRpb19zdHJlYW1fdHlwZV90ICZyZXN1bHQpCit7CisgICAgcmV0dXJuIGF1ZGlvX3N0cmVhbV90eXBlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8R2Fpbk1vZGVUcmFpdHM+Ojp0b1N0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IGF1ZGlvX2dhaW5fbW9kZV90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIHN0ciA9IGF1ZGlvX2dhaW5fbW9kZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPEdhaW5Nb2RlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX2dhaW5fbW9kZV90ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fZ2Fpbl9tb2RlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8QXVkaW9Db250ZW50VHJhaXRzPjo6dG9TdHJpbmdJbXBsKAorICAgICAgICBjb25zdCBhdWRpb19jb250ZW50X3R5cGVfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdHIgPSBhdWRpb19jb250ZW50X3R5cGVfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICByZXR1cm4gIXN0ci5lbXB0eSgpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+Ojpmcm9tU3RyaW5nSW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgYXVkaW9fY29udGVudF90eXBlX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb19jb250ZW50X3R5cGVfZnJvbV9zdHJpbmcoc3RyLmNfc3RyKCksICZyZXN1bHQpOworfQorCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz46OnRvU3RyaW5nSW1wbChjb25zdCBhdWRpb191c2FnZV90ICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKK3sKKyAgICBzdHIgPSBhdWRpb191c2FnZV90b19zdHJpbmcodmFsdWUpOworICAgIHJldHVybiAhc3RyLmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX3VzYWdlX3QgJnJlc3VsdCkgeworICAgIHJldHVybiBhdWRpb191c2FnZV9mcm9tX3N0cmluZyhzdHIuY19zdHIoKSwgJnJlc3VsdCk7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz46OnRvU3RyaW5nSW1wbChjb25zdCBhdWRpb19zb3VyY2VfdCAmdmFsdWUsIHN0ZDo6c3RyaW5nICZzdHIpCit7CisgICAgc3RyID0gYXVkaW9fc291cmNlX3RvX3N0cmluZyh2YWx1ZSk7CisgICAgcmV0dXJuICFzdHIuZW1wdHkoKTsKK30KKwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjo6ZnJvbVN0cmluZ0ltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGF1ZGlvX3NvdXJjZV90ICZyZXN1bHQpIHsKKyAgICByZXR1cm4gYXVkaW9fc291cmNlX2Zyb21fc3RyaW5nKHN0ci5jX3N0cigpLCAmcmVzdWx0KTsKK30KIAogU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwpAQCAtMjU2LDYgKzQ3Nyw3IEBACiAKIC8vIGNvdW50aW5nIGVudW1lcmF0aW9ucwogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIGF1ZGlvX2NvbnRlbnRfdHlwZV90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ZDo6aXNfc2FtZTxULCBhdWRpb19kZXZpY2VzX3Q+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX21vZGVfdD46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc291cmNlX3Q+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojp2YWx1ZQpAQCAtMjgyLDE3ICs1MDQsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fZGV2aWNlc190JiBkZXZpY2VzKQotewotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgICBpZiAoKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB7Ci0gICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykKIHsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmMjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlibWVkaWFfaGVscGVyX3Rlc3RzIiwKKworICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAiXSwKKyAgICBnZW5lcmF0ZWRfc291cmNlczogWyJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9WN18wIl0sCisgICAgaGVhZGVyX2xpYnM6IFsibGlieHNkYy11dGlscyJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKworICAgIHNyY3M6IFsidHlwZWNvbnZlcnRlcl90ZXN0cy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvdGVzdHMvdHlwZWNvbnZlcnRlcl90ZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci90ZXN0cy90eXBlY29udmVydGVyX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFkNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvdGVzdHMvdHlwZWNvbnZlcnRlcl90ZXN0cy5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBMT0dfVEFHICJUeXBlQ29udmVydGVyX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9WN18wLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHhzZGMvWHNkY1N1cHBvcnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CituYW1lc3BhY2UgeHNkIHsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphdWRpbzo6cG9saWN5Ojpjb25maWd1cmF0aW9uOjpWN18wOworfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlQ2hhbm5lbE1hc2tzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NoYW5uZWxNYXNrPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrRnJvbVN0cmluZyhzdHJpbmdWYWwpOworICAgICAgICBFWFBFQ1RfRVEoZW51bVZhbCAhPSB4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s6OkFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfaXNfdmFsaWQoY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgIDw8ICJWYWxpZGl0eSBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBpcyBub3QgYXMgZXhwZWN0ZWQiOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZUlucHV0T3V0cHV0SW5kZXhDaGFubmVsTWFzaykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9DaGFubmVsTWFzaz57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGNoYW5uZWxNYXNrQmFjazsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsQmFjazsKKyAgICAgICAgaWYgKHN0cmluZ1ZhbC5maW5kKCJfQ0hBTk5FTF9JTl8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIGlucHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRDaGFubmVsQ29udmVydGVyOjp0b1N0cmluZyhjaGFubmVsTWFzaywgc3RyaW5nVmFsQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIGlucHV0IGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIC8vIER1ZSB0byBhbGlhc2VkIHZhbHVlcywgdGhlIHJlc3VsdCBvZiAndG9TdHJpbmcnIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgLy8gYXMgJ3N0cmluZ1ZhbCcsIHRodXMgd2UgbmVlZCB0byBjb21wYXJlIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgaW5zdGVhZC4KKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKElucHV0Q2hhbm5lbENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWxCYWNrLCBjaGFubmVsTWFza0JhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsQmFjayA8PCAiXCIgZmFpbGVkIChhcyBpbnB1dCBjaGFubmVsIG1hc2spIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShjaGFubmVsTWFzaywgY2hhbm5lbE1hc2tCYWNrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWwuZmluZCgiX0NIQU5ORUxfT1VUXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIG91dHB1dCBjaGFubmVsIG1hc2spIjsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2Ygb3V0cHV0IGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgY2hhbm5lbE1hc2tCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbEJhY2sgPDwgIlwiIGZhaWxlZCAoYXMgb3V0cHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX0VRKGNoYW5uZWxNYXNrLCBjaGFubmVsTWFza0JhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbC5maW5kKCJfQ0hBTk5FTF9JTkRFWF8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoQ2hhbm5lbEluZGV4Q29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIGluZGV4ZWQgY2hhbm5lbCBtYXNrKSI7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgaW5kZXhlZCBjaGFubmVsIG1hc2sgIiA8PCBjaGFubmVsTWFzayA8PCAiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCBzdHJpbmdWYWxCYWNrKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWwgPT0gdG9TdHJpbmcoeHNkOjpBdWRpb0NoYW5uZWxNYXNrOjpBVURJT19DSEFOTkVMX05PTkUpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgY2hhbm5lbE1hc2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBzdWNjZWVkZWQgKGFzIGlucHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBjaGFubmVsTWFzaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIHN1Y2NlZWRlZCAoYXMgb3V0cHV0IGNoYW5uZWwgbWFzaykiOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKENoYW5uZWxJbmRleENvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGNoYW5uZWxNYXNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBpbmRleCBjaGFubmVsIG1hc2spIjsKKyAgICAgICAgICAgIC8vIE5vbmUgb2YgQ29udmVydGVycyBjb3VsZCBwYXJzZSB0aGlzIGJlY2F1c2UgJ05PTkUnIGlzbid0IGEgJ3ZhbGlkJyBjaGFubmVsIG1hc2suCisgICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgdGhleSBhbGwgbXVzdCBzdWNjZWVkIGluIGNvbnZlcnRpbmcgaXQgYmFjay4KKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKElucHV0Q2hhbm5lbENvbnZlcnRlcjo6dG9TdHJpbmcoY2hhbm5lbE1hc2ssIHN0cmluZ1ZhbEJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBpbnB1dCBjaGFubmVsIG1hc2sgIiA8PCBjaGFubmVsTWFzayA8PCAiIGZhaWxlZCI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCBzdHJpbmdWYWxCYWNrKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OnRvU3RyaW5nKGNoYW5uZWxNYXNrLCBzdHJpbmdWYWxCYWNrKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2Ygb3V0cHV0IGNoYW5uZWwgbWFzayAiIDw8IGNoYW5uZWxNYXNrIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHN0cmluZ1ZhbEJhY2spOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoQ2hhbm5lbEluZGV4Q29udmVydGVyOjp0b1N0cmluZyhjaGFubmVsTWFzaywgc3RyaW5nVmFsQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIGluZGV4ZWQgY2hhbm5lbCBtYXNrICIgPDwgY2hhbm5lbE1hc2sgPDwgIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgc3RyaW5nVmFsQmFjayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGQUlMKCkgPDwgIlVucmVjb2duaXplZCBjaGFubmVsIG1hc2sgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIiOworICAgICAgICB9CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlQ29udGVudFR5cGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NvbnRlbnRUeXBlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZTsKKyAgICAgICAgRVhQRUNUX1RSVUUoQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGNvbnRlbnRUeXBlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhjb250ZW50VHlwZSkpOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZURldmljZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvRGV2aWNlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBkZXZpY2VCYWNrOworICAgICAgICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxCYWNrOworICAgICAgICBFWFBFQ1RfVFJVRShEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIGlmIChlbnVtVmFsICE9IHhzZDo6QXVkaW9EZXZpY2U6OkFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSB8fCBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJEZXZpY2UgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgaXMgbmVpdGhlciBpbnB1dCwgbm9yIG91dHB1dCBkZXZpY2UiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpOworICAgICAgICB9CisgICAgICAgIC8vIER1ZSB0byBhbGlhc2VkIHZhbHVlcywgdGhlIHJlc3VsdCBvZiAndG9TdHJpbmcnIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZQorICAgICAgICAvLyBhcyAnc3RyaW5nVmFsJywgdGh1cyB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyBpbnN0ZWFkLgorICAgICAgICBzdHJpbmdWYWxCYWNrID0gdG9TdHJpbmcoZGV2aWNlKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoRGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbEJhY2ssIGRldmljZUJhY2spKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoZGV2aWNlLCBkZXZpY2VCYWNrKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VJbk91dERldmljZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvRGV2aWNlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBkZXZpY2VCYWNrOworICAgICAgICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxCYWNrOworICAgICAgICBpZiAoc3RyaW5nVmFsLmZpbmQoIl9ERVZJQ0VfSU5fIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIChhcyBpbnB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIC8vIER1ZSB0byBhbGlhc2VkIHZhbHVlcywgdGhlIHJlc3VsdCBvZiAndG9TdHJpbmcnIG1pZ2h0IG5vdCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgLy8gYXMgJ3N0cmluZ1ZhbCcsIHRodXMgd2UgbmVlZCB0byBjb21wYXJlIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgaW5zdGVhZC4KKyAgICAgICAgICAgIHN0cmluZ1ZhbEJhY2sgPSB0b1N0cmluZyhkZXZpY2UpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsQmFjaywgZGV2aWNlQmFjaykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWxCYWNrIDw8ICJcIiBmYWlsZWQiOworICAgICAgICAgICAgRVhQRUNUX0VRKGRldmljZSwgZGV2aWNlQmFjayk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nVmFsLmZpbmQoIl9ERVZJQ0VfT1VUXyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBkZXZpY2UpKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQgKGFzIG91dHB1dCBkZXZpY2UpIjsKKyAgICAgICAgICAgIHN0cmluZ1ZhbEJhY2sgPSB0b1N0cmluZyhkZXZpY2UpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoT3V0cHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbEJhY2ssIGRldmljZUJhY2spKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsQmFjayA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShkZXZpY2UsIGRldmljZUJhY2spOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZ1ZhbCA9PSB0b1N0cmluZyh4c2Q6OkF1ZGlvRGV2aWNlOjpBVURJT19ERVZJQ0VfTk9ORSkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJpbmdWYWwsIGRldmljZSkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIHN1Y2NlZWRlZCAoYXMgaW5wdXQgZGV2aWNlKSI7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoT3V0cHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZGV2aWNlKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgc3VjY2VlZGVkIChhcyBvdXRwdXQgZGV2aWNlKSI7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc3RyaW5nVmFsLCB0b1N0cmluZyhkZXZpY2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiVW5yZWNvZ25pemVkIGF1ZGlvIGRldmljZSBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VJbk91dEZsYWdzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0luT3V0RmxhZz57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgaWYgKHN0cmluZ1ZhbC5maW5kKCJfSU5QVVRfRkxBR18iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoSW5wdXRGbGFnQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZmxhZykpCisgICAgICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCAoYXMgaW5wdXQgZmxhZykiOworICAgICAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoZmxhZykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZzsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKE91dHB1dEZsYWdDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBmbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIChhcyBvdXRwdXQgZmxhZykiOworICAgICAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoZmxhZykpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlRm9ybWF0cykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Gb3JtYXQ+e30pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgc3RyaW5nVmFsID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKKyAgICAgICAgRVhQRUNUX1RSVUUoRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgZm9ybWF0KSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoZW51bVZhbCAhPSB4c2Q6OkF1ZGlvRm9ybWF0OjpBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICBhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkKKyAgICAgICAgICAgICAgICA8PCAiVmFsaWRpdHkgb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgaXMgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoZm9ybWF0KSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlR2Fpbk1vZGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0dhaW5Nb2RlPnt9KSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbCA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBhdWRpb19nYWluX21vZGVfdCBnYWluTW9kZTsKKyAgICAgICAgRVhQRUNUX1RSVUUoR2Fpbk1vZGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyaW5nVmFsLCBnYWluTW9kZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoZ2Fpbk1vZGUpKTsKKyAgICB9Cit9CisKK1RFU1QoVHlwZUNvbnZlcnRlciwgUGFyc2VTb3VyY2VzKSB7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb1NvdXJjZT57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlOworICAgICAgICBFWFBFQ1RfVFJVRShTb3VyY2VUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgc291cmNlKSkKKyAgICAgICAgICAgICAgICA8PCAiQ29udmVyc2lvbiBvZiBcIiIgPDwgc3RyaW5nVmFsIDw8ICJcIiBmYWlsZWQiOworICAgICAgICBFWFBFQ1RfRVEoc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxULCBhdWRpb19pc192YWxpZF9hdWRpb19zb3VyY2Uoc291cmNlKSkKKyAgICAgICAgICAgICAgICA8PCAiVmFsaWRpdHkgb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgaXMgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoc291cmNlKSk7CisgICAgfQorfQorCitURVNUKFR5cGVDb252ZXJ0ZXIsIFBhcnNlU3RyZWFtVHlwZXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvU3RyZWFtVHlwZT57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOworICAgICAgICBFWFBFQ1RfVFJVRShTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgc3RyZWFtVHlwZSkpCisgICAgICAgICAgICAgICAgPDwgIkNvbnZlcnNpb24gb2YgXCIiIDw8IHN0cmluZ1ZhbCA8PCAiXCIgZmFpbGVkIjsKKyAgICAgICAgRVhQRUNUX0VRKHN0cmluZ1ZhbCwgdG9TdHJpbmcoc3RyZWFtVHlwZSkpOworICAgIH0KK30KKworVEVTVChUeXBlQ29udmVydGVyLCBQYXJzZVVzYWdlcykgeworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Vc2FnZT57fSkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdHJpbmdWYWwgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZTsKKyAgICAgICAgRVhQRUNUX1RSVUUoVXNhZ2VUeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmluZ1ZhbCwgdXNhZ2UpKQorICAgICAgICAgICAgICAgIDw8ICJDb252ZXJzaW9uIG9mIFwiIiA8PCBzdHJpbmdWYWwgPDwgIlwiIGZhaWxlZCI7CisgICAgICAgIEVYUEVDVF9FUShzdHJpbmdWYWwsIHRvU3RyaW5nKHVzYWdlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCBhNjNiOGI0Li5kNzU4MzkxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtMSwxMyArMSwyMSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYW1ldHJpY3MiLAogCiAgICAgc3JjczogWwotICAgICAgICAiSU1lZGlhTWV0cmljc1NlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lZGlhTWV0cmljc0l0ZW0uY3BwIiwKICAgICAgICAgIk1lZGlhTWV0cmljcy5jcHAiLAogICAgIF0sCkBAIC0xNyw2ICsyNSw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTU4LDMgKzY3LDIxIEBACiAgICAgICAgICIvL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9qbmkiLAogICAgIF0sCiB9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAibWVkaWFtZXRyaWNzc2VydmljZS1haWRsIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmFpZGwiLAorICAgIF0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGJhY2tlbmQ6IHsKKyAgICAgICAgY3BwOiB7CisgICAgICAgICAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NJdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NJdGVtLmNwcAppbmRleCA3Y2RiZTVmLi5kNTk3YTRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzSXRlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc0l0ZW0uY3BwCkBAIC0zMSw4ICszMSw5IEBACiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhTWV0cmljc1NlcnZpY2UuaD4gLy8gZm9yIGRpcmVjdCBCaW5kZXIgYWNjZXNzCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIApAQCAtMjc4LDE3ICsyNzksMTkgQEAKIC8vIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBkYWVtb24KIGJvb2wgbWVkaWFtZXRyaWNzOjpJdGVtOjpzZWxmcmVjb3JkKCkgewogICAgIEFMT0dEX0lGKERFQlVHX0FQSSwgIiVzOiBkZWxpdmVyaW5nICVzIiwgX19mdW5jX18sIHRoaXMtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgc3A8SU1lZGlhTWV0cmljc1NlcnZpY2U+IHN2YyA9IGdldFNlcnZpY2UoKTsKLSAgICBpZiAoc3ZjICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3ZjLT5zdWJtaXQodGhpcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJlY29yZDogJXMiLCBfX2Z1bmNfXywgdGhpcy0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgeworCisgICAgY2hhciAqc3RyOworICAgIHNpemVfdCBzaXplOworICAgIHN0YXR1c190IHN0YXR1cyA9IHdyaXRlVG9CeXRlU3RyaW5nKCZzdHIsICZzaXplKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IHN1Ym1pdEJ1ZmZlcihzdHIsIHNpemUpOworICAgICAgICBmcmVlKHN0cik7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmVjb3JkOiAlcyIsIF9fZnVuY19fLCB0aGlzLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiAvL3N0YXRpYwpAQCAtMzA1LDYgKzMwOCwxNyBAQAogICAgIHN3aXRjaCAodWlkKSB7CiAgICAgY2FzZSBBSURfUkFESU86ICAgICAvLyB0ZWxlcGhvbnkgc3Vic3lzdGVtLCBSSUwKICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFNvbWUgaXNvbGF0ZWQgcHJvY2Vzc2VzIGNhbiBhY2Nlc3MgdGhlIGF1ZGlvIHN5c3RlbTsgc2VlCisgICAgICAgIC8vIEF1ZGlvU3lzdGVtOjpzZXRBdWRpb0ZsaW5nZXJCaW5kZXIgKGN1cnJlbnRseSBvbmx5IHRoZSBIb3R3b3JkRGV0ZWN0aW9uU2VydmljZSkuIEluc3RlYWQKKyAgICAgICAgLy8gb2YgYWxzbyBhbGxvd2luZyBhY2Nlc3MgdG8gdGhlIE1lZGlhTWV0cmljcyBzZXJ2aWNlLCBpdCdzIHNpbXBsZXIgdG8ganVzdCBkaXNhYmxlIGl0IGZvcgorICAgICAgICAvLyBub3cuCisgICAgICAgIC8vIFRPRE8oYi8xOTAxNTEyMDUpOiBFaXRoZXIgYWxsb3cgdGhlIEhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlIHRvIGFjY2VzcyBNZWRpYU1ldHJpY3Mgb3IKKyAgICAgICAgLy8gbWFrZSB0aGlzIGRpc2FibGluZyBzcGVjaWZpYyB0byB0aGF0IHByb2Nlc3MuCisgICAgICAgIGlmICh1aWQgPj0gQUlEX0lTT0xBVEVEX1NUQVJUICYmIHVpZCA8PSBBSURfSVNPTEFURURfRU5EKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaW50IGVuYWJsZWQgPSBwcm9wZXJ0eV9nZXRfaW50MzIoSXRlbTo6RW5hYmxlZFByb3BlcnR5LCAtMSk7CkBAIC0zMjcsNyArMzQxLDcgQEAKIAogc3RhdGljIHNwPE1lZGlhTWV0cmljc0RlYXRoTm90aWZpZXI+IHNOb3RpZmllcjsKIC8vIHN0YXRpYwotc3A8SU1lZGlhTWV0cmljc1NlcnZpY2U+IEJhc2VJdGVtOjpzTWVkaWFNZXRyaWNzU2VydmljZTsKK3NwPG1lZGlhOjpJTWVkaWFNZXRyaWNzU2VydmljZT4gQmFzZUl0ZW06OnNNZWRpYU1ldHJpY3NTZXJ2aWNlOwogc3RhdGljIHN0ZDo6bXV0ZXggc1NlcnZpY2VNdXRleDsKIHN0YXRpYyBpbnQgc1JlbWFpbmluZ0JpbmRBdHRlbXB0cyA9IFNWQ19UUklFUzsKIApAQCAtMzM5LDI5ICszNTMsNjcgQEAKIH0KIAogLy8gc3RhdGljCi1ib29sIEJhc2VJdGVtOjpzdWJtaXRCdWZmZXIoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotLyoKLSAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gaXRlbTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpdGVtLnJlYWRGcm9tQnl0ZVN0cmluZyhidWZmZXIsIHNpemUpOwotICAgIEFMT0dEKCIlczogc3RhdHVzOiVkLCBzaXplOiV6dSwgaXRlbTolcyIsIF9fZnVuY19fLCBzdGF0dXMsIHNpemUsIGl0ZW0udG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gaXRlbS5zZWxmcmVjb3JkKCk7Ci0gICAgKi8KLQorc3RhdHVzX3QgQmFzZUl0ZW06OnN1Ym1pdEJ1ZmZlcihjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgQUxPR0RfSUYoREVCVUdfQVBJLCAiJXM6IGRlbGl2ZXJpbmcgJXp1IGJ5dGVzIiwgX19mdW5jX18sIHNpemUpOwotICAgIHNwPElNZWRpYU1ldHJpY3NTZXJ2aWNlPiBzdmMgPSBnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKHN2YyAhPSBudWxscHRyKSB7Ci0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IHN2Yy0+c3VibWl0QnVmZmVyKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmFpbGVkKCVkKSB0byByZWNvcmQ6ICV6dSBieXRlcyIsIF9fZnVuY19fLCBzdGF0dXMsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVmFsaWRhdGUgc2l6ZQorICAgIGlmIChzaXplID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBEbyB3ZSBoYXZlIHRoZSBzZXJ2aWNlIGF2YWlsYWJsZT8KKyAgICBzcDxtZWRpYTo6SU1lZGlhTWV0cmljc1NlcnZpY2U+IHN2YyA9IGdldFNlcnZpY2UoKTsKKyAgICBpZiAoc3ZjID09IG51bGxwdHIpICByZXR1cm4gTk9fSU5JVDsKKworICAgIDo6YW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgY29uc3RleHByICgvKiBESVNBQkxFUyBDT0RFICovIChmYWxzZSkpIHsKKyAgICAgICAgLy8gVEhJUyBQQVRIIElTIEZPUiBSRUZFUkVOQ0UgT05MWS4KKyAgICAgICAgLy8gSXQgaXMgY29tcGlsZWQgc28gdGhhdCBhbnkgY2hhbmdlcyB0byBJTWVkaWFNZXRyaWNzU2VydmljZTo6c3VibWl0QnVmZmVyKCkKKyAgICAgICAgLy8gd2lsbCBsZWFkIGhlcmUuICBJZiB0aGlzIGNvZGUgaXMgY2hhbmdlZCwgdGhlIGVsc2UgYnJhbmNoIG11c3QKKyAgICAgICAgLy8gYmUgY2hhbmdlZCBhcyB3ZWxsLgorICAgICAgICAvLworICAgICAgICAvLyBVc2UgdGhlIEFJREwgY2FsbGluZyBpbnRlcmZhY2UgLSB0aGlzIGlzIGEgYml0IHNsb3dlciBhcyBhIGJ5dGUgdmVjdG9yIG11c3QgYmUKKyAgICAgICAgLy8gY29uc3RydWN0ZWQuIEFzIHRoZSBjYWxsIGlzIG9uZS13YXksIHRoZSBvbmx5IGEgdHJhbnNhY3Rpb24gZXJyb3Igb2NjdXJzLgorICAgICAgICBzdGF0dXMgPSBzdmMtPnN1Ym1pdEJ1ZmZlcih7YnVmZmVyLCBidWZmZXIgKyBzaXplfSkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSB0aGUgQmluZGVyIGNhbGxpbmcgaW50ZXJmYWNlIC0gdGhpcyBkaXJlY3QgaW1wbGVtZW50YXRpb24gYXZvaWRzCisgICAgICAgIC8vIG1hbGxvYy9jb3B5L2ZyZWUgZm9yIHRoZSB2ZWN0b3IgYW5kIHJlZHVjZXMgdGhlIG92ZXJoZWFkIGZvciBsb2dnaW5nLgorICAgICAgICAvLyBXZSBiYXNlZCB0aGlzIG9mZiBvZiB0aGUgQUlETCBnZW5lcmF0ZWQgZmlsZToKKyAgICAgICAgLy8gb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFtZXRyaWNzL21lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC11bnN0YWJsZS1jcHAtc291cmNlL2dlbi9hbmRyb2lkL21lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcAorICAgICAgICAvLyBUT0RPOiBDcmVhdGUgYW4gQUlETCBDKysgYmFjayBlbmQgb3B0aW1pemVkIGZvcm0gb2YgdmVjdG9yIHdyaXRpbmcuCisgICAgICAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX2RhdGE7CisgICAgICAgIDo6YW5kcm9pZDo6UGFyY2VsIF9haWRsX3JlcGx5OyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgYXMgaXQgaXMgb25lLXdheS4KKworICAgICAgICBzdGF0dXMgPSBfYWlkbF9kYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oc3ZjLT5nZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IDo6YW5kcm9pZDo6T0spIGdvdG8gX2FpZGxfZXJyb3I7CisKKyAgICAgICAgc3RhdHVzID0gX2FpZGxfZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNpemUpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSA6OmFuZHJvaWQ6Ok9LKSBnb3RvIF9haWRsX2Vycm9yOworCisgICAgICAgIHN0YXR1cyA9IF9haWRsX2RhdGEud3JpdGUoYnVmZmVyLCBzdGF0aWNfY2FzdDxpbnQzMl90PihzaXplKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gOjphbmRyb2lkOjpPSykgZ290byBfYWlkbF9lcnJvcjsKKworICAgICAgICBzdGF0dXMgPSA6OmFuZHJvaWQ6OklJbnRlcmZhY2U6OmFzQmluZGVyKHN2YyktPnRyYW5zYWN0KAorICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6bWVkaWE6OkJuTWVkaWFNZXRyaWNzU2VydmljZTo6VFJBTlNBQ1RJT05fc3VibWl0QnVmZmVyLAorICAgICAgICAgICAgICAgIF9haWRsX2RhdGEsICZfYWlkbF9yZXBseSwgOjphbmRyb2lkOjpJQmluZGVyOjpGTEFHX09ORVdBWSk7CisKKyAgICAgICAgLy8gQUlETCBwZXJtaXRzIHNldHRpbmcgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIC8vIFNlZSBnby9hb2cvNzEzOTg0LiBUaGlzIGlzIG5vdCB1c2VkIGhlcmUuCisgICAgICAgIC8vIGlmIChzdGF0dXMgPT0gOjphbmRyb2lkOjpVTktOT1dOX1RSQU5TQUNUSU9OCisgICAgICAgIC8vICAgICAgICAgJiYgOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhTWV0cmljc1NlcnZpY2U6OmdldERlZmF1bHRJbXBsKCkpIHsKKyAgICAgICAgLy8gICAgIHN0YXR1cyA9IDo6YW5kcm9pZDo6bWVkaWE6OklNZWRpYU1ldHJpY3NTZXJ2aWNlOjpnZXREZWZhdWx0SW1wbCgpCisgICAgICAgIC8vICAgICAgICAgICAgIC0+c3VibWl0QnVmZmVyKGltbXV0YWJsZUJ5dGVWZWN0b3JGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSkpCisgICAgICAgIC8vICAgICAgICAgICAgIC50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgICAgIC8vIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgcmV0dXJuIE5PX0VSUk9SOworCisgICAgX2FpZGxfZXJyb3I6CisgICAgQUxPR1coIiVzOiBmYWlsZWQoJWQpIHRvIHJlY29yZDogJXp1IGJ5dGVzIiwgX19mdW5jX18sIHN0YXR1cywgc2l6ZSk7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLy9zdGF0aWMKLXNwPElNZWRpYU1ldHJpY3NTZXJ2aWNlPiBCYXNlSXRlbTo6Z2V0U2VydmljZSgpIHsKK3NwPG1lZGlhOjpJTWVkaWFNZXRyaWNzU2VydmljZT4gQmFzZUl0ZW06OmdldFNlcnZpY2UoKSB7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnNlcnZpY2VuYW1lID0gIm1lZGlhLm1ldHJpY3MiOwogICAgIHN0YXRpYyBjb25zdCBib29sIGVuYWJsZWQgPSBpc0VuYWJsZWQoKTsgLy8gc2luZ2xldG9uIGluaXRpYWxpemVkCiAKQEAgLTM3OSw3ICs0MzEsNyBAQAogICAgICAgICBpZiAoc20gIT0gbnVsbHB0cikgewogICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoc2VydmljZW5hbWUpKTsKICAgICAgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHNNZWRpYU1ldHJpY3NTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhTWV0cmljc1NlcnZpY2U+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgc01lZGlhTWV0cmljc1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxtZWRpYTo6SU1lZGlhTWV0cmljc1NlcnZpY2U+KGJpbmRlcik7CiAgICAgICAgICAgICAgICAgc05vdGlmaWVyID0gbmV3IE1lZGlhTWV0cmljc0RlYXRoTm90aWZpZXIoKTsKICAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNOb3RpZmllcik7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5haWRsIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDk2MmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBNZWRpYU1ldHJpY3Mgc2VydmljZSBpbnRlcmZhY2UKKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJTWVkaWFNZXRyaWNzU2VydmljZSB7CisgICAgb25ld2F5IHZvaWQgc3VibWl0QnVmZmVyKGluIGJ5dGVbXSBidWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3NDb25zdGFudHMuaAppbmRleCA4NDM4OGM5Li5hMDlhNjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3NDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3NDb25zdGFudHMuaApAQCAtMTIzLDE0ICsxMjMsMTcgQEAKIAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVDT1VOVCAgICAgImZyYW1lQ291bnQiICAgICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5QVVRERVZJQ0VTICAgImlucHV0RGV2aWNlcyIgICAvLyBzdHJpbmcgdmFsdWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0lOVEVSTkFMVFJBQ0tJRCAiaW50ZXJuYWxUcmFja0lkIiAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfSU5URVJWQUxDT1VOVCAgImludGVydmFsQ291bnQiICAvLyBpbnQzMgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTEFURU5DWU1TICAgICAgImxhdGVuY3lNcyIgICAgICAvLyBkb3VibGUgdmFsdWUKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0xPR1NFU1NJT05JRCAgICJsb2dTZXNzaW9uSWQiICAgLy8gaGV4IHN0cmluZywgIiIgbm9uZQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfTkFNRSAgICAgICAgICAgIm5hbWUiICAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX09SSUdJTkFMRkxBR1MgICJvcmlnaW5hbEZsYWdzIiAgLy8gaW50MzIKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX09VVFBVVERFVklDRVMgICJvdXRwdXREZXZpY2VzIiAgLy8gc3RyaW5nIHZhbHVlCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9QRVJGT1JNQU5DRU1PREUgInBlcmZvcm1hbmNlTW9kZSIgICAgLy8gc3RyaW5nIHZhbHVlLCAibm9uZSIsIGxvd0xhdGVuY3kiCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9QTEFZQkFDS19QSVRDSCAicGxheWJhY2sucGl0Y2giIC8vIGRvdWJsZSB2YWx1ZSAoQXVkaW9UcmFjaykKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1BMQVlCQUNLX1NQRUVEICJwbGF5YmFjay5zcGVlZCIgLy8gZG91YmxlIHZhbHVlIChBdWRpb1RyYWNrKQorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfUExBWUVSSUlEICAgICAgInBsYXllcklJZCIgICAgICAvLyBpbnQzMiAoLTEgaW52YWxpZC91bnNldCBJSUQpCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9ST1VURURERVZJQ0VJRCAicm91dGVkRGV2aWNlSWQiIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TQU1QTEVSQVRFICAgICAic2FtcGxlUmF0ZSIgICAgIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TRUxFQ1RFRERFVklDRUlEICJzZWxlY3RlZERldmljZUlkIiAvLyBpbnQzMgpAQCAtMTM5LDYgKzE0Miw3IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TRVNTSU9OSUQgICAgICAic2Vzc2lvbklkIiAgICAgIC8vIGludDMyCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TSEFSSU5HTU9ERSAgICAic2hhcmluZ01vZGUiICAgIC8vIHN0cmluZyB2YWx1ZSwgImV4Y2x1c2l2ZSIsIHNoYXJlZCIKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NPVVJDRSAgICAgICAgICJzb3VyY2UiICAgICAgICAgLy8gc3RyaW5nIChBdWRpb0F0dHJpYnV0ZXMpCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TVEFSVFRIUkVTSE9MREZSQU1FUyAic3RhcnRUaHJlc2hvbGRGcmFtZXMiIC8vIGludDMyIChBdWRpb1RyYWNrKQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfU1RBUlRVUE1TICAgICAgInN0YXJ0dXBNcyIgICAgICAvLyBkb3VibGUgdmFsdWUKIC8vIFN0YXRlIGlzICJBQ1RJVkUiIG9yICJTVE9QUEVEIiBmb3IgQXVkaW9SZWNvcmQKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1NUQVRFICAgICAgICAgICJzdGF0ZSIgICAgICAgICAgLy8gc3RyaW5nCkBAIC0xNTYsNiArMTYwLDE0IEBACiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9WT0xVTUVfTEVGVCAgICAidm9sdW1lLmxlZnQiICAgIC8vIGRvdWJsZSAoQXVkaW9UcmFjaykKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX1ZPTFVNRV9SSUdIVCAgICJ2b2x1bWUucmlnaHQiICAgLy8gZG91YmxlIChBdWRpb1RyYWNrKQogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfV0hFUkUgICAgICAgICAgIndoZXJlIiAgICAgICAgICAvLyBzdHJpbmcgdmFsdWUKKy8vIEVuY29kaW5nQ2xpZW50IGlzIHRoZSBlbmNvZGluZyBmb3JtYXQgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VOQ09ESU5HQ0xJRU5UICJlbmNvZGluZ0NsaWVudCIgLy8gc3RyaW5nCisvLyBQZXJmb3JtYW5jZU1vZGVBY3R1YWwgaXMgdGhlIGFjdHVhbCBzZWxlY3RlZCBwZXJmb3JtYW5jZSBtb2RlLCBjb3VsZCBiZSAibm9uZScsICJsb3dMYXRlbmN5IiBvcgorLy8gInBvd2VyU2F2aW5nIgorI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfUEVSRk9STUFOQ0VNT0RFQUNUVUFMICJwZXJmb3JtYW5jZU1vZGVBY3R1YWwiIC8vIHN0cmluZworI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVTVFJBTlNGRVJSRUQgImZyYW1lc1RyYW5zZmVycmVkIiAvLyBpbnQ2NF90LCB0cmFuc2ZlcnJlZCBmcmFtZXMKKy8vIHN0cmluZyB2YWx1ZSwgImV4Y2x1c2l2ZSIsICJzaGFyZWQiLiB0aGUgYWN0dWFsIHNlbGVjdGVkIHNoYXJpbmcgbW9kZSBieSB0aGUgc2VydmVyCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9TSEFSSU5HTU9ERUFDVFVBTCAic2hhcmluZ01vZGVBY3R1YWwiCiAKIC8vIFRpbWluZyB2YWx1ZXM6IG1pbGxpc2Vjb25kIHZhbHVlcyBhcmUgc3VmZml4ZWQgd2l0aCBNUyBhbmQgdGhlIHR5cGUgaXMgZG91YmxlCiAvLyBuYW5vc2Vjb25kIHZhbHVlcyBhcmUgc3VmZml4ZWQgd2l0aCBOUyBhbmQgdGhlIHR5cGUgaXMgaW50NjQuCkBAIC0xNzAsNiArMTgyLDcgQEAKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0NUT1IgICAgICAgImN0b3IiCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9ESVNDT05ORUNUICJkaXNjb25uZWN0IgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfRFRPUiAgICAgICAiZHRvciIKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0VOREFBVURJT1NUUkVBTSAiZW5kQUF1ZGlvU3RyZWFtIiAvLyBBQXVkaW9TdHJlYW0KICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0VOREFVRElPSU5URVJWQUxHUk9VUCAiZW5kQXVkaW9JbnRlcnZhbEdyb3VwIgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfRkxVU0ggICAgICAiZmx1c2giICAvLyBBdWRpb1RyYWNrCiAjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9JTlZBTElEQVRFICJpbnZhbGlkYXRlIiAvLyBzZXJ2ZXIgdHJhY2ssIHJlY29yZApAQCAtMTgwLDcgKzE5MywxMCBAQAogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfUkVTVE9SRSAgICAicmVzdG9yZSIKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVE1PREUgICAgInNldE1vZGUiIC8vIEF1ZGlvRmxpbmdlcgogI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUQlVGRkVSU0laRSAgICAic2V0QnVmZmVyU2l6ZSIgLy8gQXVkaW9UcmFjaworI2RlZmluZSBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfU0VUTE9HU0VTU0lPTklEICAic2V0TG9nU2Vzc2lvbklkIiAvLyBBdWRpb1RyYWNrLCBSZWNvcmQKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFBMQVlCQUNLUEFSQU0gInNldFBsYXliYWNrUGFyYW0iIC8vIEF1ZGlvVHJhY2sKKyNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFBMQVlFUklJRCAic2V0UGxheWVySUlkIiAvLyBBdWRpb1RyYWNrCisjZGVmaW5lIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9TRVRTVEFSVFRIUkVTSE9MRCAic2V0U3RhcnRUaHJlc2hvbGQiIC8vIEF1ZGlvVHJhY2sKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFZPSUNFVk9MVU1FICAgInNldFZvaWNlVm9sdW1lIiAvLyBBdWRpb0ZsaW5nZXIKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NFVFZPTFVNRSAgInNldFZvbHVtZSIgIC8vIEF1ZGlvVHJhY2sKICNkZWZpbmUgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX1NUQVJUICAgICAgInN0YXJ0IiAgLy8gQXVkaW9UcmFjaywgQXVkaW9SZWNvcmQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRyaWNzU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjg3MWVjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lNRURJQUFOQUxZVElDU1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0lNRURJQUFOQUxZVElDU1NFUlZJQ0VfSAotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJTWVkaWFNZXRyaWNzU2VydmljZTogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhTWV0cmljc1NlcnZpY2UpOwotCi0gICAgLyoqCi0gICAgICogU3VibWl0cyB0aGUgaW5kaWNhdGVkIHJlY29yZCB0byB0aGUgbWVkaWFhbmFseXRpY3Mgc2VydmljZSwgd2hlcmUKLSAgICAgKiBpdCB3aWxsIGJlIG1lcmdlZCAoaWYgYXBwcm9wcmlhdGUpIHdpdGggaW5jb21wbGV0ZSByZWNvcmRzIHRoYXQKLSAgICAgKiBzaGFyZSB0aGUgc2FtZSBrZXkgYW5kIHNlc3Npb25JRC4KLSAgICAgKgotICAgICAqIFxwYXJhbSBpdGVtIHRoZSBpdGVtIHRvIHN1Ym1pdC4KLSAgICAgKiBccmV0dXJuIHN0YXR1cyB3aGljaCBpcyBuZWdhdGl2ZSBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZCAoc29tZSBlcnJvcnMKLSAgICAgICAgICAgICAgIG1heSBiZSBzaWxlbnQgYW5kIHJldHVybiAwIC0gc3VjY2VzcykuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXQobWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcihjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5NZWRpYU1ldHJpY3NTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhTWV0cmljc1NlcnZpY2U+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCkgb3ZlcnJpZGU7Ci0KLXByb3RlY3RlZDoKLSAgICAvLyBJbnRlcm5hbCBjYWxsIHdoZXJlIHJlbGVhc2UgaXMgdHJ1ZSBpZiB0aGUgc2VydmljZSBpcyB0byBkZWxldGUgdGhlIGl0ZW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRJbnRlcm5hbCgKLSAgICAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSwgYm9vbCByZWxlYXNlKSA9IDA7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JTUVESUFTVEFUSVNUSUNTU0VSVklDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmgKaW5kZXggMzAzMzQzZi4uNDI4OTkyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljc0l0ZW0uaApAQCAtMzIsNyArMzIsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIElNZWRpYU1ldHJpY3NTZXJ2aWNlOworbmFtZXNwYWNlIG1lZGlhIHsgY2xhc3MgSU1lZGlhTWV0cmljc1NlcnZpY2U7IH0KKwogY2xhc3MgUGFyY2VsOwogCiAvKgpAQCAtMjM5LDcgKzI0MCwxMCBAQAogcHVibGljOgogICAgIC8vIGFyZSB3ZSBjb2xsZWN0aW5nIG1ldHJpY3MgZGF0YQogICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwotICAgIHN0YXRpYyBzcDxJTWVkaWFNZXRyaWNzU2VydmljZT4gZ2V0U2VydmljZSgpOworICAgIC8vIHJldHVybnMgdGhlIE1lZGlhTWV0cmljcyBzZXJ2aWNlIGlmIGFjdGl2ZS4KKyAgICBzdGF0aWMgc3A8bWVkaWE6OklNZWRpYU1ldHJpY3NTZXJ2aWNlPiBnZXRTZXJ2aWNlKCk7CisgICAgLy8gc3VibWl0cyBhIHJhdyBidWZmZXIgZGlyZWN0bHkgdG8gdGhlIE1lZGlhTWV0cmljcyBzZXJ2aWNlIC0gdGhpcyBpcyBoaWdobHkgb3B0aW1pemVkLgorICAgIHN0YXRpYyBzdGF0dXNfdCBzdWJtaXRCdWZmZXIoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKIAogcHJvdGVjdGVkOgogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqIGNvbnN0IEVuYWJsZWRQcm9wZXJ0eSA9ICJtZWRpYS5tZXRyaWNzLmVuYWJsZWQiOwpAQCAtMjQ3LDEwICsyNTEsOSBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgRW5hYmxlZFByb3BlcnR5X2RlZmF1bHQgPSAxOwogCiAgICAgLy8gbGV0J3MgcmV1c2UgYSBiaW5kZXIgY29ubmVjdGlvbgotICAgIHN0YXRpYyBzcDxJTWVkaWFNZXRyaWNzU2VydmljZT4gc01lZGlhTWV0cmljc1NlcnZpY2U7CisgICAgc3RhdGljIHNwPG1lZGlhOjpJTWVkaWFNZXRyaWNzU2VydmljZT4gc01lZGlhTWV0cmljc1NlcnZpY2U7CiAKICAgICBzdGF0aWMgdm9pZCBkcm9wSW5zdGFuY2UoKTsKLSAgICBzdGF0aWMgYm9vbCBzdWJtaXRCdWZmZXIoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKIAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIHN0cnVjdCBpc19pdGVtX3R5cGUgewpAQCAtNTczLDcgKzU3Niw3IEBACiAKICAgICBib29sIHJlY29yZCgpIHsKICAgICAgICAgcmV0dXJuIHVwZGF0ZUhlYWRlcigpCi0gICAgICAgICAgICAgICAgJiYgQmFzZUl0ZW06OnN1Ym1pdEJ1ZmZlcihnZXRCdWZmZXIoKSwgZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICYmIEJhc2VJdGVtOjpzdWJtaXRCdWZmZXIoZ2V0QnVmZmVyKCksIGdldExlbmd0aCgpKSA9PSBPSzsKICAgICB9CiAKICAgICBib29sIGlzVmFsaWQgKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCA1MzAxZjVjLi5mNTU2NzhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtMSw0ICsxLDIzIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFjdGl2aXR5TWFuYWdlci5jcHAiLApAQCAtMTUsNyArMzQsMTIgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImF2LXR5cGVzLWFpZGwtY3BwIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYmFuZHJvaWRfbmV0IiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKQEAgLTUyLDkgKzc2LDEzIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsibGlibWVkaWEiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKQEAgLTc2LDQgKzEwNCwzIEBACiAgICAgfSwKIAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGMwZGEwY2UuLmQyNzhhMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC00OSw2ICs0OSw3IEBACiAKICNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KICNpbmNsdWRlIDxkYXRhc291cmNlL0hUVFBCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTk0LDYgKzk1LDcgQEAKIHVzaW5nIGFuZHJvaWQ6Ok5PVF9FTk9VR0hfREFUQTsKIHVzaW5nIGFuZHJvaWQ6OlBhcmNlbDsKIHVzaW5nIGFuZHJvaWQ6Om1lZGlhOjpWb2x1bWVTaGFwZXI7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiAvLyBNYXggbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGZpbHRlci4KIGNvbnN0IGludCBrTWF4RmlsdGVyU2l6ZSA9IDY0OyAgLy8gSSBwdWxsZWQgdGhhdCBvdXQgb2YgdGhpbiBhaXIuCkBAIC00NTMsMTQgKzQ1NSwyMiBAQAogICAgIEFMT0dWKCJNZWRpYVBsYXllclNlcnZpY2UgZGVzdHJveWVkIik7CiB9CiAKLXNwPElNZWRpYVJlY29yZGVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZU1lZGlhUmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCitzcDxJTWVkaWFSZWNvcmRlcj4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpjcmVhdGVNZWRpYVJlY29yZGVyKAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkKIHsKLSAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlckNsaWVudCh0aGlzLCBwaWQsIG9wUGFja2FnZU5hbWUpOworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgdmVyaWZpZWRBdHRyaWJ1dGlvblNvdXJjZSA9IGF0dHJpYnV0aW9uU291cmNlOworICAgIHZlcmlmaWVkQXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICBsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpOworICAgIHZlcmlmaWVkQXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgIGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSk7CisgICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gcmVjb3JkZXIgPQorICAgICAgICBuZXcgTWVkaWFSZWNvcmRlckNsaWVudCh0aGlzLCB2ZXJpZmllZEF0dHJpYnV0aW9uU291cmNlKTsKICAgICB3cDxNZWRpYVJlY29yZGVyQ2xpZW50PiB3ID0gcmVjb3JkZXI7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1NZWRpYVJlY29yZGVyQ2xpZW50cy5hZGQodyk7Ci0gICAgQUxPR1YoIkNyZWF0ZSBuZXcgbWVkaWEgcmVjb3JkZXIgY2xpZW50IGZyb20gcGlkICVkIiwgcGlkKTsKKyAgICBBTE9HVigiQ3JlYXRlIG5ldyBtZWRpYSByZWNvcmRlciBjbGllbnQgZnJvbSBwaWQgJXMiLAorICAgICAgICB2ZXJpZmllZEF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgcmV0dXJuIHJlY29yZGVyOwogfQogCkBAIC00ODAsMTcgKzQ5MCwyMSBAQAogfQogCiBzcDxJTWVkaWFQbGF5ZXI+IE1lZGlhUGxheWVyU2VydmljZTo6Y3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkKQorICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQsIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKQogewotICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBpbnQzMl90IGNvbm5JZCA9IGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRDb25uSWQpOworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgdmVyaWZpZWRBdHRyaWJ1dGlvblNvdXJjZSA9IGF0dHJpYnV0aW9uU291cmNlOworICAgIHZlcmlmaWVkQXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgIGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSk7CisgICAgdmVyaWZpZWRBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKTsKIAogICAgIHNwPENsaWVudD4gYyA9IG5ldyBDbGllbnQoCi0gICAgICAgICAgICB0aGlzLCBwaWQsIGNvbm5JZCwgY2xpZW50LCBhdWRpb1Nlc3Npb25JZCwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICB0aGlzLCB2ZXJpZmllZEF0dHJpYnV0aW9uU291cmNlLCBjb25uSWQsIGNsaWVudCwgYXVkaW9TZXNzaW9uSWQpOwogCi0gICAgQUxPR1YoIkNyZWF0ZSBuZXcgY2xpZW50KCVkKSBmcm9tIHBpZCAlZCwgdWlkICVkLCAiLCBjb25uSWQsIHBpZCwKLSAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgQUxPR1YoIkNyZWF0ZSBuZXcgY2xpZW50KCVkKSBmcm9tICVzLCAiLCBjb25uSWQsCisgICAgICAgIHZlcmlmaWVkQXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIHdwPENsaWVudD4gdyA9IGM7CiAgICAgewpAQCAtNTQzLDggKzU1Nyw4IEBACiAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgcmVzdWx0LmFwcGVuZCgiIENsaWVudFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHBpZCglZCksIGNvbm5JZCglZCksIHN0YXR1cyglZCksIGxvb3BpbmcoJXMpXG4iLAotICAgICAgICAgICAgbVBpZCwgbUNvbm5JZCwgbVN0YXR1cywgbUxvb3A/InRydWUiOiAiZmFsc2UiKTsKKyAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgQXR0cmlidXRpb25Tb3VyY2UoJXMpLCBjb25uSWQoJWQpLCBzdGF0dXMoJWQpLCBsb29waW5nKCVzKVxuIiwKKyAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSwgbUNvbm5JZCwgbVN0YXR1cywgbUxvb3A/InRydWUiOiAiZmFsc2UiKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICBzcDxNZWRpYVBsYXllckJhc2U+IHA7CkBAIC02MDgsNyArNjIyLDggQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbU1lZGlhUmVjb3JkZXJDbGllbnRzLnNpemUoKTsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IGMgPSBtTWVkaWFSZWNvcmRlckNsaWVudHNbaV0ucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgTWVkaWFSZWNvcmRlckNsaWVudCBwaWQoJWQpXG4iLCBjLT5tUGlkKTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgTWVkaWFSZWNvcmRlckNsaWVudCBwaWQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPm1BdHRyaWJ1dGlvblNvdXJjZS5waWQpOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiXG4iOwpAQCAtNzMxLDE5ICs3NDYsMTggQEAKIH0KIAogTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudCgKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwgcGlkX3QgcGlkLAorICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgaW50MzJfdCBjb25uSWQsIGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbklkLCB1aWRfdCB1aWQpCisgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCkKKyAgICAgICAgOiBtQXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpCiB7CiAgICAgQUxPR1YoIkNsaWVudCglZCkgY29uc3RydWN0b3IiLCBjb25uSWQpOwotICAgIG1QaWQgPSBwaWQ7CiAgICAgbUNvbm5JZCA9IGNvbm5JZDsKICAgICBtU2VydmljZSA9IHNlcnZpY2U7CiAgICAgbUNsaWVudCA9IGNsaWVudDsKICAgICBtTG9vcCA9IGZhbHNlOwogICAgIG1TdGF0dXMgPSBOT19JTklUOwogICAgIG1BdWRpb1Nlc3Npb25JZCA9IGF1ZGlvU2Vzc2lvbklkOwotICAgIG1VaWQgPSB1aWQ7CiAgICAgbVJldHJhbnNtaXRFbmRwb2ludFZhbGlkID0gZmFsc2U7CiAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IE5VTEw7CiAgICAgbUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKHRoaXMpOwpAQCAtNzU2LDcgKzc3MCw4IEBACiAKIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50Ojp+Q2xpZW50KCkKIHsKLSAgICBBTE9HVigiQ2xpZW50KCVkKSBkZXN0cnVjdG9yIHBpZCA9ICVkIiwgbUNvbm5JZCwgbVBpZCk7CisgICAgQUxPR1YoIkNsaWVudCglZCkgZGVzdHJ1Y3RvciBBdHRyaWJ1dGlvblNvdXJjZSA9ICVzIiwgbUNvbm5JZCwKKyAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIG1BdWRpb091dHB1dC5jbGVhcigpOwogICAgIHdwPENsaWVudD4gY2xpZW50KHRoaXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTc2OSw3ICs3ODQsOCBAQAogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkKIHsKLSAgICBBTE9HVigiZGlzY29ubmVjdCglZCkgZnJvbSBwaWQgJWQiLCBtQ29ubklkLCBtUGlkKTsKKyAgICBBTE9HVigiZGlzY29ubmVjdCglZCkgZnJvbSBBdHRyaWJ1dGlvblNvdXJjZSAlcyIsIG1Db25uSWQsCisgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAvLyBncmFiIGxvY2FsIHJlZmVyZW5jZSBhbmQgY2xlYXIgbWFpbiByZWZlcmVuY2UgdG8gcHJldmVudCBmdXR1cmUKICAgICAvLyBhY2Nlc3MgdG8gb2JqZWN0CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwOwpAQCAtODA5LDExICs4MjUsMTIgQEAKICAgICAgICAgcC5jbGVhcigpOwogICAgIH0KICAgICBpZiAocCA9PSBOVUxMKSB7Ci0gICAgICAgIHAgPSBNZWRpYVBsYXllckZhY3Rvcnk6OmNyZWF0ZVBsYXllcihwbGF5ZXJUeXBlLCBtTGlzdGVuZXIsIG1QaWQpOworICAgICAgICBwID0gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIocGxheWVyVHlwZSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQXR0cmlidXRpb25Tb3VyY2UucGlkKSkpOwogICAgIH0KIAogICAgIGlmIChwICE9IE5VTEwpIHsKLSAgICAgICAgcC0+c2V0VUlEKG1VaWQpOworICAgICAgICBwLT5zZXRVSUQoVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXR0cmlidXRpb25Tb3VyY2UudWlkKSkpOwogICAgIH0KIAogICAgIHJldHVybiBwOwpAQCAtOTIxLDggKzkzOCw4IEBACiAgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyID0gbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHApOwogCiAgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwKLSAgICAgICAgICAgICAgICBtUGlkLCBtQXVkaW9BdHRyaWJ1dGVzLCBtQXVkaW9EZXZpY2VVcGRhdGVkTGlzdGVuZXIpOworICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBtQXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcywgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyKTsKICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJJbnRlcmZhY2UqPihwLmdldCgpKS0+c2V0QXVkaW9TaW5rKG1BdWRpb091dHB1dCk7CiAgICAgfQogCkBAIC0xMDYyLDYgKzEwNzksMTcgQEAKICAgICByZXR1cm4gbVN0YXR1cyA9IHNldERhdGFTb3VyY2VfcG9zdChwLCBwLT5zZXREYXRhU291cmNlKGRhdGFTb3VyY2UpKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcykgeworICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUgPSBOVV9QTEFZRVI7CisgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBwID0gc2V0RGF0YVNvdXJjZV9wcmUocGxheWVyVHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgLy8gbm93IHNldCBkYXRhIHNvdXJjZQorICAgIHJldHVybiBtU3RhdHVzID0gc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UocnRwUGFyYW1zKSk7Cit9CisKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoCkBAIC0xNzYwLDggKzE3ODgsOSBAQAogCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBdWRpb1NpbmsiCi1NZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKK01lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spCiAgICAgOiBtQ2FsbGJhY2soTlVMTCksCiAgICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCiAgICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLApAQCAtMTc3Myw4ICsxODAyLDcgQEAKICAgICAgIG1Nc2Vjc1BlckZyYW1lKDApLAogICAgICAgbUZyYW1lU2l6ZSgwKSwKICAgICAgIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKLSAgICAgIG1VaWQodWlkKSwKLSAgICAgIG1QaWQocGlkKSwKKyAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZShhdHRyaWJ1dGlvblNvdXJjZSksCiAgICAgICBtU2VuZExldmVsKDAuMCksCiAgICAgICBtQXV4RWZmZWN0SWQoMCksCiAgICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCkBAIC0xODA4LDggKzE4MzYsNyBAQAogLy9zdGF0aWMKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKQogewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHZhbHVlLCAwKSkgeworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYm9vdC5xZW11IiwgZmFsc2UpKSB7CiAgICAgICAgIG1Jc09uRW11bGF0b3IgPSB0cnVlOwogICAgICAgICBtTWluQnVmZmVyQ291bnQgPSAxMjsgIC8vIHRvIHByZXZlbnQgc3lzdGVtYXRpYyBidWZmZXIgdW5kZXJydW4gZm9yIGVtdWxhdG9yCiAgICAgfQpAQCAtMjE3MSw4ICsyMTk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCiAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLAotICAgICAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKICAgICAgICAgICAgICAgICAgICAgMS4wZiwgIC8vIGRlZmF1bHQgdmFsdWUgZm9yIG1heFJlcXVpcmVkU3BlZWQKQEAgLTIxOTksOCArMjIyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8vIG9mZmxvYWQgaW5mbwotICAgICAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgICAgICBtUGlkLAorICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAogICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsCkBAIC0yMjMwLDYgKzIyNTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICBtUmVjeWNsZWRUcmFjay0+ZnJhbWVDb3VudCgpLCB0LT5mcmFtZUNvdW50KCkpOwogICAgICAgICAgICAgICAgIHJldXNlID0gZmFsc2U7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiByZWN5Y2xlZCBhbmQgbmV3IHRyYWNrcyBhcmUgbm90IG9uIHRoZSBzYW1lIG91dHB1dCwKKyAgICAgICAgICAgIC8vIGRvbid0IHJldXNlIHRoZSByZWN5Y2xlZCBvbmUuCisgICAgICAgICAgICBpZiAobVJlY3ljbGVkVHJhY2stPmdldE91dHB1dCgpICE9IHQtPmdldE91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm91dHB1dCBoYXMgY2hhbmdlZCwgZG9uJ3QgcmV1c2UgdHJhY2siKTsKKyAgICAgICAgICAgICAgICByZXVzZSA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJldXNlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggNjQzMWNhMS4uOTgwOTFiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSU0VSVklDRV9ICiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC0yNiwxNyArMjcsMjAgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIGNsYXNzIEF1ZGlvVHJhY2s7CiBzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CiBjbGFzcyBEZWF0aE5vdGlmaWVyOwpAQCAtNzgsOCArODIsNyBAQAogICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvT3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkF1ZGlvT3V0cHV0KCk7CkBAIC05OCw2ICsxMDEsNyBAQAogICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICAgICAgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgICAgICBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIG9wZW4oCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCkBAIC0xNjcsOCArMTcxLDcgQEAKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CiAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgIG1BdHRyaWJ1dGlvblNvdXJjZTsKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVNlbmRMZXZlbDsKICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CkBAIC0yMzAsMTIgKzIzMywxMyBAQAogICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSgpOwogCiAgICAgLy8gSU1lZGlhUGxheWVyU2VydmljZSBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiAgY3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSk7CisgICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gY3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSk7CiAgICAgdm9pZCAgICByZW1vdmVNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHdwPE1lZGlhUmVjb3JkZXJDbGllbnQ+JiBjbGllbnQpOwogICAgIHZpcnR1YWwgc3A8SU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI+IGNyZWF0ZU1ldGFkYXRhUmV0cmlldmVyKCk7CiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYVBsYXllcj4gICAgY3JlYXRlKGNvbnN0IHNwPElNZWRpYVBsYXllckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNwPElNZWRpYUNvZGVjTGlzdD4gZ2V0Q29kZWNMaXN0KCkgY29uc3Q7CiAKQEAgLTM2OCw2ICszNzIsNyBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcyk7CiAKIAogICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+ICAgICBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlKTsKQEAgLTM3Niw3ICszODEsOSBAQAogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKTsKIAotICAgICAgICAgICAgICAgIHBpZF90ICAgICAgICAgICBwaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9CisgICAgICAgICAgICAgICAgcGlkX3QgICAgICAgICAgIHBpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QobUF0dHJpYnV0aW9uU291cmNlLnBpZCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCkgeyByZXR1cm4gbUF1ZGlvU2Vzc2lvbklkOyB9CkBAIC00MDYsMTEgKzQxMywxMCBAQAogCiAgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCggY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb25uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUGxheWVyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCgpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+Q2xpZW50KCk7CiAKQEAgLTQ1NCwxMyArNDYwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyU2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgICBzcDxJTWVkaWFQbGF5ZXJDbGllbnQ+ICAgICAgICBtQ2xpZW50OwogICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dD4gICAgICAgICAgICAgICBtQXVkaW9PdXRwdXQ7Ci0gICAgICAgICAgICAgICAgICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgIG1BdHRyaWJ1dGlvblNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3A7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgIG1Db25uSWQ7CiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25JZDsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgICAgICAgbUF1ZGlvQXR0cmlidXRlczsKLSAgICAgICAgICAgICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKICAgICAgICAgICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvd0JpbmRlcjsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICAgICAgICAgICAgbVJldHJhbnNtaXRFbmRwb2ludDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA5YjE5NzRiLi5hOTE0MDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKQEAgLTEyMywxMSArMTI0LDExIEBACiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIHNvdXJjZTogJWQiLCBhcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAKLSAgICBpZiAoKGFzID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpCi0gICAgICAgICAgICB8fCAhcmVjb3JkaW5nQWxsb3dlZChTdHJpbmcxNigiIiksIHBpZCwgdWlkKSkgeworICAgIGlmICgoYXMgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCisgICAgICAgICAgICAmJiAhKGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQobUF0dHJpYnV0aW9uU291cmNlKQorICAgICAgICAgICAgICAgICAgICB8fCBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChtQXR0cmlidXRpb25Tb3VyY2UpKSkKKyAgICAgICAgICAgIHx8ICFyZWNvcmRpbmdBbGxvd2VkKG1BdHRyaWJ1dGlvblNvdXJjZSwgKGF1ZGlvX3NvdXJjZV90KWFzKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKQEAgLTM3NiwxMiArMzc3LDEzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1NZWRpYVJlY29yZGVyQ2xpZW50OjpNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCitNZWRpYVJlY29yZGVyQ2xpZW50OjpNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKQogewogICAgIEFMT0dWKCJDbGllbnQgY29uc3RydWN0b3IiKTsKLSAgICBtUGlkID0gcGlkOwotICAgIG1SZWNvcmRlciA9IG5ldyBTdGFnZWZyaWdodFJlY29yZGVyKG9wUGFja2FnZU5hbWUpOworICAgIC8vIGF0dHJpYnV0aW9uIHNvdXJjZSBhbHJlYWR5IHZhbGlkYXRlZCBpbiBjcmVhdGVNZWRpYVJlY29yZGVyCisgICAgbUF0dHJpYnV0aW9uU291cmNlID0gYXR0cmlidXRpb25Tb3VyY2U7CisgICAgbVJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXIoYXR0cmlidXRpb25Tb3VyY2UpOwogICAgIG1NZWRpYVBsYXllclNlcnZpY2UgPSBzZXJ2aWNlOwogfQogCkBAIC00MjMsMzAgKzQyNSwzNSBAQAogCiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogCi0gICAgLy8gV09SS0FST1VORDogV2UgZG9uJ3Qga25vdyBpZiBjYW1lcmEgZXhpc3RzIGhlcmUgYW5kIGdldFNlcnZpY2UgbWlnaHQgYmxvY2sgZm9yIDUgc2Vjb25kcy4KLSAgICAvLyBVc2UgY2hlY2tTZXJ2aWNlIGZvciBjYW1lcmEgaWYgd2UgZG9uJ3Qga25vdyBpdCBleGlzdHMuCi0gICAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHNDYW1lcmFDaGVja2VkKGZhbHNlKTsgIC8vIG9uY2UgdHJ1ZSBuZXZlciBiZWNvbWVzIGZhbHNlLgotICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBzQ2FtZXJhVmVyaWZpZWQoZmFsc2UpOyAvLyBvbmNlIHRydWUgbmV2ZXIgYmVjb21lcyBmYWxzZS4KLSAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSAoc0NhbWVyYVZlcmlmaWVkIHx8ICFzQ2FtZXJhQ2hlY2tlZCkKLSAgICAgICAgPyBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpIDogc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpOwotICAgIC8vIElmIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhIGNhbWVyYSwgZG8gbm90IGNyZWF0ZSBhIGRlYXRoIGxpc3RlbmVyIGZvciBpdC4KLSAgICBpZiAoYmluZGVyICE9IE5VTEwpIHsKLSAgICAgICAgc0NhbWVyYVZlcmlmaWVkID0gdHJ1ZTsKLSAgICAgICAgbURlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKLSAgICAgICAgICAgICAgICBiaW5kZXIsIFtsID0gd3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+KGxpc3RlbmVyKV0oKXsKLSAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBsaXN0ZW5lciA9IGwucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhLmNhbWVyYSBzZXJ2aWNlIGRpZWQuICIKLSAgICAgICAgICAgICAgICAgICAgICAiU2VuZGluZyBkZWF0aCBub3RpZmljYXRpb24uIik7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeSgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6Q0FNRVJBX1BST0NFU1NfREVBVEgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibWVkaWEuY2FtZXJhIHNlcnZpY2UgZGllZCB3aXRob3V0IGEgZGVhdGggaGFuZGxlci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgc0NhbWVyYURpc2FibGVkID0gQ2FtZXJhVXRpbHM6OmlzQ2FtZXJhU2VydmljZURpc2FibGVkKCk7CisKKyAgICBpZiAoIXNDYW1lcmFEaXNhYmxlZCkgeworICAgICAgICAvLyBXT1JLQVJPVU5EOiBXZSBkb24ndCBrbm93IGlmIGNhbWVyYSBleGlzdHMgaGVyZSBhbmQgZ2V0U2VydmljZSBtaWdodCBibG9jayBmb3IgNSBzZWNvbmRzLgorICAgICAgICAvLyBVc2UgY2hlY2tTZXJ2aWNlIGZvciBjYW1lcmEgaWYgd2UgZG9uJ3Qga25vdyBpdCBleGlzdHMuCisgICAgICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxib29sPiBzQ2FtZXJhQ2hlY2tlZChmYWxzZSk7ICAvLyBvbmNlIHRydWUgbmV2ZXIgYmVjb21lcyBmYWxzZS4KKyAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPGJvb2w+IHNDYW1lcmFWZXJpZmllZChmYWxzZSk7IC8vIG9uY2UgdHJ1ZSBuZXZlciBiZWNvbWVzIGZhbHNlLgorCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IChzQ2FtZXJhVmVyaWZpZWQgfHwgIXNDYW1lcmFDaGVja2VkKQorICAgICAgICAgICAgPyBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpIDogc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhIikpOworICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBjYW1lcmEsIGRvIG5vdCBjcmVhdGUgYSBkZWF0aCBsaXN0ZW5lciBmb3IgaXQuCisgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc0NhbWVyYVZlcmlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EZWF0aE5vdGlmaWVycy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgIGJpbmRlciwgW2wgPSB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4obGlzdGVuZXIpXSgpeworICAgICAgICAgICAgICAgIHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBsaXN0ZW5lciA9IGwucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEuY2FtZXJhIHNlcnZpY2UgZGllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuZGluZyBkZWF0aCBub3RpZmljYXRpb24uIik7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6Q0FNRVJBX1BST0NFU1NfREVBVEgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJtZWRpYS5jYW1lcmEgc2VydmljZSBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHNDYW1lcmFDaGVja2VkID0gdHJ1ZTsKICAgICB9Ci0gICAgc0NhbWVyYUNoZWNrZWQgPSB0cnVlOwogCiAgICAgewogICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwpAQCAtNTg1LDQgKzU5MiwxMyBAQAogICAgIH0KICAgICByZXR1cm4gTk9fSU5JVDsKIH0KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlckNsaWVudDo6Z2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykgeworICAgIEFMT0dWKCJnZXRSdHBEYXRhVXNhZ2UiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPmdldFJ0cERhdGFVc2FnZShieXRlcyk7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCmluZGV4IDEyMjU3ZTUuLmRjYjlmODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKQEAgLTg2LDIwICs4NywyMCBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGdldFJ0cERhdGFVc2FnZSh1aW50NjRfdCAqYnl0ZXMpOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVjb3JkZXJDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgIH5NZWRpYVJlY29yZGVyQ2xpZW50KCk7CiAKICAgICBzdGQ6OnZlY3RvcjxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcnM7CiAgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjsKIAotICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKKyAgICBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG1BdHRyaWJ1dGlvblNvdXJjZTsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgIG1Mb2NrOwogICAgIE1lZGlhUmVjb3JkZXJCYXNlICAgICAgKm1SZWNvcmRlcjsKICAgICBzcDxNZWRpYVBsYXllclNlcnZpY2U+IG1NZWRpYVBsYXllclNlcnZpY2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggNDFiNmY3Mi4uMmFhYmQ1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMTc0LDkgKzE3NCw3IEBACiAgICAgICAgIEFMT0dWKCJnZXR0aW5nIHRyYWNrICV6dSBvZiAlenUsIG1ldGE9JXMiLCBpLCBuLCBtZXRhLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkgJiYgIXN0cm5jYXNlY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgewogICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CiAgICAgICAgICAgICBpZiAoKGluZGV4IDwgMCAmJiBtZXRhLT5maW5kSW50MzIoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KQpAQCAtMjA4LDEyICsyMDYsMTkgQEAKICAgICB9CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgIGlmICghdHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICBBTE9HRSgiaW1hZ2UgdHJhY2sgaGFzIG5vIG1pbWUgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgQUxPR1YoImV4dHJhY3RpbmcgZnJvbSAlcyB0cmFjayIsIG1pbWUpOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7CiAgICAgICAgIG1pbWUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogICAgICAgICB0cmFja01ldGEgPSBuZXcgTWV0YURhdGEoKnRyYWNrTWV0YSk7CiAgICAgICAgIHRyYWNrTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWUpOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRikpIHsKKyAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhKCp0cmFja01ldGEpOworICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKICAgICB9CiAKICAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCkBAIC0yMjgsNyArMjMzLDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBzcDxJbWFnZURlY29kZXI+IGRlY29kZXIgPSBuZXcgSW1hZ2VEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKKyAgICAgICAgc3A8TWVkaWFJbWFnZURlY29kZXI+IGRlY29kZXIgPSBuZXcgTWVkaWFJbWFnZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gdGh1bWJuYWlsID8gLTEgOiAwOwogICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdChmcmFtZVRpbWVVcywgMCAvKm9wdGlvbiovLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lID0gZGVjb2Rlci0+ZXh0cmFjdEZyYW1lKHJlY3QpOwpAQCAtMjk5LDkgKzMwNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpICYmICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM3LDcgKzM0MCwxMCBAQAogICAgIH0KIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgaWYgKCF0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgIEFMT0dFKCJ2aWRlbyB0cmFjayBoYXMgbm8gbWltZSBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAogICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwpAQCAtNTIzLDYgKzUyOSwxNSBAQAogICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9FWElGX0xFTkdUSCwgU3RyaW5nOCh0bXApKTsKICAgICB9CiAKKyAgICBpbnQ2NF90IHhtcE9mZnNldCwgeG1wU2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlYbXBPZmZzZXQsICZ4bXBPZmZzZXQpCisgICAgICYmIG1ldGEtPmZpbmRJbnQ2NChrS2V5WG1wU2l6ZSwgJnhtcFNpemUpKSB7CisgICAgICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChsb25nIGxvbmcpeG1wT2Zmc2V0KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfWE1QX09GRlNFVCwgU3RyaW5nOCh0bXApKTsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKGxvbmcgbG9uZyl4bXBTaXplKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfWE1QX0xFTkdUSCwgU3RyaW5nOCh0bXApKTsKKyAgICB9CisKICAgICBib29sIGhhc0F1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXNWaWRlbyA9IGZhbHNlOwogICAgIGludDMyX3QgdmlkZW9XaWR0aCA9IC0xOwpAQCAtNTMxLDE0ICs1NDYsMTQgQEAKICAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IC0xOwogICAgIGludDMyX3Qgcm90YXRpb25BbmdsZSA9IC0xOwogICAgIGludDMyX3QgaW1hZ2VDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBpbWFnZVByaW1hcnkgPSAwOworICAgIGludDMyX3QgaW1hZ2VQcmltYXJ5ID0gLTE7CiAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gLTE7CiAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IC0xOwogICAgIGludDMyX3QgaW1hZ2VSb3RhdGlvbiA9IC0xOwogCiAgICAgLy8gVGhlIG92ZXJhbGwgZHVyYXRpb24gaXMgdGhlIGR1cmF0aW9uIG9mIHRoZSBsb25nZXN0IHRyYWNrLgogICAgIGludDY0X3QgbWF4RHVyYXRpb25VcyA9IDA7Ci0gICAgU3RyaW5nOCB0aW1lZFRleHRMYW5nOworICAgIFN0cmluZzggdGltZWRUZXh0TGFuZywgdmlkZW9NaW1lOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKICAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CiAgICAgICAgIGlmICghdHJhY2tNZXRhKSB7CkBAIC01NzQsMjggKzU4OSwzMyBAQAogICAgICAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9TQU1QTEVSQVRFLCBTdHJpbmc4KHRtcCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1ZpZGVvICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKLSAgICAgICAgICAgICAgICBoYXNWaWRlbyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2aWRlb1dpZHRoKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZpZGVvSGVpZ2h0KSk7CiAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkFuZ2xlKSkgewogICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFuZ2xlID0gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVDb3VudCwgJnZpZGVvRnJhbWVDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwYXJzZUNvbG9yQXNwZWN0cyh0cmFja01ldGEpOworICAgICAgICAgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2aWRlb1dpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmdmlkZW9IZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9NaW1lID0gU3RyaW5nOChtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VDb2xvckFzcGVjdHModHJhY2tNZXRhKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmlkZW8gdHJhY2sgaWdub3JlZCBmb3IgbWlzc2luZyBkaW1lbnNpb25zIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImltYWdlLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKAogICAgICAgICAgICAgICAgICAgICAgICAga0tleVRyYWNrSXNEZWZhdWx0LCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VQcmltYXJ5ID0gaW1hZ2VDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmaW1hZ2VXaWR0aCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaW1hZ2VIZWlnaHQpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZpbWFnZVJvdGF0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSb3RhdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmltYWdlV2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaW1hZ2VIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVByaW1hcnkgPSBpbWFnZUNvdW50OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInByaW1hcnkgaW1hZ2UgdHJhY2sgaWdub3JlZCBmb3IgbWlzc2luZyBkaW1lbnNpb25zIik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCsrOwogICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CkBAIC02MTgsNyArNjM4LDggQEAKICAgICB9CiAKICAgICAvLyBUaGUgZHVyYXRpb24gdmFsdWUgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkdXJhdGlvbiBpbiBtcy4KLSAgICBzcHJpbnRmKHRtcCwgIiUiIFBSSWQ2NCwgKG1heER1cmF0aW9uVXMgKyA1MDApIC8gMTAwMCk7CisgICAgc3ByaW50Zih0bXAsICIlIiBQUklkNjQsCisgICAgICAgICAgIChtYXhEdXJhdGlvblVzID4gKElOVDY0X01BWCAtIDUwMCkgPyBJTlQ2NF9NQVggOiAobWF4RHVyYXRpb25VcyArIDUwMCkpIC8gMTAwMCk7CiAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRFVSQVRJT04sIFN0cmluZzgodG1wKSk7CiAKICAgICBpZiAoaGFzQXVkaW8pIHsKQEAgLTYyOCwyMiArNjQ5LDI3IEBACiAgICAgaWYgKGhhc1ZpZGVvKSB7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19WSURFTywgU3RyaW5nOCgieWVzIikpOwogCisgICAgICAgIENIRUNLKHZpZGVvV2lkdGggPj0gMCk7CiAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb1dpZHRoKTsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVklERU9fV0lEVEgsIFN0cmluZzgodG1wKSk7CiAKKyAgICAgICAgQ0hFQ0sodmlkZW9IZWlnaHQgPj0gMCk7CiAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb0hlaWdodCk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0hFSUdIVCwgU3RyaW5nOCh0bXApKTsKIAogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgcm90YXRpb25BbmdsZSk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OLCBTdHJpbmc4KHRtcCkpOwogCisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0NPREVDX01JTUVfVFlQRSwgdmlkZW9NaW1lKTsKKwogICAgICAgICBpZiAodmlkZW9GcmFtZUNvdW50ID4gMCkgewogICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvRnJhbWVDb3VudCk7CiAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19GUkFNRV9DT1VOVCwgU3RyaW5nOCh0bXApKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpbWFnZUNvdW50ID4gMCkgeworICAgIC8vIG9ubHkgaWYgd2UgaGF2ZSBhIHByaW1hcnkgaW1hZ2UKKyAgICBpZiAoaW1hZ2VDb3VudCA+IDAgJiYgaW1hZ2VQcmltYXJ5ID49IDApIHsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX0lNQUdFLCBTdHJpbmc4KCJ5ZXMiKSk7CiAKICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlQ291bnQpOwpAQCAtNjUyLDkgKzY3OCwxMSBAQAogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VQcmltYXJ5KTsKICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfUFJJTUFSWSwgU3RyaW5nOCh0bXApKTsKIAorICAgICAgICBDSEVDSyhpbWFnZVdpZHRoID49IDApOwogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VXaWR0aCk7CiAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1dJRFRILCBTdHJpbmc4KHRtcCkpOwogCisgICAgICAgIENIRUNLKGltYWdlSGVpZ2h0ID49IDApOwogICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VIZWlnaHQpOwogICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQsIFN0cmluZzgodG1wKSk7CiAKQEAgLTY4MiwxMCArNzEwLDkgQEAKICAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChmaWxlTUlNRSwgInZpZGVvL3gtbWF0cm9za2EiKSkgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoMCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFja01JTUU7Ci0gICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJnRyYWNrTUlNRSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgdHJhY2tNSU1FLCA2KSkgeworICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpCisgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKCJhdWRpby8iLCB0cmFja01JTUUsIDYpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIG1hdHJvc2thIGZpbGUgb25seSBjb250YWlucyBhIHNpbmdsZSBhdWRpbyB0cmFjaywKICAgICAgICAgICAgICAgICAvLyByZXdyaXRlIGl0cyBtaW1lIHR5cGUuCiAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCA3ODk3OTU5Li5iZmZkN2IzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0xNyw2ICsxNyw5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UmVjb3JkZXIiCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKy8vIFRPRE8vd29ya2Fyb3VuZDogaW5jbHVkaW5nIGJhc2UgbG9nZ2luZyBub3cgYXMgaXQgY29uZmxpY3RzIHdpdGggQURlYnVnLmgKKy8vIGFuZCBpdCBtdXN0IGJlIGluY2x1ZGVkIGZpcnN0LgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJXZWJtV3JpdGVyLmgiCkBAIC0zMCw2ICszMyw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogCisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgpAQCAtNDQsNiArNDgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KQEAgLTc0LDYgKzc5LDcgQEAKIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAogLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVJlY29yZGVyLmphdmEKIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgorc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckxvZ1Nlc3Npb25JZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubG9nLXNlc3Npb24taWQiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tYml0cmF0ZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1JlY29yZGVyQXVkaW9DaGFubmVscyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tY2hhbm5lbHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtSZWNvcmRlckF1ZGlvU2FtcGxlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tc2FtcGxlcmF0ZSI7CkBAIC0xMTAsMTMgKzExNiwxOCBAQAogfQogCiAKLVN0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCi0gICAgOiBNZWRpYVJlY29yZGVyQmFzZShvcFBhY2thZ2VOYW1lKSwKK1N0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgY2xpZW50KQorICAgIDogTWVkaWFSZWNvcmRlckJhc2UoY2xpZW50KSwKICAgICAgIG1Xcml0ZXIoTlVMTCksCiAgICAgICBtT3V0cHV0RmQoLTEpLAogICAgICAgbUF1ZGlvU291cmNlKChhdWRpb19zb3VyY2VfdClBVURJT19TT1VSQ0VfQ05UKSwgLy8gaW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgdmFsdWUKICAgICAgIG1Qcml2YWN5U2Vuc2l0aXZlKFBSSVZBQ1lfU0VOU0lUSVZFX0RFRkFVTFQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCisgICAgICBtUlRQQ1ZPRXh0TWFwKC0xKSwKKyAgICAgIG1SVFBDVk9EZWdyZWVzKDApLAorICAgICAgbVJUUFNvY2tEc2NwKDApLAorICAgICAgbVJUUFNvY2tOZXR3b3JrKDApLAorICAgICAgbUxhc3RTZXFObygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCkBAIC0xMjUsNiArMTM2LDcgQEAKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogCisgICAgbU1ldHJpY3NJdGVtID0gTlVMTDsKICAgICBtQW5hbHl0aWNzRGlydHkgPSBmYWxzZTsKICAgICByZXNldCgpOwogfQpAQCAtMTQ3LDcgKzE1OSw5IEBACiAKICAgICAvLyB3ZSBydW4gYXMgcGFydCBvZiB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2U7IHdoYXQgd2UgcmVhbGx5IHdhbnQgdG8KICAgICAvLyBrbm93IGlzIHRoZSBhcHAgd2hpY2ggcmVxdWVzdGVkIHRoZSByZWNvcmRpbmcuCi0gICAgbU1ldHJpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CisgICAgbU1ldHJpY3NJdGVtLT5zZXRVaWQoVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXR0cmlidXRpb25Tb3VyY2UudWlkKSkpOworCisgICAgbU1ldHJpY3NJdGVtLT5zZXRDU3RyaW5nKGtSZWNvcmRlckxvZ1Nlc3Npb25JZCwgbUxvZ1Nlc3Npb25JZC5jX3N0cigpKTsKIAogICAgIC8vIHBvcHVsYXRlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcmF3IGZpZWxkcy4KIApAQCAtMTk5LDEwICsyMTMsMTIgQEAKIHZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Zmx1c2hBbmRSZXNldE1ldHJpY3MoYm9vbCByZWluaXRpYWxpemUpIHsKICAgICBBTE9HVigiZmx1c2hBbmRSZXNldE1ldHJpY3MiKTsKICAgICAvLyBmbHVzaCBhbnl0aGluZyB3ZSBoYXZlLCBtYXliZSBzZXR1cCBhIG5ldyByZWNvcmQKLSAgICBpZiAobUFuYWx5dGljc0RpcnR5ICYmIG1NZXRyaWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIHVwZGF0ZU1ldHJpY3MoKTsKLSAgICAgICAgaWYgKG1NZXRyaWNzSXRlbS0+Y291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIG1NZXRyaWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgIGlmIChtTWV0cmljc0l0ZW0gIT0gTlVMTCkgeworICAgICAgICBpZiAobUFuYWx5dGljc0RpcnR5KSB7CisgICAgICAgICAgICB1cGRhdGVNZXRyaWNzKCk7CisgICAgICAgICAgICBpZiAobU1ldHJpY3NJdGVtLT5jb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgIG1NZXRyaWNzSXRlbS0+c2VsZnJlY29yZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSBtTWV0cmljc0l0ZW07CiAgICAgICAgIG1NZXRyaWNzSXRlbSA9IE5VTEw7CkBAIC01NjcsNiArNTgzLDMyIEBACiAgICAgLy8gcmFuZ2UgdGhhdCBhIHNwZWNpZmljIGVuY29kZXIgc3VwcG9ydHMuIFRoZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZQogICAgIC8vIHRoZSB0YXJnZXQgYW5kIHJlcXVlc3RlZCBiaXQgcmF0ZSB3aWxsIE5PVCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLgogICAgIG1WaWRlb0JpdFJhdGUgPSBiaXRSYXRlOworCisgICAgLy8gQSBuZXcgYml0cmF0ZShUTU1CUikgc2hvdWxkIGJlIGFwcGxpZWQgb24gcnVudGltZSBhcyB3ZWxsIGlmIE91dHB1dEZvcm1hdCBpcyBSVFBfQVZQCisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKSB7CisgICAgICAgIC8vIFJlZ3VsYXIgSSBmcmFtZXMgbWF5IG92ZXJsb2FkIHRoZSBuZXR3b3JrIHNvIHdlIHJlZHVjZSB0aGUgYml0cmF0ZSB0byBhbGxvdworICAgICAgICAvLyBtYXJnaW5zIGZvciB0aGUgSSBmcmFtZSBvdmVycnVucy4KKyAgICAgICAgLy8gU3RpbGwgc2VuZCByZXF1ZXN0ZWQgYml0cmF0ZSAoVE1NQlIpIGluIHRoZSByZXBseSAoVE1NQk4pLgorICAgICAgICBjb25zdCBmbG9hdCBjb2VmZmljaWVudCA9IDAuOGY7CisgICAgICAgIG1WaWRlb0JpdFJhdGUgPSAoYml0UmF0ZSAqIGNvZWZmaWNpZW50KSAvIDEwMDAgKiAxMDAwOworICAgIH0KKyAgICBpZiAobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX1JUUF9BVlAgJiYgbVN0YXJ0ZWQgJiYgbVBhdXNlU3RhcnRUaW1lVXMgPT0gMCkgeworICAgICAgICBtVmlkZW9FbmNvZGVyU291cmNlLT5zZXRFbmNvZGluZ0JpdHJhdGUobVZpZGVvQml0UmF0ZSk7CisgICAgICAgIEFSVFBXcml0ZXIqIHJ0cFdyaXRlciAgPSBzdGF0aWNfY2FzdDxBUlRQV3JpdGVyKj4obVdyaXRlci5nZXQoKSk7CisgICAgICAgIHJ0cFdyaXRlci0+c2V0VE1NQk5JbmZvKG1PcHBvbmVudElELCBiaXRSYXRlKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVmlkZW9CaXRSYXRlTW9kZShpbnQzMl90IGJpdFJhdGVNb2RlKSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9CaXRSYXRlTW9kZTogJWQiLCBiaXRSYXRlTW9kZSk7CisgICAgLy8gVE9ETzogY2xhcmlmeSB3aGF0IGJpdHJhdGUgbW9kZSBvZiAtMSBpcyBhcyB0aGVzZSBzdGFydCBmcm9tIDAKKyAgICBpZiAoYml0UmF0ZU1vZGUgPCAtMSkgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgdmlkZW8gYml0cmF0ZSBtb2RlOiAlZCIsIGJpdFJhdGVNb2RlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVZpZGVvQml0UmF0ZU1vZGUgPSBiaXRSYXRlTW9kZTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc3Niw2ICs4MTgsMTEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cExvY2FsSXAoY29uc3QgU3RyaW5nOCAmbG9jYWxJcCkgeworICAgIEFMT0dWKCJzZXRQYXJhbVZpZGVvTG9jYWxJcDogJXMiLCBsb2NhbElwLnN0cmluZygpKTsKKworICAgIG1Mb2NhbElwLnNldFRvKGxvY2FsSXAuc3RyaW5nKCkpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1SdHBMb2NhbFBvcnQoaW50MzJfdCBsb2NhbFBvcnQpIHsKKyAgICBBTE9HVigic2V0UGFyYW1WaWRlb0xvY2FsUG9ydDogJWQiLCBsb2NhbFBvcnQpOworCisgICAgbUxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtUnRwUmVtb3RlSXAoY29uc3QgU3RyaW5nOCAmcmVtb3RlSXApIHsKKyAgICBBTE9HVigic2V0UGFyYW1WaWRlb1JlbW90ZUlwOiAlcyIsIHJlbW90ZUlwLnN0cmluZygpKTsKKworICAgIG1SZW1vdGVJcC5zZXRUbyhyZW1vdGVJcC5zdHJpbmcoKSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVJ0cFJlbW90ZVBvcnQoaW50MzJfdCByZW1vdGVQb3J0KSB7CisgICAgQUxPR1YoInNldFBhcmFtVmlkZW9SZW1vdGVQb3J0OiAlZCIsIHJlbW90ZVBvcnQpOworCisgICAgbVJlbW90ZVBvcnQgPSByZW1vdGVQb3J0OworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1TZWxmSUQoaW50MzJfdCBzZWxmSUQpIHsKKyAgICBBTE9HVigic2V0UGFyYW1TZWxmSUQ6ICV4Iiwgc2VsZklEKTsKKworICAgIG1TZWxmSUQgPSBzZWxmSUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVZpZGVvT3Bwb25lbnRJRChpbnQzMl90IG9wcG9uZW50SUQpIHsKKyAgICBtT3Bwb25lbnRJRCA9IG9wcG9uZW50SUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpIHsKKyAgICBBTE9HVigic2V0UGFyYW1QYXlsb2FkVHlwZTogJWQiLCBwYXlsb2FkVHlwZSk7CisKKyAgICBtUGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKKworICAgIGlmIChtU3RhcnRlZCAmJiBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICBtV3JpdGVyLT51cGRhdGVQYXlsb2FkVHlwZShtUGF5bG9hZFR5cGUpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UlRQQ1ZPRXh0TWFwKGludDMyX3QgZXh0bWFwKSB7CisgICAgQUxPR1YoInNldFJ0cEN2b0V4dE1hcDogJWQiLCBleHRtYXApOworCisgICAgbVJUUENWT0V4dE1hcCA9IGV4dG1hcDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFJUUENWT0RlZ3JlZXMoaW50MzJfdCBjdm9EZWdyZWVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigic2V0UnRwQ3ZvRGVncmVlczogJWQiLCBjdm9EZWdyZWVzKTsKKworICAgIG1SVFBDVk9EZWdyZWVzID0gY3ZvRGVncmVlczsKKworICAgIGlmIChtU3RhcnRlZCAmJiBtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICBtV3JpdGVyLT51cGRhdGVDVk9EZWdyZWVzKG1SVFBDVk9EZWdyZWVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtUnRwRHNjcChpbnQzMl90IGRzY3ApIHsKKyAgICBBTE9HVigic2V0UGFyYW1SdHBEc2NwOiAlZCIsIGRzY3ApOworCisgICAgbVJUUFNvY2tEc2NwID0gZHNjcDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKSB7CisgICAgQUxPR1YoInNldFNvY2tldE5ldHdvcms6ICVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKSBuZXR3b3JrSGFuZGxlKTsKKworICAgIG1SVFBTb2NrTmV0d29yayA9IG5ldHdvcmtIYW5kbGU7CisgICAgaWYgKG1TdGFydGVkICYmIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9SVFBfQVZQKSB7CisgICAgICAgIG1Xcml0ZXItPnVwZGF0ZVNvY2tldE5ldHdvcmsobVJUUFNvY2tOZXR3b3JrKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpyZXF1ZXN0SURSRnJhbWUoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gQkFEX1ZBTFVFOworICAgIGlmIChtVmlkZW9FbmNvZGVyU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gbVZpZGVvRW5jb2RlclNvdXJjZS0+cmVxdWVzdElEUkZyYW1lKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlcXVlc3RJRFJGcmFtZTogRW5jb2RlciBub3QgcmVhZHkiKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzggJmxvZ19zZXNzaW9uX2lkKSB7CisgICAgQUxPR1YoInNldExvZ1Nlc3Npb25JZDogJXMiLCBsb2dfc2Vzc2lvbl9pZC5zdHJpbmcoKSk7CisKKyAgICAvLyBUT0RPOiB2YWxpZGl0eSBjaGVjayB0aGF0IGxvZ19zZXNzaW9uX2lkIGlzIGEgMzItYnl0ZSBoZXggZGlnaXQuCisgICAgbUxvZ1Nlc3Npb25JZC5zZXRUbyhsb2dfc2Vzc2lvbl9pZC5zdHJpbmcoKSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbWV0ZXIoCiAgICAgICAgIGNvbnN0IFN0cmluZzggJmtleSwgY29uc3QgU3RyaW5nOCAmdmFsdWUpIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBrZXkgKCVzKSA9PiB2YWx1ZSAoJXMpIiwga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSk7CkBAIC04NDQsNiArOTkzLDExIEBACiAgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdmlkZW9fYml0cmF0ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKHZpZGVvX2JpdHJhdGUpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLWJpdHJhdGUtbW9kZSIpIHsKKyAgICAgICAgaW50MzJfdCB2aWRlb19iaXRyYXRlX21vZGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmdmlkZW9fYml0cmF0ZV9tb2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9CaXRSYXRlTW9kZSh2aWRlb19iaXRyYXRlX21vZGUpOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChrZXkgPT0gInZpZGVvLXBhcmFtLXJvdGF0aW9uLWFuZ2xlLWRlZ3JlZXMiKSB7CiAgICAgICAgIGludDMyX3QgZGVncmVlczsKICAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZkZWdyZWVzKSkgewpAQCAtODg0LDYgKzEwMzgsNjMgQEAKICAgICAgICAgaWYgKHNhZmVfc3RydG9kKHZhbHVlLnN0cmluZygpLCAmZnBzKSkgewogICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtQ2FwdHVyZUZwcyhmcHMpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1sb2NhbC1pcCIpIHsKKyAgICAgICAgcmV0dXJuIHNldFBhcmFtUnRwTG9jYWxJcCh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1sb2NhbC1wb3J0IikgeworICAgICAgICBpbnQzMl90IGxvY2FsUG9ydDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZsb2NhbFBvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1SdHBMb2NhbFBvcnQobG9jYWxQb3J0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcmVtb3RlLWlwIikgeworICAgICAgICByZXR1cm4gc2V0UGFyYW1SdHBSZW1vdGVJcCh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1yZW1vdGUtcG9ydCIpIHsKKyAgICAgICAgaW50MzJfdCByZW1vdGVQb3J0OworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnJlbW90ZVBvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1SdHBSZW1vdGVQb3J0KHJlbW90ZVBvcnQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZWxmLWlkIikgeworICAgICAgICBpbnQzMl90IHNlbGZJRDsKKyAgICAgICAgaW50NjRfdCB0ZW1wOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRlbXApKSB7CisgICAgICAgICAgICBzZWxmSUQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0ZW1wKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVNlbGZJRChzZWxmSUQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1vcHBvbmVudC1pZCIpIHsKKyAgICAgICAgaW50MzJfdCBvcG5JZDsKKyAgICAgICAgaW50NjRfdCB0ZW1wOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRlbXApKSB7CisgICAgICAgICAgICBvcG5JZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHRlbXApOworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtVmlkZW9PcHBvbmVudElEKG9wbklkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcGF5bG9hZC10eXBlIikgeworICAgICAgICBpbnQzMl90IHBheWxvYWRUeXBlOworICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnBheWxvYWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtUGF5bG9hZFR5cGUocGF5bG9hZFR5cGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1leHQtY3ZvLWV4dG1hcCIpIHsKKyAgICAgICAgaW50MzJfdCBleHRtYXA7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmZXh0bWFwKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFJUUENWT0V4dE1hcChleHRtYXApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1leHQtY3ZvLWRlZ3JlZXMiKSB7CisgICAgICAgIGludDMyX3QgZGVncmVlczsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZkZWdyZWVzKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFJUUENWT0RlZ3JlZXMoZGVncmVlcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tcmVxdWVzdC1pLWZyYW1lIikgeworICAgICAgICByZXR1cm4gcmVxdWVzdElEUkZyYW1lKCk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZXQtc29ja2V0LWRzY3AiKSB7CisgICAgICAgIGludDMyX3QgZHNjcDsKKyAgICAgICAgaWYgKHNhZmVfc3RydG9pMzIodmFsdWUuc3RyaW5nKCksICZkc2NwKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldFBhcmFtUnRwRHNjcChkc2NwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tc2V0LXNvY2tldC1uZXR3b3JrIikgeworICAgICAgICBpbnQ2NF90IG5ldHdvcmtIYW5kbGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTY0KHZhbHVlLnN0cmluZygpLCAmbmV0d29ya0hhbmRsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRTb2NrZXROZXR3b3JrKG5ldHdvcmtIYW5kbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChrZXkgPT0gImxvZy1zZXNzaW9uLWlkIikgeworICAgICAgICByZXR1cm4gc2V0TG9nU2Vzc2lvbklkKHZhbHVlKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgic2V0UGFyYW1ldGVyOiBmYWlsZWQgdG8gZmluZCBrZXkgJXMiLCBrZXkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTkzMiw3ICsxMTQzLDkgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0Q2xpZW50TmFtZShjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSkgewotICAgIG1DbGllbnROYW1lID0gY2xpZW50TmFtZTsKKworICAgIG1BdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9TdHJpbmcxNl9zdHJpbmcoY2xpZW50TmFtZSkpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtOTQ0LDEwICsxMTU3LDYgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIC8vIEdldCBVSUQgYW5kIFBJRCBoZXJlIGZvciBwZXJtaXNzaW9uIGNoZWNraW5nCi0gICAgbUNsaWVudFVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBtQ2xpZW50UGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7CiAKICAgICBzd2l0Y2ggKG1PdXRwdXRGb3JtYXQpIHsKQEAgLTEwNTAsNiArMTI1OSwxNyBAQAogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlUaW1lLCBzdGFydFRpbWVVcyk7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2VsZklELCBtU2VsZklEKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlQYXlsb2FkVHlwZSwgbVBheWxvYWRUeXBlKTsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlTb2NrZXROZXR3b3JrLCBtUlRQU29ja05ldHdvcmspOworICAgICAgICAgICAgaWYgKG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cEV4dE1hcCwgbVJUUENWT0V4dE1hcCk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cEN2b0RlZ3JlZXMsIG1SVFBDVk9EZWdyZWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUlRQU29ja0RzY3AgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVJ0cERzY3AsIG1SVFBTb2NrRHNjcCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1ldGEuZ2V0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTMsNyArMTMzMyw3IEBACiAgICAgaWYgKG1Qcml2YWN5U2Vuc2l0aXZlID09IFBSSVZBQ1lfU0VOU0lUSVZFX0RFRkFVTFQpIHsKICAgICAgICAgaWYgKGF0dHIuc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OCiAgICAgICAgICAgICAgICAgfHwgYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0NBTUNPUkRFUikgewotICAgICAgICAgICAgYXR0ci5mbGFncyB8PSBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURTsKKyAgICAgICAgICAgIGF0dHIuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KGF0dHIuZmxhZ3MgfCBBVURJT19GTEFHX0NBUFRVUkVfUFJJVkFURSk7CiAgICAgICAgICAgICBtUHJpdmFjeVNlbnNpdGl2ZSA9IFBSSVZBQ1lfU0VOU0lUSVZFX0VOQUJMRUQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUHJpdmFjeVNlbnNpdGl2ZSA9IFBSSVZBQ1lfU0VOU0lUSVZFX0RJU0FCTEVEOwpAQCAtMTEyOSwxOSArMTM0OSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Qcml2YWN5U2Vuc2l0aXZlID09IFBSSVZBQ1lfU0VOU0lUSVZFX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIGF0dHIuZmxhZ3MgfD0gQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEU7CisgICAgICAgICAgICBhdHRyLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihhdHRyLmZsYWdzIHwgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8QXVkaW9Tb3VyY2U+IGF1ZGlvU291cmNlID0KICAgICAgICAgbmV3IEF1ZGlvU291cmNlKAogICAgICAgICAgICAgICAgICZhdHRyLAotICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICBzb3VyY2VTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxzLAogICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIG1DbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgbUNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOwpAQCAtMTMzMCw3ICsxNTQ4LDcgQEAKICAgICAgICAgbVZpZGVvRW5jb2RlclNvdXJjZSA9IHNvdXJjZTsKICAgICB9CiAKLSAgICBtV3JpdGVyID0gbmV3IEFSVFBXcml0ZXIobU91dHB1dEZkKTsKKyAgICBtV3JpdGVyID0gbmV3IEFSVFBXcml0ZXIobU91dHB1dEZkLCBtTG9jYWxJcCwgbUxvY2FsUG9ydCwgbVJlbW90ZUlwLCBtUmVtb3RlUG9ydCwgbUxhc3RTZXFObyk7CiAgICAgbVdyaXRlci0+YWRkU291cmNlKHNvdXJjZSk7CiAgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobUxpc3RlbmVyKTsKIApAQCAtMTY2Myw2ICsxODgxLDEwIEBACiAgICAgU2l6ZSB2aWRlb1NpemU7CiAgICAgdmlkZW9TaXplLndpZHRoID0gbVZpZGVvV2lkdGg7CiAgICAgdmlkZW9TaXplLmhlaWdodCA9IG1WaWRlb0hlaWdodDsKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QobUF0dHJpYnV0aW9uU291cmNlLnVpZCkpOworICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CisgICAgU3RyaW5nMTYgY2xpZW50TmFtZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgIGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KG1BdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS52YWx1ZV9vcigiIikpKTsKICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgaWYgKCEobUNhcHR1cmVGcHMgPiAwLikpIHsKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1DYXB0dXJlRnBzIHZhbHVlOiAlbGYiLCBtQ2FwdHVyZUZwcyk7CkBAIC0xNjcwLDEzICsxODkyLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gQ2FtZXJhU291cmNlVGltZUxhcHNlOjpDcmVhdGVGcm9tQ2FtZXJhKAotICAgICAgICAgICAgICAgIG1DYW1lcmEsIG1DYW1lcmFQcm94eSwgbUNhbWVyYUlkLCBtQ2xpZW50TmFtZSwgbUNsaWVudFVpZCwgbUNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhLCBtQ2FtZXJhUHJveHksIG1DYW1lcmFJZCwgY2xpZW50TmFtZSwgdWlkLCBwaWQsCiAgICAgICAgICAgICAgICAgdmlkZW9TaXplLCBtRnJhbWVSYXRlLCBtUHJldmlld1N1cmZhY2UsCiAgICAgICAgICAgICAgICAgc3RkOjpsbHJvdW5kKDFlNiAvIG1DYXB0dXJlRnBzKSk7CiAgICAgICAgICpjYW1lcmFTb3VyY2UgPSBtQ2FtZXJhU291cmNlVGltZUxhcHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgICpjYW1lcmFTb3VyY2UgPSBDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEoCi0gICAgICAgICAgICAgICAgbUNhbWVyYSwgbUNhbWVyYVByb3h5LCBtQ2FtZXJhSWQsIG1DbGllbnROYW1lLCBtQ2xpZW50VWlkLCBtQ2xpZW50UGlkLAorICAgICAgICAgICAgICAgIG1DYW1lcmEsIG1DYW1lcmFQcm94eSwgbUNhbWVyYUlkLCBjbGllbnROYW1lLCB1aWQsIHBpZCwKICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIG1GcmFtZVJhdGUsCiAgICAgICAgICAgICAgICAgbVByZXZpZXdTdXJmYWNlKTsKICAgICB9CkBAIC0xNzg0LDcgKzIwMDYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfUlRQX0FWUCkgeworICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgcmF3IGltYWdlIHByb3ZpZGVkIHRvIGVuY29kZXIgbmVlZHMgdG8gYmUgcm90YXRlZC4KKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicm90YXRpb24tZGVncmVlcyIsIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgIH0KKwogICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBtVmlkZW9CaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlLW1vZGUiLCBtVmlkZW9CaXRSYXRlTW9kZSk7CiAgICAgZm9ybWF0LT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIG1GcmFtZVJhdGUpOwogICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCBtSUZyYW1lc0ludGVydmFsU2VjKTsKIApAQCAtMjEzMCw2ICsyMzU4LDcgQEAKIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKICAgICAgICAgZXJyID0gbVdyaXRlci0+c3RvcCgpOworICAgICAgICBtTGFzdFNlcU5vID0gbVdyaXRlci0+Z2V0U2VxdWVuY2VOdW0oKTsKICAgICAgICAgbVdyaXRlci5jbGVhcigpOwogICAgIH0KIApAQCAtMjIwNiw2ICsyNDM1LDggQEAKICAgICBtVmlkZW9IZWlnaHQgICA9IDE0NDsKICAgICBtRnJhbWVSYXRlICAgICA9IC0xOwogICAgIG1WaWRlb0JpdFJhdGUgID0gMTkyMDAwOworICAgIC8vIEZvbGxvd2luZyBNZWRpYUNvZGVjJ3MgZGVmYXVsdAorICAgIG1WaWRlb0JpdFJhdGVNb2RlID0gQklUUkFURV9NT0RFX1ZCUjsKICAgICBtU2FtcGxlUmF0ZSAgICA9IDgwMDA7CiAgICAgbUF1ZGlvQ2hhbm5lbHMgPSAxOwogICAgIG1BdWRpb0JpdFJhdGUgID0gMTIyMDA7CkBAIC0yMzUxLDYgKzI1ODIsMTQgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UnRwRGF0YVVzYWdlKHVpbnQ2NF90ICpieXRlcykgeworICAgIGlmIChtV3JpdGVyICE9IDApIHsKKyAgICAgICAgKmJ5dGVzID0gbVdyaXRlci0+Z2V0QWNjdW11bGF0aXZlQnl0ZXMoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CiAgICAgQUxPR1YoImR1bXAiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCmluZGV4IGE3MjViZWUuLmQ2ZGU0N2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaApAQCAtMjYsOSArMjYsMTIgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogY2xhc3MgQ2FtZXJhOwogY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwogY2xhc3MgQ2FtZXJhU291cmNlOwpAQCAtNDIsOSArNDUsMTAgQEAKIHN0cnVjdCBBTG9vcGVyOwogCiBzdHJ1Y3QgU3RhZ2VmcmlnaHRSZWNvcmRlciA6IHB1YmxpYyBNZWRpYVJlY29yZGVyQmFzZSB7Ci0gICAgZXhwbGljaXQgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSk7CisgICAgZXhwbGljaXQgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRSZWNvcmRlcigpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzggJmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvU291cmNlKGF1ZGlvX3NvdXJjZV90IGFzKTsKICAgICAgICAgICAgIHN0YXR1c190IHNldFByaXZhY3lTZW5zaXRpdmUoYm9vbCBwcml2YWN5U2Vuc2l0aXZlKSBvdmVycmlkZTsKICAgICAgICAgICAgIHN0YXR1c190IGlzUHJpdmFjeVNlbnNpdGl2ZShib29sICpwcml2YWN5U2Vuc2l0aXZlKSBjb25zdCBvdmVycmlkZTsKQEAgLTgyLDYgKzg2LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOwogICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSdHBEYXRhVXNhZ2UodWludDY0X3QgKmJ5dGVzKTsKIAogcHJpdmF0ZToKIApAQCAtOTcsOSArMTAyLDYgQEAKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJldmlld1N1cmZhY2U7CiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IG1QZXJzaXN0ZW50U3VyZmFjZTsKICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwotICAgIFN0cmluZzE2IG1DbGllbnROYW1lOwotICAgIHVpZF90IG1DbGllbnRVaWQ7Ci0gICAgcGlkX3QgbUNsaWVudFBpZDsKICAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBpbnQgbU91dHB1dEZkOwogICAgIHNwPEF1ZGlvU291cmNlPiBtQXVkaW9Tb3VyY2VOb2RlOwpAQCAtMTA5LDYgKzExMSw3IEBACiAgICAgdm9pZCBmbHVzaEFuZFJlc2V0TWV0cmljcyhib29sIHJlaW5pdGlhbGl6ZSk7CiAgICAgdm9pZCB1cGRhdGVNZXRyaWNzKCk7CiAKKyAgICBBU3RyaW5nIG1Mb2dTZXNzaW9uSWQ7CiAgICAgYXVkaW9fc291cmNlX3QgbUF1ZGlvU291cmNlOwogICAgIHByaXZhY3lfc2Vuc2l0aXZlX3QgbVByaXZhY3lTZW5zaXRpdmU7CiAgICAgdmlkZW9fc291cmNlIG1WaWRlb1NvdXJjZTsKQEAgLTExOSw2ICsxMjIsNyBAQAogICAgIGludDMyX3QgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1GcmFtZVJhdGU7CiAgICAgaW50MzJfdCBtVmlkZW9CaXRSYXRlOworICAgIGludDMyX3QgbVZpZGVvQml0UmF0ZU1vZGU7CiAgICAgaW50MzJfdCBtQXVkaW9CaXRSYXRlOwogICAgIGludDMyX3QgbUF1ZGlvQ2hhbm5lbHM7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKQEAgLTEzOCw2ICsxNDIsMTggQEAKICAgICBpbnQzMl90IG1Mb25naXR1ZGV4MTAwMDA7CiAgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0TXM7CiAgICAgaW50MzJfdCBtVG90YWxCaXRSYXRlOworICAgIFN0cmluZzggbUxvY2FsSXA7CisgICAgU3RyaW5nOCBtUmVtb3RlSXA7CisgICAgaW50MzJfdCBtTG9jYWxQb3J0OworICAgIGludDMyX3QgbVJlbW90ZVBvcnQ7CisgICAgaW50MzJfdCBtU2VsZklEOworICAgIGludDMyX3QgbU9wcG9uZW50SUQ7CisgICAgaW50MzJfdCBtUGF5bG9hZFR5cGU7CisgICAgaW50MzJfdCBtUlRQQ1ZPRXh0TWFwOworICAgIGludDMyX3QgbVJUUENWT0RlZ3JlZXM7CisgICAgaW50MzJfdCBtUlRQU29ja0RzY3A7CisgICAgaW50NjRfdCBtUlRQU29ja05ldHdvcms7CisgICAgdWludDMyX3QgbUxhc3RTZXFObzsKIAogICAgIGludDY0X3QgbUR1cmF0aW9uUmVjb3JkZWRVczsKICAgICBpbnQ2NF90IG1TdGFydGVkUmVjb3JkaW5nVXM7CkBAIC0yMDUsNiArMjIxLDcgQEAKICAgICBzdGF0dXNfdCBzZXRQYXJhbUNhcHR1cmVGcHNFbmFibGUoaW50MzJfdCB0aW1lTGFwc2VFbmFibGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtQ2FwdHVyZUZwcyhkb3VibGUgZnBzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0JpdFJhdGVNb2RlKGludDMyX3QgYml0UmF0ZU1vZGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9JRnJhbWVzSW50ZXJ2YWwoaW50MzJfdCBzZWNvbmRzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlclByb2ZpbGUoaW50MzJfdCBwcm9maWxlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RlckxldmVsKGludDMyX3QgbGV2ZWwpOwpAQCAtMjE5LDYgKzIzNiwxOCBAQAogICAgIHN0YXR1c190IHNldFBhcmFtTW92aWVUaW1lU2NhbGUoaW50MzJfdCB0aW1lU2NhbGUpOwogICAgIHN0YXR1c190IHNldFBhcmFtR2VvRGF0YUxvbmdpdHVkZShpbnQ2NF90IGxvbmdpdHVkZXgxMDAwMCk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1HZW9EYXRhTGF0aXR1ZGUoaW50NjRfdCBsYXRpdHVkZXgxMDAwMCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1SdHBMb2NhbElwKGNvbnN0IFN0cmluZzggJmxvY2FsSXApOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwTG9jYWxQb3J0KGludDMyX3QgbG9jYWxQb3J0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVJ0cFJlbW90ZUlwKGNvbnN0IFN0cmluZzggJnJlbW90ZUlwKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVJ0cFJlbW90ZVBvcnQoaW50MzJfdCByZW1vdGVQb3J0KTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVNlbGZJRChpbnQzMl90IHNlbGZJRCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb09wcG9uZW50SUQoaW50MzJfdCBvcHBvbmVudElEKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpOworICAgIHN0YXR1c190IHNldFJUUENWT0V4dE1hcChpbnQzMl90IGV4dG1hcCk7CisgICAgc3RhdHVzX3Qgc2V0UlRQQ1ZPRGVncmVlcyhpbnQzMl90IGN2b0RlZ3JlZXMpOworICAgIHN0YXR1c190IHNldFBhcmFtUnRwRHNjcChpbnQzMl90IGRzY3ApOworICAgIHN0YXR1c190IHNldFNvY2tldE5ldHdvcmsoaW50NjRfdCBuZXR3b3JrSGFuZGxlKTsKKyAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0JpdFJhdGUoKTsKICAgICB2b2lkIGNsaXBWaWRlb0ZyYW1lUmF0ZSgpOwogICAgIHZvaWQgY2xpcFZpZGVvRnJhbWVXaWR0aCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAKaW5kZXggNzFmYTUwYi4uMTlmYzE3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTQgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKaW5kZXggNDM2Y2IzMS4uMWNiZDhhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCkBAIC02MCw3ICs2MCw3IEBACiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKIAogLy8gd2hlbiB0aGUgY2hhbm5lbCBtYXNrIGlzbid0IGtub3duLCB1c2UgdGhlIGNoYW5uZWwgY291bnQgdG8gZGVyaXZlIGEgbWFzayBpbiBBdWRpb1Npbms6Om9wZW4oKQotI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAorI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgQVVESU9fQ0hBTk5FTF9OT05FCiAKIC8vIGR1cmF0aW9uIGJlbG93IHdoaWNoIHdlIGRvIG5vdCBhbGxvdyBkZWVwIGF1ZGlvIGJ1ZmZlcmluZwogI2RlZmluZSBBVURJT19TSU5LX01JTl9ERUVQX0JVRkZFUl9EVVJBVElPTl9VUyA1MDAwMDAwCkBAIC0xMDgsNiArMTA4LDcgQEAKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRTYW1wbGVSYXRlKCkgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRGbGFncygpIGNvbnN0ID0gMDsKIAogICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgIndyaXRlIiBBUEkgYmVsb3cgdG8gc3VibWl0CiAgICAgICAgIC8vIGF1ZGlvIGRhdGEuCkBAIC0xODMsNiArMTg0LDEwIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgLyogcnRwUGFyYW1zICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICAvLyBwYXNzIHRoZSBidWZmZXJlZCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIHRvIHRoZSBtZWRpYSBwbGF5ZXIgc2VydmljZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSA9IDA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCmluZGV4IDY4NGJhMmUuLmFmOWNmNDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suY3BwCkBAIC01MiwxOCArNTIsMTkgQEAKICAgICAgICAgICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3QgZ2V0IHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CisgICAgICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PG9zOjpJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOwogICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwogICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiQVdha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBQT1dFUk1BTkFHRVJfUEFSVElBTF9XQUtFX0xPQ0ssCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJBV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIiksCisgICAgICAgICAgICAgICAgICAgIHt9IC8qIHdvcmtTb3VyY2UgKi8sIHt9IC8qIGhpc3RvcnlUYWcgKi8sIC0xIC8qIGRpc3BsYXlJZCAqLyk7CiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CiAgICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BV2FrZUxvY2suaAppbmRleCAzMjNlN2Q3Li44YWEzYjQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQVdha2VMb2NrLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FXYWtlTG9jay5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEFfV0FLRUxPQ0tfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvb3MvSVBvd2VyTWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzcsNyArMzcsNyBAQAogICAgIHZpcnR1YWwgfkFXYWtlTG9jaygpOwogCiBwcml2YXRlOgotICAgIHNwPElQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7CisgICAgc3A8b3M6OklQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7CiAgICAgc3A8SUJpbmRlcj4gICAgICAgbVdha2VMb2NrVG9rZW47CiAgICAgdWludDMyX3QgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKaW5kZXggMzJjOTdjZi4uNmQzMzhkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9udXBsYXllcl9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbnVwbGF5ZXJfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogCiAgICAgc3JjczogWwpAQCAtMTQsNiArMzMsNyBAQAogICAgICAgICAiTnVQbGF5ZXJSZW5kZXJlci5jcHAiLAogICAgICAgICAiTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAiLAogICAgICAgICAiUlRTUFNvdXJjZS5jcHAiLAorICAgICAgICAiUlRQU291cmNlLmNwcCIsCiAgICAgICAgICJTdHJlYW1pbmdTb3VyY2UuY3BwIiwKICAgICBdLAogCkBAIC0zMCw2ICs1MCw3IEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZCIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKaW5kZXggYzFjNGI1NS4uOWFlN2RkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXJEcml2ZXIuaCIKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKKyNpbmNsdWRlICJSVFBTb3VyY2UuaCIKICNpbmNsdWRlICJSVFNQU291cmNlLmgiCiAjaW5jbHVkZSAiU3RyZWFtaW5nU291cmNlLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZS5oIgpAQCAtMzY4LDYgKzM2OSwxOCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYyhjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBBTE9HRCgic2V0RGF0YVNvdXJjZUFzeW5jIGZvciBSVFAgPSAlcyIsIHJ0cFBhcmFtcy5zdHJpbmcoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CisgICAgc3A8U291cmNlPiBzb3VyY2UgPSBuZXcgUlRQU291cmNlKG5vdGlmeSwgcnRwUGFyYW1zKTsKKworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+cG9zdCgpOworICAgIG1EYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfUlRQOworfQorCiB2b2lkIE51UGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7CiAgICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwogCkBAIC04NTgsMTAgKzg3MSwxMiBAQAogICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCi0gICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIGFuZCBkaXJlY3QgbW9kZXMuCisgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkcywgcmVzdGFydCBhdWRpbyB0byBmYWxsYmFjayB0byBzdXBwb3J0ZWQgcGF0aHMKKyAgICAgICAgICAgICAgICBib29sIGF1ZGlvRGlyZWN0T3V0cHV0ID0gKG1BdWRpb1NpbmstPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7CisgICAgICAgICAgICAgICAgaWYgKChtT2ZmbG9hZEF1ZGlvIHx8IGF1ZGlvRGlyZWN0T3V0cHV0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgIT0gMS5mKSB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25VcyA9IG1QcmV2aW91c1NlZWtUaW1lVXM7CkBAIC0xNjg5LDYgKzE3MDQsMTIgQEAKICAgICB1cGRhdGVSZWJ1ZmZlcmluZ1RpbWVyKGZhbHNlIC8qIHN0b3BwaW5nICovLCBmYWxzZSAvKiBleGl0aW5nICovKTsKIH0KIAordm9pZCBOdVBsYXllcjo6c2V0VGFyZ2V0Qml0cmF0ZShpbnQgYml0cmF0ZSkgeworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+c2V0VGFyZ2V0Qml0cmF0ZShiaXRyYXRlKTsKKyAgICB9Cit9CisKIHZvaWQgTnVQbGF5ZXI6Om9uUGF1c2UoKSB7CiAKICAgICB1cGRhdGVQbGF5YmFja1RpbWVyKHRydWUgLyogc3RvcHBpbmcgKi8sICJvblBhdXNlIik7CkBAIC0xOTE1LDYgKzE5MzYsMTEgQEAKIAogICAgIGZvcm1hdC0+c2V0SW50MzIoInByaW9yaXR5IiwgMCAvKiByZWFsdGltZSAqLyk7CiAKKyAgICBpZiAobURhdGFTb3VyY2VUeXBlID09IERBVEFfU09VUkNFX1RZUEVfUlRQKSB7CisgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IHNldCBkZWNvZGVyIGVycm9yIGZyZWUgb24gc3RyZWFtIGNvcnJ1cHQuIik7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvcnJ1cHQtZnJlZSIsIHRydWUpOworICAgIH0KKwogICAgIGlmICghYXVkaW8pIHsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwpAQCAtMjcxNSw2ICsyNzQxLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdElNU1J4Tm90aWNlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gSU1TUnhOb3RpY2U7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJtZXNzYWdlIiwgJklNU1J4Tm90aWNlKSk7CisgICAgICAgICAgICBzZW5kSU1TUnhOb3RpY2UoSU1TUnhOb3RpY2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CkBAIC0yODE3LDExICsyODUxLDExOSBAQAogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6c2VuZElNU1J4Tm90aWNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50MzJfdCBwYXlsb2FkVHlwZTsKKworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwYXlsb2FkLXR5cGUiLCAmcGF5bG9hZFR5cGUpKTsKKworICAgIGludDMyX3QgcnRwU2VxID0gMCwgcnRwVGltZSA9IDA7CisgICAgaW50NjRfdCBudHBUaW1lID0gMCwgcmVjdlRpbWVVcyA9IDA7CisKKyAgICBQYXJjZWwgaW47CisgICAgaW4ud3JpdGVJbnQzMihwYXlsb2FkVHlwZSk7CisKKyAgICBzd2l0Y2ggKHBheWxvYWRUeXBlKSB7CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRQX0ZJUlNUX1BBQ0tFVDoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC10aW1lIiwgJnJ0cFRpbWUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydHAtc2VxLW51bSIsICZydHBTZXEpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJyZWN2LXRpbWUtdXMiLCAmcmVjdlRpbWVVcykpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihydHBUaW1lKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocnRwU2VxKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyA+PiAzMik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHJlY3ZUaW1lVXMgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRDUF9GSVJTVF9QQUNLRVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJyZWN2LXRpbWUtdXMiLCAmcmVjdlRpbWVVcykpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihyZWN2VGltZVVzID4+IDMyKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyAmIDB4RkZGRkZGRkYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVENQX1NSOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRwLXRpbWUiLCAmcnRwVGltZSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm50cC10aW1lIiwgJm50cFRpbWUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJyZWN2LXRpbWUtdXMiLCAmcmVjdlRpbWVVcykpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihydHBUaW1lKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIobnRwVGltZSA+PiAzMik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKG50cFRpbWUgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyA+PiAzMik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHJlY3ZUaW1lVXMgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRDUF9UU0ZCOiAgIC8vIFJUQ1AgVFNGQgorICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUQ1BfUFNGQjogICAvLyBSVENQIFBTRkIKKyAgICAgICAgY2FzZSBBUlRQU291cmNlOjpSVFBfQVVUT0RPV046CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmVlZGJhY2tUeXBlLCBpZDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmZWVkYmFjay10eXBlIiwgJmZlZWRiYWNrVHlwZSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInNlbmRlciIsICZpZCkpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihmZWVkYmFja1R5cGUpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICBpZiAocGF5bG9hZFR5cGUgPT0gQVJUUFNvdXJjZTo6UlRDUF9UU0ZCKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRyYXRlOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJiaXQtcmF0ZSIsICZiaXRyYXRlKSk7CisgICAgICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihiaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRQX1FVQUxJVFk6CisgICAgICAgIGNhc2UgQVJUUFNvdXJjZTo6UlRQX1FVQUxJVFlfRU1DOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGZlZWRiYWNrVHlwZSwgYml0cmF0ZTsKKyAgICAgICAgICAgIGludDMyX3QgaGlnaGVzdFNlcU51bSwgYmFzZVNlcU51bSwgcHJldkV4cGVjdGVkOworICAgICAgICAgICAgaW50MzJfdCBudW1CdWZSZWN2LCBwcmV2TnVtQnVmUmVjdjsKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZXN0UnRwVGltZSwgamJUaW1lTXMsIHJ0cFJ0Y3BTclRpbWVHYXBNczsKKyAgICAgICAgICAgIGludDY0X3QgcmVjdlRpbWVVczsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmZWVkYmFjay10eXBlIiwgJmZlZWRiYWNrVHlwZSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJpdC1yYXRlIiwgJmJpdHJhdGUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoaWdoZXN0LXNlcS1udW0iLCAmaGlnaGVzdFNlcU51bSkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJhc2Utc2VxLW51bSIsICZiYXNlU2VxTnVtKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicHJldi1leHBlY3RlZCIsICZwcmV2RXhwZWN0ZWQpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJudW0tYnVmLXJlY3YiLCAmbnVtQnVmUmVjdikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInByZXYtbnVtLWJ1Zi1yZWN2IiwgJnByZXZOdW1CdWZSZWN2KSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibGF0ZXN0LXJ0cC10aW1lIiwgJmxhdGVzdFJ0cFRpbWUpKTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJyZWN2LXRpbWUtdXMiLCAmcmVjdlRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC1qaXR0ZXItdGltZS1tcyIsICZqYlRpbWVNcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJ0cC1ydGNwc3ItdGltZS1nYXAtbXMiLCAmcnRwUnRjcFNyVGltZUdhcE1zKSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGZlZWRiYWNrVHlwZSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGJpdHJhdGUpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihoaWdoZXN0U2VxTnVtKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoYmFzZVNlcU51bSk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHByZXZFeHBlY3RlZCk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKG51bUJ1ZlJlY3YpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihwcmV2TnVtQnVmUmVjdik7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKGxhdGVzdFJ0cFRpbWUpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihyZWN2VGltZVVzID4+IDMyKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIocmVjdlRpbWVVcyAmIDB4RkZGRkZGRkYpOworICAgICAgICAgICAgaW4ud3JpdGVJbnQzMihqYlRpbWVNcyk7CisgICAgICAgICAgICBpbi53cml0ZUludDMyKHJ0cFJ0Y3BTclRpbWVHYXBNcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFSVFBTb3VyY2U6OlJUUF9DVk86CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgY3ZvOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImN2byIsICZjdm8pKTsKKyAgICAgICAgICAgIGluLndyaXRlSW50MzIoY3ZvKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lNU19SWF9OT1RJQ0UsIDAsIDAsICZpbik7Cit9CisKIGNvbnN0IGNoYXIgKk51UGxheWVyOjpnZXREYXRhU291cmNlVHlwZSgpIHsKICAgICBzd2l0Y2ggKG1EYXRhU291cmNlVHlwZSkgewogICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOgogICAgICAgICAgICAgcmV0dXJuICJIVFRQTGl2ZSI7CiAKKyAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX1JUUDoKKyAgICAgICAgICAgIHJldHVybiAiUlRQIjsKKwogICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfUlRTUDoKICAgICAgICAgICAgIHJldHVybiAiUlRTUCI7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKaW5kZXggZWY0MzU0Yy4uYWRiNzA3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmgKQEAgLTUxLDYgKzUxLDggQEAKIAogICAgIHZvaWQgc2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UpOwogCisgICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKKwogICAgIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CiAgICAgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7CiAKQEAgLTEwMCw2ICsxMDIsOCBAQAogCiAgICAgdm9pZCB1cGRhdGVJbnRlcm5hbFRpbWVycygpOwogCisgICAgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludCBiaXRyYXRlIC8qIGJwcyAqLyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcigpOwogCkBAIC0xMTcsNiArMTIxLDcgQEAKICAgICBzdHJ1Y3QgR2VuZXJpY1NvdXJjZTsKICAgICBzdHJ1Y3QgSFRUUExpdmVTb3VyY2U7CiAgICAgc3RydWN0IFJlbmRlcmVyOworICAgIHN0cnVjdCBSVFBTb3VyY2U7CiAgICAgc3RydWN0IFJUU1BTb3VyY2U7CiAgICAgc3RydWN0IFN0cmVhbWluZ1NvdXJjZTsKICAgICBzdHJ1Y3QgQWN0aW9uOwpAQCAtMjU3LDYgKzI2Miw3IEBACiAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAogICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFAsCiAgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELApAQCAtMzM0LDYgKzM0MCw3IEBACiAgICAgdm9pZCBzZW5kU3VidGl0bGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgYmFzZUluZGV4KTsKICAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgdm9pZCBzZW5kSU1TUnhOb3RpY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdm9pZCB3cml0ZVRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggZjczNDQzOS4uMmMxZjE1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTMwMiw3ICszMDIsNyBAQAogICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIChzdXJmYWNlPSVwKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1TdXJmYWNlLmdldCgpKTsKIAogICAgIG1Db2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5VHlwZSgKLSAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbWltZS5jX3N0cigpLCBmYWxzZSAvKiBlbmNvZGVyICovLCBOVUxMIC8qIGVyciAqLywgbVBpZCwgbVVpZCk7CisgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLywgTlVMTCAvKiBlcnIgKi8sIG1QaWQsIG1VaWQsIGZvcm1hdCk7CiAgICAgaW50MzJfdCBzZWN1cmUgPSAwOwogICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigic2VjdXJlIiwgJnNlY3VyZSkgJiYgc2VjdXJlICE9IDApIHsKICAgICAgICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7CkBAIC03NDYsOSArNzQ2LDE1IEBACiAKICAgICBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKIAorICAgIGludDY0X3QgZnJhbWVJbmRleDsKKyAgICBib29sIGZyYW1lSW5kZXhGb3VuZCA9IGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImZyYW1lSW5kZXgiLCAmZnJhbWVJbmRleCk7CisKICAgICBidWZmZXItPnNldFJhbmdlKG9mZnNldCwgc2l6ZSk7CiAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGlmIChmcmFtZUluZGV4Rm91bmQpIHsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJmcmFtZUluZGV4IiwgZnJhbWVJbmRleCk7CisgICAgfQogCiAgICAgYm9vbCBlb3MgPSBmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IENPREVDQ09ORklHIG9yIFNZTkNGUkFNRSBmb3IgZGVjb2RlcgpAQCAtMTA1MCw3ICsxMDU2LDcgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKKyAgICAgICAgaW50MzJfdCBlb3MsIGNzZCwgY3ZvOwogICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IFNZTkNGUkFNRSBmb3IgZGVjb2RlcgogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zKSB7CiAgICAgICAgICAgICBmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CkBAIC0xMDU4LDYgKzEwNjQsMjQgQEAKICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsIChpbnQzMl90KikmY3ZvKSkgeworICAgICAgICAgICAgQUxPR1YoIlslc10gY3ZvKCVkKSBmb3VuZCBhdCAlbGxkIHVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY3ZvLCAobG9uZyBsb25nKXRpbWVVcyk7CisgICAgICAgICAgICBzd2l0Y2ggKGN2bykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBNZWRpYUNvZGVjOjpDVk9fREVHUkVFXzE4MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIE1lZGlhQ29kZWM6OkNWT19ERUdSRUVfMjcwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBNb2R1bGFyIERSTQogICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmID0gTlVMTDsKICAgICAgICAgTnVQbGF5ZXJEcm06OkNyeXB0b0luZm8gKmNyeXB0SW5mbyA9IE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBkYzE0NGIyLi4yYTUwZmMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTIxOCw2ICsyMTgsMjYgQEAKICAgICByZXR1cm4gbUFzeW5jUmVzdWx0OwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcCkgcnRwIHNvdXJjZSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CisKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMocnRwUGFyYW1zKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKKwogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoCiAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcikgewogICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwpAQCAtNzk3LDcgKzgxNywxMSBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0UGFyYW1ldGVyKAotICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7CisgICAgICAgIGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCApIHsKKyAgICBpZiAoa2V5ID09IEtFWV9QQVJBTUVURVJfUlRQX0FUVFJJQlVURVMpIHsKKyAgICAgICAgbVBsYXllci0+c2V0VGFyZ2V0Qml0cmF0ZShyZXF1ZXN0LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggZjRiMTk2OC4uNTVhMGZhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTQzLDYgKzQzLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgU3RyaW5nOCYgcnRwUGFyYW1zKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCBjMzBmMDQ4Li40YTY1ZjcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC05MjIsNiArOTIyLDExIEBACiAgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKKyAgICAgICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmlsbEF1ZGlvQnVmZmVyOiByZXNldCBuZWdhdGl2ZSBtZWRpYSB0aW1lICUuMmYgc2VjcyB0byB6ZXJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KQEAgLTE5MjgsMTEgKzE5MzMsMTIgQEAKICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSk7CiAKLSAgICBpbnQzMl90IGNoYW5uZWxNYXNrOwotICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImNoYW5uZWwtbWFzayIsICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgLy8gc2lnbmFsIHRvIHRoZSBBdWRpb1NpbmsgdG8gZGVyaXZlIHRoZSBtYXNrIGZyb20gY291bnQuCi0gICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgIH0KKyAgICBpbnQzMl90IHJhd0NoYW5uZWxNYXNrOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmcmF3Q2hhbm5lbE1hc2spID8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHJhd0NoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAvLyBzaWduYWwgdG8gdGhlIEF1ZGlvU2luayB0byBkZXJpdmUgdGhlIG1hc2sgZnJvbSBjb3VudC4KKyAgICAgICAgICAgICAgICAgICAgOiBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CiAKICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKQEAgLTE5NTYsNyArMTk2Miw3IEBACiAgICAgICAgICAgICBBTE9HVigiTWltZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwKICAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLCBhdWRpb0Zvcm1hdCk7CiAKLSAgICAgICAgICAgIGludCBhdmdCaXRSYXRlID0gLTE7CisgICAgICAgICAgICBpbnQgYXZnQml0UmF0ZSA9IDA7CiAgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiYml0cmF0ZSIsICZhdmdCaXRSYXRlKTsKIAogICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCmluZGV4IGYxMzdjNTIuLmJmNmI1MzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oCkBAIC01OCw2ICs1OCw3IEBACiAgICAgICAgIGtXaGF0SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycywKICAgICAgICAgLy8gTW9kdWxhciBEUk0KICAgICAgICAga1doYXREcm1JbmZvLAorICAgICAgICBrV2hhdElNU1J4Tm90aWNlLAogICAgIH07CiAKICAgICAvLyBUaGUgcHJvdmlkZXMgbWVzc2FnZSBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgcGxheWVyIGFib3V0IHZhcmlvdXMKQEAgLTEzMSw2ICsxMzIsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIC8qIG9mZmxvYWQgKi8pIHt9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VGFyZ2V0Qml0cmF0ZShpbnQzMl90KSB7fQorCiAgICAgLy8gTW9kdWxhciBEUk0KICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IC8qdXVpZCovWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICYvKmRybVNlc3Npb25JZCovLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRQU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhNDgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5jcHAKQEAgLTAsMCArMSw3OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJUUFNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlJUUFNvdXJjZS5oIgorCisKKworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBpbnQ2NF90IGtOZWFyRU9TVGltZW91dFVzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKK3N0YXRpYyBpbnQzMl90IGtNYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyA9IDIwOworCitOdVBsYXllcjo6UlRQU291cmNlOjpSVFBTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICBjb25zdCBTdHJpbmc4JiBydHBQYXJhbXMpCisgICAgOiBTb3VyY2Uobm90aWZ5KSwKKyAgICAgIG1SVFBQYXJhbXMocnRwUGFyYW1zKSwKKyAgICAgIG1GbGFncygwKSwKKyAgICAgIG1TdGF0ZShESVNDT05ORUNURUQpLAorICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKKyAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAorICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKKyAgICAgIG1SVFBDb25uKG5ldyBBUlRQQ29ubmVjdGlvbihBUlRQQ29ubmVjdGlvbjo6a1ZpTFRFQ29ubmVjdGlvbikpLAorICAgICAgbUVPU1RpbWVvdXRBdWRpbygwKSwKKyAgICAgIG1FT1NUaW1lb3V0VmlkZW8oMCksCisgICAgICBtRmlyc3RBY2Nlc3NVbml0KHRydWUpLAorICAgICAgbUFsbFRyYWNrc0hhdmVUaW1lKGZhbHNlKSwKKyAgICAgIG1OVFBBbmNob3JVcygtMSksCisgICAgICBtTWVkaWFBbmNob3JVcygtMSksCisgICAgICBtTGFzdE1lZGlhVGltZVVzKC0xKSwKKyAgICAgIG1OdW1BY2Nlc3NVbml0c1JlY2VpdmVkKDApLAorICAgICAgbUxhc3RDVk9VcGRhdGVkKC0xKSwKKyAgICAgIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldChmYWxzZSksCisgICAgICBtUmVjZWl2ZWRGaXJzdFJUUFBhY2tldChmYWxzZSksCisgICAgICBtUGF1c2luZyhmYWxzZSksCisgICAgICBtUGF1c2VHZW5lcmF0aW9uKDApIHsKKyAgICBBTE9HRCgiUlRQU291cmNlIGluaXRpYWxpemVkIHdpdGggcnRwUGFyYW1zPSVzIiwgcnRwUGFyYW1zLnN0cmluZygpKTsKK30KKworTnVQbGF5ZXI6OlJUUFNvdXJjZTo6flJUUFNvdXJjZSgpIHsKKyAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOworICAgICAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUlRQQ29ubi0+aWQoKSk7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OmdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgICpidWZmZXJpbmcgPSBtQnVmZmVyaW5nU2V0dGluZ3M7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOworICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6cHJlcGFyZUFzeW5jKCkgeworICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHAiKTsKKyAgICAgICAgbUxvb3Blci0+c3RhcnQoKTsKKworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7CisgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUlRQQ29ubik7CisgICAgfQorCisgICAgQ0hFQ0tfRVEobVN0YXRlLCAoaW50KURJU0NPTk5FQ1RFRCk7CisgICAgbVN0YXRlID0gQ09OTkVDVElORzsKKworICAgIHNldFBhcmFtZXRlcnMobVJUUFBhcmFtcyk7CisKKyAgICBUcmFja0luZm8gKmluZm8gPSBOVUxMOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKGluZm8gPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEFTdHJpbmcgc2RwOworICAgICAgICBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpTRFBTdHJpbmdGYWN0b3J5KHNkcCwgaW5mby0+bUxvY2FsSXAsCisgICAgICAgICAgICAgICAgaW5mby0+bUlzQXVkaW8sIGluZm8tPm1Mb2NhbFBvcnQsIGluZm8tPm1QYXlsb2FkVHlwZSwgaW5mby0+bUFTLCBpbmZvLT5tQ29kZWNOYW1lLAorICAgICAgICAgICAgICAgIE5VTEwsIGluZm8tPm1XaWR0aCwgaW5mby0+bUhlaWdodCwgaW5mby0+bUNWT0V4dE1hcCk7CisgICAgICAgIEFMT0dEKCJSVFBTb3VyY2UgU0RQID0+XG4lcyIsIHNkcC5jX3N0cigpKTsKKworICAgICAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBkZXNjID0gbmV3IEFTZXNzaW9uRGVzY3JpcHRpb247CisgICAgICAgIGJvb2wgaXNWYWxpZFNkcCA9IGRlc2MtPnNldFRvKHNkcC5jX3N0cigpLCBzZHAuc2l6ZSgpKTsKKyAgICAgICAgQUxPR1YoIlJUUFNvdXJjZSBpc1ZhbGlkU2RwID0+ICVkIiwgaXNWYWxpZFNkcCk7CisKKyAgICAgICAgaW50IHNvY2tSdHAsIHNvY2tSdGNwOworICAgICAgICBBUlRQQ29ubmVjdGlvbjo6TWFrZVJUUFNvY2tldFBhaXIoJnNvY2tSdHAsICZzb2NrUnRjcCwgaW5mby0+bUxvY2FsSXAsIGluZm8tPm1SZW1vdGVJcCwKKyAgICAgICAgICAgICAgICBpbmZvLT5tTG9jYWxQb3J0LCBpbmZvLT5tUmVtb3RlUG9ydCwgaW5mby0+bVNvY2tldE5ldHdvcmspOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2FjY3UnLCB0aGlzKTsKKworICAgICAgICBBTE9HVigiUlRQU291cmNlIGFkZFN0cmVhbS4gdHJhY2staW5kZXg9JWQiLCBpKTsKKyAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFja0luZGV4IiwgaSk7CisgICAgICAgIC8vIGluZGV4KGkpIHNob3VsZCBiZSBzdGFydGVkIGZyb20gMS4gMCBpcyByZXNlcnZlZCBmb3IgW3Jvb3RdCisgICAgICAgIG1SVFBDb25uLT5hZGRTdHJlYW0oc29ja1J0cCwgc29ja1J0Y3AsIGRlc2MsIGkgKyAxLCBub3RpZnksIGZhbHNlKTsKKyAgICAgICAgbVJUUENvbm4tPnNldFNlbGZJRChpbmZvLT5tU2VsZklEKTsKKyAgICAgICAgbVJUUENvbm4tPnNldFN0YXRpY0ppdHRlclRpbWVNcyhpbmZvLT5tSmJUaW1lTXMpOworCisgICAgICAgIHVuc2lnbmVkIGxvbmcgUFQ7CisgICAgICAgIEFTdHJpbmcgZm9ybWF0RGVzYywgZm9ybWF0UGFyYW1zOworICAgICAgICAvLyBpbmRleChpKSBzaG91bGQgYmUgc3RhcnRlZCBmcm9tIDEuIDAgaXMgcmVzZXJ2ZWQgZm9yIFtyb290XQorICAgICAgICBkZXNjLT5nZXRGb3JtYXRUeXBlKGkgKyAxLCAmUFQsICZmb3JtYXREZXNjLCAmZm9ybWF0UGFyYW1zKTsKKworICAgICAgICBpbnQzMl90IGNsb2NrUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgICAgIEFTZXNzaW9uRGVzY3JpcHRpb246OlBhcnNlRm9ybWF0RGVzYyhmb3JtYXREZXNjLmNfc3RyKCksICZjbG9ja1JhdGUsICZudW1DaGFubmVscyk7CisgICAgICAgIGluZm8tPm1UaW1lU2NhbGUgPSBjbG9ja1JhdGU7CisKKyAgICAgICAgaW5mby0+bVJUUFNvY2tldCA9IHNvY2tSdHA7CisgICAgICAgIGluZm8tPm1SVENQU29ja2V0ID0gc29ja1J0Y3A7CisgICAgICAgIGluZm8tPm1GaXJzdFNlcU51bUluU2VnbWVudCA9IDA7CisgICAgICAgIGluZm8tPm1OZXdTZWdtZW50ID0gdHJ1ZTsKKyAgICAgICAgaW5mby0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0ga01heEFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzOworICAgICAgICBpbmZvLT5tUlRQQW5jaG9yID0gMDsKKyAgICAgICAgaW5mby0+bU5UUEFuY2hvclVzID0gLTE7CisgICAgICAgIGluZm8tPm1Ob3JtYWxQbGF5VGltZVJUUCA9IDA7CisgICAgICAgIGluZm8tPm1Ob3JtYWxQbGF5VGltZVVzID0gMGxsOworCisgICAgICAgIC8vIGluZGV4KGkpIHNob3VsZCBiZSBzdGFydGVkIGZyb20gMS4gMCBpcyByZXNlcnZlZCBmb3IgW3Jvb3RdCisgICAgICAgIGluZm8tPm1QYWNrZXRTb3VyY2UgPSBuZXcgQVBhY2tldFNvdXJjZShkZXNjLCBpICsgMSk7CisKKyAgICAgICAgaW50MzJfdCB0aW1lU2NhbGU7CisgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBnZXRUcmFja0Zvcm1hdChpLCAmdGltZVNjYWxlKTsKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoZm9ybWF0KTsKKworICAgICAgICBpZiAoaW5mby0+bUlzQXVkaW8pIHsKKyAgICAgICAgICAgIG1BdWRpb1RyYWNrID0gc291cmNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVZpZGVvVHJhY2sgPSBzb3VyY2U7CisgICAgICAgIH0KKworICAgICAgICBpbmZvLT5tU291cmNlID0gc291cmNlOworICAgICAgICBpbmZvLT5tUlRQVGltZSA9IDA7CisgICAgICAgIGluZm8tPm1Ob3JtYWxQbGF5dGltZVVzID0gMDsKKyAgICAgICAgaW5mby0+bU5QVE1hcHBpbmdWYWxpZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7CisgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c3RhcnQoKSB7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6cGF1c2UoKSB7CisgICAgbVN0YXRlID0gUEFVU0VEOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnJlc3VtZSgpIHsKKyAgICBtU3RhdGUgPSBDT05ORUNUSU5HOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnN0b3AoKSB7CisgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCB0aGlzKTsKKworICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKKyAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZkdW1teSk7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OmZlZWRNb3JlVFNEYXRhKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7CisgICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKK30KKworc3A8TWV0YURhdGE+IE51UGxheWVyOjpSVFBTb3VyY2U6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgeworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7CisKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6aGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSB7CisgICAgLy8gV2UncmUgZ29pbmcgdG8gYnVmZmVyIGF0IGxlYXN0IDIgc2VjcyB3b3J0aCBkYXRhIG9uIGFsbCB0cmFja3MgYmVmb3JlCisgICAgLy8gc3RhcnRpbmcgcGxheWJhY2sgKGJvdGggYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgYSBzZWVrKS4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EdXJhdGlvblVzID0gMjAwMDAwMGxsOworCisgICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOworICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOworICAgIGlmICgobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9UcmFjay0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKQorICAgICAgICAgICAgfHwgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvVHJhY2stPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtQXVkaW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQorICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCisgICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoImF1ZGlvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKKyAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAorICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtVmlkZW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQorICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCisgICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKKyAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7CisKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOworCisgICAgaWYgKG1TdGF0ZSA9PSBQQVVTRUQpIHsKKyAgICAgICAgQUxPR1YoIi1FV09VTERCTE9DSyIpOworICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgIH0KKworICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OworICAgIGlmICghc291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgeworICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKKyAgICAgICAgICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gb3RoZXJTb3VyY2UgPSBnZXRTb3VyY2UoIWF1ZGlvKTsKKyAgICAgICAgICAgIHN0YXR1c190IG90aGVyRmluYWxSZXN1bHQ7CisKKyAgICAgICAgICAgIC8vIElmIG90aGVyIHNvdXJjZSBhbHJlYWR5IHNpZ25hbGVkIEVPUywgdGhpcyBzb3VyY2Ugc2hvdWxkIGFsc28gc2lnbmFsIEVPUworICAgICAgICAgICAgaWYgKG90aGVyU291cmNlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIW90aGVyU291cmNlLT5oYXNCdWZmZXJBdmFpbGFibGUoJm90aGVyRmluYWxSZXN1bHQpICYmCisgICAgICAgICAgICAgICAgICAgIG90aGVyRmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGlzIHNvdXJjZSBoYXMgZGV0ZWN0ZWQgbmVhciBlbmQsIGdpdmUgaXQgc29tZSB0aW1lIHRvIHJldHJpZXZlIG1vcmUKKyAgICAgICAgICAgIC8vIGRhdGEgYmVmb3JlIHNpZ25hbGluZyBFT1MKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZW9zVGltZW91dCA9IGF1ZGlvID8gbUVPU1RpbWVvdXRBdWRpbyA6IG1FT1NUaW1lb3V0VmlkZW87CisgICAgICAgICAgICAgICAgaWYgKGVvc1RpbWVvdXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCBBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChBTG9vcGVyOjpHZXROb3dVcygpIC0gZW9zVGltZW91dCkgPiBrTmVhckVPU1RpbWVvdXRVcykgeworICAgICAgICAgICAgICAgICAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShvdGhlclNvdXJjZSAhPSBOVUxMICYmIG90aGVyU291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpKSB7CisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBlbnRlciBidWZmZXJpbmcgbW9kZQorICAgICAgICAgICAgICAgIC8vIGlmIGFueSBvZiB0aGUgc291cmNlcyBhbHJlYWR5IGhhdmUgZGV0ZWN0ZWQgRU9TLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IG5lZWRzIHRvIGJlIGNoZWNrZWQgd2hldGhlciBiZWxvdyBsaW5lIGlzIG5lZWRlZCBvciBub3QuCisgICAgICAgICAgICAgICAgLy8gc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKKyAgICB9CisKKyAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCAwKTsKKworICAgIGZpbmFsUmVzdWx0ID0gc291cmNlLT5kZXF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgIH0KKworICAgIGludDMyX3QgY3ZvOworICAgIGlmICgoKmFjY2Vzc1VuaXQpICE9IE5VTEwgJiYgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pICYmCisgICAgICAgICAgICBjdm8gIT0gbUxhc3RDVk9VcGRhdGVkKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgQVJUUFNvdXJjZTo6UlRQX0NWTyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImN2byIsIGN2byk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRJTVNSeE5vdGljZSk7CisgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgibWVzc2FnZSIsIG1zZyk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgIEFMT0dWKCJub3RpZnkgY3ZvIHVwZGF0ZWQgKCVkKS0+KCVkKSB0byB1cHBlciBsYXllciIsIG1MYXN0Q1ZPVXBkYXRlZCwgY3ZvKTsKKyAgICAgICAgbUxhc3RDVk9VcGRhdGVkID0gY3ZvOworICAgIH0KKworICAgIHJldHVybiBmaW5hbFJlc3VsdDsKK30KKworc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gTnVQbGF5ZXI6OlJUUFNvdXJjZTo6Z2V0U291cmNlKGJvb2wgYXVkaW8pIHsKKyAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9UcmFjayA6IG1WaWRlb1RyYWNrOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KSB7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIG1FT1NUaW1lb3V0QXVkaW8gPSB0aW1lb3V0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1FT1NUaW1lb3V0VmlkZW8gPSB0aW1lb3V0OworICAgIH0KK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgeworICAgICpkdXJhdGlvblVzID0gMGxsOworCisgICAgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXM7CisgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrLT5nZXRGb3JtYXQoKS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgJmF1ZGlvRHVyYXRpb25VcykKKyAgICAgICAgICAgICYmIGF1ZGlvRHVyYXRpb25VcyA+ICpkdXJhdGlvblVzKSB7CisgICAgICAgICpkdXJhdGlvblVzID0gYXVkaW9EdXJhdGlvblVzOworICAgIH0KKworICAgIGludDY0X3QgdmlkZW9EdXJhdGlvblVzOworICAgIGlmIChtVmlkZW9UcmFjayAhPSBOVUxMCisgICAgICAgICAgICAmJiBtVmlkZW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKKyAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZ2aWRlb0R1cmF0aW9uVXMpCisgICAgICAgICAgICAmJiB2aWRlb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgeworICAgICAgICAqZHVyYXRpb25VcyA9IHZpZGVvRHVyYXRpb25VczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyU2Vla01vZGUgbW9kZSkgeworICAgIEFMT0dWKCJSVFBTb3VyY2U6OnNlZWtUbz0lZCwgbW9kZT0lZCIsIChpbnQpc2Vla1RpbWVVcywgbW9kZSk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7CisgICAgbXNnLT5wb3N0KGtCdWZmZXJpbmdQb2xsSW50ZXJ2YWxVcyk7IC8vIDEgc2Vjb25kIGludGVydmFscworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6Om9uUG9sbEJ1ZmZlcmluZygpIHsKKyAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKK30KKworYm9vbCBOdVBsYXllcjo6UlRQU291cmNlOjppc1JlYWxUaW1lKCkgY29uc3QgeworICAgIEFMT0dEKCJSVFBTb3VyY2U6OmlzUmVhbFRpbWU9JWQiLCB0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJvbk1lc3NhZ2VSZWNlaXZlZCA9JWQiLCBtc2ctPndoYXQoKSk7CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBY2Nlc3NVbml0Q29tcGxldGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgIG1TdGF0ZSA9IENPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCB0aW1lVXBkYXRlOworICAgICAgICAgICAgLy8idGltZS11cGRhdGUiIHJhaXNlZCBmcm9tIEFSVFBDb25uZWN0aW9uOjpwYXJzZVNSKCkKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS11cGRhdGUiLCAmdGltZVVwZGF0ZSkgJiYgdGltZVVwZGF0ZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBudHBUaW1lOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgibnRwLXRpbWUiLCAoaW50NjRfdCAqKSZudHBUaW1lKSk7CisKKyAgICAgICAgICAgICAgICBvblRpbWVVcGRhdGUodHJhY2tJbmRleCwgcnRwVGltZSwgbnRwVGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludDMyX3QgSU1TUnhOb3RpY2U7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInJ0Y3AtZXZlbnQiLCAmSU1TUnhOb3RpY2UpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwYXlsb2FkVHlwZSA9IDAsIGZlZWRiYWNrVHlwZSA9IDA7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBheWxvYWQtdHlwZSIsICZwYXlsb2FkVHlwZSkpOworICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJmZWVkYmFjay10eXBlIiwgJmZlZWRiYWNrVHlwZSk7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SU1TUnhOb3RpY2UpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgibWVzc2FnZSIsIG1zZyk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICAgICAgICAgICAgICBBTE9HVigiSU1TUnhOb3RpY2UgXHRcdCBwYXlsb2FkIDogJWQgZmVlZGJhY2sgOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFR5cGUsIGZlZWRiYWNrVHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJhY2Nlc3MtdW5pdCIsICZhY2Nlc3NVbml0KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IGRhbWFnZWQ7CisgICAgICAgICAgICBpZiAoYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoImRhbWFnZWQiLCAmZGFtYWdlZCkKKyAgICAgICAgICAgICAgICAgICAgJiYgZGFtYWdlZCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJkcm9wcGluZyBkYW1hZ2VkIGFjY2VzcyB1bml0LiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbXBsaWNpdGx5IGFzc2VydCBvbiB2YWxpZCB0cmFja0luZGV4IGhlcmUsIHdoaWNoIHdlIGVuc3VyZSBieQorICAgICAgICAgICAgLy8gbmV2ZXIgcmVtb3ZpbmcgdHJhY2tzLgorICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7CisgICAgICAgICAgICAgICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgICAgICAgICAgICAgLyogQW5vdGhlclBhY2tldFNvdXJjZSBtYWtlIGFuIGFzc2VydGlvbiBpZiB0aGVyZSBpcyBubyBudHAgcHJvdmlkZWQKKyAgICAgICAgICAgICAgICAgICBSVFBTb3VyY2Ugc2hvdWxkIHByb3ZpZGUgbnRwVXMgYWxsIHRoZSB0aW1lcy4KKyAgICAgICAgICAgICAgICBpZiAoIWluZm8tPm1OUFRNYXBwaW5nVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGxpdmUgc3RyZWFtLCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgbm9ybWFsCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXl0aW1lIG1hcHBpbmcuIFdlIHdvbid0IG1hcCB0byBucHQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3QgbnB0VXMgPQorICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSlydHBUaW1lIC0gKGRvdWJsZSlpbmZvLT5tUlRQVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gaW5mby0+bVRpbWVTY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwMDAwbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXM7CisKKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIEFMb29wZXI6OkdldE5vd1VzKCkpOworCisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXREaXNjb25uZWN0OgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5tSXNBdWRpbykgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtQXVkaW9UcmFjayBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFjay0+c2lnbmFsRU9TKEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFjayA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtVmlkZW9UcmFjayBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtUlRQQ29ubi0+cmVtb3ZlU3RyZWFtKGluZm8tPm1SVFBTb2NrZXQsIGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1UcmFja3MuY2xlYXIoKTsKKyAgICAgICAgICAgIG1GaXJzdEFjY2Vzc1VuaXQgPSB0cnVlOworICAgICAgICAgICAgbUFsbFRyYWNrc0hhdmVUaW1lID0gZmFsc2U7CisgICAgICAgICAgICBtTlRQQW5jaG9yVXMgPSAtMTsKKyAgICAgICAgICAgIG1NZWRpYUFuY2hvclVzID0gLTE7CisgICAgICAgICAgICBtTGFzdE1lZGlhVGltZVVzID0gLTE7CisgICAgICAgICAgICBtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZCA9IDA7CisgICAgICAgICAgICBtUmVjZWl2ZWRGaXJzdFJUQ1BQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0ID0gZmFsc2U7CisgICAgICAgICAgICBtUGF1c2luZyA9IGZhbHNlOworICAgICAgICAgICAgbVBhdXNlR2VuZXJhdGlvbiA9IDA7CisKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkocmVwbHlJRCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRQb2xsQnVmZmVyaW5nOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKwordm9pZCBOdVBsYXllcjo6UlRQU291cmNlOjpzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgYml0cmF0ZSkgeworICAgIG1SVFBDb25uLT5zZXRUYXJnZXRCaXRyYXRlKGJpdHJhdGUpOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6Om9uVGltZVVwZGF0ZShpbnQzMl90IHRyYWNrSW5kZXgsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKKyAgICBBTE9HVigib25UaW1lVXBkYXRlIHRyYWNrICVkLCBydHBUaW1lID0gMHglMDh4LCBudHBUaW1lID0gJSMwMTZsbHgiLAorICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgKGxvbmcgbG9uZyludHBUaW1lKTsKKworICAgIC8vIGNvbnZlcnQgbnRwVGltZSBpbiBRMzIgc2Vjb25kcyB0byBtaWNyb3NlY29uZHMuIE5vdGU6IHRoaXMgd2lsbCBub3QgbG9zZSBwcmVjaXNpb24KKyAgICAvLyBiZWNhdXNlIG50cFRpbWVVcyBpcyBhdCBtb3N0IDUyIGJpdHMgKGRvdWJsZSBob2xkcyA1MyBiaXRzKQorICAgIGludDY0X3QgbnRwVGltZVVzID0gKGludDY0X3QpKG50cFRpbWUgKiAxRTYgLyAoMWxsIDw8IDMyKSk7CisKKyAgICBUcmFja0luZm8gKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdCh0cmFja0luZGV4KTsKKworICAgIHRyYWNrLT5tUlRQQW5jaG9yID0gcnRwVGltZTsKKyAgICB0cmFjay0+bU5UUEFuY2hvclVzID0gbnRwVGltZVVzOworCisgICAgaWYgKG1OVFBBbmNob3JVcyA8IDApIHsKKyAgICAgICAgbU5UUEFuY2hvclVzID0gbnRwVGltZVVzOworICAgICAgICBtTWVkaWFBbmNob3JVcyA9IG1MYXN0TWVkaWFUaW1lVXM7CisgICAgfQorCisgICAgaWYgKCFtQWxsVHJhY2tzSGF2ZVRpbWUpIHsKKyAgICAgICAgYm9vbCBhbGxUcmFja3NIYXZlVGltZSA9IChtVHJhY2tzLnNpemUoKSA+IDApOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2sgPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tTlRQQW5jaG9yVXMgPCAwKSB7CisgICAgICAgICAgICAgICAgYWxsVHJhY2tzSGF2ZVRpbWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWxsVHJhY2tzSGF2ZVRpbWUpIHsKKyAgICAgICAgICAgIG1BbGxUcmFja3NIYXZlVGltZSA9IHRydWU7CisgICAgICAgICAgICBBTE9HSSgiVGltZSBub3cgZXN0YWJsaXNoZWQgZm9yIGFsbCB0cmFja3MuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1BbGxUcmFja3NIYXZlVGltZSAmJiBkYXRhUmVjZWl2ZWRPbkFsbENoYW5uZWxzKCkpIHsKKyAgICAgICAgLy8gVGltZSBpcyBub3cgZXN0YWJsaXNoZWQsIGxldHMgc3RhcnQgdGltZXN0YW1waW5nIGltbWVkaWF0ZWx5CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgd2hpbGUgKCF0cmFja0luZm8tPm1QYWNrZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gKnRyYWNrSW5mby0+bVBhY2tldHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICB0cmFja0luZm8tPm1QYWNrZXRzLmVyYXNlKHRyYWNrSW5mby0+bVBhY2tldHMuYmVnaW4oKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWRkTWVkaWFUaW1lc3RhbXAoaSwgdHJhY2tJbmZvLCBhY2Nlc3NVbml0KSkgeworICAgICAgICAgICAgICAgICAgICBwb3N0UXVldWVBY2Nlc3NVbml0KGksIGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBOdVBsYXllcjo6UlRQU291cmNlOjphZGRNZWRpYVRpbWVzdGFtcCgKKyAgICAgICAgaW50MzJfdCB0cmFja0luZGV4LCBjb25zdCBUcmFja0luZm8gKnRyYWNrLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworCisgICAgdWludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICAicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisKKyAgICBpbnQ2NF90IHJlbFJ0cFRpbWVVcyA9CisgICAgICAgICgoKGludDY0X3QpcnRwVGltZSAtIChpbnQ2NF90KXRyYWNrLT5tUlRQQW5jaG9yKSAqIDEwMDAwMDBsbCkKKyAgICAgICAgLyB0cmFjay0+bVRpbWVTY2FsZTsKKworICAgIGludDY0X3QgbnRwVGltZVVzID0gdHJhY2stPm1OVFBBbmNob3JVcyArIHJlbFJ0cFRpbWVVczsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSBtTWVkaWFBbmNob3JVcyArIG50cFRpbWVVcyAtIG1OVFBBbmNob3JVczsKKworICAgIGlmIChtZWRpYVRpbWVVcyA+IG1MYXN0TWVkaWFUaW1lVXMpIHsKKyAgICAgICAgbUxhc3RNZWRpYVRpbWVVcyA9IG1lZGlhVGltZVVzOworICAgIH0KKworICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgQUxPR1YoImRyb3BwaW5nIGVhcmx5IGFjY2Vzc1VuaXQuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigidHJhY2sgJWQgcnRwVGltZT0ldSBtZWRpYVRpbWVVcyA9ICVsbGQgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgKGxvbmcgbG9uZyltZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMgLyAxRTYpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgbWVkaWFUaW1lVXMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6ZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpIHsKKyAgICBUcmFja0luZm8gKnRyYWNrOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICB0cmFjayA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGlmICh0cmFjay0+bVBhY2tldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnBvc3RRdWV1ZUFjY2Vzc1VuaXQoCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY2Nlc3NVbml0LCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRBY2Nlc3NVbml0KTsKKyAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKKyAgICBtc2ctPnNldEJ1ZmZlcigiYWNjZXNzVW5pdCIsIGFjY2Vzc1VuaXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6OnBvc3RRdWV1ZUVPUyhzaXplX3QgdHJhY2tJbmRleCwgc3RhdHVzX3QgZmluYWxSZXN1bHQpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RU9TLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOworICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOworICAgIG1zZy0+c2V0SW50MzIoImZpbmFsUmVzdWx0IiwgZmluYWxSZXN1bHQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OlJUUFNvdXJjZTo6Z2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBpbnQzMl90ICp0aW1lU2NhbGUpIHsKKyAgICBDSEVDS19HRShpbmRleCwgMHUpOworICAgIENIRUNLX0xUKGluZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICBjb25zdCBUcmFja0luZm8gJmluZm8gPSBtVHJhY2tzLml0ZW1BdChpbmRleCk7CisKKyAgICAqdGltZVNjYWxlID0gaW5mby5tVGltZVNjYWxlOworCisgICAgcmV0dXJuIGluZm8ubVBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCk7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6b25Db25uZWN0ZWQoKSB7CisgICAgQUxPR1YoIm9uQ29ubmVjdGVkIik7CisgICAgbVN0YXRlID0gQ09OTkVDVEVEOworfQorCit2b2lkIE51UGxheWVyOjpSVFBTb3VyY2U6Om9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaWYgKG1TdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVzdWx0IiwgJmVycikpOworICAgIENIRUNLX05FKGVyciwgKHN0YXR1c190KU9LKTsKKworLy8gICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworLy8gICAgbUhhbmRsZXIuY2xlYXIoKTsKKworICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgeworICAgICAgICAvLyBXZSdyZSBzdGlsbCBpbiB0aGUgcHJlcGFyYXRpb24gcGhhc2UsIHNpZ25hbCB0aGF0IGl0CisgICAgICAgIC8vIGZhaWxlZC4KKyAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKKyAgICB9CisKKyAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CisvLyAgICBzZXRFcnJvcihlcnIpOworCit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OnNldFBhcmFtZXRlcihjb25zdCBTdHJpbmc4ICZrZXksIGNvbnN0IFN0cmluZzggJnZhbHVlKSB7CisgICAgQUxPR1YoInNldFBhcmFtZXRlcjoga2V5ICglcykgPT4gdmFsdWUgKCVzKSIsIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCkpOworCisgICAgYm9vbCBpc0F1ZGlvS2V5ID0ga2V5LmNvbnRhaW5zKCJhdWRpbyIpOworICAgIFRyYWNrSW5mbyAqaW5mbyA9IE5VTEw7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwgJiYgaW5mby0+bUlzQXVkaW8gPT0gaXNBdWRpb0tleSkgeworICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcjogJXMgdHJhY2sgKCVkKSBmb3VuZCIsIGlzQXVkaW9LZXkgPyAiYXVkaW8iIDogInZpZGVvIiAsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIFRyYWNrSW5mbyBuZXdUcmFja0luZm87CisgICAgICAgIG5ld1RyYWNrSW5mby5tSXNBdWRpbyA9IGlzQXVkaW9LZXk7CisgICAgICAgIG1UcmFja3MucHVzaChuZXdUcmFja0luZm8pOworICAgICAgICBpbmZvID0gJm1UcmFja3MuZWRpdFRvcCgpOworICAgICAgICBpbmZvLT5tSmJUaW1lTXMgPSBrU3RhdGljSml0dGVyVGltZU1zOworICAgIH0KKworICAgIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1taW1lLXR5cGUiKSB7CisgICAgICAgIGluZm8tPm1NaW1lVHlwZSA9IHZhbHVlOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICAgICAgY29uc3QgY2hhciAqZGVsaW1pdGVyID0gc3RyY2hyKG1pbWUsICcvJyk7CisgICAgICAgIGluZm8tPm1Db2RlY05hbWUgPSBkZWxpbWl0ZXIgPyAoZGVsaW1pdGVyICsgMSkgOiAiPG5vbmU+IjsKKworICAgICAgICBBTE9HVigicnRwLXBhcmFtLW1pbWUtdHlwZTogbU1pbWVUeXBlICglcykgPT4gbUNvZGVjTmFtZSAoJXMpIiwKKyAgICAgICAgICAgICAgICBpbmZvLT5tTWltZVR5cGUuc3RyaW5nKCksIGluZm8tPm1Db2RlY05hbWUuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1kZWNvZGVyLXByb2ZpbGUiKSB7CisgICAgICAgIGluZm8tPm1Db2RlY1Byb2ZpbGUgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0tZGVjb2Rlci1sZXZlbCIpIHsKKyAgICAgICAgaW5mby0+bUNvZGVjTGV2ZWwgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAidmlkZW8tcGFyYW0td2lkdGgiKSB7CisgICAgICAgIGluZm8tPm1XaWR0aCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJ2aWRlby1wYXJhbS1oZWlnaHQiKSB7CisgICAgICAgIGluZm8tPm1IZWlnaHQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWxvY2FsLWlwIikgeworICAgICAgICBpbmZvLT5tTG9jYWxJcCA9IHZhbHVlOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tbG9jYWwtcG9ydCIpIHsKKyAgICAgICAgaW5mby0+bUxvY2FsUG9ydCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcmVtb3RlLWlwIikgeworICAgICAgICBpbmZvLT5tUmVtb3RlSXAgPSB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJlbW90ZS1wb3J0IikgeworICAgICAgICBpbmZvLT5tUmVtb3RlUG9ydCA9IGF0b2kodmFsdWUpOworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcGF5bG9hZC10eXBlIikgeworICAgICAgICBpbmZvLT5tUGF5bG9hZFR5cGUgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWFzIikgeworICAgICAgICAvL0FTIG1lYW5zIGd1YXJhbnRlZWQgYml0IHJhdGUgdGhhdCBuZWdvdGlhdGVkIGZyb20gc2RwLgorICAgICAgICBpbmZvLT5tQVMgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXJ0cC10aW1lb3V0IikgeworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tcnRjcC10aW1lb3V0IikgeworICAgIH0gZWxzZSBpZiAoa2V5ID09ICJydHAtcGFyYW0tdGltZS1zY2FsZSIpIHsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLXNlbGYtaWQiKSB7CisgICAgICAgIGluZm8tPm1TZWxmSUQgPSBhdG9pKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWV4dC1jdm8tZXh0bWFwIikgeworICAgICAgICBpbmZvLT5tQ1ZPRXh0TWFwID0gYXRvaSh2YWx1ZSk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInJ0cC1wYXJhbS1zZXQtc29ja2V0LW5ldHdvcmsiKSB7CisgICAgICAgIGludDY0X3QgbmV0d29ya0hhbmRsZSA9IGF0b2xsKHZhbHVlKTsKKyAgICAgICAgc2V0U29ja2V0TmV0d29yayhuZXR3b3JrSGFuZGxlKTsKKyAgICB9IGVsc2UgaWYgKGtleSA9PSAicnRwLXBhcmFtLWppdHRlci1idWZmZXItdGltZSIpIHsKKyAgICAgICAgLy8gY2xhbXBpbmcgbWluIGF0IDQwLCBtYXggYXQgMzAwMAorICAgICAgICBpbmZvLT5tSmJUaW1lTXMgPSBzdGQ6Om1pbihzdGQ6Om1heCg0MCwgYXRvaSh2YWx1ZSkpLCAzMDAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSVFBTb3VyY2U6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmcGFyYW1zKSB7CisgICAgQUxPR1YoInNldFBhcmFtZXRlcnM6ICVzIiwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBjb25zdCBjaGFyICpjcGFyYW1zID0gcGFyYW1zLnN0cmluZygpOworICAgIGNvbnN0IGNoYXIgKmtleV9zdGFydCA9IGNwYXJhbXM7CisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBjaGFyICplcXVhbF9wb3MgPSBzdHJjaHIoa2V5X3N0YXJ0LCAnPScpOworICAgICAgICBpZiAoZXF1YWxfcG9zID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQYXJhbWV0ZXJzICVzIG1pc3MgYSB2YWx1ZSIsIGNwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IGtleShrZXlfc3RhcnQsIGVxdWFsX3BvcyAtIGtleV9zdGFydCk7CisgICAgICAgIFRyaW1TdHJpbmcoJmtleSk7CisgICAgICAgIGlmIChrZXkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlBhcmFtZXRlcnMgJXMgY29udGFpbnMgYW4gZW1wdHkga2V5IiwgY3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlX3N0YXJ0ID0gZXF1YWxfcG9zICsgMTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VtaWNvbG9uX3BvcyA9IHN0cmNocih2YWx1ZV9zdGFydCwgJzsnKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICAgICAgaWYgKHNlbWljb2xvbl9wb3MgPT0gTlVMTCkgeworICAgICAgICAgICAgdmFsdWUuc2V0VG8odmFsdWVfc3RhcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUuc2V0VG8odmFsdWVfc3RhcnQsIHNlbWljb2xvbl9wb3MgLSB2YWx1ZV9zdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldFBhcmFtZXRlcihrZXksIHZhbHVlKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VtaWNvbG9uX3BvcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsgIC8vIFJlYWNoZXMgdGhlIGVuZAorICAgICAgICB9CisgICAgICAgIGtleV9zdGFydCA9IHNlbWljb2xvbl9wb3MgKyAxOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6c2V0U29ja2V0TmV0d29yayhpbnQ2NF90IG5ldHdvcmtIYW5kbGUpIHsKKyAgICBBTE9HVigic2V0U29ja2V0TmV0d29yazogJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbmV0d29ya0hhbmRsZSk7CisKKyAgICBUcmFja0luZm8gKmluZm8gPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaW5mby0+bVNvY2tldE5ldHdvcmsgPSBuZXR3b3JrSGFuZGxlOworICAgIH0KK30KKworLy8gVHJpbSBib3RoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgorLy9zdGF0aWMKK3ZvaWQgTnVQbGF5ZXI6OlJUUFNvdXJjZTo6VHJpbVN0cmluZyhTdHJpbmc4ICpzKSB7CisgICAgc2l6ZV90IG51bV9ieXRlcyA9IHMtPmJ5dGVzKCk7CisgICAgY29uc3QgY2hhciAqZGF0YSA9IHMtPnN0cmluZygpOworCisgICAgc2l6ZV90IGxlYWRpbmdfc3BhY2UgPSAwOworICAgIHdoaWxlIChsZWFkaW5nX3NwYWNlIDwgbnVtX2J5dGVzICYmIGlzc3BhY2UoZGF0YVtsZWFkaW5nX3NwYWNlXSkpIHsKKyAgICAgICAgKytsZWFkaW5nX3NwYWNlOworICAgIH0KKworICAgIHNpemVfdCBpID0gbnVtX2J5dGVzOworICAgIHdoaWxlIChpID4gbGVhZGluZ19zcGFjZSAmJiBpc3NwYWNlKGRhdGFbaSAtIDFdKSkgeworICAgICAgICAtLWk7CisgICAgfQorCisgICAgcy0+c2V0VG8oU3RyaW5nOCgmZGF0YVtsZWFkaW5nX3NwYWNlXSwgaSAtIGxlYWRpbmdfc3BhY2UpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFBTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRmOWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUUFNvdXJjZS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBSVFBfU09VUkNFX0hfCisKKyNkZWZpbmUgUlRQX1NPVVJDRV9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCisjaW5jbHVkZSAiQVBhY2tldFNvdXJjZS5oIgorI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCisjaW5jbHVkZSAiQVJUUFNvdXJjZS5oIgorI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJOdVBsYXllclNvdXJjZS5oIgorCisKKworCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOworCitzdHJ1Y3QgTnVQbGF5ZXI6OlJUUFNvdXJjZSA6IHB1YmxpYyBOdVBsYXllcjo6U291cmNlIHsKKyAgICBSVFBTb3VyY2UoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJ0cFBhcmFtcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAorICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CisgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBmZWVkTW9yZVRTRGF0YSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAorICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1JlYWxUaW1lKCkgY29uc3Q7CisKKyAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRUYXJnZXRCaXRyYXRlKGludDMyX3QgYml0cmF0ZSkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5SVFBTb3VyY2UoKTsKKworICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbyk7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWNjZXNzVW5pdCA9ICdhY2NVJywKKyAgICAgICAga1doYXRBY2Nlc3NVbml0Q29tcGxldGUgPSAnYWNjdScsCisgICAgICAgIGtXaGF0RGlzY29ubmVjdCA9ICdkaXNjJywKKyAgICAgICAga1doYXRFT1MgPSAnZW9zIScsCisgICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZyA9ICdwb2xsJywKKyAgICAgICAga1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyA9ICdzQnVTJywKKyAgICB9OworCisgICAgY29uc3QgaW50NjRfdCBrQnVmZmVyaW5nUG9sbEludGVydmFsVXMgPSAxMDAwMDAwbGw7CisKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgRElTQ09OTkVDVEVELAorICAgICAgICBDT05ORUNUSU5HLAorICAgICAgICBDT05ORUNURUQsCisgICAgICAgIFBBVVNFRCwKKyAgICB9OworCisgICAgc3RydWN0IFRyYWNrSW5mbyB7CisKKyAgICAgICAgLyogU0RQIG9mIHRyYWNrICovCisgICAgICAgIGJvb2wgbUlzQXVkaW87CisgICAgICAgIGludDMyX3QgbVBheWxvYWRUeXBlOworICAgICAgICBTdHJpbmc4IG1NaW1lVHlwZTsKKyAgICAgICAgU3RyaW5nOCBtQ29kZWNOYW1lOworICAgICAgICBpbnQzMl90IG1Db2RlY1Byb2ZpbGU7CisgICAgICAgIGludDMyX3QgbUNvZGVjTGV2ZWw7CisgICAgICAgIGludDMyX3QgbVdpZHRoOworICAgICAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgICAgIFN0cmluZzggbUxvY2FsSXA7CisgICAgICAgIFN0cmluZzggbVJlbW90ZUlwOworICAgICAgICBpbnQzMl90IG1Mb2NhbFBvcnQ7CisgICAgICAgIGludDMyX3QgbVJlbW90ZVBvcnQ7CisgICAgICAgIGludDY0X3QgbVNvY2tldE5ldHdvcms7CisgICAgICAgIGludDMyX3QgbVRpbWVTY2FsZTsKKyAgICAgICAgaW50MzJfdCBtQVM7CisKKyAgICAgICAgLyogUlRQIGppdHRlciBidWZmZXIgdGltZSBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgdWludDMyX3QgbUpiVGltZU1zOworICAgICAgICAvKiBVbmlxdWUgSUQgaW5kaWNhdGVzIGl0c2VsZiAqLworICAgICAgICB1aW50MzJfdCBtU2VsZklEOworICAgICAgICAvKiBleHRtYXA6PHZhbHVlPiBmb3IgQ1ZPIHdpbGwgYmUgc2V0IHRvIGhlcmUgKi8KKyAgICAgICAgaW50MzJfdCBtQ1ZPRXh0TWFwOworCisgICAgICAgIC8qIGEgY29weSBvZiBUcmFja0luZm8gaW4gUlRTUFNvdXJjZSAqLworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtU291cmNlOworICAgICAgICB1aW50MzJfdCBtUlRQVGltZTsKKyAgICAgICAgaW50NjRfdCBtTm9ybWFsUGxheXRpbWVVczsKKyAgICAgICAgYm9vbCBtTlBUTWFwcGluZ1ZhbGlkOworCisgICAgICAgIC8qIGEgY29weSBvZiBUcmFja0luZm8gaW4gTXlIYW5kbGVyLmggKi8KKyAgICAgICAgaW50IG1SVFBTb2NrZXQ7CisgICAgICAgIGludCBtUlRDUFNvY2tldDsKKyAgICAgICAgdWludDMyX3QgbUZpcnN0U2VxTnVtSW5TZWdtZW50OworICAgICAgICBib29sIG1OZXdTZWdtZW50OworICAgICAgICBpbnQzMl90IG1BbGxvd2VkU3RhbGVBY2Nlc3NVbml0czsKKyAgICAgICAgdWludDMyX3QgbVJUUEFuY2hvcjsKKyAgICAgICAgaW50NjRfdCBtTlRQQW5jaG9yVXM7CisgICAgICAgIGJvb2wgbUVPU1JlY2VpdmVkOworICAgICAgICB1aW50MzJfdCBtTm9ybWFsUGxheVRpbWVSVFA7CisgICAgICAgIGludDY0X3QgbU5vcm1hbFBsYXlUaW1lVXM7CisgICAgICAgIHNwPEFQYWNrZXRTb3VyY2U+IG1QYWNrZXRTb3VyY2U7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4+IG1QYWNrZXRzOworICAgIH07CisKKyAgICBjb25zdCBTdHJpbmc4IG1SVFBQYXJhbXM7CisgICAgdWludDMyX3QgbUZsYWdzOworICAgIFN0YXRlIG1TdGF0ZTsKKyAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CisKKyAgICAvLyBiZWxvdyAzIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBjaGVja2VkIHdoZXRoZXIgaXQgbmVlZGVkIG9yIG5vdC4KKyAgICBNdXRleCBtQnVmZmVyaW5nTG9jazsKKyAgICBib29sIG1CdWZmZXJpbmc7CisgICAgYm9vbCBtSW5QcmVwYXJhdGlvblBoYXNlOworICAgIE11dGV4IG1CdWZmZXJpbmdTZXR0aW5nc0xvY2s7CisgICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOworCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIHNwPEFSVFBDb25uZWN0aW9uPiBtUlRQQ29ubjsKKworICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbUF1ZGlvVHJhY2s7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvVHJhY2s7CisKKyAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87CisgICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOworCisgICAgLyogTXlIYW5kbGVyLmggKi8KKyAgICBib29sIG1GaXJzdEFjY2Vzc1VuaXQ7CisgICAgYm9vbCBtQWxsVHJhY2tzSGF2ZVRpbWU7CisgICAgaW50NjRfdCBtTlRQQW5jaG9yVXM7CisgICAgaW50NjRfdCBtTWVkaWFBbmNob3JVczsKKyAgICBpbnQ2NF90IG1MYXN0TWVkaWFUaW1lVXM7CisgICAgaW50NjRfdCBtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1MYXN0Q1ZPVXBkYXRlZDsKKyAgICBib29sIG1SZWNlaXZlZEZpcnN0UlRDUFBhY2tldDsKKyAgICBib29sIG1SZWNlaXZlZEZpcnN0UlRQUGFja2V0OworICAgIGJvb2wgbVBhdXNpbmc7CisgICAgaW50MzJfdCBtUGF1c2VHZW5lcmF0aW9uOworCisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZ2V0U291cmNlKGJvb2wgYXVkaW8pOworCisgICAgLyogTXlIYW5kbGVyLmggKi8KKyAgICB2b2lkIG9uVGltZVVwZGF0ZShpbnQzMl90IHRyYWNrSW5kZXgsIHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpOworICAgIGJvb2wgYWRkTWVkaWFUaW1lc3RhbXAoaW50MzJfdCB0cmFja0luZGV4LCBjb25zdCBUcmFja0luZm8gKnRyYWNrLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgZGF0YVJlY2VpdmVkT25BbGxDaGFubmVscygpOworICAgIHZvaWQgcG9zdFF1ZXVlQWNjZXNzVW5pdChzaXplX3QgdHJhY2tJbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIHZvaWQgcG9zdFF1ZXVlRU9TKHNpemVfdCB0cmFja0luZGV4LCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CisgICAgc3A8TWV0YURhdGE+IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgaW50MzJfdCAqdGltZVNjYWxlKTsKKyAgICB2b2lkIG9uQ29ubmVjdGVkKCk7CisgICAgdm9pZCBvbkRpc2Nvbm5lY3RlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CisKKyAgICBib29sIGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCk7CisKKyAgICB2b2lkIHNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KTsKKworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmcGFyYW1zKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCAma2V5LCBjb25zdCBTdHJpbmc4ICZ2YWx1ZSk7CisgICAgdm9pZCBzZXRTb2NrZXROZXR3b3JrKGludDY0X3QgbmV0d29ya0hhbmRsZSk7CisgICAgc3RhdGljIHZvaWQgVHJpbVN0cmluZyhTdHJpbmc4ICpzKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJUUFNvdXJjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFJUUF9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAppbmRleCA4M2RhMDkyLi44ZTA1ZGU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCkBAIC0xNDUsMTMgKzE0NSwxNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gQ2xvc2Ugc29ja2V0IGJlZm9yZSBwb3N0aW5nIG1lc3NhZ2UgdG8gUlRTUFNvdXJjZSBtZXNzYWdlIGhhbmRsZXIuCi0gICAgY2xvc2UobUhhbmRsZXItPmdldEFSVFNQQ29ubmVjdGlvbigpLT5nZXRTb2NrZXQoKSk7Ci0KICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOworCisgICAgLy8gQ2xvc2Ugc29ja2V0IGFmdGVyIHBvc3RpbmcgbWVzc2FnZSB0byBSVFNQU291cmNlIG1lc3NhZ2UgaGFuZGxlci4KKyAgICBpZiAobUhhbmRsZXIgIT0gTlVMTCAmJiBtSGFuZGxlci0+Z2V0QVJUU1BDb25uZWN0aW9uKCktPmdldFNvY2tldCgpID49IDApIHsKKyAgICAgICAgQUxPR0QoImNsb3NpbmcgcnRzcCBzb2NrZXQgaWYgbm90IGNsb3NlZCB5ZXQuIik7CisgICAgICAgIGNsb3NlKG1IYW5kbGVyLT5nZXRBUlRTUENvbm5lY3Rpb24oKS0+Z2V0U29ja2V0KCkpOworICAgIH0KKwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6UlRTUFNvdXJjZTo6ZmVlZE1vcmVUU0RhdGEoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NDVjMzMuLjk4NjI2ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTQgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYm1lZGlhcGxheWVyc2VydmljZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogCiAgICAgbmFtZTogIkRybVNlc3Npb25NYW5hZ2VyX3Rlc3QiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCmluZGV4IGYxMTQwNDYuLmM4MWE2NTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKQEAgLTY1LDYgKzY1LDE0IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICAgICAgaW50IC8qIHBpZCAqLywgaW50IC8qIHByb2NTdGF0ZSAqLywgaW50IC8qIG9vbVNjb3JlICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCAvKiBwaWQgKi8pIHsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFrZVByb2Nlc3NJbmZvKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIzNmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlibWVkaWFwbGF5ZXJzZXJ2aWNlX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJtZWRpYXBsYXllcnNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYW5kcm9pZF9uZXQiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJuZXRkX2NsaWVudCIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3MDI2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgU3RhZ2VmcmlnaHRSZWNvcmRlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5Sb290VGFyZ2V0UHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImZvcmNlLXJvb3QiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIKKyAgICAgICAgICAgICAgICB2YWx1ZT0iU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9TdGFnZWZyaWdodFJlY29yZGVyVGVzdCIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmMxODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9TdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPE1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiU3RhZ2VmcmlnaHRSZWNvcmRlci5oIgorCisjZGVmaW5lIE9VVFBVVF9JTkZPX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL3N0ZnJlY29yZGVyX2F1ZGlvLmluZm8iCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUVfQVVESU8gIi9kYXRhL2xvY2FsL3RtcC9zdGZyZWNvcmRlcl9hdWRpby5yYXciCisKK2NvbnN0IGJvb2wga0RlYnVnID0gZmFsc2U7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4TG9vcENvdW50ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrQ2xpcER1cmF0aW9uSW5TZWMgPSA0OworY29uc3RleHByIGludDMyX3Qga1BhdXNlVGltZUluU2VjID0gMjsKKy8vIFRvbGVyYW5jZSB2YWx1ZSBmb3IgZXh0cmFjdGVkIGNsaXBkdXJhdGlvbiBpcyBtYXhpbXVtIDEwJSBvZiB0b3RhbCBjbGlwZHVyYXRpb24KK2NvbnN0ZXhwciBpbnQzMl90IGtUb2xlcmFuY2VWYWx1ZUluVXMgPSBrQ2xpcER1cmF0aW9uSW5TZWMgKiAxMDAwMDA7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBTdGFnZWZyaWdodFJlY29yZGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnBhaXI8b3V0cHV0X2Zvcm1hdCwgYXVkaW9fZW5jb2Rlcj4+IHsKKyAgcHVibGljOgorICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0KCkgOiBtU3RmUmVjb3JkZXIobnVsbHB0ciksIG1PdXRwdXRBdWRpb0ZwKG51bGxwdHIpIHsKKyAgICAgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zID0gMDsKKyAgICAgICAgbUV4cGVjdGVkUGF1c2VJbk1zID0gMDsKKyAgICB9CisKKyAgICB+U3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QoKSB7CisgICAgICAgIGlmIChtU3RmUmVjb3JkZXIpIGZyZWUobVN0ZlJlY29yZGVyKTsKKyAgICAgICAgaWYgKG1PdXRwdXRBdWRpb0ZwKSBmY2xvc2UobU91dHB1dEF1ZGlvRnApOworICAgIH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9IHN0ZDo6c3RyaW5nKExPR19UQUcpOworICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgICAgIG1TdGZSZWNvcmRlciA9IG5ldyBTdGFnZWZyaWdodFJlY29yZGVyKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgQVNTRVJUX05FKG1TdGZSZWNvcmRlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgdGhlIGluc3RhbmNlIG9mIHJlY29yZGVyIjsKKworICAgICAgICBtT3V0cHV0QXVkaW9GcCA9IGZvcGVuKE9VVFBVVF9GSUxFX05BTUVfQVVESU8sICJ3YiIpOworICAgICAgICBBU1NFUlRfTkUobU91dHB1dEF1ZGlvRnAsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTyA8PCAiIGZvciBzdGFnZWZyaWdodCByZWNvcmRlciI7CisKKyAgICAgICAgaW50MzJfdCBmZCA9IGZpbGVubyhtT3V0cHV0QXVkaW9GcCk7CisgICAgICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgb3V0cHV0IGZpbGUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0T3V0cHV0RmlsZShmZCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBzdGFnZWZyaWdodCByZWNvcmRlciI7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1PdXRwdXRBdWRpb0ZwKSB7CisgICAgICAgICAgICBmY2xvc2UobU91dHB1dEF1ZGlvRnApOworICAgICAgICAgICAgbU91dHB1dEF1ZGlvRnAgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmICgha0RlYnVnKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHJlbW92ZShPVVRQVVRfRklMRV9OQU1FX0FVRElPKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJVbmFibGUgdG8gZGVsZXRlIHRoZSBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU87CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQob3V0cHV0X2Zvcm1hdCBvdXRwdXRGb3JtYXQsIGF1ZGlvX2VuY29kZXIgZW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCk7CisgICAgdm9pZCByZWNvcmRNZWRpYShib29sIGlzUGF1c2VkID0gZmFsc2UsIGludDMyX3QgbnVtU3RhcnQgPSAwLCBpbnQzMl90IG51bVBhdXNlID0gMCk7CisgICAgdm9pZCBkdW1wSW5mbygpOworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3IoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGludDMyX3QgJnRyYWNrQ291bnQpOworICAgIHZvaWQgdmFsaWRhdGVPdXRwdXQoKTsKKworICAgIE1lZGlhUmVjb3JkZXJCYXNlICptU3RmUmVjb3JkZXI7CisgICAgRklMRSAqbU91dHB1dEF1ZGlvRnA7CisgICAgZG91YmxlIG1FeHBlY3RlZER1cmF0aW9uSW5NczsKKyAgICBkb3VibGUgbUV4cGVjdGVkUGF1c2VJbk1zOworfTsKKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6c2V0QXVkaW9SZWNvcmRlckZvcm1hdChvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jb2RlciBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UoYXVkaW9Tb3VyY2UpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgYXVkaW8gc291cmNlOiAiIDw8IGF1ZGlvU291cmNlOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQ6ICIgPDwgb3V0cHV0Rm9ybWF0OworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRBdWRpb0VuY29kZXIoZW5jb2Rlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBhdWRpbyBlbmNvZGVyOiAiIDw8IGVuY29kZXI7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnJlY29yZE1lZGlhKGJvb2wgaXNQYXVzZSwgaW50MzJfdCBudW1TdGFydCwgaW50MzJfdCBudW1QYXVzZSkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+aW5pdCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcHJlYXByZSB0aGUgcmVvcmRlciI7CisKKyAgICAvLyBmaXJzdCBzdGFydCBzaG91bGQgc3VjY2VlZC4KKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHJlY29yZGVyIjsKKworICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwgbnVtU3RhcnQ7IGNvdW50KyspIHsKKyAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgIH0KKworICAgIGF1dG8gdFN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgLy8gUmVjb3JkaW5nIG1lZGlhIGZvciA0IHNlY3MKKyAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa0NsaXBEdXJhdGlvbkluU2VjKSk7CisgICAgYXV0byB0RW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKworICAgIGlmIChpc1BhdXNlKSB7CisgICAgICAgIC8vIGZpcnN0IHBhdXNlIHNob3VsZCBzdWNjZWVkLgorICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnBhdXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHBhdXNlIHRoZSByZWNvcmRlciI7CisKKyAgICAgICAgdFN0YXJ0ID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIC8vIFBhdXNlZCByZWNvcmRlciBmb3IgMiBzZWNzCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrUGF1c2VUaW1lSW5TZWMpKTsKKworICAgICAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IG51bVBhdXNlOyBjb3VudCsrKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnBhdXNlKCk7CisgICAgICAgIH0KKworICAgICAgICB0RW5kID0gc3RkOjpjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CisgICAgICAgIG1FeHBlY3RlZFBhdXNlSW5NcyA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KHRFbmQgLSB0U3RhcnQpLmNvdW50KCk7CisKKyAgICAgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5yZXN1bWUoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcmVzdW1lIHRoZSByZWNvcmRlciI7CisKKyAgICAgICAgYXV0byB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgLy8gUmVjb3JkaW5nIG1lZGlhIGZvciA0IHNlY3MKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtDbGlwRHVyYXRpb25JblNlYykpOworICAgICAgICBhdXRvIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgbUV4cGVjdGVkRHVyYXRpb25Jbk1zICs9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+KHRFbmQgLSB0U3RhcnQpLmNvdW50KCk7CisgICAgfQorICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHJlY29yZGVyIjsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6ZHVtcEluZm8oKSB7CisgICAgRklMRSAqZHVtcE91dHB1dCA9IGZvcGVuKE9VVFBVVF9JTkZPX0ZJTEVfTkFNRSwgIndiIik7CisgICAgaW50MzJfdCBkdW1wRmQgPSBmaWxlbm8oZHVtcE91dHB1dCk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+ZHVtcChkdW1wRmQsIGFyZ3MpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIGR1bXAgdGhlIGluZm8gZm9yIHRoZSByZWNvcmRlciI7CisgICAgZmNsb3NlKGR1bXBPdXRwdXQpOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgaW50MzJfdCAmdHJhY2tDb3VudCkgeworICAgIGludDMyX3QgZmQgPSBvcGVuKE9VVFBVVF9GSUxFX05BTUVfQVVESU8sIE9fUkRPTkxZKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiByZWNvcmRlcidzIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgPDwgIiB0byB2YWxpZGF0ZSI7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0dXMgPSBmc3RhdChmZCwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGV4dHJhY3RvciI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBU1NFUlRfR1QoZmlsZVNpemUsIDApIDw8ICJTaXplIG9mIGlucHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIGV4dHJhY3RvciBjYW5ub3QgYmUgemVybyI7CisgICAgQUxPR1YoIlNpemUgb2YgaW5wdXQgZmlsZSB0byBleHRyYWN0b3I6ICV6dSIsIGZpbGVTaXplKTsKKworICAgIHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgMCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UgZm9yIGV4dHJhY3RvciI7CisKKyAgICB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoZXh0cmFjdG9yKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IgOiAlZCIsIHRyYWNrQ291bnQpOworfQorCisvLyBWYWxpZGF0ZSByZWNvZGVyJ3Mgb3V0cHV0IHVzaW5nIGV4dHJhY3Rvcgordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6dmFsaWRhdGVPdXRwdXQoKSB7CisgICAgaW50MzJfdCB0cmFja0NvdW50ID0gLTE7CisgICAgQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXR1cEV4dHJhY3RvcihleHRyYWN0b3IsIHRyYWNrQ291bnQpKTsKKyAgICBBU1NFUlRfRVEodHJhY2tDb3VudCwgMSkgPDwgIkV4cGVjdGVkIDEgdHJhY2ssIHNhdyAiIDw8IHRyYWNrQ291bnQ7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgdHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKGV4dHJhY3RvciwgaWR4KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoZXh0cmFjdG9yLCBpZHgpOworICAgICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiVHJhY2sgZm9ybWF0IGlzIE5VTEwiOworICAgICAgICBBTE9HSSgiVHJhY2sgZm9ybWF0ID0gJXMiLCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KSk7CisKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb25VczsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvblVzKTsKKyAgICAgICAgaW50MzJfdCBkaWZmID0gYWJzKChtRXhwZWN0ZWREdXJhdGlvbkluTXMgKiAxMDAwKSAtIGNsaXBEdXJhdGlvblVzKTsKKyAgICAgICAgQVNTRVJUX0xFKGRpZmYsIGtUb2xlcmFuY2VWYWx1ZUluVXMpCisgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIGR1cmF0aW9uOiAiIDw8IChtRXhwZWN0ZWREdXJhdGlvbkluTXMgKiAxMDAwKQorICAgICAgICAgICAgICAgIDw8ICIgQWN0dWFsIGR1cmF0aW9uOiAiIDw8IGNsaXBEdXJhdGlvblVzIDw8ICIgRGlmZmVyZW5jZTogIiA8PCBkaWZmCisgICAgICAgICAgICAgICAgPDwgIiBEaWZmZXJlbmNlIGlzIGV4cGVjdGVkIHRvIGJlIGxlc3MgdGhhbiB0b2xlcmFuY2UgdmFsdWU6ICIgPDwga1RvbGVyYW5jZVZhbHVlSW5VczsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cikgPDwgIlRyYWNrIG1pbWUgaXMgTlVMTCI7CisgICAgICAgIEFMT0dJKCJUcmFjayBtaW1lID0gJXMiLCBtaW1lKTsKKworICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgYml0UmF0ZTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KTsKKyAgICAgICAgQUxPR0koIkNoYW5uZWwgY291bnQgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKTsKKyAgICAgICAgQUxPR0koIlNhbXBsZSBSYXRlIHJlcG9ydGVkIGJ5IGV4dHJhY3RvcjogJWQiLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdFJhdGUpOworICAgICAgICBBTE9HSSgiQml0IFJhdGUgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIGJpdFJhdGUpOworICAgIH0KK30KKworVEVTVF9GKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBSZWNvcmRpbmdBdWRpb1Nhbml0eVRlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KE9VVFBVVF9GT1JNQVRfREVGQVVMVCwgQVVESU9fRU5DT0RFUl9ERUZBVUxUKSk7CisKKyAgICBpbnQzMl90IG1heEFtcGxpdHVkZSA9IC0xOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0TWF4QW1wbGl0dWRlKCZtYXhBbXBsaXR1ZGUpOworICAgIEFTU0VSVF9FUShtYXhBbXBsaXR1ZGUsIDApIDw8ICJJbnZhbGlkIHZhbHVlIG9mIG1heCBhbXBsaXR1ZGUiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEoKSk7CisKKyAgICAvLyBWZXJpZnkgZ2V0TWV0cmljcygpIGJlaGF2aW9yCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmdldE1ldHJpY3MoJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBwYXJjZWwgZnJvbSBnZXRNZXRyaWNzIjsKKyAgICBBTE9HVigiU2l6ZSBvZiB0aGUgUGFyY2VsIHJldHVybmVkIGJ5IGdldE1ldHJpY3M6ICV6dSIsIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICBBU1NFUlRfR1QocGFyY2VsLmRhdGFTaXplKCksIDApIDw8ICJQYXJjZWwgc2l6ZSByZXBvcnRzIGVtcHR5IHJlY29yZCI7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK1RFU1RfUChTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgTXVsdGlGb3JtYXRBdWRpb1JlY29yZFRlc3QpIHsKKyAgICBvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYXVkaW9fZW5jb2RlciBhdWRpb0VuY29kZXIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KG91dHB1dEZvcm1hdCwgYXVkaW9FbmNvZGVyKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEoKSk7CisgICAgLy8gVE9ETyhiLzE2MTY4Nzc2MSkKKyAgICAvLyBTa2lwIGZvciBBTVItTkIvV0Igb3V0cHV0IGZvcm1hdAorICAgIGlmICghKG91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fCBvdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHZhbGlkYXRlT3V0cHV0KCkpOworICAgIH0KKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworVEVTVF9GKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBHZXRBY3RpdmVNaWNyb3Bob25lc1Rlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQsIEFVRElPX1NPVVJDRV9NSUMpKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+aW5pdCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiSW5pdCBmYWlsZWQgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cHJlcGFyZSgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHByZWFwcmUgdGhlIHJlb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdGFydCgpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSByZWNvcmRlciI7CisKKyAgICAvLyBSZWNvcmQgbWVkaWEgZm9yIDQgc2VjcworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrQ2xpcER1cmF0aW9uSW5TZWMpKTsKKworICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gYWN0aXZlTWljcm9waG9uZXN7fTsKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKCZhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZ2V0IEFjdGl2ZSBNaWNyb3Bob25lcyI7CisgICAgQVNTRVJUX0dUKGFjdGl2ZU1pY3JvcGhvbmVzLnNpemUoKSwgMCkgPDwgIk5vIGFjdGl2ZSBtaWNyb3Bob25lcyBhcmUgZm91bmQiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgcmVjb3JkZXIiOworICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIE11bHRpU3RhcnRQYXVzZVRlc3QpIHsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzZXRBdWRpb1JlY29yZGVyRm9ybWF0KE9VVFBVVF9GT1JNQVRfREVGQVVMVCwgQVVESU9fRU5DT0RFUl9ERUZBVUxUKSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocmVjb3JkTWVkaWEodHJ1ZSwga01heExvb3BDb3VudCwga01heExvb3BDb3VudCkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHZhbGlkYXRlT3V0cHV0KCkpOworICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0QWxsLCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BTVJfTkIsIEFVRElPX0VOQ09ERVJfQU1SX05CKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BTVJfV0IsIEFVRElPX0VOQ09ERVJfQU1SX1dCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoT1VUUFVUX0ZPUk1BVF9BQUNfQURUUywgQVVESU9fRU5DT0RFUl9BQUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX09HRywgQVVESU9fRU5DT0RFUl9PUFVTKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nLy5jbGFuZy1mb3JtYXQKaW5kZXggMzE5OGQwMC4uZjIzYjg0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy8uY2xhbmctZm9ybWF0CisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvLmNsYW5nLWZvcm1hdApAQCAtMjYsNCArMjYsMjYgQEAKIERlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCiBJbmRlbnRXaWR0aDogNAogUG9pbnRlckFsaWdubWVudDogTGVmdAotVGFiV2lkdGg6IDQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitUYWJXaWR0aDogNAorCisjIERldmlhdGlvbnMgZnJvbSB0aGUgYWJvdmUgZmlsZToKKyMgIkRvbid0IGluZGVudCB0aGUgc2VjdGlvbiBsYWJlbCIKK0FjY2Vzc01vZGlmaWVyT2Zmc2V0OiAtNAorIyAiRWFjaCBsaW5lIG9mIHRleHQgaW4geW91ciBjb2RlIHNob3VsZCBiZSBhdCBtb3N0IDEwMCBjb2x1bW5zIGxvbmcuIgorQ29sdW1uTGltaXQ6IDEwMAorIyAiQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXIgbGlzdHMgY2FuIGJlIGFsbCBvbiBvbmUgbGluZSBvciB3aXRoIHN1YnNlcXVlbnQKKyMgbGluZXMgaW5kZW50ZWQgZWlnaHQgc3BhY2VzLiIuIGNsYW5nLWZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IGhhdmluZyB0aGUgY29sb24KKyMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgY29uc3RydWN0b3IgZnVuY3Rpb24gbmFtZSwgc28gdGhpcyBpcyB0aGUgYmVzdAorIyBhcHByb3hpbWF0aW9uIG9mIHRoYXQgcnVsZSwgd2hpY2ggbWFrZXMgYWxsIGVudHJpZXMgaW4gdGhlIGxpc3QgKGV4Y2VwdCB0aGUKKyMgZmlyc3Qgb25lKSBoYXZlIGFuIGVpZ2h0IHNwYWNlIGluZGVudGF0aW9uLgorQ29uc3RydWN0b3JJbml0aWFsaXplckluZGVudFdpZHRoOiA2CisjIFRoZXJlIGlzIG5vdGhpbmcgaW4gZ28vZHJvaWRjcHBzdHlsZSBhYm91dCBjYXNlIGxhYmVscywgYnV0IHRoZXJlIHNlZW1zIHRvIGJlCisjIG1vcmUgY29kZSB0aGF0IGRvZXMgbm90IGluZGVudCB0aGUgY2FzZSBsYWJlbHMgaW4gZnJhbWV3b3Jrcy9iYXNlLgorSW5kZW50Q2FzZUxhYmVsczogZmFsc2UKKyMgVGhlcmUgaGF2ZSBiZWVuIHNvbWUgYnVncyBpbiB3aGljaCBzdWJzZXF1ZW50IGZvcm1hdHRpbmcgb3BlcmF0aW9ucyBpbnRyb2R1Y2UKKyMgd2VpcmQgY29tbWVudCBqdW1wcy4KK1JlZmxvd0NvbW1lbnRzOiBmYWxzZQorIyBBbmRyb2lkIHN1cHBvcnRzIEMrKzE3IG5vdywgYnV0IGl0IHNlZW1zIG9ubHkgQ3BwMTEgd2lsbCB3b3JrIG5vdy4KKyMgIkNwcDExIGlzIGEgZGVwcmVjYXRlZCBhbGlhcyBmb3IgTGF0ZXN0IiBhY2NvcmRpbmcgdG8KKyMgaHR0cHM6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0NsYW5nRm9ybWF0U3R5bGVPcHRpb25zLmh0bWwKK1N0YW5kYXJkOiBDcHAxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCmluZGV4IGY5NDhiZDguLjA0Mjg1MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKQEAgLTE0LDQ4ICsxNCwxMTEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGlibWVkaWF0cmFuc2NvZGluZ19haWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25TdGF0cy5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1R5cGUuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZS5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1ZpZGVvVHJhY2tGb3JtYXQuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbC5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Rlc3RDb25maWcuYWlkbCIsCisgICAgXSwKKyAgICBwYXRoOiAiYWlkbCIsCit9CisKIC8vIEFJREwgaW50ZXJmYWNlcyBvZiBNZWRpYVRyYW5zY29kaW5nLgogYWlkbF9pbnRlcmZhY2UgewogICAgIG5hbWU6ICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlIiwKICAgICB1bnN0YWJsZTogdHJ1ZSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbCIsCi0gICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nU2VydmljZUNsaWVudC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0pvYlByaW9yaXR5LmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVHlwZS5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1ZpZGVvQ29kZWNUeXBlLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUGFyY2VsLmFpZGwiLAotICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsIiwKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbC5haWRsIiwKLSAgICBdLAorICAgIHNyY3M6IFsiOmxpYm1lZGlhdHJhbnNjb2RpbmdfYWlkbCJdLAorICAgIGJhY2tlbmQ6CisgICAgeworICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgICAgICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgICAgIH0sCisgICAgICAgIG5kazogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgICAgICAgICAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICAgICBdLAorICAgICAgICAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nIiwKIAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKKwogICAgIHNyY3M6IFsKLSAgICAgICAgIlRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5jcHAiCisgICAgICAgICJUcmFuc2NvZGVyV3JhcHBlci5jcHAiLAorICAgICAgICAiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmNwcCIsCisgICAgICAgICJUcmFuc2NvZGluZ0xvZ2dlci5jcHAiLAorICAgICAgICAiVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeS5jcHAiLAorICAgICAgICAiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5jcHAiLAorICAgICAgICAiVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5LmNwcCIsCisgICAgICAgICJUcmFuc2NvZGluZ1VpZFBvbGljeS5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYW5kcm9pZCMzMSIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWF0cmFuc2NvZGVyIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnN0YXRzc29ja2V0IzMwIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAicmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS1WMS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAibGlic3RhdHNsb2dfbWVkaWEiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZm9ybWF0IiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwKKyAgICAgICAgIi1XdW51c2VkIiwKKyAgICAgICAgIi1XdW5yZWFjaGFibGUtY29kZSIsCiAgICAgXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC02NiwzICsxMjksNDMgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhdHNsb2dfbWVkaWEiLAorICAgIGdlbmVyYXRlZF9zb3VyY2VzOiBbInN0YXRzbG9nX21lZGlhLmNwcCJdLAorICAgIGdlbmVyYXRlZF9oZWFkZXJzOiBbInN0YXRzbG9nX21lZGlhLmgiXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIGV4cG9ydF9nZW5lcmF0ZWRfaGVhZGVyczogWyJzdGF0c2xvZ19tZWRpYS5oIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhdHNzb2NrZXQjMzAiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJzdGF0c2xvZ19tZWRpYS5oIiwKKyAgICB0b29sczogWyJzdGF0cy1sb2ctYXBpLWdlbiJdLAorICAgIGNtZDogIiQobG9jYXRpb24gc3RhdHMtbG9nLWFwaS1nZW4pIC0taGVhZGVyICQoZ2VuRGlyKS9zdGF0c2xvZ19tZWRpYS5oIC0tbW9kdWxlIG1lZGlhIC0tbmFtZXNwYWNlIGFuZHJvaWQsbWVkaWEsc3RhdHMiLAorICAgIG91dDogWworICAgICAgICAic3RhdHNsb2dfbWVkaWEuaCIsCisgICAgXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogInN0YXRzbG9nX21lZGlhLmNwcCIsCisgICAgdG9vbHM6IFsic3RhdHMtbG9nLWFwaS1nZW4iXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIHN0YXRzLWxvZy1hcGktZ2VuKSAtLWNwcCAkKGdlbkRpcikvc3RhdHNsb2dfbWVkaWEuY3BwIC0tbW9kdWxlIG1lZGlhIC0tbmFtZXNwYWNlIGFuZHJvaWQsbWVkaWEsc3RhdHMgLS1pbXBvcnRIZWFkZXIgc3RhdHNsb2dfbWVkaWEuaCIsCisgICAgb3V0OiBbCisgICAgICAgICJzdGF0c2xvZ19tZWRpYS5jcHAiLAorICAgIF0sCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9PV05FUlMgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL09XTkVSUwppbmRleCAwMjI4N2NiLi5iMDhkNTczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL09XTkVSUworKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL09XTkVSUwpAQCAtMSwzICsxLDUgQEAKLWFrZXJzdGVuQGdvb2dsZS5jb20KK2NoekBnb29nbGUuY29tCitnb2tyaXNobmFuQGdvb2dsZS5jb20KIGhrdWFuZ0Bnb29nbGUuY29tCiBsbmlsc3NvbkBnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RFU1RfTUFQUElORyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjdiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDM1IEBACit7CisgICAgInByZXN1Ym1pdCI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJNZWRpYVNhbXBsZVdyaXRlclRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJNZWRpYVRyYW5zY29kZXJUZXN0cyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cyIKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgIm5hbWUiOiAiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyX3Rlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAibmFtZSI6ICJDdHNNZWRpYVRyYW5zY29kaW5nVGVzdENhc2VzIgorICAgICAgICB9CisgICAgXQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kZXJXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RlcldyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjc4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kZXJXcmFwcGVyLmNwcApAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHJhbnNjb2RlcldyYXBwZXIiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdFcnJvckNvZGUuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9BbmRyb2lkVGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7Cit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nRXJyb3JDb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdDsKKworc3RhdGljIFRyYW5zY29kaW5nRXJyb3JDb2RlIHRvVHJhbnNjb2RpbmdFcnJvcihtZWRpYV9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgQU1FRElBX09LOgorICAgICAgICByZXR1cm4gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtOb0Vycm9yOworICAgIGNhc2UgQU1FRElBQ09ERUNfRVJST1JfSU5TVUZGSUNJRU5UX1JFU09VUkNFOiAgLy8gRkFMTFRIUlUKKyAgICBjYXNlIEFNRURJQUNPREVDX0VSUk9SX1JFQ0xBSU1FRDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprSW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgIGNhc2UgQU1FRElBX0VSUk9SX01BTEZPUk1FRDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTWFsZm9ybWVkOworICAgIGNhc2UgQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOgorICAgICAgICByZXR1cm4gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbnN1cHBvcnRlZDsKKyAgICBjYXNlIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDogIC8vIEZBTExUSFJVCisgICAgY2FzZSBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0ludmFsaWRQYXJhbWV0ZXI7CisgICAgY2FzZSBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0ludmFsaWRPcGVyYXRpb247CisgICAgY2FzZSBBTUVESUFfRVJST1JfSU86CisgICAgICAgIHJldHVybiBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0Vycm9ySU87CisgICAgY2FzZSBBTUVESUFfRVJST1JfVU5LTk9XTjogIC8vIEZBTExUSFJVCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXRWaWRlb0Zvcm1hdCgKKyAgICAgICAgY29uc3QgY2hhciogb3JpZ2luYWxNaW1lLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdD4mIHJlcXVlc3RlZEZvcm1hdCkgeworICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgPT0gc3RkOjpudWxsb3B0KSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IGZvcm1hdCA9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihBTWVkaWFGb3JtYXRfbmV3KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAocmVxdWVzdGVkRm9ybWF0LT5jb2RlY1R5cGUgPT0gVHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZTo6a0hldmMgJiYKKyAgICAgICAgc3RyY21wKG9yaWdpbmFsTWltZSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRGb3JtYXQtPmNvZGVjVHlwZSA9PSBUcmFuc2NvZGluZ1ZpZGVvQ29kZWNUeXBlOjprQXZjICYmCisgICAgICAgICAgICAgICBzdHJjbXAob3JpZ2luYWxNaW1lLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfQorICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQtPmJpdHJhdGVCcHMgPiAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIHJlcXVlc3RlZEZvcm1hdC0+Yml0cmF0ZUJwcyk7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICAvLyBUT0RPOiB0cmFuc2xhdGUgb3RoZXIgZmllbGRzIGZyb20gcmVxdWVzdGVkRm9ybWF0IHRvIHRoZSBmb3JtYXQgZm9yIE1lZGlhVHJhbnNjb2Rlci4KKyAgICAvLyBBbHNvIG5lZWQgdG8gZGV0ZXJtaW5lIG1vcmUgc2V0dGluZ3MgdG8gZXhwb3NlIGluIFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC4KKyAgICBpZiAoIWNoYW5nZWQpIHsKKyAgICAgICAgLy8gVXNlIG51bGwgZm9ybWF0IGZvciBwYXNzdGhydS4KKyAgICAgICAgZm9ybWF0LnJlc2V0KCk7CisgICAgfQorICAgIHJldHVybiBmb3JtYXQ7Cit9CisKKy8vc3RhdGljCitzdGQ6OnN0cmluZyBUcmFuc2NvZGVyV3JhcHBlcjo6dG9TdHJpbmcoY29uc3QgRXZlbnQmIGV2ZW50KSB7CisgICAgc3RkOjpzdHJpbmcgdHlwZVN0cjsKKyAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICBjYXNlIEV2ZW50OjpTdGFydDoKKyAgICAgICAgdHlwZVN0ciA9ICJTdGFydCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OlBhdXNlOgorICAgICAgICB0eXBlU3RyID0gIlBhdXNlIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6UmVzdW1lOgorICAgICAgICB0eXBlU3RyID0gIlJlc3VtZSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OlN0b3A6CisgICAgICAgIHR5cGVTdHIgPSAiU3RvcCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OkZpbmlzaDoKKyAgICAgICAgdHlwZVN0ciA9ICJGaW5pc2giOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV2ZW50OjpFcnJvcjoKKyAgICAgICAgdHlwZVN0ciA9ICJFcnJvciI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OlByb2dyZXNzOgorICAgICAgICB0eXBlU3RyID0gIlByb2dyZXNzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFdmVudDo6SGVhcnRCZWF0OgorICAgICAgICB0eXBlU3RyID0gIkhlYXJ0QmVhdCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXZlbnQ6OkFiYW5kb246CisgICAgICAgIHR5cGVTdHIgPSAiQWJhbmRvbiI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiKHVua25vd24pIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHJlc3VsdCA9ICJzZXNzaW9uIHsiICsgc3RkOjp0b19zdHJpbmcoZXZlbnQuY2xpZW50SWQpICsgIiwiICsgc3RkOjp0b19zdHJpbmcoZXZlbnQuc2Vzc2lvbklkKSArCisgICAgICAgICAgICAgIn06ICIgKyB0eXBlU3RyOworICAgIGlmIChldmVudC50eXBlID09IEV2ZW50OjpFcnJvciB8fCBldmVudC50eXBlID09IEV2ZW50OjpQcm9ncmVzcykgeworICAgICAgICByZXN1bHQgKz0gIiAiICsgc3RkOjp0b19zdHJpbmcoZXZlbnQuYXJnKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY2xhc3MgVHJhbnNjb2RlcldyYXBwZXI6OkNhbGxiYWNrSW1wbCA6IHB1YmxpYyBNZWRpYVRyYW5zY29kZXI6OkNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBDYWxsYmFja0ltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kZXJXcmFwcGVyPiYgb3duZXIsIENsaWVudElkVHlwZSBjbGllbnRJZCwKKyAgICAgICAgICAgICAgICAgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpCisgICAgICAgICAgOiBtT3duZXIob3duZXIpLCBtQ2xpZW50SWQoY2xpZW50SWQpLCBtU2Vzc2lvbklkKHNlc3Npb25JZCkge30KKworICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIG93bmVyID0gbU93bmVyLmxvY2soKTsKKyAgICAgICAgaWYgKG93bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG93bmVyLT5vbkZpbmlzaChtQ2xpZW50SWQsIG1TZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gb3duZXIgPSBtT3duZXIubG9jaygpOworICAgICAgICBpZiAob3duZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgb3duZXItPm9uRXJyb3IobUNsaWVudElkLCBtU2Vzc2lvbklkLCBlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9ncmVzcykgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIG93bmVyID0gbU93bmVyLmxvY2soKTsKKyAgICAgICAgaWYgKG93bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG93bmVyLT5vblByb2dyZXNzKG1DbGllbnRJZCwgbVNlc3Npb25JZCwgcHJvZ3Jlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSGVhcnRCZWF0KGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIG93bmVyID0gbU93bmVyLmxvY2soKTsKKyAgICAgICAgaWYgKG93bmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG93bmVyLT5vbkhlYXJ0QmVhdChtQ2xpZW50SWQsIG1TZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoIiVzOiBzZXNzaW9uIHslbGxkLCAlZH0iLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpbUNsaWVudElkLCBtU2Vzc2lvbklkKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp3ZWFrX3B0cjxUcmFuc2NvZGVyV3JhcHBlcj4gbU93bmVyOworICAgIENsaWVudElkVHlwZSBtQ2xpZW50SWQ7CisgICAgU2Vzc2lvbklkVHlwZSBtU2Vzc2lvbklkOworfTsKKworVHJhbnNjb2RlcldyYXBwZXI6OlRyYW5zY29kZXJXcmFwcGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdMb2dnZXI+JiBsb2dnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoZWFydEJlYXRJbnRlcnZhbFVzKQorICAgICAgOiBtQ2FsbGJhY2soY2IpLAorICAgICAgICBtTG9nZ2VyKGxvZ2dlciksCisgICAgICAgIG1IZWFydEJlYXRJbnRlcnZhbFVzKGhlYXJ0QmVhdEludGVydmFsVXMpLAorICAgICAgICBtQ3VycmVudENsaWVudElkKDApLAorICAgICAgICBtQ3VycmVudFNlc3Npb25JZCgtMSksCisgICAgICAgIG1Mb29wZXJSZWFkeShmYWxzZSkgeworICAgIEFMT0dWKCJUcmFuc2NvZGVyV3JhcHBlciBDVE9SOiAlcCIsIHRoaXMpOworfQorCitUcmFuc2NvZGVyV3JhcHBlcjo6flRyYW5zY29kZXJXcmFwcGVyKCkgeworICAgIEFMT0dWKCJUcmFuc2NvZGVyV3JhcHBlciBEVE9SOiAlcCIsIHRoaXMpOworfQorCitzdGF0aWMgYm9vbCBpc1Jlc291cmNlRXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKSB7CisgICAgcmV0dXJuIGVyciA9PSBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQgfHwgZXJyID09IEFNRURJQUNPREVDX0VSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRTsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6cmVwb3J0RXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycikgeworICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc1Jlc291cmNlRXJyb3IoZXJyKSkgeworICAgICAgICAgICAgLy8gQWRkIGEgcGxhY2Vob2xkZXIgcGF1c2Ugc3RhdGUgdG8gbVBhdXNlZFN0YXRlTWFwLiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gcmVzdW1pbmcuCisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIHRyYW5zY29kZXIgcGF1c2UvcmVzdW1lIGxvZ2ljIGlzIHJlYWR5LiBOZXcgbG9naWMgd2lsbAorICAgICAgICAgICAgLy8gbm8gbG9uZ2VyIHVzZSB0aGUgcGF1c2Ugc3RhdGVzLgorICAgICAgICAgICAgYXV0byBpdCA9IG1QYXVzZWRTdGF0ZU1hcC5maW5kKFNlc3Npb25LZXlUeXBlKGNsaWVudElkLCBzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIGlmIChpdCA9PSBtUGF1c2VkU3RhdGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtUGF1c2VkU3RhdGVNYXAuZW1wbGFjZShTZXNzaW9uS2V5VHlwZShjbGllbnRJZCwgc2Vzc2lvbklkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgbmRrOjpTY29wZWRBUGFyY2VsKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYWxsYmFjay0+b25SZXNvdXJjZUxvc3QoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcihjbGllbnRJZCwgc2Vzc2lvbklkLCB0b1RyYW5zY29kaW5nRXJyb3IoZXJyKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnN0YXJ0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3RQYXJjZWwsIHVpZF90IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYikgeworICAgIFRyYW5zY29kaW5nUmVxdWVzdCByZXF1ZXN0e3JlcXVlc3RQYXJjZWx9OworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0YXJ0LCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBoYW5kbGVTdGFydChjbGllbnRJZCwgc2Vzc2lvbklkLCByZXF1ZXN0LCBjYWxsaW5nVWlkLCBjbGllbnRDYik7CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgICAgICByZXBvcnRFcnJvcihjbGllbnRJZCwgc2Vzc2lvbklkLCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXV0byBjYWxsYmFjayA9IG1DYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vblN0YXJ0ZWQoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6cGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlBhdXNlLCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBoYW5kbGVQYXVzZShjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBjbGVhbnVwKCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKGNsaWVudElkLCBzZXNzaW9uSWQsIGVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uUGF1c2VkKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6OnJlc3VtZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdFBhcmNlbCwgdWlkX3QgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYikgeworICAgIFRyYW5zY29kaW5nUmVxdWVzdCByZXF1ZXN0e3JlcXVlc3RQYXJjZWx9OworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlJlc3VtZSwgY2xpZW50SWQsIHNlc3Npb25JZCwgWz1dIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gaGFuZGxlUmVzdW1lKGNsaWVudElkLCBzZXNzaW9uSWQsIHJlcXVlc3QsIGNhbGxpbmdVaWQsIGNsaWVudENiKTsKKyAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKGNsaWVudElkLCBzZXNzaW9uSWQsIGVycik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uUmVzdW1lZChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGJvb2wgYWJhbmRvbikgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0b3AsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGlmIChtVHJhbnNjb2RlciAhPSBudWxscHRyICYmIGNsaWVudElkID09IG1DdXJyZW50Q2xpZW50SWQgJiYKKyAgICAgICAgICAgIHNlc3Npb25JZCA9PSBtQ3VycmVudFNlc3Npb25JZCkgeworICAgICAgICAgICAgLy8gQ2FuY2VsbGluZyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc2Vzc2lvbi4KKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1UcmFuc2NvZGVyLT5jYW5jZWwoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzdG9wIHRyYW5zY29kZXI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koInRyYW5zY29kZXIgc3RvcHBlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nU2Vzc2lvbkVuZGVkKFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkNBTkNFTExFRCwgZXJyKTsKKyAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciBzZXNzaW9ucyB0aGF0J3Mgbm90IGN1cnJlbnRseSBydW5uaW5nLCByZWxlYXNlIGFueSBwYXVzZWRTdGF0ZSBmb3IgdGhlIHNlc3Npb24uCisgICAgICAgICAgICBtUGF1c2VkU3RhdGVNYXAuZXJhc2UoU2Vzc2lvbktleVR5cGUoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgICAgICB9CisgICAgICAgIC8vIE5vIGNhbGxiYWNrIG5lZWRlZCBmb3Igc3RvcC4KKyAgICB9KTsKKworICAgIGlmIChhYmFuZG9uKSB7CisgICAgICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OkFiYW5kb24sIDAsIDAsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6b25GaW5pc2goQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OkZpbmlzaCwgY2xpZW50SWQsIHNlc3Npb25JZCwgWz1dIHsKKyAgICAgICAgaWYgKG1UcmFuc2NvZGVyICE9IG51bGxwdHIgJiYgY2xpZW50SWQgPT0gbUN1cnJlbnRDbGllbnRJZCAmJgorICAgICAgICAgICAgc2Vzc2lvbklkID09IG1DdXJyZW50U2Vzc2lvbklkKSB7CisgICAgICAgICAgICBsb2dTZXNzaW9uRW5kZWQoVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbjo6RklOSVNIRUQsIEFNRURJQV9PSyk7CisgICAgICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkZpbmlzaChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpvbkVycm9yKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yKSB7CisgICAgcXVldWVFdmVudCgKKyAgICAgICAgICAgIEV2ZW50OjpFcnJvciwgY2xpZW50SWQsIHNlc3Npb25JZCwKKyAgICAgICAgICAgIFs9XSB7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFuc2NvZGVyICE9IG51bGxwdHIgJiYgY2xpZW50SWQgPT0gbUN1cnJlbnRDbGllbnRJZCAmJgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPT0gbUN1cnJlbnRTZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nU2Vzc2lvbkVuZGVkKFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkVSUk9SLCBlcnJvcik7CisgICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0RXJyb3IoY2xpZW50SWQsIHNlc3Npb25JZCwgZXJyb3IpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGVycm9yKTsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6b25Qcm9ncmVzcyhDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2dyZXNzKSB7CisgICAgcXVldWVFdmVudCgKKyAgICAgICAgICAgIEV2ZW50OjpQcm9ncmVzcywgY2xpZW50SWQsIHNlc3Npb25JZCwKKyAgICAgICAgICAgIFs9XSB7CisgICAgICAgICAgICAgICAgYXV0byBjYWxsYmFjayA9IG1DYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uUHJvZ3Jlc3NVcGRhdGUoY2xpZW50SWQsIHNlc3Npb25JZCwgcHJvZ3Jlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBwcm9ncmVzcyk7Cit9CisKK3ZvaWQgVHJhbnNjb2RlcldyYXBwZXI6Om9uSGVhcnRCZWF0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBxdWV1ZUV2ZW50KEV2ZW50OjpIZWFydEJlYXQsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uSGVhcnRCZWF0KGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK21lZGlhX3N0YXR1c190IFRyYW5zY29kZXJXcmFwcGVyOjpzZXR1cFRyYW5zY29kZXIoCisgICAgICAgIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwKKyAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2IsCisgICAgICAgIFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb24qIGZhaWx1cmVSZWFzb24sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZSkgeworICAgIGlmIChjbGllbnRDYiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJjbGllbnQgY2FsbGJhY2sgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChtVHJhbnNjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJ0cmFuc2NvZGVyIGFscmVhZHkgcnVubmluZyIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFVud3JhcCB0aGUgY2FsbGJhY2sgYW5kIHNlbmQgaGVhcnRiZWF0cyB0byB0aGUgY2xpZW50IGFmdGVyIGVhY2ggb3BlcmF0aW9uIGR1cmluZyBzZXR1cC4KKyAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yIHNyY0ZkLCBkc3RGZDsKKyAgICBpbnQgc3JjRmRJbnQgPSByZXF1ZXN0LnNvdXJjZUZkLmdldCgpOworICAgIGlmIChzcmNGZEludCA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gY2xpZW50Q2ItPm9wZW5GaWxlRGVzY3JpcHRvcihyZXF1ZXN0LnNvdXJjZUZpbGVQYXRoLCAiciIsICZzcmNGZCk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCBzcmNGZC5nZXQoKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gb3BlbiBzb3VyY2UiKTsKKyAgICAgICAgICAgICpmYWlsdXJlUmVhc29uID0gVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbjo6T1BFTl9TUkNfRkRfRkFJTEVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgfQorICAgICAgICBzcmNGZEludCA9IHNyY0ZkLmdldCgpOworICAgIH0KKworICAgIGNhbGxiYWNrLT5vbkhlYXJ0QmVhdChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIGludCBkc3RGZEludCA9IHJlcXVlc3QuZGVzdGluYXRpb25GZC5nZXQoKTsKKyAgICBpZiAoZHN0RmRJbnQgPCAwKSB7CisgICAgICAgIC8vIE9wZW4gZGVzdCBmaWxlIHdpdGggInJ3IiwgYXMgdGhlIHRyYW5zY29kZXIgY291bGQgcG90ZW50aWFsbHkgcmV1c2UgcGFydCBvZiBpdAorICAgICAgICAvLyBmb3IgcmVzdW1lIGNhc2UuIFdlIG1pZ2h0IHdhbnQgdGhlIGZ1cnRoZXIgZGlmZmVyZW50aWF0ZSBhbmQgb3BlbiB3aXRoICJ3IiBvbmx5CisgICAgICAgIC8vIGZvciBzdGFydC4KKyAgICAgICAgc3RhdHVzID0gY2xpZW50Q2ItPm9wZW5GaWxlRGVzY3JpcHRvcihyZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGgsICJydyIsICZkc3RGZCk7CisgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSB8fCBkc3RGZC5nZXQoKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gb3BlbiBkZXN0aW5hdGlvbiIpOworICAgICAgICAgICAgKmZhaWx1cmVSZWFzb24gPSBUcmFuc2NvZGluZ0xvZ2dlcjo6U2Vzc2lvbkVuZGVkUmVhc29uOjpPUEVOX0RTVF9GRF9GQUlMRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIGRzdEZkSW50ID0gZHN0RmQuZ2V0KCk7CisgICAgfQorCisgICAgY2FsbGJhY2stPm9uSGVhcnRCZWF0KGNsaWVudElkLCBzZXNzaW9uSWQpOworCisgICAgbUN1cnJlbnRDbGllbnRJZCA9IGNsaWVudElkOworICAgIG1DdXJyZW50U2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIG1DdXJyZW50Q2FsbGluZ1VpZCA9IGNhbGxpbmdVaWQ7CisgICAgbVRyYW5zY29kZXJDYiA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsbGJhY2tJbXBsPihzaGFyZWRfZnJvbV90aGlzKCksIGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgIG1UcmFuc2NvZGVyID0gTWVkaWFUcmFuc2NvZGVyOjpjcmVhdGUobVRyYW5zY29kZXJDYiwgbUhlYXJ0QmVhdEludGVydmFsVXMsIHJlcXVlc3QuY2xpZW50UGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5jbGllbnRVaWQsIHBhdXNlZFN0YXRlKTsKKyAgICBpZiAobVRyYW5zY29kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNyZWF0ZSB0cmFuc2NvZGVyIik7CisgICAgICAgICpmYWlsdXJlUmVhc29uID0gVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbjo6Q1JFQVRFX0ZBSUxFRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGNhbGxiYWNrLT5vbkhlYXJ0QmVhdChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1UcmFuc2NvZGVyLT5jb25maWd1cmVTb3VyY2Uoc3JjRmRJbnQpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY29uZmlndXJlIHNvdXJjZTogJWQiLCBlcnIpOworICAgICAgICAqZmFpbHVyZVJlYXNvbiA9IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkNPTkZJR19TUkNfRkFJTEVEOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGNhbGxiYWNrLT5vbkhlYXJ0QmVhdChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+PiB0cmFja0Zvcm1hdHMgPSBtVHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgaWYgKHRyYWNrRm9ybWF0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCB0cmFjayBmb3JtYXRzISIpOworICAgICAgICAqZmFpbHVyZVJlYXNvbiA9IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246Ok5PX1RSQUNLUzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY2FsbGJhY2stPm9uSGVhcnRCZWF0KGNsaWVudElkLCBzZXNzaW9uSWQpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja0Zvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gZm9ybWF0OworICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdHNbaV0uZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworCisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGdldFZpZGVvRm9ybWF0KG1pbWUsIHJlcXVlc3QucmVxdWVzdGVkVmlkZW9UcmFja0Zvcm1hdCk7CisKKyAgICAgICAgICAgIG1TcmNGb3JtYXQgPSB0cmFja0Zvcm1hdHNbaV07CisgICAgICAgICAgICBtRHN0Rm9ybWF0ID0gZm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gbVRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGZvcm1hdC5nZXQoKSk7CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbmZpZ3VyZSB0cmFjayBmb3JtYXQgZm9yIHRyYWNrICVkOiAlZCIsIGksIGVycik7CisgICAgICAgICAgICAqZmFpbHVyZVJlYXNvbiA9IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkNPTkZJR19UUkFDS19GQUlMRUQ7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgY2FsbGJhY2stPm9uSGVhcnRCZWF0KGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgIH0KKworICAgIGVyciA9IG1UcmFuc2NvZGVyLT5jb25maWd1cmVEZXN0aW5hdGlvbihkc3RGZEludCk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjb25maWd1cmUgZGVzdDogJWQiLCBlcnIpOworICAgICAgICAqZmFpbHVyZVJlYXNvbiA9IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkNPTkZJR19EU1RfRkFJTEVEOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGNhbGxiYWNrLT5vbkhlYXJ0QmVhdChjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IFRyYW5zY29kZXJXcmFwcGVyOjpoYW5kbGVTdGFydCgKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICB1aWRfdCBjYWxsaW5nVWlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYikgeworICAgIEFMT0dJKCIlczogc2V0dGluZyB1cCB0cmFuc2NvZGVyIGZvciBzdGFydCIsIF9fRlVOQ1RJT05fXyk7CisgICAgVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbiByZWFzb24gPSBUcmFuc2NvZGluZ0xvZ2dlcjo6U2Vzc2lvbkVuZGVkUmVhc29uOjpVTktOT1dOOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICBzZXR1cFRyYW5zY29kZXIoY2xpZW50SWQsIHNlc3Npb25JZCwgcmVxdWVzdCwgY2FsbGluZ1VpZCwgY2xpZW50Q2IsICZyZWFzb24pOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHNldHVwIHRyYW5zY29kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBsb2dTZXNzaW9uRW5kZWQocmVhc29uLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG1UcmFuc2NvZGVTdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIGVyciA9IG1UcmFuc2NvZGVyLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHN0YXJ0IHRyYW5zY29kZXI6ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworICAgICAgICBsb2dTZXNzaW9uRW5kZWQoVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbjo6U1RBUlRfRkFJTEVELCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIEFMT0dJKCIlczogdHJhbnNjb2RlciBzdGFydGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBUcmFuc2NvZGVyV3JhcHBlcjo6aGFuZGxlUGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIGlmIChtVHJhbnNjb2RlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogdHJhbnNjb2RlciBpcyBub3QgcnVubmluZyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGNsaWVudElkICE9IG1DdXJyZW50Q2xpZW50SWQgfHwgc2Vzc2lvbklkICE9IG1DdXJyZW50U2Vzc2lvbklkKSB7CisgICAgICAgIEFMT0dXKCIlczogc3RvcHBpbmcgc2Vzc2lvbiB7JWxsZCwgJWR9IHRoYXQncyBub3QgY3VycmVudCBzZXNzaW9uIHslbGxkLCAlZH0iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIChsb25nIGxvbmcpY2xpZW50SWQsIHNlc3Npb25JZCwgKGxvbmcgbG9uZyltQ3VycmVudENsaWVudElkLCBtQ3VycmVudFNlc3Npb25JZCk7CisgICAgfQorCisgICAgQUxPR0koIiVzOiBwYXVzaW5nIHRyYW5zY29kZXIiLCBfX0ZVTkNUSU9OX18pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4gcGF1c2VTdGF0ZXM7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gbVRyYW5zY29kZXItPnBhdXNlKCZwYXVzZVN0YXRlcyk7CisgICAgbG9nU2Vzc2lvbkVuZGVkKFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OlBBVVNFRCwgZXJyKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBwYXVzZSB0cmFuc2NvZGVyOiAlZCIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbVBhdXNlZFN0YXRlTWFwW1Nlc3Npb25LZXlUeXBlKGNsaWVudElkLCBzZXNzaW9uSWQpXSA9IHBhdXNlU3RhdGVzOworCisgICAgQUxPR0koIiVzOiB0cmFuc2NvZGVyIHBhdXNlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgVHJhbnNjb2RlcldyYXBwZXI6OmhhbmRsZVJlc3VtZSgKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICB1aWRfdCBjYWxsaW5nVWlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+IHBhdXNlZFN0YXRlOworICAgIGF1dG8gaXQgPSBtUGF1c2VkU3RhdGVNYXAuZmluZChTZXNzaW9uS2V5VHlwZShjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgaWYgKGl0ICE9IG1QYXVzZWRTdGF0ZU1hcC5lbmQoKSkgeworICAgICAgICBwYXVzZWRTdGF0ZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIG1QYXVzZWRTdGF0ZU1hcC5lcmFzZShpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW4ndCBmaW5kIHBhdXNlZCBzdGF0ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQUxPR0koIiVzOiBzZXR0aW5nIHVwIHRyYW5zY29kZXIgZm9yIHJlc3VtZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbiByZWFzb24gPSBUcmFuc2NvZGluZ0xvZ2dlcjo6U2Vzc2lvbkVuZGVkUmVhc29uOjpVTktOT1dOOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHNldHVwVHJhbnNjb2RlcihjbGllbnRJZCwgc2Vzc2lvbklkLCByZXF1ZXN0LCBjYWxsaW5nVWlkLCBjbGllbnRDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYXNvbiwgcGF1c2VkU3RhdGUpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIHNldHVwIHRyYW5zY29kZXI6ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworICAgICAgICBsb2dTZXNzaW9uRW5kZWQocmVhc29uLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIE5vdGU6IEZvciBub3cgcmVzdW1lKCkgd2lsbCBqdXN0IHJlc3RhcnQgdHJhbnNjb2RpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLCBzbyB0aGVyZSBpcyBubyBuZWVkCisgICAgLy8gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiByZXN1bWUgYW5kIHN0YXJ0IGZyb20gYSBwZXJmb3JtYW5jZSBwZXJzcGVjdGl2ZS4KKyAgICBtVHJhbnNjb2RlU3RhcnRUaW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisKKyAgICBlcnIgPSBtVHJhbnNjb2Rlci0+cmVzdW1lKCk7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVzdW1lIHRyYW5zY29kZXI6ICVkIiwgX19GVU5DVElPTl9fLCBlcnIpOworICAgICAgICBsb2dTZXNzaW9uRW5kZWQoVHJhbnNjb2RpbmdMb2dnZXI6OlNlc3Npb25FbmRlZFJlYXNvbjo6UkVTVU1FX0ZBSUxFRCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBBTE9HSSgiJXM6IHRyYW5zY29kZXIgcmVzdW1lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6Y2xlYW51cCgpIHsKKyAgICBtQ3VycmVudENsaWVudElkID0gMDsKKyAgICBtQ3VycmVudFNlc3Npb25JZCA9IC0xOworICAgIG1DdXJyZW50Q2FsbGluZ1VpZCA9IC0xOworICAgIG1UcmFuc2NvZGVyQ2IgPSBudWxscHRyOworICAgIG1UcmFuc2NvZGVyID0gbnVsbHB0cjsKKyAgICBtU3JjRm9ybWF0ID0gbnVsbHB0cjsKKyAgICBtRHN0Rm9ybWF0ID0gbnVsbHB0cjsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6bG9nU2Vzc2lvbkVuZGVkKGNvbnN0IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb24mIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IpIHsKKyAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHRyYW5zY29kZUR1cmF0aW9uKC0xKTsKKyAgICBpZiAocmVhc29uID09IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb246OkZJTklTSEVEICYmIGVycm9yID09IEFNRURJQV9PSykgeworICAgICAgICB0cmFuc2NvZGVEdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KAorICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gbVRyYW5zY29kZVN0YXJ0VGltZSk7CisgICAgfQorCisgICAgbUxvZ2dlci0+bG9nU2Vzc2lvbkVuZGVkKHJlYXNvbiwgbUN1cnJlbnRDYWxsaW5nVWlkLCBlcnJvciwgdHJhbnNjb2RlRHVyYXRpb24sIG1TcmNGb3JtYXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ec3RGb3JtYXQuZ2V0KCkpOworfQorCit2b2lkIFRyYW5zY29kZXJXcmFwcGVyOjpxdWV1ZUV2ZW50KEV2ZW50OjpUeXBlIHR5cGUsIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBydW5uYWJsZSwgaW50MzJfdCBhcmcpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgaWYgKCFtTG9vcGVyUmVhZHkpIHsKKyAgICAgICAgLy8gQSBzaGFyZWRfcHRyIHRvIG91cnNlbHZlcyBpcyBnaXZlbiB0byB0aGUgdGhyZWFkJ3Mgc3RhY2ssIHNvIHRoYXQgdGhlIFRyYW5zY29kZXJXcmFwcGVyCisgICAgICAgIC8vIG9iamVjdCBkb2Vzbid0IGdvIGF3YXkgdW50aWwgdGhlIHRocmVhZCBleGl0cy4gV2hlbiBhIHdhdGNoZG9nIHRpbWVvdXQgaGFwcGVucywgdGhpcworICAgICAgICAvLyBhbGxvd3MgdGhlIHNlc3Npb24gY29udHJvbGxlciB0byByZWxlYXNlIGl0cyByZWZlcmVuY2UgdG8gdGhlIFRyYW5zY29kZXJXcmFwcGVyIG9iamVjdAorICAgICAgICAvLyB3aXRob3V0IGJsb2NraW5nIG9uIHRoZSB0aHJlYWQgZXhpdHMuCisgICAgICAgIHN0ZDo6dGhyZWFkKFtvd25lciA9IHNoYXJlZF9mcm9tX3RoaXMoKV0oKSB7IG93bmVyLT50aHJlYWRMb29wKCk7IH0pLmRldGFjaCgpOworICAgICAgICBtTG9vcGVyUmVhZHkgPSB0cnVlOworICAgIH0KKworICAgIG1RdWV1ZS5wdXNoX2JhY2soe3R5cGUsIGNsaWVudElkLCBzZXNzaW9uSWQsIHJ1bm5hYmxlLCBhcmd9KTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKK30KKwordm9pZCBUcmFuc2NvZGVyV3JhcHBlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCAvKnRpZCAoMCA9IGN1cnJlbnQpICovLCBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja3ttTG9ja307CisgICAgLy8gVHJhbnNjb2RlcldyYXBwZXIgY3VycmVudGx5IGxpdmVzIGluIHRoZSB0cmFuc2NvZGluZyBzZXJ2aWNlLCBhcyBsb25nIGFzCisgICAgLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgaXRzZWxmLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGV2ZW50LgorICAgICAgICB3aGlsZSAobVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50IGV2ZW50ID0gKm1RdWV1ZS5iZWdpbigpOworICAgICAgICBtUXVldWUucG9wX2Zyb250KCk7CisKKyAgICAgICAgQUxPR1YoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgdG9TdHJpbmcoZXZlbnQpLmNfc3RyKCkpOworCisgICAgICAgIGlmIChldmVudC50eXBlID09IEV2ZW50OjpBYmFuZG9uKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIGV2ZW50LnJ1bm5hYmxlKCk7CisgICAgICAgIGxvY2subG9jaygpOworICAgIH0KK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5jcHAKaW5kZXggNzI1MjQzNy4uNmRiY2FmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmNwcApAQCAtMTcsMTI5ICsxNyw0NDkgQEAKIC8vICNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIlRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciIKIAorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3Blcm1pc3Npb25fbWFuYWdlci5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdVaWRQb2xpY3kuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOworc3RhdGljX2Fzc2VydChzaXplb2YoQ2xpZW50SWRUeXBlKSA9PSBzaXplb2Yodm9pZCopLCAiQ2xpZW50SWRUeXBlIHNob3VsZCBiZSBwb2ludGVyLXNpemVkIik7CiAKLS8vIHN0YXRpYwotVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyJiBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgewotICAgIHN0YXRpYyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIgZ0luc3RhbmNle307Ci0gICAgcmV0dXJuIGdJbnN0YW5jZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuVHJhbnNjb2RpbmdDbGllbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7ICAvLyBGb3Igc2VydmljZSBlcnJvciBjb2RlcwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6Om5kazo6U3BBSUJpbmRlcjsKKworLy9zdGF0aWMKK3N0ZDo6YXRvbWljPENsaWVudElkVHlwZT4gVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpzQ29va2llQ291bnRlciA9IDA7CisvL3N0YXRpYworc3RkOjptdXRleCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OnNDb29raWUyQ2xpZW50TG9jazsKKy8vc3RhdGljCitzdGQ6Om1hcDxDbGllbnRJZFR5cGUsIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEltcGw+PgorICAgICAgICBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OnNDb29raWUyQ2xpZW50OworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgYmluZGVyOjpTdGF0dXMgb2JqZWN0cyBmb3IgZXJyb3IgcmV0dXJucworI2RlZmluZSBTVEFUVVNfRVJST1JfRk1UKGVycm9yQ29kZSwgZXJyb3JTdHJpbmcsIC4uLikgXAorICAgIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yV2l0aE1lc3NhZ2UoICAgICAgXAorICAgICAgICAgICAgZXJyb3JDb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlczolZDogIiBlcnJvclN0cmluZywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXykpCisKKy8qKgorICogQ2xpZW50SW1wbCBpbXBsZW1lbnRzIGEgc2luZ2xlIGNsaWVudCBhbmQgY29udGFpbnMgYWxsIGl0cyBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW1wbCA6IHB1YmxpYyBCblRyYW5zY29kaW5nQ2xpZW50IHsKKyAgICAvKiBUaGUgcmVtb3RlIGNsaWVudCBjYWxsYmFjayB0aGF0IHRoaXMgQ2xpZW50SW5mbyBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgICogT25jZSB0aGUgQ2xpZW50SW5mbyBpcyBjcmVhdGVkLCB3ZSBob2xkIGFuIFNwQUlCaW5kZXIgc28gdGhhdCB0aGUgYmluZGVyCisgICAgICogb2JqZWN0IGRvZXNuJ3QgZ2V0IGNyZWF0ZWQgYWdhaW4sIG90aGVyd2lzZSB0aGUgYmluZGVyIG9iamVjdCBwb2ludGVyCisgICAgICogbWF5IG5vdCBiZSB1bmlxdWUuCisgICAgICovCisgICAgU3BBSUJpbmRlciBtQ2xpZW50QmluZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4gbUNsaWVudENhbGxiYWNrOworICAgIC8qIEEgdW5pcXVlIGlkIGFzc2lnbmVkIHRvIHRoZSBjbGllbnQgYnkgdGhlIHNlcnZpY2UuIFRoaXMgbnVtYmVyIGlzIHVzZWQKKyAgICAgKiBieSB0aGUgc2VydmljZSBmb3IgaW5kZXhpbmcuIEhlcmUgd2UgdXNlIHRoZSBiaW5kZXIgb2JqZWN0J3MgcG9pbnRlcgorICAgICAqIChjYXN0ZWQgdG8gaW50NjR0X3QpIGFzIHRoZSBjbGllbnQgaWQuCisgICAgICovCisgICAgQ2xpZW50SWRUeXBlIG1DbGllbnRJZDsKKyAgICBzdGQ6OnN0cmluZyBtQ2xpZW50TmFtZTsKKyAgICBzdGQ6OnN0cmluZyBtQ2xpZW50T3BQYWNrYWdlTmFtZTsKKworICAgIC8vIE5leHQgc2Vzc2lvbklkIHRvIGFzc2lnbi4KKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBtTmV4dFNlc3Npb25JZDsKKyAgICAvLyBXaGV0aGVyIHRoaXMgY2xpZW50IGhhcyBiZWVuIHVucmVnaXN0ZXJlZCBhbHJlYWR5LgorICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1BYmFuZG9uZWQ7CisgICAgLy8gV2VhayBwb2ludGVyIHRvIHRoZSBjbGllbnQgbWFuYWdlciBmb3IgdGhpcyBjbGllbnQuCisgICAgc3RkOjp3ZWFrX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG1Pd25lcjsKKworICAgIENsaWVudEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2xpZW50TmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4mIG93bmVyKTsKKworICAgIFN0YXR1cyBzdWJtaXRSZXF1ZXN0KGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLyppbl9yZXF1ZXN0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsKiAvKm91dF9zZXNzaW9uKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgY2FuY2VsU2Vzc2lvbihpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8sIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIG92ZXJyaWRlOworCisgICAgU3RhdHVzIGdldFNlc3Npb25XaXRoSWQoaW50MzJfdCAvKmluX3Nlc3Npb25JZCovLCBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwqIC8qb3V0X3Nlc3Npb24qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBhZGRDbGllbnRVaWQoaW50MzJfdCAvKmluX3Nlc3Npb25JZCovLCBpbnQzMl90IC8qaW5fY2xpZW50VWlkKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBnZXRDbGllbnRVaWRzKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgdW5yZWdpc3RlcigpIG92ZXJyaWRlOworfTsKKworVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpDbGllbnRJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaywgY29uc3Qgc3RkOjpzdHJpbmcmIGNsaWVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OndlYWtfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4mIG93bmVyKQorICAgICAgOiBtQ2xpZW50QmluZGVyKChjYWxsYmFjayAhPSBudWxscHRyKSA/IGNhbGxiYWNrLT5hc0JpbmRlcigpIDogbnVsbHB0ciksCisgICAgICAgIG1DbGllbnRDYWxsYmFjayhjYWxsYmFjayksCisgICAgICAgIG1DbGllbnRJZChzQ29va2llQ291bnRlci5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpLAorICAgICAgICBtQ2xpZW50TmFtZShjbGllbnROYW1lKSwKKyAgICAgICAgbUNsaWVudE9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCisgICAgICAgIG1OZXh0U2Vzc2lvbklkKDApLAorICAgICAgICBtQWJhbmRvbmVkKGZhbHNlKSwKKyAgICAgICAgbU93bmVyKG93bmVyKSB7fQorCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpzdWJtaXRSZXF1ZXN0KAorICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIGluX3JlcXVlc3QsIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCogb3V0X3Nlc3Npb24sCisgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcmVxdWVzdC5zb3VyY2VGaWxlUGF0aC5lbXB0eSgpIHx8IGluX3JlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgaW50MzJfdCBjYWxsaW5nUGlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludDMyX3QgY2FsbGluZ1VpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKKyAgICBpbnQzMl90IGluX2NsaWVudFVpZCA9IGluX3JlcXVlc3QuY2xpZW50VWlkOworICAgIGludDMyX3QgaW5fY2xpZW50UGlkID0gaW5fcmVxdWVzdC5jbGllbnRQaWQ7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUKKyAgICAvLyB1aWQgb24gYXBwIGNsaWVudCdzIGJlaGFsZi4KKyAgICBpZiAoaW5fY2xpZW50VWlkID09IElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6VVNFX0NBTExJTkdfVUlEKSB7CisgICAgICAgIGluX2NsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgPCAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgIT0gY2FsbGluZ1VpZCAmJiAhb3duZXItPmlzVHJ1c3RlZENhbGxlcihjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICBBTE9HRSgic3VibWl0UmVxdWVzdCByZWplY3RlZCAoY2xpZW50UGlkICVkLCBjbGllbnRVaWQgJWQpICIKKyAgICAgICAgICAgICAgIihkb24ndCB0cnVzdCBjYWxsaW5nVWlkICVkKSIsCisgICAgICAgICAgICAgIGluX2NsaWVudFBpZCwgaW5fY2xpZW50VWlkLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Ym1pdFJlcXVlc3QgcmVqZWN0ZWQgKGNsaWVudFBpZCAlZCwgY2xpZW50VWlkICVkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZG9uJ3QgdHJ1c3QgY2FsbGluZ1VpZCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgY2FsbGluZ1VpZCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIHRydXN0IGNsaWVudFBpZC4gT25seSBwcml2aWxlZ2UgY2FsbGVyIGNvdWxkIGZvcndhcmQgdGhlCisgICAgLy8gcGlkIG9uIGFwcCBjbGllbnQncyBiZWhhbGYuCisgICAgaWYgKGluX2NsaWVudFBpZCA9PSBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OlVTRV9DQUxMSU5HX1BJRCkgeworICAgICAgICBpbl9jbGllbnRQaWQgPSBjYWxsaW5nUGlkOworICAgIH0gZWxzZSBpZiAoaW5fY2xpZW50UGlkIDwgMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0gZWxzZSBpZiAoaW5fY2xpZW50UGlkICE9IGNhbGxpbmdQaWQgJiYgIW93bmVyLT5pc1RydXN0ZWRDYWxsZXIoY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgQUxPR0UoInN1Ym1pdFJlcXVlc3QgcmVqZWN0ZWQgKGNsaWVudFBpZCAlZCwgY2xpZW50VWlkICVkKSAiCisgICAgICAgICAgICAgICIoZG9uJ3QgdHJ1c3QgY2FsbGluZ1VpZCAlZCkiLAorICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgY2FsbGluZ1VpZCk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJtaXRSZXF1ZXN0IHJlamVjdGVkIChjbGllbnRQaWQgJWQsIGNsaWVudFVpZCAlZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRvbid0IHRydXN0IGNhbGxpbmdVaWQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2xpZW50UGlkLCBpbl9jbGllbnRVaWQsIGNhbGxpbmdVaWQpOworICAgIH0KKworICAgIGludDMyX3Qgc2Vzc2lvbklkID0gbU5leHRTZXNzaW9uSWQuZmV0Y2hfYWRkKDEpOworCisgICAgKl9haWRsX3JldHVybiA9IG93bmVyLT5tU2Vzc2lvbkNvbnRyb2xsZXItPnN1Ym1pdChtQ2xpZW50SWQsIHNlc3Npb25JZCwgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NsaWVudFVpZCwgaW5fcmVxdWVzdCwgbUNsaWVudENhbGxiYWNrKTsKKworICAgIGlmICgqX2FpZGxfcmV0dXJuKSB7CisgICAgICAgIG91dF9zZXNzaW9uLT5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisKKyAgICAgICAgLy8gVE9ETyhjaHopOiBpcyBzb21lIG9mIHRoaXMgY29taW5nIGZyb20gU2Vzc2lvbkNvbnRyb2xsZXI/CisgICAgICAgICooVHJhbnNjb2RpbmdSZXF1ZXN0Kikmb3V0X3Nlc3Npb24tPnJlcXVlc3QgPSBpbl9yZXF1ZXN0OworICAgICAgICBvdXRfc2Vzc2lvbi0+YXdhaXROdW1iZXJPZlNlc3Npb25zID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpjYW5jZWxTZXNzaW9uKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyPiBvd25lcjsKKyAgICBpZiAobUFiYW5kb25lZCB8fCAob3duZXIgPSBtT3duZXIubG9jaygpKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgaWYgKGluX3Nlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gb3duZXItPm1TZXNzaW9uQ29udHJvbGxlci0+Y2FuY2VsKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjpnZXRTZXNzaW9uV2l0aElkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwqIG91dF9zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyPiBvd25lcjsKKyAgICBpZiAobUFiYW5kb25lZCB8fCAob3duZXIgPSBtT3duZXIubG9jaygpKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisgICAgfQorCisgICAgaWYgKGluX3Nlc3Npb25JZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0KKyAgICAgICAgICAgIG93bmVyLT5tU2Vzc2lvbkNvbnRyb2xsZXItPmdldFNlc3Npb24obUNsaWVudElkLCBpbl9zZXNzaW9uSWQsICZvdXRfc2Vzc2lvbi0+cmVxdWVzdCk7CisKKyAgICBpZiAoKl9haWRsX3JldHVybikgeworICAgICAgICBvdXRfc2Vzc2lvbi0+c2Vzc2lvbklkID0gaW5fc2Vzc2lvbklkOworICAgICAgICBvdXRfc2Vzc2lvbi0+YXdhaXROdW1iZXJPZlNlc3Npb25zID0gMDsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW1wbDo6YWRkQ2xpZW50VWlkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5fY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKKyAgICBpbnQzMl90IGNhbGxpbmdVaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgYWRkIHVpZCB0byBleGlzdGluZyBzZXNzaW9ucy4KKyAgICBpZiAoaW5fY2xpZW50VWlkID09IElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6VVNFX0NBTExJTkdfVUlEKSB7CisgICAgICAgIGluX2NsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgPCAwKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfSBlbHNlIGlmIChpbl9jbGllbnRVaWQgIT0gY2FsbGluZ1VpZCAmJiAhb3duZXItPmlzVHJ1c3RlZENhbGxlcihjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICBBTE9HRSgiYWRkQ2xpZW50VWlkIHJlamVjdGVkIChjbGllbnRVaWQgJWQpICIKKyAgICAgICAgICAgICAgIihkb24ndCB0cnVzdCBjYWxsaW5nVWlkICVkKSIsCisgICAgICAgICAgICAgIGluX2NsaWVudFVpZCwgY2FsbGluZ1VpZCk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRDbGllbnRVaWQgcmVqZWN0ZWQgKGNsaWVudFVpZCAlZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRvbid0IHRydXN0IGNhbGxpbmdVaWQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2xpZW50VWlkLCBjYWxsaW5nVWlkKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gb3duZXItPm1TZXNzaW9uQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkLCBpbl9jbGllbnRVaWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEltcGw6OmdldENsaWVudFVpZHMoCisgICAgICAgIGludDMyX3QgaW5fc2Vzc2lvbklkLCBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IHN0ZDo6bnVsbG9wdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChtQWJhbmRvbmVkIHx8IChvd25lciA9IG1Pd25lci5sb2NrKCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fc2Vzc2lvbklkIDwgMCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlc3VsdDsKKworICAgIGlmIChvd25lci0+bVNlc3Npb25Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkLCAmcmVzdWx0KSkgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbXBsOjp1bnJlZ2lzdGVyKCkgeworICAgIGJvb2wgYWJhbmRvbmVkID0gbUFiYW5kb25lZC5leGNoYW5nZSh0cnVlKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI+IG93bmVyOworICAgIGlmIChhYmFuZG9uZWQgfHwgKG93bmVyID0gbU93bmVyLmxvY2soKSkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworICAgIH0KKworICAgIC8vIFVzZSBzZXNzaW9uSWQgPT0gLTEgdG8gY2FuY2VsIGFsbCByZWFsdGltZSBzZXNzaW9ucyBmb3IgdGhpcyBjbGllbnQgd2l0aCB0aGUgY29udHJvbGxlci4KKyAgICBvd25lci0+bVNlc3Npb25Db250cm9sbGVyLT5jYW5jZWwobUNsaWVudElkLCAtMSk7CisgICAgb3duZXItPnJlbW92ZUNsaWVudChtQ2xpZW50SWQpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiAvLyBzdGF0aWMKIHZvaWQgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKSB7Ci0gICAgaW50MzJfdCBjbGllbnRJZCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGNvb2tpZSkpOwotICAgIEFMT0dEKCJDbGllbnQgJSIgUFJJZDMyICIgaXMgZGVhZCIsIGNsaWVudElkKTsKLSAgICAvLyBEb24ndCBjaGVjayBmb3IgcGlkIHZhbGlkaXR5IHNpbmNlIHdlIGtub3cgaXQncyBhbHJlYWR5IGRlYWQuCi0gICAgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyJiBtYW5hZ2VyID0gVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwotICAgIG1hbmFnZXIucmVtb3ZlQ2xpZW50KGNsaWVudElkKTsKKyAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQgPSByZWludGVycHJldF9jYXN0PENsaWVudElkVHlwZT4oY29va2llKTsKKworICAgIEFMT0dEKCJDbGllbnQgJWxsZCBpcyBkZWFkIiwgKGxvbmcgbG9uZyljbGllbnRJZCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50SW1wbD4gY2xpZW50OworCisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZTJDbGllbnRMb2NrfTsKKworICAgICAgICBhdXRvIGl0ID0gc0Nvb2tpZTJDbGllbnQuZmluZChjbGllbnRJZCk7CisgICAgICAgIGlmIChpdCAhPSBzQ29va2llMkNsaWVudC5lbmQoKSkgeworICAgICAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICB9CiB9CiAKLVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyKCkKLSAgICA6IG1EZWF0aFJlY2lwaWVudChBSUJpbmRlcl9EZWF0aFJlY2lwaWVudF9uZXcoQmluZGVyRGllZENhbGxiYWNrKSkgeworVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb250cm9sbGVyQ2xpZW50SW50ZXJmYWNlPiYgY29udHJvbGxlcikKKyAgICAgIDogbURlYXRoUmVjaXBpZW50KEFJQmluZGVyX0RlYXRoUmVjaXBpZW50X25ldyhCaW5kZXJEaWVkQ2FsbGJhY2spKSwKKyAgICAgICAgbVNlc3Npb25Db250cm9sbGVyKGNvbnRyb2xsZXIpIHsKICAgICBBTE9HRCgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIHN0YXJ0ZWQiKTsKKyAgICBmb3IgKHVpZF90IHVpZCA6IHtBSURfUk9PVCwgQUlEX1NZU1RFTSwgQUlEX1NIRUxMLCBBSURfTUVESUF9KSB7CisgICAgICAgIG1UcnVzdGVkVWlkcy5pbnNlcnQodWlkKTsKKyAgICB9CiB9CiAKIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6flRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpIHsKICAgICBBTE9HRCgiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIGV4aXRlZCIpOwogfQogCi1ib29sIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6aXNDbGllbnRJZFJlZ2lzdGVyZWQoaW50MzJfdCBjbGllbnRJZCkgY29uc3QgewotICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307Ci0gICAgcmV0dXJuIG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5maW5kKGNsaWVudElkKSAhPSBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZW5kKCk7Ci19Ci0KIHZvaWQgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpkdW1wQWxsQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgVG90YWwgbnVtIG9mIENsaWVudHM6ICV6dVxuIiwgbUNsaWVudElkVG9DbGllbnRJbmZvTWFwLnNpemUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgaWYgKG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIj09PT09PT09PT0gRHVtcGluZyBhbGwgY2xpZW50cyA9PT09PT09PT1cbiIpOworICAgIGlmIChtQ2xpZW50SWRUb0NsaWVudE1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuPT09PT09PT09PSBEdW1waW5nIGFsbCBjbGllbnRzID09PT09PT09PVxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9CiAKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXApIHsKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGl0ZXIuc2Vjb25kLT5tQ2xpZW50OwotICAgICAgICBzdGQ6OnN0cmluZyBjbGllbnROYW1lOwotICAgICAgICBTdGF0dXMgc3RhdHVzID0gY2xpZW50LT5nZXROYW1lKCZjbGllbnROYW1lKTsKLSAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBjbGllbnQ6ICVkIGluZm9ybWF0aW9uIiwgaXRlci5maXJzdCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLS0gQ2xpZW50czogJWQgIG5hbWU6ICVzXG4iLCBpdGVyLmZpcnN0LCBjbGllbnROYW1lLmNfc3RyKCkpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgVG90YWwgbnVtIG9mIENsaWVudHM6ICV6dVxuIiwgbUNsaWVudElkVG9DbGllbnRNYXAuc2l6ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtQ2xpZW50SWRUb0NsaWVudE1hcCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgQ2xpZW50ICVsbGQ6ICBwa2c6ICVzXG4iLCAobG9uZyBsb25nKWl0ZXIuZmlyc3QsCisgICAgICAgICAgICAgICAgIGl0ZXIuc2Vjb25kLT5tQ2xpZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi1zdGF0dXNfdCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmFkZENsaWVudChzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50SW5mbz4gY2xpZW50KSB7Ci0gICAgLy8gVmFsaWRhdGUgdGhlIGNsaWVudC4KLSAgICBpZiAoY2xpZW50ID09IG51bGxwdHIgfHwgY2xpZW50LT5tQ2xpZW50SWQgPCAwIHx8IGNsaWVudC0+bUNsaWVudFBpZCA8IDAgfHwKLSAgICAgICAgY2xpZW50LT5tQ2xpZW50VWlkIDwgMCB8fCBjbGllbnQtPm1DbGllbnRPcFBhY2thZ2VOYW1lLmVtcHR5KCkgfHwKLSAgICAgICAgY2xpZW50LT5tQ2xpZW50T3BQYWNrYWdlTmFtZSA9PSAiIikgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjbGllbnQiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK2Jvb2wgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjppc1RydXN0ZWRDYWxsZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAodWlkID4gMCAmJiBtVHJ1c3RlZFVpZHMuY291bnQodWlkKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgaW50MzJfdCByZXN1bHQ7CisgICAgaWYgKF9fYnVpbHRpbl9hdmFpbGFibGUoYW5kcm9pZCBfX1RSQU5TQ09ESU5HX01JTl9BUElfXywgKikpIHsKKyAgICAgICAgaWYgKEFQZXJtaXNzaW9uTWFuYWdlcl9jaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9NRURJQV9TVE9SQUdFIiwgcGlkLCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpID09IFBFUk1JU1NJT05fTUFOQUdFUl9TVEFUVVNfT0sgJiYKKyAgICAgICAgICAgIHJlc3VsdCA9PSBQRVJNSVNTSU9OX01BTkFHRVJfUEVSTUlTU0lPTl9HUkFOVEVEKSB7CisgICAgICAgICAgICBtVHJ1c3RlZFVpZHMuaW5zZXJ0KHVpZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjphZGRDbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNhbGxiYWNrLCBjb25zdCBzdGQ6OnN0cmluZyYgY2xpZW50TmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+KiBvdXRDbGllbnQpIHsKKyAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50MzJfdCBjYWxsaW5nVWlkID0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpOworCisgICAgLy8gQ2hlY2sgaWYgY2xpZW50IGhhcyB0aGUgcGVybWlzc2lvbgorICAgIGlmICghaXNUcnVzdGVkQ2FsbGVyKGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIEFMT0dFKCJhZGRDbGllbnQgcmVqZWN0ZWQgKGNsaWVudFBpZCAlZCwgY2xpZW50VWlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOworICAgICAgICByZXR1cm4gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50LgorICAgIGlmIChjYWxsYmFjayA9PSBudWxscHRyIHx8IGNsaWVudE5hbWUuZW1wdHkoKSB8fCBvcFBhY2thZ2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgY2xpZW50Iik7CisgICAgICAgIHJldHVybiBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCisgICAgU3BBSUJpbmRlciBiaW5kZXIgPSBjYWxsYmFjay0+YXNCaW5kZXIoKTsKKwogICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CiAKLSAgICAvLyBDaGVjayBpZiB0aGUgY2xpZW50IGFscmVhZHkgZXhpc3RzLgotICAgIGlmIChtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuY291bnQoY2xpZW50LT5tQ2xpZW50SWQpICE9IDApIHsKLSAgICAgICAgQUxPR1coIkNsaWVudCBhbHJlYWR5IGV4aXN0cy4iKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGFscmVhZHkgcmVnaXN0ZXJzLgorICAgIGlmIChtUmVnaXN0ZXJlZENhbGxiYWNrcy5jb3VudCgodWludHB0cl90KWJpbmRlci5nZXQoKSkgPiAwKSB7CisgICAgICAgIHJldHVybiBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0FMUkVBRFlfRVhJU1RTOwogICAgIH0KIAotICAgIEFMT0dEKCJBZGRpbmcgY2xpZW50IGlkICVkIHBpZDogJWQgdWlkOiAlZCAlcyIsIGNsaWVudC0+bUNsaWVudElkLCBjbGllbnQtPm1DbGllbnRQaWQsCi0gICAgICAgICAgY2xpZW50LT5tQ2xpZW50VWlkLCBjbGllbnQtPm1DbGllbnRPcFBhY2thZ2VOYW1lLmNfc3RyKCkpOworICAgIC8vIENyZWF0ZXMgdGhlIGNsaWVudCAod2l0aCB0aGUgaWQgYXNzaWduZWQgYnkgQ2xpZW50SW1wbCkuCisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudEltcGw+IGNsaWVudCA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPENsaWVudEltcGw+KAorICAgICAgICAgICAgY2FsbGJhY2ssIGNsaWVudE5hbWUsIG9wUGFja2FnZU5hbWUsIHNoYXJlZF9mcm9tX3RoaXMoKSk7CiAKLSAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChjbGllbnQtPm1DbGllbnQtPmFzQmluZGVyKCkuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKKyAgICBBTE9HRCgiQWRkaW5nIGNsaWVudCBpZCAlbGxkLCBuYW1lICVzLCBwYWNrYWdlICVzIiwgKGxvbmcgbG9uZyljbGllbnQtPm1DbGllbnRJZCwKKyAgICAgICAgICBjbGllbnQtPm1DbGllbnROYW1lLmNfc3RyKCksIGNsaWVudC0+bUNsaWVudE9wUGFja2FnZU5hbWUuY19zdHIoKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llMkNsaWVudExvY2t9OworICAgICAgICBzQ29va2llMkNsaWVudC5lbXBsYWNlKHN0ZDo6bWFrZV9wYWlyKGNsaWVudC0+bUNsaWVudElkLCBjbGllbnQpKTsKKyAgICB9CisKKyAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihjbGllbnQtPm1DbGllbnRJZCkpOwogCiAgICAgLy8gQWRkcyB0aGUgbmV3IGNsaWVudCB0byB0aGUgbWFwLgotICAgIG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcFtjbGllbnQtPm1DbGllbnRJZF0gPSBzdGQ6Om1vdmUoY2xpZW50KTsKKyAgICBtUmVnaXN0ZXJlZENhbGxiYWNrcy5pbnNlcnQoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCkpOworICAgIG1DbGllbnRJZFRvQ2xpZW50TWFwW2NsaWVudC0+bUNsaWVudElkXSA9IGNsaWVudDsKKworICAgICpvdXRDbGllbnQgPSBjbGllbnQ7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6cmVtb3ZlQ2xpZW50KGludDMyX3QgY2xpZW50SWQpIHsKLSAgICBBTE9HRCgiUmVtb3ZpbmcgY2xpZW50IGlkICVkIiwgY2xpZW50SWQpOworc3RhdHVzX3QgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpyZW1vdmVDbGllbnQoQ2xpZW50SWRUeXBlIGNsaWVudElkKSB7CisgICAgQUxPR0QoIlJlbW92aW5nIGNsaWVudCBpZCAlbGxkIiwgKGxvbmcgbG9uZyljbGllbnRJZCk7CiAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKIAogICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGlzIHZhbGlkLgotICAgIGF1dG8gaXQgPSBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZmluZChjbGllbnRJZCk7Ci0gICAgaWYgKGl0ID09IG1DbGllbnRJZFRvQ2xpZW50SW5mb01hcC5lbmQoKSkgewotICAgICAgICBBTE9HRSgiQ2xpZW50IGlkICVkIGRvZXMgbm90IGV4aXN0IiwgY2xpZW50SWQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgYXV0byBpdCA9IG1DbGllbnRJZFRvQ2xpZW50TWFwLmZpbmQoY2xpZW50SWQpOworICAgIGlmIChpdCA9PSBtQ2xpZW50SWRUb0NsaWVudE1hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiQ2xpZW50IGlkICVsbGQgZG9lcyBub3QgZXhpc3QiLCAobG9uZyBsb25nKWNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQtPm1DbGllbnQ7CisgICAgU3BBSUJpbmRlciBiaW5kZXIgPSBpdC0+c2Vjb25kLT5tQ2xpZW50QmluZGVyOwogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBzdGlsbCBsaXZlLiBJZiBhbGl2ZSwgdW5saW5rIHRoZSBkZWF0aC4KLSAgICBpZiAoY2xpZW50KSB7Ci0gICAgICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoY2xpZW50LT5hc0JpbmRlcigpLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oY2xpZW50SWQpKTsKKyAgICBpZiAoYmluZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUlCaW5kZXJfdW5saW5rVG9EZWF0aChiaW5kZXIuZ2V0KCksIG1EZWF0aFJlY2lwaWVudC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihpdC0+c2Vjb25kLT5tQ2xpZW50SWQpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llMkNsaWVudExvY2t9OworICAgICAgICBzQ29va2llMkNsaWVudC5lcmFzZShpdC0+c2Vjb25kLT5tQ2xpZW50SWQpOwogICAgIH0KIAogICAgIC8vIEVyYXNlIHRoZSBlbnRyeS4KLSAgICBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuZXJhc2UoaXQpOworICAgIG1DbGllbnRJZFRvQ2xpZW50TWFwLmVyYXNlKGl0KTsKKyAgICBtUmVnaXN0ZXJlZENhbGxiYWNrcy5lcmFzZSgodWludHB0cl90KWJpbmRlci5nZXQoKSk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHNpemVfdCBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmdldE51bU9mQ2xpZW50cygpIGNvbnN0IHsKICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OwotICAgIHJldHVybiBtQ2xpZW50SWRUb0NsaWVudEluZm9NYXAuc2l6ZSgpOworICAgIHJldHVybiBtQ2xpZW50SWRUb0NsaWVudE1hcC5zaXplKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nTG9nZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdMb2dnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTUyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nTG9nZ2VyLmNwcApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRyYW5zY29kaW5nTG9nZ2VyIgorCisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdMb2dnZXIuaD4KKyNpbmNsdWRlIDxzdGF0c2xvZ19tZWRpYS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpY19hc3NlcnQoVHJhbnNjb2RpbmdMb2dnZXI6OlVOS05PV04gPT0KKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERURfX1JFQVNPTl9fVU5LTk9XTiwKKyAgICAgICAgICAgICAgIlNlc3Npb24gZXZlbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoVHJhbnNjb2RpbmdMb2dnZXI6OkZJTklTSEVEID09CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OnN0YXRzOjpNRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0VOREVEX19SRUFTT05fX0ZJTklTSEVELAorICAgICAgICAgICAgICAiU2Vzc2lvbiBldmVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChUcmFuc2NvZGluZ0xvZ2dlcjo6RVJST1IgPT0KKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERURfX1JFQVNPTl9fRVJST1IsCisgICAgICAgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KFRyYW5zY29kaW5nTG9nZ2VyOjpQQVVTRUQgPT0KKyAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERURfX1JFQVNPTl9fUEFVU0VELAorICAgICAgICAgICAgICAiU2Vzc2lvbiBldmVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChUcmFuc2NvZGluZ0xvZ2dlcjo6Q0FOQ0VMTEVEID09CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OnN0YXRzOjpNRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0VOREVEX19SRUFTT05fX0NBTkNFTExFRCwKKyAgICAgICAgICAgICAgIlNlc3Npb24gZXZlbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoVHJhbnNjb2RpbmdMb2dnZXI6OlNUQVJUX0ZBSUxFRCA9PQorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhOjpzdGF0czo6TUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9FTkRFRF9fUkVBU09OX19TVEFSVF9GQUlMRUQsCisgICAgICAgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KFRyYW5zY29kaW5nTG9nZ2VyOjpSRVNVTUVfRkFJTEVEID09CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OnN0YXRzOjpNRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0VOREVEX19SRUFTT05fX1JFU1VNRV9GQUlMRUQsCisgICAgICAgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KFRyYW5zY29kaW5nTG9nZ2VyOjpDUkVBVEVfRkFJTEVEID09CisgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OnN0YXRzOjpNRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0VOREVEX19SRUFTT05fX0NSRUFURV9GQUlMRUQsCisgICAgICAgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KAorICAgICAgICBUcmFuc2NvZGluZ0xvZ2dlcjo6Q09ORklHX1NSQ19GQUlMRUQgPT0KKyAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERURfX1JFQVNPTl9fQ09ORklHX1NSQ19GQUlMRUQsCisgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KAorICAgICAgICBUcmFuc2NvZGluZ0xvZ2dlcjo6Q09ORklHX0RTVF9GQUlMRUQgPT0KKyAgICAgICAgICAgICAgICBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERURfX1JFQVNPTl9fQ09ORklHX0RTVF9GQUlMRUQsCisgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KAorICAgICAgICBUcmFuc2NvZGluZ0xvZ2dlcjo6Q09ORklHX1RSQUNLX0ZBSUxFRCA9PQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhOjpzdGF0czo6TUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9FTkRFRF9fUkVBU09OX19DT05GSUdfVFJBQ0tfRkFJTEVELAorICAgICAgICAiU2Vzc2lvbiBldmVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydCgKKyAgICAgICAgVHJhbnNjb2RpbmdMb2dnZXI6Ok9QRU5fU1JDX0ZEX0ZBSUxFRCA9PQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhOjpzdGF0czo6TUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9FTkRFRF9fUkVBU09OX19PUEVOX1NSQ19GRF9GQUlMRUQsCisgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KAorICAgICAgICBUcmFuc2NvZGluZ0xvZ2dlcjo6T1BFTl9EU1RfRkRfRkFJTEVEID09CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6bWVkaWE6OnN0YXRzOjpNRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0VOREVEX19SRUFTT05fX09QRU5fRFNUX0ZEX0ZBSUxFRCwKKyAgICAgICAgIlNlc3Npb24gZXZlbnQgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoVHJhbnNjb2RpbmdMb2dnZXI6Ok5PX1RSQUNLUyA9PQorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Om1lZGlhOjpzdGF0czo6TUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9FTkRFRF9fUkVBU09OX19OT19UUkFDS1MsCisgICAgICAgICAgICAgICJTZXNzaW9uIGV2ZW50IG1pc21hdGNoIik7CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBnZXRJbnQzMihBTWVkaWFGb3JtYXQqIGZtdCwgY29uc3QgY2hhcioga2V5LCBpbnQzMl90IGRlZmF1bHRWYWx1ZSA9IC0xKSB7CisgICAgaW50MzJfdCB2YWx1ZTsKKyAgICBpZiAoZm10ID09IG51bGxwdHIgfHwgIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihmbXQsIGtleSwgJnZhbHVlKSkgeworICAgICAgICBBTE9HVygiVW5hYmxlIHRvIGdldCAlcyIsIGtleSk7CisgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8vIE5vdGU6IHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSBmb3JtYXQgYW5kIG9ubHkgdmFsaWQgdW50aWwgdGhlIG5leHQgZ2V0U3RyaW5nLgorc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiBnZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiBmbXQsIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSA9ICIobnVsbCkiKSB7CisgICAgY29uc3QgY2hhciogdmFsdWU7CisgICAgaWYgKGZtdCA9PSBudWxscHRyIHx8ICFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZtdCwga2V5LCAmdmFsdWUpKSB7CisgICAgICAgIEFMT0dXKCJVbmFibGUgdG8gZ2V0ICVzIiwga2V5KTsKKyAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKworVHJhbnNjb2RpbmdMb2dnZXI6OlRyYW5zY29kaW5nTG9nZ2VyKCkKKyAgICAgIDogbVNlc3Npb25FbmRlZEF0b21Xcml0ZXIoJmFuZHJvaWQ6Om1lZGlhOjpzdGF0czo6c3RhdHNfd3JpdGUpIHt9CisKK3ZvaWQgVHJhbnNjb2RpbmdMb2dnZXI6OmxvZ1Nlc3Npb25FbmRlZChlbnVtIFNlc3Npb25FbmRlZFJlYXNvbiByZWFzb24sIHVpZF90IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHNyY0Zvcm1hdCwgQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICBsb2dTZXNzaW9uRW5kZWQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCksIHJlYXNvbiwgY2FsbGluZ1VpZCwgc3RhdHVzLCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOworfQorCit2b2lkIFRyYW5zY29kaW5nTG9nZ2VyOjpsb2dTZXNzaW9uRW5kZWQoY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCYgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gU2Vzc2lvbkVuZGVkUmVhc29uIHJlYXNvbiwgdWlkX3QgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogc3JjRm9ybWF0LCBBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgIGlmIChzcmNGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiU291cmNlIGZvcm1hdCBpcyBudWxsLiBEcm9wcGluZyBldmVudC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc2hvdWxkTG9nQXRvbShub3csIHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0QoIk1heGltdW0gbG9nZ2VkIGV2ZW50IGNvdW50IHJlYWNoZWQuIERyb3BwaW5nIGV2ZW50LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgcGllY2VzIG9mIGluZm9ybWF0aW9uIHRvIGxvZy4KKyAgICBjb25zdCBpbnQzMl90IHNyY1dpZHRoID0gZ2V0SW50MzIoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRIKTsKKyAgICBjb25zdCBpbnQzMl90IHNyY0hlaWdodCA9IGdldEludDMyKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQpOworICAgIGNvbnN0IGNoYXIqIHNyY01pbWUgPSBnZXRTdHJpbmcoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUpOworICAgIGNvbnN0IGludDMyX3Qgc3JjUHJvZmlsZSA9IGdldEludDMyKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFKTsKKyAgICBjb25zdCBpbnQzMl90IHNyY0xldmVsID0gZ2V0SW50MzIoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMKTsKKyAgICBjb25zdCBpbnQzMl90IHNyY0ZyYW1lUmF0ZSA9IGdldEludDMyKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFKTsKKyAgICBjb25zdCBpbnQzMl90IHNyY0ZyYW1lQ291bnQgPSBnZXRJbnQzMihzcmNGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQpOworICAgIGNvbnN0IGJvb2wgc3JjSXNIZHIgPSBBTWVkaWFGb3JtYXRVdGlsczo6VmlkZW9Jc0hkcihzcmNGb3JtYXQpOworCisgICAgaW50MzJfdCBkc3RXaWR0aCA9IGdldEludDMyKGRzdEZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgc3JjV2lkdGgpOworICAgIGludDMyX3QgZHN0SGVpZ2h0ID0gZ2V0SW50MzIoZHN0Rm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgc3JjSGVpZ2h0KTsKKyAgICBjb25zdCBjaGFyKiBkc3RNaW1lID0gZHN0Rm9ybWF0ID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJwYXNzdGhyb3VnaCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFN0cmluZyhkc3RGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgc3JjTWltZSk7CisgICAgY29uc3QgYm9vbCBkc3RJc0hkciA9IGZhbHNlOyAgLy8gVHJhbnNjb2RlciBhbHdheXMgcmVxdWVzdCBTRFIgb3V0cHV0LgorCisgICAgaW50NjRfdCB0bXBEdXJhdGlvblVzOworICAgIGNvbnN0IGludDMyX3Qgc3JjRHVyYXRpb25NcyA9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoc3JjRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmdG1wRHVyYXRpb25VcykKKyAgICAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxpbnQzMl90Pih0bXBEdXJhdGlvblVzIC8gMTAwMCkKKyAgICAgICAgICAgICAgICAgICAgOiAtMTsKKworICAgIGludDMyX3QgdHJhbnNjb2RlRnJhbWVSYXRlID0gLTE7CisgICAgaWYgKHN0YXR1cyA9PSAwICYmIHNyY0ZyYW1lQ291bnQgPiAwICYmIGR1cmF0aW9uLmNvdW50KCkgPiAwKSB7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGU+IHNlY29uZHN7ZHVyYXRpb259OworICAgICAgICB0cmFuc2NvZGVGcmFtZVJhdGUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigKKyAgICAgICAgICAgICAgICBzdGQ6OnJvdW5kKHN0YXRpY19jYXN0PGRvdWJsZT4oc3JjRnJhbWVDb3VudCkgLyBzZWNvbmRzLmNvdW50KCkpKTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgYXRvbS4KKyAgICBtU2Vzc2lvbkVuZGVkQXRvbVdyaXRlcihhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihyZWFzb24pLCBjYWxsaW5nVWlkLCBzdGF0dXMsIHRyYW5zY29kZUZyYW1lUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBzcmNNaW1lLCBzcmNQcm9maWxlLCBzcmNMZXZlbCwgc3JjRnJhbWVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0R1cmF0aW9uTXMsIHNyY0lzSGRyLCBkc3RXaWR0aCwgZHN0SGVpZ2h0LCBkc3RNaW1lLCBkc3RJc0hkcik7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdMb2dnZXI6OnNob3VsZExvZ0F0b20oY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCYgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpjaHJvbm86OmhvdXJzIG9uZURheSgyNCk7CisKKyAgICAvLyBSZW1vdmUgZXZlbnRzIG9sZGVyIHRoYW4gb25lIGRheS4KKyAgICB3aGlsZSAobUxhc3RMb2dnZWRBdG9tcy5zaXplKCkgPiAwICYmIChub3cgLSBtTGFzdExvZ2dlZEF0b21zLmZyb250KCkuZmlyc3QpID49IG9uZURheSkgeworICAgICAgICBpZiAobUxhc3RMb2dnZWRBdG9tcy5mcm9udCgpLnNlY29uZCA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIC0tbVN1Y2Nlc3NmdWxDb3VudDsKKyAgICAgICAgfQorICAgICAgICBtTGFzdExvZ2dlZEF0b21zLnBvcCgpOworICAgIH0KKworICAgIC8vIERvbid0IGxvZyBpZiBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgaXMgcmVhY2hlZC4KKyAgICBpZiAobUxhc3RMb2dnZWRBdG9tcy5zaXplKCkgPj0ga01heEF0b21zUGVyRGF5KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBsb2cgaWYgdGhlIGV2ZW50IGlzIHN1Y2Nlc3NmdWwgYW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWNjZXNzZnVsIGV2ZW50cyBpcyByZWFjaGVkLgorICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX09LICYmIG1TdWNjZXNzZnVsQ291bnQgPj0ga01heFN1Y2Nlc3NmdWxBdG9tc1BlckRheSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUmVjb3JkIHRoZSBldmVudC4KKyAgICBpZiAoc3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICArK21TdWNjZXNzZnVsQ291bnQ7CisgICAgfQorICAgIG1MYXN0TG9nZ2VkQXRvbXMuZW1wbGFjZShub3csIHN0YXR1cyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdMb2dnZXI6OnNldFNlc3Npb25FbmRlZEF0b21Xcml0ZXIoY29uc3QgU2Vzc2lvbkVuZGVkQXRvbVdyaXRlciYgd3JpdGVyKSB7CisgICAgbVNlc3Npb25FbmRlZEF0b21Xcml0ZXIgPSB3cml0ZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjUzZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmNwcApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlT2JzZXJ2ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYU9ic2VydmFibGVFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZVBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZVR5cGU7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBNZWRpYU9ic2VydmFibGVQYXJjZWwmIG9ic2VydmFibGUpIHsKKyAgICByZXR1cm4gInsiICsgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dG9TdHJpbmcob2JzZXJ2YWJsZS50eXBlKSArICIsICIgKworICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhvYnNlcnZhYmxlLnZhbHVlKSArICJ9IjsKK30KKworc3RydWN0IFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OlJlc291cmNlT2JzZXJ2ZXIgOiBwdWJsaWMgQm5SZXNvdXJjZU9ic2VydmVyIHsKKyAgICBleHBsaWNpdCBSZXNvdXJjZU9ic2VydmVyKFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kqIG93bmVyKSA6IG1Pd25lcihvd25lcikge30KKworICAgIC8vIElSZXNvdXJjZU9ic2VydmVyCisgICAgOjpuZGs6OlNjb3BlZEFTdGF0dXMgb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnQsIGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4mIG9ic2VydmFibGVzKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dEKCIlczogJXMsIHVpZCAlZCwgcGlkICVkLCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dG9TdHJpbmcoZXZlbnQpLmNfc3RyKCksIHVpZCwgcGlkLAorICAgICAgICAgICAgICB0b1N0cmluZyhvYnNlcnZhYmxlc1swXSkuY19zdHIoKSk7CisKKyAgICAgICAgLy8gT25seSByZXBvcnQga0lkbGUgZXZlbnQuCisgICAgICAgIGlmICgoKHVpbnQ2NF90KWV2ZW50ICYgKHVpbnQ2NF90KU1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZSkgIT0gMCkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBvYnNlcnZhYmxlIDogb2JzZXJ2YWJsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JzZXJ2YWJsZS50eXBlID09IE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjIHx8CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUudHlwZSA9PSBNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgICAgICBtT3duZXItPm9uUmVzb3VyY2VBdmFpbGFibGUocGlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5KiBtT3duZXI7Cit9OworCisvLyBzdGF0aWMKK3ZvaWQgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6QmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSkgeworICAgIFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kqIG93bmVyID0gcmVpbnRlcnByZXRfY2FzdDxUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5Kj4oY29va2llKTsKKyAgICBpZiAob3duZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvd25lci0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICB9CisgICAgLy8gVE9ETyhjaHopOiByZXRyeSB0byBjb25uZWN0aW5nIHRvIElSZXNvdXJjZU9ic2VydmVyU2VydmljZSBhZnRlciBmYWlsdXJlLgorICAgIC8vIEFsc28gbmVlZCB0byBoYXZlIGJhY2stdXAgbG9naWMgaWYgSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGlzIG9mZmxpbmUgZm9yCisgICAgLy8gUHJvbG9uZ2VkIHBlcmlvZCBvZiB0aW1lLiBBIHBvc3NpYmxlIGFsdGVybmF0aXZlIGNvdWxkIGJlLCBkdXJpbmcgcGVyaW9kIHdoZXJlCisgICAgLy8gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUsIHRyaWdnZXIgb25SZXNvdXJjZUF2YWlsYWJsZSgpIGV2ZXJ5dGltZQorICAgIC8vIHdoZW4gdG9wIHVpZCBjaGFuZ2VzIChpbiBob3BlIHRoYXQnbGwgZnJlZSB1cCBzb21lIGNvZGVjIGluc3RhbmNlcyB0aGF0IHdlIGNvdWxkCisgICAgLy8gcmVjbGFpbSkuCit9CisKK1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3koKQorICAgICAgOiBtUmVnaXN0ZXJlZChmYWxzZSksCisgICAgICAgIG1SZXNvdXJjZUxvc3RQaWQoLTEpLAorICAgICAgICBtRGVhdGhSZWNpcGllbnQoQUlCaW5kZXJfRGVhdGhSZWNpcGllbnRfbmV3KEJpbmRlckRpZWRDYWxsYmFjaykpIHsKKyAgICByZWdpc3RlclNlbGYoKTsKK30KKworVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6flRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3koKSB7CisgICAgdW5yZWdpc3RlclNlbGYoKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgQUxPR0koIlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6IHJlZ2lzdGVyU2VsZiIpOworCisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS5yZXNvdXJjZV9vYnNlcnZlciIpKTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttUmVnaXN0ZXJlZExvY2t9OworCisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUT0RPKGNoeik6IHJldHJ5IHRvIGNvbm5lY3RpbmcgdG8gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGFmdGVyIGZhaWx1cmUuCisgICAgbVNlcnZpY2UgPSBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKKyAgICBpZiAobVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9ubHkgcmVnaXN0ZXIgZmlsdGVycyBmb3IgY29kZWMgcmVzb3VyY2UgYXZhaWxhYmxlLgorICAgIG1PYnNlcnZlciA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlT2JzZXJ2ZXI+KHRoaXMpOworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVycyA9IHsKKyAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtJZGxlfSwKKyAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgTWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtJZGxlfX07CisKKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobU9ic2VydmVyLCBmaWx0ZXJzKTsKKyAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWdpc3RlcjogZXJyb3IgJWQiLCBzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSk7CisgICAgICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgbU9ic2VydmVyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCByZWludGVycHJldF9jYXN0PHZvaWQqPih0aGlzKSk7CisKKyAgICBBTE9HRCgiQEBAIHJlZ2lzdGVyZWQgb2JzZXJ2ZXIiKTsKKyAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgQUxPR0koIlRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6IHVucmVnaXN0ZXJTZWxmIik7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVJlZ2lzdGVyZWRMb2NrfTsKKworICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlciA9IG1TZXJ2aWNlLT5hc0JpbmRlcigpOworICAgIGlmIChiaW5kZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnVucmVnaXN0ZXJPYnNlcnZlcihtT2JzZXJ2ZXIpOworICAgICAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCByZWludGVycHJldF9jYXN0PHZvaWQqPih0aGlzKSk7CisgICAgfQorCisgICAgbVNlcnZpY2UgPSBudWxscHRyOworICAgIG1PYnNlcnZlciA9IG51bGxwdHI7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpzZXRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2FsbGJhY2tMb2NrfTsKKyAgICBtUmVzb3VyY2VQb2xpY3lDYWxsYmFjayA9IGNiOworfQorCit2b2lkIFRyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3k6OnNldFBpZFJlc291cmNlTG9zdChwaWRfdCBwaWQpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUNhbGxiYWNrTG9ja307CisgICAgbVJlc291cmNlTG9zdFBpZCA9IHBpZDsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5OjpvblJlc291cmNlQXZhaWxhYmxlKHBpZF90IHBpZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiBjYjsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2FsbGJhY2tMb2NrfTsKKyAgICAgICAgLy8gT25seSBjYWxsYmFjayBpZiBjb2RlYyByZXNvdXJjZSBpcyByZWxlYXNlZCBmcm9tIG90aGVyIHByb2Nlc3Nlcy4KKyAgICAgICAgaWYgKG1SZXNvdXJjZUxvc3RQaWQgIT0gLTEgJiYgbVJlc291cmNlTG9zdFBpZCAhPSBwaWQpIHsKKyAgICAgICAgICAgIGNiID0gbVJlc291cmNlUG9saWN5Q2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgbVJlc291cmNlTG9zdFBpZCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNiICE9IG51bGxwdHIpIHsKKyAgICAgICAgY2ItPm9uUmVzb3VyY2VBdmFpbGFibGUoKTsKKyAgICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzZTUxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxMTkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyIgorCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFIDEKKworI2luY2x1ZGUgPGFuZHJvaWQvcGVybWlzc2lvbl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdVaWRQb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9BbmRyb2lkVGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljX2Fzc2VydCgoU2Vzc2lvbklkVHlwZSktMSA8IDAsICJTZXNzaW9uSWRUeXBlIHNob3VsZCBiZSBzaWduZWQiKTsKKworY29uc3RleHByIHN0YXRpYyB1aWRfdCBPRkZMSU5FX1VJRCA9IC0xOworY29uc3RleHByIHN0YXRpYyBzaXplX3Qga1Nlc3Npb25IaXN0b3J5TWF4ID0gMTAwOworCisvL3N0YXRpYworU3RyaW5nOCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpzZXNzaW9uVG9TdHJpbmcoY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICByZXR1cm4gU3RyaW5nODo6Zm9ybWF0KCJ7Y2xpZW50OiVsbGQsIHNlc3Npb246JWR9IiwgKGxvbmcgbG9uZylzZXNzaW9uS2V5LmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbktleS5zZWNvbmQpOworfQorCisvL3N0YXRpYworY29uc3QgY2hhciogVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6c2Vzc2lvblN0YXRlVG9TdHJpbmcoY29uc3QgU2Vzc2lvbjo6U3RhdGUgc2Vzc2lvblN0YXRlKSB7CisgICAgc3dpdGNoIChzZXNzaW9uU3RhdGUpIHsKKyAgICBjYXNlIFNlc3Npb246OlN0YXRlOjpOT1RfU1RBUlRFRDoKKyAgICAgICAgcmV0dXJuICJOT1RfU1RBUlRFRCI7CisgICAgY2FzZSBTZXNzaW9uOjpTdGF0ZTo6UlVOTklORzoKKyAgICAgICAgcmV0dXJuICJSVU5OSU5HIjsKKyAgICBjYXNlIFNlc3Npb246OlN0YXRlOjpQQVVTRUQ6CisgICAgICAgIHJldHVybiAiUEFVU0VEIjsKKyAgICBjYXNlIFNlc3Npb246OlN0YXRlOjpGSU5JU0hFRDoKKyAgICAgICAgcmV0dXJuICJGSU5JU0hFRCI7CisgICAgY2FzZSBTZXNzaW9uOjpTdGF0ZTo6Q0FOQ0VMRUQ6CisgICAgICAgIHJldHVybiAiQ0FOQ0VMRUQiOworICAgIGNhc2UgU2Vzc2lvbjo6U3RhdGU6OkVSUk9SOgorICAgICAgICByZXR1cm4gIkVSUk9SIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICIodW5rbm93bikiOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdHJ1Y3QgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6V2F0Y2hkb2cgeworICAgIFdhdGNoZG9nKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIqIG93bmVyLCBpbnQ2NF90IHRpbWVvdXRVcyk7CisgICAgfldhdGNoZG9nKCk7CisKKyAgICAvLyBTdGFydHMgbW9uaXRvcmluZyB0aGUgc2Vzc2lvbi4KKyAgICB2b2lkIHN0YXJ0KGNvbnN0IFNlc3Npb25LZXlUeXBlJiBrZXkpOworICAgIC8vIFN0b3BzIG1vbml0b3JpbmcgdGhlIHNlc3Npb24uCisgICAgdm9pZCBzdG9wKCk7CisgICAgLy8gU2lnbmFscyB0aGF0IHRoZSBzZXNzaW9uIGlzIHN0aWxsIGFsaXZlLiBNdXN0IGJlIHNlbnQgYXQgbGVhc3QgZXZlcnkgbVRpbWVvdXRVcy4KKyAgICAvLyAoVGltZW91dCB3aWxsIGhhcHBlbiBpZiBubyBwaW5nIGluIG1UaW1lb3V0VXMgc2luY2UgdGhlIGxhc3QgcGluZy4pCisgICAgdm9pZCBrZWVwQWxpdmUoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHRocmVhZExvb3AoKTsKKyAgICB2b2lkIHVwZGF0ZVRpbWVyX2woKTsKKworICAgIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIqIG1Pd25lcjsKKyAgICBjb25zdCBpbnQ2NF90IG1UaW1lb3V0VXM7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb24gR1VBUkRFRF9CWShtTG9jayk7CisgICAgLy8gV2hldGhlciB3YXRjaGRvZyBpcyBtb25pdG9yaW5nIGEgc2Vzc2lvbiBmb3IgdGltZW91dC4KKyAgICBib29sIG1BY3RpdmUgR1VBUkRFRF9CWShtTG9jayk7CisgICAgLy8gV2hldGhlciB3YXRjaGRvZyBpcyBhYm9ydGVkIGFuZCB0aGUgbW9uaXRvcmluZyB0aHJlYWQgc2hvdWxkIGV4aXQuCisgICAgYm9vbCBtQWJvcnQgR1VBUkRFRF9CWShtTG9jayk7CisgICAgLy8gV2hlbiB3YXRjaGRvZyBpcyBhY3RpdmUsIHRoZSBuZXh0IHRpbWVvdXQgdGltZSBwb2ludC4KKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG1OZXh0VGltZW91dFRpbWUgR1VBUkRFRF9CWShtTG9jayk7CisgICAgLy8gV2hlbiB3YXRjaGRvZyBpcyBhY3RpdmUsIHRoZSBzZXNzaW9uIGJlaW5nIHdhdGNoZWQuCisgICAgU2Vzc2lvbktleVR5cGUgbVNlc3Npb25Ub1dhdGNoIEdVQVJERURfQlkobUxvY2spOworICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7Cit9OworCitUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpXYXRjaGRvZzo6V2F0Y2hkb2coVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciogb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMpCisgICAgICA6IG1Pd25lcihvd25lciksCisgICAgICAgIG1UaW1lb3V0VXModGltZW91dFVzKSwKKyAgICAgICAgbUFjdGl2ZShmYWxzZSksCisgICAgICAgIG1BYm9ydChmYWxzZSksCisgICAgICAgIG1UaHJlYWQoJldhdGNoZG9nOjp0aHJlYWRMb29wLCB0aGlzKSB7CisgICAgQUxPR1YoIldhdGNoZG9nIENUT1I6ICVwIiwgdGhpcyk7Cit9CisKK1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OldhdGNoZG9nOjp+V2F0Y2hkb2coKSB7CisgICAgQUxPR1YoIldhdGNoZG9nIERUT1I6ICVwIiwgdGhpcyk7CisKKyAgICB7CisgICAgICAgIC8vIEV4aXQgdGhlIGxvb3BlciB0aHJlYWQuCisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICAgICAgbUFib3J0ID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgbVRocmVhZC5qb2luKCk7CisgICAgQUxPR1YoIldhdGNoZG9nIERUT1I6ICVwLCBkb25lLiIsIHRoaXMpOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OldhdGNoZG9nOjpzdGFydChjb25zdCBTZXNzaW9uS2V5VHlwZSYga2V5KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmICghbUFjdGl2ZSkgeworICAgICAgICBBTE9HSSgiV2F0Y2hkb2cgc3RhcnQ6ICVzIiwgc2Vzc2lvblRvU3RyaW5nKGtleSkuY19zdHIoKSk7CisKKyAgICAgICAgbUFjdGl2ZSA9IHRydWU7CisgICAgICAgIG1TZXNzaW9uVG9XYXRjaCA9IGtleTsKKyAgICAgICAgdXBkYXRlVGltZXJfbCgpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6V2F0Y2hkb2c6OnN0b3AoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgIEFMT0dJKCJXYXRjaGRvZyBzdG9wOiAlcyIsIHNlc3Npb25Ub1N0cmluZyhtU2Vzc2lvblRvV2F0Y2gpLmNfc3RyKCkpOworCisgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OldhdGNoZG9nOjprZWVwQWxpdmUoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmIChtQWN0aXZlKSB7CisgICAgICAgIEFMT0dJKCJXYXRjaGRvZyBrZWVwQWxpdmU6ICVzIiwgc2Vzc2lvblRvU3RyaW5nKG1TZXNzaW9uVG9XYXRjaCkuY19zdHIoKSk7CisKKyAgICAgICAgdXBkYXRlVGltZXJfbCgpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9Cit9CisKKy8vIHVwZGF0ZVRpbWVyX2woKSBpcyBvbmx5IGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6V2F0Y2hkb2c6OnVwZGF0ZVRpbWVyX2woKSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHRpbWVvdXQobVRpbWVvdXRVcyk7CisgICAgbU5leHRUaW1lb3V0VGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgdGltZW91dDsKK30KKworLy8gVW5mb3J0dW5hdGVseSBzdGQ6OnVuaXF1ZV9sb2NrIGlzIGluY29tcGF0aWJsZSB3aXRoIC1XdGhyZWFkLXNhZmV0eS4KK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6V2F0Y2hkb2c6OnRocmVhZExvb3AoKSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCAvKnRpZCAoMCA9IGN1cnJlbnQpICovLCBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9ja3ttTG9ja307CisKKyAgICB3aGlsZSAoIW1BYm9ydCkgeworICAgICAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFdhdGNoZG9nIGFjdGl2ZSwgd2FpdCB0aWxsIG5leHQgdGltZW91dCB0aW1lLgorICAgICAgICBpZiAobUNvbmRpdGlvbi53YWl0X3VudGlsKGxvY2ssIG1OZXh0VGltZW91dFRpbWUpID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KSB7CisgICAgICAgICAgICAvLyBJZiB0aW1lb3V0IGhhcHBlbnMsIHJlcG9ydCB0aW1lb3V0IGFuZCBkZWFjdGl2YXRlIHdhdGNoZG9nLgorICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2Ygc2Vzc2lvbiBrZXksIGFzIG9uY2Ugd2UgdW5sb2NrLCBpdCBjb3VsZCBiZSB1bnByb3RlY3RlZC4KKyAgICAgICAgICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBtU2Vzc2lvblRvV2F0Y2g7CisKKyAgICAgICAgICAgIEFMT0dFKCJXYXRjaGRvZyB0aW1lb3V0OiAlcyIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1Pd25lci0+b25FcnJvcihzZXNzaW9uS2V5LmZpcnN0LCBzZXNzaW9uS2V5LnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1dhdGNoZG9nVGltZW91dCk7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0cnVjdCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpQYWNlciB7CisgICAgUGFjZXIoY29uc3QgQ29udHJvbGxlckNvbmZpZyYgY29uZmlnKQorICAgICAgICAgIDogbUJ1cnN0VGhyZXNob2xkTXMoY29uZmlnLnBhY2VyQnVyc3RUaHJlc2hvbGRNcyksCisgICAgICAgICAgICBtQnVyc3RDb3VudFF1b3RhKGNvbmZpZy5wYWNlckJ1cnN0Q291bnRRdW90YSksCisgICAgICAgICAgICBtQnVyc3RUaW1lUXVvdGFTZWMoY29uZmlnLnBhY2VyQnVyc3RUaW1lUXVvdGFTZWNvbmRzKSB7fQorCisgICAgflBhY2VyKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvblNlc3Npb25TdGFydGVkKHVpZF90IHVpZCwgdWlkX3QgY2FsbGluZ1VpZCk7CisgICAgdm9pZCBvblNlc3Npb25Db21wbGV0ZWQodWlkX3QgdWlkLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHJ1bm5pbmdUaW1lKTsKKyAgICB2b2lkIG9uU2Vzc2lvbkNhbmNlbGxlZCh1aWRfdCB1aWQpOworCitwcml2YXRlOgorICAgIC8vIFRocmVzaG9sZCBvZiB0aW1lIGJldHdlZW4gZmluaXNoL3N0YXJ0IGJlbG93IHdoaWNoIGEgYmFjay10by1iYWNrIHN0YXJ0IGlzIGNvdW50ZWQuCisgICAgaW50MzJfdCBtQnVyc3RUaHJlc2hvbGRNczsKKyAgICAvLyBNYXhpbXVtIGFsbG93ZWQgYmFjay10by1iYWNrIHN0YXJ0IGNvdW50LgorICAgIGludDMyX3QgbUJ1cnN0Q291bnRRdW90YTsKKyAgICAvLyBNYXhpbXVtIGFsbG93ZWQgYmFjay10by1iYWNrIHJ1bm5pbmcgdGltZS4KKyAgICBpbnQzMl90IG1CdXJzdFRpbWVRdW90YVNlYzsKKworICAgIHN0cnVjdCBVaWRIaXN0b3J5RW50cnkgeworICAgICAgICBib29sIHNlc3Npb25BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgaW50MzJfdCBidXJzdENvdW50ID0gMDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gYnVyc3REdXJhdGlvbnswfTsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBsYXN0Q29tcGxldGVkVGltZTsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpZF90LCBVaWRIaXN0b3J5RW50cnk+IG1VaWRIaXN0b3J5TWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbU10cFVpZHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBtTm9uTXRwVWlkczsKKworICAgIGJvb2wgaXNTdWJqZWN0VG9RdW90YSh1aWRfdCB1aWQsIHVpZF90IGNhbGxpbmdVaWQpOworfTsKKworYm9vbCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpQYWNlcjo6aXNTdWJqZWN0VG9RdW90YSh1aWRfdCB1aWQsIHVpZF90IGNhbGxpbmdVaWQpIHsKKyAgICAvLyBTdWJtaXR0aW5nIHdpdGggc2VsZiB1aWQgaXMgbm90IGxpbWl0ZWQgKHdoaWNoIGNhbiBvbmx5IGhhcHBlbiBpZiBpdCdzIHVzZWQgYXMgYW4KKyAgICAvLyBhcHAtZmFjaW5nIEFQSSkuIE1lZGlhUHJvdmlkZXIgdXNhZ2UgYWx3YXlzIHN1Ym1pdCBvbiBiZWhhbGYgb2Ygb3RoZXIgdWlkcy4KKyAgICBpZiAodWlkID09IGNhbGxpbmdVaWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtTXRwVWlkcy5maW5kKHVpZCkgIT0gbU10cFVpZHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtTm9uTXRwVWlkcy5maW5kKHVpZCkgIT0gbU5vbk10cFVpZHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gV2UgZG9uJ3QgaGF2ZSBNVFAgcGVybWlzc2lvbiBpbmZvIGFib3V0IHRoaXMgdWlkIHlldCwgY2hlY2sgcGVybWlzc2lvbiBhbmQgc2F2ZSB0aGUgcmVzdWx0LgorICAgIGludDMyX3QgcmVzdWx0OworICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgX19UUkFOU0NPRElOR19NSU5fQVBJX18sICopKSB7CisgICAgICAgIGlmIChBUGVybWlzc2lvbk1hbmFnZXJfY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX01UUCIsIC0xIC8qcGlkKi8sIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkgPT0gUEVSTUlTU0lPTl9NQU5BR0VSX1NUQVRVU19PSyAmJgorICAgICAgICAgICAgcmVzdWx0ID09IFBFUk1JU1NJT05fTUFOQUdFUl9QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgIG1NdHBVaWRzLmluc2VydCh1aWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbU5vbk10cFVpZHMuaW5zZXJ0KHVpZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6UGFjZXI6Om9uU2Vzc2lvblN0YXJ0ZWQodWlkX3QgdWlkLCB1aWRfdCBjYWxsaW5nVWlkKSB7CisgICAgaWYgKCFpc1N1YmplY3RUb1F1b3RhKHVpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgQUxPR0koIlBhY2VyOjpvblNlc3Npb25TdGFydGVkOiB1aWQgJWQgKGNhbGluZyB1aWQ6ICVkKTogbm90IHN1YmplY3QgdG8gcXVvdGEiLCB1aWQsCisgICAgICAgICAgICAgIGNhbGxpbmdVaWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJZiB1aWQgZG9lc24ndCBleGlzdCwgb25seSBpbnNlcnQgdGhlIGVudHJ5IGFuZCBtYXJrIHNlc3Npb24gYWN0aXZlLiBTa2lwIHF1b3RhIGNoZWNraW5nLgorICAgIGlmIChtVWlkSGlzdG9yeU1hcC5maW5kKHVpZCkgPT0gbVVpZEhpc3RvcnlNYXAuZW5kKCkpIHsKKyAgICAgICAgbVVpZEhpc3RvcnlNYXAuZW1wbGFjZSh1aWQsIFVpZEhpc3RvcnlFbnRyeXt9KTsKKyAgICAgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5zZXNzaW9uQWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlBhY2VyOjpvblNlc3Npb25TdGFydGVkOiB1aWQgJWQ6IG5ldyIsIHVpZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFRPRE86IGlmIFRoZXJtYWwgdGhyb3R0bGluZyBvciByZXNvdXJlIGxvc3QgaGFwcGVuZWQgdG8gb2NjdXJyIGJldHdlZW4gdGhpcyBzdGFydAorICAgIC8vIGFuZCB0aGUgcHJldmlvdXMgY29tcGxldGlvbiwgd2Ugc2hvdWxkIGRlZHVjdCB0aGUgcGF1c2VkIHRpbWUgZnJvbSB0aGUgZWxhcHNlZCB0aW1lLgorICAgIC8vIChJbmRpdmlkdWFsIHNlc3Npb24ncyBwYXVzZSB0aW1lLCBvbiB0aGUgb3RoZXIgaGFuZCwgZG9lc24ndCBuZWVkIHRvIGJlIGRlZHVjdGVkCisgICAgLy8gYmVjYXVzZSBpdCBkb2Vzbid0IGFmZmVjdCB0aGUgZ2FwIGJldHdlZW4gbGFzdCBjb21wbGV0aW9uIGFuZCB0aGUgc3RhcnQuCisgICAgYXV0byB0aW1lU2luY2VMYXN0Q29tcGxldGUgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBtVWlkSGlzdG9yeU1hcFt1aWRdLmxhc3RDb21wbGV0ZWRUaW1lOworICAgIGlmIChtVWlkSGlzdG9yeU1hcFt1aWRdLmJ1cnN0Q291bnQgPj0gbUJ1cnN0Q291bnRRdW90YSAmJgorICAgICAgICBtVWlkSGlzdG9yeU1hcFt1aWRdLmJ1cnN0RHVyYXRpb24gPj0gc3RkOjpjaHJvbm86OnNlY29uZHMobUJ1cnN0VGltZVF1b3RhU2VjKSkgeworICAgICAgICBBTE9HVygiUGFjZXI6Om9uU2Vzc2lvblN0YXJ0ZWQ6IHVpZCAlZDogb3ZlciBxdW90YSwgYnVyc3QgY291bnQgJWQsIHRpbWUgJWxsZG1zIiwgdWlkLAorICAgICAgICAgICAgICBtVWlkSGlzdG9yeU1hcFt1aWRdLmJ1cnN0Q291bnQsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdER1cmF0aW9uLmNvdW50KCkgLyAxMDAwMDAwKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIElmIG5vdCBvdmVyIHF1b3RhLCBhbGxvdyB0aGUgc2Vzc2lvbiwgYW5kIHJlc2V0IGFzIGxvbmcgYXMgdGhpcyBpcyBub3QgdG9vIGNsb3NlCisgICAgLy8gdG8gcHJldmlvdXMgY29tcGxldGlvbi4KKyAgICBpZiAodGltZVNpbmNlTGFzdENvbXBsZXRlID4gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtQnVyc3RUaHJlc2hvbGRNcykpIHsKKyAgICAgICAgQUxPR1YoIlBhY2VyOjpvblNlc3Npb25TdGFydGVkOiB1aWQgJWQ6IHJlc2V0IHF1b3RhIiwgdWlkKTsKKyAgICAgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdENvdW50ID0gMDsKKyAgICAgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdER1cmF0aW9uID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiUGFjZXI6Om9uU2Vzc2lvblN0YXJ0ZWQ6IHVpZCAlZDogYnVyc3QgY291bnQgJWQsIHRpbWUgJWxsZG1zIiwgdWlkLAorICAgICAgICAgICAgICBtVWlkSGlzdG9yeU1hcFt1aWRdLmJ1cnN0Q291bnQsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdER1cmF0aW9uLmNvdW50KCkgLyAxMDAwMDAwKTsKKyAgICB9CisKKyAgICBtVWlkSGlzdG9yeU1hcFt1aWRdLnNlc3Npb25BY3RpdmUgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OlBhY2VyOjpvblNlc3Npb25Db21wbGV0ZWQoCisgICAgICAgIHVpZF90IHVpZCwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBydW5uaW5nVGltZSkgeworICAgIC8vIFNraXAgcXVvdGEgdXBkYXRlIGlmIHRoaXMgdWlkIG1pc3NlZCB0aGUgc3RhcnQuIChDb3VsZCBoYXBwZW4gaWYgdGhlIHVpZCBpcyBhZGRlZCB2aWEKKyAgICAvLyBhZGRDbGllbnRVaWQoKSBhZnRlciB0aGUgc2Vzc2lvbiBzdGFydC4pCisgICAgaWYgKG1VaWRIaXN0b3J5TWFwLmZpbmQodWlkKSA9PSBtVWlkSGlzdG9yeU1hcC5lbmQoKSB8fCAhbVVpZEhpc3RvcnlNYXBbdWlkXS5zZXNzaW9uQWN0aXZlKSB7CisgICAgICAgIEFMT0dWKCJQYWNlcjo6b25TZXNzaW9uQ29tcGxldGVkOiB1aWQgJWQ6IG5vdCBzdGFydGVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiUGFjZXI6Om9uU2Vzc2lvbkNvbXBsZXRlZDogdWlkICVkOiBydW5uaW5nVGltZSAlbGxkIiwgdWlkLCBydW5uaW5nVGltZS5jb3VudCgpIC8gMTAwMCk7CisgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5zZXNzaW9uQWN0aXZlID0gZmFsc2U7CisgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdENvdW50Kys7CisgICAgbVVpZEhpc3RvcnlNYXBbdWlkXS5idXJzdER1cmF0aW9uICs9IHJ1bm5pbmdUaW1lOworICAgIG1VaWRIaXN0b3J5TWFwW3VpZF0ubGFzdENvbXBsZXRlZFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpQYWNlcjo6b25TZXNzaW9uQ2FuY2VsbGVkKHVpZF90IHVpZCkgeworICAgIGlmIChtVWlkSGlzdG9yeU1hcC5maW5kKHVpZCkgPT0gbVVpZEhpc3RvcnlNYXAuZW5kKCkpIHsKKyAgICAgICAgQUxPR1YoIlBhY2VyOjpvblNlc3Npb25DYW5jZWxsZWQ6IHVpZCAlZDogbm90IHByZXNlbnQiLCB1aWQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFRoaXMgaXMgb25seSBjYWxsZWQgaWYgYSB1aWQgaXMgcmVtb3ZlZCBmcm9tIGEgc2Vzc2lvbiAoZHVlIHRvIGl0IGJlaW5nIGtpbGxlZAorICAgIC8vIG9yIHRoZSBvcmlnaW5hbCBzdWJtaXR0aW5nIGNsaWVudCB3YXMgZ29uZSBidXQgc2Vzc2lvbiB3YXMga2VwdCBmb3Igb2ZmbGluZSB1c2UpLgorICAgIC8vIFNpbmNlIHRoZSB1aWQgaXMgZ29pbmcgdG8gbWlzcyB0aGUgb25TZXNzaW9uQ29tcGxldGVkKCksIHdlIGNhbid0IHRyYWNrIHRoaXMKKyAgICAvLyBzZXNzaW9uLCBhbmQgaGF2ZSB0byBjaGVjayBiYWNrIGF0IG5leHQgb25TZXNzaW9uU3RhcnRlZCgpLgorICAgIG1VaWRIaXN0b3J5TWFwW3VpZF0uc2Vzc2lvbkFjdGl2ZSA9IGZhbHNlOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIoCisgICAgICAgIGNvbnN0IFRyYW5zY29kZXJGYWN0b3J5VHlwZSYgdHJhbnNjb2RlckZhY3RvcnksCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVaWRQb2xpY3lJbnRlcmZhY2U+JiB1aWRQb2xpY3ksCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUludGVyZmFjZT4mIHJlc291cmNlUG9saWN5LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhlcm1hbFBvbGljeUludGVyZmFjZT4mIHRoZXJtYWxQb2xpY3ksCisgICAgICAgIGNvbnN0IENvbnRyb2xsZXJDb25maWcqIGNvbmZpZykKKyAgICAgIDogbVRyYW5zY29kZXJGYWN0b3J5KHRyYW5zY29kZXJGYWN0b3J5KSwKKyAgICAgICAgbVVpZFBvbGljeSh1aWRQb2xpY3kpLAorICAgICAgICBtUmVzb3VyY2VQb2xpY3kocmVzb3VyY2VQb2xpY3kpLAorICAgICAgICBtVGhlcm1hbFBvbGljeSh0aGVybWFsUG9saWN5KSwKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uKG51bGxwdHIpLAorICAgICAgICBtUmVzb3VyY2VMb3N0KGZhbHNlKSB7CisgICAgLy8gT25seSBwdXNoIGVtcHR5IG9mZmxpbmUgcXVldWUgaW5pdGlhbGx5LiBSZWFsdGltZSBxdWV1ZXMgYXJlIGFkZGVkIHdoZW4gcmVxdWVzdHMgY29tZSBpbi4KKyAgICBtVWlkU29ydGVkTGlzdC5wdXNoX2JhY2soT0ZGTElORV9VSUQpOworICAgIG1PZmZsaW5lVWlkSXRlcmF0b3IgPSBtVWlkU29ydGVkTGlzdC5iZWdpbigpOworICAgIG1TZXNzaW9uUXVldWVzLmVtcGxhY2UoT0ZGTElORV9VSUQsIFNlc3Npb25RdWV1ZVR5cGUoKSk7CisgICAgbVVpZFBhY2thZ2VOYW1lc1tPRkZMSU5FX1VJRF0gPSAiKG9mZmxpbmUpIjsKKyAgICBtVGhlcm1hbFRocm90dGxpbmcgPSB0aGVybWFsUG9saWN5LT5nZXRUaHJvdHRsaW5nU3RhdHVzKCk7CisgICAgaWYgKGNvbmZpZyAhPSBudWxscHRyKSB7CisgICAgICAgIG1Db25maWcgPSAqY29uZmlnOworICAgIH0KKyAgICBtUGFjZXIucmVzZXQobmV3IFBhY2VyKG1Db25maWcpKTsKKyAgICBBTE9HRCgiQEBAIHdhdGNoZG9nICVsbGQsIGJ1cnN0IGNvdW50ICVkLCBidXJzdCB0aW1lICVkLCBidXJzdCB0aHJlc2hvbGQgJWQiLAorICAgICAgICAgIChsb25nIGxvbmcpbUNvbmZpZy53YXRjaGRvZ1RpbWVvdXRVcywgbUNvbmZpZy5wYWNlckJ1cnN0Q291bnRRdW90YSwKKyAgICAgICAgICBtQ29uZmlnLnBhY2VyQnVyc3RUaW1lUXVvdGFTZWNvbmRzLCBtQ29uZmlnLnBhY2VyQnVyc3RUaHJlc2hvbGRNcyk7Cit9CisKK1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6On5UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyKCkge30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpkdW1wU2Vzc2lvbl9sKGNvbnN0IFNlc3Npb24mIHNlc3Npb24sIFN0cmluZzgmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNsb3NlZFNlc3Npb24pIHsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QgPSBzZXNzaW9uLnJlcXVlc3Q7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgU2Vzc2lvbjogJXMsICVzLCAlZCUlXG4iLCBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbi5rZXkpLmNfc3RyKCksCisgICAgICAgICAgICAgc2Vzc2lvblN0YXRlVG9TdHJpbmcoc2Vzc2lvbi5nZXRTdGF0ZSgpKSwgc2Vzc2lvbi5sYXN0UHJvZ3Jlc3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgIHBrZzogJXNcbiIsIHJlcXVlc3QuY2xpZW50UGFja2FnZU5hbWUuY19zdHIoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICAgc3JjOiAlc1xuIiwgcmVxdWVzdC5zb3VyY2VGaWxlUGF0aC5jX3N0cigpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICBkc3Q6ICVzXG4iLCByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGguY19zdHIoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgaWYgKGNsb3NlZFNlc3Npb24pIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgICAgICAiICAgICAgICB3YWl0aW5nOiAlLjFmcywgcnVubmluZzogJS4xZnMsIHBhdXNlZDogJS4xZnMsIHBhdXNlZCBjb3VudDogJWRcbiIsCisgICAgICAgICAgICAgICAgIHNlc3Npb24ud2FpdGluZ1RpbWUuY291bnQoKSAvIDEwMDAwMDAuMGYsIHNlc3Npb24ucnVubmluZ1RpbWUuY291bnQoKSAvIDEwMDAwMDAuMGYsCisgICAgICAgICAgICAgICAgIHNlc3Npb24ucGF1c2VkVGltZS5jb3VudCgpIC8gMTAwMDAwMC4wZiwgc2Vzc2lvbi5wYXVzZUNvdW50KTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpkdW1wQWxsU2Vzc2lvbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG49PT09PT09PT09IER1bXBpbmcgbGl2ZSBzZXNzaW9ucyBxdWV1ZXMgPT09PT09PT09XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBUb3RhbCBudW0gb2YgU2Vzc2lvbnM6ICV6dVxuIiwgbVNlc3Npb25NYXAuc2l6ZSgpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB1aWRzKG1VaWRTb3J0ZWRMaXN0LmJlZ2luKCksIG1VaWRTb3J0ZWRMaXN0LmVuZCgpKTsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHVpZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gdWlkc1tpXTsKKworICAgICAgICBpZiAobVNlc3Npb25RdWV1ZXNbdWlkXS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgdWlkOiAlZCwgcGtnOiAlc1xuIiwgdWlkLAorICAgICAgICAgICAgICAgICBtVWlkUGFja2FnZU5hbWVzLmNvdW50KHVpZCkgPiAwID8gbVVpZFBhY2thZ2VOYW1lc1t1aWRdLmNfc3RyKCkgOiAiKHVua25vd24pIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgTnVtIG9mIHNlc3Npb25zOiAlenVcbiIsIG1TZXNzaW9uUXVldWVzW3VpZF0uc2l6ZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBmb3IgKGF1dG8mIHNlc3Npb25LZXkgOiBtU2Vzc2lvblF1ZXVlc1t1aWRdKSB7CisgICAgICAgICAgICBhdXRvIHNlc3Npb25JdCA9IG1TZXNzaW9uTWFwLmZpbmQoc2Vzc2lvbktleSk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvbkl0ID09IG1TZXNzaW9uTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRmFpbGVkIHRvIGxvb2sgdXAgU2Vzc2lvbiAlcyAgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wU2Vzc2lvbl9sKHNlc3Npb25JdC0+c2Vjb25kLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG49PT09PT09PT09IER1bXBpbmcgcGFzdCBzZXNzaW9ucyA9PT09PT09PT1cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKGF1dG8mIHNlc3Npb24gOiBtU2Vzc2lvbkhpc3RvcnkpIHsKKyAgICAgICAgZHVtcFNlc3Npb25fbChzZXNzaW9uLCByZXN1bHQsIHRydWUgLypjbG9zZWRTZXNzaW9uKi8pOworICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworfQorCisvKgorICogUmV0dXJucyBudWxscHRyIGlmIHRoZXJlIGlzIG5vIHNlc3Npb24sIG9yIHdlJ3JlIHBhdXNlZCBnbG9iYWxseSAoZHVlIHRvIHJlc291cmNlIGxvc3QsCisgKiB0aGVybWFsIHRocm90dGxpbmcsIGV0Yy4pLiBPdGhlcndpc2UsIHJldHVybiB0aGUgc2Vzc2lvbiB0aGF0IHNob3VsZCBiZSBydW4gbmV4dC4KKyAqLworVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6U2Vzc2lvbiogVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6Z2V0VG9wU2Vzc2lvbl9sKCkgeworICAgIGlmIChtU2Vzc2lvbk1hcC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vIFJldHVybiBudWxscHRyIGlmIHdlJ3JlIHBhdXNlZCBnbG9iYWxseSBkdWUgdG8gcmVzb3VyY2UgbG9zdCBvciB0aGVybWFsIHRocm90dGxpbmcuCisgICAgaWYgKCgobVJlc291cmNlUG9saWN5ICE9IG51bGxwdHIgJiYgbVJlc291cmNlTG9zdCkgfHwKKyAgICAgICAgIChtVGhlcm1hbFBvbGljeSAhPSBudWxscHRyICYmIG1UaGVybWFsVGhyb3R0bGluZykpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHVpZF90IHRvcFVpZCA9ICptVWlkU29ydGVkTGlzdC5iZWdpbigpOworICAgIC8vIElmIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgcnVubmluZywgYW5kIGl0J3MgaW4gdGhlIHRvcFVpZCdzIHF1ZXVlLCBsZXQgaXQgY29udGludWUKKyAgICAvLyB0byBydW4gZXZlbiBpZiBpdCdzIG5vdCB0aGUgZWFybGllc3QgaW4gdGhhdCB1aWQncyBxdWV1ZS4KKyAgICAvLyBGb3IgZXhhbXBsZSwgdWlkKEIpIGlzIGFkZGVkIHRvIGEgc2Vzc2lvbiB3aGlsZSBpdCdzIHBlbmRpbmcgaW4gdWlkKEEpJ3MgcXVldWUsIHRoZW4KKyAgICAvLyBCIGlzIGJyb3VnaHQgdG8gZnJvbnQgd2hpY2ggY2F1c2VkIHRoZSBzZXNzaW9uIHRvIHJ1biwgdGhlbiB1c2VyIHN3aXRjaGVzIGJhY2sgdG8gQS4KKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIgJiYgbUN1cnJlbnRTZXNzaW9uLT5nZXRTdGF0ZSgpID09IFNlc3Npb246OlJVTk5JTkcgJiYKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uLT5hbGxDbGllbnRVaWRzLmNvdW50KHRvcFVpZCkgPiAwKSB7CisgICAgICAgIHJldHVybiBtQ3VycmVudFNlc3Npb247CisgICAgfQorICAgIFNlc3Npb25LZXlUeXBlIHRvcFNlc3Npb25LZXkgPSAqbVNlc3Npb25RdWV1ZXNbdG9wVWlkXS5iZWdpbigpOworICAgIHJldHVybiAmbVNlc3Npb25NYXBbdG9wU2Vzc2lvbktleV07Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6c2V0U2Vzc2lvblN0YXRlX2woU2Vzc2lvbiogc2Vzc2lvbiwgU2Vzc2lvbjo6U3RhdGUgc3RhdGUpIHsKKyAgICBib29sIHdhc1J1bm5pbmcgPSAoc2Vzc2lvbi0+Z2V0U3RhdGUoKSA9PSBTZXNzaW9uOjpSVU5OSU5HKTsKKyAgICBzZXNzaW9uLT5zZXRTdGF0ZShzdGF0ZSk7CisgICAgYm9vbCBpc1J1bm5pbmcgPSAoc2Vzc2lvbi0+Z2V0U3RhdGUoKSA9PSBTZXNzaW9uOjpSVU5OSU5HKTsKKworICAgIGlmICh3YXNSdW5uaW5nID09IGlzUnVubmluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQ3VycmVudGx5IHdlIG9ubHkgaGF2ZSAxIHJ1bm5pbmcgc2Vzc2lvbiwgYW5kIHdlIGFsd2F5cyBwdXQgdGhlIHByZXZpb3VzCisgICAgLy8gc2Vzc2lvbiBpbiBub24tcnVubmluZyBzdGF0ZSBiZWZvcmUgd2UgcnVuIHRoZSBuZXcgc2Vzc2lvbiwgc28gaXQncyBva2F5CisgICAgLy8gdG8gc3RhcnQvc3RvcCB0aGUgd2F0Y2hkb2cgaGVyZS4gSWYgdGhpcyBhc3N1bXB0aW9uIGNoYW5nZXMsIHdlIG5lZWQgdG8KKyAgICAvLyB0cmFjayB0aGUgbnVtYmVyIG9mIHJ1bm5pbmcgc2Vzc2lvbnMgYW5kIHN0YXJ0L3N0b3Agd2F0Y2hkb2cgYmFzZWQgb24gdGhhdC4KKyAgICBpZiAoaXNSdW5uaW5nKSB7CisgICAgICAgIG1XYXRjaGRvZy0+c3RhcnQoc2Vzc2lvbi0+a2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtV2F0Y2hkb2ctPnN0b3AoKTsKKyAgICB9Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6U2Vzc2lvbjo6c2V0U3RhdGUoU2Vzc2lvbjo6U3RhdGUgbmV3U3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbmV3U3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdXRvIG5vd1RpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBpZiAoc3RhdGUgIT0gSU5WQUxJRCkgeworICAgICAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGVsYXBzZWRUaW1lID0KKyAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPihub3dUaW1lIC0gc3RhdGVFbnRlclRpbWUpOworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgUEFVU0VEOgorICAgICAgICAgICAgcGF1c2VkVGltZSA9IHBhdXNlZFRpbWUgKyBlbGFwc2VkVGltZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJVTk5JTkc6CisgICAgICAgICAgICBydW5uaW5nVGltZSA9IHJ1bm5pbmdUaW1lICsgZWxhcHNlZFRpbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOT1RfU1RBUlRFRDoKKyAgICAgICAgICAgIHdhaXRpbmdUaW1lID0gd2FpdGluZ1RpbWUgKyBlbGFwc2VkVGltZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld1N0YXRlID09IFBBVVNFRCkgeworICAgICAgICBwYXVzZUNvdW50Kys7CisgICAgfQorICAgIHN0YXRlRW50ZXJUaW1lID0gbm93VGltZTsKKyAgICBzdGF0ZSA9IG5ld1N0YXRlOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OnVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKSB7CisgICAgU2Vzc2lvbiogY3VyU2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbjsKKyAgICBTZXNzaW9uKiB0b3BTZXNzaW9uID0gbnVsbHB0cjsKKworICAgIC8vIERlbGF5ZWQgaW5pdCBvZiB0cmFuc2NvZGVyIGFuZCB3YXRjaGRvZy4KKyAgICBpZiAobVRyYW5zY29kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBtVHJhbnNjb2RlciA9IG1UcmFuc2NvZGVyRmFjdG9yeShzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICBtV2F0Y2hkb2cgPSBzdGQ6Om1ha2Vfc2hhcmVkPFdhdGNoZG9nPih0aGlzLCBtQ29uZmlnLndhdGNoZG9nVGltZW91dFVzKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBmb3VuZCBhIGRpZmZlcmVudCB0b3Agc2Vzc2lvbiwgb3IgdGhlIHRvcCBzZXNzaW9uJ3MgcnVubmluZyBzdGF0ZSBpcyBub3QKKyAgICAvLyBjb3JyZWN0LiBUYWtlIHNvbWUgYWN0aW9ucyB0byBlbnN1cmUgaXQncyBjb3JyZWN0LgorICAgIHdoaWxlICgodG9wU2Vzc2lvbiA9IGdldFRvcFNlc3Npb25fbCgpKSAhPSBjdXJTZXNzaW9uIHx8CisgICAgICAgICAgICh0b3BTZXNzaW9uICE9IG51bGxwdHIgJiYgIXRvcFNlc3Npb24tPmlzUnVubmluZygpKSkgeworICAgICAgICBBTE9HVigidXBkYXRlQ3VycmVudFNlc3Npb25fbDogdG9wU2Vzc2lvbiBpcyAlcywgY3VyU2Vzc2lvbiBpcyAlcyIsCisgICAgICAgICAgICAgIHRvcFNlc3Npb24gPT0gbnVsbHB0ciA/ICJudWxsIiA6IHNlc3Npb25Ub1N0cmluZyh0b3BTZXNzaW9uLT5rZXkpLmNfc3RyKCksCisgICAgICAgICAgICAgIGN1clNlc3Npb24gPT0gbnVsbHB0ciA/ICJudWxsIiA6IHNlc3Npb25Ub1N0cmluZyhjdXJTZXNzaW9uLT5rZXkpLmNfc3RyKCkpOworCisgICAgICAgIC8vIElmIGN1cnJlbnQgc2Vzc2lvbiBpcyBydW5uaW5nLCBwYXVzZSBpdCBmaXJzdC4gTm90ZSB0aGlzIGlzIG5lZWRlZCBmb3IgZWl0aGVyCisgICAgICAgIC8vIGNhc2VzOiAxKSBUb3Agc2Vzc2lvbiBpcyBjaGFuZ2luZyB0byBhbm90aGVyIHNlc3Npb24sIG9yIDIpIFRvcCBzZXNzaW9uIGlzCisgICAgICAgIC8vIGNoYW5naW5nIHRvIG51bGwgKHdoaWNoIG1lYW5zIHdlIHNob3VsZCBiZSBnbG9iYWxseSBwYXVzZWQpLgorICAgICAgICBpZiAoY3VyU2Vzc2lvbiAhPSBudWxscHRyICYmIGN1clNlc3Npb24tPmdldFN0YXRlKCkgPT0gU2Vzc2lvbjo6UlVOTklORykgeworICAgICAgICAgICAgbVRyYW5zY29kZXItPnBhdXNlKGN1clNlc3Npb24tPmtleS5maXJzdCwgY3VyU2Vzc2lvbi0+a2V5LnNlY29uZCk7CisgICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGVfbChjdXJTZXNzaW9uLCBTZXNzaW9uOjpQQVVTRUQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvcFNlc3Npb24gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90aGluZyBtb3JlIHRvIHJ1biAoZWl0aGVyIG5vIHNlc3Npb24gb3IgZ2xvYmFsbHkgcGF1c2VkKS4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBlbnN1cmUgdG9wU2Vzc2lvbiBpcyBydW5uaW5nLgorICAgICAgICBpZiAodG9wU2Vzc2lvbi0+Z2V0U3RhdGUoKSA9PSBTZXNzaW9uOjpOT1RfU1RBUlRFRCkgeworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYXQgbGVhc3Qgb25lIGNsaWVudCBoYXMgcXVvdGEgdG8gc3RhcnQgdGhlIHNlc3Npb24uCisgICAgICAgICAgICBib29sIGtlZXBGb3JDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAodWlkX3QgdWlkIDogdG9wU2Vzc2lvbi0+YWxsQ2xpZW50VWlkcykgeworICAgICAgICAgICAgICAgIGlmIChtUGFjZXItPm9uU2Vzc2lvblN0YXJ0ZWQodWlkLCB0b3BTZXNzaW9uLT5jYWxsaW5nVWlkKSkgeworICAgICAgICAgICAgICAgICAgICBrZWVwRm9yQ2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gRE8gTk9UIGJyZWFrIGhlcmUsIGJlY2F1c2UgYm9vay1rZWVwaW5nIHN0aWxsIG5lZWRzIHRvIGhhcHBlbgorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIG90aGVyIHVpZHMuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFrZWVwRm9yQ2xpZW50KSB7CisgICAgICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSBhbGwgdWlkcyByZXF1ZXN0aW5nIHRoaXMgc2Vzc2lvbiBhcmUgb3V0IG9mIHF1b3RhLgorICAgICAgICAgICAgICAgIC8vIERyb3AgdGhpcyBzZXNzaW9uIGFuZCB0cnkgdGhlIG5leHQgb25lLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IG1TZXNzaW9uTWFwW3RvcFNlc3Npb24tPmtleV0uY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2stPm9uVHJhbnNjb2RpbmdGYWlsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFNlc3Npb24tPmtleS5zZWNvbmQsIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprRHJvcHBlZEJ5U2VydmljZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVtb3ZlU2Vzc2lvbl9sKHRvcFNlc3Npb24tPmtleSwgU2Vzc2lvbjo6RFJPUFBFRF9CWV9QQUNFUik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNjb2Rlci0+c3RhcnQodG9wU2Vzc2lvbi0+a2V5LmZpcnN0LCB0b3BTZXNzaW9uLT5rZXkuc2Vjb25kLCB0b3BTZXNzaW9uLT5yZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFNlc3Npb24tPmNhbGxpbmdVaWQsIHRvcFNlc3Npb24tPmNhbGxiYWNrLmxvY2soKSk7CisgICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGVfbCh0b3BTZXNzaW9uLCBTZXNzaW9uOjpSVU5OSU5HKTsKKyAgICAgICAgfSBlbHNlIGlmICh0b3BTZXNzaW9uLT5nZXRTdGF0ZSgpID09IFNlc3Npb246OlBBVVNFRCkgeworICAgICAgICAgICAgbVRyYW5zY29kZXItPnJlc3VtZSh0b3BTZXNzaW9uLT5rZXkuZmlyc3QsIHRvcFNlc3Npb24tPmtleS5zZWNvbmQsIHRvcFNlc3Npb24tPnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFNlc3Npb24tPmNhbGxpbmdVaWQsIHRvcFNlc3Npb24tPmNhbGxiYWNrLmxvY2soKSk7CisgICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGVfbCh0b3BTZXNzaW9uLCBTZXNzaW9uOjpSVU5OSU5HKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbUN1cnJlbnRTZXNzaW9uID0gdG9wU2Vzc2lvbjsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjphZGRVaWRUb1Nlc3Npb25fbCh1aWRfdCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KSB7CisgICAgLy8gSWYgaXQncyBhbiBvZmZsaW5lIHNlc3Npb24sIHRoZSBxdWV1ZSB3YXMgYWxyZWFkeSBhZGRlZCBpbiBjb25zdHJ1Y3Rvci4KKyAgICAvLyBJZiBpdCdzIGEgcmVhbC10aW1lIHNlc3Npb25zLCBjaGVjayBpZiBhIHF1ZXVlIGlzIGFscmVhZHkgcHJlc2VudCBmb3IgdGhlIHVpZCwKKyAgICAvLyBhbmQgYWRkIGEgbmV3IHF1ZXVlIGlmIG5lZWRlZC4KKyAgICBpZiAoY2xpZW50VWlkICE9IE9GRkxJTkVfVUlEKSB7CisgICAgICAgIGlmIChtU2Vzc2lvblF1ZXVlcy5jb3VudChjbGllbnRVaWQpID09IDApIHsKKyAgICAgICAgICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyTW9uaXRvclVpZChjbGllbnRVaWQpOworICAgICAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkT25Ub3AoY2xpZW50VWlkKSkgeworICAgICAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0LnB1c2hfZnJvbnQoY2xpZW50VWlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2hvdWxkbid0IGJlIHN1Ym1pdHRpbmcgcmVhbC10aW1lIHJlcXVlc3RzIGZyb20gbm9uLXRvcCBhcHAsCisgICAgICAgICAgICAgICAgLy8gcHV0IGl0IGluIGZyb250IG9mIHRoZSBvZmZsaW5lIHF1ZXVlLgorICAgICAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0Lmluc2VydChtT2ZmbGluZVVpZEl0ZXJhdG9yLCBjbGllbnRVaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNsaWVudFVpZCAhPSAqbVVpZFNvcnRlZExpc3QuYmVnaW4oKSkgeworICAgICAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkT25Ub3AoY2xpZW50VWlkKSkgeworICAgICAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0LnJlbW92ZShjbGllbnRVaWQpOworICAgICAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0LnB1c2hfZnJvbnQoY2xpZW50VWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBcHBlbmQgdGhpcyBzZXNzaW9uIHRvIHRoZSB1aWQncyBxdWV1ZS4KKyAgICBtU2Vzc2lvblF1ZXVlc1tjbGllbnRVaWRdLnB1c2hfYmFjayhzZXNzaW9uS2V5KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpyZW1vdmVTZXNzaW9uX2woCisgICAgICAgIGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5LCBTZXNzaW9uOjpTdGF0ZSBmaW5hbFN0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpmdW5jdGlvbjxib29sKHVpZF90IHVpZCk+PiYga2VlcFVpZCkgeworICAgIEFMT0dWKCIlczogc2Vzc2lvbiAlcyIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworCisgICAgaWYgKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgQUxPR0UoInNlc3Npb24gJXMgZG9lc24ndCBleGlzdCIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFJlbW92ZSBzZXNzaW9uIGZyb20gdWlkJ3MgcXVldWUuCisgICAgYm9vbCB1aWRRdWV1ZVJlbW92ZWQgPSBmYWxzZTsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IHJlbWFpbmluZ1VpZHM7CisgICAgZm9yICh1aWRfdCB1aWQgOiBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzKSB7CisgICAgICAgIGlmIChrZWVwVWlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICgoKmtlZXBVaWQpKHVpZCkpIHsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdVaWRzLmluc2VydCh1aWQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSB1aWRzIHRvIGtlZXAsIHRoZSBzZXNzaW9uIGlzIG5vdCBnb2luZyB0byBhbnkgZmluYWwKKyAgICAgICAgICAgIC8vIHN0YXRlIHdlIGNhbid0IHVzZSBvblNlc3Npb25Db21wbGV0ZWQgYXMgdGhlIHJ1bm5pbmcgdGltZSB3aWxsCisgICAgICAgICAgICAvLyBub3QgYmUgdmFsaWQuIE9ubHkgbm90aWZ5IHBhY2VyIHRvIHN0b3AgdHJhY2tpbmcgdGhpcyBzZXNzaW9uLgorICAgICAgICAgICAgbVBhY2VyLT5vblNlc3Npb25DYW5jZWxsZWQodWlkKTsKKyAgICAgICAgfQorICAgICAgICBTZXNzaW9uUXVldWVUeXBlJiBzZXNzaW9uUXVldWUgPSBtU2Vzc2lvblF1ZXVlc1t1aWRdOworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNlc3Npb25RdWV1ZS5iZWdpbigpLCBzZXNzaW9uUXVldWUuZW5kKCksIHNlc3Npb25LZXkpOworICAgICAgICBpZiAoaXQgPT0gc2Vzc2lvblF1ZXVlLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZmluZCBzZXNzaW9uICVzIGluIHF1ZXVlIGZvciB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCksIHVpZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uUXVldWUuZXJhc2UoaXQpOworCisgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3Qgc2Vzc2lvbiBpbiBhIHJlYWwtdGltZSBxdWV1ZSwgcmVtb3ZlIHRoaXMgdWlkJ3MgcXVldWUuCisgICAgICAgIGlmICh1aWQgIT0gT0ZGTElORV9VSUQgJiYgc2Vzc2lvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0LnJlbW92ZSh1aWQpOworICAgICAgICAgICAgbVNlc3Npb25RdWV1ZXMuZXJhc2UodWlkKTsKKyAgICAgICAgICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZCk7CisKKyAgICAgICAgICAgIHVpZFF1ZXVlUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodWlkUXVldWVSZW1vdmVkKSB7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gdG9wVWlkcyA9IG1VaWRQb2xpY3ktPmdldFRvcFVpZHMoKTsKKyAgICAgICAgbW92ZVVpZHNUb1RvcF9sKHRvcFVpZHMsIGZhbHNlIC8qcHJlc2VydmVUb3BVaWQqLyk7CisgICAgfQorCisgICAgaWYgKGtlZXBVaWQgIT0gbnVsbHB0cikgeworICAgICAgICBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzID0gcmVtYWluaW5nVWlkczsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENsZWFyIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uID09ICZtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XSkgeworICAgICAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgIH0KKworICAgIHNldFNlc3Npb25TdGF0ZV9sKCZtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XSwgZmluYWxTdGF0ZSk7CisKKyAgICAvLyBXZSBjYW4gdXNlIG9uU2Vzc2lvbkNvbXBsZXRlZCgpIGV2ZW4gZm9yIENBTkNFTExFRCwgYmVjYXVzZSBydW5uaW5nVGltZSBpcworICAgIC8vIG5vdyB1cGRhdGVkIGJ5IHNldFNlc3Npb25TdGF0ZV9sKCkuCisgICAgZm9yICh1aWRfdCB1aWQgOiBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzKSB7CisgICAgICAgIG1QYWNlci0+b25TZXNzaW9uQ29tcGxldGVkKHVpZCwgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0ucnVubmluZ1RpbWUpOworICAgIH0KKworICAgIG1TZXNzaW9uSGlzdG9yeS5wdXNoX2JhY2sobVNlc3Npb25NYXBbc2Vzc2lvbktleV0pOworICAgIGlmIChtU2Vzc2lvbkhpc3Rvcnkuc2l6ZSgpID4ga1Nlc3Npb25IaXN0b3J5TWF4KSB7CisgICAgICAgIG1TZXNzaW9uSGlzdG9yeS5lcmFzZShtU2Vzc2lvbkhpc3RvcnkuYmVnaW4oKSk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHNlc3Npb24gZnJvbSBzZXNzaW9uIG1hcC4KKyAgICBtU2Vzc2lvbk1hcC5lcmFzZShzZXNzaW9uS2V5KTsKK30KKworLyoqCisgKiBNb3ZlcyB0aGUgc2V0IG9mIHVpZHMgdG8gdGhlIGZyb250IG9mIG1VaWRTb3J0ZWRMaXN0ICh3aGljaCBpcyB1c2VkIHRvIHBpY2sKKyAqIHRoZSBuZXh0IHNlc3Npb24gdG8gcnVuKS4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIDEpIHdlIHJlY2VpdmVkIGEgb25Ub3BVaWRzQ2hhbmdlZCgpIGNhbGxiYWNrIGZyb20gVWlkUG9saWN5LAorICogb3IgMikgd2UgcmVtb3ZlZCB0aGUgc2Vzc2lvbiBxdWV1ZSBmb3IgYSB1aWQgYmVjYXVzZSBpdCBiZWNvbWVzIGVtcHR5LgorICoKKyAqIEluIGNhc2Ugb2YgMSksIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSB1aWRzIGluIHRoZSBzZXQsIGFuZCB0aGUgY3VycmVudCBmcm9udAorICogdWlkIGluIG1VaWRTb3J0ZWRMaXN0IGlzIHN0aWxsIGluIHRoZSBzZXQsIHdlIHRyeSB0byBrZWVwIHRoYXQgdWlkIGF0IGZyb250CisgKiBzbyB0aGF0IGN1cnJlbnQgc2Vzc2lvbiBydW4gaXMgbm90IGludGVycnVwdGVkLiAoVGhpcyBpcyBub3QgYSBjb25jZXJuIGZvciBjYXNlIDIpCisgKiBiZWNhdXNlIHRoZSBxdWV1ZSBmb3IgYSB1aWQgd2FzIGp1c3QgcmVtb3ZlZCBlbnRpcmVseS4pCisgKi8KK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6bW92ZVVpZHNUb1RvcF9sKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4mIHVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlVG9wVWlkKSB7CisgICAgLy8gSWYgdWlkIHNldCBpcyBlbXB0eSwgbm90aGluZyB0byBkby4gRG8gbm90IGNoYW5nZSB0aGUgcXVldWUgc3RhdHVzLgorICAgIGlmICh1aWRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgdG9wIHVpZC4KKyAgICB1aWRfdCBjdXJUb3BVaWQgPSAqbVVpZFNvcnRlZExpc3QuYmVnaW4oKTsKKyAgICBib29sIHB1c2hDdXJUb3BUb0Zyb250ID0gZmFsc2U7CisgICAgaW50MzJfdCBudW1VaWRzTW92ZWQgPSAwOworCisgICAgLy8gR28gdGhyb3VnaCB0aGUgc29ydGVkIHVpZCBsaXN0IG9uY2UsIGFuZCBtb3ZlIHRoZSBvbmVzIGluIHRvcCBzZXQgdG8gZnJvbnQuCisgICAgZm9yIChhdXRvIGl0ID0gbVVpZFNvcnRlZExpc3QuYmVnaW4oKTsgaXQgIT0gbVVpZFNvcnRlZExpc3QuZW5kKCk7KSB7CisgICAgICAgIHVpZF90IHVpZCA9ICppdDsKKworICAgICAgICBpZiAodWlkICE9IE9GRkxJTkVfVUlEICYmIHVpZHMuY291bnQodWlkKSA+IDApIHsKKyAgICAgICAgICAgIGl0ID0gbVVpZFNvcnRlZExpc3QuZXJhc2UoaXQpOworCisgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSB0b3Agd2UncmUgcHJlc2VydmluZywgZG9uJ3QgcHVzaCBpdCBoZXJlLCBwdXNoCisgICAgICAgICAgICAvLyBpdCBhZnRlciB0aGUgZm9yLWxvb3AuCisgICAgICAgICAgICBpZiAodWlkID09IGN1clRvcFVpZCAmJiBwcmVzZXJ2ZVRvcFVpZCkgeworICAgICAgICAgICAgICAgIHB1c2hDdXJUb3BUb0Zyb250ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVVpZFNvcnRlZExpc3QucHVzaF9mcm9udCh1aWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhbGwgdWlkcyBpbiB0aGUgc2V0LCBicmVhayBvdXQuCisgICAgICAgICAgICBpZiAoKytudW1VaWRzTW92ZWQgPT0gdWlkcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHVzaEN1clRvcFRvRnJvbnQpIHsKKyAgICAgICAgbVVpZFNvcnRlZExpc3QucHVzaF9mcm9udChjdXJUb3BVaWQpOworICAgIH0KK30KKworYm9vbCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpzdWJtaXQoCisgICAgICAgIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIHVpZF90IGNhbGxpbmdVaWQsIHVpZF90IGNsaWVudFVpZCwKKyAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisKKyAgICBBTE9HVigiJXM6IHNlc3Npb24gJXMsIHVpZCAlZCwgcHJpb2lydHkgJWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpLAorICAgICAgICAgIGNsaWVudFVpZCwgKGludDMyX3QpcmVxdWVzdC5wcmlvcml0eSk7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgaWYgKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpID4gMCkgeworICAgICAgICBBTE9HRSgic2Vzc2lvbiAlcyBhbHJlYWR5IGV4aXN0cyIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgdWlkIHBhY2thZ2UgbmFtZSB0byB0aGUgc3RvcmUgb2YgcGFja2FnZSBuYW1lcyB3ZSBhbHJlYWR5IGtub3cuCisgICAgaWYgKG1VaWRQYWNrYWdlTmFtZXMuY291bnQoY2xpZW50VWlkKSA9PSAwKSB7CisgICAgICAgIG1VaWRQYWNrYWdlTmFtZXMuZW1wbGFjZShjbGllbnRVaWQsIHJlcXVlc3QuY2xpZW50UGFja2FnZU5hbWUpOworICAgIH0KKworICAgIC8vIFRPRE8oY2h6KTogb25seSBzdXBwb3J0IG9mZmxpbmUgdnMgcmVhbC10aW1lIGZvciBub3cuIEFsbCBrVW5zcGVjaWZpZWQgc2Vzc2lvbnMKKyAgICAvLyBnbyB0byBvZmZsaW5lIHF1ZXVlLgorICAgIGlmIChyZXF1ZXN0LnByaW9yaXR5ID09IFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQpIHsKKyAgICAgICAgY2xpZW50VWlkID0gT0ZGTElORV9VSUQ7CisgICAgfQorCisgICAgLy8gQWRkIHNlc3Npb24gdG8gc2Vzc2lvbiBtYXAuCisgICAgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0ua2V5ID0gc2Vzc2lvbktleTsKKyAgICBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5jYWxsaW5nVWlkID0gY2FsbGluZ1VpZDsKKyAgICBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzLmluc2VydChjbGllbnRVaWQpOworICAgIG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLnJlcXVlc3QgPSByZXF1ZXN0OworICAgIG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgc2V0U2Vzc2lvblN0YXRlX2woJm1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLCBTZXNzaW9uOjpOT1RfU1RBUlRFRCk7CisKKyAgICBhZGRVaWRUb1Nlc3Npb25fbChjbGllbnRVaWQsIHNlc3Npb25LZXkpOworCisgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgdmFsaWRhdGVTdGF0ZV9sKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6Y2FuY2VsKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisKKyAgICBBTE9HVigiJXM6IHNlc3Npb24gJXMiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKworICAgIHN0ZDo6bGlzdDxTZXNzaW9uS2V5VHlwZT4gc2Vzc2lvbnNUb1JlbW92ZSwgc2Vzc2lvbnNGb3JPZmZsaW5lOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1TZXNzaW9uTWFwLmJlZ2luKCk7IGl0ICE9IG1TZXNzaW9uTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoaXQtPmZpcnN0LmZpcnN0ID09IGNsaWVudElkKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb2ZmbGluZSByZXF1ZXN0LCBvbmx5IGtlZXAgdGhlIG9mZmxpbmUgY2xpZW50OworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZW1vdmUgdGhlIHNlc3Npb24uCisgICAgICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuYWxsQ2xpZW50VWlkcy5jb3VudChPRkZMSU5FX1VJRCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25zRm9yT2ZmbGluZS5wdXNoX2JhY2soaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uc1RvUmVtb3ZlLnB1c2hfYmFjayhpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtU2Vzc2lvbk1hcC5jb3VudChzZXNzaW9uS2V5KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgic2Vzc2lvbiAlcyBkb2Vzbid0IGV4aXN0Iiwgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHNlc3Npb25zVG9SZW1vdmUucHVzaF9iYWNrKHNlc3Npb25LZXkpOworICAgIH0KKworICAgIGZvciAoYXV0byBpdCA9IHNlc3Npb25zVG9SZW1vdmUuYmVnaW4oKTsgaXQgIT0gc2Vzc2lvbnNUb1JlbW92ZS5lbmQoKTsgKytpdCkgeworICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBoYXMgZXZlciBiZWVuIHN0YXJ0ZWQsIHN0b3AgaXQgbm93LgorICAgICAgICAvLyBOb3RlIHRoYXQgc3RvcCgpIGlzIG5lZWRlZCBldmVuIGlmIHRoZSBzZXNzaW9uIGlzIGN1cnJlbnRseSBwYXVzZWQuIFRoaXMgaW5zdHJ1Y3RzCisgICAgICAgIC8vIHRoZSB0cmFuc2NvZGVyIHRvIGRpc2NhcmQgYW55IHN0YXRlcyBmb3IgdGhlIHNlc3Npb24sIG90aGVyd2lzZSB0aGUgc3RhdGVzIG1heQorICAgICAgICAvLyBuZXZlciBiZSBkaXNjYXJkZWQuCisgICAgICAgIGlmIChtU2Vzc2lvbk1hcFsqaXRdLmdldFN0YXRlKCkgIT0gU2Vzc2lvbjo6Tk9UX1NUQVJURUQpIHsKKyAgICAgICAgICAgIG1UcmFuc2NvZGVyLT5zdG9wKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIHNlc3Npb24uCisgICAgICAgIHJlbW92ZVNlc3Npb25fbCgqaXQsIFNlc3Npb246OkNBTkNFTEVEKTsKKyAgICB9CisKKyAgICBhdXRvIGtlZXBVaWQgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aWRfdCk+PigKKyAgICAgICAgICAgIFtdKHVpZF90IHVpZCkgeyByZXR1cm4gdWlkID09IE9GRkxJTkVfVUlEOyB9KTsKKyAgICBmb3IgKGF1dG8gaXQgPSBzZXNzaW9uc0Zvck9mZmxpbmUuYmVnaW4oKTsgaXQgIT0gc2Vzc2lvbnNGb3JPZmZsaW5lLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHJlbW92ZVNlc3Npb25fbCgqaXQsIFNlc3Npb246OkNBTkNFTEVELCBrZWVwVWlkKTsKKyAgICB9CisKKyAgICAvLyBTdGFydCBuZXh0IHNlc3Npb24uCisgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgdmFsaWRhdGVTdGF0ZV9sKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6YWRkQ2xpZW50VWlkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQpIHsKKyAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUxvY2t9OworCisgICAgaWYgKG1TZXNzaW9uTWFwLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgQUxPR0UoInNlc3Npb24gJXMgZG9lc24ndCBleGlzdCIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzLmNvdW50KGNsaWVudFVpZCkgPiAwKSB7CisgICAgICAgIEFMT0dFKCJzZXNzaW9uICVzIGFscmVhZHkgaGFzIHVpZCAlZCIsIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpLCBjbGllbnRVaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVNlc3Npb25NYXBbc2Vzc2lvbktleV0uYWxsQ2xpZW50VWlkcy5pbnNlcnQoY2xpZW50VWlkKTsKKyAgICBhZGRVaWRUb1Nlc3Npb25fbChjbGllbnRVaWQsIHNlc3Npb25LZXkpOworCisgICAgdXBkYXRlQ3VycmVudFNlc3Npb25fbCgpOworCisgICAgdmFsaWRhdGVTdGF0ZV9sKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6Z2V0Q2xpZW50VWlkcyhDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRfY2xpZW50VWlkcykgeworICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAobVNlc3Npb25NYXAuY291bnQoc2Vzc2lvbktleSkgPT0gMCkgeworICAgICAgICBBTE9HRSgic2Vzc2lvbiAlcyBkb2Vzbid0IGV4aXN0Iiwgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgb3V0X2NsaWVudFVpZHMtPmNsZWFyKCk7CisgICAgZm9yICh1aWRfdCB1aWQgOiBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzKSB7CisgICAgICAgIGlmICh1aWQgIT0gT0ZGTElORV9VSUQpIHsKKyAgICAgICAgICAgIG91dF9jbGllbnRVaWRzLT5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpnZXRTZXNzaW9uKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsKiByZXF1ZXN0KSB7CisgICAgU2Vzc2lvbktleVR5cGUgc2Vzc2lvbktleSA9IHN0ZDo6bWFrZV9wYWlyKGNsaWVudElkLCBzZXNzaW9uSWQpOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmIChtU2Vzc2lvbk1hcC5jb3VudChzZXNzaW9uS2V5KSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXNzaW9uICVzIGRvZXNuJ3QgZXhpc3QiLCBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqKFRyYW5zY29kaW5nUmVxdWVzdCopcmVxdWVzdCA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLnJlcXVlc3Q7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6bm90aWZ5Q2xpZW50KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgU2Vzc2lvbktleVR5cGUmKT4gZnVuYykgeworICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAobVNlc3Npb25NYXAuY291bnQoc2Vzc2lvbktleSkgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGlnbm9yaW5nICVzIGZvciBzZXNzaW9uICVzIHRoYXQgZG9lc24ndCBleGlzdCIsIF9fRlVOQ1RJT05fXywgcmVhc29uLAorICAgICAgICAgICAgICBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBPbmx5IGlnbm9yZSBpZiBzZXNzaW9uIHdhcyBuZXZlciBzdGFydGVkLiBJbiBwYXJ0aWN1bGFyLCBwcm9wYWdhdGUgdGhlIHN0YXR1cworICAgIC8vIHRvIGNsaWVudCBpZiB0aGUgc2Vzc2lvbiBpcyBwYXVzZWQuIFRyYW5zY29kZXIgY291bGQgaGF2ZSBwb3N0ZWQgZmluaXNoIHdoZW4KKyAgICAvLyB3ZSdyZSBwYXVzaW5nIGl0LCBhbmQgdGhlIGZpbmlzaCBhcnJpdmVkIGFmdGVyIHdlIGNoYW5nZWQgY3VycmVudCBzZXNzaW9uLgorICAgIGlmIChtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5nZXRTdGF0ZSgpID09IFNlc3Npb246Ok5PVF9TVEFSVEVEKSB7CisgICAgICAgIEFMT0dXKCIlczogaWdub3JpbmcgJXMgZm9yIHNlc3Npb24gJXMgdGhhdCB3YXMgbmV2ZXIgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgcmVhc29uLAorICAgICAgICAgICAgICBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IHNlc3Npb24gJXMgJXMiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb25Ub1N0cmluZyhzZXNzaW9uS2V5KS5jX3N0cigpLCByZWFzb24pOworICAgIGZ1bmMoc2Vzc2lvbktleSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25TdGFydGVkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBub3RpZnlDbGllbnQoY2xpZW50SWQsIHNlc3Npb25JZCwgInN0YXJ0ZWQiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblRyYW5zY29kaW5nU3RhcnRlZChzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25QYXVzZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAicGF1c2VkIiwgWz1dKGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5jYWxsYmFjay5sb2NrKCk7CisgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYWxsYmFjay0+b25UcmFuc2NvZGluZ1BhdXNlZChzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25SZXN1bWVkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBub3RpZnlDbGllbnQoY2xpZW50SWQsIHNlc3Npb25JZCwgInJlc3VtZWQiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblRyYW5zY29kaW5nUmVzdW1lZChzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25GaW5pc2goQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAiZmluaXNoIiwgWz1dKGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gY2xpZW50Q2FsbGJhY2sgPSBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5jYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLT5vblRyYW5zY29kaW5nRmluaXNoZWQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIFRyYW5zY29kaW5nUmVzdWx0UGFyY2VsKHtzZXNzaW9uSWQsIC0xIC8qYWN0dWFsQml0cmF0ZUJwcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudWxsb3B0IC8qc2Vzc2lvblN0YXRzKi99KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIHNlc3Npb24uCisgICAgICAgIHJlbW92ZVNlc3Npb25fbChzZXNzaW9uS2V5LCBTZXNzaW9uOjpGSU5JU0hFRCk7CisKKyAgICAgICAgLy8gU3RhcnQgbmV4dCBzZXNzaW9uLgorICAgICAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICAgICAgdmFsaWRhdGVTdGF0ZV9sKCk7CisgICAgfSk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcjo6b25FcnJvcihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIGVycikgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAiZXJyb3IiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgaWYgKGVyciA9PSBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1dhdGNoZG9nVGltZW91dCkgeworICAgICAgICAgICAgLy8gQWJhbmRvbiB0aGUgdHJhbnNjb2RlciwgYXMgaXRzIGhhbmRsZXIgdGhyZWFkIG1pZ2h0IGJlIHN0dWNrIGluIHNvbWUgY2FsbCB0bworICAgICAgICAgICAgLy8gTWVkaWFUcmFuc2NvZGVyIGFsdG9nZXRoZXIsIGFuZCBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlIGFueSBuZXcgdGFza3MuCisgICAgICAgICAgICBtVHJhbnNjb2Rlci0+c3RvcChjbGllbnRJZCwgc2Vzc2lvbklkLCB0cnVlIC8qYWJhbmRvbiovKTsKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBsYXN0IHJlZiBjb3VudCBiZWZvcmUgd2UgY3JlYXRlIG5ldyB0cmFuc2NvZGVyLgorICAgICAgICAgICAgbVRyYW5zY29kZXIgPSBudWxscHRyOworICAgICAgICAgICAgbVRyYW5zY29kZXIgPSBtVHJhbnNjb2RlckZhY3Rvcnkoc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gY2xpZW50Q2FsbGJhY2sgPSBtU2Vzc2lvbk1hcFtzZXNzaW9uS2V5XS5jYWxsYmFjay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50Q2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLT5vblRyYW5zY29kaW5nRmFpbGVkKHNlc3Npb25JZCwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSB0aGUgc2Vzc2lvbi4KKyAgICAgICAgcmVtb3ZlU2Vzc2lvbl9sKHNlc3Npb25LZXksIFNlc3Npb246OkVSUk9SKTsKKworICAgICAgICAvLyBTdGFydCBuZXh0IHNlc3Npb24uCisgICAgICAgIHVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKTsKKworICAgICAgICB2YWxpZGF0ZVN0YXRlX2woKTsKKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblByb2dyZXNzVXBkYXRlKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcm9ncmVzcykgeworICAgIG5vdGlmeUNsaWVudChjbGllbnRJZCwgc2Vzc2lvbklkLCAicHJvZ3Jlc3MiLCBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIHNlc3Npb25LZXkpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblByb2dyZXNzVXBkYXRlKHNlc3Npb25JZCwgcHJvZ3Jlc3MpOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uTWFwW3Nlc3Npb25LZXldLmxhc3RQcm9ncmVzcyA9IHByb2dyZXNzOworICAgIH0pOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uSGVhcnRCZWF0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBub3RpZnlDbGllbnQoY2xpZW50SWQsIHNlc3Npb25JZCwgImhlYXJ0LWJlYXQiLAorICAgICAgICAgICAgICAgICBbPV0oY29uc3QgU2Vzc2lvbktleVR5cGUmIC8qc2Vzc2lvbktleSovKSB7IG1XYXRjaGRvZy0+a2VlcEFsaXZlKCk7IH0pOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uUmVzb3VyY2VMb3N0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIHsKKyAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbm90aWZ5Q2xpZW50KGNsaWVudElkLCBzZXNzaW9uSWQsICJyZXNvdXJjZV9sb3N0IiwgWz1dKGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KSB7CisgICAgICAgIGlmIChtUmVzb3VyY2VMb3N0KSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBTZXNzaW9uKiByZXNvdXJjZUxvc3RTZXNzaW9uID0gJm1TZXNzaW9uTWFwW3Nlc3Npb25LZXldOworICAgICAgICBpZiAocmVzb3VyY2VMb3N0U2Vzc2lvbi0+Z2V0U3RhdGUoKSAhPSBTZXNzaW9uOjpSVU5OSU5HKSB7CisgICAgICAgICAgICBBTE9HVygic2Vzc2lvbiAlcyBsb3N0IHJlc291cmNlIGJ1dCBpcyBubyBsb25nZXIgcnVubmluZyIsCisgICAgICAgICAgICAgICAgICBzZXNzaW9uVG9TdHJpbmcoc2Vzc2lvbktleSkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZSBhIHJlc291cmNlIGxvc3MgZXZlbnQsIHRoZSB0cmFuc2NvZGVyIGFscmVhZHkgcGF1c2VkIHRoZSB0cmFuc2NvZGluZywKKyAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjYWxsIG9uUGF1c2VkKCkgdG8gcGF1c2UgaXQuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgdG8gbm90aWZ5CisgICAgICAgIC8vIHRoZSBjbGllbnQgYW5kIHVwZGF0ZSB0aGUgc2Vzc2lvbiBzdGF0ZSBoZXJlLgorICAgICAgICBzZXRTZXNzaW9uU3RhdGVfbChyZXNvdXJjZUxvc3RTZXNzaW9uLCBTZXNzaW9uOjpQQVVTRUQpOworICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBhcyBhIHBhdXNlZCBldmVudC4KKyAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IHJlc291cmNlTG9zdFNlc3Npb24tPmNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNsaWVudENhbGxiYWNrLT5vblRyYW5zY29kaW5nUGF1c2VkKHNlc3Npb25LZXkuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlc291cmNlUG9saWN5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1SZXNvdXJjZVBvbGljeS0+c2V0UGlkUmVzb3VyY2VMb3N0KHJlc291cmNlTG9zdFNlc3Npb24tPnJlcXVlc3QuY2xpZW50UGlkKTsKKyAgICAgICAgfQorICAgICAgICBtUmVzb3VyY2VMb3N0ID0gdHJ1ZTsKKworICAgICAgICB2YWxpZGF0ZVN0YXRlX2woKTsKKyAgICB9KTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblRvcFVpZHNDaGFuZ2VkKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4mIHVpZHMpIHsKKyAgICBpZiAodWlkcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dXKCIlczogaWdub3JpbmcgZW1wdHkgdWlkcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyB1aWRTdHI7CisgICAgZm9yIChhdXRvIGl0ID0gdWlkcy5iZWdpbigpOyBpdCAhPSB1aWRzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmICghdWlkU3RyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHVpZFN0ciArPSAiLCAiOworICAgICAgICB9CisgICAgICAgIHVpZFN0ciArPSBzdGQ6OnRvX3N0cmluZygqaXQpOworICAgIH0KKworICAgIEFMT0dEKCIlczogdG9wVWlkczogc2l6ZSAlenUsIHVpZHM6ICVzIiwgX19GVU5DVElPTl9fLCB1aWRzLnNpemUoKSwgdWlkU3RyLmNfc3RyKCkpOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIG1vdmVVaWRzVG9Ub3BfbCh1aWRzLCB0cnVlIC8qcHJlc2VydmVUb3BVaWQqLyk7CisKKyAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICB2YWxpZGF0ZVN0YXRlX2woKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblVpZEdvbmUodWlkX3QgZ29uZVVpZCkgeworICAgIEFMT0dEKCIlczogZ29uZSB1aWQgJXUiLCBfX0ZVTkNUSU9OX18sIGdvbmVVaWQpOworCisgICAgc3RkOjpsaXN0PFNlc3Npb25LZXlUeXBlPiBzZXNzaW9uc1RvUmVtb3ZlLCBzZXNzaW9uc0Zvck90aGVyVWlkczsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBmb3IgKGF1dG8gaXQgPSBtU2Vzc2lvbk1hcC5iZWdpbigpOyBpdCAhPSBtU2Vzc2lvbk1hcC5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPnNlY29uZC5hbGxDbGllbnRVaWRzLmNvdW50KGdvbmVVaWQpID4gMCkgeworICAgICAgICAgICAgLy8gSWYgZ29uZVVpZCBpcyB0aGUgb25seSB1aWQsIHJlbW92ZSB0aGUgc2Vzc2lvbjsgb3RoZXJ3aXNlLCBvbmx5CisgICAgICAgICAgICAvLyByZW1vdmUgdGhlIHVpZCBmcm9tIHRoZSBzZXNzaW9uLgorICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuYWxsQ2xpZW50VWlkcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgc2Vzc2lvbnNGb3JPdGhlclVpZHMucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlc3Npb25zVG9SZW1vdmUucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gaXQgPSBzZXNzaW9uc1RvUmVtb3ZlLmJlZ2luKCk7IGl0ICE9IHNlc3Npb25zVG9SZW1vdmUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gSWYgdGhlIHNlc3Npb24gaGFzIGV2ZXIgYmVlbiBzdGFydGVkLCBzdG9wIGl0IG5vdy4KKyAgICAgICAgLy8gTm90ZSB0aGF0IHN0b3AoKSBpcyBuZWVkZWQgZXZlbiBpZiB0aGUgc2Vzc2lvbiBpcyBjdXJyZW50bHkgcGF1c2VkLiBUaGlzIGluc3RydWN0cworICAgICAgICAvLyB0aGUgdHJhbnNjb2RlciB0byBkaXNjYXJkIGFueSBzdGF0ZXMgZm9yIHRoZSBzZXNzaW9uLCBvdGhlcndpc2UgdGhlIHN0YXRlcyBtYXkKKyAgICAgICAgLy8gbmV2ZXIgYmUgZGlzY2FyZGVkLgorICAgICAgICBpZiAobVNlc3Npb25NYXBbKml0XS5nZXRTdGF0ZSgpICE9IFNlc3Npb246Ok5PVF9TVEFSVEVEKSB7CisgICAgICAgICAgICBtVHJhbnNjb2Rlci0+c3RvcChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IG1TZXNzaW9uTWFwWyppdF0uY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay0+b25UcmFuc2NvZGluZ0ZhaWxlZChpdC0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVWlkR29uZUNhbmNlbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdGhlIHNlc3Npb24uCisgICAgICAgIHJlbW92ZVNlc3Npb25fbCgqaXQsIFNlc3Npb246OkNBTkNFTEVEKTsKKyAgICB9CisKKyAgICBhdXRvIGtlZXBVaWQgPSBzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6ZnVuY3Rpb248Ym9vbCh1aWRfdCk+PigKKyAgICAgICAgICAgIFtnb25lVWlkXSh1aWRfdCB1aWQpIHsgcmV0dXJuIHVpZCAhPSBnb25lVWlkOyB9KTsKKyAgICBmb3IgKGF1dG8gaXQgPSBzZXNzaW9uc0Zvck90aGVyVWlkcy5iZWdpbigpOyBpdCAhPSBzZXNzaW9uc0Zvck90aGVyVWlkcy5lbmQoKTsgKytpdCkgeworICAgICAgICByZW1vdmVTZXNzaW9uX2woKml0LCBTZXNzaW9uOjpDQU5DRUxFRCwga2VlcFVpZCk7CisgICAgfQorCisgICAgLy8gU3RhcnQgbmV4dCBzZXNzaW9uLgorICAgIHVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKTsKKworICAgIHZhbGlkYXRlU3RhdGVfbCgpOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6Om9uUmVzb3VyY2VBdmFpbGFibGUoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKworICAgIGlmICghbVJlc291cmNlTG9zdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIG1SZXNvdXJjZUxvc3QgPSBmYWxzZTsKKyAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICB2YWxpZGF0ZVN0YXRlX2woKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblRocm90dGxpbmdTdGFydGVkKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAobVRoZXJtYWxUaHJvdHRsaW5nKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOworCisgICAgbVRoZXJtYWxUaHJvdHRsaW5nID0gdHJ1ZTsKKyAgICB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisKKyAgICB2YWxpZGF0ZVN0YXRlX2woKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpvblRocm90dGxpbmdTdG9wcGVkKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisKKyAgICBpZiAoIW1UaGVybWFsVGhyb3R0bGluZykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIG1UaGVybWFsVGhyb3R0bGluZyA9IGZhbHNlOworICAgIHVwZGF0ZUN1cnJlbnRTZXNzaW9uX2woKTsKKworICAgIHZhbGlkYXRlU3RhdGVfbCgpOworfQorCit2b2lkIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OnZhbGlkYXRlU3RhdGVfbCgpIHsKKyNpZmRlZiBWQUxJREFURV9TVEFURQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNlc3Npb25RdWV1ZXMuY291bnQoT0ZGTElORV9VSUQpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAibVNlc3Npb25RdWV1ZXMgb2ZmbGluZSBxdWV1ZSBudW1iZXIgaXMgbm90IDEiKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCptT2ZmbGluZVVpZEl0ZXJhdG9yICE9IE9GRkxJTkVfVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIm1PZmZsaW5lVWlkSXRlcmF0b3Igbm90IHBvaW50aW5nIHRvIG9mZmxpbmUgdWlkIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtVWlkU29ydGVkTGlzdC5zaXplKCkgIT0gbVNlc3Npb25RdWV1ZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1VaWRTb3J0ZWRMaXN0IGFuZCBtU2Vzc2lvblF1ZXVlcyBzaXplIG1pc21hdGNoLCAlenUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VaWRTb3J0ZWRMaXN0LnNpemUoKSwgbVNlc3Npb25RdWV1ZXMuc2l6ZSgpKTsKKworICAgIGludDMyX3QgdG90YWxTZXNzaW9ucyA9IDA7CisgICAgZm9yIChhdXRvIHVpZCA6IG1VaWRTb3J0ZWRMaXN0KSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNlc3Npb25RdWV1ZXMuY291bnQodWlkKSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtU2Vzc2lvblF1ZXVlcyBjb3VudCBmb3IgdWlkICVkIGlzIG5vdCAxIiwgdWlkKTsKKyAgICAgICAgZm9yIChhdXRvJiBzZXNzaW9uS2V5IDogbVNlc3Npb25RdWV1ZXNbdWlkXSkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2Vzc2lvbk1hcC5jb3VudChzZXNzaW9uS2V5KSAhPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibVNlc3Npb25zIGNvdW50IGZvciBzZXNzaW9uICVzIGlzIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblRvU3RyaW5nKHNlc3Npb25LZXkpLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxTZXNzaW9ucyArPSBtU2Vzc2lvblF1ZXVlc1t1aWRdLnNpemUoKTsKKyAgICB9CisgICAgaW50MzJfdCB0b3RhbFNlc3Npb25zQWx0ZXJuYXRpdmUgPSAwOworICAgIGZvciAoYXV0byBjb25zdCYgcyA6IG1TZXNzaW9uTWFwKSB7CisgICAgICAgIHRvdGFsU2Vzc2lvbnNBbHRlcm5hdGl2ZSArPSBzLnNlY29uZC5hbGxDbGllbnRVaWRzLnNpemUoKTsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0b3RhbFNlc3Npb25zICE9IHRvdGFsU2Vzc2lvbnNBbHRlcm5hdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXNzaW9uIGNvdW50IChpbmNsdWRpbmcgZHVwKSBmcm9tIG1TZXNzaW9uUXVldWVzIGRvZXNuJ3QgbWF0Y2ggdGhhdCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtU2Vzc2lvbk1hcCwgJWQgdnMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTZXNzaW9ucywgdG90YWxTZXNzaW9uc0FsdGVybmF0aXZlKTsKKyNlbmRpZiAgLy8gVkFMSURBVEVfU1RBVEUKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5LmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY0NDVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kiCisKKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ0RlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBib29sIG5lZWRUaHJvdHRsaW5nKEFUaGVybWFsU3RhdHVzIHN0YXR1cykgeworICAgIHJldHVybiAoc3RhdHVzID49IEFUSEVSTUFMX1NUQVRVU19TRVZFUkUpOworfQorCisvL3N0YXRpYwordm9pZCBUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6Om9uU3RhdHVzQ2hhbmdlKHZvaWQqIGRhdGEsIEFUaGVybWFsU3RhdHVzIHN0YXR1cykgeworICAgIFRyYW5zY29kaW5nVGhlcm1hbFBvbGljeSogcG9saWN5ID0gc3RhdGljX2Nhc3Q8VHJhbnNjb2RpbmdUaGVybWFsUG9saWN5Kj4oZGF0YSk7CisgICAgcG9saWN5LT5vblN0YXR1c0NoYW5nZShzdGF0dXMpOworfQorCitUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6OlRyYW5zY29kaW5nVGhlcm1hbFBvbGljeSgpCisgICAgICA6IG1SZWdpc3RlcmVkKGZhbHNlKSwgbVRoZXJtYWxNYW5hZ2VyKG51bGxwdHIpLCBtSXNUaHJvdHRsaW5nKGZhbHNlKSB7CisgICAgcmVnaXN0ZXJTZWxmKCk7Cit9CisKK1RyYW5zY29kaW5nVGhlcm1hbFBvbGljeTo6flRyYW5zY29kaW5nVGhlcm1hbFBvbGljeSgpIHsKKyAgICB1bnJlZ2lzdGVyU2VsZigpOworfQorCit2b2lkIFRyYW5zY29kaW5nVGhlcm1hbFBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgeworICAgIEFMT0dJKCJUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6IHJlZ2lzdGVyU2VsZiIpOworCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21SZWdpc3RlcmVkTG9ja307CisKKyAgICBpZiAobVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgX19UUkFOU0NPRElOR19NSU5fQVBJX18sICopKSB7CisgICAgICAgIEFUaGVybWFsTWFuYWdlciogdGhlcm1hbE1hbmFnZXIgPSBBVGhlcm1hbF9hY3F1aXJlTWFuYWdlcigpOworICAgICAgICBpZiAodGhlcm1hbE1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIHRoZXJtYWwgbWFuYWdlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldCA9IEFUaGVybWFsX3JlZ2lzdGVyVGhlcm1hbFN0YXR1c0xpc3RlbmVyKHRoZXJtYWxNYW5hZ2VyLCBvblN0YXR1c0NoYW5nZSwgdGhpcyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWdpc3RlciB0aGVybWFsIHN0YXR1cyBsaXN0ZW5lciIpOworICAgICAgICAgICAgQVRoZXJtYWxfcmVsZWFzZU1hbmFnZXIodGhlcm1hbE1hbmFnZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUlzVGhyb3R0bGluZyA9IG5lZWRUaHJvdHRsaW5nKEFUaGVybWFsX2dldEN1cnJlbnRUaGVybWFsU3RhdHVzKHRoZXJtYWxNYW5hZ2VyKSk7CisgICAgICAgIG1UaGVybWFsTWFuYWdlciA9IHRoZXJtYWxNYW5hZ2VyOworICAgIH0KKworICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIEFMT0dJKCJUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6IHVucmVnaXN0ZXJTZWxmIik7CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVJlZ2lzdGVyZWRMb2NrfTsKKworICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgX19UUkFOU0NPRElOR19NSU5fQVBJX18sICopKSB7CisgICAgICAgIGlmIChtVGhlcm1hbE1hbmFnZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gVW5yZWdpc3RlciBsaXN0ZW5lcgorICAgICAgICAgICAgaW50IHJldCA9CisgICAgICAgICAgICAgICAgICAgIEFUaGVybWFsX3VucmVnaXN0ZXJUaGVybWFsU3RhdHVzTGlzdGVuZXIobVRoZXJtYWxNYW5hZ2VyLCBvblN0YXR1c0NoYW5nZSwgdGhpcyk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHVucmVnaXN0ZXIgdGhlcm1hbCBzdGF0dXMgbGlzdGVuZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFUaGVybWFsX3JlbGVhc2VNYW5hZ2VyKG1UaGVybWFsTWFuYWdlcik7CisgICAgICAgICAgICBtVGhlcm1hbE1hbmFnZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhlcm1hbFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bUNhbGxiYWNrTG9ja307CisgICAgbVRoZXJtYWxQb2xpY3lDYWxsYmFjayA9IGNiOworfQorCitib29sIFRyYW5zY29kaW5nVGhlcm1hbFBvbGljeTo6Z2V0VGhyb3R0bGluZ1N0YXR1cygpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVJlZ2lzdGVyZWRMb2NrfTsKKyAgICByZXR1cm4gbUlzVGhyb3R0bGluZzsKK30KKwordm9pZCBUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3k6Om9uU3RhdHVzQ2hhbmdlKEFUaGVybWFsU3RhdHVzIHN0YXR1cykgeworICAgIGJvb2wgaXNUaHJvdHRsaW5nID0gbmVlZFRocm90dGxpbmcoc3RhdHVzKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21SZWdpc3RlcmVkTG9ja307CisgICAgICAgIGlmIChpc1Rocm90dGxpbmcgPT0gbUlzVGhyb3R0bGluZykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dJKCJUcmFuc2NvZGluZyB0aGVybWFsIHRocm90dGxpbmcgY2hhbmdlZDogJWQiLCBpc1Rocm90dGxpbmcpOworICAgICAgICBtSXNUaHJvdHRsaW5nID0gaXNUaHJvdHRsaW5nOworICAgIH0KKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2FsbGJhY2tMb2NrfTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhlcm1hbFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiBjYjsKKyAgICBpZiAoKGNiID0gbVRoZXJtYWxQb2xpY3lDYWxsYmFjay5sb2NrKCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzVGhyb3R0bGluZykgeworICAgICAgICAgICAgY2ItPm9uVGhyb3R0bGluZ1N0YXJ0ZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNiLT5vblRocm90dGxpbmdTdG9wcGVkKCk7CisgICAgICAgIH0KKyAgICB9Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1VpZFBvbGljeS5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL1RyYW5zY29kaW5nVWlkUG9saWN5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNjNTRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9UcmFuc2NvZGluZ1VpZFBvbGljeS5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRyYW5zY29kaW5nVWlkUG9saWN5IgorCisjaW5jbHVkZSA8YW5kcm9pZC9hY3Rpdml0eV9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nVWlkUG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBzdGF0aWMgdWlkX3QgT0ZGTElORV9VSUQgPSAtMTsKK2NvbnN0ZXhwciBzdGF0aWMgaW50MzJfdCBJTVBPUlRBTkNFX1VOS05PV04gPSBJTlQzMl9NQVg7CisKK1RyYW5zY29kaW5nVWlkUG9saWN5OjpUcmFuc2NvZGluZ1VpZFBvbGljeSgpCisgICAgICA6IG1VaWRPYnNlcnZlcihudWxscHRyKSwgbVJlZ2lzdGVyZWQoZmFsc2UpLCBtVG9wVWlkU3RhdGUoSU1QT1JUQU5DRV9VTktOT1dOKSB7CisgICAgcmVnaXN0ZXJTZWxmKCk7Cit9CisKK1RyYW5zY29kaW5nVWlkUG9saWN5Ojp+VHJhbnNjb2RpbmdVaWRQb2xpY3koKSB7CisgICAgdW5yZWdpc3RlclNlbGYoKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6T25VaWRJbXBvcnRhbmNlKHVpZF90IHVpZCwgaW50MzJfdCB1aWRJbXBvcnRhbmNlLCB2b2lkKiBjb29raWUpIHsKKyAgICBUcmFuc2NvZGluZ1VpZFBvbGljeSogb3duZXIgPSByZWludGVycHJldF9jYXN0PFRyYW5zY29kaW5nVWlkUG9saWN5Kj4oY29va2llKTsKKyAgICBvd25lci0+b25VaWRTdGF0ZUNoYW5nZWQodWlkLCB1aWRJbXBvcnRhbmNlKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgeworICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgX19UUkFOU0NPRElOR19NSU5fQVBJX18sICopKSB7CisgICAgICAgIG1VaWRPYnNlcnZlciA9IEFBY3Rpdml0eU1hbmFnZXJfYWRkVWlkSW1wb3J0YW5jZUxpc3RlbmVyKCZPblVpZEltcG9ydGFuY2UsIC0xLCAodm9pZCopdGhpcyk7CisgICAgfQorCisgICAgaWYgKG1VaWRPYnNlcnZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdWlkIG9ic2VydmVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICBBTE9HSSgiUmVnaXN0ZXJlZCB1aWQgb2JzZXJ2ZXIiKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgaWYgKF9fYnVpbHRpbl9hdmFpbGFibGUoYW5kcm9pZCBfX1RSQU5TQ09ESU5HX01JTl9BUElfXywgKikpIHsKKyAgICAgICAgQUFjdGl2aXR5TWFuYWdlcl9yZW1vdmVVaWRJbXBvcnRhbmNlTGlzdGVuZXIobVVpZE9ic2VydmVyKTsKKyAgICAgICAgbVVpZE9ic2VydmVyID0gbnVsbHB0cjsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOworICAgICAgICBBTE9HSSgiVW5yZWdpc3RlcmVkIHVpZCBvYnNlcnZlciIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gdW5yZWdpc3RlciB1aWQgb2JzZXJ2ZXIiKTsKKyAgICB9Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OnNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4mIGNiKSB7CisgICAgbVVpZFBvbGljeUNhbGxiYWNrID0gY2I7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIGlmICh1aWQgPT0gT0ZGTElORV9VSUQpIHsKKyAgICAgICAgQUxPR1coIklnbm9yaW5nIHRoZSBvZmZsaW5lIHVpZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtVWlkU3RhdGVNYXAuZmluZCh1aWQpICE9IG1VaWRTdGF0ZU1hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byByZWdpc3RlciB1aWQ6ICVkIHdoaWNoIGlzIGFscmVhZHkgbW9uaXRvcmVkISIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgc3RhdGUgPSBJTVBPUlRBTkNFX1VOS05PV047CisgICAgaWYgKF9fYnVpbHRpbl9hdmFpbGFibGUoYW5kcm9pZCBfX1RSQU5TQ09ESU5HX01JTl9BUElfXywgKikpIHsKKyAgICAgICAgaWYgKG1SZWdpc3RlcmVkICYmIEFBY3Rpdml0eU1hbmFnZXJfaXNVaWRBY3RpdmUodWlkKSkgeworICAgICAgICAgICAgc3RhdGUgPSBBQWN0aXZpdHlNYW5hZ2VyX2dldFVpZEltcG9ydGFuY2UodWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCIlczogaW5zZXJ0aW5nIG5ldyB1aWQ6ICV1LCBwcm9jU3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIHVpZCwgc3RhdGUpOworCisgICAgbVVpZFN0YXRlTWFwLmVtcGxhY2Uoc3RkOjpwYWlyPHVpZF90LCBpbnQzMl90Pih1aWQsIHN0YXRlKSk7CisgICAgbVN0YXRlVWlkTWFwW3N0YXRlXS5pbnNlcnQodWlkKTsKKworICAgIHVwZGF0ZVRvcFVpZF9sKCk7Cit9CisKK3ZvaWQgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisKKyAgICBhdXRvIGl0ID0gbVVpZFN0YXRlTWFwLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgPT0gbVVpZFN0YXRlTWFwLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHVucmVnaXN0ZXIgdWlkOiAlZCB3aGljaCBpcyBub3QgbW9uaXRvcmVkISIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc3RhdGVJdCA9IG1TdGF0ZVVpZE1hcC5maW5kKGl0LT5zZWNvbmQpOworICAgIGlmIChzdGF0ZUl0ICE9IG1TdGF0ZVVpZE1hcC5lbmQoKSkgeworICAgICAgICBzdGF0ZUl0LT5zZWNvbmQuZXJhc2UodWlkKTsKKyAgICAgICAgaWYgKHN0YXRlSXQtPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtU3RhdGVVaWRNYXAuZXJhc2Uoc3RhdGVJdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVVpZFN0YXRlTWFwLmVyYXNlKGl0KTsKKworICAgIHVwZGF0ZVRvcFVpZF9sKCk7Cit9CisKK2Jvb2wgVHJhbnNjb2RpbmdVaWRQb2xpY3k6OmlzVWlkT25Ub3AodWlkX3QgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKworICAgIHJldHVybiBtVG9wVWlkU3RhdGUgIT0gSU1QT1JUQU5DRV9VTktOT1dOICYmIG1Ub3BVaWRTdGF0ZSA9PSBnZXRQcm9jU3RhdGVfbCh1aWQpOworfQorCitzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IFRyYW5zY29kaW5nVWlkUG9saWN5OjpnZXRUb3BVaWRzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisKKyAgICBpZiAobVRvcFVpZFN0YXRlID09IElNUE9SVEFOQ0VfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PigpOworICAgIH0KKworICAgIHJldHVybiBtU3RhdGVVaWRNYXAuYXQobVRvcFVpZFN0YXRlKTsKK30KKwordm9pZCBUcmFuc2NvZGluZ1VpZFBvbGljeTo6b25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSkgeworICAgIEFMT0dWKCJvblVpZFN0YXRlQ2hhbmdlZDogdWlkICV1LCBwcm9jU3RhdGUgJWQiLCB1aWQsIHByb2NTdGF0ZSk7CisKKyAgICBib29sIHRvcFVpZFNldENoYW5nZWQgPSBmYWxzZTsKKyAgICBib29sIGlzVWlkR29uZSA9IGZhbHNlOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gdG9wVWlkczsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgICAgIGF1dG8gaXQgPSBtVWlkU3RhdGVNYXAuZmluZCh1aWQpOworICAgICAgICBpZiAoaXQgIT0gbVVpZFN0YXRlTWFwLmVuZCgpICYmIGl0LT5zZWNvbmQgIT0gcHJvY1N0YXRlKSB7CisgICAgICAgICAgICBpc1VpZEdvbmUgPSAocHJvY1N0YXRlID09IEFBQ1RJVklUWU1BTkFHRVJfSU1QT1JUQU5DRV9HT05FKTsKKworICAgICAgICAgICAgdG9wVWlkcyA9IG1TdGF0ZVVpZE1hcFttVG9wVWlkU3RhdGVdOworCisgICAgICAgICAgICAvLyBNb3ZlIHVpZCB0byB0aGUgbmV3IHByb2NTdGF0ZS4KKyAgICAgICAgICAgIG1TdGF0ZVVpZE1hcFtpdC0+c2Vjb25kXS5lcmFzZSh1aWQpOworICAgICAgICAgICAgbVN0YXRlVWlkTWFwW3Byb2NTdGF0ZV0uaW5zZXJ0KHVpZCk7CisgICAgICAgICAgICBpdC0+c2Vjb25kID0gcHJvY1N0YXRlOworCisgICAgICAgICAgICB1cGRhdGVUb3BVaWRfbCgpOworICAgICAgICAgICAgaWYgKHRvcFVpZHMgIT0gbVN0YXRlVWlkTWFwW21Ub3BVaWRTdGF0ZV0pIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgdWlkIHNldCBmb3IgY2FsbGJhY2suCisgICAgICAgICAgICAgICAgdG9wVWlkcyA9IG1TdGF0ZVVpZE1hcFttVG9wVWlkU3RhdGVdOworICAgICAgICAgICAgICAgIHRvcFVpZFNldENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInRvcFVpZFNldENoYW5nZWQ6ICVkLCBpc1VpZEdvbmUgJWQiLCB0b3BVaWRTZXRDaGFuZ2VkLCBpc1VpZEdvbmUpOworCisgICAgaWYgKHRvcFVpZFNldENoYW5nZWQpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9IG1VaWRQb2xpY3lDYWxsYmFjay5sb2NrKCk7CisgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjYWxsYmFjay0+b25Ub3BVaWRzQ2hhbmdlZCh0b3BVaWRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXNVaWRHb25lKSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtVWlkUG9saWN5Q2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uVWlkR29uZSh1aWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFRyYW5zY29kaW5nVWlkUG9saWN5Ojp1cGRhdGVUb3BVaWRfbCgpIHsKKyAgICBtVG9wVWlkU3RhdGUgPSBJTVBPUlRBTkNFX1VOS05PV047CisKKyAgICAvLyBGaW5kIHRoZSBsb3dlc3QgdWlkIHN0YXRlIChpZ25vcmluZyBQUk9DRVNTX1NUQVRFX1VOS05PV04pIHdpdGggc29tZSBtb25pdG9yZWQgdWlkcy4KKyAgICBmb3IgKGF1dG8gc3RhdGVJdCA9IG1TdGF0ZVVpZE1hcC5iZWdpbigpOyBzdGF0ZUl0ICE9IG1TdGF0ZVVpZE1hcC5lbmQoKTsgc3RhdGVJdCsrKSB7CisgICAgICAgIGlmIChzdGF0ZUl0LT5maXJzdCAhPSBJTVBPUlRBTkNFX1VOS05PV04gJiYgIXN0YXRlSXQtPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtVG9wVWlkU3RhdGUgPSBzdGF0ZUl0LT5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzOiB0b3AgdWlkIHN0YXRlIGlzICVkIiwgX19GVU5DVElPTl9fLCBtVG9wVWlkU3RhdGUpOworfQorCitpbnQzMl90IFRyYW5zY29kaW5nVWlkUG9saWN5OjpnZXRQcm9jU3RhdGVfbCh1aWRfdCB1aWQpIHsKKyAgICBhdXRvIGl0ID0gbVVpZFN0YXRlTWFwLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbVVpZFN0YXRlTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gSU1QT1JUQU5DRV9VTktOT1dOOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbAppbmRleCAwN2I2YzFhLi5hZDIzNThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuYWlkbApAQCAtMTYsOSArMTYsMTAgQEAKIAogcGFja2FnZSBhbmRyb2lkLm1lZGlhOwogCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ0pvYlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklUcmFuc2NvZGluZ0NsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuSVRyYW5zY29kaW5nU2VydmljZUNsaWVudDsKIAogLyoqCiAgKiBCaW5kZXIgaW50ZXJmYWNlIGZvciBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KQEAgLTQ4LDY0ICs0OSwyNSBAQAogICAgIC8qKgogICAgICAqIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCiAgICAgICoKLSAgICAgKiBDbGllbnQgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIHNlcnZpY2UgaW4gb3JkZXIgdG8gcGVyZm9ybQotICAgICAqIHRyYW5zY29kaW5nLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgdW5pcXVlIHBvc2l0aXZlIElkIGFzc2lnbmVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIENsaWVudCBzaG91bGQgc2F2ZSB0aGlzIElkIGFuZCB1c2UgaXQgZm9yIGFsbCB0aGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgc2VydmljZS4KKyAgICAgKiBDbGllbnQgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgaXRzZWxmIHdpdGggdGhlIHNlcnZpY2UgaW4KKyAgICAgKiBvcmRlciB0byBwZXJmb3JtIHRyYW5zY29kaW5nIHRhc2tzLiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuCisgICAgICogSVRyYW5zY29kaW5nQ2xpZW50IGludGVyZmFjZSBvYmplY3QuIFRoZSBjbGllbnQgc2hvdWxkIHNhdmUgYW5kIHVzZSBpdAorICAgICAqIGZvciBhbGwgZnV0dXJlIHRyYW5zYWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLgogICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB0byBjYWxsIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGNhbGxiYWNrIGNsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB0byBjYWxsCisgICAgICogICAgICAgIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGNsaWVudE5hbWUgbmFtZSBvZiB0aGUgY2xpZW50LgogICAgICAqIEBwYXJhbSBvcFBhY2thZ2VOYW1lIG9wIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSBjbGllbnRVaWQgdXNlciBpZCBvZiB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSBjbGllbnRQaWQgcHJvY2VzcyBpZCBvZiB0aGUgY2xpZW50LgotICAgICAqIEByZXR1cm4gYSB1bmlxdWUgcG9zaXRpdmUgSWQgYXNzaWduZWQgdG8gdGhlIGNsaWVudCBieSB0aGUgc2VydmljZSwgLTEgIG1lYW5zIGZhaWxlZCB0bwotICAgICAqIHJlZ2lzdGVyLgorICAgICAqIEByZXR1cm4gYW4gSVRyYW5zY29kaW5nQ2xpZW50IGludGVyZmFjZSBvYmplY3QsIHdpdGggbnVsbHB0ciBpbmRpY2F0aW5nCisgICAgICogICAgICAgICBmYWlsdXJlIHRvIHJlZ2lzdGVyLgogICAgICAqLwotICAgIGludCByZWdpc3RlckNsaWVudChpbiBJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW4gU3RyaW5nIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGluIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGluIGludCBjbGllbnRQaWQpOwotCi0gICAgLyoqCi0gICAgKiBVbnJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCi0gICAgKgotICAgICogQ2xpZW50IHdpbGwgbm90IGJlIGFibGUgdG8gcGVyZm9ybSBhbnkgbW9yZSB0cmFuc2NvZGluZyBhZnRlciB1bnJlZ2lzdGVyLgotICAgICoKLSAgICAqIEBwYXJhbSBjbGllbnRJZCBhc3NpZ25lZCBJZCBvZiB0aGUgY2xpZW50LgotICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBib29sZWFuIHVucmVnaXN0ZXJDbGllbnQoaW4gaW50IGNsaWVudElkKTsKKyAgICBJVHJhbnNjb2RpbmdDbGllbnQgcmVnaXN0ZXJDbGllbnQoCisgICAgICAgICAgICBpbiBJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgIGluIFN0cmluZyBjbGllbnROYW1lLAorICAgICAgICAgICAgaW4gU3RyaW5nIG9wUGFja2FnZU5hbWUpOwogCiAgICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2xpZW50cy4gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuCiAgICAgKi8KICAgICBpbnQgZ2V0TnVtT2ZDbGllbnRzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBTdWJtaXRzIGEgdHJhbnNjb2RpbmcgcmVxdWVzdCB0byBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGllbnRJZCBhc3NpZ25lZCBJZCBvZiB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSByZXF1ZXN0IGEgVHJhbnNjb2RpbmdSZXF1ZXN0IGNvbnRhaW5zIHRyYW5zY29kaW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgICogQHBhcmFtIGpvYihvdXRwdXQgdmFyaWFibGUpIGEgVHJhbnNjb2RpbmdKb2IgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAgKiBAcmV0dXJuIGEgdW5pcXVlIHBvc2l0aXZlIGpvYklkIGdlbmVyYXRlZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UsIC0xIG1lYW5zIGZhaWx1cmUuCi0gICAgICovCi0gICAgaW50IHN1Ym1pdFJlcXVlc3QoaW4gaW50IGNsaWVudElkLAotICAgICAgICAgICAgICAgICAgICAgIGluIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgIG91dCBUcmFuc2NvZGluZ0pvYlBhcmNlbCBqb2IpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhIHRyYW5zY29kaW5nIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjbGllbnRJZCBhc3NpZ25lZCBpZCBvZiB0aGUgY2xpZW50LgotICAgICAqIEBwYXJhbSBqb2JJZCBhIFRyYW5zY29kaW5nSm9iIGdlbmVyYXRlZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCi0gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgYm9vbGVhbiBjYW5jZWxKb2IoaW4gaW50IGNsaWVudElkLCBpbiBpbnQgam9iSWQpOwotCi0gICAgLyoqCi0gICAgICogUXVlcmllcyB0aGUgam9iIGRldGFpbCBhc3NvY2lhdGVkIHdpdGggYSBqb2JJZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBqb2JJZCBhIFRyYW5zY29kaW5nSm9iIGdlbmVyYXRlZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCi0gICAgICogQHBhcmFtIGpvYihvdXRwdXQgdmFyaWFibGUpIHRoZSBUcmFuc2NvZGluZ0pvYiBhc3NvY2lhdGVkIHdpdGggdGhlIGpvYklkLgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkcywgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIGJvb2xlYW4gZ2V0Sm9iV2l0aElkKGluIGludCBqb2JJZCwgb3V0IFRyYW5zY29kaW5nSm9iUGFyY2VsIGpvYik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnQuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZjkwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnQuYWlkbApAQCAtMCwwICsxLDg5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworCisvKioKKyAqIElUcmFuc2NvZGluZ0NsaWVudAorICoKKyAqIEludGVyZmFjZSBmb3IgYSBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHJhbnNjb2RpbmdDbGllbnQgeworICAgIC8qKgorICAgICAqIFN1Ym1pdHMgYSB0cmFuc2NvZGluZyByZXF1ZXN0IHRvIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgYSBUcmFuc2NvZGluZ1JlcXVlc3QgY29udGFpbnMgdHJhbnNjb2RpbmcgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbihvdXRwdXQgdmFyaWFibGUpIGEgVHJhbnNjb2RpbmdTZXNzaW9uIGdlbmVyYXRlZCBieSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gc3VibWl0UmVxdWVzdChpbiBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0IFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uKTsKKworICAgIC8qKgorICAgICAqIENhbmNlbHMgYSB0cmFuc2NvZGluZyBzZXNzaW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHNlc3Npb25JZCBhIFRyYW5zY29kaW5nU2Vzc2lvbiBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZWVkcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gY2FuY2VsU2Vzc2lvbihpbiBpbnQgc2Vzc2lvbklkKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgdGhlIHNlc3Npb24gZGV0YWlsIGFzc29jaWF0ZWQgd2l0aCBhIHNlc3Npb25JZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgYSBUcmFuc2NvZGluZ1Nlc3Npb24gZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAgKiBAcGFyYW0gc2Vzc2lvbihvdXRwdXQgdmFyaWFibGUpIHRoZSBUcmFuc2NvZGluZ1Nlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uSWQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRTZXNzaW9uV2l0aElkKGluIGludCBzZXNzaW9uSWQsIG91dCBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYWRkaXRpb25hbCBjbGllbnQgdWlkIHJlcXVlc3RpbmcgYSBzZXNzaW9uLgorICAgICAqCisgICAgICogQHNlc3Npb25JZCB0aGUgc2Vzc2lvbiBpZCB0byB3aGljaCB0byBhZGQgdGhlIGFkZGl0aW9uYWwgY2xpZW50IHVpZC4KKyAgICAgKiBAY2xpZW50VWlkIHRoZSBhZGRpdGlvbmFsIGNsaWVudCB1aWQgdG8gYmUgYWRkZWQuCisgICAgICogQHJldHVybiBmYWxzZSBpZiB0aGUgc2Vzc2lvbiBkb2Vzbid0IGV4aXN0IG9yIHRoZSBjbGllbnQgaXMgYWxyZWFkeSByZXF1ZXN0aW5nIHRoZQorICAgICAqIHNlc3Npb24sIHRydWUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gYWRkQ2xpZW50VWlkKGluIGludCBzZXNzaW9uSWQsIGludCBjbGllbnRVaWQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSAodW5zb3J0ZWQpIGxpc3Qgb2YgYWxsIGNsaWVudHMgcmVxdWVzdGluZyBhIHNlc3Npb24uCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgaWYgYSBzZXNzaW9uIHdhcyBzdWJtaXR0ZWQgd2l0aCBvZmZsaW5lIHByaW9yaXR5ICgKKyAgICAgKiBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a1Vuc3BlY2lmaWVkKSwgaXQgaW5pdGlhbGx5IHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgcmVxdWVzdGVkCisgICAgICogYnkgYW55IHBhcnRpY3VsYXIgY2xpZW50LCBiZWNhdXNlIHRoZSBjbGllbnQgY291bGQgZ28gYXdheSBhbnkgdGltZSBhZnRlciB0aGUgc3VibWlzc2lvbi4KKyAgICAgKiBIb3dldmVyLCBhZGRpdGlvbmFsIHVpZHMgY291bGQgYmUgYWRkZWQgdmlhIGFkZENsaWVudFVpZCgpIGFmdGVyIHRoZSBzdWJtaXNzaW9uLCB3aGljaAorICAgICAqIGVzc2VudGlhbGx5IG1ha2UgdGhlIHJlcXVlc3QgYSByZWFsLXRpbWUgcmVxdWVzdCBpbnN0ZWFkIG9mIGFuIG9mZmxpbmUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBzZXNzaW9uSWQgdGhlIHNlc3Npb24gaWQgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjbGllbnQgdWlkIGxpc3QuCisgICAgICogQGNsaWVudFVpZHMgYXJyYXkgdG8gaG9sZCB0aGUgcmV0cmlldmVkIGNsaWVudCB1aWQgbGlzdC4KKyAgICAgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QsIHRydWUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBudWxsYWJsZQorICAgIGludFtdIGdldENsaWVudFVpZHMoaW4gaW50IHNlc3Npb25JZCk7CisKKyAgICAvKioKKyAgICAqIFVucmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAqCisgICAgKiBDbGllbnQgd2lsbCBub3QgYmUgYWJsZSB0byBwZXJmb3JtIGFueSBtb3JlIHRyYW5zY29kaW5nIGFmdGVyIHVucmVnaXN0ZXIuCisgICAgKi8KKyAgICB2b2lkIHVucmVnaXN0ZXIoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDliNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMTA3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdFcnJvckNvZGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbEZpbGVEZXNjcmlwdG9yOworCisvKioKKyAqIElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrCisgKgorICogSW50ZXJmYWNlIGZvciB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2xpZW50LgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrIHsKKyAgICAvKioKKyAgICAqIENhbGxlZCB0byBvcGVuIGEgcmF3IGZpbGUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZGF0YSB1bmRlciBhIFVSSQorICAgICoKKyAgICAqIEBwYXJhbSBmaWxlVXJpIFRoZSBwYXRoIG9mIHRoZSBmaWxlbmFtZS4KKyAgICAqIEBwYXJhbSBtb2RlIFRoZSBmaWxlIG1vZGUgdG8gdXNlLiBNdXN0IGJlIG9uZSBvZiAoInIsICJ3IiwgInJ3IikKKyAgICAqIEByZXR1cm4gUGFyY2VsRmlsZURlc2NyaXB0b3IgaWYgb3BlbiB0aGUgZmlsZSBzdWNjZXNzZnVsbHksIG51bGwgb3RoZXJ3aXNlLgorICAgICovCisgICAgUGFyY2VsRmlsZURlc2NyaXB0b3Igb3BlbkZpbGVEZXNjcmlwdG9yKGluIEB1dGY4SW5DcHAgU3RyaW5nIGZpbGVVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIEB1dGY4SW5DcHAgU3RyaW5nIG1vZGUpOworCisgICAgLyoqCisgICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXNzaW9uSWQgZmluaXNoZWQuCisgICAgKiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY2xpZW50IHJlcXVlc3QgdG8gZ2V0IGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICovCisgICAgb25ld2F5IHZvaWQgb25UcmFuc2NvZGluZ1N0YXJ0ZWQoaW4gaW50IHNlc3Npb25JZCk7CisKKyAgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb25JZCBpcyBwYXVzZWQuCisgICAgKiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY2xpZW50IHJlcXVlc3QgdG8gZ2V0IGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICovCisgICAgb25ld2F5IHZvaWQgb25UcmFuc2NvZGluZ1BhdXNlZChpbiBpbnQgc2Vzc2lvbklkKTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbklkIGlzIHJlc3VtZWQuCisgICAgKiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgY2xpZW50IHJlcXVlc3QgdG8gZ2V0IGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICovCisgICAgb25ld2F5IHZvaWQgb25UcmFuc2NvZGluZ1Jlc3VtZWQoaW4gaW50IHNlc3Npb25JZCk7CisKKyAgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIHNlc3Npb25JZCBmaW5pc2hlZC4KKyAgICAqCisgICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb25JZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KKyAgICAqIEBwYXJhbSByZXN1bHQgY29udGFpbnMgdGhlIHRyYW5zY29kZWQgZmlsZSBzdGF0cyBhbmQgb3RoZXIgdHJhbnNjb2RpbmcgbWV0cmljcyBpZiByZXF1ZXN0ZWQuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nRmluaXNoZWQoaW4gaW50IHNlc3Npb25JZCwgaW4gVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwgcmVzdWx0KTsKKworICAgIC8qKgorICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbklkIGZhaWxlZC4KKyAgICAqCisgICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb25JZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KKyAgICAqIEBwYXJhbSBlcnJvckNvZGUgZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXJyb3IuCisgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nRmFpbGVkKGluIGludCBzZXNzaW9uSWQsIGluIFRyYW5zY29kaW5nRXJyb3JDb2RlIGVycm9yQ29kZSk7CisKKyAgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGluZyBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2Vzc2lvbklkIGdldHMgdXBkYXRlZCwgaS5lLiB3YWl0CisgICAgKiBudW1iZXIgaW4gdGhlIHNlc3Npb24gcXVldWUuCisgICAgKgorICAgICogPHA+IFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjbGllbnQgc2V0IHJlcXVlc3RVcGRhdGUgdG8gYmUgdHJ1ZSBpbiB0aGUgVHJhbnNjb2RpbmdSZXF1ZXN0CisgICAgKiBzdWJtaXR0ZWQgdG8gdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorICAgICoKKyAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgorICAgICogQHBhcmFtIG9sZEF3YWl0TnVtYmVyIHByZXZpb3VzIG51bWJlciBvZiBzZXNzaW9ucyBhaGVhZCBvZiBjdXJyZW50IHNlc3Npb24uCisgICAgKiBAcGFyYW0gbmV3QXdhaXROdW1iZXIgdXBkYXRlZCBudW1iZXIgb2Ygc2Vzc2lvbnMgYWhlYWQgb2YgY3VycmVudCBzZXNzaW9uLgorICAgICovCisgICAgb25ld2F5IHZvaWQgb25Bd2FpdE51bWJlck9mU2Vzc2lvbnNDaGFuZ2VkKGluIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW50IG9sZEF3YWl0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBuZXdBd2FpdE51bWJlcik7CisKKyAgICAvKioKKyAgICAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGFuIHVwZGF0ZSBvbiB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIFRyYW5zY29kaW5nU2Vzc2lvbi4KKyAgICAqCisgICAgKiA8cD4gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNsaWVudCBzZXQgcmVxdWVzdFVwZGF0ZSB0byBiZSB0cnVlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QKKyAgICAqIHN1Ym1pdHRlZCB0byB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCisgICAgKgorICAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCisgICAgKiBAcGFyYW0gcHJvZ3Jlc3MgYW4gaW50ZWdlciBudW1iZXIgcmFuZ2luZyBmcm9tIDAgfiAxMDAgaW5jbHVzaXZlLgorICAgICovCisgICAgb25ld2F5IHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShpbiBpbnQgc2Vzc2lvbklkLCBpbiBpbnQgcHJvZ3Jlc3MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nU2VydmljZUNsaWVudC5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nU2VydmljZUNsaWVudC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjNjODMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKgotICogQ29weXJpZ2h0IChjKSAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ0Vycm9yQ29kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nSm9iUGFyY2VsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWw7Ci0KLS8qKgotICogSVRyYW5zY29kaW5nU2VydmljZUNsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBNZWRpYVRyYW5zY29kaW5nZXJ2aWNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlCi0gKiBjbGllbnQuCi0gKgotICoge0BoaWRlfQotICovCi0vL1RPRE8oaGt1YW5nKTogSW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuCi1pbnRlcmZhY2UgSVRyYW5zY29kaW5nU2VydmljZUNsaWVudCB7Ci0gICAgLyoqCi0gICAgICogUmV0cmlldmVzIHRoZSBuYW1lIG9mIHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgZ2V0TmFtZSgpOwotCi0gICAgLyoqCi0gICAgKiBDYWxsZWQgd2hlbiB0aGUgdHJhbnNjb2RpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JJZCBmaW5pc2hlZC4KLSAgICAqCi0gICAgKiBAcGFyYW0gam9iSWQgam9iSWQgYXNzaWduZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIHJlcXVlc3QuCi0gICAgKiBAcGFyYW0gcmVzdWx0IGNvbnRhaW5zIHRoZSB0cmFuc2NvZGVkIGZpbGUgc3RhdHMgYW5kIG90aGVyIHRyYW5zY29kaW5nIG1ldHJpY3MgaWYgcmVxdWVzdGVkLgotICAgICovCi0gICAgb25ld2F5IHZvaWQgb25UcmFuc2NvZGluZ0ZpbmlzaGVkKGluIGludCBqb2JJZCwgaW4gVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwgcmVzdWx0KTsKLQotICAgIC8qKgotICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgam9iSWQgZmFpbGVkLgotICAgICoKLSAgICAqIEBwYXJhbSBqb2JJZCBqb2JJZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KLSAgICAqIEBwYXJhbSBlcnJvckNvZGUgZXJyb3IgY29kZSB0aGF0IGluZGljYXRlcyB0aGUgZXJyb3IuCi0gICAgKi8KLSAgICBvbmV3YXkgdm9pZCBvblRyYW5zY29kaW5nRmFpbGVkKGluIGludCBqb2JJZCwgaW4gVHJhbnNjb2RpbmdFcnJvckNvZGUgZXJyb3JDb2RlKTsKLQotICAgIC8qKgotICAgICogQ2FsbGVkIHdoZW4gdGhlIHRyYW5zY29kaW5nIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBqb2JJZCBnZXRzIHVwZGF0ZWQsIGkuZS4gd2FpdAotICAgICogbnVtYmVyIGluIHRoZSBqb2IgcXVldWUuCi0gICAgKgotICAgICogPHA+IFRoaXMgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBjbGllbnQgc2V0IHJlcXVlc3RVcGRhdGUgdG8gYmUgdHJ1ZSBpbiB0aGUgVHJhbnNjb2RpbmdSZXF1ZXN0Ci0gICAgKiBzdWJtaXR0ZWQgdG8gdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgotICAgICoKLSAgICAqIEBwYXJhbSBqb2JJZCBqb2JJZCBhc3NpZ25lZCBieSB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdXBvbiByZWNlaXZpbmcgcmVxdWVzdC4KLSAgICAqIEBwYXJhbSBvbGRBd2FpdE51bWJlciBwcmV2aW91cyBudW1iZXIgb2Ygam9icyBhaGVhZCBvZiBjdXJyZW50IGpvYi4KLSAgICAqIEBwYXJhbSBuZXdBd2FpdE51bWJlciB1cGRhdGVkIG51bWJlciBvZiBqb2JzIGFoZWFkIG9mIGN1cnJlbnQgam9iLgotICAgICovCi0gICAgb25ld2F5IHZvaWQgb25Bd2FpdE51bWJlck9mSm9ic0NoYW5nZWQoaW4gaW50IGpvYklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGludCBvbGRBd2FpdE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBpbnQgbmV3QXdhaXROdW1iZXIpOwotCi0gICAgLyoqCi0gICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiB1cGRhdGUgb24gdGhlIHByb2dyZXNzIG9mIHRoZSBUcmFuc2NvZGluZ0pvYi4KLSAgICAqCi0gICAgKiA8cD4gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGNsaWVudCBzZXQgcmVxdWVzdFVwZGF0ZSB0byBiZSB0cnVlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QKLSAgICAqIHN1Ym1pdHRlZCB0byB0aGUgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCi0gICAgKgotICAgICogQHBhcmFtIGpvYklkIGpvYklkIGFzc2lnbmVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyByZXF1ZXN0LgotICAgICogQHBhcmFtIHByb2dyZXNzIGFuIGludGVnZXIgbnVtYmVyIHJhbmdpbmcgZnJvbSAwIH4gMTAwIGluY2x1c2l2ZS4KLSAgICAqLwotICAgIG9uZXdheSB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoaW4gaW50IGpvYklkLCBpbiBpbnQgcHJvZ3Jlc3MpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdFcnJvckNvZGUuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nRXJyb3JDb2RlLmFpZGwKaW5kZXggN2Y0N2ZkYy4uZmRkODZjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdFcnJvckNvZGUuYWlkbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5haWRsCkBAIC0yMywxMSArMjMsMjAgQEAKICAqLwogQEJhY2tpbmcodHlwZSA9ICJpbnQiKQogZW51bSBUcmFuc2NvZGluZ0Vycm9yQ29kZSB7Ci0gICAga1Vua25vd24gPSAwLAotICAgIGtVbnN1cHBvcnRlZCA9IDEsCi0gICAga0RlY29kZXJFcnJvciA9IDIsCi0gICAga0VuY29kZXJFcnJvciA9IDMsCi0gICAga0V4dHJhY3RvckVycm9yID0gNCwKLSAgICBrTXV4ZXJFcnJvciA9IDUsCi0gICAga0ludmFsaWRCaXRzdHJlYW0gPSA2CisgICAgLy8gRXJyb3JzIGV4cG9zZWQgdG8gY2xpZW50IHNpZGUuCisgICAga05vRXJyb3IgPSAwLAorICAgIGtEcm9wcGVkQnlTZXJ2aWNlID0gMSwKKyAgICBrU2VydmljZVVuYXZhaWxhYmxlID0gMiwKKworICAgIC8vIE90aGVyIHByaXZhdGUgZXJyb3JzLgorICAgIGtQcml2YXRlRXJyb3JGaXJzdCAgICAgPSAxMDAwLAorICAgIGtVbmtub3duICAgICAgICAgICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyAwLAorICAgIGtNYWxmb3JtZWQgICAgICAgICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyAxLAorICAgIGtVbnN1cHBvcnRlZCAgICAgICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyAyLAorICAgIGtJbnZhbGlkUGFyYW1ldGVyICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyAzLAorICAgIGtJbnZhbGlkT3BlcmF0aW9uICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyA0LAorICAgIGtFcnJvcklPICAgICAgICAgICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyA1LAorICAgIGtJbnN1ZmZpY2llbnRSZXNvdXJjZXMgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyA2LAorICAgIGtXYXRjaGRvZ1RpbWVvdXQgICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyA3LAorICAgIGtVaWRHb25lQ2FuY2VsbGVkICAgICAgPSBrUHJpdmF0ZUVycm9yRmlyc3QgKyA4LAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUGFyY2VsLmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0pvYlBhcmNlbC5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTEyYzM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUGFyY2VsLmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7Ci0KLS8qKgotICogVHJhbnNjb2RpbmdKb2IgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1cG9uIHJlY2VpdmluZyBhIFRyYW5zY29kaW5nUmVxdWVzdC4KLSAqIEl0IGNvbnRhaW5zIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBmb3IgdGhlCi0gKiBUcmFuc2NvZGluZ1JlcXVlc3QuCi0gKgotICoge0BoaWRlfQotICovCi0vL1RPRE8oaGt1YW5nKTogSW1wbGVtZW50IHRoZSBwYXJjZWxhYmxlLgotcGFyY2VsYWJsZSBUcmFuc2NvZGluZ0pvYlBhcmNlbCB7Ci0gICAgLyoqCi0gICAgICogQSB1bmlxdWUgcG9zaXRpdmUgSWQgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KLSAgICAgKi8KLSAgICBpbnQgam9iSWQ7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggdGhlIFRyYW5zY29kaW5nSm9iLgotICAgICAqLwotICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgKiBDdXJyZW50IG51bWJlciBvZiBqb2JzIGFoZWFkIG9mIHRoaXMgam9iLiBUaGUgc2VydmljZSBzY2hlZHVsZXMgdGhlIGpvYiBiYXNlZCBvbiB0aGUgcHJpb3JpdHkKLSAgICAqIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuIENsaWVudCBjb3VsZCBzcGVjaWZ5IHdoZXRoZXIgdG8gcmVjZWl2ZSB1cGRhdGVzIHdoZW4gdGhlCi0gICAgKiBhd2FpdE51bWJlck9mSm9icyBjaGFuZ2VzIHRocm91Z2ggc2V0dGluZyByZXF1ZXN0UHJvZ3Jlc3NVcGRhdGUgaW4gdGhlIFRyYW5zY29kaW5nUmVxdWVzdC4KLSAgICAqLwotICAgIGludCBhd2FpdE51bWJlck9mSm9iczsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUHJpb3JpdHkuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nSm9iUHJpb3JpdHkuYWlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1ZDgxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0pvYlByaW9yaXR5LmFpZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLm1lZGlhOwotCi0vKioKLSAqIFByaW9yaXR5IG9mIGEgdHJhbnNjb2Rpbmcgam9iLgotICoKLSAqIHtAaGlkZX0KLSAqLwotQEJhY2tpbmcodHlwZT0iaW50IikKLWVudW0gVHJhbnNjb2RpbmdKb2JQcmlvcml0eSB7Ci0gICAgLy8gVE9ETyhoa3VhbmcpOiBkZWZpbmUgd2hhdCBlYWNoIHByaW9yaXR5IGxldmVsIGFjdHVhbGx5IG1lYW4uCi0gICAga1Vuc3BlY2lmaWVkID0gMCwKLSAgICBrTG93ID0gMSwKLSAgICAvKioKLSAgICAgKiAyIH4gMjAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gICAgICovCi0gICAga05vcm1hbCA9IDIxLAotICAgIC8qKgotICAgICAqIDIyIH4gMzAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gICAgICovCi0gICAga0hpZ2ggPSAzMSwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsCmluZGV4IDdiNzk4NmQuLjcxZjgyYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5haWRsCkBAIC0xNiw4ICsxNiwxMSBAQAogCiBwYWNrYWdlIGFuZHJvaWQubWVkaWE7CiAKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nSm9iUHJpb3JpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLlRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdUZXN0Q29uZmlnOwogaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0OwogCiAvKioKICAqIFRyYW5zY29kaW5nUmVxdWVzdCBjb250YWlucyB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uIGZvciB0aGUgdHJhbnNjb2RpbmcuCkBAIC0yNyw5ICszMCw0OCBAQAogLy9UT0RPKGhrdWFuZyk6IEltcGxlbWVudCB0aGUgcGFyY2VsYWJsZS4KIHBhcmNlbGFibGUgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHsKICAgICAvKioKLSAgICAgKiBOYW1lIG9mIGZpbGUgdG8gYmUgdHJhbnNjb2RlZC4KKyAgICAgKiBUaGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZS4KICAgICAgKi8KLSAgICBAdXRmOEluQ3BwIFN0cmluZyBmaWxlTmFtZTsKKyAgICBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VGaWxlUGF0aDsKKworICAgIC8qCisgICAgICogVGhlIGZpbGVkZXNjcnB0b3Igb2YgdGhlIHNvdXJjZUZpbGVQYXRoLiBJZiB0aGUgc291cmNlIEZkIGlzIHByb3ZpZGVkLCB0cmFuc2NvZGluZyBzZXJ2aWNlCisgICAgICogd2lsbCB1c2UgdGhpcyBmZCBpbnN0ZWFkIG9mIGNhbGxpbmcgYmFjayB0byBjbGllbnQgc2lkZSB0byBvcGVuIHRoZSBzb3VyY2VGaWxlUGF0aC4gSXQgaXMKKyAgICAgKiBjbGllbnQncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgc291cmNlRmQgaXMgb3BlbmVkIGZyb20gc291cmNlRmlsZVBhdGguCisgICAgICovCisgICAgQG51bGxhYmxlIFBhcmNlbEZpbGVEZXNjcmlwdG9yIHNvdXJjZUZkOworCisgICAgLyoqCisgICAgICogVGhlIGFic29sdXRlIGZpbGUgcGF0aCBvZiB0aGUgZGVzdGluYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICBAdXRmOEluQ3BwIFN0cmluZyBkZXN0aW5hdGlvbkZpbGVQYXRoOworCisgICAgLyoKKyAgICAgKiBUaGUgZmlsZWRlc2NycHRvciBvZiB0aGUgZGVzdGluYXRpb25GaWxlUGF0aC4gSWYgdGhlIGRlc3RpbmF0aW9uIEZkIGlzIHByb3ZpZGVkLCB0cmFuc2NvZGluZworICAgICAqIHNlcnZpY2Ugd2lsbCB1c2UgdGhpcyBmZCBpbnN0ZWFkIG9mIGNhbGxpbmcgYmFjayB0byBjbGllbnQgc2lkZSB0byBvcGVuIHRoZQorICAgICAqIGRlc3RpbmF0aW9uRmlsZVBhdGguIEl0IGlzIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSBkZXN0aW5hdGlvbkZkIGlzIG9wZW5lZAorICAgICAqIGZyb20gZGVzdGluYXRpb25GaWxlUGF0aC4KKyAgICAgKi8KKyAgICBAbnVsbGFibGUgUGFyY2VsRmlsZURlc2NyaXB0b3IgZGVzdGluYXRpb25GZDsKKworICAgIC8qKgorICAgICAqIFRoZSBVSUQgb2YgdGhlIGNsaWVudCB0aGF0IHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuIE9ubHkgcHJpdmlsZWdlZCBjYWxsZXIgY291bGQKKyAgICAgKiBzZXQgdGhpcyBVaWQgYXMgb25seSB0aGV5IGNvdWxkIGRvIHRoZSB0cmFuc2NvZGluZyBvbiBiZWhhbGYgb2YgdGhlIGNsaWVudC4KKyAgICAgKiAtMSBtZWFucyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBjbGllbnRVaWQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBQSUQgb2YgdGhlIGNsaWVudCB0aGF0IHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuIE9ubHkgcHJpdmlsZWdlZCBjYWxsZXIgY291bGQKKyAgICAgKiBzZXQgdGhpcyBVaWQgYXMgb25seSB0aGV5IGNvdWxkIGRvIHRoZSB0cmFuc2NvZGluZyBvbiBiZWhhbGYgb2YgdGhlIGNsaWVudC4KKyAgICAgKiAtMSBtZWFucyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBjbGllbnRQaWQgPSAtMTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGNsaWVudCB3aG9tIHRoaXMgdHJhbnNjb2RpbmcgcmVxdWVzdCBpcyBmb3IuCisgICAgICovCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgY2xpZW50UGFja2FnZU5hbWU7CiAKICAgICAvKioKICAgICAgKiBUeXBlIG9mIHRoZSB0cmFuc2NvZGluZy4KQEAgLTM3LDIyICs3OSw0NCBAQAogICAgIFRyYW5zY29kaW5nVHlwZSB0cmFuc2NvZGluZ1R5cGU7CiAKICAgICAvKioKLSAgICAgKiBJbnB1dCBzb3VyY2UgZmlsZSBkZXNjcmlwdG9yLgorICAgICAqIFJlcXVlc3RlZCB2aWRlbyB0cmFjayBmb3JtYXQgZm9yIHRoZSB0cmFuc2NvZGluZy4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2lsbCB0cnkgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdGVkIGZvcm1hdCBhcyBtdWNoIGFzCisgICAgICogcG9zc2JpbGUsIHdoaWxlIHN1YmplY3QgdG8gaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGxpbWl0YXRpb24uIFRoZSBmaW5hbCB2aWRlbyB0cmFjayBmb3JtYXQKKyAgICAgKiB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHdoZW4gdGhlIHNlc3Npb24gaXMgZmluaXNoZWQuCiAgICAgICovCi0gICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgaW5GZDsKLQotICAgIC8qKgotICAgICAqIE91dHB1dCB0cmFuc2NvZGVkIGZpbGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBQYXJjZWxGaWxlRGVzY3JpcHRvciBvdXRGZDsKKyAgICBAbnVsbGFibGUgVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0IHJlcXVlc3RlZFZpZGVvVHJhY2tGb3JtYXQ7CiAKICAgICAvKioKICAgICAgKiBQcmlvcml0eSBvZiB0aGlzIHRyYW5zY29kaW5nLiBTZXJ2aWNlIHdpbGwgc2NoZWR1bGUgdGhlIHRyYW5zY29kaW5nIGJhc2VkIG9uIHRoZSBwcmlvcml0eS4KICAgICAgKi8KLSAgICBUcmFuc2NvZGluZ0pvYlByaW9yaXR5IHByaW9yaXR5OworICAgIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5IHByaW9yaXR5OwogCiAgICAgLyoqCi0gICAgICogV2hldGhlciB0byByZWNlaXZlIHVwZGF0ZSBvbiBwcm9ncmVzcyBhbmQgY2hhbmdlIG9mIGF3YWl0TnVtSm9icy4KKyAgICAgKiBXaGV0aGVyIHRvIHJlY2VpdmUgdXBkYXRlIG9uIHByb2dyZXNzIGFuZCBjaGFuZ2Ugb2YgYXdhaXROdW1TZXNzaW9ucy4KKyAgICAgKiBEZWZhdWx0IHRvIGZhbHNlLgogICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWVzdFVwZGF0ZTsKKyAgICBib29sZWFuIHJlcXVlc3RQcm9ncmVzc1VwZGF0ZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byByZWNlaXZlIHVwZGF0ZSBvbiBzZXNzaW9uJ3Mgc3RhcnQvc3RvcC9wYXVzZS9yZXN1bWUuCisgICAgICogRGVmYXVsdCB0byBmYWxzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHJlcXVlc3RTZXNzaW9uRXZlbnRVcGRhdGUgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IGlzIGZvciB0ZXN0aW5nLgorICAgICAqLworICAgIGJvb2xlYW4gaXNGb3JUZXN0aW5nID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbmZpZ3VyYXRpb24uIFRoaXMgd2lsbCBiZSBhdmFpbGFibGUgb25seSB3aGVuIGlzRm9yVGVzdGluZyBpcyBzZXQgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBAbnVsbGFibGUgVHJhbnNjb2RpbmdUZXN0Q29uZmlnIHRlc3RDb25maWc7CisKKyAgICAgLyoqCisgICAgICAqIFdoZXRoZXIgdG8gZ2V0IHRoZSBzdGF0cyBvZiB0aGUgdHJhbnNjb2RpbmcuCisgICAgICAqIElmIHRoaXMgaXMgZW5hYmxlZCwgdGhlIFRyYW5zY29kaW5nU2Vzc2lvblN0YXRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwKKyAgICAgICogdXBvbiB0cmFuc2NvZGluZyBmaW5pc2hlcy4KKyAgICAgICovCisgICAgYm9vbGVhbiBlbmFibGVTdGF0cyA9IGZhbHNlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVzdWx0UGFyY2VsLmFpZGwKaW5kZXggNjVjNDllNy4uNzgyNmUyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwuYWlkbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbC5haWRsCkBAIC0xNiw2ICsxNiw4IEBACiAKIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKIAoraW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHM7CisKIC8qKgogICogUmVzdWx0IG9mIHRoZSB0cmFuc2NvZGluZy4KICAqCkBAIC0yNCw5ICsyNiw5IEBACiAvL1RPRE8oaGt1YW5nKTogSW1wbGVtZW50IHRoZSBwYXJjZWxhYmxlLgogcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbCB7CiAgICAgLyoqCi0gICAgICogVGhlIGpvYklkIGFzc29jaWF0ZWQgd2l0aCB0aGUgVHJhbnNjb2RpbmdSZXN1bHQuCisgICAgICogVGhlIHNlc3Npb25JZCBhc3NvY2lhdGVkIHdpdGggdGhlIFRyYW5zY29kaW5nUmVzdWx0LgogICAgICAqLwotICAgIGludCBqb2JJZDsKKyAgICBpbnQgc2Vzc2lvbklkOwogCiAgICAgLyoqCiAgICAgICogQWN0dWFsIGJpdHJhdGUgb2YgdGhlIHRyYW5zY29kZWQgdmlkZW8gaW4gYml0cyBwZXIgc2Vjb25kLiBUaGlzIHdpbGwgb25seSBwcmVzZW50IGZvciB2aWRlbwpAQCAtMzQsNSArMzYsOSBAQAogICAgICAqLwogICAgIGludCBhY3R1YWxCaXRyYXRlQnBzOwogCi0gICAgLy8gVE9ETyhoa3VhbmcpOiBBZGQgbW9yZSBmaWVsZHMuCisgICAgLyoqCisgICAgICogU3RhdHMgb2YgdGhlIHRyYW5zY29kaW5nIHNlc3Npb24uIFRoaXMgd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSB3aGVuIGNsaWVudCByZXF1ZXN0cyB0byBnZXQgdGhlCisgICAgICogc3RhdHMgaW4gVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLgorICAgICAqLworICAgIEBudWxsYWJsZSBUcmFuc2NvZGluZ1Nlc3Npb25TdGF0cyBzZXNzaW9uU3RhdHM7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmFpZGwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRhNTAwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsLmFpZGwKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworaW1wb3J0IGFuZHJvaWQubWVkaWEuVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0OworCisvKioKKyAqIFRyYW5zY29kaW5nU2Vzc2lvbiBpcyBnZW5lcmF0ZWQgYnkgdGhlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVwb24gcmVjZWl2aW5nIGEKKyAqIFRyYW5zY29kaW5nUmVxdWVzdC4gSXQgY29udGFpbnMgYWxsIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgYnkgdGhlCisgKiBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBmb3IgdGhlIFRyYW5zY29kaW5nUmVxdWVzdC4KKyAqCisgKiB7QGhpZGV9CisgKi8KKy8vVE9ETyhoa3VhbmcpOiBJbXBsZW1lbnQgdGhlIHBhcmNlbGFibGUuCitwYXJjZWxhYmxlIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCB7CisgICAgLyoqCisgICAgICogQSB1bmlxdWUgcG9zaXRpdmUgSWQgZ2VuZXJhdGVkIGJ5IHRoZSBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKyAgICAgKi8KKyAgICBpbnQgc2Vzc2lvbklkOworCisgICAgLyoqCisgICAgICogVGhlIHJlcXVlc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBUcmFuc2NvZGluZ1Nlc3Npb24uCisgICAgICovCisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdmlkZW8gdHJhY2sncyBmb3JtYXQuIFRoaXMgd2lsbCBvbmx5IGJlIGF2YWlhYmxlIGZvciB2aWRlbyB0cmFuc2NvZGluZyBhbmQgaXQgd2lsbAorICAgICAqIGJlIGF2YWlhYmxlIHdoZW4gdGhlIHNlc3Npb24gaXMgZmluaXNoZWQuCisgICAgICovCisgICAgQG51bGxhYmxlIFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCB2aWRlb1RyYWNrRm9ybWF0OworCisgICAgLyoqCisgICAgKiBDdXJyZW50IG51bWJlciBvZiBzZXNzaW9ucyBhaGVhZCBvZiB0aGlzIHNlc3Npb24uIFRoZSBzZXJ2aWNlIHNjaGVkdWxlcyB0aGUgc2Vzc2lvbiBiYXNlZCBvbgorICAgICogdGhlIHByaW9yaXR5IHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuIENsaWVudCBjb3VsZCBzcGVjaWZ5IHdoZXRoZXIgdG8gcmVjZWl2ZSB1cGRhdGVzIHdoZW4gdGhlCisgICAgKiBhd2FpdE51bWJlck9mU2Vzc2lvbnMgY2hhbmdlcyB0aHJvdWdoIHNldHRpbmcgcmVxdWVzdFByb2dyZXNzVXBkYXRlIGluIHRoZSBUcmFuc2NvZGluZ1JlcXVlc3QuCisgICAgKi8KKyAgICBpbnQgYXdhaXROdW1iZXJPZlNlc3Npb25zOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwMTQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5LmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworLyoqCisgKiBQcmlvcml0eSBvZiBhIHRyYW5zY29kaW5nIHNlc3Npb24uCisgKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eSB7CisgICAgLy8gVE9ETyhoa3VhbmcpOiBkZWZpbmUgd2hhdCBlYWNoIHByaW9yaXR5IGxldmVsIGFjdHVhbGx5IG1lYW4uCisgICAga1Vuc3BlY2lmaWVkID0gMCwKKyAgICBrTG93ID0gMSwKKyAgICAvKioKKyAgICAgKiAyIH4gMjAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgICovCisgICAga05vcm1hbCA9IDIxLAorICAgIC8qKgorICAgICAqIDIyIH4gMzAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgICAgICovCisgICAga0hpZ2ggPSAzMSwKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25TdGF0cy5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U3ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uU3RhdHMuYWlkbApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFRyYW5zY29kaW5nU2Vzc2lvblN0YXRzIGVuY2Fwc3VsYXRlZCB0aGUgc3RhdHMgb2YgdGhlIGEgVHJhbnNjb2RpbmdTZXNzaW9uLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1Nlc3Npb25TdGF0cyB7CisgICAgLyoqCisgICAgICogU3lzdGVtIHRpbWUgb2Ygd2hlbiB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgorICAgICAqLworICAgIGxvbmcgc2Vzc2lvbkNyZWF0ZWRUaW1lVXM7CisKKyAgICAvKioKKyAgICAgKiBTeXN0ZW0gdGltZSBvZiB3aGVuIHRoZSBzZXNzaW9uIGlzIGZpbmlzaGVkLgorICAgICAqLworICAgIGxvbmcgc2Vzc2lvbkZpbmlzaGVkVGltZVVzOworCisgICAgLyoqCisgICAgICogVG90YWwgdGltZSBzcGVuZCBvbiB0cmFuc2NvZGluZywgZXhjbHVkZSB0aGUgdGltZSBpbiBwYXVzZS4KKyAgICAgKi8KKyAgICBsb25nIHRvdGFsUHJvY2Vzc2luZ1RpbWVVczsKKworICAgIC8qKgorICAgICAqIFRvdGFsIHRpbWUgc3BlbmQgb24gaGFuZGxpbmcgdGhlIHNlc3Npb24sIGluY2x1ZGUgdGhlIHRpbWUgaW4gcGF1c2UuCisgICAgICogVGhlIHRvdGFsdGltZVVzIGlzIGFjdHVhbGx5IHRoZSBzYW1lIGFzIHNlc3Npb25GaW5pc2hlZFRpbWVVcyAtIHNlc3Npb25DcmVhdGVkVGltZVVzLgorICAgICAqLworICAgIGxvbmcgdG90YWxUaW1lVXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Rlc3RDb25maWcuYWlkbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVGVzdENvbmZpZy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mjc5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2FpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Rlc3RDb25maWcuYWlkbApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIHBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworIC8qKgorICAqIFRyYW5zY29kaW5nVGVzdENvbmZpZyBjb250YWlucyB0aGUgdGVzdCBjb25maWd1cmVhdGlvbiB1c2VkIGluIHRlc3RpbmcuCisgICoKKyAgKiB7QGhpZGV9CisgICovCitwYXJjZWxhYmxlIFRyYW5zY29kaW5nVGVzdENvbmZpZyB7CisgICAgLyoqCisgICAgICogUGFzc3Rocm91Z2ggbW9kZSB1c2VkIGZvciB0ZXN0aW5nLiBUaGUgdHJhbnNjb2Rpbmcgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGVzdGluYXRpb24KKyAgICAgKiBwYXRoIGFscmVhZHkgY29udGFpbnMgdGhlIHRyYW5zY29kaW5nIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgcmV0dXJuIGl0IHRvIGNsaWVudCBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBib29sZWFuIHBhc3NUaHJvdWdoTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGltZSBvZiBwcm9jZXNzaW5nIHRoZSBzZXNzaW9uIGluIG1pbGxpc2Vjb25kcy4gU2VydmljZSB3aWxsIHJldHVybiB0aGUgc2Vzc2lvbiByZXN1bHQgYXQKKyAgICAgKiBsZWFzdCBhZnRlciBwcm9jZXNzaW5nVG90YWxUaW1lTXMgZnJvbSB0aGUgdGltZSBpdCBzdGFydHMgdG8gcHJvY2VzcyB0aGUgc2Vzc2lvbi4gTm90ZSB0aGF0CisgICAgICogaWYgc2VydmljZSB1c2VzIHJlYWwgTWVkaWFUcmFuc2NvZGVyIHRvIGRvIHRyYW5zY29kaW5nLCB0aGUgdGltZSBzcGVudCBvbiB0cmFuc2NvZGluZyBtYXkgYmUKKyAgICAgKiBtb3JlIHRoYW4gdGhhdC4KKyAgICAgKi8KKyAgICBpbnQgcHJvY2Vzc2luZ1RvdGFsVGltZU1zID0gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC5haWRsIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9haWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdC5haWRsCkBAIC0wLDAgKzEsODQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5UcmFuc2NvZGluZ1ZpZGVvQ29kZWNUeXBlOworCisvKioKKyAqIFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCBjb250YWlucyB0aGUgdmlkZW8gdHJhY2sgZm9ybWF0IG9mIGEgdmlkZW8uCisgKgorICogVE9ETyhoa3VhbmcpOiBTd2l0Y2ggdG8gUGVyc2lzdGFibGVCdW5kbGUgd2hlbiBiLzE1NjQyODczNSBpcyBmaXhlZCBvciBhZnRlciB3ZSByZW1vdmUKKyAqIGFpZGxfaW50ZXJmYWNlCisgKgorICogTm90ZSB0aGF0IFRyYW5zY29kaW5nVmlkZW9UcmFja0Zvcm1hdCBpcyB1c2VkIGluIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCBmb3IgdGhlICBjbGllbnQgdG8KKyAqIHNwZWNpZnkgdGhlIGRlc2lyZWQgdHJhbnNjb2RlZCB2aWRlbyBmb3JtYXQsIGFuZCBpcyBhbHNvIHVzZWQgaW4gVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIGZvciB0aGUKKyAqIHNlcnZpY2UgdG8gbm90aWZ5IGNsaWVudCBvZiB0aGUgZmluYWwgdmlkZW8gZm9ybWF0IGZvciB0cmFuc2NvZGluZy4KKyAqIFdoZW4gdXNlZCBhcyBpbnB1dCBpbiBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwsIHRoZSBjbGllbnQgb25seSBuZWVkcyB0byBzcGVjaWZ5IHRoZSBjb25maWcgdGhhdAorICogdGhleSB3YW50IHRvIGNoYW5nZSwgZS5nLiBjb2RlYyBvciByZXNvbHV0aW9uLCBhbmQgYWxsIHRoZSBtaXNzaW5nIGNvbmZpZ3Mgd2lsbCBiZSBleHRyYWN0ZWQKKyAqIGZyb20gdGhlIHNvdXJjZSB2aWRlbyBhbmQgYXBwbGllZCB0byB0aGUgZGVzdGluYXRpb24gdmlkZW8uCisgKiBXaGVuIHVzZWQgYXMgb3V0cHV0IGluIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCwgYWxsIHRoZSBjb25maWdzIHdpbGwgYmUgcG9wdWxhdGVkIHRvIGluZGljYXRlCisgKiB0aGUgZmluYWwgZW5jb2RlciBjb25maWdzIHVzZWQgZm9yIHRyYW5zY29kaW5nLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUcmFuc2NvZGluZ1ZpZGVvVHJhY2tGb3JtYXQgeworICAgIC8qKgorICAgICAqIFZpZGVvIENvZGVjIHR5cGUuCisgICAgICovCisgICAgVHJhbnNjb2RpbmdWaWRlb0NvZGVjVHlwZSBjb2RlY1R5cGU7IC8vIFRyYW5zY29kaW5nVmlkZW9Db2RlY1R5cGU6OmtVbnNwZWNpZmllZDsKKworICAgIC8qKgorICAgICAqIFdpZHRoIG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuIC0xIG1lYW5zIHVuYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCB3aWR0aCA9IC0xOworCisgICAgLyoqCisgICAgICogSGVpZ2h0IG9mIHRoZSB2aWRlbyBpbiBwaXhlbHMuIC0xIG1lYW5zIHVuYXZhaWxhYmxlLgorICAgICAqLworICAgIGludCBoZWlnaHQgPSAtMTsKKworICAgIC8qKgorICAgICAqIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgYml0cmF0ZUJwcyA9IC0xOworCisgICAgLyoqCisgICAgICogQ29kZWMgcHJvZmlsZS4gVGhpcyBtdXN0IGJlIHRoZSBzYW1lIGNvbnN0YW50IGFzIHVzZWQgaW4gTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuCisgICAgICogLTEgbWVhbnMgdW5hdmFpbGFibGUuCisgICAgICovCisgICAgaW50IHByb2ZpbGUgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvZGVjIGxldmVsLiBUaGlzIG11c3QgYmUgdGhlIHNhbWUgY29uc3RhbnQgYXMgdXNlZCBpbiBNZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC4KKyAgICAgKiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgbGV2ZWwgPSAtMTsKKworICAgIC8qKgorICAgICAqIERlY29kZXIgb3BlcmF0aW5nIHJhdGUuIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHZlbmRvciBkb2VzIG5vdCBib29zdCB0aGUKKyAgICAgKiBoYXJkd2FyZSB0byBtYXhpbXVtIHNwZWVkIGluIHRyYW5zY29kaW5nIHVzYWdlIGNhc2UuIFRoaXMgb3BlcmF0aW5nIHJhdGUgd2lsbCBiZSBhcHBsaWVkCisgICAgICogdG8gZGVjb2RlciBpbnNpZGUgTWVkaWFUcmFuc2NvZGVyLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgZGVjb2Rlck9wZXJhdGluZ1JhdGUgPSAtMTsKKworICAgIC8qKgorICAgICAqIEVuY29kZXIgb3BlcmF0aW5nIHJhdGUuIFRoaXMgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHZlbmRvciBkb2VzIG5vdCBib29zdCB0aGUKKyAgICAgKiBoYXJkd2FyZSB0byBtYXhpbXVtIHNwZWVkIGluIHRyYW5zY29kaW5nIHVzYWdlIGNhc2UuIFRoaXMgb3BlcmF0aW5nIHJhdGUgd2lsbCBiZSBhcHBsaWVkCisgICAgICogdG8gZW5jb2RlciBpbnNpZGUgTWVkaWFUcmFuc2NvZGVyLiAtMSBtZWFucyB1bmF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBpbnQgZW5jb2Rlck9wZXJhdGluZ1JhdGUgPSAtMTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zODhlMmVhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFNjcmlwdCB0byBydW4gYWxsIHRyYW5zY29kaW5nIHJlbGF0ZWQgdGVzdHMgZnJvbSBzdWJmb2xkZXJzLgorIyBSdW4gc2NyaXB0IGZyb20gdGhpcyBmb2xkZXIuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbQorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYworU1lOQ19GSU5JU0hFRD10cnVlCisKKyMgUnVuIHRoZSB0cmFuc2NvZGluZyBzZXJ2aWNlIHRlc3RzLgorcHVzaGQgdGVzdHMKKy4gYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorcG9wZAorCisjIFJ1biB0aGUgdHJhbnNjb2RlciB0ZXN0cy4KK3B1c2hkIHRyYW5zY29kZXIvdGVzdHMvCisuIGJ1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKK3BvcGQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaAppbmRleCAwZThkY2ZkLi41YmExZWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUuaApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKgotICogQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUgaXMgYSBjdXN0b20gbWF4IHByaW9yaXR5IHF1ZXVlIHRoYXQgaGVscHMgbWFuYWdpbmcgam9icyBmb3IKKyAqIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIGlzIGEgY3VzdG9tIG1heCBwcmlvcml0eSBxdWV1ZSB0aGF0IGhlbHBzIG1hbmFnaW5nIHNlc3Npb25zIGZvcgogICogTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCiAgKgogICogQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWUgaXMgYSB3cmFwcGVyIHRlbXBsYXRlIGFyb3VuZCB0aGUgU1RMJ3MgKl9oZWFwKCkgZnVuY3Rpb25zLgpAQCAtMzgsNyArMzgsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29tcGFyYXRvciA9IHN0ZDo6bGVzczxUPj4KIGNsYXNzIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIHsKLSAgIHB1YmxpYzoKK3B1YmxpYzoKICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OjppdGVyYXRvciBpdGVyYXRvcjsKICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgLyogUmV0dXJuIHRoZSBiYWNrYm9uZSBzdG9yYWdlIG9mIHRoaXMgUHJpb3JpdHlRdWV1ZS4gTWFpbmx5IHVzZWQgZm9yIGRlYnVnZ2luZy4gKi8KICAgICBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgZ2V0U3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIG1IZWFwOyB9OwogCi0gICBwcml2YXRlOgorcHJpdmF0ZToKICAgICBzdGQ6OnZlY3RvcjxUPiBtSGVhcDsKIAogICAgIC8qIEltcGxlbWVudGF0aW9uIHNoYXJlZCBieSBib3RoIHB1YmxpYyBwdXNoKCkgbWV0aG9kcy4gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTFlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfQ09OVFJPTExFUl9DTElFTlRfSU5URVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9DT05UUk9MTEVSX0NMSUVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworCisvLyBJbnRlcmZhY2UgZm9yIGEgY2xpZW50IHRvIGNhbGwgdGhlIGNvbnRyb2xsZXIgdG8gc2NoZWR1bGUgb3IgcmV0cmlldmUKKy8vIHRoZSBzdGF0dXMgb2YgYSBzZXNzaW9uLgorY2xhc3MgQ29udHJvbGxlckNsaWVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogU3VibWl0cyBvbmUgcmVxdWVzdCB0byB0aGUgY29udHJvbGxlci4KKyAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBvbiBmYWlsdXJlLiBUaGlzIGNhbGwgd2lsbCBmYWlsIGlzIGEgc2Vzc2lvbiBpZGVudGlmaWVkCisgICAgICogYnkgPGNsaWVudElkLCBzZXNzaW9uSWQ+IGFscmVhZHkgZXhpc3RzLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzdWJtaXQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENhbGxiYWNrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIGEgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5IDxjbGllbnRJZCwgc2Vzc2lvbklkPi4KKyAgICAgKgorICAgICAqIElmIHNlc3Npb25JZCBpcyBuZWdhdGl2ZSAoPDApLCBhbGwgc2Vzc2lvbnMgd2l0aCBhIHNwZWNpZmllZCBwcmlvcml0eSAodGhhdCdzIG5vdAorICAgICAqIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQpIHdpbGwgYmUgY2FuY2VsbGVkLiBPdGhlcndpc2UsIG9ubHkgdGhlIHNpbmdsZQorICAgICAqIHNlc3Npb24gPGNsaWVudElkLCBzZXNzaW9uSWQ+IHdpbGwgYmUgY2FuY2VsbGVkLgorICAgICAqCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBhIHNpbmdsZSBzZXNzaW9uIGlzIGJlaW5nIGNhbmNlbGxlZCBidXQgaXQgZG9lc24ndCBleGlzdC4gUmV0dXJucworICAgICAqIHRydWUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjYW5jZWwoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2Vzc2lvbi4KKyAgICAgKgorICAgICAqIFJldHVybnMgdHJ1ZSBhbmQgdGhlIHNlc3Npb24gaWYgaXQgZXhpc3RzLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBnZXRTZXNzaW9uKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsKiByZXF1ZXN0KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYWRkaXRpb25hbCBjbGllbnQgdWlkIHJlcXVlc3RpbmcgdGhlIHNlc3Npb24gaWRlbnRpZmllZCBieSA8Y2xpZW50SWQsIHNlc3Npb25JZD4uCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QsIG9yIHRoZSBjbGllbnQgaXMgYWxyZWFkeSByZXF1ZXN0aW5nIHRoZQorICAgICAqIHNlc3Npb24uIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGFkZENsaWVudFVpZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjbGllbnRVaWQpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSAodW5zb3J0ZWQpIGxpc3Qgb2YgYWxsIGNsaWVudHMgcmVxdWVzdGluZyB0aGUgc2Vzc2lvbiBpZGVudGlmaWVkIGJ5CisgICAgICogPGNsaWVudElkLCBzZXNzaW9uSWQ+LgorICAgICAqCisgICAgICogTm90ZSB0aGF0IGlmIGEgc2Vzc2lvbiB3YXMgc3VibWl0dGVkIHdpdGggb2ZmbGluZSBwcmlvcml0eSAoCisgICAgICogVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCksIGl0IGluaXRpYWxseSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHJlcXVlc3RlZAorICAgICAqIGJ5IGFueSBwYXJ0aWN1bGFyIGNsaWVudCwgYmVjYXVzZSB0aGUgY2xpZW50IGNvdWxkIGdvIGF3YXkgYW55IHRpbWUgYWZ0ZXIgdGhlIHN1Ym1pc3Npb24uCisgICAgICogSG93ZXZlciwgYWRkaXRpb25hbCB1aWRzIGNvdWxkIGJlIGFkZGVkIHZpYSBhZGRDbGllbnRVaWQoKSBhZnRlciB0aGUgc3VibWlzc2lvbiwgd2hpY2gKKyAgICAgKiBlc3NlbnRpYWxseSBtYWtlIHRoZSByZXF1ZXN0IGEgcmVhbC10aW1lIHJlcXVlc3QgaW5zdGVhZCBvZiBhbiBvZmZsaW5lIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzZXNzaW9uIGRvZXNuJ3QgZXhpc3QuIFJldHVybnMgdHJ1ZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGdldENsaWVudFVpZHMoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0X2NsaWVudFVpZHMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q29udHJvbGxlckNsaWVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfQ09OVFJPTExFUl9DTElFTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9SZXNvdXJjZVBvbGljeUludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1Jlc291cmNlUG9saWN5SW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNjZTI1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9SZXNvdXJjZVBvbGljeUludGVyZmFjZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfUE9MSUNZX0lOVEVSRkFDRV9ICisjaW5jbHVkZSA8bWVtb3J5PgorbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlOworCisvLyBJbnRlcmZhY2UgZm9yIHRoZSBTZXNzaW9uQ29udHJvbGxlciB0byBjb250cm9sIHRoZSByZXNvdXJjZSBzdGF0dXMgdXBkYXRlcy4KK2NsYXNzIFJlc291cmNlUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBTZXQgdGhlIGFzc29jaWF0ZWQgY2FsbGJhY2sgaW50ZXJmYWNlIHRvIHNlbmQgdGhlIGV2ZW50cyB3aGVuIHJlc291cmNlCisgICAgLy8gc3RhdHVzIGNoYW5nZXMuIChTZXQgdG8gbnVsbHB0ciB3aWxsIHN0b3AgdGhlIHVwZGF0ZXMuKQorICAgIHZpcnR1YWwgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4mIGNiKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFBpZFJlc291cmNlTG9zdChwaWRfdCBwaWQpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJlc291cmNlUG9saWN5SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworLy8gSW50ZXJmYWNlIGZvciBub3RpZnlpbmcgdGhlIFNlc3Npb25Db250cm9sbGVyIG9mIGEgY2hhbmdlIGluIHJlc291cmNlIHN0YXR1cy4KK2NsYXNzIFJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIENhbGxlZCB3aGVuIGNvZGVjIHJlc291cmNlcyBiZWNvbWUgYXZhaWxhYmxlLiBUaGUgY29udHJvbGxlciBtYXkgdXNlIHRoaXMKKyAgICAvLyBhcyBhIHNpZ25hbCB0byBhdHRlbXB0IHJlc3RhcnQgdHJhbnNjb2Rpbmcgc2Vzc2lvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkKKyAgICAvLyBwYXVzZWQgZHVlIHRvIHRlbXBvcmFyeSByZXNvdXJjZSBsb3NzLgorICAgIHZpcnR1YWwgdm9pZCBvblJlc291cmNlQXZhaWxhYmxlKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUkVTT1VSQ0VfUE9MSUNZX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVGhlcm1hbFBvbGljeUludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RoZXJtYWxQb2xpY3lJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2MwY2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RoZXJtYWxQb2xpY3lJbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RIRVJNQUxfUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVEhFUk1BTF9QT0xJQ1lfSU5URVJGQUNFX0gKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGhlcm1hbFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlOworCisvLyBJbnRlcmZhY2UgZm9yIHRoZSBTZXNzaW9uQ29udHJvbGxlciB0byBjb250cm9sIHRoZSB0aGVybWFsIHBvbGljeS4KK2NsYXNzIFRoZXJtYWxQb2xpY3lJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIFNldCB0aGUgYXNzb2NpYXRlZCBjYWxsYmFjayBpbnRlcmZhY2UgdG8gc2VuZCB0aGUgZXZlbnRzIHdoZW4gdGhlIHRoZXJtYWwKKyAgICAvLyBzdGF0dXMgY2hhbmdlcy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRoZXJtYWxQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4mIGNiKSA9IDA7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdGhlcm1hbCB0aHJvdHRsaW5nIHN0YXR1cy4gUmV0dXJucyB0cnVlIGlmIHRocm90dGxpbmcgaXMgb24sCisgICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAgIHZpcnR1YWwgYm9vbCBnZXRUaHJvdHRsaW5nU3RhdHVzKCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGhlcm1hbFBvbGljeUludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKKy8vIEludGVyZmFjZSBmb3Igbm90aWZ5aW5nIHRoZSBTZXNzaW9uQ29udHJvbGxlciBvZiB0aGVybWFsIHRocm90dGxpbmcgc3RhdHVzLgorY2xhc3MgVGhlcm1hbFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBjb250cm9sbGVyIHNob3VsZCBzdGFydCBvciBzdG9wIHRoZXJtYWwgdGhyb3R0bGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25UaHJvdHRsaW5nU3RhcnRlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25UaHJvdHRsaW5nU3RvcHBlZCgpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflRoZXJtYWxQb2xpY3lDYWxsYmFja0ludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVEhFUk1BTF9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMGJkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RFUl9JTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RSQU5TQ09ERVJfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ0Vycm9yQ29kZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ0RlZnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nRXJyb3JDb2RlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworY2xhc3MgVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlOworCisvLyBJbnRlcmZhY2UgZm9yIHRoZSBjb250cm9sbGVyIHRvIGNhbGwgdGhlIHRyYW5zY29kZXIgdG8gdGFrZSBhY3Rpb25zLgorY2xhc3MgVHJhbnNjb2RlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHN0YXJ0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwgdWlkX3QgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcmVxdWVzdCwgdWlkX3QgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNsaWVudENhbGxiYWNrKSA9IDA7CisgICAgLy8gU3RvcCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uIElmIGFiYW5kb24gaXMgdHJ1ZSwgdGhlIHRyYW5zY29kZXIgd3JhcHBlciB3aWxsIGJlIGRpc2NhcmRlZAorICAgIC8vIGFmdGVyIHRoZSBzZXNzaW9uIHN0b3BzLgorICAgIHZpcnR1YWwgdm9pZCBzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGJvb2wgYWJhbmRvbiA9IGZhbHNlKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5UcmFuc2NvZGVySW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworLy8gSW50ZXJmYWNlIGZvciB0aGUgdHJhbnNjb2RlciB0byBub3RpZnkgdGhlIGNvbnRyb2xsZXIgb2YgdGhlIHN0YXR1cyBvZgorLy8gdGhlIGN1cnJlbnRseSBydW5uaW5nIHNlc3Npb24sIG9yIHRlbXBvcmFyeSBsb3NzIG9mIHRyYW5zY29kaW5nIHJlc291cmNlcy4KK2NsYXNzIFRyYW5zY29kZXJDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gVE9ETyhjaHopOiBkZXRlcm1pbmUgd2hhdCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgaGVyZS4KKyAgICB2aXJ0dWFsIHZvaWQgb25TdGFydGVkKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25QYXVzZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdHJhbnNjb2RpbmcgYmVjb21lcyB0ZW1wb3JhcmlseSBpbmFjY2Vzc2libGUgZHVlIHRvIGxvc3Mgb2YgcmVzb3VyY2UuCisgICAgLy8gSWYgdGhlcmUgaXMgYW55IHNlc3Npb24gY3VycmVudGx5IHJ1bm5pbmcsIGl0IHdpbGwgYmUgcGF1c2VkLiBXaGVuIHJlc291cmNlIGNvbnRlbnRpb24KKyAgICAvLyBpcyBzb2x2ZWQsIHRoZSBjb250cm9sbGVyIHNob3VsZCBjYWxsIFRyYW5zY29kZXJJbnRlcmZhY2UncyB0byBlaXRoZXIgc3RhcnQgYSBuZXcgc2Vzc2lvbiwKKyAgICAvLyBvciByZXN1bWUgYSBwYXVzZWQgc2Vzc2lvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXNvdXJjZUxvc3QoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPREVSX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlcldyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGVyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDRjODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RlcldyYXBwZXIuaApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9UUkFOU0NPREVSX1dSQVBQRVJfSAorI2RlZmluZSBBTkRST0lEX1RSQU5TQ09ERVJfV1JBUFBFUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGVySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdMb2dnZXIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYVRyYW5zY29kZXI7CitjbGFzcyBQYXJjZWxhYmxlOworCisvKgorICogV3JhcHBlciBjbGFzcyBhcm91bmQgTWVkaWFUcmFuc2NvZGVyLgorICogSW1wbGVtZW50cyBUcmFuc2NvZGVySW50ZXJmYWNlIGZvciBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyIHRvIHVzZS4KKyAqLworY2xhc3MgVHJhbnNjb2RlcldyYXBwZXIgOiBwdWJsaWMgVHJhbnNjb2RlckludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VHJhbnNjb2RlcldyYXBwZXI+IHsKK3B1YmxpYzoKKyAgICBUcmFuc2NvZGVyV3JhcHBlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kaW5nTG9nZ2VyPiYgbG9nZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGVhcnRCZWF0SW50ZXJ2YWxVcyk7CisgICAgflRyYW5zY29kZXJXcmFwcGVyKCk7CisKKyAgICAvLyBUcmFuc2NvZGVySW50ZXJmYWNlCisgICAgdm9pZCBzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LCB1aWRfdCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXN1bWUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsIHVpZF90IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgc3RvcChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBib29sIGFiYW5kb24gPSBmYWxzZSkgb3ZlcnJpZGU7CisgICAgLy8gflRyYW5zY29kZXJJbnRlcmZhY2UKKworcHJpdmF0ZToKKyAgICBjbGFzcyBDYWxsYmFja0ltcGw7CisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSBUeXBlIHsKKyAgICAgICAgICAgIE5vRXZlbnQsCisgICAgICAgICAgICBTdGFydCwKKyAgICAgICAgICAgIFBhdXNlLAorICAgICAgICAgICAgUmVzdW1lLAorICAgICAgICAgICAgU3RvcCwKKyAgICAgICAgICAgIEZpbmlzaCwKKyAgICAgICAgICAgIEVycm9yLAorICAgICAgICAgICAgUHJvZ3Jlc3MsCisgICAgICAgICAgICBIZWFydEJlYXQsCisgICAgICAgICAgICBBYmFuZG9uCisgICAgICAgIH0gdHlwZTsKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkOworICAgICAgICBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZDsKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHJ1bm5hYmxlOworICAgICAgICBpbnQzMl90IGFyZzsKKyAgICB9OworICAgIHVzaW5nIFNlc3Npb25LZXlUeXBlID0gc3RkOjpwYWlyPENsaWVudElkVHlwZSwgU2Vzc2lvbklkVHlwZT47CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FsbGJhY2tJbXBsPiBtVHJhbnNjb2RlckNiOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6d2Vha19wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiBtQ2FsbGJhY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kaW5nTG9nZ2VyPiBtTG9nZ2VyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1TcmNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbURzdEZvcm1hdDsKKyAgICBpbnQ2NF90IG1IZWFydEJlYXRJbnRlcnZhbFVzOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8RXZlbnQ+IG1RdWV1ZTsgIC8vIEdVQVJERURfQlkobUxvY2spOworICAgIHN0ZDo6bWFwPFNlc3Npb25LZXlUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPj4gbVBhdXNlZFN0YXRlTWFwOworICAgIENsaWVudElkVHlwZSBtQ3VycmVudENsaWVudElkOworICAgIFNlc3Npb25JZFR5cGUgbUN1cnJlbnRTZXNzaW9uSWQ7CisgICAgdWlkX3QgbUN1cnJlbnRDYWxsaW5nVWlkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbVRyYW5zY29kZVN0YXJ0VGltZTsKKworICAgIC8vIFdoZXRoZXIgdGhlIGxvb3BlciBoYXMgYmVlbiBjcmVhdGVkLgorICAgIGJvb2wgbUxvb3BlclJlYWR5OworCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IEV2ZW50JiBldmVudCk7CisgICAgdm9pZCBvbkZpbmlzaChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKTsKKyAgICB2b2lkIG9uRXJyb3IoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKTsKKyAgICB2b2lkIG9uUHJvZ3Jlc3MoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgaW50MzJfdCBwcm9ncmVzcyk7CisgICAgdm9pZCBvbkhlYXJ0QmVhdChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKTsKKworICAgIG1lZGlhX3N0YXR1c190IGhhbmRsZVN0YXJ0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LCB1aWRfdCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBoYW5kbGVQYXVzZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBoYW5kbGVSZXN1bWUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LCB1aWRfdCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgbWVkaWFfc3RhdHVzX3Qgc2V0dXBUcmFuc2NvZGVyKAorICAgICAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICBUcmFuc2NvZGluZ0xvZ2dlcjo6U2Vzc2lvbkVuZGVkUmVhc29uKiBmYWlsdXJlUmVhc29uIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiYgcGF1c2VkU3RhdGUgPSBudWxscHRyKTsKKworICAgIHZvaWQgY2xlYW51cCgpOworICAgIHZvaWQgbG9nU2Vzc2lvbkVuZGVkKGNvbnN0IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb24mIHJlYXNvbiwgaW50IGVycm9yKTsKKyAgICB2b2lkIHJlcG9ydEVycm9yKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIG1lZGlhX3N0YXR1c190IGVycik7CisgICAgdm9pZCBxdWV1ZUV2ZW50KEV2ZW50OjpUeXBlIHR5cGUsIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBydW5uYWJsZSwgaW50MzJfdCBhcmcgPSAwKTsKKyAgICB2b2lkIHRocmVhZExvb3AoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfVFJBTlNDT0RFUl9XUkFQUEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuaAppbmRleCBlZWMxMjBhLi5iZTU1Yzc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmgKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oCkBAIC0xNyw3MyArMTcsNzcgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19DTElFTlRfTUFOQUdFUl9ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfQ0xJRU5UX01BTkFHRVJfSAogCi0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgIkNvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50OwotCi1jbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwogCiAvKgogICogVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIG1hbmFnZXMgYWxsIHRoZSB0cmFuc2NvZGluZyBjbGllbnRzIGFjcm9zcyBkaWZmZXJlbnQgcHJvY2Vzc2VzLgogICoKLSAqIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciBpcyBhIGdsb2JhbCBzaW5nbGV0b24gdGhhdCBjb3VsZCBvbmx5IGFjcXVpcmVkIGJ5Ci0gKiBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4gSXQgbWFuYWdlcyBhbGwgdGhlIGNsaWVudHMncyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gYW5kIGNsaWVudHMnCi0gKiBpbmZvcm1hdGlvbi4gSXQgYWxzbyBib29ra2VlcHMgYWxsIHRoZSBjbGllbnRzJyBpbmZvcm1hdGlvbi4gSXQgYWxzbyBtb25pdG9ycyB0byB0aGUgZGVhdGggb2YgdGhlCisgKiBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIgbWFuYWdlcyBhbGwgdGhlIGNsaWVudHMncyByZWdpc3RyYXRpb24vdW5yZWdpc3RyYXRpb24gYW5kIGNsaWVudHMnCisgKiBpbmZvcm1hdGlvbi4gSXQgYWxzbyBib29ra2VlcHMgYWxsIHRoZSBjbGllbnRzJyBpbmZvcm1hdGlvbi4gSXQgYWxzbyBtb25pdG9ycyB0aGUgZGVhdGggb2YgdGhlCiAgKiBjbGllbnRzLiBVcG9uIGNsaWVudCdzIGRlYXRoLCBpdCB3aWxsIHJlbW92ZSB0aGUgY2xpZW50IGZyb20gaXQuCiAgKgogICogVE9ETyhoa3VhbmcpOiBIb29rIHVwIHdpdGggUmVzb3VyY2VNYW5hZ2VyIGZvciByZXNvdXJjZSBtYW5hZ2VtZW50LgogICogVE9ETyhoa3VhbmcpOiBIb29rIHVwIHdpdGggTWVkaWFNZXRyaWNzIHRvIGxvZyBhbGwgdGhlIHRyYW5zYWN0aW9ucy4KICAqLwotY2xhc3MgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIHsKLSAgIHB1YmxpYzoKK2NsYXNzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcj4geworcHVibGljOgogICAgIHZpcnR1YWwgflRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpOwogCiAgICAgLyoqCi0gICAgICogQ2xpZW50SW5mbyBjb250YWlucyBhIHNpbmdsZSBjbGllbnQncyBpbmZvcm1hdGlvbi4KLSAgICAgKi8KLSAgICBzdHJ1Y3QgQ2xpZW50SW5mbyB7Ci0gICAgICAgIC8qIFRoZSByZW1vdGUgY2xpZW50IHRoYXQgdGhpcyBDbGllbnRJbmZvIGlzIGFzc29jaWF0ZWQgd2l0aC4gKi8KLSAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IG1DbGllbnQ7Ci0gICAgICAgIC8qIEEgdW5pcXVlIHBvc2l0aXZlIElkIGFzc2lnbmVkIHRvIHRoZSBjbGllbnQgYnkgdGhlIHNlcnZpY2UuICovCi0gICAgICAgIGludDMyX3QgbUNsaWVudElkOwotICAgICAgICAvKiBQcm9jZXNzIGlkIG9mIHRoZSBjbGllbnQgKi8KLSAgICAgICAgaW50MzJfdCBtQ2xpZW50UGlkOwotICAgICAgICAvKiBVc2VyIGlkIG9mIHRoZSBjbGllbnQuICovCi0gICAgICAgIGludDMyX3QgbUNsaWVudFVpZDsKLSAgICAgICAgLyogUGFja2FnZSBuYW1lIG9mIHRoZSBjbGllbnQuICovCi0gICAgICAgIHN0ZDo6c3RyaW5nIG1DbGllbnRPcFBhY2thZ2VOYW1lOwotCi0gICAgICAgIENsaWVudEluZm8oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+JiBjbGllbnQsIGludDY0X3QgY2xpZW50SWQsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBwaWQsIGludDMyX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSkKLSAgICAgICAgICAgIDogbUNsaWVudChjbGllbnQpLAotICAgICAgICAgICAgICBtQ2xpZW50SWQoY2xpZW50SWQpLAotICAgICAgICAgICAgICBtQ2xpZW50UGlkKHBpZCksCi0gICAgICAgICAgICAgIG1DbGllbnRVaWQodWlkKSwKLSAgICAgICAgICAgICAgbUNsaWVudE9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkge30KLSAgICB9OwotCi0gICAgLyoqCiAgICAgICogQWRkcyBhIG5ldyBjbGllbnQgdG8gdGhlIG1hbmFnZXIuCiAgICAgICoKLSAgICAgKiBUaGUgY2xpZW50IG11c3QgaGF2ZSB2YWxpZCBjbGllbnRJZCwgcGlkLCB1aWQgYW5kIG9wUGFja2FnZU5hbWUsIG90aGVyd2lzZSwgdGhpcyB3aWxsIHJldHVybgotICAgICAqIGEgbm9uLXplcm8gZXJyb3Jjb2RlLiBJZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIGl0IHdpbGwgYWxzbyByZXR1cm4gbm9uLXplcm8KLSAgICAgKiBlcnJvcmNvZGUuCisgICAgICogVGhlIGNsaWVudCBtdXN0IGhhdmUgdmFsaWQgY2FsbGJhY2ssIHBpZCwgdWlkLCBjbGllbnROYW1lIGFuZCBvcFBhY2thZ2VOYW1lLgorICAgICAqIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGVycm9yY29kZS4gSWYgdGhlIGNsaWVudCBjYWxsYmFjayBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gYWRkZWQsIGl0IHdpbGwgYWxzbyByZXR1cm4gbm9uLXplcm8gZXJyb3Jjb2RlLgogICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudCB0byBiZSBhZGRlZCB0byB0aGUgbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgY2xpZW50IGNhbGxiYWNrIGZvciB0aGUgc2VydmljZSB0byBjYWxsIHRoaXMgY2xpZW50LgorICAgICAqIEBwYXJhbSBjbGllbnROYW1lIGNsaWVudCdzIG5hbWUuCisgICAgICogQHBhcmFtIG9wUGFja2FnZU5hbWUgY2xpZW50J3MgcGFja2FnZSBuYW1lLgorICAgICAqIEBwYXJhbSBjbGllbnQgb3V0cHV0IGhvbGRpbmcgdGhlIElUcmFuc2NvZGluZ0NsaWVudCBpbnRlcmZhY2UgZm9yIHRoZSBjbGllbnQKKyAgICAgKiAgICAgICAgdG8gdXNlIGZvciBzdWJzZXF1ZW50IGNvbW11bmljYXRpb25zIHdpdGggdGhlIHNlcnZpY2UuCiAgICAgICogQHJldHVybiAwIGlmIGNsaWVudCBpcyBhZGRlZCBzdWNjZXNzZnVsbHksIG5vbi16ZXJvIGVycm9yY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3QgYWRkQ2xpZW50KHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRJbmZvPiBjbGllbnQpOworICAgIHN0YXR1c190IGFkZENsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiogY2xpZW50KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBjbGllbnRzLgorICAgICAqLworICAgIHNpemVfdCBnZXROdW1PZkNsaWVudHMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIER1bXAgYWxsIHRoZSBjbGllbnQgaW5mb3JtYXRpb24gdG8gdGhlIGZkLgorICAgICAqLworICAgIHZvaWQgZHVtcEFsbENsaWVudHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7CisgICAgZnJpZW5kIGNsYXNzIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3Q7CisgICAgc3RydWN0IENsaWVudEltcGw7CisKKyAgICAvLyBPbmx5IGFsbG93IE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIGFuZCB1bml0IHRlc3RzIHRvIGluc3RhbnRpYXRlLgorICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29udHJvbGxlckNsaWVudEludGVyZmFjZT4mIGNvbnRyb2xsZXIpOworCisgICAgLy8gQ2hlY2tzIGlmIGEgdXNlciBpcyB0cnVzdGVkIChhbmQgYWxsb3dlZCB0byBzdWJtaXQgc2Vzc2lvbnMgb24gYmVoYWxmIG9mIG90aGVyIHVpZHMpCisgICAgYm9vbCBpc1RydXN0ZWRDYWxsZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBjbGllbnQgZnJvbSB0aGUgbWFuYWdlci4KQEAgLTkzLDM5ICs5NywyNCBAQAogICAgICAqIEBwYXJhbSBjbGllbnRJZCBpZCBvZiB0aGUgY2xpZW50IHRvIGJlIHJlbW92ZWQuLgogICAgICAqIEByZXR1cm4gMCBpZiBjbGllbnQgaXMgcmVtb3ZlZCBzdWNjZXNzZnVsbHksIG5vbi16ZXJvIGVycm9yY29kZSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVtb3ZlQ2xpZW50KGludDMyX3QgY2xpZW50SWQpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGNsaWVudHMuCi0gICAgICovCi0gICAgc2l6ZV90IGdldE51bU9mQ2xpZW50cygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIGEgY2xpZW50IHdpdGggY2xpZW50SWQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIGJvb2wgaXNDbGllbnRJZFJlZ2lzdGVyZWQoaW50MzJfdCBjbGllbnRJZCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEdW1wIGFsbCB0aGUgY2xpZW50IGluZm9ybWF0aW9uIHRvIHRoZSBmZC4KLSAgICAgKi8KLSAgICB2b2lkIGR1bXBBbGxDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwotICAgIGZyaWVuZCBjbGFzcyBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0OwotCi0gICAgLyoqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuICovCi0gICAgc3RhdGljIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciYgZ2V0SW5zdGFuY2UoKTsKLQotICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcigpOworICAgIHN0YXR1c190IHJlbW92ZUNsaWVudChDbGllbnRJZFR5cGUgY2xpZW50SWQpOwogCiAgICAgc3RhdGljIHZvaWQgQmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSk7CiAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7Ci0gICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRJbmZvPj4gbUNsaWVudElkVG9DbGllbnRJbmZvTWFwCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPENsaWVudElkVHlwZSwgc3RkOjpzaGFyZWRfcHRyPENsaWVudEltcGw+PiBtQ2xpZW50SWRUb0NsaWVudE1hcAogICAgICAgICAgICAgR1VBUkRFRF9CWShtTG9jayk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnRwdHJfdD4gbVJlZ2lzdGVyZWRDYWxsYmFja3MgR1VBUkRFRF9CWShtTG9jayk7CiAKICAgICA6Om5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2U+IG1TZXNzaW9uQ29udHJvbGxlcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IG1UcnVzdGVkVWlkczsKKworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxDbGllbnRJZFR5cGU+IHNDb29raWVDb3VudGVyOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNDb29raWUyQ2xpZW50TG9jazsKKyAgICBzdGF0aWMgc3RkOjptYXA8Q2xpZW50SWRUeXBlLCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50SW1wbD4+IHNDb29raWUyQ2xpZW50CisgICAgICAgICAgICBHVUFSREVEX0JZKHNDb29raWUyQ2xpZW50TG9jayk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nRGVmcy5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nRGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTVhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdEZWZzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwuaD4KKworLy8gVHJhbnNjb2RpbmcgdXNlcyBzb21lIEFQSXMgYXZhaWxhYmxlIG9uIEFQSTMxKy4KKyNkZWZpbmUgX19UUkFOU0NPRElOR19NSU5fQVBJX18gMzEKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBDbGllbnRJZFR5cGUgPSB1aW50cHRyX3Q7Cit1c2luZyBTZXNzaW9uSWRUeXBlID0gaW50MzJfdDsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19ERUZTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0xvZ2dlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nTG9nZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyNDU1MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ0xvZ2dlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfTE9HR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19MT0dHRVJfSAorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqIENsYXNzIGZvciBsb2dnaW5nIHRyYW5zY29kaW5nIGV2ZW50cy4gKi8KK2NsYXNzIFRyYW5zY29kaW5nTG9nZ2VyIHsKK3B1YmxpYzoKKyAgICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0b21zIHB1c2hlZCB0byBzdGF0c2QgcGVyIGRheS4gKi8KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4QXRvbXNQZXJEYXkgPSA1MDsKKworICAgIC8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0cmFuc2NvZGluZyBhdG9tcyBwdXNoZWQgdG8gc3RhdHNkIHBlciBkYXkuICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN1Y2Nlc3NmdWxBdG9tc1BlckRheSA9IDM1OworCisgICAgLyoqIFJlYXNvbiB0cmFuc2NvZGluZyBzZXNzaW9uIGVuZGVkLiBNYXBzIHRvIE1lZGlhVHJhbnNjb2RpbmdTZXNzaW9uRW5kZWQgYXRvbSdzIFJlYXNvbi4gKi8KKyAgICBlbnVtIFNlc3Npb25FbmRlZFJlYXNvbiB7CisgICAgICAgIFVOS05PV04gPSAwLAorICAgICAgICBGSU5JU0hFRCwKKyAgICAgICAgRVJST1IsCisgICAgICAgIFBBVVNFRCwKKyAgICAgICAgQ0FOQ0VMTEVELAorICAgICAgICBTVEFSVF9GQUlMRUQsCisgICAgICAgIFJFU1VNRV9GQUlMRUQsCisgICAgICAgIENSRUFURV9GQUlMRUQsCisgICAgICAgIENPTkZJR19TUkNfRkFJTEVELAorICAgICAgICBDT05GSUdfRFNUX0ZBSUxFRCwKKyAgICAgICAgQ09ORklHX1RSQUNLX0ZBSUxFRCwKKyAgICAgICAgT1BFTl9TUkNfRkRfRkFJTEVELAorICAgICAgICBPUEVOX0RTVF9GRF9GQUlMRUQsCisgICAgICAgIE5PX1RSQUNLUywKKyAgICB9OworCisgICAgVHJhbnNjb2RpbmdMb2dnZXIoKTsKKyAgICB+VHJhbnNjb2RpbmdMb2dnZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEgdHJhbnNjb2Rpbmcgc2Vzc2lvbiBlbmRlZCBldmVudCAoTWVkaWFUcmFuc2NvZGluZ1Nlc3Npb25FbmRlZCBhdG9tKS4KKyAgICAgKiBAcGFyYW0gcmVhc29uIFJlYXNvbiBmb3IgdGhlIHRyYW5zY29kaW5nIHNlc3Npb24gdG8gZW5kLgorICAgICAqIEBwYXJhbSBjYWxsaW5nVWlkIFVJRCBvZiB0aGUgY2FsbGVyIGNvbm5lY3RpbmcgdG8gdGhlIHRyYW5zY29kaW5nIHNlcnZpY2UuCisgICAgICogQHBhcmFtIHN0YXR1cyBTdGF0dXMgKGVycm9yIGNvZGUpIG9mIHRoZSB0cmFuc2NvZGluZyBzZXNzaW9uLgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBEdXJhdGlvbiBvZiB0aGUgdHJhbnNjb2Rpbmcgc2Vzc2lvbi4KKyAgICAgKiBAcGFyYW0gc3JjRm9ybWF0IFRoZSBzb3VyY2UgdmlkZW8gdHJhY2sgZm9ybWF0LgorICAgICAqIEBwYXJhbSBkc3RGb3JtYXQgVGhlIGRlc3RpbmF0aW9uIHZpZGVvIHRyYWNrIGZvcm1hdC4KKyAgICAgKi8KKyAgICB2b2lkIGxvZ1Nlc3Npb25FbmRlZChlbnVtIFNlc3Npb25FbmRlZFJlYXNvbiByZWFzb24sIHVpZF90IGNhbGxpbmdVaWQsIGludCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBkdXJhdGlvbiwgQU1lZGlhRm9ybWF0KiBzcmNGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBUcmFuc2NvZGluZ0xvZ2dlclRlc3Q7CisKKyAgICAvLyBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIHdyaXRpbmcgb3V0IHRoZSBzZXNzaW9uIGVuZGVkIGF0b20uCisgICAgdXNpbmcgU2Vzc2lvbkVuZGVkQXRvbVdyaXRlciA9IHN0ZDo6ZnVuY3Rpb248aW50KAorICAgICAgICAgICAgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgaW50MzJfdCwgY2hhciBjb25zdCosIGludDMyX3QsCisgICAgICAgICAgICBpbnQzMl90LCBpbnQzMl90LCBpbnQzMl90LCBib29sIGFyZzEyLCBpbnQzMl90LCBpbnQzMl90LCBjaGFyIGNvbnN0KiwgYm9vbCk+OworCisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OnF1ZXVlPHN0ZDo6cGFpcjxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50LCBpbnQ+PiBtTGFzdExvZ2dlZEF0b21zCisgICAgICAgICAgICBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICB1aW50MzJfdCBtU3VjY2Vzc2Z1bENvdW50ID0gMDsKKyAgICBTZXNzaW9uRW5kZWRBdG9tV3JpdGVyIG1TZXNzaW9uRW5kZWRBdG9tV3JpdGVyOworCisgICAgdm9pZCBsb2dTZXNzaW9uRW5kZWQoY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCYgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gU2Vzc2lvbkVuZGVkUmVhc29uIHJlYXNvbiwgdWlkX3QgY2FsbGluZ1VpZCwgaW50IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGR1cmF0aW9uLCBBTWVkaWFGb3JtYXQqIHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCk7CisgICAgYm9vbCBzaG91bGRMb2dBdG9tKGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQmIG5vdywgaW50IHN0YXR1cyk7CisgICAgLy8gVXNlZCBmb3IgdGVzdGluZyB0byB2YWxpZGF0ZSB3aGF0IGdldHMgc2VudCB0byBzdGF0c2QuCisgICAgdm9pZCBzZXRTZXNzaW9uRW5kZWRBdG9tV3JpdGVyKGNvbnN0IFNlc3Npb25FbmRlZEF0b21Xcml0ZXImIHdyaXRlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX0xPR0dFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0LmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2Y2NmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1JFUVVFU1RfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1JFUVVFU1RfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3BhcmNlbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbDsKKworLy8gSGVscGVyIGNsYXNzIGZvciBkdXBsaWNhdGluZyBhIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbAorY2xhc3MgVHJhbnNjb2RpbmdSZXF1ZXN0IDogcHVibGljIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCB7CitwdWJsaWM6CisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0KCkgPSBkZWZhdWx0OworICAgIFRyYW5zY29kaW5nUmVxdWVzdChjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHBhcmNlbCkgeyBzZXRUbyhwYXJjZWwpOyB9CisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0KGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdCYgcmVxdWVzdCkgeyBzZXRUbyhyZXF1ZXN0KTsgfQorICAgIFRyYW5zY29kaW5nUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdCYgcmVxdWVzdCkgeworICAgICAgICBzZXRUbyhyZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHNldFRvKGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgcGFyY2VsKSB7CisgICAgICAgIGlmIChfX2J1aWx0aW5fYXZhaWxhYmxlKGFuZHJvaWQgX19UUkFOU0NPRElOR19NSU5fQVBJX18sICopKSB7CisgICAgICAgICAgICBBUGFyY2VsKiBwID0gQVBhcmNlbF9jcmVhdGUoKTsKKyAgICAgICAgICAgIHBhcmNlbC53cml0ZVRvUGFyY2VsKHApOworICAgICAgICAgICAgQVBhcmNlbF9zZXREYXRhUG9zaXRpb24ocCwgMCk7CisgICAgICAgICAgICByZWFkRnJvbVBhcmNlbChwKTsKKyAgICAgICAgICAgIEFQYXJjZWxfZGVsZXRlKHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc291cmNlRmlsZVBhdGggPSBwYXJjZWwuc291cmNlRmlsZVBhdGg7CisgICAgICAgICAgICBzb3VyY2VGZCA9IG5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IoZHVwKHBhcmNlbC5zb3VyY2VGZC5nZXQoKSkpOworICAgICAgICAgICAgZGVzdGluYXRpb25GaWxlUGF0aCA9IHBhcmNlbC5kZXN0aW5hdGlvbkZpbGVQYXRoOworICAgICAgICAgICAgZGVzdGluYXRpb25GZCA9IG5kazo6U2NvcGVkRmlsZURlc2NyaXB0b3IoZHVwKHBhcmNlbC5kZXN0aW5hdGlvbkZkLmdldCgpKSk7CisgICAgICAgICAgICBjbGllbnRVaWQgPSBwYXJjZWwuY2xpZW50VWlkOworICAgICAgICAgICAgY2xpZW50UGlkID0gcGFyY2VsLmNsaWVudFBpZDsKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lID0gcGFyY2VsLmNsaWVudFBhY2thZ2VOYW1lOworICAgICAgICAgICAgdHJhbnNjb2RpbmdUeXBlID0gcGFyY2VsLnRyYW5zY29kaW5nVHlwZTsKKyAgICAgICAgICAgIHJlcXVlc3RlZFZpZGVvVHJhY2tGb3JtYXQgPSBwYXJjZWwucmVxdWVzdGVkVmlkZW9UcmFja0Zvcm1hdDsKKyAgICAgICAgICAgIHByaW9yaXR5ID0gcGFyY2VsLnByaW9yaXR5OworICAgICAgICAgICAgcmVxdWVzdFByb2dyZXNzVXBkYXRlID0gcGFyY2VsLnJlcXVlc3RQcm9ncmVzc1VwZGF0ZTsKKyAgICAgICAgICAgIHJlcXVlc3RTZXNzaW9uRXZlbnRVcGRhdGUgPSBwYXJjZWwucmVxdWVzdFNlc3Npb25FdmVudFVwZGF0ZTsKKyAgICAgICAgICAgIGlzRm9yVGVzdGluZyA9IHBhcmNlbC5pc0ZvclRlc3Rpbmc7CisgICAgICAgICAgICB0ZXN0Q29uZmlnID0gcGFyY2VsLnRlc3RDb25maWc7CisgICAgICAgIH0KKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1JFUVVFU1RfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nUmVzb3VyY2VQb2xpY3kuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyMzJlNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5LmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19SRVNPVVJDRV9QT0xJQ1lfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1JFU09VUkNFX1BPTElDWV9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworI2luY2x1ZGUgPG11dGV4PgorbmFtZXNwYWNlIGFpZGwgeworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKK2NsYXNzIElSZXNvdXJjZU9ic2VydmVyU2VydmljZTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgYWlkbAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU9ic2VydmVyU2VydmljZTsKKworY2xhc3MgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSA6IHB1YmxpYyBSZXNvdXJjZVBvbGljeUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSgpOworICAgIH5UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5KCk7CisKKyAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGlkUmVzb3VyY2VMb3N0KHBpZF90IHBpZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFJlc291cmNlT2JzZXJ2ZXI7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1SZWdpc3RlcmVkTG9jazsKKyAgICBib29sIG1SZWdpc3RlcmVkIEdVQVJERURfQlkobVJlZ2lzdGVyZWRMb2NrKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiBtU2VydmljZSBHVUFSREVEX0JZKG1SZWdpc3RlcmVkTG9jayk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXI+IG1PYnNlcnZlcjsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ2FsbGJhY2tMb2NrOworICAgIHN0ZDo6d2Vha19wdHI8UmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4gbVJlc291cmNlUG9saWN5Q2FsbGJhY2sKKyAgICAgICAgICAgIEdVQVJERURfQlkobUNhbGxiYWNrTG9jayk7CisgICAgcGlkX3QgbVJlc291cmNlTG9zdFBpZCBHVUFSREVEX0JZKG1DYWxsYmFja0xvY2spOworCisgICAgOjpuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKKworICAgIHN0YXRpYyB2b2lkIEJpbmRlckRpZWRDYWxsYmFjayh2b2lkKiBjb29raWUpOworCisgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisgICAgdm9pZCBvblJlc291cmNlQXZhaWxhYmxlKHBpZF90IHBpZCk7Cit9OyAgLy8gY2xhc3MgVHJhbnNjb2RpbmdVaWRQb2xpY3kKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19SRVNPVVJDRV9QT0xJQ1lfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1Nzg4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfU0VTU0lPTl9DT05UUk9MTEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19TRVNTSU9OX0NPTlRST0xMRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQ29udHJvbGxlckNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL1Jlc291cmNlUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvVGhlcm1hbFBvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1JlcXVlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9VaWRQb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgewordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXN1bHRQYXJjZWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTsKKworY2xhc3MgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcgorICAgICAgOiBwdWJsaWMgVWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UsCisgICAgICAgIHB1YmxpYyBDb250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLAorICAgICAgICBwdWJsaWMgVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlLAorICAgICAgICBwdWJsaWMgUmVzb3VyY2VQb2xpY3lDYWxsYmFja0ludGVyZmFjZSwKKyAgICAgICAgcHVibGljIFRoZXJtYWxQb2xpY3lDYWxsYmFja0ludGVyZmFjZSwKKyAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcj4geworcHVibGljOgorICAgIHZpcnR1YWwgflRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIoKTsKKworICAgIC8vIENvbnRyb2xsZXJDbGllbnRJbnRlcmZhY2UKKyAgICBib29sIHN1Ym1pdChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjYWxsaW5nVWlkLCB1aWRfdCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5jZWwoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgYm9vbCBnZXRTZXNzaW9uKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCogcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgYm9vbCBhZGRDbGllbnRVaWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgdWlkX3QgY2xpZW50VWlkKSBvdmVycmlkZTsKKyAgICBib29sIGdldENsaWVudFVpZHMoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dF9jbGllbnRVaWRzKSBvdmVycmlkZTsKKyAgICAvLyB+Q29udHJvbGxlckNsaWVudEludGVyZmFjZQorCisgICAgLy8gVHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlCisgICAgdm9pZCBvblN0YXJ0ZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblBhdXNlZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdW1lZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uRmluaXNoKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIHZvaWQgb25FcnJvcihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIpIG92ZXJyaWRlOworICAgIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2dyZXNzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uSGVhcnRCZWF0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNvdXJjZUxvc3QoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgLy8gflRyYW5zY29kZXJDYWxsYmFja0ludGVyZmFjZQorCisgICAgLy8gVWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UKKyAgICB2b2lkIG9uVG9wVWlkc0NoYW5nZWQoY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiYgdWlkcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgZ29uZVVpZCkgb3ZlcnJpZGU7CisgICAgLy8gflVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlCisKKyAgICAvLyBSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlCisgICAgdm9pZCBvblJlc291cmNlQXZhaWxhYmxlKCkgb3ZlcnJpZGU7CisgICAgLy8gflJlc291cmNlUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UKKworICAgIC8vIFRoZXJtYWxQb2xpY3lDYWxsYmFja0ludGVyZmFjZQorICAgIHZvaWQgb25UaHJvdHRsaW5nU3RhcnRlZCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25UaHJvdHRsaW5nU3RvcHBlZCgpIG92ZXJyaWRlOworICAgIC8vIH5SZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlCisKKyAgICAvKioKKyAgICAgKiBEdW1wIGFsbCB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiB0byB0aGUgZmQuCisgICAgICovCisgICAgdm9pZCBkdW1wQWxsU2Vzc2lvbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7CisgICAgZnJpZW5kIGNsYXNzIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0OworCisgICAgdXNpbmcgU2Vzc2lvbktleVR5cGUgPSBzdGQ6OnBhaXI8Q2xpZW50SWRUeXBlLCBTZXNzaW9uSWRUeXBlPjsKKyAgICB1c2luZyBTZXNzaW9uUXVldWVUeXBlID0gc3RkOjpsaXN0PFNlc3Npb25LZXlUeXBlPjsKKyAgICB1c2luZyBUcmFuc2NvZGVyRmFjdG9yeVR5cGUgPSBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+Jik+OworCisgICAgc3RydWN0IENvbnRyb2xsZXJDb25maWcgeworICAgICAgICAvLyBXYXRjaGRvZyB0aW1lb3V0LgorICAgICAgICBpbnQ2NF90IHdhdGNoZG9nVGltZW91dFVzID0gMzAwMDAwMExMOworICAgICAgICAvLyBUaHJlc2hvbGQgb2YgdGltZSBiZXR3ZWVuIGZpbmlzaC9zdGFydCBiZWxvdyB3aGljaCBhIGJhY2stdG8tYmFjayBzdGFydCBpcyBjb3VudGVkLgorICAgICAgICBpbnQzMl90IHBhY2VyQnVyc3RUaHJlc2hvbGRNcyA9IDEwMDA7CisgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBiYWNrLXRvLWJhY2sgc3RhcnQgY291bnQuCisgICAgICAgIGludDMyX3QgcGFjZXJCdXJzdENvdW50UXVvdGEgPSAxMDsKKyAgICAgICAgLy8gTWF4aW11bSBhbGxvd2VkIGJhY2stdG8tYmFjayBydW5uaW5nIHRpbWUuCisgICAgICAgIGludDMyX3QgcGFjZXJCdXJzdFRpbWVRdW90YVNlY29uZHMgPSAxMjA7ICAvLyAyLW1pbgorICAgIH07CisKKyAgICBzdHJ1Y3QgU2Vzc2lvbiB7CisgICAgICAgIGVudW0gU3RhdGUgeworICAgICAgICAgICAgSU5WQUxJRCA9IC0xLAorICAgICAgICAgICAgTk9UX1NUQVJURUQgPSAwLAorICAgICAgICAgICAgUlVOTklORywKKyAgICAgICAgICAgIFBBVVNFRCwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc3RhdGVzIHdvdWxkIG5vdCBhcHBlYXIgaW4gbGl2ZSBzZXNzaW9ucyBtYXAsIGJ1dCBjb3VsZAorICAgICAgICAgICAgLy8gYXBwZWFyIGluIHBhc3Qgc2Vzc2lvbnMgbWFwIGZvciBsb2dnaW5nIHB1cnBvc2UuCisgICAgICAgICAgICBGSU5JU0hFRCwKKyAgICAgICAgICAgIENBTkNFTEVELAorICAgICAgICAgICAgRVJST1IsCisgICAgICAgICAgICBEUk9QUEVEX0JZX1BBQ0VSLAorICAgICAgICB9OworICAgICAgICBTZXNzaW9uS2V5VHlwZSBrZXk7CisgICAgICAgIHVpZF90IGNhbGxpbmdVaWQ7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gYWxsQ2xpZW50VWlkczsKKyAgICAgICAgaW50MzJfdCBsYXN0UHJvZ3Jlc3MgPSAwOworICAgICAgICBpbnQzMl90IHBhdXNlQ291bnQgPSAwOworICAgICAgICBzdGQ6OmNocm9ubzo6dGltZV9wb2ludDxzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPiBzdGF0ZUVudGVyVGltZTsKKyAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyB3YWl0aW5nVGltZXswfTsKKyAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBydW5uaW5nVGltZXswfTsKKyAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBwYXVzZWRUaW1lezB9OworCisgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBzdGQ6OndlYWtfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiBjYWxsYmFjazsKKworICAgICAgICAvLyBNdXN0IHVzZSBzZXRTdGF0ZSB0byBjaGFuZ2Ugc3RhdGUuCisgICAgICAgIHZvaWQgc2V0U3RhdGUoU2Vzc2lvbjo6U3RhdGUgc3RhdGUpOworICAgICAgICBTdGF0ZSBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlOyB9CisgICAgICAgIGJvb2wgaXNSdW5uaW5nKCkgeyByZXR1cm4gc3RhdGUgPT0gUlVOTklORzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RhdGUgc3RhdGUgPSBJTlZBTElEOworICAgIH07CisKKyAgICBzdHJ1Y3QgV2F0Y2hkb2c7CisgICAgc3RydWN0IFBhY2VyOworCisgICAgQ29udHJvbGxlckNvbmZpZyBtQ29uZmlnOworCisgICAgLy8gVE9ETyhjaHopOiBjYWxsIHRyYW5zY29kZXIgd2l0aG91dCBnbG9iYWwgbG9jay4KKyAgICAvLyBVc2UgbUxvY2sgZm9yIGFsbCBlbnRyeXBvaW50cyBmb3Igbm93LgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKworICAgIHN0ZDo6bWFwPFNlc3Npb25LZXlUeXBlLCBTZXNzaW9uPiBtU2Vzc2lvbk1hcDsKKworICAgIC8vIHVpZC0+U2Vzc2lvblF1ZXVlIG1hcCAodWlkID09IC0xOiBvZmZsaW5lIHF1ZXVlKQorICAgIHN0ZDo6bWFwPHVpZF90LCBTZXNzaW9uUXVldWVUeXBlPiBtU2Vzc2lvblF1ZXVlczsKKworICAgIC8vIHVpZHMsIHdpdGggdGhlIGhlYWQgYmVpbmcgdGhlIG1vc3QtcmVjZW50bHktdG9wIGFwcCwgMm5kIGl0ZW0gaXMgdGhlCisgICAgLy8gcHJldmlvdXMgdG9wIGFwcCwgZXRjLgorICAgIHN0ZDo6bGlzdDx1aWRfdD4gbVVpZFNvcnRlZExpc3Q7CisgICAgc3RkOjpsaXN0PHVpZF90Pjo6aXRlcmF0b3IgbU9mZmxpbmVVaWRJdGVyYXRvcjsKKyAgICBzdGQ6Om1hcDx1aWRfdCwgc3RkOjpzdHJpbmc+IG1VaWRQYWNrYWdlTmFtZXM7CisKKyAgICBUcmFuc2NvZGVyRmFjdG9yeVR5cGUgbVRyYW5zY29kZXJGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPiBtVHJhbnNjb2RlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VWlkUG9saWN5SW50ZXJmYWNlPiBtVWlkUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUludGVyZmFjZT4gbVJlc291cmNlUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaGVybWFsUG9saWN5SW50ZXJmYWNlPiBtVGhlcm1hbFBvbGljeTsKKworICAgIFNlc3Npb24qIG1DdXJyZW50U2Vzc2lvbjsKKyAgICBib29sIG1SZXNvdXJjZUxvc3Q7CisgICAgYm9vbCBtVGhlcm1hbFRocm90dGxpbmc7CisgICAgc3RkOjpsaXN0PFNlc3Npb24+IG1TZXNzaW9uSGlzdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8V2F0Y2hkb2c+IG1XYXRjaGRvZzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGFjZXI+IG1QYWNlcjsKKworICAgIC8vIE9ubHkgYWxsb3cgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgYW5kIHVuaXQgdGVzdHMgdG8gaW5zdGFudGlhdGUuCisgICAgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcihjb25zdCBUcmFuc2NvZGVyRmFjdG9yeVR5cGUmIHRyYW5zY29kZXJGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUludGVyZmFjZT4mIHVpZFBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUludGVyZmFjZT4mIHJlc291cmNlUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRoZXJtYWxQb2xpY3lJbnRlcmZhY2U+JiB0aGVybWFsUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udHJvbGxlckNvbmZpZyogY29uZmlnID0gbnVsbHB0cik7CisKKyAgICB2b2lkIGR1bXBTZXNzaW9uX2woY29uc3QgU2Vzc2lvbiYgc2Vzc2lvbiwgU3RyaW5nOCYgcmVzdWx0LCBib29sIGNsb3NlZFNlc3Npb24gPSBmYWxzZSk7CisgICAgU2Vzc2lvbiogZ2V0VG9wU2Vzc2lvbl9sKCk7CisgICAgdm9pZCB1cGRhdGVDdXJyZW50U2Vzc2lvbl9sKCk7CisgICAgdm9pZCBhZGRVaWRUb1Nlc3Npb25fbCh1aWRfdCB1aWQsIGNvbnN0IFNlc3Npb25LZXlUeXBlJiBzZXNzaW9uS2V5KTsKKyAgICB2b2lkIHJlbW92ZVNlc3Npb25fbChjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSwgU2Vzc2lvbjo6U3RhdGUgZmluYWxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpmdW5jdGlvbjxib29sKHVpZF90IHVpZCk+PiYga2VlcFVpZCA9IG51bGxwdHIpOworICAgIHZvaWQgbW92ZVVpZHNUb1RvcF9sKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4mIHVpZHMsIGJvb2wgcHJlc2VydmVUb3BVaWQpOworICAgIHZvaWQgc2V0U2Vzc2lvblN0YXRlX2woU2Vzc2lvbiogc2Vzc2lvbiwgU2Vzc2lvbjo6U3RhdGUgc3RhdGUpOworICAgIHZvaWQgbm90aWZ5Q2xpZW50KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGNvbnN0IGNoYXIqIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgU2Vzc2lvbktleVR5cGUmKT4gZnVuYyk7CisgICAgLy8gSW50ZXJuYWwgc3RhdGUgdmVyaWZpZXIgKGRlYnVnIG9ubHkpCisgICAgdm9pZCB2YWxpZGF0ZVN0YXRlX2woKTsKKworICAgIHN0YXRpYyBTdHJpbmc4IHNlc3Npb25Ub1N0cmluZyhjb25zdCBTZXNzaW9uS2V5VHlwZSYgc2Vzc2lvbktleSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHNlc3Npb25TdGF0ZVRvU3RyaW5nKGNvbnN0IFNlc3Npb246OlN0YXRlIHNlc3Npb25TdGF0ZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fQ09OVFJPTExFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5LmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNmVhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1RIRVJNQUxfUE9MSUNZX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19USEVSTUFMX1BPTElDWV9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL3RoZXJtYWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9UaGVybWFsUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisKKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kgOiBwdWJsaWMgVGhlcm1hbFBvbGljeUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgVHJhbnNjb2RpbmdUaGVybWFsUG9saWN5KCk7CisgICAgflRyYW5zY29kaW5nVGhlcm1hbFBvbGljeSgpOworCisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhlcm1hbFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIG92ZXJyaWRlOworICAgIGJvb2wgZ2V0VGhyb3R0bGluZ1N0YXR1cygpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtUmVnaXN0ZXJlZExvY2s7CisgICAgYm9vbCBtUmVnaXN0ZXJlZCBHVUFSREVEX0JZKG1SZWdpc3RlcmVkTG9jayk7CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUNhbGxiYWNrTG9jazsKKyAgICBzdGQ6OndlYWtfcHRyPFRoZXJtYWxQb2xpY3lDYWxsYmFja0ludGVyZmFjZT4gbVRoZXJtYWxQb2xpY3lDYWxsYmFjayBHVUFSREVEX0JZKG1DYWxsYmFja0xvY2spOworCisgICAgQVRoZXJtYWxNYW5hZ2VyKiBtVGhlcm1hbE1hbmFnZXI7CisgICAgYm9vbCBtSXNUaHJvdHRsaW5nOworCisgICAgc3RhdGljIHZvaWQgb25TdGF0dXNDaGFuZ2Uodm9pZCogZGF0YSwgQVRoZXJtYWxTdGF0dXMgc3RhdHVzKTsKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlKEFUaGVybWFsU3RhdHVzIHN0YXR1cyk7CisgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1RIRVJNQUxfUE9MSUNZX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1RyYW5zY29kaW5nVWlkUG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkZTVhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvaW5jbHVkZS9tZWRpYS9UcmFuc2NvZGluZ1VpZFBvbGljeS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfVUlEX1BPTElDWV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RJTkdfVUlEX1BPTElDWV9ICisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvVWlkUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCitzdHJ1Y3QgQUFjdGl2aXR5TWFuYWdlcl9VaWRJbXBvcnRhbmNlTGlzdGVuZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gT2JzZXJ2ZXIgZm9yIFVJRCBsaWZlY3ljbGUgYW5kIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVpZCdzIGFwcAorLy8gcHJpb3JpdHkgdXNlZCBieSB0aGUgc2Vzc2lvbiBjb250cm9sbGVyLgorY2xhc3MgVHJhbnNjb2RpbmdVaWRQb2xpY3kgOiBwdWJsaWMgVWlkUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUcmFuc2NvZGluZ1VpZFBvbGljeSgpOworICAgIH5UcmFuc2NvZGluZ1VpZFBvbGljeSgpOworCisgICAgLy8gVWlkUG9saWN5SW50ZXJmYWNlCisgICAgYm9vbCBpc1VpZE9uVG9wKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSBvdmVycmlkZTsKKyAgICB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgb3ZlcnJpZGU7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBnZXRUb3BVaWRzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYikgb3ZlcnJpZGU7CisgICAgLy8gflVpZFBvbGljeUludGVyZmFjZQorCitwcml2YXRlOgorICAgIHZvaWQgb25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSk7CisgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisgICAgaW50MzJfdCBnZXRQcm9jU3RhdGVfbCh1aWRfdCB1aWQpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVM7CisgICAgdm9pZCB1cGRhdGVUb3BVaWRfbCgpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVM7CisKKyAgICBzdGF0aWMgdm9pZCBPblVpZEltcG9ydGFuY2UodWlkX3QgdWlkLCBpbnQzMl90IHVpZEltcG9ydGFuY2UsIHZvaWQqIGNvb2tpZSk7CisKKyAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworICAgIG11dGFibGUgTXV0ZXggbVVpZExvY2s7CisgICAgQUFjdGl2aXR5TWFuYWdlcl9VaWRJbXBvcnRhbmNlTGlzdGVuZXIqIG1VaWRPYnNlcnZlcjsKKworICAgIGJvb2wgbVJlZ2lzdGVyZWQgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgaW50MzJfdCBtVG9wVWlkU3RhdGUgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBpbnQzMl90PiBtVWlkU3RhdGVNYXAgR1VBUkRFRF9CWShtVWlkTG9jayk7CisgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90Pj4gbVN0YXRlVWlkTWFwIEdVQVJERURfQlkobVVpZExvY2spOworICAgIHN0ZDo6d2Vha19wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+IG1VaWRQb2xpY3lDYWxsYmFjazsKK307ICAvLyBjbGFzcyBUcmFuc2NvZGluZ1VpZFBvbGljeQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ESU5HX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1VpZFBvbGljeUludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy9pbmNsdWRlL21lZGlhL1VpZFBvbGljeUludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWEyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL2luY2x1ZGUvbWVkaWEvVWlkUG9saWN5SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9VSURfUE9MSUNZX0lOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVUlEX1BPTElDWV9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZTsKKworLy8gSW50ZXJmYWNlIGZvciB0aGUgY29udHJvbGxlciB0byBxdWVyeSBhIHVpZCdzIGluZm8uCitjbGFzcyBVaWRQb2xpY3lJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIEluc3RydWN0IHRoZSB1aWQgcG9saWN5IHRvIHN0YXJ0IG1vbml0b3JpbmcgYSB1aWQuCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICAvLyBJbnN0cnVjdCB0aGUgdWlkIHBvbGljeSB0byBzdG9wIG1vbml0b3JpbmcgYSB1aWQuCisgICAgdmlydHVhbCB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgPSAwOworICAgIC8vIFdoZXRoZXIgYSB1aWQgaXMgYW1vbmcgdGhlIHNldCBvZiB1aWRzIHRoYXQncyBjdXJyZW50bHkgdG9wIHByaW9yaXR5LgorICAgIHZpcnR1YWwgYm9vbCBpc1VpZE9uVG9wKHVpZF90IHVpZCkgPSAwOworICAgIC8vIFJldHJpZXZlcyB0aGUgc2V0IG9mIHVpZHMgdGhhdCdzIGN1cnJlbnRseSB0b3AgcHJpb3JpdHkuCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IGdldFRvcFVpZHMoKSBjb25zdCA9IDA7CisgICAgLy8gU2V0IHRoZSBhc3NvY2lhdGVkIGNhbGxiYWNrIGludGVyZmFjZSB0byBzZW5kIHRoZSBldmVudHMgd2hlbiB1aWQgc3RhdGVzIGNoYW5nZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflVpZFBvbGljeUludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKKy8vIEludGVyZmFjZSBmb3Igbm90aWZ5aW5nIHRoZSBjb250cm9sbGVyIG9mIGEgY2hhbmdlIGluIHVpZCBzdGF0ZXMuCitjbGFzcyBVaWRQb2xpY3lDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIHNldCBvZiB1aWRzIHRoYXQncyB0b3AgcHJpb3JpdHkgYW1vbmcgdGhlIHVpZHMgb2YgaW50ZXJlc3QKKyAgICAvLyBoYXMgY2hhbmdlZC4gVGhlIHJlY2VpdmVyIG9mIHRoaXMgY2FsbGJhY2sgc2hvdWxkIGFkanVzdCBhY2NvcmRpbmdseS4KKyAgICB2aXJ0dWFsIHZvaWQgb25Ub3BVaWRzQ2hhbmdlZChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+JiB1aWRzKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIHVpZCBpcyBnb25lLgorICAgIHZpcnR1YWwgdm9pZCBvblVpZEdvbmUodWlkX3QgZ29uZVVpZCkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1VJRF9QT0xJQ1lfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy5jcHAKaW5kZXggZDU4YWY0ZS4uYTM1Y2E1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSW50VW5pcXVlUHRyQ29tcCB7Ci0gICBwdWJsaWM6CitwdWJsaWM6CiAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxpbnQ+JiBsaHMsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxpbnQ+JiByaHMpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuICpsaHMgPCAqcmhzOwogICAgIH0KQEAgLTIyMywxOSArMjIzLDE5IEBACiB9CiAKIC8vIFRlc3QgdGhlIGhlYXAgcHJvcGVydHkgYW5kIG1ha2Ugc3VyZSBpdCBpcyB0aGUgc2FtZSBhcyBzdGQ6OnByaW9yaXR5X3F1ZXVlLgotVEVTVChBZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZVRlc3QsIFRyYW5zY29kaW5nSm9iVGVzdCkgewotICAgIC8vIFRlc3QgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtaW1pY3MgdGhlIFRyYW5zY29kaW5nIGpvYi4KLSAgICBzdHJ1Y3QgVHJhbnNjb2RpbmdKb2IgeworVEVTVChBZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZVRlc3QsIFRyYW5zY29kaW5nU2Vzc2lvblRlc3QpIHsKKyAgICAvLyBUZXN0IGRhdGEgc3RydWN0dXJlIHRoYXQgbWltaWNzIHRoZSBUcmFuc2NvZGluZyBzZXNzaW9uLgorICAgIHN0cnVjdCBUcmFuc2NvZGluZ1Nlc3Npb24gewogICAgICAgICBpbnQzMl90IHByaW9yaXR5OwogICAgICAgICBpbnQ2NF90IGNyZWF0ZVRpbWVVczsKICAgICB9OwogCi0gICAgLy8gVGhlIGpvYiBpcyBhcnJhbmdpbmcgYWNjb3JkaW5nIHRvIHByaW9yaXR5IHdpdGggaGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC4KLSAgICAvLyBGb3IgdGhlIGpvYiB3aXRoIHRoZSBzYW1lIHByaW9yaXR5LCB0aGUgam9iIHdpdGggZWFybHkgY3JlYXRlVGltZSB3aWxsIGNvbWUgZmlyc3QuCi0gICAgY2xhc3MgVHJhbnNjb2RpbmdKb2JDb21wIHsKLSAgICAgICBwdWJsaWM6Ci0gICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdKb2I+JiBsaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdKb2I+JiByaHMpIGNvbnN0IHsKKyAgICAvLyBUaGUgc2Vzc2lvbiBpcyBhcnJhbmdpbmcgYWNjb3JkaW5nIHRvIHByaW9yaXR5IHdpdGggaGlnaGVzdCBwcmlvcml0eSBjb21lcyBmaXJzdC4KKyAgICAvLyBGb3IgdGhlIHNlc3Npb24gd2l0aCB0aGUgc2FtZSBwcmlvcml0eSwgdGhlIHNlc3Npb24gd2l0aCBlYXJseSBjcmVhdGVUaW1lIHdpbGwgY29tZSBmaXJzdC4KKyAgICBjbGFzcyBUcmFuc2NvZGluZ1Nlc3Npb25Db21wIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdTZXNzaW9uPiYgbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4mIHJocykgY29uc3QgewogICAgICAgICAgICAgaWYgKGxocy0+cHJpb3JpdHkgIT0gcmhzLT5wcmlvcml0eSkgewogICAgICAgICAgICAgICAgIHJldHVybiBsaHMtPnByaW9yaXR5IDwgcmhzLT5wcmlvcml0eTsKICAgICAgICAgICAgIH0KQEAgLTI0NCw0NiArMjQ0LDQ3IEBACiAgICAgfTsKIAogICAgIC8vIE1hcCB0byBzYXZlIGVhY2ggdmFsdWUncyBwb3NpdGlvbiBpbiB0aGUgaGVhcC4KLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBUcmFuc2NvZGluZ0pvYio+IGpvYklkVG9Kb2JNYXA7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgVHJhbnNjb2RpbmdTZXNzaW9uKj4gc2Vzc2lvbklkVG9TZXNzaW9uTWFwOwogCi0gICAgVHJhbnNjb2RpbmdKb2IgdGVzdEpvYnNbXSA9IHsKLSAgICAgICAgICAgIHsxIC8qcHJpb3JpdHkqLywgNjYgLypjcmVhdGVUaW1lVXMqL30sICAvLyBGaXJzdCBqb2IsCi0gICAgICAgICAgICB7MiAvKnByaW9yaXR5Ki8sIDY3IC8qY3JlYXRlVGltZVVzKi99LCAgLy8gU2Vjb25kIGpvYiwKLSAgICAgICAgICAgIHsyIC8qcHJpb3JpdHkqLywgNjYgLypjcmVhdGVUaW1lVXMqL30sICAvLyBUaGlyZCBqb2IsCi0gICAgICAgICAgICB7MyAvKnByaW9yaXR5Ki8sIDY4IC8qY3JlYXRlVGltZVVzKi99LCAgLy8gRm91cnRoIGpvYi4KKyAgICBUcmFuc2NvZGluZ1Nlc3Npb24gdGVzdFNlc3Npb25zW10gPSB7CisgICAgICAgICAgICB7MSAvKnByaW9yaXR5Ki8sIDY2IC8qY3JlYXRlVGltZVVzKi99LCAgLy8gRmlyc3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgIHsyIC8qcHJpb3JpdHkqLywgNjcgLypjcmVhdGVUaW1lVXMqL30sICAvLyBTZWNvbmQgc2Vzc2lvbiwKKyAgICAgICAgICAgIHsyIC8qcHJpb3JpdHkqLywgNjYgLypjcmVhdGVUaW1lVXMqL30sICAvLyBUaGlyZCBzZXNzaW9uLAorICAgICAgICAgICAgezMgLypwcmlvcml0eSovLCA2OCAvKmNyZWF0ZVRpbWVVcyovfSwgIC8vIEZvdXJ0aCBzZXNzaW9uLgogICAgIH07CiAKLSAgICBBZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZTxzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdKb2I+LCBUcmFuc2NvZGluZ0pvYkNvbXA+IGpvYlF1ZXVlOworICAgIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlPHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ1Nlc3Npb24+LCBUcmFuc2NvZGluZ1Nlc3Npb25Db21wPgorICAgICAgICAgICAgc2Vzc2lvblF1ZXVlOwogCi0gICAgLy8gUHVzaGVzIGFsbCB0aGUgam9icyBpbnRvIHRoZSBoZWFwLgotICAgIGZvciAoaW50IGpvYklkID0gMDsgam9iSWQgPCA0OyArK2pvYklkKSB7Ci0gICAgICAgIGF1dG8gbmV3Sm9iID0gc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0pvYj4odGVzdEpvYnNbam9iSWRdKTsKLSAgICAgICAgam9iSWRUb0pvYk1hcFtqb2JJZF0gPSBuZXdKb2IuZ2V0KCk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGpvYlF1ZXVlLnB1c2goc3RkOjptb3ZlKG5ld0pvYikpKTsKKyAgICAvLyBQdXNoZXMgYWxsIHRoZSBzZXNzaW9ucyBpbnRvIHRoZSBoZWFwLgorICAgIGZvciAoaW50IHNlc3Npb25JZCA9IDA7IHNlc3Npb25JZCA8IDQ7ICsrc2Vzc2lvbklkKSB7CisgICAgICAgIGF1dG8gbmV3U2Vzc2lvbiA9IHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdTZXNzaW9uPih0ZXN0U2Vzc2lvbnNbc2Vzc2lvbklkXSk7CisgICAgICAgIHNlc3Npb25JZFRvU2Vzc2lvbk1hcFtzZXNzaW9uSWRdID0gbmV3U2Vzc2lvbi5nZXQoKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc2Vzc2lvblF1ZXVlLnB1c2goc3RkOjptb3ZlKG5ld1Nlc3Npb24pKSk7CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgdGhlIGpvYiBxdWV1ZSBzaXplLgotICAgIEVYUEVDVF9FUSg0LCBqb2JRdWV1ZS5zaXplKCkpOworICAgIC8vIENoZWNrIHRoZSBzZXNzaW9uIHF1ZXVlIHNpemUuCisgICAgRVhQRUNUX0VRKDQsIHNlc3Npb25RdWV1ZS5zaXplKCkpOwogCi0gICAgLy8gQ2hlY2sgdGhlIHRvcCBhbmQgaXQgc2hvdWxkIGJlIEZvcnRoIGpvYjogKDMsIDY4KQotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4mIHRvcEpvYiA9IGpvYlF1ZXVlLnRvcCgpOwotICAgIEVYUEVDVF9FUSgzLCB0b3BKb2ItPnByaW9yaXR5KTsKLSAgICBFWFBFQ1RfRVEoNjgsIHRvcEpvYi0+Y3JlYXRlVGltZVVzKTsKKyAgICAvLyBDaGVjayB0aGUgdG9wIGFuZCBpdCBzaG91bGQgYmUgRm9ydGggc2Vzc2lvbjogKDMsIDY4KQorICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ1Nlc3Npb24+JiB0b3BTZXNzaW9uID0gc2Vzc2lvblF1ZXVlLnRvcCgpOworICAgIEVYUEVDVF9FUSgzLCB0b3BTZXNzaW9uLT5wcmlvcml0eSk7CisgICAgRVhQRUNUX0VRKDY4LCB0b3BTZXNzaW9uLT5jcmVhdGVUaW1lVXMpOwogCiAgICAgLy8gQ29uc3VtZSB0aGUgdG9wLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4gY29uc3VtZUpvYiA9IGpvYlF1ZXVlLmNvbnN1bWVfdG9wKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4gY29uc3VtZVNlc3Npb24gPSBzZXNzaW9uUXVldWUuY29uc3VtZV90b3AoKTsKIAotICAgIC8vIENoZWNrIHRoZSB0b3AgYW5kIGl0IHNob3VsZCBiZSBUaGlyZCBKb2IgKDIsIDY2KQotICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0pvYj4mIHRvcEpvYjIgPSBqb2JRdWV1ZS50b3AoKTsKLSAgICBFWFBFQ1RfRVEoMiwgdG9wSm9iMi0+cHJpb3JpdHkpOwotICAgIEVYUEVDVF9FUSg2NiwgdG9wSm9iMi0+Y3JlYXRlVGltZVVzKTsKKyAgICAvLyBDaGVjayB0aGUgdG9wIGFuZCBpdCBzaG91bGQgYmUgVGhpcmQgU2Vzc2lvbiAoMiwgNjYpCisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbj4mIHRvcFNlc3Npb24yID0gc2Vzc2lvblF1ZXVlLnRvcCgpOworICAgIEVYUEVDVF9FUSgyLCB0b3BTZXNzaW9uMi0+cHJpb3JpdHkpOworICAgIEVYUEVDVF9FUSg2NiwgdG9wU2Vzc2lvbjItPmNyZWF0ZVRpbWVVcyk7CiAKLSAgICAvLyBDaGFuZ2UgdGhlIFNlY29uZCBqb2IncyBwcmlvcml0eSB0byA0IGZyb20gKDIsIDY3KSAtPiAoNCwgNjcpLiBJdCBzaG91bGQgYmVjb21lcyB0b3Agb2YgdGhlCi0gICAgLy8gcXVldWUuCi0gICAgam9iSWRUb0pvYk1hcFsxXS0+cHJpb3JpdHkgPSA0OwotICAgIGpvYlF1ZXVlLnJlYnVpbGQoKTsKLSAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdKb2I+JiB0b3BKb2IzID0gam9iUXVldWUudG9wKCk7Ci0gICAgRVhQRUNUX0VRKDQsIHRvcEpvYjMtPnByaW9yaXR5KTsKLSAgICBFWFBFQ1RfRVEoNjcsIHRvcEpvYjMtPmNyZWF0ZVRpbWVVcyk7CisgICAgLy8gQ2hhbmdlIHRoZSBTZWNvbmQgc2Vzc2lvbidzIHByaW9yaXR5IHRvIDQgZnJvbSAoMiwgNjcpIC0+ICg0LCA2NykuIEl0IHNob3VsZCBiZWNvbWVzCisgICAgLy8gdG9wIG9mIHRoZSBxdWV1ZS4KKyAgICBzZXNzaW9uSWRUb1Nlc3Npb25NYXBbMV0tPnByaW9yaXR5ID0gNDsKKyAgICBzZXNzaW9uUXVldWUucmVidWlsZCgpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ1Nlc3Npb24+JiB0b3BTZXNzaW9uMyA9IHNlc3Npb25RdWV1ZS50b3AoKTsKKyAgICBFWFBFQ1RfRVEoNCwgdG9wU2Vzc2lvbjMtPnByaW9yaXR5KTsKKyAgICBFWFBFQ1RfRVEoNjcsIHRvcFNlc3Npb24zLT5jcmVhdGVUaW1lVXMpOwogfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODE5MWIwMC4uNjAzNjExYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDE5IEBACiAvLyBCdWlsZCB0aGUgdW5pdCB0ZXN0cyBmb3IgbGlibWVkaWF0cmFuc2NvZGluZy4KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAidGVzdF9hc3NldHMiLAorICAgIHBhdGg6ICJhc3NldHMiLAorICAgIHNyY3M6IFsiYXNzZXRzLyoqLyoiXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiLAogCkBAIC04LDE1ICsyMywxNiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYW5kcm9pZCIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZyIKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgIm1lZGlhdHJhbnNjb2RpbmdfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmciLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTM4LDYgKzU0LDE2IEBACiB9CiAKIC8vCisvLyBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyIHVuaXQgdGVzdAorLy8KK2NjX3Rlc3QgeworICAgIG5hbWU6ICJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cy5jcHAiXSwKK30KKworLy8KIC8vIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIHVuaXQgdGVzdAogLy8KIGNjX3Rlc3QgewpAQCAtNDUsNCArNzEsMTYgQEAKICAgICBkZWZhdWx0czogWyJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMuY3BwIl0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQorCisvLworLy8gVHJhbnNjb2RpbmdMb2dnZXIgdW5pdCB0ZXN0CisvLworY2NfdGVzdCB7CisgICAgbmFtZTogIlRyYW5zY29kaW5nTG9nZ2VyX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXRyYW5zY29kaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYW5kayIsICJsaWJzdGF0c3NvY2tldCMzMCJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYm1lZGlhdHJhbnNjb2RlciIsICJsaWJzdGF0c2xvZ19tZWRpYSJdLAorCisgICAgc3JjczogWyJUcmFuc2NvZGluZ0xvZ2dlcl90ZXN0cy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCA1ZDI0MTlkLi45MjMzNDEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJfdGVzdHMuY3BwCkBAIC0xOSwyNjIgKzE5LDY0NyBAQAogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCIKIAotI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblRyYW5zY29kaW5nU2VydmljZUNsaWVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db250cm9sbGVyQ2xpZW50SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxsaXN0PgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwotdXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50OwotdXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklNZWRpYVRyYW5zY29kaW5nU2VydmljZTsKLXVzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdFcnJvckNvZGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1Jlc3VsdFBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OwogCi1jb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudElkID0gLTE7Ci1jb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFBpZCA9IC0xOwotY29uc3RleHByIGludDMyX3Qga0ludmFsaWRDbGllbnRVaWQgPSAtMTsKLWNvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUgPSAiIjsKK2NvbnN0ZXhwciBwaWRfdCBrSW52YWxpZENsaWVudFBpZCA9IC01OworY29uc3RleHByIHBpZF90IGtJbnZhbGlkQ2xpZW50VWlkID0gLTEwOworY29uc3RleHByIGNvbnN0IGNoYXIqIGtJbnZhbGlkQ2xpZW50TmFtZSA9ICIiOworY29uc3RleHByIGNvbnN0IGNoYXIqIGtJbnZhbGlkQ2xpZW50UGFja2FnZSA9ICIiOwogCi1jb25zdGV4cHIgaW50MzJfdCBrQ2xpZW50SWQgPSAxOwotY29uc3RleHByIGludDMyX3Qga0NsaWVudFBpZCA9IDI7Ci1jb25zdGV4cHIgaW50MzJfdCBrQ2xpZW50VWlkID0gMzsKLWNvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50T3BQYWNrYWdlTmFtZSA9ICJUZXN0Q2xpZW50IjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50TmFtZSA9ICJUZXN0Q2xpZW50TmFtZSI7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudFBhY2thZ2UgPSAiVGVzdENsaWVudFBhY2thZ2UiOworY29uc3RleHByIHVpZF90IE9GRkxJTkVfVUlEID0gLTE7CiAKLXN0cnVjdCBUZXN0Q2xpZW50IDogcHVibGljIEJuVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50IHsKLSAgICBUZXN0Q2xpZW50KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+JiBzZXJ2aWNlKSA6IG1TZXJ2aWNlKHNlcnZpY2UpIHsKLSAgICAgICAgQUxPR0QoIlRlc3RDbGllbnQgQ3JlYXRlZCIpOwotICAgIH0KKyNkZWZpbmUgU0VTU0lPTihuKSAobikKIAotICAgIFN0YXR1cyBnZXROYW1lKHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7CitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjayB7CisgICAgVGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrIENyZWF0ZWQiKTsgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrIGRlc3Ryb3llZCIpOyB9OworCisgICAgU3RhdHVzIG9wZW5GaWxlRGVzY3JpcHRvcihjb25zdCBzdGQ6OnN0cmluZyYgLyppbl9maWxlVXJpKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX21vZGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6bmRrOjpTY29wZWRGaWxlRGVzY3JpcHRvciogLypfYWlkbF9yZXR1cm4qLykgb3ZlcnJpZGUgewogICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KIAotICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmluaXNoZWQoCi0gICAgICAgICAgICBpbnQzMl90IC8qIGluX2pvYklkICovLAotICAgICAgICAgICAgY29uc3QgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwmIC8qIGluX3Jlc3VsdCAqLykgb3ZlcnJpZGUgeworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nU3RhcnRlZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdQYXVzZWQoaW50MzJfdCAvKmluX3Nlc3Npb25JZCovKSBvdmVycmlkZSB7IHJldHVybiBTdGF0dXM6Om9rKCk7IH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nUmVzdW1lZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGaW5pc2hlZChpbnQzMl90IGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVzdWx0UGFyY2VsJiBpbl9yZXN1bHQpIG92ZXJyaWRlIHsKKyAgICAgICAgRVhQRUNUX0VRKGluX3Nlc3Npb25JZCwgaW5fcmVzdWx0LnNlc3Npb25JZCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhGaW5pc2hlZChpbl9zZXNzaW9uSWQpKTsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZhaWxlZCgKLSAgICAgICAgICAgIGludDMyX3QgLyogaW5fam9iSWQgKi8sCi0gICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0Vycm9yQ29kZSAvKmluX2Vycm9yQ29kZSAqLykgb3ZlcnJpZGUgeworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmFpbGVkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIC8qaW5fZXJyb3JDb2RlICovKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhGYWlsZWQoaW5fc2Vzc2lvbklkKSk7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogCi0gICAgU3RhdHVzIG9uQXdhaXROdW1iZXJPZkpvYnNDaGFuZ2VkKGludDMyX3QgLyogaW5fam9iSWQgKi8sIGludDMyX3QgLyogaW5fb2xkQXdhaXROdW1iZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogaW5fbmV3QXdhaXROdW1iZXIgKi8pIG92ZXJyaWRlIHsKKyAgICBTdGF0dXMgb25Bd2FpdE51bWJlck9mU2Vzc2lvbnNDaGFuZ2VkKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9vbGRBd2FpdE51bWJlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLyogaW5fbmV3QXdhaXROdW1iZXIgKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICBTdGF0dXMgb25Qcm9ncmVzc1VwZGF0ZShpbnQzMl90IC8qIGluX2pvYklkICovLCBpbnQzMl90IC8qIGluX3Byb2dyZXNzICovKSBvdmVycmlkZSB7CisgICAgU3RhdHVzIG9uUHJvZ3Jlc3NVcGRhdGUoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sIGludDMyX3QgLyogaW5fcHJvZ3Jlc3MgKi8pIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkgeyBBTE9HSSgiVGVzdENsaWVudCBkZXN0cm95ZWQiKTsgfTsKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIE5vRXZlbnQsCisgICAgICAgICAgICBGaW5pc2hlZCwKKyAgICAgICAgICAgIEZhaWxlZCwKKyAgICAgICAgfSB0eXBlOworICAgICAgICBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZDsKKyAgICB9OwogCi0gICBwcml2YXRlOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IG1TZXJ2aWNlOwotICAgIFRlc3RDbGllbnQoY29uc3QgVGVzdENsaWVudCYpID0gZGVsZXRlOwotICAgIFRlc3RDbGllbnQmIG9wZXJhdG9yPShjb25zdCBUZXN0Q2xpZW50JikgPSBkZWxldGU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBFdmVudCBOb0V2ZW50ID0ge0V2ZW50OjpOb0V2ZW50LCAwfTsKKyNkZWZpbmUgREVDTEFSRV9FVkVOVChhY3Rpb24pIFwKKyAgICBzdGF0aWMgRXZlbnQgYWN0aW9uKFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7IHJldHVybiB7RXZlbnQ6OmFjdGlvbiwgc2Vzc2lvbklkfTsgfQorCisgICAgREVDTEFSRV9FVkVOVChGaW5pc2hlZCk7CisgICAgREVDTEFSRV9FVkVOVChGYWlsZWQpOworCisgICAgY29uc3QgRXZlbnQmIHBvcEV2ZW50KCkgeworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2soY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7CisgICAgVGVzdENsaWVudENhbGxiYWNrJiBvcGVyYXRvcj0oY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7Cit9OworCitib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdENsaWVudENhbGxiYWNrOjpFdmVudCYgbGhzLCBjb25zdCBUZXN0Q2xpZW50Q2FsbGJhY2s6OkV2ZW50JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnNlc3Npb25JZCA9PSByaHMuc2Vzc2lvbklkOworfQorCitzdHJ1Y3QgVGVzdENvbnRyb2xsZXIgOiBwdWJsaWMgQ29udHJvbGxlckNsaWVudEludGVyZmFjZSB7CisgICAgVGVzdENvbnRyb2xsZXIoKSB7IEFMT0dJKCJUZXN0Q29udHJvbGxlciBDcmVhdGVkIik7IH0KKworICAgIHZpcnR1YWwgflRlc3RDb250cm9sbGVyKCkgeyBBTE9HSSgiVGVzdENvbnRyb2xsZXIgRGVzdHJveWVkIik7IH0KKworICAgIGJvb2wgc3VibWl0KENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIHVpZF90IC8qY2FsbGluZ1VpZCovLAorICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBjbGllbnRDYWxsYmFjaykgb3ZlcnJpZGUgeworICAgICAgICBTZXNzaW9uS2V5VHlwZSBzZXNzaW9uS2V5ID0gc3RkOjptYWtlX3BhaXIoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIGlmIChtU2Vzc2lvbnMuY291bnQoc2Vzc2lvbktleSkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWNyZXQgbmFtZSB3ZSdsbCBjaGVjaywgdG8gdGVzdCBlcnJvciBwcm9wYWdhdGlvbiBmcm9tCisgICAgICAgIC8vIHRoZSBjb250cm9sbGVyIGJhY2sgdG8gY2xpZW50LgorICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9PSAiYmFkX3NvdXJjZV9maWxlIikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlcXVlc3QucHJpb3JpdHkgPT0gVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCkgeworICAgICAgICAgICAgY2xpZW50VWlkID0gT0ZGTElORV9VSUQ7CisgICAgICAgIH0KKworICAgICAgICBtU2Vzc2lvbnNbc2Vzc2lvbktleV0ucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIG1TZXNzaW9uc1tzZXNzaW9uS2V5XS5jYWxsYmFjayA9IGNsaWVudENhbGxiYWNrOworICAgICAgICBtU2Vzc2lvbnNbc2Vzc2lvbktleV0uYWxsQ2xpZW50VWlkcy5pbnNlcnQoY2xpZW50VWlkKTsKKworICAgICAgICBtTGFzdFNlc3Npb24gPSBzZXNzaW9uS2V5OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGFkZENsaWVudFVpZChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCB1aWRfdCBjbGllbnRVaWQpIG92ZXJyaWRlIHsKKyAgICAgICAgU2Vzc2lvbktleVR5cGUgc2Vzc2lvbktleSA9IHN0ZDo6bWFrZV9wYWlyKGNsaWVudElkLCBzZXNzaW9uSWQpOworCisgICAgICAgIGlmIChtU2Vzc2lvbnMuY291bnQoc2Vzc2lvbktleSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChtU2Vzc2lvbnNbc2Vzc2lvbktleV0uYWxsQ2xpZW50VWlkcy5jb3VudChjbGllbnRVaWQpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uc1tzZXNzaW9uS2V5XS5hbGxDbGllbnRVaWRzLmluc2VydChjbGllbnRVaWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldENsaWVudFVpZHMoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dF9jbGllbnRVaWRzKSBvdmVycmlkZSB7CisgICAgICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBpZiAobVNlc3Npb25zLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBvdXRfY2xpZW50VWlkcy0+Y2xlYXIoKTsKKyAgICAgICAgZm9yICh1aWRfdCB1aWQgOiBtU2Vzc2lvbnNbc2Vzc2lvbktleV0uYWxsQ2xpZW50VWlkcykgeworICAgICAgICAgICAgaWYgKHVpZCAhPSBPRkZMSU5FX1VJRCkgeworICAgICAgICAgICAgICAgIG91dF9jbGllbnRVaWRzLT5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGNhbmNlbChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIFNlc3Npb25LZXlUeXBlIHNlc3Npb25LZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBpZiAobVNlc3Npb25zLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbnMuZXJhc2Uoc2Vzc2lvbktleSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0U2Vzc2lvbihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwqIHJlcXVlc3QpIG92ZXJyaWRlIHsKKyAgICAgICAgU2Vzc2lvbktleVR5cGUgc2Vzc2lvbktleSA9IHN0ZDo6bWFrZV9wYWlyKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICBpZiAobVNlc3Npb25zLmNvdW50KHNlc3Npb25LZXkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICooVHJhbnNjb2RpbmdSZXF1ZXN0KilyZXF1ZXN0ID0gbVNlc3Npb25zW3Nlc3Npb25LZXldLnJlcXVlc3Q7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZvaWQgZmluaXNoTGFzdFNlc3Npb24oKSB7CisgICAgICAgIGF1dG8gaXQgPSBtU2Vzc2lvbnMuZmluZChtTGFzdFNlc3Npb24pOworICAgICAgICBpZiAoaXQgPT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IGl0LT5zZWNvbmQuY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay0+b25UcmFuc2NvZGluZ0ZpbmlzaGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RTZXNzaW9uLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nUmVzdWx0UGFyY2VsKHttTGFzdFNlc3Npb24uc2Vjb25kLCAwLCBzdGQ6Om51bGxvcHR9KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25zLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB2b2lkIGFib3J0TGFzdFNlc3Npb24oKSB7CisgICAgICAgIGF1dG8gaXQgPSBtU2Vzc2lvbnMuZmluZChtTGFzdFNlc3Npb24pOworICAgICAgICBpZiAoaXQgPT0gbVNlc3Npb25zLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBjbGllbnRDYWxsYmFjayA9IGl0LT5zZWNvbmQuY2FsbGJhY2subG9jaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjay0+b25UcmFuc2NvZGluZ0ZhaWxlZChtTGFzdFNlc3Npb24uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25zLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgU2Vzc2lvbiB7CisgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBzdGQ6OndlYWtfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiBjYWxsYmFjazsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBhbGxDbGllbnRVaWRzOworICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxDbGllbnRJZFR5cGUsIFNlc3Npb25JZFR5cGU+IFNlc3Npb25LZXlUeXBlOworICAgIHN0ZDo6bWFwPFNlc3Npb25LZXlUeXBlLCBTZXNzaW9uPiBtU2Vzc2lvbnM7CisgICAgU2Vzc2lvbktleVR5cGUgbUxhc3RTZXNzaW9uOwogfTsKIAogY2xhc3MgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotICAgcHVibGljOgotICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QoKSA6IG1DbGllbnRNYW5hZ2VyKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSkgeworcHVibGljOgorICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QoKQorICAgICAgICAgIDogbUNvbnRyb2xsZXIobmV3IFRlc3RDb250cm9sbGVyKCkpLAorICAgICAgICAgICAgbUNsaWVudE1hbmFnZXIobmV3IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcihtQ29udHJvbGxlcikpIHsKICAgICAgICAgQUxPR0QoIlRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QgY3JlYXRlZCIpOwogICAgIH0KIAogICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEudHJhbnNjb2RpbmciKSk7Ci0gICAgICAgIG1TZXJ2aWNlID0gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpmcm9tQmluZGVyKGJpbmRlcik7Ci0gICAgICAgIGlmIChtU2VydmljZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIG1lZGlhLnRyYXNjb2Rpbmcgc2VydmljZS4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1UZXN0Q2xpZW50ID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOworICAgICAgICBtQ2xpZW50Q2FsbGJhY2sxID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPigpOworICAgICAgICBtQ2xpZW50Q2FsbGJhY2syID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPigpOworICAgICAgICBtQ2xpZW50Q2FsbGJhY2szID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPigpOwogICAgIH0KIAotICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgICAgIEFMT0dJKCJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0IHRlYXIgZG93biIpOwotICAgICAgICBtU2VydmljZSA9IG51bGxwdHI7Ci0gICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IEFMT0dJKCJUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0IHRlYXIgZG93biIpOyB9CiAKICAgICB+VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCgpIHsgQUxPR0QoIlRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QgZGVzdHJveWVkIik7IH0KIAotICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciYgbUNsaWVudE1hbmFnZXI7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IG1UZXN0Q2xpZW50ID0gbnVsbHB0cjsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlPiBtU2VydmljZSA9IG51bGxwdHI7CisgICAgdm9pZCBhZGRNdWx0aXBsZUNsaWVudHMoKSB7CisgICAgICAgIEVYUEVDVF9FUSgKKyAgICAgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJm1DbGllbnQxKSwKKyAgICAgICAgICAgICAgICBPSyk7CisgICAgICAgIEVYUEVDVF9ORShtQ2xpZW50MSwgbnVsbHB0cik7CisKKyAgICAgICAgRVhQRUNUX0VRKAorICAgICAgICAgICAgICAgIG1DbGllbnRNYW5hZ2VyLT5hZGRDbGllbnQobUNsaWVudENhbGxiYWNrMiwga0NsaWVudE5hbWUsIGtDbGllbnRQYWNrYWdlLCAmbUNsaWVudDIpLAorICAgICAgICAgICAgICAgIE9LKTsKKyAgICAgICAgRVhQRUNUX05FKG1DbGllbnQyLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICAgICAgbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2szLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZtQ2xpZW50MyksCisgICAgICAgICAgICAgICAgT0spOworICAgICAgICBFWFBFQ1RfTkUobUNsaWVudDMsIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDMpOworICAgIH0KKworICAgIHZvaWQgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnVucmVnaXN0ZXIoKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+dW5yZWdpc3RlcigpLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1DbGllbnQzLT51bnJlZ2lzdGVyKCkuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1DbGllbnRNYW5hZ2VyLT5nZXROdW1PZkNsaWVudHMoKSwgMCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDb250cm9sbGVyPiBtQ29udHJvbGxlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyPiBtQ2xpZW50TWFuYWdlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBtQ2xpZW50MTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBtQ2xpZW50MjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBtQ2xpZW50MzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50Q2FsbGJhY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRDYWxsYmFjaz4gbUNsaWVudENhbGxiYWNrMzsKIH07CiAKLVRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nV2l0aEludmFsaWRDbGllbnRJZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotCi0gICAgLy8gQ3JlYXRlIGEgY2xpZW50IHdpdGggaW52YWxpZCBjbGllbnQgaWQuCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4gY2xpZW50SW5mbyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudCwga0ludmFsaWRDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgLy8gQWRkIHRoZSBjbGllbnQgdG8gdGhlIG1hbmFnZXIgYW5kIGV4cGVjdCBmYWlsdXJlLgotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLmFkZENsaWVudChzdGQ6Om1vdmUoY2xpZW50SW5mbykpOwotICAgIEVYUEVDVF9UUlVFKGVyciAhPSBPSyk7CitURVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50Q2FsbGJhY2spIHsKKyAgICAvLyBBZGQgYSBjbGllbnQgd2l0aCBudWxsIGNhbGxiYWNrIGFuZCBleHBlY3QgZmFpbHVyZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisgICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChudWxscHRyLCBrQ2xpZW50TmFtZSwga0NsaWVudFBhY2thZ2UsICZjbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCk7CiB9CisvLworLy9URVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50UGlkKSB7CisvLyAgICAvLyBBZGQgYSBjbGllbnQgd2l0aCBpbnZhbGlkIFBpZCBhbmQgZXhwZWN0IGZhaWx1cmUuCisvLyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisvLyAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJmNsaWVudCk7CisvLyAgICBFWFBFQ1RfRVEoZXJyLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOworLy99CiAKLVRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nV2l0aEludmFsaWRDbGllbnRQaWQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLQotICAgIC8vIENyZWF0ZSBhIGNsaWVudCB3aXRoIGludmFsaWQgUGlkLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQsIGtDbGllbnRJZCwga0ludmFsaWRDbGllbnRQaWQsIGtDbGllbnRVaWQsIGtDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIC8vIEFkZCB0aGUgY2xpZW50IHRvIHRoZSBtYW5hZ2VyIGFuZCBleHBlY3QgZmFpbHVyZS4KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKGNsaWVudEluZm8pKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOwotfQotCi1URVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1dpdGhJbnZhbGlkQ2xpZW50VWlkKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBjbGllbnQgd2l0aCBpbnZhbGlkIFVpZC4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBjbGllbnRJbmZvID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBrQ2xpZW50SWQsIGtDbGllbnRQaWQsIGtJbnZhbGlkQ2xpZW50VWlkLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSk7Ci0KLSAgICAvLyBBZGQgdGhlIGNsaWVudCB0byB0aGUgbWFuYWdlciBhbmQgZXhwZWN0IGZhaWx1cmUuCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyICE9IE9LKTsKK1RFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkaW5nV2l0aEludmFsaWRDbGllbnROYW1lKSB7CisgICAgLy8gQWRkIGEgY2xpZW50IHdpdGggaW52YWxpZCBuYW1lIGFuZCBleHBlY3QgZmFpbHVyZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisgICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXItPmFkZENsaWVudChtQ2xpZW50Q2FsbGJhY2sxLCBrSW52YWxpZENsaWVudE5hbWUsIGtDbGllbnRQYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UKTsKIH0KIAogVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdXaXRoSW52YWxpZENsaWVudFBhY2thZ2VOYW1lKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBjbGllbnQgd2l0aCBpbnZhbGlkIHBhY2thZ2VuYW1lLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8gPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQsIGtDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0ludmFsaWRDbGllbnRPcFBhY2thZ2VOYW1lKTsKLQotICAgIC8vIEFkZCB0aGUgY2xpZW50IHRvIHRoZSBtYW5hZ2VyIGFuZCBleHBlY3QgZmFpbHVyZS4KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKGNsaWVudEluZm8pKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOworICAgIC8vIEFkZCBhIGNsaWVudCB3aXRoIGludmFsaWQgcGFja2FnZW5hbWUgYW5kIGV4cGVjdCBmYWlsdXJlLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsIGtDbGllbnROYW1lLCBrSW52YWxpZENsaWVudFBhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpZW50KTsKKyAgICBFWFBFQ1RfRVEoZXJyLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwogfQogCiBURVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZGluZ1ZhbGlkQ2xpZW50KSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudDEgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOworICAgIC8vIEFkZCBhIHZhbGlkIGNsaWVudCwgc2hvdWxkIHN1Y2NlZWQuCisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgT0spOworICAgIEVYUEVDVF9ORShjbGllbnQuZ2V0KCksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDEpOwogCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4gY2xpZW50SW5mbyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudDEsIGtDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKLQotICAgIHNpemVfdCBudW1PZkNsaWVudHMgPSBtQ2xpZW50TWFuYWdlci5nZXROdW1PZkNsaWVudHMoKTsKLSAgICBFWFBFQ1RfRVEobnVtT2ZDbGllbnRzLCAxKTsKLQotICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLnJlbW92ZUNsaWVudChrQ2xpZW50SWQpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7CisgICAgLy8gVW5yZWdpc3RlciBjbGllbnQsIHNob3VsZCBzdWNjZWVkLgorICAgIFN0YXR1cyBzdGF0dXMgPSBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAwKTsKIH0KIAogVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdEdXBsaWFjdGVDbGllbnQpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50MSA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgT0spOworICAgIEVYUEVDVF9ORShjbGllbnQuZ2V0KCksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDEpOwogCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4gY2xpZW50SW5mbyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudDEsIGtDbGllbnRJZCwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGR1cENsaWVudDsKKyAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsICJkdXBDbGllbnQiLCAiZHVwUGFja2FnZSIsICZkdXBDbGllbnQpOworICAgIEVYUEVDVF9FUShlcnIsIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgIEVYUEVDVF9FUShkdXBDbGllbnQuZ2V0KCksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDEpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gY2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnRNYW5hZ2VyLT5nZXROdW1PZkNsaWVudHMoKSwgMCk7CiAKLSAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKGNsaWVudEluZm8pKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOworICAgIGVyciA9IG1DbGllbnRNYW5hZ2VyLT5hZGRDbGllbnQobUNsaWVudENhbGxiYWNrMSwgImR1cENsaWVudCIsICJkdXBQYWNrYWdlIiwgJmR1cENsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgT0spOworICAgIEVYUEVDVF9ORShkdXBDbGllbnQuZ2V0KCksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtQ2xpZW50TWFuYWdlci0+Z2V0TnVtT2ZDbGllbnRzKCksIDEpOwogCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIucmVtb3ZlQ2xpZW50KGtDbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKKyAgICBzdGF0dXMgPSBkdXBDbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpLCAwKTsKIH0KIAogVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RBZGRpbmdNdWx0aXBsZUNsaWVudCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQxID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8xID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50MSwga0NsaWVudElkLCBrQ2xpZW50UGlkLCBrQ2xpZW50VWlkLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKGNsaWVudEluZm8xKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKLQotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQyID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8yID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50Miwga0NsaWVudElkICsgMSwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvMikpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7Ci0KLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50MyA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0KLSAgICAvLyBDcmVhdGUgYSBjbGllbnQgd2l0aCBpbnZhbGlkIHBhY2thZ2VuYW1lLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+IGNsaWVudEluZm8zID0KLSAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPigKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50Mywga0NsaWVudElkICsgMiwga0NsaWVudFBpZCwga0NsaWVudFVpZCwga0NsaWVudE9wUGFja2FnZU5hbWUpOwotCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvMykpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7Ci0KLSAgICBzaXplX3QgbnVtT2ZDbGllbnRzID0gbUNsaWVudE1hbmFnZXIuZ2V0TnVtT2ZDbGllbnRzKCk7Ci0gICAgRVhQRUNUX0VRKG51bU9mQ2xpZW50cywgMyk7Ci0KLSAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoa0NsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgPT0gT0spOwotCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIucmVtb3ZlQ2xpZW50KGtDbGllbnRJZCArIDEpOwotICAgIEVYUEVDVF9UUlVFKGVyciA9PSBPSyk7Ci0KLSAgICBlcnIgPSBtQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoa0NsaWVudElkICsgMik7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKKyAgICBhZGRNdWx0aXBsZUNsaWVudHMoKTsKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CiB9CiAKLVRFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0UmVtb3ZpbmdOb25FeGlzdENsaWVudCkgewotICAgIHN0YXR1c190IGVyciA9IG1DbGllbnRNYW5hZ2VyLnJlbW92ZUNsaWVudChrSW52YWxpZENsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShlcnIgIT0gT0spOworVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RTdWJtaXRDYW5jZWxHZXRTZXNzaW9ucykgeworICAgIGFkZE11bHRpcGxlQ2xpZW50cygpOwogCi0gICAgZXJyID0gbUNsaWVudE1hbmFnZXIucmVtb3ZlQ2xpZW50KDEwMDAgLyogY2xpZW50SWQgKi8pOwotICAgIEVYUEVDVF9UUlVFKGVyciAhPSBPSyk7CisgICAgLy8gVGVzdCBzZXNzaW9uSWQgYXNzaWdubWVudC4KKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgcmVxdWVzdDsKKyAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMCI7CisgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzaW50YWlvbl9maWxlXzAiOworICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uOworICAgIGJvb2wgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDApKTsKKworICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8xIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXNpbnRhaW9uX2ZpbGVfMSI7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMSkpOworCisgICAgcmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9ICJ0ZXN0X3NvdXJjZV9maWxlXzIiOworICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9ICJ0ZXN0X2Rlc2ludGFpb25fZmlsZV8yIjsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigyKSk7CisKKyAgICAvLyBUZXN0IHN1Ym1pdCBiYWQgcmVxdWVzdCAobm8gdmFsaWQgc291cmNlRmlsZVBhdGgpIGZhaWxzLgorICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCBiYWRSZXF1ZXN0OworICAgIGJhZFJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAiYmFkX3NvdXJjZV9maWxlIjsKKyAgICBiYWRSZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAiYmFkX2Rlc3RpbmF0aW9uX2ZpbGUiOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KGJhZFJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBzdWJtaXQgd2l0aCBiYWQgcGlkL3VpZC4KKyAgICBiYWRSZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMyI7CisgICAgYmFkUmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzaW50YWlvbl9maWxlXzMiOworICAgIGJhZFJlcXVlc3QuY2xpZW50UGlkID0ga0ludmFsaWRDbGllbnRQaWQ7CisgICAgYmFkUmVxdWVzdC5jbGllbnRVaWQgPSBrSW52YWxpZENsaWVudFVpZDsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChiYWRSZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb25zIGJ5IGlkLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uV2l0aElkKFNFU1NJT04oMiksICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigyKSk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24ucmVxdWVzdC5zb3VyY2VGaWxlUGF0aCwgInRlc3Rfc291cmNlX2ZpbGVfMiIpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9ucyBieSBpbnZhbGlkIGlkIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uV2l0aElkKFNFU1NJT04oMTAwKSwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCBub24tZXhpc3RlbnQgc2Vzc2lvbiBmYWlsLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMTAwKSwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKworICAgIC8vIFRlc3QgY2FuY2VsIHZhbGlkIHNlc3Npb25JZCBpbiBhcmJpdHJhcnkgb3JkZXIuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigyKSwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigwKSwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigxKSwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBjYW5jZWwgc2Vzc2lvbiBhZ2FpbiBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsU2Vzc2lvbihTRVNTSU9OKDEpLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9GQUxTRShyZXN1bHQpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBjYW5jZWwgZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb25XaXRoSWQoU0VTU0lPTigyKSwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCk7CisKKyAgICAvLyBUZXN0IHNlc3Npb25JZCBpbmRlcGVuZGVuY2UgZm9yIGVhY2ggY2xpZW50LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDApKTsKKworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDEpKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKIH0KIAotVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RDaGVja0NsaWVudFdpdGhDbGllbnRJZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOworVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RDbGllbnRDYWxsYmFjaykgeworICAgIGFkZE11bHRpcGxlQ2xpZW50cygpOwogCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4gY2xpZW50SW5mbyA9Ci0gICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjo6Q2xpZW50SW5mbz4oCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudCwga0NsaWVudElkLCBrQ2xpZW50UGlkLCBrQ2xpZW50VWlkLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSk7CisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisgICAgcmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9ICJ0ZXN0X3NvdXJjZV9maWxlX25hbWUiOworICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9ICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfbmFtZSI7CisgICAgVHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsIHNlc3Npb247CisgICAgYm9vbCByZXN1bHQ7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMCkpOwogCi0gICAgc3RhdHVzX3QgZXJyID0gbUNsaWVudE1hbmFnZXIuYWRkQ2xpZW50KHN0ZDo6bW92ZShjbGllbnRJbmZvKSk7Ci0gICAgRVhQRUNUX1RSVUUoZXJyID09IE9LKTsKKyAgICBtQ29udHJvbGxlci0+ZmluaXNoTGFzdFNlc3Npb24oKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudENhbGxiYWNrMS0+cG9wRXZlbnQoKSwgVGVzdENsaWVudENhbGxiYWNrOjpGaW5pc2hlZChzZXNzaW9uLnNlc3Npb25JZCkpOwogCi0gICAgYm9vbCByZXMgPSBtQ2xpZW50TWFuYWdlci5pc0NsaWVudElkUmVnaXN0ZXJlZChrQ2xpZW50SWQpOwotICAgIEVYUEVDVF9UUlVFKHJlcyk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIFNFU1NJT04oMSkpOwogCi0gICAgcmVzID0gbUNsaWVudE1hbmFnZXIuaXNDbGllbnRJZFJlZ2lzdGVyZWQoa0ludmFsaWRDbGllbnRJZCk7Ci0gICAgRVhQRUNUX0ZBTFNFKHJlcyk7CisgICAgbUNvbnRyb2xsZXItPmFib3J0TGFzdFNlc3Npb24oKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudENhbGxiYWNrMS0+cG9wRXZlbnQoKSwgVGVzdENsaWVudENhbGxiYWNrOjpGYWlsZWQoc2Vzc2lvbi5zZXNzaW9uSWQpKTsKKworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDIpKTsKKworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KS5pc09rKCkpOworICAgIEVYUEVDVF9UUlVFKHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDApKTsKKworICAgIG1Db250cm9sbGVyLT5maW5pc2hMYXN0U2Vzc2lvbigpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Q2FsbGJhY2syLT5wb3BFdmVudCgpLCBUZXN0Q2xpZW50Q2FsbGJhY2s6OkZpbmlzaGVkKHNlc3Npb24uc2Vzc2lvbklkKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorVEVTVF9GKFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlclRlc3QsIFRlc3RVc2VBZnRlclVucmVnaXN0ZXIpIHsKKyAgICAvLyBBZGQgYSBjbGllbnQuCisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KG1DbGllbnRDYWxsYmFjazEsIGtDbGllbnROYW1lLCBrQ2xpZW50UGFja2FnZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX0VRKGVyciwgT0spOworICAgIEVYUEVDVF9ORShjbGllbnQuZ2V0KCksIG51bGxwdHIpOworCisgICAgLy8gU3VibWl0IDIgcmVxdWVzdHMsIDEgb2ZmbGluZSBhbmQgMSByZWFsdGltZS4KKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgcmVxdWVzdDsKKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICBib29sIHJlc3VsdDsKKworICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8wIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiOworICAgIHJlcXVlc3QucHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a1Vuc3BlY2lmaWVkOworICAgIEVYUEVDVF9UUlVFKGNsaWVudC0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpICYmIHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKHNlc3Npb24uc2Vzc2lvbklkLCBTRVNTSU9OKDApKTsKKworICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8xIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzEiOworICAgIHJlcXVlc3QucHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbDsKKyAgICBFWFBFQ1RfVFJVRShjbGllbnQtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSAmJiByZXN1bHQpOworICAgIEVYUEVDVF9FUShzZXNzaW9uLnNlc3Npb25JZCwgU0VTU0lPTigxKSk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGNsaWVudCwgc2hvdWxkIHN1Y2NlZWQuCisgICAgU3RhdHVzIHN0YXR1cyA9IGNsaWVudC0+dW5yZWdpc3RlcigpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgICAgLy8gVGVzdCBzdWJtaXQgbmV3IHJlcXVlc3QgYWZ0ZXIgdW5yZWdpc3Rlciwgc2hvdWxkIGZhaWwgd2l0aCBFUlJPUl9ESVNDT05ORUNURUQuCisgICAgcmVxdWVzdC5zb3VyY2VGaWxlUGF0aCA9ICJ0ZXN0X3NvdXJjZV9maWxlXzIiOworICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9ICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiI7CisgICAgcmVxdWVzdC5wcmlvcml0eSA9IFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsOworICAgIHN0YXR1cyA9IGNsaWVudC0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgLy8gVGVzdCBjYW5jZWwgc2Vzc2lvbnMgYWZ0ZXIgdW5yZWdpc3Rlciwgc2hvdWxkIGZhaWwgd2l0aCBFUlJPUl9ESVNDT05ORUNURUQKKyAgICAvLyByZWdhcmRsZXNzIG9mIHJlYWx0aW1lIG9yIG9mZmxpbmUgc2Vzc2lvbiwgb3Igd2hldGhlciB0aGUgc2Vzc2lvbklkIGlzIHZhbGlkLgorICAgIHN0YXR1cyA9IGNsaWVudC0+Y2FuY2VsU2Vzc2lvbihTRVNTSU9OKDApLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICBzdGF0dXMgPSBjbGllbnQtPmNhbmNlbFNlc3Npb24oU0VTU0lPTigxKSwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgc3RhdHVzID0gY2xpZW50LT5jYW5jZWxTZXNzaW9uKFNFU1NJT04oMiksICZyZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb25zLCBzaG91bGQgZmFpbCB3aXRoIEVSUk9SX0RJU0NPTk5FQ1RFRCByZWdhcmRsZXNzIG9mIHJlYWx0aW1lCisgICAgLy8gb3Igb2ZmbGluZSBzZXNzaW9uLCBvciB3aGV0aGVyIHRoZSBzZXNzaW9uSWQgaXMgdmFsaWQuCisgICAgc3RhdHVzID0gY2xpZW50LT5nZXRTZXNzaW9uV2l0aElkKFNFU1NJT04oMCksICZzZXNzaW9uLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCk7CisKKyAgICBzdGF0dXMgPSBjbGllbnQtPmdldFNlc3Npb25XaXRoSWQoU0VTU0lPTigxKSwgJnNlc3Npb24sICZyZXN1bHQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKKworICAgIHN0YXR1cyA9IGNsaWVudC0+Z2V0U2Vzc2lvbldpdGhJZChTRVNTSU9OKDIpLCAmc2Vzc2lvbiwgJnJlc3VsdCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyVGVzdCwgVGVzdEFkZEdldENsaWVudFVpZHNJbnZhbGlkQXJncykgeworICAgIGFkZE11bHRpcGxlQ2xpZW50cygpOworCisgICAgYm9vbCByZXN1bHQ7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4gY2xpZW50VWlkczsKKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgcmVxdWVzdDsKKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICB1aWRfdCBvd25VaWQgPSA6OmdldHVpZCgpOworCisgICAgLy8gQWRkL0dldCBjbGllbnRzIHdpdGggaW52YWxpZCBzZXNzaW9uIGlkIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5hZGRDbGllbnRVaWQoLTEsIG93blVpZCwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+YWRkQ2xpZW50VWlkKFNFU1NJT04oMCksIG93blVpZCwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0Q2xpZW50VWlkcygtMSwgJmNsaWVudFVpZHMpLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMsIHN0ZDo6bnVsbG9wdCk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldENsaWVudFVpZHMoU0VTU0lPTigwKSwgJmNsaWVudFVpZHMpLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMsIHN0ZDo6bnVsbG9wdCk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXJUZXN0LCBUZXN0QWRkR2V0Q2xpZW50VWlkcykgeworICAgIGFkZE11bHRpcGxlQ2xpZW50cygpOworCisgICAgYm9vbCByZXN1bHQ7CisgICAgc3RkOjpvcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQzMl90Pj4gY2xpZW50VWlkczsKKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgcmVxdWVzdDsKKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICB1aWRfdCBvd25VaWQgPSA6OmdldHVpZCgpOworCisgICAgLy8gU3VibWl0IG9uZSByZWFsLXRpbWUgc2Vzc2lvbi4KKyAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gInRlc3Rfc291cmNlX2ZpbGVfMCI7CisgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkZpbGVQYXRoID0gInRlc3RfZGVzaW50YWlvbl9maWxlXzAiOworICAgIHJlcXVlc3QucHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbDsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAmc2Vzc2lvbiwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworCisgICAgLy8gU2hvdWxkIGhhdmUgb3duIHVpZCBpbiBjbGllbnQgdWlkIGxpc3QuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldENsaWVudFVpZHMoU0VTU0lPTigwKSwgJmNsaWVudFVpZHMpLmlzT2soKSk7CisgICAgRVhQRUNUX05FKGNsaWVudFVpZHMsIHN0ZDo6bnVsbG9wdCk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMtPnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKCgqY2xpZW50VWlkcylbMF0sIG93blVpZCk7CisKKyAgICAvLyBBZGRpbmcgaW52YWxpZCBjbGllbnQgdWlkIHNob3VsZCBmYWlsLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5hZGRDbGllbnRVaWQoU0VTU0lPTigwKSwga0ludmFsaWRDbGllbnRVaWQsICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlc3VsdCk7CisKKyAgICAvLyBBZGRpbmcgb3duIHVpZCBhZ2FpbiBzaG91bGQgZmFpbC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+YWRkQ2xpZW50VWlkKFNFU1NJT04oMCksIG93blVpZCwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVzdWx0KTsKKworICAgIC8vIFN1Ym1pdCBvbmUgb2ZmbGluZSBzZXNzaW9uLgorICAgIHJlcXVlc3Quc291cmNlRmlsZVBhdGggPSAidGVzdF9zb3VyY2VfZmlsZV8xIjsKKyAgICByZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPSAidGVzdF9kZXNpbnRhaW9uX2ZpbGVfMSI7CisgICAgcmVxdWVzdC5wcmlvcml0eSA9IFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQ7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdFJlcXVlc3QocmVxdWVzdCwgJnNlc3Npb24sICZyZXN1bHQpLmlzT2soKSk7CisgICAgRVhQRUNUX1RSVUUocmVzdWx0KTsKKworICAgIC8vIFNob3VsZCBub3QgaGF2ZSBvd24gdWlkIGluIGNsaWVudCB1aWQgbGlzdC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0Q2xpZW50VWlkcyhTRVNTSU9OKDEpLCAmY2xpZW50VWlkcykuaXNPaygpKTsKKyAgICBFWFBFQ1RfTkUoY2xpZW50VWlkcywgc3RkOjpudWxsb3B0KTsKKyAgICBFWFBFQ1RfRVEoY2xpZW50VWlkcy0+c2l6ZSgpLCAwKTsKKworICAgIC8vIEFkZCBvd24gdWlkICh3aXRoIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6VVNFX0NBTExJTkdfVUlEKSBhZ2Fpbiwgc2hvdWxkIHN1Y2NlZWQuCisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50MS0+YWRkQ2xpZW50VWlkKFNFU1NJT04oMSksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAmcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRDbGllbnRVaWRzKFNFU1NJT04oMSksICZjbGllbnRVaWRzKS5pc09rKCkpOworICAgIEVYUEVDVF9ORShjbGllbnRVaWRzLCBzdGQ6Om51bGxvcHQpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzLT5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUSgoKmNsaWVudFVpZHMpWzBdLCBvd25VaWQpOworCisgICAgLy8gQWRkIG1vcmUgdWlkcywgc2hvdWxkIHN1Y2NlZWQuCisgICAgaW50MzJfdCBrRmFrZVVpZCA9IDo6Z2V0dWlkKCkgXiAweDE7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmFkZENsaWVudFVpZChTRVNTSU9OKDEpLCBrRmFrZVVpZCwgJnJlc3VsdCkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShyZXN1bHQpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRDbGllbnRVaWRzKFNFU1NJT04oMSksICZjbGllbnRVaWRzKS5pc09rKCkpOworICAgIEVYUEVDVF9ORShjbGllbnRVaWRzLCBzdGQ6Om51bGxvcHQpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gdWlkU2V0OworICAgIHVpZFNldC5pbnNlcnQoY2xpZW50VWlkcy0+YmVnaW4oKSwgY2xpZW50VWlkcy0+ZW5kKCkpOworICAgIEVYUEVDVF9FUSh1aWRTZXQuc2l6ZSgpLCAyKTsKKyAgICBFWFBFQ1RfRVEodWlkU2V0LmNvdW50KG93blVpZCksIDEpOworICAgIEVYUEVDVF9FUSh1aWRTZXQuY291bnQoa0Zha2VVaWQpLCAxKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdMb2dnZXJfdGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ0xvZ2dlcl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNWNkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdMb2dnZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBUcmFuc2NvZGluZ0xvZ2dlcgorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ0xvZ2dlclRlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdMb2dnZXIuaD4KKyNpbmNsdWRlIDxzdGF0c2xvZ19tZWRpYS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFJlYXNvbiA9IFRyYW5zY29kaW5nTG9nZ2VyOjpTZXNzaW9uRW5kZWRSZWFzb247CisKKy8vIERhdGEgc3RydWN0dXJlIGNvcnJlc3BvbmRpbmcgdG8gTWVkaWFUcmFuc2NvZGluZ0VuZGVkIGF0b20uCitzdHJ1Y3QgU2Vzc2lvbkVuZGVkQXRvbSB7CisgICAgU2Vzc2lvbkVuZGVkQXRvbShpbnQzMl90IGF0b21Db2RlLCBpbnQzMl90IHJlYXNvbiwgaW50MzJfdCBjYWxsaW5nVWlkLCBpbnQzMl90IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNjb2RlckZwcywgaW50MzJfdCBzcmNXaWR0aCwgaW50MzJfdCBzcmNIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzcmNNaW1lLCBpbnQzMl90IHNyY1Byb2ZpbGUsIGludDMyX3Qgc3JjTGV2ZWwsIGludDMyX3Qgc3JjRnBzLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNEdXJhdGlvbk1zLCBib29sIHNyY0lzSGRyLCBpbnQzMl90IGRzdFdpZHRoLCBpbnQzMl90IGRzdEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGRzdE1pbWUsIGJvb2wgZHN0SXNIZHIpCisgICAgICAgICAgOiBhdG9tQ29kZShhdG9tQ29kZSksCisgICAgICAgICAgICByZWFzb24ocmVhc29uKSwKKyAgICAgICAgICAgIGNhbGxpbmdVaWQoY2FsbGluZ1VpZCksCisgICAgICAgICAgICBzdGF0dXMoc3RhdHVzKSwKKyAgICAgICAgICAgIHRyYW5zY29kZXJGcHModHJhbnNjb2RlckZwcyksCisgICAgICAgICAgICBzcmNXaWR0aChzcmNXaWR0aCksCisgICAgICAgICAgICBzcmNIZWlnaHQoc3JjSGVpZ2h0KSwKKyAgICAgICAgICAgIHNyY01pbWUoc3JjTWltZSksCisgICAgICAgICAgICBzcmNQcm9maWxlKHNyY1Byb2ZpbGUpLAorICAgICAgICAgICAgc3JjTGV2ZWwoc3JjTGV2ZWwpLAorICAgICAgICAgICAgc3JjRnBzKHNyY0ZwcyksCisgICAgICAgICAgICBzcmNEdXJhdGlvbk1zKHNyY0R1cmF0aW9uTXMpLAorICAgICAgICAgICAgc3JjSXNIZHIoc3JjSXNIZHIpLAorICAgICAgICAgICAgZHN0V2lkdGgoZHN0V2lkdGgpLAorICAgICAgICAgICAgZHN0SGVpZ2h0KGRzdEhlaWdodCksCisgICAgICAgICAgICBkc3RNaW1lKGRzdE1pbWUpLAorICAgICAgICAgICAgZHN0SXNIZHIoZHN0SXNIZHIpIHt9CisKKyAgICBpbnQzMl90IGF0b21Db2RlOworICAgIGludDMyX3QgcmVhc29uOworICAgIGludDMyX3QgY2FsbGluZ1VpZDsKKyAgICBpbnQzMl90IHN0YXR1czsKKyAgICBpbnQzMl90IHRyYW5zY29kZXJGcHM7CisgICAgaW50MzJfdCBzcmNXaWR0aDsKKyAgICBpbnQzMl90IHNyY0hlaWdodDsKKyAgICBzdGQ6OnN0cmluZyBzcmNNaW1lOworICAgIGludDMyX3Qgc3JjUHJvZmlsZTsKKyAgICBpbnQzMl90IHNyY0xldmVsOworICAgIGludDMyX3Qgc3JjRnBzOworICAgIGludDMyX3Qgc3JjRHVyYXRpb25NczsKKyAgICBib29sIHNyY0lzSGRyOworICAgIGludDMyX3QgZHN0V2lkdGg7CisgICAgaW50MzJfdCBkc3RIZWlnaHQ7CisgICAgc3RkOjpzdHJpbmcgZHN0TWltZTsKKyAgICBib29sIGRzdElzSGRyOworfTsKKworLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uIHZhbHVlcy4KK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdENhbGxpbmdVaWQgPSAxOworc3RhdGljIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIGtEZWZhdWx0VHJhbnNjb2RlRHVyYXRpb24gPSBzdGQ6OmNocm9ubzo6c2Vjb25kc3syfTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U3JjV2lkdGggPSAxOTIwOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U3JjSGVpZ2h0ID0gMTA4MDsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGVmYXVsdFNyY01pbWV7QU1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkN9Oworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U3JjUHJvZmlsZSA9IDE7ICAgIC8vIEhFVkMgTWFpbgorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U3JjTGV2ZWwgPSA2NTUzNjsgIC8vIEhFVkNNYWluVGllckxldmVsNTEKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdFNyY0ZwcyA9IDMwOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U3JjRnJhbWVDb3VudCA9IDEyMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrRGVmYXVsdFNyY0R1cmF0aW9uVXMgPSAxMDAwMDAwICoga0RlZmF1bHRTcmNGcmFtZUNvdW50IC8ga0RlZmF1bHRTcmNGcHM7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdERzdFdpZHRoID0gMTI4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdERzdEhlaWdodCA9IDcyMDsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGVmYXVsdERzdE1pbWV7QU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQ307CisKKy8vIFV0aWwgZm9yIGNyZWF0aW5nIGEgZGVmYXVsdCBzb3VyY2UgdmlkZW8gZm9ybWF0Lgorc3RhdGljIEFNZWRpYUZvcm1hdCogQ3JlYXRlU3JjRm9ybWF0KCkgeworICAgIEFNZWRpYUZvcm1hdCogZm10ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmbXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIGtEZWZhdWx0U3JjV2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmbXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBrRGVmYXVsdFNyY0hlaWdodCk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmbXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwga0RlZmF1bHRTcmNNaW1lLmNfc3RyKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmbXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwga0RlZmF1bHRTcmNQcm9maWxlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBrRGVmYXVsdFNyY0xldmVsKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGtEZWZhdWx0U3JjRnBzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCBrRGVmYXVsdFNyY0ZyYW1lQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChmbXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGtEZWZhdWx0U3JjRHVyYXRpb25Vcyk7CisgICAgcmV0dXJuIGZtdDsKK30KKworLy8gVXRpbCBmb3IgY3JlYXRpbmcgYSBkZWZhdWx0IGRlc3RpbmF0aW9uIHZpZGVvIGZvcm1hdC4KK3N0YXRpYyBBTWVkaWFGb3JtYXQqIENyZWF0ZURzdEZvcm1hdCgpIHsKKyAgICBBTWVkaWFGb3JtYXQqIGZtdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBrRGVmYXVsdERzdFdpZHRoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwga0RlZmF1bHREc3RIZWlnaHQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm10LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIGtEZWZhdWx0RHN0TWltZS5jX3N0cigpKTsKKyAgICByZXR1cm4gZm10OworfQorCitjbGFzcyBUcmFuc2NvZGluZ0xvZ2dlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBUcmFuc2NvZGluZ0xvZ2dlclRlc3QoKSB7IEFMT0dJKCJUcmFuc2NvZGluZ0xvZ2dlclRlc3QgY3JlYXRlZCIpOyB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBBTE9HSSgiVHJhbnNjb2RpbmdMb2dnZXJUZXN0IHNldCB1cCIpOworICAgICAgICBtTG9nZ2VyLnJlc2V0KG5ldyBUcmFuc2NvZGluZ0xvZ2dlcigpKTsKKyAgICAgICAgbUxvZ2dlZEF0b21zLmNsZWFyKCk7CisgICAgICAgIG1TcmNGb3JtYXQucmVzZXQoKTsKKyAgICAgICAgbURzdEZvcm1hdC5yZXNldCgpOworCisgICAgICAgIC8vIFNldCBhIGN1c3RvbSBhdG9tIHdyaXRlciB0aGF0IHNhdmVzIGFsbCBkYXRhLCBzbyB0aGUgdGVzdCBjYW4gdmFsaWRhdGUgaXQgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgbUxvZ2dlci0+c2V0U2Vzc2lvbkVuZGVkQXRvbVdyaXRlcigKKyAgICAgICAgICAgICAgICBbPV0oaW50MzJfdCBhdG9tQ29kZSwgaW50MzJfdCByZWFzb24sIGludDMyX3QgY2FsbGluZ1VpZCwgaW50MzJfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNjb2RlckZwcywgaW50MzJfdCBzcmNXaWR0aCwgaW50MzJfdCBzcmNIZWlnaHQsIGNoYXIgY29uc3QqIHNyY01pbWUsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjUHJvZmlsZSwgaW50MzJfdCBzcmNMZXZlbCwgaW50MzJfdCBzcmNGcHMsIGludDMyX3Qgc3JjRHVyYXRpb25NcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzcmNJc0hkciwgaW50MzJfdCBkc3RXaWR0aCwgaW50MzJfdCBkc3RIZWlnaHQsIGNoYXIgY29uc3QqIGRzdE1pbWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZHN0SXNIZHIpIC0+IGludCB7CisgICAgICAgICAgICAgICAgICAgIG1Mb2dnZWRBdG9tcy5lbXBsYWNlX2JhY2soYXRvbUNvZGUsIHJlYXNvbiwgY2FsbGluZ1VpZCwgc3RhdHVzLCB0cmFuc2NvZGVyRnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsIHNyY01pbWUsIHNyY1Byb2ZpbGUsIHNyY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Zwcywgc3JjRHVyYXRpb25Ncywgc3JjSXNIZHIsIGRzdFdpZHRoLCBkc3RIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWltZSwgZHN0SXNIZHIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICB2b2lkIGxvZ1Nlc3Npb24oY29uc3Qgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCYgdGltZSwgUmVhc29uIHJlYXNvbiwgaW50IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBzcmNGb3JtYXQsIEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KSB7CisgICAgICAgIG1Mb2dnZXItPmxvZ1Nlc3Npb25FbmRlZCh0aW1lLCByZWFzb24sIGtEZWZhdWx0Q2FsbGluZ1VpZCwgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRUcmFuc2NvZGVEdXJhdGlvbiwgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOworICAgIH0KKworICAgIHZvaWQgbG9nU2Vzc2lvbihjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50JiB0aW1lLCBSZWFzb24gcmVhc29uLCBpbnQgc3RhdHVzKSB7CisgICAgICAgIGlmICghbVNyY0Zvcm1hdCkgeworICAgICAgICAgICAgbVNyY0Zvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KENyZWF0ZVNyY0Zvcm1hdCgpLCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRHN0Rm9ybWF0KSB7CisgICAgICAgICAgICBtRHN0Rm9ybWF0ID0gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oQ3JlYXRlRHN0Rm9ybWF0KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICAgICAgfQorICAgICAgICBsb2dTZXNzaW9uKHRpbWUsIHJlYXNvbiwgc3RhdHVzLCBtU3JjRm9ybWF0LmdldCgpLCBtRHN0Rm9ybWF0LmdldCgpKTsKKyAgICB9CisKKyAgICB2b2lkIGxvZ1Nlc3Npb25GaW5pc2hlZChjb25zdCBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50JiB0aW1lKSB7CisgICAgICAgIGxvZ1Nlc3Npb24odGltZSwgUmVhc29uOjpGSU5JU0hFRCwgMCk7CisgICAgfQorCisgICAgdm9pZCBsb2dTZXNzaW9uRmFpbGVkKGNvbnN0IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQmIHRpbWUpIHsKKyAgICAgICAgbG9nU2Vzc2lvbih0aW1lLCBSZWFzb246OkVSUk9SLCBBTUVESUFfRVJST1JfVU5LTk9XTik7CisgICAgfQorCisgICAgaW50IGxvZ0NvdW50KCkgY29uc3QgeyByZXR1cm4gbUxvZ2dlZEF0b21zLnNpemUoKTsgfQorCisgICAgdm9pZCB2YWxpZGF0ZUxhdGVzdEF0b20oUmVhc29uIHJlYXNvbiwgaW50IHN0YXR1cywgYm9vbCBwYXNzdGhyb3VnaCA9IGZhbHNlKSB7CisgICAgICAgIGNvbnN0IFNlc3Npb25FbmRlZEF0b20mIGF0b20gPSBtTG9nZ2VkQXRvbXMuYmFjaygpOworCisgICAgICAgIEVYUEVDVF9FUShhdG9tLmF0b21Db2RlLCBhbmRyb2lkOjptZWRpYTo6c3RhdHM6Ok1FRElBX1RSQU5TQ09ESU5HX1NFU1NJT05fRU5ERUQpOworICAgICAgICBFWFBFQ1RfRVEoYXRvbS5yZWFzb24sIHN0YXRpY19jYXN0PGludD4ocmVhc29uKSk7CisgICAgICAgIEVYUEVDVF9FUShhdG9tLmNhbGxpbmdVaWQsIGtEZWZhdWx0Q2FsbGluZ1VpZCk7CisgICAgICAgIEVYUEVDVF9FUShhdG9tLnN0YXR1cywgc3RhdHVzKTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uc3JjV2lkdGgsIGtEZWZhdWx0U3JjV2lkdGgpOworICAgICAgICBFWFBFQ1RfRVEoYXRvbS5zcmNIZWlnaHQsIGtEZWZhdWx0U3JjSGVpZ2h0KTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uc3JjTWltZSwga0RlZmF1bHRTcmNNaW1lKTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uc3JjUHJvZmlsZSwga0RlZmF1bHRTcmNQcm9maWxlKTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uc3JjTGV2ZWwsIGtEZWZhdWx0U3JjTGV2ZWwpOworICAgICAgICBFWFBFQ1RfRVEoYXRvbS5zcmNGcHMsIGtEZWZhdWx0U3JjRnBzKTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uc3JjRHVyYXRpb25Ncywga0RlZmF1bHRTcmNEdXJhdGlvblVzIC8gMTAwMCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShhdG9tLnNyY0lzSGRyKTsKKyAgICAgICAgRVhQRUNUX0VRKGF0b20uZHN0V2lkdGgsIHBhc3N0aHJvdWdoID8ga0RlZmF1bHRTcmNXaWR0aCA6IGtEZWZhdWx0RHN0V2lkdGgpOworICAgICAgICBFWFBFQ1RfRVEoYXRvbS5kc3RIZWlnaHQsIHBhc3N0aHJvdWdoID8ga0RlZmF1bHRTcmNIZWlnaHQgOiBrRGVmYXVsdERzdEhlaWdodCk7CisgICAgICAgIEVYUEVDVF9FUShhdG9tLmRzdE1pbWUsIHBhc3N0aHJvdWdoID8gInBhc3N0aHJvdWdoIiA6IGtEZWZhdWx0RHN0TWltZSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShhdG9tLmRzdElzSGRyKTsKKworICAgICAgICAvLyBUcmFuc2NvZGVyIGZyYW1lIHJhdGUgaXMgb25seSBwcmVzZW50IG9uIHN1Y2Nlc3NmdWwgc2Vzc2lvbnMuCisgICAgICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlPiBzZWNvbmRze2tEZWZhdWx0VHJhbnNjb2RlRHVyYXRpb259OworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB0cmFuc2NvZGVyRnBzID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oa0RlZmF1bHRTcmNGcmFtZUNvdW50IC8gc2Vjb25kcy5jb3VudCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShhdG9tLnRyYW5zY29kZXJGcHMsIHRyYW5zY29kZXJGcHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX0VRKGF0b20udHJhbnNjb2RlckZwcywgLTEpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgQUxPR0koIlRyYW5zY29kaW5nTG9nZ2VyVGVzdCB0ZWFyIGRvd24iKTsgfQorICAgIH5UcmFuc2NvZGluZ0xvZ2dlclRlc3QoKSB7IEFMT0dEKCJUcmFuc2NvZGluZ0xvZ2dlclRlc3QgZGVzdHJveWVkIik7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ0xvZ2dlcj4gbUxvZ2dlcjsKKyAgICBzdGQ6OnZlY3RvcjxTZXNzaW9uRW5kZWRBdG9tPiBtTG9nZ2VkQXRvbXM7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBtU3JjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1Ec3RGb3JtYXQ7Cit9OworCitURVNUX0YoVHJhbnNjb2RpbmdMb2dnZXJUZXN0LCBUZXN0RGFpbHlMb2dRdW90YSkgeworICAgIEFMT0dEKCJUZXN0RGFpbHlMb2dRdW90YSIpOworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIEVYUEVDVF9MVChUcmFuc2NvZGluZ0xvZ2dlcjo6a01heFN1Y2Nlc3NmdWxBdG9tc1BlckRheSwgVHJhbnNjb2RpbmdMb2dnZXI6OmtNYXhBdG9tc1BlckRheSk7CisKKyAgICAvLyAxLiBDaGVjayB0aGF0IHRoZSBmaXJzdCBrTWF4U3VjY2Vzc2Z1bEF0b21zUGVyRGF5IHN1Y2Nlc3NmdWwgYXRvbXMgYXJlIGxvZ2dlZC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFRyYW5zY29kaW5nTG9nZ2VyOjprTWF4U3VjY2Vzc2Z1bEF0b21zUGVyRGF5OyArK2kpIHsKKyAgICAgICAgbG9nU2Vzc2lvbkZpbmlzaGVkKHN0YXJ0ICsgc3RkOjpjaHJvbm86OnNlY29uZHN7aX0pOworICAgICAgICBFWFBFQ1RfRVEobG9nQ291bnQoKSwgaSArIDEpOworICAgIH0KKworICAgIC8vIDIuIENoZWNrIHRoYXQgc3Vic2VxdWVudCBzdWNjZXNzZnVsIGF0b21zIHdpdGhpbiB0aGUgc2FtZSAyNGggaW50ZXJ2YWwgYXJlIG5vdCBsb2dnZWQuCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAyNDsgKytpKSB7CisgICAgICAgIGxvZ1Nlc3Npb25GaW5pc2hlZChzdGFydCArIHN0ZDo6Y2hyb25vOjpob3Vyc3tpfSk7CisgICAgICAgIEVYUEVDVF9FUShsb2dDb3VudCgpLCBUcmFuc2NvZGluZ0xvZ2dlcjo6a01heFN1Y2Nlc3NmdWxBdG9tc1BlckRheSk7CisgICAgfQorCisgICAgLy8gMy4gQ2hlY2sgdGhhdCBmYWlsZWQgYXRvbXMgYXJlIGxvZ2dlZCB1cCB0byBrTWF4QXRvbXNQZXJEYXkuCisgICAgZm9yIChpbnQgaSA9IFRyYW5zY29kaW5nTG9nZ2VyOjprTWF4U3VjY2Vzc2Z1bEF0b21zUGVyRGF5OworICAgICAgICAgaSA8IFRyYW5zY29kaW5nTG9nZ2VyOjprTWF4QXRvbXNQZXJEYXk7ICsraSkgeworICAgICAgICBsb2dTZXNzaW9uRmFpbGVkKHN0YXJ0ICsgc3RkOjpjaHJvbm86OnNlY29uZHN7aX0pOworICAgICAgICBFWFBFQ1RfRVEobG9nQ291bnQoKSwgaSArIDEpOworICAgIH0KKworICAgIC8vIDQuIENoZWNrIHRoYXQgc3Vic2VxdWVudCBmYWlsZWQgYXRvbXMgd2l0aGluIHRoZSBzYW1lIDI0aCBpbnRlcnZhbCBhcmUgbm90IGxvZ2dlZC4KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDI0OyArK2kpIHsKKyAgICAgICAgbG9nU2Vzc2lvbkZhaWxlZChzdGFydCArIHN0ZDo6Y2hyb25vOjpob3Vyc3tpfSk7CisgICAgICAgIEVYUEVDVF9FUShsb2dDb3VudCgpLCBUcmFuc2NvZGluZ0xvZ2dlcjo6a01heEF0b21zUGVyRGF5KTsKKyAgICB9CisKKyAgICAvLyA1LiBDaGVjayB0aGF0IGZhaWxlZCBhbmQgc3VjY2Vzc2Z1bCBhdG9tcyBhcmUgbG9nZ2VkIGFnYWluIGFmdGVyIDI0aC4KKyAgICBsb2dTZXNzaW9uRmluaXNoZWQoc3RhcnQgKyBzdGQ6OmNocm9ubzo6aG91cnN7MjR9KTsKKyAgICBFWFBFQ1RfRVEobG9nQ291bnQoKSwgVHJhbnNjb2RpbmdMb2dnZXI6OmtNYXhBdG9tc1BlckRheSArIDEpOworCisgICAgbG9nU2Vzc2lvbkZhaWxlZChzdGFydCArIHN0ZDo6Y2hyb25vOjpob3Vyc3syNH0gKyBzdGQ6OmNocm9ubzo6c2Vjb25kc3sxfSk7CisgICAgRVhQRUNUX0VRKGxvZ0NvdW50KCksIFRyYW5zY29kaW5nTG9nZ2VyOjprTWF4QXRvbXNQZXJEYXkgKyAyKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nTG9nZ2VyVGVzdCwgVGVzdE51bGxGb3JtYXRzKSB7CisgICAgQUxPR0QoIlRlc3ROdWxsRm9ybWF0cyIpOworICAgIGF1dG8gc3JjRm9ybWF0ID0gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oQ3JlYXRlU3JjRm9ybWF0KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICBhdXRvIGRzdEZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KENyZWF0ZURzdEZvcm1hdCgpLCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgYXV0byBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKworICAgIC8vIFNvdXJjZSBmb3JtYXQgbnVsbCwgc2hvdWxkIG5vdCBsb2cuCisgICAgbG9nU2Vzc2lvbihub3csIFJlYXNvbjo6RklOSVNIRUQsIEFNRURJQV9PSywgbnVsbHB0ciAvKnNyY0Zvcm1hdCovLCBkc3RGb3JtYXQuZ2V0KCkpOworICAgIEVYUEVDVF9FUShsb2dDb3VudCgpLCAwKTsKKworICAgIC8vIEJvdGggZm9ybWF0cyBudWxsLCBzaG91bGQgbm90IGxvZy4KKyAgICBsb2dTZXNzaW9uKG5vdywgUmVhc29uOjpGSU5JU0hFRCwgQU1FRElBX09LLCBudWxscHRyIC8qc3JjRm9ybWF0Ki8sIG51bGxwdHIgLypkc3RGb3JtYXQqLyk7CisgICAgRVhQRUNUX0VRKGxvZ0NvdW50KCksIDApOworCisgICAgLy8gRGVzdGluYXRpb24gZm9ybWF0IG51bGwgKHBhc3N0aHJvdWdoIG1vZGUpLCBzaG91bGQgbG9nLgorICAgIGxvZ1Nlc3Npb24obm93LCBSZWFzb246OkZJTklTSEVELCBBTUVESUFfT0ssIHNyY0Zvcm1hdC5nZXQoKSwgbnVsbHB0ciAvKmRzdEZvcm1hdCovKTsKKyAgICBFWFBFQ1RfRVEobG9nQ291bnQoKSwgMSk7CisgICAgdmFsaWRhdGVMYXRlc3RBdG9tKFJlYXNvbjo6RklOSVNIRUQsIEFNRURJQV9PSywgdHJ1ZSAvKnBhc3N0aHJvdWdoKi8pOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdMb2dnZXJUZXN0LCBUZXN0QXRvbUNvbnRlbnRDb3JyZWN0bmVzcykgeworICAgIEFMT0dEKCJUZXN0QXRvbUNvbnRlbnRDb3JyZWN0bmVzcyIpOworICAgIGF1dG8gbm93ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisKKyAgICAvLyBMb2cgYW5kIHZhbGlkYXRlIGEgZmFpbHVyZS4KKyAgICBsb2dTZXNzaW9uKG5vdywgUmVhc29uOjpFUlJPUiwgQU1FRElBX0VSUk9SX01BTEZPUk1FRCk7CisgICAgRVhQRUNUX0VRKGxvZ0NvdW50KCksIDEpOworICAgIHZhbGlkYXRlTGF0ZXN0QXRvbShSZWFzb246OkVSUk9SLCBBTUVESUFfRVJST1JfTUFMRk9STUVEKTsKKworICAgIC8vIExvZyBhbmQgdmFsaWRhdGUgYSBzdWNjZXNzLgorICAgIGxvZ1Nlc3Npb24obm93LCBSZWFzb246OkZJTklTSEVELCBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUShsb2dDb3VudCgpLCAyKTsKKyAgICB2YWxpZGF0ZUxhdGVzdEF0b20oUmVhc29uOjpGSU5JU0hFRCwgQU1FRElBX09LKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWM0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcgorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklNZWRpYVRyYW5zY29kaW5nU2VydmljZTsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdDbGllbnQ7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOworCitjb25zdGV4cHIgQ2xpZW50SWRUeXBlIGtDbGllbnRJZCA9IDEwMDA7Citjb25zdGV4cHIgU2Vzc2lvbklkVHlwZSBrQ2xpZW50U2Vzc2lvbklkID0gMDsKK2NvbnN0ZXhwciB1aWRfdCBrQ2xpZW50VWlkID0gNTAwMDsKK2NvbnN0ZXhwciBwaWRfdCBrQ2xpZW50UGlkID0gMTAwMDA7Citjb25zdGV4cHIgdWlkX3Qga0ludmFsaWRVaWQgPSAodWlkX3QpLTE7Citjb25zdGV4cHIgcGlkX3Qga0ludmFsaWRQaWQgPSAocGlkX3QpLTE7CisKKyNkZWZpbmUgQ0xJRU5UKG4pIChrQ2xpZW50SWQgKyAobikpCisjZGVmaW5lIFNFU1NJT04obikgKGtDbGllbnRTZXNzaW9uSWQgKyAobikpCisjZGVmaW5lIFVJRChuKSAoa0NsaWVudFVpZCArIChuKSkKKyNkZWZpbmUgUElEKG4pIChrQ2xpZW50UGlkICsgKG4pKQorCitjbGFzcyBUZXN0VWlkUG9saWN5IDogcHVibGljIFVpZFBvbGljeUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgVGVzdFVpZFBvbGljeSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5UZXN0VWlkUG9saWN5KCkgPSBkZWZhdWx0OworCisgICAgLy8gVWlkUG9saWN5SW50ZXJmYWNlCisgICAgdm9pZCByZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgLyp1aWQqLykgb3ZlcnJpZGUge30KKyAgICB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IC8qdWlkKi8pIG92ZXJyaWRlIHt9CisgICAgYm9vbCBpc1VpZE9uVG9wKHVpZF90IHVpZCkgb3ZlcnJpZGUgeyByZXR1cm4gbVRvcFVpZHMuY291bnQodWlkKSA+IDA7IH0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IGdldFRvcFVpZHMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtVG9wVWlkczsgfQorICAgIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFVpZFBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbVVpZFBvbGljeUNhbGxiYWNrID0gY2I7CisgICAgfQorICAgIHZvaWQgc2V0VG9wKHVpZF90IHVpZCkgeworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IHVpZHMgPSB7dWlkfTsKKyAgICAgICAgc2V0VG9wKHVpZHMpOworICAgIH0KKyAgICB2b2lkIHNldFRvcChjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+JiB1aWRzKSB7CisgICAgICAgIG1Ub3BVaWRzID0gdWlkczsKKyAgICAgICAgYXV0byB1aWRQb2xpY3lDYiA9IG1VaWRQb2xpY3lDYWxsYmFjay5sb2NrKCk7CisgICAgICAgIGlmICh1aWRQb2xpY3lDYiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB1aWRQb2xpY3lDYi0+b25Ub3BVaWRzQ2hhbmdlZChtVG9wVWlkcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8dWlkX3Q+IG1Ub3BVaWRzOworICAgIHN0ZDo6d2Vha19wdHI8VWlkUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+IG1VaWRQb2xpY3lDYWxsYmFjazsKK307CisKK2NsYXNzIFRlc3RSZXNvdXJjZVBvbGljeSA6IHB1YmxpYyBSZXNvdXJjZVBvbGljeUludGVyZmFjZSB7CitwdWJsaWM6CisgICAgVGVzdFJlc291cmNlUG9saWN5KCkgeyByZXNldCgpOyB9CisgICAgdmlydHVhbCB+VGVzdFJlc291cmNlUG9saWN5KCkgPSBkZWZhdWx0OworCisgICAgLy8gUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2UKKyAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUNhbGxiYWNrSW50ZXJmYWNlPiYgLypjYiovKSBvdmVycmlkZSB7fQorICAgIHZvaWQgc2V0UGlkUmVzb3VyY2VMb3N0KHBpZF90IHBpZCkgb3ZlcnJpZGUgeyBtUmVzb3VyY2VMb3N0UGlkID0gcGlkOyB9CisgICAgLy8gflJlc291cmNlUG9saWN5SW50ZXJmYWNlCisKKyAgICBwaWRfdCBnZXRQaWQoKSB7CisgICAgICAgIHBpZF90IHJlc3VsdCA9IG1SZXNvdXJjZUxvc3RQaWQ7CisgICAgICAgIHJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgcmVzZXQoKSB7IG1SZXNvdXJjZUxvc3RQaWQgPSBrSW52YWxpZFBpZDsgfQorICAgIHBpZF90IG1SZXNvdXJjZUxvc3RQaWQ7Cit9OworCitjbGFzcyBUZXN0VGhlcm1hbFBvbGljeSA6IHB1YmxpYyBUaGVybWFsUG9saWN5SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBUZXN0VGhlcm1hbFBvbGljeSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5UZXN0VGhlcm1hbFBvbGljeSgpID0gZGVmYXVsdDsKKworICAgIC8vIFRoZXJtYWxQb2xpY3lJbnRlcmZhY2UKKyAgICB2b2lkIHNldENhbGxiYWNrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaGVybWFsUG9saWN5Q2FsbGJhY2tJbnRlcmZhY2U+JiAvKmNiKi8pIG92ZXJyaWRlIHt9CisgICAgYm9vbCBnZXRUaHJvdHRsaW5nU3RhdHVzKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAvLyB+VGhlcm1hbFBvbGljeUludGVyZmFjZQorCitwcml2YXRlOgorfTsKKworY2xhc3MgVGVzdFRyYW5zY29kZXIgOiBwdWJsaWMgVHJhbnNjb2RlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgVGVzdFRyYW5zY29kZXIoKSA6IG1HZW5lcmF0aW9uKDApIHt9CisgICAgdmlydHVhbCB+VGVzdFRyYW5zY29kZXIoKSB7fQorCisgICAgLy8gVHJhbnNjb2RlckludGVyZmFjZQorICAgIHZvaWQgc3RhcnQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLypyZXF1ZXN0Ki8sIHVpZF90IC8qY2FsbGluZ1VpZCovLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgLypjbGllbnRDYWxsYmFjayovKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChTdGFydChjbGllbnRJZCwgc2Vzc2lvbklkKSk7CisgICAgfQorICAgIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGUgeworICAgICAgICBhcHBlbmQoUGF1c2UoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgIH0KKyAgICB2b2lkIHJlc3VtZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLypyZXF1ZXN0Ki8sIHVpZF90IC8qY2FsbGluZ1VpZCovLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaz4mIC8qY2xpZW50Q2FsbGJhY2sqLykgb3ZlcnJpZGUgeworICAgICAgICBhcHBlbmQoUmVzdW1lKGNsaWVudElkLCBzZXNzaW9uSWQpKTsKKyAgICB9CisgICAgdm9pZCBzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGJvb2wgYWJhbmRvbikgb3ZlcnJpZGUgeworICAgICAgICBhcHBlbmQoYWJhbmRvbiA/IEFiYW5kb24oY2xpZW50SWQsIHNlc3Npb25JZCkgOiBTdG9wKGNsaWVudElkLCBzZXNzaW9uSWQpKTsKKyAgICB9CisKKyAgICB2b2lkIG9uRmluaXNoZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgeworICAgICAgICBhcHBlbmQoRmluaXNoZWQoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgIH0KKworICAgIHZvaWQgb25GYWlsZWQoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgVHJhbnNjb2RpbmdFcnJvckNvZGUgZXJyKSB7CisgICAgICAgIGFwcGVuZChGYWlsZWQoY2xpZW50SWQsIHNlc3Npb25JZCksIGVycik7CisgICAgfQorCisgICAgdm9pZCBvbkNyZWF0ZWQoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisgICAgICAgIG1HZW5lcmF0aW9uKys7CisgICAgfQorCisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSB7IE5vRXZlbnQsIFN0YXJ0LCBQYXVzZSwgUmVzdW1lLCBTdG9wLCBGaW5pc2hlZCwgRmFpbGVkLCBBYmFuZG9uIH0gdHlwZTsKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkOworICAgICAgICBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZDsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBFdmVudCBOb0V2ZW50ID0ge0V2ZW50OjpOb0V2ZW50LCAwLCAwfTsKKworI2RlZmluZSBERUNMQVJFX0VWRU5UKGFjdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIEV2ZW50IGFjdGlvbihDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7IFwKKyAgICAgICAgcmV0dXJuIHtFdmVudDo6YWN0aW9uLCBjbGllbnRJZCwgc2Vzc2lvbklkfTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIERFQ0xBUkVfRVZFTlQoU3RhcnQpOworICAgIERFQ0xBUkVfRVZFTlQoUGF1c2UpOworICAgIERFQ0xBUkVfRVZFTlQoUmVzdW1lKTsKKyAgICBERUNMQVJFX0VWRU5UKFN0b3ApOworICAgIERFQ0xBUkVfRVZFTlQoRmluaXNoZWQpOworICAgIERFQ0xBUkVfRVZFTlQoRmFpbGVkKTsKKyAgICBERUNMQVJFX0VWRU5UKEFiYW5kb24pOworCisgICAgLy8gUHVzaCAxIGV2ZW50IHRvIGJhY2suCisgICAgdm9pZCBhcHBlbmQoY29uc3QgRXZlbnQmIGV2ZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nRXJyb3JDb2RlIGVyciA9IFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTm9FcnJvcikgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobUxvY2spOworCisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhldmVudCk7CisgICAgICAgIC8vIEVycm9yIGlzIHN0aWNreSwgbm9uLWVycm9yIGV2ZW50IHdpbGwgbm90IGVyYXNlIGl0LCBvbmx5IGdldExhc3RFcnJvcigpCisgICAgICAgIC8vIGNsZWFycyBsYXN0IGVycm9yLgorICAgICAgICBpZiAoZXJyICE9IFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTm9FcnJvcikgeworICAgICAgICAgICAgbUxhc3RFcnJvclF1ZXVlLnB1c2hfYmFjayhlcnIpOworICAgICAgICB9CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIC8vIFBvcCAxIGV2ZW50IGZyb20gZnJvbnQsIHdhaXQgZm9yIHVwIHRvIHRpbWVvdXRVcyBpZiBlbXB0eS4KKyAgICBjb25zdCBFdmVudCYgcG9wRXZlbnQoaW50NjRfdCB0aW1lb3V0VXMgPSAwKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisKKyAgICAgICAgaWYgKG1FdmVudFF1ZXVlLmVtcHR5KCkgJiYgdGltZW91dFVzID4gMCkgeworICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKHRpbWVvdXRVcykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1FdmVudFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9IE5vRXZlbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUG9wcGVkRXZlbnQgPSAqbUV2ZW50UXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIG1FdmVudFF1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKKyAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZSBnZXRMYXN0RXJyb3IoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttTG9ja307CisgICAgICAgIGlmIChtTGFzdEVycm9yUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTm9FcnJvcjsKKyAgICAgICAgfQorICAgICAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIgPSBtTGFzdEVycm9yUXVldWUuZnJvbnQoKTsKKyAgICAgICAgbUxhc3RFcnJvclF1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21Mb2NrfTsKKyAgICAgICAgcmV0dXJuIG1HZW5lcmF0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisgICAgc3RkOjpsaXN0PFRyYW5zY29kaW5nRXJyb3JDb2RlPiBtTGFzdEVycm9yUXVldWU7CisgICAgaW50MzJfdCBtR2VuZXJhdGlvbjsKK307CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBUZXN0VHJhbnNjb2Rlcjo6RXZlbnQmIGxocywgY29uc3QgVGVzdFRyYW5zY29kZXI6OkV2ZW50JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLmNsaWVudElkID09IHJocy5jbGllbnRJZCAmJiBsaHMuc2Vzc2lvbklkID09IHJocy5zZXNzaW9uSWQ7Cit9CisKK3N0cnVjdCBUZXN0Q2xpZW50Q2FsbGJhY2sgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrIHsKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2soVGVzdFRyYW5zY29kZXIqIG93bmVyLCBDbGllbnRJZFR5cGUgY2xpZW50SWQsIHVpZF90IGNsaWVudFVpZCkKKyAgICAgICAgICA6IG1Pd25lcihvd25lciksIG1DbGllbnRJZChjbGllbnRJZCksIG1DbGllbnRVaWQoY2xpZW50VWlkKSB7CisgICAgICAgIEFMT0dEKCJUZXN0Q2xpZW50IENyZWF0ZWQiKTsKKyAgICB9CisKKyAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50SWQ7IH0KKyAgICB1aWRfdCBjbGllbnRVaWQoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50VWlkOyB9CisKKyAgICBTdGF0dXMgb3BlbkZpbGVEZXNjcmlwdG9yKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKmluX2ZpbGVVcmkqLywgY29uc3Qgc3RkOjpzdHJpbmcmIC8qaW5fbW9kZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiAvKl9haWRsX3JldHVybiovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdTdGFydGVkKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdHVzOjpvaygpOyB9CisKKyAgICBTdGF0dXMgb25UcmFuc2NvZGluZ1BhdXNlZChpbnQzMl90IC8qaW5fc2Vzc2lvbklkKi8pIG92ZXJyaWRlIHsgcmV0dXJuIFN0YXR1czo6b2soKTsgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdSZXN1bWVkKGludDMyX3QgLyppbl9zZXNzaW9uSWQqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RhdHVzOjpvaygpOyB9CisKKyAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZpbmlzaGVkKGludDMyX3QgaW5fc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXN1bHRQYXJjZWwmIGluX3Jlc3VsdCkgb3ZlcnJpZGUgeworICAgICAgICBFWFBFQ1RfRVEoaW5fc2Vzc2lvbklkLCBpbl9yZXN1bHQuc2Vzc2lvbklkKTsKKyAgICAgICAgQUxPR0QoIlRlc3RDbGllbnRDYWxsYmFjazogcmVjZWl2ZWQgb25UcmFuc2NvZGluZ0ZpbmlzaGVkIik7CisgICAgICAgIG1Pd25lci0+b25GaW5pc2hlZChtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW50MzJfdCBpbl9zZXNzaW9uSWQsIFRyYW5zY29kaW5nRXJyb3JDb2RlIGluX2Vycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtT3duZXItPm9uRmFpbGVkKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkLCBpbl9lcnJvckNvZGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvbkF3YWl0TnVtYmVyT2ZTZXNzaW9uc0NoYW5nZWQoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX29sZEF3YWl0TnVtYmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9uZXdBd2FpdE51bWJlciAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblByb2dyZXNzVXBkYXRlKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLCBpbnQzMl90IC8qIGluX3Byb2dyZXNzICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudCBkZXN0cm95ZWQiKTsgfTsKKworcHJpdmF0ZToKKyAgICBUZXN0VHJhbnNjb2RlciogbU93bmVyOworICAgIENsaWVudElkVHlwZSBtQ2xpZW50SWQ7CisgICAgdWlkX3QgbUNsaWVudFVpZDsKKyAgICBUZXN0Q2xpZW50Q2FsbGJhY2soY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7CisgICAgVGVzdENsaWVudENhbGxiYWNrJiBvcGVyYXRvcj0oY29uc3QgVGVzdENsaWVudENhbGxiYWNrJikgPSBkZWxldGU7Cit9OworCitjbGFzcyBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0KCkgeyBBTE9HSSgiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QgY3JlYXRlZCIpOyB9CisgICAgflRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0KCkgeyBBTE9HRCgiVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QgZGVzdHJveWVkIik7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFMT0dJKCJUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCBzZXQgdXAiKTsKKyAgICAgICAgbVRyYW5zY29kZXIucmVzZXQobmV3IFRlc3RUcmFuc2NvZGVyKCkpOworICAgICAgICBtVWlkUG9saWN5LnJlc2V0KG5ldyBUZXN0VWlkUG9saWN5KCkpOworICAgICAgICBtUmVzb3VyY2VQb2xpY3kucmVzZXQobmV3IFRlc3RSZXNvdXJjZVBvbGljeSgpKTsKKyAgICAgICAgbVRoZXJtYWxQb2xpY3kucmVzZXQobmV3IFRlc3RUaGVybWFsUG9saWN5KCkpOworICAgICAgICAvLyBPdmVycmlkIGRlZmF1bHQgYnVyc3QgcGFyYW1zIHdpdGggc2hvcnRlciB2YWx1ZXMgZm9yIHRlc3RpbmcuCisgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OkNvbnRyb2xsZXJDb25maWcgY29uZmlnID0geworICAgICAgICAgICAgICAgIC5wYWNlckJ1cnN0VGhyZXNob2xkTXMgPSA1MDAsCisgICAgICAgICAgICAgICAgLnBhY2VyQnVyc3RDb3VudFF1b3RhID0gMTAsCisgICAgICAgICAgICAgICAgLnBhY2VyQnVyc3RUaW1lUXVvdGFTZWNvbmRzID0gMywKKyAgICAgICAgfTsKKyAgICAgICAgbUNvbnRyb2xsZXIucmVzZXQobmV3IFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiAvKmNiKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSByZXF1aXJlIHRoYXQgdGhlIFNlc3Npb25Db250cm9sbGVyIGNsZWFycyBvdXQgYWxsIGl0cyByZWZjb3VudHMgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyYW5zY29kZXIgb2JqZWN0IHdoZW4gaXQgY2FsbHMgY3JlYXRlLgorICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXIudXNlX2NvdW50KCksIDEpOworICAgICAgICAgICAgICAgICAgICBtVHJhbnNjb2Rlci0+b25DcmVhdGVkKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVHJhbnNjb2RlcjsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG1VaWRQb2xpY3ksIG1SZXNvdXJjZVBvbGljeSwgbVRoZXJtYWxQb2xpY3ksICZjb25maWcpKTsKKyAgICAgICAgbVVpZFBvbGljeS0+c2V0Q2FsbGJhY2sobUNvbnRyb2xsZXIpOworCisgICAgICAgIC8vIFNldCBwcmlvcml0eSBvbmx5LCBpZ25vcmUgb3RoZXIgZmllbGRzIGZvciBub3cuCisgICAgICAgIG1PZmZsaW5lUmVxdWVzdC5wcmlvcml0eSA9IFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprVW5zcGVjaWZpZWQ7CisgICAgICAgIG1SZWFsdGltZVJlcXVlc3QucHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a0hpZ2g7CisgICAgICAgIG1DbGllbnRDYWxsYmFjazAgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KG1UcmFuc2NvZGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElFTlQoMCksIFVJRCgwKSk7CisgICAgICAgIG1DbGllbnRDYWxsYmFjazEgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KG1UcmFuc2NvZGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElFTlQoMSksIFVJRCgxKSk7CisgICAgICAgIG1DbGllbnRDYWxsYmFjazIgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KG1UcmFuc2NvZGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElFTlQoMiksIFVJRCgyKSk7CisgICAgICAgIG1DbGllbnRDYWxsYmFjazMgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KG1UcmFuc2NvZGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTElFTlQoMyksIFVJRCgzKSk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgQUxPR0koIlRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0IHRlYXIgZG93biIpOyB9CisKKyAgICB2b2lkIGV4cGVjdFRpbWVvdXQoaW50NjRfdCBjbGllbnRJZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgZ2VuZXJhdGlvbikgeworICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KDI5MDAwMDApLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoMjAwMDAwKSwgVGVzdFRyYW5zY29kZXI6OkFiYW5kb24oY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KDEwMDAwMCksIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoY2xpZW50SWQsIHNlc3Npb25JZCkpOworICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1dhdGNoZG9nVGltZW91dCk7CisgICAgICAgIC8vIFNob3VsZCBoYXZlIGNyZWF0ZWQgbmV3IHRyYW5zY29kZXIuCisgICAgICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Z2V0R2VuZXJhdGlvbigpLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLnVzZV9jb3VudCgpLCAyKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQYWNlckhlbHBlcihpbnQgbnVtU3VibWl0cywgaW50IHNlc3Npb25EdXJhdGlvbk1zLCBpbnQgZXhwZWN0ZWRTdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYWNlckhlbHBlcihudW1TdWJtaXRzLCBzZXNzaW9uRHVyYXRpb25NcywgZXhwZWN0ZWRTdWNjZXNzLCBtQ2xpZW50Q2FsbGJhY2swLCB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qcGF1c2VMYXN0U3VjY2Vzc1Nlc3Npb24qLywgdHJ1ZSAvKnVzZVJlYWxDYWxsaW5nVWlkKi8pOworICAgIH0KKworICAgIHZvaWQgdGVzdFBhY2VySGVscGVyV2l0aFBhdXNlKGludCBudW1TdWJtaXRzLCBpbnQgc2Vzc2lvbkR1cmF0aW9uTXMsIGludCBleHBlY3RlZFN1Y2Nlc3MpIHsKKyAgICAgICAgdGVzdFBhY2VySGVscGVyKG51bVN1Ym1pdHMsIHNlc3Npb25EdXJhdGlvbk1zLCBleHBlY3RlZFN1Y2Nlc3MsIG1DbGllbnRDYWxsYmFjazAsIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKnBhdXNlTGFzdFN1Y2Nlc3NTZXNzaW9uKi8sIHRydWUgLyp1c2VSZWFsQ2FsbGluZ1VpZCovKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQYWNlckhlbHBlcldpdGhNdWx0aXBsZVVpZHMoaW50IG51bVN1Ym1pdHMsIGludCBzZXNzaW9uRHVyYXRpb25NcywgaW50IGV4cGVjdGVkU3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRDYWxsYmFjaz4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYWRkaXRpb25hbENsaWVudFVpZHMpIHsKKyAgICAgICAgdGVzdFBhY2VySGVscGVyKG51bVN1Ym1pdHMsIHNlc3Npb25EdXJhdGlvbk1zLCBleHBlY3RlZFN1Y2Nlc3MsIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxDbGllbnRVaWRzLCBmYWxzZSAvKnBhdXNlTGFzdFN1Y2Nlc3NTZXNzaW9uKi8sCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qdXNlUmVhbENhbGxpbmdVaWQqLyk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UGFjZXJIZWxwZXJXaXRoU2VsZlVpZChpbnQgbnVtU3VibWl0cywgaW50IHNlc3Npb25EdXJhdGlvbk1zLCBpbnQgZXhwZWN0ZWRTdWNjZXNzKSB7CisgICAgICAgIHRlc3RQYWNlckhlbHBlcihudW1TdWJtaXRzLCBzZXNzaW9uRHVyYXRpb25NcywgZXhwZWN0ZWRTdWNjZXNzLCBtQ2xpZW50Q2FsbGJhY2swLCB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qcGF1c2VMYXN0U3VjY2Vzc1Nlc3Npb24qLywgZmFsc2UgLyp1c2VSZWFsQ2FsbGluZ1VpZCovKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RQYWNlckhlbHBlcihpbnQgbnVtU3VibWl0cywgaW50IHNlc3Npb25EdXJhdGlvbk1zLCBpbnQgZXhwZWN0ZWRTdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYWRkaXRpb25hbENsaWVudFVpZHMsIGJvb2wgcGF1c2VMYXN0U3VjY2Vzc1Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VSZWFsQ2FsbGluZ1VpZCkgeworICAgICAgICB1aWRfdCBjYWxsaW5nVWlkID0gdXNlUmVhbENhbGxpbmdVaWQgPyA6OmdldHVpZCgpIDogY2xpZW50LT5jbGllbnRVaWQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdWJtaXRzOyBpKyspIHsKKyAgICAgICAgICAgIG1Db250cm9sbGVyLT5zdWJtaXQoY2xpZW50LT5jbGllbnRJZCgpLCBTRVNTSU9OKGkpLCBjYWxsaW5nVWlkLCBjbGllbnQtPmNsaWVudFVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVhbHRpbWVSZXF1ZXN0LCBjbGllbnQpOworICAgICAgICAgICAgZm9yIChpbnQgYWRkaXRpb25hbFVpZCA6IGFkZGl0aW9uYWxDbGllbnRVaWRzKSB7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChjbGllbnQtPmNsaWVudElkKCksIFNFU1NJT04oaSksIGFkZGl0aW9uYWxVaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRTdWNjZXNzOyBpKyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoY2xpZW50LT5jbGllbnRJZCgpLCBTRVNTSU9OKGkpKSk7CisgICAgICAgICAgICBpZiAoKGkgPT0gZXhwZWN0ZWRTdWNjZXNzIC0gMSkgJiYgcGF1c2VMYXN0U3VjY2Vzc1Nlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBwYXVzZSBvZiAzIHNlYyB0byB0aGUgbGFzdCBzdWNjZXNzIHJ1bm5pbmcgc2Vzc2lvbgorICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoY2xpZW50LT5jbGllbnRJZCgpLCBTRVNTSU9OKGkpKSk7CisgICAgICAgICAgICAgICAgc2xlZXAoMyk7CisgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXItPm9uVGhyb3R0bGluZ1N0b3BwZWQoKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoY2xpZW50LT5jbGllbnRJZCgpLCBTRVNTSU9OKGkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2xlZXAoc2Vzc2lvbkR1cmF0aW9uTXMgKiAxMDAwKTsKKyAgICAgICAgICAgIC8vIFRlc3QgaGFsZiBvZiBGaW5pc2ggYW5kIGhhbGYgb2YgRXJyb3IsIGJvdGggc2hvdWxkIGJlIGNvdW50ZWQgYXMgYnVyc3QgcnVucy4KKyAgICAgICAgICAgIGlmIChpICYgMSkgeworICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChjbGllbnQtPmNsaWVudElkKCksIFNFU1NJT04oaSkpOworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFRyYW5zY29kZXI6OkZpbmlzaGVkKGNsaWVudC0+Y2xpZW50SWQoKSwgU0VTU0lPTihpKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29udHJvbGxlci0+b25FcnJvcihjbGllbnQtPmNsaWVudElkKCksIFNFU1NJT04oaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KDEwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoY2xpZW50LT5jbGllbnRJZCgpLCBTRVNTSU9OKGkpKSk7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gZXhwZWN0ZWRTdWNjZXNzOyBpIDwgbnVtU3VibWl0czsgaSsrKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChjbGllbnQtPmNsaWVudElkKCksIFNFU1NJT04oaSkpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Z2V0TGFzdEVycm9yKCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprRHJvcHBlZEJ5U2VydmljZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFRyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0UmVzb3VyY2VQb2xpY3k+IG1SZXNvdXJjZVBvbGljeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFRoZXJtYWxQb2xpY3k+IG1UaGVybWFsUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyPiBtQ29udHJvbGxlcjsKKyAgICBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwgbU9mZmxpbmVSZXF1ZXN0OworICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCBtUmVhbHRpbWVSZXF1ZXN0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazA7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RDbGllbnRDYWxsYmFjaz4gbUNsaWVudENhbGxiYWNrMTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50Q2FsbGJhY2syOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2xpZW50Q2FsbGJhY2s+IG1DbGllbnRDYWxsYmFjazM7Cit9OworCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RTdWJtaXRTZXNzaW9uKSB7CisgICAgQUxPR0QoIlRlc3RTdWJtaXRTZXNzaW9uIik7CisKKyAgICAvLyBTdGFydCB3aXRoIFVJRCgxKSBvbiB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIHRvIENMSUVOVCgwKSBpbiBVSUQoMCkuCisgICAgLy8gU2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5IChiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc2Vzc2lvbikuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgVUlEKDApLCBtT2ZmbGluZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgMCkpOworCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgwKS4KKyAgICAvLyBTaG91bGQgcGF1c2Ugb2ZmbGluZSBzZXNzaW9uIGFuZCBzdGFydCBuZXcgc2Vzc2lvbiwgIGV2ZW4gaWYgVUlEKDApIGlzIG5vdCBvbiB0b3AuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzIHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMSkgaW4gc2FtZSB1aWQsIHNob3VsZCBiZSBxdWV1ZWQgYWZ0ZXIgdGhlIHByZXZpb3VzCisgICAgLy8gc2Vzc2lvbi4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazEpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgyKSBpbiBVSUQoMSkuCisgICAgLy8gU2hvdWxkIHBhdXNlIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0YXJ0IG5ldyBzZXNzaW9uLCBiZWNhdXNlIFVJRCgxKSBpcyAoaGFzIGJlZW4pIHRvcC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDIpLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiwgc2hvdWxkbid0IGdlbmVyYXRlIGFueSBldmVudC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigxKSwgVUlEKDIpLCBVSUQoMSksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBCcmluZyBVSUQoMCkgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMCkpOworICAgIC8vIFNob3VsZCBwYXVzZSBjdXJyZW50IHNlc3Npb24sIGFuZCByZXN1bWUgbGFzdCBzZXNzaW9uIGluIFVJRCgwKS4KKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdENhbmNlbFNlc3Npb24pIHsKKyAgICBBTE9HRCgiVGVzdENhbmNlbFNlc3Npb24iKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDApLCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDEpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMiksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgwKSwgVUlEKDApLCBtT2ZmbGluZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQ2FuY2VsIHF1ZXVlZCByZWFsLXRpbWUgc2Vzc2lvbi4KKyAgICAvLyBDYW5jZWwgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIGJlIGNhbmNlbGxlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Y2FuY2VsKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworCisgICAgLy8gQ2FuY2VsIHF1ZXVlZCBvZmZsaW5lIHNlc3Npb24uCisgICAgLy8gQ2FuY2VsIG9mZmxpbmUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgYmUgY2FuY2VsbGVkLgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5jYW5jZWwoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMyksIHNob3VsZG4ndCBjYXVzZSBhbnkgZXZlbnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMyksIFVJRCgwKSwgVUlEKDApLCBtT2ZmbGluZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQ2FuY2VsIHJ1bm5pbmcgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigwKS4KKyAgICAvLyAtIFNob3VsZCBiZSBzdG9wcGVkIGZpcnN0IHRoZW4gY2FuY2VsbGVkLgorICAgIC8vIC0gU2hvdWxkIGFsc28gc3RhcnQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMikgYmVjYXVzZSByZWFsLXRpbWUgcXVldWUgaXMgZW1wdHkuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmNhbmNlbChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdG9wKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigzKSkpOworCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIFNFU1NJT04oNCksIG9mZmxpbmUgU0VTU0lPTigzKSBzaG91bGQgcGF1c2UgYW5kIFNFU1NJT04oNCkKKyAgICAvLyBzaG91bGQgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oNCksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMykpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oNCkpKTsKKworICAgIC8vIENhbmNlbCBwYXVzZWQgU0VTU0lPTigzKS4gU0VTU0lPTigzKSBzaG91bGQgYmUgc3RvcHBlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Y2FuY2VsKENMSUVOVCgwKSwgU0VTU0lPTigzKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0b3AoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdENhbmNlbFNlc3Npb25XaXRoTXVsdGlwbGVVaWRzKSB7CisgICAgQUxPR0QoIlRlc3RDYW5jZWxTZXNzaW9uV2l0aE11bHRpcGxlVWlkcyIpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNsaWVudFVpZHM7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMCksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFVJRCgxKSBtb3ZlcyB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisKKyAgICAvLyBBZGQgVUlEKDEpIHRvIHRoZSBvZmZsaW5lIFNFU1NJT04oMiksIFNFU1NJT04oMikgc2hvdWxkIHN0YXJ0IGFuZCBTRVNTSU9OKDApIHNob3VsZCBwYXVzZS4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVUlEKDEpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisKKyAgICAvLyBBZGQgVUlEKDEpIHRvIFNFU1NJT04oMSkgYXMgd2VsbC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDEpKSk7CisKKyAgICAvLyBDYW5jZWwgU0VTU0lPTigyKSwgc2hvdWxkIGJlIGNhbmNlbGxlZCBhbmQgU0VTU0lPTigxKSBzaG91bGQgc3RhcnQuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmNhbmNlbChDTElFTlQoMCksIFNFU1NJT04oMikpKTsKKyAgICBFWFBFQ1RfRkFMU0UobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0b3AoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisKKyAgICAvLyBDYW5jZWwgU0VTU0lPTigxKSwgc2hvdWxkIGJlIGNhbmNlbGxlZCBhbmQgU0VTU0lPTigwKSBzaG91bGQgcmVzdW1lLgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5jYW5jZWwoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgJmNsaWVudFVpZHMpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdG9wKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0Q2FuY2VsQWxsU2Vzc2lvbnNGb3JDbGllbnQpIHsKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMCksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNsaWVudFVpZHM7CisgICAgLy8gTWFrZSBzb21lIG1vcmUgdWlkcyBibG9ja2VkIG9uIHRoZSBzZXNzaW9ucy4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDEpKSk7CisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgxKSkpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMSkpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Z2V0Q2xpZW50VWlkcyhDTElFTlQoMCksIFNFU1NJT04oMCksICZjbGllbnRVaWRzKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMuc2l6ZSgpLCAyKTsKKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Z2V0Q2xpZW50VWlkcyhDTElFTlQoMCksIFNFU1NJT04oMSksICZjbGllbnRVaWRzKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMuc2l6ZSgpLCAyKTsKKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+Z2V0Q2xpZW50VWlkcyhDTElFTlQoMCksIFNFU1NJT04oMiksICZjbGllbnRVaWRzKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMuc2l6ZSgpLCAxKTsKKworICAgIC8vIENhbmNlbCBhbGwgc2Vzc2lvbnMgZm9yIENMSUVOVCgwKSB3aXRoIC0xLgorICAgIC8vIEV4cGVjdCBTRVNTSU9OKDApIGFuZCBTRVNTSU9OKDEpIHRvIGJlIGdvbmUuCisgICAgLy8gRXhwZWN0IFNFU1NJT04oMikgc3RpbGwgdGhlcmUgd2l0aCBlbXB0eSBjbGllbnQgdWlkIGxpc3QgKG9ubHkga2VwdCBmb3Igb2ZmbGluZSkgYW5kIHN0YXJ0LgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5jYW5jZWwoQ0xJRU5UKDApLCAtMSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0b3AoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgJmNsaWVudFVpZHMpKTsKKyAgICBFWFBFQ1RfRkFMU0UobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigyKSwgJmNsaWVudFVpZHMpKTsKKyAgICBFWFBFQ1RfRVEoY2xpZW50VWlkcy5zaXplKCksIDApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigyKSkpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RGaW5pc2hTZXNzaW9uKSB7CisgICAgQUxPR0QoIlRlc3RGaW5pc2hTZXNzaW9uIik7CisKKyAgICAvLyBTdGFydCB3aXRoIHVuc3BlY2lmaWVkIHRvcCBVSUQuCisgICAgLy8gRmluaXNoIHdpdGhvdXQgYW55IHNlc3Npb25zIHN1Ym1pdHRlZCwgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMCksIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIHBhdXNlIG9mZmxpbmUgc2Vzc2lvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBGaW5pc2ggd2hlbiB0aGUgc2Vzc2lvbiBuZXZlciBzdGFydGVkLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDIpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFVJRCgxKSBtb3ZlcyB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgxKSBpbiBVSUQoMSksIHNob3VsZCBwYXVzZSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdGFydAorICAgIC8vIG5ldyBzZXNzaW9uLgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMSksIFVJRCgxKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTaW11bGF0ZSBGaW5pc2ggdGhhdCBhcnJpdmVkIGxhdGUsIGFmdGVyIHBhdXNlIGlzc3VlZCBieSBjb250cm9sbGVyLgorICAgIC8vIFNob3VsZCBzdGlsbCBiZSBwcm9wYWdhdGVkIHRvIGNsaWVudCwgYnV0IHNob3VsZG4ndCB0cmlnZ2VyIGFueSBuZXcgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisKKyAgICAvLyBGaW5pc2ggcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHN0YXJ0IG5leHQgcmVhbC10aW1lIHNlc3Npb24gaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgxKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisKKyAgICAvLyBGaW5pc2ggcnVubmluZyByZWFsLXRpbWUgc2Vzc2lvbiwgc2hvdWxkIHJlc3VtZSBuZXh0IHNlc3Npb24gKG9mZmxpbmUgc2Vzc2lvbikgaW4gcXVldWUuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigyKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gRmluaXNoIHJ1bm5pbmcgb2ZmbGluZSBzZXNzaW9uLgorICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChDTElFTlQoMCksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZpbmlzaGVkKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gRHVwbGljYXRlIGZpbmlzaCBmb3IgbGFzdCBzZXNzaW9uLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0RmluaXNoU2Vzc2lvbldpdGhNdWx0aXBsZVVpZHMpIHsKKyAgICBBTE9HRCgiVGVzdEZpbmlzaFNlc3Npb25XaXRoTXVsdGlwbGVVaWRzIik7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xpZW50VWlkczsKKworICAgIC8vIFN0YXJ0IHdpdGggdW5zcGVjaWZpZWQgdG9wIHVpZC4KKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigwKSwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBVSUQoMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgxKSkpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMikpKTsKKworICAgIC8vIFVJRCgxKSBtb3ZlcyB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgLy8gU0VTU0lPTigwKSBzaG91bGQgcGF1c2UsIFNFU1NJT04oMSkgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworCisgICAgLy8gRmluaXNoIFNFU1NJT04oMSksIFNFU1NJT04oMikgKG5leHQgaW4gbGluZSBmb3IgVUlEKDEpKSBzaG91bGQgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgJmNsaWVudFVpZHMpKTsKKworICAgIC8vIEZpbmlzaCBTRVNTSU9OKDIpLCBTRVNTSU9OKDApIHNob3VsZCByZXN1bWUuCisgICAgbUNvbnRyb2xsZXItPm9uRmluaXNoKENMSUVOVCgwKSwgU0VTU0lPTigyKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmluaXNoZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9GQUxTRShtQ29udHJvbGxlci0+Z2V0Q2xpZW50VWlkcyhDTElFTlQoMCksIFNFU1NJT04oMiksICZjbGllbnRVaWRzKSk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdEZhaWxTZXNzaW9uKSB7CisgICAgQUxPR0QoIlRlc3RGYWlsU2Vzc2lvbiIpOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgVUlELgorICAgIC8vIEZhaWwgd2l0aG91dCBhbnkgc2Vzc2lvbnMgc3VibWl0dGVkLCBzaG91bGQgYmUgaWdub3JlZC4KKyAgICBtQ29udHJvbGxlci0+b25FcnJvcihDTElFTlQoMCksIFNFU1NJT04oMCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIFNFU1NJT04oMCksIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gU0VTU0lPTigxKSwgc2hvdWxkIHBhdXNlIG9mZmxpbmUgc2Vzc2lvbiBhbmQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDIpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBGYWlsIHdoZW4gdGhlIHNlc3Npb24gbmV2ZXIgc3RhcnRlZCwgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgbUNvbnRyb2xsZXItPm9uRXJyb3IoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gVUlEKDEpIG1vdmVzIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDEpKTsKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDEpIGluIFVJRCgxKSwgc2hvdWxkIHBhdXNlIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0YXJ0CisgICAgLy8gbmV3IHNlc3Npb24uCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMSksIFNFU1NJT04oMCksIFVJRCgxKSwgVUlEKDEpLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2sxKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFNpbXVsYXRlIEZhaWwgdGhhdCBhcnJpdmVkIGxhdGUsIGFmdGVyIHBhdXNlIGlzc3VlZCBieSBjb250cm9sbGVyLgorICAgIC8vIFNob3VsZCBzdGlsbCBiZSBwcm9wYWdhdGVkIHRvIGNsaWVudCwgYnV0IHNob3VsZG4ndCB0cmlnZ2VyIGFueSBuZXcgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uRXJyb3IoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1Vua25vd24pOworCisgICAgLy8gRmFpbCBydW5uaW5nIHJlYWwtdGltZSBzZXNzaW9uLCBzaG91bGQgc3RhcnQgbmV4dCByZWFsLXRpbWUgc2Vzc2lvbiBpbiBxdWV1ZS4KKyAgICBtQ29udHJvbGxlci0+b25FcnJvcihDTElFTlQoMSksIFNFU1NJT04oMCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmFpbGVkKENMSUVOVCgxKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Z2V0TGFzdEVycm9yKCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisKKyAgICAvLyBGYWlsIHJ1bm5pbmcgcmVhbC10aW1lIHNlc3Npb24sIHNob3VsZCByZXN1bWUgbmV4dCBzZXNzaW9uIChvZmZsaW5lIHNlc3Npb24pIGluIHF1ZXVlLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBGYWlsIHJ1bm5pbmcgb2ZmbGluZSBzZXNzaW9uLCBhbmQgdGVzdCBlcnJvciBjb2RlIHByb3BhZ2F0aW9uLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKworICAgIC8vIER1cGxpY2F0ZSBmYWlsIGZvciBsYXN0IHNlc3Npb24sIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVbmtub3duKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0RmFpbFNlc3Npb25XaXRoTXVsdGlwbGVVaWRzKSB7CisgICAgQUxPR0QoIlRlc3RGYWlsU2Vzc2lvbldpdGhNdWx0aXBsZVVpZHMiKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBjbGllbnRVaWRzOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgdWlkLgorICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDApLCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiBTRVNTSU9OKDEpLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChDTElFTlQoMCksIFNFU1NJT04oMSksIFVJRCgxKSkpOworCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIFNFU1NJT04oMiksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFVJRCgxKSBtb3ZlcyB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgLy8gU0VTU0lPTigwKSBzaG91bGQgcGF1c2UsIFNFU1NJT04oMSkgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworCisgICAgLy8gQWRkIFVJRCgxKSBhbmQgVUlEKDIpIHRvIFNFU1NJT04oMikuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChDTElFTlQoMCksIFNFU1NJT04oMiksIFVJRCgxKSkpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpLCBVSUQoMikpKTsKKworICAgIC8vIEZhaWwgU0VTU0lPTigxKSwgU0VTU0lPTigyKSAobmV4dCBpbiBsaW5lIGZvciBVSUQoMSkpIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+b25FcnJvcihDTElFTlQoMCksIFNFU1NJT04oMSksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6RmFpbGVkKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Z2V0TGFzdEVycm9yKCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVW5rbm93bik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgJmNsaWVudFVpZHMpKTsKKworICAgIC8vIEZhaWwgU0VTU0lPTigyKSwgU0VTU0lPTigwKSBzaG91bGQgcmVzdW1lLgorICAgIG1Db250cm9sbGVyLT5vbkVycm9yKENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGYWlsZWQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtJbnZhbGlkT3BlcmF0aW9uKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigyKSwgJmNsaWVudFVpZHMpKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VG9wVWlkQ2hhbmdlZCkgeworICAgIEFMT0dEKCJUZXN0VG9wVWlkQ2hhbmdlZCIpOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgVUlELgorICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBNb3ZlIFVJRCgxKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIGRpZmZlcmVudCB1aWQgVUlEKDEpLgorICAgIC8vIFNob3VsZCBwYXVzZSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdGFydCBuZXcgc2Vzc2lvbi4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDIpLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gQnJpbmcgVUlEKDApIGJhY2sgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIEJyaW5nIGludmFsaWQgdWlkIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3Aoa0ludmFsaWRVaWQpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gRmluaXNoIHNlc3Npb24sIG5leHQgcmVhbC10aW1lIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGaW5pc2hlZChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBGaW5pc2ggc2Vzc2lvbiwgb2ZmbGluZSBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDIpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGaW5pc2hlZChDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VG9wVWlkQ2hhbmdlZE11bHRpcGxlVWlkcykgeworICAgIEFMT0dEKCJUZXN0VG9wVWlkQ2hhbmdlZE11bHRpcGxlVWlkcyIpOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgVUlELgorICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBCcmluZyBVSUQoMSkgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQWRkIFVJRCgxKSB0byBTRVNTSU9OKDApLCBTRVNTSU9OKDApIHNob3VsZCBjb250aW51ZSB0byBydW4KKyAgICAvLyAobm8gcGF1c2UmcmVzdW1lIG9mIHRoZSBzYW1lIHNlc3Npb24pLgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMSkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIEJyaW5nIFVJRCgwKSBiYWNrIHRvIHRvcCwgU0VTU0lPTigwKSBzaG91bGQgY29udGludWUgdG8gcnVuCisgICAgLy8gKG5vIHBhdXNlJnJlc3VtZSBvZiB0aGUgc2FtZSBzZXNzaW9uKS4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIEJyaW5nIFVJRCgyKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgyKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgLy8gQWRkIFVJRCgyKSB0byB0aGUgb2ZmbGluZSBzZXNzaW9uLCBpdCBzaG91bGQgYmUgc3RhcnRlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDIpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBBREQgVUlEKDMpIHRvIFNFU1NJT04oMCkuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmFkZENsaWVudFVpZChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgzKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIC8vIEJyaW5nIFVJRCgzKSB0byB0b3AsIFNFU1NJT04oMCkgc2hvdWxkIHJlc3VtZS4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDMpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMSksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBOb3cgbWFrZSBVSUQoMikgYWxzbyBibG9ja2VkIG9uIENMSUVOVCgwKSwgU0VTU0lPTigwKS4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDIpKSk7CisKKyAgICAvLyBCcmluZyBVSUQoMikgYmFjayB0byB0b3AsIENMSUVOVCgwKSwgU0VTU0lPTigwKSBzaG91bGQgY29udGludWUgdG8gcnVuIChldmVuIGlmIGl0J3MKKyAgICAvLyBhZGRlZCB0byBVSUQoMikncyBxdWV1ZSBsYXRlciB0aGFuIENMSUVOVCgxKSdzIFNFU1NJT04oMCkpLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMikpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RUb3BVaWRTZXRDaGFuZ2VkKSB7CisgICAgQUxPR0QoIlRlc3RUb3BVaWRTZXRDaGFuZ2VkIik7CisKKyAgICAvLyBTdGFydCB3aXRoIHVuc3BlY2lmaWVkIHRvcCBVSUQuCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFN1Ym1pdCBvZmZsaW5lIHNlc3Npb24gdG8gQ0xJRU5UKDApLCBzaG91bGQgbm90IHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMSksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2sxKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFNldCBVSUQoMCksIFVJRCgxKSB0byB0b3Agc2V0LgorICAgIC8vIFVJRCgwKSBzaG91bGQgY29udGludWUgdG8gcnVuLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcCh7VUlEKDApLCBVSUQoMSl9KTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMikgaW4gZGlmZmVyZW50IHVpZCBVSUQoMSkuCisgICAgLy8gVUlEKDApIHNob3VsZCBwYXVzZSBhbmQgVUlEKDEpIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDIpLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gUmVtb3ZlIFVJRCgwKSBmcm9tIHRvcCBzZXQsIGFuZCBvbmx5IGxlYXZlIFVJRCgxKSBpbiB0aGUgc2V0LgorICAgIC8vIFVJRCgxKSBzaG91bGQgY29udGludWUgdG8gcnVuLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gU2V0IFVJRCgwKSwgVUlEKDIpIHRvIHRvcCBzZXQuCisgICAgLy8gVUlEKDEpIHNob3VsZCBjb250aW51ZSB0byBydW4uCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKHtVSUQoMSksIFVJRCgyKX0pOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQnJpbmcgVUlEKDApIGJhY2sgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIEJyaW5nIGludmFsaWQgdWlkIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3Aoa0ludmFsaWRVaWQpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworCisgICAgLy8gRmluaXNoIHNlc3Npb24sIG5leHQgcmVhbC10aW1lIHNlc3Npb24gZnJvbSBVSUQoMSkgc2hvdWxkIHJlc3VtZSwgZXZlbiBpZiBVSUQoMSkKKyAgICAvLyBubyBsb25nZXIgdG9wLgorICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChDTElFTlQoMCksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZpbmlzaGVkKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIEZpbmlzaCBzZXNzaW9uLCBvZmZsaW5lIHNlc3Npb24gc2hvdWxkIHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5vbkZpbmlzaChDTElFTlQoMiksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZpbmlzaGVkKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgxKSwgU0VTU0lPTigwKSkpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RVaWRHb25lKSB7CisgICAgQUxPR0QoIlRlc3RVaWRHb25lIik7CisKKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDApKTsKKyAgICAvLyBTdGFydCB3aXRoIHVuc3BlY2lmaWVkIHRvcCBVSUQuCisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9ucyB0byBDTElFTlQoMCksIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpLCBVSUQoMSkpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMSksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMSksIFNFU1NJT04oMCksIFVJRCgxKSwgVUlEKDEpLCBtT2ZmbGluZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazEpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5hZGRDbGllbnRVaWQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMSkpKTsKKworICAgIC8vIFRlbGwgdGhlIGNvbnRyb2xsZXIgdGhhdCBVSUQoMCkgaXMgZ29uZS4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDEpKTsKKyAgICAvLyBDTElFTlQoMCkncyBTRVNTSU9OKDEpIHNob3VsZCBzdGFydCwgU0VTU0lPTigwKSBzaG91bGQgYmUgY2FuY2VsbGVkLgorICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIG1Db250cm9sbGVyLT5vblVpZEdvbmUoVUlEKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdG9wKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1VpZEdvbmVDYW5jZWxsZWQpOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xpZW50VWlkczsKKyAgICBFWFBFQ1RfRkFMU0UobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgJmNsaWVudFVpZHMpKTsKKyAgICBFWFBFQ1RfRVEoY2xpZW50VWlkcy5zaXplKCksIDEpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzWzBdLCBVSUQoMSkpOworCisgICAgLy8gVGVsbCB0aGUgY29udHJvbGxlciB0aGF0IFVJRCgxKSBpcyBnb25lIHRvby4KKyAgICBtQ29udHJvbGxlci0+b25VaWRHb25lKFVJRCgxKSk7CisgICAgLy8gQ0xJRU5UKDEpJ3MgU0VTU0lPTigwKSBzaG91bGQgc3RhcnQsIENMSUVOVCgwKSdzIFNFU1NJT04oMSkgc2hvdWxkIGJlIGNhbmNlbGxlZC4KKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdG9wKENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OkZhaWxlZChDTElFTlQoMCksIFNFU1NJT04oMSkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1VpZEdvbmVDYW5jZWxsZWQpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgxKSwgU0VTU0lPTigwKSkpOworICAgIC8vIENMSUVOVCgxKSBTRVNTSU9OKDApIHNob3VsZCBub3QgaGF2ZSBhbnkgY2xpZW50IHVpZHMgYXMgaXQncyBvbmx5IGtlcHQgZm9yIG9mZmxpbmUuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzLnNpemUoKSwgMCk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdEFkZEdldENsaWVudFVpZHMpIHsKKyAgICBBTE9HRCgiVGVzdEFkZEdldENsaWVudFVpZHMiKTsKKworICAgIC8vIEFkZC9nZXQgY2xpZW50IHVpZHMgd2l0aCBub24tZXhpc3RlbnQgc2Vzc2lvbiwgc2hvdWxkIGZhaWwuCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2xpZW50VWlkczsKKyAgICB1aWRfdCBvd25VaWQgPSA6OmdldHVpZCgpOworICAgIEVYUEVDVF9GQUxTRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgb3duVWlkKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgJmNsaWVudFVpZHMpKTsKKworICAgIC8vIFN1Ym1pdCBhIHJlYWwtdGltZSByZXF1ZXN0LgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDYWxsYmFjazApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFNob3VsZCBoYXZlIG93biB1aWQgaW4gY2xpZW50IHVpZHMuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzLnNpemUoKSwgMSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHNbMF0sIFVJRCgwKSk7CisKKyAgICAvLyBBZGQgVUlEKDApIGFnYWluIHNob3VsZCBmYWlsLgorICAgIEVYUEVDVF9GQUxTRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApKSk7CisKKyAgICAvLyBBZGQgb3duIHVpZCBzaG91bGQgc3VjY2VlZC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigwKSwgb3duVWlkKSk7CisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmdldENsaWVudFVpZHMoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCAmY2xpZW50VWlkcykpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gdWlkU2V0OworICAgIHVpZFNldC5pbnNlcnQoY2xpZW50VWlkcy5iZWdpbigpLCBjbGllbnRVaWRzLmVuZCgpKTsKKyAgICBFWFBFQ1RfRVEodWlkU2V0LnNpemUoKSwgMik7CisgICAgRVhQRUNUX0VRKHVpZFNldC5jb3VudChVSUQoMCkpLCAxKTsKKyAgICBFWFBFQ1RfRVEodWlkU2V0LmNvdW50KG93blVpZCksIDEpOworCisgICAgLy8gU3VibWl0IGFuIG9mZmxpbmUgcmVxdWVzdC4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRDYWxsYmFjazApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFNob3VsZCBub3QgaGF2ZSBvd24gdWlkIGluIGNsaWVudCB1aWRzLgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5nZXRDbGllbnRVaWRzKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgJmNsaWVudFVpZHMpKTsKKyAgICBFWFBFQ1RfRVEoY2xpZW50VWlkcy5zaXplKCksIDApOworCisgICAgLy8gTW92ZSBVSUQoMSkgdG8gdG9wLgorICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMSkpOworICAgIC8vIEFkZCBVSUQoMSkgdG8gb2ZmbGluZSBzZXNzaW9uLCBvZmZsaW5lIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGFuZCBTRVNTSU9OKDApIHNob3VsZCBwYXVzZS4KKyAgICBFWFBFQ1RfVFJVRShtQ29udHJvbGxlci0+YWRkQ2xpZW50VWlkKENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDEpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKSk7Cit9CisKKy8qIFRlc3QgcmVzb3VyY2UgbG9zdCB3aXRob3V0IHRoZXJtYWwgdGhyb3R0bGluZyAqLworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0UmVzb3VyY2VMb3N0KSB7CisgICAgQUxPR0QoIlRlc3RSZXNvdXJjZUxvc3QiKTsKKworICAgIC8vIFN0YXJ0IHdpdGggdW5zcGVjaWZpZWQgdG9wIFVJRC4KKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDApLCBzZXNzaW9uIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBtUmVhbHRpbWVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgwKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbU9mZmxpbmVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgwKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBNb3ZlIFVJRCgxKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIGRpZmZlcmVudCB1aWQgVUlEKDEpLgorICAgIC8vIFNob3VsZCBwYXVzZSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdGFydCBuZXcgc2Vzc2lvbi4KKyAgICBtUmVhbHRpbWVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgxKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDIpLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAwOiBObyBjYWxsIGludG8gUmVzb3VyY2VQb2xpY3kgaWYgcmVzb3VyY2UgbG9zdCBpcyBmcm9tIGEgbm9uLXJ1bm5pbmcKKyAgICAvLyBvciBub24tZXhpc3RlbnQgc2Vzc2lvbi4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDApLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwga0ludmFsaWRQaWQpOworICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlTG9zdChDTElFTlQoMyksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtUmVzb3VyY2VQb2xpY3ktPmdldFBpZCgpLCBrSW52YWxpZFBpZCk7CisKKyAgICAvLyBUZXN0IDE6IE5vIHF1ZXVlIGNoYW5nZSBkdXJpbmcgcmVzb3VyY2UgbG9zcy4KKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgbG9zdC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwgUElEKDEpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFNpZ25hbCByZXNvdXJjZSBhdmFpbGFibGUsIENMSUVOVCgyKSBzaG91bGQgcmVzdW1lLgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlQXZhaWxhYmxlKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAyOiBDaGFuZ2Ugb2YgcXVldWUgb3JkZXIgZHVyaW5nIHJlc291cmNlIGxvc3MuCisgICAgLy8gU2lnbmFsIHJlc291cmNlIGxvc3QuCisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VMb3N0KENMSUVOVCgyKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1SZXNvdXJjZVBvbGljeS0+Z2V0UGlkKCksIFBJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBNb3ZlIFVJRCgwKSBiYWNrIHRvIHRvcCwgc2hvdWxkIGhhdmUgbm8gcmVzdW1lIGR1ZSB0byBubyByZXNvdXJjZS4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDApKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFNpZ25hbCByZXNvdXJjZSBhdmFpbGFibGUsIENMSUVOVCgwKSBzaG91bGQgcmVzdW1lLgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlQXZhaWxhYmxlKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAzOgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlTG9zdChDTElFTlQoMCksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtUmVzb3VyY2VQb2xpY3ktPmdldFBpZCgpLCBQSUQoMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIC8vIENhbmNlbCB0aGUgcGF1c2VkIHRvcCBzZXNzaW9uIGR1cmluZyByZXNvdXJjZSBsb3N0LgorICAgIEVYUEVDVF9UUlVFKG1Db250cm9sbGVyLT5jYW5jZWwoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RvcChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgYXZhaWxhYmxlLCBDTElFTlQoMikncyBzZXNzaW9uIHNob3VsZCBzdGFydC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgNDogQWRkaW5nIG5ldyBxdWV1ZSBkdXJpbmcgcmVzb3VyY2UgbG9zcy4KKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgbG9zdC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwgUElEKDEpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIE1vdmUgVUlEKDIpIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDIpKTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMykgaW4gVUlEKDIpLCBzZXNzaW9uIHNob3VsZG4ndCBzdGFydCBkdWUgdG8gbm8gcmVzb3VyY2UuCisgICAgbVJlYWx0aW1lUmVxdWVzdC5jbGllbnRQaWQgPSBQSUQoMik7CisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMyksIFNFU1NJT04oMCksIFVJRCgzKSwgVUlEKDIpLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2szKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFNpZ25hbCByZXNvdXJjZSBhdmFpbGFibGUsIENMSUVOVCgzKSdzIHNlc3Npb24gc2hvdWxkIHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlQXZhaWxhYmxlKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDMpLCBTRVNTSU9OKDApKSk7Cit9CisKKy8qIFRlc3QgdGhlcm1hbCB0aHJvdHRsaW5nIHdpdGhvdXQgcmVzb3VyY2UgbG9zdCAqLworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VGhlcm1hbENhbGxiYWNrKSB7CisgICAgQUxPR0QoIlRlc3RUaGVybWFsQ2FsbGJhY2siKTsKKworICAgIC8vIFN0YXJ0IHdpdGggdW5zcGVjaWZpZWQgdG9wIFVJRC4KKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDApLCBzZXNzaW9uIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBtUmVhbHRpbWVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgwKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigwKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gU3VibWl0IG9mZmxpbmUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNob3VsZCBub3Qgc3RhcnQuCisgICAgbU9mZmxpbmVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgwKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgxKSwgU0VTU0lPTigwKSwgVUlEKDEpLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBNb3ZlIFVJRCgxKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgxKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBTdWJtaXQgcmVhbC10aW1lIHNlc3Npb24gdG8gQ0xJRU5UKDIpIGluIGRpZmZlcmVudCB1aWQgVUlEKDEpLgorICAgIC8vIFNob3VsZCBwYXVzZSBwcmV2aW91cyBzZXNzaW9uIGFuZCBzdGFydCBuZXcgc2Vzc2lvbi4KKyAgICBtUmVhbHRpbWVSZXF1ZXN0LmNsaWVudFBpZCA9IFBJRCgxKTsKKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgyKSwgU0VTU0lPTigwKSwgVUlEKDIpLCBVSUQoMSksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazIpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAwOiBCYXNpYyBjYXNlLCBubyBxdWV1ZSBjaGFuZ2UgZHVyaW5nIHRocm90dGxpbmcsIHRvcCBzZXNzaW9uIHNob3VsZCBwYXVzZS9yZXN1bWUKKyAgICAvLyB3aXRoIHRocm90dGxpbmcuCisgICAgbUNvbnRyb2xsZXItPm9uVGhyb3R0bGluZ1N0YXJ0ZWQoKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RvcHBlZCgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMTogQ2hhbmdlIG9mIHF1ZXVlIG9yZGVyIGR1cmluZyB0aGVybWFsIHRocm90dGxpbmcsIHdoZW4gdGhyb3R0bGluZyBzdG9wcywKKyAgICAvLyBuZXcgdG9wIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RhcnRlZCgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIG1VaWRQb2xpY3ktPnNldFRvcChVSUQoMCkpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdG9wcGVkKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAyOiBDYW5jZWwgc2Vzc2lvbiBkdXJpbmcgdGhyb3R0bGluZywgd2hlbiB0aHJvdHRsaW5nIHN0b3BzLCBuZXcgdG9wCisgICAgLy8gc2Vzc2lvbiBzaG91bGQgcmVzdW1lLgorICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdGFydGVkKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgLy8gQ2FuY2VsIHRoZSBwYXVzZWQgdG9wIHNlc3Npb24gZHVyaW5nIHRocm90dGxpbmcuCisgICAgRVhQRUNUX1RSVUUobUNvbnRyb2xsZXItPmNhbmNlbChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdG9wKENMSUVOVCgwKSwgU0VTU0lPTigwKSkpOworICAgIC8vIFRocm90dGxpbmcgc3RvcHMsIENMSUVOVCgyKSdzIHNlc3Npb24gc2hvdWxkIHN0YXJ0LgorICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdG9wcGVkKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UmVzdW1lKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworCisgICAgLy8gVGVzdCAzOiBBZGQgbmV3IHF1ZXVlIGR1cmluZyB0aHJvdHRsaW5nLCB3aGVuIHRocm90dGxpbmcgc3RvcHMsIG5ldyB0b3AKKyAgICAvLyBzZXNzaW9uIHNob3VsZCByZXN1bWUuCisgICAgbUNvbnRyb2xsZXItPm9uVGhyb3R0bGluZ1N0YXJ0ZWQoKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpQYXVzZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKyAgICAvLyBNb3ZlIFVJRCgyKSB0byB0b3AuCisgICAgbVVpZFBvbGljeS0+c2V0VG9wKFVJRCgyKSk7CisgICAgLy8gU3VibWl0IHJlYWwtdGltZSBzZXNzaW9uIHRvIENMSUVOVCgzKSBpbiBVSUQoMiksIHNlc3Npb24gc2hvdWxkbid0IHN0YXJ0IGR1cmluZyB0aHJvdHRsaW5nLgorICAgIG1SZWFsdGltZVJlcXVlc3QuY2xpZW50UGlkID0gUElEKDIpOworICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDMpLCBTRVNTSU9OKDApLCBVSUQoMyksIFVJRCgyKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMyk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgLy8gVGhyb3R0bGluZyBzdG9wcywgQ0xJRU5UKDMpJ3Mgc2Vzc2lvbiBzaG91bGQgc3RhcnQuCisgICAgbUNvbnRyb2xsZXItPm9uVGhyb3R0bGluZ1N0b3BwZWQoKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMyksIFNFU1NJT04oMCkpKTsKK30KKworLyogVGVzdCByZXNvdXJjZSBsb3N0IGFuZCB0aGVybWFsIHRocm90dGxpbmcgaGFwcGVuaW5nIHNpbXVsdGFuZW91c2x5ICovCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RSZXNvdXJjZUxvc3RBbmRUaGVybWFsQ2FsbGJhY2spIHsKKyAgICBBTE9HRCgiVGVzdFJlc291cmNlTG9zdEFuZFRoZXJtYWxDYWxsYmFjayIpOworCisgICAgLy8gU3RhcnQgd2l0aCB1bnNwZWNpZmllZCB0b3AgVUlELgorICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMCksIHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIG1SZWFsdGltZVJlcXVlc3QuY2xpZW50UGlkID0gUElEKDApOworICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBTdWJtaXQgb2ZmbGluZSBzZXNzaW9uIHRvIENMSUVOVCgwKSwgc2hvdWxkIG5vdCBzdGFydC4KKyAgICBtT2ZmbGluZVJlcXVlc3QuY2xpZW50UGlkID0gUElEKDApOworICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDEpLCBTRVNTSU9OKDApLCBVSUQoMSksIFVJRCgwKSwgbU9mZmxpbmVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2sxKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIE1vdmUgVUlEKDEpIHRvIHRvcC4KKyAgICBtVWlkUG9saWN5LT5zZXRUb3AoVUlEKDEpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKworICAgIC8vIFN1Ym1pdCByZWFsLXRpbWUgc2Vzc2lvbiB0byBDTElFTlQoMikgaW4gZGlmZmVyZW50IHVpZCBVSUQoMSkuCisgICAgLy8gU2hvdWxkIHBhdXNlIHByZXZpb3VzIHNlc3Npb24gYW5kIHN0YXJ0IG5ldyBzZXNzaW9uLgorICAgIG1SZWFsdGltZVJlcXVlc3QuY2xpZW50UGlkID0gUElEKDEpOworICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApLCBVSUQoMiksIFVJRCgxKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMik7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDApKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBUZXN0IDA6IFJlc291cmNlIGxvc3QgZHVyaW5nIHRocm90dGxpbmcuCisgICAgLy8gVGhyb3R0bGluZyBzdGFydHMsIHRvcCBzZXNzaW9uIHNob3VsZCBwYXVzZS4KKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RhcnRlZCgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlBhdXNlKENMSUVOVCgyKSwgU0VTU0lPTigwKSkpOworICAgIC8vIFNpZ25hbCByZXNvdXJjZSBsb3N0LCB0aGlzIHNob3VsZCBnZXQgaWdub3JlZCBiZWNhdXNlIHRoZSBzZXNzaW9uIGlzIG5vdyBwYXVzZWQuCisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VMb3N0KENMSUVOVCgyKSwgU0VTU0lPTigwKSk7CisgICAgRVhQRUNUX0VRKG1SZXNvdXJjZVBvbGljeS0+Z2V0UGlkKCksIGtJbnZhbGlkUGlkKTsKKyAgICAvLyBTaWduYWwgcmVzb3VyY2UgYXZhaWxhYmxlLCBDTElFTlQoMikgc2hvdWxkbid0IHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgIC8vIFRocm90dGxpbmcgZW5kcywgdG9wIHNlc3Npb24gc2hvdWxkIHJlc3VtZS4KKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RvcHBlZCgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMTogVGhyb3R0bGluZyBkdXJpbmcgcmVzb3VyY2UgbG9zdC4KKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUxvc3QoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKTsKKyAgICBFWFBFQ1RfRVEobVJlc291cmNlUG9saWN5LT5nZXRQaWQoKSwgUElEKDEpKTsKKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RhcnRlZCgpOworICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdG9wcGVkKCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6Tm9FdmVudCk7CisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VBdmFpbGFibGUoKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDIpLCBTRVNTSU9OKDApKSk7CisKKyAgICAvLyBUZXN0IDI6IEludGVybGVhdmluZyByZXNvdXJjZSBsb3N0IGFuZCB0aHJvdHRsaW5nLgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlTG9zdChDTElFTlQoMiksIFNFU1NJT04oMCkpOworICAgIEVYUEVDVF9FUShtUmVzb3VyY2VQb2xpY3ktPmdldFBpZCgpLCBQSUQoMSkpOworICAgIG1Db250cm9sbGVyLT5vblRocm90dGxpbmdTdGFydGVkKCk7CisgICAgbUNvbnRyb2xsZXItPm9uUmVzb3VyY2VBdmFpbGFibGUoKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKyAgICBtQ29udHJvbGxlci0+b25UaHJvdHRsaW5nU3RvcHBlZCgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMiksIFNFU1NJT04oMCkpKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VHJhbnNjb2RlcldhdGNoZG9nTm9IZWFydGJlYXQpIHsKKyAgICBBTE9HRCgiVGVzdFRyYW5zY29kZXJXYXRjaGRvZ1RpbWVvdXQiKTsKKworICAgIC8vIFN1Ym1pdCBzZXNzaW9uIHRvIENMSUVOVCgwKSBpbiBVSUQoMCkuCisgICAgLy8gU2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5IChiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgc2Vzc2lvbikuCisgICAgbUNvbnRyb2xsZXItPnN1Ym1pdChDTElFTlQoMCksIFNFU1NJT04oMCksIFVJRCgwKSwgVUlEKDApLCBtUmVhbHRpbWVSZXF1ZXN0LCBtQ2xpZW50Q2FsbGJhY2swKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpTdGFydChDTElFTlQoMCksIFNFU1NJT04oMCkpKTsKKworICAgIC8vIFRlc3QgMTogSWYgbm90IHNlbmRpbmcga2VlcC1hbGl2ZSBhdCBhbGwsIHRpbWVvdXQgYWZ0ZXIgMyBzZWNvbmRzLgorICAgIGV4cGVjdFRpbWVvdXQoQ0xJRU5UKDApLCBTRVNTSU9OKDApLCAyKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VHJhbnNjb2RlcldhdGNoZG9nSGVhcnRiZWF0KSB7CisgICAgLy8gVGVzdCAyOiBObyB0aW1lb3V0IGFzIGxvbmcgYXMga2VlcC1hbGl2ZSBjb21pbmc7IHRpbWVvdXQgYWZ0ZXIga2VlcC1hbGl2ZSBzdG9wcy4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigxKSwgVUlEKDApLCBVSUQoMCksIG1SZWFsdGltZVJlcXVlc3QsIG1DbGllbnRDYWxsYmFjazApOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoKSwgVGVzdFRyYW5zY29kZXI6OlN0YXJ0KENMSUVOVCgwKSwgU0VTU0lPTigxKSkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgxMDAwMDAwKSwgVGVzdFRyYW5zY29kZXI6Ok5vRXZlbnQpOworICAgICAgICBtQ29udHJvbGxlci0+b25IZWFydEJlYXQoQ0xJRU5UKDApLCBTRVNTSU9OKDEpKTsKKyAgICB9CisgICAgZXhwZWN0VGltZW91dChDTElFTlQoMCksIFNFU1NJT04oMSksIDIpOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RUcmFuc2NvZGVyV2F0Y2hkb2dEdXJpbmdQYXVzZSkgeworICAgIGludCBleHBlY3RlZEdlbiA9IDI7CisKKyAgICAvLyBUZXN0IDNhOiBObyB0aW1lb3V0IGZvciBwYXVzZWQgc2Vzc2lvbiBldmVuIGlmIG5vIGtlZXAtYWxpdmUgaXMgc2VudC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigyKSwgVUlEKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDIpKSk7CisgICAgLy8gVHJpZ2dlciBhIHBhdXNlIGJ5IHNlbmRpbmcgYSByZXNvdXJjZSBsb3N0LgorICAgIG1Db250cm9sbGVyLT5vblJlc291cmNlTG9zdChDTElFTlQoMCksIFNFU1NJT04oMikpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoMzEwMDAwMCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKyAgICBtQ29udHJvbGxlci0+b25SZXNvdXJjZUF2YWlsYWJsZSgpOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoMTAwMDAwKSwgVGVzdFRyYW5zY29kZXI6OlJlc3VtZShDTElFTlQoMCksIFNFU1NJT04oMikpKTsKKyAgICBleHBlY3RUaW1lb3V0KENMSUVOVCgwKSwgU0VTU0lPTigyKSwgZXhwZWN0ZWRHZW4rKyk7CisKKyAgICAvLyBUZXN0IDNiOiBObyB0aW1lb3V0IGZvciBwYXVzZWQgc2Vzc2lvbiBldmVuIGlmIG5vIGtlZXAtYWxpdmUgaXMgc2VudC4KKyAgICBtQ29udHJvbGxlci0+c3VibWl0KENMSUVOVCgwKSwgU0VTU0lPTigzKSwgVUlEKDApLCBVSUQoMCksIG1PZmZsaW5lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7CisgICAgLy8gTGV0IHRoZSBzZXNzaW9uIHJ1biBhbG1vc3QgdG8gdGltZW91dCwgdG8gdGVzdCB0aW1lb3V0IHJlc2V0IGFmdGVyIHBhdXNlLgorICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+cG9wRXZlbnQoMjkwMDAwMCksIFRlc3RUcmFuc2NvZGVyOjpOb0V2ZW50KTsKKyAgICAvLyBUcmlnZ2VyIGEgcGF1c2UgYnkgc3VibWl0dGluZyBhIGhpZ2hlci1wcmlvcml0eSByZXF1ZXN0LgorICAgIG1Db250cm9sbGVyLT5zdWJtaXQoQ0xJRU5UKDApLCBTRVNTSU9OKDQpLCBVSUQoMCksIFVJRCgwKSwgbVJlYWx0aW1lUmVxdWVzdCwgbUNsaWVudENhbGxiYWNrMCk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6UGF1c2UoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5wb3BFdmVudCgpLCBUZXN0VHJhbnNjb2Rlcjo6U3RhcnQoQ0xJRU5UKDApLCBTRVNTSU9OKDQpKSk7CisgICAgLy8gRmluaXNoIHRoZSBoaWdoZXItcHJpb3JpdHkgc2Vzc2lvbiwgbG93ZXItcHJpb3JpdHkgc2Vzc2lvbiBzaG91bGQgcmVzdW1lLAorICAgIC8vIGFuZCB0aGUgdGltZW91dCBzaG91bGQgcmVzZXQgdG8gZnVsbCB2YWx1ZS4KKyAgICBtQ29udHJvbGxlci0+b25GaW5pc2goQ0xJRU5UKDApLCBTRVNTSU9OKDQpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpGaW5pc2hlZChDTElFTlQoMCksIFNFU1NJT04oNCkpKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPnBvcEV2ZW50KCksIFRlc3RUcmFuc2NvZGVyOjpSZXN1bWUoQ0xJRU5UKDApLCBTRVNTSU9OKDMpKSk7CisgICAgZXhwZWN0VGltZW91dChDTElFTlQoMCksIFNFU1NJT04oMyksIGV4cGVjdGVkR2VuKyspOworfQorCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RUcmFuc2NvZGVyUGFjZXJPdmVyQ291bnRPbmx5KSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGVyUGFjZXJPdmVyQ291bnRPbmx5Iik7CisgICAgdGVzdFBhY2VySGVscGVyKDEyIC8qbnVtU3VibWl0cyovLCAxMDAgLypzZXNzaW9uRHVyYXRpb25NcyovLCAxMiAvKmV4cGVjdGVkU3VjY2VzcyovKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VHJhbnNjb2RlclBhY2VyT3ZlclRpbWVPbmx5KSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGVyUGFjZXJPdmVyVGltZU9ubHkiKTsKKyAgICB0ZXN0UGFjZXJIZWxwZXIoNSAvKm51bVN1Ym1pdHMqLywgMTAwMCAvKnNlc3Npb25EdXJhdGlvbk1zKi8sIDUgLypleHBlY3RlZFN1Y2Nlc3MqLyk7Cit9CisKK1RFU1RfRihUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyVGVzdCwgVGVzdFRyYW5zY29kZXJQYWNlck92ZXJRdW90YSkgeworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RlclBhY2VyT3ZlclF1b3RhIik7CisgICAgdGVzdFBhY2VySGVscGVyKDEyIC8qbnVtU3VibWl0cyovLCA0MDAgLypzZXNzaW9uRHVyYXRpb25NcyovLCAxMCAvKmV4cGVjdGVkU3VjY2VzcyovKTsKK30KKworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VHJhbnNjb2RlclBhY2VyV2l0aFBhdXNlKSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGVyUGFjZXJEdXJpbmdQYXVzZSIpOworICAgIHRlc3RQYWNlckhlbHBlcldpdGhQYXVzZSgxMiAvKm51bVN1Ym1pdHMqLywgNDAwIC8qc2Vzc2lvbkR1cmF0aW9uTXMqLywgMTAgLypleHBlY3RlZFN1Y2Nlc3MqLyk7Cit9CisKKy8qCisgKiBUZXN0IHRoZSBjYXNlIHdoZXJlIG11bHRpcGxlIGNsaWVudCB1aWRzIHJlcXVlc3QgdGhlIHNhbWUgc2Vzc2lvbi4gU2Vzc2lvbiBzaG91bGQgb25seQorICogYmUgZHJvcHBlZCB3aGVuIGFsbCBjbGllbnRzIGFyZSBvdmVyIHF1b3RhLgorICovCitURVNUX0YoVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlclRlc3QsIFRlc3RUcmFuc2NvZGVyUGFjZXJNdWx0aXBsZVVpZHMpIHsKKyAgICBBTE9HRCgiVGVzdFRyYW5zY29kZXJQYWNlck11bHRpcGxlVWlkcyIpOworICAgIC8vIEZpcnN0LCBydW4gbUNsaWVudENhbGxiYWNrMCB0byB0aGUgcG9pbnQgb2Ygbm8gcXVvdGEuCisgICAgdGVzdFBhY2VySGVscGVyV2l0aE11bHRpcGxlVWlkcygxMiAvKm51bVN1Ym1pdHMqLywgNDAwIC8qc2Vzc2lvbkR1cmF0aW9uTXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwIC8qZXhwZWN0ZWRTdWNjZXNzKi8sIG1DbGllbnRDYWxsYmFjazAsIHt9KTsKKyAgICAvLyBNYWtlIFVJRCgwKSBibG9jayBvbiBDbGllbnQxJ3Mgc2Vzc2lvbnMgdG9vLCBDbGllbnQxJ3MgcXVvdGEgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZC4KKyAgICB0ZXN0UGFjZXJIZWxwZXJXaXRoTXVsdGlwbGVVaWRzKDEyIC8qbnVtU3VibWl0cyovLCA0MDAgLypzZXNzaW9uRHVyYXRpb25NcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgLypleHBlY3RlZFN1Y2Nlc3MqLywgbUNsaWVudENhbGxiYWNrMSwge1VJRCgwKX0pOworICAgIC8vIE1ha2UgVUlEKDEwKSBibG9jayBvbiBDbGllbnQyJ3Mgc2Vzc2lvbnMuIFdlIGV4cGVjdCB0byBzZWUgMTEgc3VjY2VlZHMgKGluc3RlYWQgb2YgMTApLAorICAgIC8vIGJlY2F1c2UgdGhlIGFkZENsaWVudFVpZCgpIGlzIGNhbGxlZCBhZnRlciB0aGUgc3VibWl0LCBhbmQgZmlyc3Qgc2Vzc2lvbiBpcyBhbHJlYWR5CisgICAgLy8gc3RhcnRlZCBieSB0aGUgdGltZSBVSUQoMTApIGlzIGFkZGVkLiBVSUQoMTApIGFsbG93ZWQgdXMgdG8gcnVuIHRoZSAxMXRoIHNlc3Npb24sCisgICAgLy8gYWZ0ZXIgdGhhdCBib3RoIFVJRCgxMCkgYW5kIFVJRCgyKSBhcmUgb3V0IG9mIHF1b3RhLgorICAgIHRlc3RQYWNlckhlbHBlcldpdGhNdWx0aXBsZVVpZHMoMTIgLypudW1TdWJtaXRzKi8sIDQwMCAvKnNlc3Npb25EdXJhdGlvbk1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAvKmV4cGVjdGVkU3VjY2VzcyovLCBtQ2xpZW50Q2FsbGJhY2syLCB7VUlEKDEwKX0pOworfQorCisvKgorICogVXNlIHNhbWUgdWlkIGZvciBjbGllbnRVaWQgYW5kIGNhbGxpbmdVaWQsIHNob3VsZCBub3QgYmUgbGltaXRlZCBieSBxdW90YS4KKyAqLworVEVTVF9GKFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJUZXN0LCBUZXN0VHJhbnNjb2RlclBhY2VyU2VsZlVpZCkgeworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RlclBhY2VyU2VsZlVpZCIpOworICAgIHRlc3RQYWNlckhlbHBlcldpdGhTZWxmVWlkKDEyIC8qbnVtU3VibWl0cyovLCA0MDAgLypzZXNzaW9uRHVyYXRpb25NcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyIC8qZXhwZWN0ZWRTdWNjZXNzKi8pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL1ZpZGVvXzRLX0hFVkNfMTBGcmFtZXNfQXVkaW8ubXA0IGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL1ZpZGVvXzRLX0hFVkNfMTBGcmFtZXNfQXVkaW8ubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTJkZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvVmlkZW9fNEtfSEVWQ18xMEZyYW1lc19BdWRpby5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2JhY2t5YXJkX2hldmNfMTkyMHgxMDgwXzIwTWJwcy5tcDQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvYmFja3lhcmRfaGV2Y18xOTIweDEwODBfMjBNYnBzLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQxZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2JhY2t5YXJkX2hldmNfMTkyMHgxMDgwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2N1YmljbGVfYXZjXzQ4MHgyNDBfYWFjXzI0S0h6Lm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZTFiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2Rlc2tfaGV2Y18xOTIweDEwODBfYWFjXzQ4S0h6X3JvdDkwLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9kZXNrX2hldmNfMTkyMHgxMDgwX2FhY180OEtIel9yb3Q5MC5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0MmExNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9kZXNrX2hldmNfMTkyMHgxMDgwX2FhY180OEtIel9yb3Q5MC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0IGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTRiOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvamV0c19oZXZjXzEyODB4NzIwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2Fzc2V0cy9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBkOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL3BsZXhfaGV2Y18zODQweDIxNjBfMTJNYnBzLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzEyTWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzEyTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL3BsZXhfaGV2Y18zODQweDIxNjBfMjBNYnBzLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzIwTWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlMzdiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9wbGV4X2hldmNfMzg0MHgyMTYwXzIwTWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9hc3NldHMvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL3ZpZGVvXzEyODB4NzIwX2hldmNfaGRyMTBfc3RhdGljXzNtYnBzLm1wNCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy92aWRlb18xMjgweDcyMF9oZXZjX2hkcjEwX3N0YXRpY18zbWJwcy5tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxNTBkNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy92aWRlb18xMjgweDcyMF9oZXZjX2hkcjEwX3N0YXRpY18zbWJwcy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCmluZGV4IGQ4ZTQ4MzAuLjNjYmYxZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTMsMjQgKzMsMzYgQEAKICMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgogIwogCi1pZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KLSAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCi0gICAgZXhpdCAtMQoraWYgWyAiJFNZTkNfRklOSVNIRUQiICE9IHRydWUgXTsgdGhlbgorICBpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICAgIGV4aXQgLTEKKyAgZmkKKworICAjIGVuc3VyZSB3ZSBoYXZlIG1tCisgIC4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKKyAgbW0KKworICBlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKKyAgYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50ICYmIGFkYiBzeW5jCiBmaQogCi0jIGVuc3VyZSB3ZSBoYXZlIG1tCi0uICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAotCi1tbQotCi1lY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCi0KLWFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYwotCiBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgogCiBlY2hvICJ0ZXN0aW5nIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciIKLWFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cworI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyX3Rlc3RzL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlcl90ZXN0cwogCiBlY2hvICJ0ZXN0aW5nIEFkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlIgotYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cy9BZGp1c3RhYmxlTWF4UHJpb3JpdHlRdWV1ZV90ZXN0cworI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMvQWRqdXN0YWJsZU1heFByaW9yaXR5UXVldWVfdGVzdHMKK2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0L0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzL0FkanVzdGFibGVNYXhQcmlvcml0eVF1ZXVlX3Rlc3RzCisKK2VjaG8gInRlc3RpbmcgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlciIKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L1RyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXJfdGVzdHMvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcl90ZXN0cy9UcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyX3Rlc3RzCisKK2VjaG8gInRlc3RpbmcgVHJhbnNjb2RpbmdMb2dnZXIiCisjYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9UcmFuc2NvZGluZ0xvZ2dlcl90ZXN0cy9UcmFuc2NvZGluZ0xvZ2dlcl90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvVHJhbnNjb2RpbmdMb2dnZXJfdGVzdHMvVHJhbnNjb2RpbmdMb2dnZXJfdGVzdHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvcHVzaF9hc3NldHMuc2ggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL3B1c2hfYXNzZXRzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjNzE1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL3B1c2hfYXNzZXRzLnNoCkBAIC0wLDAgKzEsMzIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFB1c2hlcyB0aGUgYXNzZXRzIHRvIHRoZSAvZGF0YS9sb2NhbC90bXAuCisjCisKK2lmIFsgIiRTWU5DX0ZJTklTSEVEIiAhPSB0cnVlIF07IHRoZW4KKyAgaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgICBleGl0IC0xCisgIGZpCisKKyAgIyBlbnN1cmUgd2UgaGF2ZSBtbQorICAuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCisgIG1tCisKKyAgZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCisgIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorZmkKKworZWNobyAiQ29weWluZyBmaWxlcyB0byBkZXZpY2UiCisKK2FkYiBzaGVsbCBta2RpciAtcCAvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzCisKK0ZJTEVTPSRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzL1RyYW5zY29kaW5nVGVzdEFzc2V0cy8qCitmb3IgZmlsZSBpbiAkRklMRVMKK2RvIAorYWRiIHB1c2ggLS1zeW5jICRmaWxlIC9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMKK2RvbmUKKworZWNobyAiQ29weSBkb25lIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IyZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJtZWRpYXRyYW5zY29kZXJfZGVmYXVsdHMiLAorCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFTYW1wbGVRdWV1ZS5jcHAiLAorICAgICAgICAiTWVkaWFTYW1wbGVSZWFkZXJOREsuY3BwIiwKKyAgICAgICAgIk1lZGlhU2FtcGxlV3JpdGVyLmNwcCIsCisgICAgICAgICJNZWRpYVRyYWNrVHJhbnNjb2Rlci5jcHAiLAorICAgICAgICAiTWVkaWFUcmFuc2NvZGVyLmNwcCIsCisgICAgICAgICJOZGtDb21tb24uY3BwIiwKKyAgICAgICAgIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmNwcCIsCisgICAgICAgICJWaWRlb1RyYWNrVHJhbnNjb2Rlci5jcHAiLAorICAgIF0sCisKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisKKyAgICAvL2hlYWRlcl9saWJzOiBbICJsaWJhcmVjdF9oZWFkZXJzIiwgImxpYmFyZWN0X2hlYWRlcnNfZm9yX25kayIgXSwKKyAgICBzdGF0aWNfbGliczogWyAibGliYXJlY3QiIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2Zvcm1hdCIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XdGhyZWFkLXNhZmV0eSIsCisgICAgICAgICItV3VudXNlZCIsCisgICAgICAgICItV3VucmVhY2hhYmxlLWNvZGUiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYXRyYW5zY29kZXIiLAorICAgIGRlZmF1bHRzOiBbIm1lZGlhdHJhbnNjb2Rlcl9kZWZhdWx0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUXVldWUuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODVjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFTYW1wbGVRdWV1ZS5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2FtcGxlUXVldWUiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIE1lZGlhU2FtcGxlUXVldWU6OmVucXVldWUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKCFtQWJvcnRlZCkgeworICAgICAgICBtU2FtcGxlUXVldWUucHVzaChzYW1wbGUpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisgICAgcmV0dXJuIG1BYm9ydGVkOworfQorCisvLyBVbmZvcnR1bmF0ZWx5IHN0ZDo6dW5pcXVlX2xvY2sgaXMgaW5jb21wYXRpYmxlIHdpdGggLVd0aHJlYWQtc2FmZXR5Citib29sIE1lZGlhU2FtcGxlUXVldWU6OmRlcXVldWUoc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiogc2FtcGxlKSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICB3aGlsZSAobVNhbXBsZVF1ZXVlLmVtcHR5KCkgJiYgIW1BYm9ydGVkKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICB9CisKKyAgICBpZiAoIW1BYm9ydGVkKSB7CisgICAgICAgIGlmIChzYW1wbGUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgKnNhbXBsZSA9IG1TYW1wbGVRdWV1ZS5mcm9udCgpOworICAgICAgICB9CisgICAgICAgIG1TYW1wbGVRdWV1ZS5wb3AoKTsKKyAgICB9CisgICAgcmV0dXJuIG1BYm9ydGVkOworfQorCitib29sIE1lZGlhU2FtcGxlUXVldWU6OmlzRW1wdHkoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIG1TYW1wbGVRdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIE1lZGlhU2FtcGxlUXVldWU6OmFib3J0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIC8vIENsZWFyIHRoZSBxdWV1ZSBhbmQgbm90aWZ5IGNvbnN1bWVycy4KKyAgICBzdGQ6OnF1ZXVlPHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4+IGVtcHR5ID0ge307CisgICAgc3RkOjpzd2FwKG1TYW1wbGVRdWV1ZSwgZW1wdHkpOworICAgIG1BYm9ydGVkID0gdHJ1ZTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlUmVhZGVyTkRLLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVJlYWRlck5ESy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzNmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVJlYWRlck5ESy5jcHAKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNhbXBsZVJlYWRlciIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDaGVjayB0aGF0IHRoZSBleHRyYWN0b3Igc2FtcGxlIGZsYWdzIGhhdmUgdGhlIGV4cGVjdGVkIE5ESyBtZWFuaW5nLgorc3RhdGljX2Fzc2VydChTQU1QTEVfRkxBR19TWU5DX1NBTVBMRSA9PSBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfU1lOQywKKyAgICAgICAgICAgICAgIlNhbXBsZSBmbGFnIG1pc21hdGNoOiBTWU5DX1NBTVBMRSIpOworCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChpbnQgZmQsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIEFNZWRpYUV4dHJhY3RvciI7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgb2Zmc2V0LCBzaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkIHJldHVybmVkIGVycm9yOiAiIDw8IHN0YXR1czsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleHRyYWN0b3IpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBhdXRvIHNhbXBsZVJlYWRlciA9IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlck5ESz4obmV3IE1lZGlhU2FtcGxlUmVhZGVyTkRLKGV4dHJhY3RvcikpOworICAgIHJldHVybiBzYW1wbGVSZWFkZXI7Cit9CisKK01lZGlhU2FtcGxlUmVhZGVyTkRLOjpNZWRpYVNhbXBsZVJlYWRlck5ESyhBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvcikKKyAgICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLCBtVHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtRXh0cmFjdG9yKSkgeworICAgIGlmIChtVHJhY2tDb3VudCA+IDApIHsKKyAgICAgICAgbVRyYWNrQ3Vyc29ycy5yZXNpemUobVRyYWNrQ291bnQpOworICAgIH0KK30KKworTWVkaWFTYW1wbGVSZWFkZXJOREs6On5NZWRpYVNhbXBsZVJlYWRlck5ESygpIHsKKyAgICBpZiAobUV4dHJhY3RvciAhPSBudWxscHRyKSB7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgfQorfQorCit2b2lkIE1lZGlhU2FtcGxlUmVhZGVyTkRLOjphZHZhbmNlVHJhY2tfbChpbnQgdHJhY2tJbmRleCkgeworICAgIGlmICghbUVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKSB7CisgICAgICAgIC8vIE5vdGU6IFBvc2l0aW9uaW5nIHRoZSBleHRyYWN0b3IgYmVmb3JlIGFkdmFuY2luZyB0aGUgdHJhY2sgaXMgbmVlZGVkIGZvciB0d28gcmVhc29uczoKKyAgICAgICAgLy8gMS4gVG8gZW5hYmxlIG11bHRpcGxlIGFkdmFuY2VzIHdpdGhvdXQgZXhwbGljaXRseSBsZXR0aW5nIHRoZSBleHRyYWN0b3IgY2F0Y2ggdXAuCisgICAgICAgIC8vIDIuIFRvIHByZXZlbnQgdGhlIGV4dHJhY3RvciBmcm9tIGJlaW5nIGZhcnRoZXIgdGhhbiAibmV4dCIuCisgICAgICAgICh2b2lkKW1vdmVUb1RyYWNrX2wodHJhY2tJbmRleCk7CisgICAgfQorCisgICAgU2FtcGxlQ3Vyc29yJiBjdXJzb3IgPSBtVHJhY2tDdXJzb3JzW3RyYWNrSW5kZXhdOworICAgIGN1cnNvci5wcmV2aW91cyA9IGN1cnNvci5jdXJyZW50OworICAgIGN1cnNvci5jdXJyZW50ID0gY3Vyc29yLm5leHQ7CisgICAgY3Vyc29yLm5leHQucmVzZXQoKTsKKworICAgIGlmIChtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MgJiYgdHJhY2tJbmRleCA9PSBtRXh0cmFjdG9yVHJhY2tJbmRleCkgeworICAgICAgICB3aGlsZSAoYWR2YW5jZUV4dHJhY3Rvcl9sKCkpIHsKKyAgICAgICAgICAgIFNhbXBsZUN1cnNvciYgY3Vyc29yID0gbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF07CisgICAgICAgICAgICBpZiAoY3Vyc29yLmN1cnJlbnQuaXNTZXQgJiYgY3Vyc29yLmN1cnJlbnQuaW5kZXggPT0gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKG1FeHRyYWN0b3JUcmFja0luZGV4ICE9IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRyYWNrU2lnbmFsc1ttRXh0cmFjdG9yVHJhY2tJbmRleF0ubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK2Jvb2wgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmFkdmFuY2VFeHRyYWN0b3JfbCgpIHsKKyAgICAvLyBSZXNldCB0aGUgIm5leHQiIHNhbXBsZSB0aW1lIHdoZW5ldmVyIHRoZSBleHRyYWN0b3IgYWR2YW5jZXMgcGFzdCBhIHNhbXBsZSB0aGF0IGlzIGN1cnJlbnQsCisgICAgLy8gdG8gZW5zdXJlIHRoYXQgIm5leHQiIGlzIGFwcHJvcHJpYXRlbHkgdXBkYXRlZCB3aGVuIHRoZSBleHRyYWN0b3IgYWR2YW5jZXMgb3ZlciB0aGUgbmV4dAorICAgIC8vIHNhbXBsZSBvZiB0aGF0IHRyYWNrLgorICAgIGlmIChtVHJhY2tDdXJzb3JzW21FeHRyYWN0b3JUcmFja0luZGV4XS5jdXJyZW50LmlzU2V0ICYmCisgICAgICAgIG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLmN1cnJlbnQuaW5kZXggPT0gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgIG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLm5leHQucmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIGV4dHJhY3RvcidzIHNhbXBsZSBpbmRleCBldmVuIGlmIHRoaXMgdHJhY2sgcmVhY2hlcyBFT1MsIHNvIHRoYXQgdGhlIG90aGVyIHRyYWNrcworICAgIC8vIGFyZSBub3QgZ2l2ZW4gYW4gaW5jb3JyZWN0IGV4dHJhY3RvciBwb3NpdGlvbi4KKyAgICBtRXh0cmFjdG9yU2FtcGxlSW5kZXgrKzsKKyAgICBpZiAoIUFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIiAgRU9TIGluIGFkdmFuY2VFeHRyYWN0b3JfbCI7CisgICAgICAgIG1Fb3NSZWFjaGVkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbVRyYWNrU2lnbmFscy5iZWdpbigpOyBpdCAhPSBtVHJhY2tTaWduYWxzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKworICAgIFNhbXBsZUN1cnNvciYgY3Vyc29yID0gbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF07CisgICAgaWYgKG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IGN1cnNvci5wcmV2aW91cy5pbmRleCkgeworICAgICAgICBpZiAoIWN1cnNvci5jdXJyZW50LmlzU2V0KSB7CisgICAgICAgICAgICBjdXJzb3IuY3VycmVudC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWN1cnNvci5uZXh0LmlzU2V0ICYmIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IGN1cnNvci5jdXJyZW50LmluZGV4KSB7CisgICAgICAgICAgICBjdXJzb3IubmV4dC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnNlZWtFeHRyYWN0b3JCYWNrd2FyZHNfbChpbnQ2NF90IHRhcmdldFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldFRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRhcmdldFNhbXBsZUluZGV4KSB7CisgICAgaWYgKHRhcmdldFNhbXBsZUluZGV4ID4gbUV4dHJhY3RvclNhbXBsZUluZGV4KSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yOiBGb3J3YXJkIHNlZWsgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8gQU1lZGlhRXh0cmFjdG9yIHN1cHBvcnRzIHJlYWRpbmcgbmVnYXRpdmUgdGltZXN0YW1wcyBidXQgZG9lcyBub3Qgc3VwcG9ydCBzZWVraW5nIHRvIHRoZW0uCisgICAgY29uc3QgaW50NjRfdCBzZWVrVG9UaW1lVXMgPSBzdGQ6Om1heCh0YXJnZXRUaW1lVXMsIChpbnQ2NF90KTApOworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1FeHRyYWN0b3IsIHNlZWtUb1RpbWVVcywgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQyk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNlZWsgdG8gIiA8PCBzZWVrVG9UaW1lVXMgPDwgIiwgdGFyZ2V0ICIgPDwgdGFyZ2V0VGltZVVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1Fb3NSZWFjaGVkID0gZmFsc2U7CisgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICBpbnQ2NF90IHNhbXBsZVRpbWVVcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworCisgICAgd2hpbGUgKHNhbXBsZVRpbWVVcyAhPSB0YXJnZXRUaW1lVXMgfHwgbUV4dHJhY3RvclRyYWNrSW5kZXggIT0gdGFyZ2V0VHJhY2tJbmRleCkgeworICAgICAgICBpZiAoIUFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhY3RvclRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICAgICAgc2FtcGxlVGltZVVzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgICAgfQorICAgIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA9IHRhcmdldFNhbXBsZUluZGV4OworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjptb3ZlVG9TYW1wbGVfbChTYW1wbGVQb3NpdGlvbiYgcG9zLCBpbnQgdHJhY2tJbmRleCkgeworICAgIC8vIFNlZWsgYmFja3dhcmRzIGlmIHRoZSBleHRyYWN0b3IgaXMgYWhlYWQgb2YgdGhlIHNhbXBsZS4KKyAgICBpZiAocG9zLmlzU2V0ICYmIG1FeHRyYWN0b3JTYW1wbGVJbmRleCA+IHBvcy5pbmRleCkgeworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBzZWVrRXh0cmFjdG9yQmFja3dhcmRzX2wocG9zLnRpbWVTdGFtcFVzLCB0cmFja0luZGV4LCBwb3MuaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBBZHZhbmNlIHVudGlsIGV4dHJhY3RvciBwb2ludHMgdG8gdGhlIHNhbXBsZS4KKyAgICB3aGlsZSAoIShwb3MuaXNTZXQgJiYgcG9zLmluZGV4ID09IG1FeHRyYWN0b3JTYW1wbGVJbmRleCkpIHsKKyAgICAgICAgaWYgKCFhZHZhbmNlRXh0cmFjdG9yX2woKSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6Om1vdmVUb1RyYWNrX2woaW50IHRyYWNrSW5kZXgpIHsKKyAgICByZXR1cm4gbW92ZVRvU2FtcGxlX2wobVRyYWNrQ3Vyc29yc1t0cmFja0luZGV4XS5jdXJyZW50LCB0cmFja0luZGV4KTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OndhaXRGb3JUcmFja19sKGludCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2tIZWxkKSB7CisgICAgd2hpbGUgKHRyYWNrSW5kZXggIT0gbUV4dHJhY3RvclRyYWNrSW5kZXggJiYgIW1Fb3NSZWFjaGVkICYmIG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcykgeworICAgICAgICBtVHJhY2tTaWduYWxzW3RyYWNrSW5kZXhdLndhaXQobG9ja0hlbGQpOworICAgIH0KKworICAgIGlmIChtRW9zUmVhY2hlZCkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgaWYgKCFtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MpIHsKKyAgICAgICAgcmV0dXJuIG1vdmVUb1RyYWNrX2wodHJhY2tJbmRleCk7CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnByaW1lRXh0cmFjdG9yRm9yVHJhY2tfbCgKKyAgICAgICAgaW50IHRyYWNrSW5kZXgsIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4mIGxvY2tIZWxkKSB7CisgICAgaWYgKG1FeHRyYWN0b3JUcmFja0luZGV4IDwgMCkgeworICAgICAgICBtRXh0cmFjdG9yVHJhY2tJbmRleCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KG1FeHRyYWN0b3IpOworICAgICAgICBpZiAobUV4dHJhY3RvclRyYWNrSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNrQ3Vyc29yc1ttRXh0cmFjdG9yVHJhY2tJbmRleF0uY3VycmVudC5zZXQobUV4dHJhY3RvclNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKSk7CisgICAgfQorCisgICAgaWYgKG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcykgeworICAgICAgICByZXR1cm4gd2FpdEZvclRyYWNrX2wodHJhY2tJbmRleCwgbG9ja0hlbGQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtb3ZlVG9UcmFja19sKHRyYWNrSW5kZXgpOworICAgIH0KK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnNlbGVjdFRyYWNrKGludCB0cmFja0luZGV4KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAodHJhY2tJbmRleCA8IDAgfHwgdHJhY2tJbmRleCA+PSBtVHJhY2tDb3VudCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHRyYWNrSW5kZXggIiA8PCB0cmFja0luZGV4IDw8ICIgZm9yIHRyYWNrQ291bnQgIiA8PCBtVHJhY2tDb3VudDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9IGVsc2UgaWYgKG1UcmFja1NpZ25hbHMuZmluZCh0cmFja0luZGV4KSAhPSBtVHJhY2tTaWduYWxzLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrSW5kZXggIiA8PCB0cmFja0luZGV4IDw8ICIgYWxyZWFkeSBzZWxlY3RlZCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChtRXh0cmFjdG9yVHJhY2tJbmRleCA+PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrcyBtdXN0IGJlIHNlbGVjdGVkIGJlZm9yZSBzYW1wbGUgcmVhZGluZyBiZWdpbnMuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrIHJldHVybmVkIGVycm9yOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBtVHJhY2tTaWduYWxzLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUodHJhY2tJbmRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSgpKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVNhbXBsZVJlYWRlck5ESzo6dW5zZWxlY3RUcmFjayhpbnQgdHJhY2tJbmRleCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtRXh0cmFjdG9yTXV0ZXgpOworCisgICAgaWYgKHRyYWNrSW5kZXggPCAwIHx8IHRyYWNrSW5kZXggPj0gbVRyYWNrQ291bnQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCB0cmFja0luZGV4ICIgPDwgdHJhY2tJbmRleCA8PCAiIGZvciB0cmFja0NvdW50ICIgPDwgbVRyYWNrQ291bnQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfSBlbHNlIGlmIChtRXh0cmFjdG9yVHJhY2tJbmRleCA+PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVuc2VsZWN0VHJhY2sgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNhbXBsZSByZWFkaW5nIGJlZ2lucy4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGF1dG8gaXQgPSBtVHJhY2tTaWduYWxzLmZpbmQodHJhY2tJbmRleCk7CisgICAgaWYgKGl0ID09IG1UcmFja1NpZ25hbHMuZW5kKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2tJbmRleCAiIDw8IHRyYWNrSW5kZXggPDwgIiBpcyBub3Qgc2VsZWN0ZWQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBtVHJhY2tTaWduYWxzLmVyYXNlKGl0KTsKKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayByZXR1cm5lZCBlcnJvcjogIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OnNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKGJvb2wgZW5mb3JjZSkgeworICAgIExPRyhERUJVRykgPDwgInNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKCAiIDw8IGVuZm9yY2UgPDwgIiApIjsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtRXh0cmFjdG9yTXV0ZXgpOworCisgICAgaWYgKG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcyAmJiAhZW5mb3JjZSkgeworICAgICAgICAvLyBJZiBzd2l0Y2hpbmcgZnJvbSBlbmZvcmNpbmcgdG8gbm90IGVuZm9yY2luZyBzZXF1ZW50aWFsIGFjY2VzcyB0aGVyZSBtYXkgYmUgdGhyZWFkcworICAgICAgICAvLyB3YWl0aW5nIHRoYXQgbmVlZHMgdG8gYmUgd29rZW4gdXAuCisgICAgICAgIGZvciAoYXV0byBpdCA9IG1UcmFja1NpZ25hbHMuYmVnaW4oKTsgaXQgIT0gbVRyYWNrU2lnbmFscy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaXQtPnNlY29uZC5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MgJiYgZW5mb3JjZSAmJiBtRXh0cmFjdG9yVHJhY2tJbmRleCA+PSAwKSB7CisgICAgICAgIC8vIElmIHN3aXRjaGluZyBmcm9tIG5vdCBlbmZvcmNpbmcgdG8gZW5mb3JjaW5nIHNlcXVlbnRpYWwgYWNjZXNzIHRoZSBleHRyYWN0b3IgbmVlZHMgdG8gYmUKKyAgICAgICAgLy8gcG9zaXRpb25lZCBmb3IgdGhlIHRyYWNrIGZhcnRoZXN0IGJlaGluZCBzbyB0aGF0IGl0IHdvbid0IGdldCBzdHVjayB3YWl0aW5nLgorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU2FtcGxlUG9zaXRpb24qIHBvcyA9IG51bGxwdHI7CisgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IC0xOworICAgICAgICB9IGVhcmxpZXN0U2FtcGxlOworCisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgU2FtcGxlUG9zaXRpb24mIGxhc3RLbm93blRyYWNrUG9zaXRpb24gPSBtVHJhY2tDdXJzb3JzW3RyYWNrSW5kZXhdLmN1cnJlbnQuaXNTZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1UcmFja0N1cnNvcnNbdHJhY2tJbmRleF0uY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbVRyYWNrQ3Vyc29yc1t0cmFja0luZGV4XS5wcmV2aW91czsKKworICAgICAgICAgICAgaWYgKGxhc3RLbm93blRyYWNrUG9zaXRpb24uaXNTZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWFybGllc3RTYW1wbGUucG9zID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgICAgICAgICAgZWFybGllc3RTYW1wbGUucG9zLT5pbmRleCA+IGxhc3RLbm93blRyYWNrUG9zaXRpb24uaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZWFybGllc3RTYW1wbGUucG9zID0gJmxhc3RLbm93blRyYWNrUG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIGVhcmxpZXN0U2FtcGxlLnRyYWNrSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlYXJsaWVzdFNhbXBsZS5wb3MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8ga25vd24gc2FtcGxlIHBvc2l0aW9uIGZvdW5kIjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IG1vdmVUb1NhbXBsZV9sKCplYXJsaWVzdFNhbXBsZS5wb3MsIGVhcmxpZXN0U2FtcGxlLnRyYWNrSW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgcmV0dXJuIHN0YXR1czsKKworICAgICAgICB3aGlsZSAoIShtVHJhY2tDdXJzb3JzW21FeHRyYWN0b3JUcmFja0luZGV4XS5jdXJyZW50LmlzU2V0ICYmCisgICAgICAgICAgICAgICAgIG1UcmFja0N1cnNvcnNbbUV4dHJhY3RvclRyYWNrSW5kZXhdLmN1cnJlbnQuaW5kZXggPT0gbUV4dHJhY3RvclNhbXBsZUluZGV4KSkgeworICAgICAgICAgICAgaWYgKCFhZHZhbmNlRXh0cmFjdG9yX2woKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1FbmZvcmNlU2VxdWVudGlhbEFjY2VzcyA9IGVuZm9yY2U7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgaW50MzJfdCogYml0cmF0ZSkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtRXh0cmFjdG9yTXV0ZXgpOworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNRURJQV9PSzsKKworICAgIGlmIChtVHJhY2tTaWduYWxzLmZpbmQodHJhY2tJbmRleCkgPT0gbVRyYWNrU2lnbmFscy5lbmQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUcmFjayBpcyBub3Qgc2VsZWN0ZWQuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9IGVsc2UgaWYgKGJpdHJhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJiaXRyYXRlIHBvaW50ZXIgaXMgTlVMTC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0gZWxzZSBpZiAobUV4dHJhY3RvclRyYWNrSW5kZXggPj0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJnZXRFc3RpbWF0ZWRCaXRyYXRlRm9yVHJhY2sgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHNhbXBsZSByZWFkaW5nIGJlZ2lucy4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vIFNhbXBsZSB0aGUgdHJhY2suCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtTYW1wbGluZ0R1cmF0aW9uVXMgPSAxMCAqIDEwMDAgKiAxMDAwOyAgLy8gMTAgc2Vjb25kcworICAgIHNpemVfdCBsYXN0U2FtcGxlU2l6ZSA9IDA7CisgICAgc2l6ZV90IHRvdGFsU2FtcGxlU2l6ZSA9IDA7CisgICAgaW50NjRfdCBmaXJzdFNhbXBsZVRpbWVVcyA9IDA7CisgICAgaW50NjRfdCBsYXN0U2FtcGxlVGltZVVzID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KG1FeHRyYWN0b3IpID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIGxhc3RTYW1wbGVUaW1lVXMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIGlmICh0b3RhbFNhbXBsZVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIGZpcnN0U2FtcGxlVGltZVVzID0gbGFzdFNhbXBsZVRpbWVVczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFzdFNhbXBsZVNpemUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIHRvdGFsU2FtcGxlU2l6ZSArPSBsYXN0U2FtcGxlU2l6ZTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKChsYXN0U2FtcGxlVGltZVVzIC0gZmlyc3RTYW1wbGVUaW1lVXMpIDwga1NhbXBsaW5nRHVyYXRpb25VcyAmJgorICAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKTsKKworICAgIC8vIFJlc2V0IHRoZSBleHRyYWN0b3IgdG8gdGhlIGJlZ2lubmluZy4KKyAgICBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1FeHRyYWN0b3IsIDAsIEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkMpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byByZXNldCBleHRyYWN0b3I6ICIgPDwgc3RhdHVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CisgICAgY29uc3QgaW50NjRfdCBzYW1wbGVkRHVyYXRpb25VcyA9IGxhc3RTYW1wbGVUaW1lVXMgLSBmaXJzdFNhbXBsZVRpbWVVczsKKworICAgIGlmIChzYW1wbGVkRHVyYXRpb25VcyA8IGtTYW1wbGluZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgLy8gVHJhY2sgaXMgc2hvcnRlciB0aGFuIHRoZSBzYW1wbGluZyBkdXJhdGlvbiBzbyB1c2UgdGhlIGZ1bGwgdHJhY2sgZHVyYXRpb24gdG8gZ2V0IGJldHRlcgorICAgICAgICAvLyBhY2N1cmFjeSAoaS5lLiBkb24ndCBza2lwIHRoZSBsYXN0IHNhbXBsZSkuCisgICAgICAgIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQgPSBnZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgfQorCisgICAgaWYgKGR1cmF0aW9uVXMgPT0gMCkgeworICAgICAgICAvLyBUaGUgc2FtcGxlZCBkdXJhdGlvbiBkb2VzIG5vdCBhY2NvdW50IGZvciB0aGUgbGFzdCBzYW1wbGUncyBkdXJhdGlvbiBzbyBpdHMgc2l6ZSBzaG91bGQKKyAgICAgICAgLy8gbm90IGJlIGluY2x1ZGVkIGVpdGhlci4KKyAgICAgICAgdG90YWxTYW1wbGVTaXplIC09IGxhc3RTYW1wbGVTaXplOworICAgICAgICBkdXJhdGlvblVzID0gc2FtcGxlZER1cmF0aW9uVXM7CisgICAgfQorCisgICAgaWYgKHRvdGFsU2FtcGxlU2l6ZSA9PSAwIHx8IGR1cmF0aW9uVXMgPD0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZXN0aW1hdGUgdHJhY2sgYml0cmF0ZSI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgICpiaXRyYXRlID0gcm91bmRmKChmbG9hdCl0b3RhbFNhbXBsZVNpemUgKiA4ICogMTAwMDAwMCAvIGR1cmF0aW9uVXMpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpnZXRTYW1wbGVJbmZvRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIE1lZGlhU2FtcGxlSW5mbyogaW5mbykgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtRXh0cmFjdG9yTXV0ZXgpOworCisgICAgaWYgKG1UcmFja1NpZ25hbHMuZmluZCh0cmFja0luZGV4KSA9PSBtVHJhY2tTaWduYWxzLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrIG5vdCBzZWxlY3RlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0gZWxzZSBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk1lZGlhU2FtcGxlSW5mbyBwb2ludGVyIGlzIE5VTEwuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBwcmltZUV4dHJhY3RvckZvclRyYWNrX2wodHJhY2tJbmRleCwgbG9jayk7CisgICAgaWYgKHN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUV4dHJhY3Rvcik7CisgICAgICAgIGluZm8tPmZsYWdzID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKG1FeHRyYWN0b3IpOworICAgICAgICBpbmZvLT5zaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUV4dHJhY3Rvcik7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzID0gMDsKKyAgICAgICAgaW5mby0+ZmxhZ3MgPSBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpbmZvLT5zaXplID0gMDsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiICBnZXRTYW1wbGVJbmZvRm9yVHJhY2sgIyIgPDwgdHJhY2tJbmRleCA8PCAiOiBFbmQgT2YgU3RyZWFtIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICIgIGdldFNhbXBsZUluZm9Gb3JUcmFjayAjIiA8PCB0cmFja0luZGV4IDw8ICI6IEVycm9yICIgPDwgc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpyZWFkU2FtcGxlRGF0YUZvclRyYWNrKGludCB0cmFja0luZGV4LCB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtRXh0cmFjdG9yTXV0ZXgpOworCisgICAgaWYgKG1UcmFja1NpZ25hbHMuZmluZCh0cmFja0luZGV4KSA9PSBtVHJhY2tTaWduYWxzLmVuZCgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlRyYWNrIG5vdCBzZWxlY3RlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0gZWxzZSBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiYnVmZmVyIHBvaW50ZXIgaXMgTlVMTCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gcHJpbWVFeHRyYWN0b3JGb3JUcmFja19sKHRyYWNrSW5kZXgsIGxvY2spOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUV4dHJhY3Rvcik7CisgICAgaWYgKGJ1ZmZlclNpemUgPCBzYW1wbGVTaXplKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHNhbXBsZSwgIiA8PCBidWZmZXJTaXplIDw8ICIgdnMgIiA8PCBzYW1wbGVTaXplOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKG1FeHRyYWN0b3IsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ5dGVzUmVhZCA8IHNhbXBsZVNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlYWQgZnVsbCBzYW1wbGUsICIgPDwgYnl0ZXNSZWFkIDw8ICIgdnMgIiA8PCBzYW1wbGVTaXplOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGFkdmFuY2VUcmFja19sKHRyYWNrSW5kZXgpOworCisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwordm9pZCBNZWRpYVNhbXBsZVJlYWRlck5ESzo6YWR2YW5jZVRyYWNrKGludCB0cmFja0luZGV4KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1FeHRyYWN0b3JNdXRleCk7CisKKyAgICBpZiAobVRyYWNrU2lnbmFscy5maW5kKHRyYWNrSW5kZXgpICE9IG1UcmFja1NpZ25hbHMuZW5kKCkpIHsKKyAgICAgICAgYWR2YW5jZVRyYWNrX2wodHJhY2tJbmRleCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJ5aW5nIHRvIGFkdmFuY2UgYSB0cmFjayB0aGF0IGlzIG5vdCBzZWxlY3RlZCAoIyIgPDwgdHJhY2tJbmRleCA8PCAiKSI7CisgICAgfQorfQorCitBTWVkaWFGb3JtYXQqIE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpnZXRGaWxlRm9ybWF0KCkgeworICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0RmlsZUZvcm1hdChtRXh0cmFjdG9yKTsKK30KKworc2l6ZV90IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpnZXRUcmFja0NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBtVHJhY2tDb3VudDsKK30KKworQU1lZGlhRm9ybWF0KiBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Z2V0VHJhY2tGb3JtYXQoaW50IHRyYWNrSW5kZXgpIHsKKyAgICBpZiAodHJhY2tJbmRleCA8IDAgfHwgdHJhY2tJbmRleCA+PSBtVHJhY2tDb3VudCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHRyYWNrSW5kZXggIiA8PCB0cmFja0luZGV4IDw8ICIgZm9yIHRyYWNrQ291bnQgIiA8PCBtVHJhY2tDb3VudDsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhU2FtcGxlV3JpdGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzMWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVNhbXBsZVdyaXRlci5jcHAKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNhbXBsZVdyaXRlciIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYU11eGVyLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8dXRpbHMvQW5kcm9pZFRocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZWZhdWx0TXV4ZXIgOiBwdWJsaWMgTWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gTWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZQorICAgIHNzaXplX3QgYWRkVHJhY2soQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBJZiB0aGUgdHJhY2sgZm9ybWF0IGhhcyByb3RhdGlvbiwgbmVlZCB0byBjYWxsIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludAorICAgICAgICAvLyB0byBzZXQgdGhlIHJvdGF0aW9uLiBNdXhlciBkb2Vzbid0IHRha2Ugcm90YXRpb24gc3BlY2lmaWVkIG9uIHRoZSB0cmFjay4KKyAgICAgICAgY29uc3QgY2hhciogbWltZTsKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpICYmCisgICAgICAgICAgICBzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHJvdGF0aW9uOworICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgJnJvdGF0aW9uKSAmJgorICAgICAgICAgICAgICAgIChyb3RhdGlvbiAhPSAwKSkgeworICAgICAgICAgICAgICAgIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludChtTXV4ZXIsIHJvdGF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBBTWVkaWFNdXhlcl9hZGRUcmFjayhtTXV4ZXIsIHRyYWNrRm9ybWF0KTsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7IHJldHVybiBBTWVkaWFNdXhlcl9zdGFydChtTXV4ZXIpOyB9CisgICAgbWVkaWFfc3RhdHVzX3Qgd3JpdGVTYW1wbGVEYXRhKHNpemVfdCB0cmFja0luZGV4LCBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGluZm8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYU11eGVyX3dyaXRlU2FtcGxlRGF0YShtTXV4ZXIsIHRyYWNrSW5kZXgsIGRhdGEsIGluZm8pOworICAgIH0KKyAgICBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGUgeyByZXR1cm4gQU1lZGlhTXV4ZXJfc3RvcChtTXV4ZXIpOyB9CisgICAgLy8gfk1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UKKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8RGVmYXVsdE11eGVyPiBjcmVhdGUoaW50IGZkKSB7CisgICAgICAgIEFNZWRpYU11eGVyKiBuZGtNdXhlciA9IEFNZWRpYU11eGVyX25ldyhmZCwgQU1FRElBTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICBpZiAobmRrTXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBBTWVkaWFNdXhlciI7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPERlZmF1bHRNdXhlcj4obmRrTXV4ZXIpOworICAgIH0KKworICAgIH5EZWZhdWx0TXV4ZXIoKSB7CisgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQU1lZGlhTXV4ZXJfZGVsZXRlKG1NdXhlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWZhdWx0TXV4ZXIoQU1lZGlhTXV4ZXIqIG11eGVyKSA6IG1NdXhlcihtdXhlcil7fTsKKyAgICBEZWZhdWx0TXV4ZXIoKSA9IGRlbGV0ZTsKKworcHJpdmF0ZToKKyAgICBBTWVkaWFNdXhlciogbU11eGVyOworfTsKKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4obmV3IE1lZGlhU2FtcGxlV3JpdGVyKCkpOworfQorCitNZWRpYVNhbXBsZVdyaXRlcjo6fk1lZGlhU2FtcGxlV3JpdGVyKCkgeworICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCkgeworICAgICAgICBzdG9wKCk7CisgICAgfQorfQorCitib29sIE1lZGlhU2FtcGxlV3JpdGVyOjppbml0KGludCBmZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoZWFydEJlYXRJbnRlcnZhbFVzKSB7CisgICAgcmV0dXJuIGluaXQoRGVmYXVsdE11eGVyOjpjcmVhdGUoZmQpLCBjYWxsYmFja3MsIGhlYXJ0QmVhdEludGVydmFsVXMpOworfQorCitib29sIE1lZGlhU2FtcGxlV3JpdGVyOjppbml0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlck11eGVySW50ZXJmYWNlPiYgbXV4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGVhcnRCZWF0SW50ZXJ2YWxVcykgeworICAgIGlmIChjYWxsYmFja3MubG9jaygpID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2FsbGJhY2sgb2JqZWN0IGNhbm5vdCBiZSBudWxsIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAobXV4ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNdXhlciBjYW5ub3QgYmUgbnVsbCI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAobVN0YXRlICE9IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2FtcGxlIHdyaXRlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOworICAgIG1NdXhlciA9IG11eGVyOworICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgbUhlYXJ0QmVhdEludGVydmFsVXMgPSBoZWFydEJlYXRJbnRlcnZhbFVzOworICAgIHJldHVybiB0cnVlOworfQorCitNZWRpYVNhbXBsZVdyaXRlcjo6TWVkaWFTYW1wbGVDb25zdW1lckZ1bmN0aW9uIE1lZGlhU2FtcGxlV3JpdGVyOjphZGRUcmFjaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIHRyYWNrRm9ybWF0KSB7CisgICAgaWYgKHRyYWNrRm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2sgZm9ybWF0IG11c3QgYmUgbm9uLW51bGwiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk11eGVyIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIHdoZW4gYWRkaW5nIHRyYWNrcy4iOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0Q29weSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfY29weSh0cmFja0Zvcm1hdENvcHksIHRyYWNrRm9ybWF0LmdldCgpKTsKKyAgICAvLyBSZXF1ZXN0IG11eGVyIHRvIHVzZSBiYWNrZ3JvdW5kIHByaW9yaXRpZXMgYnkgZGVmYXVsdC4KKyAgICBBTWVkaWFGb3JtYXRVdGlsczo6U2V0RGVmYXVsdEZvcm1hdFZhbHVlSW50MzIoVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQkFDS0dST1VORF9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0Zvcm1hdENvcHksIDEgLyogdHJ1ZSAqLyk7CisKKyAgICBzc2l6ZV90IHRyYWNrSW5kZXhPckVycm9yID0gbU11eGVyLT5hZGRUcmFjayh0cmFja0Zvcm1hdENvcHkpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tGb3JtYXRDb3B5KTsKKyAgICBpZiAodHJhY2tJbmRleE9yRXJyb3IgPCAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhZGQgbWVkaWEgdHJhY2sgdG8gbXV4ZXI6ICIgPDwgdHJhY2tJbmRleE9yRXJyb3I7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgdHJhY2tJbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4odHJhY2tJbmRleE9yRXJyb3IpOworCisgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgZHVyYXRpb25VcyA9IDA7CisgICAgfQorCisgICAgbVRyYWNrcy5lbXBsYWNlKHRyYWNrSW5kZXgsIGR1cmF0aW9uVXMpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gdGhpc1dyaXRlciA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKworICAgIHJldHVybiBbc2VsZiA9IHNoYXJlZF9mcm9tX3RoaXMoKSwgdHJhY2tJbmRleF0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgICAgIHNlbGYtPmFkZFNhbXBsZVRvVHJhY2sodHJhY2tJbmRleCwgc2FtcGxlKTsKKyAgICB9OworfQorCit2b2lkIE1lZGlhU2FtcGxlV3JpdGVyOjphZGRTYW1wbGVUb1RyYWNrKHNpemVfdCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICBpZiAoc2FtcGxlID09IG51bGxwdHIpIHJldHVybjsKKworICAgIGJvb2wgd2FzRW1wdHk7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgd2FzRW1wdHkgPSBtU2FtcGxlUXVldWUuZW1wdHkoKTsKKyAgICAgICAgbVNhbXBsZVF1ZXVlLnB1c2goc3RkOjptYWtlX3BhaXIodHJhY2tJbmRleCwgc2FtcGxlKSk7CisgICAgfQorCisgICAgaWYgKHdhc0VtcHR5KSB7CisgICAgICAgIG1TYW1wbGVTaWduYWwubm90aWZ5X29uZSgpOworICAgIH0KK30KKworYm9vbCBNZWRpYVNhbXBsZVdyaXRlcjo6c3RhcnQoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyB0cmFja3MgdG8gd3JpdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlNhbXBsZSB3cml0ZXIgaXMgbm90IGluaXRpYWxpemVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisgICAgc3RkOjp0aHJlYWQoW3RoaXNdIHsKKyAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAgLyogdGlkICgwID0gY3VycmVudCkgKi8sIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiU2FtcGxlV3JpdGVyVHJkIiwgMCwgMCwgMCk7CisKKyAgICAgICAgYm9vbCB3YXNTdG9wcGVkID0gZmFsc2U7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHdyaXRlU2FtcGxlcygmd2FzU3RvcHBlZCk7CisgICAgICAgIGlmIChhdXRvIGNhbGxiYWNrcyA9IG1DYWxsYmFja3MubG9jaygpKSB7CisgICAgICAgICAgICBpZiAod2FzU3RvcHBlZCAmJiBzdGF0dXMgPT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblN0b3BwZWQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+b25GaW5pc2hlZCh0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSkuZGV0YWNoKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVkaWFTYW1wbGVXcml0ZXI6OnN0b3AoKSB7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTYW1wbGUgd3JpdGVyIGlzIG5vdCBzdGFydGVkLiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICB9CisKKyAgICBtU2FtcGxlU2lnbmFsLm5vdGlmeV9hbGwoKTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFTYW1wbGVXcml0ZXI6OndyaXRlU2FtcGxlcyhib29sKiB3YXNTdG9wcGVkKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgbXV4ZXJTdGF0dXMgPSBtTXV4ZXItPnN0YXJ0KCk7CisgICAgaWYgKG11eGVyU3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciBzdGFydGluZyBtdXhlcjogIiA8PCBtdXhlclN0YXR1czsKKyAgICAgICAgcmV0dXJuIG11eGVyU3RhdHVzOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHdyaXRlU3RhdHVzID0gcnVuV3JpdGVyTG9vcCh3YXNTdG9wcGVkKTsKKyAgICBpZiAod3JpdGVTdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkVycm9yIHdyaXRpbmcgc2FtcGxlczogIiA8PCB3cml0ZVN0YXR1czsKKyAgICB9CisKKyAgICBtdXhlclN0YXR1cyA9IG1NdXhlci0+c3RvcCgpOworICAgIGlmIChtdXhlclN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3Igc3RvcHBpbmcgbXV4ZXI6ICIgPDwgbXV4ZXJTdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHdyaXRlU3RhdHVzICE9IEFNRURJQV9PSyA/IHdyaXRlU3RhdHVzIDogbXV4ZXJTdGF0dXM7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhU2FtcGxlV3JpdGVyOjpydW5Xcml0ZXJMb29wKGJvb2wqIHdhc1N0b3BwZWQpIE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgeworICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvOworICAgIGludDMyX3QgbGFzdFByb2dyZXNzVXBkYXRlID0gMDsKKyAgICBib29sIHByb2dyZXNzU2luY2VMYXN0UmVwb3J0ID0gZmFsc2U7CisgICAgaW50IHRyYWNrRW9zQ291bnQgPSAwOworCisgICAgLy8gU2V0IHRoZSAicHJpbWFyeSIgdHJhY2sgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHByb2dyZXNzIHRvIHRoZSB0cmFjayB3aXRoIGxvbmdlc3QKKyAgICAvLyBkdXJhdGlvbi4KKyAgICBpbnQgcHJpbWFyeVRyYWNrSW5kZXggPSAtMTsKKyAgICBpbnQ2NF90IGxvbmdlc3REdXJhdGlvblVzID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBtVHJhY2tzLmJlZ2luKCk7IGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQubUR1cmF0aW9uVXMgPiBsb25nZXN0RHVyYXRpb25VcykgeworICAgICAgICAgICAgcHJpbWFyeVRyYWNrSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBsb25nZXN0RHVyYXRpb25VcyA9IGl0LT5zZWNvbmQubUR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzIHVwZGF0ZUludGVydmFsKG1IZWFydEJlYXRJbnRlcnZhbFVzKTsKKyAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IG5leHRVcGRhdGVUaW1lID0KKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpICsgdXBkYXRlSW50ZXJ2YWw7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAodHJhY2tFb3NDb3VudCA+PSBtVHJhY2tzLnNpemUoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgd2hpbGUgKG1TYW1wbGVRdWV1ZS5lbXB0eSgpICYmIG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgaWYgKG1IZWFydEJlYXRJbnRlcnZhbFVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVNpZ25hbC53YWl0KGxvY2spOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVNhbXBsZVNpZ25hbC53YWl0X3VudGlsKGxvY2ssIG5leHRVcGRhdGVUaW1lKSA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGhlYXJ0LWJlYXQgaWYgdGhlcmUgaXMgYW55IHByb2dyZXNzIHNpbmNlIGxhc3QgdXBkYXRlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc1NpbmNlTGFzdFJlcG9ydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG8gY2FsbGJhY2tzID0gbUNhbGxiYWNrcy5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm9uSGVhcnRCZWF0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NTaW5jZUxhc3RSZXBvcnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0VXBkYXRlVGltZSArPSB1cGRhdGVJbnRlcnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBFRCkgeworICAgICAgICAgICAgICAgICp3YXNTdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdXRvJiB0b3BFbnRyeSA9IG1TYW1wbGVRdWV1ZS50b3AoKTsKKyAgICAgICAgICAgIHRyYWNrSW5kZXggPSB0b3BFbnRyeS5maXJzdDsKKyAgICAgICAgICAgIHNhbXBsZSA9IHRvcEVudHJ5LnNlY29uZDsKKyAgICAgICAgICAgIG1TYW1wbGVRdWV1ZS5wb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRyYWNrUmVjb3JkJiB0cmFjayA9IG1UcmFja3NbdHJhY2tJbmRleF07CisKKyAgICAgICAgaWYgKHNhbXBsZS0+aW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGlmICh0cmFjay5tUmVhY2hlZEVvcykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUcmFjayByZWFjaGVkIGVuZCBvZiBzdHJlYW0uCisgICAgICAgICAgICB0cmFjay5tUmVhY2hlZEVvcyA9IHRydWU7CisgICAgICAgICAgICB0cmFja0Vvc0NvdW50Kys7CisKKyAgICAgICAgICAgIC8vIFByZXNlcnZlIHNvdXJjZSB0cmFjayBkdXJhdGlvbiBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSB0aW1lc3RhbXAgb24gdGhlCisgICAgICAgICAgICAvLyBlbXB0eSBFbmQtT2YtU3RyZWFtIHNhbXBsZS4KKyAgICAgICAgICAgIGlmICh0cmFjay5tRHVyYXRpb25VcyA+IDAgJiYgdHJhY2subUZpcnN0U2FtcGxlVGltZVNldCkgeworICAgICAgICAgICAgICAgIHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSB0cmFjay5tRHVyYXRpb25VcyArIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyYWNrLm1QcmV2U2FtcGxlVGltZVVzID0gc2FtcGxlLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgaWYgKCF0cmFjay5tRmlyc3RTYW1wbGVUaW1lU2V0KSB7CisgICAgICAgICAgICAvLyBSZWNvcmQgdGhlIGZpcnN0IHNhbXBsZSdzIHRpbWVzdGFtcCBpbiBvcmRlciB0byB0cmFuc2xhdGUgZHVyYXRpb24gdG8gRU9TCisgICAgICAgICAgICAvLyB0aW1lIGZvciB0cmFja3MgdGhhdCBkb2VzIG5vdCBzdGFydCBhdCAwLgorICAgICAgICAgICAgdHJhY2subUZpcnN0U2FtcGxlVGltZVVzID0gc2FtcGxlLT5pbmZvLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgICAgIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVTZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVySW5mby5vZmZzZXQgPSBzYW1wbGUtPmRhdGFPZmZzZXQ7CisgICAgICAgIGJ1ZmZlckluZm8uc2l6ZSA9IHNhbXBsZS0+aW5mby5zaXplOworICAgICAgICBidWZmZXJJbmZvLmZsYWdzID0gc2FtcGxlLT5pbmZvLmZsYWdzOworICAgICAgICBidWZmZXJJbmZvLnByZXNlbnRhdGlvblRpbWVVcyA9IHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbU11eGVyLT53cml0ZVNhbXBsZURhdGEodHJhY2tJbmRleCwgc2FtcGxlLT5idWZmZXIsICZidWZmZXJJbmZvKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIndyaXRlU2FtcGxlRGF0YSByZXR1cm5lZCAiIDw8IHN0YXR1czsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlLnJlc2V0KCk7CisKKyAgICAgICAgLy8gVE9ETyhsbmlsc3Nvbik6IEFkZCBvcHRpb24gdG8gdG9nZ2xlIHByb2dyZXNzIHJlcG9ydGluZyBvbi9vZmYuCisgICAgICAgIGlmICh0cmFja0luZGV4ID09IHByaW1hcnlUcmFja0luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVsYXBzZWQgPSB0cmFjay5tUHJldlNhbXBsZVRpbWVVcyAtIHRyYWNrLm1GaXJzdFNhbXBsZVRpbWVVczsKKyAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MgPSAoZWxhcHNlZCAqIDEwMCkgLyB0cmFjay5tRHVyYXRpb25VczsKKyAgICAgICAgICAgIHByb2dyZXNzID0gc3RkOjpjbGFtcChwcm9ncmVzcywgMCwgMTAwKTsKKworICAgICAgICAgICAgaWYgKHByb2dyZXNzID4gbGFzdFByb2dyZXNzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gY2FsbGJhY2tzID0gbUNhbGxiYWNrcy5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblByb2dyZXNzVXBkYXRlKHRoaXMsIHByb2dyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdFByb2dyZXNzVXBkYXRlID0gcHJvZ3Jlc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJvZ3Jlc3NTaW5jZUxhc3RSZXBvcnQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhY2tUcmFuc2NvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYWNrVHJhbnNjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxYTk0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9NZWRpYVRyYWNrVHJhbnNjb2Rlci5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYWNrVHJhbnNjb2RlciIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8dXRpbHMvQW5kcm9pZFRocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCittZWRpYV9zdGF0dXNfdCBNZWRpYVRyYWNrVHJhbnNjb2Rlcjo6Y29uZmlndXJlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+JiBtZWRpYVNhbXBsZVJlYWRlciwgaW50IHRyYWNrSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiBkZXN0aW5hdGlvbkZvcm1hdCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttU3RhdGVNdXRleH07CisKKyAgICBpZiAobVN0YXRlICE9IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29uZmlndXJlIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZiAobWVkaWFTYW1wbGVSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJNZWRpYVNhbXBsZVJlYWRlciBpcyBudWxsIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgaWYgKHRyYWNrSW5kZXggPCAwIHx8IHRyYWNrSW5kZXggPj0gbWVkaWFTYW1wbGVSZWFkZXItPmdldFRyYWNrQ291bnQoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUcmFja0luZGV4IGlzIGludmFsaWQgIiA8PCB0cmFja0luZGV4OworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIG1NZWRpYVNhbXBsZVJlYWRlciA9IG1lZGlhU2FtcGxlUmVhZGVyOworICAgIG1UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKKworICAgIG1Tb3VyY2VGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihtTWVkaWFTYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KG1UcmFja0luZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgIGlmIChtU291cmNlRm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGdldCBmb3JtYXQgZm9yIHRyYWNrICMiIDw8IG1UcmFja0luZGV4OworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBjb25maWd1cmVEZXN0aW5hdGlvbkZvcm1hdChkZXN0aW5hdGlvbkZvcm1hdCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlndXJlIGZhaWxlZCB3aXRoIGVycm9yICIgPDwgc3RhdHVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIG1TdGF0ZSA9IENPTkZJR1VSRUQ7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworYm9vbCBNZWRpYVRyYWNrVHJhbnNjb2Rlcjo6c3RhcnQoKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21TdGF0ZU11dGV4fTsKKworICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUcmFja1RyYW5zY29kZXIgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSBzdGFydGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtU3RhdGUgPSBTVEFSVEVEOworCisgICAgc3RkOjp0aHJlYWQoW3RoaXNdIHsKKyAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAgLyogdGlkICgwID0gY3VycmVudCkgKi8sIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIGJvb2wgc3RvcHBlZCA9IGZhbHNlOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBydW5UcmFuc2NvZGVMb29wKCZzdG9wcGVkKTsKKworICAgICAgICAvLyBPdXRwdXQgYW4gRU9TIHNhbXBsZSBpZiB0aGUgdHJhbnNjb2RlciB3YXMgc3RvcHBlZC4KKyAgICAgICAgaWYgKHN0b3BwZWQpIHsKKyAgICAgICAgICAgIGF1dG8gc2FtcGxlID0gc3RkOjptYWtlX3NoYXJlZDxNZWRpYVNhbXBsZT4oKTsKKyAgICAgICAgICAgIHNhbXBsZS0+aW5mby5mbGFncyA9IFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBvbk91dHB1dFNhbXBsZUF2YWlsYWJsZShzYW1wbGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90aWZ5IHRoZSBjbGllbnQuCisgICAgICAgIGlmIChhdXRvIGNhbGxiYWNrcyA9IG1UcmFuc2NvZGVyQ2FsbGJhY2subG9jaygpKSB7CisgICAgICAgICAgICBpZiAoc3RvcHBlZCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrcy0+b25UcmFja1N0b3BwZWQodGhpcyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja3MtPm9uVHJhY2tGaW5pc2hlZCh0aGlzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLT5vblRyYWNrRXJyb3IodGhpcywgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0pLmRldGFjaCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFja1RyYW5zY29kZXI6OnN0b3AoYm9vbCBzdG9wT25TeW5jU2FtcGxlKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21TdGF0ZU11dGV4fTsKKworICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCB8fCAobVN0b3BSZXF1ZXN0ID09IFNUT1BfT05fU1lOQyAmJiAhc3RvcE9uU3luY1NhbXBsZSkpIHsKKyAgICAgICAgbVN0b3BSZXF1ZXN0ID0gc3RvcE9uU3luY1NhbXBsZSA/IFNUT1BfT05fU1lOQyA6IFNUT1BfTk9XOworICAgICAgICBhYm9ydFRyYW5zY29kZUxvb3AoKTsKKyAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coV0FSTklORykgPDwgIlRyYWNrVHJhbnNjb2RlciBtdXN0IGJlIHN0YXJ0ZWQgYmVmb3JlIHN0b3BwZWQiOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYWNrVHJhbnNjb2Rlcjo6bm90aWZ5VHJhY2tGb3JtYXRBdmFpbGFibGUoKSB7CisgICAgaWYgKGF1dG8gY2FsbGJhY2tzID0gbVRyYW5zY29kZXJDYWxsYmFjay5sb2NrKCkpIHsKKyAgICAgICAgY2FsbGJhY2tzLT5vblRyYWNrRm9ybWF0QXZhaWxhYmxlKHRoaXMpOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYWNrVHJhbnNjb2Rlcjo6b25PdXRwdXRTYW1wbGVBdmFpbGFibGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21TYW1wbGVNdXRleH07CisgICAgaWYgKG1TYW1wbGVDb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIG1TYW1wbGVRdWV1ZS5lbnF1ZXVlKHNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNhbXBsZUNvbnN1bWVyKHNhbXBsZSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhVHJhY2tUcmFuc2NvZGVyOjpzZXRTYW1wbGVDb25zdW1lcigKKyAgICAgICAgY29uc3QgTWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiYgc2FtcGxlQ29uc3VtZXIpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVNhbXBsZU11dGV4fTsKKyAgICBtU2FtcGxlQ29uc3VtZXIgPSBzYW1wbGVDb25zdW1lcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIHdoaWxlICghbVNhbXBsZVF1ZXVlLmlzRW1wdHkoKSAmJiAhbVNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSkpIHsKKyAgICAgICAgbVNhbXBsZUNvbnN1bWVyKHNhbXBsZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTWVkaWFUcmFuc2NvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBmN2FiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL01lZGlhVHJhbnNjb2Rlci5jcHAKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYW5zY29kZXIiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhbnNjb2Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gY3JlYXRlVmlkZW9UcmFja0Zvcm1hdChBTWVkaWFGb3JtYXQqIHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogb3B0aW9ucykgeworICAgIGlmIChzcmNGb3JtYXQgPT0gbnVsbHB0ciB8fCBvcHRpb25zID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IG1lcmdlIG51bGwgZm9ybWF0cyI7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vIC0tLS0tLS0gRGVmaW5lIHBhcmFtZXRlcnMgdG8gY29weSBmcm9tIHRoZSBzb3VyY2UgdHJhY2sgZm9ybWF0IC0tLS0tLS0KKyAgICBzdGQ6OnZlY3RvcjxBTWVkaWFGb3JtYXRVdGlsczo6RW50cnlDb3BpZXI+IHNyY1BhcmFtc1RvQ29weXsKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX01JTUUsIFN0cmluZyksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgSW50NjQpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgSW50MzIpLAorICAgIH07CisKKyAgICAvLyBJZiB0aGUgZGVzdGluYXRpb24gY29kZWMgaXMgdGhlIHNhbWUgYXMgdGhlIHNvdXJjZSBjb2RlYywgd2UgY2FuIHByZXNlcnZlIHByb2ZpbGUgYW5kIGxldmVsCisgICAgLy8gZnJvbSB0aGUgc291cmNlIHRyYWNrIGFzIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UgbGVhdmUgdGhlbSB1bnNwZWNpZmllZC4KKyAgICBjb25zdCBjaGFyICpzcmNNaW1lLCAqZHN0TWltZTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmc3JjTWltZSk7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG9wdGlvbnMsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJmRzdE1pbWUpIHx8CisgICAgICAgIHN0cmNtcChzcmNNaW1lLCBkc3RNaW1lKSA9PSAwKSB7CisgICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgU3RyaW5nKSk7CisgICAgICAgIHNyY1BhcmFtc1RvQ29weS5wdXNoX2JhY2soRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsIFN0cmluZykpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0gRGVmaW5lIHBhcmFtZXRlcnMgdG8gY29weSBmcm9tIHRoZSBjYWxsZXIncyBvcHRpb25zIC0tLS0tLS0KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QU1lZGlhRm9ybWF0VXRpbHM6OkVudHJ5Q29waWVyPiBrU3VwcG9ydGVkT3B0aW9uc3sKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX01JTUUsIFN0cmluZyksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgSW50NjQpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSwgSW50MzIpLAorICAgICAgICAgICAgRU5UUllfQ09QSUVSMihBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLCBGbG9hdCwgSW50MzIpLAorICAgIH07CisKKyAgICAvLyAtLS0tLS0tIENvcHkgcGFyYW1ldGVycyBmcm9tIHNvdXJjZSBhbmQgb3B0aW9ucyB0byB0aGUgZGVzdGluYXRpb24gLS0tLS0tLQorICAgIGF1dG8gdHJhY2tGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihBTWVkaWFGb3JtYXRfbmV3KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICBBTWVkaWFGb3JtYXRVdGlsczo6Q29weUZvcm1hdEVudHJpZXMoc3JjRm9ybWF0LCB0cmFja0Zvcm1hdC5nZXQoKSwgc3JjUGFyYW1zVG9Db3B5KTsKKyAgICBBTWVkaWFGb3JtYXRVdGlsczo6Q29weUZvcm1hdEVudHJpZXMob3B0aW9ucywgdHJhY2tGb3JtYXQuZ2V0KCksIGtTdXBwb3J0ZWRPcHRpb25zKTsKKyAgICByZXR1cm4gdHJhY2tGb3JtYXQ7Cit9CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyOjpvblRocmVhZEZpbmlzaGVkKGNvbnN0IHZvaWQqIHRocmVhZCwgbWVkaWFfc3RhdHVzX3QgdGhyZWFkU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRTdG9wcGVkKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGhyZWFkICIgPDwgdGhyZWFkIDw8ICIgZmluaXNoZWQgd2l0aCBzdGF0dXMgIiA8PCB0aHJlYWRTdGF0dXMgPDwgIiBzdG9wcGVkICIKKyAgICAgICAgICAgICAgIDw8IHRocmVhZFN0b3BwZWQ7CisKKyAgICAvLyBTdG9wIGFsbCB0aHJlYWRzIGlmIG9uZSByZXBvcnRzIGFuIGVycm9yLgorICAgIGlmICh0aHJlYWRTdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJlcXVlc3RTdG9wKGZhbHNlIC8qIHN0b3BPblN5bmMgKi8pOworICAgIH0KKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttVGhyZWFkU3RhdGVNdXRleH07CisKKyAgICAvLyBSZWNvcmQgdGhlIGNoYW5nZS4KKyAgICBtVGhyZWFkU3RhdGVzW3RocmVhZF0gPSBET05FOworICAgIGlmICh0aHJlYWRTdGF0dXMgIT0gQU1FRElBX09LICYmIG1UcmFuc2NvZGVyU3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICBtVHJhbnNjb2RlclN0YXR1cyA9IHRocmVhZFN0YXR1czsKKyAgICB9CisKKyAgICBtVHJhbnNjb2RlclN0b3BwZWQgfD0gdGhyZWFkU3RvcHBlZDsKKworICAgIC8vIENoZWNrIGlmIGFsbCB0aHJlYWRzIGFyZSBkb25lLiBOb3RlIHRoYXQgaWYgYWxsIHRyYW5zY29kZXJzIGhhdmUgc3RvcHBlZCBidXQgdGhlIHNhbXBsZQorICAgIC8vIHdyaXRlciBoYXMgbm90IHlldCBzdGFydGVkLCBpdCBuZXZlciB3aWxsLgorICAgIGJvb2wgdHJhbnNjb2RlcnNEb25lID0gdHJ1ZTsKKyAgICBUaHJlYWRTdGF0ZSBzYW1wbGVXcml0ZXJTdGF0ZSA9IFBFTkRJTkc7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1UaHJlYWRTdGF0ZXMpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiICBUaHJlYWQgIiA8PCBpdC5maXJzdCA8PCAiIHN0YXRlIiA8PCBpdC5zZWNvbmQ7CisgICAgICAgIGlmIChpdC5maXJzdCA9PSBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4obVNhbXBsZVdyaXRlci5nZXQoKSkpIHsKKyAgICAgICAgICAgIHNhbXBsZVdyaXRlclN0YXRlID0gaXQuc2Vjb25kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNjb2RlcnNEb25lICY9IChpdC5zZWNvbmQgPT0gRE9ORSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCF0cmFuc2NvZGVyc0RvbmUgfHwgc2FtcGxlV3JpdGVyU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWxsIGRvbmUuIFNlbmQgY2FsbGJhY2sgYXN5bmNocm9ub3VzbHkgYW5kIHdha2UgdXAgdGhyZWFkcyB3YWl0aW5nIGluIGNhbmNlbC9wYXVzZS4KKyAgICBtVGhyZWFkc0RvbmUgPSB0cnVlOworICAgIGlmICghbUNhbGxiYWNrU2VudCkgeworICAgICAgICBzdGQ6OnRocmVhZCBhc3luY05vdGlmaWNhdGlvblRocmVhZHtbdGhpcywgc2VsZiA9IHNoYXJlZF9mcm9tX3RoaXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFuc2NvZGVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IG1UcmFuc2NvZGVyU3RvcHBlZF0geworICAgICAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJUcmFuc2NvZENhbGxiayIsIDAsIDAsIDApOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdHJhbnNjb2RlciB3YXMgc3RvcHBlZCB0aGF0IG1lYW5zIGEgY2FsbGVyIGlzIHdhaXRpbmcgaW4gc3RvcCBvciBwYXVzZQorICAgICAgICAgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBzZW5kIGEgY2FsbGJhY2suCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPm9uRXJyb3IodGhpcywgc3RhdHVzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT5vbkZpbmlzaGVkKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRocmVhZHNEb25lU2lnbmFsLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfX07CisgICAgICAgIGFzeW5jTm90aWZpY2F0aW9uVGhyZWFkLmRldGFjaCgpOworICAgICAgICBtQ2FsbGJhY2tTZW50ID0gdHJ1ZTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyOjpvblRyYWNrRm9ybWF0QXZhaWxhYmxlKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVHJhY2tUcmFuc2NvZGVyICIgPDwgdHJhbnNjb2RlciA8PCAiIGZvcm1hdCBhdmFpbGFibGUuIjsKKworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttVHJhY2tzQWRkZWRNdXRleH07CisgICAgY29uc3Qgdm9pZCogc2FtcGxlV3JpdGVyUHRyID0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KG1TYW1wbGVXcml0ZXIuZ2V0KCkpOworCisgICAgLy8gSWdub3JlIGR1cGxpY2F0ZSBmb3JtYXQgY2hhbmdlLgorICAgIGlmIChtVHJhY2tzQWRkZWQuY291bnQodHJhbnNjb2RlcikgPiAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBBZGQgdHJhY2sgdG8gdGhlIHdyaXRlci4KKyAgICBhdXRvIGNvbnN1bWVyID0gbVNhbXBsZVdyaXRlci0+YWRkVHJhY2sodHJhbnNjb2Rlci0+Z2V0T3V0cHV0Rm9ybWF0KCkpOworICAgIGlmIChjb25zdW1lciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBhZGQgdHJhY2sgdG8gc2FtcGxlIHdyaXRlci4iOworICAgICAgICBvblRocmVhZEZpbmlzaGVkKHNhbXBsZVdyaXRlclB0ciwgQU1FRElBX0VSUk9SX1VOS05PV04sIGZhbHNlIC8qIHN0b3BwZWQgKi8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIHNhbXBsZSB3cml0ZXIgaXMgbm90IHlldCBzdGFydGVkIHNvIG5vdGlmeSB0aGUgY2FsbGVyIHRoYXQgcHJvZ3Jlc3MgaXMgc3RpbGwgbWFkZS4KKyAgICBpZiAobUhlYXJ0QmVhdEludGVydmFsVXMgPiAwKSB7CisgICAgICAgIG1DYWxsYmFja3MtPm9uSGVhcnRCZWF0KHRoaXMpOworICAgIH0KKworICAgIE1lZGlhVHJhY2tUcmFuc2NvZGVyKiBtdXRhYmxlVHJhbnNjb2RlciA9IGNvbnN0X2Nhc3Q8TWVkaWFUcmFja1RyYW5zY29kZXIqPih0cmFuc2NvZGVyKTsKKyAgICBtdXRhYmxlVHJhbnNjb2Rlci0+c2V0U2FtcGxlQ29uc3VtZXIoY29uc3VtZXIpOworCisgICAgbVRyYWNrc0FkZGVkLmluc2VydCh0cmFuc2NvZGVyKTsKKyAgICBib29sIGVycm9yU3RhcnRpbmcgPSBmYWxzZTsKKyAgICBpZiAobVRyYWNrc0FkZGVkLnNpemUoKSA9PSBtVHJhY2tUcmFuc2NvZGVycy5zaXplKCkpIHsKKyAgICAgICAgLy8gRW5hYmxlIHNlcXVlbnRpYWwgYWNjZXNzIG1vZGUgb24gdGhlIHNhbXBsZSByZWFkZXIgdG8gYWNoaWV2ZSBvcHRpbWFsIHJlYWQgcGVyZm9ybWFuY2UuCisgICAgICAgIC8vIFRoaXMgaGFzIHRvIHdhaXQgdW50aWwgYWxsIHRyYWNrcyBoYXZlIGRlbGl2ZXJlZCB0aGVpciBvdXRwdXQgZm9ybWF0cyBhbmQgdGhlIHNhbXBsZQorICAgICAgICAvLyB3cml0ZXIgaXMgc3RhcnRlZC4gT3RoZXJ3aXNlIHRoZSB0cmFja3Mgd2lsbCBub3QgZ2V0IHRoZWlyIG91dHB1dCBzYW1wbGUgcXVldWVzIGRyYWluZWQKKyAgICAgICAgLy8gYW5kIHRoZSB0cmFuc2NvZGVyIGNvdWxkIGhhbmcgZHVlIHRvIG9uZSB0cmFjayBydW5uaW5nIG91dCBvZiBidWZmZXJzIGFuZCBibG9ja2luZyB0aGUKKyAgICAgICAgLy8gb3RoZXIgdHJhY2tzIGZyb20gcmVhZGluZyBzb3VyY2Ugc2FtcGxlcyBiZWZvcmUgdGhleSBjb3VsZCBvdXRwdXQgdGhlaXIgZm9ybWF0cy4KKworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgICAgICAvLyBEb24ndCBzdGFydCB0aGUgc2FtcGxlIHdyaXRlciBpZiBhIHN0b3AgYWxyZWFkeSBoYXMgYmVlbiByZXF1ZXN0ZWQuCisgICAgICAgIGlmICghbVNhbXBsZVdyaXRlclN0b3BwZWQpIHsKKyAgICAgICAgICAgIGlmICghbUNhbmNlbGxlZCkgeworICAgICAgICAgICAgICAgIG1TYW1wbGVSZWFkZXItPnNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU3RhcnRpbmcgc2FtcGxlIHdyaXRlci4iOworICAgICAgICAgICAgZXJyb3JTdGFydGluZyA9ICFtU2FtcGxlV3JpdGVyLT5zdGFydCgpOworICAgICAgICAgICAgaWYgKCFlcnJvclN0YXJ0aW5nKSB7CisgICAgICAgICAgICAgICAgbVRocmVhZFN0YXRlc1tzYW1wbGVXcml0ZXJQdHJdID0gUlVOTklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnJvclN0YXJ0aW5nKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBzdGFydCBzYW1wbGUgd3JpdGVyLiI7CisgICAgICAgIG9uVGhyZWFkRmluaXNoZWQoc2FtcGxlV3JpdGVyUHRyLCBBTUVESUFfRVJST1JfVU5LTk9XTiwgZmFsc2UgLyogc3RvcHBlZCAqLyk7CisgICAgfQorfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25UcmFja0ZpbmlzaGVkKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVHJhY2tUcmFuc2NvZGVyICIgPDwgdHJhbnNjb2RlciA8PCAiIGZpbmlzaGVkIjsKKyAgICBvblRocmVhZEZpbmlzaGVkKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0cmFuc2NvZGVyKSwgQU1FRElBX09LLCBmYWxzZSAvKiBzdG9wcGVkICovKTsKK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uVHJhY2tTdG9wcGVkKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVHJhY2tUcmFuc2NvZGVyICIgPDwgdHJhbnNjb2RlciA8PCAiIHN0b3BwZWQiOworICAgIG9uVGhyZWFkRmluaXNoZWQoc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRyYW5zY29kZXIpLCBBTUVESUFfT0ssIHRydWUgLyogc3RvcHBlZCAqLyk7Cit9CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyOjpvblRyYWNrRXJyb3IoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIsIG1lZGlhX3N0YXR1c190IHN0YXR1cykgeworICAgIExPRyhFUlJPUikgPDwgIlRyYWNrVHJhbnNjb2RlciAiIDw8IHRyYW5zY29kZXIgPDwgIiByZXR1cm5lZCBlcnJvciAiIDw8IHN0YXR1czsKKyAgICBvblRocmVhZEZpbmlzaGVkKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0cmFuc2NvZGVyKSwgc3RhdHVzLCBmYWxzZSAvKiBzdG9wcGVkICovKTsKK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6Om9uRmluaXNoZWQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgTE9HKHN0YXR1cyA9PSBBTUVESUFfT0sgPyBERUJVRyA6IEVSUk9SKSA8PCAiU2FtcGxlIHdyaXRlciBmaW5pc2hlZCB3aXRoIHN0YXR1cyAiIDw8IHN0YXR1czsKKyAgICBvblRocmVhZEZpbmlzaGVkKHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih3cml0ZXIpLCBzdGF0dXMsIGZhbHNlIC8qIHN0b3BwZWQgKi8pOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25TdG9wcGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIpIHsKKyAgICBMT0coREVCVUcpIDw8ICJTYW1wbGUgd3JpdGVyICIgPDwgd3JpdGVyIDw8ICIgc3RvcHBlZCI7CisgICAgb25UaHJlYWRGaW5pc2hlZChzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4od3JpdGVyKSwgQU1FRElBX09LLCB0cnVlIC8qIHN0b3BwZWQgKi8pOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyIF9fdW51c2VkLCBpbnQzMl90IHByb2dyZXNzKSB7CisgICAgLy8gRGlzcGF0Y2ggcHJvZ3Jlc3MgdXBkYXRlZCB0byB0aGUgY2xpZW50LgorICAgIG1DYWxsYmFja3MtPm9uUHJvZ3Jlc3NVcGRhdGUodGhpcywgcHJvZ3Jlc3MpOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2Rlcjo6b25IZWFydEJlYXQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciBfX3VudXNlZCkgeworICAgIC8vIFNpZ25hbCBoZWFydC1iZWF0IHRvIHRoZSBjbGllbnQuCisgICAgbUNhbGxiYWNrcy0+b25IZWFydEJlYXQodGhpcyk7Cit9CisKK01lZGlhVHJhbnNjb2Rlcjo6TWVkaWFUcmFuc2NvZGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGVhcnRCZWF0SW50ZXJ2YWxVcywgcGlkX3QgcGlkLCB1aWRfdCB1aWQpCisgICAgICA6IG1DYWxsYmFja3MoY2FsbGJhY2tzKSwgbUhlYXJ0QmVhdEludGVydmFsVXMoaGVhcnRCZWF0SW50ZXJ2YWxVcyksIG1QaWQocGlkKSwgbVVpZCh1aWQpIHt9CisKK3N0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYW5zY29kZXI+IE1lZGlhVHJhbnNjb2Rlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYmFja3MsIGludDY0X3QgaGVhcnRCZWF0SW50ZXJ2YWxVcywgcGlkX3QgcGlkLAorICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZSkgeworICAgIGlmIChwYXVzZWRTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiSW5pdGlhbGl6aW5nIGZyb20gcGF1c2VkIHN0YXRlLiI7CisgICAgfQorICAgIGlmIChjYWxsYmFja3MgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYWxsYmFja3MgY2Fubm90IGJlIG51bGwiOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4oCisgICAgICAgICAgICBuZXcgTWVkaWFUcmFuc2NvZGVyKGNhbGxiYWNrcywgaGVhcnRCZWF0SW50ZXJ2YWxVcywgcGlkLCB1aWQpKTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGVyOjpjb25maWd1cmVTb3VyY2UoaW50IGZkKSB7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHNvdXJjZSBmZDogIiA8PCBmZDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgZmlsZVNpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICBtU2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChmZCwgMCAvKiBvZmZzZXQgKi8sIGZpbGVTaXplKTsKKyAgICBpZiAobVNhbXBsZVJlYWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBwYXJzZSBzb3VyY2UgZmQ6ICIgPDwgZmQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IHRyYWNrQ291bnQgPSBtU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IG1TYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KHN0YXRpY19jYXN0PGludD4odHJhY2tJbmRleCkpOworICAgICAgICBpZiAodHJhY2tGb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVHJhY2sgIyIgPDwgdHJhY2tJbmRleCA8PCAiIGhhcyBubyBmb3JtYXQiOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBtU291cmNlVHJhY2tGb3JtYXRzLmVtcGxhY2VfYmFjayh0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+PiBNZWRpYVRyYW5zY29kZXI6OmdldFRyYWNrRm9ybWF0cygpIGNvbnN0IHsKKyAgICAvLyBSZXR1cm4gYSBkZWVwIGNvcHkgb2YgdGhlIGZvcm1hdHMgdG8gYXZvaWQgdGhlIGNhbGxlciBtb2RpZnlpbmcgb3VyIGludGVybmFsIGZvcm1hdHMuCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IHRyYWNrRm9ybWF0czsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+JiBzb3VyY2VGb3JtYXQgOiBtU291cmNlVHJhY2tGb3JtYXRzKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdCogY29weSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NvcHkoY29weSwgc291cmNlRm9ybWF0LmdldCgpKTsKKyAgICAgICAgdHJhY2tGb3JtYXRzLmVtcGxhY2VfYmFjayhjb3B5LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgfQorICAgIHJldHVybiB0cmFja0Zvcm1hdHM7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6Y29uZmlndXJlVHJhY2tGb3JtYXQoc2l6ZV90IHRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogZGVzdGluYXRpb25PcHRpb25zKSB7CisgICAgaWYgKG1TYW1wbGVSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJTb3VyY2UgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSB0cmFja3MiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAodHJhY2tJbmRleCA+PSBtU291cmNlVHJhY2tGb3JtYXRzLnNpemUoKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJUcmFjayBpbmRleCAiIDw8IHRyYWNrSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiIGlzIG91dCBvZiBib3VuZHMuIFRyYWNrIGNvdW50OiAiIDw8IG1Tb3VyY2VUcmFja0Zvcm1hdHMuc2l6ZSgpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2Rlcj4gdHJhbnNjb2RlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiB0cmFja0Zvcm1hdDsKKworICAgIGlmIChkZXN0aW5hdGlvbk9wdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICB0cmFuc2NvZGVyID0gc3RkOjptYWtlX3NoYXJlZDxQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcj4oc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTWVkaWFGb3JtYXQqIHNyY1RyYWNrRm9ybWF0ID0gbVNvdXJjZVRyYWNrRm9ybWF0c1t0cmFja0luZGV4XS5nZXQoKTsKKworICAgICAgICBjb25zdCBjaGFyKiBzcmNNaW1lID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHNyY1RyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZzcmNNaW1lKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU291cmNlIHRyYWNrICMiIDw8IHRyYWNrSW5kZXggPDwgIiBoYXMgbm8gbWltZSB0eXBlIjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cm5jbXAoc3JjTWltZSwgInZpZGVvLyIsIDYpICE9IDApIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk9ubHkgdmlkZW8gdHJhY2tzIGFyZSBzdXBwb3J0ZWQgZm9yIHRyYW5zY29kaW5nLiBVbmFibGUgdG8gY29uZmlndXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNrICMiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHRyYWNrSW5kZXggPDwgIiB3aXRoIG1pbWUgIiA8PCBzcmNNaW1lOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGNoYXIqIGRzdE1pbWUgPSBudWxscHRyOworICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldFN0cmluZyhkZXN0aW5hdGlvbk9wdGlvbnMsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJmRzdE1pbWUpKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChkc3RNaW1lLCAidmlkZW8vIiwgNikgIT0gMCkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb252ZXJ0IG1lZGlhIHR5cGVzIGZvciB0cmFjayAjIiA8PCB0cmFja0luZGV4IDw8ICIsIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3JjTWltZSA8PCAiIHRvICIgPDwgZHN0TWltZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJhbnNjb2RlciA9IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpjcmVhdGUoc2hhcmVkX2Zyb21fdGhpcygpLCBtUGlkLCBtVWlkKTsKKworICAgICAgICB0cmFja0Zvcm1hdCA9IGNyZWF0ZVZpZGVvVHJhY2tGb3JtYXQoc3JjVHJhY2tGb3JtYXQsIGRlc3RpbmF0aW9uT3B0aW9ucyk7CisgICAgICAgIGlmICh0cmFja0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY3JlYXRlIHZpZGVvIHRyYWNrIGZvcm1hdCI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBtU2FtcGxlUmVhZGVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4KTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc2VsZWN0IHRyYWNrICIgPDwgdHJhY2tJbmRleDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5jb25maWd1cmUobVNhbXBsZVJlYWRlciwgdHJhY2tJbmRleCwgdHJhY2tGb3JtYXQpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbmZpZ3VyZSB0cmFjayB0cmFuc2NvZGVyIGZvciB0cmFjayAjIiA8PCB0cmFja0luZGV4IDw8ICIgcmV0dXJuZWQgZXJyb3IgIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1czsKKyAgICAgICAgbVNhbXBsZVJlYWRlci0+dW5zZWxlY3RUcmFjayh0cmFja0luZGV4KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgIG1UaHJlYWRTdGF0ZXNbc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KHRyYW5zY29kZXIuZ2V0KCkpXSA9IFBFTkRJTkc7CisKKyAgICBtVHJhY2tUcmFuc2NvZGVycy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHRyYW5zY29kZXIpKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVRyYW5zY29kZXI6OmNvbmZpZ3VyZURlc3RpbmF0aW9uKGludCBmZCkgeworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBkZXN0aW5hdGlvbiBmZDogIiA8PCBmZDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAobVNhbXBsZVdyaXRlciAhPSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkRlc3RpbmF0aW9uIGlzIGFscmVhZHkgY29uZmlndXJlZC4iOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TYW1wbGVXcml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgY29uc3QgYm9vbCBpbml0T2sgPSBtU2FtcGxlV3JpdGVyLT5pbml0KGZkLCBzaGFyZWRfZnJvbV90aGlzKCksIG1IZWFydEJlYXRJbnRlcnZhbFVzKTsKKworICAgIGlmICghaW5pdE9rKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHNhbXBsZSB3cml0ZXIgd2l0aCBkZXN0aW5hdGlvbiBmZDogIiA8PCBmZDsKKyAgICAgICAgbVNhbXBsZVdyaXRlci5yZXNldCgpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21UaHJlYWRTdGF0ZU11dGV4fTsKKyAgICBtVGhyZWFkU3RhdGVzW3N0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihtU2FtcGxlV3JpdGVyLmdldCgpKV0gPSBQRU5ESU5HOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6c3RhcnQoKSB7CisgICAgaWYgKG1UcmFja1RyYW5zY29kZXJzLnNpemUoKSA8IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHN0YXJ0LCBubyB0cmFja3MgYXJlIGNvbmZpZ3VyZWQuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKG1TYW1wbGVXcml0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQsIGRlc3RpbmF0aW9uIGlzIG5vdCBjb25maWd1cmVkIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0cmFuc2NvZGVycworICAgIGJvb2wgc3RhcnRlZCA9IHRydWU7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bVRocmVhZFN0YXRlTXV0ZXh9OworICAgICAgICBmb3IgKGF1dG8mIHRyYW5zY29kZXIgOiBtVHJhY2tUcmFuc2NvZGVycykgeworICAgICAgICAgICAgaWYgKCEoc3RhcnRlZCA9IHRyYW5zY29kZXItPnN0YXJ0KCkpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVGhyZWFkU3RhdGVzW3N0YXRpY19jYXN0PGNvbnN0IHZvaWQqPih0cmFuc2NvZGVyLmdldCgpKV0gPSBSVU5OSU5HOworICAgICAgICB9CisgICAgfQorICAgIGlmICghc3RhcnRlZCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgdHJhY2sgdHJhbnNjb2Rlci4iOworICAgICAgICBjYW5jZWwoKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNZWRpYVRyYW5zY29kZXI6OnJlcXVlc3RTdG9wKGJvb2wgc3RvcE9uU3luYykgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttVGhyZWFkU3RhdGVNdXRleH07CisgICAgaWYgKG1DYW5jZWxsZWQpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFuc2NvZGVyIGFscmVhZHkgY2FuY2VsbGVkIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZiAoIXN0b3BPblN5bmMpIHsKKyAgICAgICAgbVNhbXBsZVdyaXRlclN0b3BwZWQgPSB0cnVlOworICAgICAgICBtU2FtcGxlV3JpdGVyLT5zdG9wKCk7CisgICAgfQorCisgICAgbVNhbXBsZVJlYWRlci0+c2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoZmFsc2UpOworICAgIGZvciAoYXV0byYgdHJhbnNjb2RlciA6IG1UcmFja1RyYW5zY29kZXJzKSB7CisgICAgICAgIHRyYW5zY29kZXItPnN0b3Aoc3RvcE9uU3luYyk7CisgICAgfQorCisgICAgbUNhbmNlbGxlZCA9IHRydWU7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXI6OndhaXRGb3JUaHJlYWRzKCkgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBsb2Nre21UaHJlYWRTdGF0ZU11dGV4fTsKKyAgICB3aGlsZSAoIW1UaHJlYWRzRG9uZSkgeworICAgICAgICBtVGhyZWFkc0RvbmVTaWduYWwud2FpdChsb2NrKTsKKyAgICB9Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6cGF1c2Uoc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4qIHBhdXNlZFN0YXRlKSB7CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gcmVxdWVzdFN0b3AodHJ1ZSAvKiBzdG9wT25TeW5jICovKTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHdhaXRGb3JUaHJlYWRzKCk7CisKKyAgICAvLyBUT0RPOiB3cml0ZSBpbnRlcm5hbCBzdGF0ZXMgdG8gcGFyY2VsLgorICAgICpwYXVzZWRTdGF0ZSA9IHN0ZDo6c2hhcmVkX3B0cjw6Om5kazo6U2NvcGVkQVBhcmNlbD4obmV3IDo6bmRrOjpTY29wZWRBUGFyY2VsKCkpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK21lZGlhX3N0YXR1c190IE1lZGlhVHJhbnNjb2Rlcjo6Y2FuY2VsKCkgeworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHJlcXVlc3RTdG9wKGZhbHNlIC8qIHN0b3BPblN5bmMgKi8pOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgd2FpdEZvclRocmVhZHMoKTsKKworICAgIC8vIFRPRE86IFJlbGVhc2UgdHJhbnNjb2RlcnM/CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWVkaWFUcmFuc2NvZGVyOjpyZXN1bWUoKSB7CisgICAgLy8gVE9ETzogcmVzdG9yZSBpbnRlcm5hbCBzdGF0ZXMgZnJvbSBwYXJjZWwuCisgICAgcmV0dXJuIHN0YXJ0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTmRrQ29tbW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9OZGtDb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzNjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvTmRrQ29tbW9uLmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka0NvbW1vbiIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisvKiBUT0RPKGIvMTUzNTkyMjgxKQorICogTm90ZTogY29uc3RhbnRzIHVzZWQgYnkgdGhlIG5hdGl2ZSBtZWRpYSB0ZXN0cyBidXQgbm90IGF2YWlsYWJsZSBpbiBtZWRpYSBuZGsgYXBpCisgKi8KK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19WUDggPSAidmlkZW8veC12bmQub24yLnZwOCI7Citjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOworY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSA9ICJ2aWRlby9hdjAxIjsKK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVkMgPSAidmlkZW8vYXZjIjsKK2NvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOworY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOworY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMgPSAidmlkZW8vM2dwcCI7CisKKy8qIFRPRE8oYi8xNTM1OTIyODEpICovCitjb25zdCBjaGFyKiBUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9BTExPV19GUkFNRV9EUk9QID0gImFsbG93LWZyYW1lLWRyb3AiOworY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FID0gInJlcXVlc3Qtc3luYyI7Citjb25zdCBjaGFyKiBUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFID0gInZpZGVvLWJpdHJhdGUiOworY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfTUFYX0JfRlJBTUVTID0gIm1heC1iZnJhbWVzIjsKKworLyogVE9ETyhsbmlsc3Nvbik6IEZpbmFsaXplIHZhbHVlIG9yIGFkb3B0IEFNZWRpYUZvcm1hdCBrZXkgb25jZSBhdmFpbGFibGUuICovCitjb25zdCBjaGFyKiBUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9DT0xPUl9UUkFOU0ZFUl9SRVFVRVNUID0gImNvbG9yLXRyYW5zZmVyLXJlcXVlc3QiOworY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQkFDS0dST1VORF9NT0RFID0gImFuZHJvaWQuX2JhY2tncm91bmQtbW9kZSI7CisKK25hbWVzcGFjZSBBTWVkaWFGb3JtYXRVdGlscyB7CisKKyNkZWZpbmUgREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoX3R5cGUsIF90eXBlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIENvcHlGb3JtYXRFbnRyeSMjX3R5cGVOYW1lKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmcm9tLCBBTWVkaWFGb3JtYXQqIHRvKSB7IFwKKyAgICAgICAgX3R5cGUgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXQjI190eXBlTmFtZShmcm9tLCBrZXksICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXQjI190eXBlTmFtZSh0bywga2V5LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK0RFRklORV9GT1JNQVRfVkFMVUVfQ09QWV9GVU5DKGNvbnN0IGNoYXIqLCBTdHJpbmcpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoaW50NjRfdCwgSW50NjQpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoaW50MzJfdCwgSW50MzIpOworREVGSU5FX0ZPUk1BVF9WQUxVRV9DT1BZX0ZVTkMoZmxvYXQsIEZsb2F0KTsKKwordm9pZCBDb3B5Rm9ybWF0RW50cmllcyhBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEVudHJ5Q29waWVyPiYgZW50cmllcykgeworICAgIGlmIChmcm9tID09IG51bGxwdHIgfHwgdG8gPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBudWxsIGZvcm1hdHMiOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChlbnRyaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJObyBlbnRyaWVzIHRvIGNvcHkiOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChhdXRvJiBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgaWYgKCFlbnRyeS5jb3B5KGVudHJ5LmtleSwgZnJvbSwgdG8pICYmIGVudHJ5LmNvcHkyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGVudHJ5LmNvcHkyKGVudHJ5LmtleSwgZnJvbSwgdG8pOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIERFRklORV9TRVRfREVGQVVMVF9GT1JNQVRfVkFMVUVfRlVOQyhfdHlwZSwgX3R5cGVOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBTZXREZWZhdWx0Rm9ybWF0VmFsdWUjI190eXBlTmFtZShjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZm9ybWF0LCBfdHlwZSB2YWx1ZSkgeyBcCisgICAgICAgIF90eXBlIHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldCMjX3R5cGVOYW1lKGZvcm1hdCwga2V5LCAmdG1wKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0IyNfdHlwZU5hbWUoZm9ybWF0LCBrZXksIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitERUZJTkVfU0VUX0RFRkFVTFRfRk9STUFUX1ZBTFVFX0ZVTkMoZmxvYXQsIEZsb2F0KTsKK0RFRklORV9TRVRfREVGQVVMVF9GT1JNQVRfVkFMVUVfRlVOQyhpbnQzMl90LCBJbnQzMik7CisKKy8vIERldGVybWluZXMgd2hldGhlciBhIHRyYWNrIGZvcm1hdCBkZXNjcmliZXMgSERSIHZpZGVvIGNvbnRlbnQgb3Igbm90LiBUaGUKKy8vIGxvZ2ljIGlzIGJhc2VkIG9uIGlzSGRyKCkgaW4gbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwLgorYm9vbCBWaWRlb0lzSGRyKEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgLy8gSWYgVlVJIHNpZ25hbHMgSERSIGNvbnRlbnQsIHRoaXMgaW50ZXJuYWwgZmxhZyBpcyBzZXQgYnkgdGhlIGV4dHJhY3Rvci4KKyAgICBpbnQzMl90IGlzSGRyOworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCAiYW5kcm9pZC5faXMtaGRyIiwgJmlzSGRyKSkgeworICAgICAgICByZXR1cm4gaXNIZHI7CisgICAgfQorCisgICAgLy8gSWYgY29udGFpbmVyIHN1cHBsaWVkIEhEUiBzdGF0aWMgaW5mbyB3aXRob3V0IHRyYW5zZmVyIHNldCwgYXNzdW1lIEhEUi4KKyAgICBjb25zdCBjaGFyKiBoZHJJbmZvOworICAgIGludDMyX3QgdHJhbnNmZXI7CisgICAgaWYgKChBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKSB8fAorICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsICJoZHIxMC1wbHVzLWluZm8iLCAmaGRySW5mbykpICYmCisgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCAmdHJhbnNmZXIpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgY2hlY2sgaWYgYW4gSERSIHRyYW5zZmVyIGZ1bmN0aW9uIGlzIHNldC4KKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKSkgeworICAgICAgICByZXR1cm4gdHJhbnNmZXIgPT0gQ09MT1JfVFJBTlNGRVJfU1QyMDg0IHx8IHRyYW5zZmVyID09IENPTE9SX1RSQU5TRkVSX0hMRzsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9Cit9ICAvLyBuYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzVkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuY3BwCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIGZvciAoYXV0byBpdCA9IG1BZGRyZXNzU2l6ZU1hcC5iZWdpbigpOyBpdCAhPSBtQWRkcmVzc1NpemVNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgZGVsZXRlW10gaXQtPmZpcnN0OworICAgIH0KK30KKwordWludDhfdCogUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OkJ1ZmZlclBvb2w6OmdldEJ1ZmZlcldpdGhTaXplKHNpemVfdCBtaW5pbXVtQnVmZmVyU2l6ZSkKKyAgICAgICAgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7CisgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAvLyBXYWl0IGlmIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBidXQgbm9uZSBhcmUgZnJlZS4KKyAgICB3aGlsZSAobUFkZHJlc3NTaXplTWFwLnNpemUoKSA+PSBtTWF4QnVmZmVyQ291bnQgJiYgbUZyZWVCdWZmZXJNYXAuZW1wdHkoKSAmJiAhbUFib3J0ZWQpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgIH0KKworICAgIGlmIChtQWJvcnRlZCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgZnJlZSBsaXN0IGNvbnRhaW5zIGEgbGFyZ2UgZW5vdWdoIGJ1ZmZlci4KKyAgICBhdXRvIGl0ID0gbUZyZWVCdWZmZXJNYXAubG93ZXJfYm91bmQobWluaW11bUJ1ZmZlclNpemUpOworICAgIGlmIChpdCAhPSBtRnJlZUJ1ZmZlck1hcC5lbmQoKSkgeworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBtRnJlZUJ1ZmZlck1hcC5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorCisgICAgLy8gSWYgdGhlIG1heGltdW0gYnVmZmVyIGNvdW50IGlzIHJlYWNoZWQsIHJlbW92ZSBhbiBleGlzdGluZyBmcmVlIGJ1ZmZlci4KKyAgICBpZiAobUFkZHJlc3NTaXplTWFwLnNpemUoKSA+PSBtTWF4QnVmZmVyQ291bnQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1GcmVlQnVmZmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1BZGRyZXNzU2l6ZU1hcC5lcmFzZShpdC0+c2Vjb25kKTsKKyAgICAgICAgZGVsZXRlW10gaXQtPnNlY29uZDsKKyAgICAgICAgbUZyZWVCdWZmZXJNYXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgICB1aW50OF90KiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFttaW5pbXVtQnVmZmVyU2l6ZV07CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBuZXcgYnVmZmVyIG9mIHNpemU6ICIgPDwgbWluaW11bUJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgYnVmZmVyIHRvIHRoZSB0cmFja2luZyBzZXQuCisgICAgbUFkZHJlc3NTaXplTWFwLmVtcGxhY2UoYnVmZmVyLCBtaW5pbXVtQnVmZmVyU2l6ZSk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6QnVmZmVyUG9vbDo6cmV0dXJuQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlcikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworCisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyIHx8IG1BZGRyZXNzU2l6ZU1hcC5maW5kKGJ1ZmZlcikgPT0gbUFkZHJlc3NTaXplTWFwLmVuZCgpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSWdub3JpbmcgdW50cmFja2VkIGJ1ZmZlciAiIDw8IGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1GcmVlQnVmZmVyTWFwLmVtcGxhY2UobUFkZHJlc3NTaXplTWFwW2J1ZmZlcl0sIGJ1ZmZlcik7CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKK3ZvaWQgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OkJ1ZmZlclBvb2w6OmFib3J0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIG1BYm9ydGVkID0gdHJ1ZTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKK30KKworbWVkaWFfc3RhdHVzX3QgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OmNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiYgZGVzdGluYXRpb25Gb3JtYXQgX191bnVzZWQpIHsKKyAgICAvLyBDYWxsZWQgYnkgTWVkaWFUcmFja1RyYW5zY29kZXIuIFBhc3N0aHJvdWdoIGRvZXNuJ3QgY2FyZSBhYm91dCBkZXN0aW5hdGlvbiBzbyBqdXN0IHJldHVybiBvay4KKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6cnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSB7CisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJQYXNzdGhydVRocmVhZCIsIDAsIDAsIDApOworCisgICAgTWVkaWFTYW1wbGVJbmZvIGluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgYm9vbCBlb3NSZWFjaGVkID0gZmFsc2U7CisKKyAgICAvLyBOb3RpZnkgdGhlIHRyYWNrIGZvcm1hdCBhcyBzb29uIGFzIHdlIHN0YXJ0LiBJdCdzIHNhbWUgYXMgdGhlIHNvdXJjZSBmb3JtYXQuCisgICAgbm90aWZ5VHJhY2tGb3JtYXRBdmFpbGFibGUoKTsKKworICAgIE1lZGlhU2FtcGxlOjpPblNhbXBsZVJlbGVhc2VkQ2FsbGJhY2sgYnVmZmVyUmVsZWFzZUNhbGxiYWNrID0KKyAgICAgICAgICAgIFtidWZmZXJQb29sID0gbUJ1ZmZlclBvb2xdKE1lZGlhU2FtcGxlKiBzYW1wbGUpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oc2FtcGxlLT5idWZmZXIpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAvLyBNb3ZlIHNhbXBsZXMgdW50aWwgRU9TIGlzIHJlYWNoZWQgb3IgdHJhbnNjb2RpbmcgaXMgc3RvcHBlZC4KKyAgICB3aGlsZSAobVN0b3BSZXF1ZXN0ICE9IFNUT1BfTk9XICYmICFlb3NSZWFjaGVkKSB7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IG1NZWRpYVNhbXBsZVJlYWRlci0+Z2V0U2FtcGxlSW5mb0ZvclRyYWNrKG1UcmFja0luZGV4LCAmaW5mbyk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZShpbmZvLnNpemUpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdG9wUmVxdWVzdCA9PSBTVE9QX05PVykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZ2V0IGJ1ZmZlciBmcm9tIHBvb2wiOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2FtcGxlID0gTWVkaWFTYW1wbGU6OmNyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgMCAvKiBvZmZzZXQgKi8sIDAgLyogYnVmZmVySWQgKi8sIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1NZWRpYVNhbXBsZVJlYWRlci0+cmVhZFNhbXBsZURhdGFGb3JUcmFjayhtVHJhY2tJbmRleCwgYnVmZmVyLCBpbmZvLnNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBuZXh0IHNhbXBsZSBkYXRhLiBBYm9ydGluZyB0cmFuc2NvZGUuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBzYW1wbGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1lZGlhU2FtcGxlPigpOworICAgICAgICAgICAgZW9zUmVhY2hlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gZ2V0IG5leHQgc2FtcGxlIGluZm8uIEFib3J0aW5nIHRyYW5zY29kZS4iOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHNhbXBsZS0+aW5mbyA9IGluZm87CisgICAgICAgIG9uT3V0cHV0U2FtcGxlQXZhaWxhYmxlKHNhbXBsZSk7CisKKyAgICAgICAgaWYgKG1TdG9wUmVxdWVzdCA9PSBTVE9QX09OX1NZTkMgJiYgaW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX1NZTkNfU0FNUExFKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RvcFJlcXVlc3QgIT0gTk9ORSAmJiAhZW9zUmVhY2hlZCkgeworICAgICAgICAqc3RvcHBlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3ZvaWQgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OmFib3J0VHJhbnNjb2RlTG9vcCgpIHsKKyAgICBpZiAobVN0b3BSZXF1ZXN0ID09IFNUT1BfTk9XKSB7CisgICAgICAgIG1CdWZmZXJQb29sLT5hYm9ydCgpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI6OmdldE91dHB1dEZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZUZvcm1hdDsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvVmlkZW9UcmFja1RyYW5zY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjE5MDhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmNwcApAQCAtMCwwICsxLDY1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvVHJhY2tUcmFuc2NvZGVyIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBBTWVkaWFGb3JtYXRVdGlsczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDaGVjayB0aGF0IHRoZSBjb2RlYyBzYW1wbGUgZmxhZ3MgaGF2ZSB0aGUgZXhwZWN0ZWQgTkRLIG1lYW5pbmcuCitzdGF0aWNfYXNzZXJ0KFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRyA9PSBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19DT0RFQ19DT05GSUcsCisgICAgICAgICAgICAgICJTYW1wbGUgZmxhZyBtaXNtYXRjaDogQ09ERUNfQ09ORklHIik7CitzdGF0aWNfYXNzZXJ0KFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0gPT0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSwKKyAgICAgICAgICAgICAgIlNhbXBsZSBmbGFnIG1pc21hdGNoOiBFTkRfT0ZfU1RSRUFNIik7CitzdGF0aWNfYXNzZXJ0KFNBTVBMRV9GTEFHX1BBUlRJQUxfRlJBTUUgPT0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfUEFSVElBTF9GUkFNRSwKKyAgICAgICAgICAgICAgIlNhbXBsZSBmbGFnIG1pc21hdGNoOiBQQVJUSUFMX0ZSQU1FIik7CisKKy8vIENvbG9yIGZvcm1hdCBkZWZpbmVkIGJ5IHN1cmZhY2UuIChTZWUgTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXMjQ09MT1JfRm9ybWF0U3VyZmFjZS4pCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0NvbG9yRm9ybWF0U3VyZmFjZSA9IDB4N2YwMDA3ODk7CisvLyBEZWZhdWx0IGtleSBmcmFtZSBpbnRlcnZhbCBpbiBzZWNvbmRzLgorc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdEtleUZyYW1lSW50ZXJ2YWxTZWNvbmRzID0gMS4wZjsKKy8vIERlZmF1bHQgY29kZWMgb3BlcmF0aW5nIHJhdGUuCitzdGF0aWMgaW50MzJfdCBrRGVmYXVsdENvZGVjT3BlcmF0aW5nUmF0ZTcyMFAgPSBiYXNlOjpHZXRJbnRQcm9wZXJ0eSgKKyAgICAgICAgImRlYnVnLm1lZGlhLnRyYW5zY29kaW5nLmNvZGVjX21heF9vcGVyYXRpbmdfcmF0ZV83MjBQIiwgLypkZWZhdWx0Ki8gNDgwKTsKK3N0YXRpYyBpbnQzMl90IGtEZWZhdWx0Q29kZWNPcGVyYXRpbmdSYXRlMTA4MFAgPSBiYXNlOjpHZXRJbnRQcm9wZXJ0eSgKKyAgICAgICAgImRlYnVnLm1lZGlhLnRyYW5zY29kaW5nLmNvZGVjX21heF9vcGVyYXRpbmdfcmF0ZV8xMDgwUCIsIC8qZGVmYXVsdCovIDI0MCk7CisvLyBEZWZhdWx0IGNvZGVjIHByaW9yaXR5Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0Q29kZWNQcmlvcml0eSA9IDE7CisvLyBEZWZhdWx0IGJpdHJhdGUsIGluIGNhc2Ugc291cmNlIGVzdGltYXRpb24gZmFpbHMuCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRCaXRyYXRlTWJwcyA9IDEwICogMTAwMCAqIDEwMDA7CisvLyBEZWZhdWx0IGZyYW1lIHJhdGUuCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRGcmFtZVJhdGUgPSAzMDsKKy8vIERlZmF1bHQgY29kZWMgY29tcGxleGl0eQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0Q29kZWNDb21wbGV4aXR5ID0gMTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpCbG9ja2luZ1F1ZXVlPFQ+OjpwdXNoKFQgY29uc3QmIHZhbHVlLCBib29sIGZyb250KSB7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1BYm9ydGVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJvbnQpIHsKKyAgICAgICAgICAgIG1RdWV1ZS5wdXNoX2Zyb250KHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgVmlkZW9UcmFja1RyYW5zY29kZXI6OkJsb2NraW5nUXVldWU8VD46OnBvcCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobU11dGV4KTsKKyAgICB3aGlsZSAobVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgIH0KKyAgICBUIHZhbHVlID0gbVF1ZXVlLmZyb250KCk7CisgICAgbVF1ZXVlLnBvcF9mcm9udCgpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworLy8gTm90ZTogRG8gbm90IGNhbGwgaWYgYW5vdGhlciB0aHJlYWQgbWlnaHQgd2FpdGluZyBpbiBwb3AuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OkJsb2NraW5nUXVldWU8VD46OmFib3J0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIG1BYm9ydGVkID0gdHJ1ZTsKKyAgICBtUXVldWUuY2xlYXIoKTsKK30KKworLy8gVGhlIENvZGVjV3JhcHBlciBjbGFzcyBpcyB1c2VkIHRvIGxldCBBTWVkaWFDb2RlYyBpbnN0YW5jZXMgb3V0bGl2ZSB0aGUgdHJhbnNjb2RlciBvYmplY3QgaXRzZWxmCisvLyBieSBnaXZpbmcgdGhlIGNvZGVjIGEgd2VhayBwb2ludGVyIHRvIHRoZSB0cmFuc2NvZGVyLiBDb2RlY3Mgd3JhcHBlZCBpbiB0aGlzIG9iamVjdCBhcmUga2VwdAorLy8gYWxpdmUgYnkgdGhlIHRyYW5zY29kZXIgYW5kIHRoZSBjb2RlYydzIG91dHN0YW5kaW5nIGJ1ZmZlcnMuIE9uY2UgdGhlIHRyYW5zY29kZXIgc3RvcHMgYW5kIGFsbAorLy8gb3V0cHV0IGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlbGVhc2VkIGJ5IGRvd25zdHJlYW0gY29tcG9uZW50cyB0aGUgY29kZWMgd2lsbCBhbHNvIGJlIHJlbGVhc2VkLgorY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXI6OkNvZGVjV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ29kZWNXcmFwcGVyKEFNZWRpYUNvZGVjKiBjb2RlYywgY29uc3Qgc3RkOjp3ZWFrX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4mIHRyYW5zY29kZXIpCisgICAgICAgICAgOiBtQ29kZWMoY29kZWMpLCBtVHJhbnNjb2Rlcih0cmFuc2NvZGVyKSwgbUNvZGVjU3RhcnRlZChmYWxzZSkge30KKyAgICB+Q29kZWNXcmFwcGVyKCkgeworICAgICAgICBpZiAobUNvZGVjU3RhcnRlZCkgeworICAgICAgICAgICAgQU1lZGlhQ29kZWNfc3RvcChtQ29kZWMpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtQ29kZWMpOworICAgIH0KKworICAgIEFNZWRpYUNvZGVjKiBnZXRDb2RlYygpIHsgcmV0dXJuIG1Db2RlYzsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4gZ2V0VHJhbnNjb2RlcigpIGNvbnN0IHsgcmV0dXJuIG1UcmFuc2NvZGVyLmxvY2soKTsgfTsKKyAgICB2b2lkIHNldFN0YXJ0ZWQoKSB7IG1Db2RlY1N0YXJ0ZWQgPSB0cnVlOyB9CisKK3ByaXZhdGU6CisgICAgQU1lZGlhQ29kZWMqIG1Db2RlYzsKKyAgICBzdGQ6OndlYWtfcHRyPFZpZGVvVHJhY2tUcmFuc2NvZGVyPiBtVHJhbnNjb2RlcjsKKyAgICBib29sIG1Db2RlY1N0YXJ0ZWQ7Cit9OworCisvLyBEaXNwYXRjaCByZXNwb25zZXMgdG8gY29kZWMgY2FsbGJhY2tzIG9udG8gdGhlIG1lc3NhZ2UgcXVldWUuCitzdHJ1Y3QgQXN5bmNDb2RlY0NhbGxiYWNrRGlzcGF0Y2ggeworICAgIHN0YXRpYyB2b2lkIG9uQXN5bmNJbnB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyogY29kZWMsIHZvaWQqIHVzZXJkYXRhLCBpbnQzMl90IGluZGV4KSB7CisgICAgICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqIHdyYXBwZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqPih1c2VyZGF0YSk7CisgICAgICAgIGlmIChhdXRvIHRyYW5zY29kZXIgPSB3cmFwcGVyLT5nZXRUcmFuc2NvZGVyKCkpIHsKKyAgICAgICAgICAgIGlmIChjb2RlYyA9PSB0cmFuc2NvZGVyLT5tRGVjb2RlcikgeworICAgICAgICAgICAgICAgIHRyYW5zY29kZXItPm1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKAorICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zY29kZXIsIGluZGV4XSB7IHRyYW5zY29kZXItPmVucXVldWVJbnB1dFNhbXBsZShpbmRleCk7IH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25Bc3luY091dHB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyogY29kZWMsIHZvaWQqIHVzZXJkYXRhLCBpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvKiBidWZmZXJJbmZvUHRyKSB7CisgICAgICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqIHdyYXBwZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqPih1c2VyZGF0YSk7CisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvID0gKmJ1ZmZlckluZm9QdHI7CisgICAgICAgIGlmIChhdXRvIHRyYW5zY29kZXIgPSB3cmFwcGVyLT5nZXRUcmFuc2NvZGVyKCkpIHsKKyAgICAgICAgICAgIHRyYW5zY29kZXItPm1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKFt0cmFuc2NvZGVyLCBpbmRleCwgY29kZWMsIGJ1ZmZlckluZm9dIHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZWMgPT0gdHJhbnNjb2Rlci0+bURlY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci0+dHJhbnNmZXJCdWZmZXIoaW5kZXgsIGJ1ZmZlckluZm8pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMgPT0gdHJhbnNjb2Rlci0+bUVuY29kZXItPmdldENvZGVjKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNjb2Rlci0+ZGVxdWV1ZU91dHB1dFNhbXBsZShpbmRleCwgYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkFzeW5jRm9ybWF0Q2hhbmdlZChBTWVkaWFDb2RlYyogY29kZWMsIHZvaWQqIHVzZXJkYXRhLCBBTWVkaWFGb3JtYXQqIGZvcm1hdCkgeworICAgICAgICBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Q29kZWNXcmFwcGVyKiB3cmFwcGVyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Q29kZWNXcmFwcGVyKj4odXNlcmRhdGEpOworICAgICAgICBpZiAoYXV0byB0cmFuc2NvZGVyID0gd3JhcHBlci0+Z2V0VHJhbnNjb2RlcigpKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGlzRGVjb2RlciA9IGNvZGVjID09IHRyYW5zY29kZXItPm1EZWNvZGVyOworICAgICAgICAgICAgY29uc3QgY2hhcioga0NvZGVjTmFtZSA9IChpc0RlY29kZXIgPyAiRGVjb2RlciIgOiAiRW5jb2RlciIpOworICAgICAgICAgICAgTE9HKElORk8pIDw8IGtDb2RlY05hbWUgPDwgIiBmb3JtYXQgY2hhbmdlZDogIiA8PCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KTsKKyAgICAgICAgICAgIHRyYW5zY29kZXItPm1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKFt0cmFuc2NvZGVyLCBmb3JtYXQsIGlzRGVjb2Rlcl0geworICAgICAgICAgICAgICAgIHRyYW5zY29kZXItPnVwZGF0ZVRyYWNrRm9ybWF0KGZvcm1hdCwgaXNEZWNvZGVyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25Bc3luY0Vycm9yKEFNZWRpYUNvZGVjKiBjb2RlYywgdm9pZCogdXNlcmRhdGEsIG1lZGlhX3N0YXR1c190IGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsIGNvbnN0IGNoYXIqIGRldGFpbCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciBmcm9tIGNvZGVjICIgPDwgY29kZWMgPDwgIiwgdXNlcmRhdGEgIiA8PCB1c2VyZGF0YSA8PCAiLCBlcnJvciAiCisgICAgICAgICAgICAgICAgICAgPDwgZXJyb3IgPDwgIiwgYWN0aW9uICIgPDwgYWN0aW9uQ29kZSA8PCAiLCBkZXRhaWwgIiA8PCBkZXRhaWw7CisgICAgICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqIHdyYXBwZXIgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpDb2RlY1dyYXBwZXIqPih1c2VyZGF0YSk7CisgICAgICAgIGlmIChhdXRvIHRyYW5zY29kZXIgPSB3cmFwcGVyLT5nZXRUcmFuc2NvZGVyKCkpIHsKKyAgICAgICAgICAgIHRyYW5zY29kZXItPm1Db2RlY01lc3NhZ2VRdWV1ZS5wdXNoKAorICAgICAgICAgICAgICAgICAgICBbdHJhbnNjb2RlciwgZXJyb3JdIHsgdHJhbnNjb2Rlci0+bVN0YXR1cyA9IGVycm9yOyB9LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPFZpZGVvVHJhY2tUcmFuc2NvZGVyPiBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2s+JiB0cmFuc2NvZGVyQ2FsbGJhY2ssIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4oCisgICAgICAgICAgICBuZXcgVmlkZW9UcmFja1RyYW5zY29kZXIodHJhbnNjb2RlckNhbGxiYWNrLCBwaWQsIHVpZCkpOworfQorCitWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6flZpZGVvVHJhY2tUcmFuc2NvZGVyKCkgeworICAgIGlmIChtRGVjb2RlciAhPSBudWxscHRyKSB7CisgICAgICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtRGVjb2Rlcik7CisgICAgfQorCisgICAgaWYgKG1TdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKG1TdXJmYWNlKTsKKyAgICB9Cit9CisKKy8vIFNlYXJjaCB0aGUgZGVmYXVsdCBvcGVyYXRpbmcgcmF0ZSBiYXNlZCBvbiByZXNvbHV0aW9uLgorc3RhdGljIGludDMyX3QgZ2V0RGVmYXVsdE9wZXJhdGluZ1JhdGUoQU1lZGlhRm9ybWF0KiBlbmNvZGVyRm9ybWF0KSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZW5jb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoKSAmJiAod2lkdGggPiAwKSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZW5jb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZoZWlnaHQpICYmIChoZWlnaHQgPiAwKSkgeworICAgICAgICBpZiAoKHdpZHRoID09IDEyODAgJiYgaGVpZ2h0ID09IDcyMCkgfHwgKHdpZHRoID09IDcyMCAmJiBoZWlnaHQgPT0gMTI4MCkpIHsKKyAgICAgICAgICAgIHJldHVybiBrRGVmYXVsdENvZGVjT3BlcmF0aW5nUmF0ZTcyMFA7CisgICAgICAgIH0gZWxzZSBpZiAoKHdpZHRoID09IDE5MjAgJiYgaGVpZ2h0ID09IDEwODApIHx8ICh3aWR0aCA9PSAxMDgwICYmIGhlaWdodCA9PSAxOTIwKSkgeworICAgICAgICAgICAgcmV0dXJuIGtEZWZhdWx0Q29kZWNPcGVyYXRpbmdSYXRlMTA4MFA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgb3BlcmF0aW5nIHJhdGU6ICIgPDwgd2lkdGggPDwgIiAiIDw8IGhlaWdodDsKKyAgICAgICAgICAgIC8vIERvbid0IHNldCBvcGVyYXRpbmcgcmF0ZSBpZiB0aGUgY29ycmVjdCBkaW1lbnNpb25zIGFyZSBub3QgZm91bmQuCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgb3BlcmF0aW5nIHJhdGUgZHVlIHRvIG1pc3NpbmcgcmVzb2x1dGlvbiI7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLy8gQ3JlYXRlcyBhbmQgY29uZmlndXJlcyB0aGUgY29kZWNzLgorbWVkaWFfc3RhdHVzX3QgVmlkZW9UcmFja1RyYW5zY29kZXI6OmNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiYgZGVzdGluYXRpb25Gb3JtYXQpIHsKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTUVESUFfT0s7CisKKyAgICBpZiAoZGVzdGluYXRpb25Gb3JtYXQgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJEZXN0aW5hdGlvbiBmb3JtYXQgaXMgbnVsbCwgdXNlIHBhc3N0aHJvdWdoIHRyYW5zY29kZXIiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogZW5jb2RlckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpZiAoIWVuY29kZXJGb3JtYXQgfHwgQU1lZGlhRm9ybWF0X2NvcHkoZW5jb2RlckZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQuZ2V0KCkpICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29weSBkZXN0aW5hdGlvbiBmb3JtYXQiOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKGVuY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsICZtQ29uZmlndXJlZEJpdHJhdGUpKSB7CisgICAgICAgIHN0YXR1cyA9IG1NZWRpYVNhbXBsZVJlYWRlci0+Z2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKG1UcmFja0luZGV4LCAmbUNvbmZpZ3VyZWRCaXRyYXRlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBlc3RpbWF0ZSBiaXRyYXRlLiBVc2luZyBkZWZhdWx0ICIgPDwga0RlZmF1bHRCaXRyYXRlTWJwczsKKyAgICAgICAgICAgIG1Db25maWd1cmVkQml0cmF0ZSA9IGtEZWZhdWx0Qml0cmF0ZU1icHM7CisgICAgICAgIH0KKworICAgICAgICBMT0coSU5GTykgPDwgIkNvbmZpZ3VyaW5nIGJpdHJhdGUgIiA8PCBtQ29uZmlndXJlZEJpdHJhdGU7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihlbmNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtQ29uZmlndXJlZEJpdHJhdGUpOworICAgIH0KKworICAgIFNldERlZmF1bHRGb3JtYXRWYWx1ZUZsb2F0KEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwgZW5jb2RlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdEtleUZyYW1lSW50ZXJ2YWxTZWNvbmRzKTsKKworICAgIGludDMyX3Qgb3BlcmF0aW5nUmF0ZSA9IGdldERlZmF1bHRPcGVyYXRpbmdSYXRlKGVuY29kZXJGb3JtYXQpOworCisgICAgaWYgKG9wZXJhdGluZ1JhdGUgIT0gLTEpIHsKKyAgICAgICAgZmxvYXQgdG1wZjsKKyAgICAgICAgaW50MzJfdCB0bXBpOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRGbG9hdChlbmNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLCAmdG1wZikgJiYKKyAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZW5jb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgJnRtcGkpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZW5jb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgb3BlcmF0aW5nUmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTZXREZWZhdWx0Rm9ybWF0VmFsdWVJbnQzMihBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCBlbmNvZGVyRm9ybWF0LCBrRGVmYXVsdENvZGVjUHJpb3JpdHkpOworICAgIFNldERlZmF1bHRGb3JtYXRWYWx1ZUludDMyKEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZW5jb2RlckZvcm1hdCwga0RlZmF1bHRGcmFtZVJhdGUpOworICAgIFNldERlZmF1bHRGb3JtYXRWYWx1ZUludDMyKEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSwgZW5jb2RlckZvcm1hdCwga0RlZmF1bHRDb2RlY0NvbXBsZXhpdHkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihlbmNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwga0NvbG9yRm9ybWF0U3VyZmFjZSk7CisKKyAgICAvLyBBbHdheXMgZW5jb2RlIHdpdGhvdXQgcm90YXRpb24uIFRoZSByb3RhdGlvbiBkZWdyZWUgd2lsbCBiZSB0cmFuc2ZlcnJlZCBkaXJlY3RseSB0bworICAgIC8vIE1lZGlhU2FtcGxlV3JpdGVyIHRyYWNrIGZvcm1hdCwgYW5kIE1lZGlhU2FtcGxlV3JpdGVyIHdpbGwgY2FsbCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQuCisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGVuY29kZXJGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sIDApOworCisgICAgLy8gUmVxdWVzdCBlbmNvZGVyIHRvIHVzZSBiYWNrZ3JvdW5kIHByaW9yaXRpZXMgYnkgZGVmYXVsdC4KKyAgICBTZXREZWZhdWx0Rm9ybWF0VmFsdWVJbnQzMihUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9CQUNLR1JPVU5EX01PREUsIGVuY29kZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKiB0cnVlICovKTsKKworICAgIG1EZXN0aW5hdGlvbkZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KGVuY29kZXJGb3JtYXQsICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKworICAgIC8vIENyZWF0ZSBhbmQgY29uZmlndXJlIHRoZSBlbmNvZGVyLgorICAgIGNvbnN0IGNoYXIqIGRlc3RpbmF0aW9uTWltZSA9IG51bGxwdHI7CisgICAgYm9vbCBvayA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobURlc3RpbmF0aW9uRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RpbmF0aW9uTWltZSk7CisgICAgaWYgKCFvaykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJEZXN0aW5hdGlvbiBNSU1FIHR5cGUgaXMgcmVxdWlyZWQgZm9yIHRyYW5zY29kaW5nLiI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisjZGVmaW5lIF9fVFJBTlNDT0RJTkdfTUlOX0FQSV9fIDMxCisKKyAgICBBTWVkaWFDb2RlYyogZW5jb2RlcjsKKyAgICBpZiAoX19idWlsdGluX2F2YWlsYWJsZShhbmRyb2lkIF9fVFJBTlNDT0RJTkdfTUlOX0FQSV9fLCAqKSkgeworICAgICAgICBlbmNvZGVyID0gQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZUZvckNsaWVudChkZXN0aW5hdGlvbk1pbWUsIG1QaWQsIG1VaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVuY29kZXIgPSBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGRlc3RpbmF0aW9uTWltZSk7CisgICAgfQorICAgIGlmIChlbmNvZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBlbmNvZGVyIGZvciB0eXBlICIgPDwgZGVzdGluYXRpb25NaW1lOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBtRW5jb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWNXcmFwcGVyPihlbmNvZGVyLCBzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgTE9HKElORk8pIDw8ICJDb25maWd1cmluZyBlbmNvZGVyIHdpdGg6ICIgPDwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKG1EZXN0aW5hdGlvbkZvcm1hdC5nZXQoKSk7CisgICAgc3RhdHVzID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKG1FbmNvZGVyLT5nZXRDb2RlYygpLCBtRGVzdGluYXRpb25Gb3JtYXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogc3VyZmFjZSAqLywgTlVMTCAvKiBjcnlwdG8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUNPREVDX0NPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNvbmZpZ3VyZSB2aWRlbyBlbmNvZGVyOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19jcmVhdGVJbnB1dFN1cmZhY2UobUVuY29kZXItPmdldENvZGVjKCksICZtU3VyZmFjZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhbiBlbmNvZGVyIGlucHV0IHN1cmZhY2U6ICVkIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuZCBjb25maWd1cmUgdGhlIGRlY29kZXIuCisgICAgY29uc3QgY2hhciogc291cmNlTWltZSA9IG51bGxwdHI7CisgICAgb2sgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnNvdXJjZU1pbWUpOworICAgIGlmICghb2spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiU291cmNlIE1JTUUgdHlwZSBpcyByZXF1aXJlZCBmb3IgdHJhbnNjb2RpbmcuIjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoX19idWlsdGluX2F2YWlsYWJsZShhbmRyb2lkIF9fVFJBTlNDT0RJTkdfTUlOX0FQSV9fLCAqKSkgeworICAgICAgICBtRGVjb2RlciA9IEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGVGb3JDbGllbnQoc291cmNlTWltZSwgbVBpZCwgbVVpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURlY29kZXIgPSBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKHNvdXJjZU1pbWUpOworICAgIH0KKyAgICBpZiAobURlY29kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY3JlYXRlIGRlY29kZXIgZm9yIHR5cGUgIiA8PCBzb3VyY2VNaW1lOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIGF1dG8gZGVjb2RlckZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KEFNZWRpYUZvcm1hdF9uZXcoKSwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgIGlmICghZGVjb2RlckZvcm1hdCB8fAorICAgICAgICBBTWVkaWFGb3JtYXRfY29weShkZWNvZGVyRm9ybWF0LmdldCgpLCBtU291cmNlRm9ybWF0LmdldCgpKSAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNvcHkgc291cmNlIGZvcm1hdCI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgLy8gUmVxdWVzdCBkZWNvZGVyIHRvIGNvbnZlcnQgSERSIGNvbnRlbnQgdG8gU0RSLgorICAgIGNvbnN0IGJvb2wgc291cmNlSXNIZHIgPSBWaWRlb0lzSGRyKG1Tb3VyY2VGb3JtYXQuZ2V0KCkpOworICAgIGlmIChzb3VyY2VJc0hkcikgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZGVjb2RlckZvcm1hdC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0NPTE9SX1RSQU5TRkVSX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU8pOworICAgIH0KKworICAgIC8vIFByZXZlbnQgZGVjb2RlciBmcm9tIG92ZXJ3cml0aW5nIGZyYW1lcyB0aGF0IHRoZSBlbmNvZGVyIGhhcyBub3QgeWV0IGNvbnN1bWVkLgorICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihkZWNvZGVyRm9ybWF0LmdldCgpLCBUQkRfQU1FRElBQ09ERUNfUEFSQU1FVEVSX0tFWV9BTExPV19GUkFNRV9EUk9QLCAwKTsKKworICAgIC8vIENvcHkgb3ZlciBjb25maWd1cmF0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggZW5jb2RlciBhbmQgZGVjb2Rlci4KKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8RW50cnlDb3BpZXI+IGtFbmNvZGVyRW50cmllc1RvQ29weXsKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUjIoQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgRmxvYXQsIEludDMyKSwKKyAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCBJbnQzMiksCisgICAgICAgICAgICBFTlRSWV9DT1BJRVIoVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQkFDS0dST1VORF9NT0RFLCBJbnQzMiksCisgICAgfTsKKyAgICBDb3B5Rm9ybWF0RW50cmllcyhtRGVzdGluYXRpb25Gb3JtYXQuZ2V0KCksIGRlY29kZXJGb3JtYXQuZ2V0KCksIGtFbmNvZGVyRW50cmllc1RvQ29weSk7CisKKyAgICBMT0coSU5GTykgPDwgIkNvbmZpZ3VyaW5nIGRlY29kZXIgd2l0aDogIiA8PCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZGVjb2RlckZvcm1hdC5nZXQoKSk7CisgICAgc3RhdHVzID0gQU1lZGlhQ29kZWNfY29uZmlndXJlKG1EZWNvZGVyLCBkZWNvZGVyRm9ybWF0LmdldCgpLCBtU3VyZmFjZSwgTlVMTCAvKiBjcnlwdG8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxhZ3MgKi8pOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBjb25maWd1cmUgdmlkZW8gZGVjb2RlcjogIiA8PCBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNvdXJjZUlzSGRyKSB7CisgICAgICAgIGJvb2wgc3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIEFNZWRpYUZvcm1hdCogaW5wdXRGb3JtYXQgPSBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdChtRGVjb2Rlcik7CisKKyAgICAgICAgaWYgKGlucHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmZXJGdW5jOworICAgICAgICAgICAgc3VwcG9ydGVkID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0NPTE9SX1RSQU5TRkVSX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZmVyRnVuYykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyRnVuYyA9PSBDT0xPUl9UUkFOU0ZFUl9TRFJfVklERU87CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGlucHV0Rm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJIRFIgdG8gU0RSIGNvbnZlcnNpb24gdW5zdXBwb3J0ZWQgYnkgdGhlIGNvZGVjIjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb25maWd1cmUgY29kZWNzIHRvIHJ1biBpbiBhc3luYyBtb2RlLgorICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIGFzeW5jQ29kZWNDYWxsYmFja3MgPSB7CisgICAgICAgICAgICAub25Bc3luY0lucHV0QXZhaWxhYmxlID0gQXN5bmNDb2RlY0NhbGxiYWNrRGlzcGF0Y2g6Om9uQXN5bmNJbnB1dEF2YWlsYWJsZSwKKyAgICAgICAgICAgIC5vbkFzeW5jT3V0cHV0QXZhaWxhYmxlID0gQXN5bmNDb2RlY0NhbGxiYWNrRGlzcGF0Y2g6Om9uQXN5bmNPdXRwdXRBdmFpbGFibGUsCisgICAgICAgICAgICAub25Bc3luY0Zvcm1hdENoYW5nZWQgPSBBc3luY0NvZGVjQ2FsbGJhY2tEaXNwYXRjaDo6b25Bc3luY0Zvcm1hdENoYW5nZWQsCisgICAgICAgICAgICAub25Bc3luY0Vycm9yID0gQXN5bmNDb2RlY0NhbGxiYWNrRGlzcGF0Y2g6Om9uQXN5bmNFcnJvcn07CisKKyAgICAvLyBOb3RlOiBUaGUgZGVjb2RlciBkb2VzIG5vdCBuZWVkIGl0cyBvd24gd3JhcHBlciBiZWNhdXNlIGl0cyBsaWZldGltZSBpcyB0aWVkIHRvIHRoZQorICAgIC8vIHRyYW5zY29kZXIuIEJ1dCB0aGUgc2FtZSBjYWxsYmFja3MgYXJlIHJldXNlZCBmb3IgZGVjb2RlciBhbmQgZW5jb2RlciBzbyB3ZSBwYXNzIHRoZSBlbmNvZGVyCisgICAgLy8gd3JhcHBlciBhcyB1c2VyZGF0YSBoZXJlIGJ1dCBuZXZlciByZWFkIHRoZSBjb2RlYyBmcm9tIGl0IGluIHRoZSBjYWxsYmFjay4KKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19zZXRBc3luY05vdGlmeUNhbGxiYWNrKG1EZWNvZGVyLCBhc3luY0NvZGVjQ2FsbGJhY2tzLCBtRW5jb2Rlci5nZXQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNldCBkZWNvZGVyIHRvIGFzeW5jIG1vZGU6ICIgPDwgc3RhdHVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUVuY29kZXItPmdldENvZGVjKCksIGFzeW5jQ29kZWNDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5jb2Rlci5nZXQoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHNldCBlbmNvZGVyIHRvIGFzeW5jIG1vZGU6ICIgPDwgc3RhdHVzOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OmVucXVldWVJbnB1dFNhbXBsZShpbnQzMl90IGJ1ZmZlckluZGV4KSB7CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1FRElBX09LOworCisgICAgaWYgKG1Fb3NGcm9tU291cmNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtTWVkaWFTYW1wbGVSZWFkZXItPmdldFNhbXBsZUluZm9Gb3JUcmFjayhtVHJhY2tJbmRleCwgJm1TYW1wbGVJbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSyAmJiBzdGF0dXMgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgZ2V0dGluZyBuZXh0IHNhbXBsZSBpbmZvOiAiIDw8IHN0YXR1czsKKyAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBib29sIGVuZE9mU3RyZWFtID0gKHN0YXR1cyA9PSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CisKKyAgICBpZiAoIWVuZE9mU3RyZWFtKSB7CisgICAgICAgIHNpemVfdCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgdWludDhfdCogc291cmNlQnVmZmVyID0gQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIobURlY29kZXIsIGJ1ZmZlckluZGV4LCAmYnVmZmVyU2l6ZSk7CisgICAgICAgIGlmIChzb3VyY2VCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGVjb2RlciByZXR1cm5lZCBhIE5VTEwgaW5wdXQgYnVmZmVyLiI7CisgICAgICAgICAgICBtU3RhdHVzID0gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyU2l6ZSA8IG1TYW1wbGVJbmZvLnNpemUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkRlY29kZXIgcmV0dXJuZWQgYW4gaW5wdXQgYnVmZmVyIHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZSBzYW1wbGUuIjsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IG1NZWRpYVNhbXBsZVJlYWRlci0+cmVhZFNhbXBsZURhdGFGb3JUcmFjayhtVHJhY2tJbmRleCwgc291cmNlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZUluZm8uc2l6ZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gcmVhZCBuZXh0IHNhbXBsZSBkYXRhLiBBYm9ydGluZyB0cmFuc2NvZGUuIjsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobVNhbXBsZUluZm8uc2l6ZSkgeworICAgICAgICAgICAgKyttSW5wdXRGcmFtZUNvdW50OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRU9TIGZyb20gc291cmNlLiI7CisgICAgICAgIG1Fb3NGcm9tU291cmNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKG1EZWNvZGVyLCBidWZmZXJJbmRleCwgMCwgbVNhbXBsZUluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVJbmZvLnByZXNlbnRhdGlvblRpbWVVcywgbVNhbXBsZUluZm8uZmxhZ3MpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBxdWV1ZSBpbnB1dCBidWZmZXIgZm9yIGRlY29kZTogIiA8PCBzdGF0dXM7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9UcmFja1RyYW5zY29kZXI6OnRyYW5zZmVyQnVmZmVyKGludDMyX3QgYnVmZmVySW5kZXgsIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKSB7CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IDApIHsKKyAgICAgICAgYm9vbCBuZWVkc1JlbmRlciA9IGJ1ZmZlckluZm8uc2l6ZSA+IDA7CisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobURlY29kZXIsIGJ1ZmZlckluZGV4LCBuZWVkc1JlbmRlcik7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlckluZm8uZmxhZ3MgJiBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkVPUyBmcm9tIGRlY29kZXIuIjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShtRW5jb2Rlci0+Z2V0Q29kZWMoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaWduYWxFT1Mgb24gZW5jb2RlciByZXR1cm5lZCBlcnJvcjogIiA8PCBzdGF0dXM7CisgICAgICAgICAgICBtU3RhdHVzID0gc3RhdHVzOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpkZXF1ZXVlT3V0cHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKSB7CisgICAgaWYgKGJ1ZmZlckluZGV4ID49IDApIHsKKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemUgPSAwOworICAgICAgICB1aW50OF90KiBidWZmZXIgPQorICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihtRW5jb2Rlci0+Z2V0Q29kZWMoKSwgYnVmZmVySW5kZXgsICZzYW1wbGVTaXplKTsKKworICAgICAgICBNZWRpYVNhbXBsZTo6T25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayA9CisgICAgICAgICAgICAgICAgW2VuY29kZXIgPSBtRW5jb2Rlcl0oTWVkaWFTYW1wbGUqIHNhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKGVuY29kZXItPmdldENvZGVjKCksIHNhbXBsZS0+YnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogcmVuZGVyICovKTsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlID0gTWVkaWFTYW1wbGU6OmNyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2soCisgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJJbmZvLm9mZnNldCwgYnVmZmVySW5kZXgsIGJ1ZmZlclJlbGVhc2VDYWxsYmFjayk7CisgICAgICAgIHNhbXBsZS0+aW5mby5zaXplID0gYnVmZmVySW5mby5zaXplOworICAgICAgICBzYW1wbGUtPmluZm8uZmxhZ3MgPSBidWZmZXJJbmZvLmZsYWdzOworICAgICAgICBzYW1wbGUtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gYnVmZmVySW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisKKyAgICAgICAgaWYgKGJ1ZmZlckluZm8uc2l6ZSA+IDAgJiYgKGJ1ZmZlckluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19DT0RFQ19DT05GSUcpID09IDApIHsKKyAgICAgICAgICAgICsrbU91dHB1dEZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgb25PdXRwdXRTYW1wbGVBdmFpbGFibGUoc2FtcGxlKTsKKworICAgICAgICBtTGFzdFNhbXBsZVdhc1N5bmMgPSBzYW1wbGUtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVySW5mby5mbGFncyAmIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRU9TIGZyb20gZW5jb2Rlci4iOworICAgICAgICBtRW9zRnJvbUVuY29kZXIgPSB0cnVlOworCisgICAgICAgIGlmIChtSW5wdXRGcmFtZUNvdW50ICE9IG1PdXRwdXRGcmFtZUNvdW50KSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIklucHV0IC8gT3V0cHV0IGZyYW1lIGNvdW50IG1pc21hdGNoOiAiIDw8IG1JbnB1dEZyYW1lQ291bnQgPDwgIiB2cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbU91dHB1dEZyYW1lQ291bnQ7CisgICAgICAgICAgICBpZiAobUlucHV0RnJhbWVDb3VudCA+IDAgJiYgbU91dHB1dEZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkVuY29kZXIgZGlkIG5vdCBwcm9kdWNlIGFueSBvdXRwdXQgZnJhbWVzLiI7CisgICAgICAgICAgICAgICAgbVN0YXR1cyA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjp1cGRhdGVUcmFja0Zvcm1hdChBTWVkaWFGb3JtYXQqIG91dHB1dEZvcm1hdCwgYm9vbCBmcm9tRGVjb2RlcikgeworICAgIGlmIChmcm9tRGVjb2RlcikgeworICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QU1lZGlhRm9ybWF0VXRpbHM6OkVudHJ5Q29waWVyPiBrVmFsdWVzVG9Db3B5eworICAgICAgICAgICAgICAgIEVOVFJZX0NPUElFUihBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCBJbnQzMiksCisgICAgICAgICAgICAgICAgRU5UUllfQ09QSUVSKEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIEludDMyKSwKKyAgICAgICAgICAgICAgICBFTlRSWV9DT1BJRVIoQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgSW50MzIpLAorICAgICAgICB9OworICAgICAgICBBTWVkaWFGb3JtYXQqIHBhcmFtcyA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRVdGlsczo6Q29weUZvcm1hdEVudHJpZXMob3V0cHV0Rm9ybWF0LCBwYXJhbXMsIGtWYWx1ZXNUb0NvcHkpOworICAgICAgICAgICAgaWYgKEFNZWRpYUNvZGVjX3NldFBhcmFtZXRlcnMobUVuY29kZXItPmdldENvZGVjKCksIHBhcmFtcykgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmFibGUgdG8gdXBkYXRlIGVuY29kZXIgd2l0aCBjb2xvciBpbmZvcm1hdGlvbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQWN0dWFsT3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJZ25vcmluZyBkdXBsaWNhdGUgZm9ybWF0IGNoYW5nZS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXRDb3B5ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIGlmICghZm9ybWF0Q29weSB8fCBBTWVkaWFGb3JtYXRfY29weShmb3JtYXRDb3B5LCBvdXRwdXRGb3JtYXQpICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gY29weSBvdXRwdXRGb3JtYXQiOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdENvcHkpOworICAgICAgICBtU3RhdHVzID0gQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgdGhlIGFjdHVhbCB0cmFjayBmb3JtYXQgZm9yIG11eGVyIGJhc2VkIG9uIHRoZSBlbmNvZGVyIG91dHB1dCBmb3JtYXQsCisgICAgLy8gc2luY2UgbWFueSB2aXRhbCBpbmZvcm1hdGlvbiBjb21lcyBpbiB0aGUgZW5jb2RlciBmb3JtYXQgKGVnLiBDU0QpLgorICAgIC8vIFRyYW5zZmVyIG5lY2Vzc2FyeSBmaWVsZHMgZnJvbSB0aGUgdXNlci1jb25maWd1cmVkIHRyYWNrIGZvcm1hdCAoZGVyaXZlZCBmcm9tCisgICAgLy8gc291cmNlIHRyYWNrIGZvcm1hdCBhbmQgdXNlciB0cmFuc2NvZGluZyByZXF1ZXN0KSB3aGVyZSBuZWVkZWQuCisKKyAgICAvLyBUcmFuc2ZlciBTQVIgc2V0dGluZ3M6CisgICAgLy8gSWYgbURlc3RpbmF0aW9uRm9ybWF0IGhhcyBTQVIgc2V0LCBpdCBtZWFucyB0aGUgb3JpZ2luYWwgc291cmNlIGhhcyBTQVIgc3BlY2lmaWVkCisgICAgLy8gYXQgY29udGFpbmVyIGxldmVsLiBUaGlzIGlzIHN1cHBvc2VkIHRvIG92ZXJyaWRlIGFueSBTQVIgc2V0dGluZ3MgaW4gdGhlIGJpdHN0cmVhbSwKKyAgICAvLyB0aHVzIHNob3VsZCBhbHdheXMgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIGNvbnRhaW5lciBvZiB0aGUgdHJhbnNjb2RlZCBmaWxlLgorICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCAmc2FyV2lkdGgpICYmCisgICAgICAgIChzYXJXaWR0aCA+IDApICYmCisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtU291cmNlRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsICZzYXJIZWlnaHQpICYmCisgICAgICAgIChzYXJIZWlnaHQgPiAwKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIHNhcldpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdENvcHksIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCwgc2FySGVpZ2h0KTsKKyAgICB9CisgICAgLy8gVHJhbnNmZXIgREFSIHNldHRpbmdzLgorICAgIGludDMyX3QgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0OworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobVNvdXJjZUZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAmZGlzcGxheVdpZHRoKSAmJgorICAgICAgICAoZGlzcGxheVdpZHRoID4gMCkgJiYKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Tb3VyY2VGb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUhlaWdodCkgJiYKKyAgICAgICAgKGRpc3BsYXlIZWlnaHQgPiAwKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCBkaXNwbGF5V2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgZGlzcGxheUhlaWdodCk7CisgICAgfQorCisgICAgLy8gVHJhbnNmZXIgcm90YXRpb24gc2V0dGluZ3MuCisgICAgLy8gTm90ZSB0aGF0IG11eGVyIGl0c2VsZiBkb2Vzbid0IHRha2Ugcm90YXRpb24gZnJvbSB0aGUgdHJhY2sgZm9ybWF0LiBJdCByZXF1aXJlcworICAgIC8vIEFNZWRpYU11eGVyX3NldE9yaWVudGF0aW9uSGludCB0byBzZXQgdGhlIHJvdGF0aW9uLiBIZXJlIHdlIHBhc3MgdGhlIHJvdGF0aW9uIHRvCisgICAgLy8gTWVkaWFTYW1wbGVXcml0ZXIgdXNpbmcgdGhlIHRyYWNrIGZvcm1hdC4gTWVkaWFTYW1wbGVXcml0ZXIgd2lsbCB0aGVuIGNhbGwKKyAgICAvLyBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQgYXMgbmVlZGVkLgorICAgIGludDMyX3Qgcm90YXRpb247CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtU291cmNlRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCAmcm90YXRpb24pICYmCisgICAgICAgIChyb3RhdGlvbiAhPSAwKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0Q29weSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb24pOworICAgIH0KKworICAgIC8vIFRyYW5zZmVyIHRyYWNrIGR1cmF0aW9uLgorICAgIC8vIFByZXNlcnZlIHRoZSBzb3VyY2UgdHJhY2sgZHVyYXRpb24gYnkgc2VuZGluZyBpdCB0byBNZWRpYVNhbXBsZVdyaXRlci4KKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtU291cmNlRm9ybWF0LmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykgJiYKKyAgICAgICAgZHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZvcm1hdENvcHksIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOworICAgIH0KKworICAgIC8vIFRPRE86IHRyYW5zZmVyIG90aGVyIGZpZWxkcyBhcyByZXF1aXJlZC4KKworICAgIG1BY3R1YWxPdXRwdXRGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pihmb3JtYXRDb3B5LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgTE9HKElORk8pIDw8ICJBY3R1YWwgb3V0cHV0IGZvcm1hdDogIiA8PCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0Q29weSk7CisKKyAgICBub3RpZnlUcmFja0Zvcm1hdEF2YWlsYWJsZSgpOworfQorCittZWRpYV9zdGF0dXNfdCBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6cnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSB7CisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJWaWRlVHJhbnNjb2RUcmQiLCAwLCAwLCAwKTsKKworICAgIC8vIFB1c2ggc3RhcnQgZGVjb2RlciBhbmQgZW5jb2RlciBhcyB0d28gbWVzc2FnZXMsIHNvIHRoYXQgdGhlc2UgYXJlIHN1YmplY3QgdG8gdGhlCisgICAgLy8gc3RvcCByZXF1ZXN0IGFzIHdlbGwuIElmIHRoZSBzZXNzaW9uIGlzIGNhbmNlbGxlZCAob3IgcGF1c2VkKSBpbW1lZGlhdGVseSBhZnRlciBzdGFydCwKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHdhc3RlIHRpbWUgc3RhcnQgdGhlbiBzdG9wIHRoZSBjb2RlY3MuCisgICAgbUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goW3RoaXNdIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhQ29kZWNfc3RhcnQobURlY29kZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHN0YXJ0IHZpZGVvIGRlY29kZXI6ICIgPDwgc3RhdHVzOworICAgICAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgbUNvZGVjTWVzc2FnZVF1ZXVlLnB1c2goW3RoaXNdIHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhQ29kZWNfc3RhcnQobUVuY29kZXItPmdldENvZGVjKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHN0YXJ0IHZpZGVvIGVuY29kZXI6ICIgPDwgc3RhdHVzOworICAgICAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci0+c2V0U3RhcnRlZCgpOworICAgIH0pOworCisgICAgLy8gUHJvY2VzcyBjb2RlYyBldmVudHMgdW50aWwgRU9TIGlzIHJlYWNoZWQsIHRyYW5zY29kaW5nIGlzIHN0b3BwZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgorICAgIHdoaWxlIChtU3RvcFJlcXVlc3QgIT0gU1RPUF9OT1cgJiYgIW1Fb3NGcm9tRW5jb2RlciAmJiBtU3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gbWVzc2FnZSA9IG1Db2RlY01lc3NhZ2VRdWV1ZS5wb3AoKTsKKyAgICAgICAgbWVzc2FnZSgpOworCisgICAgICAgIGlmIChtU3RvcFJlcXVlc3QgPT0gU1RPUF9PTl9TWU5DICYmIG1MYXN0U2FtcGxlV2FzU3luYykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQ29kZWNNZXNzYWdlUXVldWUuYWJvcnQoKTsKKyAgICBBTWVkaWFDb2RlY19zdG9wKG1EZWNvZGVyKTsKKworICAgIC8vIFNpZ25hbCBpZiB0cmFuc2NvZGluZyB3YXMgc3RvcHBlZCBiZWZvcmUgaXQgZmluaXNoZWQuCisgICAgaWYgKG1TdG9wUmVxdWVzdCAhPSBOT05FICYmICFtRW9zRnJvbUVuY29kZXIgJiYgbVN0YXR1cyA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgKnN0b3BwZWQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBtU3RhdHVzOworfQorCit2b2lkIFZpZGVvVHJhY2tUcmFuc2NvZGVyOjphYm9ydFRyYW5zY29kZUxvb3AoKSB7CisgICAgaWYgKG1TdG9wUmVxdWVzdCA9PSBTVE9QX05PVykgeworICAgICAgICAvLyBXYWtlIHVwIHRyYW5zY29kZXIgdGhyZWFkLgorICAgICAgICBtQ29kZWNNZXNzYWdlUXVldWUucHVzaChbXSB7fSwgdHJ1ZSAvKiBmcm9udCAqLyk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Z2V0T3V0cHV0Rm9ybWF0KCkgY29uc3QgeworICAgIHJldHVybiBtQWN0dWFsT3V0cHV0Rm9ybWF0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWYwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImJlbmNobWFya2RlZmF1bHRzIiwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsibGlibWVkaWF0cmFuc2NvZGVyIiwgImxpYmdvb2dsZS1iZW5jaG1hcmsiXSwKKyAgICB0ZXN0X2NvbmZpZ190ZW1wbGF0ZTogIkFuZHJvaWRUZXN0VGVtcGxhdGUueG1sIiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiLCAiVHJhbnNjb2RlckJlbmNobWFya3MiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk1lZGlhVHJhbnNjb2RlckJlbmNobWFyayIsCisgICAgc3JjczogWyJNZWRpYVRyYW5zY29kZXJCZW5jaG1hcmsuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsiYmVuY2htYXJrZGVmYXVsdHMiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk1lZGlhU2FtcGxlUmVhZGVyQmVuY2htYXJrIiwKKyAgICBzcmNzOiBbIk1lZGlhU2FtcGxlUmVhZGVyQmVuY2htYXJrLmNwcCJdLAorICAgIGRlZmF1bHRzOiBbImJlbmNobWFya2RlZmF1bHRzIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyayIsCisgICAgc3JjczogWyJNZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyay5jcHAiXSwKKyAgICBkZWZhdWx0czogWyJiZW5jaG1hcmtkZWZhdWx0cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9BbmRyb2lkVGVzdFRlbXBsYXRlLnhtbCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzZjA3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJVbml0IHRlc3QgY29uZmlndXJhdGlvbiBmb3Ige01PRFVMRX0iPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJUcmFuc2NvZGVyQmVuY2htYXJrcyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0ie01PRFVMRX0iIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvVHJhbnNjb2RpbmdCZW5jaG1hcmstMS4yLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ0JlbmNobWFyay8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR29vZ2xlQmVuY2htYXJrVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS1iZW5jaG1hcmstZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmVuY2htYXJrLW1vZHVsZS1uYW1lIiB2YWx1ZT0ie01PRFVMRX0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhU2FtcGxlUmVhZGVyQmVuY2htYXJrLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjkzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhU2FtcGxlUmVhZGVyQmVuY2htYXJrLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogTWVkaWFTYW1wbGVSZWFkZXIgYmVuY2htYXJrIHRlc3RzLgorICoKKyAqIEhvdyB0byBydW4gdGhlIGJlbmNobWFyazoKKyAqCisgKiAxLiBEb3dubG9hZCB0aGUgbWVkaWEgYXNzZXRzIGZyb20gaHR0cDovL2dvL3RyYW5zY29kaW5nYmVuY2htYXJrIGFuZCBwdXNoIHRoZSBkaXJlY3RvcnkKKyAqICAgICgiVHJhbnNjb2RpbmdCZW5jaG1hcmsiKSB0byAvZGF0YS9sb2NhbC90bXAuCisgKgorICogMi4gQ29tcGlsZSB0aGUgYmVuY2htYXJrIGFuZCBzeW5jIHRvIGRldmljZToKKyAqICAgICAgJCBtbSAtajcyICYmIGFkYiBzeW5jCisgKgorICogMy4gUnVuOgorICogICAgICAkIGFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsvTWVkaWFTYW1wbGVSZWFkZXJCZW5jaG1hcmsKKyAqLworCisjZGVmaW5lIExPR19UQUcgIk1lZGlhU2FtcGxlUmVhZGVyQmVuY2htYXJrIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiZW5jaG1hcmsvYmVuY2htYXJrLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIHZvaWQgUmVhZE1lZGlhU2FtcGxlcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWRBdWRpbywgYm9vbCBzZXF1ZW50aWFsQWNjZXNzID0gZmFsc2UpIHsKKyAgICAvLyBBc3NldCBkaXJlY3RvcnkuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBc3NldERpcmVjdG9yeSA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdCZW5jaG1hcmsvIjsKKworICAgIGludCBzcmNGZCA9IDA7CisgICAgc3RkOjpzdHJpbmcgc3JjUGF0aCA9IGtBc3NldERpcmVjdG9yeSArIHNyY0ZpbGVOYW1lOworCisgICAgaWYgKChzcmNGZCA9IG9wZW4oc3JjUGF0aC5jX3N0cigpLCBPX1JET05MWSkpIDwgMCkgeworICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJVbmFibGUgdG8gb3BlbiBzb3VyY2UgZmlsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoc3JjRmQsIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhzcmNGZCwgMCwgU0VFS19TRVQpOworCisgICAgZm9yIChhdXRvIF8gOiBzdGF0ZSkgeworICAgICAgICBhdXRvIHNhbXBsZVJlYWRlciA9IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpjcmVhdGVGcm9tRmQoc3JjRmQsIDAsIGZpbGVTaXplKTsKKyAgICAgICAgaWYgKHNhbXBsZVJlYWRlci0+c2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3Moc2VxdWVudGlhbEFjY2VzcykgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJzZXRFbmZvcmNlU2VxdWVudGlhbEFjY2VzcyBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlbGVjdCB0cmFja3MuCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gdHJhY2tJbmRpY2VzOworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpOyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gc2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworCisgICAgICAgICAgICBpZiAoc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5ULCAmZnJhbWVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuY291bnRlcnNbIlZpZGVvRnJhbWVSYXRlIl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmNobWFyazo6Q291bnRlcihmcmFtZUNvdW50LCBiZW5jaG1hcms6OkNvdW50ZXI6OmtJc1JhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlYWRBdWRpbyAmJiBzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNrSW5kaWNlcy5wdXNoX2JhY2sodHJhY2tJbmRleCk7CisgICAgICAgICAgICBzYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RhcnQgdGhyZWFkcy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0aHJlYWQ+IHRyYWNrVGhyZWFkczsKKyAgICAgICAgZm9yIChhdXRvIHRyYWNrSW5kZXggOiB0cmFja0luZGljZXMpIHsKKyAgICAgICAgICAgIHRyYWNrVGhyZWFkcy5lbXBsYWNlX2JhY2soW3RyYWNrSW5kZXgsIHNhbXBsZVJlYWRlciwgJnN0YXRlXSB7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmFjayAiIDw8IHRyYWNrSW5kZXggPDwgIiBzdGFydGVkIjsKKyAgICAgICAgICAgICAgICBNZWRpYVNhbXBsZUluZm8gaW5mbzsKKworICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBidWZmZXI7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBzYW1wbGVSZWFkZXItPmdldFNhbXBsZUluZm9Gb3JUcmFjayh0cmFja0luZGV4LCAmaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uc2l6ZSA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBpbmZvLnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQobmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc2FtcGxlUmVhZGVyLT5yZWFkU2FtcGxlRGF0YUZvclRyYWNrKHRyYWNrSW5kZXgsIGJ1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiRXJyb3IgcmVhZGluZyBzYW1wbGUgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlRyYWNrICIgPDwgdHJhY2tJbmRleCA8PCAiIGZpbmlzaGVkIjsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSm9pbiB0aHJlYWRzLgorICAgICAgICBmb3IgKGF1dG8mIHRocmVhZCA6IHRyYWNrVGhyZWFkcykgeworICAgICAgICAgICAgdGhyZWFkLmpvaW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlKHNyY0ZkKTsKK30KKworLy8gQmVuY2htYXJrIHJlZ2lzdHJhdGlvbiB3cmFwcGVyIGZvciB0cmFuc2NvZGluZy4KKyNkZWZpbmUgVFJBTlNDT0RFUl9CRU5DSE1BUksoZnVuYykgXAorICAgIEJFTkNITUFSSyhmdW5jKS0+VXNlUmVhbFRpbWUoKS0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCktPlVuaXQoYmVuY2htYXJrOjprTWlsbGlzZWNvbmQpCisKK3N0YXRpYyB2b2lkIEJNX01lZGlhU2FtcGxlUmVhZGVyX0F1ZGlvVmlkZW9fUGFyYWxsZWwoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBSZWFkTWVkaWFTYW1wbGVzKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcmVhZEF1ZGlvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fTWVkaWFTYW1wbGVSZWFkZXJfQXVkaW9WaWRlb19TZXF1ZW50aWFsKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgUmVhZE1lZGlhU2FtcGxlcyhzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHJlYWRBdWRpbyAqLywgdHJ1ZSAvKiBzZXF1ZW50aWFsQWNjZXNzICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fTWVkaWFTYW1wbGVSZWFkZXJfVmlkZW8oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBSZWFkTWVkaWFTYW1wbGVzKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHJlYWRBdWRpbyAqLyk7Cit9CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX01lZGlhU2FtcGxlUmVhZGVyX0F1ZGlvVmlkZW9fUGFyYWxsZWwpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fTWVkaWFTYW1wbGVSZWFkZXJfQXVkaW9WaWRlb19TZXF1ZW50aWFsKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX01lZGlhU2FtcGxlUmVhZGVyX1ZpZGVvKTsKKworQkVOQ0hNQVJLX01BSU4oKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFUcmFja1RyYW5zY29kZXJCZW5jaG1hcmsuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2JlbmNobWFyay9NZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlZDJjNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFUcmFja1RyYW5zY29kZXJCZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsNDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBOYXRpdmUgbWVkaWEgdHJhY2sgdHJhbnNjb2RlciBiZW5jaG1hcmsgdGVzdHMuCisgKgorICogSG93IHRvIHJ1biB0aGUgYmVuY2htYXJrOgorICoKKyAqIDEuIERvd25sb2FkIHRoZSBtZWRpYSBhc3NldHMgZnJvbSBodHRwOi8vZ28vdHJhbnNjb2RpbmdiZW5jaG1hcmsgYW5kIHB1c2ggdGhlIGRpcmVjdG9yeQorICogICAgKCJUcmFuc2NvZGluZ0JlbmNobWFyayIpIHRvIC9kYXRhL2xvY2FsL3RtcC4KKyAqCisgKiAyLiBDb21waWxlIHRoZSBiZW5jaG1hcmsgYW5kIHN5bmMgdG8gZGV2aWNlOgorICogICAgICAkIG1tIC1qNzIgJiYgYWRiIHN5bmMKKyAqCisgKiAzLiBSdW46CisgKiAgICAgICQgYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyay9NZWRpYVRyYWNrVHJhbnNjb2RlckJlbmNobWFyaworICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhY2tUcmFuc2NvZGVyQmVuY2htYXJrIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8YmVuY2htYXJrL2JlbmNobWFyay5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3R5cGVkZWYgZW51bSB7CisgICAga1ZpZGVvLAorICAgIGtBdWRpbywKK30gTWVkaWFUeXBlOworCitjbGFzcyBUcmFja1RyYW5zY29kZXJDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjayB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tGb3JtYXRBdmFpbGFibGUoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja0ZpbmlzaGVkKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja1N0b3BwZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRXJyb3IoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvclRyYW5zY29kaW5nRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAoIW1GaW5pc2hlZCkgeworICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgbVN0YXR1cyA9IEFNRURJQV9PSzsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIGJvb2wgbUZpbmlzaGVkID0gZmFsc2U7Cit9OworCisvKioKKyAqIE1vY2tTYW1wbGVSZWFkZXIgaG9sZHMgYSByaW5nYnVmZmVyIG9mIHRoZSBmaXJzdCBzYW1wbGVzIGluIHRoZSBwcm92aWRlZCBzb3VyY2UgdHJhY2suIFNhbXBsZXMKKyAqIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIGZyb20gdGhlIHJpbmdidWZmZXIgaW4gYSByb3VuZC1yb2JpbiBmYXNoaW9uIHdpdGggaW5jcmVhc2luZworICogdGltZXN0YW1wcy4gVGhlIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJlZm9yZSBFT1MgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgc291cmNlCisgKiB0cmFjay4KKyAqLworY2xhc3MgTW9ja1NhbXBsZVJlYWRlciA6IHB1YmxpYyBNZWRpYVNhbXBsZVJlYWRlciB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gY3JlYXRlRnJvbUZkKGludCBmZCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHJldHVybiBudWxscHRyOworCisgICAgICAgIGF1dG8gc2FtcGxlUmVhZGVyID0gc3RkOjpzaGFyZWRfcHRyPE1vY2tTYW1wbGVSZWFkZXI+KG5ldyBNb2NrU2FtcGxlUmVhZGVyKGV4dHJhY3RvcikpOworICAgICAgICByZXR1cm4gc2FtcGxlUmVhZGVyOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogZ2V0RmlsZUZvcm1hdCgpIG92ZXJyaWRlIHsgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KG1FeHRyYWN0b3IpOyB9CisKKyAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1FeHRyYWN0b3IpOyB9CisKKyAgICBBTWVkaWFGb3JtYXQqIGdldFRyYWNrRm9ybWF0KGludCB0cmFja0luZGV4KSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID49IDApIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2tJbmRleDsKKworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSByZXR1cm4gc3RhdHVzOworCisgICAgICAgIC8vIEdldCB0aGUgc2FtcGxlIGNvdW50LgorICAgICAgICBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IGdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOworICAgICAgICBjb25zdCBib29sIGhhdmVTYW1wbGVDb3VudCA9CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCwgJm1TYW1wbGVDb3VudCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKworICAgICAgICBpZiAoIWhhdmVTYW1wbGVDb3VudCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gc2FtcGxlIGNvdW50IGluIHRyYWNrIGZvcm1hdC4iOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ1ZmZlciBzYW1wbGVzLgorICAgICAgICBjb25zdCBpbnQzMl90IHRhcmdldEJ1ZmZlckNvdW50ID0gNjA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJ1ZmZlcjsKKyAgICAgICAgTWVkaWFTYW1wbGVJbmZvIGluZm87CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbmZvLnByZXNlbnRhdGlvblRpbWVVcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworICAgICAgICAgICAgaW5mby5mbGFncyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIGluZm8uc2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKG1FeHRyYWN0b3IpOworCisgICAgICAgICAgICAvLyBGaW5pc2ggYnVmZmVyaW5nIGFmdGVyIGVpdGhlciByZWFkaW5nIGFsbCB0aGUgc2FtcGxlcyBpbiB0aGUgdHJhY2sgb3IgYWZ0ZXIKKyAgICAgICAgICAgIC8vIGNvbXBsZXRpbmcgdGhlIEdPUCBzYXRpc2Z5aW5nIHRoZSB0YXJnZXQgY291bnQuCisgICAgICAgICAgICBpZiAobVNhbXBsZXMuc2l6ZSgpID09IG1TYW1wbGVDb3VudCB8fAorICAgICAgICAgICAgICAgIChtU2FtcGxlcy5zaXplKCkgPj0gdGFyZ2V0QnVmZmVyQ291bnQgJiYgaW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX1NZTkNfU0FNUExFKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXIucmVzZXQobmV3IHVpbnQ4X3RbaW5mby5zaXplXSk7CisKKyAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKG1FeHRyYWN0b3IsIGJ1ZmZlci5nZXQoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGlmIChieXRlc1JlYWQgIT0gaW5mby5zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtU2FtcGxlcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGJ1ZmZlciksIGluZm8pOworCisgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtRXh0cmFjdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIG1GaXJzdFB0c1VzID0gbVNhbXBsZXNbMF0uc2Vjb25kLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgbVB0c0RpZmYgPSBtU2FtcGxlc1sxXS5zZWNvbmQucHJlc2VudGF0aW9uVGltZVVzIC0gbVNhbXBsZXNbMF0uc2Vjb25kLnByZXNlbnRhdGlvblRpbWVVczsKKworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKworICAgIG1lZGlhX3N0YXR1c190IHVuc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXggX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBzZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyhib29sIGVuZm9yY2UgX191bnVzZWQpIG92ZXJyaWRlIHsgcmV0dXJuIEFNRURJQV9PSzsgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKGludCB0cmFja0luZGV4IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBiaXRyYXRlIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0U2FtcGxlSW5mb0ZvclRyYWNrKGludCB0cmFja0luZGV4LCBNZWRpYVNhbXBsZUluZm8qIGluZm8pIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKHRyYWNrSW5kZXggIT0gbVNlbGVjdGVkVHJhY2spIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSB7CisgICAgICAgICAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSAwOworICAgICAgICAgICAgaW5mby0+c2l6ZSA9IDA7CisgICAgICAgICAgICBpbmZvLT5mbGFncyA9IFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKworICAgICAgICAqaW5mbyA9IG1TYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXggJSBtU2FtcGxlcy5zaXplKCldLnNlY29uZDsKKyAgICAgICAgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzID0gbUZpcnN0UHRzVXMgKyBtQ3VycmVudFNhbXBsZUluZGV4ICogbVB0c0RpZmY7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZFNhbXBsZURhdGFGb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKHRyYWNrSW5kZXggIT0gbVNlbGVjdGVkVHJhY2spIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbVNhbXBsZUNvdW50KSByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgYXV0byYgcCA9IG1TYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXggJSBtU2FtcGxlcy5zaXplKCldOworCisgICAgICAgIGlmIChidWZmZXJTaXplIDwgcC5zZWNvbmQuc2l6ZSkgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgcC5maXJzdC5nZXQoKSwgcC5zZWNvbmQuc2l6ZSk7CisKKyAgICAgICAgYWR2YW5jZVRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVRyYWNrKGludCB0cmFja0luZGV4KSB7CisgICAgICAgIGlmICh0cmFja0luZGV4ICE9IG1TZWxlY3RlZFRyYWNrKSByZXR1cm47CisgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5Nb2NrU2FtcGxlUmVhZGVyKCkgb3ZlcnJpZGUgeyBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKG1FeHRyYWN0b3IpOyB9CisKK3ByaXZhdGU6CisgICAgTW9ja1NhbXBsZVJlYWRlcihBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvcikgOiBtRXh0cmFjdG9yKGV4dHJhY3Rvcikge30KKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIGludDMyX3QgbVNhbXBsZUNvdW50ID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4sIE1lZGlhU2FtcGxlSW5mbz4+IG1TYW1wbGVzOworICAgIGludCBtU2VsZWN0ZWRUcmFjayA9IC0xOworICAgIGludDMyX3QgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CisgICAgaW50NjRfdCBtRmlyc3RQdHNVcyA9IDA7CisgICAgaW50NjRfdCBtUHRzRGlmZiA9IDA7Cit9OworCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gR2V0RGVmYXVsdFRyYWNrRm9ybWF0KE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogc291cmNlRm9ybWF0KSB7CisgICAgLy8gRGVmYXVsdCB2aWRlbyBjb25maWcuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWaWRlb0JpdFJhdGUgPSAyMCAqIDEwMDAgKiAxMDAwOyAgLy8gMjAgbWJwcworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga1ZpZGVvRnJhbWVSYXRlID0gMzAuMGY7ICAgICAgICAgICAgIC8vIDMwIGZwcworCisgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBudWxscHRyOworCisgICAgaWYgKG1lZGlhVHlwZSA9PSBrVmlkZW8pIHsKKyAgICAgICAgZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBTWVkaWFGb3JtYXRfY29weShmb3JtYXQsIHNvdXJjZUZvcm1hdCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBrVmlkZW9CaXRSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBrVmlkZW9GcmFtZVJhdGUpOworICAgIH0KKyAgICAvLyBub3RoaW5nIGZvciBhdWRpby4KKworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pihmb3JtYXQsICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKK30KKworLyoqIEdldHMgYSBNZWRpYVNhbXBsZVJlYWRlciBmb3IgdGhlIHNvdXJjZSBmaWxlICovCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBHZXRTYW1wbGVSZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbW9jaykgeworICAgIC8vIEFzc2V0IGRpcmVjdG9yeQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQXNzZXREaXJlY3RvcnkgPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nQmVuY2htYXJrLyI7CisKKyAgICBpbnQgc3JjRmQgPSAwOworICAgIHN0ZDo6c3RyaW5nIHNyY1BhdGggPSBrQXNzZXREaXJlY3RvcnkgKyBzcmNGaWxlTmFtZTsKKworICAgIGlmICgoc3JjRmQgPSBvcGVuKHNyY1BhdGguY19zdHIoKSwgT19SRE9OTFkpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgY29uc3Qgc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoc3JjRmQsIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhzcmNGZCwgMCwgU0VFS19TRVQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXI7CisKKyAgICBpZiAobW9jaykgeworICAgICAgICBzYW1wbGVSZWFkZXIgPSBNb2NrU2FtcGxlUmVhZGVyOjpjcmVhdGVGcm9tRmQoc3JjRmQsIDAgLyogb2Zmc2V0ICovLCBmaWxlU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChzcmNGZCwgMCAvKiBvZmZzZXQgKi8sIGZpbGVTaXplKTsKKyAgICB9CisKKyAgICBpZiAoc3JjRmQgPiAwKSBjbG9zZShzcmNGZCk7CisgICAgcmV0dXJuIHNhbXBsZVJlYWRlcjsKK30KKworLyoqCisgKiBDb25maWd1cmVzIGEgTWVkaWFUcmFja1RyYW5zY29kZXIgd2l0aCBhbiBlbXB0eSBzYW1wbGUgY29uc3VtZXIgc28gdGhhdCB0aGUgc2FtcGxlcyBhcmUgcmV0dXJuZWQKKyAqIHRvIHRoZSB0cmFuc2NvZGVyIGltbWVkaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBDb25maWd1cmVFbXB0eVNhbXBsZUNvbnN1bWVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2Rlcj4mIHRyYW5zY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGVDb3VudCkgeworICAgIHRyYW5zY29kZXItPnNldFNhbXBsZUNvbnN1bWVyKFsmc2FtcGxlQ291bnRdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSkgeworICAgICAgICBpZiAoIShzYW1wbGUtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19DT0RFQ19DT05GSUcpICYmIHNhbXBsZS0+aW5mby5zaXplID4gMCkgeworICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKKyAgICAgICAgfQorICAgIH0pOworfQorCisvKioKKyAqIENhbGxiYWNrIHRvIGVkaXQgdHJhY2sgZm9ybWF0IGZvciB0cmFuc2NvZGluZy4KKyAqIEBwYXJhbSBkc3RGb3JtYXQgVGhlIGRlZmF1bHQgdHJhY2sgZm9ybWF0IGZvciB0aGUgdHJhY2sgdHlwZS4KKyAqLwordXNpbmcgVHJhY2tGb3JtYXRFZGl0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpPjsKKworLyoqCisgKiBDb25maWd1cmVzIGEgTWVkaWFUcmFja1RyYW5zY29kZXIgd2l0aCB0aGUgcHJvdmlkZWQgTWVkaWFTYW1wbGVSZWFkZXIsIHJlYWRpbmcgZnJvbSB0aGUgZmlyc3QKKyAqIHRyYWNrIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG1lZGlhIHR5cGUuCisgKi8KK3N0YXRpYyBib29sIENvbmZpZ3VyZVNhbXBsZVJlYWRlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFja1RyYW5zY29kZXI+JiB0cmFuc2NvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4mIHNhbXBsZVJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrJiBmb3JtYXRFZGl0b3IpIHsKKyAgICBpbnQgc3JjVHJhY2tJbmRleCA9IC0xOworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IHNyY1RyYWNrRm9ybWF0ID0gbnVsbHB0cjsKKworICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgc2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7ICsrdHJhY2tJbmRleCkgeworICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gc2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKworICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisKKyAgICAgICAgaWYgKChtZWRpYVR5cGUgPT0ga1ZpZGVvICYmIHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHx8CisgICAgICAgICAgICAobWVkaWFUeXBlID09IGtBdWRpbyAmJiBzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSA9PSAwKSkgeworICAgICAgICAgICAgc3JjVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgICBzcmNUcmFja0Zvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKKyAgICB9CisKKyAgICBpZiAoc3JjVHJhY2tJbmRleCA9PSAtMSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJObyBtYXRjaGluZyBzb3VyY2UgdHJhY2sgZm91bmQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gc2FtcGxlUmVhZGVyLT5zZWxlY3RUcmFjayhzcmNUcmFja0luZGV4KTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc2VsZWN0IHRyYWNrIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGF1dG8gZGVzdGluYXRpb25Gb3JtYXQgPSBHZXREZWZhdWx0VHJhY2tGb3JtYXQobWVkaWFUeXBlLCBzcmNUcmFja0Zvcm1hdC5nZXQoKSk7CisgICAgaWYgKGZvcm1hdEVkaXRvciAhPSBudWxscHRyKSB7CisgICAgICAgIGZvcm1hdEVkaXRvcihkZXN0aW5hdGlvbkZvcm1hdC5nZXQoKSk7CisgICAgfQorICAgIHN0YXR1cyA9IHRyYW5zY29kZXItPmNvbmZpZ3VyZShzYW1wbGVSZWFkZXIsIHNyY1RyYWNrSW5kZXgsIGRlc3RpbmF0aW9uRm9ybWF0KTsKKyAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJ0cmFuc2NvZGVyIGNvbmZpZ3VyZSByZXR1cm5lZCAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBCZW5jaG1hcmtUcmFuc2NvZGVyKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3JjRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbW9ja1JlYWRlciwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJhY2tGb3JtYXRFZGl0Q2FsbGJhY2smIGZvcm1hdEVkaXRvciA9IG51bGxwdHIpIHsKKyAgICBzdGF0aWMgcHRocmVhZF9vbmNlX3Qgb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworICAgIHB0aHJlYWRfb25jZSgmb25jZSwgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKTsKKworICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRyYWNrVHJhbnNjb2RlckNhbGxiYWNrcz4gY2FsbGJhY2tzID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWNrVHJhbnNjb2RlckNhbGxiYWNrcz4oKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyPiB0cmFuc2NvZGVyOworCisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0ga1ZpZGVvKSB7CisgICAgICAgICAgICB0cmFuc2NvZGVyID0gVmlkZW9UcmFja1RyYW5zY29kZXI6OmNyZWF0ZShjYWxsYmFja3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJhbnNjb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI+KGNhbGxiYWNrcyk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IHNhbXBsZVJlYWRlciA9IEdldFNhbXBsZVJlYWRlcihzcmNGaWxlTmFtZSwgbW9ja1JlYWRlcik7CisgICAgICAgIGlmIChzYW1wbGVSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBzYW1wbGUgcmVhZGVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUNvbmZpZ3VyZVNhbXBsZVJlYWRlcih0cmFuc2NvZGVyLCBzYW1wbGVSZWFkZXIsIG1lZGlhVHlwZSwgZm9ybWF0RWRpdG9yKSkgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNjb2RlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSAwOworICAgICAgICBDb25maWd1cmVFbXB0eVNhbXBsZUNvbnN1bWVyKHRyYW5zY29kZXIsIHNhbXBsZUNvdW50KTsKKworICAgICAgICBpZiAoIXRyYW5zY29kZXItPnN0YXJ0KCkpIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBzdGFydCB0aGUgdHJhbnNjb2RlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpOworICAgICAgICB0cmFuc2NvZGVyLT5zdG9wKCk7CisKKyAgICAgICAgaWYgKGNhbGxiYWNrcy0+bVN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlRyYW5zY29kZXIgZmFpbGVkIHdpdGggZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExPRyhERUJVRykgPDwgIk51bWJlciBvZiBzYW1wbGVzIHJlY2VpdmVkOiAiIDw8IHNhbXBsZUNvdW50OworICAgICAgICBzdGF0ZS5jb3VudGVyc1siRnJhbWVSYXRlIl0gPSBiZW5jaG1hcms6OkNvdW50ZXIoc2FtcGxlQ291bnQsIGJlbmNobWFyazo6Q291bnRlcjo6a0lzUmF0ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBCZW5jaG1hcmtUcmFuc2NvZGVyV2l0aE9wZXJhdGluZ1JhdGUoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGUsIGJvb2wgbW9ja1JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgVHJhY2tGb3JtYXRFZGl0Q2FsbGJhY2sgZWRpdG9yOworICAgIGNvbnN0IGludDMyX3Qgb3BlcmF0aW5nUmF0ZSA9IHN0YXRlLnJhbmdlKDApOworICAgIGNvbnN0IGludDMyX3QgcHJpb3JpdHkgPSBzdGF0ZS5yYW5nZSgxKTsKKworICAgIGlmIChvcGVyYXRpbmdSYXRlID49IDAgJiYgcHJpb3JpdHkgPj0gMCkgeworICAgICAgICBlZGl0b3IgPSBbb3BlcmF0aW5nUmF0ZSwgcHJpb3JpdHldKEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLCBvcGVyYXRpbmdSYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFksIHByaW9yaXR5KTsKKyAgICAgICAgfTsKKyAgICB9CisgICAgQmVuY2htYXJrVHJhbnNjb2RlcihzdGF0ZSwgc3JjRmlsZSwgbW9ja1JlYWRlciwgbWVkaWFUeXBlLCBlZGl0b3IpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFWQyB0byBBVkMgQmVuY2htYXJrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEJNX1ZpZGVvVHJhbnNjb2RlX0FWQzJBVkMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNGaWxlID0gInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjLm1wNCI7CisgICAgQmVuY2htYXJrVHJhbnNjb2RlcldpdGhPcGVyYXRpbmdSYXRlKHN0YXRlLCBzcmNGaWxlLCBmYWxzZSAvKiBtb2NrUmVhZGVyICovLCBrVmlkZW8pOworfQorCitzdGF0aWMgdm9pZCBCTV9WaWRlb1RyYW5zY29kZV9BVkMyQVZDX05vRXh0cmFjdG9yKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciogc3JjRmlsZSA9ICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX2FhYy5tcDQiOworICAgIEJlbmNobWFya1RyYW5zY29kZXJXaXRoT3BlcmF0aW5nUmF0ZShzdGF0ZSwgc3JjRmlsZSwgdHJ1ZSAvKiBtb2NrUmVhZGVyICovLCBrVmlkZW8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhFVkMgdG8gQVZDIEJlbmNobWFya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEJNX1ZpZGVvVHJhbnNjb2RlX0hFVkMyQVZDKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgY29uc3QgY2hhciogc3JjRmlsZSA9ICJ2aWRlb18xOTIweDEwODBfMzg2M2ZyYW1lX2hldmNfNE1icHNfMzBmcHNfYWFjLm1wNCI7CisgICAgQmVuY2htYXJrVHJhbnNjb2RlcldpdGhPcGVyYXRpbmdSYXRlKHN0YXRlLCBzcmNGaWxlLCBmYWxzZSAvKiBtb2NrUmVhZGVyICovLCBrVmlkZW8pOworfQorCitzdGF0aWMgdm9pZCBCTV9WaWRlb1RyYW5zY29kZV9IRVZDMkFWQ19Ob0V4dHJhY3RvcihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY0ZpbGUgPSAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX2FhYy5tcDQiOworICAgIEJlbmNobWFya1RyYW5zY29kZXJXaXRoT3BlcmF0aW5nUmF0ZShzdGF0ZSwgc3JjRmlsZSwgdHJ1ZSAvKiBtb2NrUmVhZGVyICovLCBrVmlkZW8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlbmNobWFyayBSZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJlbmNobWFyayByZWdpc3RyYXRpb24gd3JhcHBlciBmb3IgdHJhbnNjb2RpbmcuCisjZGVmaW5lIFRSQU5TQ09ERVJfQkVOQ0hNQVJLKGZ1bmMpIFwKKyAgICBCRU5DSE1BUksoZnVuYyktPlVzZVJlYWxUaW1lKCktPk1lYXN1cmVQcm9jZXNzQ1BVVGltZSgpLT5Vbml0KGJlbmNobWFyazo6a01pbGxpc2Vjb25kKQorCisvLyBCZW5jaG1hcmsgcmVnaXN0cmF0aW9uIGZvciB0ZXN0aW5nIGRpZmZlcmVudCBvcGVyYXRpbmcgcmF0ZSBhbmQgcHJpb3JpdHkgY29tYmluYXRpb25zLgorI2RlZmluZSBUUkFOU0NPREVSX09QRVJBVElOR19SQVRFX0JFTkNITUFSSyhmdW5jKSAgXAorICAgIFRSQU5TQ09ERVJfQkVOQ0hNQVJLKGZ1bmMpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLT5BcmdzKHstMSwgLTF9KSAvKiA8LS0gVXNlIGRlZmF1bHQgKi8gXAorICAgICAgICAgICAgLT5BcmdzKHsyNDAsIDB9KSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLT5BcmdzKHtJTlQzMl9NQVgsIDB9KSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLT5BcmdzKHsyNDAsIDF9KSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLT5BcmdzKHtJTlQzMl9NQVgsIDF9KQorCitUUkFOU0NPREVSX09QRVJBVElOR19SQVRFX0JFTkNITUFSSyhCTV9WaWRlb1RyYW5zY29kZV9BVkMyQVZDKTsKK1RSQU5TQ09ERVJfT1BFUkFUSU5HX1JBVEVfQkVOQ0hNQVJLKEJNX1ZpZGVvVHJhbnNjb2RlX0FWQzJBVkNfTm9FeHRyYWN0b3IpOworCitUUkFOU0NPREVSX09QRVJBVElOR19SQVRFX0JFTkNITUFSSyhCTV9WaWRlb1RyYW5zY29kZV9IRVZDMkFWQyk7CitUUkFOU0NPREVSX09QRVJBVElOR19SQVRFX0JFTkNITUFSSyhCTV9WaWRlb1RyYW5zY29kZV9IRVZDMkFWQ19Ob0V4dHJhY3Rvcik7CisKK0JFTkNITUFSS19NQUlOKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhVHJhbnNjb2RlckJlbmNobWFyay5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvYmVuY2htYXJrL01lZGlhVHJhbnNjb2RlckJlbmNobWFyay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YWQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9iZW5jaG1hcmsvTWVkaWFUcmFuc2NvZGVyQmVuY2htYXJrLmNwcApAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogTmF0aXZlIG1lZGlhIHRyYW5zY29kZXIgbGlicmFyeSBiZW5jaG1hcmsgdGVzdHMuCisgKgorICogSG93IHRvIHJ1biB0aGUgYmVuY2htYXJrOgorICoKKyAqIDEuIERvd25sb2FkIHRoZSBtZWRpYSBhc3NldHMgZnJvbSBodHRwOi8vZ28vdHJhbnNjb2RpbmdiZW5jaG1hcmsgYW5kIHB1c2ggdGhlIGRpcmVjdG9yeQorICogICAgKCJUcmFuc2NvZGluZ0JlbmNobWFyayIpIHRvIC9kYXRhL2xvY2FsL3RtcC4KKyAqCisgKiAyLiBDb21waWxlIHRoZSBiZW5jaG1hcmsgYW5kIHN5bmMgdG8gZGV2aWNlOgorICogICAgICAkIG1tIC1qNzIgJiYgYWRiIHN5bmMKKyAqCisgKiAzLiBSdW46CisgKiAgICAgICQgYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVRyYW5zY29kZXJCZW5jaG1hcmsvTWVkaWFUcmFuc2NvZGVyQmVuY2htYXJrCisgKi8KKworI2luY2x1ZGUgPGJlbmNobWFyay9iZW5jaG1hcmsuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3Qgc3RkOjpzdHJpbmcgUEFSQU1fVklERU9fRlJBTUVfUkFURSA9ICJWaWRlb0ZyYW1lUmF0ZSI7CisKK2NsYXNzIFRyYW5zY29kZXJDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyb3IpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1TdGF0dXMgPSBlcnJvcjsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICBib29sIHdhaXRGb3JUcmFuc2NvZGluZ0ZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIGlmIChtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaW51dGVzKDUpKSA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCBtU3RhdHVzID0gQU1FRElBX09LOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtRmluaXNoZWQgPSBmYWxzZTsKK307CisKK3N0YXRpYyBBTWVkaWFGb3JtYXQqIENyZWF0ZURlZmF1bHRWaWRlb0Zvcm1hdCgpIHsKKyAgICAvLyBEZWZhdWx0IGJpdHJhdGUKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZpZGVvQml0UmF0ZSA9IDIwICogMTAwMCAqIDEwMDA7ICAvLyAyME1icworCisgICAgQU1lZGlhRm9ybWF0KiB2aWRlb0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodmlkZW9Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGtWaWRlb0JpdFJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcodmlkZW9Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgcmV0dXJuIHZpZGVvRm9ybWF0OworfQorCisvKioKKyAqIENhbGxiYWNrIHRvIGNvbmZpZ3VyZSB0cmFja3MgZm9yIHRyYW5zY29kaW5nLgorICogQHBhcmFtIG1pbWUgVGhlIHNvdXJjZSB0cmFjayBtaW1lIHR5cGUuCisgKiBAcGFyYW0gZHN0Rm9ybWF0IFRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaWYgdGhlIHRyYWNrIHNob3VsZCBiZSB0cmFuc2NvZGVkIG9yIG51bGxwdHIgaWYgdGhlIHRyYWNrCisgKiBzaG91bGQgYmUgcGFzc2VkIHRocm91Z2guCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYWNrIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCisgKi8KK3VzaW5nIFRyYWNrU2VsZWN0aW9uQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgY2hhciogbWltZSwgQU1lZGlhRm9ybWF0KiogZHN0Rm9ybWF0KT47CisKK3N0YXRpYyB2b2lkIFRyYW5zY29kZU1lZGlhRmlsZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNyY0ZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja1NlbGVjdGlvbkNhbGxiYWNrIHRyYWNrU2VsZWN0aW9uQ2FsbGJhY2spIHsKKyAgICAvLyBXcml0ZS1vbmx5LCBjcmVhdGUgZmlsZSBpZiBub24tZXhpc3RlbnQuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0RzdE9wZW5GbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVDsKKyAgICAvLyBVc2VyIFIrVyBwZXJtaXNzaW9uLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtEc3RGaWxlTW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOworICAgIC8vIEFzc2V0IGRpcmVjdG9yeQorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrQXNzZXREaXJlY3RvcnkgPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nQmVuY2htYXJrLyI7CisKKyAgICAvLyBUcmFuc2NvZGluZyBjb25maWd1cmF0aW9uIHBhcmFtcyB0byBiZSBsb2dnZWQKKyAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb25VcyA9IDA7CisgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZU1pbWUgPSAiTkEiOworICAgIHN0ZDo6c3RyaW5nIHRhcmdldE1pbWUgPSAiTkEiOworICAgIGJvb2wgaW5jbHVkZUF1ZGlvID0gZmFsc2U7CisgICAgYm9vbCB0cmFuc2NvZGVWaWRlbyA9IGZhbHNlOworICAgIGludDMyX3QgdGFyZ2V0Qml0cmF0ZSA9IDA7CisKKyAgICBpbnQgc3JjRmQgPSAwOworICAgIGludCBkc3RGZCA9IDA7CisKKyAgICBzdGQ6OnN0cmluZyBzcmNQYXRoID0ga0Fzc2V0RGlyZWN0b3J5ICsgc3JjRmlsZU5hbWU7CisgICAgc3RkOjpzdHJpbmcgZHN0UGF0aCA9IGtBc3NldERpcmVjdG9yeSArIGRzdEZpbGVOYW1lOworCisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1FRElBX09LOworCisgICAgaWYgKChzcmNGZCA9IG9wZW4oc3JjUGF0aC5jX3N0cigpLCBPX1JET05MWSkpIDwgMCkgeworICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJVbmFibGUgdG8gb3BlbiBzb3VyY2UgZmlsZSIpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGlmICgoZHN0RmQgPSBvcGVuKGRzdFBhdGguY19zdHIoKSwga0RzdE9wZW5GbGFncywga0RzdEZpbGVNb2RlKSkgPCAwKSB7CisgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBvcGVuIGRlc3RpbmF0aW9uIGZpbGUiKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGZvciAoYXV0byBfIDogc3RhdGUpIHsKKyAgICAgICAgYXV0byBjYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgICAgIGF1dG8gdHJhbnNjb2RlciA9IE1lZGlhVHJhbnNjb2Rlcjo6Y3JlYXRlKGNhbGxiYWNrcyk7CisKKyAgICAgICAgc3RhdHVzID0gdHJhbnNjb2Rlci0+Y29uZmlndXJlU291cmNlKHNyY0ZkKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjb25maWd1cmUgdHJhbnNjb2RlciBzb3VyY2UiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHRyYW5zY29kZXItPmNvbmZpZ3VyZURlc3RpbmF0aW9uKGRzdEZkKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjb25maWd1cmUgdHJhbnNjb2RlciBkZXN0aW5hdGlvbiIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IHRyYWNrRm9ybWF0cyA9IHRyYW5zY29kZXItPmdldFRyYWNrRm9ybWF0cygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBzcmNGb3JtYXQgPSB0cmFja0Zvcm1hdHNbaV0uZ2V0KCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJTb3VyY2UgdHJhY2sgZm9ybWF0IGRvZXMgbm90IGhhdmUgTUlNRSB0eXBlIik7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCwgJmZyYW1lQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmNvdW50ZXJzW1BBUkFNX1ZJREVPX0ZSQU1FX1JBVEVdID0gYmVuY2htYXJrOjpDb3VudGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGJlbmNobWFyazo6Q291bnRlcjo6a0lzSXRlcmF0aW9uSW52YXJpYW50UmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJWaWRlbyBzb3VyY2UgdHJhY2sgZm9ybWF0IGRvZXMgbm90IGhhdmUgd2lkdGgiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihzcmNGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5Ta2lwV2l0aEVycm9yKCJWaWRlbyBzb3VyY2UgdHJhY2sgZm9ybWF0IGRvZXMgbm90IGhhdmUgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHNyY0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJnRyYWNrRHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgc291cmNlTWltZSA9IG1pbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0cmFja1NlbGVjdGlvbkNhbGxiYWNrKG1pbWUsICZkc3RGb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdHJhbnNjb2Rlci0+Y29uZmlndXJlVHJhY2tGb3JtYXQoaSwgZHN0Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMCAmJiBkc3RGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZHN0Rm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWltZSA9IG1pbWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGRzdEZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJnRhcmdldEJpdHJhdGUpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2NvZGVWaWRlbyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBdWRpbyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZHN0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRzdEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlVuYWJsZSB0byBjb25maWd1cmUgdHJhY2siKTsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5zdGFydCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RhdGUuU2tpcFdpdGhFcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHRyYW5zY29kZXIiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpKSB7CisgICAgICAgICAgICB0cmFuc2NvZGVyLT5jYW5jZWwoKTsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlRyYW5zY29kZXIgdGltZWQgb3V0Iik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbGxiYWNrcy0+bVN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIHN0YXRlLlNraXBXaXRoRXJyb3IoIlRyYW5zY29kZXIgZXJyb3Igd2hlbiBydW5uaW5nIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdHJhbnNjb2RpbmcgY29uZmlndXJhdGlvbiBwYXJhbXMgaW4gYmVuY2htYXJrIGxhYmVsCisgICAgc3RhdGUuU2V0TGFiZWwoc3JjRmlsZU5hbWUgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHdpZHRoKSArICJ4IiArIHN0ZDo6dG9fc3RyaW5nKGhlaWdodCkgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIHNvdXJjZU1pbWUgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHRyYWNrRHVyYXRpb25Vcy8xMDAwKSArICIsIiArCisgICAgICAgICAgICAgICAgICAgKGluY2x1ZGVBdWRpbyA/ICJZZXMiIDogIk5vIikgKyAiLCIgKworICAgICAgICAgICAgICAgICAgICh0cmFuc2NvZGVWaWRlbyA/ICJZZXMiIDogIk5vIikgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIHRhcmdldE1pbWUgKyAiLCIgKworICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHRhcmdldEJpdHJhdGUpCisgICAgICAgICAgICAgICAgICAgKTsKKworZXhpdDoKKyAgICBpZiAoc3JjRmQgPiAwKSBjbG9zZShzcmNGZCk7CisgICAgaWYgKGRzdEZkID4gMCkgY2xvc2UoZHN0RmQpOworfQorCisvKioKKyAqIENhbGxiYWNrIHRvIGVkaXQgdHJhY2sgZm9ybWF0IGZvciB0cmFuc2NvZGluZy4KKyAqIEBwYXJhbSBkc3RGb3JtYXQgVGhlIGRlZmF1bHQgdHJhY2sgZm9ybWF0IGZvciB0aGUgdHJhY2sgdHlwZS4KKyAqLwordXNpbmcgVHJhY2tGb3JtYXRFZGl0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpPjsKKworc3RhdGljIHZvaWQgVHJhbnNjb2RlTWVkaWFGaWxlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3JjRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRzdEZpbGVOYW1lLCBib29sIGluY2x1ZGVBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyYW5zY29kZVZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYWNrRm9ybWF0RWRpdENhbGxiYWNrJiB2aWRlb0Zvcm1hdEVkaXRvciA9IG51bGxwdHIpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsIHNyY0ZpbGVOYW1lLCBkc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgWz1dKGNvbnN0IGNoYXIqIG1pbWUsIEFNZWRpYUZvcm1hdCoqIGRzdEZvcm1hdE91dCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqZHN0Rm9ybWF0T3V0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwICYmIHRyYW5zY29kZVZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRzdEZvcm1hdE91dCA9IENyZWF0ZURlZmF1bHRWaWRlb0Zvcm1hdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb0Zvcm1hdEVkaXRvciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRm9ybWF0RWRpdG9yKCpkc3RGb3JtYXRPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikgPT0gMCAmJiAhaW5jbHVkZUF1ZGlvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBTZXRNYXhPcGVyYXRpbmdSYXRlKEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgSU5UMzJfTUFYKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCAxKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBVkMgdG8gQVZDIEJlbmNobWFya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjQXVkaW9WaWRlbzJBdWRpb1ZpZGVvKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjVmlkZW8yVmlkZW8oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xOTIweDEwODBfMzY0OGZyYW1lX2gyNjRfMjJNYnBzXzMwZnBzX3RyYW5zY29kZWRfVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjQVYyQVZNYXhPcGVyYXRpbmdSYXRlKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjVjJWTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfdHJhbnNjb2RlZF9WLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywgU2V0TWF4T3BlcmF0aW5nUmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUF2YzJBdmNBVjJBVjcyMFAoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ2aWRlb18xMjgweDcyMF8zNjQ4ZnJhbWVfaDI2NF8xNk1icHNfMzBmcHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF8zNjQ4ZnJhbWVfaDI2NF8xNk1icHNfMzBmcHNfYWFjX3RyYW5zY29kZWRfQVYubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVBdmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzEyODB4NzIwXzM2NDhmcmFtZV9oMjY0XzE2TWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzEyODB4NzIwXzM2NDhmcmFtZV9oMjY0XzE2TWJwc18zMGZwc19hYWNfdHJhbnNjb2RlZF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywgU2V0TWF4T3BlcmF0aW5nUmF0ZSk7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhFVkMgdG8gQVZDIEJlbmNobWFya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUhldmMyQXZjQXVkaW9WaWRlbzJBdWRpb1ZpZGVvKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX2FhYy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX2FhY190cmFuc2NvZGVkX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlSGV2YzJBdmNWaWRlbzJWaWRlbyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX3RyYW5zY29kZWRfVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVIZXZjMkF2Y0FWMkFWTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwc19hYWNfdHJhbnNjb2RlZF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywgU2V0TWF4T3BlcmF0aW5nUmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUhldmMyQXZjVjJWTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzE5MjB4MTA4MF8zODYzZnJhbWVfaGV2Y180TWJwc18zMGZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwXzM4NjNmcmFtZV9oZXZjXzRNYnBzXzMwZnBzX3RyYW5zY29kZWRfVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sIFNldE1heE9wZXJhdGluZ1JhdGUpOworfQorCitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVIZXZjMkF2Y0FWMkFWNzIwUChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzEyODB4NzIwXzM4NjNmcmFtZV9oZXZjXzE2TWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzEyODB4NzIwXzM4NjNmcmFtZV9oZXZjXzE2TWJwc18zMGZwc19hYWNfdHJhbnNjb2RlZF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKK3N0YXRpYyB2b2lkIEJNX1RyYW5zY29kZUhldmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZShiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInZpZGVvXzEyODB4NzIwXzM4NjNmcmFtZV9oZXZjXzE2TWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzEyODB4NzIwXzM4NjNmcmFtZV9oZXZjXzE2TWJwc18zMGZwc19hYWNfdHJhbnNjb2RlZF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywgU2V0TWF4T3BlcmF0aW5nUmF0ZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFzc3Rocm91Z2ggQmVuY2htYXJrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQk1fVHJhbnNjb2RlQXVkaW9WaWRlb1Bhc3N0aHJvdWdoKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzE5MjB4MTA4MF8zNjQ4ZnJhbWVfaDI2NF8yMk1icHNfMzBmcHNfYWFjX3Bhc3N0aHJvdWdoX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCBmYWxzZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CitzdGF0aWMgdm9pZCBCTV9UcmFuc2NvZGVWaWRlb1Bhc3N0aHJvdWdoKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwXzM2NDhmcmFtZV9oMjY0XzIyTWJwc18zMGZwc19wYXNzdGhyb3VnaF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIGZhbHNlIC8qIHRyYW5zY29kZVZpZGVvICovKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvZGVjcywgUmVzb2x1dGlvbnMsIEJpdHJhdGUgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgU2V0TWltZUJpdHJhdGUoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIHN0ZDo6c3RyaW5nIG1pbWUsIGludDMyX3QgYml0cmF0ZSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWUuY19zdHIoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgYml0cmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9BdmMyMk1icHMyQXZjMTJNYnBzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidHhfYm1fMTkyMF8xMDgwXzMwZnBzX2gyNjRfMjJNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8yMk1icHNfdHJhbnNjb2RlZF9oMjY0XzEyTWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2F2YyIsIGJpdHJhdGUgPSAxMjAwMDAwMF0oQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE1pbWVCaXRyYXRlKGRzdEZvcm1hdCwgbWltZSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBCTV8xOTIweDEwODBfQXZjMTVNYnBzMkF2YzhNYnBzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidHhfYm1fMTkyMF8xMDgwXzMwZnBzX2gyNjRfMTVNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfdHJhbnNjb2RlZF9oMjY0XzhNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgW21pbWUgPSAidmlkZW8vYXZjIiwgYml0cmF0ZSA9IDgwMDAwMDBdKEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRNaW1lQml0cmF0ZShkc3RGb3JtYXQsIG1pbWUsIGJpdHJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICB9KTsKK30KKworc3RhdGljIHZvaWQgQk1fMTkyMHgxMDgwX0F2YzE1TWJwczJBdmNQYXNzdGhyb3VnaChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInR4X2JtXzE5MjBfMTA4MF8zMGZwc19oMjY0XzE1TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidHhfYm1fMTkyMF8xMDgwXzMwZnBzX2gyNjRfMTVNYnBzX3Bhc3N0aHJvdWdoX1YubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCBmYWxzZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjOE1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjX3RyYW5zY29kZWRfaDI2NF84TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2F2YyIsIGJpdHJhdGUgPSA4MDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjOE1icHNBYWMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjX3RyYW5zY29kZWRfaDI2NF84TWJwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2F2YyIsIGJpdHJhdGUgPSA4MDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjUGFzc3Rocm91Z2goYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjX3Bhc3N0aHJvdWdoX1YubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCBmYWxzZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjQWFjUGFzc3Rocm91Z2goYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaDI2NF8xNU1icHNfYWFjX3Bhc3N0aHJvdWdoX0FWLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCBmYWxzZSAvKiB0cmFuc2NvZGVWaWRlbyAqLyk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF9IZXZjMTdNYnBzMkhldmM4TWJwcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInR4X2JtXzE5MjBfMTA4MF8zMGZwc19oZXZjXzE3TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidHhfYm1fMTkyMF8xMDgwXzMwZnBzX2hldmNfMTdNYnBzX3RyYW5zY29kZWRfaGV2Y184TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2hldmMiLCBiaXRyYXRlID0gODAwMDAwMF0oQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE1pbWVCaXRyYXRlKGRzdEZvcm1hdCwgbWltZSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBCTV8xOTIweDEwODBfSGV2YzE3TWJwczJBdmMxMk1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xOTIwXzEwODBfMzBmcHNfaGV2Y18xN01icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzE5MjBfMTA4MF8zMGZwc19oZXZjXzE3TWJwc190cmFuc2NvZGVkX2gyNjRfMTJNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgW21pbWUgPSAidmlkZW8vYXZjIiwgYml0cmF0ZSA9IDEyMDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzE5MjB4MTA4MF82MGZwc19IZXZjMjhNYnBzMkF2YzE1TWJwcyhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInR4X2JtXzE5MjBfMTA4MF82MGZwc19oZXZjXzI4TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidHhfYm1fMTkyMF8xMDgwXzYwZnBzX2hldmNfMjhNYnBzX3RyYW5zY29kZWRfaDI2NF8xNU1icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLAorICAgICAgICAgICAgICAgICAgICAgICBbbWltZSA9ICJ2aWRlby9hdmMiLCBiaXRyYXRlID0gMTUwMDAwMDBdKEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRNaW1lQml0cmF0ZShkc3RGb3JtYXQsIG1pbWUsIGJpdHJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICB9KTsKK30KKworc3RhdGljIHZvaWQgQk1fMTI4MHg3MjBfQXZjMTBNYnBzMkF2YzRNYnBzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidHhfYm1fMTI4MF83MjBfMzBmcHNfaDI2NF8xME1icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzX3RyYW5zY29kZWRfaDI2NF80TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2F2YyIsIGJpdHJhdGUgPSA0MDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzEyODB4NzIwX0F2YzEwTWJwczJBdmNQYXNzdGhyb3VnaChiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIFRyYW5zY29kZU1lZGlhRmlsZShzdGF0ZSwgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oMjY0XzEwTWJwc19wYXNzdGhyb3VnaF9WLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgZmFsc2UgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV8xMjgweDcyMF9BdmMxME1icHNBYWMyQXZjNE1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oMjY0XzEwTWJwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzX2FhY190cmFuc2NvZGVkX2gyNjRfNE1icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLAorICAgICAgICAgICAgICAgICAgICAgICBbbWltZSA9ICJ2aWRlby9hdmMiLCBiaXRyYXRlID0gNDAwMDAwMF0oQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE1pbWVCaXRyYXRlKGRzdEZvcm1hdCwgbWltZSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBCTV8xMjgweDcyMF9BdmMxME1icHNBYWMyQXZjNE1icHNBYWMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oMjY0XzEwTWJwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzX2FhY190cmFuc2NvZGVkX2gyNjRfNE1icHNfYWFjLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLAorICAgICAgICAgICAgICAgICAgICAgICBbbWltZSA9ICJ2aWRlby9hdmMiLCBiaXRyYXRlID0gNDAwMDAwMF0oQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE1pbWVCaXRyYXRlKGRzdEZvcm1hdCwgbWltZSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBCTV8xMjgweDcyMF9BdmMxME1icHNBYWMyQXZjUGFzc3Rocm91Z2goYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oMjY0XzEwTWJwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzX2FhY19wYXNzdGhyb3VnaF9WLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgZmFsc2UgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV8xMjgweDcyMF9BdmMxME1icHNBYWMyQXZjQWFjUGFzc3Rocm91Z2goYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oMjY0XzEwTWJwc19hYWMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEyODBfNzIwXzMwZnBzX2gyNjRfMTBNYnBzX2FhY19wYXNzdGhyb3VnaF9BVi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGluY2x1ZGVBdWRpbyAqLywgZmFsc2UgLyogdHJhbnNjb2RlVmlkZW8gKi8pOworfQorCitzdGF0aWMgdm9pZCBCTV8xMjgweDcyMF9IZXZjOE1icHMyQXZjNE1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oZXZjXzhNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8xMjgwXzcyMF8zMGZwc19oZXZjXzhNYnBzX3RyYW5zY29kZWRfaDI2NF80TWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbmNsdWRlQXVkaW8gKi8sIHRydWUgLyogdHJhbnNjb2RlVmlkZW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgIFttaW1lID0gInZpZGVvL2F2YyIsIGJpdHJhdGUgPSA0MDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXRpYyB2b2lkIEJNXzEwODB4MTkyMF9BdmMxNU1icHMyQXZjOE1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV8xMDgwXzE5MjBfMzBmcHNfaDI2NF8xNU1icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgInR4X2JtXzEwODBfMTkyMF8zMGZwc19oMjY0XzE1TWJwc190cmFuc2NvZGVkX2gyNjRfOE1icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaW5jbHVkZUF1ZGlvICovLCB0cnVlIC8qIHRyYW5zY29kZVZpZGVvICovLAorICAgICAgICAgICAgICAgICAgICAgICBbbWltZSA9ICJ2aWRlby9hdmMiLCBiaXRyYXRlID0gODAwMDAwMF0oQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldE1pbWVCaXRyYXRlKGRzdEZvcm1hdCwgbWltZSwgYml0cmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCitzdGF0aWMgdm9pZCBCTV83MjB4MTI4MF9BdmMxME1icHMyQXZjNE1icHMoYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBUcmFuc2NvZGVNZWRpYUZpbGUoc3RhdGUsICJ0eF9ibV83MjBfMTI4MF8zMGZwc19oMjY0XzEwTWJwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAidHhfYm1fNzIwXzEyODBfMzBmcHNfaDI2NF8xME1icHNfdHJhbnNjb2RlZF9oMjY0XzRNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgW21pbWUgPSAidmlkZW8vYXZjIiwgYml0cmF0ZSA9IDQwMDAwMDBdKEFNZWRpYUZvcm1hdCogZHN0Rm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRNaW1lQml0cmF0ZShkc3RGb3JtYXQsIG1pbWUsIGJpdHJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICB9KTsKK30KKworc3RhdGljIHZvaWQgQk1fMzg0MHgyMTYwX0hldmM0Mk1icHMyQXZjMjBNYnBzKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgVHJhbnNjb2RlTWVkaWFGaWxlKHN0YXRlLCAidHhfYm1fMzg0MF8yMTYwXzMwZnBzX2hldmNfNDJNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICJ0eF9ibV8zODQwXzIxNjBfMzBmcHNfaGV2Y180Mk1icHNfdHJhbnNjb2RlZF9oMjY0XzRNYnBzLm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGluY2x1ZGVBdWRpbyAqLywgdHJ1ZSAvKiB0cmFuc2NvZGVWaWRlbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgW21pbWUgPSAidmlkZW8vYXZjIiwgYml0cmF0ZSA9IDIwMDAwMDAwXShBTWVkaWFGb3JtYXQqIGRzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TWltZUJpdHJhdGUoZHN0Rm9ybWF0LCBtaW1lLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVuY2htYXJrIFJlZ2lzdHJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQmVuY2htYXJrIHJlZ2lzdHJhdGlvbiB3cmFwcGVyIGZvciB0cmFuc2NvZGluZy4KKyNkZWZpbmUgVFJBTlNDT0RFUl9CRU5DSE1BUksoZnVuYykgXAorICAgIEJFTkNITUFSSyhmdW5jKS0+VXNlUmVhbFRpbWUoKS0+TWVhc3VyZVByb2Nlc3NDUFVUaW1lKCktPlVuaXQoYmVuY2htYXJrOjprTWlsbGlzZWNvbmQpCisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF2YzJBdmNBdWRpb1ZpZGVvMkF1ZGlvVmlkZW8pOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y1ZpZGVvMlZpZGVvKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF2YzJBdmNBVjJBVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y1YyVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlQXZjMkF2Y0FWMkFWNzIwUCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV9UcmFuc2NvZGVBdmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZSk7CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQXVkaW9WaWRlbzJBdWRpb1ZpZGVvKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjVmlkZW8yVmlkZW8pOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlSGV2YzJBdmNBVjJBVk1heE9wZXJhdGluZ1JhdGUpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fVHJhbnNjb2RlSGV2YzJBdmNWMlZNYXhPcGVyYXRpbmdSYXRlKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQVYyQVY3MjBQKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUhldmMyQXZjQVYyQVY3MjBQTWF4T3BlcmF0aW5nUmF0ZSk7CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNX1RyYW5zY29kZUF1ZGlvVmlkZW9QYXNzdGhyb3VnaCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV9UcmFuc2NvZGVWaWRlb1Bhc3N0aHJvdWdoKTsKKworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTkyMHgxMDgwX0F2YzIyTWJwczJBdmMxMk1icHMpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTkyMHgxMDgwX0F2YzE1TWJwczJBdmM4TWJwcyk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xOTIweDEwODBfQXZjMTVNYnBzMkF2Y1Bhc3N0aHJvdWdoKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjOE1icHMpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTkyMHgxMDgwX0F2YzE1TWJwc0FhYzJBdmM4TWJwc0FhYyk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xOTIweDEwODBfQXZjMTVNYnBzQWFjMkF2Y1Bhc3N0aHJvdWdoKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzE5MjB4MTA4MF9BdmMxNU1icHNBYWMyQXZjQWFjUGFzc3Rocm91Z2gpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTkyMHgxMDgwX0hldmMxN01icHMySGV2YzhNYnBzKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzE5MjB4MTA4MF9IZXZjMTdNYnBzMkF2YzEyTWJwcyk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xOTIweDEwODBfNjBmcHNfSGV2YzI4TWJwczJBdmMxNU1icHMpOworCitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xMjgweDcyMF9BdmMxME1icHMyQXZjNE1icHMpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTI4MHg3MjBfQXZjMTBNYnBzMkF2Y1Bhc3N0aHJvdWdoKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzEyODB4NzIwX0F2YzEwTWJwc0FhYzJBdmM0TWJwcyk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xMjgweDcyMF9BdmMxME1icHNBYWMyQXZjNE1icHNBYWMpOworVFJBTlNDT0RFUl9CRU5DSE1BUksoQk1fMTI4MHg3MjBfQXZjMTBNYnBzQWFjMkF2Y1Bhc3N0aHJvdWdoKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzEyODB4NzIwX0F2YzEwTWJwc0FhYzJBdmNBYWNQYXNzdGhyb3VnaCk7CitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xMjgweDcyMF9IZXZjOE1icHMyQXZjNE1icHMpOworCitUUkFOU0NPREVSX0JFTkNITUFSSyhCTV8xMDgweDE5MjBfQXZjMTVNYnBzMkF2YzhNYnBzKTsKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzcyMHgxMjgwX0F2YzEwTWJwczJBdmM0TWJwcyk7CisKK1RSQU5TQ09ERVJfQkVOQ0hNQVJLKEJNXzM4NDB4MjE2MF9IZXZjNDJNYnBzMkF2YzIwTWJwcyk7CisKK2NsYXNzIEN1c3RvbUNzdlJlcG9ydGVyIDogcHVibGljIGJlbmNobWFyazo6QmVuY2htYXJrUmVwb3J0ZXIgeworcHVibGljOgorICAgIEN1c3RvbUNzdlJlcG9ydGVyKCkgOiBtUHJpbnRlZEhlYWRlcihmYWxzZSkge30KKyAgICB2aXJ0dWFsIGJvb2wgUmVwb3J0Q29udGV4dChjb25zdCBDb250ZXh0JiBjb250ZXh0KTsKKyAgICB2aXJ0dWFsIHZvaWQgUmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnRzKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIFByaW50UnVuRGF0YShjb25zdCBSdW4mIHJlcG9ydCk7CisKKyAgICBib29sIG1QcmludGVkSGVhZGVyOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtSGVhZGVycyA9IHsKKyAgICAgICAgIkZpbGUiLCAgICAgICAgICAiUmVzb2x1dGlvbiIsICAgICAiU291cmNlTWltZSIsICJWaWRlb1RyYWNrRHVyYXRpb24obXMpIiwKKyAgICAgICAgIkluY2x1ZGVBdWRpbyIsICAiVHJhbnNjb2RlVmlkZW8iLCAiVGFyZ2V0TWltZSIsICJUYXJnZXRCaXJhdGUoYnBzKSIsCisgICAgICAgICJyZWFsX3RpbWUobXMpIiwgImNwdV90aW1lKG1zKSIsICAgUEFSQU1fVklERU9fRlJBTUVfUkFURQorICAgIH07Cit9OworCitib29sIEN1c3RvbUNzdlJlcG9ydGVyOjpSZXBvcnRDb250ZXh0KGNvbnN0IENvbnRleHQmIGNvbnRleHQgX191bnVzZWQpIHsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDdXN0b21Dc3ZSZXBvcnRlcjo6UmVwb3J0UnVucyhjb25zdCBzdGQ6OnZlY3RvcjxSdW4+JiByZXBvcnRzKSB7CisgICAgc3RkOjpvc3RyZWFtJiBPdXQgPSBHZXRPdXRwdXRTdHJlYW0oKTsKKworICAgIGlmICghbVByaW50ZWRIZWFkZXIpIHsKKyAgICAgICAgLy8gcHJpbnQgdGhlIGhlYWRlcgorICAgICAgICBmb3IgKGF1dG8gaGVhZGVyID0gbUhlYWRlcnMuYmVnaW4oKTsgaGVhZGVyICE9IG1IZWFkZXJzLmVuZCgpOykgeworICAgICAgICAgICAgT3V0IDw8ICpoZWFkZXIrKzsKKyAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbUhlYWRlcnMuZW5kKCkpIE91dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgT3V0IDw8ICJcbiI7CisgICAgICAgIG1QcmludGVkSGVhZGVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBwcmludCByZXN1bHRzIGZvciBlYWNoIHJ1bgorICAgIGZvciAoY29uc3QgYXV0byYgcnVuIDogcmVwb3J0cykgeworICAgICAgICBQcmludFJ1bkRhdGEocnVuKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3VzdG9tQ3N2UmVwb3J0ZXI6OlByaW50UnVuRGF0YShjb25zdCBSdW4mIHJ1bikgeworICAgIGlmIChydW4uZXJyb3Jfb2NjdXJyZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6Om9zdHJlYW0mIE91dCA9IEdldE91dHB1dFN0cmVhbSgpOworICAgIC8vIExvZyB0aGUgdHJhbnNjb2RpbmcgcGFyYW1zIHJlcG9ydGVkIHRocm91Z2ggbGFiZWwKKyAgICBPdXQgPDwgcnVuLnJlcG9ydF9sYWJlbCA8PCAiLCI7CisgICAgT3V0IDw8IHJ1bi5HZXRBZGp1c3RlZFJlYWxUaW1lKCkgPDwgIiwiOworICAgIE91dCA8PCBydW4uR2V0QWRqdXN0ZWRDUFVUaW1lKCkgPDwgIiwiOworICAgIGF1dG8gZnJhbWVSYXRlID0gcnVuLmNvdW50ZXJzLmZpbmQoUEFSQU1fVklERU9fRlJBTUVfUkFURSk7CisgICAgaWYgKGZyYW1lUmF0ZSA9PSBydW4uY291bnRlcnMuZW5kKCkpIHsKKyAgICAgICAgT3V0IDw8ICJOQSIKKyAgICAgICAgICAgIDw8ICIsIjsKKyAgICB9IGVsc2UgeworICAgICAgICBPdXQgPDwgZnJhbWVSYXRlLT5zZWNvbmQgPDwgIiwiOworICAgIH0KKyAgICBPdXQgPDwgJ1xuJzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxiZW5jaG1hcms6OkJlbmNobWFya1JlcG9ydGVyPiBmaWxlUmVwb3J0ZXI7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgaWYgKHN0ZDo6c3RyaW5nKGFyZ3ZbaV0pLmZpbmQoIi0tYmVuY2htYXJrX291dCIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBmaWxlUmVwb3J0ZXIucmVzZXQobmV3IEN1c3RvbUNzdlJlcG9ydGVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIDo6YmVuY2htYXJrOjpJbml0aWFsaXplKCZhcmdjLCBhcmd2KTsKKyAgICBpZiAoOjpiZW5jaG1hcms6OlJlcG9ydFVucmVjb2duaXplZEFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgcmV0dXJuIDE7CisgICAgOjpiZW5jaG1hcms6OlJ1blNwZWNpZmllZEJlbmNobWFya3MobnVsbHB0ciwgZmlsZVJlcG9ydGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhU2FtcGxlLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjM5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1NBTVBMRV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfU0FNUExFX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYSBzYW1wbGUgZmxhZ3MuCisgKiBUaGVzZSBmbGFncyBwdXJwb3NlbHkgbWF0Y2ggdGhlIG1lZGlhIE5ESydzIGJ1ZmZlciBhbmQgZXh0cmFjdG9yIGZsYWdzIHdpdGggb25lIGV4Y2VwdGlvbi4gVGhlCisgKiBOREsgZXh0cmFjdG9yJ3MgZmxhZyBmb3IgZW5jcnlwdGVkIHNhbXBsZXMgKEFNRURJQUVYVFJBQ1RPUl9TQU1QTEVfRkxBR19FTkNSWVBURUQpIGlzIGVxdWFsIHRvIDIsCisgKiBpLmUuIHRoZSBzYW1lIGFzIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRyBiZWxvdyBhbmQgTkRLJ3MgQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHLgorICogU2FtcGxlIHByb2R1Y2VycyBiYXNlZCBvbiB0aGUgTkRLJ3MgZXh0cmFjdG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYXRjaGluZyB0aG9zZSB2YWx1ZXMuCisgKiBOb3RlIHRoYXQgY3VycmVudGx5IHRoZSBtZWRpYSB0cmFuc2NvZGVyIGRvZXMgbm90IHN1cHBvcnQgZW5jcnlwdGVkIHNhbXBsZXMuCisgKi8KK2VudW0gOiB1aW50MzJfdCB7CisgICAgU0FNUExFX0ZMQUdfU1lOQ19TQU1QTEUgPSAxLAorICAgIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRyA9IDIsCisgICAgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSA9IDQsCisgICAgU0FNUExFX0ZMQUdfUEFSVElBTF9GUkFNRSA9IDgsCit9OworCisvKioKKyAqIE1lZGlhU2FtcGxlSW5mbyBpcyBhbiBvYmplY3QgdGhhdCBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IGEgY29tcHJlc3NlZCBtZWRpYSBzYW1wbGUgd2l0aG91dAorICogaG9sZGluZyBhbnkgc2FtcGxlIGRhdGEuCisgKi8KK3N0cnVjdCBNZWRpYVNhbXBsZUluZm8geworICAgIC8qKiBUaGUgc2FtcGxlJ3MgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMuICovCisgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMgPSAwOworCisgICAgLyoqIFRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHNhbXBsZSBkYXRhIGluIGJ5dGVzLiAqLworICAgIHNpemVfdCBzaXplID0gMDsKKworICAgIC8qKiBTYW1wbGUgZmxhZ3MuICovCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworfTsKKworLyoqCisgKiBNZWRpYVNhbXBsZSBob2xkcyBhIGNvbXByZXNzZWQgbWVkaWEgc2FtcGxlIGluIG1lbW9yeS4KKyAqLworc3RydWN0IE1lZGlhU2FtcGxlIHsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBhIG1lZGlhIHNhbXBsZSBpcyBhYm91dCB0byBiZSByZWxlYXNlZCwgZ2l2aW5nIHRoZSBjcmVhdG9yIGEgY2hhbmNlCisgICAgICogdG8gcmVjbGFpbSB0aGUgZGF0YSBidWZmZXIgYmFja2luZyB0aGUgc2FtcGxlLiBPbmNlIHRoaXMgY2FsbGJhY2sgcmV0dXJucywgdGhlIG1lZGlhIHNhbXBsZQorICAgICAqIGluc3RhbmNlICp3aWxsKiBiZSByZWxlYXNlZCBzbyBpdCBjYW5ub3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSBjYWxsYmFjay4gVG8gZW5hYmxlIHRoZQorICAgICAqIGNhbGxiYWNrLCBjcmVhdGUgdGhlIG1lZGlhIHNhbXBsZSB3aXRoIHtAbGluayAjY3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFja30uCisgICAgICogQHBhcmFtIHNhbXBsZSBUaGUgc2FtcGxlIHRvIGJlIHJlbGVhc2VkLgorICAgICAqLworICAgIHVzaW5nIE9uU2FtcGxlUmVsZWFzZWRDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChNZWRpYVNhbXBsZSogc2FtcGxlKT47CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG1lZGlhIHNhbXBsZSBpbnN0YW5jZSB3aXRoIGEgcmVnaXN0ZXJlZCByZWxlYXNlIGNhbGxiYWNrLiBUaGUgcmVsZWFzZSBjYWxsYmFjaworICAgICAqIHdpbGwgZ2V0IGNhbGxlZCByaWdodCBiZWZvcmUgdGhlIG1lZGlhIHNhbXBsZSBpcyByZWxlYXNlZCBnaXZpbmcgdGhlIGNyZWF0b3IgYSBjaGFuY2UgdG8KKyAgICAgKiByZWNsYWltIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIGJ1ZmZlciBCeXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzYW1wbGUncyBjb21wcmVzc2VkIGRhdGEuCisgICAgICogQHBhcmFtIGRhdGFPZmZzZXQgT2Zmc2V0LCBpbiBieXRlcywgdG8gdGhlIHNhbXBsZSdzIGNvbXByZXNzZWQgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgQnVmZmVyIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyIG9uIHJlbGVhc2UuCisgICAgICogQHBhcmFtIHJlbGVhc2VDYWxsYmFjayBUaGUgc2FtcGxlIHJlbGVhc2UgY2FsbGJhY2suCisgICAgICogQHJldHVybiBBIG5ldyBtZWRpYSBzYW1wbGUgaW5zdGFuY2UuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gY3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFjaygKKyAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGRhdGFPZmZzZXQsIHVpbnQzMl90IGJ1ZmZlcklkLAorICAgICAgICAgICAgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIHJlbGVhc2VDYWxsYmFjaykgeworICAgICAgICBNZWRpYVNhbXBsZSogc2FtcGxlID0gbmV3IE1lZGlhU2FtcGxlKGJ1ZmZlciwgZGF0YU9mZnNldCwgYnVmZmVySWQsIHJlbGVhc2VDYWxsYmFjayk7CisgICAgICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+KAorICAgICAgICAgICAgICAgIHNhbXBsZSwgc3RkOjpiaW5kKCZNZWRpYVNhbXBsZTo6cmVsZWFzZVNhbXBsZSwgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtcGxlJ3MgY29tcHJlc3NlZCBkYXRhLiBUaGUgbWVkaWEgc2FtcGxlIGluc3RhbmNlIGRvZXMgbm90IHRha2UKKyAgICAgKiBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlciBhbmQgd2lsbCBub3QgYXV0b21hdGljYWxseSByZWxlYXNlIHRoZSBtZW1vcnksIGJ1dCB0aGUgY2FsbGVyIGNhbgorICAgICAqIHJlZ2lzdGVyIGEgcmVsZWFzZSBjYWxsYmFjayBieSBjcmVhdGluZyB0aGUgbWVkaWEgc2FtcGxlIHdpdGgKKyAgICAgKiB7QGxpbmsgI2NyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2t9LgorICAgICAqLworICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICAvKiogT2Zmc2V0LCBpbiBieXRlcywgdG8gdGhlIHNhbXBsZSdzIGNvbXByZXNzZWQgZGF0YSBpbnNpZGUgdGhlIGJ1ZmZlci4gKi8KKyAgICBzaXplX3QgZGF0YU9mZnNldCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgaWRlbnRpZmllci4gVGhpcyBpZGVudGlmaWVyIGlzIGxpa2VseSBvbmx5IG1lYW5pbmdmdWwgdG8gdGhlIHNhbXBsZSBkYXRhIHByb2R1Y2VyIGFuZAorICAgICAqIGNhbiBiZSB1c2VkIGZvciByZWNsYWltaW5nIHRoZSBidWZmZXIgb25jZSBhIGNvbnN1bWVyIGlzIGRvbmUgcHJvY2Vzc2luZyBpdC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBidWZmZXJJZCA9IDB4QkFBREYwMEQ7CisKKyAgICAvKiogTWVkaWEgc2FtcGxlIGluZm9ybWF0aW9uLiAqLworICAgIE1lZGlhU2FtcGxlSW5mbyBpbmZvOworCisgICAgTWVkaWFTYW1wbGUoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgTWVkaWFTYW1wbGUodWludDhfdCogYnVmZmVyLCBzaXplX3QgZGF0YU9mZnNldCwgdWludDMyX3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIHJlbGVhc2VDYWxsYmFjaykKKyAgICAgICAgICA6IGJ1ZmZlcihidWZmZXIpLAorICAgICAgICAgICAgZGF0YU9mZnNldChkYXRhT2Zmc2V0KSwKKyAgICAgICAgICAgIGJ1ZmZlcklkKGJ1ZmZlcklkKSwKKyAgICAgICAgICAgIG1SZWxlYXNlQ2FsbGJhY2socmVsZWFzZUNhbGxiYWNrKXt9OworCisgICAgc3RhdGljIHZvaWQgcmVsZWFzZVNhbXBsZShNZWRpYVNhbXBsZSogc2FtcGxlKSB7CisgICAgICAgIGlmIChzYW1wbGUtPm1SZWxlYXNlQ2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2FtcGxlLT5tUmVsZWFzZUNhbGxiYWNrKHNhbXBsZSk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIHNhbXBsZTsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgY29weWluZyB0byBwcmV2ZW50IGRhbmdsaW5nIHBvaW50ZXJzIGluIHRoZSBjb3BpZWQgb2JqZWN0IGFmdGVyIHRoZSBvcmlnaW5hbCBpcworICAgIC8vIHJlbGVhc2VkLgorICAgIE1lZGlhU2FtcGxlKGNvbnN0IE1lZGlhU2FtcGxlJikgPSBkZWxldGU7CisgICAgTWVkaWFTYW1wbGUmIG9wZXJhdG9yPShjb25zdCBNZWRpYVNhbXBsZSYpID0gZGVsZXRlOworCisgICAgY29uc3QgT25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIG1SZWxlYXNlQ2FsbGJhY2sgPSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9TQU1QTEVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVRdWV1ZS5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Y2YxYTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVF1ZXVlLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfUVVFVUVfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1NBTVBMRV9RVUVVRV9ICisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYVNhbXBsZVF1ZXVlIGFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIGEgcHJvZHVjZXIgYW5kIGEgY29uc3VtZXIgb2YgbWVkaWEgc2FtcGxlcy4KKyAqIE1lZGlhIHNhbXBsZXMgZmxvd3MgdGhyb3VnaCB0aGUgcXVldWUgaW4gRklGTyBvcmRlci4gSWYgdGhlIHF1ZXVlIGlzIGVtcHR5IHRoZSBjb25zdW1lciB3aWxsIGJlCisgKiBibG9ja2VkIHVudGlsIGEgbmV3IG1lZGlhIHNhbXBsZSBpcyBhZGRlZCBvciB1bnRpbCB0aGUgcHJvZHVjZXIgYWJvcnRzIHRoZSBxdWV1ZSBvcGVyYXRpb24uCisgKi8KK2NsYXNzIE1lZGlhU2FtcGxlUXVldWUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEVucXVldWVzIGEgbWVkaWEgc2FtcGxlIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIGFuZCBub3RpZmllcyBwb3RlbnRpYWxseSB3YWl0aW5nIGNvbnN1bWVycy4KKyAgICAgKiBJZiB0aGUgcXVldWUgaGFzIHByZXZpb3VzbHkgYmVlbiBhYm9ydGVkIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKyAgICAgKiBAcGFyYW0gc2FtcGxlIFRoZSBtZWRpYSBzYW1wbGUgdG8gZW5xdWV1ZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHF1ZXVlIGhhcyBiZWVuIGFib3J0ZWQuCisgICAgICovCisgICAgYm9vbCBlbnF1ZXVlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBuZXh0IG1lZGlhIHNhbXBsZSBmcm9tIHRoZSBxdWV1ZSBhbmQgcmV0dXJucyBpdC4gSWYgdGhlIHF1ZXVlIGhhcyBwcmV2aW91c2x5IGJlZW4KKyAgICAgKiBhYm9ydGVkIHRoaXMgbWV0aG9kIHJldHVybnMgbnVsbC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgd2hpbGUgdGhlIHF1ZXVlIGlzIGVtcHR5LgorICAgICAqIEBwYXJhbVtvdXRdIHNhbXBsZSBUaGUgbmV4dCBtZWRpYSBzYW1wbGUgaW4gdGhlIHF1ZXVlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcXVldWUgaGFzIGJlZW4gYWJvcnRlZC4KKyAgICAgKi8KKyAgICBib29sIGRlcXVldWUoc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiogc2FtcGxlIC8qIG5vbm51bGwgKi8pOworCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBxdWV1ZSBjdXJyZW50bHkgaG9sZHMgYW55IG1lZGlhIHNhbXBsZXMuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBvciBoYXMgYmVlbiBhYm9ydGVkLiBGYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBpc0VtcHR5KCk7CisKKyAgICAvKioKKyAgICAgKiBBYm9ydHMgdGhlIHF1ZXVlIG9wZXJhdGlvbi4gVGhpcyBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBub3RpZmllcyB3YWl0aW5nIGNvbnN1bWVycy4gQWZ0ZXIgdGhlCisgICAgICogaGFzIGJlZW4gYWJvcnRlZCBpdCBpcyBub3QgcG9zc2libGUgdG8gZW5xdWV1ZSBtb3JlIHNhbXBsZXMsIGFuZCBkZXF1ZXVlIHdpbGwgcmV0dXJuIG51bGwuCisgICAgICovCisgICAgdm9pZCBhYm9ydCgpOworCitwcml2YXRlOgorICAgIHN0ZDo6cXVldWU8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPj4gbVNhbXBsZVF1ZXVlIEdVQVJERURfQlkobU11dGV4KTsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIGJvb2wgbUFib3J0ZWQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1NBTVBMRV9RVUVVRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVJlYWRlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzdlZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX0gKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNZWRpYVNhbXBsZVJlYWRlciBpcyBhbiBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgbWVkaWEgc2FtcGxlcyBmcm9tIGEgY29udGFpbmVyLiBNZWRpYVNhbXBsZVJlYWRlcgorICogYWxsb3dzIGZvciByZWFkaW5nIHNhbXBsZXMgZnJvbSBtdWx0aXBsZSB0cmFja3Mgb24gaW5kaXZpZHVhbCB0aHJlYWRzIGluZGVwZW5kZW50bHkgb2YgZWFjaCBvdGhlcgorICogd2hpbGUgcHJlc2VydmluZyB0aGUgb3JkZXIgb2Ygc2FtcGxlcy4gRHVlIHRvIHBvb3Igbm9uLXNlcXVlbnRpYWwgYWNjZXNzIHBlcmZvcm1hbmNlIG9mIHRoZQorICogdW5kZXJseWluZyBleHRyYWN0b3IsIE1lZGlhU2FtcGxlUmVhZGVyIGNhbiBvcHRpb25hbGx5IGVuZm9yY2Ugc2VxdWVudGlhbCBzYW1wbGUgYWNjZXNzIGJ5CisgKiBibG9ja2luZyByZXF1ZXN0cyBmb3IgdHJhY2tzIHRoYXQgdGhlIHVuZGVybHlpbmcgZXh0cmFjdG9yIGRvZXMgbm90IGN1cnJlbnRseSBwb2ludCB0by4gV2FpdGluZworICogdGhyZWFkcyBhcmUgc2VydmljZWQgb25jZSB0aGUgcmVhZGVyIGFkdmFuY2VzIHRvIGEgc2FtcGxlIGZyb20gdGhlIHNwZWNpZmllZCB0cmFjay4gRHVlIHRvIHRoaXMKKyAqIGl0IGlzIGltcG9ydGFudCB0byByZWFkIHNhbXBsZXMgYW5kIGFkdmFuY2UgdGhlIHJlYWRlciBmcm9tIGFsbCBzZWxlY3RlZCB0cmFja3MgdG8gYXZvaWQgaGFuZ2luZworICogb3RoZXIgdHJhY2tzLiBNZWRpYVNhbXBsZVJlYWRlciBpbXBsZW1lbnRhdGlvbnMgYXJlIHRocmVhZCBzYWZlIGFuZCBzYW1wbGUgYWNjZXNzIHNob3VsZCBiZSBkb25lCisgKiBvbiBvbmUgdGhyZWFkIHBlciBzZWxlY3RlZCB0cmFjay4KKyAqLworY2xhc3MgTWVkaWFTYW1wbGVSZWFkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZpbGUgZm9ybWF0IG9mIHRoZSBtZWRpYSBjb250YWluZXIgYXMgYSBBTWVkaWFGb3JtYXQuCisgICAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBmb3JtYXQgd2hlbiBmaW5pc2hlZCB3aXRoIGl0IHVzaW5nCisgICAgICogQU1lZGlhRm9ybWF0X2RlbGV0ZSgpLgorICAgICAqIEByZXR1cm4gVGhlIGZpbGUgbWVkaWEgZm9ybWF0LgorICAgICAqLworICAgIHZpcnR1YWwgQU1lZGlhRm9ybWF0KiBnZXRGaWxlRm9ybWF0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgbWVkaWEgY29udGFpbmVyLgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB0cmFja3MuCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1lZGlhIGZvcm1hdCBvZiBhIHNwZWNpZmljIHRyYWNrIGFzIGEgQU1lZGlhRm9ybWF0LgorICAgICAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgZm9ybWF0IHdoZW4gZmluaXNoZWQgd2l0aCBpdCB1c2luZworICAgICAqIEFNZWRpYUZvcm1hdF9kZWxldGUoKS4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgdHJhY2sgaW5kZXggKHplcm8tYmFzZWQpLgorICAgICAqIEByZXR1cm4gVGhlIHRyYWNrIG1lZGlhIGZvcm1hdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCogZ2V0VHJhY2tGb3JtYXQoaW50IHRyYWNrSW5kZXgpID0gMDsKKworICAgIC8qKgorICAgICAqIFNlbGVjdCBhIHRyYWNrIGZvciBzYW1wbGUgYWNjZXNzLiBUcmFja3MgbXVzdCBiZSBzZWxlY3RlZCBpbiBvcmRlciBmb3Igc2FtcGxlIGluZm9ybWF0aW9uIGFuZAorICAgICAqIHNhbXBsZSBkYXRhIHRvIGJlIGF2YWlsYWJsZSBmb3IgdGhhdCB0cmFjay4gU2FtcGxlcyBmb3Igc2VsZWN0ZWQgdHJhY2tzIG11c3QgYmUgYWNjZXNzZWQgb24KKyAgICAgKiBpdHMgb3duIHRocmVhZCB0byBhdm9pZCBibG9ja2luZyBvdGhlciB0cmFja3MuCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIHRvIHNlbGVjdC4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXgpID0gMDsKKworICAgIC8qKgorICAgICAqIFVuZG8gYSB0cmFjayBzZWxlY3Rpb24uCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIHRvIHVuLXNlbGVjdC4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdW5zZWxlY3RUcmFjayhpbnQgdHJhY2tJbmRleCkgPSAwOworCisgICAgLyoqCisgICAgICogVG9nZ2xlcyBzZXF1ZW50aWFsIGFjY2VzcyBlbmZvcmNlbWVudCBvbiBvciBvZmYuIFdoZW4gdGhlIHJlYWRlciBlbmZvcmNlcyBzZXF1ZW50aWFsIGFjY2VzcworICAgICAqIGNhbGxzIHRvIHJlYWQgc2FtcGxlIGluZm9ybWF0aW9uIHdpbGwgYmxvY2sgdW5sZXNzIHRoZSB1bmRlcmx5aW5nIGV4dHJhY3RvciBwb2ludHMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHRyYWNrLgorICAgICAqIEBwYXJhbSBlbmZvcmNlIFRydWUgdG8gZW5mb3JjZSBzZXF1ZW50aWFsIGFjY2Vzcy4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MoYm9vbCBlbmZvcmNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFc3RpbWF0ZXMgdGhlIGJpdHJhdGUgb2YgYSBzb3VyY2UgdHJhY2sgYnkgc2FtcGxpbmcgc2FtcGxlIHNpemVzLiBUaGUgYml0cmF0ZSBpcyByZXR1cm5lZCBpbgorICAgICAqIG1lZ2FiaXRzIHBlciBzZWNvbmQgKE1icHMpLiBUaGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgdGhlIHRyYWNrIG9ubHkgY29udGFpbnMgYSBzaW5nbGUgc2FtcGxlCisgICAgICogYW5kIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBkdXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgc291cmNlIHRyYWNrIGluZGV4LgorICAgICAqIEBwYXJhbSBiaXRyYXRlIE91dHB1dCBwYXJhbSBmb3IgdGhlIGJpdHJhdGUuCisgICAgICogQHJldHVybiBBTUVESUFfT0sgb24gc3VjY2Vzcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEVzdGltYXRlZEJpdHJhdGVGb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgaW50MzJfdCogYml0cmF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1wbGUgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IHNhbXBsZSBpbiB0aGUgc3BlY2lmaWVkIHRyYWNrLiBOb3RlIHRoYXQgdGhpcworICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSByZWFkZXIgYWR2YW5jZXMgdG8gYSBzYW1wbGUgYmVsb25naW5nIHRvIHRoZSByZXF1ZXN0ZWQgdHJhY2sgaWYKKyAgICAgKiB0aGUgcmVhZGVyIGlzIGluIHNlcXVlbnRpYWwgYWNjZXNzIG1vZGUuCisgICAgICogQHBhcmFtIHRyYWNrSW5kZXggVGhlIHRyYWNrIGluZGV4ICh6ZXJvLWJhc2VkKS4KKyAgICAgKiBAcGFyYW0gaW5mbyBQb2ludGVyIHRvIGEgTWVkaWFTYW1wbGVJbmZvIG9iamVjdCB3aGVyZSB0aGUgc2FtcGxlIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4uCisgICAgICogQHJldHVybiBBTUVESUFfT0sgb24gc3VjY2VzcywgQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gaWYgdGhlcmUgYXJlIG5vIG1vcmUgc2FtcGxlcyB0byByZWFkCisgICAgICogZnJvbSB0aGUgdHJhY2sgYW5kIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBpZiB0cmFja0luZGV4IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlCisgICAgICogaW5mbyBwb2ludGVyIGlzIE5VTEwuIE90aGVyIEFNRURJQV9FUlJPUl8qIHJldHVybiB2YWx1ZXMgbWF5IG5vdCBiZSByZWNvdmVyYWJsZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFNhbXBsZUluZm9Gb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgTWVkaWFTYW1wbGVJbmZvKiBpbmZvKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzYW1wbGUgZGF0YSBmb3IgdGhlIGN1cnJlbnQgc2FtcGxlIGluIHRoZSBzcGVjaWZpZWQgdHJhY2sgaW50byB0aGUgc3VwcGxpZWQKKyAgICAgKiBidWZmZXIuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSByZWFkZXIgYWR2YW5jZXMgdG8gYSBzYW1wbGUgYmVsb25naW5nIHRvCisgICAgICogdGhlIHJlcXVlc3RlZCB0cmFjayBpZiB0aGUgcmVhZGVyIGlzIGluIHNlcXVlbnRpYWwgYWNjZXNzIG1vZGUuIFVwb24gc3VjY2Vzc2Z1bCByZXR1cm4gdGhpcworICAgICAqIG1ldGhvZCB3aWxsIGFsc28gYWR2YW5jZSB0aGUgc3BlY2lmaWVkIHRyYWNrIHRvIHRoZSBuZXh0IHNhbXBsZS4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgdHJhY2sgaW5kZXggKHplcm8tYmFzZWQpLgorICAgICAqIEBwYXJhbSBidWZmZXIgVGhlIGJ1ZmZlciB0byB3cml0ZSB0aGUgc2FtcGxlJ3MgZGF0YSB0by4KKyAgICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyLgorICAgICAqIEByZXR1cm4gQU1FRElBX09LIG9uIHN1Y2Nlc3MsIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIHRoZXJlIGFyZSBubyBtb3JlIHNhbXBsZXMgdG8gcmVhZAorICAgICAqIGZyb20gdGhlIHRyYWNrIGFuZCBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgaWYgdHJhY2tJbmRleCBpcyBvdXQgb2YgYm91bmRzLCBpZiB0aGUKKyAgICAgKiBidWZmZXIgcG9pbnRlciBpcyBOVUxMIG9yIGlmIGJ1ZmZlclNpemUgaXMgdG9vIHNtYWxsIGZvciB0aGUgc2FtcGxlLiBPdGhlciBBTUVESUFfRVJST1JfKgorICAgICAqIHJldHVybiB2YWx1ZXMgbWF5IG5vdCBiZSByZWNvdmVyYWJsZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWRTYW1wbGVEYXRhRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIEFkdmFuY2UgdGhlIHNwZWNpZmllZCB0cmFjayB0byB0aGUgbmV4dCBzYW1wbGUuIElmIHRoZSByZWFkZXIgaXMgaW4gc2VxdWVudGlhbCBhY2Nlc3MgbW9kZQorICAgICAqIGFuZCB0aGUgY3VycmVudCBzYW1wbGUgYmVsb25ncyB0byB0aGUgc3BlY2lmaWVkIHRyYWNrLCB0aGUgcmVhZGVyIHdpbGwgYWxzbyBhZHZhbmNlIHRvIHRoZQorICAgICAqIG5leHQgc2FtcGxlIGFuZCB3YWtlIHVwIGFueSB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIG5ldyB0cmFjay4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgdHJhY2sgaW5kZXggKHplcm8tYmFzZWQpLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlVHJhY2soaW50IHRyYWNrSW5kZXgpID0gMDsKKworICAgIC8qKiBEZXN0cnVjdG9yLiAqLworICAgIHZpcnR1YWwgfk1lZGlhU2FtcGxlUmVhZGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqIENvbnN0cnVjdG9yLiAqLworICAgIE1lZGlhU2FtcGxlUmVhZGVyKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIE1lZGlhU2FtcGxlUmVhZGVyKGNvbnN0IE1lZGlhU2FtcGxlUmVhZGVyJikgPSBkZWxldGU7CisgICAgTWVkaWFTYW1wbGVSZWFkZXImIG9wZXJhdG9yPShjb25zdCBNZWRpYVNhbXBsZVJlYWRlciYpID0gZGVsZXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2MzN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1NBTVBMRV9SRUFERVJfTkRLX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX05ES19ICisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIE1lZGlhU2FtcGxlUmVhZGVyTkRLIGlzIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1lZGlhU2FtcGxlUmVhZGVyIGludGVyZmFjZSBiYXNlZCBvbiB0aGUKKyAqIG1lZGlhIE5ESyBleHRyYWN0b3IuCisgKi8KK2NsYXNzIE1lZGlhU2FtcGxlUmVhZGVyTkRLIDogcHVibGljIE1lZGlhU2FtcGxlUmVhZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IE1lZGlhU2FtcGxlUmVhZGVyTkRLIGluc3RhbmNlIHdyYXBwZWQgaW4gYSBzaGFyZWQgcG9pbnRlci4KKyAgICAgKiBAcGFyYW0gZmQgU291cmNlIGZpbGUgZGVzY3JpcHRvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgZmQgYW5kIGl0IGlzIHNhZmUKKyAgICAgKiAgICAgICAgICAgdG8gZG8gc28gd2hlbiB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqIEBwYXJhbSBvZmZzZXQgU291cmNlIGRhdGEgb2Zmc2V0LgorICAgICAqIEBwYXJhbSBzaXplIFNvdXJjZSBkYXRhIHNpemUuCisgICAgICogQHJldHVybiBBIHNoYXJlZCBwb2ludGVyIHJlZmVyZW5jaW5nIHRoZSBuZXcgTWVkaWFTYW1wbGVSZWFkZXJOREsgaW5zdGFuY2Ugb24gc3VjY2Vzcywgb3IgYW4KKyAgICAgKiAgICAgICAgIGVtcHR5IHNoYXJlZCBwb2ludGVyIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IGNyZWF0ZUZyb21GZChpbnQgZmQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKKworICAgIEFNZWRpYUZvcm1hdCogZ2V0RmlsZUZvcm1hdCgpIG92ZXJyaWRlOworICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgQU1lZGlhRm9ybWF0KiBnZXRUcmFja0Zvcm1hdChpbnQgdHJhY2tJbmRleCkgb3ZlcnJpZGU7CisgICAgbWVkaWFfc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IHVuc2VsZWN0VHJhY2soaW50IHRyYWNrSW5kZXgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IHNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKGJvb2wgZW5mb3JjZSkgb3ZlcnJpZGU7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKGludCB0cmFja0luZGV4LCBpbnQzMl90KiBiaXRyYXRlKSBvdmVycmlkZTsKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRTYW1wbGVJbmZvRm9yVHJhY2soaW50IHRyYWNrSW5kZXgsIE1lZGlhU2FtcGxlSW5mbyogaW5mbykgb3ZlcnJpZGU7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZFNhbXBsZURhdGFGb3JUcmFjayhpbnQgdHJhY2tJbmRleCwgdWludDhfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUpIG92ZXJyaWRlOworICAgIHZvaWQgYWR2YW5jZVRyYWNrKGludCB0cmFja0luZGV4KSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgfk1lZGlhU2FtcGxlUmVhZGVyTkRLKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogU2FtcGxlUG9zaXRpb24gZGVzY3JpYmVzIHRoZSBwb3NpdGlvbiBvZiBhIHNpbmdsZSBzYW1wbGUgaW4gdGhlIG1lZGlhIGZpbGUgdXNpbmcgaXRzCisgICAgICogdGltZXN0YW1wIGFuZCBpbmRleCBpbiB0aGUgZmlsZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgU2FtcGxlUG9zaXRpb24geworICAgICAgICB1aW50NjRfdCBpbmRleCA9IDA7CisgICAgICAgIGludDY0X3QgdGltZVN0YW1wVXMgPSAwOworICAgICAgICBib29sIGlzU2V0ID0gZmFsc2U7CisKKyAgICAgICAgdm9pZCBzZXQodWludDY0X3Qgc2FtcGxlSW5kZXgsIGludDY0X3Qgc2FtcGxlVGltZVVzKSB7CisgICAgICAgICAgICBpbmRleCA9IHNhbXBsZUluZGV4OworICAgICAgICAgICAgdGltZVN0YW1wVXMgPSBzYW1wbGVUaW1lVXM7CisgICAgICAgICAgICBpc1NldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkgeyBpc1NldCA9IGZhbHNlOyB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFNhbXBsZUN1cnNvciBrZWVwcyB0cmFjayBvZiB0aGUgc2FtcGxlIHBvc2l0aW9uIGZvciBhIHNwZWNpZmljIHRyYWNrLiBXaGVuIHRoZSB0cmFjayBpcworICAgICAqIGFkdmFuY2VkLCBwcmV2aW91cyBpcyBzZXQgdG8gY3VycmVudCwgY3VycmVudCB0byBuZXh0IGFuZCBuZXh0IGlzIHJlc2V0LiBBcyB0aGUgZXh0cmFjdG9yCisgICAgICogYWR2YW5jZXMgb3ZlciB0aGUgY29tYmluZWQgdGltZWxpbmUgb2YgdHJhY2tzLCBpdCB1cGRhdGVzIGN1cnJlbnQgYW5kIG5leHQgZm9yIHRoZSB0cmFjayBpdAorICAgICAqIHBvaW50cyB0byBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzZXQuCisgICAgICovCisgICAgc3RydWN0IFNhbXBsZUN1cnNvciB7CisgICAgICAgIFNhbXBsZVBvc2l0aW9uIHByZXZpb3VzOworICAgICAgICBTYW1wbGVQb3NpdGlvbiBjdXJyZW50OworICAgICAgICBTYW1wbGVQb3NpdGlvbiBuZXh0OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IE1lZGlhU2FtcGxlUmVhZGVyTkRLIG9iamVjdCBmcm9tIGFuIEFNZWRpYUV4dHJhY3Rvci4gVGhlIGV4dHJhY3RvciBuZWVkcyB0byBiZQorICAgICAqIGluaXRpYWxpemVkIHdpdGggYSB2YWxpZCBkYXRhIHNvdXJjZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBjcmVhdGUgYSBNZWRpYVNhbXBsZVJlYWRlck5ESy4KKyAgICAgKiBAcGFyYW0gZXh0cmFjdG9yIFRoZSBpbml0aWFsaXplZCBtZWRpYSBleHRyYWN0b3IuCisgICAgICovCisgICAgTWVkaWFTYW1wbGVSZWFkZXJOREsoQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IpOworCisgICAgLyoqIEFkdmFuY2VzIHRoZSB0cmFjayB0byBuZXh0IHNhbXBsZS4gKi8KKyAgICB2b2lkIGFkdmFuY2VUcmFja19sKGludCB0cmFja0luZGV4KTsKKworICAgIC8qKiBBZHZhbmNlcyB0aGUgZXh0cmFjdG9yIHRvIG5leHQgc2FtcGxlLiAqLworICAgIGJvb2wgYWR2YW5jZUV4dHJhY3Rvcl9sKCk7CisKKyAgICAvKiogTW92ZXMgdGhlIGV4dHJhY3RvciBiYWNrd2FyZHMgdG8gdGhlIHNwZWNpZmllZCBzYW1wbGUuICovCisgICAgbWVkaWFfc3RhdHVzX3Qgc2Vla0V4dHJhY3RvckJhY2t3YXJkc19sKGludDY0X3QgdGFyZ2V0VGltZVVzLCBpbnQgdGFyZ2V0VHJhY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGFyZ2V0U2FtcGxlSW5kZXgpOworCisgICAgLyoqIE1vdmVzIHRoZSBleHRyYWN0b3IgdG8gdGhlIHNwZWNpZmllZCBzYW1wbGUuICovCisgICAgbWVkaWFfc3RhdHVzX3QgbW92ZVRvU2FtcGxlX2woU2FtcGxlUG9zaXRpb24mIHBvcywgaW50IHRyYWNrSW5kZXgpOworCisgICAgLyoqIE1vdmVzIHRoZSBleHRyYWN0b3IgdG8gdGhlIG5leHQgc2FtcGxlIG9mIHRoZSBzcGVjaWZpZWQgdHJhY2suICovCisgICAgbWVkaWFfc3RhdHVzX3QgbW92ZVRvVHJhY2tfbChpbnQgdHJhY2tJbmRleCk7CisKKyAgICAvKiogSW4gc2VxdWVudGlhbCBtb2RlLCB3YWl0cyBmb3IgdGhlIGV4dHJhY3RvciB0byByZWFjaCB0aGUgbmV4dCBzYW1wbGUgZm9yIHRoZSB0cmFjay4gKi8KKyAgICBtZWRpYV9zdGF0dXNfdCB3YWl0Rm9yVHJhY2tfbChpbnQgdHJhY2tJbmRleCwgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiYgbG9ja0hlbGQpOworCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgZXh0cmFjdG9yIGlzIHJlYWR5IGZvciB0aGUgbmV4dCBzYW1wbGUgb2YgdGhlIHRyYWNrIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzIG1vZGUuCisgICAgICovCisgICAgbWVkaWFfc3RhdHVzX3QgcHJpbWVFeHRyYWN0b3JGb3JUcmFja19sKGludCB0cmFja0luZGV4LCBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+JiBsb2NrSGVsZCk7CisKKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIHN0ZDo6bXV0ZXggbUV4dHJhY3Rvck11dGV4OworICAgIGNvbnN0IHNpemVfdCBtVHJhY2tDb3VudDsKKworICAgIGludCBtRXh0cmFjdG9yVHJhY2tJbmRleCA9IC0xOworICAgIHVpbnQ2NF90IG1FeHRyYWN0b3JTYW1wbGVJbmRleCA9IDA7CisKKyAgICBib29sIG1Fb3NSZWFjaGVkID0gZmFsc2U7CisgICAgYm9vbCBtRW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3MgPSBmYWxzZTsKKworICAgIC8vIE1hcHMgc2VsZWN0ZWQgdHJhY2sgaW5kaWNlcyB0byBjb25kaXRpb24gdmFyaWFibGVzIGZvciBzZXF1ZW50aWFsIHNhbXBsZSBhY2Nlc3MgY29udHJvbC4KKyAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlPiBtVHJhY2tTaWduYWxzOworCisgICAgLy8gU2FtcGxlcyBjdXJzb3IgZm9yIGVhY2ggdHJhY2sgaW4gdGhlIGZpbGUuCisgICAgc3RkOjp2ZWN0b3I8U2FtcGxlQ3Vyc29yPiBtVHJhY2tDdXJzb3JzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9TQU1QTEVfUkVBREVSX05ES19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2EyMzRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaApAQCAtMCwwICsxLDIyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9TQU1QTEVfV1JJVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TQU1QTEVfV1JJVEVSX0gKKworI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBNdXhlciBpbnRlcmZhY2UgdXNlZCBieSBNZWRpYVNhbXBsZVdyaXRlci4KKyAqIE1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcXVlbnRpYWxseSBieSBNZWRpYVNhbXBsZVdyaXRlci4KKyAqLworY2xhc3MgTWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyB0cmFjayB0byB0aGUgbXV4ZXIuCisgICAgICogQHBhcmFtIHRyYWNrRm9ybWF0IEZvcm1hdCBvZiB0aGUgbmV3IHRyYWNrLgorICAgICAqIEByZXR1cm4gQSBub24tbmVnYXRpdmUgdHJhY2sgaW5kZXggb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNzaXplX3QgYWRkVHJhY2soQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCkgPSAwOworCisgICAgLyoqIFN0YXJ0cyB0aGUgbXV4ZXIuICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpID0gMDsKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc2FtcGxlIGRhdGEgdG8gYSBwcmV2aW91c2x5IGFkZGVkIHRyYWNrLgorICAgICAqIEBwYXJhbSB0cmFja0luZGV4IEluZGV4IG9mIHRoZSB0cmFjayB0aGUgc2FtcGxlIGRhdGEgYmVsb25ncyB0by4KKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgc2FtcGxlIGRhdGEuCisgICAgICogQHBhcmFtIGluZm8gVGhlIHNhbXBsZSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHdyaXRlU2FtcGxlRGF0YShzaXplX3QgdHJhY2tJbmRleCwgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGluZm8pID0gMDsKKworICAgIC8qKiBTdG9wcyB0aGUgbXV4ZXIuICovCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgfk1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIE1lZGlhU2FtcGxlV3JpdGVyIGlzIGEgd3JhcHBlciBhcm91bmQgYSBtdXhlci4gVGhlIHNhbXBsZSB3cml0ZXIgcHV0cyBzYW1wbGVzIG9uIGEgcXVldWUgdGhhdAorICogaXMgc2VydmljZWQgYnkgYW4gaW50ZXJuYWwgdGhyZWFkIHRvIG1pbmltaXplIGJsb2NraW5nIHRpbWUgZm9yIGNsaWVudHMuIE1lZGlhU2FtcGxlV3JpdGVyIGFsc28KKyAqIHByb3ZpZGVzIHByb2dyZXNzIHJlcG9ydGluZy4gVGhlIGRlZmF1bHQgbXV4ZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkCisgKiBkaXJlY3RseSBvbiBBTWVkaWFNdXhlci4KKyAqLworY2xhc3MgTWVkaWFTYW1wbGVXcml0ZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxNZWRpYVNhbXBsZVdyaXRlcj4geworcHVibGljOgorICAgIC8qKiBGdW5jdGlvbiBwcm90b3R5cGUgZm9yIGRlbGl2ZXJpbmcgbWVkaWEgc2FtcGxlcyB0byB0aGUgd3JpdGVyLiAqLworICAgIHVzaW5nIE1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiA9CisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKT47CisKKyAgICAvKiogQ2FsbGJhY2sgaW50ZXJmYWNlLiAqLworICAgIGNsYXNzIENhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBTYW1wbGUgd3JpdGVyIGZpbmlzaGVkLiBUaGUgZmluaXNoZWQgY2FsbGJhY2sgaXMgb25seSBjYWxsZWQgYWZ0ZXIgdGhlIHNhbXBsZSB3cml0ZXIgaGFzCisgICAgICAgICAqIGJlZW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaW5pc2hlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyLCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMpID0gMDsKKworICAgICAgICAvKiogU2FtcGxlIHdyaXRlciB3YXMgc3RvcHBlZCBiZWZvcmUgaXQgd2FzIGZpbmlzaGVkLiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25TdG9wcGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIpID0gMDsKKworICAgICAgICAvKiogU2FtcGxlIHdyaXRlciBwcm9ncmVzcyB1cGRhdGUgaW4gcGVyY2VudC4gKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uUHJvZ3Jlc3NVcGRhdGUoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciwgaW50MzJfdCBwcm9ncmVzcykgPSAwOworCisgICAgICAgIC8qKiBTYW1wbGUgd3JpdGVyIGhlYXJ0LWJlYXQgc2lnbmFsLiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlcikgPSAwOworCisgICAgICAgIHZpcnR1YWwgfkNhbGxiYWNrSW50ZXJmYWNlKCkgPSBkZWZhdWx0OworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiBDcmVhdGUoKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBzYW1wbGUgd3JpdGVyIHdpdGggaXRzIGRlZmF1bHQgbXV4ZXIgaW1wbGVtZW50YXRpb24uIE1lZGlhU2FtcGxlV3JpdGVyIG5lZWRzCisgICAgICogdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRyYWNrcyBhcmUgYWRkZWQgYW5kIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIG9uY2UuCisgICAgICogQHBhcmFtIGZkIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIHRvLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoaXMKKyAgICAgKiAgICAgICAgZmlsZSBkZXNjcmlwdG9yIGFuZCBpdCBpcyBzYWZlIHRvIGRvIHNvIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucy4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tzIENsaWVudCBjYWxsYmFjayBvYmplY3QgdGhhdCBnZXRzIGNhbGxlZCBieSB0aGUgc2FtcGxlIHdyaXRlci4KKyAgICAgKiBAcGFyYW0gaGVhcnRCZWF0SW50ZXJ2YWxVcyBJbnRlcnZhbCAoaW4gbWljcm9zZWNvbmQpIGF0IHdoaWNoIHRoZSBzYW1wbGUgd3JpdGVyIHNob3VsZCBzZW5kIGEKKyAgICAgKiAgICAgICAgaGVhcnQtYmVhdCB0byBvblByb2dyZXNzVXBkYXRlKCkgdG8gaW5kaWNhdGUgaXQncyBtYWtpbmcgcHJvZ3Jlc3MuIFZhbHVlIDw9MCBpbmRpY2F0ZXMKKyAgICAgKiAgICAgICAgdGhhdCB0aGUgaGVhcnRiZWF0IGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHdyaXRlciB3YXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLgorICAgICAqLworICAgIGJvb2wgaW5pdChpbnQgZmQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYmFja3MgLyogbm9ubnVsbCAqLywKKyAgICAgICAgICAgICAgaW50NjRfdCBoZWFydEJlYXRJbnRlcnZhbFVzID0gLTEpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIHNhbXBsZSB3cml0ZXIgd2l0aCBhIGN1c3RvbSBtdXhlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisgICAgICogQHBhcmFtIG11eGVyIFRoZSBjdXN0b20gbXV4ZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICAgICAqIEBwYXJhbSBAcGFyYW0gY2FsbGJhY2tzIENsaWVudCBjYWxsYmFjayBvYmplY3QgdGhhdCBnZXRzIGNhbGxlZCBieSB0aGUgc2FtcGxlIHdyaXRlci4KKyAgICAgKiBAcGFyYW0gaGVhcnRCZWF0SW50ZXJ2YWxVcyBJbnRlcnZhbCAoaW4gbWljcm9zZWNvbmQpIGF0IHdoaWNoIHRoZSBzYW1wbGUgd3JpdGVyIHNob3VsZCBzZW5kIGEKKyAgICAgKiAgICAgICAgaGVhcnQtYmVhdCB0byBvblByb2dyZXNzVXBkYXRlKCkgdG8gaW5kaWNhdGUgaXQncyBtYWtpbmcgcHJvZ3Jlc3MuCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB3cml0ZXIgd2FzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICBib29sIGluaXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2U+JiBtdXhlciAvKiBub25udWxsICovLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzIC8qIG5vbm51bGwgKi8sCisgICAgICAgICAgICAgIGludDY0X3QgaGVhcnRCZWF0SW50ZXJ2YWxVcyA9IC0xKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgdHJhY2sgdG8gdGhlIHNhbXBsZSB3cml0ZXIuIFRyYWNrcyBtdXN0IGJlIGFkZGVkIGFmdGVyIHRoZSBzYW1wbGUgd3JpdGVyIGhhcyBiZWVuCisgICAgICogaW5pdGlhbGl6ZWQgYW5kIGJlZm9yZSBpdCBpcyBzdGFydGVkLgorICAgICAqIEBwYXJhbSB0cmFja0Zvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0byBhZGQuCisgICAgICogQHJldHVybiBBIHNhbXBsZSBjb25zdW1lciB0byBhZGQgc2FtcGxlcyB0byBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBhZGRlZCwgb3IgbnVsbHB0cgorICAgICAqIGlmIHRoZSB0cmFjayBjb3VsZCBub3QgYmUgYWRkZWQuCisgICAgICovCisgICAgTWVkaWFTYW1wbGVDb25zdW1lckZ1bmN0aW9uIGFkZFRyYWNrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIHRyYWNrRm9ybWF0IC8qIG5vbm51bGwgKi8pOworCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBzYW1wbGUgd3JpdGVyLiBUaGUgc2FtcGxlIHdyaXRlciB3aWxsIHN0YXJ0IHByb2Nlc3Npbmcgc2FtcGxlcyBhbmQgd3JpdGluZyB0aGVtIHRvCisgICAgICogaXRzIG11eGVyIG9uIGFuIGludGVybmFsIHRocmVhZC4gTWVkaWFTYW1wbGVXcml0ZXIgY2FuIG9ubHkgYmUgc3RhcnRlZCBvbmNlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2FtcGxlIHdyaXRlciB3YXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgICAgICovCisgICAgYm9vbCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNhbXBsZSB3cml0ZXIuIElmIHRoZSBzYW1wbGUgd3JpdGVyIGlzIG5vdCB5ZXQgZmluaXNoZWQsIGl0cyBvcGVyYXRpb24gd2lsbCBiZQorICAgICAqIGFib3J0ZWQgYW5kIHRoZSBvblN0b3BwZWQgY2FsbGJhY2sgd2lsbCBmaXJlLiBJZiB0aGUgc2FtcGxlIHdyaXRlciBoYXMgYWxyZWFkeSBmaW5pc2hlZCBhbmQKKyAgICAgKiB0aGUgb25GaW5pc2hlZCBjYWxsYmFjayBoYXMgZmlyZWQgdGhlIHdyaXRlciBoYXMgYWxyZWFkeSBhdXRvbWF0aWNhbGx5IHN0b3BwZWQgYW5kIHRoZXJlIGlzCisgICAgICogbm8gbmVlZCB0byBjYWxsIHN0b3AgbWFudWFsbHkuIE9uY2UgdGhlIHNhbXBsZSB3cml0ZXIgaGFzIGJlZW4gc3RvcHBlZCBpdCBjYW5ub3QgYmUKKyAgICAgKiByZXN0YXJ0ZWQuIFRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cyBhbmQgd2lsbCBub3Qgd2FpdCBmb3IgdGhlIHNhbXBsZSB3cml0ZXIgdG8gc3RvcCBiZWZvcmUKKyAgICAgKiByZXR1cm5pbmcuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICAvKiogRGVzdHJ1Y3Rvci4gKi8KKyAgICB+TWVkaWFTYW1wbGVXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgVHJhY2tSZWNvcmQgeworICAgICAgICBUcmFja1JlY29yZChpbnQ2NF90IGR1cmF0aW9uVXMpCisgICAgICAgICAgICAgIDogbUR1cmF0aW9uVXMoZHVyYXRpb25VcyksCisgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKDApLAorICAgICAgICAgICAgICAgIG1QcmV2U2FtcGxlVGltZVVzKElOVDY0X01JTiksCisgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVNldChmYWxzZSksCisgICAgICAgICAgICAgICAgbVJlYWNoZWRFb3MoZmFsc2Upe307CisKKyAgICAgICAgVHJhY2tSZWNvcmQoKSA6IFRyYWNrUmVjb3JkKDApe307CisKKyAgICAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKKyAgICAgICAgaW50NjRfdCBtRmlyc3RTYW1wbGVUaW1lVXM7CisgICAgICAgIGludDY0X3QgbVByZXZTYW1wbGVUaW1lVXM7CisgICAgICAgIGJvb2wgbUZpcnN0U2FtcGxlVGltZVNldDsKKyAgICAgICAgYm9vbCBtUmVhY2hlZEVvczsKKyAgICB9OworCisgICAgLy8gVHJhY2sgaW5kZXggYW5kIHNhbXBsZS4KKyAgICB1c2luZyBTYW1wbGVFbnRyeSA9IHN0ZDo6cGFpcjxzaXplX3QsIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4+OworCisgICAgc3RydWN0IFNhbXBsZUNvbXBhcmF0b3IgeworICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBsaHMgc2hvdWxkIGNvbWUgYWZ0ZXIgcmhzIGluIHRoZSBzYW1wbGUgcXVldWUuCisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBTYW1wbGVFbnRyeSYgbGhzLCBjb25zdCBTYW1wbGVFbnRyeSYgcmhzKSB7CisgICAgICAgICAgICBjb25zdCBib29sIGxoc0VvcyA9IGxocy5zZWNvbmQtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgY29uc3QgYm9vbCByaHNFb3MgPSByaHMuc2Vjb25kLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICAgICAgaWYgKGxoc0VvcyAmJiAhcmhzRW9zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFsaHNFb3MgJiYgcmhzRW9zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaHNFb3MgJiYgcmhzRW9zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxocy5maXJzdCA+IHJocy5maXJzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGxocy5zZWNvbmQtPmluZm8ucHJlc2VudGF0aW9uVGltZVVzID4gcmhzLnNlY29uZC0+aW5mby5wcmVzZW50YXRpb25UaW1lVXM7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjp3ZWFrX3B0cjxDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXJNdXhlckludGVyZmFjZT4gbU11eGVyOworICAgIGludDY0X3QgbUhlYXJ0QmVhdEludGVydmFsVXM7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsgIC8vIFByb3RlY3RzIHNhbXBsZSBxdWV1ZSBhbmQgc3RhdGUuCisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVNhbXBsZVNpZ25hbDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c2l6ZV90LCBUcmFja1JlY29yZD4gbVRyYWNrczsKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPFNhbXBsZUVudHJ5LCBzdGQ6OnZlY3RvcjxTYW1wbGVFbnRyeT4sIFNhbXBsZUNvbXBhcmF0b3I+IG1TYW1wbGVRdWV1ZQorICAgICAgICAgICAgR1VBUkRFRF9CWShtTXV0ZXgpOworCisgICAgZW51bSA6IGludCB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBTVEFSVEVELAorICAgICAgICBTVE9QUEVELAorICAgIH0gbVN0YXRlIEdVQVJERURfQlkobU11dGV4KTsKKworICAgIE1lZGlhU2FtcGxlV3JpdGVyKCkgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCl7fTsKKyAgICB2b2lkIGFkZFNhbXBsZVRvVHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSk7CisgICAgbWVkaWFfc3RhdHVzX3Qgd3JpdGVTYW1wbGVzKGJvb2wqIHdhc1N0b3BwZWQpOworICAgIG1lZGlhX3N0YXR1c190IHJ1bldyaXRlckxvb3AoYm9vbCogd2FzU3RvcHBlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1NBTVBMRV9XUklURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0YjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjazsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhY2sgdHJhbnNjb2RlcnMuIE1lZGlhVHJhY2tUcmFuc2NvZGVyIG9wZXJhdGVzIGFzeW5jaHJvbm91c2x5IG9uIGFuIGludGVybmFsCisgKiB0aHJlYWQgYW5kIGNvbW11bmljYXRlcyB0aHJvdWdoIGEgTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjayBpbnN0YW5jZS4gVHJhbnNjb2RlZCBzYW1wbGVzIGFyZQorICogZW5xdWV1ZWQgb24gdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyJ3Mgb3V0cHV0IHF1ZXVlLiBTYW1wbGVzIG5lZWQgdG8gYmUgZGVxdWV1ZWQgZnJvbSB0aGUgb3V0cHV0CisgKiBxdWV1ZSBvciB0aGUgdHJhbnNjb2RlciB3aWxsIHJ1biBvdXQgb2YgYnVmZmVycyBhbmQgc3RhbGwuIE9uY2UgdGhlIGNvbnN1bWVyIGlzIGRvbmUgd2l0aCBhCisgKiB0cmFuc2NvZGVkIHNhbXBsZSBpdCBpcyB0aGUgY29uc3VtZXIncyByZXNwb25zaWJpbGl0eSB0byBhcyBzb29uIGFzIHBvc3NpYmxlIHJlbGVhc2UgYWxsCisgKiByZWZlcmVuY2VzIHRvIHRoYXQgc2FtcGxlIGluIG9yZGVyIHRvIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSB0cmFuc2NvZGVyLiBNZWRpYVRyYWNrVHJhbnNjb2RlcgorICogaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIGluc3RhbmNlcyBhcmUgY3JlYXRlZCB0aHJvdWdoIG9uZSBvZiB0aGUgY29uY3JldGUgc3ViY2xhc3Nlcy4KKyAqCisgKiBUaGUgYmFzZSBjbGFzcyBNZWRpYVRyYWNrVHJhbnNjb2RlciBpcyByZXNwb25zaWJsZSBmb3IgdGhyZWFkIGFuZCBzdGF0ZSBtYW5hZ2VtZW50IGFuZCBndWFyYW50ZWVzCisgKiB0aGF0IG9wZXJhdGlvbnMge2NvbmZpZ3VyZSwgc3RhcnQsIHN0b3B9IGFyZSBzZW50IHRvIHRoZSBkZXJpdmVkIGNsYXNzIGluIGNvcnJlY3Qgb3JkZXIuCisgKiBNZWRpYVRyYWNrVHJhbnNjb2RlciBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBkZWxpdmVyaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbnMgb25jZSB0aGUKKyAqIHRyYW5zY29kZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQuCisgKi8KK2NsYXNzIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIHRoZSB0cmFjayB0cmFuc2NvZGVyIHdpdGggYW4gaW5wdXQgTWVkaWFTYW1wbGVSZWFkZXIgYW5kIGEgZGVzdGluYXRpb24gZm9ybWF0LgorICAgICAqIEEgdHJhY2sgdHJhbnNjb2RlciBoYXZlIHRvIGJlIGNvbmZpZ3VyZWQgYmVmb3JlIGl0IGlzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIG1lZGlhU2FtcGxlUmVhZGVyIFRoZSBNZWRpYVNhbXBsZVJlYWRlciB0byByZWFkIGlucHV0IHNhbXBsZXMgZnJvbS4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCBUaGUgaW5kZXggb2YgdGhlIHRyYWNrIHRvIHRyYW5zY29kZSBpbiBtZWRpYVNhbXBsZVJlYWRlci4KKyAgICAgKiBAcGFyYW0gZGVzdGluYXRpb25Gb3JtYXQgVGhlIGRlc3RpbmF0aW9uIGZvcm1hdC4KKyAgICAgKiBAcmV0dXJuIEFNRURJQV9PSyBpZiB0aGUgdHJhY2sgdHJhbnNjb2RlciB3YXMgc3VjY2Vzc2Z1bGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgbWVkaWFfc3RhdHVzX3QgY29uZmlndXJlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4mIG1lZGlhU2FtcGxlUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgdHJhY2sgdHJhbnNjb2Rlci4gQWZ0ZXIgdGhlIHRyYWNrIHRyYW5zY29kZXIgaXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgaXQgd2lsbCBydW4KKyAgICAgKiB1bnRpbCBhIGNhbGxiYWNrIHNpZ25hbHMgdGhhdCB0cmFuc2NvZGluZyBoYXMgZW5kZWQuIFN0YXJ0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhY2sgdHJhbnNjb2RlciBzdGFydGVkLCBvciBmYWxzZSBpZiBpdCBoYWQgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQuCisgICAgICovCisgICAgYm9vbCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHRyYWNrIHRyYW5zY29kZXIuIE9uY2UgdGhlIHRyYW5zY29kaW5nIGhhcyBiZWVuIHN0b3BwZWQgaXQgY2Fubm90IGJlIHJlc3RhcnRlZAorICAgICAqIGFnYWluLiBJdCBpcyBzYWZlIHRvIGNhbGwgc3RvcCBtdWx0aXBsZSB0aW1lcy4gU3RvcCBpcyBhbiBhc3luY2hyb25vdXMgb3BlcmF0aW9uLiBPbmNlIHRoZQorICAgICAqIHRyYWNrIHRyYW5zY29kZXIgaGFzIHN0b3BwZWQgdGhlIG9uVHJhY2tTdG9wcGVkIGNhbGxiYWNrIHdpbGwgZ2V0IGNhbGxlZCwgdW5sZXNzIHRoZQorICAgICAqIHRyYW5zY29kaW5nIGZpbmlzaGVkIG9yIGVuY291bnRlcmVkIGFuIGVycm9yIGJlZm9yZSBpdCBjb3VsZCBiZSBzdG9wcGVkIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICogY2FsbGJhY2tzIGNvcnJlc3BvbmRpbmcgdG8gdGhvc2UgZXZlbnRzIHdpbGwgYmUgY2FsbGVkIGluc3RlYWQuCisgICAgICogQHBhcmFtIHN0b3BPblN5bmNTYW1wbGUgUmVxdWVzdCB0aGUgdHJhbnNjb2RlciB0byBzdG9wIGFmdGVyIGVtaXR0aW5nIGEgc3luYyBzYW1wbGUuCisgICAgICovCisgICAgdm9pZCBzdG9wKGJvb2wgc3RvcE9uU3luY1NhbXBsZSA9IGZhbHNlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2FtcGxlIGNvbnN1bWVyIGZ1bmN0aW9uLiBUaGUgTWVkaWFUcmFja1RyYW5zY29kZXIgd2lsbCBkZWxpdmVyIHRyYW5zY29kZWQgc2FtcGxlcyB0bworICAgICAqIHRoaXMgZnVuY3Rpb24uIElmIHRoZSBNZWRpYVRyYWNrVHJhbnNjb2RlciBpcyBzdGFydGVkIGJlZm9yZSBhIGNvbnN1bWVyIGlzIHNldCB0aGUgdHJhbnNjb2RlcgorICAgICAqIHdpbGwgYnVmZmVyIGEgbGltaXRlZCBudW1iZXIgb2Ygc2FtcGxlcyBpbnRlcm5hbGx5IGJlZm9yZSBzdGFsbGluZy4gT25jZSBhIGNvbnN1bWVyIGhhcyBiZWVuCisgICAgICogc2V0IHRoZSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIHNhbXBsZXMgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdGhlIGNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBzYW1wbGVDb25zdW1lciBUaGUgc2FtcGxlIGNvbnN1bWVyIGZ1bmN0aW9uLgorICAgICAqLworICAgIHZvaWQgc2V0U2FtcGxlQ29uc3VtZXIoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiYgc2FtcGxlQ29uc3VtZXIpOworCisgICAgLyoqCisgICAgICAqIFJldHJpZXZlcyB0aGUgdHJhY2sgdHJhbnNjb2RlcidzIGZpbmFsIG91dHB1dCBmb3JtYXQuIFRoZSBvdXRwdXQgaXMgYXZhaWxhYmxlIGFmdGVyIHRoZQorICAgICAgKiB0cmFjayB0cmFuc2NvZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkLgorICAgICAgKiBAcmV0dXJuIFRoZSB0cmFjayBvdXRwdXQgZm9ybWF0LgorICAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IGdldE91dHB1dEZvcm1hdCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tUcmFuc2NvZGVyKCkgPSBkZWZhdWx0OworCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFUcmFja1RyYW5zY29kZXIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiYgdHJhbnNjb2RlckNhbGxiYWNrKQorICAgICAgICAgIDogbVRyYW5zY29kZXJDYWxsYmFjayh0cmFuc2NvZGVyQ2FsbGJhY2spe307CisKKyAgICAvLyBDYWxsZWQgYnkgc3ViY2xhc3NlcyB3aGVuIHRoZSBhY3R1YWwgdHJhY2sgZm9ybWF0IGJlY29tZXMgYXZhaWxhYmxlLgorICAgIHZvaWQgbm90aWZ5VHJhY2tGb3JtYXRBdmFpbGFibGUoKTsKKworICAgIC8vIENhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW4gYSB0cmFuc2NvZGVkIHNhbXBsZSBpcyBhdmFpbGFibGUuIFNhbXBsZXMgbXVzdCBub3QgaG9sZCBhIHN0cm9uZworICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgdHJhY2sgdHJhbnNjb2RlciBpbiBvcmRlciB0byBhdm9pZCByZXRhaW4gY3ljbGVzIHRocm91Z2ggdGhlIHRyYWNrCisgICAgLy8gdHJhbnNjb2RlcidzIHNhbXBsZSBxdWV1ZS4KKyAgICB2b2lkIG9uT3V0cHV0U2FtcGxlQXZhaWxhYmxlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSk7CisKKyAgICAvLyBjb25maWd1cmVEZXN0aW5hdGlvbkZvcm1hdCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzLCBhbmQgZ2V0cyBjYWxsZWQgb24gYW4KKyAgICAvLyBleHRlcm5hbCB0aHJlYWQgYmVmb3JlIHN0YXJ0LgorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgY29uZmlndXJlRGVzdGluYXRpb25Gb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiYgZGVzdGluYXRpb25Gb3JtYXQpID0gMDsKKworICAgIC8vIHJ1blRyYW5zY29kZUxvb3AgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcywgYW5kIGdldHMgY2FsbGVkIG9uCisgICAgLy8gTWVkaWFUcmFja1RyYW5zY29kZXIncyBpbnRlcm5hbCB0aHJlYWQgd2hlbiB0aGUgdHJhY2sgdHJhbnNjb2RlciBpcyBzdGFydGVkLgorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSA9IDA7CisKKyAgICAvLyBhYm9ydFRyYW5zY29kZUxvb3AgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcywgYW5kIHNob3VsZCByZXF1ZXN0IHRyYW5zY29kaW5nIHRvCisgICAgLy8gYmUgYWJvcnRlZCBhcyBzb29uIGFzIHBvc3NpYmxlLiBJdCBzaG91bGQgYmUgc2FmZSB0byBjYWxsIGFib3J0VHJhbnNjb2RlTG9vcCBtdWx0aXBsZSB0aW1lcy4KKyAgICB2aXJ0dWFsIHZvaWQgYWJvcnRUcmFuc2NvZGVMb29wKCkgPSAwOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBtTWVkaWFTYW1wbGVSZWFkZXI7CisgICAgaW50IG1UcmFja0luZGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1Tb3VyY2VGb3JtYXQ7CisKKyAgICBlbnVtIFN0b3BSZXF1ZXN0IHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgU1RPUF9OT1csCisgICAgICAgIFNUT1BfT05fU1lOQywKKyAgICB9OworICAgIHN0ZDo6YXRvbWljPFN0b3BSZXF1ZXN0PiBtU3RvcFJlcXVlc3QgPSBOT05FOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbVNhbXBsZU11dGV4OworICAgIC8vIFNhbXBsZVF1ZXVlIGZvciBidWZmZXJpbmcgb3V0cHV0IHNhbXBsZXMgYmVmb3JlIGEgc2FtcGxlIGNvbnN1bWVyIGhhcyBiZWVuIHNldC4KKyAgICBNZWRpYVNhbXBsZVF1ZXVlIG1TYW1wbGVRdWV1ZSBHVUFSREVEX0JZKG1TYW1wbGVNdXRleCk7CisgICAgTWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiBtU2FtcGxlQ29uc3VtZXIgR1VBUkRFRF9CWShtU2FtcGxlTXV0ZXgpOworICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8TWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4gbVRyYW5zY29kZXJDYWxsYmFjazsKKyAgICBzdGQ6Om11dGV4IG1TdGF0ZU11dGV4OworICAgIGVudW0geworICAgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgICBDT05GSUdVUkVELAorICAgICAgICBTVEFSVEVELAorICAgICAgICBTVE9QUEVELAorICAgIH0gbVN0YXRlIEdVQVJERURfQlkobVN0YXRlTXV0ZXgpID0gVU5JTklUSUFMSVpFRDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfVFJBQ0tfVFJBTlNDT0RFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MmQ0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2suaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RSQUNLX1RSQU5TQ09ERVJfQ0FMTEJBQ0tfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RSQUNLX1RSQU5TQ09ERVJfQ0FMTEJBQ0tfSAorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhVHJhY2tUcmFuc2NvZGVyOworCisvKiogQ2FsbGJhY2sgaW50ZXJmYWNlIGZvciBNZWRpYVRyYWNrVHJhbnNjb2Rlci4gKi8KK2NsYXNzIE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBNZWRpYVRyYWNrVHJhbnNjb2RlcidzIGFjdHVhbCB0cmFjayBmb3JtYXQgYmVjb21lcyBhdmFpbGFibGUuCisgICAgICogQHBhcmFtIHRyYW5zY29kZXIgVGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHdob3NlIHRyYWNrIGZvcm1hdCBiZWNvbWVzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja0Zvcm1hdEF2YWlsYWJsZShjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2Rlcik7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGluc3RhbmNlIGhhdmUgZmluaXNoZWQgdHJhbnNjb2RpbmcgYWxsIG1lZGlhIHNhbXBsZXMKKyAgICAgKiBzdWNjZXNzZnVsbHkuCisgICAgICogQHBhcmFtIHRyYW5zY29kZXIgVGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHRoYXQgZmluaXNoZWQgdGhlIHRyYW5zY29kaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRmluaXNoZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGluc3RhbmNlIHdhcyBleHBsaWNpdGx5IHN0b3BwZWQgYmVmb3JlIGl0IHdhcyBmaW5pc2hlZC4KKyAgICAgKiBAcGFyYW0gdHJhbnNjb2RlciBUaGUgTWVkaWFUcmFja1RyYW5zY29kZXIgdGhhdCB3YXMgc3RvcHBlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja1N0b3BwZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIGluc3RhbmNlIGVuY291bnRlcmVkIGFuIGVycm9yIGl0IGNvdWxkIG5vdCByZWNvdmVyIGZyb20uCisgICAgICogQHBhcmFtIHRyYW5zY29kZXIgVGhlIE1lZGlhVHJhY2tUcmFuc2NvZGVyIHRoYXQgZW5jb3VudGVyZWQgdGhlIGVycm9yLgorICAgICAqIEBwYXJhbSBzdGF0dXMgVGhlIG5vbi16ZXJvIGVycm9yIGNvZGUgZGVzY3JpYmluZyB0aGUgZW5jb3VudGVyZWQgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tFcnJvcihjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2soKSA9IGRlZmF1bHQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQUNLX1RSQU5TQ09ERVJfQ0FMTEJBQ0tfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFuc2NvZGVyLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYW5zY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc2ZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFuc2NvZGVyLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFJBTlNDT0RFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfVFJBTlNDT0RFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9hdXRvX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYVNhbXBsZVJlYWRlcjsKKworY2xhc3MgTWVkaWFUcmFuc2NvZGVyIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TWVkaWFUcmFuc2NvZGVyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgLyoqIENhbGxiYWNrcyBmcm9tIHRyYW5zY29kZXIgdG8gY2xpZW50LiAqLworICAgIGNsYXNzIENhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBUcmFuc2NvZGVyIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKSA9IDA7CisKKyAgICAgICAgLyoqIFRyYW5zY29kZXIgZW5jb3VudGVyZWQgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4gKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyLCBtZWRpYV9zdGF0dXNfdCBlcnJvcikgPSAwOworCisgICAgICAgIC8qKiBUcmFuc2NvZGVyIHByb2dyZXNzIHVwZGF0ZSByZXBvcnRlZCBpbiBwZXJjZW50IGZyb20gMCB0byAxMDAuICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblByb2dyZXNzVXBkYXRlKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciwgaW50MzJfdCBwcm9ncmVzcykgPSAwOworCisgICAgICAgIC8qKiBUcmFuc2NvZGVyIGhlYXJ0LWJlYXQgc2lnbmFsLiAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyKSA9IDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zY29kZXIgbG9zdCBjb2RlYyByZXNvdXJjZXMgYW5kIHBhdXNlZCBvcGVyYXRpb25zLiBUaGUgY2xpZW50IGNhbiByZXN1bWUgdHJhbnNjb2RpbmcKKyAgICAgICAgICogYWdhaW4gd2hlbiByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBieSBlaXRoZXI6CisgICAgICAgICAqICAgMSkgQ2FsbGluZyByZXN1bWUgb24gdGhlIHNhbWUgTWVkaWFUcmFuc2NvZGVyIGluc3RhbmNlLgorICAgICAgICAgKiAgIDIpIENyZWF0aW5nIGEgbmV3IE1lZGlhVHJhbnNjb2RpbmcgaW5zdGFuY2Ugd2l0aCB0aGUgcGF1c2VkIHN0YXRlIGFuZCB0aGVuIGNhbGxpbmcKKyAgICAgICAgICogICAgICByZXN1bWUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIHZvaWQgb25Db2RlY1Jlc291cmNlTG9zdCgKKyAgICAgICAgICAgICAgICBjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB+Q2FsbGJhY2tJbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTWVkaWFUcmFuc2NvZGVyIGluc3RhbmNlLiBJZiB0aGUgc3VwcGxpZWQgcGF1c2VkIHN0YXRlIGlzIHZhbGlkLCB0aGUgdHJhbnNjb2RlcgorICAgICAqIHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcGF1c2VkIHN0YXRlIGFuZCBiZSByZWFkeSB0byBiZSByZXN1bWVkIHJpZ2h0IGF3YXkuIEl0IGlzIG5vdAorICAgICAqIHBvc3NpYmxlIHRvIGNoYW5nZSBhbnkgY29uZmlndXJhdGlvbnMgb24gYSBwYXVzZWQgdHJhbnNjb2Rlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhbnNjb2Rlcj4gY3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2tzLCBpbnQ2NF90IGhlYXJ0QmVhdEludGVydmFsVXMgPSAtMSwKKyAgICAgICAgICAgIHBpZF90IHBpZCA9IEFNRURJQUNPREVDX0NBTExJTkdfUElELCB1aWRfdCB1aWQgPSBBTUVESUFDT0RFQ19DQUxMSU5HX1VJRCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZSA9IG51bGxwdHIpOworCisgICAgLyoqIENvbmZpZ3VyZXMgc291cmNlIGZyb20gcGF0aCBmZC4gKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBjb25maWd1cmVTb3VyY2UoaW50IGZkKTsKKworICAgIC8qKiBHZXRzIHRoZSBtZWRpYSBmb3JtYXRzIG9mIGFsbCB0cmFja3MgaW4gdGhlIGZpbGUuICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IGdldFRyYWNrRm9ybWF0cygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyB0cmFuc2NvZGluZyBvZiBhIHRyYWNrLiBUcmFja3MgdGhhdCBhcmUgbm90IGNvbmZpZ3VyZWQgd2lsbCBub3QgcHJlc2VudCBpbiB0aGUKKyAgICAgKiBmaW5hbCB0cmFuc2NvZGVkIGZpbGUsIGkuZS4gdHJhY2tzIHdpbGwgYmUgZHJvcHBlZCBieSBkZWZhdWx0LiBQYXNzaW5nIG51bGxwdHIgZm9yCisgICAgICogdHJhY2tGb3JtYXQgbWVhbnMgdGhlIHRyYWNrIHdpbGwgYmUgY29waWVkIHVuY2hhbmdlZCAoInBhc3N0aHJvdWdoIikgdG8gdGhlIGRlc3RpbmF0aW9uLgorICAgICAqIFRyYWNrIGNvbmZpZ3VyYXRpb25zIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgc291cmNlIGhhcyBiZWVuIGNvbmZpZ3VyZWQuCisgICAgICogTm90ZTogdHJhY2tGb3JtYXQgaXMgbm90IG1vZGlmaWVkIGJ1dCBjYW5ub3QgYmUgY29uc3QuCisgICAgICovCisgICAgbWVkaWFfc3RhdHVzX3QgY29uZmlndXJlVHJhY2tGb3JtYXQoc2l6ZV90IHRyYWNrSW5kZXgsIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQpOworCisgICAgLyoqIENvbmZpZ3VyZXMgZGVzdGluYXRpb24gZnJvbSBmZC4gKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBjb25maWd1cmVEZXN0aW5hdGlvbihpbnQgZmQpOworCisgICAgLyoqIFN0YXJ0cyB0cmFuc2NvZGluZy4gTm8gY29uZmlndXJhdGlvbnMgY2FuIGJlIG1hZGUgb25jZSB0aGUgdHJhbnNjb2RlciBoYXMgc3RhcnRlZC4gKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogUGF1c2VzIHRyYW5zY29kaW5nIGFuZCBmaW5hbGl6ZXMgdGhlIHBhcnRpYWwgdHJhbnNjb2RlZCBmaWxlIHRvIGRpc2suIFBhdXNlIGlzIGEgc3luY2hyb25vdXMKKyAgICAgKiBvcGVyYXRpb24gYW5kIHdpbGwgd2FpdCB1bnRpbCBhbGwgaW50ZXJuYWwgY29tcG9uZW50cyBhcmUgZG9uZS4gT25jZSB0aGlzIG1ldGhvZCByZXR1cm5zIGl0CisgICAgICogaXMgc2FmZSB0byByZWxlYXNlIHRoZSB0cmFuc2NvZGVyIGluc3RhbmNlLiBObyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpZiB0aGUgdHJhbnNjb2RlciB3YXMKKyAgICAgKiBwYXVzZWQgc3VjY2Vzc2Z1bGx5LiBCdXQgaWYgdGhlIHRyYW5zY29kaW5nIGZpbmlzaGVzIG9yIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBwYXVzZSwKKyAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKi8KKyAgICBtZWRpYV9zdGF0dXNfdCBwYXVzZShzdGQ6OnNoYXJlZF9wdHI8bmRrOjpTY29wZWRBUGFyY2VsPiogcGF1c2VkU3RhdGUpOworCisgICAgLyoqIFJlc3VtZXMgYSBwYXVzZWQgdHJhbnNjb2RpbmcuICovCisgICAgbWVkaWFfc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWxzIHRoZSB0cmFuc2NvZGluZy4gT25jZSBjYW5jZWxlZCB0aGUgdHJhbnNjb2RpbmcgY2FuIG5vdCBiZSByZXN0YXJ0ZWQuIENsaWVudAorICAgICAqIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIHVwIHRoZSBhYmFuZG9uZWQgZmlsZS4gQ2FuY2VsIGlzIGEgc3luY2hyb25vdXMgb3BlcmF0aW9uIGFuZAorICAgICAqIHdpbGwgd2FpdCB1bnRpbCBhbGwgaW50ZXJuYWwgY29tcG9uZW50cyBhcmUgZG9uZS4gT25jZSB0aGlzIG1ldGhvZCByZXR1cm5zIGl0IGlzIHNhZmUgdG8KKyAgICAgKiByZWxlYXNlIHRoZSB0cmFuc2NvZGVyIGluc3RhbmNlLiBOb3JtYWxseSBubyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB0cmFuc2NvZGVyIGlzCisgICAgICogY2FuY2VsbGVkLiBCdXQgaWYgdGhlIHRyYW5zY29kaW5nIGZpbmlzaGVzIG9yIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyBjYW5jZWwsIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQuCisgICAgICovCisgICAgbWVkaWFfc3RhdHVzX3QgY2FuY2VsKCk7CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kZXIoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgTWVkaWFUcmFuc2NvZGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBoZWFydEJlYXRJbnRlcnZhbFVzLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisKKyAgICAvLyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrCisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tGb3JtYXRBdmFpbGFibGUoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrRmluaXNoZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvblRyYWNrU3RvcHBlZChjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2Rlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uVHJhY2tFcnJvcihjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cykgb3ZlcnJpZGU7CisgICAgLy8gfk1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sKKworICAgIC8vIE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIsIG1lZGlhX3N0YXR1c190IHN0YXR1cykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyLCBpbnQzMl90IHByb2dyZXNzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlcikgb3ZlcnJpZGU7CisgICAgLy8gfk1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorCisgICAgdm9pZCBvblRocmVhZEZpbmlzaGVkKGNvbnN0IHZvaWQqIHRocmVhZCwgbWVkaWFfc3RhdHVzX3QgdGhyZWFkU3RhdHVzLCBib29sIHRocmVhZFN0b3BwZWQpOworICAgIG1lZGlhX3N0YXR1c190IHJlcXVlc3RTdG9wKGJvb2wgc3RvcE9uU3luYyk7CisgICAgdm9pZCB3YWl0Rm9yVGhyZWFkcygpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENhbGxiYWNrSW50ZXJmYWNlPiBtQ2FsbGJhY2tzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbVNhbXBsZVJlYWRlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IG1TYW1wbGVXcml0ZXI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IG1Tb3VyY2VUcmFja0Zvcm1hdHM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyPj4gbVRyYWNrVHJhbnNjb2RlcnM7CisgICAgc3RkOjptdXRleCBtVHJhY2tzQWRkZWRNdXRleDsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8Y29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqPiBtVHJhY2tzQWRkZWQgR1VBUkRFRF9CWShtVHJhY2tzQWRkZWRNdXRleCk7CisgICAgaW50NjRfdCBtSGVhcnRCZWF0SW50ZXJ2YWxVczsKKyAgICBwaWRfdCBtUGlkOworICAgIHVpZF90IG1VaWQ7CisKKyAgICBlbnVtIFRocmVhZFN0YXRlIHsKKyAgICAgICAgUEVORElORyA9IDAsICAvLyBOb3QgeWV0IHN0YXJ0ZWQuCisgICAgICAgIFJVTk5JTkcsICAgICAgLy8gQ3VycmVudGx5IHJ1bm5pbmcuCisgICAgICAgIERPTkUsICAgICAgICAgLy8gRG9uZSBydW5uaW5nIChjYW4gYmUgZmluaXNoZWQsIHN0b3BwZWQgb3IgZXJyb3IpLgorICAgIH07CisgICAgc3RkOjptdXRleCBtVGhyZWFkU3RhdGVNdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtVGhyZWFkc0RvbmVTaWduYWw7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGNvbnN0IHZvaWQqLCBUaHJlYWRTdGF0ZT4gbVRocmVhZFN0YXRlcyBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KTsKKyAgICBtZWRpYV9zdGF0dXNfdCBtVHJhbnNjb2RlclN0YXR1cyBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IEFNRURJQV9PSzsKKyAgICBib29sIG1UcmFuc2NvZGVyU3RvcHBlZCBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IGZhbHNlOworICAgIGJvb2wgbVRocmVhZHNEb25lIEdVQVJERURfQlkobVRocmVhZFN0YXRlTXV0ZXgpID0gZmFsc2U7CisgICAgYm9vbCBtQ2FsbGJhY2tTZW50IEdVQVJERURfQlkobVRocmVhZFN0YXRlTXV0ZXgpID0gZmFsc2U7CisgICAgYm9vbCBtU2FtcGxlV3JpdGVyU3RvcHBlZCBHVUFSREVEX0JZKG1UaHJlYWRTdGF0ZU11dGV4KSA9IGZhbHNlOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtQ2FuY2VsbGVkID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1RSQU5TQ09ERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTmRrQ29tbW9uLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9OZGtDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDQxOTIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvTmRrQ29tbW9uLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKKworLy8gVE9ETyhiLzE0NjQyMDk5MCkKKy8vIFRPRE86IG1ha2UgTWVkaWFUcmFuc2NvZGVyIHVzZSB0aGUgY29uc3RzIGZyb20gdGhpcyBoZWFkZXIuCit0eXBlZGVmIGVudW0geworICAgIE9VVFBVVF9GT1JNQVRfU1RBUlQgPSAwLAorICAgIE9VVFBVVF9GT1JNQVRfTVBFR180ID0gT1VUUFVUX0ZPUk1BVF9TVEFSVCwKKyAgICBPVVRQVVRfRk9STUFUX1dFQk0gPSBPVVRQVVRfRk9STUFUX1NUQVJUICsgMSwKKyAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyAyLAorICAgIE9VVFBVVF9GT1JNQVRfSEVJRiA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyAzLAorICAgIE9VVFBVVF9GT1JNQVRfT0dHID0gT1VUUFVUX0ZPUk1BVF9TVEFSVCArIDQsCisgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCA9IE9VVFBVVF9GT1JNQVRfU1RBUlQgKyA0LAorfSBNdXhlckZvcm1hdDsKKworLy8gQ29sb3IgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgZW5jb2RlciAtIHNob3VsZCBtaXJyb3Igc3VwcG9ydGVkQ29sb3JMaXN0CisvLyBmcm9tIE1lZGlhQ29kZWNDb25zdGFudHMuaCAoYXJlIHRoZXNlIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQpCitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyID0gMjE7CitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSA9IDB4N0Y0MjA4ODg7CitzdGF0aWMgY29uc3RleHByIGludCBDT0xPUl9Gb3JtYXRTdXJmYWNlID0gMHg3ZjAwMDc4OTsKKworLy8gQ29sb3IgdHJhbnNmZXIgZnVuY3Rpb25zIGRlZmluZWQgYnkgTWVkaWFDb2RlY0NvbnN0YW50cy5oIGJ1dCBub3QgaW4gTkRLCitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfSExHID0gNzsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9UUkFOU0ZFUl9MSU5FQVIgPSAxOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyA9IDM7CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ09MT1JfVFJBTlNGRVJfU1QyMDg0ID0gNjsKKworLy8gY29uc3RhbnRzIG5vdCBkZWZpbmVkIGluIE5ESworZXh0ZXJuIGNvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0FMTE9XX0ZSQU1FX0RST1A7CitleHRlcm4gY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FOworZXh0ZXJuIGNvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEU7CitleHRlcm4gY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfTUFYX0JfRlJBTUVTOworZXh0ZXJuIGNvbnN0IGNoYXIqIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0NPTE9SX1RSQU5TRkVSX1JFUVVFU1Q7CitleHRlcm4gY29uc3QgY2hhciogVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQkFDS0dST1VORF9NT0RFOworc3RhdGljIGNvbnN0ZXhwciBpbnQgVEJEX0FNRURJQUNPREVDX0JVRkZFUl9GTEFHX0tFWV9GUkFNRSA9IDB4MTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0JpdHJhdGVNb2RlQ29uc3RhbnQgPSAyOworCituYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMgeworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhcioga2V5OworICAgIGJvb2wgKCpjb3B5KShjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7CisgICAgYm9vbCAoKmNvcHkyKShjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7Cit9IEVudHJ5Q29waWVyOworCisjZGVmaW5lIEVOVFJZX0NPUElFUihrZXlOYW1lLCB0eXBlTmFtZSkgXAorICAgIHsga2V5TmFtZSwgQU1lZGlhRm9ybWF0VXRpbHM6OkNvcHlGb3JtYXRFbnRyeSMjdHlwZU5hbWUsIG51bGxwdHIgfQorI2RlZmluZSBFTlRSWV9DT1BJRVIyKGtleU5hbWUsIHR5cGVOYW1lLCB0eXBlTmFtZTIpICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrZXlOYW1lLCBBTWVkaWFGb3JtYXRVdGlsczo6Q29weUZvcm1hdEVudHJ5IyN0eXBlTmFtZSwgXAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdFV0aWxzOjpDb3B5Rm9ybWF0RW50cnkjI3R5cGVOYW1lMiAgXAorICAgIH0KKworYm9vbCBDb3B5Rm9ybWF0RW50cnlTdHJpbmcoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8pOworYm9vbCBDb3B5Rm9ybWF0RW50cnlJbnQ2NChjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0byk7Citib29sIENvcHlGb3JtYXRFbnRyeUludDMyKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmcm9tLCBBTWVkaWFGb3JtYXQqIHRvKTsKK2Jvb2wgQ29weUZvcm1hdEVudHJ5RmxvYXQoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIGZyb20sIEFNZWRpYUZvcm1hdCogdG8pOworCit2b2lkIENvcHlGb3JtYXRFbnRyaWVzKEFNZWRpYUZvcm1hdCogZnJvbSwgQU1lZGlhRm9ybWF0KiB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RW50cnlDb3BpZXI+JiBlbnRyaWVzKTsKKworYm9vbCBTZXREZWZhdWx0Rm9ybWF0VmFsdWVGbG9hdChjb25zdCBjaGFyKiBrZXksIEFNZWRpYUZvcm1hdCogZm9ybWF0LCBmbG9hdCB2YWx1ZSk7Citib29sIFNldERlZmF1bHRGb3JtYXRWYWx1ZUludDMyKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGludDMyX3QgdmFsdWUpOworCitib29sIFZpZGVvSXNIZHIoQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworCit9ICAvLyBuYW1lc3BhY2UgQU1lZGlhRm9ybWF0VXRpbHMKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9UUkFOU0NPRElOR19OREtfQ09NTU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci9pbmNsdWRlL21lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNzQ4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBU1NUSFJPVUdIX1RSQUNLX1RSQU5TQ09ERVJfSAorI2RlZmluZSBBTkRST0lEX1BBU1NUSFJPVUdIX1RSQUNLX1RSQU5TQ09ERVJfSAorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogVHJhY2sgdHJhbnNjb2RlciBmb3IgcGFzc3Rocm91Z2ggbW9kZS4gUGFzc3Rocm91Z2ggbW9kZSBjb3BpZXMgc2FtcGxlIGRhdGEgZnJvbSBhIHRyYWNrIHVuY2hhbmdlZAorICogZnJvbSBzb3VyY2UgZmlsZSB0byBkZXN0aW5hdGlvbiBmaWxlLiBUaGlzIHRyYWNrIHRyYW5zY29kZXIgdXNlcyBhbiBpbnRlcm5hbCBwb29sIG9mIGJ1ZmZlcnMuCisgKiBXaGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgYW5kIGFsbCBvZiB0aGVtIGFyZSB3YWl0aW5nIG9uIHRoZSBvdXRwdXQgcXVldWUKKyAqIHRoZSB0cmFuc2NvZGVyIHdpbGwgc3RhbGwgdW50aWwgc2FtcGxlcyBhcmUgZGVxdWV1ZWQgZnJvbSB0aGUgb3V0cHV0IHF1ZXVlIGFuZCByZWxlYXNlZC4KKyAqLworY2xhc3MgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIgOiBwdWJsaWMgTWVkaWFUcmFja1RyYW5zY29kZXIgeworcHVibGljOgorICAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZCBhdCBhIGdpdmVuIHRpbWUuICovCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEJ1ZmZlckNvdW50RGVmYXVsdCA9IDE2OworCisgICAgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPE1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2s+JiB0cmFuc2NvZGVyQ2FsbGJhY2spCisgICAgICAgICAgOiBNZWRpYVRyYWNrVHJhbnNjb2Rlcih0cmFuc2NvZGVyQ2FsbGJhY2spLAorICAgICAgICAgICAgbUJ1ZmZlclBvb2woc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sPihrTWF4QnVmZmVyQ291bnREZWZhdWx0KSl7fTsKKyAgICB2aXJ0dWFsIH5QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyUG9vbFRlc3RzOworCisgICAgLyoqIENsYXNzIHRvIHBvb2wgYW5kIHJldXNlIGJ1ZmZlcnMuICovCisgICAgY2xhc3MgQnVmZmVyUG9vbCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBCdWZmZXJQb29sKGludCBtYXhCdWZmZXJDb3VudCkgOiBtTWF4QnVmZmVyQ291bnQobWF4QnVmZmVyQ291bnQpe307CisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHJpZXZlIGEgYnVmZmVyIGZyb20gdGhlIHBvb2wuIEJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBvbiBkZW1hbmQuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sKKyAgICAgICAgICogaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgaXMgcmVhY2hlZCBhbmQgdGhlcmUgYXJlIG5vIGZyZWUgYnVmZmVycyBhdmFpbGFibGUuCisgICAgICAgICAqIEBwYXJhbSBtaW5pbXVtQnVmZmVyU2l6ZSBUaGUgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1ZmZlciBvciBudWxscHRyIGlmIGFsbG9jYXRpb24gZmFpbGVkIG9yIHRoZSBwb29sIHdhcyBhYm9ydGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdWludDhfdCogZ2V0QnVmZmVyV2l0aFNpemUoc2l6ZV90IG1pbmltdW1CdWZmZXJTaXplKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBwb29sLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBidWZmZXIgdG8gcmV0dXJuLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZXR1cm5CdWZmZXIodWludDhfdCogYnVmZmVyKTsKKworICAgICAgICAvKiogV2FrZXMgdXAgdGhyZWFkcyB3YWl0aW5nIG9uIGJ1ZmZlcnMgYW5kIHByZXZlbnRzIG5ldyBidWZmZXJzIGZyb20gYmVpbmcgcmV0dXJuZWQuICovCisgICAgICAgIHZvaWQgYWJvcnQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBidWZmZXJzIGF0IGEgdGltZS4KKyAgICAgICAgY29uc3QgaW50IG1NYXhCdWZmZXJDb3VudDsKKworICAgICAgICAvLyBNYXAgY29udGFpbmluZyBhbGwgdHJhY2tlZCBidWZmZXJzLgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCosIHNpemVfdD4gbUFkZHJlc3NTaXplTWFwIEdVQVJERURfQlkobU11dGV4KTsKKworICAgICAgICAvLyBNYXAgY29udGFpbmluZyB0aGUgY3VycmVudGx5IGZyZWUgYnVmZmVycy4KKyAgICAgICAgc3RkOjptdWx0aW1hcDxzaXplX3QsIHVpbnQ4X3QqPiBtRnJlZUJ1ZmZlck1hcCBHVUFSREVEX0JZKG1NdXRleCk7CisKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgICAgIGJvb2wgbUFib3J0ZWQgR1VBUkRFRF9CWShtTXV0ZXgpID0gZmFsc2U7CisgICAgfTsKKworICAgIC8vIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisgICAgbWVkaWFfc3RhdHVzX3QgcnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIGFib3J0VHJhbnNjb2RlTG9vcCgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KSBvdmVycmlkZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAvLyB+TWVkaWFUcmFja1RyYW5zY29kZXIKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sPiBtQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjZW5kaWYgIC8vIEFORFJPSURfUEFTU1RIUk9VR0hfVFJBQ0tfVFJBTlNDT0RFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvaW5jbHVkZS9tZWRpYS9WaWRlb1RyYWNrVHJhbnNjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTcyODgyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL2luY2x1ZGUvbWVkaWEvVmlkZW9UcmFja1RyYW5zY29kZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9WSURFT19UUkFDS19UUkFOU0NPREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9WSURFT19UUkFDS19UUkFOU0NPREVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRyYWNrIHRyYW5zY29kZXIgZm9yIHZpZGVvIHRyYWNrcy4gVmlkZW9UcmFja1RyYW5zY29kZXIgdXNlcyBBTWVkaWFDb2RlYyBmcm9tIHRoZSBNZWRpYSBOREsKKyAqIGludGVybmFsbHkuIFRoZSB0d28gbWVkaWEgY29kZWNzIGFyZSBydW4gaW4gYXN5bmNocm9ub3VzIG1vZGUgYW5kIHNoYXJlcyB1bmNvbXByZXNzZWQgYnVmZmVycworICogdXNpbmcgYSBuYXRpdmUgc3VyZmFjZSAoQU5hdGl2ZVdpbmRvdykuIENvZGVjIGNhbGxiYWNrIGV2ZW50cyBhcmUgcGxhY2VkIG9uIGEgbWVzc2FnZSBxdWV1ZSBhbmQKKyAqIHNlcnZpY2VkIGluIG9yZGVyIG9uIHRoZSB0cmFuc2NvZGluZyB0aHJlYWQgbWFuYWdlZCBieSBNZWRpYVRyYWNrVHJhbnNjb2Rlci4KKyAqLworY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXIgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYVRyYWNrVHJhbnNjb2RlciB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4gY3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiYgdHJhbnNjb2RlckNhbGxiYWNrLAorICAgICAgICAgICAgcGlkX3QgcGlkID0gQU1FRElBQ09ERUNfQ0FMTElOR19QSUQsIHVpZF90IHVpZCA9IEFNRURJQUNPREVDX0NBTExJTkdfVUlEKTsKKworICAgIHZpcnR1YWwgflZpZGVvVHJhY2tUcmFuc2NvZGVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBBc3luY0NvZGVjQ2FsbGJhY2tEaXNwYXRjaDsKKyAgICBmcmllbmQgY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0czsKKworICAgIC8vIE1pbmltYWwgYmxvY2tpbmcgcXVldWUgdXNlZCBhcyBhIG1lc3NhZ2UgcXVldWUgYnkgVmlkZW9UcmFja1RyYW5zY29kZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgQmxvY2tpbmdRdWV1ZSB7CisgICAgcHVibGljOgorICAgICAgICB2b2lkIHB1c2goVCBjb25zdCYgdmFsdWUsIGJvb2wgZnJvbnQgPSBmYWxzZSk7CisgICAgICAgIFQgcG9wKCk7CisgICAgICAgIHZvaWQgYWJvcnQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgICAgICBzdGQ6OmRlcXVlPFQ+IG1RdWV1ZTsKKyAgICAgICAgYm9vbCBtQWJvcnRlZCA9IGZhbHNlOworICAgIH07CisgICAgY2xhc3MgQ29kZWNXcmFwcGVyOworCisgICAgVmlkZW9UcmFja1RyYW5zY29kZXIoY29uc3Qgc3RkOjp3ZWFrX3B0cjxNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPiYgdHJhbnNjb2RlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwgdWlkX3QgdWlkKQorICAgICAgICAgIDogTWVkaWFUcmFja1RyYW5zY29kZXIodHJhbnNjb2RlckNhbGxiYWNrKSwgbVBpZChwaWQpLCBtVWlkKHVpZCl7fTsKKworICAgIC8vIE1lZGlhVHJhY2tUcmFuc2NvZGVyCisgICAgbWVkaWFfc3RhdHVzX3QgcnVuVHJhbnNjb2RlTG9vcChib29sKiBzdG9wcGVkKSBvdmVycmlkZTsKKyAgICB2b2lkIGFib3J0VHJhbnNjb2RlTG9vcCgpIG92ZXJyaWRlOworICAgIG1lZGlhX3N0YXR1c190IGNvbmZpZ3VyZURlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4mIGRlc3RpbmF0aW9uRm9ybWF0KSBvdmVycmlkZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBnZXRPdXRwdXRGb3JtYXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAvLyB+TWVkaWFUcmFja1RyYW5zY29kZXIKKworICAgIC8vIEVucXVldWVzIGFuIGlucHV0IHNhbXBsZSB3aXRoIHRoZSBkZWNvZGVyLgorICAgIHZvaWQgZW5xdWV1ZUlucHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgpOworCisgICAgLy8gTW92ZXMgYSBkZWNvZGVkIGJ1ZmZlciBmcm9tIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0IHRvIHRoZSBlbmNvZGVyJ3MgaW5wdXQuCisgICAgdm9pZCB0cmFuc2ZlckJ1ZmZlcihpbnQzMl90IGJ1ZmZlckluZGV4LCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gYnVmZmVySW5mbyk7CisKKyAgICAvLyBEZXF1ZXVlcyBhbiBlbmNvZGVkIGJ1ZmZlciBmcm9tIHRoZSBlbmNvZGVyIGFuZCBhZGRzIGl0IHRvIHRoZSBvdXRwdXQgcXVldWUuCisgICAgdm9pZCBkZXF1ZXVlT3V0cHV0U2FtcGxlKGludDMyX3QgYnVmZmVySW5kZXgsIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBidWZmZXJJbmZvKTsKKworICAgIC8vIFVwZGF0ZXMgdGhlIHZpZGVvIHRyYWNrJ3MgYWN0dWFsIGZvcm1hdCBiYXNlZCBvbiBlbmNvZGVyIGFuZCBkZWNvZGVyIG91dHB1dCBmb3JtYXQuCisgICAgdm9pZCB1cGRhdGVUcmFja0Zvcm1hdChBTWVkaWFGb3JtYXQqIG91dHB1dEZvcm1hdCwgYm9vbCBmcm9tRGVjb2Rlcik7CisKKyAgICBBTWVkaWFDb2RlYyogbURlY29kZXIgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlY1dyYXBwZXI+IG1FbmNvZGVyOworICAgIEFOYXRpdmVXaW5kb3cqIG1TdXJmYWNlID0gbnVsbHB0cjsKKyAgICBib29sIG1Fb3NGcm9tU291cmNlID0gZmFsc2U7CisgICAgYm9vbCBtRW9zRnJvbUVuY29kZXIgPSBmYWxzZTsKKyAgICBib29sIG1MYXN0U2FtcGxlV2FzU3luYyA9IGZhbHNlOworICAgIG1lZGlhX3N0YXR1c190IG1TdGF0dXMgPSBBTUVESUFfT0s7CisgICAgTWVkaWFTYW1wbGVJbmZvIG1TYW1wbGVJbmZvOworICAgIEJsb2NraW5nUXVldWU8c3RkOjpmdW5jdGlvbjx2b2lkKCk+PiBtQ29kZWNNZXNzYWdlUXVldWU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbURlc3RpbmF0aW9uRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1BY3R1YWxPdXRwdXRGb3JtYXQ7CisgICAgcGlkX3QgbVBpZDsKKyAgICB1aWRfdCBtVWlkOworICAgIHVpbnQ2NF90IG1JbnB1dEZyYW1lQ291bnQgPSAwOworICAgIHVpbnQ2NF90IG1PdXRwdXRGcmFtZUNvdW50ID0gMDsKKyAgICBpbnQzMl90IG1Db25maWd1cmVkQml0cmF0ZSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX1ZJREVPX1RSQUNLX1RSQU5TQ09ERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3NldGxvZ2xldmVsLnNoIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3NldGxvZ2xldmVsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIwZjBhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvc2V0bG9nbGV2ZWwuc2gKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL2Jhc2gKKworaWYgWyAkIyAtbmUgMSBdCit0aGVuCisgICAgZWNobyAiVXNhZ2UgMTogJDAgPGxvZ2xldmVsPiIKKyAgICBlY2hvICIgIFNldCBhbGwgdHJhbnNjb2RlciBsb2cgdGFncyB0byA8bG9nbGV2ZWw+IgorICAgIGVjaG8gIlVzYWdlIDI6ICQwIC1sIgorICAgIGVjaG8gIiAgTGlzdCBhbGwgdHJhbnNjb2RlciBsb2cgdGFncyBhbmQgZXhpdCIKKyAgICBleGl0IDEKK2ZpCisKKyMgTGlzdCBhbGwgbG9nIHRhZ3MKK2RlY2xhcmUgLWEgdGFncz0oCisgIE1lZGlhVHJhbnNjb2RlciBNZWRpYVRyYWNrVHJhbnNjb2RlciBWaWRlb1RyYWNrVHJhbnNjb2RlciBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcgorICBNZWRpYVNhbXBsZVdyaXRlciBNZWRpYVNhbXBsZVJlYWRlciBNZWRpYVNhbXBsZVF1ZXVlIE1lZGlhVHJhbnNjb2RlclRlc3RzCisgIE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMgVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cyBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzCisgIE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMgTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cyBNZWRpYVNhbXBsZVF1ZXVlVGVzdHMgSGRyVHJhbnNjb2RlVGVzdHMpCisKK2lmIFsgIiQxIiA9PSAiLWwiIF07IHRoZW4KKyAgZWNobyAiVHJhbnNjb2RlciBsb2cgdGFnczoiCisgIGZvciB0YWcgaW4gIiR7dGFnc1tAXX0iOyBkbyBlY2hvIC1uICIkdGFnICI7IGRvbmUKKyAgZWNobworICBleGl0IDAKK2ZpCisKK2xldmVsPSQxCitlY2hvIFNldHRpbmcgdHJhbnNjb2RlciBsb2cgbGV2ZWwgdG8gJGxldmVsCisKKyMgU2V0IGxvZyBsZXZlbCBmb3IgYWxsIHRhZ3MKK2ZvciB0YWcgaW4gIiR7dGFnc1tAXX0iCitkbworICAgIGFkYiBzaGVsbCBzZXRwcm9wIGxvZy50YWcuJHt0YWd9ICRsZXZlbAorZG9uZQorCisjIFBpY2sgdXAgbmV3IHNldHRpbmdzCithZGIgc2hlbGwgc3RvcCAmJiBhZGIgc2hlbGwgc3RhcnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiMTljOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA0IEBACisvLyBVbml0IHRlc3RzIGZvciBsaWJtZWRpYXRyYW5zY29kZXIuCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAidGVzdGRlZmF1bHRzIiwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYXRyYW5zY29kZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGRhdGE6IFsiOnRlc3RfYXNzZXRzIl0sCisgICAgdGVzdF9jb25maWdfdGVtcGxhdGU6ICJBbmRyb2lkVGVzdFRlbXBsYXRlLnhtbCIsCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIiwgIlRyYW5zY29kZXJUZXN0cyJdLAorfQorCisvLyBNZWRpYVNhbXBsZVJlYWRlck5ESyB1bml0IHRlc3QKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMuY3BwIl0sCit9CisKKy8vIE1lZGlhU2FtcGxlUXVldWUgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIk1lZGlhU2FtcGxlUXVldWVUZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFja1RyYW5zY29kZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyIsCisgICAgZGVmYXVsdHM6IFsidGVzdGRlZmF1bHRzIl0sCisgICAgc3JjczogWyJNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcCJdLAorfQorCisvLyBWaWRlb1RyYWNrVHJhbnNjb2RlciB1bml0IHRlc3QKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwIl0sCit9CisKKy8vIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyIHVuaXQgdGVzdAorY2NfdGVzdCB7CisgICAgbmFtZTogIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RkZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFTYW1wbGVXcml0ZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyIsCisgICAgZGVmYXVsdHM6IFsidGVzdGRlZmF1bHRzIl0sCisgICAgc3JjczogWyJNZWRpYVNhbXBsZVdyaXRlclRlc3RzLmNwcCJdLAorfQorCisvLyBIRFIgVHJhbnNjb2RlIHVuaXQgdGVzdAorY2NfdGVzdCB7CisgICAgbmFtZTogIkhkclRyYW5zY29kZVRlc3RzIiwKKyAgICBkZWZhdWx0czogWyJ0ZXN0ZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIkhkclRyYW5zY29kZVRlc3RzLmNwcCJdLAorfQorCisvLyBNZWRpYVRyYW5zY29kZXIgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWVkaWFUcmFuc2NvZGVyVGVzdHMiLAorICAgIGRlZmF1bHRzOiBbInRlc3RkZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiTWVkaWFUcmFuc2NvZGVyVGVzdHMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvQW5kcm9pZFRlc3RUZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhMGNlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9BbmRyb2lkVGVzdFRlbXBsYXRlLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlVuaXQgdGVzdCBjb25maWd1cmF0aW9uIGZvciB7TU9EVUxFfSI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IlRyYW5zY29kZXJUZXN0cyIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iVHJhbnNjb2RpbmdUZXN0QXNzZXRzIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0ie01PRFVMRX0iIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAve01PRFVMRX0iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IntNT0RVTEV9IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LXRpbWVvdXQiIHZhbHVlPSIzMG0iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvSGRyVHJhbnNjb2RlVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL0hkclRyYW5zY29kZVRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI4ODJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL0hkclRyYW5zY29kZVRlc3RzLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgSERSIHRvIFNEUiB0cmFuc2NvZGluZy4KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSGRyVHJhbnNjb2RlVGVzdHMiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhbnNjb2Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorCisjaW5jbHVkZSAiVHJhbnNjb2RlclRlc3RVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIERlYnVnIHByb3BlcnR5IHRvIGxvYWQgdGhlIHNhbXBsZSBIRFIgcGx1Z2luLgorc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMb2FkU2FtcGxlUGx1Z2luUHJvcGVydHl7ImRlYnVnLmNvZGVjMi5mb3JjZS1zYW1wbGUtcGx1Z2luIn07CisKKy8vIFNEUiBjb2xvciBzdGFuZGFyZCwgZnJvbSBNZWRpYUZvcm1hdC4KK3N0YXRpYyBjb25zdGV4cHIgaW50IENPTE9SX1NUQU5EQVJEX0JUNzA5ID0gMTsKKworY2xhc3MgSGRyVHJhbnNjb2RlVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBIZHJUcmFuc2NvZGVUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiSGRyVHJhbnNjb2RlVGVzdHMgY3JlYXRlZCI7IH0KKyAgICB+SGRyVHJhbnNjb2RlVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIkhkclRyYW5zY29kZVRlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkhkclRyYW5zY29kZVRlc3RzIHNldCB1cCI7CisgICAgICAgIG1DYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFuc2NvZGVyQ2FsbGJhY2tzPigpOworICAgICAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJIZHJUcmFuc2NvZGVUZXN0cyB0ZWFyIGRvd24iOworICAgICAgICBtQ2FsbGJhY2tzLnJlc2V0KCk7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgdHJhbnNjb2RlKGNvbnN0IGNoYXIqIHNyY0ZpbGUsIGNvbnN0IGNoYXIqIGRzdEZpbGUsIGNvbnN0IGNoYXIqIGRzdE1pbWUpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3JjUGF0aCA9IG1TcmNEaXIgKyBzcmNGaWxlOworICAgICAgICBzdGQ6OnN0cmluZyBkc3RQYXRoID0gbURzdERpciArIGRzdEZpbGU7CisKKyAgICAgICAgYXV0byB0cmFuc2NvZGVyID0gTWVkaWFUcmFuc2NvZGVyOjpjcmVhdGUobUNhbGxiYWNrcywgLTEgLypoZWFydEJlYXRJbnRlcnZhbFVzKi8pOworICAgICAgICBFWFBFQ1RfTkUodHJhbnNjb2RlciwgbnVsbHB0cik7CisKKyAgICAgICAgY29uc3QgaW50IHNyY0ZkID0gb3BlbihzcmNQYXRoLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZXItPmNvbmZpZ3VyZVNvdXJjZShzcmNGZCksIEFNRURJQV9PSyk7CisgICAgICAgIGNsb3NlKHNyY0ZkKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgICAgIEVYUEVDVF9HVCh0cmFja0Zvcm1hdHMuc2l6ZSgpLCAwKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gZm9ybWF0OworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXRzW2ldLmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oQU1lZGlhRm9ybWF0X25ldygpLCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgZHN0TWltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IHRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGZvcm1hdC5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgZHN0RmQgPSBvcGVuKGRzdFBhdGguY19zdHIoKSwgT19XUk9OTFkgfCBPX0NSRUFULCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLT5jb25maWd1cmVEZXN0aW5hdGlvbihkc3RGZCksIEFNRURJQV9PSyk7CisgICAgICAgIGNsb3NlKGRzdEZkKTsKKworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGFydFN0YXR1cyA9IHRyYW5zY29kZXItPnN0YXJ0KCk7CisgICAgICAgIEVYUEVDVF9FUShzdGFydFN0YXR1cywgQU1FRElBX09LKTsKKyAgICAgICAgaWYgKHN0YXJ0U3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0U3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgbUNhbGxiYWNrcy0+d2FpdEZvclRyYW5zY29kaW5nRmluaXNoZWQoKTsKKyAgICAgICAgcmV0dXJuIG1DYWxsYmFja3MtPm1TdGF0dXM7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3QgdmFsaWRhdGVPdXRwdXQoY29uc3QgY2hhciogZHN0RmlsZSBfX3VudXNlZCkgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gbURzdERpciArIGRzdEZpbGU7CisKKyAgICAgICAgYXV0byBmb3JtYXQgPSBUcmFuc2NvZGVyVGVzdFV0aWxzOjpHZXRWaWRlb0Zvcm1hdChwYXRoKTsKKyAgICAgICAgRVhQRUNUX05FKGZvcm1hdC5nZXQoKSwgbnVsbHB0cik7CisKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgJnZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSh2YWx1ZSwgQ09MT1JfU1RBTkRBUkRfQlQ3MDkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQuZ2V0KCksIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsICZ2YWx1ZSkpOworICAgICAgICBFWFBFQ1RfRVEodmFsdWUsIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyk7CisKKyAgICAgICAgLy8gVE9ETyhsbmlsc3Nvbik6IFZhbGlkYXRlIGRlY29kZWQgcGl4ZWxzIGFzIHdlbGwuIEVpdGhlciBieSBjb21wYXJpbmcgc2ltaWxhcml0eSBhZ2FpbnN0IGEKKyAgICAgICAgLy8gIGtub3duIGdvb2QgImdvbGRlbiBtYXN0ZXIiIGNvcnJlc3BvbmRpbmcgU0RSIHZpZGVvLCBvciBieSBsb29raW5nIGF0IHRoZSBoaXN0b2dyYW0uCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorCisgICAgYm9vbCBoZHJUb1NkckNvbnZlcnNpb25TdXBwb3J0ZWQoY29uc3QgY2hhciogaGRyRmlsZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzcmNQYXRoID0gbVNyY0RpciArIGhkckZpbGU7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbWltZTsKKyAgICAgICAgYXV0byBmb3JtYXQgPSBUcmFuc2NvZGVyVGVzdFV0aWxzOjpHZXRWaWRlb0Zvcm1hdChzcmNQYXRoLCAmbWltZSk7CisgICAgICAgIEVYUEVDVF9ORShmb3JtYXQuZ2V0KCksIG51bGxwdHIpOworCisgICAgICAgIEFNZWRpYUNvZGVjKiBkZWNvZGVyID0gQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShtaW1lLmNfc3RyKCkpOworICAgICAgICBFWFBFQ1RfTkUoZGVjb2RlciwgbnVsbHB0cik7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdC5nZXQoKSwgVEJEX0FNRURJQUNPREVDX1BBUkFNRVRFUl9LRVlfQ09MT1JfVFJBTlNGRVJfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTyk7CisKKyAgICAgICAgRVhQRUNUX0VRKEFNZWRpYUNvZGVjX2NvbmZpZ3VyZShkZWNvZGVyLCBmb3JtYXQuZ2V0KCksIG51bGxwdHIgLypzdXJmYWNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKmNyeXB0byovLCAwIC8qZmxhZ3MqLyksCisgICAgICAgICAgICAgICAgICBBTUVESUFfT0spOworCisgICAgICAgIEFNZWRpYUZvcm1hdCogaW5wdXRGb3JtYXQgPSBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdChkZWNvZGVyKTsKKyAgICAgICAgRVhQRUNUX05FKGlucHV0Rm9ybWF0LCBudWxscHRyKTsKKworICAgICAgICBpbnQzMl90IHRyYW5zZmVyRnVuYzsKKyAgICAgICAgYm9vbCBjb252ZXJzaW9uU3VwcG9ydGVkID0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoaW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCRF9BTUVESUFDT0RFQ19QQVJBTUVURVJfS0VZX0NPTE9SX1RSQU5TRkVSX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2ZlckZ1bmMpICYmCisgICAgICAgICAgICAgICAgdHJhbnNmZXJGdW5jID09IENPTE9SX1RSQU5TRkVSX1NEUl9WSURFTzsKKworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGlucHV0Rm9ybWF0KTsKKyAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKGRlY29kZXIpOworCisgICAgICAgIHJldHVybiBjb252ZXJzaW9uU3VwcG9ydGVkOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0VHJhbnNjb2RlckNhbGxiYWNrcz4gbUNhbGxiYWNrczsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtU3JjRGlyeyIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzLyJ9OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Ec3REaXJ7Ii9kYXRhL2xvY2FsL3RtcC8ifTsKK307CisKK1RFU1RfRihIZHJUcmFuc2NvZGVUZXN0cywgVGVzdEhkclNhbXBsZVBsdWdpblRyYW5zY29kZSkgeworICAgIGNvbnN0IGNoYXIqIGhkckZpbGUgPSAidmlkZW9fMTI4MHg3MjBfaGV2Y19oZHIxMF9zdGF0aWNfM21icHMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkc3RGaWxlID0gInZpZGVvXzEyODB4NzIwX2hldmNfaGRyMTBfc3RhdGljXzNtYnBzX3RyYW5zY29kZWQubXA0IjsKKworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KGtMb2FkU2FtcGxlUGx1Z2luUHJvcGVydHksICJ0cnVlIikpOworCisgICAgaWYgKGhkclRvU2RyQ29udmVyc2lvblN1cHBvcnRlZChoZHJGaWxlKSkgeworICAgICAgICBMT0coSU5GTykgPDwgIkhEUiAtPiBTRFIgc3VwcG9ydGVkLCB2YWxpZGF0aW5nIG91dHB1dC4uIjsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZShoZHJGaWxlLCBkc3RGaWxlLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSwgQU1FRElBX09LKTsKKyAgICAgICAgRVhQRUNUX0VRKHZhbGlkYXRlT3V0cHV0KGRzdEZpbGUpLCBBTUVESUFfT0spOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiSERSIC0+IFNEUiAqbm90KiBzdXBwb3J0ZWQiOworICAgICAgICBFWFBFQ1RfRVEodHJhbnNjb2RlKGhkckZpbGUsIGRzdEZpbGUsIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpLCBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KGtMb2FkU2FtcGxlUGx1Z2luUHJvcGVydHksICJmYWxzZSIpKTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9NZWRpYVNhbXBsZVF1ZXVlVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTdlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLmNwcApAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFTYW1wbGVRdWV1ZQorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVNhbXBsZVF1ZXVlVGVzdHMiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVRdWV1ZS5oPgorCisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKiBEdXJhdGlvbiB0byB1c2Ugd2hlbiBkZWxheWluZyB0aHJlYWRzIHRvIG9yZGVyIG9wZXJhdGlvbnMuICovCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1RocmVhZERlbGF5RHVyYXRpb25NcyA9IDEwMDsKKworY2xhc3MgTWVkaWFTYW1wbGVRdWV1ZVRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFTYW1wbGVRdWV1ZVRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVF1ZXVlVGVzdHMgY3JlYXRlZCI7IH0KKyAgICB+TWVkaWFTYW1wbGVRdWV1ZVRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVF1ZXVlVGVzdHMgZGVzdHJveWVkIjsgfQorfTsKKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gbmV3U2FtcGxlKHVpbnQzMl90IGlkKSB7CisgICAgcmV0dXJuIE1lZGlhU2FtcGxlOjpjcmVhdGVXaXRoUmVsZWFzZUNhbGxiYWNrKG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIG9mZnNldCAqLywgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogY2FsbGJhY2sgKi8pOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLCBUZXN0U2VxdWVudGlhbERlcXVldWVPcmRlcikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RTZXF1ZW50aWFsRGVxdWV1ZU9yZGVyIFN0YXJ0cyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTnVtU2FtcGxlcyA9IDQ7CisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKyAgICBFWFBFQ1RfVFJVRShzYW1wbGVRdWV1ZS5pc0VtcHR5KCkpOworCisgICAgLy8gRW5xdWV1ZSBsb29wLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBzYW1wbGVRdWV1ZS5lbnF1ZXVlKG5ld1NhbXBsZShpKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShzYW1wbGVRdWV1ZS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8vIERlcXVldWUgbG9vcC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgICAgIEVYUEVDVF9ORShzYW1wbGUsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoc2FtcGxlLT5idWZmZXJJZCwgaSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdEludGVybGVhdmVkRGVxdWV1ZU9yZGVyKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdEludGVybGVhdmVkRGVxdWV1ZU9yZGVyIFN0YXJ0cyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTnVtU2FtcGxlcyA9IDQ7CisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKworICAgIC8vIEVucXVldWUgYW5kIGRlcXVldWUuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIHNhbXBsZVF1ZXVlLmVucXVldWUobmV3U2FtcGxlKGkpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHNhbXBsZVF1ZXVlLmlzRW1wdHkoKSk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgICAgIEVYUEVDVF9ORShzYW1wbGUsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoc2FtcGxlLT5idWZmZXJJZCwgaSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVF1ZXVlVGVzdHMsIFRlc3RCbG9ja2luZ0RlcXVldWUpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0QmxvY2tpbmdEZXF1ZXVlIFN0YXJ0cyI7CisKKyAgICBNZWRpYVNhbXBsZVF1ZXVlIHNhbXBsZVF1ZXVlOworCisgICAgc3RkOjp0aHJlYWQgZW5xdWV1ZVRocmVhZChbJnNhbXBsZVF1ZXVlXSB7CisgICAgICAgIC8vIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgcmFjeS4gQW55IGFtb3VudCBvZiBzbGVlcCB3aWxsIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUKKyAgICAgICAgLy8gbWFpbiB0aHJlYWQgd2lsbCBiZSBibG9ja2VkIG9uIHRoZSBzYW1wbGUgcXVldWUgYnkgdGhlIHRpbWUgdGhpcyB0aHJlYWQgY2FsbHMgZW5xdWV1ZS4KKyAgICAgICAgLy8gQnV0IHdlIGNhbiBzYXkgd2l0aCBoaWdoIGNvbmZpZGVuY2UgdGhhdCBpdCB3aWxsIGFuZCB0aGUgdGVzdCB3aWxsIG5vdCBmYWlsIHJlZ2FyZGxlc3MuCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGtUaHJlYWREZWxheUR1cmF0aW9uTXMpKTsKKyAgICAgICAgc2FtcGxlUXVldWUuZW5xdWV1ZShuZXdTYW1wbGUoMSkpOworICAgIH0pOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgYm9vbCBhYm9ydGVkID0gc2FtcGxlUXVldWUuZGVxdWV1ZSgmc2FtcGxlKTsKKyAgICBFWFBFQ1RfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoc2FtcGxlLT5idWZmZXJJZCwgMSk7CisgICAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworICAgIEVYUEVDVF9UUlVFKHNhbXBsZVF1ZXVlLmlzRW1wdHkoKSk7CisKKyAgICBlbnF1ZXVlVGhyZWFkLmpvaW4oKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdERlcXVldWVCdWZmZXJSZWxlYXNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdERlcXVldWVCdWZmZXJSZWxlYXNlIFN0YXJ0cyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTnVtU2FtcGxlcyA9IDQ7CisgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gYnVmZmVyUmVsZWFzZWQoa051bVNhbXBsZXMsIGZhbHNlKTsKKworICAgIE1lZGlhU2FtcGxlOjpPblNhbXBsZVJlbGVhc2VkQ2FsbGJhY2sgY2FsbGJhY2sgPSBbJmJ1ZmZlclJlbGVhc2VkXShNZWRpYVNhbXBsZSogc2FtcGxlKSB7CisgICAgICAgIGJ1ZmZlclJlbGVhc2VkW3NhbXBsZS0+YnVmZmVySWRdID0gdHJ1ZTsKKyAgICB9OworCisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgYm9vbCBhYm9ydGVkID0gc2FtcGxlUXVldWUuZW5xdWV1ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVNhbXBsZTo6Y3JlYXRlV2l0aFJlbGVhc2VDYWxsYmFjayhudWxscHRyLCAwLCBpLCBjYWxsYmFjaykpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIEVYUEVDVF9GQUxTRShidWZmZXJSZWxlYXNlZFtpXSk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgICAgICAgICAgYm9vbCBhYm9ydGVkID0gc2FtcGxlUXVldWUuZGVxdWV1ZSgmc2FtcGxlKTsKKyAgICAgICAgICAgIEVYUEVDVF9ORShzYW1wbGUsIG51bGxwdHIpOworICAgICAgICAgICAgRVhQRUNUX0VRKHNhbXBsZS0+YnVmZmVySWQsIGkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlclJlbGVhc2VkW2ldKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShhYm9ydGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga051bVNhbXBsZXM7ICsraikgeworICAgICAgICAgICAgRVhQRUNUX0VRKGJ1ZmZlclJlbGVhc2VkW2pdLCBqIDw9IGkpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLCBUZXN0QWJvcnRCdWZmZXJSZWxlYXNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdEFib3J0QnVmZmVyUmVsZWFzZSBTdGFydHMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVNhbXBsZXMgPSA0OworICAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJ1ZmZlclJlbGVhc2VkKGtOdW1TYW1wbGVzLCBmYWxzZSk7CisKKyAgICBNZWRpYVNhbXBsZTo6T25TYW1wbGVSZWxlYXNlZENhbGxiYWNrIGNhbGxiYWNrID0gWyZidWZmZXJSZWxlYXNlZF0oTWVkaWFTYW1wbGUqIHNhbXBsZSkgeworICAgICAgICBidWZmZXJSZWxlYXNlZFtzYW1wbGUtPmJ1ZmZlcklkXSA9IHRydWU7CisgICAgfTsKKworICAgIE1lZGlhU2FtcGxlUXVldWUgc2FtcGxlUXVldWU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtU2FtcGxlczsgKytpKSB7CisgICAgICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmVucXVldWUoCisgICAgICAgICAgICAgICAgTWVkaWFTYW1wbGU6OmNyZWF0ZVdpdGhSZWxlYXNlQ2FsbGJhY2sobnVsbHB0ciwgMCwgaSwgY2FsbGJhY2spKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGFib3J0ZWQpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyUmVsZWFzZWRbaV0pOworICAgIH0KKworICAgIEVYUEVDVF9GQUxTRShzYW1wbGVRdWV1ZS5pc0VtcHR5KCkpOworICAgIHNhbXBsZVF1ZXVlLmFib3J0KCk7CisgICAgRVhQRUNUX1RSVUUoc2FtcGxlUXVldWUuaXNFbXB0eSgpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXM7ICsraSkgeworICAgICAgICBFWFBFQ1RfVFJVRShidWZmZXJSZWxlYXNlZFtpXSk7CisgICAgfQorfQorCitURVNUX0YoTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLCBUZXN0Tm9uRW1wdHlBYm9ydCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3ROb25FbXB0eUFib3J0IFN0YXJ0cyI7CisKKyAgICBNZWRpYVNhbXBsZVF1ZXVlIHNhbXBsZVF1ZXVlOworICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmVucXVldWUobmV3U2FtcGxlKDEpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYWJvcnRlZCk7CisKKyAgICBzYW1wbGVRdWV1ZS5hYm9ydCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBzYW1wbGU7CisgICAgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7CisgICAgRVhQRUNUX0VRKHNhbXBsZSwgbnVsbHB0cik7CisKKyAgICBhYm9ydGVkID0gc2FtcGxlUXVldWUuZW5xdWV1ZShzYW1wbGUpOworICAgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVRdWV1ZVRlc3RzLCBUZXN0RW1wdHlBYm9ydCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RFbXB0eUFib3J0IFN0YXJ0cyI7CisKKyAgICBNZWRpYVNhbXBsZVF1ZXVlIHNhbXBsZVF1ZXVlOworICAgIHNhbXBsZVF1ZXVlLmFib3J0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IHNhbXBsZTsKKyAgICBib29sIGFib3J0ZWQgPSBzYW1wbGVRdWV1ZS5kZXF1ZXVlKCZzYW1wbGUpOworICAgIEVYUEVDVF9UUlVFKGFib3J0ZWQpOworICAgIEVYUEVDVF9FUShzYW1wbGUsIG51bGxwdHIpOworCisgICAgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmVucXVldWUoc2FtcGxlKTsKKyAgICBFWFBFQ1RfVFJVRShhYm9ydGVkKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUXVldWVUZXN0cywgVGVzdEJsb2NraW5nQWJvcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0QmxvY2tpbmdBYm9ydCBTdGFydHMiOworCisgICAgTWVkaWFTYW1wbGVRdWV1ZSBzYW1wbGVRdWV1ZTsKKworICAgIHN0ZDo6dGhyZWFkIGFib3J0aW5nVGhyZWFkKFsmc2FtcGxlUXVldWVdIHsKKyAgICAgICAgLy8gTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIGJpdCByYWN5LiBBbnkgYW1vdW50IG9mIHNsZWVwIHdpbGwgbm90IGd1YXJhbnRlZSB0aGF0IHRoZQorICAgICAgICAvLyBtYWluIHRocmVhZCB3aWxsIGJlIGJsb2NrZWQgb24gdGhlIHNhbXBsZSBxdWV1ZSBieSB0aGUgdGltZSB0aGlzIHRocmVhZCBjYWxscyBhYm9ydC4KKyAgICAgICAgLy8gQnV0IHdlIGNhbiBzYXkgd2l0aCBoaWdoIGNvbmZpZGVuY2UgdGhhdCBpdCB3aWxsIGFuZCB0aGUgdGVzdCB3aWxsIG5vdCBmYWlsIHJlZ2FyZGxlc3MuCisgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKGtUaHJlYWREZWxheUR1cmF0aW9uTXMpKTsKKyAgICAgICAgc2FtcGxlUXVldWUuYWJvcnQoKTsKKyAgICB9KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIGJvb2wgYWJvcnRlZCA9IHNhbXBsZVF1ZXVlLmRlcXVldWUoJnNhbXBsZSk7CisgICAgRVhQRUNUX1RSVUUoYWJvcnRlZCk7CisgICAgRVhQRUNUX0VRKHNhbXBsZSwgbnVsbHB0cik7CisKKyAgICBhYm9ydGluZ1RocmVhZC5qb2luKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0OTllNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9NZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzLmNwcApAQCAtMCwwICsxLDQzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFTYW1wbGVSZWFkZXJOREsKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cyIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisvLyBUT0RPKGIvMTUzNDUzMzkyKTogVGVzdCBtb3JlIGFzc2V0IHR5cGVzIChmcmFtZSByZW9yZGVyaW5nPykuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBTRUNfVE9fVVNFQyhzKSAoKHMpKjEwMDAgKiAxMDAwKQorCisvKiogSGVscGVyIGNsYXNzIGZvciBjb21wYXJpbmcgc2FtcGxlIGRhdGEgdXNpbmcgY2hlY2tzdW1zLiAqLworY2xhc3MgU2FtcGxlIHsKK3B1YmxpYzoKKyAgICBTYW1wbGUodWludDMyX3QgZmxhZ3MsIGludDY0X3QgdGltZXN0YW1wLCBzaXplX3Qgc2l6ZSwgY29uc3QgdWludDhfdCogYnVmZmVyKQorICAgICAgICAgIDogbUZsYWdze2ZsYWdzfSwgbVRpbWVzdGFtcHt0aW1lc3RhbXB9LCBtU2l6ZXtzaXplfSB7CisgICAgICAgIGluaXRDaGVja3N1bShidWZmZXIpOworICAgIH0KKworICAgIFNhbXBsZShBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvcikgeworICAgICAgICBtRmxhZ3MgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoZXh0cmFjdG9yKTsKKyAgICAgICAgbVRpbWVzdGFtcCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKGV4dHJhY3Rvcik7CisgICAgICAgIG1TaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShleHRyYWN0b3IpKTsKKworICAgICAgICBhdXRvIGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihtU2l6ZSk7CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleHRyYWN0b3IsIGJ1ZmZlci5nZXQoKSwgbVNpemUpOworCisgICAgICAgIGluaXRDaGVja3N1bShidWZmZXIuZ2V0KCkpOworICAgIH0KKworICAgIHZvaWQgaW5pdENoZWNrc3VtKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcikgeworICAgICAgICBNRDVfQ1RYIG1kNUN0eDsKKyAgICAgICAgTUQ1X0luaXQoJm1kNUN0eCk7CisgICAgICAgIE1ENV9VcGRhdGUoJm1kNUN0eCwgYnVmZmVyLCBtU2l6ZSk7CisgICAgICAgIE1ENV9GaW5hbChtQ2hlY2tzdW0sICZtZDVDdHgpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTYW1wbGUmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemUgPT0gcmhzLm1TaXplICYmIG1GbGFncyA9PSByaHMubUZsYWdzICYmIG1UaW1lc3RhbXAgPT0gcmhzLm1UaW1lc3RhbXAgJiYKKyAgICAgICAgICAgICAgIG1lbWNtcChtQ2hlY2tzdW0sIHJocy5tQ2hlY2tzdW0sIE1ENV9ESUdFU1RfTEVOR1RIKSA9PSAwOworICAgIH0KKworICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXA7CisgICAgc2l6ZV90IG1TaXplOworICAgIHVpbnQ4X3QgbUNoZWNrc3VtW01ENV9ESUdFU1RfTEVOR1RIXTsKK307CisKKy8qKiBDb25zdGFudCBmb3Igc2VsZWN0aW5nIGFsbCBzYW1wbGVzLiAqLworc3RhdGljIGNvbnN0ZXhwciBpbnQgU0FNUExFX0NPVU5UX0FMTCA9IC0xOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gdGVzdCBkaWZmZXJlbnQgc2FtcGxlIGFjY2VzcyBwYXR0ZXJucyBjb21iaW5lZCB3aXRoIHNlcXVlbnRpYWwgb3IgcGFyYWxsZWwKKyAqIHNhbXBsZSBhY2Nlc3MgbW9kZXMuCisgKi8KK2NsYXNzIFNhbXBsZUFjY2Vzc1Rlc3RlciB7CitwdWJsaWM6CisgICAgU2FtcGxlQWNjZXNzVGVzdGVyKGludCBzb3VyY2VGZCwgc2l6ZV90IGZpbGVTaXplKSB7CisgICAgICAgIG1TYW1wbGVSZWFkZXIgPSBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Y3JlYXRlRnJvbUZkKHNvdXJjZUZkLCAwLCBmaWxlU2l6ZSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TYW1wbGVSZWFkZXIpOworCisgICAgICAgIG1UcmFja0NvdW50ID0gbVNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpOworCisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgRVhQRUNUX0VRKG1TYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworICAgICAgICB9CisKKyAgICAgICAgbVNhbXBsZXMucmVzaXplKG1UcmFja0NvdW50KTsKKyAgICAgICAgbVRyYWNrVGhyZWFkcy5yZXNpemUobVRyYWNrQ291bnQpOworICAgIH0KKworICAgIHZvaWQgZ2V0U2FtcGxlSW5mbyhpbnQgdHJhY2tJbmRleCkgeworICAgICAgICBNZWRpYVNhbXBsZUluZm8gaW5mbzsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbVNhbXBsZVJlYWRlci0+Z2V0U2FtcGxlSW5mb0ZvclRyYWNrKHRyYWNrSW5kZXgsICZpbmZvKTsKKyAgICAgICAgRVhQRUNUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWRTYW1wbGVzQXN5bmMoaW50IHRyYWNrSW5kZXgsIGludCBzYW1wbGVDb3VudCkgeworICAgICAgICBtVHJhY2tUaHJlYWRzW3RyYWNrSW5kZXhdID0gc3RkOjp0aHJlYWR7W3RoaXMsIHRyYWNrSW5kZXgsIHNhbXBsZUNvdW50XSB7CisgICAgICAgICAgICBpbnQgc2FtcGxlc1JlYWQgPSAwOworICAgICAgICAgICAgTWVkaWFTYW1wbGVJbmZvIGluZm87CisgICAgICAgICAgICB3aGlsZSAoc2FtcGxlc1JlYWQgPCBzYW1wbGVDb3VudCB8fCBzYW1wbGVDb3VudCA9PSBTQU1QTEVfQ09VTlRfQUxMKSB7CisgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gbVNhbXBsZVJlYWRlci0+Z2V0U2FtcGxlSW5mb0ZvclRyYWNrKHRyYWNrSW5kZXgsICZpbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoc3RhdHVzLCBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKChpbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRSgoaW5mby5mbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pID09IDApOworCisgICAgICAgICAgICAgICAgYXV0byBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oaW5mby5zaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtU2FtcGxlUmVhZGVyLT5yZWFkU2FtcGxlRGF0YUZvclRyYWNrKHRyYWNrSW5kZXgsIGJ1ZmZlci5nZXQoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoc3RhdHVzLCBBTUVESUFfT0spOworCisgICAgICAgICAgICAgICAgbVNhbXBsZU11dGV4LmxvY2soKTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBidWZmZXJQdHIgPSBidWZmZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNbdHJhY2tJbmRleF0uZW1wbGFjZV9iYWNrKGluZm8uZmxhZ3MsIGluZm8ucHJlc2VudGF0aW9uVGltZVVzLCBpbmZvLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclB0cik7CisgICAgICAgICAgICAgICAgbVNhbXBsZU11dGV4LnVubG9jaygpOworICAgICAgICAgICAgICAgICsrc2FtcGxlc1JlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH19OworICAgIH0KKworICAgIHZvaWQgcmVhZFNhbXBsZXNBc3luYyhpbnQgc2FtcGxlQ291bnQpIHsKKyAgICAgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICByZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kZXgsIHNhbXBsZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd2FpdEZvclRyYWNrKGludCB0cmFja0luZGV4KSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1UcmFja1RocmVhZHNbdHJhY2tJbmRleF0uam9pbmFibGUoKSk7CisgICAgICAgIG1UcmFja1RocmVhZHNbdHJhY2tJbmRleF0uam9pbigpOworICAgIH0KKworICAgIHZvaWQgd2FpdEZvclRyYWNrcygpIHsKKyAgICAgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICB3YWl0Rm9yVHJhY2sodHJhY2tJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKGJvb2wgZW5mb3JjZSkgeworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBtU2FtcGxlUmVhZGVyLT5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2VzcyhlbmZvcmNlKTsKKyAgICAgICAgRVhQRUNUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTYW1wbGU+PiYgZ2V0U2FtcGxlcygpIHsgcmV0dXJuIG1TYW1wbGVzOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IG1TYW1wbGVSZWFkZXI7CisgICAgc2l6ZV90IG1UcmFja0NvdW50OworICAgIHN0ZDo6bXV0ZXggbVNhbXBsZU11dGV4OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dGhyZWFkPiBtVHJhY2tUaHJlYWRzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFNhbXBsZT4+IG1TYW1wbGVzOworfTsKKworY2xhc3MgTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMgY3JlYXRlZCI7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIk1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMgc2V0IHVwIjsKKworICAgICAgICAvLyBOZWVkIHRvIHN0YXJ0IGEgdGhyZWFkIHBvb2wgdG8gcHJldmVudCBBTWVkaWFFeHRyYWN0b3IgYmluZGVyIGNhbGxzIGZyb20gc3RhcnZpbmcKKyAgICAgICAgLy8gKGIvMTU1NjYzNTYxKS4KKyAgICAgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICAgICAgY29uc3QgY2hhciogc291cmNlUGF0aCA9CisgICAgICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKworICAgICAgICBtU291cmNlRmQgPSBvcGVuKHNvdXJjZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgQVNTRVJUX0dUKG1Tb3VyY2VGZCwgMCk7CisKKyAgICAgICAgbUZpbGVTaXplID0gbHNlZWsobVNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGxzZWVrKG1Tb3VyY2VGZCwgMCwgU0VFS19TRVQpOworCisgICAgICAgIG1FeHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShtRXh0cmFjdG9yLCBudWxscHRyKTsKKworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQobUV4dHJhY3RvciwgbVNvdXJjZUZkLCAwLCBtRmlsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spOworCisgICAgICAgIG1UcmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQobUV4dHJhY3Rvcik7CisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbml0RXh0cmFjdG9yU2FtcGxlcygpIHsKKyAgICAgICAgaWYgKG1FeHRyYWN0b3JTYW1wbGVzLnNpemUoKSA9PSBtVHJhY2tDb3VudCkgcmV0dXJuOworCisgICAgICAgIC8vIFNhdmUgc2FtcGxlIGluZm9ybWF0aW9uLCBwZXIgdHJhY2ssIGFzIHJlcG9ydGVkIGJ5IHRoZSBleHRyYWN0b3IuCisgICAgICAgIG1FeHRyYWN0b3JTYW1wbGVzLnJlc2l6ZShtVHJhY2tDb3VudCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0cmFja0luZGV4ID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgobUV4dHJhY3Rvcik7CisgICAgICAgICAgICBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XS5lbXBsYWNlX2JhY2sobUV4dHJhY3Rvcik7CisgICAgICAgIH0gd2hpbGUgKEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1FeHRyYWN0b3IpKTsKKworICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKG1FeHRyYWN0b3IsIDAsIEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkMpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGdldFRyYWNrQml0cmF0ZXMoKSB7CisgICAgICAgIHNpemVfdCB0b3RhbFNpemVbbVRyYWNrQ291bnRdOworICAgICAgICBtZW1zZXQodG90YWxTaXplLCAwLCBzaXplb2YodG90YWxTaXplKSk7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgY29uc3QgaW50IHRyYWNrSW5kZXggPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKTsKKyAgICAgICAgICAgIHRvdGFsU2l6ZVt0cmFja0luZGV4XSArPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtRXh0cmFjdG9yKTsKKyAgICAgICAgfSB3aGlsZSAoQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UobUV4dHJhY3RvcikpOworCisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWVrVG8obUV4dHJhY3RvciwgMCwgQU1FRElBRVhUUkFDVE9SX1NFRUtfUFJFVklPVVNfU1lOQyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gYml0cmF0ZXM7CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEVYUEVDVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvblVzKSk7CisgICAgICAgICAgICBiaXRyYXRlcy5wdXNoX2JhY2socm91bmRmKChmbG9hdCl0b3RhbFNpemVbdHJhY2tJbmRleF0gKiA4ICogMTAwMDAwMCAvIGR1cmF0aW9uVXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiaXRyYXRlczsKKyAgICB9CisKKyAgICB2b2lkIGNvbXBhcmVTYW1wbGVzKHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPFNhbXBsZT4+JiByZWFkZXJTYW1wbGVzKSB7CisgICAgICAgIGluaXRFeHRyYWN0b3JTYW1wbGVzKCk7CisgICAgICAgIEVYUEVDVF9FUShyZWFkZXJTYW1wbGVzLnNpemUoKSwgbVRyYWNrQ291bnQpOworCisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVHJhY2sgIiA8PCB0cmFja0luZGV4IDw8ICIsIGNvbXBhcmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHJlYWRlclNhbXBsZXNbdHJhY2tJbmRleF0uc2l6ZSgpIDw8ICIgc2FtcGxlcy4iOworICAgICAgICAgICAgRVhQRUNUX0VRKHJlYWRlclNhbXBsZXNbdHJhY2tJbmRleF0uc2l6ZSgpLCBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3Qgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHJlYWRlclNhbXBsZXNbdHJhY2tJbmRleF0uc2l6ZSgpOworICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHJlYWRlclNhbXBsZXNbdHJhY2tJbmRleF1bc2FtcGxlSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XVtzYW1wbGVJbmRleF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cyB0ZWFyIGRvd24iOworICAgICAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKG1FeHRyYWN0b3IpOworICAgICAgICBjbG9zZShtU291cmNlRmQpOworICAgIH0KKworICAgIH5NZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIEFNZWRpYUV4dHJhY3RvciogbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1UcmFja0NvdW50OworICAgIGludCBtU291cmNlRmQ7CisgICAgc2l6ZV90IG1GaWxlU2l6ZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxTYW1wbGU+PiBtRXh0cmFjdG9yU2FtcGxlczsKK307CisKKy8qKiBSZWFkcyBhbGwgc2FtcGxlcyBmcm9tIGFsbCB0cmFja3MgaW4gcGFyYWxsZWwuICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdFBhcmFsbGVsU2FtcGxlQWNjZXNzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdFBhcmFsbGVsU2FtcGxlQWNjZXNzIFN0YXJ0cyI7CisKKyAgICBTYW1wbGVBY2Nlc3NUZXN0ZXIgdGVzdGVye21Tb3VyY2VGZCwgbUZpbGVTaXplfTsKKyAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyhTQU1QTEVfQ09VTlRfQUxMKTsKKyAgICB0ZXN0ZXIud2FpdEZvclRyYWNrcygpOworICAgIGNvbXBhcmVTYW1wbGVzKHRlc3Rlci5nZXRTYW1wbGVzKCkpOworfQorCisvKiogUmVhZHMgYWxsIHNhbXBsZXMgZXhjZXB0IHRoZSBsYXN0IGluIGVhY2ggdHJhY2ssIGJlZm9yZSBmaW5pc2hpbmcuICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdExhc3RTYW1wbGVCZWZvcmVFT1MpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0TGFzdFNhbXBsZUJlZm9yZUVPUyBTdGFydHMiOworICAgIGluaXRFeHRyYWN0b3JTYW1wbGVzKCk7CisKKyAgICB7ICAvLyBOYXR1cmFsIHRyYWNrIG9yZGVyCisgICAgICAgIFNhbXBsZUFjY2Vzc1Rlc3RlciB0ZXN0ZXJ7bVNvdXJjZUZkLCBtRmlsZVNpemV9OworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1UcmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kZXgsIG1FeHRyYWN0b3JTYW1wbGVzW3RyYWNrSW5kZXhdLnNpemUoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIHRlc3Rlci53YWl0Rm9yVHJhY2tzKCk7CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgdGVzdGVyLnJlYWRTYW1wbGVzQXN5bmModHJhY2tJbmRleCwgU0FNUExFX0NPVU5UX0FMTCk7CisgICAgICAgICAgICB0ZXN0ZXIud2FpdEZvclRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGNvbXBhcmVTYW1wbGVzKHRlc3Rlci5nZXRTYW1wbGVzKCkpOworICAgIH0KKworICAgIHsgIC8vIFJldmVyc2UgdHJhY2sgb3JkZXIKKyAgICAgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSBtVHJhY2tDb3VudCAtIDE7IHRyYWNrSW5kZXggPj0gMDsgLS10cmFja0luZGV4KSB7CisgICAgICAgICAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XS5zaXplKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0ZXIud2FpdEZvclRyYWNrcygpOworICAgICAgICBmb3IgKGludCB0cmFja0luZGV4ID0gbVRyYWNrQ291bnQgLSAxOyB0cmFja0luZGV4ID49IDA7IC0tdHJhY2tJbmRleCkgeworICAgICAgICAgICAgdGVzdGVyLnJlYWRTYW1wbGVzQXN5bmModHJhY2tJbmRleCwgU0FNUExFX0NPVU5UX0FMTCk7CisgICAgICAgICAgICB0ZXN0ZXIud2FpdEZvclRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGNvbXBhcmVTYW1wbGVzKHRlc3Rlci5nZXRTYW1wbGVzKCkpOworICAgIH0KK30KKworLyoqIFJlYWRzIGFsbCBzYW1wbGVzIGZyb20gYWxsIHRyYWNrcyBzZXF1ZW50aWFsbHkuICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdFNlcXVlbnRpYWxTYW1wbGVBY2Nlc3MpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0U2VxdWVudGlhbFNhbXBsZUFjY2VzcyBTdGFydHMiOworCisgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisgICAgdGVzdGVyLnNldEVuZm9yY2VTZXF1ZW50aWFsQWNjZXNzKHRydWUpOworICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKFNBTVBMRV9DT1VOVF9BTEwpOworICAgIHRlc3Rlci53YWl0Rm9yVHJhY2tzKCk7CisgICAgY29tcGFyZVNhbXBsZXModGVzdGVyLmdldFNhbXBsZXMoKSk7Cit9CisKKy8qKiBSZWFkcyBhbGwgc2FtcGxlcyBmcm9tIG9uZSB0cmFjayBpbiBwYXJhbGxlbCBtb2RlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc2VxdWVudGlhbCBtb2RlLiAqLworVEVTVF9GKE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMsIFRlc3RNaXhlZFNhbXBsZUFjY2Vzc1RyYWNrRU9TKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdE1peGVkU2FtcGxlQWNjZXNzVHJhY2tFT1MgU3RhcnRzIjsKKworICAgIGZvciAoaW50IHJlYWRTYW1wbGVJbmZvRmxhZyA9IDA7IHJlYWRTYW1wbGVJbmZvRmxhZyA8PSAxOyByZWFkU2FtcGxlSW5mb0ZsYWcrKykgeworICAgICAgICBmb3IgKGludCB0cmFja0luZFRvRU9TID0gMDsgdHJhY2tJbmRUb0VPUyA8IG1UcmFja0NvdW50OyArK3RyYWNrSW5kVG9FT1MpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRU9TIG9mIHRyYWNrICIgPDwgdHJhY2tJbmRUb0VPUzsKKworICAgICAgICAgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBmbGFnIGlzIHNldCwgcmVhZCBzYW1wbGUgaW5mbyBmcm9tIGEgZGlmZmVyZW50IHRyYWNrIGJlZm9yZSBkcmFpbmluZyB0aGUgdHJhY2sKKyAgICAgICAgICAgIC8vIHVuZGVyIHRlc3QgdG8gZm9yY2UgdGhlIHJlYWRlciB0byBzYXZlIHRoZSBleHRyYWN0b3IgcG9zaXRpb24uCisgICAgICAgICAgICBpZiAocmVhZFNhbXBsZUluZm9GbGFnKSB7CisgICAgICAgICAgICAgICAgdGVzdGVyLmdldFNhbXBsZUluZm8oKHRyYWNrSW5kVG9FT1MgKyAxKSAlIG1UcmFja0NvdW50KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbGwgc2FtcGxlcyBmcm9tIG9uZSB0cmFjayBiZWZvcmUgZW5hYmxpbmcgc2VxdWVudGlhbCBhY2Nlc3MKKyAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kVG9FT1MsIFNBTVBMRV9DT1VOVF9BTEwpOworICAgICAgICAgICAgdGVzdGVyLndhaXRGb3JUcmFjayh0cmFja0luZFRvRU9TKTsKKyAgICAgICAgICAgIHRlc3Rlci5zZXRFbmZvcmNlU2VxdWVudGlhbEFjY2Vzcyh0cnVlKTsKKworICAgICAgICAgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrSW5kZXggPT0gdHJhY2tJbmRUb0VPUykgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBTQU1QTEVfQ09VTlRfQUxMKTsKKyAgICAgICAgICAgICAgICB0ZXN0ZXIud2FpdEZvclRyYWNrKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wYXJlU2FtcGxlcyh0ZXN0ZXIuZ2V0U2FtcGxlcygpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBSZWFkcyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHNhbXBsZSBjb3VudHMgZnJvbSBhbGwgdHJhY2tzIGluIHBhcmFsbGVsIG1vZGUgYmVmb3JlIHN3aXRjaGluZworICogdG8gc2VxdWVudGlhbCBtb2RlIGFuZCByZWFkaW5nIHRoZSByZXN0IG9mIHRoZSBzYW1wbGVzLgorICovCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdE1peGVkU2FtcGxlQWNjZXNzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdE1peGVkU2FtcGxlQWNjZXNzIFN0YXJ0cyI7CisgICAgaW5pdEV4dHJhY3RvclNhbXBsZXMoKTsKKworICAgIGZvciAoaW50IHRyYWNrSW5kVG9UZXN0ID0gMDsgdHJhY2tJbmRUb1Rlc3QgPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZFRvVGVzdCkgeworICAgICAgICBmb3IgKGludCBzYW1wbGVDb3VudCA9IDA7IHNhbXBsZUNvdW50IDw9IChtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZFRvVGVzdF0uc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgKytzYW1wbGVDb3VudCkgeworICAgICAgICAgICAgU2FtcGxlQWNjZXNzVGVzdGVyIHRlc3RlcnttU291cmNlRmQsIG1GaWxlU2l6ZX07CisKKyAgICAgICAgICAgIGZvciAoaW50IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbVRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4ID09IHRyYWNrSW5kVG9UZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKHRyYWNrSW5kZXgsIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZXN0ZXIucmVhZFNhbXBsZXNBc3luYyh0cmFja0luZGV4LCBtRXh0cmFjdG9yU2FtcGxlc1t0cmFja0luZGV4XS5zaXplKCkgLyAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlc3Rlci53YWl0Rm9yVHJhY2tzKCk7CisgICAgICAgICAgICB0ZXN0ZXIuc2V0RW5mb3JjZVNlcXVlbnRpYWxBY2Nlc3ModHJ1ZSk7CisKKyAgICAgICAgICAgIHRlc3Rlci5yZWFkU2FtcGxlc0FzeW5jKFNBTVBMRV9DT1VOVF9BTEwpOworICAgICAgICAgICAgdGVzdGVyLndhaXRGb3JUcmFja3MoKTsKKworICAgICAgICAgICAgY29tcGFyZVNhbXBsZXModGVzdGVyLmdldFNhbXBsZXMoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzLCBUZXN0RXN0aW1hdGVkQml0cmF0ZUFjY3VyYWN5KSB7CisgICAgLy8gSnVzdCBwdXQgYSBzb21ld2hhdCByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBlc3RpbWF0ZWQgYml0cmF0ZSBleHBlY3RlZCBpbiBvdXIgdGVzdAorICAgIC8vIGFzc2V0cy4gVGhpcyBpcyBtb3N0bHkgdG8gbWFrZSBzdXJlIHRoZSBlc3RpbWF0aW9uIGlzIG5vdCB3YXkgb2ZmLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTWF4RXN0aW1hdGVkQml0cmF0ZSA9IDEwMCAqIDEwMDAgKiAxMDAwOyAgLy8gMTAwIE1icHMKKworICAgIGF1dG8gc2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIG1GaWxlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc2FtcGxlUmVhZGVyKTsKKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFjdHVhbFRyYWNrQml0cmF0ZXMgPSBnZXRUcmFja0JpdHJhdGVzKCk7CisgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgKyt0cmFja0luZGV4KSB7CisgICAgICAgIEVYUEVDVF9FUShzYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworCisgICAgICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZVJlYWRlci0+Z2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKHRyYWNrSW5kZXgsICZiaXRyYXRlKSwgQU1FRElBX09LKTsKKyAgICAgICAgRVhQRUNUX0dUKGJpdHJhdGUsIDApOworICAgICAgICBFWFBFQ1RfTFQoYml0cmF0ZSwga01heEVzdGltYXRlZEJpdHJhdGUpOworCisgICAgICAgIC8vIE5vdGU6IFRoZSB0ZXN0IGFzc2V0IGN1cnJlbnRseSB1c2VkIGluIHRoaXMgdGVzdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNhbXBsaW5nIGR1cmF0aW9uCisgICAgICAgIC8vIHVzZWQgdG8gZXN0aW1hdGUgdGhlIGJpdHJhdGUgaW4gdGhlIHNhbXBsZSByZWFkZXIuIFNvIGZvciBub3cgdGhlIGVzdGltYXRpb24gc2hvdWxkIGJlCisgICAgICAgIC8vIGV4YWN0IGJ1dCBpZi93aGVuIGEgbG9uZ2VyIGFzc2V0IGlzIHVzZWQgYSByZWFzb25hYmxlIGRlbHRhIG5lZWRzIHRvIGJlIGRlZmluZWQuCisgICAgICAgIEVYUEVDVF9FUShiaXRyYXRlLCBhY3R1YWxUcmFja0JpdHJhdGVzW3RyYWNrSW5kZXhdKTsKKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVJlYWRlck5ES1Rlc3RzLCBUZXN0SW52YWxpZEZkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZCgwLCAwLCBtRmlsZVNpemUpOworICAgIEFTU0VSVF9UUlVFKHNhbXBsZVJlYWRlciA9PSBudWxscHRyKTsKKworICAgIHNhbXBsZVJlYWRlciA9IE1lZGlhU2FtcGxlUmVhZGVyTkRLOjpjcmVhdGVGcm9tRmQoLTEsIDAsIG1GaWxlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc2FtcGxlUmVhZGVyID09IG51bGxwdHIpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cywgVGVzdFplcm9TaXplKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIDApOworICAgIEFTU0VSVF9UUlVFKHNhbXBsZVJlYWRlciA9PSBudWxscHRyKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMsIFRlc3RJbnZhbGlkT2Zmc2V0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBzYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIG1GaWxlU2l6ZSwgbUZpbGVTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzYW1wbGVSZWFkZXIgPT0gbnVsbHB0cik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVXcml0ZXJUZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFTYW1wbGVXcml0ZXJUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4YTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9NZWRpYVNhbXBsZVdyaXRlclRlc3RzLmNwcApAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFTYW1wbGVXcml0ZXIKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFTYW1wbGVXcml0ZXJUZXN0cyIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogTXV4ZXIgaW50ZXJmYWNlIHRvIGVuYWJsZSBNZWRpYVNhbXBsZVdyaXRlciB0ZXN0aW5nLiAqLworY2xhc3MgVGVzdE11eGVyIDogcHVibGljIE1lZGlhU2FtcGxlV3JpdGVyTXV4ZXJJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIE11eGVySW50ZXJmYWNlCisgICAgc3NpemVfdCBhZGRUcmFjayhBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0KSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhBZGRUcmFjayh0cmFja0Zvcm1hdCkpOworICAgICAgICByZXR1cm4gbVRyYWNrQ291bnQrKzsKKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhTdGFydCgpKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisKKyAgICBtZWRpYV9zdGF0dXNfdCB3cml0ZVNhbXBsZURhdGEoc2l6ZV90IHRyYWNrSW5kZXgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyogaW5mbykgb3ZlcnJpZGUgeworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soV3JpdGVTYW1wbGUodHJhY2tJbmRleCwgZGF0YSwgaW5mbykpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0KKyAgICBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGUgeworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soU3RvcCgpKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgLy8gfk11eGVySW50ZXJmYWNlCisKKyAgICBzdHJ1Y3QgRXZlbnQgeworICAgICAgICBlbnVtIHsgTm9FdmVudCwgQWRkVHJhY2ssIFN0YXJ0LCBXcml0ZVNhbXBsZSwgU3RvcCB9IHR5cGUgPSBOb0V2ZW50OworICAgICAgICBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIHNpemVfdCB0cmFja0luZGV4ID0gMDsKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZve307CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgRXZlbnQgTm9FdmVudCA9IHtFdmVudDo6Tm9FdmVudCwgbnVsbHB0ciwgMCwgbnVsbHB0ciwge319OworCisgICAgc3RhdGljIEV2ZW50IEFkZFRyYWNrKGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0KSB7CisgICAgICAgIHJldHVybiB7LnR5cGUgPSBFdmVudDo6QWRkVHJhY2ssIC5mb3JtYXQgPSBmb3JtYXR9OworICAgIH0KKworICAgIHN0YXRpYyBFdmVudCBTdGFydCgpIHsgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpTdGFydH07IH0KKyAgICBzdGF0aWMgRXZlbnQgU3RvcCgpIHsgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpTdG9wfTsgfQorCisgICAgc3RhdGljIEV2ZW50IFdyaXRlU2FtcGxlKHNpemVfdCB0cmFja0luZGV4LCBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8qIGluZm8pIHsKKyAgICAgICAgcmV0dXJuIHsudHlwZSA9IEV2ZW50OjpXcml0ZVNhbXBsZSwgLnRyYWNrSW5kZXggPSB0cmFja0luZGV4LCAuZGF0YSA9IGRhdGEsIC5pbmZvID0gKmluZm99OworICAgIH0KKworICAgIHN0YXRpYyBFdmVudCBXcml0ZVNhbXBsZVdpdGhQdHMoc2l6ZV90IHRyYWNrSW5kZXgsIGludDY0X3QgcHRzKSB7CisgICAgICAgIHJldHVybiB7LnR5cGUgPSBFdmVudDo6V3JpdGVTYW1wbGUsIC50cmFja0luZGV4ID0gdHJhY2tJbmRleCwgLmluZm8gPSB7MCwgMCwgcHRzLCAwfX07CisgICAgfQorCisgICAgdm9pZCBwdXNoRXZlbnQoY29uc3QgRXZlbnQmIGUpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhlKTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgY29uc3QgRXZlbnQmIHBvcEV2ZW50KGJvb2wgd2FpdCA9IGZhbHNlKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAod2FpdCAmJiBtRXZlbnRRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qb3BwZWRFdmVudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRXZlbnQgbVBvcHBlZEV2ZW50OworICAgIHN0ZDo6bGlzdDxFdmVudD4gbUV2ZW50UXVldWU7CisgICAgc3NpemVfdCBtVHJhY2tDb3VudCA9IDA7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKK307CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8mIGxocywgY29uc3QgQU1lZGlhQ29kZWNCdWZmZXJJbmZvJiByaHMpIHsKKyAgICByZXR1cm4gbGhzLm9mZnNldCA9PSByaHMub2Zmc2V0ICYmIGxocy5zaXplID09IHJocy5zaXplICYmCisgICAgICAgICAgIGxocy5wcmVzZW50YXRpb25UaW1lVXMgPT0gcmhzLnByZXNlbnRhdGlvblRpbWVVcyAmJiBsaHMuZmxhZ3MgPT0gcmhzLmZsYWdzOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgVGVzdE11eGVyOjpFdmVudCYgbGhzLCBjb25zdCBUZXN0TXV4ZXI6OkV2ZW50JiByaHMpIHsKKyAgICAvLyBEb24ndCB0ZXN0IGZvcm1hdCBwb2ludGVyIGVxdWFsaXR5IHNpbmNlIHRoZSB3cml0ZXIgY2FuIG1ha2UgYSBjb3B5LgorICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAvKiYmIGxocy5mb3JtYXQgPT0gcmhzLmZvcm1hdCovICYmCisgICAgICAgICAgIGxocy50cmFja0luZGV4ID09IHJocy50cmFja0luZGV4ICYmIGxocy5kYXRhID09IHJocy5kYXRhICYmIGxocy5pbmZvID09IHJocy5pbmZvOworfQorCisvKiogUmVwcmVzZW50cyBhIG1lZGlhIHNvdXJjZSBmaWxlLiAqLworY2xhc3MgVGVzdE1lZGlhU291cmNlIHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBzb3VyY2VQYXRoID0KKyAgICAgICAgICAgICAgICAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworCisgICAgICAgIG1FeHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShtRXh0cmFjdG9yLCBudWxscHRyKTsKKworICAgICAgICBpbnQgc291cmNlRmQgPSBvcGVuKHNvdXJjZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgQVNTRVJUX0dUKHNvdXJjZUZkLCAwKTsKKworICAgICAgICBvZmZfdCBmaWxlU2l6ZSA9IGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChtRXh0cmFjdG9yLCBzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spOworICAgICAgICBjbG9zZShzb3VyY2VGZCk7CisKKyAgICAgICAgbVRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtRXh0cmFjdG9yKTsKKyAgICAgICAgQVNTRVJUX0dUKG1UcmFja0NvdW50LCAxKTsKKyAgICAgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBtVHJhY2tDb3VudDsgdHJhY2tJbmRleCsrKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1FeHRyYWN0b3IsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKTsKKworICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVRyYWNrRm9ybWF0cy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSkpOworCisgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgRVhQRUNUX0dFKG1WaWRlb1RyYWNrSW5kZXgsIDApOworICAgICAgICBFWFBFQ1RfR0UobUF1ZGlvVHJhY2tJbmRleCwgMCk7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpIGNvbnN0IHsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhtRXh0cmFjdG9yLCAwIC8qIHNlZWtQb3NVcyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFFWFRSQUNUT1JfU0VFS19QUkVWSU9VU19TWU5DKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICBBTWVkaWFFeHRyYWN0b3IqIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIHNpemVfdCBtVHJhY2tDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4+IG1UcmFja0Zvcm1hdHM7CisgICAgaW50IG1WaWRlb1RyYWNrSW5kZXggPSAtMTsKKyAgICBpbnQgbUF1ZGlvVHJhY2tJbmRleCA9IC0xOworfTsKKworY2xhc3MgVGVzdENhbGxiYWNrcyA6IHB1YmxpYyBNZWRpYVNhbXBsZVdyaXRlcjo6Q2FsbGJhY2tJbnRlcmZhY2UgeworcHVibGljOgorICAgIGJvb2wgaGFzRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICByZXR1cm4gbUZpbmlzaGVkOworICAgIH0KKworICAgIC8vIE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhU2FtcGxlV3JpdGVyKiB3cml0ZXIgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbVN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uU3RvcHBlZChjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyIF9fdW51c2VkKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbVN0b3BwZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVNhbXBsZVdyaXRlciogd3JpdGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpIG92ZXJyaWRlIHsKKyAgICAgICAgRVhQRUNUX0dUKHByb2dyZXNzLCBtTGFzdFByb2dyZXNzKTsKKyAgICAgICAgRVhQRUNUX0dFKHByb2dyZXNzLCAwKTsKKyAgICAgICAgRVhQRUNUX0xFKHByb2dyZXNzLCAxMDApOworCisgICAgICAgIG1MYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzczsKKyAgICAgICAgbVByb2dyZXNzVXBkYXRlQ291bnQrKzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25IZWFydEJlYXQoY29uc3QgTWVkaWFTYW1wbGVXcml0ZXIqIHdyaXRlciBfX3VudXNlZCkgb3ZlcnJpZGUge30KKyAgICAvLyB+TWVkaWFTYW1wbGVXcml0ZXI6OkNhbGxiYWNrSW50ZXJmYWNlCisKKyAgICB2b2lkIHdhaXRGb3JXcml0aW5nRmluaXNoZWQoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAoIW1GaW5pc2hlZCAmJiAhbVN0b3BwZWQpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGdldFByb2dyZXNzVXBkYXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtUHJvZ3Jlc3NVcGRhdGVDb3VudDsgfQorICAgIGJvb2wgd2FzU3RvcHBlZCgpIGNvbnN0IHsgcmV0dXJuIG1TdG9wcGVkOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBib29sIG1GaW5pc2hlZCA9IGZhbHNlOworICAgIGJvb2wgbVN0b3BwZWQgPSBmYWxzZTsKKyAgICBtZWRpYV9zdGF0dXNfdCBtU3RhdHVzID0gQU1FRElBX09LOworICAgIGludDMyX3QgbUxhc3RQcm9ncmVzcyA9IC0xOworICAgIHVpbnQzMl90IG1Qcm9ncmVzc1VwZGF0ZUNvdW50ID0gMDsKK307CisKK2NsYXNzIE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBNZWRpYVNhbXBsZVdyaXRlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVdyaXRlclRlc3RzIGNyZWF0ZWQiOyB9CisgICAgfk1lZGlhU2FtcGxlV3JpdGVyVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIk1lZGlhU2FtcGxlV3JpdGVyVGVzdHMgZGVzdHJveWVkIjsgfQorCisgICAgc3RhdGljIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgZ2V0TWVkaWFTb3VyY2UoKSB7CisgICAgICAgIHN0YXRpYyBUZXN0TWVkaWFTb3VyY2Ugc01lZGlhU291cmNlOworICAgICAgICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgc09uY2VUb2tlbjsKKworICAgICAgICBzdGQ6OmNhbGxfb25jZShzT25jZVRva2VuLCBbXSB7IHNNZWRpYVNvdXJjZS5pbml0KCk7IH0pOworCisgICAgICAgIHNNZWRpYVNvdXJjZS5yZXNldCgpOworICAgICAgICByZXR1cm4gc01lZGlhU291cmNlOworICAgIH0KKworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+IG5ld1NhbXBsZShpbnQ2NF90IHB0c1VzLCB1aW50MzJfdCBmbGFncywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcikgeworICAgICAgICBhdXRvIHNhbXBsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8TWVkaWFTYW1wbGU+KCk7CisgICAgICAgIHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSBwdHNVczsKKyAgICAgICAgc2FtcGxlLT5pbmZvLmZsYWdzID0gZmxhZ3M7CisgICAgICAgIHNhbXBsZS0+aW5mby5zaXplID0gc2l6ZTsKKyAgICAgICAgc2FtcGxlLT5kYXRhT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBzYW1wbGUtPmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHNhbXBsZTsKKyAgICB9CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiBuZXdTYW1wbGVFb3MoKSB7CisgICAgICAgIHJldHVybiBuZXdTYW1wbGUoMCwgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSwgMCwgMCwgbnVsbHB0cik7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gbmV3U2FtcGxlV2l0aFB0cyhpbnQ2NF90IHB0c1VzKSB7CisgICAgICAgIHN0YXRpYyB1aW50MzJfdCBzYW1wbGVDb3VudCA9IDA7CisKKyAgICAgICAgLy8gVXNlIHNhbXBsZUNvdW50IHRvIGdldCBhIHVuaXF1ZSBtb2NrIHNhbXBsZS4KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSWQgPSArK3NhbXBsZUNvdW50OworICAgICAgICByZXR1cm4gbmV3U2FtcGxlKHB0c1VzLCAwLCBzYW1wbGVJZCwgc2FtcGxlSWQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNhbXBsZUlkKSk7CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gbmV3U2FtcGxlV2l0aFB0c09ubHkoaW50NjRfdCBwdHNVcykgeworICAgICAgICByZXR1cm4gbmV3U2FtcGxlKHB0c1VzLCAwLCAwLCAwLCBudWxscHRyKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVdyaXRlclRlc3RzIHNldCB1cCI7CisgICAgICAgIG1UZXN0TXV4ZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RNdXhlcj4oKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJNZWRpYVNhbXBsZVdyaXRlclRlc3RzIHRlYXIgZG93biI7CisgICAgICAgIG1UZXN0TXV4ZXIucmVzZXQoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdE11eGVyPiBtVGVzdE11eGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FsbGJhY2tzPiBtVGVzdENhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdENhbGxiYWNrcz4oKTsKK307CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0QWRkVHJhY2tXaXRob3V0SW5pdCkgeworICAgIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgbWVkaWFTb3VyY2UgPSBnZXRNZWRpYVNvdXJjZSgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX0VRKHdyaXRlci0+YWRkVHJhY2sobWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1swXSksIG51bGxwdHIpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVXcml0ZXJUZXN0cywgVGVzdFN0YXJ0V2l0aG91dEluaXQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfRkFMU0Uod3JpdGVyLT5zdGFydCgpKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RTdGFydFdpdGhvdXRUcmFja3MpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgbVRlc3RDYWxsYmFja3MpKTsKKyAgICBFWFBFQ1RfRkFMU0Uod3JpdGVyLT5zdGFydCgpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RBZGRJbnZhbGlkVHJhY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgbVRlc3RDYWxsYmFja3MpKTsKKworICAgIEVYUEVDVF9FUSh3cml0ZXItPmFkZFRyYWNrKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RNdXhlci0+cG9wRXZlbnQoKSwgVGVzdE11eGVyOjpOb0V2ZW50KTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3REb3VibGVTdGFydFN0b3ApIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0Q2FsbGJhY2tzPiBjYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDYWxsYmFja3M+KCk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIGNhbGxiYWNrcykpOworCisgICAgY29uc3QgVGVzdE1lZGlhU291cmNlJiBtZWRpYVNvdXJjZSA9IGdldE1lZGlhU291cmNlKCk7CisgICAgRVhQRUNUX05FKHdyaXRlci0+YWRkVHJhY2sobWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1swXSksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OkFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0uZ2V0KCkpKTsKKworICAgIEFTU0VSVF9UUlVFKHdyaXRlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci0+c3RhcnQoKSk7CisKKyAgICB3cml0ZXItPnN0b3AoKTsKKyAgICB3cml0ZXItPnN0b3AoKTsKKyAgICBjYWxsYmFja3MtPndhaXRGb3JXcml0aW5nRmluaXNoZWQoKTsKKyAgICBFWFBFQ1RfVFJVRShjYWxsYmFja3MtPndhc1N0b3BwZWQoKSk7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0U3RvcFdpdGhvdXRTdGFydCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gd3JpdGVyID0gTWVkaWFTYW1wbGVXcml0ZXI6OkNyZWF0ZSgpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci0+aW5pdChtVGVzdE11eGVyLCBtVGVzdENhbGxiYWNrcykpOworCisgICAgY29uc3QgVGVzdE1lZGlhU291cmNlJiBtZWRpYVNvdXJjZSA9IGdldE1lZGlhU291cmNlKCk7CisgICAgRVhQRUNUX05FKHdyaXRlci0+YWRkVHJhY2sobWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1swXSksIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OkFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0uZ2V0KCkpKTsKKworICAgIHdyaXRlci0+c3RvcCgpOworICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6Ok5vRXZlbnQpOworfQorCitURVNUX0YoTWVkaWFTYW1wbGVXcml0ZXJUZXN0cywgVGVzdFN0YXJ0V2l0aG91dENhbGxiYWNrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisKKyAgICBzdGQ6OndlYWtfcHRyPE1lZGlhU2FtcGxlV3JpdGVyOjpDYWxsYmFja0ludGVyZmFjZT4gdW5hc3NpZ25lZFdwOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgdW5hc3NpZ25lZFdwKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI6OkNhbGxiYWNrSW50ZXJmYWNlPiB1bmFzc2lnbmVkU3A7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci0+aW5pdChtVGVzdE11eGVyLCB1bmFzc2lnbmVkU3ApKTsKKworICAgIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgbWVkaWFTb3VyY2UgPSBnZXRNZWRpYVNvdXJjZSgpOworICAgIEVYUEVDVF9FUSh3cml0ZXItPmFkZFRyYWNrKG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbMF0pLCBudWxscHRyKTsKKyAgICBBU1NFUlRfRkFMU0Uod3JpdGVyLT5zdGFydCgpKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RQcm9ncmVzc1VwZGF0ZSkgeworICAgIGNvbnN0IFRlc3RNZWRpYVNvdXJjZSYgbWVkaWFTb3VyY2UgPSBnZXRNZWRpYVNvdXJjZSgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlV3JpdGVyPiB3cml0ZXIgPSBNZWRpYVNhbXBsZVdyaXRlcjo6Q3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLT5pbml0KG1UZXN0TXV4ZXIsIG1UZXN0Q2FsbGJhY2tzKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiB2aWRlb0Zvcm1hdCA9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PihBTWVkaWFGb3JtYXRfbmV3KCksICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfY29weSh2aWRlb0Zvcm1hdC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzW21lZGlhU291cmNlLm1WaWRlb1RyYWNrSW5kZXhdLmdldCgpKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh2aWRlb0Zvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgMTAwKTsKKyAgICBhdXRvIHNhbXBsZUNvbnN1bWVyID0gd3JpdGVyLT5hZGRUcmFjayh2aWRlb0Zvcm1hdCk7CisgICAgRVhQRUNUX05FKHNhbXBsZUNvbnN1bWVyLCBudWxscHRyKTsKKyAgICBBU1NFUlRfVFJVRSh3cml0ZXItPnN0YXJ0KCkpOworCisgICAgZm9yIChpbnQ2NF90IHB0cyA9IDA7IHB0cyA8IDEwMDsgKytwdHMpIHsKKyAgICAgICAgc2FtcGxlQ29uc3VtZXIobmV3U2FtcGxlV2l0aFB0cyhwdHMpKTsKKyAgICB9CisgICAgc2FtcGxlQ29uc3VtZXIobmV3U2FtcGxlRW9zKCkpOworICAgIG1UZXN0Q2FsbGJhY2tzLT53YWl0Rm9yV3JpdGluZ0ZpbmlzaGVkKCk7CisKKyAgICBFWFBFQ1RfRVEobVRlc3RDYWxsYmFja3MtPmdldFByb2dyZXNzVXBkYXRlQ291bnQoKSwgMTAwKTsKK30KKworVEVTVF9GKE1lZGlhU2FtcGxlV3JpdGVyVGVzdHMsIFRlc3RJbnRlcmxlYXZpbmcpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVXcml0ZXI+IHdyaXRlciA9IE1lZGlhU2FtcGxlV3JpdGVyOjpDcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXItPmluaXQobVRlc3RNdXhlciwgbVRlc3RDYWxsYmFja3MpKTsKKworICAgIC8vIFVzZSB0d28gdHJhY2tzIGZvciB0aGlzIHRlc3QuCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga051bVRyYWNrcyA9IDI7CisgICAgTWVkaWFTYW1wbGVXcml0ZXI6Ok1lZGlhU2FtcGxlQ29uc3VtZXJGdW5jdGlvbiBzYW1wbGVDb25zdW1lcnNba051bVRyYWNrc107CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4sIHNpemVfdD4+IGFkZGVkU2FtcGxlczsKKyAgICBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIG1lZGlhU291cmNlID0gZ2V0TWVkaWFTb3VyY2UoKTsKKworICAgIGZvciAoaW50IHRyYWNrSWR4ID0gMDsgdHJhY2tJZHggPCBrTnVtVHJhY2tzOyArK3RyYWNrSWR4KSB7CisgICAgICAgIGF1dG8gdHJhY2tGb3JtYXQgPSBtZWRpYVNvdXJjZS5tVHJhY2tGb3JtYXRzW3RyYWNrSWR4ICUgbWVkaWFTb3VyY2UubVRyYWNrQ291bnRdOworICAgICAgICBzYW1wbGVDb25zdW1lcnNbdHJhY2tJZHhdID0gd3JpdGVyLT5hZGRUcmFjayh0cmFja0Zvcm1hdCk7CisgICAgICAgIEVYUEVDVF9ORShzYW1wbGVDb25zdW1lcnNbdHJhY2tJZHhdLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0TXV4ZXItPnBvcEV2ZW50KCksIFRlc3RNdXhlcjo6QWRkVHJhY2sodHJhY2tGb3JtYXQuZ2V0KCkpKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgc2FtcGxlcyBpbiB0aGUgZXhwZWN0ZWQgaW50ZXJsZWF2ZWQgb3JkZXIgZm9yIGVhc3kgdmVyaWZpY2F0aW9uLgorICAgIGF1dG8gYWRkU2FtcGxlVG9UcmFja1dpdGhQdHMgPSBbJmFkZGVkU2FtcGxlcywgJnNhbXBsZUNvbnN1bWVyc10oaW50IHRyYWNrSW5kZXgsIGludDY0X3QgcHRzKSB7CisgICAgICAgIGF1dG8gc2FtcGxlID0gbmV3U2FtcGxlV2l0aFB0cyhwdHMpOworICAgICAgICBzYW1wbGVDb25zdW1lcnNbdHJhY2tJbmRleF0oc2FtcGxlKTsKKyAgICAgICAgYWRkZWRTYW1wbGVzLmVtcGxhY2VfYmFjayhzYW1wbGUsIHRyYWNrSW5kZXgpOworICAgIH07CisKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygwLCAwKTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygxLCA0KTsKKworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDAsIDEpOworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDAsIDIpOworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDAsIDMpOworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDAsIDEwKTsKKworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDEsIDUpOworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDEsIDYpOworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDEsIDExKTsKKworICAgIGFkZFNhbXBsZVRvVHJhY2tXaXRoUHRzKDAsIDEyKTsKKyAgICBhZGRTYW1wbGVUb1RyYWNrV2l0aFB0cygxLCAxMyk7CisKKyAgICBmb3IgKGludCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IGtOdW1UcmFja3M7ICsrdHJhY2tJbmRleCkgeworICAgICAgICBzYW1wbGVDb25zdW1lcnNbdHJhY2tJbmRleF0obmV3U2FtcGxlRW9zKCkpOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSB3cml0ZXIuCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5zdGFydCgpKTsKKworICAgIC8vIFdhaXQgZm9yIHdyaXRlciB0byBjb21wbGV0ZS4KKyAgICBtVGVzdENhbGxiYWNrcy0+d2FpdEZvcldyaXRpbmdGaW5pc2hlZCgpOworICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OlN0YXJ0KCkpOworCisgICAgc3RkOjpzb3J0KGFkZGVkU2FtcGxlcy5iZWdpbigpLCBhZGRlZFNhbXBsZXMuZW5kKCksCisgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+LCBzaXplX3Q+JiBsZWZ0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnBhaXI8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiwgc2l6ZV90PiYgcmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0LmZpcnN0LT5pbmZvLnByZXNlbnRhdGlvblRpbWVVcyA8IHJpZ2h0LmZpcnN0LT5pbmZvLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgICAgICAgfSk7CisKKyAgICAvLyBWZXJpZnkgc2FtcGxlIG9yZGVyLgorICAgIGZvciAoYXV0byBlbnRyeSA6IGFkZGVkU2FtcGxlcykgeworICAgICAgICBhdXRvIHNhbXBsZSA9IGVudHJ5LmZpcnN0OworICAgICAgICBhdXRvIHRyYWNrSW5kZXggPSBlbnRyeS5zZWNvbmQ7CisKKyAgICAgICAgY29uc3QgVGVzdE11eGVyOjpFdmVudCYgZXZlbnQgPSBtVGVzdE11eGVyLT5wb3BFdmVudCgpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQudHlwZSwgVGVzdE11eGVyOjpFdmVudDo6V3JpdGVTYW1wbGUpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQudHJhY2tJbmRleCwgdHJhY2tJbmRleCk7CisgICAgICAgIEVYUEVDVF9FUShldmVudC5kYXRhLCBzYW1wbGUtPmJ1ZmZlcik7CisgICAgICAgIEVYUEVDVF9FUShldmVudC5pbmZvLm9mZnNldCwgc2FtcGxlLT5kYXRhT2Zmc2V0KTsKKyAgICAgICAgRVhQRUNUX0VRKGV2ZW50LmluZm8uc2l6ZSwgc2FtcGxlLT5pbmZvLnNpemUpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQuaW5mby5wcmVzZW50YXRpb25UaW1lVXMsIHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMpOworICAgICAgICBFWFBFQ1RfRVEoZXZlbnQuaW5mby5mbGFncywgc2FtcGxlLT5pbmZvLmZsYWdzKTsKKyAgICB9CisKKyAgICAvLyBWZXJpZnkgRU9TIHNhbXBsZXMuCisgICAgZm9yIChpbnQgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCBrTnVtVHJhY2tzOyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgYXV0byB0cmFja0Zvcm1hdCA9IG1lZGlhU291cmNlLm1UcmFja0Zvcm1hdHNbdHJhY2tJbmRleCAlIG1lZGlhU291cmNlLm1UcmFja0NvdW50XTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IDA7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja0Zvcm1hdC5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uKTsKKworICAgICAgICAvLyBFT1MgdGltZXN0YW1wID0gZmlyc3Qgc2FtcGxlIHRpbWVzdGFtcCArIGR1cmF0aW9uLgorICAgICAgICBjb25zdCBpbnQ2NF90IGVuZFRpbWUgPSBkdXJhdGlvbiArICh0cmFja0luZGV4ID09IDEgPyA0IDogMCk7CisgICAgICAgIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvID0gezAsIDAsIGVuZFRpbWUsIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU19OworCisgICAgICAgIEVYUEVDVF9FUShtVGVzdE11eGVyLT5wb3BFdmVudCgpLCBUZXN0TXV4ZXI6OldyaXRlU2FtcGxlKHRyYWNrSW5kZXgsIG51bGxwdHIsICZpbmZvKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKG1UZXN0TXV4ZXItPnBvcEV2ZW50KCksIFRlc3RNdXhlcjo6U3RvcCgpKTsKKyAgICBFWFBFQ1RfVFJVRShtVGVzdENhbGxiYWNrcy0+aGFzRmluaXNoZWQoKSk7Cit9CisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgc2FtcGxlIGZyb20gYW4gQU1lZGlhRXh0cmFjdG9yIHJlcHJlc2VudGVkIGFzIGEgTWVkaWFTYW1wbGUuCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiByZWFkU2FtcGxlQW5kQWR2YW5jZShBTWVkaWFFeHRyYWN0b3IqIGV4dHJhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogdHJhY2tJbmRleE91dCkgeworICAgIGludCB0cmFja0luZGV4ID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoZXh0cmFjdG9yKTsKKyAgICBpZiAodHJhY2tJbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKHRyYWNrSW5kZXhPdXQgIT0gbnVsbHB0cikgeworICAgICAgICAqdHJhY2tJbmRleE91dCA9IHRyYWNrSW5kZXg7CisgICAgfQorCisgICAgc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoZXh0cmFjdG9yKTsKKyAgICBpbnQ2NF90IHNhbXBsZVRpbWVVcyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKGV4dHJhY3Rvcik7CisgICAgdWludDMyX3QgZmxhZ3MgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoZXh0cmFjdG9yKTsKKworICAgIHNpemVfdCBidWZmZXJTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihzYW1wbGVTaXplKTsKKyAgICB1aW50OF90KiBidWZmZXIgPSBuZXcgdWludDhfdFtidWZmZXJTaXplXTsKKworICAgIHNzaXplX3QgZGF0YVJlYWQgPSBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoZXh0cmFjdG9yLCBidWZmZXIsIGJ1ZmZlclNpemUpOworICAgIEVYUEVDVF9FUShkYXRhUmVhZCwgc2FtcGxlU2l6ZSk7CisKKyAgICBhdXRvIHNhbXBsZSA9IE1lZGlhU2FtcGxlOjpjcmVhdGVXaXRoUmVsZWFzZUNhbGxiYWNrKAorICAgICAgICAgICAgYnVmZmVyLCAwIC8qIG9mZnNldCAqLywgMCAvKiBpZCAqLywgW2J1ZmZlcl0oTWVkaWFTYW1wbGUqKSB7IGRlbGV0ZVtdIGJ1ZmZlcjsgfSk7CisgICAgc2FtcGxlLT5pbmZvLnNpemUgPSBidWZmZXJTaXplOworICAgIHNhbXBsZS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSBzYW1wbGVUaW1lVXM7CisgICAgc2FtcGxlLT5pbmZvLmZsYWdzID0gZmxhZ3M7CisKKyAgICAodm9pZClBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShleHRyYWN0b3IpOworICAgIHJldHVybiBzYW1wbGU7Cit9CisKK1RFU1RfRihNZWRpYVNhbXBsZVdyaXRlclRlc3RzLCBUZXN0RGVmYXVsdE11eGVyKSB7CisgICAgLy8gV3JpdGUgc2FtcGxlcyBzdHJhaWdodCBmcm9tIGFuIGV4dHJhY3RvciBhbmQgdmFsaWRhdGUgb3V0cHV0IGZpbGUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlc3RpbmF0aW9uUGF0aCA9CisgICAgICAgICAgICAiL2RhdGEvbG9jYWwvdG1wL01lZGlhU2FtcGxlV3JpdGVyVGVzdHNfVGVzdERlZmF1bHRNdXhlcl9vdXRwdXQuTVA0IjsKKyAgICBjb25zdCBpbnQgZGVzdGluYXRpb25GZCA9CisgICAgICAgICAgICBvcGVuKGRlc3RpbmF0aW9uUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFULCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJPVEgpOworICAgIEFTU0VSVF9HVChkZXN0aW5hdGlvbkZkLCAwKTsKKworICAgIC8vIEluaXRpYWxpemUgd3JpdGVyLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVdyaXRlcj4gd3JpdGVyID0gTWVkaWFTYW1wbGVXcml0ZXI6OkNyZWF0ZSgpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci0+aW5pdChkZXN0aW5hdGlvbkZkLCBtVGVzdENhbGxiYWNrcykpOworICAgIGNsb3NlKGRlc3RpbmF0aW9uRmQpOworCisgICAgLy8gQWRkIHRyYWNrcy4KKyAgICBjb25zdCBUZXN0TWVkaWFTb3VyY2UmIG1lZGlhU291cmNlID0gZ2V0TWVkaWFTb3VyY2UoKTsKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYVNhbXBsZVdyaXRlcjo6TWVkaWFTYW1wbGVDb25zdW1lckZ1bmN0aW9uPiBzYW1wbGVDb25zdW1lcnM7CisKKyAgICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IG1lZGlhU291cmNlLm1UcmFja0NvdW50OyB0cmFja0luZGV4KyspIHsKKyAgICAgICAgYXV0byBjb25zdW1lciA9IHdyaXRlci0+YWRkVHJhY2sobWVkaWFTb3VyY2UubVRyYWNrRm9ybWF0c1t0cmFja0luZGV4XSk7CisgICAgICAgIHNhbXBsZUNvbnN1bWVycy5wdXNoX2JhY2soY29uc3VtZXIpOworICAgIH0KKworICAgIC8vIFN0YXJ0IHRoZSB3cml0ZXIuCisgICAgQVNTRVJUX1RSVUUod3JpdGVyLT5zdGFydCgpKTsKKworICAgIC8vIEVucXVldWUgc2FtcGxlcyBhbmQgZmluYWxseSBFbmQgT2YgU3RyZWFtLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlOworICAgIHNpemVfdCB0cmFja0luZGV4OworICAgIHdoaWxlICgoc2FtcGxlID0gcmVhZFNhbXBsZUFuZEFkdmFuY2UobWVkaWFTb3VyY2UubUV4dHJhY3RvciwgJnRyYWNrSW5kZXgpKSAhPSBudWxscHRyKSB7CisgICAgICAgIHNhbXBsZUNvbnN1bWVyc1t0cmFja0luZGV4XShzYW1wbGUpOworICAgIH0KKyAgICBmb3IgKHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbWVkaWFTb3VyY2UubVRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICBzYW1wbGVDb25zdW1lcnNbdHJhY2tJbmRleF0obmV3U2FtcGxlRW9zKCkpOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIHdyaXRlci4KKyAgICBtVGVzdENhbGxiYWNrcy0+d2FpdEZvcldyaXRpbmdGaW5pc2hlZCgpOworCisgICAgLy8gQ29tcGFyZSBvdXRwdXQgZmlsZSB3aXRoIHNvdXJjZS4KKyAgICBtZWRpYVNvdXJjZS5yZXNldCgpOworCisgICAgQU1lZGlhRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cik7CisKKyAgICBpbnQgc291cmNlRmQgPSBvcGVuKGRlc3RpbmF0aW9uUGF0aCwgT19SRE9OTFkpOworICAgIEFTU0VSVF9HVChzb3VyY2VGZCwgMCk7CisKKyAgICBvZmZfdCBmaWxlU2l6ZSA9IGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoc291cmNlRmQsIDAsIFNFRUtfU0VUKTsKKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSyk7CisgICAgY2xvc2Uoc291cmNlRmQpOworCisgICAgc2l6ZV90IHRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChleHRyYWN0b3IpOworICAgIEVYUEVDVF9FUSh0cmFja0NvdW50LCBtZWRpYVNvdXJjZS5tVHJhY2tDb3VudCk7CisKKyAgICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KGV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKGV4dHJhY3RvciwgdHJhY2tJbmRleCk7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSBzYW1wbGVzLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlMSA9IHJlYWRTYW1wbGVBbmRBZHZhbmNlKG1lZGlhU291cmNlLm1FeHRyYWN0b3IsIG51bGxwdHIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4gc2FtcGxlMiA9IHJlYWRTYW1wbGVBbmRBZHZhbmNlKGV4dHJhY3RvciwgbnVsbHB0cik7CisKKyAgICB3aGlsZSAoc2FtcGxlMSAhPSBudWxscHRyICYmIHNhbXBsZTIgIT0gbnVsbHB0cikgeworICAgICAgICBFWFBFQ1RfRVEoc2FtcGxlMS0+aW5mby5wcmVzZW50YXRpb25UaW1lVXMsIHNhbXBsZTItPmluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZTEtPmluZm8uc2l6ZSwgc2FtcGxlMi0+aW5mby5zaXplKTsKKyAgICAgICAgRVhQRUNUX0VRKHNhbXBsZTEtPmluZm8uZmxhZ3MsIHNhbXBsZTItPmluZm8uZmxhZ3MpOworCisgICAgICAgIEVYUEVDVF9FUShtZW1jbXAoc2FtcGxlMS0+YnVmZmVyLCBzYW1wbGUyLT5idWZmZXIsIHNhbXBsZTEtPmluZm8uc2l6ZSksIDApOworCisgICAgICAgIHNhbXBsZTEgPSByZWFkU2FtcGxlQW5kQWR2YW5jZShtZWRpYVNvdXJjZS5tRXh0cmFjdG9yLCBudWxscHRyKTsKKyAgICAgICAgc2FtcGxlMiA9IHJlYWRTYW1wbGVBbmRBZHZhbmNlKGV4dHJhY3RvciwgbnVsbHB0cik7CisgICAgfQorICAgIEVYUEVDVF9FUShzYW1wbGUxLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoc2FtcGxlMiwgbnVsbHB0cik7CisKKyAgICBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKGV4dHJhY3Rvcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cy5jcHAgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxZTk4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9NZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcApAQCAtMCwwICsxLDMzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFUcmFja1RyYW5zY29kZXIKKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9WaWRlb1RyYWNrVHJhbnNjb2Rlci5oPgorCisjaW5jbHVkZSAiVHJhbnNjb2RlclRlc3RVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKiBUcmFja1RyYW5zY29kZXIgdHlwZXMgdG8gdGVzdC4gKi8KK2VudW0gVHJhY2tUcmFuc2NvZGVyVHlwZSB7CisgICAgVklERU8sCisgICAgUEFTU1RIUk9VR0gsCit9OworCitjbGFzcyBNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUcmFja1RyYW5zY29kZXJUeXBlPiB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBjcmVhdGVkIjsgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBzZXQgdXAiOworCisgICAgICAgIC8vIE5lZWQgdG8gc3RhcnQgYSB0aHJlYWQgcG9vbCB0byBwcmV2ZW50IEFNZWRpYUV4dHJhY3RvciBiaW5kZXIgY2FsbHMgZnJvbSBzdGFydmluZworICAgICAgICAvLyAoYi8xNTU2NjM1NjEpLgorICAgICAgICBBQmluZGVyUHJvY2Vzc19zdGFydFRocmVhZFBvb2woKTsKKworICAgICAgICBtQ2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4oKTsKKworICAgICAgICBzd2l0Y2ggKEdldFBhcmFtKCkpIHsKKyAgICAgICAgY2FzZSBWSURFTzoKKyAgICAgICAgICAgIG1UcmFuc2NvZGVyID0gVmlkZW9UcmFja1RyYW5zY29kZXI6OmNyZWF0ZShtQ2FsbGJhY2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFTU1RIUk9VR0g6CisgICAgICAgICAgICBtVHJhbnNjb2RlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8UGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXI+KG1DYWxsYmFjayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobVRyYW5zY29kZXIsIG51bGxwdHIpOworCisgICAgICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0Iik7CisgICAgfQorCisgICAgdm9pZCBpbml0U2FtcGxlUmVhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZVBhdGgpIHsKKyAgICAgICAgY29uc3QgaW50IHNvdXJjZUZkID0gb3Blbihzb3VyY2VQYXRoLCBPX1JET05MWSk7CisgICAgICAgIEFTU0VSVF9HVChzb3VyY2VGZCwgMCk7CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoc291cmNlRmQsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgbHNlZWsoc291cmNlRmQsIDAsIFNFRUtfU0VUKTsKKworICAgICAgICBtTWVkaWFTYW1wbGVSZWFkZXIgPSBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Y3JlYXRlRnJvbUZkKHNvdXJjZUZkLCAwIC8qIG9mZnNldCAqLywgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobU1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKyAgICAgICAgY2xvc2Uoc291cmNlRmQpOworCisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmIChHZXRQYXJhbSgpID09IFZJREVPICYmIHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICBtVHJhY2tJbmRleCA9IHRyYWNrSW5kZXg7CisKKyAgICAgICAgICAgICAgICBtU291cmNlRm9ybWF0ID0gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4odHJhY2tGb3JtYXQsICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUobVNvdXJjZUZvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBtRGVzdGluYXRpb25Gb3JtYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tUcmFuc2NvZGVyVGVzdFV0aWxzOjpnZXREZWZhdWx0VmlkZW9EZXN0aW5hdGlvbkZvcm1hdCh0cmFja0Zvcm1hdCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG1EZXN0aW5hdGlvbkZvcm1hdCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEdldFBhcmFtKCkgPT0gUEFTU1RIUk9VR0ggJiYgc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8obG5pbHNzb24pOiBUZXN0IG1ldGFkYXRhIHRyYWNrIHBhc3N0aHJvdWdoIGFmdGVyIGhrdWFuZ0AgcHJvdmlkZXMgc2FtcGxlLgorICAgICAgICAgICAgICAgIG1UcmFja0luZGV4ID0gdHJhY2tJbmRleDsKKworICAgICAgICAgICAgICAgIG1Tb3VyY2VGb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pih0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShtU291cmNlRm9ybWF0LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfTkUobVNvdXJjZUZvcm1hdCwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKG1UcmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICB9CisKKyAgICAvLyBEcmFpbnMgdGhlIHRyYW5zY29kZXIncyBvdXRwdXQgcXVldWUgaW4gYSBsb29wLgorICAgIHZvaWQgZHJhaW5PdXRwdXRTYW1wbGVzKGludCBudW1TYW1wbGVzVG9TYXZlID0gMCkgeworICAgICAgICBtVHJhbnNjb2Rlci0+c2V0U2FtcGxlQ29uc3VtZXIoCisgICAgICAgICAgICAgICAgW3RoaXMsIG51bVNhbXBsZXNUb1NhdmVdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTkUoc2FtcGxlLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgICAgICBtR290RW5kT2ZTdHJlYW0gPSAoc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVNhdmVkU2FtcGxlcy5zaXplKCkgPCBudW1TYW1wbGVzVG9TYXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2F2ZWRTYW1wbGVzLnB1c2hfYmFjayhzYW1wbGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TYXZlZFNhbXBsZXMuc2l6ZSgpID09IG51bVNhbXBsZXNUb1NhdmUgfHwgbUdvdEVuZE9mU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1NhdmVkU2VtYXBob3JlLnNpZ25hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyB0ZWFyIGRvd24iOyB9CisKKyAgICB+TWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cyBkZXN0cm95ZWQiOyB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFUcmFja1RyYW5zY29kZXI+IG1UcmFuc2NvZGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0VHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbU1lZGlhU2FtcGxlUmVhZGVyOworICAgIGludCBtVHJhY2tJbmRleDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IG1Tb3VyY2VGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbURlc3RpbmF0aW9uRm9ybWF0OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPj4gbVNhdmVkU2FtcGxlczsKKyAgICBPbmVTaG90U2VtYXBob3JlIG1TYW1wbGVzU2F2ZWRTZW1hcGhvcmU7CisgICAgYm9vbCBtR290RW5kT2ZTdHJlYW0gPSBmYWxzZTsKK307CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBXYWl0Tm9ybWFsT3BlcmF0aW9uKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBXYWl0Tm9ybWFsT3BlcmF0aW9uIjsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEFTU0VSVF9UUlVFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBkcmFpbk91dHB1dFNhbXBsZXMoKTsKKyAgICBFWFBFQ1RfRVEobUNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9UUlVFKG1DYWxsYmFjay0+dHJhbnNjb2RpbmdGaW5pc2hlZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShtR290RW5kT2ZTdHJlYW0pOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgU3RvcE5vcm1hbE9wZXJhdGlvbikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgU3RvcE5vcm1hbE9wZXJhdGlvbiI7CisKKyAgICAvLyBVc2UgYSBsb25nZXIgdGVzdCBhc3NldCB0byBtYWtlIHN1cmUgdGhhdCB0cmFuc2NvZGluZyBjYW4gYmUgc3RvcHBlZC4KKyAgICBpbml0U2FtcGxlUmVhZGVyKCIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiKTsKKworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX1RSVUUobVRyYW5zY29kZXItPnN0YXJ0KCkpOworICAgIG1DYWxsYmFjay0+d2FpdFVudGlsVHJhY2tGb3JtYXRBdmFpbGFibGUoKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9FUShtQ2FsbGJhY2stPndhaXRVbnRpbEZpbmlzaGVkKCksIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX1RSVUUobUNhbGxiYWNrLT50cmFuc2NvZGluZ1dhc1N0b3BwZWQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBTdGFydFdpdGhvdXRDb25maWd1cmUpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFN0YXJ0V2l0aG91dENvbmZpZ3VyZSI7CisgICAgRVhQRUNUX0ZBTFNFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIFN0b3BXaXRob3V0U3RhcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFN0b3BXaXRob3V0U3RhcnQiOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgbVRyYW5zY29kZXItPnN0b3AoKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIERvdWJsZVN0YXJ0U3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRG91YmxlU3RhcnRTdG9wIjsKKworICAgIC8vIFVzZSBhIGxvbmdlciB0ZXN0IGFzc2V0IHRvIG1ha2Ugc3VyZSB0aGF0IHRyYW5zY29kaW5nIGNhbiBiZSBzdG9wcGVkLgorICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCIpOworCisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2FsbGJhY2stPnRyYW5zY29kaW5nV2FzU3RvcHBlZCgpKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIERvdWJsZUNvbmZpZ3VyZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgRG91YmxlQ29uZmlndXJlIjsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRCk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBDb25maWd1cmVBZnRlckZhaWwpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIENvbmZpZ3VyZUFmdGVyRmFpbCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCAtMSwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICBFWFBFQ1RfRVEobVRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgUmVzdGFydEFmdGVyU3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgUmVzdGFydEFmdGVyU3RvcCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgbVRyYW5zY29kZXItPnN0b3AoKTsKKyAgICBFWFBFQ1RfRVEobUNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBSZXN0YXJ0QWZ0ZXJGaW5pc2gpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFJlc3RhcnRBZnRlckZpbmlzaCI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgZHJhaW5PdXRwdXRTYW1wbGVzKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgRVhQRUNUX1RSVUUobUdvdEVuZE9mU3RyZWFtKTsKK30KKworVEVTVF9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsIEhvbGRTYW1wbGVBZnRlclRyYW5zY29kZXJSZWxlYXNlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBIb2xkU2FtcGxlQWZ0ZXJUcmFuc2NvZGVyUmVsZWFzZSI7CisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7CisgICAgZHJhaW5PdXRwdXRTYW1wbGVzKDEgLyogbnVtU2FtcGxlc1RvU2F2ZSAqLyk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICBtVHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9UUlVFKG1Hb3RFbmRPZlN0cmVhbSk7CisKKyAgICBtVHJhbnNjb2Rlci5yZXNldCgpOworCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjApKTsKKyAgICBtU2F2ZWRTYW1wbGVzLmNsZWFyKCk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBIb2xkU2FtcGxlQWZ0ZXJUcmFuc2NvZGVyU3RvcCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgSG9sZFNhbXBsZUFmdGVyVHJhbnNjb2RlclN0b3AiOworICAgIEVYUEVDVF9FUShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgQVNTRVJUX1RSVUUobVRyYW5zY29kZXItPnN0YXJ0KCkpOworICAgIGRyYWluT3V0cHV0U2FtcGxlcygxIC8qIG51bVNhbXBsZXNUb1NhdmUgKi8pOworICAgIG1TYW1wbGVzU2F2ZWRTZW1hcGhvcmUud2FpdCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKCk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSk7CisgICAgbVNhdmVkU2FtcGxlcy5jbGVhcigpOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgTnVsbFNhbXBsZVJlYWRlcikgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgTnVsbFNhbXBsZVJlYWRlciI7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlUmVhZGVyPiBudWxsU2FtcGxlUmVhZGVyOworICAgIEVYUEVDVF9ORShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG51bGxTYW1wbGVSZWFkZXIsIG1UcmFja0luZGV4LCBtRGVzdGluYXRpb25Gb3JtYXQpLCBBTUVESUFfT0spOworICAgIEFTU0VSVF9GQUxTRShtVHJhbnNjb2Rlci0+c3RhcnQoKSk7Cit9CisKK1RFU1RfUChNZWRpYVRyYWNrVHJhbnNjb2RlclRlc3RzLCBJbnZhbGlkVHJhY2tJbmRleCkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgSW52YWxpZFRyYWNrSW5kZXgiOworICAgIEVYUEVDVF9ORShtVHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgLTEsIG1EZXN0aW5hdGlvbkZvcm1hdCksIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX05FKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtTWVkaWFTYW1wbGVSZWFkZXItPmdldFRyYWNrQ291bnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVzdGluYXRpb25Gb3JtYXQpLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworfQorCitURVNUX1AoTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cywgU3RvcE9uU3luYykgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgU3RvcE9uU3luYyI7CisKKyAgICAvLyBVc2UgYSBsb25nZXIgdGVzdCBhc3NldCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgYSBHT1AgdG8gZmluaXNoLgorICAgIGluaXRTYW1wbGVSZWFkZXIoIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCIpOworCisgICAgRVhQRUNUX0VRKG1UcmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKworICAgIGJvb2wgbGFzdFNhbXBsZVdhc0VvcyA9IGZhbHNlOworICAgIGJvb2wgbGFzdFJlYWxTYW1wbGVXYXNTeW5jID0gZmFsc2U7CisgICAgT25lU2hvdFNlbWFwaG9yZSBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmU7CisgICAgdWludDMyX3Qgc2FtcGxlQ291bnQgPSAwOworCisgICAgbVRyYW5zY29kZXItPnNldFNhbXBsZUNvbnN1bWVyKFsmXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisKKyAgICAgICAgaWYgKChsYXN0U2FtcGxlV2FzRW9zID0gc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIHNhbXBsZXNSZWNlaXZlZFNlbWFwaG9yZS5zaWduYWwoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsYXN0UmVhbFNhbXBsZVdhc1N5bmMgPSBzYW1wbGUtPmluZm8uZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRTsKKworICAgICAgICBpZiAoKytzYW1wbGVDb3VudCA+PSAxMCkgeyAgLy8gV2FpdCBmb3IgYSBmZXcgc2FtcGxlcyBiZWZvcmUgc3RvcHBpbmcuCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmUuc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9KTsKKworICAgIEFTU0VSVF9UUlVFKG1UcmFuc2NvZGVyLT5zdGFydCgpKTsKKyAgICBzYW1wbGVzUmVjZWl2ZWRTZW1hcGhvcmUud2FpdCgpOworICAgIG1UcmFuc2NvZGVyLT5zdG9wKHRydWUgLyogc3RvcE9uU3luYyAqLyk7CisgICAgRVhQRUNUX0VRKG1DYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKworICAgIEVYUEVDVF9UUlVFKGxhc3RTYW1wbGVXYXNFb3MpOworICAgIEVYUEVDVF9UUlVFKGxhc3RSZWFsU2FtcGxlV2FzU3luYyk7CisgICAgRVhQRUNUX1RSVUUobUNhbGxiYWNrLT50cmFuc2NvZGluZ1dhc1N0b3BwZWQoKSk7Cit9CisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHNBbGwsIE1lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoVklERU8sIFBBU1NUSFJPVUdIKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvTWVkaWFUcmFuc2NvZGVyVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhbnNjb2RlclRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M3YmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL01lZGlhVHJhbnNjb2RlclRlc3RzLmNwcApAQCAtMCwwICsxLDQxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFUcmFuc2NvZGVyCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RlclRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU2FtcGxlUmVhZGVyTkRLLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrQ29tbW9uLmg+CisKKyNpbmNsdWRlICJUcmFuc2NvZGVyVGVzdFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBERUZJTkVfRk9STUFUX1ZBTFVFX0VRVUFMX0ZVTkMoX3R5cGUsIF90eXBlTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBib29sIGVxdWFsIyNfdHlwZU5hbWUoY29uc3QgY2hhcioga2V5LCBBTWVkaWFGb3JtYXQqIHNyYywgQU1lZGlhRm9ybWF0KiBkc3QpIHsgXAorICAgICAgICBfdHlwZSBzcmNWYWwsIGRzdFZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBib29sIHNyY1ByZXNlbnQgPSBBTWVkaWFGb3JtYXRfZ2V0IyNfdHlwZU5hbWUoc3JjLCBrZXksICZzcmNWYWwpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBib29sIGRzdFByZXNlbnQgPSBBTWVkaWFGb3JtYXRfZ2V0IyNfdHlwZU5hbWUoZHN0LCBrZXksICZkc3RWYWwpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKHNyY1ByZXNlbnQgPT0gZHN0UHJlc2VudCkgJiYgKCFzcmNQcmVzZW50IHx8IChzcmNWYWwgPT0gZHN0VmFsKSk7ICAgICAgICAgXAorICAgIH0KKworREVGSU5FX0ZPUk1BVF9WQUxVRV9FUVVBTF9GVU5DKGludDY0X3QsIEludDY0KTsKK0RFRklORV9GT1JNQVRfVkFMVUVfRVFVQUxfRlVOQyhpbnQzMl90LCBJbnQzMik7CisKK3N0cnVjdCBGb3JtYXRWZXJpZmllckVudHJ5IHsKKyAgICBjb25zdCBjaGFyKiBrZXk7CisgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IGNoYXIqLCBBTWVkaWFGb3JtYXQqLCBBTWVkaWFGb3JtYXQqKT4gZXF1YWw7Cit9OworCitzdGF0aWMgY29uc3QgRm9ybWF0VmVyaWZpZXJFbnRyeSBrRmllbGRzVG9QcmVzZXJ2ZVtdID0geworICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZXF1YWxJbnQ2NH0sICAgICAgIHtBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBlcXVhbEludDMyfSwgICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsIGVxdWFsSW50MzJ9LCAgICB7QU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCBlcXVhbEludDMyfSwKKyAgICAgICAge0FNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGVxdWFsSW50MzJ9LCB7QU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEgsIGVxdWFsSW50MzJ9LAorICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBlcXVhbEludDMyfSwgICAgIHtBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCBlcXVhbEludDMyfSwKK307CisKKy8vIFdyaXRlLW9ubHksIGNyZWF0ZSBmaWxlIGlmIG5vbi1leGlzdGVudCwgZG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUuCitzdGF0aWMgY29uc3RleHByIGludCBrT3BlbkZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMOworLy8gVXNlciBSK1cgcGVybWlzc2lvbi4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtGaWxlTW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOworCitjbGFzcyBNZWRpYVRyYW5zY29kZXJUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhVHJhbnNjb2RlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJNZWRpYVRyYW5zY29kZXJUZXN0cyBjcmVhdGVkIjsgfQorICAgIH5NZWRpYVRyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFuc2NvZGVyVGVzdHMgZGVzdHJveWVkIjsgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiTWVkaWFUcmFuc2NvZGVyVGVzdHMgc2V0IHVwIjsKKyAgICAgICAgbUNhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFRyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIk1lZGlhVHJhbnNjb2RlclRlc3RzIHRlYXIgZG93biI7CisgICAgICAgIG1DYWxsYmFja3MucmVzZXQoKTsKKyAgICB9CisKKyAgICB2b2lkIGRlbGV0ZUZpbGUoY29uc3QgY2hhciogcGF0aCkgeyB1bmxpbmsocGF0aCk7IH0KKworICAgIGZsb2F0IGdldEZpbGVTaXplRGlmZlBlcmNlbnQoY29uc3QgY2hhciogcGF0aDEsIGNvbnN0IGNoYXIqIHBhdGgyLCBib29sIGFic29sdXRlID0gZmFsc2UpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgczEsIHMyOworICAgICAgICBFWFBFQ1RfRVEoc3RhdChwYXRoMSwgJnMxKSwgMCk7CisgICAgICAgIEVYUEVDVF9FUShzdGF0KHBhdGgyLCAmczIpLCAwKTsKKworICAgICAgICBpbnQ2NF90IGRpZmYgPSBzMi5zdF9zaXplIC0gczEuc3Rfc2l6ZTsKKyAgICAgICAgaWYgKGFic29sdXRlICYmIGRpZmYgPCAwKSBkaWZmID0gLWRpZmY7CisKKyAgICAgICAgcmV0dXJuIChmbG9hdClkaWZmICogMTAwLjBmIC8gczEuc3Rfc2l6ZTsKKyAgICB9CisKKyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBrUnVuVG9Db21wbGV0aW9uLAorICAgICAgICBrQ2hlY2tIZWFydEJlYXQsCisgICAgICAgIGtDYW5jZWxBZnRlclByb2dyZXNzLAorICAgICAgICBrQ2FuY2VsQWZ0ZXJTdGFydCwKKyAgICAgICAga1BhdXNlQWZ0ZXJQcm9ncmVzcywKKyAgICAgICAga1BhdXNlQWZ0ZXJTdGFydCwKKyAgICB9IFRyYW5zY29kZUV4ZWN1dGlvbkNvbnRyb2w7CisKKyAgICB1c2luZyBGb3JtYXRDb25maWd1cmF0aW9uQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPEFNZWRpYUZvcm1hdCooQU1lZGlhRm9ybWF0Kik+OworICAgIG1lZGlhX3N0YXR1c190IHRyYW5zY29kZUhlbHBlcihjb25zdCBjaGFyKiBzcmNQYXRoLCBjb25zdCBjaGFyKiBkZXN0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0Q29uZmlndXJhdGlvbkNhbGxiYWNrIGZvcm1hdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGVFeGVjdXRpb25Db250cm9sIGV4ZWN1dGlvbkNvbnRyb2wgPSBrUnVuVG9Db21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGhlYXJ0QmVhdEludGVydmFsVXMgPSAtMSkgeworICAgICAgICBhdXRvIHRyYW5zY29kZXIgPSBNZWRpYVRyYW5zY29kZXI6OmNyZWF0ZShtQ2FsbGJhY2tzLCBoZWFydEJlYXRJbnRlcnZhbFVzKTsKKyAgICAgICAgRVhQRUNUX05FKHRyYW5zY29kZXIsIG51bGxwdHIpOworCisgICAgICAgIGNvbnN0IGludCBzcmNGZCA9IG9wZW4oc3JjUGF0aCwgT19SRE9OTFkpOworICAgICAgICBFWFBFQ1RfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlU291cmNlKHNyY0ZkKSwgQU1FRElBX09LKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgICAgIEVYUEVDVF9HVCh0cmFja0Zvcm1hdHMuc2l6ZSgpLCAwKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrRm9ybWF0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBmb3JtYXRDYWxsYmFjayh0cmFja0Zvcm1hdHNbaV0uZ2V0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGZvcm1hdCksIEFNRURJQV9PSyk7CisKKyAgICAgICAgICAgIC8vIFNhdmUgb3JpZ2luYWwgdmlkZW8gdHJhY2sgZm9ybWF0IGZvciB2ZXJpZmljYXRpb24uCisgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXRzW2ldLmdldCgpLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVNvdXJjZVZpZGVvRm9ybWF0ID0gdHJhY2tGb3JtYXRzW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlRmlsZShkZXN0UGF0aCk7CisgICAgICAgIGNvbnN0IGludCBkc3RGZCA9IG9wZW4oZGVzdFBhdGgsIGtPcGVuRmxhZ3MsIGtGaWxlTW9kZSk7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLT5jb25maWd1cmVEZXN0aW5hdGlvbihkc3RGZCksIEFNRURJQV9PSyk7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhcnRTdGF0dXMgPSB0cmFuc2NvZGVyLT5zdGFydCgpOworICAgICAgICBFWFBFQ1RfRVEoc3RhcnRTdGF0dXMsIEFNRURJQV9PSyk7CisKKyAgICAgICAgaWYgKHN0YXJ0U3RhdHVzID09IEFNRURJQV9PSykgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4gcGF1c2VkU3RhdGU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXhlY3V0aW9uQ29udHJvbCkgeworICAgICAgICAgICAgY2FzZSBrQ2FuY2VsQWZ0ZXJQcm9ncmVzczoKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yUHJvZ3Jlc3NNYWRlKCk7CisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgICAgICAgICBjYXNlIGtDYW5jZWxBZnRlclN0YXJ0OgorICAgICAgICAgICAgICAgIHRyYW5zY29kZXItPmNhbmNlbCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrUGF1c2VBZnRlclByb2dyZXNzOgorICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPndhaXRGb3JQcm9ncmVzc01hZGUoKTsKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgICAgIGNhc2Uga1BhdXNlQWZ0ZXJTdGFydDoKKyAgICAgICAgICAgICAgICB0cmFuc2NvZGVyLT5wYXVzZSgmcGF1c2VkU3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrQ2hlY2tIZWFydEJlYXQ6IHsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yUHJvZ3Jlc3NNYWRlKCk7CisgICAgICAgICAgICAgICAgYXV0byBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpOworICAgICAgICAgICAgICAgIGF1dG8gZmluaXNoVGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpOworICAgICAgICAgICAgICAgIGludDMyX3QgZXhwZWN0ZWRDb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoZmluaXNoVGltZSAtIHN0YXJ0VGltZSkgLyBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGhlYXJ0QmVhdEludGVydmFsVXMpOworICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgcmVsYXggdGhlIGV4cGVjdGVkIGNvdW50IGJ5IDEsIGluIGNhc2UgdGhlIGxhc3QgaGVhcnQtYmVhdCBqdXN0CisgICAgICAgICAgICAgICAgLy8gbWlzc2VkIHRoZSB3aW5kb3csIG90aGVyIHRoYW4gdGhhdCB0aGUgY291bnQgc2hvdWxkIGJlIGV4YWN0LgorICAgICAgICAgICAgICAgIEVYUEVDVF9HRShtQ2FsbGJhY2tzLT5tSGVhcnRCZWF0Q291bnQsIGV4cGVjdGVkQ291bnQgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2Uga1J1blRvQ29tcGxldGlvbjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy0+d2FpdEZvclRyYW5zY29kaW5nRmluaXNoZWQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZShzcmNGZCk7CisgICAgICAgIGNsb3NlKGRzdEZkKTsKKworICAgICAgICByZXR1cm4gbUNhbGxiYWNrcy0+bVN0YXR1czsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RUcmFuc2NvZGVWaWRlbyhjb25zdCBjaGFyKiBzcmNQYXRoLCBjb25zdCBjaGFyKiBkZXN0UGF0aCwgY29uc3QgY2hhciogZHN0TWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGUgPSAwKSB7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVIZWxwZXIoc3JjUGF0aCwgZGVzdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RzdE1pbWUsIGJpdHJhdGVdKEFNZWRpYUZvcm1hdCogc291cmNlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoc291cmNlRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0cmF0ZSA+IDAgfHwgZHN0TWltZSAhPSBudWxscHRyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYml0cmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0TWltZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdE1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgICBBTUVESUFfT0spOworCisgICAgICAgIGlmIChkc3RNaW1lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZvcm1hdFZlcmlmaWVyRW50cnk+IGV4dHJhVmVyaWZpZXJzID0geworICAgICAgICAgICAgICAgICAgICB7QU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgW2RzdE1pbWVdKGNvbnN0IGNoYXIqIGtleSwgQU1lZGlhRm9ybWF0KiBzcmMgX191bnVzZWQsIEFNZWRpYUZvcm1hdCogZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhkc3QsIGtleSwgJm1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKG1pbWUsIGRzdE1pbWUpOworICAgICAgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICB9OworICAgICAgICAgICAgdmVyaWZ5T3V0cHV0Rm9ybWF0KGRlc3RQYXRoLCAmZXh0cmFWZXJpZmllcnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmVyaWZ5T3V0cHV0Rm9ybWF0KGRlc3RQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgdmVyaWZ5T3V0cHV0Rm9ybWF0KGNvbnN0IGNoYXIqIGRlc3RQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZvcm1hdFZlcmlmaWVyRW50cnk+KiBleHRyYVZlcmlmaWVycyA9IG51bGxwdHIpIHsKKyAgICAgICAgaW50IGRzdEZkID0gb3BlbihkZXN0UGF0aCwgT19SRE9OTFkpOworICAgICAgICBFWFBFQ1RfR1QoZHN0RmQsIDApOworICAgICAgICBzc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoZHN0RmQsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgbHNlZWsoZHN0RmQsIDAsIFNFRUtfU0VUKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IHNhbXBsZVJlYWRlciA9CisgICAgICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChkc3RGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUoc2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiB2aWRlb0Zvcm1hdDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHRyYWNrQ291bnQgPSBzYW1wbGVSZWFkZXItPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCogdHJhY2tGb3JtYXQgPSBzYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KHN0YXRpY19jYXN0PGludD4odHJhY2tJbmRleCkpOworICAgICAgICAgICAgaWYgKHRyYWNrRm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiVHJhY2sgIyAiIDw8IHRyYWNrSW5kZXggPDwgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9Gb3JtYXQgPSBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pih0cmFja0Zvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFWFBFQ1RfTkUodmlkZW9Gb3JtYXQsIG51bGxwdHIpOworICAgICAgICBpZiAodmlkZW9Gb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJzb3VyY2UgdmlkZW8gZm9ybWF0OiAiIDw8IEFNZWRpYUZvcm1hdF90b1N0cmluZyhtU291cmNlVmlkZW9Gb3JtYXQuZ2V0KCkpOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJ0cmFuc2NvZGVkIHZpZGVvIGZvcm1hdDogIiA8PCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcodmlkZW9Gb3JtYXQuZ2V0KCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IChzaXplb2Yoa0ZpZWxkc1RvUHJlc2VydmUpIC8gc2l6ZW9mKGtGaWVsZHNUb1ByZXNlcnZlWzBdKSk7ICsraSkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGtGaWVsZHNUb1ByZXNlcnZlW2ldLmVxdWFsKGtGaWVsZHNUb1ByZXNlcnZlW2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlVmlkZW9Gb3JtYXQuZ2V0KCksIHZpZGVvRm9ybWF0LmdldCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgYXQga2V5ICIgPDwga0ZpZWxkc1RvUHJlc2VydmVbaV0ua2V5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXh0cmFWZXJpZmllcnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmFWZXJpZmllcnMtPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlcmlmaWVyRW50cnkmIGVudHJ5ID0gKCpleHRyYVZlcmlmaWVycylbaV07CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmVxdWFsKGVudHJ5LmtleSwgbVNvdXJjZVZpZGVvRm9ybWF0LmdldCgpLCB2aWRlb0Zvcm1hdC5nZXQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlKGRzdEZkKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdFRyYW5zY29kZXJDYWxsYmFja3M+IG1DYWxsYmFja3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbVNvdXJjZVZpZGVvRm9ybWF0OworfTsKKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0UGFzc3Rocm91Z2gpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1Bhc3N0aHJvdWdoLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBudWxscHRyKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0VmlkZW9UcmFuc2NvZGVfQXZjVG9BdmNfQmFzaWMpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0F2Y1RvQXZjX0Jhc2ljLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0VmlkZW9UcmFuc2NvZGVfSGV2Y1RvQXZjX0Jhc2ljKSB7CisgICAgY29uc3QgY2hhciogc3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2pldHNfaGV2Y18xMjgweDcyMF8yME1icHMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19CYXNpYy5NUDQiOworICAgIHRlc3RUcmFuc2NvZGVWaWRlbyhzcmNQYXRoLCBkZXN0UGF0aCwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19Sb3RhdGlvbikgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPQorICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvZGVza19oZXZjXzE5MjB4MTA4MF9hYWNfNDhLSHpfcm90OTAubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1ZpZGVvVHJhbnNjb2RlX0hldmNUb0F2Y19Sb3RhdGlvbi5NUDQiOworICAgIHRlc3RUcmFuc2NvZGVWaWRlbyhzcmNQYXRoLCBkZXN0UGF0aCwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFZpZGVvVHJhbnNjb2RlXzRLKSB7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgIExPRyhXQVJOSU5HKSA8PCAiU2tpcHBpbmcgNEsgdGVzdCBvbiB4ODYgYXMgU1cgZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IDRLLiI7CisgICAgcmV0dXJuOworI2Vsc2UKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvVmlkZW9fNEtfSEVWQ18xMEZyYW1lc19BdWRpby5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfNEsuTVA0IjsKKyAgICB0ZXN0VHJhbnNjb2RlVmlkZW8oc3JjUGF0aCwgZGVzdFBhdGgsIEFNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworI2VuZGlmCit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFByZXNlcnZlQml0cmF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfUHJlc2VydmVCaXRyYXRlLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIC8vIFJlcXVpcmUgbWF4aW11bSBvZiAyNSUgZGlmZmVyZW5jZSBpbiBmaWxlIHNpemUuCisgICAgLy8gVE9ETyhiLzE3NDY3ODMzNik6IEZpbmQgYSBiZXR0ZXIgdGVzdCBhc3NldCB0byB0aWdodGVuIHRoZSB0aHJlc2hvbGQuCisgICAgRVhQRUNUX0xUKGdldEZpbGVTaXplRGlmZlBlcmNlbnQoc3JjUGF0aCwgZGVzdFBhdGgsIHRydWUgLyogYWJzb2x1dGUqLyksIDI1KTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0Q3VzdG9tQml0cmF0ZSkgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9jdWJpY2xlX2F2Y180ODB4MjQwX2FhY18yNEtIei5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoMSA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX0N1c3RvbUJpdHJhdGVfMk1icHMuTVA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aDIgPSAiL2RhdGEvbG9jYWwvdG1wL01lZGlhVHJhbnNjb2Rlcl9DdXN0b21CaXRyYXRlXzhNYnBzLk1QNCI7CisgICAgdGVzdFRyYW5zY29kZVZpZGVvKHNyY1BhdGgsIGRlc3RQYXRoMSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgMiAqIDEwMDAgKiAxMDAwKTsKKyAgICBtQ2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0VHJhbnNjb2RlckNhbGxiYWNrcz4oKTsKKyAgICB0ZXN0VHJhbnNjb2RlVmlkZW8oc3JjUGF0aCwgZGVzdFBhdGgyLCBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCA4ICogMTAwMCAqIDEwMDApOworCisgICAgLy8gVGhlIHNvdXJjZSBhc3NldCBpcyB2ZXJ5IHNob3J0IGFuZCBoZWF2aWx5IGNvbXByZXNzZWQgZnJvbSB0aGUgYmVnaW5uaW5nIHNvIGRvbid0IGV4cGVjdCB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgYml0cmF0ZSB0byBiZSBleGFjdGx5IG1hdGNoZWQuIEhvd2V2ZXIgdGhlIDhtYnBzIHNob3VsZCBhdCBsZWFzdCBiZSBsYXJnZXIuCisgICAgLy8gVE9ETyhiLzE3NDY3ODMzNik6IEZpbmQgYSBiZXR0ZXIgdGVzdCBhc3NldCB0byB0aWdodGVuIHRoZSB0aHJlc2hvbGQuCisgICAgRVhQRUNUX0dUKGdldEZpbGVTaXplRGlmZlBlcmNlbnQoZGVzdFBhdGgxLCBkZXN0UGF0aDIpLCAxMCk7Cit9CisKK3N0YXRpYyBBTWVkaWFGb3JtYXQqIGdldEFWQ1ZpZGVvRm9ybWF0KEFNZWRpYUZvcm1hdCogc291cmNlRm9ybWF0KSB7CisgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoc291cmNlRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKworICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgIGZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgfQorCisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0Q2FuY2VsQWZ0ZXJQcm9ncmVzcykgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX0NhbmNlbC5NUDQiOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVIZWxwZXIoc3JjUGF0aCwgZGVzdFBhdGgsIGdldEFWQ1ZpZGVvRm9ybWF0LCBrQ2FuY2VsQWZ0ZXJQcm9ncmVzcyksCisgICAgICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgICAgICBFWFBFQ1RfRkFMU0UobUNhbGxiYWNrcy0+bUZpbmlzaGVkKTsKKyAgICAgICAgbUNhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFRyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgfQorfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGVyVGVzdHMsIFRlc3RDYW5jZWxBZnRlclN0YXJ0KSB7CisgICAgY29uc3QgY2hhciogc3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfQ2FuY2VsLk1QNCI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZUhlbHBlcihzcmNQYXRoLCBkZXN0UGF0aCwgZ2V0QVZDVmlkZW9Gb3JtYXQsIGtDYW5jZWxBZnRlclN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtQ2FsbGJhY2tzLT5tRmluaXNoZWQpOworICAgICAgICBtQ2FsbGJhY2tzID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0VHJhbnNjb2RlckNhbGxiYWNrcz4oKTsKKyAgICB9Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kZXJUZXN0cywgVGVzdFBhdXNlQWZ0ZXJQcm9ncmVzcykgeworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKyAgICBjb25zdCBjaGFyKiBkZXN0UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGVyX1BhdXNlLk1QNCI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKHRyYW5zY29kZUhlbHBlcihzcmNQYXRoLCBkZXN0UGF0aCwgZ2V0QVZDVmlkZW9Gb3JtYXQsIGtQYXVzZUFmdGVyUHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1DYWxsYmFja3MtPm1GaW5pc2hlZCk7CisgICAgICAgIG1DYWxsYmFja3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFuc2NvZGVyQ2FsbGJhY2tzPigpOworICAgIH0KK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RlclRlc3RzLCBUZXN0UGF1c2VBZnRlclN0YXJ0KSB7CisgICAgY29uc3QgY2hhciogc3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiOworICAgIGNvbnN0IGNoYXIqIGRlc3RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9NZWRpYVRyYW5zY29kZXJfUGF1c2UuTVA0IjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEodHJhbnNjb2RlSGVscGVyKHNyY1BhdGgsIGRlc3RQYXRoLCBnZXRBVkNWaWRlb0Zvcm1hdCwga1BhdXNlQWZ0ZXJTdGFydCksCisgICAgICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgICAgICBFWFBFQ1RfRkFMU0UobUNhbGxiYWNrcy0+bUZpbmlzaGVkKTsKKyAgICAgICAgbUNhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFRyYW5zY29kZXJDYWxsYmFja3M+KCk7CisgICAgfQorfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGVyVGVzdHMsIFRlc3RIZWFydEJlYXQpIHsKKyAgICBjb25zdCBjaGFyKiBzcmNQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvbG9uZ3Rlc3RfMTVzLm1wNCI7CisgICAgY29uc3QgY2hhciogZGVzdFBhdGggPSAiL2RhdGEvbG9jYWwvdG1wL01lZGlhVHJhbnNjb2Rlcl9IZWFydEJlYXQuTVA0IjsKKworICAgIC8vIFVzZSBhIHNob3J0ZXIgdmFsdWUgb2YgNTAwbXMgdGhhbiB0aGUgZGVmYXVsdCAxMDAwbXMgdG8gZ2V0IG1vcmUgaGVhcnQgYmVhdCBmb3IgdGVzdGluZy4KKyAgICBjb25zdCBpbnQ2NF90IGhlYXJ0QmVhdEludGVydmFsVXMgPSA1MDAwMDBMTDsKKyAgICBFWFBFQ1RfRVEodHJhbnNjb2RlSGVscGVyKHNyY1BhdGgsIGRlc3RQYXRoLCBnZXRBVkNWaWRlb0Zvcm1hdCwga0NoZWNrSGVhcnRCZWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcnRCZWF0SW50ZXJ2YWxVcyksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgRVhQRUNUX1RSVUUobUNhbGxiYWNrcy0+bUZpbmlzaGVkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9QYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJmNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcgorCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTYW1wbGVSZWFkZXJOREsuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIlRyYW5zY29kZXJUZXN0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cygpIHsgTE9HKERFQlVHKSA8PCAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cyBjcmVhdGVkIjsgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgTE9HKERFQlVHKSA8PCAiUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cyBzZXQgdXAiOyB9CisKKyAgICB2b2lkIGluaXRTb3VyY2VBbmRFeHRyYWN0b3IoKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNvdXJjZVBhdGggPQorICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2N1YmljbGVfYXZjXzQ4MHgyNDBfYWFjXzI0S0h6Lm1wNCI7CisKKyAgICAgICAgbUV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKG1FeHRyYWN0b3IsIG51bGxwdHIpOworCisgICAgICAgIG1Tb3VyY2VGZCA9IG9wZW4oc291cmNlUGF0aCwgT19SRE9OTFkpOworICAgICAgICBBU1NFUlRfR1QobVNvdXJjZUZkLCAwKTsKKworICAgICAgICBtU291cmNlRmlsZVNpemUgPSBsc2VlayhtU291cmNlRmQsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgbHNlZWsobVNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKG1FeHRyYWN0b3IsIG1Tb3VyY2VGZCwgMCwgbVNvdXJjZUZpbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKTsKKworICAgICAgICBjb25zdCBzaXplX3QgdHJhY2tDb3VudCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1FeHRyYWN0b3IpOworICAgICAgICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7IHRyYWNrSW5kZXgrKykgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiB0cmFja0Zvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrSW5kZXggPSB0cmFja0luZGV4OworICAgICAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhtRXh0cmFjdG9yLCB0cmFja0luZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzIHRlYXIgZG93biI7CisgICAgICAgIGlmIChtRXh0cmFjdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgICAgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVNvdXJjZUZkID4gMCkgeworICAgICAgICAgICAgY2xvc2UobVNvdXJjZUZkKTsKKyAgICAgICAgICAgIG1Tb3VyY2VGZCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgflBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMoKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIlBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMgZGVzdHJveWVkIjsKKyAgICB9CisKKyAgICBpbnQgbVNvdXJjZUZkID0gLTE7CisgICAgc2l6ZV90IG1Tb3VyY2VGaWxlU2l6ZTsKKyAgICBpbnQgbVRyYWNrSW5kZXg7CisgICAgQU1lZGlhRXh0cmFjdG9yKiBtRXh0cmFjdG9yID0gbnVsbHB0cjsKK307CisKKy8qKiBIZWxwZXIgY2xhc3MgZm9yIGNvbXBhcmluZyBzYW1wbGUgZGF0YSB1c2luZyBjaGVja3N1bXMuICovCitjbGFzcyBTYW1wbGVJRCB7CitwdWJsaWM6CisgICAgU2FtcGxlSUQoY29uc3QgdWludDhfdCogc2FtcGxlRGF0YSwgc3NpemVfdCBzYW1wbGVTaXplKSA6IG1TaXple3NhbXBsZVNpemV9IHsKKyAgICAgICAgTUQ1X0NUWCBtZDVDdHg7CisgICAgICAgIE1ENV9Jbml0KCZtZDVDdHgpOworICAgICAgICBNRDVfVXBkYXRlKCZtZDVDdHgsIHNhbXBsZURhdGEsIHNhbXBsZVNpemUpOworICAgICAgICBNRDVfRmluYWwobUNoZWNrc3VtLCAmbWQ1Q3R4KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2FtcGxlSUQmIHJocykgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemUgPT0gcmhzLm1TaXplICYmIG1lbWNtcChtQ2hlY2tzdW0sIHJocy5tQ2hlY2tzdW0sIE1ENV9ESUdFU1RfTEVOR1RIKSA9PSAwOworICAgIH0KKworICAgIHVpbnQ4X3QgbUNoZWNrc3VtW01ENV9ESUdFU1RfTEVOR1RIXTsKKyAgICBzc2l6ZV90IG1TaXplOworfTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHRoZSBvdXRwdXQgc2FtcGxlcyBvZiBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlciBhcmUgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2Ugc2FtcGxlcworICogYW5kIGluIGNvcnJlY3Qgb3JkZXIuCisgKi8KK1RFU1RfRihQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlclRlc3RzLCBTYW1wbGVFcXVhbGl0eSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgU2FtcGxlRXF1YWxpdHkiOworCisgICAgc3NpemVfdCBidWZmZXJTaXplID0gMTAyNDsKKyAgICBhdXRvIGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8dWludDhfdFtdPihidWZmZXJTaXplKTsKKworICAgIGluaXRTb3VyY2VBbmRFeHRyYWN0b3IoKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc2FtcGxlcyBvZiBhIHRyYWNrIGFuZCBzdG9yZSBzaXplIGFuZCBjaGVja3N1bXMuCisgICAgc3RkOjp2ZWN0b3I8U2FtcGxlSUQ+IHNhbXBsZUNoZWNrc3VtczsKKworICAgIGludDY0X3Qgc2FtcGxlVGltZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKG1FeHRyYWN0b3IpOworICAgIHdoaWxlIChzYW1wbGVUaW1lICE9IC0xKSB7CisgICAgICAgIGlmIChBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtRXh0cmFjdG9yKSA9PSBtVHJhY2tJbmRleCkgeworICAgICAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUobUV4dHJhY3Rvcik7CisgICAgICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8IHNhbXBsZVNpemUpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gc2FtcGxlU2l6ZTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0KKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKG1FeHRyYWN0b3IsIGJ1ZmZlci5nZXQoKSwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoYnl0ZXNSZWFkLCBzYW1wbGVTaXplKTsKKworICAgICAgICAgICAgU2FtcGxlSUQgc2FtcGxlSWR7YnVmZmVyLmdldCgpLCBzYW1wbGVTaXplfTsKKyAgICAgICAgICAgIHNhbXBsZUNoZWNrc3Vtcy5wdXNoX2JhY2soc2FtcGxlSWQpOworICAgICAgICB9CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UobUV4dHJhY3Rvcik7CisgICAgICAgIHNhbXBsZVRpbWUgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB0cmFuc2NvZGVyLgorICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4oKTsKKyAgICBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlciB0cmFuc2NvZGVye2NhbGxiYWNrfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZVJlYWRlcj4gbWVkaWFTYW1wbGVSZWFkZXIgPQorICAgICAgICAgICAgTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChtU291cmNlRmQsIDAsIG1Tb3VyY2VGaWxlU2l6ZSk7CisgICAgRVhQRUNUX05FKG1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKworICAgIEVYUEVDVF9FUShtZWRpYVNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sobVRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLmNvbmZpZ3VyZShtZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG51bGxwdHIgLyogZGVzdGluYXRpb25Gb3JtYXQgKi8pLAorICAgICAgICAgICAgICBBTUVESUFfT0spOworICAgIEFTU0VSVF9UUlVFKHRyYW5zY29kZXIuc3RhcnQoKSk7CisKKyAgICAvLyBQdWxsIHRyYW5zY29kZXIncyBvdXRwdXQgc2FtcGxlcyBhbmQgY29tcGFyZSBhZ2FpbnN0IGlucHV0IGNoZWNrc3Vtcy4KKyAgICBib29sIGVvcyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50ID0gMDsKKyAgICB0cmFuc2NvZGVyLnNldFNhbXBsZUNvbnN1bWVyKAorICAgICAgICAgICAgWyZzYW1wbGVDb3VudCwgJnNhbXBsZUNoZWNrc3VtcywgJmVvc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2FtcGxlPiYgc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGVvcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNhbXBsZUlEIHNhbXBsZUlke3NhbXBsZS0+YnVmZmVyLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihzYW1wbGUtPmluZm8uc2l6ZSl9OworICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShzYW1wbGVJZCA9PSBzYW1wbGVDaGVja3N1bXNbc2FtcGxlQ291bnRdKTsKKyAgICAgICAgICAgICAgICAgICAgKytzYW1wbGVDb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgIGNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpOworICAgIEVYUEVDVF9FUShzYW1wbGVDb3VudCwgc2FtcGxlQ2hlY2tzdW1zLnNpemUoKSk7Cit9CisKKy8qKiBDbGFzcyBmb3IgdGVzdGluZyBQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2RlcidzIGJ1aWx0IGluIGJ1ZmZlciBwb29sLiAqLworY2xhc3MgQnVmZmVyUG9vbFRlc3RzIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEJ1ZmZlcnMgPSA1OworCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQnVmZmVyUG9vbFRlc3RzIHNldCB1cCI7CisgICAgICAgIG1CdWZmZXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6QnVmZmVyUG9vbD4oa01heEJ1ZmZlcnMpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIkJ1ZmZlclBvb2xUZXN0cyB0ZWFyIGRvd24iOworICAgICAgICBtQnVmZmVyUG9vbC5yZXNldCgpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXNzdGhyb3VnaFRyYWNrVHJhbnNjb2Rlcjo6QnVmZmVyUG9vbD4gbUJ1ZmZlclBvb2w7Cit9OworCitURVNUX0YoQnVmZmVyUG9vbFRlc3RzLCBCdWZmZXJSZXVzZSkgeworICAgIExPRyhERUJVRykgPDwgIlRlc3RpbmcgQnVmZmVyUmV1c2UiOworCisgICAgdWludDhfdCogYnVmZmVyMSA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjEsIG51bGxwdHIpOworCisgICAgdWludDhfdCogYnVmZmVyMiA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjIsIG51bGxwdHIpOworICAgIEVYUEVDVF9ORShidWZmZXIyLCBidWZmZXIxKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisKKyAgICB1aW50OF90KiBidWZmZXIzID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMywgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjMsIGJ1ZmZlcjIpOworICAgIEVYUEVDVF9FUShidWZmZXIzLCBidWZmZXIxKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMik7CisKKyAgICB1aW50OF90KiBidWZmZXI0ID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyNCwgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjQsIGJ1ZmZlcjEpOworICAgIEVYUEVDVF9FUShidWZmZXI0LCBidWZmZXIyKTsKK30KKworVEVTVF9GKEJ1ZmZlclBvb2xUZXN0cywgU21hbGxlc3RBdmFpbGFibGVCdWZmZXIpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIFNtYWxsZXN0QXZhaWxhYmxlQnVmZmVyIjsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjEgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTApOworICAgIEVYUEVDVF9ORShidWZmZXIxLCBudWxscHRyKTsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjIgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTUpOworICAgIEVYUEVDVF9ORShidWZmZXIyLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMiwgYnVmZmVyMSk7CisKKyAgICB1aW50OF90KiBidWZmZXIzID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDIwKTsKKyAgICBFWFBFQ1RfTkUoYnVmZmVyMywgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjMsIGJ1ZmZlcjEpOworICAgIEVYUEVDVF9ORShidWZmZXIzLCBidWZmZXIyKTsKKworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIyKTsKKyAgICBtQnVmZmVyUG9vbC0+cmV0dXJuQnVmZmVyKGJ1ZmZlcjMpOworCisgICAgdWludDhfdCogYnVmZmVyNCA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMSk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjQsIG51bGxwdHIpOworICAgIEVYUEVDVF9FUShidWZmZXI0LCBidWZmZXIyKTsKKworICAgIHVpbnQ4X3QqIGJ1ZmZlcjUgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoMTEpOworICAgIEVYUEVDVF9ORShidWZmZXI1LCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyNSwgYnVmZmVyMyk7Cit9CisKK1RFU1RfRihCdWZmZXJQb29sVGVzdHMsIEFkZEFmdGVyQWJvcnQpIHsKKyAgICBMT0coREVCVUcpIDw8ICJUZXN0aW5nIEFkZEFmdGVyQWJvcnQiOworCisgICAgdWludDhfdCogYnVmZmVyMSA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZSgxMCk7CisgICAgRVhQRUNUX05FKGJ1ZmZlcjEsIG51bGxwdHIpOworICAgIG1CdWZmZXJQb29sLT5yZXR1cm5CdWZmZXIoYnVmZmVyMSk7CisKKyAgICBtQnVmZmVyUG9vbC0+YWJvcnQoKTsKKyAgICB1aW50OF90KiBidWZmZXIyID0gbUJ1ZmZlclBvb2wtPmdldEJ1ZmZlcldpdGhTaXplKDEwKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyMiwgbnVsbHB0cik7Cit9CisKK1RFU1RfRihCdWZmZXJQb29sVGVzdHMsIE1heGltdW1CdWZmZXJzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBNYXhpbXVtQnVmZmVycyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQnVmZmVyQmFzZVNpemUgPSAxMDsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDhfdCosIHNpemVfdD4gYWRkcmVzc1NpemVNYXA7CisKKyAgICAvLyBHZXQga01heEJ1ZmZlcnMgKiAyIG5ldyBidWZmZXJzIHdpdGggaW5jcmVhc2luZyBzaXplLgorICAgIC8vIChOb3RlOiBPbmNlIGtNYXhCdWZmZXJzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHRoZSBwb29sIHdpbGwgZGVsZXRlIG9sZCBidWZmZXJzIHRvIGFjY29tbW9kYXRlCisgICAgLy8gbmV3IG9uZXMgbWFraW5nIHRoZSBkZWxldGVkIGJ1ZmZlcnMgZnJlZSB0byBiZSByZXVzZWQgYnkgdGhlIHN5c3RlbSdzIGhlYXAgbWVtb3J5IGFsbG9jYXRvci4KKyAgICAvLyBTbyB3ZSBjYW5ub3QgdGVzdCB0aGF0IGVhY2ggbmV3IHBvaW50ZXIgaXMgdW5pcXVlIGhlcmUuKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEJ1ZmZlcnMgKiAyOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBrQnVmZmVyQmFzZVNpemUgKyBpOworICAgICAgICB1aW50OF90KiBidWZmZXIgPSBtQnVmZmVyUG9vbC0+Z2V0QnVmZmVyV2l0aFNpemUoc2l6ZSk7CisgICAgICAgIEVYUEVDVF9ORShidWZmZXIsIG51bGxwdHIpOworICAgICAgICBhZGRyZXNzU2l6ZU1hcFtidWZmZXJdID0gc2l6ZTsKKyAgICAgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgIH0KKworICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBwb29sIG5vdyBjb250YWlucyB0aGUga01heEJ1ZmZlcnMgbGFyZ2VzdCBidWZmZXJzIGFsbG9jYXRlZCBhYm92ZSBhbmQgdGhhdAorICAgIC8vIHRoZSBidWZmZXIgb2YgbWF0Y2hpbmcgc2l6ZSBpcyByZXR1cm5lZC4KKyAgICBmb3IgKGludCBpID0ga01heEJ1ZmZlcnM7IGkgPCBrTWF4QnVmZmVycyAqIDI7IGkrKykgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGtCdWZmZXJCYXNlU2l6ZSArIGk7CisgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciA9IG1CdWZmZXJQb29sLT5nZXRCdWZmZXJXaXRoU2l6ZShzaXplKTsKKyAgICAgICAgRVhQRUNUX05FKGJ1ZmZlciwgbnVsbHB0cik7CisKKyAgICAgICAgYXV0byBpdCA9IGFkZHJlc3NTaXplTWFwLmZpbmQoYnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKGl0LCBhZGRyZXNzU2l6ZU1hcC5lbmQoKSk7CisgICAgICAgIEVYUEVDVF9FUShpdC0+c2Vjb25kLCBzaXplKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wtPnJldHVybkJ1ZmZlcihidWZmZXIpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDE3YjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTQgQEAKKyMjIFRyYW5zY29kZXIgVGVzdGluZyAjIworLS0tCisjIyMjIFRyYW5zY29kZXIgdW5pdCB0ZXN0cyA6CitUbyBydW4gYWxsIHRyYW5zY29kZXIgdW5pdCB0ZXN0cywgcnVuIHRoZSBzdXBwbGllZCBzY3JpcHQgZnJvbSB0aGlzIGZvbGRlcjoKKworYGBgCisuL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKK2BgYAorCitUbyBydW4gaW5kaXZpZHVhbCB1bml0IHRlc3QgbW9kdWxlcywgdXNlIGF0ZXN0OgorCitgYGAKK2F0ZXN0IE1lZGlhU2FtcGxlUmVhZGVyTkRLCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9UcmFuc2NvZGVyVGVzdFV0aWxzLmggYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvVHJhbnNjb2RlclRlc3RVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmUyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvVHJhbnNjb2RlclRlc3RVdGlscy5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhbnNjb2Rlci5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRyYW5zY29kaW5nIHRlc3QgdXRpbGl0aWVzLgorLy8KKworbmFtZXNwYWNlIFRyYW5zY29kZXJUZXN0VXRpbHMgeworCitzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBHZXRWaWRlb0Zvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBtaW1lT3V0ID0gbnVsbHB0cikgeworICAgIGludCBmZCA9IG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSk7CisgICAgRVhQRUNUX0dUKGZkLCAwKTsKKyAgICBzc2l6ZV90IGZpbGVTaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCisgICAgYXV0byBzYW1wbGVSZWFkZXIgPSBNZWRpYVNhbXBsZVJlYWRlck5ESzo6Y3JlYXRlRnJvbUZkKGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgRVhQRUNUX05FKHNhbXBsZVJlYWRlciwgbnVsbHB0cik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZVJlYWRlci0+Z2V0VHJhY2tDb3VudCgpOyArK2kpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBzYW1wbGVSZWFkZXItPmdldFRyYWNrRm9ybWF0KGkpOworCisgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobWltZU91dCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbWltZU91dC0+YXNzaWduKG1pbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KGZvcm1hdCwgJkFNZWRpYUZvcm1hdF9kZWxldGUpOworICAgICAgICB9CisKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworfTsgIC8vIG5hbWVzcGFjZSBUcmFuc2NvZGVyVGVzdFV0aWxzCisKK2NsYXNzIFRyYWNrVHJhbnNjb2RlclRlc3RVdGlscyB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+IGdldERlZmF1bHRWaWRlb0Rlc3RpbmF0aW9uRm9ybWF0KAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0KiBzb3VyY2VGb3JtYXQsIGJvb2wgaW5jbHVkZUJpdHJhdGUgPSB0cnVlKSB7CisgICAgICAgIC8vIERlZmF1bHQgdmlkZW8gZGVzdGluYXRpb24gZm9ybWF0IHNldHVwLgorICAgICAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtGcmFtZVJhdGUgPSAzMC4wZjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtCaXRSYXRlID0gMiAqIDEwMDAgKiAxMDAwOworCisgICAgICAgIEFNZWRpYUZvcm1hdCogZGVzdGluYXRpb25Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jb3B5KGRlc3RpbmF0aW9uRm9ybWF0LCBzb3VyY2VGb3JtYXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZGVzdGluYXRpb25Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwga0ZyYW1lUmF0ZSk7CisgICAgICAgIGlmIChpbmNsdWRlQml0cmF0ZSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGRlc3RpbmF0aW9uRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBrQml0UmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4oZGVzdGluYXRpb25Gb3JtYXQsICZBTWVkaWFGb3JtYXRfZGVsZXRlKTsKKyAgICB9Cit9OworCitjbGFzcyBUZXN0VHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja1RyYW5zY29kZXJDYWxsYmFjayB7CitwdWJsaWM6CisgICAgVGVzdFRyYWNrVHJhbnNjb2RlckNhbGxiYWNrKCkgPSBkZWZhdWx0OworICAgIH5UZXN0VHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2soKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNZWRpYVRyYWNrVHJhbnNjb2RlckNhbGxiYWNrCisgICAgdm9pZCBvblRyYWNrRm9ybWF0QXZhaWxhYmxlKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtVHJhY2tGb3JtYXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICBtVHJhY2tGb3JtYXRBdmFpbGFibGVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZvaWQgb25UcmFja0ZpbmlzaGVkKGNvbnN0IE1lZGlhVHJhY2tUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1UcmFuc2NvZGluZ0ZpbmlzaGVkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmFja1N0b3BwZWQoY29uc3QgTWVkaWFUcmFja1RyYW5zY29kZXIqIHRyYW5zY29kZXIgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1UcmFuc2NvZGluZ0ZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbVRyYW5zY29kaW5nU3RvcHBlZCA9IHRydWU7CisgICAgICAgIG1UcmFuc2NvZGluZ0ZpbmlzaGVkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2b2lkIG9uVHJhY2tFcnJvcihjb25zdCBNZWRpYVRyYWNrVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtVHJhbnNjb2RpbmdGaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIG1UcmFuc2NvZGluZ0ZpbmlzaGVkQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisgICAgLy8gfk1lZGlhVHJhY2tUcmFuc2NvZGVyQ2FsbGJhY2sKKworICAgIG1lZGlhX3N0YXR1c190IHdhaXRVbnRpbEZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtVHJhbnNjb2RpbmdGaW5pc2hlZCkgeworICAgICAgICAgICAgbVRyYW5zY29kaW5nRmluaXNoZWRDb25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICB9CisKKyAgICB2b2lkIHdhaXRVbnRpbFRyYWNrRm9ybWF0QXZhaWxhYmxlKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtVHJhY2tGb3JtYXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIG1UcmFja0Zvcm1hdEF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCB0cmFuc2NvZGluZ1dhc1N0b3BwZWQoKSBjb25zdCB7IHJldHVybiBtVHJhbnNjb2RpbmdGaW5pc2hlZCAmJiBtVHJhbnNjb2RpbmdTdG9wcGVkOyB9CisgICAgYm9vbCB0cmFuc2NvZGluZ0ZpbmlzaGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYW5zY29kaW5nRmluaXNoZWQgJiYgIW1UcmFuc2NvZGluZ1N0b3BwZWQgJiYgbVN0YXR1cyA9PSBBTUVESUFfT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIG1lZGlhX3N0YXR1c190IG1TdGF0dXMgPSBBTUVESUFfT0s7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVRyYW5zY29kaW5nRmluaXNoZWRDb25kaXRpb247CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVRyYWNrRm9ybWF0QXZhaWxhYmxlQ29uZGl0aW9uOworICAgIGJvb2wgbVRyYW5zY29kaW5nRmluaXNoZWQgPSBmYWxzZTsKKyAgICBib29sIG1UcmFuc2NvZGluZ1N0b3BwZWQgPSBmYWxzZTsKKyAgICBib29sIG1UcmFja0Zvcm1hdEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworY2xhc3MgVGVzdFRyYW5zY29kZXJDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUZpbmlzaGVkKTsKKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBFWFBFQ1RfTkUoZXJyb3IsIEFNRURJQV9PSyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtRmluaXNoZWQpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtU3RhdHVzID0gZXJyb3I7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblByb2dyZXNzVXBkYXRlKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2dyZXNzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAocHJvZ3Jlc3MgPiAwICYmICFtUHJvZ3Jlc3NNYWRlKSB7CisgICAgICAgICAgICBtUHJvZ3Jlc3NNYWRlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSGVhcnRCZWF0KGNvbnN0IE1lZGlhVHJhbnNjb2RlciogdHJhbnNjb2RlciBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUhlYXJ0QmVhdENvdW50Kys7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxuZGs6OlNjb3BlZEFQYXJjZWw+JiBwYXVzZWRTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bnVzZWQpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHdhaXRGb3JUcmFuc2NvZGluZ0ZpbmlzaGVkKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtRmluaXNoZWQpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd2FpdEZvclByb2dyZXNzTWFkZSgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbVByb2dyZXNzTWFkZSAmJiAhbUZpbmlzaGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVkaWFfc3RhdHVzX3QgbVN0YXR1cyA9IEFNRURJQV9PSzsKKyAgICBib29sIG1GaW5pc2hlZCA9IGZhbHNlOworICAgIGludDMyX3QgbUhlYXJ0QmVhdENvdW50ID0gMDsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIGJvb2wgbVByb2dyZXNzTWFkZSA9IGZhbHNlOworfTsKKworY2xhc3MgT25lU2hvdFNlbWFwaG9yZSB7CitwdWJsaWM6CisgICAgdm9pZCB3YWl0KCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKCFtU2lnbmFsZWQpIHsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2lnbmFsKCkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVNpZ25hbGVkID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtU2lnbmFsZWQgPSBmYWxzZTsKK307CisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1ZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL1ZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cy5jcHAKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIFZpZGVvVHJhY2tUcmFuc2NvZGVyCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNhbXBsZVJlYWRlck5ESy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0NvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL1ZpZGVvVHJhY2tUcmFuc2NvZGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlICJUcmFuc2NvZGVyVGVzdFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVE9ETyhiLzE1NTMwNDQyMSk6IEltcGxlbWVudCBtb3JlIGFkdmFuY2VkIHZpZGVvIHNwZWNpZmljIHRlc3RzOgorLy8gIC0gQ29kZWMgY29udmVyc2lvbnMgKEhFVkMgLT4gQVZDKS4KKy8vICAtIEJpdHJhdGUgdmFsaWRhdGlvbi4KKy8vICAtIE91dHB1dCBmcmFtZSB2YWxpZGF0aW9uIHRocm91Z2ggUFNOUi4KKworY2xhc3MgVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cyA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMoKSB7IExPRyhERUJVRykgPDwgIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMgY3JlYXRlZCI7IH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIlZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMgc2V0IHVwIjsKKyAgICAgICAgY29uc3QgY2hhciogc291cmNlUGF0aCA9CisgICAgICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKKworICAgICAgICBjb25zdCBpbnQgc291cmNlRmQgPSBvcGVuKHNvdXJjZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgQVNTRVJUX0dUKHNvdXJjZUZkLCAwKTsKKworICAgICAgICBjb25zdCBvZmZfdCBmaWxlU2l6ZSA9IGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX0VORCk7CisgICAgICAgIGxzZWVrKHNvdXJjZUZkLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAgbU1lZGlhU2FtcGxlUmVhZGVyID0gTWVkaWFTYW1wbGVSZWFkZXJOREs6OmNyZWF0ZUZyb21GZChzb3VyY2VGZCwgMCwgZmlsZVNpemUpOworICAgICAgICBBU1NFUlRfTkUobU1lZGlhU2FtcGxlUmVhZGVyLCBudWxscHRyKTsKKyAgICAgICAgY2xvc2Uoc291cmNlRmQpOworCisgICAgICAgIGZvciAoc2l6ZV90IHRyYWNrSW5kZXggPSAwOyB0cmFja0luZGV4IDwgbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgKyt0cmFja0luZGV4KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQqIHRyYWNrRm9ybWF0ID0gbU1lZGlhU2FtcGxlUmVhZGVyLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUobWltZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmIChzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrSW5kZXggPSB0cmFja0luZGV4OworCisgICAgICAgICAgICAgICAgbVNvdXJjZUZvcm1hdCA9IHN0ZDo6c2hhcmVkX3B0cjxBTWVkaWFGb3JtYXQ+KHRyYWNrRm9ybWF0LCAmQU1lZGlhRm9ybWF0X2RlbGV0ZSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG1Tb3VyY2VGb3JtYXQsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgbURlc3RpbmF0aW9uRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrVHJhbnNjb2RlclRlc3RVdGlsczo6Z2V0RGVmYXVsdFZpZGVvRGVzdGluYXRpb25Gb3JtYXQodHJhY2tGb3JtYXQpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShtRGVzdGluYXRpb25Gb3JtYXQsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9ORShtU291cmNlRm9ybWF0LCBudWxscHRyKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBMT0coREVCVUcpIDw8ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIHRlYXIgZG93biI7IH0KKworICAgIH5WaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzKCkgeyBMT0coREVCVUcpIDw8ICJWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzIGRlc3Ryb3llZCI7IH0KKworICAgIHN0YXRpYyBpbnQzMl90IGdldENvbmZpZ3VyZWRCaXRyYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWaWRlb1RyYWNrVHJhbnNjb2Rlcj4mIHRyYW5zY29kZXIpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zY29kZXItPm1Db25maWd1cmVkQml0cmF0ZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGVSZWFkZXI+IG1NZWRpYVNhbXBsZVJlYWRlcjsKKyAgICBpbnQgbVRyYWNrSW5kZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEFNZWRpYUZvcm1hdD4gbVNvdXJjZUZvcm1hdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBtRGVzdGluYXRpb25Gb3JtYXQ7Cit9OworCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgU2FtcGxlU291bmRuZXNzKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBTYW1wbGVTb3VuZG5lc3MiOworICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4oKTsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKGNhbGxiYWNrKTsKKworICAgIEVYUEVDVF9FUShtTWVkaWFTYW1wbGVSZWFkZXItPnNlbGVjdFRyYWNrKG1UcmFja0luZGV4KSwgQU1FRElBX09LKTsKKyAgICBFWFBFQ1RfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIG1EZXN0aW5hdGlvbkZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9PSyk7CisgICAgQVNTRVJUX1RSVUUodHJhbnNjb2Rlci0+c3RhcnQoKSk7CisKKyAgICBib29sIGVvcyA9IGZhbHNlOworICAgIHVpbnQ2NF90IHNhbXBsZUNvdW50ID0gMDsKKyAgICB0cmFuc2NvZGVyLT5zZXRTYW1wbGVDb25zdW1lcihbJnNhbXBsZUNvdW50LCAmZW9zXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFTYW1wbGU+JiBzYW1wbGUpIHsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZSwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGZsYWdzID0gc2FtcGxlLT5pbmZvLmZsYWdzOworCisgICAgICAgIGlmIChzYW1wbGVDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBFeHBlY3QgZmlyc3Qgc2FtcGxlIHRvIGJlIGEgY29kZWMgY29uZmlnLgorICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGZsYWdzICYgU0FNUExFX0ZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX1NZTkNfU0FNUExFKSA9PSAwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX0VORF9PRl9TVFJFQU0pID09IDApOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGZsYWdzICYgU0FNUExFX0ZMQUdfUEFSVElBTF9GUkFNRSkgPT0gMCk7CisgICAgICAgIH0gZWxzZSBpZiAoc2FtcGxlQ291bnQgPT0gMSkgeworICAgICAgICAgICAgLy8gRXhwZWN0IHNlY29uZCBzYW1wbGUgdG8gYmUgYSBzeW5jIHNhbXBsZS4KKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChmbGFncyAmIFNBTVBMRV9GTEFHX0NPREVDX0NPTkZJRykgPT0gMCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoZmxhZ3MgJiBTQU1QTEVfRkxBR19TWU5DX1NBTVBMRSkgIT0gMCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoZmxhZ3MgJiBTQU1QTEVfRkxBR19FTkRfT0ZfU1RSRUFNKSA9PSAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdCBhIHZhbGlkIGJ1ZmZlciB1bmxlc3MgaXQgaXMgRU9TLgorICAgICAgICAgICAgRVhQRUNUX05FKHNhbXBsZS0+YnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgICAgIEVYUEVDVF9ORShzYW1wbGUtPmJ1ZmZlcklkLCAweEJBQURGMDBEKTsKKyAgICAgICAgICAgIEVYUEVDVF9HVChzYW1wbGUtPmluZm8uc2l6ZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoZW9zKTsKKyAgICAgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICArK3NhbXBsZUNvdW50OworICAgIH0pOworCisgICAgRVhQRUNUX0VRKGNhbGxiYWNrLT53YWl0VW50aWxGaW5pc2hlZCgpLCBBTUVESUFfT0spOworfQorCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgUHJlc2VydmVCaXRyYXRlKSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBQcmVzZXJ2ZUJpdHJhdGUiOworICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4oKTsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBWaWRlb1RyYWNrVHJhbnNjb2Rlcjo6Y3JlYXRlKGNhbGxiYWNrKTsKKworICAgIGF1dG8gZGVzdEZvcm1hdCA9IFRyYWNrVHJhbnNjb2RlclRlc3RVdGlsczo6Z2V0RGVmYXVsdFZpZGVvRGVzdGluYXRpb25Gb3JtYXQoCisgICAgICAgICAgICBtU291cmNlRm9ybWF0LmdldCgpLCBmYWxzZSAvKiBpbmNsdWRlQml0cmF0ZSovKTsKKyAgICBFWFBFQ1RfTkUoZGVzdEZvcm1hdCwgbnVsbHB0cik7CisKKyAgICBFWFBFQ1RfRVEobU1lZGlhU2FtcGxlUmVhZGVyLT5zZWxlY3RUcmFjayhtVHJhY2tJbmRleCksIEFNRURJQV9PSyk7CisKKyAgICBpbnQzMl90IHNyY0JpdHJhdGU7CisgICAgRVhQRUNUX0VRKG1NZWRpYVNhbXBsZVJlYWRlci0+Z2V0RXN0aW1hdGVkQml0cmF0ZUZvclRyYWNrKG1UcmFja0luZGV4LCAmc3JjQml0cmF0ZSksIEFNRURJQV9PSyk7CisKKyAgICBBU1NFUlRfRVEodHJhbnNjb2Rlci0+Y29uZmlndXJlKG1NZWRpYVNhbXBsZVJlYWRlciwgbVRyYWNrSW5kZXgsIGRlc3RGb3JtYXQpLCBBTUVESUFfT0spOworICAgIEFTU0VSVF9UUlVFKHRyYW5zY29kZXItPnN0YXJ0KCkpOworCisgICAgY2FsbGJhY2stPndhaXRVbnRpbFRyYWNrRm9ybWF0QXZhaWxhYmxlKCk7CisgICAgdHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9FUShjYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKworICAgIGludDMyX3Qgb3V0Qml0cmF0ZSA9IGdldENvbmZpZ3VyZWRCaXRyYXRlKHRyYW5zY29kZXIpOworICAgIEFTU0VSVF9HVChvdXRCaXRyYXRlLCAwKTsKKworICAgIEVYUEVDVF9FUShzcmNCaXRyYXRlLCBvdXRCaXRyYXRlKTsKK30KKworLy8gVmlkZW9UcmFja1RyYW5zY29kZXIgbmVlZHMgYSB2YWxpZCBkZXN0aW5hdGlvbiBmb3JtYXQuCitURVNUX0YoVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cywgTnVsbERlc3RpbmF0aW9uRm9ybWF0KSB7CisgICAgTE9HKERFQlVHKSA8PCAiVGVzdGluZyBOdWxsRGVzdGluYXRpb25Gb3JtYXQiOworICAgIGF1dG8gY2FsbGJhY2sgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RUcmFja1RyYW5zY29kZXJDYWxsYmFjaz4oKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0PiBudWxsRm9ybWF0OworCisgICAgYXV0byB0cmFuc2NvZGVyID0gVmlkZW9UcmFja1RyYW5zY29kZXI6OmNyZWF0ZShjYWxsYmFjayk7CisgICAgRVhQRUNUX0VRKHRyYW5zY29kZXItPmNvbmZpZ3VyZShtTWVkaWFTYW1wbGVSZWFkZXIsIDAgLyogdHJhY2tJbmRleCAqLywgbnVsbEZvcm1hdCksCisgICAgICAgICAgICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7Cit9CisKK1RFU1RfRihWaWRlb1RyYWNrVHJhbnNjb2RlclRlc3RzLCBMaW5nZXJpbmdFbmNvZGVyKSB7CisgICAgT25lU2hvdFNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgYXV0byBjYWxsYmFjayA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdFRyYWNrVHJhbnNjb2RlckNhbGxiYWNrPigpOworICAgIGF1dG8gdHJhbnNjb2RlciA9IFZpZGVvVHJhY2tUcmFuc2NvZGVyOjpjcmVhdGUoY2FsbGJhY2spOworCisgICAgRVhQRUNUX0VRKG1NZWRpYVNhbXBsZVJlYWRlci0+c2VsZWN0VHJhY2sobVRyYWNrSW5kZXgpLCBBTUVESUFfT0spOworICAgIEVYUEVDVF9FUSh0cmFuc2NvZGVyLT5jb25maWd1cmUobU1lZGlhU2FtcGxlUmVhZGVyLCBtVHJhY2tJbmRleCwgbURlc3RpbmF0aW9uRm9ybWF0KSwKKyAgICAgICAgICAgICAgQU1FRElBX09LKTsKKyAgICBBU1NFUlRfVFJVRSh0cmFuc2NvZGVyLT5zdGFydCgpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4+IHNhbXBsZXM7CisgICAgdHJhbnNjb2Rlci0+c2V0U2FtcGxlQ29uc3VtZXIoCisgICAgICAgICAgICBbJnNhbXBsZXMsICZzZW1hcGhvcmVdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVNhbXBsZT4mIHNhbXBsZSkgeworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzLnNpemUoKSA+PSA0KSByZXR1cm47CisKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoc2FtcGxlLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzLnB1c2hfYmFjayhzYW1wbGUpOworCisgICAgICAgICAgICAgICAgaWYgKHNhbXBsZXMuc2l6ZSgpID09IDQgfHwgc2FtcGxlLT5pbmZvLmZsYWdzICYgU0FNUExFX0ZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICBzZW1hcGhvcmUuc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgZW5jb2RlciB0byBvdXRwdXQgc2FtcGxlcyBiZWZvcmUgc3RvcHBpbmcgYW5kIHJlbGVhc2luZyB0aGUgdHJhbnNjb2Rlci4KKyAgICBzZW1hcGhvcmUud2FpdCgpOworCisgICAgdHJhbnNjb2Rlci0+c3RvcCgpOworICAgIEVYUEVDVF9FUShjYWxsYmFjay0+d2FpdFVudGlsRmluaXNoZWQoKSwgQU1FRElBX09LKTsKKyAgICB0cmFuc2NvZGVyLnJlc2V0KCk7CisKKyAgICAvLyBSZXR1cm4gYnVmZmVycyB0byB0aGUgY29kZWMgc28gdGhhdCBpdCBjYW4gcmVzdW1lIHByb2Nlc3NpbmcsIGJ1dCBrZWVwIG9uZSBidWZmZXIgdG8gYXZvaWQKKyAgICAvLyB0aGUgY29kZWMgYmVpbmcgcmVsZWFzZWQuCisgICAgc2FtcGxlcy5yZXNpemUoMSk7CisKKyAgICAvLyBXYWl0IGZvciBhc3luYyBjb2RlYyBldmVudHMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDEpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgcmV0dXJuIFJVTl9BTExfVEVTVFMoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmJhMmJjNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9iYXNoCisKKyMgRXhpdCBvbiBjb21waWxhdGlvbiBlcnJvci4KK3NldCAtZQorCisjCisjIFJ1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKK2lmIFsgIiRTWU5DX0ZJTklTSEVEIiAhPSB0cnVlIF07IHRoZW4KKyAgaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgICBleGl0IC0xCisgIGZpCisKKyAgIyBlbnN1cmUgd2UgaGF2ZSBtbQorICAuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCisgIG1tCisKKyAgZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCisgIGFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYworZmkKKworIyBQdXNoIHRoZSBmaWxlcyBvbnRvIHRoZSBkZXZpY2UuCisuICRBTkRST0lEX0JVSUxEX1RPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvcHVzaF9hc3NldHMuc2gKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworIyBEb24ndCBleGl0IGlmIGEgdGVzdCBmYWlscy4KK3NldCArZQorCitlY2hvICJ0ZXN0aW5nIE1lZGlhU2FtcGxlUmVhZGVyTkRLIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L01lZGlhU2FtcGxlUmVhZGVyTkRLVGVzdHMvTWVkaWFTYW1wbGVSZWFkZXJOREtUZXN0cworCitlY2hvICJ0ZXN0aW5nIE1lZGlhU2FtcGxlUXVldWUiCithZGIgc2hlbGwgQVNBTl9PUFRJT05TPWRldGVjdF9jb250YWluZXJfb3ZlcmZsb3c9MCAvZGF0YS9uYXRpdmV0ZXN0NjQvTWVkaWFTYW1wbGVRdWV1ZVRlc3RzL01lZGlhU2FtcGxlUXVldWVUZXN0cworCitlY2hvICJ0ZXN0aW5nIE1lZGlhVHJhY2tUcmFuc2NvZGVyIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L01lZGlhVHJhY2tUcmFuc2NvZGVyVGVzdHMvTWVkaWFUcmFja1RyYW5zY29kZXJUZXN0cworCitlY2hvICJ0ZXN0aW5nIFZpZGVvVHJhY2tUcmFuc2NvZGVyIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L1ZpZGVvVHJhY2tUcmFuc2NvZGVyVGVzdHMvVmlkZW9UcmFja1RyYW5zY29kZXJUZXN0cworCitlY2hvICJ0ZXN0aW5nIFBhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L1Bhc3N0aHJvdWdoVHJhY2tUcmFuc2NvZGVyVGVzdHMvUGFzc3Rocm91Z2hUcmFja1RyYW5zY29kZXJUZXN0cworCitlY2hvICJ0ZXN0aW5nIE1lZGlhU2FtcGxlV3JpdGVyIgorYWRiIHNoZWxsIEFTQU5fT1BUSU9OUz1kZXRlY3RfY29udGFpbmVyX292ZXJmbG93PTAgL2RhdGEvbmF0aXZldGVzdDY0L01lZGlhU2FtcGxlV3JpdGVyVGVzdHMvTWVkaWFTYW1wbGVXcml0ZXJUZXN0cworCitlY2hvICJ0ZXN0aW5nIE1lZGlhVHJhbnNjb2RlciIKK2FkYiBzaGVsbCBBU0FOX09QVElPTlM9ZGV0ZWN0X2NvbnRhaW5lcl9vdmVyZmxvdz0wIC9kYXRhL25hdGl2ZXRlc3Q2NC9NZWRpYVRyYW5zY29kZXJUZXN0cy9NZWRpYVRyYW5zY29kZXJUZXN0cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjI4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhX3RyYW5zY29kZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV90cmFuc2NvZGVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYXRyYW5zY29kZXIiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rlc3RzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3NmEyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTkgQEAKKyMgRnV6emVyIGZvciBsaWJtZWRpYXRyYW5zY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhdHJhbnNjb2RlciBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3RyYW5zY29kZXIgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworVHJhbnNjb2RlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBEZXN0aW5hdGlvbiBNaW1lIFR5cGUgKHBhcmFtZXRlciBuYW1lOiBgZHN0TWltZWApCisyLiBBVkMgUHJvZmlsZSAocGFyYW1ldGVyIG5hbWU6IGBwcm9maWxlYCkKKzMuIEhFVkMgUHJvZmlsZSAocGFyYW1ldGVyIG5hbWU6IGBwcm9maWxlYCkKKzQuIEFWQyBMZXZlbCAocGFyYW1ldGVyIG5hbWU6IGBsZXZlbGApCis1LiBIRVZDIExldmVsIChwYXJhbWV0ZXIgbmFtZTogYGxldmVsYCkKKzYuIEJpdHJhdGUgKHBhcmFtZXRlciBuYW1lOiBgYml0cmF0ZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgZHN0TWltZWAgfCAwLiBgQU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQ2AgMS4gYEFNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDYCB8IEJpdCAwIChMU0IpIG9mIDFzdCBieXRlIG9mIGRhdGEgfAorfCBgcHJvZmlsZWAgZm9yIEFWQyB8IDAuIGBQUk9GSUxFX0FWQ19CQVNFTElORWAgMS4gYFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FYCAyLiBgUFJPRklMRV9BVkNfTUFJTmB8IEFsbCBiaXRzIG9mIDJuZCBieXRlIG9mIGRhdGEgbW9kdWx1cyAzIHwKK3wgYHByb2ZpbGVgIGZvciBIRVZDIHwgMC4gYFBST0ZJTEVfSEVWQ19NQUlOYCAxLiBgUFJPRklMRV9IRVZDX01BSU5fU1RJTExgIHwgQWxsIGJpdHMgb2YgMm5kIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDIgfAorfCBgbGV2ZWxgIGZvciBBVkMgfCAwLiBgTEVWRUxfQVZDXzFgIDEuIGBMRVZFTF9BVkNfMUJgIDIuIGBMRVZFTF9BVkNfMV8xYCAzLiBgTEVWRUxfQVZDXzFfMmAgNC4gYExFVkVMX0FWQ18xXzNgIDUuIGBMRVZFTF9BVkNfMmAgNi4gYExFVkVMX0FWQ18yXzFgIDcuIGBMRVZFTF9BVkNfMl8yYCA4LiBgTEVWRUxfQVZDXzNgIDkuIGBMRVZFTF9BVkNfM18xYCAxMC4gYExFVkVMX0FWQ18zXzJgIDExLiBgTEVWRUxfQVZDXzRgIDEyLiBgTEVWRUxfQVZDXzRfMWAgMTMuIGBMRVZFTF9BVkNfNF8yYCAxNC4gYExFVkVMX0FWQ181YHwgQWxsIGJpdHMgb2YgM3JkIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDE1IHwKK3wgYGxldmVsYCBmb3IgSEVWQyB8IDAuIGBMRVZFTF9IRVZDX01BSU5fMWAgMS4gYExFVkVMX0hFVkNfTUFJTl8yYCAyLiBgTEVWRUxfSEVWQ19NQUlOXzJfMWAgMy4gYExFVkVMX0hFVkNfTUFJTl8zYCA0LiBgTEVWRUxfSEVWQ19NQUlOXzNfMWAgNS4gYExFVkVMX0hFVkNfTUFJTl80YCA2LiBgTEVWRUxfSEVWQ19NQUlOXzRfMWAgNy4gYExFVkVMX0hFVkNfTUFJTl81YCA4LiBgTEVWRUxfSEVWQ19NQUlOXzVfMWAgOS4gYExFVkVMX0hFVkNfTUFJTl81XzJgIHwgQWxsIGJpdHMgb2YgM3JkIGJ5dGUgb2YgZGF0YSBtb2R1bHVzIDEwIHwKK3wgYGJpdHJhdGVgIHwgSW4gdGhlIHJhbmdlIGAwYCB0byBgNTAwMDAwMDAwYCB8IEFsbCBiaXRzIG9mIDR0aCBhbmQgNXRoIGJ5dGUgb2YgZGF0YSB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIHRyYW5zY29kZXIuCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhX3RyYW5zY29kZXJfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtZWRpYV90cmFuc2NvZGVyX2Z1enplcgorYGBgCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIKK2BgYAorICAkIGFkYiBzaGVsbCBta2RpciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei8ke1RBUkdFVF9BUkNIfS9tZWRpYV90cmFuc2NvZGVyX2Z1enplci9tZWRpYV90cmFuc2NvZGVyX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvZnV6emVyL21lZGlhX3RyYW5zY29kZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9mdXp6ZXIvbWVkaWFfdHJhbnNjb2Rlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzZjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdGVzdHMvZnV6emVyL21lZGlhX3RyYW5zY29kZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDIxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2RlZmluZSBTUkNfRklMRSAic291cmNlVHJhbnNjb2RpbmdGaWxlIgorI2RlZmluZSBERVNUX0ZJTEUgImRlc3RUcmFuc2NvZGluZ0ZpbGUiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgY2hhcioga01pbWVUeXBlW10gPSB7QU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgQU1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkN9OworY29uc3QgQzJDb25maWc6OnByb2ZpbGVfdCBrQXZjUHJvZmlsZVtdID0ge0MyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU59OworY29uc3QgQzJDb25maWc6OmxldmVsX3Qga0F2Y0xldmVsW10gPSB7CisgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMSwgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzFCLCAgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEsCisgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMywgQzJDb25maWc6OkxFVkVMX0FWQ18yLAorICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMSwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMywKKyAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzQsCisgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiwgQzJDb25maWc6OkxFVkVMX0FWQ181LAorfTsKK2NvbnN0IEMyQ29uZmlnOjpwcm9maWxlX3Qga0hldmNQcm9maWxlW10gPSB7QzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9OworY29uc3QgQzJDb25maWc6OmxldmVsX3Qga0hldmNMZXZlbFtdID0geworICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xLAorICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwKKyAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwKKyAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzJ9OworY29uc3Qgc2l6ZV90IGtOdW1BdmNQcm9maWxlID0gc2l6ZShrQXZjUHJvZmlsZSk7Citjb25zdCBzaXplX3Qga051bUF2Y0xldmVsID0gc2l6ZShrQXZjTGV2ZWwpOworY29uc3Qgc2l6ZV90IGtOdW1IZXZjUHJvZmlsZSA9IHNpemUoa0hldmNQcm9maWxlKTsKK2NvbnN0IHNpemVfdCBrTnVtSGV2Y0xldmVsID0gc2l6ZShrSGV2Y0xldmVsKTsKK2NvbnN0IHNpemVfdCBrTWF4Qml0cmF0ZSA9IDUwMDAwMDAwMDsKKworZW51bSB7CisgICAgSURYX01JTUVfVFlQRSA9IDAsCisgICAgSURYX1BST0ZJTEUsCisgICAgSURYX0xFVkVMLAorICAgIElEWF9CSVRSQVRFX0JZVEVfMSwKKyAgICBJRFhfQklUUkFURV9CWVRFXzIsCisgICAgSURYX0xBU1QKK307CisKK2NsYXNzIFRlc3RDYWxsYmFja3MgOiBwdWJsaWMgTWVkaWFUcmFuc2NvZGVyOjpDYWxsYmFja0ludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uRmluaXNoZWQoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUgeworICAgICAgICB1bmlxdWVfbG9jazxtdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcihjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVycm9yIFVOVVNFRF9QQVJBTSkgb3ZlcnJpZGUgeworICAgICAgICB1bmlxdWVfbG9jazxtdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvZ3Jlc3MpIG92ZXJyaWRlIHsKKyAgICAgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKHByb2dyZXNzID4gMCAmJiAhbVByb2dyZXNzTWFkZSkgeworICAgICAgICAgICAgbVByb2dyZXNzTWFkZSA9IHRydWU7CisgICAgICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkhlYXJ0QmVhdChjb25zdCBNZWRpYVRyYW5zY29kZXIqIHRyYW5zY29kZXIgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiB0cmFuc2NvZGVyIFVOVVNFRF9QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIHBhdXNlZFN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTlVTRURfUEFSQU0pIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHdhaXRGb3JUcmFuc2NvZGluZ0ZpbmlzaGVkKCkgeworICAgICAgICB1bmlxdWVfbG9jazxtdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICB3aGlsZSAoIW1GaW5pc2hlZCkgeworICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KGxvY2spOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIG11dGV4IG1NdXRleDsKKyAgICBjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBib29sIG1GaW5pc2hlZCA9IGZhbHNlOworICAgIGJvb2wgbVByb2dyZXNzTWFkZSA9IGZhbHNlOworfTsKKworY2xhc3MgTWVkaWFUcmFuc2NvZGVyRnV6emVyIHsKK3B1YmxpYzoKKyAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIGludm9rZVRyYW5zY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZGVJbml0KCk7CisKK3ByaXZhdGU6CisgICAgQU1lZGlhRm9ybWF0KiBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0KiBzb3VyY2VGb3JtYXQpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBudWxscHRyOworICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gbnVsbHB0cjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhzb3VyY2VGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgICAgICBpZiAobWltZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikgPT0gMCAmJiAobURlc3RNaW1lICE9IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1EZXN0TWltZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCBtUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgbUxldmVsKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtQml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSwgSU5UMzJfTUFYKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KKworICAgIHNoYXJlZF9wdHI8VGVzdENhbGxiYWNrcz4gbUNhbGxiYWNrczsKKyAgICBpbnQgbVNyY0ZkID0gMDsKKyAgICBpbnQgbURlc3RGZCA9IDA7CisgICAgY29uc3QgY2hhciogbURlc3RNaW1lOworICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgbVByb2ZpbGU7CisgICAgQzJDb25maWc6OmxldmVsX3QgbUxldmVsOworICAgIHVpbnQ2NF90IG1CaXRyYXRlID0gMDsKK307CisKK3ZvaWQgTWVkaWFUcmFuc2NvZGVyRnV6emVyOjppbml0KCkgeworICAgIG1DYWxsYmFja3MgPSBtYWtlX3NoYXJlZDxUZXN0Q2FsbGJhY2tzPigpOworICAgIEFCaW5kZXJQcm9jZXNzX3N0YXJ0VGhyZWFkUG9vbCgpOworfQorCit2b2lkIE1lZGlhVHJhbnNjb2RlckZ1enplcjo6ZGVJbml0KCkgeworICAgIG1DYWxsYmFja3MucmVzZXQoKTsKKyAgICBpZiAobVNyY0ZkKSB7CisgICAgICAgIGNsb3NlKG1TcmNGZCk7CisgICAgfQorICAgIGlmIChtRGVzdEZkKSB7CisgICAgICAgIGNsb3NlKG1EZXN0RmQpOworICAgIH0KK30KKwordm9pZCBNZWRpYVRyYW5zY29kZXJGdXp6ZXI6Omludm9rZVRyYW5zY29kZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBNZWRpYVRyYW5zY29kZXI6OmNyZWF0ZShtQ2FsbGJhY2tzKTsKKyAgICBpZiAodHJhbnNjb2RlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRGVzdE1pbWUgPSBrTWltZVR5cGVbZGF0YVtJRFhfTUlNRV9UWVBFXSAmIDB4MDFdOworICAgIG1CaXRyYXRlID0gKCgoZGF0YVtJRFhfQklUUkFURV9CWVRFXzFdIDw8IDgpIHwgZGF0YVtJRFhfQklUUkFURV9CWVRFXzJdKSAqIDEwMDApICUga01heEJpdHJhdGU7CisgICAgaWYgKG1EZXN0TWltZSA9PSBBTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG1Qcm9maWxlID0ga0F2Y1Byb2ZpbGVbZGF0YVtJRFhfUFJPRklMRV0gJSBrTnVtQXZjUHJvZmlsZV07CisgICAgICAgIG1MZXZlbCA9IGtBdmNMZXZlbFtkYXRhW0lEWF9MRVZFTF0gJSBrTnVtQXZjTGV2ZWxdOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Qcm9maWxlID0ga0hldmNQcm9maWxlW2RhdGFbSURYX1BST0ZJTEVdICUga051bUhldmNQcm9maWxlXTsKKyAgICAgICAgbUxldmVsID0ga0hldmNMZXZlbFtkYXRhW0lEWF9MRVZFTF0gJSBrTnVtSGV2Y0xldmVsXTsKKyAgICB9CisKKyAgICBkYXRhICs9IElEWF9MQVNUOworICAgIHNpemUgLT0gSURYX0xBU1Q7CisKKyAgICBtU3JjRmQgPSBtZW1mZF9jcmVhdGUoU1JDX0ZJTEUsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICB3cml0ZShtU3JjRmQsIGRhdGEsIHNpemUpOworCisgICAgdHJhbnNjb2Rlci0+Y29uZmlndXJlU291cmNlKG1TcmNGZCk7CisgICAgdmVjdG9yPHNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja0Zvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBnZXRGb3JtYXQodHJhY2tGb3JtYXRzW2ldLmdldCgpKTsKKyAgICAgICAgdHJhbnNjb2Rlci0+Y29uZmlndXJlVHJhY2tGb3JtYXQoaSwgZm9ybWF0KTsKKworICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRGVzdEZkID0gbWVtZmRfY3JlYXRlKERFU1RfRklMRSwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIHRyYW5zY29kZXItPmNvbmZpZ3VyZURlc3RpbmF0aW9uKG1EZXN0RmQpOworICAgIGlmICh0cmFuc2NvZGVyLT5zdGFydCgpID09IEFNRURJQV9PSykgeworICAgICAgICBtQ2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpOworICAgICAgICB0cmFuc2NvZGVyLT5jYW5jZWwoKTsKKyAgICB9CisgICAgY2xvc2UobVNyY0ZkKTsKKyAgICBjbG9zZShtRGVzdEZkKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgSURYX0xBU1QgKyAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBNZWRpYVRyYW5zY29kZXJGdXp6ZXIgdHJhbnNjb2RlckZ1enplcjsKKyAgICB0cmFuc2NvZGVyRnV6emVyLmluaXQoKTsKKyAgICB0cmFuc2NvZGVyRnV6emVyLmludm9rZVRyYW5zY29kZXIoZGF0YSwgc2l6ZSk7CisgICAgdHJhbnNjb2RlckZ1enplci5kZUluaXQoKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90b29scy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWF0cmFuc2NvZGluZy90cmFuc2NvZGVyL3Rvb2xzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMGQzNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90b29scy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInRyYW5zY29kZSIsCisgICAgc3JjczogWyJUcmFuc2NvZGUuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF0cmFuc2NvZGVyIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdG9vbHMvVHJhbnNjb2RlLmNwcCBiL21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90b29scy9UcmFuc2NvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTY0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3RyYW5zY29kZXIvdG9vbHMvVHJhbnNjb2RlLmNwcApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYW5zY29kZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtDb21tb24uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgRVJSX01TRyhmbXQsIC4uLikgZnByaW50ZihzdGRlcnIsICJFcnJvcjogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKworY2xhc3MgVHJhbnNjb2RlckNhbGxiYWNrcyA6IHB1YmxpYyBNZWRpYVRyYW5zY29kZXI6OkNhbGxiYWNrSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBtZWRpYV9zdGF0dXNfdCB3YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIHdoaWxlICghbUZpbmlzaGVkKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdGF0dXM7CisgICAgfQorCitwcml2YXRlOgorICAgIHZpcnR1YWwgdm9pZCBvbkZpbmlzaGVkKGNvbnN0IE1lZGlhVHJhbnNjb2RlciogLyp0cmFuc2NvZGVyKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgbm90aWZ5VHJhbnNjb2RlckZpbmlzaGVkKEFNRURJQV9PSyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoY29uc3QgTWVkaWFUcmFuc2NvZGVyKiAvKnRyYW5zY29kZXIqLywgbWVkaWFfc3RhdHVzX3QgZXJyb3IpIG92ZXJyaWRlIHsKKyAgICAgICAgRVJSX01TRygiVHJhbnNjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycm9yKTsKKyAgICAgICAgbm90aWZ5VHJhbnNjb2RlckZpbmlzaGVkKGVycm9yKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Qcm9ncmVzc1VwZGF0ZShjb25zdCBNZWRpYVRyYW5zY29kZXIqIC8qdHJhbnNjb2RlciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgLypwcm9ncmVzcyovKSBvdmVycmlkZSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uQ29kZWNSZXNvdXJjZUxvc3QoCisgICAgICAgICAgICBjb25zdCBNZWRpYVRyYW5zY29kZXIqIC8qdHJhbnNjb2RlciovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG5kazo6U2NvcGVkQVBhcmNlbD4mIC8qcGF1c2VkU3RhdGUqLykgb3ZlcnJpZGUgeworICAgICAgICBFUlJfTVNHKCJUcmFuc2NvZGVyIGxvc3QgY29kZWMgcmVzb3VyY2Ugd2hpbGUgdHJhbnNjb2RpbmciKTsKKyAgICAgICAgbm90aWZ5VHJhbnNjb2RlckZpbmlzaGVkKEFNRURJQUNPREVDX0VSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSGVhcnRCZWF0KGNvbnN0IE1lZGlhVHJhbnNjb2RlciogLyp0cmFuc2NvZGVyKi8pIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIG5vdGlmeVRyYW5zY29kZXJGaW5pc2hlZChtZWRpYV9zdGF0dXNfdCBzdGF0dXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIG1TdGF0dXMgPSBzdGF0dXM7CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIH0KKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25kaXRpb247CisgICAgYm9vbCBtRmluaXNoZWQgPSBmYWxzZTsKKyAgICBtZWRpYV9zdGF0dXNfdCBtU3RhdHVzID0gQU1FRElBX09LOworfTsKKworc3RydWN0IFRyYW5zY29kZUNvbmZpZyB7CisgICAgc3RkOjpzdHJpbmcgc3JjRmlsZTsKKyAgICBzdGQ6OnN0cmluZyBkc3RGaWxlOworCisgICAgc3RkOjpzdHJpbmcgZHN0Q29kZWN7QU1FRElBX01JTUVUWVBFX1ZJREVPX0FWQ307CisgICAgaW50MzJfdCBiaXRyYXRlID0gLTE7Cit9OworCitzdGF0aWMgaW50IHRyYW5zY29kZShjb25zdCBzdHJ1Y3QgVHJhbnNjb2RlQ29uZmlnJiBjb25maWcpIHsKKyAgICBhdXRvIGNhbGxiYWNrcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhbnNjb2RlckNhbGxiYWNrcz4oKTsKKyAgICBhdXRvIHRyYW5zY29kZXIgPSBNZWRpYVRyYW5zY29kZXI6OmNyZWF0ZShjYWxsYmFja3MsIC0xIC8qaGVhcnRCZWF0SW50ZXJ2YWxVcyovKTsKKworICAgIGNvbnN0IGludCBzcmNGZCA9IG9wZW4oY29uZmlnLnNyY0ZpbGUuY19zdHIoKSwgT19SRE9OTFkpOworICAgIGlmIChzcmNGZCA8PSAwKSB7CisgICAgICAgIEVSUl9NU0coIlVuYWJsZSB0byBvcGVuIHNvdXJjZSBmaWxlICVzIiwgY29uZmlnLnNyY0ZpbGUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gdHJhbnNjb2Rlci0+Y29uZmlndXJlU291cmNlKHNyY0ZkKTsKKyAgICBjbG9zZShzcmNGZCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgRVJSX01TRygiY29uZmlndXJlU291cmNlIHJldHVybmVkIGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QU1lZGlhRm9ybWF0Pj4gdHJhY2tGb3JtYXRzID0gdHJhbnNjb2Rlci0+Z2V0VHJhY2tGb3JtYXRzKCk7CisgICAgaWYgKHRyYWNrRm9ybWF0cy5zaXplKCkgPD0gMCkgeworICAgICAgICBFUlJfTVNHKCJObyB0cmFja3MgZm91bmQgaW4gc291cmNlIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFja0Zvcm1hdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0KiBkc3RGb3JtYXQgPSBudWxscHRyOworCisgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSBudWxscHRyOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrRm9ybWF0c1tpXS5nZXQoKSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisKKyAgICAgICAgaWYgKHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIGRzdEZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZHN0Rm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIGNvbmZpZy5kc3RDb2RlYy5jX3N0cigpKTsKKworICAgICAgICAgICAgaWYgKGNvbmZpZy5iaXRyYXRlID4gMCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihkc3RGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGNvbmZpZy5iaXRyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1cyA9IHRyYW5zY29kZXItPmNvbmZpZ3VyZVRyYWNrRm9ybWF0KGksIGRzdEZvcm1hdCk7CisKKyAgICAgICAgaWYgKGRzdEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRzdEZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgRVJSX01TRygiY29uZmlndXJlVHJhY2sgcmV0dXJuZWQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGU6IE92ZXJ3cml0ZXMgZXhpc3RpbmcgZmlsZS4KKyAgICBjb25zdCBpbnQgZHN0RmQgPSBvcGVuKGNvbmZpZy5kc3RGaWxlLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGlmIChkc3RGZCA8PSAwKSB7CisgICAgICAgIEVSUl9NU0coIlVuYWJsZSB0byBvcGVuIGRlc3RpbmF0aW9uIGZpbGUgJXMiLCBjb25maWcuZHN0RmlsZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5jb25maWd1cmVEZXN0aW5hdGlvbihkc3RGZCk7CisgICAgY2xvc2UoZHN0RmQpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEVSUl9NU0coImNvbmZpZ3VyZURlc3RpbmF0aW9uIHJldHVybmVkIGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB0cmFuc2NvZGVyLT5zdGFydCgpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEVSUl9NU0coInN0YXJ0IHJldHVybmVkIGVycm9yICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gY2FsbGJhY2tzLT53YWl0Rm9yVHJhbnNjb2RpbmdGaW5pc2hlZCgpOworfQorCisvLyBPcHRpb25zLgorc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24ga0xvbmdPcHRzW10gPSB7eyJoZWxwIiwgbm9fYXJndW1lbnQsIG51bGxwdHIsICdoJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImNvZGVjIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsICdjJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJpdHJhdGUiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgJ2InfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CitzdGF0aWMgY29uc3QgY2hhciBrU2hvcnRPcHRzW10gPSAiaGM6YjoiOworCitzdGF0aWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdCgpIHsKKyAgICBjb25zdCBjaGFyKiB1c2FnZSA9CisgICAgICAgICAgICAiICAtaCAvIC0taGVscCAgICA6IFByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC5cbiIKKyAgICAgICAgICAgICIgIC1jIC8gLS1jb2RlYyAgIDogU3BlY2lmeSBvdXRwdXQgdmlkZW8gY29kZWMgdHlwZSB1c2luZyBNZWRpYUZvcm1hdCBjb2RlYyBtaW1lICIKKyAgICAgICAgICAgICJ0eXBlLlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIFwidmlkZW8vYXZjXCIuXG4iCisgICAgICAgICAgICAiICAtYiAvIC0tYml0cmF0ZSA6IFNwZWNpZnkgb3V0cHV0IHZpZGVvIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLlxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIGVzdGltYXRpbmcgYW5kIHByZXNlcnZpbmcgdGhlIG9yaWdpbmFsIGJpdHJhdGUuXG4iCisgICAgICAgICAgICAiIjsKKworICAgIHByaW50ZigiVXNhZ2U6ICVzIFstaF0gWy1jIENPREVDXSA8c3JjZmlsZT4gPGRzdGZpbGU+XG4lcyIsIGdldHByb2duYW1lKCksIHVzYWdlKTsKKyAgICBleGl0KC0xKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgaW50IGM7CisgICAgVHJhbnNjb2RlQ29uZmlnIGNvbmZpZzsKKworICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIGtTaG9ydE9wdHMsIGtMb25nT3B0cywgbnVsbHB0cikpID49IDApIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgY29uZmlnLmRzdENvZGVjLmFzc2lnbihvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgICAgICBjb25maWcuYml0cmF0ZSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgIGlmIChjb25maWcuYml0cmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgRVJSX01TRygiQml0cmF0ZSBtdXN0IGFuIGludGVnZXIgbGFyZ2VyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgICAgICBwcmludFVzYWdlQW5kRXhpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50VXNhZ2VBbmRFeGl0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPiAoYXJnYyAtIDIpKSB7CisgICAgICAgIEVSUl9NU0coIlNvdXJjZSBhbmQgZGVzdGluYXRpb24gZmlsZSBub3Qgc3BlY2lmaWVkIik7CisgICAgICAgIHByaW50VXNhZ2VBbmRFeGl0KCk7CisgICAgfQorICAgIGNvbmZpZy5zcmNGaWxlLmFzc2lnbihhcmd2W29wdGluZCsrXSk7CisgICAgY29uZmlnLmRzdEZpbGUuYXNzaWduKGFyZ3Zbb3B0aW5kXSk7CisKKyAgICByZXR1cm4gdHJhbnNjb2RlKGNvbmZpZyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icAppbmRleCAwNGRkY2ZmLi5lOTQyMmNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYm5iYWlvX21vbm9fZGVmYXVsdHMiLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuY3BwIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKaW5kZXggMTA1NGI2OC4uY2E5OGIyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5jcHAKQEAgLTQ2LDEzICs0NiwxMSBAQAogICAgICAgICBzdGF0dXNfdCByZXN1bHQ7CiAgICAgICAgIHJlc3VsdCA9IG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoJm1TdHJlYW1CdWZmZXJTaXplQnl0ZXMpOwogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwotICAgICAgICBhdWRpb19mb3JtYXRfdCBzdHJlYW1Gb3JtYXQ7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotICAgICAgICByZXN1bHQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoJnNhbXBsZVJhdGUsICZjaGFubmVsTWFzaywgJnN0cmVhbUZvcm1hdCk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgICAgIHJlc3VsdCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmY29uZmlnKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayksIHN0cmVhbUZvcm1hdCk7CisgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKGNvbmZpZy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSwgY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIG1GcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKG1Gb3JtYXQpOwogICAgIH0KICAgICByZXR1cm4gTkJBSU9fU291cmNlOjpuZWdvdGlhdGUob2ZmZXJzLCBudW1PZmZlcnMsIGNvdW50ZXJPZmZlcnMsIG51bUNvdW50ZXJPZmZlcnMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcCBiL21lZGlhL2xpYm5iYWlvL0F1ZGlvU3RyZWFtT3V0U2luay5jcHAKaW5kZXggODU2NDg5OS4uNTgxODY3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vQXVkaW9TdHJlYW1PdXRTaW5rLmNwcAorKysgYi9tZWRpYS9saWJuYmFpby9BdWRpb1N0cmVhbU91dFNpbmsuY3BwCkBAIC00NCwxMyArNDQsMTEgQEAKICAgICAgICAgc3RhdHVzX3QgcmVzdWx0OwogICAgICAgICByZXN1bHQgPSBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtU3RyZWFtQnVmZmVyU2l6ZUJ5dGVzKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0OwotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzazsKLSAgICAgICAgcmVzdWx0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZzYW1wbGVSYXRlLCAmY2hhbm5lbE1hc2ssICZzdHJlYW1Gb3JtYXQpOworICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgICAgICByZXN1bHQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoJmNvbmZpZyk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfZnJvbV9TUl9DKHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSwgc3RyZWFtRm9ybWF0KTsKKyAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoY29uZmlnLnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSwgY29uZmlnLmZvcm1hdCk7CiAgICAgICAgIG1GcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKG1Gb3JtYXQpOwogICAgIH0KICAgICByZXR1cm4gTkJBSU9fU2luazo6bmVnb3RpYXRlKG9mZmVycywgbnVtT2ZmZXJzLCBjb3VudGVyT2ZmZXJzLCBudW1Db3VudGVyT2ZmZXJzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKaW5kZXggMDQzMTk3Ni4uNTRkYzA4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gUGlwZSBpcyBtdWx0aS10aHJlYWQgc2FmZSBmb3IgcmVhZGVycyAoc2VlIFBpcGVSZWFkZXIpLCBidXQgc2FmZSBmb3Igb25seSBhIHNpbmdsZSB3cml0ZXIgdGhyZWFkLgotLy8gSXQgY2Fubm90IFVOREVSUlVOIG9uIHdyaXRlLCB1bmxlc3Mgd2UgYWxsb3cgZGVzaWduYXRpb24gb2YgYSBtYXN0ZXIgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCisvLyBJdCBjYW5ub3QgVU5ERVJSVU4gb24gd3JpdGUsIHVubGVzcyB3ZSBhbGxvdyBkZXNpZ25hdGlvbiBvZiBhIHByaW1hcnkgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCiAvLyB0aW1lLWJhc2UuIFJlYWRlcnMgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGR5bmFtaWNhbGx5LCBhbmQgaXQncyBPSyB0byBoYXZlIG5vIHJlYWRlcnMuCiBjbGFzcyBQaXBlIDogcHVibGljIE5CQUlPX1NpbmsgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icAppbmRleCAxMTg4MzIwLi44Y2ZlY2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAKICAgICBuYW1lOiAibGlibmJsb2ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCmluZGV4IGFhNjc4YmEuLjRjNzhiMDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAorKysgYi9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKQEAgLTkyLDggKzkyLDggQEAKICAgICAgICAgKCpkYXRhSnNvbilbInRocmVhZE51bSJdID0gaXRlbS5maXJzdDsKICAgICAgICAgcm9vdC5hcHBlbmQoKmRhdGFKc29uKTsKICAgICB9Ci0gICAgSnNvbjo6U3R5bGVkV3JpdGVyIHdyaXRlcjsKLSAgICBzdGQ6OnN0cmluZyByb290U3RyID0gd3JpdGVyLndyaXRlKHJvb3QpOworICAgIEpzb246OlN0cmVhbVdyaXRlckJ1aWxkZXIgZmFjdG9yeTsKKyAgICBzdGQ6OnN0cmluZyByb290U3RyID0gSnNvbjo6d3JpdGVTdHJpbmcoZmFjdG9yeSwgcm9vdCk7CiAgICAgd3JpdGUoZmQsIHJvb3RTdHIuY19zdHIoKSwgcm9vdFN0ci5zaXplKCkpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic2htZW0vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ4MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2FpZGxfaW50ZXJmYWNlIHsKKyAgICBuYW1lOiAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uYWlkbCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnNobWVtY29tcGF0IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbIlNobWVtQ29tcGF0LmNwcCJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlic2htZW11dGlsIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgInNoYXJlZC1maWxlLXJlZ2lvbi1haWRsLWNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzaG1lbXV0aWwiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIHNyY3M6IFsiU2htZW1VdGlsLmNwcCJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC1jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAic2hhcmVkLWZpbGUtcmVnaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzaG1lbVRlc3QiLAorICAgIHNyY3M6IFsiU2htZW1UZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnNobWVtY29tcGF0IiwKKyAgICAgICAgImxpYnNobWVtdXRpbCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJzaGFyZWQtZmlsZS1yZWdpb24tYWlkbC1jcHAiLAorICAgIF0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9PV05FUlMgYi9tZWRpYS9saWJzaG1lbS9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmYTJmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnNobWVtL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK3l0YWlAZ29vZ2xlLmNvbQorbW5hZ2Fub3ZAZ29vZ2xlLmNvbQorZWxhdXJlbnRAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vUkVBRE1FLm1kIGIvbWVkaWEvbGlic2htZW0vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWZhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzaG1lbS9SRUFETUUubWQKQEAgLTAsMCArMSw2IEBACisjIGxpYnNobWVtCisKK1RoaXMgbGlicmFyeSBwcm92aWRlcyBmYWNpbGl0aWVzIGZvciBzaGFyaW5nIG1lbW9yeSBhY3Jvc3MgcHJvY2Vzc2VzIG92ZXIgKHN0YWJsZSkgQUlETC4gVGhlIG1haW4KK2ZlYXR1cmUgaXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGBhbmRyb2lkLm1lZGlhLlNoYXJlZE1lbW9yeWAgQUlETCB0eXBlLCB3aGljaCByZXByZXNlbnRzIGEgYmxvY2sgb2YKK21lbW9yeSB0aGF0IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuIEluIGFkZGl0aW9uLCBhIGZldyB1dGlsaXRpZXMgYXJlIHByb3ZpZGVkIHRvIGZhY2lsaXRhdGUKK3RoZSB1c2Ugb2Ygc2hhcmVkIG1lbW9yeSBhbmQgdG8gaW50ZWdyYXRlIHdpdGggbGVnYWN5IGNvZGUgdGhhdCB1c2VzIG9sZGVyIGZhY2lsaXRpZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic2htZW0vU2htZW1Db21wYXQuY3BwIGIvbWVkaWEvbGlic2htZW0vU2htZW1Db21wYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NmNiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzaG1lbS9TaG1lbUNvbXBhdC5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgIm1lZGlhL1NobWVtQ29tcGF0LmgiCisKKyNpbmNsdWRlICJiaW5kZXIvTWVtb3J5QmFzZS5oIgorI2luY2x1ZGUgImJpbmRlci9NZW1vcnlIZWFwQmFzZS5oIgorI2luY2x1ZGUgIm1lZGlhL1NobWVtVXRpbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCitib29sIGNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KGNvbnN0IFNoYXJlZEZpbGVSZWdpb24mIHNobWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiogcmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxscHRyKTsKKworICAgIGlmICghdmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKHNobWVtKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSGVhcCBvZmZzZXQgYW5kIHNpemUgbXVzdCBiZSBwYWdlIGFsaWduZWQuCisgICAgY29uc3Qgc2l6ZV90IHBhZ2VTaXplID0gZ2V0cGFnZXNpemUoKTsKKyAgICBjb25zdCBzaXplX3QgcGFnZU1hc2sgPSB+KHBhZ2VTaXplIC0gMSk7CisKKyAgICAvLyBPSyBpZiB0aGlzIHdyYXBzLgorICAgIGNvbnN0IHVpbnQ2NF90IGVuZE9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzaG1lbS5vZmZzZXQpICsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzaG1lbS5zaXplKTsKKworICAgIC8vIFJvdW5kIGRvd24gdG8gcGFnZSBib3VuZGFyeS4KKyAgICBjb25zdCB1aW50NjRfdCBoZWFwU3RhcnRPZmZzZXQgPSBzaG1lbS5vZmZzZXQgJiBwYWdlTWFzazsKKyAgICAvLyBSb3VuZCB1cCB0byBwYWdlIGJvdW5kYXJ5LgorICAgIGNvbnN0IHVpbnQ2NF90IGhlYXBFbmRPZmZzZXQgPSAoZW5kT2Zmc2V0ICsgcGFnZVNpemUgLSAxKSAmIHBhZ2VNYXNrOworICAgIGNvbnN0IHVpbnQ2NF90IGhlYXBTaXplID0gaGVhcEVuZE9mZnNldCAtIGhlYXBTdGFydE9mZnNldDsKKworICAgIGlmIChoZWFwU3RhcnRPZmZzZXQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIHx8CisgICAgICAgIGhlYXBTaXplID4gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSAhc2htZW0ud3JpdGVhYmxlID8gSU1lbW9yeUhlYXA6OlJFQURfT05MWSA6IDA7CisKKyAgICBjb25zdCBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcCA9CisgICAgICAgICAgICBuZXcgTWVtb3J5SGVhcEJhc2Uoc2htZW0uZmQuZ2V0KCksIGhlYXBTaXplLCBmbGFncywgaGVhcFN0YXJ0T2Zmc2V0KTsKKyAgICAqcmVzdWx0ID0gc3A8TWVtb3J5QmFzZT46Om1ha2UoaGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2htZW0ub2Zmc2V0IC0gaGVhcFN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG1lbS5zaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRGaWxlUmVnaW9uKiByZXN1bHQpIHsKKyAgICBhc3NlcnQobWVtICE9IG51bGxwdHIpOworICAgIGFzc2VydChyZXN1bHQgIT0gbnVsbHB0cik7CisKKyAgICAqcmVzdWx0ID0gU2hhcmVkRmlsZVJlZ2lvbigpOworCisgICAgc3NpemVfdCBvZmZzZXQ7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKGhlYXAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgb2Zmc2V0IGFuZCBzaXplIGRvIG5vdCBvdmVyZmxvdyBmcm9tIGludDY0IGJvdW5kYXJpZXMuCisgICAgICAgIGlmIChzaXplID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSB8fAorICAgICAgICAgICAgICAgIGhlYXAtPmdldE9mZnNldCgpID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkgfHwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oaGVhcC0+Z2V0T2Zmc2V0KCkpICsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4ob2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaW50IGZkID0gZmNudGwoaGVhcC0+Z2V0SGVhcElEKCksIEZfRFVQRkRfQ0xPRVhFQywgMCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQtPmZkLnJlc2V0KGJhc2U6OnVuaXF1ZV9mZChmZCkpOworICAgICAgICByZXN1bHQtPnNpemUgPSBzaXplOworICAgICAgICByZXN1bHQtPm9mZnNldCA9IGhlYXAtPmdldE9mZnNldCgpICsgb2Zmc2V0OworICAgICAgICByZXN1bHQtPndyaXRlYWJsZSA9IChoZWFwLT5nZXRGbGFncygpICYgSU1lbW9yeUhlYXA6OlJFQURfT05MWSkgPT0gMDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgY29udmVydE51bGxhYmxlU2hhcmVkRmlsZVJlZ2lvblRvSU1lbW9yeShjb25zdCBzdGQ6Om9wdGlvbmFsPFNoYXJlZEZpbGVSZWdpb24+JiBzaG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiogcmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxscHRyKTsKKworICAgIGlmICghc2htZW0uaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgcmVzdWx0LT5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udmVydFNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoc2htZW0udmFsdWUoKSwgcmVzdWx0KTsKK30KKworYm9vbCBjb252ZXJ0TnVsbGFibGVJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvcHRpb25hbDxTaGFyZWRGaWxlUmVnaW9uPiogcmVzdWx0KSB7CisgICAgYXNzZXJ0KHJlc3VsdCAhPSBudWxscHRyKTsKKworICAgIGlmIChtZW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXN1bHQtPnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJlc3VsdC0+ZW1wbGFjZSgpOworICAgIHJldHVybiBjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihtZW0sICZyZXN1bHQtPnZhbHVlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9TaG1lbVRlc3QuY3BwIGIvbWVkaWEvbGlic2htZW0vU2htZW1UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzRmMzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vU2htZW1UZXN0LmNwcApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImJpbmRlci9NZW1vcnlCYXNlLmgiCisjaW5jbHVkZSAiYmluZGVyL01lbW9yeUhlYXBCYXNlLmgiCisjaW5jbHVkZSAiY3V0aWxzL2FzaG1lbS5oIgorI2luY2x1ZGUgIm1lZGlhL1NobWVtQ29tcGF0LmgiCisjaW5jbHVkZSAibWVkaWEvU2htZW1VdGlsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgeworCisvLyBDcmVhdGVzIGEgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZS4KK1NoYXJlZEZpbGVSZWdpb24gbWFrZVNoYXJlZEZpbGVSZWdpb24oaW50NjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSkgeworICAgIFNoYXJlZEZpbGVSZWdpb24gc2htZW07CisgICAgc2htZW0ub2Zmc2V0ID0gb2Zmc2V0OworICAgIHNobWVtLnNpemUgPSBzaXplOworICAgIGludCBmZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKCIiLCBzaXplICsgb2Zmc2V0KTsKKyAgICBhc3NlcnQoZmQgPj0gMCk7CisgICAgc2htZW0uZmQgPSBvczo6UGFyY2VsRmlsZURlc2NyaXB0b3IoYmFzZTo6dW5pcXVlX2ZkKGZkKSk7CisgICAgcmV0dXJuIHNobWVtOworfQorCisvLyBDcmVhdGVzIGEgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZSB3aXRoIGFuIGludmFsaWQgRkQuCitTaGFyZWRGaWxlUmVnaW9uIG1ha2VJbnZhbGlkU2hhcmVkRmlsZVJlZ2lvbihpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKSB7CisgICAgU2hhcmVkRmlsZVJlZ2lvbiBzaG1lbTsKKyAgICBzaG1lbS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc2htZW0uc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIHNobWVtOworfQorCitzcDxJTWVtb3J5PiBtYWtlSU1lbW9yeShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgY29udGVudCwgYm9vbCB3cml0ZWFibGUgPSB0cnVlKSB7CisgICAgY29uc3RleHByIHNpemVfdCBrT2Zmc2V0ID0gMTk7CisKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gaGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShjb250ZW50LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhd3JpdGVhYmxlID8gSU1lbW9yeUhlYXA6OlJFQURfT05MWSA6IDApOworICAgIHNwPElNZW1vcnk+IHJlc3VsdCA9IHNwPE1lbW9yeUJhc2U+OjptYWtlKGhlYXAsIGtPZmZzZXQsIGNvbnRlbnQuc2l6ZSgpKTsKKyAgICBtZW1jcHkocmVzdWx0LT51bnNlY3VyZVBvaW50ZXIoKSwgY29udGVudC5kYXRhKCksIGNvbnRlbnQuc2l6ZSgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitURVNUKFNobWVtVGVzdCwgVmFsaWRhdGUpIHsKKyAgICBFWFBFQ1RfVFJVRSh2YWxpZGF0ZVNoYXJlZEZpbGVSZWdpb24obWFrZVNoYXJlZEZpbGVSZWdpb24oMCwgMCkpKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWxpZGF0ZVNoYXJlZEZpbGVSZWdpb24obWFrZVNoYXJlZEZpbGVSZWdpb24oMSwgMikpKTsKKyAgICBFWFBFQ1RfRkFMU0UodmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKG1ha2VTaGFyZWRGaWxlUmVnaW9uKC0xLCAyKSkpOworICAgIEVYUEVDVF9GQUxTRSh2YWxpZGF0ZVNoYXJlZEZpbGVSZWdpb24obWFrZVNoYXJlZEZpbGVSZWdpb24oMiwgLTEpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRlU2hhcmVkRmlsZVJlZ2lvbihtYWtlSW52YWxpZFNoYXJlZEZpbGVSZWdpb24oMSwgMikpKTsKK30KKworVEVTVChTaG1lbVRlc3QsIENvbnZlcnNpb24pIHsKKyAgICBzcDxJTWVtb3J5PiByZWNvbnN0cnVjdGVkOworICAgIHsKKyAgICAgICAgU2hhcmVkRmlsZVJlZ2lvbiBzaG1lbTsKKyAgICAgICAgc3A8SU1lbW9yeT4gaW1lbSA9IG1ha2VJTWVtb3J5KHs2LCA1LCAzfSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbnZlcnRJTWVtb3J5VG9TaGFyZWRGaWxlUmVnaW9uKGltZW0sICZzaG1lbSkpOworICAgICAgICBBU1NFUlRfRVEoMywgc2htZW0uc2l6ZSk7CisgICAgICAgIEFTU0VSVF9HRShzaG1lbS5mZC5nZXQoKSwgMCk7CisgICAgICAgIEFTU0VSVF9UUlVFKHNobWVtLndyaXRlYWJsZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KHNobWVtLCAmcmVjb25zdHJ1Y3RlZCkpOworICAgIH0KKyAgICBBU1NFUlRfRVEoMywgcmVjb25zdHJ1Y3RlZC0+c2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEocmVjb25zdHJ1Y3RlZC0+Z2V0TWVtb3J5KCktPmdldEZsYWdzKCkgJiBJTWVtb3J5SGVhcDo6UkVBRF9PTkxZLCAgMCk7CisgICAgY29uc3QgdWludDhfdCogcCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyZWNvbnN0cnVjdGVkLT51bnNlY3VyZVBvaW50ZXIoKSk7CisgICAgRVhQRUNUX0VRKDYsIHBbMF0pOworICAgIEVYUEVDVF9FUSg1LCBwWzFdKTsKKyAgICBFWFBFQ1RfRVEoMywgcFsyXSk7Cit9CisKK1RFU1QoU2htZW1UZXN0LCBDb252ZXJzaW9uUmVhZE9ubHkpIHsKKyAgICBzcDxJTWVtb3J5PiByZWNvbnN0cnVjdGVkOworICAgIHsKKyAgICAgICAgU2hhcmVkRmlsZVJlZ2lvbiBzaG1lbTsKKyAgICAgICAgc3A8SU1lbW9yeT4gaW1lbSA9IG1ha2VJTWVtb3J5KHs2LCA1LCAzfSwgZmFsc2UpOworICAgICAgICBBU1NFUlRfVFJVRShjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihpbWVtLCAmc2htZW0pKTsKKyAgICAgICAgQVNTRVJUX0VRKDMsIHNobWVtLnNpemUpOworICAgICAgICBBU1NFUlRfR0Uoc2htZW0uZmQuZ2V0KCksIDApOworICAgICAgICBBU1NFUlRfRkFMU0Uoc2htZW0ud3JpdGVhYmxlKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoY29udmVydFNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoc2htZW0sICZyZWNvbnN0cnVjdGVkKSk7CisgICAgfQorICAgIEFTU0VSVF9FUSgzLCByZWNvbnN0cnVjdGVkLT5zaXplKCkpOworICAgIEFTU0VSVF9ORShyZWNvbnN0cnVjdGVkLT5nZXRNZW1vcnkoKS0+Z2V0RmxhZ3MoKSAmIElNZW1vcnlIZWFwOjpSRUFEX09OTFksICAwKTsKKyAgICBjb25zdCB1aW50OF90KiBwID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJlY29uc3RydWN0ZWQtPnVuc2VjdXJlUG9pbnRlcigpKTsKKyAgICBFWFBFQ1RfRVEoNiwgcFswXSk7CisgICAgRVhQRUNUX0VRKDUsIHBbMV0pOworICAgIEVYUEVDVF9FUSgzLCBwWzJdKTsKK30KKworVEVTVChTaG1lbVRlc3QsIE51bGxDb252ZXJzaW9uKSB7CisgICAgc3A8SU1lbW9yeT4gcmVjb25zdHJ1Y3RlZDsKKyAgICB7CisgICAgICAgIHN0ZDo6b3B0aW9uYWw8U2hhcmVkRmlsZVJlZ2lvbj4gc2htZW07CisgICAgICAgIHNwPElNZW1vcnk+IGltZW07CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbnZlcnROdWxsYWJsZUlNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24oaW1lbSwgJnNobWVtKSk7CisgICAgICAgIEFTU0VSVF9GQUxTRShzaG1lbS5oYXNfdmFsdWUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGNvbnZlcnROdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoc2htZW0sICZyZWNvbnN0cnVjdGVkKSk7CisgICAgfQorICAgIEFTU0VSVF9FUShudWxscHRyLCByZWNvbnN0cnVjdGVkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9TaG1lbVV0aWwuY3BwIGIvbWVkaWEvbGlic2htZW0vU2htZW1VdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc1MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vU2htZW1VdGlsLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJtZWRpYS9TaG1lbVV0aWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworYm9vbCB2YWxpZGF0ZVNoYXJlZEZpbGVSZWdpb24oY29uc3QgU2hhcmVkRmlsZVJlZ2lvbiYgc2htZW0pIHsKKyAgICAvLyBGRCBtdXN0IGJlIHZhbGlkLgorICAgIGlmIChzaG1lbS5mZC5nZXQoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNpemUgYW5kIG9mZnNldCBtdXN0IGJlIG5vbi1uZWdhdGl2ZS4KKyAgICBpZiAoc2htZW0uc2l6ZSA8IDAgfHwgc2htZW0ub2Zmc2V0IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDY0X3Qgc2l6ZSA9IHNobWVtLnNpemU7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gc2htZW0ub2Zmc2V0OworCisgICAgLy8gTXVzdCBub3Qgd3JhcC4KKyAgICBpZiAob2Zmc2V0ID4gb2Zmc2V0ICsgc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnNobWVtL2FpZGwvYW5kcm9pZC9tZWRpYS9TaGFyZWRGaWxlUmVnaW9uLmFpZGwgYi9tZWRpYS9saWJzaG1lbS9haWRsL2FuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OWI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzaG1lbS9haWRsL2FuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogQSBzaGFyZWQgZmlsZSByZWdpb24uCisgKgorICogVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiB0byBzaGFyZSBhIHJlZ2lvbiBvZiBhIGZpbGUgYmV0d2VlbiBwcm9jZXNzZXMgb3ZlcgorICogQUlETC4KKyAqIEFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZSByZXByZXNlbnRzIGEgdmFsaWQgRkQuIEZvciByZXByZXNlbnRpbmcgYSBudWxsIFNoYXJlZEZpbGVSZWdpb24sIHVzZSBhCisgKiBAbnVsbGFibGUgU2hhcmVkRmlsZVJlZ2lvbi4KKyAqIFByaW1hcmlseSwgdGhpcyBpcyBpbnRlbmRlZCBmb3Igc2hhcmVkIG1lbW9yeSBibG9ja3MuCisgKgorICogQGhpZGUKKyAqLworcGFyY2VsYWJsZSBTaGFyZWRGaWxlUmVnaW9uIHsKKyAgICAvKiogRmlsZSBkZXNjcmlwdG9yIG9mIHRoZSByZWdpb24uIE11c3QgYmUgdmFsaWQuICovCisgICAgUGFyY2VsRmlsZURlc2NyaXB0b3IgZmQ7CisgICAgLyoqIE9mZnNldCwgaW4gYnl0ZXMgd2l0aGluIHRoZSBmaWxlIG9mIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLiBNdXN0IGJlIG5vbi1uZWdhdGl2ZS4gKi8KKyAgICBsb25nIG9mZnNldDsKKyAgICAvKiogU2l6ZSwgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSByZWdpb24uIE11c3QgYmUgbm9uLW5lZ2F0aXZlLiAqLworICAgIGxvbmcgc2l6ZTsKKyAgICAvKiogV2hldGhlciB0aGUgcmVnaW9uIGlzIHdyaXRlYWJsZS4gKi8KKyAgICBib29sZWFuIHdyaXRlYWJsZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnNobWVtL2luY2x1ZGUvbWVkaWEvU2htZW1Db21wYXQuaCBiL21lZGlhL2xpYnNobWVtL2luY2x1ZGUvbWVkaWEvU2htZW1Db21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTU5ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vaW5jbHVkZS9tZWRpYS9TaG1lbUNvbXBhdC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworLy8gVGhpcyBtb2R1bGUgY29udGFpbnMgdXRpbGl0aWVzIGZvciBpbnRlcmZhY2luZyBiZXR3ZWVuIGxlZ2FjeSBjb2RlIHRoYXQgaXMgdXNpbmcgSU1lbW9yeSBhbmQgbmV3CisvLyBjb2RlIHRoYXQgaXMgdXNpbmcgYW5kcm9pZC5vcy5TaGFyZWRGaWxlUmVnaW9uLgorCisjaW5jbHVkZSA8b3B0aW9uYWw+CisKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL1NoYXJlZEZpbGVSZWdpb24uaCIKKyNpbmNsdWRlICJiaW5kZXIvSU1lbW9yeS5oIgorI2luY2x1ZGUgInV0aWxzL1N0cm9uZ1BvaW50ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhIHsKKworLyoqCisgKiBDb252ZXJ0cyBhIFNoYXJlZEZpbGVSZWdpb24gcGFyY2VsYWJsZSB0byBhbiBJTWVtb3J5IGluc3RhbmNlLgorICogQHBhcmFtIHNobWVtIFRoZSBTaGFyZWRGaWxlUmVnaW9uIGluc3RhbmNlLgorICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0aW5nIElNZW1vcnkgaW5zdGFuY2UuIE1heSBub3QgYmUgbnVsbC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIChzaG91bGQgYWx3YXlzIHN1Y2NlZWQgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsCisgKiAgICAgICAgIGZhaWx1cmUgdXN1YWxseSBtZWFucyBjb3JydXB0IGRhdGEpLgorICovCitib29sIGNvbnZlcnRTaGFyZWRGaWxlUmVnaW9uVG9JTWVtb3J5KGNvbnN0IFNoYXJlZEZpbGVSZWdpb24mIHNobWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5PiogcmVzdWx0KTsKKworLyoqCisgKiBDb252ZXJ0cyBhIG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24gcGFyY2VsYWJsZSB0byBhbiBJTWVtb3J5IGluc3RhbmNlLgorICogQHBhcmFtIHNobWVtIFRoZSBTaGFyZWRGaWxlUmVnaW9uIGluc3RhbmNlLgorICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0aW5nIElNZW1vcnkgaW5zdGFuY2UuIE1heSBub3QgYmUgbnVsbC4gUG9pbnRlZSBhc3NpZ25lZCB0byBudWxsLAorICogICAgICAgICAgICAgICBpZiB0aGUgaW5wdXQgaXMgbnVsbC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIChzaG91bGQgYWx3YXlzIHN1Y2NlZWQgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsCisgKiAgICAgICAgIGZhaWx1cmUgdXN1YWxseSBtZWFucyBjb3JydXB0IGRhdGEpLgorICovCitib29sIGNvbnZlcnROdWxsYWJsZVNoYXJlZEZpbGVSZWdpb25Ub0lNZW1vcnkoY29uc3Qgc3RkOjpvcHRpb25hbDxTaGFyZWRGaWxlUmVnaW9uPiYgc2htZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4qIHJlc3VsdCk7CisKKy8qKgorICogQ29udmVydHMgYW4gSU1lbW9yeSBpbnN0YW5jZSB0byBTaGFyZWRGaWxlUmVnaW9uLgorICogQHBhcmFtIG1lbSBUaGUgSU1lbW9yeSBpbnN0YW5jZS4gTWF5IG5vdCBiZSBudWxsLgorICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0aW5nIFNoYXJlZEZpbGVSZWdpb24gaW5zdGFuY2UuCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCAoc2hvdWxkIGFsd2F5cyBzdWNjZWVkIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLAorICogICAgICAgICBmYWlsdXJlIHVzdWFsbHkgbWVhbnMgY29ycnVwdCBkYXRhKS4KKyAqLworYm9vbCBjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZWRGaWxlUmVnaW9uKiByZXN1bHQpOworCisvKioKKyAqIENvbnZlcnRzIGEgbnVsbGFibGUgSU1lbW9yeSBpbnN0YW5jZSB0byBhIG51bGxhYmxlIFNoYXJlZEZpbGVSZWdpb24uCisgKiBAcGFyYW0gbWVtIFRoZSBJTWVtb3J5IGluc3RhbmNlLiBNYXkgYmUgbnVsbC4KKyAqIEBwYXJhbSByZXN1bHQgVGhlIHJlc3VsdGluZyBTaGFyZWRGaWxlUmVnaW9uIGluc3RhbmNlLiBNYXkgbm90IGJlIG51bGwuIEFzc2lnbmVkIHRvIGVtcHR5LAorICogICAgICAgICAgICAgICBpZiB0aGUgaW5wdXQgaXMgbnVsbC4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29udmVyc2lvbiBpcyBzdWNjZXNzZnVsIChzaG91bGQgYWx3YXlzIHN1Y2NlZWQgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsCisgKiAgICAgICAgIGZhaWx1cmUgdXN1YWxseSBtZWFucyBjb3JydXB0IGRhdGEpLgorICovCitib29sIGNvbnZlcnROdWxsYWJsZUlNZW1vcnlUb1NoYXJlZEZpbGVSZWdpb24oY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPFNoYXJlZEZpbGVSZWdpb24+KiByZXN1bHQpOworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzaG1lbS9pbmNsdWRlL21lZGlhL1NobWVtVXRpbC5oIGIvbWVkaWEvbGlic2htZW0vaW5jbHVkZS9tZWRpYS9TaG1lbVV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdhNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic2htZW0vaW5jbHVkZS9tZWRpYS9TaG1lbVV0aWwuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8vIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIGFuZHJvaWQub3MuU2hhcmVkRmlsZVJlZ2lvbi4KKworI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvU2hhcmVkRmlsZVJlZ2lvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWVkaWEgeworCisvKioKKyAqIENoZWNrcyB3aGV0aGVyIGEgU2hhcmVkRmlsZVJlZ2lvbiBpbnN0YW5jZSBpcyB2YWxpZCAoYWxsIHRoZSBmaWVsZHMgaGF2ZSBzYW5lIHZhbHVlcykuCisgKi8KK2Jvb2wgdmFsaWRhdGVTaGFyZWRGaWxlUmVnaW9uKGNvbnN0IFNoYXJlZEZpbGVSZWdpb24mIHNobWVtKTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggNjNhYjY1NC4uMWFhMTg0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC03NCw2ICs3NCwxMiBAQAogICAgIGtNYXhJbmRpY2VzVG9DaGVjayA9IDMyLCAvLyB1c2VkIHdoZW4gZW51bWVyYXRpbmcgc3VwcG9ydGVkIGZvcm1hdHMgYW5kIHByb2ZpbGVzCiB9OwogCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBUVU5ORUxfUEVFS19LRVlbXSA9ICJhbmRyb2lkLl90cmlnZ2VyLXR1bm5lbC1wZWVrIjsKKworfQorCiAvLyBPTVggZXJyb3JzIGFyZSBkaXJlY3RseSBtYXBwZWQgaW50byBzdGF0dXNfdCByYW5nZSBpZgogLy8gdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBNZWRpYUVycm9yIHN0YXR1cyBjb2RlLgogLy8gVXNlIHRoZSBzdGF0dXNGcm9tT01YRXJyb3IoaW50MzJfdCBvbXhFcnJvcikgZnVuY3Rpb24uCkBAIC0yNzksNiArMjg1LDEzIEBACiAKICAgICB2b2lkIHBvc3RGaWxsVGhpc0J1ZmZlcihCdWZmZXJJbmZvICppbmZvKTsKIAorICAgIHZvaWQgbWF5YmVQb3N0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QoKSB7CisgICAgICAgIGlmICghbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCkgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN1Ym1pdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXIsIG1Db2RlYykpLT5wb3N0KCk7CisgICAgICAgICAgICBtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwogcHJpdmF0ZToKICAgICAvLyBIYW5kbGVzIGFuIE9NWCBtZXNzYWdlLiBSZXR1cm5zIHRydWUgaWZmIG1lc3NhZ2Ugd2FzIGhhbmRsZWQuCiAgICAgYm9vbCBvbk9NWE1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMzAyLDYgKzMxNSw4IEBACiAKICAgICB2b2lkIGdldE1vcmVJbnB1dERhdGFJZlBvc3NpYmxlKCk7CiAKKyAgICBib29sIG1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3Q7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhCYXNlU3RhdGUpOwogfTsKIApAQCAtNTU1LDYgKzU3MCw4IEBACiAgICAgICBtU2h1dGRvd25JblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1FeHBsaWNpdFNodXRkb3duKGZhbHNlKSwKICAgICAgIG1Jc0xlZ2FjeVZQOURlY29kZXIoZmFsc2UpLAorICAgICAgbUlzU3RyZWFtQ29ycnVwdEZyZWUoZmFsc2UpLAorICAgICAgbUlzTG93TGF0ZW5jeShmYWxzZSksCiAgICAgICBtRW5jb2RlckRlbGF5KDApLAogICAgICAgbUVuY29kZXJQYWRkaW5nKDApLAogICAgICAgbVJvdGF0aW9uRGVncmVlcygwKSwKQEAgLTg4Nyw3ICs5MDQsNyBAQAogCiAgICAgICAgICAgICBzcDxEYXRhQ29udmVydGVyPiBjb252ZXJ0ZXIgPSBtQ29udmVydGVyW3BvcnRJbmRleF07CiAgICAgICAgICAgICBpZiAoY29udmVydGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGFzc3VtZSBzYW5lIGNvbnZlcnNpb25zIG9mIG1heCA0OjEsIHNvIHJlc3VsdCBmaXRzIGluIGludDMyCisgICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSBhc3N1bWUgY29udmVyc2lvbnMgb2YgbWF4IDQ6MSwgc28gcmVzdWx0IGZpdHMgaW4gaW50MzIKICAgICAgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkgewogICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyU2l6ZSA9IGNvbnZlcnRlci0+c291cmNlU2l6ZShidWZTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQ1NCw2ICsxNDcxLDEwIEBACiAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKGRvbmUpOwogfQogCit2b2lkIEFDb2RlYzo6b25GaXJzdFR1bm5lbEZyYW1lUmVhZHkoKSB7CisgICAgbUNhbGxiYWNrLT5vbkZpcnN0VHVubmVsRnJhbWVSZWFkeSgpOworfQorCiBBQ29kZWM6OkJ1ZmZlckluZm8gKkFDb2RlYzo6ZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwogICAgIENIRUNLKG1OYXRpdmVXaW5kb3cuZ2V0KCkgIT0gTlVMTCk7CkBAIC0yMjM3LDYgKzIyNTgsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IHNldHVwRzcxMUNvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDEsIHNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSAmJgorICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cE9wdXNDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7CiAgICAgICAgIC8vIG51bUNoYW5uZWxzIG5lZWRzIHRvIGJlIHNldCB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSBQQ00gdmFsdWVzLgogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMiwgc2FtcGxlUmF0ZSA9IDQ0MTAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CkBAIC0yMzIzLDYgKzIzNTAsMTIgQEAKICAgICAgICAgbUNoYW5uZWxNYXNrUHJlc2VudCA9IGZhbHNlOwogICAgIH0KIAorICAgIGludDMyX3QgaXNDb3JydXB0RnJlZSA9IDA7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb3JydXB0LWZyZWUiLCAmaXNDb3JydXB0RnJlZSkpIHsKKyAgICAgICAgbUlzU3RyZWFtQ29ycnVwdEZyZWUgPSBpc0NvcnJ1cHRGcmVlID09IDEgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIEFMT0dWKCJjb3JydXB0LWZyZWU9WyVkXSIsIG1Jc1N0cmVhbUNvcnJ1cHRGcmVlKTsKKyAgICB9CisKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKICAgICBpZiAobXNnLT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpIHsKICAgICAgICAgZXJyID0gc2V0TWluQnVmZmVyU2l6ZShrUG9ydEluZGV4SW5wdXQsIChzaXplX3QpbWF4SW5wdXRTaXplKTsKQEAgLTI0MDksNiArMjQ0Miw3IEBACiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiZGVjb2RlciBjYW4gbm90IHNldCBsb3ctbGF0ZW5jeSB0byAlZCAoZXJyICVkKSIsIGxvd0xhdGVuY3ksIGVycik7CiAgICAgfQorICAgIG1Jc0xvd0xhdGVuY3kgPSAobG93TGF0ZW5jeSAmJiBlcnIgPT0gT0spOwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTI0MzYsNiArMjQ3MCwzMCBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0VHVubmVsUGVlayhpbnQzMl90IHR1bm5lbFBlZWspIHsKKyAgICBpZiAobUlzRW5jb2RlcikgeworICAgICAgICBBTE9HRSgiZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0ICVzIiwgVFVOTkVMX1BFRUtfS0VZKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKCFtVHVubmVsZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHR1bm5lbCBtb2RlIiwgVFVOTkVMX1BFRUtfS0VZKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5iRW5hYmxlZCA9IChPTVhfQk9PTCkodHVubmVsUGVlayAhPSAwKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQW5kcm9pZFR1bm5lbFBlZWssCisgICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZGVjb2RlciBjYW5ub3Qgc2V0ICVzIHRvICVkIChlcnIgJWQpIiwKKyAgICAgICAgICAgICAgVFVOTkVMX1BFRUtfS0VZLCB0dW5uZWxQZWVrLCBlcnIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpIHsKICAgICBPTVhfQVVESU9fQ09ORklHX0FORFJPSURfQVVESU9QUkVTRU5UQVRJT04gY29uZmlnOwogICAgIEluaXRPTVhQYXJhbXMoJmNvbmZpZyk7CkBAIC0yNjAyLDE1ICsyNjYwLDE1IEBACiAgICAgdW5zaWduZWQgaW50IG51bUxheWVycyA9IDA7CiAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOwogICAgIGludCB0YWdzOwotICAgIGNoYXIgZHVtbXk7CisgICAgY2hhciB0bXA7CiAgICAgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFIHBhdHRlcm4gPQogICAgICAgICBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuTm9uZTsKLSAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmdG1wKSA9PSAxCiAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CiAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuV2ViUlRDOwogICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCi0gICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCi0gICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJnRtcCwgJm51bUJMYXllcnMsICZ0bXApKQorICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIHRtcCA9PSAnKycpKQogICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgewogICAgICAgICBudW1MYXllcnMgKz0gbnVtQkxheWVyczsKICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5BbmRyb2lkOwpAQCAtMzExMCw2ICszMTY4LDI2IEBACiAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cE9wdXNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscykgeworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldHVwT3B1c0NvZGVjKCk6IEVycm9yICVkIGdldHRpbmcgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzIHBhcmFtZXRlciIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGRlZi5uU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgZGVmLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgIGVyciA9IG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCiAgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpIHsKQEAgLTQxMjcsNiArNDIwNSwyOSBAQAogICAgICAgICBBTE9HSSgic2V0dXBWaWRlb0VuY29kZXIgc3VjY2VlZGVkIik7CiAgICAgfQogCisgICAgLy8gVmlkZW8gc2hvdWxkIGJlIGVuY29kZWQgYXMgc3RhbmQgc3RyYWlnaHQgYmVjYXVzZSBSVFAgcHJvdG9jb2wKKyAgICAvLyBjYW4gcHJvdmlkZSByb3RhdGlvbiBpbmZvcm1hdGlvbiBvbmx5IGlmIENWTyBpcyBzdXBwb3J0ZWQuCisgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBhZGRlZCB0byBzdXBwb3J0IG5vbi1DVk8gY2FzZSBmb3IgdmlkZW8gc3RyZWFtaW5nIHNjZW5hcmlvLgorICAgIGludDMyX3Qgcm90YXRpb24gPSAwOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbikpIHsKKyAgICAgICAgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgY29uZmlnOworICAgICAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgICAgICBjb25maWcublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5nZXRDb25maWcoCisgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZ2V0Q29uZmlnIG9mIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZShlcnIgJWQpIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBjb25maWcublJvdGF0aW9uID0gcm90YXRpb247CisgICAgICAgIGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisKKyAgICAgICAgQUxPR0QoIkFwcGx5aW5nIGVuY29kZXItcm90YXRpb249WyVkXSB0byB2aWRlbyBlbmNvZGVyLiIsIGNvbmZpZy5uUm90YXRpb24pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHNldENvbmZpZyBvZiBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUoZXJyICVkKSIsIGVycik7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC00NzU3LDE1ICs0ODU4LDE1IEBACiAgICAgICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOwogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtQkxheWVycyA9IDA7CiAgICAgICAgIGludCB0YWdzOwotICAgICAgICBjaGFyIGR1bW15OwotICAgICAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICAgICAgY2hhciB0bXA7CisgICAgICAgIGlmIChzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZ0bXApID09IDEKICAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CiAgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOwogICAgICAgICAgICAgdHNUeXBlID0gT01YX1ZJREVPX0FuZHJvaWRUZW1wb3JhbExheWVyaW5nUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gbnVtTGF5ZXJzOwogICAgICAgICB9IGVsc2UgaWYgKCh0YWdzID0gc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKLSAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZ0bXAsICZudW1CTGF5ZXJzLCAmdG1wKSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgdG1wID09ICcrJykpCiAgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgewogICAgICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19WUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQzsKICAgICAgICAgICAgIC8vIFZQWCBkb2VzIG5vdCBoYXZlIGEgY29uY2VwdCBvZiBCLWZyYW1lcywgc28ganVzdCBjb3VudCBhbGwgbGF5ZXJzCkBAIC01MjgzLDYgKzUzODQsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1DaGFubmVsTWFza1ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtbWFzayIsIG1DaGFubmVsTWFzayk7CiAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIW1Jc0VuY29kZXIgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29uZmlnRm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgbWltZS5jX3N0cigpKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSBwcmVzZW50YXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYWNEcmNQcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5FbmNvZGVkVGFyZ2V0TGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtY3V0LWxldmVsIiwgcHJlc2VudGF0aW9uLm5EcmNDdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtYm9vc3QtbGV2ZWwiLCBwcmVzZW50YXRpb24ubkRyY0Jvb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJhYWMtZHJjLWhlYXZ5LWNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLXRhcmdldC1yZWYtbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1lZmZlY3QtdHlwZSIsIHByZXNlbnRhdGlvbi5uRHJjRWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYWFjLWRyYy1hbGJ1bS1tb2RlIiwgcHJlc2VudGF0aW9uLm5EcmNBbGJ1bU1vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImFhYy1kcmMtb3V0cHV0LWxvdWRuZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjT3V0cHV0TG91ZG5lc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNTU4OCwxNSArNTcxNywxOCBAQAogICAgIGludDMyX3QgcmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlcjsKICAgICBjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKIAorICAgIGludDMyX3QgZHNSYW5nZSwgZHNTdGFuZGFyZCwgZHNUcmFuc2ZlcjsKKyAgICBnZXRDb2xvckNvbmZpZ0Zyb21EYXRhU3BhY2UoZGF0YVNwYWNlLCAmZHNSYW5nZSwgJmRzU3RhbmRhcmQsICZkc1RyYW5zZmVyKTsKKwogICAgIC8vIGlmIHNvbWUgYXNwZWN0cyBhcmUgdW5zcGVjaWZpZWQsIHVzZSBkYXRhc3BhY2UgZmllbGRzCiAgICAgaWYgKHJhbmdlID09IDApIHsKLSAgICAgICAgcmFuZ2UgPSAoZGF0YVNwYWNlICYgSEFMX0RBVEFTUEFDRV9SQU5HRV9NQVNLKSA+PiBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUOworICAgICAgICByYW5nZSA9IGRzUmFuZ2U7CiAgICAgfQogICAgIGlmIChzdGFuZGFyZCA9PSAwKSB7Ci0gICAgICAgIHN0YW5kYXJkID0gKGRhdGFTcGFjZSAmIEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfTUFTSykgPj4gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVDsKKyAgICAgICAgc3RhbmRhcmQgPSBkc1N0YW5kYXJkOwogICAgIH0KICAgICBpZiAodHJhbnNmZXIgPT0gMCkgewotICAgICAgICB0cmFuc2ZlciA9IChkYXRhU3BhY2UgJiBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX01BU0spID4+IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQ7CisgICAgICAgIHRyYW5zZmVyID0gZHNUcmFuc2ZlcjsKICAgICB9CiAKICAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgYW4gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIGV2ZW50CkBAIC01NzIyLDcgKzU4NTQsOCBAQAogCiBBQ29kZWM6OkJhc2VTdGF0ZTo6QmFzZVN0YXRlKEFDb2RlYyAqY29kZWMsIGNvbnN0IHNwPEFTdGF0ZT4gJnBhcmVudFN0YXRlKQogICAgIDogQVN0YXRlKHBhcmVudFN0YXRlKSwKLSAgICAgIG1Db2RlYyhjb2RlYykgeworICAgICAgbUNvZGVjKGNvZGVjKSwKKyAgICAgIG1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QoZmFsc2UpIHsKIH0KIAogQUNvZGVjOjpCYXNlU3RhdGU6OlBvcnRNb2RlIEFDb2RlYzo6QmFzZVN0YXRlOjpnZXRQb3J0TW9kZSgKQEAgLTU3NjYsMTcgKzU4OTksMTkgQEAKIAogICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTZXRTdXJmYWNlOgogICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmhhbmRsZVNldFN1cmZhY2Uoc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgaWYgKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU4MjMsNiArNTk1OCwyMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U3VibWl0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlcjogeworICAgICAgICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGdldFBvcnRNb2RlKGtQb3J0SW5kZXhPdXRwdXQpID09IFJFU1VCTUlUX0JVRkZFUlMgJiYgbUNvZGVjLT5tSXNMb3dMYXRlbmN5KSB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlcnMgb2Z0ZW4gbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBidWZmZXIgdG8gYmUKKyAgICAgICAgICAgICAgICAvLyBzdWJtaXR0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBzaW5nbGUgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIEZvciBsb3cgbGF0ZW5jeSBjb2RlY3MsIHdlIGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgbW9yZSBpbnB1dAorICAgICAgICAgICAgICAgIC8vIHRvIGJlIHF1ZXVlZCB0byBnZXQgdGhvc2Ugb3V0cHV0IGJ1ZmZlcnMgc3VibWl0dGVkLgorICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCkgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC01OTc0LDYgKzYxMjQsMTIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIGlmIChtQ29kZWMtPm1Jc1N0cmVhbUNvcnJ1cHRGcmVlICYmIGRhdGExID09IChPTVhfVTMyKU9NWF9FcnJvclN0cmVhbUNvcnJ1cHQpIHsKKyAgICAgICAgQUxPR1YoIlslc10gaGFuZGxlIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQgYXMgYSBub3JtYWwgb3BlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKICAgICBBTE9HRSgiWyVzXSBFUlJPUigweCUwOHgpIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhMSk7CiAKICAgICAvLyB2ZXJpZnkgT01YIGNvbXBvbmVudCBzZW5kcyBiYWNrIGFuIGVycm9yIHdlIGV4cGVjdC4KQEAgLTYwODEsNiArNjIzNywxMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaW50MzJfdCBjdm87CisgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGJ1ZmZlciAhPSBOVUxMICYmCisgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKSkgeworICAgICAgICBBTE9HVigiY3ZvKCVkKSBmb3VuZCBpbiBidWZmZXIgIyV1IiwgY3ZvLCBidWZmZXJJRCk7CisgICAgICAgIHNldE5hdGl2ZVdpbmRvd1JvdGF0aW9uKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgY3ZvKTsKKyAgICB9CisKICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAgICAgaW5mby0+bURhdGEgPSBidWZmZXI7CiAKQEAgLTYxNzksNyArNjM0MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tSXNMb3dMYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ29kZWMtPm1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbklucHV0QnVmZmVyRmlsbGVkIik7CkBAIC02NzI5LDYgKzY4OTcsNyBAQAogICAgIEFMT0dWKCJvbkFsbG9jYXRlQ29tcG9uZW50Iik7CiAKICAgICBDSEVDSyhtQ29kZWMtPm1PTVhOb2RlID09IE5VTEwpOworICAgIG1Db2RlYy0+bUZhdGFsRXJyb3IgPSBmYWxzZTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24gKyAxKTsKQEAgLTY5NDcsMTAgKzcxMTYsOSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIHVzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjp1dGlsczo6VFdPbXhOb2RlOwogICAgIGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICBtQ29kZWMtPm1HcmFwaGljQnVmZmVyU291cmNlLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBUV09teE5vZGUobUNvZGVjLT5tT01YTm9kZSksCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU9NWE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkRhdGFzcGFjZT4oZGF0YVNwYWNlKSkpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBmb3Igbm9kZSAoZXJyICVkKSIsCkBAIC03MzI1LDYgKzc0OTMsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChtQ29kZWMtPm1Jc0xvd0xhdGVuY3kpIHsKKyAgICAgICAgbWF5YmVQb3N0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QoKTsKKyAgICB9CiAKICAgICAvLyAqKiogTk9URTogVEhFIEZPTExPV0lORyBXT1JLQVJPVU5EIFdJTEwgQkUgUkVNT1ZFRCAqKioKICAgICBtQ29kZWMtPnNpZ25hbFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOwpAQCAtNzYzMSw4ICs3ODAyLDggQEAKICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgiYW5kcm9pZC5fc3RvcC10aW1lLW9mZnNldC11cyIsIHN0b3BUaW1lT2Zmc2V0VXMpOwogICAgIH0KIAotICAgIGludDMyX3QgZHVtbXk7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJyZXF1ZXN0LXN5bmMiLCAmZHVtbXkpKSB7CisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJyZXF1ZXN0LXN5bmMiLCAmdG1wKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXF1ZXN0SURSRnJhbWUoKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC03NzA0LDYgKzc4NzUsNjcgQEAKICAgICAvLyBJZ25vcmUgZXJyb3JzIGFzIGZhaWx1cmUgaXMgZXhwZWN0ZWQgZm9yIGNvZGVjcyB0aGF0IGFyZW4ndCB2aWRlbyBlbmNvZGVycy4KICAgICAodm9pZCljb25maWd1cmVUZW1wb3JhbExheWVycyhwYXJhbXMsIGZhbHNlIC8qIGluQ29uZmlndXJlICovLCBtT3V0cHV0Rm9ybWF0KTsKIAorICAgIEFTdHJpbmcgbWltZTsKKyAgICBpZiAoIW1Jc0VuY29kZXIKKyAgICAgICAgICAgICYmIChtQ29uZmlnRm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKQorICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCBtaW1lLmNfc3RyKCkpKSB7CisgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FBQ0RSQ1BSRVNFTlRBVElPTlRZUEUgcHJlc2VudGF0aW9uOworICAgICAgICBJbml0T01YUGFyYW1zKCZwcmVzZW50YXRpb24pOworICAgICAgICBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgJnByZXNlbnRhdGlvbiwgc2l6ZW9mKHByZXNlbnRhdGlvbikpOworICAgICAgICBpbnQzMl90IHZhbHVlMzIgPSAwOworICAgICAgICBib29sIHVwZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtcGNtLWxpbWl0ZXItZW5hYmxlIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ublBDTUxpbWl0ZXJFbmFibGUgPSB2YWx1ZTMyOworICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhYWMtZW5jb2RlZC10YXJnZXQtbGV2ZWwiLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRW5jb2RlZFRhcmdldExldmVsID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLWRyYy1jdXQtbGV2ZWwiLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uRHJjQ3V0ID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLWRyYy1ib29zdC1sZXZlbCIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5EcmNCb29zdCA9IHZhbHVlMzI7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImFhYy1kcmMtaGVhdnktY29tcHJlc3Npb24iLCAmdmFsdWUzMikpIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbi5uSGVhdnlDb21wcmVzc2lvbiA9IHZhbHVlMzI7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImFhYy10YXJnZXQtcmVmLWxldmVsIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ublRhcmdldFJlZmVyZW5jZUxldmVsID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLWRyYy1lZmZlY3QtdHlwZSIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5EcmNFZmZlY3RUeXBlID0gdmFsdWUzMjsKKyAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiYWFjLWRyYy1hbGJ1bS1tb2RlIiwgJnZhbHVlMzIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb24ubkRyY0FsYnVtTW9kZSA9IHZhbHVlMzI7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBhcmFtcy0+ZmluZEludDMyKCJhYWMtZHJjLW91dHB1dC1sb3VkbmVzcyIsICZ2YWx1ZTMyKSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uLm5EcmNPdXRwdXRMb3VkbmVzcyA9IHZhbHVlMzI7CisgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXBkYXRlZCkgeworICAgICAgICAgICAgbU9NWE5vZGUtPnNldFBhcmFtZXRlcigoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFhY0RyY1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAmcHJlc2VudGF0aW9uLCBzaXplb2YocHJlc2VudGF0aW9uKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHR1bm5lbFBlZWsgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihUVU5ORUxfUEVFS19LRVksICZ0dW5uZWxQZWVrKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRUdW5uZWxQZWVrKHR1bm5lbFBlZWspOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIApAQCAtODE2OSw2ICs4NDAxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgT01YX0V2ZW50T25GaXJzdFR1bm5lbEZyYW1lUmVhZHk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1Db2RlYy0+b25GaXJzdFR1bm5lbEZyYW1lUmVhZHkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uT01YRXZlbnQoZXZlbnQsIGRhdGExLCBkYXRhMik7CiAgICAgfQpAQCAtODIwNywxNyArODQ0NSwzOCBAQAogICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBrV2hhdFJlc3VtZToKLSAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFJlc3VtZSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIERlZmVycmluZyByZXN1bWUiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIlslc10gRGVmZXJyaW5nIHJlc3VtZSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKICAgICAgICAgICAgIG1Db2RlYy0+ZGVmZXJNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldFBhcmFtZXRlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJwYXJhbXMiLCAmcGFyYW1zKSk7CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbUNvZGVjLT5zZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJhbXMtPnJlbW92ZUVudHJ5QXQocGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImhkcjEwLXBsdXMtaW5mbyIpKTsKKworICAgICAgICAgICAgICAgIGlmIChwYXJhbXMtPmNvdW50RW50cmllcygpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJwYXJhbXMiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPmRlZmVyTWVzc2FnZShtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbjoKICAgICAgICAgewogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKQEAgLTgyMjgsNiArODQ4NywyMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0U2V0U3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR1YoIlslc10gRGVmZXJyaW5nIHNldFN1cmZhY2UiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgbUNvZGVjLT5kZWZlck1lc3NhZ2UobXNnKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworCisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazoKICAgICAgICAgewogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uID0gMDsKQEAgLTgzMjgsNiArODYwNCwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCYXNlU3RhdGU6Om9uT01YRXZlbnQoZXZlbnQsIGRhdGExLCBkYXRhMik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggM2JjY2I3Yi4uYTA1MmE3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCkBAIC04LDYgKzI1LDEyIEBACiAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKICAgICBdLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CkBAIC0zNCw2ICs1NywxMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIKICAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc3RhdGljIHsKQEAgLTU4LDkgKzg3LDE4IEBACiAgICAgfSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYW5kayJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQogCkBAIC0xMzIsOCArMTcwLDEwIEBACiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTE1MCw2ICsxOTAsMTggQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBsaW51eDogeworICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgIi1ERElTQUJMRV9BVURJT19TWVNURU1fT0ZGTE9BRCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9CisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMTc2LDcgKzIyOCw3IEBACiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJyZW5kZXJlbmdpbmUiLAorICAgICAgICAibGlicmVuZGVyZnJpZ2h0IiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtMjIyLDYgKzI3NCw3IEBACiAgICAgICAgICJNUEVHMlRTV3JpdGVyLmNwcCIsCiAgICAgICAgICJNUEVHNFdyaXRlci5jcHAiLAogICAgICAgICAiTWVkaWFBZGFwdGVyLmNwcCIsCisgICAgICAgICJNZWRpYUFwcGVuZGVyLmNwcCIsCiAgICAgICAgICJNZWRpYUNsb2NrLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjTGlzdC5jcHAiLApAQCAtMjg1LDYgKzMzOCw4IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTI5Nyw2ICszNTIsOSBAQAogICAgICAgICAibGlib2dnIiwKICAgICAgICAgImxpYndlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX2Zvcm1hdCIsCisgICAgICAgICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6WwpAQCAtMzA0LDYgKzM2Miw3IEBACiAgICAgICAgICJsaWJuYXRpdmVsb2FkZXItaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYWZvcm1hdHNoYXBlcl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwpAQCAtMzExLDYgKzM3MCw3IEBACiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IDRiYzg2MWUuLmI2YWNkYzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Tb3VyY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgpAQCAtMzIsNiArMzQsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIHN0YXRpYyB2b2lkIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbihpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pIHsKICAgICBBdWRpb1NvdXJjZSAqc291cmNlID0gKEF1ZGlvU291cmNlICopIHVzZXI7CiAgICAgc3dpdGNoIChldmVudCkgewpAQCAtNTAsNzQgKzU0LDEwMSBAQAogfQogCiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLCBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIHVpbnQzMl90IG91dFNhbXBsZVJhdGUsCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbikKK3sKKyAgc2V0KGF0dHIsIGF0dHJpYnV0aW9uU291cmNlLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIG91dFNhbXBsZVJhdGUsIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7Cit9CisKK0F1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLCBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCB1aW50MzJfdCBvdXRTYW1wbGVSYXRlLAogICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAogICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKQotICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCi0gICAgICBtT3V0U2FtcGxlUmF0ZShvdXRTYW1wbGVSYXRlID4gMCA/IG91dFNhbXBsZVJhdGUgOiBzYW1wbGVSYXRlKSwKLSAgICAgIG1UcmFja01heEFtcGxpdHVkZShmYWxzZSksCi0gICAgICBtU3RhcnRUaW1lVXMoMCksCi0gICAgICBtU3RvcFN5c3RlbVRpbWVVcygtMSksCi0gICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoMCksCi0gICAgICBtTWF4QW1wbGl0dWRlKDApLAotICAgICAgbVByZXZTYW1wbGVUaW1lVXMoMCksCi0gICAgICBtSW5pdGlhbFJlYWRUaW1lVXMoMCksCi0gICAgICBtTnVtRnJhbWVzUmVjZWl2ZWQoMCksCi0gICAgICBtTnVtRnJhbWVzU2tpcHBlZCgwKSwKLSAgICAgIG1OdW1GcmFtZXNMb3N0KDApLAotICAgICAgbU51bUNsaWVudE93bmVkQnVmZmVycygwKSwKLSAgICAgIG1Ob01vcmVGcmFtZXNUb1JlYWQoZmFsc2UpIHsKLSAgICBBTE9HVigic2FtcGxlUmF0ZTogJXUsIG91dFNhbXBsZVJhdGU6ICV1LCBjaGFubmVsQ291bnQ6ICV1IiwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIG91dFNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7Ci0gICAgQ0hFQ0soY2hhbm5lbENvdW50ID09IDEgfHwgY2hhbm5lbENvdW50ID09IDIpOwotICAgIENIRUNLKHNhbXBsZVJhdGUgPiAwKTsKK3sKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKG9wUGFja2FnZU5hbWUpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KHVpZCkpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QocGlkKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIHNldChhdHRyLCBhdHRyaWJ1dGlvblNvdXJjZSwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBvdXRTYW1wbGVSYXRlLCBzZWxlY3RlZERldmljZUlkLAorICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sIHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOworfQogCi0gICAgc2l6ZV90IG1pbkZyYW1lQ291bnQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9SZWNvcmQ6OmdldE1pbkZyYW1lQ291bnQoJm1pbkZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCBjYWxsYmFjayBuZXZlciByZXR1cm5zIG1vcmUgdGhhbiB0aGUgbWF4aW11bQotICAgICAgICAvLyBidWZmZXIgc2l6ZQotICAgICAgICB1aW50MzJfdCBmcmFtZUNvdW50ID0ga01heEJ1ZmZlclNpemUgLyBzaXplb2YoaW50MTZfdCkgLyBjaGFubmVsQ291bnQ7Cit2b2lkIEF1ZGlvU291cmNlOjpzZXQoCisgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIHVpbnQzMl90IG91dFNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbikKK3sKKyAgIG1TdGFydGVkID0gZmFsc2U7CisgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICBtT3V0U2FtcGxlUmF0ZSA9IG91dFNhbXBsZVJhdGUgPiAwID8gb3V0U2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGU7CisgICBtVHJhY2tNYXhBbXBsaXR1ZGUgPSBmYWxzZTsKKyAgIG1TdGFydFRpbWVVcyA9IDA7CisgICBtU3RvcFN5c3RlbVRpbWVVcyA9IC0xOworICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gMDsKKyAgIG1NYXhBbXBsaXR1ZGUgPSAwOworICAgbVByZXZTYW1wbGVUaW1lVXMgPSAwOworICAgbUluaXRpYWxSZWFkVGltZVVzID0gMDsKKyAgIG1OdW1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICBtTnVtRnJhbWVzU2tpcHBlZCA9IDA7CisgICBtTnVtRnJhbWVzTG9zdCA9IDA7CisgICBtTnVtQ2xpZW50T3duZWRCdWZmZXJzID0gMDsKKyAgIG1Ob01vcmVGcmFtZXNUb1JlYWQgPSBmYWxzZTsKKyAgQUxPR1YoInNhbXBsZVJhdGU6ICV1LCBvdXRTYW1wbGVSYXRlOiAldSwgY2hhbm5lbENvdW50OiAldSIsCisgICAgICAgIHNhbXBsZVJhdGUsIG91dFNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CisgIENIRUNLKGNoYW5uZWxDb3VudCA9PSAxIHx8IGNoYW5uZWxDb3VudCA9PSAyKTsKKyAgQ0hFQ0soc2FtcGxlUmF0ZSA+IDApOwogCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCB0b3RhbCBidWZmZXIgc2l6ZSBpcyBsYXJnZSBlbm91Z2gKLSAgICAgICAgc2l6ZV90IGJ1ZkNvdW50ID0gMjsKLSAgICAgICAgd2hpbGUgKChidWZDb3VudCAqIGZyYW1lQ291bnQpIDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICAgICAgYnVmQ291bnQrKzsKLSAgICAgICAgfQorICBzaXplX3QgbWluRnJhbWVDb3VudDsKKyAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9SZWNvcmQ6OmdldE1pbkZyYW1lQ291bnQoJm1pbkZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpKTsKKyAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBBdWRpb1JlY29yZCBjYWxsYmFjayBuZXZlciByZXR1cm5zIG1vcmUgdGhhbiB0aGUgbWF4aW11bQorICAgIC8vIGJ1ZmZlciBzaXplCisgICAgdWludDMyX3QgZnJhbWVDb3VudCA9IGtNYXhCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpIC8gY2hhbm5lbENvdW50OwogCi0gICAgICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovLAotICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAotICAgICAgICAgICAgICAgICAgICBBdWRpb1JlY29yZDo6VFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICB1aWQsCi0gICAgICAgICAgICAgICAgICAgIHBpZCwKLSAgICAgICAgICAgICAgICAgICAgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOwotICAgICAgICAvLyBTZXQgY2FsbGVyIG5hbWUgc28gaXQgY2FuIGJlIGxvZ2dlZCBpbiBkZXN0cnVjdG9yLgotICAgICAgICAvLyBNZWRpYU1ldHJpY3NDb25zdGFudHMuaDogQU1FRElBTUVUUklDU19QUk9QX0NBTExFUk5BTUVfVkFMVUVfTUVESUEKLSAgICAgICAgbVJlY29yZC0+c2V0Q2FsbGVyTmFtZSgibWVkaWEiKTsKLSAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwotICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICAgICAgbVJlY29yZC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUluaXRDaGVjayA9IHN0YXR1czsKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgQXVkaW9SZWNvcmQgdG90YWwgYnVmZmVyIHNpemUgaXMgbGFyZ2UgZW5vdWdoCisgICAgc2l6ZV90IGJ1ZkNvdW50ID0gMjsKKyAgICB3aGlsZSAoKGJ1ZkNvdW50ICogZnJhbWVDb3VudCkgPCBtaW5GcmFtZUNvdW50KSB7CisgICAgICBidWZDb3VudCsrOwogICAgIH0KKworICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCisgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKKyAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIChzaXplX3QpIChidWZDb3VudCAqIGZyYW1lQ291bnQpLAorICAgICAgICBBdWRpb1JlY29yZENhbGxiYWNrRnVuY3Rpb24sCisgICAgICAgIHRoaXMsCisgICAgICAgIGZyYW1lQ291bnQgLypub3RpZmljYXRpb25GcmFtZXMqLywKKyAgICAgICAgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgQXVkaW9SZWNvcmQ6OlRSQU5TRkVSX0RFRkFVTFQsCisgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgYXR0ciwKKyAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOworICAgIC8vIFNldCBjYWxsZXIgbmFtZSBzbyBpdCBjYW4gYmUgbG9nZ2VkIGluIGRlc3RydWN0b3IuCisgICAgLy8gTWVkaWFNZXRyaWNzQ29uc3RhbnRzLmg6IEFNRURJQU1FVFJJQ1NfUFJPUF9DQUxMRVJOQU1FX1ZBTFVFX01FRElBCisgICAgbVJlY29yZC0+c2V0Q2FsbGVyTmFtZSgibWVkaWEiKTsKKyAgICBtSW5pdENoZWNrID0gbVJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgIG1SZWNvcmQuY2xlYXIoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbUluaXRDaGVjayA9IHN0YXR1czsKKyAgfQogfQogCiBBdWRpb1NvdXJjZTo6fkF1ZGlvU291cmNlKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKaW5kZXggOWIzZjQyMC4uOTVhZmE2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCkBAIC00Niw4OCArNDYsNiBAQAogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBDQU1FUkFfU09VUkNFX1RJTUVPVVRfTlMgPSAzMDAwMDAwMDAwTEw7CiAKLXN0cnVjdCBDYW1lcmFTb3VyY2VMaXN0ZW5lciA6IHB1YmxpYyBDYW1lcmFMaXN0ZW5lciB7Ci0gICAgZXhwbGljaXQgQ2FtZXJhU291cmNlTGlzdGVuZXIoY29uc3Qgc3A8Q2FtZXJhU291cmNlPiAmc291cmNlKTsKLQotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7Ci0gICAgdmlydHVhbCB2b2lkIHBvc3REYXRhKGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdERhdGFUaW1lc3RhbXAoCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdFJlY29yZGluZ0ZyYW1lSGFuZGxlVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcG9zdFJlY29yZGluZ0ZyYW1lSGFuZGxlVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4mIHRpbWVzdGFtcHMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+Q2FtZXJhU291cmNlTGlzdGVuZXIoKTsKLQotcHJpdmF0ZToKLSAgICB3cDxDYW1lcmFTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBDYW1lcmFTb3VyY2VMaXN0ZW5lcihjb25zdCBDYW1lcmFTb3VyY2VMaXN0ZW5lciAmKTsKLSAgICBDYW1lcmFTb3VyY2VMaXN0ZW5lciAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZUxpc3RlbmVyICYpOwotfTsKLQotQ2FtZXJhU291cmNlTGlzdGVuZXI6OkNhbWVyYVNvdXJjZUxpc3RlbmVyKGNvbnN0IHNwPENhbWVyYVNvdXJjZT4gJnNvdXJjZSkKLSAgICA6IG1Tb3VyY2Uoc291cmNlKSB7Ci19Ci0KLUNhbWVyYVNvdXJjZUxpc3RlbmVyOjp+Q2FtZXJhU291cmNlTGlzdGVuZXIoKSB7Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6Om5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSB7Ci0gICAgVU5VU0VEX1VOTEVTU19WRVJCT1NFKG1zZ1R5cGUpOwotICAgIFVOVVNFRF9VTkxFU1NfVkVSQk9TRShleHQxKTsKLSAgICBVTlVTRURfVU5MRVNTX1ZFUkJPU0UoZXh0Mik7Ci0gICAgQUxPR1YoIm5vdGlmeSglZCwgJWQsICVkKSIsIG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwotfQotCi12b2lkIENhbWVyYVNvdXJjZUxpc3RlbmVyOjpwb3N0RGF0YShpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKiAvKiBtZXRhZGF0YSAqLykgewotICAgIEFMT0dWKCJwb3N0RGF0YSglZCwgcHRyOiVwLCBzaXplOiV6dSkiLAotICAgICAgICAgbXNnVHlwZSwgZGF0YVB0ci0+dW5zZWN1cmVQb2ludGVyKCksIGRhdGFQdHItPnNpemUoKSk7Ci0KLSAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwotICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBzb3VyY2UtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3REYXRhVGltZXN0YW1wKAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgewotCi0gICAgc3A8Q2FtZXJhU291cmNlPiBzb3VyY2UgPSBtU291cmNlLnByb21vdGUoKTsKLSAgICBpZiAoc291cmNlLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgc291cmNlLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLzEwMDAsIG1zZ1R5cGUsIGRhdGFQdHIpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VMaXN0ZW5lcjo6cG9zdFJlY29yZGluZ0ZyYW1lSGFuZGxlVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgIHNwPENhbWVyYVNvdXJjZT4gc291cmNlID0gbVNvdXJjZS5wcm9tb3RlKCk7Ci0gICAgaWYgKHNvdXJjZS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNvdXJjZS0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAvMTAwMCwgaGFuZGxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlTGlzdGVuZXI6OnBvc3RSZWNvcmRpbmdGcmFtZUhhbmRsZVRpbWVzdGFtcEJhdGNoKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxuc2Vjc190PiYgdGltZXN0YW1wcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBzcDxDYW1lcmFTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOwotICAgIGlmIChzb3VyY2UuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBpbnQgbiA9IHRpbWVzdGFtcHMuc2l6ZSgpOwotICAgICAgICBzdGQ6OnZlY3Rvcjxuc2Vjc190PiBtb2RpZmllZFRpbWVzdGFtcHMobik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBtb2RpZmllZFRpbWVzdGFtcHNbaV0gPSB0aW1lc3RhbXBzW2ldIC8gMTAwMDsKLSAgICAgICAgfQotICAgICAgICBzb3VyY2UtPnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaChtb2RpZmllZFRpbWVzdGFtcHMsIGhhbmRsZXMpOwotICAgIH0KLX0KLQogc3RhdGljIGludDMyX3QgZ2V0Q29sb3JGb3JtYXQoY29uc3QgY2hhciogY29sb3JGb3JtYXQpIHsKICAgICBpZiAoIWNvbG9yRm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNvbG9yIGZvcm1hdCIpOwpAQCAtMTY5LDE2ICs4Nyw2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1DYW1lcmFTb3VyY2UgKkNhbWVyYVNvdXJjZTo6Q3JlYXRlKGNvbnN0IFN0cmluZzE2ICZjbGllbnROYW1lKSB7Ci0gICAgU2l6ZSBzaXplOwotICAgIHNpemUud2lkdGggPSAtMTsKLSAgICBzaXplLmhlaWdodCA9IC0xOwotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmE+IGNhbWVyYTsKLSAgICByZXR1cm4gbmV3IENhbWVyYVNvdXJjZShjYW1lcmEsIE5VTEwsIDAsIGNsaWVudE5hbWUsIENhbWVyYTo6VVNFX0NBTExJTkdfVUlELAotICAgICAgICAgICAgQ2FtZXJhOjpVU0VfQ0FMTElOR19QSUQsIHNpemUsIC0xLCBOVUxMLCBmYWxzZSk7Ci19Ci0KIC8vIHN0YXRpYwogQ2FtZXJhU291cmNlICpDYW1lcmFTb3VyY2U6OkNyZWF0ZUZyb21DYW1lcmEoCiAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsCkBAIC0xODksMTIgKzk3LDEwIEBACiAgICAgcGlkX3QgY2xpZW50UGlkLAogICAgIFNpemUgdmlkZW9TaXplLAogICAgIGludDMyX3QgZnJhbWVSYXRlLAotICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAotICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UpIHsKIAogICAgIENhbWVyYVNvdXJjZSAqc291cmNlID0gbmV3IENhbWVyYVNvdXJjZShjYW1lcmEsIHByb3h5LCBjYW1lcmFJZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLCB2aWRlb1NpemUsIGZyYW1lUmF0ZSwgc3VyZmFjZSwKLSAgICAgICAgICAgIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CisgICAgICAgICAgICBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgdmlkZW9TaXplLCBmcmFtZVJhdGUsIHN1cmZhY2UpOwogICAgIHJldHVybiBzb3VyY2U7CiB9CiAKQEAgLTIwNyw4ICsxMTMsNyBAQAogICAgIHBpZF90IGNsaWVudFBpZCwKICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICBpbnQzMl90IGZyYW1lUmF0ZSwKLSAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykKKyAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSkKICAgICA6IG1DYW1lcmFGbGFncygwKSwKICAgICAgIG1OdW1JbnB1dEJ1ZmZlcnMoMCksCiAgICAgICBtVmlkZW9GcmFtZVJhdGUoLTEpLApAQCAtMjMxLDggKzEzNiw3IEBACiAKICAgICBtSW5pdENoZWNrID0gaW5pdChjYW1lcmEsIHByb3h5LCBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgZnJhbWVSYXRlLAotICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIGZyYW1lUmF0ZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHJlbGVhc2VDYW1lcmEoKTsKIH0KIApAQCAtMjQ1LDcgKzE0OSw4IEBACiAgICAgaW50MzJfdCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIHVpZF90IGNsaWVudFVpZCwgcGlkX3QgY2xpZW50UGlkKSB7CiAKICAgICBpZiAoY2FtZXJhID09IDApIHsKLSAgICAgICAgbUNhbWVyYSA9IENhbWVyYTo6Y29ubmVjdChjYW1lcmFJZCwgY2xpZW50TmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQpOworICAgICAgICBtQ2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KGNhbWVyYUlkLCBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qL19fQU5EUk9JRF9BUElfRlVUVVJFX18pOwogICAgICAgICBpZiAobUNhbWVyYSA9PSAwKSByZXR1cm4gLUVCVVNZOwogICAgICAgICBtQ2FtZXJhRmxhZ3MgJj0gfkZMQUdTX0hPVF9DQU1FUkE7CiAgICAgfSBlbHNlIHsKQEAgLTUzMSwxNSArNDM2LDEzIEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgcGlkX3QgY2xpZW50UGlkLAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKLSAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKSB7CiAKICAgICBBTE9HVigiaW5pdCIpOwogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgIGVyciA9IGluaXRXaXRoQ2FtZXJhQWNjZXNzKGNhbWVyYSwgcHJveHksIGNhbWVyYUlkLCBjbGllbnROYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1NpemUsIGZyYW1lUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgZnJhbWVSYXRlKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICByZXR1cm4gZXJyOwogfQpAQCAtNjI2LDggKzUyOSw3IEBACiAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgcGlkX3QgY2xpZW50UGlkLAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKLSAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSB7CisgICAgICAgIGludDMyX3QgZnJhbWVSYXRlKSB7CiAgICAgQUxPR1YoImluaXRXaXRoQ2FtZXJhQWNjZXNzIik7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKQEAgLTY2NywyNCArNTY5LDEyIEBACiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNhbWVyYS0+c2V0UHJldmlld1RhcmdldChtU3VyZmFjZSkpOwogICAgIH0KIAotICAgIC8vIEJ5IGRlZmF1bHQsIHN0b3JlIHJlYWwgZGF0YSBpbiB2aWRlbyBidWZmZXJzLgotICAgIG1WaWRlb0J1ZmZlck1vZGUgPSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVY7Ci0gICAgaWYgKHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykgewotICAgICAgICBpZiAoT0sgPT0gbUNhbWVyYS0+c2V0VmlkZW9CdWZmZXJNb2RlKGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUpKSB7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXJNb2RlID0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRTsKLSAgICAgICAgfSBlbHNlIGlmIChPSyA9PSBtQ2FtZXJhLT5zZXRWaWRlb0J1ZmZlck1vZGUoCi0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEpKSB7Ci0gICAgICAgICAgICBtVmlkZW9CdWZmZXJNb2RlID0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvQnVmZmVyTW9kZSA9PSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVYpIHsKLSAgICAgICAgZXJyID0gbUNhbWVyYS0+c2V0VmlkZW9CdWZmZXJNb2RlKGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX1lVVik7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU2V0dGluZyB2aWRlbyBidWZmZXIgbW9kZSB0byBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX1lVViBmYWlsZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgIiVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KKyAgICAvLyBVc2UgYnVmZmVyIHF1ZXVlIHRvIHJlY2VpdmUgdmlkZW8gYnVmZmVycyBmcm9tIGNhbWVyYQorICAgIGVyciA9IG1DYW1lcmEtPnNldFZpZGVvQnVmZmVyTW9kZShoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfQlVGRkVSX1FVRVVFKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogU2V0dGluZyB2aWRlbyBidWZmZXIgbW9kZSB0byBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgIiVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKICAgICBpbnQ2NF90IGdsaXRjaER1cmF0aW9uVXMgPSAoMTAwMDAwMExMIC8gbVZpZGVvRnJhbWVSYXRlKTsKQEAgLTcyNCw1NCArNjE0LDI2IEBACiAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgc3RhdHVzX3QgZXJyOwogCi0gICAgaWYgKG1WaWRlb0J1ZmZlck1vZGUgPT0gaGFyZHdhcmU6OklDYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSkgewotICAgICAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZS4KLSAgICAgICAgZXJyID0gaW5pdEJ1ZmZlclF1ZXVlKG1WaWRlb1NpemUud2lkdGgsIG1WaWRlb1NpemUuaGVpZ2h0LCBtRW5jb2RlckZvcm1hdCwKLSAgICAgICAgICAgICAgICAoYW5kcm9pZF9kYXRhc3BhY2VfdCltRW5jb2RlckRhdGFTcGFjZSwKLSAgICAgICAgICAgICAgICBtTnVtSW5wdXRCdWZmZXJzID4gMCA/IG1OdW1JbnB1dEJ1ZmZlcnMgOiAxKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBidWZmZXIgcXVldWU6ICVzIChlcnI9JWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAobU51bUlucHV0QnVmZmVycyA+IDApIHsKLSAgICAgICAgICAgIGVyciA9IG1DYW1lcmEtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0JVRkZFUl9DT1VOVCwgbU51bUlucHV0QnVmZmVycywgMCk7Ci0KLSAgICAgICAgICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGZvciBDYW1lcmFIQUwxIGNsaWVudHM7IHRodXMgdGhlIGZhaWx1cmUgaXMKLSAgICAgICAgICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBzZXQgdmlkZW8gYnVmZmVyIGNvdW50IHRvICVkIGR1ZSB0byAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1OdW1JbnB1dEJ1ZmZlcnMsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgIENBTUVSQV9DTURfU0VUX1ZJREVPX0ZPUk1BVCwgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlKTsKLQotICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBmb3IgQ2FtZXJhSEFMMSBjbGllbnRzOyB0aHVzIHRoZSBmYWlsdXJlIGlzCi0gICAgICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gc2V0IHZpZGVvIGVuY29kZXIgZm9ybWF0L2RhdGFzcGFjZSB0byAlZCwgJWQgZHVlIHRvICVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlLCBlcnIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBoZWFwIHRvIHN0b3JlIGJ1ZmZlcnMgYXMgVmlkZW9OYXRpdmVNZXRhZGF0YS4KLSAgICAgICAgY3JlYXRlVmlkZW9CdWZmZXJNZW1vcnlIZWFwKHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSwga0RlZmF1bHRWaWRlb0J1ZmZlckNvdW50KTsKKyAgICAvLyBJbml0aWFsaXplIGJ1ZmZlciBxdWV1ZS4KKyAgICBlcnIgPSBpbml0QnVmZmVyUXVldWUobVZpZGVvU2l6ZS53aWR0aCwgbVZpZGVvU2l6ZS5oZWlnaHQsIG1FbmNvZGVyRm9ybWF0LAorICAgICAgICAgICAgKGFuZHJvaWRfZGF0YXNwYWNlX3QpbUVuY29kZXJEYXRhU3BhY2UsCisgICAgICAgICAgICBtTnVtSW5wdXRCdWZmZXJzID4gMCA/IG1OdW1JbnB1dEJ1ZmZlcnMgOiAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgYnVmZmVyIHF1ZXVlOiAlcyAoZXJyPSVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICAvLyBTdGFydCBkYXRhIGZsb3cKICAgICBlcnIgPSBPSzsKICAgICBpZiAobUNhbWVyYUZsYWdzICYgRkxBR1NfSE9UX0NBTUVSQSkgewogICAgICAgICBtQ2FtZXJhLT51bmxvY2soKTsKICAgICAgICAgbUNhbWVyYS5jbGVhcigpOwotICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoCi0gICAgICAgICAgICAgICAgbmV3IFByb3h5TGlzdGVuZXIodGhpcykpKSAhPSBPSykgeworICAgICAgICBpZiAoKGVyciA9IG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+c3RhcnRSZWNvcmRpbmcoKSkgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgcmVjb3JkaW5nLCByZWNlaXZlZCBlcnJvcjogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUNhbWVyYS0+c2V0TGlzdGVuZXIobmV3IENhbWVyYVNvdXJjZUxpc3RlbmVyKHRoaXMpKTsKICAgICAgICAgbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKICAgICAgICAgaWYgKCFtQ2FtZXJhLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7CkBAIC03OTcsNyArNjU5LDcgQEAKICAgICBtU3RhcnRUaW1lVXMgPSAwOwogICAgIG1OdW1JbnB1dEJ1ZmZlcnMgPSAwOwogICAgIG1FbmNvZGVyRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOwotICAgIG1FbmNvZGVyRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9CVDcwOTsKKyAgICBtRW5jb2RlckRhdGFTcGFjZSA9IG1CdWZmZXJEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1YwX0JUNzA5OwogCiAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKQEAgLTgxNyw2ICs2NzksNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yU3BhY2UsICZtRW5jb2RlckRhdGFTcGFjZSkpIHsKICAgICAgICAgICAgIEFMT0dJKCJVc2luZyBlbmNvZGVyIGRhdGEgc3BhY2U6ICUjeCIsIG1FbmNvZGVyRGF0YVNwYWNlKTsKKyAgICAgICAgICAgIG1CdWZmZXJEYXRhU3BhY2UgPSBtRW5jb2RlckRhdGFTcGFjZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODM2LDcgKzY5OSw2IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAobUNhbWVyYSAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2FtZXJhLT5zZXRMaXN0ZW5lcihOVUxMKTsKICAgICAgICAgICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTkzNSw5NyArNzk3LDMxIEBACiB2b2lkIENhbWVyYVNvdXJjZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBmcmFtZSkgewogICAgIEFMT0dWKCJyZWxlYXNlUmVjb3JkaW5nRnJhbWUiKTsKIAotICAgIGlmIChtVmlkZW9CdWZmZXJNb2RlID09IGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUpIHsKLSAgICAgICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgdG8gYnVmZmVyIHF1ZXVlIGluIFZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSBtb2RlLgotICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gZnJhbWUtPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgICAgIGlmIChoZWFwLT5nZXRIZWFwSUQoKSAhPSBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE1pc21hdGNoZWQgaGVhcCBJRCwgaWdub3JpbmcgcmVsZWFzZSAoZ290ICV4LCBleHBlY3RlZCAleCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGhlYXAtPmdldEhlYXBJRCgpLCBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKnBheWxvYWQgPSByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPigKLSAgICAgICAgICAgICAgICAodWludDhfdCopaGVhcC0+Z2V0QmFzZSgpICsgb2Zmc2V0KTsKLQotICAgICAgICAvLyBGaW5kIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZmZlciBpdGVtIGZvciB0aGUgbmF0aXZlIHdpbmRvdyBidWZmZXIuCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtUmVjZWl2ZWRCdWZmZXJJdGVtTWFwLmluZGV4T2ZLZXkocGF5bG9hZC0+cEJ1ZmZlcik7Ci0gICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBmaW5kIGJ1ZmZlciBpdGVtIGZvciAlcCIsIF9fRlVOQ1RJT05fXywgcGF5bG9hZC0+cEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBCdWZmZXJJdGVtIGJ1ZmZlciA9IG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgIG1WaWRlb0J1ZmZlckNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgIG1NZW1vcnlCYXNlcy5wdXNoX2JhY2soZnJhbWUpOwotICAgICAgICBtTWVtb3J5QmFzZUF2YWlsYWJsZUNvbmQuc2lnbmFsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBudWxscHRyOwotCi0gICAgICAgIC8vIENoZWNrIGlmIGZyYW1lIGNvbnRhaW5zIGEgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4KLSAgICAgICAgaWYgKGZyYW1lLT5zaXplKCkgPT0gc2l6ZW9mKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEpKSB7Ci0gICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKLSAgICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPQotICAgICAgICAgICAgICAgIChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZnJhbWUtPnVuc2VjdXJlUG9pbnRlcigpKTsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YS0+ZVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgICAgIGhhbmRsZSA9IG1ldGFkYXRhLT5wSGFuZGxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IG9mZnNldDsKLSAgICAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBmcmFtZS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgICAgIGlmIChoZWFwLT5nZXRIZWFwSUQoKSAhPSBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBNaXNtYXRjaGVkIGhlYXAgSUQsIGlnbm9yaW5nIHJlbGVhc2UgKGdvdCAleCwgZXhwZWN0ZWQgJXgpIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIGhlYXAtPmdldEhlYXBJRCgpLCBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBiYXRjaFNpemUgPSAwOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtQmF0Y2hMb2NrKTsKLSAgICAgICAgICAgICAgICBpZiAobUluZmxpZ2h0QmF0Y2hTaXplcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJhdGNoU2l6ZSA9IG1JbmZsaWdodEJhdGNoU2l6ZXNbMF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJhdGNoU2l6ZSA9PSAwKSB7IC8vIHJldHVybiBidWZmZXJzIG9uZSBieSBvbmUKLSAgICAgICAgICAgICAgICAvLyBGcmFtZSBjb250YWlucyBhIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEuIFNlbmQgdGhlIGhhbmRsZSBiYWNrIHRvIGNhbWVyYS4KLSAgICAgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBtTWVtb3J5QmFzZXMucHVzaF9iYWNrKGZyYW1lKTsKLSAgICAgICAgICAgICAgICBtTWVtb3J5QmFzZUF2YWlsYWJsZUNvbmQuc2lnbmFsKCk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBHcm91cCBidWZmZXJzIGluIGJhdGNoIHRoZW4gcmV0dXJuCi0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CYXRjaExvY2spOwotICAgICAgICAgICAgICAgIG1JbmZsaWdodFJldHVybmVkSGFuZGxlcy5wdXNoX2JhY2soaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBtSW5mbGlnaHRSZXR1cm5lZE1lbW9yeXMucHVzaF9iYWNrKGZyYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobUluZmxpZ2h0UmV0dXJuZWRIYW5kbGVzLnNpemUoKSA9PSBiYXRjaFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2gobUluZmxpZ2h0UmV0dXJuZWRIYW5kbGVzKTsKLQotICAgICAgICAgICAgICAgICAgICBtSW5mbGlnaHRCYXRjaFNpemVzLnBvcF9mcm9udCgpOwotICAgICAgICAgICAgICAgICAgICBtSW5mbGlnaHRSZXR1cm5lZEhhbmRsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBtZW0gOiBtSW5mbGlnaHRSZXR1cm5lZE1lbW9yeXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnlCYXNlcy5wdXNoX2JhY2sobWVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC5zaWduYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSW5mbGlnaHRSZXR1cm5lZE1lbW9yeXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgLy8gbUNhbWVyYSBpcyBjcmVhdGVkIGJ5IGFwcGxpY2F0aW9uLiBSZXR1cm4gdGhlIGZyYW1lIGJhY2sgdG8gY2FtZXJhIHZpYSBjYW1lcmEKLSAgICAgICAgICAgIC8vIHJlY29yZGluZyBwcm94eS4KLSAgICAgICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGZyYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQ2FtZXJhICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIG1DYW1lcmEgaXMgY3JlYXRlZCBieSBDYW1lcmFTb3VyY2UuIFJldHVybiB0aGUgZnJhbWUgZGlyZWN0bHkgYmFjayB0byBjYW1lcmEuCi0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShmcmFtZSk7Ci0gICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICAgICAgfQorICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIHRvIGJ1ZmZlciBxdWV1ZSBpbiBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgbW9kZS4KKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGZyYW1lLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOworICAgIGlmIChoZWFwLT5nZXRIZWFwSUQoKSAhPSBtTWVtb3J5SGVhcEJhc2UtPmdldEhlYXBJRCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTWlzbWF0Y2hlZCBoZWFwIElELCBpZ25vcmluZyByZWxlYXNlIChnb3QgJXgsIGV4cGVjdGVkICV4KSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBoZWFwLT5nZXRIZWFwSUQoKSwgbU1lbW9yeUhlYXBCYXNlLT5nZXRIZWFwSUQoKSk7CisgICAgICAgIHJldHVybjsKICAgICB9CisKKyAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICpwYXlsb2FkID0gcmVpbnRlcnByZXRfY2FzdDxWaWRlb05hdGl2ZU1ldGFkYXRhKj4oCisgICAgICAgICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQpOworCisgICAgLy8gRmluZCB0aGUgY29ycmVzcG9uZGluZyBidWZmZXIgaXRlbSBmb3IgdGhlIG5hdGl2ZSB3aW5kb3cgYnVmZmVyLgorICAgIHNzaXplX3QgaW5kZXggPSBtUmVjZWl2ZWRCdWZmZXJJdGVtTWFwLmluZGV4T2ZLZXkocGF5bG9hZC0+cEJ1ZmZlcik7CisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZmluZCBidWZmZXIgaXRlbSBmb3IgJXAiLCBfX0ZVTkNUSU9OX18sIHBheWxvYWQtPnBCdWZmZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQnVmZmVySXRlbSBidWZmZXIgPSBtUmVjZWl2ZWRCdWZmZXJJdGVtTWFwLnZhbHVlQXQoaW5kZXgpOworICAgIG1SZWNlaXZlZEJ1ZmZlckl0ZW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgbVZpZGVvQnVmZmVyQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKKyAgICBtTWVtb3J5QmFzZXMucHVzaF9iYWNrKGZyYW1lKTsKKyAgICBtTWVtb3J5QmFzZUF2YWlsYWJsZUNvbmQuc2lnbmFsKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpyZWxlYXNlUXVldWVkRnJhbWVzKCkgewpAQCAtMTExNCw2ICs5MTAsMTEgQEAKICAgICAgICAgKCpidWZmZXIpLT5zZXRPYnNlcnZlcih0aGlzKTsKICAgICAgICAgKCpidWZmZXIpLT5hZGRfcmVmKCk7CiAgICAgICAgICgqYnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CisgICAgICAgIGlmIChtQnVmZmVyRGF0YVNwYWNlICE9IG1FbmNvZGVyRGF0YVNwYWNlKSB7CisgICAgICAgICAgICBBTE9HRCgiRGF0YSBzcGFjZSB1cGRhdGVkIHRvICV4IiwgbUJ1ZmZlckRhdGFTcGFjZSk7CisgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlDb2xvclNwYWNlLCBtQnVmZmVyRGF0YVNwYWNlKTsKKyAgICAgICAgICAgIG1FbmNvZGVyRGF0YVNwYWNlID0gbUJ1ZmZlckRhdGFTcGFjZTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMTgxLDE1MiArOTgyLDYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlIF9fdW51c2VkLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlbGxkIHVzIiwgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChzaG91bGRTa2lwRnJhbWVMb2NrZWQodGltZXN0YW1wVXMpKSB7Ci0gICAgICAgIHJlbGVhc2VPbmVSZWNvcmRpbmdGcmFtZShkYXRhKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwotCi0gICAgQ0hFQ0soZGF0YSAhPSBOVUxMICYmIGRhdGEtPnNpemUoKSA+IDApOwotICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwKLSAgICAgICAgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSkgewotICAgIGlmIChtQ2FtZXJhUmVjb3JkaW5nUHJveHkgIT0gbnVsbHB0cikgewotICAgICAgICBtQ2FtZXJhUmVjb3JkaW5nUHJveHktPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZShoYW5kbGUpOwotICAgIH0gZWxzZSBpZiAobUNhbWVyYSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICBtQ2FtZXJhLT5yZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgaWYgKG1DYW1lcmFSZWNvcmRpbmdQcm94eSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1DYW1lcmFSZWNvcmRpbmdQcm94eS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goaGFuZGxlcyk7Ci0gICAgfSBlbHNlIGlmIChtQ2FtZXJhICE9IG51bGxwdHIpIHsKLSAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgIG1DYW1lcmEtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGhhbmRsZXMpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCi0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIHsKLSAgICBBTE9HVigiJXM6IHRpbWVzdGFtcCAlbGxkIHVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgaWYgKHNob3VsZFNraXBGcmFtZUxvY2tlZCh0aW1lc3RhbXBVcykpIHsKLSAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobU1lbW9yeUJhc2VzLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtNZW1vcnlCYXNlQXZhaWxhYmxlVGltZW91dE5zKSA9PQotICAgICAgICAgICAgICAgIFRJTUVEX09VVCkgewotICAgICAgICAgICAgQUxPR1coIldhaXRpbmcgb24gYW4gYXZhaWxhYmxlIG1lbW9yeSBiYXNlIHRpbWVkIG91dC4gRHJvcHBpbmcgYSByZWNvcmRpbmcgZnJhbWUuIik7Ci0gICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwotCi0gICAgc3A8SU1lbW9yeT4gZGF0YSA9ICptTWVtb3J5QmFzZXMuYmVnaW4oKTsKLSAgICBtTWVtb3J5QmFzZXMuZXJhc2UobU1lbW9yeUJhc2VzLmJlZ2luKCkpOwotCi0gICAgLy8gV3JhcCBuYXRpdmUgaGFuZGxlIGluIHNwPElNZW1vcnk+IHNvIGl0IGNhbiBiZSBwdXNoZWQgdG8gbUZyYW1lc1JlY2VpdmVkLgotICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0gKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKShkYXRhLT51bnNlY3VyZVBvaW50ZXIoKSk7Ci0gICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLQotICAgIG1GcmFtZXNSZWNlaXZlZC5wdXNoX2JhY2soZGF0YSk7Ci0gICAgaW50NjRfdCB0aW1lVXMgPSBtU3RhcnRUaW1lVXMgKyAodGltZXN0YW1wVXMgLSBtRmlyc3RGcmFtZVRpbWVVcyk7Ci0gICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgQUxPR1YoImluaXRpYWwgZGVsYXk6ICUiIFBSSWQ2NCAiLCBjdXJyZW50IHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgbVN0YXJ0VGltZVVzLCB0aW1lVXMpOwotICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIHRpbWVzdGFtcHNVcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBzaXplX3QgbiA9IHRpbWVzdGFtcHNVcy5zaXplKCk7Ci0gICAgaWYgKG4gIT0gaGFuZGxlcy5zaXplKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiB0aW1lc3RhbXBzVXMoJXp1KSBhbmQgaGFuZGxlcyglenUpIHNpemUgbWlzbWF0Y2ghIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcHNVcy5zaXplKCksIGhhbmRsZXMuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIGludCBiYXRjaFNpemUgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMgPSB0aW1lc3RhbXBzVXNbaV07Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gaGFuZGxlc1tpXTsKLQotICAgICAgICBBTE9HVigiJXM6IHRpbWVzdGFtcCAlbGxkIHVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKXRpbWVzdGFtcFVzKTsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSBjb250aW51ZTsKLQotICAgICAgICBpZiAoc2hvdWxkU2tpcEZyYW1lTG9ja2VkKHRpbWVzdGFtcFVzKSkgewotICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChtTWVtb3J5QmFzZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlCYXNlQXZhaWxhYmxlQ29uZC53YWl0UmVsYXRpdmUobUxvY2ssIGtNZW1vcnlCYXNlQXZhaWxhYmxlVGltZW91dE5zKSA9PQotICAgICAgICAgICAgICAgICAgICBUSU1FRF9PVVQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiV2FpdGluZyBvbiBhbiBhdmFpbGFibGUgbWVtb3J5IGJhc2UgdGltZWQgb3V0LiBEcm9wcGluZyBhIHJlY29yZGluZyBmcmFtZS4iKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICArK2JhdGNoU2l6ZTsKLSAgICAgICAgKyttTnVtRnJhbWVzUmVjZWl2ZWQ7Ci0gICAgICAgIHNwPElNZW1vcnk+IGRhdGEgPSAqbU1lbW9yeUJhc2VzLmJlZ2luKCk7Ci0gICAgICAgIG1NZW1vcnlCYXNlcy5lcmFzZShtTWVtb3J5QmFzZXMuYmVnaW4oKSk7Ci0KLSAgICAgICAgLy8gV3JhcCBuYXRpdmUgaGFuZGxlIGluIHNwPElNZW1vcnk+IHNvIGl0IGNhbiBiZSBwdXNoZWQgdG8gbUZyYW1lc1JlY2VpdmVkLgotICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhICptZXRhZGF0YSA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YS0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICBtZXRhZGF0YS0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLQotICAgICAgICBtRnJhbWVzUmVjZWl2ZWQucHVzaF9iYWNrKGRhdGEpOwotICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKLSAgICAgICAgbUZyYW1lVGltZXMucHVzaF9iYWNrKHRpbWVVcyk7Ci0gICAgICAgIEFMT0dWKCJpbml0aWFsIGRlbGF5OiAlIiBQUklkNjQgIiwgY3VycmVudCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsIG1TdGFydFRpbWVVcywgdGltZVVzKTsKLQotICAgIH0KLSAgICBpZiAoYmF0Y2hTaXplID4gMCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJhdGNoTG9jayk7Ci0gICAgICAgIG1JbmZsaWdodEJhdGNoU2l6ZXMucHVzaF9iYWNrKGJhdGNoU2l6ZSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLX0KLQogQ2FtZXJhU291cmNlOjpCdWZmZXJRdWV1ZUxpc3RlbmVyOjpCdWZmZXJRdWV1ZUxpc3RlbmVyKGNvbnN0IHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4mIGNvbnN1bWVyLAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBjYW1lcmFTb3VyY2UpIHsKICAgICBtQ29uc3VtZXIgPSBjb25zdW1lcjsKQEAgLTEzOTEsNiArMTA0Niw3IEBACiAgICAgLy8gRmluZCBhIGF2YWlsYWJsZSBtZW1vcnkgc2xvdCB0byBzdG9yZSB0aGUgYnVmZmVyIGFzIFZpZGVvTmF0aXZlTWV0YWRhdGEuCiAgICAgc3A8SU1lbW9yeT4gZGF0YSA9ICptTWVtb3J5QmFzZXMuYmVnaW4oKTsKICAgICBtTWVtb3J5QmFzZXMuZXJhc2UobU1lbW9yeUJhc2VzLmJlZ2luKCkpOworICAgIG1CdWZmZXJEYXRhU3BhY2UgPSBidWZmZXIubURhdGFTcGFjZTsKIAogICAgIHNzaXplX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwpAQCAtMTQxNyw0MSArMTA3Myw3IEBACiBNZXRhZGF0YUJ1ZmZlclR5cGUgQ2FtZXJhU291cmNlOjptZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKCkgY29uc3QgewogICAgIEFMT0dWKCJtZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzIik7CiAKLSAgICAvLyBPdXRwdXQgYnVmZmVycyB3aWxsIGNvbnRhaW4gbWV0YWRhdGEgaWYgY2FtZXJhIHNlbmRzIHVzIGJ1ZmZlciBpbiBtZXRhZGF0YSBtb2RlIG9yIHZpYQotICAgIC8vIGJ1ZmZlciBxdWV1ZS4KLSAgICBzd2l0Y2ggKG1WaWRlb0J1ZmZlck1vZGUpIHsKLSAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYTo6VklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19NRVRBREFUQToKLSAgICAgICAgICAgIHJldHVybiBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOwotICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhOjpWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUU6Ci0gICAgICAgICAgICByZXR1cm4ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKLSAgICB9Ci19Ci0KLUNhbWVyYVNvdXJjZTo6UHJveHlMaXN0ZW5lcjo6UHJveHlMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBzb3VyY2UpIHsKLSAgICBtU291cmNlID0gc291cmNlOwotfQotCi12b2lkIENhbWVyYVNvdXJjZTo6UHJveHlMaXN0ZW5lcjo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikgewotICAgIG1Tb3VyY2UtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAgLyAxMDAwLCBtc2dUeXBlLCBkYXRhUHRyKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2U6OlByb3h5TGlzdGVuZXI6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7Ci0gICAgbVNvdXJjZS0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAgLyAxMDAwLCBoYW5kbGUpOwotfQotCi12b2lkIENhbWVyYVNvdXJjZTo6UHJveHlMaXN0ZW5lcjo6cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgdGltZXN0YW1wc1VzLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiYgaGFuZGxlcykgewotICAgIGludCBuID0gdGltZXN0YW1wc1VzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3Rvcjxuc2Vjc190PiBtb2RpZmllZFRpbWVzdGFtcHMobik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgbW9kaWZpZWRUaW1lc3RhbXBzW2ldID0gdGltZXN0YW1wc1VzW2ldIC8gMTAwMDsKLSAgICB9Ci0gICAgbVNvdXJjZS0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKG1vZGlmaWVkVGltZXN0YW1wcywgaGFuZGxlcyk7CisgICAgcmV0dXJuIGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCmluZGV4IGUwYTZlYjMuLjUwYTUxMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcApAQCAtNDUsMTUgKzQ1LDEzIEBACiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzLAotICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykgeworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuRnJhbWVDYXB0dXJlVXMpIHsKIAogICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAqc291cmNlID0gbmV3CiAgICAgICAgICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgY2xpZW50TmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgdmlkZW9TaXplLCB2aWRlb0ZyYW1lUmF0ZSwgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzLAotICAgICAgICAgICAgICAgIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CisgICAgICAgICAgICAgICAgdGltZUJldHdlZW5GcmFtZUNhcHR1cmVVcyk7CiAKICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKQEAgLTc0LDExICs3Miw5IEBACiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzLAotICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycykKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlbkZyYW1lQ2FwdHVyZVVzKQogICAgICAgOiBDYW1lcmFTb3VyY2UoY2FtZXJhLCBwcm94eSwgY2FtZXJhSWQsIGNsaWVudE5hbWUsIGNsaWVudFVpZCwgY2xpZW50UGlkLAotICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgdmlkZW9GcmFtZVJhdGUsIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKSwKKyAgICAgICAgICAgICAgICB2aWRlb1NpemUsIHZpZGVvRnJhbWVSYXRlLCBzdXJmYWNlKSwKICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZVZpZGVvRnJhbWVzVXMoMUU2L3ZpZGVvRnJhbWVSYXRlKSwKICAgICAgIG1MYXN0VGltZUxhcHNlRnJhbWVSZWFsVGltZXN0YW1wVXMoMCksCiAgICAgICBtU2tpcEN1cnJlbnRGcmFtZShmYWxzZSkgewpAQCAtMTczLDEyICsxNjksNiBAQAogICAgIEFMT0dWKCJzaWduYWxCdWZmZXJSZXR1cm5lZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUXVpY2tTdG9wTG9jayk7CiAgICAgaWYgKG1RdWlja1N0b3AgJiYgKGJ1ZmZlciA9PSBtTGFzdFJlYWRCdWZmZXJDb3B5KSkgewotICAgICAgICBpZiAobWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gKAotICAgICAgICAgICAgICAgIChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikobUxhc3RSZWFkQnVmZmVyQ29weS0+ZGF0YSgpKSktPnBIYW5kbGU7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICB9CiAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoTlVMTCk7CiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5ID0gTlVMTDsKQEAgLTE5MSw4ICsxODEsNyBAQAogdm9pZCBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoCiAgICAgICAgIGNvbnN0IE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyLAogICAgICAgICBpbnQ2NF90IGZyYW1lVGltZSwKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqbmV3QnVmZmVyLAotICAgICAgICBpbnQzMl90IHZpZGVvQnVmZmVyTW9kZSkgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipuZXdCdWZmZXIpIHsKIAogICAgIEFMT0dWKCJjcmVhdGVNZWRpYUJ1ZmZlckNvcHkiKTsKICAgICBzaXplX3Qgc291cmNlU2l6ZSA9IHNvdXJjZUJ1ZmZlci5zaXplKCk7CkBAIC0yMDMsMTkgKzE5MiwxMyBAQAogCiAgICAgKCpuZXdCdWZmZXIpLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgZnJhbWVUaW1lKTsKIAotICAgIGlmICh2aWRlb0J1ZmZlck1vZGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAoKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEqKSgoKm5ld0J1ZmZlciktPmRhdGEoKSkpLT5wSGFuZGxlID0KLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvbmUoCi0gICAgICAgICAgICAgICAgKChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoc291cmNlQnVmZmVyLmRhdGEoKSkpLT5wSGFuZGxlKTsKLSAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpmaWxsTGFzdFJlYWRCdWZmZXJDb3B5KE1lZGlhQnVmZmVyQmFzZSYgc291cmNlQnVmZmVyKSB7CiAgICAgQUxPR1YoImZpbGxMYXN0UmVhZEJ1ZmZlckNvcHkiKTsKICAgICBpbnQ2NF90IGZyYW1lVGltZTsKICAgICBDSEVDSyhzb3VyY2VCdWZmZXIubWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmZnJhbWVUaW1lKSk7Ci0gICAgY3JlYXRlTWVkaWFCdWZmZXJDb3B5KHNvdXJjZUJ1ZmZlciwgZnJhbWVUaW1lLCAmbUxhc3RSZWFkQnVmZmVyQ29weSwKLSAgICAgICAgbWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVycygpKTsKKyAgICBjcmVhdGVNZWRpYUJ1ZmZlckNvcHkoc291cmNlQnVmZmVyLCBmcmFtZVRpbWUsICZtTGFzdFJlYWRCdWZmZXJDb3B5KTsKICAgICBtTGFzdFJlYWRCdWZmZXJDb3B5LT5hZGRfcmVmKCk7CiAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+c2V0T2JzZXJ2ZXIodGhpcyk7CiB9CkBAIC0yNDAsMTkgKzIyMyw2IEBACiAgICAgfQogfQogCi1zcDxJTWVtb3J5PiBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmNyZWF0ZUlNZW1vcnlDb3B5KAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmc291cmNlX2RhdGEpIHsKLQotICAgIEFMT0dWKCJjcmVhdGVJTWVtb3J5Q29weSIpOwotICAgIHNpemVfdCBzb3VyY2Vfc2l6ZSA9IHNvdXJjZV9kYXRhLT5zaXplKCk7Ci0gICAgdm9pZCogc291cmNlX3BvaW50ZXIgPSBzb3VyY2VfZGF0YS0+dW5zZWN1cmVQb2ludGVyKCk7Ci0KLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbmV3TWVtb3J5SGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShzb3VyY2Vfc2l6ZSk7Ci0gICAgc3A8TWVtb3J5QmFzZT4gbmV3TWVtb3J5ID0gbmV3IE1lbW9yeUJhc2UobmV3TWVtb3J5SGVhcCwgMCwgc291cmNlX3NpemUpOwotICAgIG1lbWNweShuZXdNZW1vcnktPnVuc2VjdXJlUG9pbnRlcigpLCBzb3VyY2VfcG9pbnRlciwgc291cmNlX3NpemUpOwotICAgIHJldHVybiBuZXdNZW1vcnk7Ci19Ci0KIGJvb2wgQ2FtZXJhU291cmNlVGltZUxhcHNlOjpza2lwQ3VycmVudEZyYW1lKGludDY0X3QgLyogdGltZXN0YW1wVXMgKi8pIHsKICAgICBBTE9HVigic2tpcEN1cnJlbnRGcmFtZSIpOwogICAgIGlmIChtU2tpcEN1cnJlbnRGcmFtZSkgewpAQCAtMzE4LDMxICsyODgsNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLCBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXAiKTsKLSAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgmdGltZXN0YW1wVXMpOwotICAgIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcFVzLCBtc2dUeXBlLCBkYXRhKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSB7Ci0gICAgQUxPR1YoInJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAiKTsKLSAgICBtU2tpcEN1cnJlbnRGcmFtZSA9IHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgmdGltZXN0YW1wVXMpOwotICAgIENhbWVyYVNvdXJjZTo6cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXBVcywgaGFuZGxlKTsKLX0KLQotdm9pZCBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIHRpbWVzdGFtcHNVcywKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpIHsKLSAgICBBTE9HVigicmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoIik7Ci0gICAgaW50IG4gPSB0aW1lc3RhbXBzVXMuc2l6ZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIC8vIERvbid0IGRvIGJhdGNoaW5nIGZvciBDYW1lcmFTb3VyY2VUaW1lTGFwc2UgZm9yIG5vdwotICAgICAgICByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKHRpbWVzdGFtcHNVc1tpXSwgaGFuZGxlc1tpXSk7Ci0gICAgfQotfQotCiB2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6cHJvY2Vzc0J1ZmZlclF1ZXVlRnJhbWUoQnVmZmVySXRlbSYgYnVmZmVyKSB7CiAgICAgQUxPR1YoInByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lIik7CiAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyA9IGJ1ZmZlci5tVGltZXN0YW1wIC8gMTAwMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCmluZGV4IDViNzI0YWEuLmI5ZmIwNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcApAQCAtNDAsNCArNDAsMzEgQEAKICAgICBidWYtPnNpemUgPSBzaXplOwogfQogCitzdGF0dXNfdCBDb2RlY0Jhc2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgaWYgKG5hbWVzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbmFtZXMtPmNsZWFyKCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDb2RlY0Jhc2U6OmRlc2NyaWJlUGFyYW1ldGVyKGNvbnN0IHN0ZDo6c3RyaW5nICYsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqKSB7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDb2RlY0Jhc2U6OnN1YnNjcmliZVRvUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSB7CisgICAgaWYgKG5hbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IENvZGVjQmFzZTo6dW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKSB7CisgICAgaWYgKG5hbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVDYXB0dXJlUHJvY2Vzc29yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lQ2FwdHVyZVByb2Nlc3Nvci5jcHAKaW5kZXggOTZjMTE5NS4uOGNkN2Y4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVDYXB0dXJlUHJvY2Vzc29yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZUNhcHR1cmVQcm9jZXNzb3IuY3BwCkBAIC0xNjQsMTQgKzE2NCwxNSBAQAogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiZHJhd0xheWVycyByZXR1cm5lZCBlcnIgJWQiLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IGZlbmNlLT53YWl0KDUwMCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJ3YWl0IGZvciBmZW5jZSByZXR1cm5lZCBlcnIgJWQiLCBlcnIpOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0KICAgICB9Ci0KLSAgICBlcnIgPSBmZW5jZS0+d2FpdCg1MDApOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coIndhaXQgZm9yIGZlbmNlIHJldHVybmVkIGVyciAlZCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBPSzsKKyAgICBtUkUtPmNsZWFudXBQb3N0UmVuZGVyKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDbGVhbnVwTW9kZTo6Q0xFQU5fQUxMKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIEZyYW1lQ2FwdHVyZVByb2Nlc3Nvcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IDczNGY1YmIuLmVmZDQwNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAiaW5jbHVkZS9GcmFtZURlY29kZXIuaCIKICNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lQ2FwdHVyZUxheWVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC00Myw3ICs0NCw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtCdWZmZXJUaW1lT3V0VXMgPSAxMDAwMExMOyAvLyAxMCBtc2VjCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXRyeUNvdW50ID0gNTA7IC8vIG11c3QgYmUgPjAKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSAxMDA7IC8vIG11c3QgYmUgPjAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtEZWZhdWx0U2FtcGxlRHVyYXRpb25VcyA9IDMzMzMzTEw7IC8vIDMzbXMKIAogc3A8SU1lbW9yeT4gYWxsb2NWaWRlb0ZyYW1lKGNvbnN0IHNwPE1ldGFEYXRhPiYgdHJhY2tNZXRhLApAQCAtNjYsNiArNjcsMTIgQEAKICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNBUldpZHRoLCAmc2FyV2lkdGgpCiAgICAgICAgICAgICAmJiB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U0FSSGVpZ2h0LCAmc2FySGVpZ2h0KQogICAgICAgICAgICAgJiYgc2FySGVpZ2h0ICE9IDApIHsKKyAgICAgICAgaW50MzJfdCBtdWx0VmFsOworICAgICAgICBpZiAod2lkdGggPCAwIHx8IHNhcldpZHRoIDwgMCB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyh3aWR0aCwgc2FyV2lkdGgsICZtdWx0VmFsKSkgeworICAgICAgICAgICAgQUxPR0UoImRpc3BsYXlXaWR0aCBvdmVyZmxvdyAlZHglZCIsIHdpZHRoLCBzYXJXaWR0aCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBkaXNwbGF5V2lkdGggPSAod2lkdGggKiBzYXJXaWR0aCkgLyBzYXJIZWlnaHQ7CiAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSBoZWlnaHQ7CiAgICAgfSBlbHNlIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAmZGlzcGxheVdpZHRoKQpAQCAtODYsNiArOTMsMTYgQEAKICAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7CiAgICAgfQogCisgICAgaWYgKCFtZXRhT25seSkgeworICAgICAgICBpbnQzMl90IG11bHRWYWw7CisgICAgICAgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCB8fCBkc3RCcHAgPCAwIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGRzdEJwcCwgd2lkdGgsICZtdWx0VmFsKSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtdWx0VmFsLCBoZWlnaHQsICZtdWx0VmFsKSkgeworICAgICAgICAgICAgQUxPR0UoIkZyYW1lIHNpemUgb3ZlcmZsb3cgJWR4JWQgYnBwICVkIiwgd2lkdGgsIGhlaWdodCwgZHN0QnBwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgVmlkZW9GcmFtZSBmcmFtZSh3aWR0aCwgaGVpZ2h0LCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQsCiAgICAgICAgICAgICB0aWxlV2lkdGgsIHRpbGVIZWlnaHQsIHJvdGF0aW9uQW5nbGUsIGRzdEJwcCwgIW1ldGFPbmx5LCBpY2NTaXplKTsKIApAQCAtOTYsNyArMTEzLDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gbmV3IE1lbW9yeUJhc2UoaGVhcCwgMCwgc2l6ZSk7Ci0gICAgaWYgKGZyYW1lTWVtID09IE5VTEwpIHsKKyAgICBpZiAoZnJhbWVNZW0gPT0gTlVMTCB8fCBmcmFtZU1lbS0+dW5zZWN1cmVQb2ludGVyKCkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibm90IGVub3VnaCBtZW1vcnkgZm9yIFZpZGVvRnJhbWUgc2l6ZT0lenUiLCBzaXplKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTIwLDE1ICsxMzcsMjMgQEAKICAgICAgICAgICAgIGZhbHNlIC8qYWxsb2NSb3RhdGVkKi8sIHRydWUgLyptZXRhT25seSovKTsKIH0KIAorYm9vbCBpc0F2aWYoY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEpIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHJldHVybiB0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICYmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGKSk7Cit9CisKIGJvb2wgZmluZFRodW1ibmFpbEluZm8oCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmdHJhY2tNZXRhLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0LAogICAgICAgICB1aW50MzJfdCAqdHlwZSA9IE5VTEwsIGNvbnN0IHZvaWQgKipkYXRhID0gTlVMTCwgc2l6ZV90ICpzaXplID0gTlVMTCkgewogICAgIHVpbnQzMl90IGR1bW15VHlwZTsKICAgICBjb25zdCB2b2lkICpkdW1teURhdGE7CiAgICAgc2l6ZV90IGR1bW15U2l6ZTsKKyAgICBpbnQgY29kZWNDb25maWdLZXkgPSBpc0F2aWYodHJhY2tNZXRhKSA/IGtLZXlUaHVtYm5haWxBVjFDIDoga0tleVRodW1ibmFpbEhWQ0M7CiAgICAgcmV0dXJuIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxXaWR0aCwgd2lkdGgpCiAgICAgICAgICYmIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsIGhlaWdodCkKLSAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kRGF0YShrS2V5VGh1bWJuYWlsSFZDQywKKyAgICAgICAgJiYgdHJhY2tNZXRhLT5maW5kRGF0YShjb2RlY0NvbmZpZ0tleSwKICAgICAgICAgICAgICAgICB0eXBlID86ICZkdW1teVR5cGUsIGRhdGEgPzogJmR1bW15RGF0YSwgc2l6ZSA/OiAmZHVtbXlTaXplKTsKIH0KIApAQCAtNDU2LDcgKzQ4MSw4IEBACiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IEZyYW1lRGVjb2Rlcihjb21wb25lbnROYW1lLCB0cmFja01ldGEsIHNvdXJjZSksCiAgICAgICBtRnJhbWUoTlVMTCksCi0gICAgICBtSXNBdmNPckhldmMoZmFsc2UpLAorICAgICAgbUlzQXZjKGZhbHNlKSwKKyAgICAgIG1Jc0hldmMoZmFsc2UpLAogICAgICAgbVNlZWtNb2RlKE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DKSwKICAgICAgIG1UYXJnZXRUaW1lVXMoLTFMTCksCiAgICAgICBtRGVmYXVsdFNhbXBsZUR1cmF0aW9uVXMoMCkgewpAQCAtNDc5LDggKzUwNSw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIG1Jc0F2Y09ySGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykKLSAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIG1Jc0F2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgbUlzSGV2YyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOwogCiAgICAgaWYgKGZyYW1lVGltZVVzIDwgMCkgewogICAgICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWUgPSAtMWxsOwpAQCAtNTQzLDggKzU2OSwxMCBAQAogICAgICAgICBBTE9HVigiU2Vla2luZyBjbG9zZXN0OiB0YXJnZXRUaW1lVXM9JWxsZCIsIChsb25nIGxvbmcpbVRhcmdldFRpbWVVcyk7CiAgICAgfQogCi0gICAgaWYgKG1Jc0F2Y09ySGV2YyAmJiAhaXNTZWVraW5nQ2xvc2VzdAotICAgICAgICAgICAgJiYgSXNJRFIoY29kZWNCdWZmZXItPmRhdGEoKSwgY29kZWNCdWZmZXItPnNpemUoKSkpIHsKKyAgICBpZiAoIWlzU2Vla2luZ0Nsb3Nlc3QKKyAgICAgICAgICAgICYmICgobUlzQXZjICYmIElzSURSKGNvZGVjQnVmZmVyLT5kYXRhKCksIGNvZGVjQnVmZmVyLT5zaXplKCkpKQorICAgICAgICAgICAgfHwgKG1Jc0hldmMgJiYgSXNJRFIoCisgICAgICAgICAgICBjb2RlY0J1ZmZlci0+ZGF0YSgpLCBjb2RlY0J1ZmZlci0+c2l6ZSgpKSkpKSB7CiAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBkZWNvZGUgb25lIElEUiBmcmFtZSwgdW5sZXNzIHdlJ3JlIHNlZWtpbmcgd2l0aCBDTE9TRVNUCiAgICAgICAgIC8vIG9wdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFjdHVhbGx5IGRlY29kZSB0byB0YXJnZXRUaW1lVXMuCiAgICAgICAgICpmbGFncyB8PSBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CkBAIC02MTYsNiArNjQ0LDEwIEBACiAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICBkc3RCcHAoKSwKICAgICAgICAgICAgICAgICBtQ2FwdHVyZUxheWVyICE9IG51bGxwdHIgLyphbGxvY1JvdGF0ZWQqLyk7CisgICAgICAgIGlmIChmcmFtZU1lbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKICAgICAgICAgbUZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT51bnNlY3VyZVBvaW50ZXIoKSk7CiAKICAgICAgICAgc2V0RnJhbWUoZnJhbWVNZW0pOwpAQCAtNzEyLDcgKzc0NCw3IEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1JbWFnZURlY29kZXI6OkltYWdlRGVjb2RlcigKK01lZGlhSW1hZ2VEZWNvZGVyOjpNZWRpYUltYWdlRGVjb2RlcigKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSwKICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+ICZ0cmFja01ldGEsCiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSkKQEAgLTcyOCw3ICs3NjAsNyBAQAogICAgICAgbVRhcmdldFRpbGVzKDApIHsKIH0KIAotc3A8QU1lc3NhZ2U+IEltYWdlRGVjb2Rlcjo6b25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKK3NwPEFNZXNzYWdlPiBNZWRpYUltYWdlRGVjb2Rlcjo6b25HZXRGb3JtYXRBbmRTZWVrT3B0aW9ucygKICAgICAgICAgaW50NjRfdCBmcmFtZVRpbWVVcywgaW50IC8qc2Vla01vZGUqLywKICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zLCBzcDxTdXJmYWNlPiAqIC8qd2luZG93Ki8pIHsKICAgICBzcDxNZXRhRGF0YT4gb3ZlcnJpZGVNZXRhOwpAQCAtNzQ4LDcgKzc4MCwxMCBAQAogICAgICAgICBvdmVycmlkZU1ldGEtPnJlbW92ZShrS2V5RGlzcGxheUhlaWdodCk7CiAgICAgICAgIG92ZXJyaWRlTWV0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBtV2lkdGgpOwogICAgICAgICBvdmVycmlkZU1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIG1IZWlnaHQpOwotICAgICAgICBvdmVycmlkZU1ldGEtPnNldERhdGEoa0tleUhWQ0MsIHR5cGUsIGRhdGEsIHNpemUpOworICAgICAgICAvLyBUaGUgQVYxIGNvZGVjIGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBwYXNzZWQgdmlhIENTRDAgdG8gdGhlIEFWMQorICAgICAgICAvLyBkZWNvZGVyLgorICAgICAgICBjb25zdCBpbnQgY29kZWNDb25maWdLZXkgPSBpc0F2aWYodHJhY2tNZXRhKCkpID8ga0tleU9wYXF1ZUNTRDAgOiBrS2V5SFZDQzsKKyAgICAgICAgb3ZlcnJpZGVNZXRhLT5zZXREYXRhKGNvZGVjQ29uZmlnS2V5LCB0eXBlLCBkYXRhLCBzaXplKTsKICAgICAgICAgb3B0aW9ucy0+c2V0U2Vla1RvKC0xKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyh0cmFja01ldGEoKS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJm1XaWR0aCkpOwpAQCAtODAxLDcgKzgzNiw3IEBACiAgICAgcmV0dXJuIHZpZGVvRm9ybWF0OwogfQogCi1zdGF0dXNfdCBJbWFnZURlY29kZXI6Om9uRXh0cmFjdFJlY3QoRnJhbWVSZWN0ICpyZWN0KSB7CitzdGF0dXNfdCBNZWRpYUltYWdlRGVjb2Rlcjo6b25FeHRyYWN0UmVjdChGcmFtZVJlY3QgKnJlY3QpIHsKICAgICAvLyBUT0RPOgogICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgZm9yIHZlcmlmeWluZyB3aGV0aGVyIHdlIGNhbiBkZWNvZGUgdGhlIHJlY3QsCiAgICAgLy8gYW5kIGlmIHNvLCBzZXQgdXAgdGhlIGludGVybmFsIHZhcmlhYmxlcyBmb3IgZGVjb2RpbmcuCkBAIC04NDAsNyArODc1LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEltYWdlRGVjb2Rlcjo6b25PdXRwdXRSZWNlaXZlZCgKK3N0YXR1c190IE1lZGlhSW1hZ2VEZWNvZGVyOjpvbk91dHB1dFJlY2VpdmVkKAogICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmdmlkZW9GcmFtZUJ1ZmZlciwKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsIGludDY0X3QgLyp0aW1lVXMqLywgYm9vbCAqZG9uZSkgewogICAgIGlmIChvdXRwdXRGb3JtYXQgPT0gTlVMTCkgewpAQCAtODU1LDYgKzg5MCwxMSBAQAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKICAgICAgICAgICAgICAgICB0cmFja01ldGEoKSwgbVdpZHRoLCBtSGVpZ2h0LCBtVGlsZVdpZHRoLCBtVGlsZUhlaWdodCwgZHN0QnBwKCkpOworCisgICAgICAgIGlmIChmcmFtZU1lbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKICAgICAgICAgbUZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT51bnNlY3VyZVBvaW50ZXIoKSk7CiAKICAgICAgICAgc2V0RnJhbWUoZnJhbWVNZW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKaW5kZXggYjM0NzQ1My4uNWY5YzIwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCkBAIC0zMCw5ICszMCwxNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAorI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgdWludDhfdCBrSGV2Y05hbFVuaXRUeXBlc1s1XSA9IHsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtIZXZjTmFsVW5pdFR5cGVzWzhdID0geworICAgIGtIZXZjTmFsVW5pdFR5cGVDb2RlZFNsaWNlSWRyLAorICAgIGtIZXZjTmFsVW5pdFR5cGVDb2RlZFNsaWNlSWRyTm9MUCwKKyAgICBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUNyYSwKICAgICBrSGV2Y05hbFVuaXRUeXBlVnBzLAogICAgIGtIZXZjTmFsVW5pdFR5cGVTcHMsCiAgICAga0hldmNOYWxVbml0VHlwZVBwcywKQEAgLTM3NSw4ICszODAsNTYgQEAKICAgICByZXR1cm4gcmVhZGVyLm92ZXJSZWFkKCkgPyBFUlJPUl9NQUxGT1JNRUQgOiBPSzsKIH0KIAordm9pZCBIZXZjUGFyYW1ldGVyU2V0czo6RmluZEhFVkNEaW1lbnNpb25zKGNvbnN0IHNwPEFCdWZmZXI+ICZTcHNCdWZmZXIsIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpCit7CisgICAgQUxPR0QoIkZpbmRIRVZDRGltZW5zaW9ucyIpOworICAgIC8vIFNlZSBSZWMuIElUVS1UIEguMjY1IHYzICgwNC8yMDE1KSBDaGFwdGVyIDcuMy4yLjIgZm9yIHJlZmVyZW5jZQorICAgIEFCaXRSZWFkZXIgcmVhZGVyKFNwc0J1ZmZlci0+ZGF0YSgpICsgMSwgU3BzQnVmZmVyLT5zaXplKCkgLSAxKTsKKyAgICAvLyBTa2lwIHNwc192aWRlb19wYXJhbWV0ZXJfc2V0X2lkCisgICAgcmVhZGVyLnNraXBCaXRzKDQpOworICAgIHVpbnQ4X3QgbWF4U3ViTGF5ZXJzTWludXMxID0gcmVhZGVyLmdldEJpdHNXaXRoRmFsbGJhY2soMywgMCk7CisgICAgLy8gU2tpcCBzcHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnOworICAgIHJlYWRlci5za2lwQml0cygxKTsKKyAgICAvLyBTa2lwIGdlbmVyYWwgcHJvZmlsZQorICAgIHJlYWRlci5za2lwQml0cyg5Nik7CisgICAgaWYgKG1heFN1YkxheWVyc01pbnVzMSA+IDApIHsKKyAgICAgICAgYm9vbCBzdWJMYXllclByb2ZpbGVQcmVzZW50RmxhZ1s4XTsKKyAgICAgICAgYm9vbCBzdWJMYXllckxldmVsUHJlc2VudEZsYWdbOF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U3ViTGF5ZXJzTWludXMxOyArK2kpIHsKKyAgICAgICAgICAgIHN1YkxheWVyUHJvZmlsZVByZXNlbnRGbGFnW2ldID0gcmVhZGVyLmdldEJpdHNXaXRoRmFsbGJhY2soMSwgMCk7CisgICAgICAgICAgICBzdWJMYXllckxldmVsUHJlc2VudEZsYWdbaV0gPSByZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygxLCAwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIHJlc2VydmVkCisgICAgICAgIHJlYWRlci5za2lwQml0cygyICogKDggLSBtYXhTdWJMYXllcnNNaW51czEpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTdWJMYXllcnNNaW51czE7ICsraSkgeworICAgICAgICAgICAgaWYgKHN1YkxheWVyUHJvZmlsZVByZXNlbnRGbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBwcm9maWxlCisgICAgICAgICAgICAgICAgcmVhZGVyLnNraXBCaXRzKDg4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdWJMYXllckxldmVsUHJlc2VudEZsYWdbaV0pIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIHN1Yl9sYXllcl9sZXZlbF9pZGNbaV0KKyAgICAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gU2tpcCBzcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQKKyAgICBza2lwVUUoJnJlYWRlcik7CisgICAgdWludDhfdCBjaHJvbWFGb3JtYXRJZGMgPSBwYXJzZVVFV2l0aEZhbGxiYWNrKCZyZWFkZXIsIDApOworICAgIGlmIChjaHJvbWFGb3JtYXRJZGMgPT0gMykgeworICAgICAgICAvLyBTa2lwIHNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnCisgICAgICAgIHJlYWRlci5za2lwQml0cygxKTsKKyAgICB9CisgICAgc2tpcFVFKCZyZWFkZXIpOworICAgIHNraXBVRSgmcmVhZGVyKTsKKworICAgIC8vIHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMKKyAgICAqd2lkdGggPSBwYXJzZVVFV2l0aEZhbGxiYWNrKCZyZWFkZXIsIDApOworICAgIC8vIHBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzCisgICAgKmhlaWdodCA9IHBhcnNlVUVXaXRoRmFsbGJhY2soJnJlYWRlciwgMCk7Cit9CisKIHN0YXR1c190IEhldmNQYXJhbWV0ZXJTZXRzOjpwYXJzZVBwcygKLSAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSBfX3VudXNlZCwgc2l6ZV90IHNpemUgX191bnVzZWQpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSBVTlVTRURfUEFSQU0sIHNpemVfdCBzaXplIFVOVVNFRF9QQVJBTSkgewogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDg5LDQgKzU0MiwyNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorYm9vbCBIZXZjUGFyYW1ldGVyU2V0czo6SXNIZXZjSURSKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgYm9vbCBmb3VuZElEUiA9IGZhbHNlOworICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OworICAgIHNpemVfdCBuYWxTaXplOworICAgIHdoaWxlICghZm91bmRJRFIgJiYgZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZzaXplLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSA9PSBPSykgeworICAgICAgICBpZiAobmFsU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgemVyby1sZW5ndGggSEVWQyBOQUwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgbmFsVHlwZSA9IChuYWxTdGFydFswXSAmIDB4N0UpID4+IDE7CisgICAgICAgIHN3aXRjaChuYWxUeXBlKSB7CisgICAgICAgICAgICBjYXNlIGtIZXZjTmFsVW5pdFR5cGVDb2RlZFNsaWNlSWRyOgorICAgICAgICAgICAgY2FzZSBrSGV2Y05hbFVuaXRUeXBlQ29kZWRTbGljZUlkck5vTFA6CisgICAgICAgICAgICBjYXNlIGtIZXZjTmFsVW5pdFR5cGVDb2RlZFNsaWNlQ3JhOgorICAgICAgICAgICAgICAgIGZvdW5kSURSID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmb3VuZElEUjsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggOGY3ZDRiZi4uN2M3ZmNhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtNTE5LDEyICs1MTksMTMgQEAKICAgICBtU2VuZE5vdGlmeSA9IGZhbHNlOwogICAgIG1Xcml0ZVNlZWtFcnIgPSBmYWxzZTsKICAgICBtRmFsbG9jYXRlRXJyID0gZmFsc2U7Ci0KICAgICAvLyBSZXNldCBmb2xsb3dpbmcgdmFyaWFibGVzIGZvciBhbGwgdGhlIHNlc3Npb25zIGFuZCB0aGV5IHdpbGwgYmUKICAgICAvLyBpbml0aWFsaXplZCBpbiBzdGFydChNZXRhRGF0YSAqcGFyYW0pLgogICAgIG1Jc1JlYWxUaW1lUmVjb3JkaW5nID0gdHJ1ZTsKKyAgICBtSXNCYWNrZ3JvdW5kTW9kZSA9IGZhbHNlOwogICAgIG1Vc2U0Qnl0ZU5hbExlbmd0aCA9IHRydWU7CiAgICAgbU9mZnNldCA9IDA7CisgICAgbU1heE9mZnNldEFwcGVuZCA9IDA7CiAgICAgbVByZUFsbG9jYXRlRmlsZUVuZE9mZnNldCA9IDA7CiAgICAgbU1kYXRPZmZzZXQgPSAwOwogICAgIG1NZGF0RW5kT2Zmc2V0ID0gMDsKQEAgLTU0Miw2ICs1NDMsNyBAQAogICAgIG1OdW1HcmlkcyA9IDA7CiAgICAgbU5leHRJdGVtSWQgPSBrSXRlbUlkQmFzZTsKICAgICBtSGFzUmVmcyA9IGZhbHNlOworICAgIG1SZXNldFN0YXR1cyA9IE9LOwogICAgIG1QcmVBbGxvY0ZpcnN0VGltZSA9IHRydWU7CiAgICAgbVByZXZBbGxUcmFja3NUb3RhbE1ldGFEYXRhU2l6ZUVzdGltYXRlID0gMDsKIApAQCAtNjYxLDYgKzY2MywxNCBAQAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gc291cmNlLT5nZXRGb3JtYXQoKTsKICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKIAorCisgICAgLy8gQmFja2dyb3VuZCBtb2RlIGZvciBtZWRpYSB0cmFuc2NvZGluZy4gSWYgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvIHRyYWNrIHNpZ25hbCB0aGlzIGlzIGluCisgICAgLy8gYmFja2dyb3VuZCBtb2RlLCB3ZSB3aWxsIHNldCBhbGwgdGhlIHRocmVhZHMgdG8gcnVuIGluIGJhY2tncm91bmQgcHJpb3JpdHkuCisgICAgaW50MzJfdCBpc0JhY2tncm91bmRNb2RlOworICAgIGlmIChtZXRhICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5QmFja2dyb3VuZE1vZGUsICZpc0JhY2tncm91bmRNb2RlKSkgeworICAgICAgICBtSXNCYWNrZ3JvdW5kTW9kZSB8PSBpc0JhY2tncm91bmRNb2RlOworICAgIH0KKwogICAgIGlmIChUcmFjazo6Z2V0Rm91ckNDRm9yTWltZShtaW1lKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBtaW1lICclcyciLCBtaW1lKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtOTkxLDYgKzEwMDEsMTkgQEAKICAgICAgICAgc2Vla09yUG9zdEVycm9yKG1GZCwgbUZyZWVCb3hPZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgICAgd3JpdGVJbnQzMihtSW5NZW1vcnlDYWNoZVNpemUpOwogICAgICAgICB3cml0ZSgiZnJlZSIsIDQpOworICAgICAgICBpZiAobUluTWVtb3J5Q2FjaGVTaXplID49IDgpIHsKKyAgICAgICAgICAgIG9mZjY0X3QgYnVmU2l6ZSA9IG1Jbk1lbW9yeUNhY2hlU2l6ZSAtIDg7CisgICAgICAgICAgICBjaGFyKiB6ZXJvQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbYnVmU2l6ZV07CisgICAgICAgICAgICBpZiAoemVyb0J1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0ZDo6ZmlsbF9uKHplcm9CdWZmZXIsIGJ1ZlNpemUsICcwJyk7CisgICAgICAgICAgICAgICAgd3JpdGVPclBvc3RFcnJvcihtRmQsIHplcm9CdWZmZXIsIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSB6ZXJvQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZnJlZWJveCBpbiBmaWxlIGlzbid0IGluaXRpYWxpemVkIHRvIDAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJmcmVlYm94IHNpemUgaXMgbGVzcyB0aGFuIDg6JSIgUFJJZDY0LCBtSW5NZW1vcnlDYWNoZVNpemUpOworICAgICAgICB9CiAgICAgICAgIG1NZGF0T2Zmc2V0ID0gbUZyZWVCb3hPZmZzZXQgKyBtSW5NZW1vcnlDYWNoZVNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbU1kYXRPZmZzZXQgPSBtT2Zmc2V0OwpAQCAtMTAyNyw2ICsxMDUwLDExIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c3RvcCgpIHsKKyAgICAvLyBJZiByZXNldCB3YXMgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlLgorICAgIHJldHVybiByZXNldCh0cnVlLCB0cnVlKTsKK30KKwogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnBhdXNlKCkgewogICAgIEFMT0dXKCJNUEVHNFdyaXRlcjogcGF1c2UgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTExMzEsMTEgKzExNTksMjQgQEAKICAgICBpZiAoIXRydW5jYXRlUHJlQWxsb2NhdGlvbigpKSB7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsgZXJyID0gRVJST1JfSU87IH0KICAgICB9CisKKyAgICAvLyBUT0RPKGIvMTc0NzcwODU2KSByZW1vdmUgdGhpcyBtZWFzdXJlbWVudCAoYW5kIHBlcmhhcHMgdGhlIGZzeW5jKQorICAgIG5zZWNzX3Qgc3luY19zdGFydGVkID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgaWYgKGZzeW5jKG1GZCkgIT0gMCkgewogICAgICAgICBBTE9HVygiKGlnbm9yZWQpZnN5bmMgZXJyOiVzKCVkKSIsIHN0ZDo6c3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiAgICAgICAgIC8vIERvbid0IGJ1YmJsZSB1cCBmc3luYyBlcnJvciwgYi8xNTcyOTE1MDUuCiAgICAgICAgIC8vIGlmIChlcnIgPT0gT0spIHsgZXJyID0gRVJST1JfSU87IH0KICAgICB9CisgICAgbnNlY3NfdCBzeW5jX2ZpbmlzaGVkID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CisgICAgbnNlY3NfdCBzeW5jX2VsYXBzZWRfbnMgPSBzeW5jX2ZpbmlzaGVkIC0gc3luY19zdGFydGVkOworICAgIGludDY0X3QgZmlsZXNpemUgPSAtMTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChmc3RhdChtRmQsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGZpbGVzaXplID0gc3RhdGJ1Zi5zdF9zaXplOworICAgIH0KKyAgICBBTE9HRCgiZmluYWwgZnN5bmMoKSB0YWtlcyAlIiBQUklkNjQgIiBtcywgZmlsZSBzaXplICUiIFBSSWQ2NCwKKyAgICAgICAgICBzeW5jX2VsYXBzZWRfbnMgLyAxMDAwMDAwLCAoaW50NjRfdCkgZmlsZXNpemUpOworCiAgICAgaWYgKGNsb3NlKG1GZCkgIT0gMCkgewogICAgICAgICBBTE9HRSgiY2xvc2UgZXJyOiVzKCVkKSIsIHN0ZDo6c3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsgZXJyID0gRVJST1JfSU87IH0KQEAgLTExNTksOCArMTIwMCwxMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXZvaWQgTVBFRzRXcml0ZXI6OmZpbmlzaEN1cnJlbnRTZXNzaW9uKCkgewotICAgIHJlc2V0KGZhbHNlIC8qIHN0b3BTb3VyY2UgKi8pOworc3RhdHVzX3QgTVBFRzRXcml0ZXI6OmZpbmlzaEN1cnJlbnRTZXNzaW9uKCkgeworICAgIEFMT0dWKCJmaW5pc2hDdXJyZW50U2Vzc2lvbiIpOworICAgIC8qIERvbid0IHdhaXQgaWYgcmVzZXQgaXMgaW4gcHJvZ3Jlc3MgYWxyZWFkeSwgdGhhdCBhdm9pZHMgZGVhZGxvY2sKKyAgICAgKiBhcyBmaW5pc2hDdXJyZW50U2Vzc2lvbigpIGlzIGNhbGxlZCBmcm9tIGNvbnRyb2wgbG9vcGVyIHRocmVhZC4KKyAgICAgKi8KKyAgICByZXR1cm4gcmVzZXQoZmFsc2UsIGZhbHNlKTsKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OnN3aXRjaEZkKCkgewpAQCAtMTE4MiwxMSArMTIyNywzMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldChib29sIHN0b3BTb3VyY2UpIHsKK3N0YXR1c190IE1QRUc0V3JpdGVyOjpyZXNldChib29sIHN0b3BTb3VyY2UsIGJvb2wgd2FpdEZvckFueVByZXZpb3VzQ2FsbFRvQ29tcGxldGUpIHsKICAgICBBTE9HRCgicmVzZXQoKSIpOwotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1SZXNldE11dGV4KTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG1SZXNldE11dGV4LCBzdGQ6OmRlZmVyX2xvY2spOworICAgIGlmICh3YWl0Rm9yQW55UHJldmlvdXNDYWxsVG9Db21wbGV0ZSkgeworICAgICAgICAvKiBzdG9wPT5yZXNldCBmcm9tIGNsaWVudCBuZWVkcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHJlc2V0IGNhbGwsIGhlbmNlIHdhaXQgaGVyZQorICAgICAgICAgKiBpZiBhIHJlc2V0IHdhcyBpbiBwcm9jZXNzIGFscmVhZHkuCisgICAgICAgICAqLworICAgICAgICBsay5sb2NrKCk7CisgICAgfSBlbHNlIGlmICghbGsudHJ5X2xvY2soKSkgeworICAgICAgICAvKiBJbnRlcm5hbCByZXNldCBmcm9tIGNvbnRyb2wgbG9vcGVyIHRocmVhZCBzaG91bGRuJ3Qgd2FpdCBmb3IgYW55IHJlc2V0IGluCisgICAgICAgICAqIHByb2Nlc3MgYWxyZWFkeS4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobVJlc2V0U3RhdHVzICE9IE9LKSB7CisgICAgICAgIC8qIERvbid0IGhhdmUgdG8gcHJvY2VlZCBpZiByZXNldCBoYXMgZmluaXNoZWQgd2l0aCBhbiBlcnJvciBiZWZvcmUuCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBubyBlcnJvciBiZWZvcmUsIHByb2NlZWRpbmcgcmVzZXQgd291bGQgYmUgaGFybWxlc3MsIGFzIHRoZQorICAgICAgICAgKiB0aGUgY2FsbCB3b3VsZCByZXR1cm4gZnJvbSB0aGUgbUluaXRDaGVjayBjb25kaXRpb24gYmVsb3cuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gbVJlc2V0U3RhdHVzOworICAgIH0KKwogICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgbVJlc2V0U3RhdHVzID0gT0s7CisgICAgICAgIHJldHVybiBtUmVzZXRTdGF0dXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFtV3JpdGVyVGhyZWFkU3RhcnRlZCB8fAogICAgICAgICAgICAgIW1TdGFydGVkKSB7CkBAIC0xMTk4LDcgKzEyNjQsOCBAQAogICAgICAgICAgICAgaWYgKHdyaXRlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldEVyciA9IHdyaXRlckVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXRFcnI7CisgICAgICAgICAgICBtUmVzZXRTdGF0dXMgPSByZXRFcnI7CisgICAgICAgICAgICByZXR1cm4gbVJlc2V0U3RhdHVzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjQ1LDcgKzEzMTIsOCBAQAogICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX01BTEZPUk1FRCkgewogICAgICAgICAvLyBJZ25vcmluZyByZWxlYXNlKCkgcmV0dXJuIHZhbHVlIGFzIHRoZXJlIHdhcyBhbiAiZXJyIiBhbHJlYWR5LgogICAgICAgICByZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIG1SZXNldFN0YXR1cyA9IGVycjsKKyAgICAgICAgcmV0dXJuIG1SZXNldFN0YXR1czsKICAgICB9CiAKICAgICAvLyBGaXggdXAgdGhlIHNpemUgb2YgdGhlICdtZGF0JyBjaHVuay4KQEAgLTEzMDMsNyArMTM3MSw4IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBlcnIgPSBlcnJSZWxlYXNlOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIG1SZXNldFN0YXR1cyA9IGVycjsKKyAgICByZXR1cm4gbVJlc2V0U3RhdHVzOwogfQogCiAvKgpAQCAtMTQ5NCw2ICsxNTYzLDI2IEBACiAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LAogICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0LCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgewogICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7CisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgQUxPR1YoImJ1ZmZlci0+cmFuZ2VfbGVuZ3RoOiVsbGQiLCAobG9uZyBsb25nKWJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgJm9mZnNldCkpIHsKKyAgICAgICAgQUxPR1YoIm9mZnNldDolbGxkLCBvbGRfb2Zmc2V0OiVsbGQiLCAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylvbGRfb2Zmc2V0KTsKKyAgICAgICAgaWYgKG9sZF9vZmZzZXQgPT0gb2Zmc2V0KSB7CisgICAgICAgICAgICBtT2Zmc2V0ICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigib2Zmc2V0IGFuZCBvbGRfb2Zmc2V0IGFyZSBub3QgZXF1YWwhIGRpZmY6JWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0IC0gb2xkX29mZnNldCk7CisgICAgICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0ICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgICAgIC8vIG1PZmZzZXQgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIG9mZnNldCAtIG9sZF9vZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgKmJ5dGVzV3JpdHRlbiA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIEFMT0dWKCJtT2Zmc2V0OiVsbGQsIG1NYXhPZmZzZXRBcHBlbmQ6JWxsZCwgYnl0ZXNXcml0dGVuOiVsbGQiLCAobG9uZyBsb25nKW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1NYXhPZmZzZXRBcHBlbmQsIChsb25nIGxvbmcpKmJ5dGVzV3JpdHRlbik7CisgICAgICAgIG1NYXhPZmZzZXRBcHBlbmQgPSBzdGQ6Om1heChtT2Zmc2V0LCBtTWF4T2Zmc2V0QXBwZW5kKTsKKyAgICAgICAgc2Vla09yUG9zdEVycm9yKG1GZCwgbU1heE9mZnNldEFwcGVuZCwgU0VFS19TRVQpOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIEFMT0dWKCJtT2Zmc2V0OiVsbGQsIG1NYXhPZmZzZXRBcHBlbmQ6JWxsZCIsIChsb25nIGxvbmcpbU9mZnNldCwgKGxvbmcgbG9uZyltTWF4T2Zmc2V0QXBwZW5kKTsKIAogICAgIGlmICh1c2VQcmVmaXgpIHsKICAgICAgICAgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChidWZmZXIpOwpAQCAtMTUxMCw2ICsxNTk5LDEwIEBACiAgICAgICAgIG1PZmZzZXQgKz0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKICAgICB9CiAgICAgKmJ5dGVzV3JpdHRlbiA9IG1PZmZzZXQgLSBvbGRfb2Zmc2V0OworCisgICAgQUxPR1YoIm1PZmZzZXQ6JWxsZCwgb2xkX29mZnNldDolbGxkLCBieXRlc1dyaXR0ZW46JWxsZCIsIChsb25nIGxvbmcpbU9mZnNldCwKKyAgICAgICAgICAobG9uZyBsb25nKW9sZF9vZmZzZXQsIChsb25nIGxvbmcpKmJ5dGVzV3JpdHRlbik7CisKICAgICByZXR1cm4gb2xkX29mZnNldDsKIH0KIApAQCAtMTUyMiw2ICsxNjE1LDcgQEAKICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKICAgICBpZiAoIW1lbWNtcChwdHIsICJceDAwXHgwMFx4MDBceDAxIiwgNCkpIHsKKyAgICAgICAgQUxPR1YoInN0cmlwcGluZyBzdGFydCBjb2RlIik7CiAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyA0LCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gNCk7CiAgICAgfQpAQCAtMTU1Miw4ICsxNjQ2LDEwIEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OmFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworICAgIEFMT0dWKCJhbHA6YnVmZmVyLT5yYW5nZV9sZW5ndGg6JWxsZCIsIChsb25nIGxvbmcpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgc2l6ZV90IGxlbmd0aCA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CiAgICAgaWYgKG1Vc2U0Qnl0ZU5hbExlbmd0aCkgeworICAgICAgICBBTE9HVigibVVzZTRCeXRlTmFsTGVuZ3RoIik7CiAgICAgICAgIHVpbnQ4X3QgeFs0XTsKICAgICAgICAgeFswXSA9IGxlbmd0aCA+PiAyNDsKICAgICAgICAgeFsxXSA9IChsZW5ndGggPj4gMTYpICYgMHhmZjsKQEAgLTE1NjMsNiArMTY1OSw3IEBACiAgICAgICAgIHdyaXRlT3JQb3N0RXJyb3IobUZkLCAoY29uc3QgdWludDhfdCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLCBsZW5ndGgpOwogICAgICAgICBtT2Zmc2V0ICs9IGxlbmd0aCArIDQ7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIm1Vc2UyQnl0ZU5hbExlbmd0aCIpOwogICAgICAgICBDSEVDS19MVChsZW5ndGgsIDY1NTM2dSk7CiAKICAgICAgICAgdWludDhfdCB4WzJdOwpAQCAtMjIyMSw3ICsyMzE4LDExIEBACiAgICAgaWYgKG1Mb29wZXIgPT0gbnVsbHB0cikgewogICAgICAgICBtTG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgICAgIG1Mb29wZXItPnNldE5hbWUoIk1QNFd0ckN0cmxIbHBMb29wZXIiKTsKLSAgICAgICAgZXJyID0gbUxvb3Blci0+c3RhcnQoKTsKKyAgICAgICAgaWYgKG1Jc0JhY2tncm91bmRNb2RlKSB7CisgICAgICAgICAgICBlcnIgPSBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBtTG9vcGVyLT5zdGFydCgpOworICAgICAgICB9CiAgICAgICAgIG1SZWZsZWN0b3IgPSBuZXcgQUhhbmRsZXJSZWZsZWN0b3I8TVBFRzRXcml0ZXI+KHRoaXMpOwogICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlZmxlY3Rvcik7CiAgICAgfQpAQCAtMjQ1NCwzMSArMjU1NSwyNyBAQAogICAgICAgICAgICAgaW50IGZkID0gbU5leHRGZDsKICAgICAgICAgICAgIG1OZXh0RmQgPSAtMTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKLSAgICAgICAgICAgIHN0YXJ0KG1TdGFydE1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLCBNRURJQV9SRUNPUkRFUl9JTkZPX05FWFRfT1VUUFVUX0ZJTEVfU1RBUlRFRCwgMCk7CisgICAgICAgICAgICBpZiAoZmluaXNoQ3VycmVudFNlc3Npb24oKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydChtU3RhcnRNZXRhLmdldCgpKTsKKyAgICAgICAgICAgICAgICBtU3dpdGNoUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spICB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUkVDT1JERVJfSU5GT19ORVhUX09VVFBVVF9GSUxFX1NUQVJURUQsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIDo6d3JpdGUoKSBvciBsc2VlazY0KCkgd2Fzbid0IGEgc3VjY2VzcywgZmlsZSBjb3VsZCBiZSBtYWxmb3JtZWQKKyAgICAgICAgLyogOjp3cml0ZSgpIG9yIGxzZWVrNjQoKSB3YXNuJ3QgYSBzdWNjZXNzLCBmaWxlIGNvdWxkIGJlIG1hbGZvcm1lZC4KKyAgICAgICAgICogT3IgZmFsbG9jYXRlKCkgZmFpbGVkLiByZXNldCgpIGFuZCBub3RpZnkgY2xpZW50IG9uIGJvdGggdGhlIGNhc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBrV2hhdEZhbGxvY2F0ZUVycm9yOiAvLyBmYWxsdGhyb3VnaAogICAgICAgICBjYXNlIGtXaGF0SU9FcnJvcjogewotICAgICAgICAgICAgQUxPR0UoImtXaGF0SU9FcnJvciIpOwogICAgICAgICAgICAgaW50MzJfdCBlcnI7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICAgICAgLy8gU3RvcCB0cmFja3MnIHRocmVhZHMgYW5kIG1haW4gd3JpdGVyIHRocmVhZC4KLSAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgIG5vdGlmeShNRURJQV9SRUNPUkRFUl9FVkVOVF9FUlJPUiwgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIGZhbGxvY2F0ZSgpIGZhaWxlZCwgaGVuY2Ugc3RvcCgpIGFuZCBub3RpZnkgYXBwLgotICAgICAgICBjYXNlIGtXaGF0RmFsbG9jYXRlRXJyb3I6IHsKLSAgICAgICAgICAgIEFMT0dFKCJrV2hhdEZhbGxvY2F0ZUVycm9yIik7Ci0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgICAgICAgICAvLyBTdG9wIHRyYWNrcycgdGhyZWFkcyBhbmQgbWFpbiB3cml0ZXIgdGhyZWFkLgotICAgICAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgLy9UT0RPOiBpbnRyb2R1Y2UgYSBzdWl0YWJsZSBNRURJQV9SRUNPUkRFUl9FUlJPUl8qIGluc3RlYWQgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTj8KKyAgICAgICAgICAgIC8vIElmIHJlc2V0IGFscmVhZHkgaW4gcHJvY2VzcywgZG9uJ3Qgd2FpdCBmb3IgaXQgY29tcGxldGUgdG8gYXZvaWQgZGVhZGxvY2suCisgICAgICAgICAgICByZXNldCh0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAvL1RPRE86IG5ldyBNRURJQV9SRUNPUkRFUl9FUlJPUl8qKioqIGluc3RlYWQgTUVESUFfUkVDT1JERVJfRVJST1JfVU5LTk9XTiA/CiAgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IsIE1FRElBX1JFQ09SREVSX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjQ4Niw3ICsyNTgzLDcgQEAKICAgICAgICAgICogUmVzcG9uZGluZyB3aXRoIG90aGVyIG9wdGlvbnMgY291bGQgYmUgYWRkZWQgbGF0ZXIgaWYgcmVxdWlyZWQuCiAgICAgICAgICAqLwogICAgICAgICBjYXNlIGtXaGF0Tm9JT0Vycm9yU29GYXI6IHsKLSAgICAgICAgICAgIEFMT0dEKCJrV2hhdE5vSU9FcnJvclNvRmFyIik7CisgICAgICAgICAgICBBTE9HVigia1doYXROb0lPRXJyb3JTb0ZhciIpOwogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBPSyk7CiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKQEAgLTI2OTQsNiArMjc5MSwxMSBAQAogCiAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJNUEVHNFdyaXRlciIsIDAsIDAsIDApOwogCisgICAgaWYgKG1Jc0JhY2tncm91bmRNb2RlKSB7CisgICAgICAgIC8vIEJhY2tncm91bmQgcHJpb3JpdHkgZm9yIG1lZGlhIHRyYW5zY29kaW5nLgorICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCAvKiB0aWQgKDAgPSBjdXJyZW50KSAqLywgQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHdoaWxlICghbURvbmUpIHsKICAgICAgICAgQ2h1bmsgY2h1bms7CkBAIC0yNzE5LDYgKzI4MjEsOSBAQAogICAgIH0KIAogICAgIHdyaXRlQWxsQ2h1bmtzKCk7CisgICAgQUxPR1YoInRocmVhZEZ1bmMgbU9mZnNldDolbGxkLCBtTWF4T2Zmc2V0QXBwZW5kOiVsbGQiLCAobG9uZyBsb25nKW1PZmZzZXQsCisgICAgICAgICAgKGxvbmcgbG9uZyltTWF4T2Zmc2V0QXBwZW5kKTsKKyAgICBtT2Zmc2V0ID0gc3RkOjptYXgobU9mZnNldCwgbU1heE9mZnNldEFwcGVuZCk7CiB9CiAKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpzdGFydFdyaXRlclRocmVhZCgpIHsKQEAgLTI3NzQsNyArMjg3OSw3IEBACiAgICAgICAgIC8vIGV2ZW4gaWYgdGhlIGZpbGUgaXMgd2VsbC1mb3JtZWQgYW5kIHRoZSBwcmltYXJ5IHBpY3R1cmUgaXMgY29ycmVjdC4KIAogICAgICAgICAvLyBSZXNlcnZlIGl0ZW0gaWRzIGZvciBzYW1wbGVzICsgZ3JpZAotICAgICAgICBzaXplX3QgbnVtSXRlbXNUb1Jlc2VydmUgPSBtTnVtVGlsZXMgKyAobU51bVRpbGVzID4gMSk7CisgICAgICAgIHNpemVfdCBudW1JdGVtc1RvUmVzZXJ2ZSA9IG1OdW1UaWxlcyArIChtTnVtVGlsZXMgPiAwKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbU93bmVyLT5yZXNlcnZlSXRlbUlkX2wobnVtSXRlbXNUb1Jlc2VydmUsICZtSXRlbUlkQmFzZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC0zMjgwLDYgKzMzODUsNyBAQAogICAgIHVpbnQzMl90IGxhc3RTYW1wbGVzUGVyQ2h1bmsgPSAwOwogICAgIGludDY0X3QgbGFzdFNhbXBsZUR1cmF0aW9uVXMgPSAtMTsgICAgICAvLyBEdXJhdGlvbiBjYWxjdWxhdGVkIGZyb20gRU9TIGJ1ZmZlciBhbmQgaXRzIHRpbWVzdGFtcAogICAgIGludDY0X3QgbGFzdFNhbXBsZUR1cmF0aW9uVGlja3MgPSAtMTsgICAvLyBUaW1lc2NhbGUgYmFzZWQgdGlja3MKKyAgICBpbnQ2NF90IHNhbXBsZUZpbGVPZmZzZXQgPSAtMTsKIAogICAgIGlmIChtSXNBdWRpbykgewogICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIk1QNFd0ckF1ZFRya1RocmVhZCIsIDAsIDAsIDApOwpAQCAtMzI5MSw2ICszMzk3LDkgQEAKIAogICAgIGlmIChtT3duZXItPmlzUmVhbFRpbWVSZWNvcmRpbmcoKSkgewogICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoMCwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgfSBlbHNlIGlmIChtT3duZXItPmlzQmFja2dyb3VuZE1vZGUoKSkgeworICAgICAgICAvLyBCYWNrZ3JvdW5kIHByaW9yaXR5IGZvciBtZWRpYSB0cmFuc2NvZGluZy4KKyAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KDAgLyogdGlkICgwID0gY3VycmVudCkgKi8sIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CiAgICAgfQogCiAgICAgc3A8TWV0YURhdGE+IG1ldGFfZGF0YTsKQEAgLTMyOTksNiArMzQwOCw3IEBACiAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CiAgICAgY29uc3QgY2hhciAqdHJhY2tOYW1lID0gZ2V0VHJhY2tUeXBlKCk7CiAgICAgd2hpbGUgKCFtRG9uZSAmJiAoZXJyID0gbVNvdXJjZS0+cmVhZCgmYnVmZmVyKSkgPT0gT0spIHsKKyAgICAgICAgQUxPR1YoInJlYWQ6YnVmZmVyLT5yYW5nZV9sZW5ndGg6JWxsZCIsIChsb25nIGxvbmcpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgIGludDMyX3QgaXNFT1MgPSBmYWxzZTsKICAgICAgICAgaWYgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0VuZE9mU3RyZWFtLCAmaXNFT1MpICYmIGlzRU9TKSB7CkBAIC0zNDA1LDYgKzM1MTUsMTQgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAoIWJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlTYW1wbGVGaWxlT2Zmc2V0LCAmc2FtcGxlRmlsZU9mZnNldCkpIHsKKyAgICAgICAgICAgIHNhbXBsZUZpbGVPZmZzZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGxhc3RTYW1wbGUgPSAtMTsKKyAgICAgICAgaWYgKCFidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5TGFzdFNhbXBsZUluZGV4SW5DaHVuaywgJmxhc3RTYW1wbGUpKSB7CisgICAgICAgICAgICBsYXN0U2FtcGxlID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInNhbXBsZUZpbGVPZmZzZXQ6JWxsZCIsIChsb25nIGxvbmcpc2FtcGxlRmlsZU9mZnNldCk7CiAKICAgICAgICAgLyoKICAgICAgICAgICogUmVzZXJ2ZSBzcGFjZSBpbiB0aGUgZmlsZSBmb3IgdGhlIGN1cnJlbnQgc2FtcGxlICsgdG8gYmUgd3JpdHRlbiBNT09WIGJveC4gSWYgcmVzZXJ2YXRpb24KQEAgLTM0MTIsNyArMzUzMCw3IEBACiAgICAgICAgICAqIHdyaXRlIE1PT1YgYm94IHN1Y2Nlc3NmdWxseSBhcyBzcGFjZSBmb3IgdGhlIHNhbWUgd2FzIHJlc2VydmVkIGluIHRoZSBwcmlvciBjYWxsLgogICAgICAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGJ1ZmZlci9zYW1wbGUgaGVyZS4KICAgICAgICAgICovCi0gICAgICAgIGlmICghbU93bmVyLT5wcmVBbGxvY2F0ZShidWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgeworICAgICAgICBpZiAoc2FtcGxlRmlsZU9mZnNldCA9PSAtMSAmJiAhbU93bmVyLT5wcmVBbGxvY2F0ZShidWZmZXItPnJhbmdlX2xlbmd0aCgpKSkgewogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0zNDIzLDkgKzM1NDEsMTQgQEAKICAgICAgICAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiB0aGUgTWVkaWFCdWZmZXIgYW5kIE1ldGFkYXRhIGFuZCByZWxlYXNlCiAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBhcyBzb29uIGFzIHdlIGNhbgogICAgICAgICBNZWRpYUJ1ZmZlciAqY29weSA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgbWVtY3B5KGNvcHktPmRhdGEoKSwgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGlmIChzYW1wbGVGaWxlT2Zmc2V0ICE9IC0xKSB7CisgICAgICAgICAgICBjb3B5LT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgc2FtcGxlRmlsZU9mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoY29weS0+ZGF0YSgpLCAodWludDhfdCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICB9CiAgICAgICAgIGNvcHktPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKwogICAgICAgICBtZXRhX2RhdGEgPSBuZXcgTWV0YURhdGEoYnVmZmVyLT5tZXRhX2RhdGEoKSk7CiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtMzQzMywxNCArMzU1NiwxNiBAQAogICAgICAgICAgICAgY29weS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUV4aWZUaWZmT2Zmc2V0LCB0aWZmSGRyT2Zmc2V0KTsKICAgICAgICAgfQogICAgICAgICBib29sIHVzZVByZWZpeCA9IHRoaXMtPnVzZVByZWZpeCgpICYmICFpc0V4aWY7Ci0KLSAgICAgICAgaWYgKHVzZVByZWZpeCkgU3RyaXBTdGFydGNvZGUoY29weSk7Ci0KKyAgICAgICAgaWYgKHNhbXBsZUZpbGVPZmZzZXQgPT0gLTEgJiYgdXNlUHJlZml4KSB7CisgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShjb3B5KTsKKyAgICAgICAgfQogICAgICAgICBzaXplX3Qgc2FtcGxlU2l6ZSA9IGNvcHktPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBpZiAodXNlUHJlZml4KSB7CisgICAgICAgIGlmIChzYW1wbGVGaWxlT2Zmc2V0ID09IC0xICYmIHVzZVByZWZpeCkgewogICAgICAgICAgICAgaWYgKG1Pd25lci0+dXNlTmFsTGVuZ3RoRm91cigpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIm5hbGxlbmd0aDQiKTsKICAgICAgICAgICAgICAgICBzYW1wbGVTaXplICs9IDQ7CiAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJuYWxsZW5ndGgyIik7CiAgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSArPSAyOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNzM1LDcgKzM4NjAsOCBAQAogICAgICAgICAgICAgICAgIGNodW5rVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBjaHVua0R1cmF0aW9uVXMgPSB0aW1lc3RhbXBVcyAtIGNodW5rVGltZXN0YW1wVXM7Ci0gICAgICAgICAgICAgICAgaWYgKGNodW5rRHVyYXRpb25VcyA+IGludGVybGVhdmVEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rRHVyYXRpb25VcyA+IGludGVybGVhdmVEdXJhdGlvblVzIHx8IGxhc3RTYW1wbGUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJsYXN0U2FtcGxlOiVsbGQiLCAobG9uZyBsb25nKWxhc3RTYW1wbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtEdXJhdGlvblVzID4gbU1heENodW5rRHVyYXRpb25VcykgewogICAgICAgICAgICAgICAgICAgICAgICAgbU1heENodW5rRHVyYXRpb25VcyA9IGNodW5rRHVyYXRpb25VczsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzk3MSw2ICs0MDk3LDEwIEBACiAgICAgcmV0dXJuIG1Jc1JlYWxUaW1lUmVjb3JkaW5nOwogfQogCitib29sIE1QRUc0V3JpdGVyOjppc0JhY2tncm91bmRNb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtSXNCYWNrZ3JvdW5kTW9kZTsKK30KKwogYm9vbCBNUEVHNFdyaXRlcjo6dXNlTmFsTGVuZ3RoRm91cigpIHsKICAgICByZXR1cm4gbVVzZTRCeXRlTmFsTGVuZ3RoOwogfQpAQCAtNDIxNywxMyArNDM0NywyMCBAQAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlQ29sckJveCgpIHsKICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKICAgICBtZW1zZXQoJmFzcGVjdHMsIDAsIHNpemVvZihhc3BlY3RzKSk7CisgICAgLy8gQ29sb3IgbWV0YWRhdGEgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwogICAgIC8vIFRSSUNLWTogdXNpbmcgfCBpbnN0ZWFkIG9mIHx8IGJlY2F1c2Ugd2Ugd2FudCB0byBleGVjdXRlIGFsbCBmaW5kSW50MzItcwotICAgIGlmIChtTWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpCi0gICAgICAgICAgICB8IG1NZXRhLT5maW5kSW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIChpbnQzMl90KikmYXNwZWN0cy5tVHJhbnNmZXIpCi0gICAgICAgICAgICB8IG1NZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAoaW50MzJfdCopJmFzcGVjdHMubU1hdHJpeENvZWZmcykKLSAgICAgICAgICAgIHwgbU1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlDb2xvclByaW1hcmllcywgKGludDMyX3QqKSZhc3BlY3RzLm1QcmltYXJpZXMpCisgICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgKGludDMyX3QqKSZhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIHwgbWV0YS0+ZmluZEludDMyKGtLZXlDb2xvck1hdHJpeCwgKGludDMyX3QqKSZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICB8IG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JSYW5nZSwgKGludDMyX3QqKSZhc3BlY3RzLm1SYW5nZSkpIHsKICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnM7CiAgICAgICAgIGJvb2wgZnVsbFJhbmdlOworICAgICAgICBBTE9HVigicHJpbWFyaWVzPSVzIHRyYW5zZmVyPSVzIG1hdHJpeD0lcyByYW5nZT0lcyIsCisgICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tUHJpbWFyaWVzKSwKKyAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1UcmFuc2ZlciksCisgICAgICAgICAgICAgICAgYXNTdHJpbmcoYXNwZWN0cy5tTWF0cml4Q29lZmZzKSwKKyAgICAgICAgICAgICAgICBhc1N0cmluZyhhc3BlY3RzLm1SYW5nZSkpOwogICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoCiAgICAgICAgICAgICAgICAgYXNwZWN0cywgJnByaW1hcmllcywgJnRyYW5zZmVyLCAmY29lZmZzLCAmZnVsbFJhbmdlKTsKICAgICAgICAgbU93bmVyLT5iZWdpbkJveCgiY29sciIpOwpAQCAtNDIzMyw2ICs0MzcwLDggQEAKICAgICAgICAgbU93bmVyLT53cml0ZUludDE2KGNvZWZmcyk7CiAgICAgICAgIG1Pd25lci0+d3JpdGVJbnQ4KGludDhfdChmdWxsUmFuZ2UgPyAweDgwIDogMHgwKSk7CiAgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGNvbHIKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigibm8gY29sb3IgaW5mb3JtYXRpb24iKTsKICAgICB9CiB9CiAKQEAgLTQ3MTUsMTAgKzQ4NTQsMTggQEAKIAogLy8gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHBpeGVsIGlzIG5vdCBzcXVhcmUKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp3cml0ZVBhc3BCb3goKSB7Ci0gICAgbU93bmVyLT5iZWdpbkJveCgicGFzcCIpOwotICAgIG1Pd25lci0+d3JpdGVJbnQzMigxIDw8IDE2KTsgIC8vIGhzcGFjaW5nCi0gICAgbU93bmVyLT53cml0ZUludDMyKDEgPDwgMTYpOyAgLy8gdnNwYWNpbmcKLSAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gcGFzcAorICAgIC8vIERvIG5vdCB3cml0ZSAncGFzcCcgYm94IHVubGVzcyB0aGUgdHJhY2sgZm9ybWF0IHNwZWNpZmllcyBpdC4KKyAgICAvLyBBY2NvcmRpbmcgdG8gSVNPL0lFQyAxNDQ5Ni0xMiAoSVNPIGJhc2UgbWVkaWEgZmlsZSBmb3JtYXQpLCAncGFzcCcgYm94CisgICAgLy8gaXMgb3B0aW9uYWwuIElmIHByZXNlbnQsIGl0IG92ZXJyaWRlcyB0aGUgU0FSIGZyb20gdGhlIHZpZGVvIENTRC4gT25seQorICAgIC8vIHNldCBpdCBpZiB0aGUgdHJhY2sgZm9ybWF0IHNwZWNpZmljYWxseSByZXF1ZXN0cyB0aGF0LgorICAgIGludDMyX3QgaFNwYWNpbmcsIHZTcGFjaW5nOworICAgIGlmIChtTWV0YS0+ZmluZEludDMyKGtLZXlTQVJXaWR0aCwgJmhTcGFjaW5nKSAmJiAoaFNwYWNpbmcgPiAwKQorICAgICAgICAgICAgJiYgbU1ldGEtPmZpbmRJbnQzMihrS2V5U0FSSGVpZ2h0LCAmdlNwYWNpbmcpICYmICh2U3BhY2luZyA+IDApKSB7CisgICAgICAgIG1Pd25lci0+YmVnaW5Cb3goInBhc3AiKTsKKyAgICAgICAgbU93bmVyLT53cml0ZUludDMyKGhTcGFjaW5nKTsgIC8vIGhzcGFjaW5nCisgICAgICAgIG1Pd25lci0+d3JpdGVJbnQzMih2U3BhY2luZyk7ICAvLyB2c3BhY2luZworICAgICAgICBtT3duZXItPmVuZEJveCgpOyAgLy8gcGFzcAorICAgIH0KIH0KIAogaW50NjRfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OmdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuY3BwCmluZGV4IGYxYjZlOGMuLjVhMmE5MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmNwcApAQCAtMTE0LDYgKzExNCwxMyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICAvKiBBcyBtQWRhcHRlckxvY2sgaXMgdW5sb2NrZWQgd2hpbGUgd2FpdGluZyBmb3Igc2lnbmFsQnVmZmVyUmV0dXJuZWQsCisgICAgICogYSBuZXcgYnVmZmVyIGZvciB0aGUgc2FtZSB0cmFjayBjb3VsZCBiZSBwdXNoZWQgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAqIGluIHRoZSBjbGllbnQgcHJvY2VzcywgbUJ1ZmZlckdhdGluZ011dGV4IHdpbGwgaGVscCB0byBob2xkIHRoYXQKKyAgICAgKiB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxrKG1CdWZmZXJHYXRpbmdNdXRleCk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUFkYXB0ZXJMb2NrKTsKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIEFMT0dFKCJwdXNoQnVmZmVyIGNhbGxlZCBiZWZvcmUgc3RhcnQiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQXBwZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4MGIzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQXBwZW5kZXIuY3BwCkBAIC0wLDAgKzEsNDI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUFwcGVuZGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKy8vIFRPRE8gOiBjaGVjayBpZiB0aGlzIHdvcmtzIGZvciBOREsgYXBwcyB3aXRob3V0IEpWTQorLy8gI2luY2x1ZGUgPG1lZGlhL25kay9OZGtKYXZhVk1IZWxwZXJQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhQXBwZW5kZXI6OnNhbXBsZURhdGFJbmZvIHsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHRpbWU7CisgICAgc2l6ZV90IGV4VHJhY2tJbmRleDsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YTsKK307CisKK3NwPE1lZGlhQXBwZW5kZXI+IE1lZGlhQXBwZW5kZXI6OmNyZWF0ZShpbnQgZmQsIEFwcGVuZE1vZGUgbW9kZSkgeworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoIShtb2RlID49IEFQUEVORF9NT0RFX0ZJUlNUICYmIG1vZGUgPD0gQVBQRU5EX01PREVfTEFTVCkpIHsKKyAgICAgICAgQUxPR0UoImludmFsaWQgbW9kZSAlZCIsIG1vZGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8TWVkaWFBcHBlbmRlcj4gbWEgPSBuZXcgKHN0ZDo6bm90aHJvdykgTWVkaWFBcHBlbmRlcihmZCwgbW9kZSk7CisgICAgaWYgKG1hLT5pbml0KCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtYTsKK30KKworLy8gVE9ETzogaW5qZWN0IG1lZGlhbXV4ZXIgYW5kIG1lZGlhZXh0cmFjdG9yIG9iamVjdHMuCisvLyBUT0RPOiBAZm9ybWF0IGlzIG5vdCByZXF1aXJlZCBhcyBhbiBpbnB1dCBpZiB3ZSBjYW4gc25pZmYgdGhlIGZpbGUgYW5kIGZpbmQgdGhlIGZvcm1hdCBvZgorLy8gICAgICAgdGhlIGV4aXN0aW5nIGNvbnRlbnQuCisvLyBUT0RPOiBDb2RlIGl0IHRvIHRoZSBpbnRlcmZhY2UoTWVkaWFBcHBlbmRlciksIGFuZCBoYXZlIGEgc2VwYXJhdGUgTWVkaWFBcHBlbmRlciBOREsKK01lZGlhQXBwZW5kZXI6Ok1lZGlhQXBwZW5kZXIoaW50IGZkLCBBcHBlbmRNb2RlIG1vZGUpCisgICAgOiBtRmQoZmQpLAorICAgICAgbU1vZGUobW9kZSksCisgICAgICAvLyBUT0RPIDogY2hlY2sgaWYgdGhpcyB3b3JrcyBmb3IgTkRLIGFwcHMgd2l0aG91dCBKVk0KKyAgICAgIC8vIG1FeHRyYWN0b3IobmV3IE51TWVkaWFFeHRyYWN0b3IoTmRrSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKSAhPSBudWxscHRyCisgICAgICAvLyAgICAgICAgICAgPyBOdU1lZGlhRXh0cmFjdG9yOjpFbnRyeVBvaW50OjpOREtfV0lUSF9KVk0KKyAgICAgIC8vICAgICAgICAgICA6IE51TWVkaWFFeHRyYWN0b3I6OkVudHJ5UG9pbnQ6Ok5ES19OT19KVk0pKSwKKyAgICAgIG1FeHRyYWN0b3IobmV3IChzdGQ6Om5vdGhyb3cpIE51TWVkaWFFeHRyYWN0b3IoTnVNZWRpYUV4dHJhY3Rvcjo6RW50cnlQb2ludDo6TkRLX1dJVEhfSlZNKSksCisgICAgICBtVHJhY2tDb3VudCgwKSwKKyAgICAgIG1TdGF0ZShVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgQUxPR1YoIk1lZGlhQXBwZW5kZXI6Ok1lZGlhQXBwZW5kZXIgbW9kZTolZCIsIG1vZGUpOworICAgICAgfQorCitzdGF0dXNfdCBNZWRpYUFwcGVuZGVyOjppbml0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCJNZWRpYUFwcGVuZGVyOjppbml0Iik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUV4dHJhY3Rvci0+c2V0RGF0YVNvdXJjZShtRmQsIDAsIGxzZWVrKG1GZCwgMCwgU0VFS19FTkQpKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJleHRyYWN0b3Jfc2V0RGF0YVNvdXJjZSBmYWlsZWQsIHN0YXR1cyA6JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChzdHJjbXAoIk1QRUc0RXh0cmFjdG9yIiwgbUV4dHJhY3Rvci0+Z2V0TmFtZSgpKSA9PSAwKSB7CisgICAgICAgIG1Gb3JtYXQgPSBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgZm9ybWF0LCBleHRyYWN0b3IgbmFtZTolcyIsIG1FeHRyYWN0b3ItPmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtVHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQUxPR1YoIm1UcmFja0NvdW50OiV6dSIsIG1UcmFja0NvdW50KTsKKyAgICBpZiAobVRyYWNrQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgibm8gdHJhY2tzIGFyZSBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHNpemVfdCBleFRyYWNrSW5kZXggPSAwOworICAgIHNzaXplX3QgYXVkaW9UcmFja0luZGV4ID0gLTEsIHZpZGVvVHJhY2tJbmRleCA9IC0xOworICAgIGJvb2wgYXVkaW9TeW5jU2FtcGxlVGltZVNldCA9IGZhbHNlOworCisgICAgd2hpbGUgKGV4VHJhY2tJbmRleCA8IG1UcmFja0NvdW50KSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBmbXQ7CisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KGV4VHJhY2tJbmRleCwgJmZtdCwgMCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRUcmFja0Zvcm1hdCBmYWlsZWQgZm9yIHRyYWNrSW5kZXg6JXp1LCBzdGF0dXM6JWQiLCBleFRyYWNrSW5kZXgsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgaWYgKGZtdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJWaWRlb1RyYWNrIik7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvVHJhY2tJbmRleCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IG1vcmUgdGhhbiBvbmUgdmlkZW8gdHJhY2sgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlkZW9UcmFja0luZGV4ID0gZXhUcmFja0luZGV4OworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9UcmFjayIpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb1RyYWNrSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBtb3JlIHRoYW4gb25lIGF1ZGlvIHRyYWNrIGlzIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb1RyYWNrSW5kZXggPSBleFRyYWNrSW5kZXg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCJOZWl0aGVyIFZpZGVvIG5vciBBdWRpbyB0cmFjayIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1GbXRJbmRleE1hcC5lbXBsYWNlKGV4VHJhY2tJbmRleCwgZm10KTsKKyAgICAgICAgbVNhbXBsZUNvdW50VmVjdC5lbXBsYWNlX2JhY2soMCk7CisgICAgICAgIG1NYXhUaW1lc3RhbXBWZWN0LmVtcGxhY2VfYmFjaygwKTsKKyAgICAgICAgbUxhc3RTeW5jU2FtcGxlVGltZVZlY3QuZW1wbGFjZV9iYWNrKDApOworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5zZWxlY3RUcmFjayhleFRyYWNrSW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgic2VsZWN0VHJhY2sgZmFpbGVkIGZvciB0cmFja0luZGV4OiV6dSwgc3RhdHVzOiVkIiwgZXhUcmFja0luZGV4LCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICArK2V4VHJhY2tJbmRleDsKKyAgICB9CisKKyAgICBBTE9HVigiQXVkaW9UcmFja0luZGV4OiV6dSwgVmlkZW9UcmFja0luZGV4OiV6dSIsIGF1ZGlvVHJhY2tJbmRleCwgdmlkZW9UcmFja0luZGV4KTsKKworICAgIGRvIHsKKyAgICAgICAgc2FtcGxlRGF0YUluZm8gdG1wU0RJOworICAgICAgICAvLyBUT0RPOiByZWFkIGluZm8gaW50byBtZW1iZXJzIG9mIHRoZSBzdHJ1Y3Qgc2FtcGxlRGF0YUluZm8gZGlyZWN0bHkKKyAgICAgICAgc2l6ZV90IHNhbXBsZVNpemU7CisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFNhbXBsZVNpemUoJnNhbXBsZVNpemUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZSBmYWlsZWQsIHN0YXR1czolZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIG1TYW1wbGVTaXplVmVjdC5lbXBsYWNlX2JhY2soc2FtcGxlU2l6ZSk7CisgICAgICAgIHRtcFNESS5zaXplID0gc2FtcGxlU2l6ZTsKKyAgICAgICAgaW50NjRfdCBzYW1wbGVUaW1lID0gMDsKKyAgICAgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0U2FtcGxlVGltZSgmc2FtcGxlVGltZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRTYW1wbGVUaW1lIGZhaWxlZCwgc3RhdHVzOiVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgbVNhbXBsZVRpbWVWZWN0LmVtcGxhY2VfYmFjayhzYW1wbGVUaW1lKTsKKyAgICAgICAgdG1wU0RJLnRpbWUgPSBzYW1wbGVUaW1lOworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVUcmFja0luZGV4KCZleFRyYWNrSW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlVHJhY2tJbmRleCBmYWlsZWQsIHN0YXR1czolZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIG1TYW1wbGVJbmRleFZlY3QuZW1wbGFjZV9iYWNrKGV4VHJhY2tJbmRleCk7CisgICAgICAgIHRtcFNESS5leFRyYWNrSW5kZXggPSBleFRyYWNrSW5kZXg7CisgICAgICAgICsrbVNhbXBsZUNvdW50VmVjdFtleFRyYWNrSW5kZXhdOworICAgICAgICBtTWF4VGltZXN0YW1wVmVjdFtleFRyYWNrSW5kZXhdID0gc3RkOjptYXgobU1heFRpbWVzdGFtcFZlY3RbZXhUcmFja0luZGV4XSwgc2FtcGxlVGltZSk7CisgICAgICAgIHNwPE1ldGFEYXRhPiBzYW1wbGVNZXRhOworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRTYW1wbGVNZXRhKCZzYW1wbGVNZXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoImdldFNhbXBsZU1ldGEgZmFpbGVkLCBzdGF0dXM6JWQiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBtU2FtcGxlTWV0YVZlY3QuZW1wbGFjZV9iYWNrKHNhbXBsZU1ldGEpOworICAgICAgICBpbnQzMl90IHZhbCA9IDA7CisgICAgICAgIGlmIChzYW1wbGVNZXRhLT5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsKSAmJiB2YWwgIT0gMCkgeworICAgICAgICAgICAgbUxhc3RTeW5jU2FtcGxlVGltZVZlY3RbZXhUcmFja0luZGV4XSA9IHNhbXBsZVRpbWU7CisgICAgICAgIH0KKyAgICAgICAgdG1wU0RJLm1ldGEgPSBzYW1wbGVNZXRhOworICAgICAgICBtU0RJLmVtcGxhY2VfYmFjayh0bXBTREkpOworICAgIH0gd2hpbGUgKG1FeHRyYWN0b3ItPmFkdmFuY2UoKSA9PSBPSyk7CisKKyAgICBtRXh0cmFjdG9yLmNsZWFyKCk7CisKKyAgICBzdGQ6OnNvcnQobVNESS5iZWdpbigpLCBtU0RJLmVuZCgpLCBbXShzYW1wbGVEYXRhSW5mbyYgYSwgc2FtcGxlRGF0YUluZm8mIGIpIHsKKyAgICAgICAgaW50NjRfdCBhT2Zmc2V0LCBiT2Zmc2V0OworICAgICAgICBhLm1ldGEtPmZpbmRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgJmFPZmZzZXQpOworICAgICAgICBiLm1ldGEtPmZpbmRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgJmJPZmZzZXQpOworICAgICAgICByZXR1cm4gYU9mZnNldCA8IGJPZmZzZXQ7CisgICAgfSk7CisgICAgZm9yIChpbnQ2NF90IHN5bmNTYW1wbGVUaW1lIDogbUxhc3RTeW5jU2FtcGxlVGltZVZlY3QpIHsKKyAgICAgICAgQUxPR1YoImJlZm9yZSBpZ25vcmluZyBmcmFtZXMsIG1MYXN0U3luY1NhbXBsZVRpbWVWZWN0OiVsbGQiLCAobG9uZyBsb25nKXN5bmNTYW1wbGVUaW1lKTsKKyAgICB9CisgICAgQUxPR1YoIm1Nb2RlOiV1IiwgbU1vZGUpOworICAgIGlmIChtTW9kZSA9PSBBUFBFTkRfTU9ERV9JR05PUkVfTEFTVF9WSURFT19HT1AgJiYgdmlkZW9UcmFja0luZGV4ICE9IC0xICkgeworICAgICAgICBBTE9HVigiVmlkZW8gdHJhY2sgaXMgcHJlc2VudCIpOworICAgICAgICBib29sIGxhc3RWaWRlb0lmcmFtZSA9IGZhbHNlOworICAgICAgICBzaXplX3QgbGFzdFZpZGVvSWZyYW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgaW50NjRfdCBsYXN0VmlkZW9TYW1wbGVUaW1lID0gLTE7CisgICAgICAgIGZvciAoYXV0byBySXRyID0gbVNESS5yYmVnaW4oKTsgckl0ciAhPSBtU0RJLnJlbmQoKTsgKytySXRyKSB7CisgICAgICAgICAgICBpZiAockl0ci0+ZXhUcmFja0luZGV4ICE9IHZpZGVvVHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3RWaWRlb1NhbXBsZVRpbWUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBsYXN0VmlkZW9TYW1wbGVUaW1lID0gckl0ci0+dGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGlmICghckl0ci0+bWV0YS0+ZmluZEludDY0KGtLZXlTYW1wbGVGaWxlT2Zmc2V0LCAmb2Zmc2V0KSB8fCBvZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNaXNzaW5nIG9mZnNldCIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigib2Zmc2V0OiVsbGQiLCAobG9uZyBsb25nKW9mZnNldCk7CisgICAgICAgICAgICBpbnQzMl90IHZhbCA9IDA7CisgICAgICAgICAgICBpZiAockl0ci0+bWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbCkgJiYgdmFsICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlVGltZTolbGxkIiwgKGxvbmcgbG9uZylySXRyLT50aW1lKTsKKyAgICAgICAgICAgICAgICBBTE9HVigibGFzdFZpZGVvU2FtcGxlVGltZTolbGxkIiwgKGxvbmcgbG9uZylsYXN0VmlkZW9TYW1wbGVUaW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFZpZGVvSWZyYW1lID09IGZhbHNlICYmIChsYXN0VmlkZW9TYW1wbGVUaW1lIC0gckl0ci0+dGltZSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwLyogVHJhY2sgaW50ZXJsZWF2aW5nIGR1cmF0aW9uIGluIE1QRUc0V3JpdGVyKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImxhc3RWaWRlb0lmcmFtZSBnb3QgY2hvc2VuIik7CisgICAgICAgICAgICAgICAgICAgIGxhc3RWaWRlb0lmcmFtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0U3luY1NhbXBsZVRpbWVWZWN0W3ZpZGVvVHJhY2tJbmRleF0gPSBySXRyLT50aW1lOworICAgICAgICAgICAgICAgICAgICBsYXN0VmlkZW9JZnJhbWVPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJsYXN0VmlkZW9JZnJhbWVPZmZzZXQ6JWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXN0VmlkZW9JZnJhbWUgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJOZWVkIHRvIHJld3JpdGUgYWxsIHNhbXBsZXMiKTsKKyAgICAgICAgICAgIG1MYXN0U3luY1NhbXBsZVRpbWVWZWN0W3ZpZGVvVHJhY2tJbmRleF0gPSAwOworICAgICAgICAgICAgbGFzdFZpZGVvSWZyYW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBpbnQgZnJhbWVzSWdub3JlZENvdW50ID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ciA9IG1TREkuYmVnaW4oKTsgaXRyICE9IG1TREkuZW5kKCk7KSB7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgICAgICAgICBBTE9HVigidHJhY2tJbmRleDolenUsICUiIFBSSWQ2NCAiIiwgaXRyLT5leFRyYWNrSW5kZXgsIGl0ci0+dGltZSk7CisgICAgICAgICAgICBpZiAoaXRyLT5tZXRhLT5maW5kSW50NjQoa0tleVNhbXBsZUZpbGVPZmZzZXQsICZvZmZzZXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID49IGxhc3RWaWRlb0lmcmFtZU9mZnNldCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJvZmZzZXQ6JWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoIWF1ZGlvU3luY1NhbXBsZVRpbWVTZXQgJiYgYXVkaW9UcmFja0luZGV4ICE9IC0xICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2tJbmRleCA9PSBpdHItPmV4VHJhY2tJbmRleCkgeworICAgICAgICAgICAgICAgICAgICBtTGFzdFN5bmNTYW1wbGVUaW1lVmVjdFthdWRpb1RyYWNrSW5kZXhdID0gaXRyLT50aW1lOworICAgICAgICAgICAgICAgICAgICBhdWRpb1N5bmNTYW1wbGVUaW1lU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRyID0gbVNESS5lcmFzZShpdHIpOworICAgICAgICAgICAgICAgICsrZnJhbWVzSWdub3JlZENvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2l0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZnJhbWVzSWdub3JlZENvdW50OiV1IiwgZnJhbWVzSWdub3JlZENvdW50KTsKKyAgICB9CisKKyAgICBpZiAobU1vZGUgPT0gQVBQRU5EX01PREVfSUdOT1JFX0xBU1RfVklERU9fR09QICYmIHZpZGVvVHJhY2tJbmRleCA9PSAtMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2tJbmRleCAhPSAtMSkgeworICAgICAgICBBTE9HVigiT25seSBBdWRpb1RyYWNrIGlzIHByZXNlbnQiKTsKKyAgICAgICAgZm9yIChhdXRvIHJJdHIgPSBtU0RJLnJiZWdpbigpOyBySXRyICE9IG1TREkucmVuZCgpOyAgKytySXRyKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbCA9IDA7CisgICAgICAgICAgICBpZiAockl0ci0+bWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbCkgJiYgdmFsICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RTeW5jU2FtcGxlVGltZVZlY3RbYXVkaW9UcmFja0luZGV4XSA9IHJJdHItPnRpbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGludCBmcmFtZXNJZ25vcmVkQ291bnQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXRyID0gbVNESS5iZWdpbigpOyBpdHIgIT0gbVNESS5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmIChpdHItPnRpbWUgPj0gbUxhc3RTeW5jU2FtcGxlVGltZVZlY3RbYXVkaW9UcmFja0luZGV4XSkgeworICAgICAgICAgICAgICAgIGl0ciA9IG1TREkuZXJhc2UoaXRyKTsKKyAgICAgICAgICAgICAgICArK2ZyYW1lc0lnbm9yZWRDb3VudDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZyYW1lc0lnbm9yZWRDb3VudCA6JXUiLCBmcmFtZXNJZ25vcmVkQ291bnQpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxhc3RTeW5jU2FtcGxlVGltZVZlY3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQUxPR1YoIm1MYXN0U3luY1NhbXBsZVRpbWVWZWN0WyV6dV06JWxsZCIsIGksIChsb25nIGxvbmcpbUxhc3RTeW5jU2FtcGxlVGltZVZlY3RbaV0pOworICAgICAgICBtRm10SW5kZXhNYXBbaV0tPnNldEludDY0KAorICAgICAgICAgICAgICAgICJzYW1wbGUtdGltZS1iZWZvcmUtYXBwZW5kIiAvKkFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1RJTUVfQkVGT1JFX0FQUEVORCovLAorICAgICAgICAgICAgICAgIG1MYXN0U3luY1NhbXBsZVRpbWVWZWN0W2ldKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWF4VGltZXN0YW1wVmVjdC5zaXplKCk7ICsraSkgeworICAgICAgICBBTE9HVigibU1heFRpbWVzdGFtcFslenVdOiVsbGQiLCBpLCAobG9uZyBsb25nKW1NYXhUaW1lc3RhbXBWZWN0W2ldKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxlQ291bnRWZWN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIEFMT0dWKCJTYW1wbGVDb3VudFZlY3RbJXp1XTolenUiLCBpLCBtU2FtcGxlQ291bnRWZWN0W2ldKTsKKyAgICB9CisgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CisgICAgcmV0dXJuIE9LOworfQorCitNZWRpYUFwcGVuZGVyOjp+TWVkaWFBcHBlbmRlcigpIHsKKyAgICBBTE9HVigiTWVkaWFBcHBlbmRlcjo6fk1lZGlhQXBwZW5kZXIiKTsKKyAgICBtTXV4ZXIuY2xlYXIoKTsKKyAgICBtRXh0cmFjdG9yLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IE1lZGlhQXBwZW5kZXI6OnN0YXJ0KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCJNZWRpYUFwcGVuZGVyOjpzdGFydCIpOworICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhQXBwZW5kZXI6OnN0YXJ0KCkgaXMgY2FsbGVkIGluIGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1NdXhlciA9IG5ldyAoc3RkOjpub3Rocm93KSBNZWRpYU11eGVyKG1GZCwgbUZvcm1hdCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBuIDogbUZtdEluZGV4TWFwKSB7CisgICAgICAgIHNzaXplX3QgbXV4SW5kZXggPSBtTXV4ZXItPmFkZFRyYWNrKG4uc2Vjb25kKTsKKyAgICAgICAgaWYgKG11eEluZGV4IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImFkZFRyYWNrIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbVRyYWNrSW5kZXhNYXAuZW1wbGFjZShuLmZpcnN0LCBtdXhJbmRleCk7CisgICAgfQorICAgIEFMT0dWKCJ0cmFja0luZGV4bWFwIHNpemU6JXp1IiwgbVRyYWNrSW5kZXhNYXAuc2l6ZSgpKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1NdXhlci0+c3RhcnQoKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJtdXhlciBzdGFydCBmYWlsZWQ6JWQiLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIEFMT0dWKCJTb3J0aW5nIHNhbXBsZXMgYmFzZWQgb24gdGhlaXIgb2Zmc2V0cyIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNESS5zaXplKCk7ICsraSkgeworICAgICAgICBBTE9HVigiaTolZCIsIGkgKyAxKTsKKyAgICAgICAgLyogVE9ETyA6IEFsbG9jYXRlIGEgc2luZ2xlIGFsbG9jYXRpb24gb2YgdGhlIG1heCBzaXplLCBhbmQgcmV1c2UgaXQgYWNyb3NzIEFCdWZmZXJzIGlmCisgICAgICAgICAqIHVzaW5nIG5ldyBBQnVmZmVyKHZvaWQgKiwgc2l6ZV90KS4KKyAgICAgICAgICovCisgICAgICAgIHNwPEFCdWZmZXI+IGRhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihtU0RJW2ldLnNpemUpOworICAgICAgICBpZiAoZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGRhdGEtPnNldFJhbmdlKDAsIG1TRElbaV0uc2l6ZSk7CisgICAgICAgIGludDMyX3QgdmFsID0gMDsKKyAgICAgICAgaW50IHNhbXBsZUZsYWdzID0gMDsKKyAgICAgICAgaWYgKG1TRElbaV0ubWV0YS0+ZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbCkgJiYgdmFsICE9IDApIHsKKyAgICAgICAgICAgIHNhbXBsZUZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdmFsNjQ7CisgICAgICAgIGlmIChtU0RJW2ldLm1ldGEtPmZpbmRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgJnZhbDY0KSkgeworICAgICAgICAgICAgQUxPR1YoIlNhbXBsZUZpbGVPZmZzZXQgRm91bmQgOiV6dTolbGxkOiVsbGQiLCBtU0RJW2ldLmV4VHJhY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVNhbXBsZUNvdW50VmVjdFttU0RJW2ldLmV4VHJhY2tJbmRleF0sIChsb25nIGxvbmcpdmFsNjQpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGJ1Zk1ldGEgPSBkYXRhLT5tZXRhKCk7CisgICAgICAgICAgICBidWZNZXRhLT5zZXRJbnQ2NCgic2FtcGxlLWZpbGUtb2Zmc2V0IiAvKkFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1RJTUVfQkVGT1JFX0FQUEVORCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChtU0RJW2ldLm1ldGEtPmZpbmRJbnQ2NChrS2V5TGFzdFNhbXBsZUluZGV4SW5DaHVuaywgJnZhbDY0KSkgeworICAgICAgICAgICAgQUxPR1YoImtLZXlMYXN0U2FtcGxlSW5kZXhJbkNodW5rIEZvdW5kICVsbGQ6JWxsZCIsCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TYW1wbGVDb3VudFZlY3RbbVNESVtpXS5leFRyYWNrSW5kZXhdLCAobG9uZyBsb25nKXZhbDY0KTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBidWZNZXRhID0gZGF0YS0+bWV0YSgpOworICAgICAgICAgICAgYnVmTWV0YS0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIgLypBTUVESUFGT1JNQVRfS0VZX0xBU1RfU0FNUExFX0lOREVYX0lOX0NIVU5LKi8sCisgICAgICAgICAgICAgICAgICAgIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBtTXV4ZXItPndyaXRlU2FtcGxlRGF0YShkYXRhLCBtVHJhY2tJbmRleE1hcFttU0RJW2ldLmV4VHJhY2tJbmRleF0sIG1TRElbaV0udGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgibXV4ZXIgd3JpdGVTYW1wbGVEYXRhIGZhaWxlZDolZCIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUFwcGVuZGVyOjpzdG9wKCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCJNZWRpYUFwcGVuZGVyOjpzdG9wIik7CisgICAgaWYgKG1TdGF0ZSA9PSBTVEFSVEVEKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1NdXhlci0+c3RvcCgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBFUlJPUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgic3RvcCgpIGlzIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3NpemVfdCBNZWRpYUFwcGVuZGVyOjpnZXRUcmFja0NvdW50KCkgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOworICAgIEFMT0dWKCJNZWRpYUFwcGVuZGVyOjpnZXRUcmFja0NvdW50Iik7CisgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCAmJiBtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICBBTE9HRSgiZ2V0VHJhY2tDb3VudCgpIGlzIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrQ291bnQ7Cit9CisKK3NwPEFNZXNzYWdlPiBNZWRpYUFwcGVuZGVyOjpnZXRUcmFja0Zvcm1hdChzaXplX3QgaWR4KSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisgICAgQUxPR1YoIk1lZGlhQXBwZW5kZXI6OmdldFRyYWNrRm9ybWF0Iik7CisgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCAmJiBtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICBBTE9HRSgiZ2V0VHJhY2tGb3JtYXQoKSBpcyBjYWxsZWQgaW4gaW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gbVRyYWNrQ291bnQpIHsKKyAgICAgICAgQUxPR0UoImdldFRyYWNrRm9ybWF0KCkgaWR4IGlzIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1GbXRJbmRleE1hcFtpZHhdOworfQorCitzdGF0dXNfdCBNZWRpYUFwcGVuZGVyOjp3cml0ZVNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4mIGJ1ZmZlciwgc2l6ZV90IHRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHVpbnQzMl90IGZsYWdzKSB7CisgICAgc3RkOjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisgICAgQUxPR1YoIndyaXRlU2FtcGxlRGF0YTp0cmFja0luZGV4OiV6dSwgdGltZTolIiBQUklkNjQgIiIsIHRyYWNrSW5kZXgsIHRpbWVVcyk7CisgICAgcmV0dXJuIG1NdXhlci0+d3JpdGVTYW1wbGVEYXRhKGJ1ZmZlciwgdHJhY2tJbmRleCwgdGltZVVzLCBmbGFncyk7Cit9CisKK3N0YXR1c190IE1lZGlhQXBwZW5kZXI6OnNldE9yaWVudGF0aW9uSGludChbW21heWJlX3VudXNlZF1dIGludCBkZWdyZWVzKSB7CisgICAgQUxPR0UoInNldE9yaWVudGF0aW9uSGludCBub3Qgc3VwcG9ydGVkLiBIYXMgdG8gYmUgY2FsbGVkIHByaW9yIHRvIHN0YXJ0IG9uIGluaXRpYWwgbXV4ZXIiKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9OworCitzdGF0dXNfdCBNZWRpYUFwcGVuZGVyOjpzZXRMb2NhdGlvbihbW21heWJlX3VudXNlZF1dIGludCBsYXRpdCwgW1ttYXliZV91bnVzZWRdXSBpbnQgbG9uZ2l0KSB7CisgICAgQUxPR0UoInNldExvY2F0aW9uIG5vdCBzdXBwb3J0ZWQuIEhhcyB0byBiZSBjYWxsZWQgcHJpb3IgdG8gc3RhcnQgb24gaW5pdGlhbCBtdXhlciIpOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3NpemVfdCBNZWRpYUFwcGVuZGVyOjphZGRUcmFjayhbW21heWJlX3VudXNlZF1dIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgQUxPR0UoImFkZFRyYWNrIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IDQwZDhiYTIuLmMwMzIzNmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0yMCwxNCArMjAsMTkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KIAogI2luY2x1ZGUgPEMyQnVmZmVyLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCIKKyNpbmNsdWRlICJQbGF5YmFja0R1cmF0aW9uQWNjdW11bGF0b3IuaCIKIAorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIApAQCAtMzUsNyArNDAsOSBAQAogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgpAQCAtNDcsNiArNTQsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL2Zvcm1hdHNoYXBlci9Gb3JtYXRTaGFwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KQEAgLTYxLDEyICs3MiwxNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUZpbHRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CisjaW5jbHVkZSA8bmF0aXZlbG9hZGVyL2RsZXh0X25hbWVzcGFjZXMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KIApAQCAtODMsNiArOTYsNyBAQAogLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCiAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQ29kZWMuamF2YQogLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTG9nU2Vzc2lvbklkID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sb2ctc2Vzc2lvbi1pZCI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjIjsgIC8qIGUuZy4gT01YLmdvb2dsZS5hYWMuZGVjb2RlciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1pbWUiOyAgICAvKiBlLmcuIGF1ZGlvL21pbWUgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlIjsgICAgLyogYXVkaW8sIHZpZGVvICovCkBAIC05Myw2ICsxMDcsMjcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGgiOyAgICAgLyogMC4ubiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0hlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0IjsgICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiOyAgLyogMC85MC8xODAvMjcwICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ29sb3JGb3JtYXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvbG9yLWZvcm1hdCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRnJhbWVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5mcmFtZS1yYXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDYXB0dXJlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY2FwdHVyZS1yYXRlIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNPcGVyYXRpbmdSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcGVyYXRpbmctcmF0ZSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUHJpb3JpdHkgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByaW9yaXR5IjsKKworLy8gTWluL01heCBRUCBiZWZvcmUgc2hhcGluZworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY09yaWdpbmFsVmlkZW9RUElNaW4gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm9yaWdpbmFsLXZpZGVvLXFwLWktbWluIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNPcmlnaW5hbFZpZGVvUVBJTWF4ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1pLW1heCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjT3JpZ2luYWxWaWRlb1FQUE1pbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMub3JpZ2luYWwtdmlkZW8tcXAtcC1taW4iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY09yaWdpbmFsVmlkZW9RUFBNYXggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm9yaWdpbmFsLXZpZGVvLXFwLXAtbWF4IjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNPcmlnaW5hbFZpZGVvUVBCTWluID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1iLW1pbiI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjT3JpZ2luYWxWaWRlb1FQQk1heCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMub3JpZ2luYWwtdmlkZW8tcXAtYi1tYXgiOworCisvLyBNaW4vTWF4IFFQIGFmdGVyIHNoYXBpbmcKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQSU1pbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmlkZW8tcXAtaS1taW4iOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlcXVlc3RlZFZpZGVvUVBJTWF4ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby1xcC1pLW1heCI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUmVxdWVzdGVkVmlkZW9RUFBNaW4gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZpZGVvLXFwLXAtbWluIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQUE1heCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmlkZW8tcXAtcC1tYXgiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlcXVlc3RlZFZpZGVvUVBCTWluID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby1xcC1iLW1pbiI7CitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUmVxdWVzdGVkVmlkZW9RUEJNYXggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZpZGVvLXFwLWItbWF4IjsKIAogLy8gTkI6IFRoZXNlIGFyZSBub3QgeWV0IGV4cG9zZWQgYXMgcHVibGljIEphdmEgQVBJIGNvbnN0YW50cy4KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNDcnlwdG8gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNyeXB0byI7ICAgLyogMCwxICovCkBAIC0xMDAsNiArMTM1LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNMZXZlbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGV2ZWwiOyAgLyogMC4ubiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0JpdHJhdGVNb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5iaXRyYXRlX21vZGUiOyAgLyogQ1EvVkJSL0NCUiAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY0JpdHJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmJpdHJhdGUiOyAgLyogMC4ubiAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY09yaWdpbmFsQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMub3JpZ2luYWwuYml0cmF0ZSI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjTWF4V2lkdGggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heHdpZHRoIjsgIC8qIDAuLm4gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNNYXhIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCI7ICAvKiAwLi5uICovCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjRXJyb3IgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycmNvZGUiOwpAQCAtMTE3LDYgKzE1MywxMyBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY051bUxvd0xhdGVuY3lNb2RlT24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxvdy1sYXRlbmN5Lm9uIjsgIC8qIDAuLm4gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNOdW1Mb3dMYXRlbmN5TW9kZU9mZiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubG93LWxhdGVuY3kub2ZmIjsgIC8qIDAuLm4gKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNGaXJzdEZyYW1lSW5kZXhMb3dMYXRlbmN5TW9kZU9uID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sb3ctbGF0ZW5jeS5maXJzdC1mcmFtZSI7ICAvKiAwLi5uICovCitzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjQ2hhbm5lbENvdW50ID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jaGFubmVsQ291bnQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1NhbXBsZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnNhbXBsZVJhdGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1ZpZGVvRW5jb2RlZEJ5dGVzID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52ZW5jb2RlLmJ5dGVzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNWaWRlb0VuY29kZWRGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZlbmNvZGUuZnJhbWVzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNWaWRlb0lucHV0Qnl0ZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZpZGVvLmlucHV0LmJ5dGVzIjsKK3N0YXRpYyBjb25zdCBjaGFyICprQ29kZWNWaWRlb0lucHV0RnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby5pbnB1dC5mcmFtZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1ZpZGVvRW5jb2RlZER1cmF0aW9uVXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZlbmNvZGUuZHVyYXRpb25VcyI7CiAKIC8vIHRoZSBrQ29kZWNSZWNlbnQqIGZpZWxkcyBhcHBlYXIgb25seSBpbiBnZXRNZXRyaWNzKCkgcmVzdWx0cwogc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1JlY2VudExhdGVuY3lNYXggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJlY2VudC5tYXgiOyAgICAgIC8qIGluIHVzICovCkBAIC0xMjQsNiArMTY3LDEyIEBACiBzdGF0aWMgY29uc3QgY2hhciAqa0NvZGVjUmVjZW50TGF0ZW5jeUF2ZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50LmF2ZyI7ICAgICAgLyogaW4gdXMgKi8KIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZWNlbnRMYXRlbmN5Q291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJlY2VudC5uIjsKIHN0YXRpYyBjb25zdCBjaGFyICprQ29kZWNSZWNlbnRMYXRlbmN5SGlzdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucmVjZW50Lmhpc3QiOyAgICAvKiBpbiB1cyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1BsYXliYWNrRHVyYXRpb25TZWMgPQorICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnBsYXliYWNrLWR1cmF0aW9uLXNlYyI7IC8qIGluIHNlYyAqLworCisvKiAtMTogc2hhcGVyIGRpc2FibGVkCisgICA+PTA6IG51bWJlciBvZiBmaWVsZHMgY2hhbmdlZCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmtDb2RlY1NoYXBpbmdFbmhhbmNlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2hhcGVkIjsKIAogLy8gWFhYIHN1cHByZXNzIHVudGlsIHdlIGdldCBvdXIgcmVwcmVzZW50YXRpb24gcmlnaHQKIHN0YXRpYyBib29sIGtFbWl0SGlzdG9ncmFtID0gZmFsc2U7CkBAIC0yNTMsNiArMzAyLDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIEtpbGwgY2xpZW50cyBwZW5kaW5nIHJlbW92YWwuCisgICAgbVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKG1QaWQpOworCiAgICAgLy8gc28gb3VyIGhhbmRsZXIgd2lsbCBwcm9jZXNzIHRoZSBkZWF0aCBub3RpZmljYXRpb25zCiAgICAgYWRkQ29va2llKHRoaXMpOwogCkBAIC0zNTQsMTEgKzQwNiwyNCBAQAogICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CiAgICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCBmYWxzZSAvKiBjb250cm9sbGVkQnlBcHAgKi8pOwogICAgICAgICBzdHJ1Y3QgQ29uc3VtZXJMaXN0ZW5lciA6IHB1YmxpYyBCbkNvbnN1bWVyTGlzdGVuZXIgewotICAgICAgICAgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mKSBvdmVycmlkZSB7fQorICAgICAgICAgICAgQ29uc3VtZXJMaXN0ZW5lcihjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIpIHsKKyAgICAgICAgICAgICAgICBtQ29uc3VtZXIgPSBjb25zdW1lcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJikgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIEJ1ZmZlckl0ZW0gYnVmZmVyOworICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgYnVmZmVyCisgICAgICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXIgPSBtQ29uc3VtZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lciAhPSBudWxscHRyICYmIGNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZidWZmZXIsIDApID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlci5tU2xvdCwgYnVmZmVyLm1GcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgYnVmZmVyLm1GZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3cDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CiAgICAgICAgICAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGUge30KICAgICAgICAgICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZSB7fQogICAgICAgICB9OwotICAgICAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcntuZXcgQ29uc3VtZXJMaXN0ZW5lcn07CisgICAgICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVye25ldyBDb25zdW1lckxpc3RlbmVyKG1Db25zdW1lcil9OwogICAgICAgICBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChsaXN0ZW5lciwgZmFsc2UpOwogICAgICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShTdHJpbmc4eyJNZWRpYUNvZGVjLnJlbGVhc2UifSk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0Q29uc3VtZXJVc2FnZUJpdHModXNhZ2UpOwpAQCAtMzk0LDYgKzQ1OSw3IEBACiAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAogICAgIGtXaGF0T3V0cHV0RnJhbWVzUmVuZGVyZWQgPSAnb3V0UicsCiAgICAga1doYXRPdXRwdXRCdWZmZXJzQ2hhbmdlZCA9ICdvdXRDJywKKyAgICBrV2hhdEZpcnN0VHVubmVsRnJhbWVSZWFkeSA9ICdmdGZSJywKIH07CiAKIGNsYXNzIEJ1ZmZlckNhbGxiYWNrIDogcHVibGljIENvZGVjQmFzZTo6QnVmZmVyQ2FsbGJhY2sgewpAQCAtNDU2LDYgKzUyMiw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU2lnbmFsZWRJbnB1dEVPUyhzdGF0dXNfdCBlcnIpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGNvbnN0IHN0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+ICZkb25lKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0VHVubmVsRnJhbWVSZWFkeSgpIG92ZXJyaWRlOwogcHJpdmF0ZToKICAgICBjb25zdCBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIH07CkBAIC01NzYsNiArNjQzLDEyIEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKK3ZvaWQgQ29kZWNDYWxsYmFjazo6b25GaXJzdFR1bm5lbEZyYW1lUmVhZHkoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeShtTm90aWZ5LT5kdXAoKSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmlyc3RUdW5uZWxGcmFtZVJlYWR5KTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01ODQsMTIgKzY1NywyMCBAQAogc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAogICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCwKICAgICAgICAgdWlkX3QgdWlkKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICByZXR1cm4gQ3JlYXRlQnlUeXBlKGxvb3BlciwgbWltZSwgZW5jb2RlciwgZXJyLCBwaWQsIHVpZCwgZm9ybWF0KTsKK30KKworc3A8TWVkaWFDb2RlYz4gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIsIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CiAgICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOwogCiAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKICAgICAgICAgICAgIG1pbWUuY19zdHIoKSwKICAgICAgICAgICAgIGVuY29kZXIsCiAgICAgICAgICAgICAwLAorICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIGlmIChlcnIgIT0gTlVMTCkgewpAQCAtNjUxLDcgKzczMiwxMCBAQAogICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlclNvdXJjZSk7CiB9CiAKLU1lZGlhQ29kZWM6Ok1lZGlhQ29kZWMoY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpCitNZWRpYUNvZGVjOjpNZWRpYUNvZGVjKAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQsIHVpZF90IHVpZCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gZ2V0Q29kZWNCYXNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pCiAgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCiAgICAgICBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcihmYWxzZSksCiAgICAgICBtTG9vcGVyKGxvb3BlciksCkBAIC02NjgsMTUgKzc1MiwyNyBAQAogICAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQoMCksCiAgICAgICBtRGVxdWV1ZU91dHB1dFRpbWVvdXRHZW5lcmF0aW9uKDApLAogICAgICAgbURlcXVldWVPdXRwdXRSZXBseUlEKDApLAorICAgICAgbVR1bm5lbGVkSW5wdXRXaWR0aCgwKSwKKyAgICAgIG1UdW5uZWxlZElucHV0SGVpZ2h0KDApLAorICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKKyAgICAgIG1UdW5uZWxQZWVrU3RhdGUoVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyKSwKICAgICAgIG1IYXZlSW5wdXRTdXJmYWNlKGZhbHNlKSwKICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyhmYWxzZSksCiAgICAgICBtQ3B1Qm9vc3RSZXF1ZXN0ZWQoZmFsc2UpLAorICAgICAgbVBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcihuZXcgUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yKCkpLAorICAgICAgbUlzU3VyZmFjZVRvU2NyZWVuKGZhbHNlKSwKICAgICAgIG1MYXRlbmN5VW5rbm93bigwKSwKKyAgICAgIG1CeXRlc0VuY29kZWQoMCksCisgICAgICBtRWFybGllc3RFbmNvZGVkUHRzVXMoSU5UNjRfTUFYKSwKKyAgICAgIG1MYXRlc3RFbmNvZGVkUHRzVXMoSU5UNjRfTUlOKSwKKyAgICAgIG1GcmFtZXNFbmNvZGVkKDApLAogICAgICAgbU51bUxvd0xhdGVuY3lFbmFibGVzKDApLAogICAgICAgbU51bUxvd0xhdGVuY3lEaXNhYmxlcygwKSwKICAgICAgIG1Jc0xvd0xhdGVuY3lNb2RlT24oZmFsc2UpLAogICAgICAgbUluZGV4T2ZGaXJzdEZyYW1lV2hlbkxvd0xhdGVuY3lPbigtMSksCi0gICAgICBtSW5wdXRCdWZmZXJDb3VudGVyKDApIHsKKyAgICAgIG1JbnB1dEJ1ZmZlckNvdW50ZXIoMCksCisgICAgICBtR2V0Q29kZWNCYXNlKGdldENvZGVjQmFzZSksCisgICAgICBtR2V0Q29kZWNJbmZvKGdldENvZGVjSW5mbykgewogICAgIGlmICh1aWQgPT0ga05vVWlkKSB7CiAgICAgICAgIG1VaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CiAgICAgfSBlbHNlIHsKQEAgLTY4NCw2ICs3ODAsMzMgQEAKICAgICB9CiAgICAgbVJlc291cmNlTWFuYWdlclByb3h5ID0gbmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWQsIG1VaWQsCiAgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KHRoaXMpKTsKKyAgICBpZiAoIW1HZXRDb2RlY0Jhc2UpIHsKKyAgICAgICAgbUdldENvZGVjQmFzZSA9IFtdKGNvbnN0IEFTdHJpbmcgJm5hbWUsIGNvbnN0IGNoYXIgKm93bmVyKSB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q29kZWNCYXNlKG5hbWUsIG93bmVyKTsKKyAgICAgICAgfTsKKyAgICB9CisgICAgaWYgKCFtR2V0Q29kZWNJbmZvKSB7CisgICAgICAgIG1HZXRDb2RlY0luZm8gPSBbXShjb25zdCBBU3RyaW5nICZuYW1lLCBzcDxNZWRpYUNvZGVjSW5mbz4gKmluZm8pIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICppbmZvID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBpZiAoIW1jbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOyAgLy8gaWYgY2FsbGVkIGZyb20gSmF2YSBzaG91bGQgcmFpc2UgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTdHJpbmcgdG1wID0gbmFtZTsKKyAgICAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoIi5zZWN1cmUiKSkgeworICAgICAgICAgICAgICAgIHRtcC5lcmFzZSh0bXAuc2l6ZSgpIC0gNywgNyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSA6IHsgbmFtZSwgdG1wIH0pIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGNvZGVjSWR4ID0gbWNsLT5maW5kQ29kZWNCeU5hbWUoY29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChjb2RlY0lkeCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfTsKKyAgICB9CiAKICAgICBpbml0TWVkaWFtZXRyaWNzKCk7CiB9CkBAIC03NDQsMTIgKzg2NywzMCBAQAogICAgIGlmIChtTGF0ZW5jeVVua25vd24gPiAwKSB7CiAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjTGF0ZW5jeVVua25vd24sIG1MYXRlbmN5VW5rbm93bik7CiAgICAgfQorICAgIGludDY0X3QgcGxheWJhY2tEdXJhdGlvblNlYyA9IG1QbGF5YmFja0R1cmF0aW9uQWNjdW11bGF0b3ItPmdldER1cmF0aW9uSW5TZWNvbmRzKCk7CisgICAgaWYgKHBsYXliYWNrRHVyYXRpb25TZWMgPiAwKSB7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjUGxheWJhY2tEdXJhdGlvblNlYywgcGxheWJhY2tEdXJhdGlvblNlYyk7CisgICAgfQogICAgIGlmIChtTGlmZXRpbWVTdGFydE5zID4gMCkgewogICAgICAgICBuc2Vjc190IGxpZmV0aW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpIC0gbUxpZmV0aW1lU3RhcnROczsKICAgICAgICAgbGlmZXRpbWUgPSBsaWZldGltZSAvICgxMDAwICogMTAwMCk7ICAgIC8vIGVtaXR0ZWQgaW4gbXMsIHRydW5jYXRlZCBub3Qgcm91bmRlZAogICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xpZmV0aW1lTXMsIGxpZmV0aW1lKTsKICAgICB9CiAKKyAgICBpZiAobUJ5dGVzRW5jb2RlZCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobU91dHB1dFN0YXRzTG9jayk7CisKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNWaWRlb0VuY29kZWRCeXRlcywgbUJ5dGVzRW5jb2RlZCk7CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworICAgICAgICBpZiAobUxhdGVzdEVuY29kZWRQdHNVcyA+IG1FYXJsaWVzdEVuY29kZWRQdHNVcykgeworICAgICAgICAgICAgZHVyYXRpb24gPSBtTGF0ZXN0RW5jb2RlZFB0c1VzIC0gbUVhcmxpZXN0RW5jb2RlZFB0c1VzOworICAgICAgICB9CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjVmlkZW9FbmNvZGVkRHVyYXRpb25VcywgZHVyYXRpb24pOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1ZpZGVvRW5jb2RlZEZyYW1lcywgbUZyYW1lc0VuY29kZWQpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1ZpZGVvSW5wdXRGcmFtZXMsIG1GcmFtZXNJbnB1dCk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjVmlkZW9JbnB1dEJ5dGVzLCBtQnl0ZXNJbnB1dCk7CisgICAgfQorCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhdGVuY3lMb2NrKTsKICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNOdW1Mb3dMYXRlbmN5TW9kZU9uLCBtTnVtTG93TGF0ZW5jeUVuYWJsZXMpOwpAQCAtODI4LDYgKzk2OSw4NyBAQAogICAgIH0KIH0KIAorY29uc3RleHByIGNvbnN0IGNoYXIgKk1lZGlhQ29kZWM6OmFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZSBzdGF0ZSwgY29uc3QgY2hhciAqZGVmYXVsdF9zdHJpbmcpeworICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAiRW5hYmxlZE5vQnVmZmVyIjsKKyAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZE5vQnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICJEaXNhYmxlZE5vQnVmZmVyIjsKKyAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJEZWNvZGVkOgorICAgICAgICAgICAgcmV0dXJuICJCdWZmZXJEZWNvZGVkIjsKKyAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZDoKKyAgICAgICAgICAgIHJldHVybiAiQnVmZmVyUmVuZGVyZWQiOworICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0Rpc2FibGVkUXVldWVkOgorICAgICAgICAgICAgcmV0dXJuICJEaXNhYmxlZFF1ZXVlZCI7CisgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZFF1ZXVlZDoKKyAgICAgICAgICAgIHJldHVybiAiRW5hYmxlZFF1ZXVlZCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdF9zdHJpbmc7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZVR1bm5lbFBlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBpbnQzMl90IHR1bm5lbFBlZWsgPSAwOworICAgIGlmICghbXNnLT5maW5kSW50MzIoInR1bm5lbC1wZWVrIiwgJnR1bm5lbFBlZWspKXsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKKyAgICBpZih0dW5uZWxQZWVrID09IDApeworICAgICAgICBzd2l0Y2ggKG1UdW5uZWxQZWVrU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOgorICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZE5vQnVmZmVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkUXVldWVkOgorICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZFF1ZXVlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yaW5nIHR1bm5lbC1wZWVrPSVkIGZvciAlcyIsIHR1bm5lbFBlZWssIGFzU3RyaW5nKG1UdW5uZWxQZWVrU3RhdGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1UdW5uZWxQZWVrU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRGlzYWJsZWROb0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZFF1ZXVlZDoKKyAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZFF1ZXVlZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprQnVmZmVyRGVjb2RlZDoKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl90cmlnZ2VyLXR1bm5lbC1wZWVrIiwgMSk7CisgICAgICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0J1ZmZlclJlbmRlcmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JpbmcgdHVubmVsLXBlZWs9JWQgZm9yICVzIiwgdHVubmVsUGVlaywgYXNTdHJpbmcobVR1bm5lbFBlZWtTdGF0ZSkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksIGFzU3RyaW5nKG1UdW5uZWxQZWVrU3RhdGUpKTsKK30KKwordm9pZCBNZWRpYUNvZGVjOjp1cGRhdGVQbGF5YmFja0R1cmF0aW9uKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50IHdoYXQgPSAwOworICAgIG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpOworICAgIGlmIChtc2ctPndoYXQoKSAhPSBrV2hhdENvZGVjTm90aWZ5ICYmIHdoYXQgIT0ga1doYXRPdXRwdXRGcmFtZXNSZW5kZXJlZCkgeworICAgICAgICBzdGF0aWMgYm9vbCBsb2dnZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFsb2dnZWQpIHsKKyAgICAgICAgICAgIGxvZ2dlZCA9IHRydWU7CisgICAgICAgICAgICBBTE9HRSgidXBkYXRlUGxheWJhY2tEdXJhdGlvbjogZXhwZWN0ZWQga1doYXRPdXB1dEZyYW1lc1JlbmRlcmVkICglZCkiLCBtc2ctPndoYXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBQbGF5YmFjayBkdXJhdGlvbiBvbmx5IGNvdW50cyBpZiB0aGUgYnVmZmVycyBhcmUgZ29pbmcgdG8gdGhlIHNjcmVlbi4KKyAgICBpZiAoIW1Jc1N1cmZhY2VUb1NjcmVlbikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDY0X3QgcmVuZGVyVGltZU5zOworICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgd2hpbGUgKG1zZy0+ZmluZEludDY0KEFTdHJpbmdQcmludGYoIiV6dS1zeXN0ZW0tbmFubyIsIGluZGV4KyspLmNfc3RyKCksICZyZW5kZXJUaW1lTnMpKSB7CisgICAgICAgIG1QbGF5YmFja0R1cmF0aW9uQWNjdW11bGF0b3ItPnByb2Nlc3NSZW5kZXJUaW1lKHJlbmRlclRpbWVOcyk7CisgICAgfQorfQorCiBib29sIE1lZGlhQ29kZWM6Okhpc3RvZ3JhbTo6c2V0dXAoaW50IG5idWNrZXRzLCBpbnQ2NF90IHdpZHRoLCBpbnQ2NF90IGZsb29yKQogewogICAgIGlmIChuYnVja2V0cyA8PSAwIHx8IHdpZHRoIDw9IDApIHsKQEAgLTkxOSw3ICsxMTQxLDcgQEAKIH0KIAogLy8gd2hlbiB3ZSBzZW5kIGEgYnVmZmVyIHRvIHRoZSBjb2RlYzsKLXZvaWQgTWVkaWFDb2RlYzo6c3RhdHNCdWZmZXJTZW50KGludDY0X3QgcHJlc2VudGF0aW9uVXMpIHsKK3ZvaWQgTWVkaWFDb2RlYzo6c3RhdHNCdWZmZXJTZW50KGludDY0X3QgcHJlc2VudGF0aW9uVXMsIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKIAogICAgIC8vIG9ubHkgZW5xdWV1ZSBpZiB3ZSBoYXZlIGEgbGVnaXRpbWF0ZSB0aW1lCiAgICAgaWYgKHByZXNlbnRhdGlvblVzIDw9IDApIHsKQEAgLTkzMyw2ICsxMTU1LDExIEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIGlmIChtSXNWaWRlbyAmJiAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpKSB7CisgICAgICAgIG1CeXRlc0lucHV0ICs9IGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICBtRnJhbWVzSW5wdXQrKzsKKyAgICB9CisKICAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgIEJ1ZmZlckZsaWdodFRpbWluZ190IHN0YXJ0ZGF0YSA9IHsgcHJlc2VudGF0aW9uVXMsIG5vd05zIH07CiAKQEAgLTk1MywxMCArMTE4MCwzNCBAQAogfQogCiAvLyB3aGVuIHdlIGdldCBhIGJ1ZmZlciBiYWNrIGZyb20gdGhlIGNvZGVjCi12b2lkIE1lZGlhQ29kZWM6OnN0YXRzQnVmZmVyUmVjZWl2ZWQoaW50NjRfdCBwcmVzZW50YXRpb25Vcykgewordm9pZCBNZWRpYUNvZGVjOjpzdGF0c0J1ZmZlclJlY2VpdmVkKGludDY0X3QgcHJlc2VudGF0aW9uVXMsIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKIAogICAgIENIRUNLX05FKG1TdGF0ZSwgVU5JTklUSUFMSVpFRCk7CiAKKyAgICBpZiAobUlzVmlkZW8gJiYgKG1GbGFncyAmIGtGbGFnSXNFbmNvZGVyKSkgeworICAgICAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKKworICAgICAgICAvLyBzb21lIG9mIHRoZXNlIGZyYW1lcywgd2UgZG9uJ3Qgd2FudCB0byBjb3VudAorICAgICAgICAvLyBzdGFuZGFsb25lIEVPUy4uLi4gaGFzIGFuIGludmFsaWQgdGltZXN0YW1wCisgICAgICAgIGlmICgoZmxhZ3MgJiAoQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUd8QlVGRkVSX0ZMQUdfRU9TKSkgPT0gMCkgeworICAgICAgICAgICAgbUJ5dGVzRW5jb2RlZCArPSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIG1GcmFtZXNFbmNvZGVkKys7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtT3V0cHV0U3RhdHNMb2NrKTsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gMDsKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSkgeworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPiBtTGF0ZXN0RW5jb2RlZFB0c1VzKSB7CisgICAgICAgICAgICAgICAgICAgIG1MYXRlc3RFbmNvZGVkUHRzVXMgPSB0aW1lVXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNhbid0IGNoYWluIGFzIGFuIGVsc2UtaWYgb3IgdGhpcyBuZXZlciB0cmlnZ2VycworICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtRWFybGllc3RFbmNvZGVkUHRzVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUVhcmxpZXN0RW5jb2RlZFB0c1VzID0gdGltZVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIG11dGV4IGFjY2VzcyB0byBtQnVmZmVyc0luRmxpZ2h0IGFuZCBvdGhlciBzdGF0cwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZW5jeUxvY2spOwogCkBAIC0xMDEyLDcgKzEyNjMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gbm93TnMgc3RhcnQgb3VyIGNhbGN1bGF0aW9ucworICAgIC8vIG5vdyBzdGFydCBvdXIgY2FsY3VsYXRpb25zCiAgICAgY29uc3QgaW50NjRfdCBub3dOcyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKICAgICBpbnQ2NF90IGxhdGVuY3lVcyA9IChub3dOcyAtIHN0YXJ0ZGF0YS5zdGFydGVkTnMgKyA1MDApIC8gMTAwMDsKIApAQCAtMTA0NSw2ICsxMjk2LDEyIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgZXJyKSB7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBlcnIpOworfQorCiB2b2lkIE1lZGlhQ29kZWM6OlBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGludDMyX3QgZXJyKSB7CiAgICAgaW50MzJfdCBmaW5hbEVyciA9IGVycjsKICAgICBpZiAobVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKQEAgLTExMjEsNDAgKzEzNzgsMzAgQEAKICAgICBib29sIHNlY3VyZUNvZGVjID0gZmFsc2U7CiAgICAgY29uc3QgY2hhciAqb3duZXIgPSAiIjsKICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aCgiYW5kcm9pZC5maWx0ZXIuIikpIHsKLSAgICAgICAgQVN0cmluZyB0bXAgPSBuYW1lOwotICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCIuc2VjdXJlIikpIHsKLSAgICAgICAgICAgIHNlY3VyZUNvZGVjID0gdHJ1ZTsKLSAgICAgICAgICAgIHRtcC5lcmFzZSh0bXAuc2l6ZSgpIC0gNywgNyk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKG1jbCA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1HZXRDb2RlY0luZm8obmFtZSwgJm1Db2RlY0luZm8pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBtQ29kZWMgPSBOVUxMOyAgLy8gcmVtb3ZlIHRoZSBjb2RlYy4KLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOyAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgotICAgICAgICB9Ci0gICAgICAgIGZvciAoY29uc3QgQVN0cmluZyAmY29kZWNOYW1lIDogeyBuYW1lLCB0bXAgfSkgewotICAgICAgICAgICAgc3NpemVfdCBjb2RlY0lkeCA9IG1jbC0+ZmluZENvZGVjQnlOYW1lKGNvZGVjTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIGlmIChjb2RlY0lkeCA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db2RlY0luZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7Ci0gICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKLSAgICAgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Db2RlY0luZm8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkdldHRpbmcgY29kZWMgaW5mbyB3aXRoIG5hbWUgJyVzJyBmYWlsZWQiLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgICAgICB9CisgICAgICAgIHNlY3VyZUNvZGVjID0gbmFtZS5lbmRzV2l0aCgiLnNlY3VyZSIpOworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZXNbaV0uc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICBtSXNWaWRlbyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgb3duZXIgPSBtQ29kZWNJbmZvLT5nZXRPd25lck5hbWUoKTsKICAgICB9CiAKLSAgICBtQ29kZWMgPSBHZXRDb2RlY0Jhc2UobmFtZSwgb3duZXIpOworICAgIG1Db2RlYyA9IG1HZXRDb2RlY0Jhc2UobmFtZSwgb3duZXIpOwogICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiR2V0dGluZyBjb2RlYyBiYXNlIHdpdGggbmFtZSAnJXMnIChvd25lcj0nJXMnKSBmYWlsZWQiLCBuYW1lLmNfc3RyKCksIG93bmVyKTsKICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgIH0KIApAQCAtMTIzMyw2ICsxNDgwLDIxIEBACiAgICAgcmV0dXJuIG1zZy0+cG9zdCgpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzZXRPbkZpcnN0VHVubmVsRnJhbWVSZWFkeU5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXROb3RpZmljYXRpb24sIHRoaXMpOworICAgIG1zZy0+c2V0TWVzc2FnZSgiZmlyc3QtdHVubmVsLWZyYW1lLXJlYWR5Iiwgbm90aWZ5KTsKKyAgICByZXR1cm4gbXNnLT5wb3N0KCk7Cit9CisKKy8qCisgKiBNZWRpYUZvcm1hdCBTaGFwaW5nIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKiBpbmNsdWRpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2UgdXNlIGZvciBjb250cm9sLgorICovCitzdGF0aWMgaW50IGVuYWJsZU1lZGlhRm9ybWF0U2hhcGluZ0RlZmF1bHQgPSAxOworc3RhdGljIGNvbnN0IGNoYXIgZW5hYmxlTWVkaWFGb3JtYXRTaGFwaW5nUHJvcGVydHlbXSA9ICJkZWJ1Zy5zdGFnZWZyaWdodC5lbmFibGVzaGFwaW5nIjsKK3N0YXRpYyB2b2lkIG1hcEZvcm1hdChBU3RyaW5nIGNvbXBvbmVudE5hbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBjaGFyICpraW5kLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV2ZXJzZSk7CisKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNvbmZpZ3VyZSgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZuYXRpdmVXaW5kb3csCkBAIC0xMjYzLDYgKzE1MjUsOCBAQAogICAgIH0KIAogICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAvLyBUT0RPOiB2YWxpZGl0eSBjaGVjayBsb2ctc2Vzc2lvbi1pZDogaXQgc2hvdWxkIGJlIGEgMzItaGV4LWRpZ2l0LgorICAgICAgICBmb3JtYXQtPmZpbmRTdHJpbmcoImxvZy1zZXNzaW9uLWlkIiwgJm1Mb2dTZXNzaW9uSWQpOwogICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmbVZpZGVvV2lkdGgpOwogICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1WaWRlb0hlaWdodCk7CiAgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmbVJvdGF0aW9uRGVncmVlcykpIHsKQEAgLTEyNzAsNiArMTUzNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xvZ1Nlc3Npb25JZCwgbUxvZ1Nlc3Npb25JZC5jX3N0cigpKTsKICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjV2lkdGgsIG1WaWRlb1dpZHRoKTsKICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjSGVpZ2h0LCBtVmlkZW9IZWlnaHQpOwogICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNSb3RhdGlvbiwgbVJvdGF0aW9uRGVncmVlcyk7CkBAIC0xMjgxLDYgKzE1NDYsMjYgQEAKICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigibWF4LWhlaWdodCIsICZtYXhIZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNYXhIZWlnaHQsIG1heEhlaWdodCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gLTE7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAtMS4wOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdCBjYXB0dXJlUmF0ZSA9IC0xLjA7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kRmxvYXQoImNhcHR1cmUtcmF0ZSIsICZjYXB0dXJlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDYXB0dXJlUmF0ZSwgY2FwdHVyZVJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgb3BlcmF0aW5nUmF0ZSA9IC0xLjA7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJm9wZXJhdGluZ1JhdGUpKSB7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtTWV0cmljc0hhbmRsZSwga0NvZGVjT3BlcmF0aW5nUmF0ZSwgb3BlcmF0aW5nUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7CisgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInByaW9yaXR5IiwgJnByaW9yaXR5KSkgeworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUHJpb3JpdHksIHByaW9yaXR5KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFByZXZlbnQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBkb3duc3RyZWFtIGNvZGUuCkBAIC0xMjg5LDYgKzE1NzQsNjEgQEAKICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNpemUocyksIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtTWV0cmljc0hhbmRsZSAhPSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0NoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBDT05GSUdVUkVfRkxBR19FTkNPREUpIHsKKyAgICAgICAgaW50OF90IGVuYWJsZVNoYXBpbmcgPSBwcm9wZXJ0eV9nZXRfYm9vbChlbmFibGVNZWRpYUZvcm1hdFNoYXBpbmdQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZWRpYUZvcm1hdFNoYXBpbmdEZWZhdWx0KTsKKyAgICAgICAgaWYgKCFlbmFibGVTaGFwaW5nKSB7CisgICAgICAgICAgICBBTE9HSSgiZm9ybWF0IHNoYXBpbmcgZGlzYWJsZWQsIHByb3BlcnR5ICclcyciLCBlbmFibGVNZWRpYUZvcm1hdFNoYXBpbmdQcm9wZXJ0eSk7CisgICAgICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjU2hhcGluZ0VuaGFuY2VkLCAtMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAodm9pZCkgc2hhcGVNZWRpYUZvcm1hdChmb3JtYXQsIGZsYWdzKTsKKyAgICAgICAgICAgIC8vIFhYWDogZG8gd2Ugd2FudCB0byBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygc2hhcGluZyBlbmFibGVtZW50PworICAgICAgICAgICAgbWFwRm9ybWF0KG1Db21wb25lbnROYW1lLCBmb3JtYXQsIG51bGxwdHIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHB1c2ggbWluL21heCBRUCB0byBNZWRpYU1ldHJpY3MgYWZ0ZXIgc2hhcGluZworICAgIGlmIChtSXNWaWRlbyAmJiBtTWV0cmljc0hhbmRsZSAhPSAwKSB7CisgICAgICAgIGludDMyX3QgcXBJTWluID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigidmlkZW8tcXAtaS1taW4iLCAmcXBJTWluKSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQSU1pbiwgcXBJTWluKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHFwSU1heCA9IC0xOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInZpZGVvLXFwLWktbWF4IiwgJnFwSU1heCkpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUmVxdWVzdGVkVmlkZW9RUElNYXgsIHFwSU1heCk7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBxcFBNaW4gPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJ2aWRlby1xcC1wLW1pbiIsICZxcFBNaW4pKSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JlcXVlc3RlZFZpZGVvUVBQTWluLCBxcFBNaW4pOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgcXBQTWF4ID0gLTE7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigidmlkZW8tcXAtcC1tYXgiLCAmcXBQTWF4KSkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNSZXF1ZXN0ZWRWaWRlb1FQUE1heCwgcXBQTWF4KTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHFwQk1pbiA9IC0xOworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInZpZGVvLXFwLWItbWluIiwgJnFwQk1pbikpIHsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjUmVxdWVzdGVkVmlkZW9RUEJNaW4sIHFwQk1pbik7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBxcEJNYXggPSAtMTsKKyAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJ2aWRlby1xcC1iLW1heCIsICZxcEJNYXgpKSB7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JlcXVlc3RlZFZpZGVvUVBCTWF4LCBxcEJNYXgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdXBkYXRlTG93TGF0ZW5jeShmb3JtYXQpOwpAQCAtMTMxMyw2ICsxNjUzLDggQEAKICAgICAvLyBzYXZlIG1zZyBmb3IgcmVzZXQKICAgICBtQ29uZmlndXJlTXNnID0gbXNnOwogCisgICAgc3A8QU1lc3NhZ2U+IGNhbGxiYWNrID0gbUNhbGxiYWNrOworCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKQEAgLTEzMjAsMTYgKzE2NjIsMTIgQEAKICAgICAvLyB0aGUgcmVjbGFpbVJlc291cmNlIGNhbGwgZG9lc24ndCBjb25zaWRlciB0aGUgcmVxdWVzdGVyJ3MgYnVmZmVyIHNpemUgZm9yIG5vdy4KICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkdyYXBoaWNNZW1vcnlSZXNvdXJjZSgxKSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0ga01heFJldHJ5OyArK2kpIHsKLSAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gcmVjbGFpbSByZXNvdXJjZSBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gICAgICAgICAgICBpZiAoIW1SZXNvdXJjZU1hbmFnZXJQcm94eS0+cmVjbGFpbVJlc291cmNlKHJlc291cmNlcykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICAgICAgZXJyID0gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICAgICAgaWYgKGlzUmVzb3VyY2VFcnJvcihlcnIpICYmICFtUmVzb3VyY2VNYW5hZ2VyUHJveHktPnJlY2xhaW1SZXNvdXJjZShyZXNvdXJjZXMpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG5vdyBzZXQgc3RhdGUgdG8gVU5JTklUSUFMSVpFRCB1cG9uIGFueSBmYXRhbCBlcnJvci4KICAgICAgICAgICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHksIGRvIGEgcmVzZXQoKSB0byBwdXQgY29kZWMKICAgICAgICAgICAgIC8vIGJhY2sgaW50byBJTklUSUFMSVpFRCBzdGF0ZS4KQEAgLTEzMzcsNyArMTY3NSwxOCBAQAogICAgICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZSBmYWlsdXJlIGlzIGR1ZSB0byB3cm9uZyBzdGF0ZS4KIAogICAgICAgICAgICAgQUxPR0UoImNvbmZpZ3VyZSBmYWlsZWQgd2l0aCBlcnIgMHglMDh4LCByZXNldHRpbmcuLi4iLCBlcnIpOwotICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjIgPSByZXNldCgpOworICAgICAgICAgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgicmV0cnlpbmcgY29uZmlndXJlOiBmYWlsZWQgdG8gcmVzZXQgY29kZWMgKCUwOHgpIiwgZXJyMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGVycjIgPSBzZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInJldHJ5aW5nIGNvbmZpZ3VyZTogZmFpbGVkIHRvIHNldCBjYWxsYmFjayAoJTA4eCkiLCBlcnIyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghaXNSZXNvdXJjZUVycm9yKGVycikpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTM0Nyw2ICsxNjk2LDQ2NSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKKy8vIE1lZGlhIEZvcm1hdCBTaGFwaW5nIHN1cHBvcnQKKy8vCisKK3N0YXRpYyBhbmRyb2lkOjptZWRpYWZvcm1hdHNoYXBlcjo6Rm9ybWF0U2hhcGVyT3BzX3QgKnNTaGFwZXJPcHMgPSBOVUxMOworc3RhdGljIGJvb2wgc0lzSGFuZGhlbGQgPSB0cnVlOworCitzdGF0aWMgYm9vbCBjb25uZWN0Rm9ybWF0U2hhcGVyKCkgeworICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBzQ2hlY2tPbmNlOworCisgICAgQUxPR1YoImNvbm5lY3RGb3JtYXRTaGFwZXIuLi4iKTsKKworICAgIHN0ZDo6Y2FsbF9vbmNlKHNDaGVja09uY2UsIFsmXSgpeworCisgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IE5VTEw7CisgICAgICAgIG5zZWNzX3QgbG9hZGluZ19zdGFydGVkID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworCisgICAgICAgIC8vIHByZWZlciBhbnkgY29weSBpbiB0aGUgbWFpbmxpbmUgbW9kdWxlCisgICAgICAgIC8vCisgICAgICAgIGFuZHJvaWRfbmFtZXNwYWNlX3QgKm1lZGlhTnMgPSBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UoImNvbV9hbmRyb2lkX21lZGlhIik7CisgICAgICAgIEFTdHJpbmcgbGlicmFyeU5hbWUgPSAibGlibWVkaWFmb3JtYXRzaGFwZXIuc28iOworCisgICAgICAgIGlmIChtZWRpYU5zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyBkbGV4dGluZm8gPSB7CisgICAgICAgICAgICAgICAgLmZsYWdzID0gQU5EUk9JRF9ETEVYVF9VU0VfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IG1lZGlhTnMsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBBU3RyaW5nIGxpYnJhcnlNYWlubGluZSA9ICIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS8iOworI2lmIF9fTFA2NF9fCisgICAgICAgICAgICBsaWJyYXJ5TWFpbmxpbmUuYXBwZW5kKCJsaWI2NC8iKTsKKyNlbHNlCisgICAgICAgICAgICBsaWJyYXJ5TWFpbmxpbmUuYXBwZW5kKCJsaWIvIik7CisjZW5kaWYKKyAgICAgICAgICAgIGxpYnJhcnlNYWlubGluZS5hcHBlbmQobGlicmFyeU5hbWUpOworCisgICAgICAgICAgICBsaWJIYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQobGlicmFyeU1haW5saW5lLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRsZXh0aW5mbyk7CisKKyAgICAgICAgICAgIGlmIChsaWJIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNTaGFwZXJPcHMgPSAoYW5kcm9pZDo6bWVkaWFmb3JtYXRzaGFwZXI6OkZvcm1hdFNoYXBlck9wc190KikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGxzeW0obGliSGFuZGxlLCAic2hhcGVyX29wcyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY29ubmVjdEZvcm1hdFNoYXBlcjogdW5hYmxlIHRvIGxvYWQgbWFpbmxpbmUgZm9ybWF0c2hhcGVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5TWFpbmxpbmUuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiY29ubmVjdEZvcm1hdFNoYXBlcjogY291bGRuJ3QgZmluZCBtZWRpYSBuYW1lc3BhY2UuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIHN5c3RlbSBwYXJ0aXRpb24sIGlmIHByZXNlbnQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzU2hhcGVyT3BzID09IE5VTEwpIHsKKworICAgICAgICAgICAgbGliSGFuZGxlID0gZGxvcGVuKGxpYnJhcnlOYW1lLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOworCisgICAgICAgICAgICBpZiAobGliSGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzU2hhcGVyT3BzID0gKGFuZHJvaWQ6Om1lZGlhZm9ybWF0c2hhcGVyOjpGb3JtYXRTaGFwZXJPcHNfdCopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRsc3ltKGxpYkhhbmRsZSwgInNoYXBlcl9vcHMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvbm5lY3RGb3JtYXRTaGFwZXI6IHVuYWJsZSB0byBsb2FkIGZvcm1hdHNoYXBlciAlcyIsIGxpYnJhcnlOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNTaGFwZXJPcHMgIT0gbnVsbHB0cgorICAgICAgICAgICAgJiYgc1NoYXBlck9wcy0+dmVyc2lvbiAhPSBhbmRyb2lkOjptZWRpYWZvcm1hdHNoYXBlcjo6U0hBUEVSX1ZFUlNJT05fVjEpIHsKKyAgICAgICAgICAgIEFMT0dXKCJjb25uZWN0Rm9ybWF0U2hhcGVyOiB1bmhhbmRsZWQgdmVyc2lvbiBTaGFwZXJPcHM6ICVkLCBESVNBQkxFRCIsCisgICAgICAgICAgICAgICAgICBzU2hhcGVyT3BzLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIHNTaGFwZXJPcHMgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNTaGFwZXJPcHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR1YoImNvbm5lY3RGb3JtYXRTaGFwZXI6IGNvbm5lY3RlZCB0byBsaWJyYXJ5ICVzIiwgbGlicmFyeU5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IGxvYWRpbmdfZmluaXNoZWQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgIEFMT0dWKCJjb25uZWN0Rm9ybWF0U2hhcGVyOiBsb2FkZWQgbGlicmFyaWVzOiAlIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgIChsb2FkaW5nX2ZpbmlzaGVkIC0gbG9hZGluZ19zdGFydGVkKS8xMDAwKTsKKworCisgICAgICAgIC8vIHdlIGFsc28gd2FudCB0byBrbm93IHdoZXRoZXIgdGhpcyBpcyBhIGhhbmRoZWxkIGRldmljZQorICAgICAgICAvLyBzdGFydCB3aXRoIGFzc3VtcHRpb24gdGhhdCB0aGUgZGV2aWNlIGlzIGhhbmRoZWxkLgorICAgICAgICBzSXNIYW5kaGVsZCA9IHRydWU7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1nciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlTWdyOworICAgICAgICBpZiAoc2VydmljZU1nci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzZXJ2aWNlTWdyLT53YWl0Rm9yU2VydmljZShTdHJpbmcxNigicGFja2FnZV9uYXRpdmUiKSk7CisgICAgICAgICAgICBwYWNrYWdlTWdyID0gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IHNlcnZpY2VNZ3IsIHdlJ2xsIGxlYXZlIHBhY2thZ2VNZ3IgYXMgZGVmYXVsdCBudWxsCisgICAgICAgIGlmIChwYWNrYWdlTWdyICE9IG51bGxwdHIpIHsKKworICAgICAgICAgICAgLy8gTVVTVCBoYXZlIHRoZXNlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgZmVhdHVyZXNOZWVkZWRbXSA9IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbiIpCisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gdGhlc2UgbXVzdCBiZSBwcmVzZW50IHRvIGJlIGEgaGFuZGhlbGQKKyAgICAgICAgICAgIGZvciAoOjphbmRyb2lkOjpTdHJpbmcxNiByZXF1aXJlZCA6IGZlYXR1cmVzTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNGZWF0dXJlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gcGFja2FnZU1nci0+aGFzU3lzdGVtRmVhdHVyZShyZXF1aXJlZCwgMCwgJmhhc0ZlYXR1cmUpOworICAgICAgICAgICAgICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGhhc1N5c3RlbUZlYXR1cmUgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLmV4Y2VwdGlvbk1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJmZWF0dXJlICVzIHNheXMgJWQiLCBTdHJpbmc4KHJlcXVpcmVkKS5jX3N0cigpLCBoYXNGZWF0dXJlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0ZlYXR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIi4uLiB3aGljaCBtZWFucyB3ZSBhcmUgbm90IGhhbmRoZWxkIik7CisgICAgICAgICAgICAgICAgICAgIHNJc0hhbmRoZWxkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTVVTVCBOT1QgaGF2ZSB0aGVzZQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IGZlYXR1cmVzRGlzYWxsb3dlZFtdID0geworICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUuYXV0b21vdGl2ZSIpLAorICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUudGVsZXZpc2lvbiIpLAorICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLmhhcmR3YXJlLnR5cGUud2F0Y2giKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIC8vIGFueSBvZiB0aGVzZSBwcmVzZW50IC0tIHdlIGFyZW4ndCBhIGhhbmRoZWxkCisgICAgICAgICAgICBmb3IgKDo6YW5kcm9pZDo6U3RyaW5nMTYgZm9yYmlkZGVuIDogZmVhdHVyZXNEaXNhbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgYm9vbCBoYXNGZWF0dXJlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gcGFja2FnZU1nci0+aGFzU3lzdGVtRmVhdHVyZShmb3JiaWRkZW4sIDAsICZoYXNGZWF0dXJlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBoYXNTeXN0ZW1GZWF0dXJlIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiZmVhdHVyZSAlcyBzYXlzICVkIiwgU3RyaW5nOChmb3JiaWRkZW4pLmNfc3RyKCksIGhhc0ZlYXR1cmUpOworICAgICAgICAgICAgICAgIGlmIChoYXNGZWF0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIuLi4gd2hpY2ggbWVhbnMgd2UgYXJlIG5vdCBoYW5kaGVsZCIpOworICAgICAgICAgICAgICAgICAgICBzSXNIYW5kaGVsZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworI2lmIDAKKy8vIGEgY29uc3RydWN0IHRvIGZvcmNlIHRoZSBhYm92ZSBkbG9wZW4oKSB0byBydW4gdmVyeSBlYXJseS4KKy8vIGdvYWw6IHNvIHRoZSBkbG9wZW4oKSBkb2Vzbid0IGhhcHBlbiBvbiBjcml0aWNhbCBwYXRoIG9mIGxhdGVuY3kgc2Vuc2l0aXZlIGFwcHMKKy8vIGZhaWx1cmUgb2YgdGhpcyBtZWFucyB0aGF0IGNvbGQgc3RhcnQgb2YgdGhvc2UgYXBwcyBpcyBzbG93ZXIgYnkgdGhlIHRpbWUgdG8gZGxvcGVuKCkKKy8vIFRPRE8oYi8xODM0NTQwNjYpOiB0cmFkZW9mZnMgYmV0d2VlbiBtZW1vcnkgb2YgZWFybHkgbG9hZGluZyB2cyBsYXRlbmN5IG9mIGxhdGUgbG9hZGluZworLy8KK3N0YXRpYyBib29sIGZvcmNlRWFybHlMb2FkaW5nU2hhcGVyID0gY29ubmVjdEZvcm1hdFNoYXBlcigpOworI2VuZGlmCisKKy8vIHBhcnNlIHRoZSBjb2RlYydzIHByb3BlcnRpZXM6IG1hcHBpbmcsIHdoZXRoZXIgaXQgbWVldHMgbWluIHF1YWxpdHksIGV0YworLy8gYW5kIHBhc3MgdGhlbSBpbnRvIHRoZSB2aWRlbyBxdWFsaXR5IGNvZGUKKy8vCitzdGF0aWMgdm9pZCBsb2FkQ29kZWNQcm9wZXJ0aWVzKG1lZGlhZm9ybWF0c2hhcGVyOjpzaGFwZXJIYW5kbGVfdCBzaGFwZXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGNvZGVjSW5mbywgQVN0cmluZyBtZWRpYVR5cGUpIHsKKworICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllcyA9CisgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBpZiAoY2FwYWJpbGl0aWVzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0koIm5vIGNhcGFiaWxpdGllcyBhcyBwYXJ0IG9mIHRoZSBjb2RlYz8iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmRldGFpbHMgPSBjYXBhYmlsaXRpZXMtPmdldERldGFpbHMoKTsKKyAgICAgICAgQVN0cmluZyBtYXBUYXJnZXQ7CisgICAgICAgIGludCBjb3VudCA9IGRldGFpbHMtPmNvdW50RW50cmllcygpOworICAgICAgICBmb3IoaW50IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgeworICAgICAgICAgICAgQU1lc3NhZ2U6OlR5cGUgZW50cnlUeXBlOworICAgICAgICAgICAgY29uc3QgY2hhciAqbWFwU3JjID0gZGV0YWlscy0+Z2V0RW50cnlOYW1lQXQoaXgsICZlbnRyeVR5cGUpOworICAgICAgICAgICAgLy8gWFhYOiByZS11c2UgaXggZnJvbSBnZXRFbnRyeUF0KCkgdG8gYXZvaWQgYWRkaXRpb25hbCBmaW5kWFhYKCkgaW52b2NhdGlvbgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpmZWF0dXJlUHJlZml4ID0gImZlYXR1cmUtIjsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgZmVhdHVyZVByZWZpeExlbiA9IHN0cmxlbihmZWF0dXJlUHJlZml4KTsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICp0dW5pbmdQcmVmaXggPSAidHVuaW5nLSI7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHR1bmluZ1ByZWZpeExlbiA9IHN0cmxlbih0dW5pbmdQcmVmaXgpOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm1hcHBpbmdQcmVmaXggPSAibWFwcGluZy0iOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBtYXBwaW5nUHJlZml4TGVuID0gc3RybGVuKG1hcHBpbmdQcmVmaXgpOworCisgICAgICAgICAgICBpZiAobWFwU3JjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWFwU3JjLCBmZWF0dXJlUHJlZml4LCBmZWF0dXJlUHJlZml4TGVuKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgaW50VmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGRldGFpbHMtPmZpbmRJbnQzMihtYXBTcmMsICZpbnRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIi0tIGZlYXR1cmUgJyVzJyAtPiAlZCIsIG1hcFNyYywgaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAodm9pZCkoc1NoYXBlck9wcy0+c2V0RmVhdHVyZSkoc2hhcGVySGFuZGxlLCAmbWFwU3JjW2ZlYXR1cmVQcmVmaXhMZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50VmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWFwU3JjLCB0dW5pbmdQcmVmaXgsIHR1bmluZ1ByZWZpeExlbikpIHsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzLT5maW5kU3RyaW5nKG1hcFNyYywgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiLS0gdHVuaW5nICclcycgLT4gJyVzJyIsIG1hcFNyYywgdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKShzU2hhcGVyT3BzLT5zZXRUdW5pbmcpKHNoYXBlckhhbmRsZSwgJm1hcFNyY1t0dW5pbmdQcmVmaXhMZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChtYXBTcmMsIG1hcHBpbmdQcmVmaXgsIG1hcHBpbmdQcmVmaXhMZW4pKSB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB0YXJnZXQ7CisgICAgICAgICAgICAgICAgaWYgKGRldGFpbHMtPmZpbmRTdHJpbmcobWFwU3JjLCAmdGFyZ2V0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiLS0gbWFwcGluZyAlczogbWFwICVzIHRvICVzIiwgbWFwU3JjLCAmbWFwU3JjW21hcHBpbmdQcmVmaXhMZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGtleSBpcyByZWFsbHkgImtpbmQta2V5IgorICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0ZSB0aGF0LCBzbyBzZXRNYXAoKSBzZWVzIHRoZSB0cmlwbGUgIGtpbmQsIGtleSwgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2luZCA9ICZtYXBTcmNbbWFwcGluZ1ByZWZpeExlbl07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlcCA9IHN0cmNocihraW5kLCAnLScpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXkgPSBzZXArMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGtpbmQgPSBzdGQ6OnN0cmluZyhraW5kLCBzZXAta2luZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkoc1NoYXBlck9wcy0+c2V0TWFwKShzaGFwZXJIYW5kbGUsIHhraW5kLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIHRhcmdldC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGFsc28gY2FycnkgaW4gdGhlIGNvZGVjIGRlc2NyaXB0aW9uIHdoZXRoZXIgd2UgYXJlIG9uIGEgaGFuZGhlbGQgZGV2aWNlLgorICAgIC8vIHRoaXMgaW5mbyBpcyBldmVudHVhbGx5IHVzZWQgYnkgYm90aCB0aGUgQ29kZWMgYW5kIHRoZSBDMiBtYWNoaW5lcnkgdG8gaW5mb3JtCisgICAgLy8gdGhlIHVuZGVybHlpbmcgY29kZWMgd2hldGhlciB0byBkbyBhbnkgc2hhcGluZy4KKyAgICAvLworICAgIGlmIChzSXNIYW5kaGVsZCkgeworICAgICAgICAvLyBzZXQgaWYgd2UgYXJlIGluZGVlZCBhIGhhbmRoZWxkIGRldmljZSAob3IgaW4gZnV0dXJlICdhbnkgZWxpZ2libGUgZGV2aWNlJworICAgICAgICAvLyBtaXNzaW5nIG9uIGRldmljZXMgdGhhdCBhcmVuJ3QgZWxpZ2libGUgZm9yIG1pbmltdW0gcXVhbGl0eSBlbmZvcmNlbWVudC4KKyAgICAgICAgKHZvaWQpKHNTaGFwZXJPcHMtPnNldEZlYXR1cmUpKHNoYXBlckhhbmRsZSwgIl92cV9lbGlnaWJsZS5kZXZpY2UiLCAxKTsKKyAgICAgICAgLy8gc3RyaWN0bHkgc3BlYWtpbmcsIGl0J3MgYSB0dW5pbmcsIGJ1dCB0aG9zZSBhcmUgc3RyaW5ncyBhbmQgZmVhdHVyZSBzdG9yZXMgaW50CisgICAgICAgICh2b2lkKShzU2hhcGVyT3BzLT5zZXRGZWF0dXJlKShzaGFwZXJIYW5kbGUsICJfcXVhbGl0eS50YXJnZXQiLCAxIC8qIFNfSEFOREhFTEQgKi8pOworICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6c2V0dXBGb3JtYXRTaGFwZXIoQVN0cmluZyBtZWRpYVR5cGUpIHsKKyAgICBBTE9HVigic2V0dXBGb3JtYXRTaGFwZXI6IGluaXRpYWxpemluZyBzaGFwZXIgZGF0YSBmb3IgY29kZWMgJXMgbWVkaWFUeXBlICVzIiwKKyAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtZWRpYVR5cGUuY19zdHIoKSk7CisKKyAgICBuc2Vjc190IG1hcHBpbmdfc3RhcnRlZCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKworICAgIC8vIHNvbWVvbmUgbWlnaHQgaGF2ZSBiZWF0ZW4gdXMgdG8gaXQuCisgICAgbWVkaWFmb3JtYXRzaGFwZXI6OnNoYXBlckhhbmRsZV90IHNoYXBlckhhbmRsZTsKKyAgICBzaGFwZXJIYW5kbGUgPSBzU2hhcGVyT3BzLT5maW5kU2hhcGVyKG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBpZiAoc2hhcGVySGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoInNoYXBlcmhhbmRsZSAlcCAtLSBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQiLCBzaGFwZXJIYW5kbGUpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gd2UgZ2V0IHRvIGJ1aWxkICYgcmVnaXN0ZXIgb25lCisgICAgc2hhcGVySGFuZGxlID0gc1NoYXBlck9wcy0+Y3JlYXRlU2hhcGVyKG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBpZiAoc2hhcGVySGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coInVuYWJsZSB0byBjcmVhdGUgYSBzaGFwZXIgZm9yIGNvY29kZWMgJXMgbWVkaWFUeXBlICVzIiwKKyAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgKHZvaWQpIGxvYWRDb2RlY1Byb3BlcnRpZXMoc2hhcGVySGFuZGxlLCBtQ29kZWNJbmZvLCBtZWRpYVR5cGUpOworCisgICAgc2hhcGVySGFuZGxlID0gc1NoYXBlck9wcy0+cmVnaXN0ZXJTaGFwZXIoc2hhcGVySGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKworICAgIG5zZWNzX3QgbWFwcGluZ19maW5pc2hlZCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICBBTE9HVigic2V0dXBGb3JtYXRTaGFwZXI6IHBvcHVsYXRlZCBzaGFwZXIgbm9kZSBmb3IgY29kZWMgJXM6ICUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAobWFwcGluZ19maW5pc2hlZCAtIG1hcHBpbmdfc3RhcnRlZCkvMTAwMCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKworLy8gRm9ybWF0IFNoYXBpbmcKKy8vICAgICAgTWFwcGluZyBhbmQgTWFuaXB1bGF0aW9uIG9mIGVuY29kaW5nIHBhcmFtZXRlcnMKKy8vCisvLyAgICAgIEFsbCBvZiB0aGVzZSBkZWNpc2lvbnMgYXJlIHB1c2hlZCBpbnRvIHRoZSBzaGFwZXIgaW5zdGVhZCBvZiBoZXJlIHdpdGhpbiBNZWRpYUNvZGVjLgorLy8gICAgICB0aGlzIGluY2x1ZGVzIGRlY2lzaW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjb2RlYyBpbXBsZW1lbnRzIG1pbmltdW0gcXVhbGl0eSBiYXJzCisvLyAgICAgIGl0c2VsZiBvciBuZWVkcyB0byBiZSBzaGFwZWQgb3V0c2lkZSBvZiB0aGUgY29kZWMuCisvLyAgICAgIFRoaXMga2VlcHMgYWxsIHRob3NlIGRlY2lzaW9ucyBpbiBvbmUgcGxhY2UuCisvLyAgICAgIEl0IGFsc28gbWVhbnMgdGhhdCB3ZSBwdXNoIHNvbWUgZXh0cmEgZGVjaXNpb24gaW5mb3JtYXRpb24gKGlzIHRoaXMgYSBoYW5kaGVsZCBkZXZpY2UKKy8vICAgICAgb3Igb25lIHRoYXQgaXMgb3RoZXJ3aXNlIGVsaWdpYmxlIGZvciBtaW5pbXVtIHF1YWxpdHkgbWFuaXB1bGF0aW9uLCB3aGljaCBnZW5lcmF0aW9uYWwKKy8vICAgICAgcXVhbGl0eSB0YXJnZXQgaXMgaW4gZm9yY2UsIGV0YykuICBUaGlzIGFsbG93cyB0aG9zZSB2YWx1ZXMgdG8gYmUgY2FjaGVkIGluIHRoZQorLy8gICAgICBwZXItY29kZWMgc3RydWN0dXJlcyB0aGF0IGFyZSBkb25lIDEgdGltZSB3aXRoaW4gYSBwcm9jZXNzIGluc3RlYWQgb2YgZm9yIGVhY2gKKy8vICAgICAgY29kZWMgaW5zdGFudGlhdGlvbi4KKy8vCisKK3N0YXR1c190IE1lZGlhQ29kZWM6OnNoYXBlTWVkaWFGb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CisgICAgQUxPR1YoInNoYXBlTWVkaWFGb3JtYXQgZW50cnkiKTsKKworICAgIGlmICghKGZsYWdzICYgQ09ORklHVVJFX0ZMQUdfRU5DT0RFKSkgeworICAgICAgICBBTE9HVygic2hhcGVNZWRpYUZvcm1hdDogbm90IGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBpZiAobUNvZGVjSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJzaGFwZU1lZGlhRm9ybWF0OiBubyBjb2RlY2luZm8iKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1lZGlhVHlwZSkpIHsKKyAgICAgICAgQUxPR1coInNoYXBlTWVkaWFGb3JtYXQ6IG5vIG1lZGlhVHlwZSBpbmZvcm1hdGlvbiIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGZ1bmN0aW9uIGVudHJ5IHBvaW50cyBmb3IgdGhlIHNoYXBlciBsaWJyYXJ5CisgICAgLy8KKworICAgIGNvbm5lY3RGb3JtYXRTaGFwZXIoKTsKKyAgICBpZiAoc1NoYXBlck9wcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJzaGFwZU1lZGlhRm9ybWF0OiBubyBNZWRpYUZvcm1hdFNoYXBlciBob29rcyBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIGZpbmQgdGhlIHNoYXBlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2RlYyttZWRpYVR5cGUgcGFpcgorICAgIC8vCisgICAgbWVkaWFmb3JtYXRzaGFwZXI6OnNoYXBlckhhbmRsZV90IHNoYXBlckhhbmRsZTsKKyAgICBzaGFwZXJIYW5kbGUgPSBzU2hhcGVyT3BzLT5maW5kU2hhcGVyKG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBpZiAoc2hhcGVySGFuZGxlID09IG51bGxwdHIpICB7CisgICAgICAgIHNldHVwRm9ybWF0U2hhcGVyKG1lZGlhVHlwZSk7CisgICAgICAgIHNoYXBlckhhbmRsZSA9IHNTaGFwZXJPcHMtPmZpbmRTaGFwZXIobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbWVkaWFUeXBlLmNfc3RyKCkpOworICAgIH0KKyAgICBpZiAoc2hhcGVySGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coInNoYXBlTWVkaWFGb3JtYXQ6IG5vIGhhbmRsZXIgZm9yIGNvZGVjICVzIG1lZGlhdHlwZSAlcyIsCisgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIHJ1biB0aGUgc2hhcGVyCisgICAgLy8KKworICAgIEFMT0dWKCJTaGFwaW5nIGlucHV0OiAlcyIsIGZvcm1hdC0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CisKKyAgICBzcDxBTWVzc2FnZT4gdXBkYXRlZEZvcm1hdCA9IGZvcm1hdC0+ZHVwKCk7CisgICAgQU1lZGlhRm9ybWF0ICp1cGRhdGVkTmRrRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJnVwZGF0ZWRGb3JtYXQpOworCisgICAgaW50IHJlc3VsdCA9ICgqc1NoYXBlck9wcy0+c2hhcGVGb3JtYXQpKHNoYXBlckhhbmRsZSwgdXBkYXRlZE5ka0Zvcm1hdCwgZmxhZ3MpOworICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KHVwZGF0ZWROZGtGb3JtYXQsICZ1cGRhdGVkRm9ybWF0KTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gZGVsdGFzID0gdXBkYXRlZEZvcm1hdC0+Y2hhbmdlc0Zyb20oZm9ybWF0LCBmYWxzZSAvKiBkZWVwICovKTsKKyAgICAgICAgc2l6ZV90IGNoYW5nZUNvdW50ID0gZGVsdGFzLT5jb3VudEVudHJpZXMoKTsKKyAgICAgICAgQUxPR0QoInNoYXBlTWVkaWFGb3JtYXQ6IGRlbHRhcyglenUpOiAlcyIsIGNoYW5nZUNvdW50LCBkZWx0YXMtPmRlYnVnU3RyaW5nKDIpLmNfc3RyKCkpOworICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNTaGFwaW5nRW5oYW5jZWQsIGNoYW5nZUNvdW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbmdlQ291bnQgPiAwKSB7CisgICAgICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHNhdmUgc29tZSBvbGQgcHJvcGVydGllcyBiZWZvcmUgd2UgZm9sZCBpbiB0aGUgbmV3IG9uZXMKKyAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKEtFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjT3JpZ2luYWxCaXRyYXRlLCBiaXRyYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50MzJfdCBxcElNaW4gPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm9yaWdpbmFsLXZpZGVvLXFwLWktbWluIiwgJnFwSU1pbikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNPcmlnaW5hbFZpZGVvUVBJTWluLCBxcElNaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHFwSU1heCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigib3JpZ2luYWwtdmlkZW8tcXAtaS1tYXgiLCAmcXBJTWF4KSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY09yaWdpbmFsVmlkZW9RUElNYXgsIHFwSU1heCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDMyX3QgcXBQTWluID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJvcmlnaW5hbC12aWRlby1xcC1wLW1pbiIsICZxcFBNaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjT3JpZ2luYWxWaWRlb1FQUE1pbiwgcXBQTWluKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50MzJfdCBxcFBNYXggPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm9yaWdpbmFsLXZpZGVvLXFwLXAtbWF4IiwgJnFwUE1heCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNPcmlnaW5hbFZpZGVvUVBQTWF4LCBxcFBNYXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgaW50MzJfdCBxcEJNaW4gPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIm9yaWdpbmFsLXZpZGVvLXFwLWItbWluIiwgJnFwQk1pbikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNPcmlnaW5hbFZpZGVvUVBCTWluLCBxcEJNaW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQzMl90IHFwQk1heCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigib3JpZ2luYWwtdmlkZW8tcXAtYi1tYXgiLCAmcXBCTWF4KSkgeworICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY09yaWdpbmFsVmlkZW9RUEJNYXgsIHFwQk1heCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTkI6IGZvciBhbnkgZmllbGQgaW4gYm90aCBmb3JtYXQgYW5kIGRlbHRhcywgdGhlIGRlbHRhcyBjb3B5IHdpbnMKKyAgICAgICAgICAgIGZvcm1hdC0+ZXh0ZW5kKGRlbHRhcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHVwZGF0ZWROZGtGb3JtYXQpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHZvaWQgbWFwRm9ybWF0KEFTdHJpbmcgY29tcG9uZW50TmFtZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IGNoYXIgKmtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlKSB7CisgICAgQVN0cmluZyBtZWRpYVR5cGU7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWVkaWFUeXBlKSkgeworICAgICAgICBBTE9HVygibWFwRm9ybWF0OiBubyBtZWRpYVR5cGUgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigibWFwRm9ybWF0OiBjb2RlYyAlcyBtZWRpYXR5cGUgJXMga2luZCAlcyByZXZlcnNlICVkIiwgY29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgIG1lZGlhVHlwZS5jX3N0cigpLCBraW5kID8ga2luZCA6ICI8YWxsPiIsIHJldmVyc2UpOworCisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGZ1bmN0aW9uIGVudHJ5IHBvaW50cyBmb3IgdGhlIHNoYXBlciBsaWJyYXJ5CisgICAgLy8KKworI2lmIDAKKyAgICAvLyBsZXQncyBwbGF5IHRoZSBmYXN0ZXIgIm9ubHkgZG8gbWFwcGluZyBpZiB3ZSd2ZSBhbHJlYWR5IGxvYWRlZCB0aGUgbGlicmFyeQorICAgIGNvbm5lY3RGb3JtYXRTaGFwZXIoKTsKKyNlbmRpZgorICAgIGlmIChzU2hhcGVyT3BzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIm1hcEZvcm1hdDogbm8gTWVkaWFGb3JtYXRTaGFwZXIgaG9va3MgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBzaGFwZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgY29kZWMrbWVkaWFUeXBlIHBhaXIKKyAgICAvLworICAgIG1lZGlhZm9ybWF0c2hhcGVyOjpzaGFwZXJIYW5kbGVfdCBzaGFwZXJIYW5kbGU7CisgICAgc2hhcGVySGFuZGxlID0gc1NoYXBlck9wcy0+ZmluZFNoYXBlcihjb21wb25lbnROYW1lLmNfc3RyKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBpZiAoc2hhcGVySGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIm1hcEZvcm1hdDogbm8gc2hhcGVyIGhhbmRsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgY2hhciAqKm1hcHBpbmdzOworICAgIGlmIChyZXZlcnNlKQorICAgICAgICBtYXBwaW5ncyA9IHNTaGFwZXJPcHMtPmdldFJldmVyc2VNYXBwaW5ncyhzaGFwZXJIYW5kbGUsIGtpbmQpOworICAgIGVsc2UKKyAgICAgICAgbWFwcGluZ3MgPSBzU2hhcGVyT3BzLT5nZXRNYXBwaW5ncyhzaGFwZXJIYW5kbGUsIGtpbmQpOworCisgICAgaWYgKG1hcHBpbmdzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIm5vIG1hcHBpbmdzIHJldHVybmVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiUHJlLW1hcHBpbmc6ICVzIiwgIGZvcm1hdC0+ZGVidWdTdHJpbmcoMikuY19zdHIoKSk7CisgICAgLy8gZG8gdGhlIG1hcHBpbmcKKyAgICAvLworICAgIGludCBlbnRyaWVzID0gZm9ybWF0LT5jb3VudEVudHJpZXMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgOyBpICs9IDIpIHsKKyAgICAgICAgaWYgKG1hcHBpbmdzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGl4ID0gZm9ybWF0LT5maW5kRW50cnlCeU5hbWUobWFwcGluZ3NbaV0pOworICAgICAgICBpZiAoaXggPCBlbnRyaWVzKSB7CisgICAgICAgICAgICBBTE9HVigibWFwICclcycgdG8gJyVzJyIsIG1hcHBpbmdzW2ldLCBtYXBwaW5nc1tpKzFdKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZvcm1hdC0+c2V0RW50cnlOYW1lQXQoaXgsIG1hcHBpbmdzW2krMV0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJVbmFibGUgdG8gbWFwIGZyb20gJyVzJyB0byAnJXMnOiBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzW2ldLCBtYXBwaW5nc1tpKzFdLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJQb3N0LW1hcHBpbmc6ICVzIiwgIGZvcm1hdC0+ZGVidWdTdHJpbmcoMikuY19zdHIoKSk7CisKKworICAgIC8vIHJlY2xhaW0gdGhlIG1hcHBpbmcgbWVtb3J5CisgICAgZm9yIChpbnQgaSA9IDA7IDsgaSArPSAyKSB7CisgICAgICAgIGlmIChtYXBwaW5nc1tpXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmcmVlKCh2b2lkKiltYXBwaW5nc1tpXSk7CisgICAgICAgIGZyZWUoKHZvaWQqKW1hcHBpbmdzW2kgKyAxXSk7CisgICAgfQorICAgIGZyZWUobWFwcGluZ3MpOworICAgIG1hcHBpbmdzID0gbnVsbHB0cjsKK30KKworLy8KKy8vIGVuZCBvZiBGb3JtYXQgU2hhcGluZyBob29rcyB3aXRoaW4gTWVkaWFDb2RlYworLy8KKwogc3RhdHVzX3QgTWVkaWFDb2RlYzo6cmVsZWFzZUNyeXB0bygpCiB7CiAgICAgQUxPR1YoInJlbGVhc2VDcnlwdG8iKTsKQEAgLTE0NDYsNiArMjI1NCw4IEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdGFydCgpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOwogCisgICAgc3A8QU1lc3NhZ2U+IGNhbGxiYWNrOworCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKQEAgLTE0NzAsNiArMjI4MCwyMCBAQAogICAgICAgICAgICAgICAgIEFMT0dFKCJyZXRyeWluZyBzdGFydDogZmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2RlYyIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzZXRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmV0cnlpbmcgc3RhcnQ6IGZhaWxlZCB0byBzZXQgY2FsbGJhY2siKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dEKCJzdWNjZWVkIHRvIHNldCBjYWxsYmFjayBmb3IgcmVjbGFpbSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gS2VlcCBjYWxsYmFjayBtZXNzYWdlIGFmdGVyIHRoZSBmaXJzdCBpdGVyYXRpb24gaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiAoaSA9PSAwICYmIG1DYWxsYmFjayAhPSBudWxscHRyICYmIG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICAgICAgY2FsbGJhY2sgPSBtQ2FsbGJhY2s7CisgICAgICAgICAgICBBTE9HRCgia2VlcCBjYWxsYmFjayBtZXNzYWdlIGZvciByZWNsYWltIik7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0xNTQ4LDcgKzIzNzIsNiBAQAogICAgIG1TdGlja3lFcnJvciA9IE9LOwogCiAgICAgLy8gcmVzZXQgc3RhdGUgbm90IHJlc2V0IGJ5IHNldFN0YXRlKFVOSU5JVElBTElaRUQpCi0gICAgbVJlcGx5SUQgPSAwOwogICAgIG1EZXF1ZXVlSW5wdXRSZXBseUlEID0gMDsKICAgICBtRGVxdWV1ZU91dHB1dFJlcGx5SUQgPSAwOwogICAgIG1EZXF1ZXVlSW5wdXRUaW1lb3V0R2VuZXJhdGlvbiA9IDA7CkBAIC0xOTQyLDYgKzI3NjUsMjIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1lZGlhQ29kZWM6OnF1ZXJ5U3VwcG9ydGVkVmVuZG9yUGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gKm5hbWVzKSB7CisgICAgcmV0dXJuIG1Db2RlYy0+cXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKG5hbWVzKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlYzo6ZGVzY3JpYmVQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYykgeworICAgIHJldHVybiBtQ29kZWMtPmRlc2NyaWJlUGFyYW1ldGVyKG5hbWUsIGRlc2MpOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdWJzY3JpYmVUb1ZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBtQ29kZWMtPnN1YnNjcmliZVRvUGFyYW1ldGVycyhuYW1lcyk7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWM6OnVuc3Vic2NyaWJlRnJvbVZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcykgeworICAgIHJldHVybiBtQ29kZWMtPnVuc3Vic2NyaWJlRnJvbVBhcmFtZXRlcnMobmFtZXMpOworfQorCiB2b2lkIE1lZGlhQ29kZWM6OnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0QWN0aXZpdHlOb3RpZmljYXRpb24sIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKQEAgLTIwODAsMjAgKzI5MTksMjUgQEAKICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnT3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCk7CiAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRCdWZmZXJzQ2hhbmdlZDsKLSAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnT3V0cHV0Rm9ybWF0Q2hhbmdlZCkgewotICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5GT19GT1JNQVRfQ0hBTkdFRCk7Ci0gICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IGRlcXVldWVQb3J0QnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQpOwotCi0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIENIRUNLX0VRKGluZGV4LCAtRUFHQUlOKTsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9IHBlZWtOZXh0UG9ydEJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyID0KLSAgICAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XVtpbmRleF0ubURhdGE7CisgICAgICAgIC8vIEluIHN5bmNocm9ub3VzIG1vZGUsIG91dHB1dCBmb3JtYXQgY2hhbmdlIHNob3VsZCBiZSBoYW5kbGVkCisgICAgICAgIC8vIGF0IGRlcXVldWUgdG8gcHV0IHRoZSBldmVudCBhdCB0aGUgY29ycmVjdCBvcmRlci4KKworICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyID0gaW5mby0+bURhdGE7CisgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZUlmTmVlZGVkKGJ1ZmZlcik7CisgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQpIHsKKyAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTkZPX0ZPUk1BVF9DSEFOR0VEKTsKKyAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVxdWV1ZVBvcnRCdWZmZXIoa1BvcnRJbmRleE91dHB1dCk7CiAKICAgICAgICAgcmVzcG9uc2UtPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgICAgICByZXNwb25zZS0+c2V0U2l6ZSgib2Zmc2V0IiwgYnVmZmVyLT5vZmZzZXQoKSk7CkBAIC0yMTAyLDE0ICsyOTQ2LDE1IEBACiAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKLSAgICAgICAgc3RhdHNCdWZmZXJSZWNlaXZlZCh0aW1lVXMpOwotCiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKIAogICAgICAgICBpbnQzMl90IGZsYWdzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOwogCiAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7CisKKyAgICAgICAgc3RhdHNCdWZmZXJSZWNlaXZlZCh0aW1lVXMsIGJ1ZmZlcik7CisKICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKICAgICB9CiAKQEAgLTIxMzAsMTQgKzI5NzUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImFjdGlvbkNvZGUiLCAmYWN0aW9uQ29kZSkpOwogCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnIgJSN4LCBhY3Rpb25Db2RlICVkLCB3aGlsZSBpbiBzdGF0ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLCBhY3Rpb25Db2RlLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyICUjeCwgYWN0aW9uQ29kZSAlZCwgd2hpbGUgaW4gc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdTYXdNZWRpYVNlcnZlckRpZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VuZEVycm9yUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcmlnaW57ImtXaGF0RXJyb3I6In07CisgICAgICAgICAgICAgICAgICAgIG9yaWdpbiArPSBzdGF0ZVN0cmluZyhtU3RhdGUpOwogCiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWklORzoKQEAgLTIxODUsMTggKzMwMzIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RPUFBJTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnU2F3TWVkaWFTZXJ2ZXJEaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb3N0UGVuZGluZ1JlcGxpZXMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyAmJiAhbVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJSZWxlYXNpbmcgYXN5bmNocm9ub3VzbHksIHNvIG5vdGhpbmcgdG8gcmVwbHkgaGVyZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lZGlhU2VydmVyIGRpZWQsIHRoZXJlIGRlZmluaXRlbHkgd29uJ3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgYSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24gYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsLgogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSdyZSBkaXJlY3RseSBnb2luZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCB3ZSBtYXkgYmUgZGlyZWN0bHkgZ29pbmcgZnJvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTVE9QUElORy0+VU5JTklUSUFMSVpFRCwgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWwgU1RPUFBJTkctPklOSVRJQUxJWkVEIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShVTklOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3N0UGVuZGluZ1JlcGxpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMob3JpZ2luICsgIjpkZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtUmVwbHlJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTIyMjIsNyArMzA3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNIRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IChtUmVwbHlJRCAhPSBudWxscHRyKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0aWNreUVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwpAQCAtMjI1Miw3ICszMTA4LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gKG1SZXBseUlEICE9IG51bGxwdHIpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CkBAIC0yMjc5LDcgKzMxMzUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChzZW5kRXJyb3JSZXNwb25zZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1SZXBseUlELCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiByZXBsaWNhdGUgUG9zdFJlcGx5V2l0aEVycm9yIGxvZ2ljIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBlcnIgY29kZSBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmaW5hbEVyciA9IGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBlcnIgY29kZSBpZiBNZWRpYUNvZGVjIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZWQgYnkgUmVzb3VyY2VNYW5hZ2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRXJyID0gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKG9yaWdpbiwgZmluYWxFcnIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTIyODksOCArMzE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRFcnJvciBvciBrV2hhdFJlbGVhc2UgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImFsbG9jYXRlIGludGVycnVwdGVkIGJ5IGVycm9yIG9yIHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJhbGxvY2F0ZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaSU5HKTsKQEAgLTIzMjcsNyArMzE5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdENvbXBvbmVudEFsbG9jYXRlZCIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIzMzYsOCArMzIwMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEIHx8IG1TdGF0ZSA9PSBJTklUSUFMSVpFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0RXJyb3Igb3Iga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ3VyZSBpbnRlcnJ1cHRlZCBieSBlcnJvciBvciByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09ORklHVVJJTkcpOwpAQCAtMjM1Miw3ICszMjE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGxwdHIgJiYgIW1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hbCBmcmFtZSBkcm9wcGluZyBtb2RlIGluIHRoZSBpbnB1dCBmb3JtYXQgYXMgdGhpcyBtYXkgYWxzbyBiZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhbmluZ2Z1bCBhbmQgY29uZnVzaW5nIGZvciBhbiBlbmNvZGVyIGluIGEgdHJhbnNjb2RlciBzY2VuYXJpbwotICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWxsb3ctZnJhbWUtZHJvcCIsIG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQUxMT1dfRlJBTUVfRFJPUCwgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGludGVyZXN0aW5nRm9ybWF0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJc0VuY29kZXIpID8gbU91dHB1dEZvcm1hdCA6IG1JbnB1dEZvcm1hdDsKQEAgLTIzNjYsNyArMzIzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShDT05GSUdVUkVEKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCIpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGF1Z21lbnQgb3VyIG1lZGlhIG1ldHJpY3MgaW5mbywgbm93IHRoYXQgd2Uga25vdyBtb3JlIHRoaW5ncwogICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHdoYXQgdGhlIGNvZGVjIGV4dHJhY3RlZCBmcm9tIGFueSBDU0QgcGFzc2VkIGluLgpAQCAtMjQxMSw2ICszMjc1LDEyIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgdHJhbnNpdGlvbmVkIHVuZXhwZWN0ZWRseTsgd2Ugc2hvdWxkIGhhdmUgcmVwbGllZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlY2VpdmVkIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCBtZXNzYWdlIGluIHN0YXRlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTI0MjksMTIgKzMyOTksMTggQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkIiwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXRlIHRyYW5zaXRpb25lZCB1bmV4cGVjdGVkbHk7IHdlIHNob3VsZCBoYXZlIHJlcGxpZWQgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJyZWNlaXZlZCBrV2hhdElucHV0U3VyZmFjZUFjY2VwdGVkIG1lc3NhZ2UgaW4gc3RhdGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoKQogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlKCk7CkBAIC0yNDQ1LDE5ICszMzIxLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQiLCByZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTaWduYWxlZElucHV0RU9TOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB0cmFuc2l0aW9uZWQgdW5leHBlY3RlZGx5OyB3ZSBzaG91bGQgaGF2ZSByZXBsaWVkIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVjZWl2ZWQga1doYXRTaWduYWxlZElucHV0RU9TIG1lc3NhZ2UgaW4gc3RhdGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoImtXaGF0U2lnbmFsZWRJbnB1dEVPUyIsIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNDY2LDcgKzMzNDgsOCBAQAogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBhIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnQgaW50ZXJydXB0ZWQgYnkgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RhcnQgaW50ZXJydXB0ZWQgYnkgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZC8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC0yNDc2LDcgKzMzNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpHcmFwaGljTWVtb3J5UmVzb3VyY2UoZ2V0R3JhcGhpY0J1ZmZlclNpemUoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJURUQpOwotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRTdGFydENvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI0ODksOSArMzM3MiwxOCBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdE91dHB1dEZyYW1lc1JlbmRlcmVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZXNlIGluIGFsbCBzdGF0ZXMgZXhjZXB0IHJ1bm5pbmcsIGFuZCBjaGVjayB0aGF0IHdlIGhhdmUgYQotICAgICAgICAgICAgICAgICAgICAvLyBub3RpZmljYXRpb24gc2V0Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBUlRFRCAmJiBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZXNlIGluIGFsbCBzdGF0ZXMgZXhjZXB0IHJ1bm5pbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUdW5uZWxQZWVrU3RhdGUgcHJldmlvdXNTdGF0ZSA9IG1UdW5uZWxQZWVrU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlR1bm5lbFBlZWtTdGF0ZTogJXMgLT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoVHVubmVsUGVla1N0YXRlOjprQnVmZmVyUmVuZGVyZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tEdXJhdGlvbihtc2cpOworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHdlIGhhdmUgYSBub3RpZmljYXRpb24gc2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uLT5kdXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZGF0YSIsIG1zZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKQEAgLTI0OTksNiArMzM5MSw0OCBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Rmlyc3RUdW5uZWxGcmFtZVJlYWR5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUdW5uZWxQZWVrU3RhdGUgcHJldmlvdXNTdGF0ZSA9IG1UdW5uZWxQZWVrU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtVHVubmVsUGVla1N0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0Rpc2FibGVkTm9CdWZmZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0Rpc2FibGVkUXVldWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJEZWNvZGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGaXJzdCB0dW5uZWwgZnJhbWUgcmVhZHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocHJldmlvdXNTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcobVR1bm5lbFBlZWtTdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWRRdWV1ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1ldGVycyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5zZXRJbnQzMigiYW5kcm9pZC5fdHJpZ2dlci10dW5uZWwtcGVlayIsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtCdWZmZXJSZW5kZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRmlyc3QgdHVubmVsIGZyYW1lIHJlYWR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlR1bm5lbFBlZWtTdGF0ZTogJXMgLT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKG1UdW5uZWxQZWVrU3RhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIklnbm9yaW5nIGZpcnN0IHR1bm5lbCBmcmFtZSByZWFkeSwgVHVubmVsUGVla1N0YXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcobVR1bm5lbFBlZWtTdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PbkZpcnN0VHVubmVsRnJhbWVSZWFkeU5vdGlmaWNhdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5Tm90aWZpY2F0aW9uLT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZGF0YSIsIG1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0RmlsbFRoaXNCdWZmZXI6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvKiBzaXplX3QgaW5kZXggPSAqL3VwZGF0ZUJ1ZmZlcnMoa1BvcnRJbmRleElucHV0LCBtc2cpOwpAQCAtMjU3NywxMDcgKzM1MTEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IGJ1ZmZlci0+Zm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1VzZUJsb2NrTW9kZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGlmZjEgPSBtT3V0cHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShidWZmZXItPmZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZGlmZjIgPSBidWZmZXItPmZvcm1hdCgpLT5jaGFuZ2VzRnJvbShtT3V0cHV0Rm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtRW50cmllcyA9IGRpZmYxLT5jb3VudEVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuZW1wbGFjZShkaWZmMS0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRW50cmllcyA9IGRpZmYyLT5jb3VudEVudHJpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmVtcGxhY2UoZGlmZjItPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFdyYXBwZXJPYmplY3Q8c3RkOjpzZXQ8c3RkOjpzdHJpbmc+Pj4gY2hhbmdlZEtleXN7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBXcmFwcGVyT2JqZWN0PHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj57c3RkOjptb3ZlKGtleXMpfX07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldE9iamVjdCgiY2hhbmdlZEtleXMiLCBjaGFuZ2VkS2V5cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0bzogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBtT3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Tb2Z0UmVuZGVyZXIgPT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHByb3BhZ2F0ZSBjb2xvciBhc3BlY3RzIHRvIHNvZnR3YXJlIHJlbmRlcmVyIHRvIGFsbG93IGJldHRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIGNvbnZlcnNpb24gdG8gUkdCLiBGb3Igbm93LCBqdXN0IG1hcmsgZGF0YXNwYWNlIGZvciBZVVYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhU3BhY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgJmRhdGFTcGFjZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gc2V0dGluZyBkYXRhc3BhY2Ugb24gb3V0cHV0IHN1cmZhY2UgdG8gIyV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhU3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kYXRhX3NwYWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLCAoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IGRhdGFzcGFjZSBvbiBzdXJmYWNlICglZCkiLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gaW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KG1PdXRwdXRGb3JtYXQsICZpbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksICZpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1TdXJmYWNlLCBtUm90YXRpb25EZWdyZWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDcHVCb29zdElmTmVlZGVkKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJlZm9yZSB3ZSBhbm5vdW5jZSB0aGUgZm9ybWF0IGNoYW5nZSB3ZSBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGNvZGVjIHNwZWNpZmljIGRhdGEgYW5kIGFtZW5kIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIEJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAmJiAhKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YShidWZmZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyBzcGl0IG91dCBtYWxmb3JtZWQgY29kZWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmljIGRhdGEhIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ091dHB1dEZvcm1hdENoYW5nZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEFjdGl2aXR5Tm90aWZpY2F0aW9uSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgbUNyeXB0byBvZiB2aWRlbyByZXNvbHV0aW9uIGNoYW5nZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHJpZ2h0IC0gbGVmdCArIDEsIGJvdHRvbSAtIHRvcCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyeXB0by0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImJ1ZmZlciIsICZvYmopKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IHN0YXRpY19jYXN0PE1lZGlhQ29kZWNCdWZmZXIgKj4ob2JqLmdldCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gYXN5bmNocm9ub3VzIG1vZGUsIG91dHB1dCBmb3JtYXQgY2hhbmdlIGlzIHByb2Nlc3NlZCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU91dHB1dEZvcm1hdENoYW5nZUlmTmVlZGVkKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbGFncyAmIGtGbGFnRGVxdWV1ZU91dHB1dFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKGhhbmRsZURlcXVldWVPdXRwdXRCdWZmZXIobURlcXVldWVPdXRwdXRSZXBseUlEKSk7CkBAIC0yNzAyLDE4ICszNTQyLDI2IEBACiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdFN0b3BDb21wbGV0ZWQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IFNUT1BQSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQga1doYXRTdG9wQ29tcGxldGVkIGluIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBrV2hhdFN0b3BDb21wbGV0ZWQgaW4gc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOwotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdFN0b3BDb21wbGV0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJrV2hhdFN0b3BDb21wbGV0ZWQ6IHByZXN1bWFibHkgYW4gZXJyb3Igb2NjdXJyZWQgZWFybGllciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBhbnl3YXkuIChsYXN0IHJlcGx5IG9yaWdpbj0lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RSZXBseU9yaWdpbi5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZUNvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gUkVMRUFTSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVjZWl2ZWQga1doYXRSZWxlYXNlQ29tcGxldGVkIGluIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJSZWNlaXZlZCBrV2hhdFJlbGVhc2VDb21wbGV0ZWQgaW4gc3RhdGUgJWQvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CkBAIC0yNzMwLDcgKzM1NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZVN1cmZhY2UucmVzZXQoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGx5SUQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCJrV2hhdFJlbGVhc2VDb21wbGV0ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobUFzeW5jUmVsZWFzZUNvbXBsZXRlTm90aWZpY2F0aW9uICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoTWVkaWFtZXRyaWNzKCk7CkBAIC0yNzQzLDggKzM1OTEsOCBAQAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRGbHVzaENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gRkxVU0hJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWNlaXZlZCBGbHVzaENvbXBsZXRlZCBtZXNzYWdlIGluIHN0YXRlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWNlaXZlZCBGbHVzaENvbXBsZXRlZCBtZXNzYWdlIGluIHN0YXRlICVkLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMjc1NSw3ICszNjAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRGbHVzaENvbXBsZXRlZCIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI3NjcsMTQgKzM2MTUsMTggQEAKIAogICAgICAgICBjYXNlIGtXaGF0SW5pdDoKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpJTkcpOwogCkBAIC0yNzk5LDYgKzM2NTEsOSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoIm9uLWZyYW1lLXJlbmRlcmVkIiwgJm5vdGlmeSkpIHsKICAgICAgICAgICAgICAgICBtT25GcmFtZVJlbmRlcmVkTm90aWZpY2F0aW9uID0gbm90aWZ5OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoImZpcnN0LXR1bm5lbC1mcmFtZS1yZWFkeSIsICZub3RpZnkpKSB7CisgICAgICAgICAgICAgICAgbU9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5Tm90aWZpY2F0aW9uID0gbm90aWZ5OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjgzNiwxNCArMzY5MSwxOCBAQAogCiAgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEKSB7Ci0gICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgIG1EZWZlcnJlZE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKICAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKIApAQCAtMjg1Niw3ICszNzE1LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigiYWxsb3ctZnJhbWUtZHJvcCIsICZtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSkgeworICAgICAgICAgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoS0VZX0FMTE9XX0ZSQU1FX0RST1AsICZtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBmcmFtZSBkcm9wcGluZyBieSBzdXJmYWNlIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjkxNiw2ICszNzc1LDE5IEBACiAKICAgICAgICAgICAgIGV4dHJhY3RDU0QoZm9ybWF0KTsKIAorICAgICAgICAgICAgaW50MzJfdCB0dW5uZWxlZDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiZmVhdHVyZS10dW5uZWxlZC1wbGF5YmFjayIsICZ0dW5uZWxlZCkgJiYgdHVubmVsZWQgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBUVU5ORUxFRCB2aWRlbyBwbGF5YmFjay4iKTsKKyAgICAgICAgICAgICAgICBtVHVubmVsZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVHVubmVsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50MzJfdCBiYWNrZ3JvdW5kID0gMDsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fYmFja2dyb3VuZC1tb2RlIiwgJmJhY2tncm91bmQpICYmIGJhY2tncm91bmQpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkoZ2V0dGlkKCksIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1Db2RlYy0+aW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoZm9ybWF0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yOTgxLDE1ICszODUzLDE5IEBACiAgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CiAgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNvbmZpZ3VyZWQsIGJ1dCBjYW4ndCBoYXZlIGJlZW4gc3RhcnRlZCB5ZXQuCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOwpAQCAtMzAwNCw5ICszODgwLDYgQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNIRUQpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKICAgICAgICAgICAgICAgICBpZiAobUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzKSB7CkBAIC0zMDE0LDEzICszODg3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBPSyk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgT0spOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgVHVubmVsUGVla1N0YXRlIHByZXZpb3VzU3RhdGUgPSBtVHVubmVsUGVla1N0YXRlOworICAgICAgICAgICAgbVR1bm5lbFBlZWtTdGF0ZSA9IFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcjsKKyAgICAgICAgICAgIEFMT0dWKCJUdW5uZWxQZWVrU3RhdGU6ICVzIC0+ICVzIiwKKyAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHByZXZpb3VzU3RhdGUpLAorICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZE5vQnVmZmVyKSk7CisKICAgICAgICAgICAgIG1SZXBseUlEID0gcmVwbHlJRDsKICAgICAgICAgICAgIHNldFN0YXRlKFNUQVJUSU5HKTsKIApAQCAtMzAyOCwxNSArMzkxMyw0MiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0U3RvcDoKKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgIG1EZWZlcnJlZE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOgogICAgICAgICB7CiAgICAgICAgICAgICBTdGF0ZSB0YXJnZXRTdGF0ZSA9CiAgICAgICAgICAgICAgICAgKG1zZy0+d2hhdCgpID09IGtXaGF0U3RvcCkgPyBJTklUSUFMSVpFRCA6IFVOSU5JVElBTElaRUQ7CiAKKyAgICAgICAgICAgIGlmICgobVN0YXRlID09IFJFTEVBU0lORyAmJiB0YXJnZXRTdGF0ZSA9PSBVTklOSVRJQUxJWkVEKQorICAgICAgICAgICAgICAgICAgICB8fCAobVN0YXRlID09IFNUT1BQSU5HICYmIHRhcmdldFN0YXRlID09IElOSVRJQUxJWkVEKSkgeworICAgICAgICAgICAgICAgIG1EZWZlcnJlZE1lc3NhZ2VzLnB1c2hfYmFjayhtc2cpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAorICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGFzeW5jTm90aWZ5OworICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kTWVzc2FnZSgiYXN5bmMiLCAmYXN5bmNOb3RpZnkpOworICAgICAgICAgICAgLy8gcG9zdCBhc3luY05vdGlmeSBpZiBnb2luZyBvdXQgb2Ygc2NvcGUuCisgICAgICAgICAgICBzdHJ1Y3QgQXN5bmNOb3RpZnlQb3N0IHsKKyAgICAgICAgICAgICAgICBBc3luY05vdGlmeVBvc3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhc3luY05vdGlmeSkgOiBtQXN5bmNOb3RpZnkoYXN5bmNOb3RpZnkpIHt9CisgICAgICAgICAgICAgICAgfkFzeW5jTm90aWZ5UG9zdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Bc3luY05vdGlmeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUFzeW5jTm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdm9pZCBjbGVhcigpIHsgbUFzeW5jTm90aWZ5LmNsZWFyKCk7IH0KKyAgICAgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1Bc3luY05vdGlmeTsKKyAgICAgICAgICAgIH0gYXN5bmNOb3RpZnlQb3N0e2FzeW5jTm90aWZ5fTsKKwogICAgICAgICAgICAgLy8gYWxyZWFkeSBzdG9wcGVkL3JlbGVhc2VkCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFVOSU5JVElBTElaRUQgJiYgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0zMDQ4LDcgKzM5NjAsMTMgQEAKICAgICAgICAgICAgIGludDMyX3QgcmVjbGFpbWVkID0gMDsKICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJyZWNsYWltZWQiLCAmcmVjbGFpbWVkKTsKICAgICAgICAgICAgIGlmIChyZWNsYWltZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKCFtUmVsZWFzZWRCeVJlc291cmNlTWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgdGhlIGFzeW5jIGNsaWVudAorICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludDMyX3QgZm9yY2UgPSAwOwogICAgICAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJmb3JjZSIsICZmb3JjZSk7CkBAIC0zMDYwLDEwICszOTc4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBXT1VMRF9CTE9DSyk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHRoZSBhc3luYyBjbGllbnQKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTMwOTQsMTggKzQwMDgsMjYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIHN0b3BwaW5nLCBjb25maWd1cmluZyBvciBzdGFydGluZyAgYnV0CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgY29uZmlndXJpbmcgb3Igc3RhcnRpbmcgIGJ1dAogICAgICAgICAgICAgLy8gcmVjZWl2ZWQgYSByZWxlYXNlIHJlcXVlc3QsIHBvc3QgdGhlIHJlcGx5IGZvciB0aGUgcGVuZGluZyBjYWxsCiAgICAgICAgICAgICAvLyBmaXJzdCwgYW5kIGNvbnNpZGVyIGl0IGRvbmUuIFRoZSByZXBseSB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkCiAgICAgICAgICAgICAvLyBhZnRlciB0aGlzLCBhbmQgd2UnbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCi0gICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORwotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gQ09ORklHVVJJTkcgfHwgbVN0YXRlID09IFNUQVJUSU5HKSB7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBDT05GSUdVUklORyB8fCBtU3RhdGUgPT0gU1RBUlRJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBtUmVwbHkgaXMgYWx3YXlzIHNldCBpZiBpbiB0aGVzZSBzdGF0ZXMuCisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJrV2hhdFJlbGVhc2U6IikgKyBzdGF0ZVN0cmluZyhtU3RhdGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHdlJ3JlIHN0b3BwaW5nIGJ1dCByZWNlaXZlZCBhIHJlbGVhc2UgcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkKKyAgICAgICAgICAgIC8vIGZvciB0aGUgcGVuZGluZyBjYWxsIGlmIG5lY2Vzc2FyeS4gTm90ZSB0aGF0IHRoZSByZXBseSBtYXkgaGF2ZSBiZWVuCisgICAgICAgICAgICAvLyBhbHJlYWR5IHBvc3RlZCBkdWUgdG8gYW4gZXJyb3IuCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUT1BQSU5HICYmIG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOlNUT1BQSU5HIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgLy8gSXQncyBkZWFkLCBKaW0uIERvbid0IGV4cGVjdCBpbml0aWF0ZVNodXRkb3duIHRvIHlpZWxkCiAgICAgICAgICAgICAgICAgLy8gYW55IHVzZWZ1bCByZXN1bHRzIG5vdy4uLgorICAgICAgICAgICAgICAgIC8vIEFueSBwZW5kaW5nIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGF0IGtXaGF0RXJyb3IuCiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKQEAgLTMxMTksMTIgKzQwNDEsMTIgQEAKICAgICAgICAgICAgIC8vIHJlcGx5IG5vdyB3aXRoIGFuIGVycm9yIHRvIHVuYmxvY2sgdGhlIGNsaWVudCwgY2xpZW50IGNhbgogICAgICAgICAgICAgLy8gcmVsZWFzZSBhZnRlciB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiBBTlIpLgogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U3RvcCAmJiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAvLyBBbnkgcGVuZGluZyByZXBseSB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhdCBrV2hhdEVycm9yLgogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGFzeW5jTm90aWZ5OwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoImFzeW5jIiwgJmFzeW5jTm90aWZ5KSAmJiBhc3luY05vdGlmeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CkBAIC0zMTQ4LDYgKzQwNzAsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChtUmVwbHlJRCkgeworICAgICAgICAgICAgICAgIC8vIFN0YXRlIHRyYW5zaXRpb24gcmVwbGllcyBhcmUgaGFuZGxlZCBhYm92ZSwgc28gdGhpcyByZXBseQorICAgICAgICAgICAgICAgIC8vIHdvdWxkIG5vdCBiZSByZWxhdGVkIHRvIHN0YXRlIHRyYW5zaXRpb24uIEFzIHdlIGFyZQorICAgICAgICAgICAgICAgIC8vIHNodXR0aW5nIGRvd24gdGhlIGNvbXBvbmVudCwganVzdCBmYWlsIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOnJlcGx5IiwgVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShtc2ctPndoYXQoKSA9PSBrV2hhdFN0b3AgPyBTVE9QUElORyA6IFJFTEVBU0lORyk7CiAKQEAgLTMxNjIsOCArNDA5MCw4IEBACiAKICAgICAgICAgICAgIGlmIChhc3luY05vdGlmeSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclByb3h5LT5tYXJrQ2xpZW50Rm9yUGVuZGluZ1JlbW92YWwoKTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKLSAgICAgICAgICAgICAgICBtUmVwbHlJRCA9IDA7CisgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygia1doYXRSZWxlYXNlOmFzeW5jIik7CisgICAgICAgICAgICAgICAgYXN5bmNOb3RpZnlQb3N0LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgbUFzeW5jUmVsZWFzZUNvbXBsZXRlTm90aWZpY2F0aW9uID0gYXN5bmNOb3RpZnk7CiAgICAgICAgICAgICB9CiAKQEAgLTMzMzQsMTcgKzQyNjIsMjEgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbToKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSB8fCAhbUhhdmVJbnB1dFN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTMzODYsMjMgKzQzMTgsMzIgQEAKIAogICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAoIWlzRXhlY3V0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobXNnLCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgLy8gVE9ETzogc2tpcCBmbHVzaGluZyBpZiBhbHJlYWR5IEZMVVNIRUQKICAgICAgICAgICAgIHNldFN0YXRlKEZMVVNISU5HKTsKIAogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxGbHVzaCgpOwogICAgICAgICAgICAgcmV0dXJuQnVmZmVyc1RvQ29kZWMoKTsKKyAgICAgICAgICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKKyAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI7CisgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKKyAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZTo6a0VuYWJsZWROb0J1ZmZlcikpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMzUxMCw2ICs0NDUxLDEwOCBAQAogICAgIH0KIH0KIAordm9pZCBNZWRpYUNvZGVjOjpoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2VJZk5lZWRlZChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IGJ1ZmZlci0+Zm9ybWF0KCk7CisgICAgaWYgKG1PdXRwdXRGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1GbGFncyAmIGtGbGFnVXNlQmxvY2tNb2RlbCkgeworICAgICAgICBzcDxBTWVzc2FnZT4gZGlmZjEgPSBtT3V0cHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShmb3JtYXQpOworICAgICAgICBzcDxBTWVzc2FnZT4gZGlmZjIgPSBmb3JtYXQtPmNoYW5nZXNGcm9tKG1PdXRwdXRGb3JtYXQpOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4ga2V5czsKKyAgICAgICAgc2l6ZV90IG51bUVudHJpZXMgPSBkaWZmMS0+Y291bnRFbnRyaWVzKCk7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgKytpKSB7CisgICAgICAgICAgICBrZXlzLmVtcGxhY2UoZGlmZjEtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKSk7CisgICAgICAgIH0KKyAgICAgICAgbnVtRW50cmllcyA9IGRpZmYyLT5jb3VudEVudHJpZXMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgIGtleXMuZW1wbGFjZShkaWZmMi0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBzcDxXcmFwcGVyT2JqZWN0PHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPj4+IGNoYW5nZWRLZXlzeworICAgICAgICAgICAgbmV3IFdyYXBwZXJPYmplY3Q8c3RkOjpzZXQ8c3RkOjpzdHJpbmc+PntzdGQ6Om1vdmUoa2V5cyl9fTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldE9iamVjdCgiY2hhbmdlZEtleXMiLCBjaGFuZ2VkS2V5cyk7CisgICAgfQorICAgIG1PdXRwdXRGb3JtYXQgPSBmb3JtYXQ7CisgICAgbWFwRm9ybWF0KG1Db21wb25lbnROYW1lLCBmb3JtYXQsIG51bGxwdHIsIHRydWUpOworICAgIEFMT0dWKCJbJXNdIG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0bzogJXMiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisKKyAgICBpZiAobVNvZnRSZW5kZXJlciA9PSBOVUxMICYmCisgICAgICAgICAgICBtU3VyZmFjZSAhPSBOVUxMICYmCisgICAgICAgICAgICAobUZsYWdzICYga0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcikpIHsKKyAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKKworICAgICAgICAvLyBUT0RPOiBwcm9wYWdhdGUgY29sb3IgYXNwZWN0cyB0byBzb2Z0d2FyZSByZW5kZXJlciB0byBhbGxvdyBiZXR0ZXIKKyAgICAgICAgLy8gY29sb3IgY29udmVyc2lvbiB0byBSR0IuIEZvciBub3csIGp1c3QgbWFyayBkYXRhc3BhY2UgZm9yIFlVVgorICAgICAgICAvLyByZW5kZXJpbmcuCisgICAgICAgIGludDMyX3QgZGF0YVNwYWNlOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAmZGF0YVNwYWNlKSkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gc2V0dGluZyBkYXRhc3BhY2Ugb24gb3V0cHV0IHN1cmZhY2UgdG8gIyV4IiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YVNwYWNlKTsKKyAgICAgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UoCisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLmdldCgpLCAoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBkYXRhc3BhY2Ugb24gc3VyZmFjZSAoJWQpIiwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpKSB7CisgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIGluZm87CisgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobU91dHB1dEZvcm1hdCwgJmluZm8pKSB7CisgICAgICAgICAgICAgICAgc2V0TmF0aXZlV2luZG93SGRyTWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksICZpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgIG1TdXJmYWNlLT5zZXREZXF1ZXVlVGltZW91dCgtMSk7CisgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVxdWVzdENwdUJvb3N0SWZOZWVkZWQoKTsKKworICAgIGlmIChtRmxhZ3MgJiBrRmxhZ0lzRW5jb2RlcikgeworICAgICAgICAvLyBCZWZvcmUgd2UgYW5ub3VuY2UgdGhlIGZvcm1hdCBjaGFuZ2Ugd2Ugc2hvdWxkCisgICAgICAgIC8vIGNvbGxlY3QgY29kZWMgc3BlY2lmaWMgZGF0YSBhbmQgYW1lbmQgdGhlIG91dHB1dAorICAgICAgICAvLyBmb3JtYXQgYXMgbmVjZXNzYXJ5LgorICAgICAgICBpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgKHZvaWQpIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKTsKKyAgICAgICAgaWYgKChmbGFncyAmIEJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAmJiAhKG1GbGFncyAmIGtGbGFnSXNTZWN1cmUpCisgICAgICAgICAgICAgICAgJiYgIW1Pd25lck5hbWUuc3RhcnRzV2l0aCgiY29kZWMyOjoiKSkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBhbWVuZE91dHB1dEZvcm1hdFdpdGhDb2RlY1NwZWNpZmljRGF0YShidWZmZXIpOworCisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHNwaXQgb3V0IG1hbGZvcm1lZCBjb2RlYyAiCisgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmljIGRhdGEhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgeworICAgICAgICBvbk91dHB1dEZvcm1hdENoYW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdPdXRwdXRGb3JtYXRDaGFuZ2VkOworICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CisgICAgfQorCisgICAgLy8gTm90aWZ5IG1DcnlwdG8gb2YgdmlkZW8gcmVzb2x1dGlvbiBjaGFuZ2VzCisgICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRSZWN0KCJjcm9wIiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKKyAgICAgICAgICAgIG1DcnlwdG8tPm5vdGlmeVJlc29sdXRpb24ocmlnaHQgLSBsZWZ0ICsgMSwgYm90dG9tIC0gdG9wICsgMSk7CisgICAgICAgIH0gZWxzZSBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgICAgICAmJiBtT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtQ3J5cHRvLT5ub3RpZnlSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIE1lZGlhQ29kZWM6OmV4dHJhY3RDU0QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKICAgICBtQ1NELmNsZWFyKCk7CiAKQEAgLTM4NDMsMTEgKzQ4ODYsNDQgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKICAgICB9CiAKKyAgICBpZiAobVR1bm5lbGVkKSB7CisgICAgICAgIFR1bm5lbFBlZWtTdGF0ZSBwcmV2aW91c1N0YXRlID0gbVR1bm5lbFBlZWtTdGF0ZTsKKyAgICAgICAgc3dpdGNoKG1UdW5uZWxQZWVrU3RhdGUpeworICAgICAgICAgICAgY2FzZSBUdW5uZWxQZWVrU3RhdGU6OmtFbmFibGVkTm9CdWZmZXI6CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJ0dW5uZWwtZmlyc3QtZnJhbWUiLCAxKTsKKyAgICAgICAgICAgICAgICBtVHVubmVsUGVla1N0YXRlID0gVHVubmVsUGVla1N0YXRlOjprRW5hYmxlZFF1ZXVlZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKG1UdW5uZWxQZWVrU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVHVubmVsUGVla1N0YXRlOjprRGlzYWJsZWROb0J1ZmZlcjoKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoInR1bm5lbC1maXJzdC1mcmFtZSIsIDEpOworICAgICAgICAgICAgICAgIG1UdW5uZWxQZWVrU3RhdGUgPSBUdW5uZWxQZWVrU3RhdGU6OmtEaXNhYmxlZFF1ZXVlZDsKKyAgICAgICAgICAgICAgICBBTE9HVigiVHVubmVsUGVla1N0YXRlOiAlcyAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhwcmV2aW91c1N0YXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKG1UdW5uZWxQZWVrU3RhdGUpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpZiAoaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpICYmICFjMkJ1ZmZlciAmJiAhbWVtb3J5KSB7CiAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnOwogICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJlcnJvckRldGFpbE1zZyIsICh2b2lkICoqKSZlcnJvckRldGFpbE1zZykpOwotCisgICAgICAgIC8vIE5vdGlmeSBtQ3J5cHRvIG9mIHZpZGVvIHJlc29sdXRpb24gY2hhbmdlcworICAgICAgICBpZiAobVR1bm5lbGVkICYmIG1DcnlwdG8gIT0gTlVMTCkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKG1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggIT0gbVR1bm5lbGVkSW5wdXRXaWR0aCB8fCBoZWlnaHQgIT0gbVR1bm5lbGVkSW5wdXRIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVR1bm5lbGVkSW5wdXRXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgICAgICBtVHVubmVsZWRJbnB1dEhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgbUNyeXB0by0+bm90aWZ5UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgZXJyID0gbUJ1ZmZlckNoYW5uZWwtPnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCiAgICAgICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICAgICAgIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSwKQEAgLTM4NzYsNyArNDk1Miw3IEBACiAgICAgICAgIGluZm8tPm1Pd25lZEJ5Q2xpZW50ID0gZmFsc2U7CiAgICAgICAgIGluZm8tPm1EYXRhLmNsZWFyKCk7CiAKLSAgICAgICAgc3RhdHNCdWZmZXJTZW50KHRpbWVVcyk7CisgICAgICAgIHN0YXRzQnVmZmVyU2VudCh0aW1lVXMsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgcmV0dXJuIGVycjsKQEAgLTM5NjcsNyArNTA0MywxNSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtQnVmZmVyQ2hhbm5lbC0+cmVuZGVyT3V0cHV0QnVmZmVyKGJ1ZmZlciwgcmVuZGVyVGltZU5zKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckNoYW5uZWwtPnJlbmRlck91dHB1dEJ1ZmZlcihidWZmZXIsIHJlbmRlclRpbWVOcyk7CisKKyAgICAgICAgaWYgKGVyciA9PSBOT19JTklUKSB7CisgICAgICAgICAgICBBTE9HRSgicmVuZGVyaW5nIHRvIG5vbi1pbml0aWxpemVkKG9ic29sZXRlKSBzdXJmYWNlIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJyZW5kcmluZyBvdXRwdXQgZXJyb3IgJWQiLCBlcnIpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUJ1ZmZlckNoYW5uZWwtPmRpc2NhcmRCdWZmZXIoYnVmZmVyKTsKICAgICB9CkBAIC0zOTc1LDE5ICs1MDU5LDMxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zc2l6ZV90IE1lZGlhQ29kZWM6OmRlcXVldWVQb3J0QnVmZmVyKGludDMyX3QgcG9ydEluZGV4KSB7CitNZWRpYUNvZGVjOjpCdWZmZXJJbmZvICpNZWRpYUNvZGVjOjpwZWVrTmV4dFBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpIHsKICAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKIAogICAgIExpc3Q8c2l6ZV90PiAqYXZhaWxCdWZmZXJzID0gJm1BdmFpbFBvcnRCdWZmZXJzW3BvcnRJbmRleF07CiAKICAgICBpZiAoYXZhaWxCdWZmZXJzLT5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF1bKmF2YWlsQnVmZmVycy0+YmVnaW4oKV07Cit9CisKK3NzaXplX3QgTWVkaWFDb2RlYzo6ZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpIHsKKyAgICBDSEVDSyhwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0IHx8IHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KTsKKworICAgIEJ1ZmZlckluZm8gKmluZm8gPSBwZWVrTmV4dFBvcnRCdWZmZXIocG9ydEluZGV4KTsKKyAgICBpZiAoIWluZm8pIHsKICAgICAgICAgcmV0dXJuIC1FQUdBSU47CiAgICAgfQogCisgICAgTGlzdDxzaXplX3Q+ICphdmFpbEJ1ZmZlcnMgPSAmbUF2YWlsUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XTsKICAgICBzaXplX3QgaW5kZXggPSAqYXZhaWxCdWZmZXJzLT5iZWdpbigpOworICAgIENIRUNLX0VRKGluZm8sICZtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XVtpbmRleF0pOwogICAgIGF2YWlsQnVmZmVycy0+ZXJhc2UoYXZhaWxCdWZmZXJzLT5iZWdpbigpKTsKIAotICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbVBvcnRCdWZmZXJzW3BvcnRJbmRleF1baW5kZXhdOwogICAgIENIRUNLKCFpbmZvLT5tT3duZWRCeUNsaWVudCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUJ1ZmZlckxvY2spOwpAQCAtNDAyMSw2ICs1MTE3LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBpbiBjYXNlIHdlIGRvbid0IGNvbm5lY3QsIGVuc3VyZSB0aGF0IHdlIGRvbid0IHNpZ25hbCB0aGUgc3VyZmFjZSBpcworICAgICAgICAvLyBjb25uZWN0ZWQgdG8gdGhlIHNjcmVlbgorICAgICAgICBtSXNTdXJmYWNlVG9TY3JlZW4gPSBmYWxzZTsKKwogICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3dDb25uZWN0KHN1cmZhY2UuZ2V0KCksICJjb25uZWN0VG9TdXJmYWNlIik7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIC8vIFJlcXVpcmUgYSBmcmVzaCBzZXQgb2YgYnVmZmVycyBhZnRlciBlYWNoIGNvbm5lY3QgYnkgdXNpbmcgYSB1bmlxdWUgZ2VuZXJhdGlvbgpAQCAtNDA0Niw2ICs1MTQ2LDEwIEBACiAgICAgICAgICAgICBpZiAoIW1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpIHsKICAgICAgICAgICAgICAgICBkaXNhYmxlTGVnYWN5QnVmZmVyRHJvcFBvc3RRKHN1cmZhY2UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8ga2VlcCB0cmFjayB3aGV0aGVyIG9yIG5vdCB0aGUgYnVmZmVycyBvZiB0aGUgY29ubmVjdGVkIHN1cmZhY2UgZ28gdG8gdGhlIHNjcmVlbgorICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgICAgICBzdXJmYWNlLT5xdWVyeShOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsICZyZXN1bHQpOworICAgICAgICAgICAgbUlzU3VyZmFjZVRvU2NyZWVuID0gcmVzdWx0ICE9IDA7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gZG8gbm90IHJldHVybiBBTFJFQURZX0VYSVNUUyB1bmxlc3Mgc3VyZmFjZXMgYXJlIHRoZSBzYW1lCkBAIC00MDYzLDYgKzUxNjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGFzc3VtZSBkaXNjb25uZWN0ZWQgZXZlbiBvbiBlcnJvcgogICAgICAgICBtU3VyZmFjZS5jbGVhcigpOworICAgICAgICBtSXNTdXJmYWNlVG9TY3JlZW4gPSBmYWxzZTsKICAgICB9CiAgICAgcmV0dXJuIGVycjsKIH0KQEAgLTQxMDcsMTMgKzUyMTIsMTMgQEAKIAogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogCi0gICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzKTsKLQogICAgICAgICBpbnQzMl90IGZsYWdzOwogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJmbGFncyIsICZmbGFncykpOwogCiAgICAgICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwogCisgICAgICAgIHN0YXRzQnVmZmVyUmVjZWl2ZWQodGltZVVzLCBidWZmZXIpOworCiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KIH0KQEAgLTQxODAsNiArNTI4NSw4IEBACiAKIHN0YXR1c190IE1lZGlhQ29kZWM6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgewogICAgIHVwZGF0ZUxvd0xhdGVuY3kocGFyYW1zKTsKKyAgICBtYXBGb3JtYXQobUNvbXBvbmVudE5hbWUsIHBhcmFtcywgbnVsbHB0ciwgZmFsc2UpOworICAgIHVwZGF0ZVR1bm5lbFBlZWsocGFyYW1zKTsKICAgICBtQ29kZWMtPnNpZ25hbFNldFBhcmFtZXRlcnMocGFyYW1zKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTQyMjksNiArNTMzNiwzMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBNZWRpYUNvZGVjOjpwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKAorICAgICAgICBzdGQ6OnN0cmluZyBvcmlnaW4sIHN0YXR1c190IGVyciAvKiA9IE9LICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNle25ldyBBTWVzc2FnZX07CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgfQorICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMob3JpZ2luLCByZXNwb25zZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6cG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygKKyAgICAgICAgc3RkOjpzdHJpbmcgb3JpZ2luLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlc3BvbnNlKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgICAgICAgICFtUmVwbHlJRCwKKyAgICAgICAgICAgICJwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzOiBtUmVwbHlJRCA9PSBudWxsLCBmcm9tICVzIGZvbGxvd2luZyAlcyIsCisgICAgICAgICAgICBvcmlnaW4uY19zdHIoKSwKKyAgICAgICAgICAgIG1MYXN0UmVwbHlPcmlnaW4uY19zdHIoKSk7CisgICAgbUxhc3RSZXBseU9yaWdpbiA9IG9yaWdpbjsKKyAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICBtUmVwbHlJRC5jbGVhcigpOworICAgIEFMT0dWX0lGKCFtRGVmZXJyZWRNZXNzYWdlcy5lbXB0eSgpLAorICAgICAgICAgICAgInBvc3RpbmcgJXp1IGRlZmVycmVkIG1lc3NhZ2VzIiwgbURlZmVycmVkTWVzc2FnZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNwPEFNZXNzYWdlPiBtc2cgOiBtRGVmZXJyZWRNZXNzYWdlcykgeworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgbURlZmVycmVkTWVzc2FnZXMuY2xlYXIoKTsKK30KKwogc3RkOjpzdHJpbmcgTWVkaWFDb2RlYzo6c3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpIHsKICAgICBjb25zdCBjaGFyICpydmFsID0gTlVMTDsKICAgICBjaGFyIHJhd2J1ZmZlclsxNl07IC8vIHJvb20gZm9yICIlZCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBhYzU0ZmExLi42MjQzODI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxyZWdleD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yMDksOSArMjEwLDEyIEBACiAgICAgICAgICAgICBBTE9HRCgiaWdub3JlZCBhIG51bGwgYnVpbGRlciIpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgbUluaXRDaGVjayA9IGJ1aWxkZXItPmJ1aWxkTWVkaWFDb2RlY0xpc3QoJndyaXRlcik7Ci0gICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXV0byBjdXJyZW50Q2hlY2sgPSBidWlsZGVyLT5idWlsZE1lZGlhQ29kZWNMaXN0KCZ3cml0ZXIpOworICAgICAgICBpZiAoY3VycmVudENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRCgiaWdub3JlZCBmYWlsZWQgYnVpbGRlciIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gY3VycmVudENoZWNrOwogICAgICAgICB9CiAgICAgfQogICAgIHdyaXRlci53cml0ZUdsb2JhbFNldHRpbmdzKG1HbG9iYWxTZXR0aW5ncyk7CkBAIC0zNDUsNiArMzQ5LDE0IEBACiB2b2lkIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsIGJvb2wgZW5jb2RlciwgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgIFZlY3RvcjxBU3RyaW5nPiAqbWF0Y2hlcykgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7ICAgICAgICAvLyBpbml0aWFsaXplcyBhcyBjbGVhci9udWxsCisgICAgZmluZE1hdGNoaW5nQ29kZWNzKG1pbWUsIGVuY29kZXIsIGZsYWdzLCBmb3JtYXQsIG1hdGNoZXMpOworfQorCisvL3N0YXRpYwordm9pZCBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICBjb25zdCBjaGFyICptaW1lLCBib29sIGVuY29kZXIsIHVpbnQzMl90IGZsYWdzLCBzcDxBTWVzc2FnZT4gZm9ybWF0LAorICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoZXMpIHsKICAgICBtYXRjaGVzLT5jbGVhcigpOwogCiAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gZ2V0SW5zdGFuY2UoKTsKQEAgLTM2NSwxNCArMzc3LDIyIEBACiAKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8obWF0Y2hJbmRleCk7CiAgICAgICAgIENIRUNLKGluZm8gIT0gbnVsbHB0cik7CisKICAgICAgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CiAKKyAgICAgICAgaWYgKCFjb2RlY0hhbmRsZXNGb3JtYXQobWltZSwgaW5mbywgZm9ybWF0KSkgeworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGNvZGVjICclcycgd2hpY2ggZG9lc24ndCBzYXRpc2Z5IGZvcm1hdCAlcyIsCisgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLmNfc3RyKCksIGZvcm1hdC0+ZGVidWdTdHJpbmcoMikuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoZmxhZ3MgJiBrSGFyZHdhcmVDb2RlY3NPbmx5KSAmJiBpc1NvZnR3YXJlQ29kZWMoY29tcG9uZW50TmFtZSkpIHsKICAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBTVyBjb2RlYyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hdGNoZXMtPnB1c2goY29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICBBTE9HVigibWF0Y2hpbmcgJyVzJyIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIG1hdGNoZXMtPnB1c2goY29tcG9uZW50TmFtZSk7CisgICAgICAgIEFMT0dWKCJtYXRjaGluZyAnJXMnIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBrUHJlZmVyU29mdHdhcmVDb2RlY3MgfHwKQEAgLTM4MSw0ICs0MDEsMTE4IEBACiAgICAgfQogfQogCisvKnN0YXRpYyovCitib29sIE1lZGlhQ29kZWNMaXN0Ojpjb2RlY0hhbmRsZXNGb3JtYXQoY29uc3QgY2hhciAqbWltZSwgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgeworCisgICAgaWYgKGZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJjb2RlY0hhbmRsZXNGb3JtYXQ6IG5vIGZvcm1hdCwgc28gbm8gZXh0cmEgY2hlY2tzIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcGFiaWxpdGllcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtaW1lKTsKKworICAgIC8vIC4uLiBubyBjYXBhYmlsaXRpZXMgbGlzdGVkIG1lYW5zICdoYW5kbGUgaXQgYWxsJworICAgIGlmIChjYXBhYmlsaXRpZXMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiY29kZWNIYW5kbGVzRm9ybWF0OiBubyBjYXBhYmlsaXRpZXMgZm9yIHJlZmluZW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZkZXRhaWxzID0gY2FwYWJpbGl0aWVzLT5nZXREZXRhaWxzKCk7CisKKyAgICAvLyBpZiBwYXJzaW5nIHRoZSBjYXBhYmlsaXRpZXMgZmFpbHMsIGlnbm9yZSB0aGlzIHBhcnRpY3VsYXIgY29kZWMKKyAgICAvLyBjdXJyZW50bHkgdmlkZW8tY2VudHJpYyBldmFsdWF0aW9uCisgICAgLy8KKyAgICAvLyBUT0RPOiBsaWtlIHRvIG1ha2UgaXQgaGFuZGxlIHRoZSBzYW1lIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20KKyAgICAvLyBNZWRpYUNvZGVjSW5mbzo6aXNGb3JtYXRTdXBwb3J0ZWQoKQorICAgIC8vIG5vdCB5ZXQgZG9uZSBoZXJlIGFyZToKKyAgICAvLyAgcHJvZmlsZSwgbGV2ZWwsIGJpdHJhdGUsIGZlYXR1cmVzLAorCisgICAgYm9vbCBpc1ZpZGVvID0gZmFsc2U7CisgICAgaWYgKHN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpID09IDApIHsKKyAgICAgICAgaXNWaWRlbyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGlzVmlkZW8pIHsKKyAgICAgICAgaW50IHdpZHRoID0gLTE7CisgICAgICAgIGludCBoZWlnaHQgPSAtMTsKKworICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpICYmIGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpIHsKKworICAgICAgICAgICAgLy8gaXMgaXQgd2l0aGluIHRoZSBzdXBwb3J0ZWQgc2l6ZSByYW5nZSBvZiB0aGUgY29kZWM/CisgICAgICAgICAgICBBU3RyaW5nIHNpemVSYW5nZTsKKyAgICAgICAgICAgIEFTdHJpbmcgbWluU2l6ZSxtYXhTaXplOworICAgICAgICAgICAgQVN0cmluZyBtaW5XaWR0aCwgbWluSGVpZ2h0OworICAgICAgICAgICAgQVN0cmluZyBtYXhXaWR0aCwgbWF4SGVpZ2h0OworICAgICAgICAgICAgaWYgKCFkZXRhaWxzLT5maW5kU3RyaW5nKCJzaXplLXJhbmdlIiwgJnNpemVSYW5nZSkKKyAgICAgICAgICAgICAgICB8fCAhc3BsaXRTdHJpbmcoc2l6ZVJhbmdlLCAiLSIsICZtaW5TaXplLCAmbWF4U2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHBhcnNlIHNpemUtcmFuZ2UgZnJvbSBjb2RlYyBpbmZvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzcGxpdFN0cmluZyhtaW5TaXplLCAieCIsICZtaW5XaWR0aCwgJm1pbkhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNwbGl0U3RyaW5nKG1pblNpemUsICIqIiwgJm1pbldpZHRoLCAmbWluSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHBhcnNlIHNpemUtcmFuZ2UvbWluLXNpemUgZnJvbSBjb2RlYyBpbmZvIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNwbGl0U3RyaW5nKG1heFNpemUsICJ4IiwgJm1heFdpZHRoLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIGlmICghc3BsaXRTdHJpbmcobWF4U2l6ZSwgIioiLCAmbWF4V2lkdGgsICZtYXhIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJVbmFibGUgdG8gZnVsbHkgcGFyc2Ugc2l6ZS1yYW5nZS9tYXgtc2l6ZSBmcm9tIGNvZGVjIGluZm8iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3RydG9sKCkgcmV0dXJucyAwIGlmIHVuYWJsZSB0byBwYXJzZSBhIG51bWJlciwgd2hpY2ggd29ya3MgZm9yIG91ciBsYXRlciB0ZXN0cworICAgICAgICAgICAgaW50IG1pblcgPSBzdHJ0b2wobWluV2lkdGguY19zdHIoKSwgTlVMTCwgMTApOworICAgICAgICAgICAgaW50IG1pbkggPSBzdHJ0b2wobWluSGVpZ2h0LmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIGludCBtYXhXID0gc3RydG9sKG1heFdpZHRoLmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIGludCBtYXhIID0gc3RydG9sKG1heEhlaWdodC5jX3N0cigpLCBOVUxMLCAxMCk7CisKKyAgICAgICAgICAgIGlmIChtaW5XID09IDAgfHwgbWluSCA9PSAwIHx8IG1heFcgPT0gMCB8fCBtYXhIID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHBhcnNlIHZhbHVlcyBmcm9tIHNpemUtcmFuZ2UgZnJvbSBjb2RlYyBpbmZvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmaW5hbGx5LCBjb21wYXJpc29uIHRpbWUKKyAgICAgICAgICAgIGlmICh3aWR0aCA8IG1pblcgfHwgd2lkdGggPiBtYXhXIHx8IGhlaWdodCA8IG1pbkggfHwgaGVpZ2h0ID4gbWF4SCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJmb3JtYXQgJWR4JWQgb3V0c2lkZSBvZiBhbGxvd2VkICVkeCVkLSVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtaW5XLCBtaW5ILCBtYXhXLCBtYXhIKTsKKyAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBpdCdzIGEgcmVqZWN0aW9uLCBVTkxFU1MKKyAgICAgICAgICAgICAgICAvLyB0aGUgY29kZWMgYWxsb3dzIHN3YXBwaW5nIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN3YXBwYWJsZTsKKyAgICAgICAgICAgICAgICBpZiAoIWRldGFpbHMtPmZpbmRJbnQzMigiZmVhdHVyZS1jYW4tc3dhcC13aWR0aC1oZWlnaHQiLCAmc3dhcHBhYmxlKQorICAgICAgICAgICAgICAgICAgICB8fCBzd2FwcGFibGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIE5COiBkZWxpYmVyYXRlIGNvbXBhcmlzb24gb2YgaGVpZ2h0IHZzIHdpZHRoIGxpbWl0cyAoYW5kIHdpZHRoIHZzIGhlaWdodCkKKyAgICAgICAgICAgICAgICBpZiAoaGVpZ2h0IDwgbWluVyB8fCBoZWlnaHQgPiBtYXhXIHx8IHdpZHRoIDwgbWluSCB8fCB3aWR0aCA+IG1heEgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQCAnYWxpZ25tZW50JyBbZS5nLiAiMngyIiB3aGljaCB0ZWxscyB1cyB0aGF0IGJvdGggZGltZW5zaW9ucyBtdXN0IGJlIGV2ZW5dCisgICAgICAgICAgICAvLyBubyBhbGlnbm1lbnQgPT0gd2UncmUgb2sgd2l0aCBhbnl0aGluZworICAgICAgICAgICAgQVN0cmluZyBhbGlnbm1lbnQsIGFsaWduV2lkdGgsIGFsaWduSGVpZ2h0OworICAgICAgICAgICAgaWYgKGRldGFpbHMtPmZpbmRTdHJpbmcoImFsaWdubWVudCIsICZhbGlnbm1lbnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNwbGl0U3RyaW5nKGFsaWdubWVudCwgIngiLCAmYWxpZ25XaWR0aCwgJmFsaWduSGVpZ2h0KSB8fAorICAgICAgICAgICAgICAgICAgICBzcGxpdFN0cmluZyhhbGlnbm1lbnQsICIqIiwgJmFsaWduV2lkdGgsICZhbGlnbkhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHdBbGlnbiA9IHN0cnRvbChhbGlnbldpZHRoLmNfc3RyKCksIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhBbGlnbiA9IHN0cnRvbChhbGlnbkhlaWdodC5jX3N0cigpLCBOVUxMLCAxMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHN0cnRvbCgpIHJldHVybnMgMCBpZiBmYWlsaW5nIHRvIHBhcnNlLCB0cmVhdCBhcyAibm8gcmVzdHJpY3Rpb24iCisgICAgICAgICAgICAgICAgICAgIGlmICh3QWxpZ24gPiAwICYmIGhBbGlnbiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHdpZHRoICUgd0FsaWduKSAhPSAwIHx8IChoZWlnaHQgJSBoQWxpZ24pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZm9ybWF0IGRpbWVuc2lvbnMgJWR4JWQgbm90IGFsaWduZWQgdG8gJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgd0FsaWduLCBoQWxpZ24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoYXZlbid0IGZvdW5kIGEgcmVhc29uIHRvIGRpc2NhcmQgdGhpcyBvbmUKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKaW5kZXggMTM5NWMyNy4uMDEwN2MzMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CkBAIC0xNjgsOSArMTY5LDcgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRTdG9wVGltZVVzLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDY0KCJzdG9wLXRpbWUtdXMiLCBzdG9wVGltZVVzKTsKLSAgICByZXR1cm4gcG9zdFN5bmNocm9ub3VzbHlBbmRSZXR1cm5FcnJvcihtc2cpOworICAgIHJldHVybiBtU291cmNlLT5zZXRTdG9wVGltZVVzKHN0b3BUaW1lVXMpOwogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpQdWxsZXI6OnN0YXJ0KGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKQEAgLTE4OCwxOSArMTg3LDExIEBACiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6UHVsbGVyOjpzdG9wKCkgewotICAgIGJvb2wgaW50ZXJydXB0ID0gZmFsc2U7Ci0gICAgewotICAgICAgICAvLyBtYXJrIHN0b3BwaW5nIGJlZm9yZSBhY3R1YWxseSByZWFjaGluZyBrV2hhdFN0b3Agb24gdGhlIGxvb3Blciwgc28gdGhlIHB1bGxpbmcgd2lsbAotICAgICAgICAvLyBzdG9wLgotICAgICAgICBNdXRleGVkPFF1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1RdWV1ZSk7Ci0gICAgICAgIHF1ZXVlLT5tUHVsbGluZyA9IGZhbHNlOwotICAgICAgICBpbnRlcnJ1cHQgPSBxdWV1ZS0+bVJlYWRQZW5kaW5nU2luY2UgJiYgKHF1ZXVlLT5tUmVhZFBlbmRpbmdTaW5jZSA8IEFMb29wZXI6OkdldE5vd1VzKCkgLSAxMDAwMDAwKTsKLSAgICAgICAgcXVldWUtPmZsdXNoKCk7IC8vIGZsdXNoIGFueSB1bnByb2Nlc3NlZCBwdWxsZWQgYnVmZmVycwotICAgIH0KLQotICAgIGlmIChpbnRlcnJ1cHQpIHsKLSAgICAgICAgaW50ZXJydXB0U291cmNlKCk7Ci0gICAgfQorICAgIC8vIG1hcmsgc3RvcHBpbmcgYmVmb3JlIGFjdHVhbGx5IHJlYWNoaW5nIGtXaGF0U3RvcCBvbiB0aGUgbG9vcGVyLCBzbyB0aGUgcHVsbGluZyB3aWxsCisgICAgLy8gc3RvcC4KKyAgICBNdXRleGVkPFF1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1RdWV1ZSk7CisgICAgcXVldWUtPm1QdWxsaW5nID0gZmFsc2U7CisgICAgcXVldWUtPmZsdXNoKCk7IC8vIGZsdXNoIGFueSB1bnByb2Nlc3NlZCBwdWxsZWQgYnVmZmVycwogfQogCiB2b2lkIE1lZGlhQ29kZWNTb3VyY2U6OlB1bGxlcjo6aW50ZXJydXB0U291cmNlKCkgewpAQCAtNDM1LDYgKzQyNiwzMCBAQAogICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzZXRFbmNvZGluZ0JpdHJhdGUoaW50MzJfdCBiaXRSYXRlKSB7CisgICAgQUxPR1YoInNldEVuY29kaW5nQml0cmF0ZSAoJWQpIiwgYml0UmF0ZSk7CisKKyAgICBpZiAobUVuY29kZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygic2V0RW5jb2RpbmdCaXRyYXRlICglZCkgOiBtRW5jb2RlciBpcyBudWxsIiwgYml0UmF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKKyAgICBwYXJhbXMtPnNldEludDMyKCJ2aWRlby1iaXRyYXRlIiwgYml0UmF0ZSk7CisKKyAgICByZXR1cm4gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6cmVxdWVzdElEUkZyYW1lKCkgeworICAgIGlmIChtRW5jb2RlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJyZXF1ZXN0SURSRnJhbWUgOiBtRW5jb2RlciBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY29kZXItPnJlcXVlc3RJRFJGcmFtZSgpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorfQorCiBNZWRpYUNvZGVjU291cmNlOjpNZWRpYUNvZGVjU291cmNlKAogICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKQEAgLTY2MCw5ICs2NzUsOSBAQAogICAgIGlmIChtU3RvcHBpbmcgJiYgcmVhY2hlZEVPUykgewogICAgICAgICBBTE9HSSgiZW5jb2RlciAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgaWYgKG1QdWxsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbVB1bGxlci0+c3RvcFNvdXJjZSgpOworICAgICAgICAgICAgbVB1bGxlci0+aW50ZXJydXB0U291cmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKKyAgICAgICAgQUxPR0koInNvdXJjZSAoJXMpIHN0b3BwZWQiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgLy8gcG9zdGluZyByZXBseSB0byBldmVyeW9uZSB0aGF0J3Mgd2FpdGluZwogICAgICAgICBMaXN0PHNwPEFSZXBseVRva2VuPj46Oml0ZXJhdG9yIGl0OwogICAgICAgICBmb3IgKGl0ID0gbVN0b3BSZXBseUlEUXVldWUuYmVnaW4oKTsKQEAgLTY5MCw2ICs3MDUsOSBAQAogc3RhdHVzX3QgTWVkaWFDb2RlY1NvdXJjZTo6ZmVlZEVuY29kZXJJbnB1dEJ1ZmZlcnMoKSB7CiAgICAgTWVkaWFCdWZmZXJCYXNlKiBtYnVmID0gTlVMTDsKICAgICB3aGlsZSAoIW1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZW1wdHkoKSAmJiBtUHVsbGVyLT5yZWFkQnVmZmVyKCZtYnVmKSkgeworICAgICAgICBpZiAoIW1FbmNvZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCA9ICptQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCk7CiAgICAgICAgIG1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuZXJhc2UobUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5iZWdpbigpKTsKIApAQCAtNzQ0LDYgKzc2MiwyMyBAQAogICAgICAgICAgICAgbWVtY3B5KGluYnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgc2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgeworICAgICAgICAgICAgICAgIGludDMyX3QgZHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtYnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUNvbG9yU3BhY2UsICZkcykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGRzICE9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2UgPSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oZHMpOworICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhc3BhY2UpOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVXBkYXRpbmcgZGF0YXNwYWNlIHRvICV4IiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFuZGFyZCwgdHJhbnNmZXIsIHJhbmdlOworICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21EYXRhU3BhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNwYWNlLCAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMobXNnKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvLyB2aWRlbyBlbmNvZGVyIHdpbGwgcmVsZWFzZSBNZWRpYUJ1ZmZlciB3aGVuIGRvbmUKICAgICAgICAgICAgICAgICAvLyB3aXRoIHVuZGVybHlpbmcgZGF0YS4KICAgICAgICAgICAgICAgICBpbmJ1Zi0+bWV0YSgpLT5zZXRPYmplY3QoIm1lZGlhQnVmZmVySG9sZGVyIiwgbmV3IE1lZGlhQnVmZmVySG9sZGVyKG1idWYpKTsKQEAgLTg1MSw3ICs4ODYsNyBAQAogICAgIHsKICAgICAgICAgaW50MzJfdCBlb3MgPSAwOwogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgewotICAgICAgICAgICAgQUxPR1YoInB1bGxlciAoJXMpIHJlYWNoZWQgRU9TIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgICAgICAgICBBTE9HSSgicHVsbGVyICglcykgcmVhY2hlZCBFT1MiLCBtSXNWaWRlbyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgICAgIHNpZ25hbEVPUygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEwNjksMTIgKzExMDQsNyBAQAogICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJzb3VyY2UgKCVzKSBzdG9wcGluZyIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwotICAgICAgICAgICAgbVB1bGxlci0+aW50ZXJydXB0U291cmNlKCk7Ci0gICAgICAgICAgICBBTE9HVigic291cmNlICglcykgc3RvcHBlZCIsIG1Jc1ZpZGVvID8gInZpZGVvIiA6ICJhdWRpbyIpOwotICAgICAgICB9CisgICAgICAgIEFMT0dEKCJzb3VyY2UgKCVzKSBzdG9wcGluZyBzdGFsbGVkIiwgbUlzVmlkZW8gPyAidmlkZW8iIDogImF1ZGlvIik7CiAgICAgICAgIHNpZ25hbEVPUygpOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC0xMTA2LDcgKzExMzYsNyBAQAogICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKTsKLSAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICBlcnIgPSBtRW5jb2RlciA/IG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcykgOiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CkBAIC0xMTI2LDcgKzExNTYsNyBAQAogICAgICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoInN0b3AtdGltZS11cyIsIHN0b3BUaW1lVXMpOwotICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgICAgIGVyciA9IG1FbmNvZGVyID8gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKSA6IEJBRF9WQUxVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IG1QdWxsZXItPnNldFN0b3BUaW1lVXMoc3RvcFRpbWVVcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCmluZGV4IGM2ZTc1M2QuLjI1MjBlMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcApAQCAtNTksNyArNTksNyBAQAogICAgICAgICAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleDsKICAgICAgICAgICAgIG1lZGlhRXhTZXJ2aWNlLT5tYWtlRXh0cmFjdG9yKAogICAgICAgICAgICAgICAgICAgICBDcmVhdGVJRGF0YVNvdXJjZUZyb21EYXRhU291cmNlKHNvdXJjZSksCi0gICAgICAgICAgICAgICAgICAgIG1pbWUgPyBzdGQ6Om1ha2VfdW5pcXVlPHN0ZDo6c3RyaW5nPihtaW1lKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIG1pbWUgPyBzdGQ6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPihtaW1lKSA6IHN0ZDo6bnVsbG9wdCwKICAgICAgICAgICAgICAgICAgICAgJmV4KTsKICAgICAgICAgICAgIHJldHVybiBleDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE4OCwxMSArMTg4LDExIEBACiAgICAgLy8gc2FuaXR5IGNoZWNrIGNoZWNrIHN0cnVjdCB2ZXJzaW9uLCB1dWlkLCBuYW1lCiAgICAgaWYgKHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uICE9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSAmJgogICAgICAgICAgICAgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7Ci0gICAgICAgIEFMT0dFKCJkb24ndCB1bmRlcnN0YW5kIGV4dHJhY3RvciBmb3JtYXQgJXUsIGlnbm9yaW5nLiIsIHBsdWdpbi0+ZGVmLmRlZl92ZXJzaW9uKTsKKyAgICAgICAgQUxPR1coImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChtZW1jbXAoJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLCAxNikgPT0gMCkgewotICAgICAgICBBTE9HRSgiaW52YWxpZCBVVUlELCBpZ25vcmluZyIpOworICAgICAgICBBTE9HVygiaW52YWxpZCBVVUlELCBpZ25vcmluZyIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSA9PSBOVUxMIHx8IHN0cmxlbihwbHVnaW4tPmRlZi5leHRyYWN0b3JfbmFtZSkgPT0gMCkgewpAQCAtMjQ0LDEzICsyNDQsMTggQEAKICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfZGxvcGVuX2V4dCgKICAgICAgICAgICAgICAgICAgICAgbGliUGF0aC5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMLCBkbGV4dGluZm8pOwotICAgICAgICAgICAgQ0hFQ0sobGliSGFuZGxlICE9IG51bGxwdHIpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJjb3VsZG4ndCBkbG9wZW4oIiA8PCBsaWJQYXRoLnN0cmluZygpIDw8ICIpICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgICAgICAgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImRsb3BlbiglcykgcmVwb3J0ZWQgZXJyb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBHZXRFeHRyYWN0b3JEZWYgZ2V0RGVmID0KICAgICAgICAgICAgICAgICAoR2V0RXh0cmFjdG9yRGVmKSBkbHN5bShsaWJIYW5kbGUsICJHRVRFWFRSQUNUT1JERUYiKTsKLSAgICAgICAgICAgIENIRUNLKGdldERlZiAhPSBudWxscHRyKQotICAgICAgICAgICAgICAgICAgICA8PCBsaWJQYXRoLnN0cmluZygpIDw8ICIgZG9lcyBub3QgY29udGFpbiBzbmlmZmVyIjsKKyAgICAgICAgICAgIGlmIChnZXREZWYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dJKCJubyBzbmlmZmVyIGZvdW5kIGluICVzIiwgbGliUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZGxjbG9zZShsaWJIYW5kbGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKApAQCAtMjU4LDcgKzI2Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2xvc2VkaXIobGliRGlyKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiY291bGRuJ3Qgb3BlbmRpciglcykiLCBsaWJEaXJQYXRoKTsKKyAgICAgICAgQUxPR0koInBsdWdpbiBkaXJlY3Rvcnkgbm90IHByZXNlbnQgKCVzKSIsIGxpYkRpclBhdGgpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAppbmRleCBjYWI0ZWJkLi5hOTQ2ZjcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcApAQCAtNzYsNiArNzYsNyBAQAogICAgIG1GaWxlTWV0YS5jbGVhcigpOwogICAgIG1Xcml0ZXIuY2xlYXIoKTsKICAgICBtVHJhY2tMaXN0LmNsZWFyKCk7CisgICAgbUZvcm1hdExpc3QuY2xlYXIoKTsKIH0KIAogc3NpemVfdCBNZWRpYU11eGVyOjphZGRUcmFjayhjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewpAQCAtOTIsNyArOTMsOSBAQAogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKTsKKyAgICBpZiAoY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKSAhPSBPSykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1lZGlhQWRhcHRlcj4gbmV3VHJhY2sgPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG5ld1RyYWNrKTsKQEAgLTEwNyw2ICsxMTAsOCBAQAogICAgICAgICAgICAgQUxPR1coImFkZFRyYWNrKCkgc2V0Q2FwdHVyZVJhdGUgZmFpbGVkIDolZCIsIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBtRm9ybWF0TGlzdC5hZGQoZm9ybWF0KTsKICAgICByZXR1cm4gbVRyYWNrTGlzdC5hZGQobmV3VHJhY2spOwogfQogCkBAIC0xNzUsMTYgKzE4MCwyMyBAQAogCiBzdGF0dXNfdCBNZWRpYU11eGVyOjp3cml0ZVNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgc2l6ZV90IHRyYWNrSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXhlckxvY2spOwotCiAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJXcml0ZVNhbXBsZURhdGEoKSBnZXQgYW4gTlVMTCBidWZmZXIuIik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQotICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgewotICAgICAgICBBTE9HRSgiV3JpdGVTYW1wbGVEYXRhKCkgaXMgY2FsbGVkIGluIGludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgeworICAgICAgICAvKiBBcyBNZWRpYU11eGVyJ3Mgd3JpdGVTYW1wbGVEYXRhIGhhbmRsZXMgaW5wdXRzIGZyb20gbXVsdGlwbGUgdHJhY2tzLAorICAgICAgICAgKiBsaW1pdGVkIHRoZSBzY29wZSBvZiBtTXV4ZXJMb2NrIHRvIHRoaXMgaW5uZXIgYmxvY2sgc28gdGhhdCB0aGUKKyAgICAgICAgICogY3VycmVudCB0cmFjaydzIGJ1ZmZlciBkb2VzIG5vdCB3YWl0IHVudGlsIHRoZSBjb21wbGV0aW9uCisgICAgICAgICAqIG9mIHByb2Nlc3Npbmcgb2YgcHJldmlvdXMgYnVmZmVyIG9mIHRoZSBzYW1lIG9yIGFub3RoZXIgdHJhY2suCisgICAgICAgICAqIEl0J3MgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGluZGl2aWR1YWwgdHJhY2sgLSBNZWRpYUFkYXB0ZXIgb2JqZWN0CisgICAgICAgICAqIHRvIGdhdGUgaXRzIGJ1ZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11eGVyTG9jayk7CisgICAgICAgIGlmIChtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICAgICAgQUxPR0UoIldyaXRlU2FtcGxlRGF0YSgpIGlzIGNhbGxlZCBpbiBpbnZhbGlkIHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICh0cmFja0luZGV4ID49IG1UcmFja0xpc3Quc2l6ZSgpKSB7CkBAIC0yMTUsOSArMjI3LDQyIEBACiAgICAgICAgIEFMT0dWKCJCVUZGRVJfRkxBR19FT1MiKTsKICAgICB9CiAKKyAgICBzcDxBTWVzc2FnZT4gYnVmTWV0YSA9IGJ1ZmZlci0+bWV0YSgpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGJ1Zk1ldGEtPmZpbmRJbnQ2NCgic2FtcGxlLWZpbGUtb2Zmc2V0IiwgJnZhbDY0KSkgeworICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5U2FtcGxlRmlsZU9mZnNldCwgdmFsNjQpOworICAgIH0KKyAgICBpZiAoYnVmTWV0YS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIgLypBTUVESUFGT1JNQVRfS0VZX0xBU1RfU0FNUExFX0lOREVYX0lOX0NIVU5LKi8sCisgICAgICAgICAgICAgICAgJnZhbDY0KSkgeworICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5TGFzdFNhbXBsZUluZGV4SW5DaHVuaywgdmFsNjQpOworICAgIH0KKwogICAgIHNwPE1lZGlhQWRhcHRlcj4gY3VycmVudFRyYWNrID0gbVRyYWNrTGlzdFt0cmFja0luZGV4XTsKICAgICAvLyBUaGlzIHB1c2hCdWZmZXIgd2lsbCB3YWl0IHVudGlsIHRoZSBtZWRpYUJ1ZmZlciBpcyBjb25zdW1lZC4KICAgICByZXR1cm4gY3VycmVudFRyYWNrLT5wdXNoQnVmZmVyKG1lZGlhQnVmZmVyKTsKIH0KIAorc3NpemVfdCBNZWRpYU11eGVyOjpnZXRUcmFja0NvdW50KCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV4ZXJMb2NrKTsKKyAgICBpZiAobVN0YXRlICE9IElOSVRJQUxJWkVEICYmIG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgIEFMT0dFKCJnZXRUcmFja0NvdW50KCkgbXVzdCBiZSBjYWxsZWQgZWl0aGVyIGluIElOSVRJQUxJWkVEIG9yIFNUQVJURUQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrTGlzdC5zaXplKCk7Cit9CisKK3NwPEFNZXNzYWdlPiBNZWRpYU11eGVyOjpnZXRUcmFja0Zvcm1hdChbW21heWJlX3VudXNlZF1dIHNpemVfdCBpZHgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11eGVyTG9jayk7CisgICAgaWYgKG1TdGF0ZSAhPSBJTklUSUFMSVpFRCAmJiBtU3RhdGUgIT0gU1RBUlRFRCkgeworICAgICAgICBBTE9HRSgiZ2V0VHJhY2tGb3JtYXQoKSBtdXN0IGJlIGNhbGxlZCBlaXRoZXIgaW4gSU5JVElBTElaRUQgb3IgU1RBUlRFRCBzdGF0ZSIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IG1Gb3JtYXRMaXN0LnNpemUoKSkgeworICAgICAgICBBTE9HRSgiZ2V0VHJhY2tGb3JtYXQoKSBpZHggaXMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUZvcm1hdExpc3RbaWR4XTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKaW5kZXggMjRiYTM4YS4uMjQ0N2Y1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKQEAgLTEzMyw2ICsxMzMsMTQgQEAKICAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJ0YXJnZXQtdGltZSIsICZ2YWw2NCkpIHsKICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRhcmdldFRpbWUsIHZhbDY0KTsKICAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInNhbXBsZS1maWxlLW9mZnNldCIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVNhbXBsZUZpbGVPZmZzZXQsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoCisgICAgICAgICAgICAgICAgICAgICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIgLypBTUVESUFGT1JNQVRfS0VZX0xBU1RfU0FNUExFX0lOREVYX0lOX0NIVU5LKi8sCisgICAgICAgICAgICAgICAgICAgICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUxhc3RTYW1wbGVJbmRleEluQ2h1bmssIHZhbDY0KTsKKyAgICAgICAgfQogICAgICAgICBpbnQzMl90IHZhbDMyOwogICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImlzLXN5bmMtZnJhbWUiLCAmdmFsMzIpKSB7CiAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdmFsMzIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAwNTBkN2MyLi42ODkzMzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtNTAsOCArNTAsOSBAQAogICAgICAgbVNhbXBsZVRpbWVVcyh0aW1lVXMpIHsKIH0KIAotTnVNZWRpYUV4dHJhY3Rvcjo6TnVNZWRpYUV4dHJhY3RvcigpCi0gICAgOiBtVG90YWxCaXRyYXRlKC0xTEwpLAorTnVNZWRpYUV4dHJhY3Rvcjo6TnVNZWRpYUV4dHJhY3RvcihFbnRyeVBvaW50IGVudHJ5UG9pbnQpCisgICAgOiBtRW50cnlQb2ludChlbnRyeVBvaW50KSwKKyAgICAgIG1Ub3RhbEJpdHJhdGUoLTFMTCksCiAgICAgICBtRHVyYXRpb25VcygtMUxMKSB7CiB9CiAKQEAgLTkzLDYgKzk0LDcgQEAKICAgICBpZiAobUltcGwgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQorICAgIHNldEVudHJ5UG9pbnRUb1JlbW90ZU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CkBAIC0xMzQsNiArMTM2LDcgQEAKICAgICBpZiAobUltcGwgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQorICAgIHNldEVudHJ5UG9pbnRUb1JlbW90ZU1lZGlhRXh0cmFjdG9yKCk7CiAKICAgICBpZiAoIW1DYXNUb2tlbi5lbXB0eSgpKSB7CiAgICAgICAgIGVyciA9IG1JbXBsLT5zZXRNZWRpYUNhcyhtQ2FzVG9rZW4pOwpAQCAtMTY4LDYgKzE3MSw3IEBACiAgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KKyAgICBzZXRFbnRyeVBvaW50VG9SZW1vdGVNZWRpYUV4dHJhY3RvcigpOwogCiAgICAgaWYgKCFtQ2FzVG9rZW4uZW1wdHkoKSkgewogICAgICAgICBlcnIgPSBtSW1wbC0+c2V0TWVkaWFDYXMobUNhc1Rva2VuKTsKQEAgLTE4NSw2ICsxODksMTEgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitjb25zdCBjaGFyKiBOdU1lZGlhRXh0cmFjdG9yOjpnZXROYW1lKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1JbXBsID09IG51bGxwdHIgPyBudWxscHRyIDogbUltcGwtPm5hbWUoKS5zdHJpbmcoKTsKK30KKwogc3RhdGljIFN0cmluZzggYXJyYXlUb1N0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYXJyYXkpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFycmF5LnNpemUoKTsgaSsrKSB7CkBAIC0yOTgsOCArMzA3LDE2IEBACiAKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JbXBsLT5nZXRNZXRhRGF0YSgpOwogCisgICAgaWYgKG1ldGEgPT0gbnVsbHB0cikgeworICAgICAgICAvL2V4dHJhY3RvciBkaWQgbm90IHB1Ymxpc2ggZmlsZSBtZXRhZGF0YQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBpZiAoIW1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgIC8vIG5vIG1pbWUgdHlwZSBtYXBzIHRvIGludmFsaWQKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQogICAgICpmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAoKmZvcm1hdCktPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCkBAIC0zMTIsNiArMzI5LDI3IEBACiAgICAgICAgICgqZm9ybWF0KS0+c2V0QnVmZmVyKCJwc3NoIiwgYnVmKTsKICAgICB9CiAKKyAgICAvLyBDb3B5IG92ZXIgdGhlIHNsb3ctbW90aW9uIHJlbGF0ZWQgbWV0YWRhdGEKKyAgICBjb25zdCB2b2lkICpzbG9tb01hcmtlcnM7CisgICAgc2l6ZV90IHNsb21vTWFya2Vyc1NpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlTbG93TW90aW9uTWFya2VycywgJnR5cGUsICZzbG9tb01hcmtlcnMsICZzbG9tb01hcmtlcnNTaXplKQorICAgICAgICAgICAgJiYgc2xvbW9NYXJrZXJzU2l6ZSA+IDApIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoc2xvbW9NYXJrZXJzU2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmRhdGEoKSwgc2xvbW9NYXJrZXJzLCBzbG9tb01hcmtlcnNTaXplKTsKKyAgICAgICAgKCpmb3JtYXQpLT5zZXRCdWZmZXIoInNsb3ctbW90aW9uLW1hcmtlcnMiLCBidWYpOworICAgIH0KKworICAgIGludDMyX3QgdGVtcG9yYWxMYXllckNvdW50OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJDb3VudCwgJnRlbXBvcmFsTGF5ZXJDb3VudCkKKyAgICAgICAgICAgICYmIHRlbXBvcmFsTGF5ZXJDb3VudCA+IDApIHsKKyAgICAgICAgKCpmb3JtYXQpLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCB0ZW1wb3JhbExheWVyQ291bnQpOworICAgIH0KKworICAgIGZsb2F0IGNhcHR1cmVGcHM7CisgICAgaWYgKG1ldGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmNhcHR1cmVGcHMpICYmIGNhcHR1cmVGcHMgPiAwLjBmKSB7CisgICAgICAgICgqZm9ybWF0KS0+c2V0RmxvYXQoImNhcHR1cmUtcmF0ZSIsIGNhcHR1cmVGcHMpOworICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMzI0LDYgKzM2MiwxMSBAQAogCiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtSW1wbC0+Z2V0TWV0YURhdGEoKTsKIAorICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgLy9leHRyYWN0b3IgZGlkIG5vdCBwdWJsaXNoIGZpbGUgbWV0YWRhdGEKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCiAgICAgaW50NjRfdCBleGlmT2Zmc2V0LCBleGlmU2l6ZTsKICAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlFeGlmT2Zmc2V0LCAmZXhpZk9mZnNldCkKICAgICAgJiYgbWV0YS0+ZmluZEludDY0KGtLZXlFeGlmU2l6ZSwgJmV4aWZTaXplKSkgewpAQCAtNDY4LDYgKzUxMSwxNiBAQAogICAgIH0KIH0KIAordm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpzZXRFbnRyeVBvaW50VG9SZW1vdGVNZWRpYUV4dHJhY3RvcigpIHsKKyAgICBpZiAobUltcGwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IG1JbXBsLT5zZXRFbnRyeVBvaW50KG1FbnRyeVBvaW50KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gc2V0IGVudHJ5IHBvaW50IHdpdGggZXJyb3IgJWQuIiwgZXJyKTsKKyAgICB9Cit9CisKIHNzaXplX3QgTnVNZWRpYUV4dHJhY3Rvcjo6ZmV0Y2hBbGxUcmFja1NhbXBsZXMoCiAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlKSB7CiAgICAgVHJhY2tJbmZvICptaW5JbmZvID0gTlVMTDsKQEAgLTg0NSw0ICs4OTgsMTUgQEAKICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiB9CiAKK3N0YXR1c190IE51TWVkaWFFeHRyYWN0b3I6OnNldExvZ1Nlc3Npb25JZChjb25zdCBTdHJpbmc4JiBsb2dTZXNzaW9uSWQpIHsKKyAgICBpZiAobUltcGwgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IG1JbXBsLT5zZXRMb2dTZXNzaW9uSWQobG9nU2Vzc2lvbklkKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gc2V0IGxvZyBzZXNzaW9uIGlkOiAlZC4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzQ5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIEJ1ZyBjb21wb25lbnQ6IDEzNDQKK3NldCBub3BhcmVudAorZXNzaWNrQGdvb2dsZS5jb20KK2xham9zQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIGdvL2FuZHJvaWQtZndrLW1lZGlhLXNvbHV0aW9ucyBmb3IgaW5mbyBvbiBhcmVhcyBvZiBvd25lcnNoaXAuCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L21lZGlhL2phbml0b3JzL21lZGlhX3NvbHV0aW9uc19PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1BsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1ZjBjNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1BsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUExBWUJBQ0tfRFVSQVRJT05fQUNDVU1VTEFUT1JfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBY2N1bXVsYXRlcyBwbGF5YmFjayBkdXJhdGlvbiBieSBwcm9jZXNzaW5nIHJlbmRlciB0aW1lcyBvZiBpbmRpdmlkdWFsIGZyYW1lcyBhbmQgYnkgaWdub3JpbmcKKy8vIGZyYW1lcyByZW5kZXJlZCBkdXJpbmcgaW5hY3RpdmUgcGxheWJhY2tzIHN1Y2ggYXMgc2Vla2luZywgcGF1c2luZywgb3IgcmUtYnVmZmVyaW5nLgorY2xhc3MgUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yIHsKK3ByaXZhdGU6CisgICAgLy8gQ29udHJvbHMgdGhlIG1heGltdW0gZGVsdGEgYmV0d2VlbiByZW5kZXIgdGltZXMgYmVmb3JlIGNvbnNpZGVyaW5nIHRoZSBwbGF5YmFjayBpcyBub3QKKyAgICAvLyBhY3RpdmUgYW5kIGhhcyBzdGFsbGVkLgorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IE1BWF9QUkVTRU5UQVRJT05fRFVSQVRJT05fTlMgPSA1MDAgKiAxMDAwICogMTAwMDsKKworcHVibGljOgorICAgIFBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcigpIHsKKyAgICAgICAgbVBsYXliYWNrRHVyYXRpb25OcyA9IDA7CisgICAgICAgIG1QcmV2aW91c1JlbmRlclRpbWVOcyA9IDA7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBhIHJlbmRlciB0aW1lIGV4cHJlc3NlZCBpbiBuYW5vc2Vjb25kcy4KKyAgICB2b2lkIHByb2Nlc3NSZW5kZXJUaW1lKGludDY0X3QgbmV3UmVuZGVyVGltZU5zKSB7CisgICAgICAgIC8vIElmIHdlIGRldGVjdCB3cmFwLWFyb3VuZCBvciBvdXQgb2Ygb3JkZXIgZnJhbWVzLCBqdXN0IGlnbm9yZSB0aGUgZHVyYXRpb24gZm9yIHRoaXMKKyAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICBpZiAobmV3UmVuZGVyVGltZU5zIDwgbVByZXZpb3VzUmVuZGVyVGltZU5zKSB7CisgICAgICAgICAgICBtUHJldmlvdXNSZW5kZXJUaW1lTnMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtUHJldmlvdXNSZW5kZXJUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHByZXNlbnRhdGlvbkR1cmF0aW9uTnMgPSBuZXdSZW5kZXJUaW1lTnMgLSBtUHJldmlvdXNSZW5kZXJUaW1lTnM7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRHVyYXRpb25OcyA8IE1BWF9QUkVTRU5UQVRJT05fRFVSQVRJT05fTlMpIHsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tEdXJhdGlvbk5zICs9IHByZXNlbnRhdGlvbkR1cmF0aW9uTnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzUmVuZGVyVGltZU5zID0gbmV3UmVuZGVyVGltZU5zOworICAgIH0KKworICAgIGludDY0X3QgZ2V0RHVyYXRpb25JblNlY29uZHMoKSB7CisgICAgICAgIHJldHVybiBtUGxheWJhY2tEdXJhdGlvbk5zIC8gMTAwMCAvIDEwMDAgLyAxMDAwOyAvLyBOYW5vc2Vjb25kcyB0byBzZWNvbmRzLgorICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGUgcGxheWJhY2sgZHVyYXRpb24gYWNjdW11bGF0ZWQgc28gZmFyLgorICAgIGludDY0X3QgbVBsYXliYWNrRHVyYXRpb25OczsKKyAgICAvLyBUaGUgcHJldmlvdXMgcmVuZGVyIHRpbWUgdXNlZCB0byBjb21wdXRlIHRoZSBuZXh0IHByZXNlbnRhdGlvbiBkdXJhdGlvbi4KKyAgICBpbnQ2NF90IG1QcmV2aW91c1JlbmRlclRpbWVOczsKK307CisKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCAyNWU0M2MyLi5iYWEyY2ExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC00MCw2ICs0MCwxNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmtFeHRyYWN0b3JNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubWltZSI7CiBzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvclRyYWNrcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsiOwogCisvLyBUaGUgZm9sbG93aW5nIGFyZSBub3QgYXZhaWxhYmxlIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFFeHRyYWN0b3IuamF2YQorLy8gYmVjYXVzZSB0aGV5IGFyZSBub3QgYXBwbGljYWJsZSBvciB1c2VmdWwgdG8gdGhhdCBBUEkuCitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvckVudHJ5UG9pbnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5lbnRyeSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0V4dHJhY3RvckxvZ1Nlc3Npb25JZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmxvZ1Nlc3Npb25JZCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICprRW50cnlQb2ludFNkayA9ICJzZGsiOworc3RhdGljIGNvbnN0IGNoYXIgKmtFbnRyeVBvaW50V2l0aEp2bSA9ICJuZGstd2l0aC1qdm0iOworc3RhdGljIGNvbnN0IGNoYXIgKmtFbnRyeVBvaW50Tm9Kdm0gPSAibmRrLW5vLWp2bSI7CitzdGF0aWMgY29uc3QgY2hhciAqa0VudHJ5UG9pbnRPdGhlciA9ICJvdGhlciI7CisKIFJlbW90ZU1lZGlhRXh0cmFjdG9yOjpSZW1vdGVNZWRpYUV4dHJhY3RvcigKICAgICAgICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKQEAgLTc0LDYgKzg0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHdoYXQgZWxzZSBpcyBpbnRlcmVzdGluZyBhbmQgbm90IGFscmVhZHkgYXZhaWxhYmxlPwogICAgICAgICB9CisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHNldCB0aGUgZW50cnkgcG9pbnQgdG8gYmUgIm90aGVyIi4gQ2xpZW50cyBvZiB0aGlzCisgICAgICAgIC8vIGNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBieSBjYWxsaW5nIHNldEVudHJ5UG9pbnQuCisgICAgICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yRW50cnlQb2ludCwga0VudHJ5UG9pbnRPdGhlcik7CiAgICAgfQogfQogCkBAIC0xNDMsNiArMTU2LDMzIEBACiAgICAgcmV0dXJuIFN0cmluZzgobUV4dHJhY3Rvci0+bmFtZSgpKTsKIH0KIAorc3RhdHVzX3QgUmVtb3RlTWVkaWFFeHRyYWN0b3I6OnNldEVudHJ5UG9pbnQoRW50cnlQb2ludCBlbnRyeVBvaW50KSB7CisgICAgY29uc3QgY2hhciogZW50cnlQb2ludFN0cmluZzsKKyAgICBzd2l0Y2ggKGVudHJ5UG9pbnQpIHsKKyAgICAgIGNhc2UgRW50cnlQb2ludDo6U0RLOgorICAgICAgICAgICAgZW50cnlQb2ludFN0cmluZyA9IGtFbnRyeVBvaW50U2RrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRW50cnlQb2ludDo6TkRLX1dJVEhfSlZNOgorICAgICAgICAgICAgZW50cnlQb2ludFN0cmluZyA9IGtFbnRyeVBvaW50V2l0aEp2bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVudHJ5UG9pbnQ6Ok5ES19OT19KVk06CisgICAgICAgICAgICBlbnRyeVBvaW50U3RyaW5nID0ga0VudHJ5UG9pbnROb0p2bTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVudHJ5UG9pbnQ6Ok9USEVSOgorICAgICAgICAgICAgZW50cnlQb2ludFN0cmluZyA9IGtFbnRyeVBvaW50T3RoZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yRW50cnlQb2ludCwgZW50cnlQb2ludFN0cmluZyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBSZW1vdGVNZWRpYUV4dHJhY3Rvcjo6c2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzgmIGxvZ1Nlc3Npb25JZCkgeworICAgIG1NZXRyaWNzSXRlbS0+c2V0Q1N0cmluZyhrRXh0cmFjdG9yTG9nU2Vzc2lvbklkLCBsb2dTZXNzaW9uSWQuY19zdHIoKSk7CisgICAgcmV0dXJuIE9LOworfQorCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCmluZGV4IDRjOTRiYWEuLjFmNTY5ZWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApAQCAtMTMyLDM3ICsxMzIsNjMgQEAKIH0KIAogdm9pZCBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YShBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3csIEhEUlN0YXRpY0luZm8gKmluZm8pIHsKLSAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7Ci0gICAgICAgICAgICAuZGlzcGxheVByaW1hcnlSZWQgPSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi54ICogMC4wMDAwMmYsCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi55ICogMC4wMDAwMmYKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbiA9IHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnggKiAwLjAwMDAyZiwKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyZgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi54ICogMC4wMDAwMmYsCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi55ICogMC4wMDAwMmYKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAud2hpdGVQb2ludCA9IHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnggKiAwLjAwMDAyZiwKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnkgKiAwLjAwMDAyZgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSwKLSAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBpbmZvLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDFmCi0gICAgfTsKKyAgICAvLyBJZiBtYXN0ZXJpbmcgbWF4IGFuZCBtaW4gbHVtaW5hbmNlIGZpZWxkcyBhcmUgMCwgZG8gbm90IHVzZSB0aGVtLgorICAgIC8vIEl0IGluZGljYXRlcyB0aGUgdmFsdWUgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSBzdHJlYW0uCisgICAgaWYgKChmbG9hdClpbmZvLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPiAwLjBmICYmCisgICAgICAgIChpbmZvLT5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgKiAwLjAwMDFmKSA+IDAuMGYpIHsKKyAgICAgICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0geworICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tUi54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubVIueSAqIDAuMDAwMDJmCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlHcmVlbiA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tRy54ICogMC4wMDAwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zVHlwZTEubUcueSAqIDAuMDAwMDJmCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAuZGlzcGxheVByaW1hcnlCbHVlID0geworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1CLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tQi55ICogMC4wMDAwMmYKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c1R5cGUxLm1XLnggKiAwLjAwMDAyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNUeXBlMS5tVy55ICogMC4wMDAwMmYKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gaW5mby0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxZgorICAgICAgICB9OwogCi0gICAgaW50IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfc21wdGUyMDg2X21ldGFkYXRhKG5hdGl2ZVdpbmRvdywgJnNtcHRlMjA4Nl9tZXRhKTsKLSAgICBBTE9HV19JRihlcnIgIT0gMCwgImZhaWxlZCB0byBzZXQgc21wdGUyMDg2IG1ldGFkYXRhIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CisgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3NtcHRlMjA4Nl9tZXRhZGF0YShuYXRpdmVXaW5kb3csICZzbXB0ZTIwODZfbWV0YSk7CisgICAgICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiZmFpbGVkIHRvIHNldCBzbXB0ZTIwODYgbWV0YWRhdGEgb24gc3VyZmFjZSAoJWQpIiwgZXJyKTsKKyAgICB9CiAKLSAgICBzdHJ1Y3QgYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSBjdGE4NjFfbWV0YSA9IHsKLSAgICAgICAgICAgIC5tYXhDb250ZW50TGlnaHRMZXZlbCA9IChmbG9hdCkgaW5mby0+c1R5cGUxLm1NYXhDb250ZW50TGlnaHRMZXZlbCwKLSAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gKGZsb2F0KSBpbmZvLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwKLSAgICB9OworICAgIC8vIElmIHRoZSBjb250ZW50IGxpZ2h0IGxldmVsIGZpZWxkcyBhcmUgMCwgZG8gbm90IHVzZSB0aGVtLCBpdAorICAgIC8vIGluZGljYXRlcyB0aGUgdmFsdWUgbWF5IG5vdCBiZSBwcmVzZW50IGluIHRoZSBzdHJlYW0uCisgICAgaWYgKChmbG9hdClpbmZvLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID4gMC4wZiAmJgorICAgICAgICAoZmxvYXQpaW5mby0+c1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID4gMC4wZikgeworICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSBjdGE4NjFfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwsCisgICAgICAgICAgICAgICAgLm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSAoZmxvYXQpIGluZm8tPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbAorICAgICAgICB9OwogCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19jdGE4NjFfM19tZXRhZGF0YShuYXRpdmVXaW5kb3csICZjdGE4NjFfbWV0YSk7Ci0gICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IGN0YTg2MV8zIG1ldGFkYXRhIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CisgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2N0YTg2MV8zX21ldGFkYXRhKG5hdGl2ZVdpbmRvdywgJmN0YTg2MV9tZXRhKTsKKyAgICAgICAgQUxPR1dfSUYoZXJyICE9IDAsICJmYWlsZWQgdG8gc2V0IGN0YTg2MV8zIG1ldGFkYXRhIG9uIHN1cmZhY2UgKCVkKSIsIGVycik7CisgICAgfQorfQorCitzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dSb3RhdGlvbigKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIGludCByb3RhdGlvbikgeworCisgICAgaW50IHRyYW5zZm9ybSA9IDA7CisgICAgaWYgKChyb3RhdGlvbiAlIDkwKSA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoKHJvdGF0aW9uIC8gOTApICYgMykgeworICAgICAgICAgICAgY2FzZSAxOiAgdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfOTA7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogIHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6ICB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShuYXRpdmVXaW5kb3csIHRyYW5zZm9ybSk7CiB9CiAKIHN0YXR1c190IHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdyhBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgLyogbm9ubnVsbCAqLykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCmluZGV4IDNkY2VlZjcuLjdjZTI5NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKQEAgLTEsMTIgKzEsMTcgQEAKIHsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50Ci0gICAgLy8geyAibmFtZSI6ICJIRVZDVXRpbHNVbml0VGVzdCIgfSwKLSAgICAvL3sgIm5hbWUiOiAiRXh0cmFjdG9yRmFjdG9yeVRlc3QiIH0sCisgIC8vIHRlc3RzIHdoaWNoIHJlcXVpcmUgZHluYW1pYyBjb250ZW50CisgIC8vIGludm9rZSB3aXRoOiBhdGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCisgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKKyAgImR5bmFtaWMtcHJlc3VibWl0IjogWwogICAgIC8vIHdyaXRlclRlc3QgZmFpbHMgYWJvdXQgNSBvdXQgb2YgNjYKLSAgICAvLyBpbiBhZGRpdGlvbiB0byBuZWVkaW5nIHRoZSBkb3dubG9hZCBhYmlsaXR5Ci0gICAgLy97ICJuYW1lIjogIndyaXRlclRlc3QiIH0sCisgICAgLy8geyAibmFtZSI6ICJ3cml0ZXJUZXN0IiB9LAogCisgICAgeyAibmFtZSI6ICJIRVZDVXRpbHNVbml0VGVzdCIgfSwKKyAgICB7ICJuYW1lIjogIkV4dHJhY3RvckZhY3RvcnlUZXN0IiB9CisKKyAgXSwKKworICAicHJlc3VibWl0LWxhcmdlIjogWwogICAgIHsKICAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKICAgICAgICJvcHRpb25zIjogWwpAQCAtMjYsNiArMzEsMTQgQEAKICAgICAgIF0KICAgICB9CiAgIF0sCisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgIm5hbWUiOiAibWVkaWFjb2RlY1Rlc3QiCisgICAgfSwKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVRyYW5zY29kaW5nVGVzdENhc2VzIgorICAgIH0KKyAgXSwKICAgInBvc3RzdWJtaXQiOiBbCiAgICAgewogICAgICAgICJuYW1lIjogIkJhdHRlcnlDaGVja2VyX3Rlc3QiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggYTFlNGQ0My4uNGMxOGY4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtNDcsNiArNDcsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCisvLyBUT0RPIDogUmVtb3ZlIHRoZSBkZWZpbmVzIG9uY2UgbWFpbmxpbmUgbWVkaWEgaXMgYnVpbHQgYWdhaW5zdCBOREsgPj0gMzEuCisvLyBUaGUgbXA0IGV4dHJhY3RvciBpcyBwYXJ0IG9mIG1haW5saW5lIGFuZCBidWlsZHMgYWdhaW5zdCBOREsgMjkgYXMgb2YKKy8vIHdyaXRpbmcuIFRoZXNlIGtleXMgYXJlIGF2YWlsYWJsZSBvbmx5IGZyb20gTkRLIDMxOgorI2RlZmluZSBBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiBcCisgICJtcGVnaC1wcm9maWxlLWxldmVsLWluZGljYXRpb24iCisjZGVmaW5lIEFNRURJQUZPUk1BVF9LRVlfTVBFR0hfUkVGRVJFTkNFX0NIQU5ORUxfTEFZT1VUIFwKKyAgIm1wZWdoLXJlZmVyZW5jZS1jaGFubmVsLWxheW91dCIKKyNkZWZpbmUgQU1FRElBRk9STUFUX0tFWV9NUEVHSF9DT01QQVRJQkxFX1NFVFMgXAorICAibXBlZ2gtY29tcGF0aWJsZS1zZXRzIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBzdGF0dXNfdCBjb3B5TkFMVVRvQUJ1ZmZlcihzcDxBQnVmZmVyPiAqYnVmZmVyLCBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBsZW5ndGgpIHsKQEAgLTcyNSwxNCArNzM1LDE5IEBACiAgICAgfQogfTsKIAotc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50NjRNYXBwaW5ncyB7CitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIqLCB1aW50MzJfdD4+IGludDY0TWFwcGluZ3MgewogICAgIHsKLSAgICAgICAgeyAiZXhpZi1vZmZzZXQiLCBrS2V5RXhpZk9mZnNldCB9LAotICAgICAgICB7ICJleGlmLXNpemUiLCBrS2V5RXhpZlNpemUgfSwKLSAgICAgICAgeyAidGFyZ2V0LXRpbWUiLCBrS2V5VGFyZ2V0VGltZSB9LAotICAgICAgICB7ICJ0aHVtYm5haWwtdGltZSIsIGtLZXlUaHVtYm5haWxUaW1lIH0sCi0gICAgICAgIHsgInRpbWVVcyIsIGtLZXlUaW1lIH0sCi0gICAgICAgIHsgImR1cmF0aW9uVXMiLCBrS2V5RHVyYXRpb24gfSwKKyAgICAgICAgeyAiZXhpZi1vZmZzZXQiLCBrS2V5RXhpZk9mZnNldH0sCisgICAgICAgIHsgImV4aWYtc2l6ZSIsIGtLZXlFeGlmU2l6ZX0sCisgICAgICAgIHsgInhtcC1vZmZzZXQiLCBrS2V5WG1wT2Zmc2V0fSwKKyAgICAgICAgeyAieG1wLXNpemUiLCBrS2V5WG1wU2l6ZX0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWV9LAorICAgICAgICB7ICJ0aHVtYm5haWwtdGltZSIsIGtLZXlUaHVtYm5haWxUaW1lfSwKKyAgICAgICAgeyAidGltZVVzIiwga0tleVRpbWV9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9ufSwKKyAgICAgICAgeyAic2FtcGxlLWZpbGUtb2Zmc2V0Iiwga0tleVNhbXBsZUZpbGVPZmZzZXR9LAorICAgICAgICB7ICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayIsIGtLZXlMYXN0U2FtcGxlSW5kZXhJbkNodW5rfSwKKyAgICAgICAgeyAic2FtcGxlLXRpbWUtYmVmb3JlLWFwcGVuZCIsIGtLZXlTYW1wbGVUaW1lQmVmb3JlQXBwZW5kfSwKICAgICB9CiB9OwogCkBAIC03NjksNiArNzg0LDggQEAKICAgICAgICAgeyAic2VpIiwga0tleVNFSSB9LAogICAgICAgICB7ICJ0ZXh0LWZvcm1hdC1kYXRhIiwga0tleVRleHRGb3JtYXREYXRhIH0sCiAgICAgICAgIHsgInRodW1ibmFpbC1jc2QtaGV2YyIsIGtLZXlUaHVtYm5haWxIVkNDIH0sCisgICAgICAgIHsgInNsb3ctbW90aW9uLW1hcmtlcnMiLCBrS2V5U2xvd01vdGlvbk1hcmtlcnMgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWNzZC1hdjFjIiwga0tleVRodW1ibmFpbEFWMUMgfSwKICAgICB9CiB9OwogCkBAIC0xMDc4LDYgKzEwOTUsMjUgQEAKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImlzLWFkdHMiLCBpc0FEVFMpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBtcGVnaFByb2ZpbGVMZXZlbEluZGljYXRpb247CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbiwgJm1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbikpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9NUEVHSF9QUk9GSUxFX0xFVkVMX0lORElDQVRJT04sCisgICAgICAgICAgICAgICAgICAgIG1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBtcGVnaFJlZmVyZW5jZUNoYW5uZWxMYXlvdXQ7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCwgJm1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQsCisgICAgICAgICAgICAgICAgICAgIG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlNcGVnaENvbXBhdGlibGVTZXRzLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUywgYnVmZmVyKTsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGFhY1Byb2ZpbGUgPSAtMTsKICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFhYy1wcm9maWxlIiwgYWFjUHJvZmlsZSk7CkBAIC0xMTM1LDcgKzExNzEsNyBAQAogICAgICAgICAvLyBhc3NlcnRpb24sIGxldCdzIGJlIGxlbmllbnQgZm9yIG5vdy4uLgogICAgICAgICAvLyBDSEVDSygocHRyWzRdID4+IDIpID09IDB4M2YpOyAgLy8gcmVzZXJ2ZWQKIAotICAgICAgICBzaXplX3QgbGVuZ3RoU2l6ZSBfX3VudXNlZCA9IDEgKyAocHRyWzRdICYgMyk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgbGVuZ3RoU2l6ZSB2YWx1ZSBmcm9tIDEgKyAocHRyWzRdICYgMykKIAogICAgICAgICAvLyBjb21tZW50ZWQgb3V0IGNoZWNrIGJlbG93IGFzIEgyNjRfUVZHQV81MDBfTk9fQVVESU8uM2dwCiAgICAgICAgIC8vIHZpb2xhdGVzIGl0Li4uCkBAIC0xNjYzLDEzICsxNjk5LDE2IEBACiAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgY29sb3JBc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwogICAgIH0KIH0KLQotdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgeworLyogQ29udmVydHMga2V5IGFuZCB2YWx1ZSBwYWlycyBpbiBBTWVzc2FnZSBmb3JtYXQgdG8gTWV0YURhdGEgZm9ybWF0LgorICogQWxzbyBjaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBvZiByZXF1aXJlZCBrZXlzLgorICovCitzdGF0dXNfdCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPE1ldGFEYXRhPiAmbWV0YSkgewogICAgIEFTdHJpbmcgbWltZTsKICAgICBpZiAobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CiAgICAgICAgIG1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgbWltZSB0eXBlIik7CisgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgbWltZSB0eXBlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKG1zZywgbWV0YSk7CkBAIC0xNjk3LDYgKzE3MzYsMTIgQEAKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKICAgICB9CiAKKyAgICAvLyBNb2RlIGZvciBtZWRpYSB0cmFuc2NvZGluZy4KKyAgICBpbnQzMl90IGlzQmFja2dyb3VuZE1vZGU7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9iYWNrZ3JvdW5kLW1vZGUiLCAmaXNCYWNrZ3JvdW5kTW9kZSkgJiYgaXNCYWNrZ3JvdW5kTW9kZSAhPSAwKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGlzQmFja2dyb3VuZE1vZGUsIDEpOworICAgIH0KKwogICAgIGludDMyX3QgYXZnQml0cmF0ZSA9IDA7CiAgICAgaW50MzJfdCBtYXhCaXRyYXRlOwogICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYml0cmF0ZSIsICZhdmdCaXRyYXRlKSAmJiBhdmdCaXRyYXRlID4gMCkgewpAQCAtMTcxOSw2ICsxNzY0LDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiZGlkIG5vdCBmaW5kIHdpZHRoIGFuZC9vciBoZWlnaHQiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xODAzLDE0ICsxODQ5LDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1pbWUuc3RhcnRzV2l0aCgiYXVkaW8vIikpIHsKLSAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSkgewotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSB8fAorICAgICAgICAgICAgICAgICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaWQgbm90IGZpbmQgY2hhbm5lbC1jb3VudCBhbmQvb3Igc2FtcGxlLXJhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtQ2hhbm5lbHMpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCAmYml0c1BlclNhbXBsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBiaXRzUGVyU2FtcGxlKTsKQEAgLTE4MzMsNiArMTg3OSwyMyBAQAogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUlzQURUUywgaXNBRFRTKTsKICAgICAgICAgfQogCisgICAgICAgIGludDMyX3QgbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX01QRUdIX1BST0ZJTEVfTEVWRUxfSU5ESUNBVElPTiwKKyAgICAgICAgICAgICAgICAmbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1wZWdoUHJvZmlsZUxldmVsSW5kaWNhdGlvbiwgbXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCA9IC0xOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoQU1FRElBRk9STUFUX0tFWV9NUEVHSF9SRUZFUkVOQ0VfQ0hBTk5FTF9MQVlPVVQsCisgICAgICAgICAgICAgICAgJm1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlNcGVnaFJlZmVyZW5jZUNoYW5uZWxMYXlvdXQsIG1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCk7CisgICAgICAgIH0KKyAgICAgICAgc3A8QUJ1ZmZlcj4gbXBlZ2hDb21wYXRpYmxlU2V0czsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdIX0NPTVBBVElCTEVfU0VUUywKKyAgICAgICAgICAgICAgICAmbXBlZ2hDb21wYXRpYmxlU2V0cykpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU1wZWdoQ29tcGF0aWJsZVNldHMsIGtUeXBlSENPUywKKyAgICAgICAgICAgICAgICAgICAgbXBlZ2hDb21wYXRpYmxlU2V0cy0+ZGF0YSgpLCBtcGVnaENvbXBhdGlibGVTZXRzLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOwpAQCAtMTkwMCw3ICsxOTYzLDggQEAKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOwotICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEgfHwKKyAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FWSUYpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWMUMsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTikgewogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTIiLCAmY3NkMikpIHsKQEAgLTE5MjUsNyArMTk4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJXZSBuZWVkIGNzZC0yISEuICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJXZSBuZWVkIGNzZC0yISEuICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwpAQCAtMTk5MSw2ICsyMDU2LDcgQEAKICAgICBBTE9HSSgiY29udmVydGVkICVzIHRvOiIsIG1zZy0+ZGVidWdTdHJpbmcoMCkuY19zdHIoKSk7CiAgICAgbWV0YS0+ZHVtcFRvTG9nKCk7CiAjZW5kaWYKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywKQEAgLTIxMzYsOCArMjIwMiwxMCBAQAogICAgIH0KICAgICBpbmZvLT5zYW1wbGVfcmF0ZSA9IHNyYXRlOwogCi0gICAgaW50MzJfdCBjbWFzayA9IDA7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY21hc2spIHx8IGNtYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIGludDMyX3QgcmF3Q2hhbm5lbE1hc2s7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY21hc2sgPSBtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmcmF3Q2hhbm5lbE1hc2spID8KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihyYXdDaGFubmVsTWFzaykgOiBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CisgICAgaWYgKGNtYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggY2hhbm5lbCBtYXNrIiwgbWltZSk7CiAKICAgICAgICAgLy8gVHJ5IGEgY2hhbm5lbCBjb3VudCBpbnN0ZWFkCkBAIC0yMTU2LDcgKzIyMjQsNyBAQAogICAgIH0KICAgICBpbmZvLT5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOwogCi0gICAgaW50MzJfdCBicmF0ZSA9IC0xOworICAgIGludDMyX3QgYnJhdGUgPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYnJhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAgICAgfQpAQCAtMjE3OCw3ICsyMjQ2LDExIEBACiAgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwotICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworI2lmZGVmIERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIHJldHVybiBBdWRpb1N5c3RlbTo6Z2V0T2ZmbG9hZFN1cHBvcnQoaW5mbykgIT0gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOworI2VuZGlmCiB9CiAKIEhMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAppbmRleCA4Njk4ZDMzLi4wZTJiNDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19kZWZhdWx0cyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlLWRlZmF1bHRzIiwKICAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCkBAIC0xMDEsNiArMTEwLDcgQEAKICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAogICAgIF0sCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogZmFsc2UsCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJndWlfYnVmZmVycXVldWVfc3RhdGljIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNzU5ZmY4Yy4uOTU5NTNlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkZyYW1lRHJvcHBlcl90ZXN0IiwKICAgICB0ZXN0X3N1aXRlczogWwpAQCAtMTQsNCArMjMsNSBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAgICAgY29tcGlsZV9tdWx0aWxpYjogImZpcnN0IiwKKwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDQ2YjNiOGYuLjVhYjQ5YTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19hYWNkZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2FhY2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggMTY4ZDE0MC4uMTU3Y2FiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscwogCi0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKICAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgewogICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQogICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQogCi0gICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICAvLyB2YWxpZGF0aW9uIGNoZWNrIGFnYWluCiAgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CiAgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CiAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCmluZGV4IDJhZWRkZDcuLjkyZWM5NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwCkBAIC0zOCw2ICszOCw3IEBACiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCiAjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLwogI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0FMQlVNIDAgIC8qIE1QRUctRCBEUkMgYWxidW0gbW9kZTsgMCA9PiBhbGJ1bSBtb2RlIGlzIGRpc2FibGVkLCAxID0+IGFsYnVtIG1vZGUgaXMgZW5hYmxlZCAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfT1VUUFVUX0xPVURORVNTIC0xIC8qIGRlY29kZXIgb3V0cHV0IGxvdWRuZXNzOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KICNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoLTEpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KICNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCiAvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCkBAIC0yMzAsNiArMjMxLDE1IEBACiAgICAgLy8gRm9yIHNldmVuIGFuZCBlaWdodCBjaGFubmVsIGlucHV0IHN0cmVhbXMsIGVuYWJsZSA2LjEgYW5kIDcuMSBjaGFubmVsIG91dHB1dAogICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTUFYX09VVFBVVF9DSEFOTkVMUywgLTEpOwogCisgICAgbURyY0NvbXByZXNzTW9kZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlk7CisgICAgbURyY1RhcmdldFJlZkxldmVsID0gRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTDsKKyAgICBtRHJjRW5jVGFyZ2V0TGV2ZWwgPSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMOworICAgIG1EcmNCb29zdEZhY3RvciA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1Q7CisgICAgbURyY0F0dGVudWF0aW9uRmFjdG9yID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQ7CisgICAgbURyY0VmZmVjdFR5cGUgPSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVDsKKyAgICBtRHJjQWxidW1Nb2RlID0gRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19BTEJVTTsKKyAgICBtRHJjT3V0cHV0TG91ZG5lc3MgPSBEUkNfREVGQVVMVF9NT0JJTEVfT1VUUFVUX0xPVURORVNTOworCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU4LDYgKzM2OCwyNyBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSAqYWFjUHJlc1BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFICopcGFyYW1zOworCisgICAgICAgICAgICBBTE9HRCgiZ2V0IE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uIik7CisKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1ByZXNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5EcmNFZmZlY3RUeXBlID0gbURyY0VmZmVjdFR5cGU7CisgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQWxidW1Nb2RlID0gbURyY0FsYnVtTW9kZTsKKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdCA9ICBtRHJjQm9vc3RGYWN0b3I7CisgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0ID0gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24gPSBtRHJjQ29tcHJlc3NNb2RlOworICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsID0gbURyY1RhcmdldFJlZkxldmVsOworICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCA9IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICAgICAgICAgIGFhY1ByZXNQYXJhbXMgLT5uRHJjT3V0cHV0TG91ZG5lc3MgPSBtRHJjT3V0cHV0TG91ZG5lc3M7CisgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxHZXRQYXJhbWV0ZXIoaW5kZXgsIHBhcmFtcyk7CiAgICAgfQpAQCAtNDY0LDExICs0OTUsMTMgQEAKICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSA+PSAtMSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQgbkRyY0VmZmVjdFR5cGU9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSk7CiAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19TRVRfRUZGRUNULCBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZSk7CisgICAgICAgICAgICAgICAgbURyY0VmZmVjdFR5cGUgPSBhYWNQcmVzUGFyYW1zLT5uRHJjRWZmZWN0VHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQWxidW1Nb2RlID49IC0xKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRHJjQWxidW1Nb2RlPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkRyY0FsYnVtTW9kZSk7CiAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1VOSURSQ19BTEJVTV9NT0RFLAogICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkRyY0FsYnVtTW9kZSk7CisgICAgICAgICAgICAgICAgbURyY0FsYnVtTW9kZSA9IGFhY1ByZXNQYXJhbXMtPm5EcmNBbGJ1bU1vZGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sIHVwZGF0ZURyY1dyYXBwZXIgPSBmYWxzZTsKICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QgPj0gMCkgewpAQCAtNDc2LDM0ICs1MDksNDIgQEAKICAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsCiAgICAgICAgICAgICAgICAgICAgICAgICBhYWNQcmVzUGFyYW1zLT5uRHJjQm9vc3QpOwogICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG1EcmNCb29zdEZhY3RvciA9IGFhY1ByZXNQYXJhbXMtPm5EcmNCb29zdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0ID49IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5EcmNDdXQ9JWQiLCBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0KTsKICAgICAgICAgICAgICAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SLCBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0KTsKICAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRHJjQXR0ZW51YXRpb25GYWN0b3IgPSBhYWNQcmVzUGFyYW1zLT5uRHJjQ3V0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFhY1ByZXNQYXJhbXMtPm5IZWF2eUNvbXByZXNzaW9uID49IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5IZWF2eUNvbXByZXNzaW9uPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOwogICAgICAgICAgICAgICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX0hFQVZZLAogICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkhlYXZ5Q29tcHJlc3Npb24pOwogICAgICAgICAgICAgICAgIHVwZGF0ZURyY1dyYXBwZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIG1EcmNDb21wcmVzc01vZGUgPSBhYWNQcmVzUGFyYW1zLT5uSGVhdnlDb21wcmVzc2lvbjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWwgPj0gLTEpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0IG5UYXJnZXRSZWZlcmVuY2VMZXZlbD0lZCIsIGFhY1ByZXNQYXJhbXMtPm5UYXJnZXRSZWZlcmVuY2VMZXZlbCk7CiAgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfVEFSR0VULAogICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+blRhcmdldFJlZmVyZW5jZUxldmVsKTsKICAgICAgICAgICAgICAgICB1cGRhdGVEcmNXcmFwcGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRHJjVGFyZ2V0UmVmTGV2ZWwgPSBhYWNQcmVzUGFyYW1zLT5uVGFyZ2V0UmVmZXJlbmNlTGV2ZWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldCBuRW5jb2RlZFRhcmdldExldmVsPSVkIiwgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CiAgICAgICAgICAgICAgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VULAogICAgICAgICAgICAgICAgICAgICAgICAgYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbCk7CiAgICAgICAgICAgICAgICAgdXBkYXRlRHJjV3JhcHBlciA9IHRydWU7CisgICAgICAgICAgICAgICAgbURyY0VuY1RhcmdldExldmVsID0gYWFjUHJlc1BhcmFtcy0+bkVuY29kZWRUYXJnZXRMZXZlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgYWFjRGVjb2Rlcl9TZXRQYXJhbShtQUFDRGVjb2RlciwgQUFDX1BDTV9MSU1JVEVSX0VOQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgIChhYWNQcmVzUGFyYW1zLT5uUENNTGltaXRlckVuYWJsZSAhPSAwKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWFjUHJlc1BhcmFtcyAtPm5EcmNPdXRwdXRMb3VkbmVzcyAhPSBEUkNfREVGQVVMVF9NT0JJTEVfT1VUUFVUX0xPVURORVNTKSB7CisgICAgICAgICAgICAgICAgbURyY091dHB1dExvdWRuZXNzID0gYWFjUHJlc1BhcmFtcyAtPm5EcmNPdXRwdXRMb3VkbmVzczsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh1cGRhdGVEcmNXcmFwcGVyKSB7CiAgICAgICAgICAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC04NTQsNiArODk1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmICggbURyY091dHB1dExvdWRuZXNzICE9IG1TdHJlYW1JbmZvLT5vdXRwdXRMb3VkbmVzcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgidXBkYXRlIExvdWRuZXNzLCBiZWZvcmUgPSAlZCwgbm93ID0gJWQiLCBtRHJjT3V0cHV0TG91ZG5lc3MsIG1TdHJlYW1JbmZvLT5vdXRwdXRMb3VkbmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG1EcmNPdXRwdXRMb3VkbmVzcyA9IG1TdHJlYW1JbmZvLT5vdXRwdXRMb3VkbmVzczsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFBQysvZUFBQysgc3RyZWFtcyBjYW4gYmUgc2lnbmFsbGVkIGluIHR3byB3YXlzOiBlaXRoZXIgZXhwbGljaXRseQogICAgICAgICAgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbApAQCAtMTIwMSw2ICsxMjQ3LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCmluZGV4IDViZWU3MTAuLjlmOThhYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKQEAgLTg1LDYgKzg1LDE3IEBACiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CisKKyAgICAvL2RyYworICAgIGludDMyX3QgbURyY0NvbXByZXNzTW9kZTsKKyAgICBpbnQzMl90IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBpbnQzMl90IG1EcmNFbmNUYXJnZXRMZXZlbDsKKyAgICBpbnQzMl90IG1EcmNCb29zdEZhY3RvcjsKKyAgICBpbnQzMl90IG1EcmNBdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBpbnQzMl90IG1EcmNFZmZlY3RUeXBlOworICAgIGludDMyX3QgbURyY0FsYnVtTW9kZTsKKyAgICBpbnQzMl90IG1EcmNPdXRwdXRMb3VkbmVzczsKKwogICAgIGJvb2wgb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CiAgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKICAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAppbmRleCBiZjc4OWM0Li43OTMxMjVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfYWFjZW5jX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19hYWNlbmNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCmluZGV4IDZlNDM3Y2YuLjkwNDIxYjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKQEAgLTczMiw2ICs3MzIsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL1RFU1RfTUFQUElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwOTA5OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvVEVTVF9NQVBQSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iCi17Ci0gICJwcmVzdWJtaXQiOiBbCi0gICAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAotICAgIC8vIHsgIm5hbWUiOiAiQW1ybmJEZWNvZGVyVGVzdCJ9LAotCi0gICAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAotICAgIC8vIHsgIm5hbWUiOiAiQW1ybmJFbmNvZGVyVGVzdCJ9Ci0KLSAgXQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE3OTFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2FkZC5jcHAiLAotICAgICAgICAic3JjL2F6X2xzcC5jcHAiLAotICAgICAgICAic3JjL2JpdG5vX3RhYi5jcHAiLAotICAgICAgICAic3JjL2JpdHJlb3JkZXJfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvYml0czJwcm0uY3BwIiwKLSAgICAgICAgInNyYy9jMl85cGZfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvY29weS5jcHAiLAotICAgICAgICAic3JjL2Rpdl8zMi5jcHAiLAotICAgICAgICAic3JjL2Rpdl9zLmNwcCIsCi0gICAgICAgICJzcmMvZXh0cmFjdF9oLmNwcCIsCi0gICAgICAgICJzcmMvZXh0cmFjdF9sLmNwcCIsCi0gICAgICAgICJzcmMvZ2FpbnNfdGJsLmNwcCIsCi0gICAgICAgICJzcmMvZ2NfcHJlZC5jcHAiLAotICAgICAgICAic3JjL2dtZWRfbi5jcHAiLAotICAgICAgICAic3JjL2dyaWRfdGJsLmNwcCIsCi0gICAgICAgICJzcmMvZ3JheV90YmwuY3BwIiwKLSAgICAgICAgInNyYy9pbnRfbHBjLmNwcCIsCi0gICAgICAgICJzcmMvaW52X3NxcnQuY3BwIiwKLSAgICAgICAgInNyYy9pbnZfc3FydF90YmwuY3BwIiwKLSAgICAgICAgInNyYy9sX2Ficy5jcHAiLAotICAgICAgICAic3JjL2xfZGVwb3NpdF9oLmNwcCIsCi0gICAgICAgICJzcmMvbF9kZXBvc2l0X2wuY3BwIiwKLSAgICAgICAgInNyYy9sX3Nocl9yLmNwcCIsCi0gICAgICAgICJzcmMvbG9nMi5jcHAiLAotICAgICAgICAic3JjL2xvZzJfbm9ybS5jcHAiLAotICAgICAgICAic3JjL2xvZzJfdGJsLmNwcCIsCi0gICAgICAgICJzcmMvbHNmd3QuY3BwIiwKLSAgICAgICAgInNyYy9sc3AuY3BwIiwKLSAgICAgICAgInNyYy9sc3BfYXouY3BwIiwKLSAgICAgICAgInNyYy9sc3BfbHNmLmNwcCIsCi0gICAgICAgICJzcmMvbHNwX2xzZl90YmwuY3BwIiwKLSAgICAgICAgInNyYy9sc3BfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvbXVsdF9yLmNwcCIsCi0gICAgICAgICJzcmMvbm9ybV9sLmNwcCIsCi0gICAgICAgICJzcmMvbm9ybV9zLmNwcCIsCi0gICAgICAgICJzcmMvcGhfZGlzcF90YWIuY3BwIiwKLSAgICAgICAgInNyYy9wb3cyLmNwcCIsCi0gICAgICAgICJzcmMvcG93Ml90YmwuY3BwIiwKLSAgICAgICAgInNyYy9wcmVkX2x0LmNwcCIsCi0gICAgICAgICJzcmMvcV9wbHNmLmNwcCIsCi0gICAgICAgICJzcmMvcV9wbHNmXzMuY3BwIiwKLSAgICAgICAgInNyYy9xX3Bsc2ZfM190YmwuY3BwIiwKLSAgICAgICAgInNyYy9xX3Bsc2ZfNS5jcHAiLAotICAgICAgICAic3JjL3FfcGxzZl81X3RibC5jcHAiLAotICAgICAgICAic3JjL3F1YV9nYWluX3RibC5jcHAiLAotICAgICAgICAic3JjL3Jlb3JkZXIuY3BwIiwKLSAgICAgICAgInNyYy9yZXNpZHUuY3BwIiwKLSAgICAgICAgInNyYy9yb3VuZC5jcHAiLAotICAgICAgICAic3JjL3NldF96ZXJvLmNwcCIsCi0gICAgICAgICJzcmMvc2hyLmNwcCIsCi0gICAgICAgICJzcmMvc2hyX3IuY3BwIiwKLSAgICAgICAgInNyYy9zcXJ0X2wuY3BwIiwKLSAgICAgICAgInNyYy9zcXJ0X2xfdGJsLmNwcCIsCi0gICAgICAgICJzcmMvc3ViLmNwcCIsCi0gICAgICAgICJzcmMvc3luX2ZpbHQuY3BwIiwKLSAgICAgICAgInNyYy92YWQxLmNwcCIsCi0gICAgICAgICJzcmMvd2VpZ2h0X2EuY3BwIiwKLSAgICAgICAgInNyYy93aW5kb3dfdGFiLmNwcCIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLSAgICAgICAgIi1ET1NDTF9FWFBPUlRfUkVGPSIsCi0KLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKLSAgICAvL3Nhbml0aXplOiB7Ci0gICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAvLyAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgIC8vICAgIF0sCi0gICAgLy99LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IGI4ZTAwYjMuLjJjMDk1NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsODYgKzEsMjAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi0gICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotCi0gICAgc3JjczogWwotICAgICAgICAic3JjL2FfcmVmbC5jcHAiLAotICAgICAgICAic3JjL2FnYy5jcHAiLAotICAgICAgICAic3JjL2FtcmRlY29kZS5jcHAiLAotICAgICAgICAic3JjL2JfY25fY29kLmNwcCIsCi0gICAgICAgICJzcmMvYmduc2NkLmNwcCIsCi0gICAgICAgICJzcmMvY19nX2F2ZXIuY3BwIiwKLSAgICAgICAgInNyYy9kMTAzNXBmLmNwcCIsCi0gICAgICAgICJzcmMvZDJfMTFwZi5jcHAiLAotICAgICAgICAic3JjL2QyXzlwZi5jcHAiLAotICAgICAgICAic3JjL2QzXzE0cGYuY3BwIiwKLSAgICAgICAgInNyYy9kNF8xN3BmLmNwcCIsCi0gICAgICAgICJzcmMvZDhfMzFwZi5jcHAiLAotICAgICAgICAic3JjL2RfZ2Fpbl9jLmNwcCIsCi0gICAgICAgICJzcmMvZF9nYWluX3AuY3BwIiwKLSAgICAgICAgInNyYy9kX3Bsc2YuY3BwIiwKLSAgICAgICAgInNyYy9kX3Bsc2ZfMy5jcHAiLAotICAgICAgICAic3JjL2RfcGxzZl81LmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2Ftci5jcHAiLAotICAgICAgICAic3JjL2RlY19nYWluLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2lucHV0X2Zvcm1hdF90YWIuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfbGFnMy5jcHAiLAotICAgICAgICAic3JjL2RlY19sYWc2LmNwcCIsCi0gICAgICAgICJzcmMvZHR4X2RlYy5jcHAiLAotICAgICAgICAic3JjL2VjX2dhaW5zLmNwcCIsCi0gICAgICAgICJzcmMvZXhfY3RybC5jcHAiLAotICAgICAgICAic3JjL2lmMl90b19ldHMuY3BwIiwKLSAgICAgICAgInNyYy9pbnRfbHNmLmNwcCIsCi0gICAgICAgICJzcmMvbHNwX2F2Zy5jcHAiLAotICAgICAgICAic3JjL3BoX2Rpc3AuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byby5jcHAiLAotICAgICAgICAic3JjL3ByZWVtcGguY3BwIiwKLSAgICAgICAgInNyYy9wc3RmaWx0LmNwcCIsCi0gICAgICAgICJzcmMvcWdhaW40NzVfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvc3BfZGVjLmNwcCIsCi0gICAgICAgICJzcmMvd21mX3RvX2V0cy5jcHAiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAotICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLQotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAotCi0gICAgLy9zYW5pdGl6ZTogewotICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgLy8gICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgLy8gICAgXSwKLSAgICAvL30sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKICAgICBdLApAQCAtMTAzLDM5ICszNywzIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCiB9Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIHNyY3M6IFsidGVzdC9hbXJuYmRlY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICAvL3Nhbml0aXplOiB7Ci0gICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAvLyAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAvLyAgICBdLAotICAgIC8vfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCmluZGV4IGNkZmMwM2EuLjAxZGEzZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcApAQCAtNTc2LDYgKzU3Niw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYzlmODYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcm5iRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1ybmJEZWNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlMTNhZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMgTWVkaWEgVGVzdGluZyAjIwotLS0tCi0jIyMjIEFNUi1OQiBEZWNvZGVyIDoKLVRoZSBBbXItTmIgRGVjb2RlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgYW1ybmIgZGVjb2RlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCi0KLVJ1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgotYGBgCi1tIEFtcm5iRGVjb2RlclRlc3QKLWBgYAotCi1UaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LwotCi1UaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCi0KLVRvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgotYGBgCi1hZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi1UbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCi1gYGAKLWFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLWBgYAotCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzEzY000dEFhVkZybXItekdGcWFBekZCYktzNzVwbm05YikuIFB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCi1Eb3dubG9hZCBhbXItbmIgZm9sZGVyIGFuZCBwdXNoIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgotYGBgCi1hZGIgcHVzaCBhbXItbmIvLiAvZGF0YS9sb2NhbC90bXAvCi1gYGAKLQotdXNhZ2U6IEFtcm5iRGVjb2RlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+Ci1gYGAKLWFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvCi1gYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCA3M2ExZDRiLi42YmYyZDM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDk4ICsxLDIxIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hbXJlbmNvZGUuY3BwIiwKLSAgICAgICAgInNyYy9hdXRvY29yci5jcHAiLAotICAgICAgICAic3JjL2MxMDM1cGYuY3BwIiwKLSAgICAgICAgInNyYy9jMl8xMXBmLmNwcCIsCi0gICAgICAgICJzcmMvYzJfOXBmLmNwcCIsCi0gICAgICAgICJzcmMvYzNfMTRwZi5jcHAiLAotICAgICAgICAic3JjL2M0XzE3cGYuY3BwIiwKLSAgICAgICAgInNyYy9jOF8zMXBmLmNwcCIsCi0gICAgICAgICJzcmMvY2FsY19jb3IuY3BwIiwKLSAgICAgICAgInNyYy9jYWxjX2VuLmNwcCIsCi0gICAgICAgICJzcmMvY2JzZWFyY2guY3BwIiwKLSAgICAgICAgInNyYy9jbF9sdHAuY3BwIiwKLSAgICAgICAgInNyYy9jb2RfYW1yLmNwcCIsCi0gICAgICAgICJzcmMvY29udm9sdmUuY3BwIiwKLSAgICAgICAgInNyYy9jb3JfaC5jcHAiLAotICAgICAgICAic3JjL2Nvcl9oX3guY3BwIiwKLSAgICAgICAgInNyYy9jb3JfaF94Mi5jcHAiLAotICAgICAgICAic3JjL2NvcnJ3Z2h0X3RhYi5jcHAiLAotICAgICAgICAic3JjL2R0eF9lbmMuY3BwIiwKLSAgICAgICAgInNyYy9lbmNfbGFnMy5jcHAiLAotICAgICAgICAic3JjL2VuY19sYWc2LmNwcCIsCi0gICAgICAgICJzcmMvZW5jX291dHB1dF9mb3JtYXRfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvZXRzX3RvX2lmMi5jcHAiLAotICAgICAgICAic3JjL2V0c190b193bWYuY3BwIiwKLSAgICAgICAgInNyYy9nX2FkYXB0LmNwcCIsCi0gICAgICAgICJzcmMvZ19jb2RlLmNwcCIsCi0gICAgICAgICJzcmMvZ19waXRjaC5jcHAiLAotICAgICAgICAic3JjL2dhaW5fcS5jcHAiLAotICAgICAgICAic3JjL2hwX21heC5jcHAiLAotICAgICAgICAic3JjL2ludGVyXzM2LmNwcCIsCi0gICAgICAgICJzcmMvaW50ZXJfMzZfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvbF9jb21wLmNwcCIsCi0gICAgICAgICJzcmMvbF9leHRyYWN0LmNwcCIsCi0gICAgICAgICJzcmMvbF9uZWdhdGUuY3BwIiwKLSAgICAgICAgInNyYy9sYWdfd2luZC5jcHAiLAotICAgICAgICAic3JjL2xhZ193aW5kX3RhYi5jcHAiLAotICAgICAgICAic3JjL2xldmluc29uLmNwcCIsCi0gICAgICAgICJzcmMvbHBjLmNwcCIsCi0gICAgICAgICJzcmMvb2xfbHRwLmNwcCIsCi0gICAgICAgICJzcmMvcF9vbF93Z2guY3BwIiwKLSAgICAgICAgInNyYy9waXRjaF9mci5jcHAiLAotICAgICAgICAic3JjL3BpdGNoX29sLmNwcCIsCi0gICAgICAgICJzcmMvcHJlX2JpZy5jcHAiLAotICAgICAgICAic3JjL3ByZV9wcm9jLmNwcCIsCi0gICAgICAgICJzcmMvcHJtMmJpdHMuY3BwIiwKLSAgICAgICAgInNyYy9xX2dhaW5fYy5jcHAiLAotICAgICAgICAic3JjL3FfZ2Fpbl9wLmNwcCIsCi0gICAgICAgICJzcmMvcWdhaW40NzUuY3BwIiwKLSAgICAgICAgInNyYy9xZ2Fpbjc5NS5jcHAiLAotICAgICAgICAic3JjL3F1YV9nYWluLmNwcCIsCi0gICAgICAgICJzcmMvczEwXzhwZi5jcHAiLAotICAgICAgICAic3JjL3NldF9zaWduLmNwcCIsCi0gICAgICAgICJzcmMvc2lkX3N5bmMuY3BwIiwKLSAgICAgICAgInNyYy9zcF9lbmMuY3BwIiwKLSAgICAgICAgInNyYy9zcHJlcHJvYy5jcHAiLAotICAgICAgICAic3JjL3Nwc3Rwcm9jLmNwcCIsCi0gICAgICAgICJzcmMvdG9uX3N0YWIuY3BwIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfaGVhZGVycyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAotICAgIC8vc2FuaXRpemU6IHsKLSAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgIC8vICAgIF0sCi0gICAgLy99LAotCi0gICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCi19CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJuYmVuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0QU1STkJFbmNvZGVyLmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCiAgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTEwNiwyNyArMjksMyBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKICAgICBdLAogfQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLQotICAgIHNyY3M6IFsidGVzdC9hbXJuYl9lbmNfdGVzdC5jcHAiXSwKLQotICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIl0sCi0KLSAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAotICAgIC8vc2FuaXRpemU6IHsKLSAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgIC8vICAgIF0sCi0gICAgLy99LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKaW5kZXggODVhYjY0ZS4uYTFmNjY4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCkBAIC00MjEsNiArNDIxLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvY29yX2hfeDIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGZkODY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL2Nvcl9oX3gyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgM0dQUCBzdGFuZGFyZDoKLQotICAgIDNHUFAgVFMgMjYuMDczCi0gICAgQU5TSS1DIGNvZGUgZm9yIHRoZSBBZGFwdGl2ZSBNdWx0aS1SYXRlIChBTVIpIHNwZWVjaCBjb2RlYwotICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKLQotKEMpIDIwMDQsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQotUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKLXRlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0KLSBQYXRobmFtZTogLi9hdWRpby9nc20tYW1yL2Mvc3JjL2Nvcl9oX3gyLmMKLQotICAgICBEYXRlOiAxMS8wNy8yMDAxCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFVklTSU9OIEhJU1RPUlkKLQotIERlc2NyaXB0aW9uOiBDcmVhdGVkIGEgc2VwYXJhdGUgZmlsZSBmb3IgY29yX2hfeDIgZnVuY3Rpb24uCi0KLSBEZXNjcmlwdGlvbjogRml4ZWQgdHlwZWNhc3RpbmcgaXNzdWUgd2l0aCBUSSBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIG9uZQotICAgICAgICAgICAgICBsb2NhbCB2YXJpYWJsZSBwZXIgbGluZS4gVXBkYXRlZCBjb3B5cmlnaHQgeWVhci4KLQotIERlc2NyaXB0aW9uOiBBZGRlZCAjZGVmaW5lIGZvciBsb2cyKDMyKSA9IDUuCi0KLSBEZXNjcmlwdGlvbjogQWRkZWQgY2FsbCB0byByb3VuZCgpIGFuZCBMX3NobCgpIGZ1bmN0aW9ucyBpbiB0aGUgbGFzdCBGT1IKLSAgICAgICAgICAgICAgbG9vcCB0byBtYWtlIGNvZGUgYml0LWV4YWN0LgotCi0gRGVzY3JpcHRpb246IEFkZGVkIHBPdmVyZmxvdyBhcyBhIHZhcmlhYmxlIHRoYXQncyBwYXNzZWQgaW4gZm9yIHRoZSBFUE9DCi0gICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMuCi0KLSBEZXNjcmlwdGlvbjogQ2hhbmdlZCByb3VuZCBmdW5jdGlvbiBuYW1lIHRvIHB2X3JvdW5kIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKLSAgICAgICAgICAgICAgcm91bmQgZnVuY3Rpb24gaW4gQyBzdGFuZGFyZCBsaWJyYXJ5LgotCi0gRGVzY3JpcHRpb246IFVzaW5nIGludHJpbnNpY3MgZnJvbSBmeHBfYXJpdGhtZXRpYy5oIC4KLQotIERlc2NyaXB0aW9uOiBSZXBsYWNpbmcgZnhwX2FyaXRobWV0aWMuaCB3aXRoIGJhc2ljX29wLmguCi0KLSBEZXNjcmlwdGlvbjoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJjbnN0LmgiCi0jaW5jbHVkZSAiY29yX2hfeC5oIgotI2luY2x1ZGUgImNvcl9oX3gyLmgiIC8vIEJYCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIExPRzJfT0ZfMzIgIDUKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gTkFNRTogY29yX2hfeDIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBoID0gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGltcHVsc2UgcmVzcG9uc2Ugb2YgdGhlIHdlaWdodGVkIHN5bnRoZXNpcwotICAgICAgICBmaWx0ZXI7IHZlY3RvciBjb250ZW50cyBhcmUgb2YgdHlwZSBXb3JkMTY7IHZlY3RvciBsZW5ndGggaXMKLSAgICAgICAgMiAqIExfU1VCRlIKLSAgICB4ID0gdGFyZ2V0IHNpZ25hbCB2ZWN0b3I7IHZlY3RvciBjb250ZW50cyBhcmUgb2YgdHlwZSBXb3JkMTY7IHZlY3RvcgotICAgICAgICBsZW5ndGggaXMgTF9TVUJGUgotICAgIGRuID0gdmVjdG9yIGNvbnRhaW5pbmcgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlCi0gICAgICAgICBpbXB1bHNlIHJlc3BvbnNlOyB2ZWN0b3IgY29udGVudHMgYXJlIG9mIHR5cGUgV29yZDE2OyB2ZWN0b3IKLSAgICAgICAgIGxlbmd0aCBpcyBMX0NPREUKLSAgICBzZiA9IHNjYWxpbmcgZmFjdG9yIG9mIHR5cGUgV29yZDE2IDsgMiB3aGVuIG1vZGUgaXMgTVIxMjIsIDEgZm9yIGFsbAotICAgICAgICAgb3RoZXIgbW9kZXMKLSAgICBuYl90cmFjayA9IG51bWJlciBvZiBBQ0IgdHJhY2tzIChXb3JkMTYpCi0gICAgc3RlcCA9IHN0ZXAgc2l6ZSBiZXR3ZWVuIHB1bHNlcyBpbiBvbmUgdHJhY2sgKFdvcmQxNikKLSAgICBwT3ZlcmZsb3cgPSBwb2ludGVyIHRvIG92ZXJmbG93IChGbGFnKQotCi0gT3V0cHV0czoKLSAgICBkbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY29ycmVsYXRpb24gdmFsdWVzCi0gICAgcE92ZXJmbG93ID0gMSBpZiB0aGUgbWF0aCBmdW5jdGlvbnMgY2FsbGVkIGJ5IGNvcl9oX3gyIHJlc3VsdCBpbiBvdmVyZmxvdwotICAgIGVsc2UgemVyby4KLQotIFJldHVybnM6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFZhcmlhYmxlcyBVc2VkOgotICAgIE5vbmUKLQotIExvY2FsIFZhcmlhYmxlcyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGUgdGFyZ2V0IHNpZ25hbCAoeCkgYW5kIHRoZQotIGltcHVsc2UgcmVzcG9uc2UgKGgpLgotCi0gVGhlIGNvcnJlbGF0aW9uIGlzIGdpdmVuIGJ5OiBkW25dID0gc3VtX3tpPW59XntMLTF9IHhbaV0gaFtpLW5dLAotIHdoZXJlOiBuPTAsLi4uLEwtMQotCi0gZFtuXSBpcyBub3JtYWxpemVkIHN1Y2ggdGhhdCB0aGUgc3VtIG9mIDUgbWF4aW1hIG9mIGRbbl0gY29ycmVzcG9uZGluZyB0bwotIGVhY2ggcG9zaXRpb24gdHJhY2sgZG9lcyBub3Qgc2F0dXJhdGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSBjb3JfaC5jLCBVTVRTIEdTTSBBTVIgc3BlZWNoIGNvZGVjLCBSOTkgLSBWZXJzaW9uIDMuMi4wLCBNYXJjaCAyLCAyMDAxCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLVRoZSBvcmlnaW5hbCBldHNpIHJlZmVyZW5jZSBjb2RlIHVzZXMgYSBnbG9iYWwgZmxhZyBPdmVyZmxvdy4gSG93ZXZlciwgaW4gdGhlCi1hY3R1YWwgaW1wbGVtZW50YXRpb24gYSBwb2ludGVyIHRvIGEgdGhlIG92ZXJmbG93IGZsYWcgaXMgcGFzc2VkIGluLgotCi12b2lkIGNvcl9oX3gyICgKLSAgICBXb3JkMTYgaFtdLCAgICAvLyAoaSk6IGltcHVsc2UgcmVzcG9uc2Ugb2Ygd2VpZ2h0ZWQgc3ludGhlc2lzIGZpbHRlcgotICAgIFdvcmQxNiB4W10sICAgIC8vIChpKTogdGFyZ2V0Ci0gICAgV29yZDE2IGRuW10sICAgLy8gKG8pOiBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRhcmdldCBhbmQgaFtdCi0gICAgV29yZDE2IHNmLCAgICAgLy8gKGkpOiBzY2FsaW5nIGZhY3RvcjogMiBmb3IgMTIuMiwgMSBmb3Igb3RoZXJzCi0gICAgV29yZDE2IG5iX3RyYWNrLC8vIChpKTogdGhlIG51bWJlciBvZiBBQ0IgdHJhY2tzCi0gICAgV29yZDE2IHN0ZXAgICAgLy8gKGkpOiBzdGVwIHNpemUgZnJvbSBvbmUgcHVsc2UgcG9zaXRpb24gdG8gdGhlIG5leHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG9uZSB0cmFjawotKQotewotICAgIFdvcmQxNiBpLCBqLCBrOwotICAgIFdvcmQzMiBzLCB5MzJbTF9DT0RFXSwgbWF4LCB0b3Q7Ci0KLSAgICAvLyBmaXJzdCBrZWVwIHRoZSByZXN1bHQgb24gMzIgYml0cyBhbmQgZmluZCBhYnNvbHV0ZSBtYXhpbXVtCi0KLSAgICB0b3QgPSA1OwotCi0gICAgZm9yIChrID0gMDsgayA8IG5iX3RyYWNrOyBrKyspCi0gICAgewotICAgICAgICBtYXggPSAwOwotICAgICAgICBmb3IgKGkgPSBrOyBpIDwgTF9DT0RFOyBpICs9IHN0ZXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHMgPSAwOwotICAgICAgICAgICAgZm9yIChqID0gaTsgaiA8IExfQ09ERTsgaisrKQotICAgICAgICAgICAgICAgIHMgPSBMX21hYyAocywgeFtqXSwgaFtqIC0gaV0pOwotCi0gICAgICAgICAgICB5MzJbaV0gPSBzOwotCi0gICAgICAgICAgICBzID0gTF9hYnMgKHMpOwotICAgICAgICAgICAgaWYgKExfc3ViIChzLCBtYXgpID4gKFdvcmQzMikgMEwpCi0gICAgICAgICAgICAgICAgbWF4ID0gczsKLSAgICAgICAgfQotICAgICAgICB0b3QgPSBMX2FkZCAodG90LCBMX3NociAobWF4LCAxKSk7Ci0gICAgfQotCi0gICAgaiA9IHN1YiAobm9ybV9sICh0b3QpLCBzZik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTF9DT0RFOyBpKyspCi0gICAgewotICAgICAgICBkbltpXSA9IHB2X3JvdW5kIChMX3NobCAoeTMyW2ldLCBqKSk7Ci0gICAgfQotfQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCi0KLSBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCi0KLSBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICAgICAgIGNhbGxlZCkKLSAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDQVVUSU9OIFtvcHRpb25hbF0KLSBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLXZvaWQgY29yX2hfeDIoCi0gICAgV29yZDE2IGhbXSwgICAgLyogKGkpOiBpbXB1bHNlIHJlc3BvbnNlIG9mIHdlaWdodGVkIHN5bnRoZXNpcyBmaWx0ZXIgKi8KLSAgICBXb3JkMTYgeFtdLCAgICAvKiAoaSk6IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFdvcmQxNiBkbltdLCAgIC8qIChvKTogY29ycmVsYXRpb24gYmV0d2VlbiB0YXJnZXQgYW5kIGhbXSAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmLCAgICAgLyogKGkpOiBzY2FsaW5nIGZhY3RvcjogMiBmb3IgMTIuMiwgMSBmb3Igb3RoZXJzICAgICAgKi8KLSAgICBXb3JkMTYgbmJfdHJhY2ssLyogKGkpOiB0aGUgbnVtYmVyIG9mIEFDQiB0cmFja3MgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFdvcmQxNiBzdGVwLCAgIC8qIChpKTogc3RlcCBzaXplIGZyb20gb25lIHB1bHNlIHBvc2l0aW9uIHRvIHRoZSBuZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvbmUgdHJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGbGFnICpwT3ZlcmZsb3cKLSkKLXsKLSAgICBXb3JkMTYgaTsKLSAgICBXb3JkMTYgajsKLSAgICBXb3JkMTYgazsKLSAgICBXb3JkMzIgczsKLSAgICBXb3JkMzIgeTMyW0xfQ09ERV07Ci0gICAgV29yZDMyIG1heDsKLSAgICBXb3JkMzIgdG90OwotCi0KLSAgICAvKiBmaXJzdCBrZWVwIHRoZSByZXN1bHQgb24gMzIgYml0cyBhbmQgZmluZCBhYnNvbHV0ZSBtYXhpbXVtICovCi0gICAgdG90ID0gTE9HMl9PRl8zMjsKLSAgICBmb3IgKGsgPSAwOyBrIDwgbmJfdHJhY2s7IGsrKykKLSAgICB7Ci0gICAgICAgIG1heCA9IDA7Ci0gICAgICAgIGZvciAoaSA9IGs7IGkgPCBMX0NPREU7IGkgKz0gc3RlcCkKLSAgICAgICAgewotICAgICAgICAgICAgcyA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IGk7IGogPCBMX0NPREU7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzID0gYW1ybmJfZnhwX21hY18xNl9ieV8xNmJiKChXb3JkMzIpeFtqXSwgKFdvcmQzMiloW2otaV0sIHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzID0gcyA8PCAxOwotICAgICAgICAgICAgeTMyW2ldID0gczsKLSAgICAgICAgICAgIHMgPSBMX2FicyhzKTsKLQotICAgICAgICAgICAgaWYgKHMgPiBtYXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0b3QgPSAodG90ICsgKG1heCA+PiAxKSk7Ci0gICAgfQotCi0gICAgaiA9IHN1Yihub3JtX2wodG90KSwgc2YsIHBPdmVyZmxvdyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTF9DT0RFOyBpKyspCi0gICAgewotICAgICAgICBkbltpXSA9IHB2X3JvdW5kKExfc2hsKHkzMltpXSwgaiwgcE92ZXJmbG93KSwgcE92ZXJmbG93KTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZGE1ODkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLVBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgM0dQUCBzdGFuZGFyZDoKLQotICAgIDNHUFAgVFMgMjYuMDczCi0gICAgQU5TSS1DIGNvZGUgZm9yIHRoZSBBZGFwdGl2ZSBNdWx0aS1SYXRlIChBTVIpIHNwZWVjaCBjb2RlYwotICAgIEF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuM2dwcC5vcmcKLQotKEMpIDIwMDQsIDNHUFAgT3JnYW5pemF0aW9uYWwgUGFydG5lcnMgKEFSSUIsIEFUSVMsIENDU0EsIEVUU0ksIFRUQSwgVFRDKQotUGVybWlzc2lvbiB0byBkaXN0cmlidXRlLCBtb2RpZnkgYW5kIHVzZSB0aGlzIGZpbGUgdW5kZXIgdGhlIHN0YW5kYXJkIGxpY2Vuc2UKLXRlcm1zIGxpc3RlZCBhYm92ZSBoYXMgYmVlbiBvYnRhaW5lZCBmcm9tIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0KLSBQYXRobmFtZTogLi9hdWRpby9nc20tYW1yL2Mvc3JjL3FnYWluNDc1LmMKLSBGdW50aW9uczogTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cwotICAgICAgICAgICBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKLSAgICAgICAgICAgTVI0NzVfZ2Fpbl9xdWFudAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBNT0RVTEUgREVTQ1JJUFRJT04KLQotIFRoZXNlIG1vZHVsZXMgaGFuZGxlIHRoZSBxdWFudGl6YXRpb24gb2YgcGl0Y2ggYW5kIGNvZGVib29rIGdhaW5zIGZvciBNUjQ3NS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAicWdhaW40NzUuaCIKLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLSNpbmNsdWRlICJtb2RlLmgiCi0jaW5jbHVkZSAiY25zdC5oIgotI2luY2x1ZGUgInBvdzIuaCIKLSNpbmNsdWRlICJsb2cyLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNUjQ3NV9WUV9TSVpFIDI1NgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFZBUklBQkxFIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUaGUgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBkYXRhOgotICoKLSAqICAgIGdfcGl0Y2goMCkgICAgICAgIChRMTQpIC8vIGZvciBzdWItCi0gKiAgICBnX2ZhYygwKSAgICAgICAgICAoUTEyKSAvLyBmcmFtZSAwIGFuZCAyCi0gKiAgICBnX3BpdGNoKDEpICAgICAgICAoUTE0KSAvLyBmb3Igc3ViLQotICogICAgZ19mYWMoMikgICAgICAgICAgKFExMikgLy8gZnJhbWUgMSBhbmQgMwotICoKLSAqLwotc3RhdGljIGNvbnN0IFdvcmQxNiB0YWJsZV9nYWluX01SNDc1W01SNDc1X1ZRX1NJWkUqNF0gPQotewotICAgIC8qZ19waXQoMCksIGdfZmFjKDApLCAgICAgIGdfcGl0KDEpLCBnX2ZhYygxKSAqLwotICAgIDgxMiwgICAgICAgICAgMTI4LCAgICAgICAgICAgNTQyLCAgICAgIDE0MCwKLSAgICAyODczLCAgICAgICAgIDExMzUsICAgICAgICAgIDIyNjYsICAgICAzNDAyLAotICAgIDIwNjcsICAgICAgICAgIDU2MywgICAgICAgICAxMjY3NywgICAgICA2NDcsCi0gICAgNDEzMiwgICAgICAgICAxNzk4LCAgICAgICAgICA1NjAxLCAgICAgNTI4NSwKLSAgICA3Njg5LCAgICAgICAgICAzNzQsICAgICAgICAgIDM3MzUsICAgICAgNDQxLAotICAgIDEwOTEyLCAgICAgICAgIDI2MzgsICAgICAgICAgMTE4MDcsICAgICAyNDk0LAotICAgIDIwNDkwLCAgICAgICAgICA3OTcsICAgICAgICAgIDUyMTgsICAgICAgNjc1LAotICAgIDY3MjQsICAgICAgICAgODM1NCwgICAgICAgICAgNTI4MiwgICAgIDE2OTYsCi0gICAgMTQ4OCwgICAgICAgICAgNDI4LCAgICAgICAgICA1ODgyLCAgICAgIDQ1MiwKLSAgICA1MzMyLCAgICAgICAgIDQwNzIsICAgICAgICAgIDM1ODMsICAgICAxMjY4LAotICAgIDI0NjksICAgICAgICAgIDkwMSwgICAgICAgICAxNTg5NCwgICAgIDEwMDUsCi0gICAgMTQ5ODIsICAgICAgICAgMzI3MSwgICAgICAgICAxMDMzMSwgICAgIDQ4NTgsCi0gICAgMzYzNSwgICAgICAgICAyMDIxLCAgICAgICAgICAyNTk2LCAgICAgIDgzNSwKLSAgICAxMjM2MCwgICAgICAgICA0ODkyLCAgICAgICAgIDEyMjA2LCAgICAgMTcwNCwKLSAgICAxMzQzMiwgICAgICAgICAxNjA0LCAgICAgICAgICA5MTE4LCAgICAgMjM0MSwKLSAgICAzOTY4LCAgICAgICAgIDE1MzgsICAgICAgICAgIDU0NzksICAgICA5OTM2LAotICAgIDM3OTUsICAgICAgICAgIDQxNywgICAgICAgICAgMTM1OSwgICAgICA0MTQsCi0gICAgMzY0MCwgICAgICAgICAxNTY5LCAgICAgICAgICA3OTk1LCAgICAgMzU0MSwKLSAgICAxMTQwNSwgICAgICAgICAgNjQ1LCAgICAgICAgICA4NTUyLCAgICAgIDYzNSwKLSAgICA0MDU2LCAgICAgICAgIDEzNzcsICAgICAgICAgMTY2MDgsICAgICA2MTI0LAotICAgIDExNDIwLCAgICAgICAgICA3MDAsICAgICAgICAgIDIwMDcsICAgICAgNjA3LAotICAgIDEyNDE1LCAgICAgICAgIDE1NzgsICAgICAgICAgMTExMTksICAgICA0NjU0LAotICAgIDEzNjgwLCAgICAgICAgIDE3MDgsICAgICAgICAgMTE5OTAsICAgICAxMjI5LAotICAgIDc5OTYsICAgICAgICAgNzI5NywgICAgICAgICAxMzIzMSwgICAgIDU3MTUsCi0gICAgMjQyOCwgICAgICAgICAxMTU5LCAgICAgICAgICAyMDczLCAgICAgMTk0MSwKLSAgICA2MjE4LCAgICAgICAgIDYxMjEsICAgICAgICAgIDM1NDYsICAgICAxODA0LAotICAgIDg5MjUsICAgICAgICAgMTgwMiwgICAgICAgICAgODY3OSwgICAgIDE1ODAsCi0gICAgMTM5MzUsICAgICAgICAgMzU3NiwgICAgICAgICAxMzMxMywgICAgIDYyMzcsCi0gICAgNjE0MiwgICAgICAgICAxMTMwLCAgICAgICAgICA1OTk0LCAgICAgMTczNCwKLSAgICAxNDE0MSwgICAgICAgICA0NjYyLCAgICAgICAgIDExMjcxLCAgICAgMzMyMSwKLSAgICAxMjIyNiwgICAgICAgICAxNTUxLCAgICAgICAgIDEzOTMxLCAgICAgMzAxNSwKLSAgICA1MDgxLCAgICAgICAgMTA0NjQsICAgICAgICAgIDk0NDQsICAgICA2NzA2LAotICAgIDE2ODksICAgICAgICAgIDY4MywgICAgICAgICAgMTQzNiwgICAgIDEzMDYsCi0gICAgNzIxMiwgICAgICAgICAzOTMzLCAgICAgICAgICA0MDgyLCAgICAgMjcxMywKLSAgICA3NzkzLCAgICAgICAgICA3MDQsICAgICAgICAgMTUwNzAsICAgICAgODAyLAotICAgIDYyOTksICAgICAgICAgNTIxMiwgICAgICAgICAgNDMzNywgICAgIDUzNTcsCi0gICAgNjY3NiwgICAgICAgICAgNTQxLCAgICAgICAgICA2MDYyLCAgICAgIDYyNiwKLSAgICAxMzY1MSwgICAgICAgICAzNzAwLCAgICAgICAgIDExNDk4LCAgICAgMjQwOCwKLSAgICAxNjE1NiwgICAgICAgICAgNzE2LCAgICAgICAgIDEyMTc3LCAgICAgIDc1MSwKLSAgICA4MDY1LCAgICAgICAgMTE0ODksICAgICAgICAgIDYzMTQsICAgICAyMjU2LAotICAgIDQ0NjYsICAgICAgICAgIDQ5NiwgICAgICAgICAgNzI5MywgICAgICA1MjMsCi0gICAgMTAyMTMsICAgICAgICAgMzgzMywgICAgICAgICAgODM5NCwgICAgIDMwMzcsCi0gICAgODQwMywgICAgICAgICAgOTY2LCAgICAgICAgIDE0MjI4LCAgICAgMTg4MCwKLSAgICA4NzAzLCAgICAgICAgIDU0MDksICAgICAgICAgMTYzOTUsICAgICA0ODYzLAotICAgIDc0MjAsICAgICAgICAgMTk3OSwgICAgICAgICAgNjA4OSwgICAgIDEyMzAsCi0gICAgOTM3MSwgICAgICAgICA0Mzk4LCAgICAgICAgIDE0NTU4LCAgICAgMzM2MywKLSAgICAxMzU1OSwgICAgICAgICAyODczLCAgICAgICAgIDEzMTYzLCAgICAgMTQ2NSwKLSAgICA1NTM0LCAgICAgICAgIDE2NzgsICAgICAgICAgMTMxMzgsICAgIDE0NzcxLAotICAgIDczMzgsICAgICAgICAgIDYwMCwgICAgICAgICAgMTMxOCwgICAgICA1NDgsCi0gICAgNDI1MiwgICAgICAgICAzNTM5LCAgICAgICAgIDEwMDQ0LCAgICAgMjM2NCwKLSAgICAxMDU4NywgICAgICAgICAgNjIyLCAgICAgICAgIDEzMDg4LCAgICAgIDY2OSwKLSAgICAxNDEyNiwgICAgICAgICAzNTI2LCAgICAgICAgICA1MDM5LCAgICAgOTc4NCwKLSAgICAxNTMzOCwgICAgICAgICAgNjE5LCAgICAgICAgICAzMTE1LCAgICAgIDU5MCwKLSAgICAxNjQ0MiwgICAgICAgICAzMDEzLCAgICAgICAgIDE1NTQyLCAgICAgNDE2OCwKLSAgICAxNTUzNywgICAgICAgICAxNjExLCAgICAgICAgIDE1NDA1LCAgICAgMTIyOCwKLSAgICAxNjAyMywgICAgICAgICA5Mjk5LCAgICAgICAgICA3NTM0LCAgICAgNDk3NiwKLSAgICAxOTkwLCAgICAgICAgIDEyMTMsICAgICAgICAgMTE0NDcsICAgICAxMTU3LAotICAgIDEyNTEyLCAgICAgICAgIDU1MTksICAgICAgICAgIDk0NzUsICAgICAyNjQ0LAotICAgIDc3MTYsICAgICAgICAgMjAzNCwgICAgICAgICAxMzI4MCwgICAgIDIyMzksCi0gICAgMTYwMTEsICAgICAgICAgNTA5MywgICAgICAgICAgODA2NiwgICAgIDY3NjEsCi0gICAgMTAwODMsICAgICAgICAgMTQxMywgICAgICAgICAgNTAwMiwgICAgIDIzNDcsCi0gICAgMTI1MjMsICAgICAgICAgNTk3NSwgICAgICAgICAxNTEyNiwgICAgIDI4OTksCi0gICAgMTgyNjQsICAgICAgICAgMjI4OSwgICAgICAgICAxNTgyNywgICAgIDI1MjcsCi0gICAgMTYyNjUsICAgICAgICAxMDI1NCwgICAgICAgICAxNDY1MSwgICAgMTEzMTksCi0gICAgMTc5NywgICAgICAgICAgMzM3LCAgICAgICAgICAzMTE1LCAgICAgIDM5NywKLSAgICAzNTEwLCAgICAgICAgIDI5MjgsICAgICAgICAgIDQ1OTIsICAgICAyNjcwLAotICAgIDc1MTksICAgICAgICAgIDYyOCwgICAgICAgICAxMTQxNSwgICAgICA2NTYsCi0gICAgNTk0NiwgICAgICAgICAyNDM1LCAgICAgICAgICA2NTQ0LCAgICAgNzM2NywKLSAgICA4MjM4LCAgICAgICAgICA4MjksICAgICAgICAgIDQwMDAsICAgICAgODYzLAotICAgIDEwMDMyLCAgICAgICAgIDI0OTIsICAgICAgICAgMTYwNTcsICAgICAzNTUxLAotICAgIDE4MjA0LCAgICAgICAgIDEwNTQsICAgICAgICAgIDYxMDMsICAgICAxNDU0LAotICAgIDU4ODQsICAgICAgICAgNzkwMCwgICAgICAgICAxODc1MiwgICAgIDM0NjgsCi0gICAgMTg2NCwgICAgICAgICAgNTQ0LCAgICAgICAgICA5MTk4LCAgICAgIDY4MywKLSAgICAxMTYyMywgICAgICAgICA0MTYwLCAgICAgICAgICA0NTk0LCAgICAgMTY0NCwKLSAgICAzMTU4LCAgICAgICAgIDExNTcsICAgICAgICAgMTU5NTMsICAgICAyNTYwLAotICAgIDEyMzQ5LCAgICAgICAgIDM3MzMsICAgICAgICAgMTc0MjAsICAgICA1MjYwLAotICAgIDYxMDYsICAgICAgICAgMjAwNCwgICAgICAgICAgMjkxNywgICAgIDE3NDIsCi0gICAgMTY0NjcsICAgICAgICAgNTI1NywgICAgICAgICAxNjc4NywgICAgIDE2ODAsCi0gICAgMTcyMDUsICAgICAgICAgMTc1OSwgICAgICAgICAgNDc3MywgICAgIDMyMzEsCi0gICAgNzM4NiwgICAgICAgICA2MDM1LCAgICAgICAgIDE0MzQyLCAgICAxMDAxMiwKLSAgICA0MDM1LCAgICAgICAgICA0NDIsICAgICAgICAgIDQxOTQsICAgICAgNDU4LAotICAgIDkyMTQsICAgICAgICAgMjI0MiwgICAgICAgICAgNzQyNywgICAgIDQyMTcsCi0gICAgMTI4NjAsICAgICAgICAgIDgwMSwgICAgICAgICAxMTE4NiwgICAgICA4MjUsCi0gICAgMTI2NDgsICAgICAgICAgMjA4NCwgICAgICAgICAxMjk1NiwgICAgIDY1NTQsCi0gICAgOTUwNSwgICAgICAgICAgOTk2LCAgICAgICAgICA2NjI5LCAgICAgIDk4NSwKLSAgICAxMDUzNywgICAgICAgICAyNTAyLCAgICAgICAgIDE1Mjg5LCAgICAgNTAwNiwKLSAgICAxMjYwMiwgICAgICAgICAyMDU1LCAgICAgICAgIDE1NDg0LCAgICAgMTY1MywKLSAgICAxNjE5NCwgICAgICAgICA2OTIxLCAgICAgICAgIDE0MjMxLCAgICAgNTc5MCwKLSAgICAyNjI2LCAgICAgICAgICA4MjgsICAgICAgICAgIDU2MTUsICAgICAxNjg2LAotICAgIDEzNjYzLCAgICAgICAgIDU3NzgsICAgICAgICAgIDM2NjgsICAgICAxNTU0LAotICAgIDExMzEzLCAgICAgICAgIDI2MzMsICAgICAgICAgIDk3NzAsICAgICAxNDU5LAotICAgIDE0MDAzLCAgICAgICAgIDQ3MzMsICAgICAgICAgMTU4OTcsICAgICA2MjkxLAotICAgIDYyNzgsICAgICAgICAgMTg3MCwgICAgICAgICAgNzkxMCwgICAgIDIyODUsCi0gICAgMTY5NzgsICAgICAgICAgNDU3MSwgICAgICAgICAxNjU3NiwgICAgIDM4NDksCi0gICAgMTUyNDgsICAgICAgICAgMjMxMSwgICAgICAgICAxNjAyMywgICAgIDMyNDQsCi0gICAgMTQ0NTksICAgICAgICAxNzgwOCwgICAgICAgICAxMTg0NywgICAgIDI3NjMsCi0gICAgMTk4MSwgICAgICAgICAxNDA3LCAgICAgICAgICAxNDAwLCAgICAgIDg3NiwKLSAgICA0MzM1LCAgICAgICAgIDM1NDcsICAgICAgICAgIDQzOTEsICAgICA0MjEwLAotICAgIDU0MDUsICAgICAgICAgIDY4MCwgICAgICAgICAxNzQ2MSwgICAgICA3ODEsCi0gICAgNjUwMSwgICAgICAgICA1MTE4LCAgICAgICAgICA4MDkxLCAgICAgNzY3NywKLSAgICA3MzU1LCAgICAgICAgICA3OTQsICAgICAgICAgIDgzMzMsICAgICAxMTgyLAotICAgIDE1MDQxLCAgICAgICAgIDMxNjAsICAgICAgICAgMTQ5MjgsICAgICAzMDM5LAotICAgIDIwNDIxLCAgICAgICAgICA4ODAsICAgICAgICAgMTQ1NDUsICAgICAgODUyLAotICAgIDEyMzM3LCAgICAgICAgMTQ3MDgsICAgICAgICAgIDY5MDQsICAgICAxOTIwLAotICAgIDQyMjUsICAgICAgICAgIDkzMywgICAgICAgICAgODIxOCwgICAgIDEwODcsCi0gICAgMTA2NTksICAgICAgICAgNDA4NCwgICAgICAgICAxMDA4MiwgICAgIDQ1MzMsCi0gICAgMjczNSwgICAgICAgICAgODQwLCAgICAgICAgIDIwNjU3LCAgICAgMTA4MSwKLSAgICAxNjcxMSwgICAgICAgICA1OTY2LCAgICAgICAgIDE1ODczLCAgICAgNDU3OCwKLSAgICAxMDg3MSwgICAgICAgICAyNTc0LCAgICAgICAgICAzNzczLCAgICAgMTE2NiwKLSAgICAxNDUxOSwgICAgICAgICA0MDQ0LCAgICAgICAgIDIwNjk5LCAgICAgMjYyNywKLSAgICAxNTIxOSwgICAgICAgICAyNzM0LCAgICAgICAgIDE1Mjc0LCAgICAgMjE4NiwKLSAgICA2MjU3LCAgICAgICAgIDMyMjYsICAgICAgICAgMTMxMjUsICAgIDE5NDgwLAotICAgIDcxOTYsICAgICAgICAgIDkzMCwgICAgICAgICAgMjQ2MiwgICAgIDE2MTgsCi0gICAgNDUxNSwgICAgICAgICAzMDkyLCAgICAgICAgIDEzODUyLCAgICAgNDI3NywKLSAgICAxMDQ2MCwgICAgICAgICAgODMzLCAgICAgICAgIDE3MzM5LCAgICAgIDgxMCwKLSAgICAxNjg5MSwgICAgICAgICAyMjg5LCAgICAgICAgIDE1NTQ2LCAgICAgODIxNywKLSAgICAxMzYwMywgICAgICAgICAxNjg0LCAgICAgICAgICAzMTk3LCAgICAgMTgzNCwKLSAgICAxNTk0OCwgICAgICAgICAyODIwLCAgICAgICAgIDE1ODEyLCAgICAgNTMyNywKLSAgICAxNzAwNiwgICAgICAgICAyNDM4LCAgICAgICAgIDE2Nzg4LCAgICAgMTMyNiwKLSAgICAxNTY3MSwgICAgICAgICA4MTU2LCAgICAgICAgIDExNzI2LCAgICAgODU1NiwKLSAgICAzNzYyLCAgICAgICAgIDIwNTMsICAgICAgICAgIDk1NjMsICAgICAxMzE3LAotICAgIDEzNTYxLCAgICAgICAgIDY3OTAsICAgICAgICAgMTIyMjcsICAgICAxOTM2LAotICAgIDgxODAsICAgICAgICAgMzU1MCwgICAgICAgICAxMzI4NywgICAgIDE3NzgsCi0gICAgMTYyOTksICAgICAgICAgNjU5OSwgICAgICAgICAxNjI5MSwgICAgIDc3NTgsCi0gICAgODUyMSwgICAgICAgICAyNTUxLCAgICAgICAgICA3MjI1LCAgICAgMjY0NSwKLSAgICAxODI2OSwgICAgICAgICA3NDg5LCAgICAgICAgIDE2ODg1LCAgICAgMjI0OCwKLSAgICAxNzg4MiwgICAgICAgICAyODg0LCAgICAgICAgIDE3MjY1LCAgICAgMzMyOCwKLSAgICA5NDE3LCAgICAgICAgMjAxNjIsICAgICAgICAgMTEwNDIsICAgICA4MzIwLAotICAgIDEyODYsICAgICAgICAgIDYyMCwgICAgICAgICAgMTQzMSwgICAgICA1ODMsCi0gICAgNTk5MywgICAgICAgICAyMjg5LCAgICAgICAgICAzOTc4LCAgICAgMzYyNiwKLSAgICA1MTQ0LCAgICAgICAgICA3NTIsICAgICAgICAgMTM0MDksICAgICAgODMwLAotICAgIDU1NTMsICAgICAgICAgMjg2MCwgICAgICAgICAxMTc2NCwgICAgIDU5MDgsCi0gICAgMTA3MzcsICAgICAgICAgIDU2MCwgICAgICAgICAgNTQ0NiwgICAgICA1NjQsCi0gICAgMTMzMjEsICAgICAgICAgMzAwOCwgICAgICAgICAxMTk0NiwgICAgIDM2ODMsCi0gICAgMTk4ODcsICAgICAgICAgIDc5OCwgICAgICAgICAgOTgyNSwgICAgICA3MjgsCi0gICAgMTM2NjMsICAgICAgICAgODc0OCwgICAgICAgICAgNzM5MSwgICAgIDMwNTMsCi0gICAgMjUxNSwgICAgICAgICAgNzc4LCAgICAgICAgICA2MDUwLCAgICAgIDgzMywKLSAgICA2NDY5LCAgICAgICAgIDUwNzQsICAgICAgICAgIDgzMDUsICAgICAyNDYzLAotICAgIDYxNDEsICAgICAgICAgMTg2NSwgICAgICAgICAxNTMwOCwgICAgIDEyNjIsCi0gICAgMTQ0MDgsICAgICAgICAgNDU0NywgICAgICAgICAxMzY2MywgICAgIDQ1MTUsCi0gICAgMzEzNywgICAgICAgICAyOTgzLCAgICAgICAgICAyNDc5LCAgICAgMTI1OSwKLSAgICAxNTA4OCwgICAgICAgICA0NjQ3LCAgICAgICAgIDE1MzgyLCAgICAgMjYwNywKLSAgICAxNDQ5MiwgICAgICAgICAyMzkyLCAgICAgICAgIDEyNDYyLCAgICAgMjUzNywKLSAgICA3NTM5LCAgICAgICAgIDI5NDksICAgICAgICAgMTI5MDksICAgIDEyMDYwLAotICAgIDU0NjgsICAgICAgICAgIDY4NCwgICAgICAgICAgMzE0MSwgICAgICA3MjIsCi0gICAgNTA4MSwgICAgICAgICAxMjc0LCAgICAgICAgIDEyNzMyLCAgICAgNDIwMCwKLSAgICAxNTMwMiwgICAgICAgICAgNjgxLCAgICAgICAgICA3ODE5LCAgICAgIDU5MiwKLSAgICA2NTM0LCAgICAgICAgIDIwMjEsICAgICAgICAgMTY0NzgsICAgICA4NzM3LAotICAgIDEzMzY0LCAgICAgICAgICA4ODIsICAgICAgICAgIDUzOTcsICAgICAgODk5LAotICAgIDE0NjU2LCAgICAgICAgIDIxNzgsICAgICAgICAgMTQ3NDEsICAgICA0MjI3LAotICAgIDE0MjcwLCAgICAgICAgIDEyOTgsICAgICAgICAgMTM5MjksICAgICAyMDI5LAotICAgIDE1NDc3LCAgICAgICAgIDc0ODIsICAgICAgICAgMTU4MTUsICAgICA0NTcyLAotICAgIDI1MjEsICAgICAgICAgMjAxMywgICAgICAgICAgNTA2MiwgICAgIDE4MDQsCi0gICAgNTE1OSwgICAgICAgICA2NTgyLCAgICAgICAgICA3MTMwLCAgICAgMzU5NywKLSAgICAxMDkyMCwgICAgICAgICAxNjExLCAgICAgICAgIDExNzI5LCAgICAgMTcwOCwKLSAgICAxNjkwMywgICAgICAgICAzNDU1LCAgICAgICAgIDE2MjY4LCAgICAgNjY0MCwKLSAgICA5MzA2LCAgICAgICAgIDEwMDcsICAgICAgICAgIDkzNjksICAgICAyMTA2LAotICAgIDE5MTgyLCAgICAgICAgIDUwMzcsICAgICAgICAgMTI0NDEsICAgICA0MjY5LAotICAgIDE1OTE5LCAgICAgICAgIDEzMzIsICAgICAgICAgMTUzNTcsICAgICAzNTEyLAotICAgIDExODk4LCAgICAgICAgMTQxNDEsICAgICAgICAgMTYxMDEsICAgICA2ODU0LAotICAgIDIwMTAsICAgICAgICAgIDczNywgICAgICAgICAgMzc3OSwgICAgICA4NjEsCi0gICAgMTE0NTQsICAgICAgICAgMjg4MCwgICAgICAgICAgMzU2NCwgICAgIDM1NDAsCi0gICAgOTA1NywgICAgICAgICAxMjQxLCAgICAgICAgIDEyMzkxLCAgICAgIDg5NiwKLSAgICA4NTQ2LCAgICAgICAgIDQ2MjksICAgICAgICAgMTE1NjEsICAgICA1Nzc2LAotICAgIDgxMjksICAgICAgICAgIDU4OSwgICAgICAgICAgODIxOCwgICAgICA1ODgsCi0gICAgMTg3MjgsICAgICAgICAgMzc1NSwgICAgICAgICAxMjk3MywgICAgIDMxNDksCi0gICAgMTU3MjksICAgICAgICAgIDc1OCwgICAgICAgICAxNjYzNCwgICAgICA3NTQsCi0gICAgMTUyMjIsICAgICAgICAxMTEzOCwgICAgICAgICAxNTg3MSwgICAgIDIyMDgsCi0gICAgNDY3MywgICAgICAgICAgNjEwLCAgICAgICAgIDEwMjE4LCAgICAgIDY3OCwKLSAgICAxNTI1NywgICAgICAgICA0MTQ2LCAgICAgICAgICA1NzI5LCAgICAgMzMyNywKLSAgICA4Mzc3LCAgICAgICAgIDE2NzAsICAgICAgICAgMTk4NjIsICAgICAyMzIxLAotICAgIDE1NDUwLCAgICAgICAgIDU1MTEsICAgICAgICAgMTQwNTQsICAgICA1NDgxLAotICAgIDU3MjgsICAgICAgICAgMjg4OCwgICAgICAgICAgNzU4MCwgICAgIDEzNDYsCi0gICAgMTQzODQsICAgICAgICAgNTMyNSwgICAgICAgICAxNjIzNiwgICAgIDM5NTAsCi0gICAgMTUxMTgsICAgICAgICAgMzc0NCwgICAgICAgICAxNTMwNiwgICAgIDE0MzUsCi0gICAgMTQ1OTcsICAgICAgICAgNDA3MCwgICAgICAgICAxMjMwMSwgICAgMTU2OTYsCi0gICAgNzYxNywgICAgICAgICAxNjk5LCAgICAgICAgICAyMTcwLCAgICAgIDg4NCwKLSAgICA0NDU5LCAgICAgICAgIDQ1NjcsICAgICAgICAgMTgwOTQsICAgICAzMzA2LAotICAgIDEyNzQyLCAgICAgICAgICA4MTUsICAgICAgICAgMTQ5MjYsICAgICAgOTA3LAotICAgIDE1MDE2LCAgICAgICAgIDQyODEsICAgICAgICAgMTU1MTgsICAgICA4MzY4LAotICAgIDE3OTk0LCAgICAgICAgIDEwODcsICAgICAgICAgIDIzNTgsICAgICAgODY1LAotICAgIDE2MjgxLCAgICAgICAgIDM3ODcsICAgICAgICAgMTU2NzksICAgICA0NTk2LAotICAgIDE2MzU2LCAgICAgICAgIDE1MzQsICAgICAgICAgMTY1ODQsICAgICAyMjEwLAotICAgIDE2ODMzLCAgICAgICAgIDk2OTcsICAgICAgICAgMTU5MjksICAgICA0NTEzLAotICAgIDMyNzcsICAgICAgICAgMTA4NSwgICAgICAgICAgOTY0MywgICAgIDIxODcsCi0gICAgMTE5NzMsICAgICAgICAgNjA2OCwgICAgICAgICAgOTE5OSwgICAgIDQ0NjIsCi0gICAgODk1NSwgICAgICAgICAxNjI5LCAgICAgICAgIDEwMjg5LCAgICAgMzA2MiwKLSAgICAxNjQ4MSwgICAgICAgICA1MTU1LCAgICAgICAgIDE1NDY2LCAgICAgNzA2NiwKLSAgICAxMzY3OCwgICAgICAgICAyNTQzLCAgICAgICAgICA1MjczLCAgICAgMjI3NywKLSAgICAxNjc0NiwgICAgICAgICA2MjEzLCAgICAgICAgIDE2NjU1LCAgICAgMzQwOCwKLSAgICAyMDMwNCwgICAgICAgICAzMzYzLCAgICAgICAgIDE4Njg4LCAgICAgMTk4NSwKLSAgICAxNDE3MiwgICAgICAgIDEyODY3LCAgICAgICAgIDE1MTU0LCAgICAxNTcwMywKLSAgICA0NDczLCAgICAgICAgIDEwMjAsICAgICAgICAgIDE2ODEsICAgICAgODg2LAotICAgIDQzMTEsICAgICAgICAgNDMwMSwgICAgICAgICAgODk1MiwgICAgIDM2NTcsCi0gICAgNTg5MywgICAgICAgICAxMTQ3LCAgICAgICAgIDExNjQ3LCAgICAgMTQ1MiwKLSAgICAxNTg4NiwgICAgICAgICAyMjI3LCAgICAgICAgICA0NTgyLCAgICAgNjY0NCwKLSAgICA2OTI5LCAgICAgICAgIDEyMDUsICAgICAgICAgIDYyMjAsICAgICAgNzk5LAotICAgIDEyNDE1LCAgICAgICAgIDM0MDksICAgICAgICAgMTU5NjgsICAgICAzODc3LAotICAgIDE5ODU5LCAgICAgICAgIDIxMDksICAgICAgICAgIDk2ODksICAgICAyMTQxLAotICAgIDE0NzQyLCAgICAgICAgIDg4MzAsICAgICAgICAgMTQ0ODAsICAgICAyNTk5LAotICAgIDE4MTcsICAgICAgICAgMTIzOCwgICAgICAgICAgNzc3MSwgICAgICA4MTMsCi0gICAgMTkwNzksICAgICAgICAgNDQxMCwgICAgICAgICAgNTU1NCwgICAgIDIwNjQsCi0gICAgMzY4NywgICAgICAgICAyODQ0LCAgICAgICAgIDE3NDM1LCAgICAgMjI1NiwKLSAgICAxNjY5NywgICAgICAgICA0NDg2LCAgICAgICAgIDE2MTk5LCAgICAgNTM4OCwKLSAgICA4MDI4LCAgICAgICAgIDI3NjMsICAgICAgICAgIDM0MDUsICAgICAyMTE5LAotICAgIDE3NDI2LCAgICAgICAgIDU0NzcsICAgICAgICAgMTM2OTgsICAgICAyNzg2LAotICAgIDE5ODc5LCAgICAgICAgIDI3MjAsICAgICAgICAgIDkwOTgsICAgICAzODgwLAotICAgIDE4MTcyLCAgICAgICAgIDQ4MzMsICAgICAgICAgMTczMzYsICAgIDEyMjA3LAotICAgIDUxMTYsICAgICAgICAgIDk5NiwgICAgICAgICAgNDkzNSwgICAgICA5ODgsCi0gICAgOTg4OCwgICAgICAgICAzMDgxLCAgICAgICAgICA2MDE0LCAgICAgNTM3MSwKLSAgICAxNTg4MSwgICAgICAgICAxNjY3LCAgICAgICAgICA4NDA1LCAgICAgMTE4MywKLSAgICAxNTA4NywgICAgICAgICAyMzY2LCAgICAgICAgIDE5Nzc3LCAgICAgNzAwMiwKLSAgICAxMTk2MywgICAgICAgICAxNTYyLCAgICAgICAgICA3Mjc5LCAgICAgMTEyOCwKLSAgICAxNjg1OSwgICAgICAgICAxNTMyLCAgICAgICAgIDE1NzYyLCAgICAgNTM4MSwKLSAgICAxNDcwOCwgICAgICAgICAyMDY1LCAgICAgICAgIDIwMTA1LCAgICAgMjE1NSwKLSAgICAxNzE1OCwgICAgICAgICA4MjQ1LCAgICAgICAgIDE3OTExLCAgICAgNjMxOCwKLSAgICA1NDY3LCAgICAgICAgIDE1MDQsICAgICAgICAgIDQxMDAsICAgICAyNTc0LAotICAgIDE3NDIxLCAgICAgICAgIDY4MTAsICAgICAgICAgIDU2NzMsICAgICAyODg4LAotICAgIDE2NjM2LCAgICAgICAgIDMzODIsICAgICAgICAgIDg5NzUsICAgICAxODMxLAotICAgIDIwMTU5LCAgICAgICAgIDQ3MzcsICAgICAgICAgMTk1NTAsICAgICA3Mjk0LAotICAgIDY2NTgsICAgICAgICAgMjc4MSwgICAgICAgICAxMTQ3MiwgICAgIDMzMjEsCi0gICAgMTkzOTcsICAgICAgICAgNTA1NCwgICAgICAgICAxODg3OCwgICAgIDQ3MjIsCi0gICAgMTY0MzksICAgICAgICAgMjM3MywgICAgICAgICAyMDQzMCwgICAgIDQzODYsCi0gICAgMTEzNTMsICAgICAgICAyNjUyNiwgICAgICAgICAxMTU5MywgICAgIDMwNjgsCi0gICAgMjg2NiwgICAgICAgICAxNTY2LCAgICAgICAgICA1MTA4LCAgICAgMTA3MCwKLSAgICA5NjE0LCAgICAgICAgIDQ5MTUsICAgICAgICAgIDQ5MzksICAgICAzNTM2LAotICAgIDc1NDEsICAgICAgICAgIDg3OCwgICAgICAgICAyMDcxNywgICAgICA4NTEsCi0gICAgNjkzOCwgICAgICAgICA0Mzk1LCAgICAgICAgIDE2Nzk5LCAgICAgNzczMywKLSAgICAxMDEzNywgICAgICAgICAxMDE5LCAgICAgICAgICA5ODQ1LCAgICAgIDk2NCwKLSAgICAxNTQ5NCwgICAgICAgICAzOTU1LCAgICAgICAgIDE1NDU5LCAgICAgMzQzMCwKLSAgICAxODg2MywgICAgICAgICAgOTgyLCAgICAgICAgIDIwMTIwLCAgICAgIDk2MywKLSAgICAxNjg3NiwgICAgICAgIDEyODg3LCAgICAgICAgIDE0MzM0LCAgICAgNDIwMCwKLSAgICA2NTk5LCAgICAgICAgIDEyMjAsICAgICAgICAgIDkyMjIsICAgICAgODE0LAotICAgIDE2OTQyLCAgICAgICAgIDUxMzQsICAgICAgICAgIDU2NjEsICAgICA0ODk4LAotICAgIDU0ODgsICAgICAgICAgMTc5OCwgICAgICAgICAyMDI1OCwgICAgIDM5NjIsCi0gICAgMTcwMDUsICAgICAgICAgNjE3OCwgICAgICAgICAxNzkyOSwgICAgIDU5MjksCi0gICAgOTM2NSwgICAgICAgICAzNDIwLCAgICAgICAgICA3NDc0LCAgICAgMTk3MSwKLSAgICAxOTUzNywgICAgICAgICA1MTc3LCAgICAgICAgIDE5MDAzLCAgICAgMzAwNiwKLSAgICAxNjQ1NCwgICAgICAgICAzNzg4LCAgICAgICAgIDE2MDcwLCAgICAgMjM2NywKLSAgICA4NjY0LCAgICAgICAgIDI3NDMsICAgICAgICAgIDk0NDUsICAgIDI2MzU4LAotICAgIDEwODU2LCAgICAgICAgIDEyODcsICAgICAgICAgIDM1NTUsICAgICAxMDA5LAotICAgIDU2MDYsICAgICAgICAgMzYyMiwgICAgICAgICAxOTQ1MywgICAgIDU1MTIsCi0gICAgMTI0NTMsICAgICAgICAgIDc5NywgICAgICAgICAyMDYzNCwgICAgICA5MTEsCi0gICAgMTU0MjcsICAgICAgICAgMzA2NiwgICAgICAgICAxNzAzNywgICAgMTAyNzUsCi0gICAgMTg4ODMsICAgICAgICAgMjYzMywgICAgICAgICAgMzkxMywgICAgIDEyNjgsCi0gICAgMTk1MTksICAgICAgICAgMzM3MSwgICAgICAgICAxODA1MiwgICAgIDUyMzAsCi0gICAgMTkyOTEsICAgICAgICAgMTY3OCwgICAgICAgICAxOTUwOCwgICAgIDMxNzIsCi0gICAgMTgwNzIsICAgICAgICAxMDc1NCwgICAgICAgICAxNjYyNSwgICAgIDY4NDUsCi0gICAgMzEzNCwgICAgICAgICAyMjk4LCAgICAgICAgIDEwODY5LCAgICAgMjQzNywKLSAgICAxNTU4MCwgICAgICAgICA2OTEzLCAgICAgICAgIDEyNTk3LCAgICAgMzM4MSwKLSAgICAxMTExNiwgICAgICAgICAzMjk3LCAgICAgICAgIDE2NzYyLCAgICAgMjQyNCwKLSAgICAxODg1MywgICAgICAgICA2NzE1LCAgICAgICAgIDE3MTcxLCAgICAgOTg4NywKLSAgICAxMjc0MywgICAgICAgICAyNjA1LCAgICAgICAgICA4OTM3LCAgICAgMzE0MCwKLSAgICAxOTAzMywgICAgICAgICA3NzY0LCAgICAgICAgIDE4MzQ3LCAgICAgMzg4MCwKLSAgICAyMDQ3NSwgICAgICAgICAzNjgyLCAgICAgICAgIDE5NjAyLCAgICAgMzM4MCwKLSAgICAxMzA0NCwgICAgICAgIDE5MzczLCAgICAgICAgIDEwNTI2LCAgICAyMzEyNAotfTsKLQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIE5BTUU6IE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBwID0gcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkgKGNvbnN0IFdvcmQxNikKLSAgICBnY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQotICAgIGV4cF9nY29kZTAgPSBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoV29yZDE2KQotICAgIGdhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCi0gICAgZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBnYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgotICAgIGdhaW5fY29kIHBvaW50cyB0byBDb2RlIGdhaW4KLSAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKLQotIFJldHVybnM6Ci0gICAgTm9uZS4KLQotIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKLSAgICBOb25lLgotCi0gTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKLSAgICBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBmaW5hbCBmaXhlZCBjb2RlYm9vayBnYWluIGFuZCB0aGUgcHJlZGljdG9yCi0gdXBkYXRlIHZhbHVlcywgYW5kIHVwZGF0ZXMgdGhlIGdhaW4gcHJlZGljdG9yLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIE5vbmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFRkVSRU5DRVMKLQotIHFnYWluNDc1LmMsIFVNVFMgR1NNIEFNUiBzcGVlY2ggY29kZWMsIFI5OSAtIFZlcnNpb24gMy4yLjAsIE1hcmNoIDIsIDIwMDEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUFNFVURPLUNPREUKLQotc3RhdGljIHZvaWQgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cygKLQotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLy8gaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QKLSAgICBjb25zdCBXb3JkMTYgKnAsICAgICAgIC8vIGkgIDogcG9pbnRlciB0byBzZWxlY3RlZCBxdWFudGl6ZXIgdGFibGUgZW50cnkKLSAgICBXb3JkMTYgZ2NvZGUwLCAgICAgICAgIC8vIGkgIDogcHJlZGljdGVkIENCIGdhaW4sICAgICBRKDE0IC0gZXhwX2djb2RlMCkKLSAgICBXb3JkMTYgZXhwX2djb2RlMCwgICAgIC8vIGkgIDogZXhwb25lbnQgb2YgcHJlZGljdGVkIENCIGdhaW4sICAgICAgICBRMAotICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLy8gbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNAotICAgIFdvcmQxNiAqZ2Fpbl9jb2QgICAgICAgLy8gbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExCi0pCi17Ci0KLSAgICBXb3JkMTYgZ19jb2RlLCBleHAsIGZyYWMsIHRtcDsKLSAgICBXb3JkMzIgTF90bXA7Ci0KLSAgICBXb3JkMTYgcXVhX2VuZXJfTVIxMjI7IC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgTVIxMjIgdmVyc2lvbiBRMTAKLSAgICBXb3JkMTYgcXVhX2VuZXI7ICAgICAgIC8vIG8gIDogcXVhbnRpemVkIGVuZXJneSBlcnJvciwgICAgICAgICAgICAgICBRMTAKLQotICAgIC8vIFJlYWQgdGhlIHF1YW50aXplZCBnYWlucwotICAgICpnYWluX3BpdCA9ICpwKys7Ci0gICAgZ19jb2RlID0gKnArKzsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgZmluYWwgZml4ZWQgY29kZWJvb2sgZ2FpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgZ2MgPSBnYzAgKiBnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBMX3RtcCA9IExfbXVsdChnX2NvZGUsIGdjb2RlMCk7Ci0gICAgTF90bXAgPSBMX3NocihMX3RtcCwgc3ViKDEwLCBleHBfZ2NvZGUwKSk7Ci0gICAgKmdhaW5fY29kID0gZXh0cmFjdF9oKExfdG1wKTsKLQotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBMb2cyIChMX2RlcG9zaXRfbCAoZ19jb2RlKSwgJmV4cCwgJmZyYWMpOyAvLyBMb2cyKHggUTEyKSA9IGxvZzIoeCkgKyAxMgotICAgIGV4cCA9IHN1YihleHAsIDEyKTsKLQotICAgIHRtcCA9IHNocl9yIChmcmFjLCA1KTsKLSAgICBxdWFfZW5lcl9NUjEyMiA9IGFkZCAodG1wLCBzaGwgKGV4cCwgMTApKTsKLQotICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjApOyAvLyAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikKLSAgICBxdWFfZW5lciA9IHB2X3JvdW5kIChMX3NobCAoTF90bXAsIDEzKSk7IC8vIFExMiAqIFEwID0gUTEzIC0+IFExMAotCi0gICAgZ2NfcHJlZF91cGRhdGUocHJlZF9zdCwgcXVhX2VuZXJfTVIxMjIsIHF1YV9lbmVyKTsKLX0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVTT1VSQ0VTIFVTRUQgW29wdGlvbmFsXQotCi0gV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gSEVBUCBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gU1RBQ0sgTUVNT1JZIFVTRUQ6IHggYnl0ZXMKLQotIENMT0NLIENZQ0xFUzogKGN5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIGZ1bmN0aW9uKSArICh2YXJpYWJsZQotICAgICAgICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICBjYWxsZWQpCi0gICAgIHdoZXJlOiAoY3ljbGUgY291bnQgdmFyaWFibGUpID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gQ0FVVElPTiBbb3B0aW9uYWxdCi0gW1N0YXRlIGFueSBzcGVjaWFsIG5vdGVzLCBjb25zdHJhaW50cyBvciBjYXV0aW9ucyBmb3IgdXNlcnMgb2YgdGhpcyBmdW5jdGlvbl0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi1zdGF0aWMgdm9pZCBNUjQ3NV9xdWFudF9zdG9yZV9yZXN1bHRzKAotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAgICAqLwotICAgIGNvbnN0IFdvcmQxNiAqcCwgICAgICAgLyogaSAgOiBwb2ludGVyIHRvIHNlbGVjdGVkIHF1YW50aXplciB0YWJsZSBlbnRyeSAqLwotICAgIFdvcmQxNiBnY29kZTAsICAgICAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgIFEoMTQgLSBleHBfZ2NvZGUwKSAqLwotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBleHBvbmVudCBvZiBwcmVkaWN0ZWQgQ0IgZ2FpbiwgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiAqZ2Fpbl9waXQsICAgICAgLyogbyAgOiBQaXRjaCBnYWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFExNCAqLwotICAgIFdvcmQxNiAqZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAqLwotKQotewotICAgIFdvcmQxNiBnX2NvZGU7Ci0gICAgV29yZDE2IGV4cDsKLSAgICBXb3JkMTYgZnJhYzsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQzMiBMX3RtcDsKLQotICAgIFdvcmQxNiBxdWFfZW5lcl9NUjEyMjsgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCBNUjEyMiB2ZXJzaW9uIFExMCAqLwotICAgIFdvcmQxNiBxdWFfZW5lcjsgICAgICAgLyogbyAgOiBxdWFudGl6ZWQgZW5lcmd5IGVycm9yLCAgICAgICAgICAgICAgIFExMCAqLwotCi0KLSAgICAvKiBSZWFkIHRoZSBxdWFudGl6ZWQgZ2FpbnMgKi8KLSAgICAqZ2Fpbl9waXQgPSAqcCsrOwotICAgIGdfY29kZSA9ICpwKys7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgY2FsY3VsYXRlIGZpbmFsIGZpeGVkIGNvZGVib29rIGdhaW46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgIGdjID0gZ2MwICogZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBMX3RtcCA9ICgoV29yZDMyKSBnX2NvZGUgKiBnY29kZTApIDw8IDE7Ci0gICAgdG1wICAgPSAxMCAtIGV4cF9nY29kZTA7Ci0gICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wLCBwT3ZlcmZsb3cpOwotICAgICpnYWluX2NvZCA9IChXb3JkMTYpKExfdG1wID4+IDE2KTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBjYWxjdWxhdGUgcHJlZGljdG9yIHVwZGF0ZSB2YWx1ZXMgYW5kIHVwZGF0ZSBnYWluIHByZWRpY3RvcjogICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSBsb2cyKGcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSAyMCpsb2cxMChnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIExvZzIoeCBRMTIpID0gbG9nMih4KSArIDEyICovCi0gICAgTG9nMigoV29yZDMyKSBnX2NvZGUsICZleHAsICZmcmFjLCBwT3ZlcmZsb3cpOwotICAgIGV4cCAtPSAxMjsKLQotICAgIHRtcCA9IHNocl9yKGZyYWMsIDUsIHBPdmVyZmxvdyk7Ci0gICAgcXVhX2VuZXJfTVIxMjIgPSBleHAgPDwgMTA7Ci0gICAgcXVhX2VuZXJfTVIxMjIgPSB0bXAgKyBxdWFfZW5lcl9NUjEyMjsKLQotICAgIC8qIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKSAqLwotICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7Ci0gICAgTF90bXAgPSBMX3RtcCA8PCAxMzsKLQotICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFExMCAqLwotICAgIHF1YV9lbmVyID0gKFdvcmQxNikoKExfdG1wICsgKFdvcmQzMikgMHgwMDAwODAwMEwpID4+IDE2KTsKLQotICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBOQU1FOiBNUjQ3NV91cGRhdGVfdW5xX3ByZWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBleHBfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGV4cG9uZW50IE1TVykgKFdvcmQxNikKLSAgICBmcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpIChXb3JkMTYpCi0gICAgY29kX2dhaW5fZXhwID0gb3B0aW11bSBjb2RlYm9vayBnYWluIChleHBvbmVudCkoV29yZDE2KQotICAgIGNvZF9nYWluX2ZyYWMgPSBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBwT3ZlcmZsb3cgcG9pbnRzIHRvIG92ZXJmbG93IGluZGljYXRvciAoRmxhZykKLQotIFJldHVybnM6Ci0gICAgTm9uZS4KLQotIEdsb2JhbCBWYXJpYWJsZXMgVXNlZDoKLSAgICBOb25lLgotCi0gTG9jYWwgVmFyaWFibGVzIE5lZWRlZDoKLSAgICBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBtb2R1bGUgdXNlcyB0aGUgb3B0aW11bSBjb2RlYm9vayBnYWluIGFuZCB1cGRhdGVzIHRoZSAidW5xdWFudGl6ZWQiCi0gZ2FpbiBwcmVkaWN0b3Igd2l0aCB0aGUgKGJvdW5kZWQpIHByZWRpY3Rpb24gZXJyb3IuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi12b2lkCi1NUjQ3NV91cGRhdGVfdW5xX3ByZWQoCi0gICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwCi0gICAgV29yZDE2IGZyYWNfZ2NvZGUwLCAgICAvLyBpICA6IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCBMU1cpLCAgUTE1Ci0gICAgV29yZDE2IGNvZF9nYWluX2V4cCwgICAvLyBpICA6IG9wdGltdW0gY29kZWJvb2sgZ2FpbiAoZXhwb25lbnQpLCAgUTAKLSAgICBXb3JkMTYgY29kX2dhaW5fZnJhYyAgIC8vIGkgIDogb3B0aW11bSBjb2RlYm9vayBnYWluIChmcmFjdGlvbiksICBRMTUKLSkKLXsKLSAgICBXb3JkMTYgdG1wLCBleHAsIGZyYWM7Ci0gICAgV29yZDE2IHF1YV9lbmVyLCBxdWFfZW5lcl9NUjEyMjsKLSAgICBXb3JkMzIgTF90bXA7Ci0KLSAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciBmYWN0b3IgKGdpdmVuIG9wdGltdW0gQ0IgZ2FpbiBnY3UpOgotICAgIC8vICAgcHJlZEVyckZhY3QgPSBnY3UgLyBnY29kZTAKLSAgICAvLyAgIChsaW1pdCB0byBNSU5fUFJFRF9FUlJfRkFDVCA8PSBwcmVkRXJyRmFjdCA8PSBNQVhfUFJFRF9FUlJfRkFDVAotICAgIC8vICAgIC0+IGxpbWl0IHF1YV9lbmVyKikKLSAgICAvLwotICAgIC8vIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIChsb2cpOgotICAgIC8vCi0gICAgLy8gICBxdWFfZW5lcl9NUjEyMiA9IGxvZzIocHJlZEVyckZhY3QpCi0gICAgLy8gICBxdWFfZW5lciAgICAgICA9IDIwKmxvZzEwKHByZWRFcnJGYWN0KQotCi0gICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKLSAgICB7Ci0gICAgICAgIC8vIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUCi0gICAgICAgIC8vIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5Ci0gICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOwotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLy8gY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0Ci0gICAgICAgIC8vIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcKLSAgICAgICAgLy8gTm90ZTogZXhwb25lbnQgY29ycmVjdGlvbiAoZXhwPWV4cC0xNCkgaXMgZG9uZSBhZnRlciBkaXZfcwotICAgICAgICBmcmFjX2djb2RlMCA9IGV4dHJhY3RfbCAoUG93MiAoMTQsIGZyYWNfZ2NvZGUwKSk7Ci0KLSAgICAgICAgLy8gbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zCi0gICAgICAgIGlmIChzdWIoY29kX2dhaW5fZnJhYywgZnJhY19nY29kZTApID49IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZF9nYWluX2ZyYWMgPSBzaHIgKGNvZF9nYWluX2ZyYWMsIDEpOwotICAgICAgICAgICAgY29kX2dhaW5fZXhwID0gYWRkIChjb2RfZ2Fpbl9leHAsIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcHJlZEVyckZhY3QKLSAgICAgICAgLy8gICA9IGdjdSAvIGdjb2RlMAotICAgICAgICAvLyAgID0gY29kX2dhaW5fZnJhYy9mcmFjX2djb2RlMCAqIDJeKGNvZF9nYWluX2V4cC0oZXhwX2djb2RlMC0xNCkpCi0gICAgICAgIC8vICAgPSBkaXZfcyAoY19nX2YsIGZyYWNfZ2NvZGUwKSoyXi0xNSAqIDJeKGNfZ19lLWV4cF9nY29kZTArMTQpCi0gICAgICAgIC8vICAgPSBkaXZfcyAqIDJeKGNvZF9nYWluX2V4cC1leHBfZ2NvZGUwIC0gMSkKLQotICAgICAgICBmcmFjID0gZGl2X3MgKGNvZF9nYWluX2ZyYWMsIGZyYWNfZ2NvZGUwKTsKLSAgICAgICAgdG1wID0gc3ViIChzdWIgKGNvZF9nYWluX2V4cCwgZXhwX2djb2RlMCksIDEpOwotCi0gICAgICAgIExvZzIgKExfZGVwb3NpdF9sIChmcmFjKSwgJmV4cCwgJmZyYWMpOwotICAgICAgICBleHAgPSBhZGQgKGV4cCwgdG1wKTsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nMiwgUTEwKQotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IHNocl9yIChmcmFjLCA1KTsKLSAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBhZGQgKHF1YV9lbmVyX01SMTIyLCBzaGwgKGV4cCwgMTApKTsKLQotICAgICAgICBpZiAoc3ViKHF1YV9lbmVyX01SMTIyLCBNSU5fUVVBX0VORVJfTVIxMjIpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgcXVhX2VuZXIgPSBNSU5fUVVBX0VORVI7Ci0gICAgICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdWIocXVhX2VuZXJfTVIxMjIsIE1BWF9RVUFfRU5FUl9NUjEyMikgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBxdWFfZW5lciA9IE1BWF9RVUFfRU5FUjsKLSAgICAgICAgICAgIHF1YV9lbmVyX01SMTIyID0gTUFYX1FVQV9FTkVSX01SMTIyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKDIwKmxvZzEwLCBRMTApCi0gICAgICAgICAgICBMX3RtcCA9IE1weV8zMl8xNihleHAsIGZyYWMsIDI0NjYwKTsKLSAgICAgICAgICAgIC8vIDI0NjYwIFExMiB+PSA2LjAyMDYgPSAyMCpsb2cxMCgyKQotICAgICAgICAgICAgcXVhX2VuZXIgPSBwdl9yb3VuZCAoTF9zaGwgKExfdG1wLCAxMykpOwotICAgICAgICAgICAgLy8gUTEyICogUTAgPSBRMTMgLT4gUTI2IC0+IFExMAotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcnkKLSAgICBnY19wcmVkX3VwZGF0ZShwcmVkX3N0LCBxdWFfZW5lcl9NUjEyMiwgcXVhX2VuZXIpOwotfQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCi0KLSBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCi0KLSBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICAgICAgIGNhbGxlZCkKLSAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDQVVUSU9OIFtvcHRpb25hbF0KLSBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLXZvaWQgTVI0NzVfdXBkYXRlX3VucV9wcmVkKAotICAgIGdjX3ByZWRTdGF0ZSAqcHJlZF9zdCwgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLwotICAgIFdvcmQxNiBleHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTVNXKSwgIFEwICAqLwotICAgIFdvcmQxNiBmcmFjX2djb2RlMCwgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQgTFNXKSwgIFExNSAqLwotICAgIFdvcmQxNiBjb2RfZ2Fpbl9leHAsICAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGV4cG9uZW50KSwgIFEwICAqLwotICAgIFdvcmQxNiBjb2RfZ2Fpbl9mcmFjLCAgLyogaSAgOiBvcHRpbXVtIGNvZGVib29rIGdhaW4gKGZyYWN0aW9uKSwgIFExNSAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgLyogbyAgOiBvdmVyZmxvdyBpbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAqLwotKQotewotICAgIFdvcmQxNiB0bXA7Ci0gICAgV29yZDE2IGV4cDsKLSAgICBXb3JkMTYgZnJhYzsKLSAgICBXb3JkMTYgcXVhX2VuZXI7Ci0gICAgV29yZDE2IHF1YV9lbmVyX01SMTIyOwotICAgIFdvcmQzMiBMX3RtcDsKLQotICAgIC8qIGNhbGN1bGF0ZSBwcmVkaWN0aW9uIGVycm9yIGZhY3RvciAoZ2l2ZW4gb3B0aW11bSBDQiBnYWluIGdjdSk6Ci0gICAgICoKLSAgICAgKiAgIHByZWRFcnJGYWN0ID0gZ2N1IC8gZ2NvZGUwCi0gICAgICogICAobGltaXQgdG8gTUlOX1BSRURfRVJSX0ZBQ1QgPD0gcHJlZEVyckZhY3QgPD0gTUFYX1BSRURfRVJSX0ZBQ1QKLSAgICAgKiAgICAtPiBsaW1pdCBxdWFfZW5lciopCi0gICAgICoKLSAgICAgKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAobG9nKToKLSAgICAgKgotICAgICAqICAgcXVhX2VuZXJfTVIxMjIgPSBsb2cyKHByZWRFcnJGYWN0KQotICAgICAqICAgcXVhX2VuZXIgICAgICAgPSAyMCpsb2cxMChwcmVkRXJyRmFjdCkKLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKGNvZF9nYWluX2ZyYWMgPD0gMCkKLSAgICB7Ci0gICAgICAgIC8qIGlmIGdjdSA8PSAwIC0+IHByZWRFcnJGYWN0ID0gMCA8IE1JTl9QUkVEX0VSUl9GQUNUICovCi0gICAgICAgIC8qIC0+IHNldCBxdWFfZW5lcihfTVIxMjIpIGRpcmVjdGx5ICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHF1YV9lbmVyID0gTUlOX1FVQV9FTkVSOwotICAgICAgICBxdWFfZW5lcl9NUjEyMiA9IE1JTl9RVUFfRU5FUl9NUjEyMjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29udmVydCBnY29kZTAgZnJvbSBEUEYgdG8gc3RhbmRhcmQgZnJhY3Rpb24vZXhwb25lbnQgZm9ybWF0ICovCi0gICAgICAgIC8qIHdpdGggbm9ybWFsaXplZCBmcmFjLCBpLmUuIDE2Mzg0IDw9IGZyYWMgPD0gMzI3NjcgICAgICAgICAgICAqLwotICAgICAgICAvKiBOb3RlOiBleHBvbmVudCBjb3JyZWN0aW9uIChleHA9ZXhwLTE0KSBpcyBkb25lIGFmdGVyIGRpdl9zICAgKi8KLSAgICAgICAgZnJhY19nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBmcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7Ci0KLSAgICAgICAgLyogbWFrZSBzdXJlIGNvZF9nYWluX2ZyYWMgPCBmcmFjX2djb2RlMCAgZm9yIGRpdl9zICovCi0gICAgICAgIGlmIChjb2RfZ2Fpbl9mcmFjID49IGZyYWNfZ2NvZGUwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RfZ2Fpbl9mcmFjID4+PSAxOwotICAgICAgICAgICAgY29kX2dhaW5fZXhwICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgIHByZWRFcnJGYWN0Ci0gICAgICAgICAgICAgPSBnY3UgLyBnY29kZTAKLSAgICAgICAgICAgICA9IGNvZF9nYWluX2ZyYWMvZnJhY19nY29kZTAgKiAyXihjb2RfZ2Fpbl9leHAtKGV4cF9nY29kZTAtMTQpKQotICAgICAgICAgICAgID0gZGl2X3MgKGNfZ19mLCBmcmFjX2djb2RlMCkqMl4tMTUgKiAyXihjX2dfZS1leHBfZ2NvZGUwKzE0KQotICAgICAgICAgICAgID0gZGl2X3MgKiAyXihjb2RfZ2Fpbl9leHAtZXhwX2djb2RlMCAtIDEpCi0gICAgICAgICovCi0gICAgICAgIGZyYWMgPSBkaXZfcyhjb2RfZ2Fpbl9mcmFjLCBmcmFjX2djb2RlMCk7Ci0gICAgICAgIHRtcCA9IGNvZF9nYWluX2V4cCAtIGV4cF9nY29kZTA7Ci0gICAgICAgIHRtcCAtPSAxOwotCi0gICAgICAgIExvZzIoKFdvcmQzMikgZnJhYywgJmV4cCwgJmZyYWMsIHBPdmVyZmxvdyk7Ci0gICAgICAgIGV4cCArPSB0bXA7Ci0KLSAgICAgICAgLyogY2FsY3VsYXRlIHByZWRpY3Rpb24gZXJyb3IgKGxvZzIsIFExMCkgKi8KLSAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBzaHJfcihmcmFjLCA1LCBwT3ZlcmZsb3cpOwotICAgICAgICB0bXAgPSBleHAgPDwgMTA7Ci0gICAgICAgIHF1YV9lbmVyX01SMTIyICs9IHRtcDsKLQotICAgICAgICBpZiAocXVhX2VuZXJfTVIxMjIgPiBNQVhfUVVBX0VORVJfTVIxMjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHF1YV9lbmVyID0gTUFYX1FVQV9FTkVSOwotICAgICAgICAgICAgcXVhX2VuZXJfTVIxMjIgPSBNQVhfUVVBX0VORVJfTVIxMjI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBjYWxjdWxhdGUgcHJlZGljdGlvbiBlcnJvciAoMjAqbG9nMTAsIFExMCkgKi8KLSAgICAgICAgICAgIExfdG1wID0gTXB5XzMyXzE2KGV4cCwgZnJhYywgMjQ2NjAsIHBPdmVyZmxvdyk7Ci0gICAgICAgICAgICAvKiAyNDY2MCBRMTIgfj0gNi4wMjA2ID0gMjAqbG9nMTAoMikgKi8KLSAgICAgICAgICAgIExfdG1wID0gIExfc2hsKExfdG1wLCAxMywgcE92ZXJmbG93KTsKLSAgICAgICAgICAgIHF1YV9lbmVyID0gcHZfcm91bmQoTF90bXAsIHBPdmVyZmxvdyk7Ci0KLSAgICAgICAgICAgIC8qIFExMiAqIFEwID0gUTEzIC0+IFEyNiAtPiBRMTAgICAgICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiB1cGRhdGUgTUEgcHJlZGljdG9yIG1lbW9yeSAqLwotICAgIGdjX3ByZWRfdXBkYXRlKHByZWRfc3QsIHF1YV9lbmVyX01SMTIyLCBxdWFfZW5lcik7Ci0KLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIE5BTUU6IE1SNDc1X2dhaW5fcXVhbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBwcmVkX3N0ID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBzZjBfZXhwX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChleHBvbmVudCkgKFdvcmQxNikKLSAgICBmMF9mcmFjX2djb2RlMCA9IHByZWRpY3RlZCBDQiBnYWluIChmcmFjdGlvbikgKFdvcmQxNikKLSAgICBzZjBfZXhwX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZXhwb25lbnQgcGFydCkgKFdvcmQxNikKLSAgICBzZjBfZnJhY19jb2VmZiA9IGVuZXJneSBjb2VmZi4gKChmcmFjdGlvbiBwYXJ0KSAoV29yZDE2KQotICAgIHNmMF9leHBfdGFyZ2V0X2VuID0gZXhwb25lbnQgb2YgdGFyZ2V0IGVuZXJneSAoV29yZDE2KQotICAgIHNmMF9mcmFjX3RhcmdldF9lbiA9IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKLSAgICBzZjFfY29kZV9ub3NoYXJwID0gaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgIChXb3JkMTYpCi0gICAgc2YxX2V4cF9nY29kZTAgPSBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpIChXb3JkMTYpCi0gICAgc2YxX2ZyYWNfZ2NvZGUwID0gcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSAoV29yZDE2KQotICAgIHNmMV9leHBfY29lZmYgPSBlbmVyZ3kgY29lZmYuIChleHBvbmVudCBwYXJ0KSAoV29yZDE2KQotICAgIHNmMV9mcmFjX2NvZWZmID0gZW5lcmd5IGNvZWZmLiAoZnJhY3Rpb24gcGFydCkgKFdvcmQxNikKLSAgICBzZjFfZXhwX3RhcmdldF9lbiA9IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3kgKFdvcmQxNikKLSAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBmcmFjdGlvbiBvZiB0YXJnZXQgZW5lcmd5IChXb3JkMTYpCi0gICAgZ3BfbGltaXQgPSBwaXRjaCBnYWluIGxpbWl0IChXb3JkMTYpCi0gICAgc2YwX2dhaW5fcGl0ID0gcG9pbnRlciB0byBQaXRjaCBnYWluIChXb3JkMTYpCi0gICAgc2YwX2dhaW5fY29kID0gcG9pbnRlciB0byBDb2RlIGdhaW4gKFdvcmQxNikKLSAgICBzZjFfZ2Fpbl9waXQgPSBwb2ludGVyIHRvIFBpdGNoIGdhaW4gKFdvcmQxNikKLSAgICBzZjFfZ2Fpbl9jb2QgPSBwb2ludGVyIHRvIENvZGUgZ2FpbiAoV29yZDE2KQotCi0gT3V0cHV0czoKLSAgICBwcmVkX3N0IHBvaW50cyB0byB0aGUgdXBkYXRlZCBzdHJ1Y3R1cmUgb2YgdHlwZSBnY19wcmVkU3RhdGUKLSAgICBzZjBfZ2Fpbl9waXQgcG9pbnRzIHRvIFBpdGNoIGdhaW4KLSAgICBzZjBfZ2Fpbl9jb2QgcG9pbnRzIHRvIENvZGUgZ2FpbgotICAgIHNmMV9nYWluX3BpdCBwb2ludHMgdG8gUGl0Y2ggZ2FpbgotICAgIHNmMV9nYWluX2NvZCBwb2ludHMgdG8gQ29kZSBnYWluCi0KLSBSZXR1cm5zOgotICAgIGluZGV4ID0gaW5kZXggb2YgcXVhbnRpemF0aW9uCi0KLSBHbG9iYWwgVmFyaWFibGVzIFVzZWQ6Ci0gICAgTm9uZS4KLQotIExvY2FsIFZhcmlhYmxlcyBOZWVkZWQ6Ci0gICAgTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHF1YW50aXphdGlvbiBvZiBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgZm9yIHR3bwotIHN1YmZyYW1lcyB1c2luZyB0aGUgcHJlZGljdGVkIGNvZGVib29rIGdhaW4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0gTm9uZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gcWdhaW40NzUuYywgVU1UUyBHU00gQU1SIHNwZWVjaCBjb2RlYywgUjk5IC0gVmVyc2lvbiAzLjIuMCwgTWFyY2ggMiwgMjAwMQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi1Xb3JkMTYKLU1SNDc1X2dhaW5fcXVhbnQoICAgICAgICAgICAgICAvLyBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4KLSAgICBnY19wcmVkU3RhdGUgKnByZWRfc3QsICAgICAvLyBpL286IGdhaW4gcHJlZGljdG9yIHN0YXRlIHN0cnVjdAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpCi0gICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCi0gICAgV29yZDE2IHNmMF9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQotICAgIFdvcmQxNiBzZjBfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAotICAgIFdvcmQxNiBzZjBfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKLSAgICBXb3JkMTYgc2YwX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKLSAgICBXb3JkMTYgc2YwX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGZyb20gc3ViZnJhbWUgMSAob3IgMykKLSAgICBXb3JkMTYgc2YxX2NvZGVfbm9zaGFycFtdLCAvLyBpICA6IGlubm92YXRpdmUgY29kZWJvb2sgdmVjdG9yIChMX1NVQkZSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgKHdoaXRob3V0IHBpdGNoIHNoYXJwZW5pbmcpCi0gICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwCi0gICAgV29yZDE2IHNmMV9mcmFjX2djb2RlMCwgICAgLy8gaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZnJhY3Rpb24pLCAgICAgIFExNQotICAgIFdvcmQxNiBzZjFfZXhwX2NvZWZmW10sICAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGV4cG9uZW50IHBhcnQsICBRMAotICAgIFdvcmQxNiBzZjFfZnJhY19jb2VmZltdLCAgIC8vIGkgIDogZW5lcmd5IGNvZWZmLiAoNSksIGZyYWN0aW9uIHBhcnQsICBRMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIChmcmFjX2NvZWZmIGFuZCBleHBfY29lZmYgY29tcHV0ZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkKLSAgICBXb3JkMTYgc2YxX2V4cF90YXJnZXRfZW4sICAvLyBpICA6IGV4cG9uZW50IG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTAKLSAgICBXb3JkMTYgc2YxX2ZyYWNfdGFyZ2V0X2VuLCAvLyBpICA6IGZyYWN0aW9uIG9mIHRhcmdldCBlbmVyZ3ksICAgICAgICAgUTE1Ci0KLSAgICBXb3JkMTYgZ3BfbGltaXQsICAgICAgICAgICAvLyBpICA6IHBpdGNoIGdhaW4gbGltaXQKLQotICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKLSAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKLQotICAgIFdvcmQxNiAqc2YxX2dhaW5fcGl0LCAgICAgIC8vIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQKLSAgICBXb3JkMTYgKnNmMV9nYWluX2NvZCAgICAgICAvLyBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEKLSkKLXsKLSAgICBjb25zdCBXb3JkMTYgKnA7Ci0gICAgV29yZDE2IGksIGluZGV4ID0gMDsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQxNiBleHA7Ci0gICAgV29yZDE2IHNmMF9nY29kZTAsIHNmMV9nY29kZTA7Ci0gICAgV29yZDE2IGdfcGl0Y2gsIGcyX3BpdGNoLCBnX2NvZGUsIGcyX2NvZGUsIGdfcGl0X2NvZDsKLSAgICBXb3JkMTYgY29lZmZbMTBdLCBjb2VmZl9sb1sxMF0sIGV4cF9tYXhbMTBdOyAgLy8gMC4uNDogc2YwOyA1Li45OiBzZjEKLSAgICBXb3JkMzIgTF90bXAsIGRpc3RfbWluOwotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotCi0gICAgc2YwX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjBfZnJhY19nY29kZTApKTsKLSAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOwotCi0gICAgICogRm9yIGVhY2ggc3ViZnJhbWUsIHRoZSBlcnJvciBlbmVyZ3kgKHN1bSkgdG8gYmUgbWluaW1pemVkIGNvbnNpc3RzCi0gICAgICogb2YgZml2ZSB0ZXJtcywgdFswLi40XS4KLSAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMF0gPSAgICBncF4yICAqIDx5MSB5MT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzFdID0gLTIqZ3AgICAgKiA8eG4geTE+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFsyXSA9ICAgIGdjXjIgICogPHkyIHkyPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbM10gPSAtMipnYyAgICAqIDx4biB5Mj4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzRdID0gIDIqZ3AqZ2MgKiA8eTEgeTI+Ci0gICAgICoKLQotICAgIC8vIHNmIDAKLSAgICAvLyBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgZXhwb25lbnQgZm9yIGdfY29kZTogZWMgPSBlYzAgLSAxMQotICAgIGV4cCA9IHN1YihzZjBfZXhwX2djb2RlMCwgMTEpOwotCi0gICAgLy8gY2FsY3VsYXRlIGV4cF9tYXhbaV0gPSBzW2ldLTEKLSAgICBleHBfbWF4WzBdID0gc3ViKHNmMF9leHBfY29lZmZbMF0sIDEzKTsKLSAgICBleHBfbWF4WzFdID0gc3ViKHNmMF9leHBfY29lZmZbMV0sIDE0KTsKLSAgICBleHBfbWF4WzJdID0gYWRkKHNmMF9leHBfY29lZmZbMl0sIGFkZCgxNSwgc2hsKGV4cCwgMSkpKTsKLSAgICBleHBfbWF4WzNdID0gYWRkKHNmMF9leHBfY29lZmZbM10sIGV4cCk7Ci0gICAgZXhwX21heFs0XSA9IGFkZChzZjBfZXhwX2NvZWZmWzRdLCBhZGQoMSwgZXhwKSk7Ci0KLSAgICAvLyBzZiAxCi0gICAgLy8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nIGV4cG9uZW50IGZvciBnX2NvZGU6IGVjID0gZWMwIC0gMTEKLSAgICBleHAgPSBzdWIoc2YxX2V4cF9nY29kZTAsIDExKTsKLQotICAgIC8vIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xCi0gICAgZXhwX21heFs1XSA9IHN1YihzZjFfZXhwX2NvZWZmWzBdLCAxMyk7Ci0gICAgZXhwX21heFs2XSA9IHN1YihzZjFfZXhwX2NvZWZmWzFdLCAxNCk7Ci0gICAgZXhwX21heFs3XSA9IGFkZChzZjFfZXhwX2NvZWZmWzJdLCBhZGQoMTUsIHNobChleHAsIDEpKSk7Ci0gICAgZXhwX21heFs4XSA9IGFkZChzZjFfZXhwX2NvZWZmWzNdLCBleHApOwotICAgIGV4cF9tYXhbOV0gPSBhZGQoc2YxX2V4cF9jb2VmZls0XSwgYWRkKDEsIGV4cCkpOwotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgotICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0KLSAgICAvLyBtYWtlIHRoZSB0YXJnZXQgZW5lcmd5IGV4cG9uZW50cyB0aGUgc2FtZSBieSBkZS1ub3JtYWxpemluZyB0aGUKLSAgICAvLyBmcmFjdGlvbiBvZiB0aGUgc21hbGxlciBvbmUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJlIGFibGUgdG8gY29tcGFyZQotICAgIC8vIHRoZW0KLQotICAgIGV4cCA9IHNmMF9leHBfdGFyZ2V0X2VuIC0gc2YxX2V4cF90YXJnZXRfZW47Ci0gICAgaWYgKGV4cCA+IDApCi0gICAgewotICAgICAgICBzZjFfZnJhY190YXJnZXRfZW4gPSBzaHIgKHNmMV9mcmFjX3RhcmdldF9lbiwgZXhwKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2YwX2ZyYWNfdGFyZ2V0X2VuID0gc2hsIChzZjBfZnJhY190YXJnZXRfZW4sIGV4cCk7Ci0gICAgfQotCi0gICAgLy8gYXNzdW1lIG5vIGNoYW5nZSBvZiBleHBvbmVudHMKLSAgICBleHAgPSAwOwotCi0gICAgLy8gdGVzdCBmb3IgdGFyZ2V0IGVuZXJneSBkaWZmZXJlbmNlOyBzZXQgZXhwIHRvICsxIG9yIC0xIHRvIHNjYWxlCi0gICAgLy8gdXAvZG93biBjb2VmZmljaWVudHMgZm9yIHNmIDEKLQotICAgIHRtcCA9IHNocl9yIChzZjFfZnJhY190YXJnZXRfZW4sIDEpOyAgIC8vIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpCi0gICAgaWYgKHN1YiAodG1wLCBzZjBfZnJhY190YXJnZXRfZW4pID4gMCkgLy8gdG1wID4gZW4oc2YwKT8KLSAgICB7Ci0gICAgICAgIC8vIHRhcmdldF9lbmVyZ3koc2YxKSA+IDIqdGFyZ2V0X2VuZXJneShzZjApCi0gICAgICAgIC8vICAgLT4gc2NhbGUgdXAgTVNFKHNmMCkgYnkgMiBieSBhZGRpbmcgMSB0byBleHBvbmVudHMgMC4uNAotICAgICAgICBleHAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSBzaHIgKGFkZCAoc2YwX2ZyYWNfdGFyZ2V0X2VuLCAzKSwgMik7IC8vIHRtcD1jZWlsKDAuMjUqZW4oc2YwKSkKLSAgICAgICAgaWYgKHN1YiAodG1wLCBzZjFfZnJhY190YXJnZXRfZW4pID4gMCkgICAgICAvLyB0bXAgPiBlbihzZjEpPwotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0YXJnZXRfZW5lcmd5KHNmMSkgPCAwLjI1KnRhcmdldF9lbmVyZ3koc2YwKQotICAgICAgICAgICAgLy8gICAtPiBzY2FsZSBkb3duIE1TRShzZjApIGJ5IDAuNSBieSBzdWJ0cmFjdGluZyAxIGZyb20KLSAgICAgICAgICAgIC8vICAgICAgY29lZmZpY2llbnRzIDAuLjQKLSAgICAgICAgICAgIGV4cCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGV4cF9tYXhbaV0gPSBhZGQgKGV4cF9tYXhbaV0sIGV4cCk7Ci0gICAgfQotCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBGaW5kIG1heGltdW0gZXhwb25lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICBGb3IgdGhlIHN1bSBvcGVyYXRpb24sIGFsbCB0ZXJtcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2NhbGluZzsgICAgICoKLSAgICAgKiAgdGhhdCBzY2FsaW5nIHNob3VsZCBiZSBsb3cgZW5vdWdoIHRvIHByZXZlbnQgb3ZlcmZsb3cuIFRoZXJlLSAgICAqCi0gICAgICogIGZvcmUsIHRoZSBtYXhpbXVtIHNjYWxlIGlzIGRldGVybWluZWQgYW5kIGFsbCBjb2VmZmljaWVudHMgYXJlICAgKgotICAgICAqICByZS1zY2FsZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgZXhwID0gbWF4KGV4cF9tYXhbaV0pICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgIGUgPSBleHBfbWF4W2ldLWV4cDsgICAgICAgICBlIDw9IDAhICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICBjW2ldID0gY1tpXSoyXmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotCi0gICAgZXhwID0gZXhwX21heFswXTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChzdWIoZXhwX21heFtpXSwgZXhwKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cCA9IGV4cF9tYXhbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZXhwID0gYWRkKGV4cCwgMSk7ICAgICAgLy8gVG8gYXZvaWQgb3ZlcmZsb3cKLQotICAgIHAgPSAmc2YwX2ZyYWNfY29lZmZbMF07Ci0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICB0bXAgPSBzdWIoZXhwLCBleHBfbWF4W2ldKTsKLSAgICAgICAgTF90bXAgPSBMX2RlcG9zaXRfaCgqcCsrKTsKLSAgICAgICAgTF90bXAgPSBMX3NocihMX3RtcCwgdG1wKTsKLSAgICAgICAgTF9FeHRyYWN0KExfdG1wLCAmY29lZmZbaV0sICZjb2VmZl9sb1tpXSk7Ci0gICAgfQotICAgIHAgPSAmc2YxX2ZyYWNfY29lZmZbMF07Ci0gICAgZm9yICg7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIHRtcCA9IHN1YihleHAsIGV4cF9tYXhbaV0pOwotICAgICAgICBMX3RtcCA9IExfZGVwb3NpdF9oKCpwKyspOwotICAgICAgICBMX3RtcCA9IExfc2hyKExfdG1wLCB0bXApOwotICAgICAgICBMX0V4dHJhY3QoTF90bXAsICZjb2VmZltpXSwgJmNvZWZmX2xvW2ldKTsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogIENvZGVib29rIHNlYXJjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIEZvciBlYWNoIHBhaXIgKGdfcGl0Y2gsIGdfZmFjKSBpbiB0aGUgdGFibGUgY2FsY3VsYXRlIHRoZSAgICAgICAgKgotICAgICAqICB0ZXJtcyB0WzAuLjRdIGFuZCBzdW0gdGhlbSB1cDsgdGhlIHJlc3VsdCBpcyB0aGUgbWVhbiBzcXVhcmVkICAgICoKLSAgICAgKiAgZXJyb3IgZm9yIHRoZSBxdWFudGl6ZWQgZ2FpbnMgZnJvbSB0aGUgdGFibGUuIFRoZSBpbmRleCBmb3IgdGhlICAqCi0gICAgICogIG1pbmltdW0gTVNFIGlzIHN0b3JlZCBhbmQgZmluYWxseSB1c2VkIHRvIHJldHJpZXZlIHRoZSBxdWFudGl6ZWQgKgotICAgICAqICBnYWlucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHN0YXJ0IHdpdGggImluZmluaXRlIiBNU0UKLSAgICBkaXN0X21pbiA9IE1BWF8zMjsKLQotICAgIHAgPSAmdGFibGVfZ2Fpbl9NUjQ3NVswXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNUjQ3NV9WUV9TSVpFOyBpKyspCi0gICAgewotICAgICAgICAvLyBzdWJmcmFtZSAwIChhbmQgMikgY2FsY3VsYXRpb25zCi0gICAgICAgIGdfcGl0Y2ggPSAqcCsrOwotICAgICAgICBnX2NvZGUgPSAqcCsrOwotCi0gICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjBfZ2NvZGUwKTsKLSAgICAgICAgZzJfcGl0Y2ggPSBtdWx0KGdfcGl0Y2gsIGdfcGl0Y2gpOwotICAgICAgICBnMl9jb2RlID0gbXVsdChnX2NvZGUsIGdfY29kZSk7Ci0gICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKLQotICAgICAgICBMX3RtcCA9IE1weV8zMl8xNiggICAgICAgY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCk7Ci0gICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZlsxXSwgY29lZmZfbG9bMV0sIGdfcGl0Y2gpOwotICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbMl0sIGNvZWZmX2xvWzJdLCBnMl9jb2RlKTsKLSAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlKTsKLSAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzRdLCBjb2VmZl9sb1s0XSwgZ19waXRfY29kKTsKLQotICAgICAgICB0bXAgPSBzdWIgKGdfcGl0Y2gsIGdwX2xpbWl0KTsKLQotICAgICAgICAvLyBzdWJmcmFtZSAxIChhbmQgMykgY2FsY3VsYXRpb25zCi0gICAgICAgIGdfcGl0Y2ggPSAqcCsrOwotICAgICAgICBnX2NvZGUgPSAqcCsrOwotCi0gICAgICAgIGlmICh0bXAgPD0gMCAmJiBzdWIoZ19waXRjaCwgZ3BfbGltaXQpIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdfY29kZSA9IG11bHQoZ19jb2RlLCBzZjFfZ2NvZGUwKTsKLSAgICAgICAgICAgIGcyX3BpdGNoID0gbXVsdChnX3BpdGNoLCBnX3BpdGNoKTsKLSAgICAgICAgICAgIGcyX2NvZGUgPSBtdWx0KGdfY29kZSwgZ19jb2RlKTsKLSAgICAgICAgICAgIGdfcGl0X2NvZCA9IG11bHQoZ19jb2RlLCBnX3BpdGNoKTsKLQotICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzVdLCBjb2VmZl9sb1s1XSwgZzJfcGl0Y2gpOwotICAgICAgICAgICAgTF90bXAgPSBNYWNfMzJfMTYoTF90bXAsIGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCk7Ci0gICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbN10sIGNvZWZmX2xvWzddLCBnMl9jb2RlKTsKLSAgICAgICAgICAgIExfdG1wID0gTWFjXzMyXzE2KExfdG1wLCBjb2VmZls4XSwgY29lZmZfbG9bOF0sIGdfY29kZSk7Ci0gICAgICAgICAgICBMX3RtcCA9IE1hY18zMl8xNihMX3RtcCwgY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QpOwotCi0gICAgICAgICAgICAvLyBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKLSAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyCi0gICAgICAgICAgICBpZiAoTF9zdWIoTF90bXAsIGRpc3RfbWluKSA8IChXb3JkMzIpIDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlzdF9taW4gPSBMX3RtcDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgcmVhZCBxdWFudGl6ZWQgZ2FpbnMgYW5kIHVwZGF0ZSBNQSBwcmVkaWN0b3IgbWVtb3JpZXMgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLQotICAgIC8vIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCi0gICAgLy8gYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucwotICAgIHRtcCA9IHNobChpbmRleCwgMik7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCk7Ci0KLSAgICAvLyBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKLSAgICAvLyB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKQotICAgIGdjX3ByZWQocHJlZF9zdCwgTVI0NzUsIHNmMV9jb2RlX25vc2hhcnAsCi0gICAgICAgICAgICAmc2YxX2V4cF9nY29kZTAsICZzZjFfZnJhY19nY29kZTAsCi0gICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgZHVtbXkKLSAgICBzZjFfZ2NvZGUwID0gZXh0cmFjdF9sKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCkpOwotCi0gICAgdG1wID0gYWRkICh0bXAsIDIpOwotICAgIE1SNDc1X3F1YW50X3N0b3JlX3Jlc3VsdHMocHJlZF9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJsZV9nYWluX01SNDc1W3RtcF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2NvZGUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2YxX2V4cF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9waXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjFfZ2Fpbl9jb2QpOwotCi0gICAgcmV0dXJuIGluZGV4OwotfQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBbb3B0aW9uYWxdCi0KLSBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBIRUFQIE1FTU9SWSBVU0VEOiB4IGJ5dGVzCi0KLSBTVEFDSyBNRU1PUlkgVVNFRDogeCBieXRlcwotCi0gQ0xPQ0sgQ1lDTEVTOiAoY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24pICsgKHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICAgICAgIGNhbGxlZCkKLSAgICAgd2hlcmU6IChjeWNsZSBjb3VudCB2YXJpYWJsZSkgPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBDQVVUSU9OIFtvcHRpb25hbF0KLSBbU3RhdGUgYW55IHNwZWNpYWwgbm90ZXMsIGNvbnN0cmFpbnRzIG9yIGNhdXRpb25zIGZvciB1c2VycyBvZiB0aGlzIGZ1bmN0aW9uXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLVdvcmQxNiBNUjQ3NV9nYWluX3F1YW50KCAgICAgICAvKiBvICA6IGluZGV4IG9mIHF1YW50aXphdGlvbi4gICAgICAgICAgICAgICAgICovCi0gICAgZ2NfcHJlZFN0YXRlICpwcmVkX3N0LCAgICAgLyogaS9vOiBnYWluIHByZWRpY3RvciBzdGF0ZSBzdHJ1Y3QgICAgICAgICAgICAqLwotCi0gICAgLyogZGF0YSBmcm9tIHN1YmZyYW1lIDAgKG9yIDIpICovCi0gICAgV29yZDE2IHNmMF9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjBfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KLSAgICBXb3JkMTYgc2YwX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCi0gICAgV29yZDE2IHNmMF9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLwotICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KLSAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMF9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjBfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KLQotICAgIC8qIGRhdGEgZnJvbSBzdWJmcmFtZSAxIChvciAzKSAqLwotICAgIFdvcmQxNiBzZjFfY29kZV9ub3NoYXJwW10sIC8qIGkgIDogaW5ub3ZhdGl2ZSBjb2RlYm9vayB2ZWN0b3IgKExfU1VCRlIpICAgKi8KLSAgICAvKiAgICAgICh3aGl0aG91dCBwaXRjaCBzaGFycGVuaW5nKSAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMV9leHBfZ2NvZGUwLCAgICAgLyogaSAgOiBwcmVkaWN0ZWQgQ0IgZ2FpbiAoZXhwb25lbnQpLCAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjFfZnJhY19nY29kZTAsICAgIC8qIGkgIDogcHJlZGljdGVkIENCIGdhaW4gKGZyYWN0aW9uKSwgICAgICBRMTUgKi8KLSAgICBXb3JkMTYgc2YxX2V4cF9jb2VmZltdLCAgICAvKiBpICA6IGVuZXJneSBjb2VmZi4gKDUpLCBleHBvbmVudCBwYXJ0LCAgUTAgICovCi0gICAgV29yZDE2IHNmMV9mcmFjX2NvZWZmW10sICAgLyogaSAgOiBlbmVyZ3kgY29lZmYuICg1KSwgZnJhY3Rpb24gcGFydCwgIFExNSAqLwotICAgIC8qICAgICAgKGZyYWNfY29lZmYgYW5kIGV4cF9jb2VmZiBjb21wdXRlZCBpbiAgKi8KLSAgICAvKiAgICAgICBjYWxjX2ZpbHRfZW5lcmdpZXMoKSkgICAgICAgICAgICAgICAgICovCi0gICAgV29yZDE2IHNmMV9leHBfdGFyZ2V0X2VuLCAgLyogaSAgOiBleHBvbmVudCBvZiB0YXJnZXQgZW5lcmd5LCAgICAgICAgIFEwICAqLwotICAgIFdvcmQxNiBzZjFfZnJhY190YXJnZXRfZW4sIC8qIGkgIDogZnJhY3Rpb24gb2YgdGFyZ2V0IGVuZXJneSwgICAgICAgICBRMTUgKi8KLQotICAgIFdvcmQxNiBncF9saW1pdCwgICAgICAgICAgIC8qIGkgIDogcGl0Y2ggZ2FpbiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFdvcmQxNiAqc2YwX2dhaW5fcGl0LCAgICAgIC8qIG8gIDogUGl0Y2ggZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICBRMTQgKi8KLSAgICBXb3JkMTYgKnNmMF9nYWluX2NvZCwgICAgICAvKiBvICA6IENvZGUgZ2FpbiwgICAgICAgICAgICAgICAgICAgICAgICAgUTEgICovCi0KLSAgICBXb3JkMTYgKnNmMV9nYWluX3BpdCwgICAgICAvKiBvICA6IFBpdGNoIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgUTE0ICovCi0gICAgV29yZDE2ICpzZjFfZ2Fpbl9jb2QsICAgICAgLyogbyAgOiBDb2RlIGdhaW4sICAgICAgICAgICAgICAgICAgICAgICAgIFExICAqLwotICAgIEZsYWcgICAqcE92ZXJmbG93ICAgICAgICAgIC8qIG8gIDogb3ZlcmZsb3cgaW5kaWNhdG9yICAgICAgICAgICAgICAgICAgICAgKi8KLSkKLXsKLSAgICBjb25zdCBXb3JkMTYgKnA7Ci0gICAgV29yZDE2IGk7Ci0gICAgV29yZDE2IGluZGV4ID0gMDsKLSAgICBXb3JkMTYgdG1wOwotICAgIFdvcmQxNiBleHA7Ci0gICAgV29yZDE2IHNmMF9nY29kZTA7Ci0gICAgV29yZDE2IHNmMV9nY29kZTA7Ci0gICAgV29yZDE2IGdfcGl0Y2g7Ci0gICAgV29yZDE2IGcyX3BpdGNoOwotICAgIFdvcmQxNiBnX2NvZGU7Ci0gICAgV29yZDE2IGcyX2NvZGU7Ci0gICAgV29yZDE2IGdfcGl0X2NvZDsKLSAgICBXb3JkMTYgY29lZmZbMTBdOwotICAgIFdvcmQxNiBjb2VmZl9sb1sxMF07Ci0gICAgV29yZDE2IGV4cF9tYXhbMTBdOyAgLyogMC4uNDogc2YwOyA1Li45OiBzZjEgKi8KLSAgICBXb3JkMzIgTF90bXA7Ci0gICAgV29yZDMyIGRpc3RfbWluOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBwcmVkaWN0ZWQgY29kZWJvb2sgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIGdjMCAgICAgPSAyXmV4cF9nY29kZTAgKyAyXmZyYWNfZ2NvZGUwICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgZ2NvZGUwIChRMTQpID0gMl4xNCoyXmZyYWNfZ2NvZGUwID0gZ2MwICogMl4oMTQtZXhwX2djb2RlMCkgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHNmMF9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjBfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotICAgIHNmMV9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjFfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotCi0gICAgLyoKLSAgICAgKiBGb3IgZWFjaCBzdWJmcmFtZSwgdGhlIGVycm9yIGVuZXJneSAoc3VtKSB0byBiZSBtaW5pbWl6ZWQgY29uc2lzdHMKLSAgICAgKiBvZiBmaXZlIHRlcm1zLCB0WzAuLjRdLgotICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFswXSA9ICAgIGdwXjIgICogPHkxIHkxPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAtMipncCAgICAqIDx4biB5MT4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0WzJdID0gICAgZ2NeMiAgKiA8eTIgeTI+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgdFszXSA9IC0yKmdjICAgICogPHhuIHkyPgotICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRbNF0gPSAgMipncCpnYyAqIDx5MSB5Mj4KLSAgICAgKgotICAgICAqLwotCi0gICAgLyogc2YgMCAqLwotICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCi0gICAgZXhwID0gc2YwX2V4cF9nY29kZTAgLSAxMTsKLQotICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCi0gICAgZXhwX21heFswXSA9IChzZjBfZXhwX2NvZWZmWzBdIC0gMTMpOwotICAgIGV4cF9tYXhbMV0gPSAoc2YwX2V4cF9jb2VmZlsxXSAtIDE0KTsKLSAgICBleHBfbWF4WzJdID0gKHNmMF9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7Ci0gICAgZXhwX21heFszXSA9IChzZjBfZXhwX2NvZWZmWzNdICsgZXhwKTsKLSAgICBleHBfbWF4WzRdID0gKHNmMF9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOwotCi0gICAgLyogc2YgMSAqLwotICAgIC8qIGRldGVybWluZSB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZ19jb2RlOiBlYyA9IGVjMCAtIDExICovCi0gICAgZXhwID0gc2YxX2V4cF9nY29kZTAgLSAxMTsKLQotICAgIC8qIGNhbGN1bGF0ZSBleHBfbWF4W2ldID0gc1tpXS0xICovCi0gICAgZXhwX21heFs1XSA9IChzZjFfZXhwX2NvZWZmWzBdIC0gMTMpOwotICAgIGV4cF9tYXhbNl0gPSAoc2YxX2V4cF9jb2VmZlsxXSAtIDE0KTsKLSAgICBleHBfbWF4WzddID0gKHNmMV9leHBfY29lZmZbMl0gKyAoMTUgKyAoZXhwIDw8IDEpKSk7Ci0gICAgZXhwX21heFs4XSA9IChzZjFfZXhwX2NvZWZmWzNdICsgZXhwKTsKLSAgICBleHBfbWF4WzldID0gKHNmMV9leHBfY29lZmZbNF0gKyAoMSArIGV4cCkpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICBHYWluIHNlYXJjaCBlcXVhbGlzYXRpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIFRoZSBNU0UgZm9yIHRoZSB0d28gc3ViZnJhbWVzIGlzIHdlaWdodGVkIGRpZmZlcmVudGx5IGlmIHRoZXJlICAgKgotICAgICAqICBpcyBhIGJpZyBkaWZmZXJlbmNlIGluIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldCBlbmVyZ2llcyAgICAgICAgICoKLSAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgLyogbWFrZSB0aGUgdGFyZ2V0IGVuZXJneSBleHBvbmVudHMgdGhlIHNhbWUgYnkgZGUtbm9ybWFsaXppbmcgdGhlCi0gICAgICAgZnJhY3Rpb24gb2YgdGhlIHNtYWxsZXIgb25lLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGNvbXBhcmUKLSAgICAgICB0aGVtCi0gICAgICovCi0gICAgZXhwID0gc2YwX2V4cF90YXJnZXRfZW4gLSBzZjFfZXhwX3RhcmdldF9lbjsKLSAgICBpZiAoZXhwID4gMCkKLSAgICB7Ci0gICAgICAgIHNmMV9mcmFjX3RhcmdldF9lbiA+Pj0gZXhwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzZjBfZnJhY190YXJnZXRfZW4gPj49ICgtZXhwKTsKLSAgICB9Ci0KLSAgICAvKiBhc3N1bWUgbm8gY2hhbmdlIG9mIGV4cG9uZW50cyAqLwotICAgIGV4cCA9IDA7Ci0KLSAgICAvKiB0ZXN0IGZvciB0YXJnZXQgZW5lcmd5IGRpZmZlcmVuY2U7IHNldCBleHAgdG8gKzEgb3IgLTEgdG8gc2NhbGUKLSAgICAgKiB1cC9kb3duIGNvZWZmaWNpZW50cyBmb3Igc2YgMQotICAgICAqLwotICAgIHRtcCA9IHNocl9yKHNmMV9mcmFjX3RhcmdldF9lbiwgMSwgcE92ZXJmbG93KTsgIC8qIHRtcCA9IGNlaWwoMC41KmVuKHNmMSkpICovCi0KLSAgICBpZiAodG1wID4gc2YwX2ZyYWNfdGFyZ2V0X2VuKSAgICAgICAgICAvKiB0bXAgPiBlbihzZjApPyAqLwotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpID4gMip0YXJnZXRfZW5lcmd5KHNmMCkKLSAgICAgICAgICogICAtPiBzY2FsZSB1cCBNU0Uoc2YwKSBieSAyIGJ5IGFkZGluZyAxIHRvIGV4cG9uZW50cyAwLi40Ci0gICAgICAgICAqLwotICAgICAgICBleHAgPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB0bXAgPSAoKHNmMF9mcmFjX3RhcmdldF9lbiArIDMpID4+IDIpOyAvKiB0bXA9Y2VpbCgwLjI1KmVuKHNmMCkpICovCi0KLSAgICAgICAgaWYgKHRtcCA+IHNmMV9mcmFjX3RhcmdldF9lbikgICAgICAvKiB0bXAgPiBlbihzZjEpPyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogdGFyZ2V0X2VuZXJneShzZjEpIDwgMC4yNSp0YXJnZXRfZW5lcmd5KHNmMCkKLSAgICAgICAgICAgICAqICAgLT4gc2NhbGUgZG93biBNU0Uoc2YwKSBieSAwLjUgYnkgc3VidHJhY3RpbmcgMSBmcm9tCi0gICAgICAgICAgICAgKiAgICAgIGNvZWZmaWNpZW50cyAwLi40Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGV4cCA9IC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGV4cF9tYXhbaV0gKz0gZXhwOwotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgRmluZCBtYXhpbXVtIGV4cG9uZW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgRm9yIHRoZSBzdW0gb3BlcmF0aW9uLCBhbGwgdGVybXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNjYWxpbmc7ICAgICAqCi0gICAgICogIHRoYXQgc2NhbGluZyBzaG91bGQgYmUgbG93IGVub3VnaCB0byBwcmV2ZW50IG92ZXJmbG93LiBUaGVyZS0gICAgKgotICAgICAqICBmb3JlLCB0aGUgbWF4aW11bSBzY2FsZSBpcyBkZXRlcm1pbmVkIGFuZCBhbGwgY29lZmZpY2llbnRzIGFyZSAgICoKLSAgICAgKiAgcmUtc2NhbGVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgIGV4cCA9IG1heChleHBfbWF4W2ldKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICBlID0gZXhwX21heFtpXS1leHA7ICAgICAgICAgZSA8PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogICAgY1tpXSA9IGNbaV0qMl5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICBleHAgPSBleHBfbWF4WzBdOwotICAgIGZvciAoaSA9IDk7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBpZiAoZXhwX21heFtpXSA+IGV4cCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwID0gZXhwX21heFtpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBleHArKzsgICAgICAvKiBUbyBhdm9pZCBvdmVyZmxvdyAqLwotCi0gICAgcCA9ICZzZjBfZnJhY19jb2VmZlswXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgICAgdG1wID0gKGV4cCAtIGV4cF9tYXhbaV0pOwotICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7Ci0gICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKLSAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7Ci0gICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKLSAgICB9Ci0gICAgcCA9ICZzZjFfZnJhY19jb2VmZlswXTsKLSAgICBmb3IgKDsgaSA8IDEwOyBpKyspCi0gICAgewotICAgICAgICB0bXAgPSBleHAgLSBleHBfbWF4W2ldOwotICAgICAgICBMX3RtcCA9ICgoV29yZDMyKSgqcCsrKSA8PCAxNik7Ci0gICAgICAgIExfdG1wID0gTF9zaHIoTF90bXAsIHRtcCwgcE92ZXJmbG93KTsKLSAgICAgICAgY29lZmZbaV0gPSAoV29yZDE2KShMX3RtcCA+PiAxNik7Ci0gICAgICAgIGNvZWZmX2xvW2ldID0gKFdvcmQxNikoKExfdG1wID4+IDEpIC0gKChMX3RtcCA+PiAxNikgPDwgMTUpKTsKLSAgICB9Ci0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiAgQ29kZWJvb2sgc2VhcmNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogIH5+fn5+fn5+fn5+fn5+fn4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgRm9yIGVhY2ggcGFpciAoZ19waXRjaCwgZ19mYWMpIGluIHRoZSB0YWJsZSBjYWxjdWxhdGUgdGhlICAgICAgICAqCi0gICAgICogIHRlcm1zIHRbMC4uNF0gYW5kIHN1bSB0aGVtIHVwOyB0aGUgcmVzdWx0IGlzIHRoZSBtZWFuIHNxdWFyZWQgICAgKgotICAgICAqICBlcnJvciBmb3IgdGhlIHF1YW50aXplZCBnYWlucyBmcm9tIHRoZSB0YWJsZS4gVGhlIGluZGV4IGZvciB0aGUgICoKLSAgICAgKiAgbWluaW11bSBNU0UgaXMgc3RvcmVkIGFuZCBmaW5hbGx5IHVzZWQgdG8gcmV0cmlldmUgdGhlIHF1YW50aXplZCAqCi0gICAgICogIGdhaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSAgICAvKiBzdGFydCB3aXRoICJpbmZpbml0ZSIgTVNFICovCi0gICAgZGlzdF9taW4gPSBNQVhfMzI7Ci0KLSAgICBwID0gJnRhYmxlX2dhaW5fTVI0NzVbMF07Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTVI0NzVfVlFfU0laRTsgaSsrKQotICAgIHsKLSAgICAgICAgLyogc3ViZnJhbWUgMCAoYW5kIDIpIGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBnX3BpdGNoID0gKnArKzsKLSAgICAgICAgZ19jb2RlID0gKnArKzsKLQotICAgICAgICAvKiBOZWVkIHRvIGJlIHRoZXJlIE9LQSAqLwotICAgICAgICBnX2NvZGUgICAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogc2YwX2djb2RlMCkgPj4gMTUpOwotICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKLSAgICAgICAgZzJfY29kZSAgID0gKFdvcmQxNikoKChXb3JkMzIpIGdfY29kZSAqIGdfY29kZSkgPj4gMTUpOwotICAgICAgICBnX3BpdF9jb2QgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19jb2RlICogZ19waXRjaCkgPj4gMTUpOwotCi0KLSAgICAgICAgTF90bXAgPSBNcHlfMzJfMTYoY29lZmZbMF0sIGNvZWZmX2xvWzBdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzFdLCBjb2VmZl9sb1sxXSwgZ19waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzJdLCBjb2VmZl9sb1syXSwgZzJfY29kZSwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzNdLCBjb2VmZl9sb1szXSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKLSAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbNF0sIGNvZWZmX2xvWzRdLCBnX3BpdF9jb2QsIHBPdmVyZmxvdyk7Ci0KLSAgICAgICAgdG1wID0gKGdfcGl0Y2ggLSBncF9saW1pdCk7Ci0KLSAgICAgICAgLyogc3ViZnJhbWUgMSAoYW5kIDMpIGNhbGN1bGF0aW9ucyAqLwotICAgICAgICBnX3BpdGNoID0gKnArKzsKLSAgICAgICAgZ19jb2RlID0gKnArKzsKLQotICAgICAgICBpZiAoKHRtcCA8PSAwKSAmJiAoZ19waXRjaCA8PSBncF9saW1pdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdfY29kZSA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBzZjFfZ2NvZGUwKSA+PiAxNSk7Ci0gICAgICAgICAgICBnMl9waXRjaCAgPSAoV29yZDE2KSgoKFdvcmQzMikgZ19waXRjaCAqIGdfcGl0Y2gpID4+IDE1KTsKLSAgICAgICAgICAgIGcyX2NvZGUgICA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX2NvZGUpID4+IDE1KTsKLSAgICAgICAgICAgIGdfcGl0X2NvZCA9IChXb3JkMTYpKCgoV29yZDMyKSBnX2NvZGUgKiBnX3BpdGNoKSA+PiAxNSk7Ci0KLSAgICAgICAgICAgIExfdG1wICs9IChNcHlfMzJfMTYoY29lZmZbNV0sIGNvZWZmX2xvWzVdLCBnMl9waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzZdLCBjb2VmZl9sb1s2XSwgZ19waXRjaCwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzddLCBjb2VmZl9sb1s3XSwgZzJfY29kZSwgcE92ZXJmbG93KSArCi0gICAgICAgICAgICAgICAgICAgICAgTXB5XzMyXzE2KGNvZWZmWzhdLCBjb2VmZl9sb1s4XSwgZ19jb2RlLCBwT3ZlcmZsb3cpICsKLSAgICAgICAgICAgICAgICAgICAgICBNcHlfMzJfMTYoY29lZmZbOV0sIGNvZWZmX2xvWzldLCBnX3BpdF9jb2QsIHBPdmVyZmxvdykpOwotCi0gICAgICAgICAgICAvKiBzdG9yZSB0YWJsZSBpbmRleCBpZiBNU0UgZm9yIHRoaXMgaW5kZXggaXMgbG93ZXIKLSAgICAgICAgICAgICAgIHRoYW4gdGhlIG1pbmltdW0gTVNFIHNlZW4gc28gZmFyICovCi0gICAgICAgICAgICBpZiAoTF90bXAgPCBkaXN0X21pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXN0X21pbiA9IExfdG1wOwotICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAqICByZWFkIHF1YW50aXplZCBnYWlucyBhbmQgdXBkYXRlIE1BIHByZWRpY3RvciBtZW1vcmllcyAgICAgICAgICAgKgotICAgICAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qIGZvciBzdWJmcmFtZSAwLCB0aGUgcHJlLWNhbGN1bGF0ZWQgZ2NvZGUwL2V4cF9nY29kZTAgYXJlIHRoZSBzYW1lCi0gICAgICAgYXMgdGhvc2UgY2FsY3VsYXRlZCBmcm9tIHRoZSAicmVhbCIgcHJlZGljdG9yIHVzaW5nIHF1YW50aXplZCBnYWlucyAqLwotICAgIHRtcCA9IGluZGV4IDw8IDI7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cyhwcmVkX3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nY29kZTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZjBfZXhwX2djb2RlMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX3BpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmMF9nYWluX2NvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvdyk7Ci0KLSAgICAvKiBjYWxjdWxhdGUgbmV3IHByZWRpY3RlZCBnYWluIGZvciBzdWJmcmFtZSAxICh0aGlzIHRpbWUgdXNpbmcKLSAgICAgICB0aGUgcmVhbCwgcXVhbnRpemVkIGdhaW5zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAotICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAotICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCwgLyogZHVtbXkgYXJncyAqLwotICAgICAgICAgICAgcE92ZXJmbG93KTsKLQotICAgIHNmMV9nY29kZTAgPSAoV29yZDE2KShQb3cyKDE0LCBzZjFfZnJhY19nY29kZTAsIHBPdmVyZmxvdykpOwotCi0gICAgdG1wICs9IDI7Ci0gICAgTVI0NzVfcXVhbnRfc3RvcmVfcmVzdWx0cygKLSAgICAgICAgcHJlZF9zdCwKLSAgICAgICAgJnRhYmxlX2dhaW5fTVI0NzVbdG1wXSwKLSAgICAgICAgc2YxX2djb2RlMCwKLSAgICAgICAgc2YxX2V4cF9nY29kZTAsCi0gICAgICAgIHNmMV9nYWluX3BpdCwKLSAgICAgICAgc2YxX2dhaW5fY29kLAotICAgICAgICBwT3ZlcmZsb3cpOwotCi0gICAgcmV0dXJuKGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMWI1NjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcm5iRW5jb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1ybmJFbmNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZGUxY2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQotICovCi0KLWNjX2Z1enogewotICAgIG5hbWU6ICJhbXJuYl9kZWNfZnV6emVyIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhbXJuYl9kZWNfZnV6emVyLmNwcCIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgZGFyd2luOiB7Ci0gICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKLSAgICAgICAgfSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTdlNWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKLSAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJnc21hbXJfZGVjLmgiCi0KLS8vIENvbnN0YW50cyBmb3IgQU1SLU5CCi1jb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKLWNvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Ci1jb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZSAvIDg7Ci1jb25zdCBiaXRzdHJlYW1fZm9ybWF0IGtCaXRTdHJlYW1Gb3JtYXRzWzJdID0ge01JTUVfSUVURiwgSUYyfTsKLWNvbnN0IGludDMyX3Qga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVs4XSA9IHsxMiwgMTMsIDE1LCAxNywgMTksIDIwLCAyNiwgMzF9OwotY29uc3QgaW50MzJfdCBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lWzhdID0gezEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMX07Ci0KLWNsYXNzIENvZGVjIHsKLSBwdWJsaWM6Ci0gIENvZGVjKCkgPSBkZWZhdWx0OwotICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQotICBpbnQxNl90IGluaXREZWNvZGVyKCk7Ci0gIHZvaWQgZGVJbml0RGVjb2RlcigpOwotICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSBwcml2YXRlOgotICB2b2lkICptQW1ySGFuZGxlID0gbnVsbHB0cjsKLX07Ci0KLWludDE2X3QgQ29kZWM6OmluaXREZWNvZGVyKCkgeyByZXR1cm4gR1NNSW5pdERlY29kZSgmbUFtckhhbmRsZSwgKFdvcmQ4ICopIkFNUk5CRGVjb2RlciIpOyB9Ci0KLXZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7IEdTTURlY29kZUZyYW1lRXhpdCgmbUFtckhhbmRsZSk7IH0KLQotdm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHdoaWxlIChzaXplID4gMCkgewotICAgIHVpbnQ4X3QgbW9kZSA9ICpkYXRhOwotICAgIGJvb2wgYml0ID0gbW9kZSAmIDB4MDE7Ci0gICAgYml0c3RyZWFtX2Zvcm1hdCBiaXRzcmVhbUZvcm1hdCA9IGtCaXRTdHJlYW1Gb3JtYXRzW2JpdF07Ci0gICAgaW50MzJfdCBmcmFtZVNpemUgPSAwOwotICAgIC8qIEZpbmQgZnJhbWUgdHlwZSAqLwotICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGUgPSBzdGF0aWNfY2FzdDxGcmFtZV9UeXBlXzNHUFA+KChtb2RlID4+IDMpICYgMHgwNyk7Ci0gICAgKytkYXRhOwotICAgIC0tc2l6ZTsKLSAgICBpZiAoYml0KSB7Ci0gICAgICBmcmFtZVNpemUgPSBrTG9jYWxJZjJEZWNCeXRlc1BlckZyYW1lW2ZyYW1lVHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZyYW1lU2l6ZSA9IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbZnJhbWVUeXBlXTsKLSAgICB9Ci0gICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOwotICAgIHVpbnQ4X3QgKmlucHV0QnVmID0gbmV3IHVpbnQ4X3RbZnJhbWVTaXplXTsKLSAgICBpZiAoIWlucHV0QnVmKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDMyX3QgbWluU2l6ZSA9IHN0ZDo6bWluKChpbnQzMl90KXNpemUsIGZyYW1lU2l6ZSk7Ci0gICAgbWVtY3B5KGlucHV0QnVmLCBkYXRhLCBtaW5TaXplKTsKLSAgICBBTVJEZWNvZGUobUFtckhhbmRsZSwgZnJhbWVUeXBlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCBiaXRzcmVhbUZvcm1hdCk7Ci0gICAgLyogQU1SRGVjb2RlKCkgZGVjb2RlcyBtaW5TaXplIG51bWJlciBvZiBieXRlcyBpZiBkZWNvZGUgaXMgc3VjY2Vzc2Z1bC4KLSAgICAgKiBBTVJEZWNvZGUoKSByZXR1cm5zIC0xIGlmIGRlY29kZSBmYWlscy4KLSAgICAgKiBFdmVuIGlmIG5vIGJ5dGVzIGFyZSBkZWNvZGVkLCBpbmNyZW1lbnQgYnkgbWluU2l6ZSB0byBlbnN1cmUgZnV6emVyIHByb2NlZWRzCi0gICAgICogdG8gZmVlZCBuZXh0IGRhdGEgKi8KLSAgICBkYXRhICs9IG1pblNpemU7Ci0gICAgc2l6ZSAtPSBtaW5TaXplOwotICAgIGRlbGV0ZVtdIGlucHV0QnVmOwotICB9Ci19Ci0KLWV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKHNpemUgPCAyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ29kZWMgKmNvZGVjID0gbmV3IENvZGVjKCk7Ci0gIGlmICghY29kZWMpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoY29kZWMtPmluaXREZWNvZGVyKCkgPT0gMCkgewotICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7Ci0gIH0KLSAgZGVsZXRlIGNvZGVjOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGNiZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYWdjMl9hbXJfd2IuY3BwIiwKLSAgICAgICAgInNyYy9iYW5kX3Bhc3NfNmtfN2suY3BwIiwKLSAgICAgICAgInNyYy9kZWNfYWNlbHBfMnBfaW5fNjQuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwIiwKLSAgICAgICAgInNyYy9kZWNfYWxnX2NvZGVib29rLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX2dhaW4yX2Ftcl93Yi5jcHAiLAotICAgICAgICAic3JjL2RlZW1waGFzaXNfMzIuY3BwIiwKLSAgICAgICAgInNyYy9kdHhfZGVjb2Rlcl9hbXJfd2IuY3BwIiwKLSAgICAgICAgInNyYy9nZXRfYW1yX3diX2JpdHMuY3BwIiwKLSAgICAgICAgInNyYy9oaWdocGFzc180MDBoel9hdF8xMms4LmNwcCIsCi0gICAgICAgICJzcmMvaGlnaHBhc3NfNTBoel9hdF8xMms4LmNwcCIsCi0gICAgICAgICJzcmMvaG9taW5nX2Ftcl93Yl9kZWMuY3BwIiwKLSAgICAgICAgInNyYy9pbnRlcnBvbGF0ZV9pc3AuY3BwIiwKLSAgICAgICAgInNyYy9pc2ZfZXh0cmFwb2xhdGlvbi5jcHAiLAotICAgICAgICAic3JjL2lzcF9hei5jcHAiLAotICAgICAgICAic3JjL2lzcF9pc2YuY3BwIiwKLSAgICAgICAgInNyYy9sYWdjb25jZWFsLmNwcCIsCi0gICAgICAgICJzcmMvbG93X3Bhc3NfZmlsdF83ay5jcHAiLAotICAgICAgICAic3JjL21lZGlhbjUuY3BwIiwKLSAgICAgICAgInNyYy9taW1lX2lvLmNwcCIsCi0gICAgICAgICJzcmMvbm9pc2VfZ2VuX2FtcndiLmNwcCIsCi0gICAgICAgICJzcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAiLAotICAgICAgICAic3JjL292ZXJzYW1wXzEyazhfdG9fMTZrLmNwcCIsCi0gICAgICAgICJzcmMvcGhhc2VfZGlzcGVyc2lvbi5jcHAiLAotICAgICAgICAic3JjL3BpdF9zaHJwLmNwcCIsCi0gICAgICAgICJzcmMvcHJlZF9sdDQuY3BwIiwKLSAgICAgICAgInNyYy9wcmVlbXBoX2FtcndiX2RlYy5jcHAiLAotICAgICAgICAic3JjL3B2YW1yd2JfbWF0aF9vcC5jcHAiLAotICAgICAgICAic3JjL3B2YW1yd2JkZWNvZGVyLmNwcCIsCi0gICAgICAgICJzcmMvcV9nYWluMl90YWIuY3BwIiwKLSAgICAgICAgInNyYy9xaXNmX25zLmNwcCIsCi0gICAgICAgICJzcmMvcWlzZl9uc190YWIuY3BwIiwKLSAgICAgICAgInNyYy9xcGlzZl8ycy5jcHAiLAotICAgICAgICAic3JjL3FwaXNmXzJzX3RhYi5jcHAiLAotICAgICAgICAic3JjL3NjYWxlX3NpZ25hbC5jcHAiLAotICAgICAgICAic3JjL3N5bnRoZXNpc19hbXJfd2IuY3BwIiwKLSAgICAgICAgInNyYy92b2ljZV9mYWN0b3IuY3BwIiwKLSAgICAgICAgInNyYy93Yl9zeW5fZmlsdC5jcHAiLAotICAgICAgICAic3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAic3JjIiwKLSAgICAgICAgImluY2x1ZGUiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCi0gICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgfSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19Ci0KLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLQotICAgIHNyY3M6IFsidGVzdC9hbXJ3YmRlY190ZXN0LmNwcCJdLAotCi0gICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYXVkaW91dGlscyJdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgfSwKLQotICAgIHRhcmdldDogewotICAgICAgICBkYXJ3aW46IHsKLSAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTk9USUNFIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL1RFU1RfTUFQUElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1OGJhMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvVEVTVF9NQVBQSU5HCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IKLXsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50Ci0gICAgLy8geyAibmFtZSI6ICJBbXJ3YkRlY29kZXJUZXN0In0KLQotICBdCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Zjc3ZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQotICovCi0KLWNjX2Z1enogewotICAgIG5hbWU6ICJhbXJ3Yl9kZWNfZnV6emVyIiwKLSAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKLSAgICBzcmNzOiBbCi0gICAgICAgICJhbXJ3Yl9kZWNfZnV6emVyLmNwcCIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAotICAgIF0sCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGRhcndpbjogewotICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCi0gICAgICAgIH0sCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJmMTFkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgotCi1Hb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAotc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKLXRoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KLWhhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCi10aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQotcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3diX3N5bl9maWx0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2Jfc3luX2ZpbHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWFmNmQ0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvd2Jfc3luX2ZpbHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGZvbGxvd2luZyAzR1BQIHN0YW5kYXJkOgotCi0gICAgM0dQUCBUUyAyNi4xNzMKLSAgICBBTlNJLUMgY29kZSBmb3IgdGhlIEFkYXB0aXZlIE11bHRpLVJhdGUgLSBXaWRlYmFuZCAoQU1SLVdCKSBzcGVlY2ggY29kZWMKLSAgICBBdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LjNncHAub3JnCi0KLShDKSAyMDA3LCAzR1BQIE9yZ2FuaXphdGlvbmFsIFBhcnRuZXJzIChBUklCLCBBVElTLCBDQ1NBLCBFVFNJLCBUVEEsIFRUQykKLVBlcm1pc3Npb24gdG8gZGlzdHJpYnV0ZSwgbW9kaWZ5IGFuZCB1c2UgdGhpcyBmaWxlIHVuZGVyIHRoZSBzdGFuZGFyZCBsaWNlbnNlCi10ZXJtcyBsaXN0ZWQgYWJvdmUgaGFzIGJlZW4gb2J0YWluZWQgZnJvbSB0aGUgY29weXJpZ2h0IGhvbGRlci4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotCi0gRmlsZW5hbWU6IHdiX3N5bl9maWx0LmNwcAotCi0gICAgIERhdGU6IDA1LzA4LzIwMDQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVWSVNJT04gSElTVE9SWQotCi0KLSBEZXNjcmlwdGlvbjoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi13Yl9zeW5fZmlsdAotCi0gICAgIGludDE2IGFbXSwgICAgICAgICAgICAgICAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzCi0gICAgIGludDE2IG0sICAgICAgICAgICAgICAgICAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyCi0gICAgIGludDE2IHhbXSwgICAgICAgICAgICAgICAoaSkgICAgIDogaW5wdXQgc2lnbmFsCi0gICAgIGludDE2IHlbXSwgICAgICAgICAgICAgICAobykgICAgIDogb3V0cHV0IHNpZ25hbAotICAgICBpbnQxNiBsZywgICAgICAgICAgICAgICAgKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nCi0gICAgIGludDE2IG1lbVtdLCAgICAgICAgICAgICAoaS9vKSAgIDogbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbHRlcmluZy4KLSAgICAgaW50MTYgdXBkYXRlLCAgICAgICAgICAgIChpKSAgICAgOiAwPW5vIHVwZGF0ZSwgMT11cGRhdGUgb2YgbWVtb3J5LgotICAgICBpbnQxNiB5X2J1ZltdCi0KLVN5bl9maWx0XzMyCi0KLSAgICAgaW50MTYgYVtdLCAgICAgICAgICAgICAgKGkpIFExMiA6IGFbbSsxXSBwcmVkaWN0aW9uIGNvZWZmaWNpZW50cwotICAgICBpbnQxNiBtLCAgICAgICAgICAgICAgICAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyCi0gICAgIGludDE2IGV4Y1tdLCAgICAgICAgICAgIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykKLSAgICAgaW50MTYgUW5ldywgICAgICAgICAgICAgKGkpICAgICA6IGV4YyBzY2FsaW5nID0gMChtaW4pIHRvIDgobWF4KQotICAgICBpbnQxNiBzaWdfaGlbXSwgICAgICAgICAobykgLzE2IDogc3ludGhlc2lzIGhpZ2gKLSAgICAgaW50MTYgc2lnX2xvW10sICAgICAgICAgKG8pIC8xNiA6IHN5bnRoZXNpcyBsb3cKLSAgICAgaW50MTYgbGcgICAgICAgICAgICAgICAgKGkpICAgICA6IHNpemUgb2YgZmlsdGVyaW5nCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSAgICBEbyB0aGUgc3ludGhlc2lzIGZpbHRlcmluZyAxL0EoeikgIDE2IGFuZCAzMi1iaXRzIHZlcnNpb24KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0jaW5jbHVkZSAicHZfYW1yX3diX3R5cGVfZGVmcy5oIgotI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyX21lbV9mdW5jcy5oIgotI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyX2Jhc2ljX29wLmgiCi0jaW5jbHVkZSAicHZhbXJ3Yl9tYXRoX29wLmgiCi0jaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfY25zdC5oIgotI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyX2FjZWxwLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCB3Yl9zeW5fZmlsdCgKLSAgICBpbnQxNiBhW10sICAgICAgIC8qIChpKSBRMTIgOiBhW20rMV0gcHJlZGljdGlvbiBjb2VmZmljaWVudHMgICAgICAgICAgICovCi0gICAgaW50MTYgbSwgICAgICAgICAvKiAoaSkgICAgIDogb3JkZXIgb2YgTFAgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGludDE2IHhbXSwgICAgICAgLyogKGkpICAgICA6IGlucHV0IHNpZ25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpbnQxNiB5W10sICAgICAgIC8qIChvKSAgICAgOiBvdXRwdXQgc2lnbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaW50MTYgbGcsICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGludDE2IG1lbVtdLCAgICAgLyogKGkvbykgICA6IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWx0ZXJpbmcuICAgKi8KLSAgICBpbnQxNiB1cGRhdGUsICAgIC8qIChpKSAgICAgOiAwPW5vIHVwZGF0ZSwgMT11cGRhdGUgb2YgbWVtb3J5LiAgICAgICAgICovCi0gICAgaW50MTYgeV9idWZbXQotKQotewotCi0gICAgaW50MTYgaSwgajsKLSAgICBpbnQzMiBMX3RtcDE7Ci0gICAgaW50MzIgTF90bXAyOwotICAgIGludDMyIExfdG1wMzsKLSAgICBpbnQzMiBMX3RtcDQ7Ci0gICAgaW50MTYgKnl5OwotCi0gICAgLyogY29weSBpbml0aWFsIGZpbHRlciBzdGF0ZXMgaW50byBzeW50aGVzaXMgYnVmZmVyICovCi0gICAgcHZfbWVtY3B5KHlfYnVmLCBtZW0sIG0qc2l6ZW9mKCp5eSkpOwotCi0gICAgeXkgPSAmeV9idWZbbV07Ci0KLSAgICAvKiBEbyB0aGUgZmlsdGVyaW5nLiAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGxnID4+IDI7IGkrKykKLSAgICB7Ci0gICAgICAgIExfdG1wMSA9IC0oKGludDMyKXhbKGk8PDIpXSA8PCAxMSk7Ci0gICAgICAgIExfdG1wMiA9IC0oKGludDMyKXhbKGk8PDIpKzFdIDw8IDExKTsKLSAgICAgICAgTF90bXAzID0gLSgoaW50MzIpeFsoaTw8MikrMl0gPDwgMTEpOwotICAgICAgICBMX3RtcDQgPSAtKChpbnQzMil4WyhpPDwyKSszXSA8PCAxMSk7Ci0KLSAgICAgICAgLyogYVtdIHVzZXMgUTEyIGFuZCBhYnMoYSkgPTwgMSAqLwotCi0gICAgICAgIExfdG1wMSAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTNdLCBhWzNdLCBMX3RtcDEpOwotICAgICAgICBMX3RtcDIgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0yXSwgYVszXSwgTF90bXAyKTsKLSAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtMl0sIGFbMl0sIExfdG1wMSk7Ci0gICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgLTFdLCBhWzJdLCBMX3RtcDIpOwotICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpIC0xXSwgYVsxXSwgTF90bXAxKTsKLQotICAgICAgICBmb3IgKGogPSA0OyBqIDwgbTsgaiArPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBMX3RtcDEgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpLTEgIC0gal0sIGFbaisxXSwgTF90bXAxKTsKLSAgICAgICAgICAgIExfdG1wMiAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgICAgLSBqXSwgYVtqKzFdLCBMX3RtcDIpOwotICAgICAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAgICAtIGpdLCBhW2ogIF0sIExfdG1wMSk7Ci0gICAgICAgICAgICBMX3RtcDIgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzEgIC0gal0sIGFbaiAgXSwgTF90bXAyKTsKLSAgICAgICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMSAgLSBqXSwgYVtqKzFdLCBMX3RtcDMpOwotICAgICAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSsyICAtIGpdLCBhW2orMV0sIExfdG1wNCk7Ci0gICAgICAgICAgICBMX3RtcDMgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzIgIC0gal0sIGFbaiAgXSwgTF90bXAzKTsKLSAgICAgICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMyAgLSBqXSwgYVtqICBdLCBMX3RtcDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTF90bXAxICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAgICAtIGpdLCBhW2pdLCBMX3RtcDEpOwotICAgICAgICBMX3RtcDIgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpKzEgIC0gal0sIGFbal0sIExfdG1wMik7Ci0gICAgICAgIExfdG1wMyAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMiAgLSBqXSwgYVtqXSwgTF90bXAzKTsKLSAgICAgICAgTF90bXA0ICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSszICAtIGpdLCBhW2pdLCBMX3RtcDQpOwotCi0gICAgICAgIExfdG1wMSA9IHNobF9pbnQzMihMX3RtcDEsIDQpOwotCi0gICAgICAgIHlbKGk8PDIpXSA9IHl5WyhpPDwyKV0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMSk7Ci0KLSAgICAgICAgTF90bXAyICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKV0sIGFbMV0sIExfdG1wMik7Ci0KLSAgICAgICAgTF90bXAyID0gc2hsX2ludDMyKExfdG1wMiwgNCk7Ci0KLSAgICAgICAgeVsoaTw8MikrMV0gPSB5eVsoaTw8MikrMV0gPSBhbXJfd2Jfcm91bmQoLUxfdG1wMik7Ci0KLSAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSAtIDFdLCBhWzNdLCBMX3RtcDMpOwotICAgICAgICBMX3RtcDQgID0gZnhwX21hY18xNmJ5MTYoeXlbKGk8PDIpXSwgYVszXSwgTF90bXA0KTsKLSAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKV0sIGFbMl0sIExfdG1wMyk7Ci0gICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikgKyAxXSwgYVsyXSwgTF90bXA0KTsKLSAgICAgICAgTF90bXAzICA9IGZ4cF9tYWNfMTZieTE2KHl5WyhpPDwyKSArIDFdLCBhWzFdLCBMX3RtcDMpOwotCi0gICAgICAgIExfdG1wMyA9IHNobF9pbnQzMihMX3RtcDMsIDQpOwotCi0gICAgICAgIHlbKGk8PDIpKzJdID0geXlbKGk8PDIpKzJdID0gYW1yX3diX3JvdW5kKC1MX3RtcDMpOwotCi0gICAgICAgIExfdG1wNCAgPSBmeHBfbWFjXzE2YnkxNih5eVsoaTw8MikrMl0sIGFbMV0sIExfdG1wNCk7Ci0KLSAgICAgICAgTF90bXA0ID0gc2hsX2ludDMyKExfdG1wNCwgNCk7Ci0KLSAgICAgICAgeVsoaTw8MikrM10gPSB5eVsoaTw8MikrM10gPSBhbXJfd2Jfcm91bmQoLUxfdG1wNCk7Ci0gICAgfQotCi0KLSAgICAvKiBVcGRhdGUgbWVtb3J5IGlmIHJlcXVpcmVkICovCi0KLSAgICBpZiAodXBkYXRlKQotICAgIHsKLSAgICAgICAgcHZfbWVtY3B5KG1lbSwgJnlbbGcgLSBtXSwgbSpzaXplb2YoKnkpKTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBTeW5fZmlsdF8zMigKLSAgICBpbnQxNiBhW10sICAgICAgICAgICAgICAvKiAoaSkgUTEyIDogYVttKzFdIHByZWRpY3Rpb24gY29lZmZpY2llbnRzICovCi0gICAgaW50MTYgbSwgICAgICAgICAgICAgICAgLyogKGkpICAgICA6IG9yZGVyIG9mIExQIGZpbHRlciAgICAgICAgICAgICAqLwotICAgIGludDE2IGV4Y1tdLCAgICAgICAgICAgIC8qIChpKSBRbmV3OiBleGNpdGF0aW9uIChleGNbaV0gPj4gUW5ldykgICAgKi8KLSAgICBpbnQxNiBRbmV3LCAgICAgICAgICAgICAvKiAoaSkgICAgIDogZXhjIHNjYWxpbmcgPSAwKG1pbikgdG8gOChtYXgpICovCi0gICAgaW50MTYgc2lnX2hpW10sICAgICAgICAgLyogKG8pIC8xNiA6IHN5bnRoZXNpcyBoaWdoICAgICAgICAgICAgICAgICAqLwotICAgIGludDE2IHNpZ19sb1tdLCAgICAgICAgIC8qIChvKSAvMTYgOiBzeW50aGVzaXMgbG93ICAgICAgICAgICAgICAgICAgKi8KLSAgICBpbnQxNiBsZyAgICAgICAgICAgICAgICAvKiAoaSkgICAgIDogc2l6ZSBvZiBmaWx0ZXJpbmcgICAgICAgICAgICAgICovCi0pCi17Ci0gICAgaW50MTYgaSwgaywgYTA7Ci0gICAgaW50MzIgTF90bXAxOwotICAgIGludDMyIExfdG1wMjsKLSAgICBpbnQzMiBMX3RtcDM7Ci0gICAgaW50MzIgTF90bXA0OwotCi0gICAgYTAgPSA5IC0gUW5ldzsgICAgICAgIC8qIGlucHV0IC8gMTYgYW5kID4+UW5ldyAqLwotCi0gICAgLyogRG8gdGhlIGZpbHRlcmluZy4gKi8KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZyA+PiAxOyBpKyspCi0gICAgewotCi0gICAgICAgIExfdG1wMyA9IDA7Ci0gICAgICAgIExfdG1wNCA9IDA7Ci0KLSAgICAgICAgTF90bXAxID0gZnhwX211bF8xNmJ5MTYoc2lnX2xvWyhpPDwxKSAtIDFdLCBhWzFdKTsKLSAgICAgICAgTF90bXAyID0gZnhwX211bF8xNmJ5MTYoc2lnX2hpWyhpPDwxKSAtIDFdLCBhWzFdKTsKLQotICAgICAgICBmb3IgKGsgPSAyOyBrIDwgbTsgayArPSAyKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIExfdG1wMSA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSktMSAtIGtdLCBhW2srMV0sIExfdG1wMSk7Ci0gICAgICAgICAgICBMX3RtcDIgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpLTEgLSBrXSwgYVtrKzFdLCBMX3RtcDIpOwotICAgICAgICAgICAgTF90bXAxID0gZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSAgIC0ga10sIGFbayAgXSwgTF90bXAxKTsKLSAgICAgICAgICAgIExfdG1wMiA9IGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkgICAtIGtdLCBhW2sgIF0sIExfdG1wMik7Ci0gICAgICAgICAgICBMX3RtcDMgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpICAgLSBrXSwgYVtrKzFdLCBMX3RtcDMpOwotICAgICAgICAgICAgTF90bXA0ID0gZnhwX21hY18xNmJ5MTYoc2lnX2hpWyhpPDwxKSAgIC0ga10sIGFbaysxXSwgTF90bXA0KTsKLSAgICAgICAgICAgIExfdG1wMyA9IGZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkrMSAtIGtdLCBhW2sgIF0sIExfdG1wMyk7Ci0gICAgICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpKzEgLSBrXSwgYVtrICBdLCBMX3RtcDQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTF90bXAxID0gLWZ4cF9tYWNfMTZieTE2KHNpZ19sb1soaTw8MSkgICAtIGtdLCBhW2tdLCBMX3RtcDEpOwotICAgICAgICBMX3RtcDMgPSAgZnhwX21hY18xNmJ5MTYoc2lnX2xvWyhpPDwxKSsxIC0ga10sIGFba10sIExfdG1wMyk7Ci0gICAgICAgIExfdG1wMiA9ICBmeHBfbWFjXzE2YnkxNihzaWdfaGlbKGk8PDEpICAgLSBrXSwgYVtrXSwgTF90bXAyKTsKLSAgICAgICAgTF90bXA0ID0gIGZ4cF9tYWNfMTZieTE2KHNpZ19oaVsoaTw8MSkrMSAtIGtdLCBhW2tdLCBMX3RtcDQpOwotCi0KLQotICAgICAgICBMX3RtcDEgPj49IDExOyAgICAgIC8qIC00IDogc2lnX2xvW2ldIDw8IDQgKi8KLQotICAgICAgICBMX3RtcDEgKz0gKGludDMyKWV4Y1soaTw8MSldIDw8IGEwOwotCi0gICAgICAgIExfdG1wMSAtPSAoTF90bXAyIDw8IDEpOwotICAgICAgICAvKiBzaWdfaGkgPSBiaXQxNiB0byBiaXQzMSBvZiBzeW50aGVzaXMgKi8KLSAgICAgICAgTF90bXAxID0gc2hsX2ludDMyKExfdG1wMSwgMyk7ICAgICAgICAgICAvKiBhaSBpbiBRMTIgKi8KLQotICAgICAgICBzaWdfaGlbKGk8PDEpXSA9IChpbnQxNikoTF90bXAxID4+IDE2KTsKLQotICAgICAgICBMX3RtcDQgPSBmeHBfbWFjXzE2YnkxNigoaW50MTYpKExfdG1wMSA+PiAxNiksIGFbMV0sIExfdG1wNCk7Ci0KLSAgICAgICAgLyogc2lnX2xvID0gYml0NCB0byBiaXQxNSBvZiBzeW50aGVzaXMgKi8KLSAgICAgICAgLyogTF90bXAxID4+PSA0IDogc2lnX2xvW2ldID4+IDQgKi8KLSAgICAgICAgc2lnX2xvWyhpPDwxKV0gPSAoaW50MTYpKChMX3RtcDEgPj4gNCkgLSAoKExfdG1wMSA+PiAxNikgPDwgMTIpKTsKLQotICAgICAgICBMX3RtcDMgPSBmeHBfbWFjXzE2YnkxNihzaWdfbG9bKGk8PDEpXSwgYVsxXSwgTF90bXAzKTsKLSAgICAgICAgTF90bXAzID0gLUxfdG1wMyA+PiAxMTsKLQotICAgICAgICBMX3RtcDMgKz0gKGludDMyKWV4Y1soaTw8MSkrMV0gPDwgYTA7Ci0KLSAgICAgICAgTF90bXAzIC09IChMX3RtcDQgPDwgMSk7Ci0gICAgICAgIC8qIHNpZ19oaSA9IGJpdDE2IHRvIGJpdDMxIG9mIHN5bnRoZXNpcyAqLwotICAgICAgICBMX3RtcDMgPSBzaGxfaW50MzIoTF90bXAzLCAzKTsgICAgICAgICAgIC8qIGFpIGluIFExMiAqLwotICAgICAgICBzaWdfaGlbKGk8PDEpKzFdID0gKGludDE2KShMX3RtcDMgPj4gMTYpOwotCi0gICAgICAgIC8qIHNpZ19sbyA9IGJpdDQgdG8gYml0MTUgb2Ygc3ludGhlc2lzICovCi0gICAgICAgIC8qIExfdG1wMSA+Pj0gNCA6IHNpZ19sb1tpXSA+PiA0ICovCi0gICAgICAgIHNpZ19sb1soaTw8MSkrMV0gPSAoaW50MTYpKChMX3RtcDMgPj4gNCkgLSAoc2lnX2hpWyhpPDwxKSsxXSA8PCAxMikpOwotICAgIH0KLQotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjgyMTVhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcndiRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1yd2JEZWNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAotICAgICAgICAibGlic25kZmlsZSIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgfSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKaW5kZXggNjRmMzAyYy4uMDBlN2JjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKQEAgLTEsMTQ3ICsxLDEzIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKIAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hdXRvY29yci5jIiwKLSAgICAgICAgInNyYy9hel9pc3AuYyIsCi0gICAgICAgICJzcmMvYml0cy5jIiwKLSAgICAgICAgInNyYy9jMnQ2NGZ4LmMiLAotICAgICAgICAic3JjL2M0dDY0ZnguYyIsCi0gICAgICAgICJzcmMvY29udm9sdmUuYyIsCi0gICAgICAgICJzcmMvY29yX2hfeC5jIiwKLSAgICAgICAgInNyYy9kZWNpbTU0LmMiLAotICAgICAgICAic3JjL2RlZW1waC5jIiwKLSAgICAgICAgInNyYy9kdHguYyIsCi0gICAgICAgICJzcmMvZ19waXRjaC5jIiwKLSAgICAgICAgInNyYy9ncGNsaXAuYyIsCi0gICAgICAgICJzcmMvaG9taW5nLmMiLAotICAgICAgICAic3JjL2hwNDAwLmMiLAotICAgICAgICAic3JjL2hwNTAuYyIsCi0gICAgICAgICJzcmMvaHA2ay5jIiwKLSAgICAgICAgInNyYy9ocF93c3AuYyIsCi0gICAgICAgICJzcmMvaW50X2xwYy5jIiwKLSAgICAgICAgInNyYy9pc3BfYXouYyIsCi0gICAgICAgICJzcmMvaXNwX2lzZi5jIiwKLSAgICAgICAgInNyYy9sYWdfd2luZC5jIiwKLSAgICAgICAgInNyYy9sZXZpbnNvbi5jIiwKLSAgICAgICAgInNyYy9sb2cyLmMiLAotICAgICAgICAic3JjL2xwX2RlYzIuYyIsCi0gICAgICAgICJzcmMvbWF0aF9vcC5jIiwKLSAgICAgICAgInNyYy9vcGVyXzMyYi5jIiwKLSAgICAgICAgInNyYy9wX21lZF9vbC5jIiwKLSAgICAgICAgInNyYy9waXRfc2hycC5jIiwKLSAgICAgICAgInNyYy9waXRjaF9mNC5jIiwKLSAgICAgICAgInNyYy9wcmVkX2x0NC5jIiwKLSAgICAgICAgInNyYy9wcmVlbXBoLmMiLAotICAgICAgICAic3JjL3FfZ2FpbjIuYyIsCi0gICAgICAgICJzcmMvcV9wdWxzZS5jIiwKLSAgICAgICAgInNyYy9xaXNmX25zLmMiLAotICAgICAgICAic3JjL3FwaXNmXzJzLmMiLAotICAgICAgICAic3JjL3JhbmRvbS5jIiwKLSAgICAgICAgInNyYy9yZXNpZHUuYyIsCi0gICAgICAgICJzcmMvc2NhbGUuYyIsCi0gICAgICAgICJzcmMvc3RyZWFtLmMiLAotICAgICAgICAic3JjL3N5bl9maWx0LmMiLAotICAgICAgICAic3JjL3VwZHRfdGFyLmMiLAotICAgICAgICAic3JjL3V0aWwuYyIsCi0gICAgICAgICJzcmMvdm9BTVJXQkVuYy5jIiwKLSAgICAgICAgInNyYy92b2ljZWZhYy5jIiwKLSAgICAgICAgInNyYy93Yl92YWQuYyIsCi0gICAgICAgICJzcmMvd2VpZ2h0X2EuYyIsCi0gICAgICAgICJzcmMvbWVtX2FsaWduLmMiLAotICAgIF0sCi0KLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTogewotICAgICAgICAgICAgc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL2Nvcl9oX3ZlY19vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RlZW1waF8zMl9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRmlsdF82a183a19vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL05vcm1fQ29ycl9vcHQucyIsCi0gICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9yZXNpZHVfYXNtX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc2NhbGVfc2lnX29wdC5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zeW5fZmlsdF9vcHQucyIsCi0gICAgICAgICAgICBdLAotCi0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURBUk0iLAotICAgICAgICAgICAgICAgICItREFTTV9PUFQiLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMvYXNtL0FSTVY1RSJdLAotCi0gICAgICAgICAgICBpbnN0cnVjdGlvbl9zZXQ6ICJhcm0iLAotCi0gICAgICAgICAgICBuZW9uOiB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZV9zcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb252b2x2ZV9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9jb3JfaF92ZWNfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvRGVlbXBoXzMyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0RvdF9wX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL0ZpbHRfNmtfN2tfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvTm9ybV9Db3JyX29wdC5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFL3ByZWRfbHQ0XzFfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvcmVzaWR1X2FzbV9vcHQucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY1RS9zY2FsZV9zaWdfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvU3luX2ZpbHRfMzJfb3B0LnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNUUvc3luX2ZpbHRfb3B0LnMiLAotICAgICAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L2NvbnZvbHZlX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L2Nvcl9oX3ZlY19uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9EZWVtcGhfMzJfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRG90X3BfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvRmlsdF82a183a19uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9Ob3JtX0NvcnJfbmVvbi5zIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjcvcHJlZF9sdDRfMV9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9yZXNpZHVfYXNtX25lb24ucyIsCi0gICAgICAgICAgICAgICAgICAgICJzcmMvYXNtL0FSTVY3L3NjYWxlX3NpZ19uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9TeW5fZmlsdF8zMl9uZW9uLnMiLAotICAgICAgICAgICAgICAgICAgICAic3JjL2FzbS9BUk1WNy9zeW5fZmlsdF9uZW9uLnMiLAotICAgICAgICAgICAgICAgIF0sCi0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBhY3R1YWxseSBnZW5lcmF0ZSBuZW9uIGluc3RydWN0aW9ucywgc2VlIGJ1ZyAyNjkzMjk4MAotICAgICAgICAgICAgICAgIGNmbGFnczogWwotICAgICAgICAgICAgICAgICAgICAiLURBUk1WNyIsCi0gICAgICAgICAgICAgICAgICAgICItbWZwdT12ZnB2MyIsCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjVFIiwKLSAgICAgICAgICAgICAgICAgICAgInNyYy9hc20vQVJNVjciLAotICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluYyJdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgfSwKLQorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcndiZW5jIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNjMsNCArMjksMyBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgXSwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTk9USUNFIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL05PVElDRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMWVmYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0MmZjNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFNUldCRW5jVGVzdCIsCi0gICAgZ3Rlc3Q6IGZhbHNlLAotCi0gICAgc3JjczogWyJBTVJXQl9FX1NBTVBMRS5jIl0sCi0KLSAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCi0gICAgXSwKLQotICAgIHNhbml0aXplOiB7Ci0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCmluZGV4IDdmYjhhNGMuLjY1N2E1Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKQEAgLTQ3Niw2ICs0NzYsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1RFU1RfTUFQUElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzZDY2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvVEVTVF9NQVBQSU5HCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMKLXsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50Ci0gICAgLy8geyAibmFtZSI6ICJBbXJ3YkVuY29kZXJUZXN0In0KLQotICBdCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL3ByZWVtcGguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGM4NjUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcHJlZW1waC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDMtMjAxMCwgVmlzdWFsT24sIEluYy4KLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICBGaWxlOiBwcmVlbXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgIERlc2NyaXB0aW9uOiBQcmVlbXBoYXNpczogZmlsdGVyaW5nIHRocm91Z2ggMSAtIGcgel4tMSAgICAgICAgICoKLSogICAgICAgICAgICAgIFByZWVtcGgyIC0tPiBzaWduYWwgaXMgbXVsdGlwbGllZCBieSAyICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJ0eXBlZGVmLmgiCi0jaW5jbHVkZSAiYmFzaWNfb3AuaCIKLQotdm9pZCBQcmVlbXBoKAotICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLwotICAgICAgICBXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBwcmVlbXBoYXNpcyBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICApCi17Ci0gICAgV29yZDE2IHRlbXA7Ci0gICAgV29yZDMyIGksIExfdG1wOwotCi0gICAgdGVtcCA9IHhbbGcgLSAxXTsKLQotICAgIGZvciAoaSA9IGxnIC0gMTsgaSA+IDA7IGktLSkKLSAgICB7Ci0gICAgICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFtpXSk7Ci0gICAgICAgIExfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsKLSAgICAgICAgeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OwotICAgIH0KLQotICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7Ci0gICAgTF90bXAgLT0gKCgqbWVtKSAqIG11KTw8MTsKLSAgICB4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7Ci0KLSAgICAqbWVtID0gdGVtcDsKLQotICAgIHJldHVybjsKLX0KLQotCi12b2lkIFByZWVtcGgyKAotICAgICAgICBXb3JkMTYgeFtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBpbnB1dCBzaWduYWwgb3ZlcndyaXR0ZW4gYnkgdGhlIG91dHB1dCAqLwotICAgICAgICBXb3JkMTYgbXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBRMTUgOiBwcmVlbXBoYXNpcyBjb2VmZmljaWVudCAgICAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSAgICAgOiBsZW5naHQgb2YgZmlsdGVyaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgKiBtZW0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpL28pICAgOiBtZW1vcnkgKHhbLTFdKSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgKQotewotICAgIFdvcmQxNiB0ZW1wOwotICAgIFdvcmQzMiBpLCBMX3RtcDsKLQotICAgIHRlbXAgPSB4W2xnIC0gMV07Ci0KLSAgICBmb3IgKGkgPSAoV29yZDE2KSAobGcgLSAxKTsgaSA+IDA7IGktLSkKLSAgICB7Ci0gICAgICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFtpXSk7Ci0gICAgICAgIExfdG1wIC09ICh4W2kgLSAxXSAqIG11KTw8MTsgLy8gb25seSBjYWxsZWQgd2l0aCBtdSA9PSAyMjI4Miwgc28gdGhpcyB3b24ndCBvdmVyZmxvdwotICAgICAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLyAyKSB7Ci0gICAgICAgICAgICBMX3RtcCA9IElOVDMyX01BWCAvIDI7Ci0gICAgICAgIH0KLSAgICAgICAgTF90bXAgPSAoTF90bXAgPDwgMSk7Ci0gICAgICAgIGlmIChMX3RtcCA+IElOVDMyX01BWCAtIDB4ODAwMCkgewotICAgICAgICAgICAgTF90bXAgPSBJTlQzMl9NQVggLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgeFtpXSA9IChMX3RtcCArIDB4ODAwMCk+PjE2OwotICAgIH0KLQotICAgIExfdG1wID0gTF9kZXBvc2l0X2goeFswXSk7Ci0gICAgTF90bXAgLT0gKCgqbWVtKSAqIG11KTw8MTsKLSAgICBpZiAoTF90bXAgPiBJTlQzMl9NQVggLyAyKSB7Ci0gICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC8gMjsKLSAgICB9Ci0gICAgTF90bXAgPSAoTF90bXAgPDwgMSk7Ci0gICAgaWYgKExfdG1wID4gSU5UMzJfTUFYIC0gMHg4MDAwKSB7Ci0gICAgICAgIExfdG1wID0gSU5UMzJfTUFYIC0gMHg4MDAwOwotICAgIH0KLSAgICB4WzBdID0gKExfdG1wICsgMHg4MDAwKT4+MTY7Ci0KLSAgICAqbWVtID0gdGVtcDsKLQotICAgIHJldHVybjsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvcV9wdWxzZS5jIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGJkZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3NyYy9xX3B1bHNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwMy0yMDEwLCBWaXN1YWxPbiwgSW5jLgotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgIEZpbGU6IHFfcHVsc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICBEZXNjcmlwdGlvbjogQ29kaW5nIGFuZCBkZWNvZGluZyBvZiBhbGdlYnJhaWMgY29kZWJvb2sgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInR5cGVkZWYuaCIKLSNpbmNsdWRlICJiYXNpY19vcC5oIgotI2luY2x1ZGUgInFfcHVsc2UuaCIKLQotI2RlZmluZSBOQl9QT1MgMTYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvcyBpbiB0cmFjaywgbWFzayBmb3Igc2lnbiBiaXQgKi8KLQotV29yZDMyIHF1YW50XzFwX04xKCAgICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gTisxIGJpdHMgICAgICAgICAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvcywgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlICAgICAgICovCi0gICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwotewotICAgIFdvcmQxNiBtYXNrOwotICAgIFdvcmQzMiBpbmRleDsKLQotICAgIG1hc2sgPSAoMSA8PCBOKSAtIDE7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogUXVhbnRpemF0aW9uIG9mIDEgcHVsc2Ugd2l0aCBOKzEgYml0czogICAgICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW5kZXggPSBMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zICYgbWFzaykpOwotICAgIGlmICgocG9zICYgTkJfUE9TKSAhPSAwKQotICAgIHsKLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgTF9kZXBvc2l0X2woMSA8PCBOKSk7ICAgLyogaW5kZXggKz0gMSA8PCBOOyAqLwotICAgIH0KLSAgICByZXR1cm4gKGluZGV4KTsKLX0KLQotCi1Xb3JkMzIgcXVhbnRfMnBfMk4xKCAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiAoMipOKSsxIGJpdHMgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMSAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDIgICAgICovCi0gICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwotewotICAgIFdvcmQxNiBtYXNrLCB0bXA7Ci0gICAgV29yZDMyIGluZGV4OwotICAgIG1hc2sgPSAoMSA8PCBOKSAtIDE7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogUXVhbnRpemF0aW9uIG9mIDIgcHVsc2VzIHdpdGggMipOKzEgYml0czogICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKCgocG9zMiBeIHBvczEpICYgTkJfUE9TKSA9PSAwKQotICAgIHsKLSAgICAgICAgLyogc2lnbiBvZiAxc3QgcHVsc2UgPT0gc2lnbiBvZiAydGggcHVsc2UgKi8KLSAgICAgICAgaWYocG9zMSA8PSBwb3MyKSAgICAgICAgICAvKiAoKHBvczEgLSBwb3MyKSA8PSAwKSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpbmRleCA9ICgocG9zMSAmIG1hc2spIDw8IE4pICsgKHBvczIgJiBtYXNrKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MxICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qICgocG9zMiAmIG1hc2spIDw8IE4pICsgKHBvczEgJiBtYXNrKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9kZXBvc2l0X2woYWRkMSgoKChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw8IE4pLCAoKFdvcmQxNikgKHBvczEgJiBtYXNrKSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHBvczEgJiBOQl9QT1MpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcCA9IChOIDw8IDEpOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDFMIDw8IHRtcCkpOyAgICAgICAvKiBpbmRleCArPSAxIDw8ICgyKk4pOyAqLwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICAvKiBzaWduIG9mIDFzdCBwdWxzZSAhPSBzaWduIG9mIDJ0aCBwdWxzZSAqLwotICAgICAgICBpZiAodm9fc3ViKChXb3JkMTYpIChwb3MxICYgbWFzayksIChXb3JkMTYpIChwb3MyICYgbWFzaykpIDw9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGluZGV4ID0gKChwb3MyICYgbWFzaykgPDwgTikgKyAocG9zMSAmIG1hc2spOyAqLwotICAgICAgICAgICAgaW5kZXggPSBMX2RlcG9zaXRfbChhZGQxKCgoKFdvcmQxNikgKHBvczIgJiBtYXNrKSkgPDwgTiksICgoV29yZDE2KSAocG9zMSAmIG1hc2spKSkpOwotICAgICAgICAgICAgaWYgKChwb3MyICYgTkJfUE9TKSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcCA9IChOIDw8IDEpOyAgICAgICAgICAgLyogaW5kZXggKz0gMSA8PCAoMipOKTsgKi8KLSAgICAgICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoMUwgPDwgdG1wKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpbmRleCA9ICgocG9zMSAmIG1hc2spIDw8IE4pICsgKHBvczIgJiBtYXNrKTsgICAgICovCi0gICAgICAgICAgICBpbmRleCA9IExfZGVwb3NpdF9sKGFkZDEoKCgoV29yZDE2KSAocG9zMSAmIG1hc2spKSA8PCBOKSwgKChXb3JkMTYpIChwb3MyICYgbWFzaykpKSk7Ci0gICAgICAgICAgICBpZiAoKHBvczEgJiBOQl9QT1MpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wID0gKE4gPDwgMSk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKDEgPDwgdG1wKSk7ICAgIC8qIGluZGV4ICs9IDEgPDwgKDIqTik7ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQotV29yZDMyIHF1YW50XzNwXzNOMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDMqTikrMSBiaXRzICAgICAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG5iX3BvczsKLSAgICBXb3JkMzIgaW5kZXg7Ci0KLSAgICBuYl9wb3MgPSgxIDw8KE4gLSAxKSk7ICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PChOLTEpKTsgKi8KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICogUXVhbnRpemF0aW9uIG9mIDMgcHVsc2VzIHdpdGggMypOKzEgYml0czogICAgICAgICAgICAgKgotICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKCgocG9zMSBeIHBvczIpICYgbmJfcG9zKSA9PSAwKQotICAgIHsKLSAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgc3ViKE4sIDEpKTsgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMSwgcG9zMiwgKE4tMSkpOyAqLwotICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOwotICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MzLCBOKSA8PCAoMipOKTsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczMsIE4pPDwoTiA8PCAxKSkpOwotCi0gICAgfSBlbHNlIGlmICgoKHBvczEgXiBwb3MzKSAmIG5iX3BvcykgPT0gMCkKLSAgICB7Ci0gICAgICAgIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIHN1YihOLCAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczMsIChOLTEpKTsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MxICYgbmJfcG9zKSkgPDwgTikpOwotICAgICAgICAvKiBpbmRleCArPSAocG9zMSAmIG5iX3BvcykgPDwgTjsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzFwX04xKHBvczIsIE4pIDw8IChOIDw8IDEpKSk7Ci0gICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvczIsIE4pIDw8Ci0gICAgICAgICAqICgyKk4pOyAqLwotICAgIH0gZWxzZQotICAgIHsKLSAgICAgICAgaW5kZXggPSBxdWFudF8ycF8yTjEocG9zMiwgcG9zMywgKE4gLSAxKSk7ICAgIC8qIGluZGV4ID0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczMsIChOLTEpKTsgKi8KLSAgICAgICAgLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47ICAgICAgICAgICAgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKExfZGVwb3NpdF9sKChXb3JkMTYpIChwb3MyICYgbmJfcG9zKSkgPDwgTikpOwotICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3MxLCBOKSA8PCAoMipOKTsgICAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMXBfTjEocG9zMSwgTikgPDwgKE4gPDwgMSkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQotV29yZDMyIHF1YW50XzRwXzROMSggICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDQqTikrMSBiaXRzICAgICAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczEsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3MyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAyICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMyAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvczQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDQgICAgICovCi0gICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwotewotICAgIFdvcmQxNiBuYl9wb3M7Ci0gICAgV29yZDMyIGluZGV4OwotCi0gICAgbmJfcG9zID0gMSA8PCAoTiAtIDEpOyAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDwoTi0xKSk7ICAqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAgICAgKiBRdWFudGl6YXRpb24gb2YgNCBwdWxzZXMgd2l0aCA0Kk4rMSBiaXRzOiAgICAgICAgICAgICAqCi0gICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAoKChwb3MxIF4gcG9zMikgJiBuYl9wb3MpID09IDApCi0gICAgewotICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCBzdWIoTiwgMSkpOyAgICAvKiBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MyLCAoTi0xKSk7ICovCi0gICAgICAgIC8qIGluZGV4ICs9IChwb3MxICYgbmJfcG9zKSA8PCBOOyAgICAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAoTF9kZXBvc2l0X2woKFdvcmQxNikgKHBvczEgJiBuYl9wb3MpKSA8PCBOKSk7Ci0gICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoMipOKTsgKi8KLSAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzJwXzJOMShwb3MzLCBwb3M0LCBOKSA8PCAoTiA8PCAxKSkpOwotICAgIH0gZWxzZSBpZiAoKChwb3MxIF4gcG9zMykgJiBuYl9wb3MpID09IDApCi0gICAgewotICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MxLCBwb3MzLCAoTiAtIDEpKTsKLSAgICAgICAgLyogaW5kZXggKz0gKHBvczEgJiBuYl9wb3MpIDw8IE47ICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMSAmIG5iX3BvcykpIDw8IE4pKTsKLSAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8ICgyKk4pOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczIsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7Ci0gICAgfSBlbHNlCi0gICAgewotICAgICAgICBpbmRleCA9IHF1YW50XzJwXzJOMShwb3MyLCBwb3MzLCAoTiAtIDEpKTsKLSAgICAgICAgLyogaW5kZXggKz0gKHBvczIgJiBuYl9wb3MpIDw8IE47ICovCi0gICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChMX2RlcG9zaXRfbCgoV29yZDE2KSAocG9zMiAmIG5iX3BvcykpIDw8IE4pKTsKLSAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8ICgyKk4pOyAqLwotICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCAocXVhbnRfMnBfMk4xKHBvczEsIHBvczQsIE4pIDw8IChOIDw8IDEpKSk7Ci0gICAgfQotICAgIHJldHVybiAoaW5kZXgpOwotfQotCi0KLVdvcmQzMiBxdWFudF80cF80TiggICAgICAgICAgICAgICAgICAgICAgICAvKiAobykgcmV0dXJuIDQqTiBiaXRzICAgICAgICAgICAgICovCi0gICAgICAgIFdvcmQxNiBwb3NbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIHBvc2l0aW9uIG9mIHRoZSBwdWxzZSAxLi40ICAqLwotICAgICAgICBXb3JkMTYgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBudW1iZXIgb2YgYml0cyBmb3IgcG9zaXRpb24gKi8KLXsKLSAgICBXb3JkMTYgbmJfcG9zLCBtYXNrIF9fdW51c2VkLCBuXzEsIHRtcDsKLSAgICBXb3JkMTYgcG9zQVs0XSwgcG9zQls0XTsKLSAgICBXb3JkMzIgaSwgaiwgaywgaW5kZXg7Ci0KLSAgICBuXzEgPSAoV29yZDE2KSAoTiAtIDEpOwotICAgIG5iX3BvcyA9ICgxIDw8IG5fMSk7ICAgICAgICAgICAgICAgICAgLyogbmJfcG9zID0gKDE8PG5fMSk7ICovCi0gICAgbWFzayA9IHZvX3N1YigoMSA8PCBOKSwgMSk7ICAgICAgICAgICAgICAvKiBtYXNrID0gKCgxPDxOKS0xKTsgKi8KLQotICAgIGkgPSAwOwotICAgIGogPSAwOwotICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCi0gICAgewotICAgICAgICBpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcG9zQVtpKytdID0gcG9zW2tdOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcG9zQltqKytdID0gcG9zW2tdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChpKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgdG1wID0gdm9fc3ViKChOIDw8IDIpLCAzKTsgICAgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDQqTiktMyk7ICovCi0gICAgICAgICAgICBpbmRleCA9ICgxTCA8PCB0bXApOwotICAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfNHBfNE4xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIHBvc0JbM10sIG5fMSk7ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF80cF80TjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgcG9zQlszXSwgbl8xKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpIDw8ICgoMypuXzEpKzEpOyAqLwotICAgICAgICAgICAgdG1wID0gYWRkMSgoV29yZDE2KSgodm9fTF9tdWx0KDMsIG5fMSkgPj4gMSkpLCAxKTsKLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfMXBfTjEocG9zQVswXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHRtcCA9ICgobl8xIDw8IDEpICsgMSk7ICAgICAgICAgLyogaW5kZXggPSBxdWFudF8ycF8yTjEocG9zQVswXSwgcG9zQVsxXSwgbl8xKSA8PCAoKDIqbl8xKSsxKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSksIHRtcCk7Ci0gICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8IE47ICovCi0gICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCBOKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzFwX04xKHBvc0JbMF0sIG5fMSkpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpbmRleCA9IHF1YW50XzRwXzROMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBwb3NBWzNdLCBuXzEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIGZ1bmN0aW9uIHF1YW50XzRwXzROXG4iKTsKLSAgICB9Ci0gICAgdG1wID0gKChOIDw8IDIpIC0gMik7ICAgICAgICAgICAgICAgLyogaW5kZXggKz0gKGkgJiAzKSA8PCAoKDQqTiktMik7ICovCi0gICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgTF9zaGwoKExfZGVwb3NpdF9sKGkpICYgKDNMKSksIHRtcCkpOwotCi0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQotCi1Xb3JkMzIgcXVhbnRfNXBfNU4oICAgICAgICAgICAgICAgICAgICAgICAgLyogKG8pIHJldHVybiA1Kk4gYml0cyAgICAgICAgICAgICAqLwotICAgICAgICBXb3JkMTYgcG9zW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChpKSBwb3NpdGlvbiBvZiB0aGUgcHVsc2UgMS4uNSAgKi8KLSAgICAgICAgV29yZDE2IE4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgbnVtYmVyIG9mIGJpdHMgZm9yIHBvc2l0aW9uICovCi17Ci0gICAgV29yZDE2IG5iX3Bvcywgbl8xLCB0bXA7Ci0gICAgV29yZDE2IHBvc0FbNV0sIHBvc0JbNV07Ci0gICAgV29yZDMyIGksIGosIGssIGluZGV4LCB0bXAyOwotCi0gICAgbl8xID0gKFdvcmQxNikgKE4gLSAxKTsKLSAgICBuYl9wb3MgPSAoMSA8PCBuXzEpOyAgICAgICAgICAgICAgICAgIC8qIG5iX3BvcyA9ICgxPDxuXzEpOyAqLwotCi0gICAgaSA9IDA7Ci0gICAgaiA9IDA7Ci0gICAgZm9yIChrID0gMDsgayA8IDU7IGsrKykKLSAgICB7Ci0gICAgICAgIGlmICgocG9zW2tdICYgbmJfcG9zKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NBW2krK10gPSBwb3Nba107Ci0gICAgICAgIH0gZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwb3NCW2orK10gPSBwb3Nba107Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGkpCi0gICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB0bXAgPSB2b19zdWIoKFdvcmQxNikoKHZvX0xfbXVsdCg1LCBOKSA+PiAxKSksIDEpOyAgICAgICAgLyogKCg1Kk4pLTEpKSAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobCgxTCwgdG1wKTsgICAvKiBpbmRleCA9IDEgPDwgKCg1Kk4pLTEpOyAqLwotICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCAoKDIqTikrMSk7Ki8KLSAgICAgICAgICAgIHRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0JbM10sIHBvc0JbNF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NCWzRdLCBOKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB0bXAgPSB2b19zdWIoKFdvcmQxNikoKHZvX0xfbXVsdCg1LCBOKSA+PiAxKSksIDEpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNSpOKS0xKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwoMUwsIHRtcCk7Ci0gICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAvKiBpbmRleCArPSBxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSA8PCgoMipOKSsxKTsgICovCi0gICAgICAgICAgICB0bXAyID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSksIHRtcCk7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCB0bXAyKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzNdLCBwb3NBWzBdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlszXSwgcG9zQVswXSwgTik7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdG1wID0gdm9fc3ViKChXb3JkMTYpKCh2b19MX211bHQoNSwgTikgPj4gMSkpLCAxKTsgICAgICAgIC8qICgoNSpOKS0xKSkgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwoMUwsIHRtcCk7ICAgICAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNSpOKS0xKTsgKi8KLSAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfM3BfM04xKHBvc0JbMF0sIHBvc0JbMV0sIHBvc0JbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8KLSAgICAgICAgICAgIHRtcDIgPSBMX3NobChxdWFudF8zcF8zTjEocG9zQlswXSwgcG9zQlsxXSwgcG9zQlsyXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHRtcDIpOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBOKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB0bXAgPSBhZGQxKChOIDw8IDEpLCAxKTsgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgyKk4pKzEpOyAgKi8KLSAgICAgICAgICAgIGluZGV4ID0gTF9zaGwocXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSksIHRtcCk7Ci0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgTikpOyAgICAgICAgLyogaW5kZXggKz0gcXVhbnRfMnBfMk4xKHBvc0JbMF0sIHBvc0JbMV0sIE4pOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHRtcCA9IGFkZDEoKE4gPDwgMSksIDEpOyAgICAgICAgICAgLyogaW5kZXggPSBxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSA8PCAoKDIqTikrMSk7ICAqLwotICAgICAgICAgICAgaW5kZXggPSBMX3NobChxdWFudF8zcF8zTjEocG9zQVswXSwgcG9zQVsxXSwgcG9zQVsyXSwgbl8xKSwgdG1wKTsKLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NCWzBdLCBOKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQVszXSwgcG9zQlswXSwgTik7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgdG1wID0gYWRkMSgoTiA8PCAxKSwgMSk7ICAgICAgICAgICAvKiBpbmRleCA9IHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8ICgoMipOKSsxKTsgICovCi0gICAgICAgICAgICBpbmRleCA9IExfc2hsKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpLCB0bXApOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbM10sIHBvc0FbNF0sIE4pKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzNdLCBwb3NBWzRdLCBOKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbiBmdW5jdGlvbiBxdWFudF81cF81TlxuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIChpbmRleCk7Ci19Ci0KLQotV29yZDMyIHF1YW50XzZwXzZOXzIoICAgICAgICAgICAgICAgICAgICAgIC8qIChvKSByZXR1cm4gKDYqTiktMiBiaXRzICAgICAgICAgKi8KLSAgICAgICAgV29yZDE2IHBvc1tdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaSkgcG9zaXRpb24gb2YgdGhlIHB1bHNlIDEuLjYgICovCi0gICAgICAgIFdvcmQxNiBOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGkpIG51bWJlciBvZiBiaXRzIGZvciBwb3NpdGlvbiAqLwotewotICAgIFdvcmQxNiBuYl9wb3MsIG5fMTsKLSAgICBXb3JkMTYgcG9zQVs2XSwgcG9zQls2XTsKLSAgICBXb3JkMzIgaSwgaiwgaywgaW5kZXg7Ci0KLSAgICAvKiAhISAgTiBhbmQgbl8xIGFyZSBjb25zdGFudHMgLT4gaXQgZG9lc24ndCBuZWVkIHRvIGJlIG9wZXJhdGVkIGJ5IEJhc2ljIE9wZXJhdG9ycyAqLwotICAgIG5fMSA9IChXb3JkMTYpIChOIC0gMSk7Ci0gICAgbmJfcG9zID0gKDEgPDwgbl8xKTsgICAgICAgICAgICAgICAgICAvKiBuYl9wb3MgPSAoMTw8bl8xKTsgKi8KLQotICAgIGkgPSAwOwotICAgIGogPSAwOwotICAgIGZvciAoayA9IDA7IGsgPCA2OyBrKyspCi0gICAgewotICAgICAgICBpZiAoKHBvc1trXSAmIG5iX3BvcykgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcG9zQVtpKytdID0gcG9zW2tdOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcG9zQltqKytdID0gcG9zW2tdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoIChpKQotICAgIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgaW5kZXggPSAoMSA8PCAoV29yZDE2KSAoNiAqIE4gLSA1KSk7ICAgICAgICAvKiBpbmRleCA9IDEgPDwgKCg2Kk4pLTUpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzVwXzVOKHBvc0IsIG5fMSkgPDwgTikpOyAvKiBpbmRleCArPSBxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE47ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NCWzVdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0JbNV0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaW5kZXggPSAoMUwgPDwgKFdvcmQxNikgKDYgKiBOIC0gNSkpOyAgICAgICAgLyogaW5kZXggPSAxIDw8ICgoNipOKS01KTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIChxdWFudF81cF81Tihwb3NCLCBuXzEpIDw8IE4pKTsgLyogaW5kZXggKz0gcXVhbnRfNXBfNU4ocG9zQiwgbl8xKSA8PCBOOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQVswXSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NBWzBdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGluZGV4ID0gKDFMIDw8IChXb3JkMTYpICg2ICogTiAtIDUpKTsgICAgICAgIC8qIGluZGV4ID0gMSA8PCAoKDYqTiktNSk7ICovCi0gICAgICAgICAgICAvKiBpbmRleCArPSBxdWFudF80cF80Tihwb3NCLCBuXzEpIDw8ICgoMipuXzEpKzEpOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgKHF1YW50XzRwXzROKHBvc0IsIG5fMSkgPDwgKFdvcmQxNikgKDIgKiBuXzEgKyAxKSkpOwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMnBfMk4xKHBvc0FbMF0sIHBvc0FbMV0sIG5fMSkpOyAgICAgIC8qIGluZGV4ICs9IHF1YW50XzJwXzJOMShwb3NBWzBdLCBwb3NBWzFdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGluZGV4ID0gKHF1YW50XzNwXzNOMShwb3NBWzBdLCBwb3NBWzFdLCBwb3NBWzJdLCBuXzEpIDw8IChXb3JkMTYpICgzICogbl8xICsgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ID0gcXVhbnRfM3BfM04xKHBvc0FbMF0sIHBvc0FbMV0sIHBvc0FbMl0sIG5fMSkgPDwgKCgzKm5fMSkrMSk7ICovCi0gICAgICAgICAgICBpbmRleCA9dm9fTF9hZGQoaW5kZXgsIHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzNwXzNOMShwb3NCWzBdLCBwb3NCWzFdLCBwb3NCWzJdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGkgPSAyOwotICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfNHBfNE4ocG9zQSwgbl8xKSA8PCAoV29yZDE2KSAoMiAqIG5fMSArIDEpKTsgIC8qIGluZGV4ID0gcXVhbnRfNHBfNE4ocG9zQSwgbl8xKSA8PCAoKDIqbl8xKSsxKTsgKi8KLSAgICAgICAgICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsIHF1YW50XzJwXzJOMShwb3NCWzBdLCBwb3NCWzFdLCBuXzEpKTsgICAgICAvKiBpbmRleCArPSBxdWFudF8ycF8yTjEocG9zQlswXSwgcG9zQlsxXSwgbl8xKTsgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICBpID0gMTsKLSAgICAgICAgICAgIGluZGV4ID0gKHF1YW50XzVwXzVOKHBvc0EsIG5fMSkgPDwgTik7ICAgICAgIC8qIGluZGV4ID0gcXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOOyAqLwotICAgICAgICAgICAgaW5kZXggPSB2b19MX2FkZChpbmRleCwgcXVhbnRfMXBfTjEocG9zQlswXSwgbl8xKSk7ICAgICAgICAvKiBpbmRleCArPSBxdWFudF8xcF9OMShwb3NCWzBdLCBuXzEpOyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgaW5kZXggPSAocXVhbnRfNXBfNU4ocG9zQSwgbl8xKSA8PCBOKTsgICAgICAgLyogaW5kZXggPSBxdWFudF81cF81Tihwb3NBLCBuXzEpIDw8IE47ICovCi0gICAgICAgICAgICBpbmRleCA9IHZvX0xfYWRkKGluZGV4LCBxdWFudF8xcF9OMShwb3NBWzVdLCBuXzEpKTsgICAgICAgIC8qIGluZGV4ICs9IHF1YW50XzFwX04xKHBvc0FbNV0sIG5fMSk7ICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgaW4gZnVuY3Rpb24gcXVhbnRfNnBfNk5fMlxuIik7Ci0gICAgfQotICAgIGluZGV4ID0gdm9fTF9hZGQoaW5kZXgsICgoTF9kZXBvc2l0X2woaSkgJiAzTCkgPDwgKFdvcmQxNikgKDYgKiBOIC0gNCkpKTsgICAvKiBpbmRleCArPSAoaSAmIDMpIDw8ICgoNipOKS00KTsgKi8KLQotICAgIHJldHVybiAoaW5kZXgpOwotfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQyYmM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIkFtcndiRW5jb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotCi0gICAgc3JjczogWwotICAgICAgICAiQW1yd2JFbmNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYnNuZGZpbGUiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IDBiYjZiYjAuLjFjMmY5YmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNiw2ICsyNSw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGNvbmZpZzogeworICAgICAgICAgICAgY2ZpX2Fzc2VtYmx5X3N1cHBvcnQ6IHRydWUsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IDVhNGIyZjguLjM4OTFmMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtNzI0LDYgKzcyNCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAppbmRleCA5ODAyNjFjLi41ODYwODhjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2VuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApAQCAtMTAsNiArMTksOSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBjb25maWc6IHsKKyAgICAgICAgICAgIGNmaV9hc3NlbWJseV9zdXBwb3J0OiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCmluZGV4IDlkYjY0NjUuLjAxMTc0YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcApAQCAtMTUwNyw2ICsxNTA3LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCmluZGV4IDI2MGE2MGEuLjA4NjkxZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19jb21tb25fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2NvbW1vbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKQEAgLTE0LDQgKzMzLDExIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDA2NDc1MS4uZDA2ZTBiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19mbGFjX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZmxhY19kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKaW5kZXggODQyYTdjZS4uZDY0NDhkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAKQEAgLTQ5MSw2ICs0OTEsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCmluZGV4IGYzNWJjZTEuLjU5YTQ2NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZmxhY19lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2ZsYWNfZW5jX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IDA3OGM4ZTMuLjI0MjE2YTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC01OTIsNiArNTkyLDcgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCBmNTM1N2Y0Li4xZGMzNGMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX2c3MTFfZGVjX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2NvZGVjc19nNzExX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggODc3Y2I1YS4uZmU5MTUxMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0zODIsNiArMzgyLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKaW5kZXggNTY3MmQ4OS4uZWZhMmY4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZ3NtX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfZ3NtX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZ3NtZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCmluZGV4IGQ3NzcyMjkuLjMzMGNiOGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uY3BwCkBAIC0zNTQsNiArMzU0LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCmluZGV4IGVmODY5MTUuLmQ1ODg1YTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKQEAgLTIwLDkgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50Lmg+CiAKLWV4dGVybiAiQyIgewogI2luY2x1ZGUgImdzbS5oIgotfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCmluZGV4IGVjNDM2Y2UuLjJjNDA5MWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNyw2ICsyNiw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIGNvbmZpZzogeworICAgICAgICAgICAgY2ZpX2Fzc2VtYmx5X3N1cHBvcnQ6IHRydWUsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIC8vIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBjdXJyZW50IGFzbSBnZW5lcmF0ZXMgdGhlIGZvbGxvd2luZyBsaW5rIGVycm9yOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCmluZGV4IGY2YWUxZjQuLjE3NmRhNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKQEAgLTcxMyw2ICs3MTMsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvVEVTVF9NQVBQSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQyODQ3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9URVNUX01BUFBJTkcKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMKLXsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50Ci0KLSAgICAvLyB0aGUgZGVjb2RlciByZXBvcnRzIHNvbWV0aGluZyBiYWQgYWJvdXQgYW4gdW5leHBlY3RlZCBuZXdsaW5lIGluIHRoZSAqY29uZmlnIGZpbGUKLSAgICAvLyBhbmQgdGhlIGNvbmZpZyBmaWxlIGxvb2tzIGxpa2UgdGhlIEFuZHJvaWRUZXN0LnhtbCBmaWxlIHRoYXQgd2UgcHV0IGluIHRoZXJlLgotICAgIC8vIEkgZG9uJ3QgZ2V0IHRoaXMgZnJvbSB0aGUgRW5jb2RlciAtLSBhbmQgSSBkb24ndCBzZWUgYW55IHN1YnN0YW50aXZlIGRpZmZlcmVuY2UKLSAgICAvLyBiZXR3ZWVuIGRlY29kZSBhbmQgZW5jb2RlIEFuZHJvaWRUZXN0LnhtbCBmaWxlcyAtLSBleGNlcHQgdGhhdCBlbmNvZGUgZG9lcyBOT1QKLSAgICAvLyBmaW5pc2ggd2l0aCBhIG5ld2xpbmUuCi0gICAgLy8gc3RyYW5nZS4KLSAgICAvLyB7ICJuYW1lIjogIk1wZWc0SDI2M0RlY29kZXJUZXN0In0sCi0gICAgLy8geyAibmFtZSI6ICJNcGVnNEgyNjNFbmNvZGVyVGVzdCJ9Ci0KLSAgXQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDQzMDM1NjUuLjcyNWM3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsODAgKzEsMTkgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKLSAgICBdLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKIAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcCIsCi0gICAgICAgICJzcmMvYml0c3RyZWFtLmNwcCIsCi0gICAgICAgICJzcmMvYmxvY2tfaWRjdC5jcHAiLAotICAgICAgICAic3JjL2NhbF9kY19zY2FsZXIuY3BwIiwKLSAgICAgICAgInNyYy9jaHZyX2ZpbHRlci5jcHAiLAotICAgICAgICAic3JjL2Nodl9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9jb21iaW5lZF9kZWNvZGUuY3BwIiwKLSAgICAgICAgInNyYy9jb25jZWFsLmNwcCIsCi0gICAgICAgICJzcmMvZGF0YXBhcnRfZGVjb2RlLmNwcCIsCi0gICAgICAgICJzcmMvZGNhY19wcmVkaWN0aW9uLmNwcCIsCi0gICAgICAgICJzcmMvZGVjX3ByZWRfaW50cmFfZGMuY3BwIiwKLSAgICAgICAgInNyYy9kZXJpbmdpbmdfY2hyb21hLmNwcCIsCi0gICAgICAgICJzcmMvZGVyaW5naW5nX2x1bWEuY3BwIiwKLSAgICAgICAgInNyYy9maW5kX21pbl9tYXguY3BwIiwKLSAgICAgICAgInNyYy9nZXRfcHJlZF9hZHZfYl9hZGQuY3BwIiwKLSAgICAgICAgInNyYy9nZXRfcHJlZF9vdXRzaWRlLmNwcCIsCi0gICAgICAgICJzcmMvaWRjdC5jcHAiLAotICAgICAgICAic3JjL2lkY3RfdmNhLmNwcCIsCi0gICAgICAgICJzcmMvbWJfbW90aW9uX2NvbXAuY3BwIiwKLSAgICAgICAgInNyYy9tYl91dGlscy5jcHAiLAotICAgICAgICAic3JjL3BhY2tldF91dGlsLmNwcCIsCi0gICAgICAgICJzcmMvcG9zdF9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcCIsCi0gICAgICAgICJzcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAiLAotICAgICAgICAic3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcCIsCi0gICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCi0gICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKLSAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCi0gICAgICAgICJzcmMvdmxjX2RlcXVhbnQuY3BwIiwKLSAgICAgICAgInNyYy92bGNfdGFiLmNwcCIsCi0gICAgICAgICJzcmMvdm9wLmNwcCIsCi0gICAgICAgICJzcmMvemlnemFnX3RhYi5jcHAiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIKLSAgICBdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE1QRUc0LmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IDYwNzUwZDkuLmE0YjNlMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTQxMiw2ICs0MTIsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0MDRjZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaWZuZGVmIF9NUDRERUNfQVBJX0hfCi0jZGVmaW5lIF9NUDRERUNfQVBJX0hfCi0KLSNpbmNsdWRlICJtNHZoMjYzX2RlY29kZXJfcHZfdHlwZXMuaCIKLQotLy8gI2RlZmluZSBQVl9UT0xFUkFURV9WT0xfRVJST1JTCi0jZGVmaW5lIFBWX01FTU9SWV9QT09MCi0KLSNpZm5kZWYgX1BWX1RZUEVTXwotI2RlZmluZSBfUFZfVFlQRVNfCi0KLXR5cGVkZWYgdWludCBCb29sOwotCi0jZGVmaW5lIFBWX0NPREVDX0lOSVQgIDAKLSNkZWZpbmUgUFZfQ09ERUNfU1RPUCAgMQotI2VuZGlmCi0KLSNkZWZpbmUgUFZfVFJVRSAgMQotI2RlZmluZSBQVl9GQUxTRSAwCi0KLSNpZm5kZWYgT1NDTF9JTVBPUlRfUkVGCi0jZGVmaW5lIE9TQ0xfSU1QT1JUX1JFRiAvKiBlbXB0eSAqLwotI2VuZGlmCi0jaWZuZGVmIE9TQ0xfRVhQT1JUX1JFRgotI2RlZmluZSBPU0NMX0VYUE9SVF9SRUYgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0vKiBmbGFnIGZvciBwb3N0LXByb2Nlc3NpbmcgIDQvMjUvMDAgKi8KLQotI2lmZGVmIERFQ19OT1BPU1RQUk9DCi0jdW5kZWYgUFZfUE9TVFBST0NfT04gICAvKiBlbmFibGUgY29tcGlsYXRpb24gb2YgcG9zdC1wcm9jZXNzaW5nIGNvZGUgKi8KLSNlbHNlCi0jZGVmaW5lIFBWX1BPU1RQUk9DX09OCi0jZW5kaWYKLQotI2RlZmluZSBQVl9OT19QT1NUX1BST0MgMAotI2RlZmluZSBQVl9ERUJMT0NLIDEKLSNkZWZpbmUgUFZfREVSSU5HICAyCi0KLQotCi0jaW5jbHVkZSAidmlzdWFsX2hlYWRlci5oIiAvLyBzdHJ1Y3QgVm9sSW5mbyBpcyBkZWZpbmVkCi0KLQotLyoqQG5hbWUgU3RydWN0dXJlIGFuZCBEYXRhIFR5cGVzCi0gKiBUaGVzZSB0eXBlIGRlZmluaXRpb25zIHNwZWNpZnkgdGhlIGlucHV0IC8gb3V0cHV0IGZyb20gdGhlIFBWTWVzc2FnZQotICogbGlicmFyeS4KLSAqLwotCi0vKkB7Ki8KLS8qIFRoZSBhcHBsaWNhdGlvbiBoYXMgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB0YWdPdXRwdXRGcmFtZQotewotICAgIHVpbnQ4ICAgICAgICpkYXRhOyAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dHB1dCBZVVYgYnVmZmVyICovCi0gICAgdWludDMyICAgICAgdGltZVN0YW1wOyAgICAgIC8qIHRpbWUgc3RhbXAgKi8KLX0gT3V0cHV0RnJhbWU7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ0FwcGxpY2F0aW9uRGF0YQotewotICAgIGludCBsYXllcjsgICAgICAgICAgLyogY3VycmVudCB2aWRlbyBsYXllciAqLwotICAgIHZvaWQgKm9iamVjdDsgICAgICAgLyogc29tZSBvcHRpb25hbCBkYXRhIGZpZWxkICovCi19IGFwcGxpY2F0aW9uRGF0YTsKLQotLyogQXBwbGljYXRpb24gY29udHJvbHMsIHRoaXMgc3RydWN0ZWQgc2hhbGwgYmUgYWxsb2NhdGVkICovCi0vKiAgICBhbmQgaW5pdGlhbGl6ZWQgaW4gdGhlIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgKi8KLXR5cGVkZWYgc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHMKLXsKLSAgICAvKiBUaGUgZm9sbG93aW5nIGZ1Y250aW9uIHBvaW50ZXIgaXMgY29waWVkIHRvIEJpdHN0cmVhbURlY1ZpZGVvIHN0cnVjdHVyZSAgKi8KLSAgICAvKiAgICB1cG9uIGluaXRpYWxpemF0aW9uIGFuZCBuZXZlciB1c2VkIGFnYWluLiAqLwotICAgIGludCAoKnJlYWRCaXRzdHJlYW1EYXRhKSh1aW50OCAqYnVmLCBpbnQgbmJ5dGVzX3JlcXVpcmVkLCB2b2lkICphcHBEYXRhKTsKLSAgICBhcHBsaWNhdGlvbkRhdGEgYXBwRGF0YTsKLQotICAgIHVpbnQ4ICpvdXRwdXRGcmFtZTsKLSAgICB2b2lkICp2aWRlb0RlY29kZXJEYXRhOyAgICAgLyogdGhpcyBpcyBhbiBpbnRlcm5hbCBwb2ludGVyIHRoYXQgaXMgb25seSB1c2VkICovCi0gICAgLyogaW4gdGhlIGRlY29kZXIgbGlicmFyeS4gICAqLwotI2lmZGVmIFBWX01FTU9SWV9QT09MCi0gICAgaW50MzIgc2l6ZTsKLSNlbmRpZgotICAgIGludCBuTGF5ZXJzOwotICAgIC8qIHBvaW50ZXJzIHRvIFZPTCBkYXRhIGZvciBmcmFtZS1iYXNlZCBkZWNvZGluZy4gKi8KLSAgICB1aW50OCAqdm9sYnVmWzJdOyAgICAgICAgICAgLyogbWF4aW11bSBvZiAyIGxheWVycyBmb3Igbm93ICovCi0gICAgaW50MzIgdm9sYnVmX3NpemVbMl07Ci0KLX0gVmlkZW9EZWNDb250cm9sczsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgSDI2M19NT0RFID0gMCwgTVBFRzRfTU9ERSwgVU5LTk9XTl9NT0RFCi19IE1QNERlY29kaW5nTW9kZTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgTVA0X0lfRlJBTUUsIE1QNF9QX0ZSQU1FLCBNUDRfQl9GUkFNRSwgTVA0X0JBRF9GUkFNRQotfSBNUDRGcmFtZVR5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ1ZvcEhlYWRlckluZm8KLXsKLSAgICBpbnQgICAgIGN1cnJMYXllcjsKLSAgICB1aW50MzIgIHRpbWVzdGFtcDsKLSAgICBNUDRGcmFtZVR5cGUgICAgZnJhbWVUeXBlOwotICAgIGludCAgICAgcmVmU2VsQ29kZTsKLSAgICBpbnQxNiAgICAgICBxdWFudGl6ZXI7Ci19IFZvcEhlYWRlckluZm87Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBWaWRlb1JlZkNvcHlJbmZvOgotICogT01BUCBEU1Agc3BlY2lmaWMgdHlwZWRlZiBzdHJ1Y3R1cmUsIHRvIHN1cHBvcnQgdGhlIHVzZXIgKEFSTSkgY29weWluZwotICogb2YgYSBSZWZlcmVuY2UgRnJhbWUgaW50byB0aGUgVmlkZW8gRGVjb2Rlci4KLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3QgdGFnVmlkZW9SZWZDb3B5SW5mb1B0cgotewotICAgIHVpbnQ4ICAgKnlDaGFuOyAgICAgICAgICAgICAvKiBUaGUgWSBjb21wb25lbnQgZnJhbWUgdGhlIHVzZXIgY2FuIGNvcHkgYSBuZXcgcmVmZXJlbmNlIHRvICovCi0gICAgdWludDggICAqdUNoYW47ICAgICAgICAgICAgIC8qIFRoZSBVIGNvbXBvbmVudCBmcmFtZSB0aGUgdXNlciBjYW4gY29weSBhIG5ldyByZWZlcmVuY2UgdG8gKi8KLSAgICB1aW50OCAgICp2Q2hhbjsgICAgICAgICAgICAgLyogVGhlIFYgY29tcG9uZW50IGZyYW1lIHRoZSB1c2VyIGNhbiBjb3B5IGEgbmV3IHJlZmVyZW5jZSB0byAqLwotICAgIHVpbnQ4ICAgKmN1cnJlbnRWb3A7ICAgICAgICAvKiBUaGUgVm9wIGZvciB2aWRlbyB0aGUgdXNlciBjYW4gY29weSBhIG5ldyByZWZlcmVuY2UgdG8gKi8KLX0gVmlkZW9SZWZDb3B5SW5mb1B0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgdGFnVmlkZW9SZWZDb3B5SW5mb0RhdGEKLXsKLSAgICBpbnQxNiAgIHdpZHRoOyAgICAgICAgICAgICAgLyogV2lkdGggKi8KLSAgICBpbnQxNiAgIGhlaWdodDsgICAgICAgICAgICAgLyogSGVpZ2h0ICovCi0gICAgaW50MTYgICByZWFsV2lkdGg7ICAgICAgICAgIC8qIE5vbi1wYWRkZWQgd2lkdGgsIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAqLwotICAgIGludDE2ICAgcmVhbEhlaWdodDsgICAgICAgICAvKiBOb24tcGFkZGVkIGhlaWdodCwgbm90IGEgbXVsdGlwbGUgb2YgMTYuICovCi19IFZpZGVvUmVmQ29weUluZm9EYXRhOwotCi10eXBlZGVmIHN0cnVjdCB0YWdWaWRlb1JlZkNvcHlJbmZvCi17Ci0gICAgVmlkZW9SZWZDb3B5SW5mb0RhdGEgZGF0YTsKLSAgICBWaWRlb1JlZkNvcHlJbmZvUHRyIHB0cnM7Ci19IFZpZGVvUmVmQ29weUluZm87Ci0KLS8qQH0qLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotCi0KLSAgICBPU0NMX0lNUE9SVF9SRUYgQm9vbCAgICBQVkluaXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnZvbGJ1ZltdLCBpbnQzMiAqdm9sYnVmX3NpemUsIGludCBuTGF5ZXJzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIE1QNERlY29kaW5nTW9kZSBtb2RlKTsKLSAgICBCb29sICAgIFBWQWxsb2NWaWRlb0RhdGEoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbkxheWVycyk7Ci0gICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOwotICAgIEJvb2wgICAgUFZSZXNldFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVlNldFJlZmVyZW5jZVlVVihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWKTsKLSAgICBCb29sICAgIFBWRGVjU2V0UmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsIHVpbnQzMiB0aW1lc3RhbXApOwotICAgIEJvb2wgICAgUFZEZWNTZXRFbmhSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgdWludDMyIHRpbWVzdGFtcCk7Ci0gICAgT1NDTF9JTVBPUlRfUkVGIEJvb2wgICAgUFZEZWNvZGVWaWRlb0ZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpiaXRzdHJlYW1bXSwgdWludDMyICp0aW1lc3RhbXAsIGludDMyICpidWZmZXJfc2l6ZSwgdWludCB1c2VfZXh0X3RpbWVzdGFtcFtdLCB1aW50OCogY3VycllVVik7Ci0gICAgQm9vbCAgICBQVkRlY29kZVZvcEhlYWRlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqYnVmZmVyW10sIHVpbnQzMiB0aW1lc3RhbXBbXSwgaW50MzIgYnVmZmVyX3NpemVbXSwgVm9wSGVhZGVySW5mbyAqaGVhZGVyX2luZm8sIHVpbnQgdXNlX2V4dF90aW1lc3RhbXBbXSwgdWludDggKmN1cnJZVVYpOwotICAgIEJvb2wgICAgUFZEZWNvZGVWb3BCb2R5KFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyIGJ1ZmZlcl9zaXplW10pOwotICAgIHZvaWQgICAgUFZEZWNQb3N0UHJvY2VzcyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqb3V0cHV0WVVWKTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQzMiAqZGlzcGxheV93aWR0aCwgaW50MzIgKmRpc3BsYXlfaGVpZ2h0KTsKLSAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgKmJ1Zl93aWR0aCwgaW50MzIgKmJ1Zl9oZWlnaHQpOwotICAgIE9TQ0xfSU1QT1JUX1JFRiB2b2lkICAgIFBWU2V0UG9zdFByb2NUeXBlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCBtb2RlKTsKLSAgICB1aW50MzIgIFBWR2V0VmlkZW9UaW1lU3RhbXAoVmlkZW9EZWNDb250cm9scyAqZGVjb2RlckNvbnRyb2wpOwotICAgIGludCAgICAgUFZHZXREZWNCaXRyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpOwotICAgIGludCAgICAgUFZHZXREZWNGcmFtZXJhdGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7Ci0gICAgdWludDggICAqUFZHZXREZWNPdXRwdXRGcmFtZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICBpbnQgICAgIFBWR2V0TGF5ZXJJRChWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKTsKLSAgICBpbnQzMiAgIFBWR2V0RGVjTWVtb3J5VXNhZ2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7Ci0gICAgT1NDTF9JTVBPUlRfUkVGIE1QNERlY29kaW5nTW9kZSBQVkdldERlY0JpdHN0cmVhbU1vZGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCk7Ci0gICAgQm9vbCAgICBQVkV4dHJhY3RWb2xIZWFkZXIodWludDggKnZpZGVvX2J1ZmZlciwgdWludDggKnZvbF9oZWFkZXIsIGludDMyICp2b2xfaGVhZGVyX3NpemUpOwotICAgIGludDMyICAgUFZMb2NhdGVGcmFtZUhlYWRlcih1aW50OCAqdmlkZW9fYnVmZmVyLCBpbnQzMiB2b3Bfc2l6ZSk7Ci0gICAgaW50MzIgICBQVkxvY2F0ZUgyNjNGcmFtZUhlYWRlcih1aW50OCAqdmlkZW9fYnVmZmVyLCBpbnQzMiB2b3Bfc2l6ZSk7Ci0gICAgQm9vbCAgICBQVkdldFZvbEluZm8oVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgVm9sSW5mbyAqcFZvbEluZm8pOyAvLyBCWCA2LzI0LzA0Ci0gICAgQm9vbCAgICBJc0ludHJhRnJhbWUoVmlkZW9EZWNDb250cm9scyAqZGVjb2RlckNvbnRyb2wpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmIC8qIF9NUDRERUNfQVBJX0hfICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNzYxZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0KLSBEZXNjcmlwdGlvbjogU2VwYXJhdGVkIG1vZHVsZXMgaW50byBvbmUgZnVuY3Rpb24gcGVyIGZpbGUgYW5kIHB1dCBpbnRvCi0gICAgbmV3IHRlbXBsYXRlLgotCi0gRGVzY3JpcHRpb246IE9wdGltaXppbmcgQyBjb2RlIGFuZCBhZGRpbmcgY29tbWVudHMuICBBbHNvIGNoYW5naW5nIHZhcmlhYmxlCi0gICAgbmFtZXMgdG8gbWFrZSB0aGVtIG1vcmUgbWVhbmluZ2Z1bC4KLQotIFdobzogICAgICAgICAgICAgICAgICAgRGF0ZToKLSBEZXNjcmlwdGlvbjoKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotCi0gICAgUmVjX1kgPSBwb2ludGVyIHRvIDB0aCBwb3NpdGlvbiBpbiBidWZmZXIgY29udGFpbmluZyBsdW1pbmFuY2UgdmFsdWVzCi0gICAgICAgIG9mIHR5cGUgdWludDguCi0gICAgeV9zdGFydCA9IHZhbHVlIG9mIHkgY29vcmRpbmF0ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgZmlyc3QKLSAgICAgICAgcm93IG9mIHBpeGVscyB0byBiZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHhfc3RhcnQgPSB2YWx1ZSBvZiB4IGNvb3JkaW5hdGUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIGZpcnN0Ci0gICAgICAgIGNvbHVtbiBvZiBwaXhlbHMgdG8gYmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB5X2Jsa19zdGFydCA9IHZhbHVlIG9mIHRoZSB5IGNvb3JkaW5hdGUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlCi0gICAgICAgIHJvdyBvZiBwaXhlbHMgd2hpY2ggY29udGFpbnMgdGhlIHN0YXJ0IG9mIGEgYmxvY2suIFRoZSByb3cKLSAgICAgICAgc3BlY2lmaWVkIGJ5IHlfYmxrX3N0YXJ0K0JMS19TSVpFIGlzIHRoZSBsYXN0IHJvdyBvZiBwaXhlbHMKLSAgICAgICAgdGhhdCBhcmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB4X2Jsa19zdGFydCA9IHZhbHVlIG9mIHRoZSB4IGNvb3JkaW5hdGUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlCi0gICAgICAgIGNvbHVtbiBvZiBwaXhlbHMgd2hpY2ggY29udGFpbnMgdGhlIHN0YXJ0IG9mIGEgYmxvY2suICBUaGUKLSAgICAgICAgY29sdW1uIHNwZWNpZmllZCBieSB4X2Jsa19zdGFydCtCTEtfU0laRSBpcyB0aGUgbGFzdCBjb2x1bW4gb2YKLSAgICAgICAgcGl4ZWxzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgdGhyID0gdmFsdWUgb2YgdHlwZSBpbnQgdGhhdCBpcyBjb21wYXJlZCB0byB0aGUgZWxlbWVudHMgaW4gUmVjX1kgdG8KLSAgICAgICAgZGV0ZXJtaW5lIGlmIGEgcGFydGljdWxhciB2YWx1ZSBpbiBSZWNfWSB3aWxsIGJlIG1vZGlmaWVkIGJ5Ci0gICAgICAgIHRoZSBmaWx0ZXIgb3Igbm90Ci0gICAgd2lkdGggPSB2YWx1ZSBvZiB0eXBlIGludCB0aGF0IHNwZWNpZmllcyB0aGUgd2lkdGggb2YgdGhlIGRpc3BsYXkKLSAgICAgICAgaW4gcGl4ZWxzIChvciBwZWxzLCBlcXVpdmFsZW50bHkpLgotICAgIG1heF9kaWZmID0gdmFsdWUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIGFkZGVkCi0gICAgICAgIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcGl4ZWwgaW4gUmVjX1kgdGhhdCBpcyBiZWluZyBmaWx0ZXJlZAotICAgICAgICBpZiB0aGUgZmlsdGVyIGFsZ29yaXRobSBkZWNpZGVzIHRvIGNoYW5nZSB0aGF0IHBhcnRpY3VsYXIKLSAgICAgICAgcGl4ZWwncyBsdW1pbmFuY2UgdmFsdWUuCi0KLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIE91dHB1dHM6Ci0gICAgTm9uZQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgQnVmZmVyIHBvaW50ZWQgdG8gYnkgUmVjX1kgaXMgbW9kaWZpZWQgd2l0aCB0aGUgZmlsdGVyZWQKLSAgICBsdW1pbmFuY2UgdmFsdWVzLgotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGEgbW90aW9uIGNvbXBlbnNhdGVkIG5vaXNlIGZpbHRlciB1c2luZyBhZGFwdGl2ZQotIHdlaWdodGVkIGF2ZXJhZ2luZyBvZiBsdW1pbmFuY2UgdmFsdWVzLiAgKlJlY19ZIGNvbnRhaW5zIHRoZSBsdW1pbmFuY2UgdmFsdWVzCi0gdGhhdCBhcmUgYmVpbmcgZmlsdGVyZWQuCi0KLSBUaGUgcGljdHVyZSBiZWxvdyBkZXBpY3RzIGEgM3gzIGdyb3VwIG9mIHBpeGVsIGx1bWluYW5jZSB2YWx1ZXMuICBUaGUgInUiLCAiYyIsCi0gYW5kICJsIiBzdGFuZCBmb3IgInVwcGVyIiwgImNlbnRlciIgYW5kICJsb3dlciIsIHJlc3BlY3RpdmVseS4gIFRoZSBsb2NhdGlvbgotIG9mIHBlbGMwIGlzIHNwZWNpZmllZCBieSB4X3N0YXJ0IGFuZCB5X3N0YXJ0IGluIHRoZSAxLUQgYXJyYXkgIlJlY19ZIiBhcwotIGZvbGxvd3MgKGFzc3VtaW5nIHhfc3RhcnQ9MCk6Ci0KLSBsb2NhdGlvbiBvZiBwZWxjMCA9IFsoeV9zdGFydCsxKSAqIHdpZHRoXSArIHhfc3RhcnQKLQotIE1vdmluZyB1cCBvciBkb3duIDEgcm93IChtb3ZpbmcgZnJvbSBwZWx1MiB0byBwZWxjMiwgZm9yIGV4YW1wbGUpIGlzIGRvbmUgYnkKLSBpbmNyZW1lbnRpbmcgb3IgZGVjcmVtZW50aW5nICJ3aWR0aCIgZWxlbWVudHMgd2l0aGluIFJlY19ZLgotCi0gVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB1cHBlciBsZWZ0IGhhbmQgY29ybmVyIG9mIGEgYmxvY2sgKG5vdCB0aGUgZ3JvdXAgb2YKLSA5IHBpeGVscyBkZXBpY3RlZCBpbiB0aGUgZmlndXJlIGJlbG93KSBpcyBzcGVjaWZpZWQgYnkKLSAoeV9ibGtfc3RhcnQsIHhfYmxrX3N0YXJ0KS4gIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBibG9jayBpcyBCTEtTSVpFLgotICh5X3N0YXJ0LHhfc3RhcnQpIG1heSBiZSBzcGVjaWZpZWQgaW5kZXBlbmRlbnRseSBvZiAoeV9ibGtfc3RhcnQsIHhfYmxrX3N0YXJ0KS4KLQotICAgICh5X3N0YXJ0LHhfc3RhcnQpCi0gLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB8ICAgfCAgIHwgICB8ICAgfAotICAgIHwgICBYICAgfCBwZWx1MSB8IHBlbHUyIHwKLSAgICB8IHBlbHUwIHwgICB8ICAgfAotICAgIHwgICB8ICAgfCAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8IHBlbGMwIHwgcGVsYzEgfCBwZWxjMiB8Ci0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgICB8ICAgfCAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8IHBlbGwwIHwgcGVsbDEgfCBwZWxsMiB8Ci0gICAgfCAgIHwgICB8ICAgfAotICAgIHwgICB8ICAgfCAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gVGhlIGZpbHRlcmluZyBvZiB0aGUgbHVtaW5hbmNlIHZhbHVlcyBpcyBhY2hpZXZlZCBieSBjb21wYXJpbmcgdGhlIDkKLSBsdW1pbmFuY2UgdmFsdWVzIHRvIGEgdGhyZXNob2xkIHZhbHVlICgidGhyIikgYW5kIHRoZW4gY2hhbmdpbmcgdGhlCi0gbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlmIGFsbCBvZiB0aGUgdmFsdWVzIGFyZSBhYm92ZSBvciBhbGwgb2YgdGhlIHZhbHVlcwotIGFyZSBiZWxvdyB0aGUgdGhyZXNob2xkLiAgVGhlIGFtb3VudCB0aGF0IHRoZSBsdW1pbmFuY2UgdmFsdWUgaXMgY2hhbmdlZAotIGRlcGVuZHMgb24gYSB3ZWlnaHRlZCBzdW0gb2YgdGhlIDkgbHVtaW5hbmNlIHZhbHVlcy4gVGhlIHBvc2l0aW9uIG9mIFBlbGMxCi0gaXMgdGhlbiBhZHZhbmNlZCB0byB0aGUgcmlnaHQgYnkgb25lIChhcyB3ZWxsIGFzIGFsbCBvZiB0aGUgc3Vycm91bmRpbmcgcGl4ZWxzKQotIGFuZCB0aGUgc2FtZSBjYWxjdWxhdGlvbiBpcyBwZXJmb3JtZWQgYWdhaW4gZm9yIHRoZSBsdW1pbmFuY2UgdmFsdWUgb2YgdGhlIG5ldwotIFBlbGMxLiBUaGlzIGNvbnRpbnVlcyByb3ctd2lzZSB1bnRpbCBwaXhlbHMgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSBibG9jayBhcmUKLSBmaWx0ZXJlZC4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIE5vbmUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFRkVSRU5DRVMKLQotIC4uXGNvcmVsaWJzXGRlY29kZXJcY29tbW9uXHNyY1xwb3N0X3Byb2MuYwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRAotICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KLQotIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKLSAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KLQotICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQotICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKLSAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotI2luY2x1ZGUgICAgIm1wNGRlZi5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTlZfUE9TU0lCTEVfTE9TU19PRl9EQVRBCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgQWRhcHRpdmVTbW9vdGhfTm9NTVgoCi0gICAgdWludDggKlJlY19ZLCAgICAgICAvKiBpL28gICovCi0gICAgaW50IHlfc3RhcnQsICAgICAgICAvKiBpICAgICovCi0gICAgaW50IHhfc3RhcnQsICAgICAgICAvKiBpICAgICovCi0gICAgaW50IHlfYmxrX3N0YXJ0LCAgICAvKiBpICAgICovCi0gICAgaW50IHhfYmxrX3N0YXJ0LCAgICAvKiBpICAgICovCi0gICAgaW50IHRociwgICAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgd2lkdGgsICAgICAgLyogaSAgICAqLwotICAgIGludCBtYXhfZGlmZiAgICAgICAgLyogaSAgICAqLwotKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCAgc2lnbl92WzE1XTsKLSAgICBpbnQgc3VtX3ZbMTVdOwotICAgIGludCAqc3VtX1ZfcHRyOwotICAgIGludCAqc2lnbl9WX3B0cjsKLSAgICB1aW50OCBwZWx1OwotICAgIHVpbnQ4IHBlbGM7Ci0gICAgdWludDggcGVsbDsKLSAgICB1aW50OCAqcGVscDsKLSAgICB1aW50OCBvbGRyb3dbMTVdOwotICAgIGludCAgc3VtOwotICAgIGludCBzdW0xOwotICAgIHVpbnQ4ICpSZWNfWV9wdHI7Ci0gICAgaW50MzIgIGFkZHJfdjsKLSAgICBpbnQgcm93X2NudHI7Ci0gICAgaW50IGNvbF9jbnRyOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiAgZmlyc3Qgcm93Ci0gICAgKi8KLSAgICBhZGRyX3YgPSAoaW50MzIpKHlfc3RhcnQgKyAxKSAqIHdpZHRoOyAgLyogeSBjb29yZCBvZiAxc3QgZWxlbWVudCBpbiB0aGUgcm93ICAvCi0gICAgICAgICAgICAgICAgICAgICAvY29udGFpbmluZyBwZWxjIHBpeGVsIC8gICAgICovCi0gICAgUmVjX1lfcHRyID0gJlJlY19ZW2FkZHJfdiArIHhfc3RhcnRdOyAgLyogaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gIHBlbGMwIHBvc2l0aW9uICAqLwotICAgIHN1bV9WX3B0ciA9ICZzdW1fdlswXTsgIC8qIGluaXRpYWxpemluZyBwb2ludGVyIHRvIDB0aCBlbGVtZW50IG9mIGFycmF5Ci0gICAgICAgICAgICAgICAgLyAgIHRoYXQgd2lsbCBjb250YWluIHdlaWdodGVkIHN1bXMgb2YgcGl4ZWwKLSAgICAgICAgICAgICAgICAvICAgbHVtaW5hbmNlIHZhbHVlcyAqLwotICAgIHNpZ25fVl9wdHIgPSAmc2lnbl92WzBdOyAgLyogIGluaXRpYWxpemluZyBwb2ludGVyIHRvIDB0aCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAvICAgYXJyYXkgdGhhdCB3aWxsIGNvbnRhaW4gc3VtcyB0aGF0IGluZGljYXRlCi0gICAgICAgICAgICAgICAgICAvICAgIGhvdyBtYW55IG9mIHRoZSA5IHBpeGVscyBhcmUgYWJvdmUgb3IgYmVsb3cKLSAgICAgICAgICAgICAgICAgIC8gICAgdGhlIHRocmVzaG9sZCB2YWx1ZSAodGhyKSAgICAqLwotICAgIHBlbHAgPSAmb2xkcm93WzBdOyAgLyogaW5pdGlhbGl6aW5nIHBvaW50ZXIgdG8gdGhlIDB0aCBlbGVtZW50IG9mIGFycmF5Ci0gICAgICAgICAgICAgICAgLyAgICB0aGF0IHdpbGwgY29udGFpbiBjdXJyZW50IHZhbHVlcyBvZiBwZWxjIHRoYXQKLSAgICAgICAgICAgICAgICAvICAgYXJlIHNhdmVkIGFuZCB1c2VkIGFzIHZhbHVlcyBvZiBwZWx1IHdoZW4gdGhlCi0gICAgICAgICAgICAgICAgLyAgIG5leHQgcm93IG9mIHBpeGVscyBhcmUgZmlsdGVyZWQgKi8KLQotICAgIHBlbHUgPSAqKFJlY19ZX3B0ciAtIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWx1MCB0byBwZWx1ICAqLwotICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGMwIHRvIHBlbGMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAvICBzdG9yaW5nIHRoaXMgdmFsdWUgaW4gcGVscCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgLyAgIHdpbGwgYmUgdXNlZCBhcyB2YWx1ZSBvZiBwZWx1MCB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAvICBuZXh0IHJvdyBpcyBmaWx0ZXJlZCAqLwotICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxsMCB0byBwZWxsICovCi0gICAgUmVjX1lfcHRyKys7IC8qIGFkdmFuY2luZyBwb2ludGVyIGZyb20gcGVsYzAgdG8gcGVsYzEgKi8KLSAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOyAgLyogd2VpZ2h0ZWQgc3VtIG9mIHBlbHUwLAotICAgICAgICAgICAgICAgICAgICAgICAgIC8gIHBlbGMwIGFuZCBwZWxsMCAgKi8KLSAgICAvKiBzdW0gb2YgMCdzIGFuZCAxJ3MgKDAgaWYgcGl4ZWwgdmFsdWUgaXMgYmVsb3cgdGhyLCAxIGlmIHZhbHVlCi0gICAgL2lzIGFib3ZlIHRocikgICovCi0gICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsgSU5ERVgocGVsbCwgdGhyKTsKLQotCi0gICAgcGVsdSA9ICooUmVjX1lfcHRyIC0gd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbHUxIHRvIHBlbHUgKi8KLSAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxjMSB0byBwZWxjIGFuZAotICAgICAgICAgICAgICAgICAgICAgLyAgc3RvcmluZyB0aGlzIHZhbHVlIGluIHBlbHAgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgIC8gIHdpbGwgYmUgdXNlZCBhcyB0aGUgdmFsdWUgb2YgcGVsdTEgd2hlbgotICAgICAgICAgICAgICAgICAgICAgLyAgbmV4dCByb3cgaXMgZmlsdGVyZWQgKi8KLSAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsbDEgdG8gcGVsbCAqLwotICAgIFJlY19ZX3B0cisrOyAgLyogYWR2YW5jaW5nIHBvaW50ZXIgZnJvbSBwZWxjMSB0byBwZWxjMiAqLwotICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7IC8qIHdlaWdodGVkIHN1bSBvZiBwZWx1MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8gcGVsYzEgYW5kIHBlbGwxICAqLwotICAgIC8qIHN1bSBvZiAwJ3MgYW5kIDEncyAoMCBpZiBwaXhlbCB2YWx1ZSBpcyBiZWxvdyB0aHIsIDEgaWYgdmFsdWUKLSAgICAvaXMgYWJvdmUgdGhyKSAgKi8KLSAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKyBJTkRFWChwZWxsLCB0aHIpOwotCi0gICAgLyogVGhlIGxvb3AgYmVsb3cgcGVyZm9ybXMgdGhlIGZpbHRlcmluZyBmb3IgdGhlIGZpcnN0IHJvdyBvZgotICAgIC8gICBwaXhlbHMgaW4gdGhlIHJlZ2lvbi4gIEl0IHN0ZXBzIGFjcm9zcyB0aGUgcmVtYWluaW5nIHBpeGVscyBpbgotICAgIC8gICB0aGUgcm93IGFuZCBhbHRlcnMgdGhlIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpZiBuZWNlc3NhcnksCi0gICAgLyAgIGRlcGVuZGluZyBvbiB0aGUgbHVtaW5hbmNlIHZhbHVlcyBvZiB0aGUgYWRqYWNlbnQgcGl4ZWxzKi8KLQotICAgIGZvciAoY29sX2NudHIgPSAoeF9ibGtfc3RhcnQgKyBCTEtTSVpFIC0gMSkgLSB4X3N0YXJ0OyBjb2xfY250ciA+IDA7IGNvbF9jbnRyLS0pCi0gICAgewotICAgICAgICBwZWx1ID0gKihSZWNfWV9wdHIgLSB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsdTIgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8gICBwZWx1ICovCi0gICAgICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGMyIHRvIHBlbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAvIGFuZCBzdG9yaW5nIHRoaXMgdmFsdWUgaW4gcGVscAotICAgICAgICAgICAgICAgICAgICAgICAgIC8gd2hpY2ggd2lsbCBiZSB1c2VkICAgYXMgdmFsdWUgb2YgcGVsdTIKLSAgICAgICAgICAgICAgICAgICAgICAgICAvIHdoZW4gbmV4dCByb3cgaXMgZmlsdGVyZWQgKi8KLSAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsbDIgdG8gcGVsbCAqLwotCi0gICAgICAgIC8qIHdlaWdodGVkIHN1bSBvZiBwZWx1MSwgcGVsYzEgYW5kIHBlbGwxICAqLwotICAgICAgICAqc3VtX1ZfcHRyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgLyogc3VtIG9mIDAncyBhbmQgMSdzICgwIGlmIHBpeGVsIHZhbHVlIGlzIGJlbG93IHRociwKLSAgICAgICAgLzEgaWYgdmFsdWUgaXMgYWJvdmUgdGhyKSAgKi8KLSAgICAgICAgKnNpZ25fVl9wdHIgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLSAgICAgICAgLyogdGhlIHZhbHVlIG9mIHN1bTEgaW5kaWNhdGVzIGhvdyBtYW55IG9mIHRoZSA5IHBpeGVscycKLSAgICAgICAgL2x1bWluYW5jZSB2YWx1ZXMgYXJlIGFib3ZlIG9yIGVxdWFsIHRvIHRociAqLwotICAgICAgICBzdW0xID0gKihzaWduX1ZfcHRyIC0gMikgKyAqKHNpZ25fVl9wdHIgLSAxKSArICpzaWduX1ZfcHRyOwotCi0gICAgICAgIC8qIGFsdGVyIHRoZSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaWYgYWxsIDkgbHVtaW5hbmNlIHZhbHVlcwotICAgICAgICAvYXJlIGFib3ZlIG9yIGVxdWFsIHRvIHRociBvciBpZiBhbGwgOSB2YWx1ZXMgYXJlIGJlbG93IHRociAqLwotICAgICAgICBpZiAoc3VtMSA9PSAwIHx8IHN1bTEgPT0gOSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogc3VtIGlzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgOSBwaXhlbCBsdW1pbmFuY2UKLSAgICAgICAgICAgIC92YWx1ZXMgICAqLwotICAgICAgICAgICAgc3VtID0gKCooc3VtX1ZfcHRyIC0gMikgKyAoKihzdW1fVl9wdHIgLSAxKSA8PCAxKSArCi0gICAgICAgICAgICAgICAgICAgKnN1bV9WX3B0ciArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgIFJlY19ZX3B0ci0tOyAgLyogbW92ZSBwb2ludGVyIGJhY2sgdG8gcGVsYzEgICovCi0gICAgICAgICAgICAvKiBJZiBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaXMgbGFyZ2VyIHRoYW4KLSAgICAgICAgICAgIC8gc3VtIGJ5IG1vcmUgdGhhbiBtYXhfZGlmZiwgdGhlbiBzdWJyYWN0IG1heF9kaWZmCi0gICAgICAgICAgICAvIGZyb20gbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxKi8KLSAgICAgICAgICAgIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bSA9ICpSZWNfWV9wdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIElmIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpcyBzbWFsbGVyIHRoYW4KLSAgICAgICAgICAgIC8gc3VtIGJ5IG1vcmUgdGhhbiBtYXhfZGlmZiwgdGhlbiBhZGQgbWF4X2RpZmYKLSAgICAgICAgICAgIC8gdG8gbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pIDwgLW1heF9kaWZmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1bSA9ICpSZWNfWV9wdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpSZWNfWV9wdHIrKyA9IHN1bTsgLyogYXNzaWduIHZhbHVlIG9mIHN1bSB0byBwZWxjMQotICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhZHZhbmNlIHBvaW50ZXIgdG8gcGVsYzIgKi8KLSAgICAgICAgfQotICAgICAgICBSZWNfWV9wdHIrKzsgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5ldyB2YWx1ZSBvZiBwZWxjMgotICAgICAgICAgICAgICAgICAvICAgb2xkIHBlbGMyIGlzIG5vdyB0cmVhdGVkIGFzIHBlbGMxKi8KLSAgICAgICAgc3VtX1ZfcHRyKys7IC8qIHBvaW50ZXIgaXMgYWR2YW5jZWQgc28gbmV4dCB3ZWlnaHRlZCBzdW0gbWF5Ci0gICAgICAgICAgICAgICAgIC8gIGJlIHNhdmVkICovCi0gICAgICAgIHNpZ25fVl9wdHIrKzsgLyogcG9pbnRlciBpcyBhZHZhbmNlZCBzbyBuZXh0IHN1bSBvZiAwJ3MgYW5kCi0gICAgICAgICAgICAgICAgICAvIDEncyBtYXkgYmUgc2F2ZWQgICovCi0gICAgfQotCi0gICAgLyogVGhlIG5lc3RlZCBsb29wcyBiZWxvdyBwZXJmb3JtIHRoZSBmaWx0ZXJpbmcgZm9yIHRoZSByZW1haW5pbmcgcm93cyAqLwotCi0gICAgYWRkcl92ID0gKHlfc3RhcnQgKyAyKSAqIHdpZHRoOyAgLyogYWR2YW5jZSBhZGRyX3YgdG8gdGhlIG5leHQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAvICAgKGNvcnJlc3BvbmRpbmcgdG8gcGVsbDApKi8KLSAgICAvKiBUaGUgb3V0ZXIgbG9vcCBzdGVwcyB0aHJvdWdodCB0aGUgcm93cy4gICAqLwotICAgIGZvciAocm93X2NudHIgPSAoeV9ibGtfc3RhcnQgKyBCTEtTSVpFKSAtICh5X3N0YXJ0ICsgMik7IHJvd19jbnRyID4gMDsgcm93X2NudHItLSkKLSAgICB7Ci0gICAgICAgIFJlY19ZX3B0ciA9ICZSZWNfWVthZGRyX3YgKyB4X3N0YXJ0XTsgLyogYWR2YW5jZSBwb2ludGVyIHRvCi0gICAgICAgICAgICAvdGhlIG9sZCBwZWxsMCwgd2hpY2ggaGFzIGJlY29tZSB0aGUgbmV3IHBlbGMwICovCi0gICAgICAgIGFkZHJfdiArPSB3aWR0aDsgIC8qIG1vdmUgYWRkcl92IGRvd24gMSByb3cgKi8KLSAgICAgICAgc3VtX1ZfcHRyID0gJnN1bV92WzBdOyAgLyogcmUtaW5pdGlhbGl6aW5nIHBvaW50ZXIgKi8KLSAgICAgICAgc2lnbl9WX3B0ciA9ICZzaWduX3ZbMF07ICAvKiByZS1pbml0aWxhaXppbmcgcG9pbnRlciAqLwotICAgICAgICBwZWxwID0gJm9sZHJvd1swXTsgLyogcmUtaW5pdGlhbGl6aW5nIHBvaW50ZXIgKi8KLQotICAgICAgICBwZWx1ID0gKnBlbHA7IC8qIHNldHRpbmcgcGVsdTAgdG8gb2xkIHZhbHVlIG9mIHBlbGMwICovCi0gICAgICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsKLSAgICAgICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOwotICAgICAgICBSZWNfWV9wdHIrKzsKLSAgICAgICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0KLSAgICAgICAgcGVsdSA9ICpwZWxwOyAvKiBzZXR0aW5nIHBlbHUxIHRvIG9sZCB2YWx1ZSBvZiBwZWxjMSAqLwotICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7Ci0gICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsKLSAgICAgICAgUmVjX1lfcHRyKys7Ci0gICAgICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotICAgICAgICAvKiBUaGUgaW5uZXIgbG9vcCBzdGVwcyB0aHJvdWdoIHRoZSBjb2x1bW5zICovCi0gICAgICAgIGZvciAoY29sX2NudHIgPSAoeF9ibGtfc3RhcnQgKyBCTEtTSVpFIC0gMSkgLSB4X3N0YXJ0OyBjb2xfY250ciA+IDA7IGNvbF9jbnRyLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBlbHUgPSAqcGVscDsgLyogc2V0dGluZyBwZWx1MiB0byBvbGQgdmFsdWUgb2YgcGVsYzIgKi8KLSAgICAgICAgICAgICpwZWxwKysgPSBwZWxjID0gKlJlY19ZX3B0cjsKLSAgICAgICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsKLQotICAgICAgICAgICAgKnN1bV9WX3B0ciA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAqc2lnbl9WX3B0ciA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLQotICAgICAgICAgICAgc3VtMSA9ICooc2lnbl9WX3B0ciAtIDIpICsgKihzaWduX1ZfcHRyIC0gMSkgKyAqc2lnbl9WX3B0cjsKLSAgICAgICAgICAgIC8qIHRoZSAiaWYiIHN0YXRlbWVudCBiZWxvdyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGluCi0gICAgICAgICAgICAvIHRoZSBmaXJzdCBsb29wICovCi0gICAgICAgICAgICBpZiAoc3VtMSA9PSAwIHx8IHN1bTEgPT0gOSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gPSAoKihzdW1fVl9wdHIgLSAyKSArICgqKHN1bV9WX3B0ciAtIDEpIDw8IDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKnN1bV9WX3B0ciArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICBSZWNfWV9wdHItLTsKLSAgICAgICAgICAgICAgICBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPiBtYXhfZGlmZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN1bSA9ICpSZWNfWV9wdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPCAtbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpSZWNfWV9wdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVjX1lfcHRyKys7Ci0gICAgICAgICAgICBzdW1fVl9wdHIrKzsKLSAgICAgICAgICAgIHNpZ25fVl9wdHIrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMTAwODYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MTIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgW2lucHV0X3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBpbnB1dCB0byBtb2R1bGUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2xvY2FsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX2J1ZmZlcl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgcG9pbnRlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIE91dHB1dHM6Ci0gICAgW3JldHVybl92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiBkYXRhL3BvaW50ZXIgcmV0dXJuZWQKLSAgICAgICAgICAgICAgICAgIGJ5IG1vZHVsZSwgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgICAgICAgICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBbdmFyaWFibGVfYmZyX3B0cl0gcG9pbnRzIHRvIHRoZSBbZGVzY3JpYmUgd2hlcmUgdGhlCi0gICAgICB2YXJpYWJsZV9iZnJfcHRyIHBvaW50cyB0bywgaXRzIHR5cGUgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aAotICAgICAgKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW3ZhcmlhYmxlX2Jmcl0gY29udGVudHMgYXJlIFtkZXNjcmliZSB0aGUgbmV3IGNvbnRlbnRzIG9mCi0gICAgICB2YXJpYWJsZV9iZnJdCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2xvY2FsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFUVVJUkVNRU5UUwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgImlkY3QuaCIKLSNpbmNsdWRlICJtb3Rpb25fY29tcC5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTlZfUE9TU0lCTEVfTE9TU19PRl9EQVRBCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogcHJpdmF0ZSBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBpZGN0cm93KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpOwotc3RhdGljIHZvaWQgaWRjdHJvd19pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqLCBpbnQgd2lkdGgpOwotc3RhdGljIHZvaWQgaWRjdGNvbChpbnQxNiAqYmxrKTsKLQotI2lmZGVmIEZBU1RfSURDVAotLy8gbWFwcGluZyBmcm9tIG56X2NvZWZzIHRvIGZ1bmN0aW9ucyB0byBiZSB1c2VkCi0KLQotLy8gQVJNNCBkb2VzIG5vdCBhbGxvdyBnbG9iYWwgZGF0YSB3aGVuIHRoZXkgYXJlIG5vdCBjb25zdGFudCBoZW5jZQotLy8gYW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgY2Fubm90IGJlIGNvbnNpZGVyZWQgYXMgYXJyYXkgb2YgY29uc3RhbnRzCi0vLyAoYWN0dWFsIGFkZHJlc3NlcyBhcmUgb25seSBrbm93biB3aGVuIHRoZSBkbGwgaXMgbG9hZGVkKS4KLS8vIFNvIGluc3RlYWQgb2YgYXJyYXlzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzLCB3ZSdsbCBzdG9yZSBoZXJlCi0vLyBhcnJheXMgb2Ygcm93cyBvciBjb2x1bW5zIGFuZCB0aGVuIGNhbGwgdGhlIGlkY3QgZnVuY3Rpb24KLS8vIGNvcnJlc3BvbmRpbmcgdG8gc3VjaCB0aGUgcm93L2NvbHVtbiBudW1iZXI6Ci0KLQotc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0Y29sVkNBWzEwXVs0XSkoaW50MTYqKSA9Ci17Ci0gICAgeyZpZGN0Y29sMSwgJmlkY3Rjb2wwLCAmaWRjdGNvbDAsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMSwgJmlkY3Rjb2wxLCAmaWRjdGNvbDAsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMiwgJmlkY3Rjb2wxLCAmaWRjdGNvbDAsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wxLCAmaWRjdGNvbDAsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDAsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDEsICZpZGN0Y29sMH0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDEsICZpZGN0Y29sMX0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wyLCAmaWRjdGNvbDIsICZpZGN0Y29sMX0sCi0gICAgeyZpZGN0Y29sMywgJmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMX0sCi0gICAgeyZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDIsICZpZGN0Y29sMX0KLX07Ci0KLQotc3RhdGljIHZvaWQgKCpjb25zdCBpZGN0cm93VkNBWzEwXSkoaW50MTYqLCB1aW50OCosIHVpbnQ4KiwgaW50KSA9Ci17Ci0gICAgJmlkY3Ryb3cxLAotICAgICZpZGN0cm93MiwKLSAgICAmaWRjdHJvdzIsCi0gICAgJmlkY3Ryb3cyLAotICAgICZpZGN0cm93MiwKLSAgICAmaWRjdHJvdzMsCi0gICAgJmlkY3Ryb3c0LAotICAgICZpZGN0cm93NCwKLSAgICAmaWRjdHJvdzQsCi0gICAgJmlkY3Ryb3c0Ci19OwotCi0KLXN0YXRpYyB2b2lkICgqY29uc3QgaWRjdGNvbFZDQTJbMTZdKShpbnQxNiopID0KLXsKLSAgICAmaWRjdGNvbDAsICZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDQsCi0gICAgJmlkY3Rjb2wyLCAmaWRjdGNvbDQsICZpZGN0Y29sMywgJmlkY3Rjb2w0LAotICAgICZpZGN0Y29sMSwgJmlkY3Rjb2w0LCAmaWRjdGNvbDMsICZpZGN0Y29sNCwKLSAgICAmaWRjdGNvbDIsICZpZGN0Y29sNCwgJmlkY3Rjb2wzLCAmaWRjdGNvbDQKLX07Ci0KLXN0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQTJbOF0pKGludDE2KiwgdWludDgqLCB1aW50OCosIGludCkgPQotewotICAgICZpZGN0cm93MSwgJmlkY3Ryb3c0LCAmaWRjdHJvdzMsICZpZGN0cm93NCwKLSAgICAmaWRjdHJvdzIsICZpZGN0cm93NCwgJmlkY3Ryb3czLCAmaWRjdHJvdzQKLX07Ci0KLXN0YXRpYyB2b2lkICgqY29uc3QgaWRjdHJvd1ZDQV9pbnRyYVsxMF0pKGludDE2KiwgUElYRUwgKiwgaW50KSA9Ci17Ci0gICAgJmlkY3Ryb3cxX2ludHJhLAotICAgICZpZGN0cm93Ml9pbnRyYSwKLSAgICAmaWRjdHJvdzJfaW50cmEsCi0gICAgJmlkY3Ryb3cyX2ludHJhLAotICAgICZpZGN0cm93Ml9pbnRyYSwKLSAgICAmaWRjdHJvdzNfaW50cmEsCi0gICAgJmlkY3Ryb3c0X2ludHJhLAotICAgICZpZGN0cm93NF9pbnRyYSwKLSAgICAmaWRjdHJvdzRfaW50cmEsCi0gICAgJmlkY3Ryb3c0X2ludHJhCi19OwotCi1zdGF0aWMgdm9pZCAoKmNvbnN0IGlkY3Ryb3dWQ0EyX2ludHJhWzhdKShpbnQxNiosIFBJWEVMICosIGludCkgPQotewotICAgICZpZGN0cm93MV9pbnRyYSwgJmlkY3Ryb3c0X2ludHJhLCAmaWRjdHJvdzNfaW50cmEsICZpZGN0cm93NF9pbnRyYSwKLSAgICAmaWRjdHJvdzJfaW50cmEsICZpZGN0cm93NF9pbnRyYSwgJmlkY3Ryb3czX2ludHJhLCAmaWRjdHJvdzRfaW50cmEKLX07Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgTUJsb2NrSURDVChWaWRlb0RlY0RhdGEgKnZpZGVvKQotewotICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgIE1hY3JvQmxvY2sgKm1ibG9jayA9IHZpZGVvLT5tYmxvY2s7Ci0gICAgUElYRUwgKmNfY29tcDsKLSAgICBQSVhFTCAqY3VfY29tcDsKLSAgICBQSVhFTCAqY3ZfY29tcDsKLSAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJudW1fY29sOwotICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7Ci0gICAgaW50IHdpZHRoLCB3aWR0aF91djsKLSAgICBpbnQzMiBvZmZzZXQ7Ci0gICAgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgd2lkdGhfdXYgPSB3aWR0aCA+PiAxOwotICAgIG9mZnNldCA9IChpbnQzMikoeV9wb3MgPDwgNCkgKiB3aWR0aCArICh4X3BvcyA8PCA0KTsKLQotICAgIGNfY29tcCAgPSBjdXJyVm9wLT55Q2hhbiArIG9mZnNldDsKLSAgICBjdV9jb21wID0gY3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpOwotICAgIGN2X2NvbXAgPSBjdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMik7Ci0KLSAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAsIDAsIHdpZHRoKTsKLSAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjX2NvbXAgKyA4LCAxLCB3aWR0aCk7Ci0gICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY19jb21wICsgKHdpZHRoIDw8IDMpLCAyLCB3aWR0aCk7Ci0gICAgQmxvY2tJRENUX2ludHJhKG1ibG9jaywgY19jb21wICsgKHdpZHRoIDw8IDMpICsgOCwgMywgd2lkdGgpOwotICAgIEJsb2NrSURDVF9pbnRyYShtYmxvY2ssIGN1X2NvbXAsIDQsIHdpZHRoX3V2KTsKLSAgICBCbG9ja0lEQ1RfaW50cmEobWJsb2NrLCBjdl9jb21wLCA1LCB3aWR0aF91dik7Ci19Ci0KLQotdm9pZCBCbG9ja0lEQ1RfaW50cmEoCi0gICAgTWFjcm9CbG9jayAqbWJsb2NrLCBQSVhFTCAqY19jb21wLCBpbnQgY29tcCwgaW50IHdpZHRoKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQxNiAqY29lZmZfaW4gPSBtYmxvY2stPmJsb2NrW2NvbXBdOwotI2lmZGVmIElOVEVHRVJfSURDVAotI2lmZGVmIEZBU1RfSURDVCAgLyogVkNBIElEQ1QgdXNpbmcgbnpjb2VmcyBhbmQgYml0bWFwcyovCi0gICAgaW50IGksIGJtYXByOwotICAgIGludCBuel9jb2VmcyA9IG1ibG9jay0+bm9fY29lZmZbY29tcF07Ci0gICAgdWludDggKmJpdG1hcGNvbCA9IG1ibG9jay0+Yml0bWFwY29sW2NvbXBdOwotICAgIHVpbnQ4IGJpdG1hcHJvdyA9IG1ibG9jay0+Yml0bWFwcm93W2NvbXBdOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpZiAobnpfY29lZnMgPD0gMTApCi0gICAgewotICAgICAgICBibWFwciA9IChuel9jb2VmcyAtIDEpOwotCi0gICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdKSkoY29lZmZfaW4pOwotICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVsxXSkpKGNvZWZmX2luICsgMSk7Ci0gICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzJdKSkoY29lZmZfaW4gKyAyKTsKLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bM10pKShjb2VmZl9pbiArIDMpOwotCi0gICAgICAgICgqaWRjdHJvd1ZDQV9pbnRyYVtuel9jb2Vmcy0xXSkoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpID0gODsKLSAgICAgICAgd2hpbGUgKGktLSkKLSAgICAgICAgewotICAgICAgICAgICAgYm1hcHIgPSAoaW50KWJpdG1hcGNvbFtpXTsKLSAgICAgICAgICAgIGlmIChibWFwcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKGJtYXByJjB4ZikgPT0gMCkgICAgICAgICAvKiAgMDcvMTgvMDEgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICgqKGlkY3Rjb2xWQ0EyW2JtYXByPj40XSkpKGNvZWZmX2luICsgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlkY3Rjb2woY29lZmZfaW4gKyBpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChiaXRtYXBjb2xbNF0gfCBiaXRtYXBjb2xbNV0gfCBiaXRtYXBjb2xbNl0gfCBiaXRtYXBjb2xbN10pID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJpdG1hcHJvdyA+Pj0gNDsKLSAgICAgICAgICAgICgqKGlkY3Ryb3dWQ0EyX2ludHJhWyhpbnQpYml0bWFwcm93XSkpKGNvZWZmX2luLCBjX2NvbXAsIHdpZHRoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlkY3Ryb3dfaW50cmEoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICB2b2lkIGlkY3RfaW50cmEoaW50ICpibG9jaywgdWludDggKmNvbXAsIGludCB3aWR0aCk7Ci0gICAgaWRjdF9pbnRyYShjb2VmZl9pbiwgY19jb21wLCB3aWR0aCk7Ci0jZW5kaWYKLSNlbHNlCi0gICAgdm9pZCBpZGN0cmVmX2ludHJhKGludCAqYmxvY2ssIHVpbnQ4ICpjb21wLCBpbnQgd2lkdGgpOwotICAgIGlkY3RyZWZfaW50cmEoY29lZmZfaW4sIGNfY29tcCwgd2lkdGgpOwotI2VuZGlmCi0KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0KLS8qICAwOC8wNC8wNSwgbm8gcmVzaWR1ZSwganVzdCBjb3B5IGZyb20gcHJlZCB0byBvdXRwdXQgKi8KLXZvaWQgQ29weV9CbGtfdG9fVm9wKHVpbnQ4ICpkc3QsIHVpbnQ4ICpwcmVkLCBpbnQgd2lkdGgpCi17Ci0gICAgLyogY29weSA0IGJ5dGVzIGF0IGEgdGltZSAqLwotICAgIHdpZHRoIC09IDQ7Ci0gICAgKigodWludDMyKilkc3QpID0gKigodWludDMyKilwcmVkKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOwotICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOwotICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOwotICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gKigodWludDMyKikocHJlZCArPSAxMikpOwotICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsKLSAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gKigodWludDMyKikocHJlZCArPSA0KSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7Ci0gICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gNCkpOwotCi0gICAgcmV0dXJuIDsKLX0KLQotLyogIDA4LzA0LzA1IGNvbXB1dGUgSURDVCBhbmQgYWRkIHByZWRpY3Rpb24gYXQgdGhlIGVuZCAgKi8KLXZvaWQgQmxvY2tJRENUKAotICAgIHVpbnQ4ICpkc3QsICAvKiBkZXN0aW5hdGlvbiAqLwotICAgIHVpbnQ4ICpwcmVkLCAvKiBwcmVkaWN0aW9uIGJsb2NrLCBwaXRjaCAxNiAqLwotICAgIGludDE2ICAgKmNvZWZmX2luLCAgLyogRENUIGRhdGEsIHNpemUgNjQgKi8KLSAgICBpbnQgd2lkdGgsIC8qIHdpZHRoIG9mIGRzdCAqLwotICAgIGludCBuel9jb2VmcywKLSAgICB1aW50OCAqYml0bWFwY29sLAotICAgIHVpbnQ4IGJpdG1hcHJvdwotKQotewotI2lmZGVmIElOVEVHRVJfSURDVAotI2lmZGVmIEZBU1RfSURDVCAgLyogVkNBIElEQ1QgdXNpbmcgbnpjb2VmcyBhbmQgYml0bWFwcyovCi0gICAgaW50IGksIGJtYXByOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaWYgKG56X2NvZWZzIDw9IDEwKQotICAgIHsKLSAgICAgICAgYm1hcHIgPSAobnpfY29lZnMgLSAxKTsKLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl0pKShjb2VmZl9pbik7Ci0gICAgICAgICgqKGlkY3Rjb2xWQ0FbYm1hcHJdWzFdKSkoY29lZmZfaW4gKyAxKTsKLSAgICAgICAgKCooaWRjdGNvbFZDQVtibWFwcl1bMl0pKShjb2VmZl9pbiArIDIpOwotICAgICAgICAoKihpZGN0Y29sVkNBW2JtYXByXVszXSkpKGNvZWZmX2luICsgMyk7Ci0KLSAgICAgICAgKCppZGN0cm93VkNBW256X2NvZWZzLTFdKShjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7Ci0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGkgPSA4OwotCi0gICAgICAgIHdoaWxlIChpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJtYXByID0gKGludCliaXRtYXBjb2xbaV07Ci0gICAgICAgICAgICBpZiAoYm1hcHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChibWFwciYweGYpID09IDApICAgICAgICAgLyogIDA3LzE4LzAxICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAoKihpZGN0Y29sVkNBMltibWFwcj4+NF0pKShjb2VmZl9pbiArIGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZGN0Y29sKGNvZWZmX2luICsgaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoYml0bWFwY29sWzRdIHwgYml0bWFwY29sWzVdIHwgYml0bWFwY29sWzZdIHwgYml0bWFwY29sWzddKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAoKihpZGN0cm93VkNBMltiaXRtYXByb3c+PjRdKSkoY29lZmZfaW4sIHByZWQsIGRzdCwgd2lkdGgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWRjdHJvdyhjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0jZWxzZSAvLyBGQVNUX0lEQ1QKLSAgICB2b2lkIGlkY3QoaW50ICpibG9jaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCk7Ci0gICAgaWRjdChjb2VmZl9pbiwgcHJlZCwgZHN0LCB3aWR0aCk7Ci0gICAgcmV0dXJuOwotI2VuZGlmIC8vIEZBU1RfSURDVAotI2Vsc2UgLy8gSU5URUdFUl9JRENUCi0gICAgdm9pZCBpZGN0cmVmKGludCAqYmxvY2ssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpOwotICAgIGlkY3RyZWYoY29lZmZfaW4sIHByZWQsIGRzdCwgd2lkdGgpOwotICAgIHJldHVybjsKLSNlbmRpZiAvLyBJTlRFR0VSX0lEQ1QKLQotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07ICBFbmQgRnVuY3Rpb246IGJsb2NrX2lkY3QKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gTkFNRTogaWRjdHJvdwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUyBGT1IgaWRjdHJvdwotCi0gSW5wdXRzOgotICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBPdXRwdXRzOgotICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQotICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgotICAgICAgdmFyaWFibGVfYmZyXQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTiBGT1IgaWRjdHJvdwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMgRk9SIGlkY3Ryb3cKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUyBGT1IgaWRjdHJvdwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERSBGT1IgaWRjdHJvdwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBGT1IgaWRjdHJvdwotICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KLQotIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKLSAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KLQotICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQotICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKLSAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gQ29kZSBGT1IgaWRjdHJvdwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGlkY3Ryb3coCi0gICAgaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aAotKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwotICAgIGludCBpID0gODsKLSAgICB1aW50MzIgcHJlZF93b3JkLCBkc3Rfd29yZDsKLSAgICBpbnQgcmVzLCByZXMyOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiByb3cgKGhvcml6b250YWwpIElEQ1QKLSAgICAqCi0gICAgKiA3ICAgICAgICAgICAgICAgICAgICAgICBwaSAgICAgICAgIDEgZHN0W2tdID0gc3VtIGNbbF0gKiBzcmNbbF0gKiBjb3MoIC0tICoKLSAgICAqICggayArIC0gKSAqIGwgKSBsPTAgICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAyCi0gICAgKgotICAgICogd2hlcmU6IGNbMF0gICAgPSAxMjggY1sxLi43XSA9IDEyOCpzcXJ0KDIpICovCi0KLSAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCi0gICAgd2lkdGggLT0gNDsKLSAgICBkc3QgLT0gd2lkdGg7Ci0gICAgcHJlZCAtPSAxMjsKLSAgICBibGsgLT0gODsKLQotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICB4MSA9IChpbnQzMilibGtbMTJdIDw8IDg7Ci0gICAgICAgIGJsa1sxMl0gPSAwOwotICAgICAgICB4MiA9IGJsa1sxNF07Ci0gICAgICAgIGJsa1sxNF0gPSAwOwotICAgICAgICB4MyA9IGJsa1sxMF07Ci0gICAgICAgIGJsa1sxMF0gPSAwOwotICAgICAgICB4NCA9IGJsa1s5XTsKLSAgICAgICAgYmxrWzldID0gMDsKLSAgICAgICAgeDUgPSBibGtbMTVdOwotICAgICAgICBibGtbMTVdID0gMDsKLSAgICAgICAgeDYgPSBibGtbMTNdOwotICAgICAgICBibGtbMTNdID0gMDsKLSAgICAgICAgeDcgPSBibGtbMTFdOwotICAgICAgICBibGtbMTFdID0gMDsKLSAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7Ci0gICAgICAgIGJsa1swXSA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0KLSAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KLSAgICAgICAgeDggPSBXNyAqICh4NCArIHg1KSArIDQ7Ci0gICAgICAgIHg0ID0gKHg4ICsgKFcxIC0gVzcpICogeDQpID4+IDM7Ci0gICAgICAgIHg1ID0gKHg4IC0gKFcxICsgVzcpICogeDUpID4+IDM7Ci0gICAgICAgIHg4ID0gVzMgKiAoeDYgKyB4NykgKyA0OwotICAgICAgICB4NiA9ICh4OCAtIChXMyAtIFc1KSAqIHg2KSA+PiAzOwotICAgICAgICB4NyA9ICh4OCAtIChXMyArIFc1KSAqIHg3KSA+PiAzOwotCi0gICAgICAgIC8qIHNlY29uZCBzdGFnZSAqLwotICAgICAgICB4OCA9IHgwICsgeDE7Ci0gICAgICAgIHgwIC09IHgxOwotICAgICAgICB4MSA9IFc2ICogKHgzICsgeDIpICsgNDsKLSAgICAgICAgeDIgPSAoeDEgLSAoVzIgKyBXNikgKiB4MikgPj4gMzsKLSAgICAgICAgeDMgPSAoeDEgKyAoVzIgLSBXNikgKiB4MykgPj4gMzsKLSAgICAgICAgeDEgPSB4NCArIHg2OwotICAgICAgICB4NCAtPSB4NjsKLSAgICAgICAgeDYgPSB4NSArIHg3OwotICAgICAgICB4NSAtPSB4NzsKLQotICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLwotICAgICAgICB4NyA9IHg4ICsgeDM7Ci0gICAgICAgIHg4IC09IHgzOwotICAgICAgICB4MyA9IHgwICsgeDI7Ci0gICAgICAgIHgwIC09IHgyOwotICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7Ci0gICAgICAgIHg0ID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKLQotICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSAxMikpOyAvKiByZWFkIDQgYnl0ZXMgZnJvbSBwcmVkICovCi0KLSAgICAgICAgcmVzID0gKHg3ICsgeDEpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7Ci0gICAgICAgIHJlczIgPSAoeDMgKyB4MikgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9ICh4MCArIHg0KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gKHg4ICsgeDYpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLQotICAgICAgICByZXMgPSAoeDggLSB4NikgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4MCAtIHg0KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHgzIC0geDIpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDcgLSB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotICAgIH0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotCi1fX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCi12b2lkIGlkY3Ryb3dfaW50cmEoCi0gICAgaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aAotKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCB0ZW1wOwotICAgIGludCBpID0gODsKLSAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7Ci0gICAgaW50MzIgd29yZDsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogcm93IChob3Jpem9udGFsKSBJRENUCi0gICAgKgotICAgICogNyAgICAgICAgICAgICAgICAgICAgICAgcGkgICAgICAgICAxIGRzdFtrXSA9IHN1bSBjW2xdICogc3JjW2xdICogY29zKCAtLSAqCi0gICAgKiAoIGsgKyAtICkgKiBsICkgbD0wICAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAgMgotICAgICoKLSAgICAqIHdoZXJlOiBjWzBdICAgID0gMTI4IGNbMS4uN10gPSAxMjgqc3FydCgyKSAqLwotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICB4MSA9IChpbnQzMilibGtbNF0gPDwgODsKLSAgICAgICAgYmxrWzRdID0gMDsKLSAgICAgICAgeDIgPSBibGtbNl07Ci0gICAgICAgIGJsa1s2XSA9IDA7Ci0gICAgICAgIHgzID0gYmxrWzJdOwotICAgICAgICBibGtbMl0gPSAwOwotICAgICAgICB4NCA9IGJsa1sxXTsKLSAgICAgICAgYmxrWzFdID0gMDsKLSAgICAgICAgeDUgPSBibGtbN107Ci0gICAgICAgIGJsa1s3XSA9IDA7Ci0gICAgICAgIHg2ID0gYmxrWzVdOwotICAgICAgICBibGtbNV0gPSAwOwotICAgICAgICB4NyA9IGJsa1szXTsKLSAgICAgICAgYmxrWzNdID0gMDsKLSNpZm5kZWYgRkFTVF9JRENUCi0gICAgICAgIC8qIHNob3J0Y3V0ICovICAvKiBjb3ZlcmVkIGJ5IGlkY3Ryb3cxICAwMS85LzIwMDEgKi8KLSAgICAgICAgaWYgKCEoeDEgfCB4MiB8IHgzIHwgeDQgfCB4NSB8IHg2IHwgeDcpKQotICAgICAgICB7Ci0gICAgICAgICAgICBibGtbMF0gPSBibGtbMV0gPSBibGtbMl0gPSBibGtbM10gPSBibGtbNF0gPSBibGtbNV0gPSBibGtbNl0gPSBibGtbN10gPSAoYmxrWzBdICsgMzIpID4+IDY7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDgpICsgODE5MjsKLSAgICAgICAgYmxrWzBdID0gMDsgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLwotCi0gICAgICAgIC8qIGZpcnN0IHN0YWdlICovCi0gICAgICAgIHg4ID0gVzcgKiAoeDQgKyB4NSkgKyA0OwotICAgICAgICB4NCA9ICh4OCArIChXMSAtIFc3KSAqIHg0KSA+PiAzOwotICAgICAgICB4NSA9ICh4OCAtIChXMSArIFc3KSAqIHg1KSA+PiAzOwotICAgICAgICB4OCA9IFczICogKHg2ICsgeDcpICsgNDsKLSAgICAgICAgeDYgPSAoeDggLSAoVzMgLSBXNSkgKiB4NikgPj4gMzsKLSAgICAgICAgeDcgPSAoeDggLSAoVzMgKyBXNSkgKiB4NykgPj4gMzsKLQotICAgICAgICAvKiBzZWNvbmQgc3RhZ2UgKi8KLSAgICAgICAgeDggPSB4MCArIHgxOwotICAgICAgICB4MCAtPSB4MTsKLSAgICAgICAgeDEgPSBXNiAqICh4MyArIHgyKSArIDQ7Ci0gICAgICAgIHgyID0gKHgxIC0gKFcyICsgVzYpICogeDIpID4+IDM7Ci0gICAgICAgIHgzID0gKHgxICsgKFcyIC0gVzYpICogeDMpID4+IDM7Ci0gICAgICAgIHgxID0geDQgKyB4NjsKLSAgICAgICAgeDQgLT0geDY7Ci0gICAgICAgIHg2ID0geDUgKyB4NzsKLSAgICAgICAgeDUgLT0geDc7Ci0KLSAgICAgICAgLyogdGhpcmQgc3RhZ2UgKi8KLSAgICAgICAgeDcgPSB4OCArIHgzOwotICAgICAgICB4OCAtPSB4MzsKLSAgICAgICAgeDMgPSB4MCArIHgyOwotICAgICAgICB4MCAtPSB4MjsKLSAgICAgICAgeDIgPSAoMTgxICogKHg0ICsgeDUpICsgMTI4KSA+PiA4OwotICAgICAgICB4NCA9ICgxODEgKiAoeDQgLSB4NSkgKyAxMjgpID4+IDg7Ci0KLSAgICAgICAgLyogZm91cnRoIHN0YWdlICovCi0gICAgICAgIHdvcmQgPSAoKHg3ICsgeDEpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQod29yZCkKLQotICAgICAgICB0ZW1wID0gKCh4MyArIHgyKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgOCk7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDAgKyB4NCkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLQotICAgICAgICB0ZW1wID0gKCh4OCArIHg2KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMjQpOwotICAgICAgICAqKChpbnQzMiopKGNvbXApKSA9IHdvcmQ7Ci0KLSAgICAgICAgd29yZCA9ICgoeDggLSB4NikgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQotCi0gICAgICAgIHRlbXAgPSAoKHgwIC0geDQpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLQotICAgICAgICB0ZW1wID0gKCh4MyAtIHgyKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRlbXApCi0gICAgICAgIHdvcmQgPSB3b3JkIHwgKHRlbXAgPDwgMTYpOwotCi0gICAgICAgIHRlbXAgPSAoKHg3IC0geDEpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAyNCk7Ci0gICAgICAgICooKGludDMyKikoY29tcCArIDQpKSA9IHdvcmQ7Ci0gICAgICAgIGNvbXAgKz0gb2Zmc2V0OwotCi0gICAgICAgIGJsayArPSBCX1NJWkU7Ci0gICAgfQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFbmQgRnVuY3Rpb246IGlkY3Ryb3cKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gTkFNRTogaWRjdGNvbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUyBGT1IgaWRjdGNvbAotCi0gSW5wdXRzOgotICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBPdXRwdXRzOgotICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQotICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgotICAgICAgdmFyaWFibGVfYmZyXQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTiBGT1IgaWRjdGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMgRk9SIGlkY3Rjb2wKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUyBGT1IgaWRjdGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERSBGT1IgaWRjdGNvbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRCBGT1IgaWRjdGNvbAotICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KLQotIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKLSAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KLQotICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQotICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKLSAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRnVuY3Rpb24gQ29kZSBGT1IgaWRjdGNvbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIGlkY3Rjb2woCi0gICAgaW50MTYgKmJsawotKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBjb2x1bW4gKHZlcnRpY2FsKSBJRENUCi0gICAgKgotICAgICogNyAgICAgICAgICAgICAgICAgICAgICAgICBwaSAgICAgICAgIDEgZHN0Wzgqa10gPSBzdW0gY1tsXSAqIHNyY1s4KmxdICoKLSAgICAqIGNvcyggLS0gKiAoIGsgKyAtICkgKiBsICkgbD0wICAgICAgICAgICAgICAgICAgICAgICAgOCAgICAgICAgICAyCi0gICAgKgotICAgICogd2hlcmU6IGNbMF0gICAgPSAxLzEwMjQgY1sxLi43XSA9ICgxLzEwMjQpKnNxcnQoMikgKi8KLSAgICB4MSA9IChpbnQzMilibGtbMzJdIDw8IDExOwotICAgIHgyID0gYmxrWzQ4XTsKLSAgICB4MyA9IGJsa1sxNl07Ci0gICAgeDQgPSBibGtbOF07Ci0gICAgeDUgPSBibGtbNTZdOwotICAgIHg2ID0gYmxrWzQwXTsKLSAgICB4NyA9IGJsa1syNF07Ci0jaWZuZGVmIEZBU1RfSURDVAotICAgIC8qIHNob3J0Y3V0ICovICAgICAgICAvKiBjb3ZlcmVkIGJ5IGlkY3Rjb2x1bW4xICAwMS85LzIwMDEgKi8KLSAgICBpZiAoISh4MSB8IHgyIHwgeDMgfCB4NCB8IHg1IHwgeDYgfCB4NykpCi0gICAgewotICAgICAgICBibGtbMF0gPSBibGtbOF0gPSBibGtbMTZdID0gYmxrWzI0XSA9IGJsa1szMl0gPSBibGtbNDBdID0gYmxrWzQ4XSA9IGJsa1s1Nl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGJsa1swXSA8PCAzOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKLQotICAgIC8qIGZpcnN0IHN0YWdlICovCi0gICAgeDggPSBXNyAqICh4NCArIHg1KTsKLSAgICB4NCA9IHg4ICsgKFcxIC0gVzcpICogeDQ7Ci0gICAgeDUgPSB4OCAtIChXMSArIFc3KSAqIHg1OwotICAgIHg4ID0gVzMgKiAoeDYgKyB4Nyk7Ci0gICAgeDYgPSB4OCAtIChXMyAtIFc1KSAqIHg2OwotICAgIHg3ID0geDggLSAoVzMgKyBXNSkgKiB4NzsKLQotICAgIC8qIHNlY29uZCBzdGFnZSAqLwotICAgIHg4ID0geDAgKyB4MTsKLSAgICB4MCAtPSB4MTsKLSAgICB4MSA9IFc2ICogKHgzICsgeDIpOwotICAgIHgyID0geDEgLSAoVzIgKyBXNikgKiB4MjsKLSAgICB4MyA9IHgxICsgKFcyIC0gVzYpICogeDM7Ci0gICAgeDEgPSB4NCArIHg2OwotICAgIHg0IC09IHg2OwotICAgIHg2ID0geDUgKyB4NzsKLSAgICB4NSAtPSB4NzsKLQotICAgIC8qIHRoaXJkIHN0YWdlICovCi0gICAgeDcgPSB4OCArIHgzOwotICAgIHg4IC09IHgzOwotICAgIHgzID0geDAgKyB4MjsKLSAgICB4MCAtPSB4MjsKLSAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7Ci0gICAgeDQgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OwotCi0gICAgLyogZm91cnRoIHN0YWdlICovCi0gICAgYmxrWzBdICAgID0gKHg3ICsgeDEpID4+IDg7Ci0gICAgYmxrWzhdID0gKHgzICsgeDIpID4+IDg7Ci0gICAgYmxrWzE2XSA9ICh4MCArIHg0KSA+PiA4OwotICAgIGJsa1syNF0gPSAoeDggKyB4NikgPj4gODsKLSAgICBibGtbMzJdID0gKHg4IC0geDYpID4+IDg7Ci0gICAgYmxrWzQwXSA9ICh4MCAtIHg0KSA+PiA4OwotICAgIGJsa1s0OF0gPSAoeDMgLSB4MikgPj4gODsKLSAgICBibGtbNTZdID0gKHg3IC0geDEpID4+IDg7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyAgRW5kIEZ1bmN0aW9uOiBpZGN0Y29sCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2X2ZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5M2I0OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBbaW5wdXRfdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IHRvIG1vZHVsZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbbG9jYWxfcHRyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBsb2NhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBHbG9iYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtnbG9iYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBzdG9yZSwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtnbG9iYWxfYnVmZmVyX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIHRoZSBnbG9iYWwgYnVmZmVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBwb2ludGVyLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gT3V0cHV0czoKLSAgICBbcmV0dXJuX3ZhcmlhYmxlX25hbWVdID0gW2Rlc2NyaXB0aW9uIG9mIGRhdGEvcG9pbnRlciByZXR1cm5lZAotICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIFt2YXJpYWJsZV9iZnJfcHRyXSBwb2ludHMgdG8gdGhlIFtkZXNjcmliZSB3aGVyZSB0aGUKLSAgICAgIHZhcmlhYmxlX2Jmcl9wdHIgcG9pbnRzIHRvLCBpdHMgdHlwZSBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoCi0gICAgICAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbdmFyaWFibGVfYmZyXSBjb250ZW50cyBhcmUgW2Rlc2NyaWJlIHRoZSBuZXcgY29udGVudHMgb2YKLSAgICAgIHZhcmlhYmxlX2Jmcl0KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbbG9jYWxfc3RvcmVfbmFtZV0gPSBbZGVzY3JpYmUgbmV3IGNvbnRlbnRzLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotICAgRm9yIGZhc3QgRGVibG9jayBmaWx0ZXJpbmcKLSAgIE5ld2VyIHZlcnNpb24gKG1hY3JvYmxvY2sgYmFzZWQgcHJvY2Vzc2luZykKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLSBbTGlzdCByZXF1aXJlbWVudHMgdG8gYmUgc2F0aXNmaWVkIGJ5IHRoaXMgbW9kdWxlLl0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVGRVJFTkNFUwotCi0gW0xpc3QgYWxsIHJlZmVyZW5jZXMgdXNlZCBpbiBkZXNpZ25pbmcgdGhpcyBtb2R1bGUuXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBQU0VVRE8tQ09ERQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVNPVVJDRVMgVVNFRAotICAgV2hlbiB0aGUgY29kZSBpcyB3cml0dGVuIGZvciBhIHNwZWNpZmljIHRhcmdldCBwcm9jZXNzb3IgdGhlCi0gICAgIHRoZSByZXNvdXJjZXMgdXNlZCBzaG91bGQgYmUgZG9jdW1lbnRlZCBiZWxvdy4KLQotIFNUQUNLIFVTQUdFOiBbc3RhY2sgY291bnQgZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZSB0byByZXByZXNlbnQKLSAgICAgICAgICBzdGFjayB1c2FnZSBmb3IgZWFjaCBzdWJyb3V0aW5lIGNhbGxlZF0KLQotICAgICB3aGVyZTogW3N0YWNrIHVzYWdlIHZhcmlhYmxlXSA9IHN0YWNrIHVzYWdlIGZvciBbc3Vicm91dGluZQotICAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotIERBVEEgTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIFBST0dSQU0gTUVNT1JZIFVTRUQ6IHggd29yZHMKLQotIENMT0NLIENZQ0xFUzogW2N5Y2xlIGNvdW50IGVxdWF0aW9uIGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUKLSAgICAgICAgICAgdXNlZCB0byByZXByZXNlbnQgY3ljbGUgY291bnQgZm9yIGVhY2ggc3Vicm91dGluZQotICAgICAgICAgICBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtjeWNsZSBjb3VudCB2YXJpYWJsZV0gPSBjeWNsZSBjb3VudCBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgbmFtZV0gKHNlZSBbZmlsZW5hbWVdLmV4dCkKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTlZfUE9TU0lCTEVfTE9TU19PRl9EQVRBCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vLyNkZWZpbmUgRklMVEVSX0xFTl84Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBGdW5jdGlvbiBwcm90b3R5cGUgOiB2b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIoICAgdWludDggKnJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKlFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcHBfbW9kKQotICAgIFBhcmFtZXRlcnMgIDoKLSAgICAgICAgcmVjICAgICA6ICAgcG9pbnRlciB0byB0aGUgZGVjb2RlZCBmcmFtZSBidWZmZXIuCi0gICAgICAgIHdpZHRoICAgOiAgIHdpZHRoIG9mIGRlY29kZWQgZnJhbWUuCi0gICAgICAgIGhlaWdodCAgOiAgIGhlaWdodCBvZiBkZWNvZGVkIGZyYW1lCi0gICAgICAgIFFQX3N0b3JlOiAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIFFQIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlY29kZWQgZnJhbWUuCi0gICAgICAgICAgICAgICAgICAgIEl0IGhhZCBvbmx5IG9uZSB2YWx1ZSBmb3IgZWFjaCBNQi4KLSAgICAgICAgY2hyICAgICA6ICAgbHVtYSBvciBjb2xvciBpbmRpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgID09IDAgbHVtYQotICAgICAgICAgICAgICAgICAgICA9PSAxIGNvbG9yCi0gICAgICAgIHBwX21vZCAgOiAgIFRoZSBzZW1waG9yZSB1c2VkIGZvciBkZWJsb2NraW5nCi0KLSAgICBSZW1hcmsgICAgICA6ICAgVGhlIGZ1bmN0aW9uIGRvIHRoZSBkZWJsb2NraW5nIG9uIGRlY29kZWQgZnJhbWVzLgotICAgICAgICAgICAgICAgICAgICBGaXJzdCBiYXNlZCBvbiB0aGUgc2VtYXBob3JlIGluZm8uLCBpdCBpcyBkaXZpZGVkIGludG8gaGFyZCBhbmQgc29mdCBmaWx0ZXJpbmcuCi0gICAgICAgICAgICAgICAgICAgIFRvIGRpZmZlcmVudGlhdGUgcmVhbCBhbmQgZmFrZSBlZGdlLCBpdCB0aGVuIGNoZWNrIHRoZSBkaWZmZXJlbmNlIHdpdGggUVAgdG8KLSAgICAgICAgICAgICAgICAgICAgZGVjaWRlIHdoZXRoZXIgdG8gZG8gdGhlIGZpbHRlcmluZyBvciBub3QuCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgYnIsIGJjLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfZTsKLSAgICBpbnQgcHBfdywgcHBfaDsKLSAgICBpbnQgYnJ3aWR0aDsKLQotICAgIGludCBqVmFsMCwgalZhbDEsIGpWYWwyOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpICAgICAgICAgLyogcm93IG9mIGJsb2NrcyAqLwotICAgIHsKLSAgICAgICAgYnJ3aWR0aCA9IG1iciAqIHBwX3c7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKSAgICAgLyogY29sIG9mIGJsb2NrcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNocikKLSAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlWyhicndpZHRoPj4yKSArIChtYmM+PjEpXTsgLyogUVAgaXMgcGVyIE1CIGJhc2VkIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qKioqKioqKiogZm9yIGVhY2ggYmxvY2sgKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgLyogMngyIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgJiBsZWZ0IGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHByb2ZpbGUgb24gQVJNOTIwVCBzaG93cyBzZXBhcmF0ZSB0aGVzZSB0d28gYm91bmRhcnkgY2hlY2sgaXMgZmFzdGVyIHRoYW4gY29tYmluZSB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCkgICAgICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBsb3dlc3Qgcm93IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPCBwcF93KSAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbW9zdCByaWdodCBjb2wgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgODsgICAgICAgIC8qIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGxvb3AgZW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwXSYweDAyKSkgJiYgKChwcF9tb2RbalZhbDAtcHBfd10mMHgwMikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG9yaXogSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkgLyogKEQtQykgY29tcGFyZWQgd2l0aCAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhbCBhbmQgZmFrZSBlZGdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAoKGpWYWwwICsgalZhbDEpID4+IDEpOyAgICAgLyogKEQrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7ICAgIC8qICBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh1aW50OCkoalZhbDApOyAgICAgICAgICAvKiAgRCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSk7ICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyB3aWR0aCk7ICAgICAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAvKiBFLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKTsgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgKHdpZHRoIDw8IDEpKTsgICAgICAvKiBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBhM18wID4gMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgLyogSG9yaXogc29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogQy1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQKSkpKSAvKiAoQy1CKSBjb21wYXJlZCB3aXRoIFFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICgoalZhbDAgKyBqVmFsMSkgPj4gMSk7ICAgICAvKiAoQitDKS8yIGNhbm5vdCBvdmVyZmxvdzsgY2VpbCgpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsgICAgLyogQiA9IChCK0MpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ4KWpWYWwwOyAgICAgICAgICAgIC8qIEMgPSAoQitDKS8yICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpKTsgICAgICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIHdpZHRoKTsgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAvKiBELUEgKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3B0ciA8IHB0cl9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIFZlcnQuIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjICsgMTsgYmMgPCBtYmMgKyAzOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArICh3aWR0aCA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMC0xXSYweDAxKSkgJiYgKChwcF9tb2RbalZhbDBdJjB4MDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnQgSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7IC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgIC8qIEQtQyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAoalZhbDAgKyBqVmFsMSkgPj4gMTsgICAvKiAoQytEKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciAgICAgICAgPSAgIGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgID0gICBqVmFsMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAxKTsgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMik7ICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAyKTsgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMyk7ICAgICAvKiBBICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgIC8qIGVuZCBvZiB2ZXIgaGFyZCBmaWxldGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgLyogVmVydCBzb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIDEpOyAgICAgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVApKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0galZhbDE7ICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSA9IGpWYWwxOyAgICAgLyogQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IChqVmFsMSAtIGpWYWwwKTsgICAgICAgIC8qIEQtIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKChqVmFsMikgKyA3KSA+PiAzKTsgICAgICAvKiBEIC09IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKCgoalZhbDIpICsgNykgPj4gMyk7ICAgICAgLyogQSArPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCg3IC0gKGpWYWwyKSkgPj4gMyk7ICAgICAgLyogRCAtPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIChqVmFsMikpID4+IDMpOyAgICAgIC8qIEEgKz0gKEQtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDEpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMikgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci12b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZygKLSAgICB1aW50OCAqcmVjLAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0LAotICAgIGludDE2ICpRUF9zdG9yZSwKLSAgICBpbnQgY2hyLAotICAgIHVpbnQ4ICpwcF9tb2QpCi17Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGJyLCBiYywgbWJyLCBtYmM7Ci0gICAgaW50IFFQID0gMTsKLSAgICB1aW50OCAqcHRyLCAqcHRyX2U7Ci0gICAgaW50IHBwX3csIHBwX2g7Ci0gICAgaW50IGJyd2lkdGg7Ci0KLSAgICBpbnQgalZhbDAsIGpWYWwxLCBqVmFsMjsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHBwX3cgPSAod2lkdGggPj4gMyk7Ci0gICAgcHBfaCA9IChoZWlnaHQgPj4gMyk7Ci0KLSAgICBmb3IgKG1iciA9IDA7IG1iciA8IHBwX2g7IG1iciArPSAyKSAgICAgICAgIC8qIHJvdyBvZiBibG9ja3MgKi8KLSAgICB7Ci0gICAgICAgIGJyd2lkdGggPSBtYnIgKiBwcF93OyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgY3VycmVudCBibG9jayByb3cgKi8KLSAgICAgICAgZm9yIChtYmMgPSAwOyBtYmMgPCBwcF93OyBtYmMgKz0gMikgICAgIC8qIGNvbCBvZiBibG9ja3MgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjaHIpCi0gICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVsoYnJ3aWR0aD4+MikgKyAobWJjPj4xKV07IC8qIFFQIGlzIHBlciBNQiBiYXNlZCB2YWx1ZSAqLwotCi0gICAgICAgICAgICAvKioqKioqKioqIGZvciBlYWNoIGJsb2NrICoqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBIb3Jpei4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1iciArIDE7IGJyIDwgbWJyICsgMzsgYnIrKykgIC8qIDJ4MiBibG9ja3MgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7ICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGFib3ZlICYgbGVmdCBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICAgICAgICAgIC8qIHRoZSBwcm9maWxlIG9uIEFSTTkyMFQgc2hvd3Mgc2VwYXJhdGUgdGhlc2UgdHdvIGJvdW5kYXJ5IGNoZWNrIGlzIGZhc3RlciB0aGFuIGNvbWJpbmUgdGhlbSAqLwotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpICAgICAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbG93ZXN0IHJvdyBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykgICAgICAgICAgICAgIC8qIGJvdW5kYXJ5IDogZG9uJ3QgZG8gaXQgb24gdGhlIG1vc3QgcmlnaHQgY29sIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArIDg7ICAgICAgICAvKiBwb2ludGVyIHRvIHdoZXJlIHRoZSBsb29wIGVuZHMgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMF0mMHgwMikpICYmICgocHBfbW9kW2pWYWwwLXBwX3ddJjB4MDIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhvcml6IEhhcmQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSB3aWR0aCk7ICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpIC8qIChELUMpIGNvbXBhcmVkIHdpdGggMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHJlYWwgYW5kIGZha2UgZWRnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKChqVmFsMCArIGpWYWwxKSA+PiAxKTsgICAgIC8qIChEK0MpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOyAgICAvKiAgQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSAodWludDgpKGpWYWwwKTsgICAgICAgICAgLyogIEQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkpOyAgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgd2lkdGgpOyAgICAgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogIHN0b3JlIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIHN0b3JlIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCAtPSAoKDMgLSBqVmFsMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCk7ICAvKiBBICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArICh3aWR0aCA8PCAxKSk7ICAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArICh3aWR0aCA8PCAxKSkgPSAodWludDgpKGpWYWwxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LyogYTNfMCA+IDJRUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgrK3B0ciA8IHB0cl9lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBib3VuZGFyeSBjaGVja2luZyovCi0gICAgICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIFZlcnQuIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjICsgMTsgYmMgPCBtYmMgKyAzOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSBicndpZHRoICsgYmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikgICAgUVAgPSBRUF9zdG9yZVtqVmFsMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZSA9IHB0ciArICh3aWR0aCA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtqVmFsMC0xXSYweDAxKSkgJiYgKChwcF9tb2RbalZhbDBdJjB4MDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZlcnQgSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7IC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgIC8qIEQtQyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCA8PCAxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgoalZhbDIgPCAwKSAmJiAoalZhbDIgPiAtKFFQIDw8IDEpKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAoalZhbDAgKyBqVmFsMSkgPj4gMTsgICAvKiAoQytEKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciAgICAgICAgPSAgIGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgID0gICBqVmFsMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAxKTsgICAgIC8qIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMik7ICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEUgPSBFIC0oRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsgICAgICAgIC8qIEIgPSBCICsoRS1CKS80ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAyKTsgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMyk7ICAgICAvKiBBICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIChGLUEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBGIC09IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiAtIDcpID4+IDMpOyAgICAvKiBBICs9IChGLUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAyKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDMpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgIC8qIGVuZCBvZiB2ZXIgaGFyZCBmaWxldGVyaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwdHIgKz0gd2lkdGgpIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1Y2Y3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZyX2ZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgaW5kZXgsIGNvdW50ZXI7Ci0gICAgaW50IGJyLCBiYywgaW5jciwgbWJyLCBtYmM7Ci0gICAgaW50IFFQID0gMTsKLSAgICBpbnQgdls1XTsKLSAgICB1aW50OCAqcHRyLCAqcHRyX2MsICpwdHJfbjsKLSAgICBpbnQgdzEsIHcyLCB3MywgdzQ7Ci0gICAgaW50IHBwX3csIHBwX2gsIGJyd2lkdGg7Ci0gICAgaW50IHN1bSwgZGVsdGE7Ci0gICAgaW50IGEzXzAsIGEzXzEsIGEzXzIsIEEzXzA7Ci0gICAgLyogZm9yIERlcmluZ2luZyBUaHJlc2hvbGQgYXBwcm9hY2ggKE1QRUc0KSovCi0gICAgaW50IG1heF9kaWZmLCB0aHJlcywgdjAsIGgwLCBtaW5fYmxrLCBtYXhfYmxrOwotICAgIGludCBjbnRoZmxhZzsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogQ2FsY3VsYXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhcmVhIGluIGJsb2NrcyAoZGl2aWRlIGJ5IDgpICovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIC8qIFNldCB1cCB2YXJpb3VzIHZhbHVlcyBuZWVkZWQgZm9yIHVwZGF0aW5nIHBvaW50ZXJzIGludG8gcmVjICovCi0gICAgdzEgPSB3aWR0aDsgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIG5leHQgcm93IGluIHBpeGVscyAqLwotICAgIHcyID0gd2lkdGggPDwgMTsgICAgICAgIC8qIE9mZnNldCB0byB0d28gcm93cyBpbiBwaXhlbHMgKi8KLSAgICB3MyA9IHcxICsgdzI7ICAgICAgICAgICAvKiBPZmZzZXQgdG8gdGhyZWUgcm93cyBpbiBwaXhlbHMgKi8KLSAgICB3NCA9IHcyIDw8IDE7ICAgICAgICAgICAvKiBPZmZzZXQgdG8gZm91ciByb3dzIGluIHBpeGVscyAqLwotICAgIGluY3IgPSB3aWR0aCAtIEJMS1NJWkU7IC8qIE9mZnNldCB0byBuZXh0IHJvdyBhZnRlciBwcm9jZXNzaW5nIGJsb2NrICovCi0KLSAgICAvKiBXb3JrIHRocm91Z2ggdGhlIGFyZWEgaG9ydGl6b250YWxseSBieSB0d28gcm93cyBwZXIgc3RlcCAqLwotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpCi0gICAgewotICAgICAgICAvKiBicndpZHRoIGNvbnRhaW5zIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGxlZnRtb3N0IGJsb2NrCi0gICAgICAgICAqIG9mIHRoZSBjdXJyZW50IHJvdyAqLwotICAgICAgICBicndpZHRoID0gbWJyICogcHBfdzsKLQotICAgICAgICAvKiBXb3JrIHRocm91Z2ggdGhlIGFyZWEgdmVydGljYWxseSBieSB0d28gY29sdW1ucyBwZXIgc3RlcCAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBsdW1pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIG1hY3JvYmxvY2sgKi8KLSAgICAgICAgICAgIGlmICghY2hyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIGJyd2lkdGgvNCBpcyB0aGUgbWFjcm9ibG9jayBudW1iZXIgYW5kIG1iYy8yIGlzIHRoZSBtYWNyb2Jsb2NrIGNvbCBudW1iZXIqLwotICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbKGJyd2lkdGg+PjIpICsgKG1iYz4+MSldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBQcm9jZXNzIGZvdXIgYmxvY2tzIGZvciB0aGUgZmlsdGVyaW5nICAgICAgICAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogTG9vcCBvdmVyIHR3byByb3dzIG9mIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChiciA9IG1iciArIDE7IGJyIDwgbWJyICsgMzsgYnIrKykgICAgLyogYnIgaXMgdGhlIHJvdyBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNldCBicndpZHRoIHRvIHRoZSBmaXJzdCAobGVmdG1vc3QpIGJsb2NrIG51bWJlciBvZiB0aGUgbmV4dCByb3cgKi8KLSAgICAgICAgICAgICAgICAvKiBicndpZHRoIGlzIHVzZWQgYXMgYW4gaW5kZXggd2hlbiBjb3VudGluZyBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0KLSAgICAgICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIGNvbHVtbnMgb2YgYmxvY2tzIGluIHRoZSByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspICAgIC8qIGJjIGlzIHRoZSBjb2x1bW4gY291bnRlciBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHB0ciB0byB0aGUgZmlyc3QgcGl4ZWwgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJyd2lkdGggKiA2NCBpcyB0aGUgcGl4ZWwgcm93IG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgKiBiYyAqIDggaXMgdGhlIHBpeGVsIGNvbHVtbiBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93IGNvdW50aW5nIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBicndpZHRoICsgYmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBoYXJkIGhvcml6b250YWwgZmlsdGVyIGlmIHNlbWFwaG9yZSBmb3IgaG9yaXpvbnRhbCBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgYmxvY2sgaW1tZWRpYXRlbHkgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHBwX21vZFtpbmRleF0mMHgwMikgIT0gMCkgJiYgKChwcF9tb2RbaW5kZXgtcHBfd10mMHgwMikgIT0gMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgLyogSGFyZCBmaWx0ZXIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBIb3J6SGZsYWcgKGJpdCA0KSBpbiB0aGUgcHBfbW9kIGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LXBwX3ddIHw9IDB4MTA7IC8qICA0LzI2LzAwIHJldXNlIHBwX21vZCBmb3IgSG9yekhmbGFnKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBhY3Jvc3MgdGhlIDggcGl4ZWxzIG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKnB0ciAtICoocHRyIC0gdzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGhIIHRocmVzaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLCBhcHBseSBoYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGhIIHx8IGEzXzAgPCAtS1RoSCkgJiYgYTNfMDxRUCAmJiBhM18wPiAtUVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jID0gcHRyIC0gdzM7ICAgLyogUG9pbnRzIHRvIHBpeGVsIHRocmVlIHJvd3MgYWJvdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uID0gcHRyICsgdzE7ICAgLyogUG9pbnRzIHRvIHBpeGVsIG9uZSByb3cgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMF0gPSAoaW50KSgqKHB0cl9jIC0gdzMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSAoaW50KSgqKHB0cl9jIC0gdzIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMl0gPSAoaW50KSgqKHB0cl9jIC0gdzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbM10gPSAoaW50KSgqcHRyX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdls0XSA9IChpbnQpKCoocHRyX2MgKyB3MSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSB2WzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqcHRyX2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdls0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIHcyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCoocHRyX2MgKyB3MykpOyAgLyogQ3VycmVudCBwaXhlbCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOyAgIC8qIEF2ZXJhZ2UgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyX2MpID0gKHVpbnQ4KSBkZWx0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBwb2ludGVyIGRvd24gb25lIHJvdyBvZiBwaXhlbHMgKHBvaW50cyB0byBwaXhlbCB0d28gcm93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWJvdmUgY3VycmVudCBwaXhlbCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IHcxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgNTsgY291bnRlcisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IG9mZiBoaWdoZXN0IHBpeGVsIGFuZCBhZGQgaW4gcGl4ZWwgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSBzdW0gLSB2W2NvdW50ZXJdICsgKnB0cl9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF2ZXJhZ2UgdGhlIHBpeGVsIHZhbHVlcyB3aXRoIHJvdW5kaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3VtICsgKnB0cl9jICsgNCkgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX2MgPSAodWludDgpKGRlbHRhKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVycyB0byBuZXh0IHBpeGVsIHJvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBpbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7IC8qIHNvZnQgZmlsdGVyKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIEhvcnpIZmxhZyAoYml0IDQpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RbaW5kZXgtcHBfd10gJj0gMHhlZjsgLyogcmVzZXQgMTExMCwxMTExICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsIGFuZCB0aGUgcGl4ZWwgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICoocHRyKSAtICoocHRyIC0gdzEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGggdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcHBseSBzb2Z0IGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGggfHwgYTNfMCA8IC1LVGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1bSBvZiB3ZWlnaHRlZCBkaWZmZXJlbmNlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCArPSAoKCoocHRyIC0gdzIpIC0gKihwdHIgKyB3MSkpIDw8IDEpICsgKGEzXzAgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHN1bSBpcyBsZXNzIHRoYW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVl9BQlMoYTNfMCkgPCAoUVAgPDwgMykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSA9ICoocHRyIC0gdzIpIC0gKihwdHIgLSB3Myk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSArPSAoKCoocHRyIC0gdzQpIC0gKihwdHIgLSB3MSkpIDw8IDEpICsgKGEzXzEgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICA9ICoocHRyICsgdzIpIC0gKihwdHIgKyB3MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiArPSAoKCoocHRyKSAtICoocHRyICsgdzMpKSA8PCAxKSArIChhM18yIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IFBWX0FCUyhhM18wKSAtIFBWX01JTihQVl9BQlMoYTNfMSksIFBWX0FCUyhhM18yKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wICs9IEEzXzAgPDwgMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IChBM18wICsgMzIpID4+IDY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCA9IC1BM18wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoKihwdHIgLSB3MSkgLSAqKHB0cikpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gQTNfMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3MSkgPSAodWludDgpKCoocHRyIC0gdzEpIC0gZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0cikgPSAodWludDgpKCoocHRyKSArIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qdGhyZXNob2xkKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlciB0byBuZXh0IHBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyppbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICB9LypiYyovCi0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgZm91ciBibG9ja3MgZm9yIHRoZSBmaWx0ZXJpbmcgICAgICAgICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIHJvd3Mgb2YgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyOyBiciA8IG1iciArIDI7IGJyKyspICAgICAgLyogYnIgaXMgdGhlIHJvdyBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspICAvKiBiYyBpcyB0aGUgY29sdW1uIGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBpZiB0aGUgcm93IGFuZCBjb2x1bW4gY291bnRlcnMgYXJlIHdpdGhpbiB0aGUgYXJlYSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oICYmIGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBwdHIgdG8gdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgc2Vjb25kIHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgKiBicndpZHRoICogNjQgaXMgdGhlIHBpeGVsIHJvdyBvZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICogYmMgKiA4IGlzIHRoZSBwaXhlbCBjb2x1bW4gb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBpbmRleCB0byB0aGUgY3VycmVudCBibG9jayBvZiB0aGUgc2Vjb25kIHJvdyBjb3VudGluZyBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYnJ3aWR0aCArIGJjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaGFyZCB2ZXJ0aWNhbCBmaWx0ZXIgaWYgc2VtYXBob3JlIGZvciB2ZXJ0aWNhbCBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgYmxvY2sgaW1tZWRpYXRlbHkgbGVmdCBvZiBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2luZGV4LTFdJjB4MDEpICE9IDApICYmICgocHBfbW9kW2luZGV4XSYweDAxKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvKiBIYXJkIGZpbHRlciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IFZlcnRIZmxhZyAoYml0IDUpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gb2YgcHJldmlvdXMgYmxvY2sqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC0xXSB8PSAweDIwOyAvKiAgNC8yNi8wMCByZXVzZSBwcF9tb2QgZm9yIFZlcnRIZmxhZyovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYWNyb3NzIHRoZSA4IHBpeGVscyBvZiB0aGUgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHRoZSBwaXhlbCB0byBsZWZ0IG9mIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgPSAqcHRyIC0gKihwdHIgLSAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgS1RoSCB0aHJlc2hvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIHdpdGhpbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciwgYXBwbHkgaGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhM18wID4gS1RoSCB8fCBhM18wIDwgLUtUaEgpICYmIGEzXzA8UVAgJiYgYTNfMD4gLVFQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyA9IHB0ciAtIDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfbiA9IHB0ciArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzBdID0gKGludCkoKihwdHJfYyAtIDMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSAoaW50KSgqKHB0cl9jIC0gMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsyXSA9IChpbnQpKCoocHRyX2MgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzNdID0gKGludCkoKnB0cl9jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbNF0gPSAoaW50KSgqKHB0cl9jICsgMSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSB2WzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHZbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAqcHRyX2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdls0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIDIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIDMpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3VtICsgKnB0cl9jICsgNCkgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyX2MpID0gKHVpbnQ4KSBkZWx0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW92ZSBwb2ludGVyIGRvd24gb25lIHBpeGVsIHRvIHRoZSByaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCA1OyBjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb2ZmIGhpZ2hlc3QgcGl4ZWwgYW5kIGFkZCBpbiBwaXhlbCBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSAtIHZbY291bnRlcl0gKyAqcHRyX247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZlcmFnZSB0aGUgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfYyA9ICh1aW50OCkoZGVsdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSB3MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogc29mdCBmaWx0ZXIqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgVmVydEhmbGFnIChiaXQgNSkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC0xXSAmPSAweGRmOyAvKiByZXNldCAxMTAxLDExMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGluZGV4ID0gQkxLU0laRTsgaW5kZXggPiAwOyBpbmRleC0tKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHBpeGVsIGFuZCB0aGUgcGl4ZWwgYWJvdmUgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICoocHRyKSAtICoocHRyIC0gMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaCB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvZnQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaCB8fCBhM18wIDwgLUtUaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIHdlaWdodGVkIGRpZmZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wICs9ICgoKihwdHIgLSAyKSAtICoocHRyICsgMSkpIDw8IDEpICsgKGEzXzAgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHN1bSBpcyBsZXNzIHRoYW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVl9BQlMoYTNfMCkgPCAoUVAgPDwgMykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSA9ICoocHRyIC0gMikgLSAqKHB0ciAtIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzEgKz0gKCgqKHB0ciAtIDQpIC0gKihwdHIgLSAxKSkgPDwgMSkgKyAoYTNfMSA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzIgID0gKihwdHIgKyAyKSAtICoocHRyICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiArPSAoKCoocHRyKSAtICoocHRyICsgMykpIDw8IDEpICsgKGEzXzIgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gUFZfQUJTKGEzXzApIC0gUFZfTUlOKFBWX0FCUyhhM18xKSwgUFZfQUJTKGEzXzIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgKz0gQTNfMCA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gKEEzXzAgKyAzMikgPj4gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gLUEzXzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9ICgqKHB0ciAtIDEpIC0gKihwdHIpKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IEEzXzApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUFZfTUFYKEEzXzAsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMSkgPSAodWludDgpKCoocHRyIC0gMSkgLSBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyKSA9ICh1aW50OCkoKihwdHIpICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyp0aHJlc2hvbGQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSB3MTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBTb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgIH0gLyogYm91bmRhcnkqLwotICAgICAgICAgICAgICAgIH0gLypiYyovCi0gICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgdG8gbmV4dCByb3cgb2YgcGl4ZWxzICovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBEZXJpbmdpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogUHJvY2VzcyBmb3VyIGJsb2NrcyBmb3IgdGhlIGZpbHRlcmluZyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gcm93cyBvZiBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIGNvbHVtbnMgb2YgYmxvY2tzIGluIHRoZSByb3cgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGJjID0gbWJjOyBiYyA8IG1iYyArIDI7IGJjKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJyd2lkdGggKyBiYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBkZXJpbmdpbmcgaWYgc2VtYXBob3JlIGZvciBkZXJpbmdpbmcgKGJpdC0zIG9mIHBwX21vZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIHNldCBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocHBfbW9kW2luZGV4XSYweDA0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgZGVyaW5naW5nIGlmIG9uIGFuIGVkZ2UgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwICYmIGJjID4gMCAmJiBiciA8IHBwX2ggLSAxICYmIGJjIDwgcHBfdyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbnRoZmxhZyA9IHdlaWdodGVkIGF2ZXJhZ2Ugb2YgSG9yekhmbGFnIG9mIGN1cnJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9uZSBhYm92ZSwgcHJldmlvdXMgYmxvY2tzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4LTFdID4+IDEpICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsgLyogNC8yNi8wMCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gdGhlIGRlcmluZ2luZyBpZiBkZWNpc2lvbiBmbGFncyBpbmRpY2F0ZSBpdCdzIG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY250aGZsYWcgPCAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBhbW91bnQgdG8gY2hhbmdlIGx1bWluYW5jZSBpZiBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiBxdWFudGl6YXRpb24gcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGlmZiA9IChRUCA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBwb2ludGVyIHRvIGZpcnN0IHBpeGVsIG9mIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgb2YgcGl4ZWwgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBwaXhlbCByYW5nZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gREVSSU5HX1RIUiwgc21vb3RoIHRoZSByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4X2JsayAtIG1pbl9ibGspID49IERFUklOR19USFIpIC8qc21vb3RoIDh4OCByZWdpb24qLwotI2lmbmRlZiBOb01NWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNtb290aCBhbGwgcGl4ZWxzIGluIHRoZSBibG9jayovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgocHRyLCB3aWR0aCwgdGhyZXMsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0dXAgdGhlIHN0YXJ0aW5nIHBvaW50IG9mIHRoZSByZWdpb24gdG8gc21vb3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjAgPSAoYnIgPDwgMykgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwID0gKGJjIDw8IDMpIC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc21vb3RoIDh4OCByZWdpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKHJlYywgdjAsIGgwLCB2MCArIDEsIGgwICsgMSwgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qY250aGZsYWcqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLypkZXJpbmcgYnI9PTEgb3IgYmM9PTEgKGJvdW5kYXJ5IGJsb2NrKSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAvKiBQcm9jZXNzIHRoZSBib3VuZGFyeSBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlY2lkZSB0byBwZXJmb3JtIGRlYmxvY2tpbmcgYmFzZWQgb24gdGhlIHNlbWFwaG9yZSBmbGFncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBuZWlnaGJvcmluZyBibG9ja3MgaW4gZWFjaCBjYXNlLiBBIGNlcnRhaW4gbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhcmQgZmlsdGVyaW5nIGZsYWdzIGhhdmUgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHNpZ25hbCBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciBzbW9vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyID4gMCAmJiBiciA8IHBwX2ggLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBfbW9kW2luZGV4LXBwX3ddICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4XSA+PiAxKSAmIDB4MTApKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJjID4gMCAmJiBiYyA8IHBwX3cgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleF0gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBhdCB0aGUgY29ybmVyIGRvIGRlZmF1bHQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgZGVyaW5naW5nIGlmIGRlY2lzaW9uIGZsYWdzIGluZGljYXRlIGl0J3MgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRoZmxhZyA8IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGRhdGEgaXMgY2hyb21pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHF1YW50aXphdGlvbiBwYXJhbWVudGVyLiBPbmUgcGFyYW1ldGVyIHBlciBibG9jay4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVtpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBhbW91bnQgdG8gY2hhbmdlIGx1bWluYW5jZSBpZiBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiYXNlZCBvbiBxdWFudGl6YXRpb24gcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGlmZiA9IChRUCA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBwb2ludGVyIHRvIGZpcnN0IHBpeGVsIG9mIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaW5kIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgb2YgcGl4ZWwgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHJlZ2lvbiB0byBzbW9vdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgZ29pbmcgdG8gYmUgYSA0eDQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IChiciA8PCAzKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMCA9IChiYyA8PCAzKSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHBpeGVsIHJhbmdlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBERVJJTkdfVEhSLCBzbW9vdGggdGhlIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXhfYmxrIC0gbWluX2JsaykgPj0gREVSSU5HX1RIUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTbW9vdGggNHg0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKHJlYywgdjAsIGgwLCB2MCAtIDMsIGgwIC0gMywgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKmNudGhmbGFnKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJyPT0wLCBiYz09MCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAvKiBkZXJpbmcqLwotICAgICAgICAgICAgICAgICAgICB9IC8qYm91bmRhcnkgY29uZGl0aW9uKi8KLSAgICAgICAgICAgICAgICB9LypiYyovCi0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgfS8qbWJjKi8KLSAgICAgICAgYnJ3aWR0aCArPSAocHBfdyA8PCAxKTsKLSAgICB9LyptYnIqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybiA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk5MjMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NDAgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICJtcDRkZWNfbGliLmgiIC8qIHZpZGVvIGRlY29kZXIgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotI2luY2x1ZGUgInZsY19kZWNvZGUuaCIKLSNpbmNsdWRlICJiaXRzdHJlYW0uaCIKLSNpbmNsdWRlICJzY2FsaW5nLmgiCi0jaW5jbHVkZSAibWJ0eXBlX21vZGUuaCIKLQotI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05ESVRJT05BTF9JU19DT05TVEFOVAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBEZWNvZGVGcmFtZUNvbWJpbmVkTW9kZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlY29kZSBhIGZyYW1lIG9mIE1QRUc0IGJpdHN0cmVhbSBpbiBjb21iaW5lZCBtb2RlLiAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIDAzLzMwLzIwMDAgOiBDbGVhbmVkIHVwIGFuZCBvcHRpbWl6ZWQgdGhlIGNvZGUuICAgICAgICAgICAgICovCi0vKiAgICAgIDAzLzMxLzIwMDAgOiBBZGRlZCBwcm9wZXIgaGFuZGxpbmcgb2YgTUIgc3R1ZmZpbmcuICAgICAgICAgICovCi0vKiAgICAgIDA0LzEzLzIwMDAgOiBSZXdyb3RlIHRoaXMgY29tYmluZWQgbW9kZSBwYXRoIGNvbXBsZXRlbHkgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgaXQgaGFuZGxlcyAiQ29tYmluZWQgTW9kZSBXaXRoIEVycm9yICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzaWxpZW5jZS4iICBOb3cgdGhlIGNvZGUgcmVzZW1ibGVzIHRoZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwc2V1ZG8gY29kZXMgaW4gTVBFRy00IHN0YW5kYXJkIGJldHRlci4gICAgICAgICovCi0vKiAgICAgIDEwLzEzLzIwMDAgOiBBZGQgZmFzdCBWTEMrZGVxdWFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIDA0LzEzLzIwMDEgOiBmaXggTUJfc3R1ZmZpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgMDgvMDcvMjAwMSA6IHJlbW92ZSBNQnplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIERlY29kZUZyYW1lQ29tYmluZWRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1czsKLSAgICBpbnQgbWJudW07Ci0gICAgVm9wICpjdXJyVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07Ci0gICAgaW50IHNob3J0VmlkZW9IZWFkZXIgPSB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcjsKLSAgICBpbnQxNiBRUCwgKlFQTUIgPSB2aWRlby0+UVBNQjsKLSAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7Ci0gICAgaW50IG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OwotICAgIGludCBzbGljZV9jb3VudGVyOwotICAgIHVpbnQzMiB0bXB2YXIsIGxvbmdfemVyb19iaXRzOwotICAgIHVpbnQgY29kZTsKLSAgICBpbnQgdmFsaWRfc3R1ZmZpbmc7Ci0gICAgaW50IHJlc3luY19tYXJrZXJfbGVuZ3RoOwotICAgIGludCBzdHVmZmluZ19sZW5ndGg7Ci0KLSAgICAvKiBhZGQgdGhpcyBmb3IgZXJyb3IgcmVzaWxpZW50LCAwNS8xOC8yMDAwICovCi0gICAgaW50MzIgc3RhcnRQYWNrZXQ7Ci0gICAgaW50IG1iX3N0YXJ0OwotICAgIC8qIGNvcHkgYW5kIHBhZCB0byBwcmV2X1ZvcCBmb3IgSU5URVIgY29kaW5nICovCi0gICAgc3dpdGNoIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgSV9WT1AgOgotLy8gICAgICBvc2NsX21lbXNldChNb2RlLCBNT0RFX0lOVFJBLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKLSAgICAgICAgICAgIHJlc3luY19tYXJrZXJfbGVuZ3RoID0gMTc7Ci0gICAgICAgICAgICBzdHVmZmluZ19sZW5ndGggPSA5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUF9WT1AgOgotICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOwotICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPm1vdFksIDAsIHNpemVvZihNT1QpKjQqblRvdGFsTUIpOwotLy8gICAgICBvc2NsX21lbXNldChNb2RlLCBNT0RFX0lOVEVSLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKLSAgICAgICAgICAgIHJlc3luY19tYXJrZXJfbGVuZ3RoID0gMTYgKyBjdXJyVm9wLT5mY29kZUZvcndhcmQ7Ci0gICAgICAgICAgICBzdHVmZmluZ19sZW5ndGggPSAxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZUZyYW1lQ29tYmluZWRNb2RlKCk6IFZvcCB0eXBlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgIH0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPmFkdmFuY2VkX0lOVFJBKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPm1vZGlmaWVkX3F1YW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhJVDsKLSAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRlciA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyX0FubmV4VDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRyYSA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyX0FubmV4STsKLSAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRlciA9ICZWbGNEZWNUQ09FRlNob3J0SGVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT5tb2RpZmllZF9xdWFudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+dmxjRGVjQ29lZmZJbnRlciA9IHZpZGVvLT52bGNEZWNDb2VmZkludHJhID0gJlZsY0RlY1RDT0VGU2hvcnRIZWFkZXJfQW5uZXhUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT52bGNEZWNDb2VmZkludGVyID0gdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotI2VuZGlmCi0KLSAgICAvKiogSW5pdGlhbGl6ZSBzbGljZU5vICoqKi8KLSAgICBtYm51bSA9IHNsaWNlX2NvdW50ZXIgPSAwOwotLy8gIG9zY2xfbWVtc2V0KHZpZGVvLT5zbGljZU5vLCAwLCBzaXplb2YodWludDgpKm5Ub3RhbE1CKTsKLSAgICBRUCA9IHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXI7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gbW90aW9uX3NoYXBlX3RleHR1cmUoKSAqLwotICAgICAgICAvKiAgICBpbiB0aGUgTVBFRy00IHN0YW5kYXJkLiAgICAgMDQvMTMvMjAwMCAgICAgICAgICAqLwotICAgICAgICBtYl9zdGFydCA9IG1ibnVtOwotICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMDsgICAgICAgICAgICAgLyogIDA0LzI3LzAxICovCi0gICAgICAgIHN0YXJ0UGFja2V0ID0gZ2V0UG9pbnRlcihzdHJlYW0pOwotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgICAgIGlmICh2aWRlby0+bW9kaWZpZWRfcXVhbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5RUF9DSFIgPSBNUV9jaHJvbWFfUVBfdGFibGVbUVBdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPlFQX0NIUiA9IFFQOyAgICAgLyogQU5ORVhfVCAqLwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgLyogcmVtb3ZlIGFueSBzdHVmZmluZyBiaXRzICovCi0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgsICZjb2RlKTsKLSAgICAgICAgd2hpbGUgKGNvZGUgPT0gMSkKLSAgICAgICAgewotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoKTsKLSAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCBzdHVmZmluZ19sZW5ndGgsICZjb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHdlIG5lZWQgdmlkZW8tPm1ibnVtIGluIGxvd2VyIGxldmVsIGZ1bmN0aW9ucyAqLwotICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07Ci0gICAgICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSwgbk1CUGVyUm93KTsKLSAgICAgICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0gICAgICAgICAgICAvKiBhc3NpZ24gc2xpY2UgbnVtYmVyIGZvciBlYWNoIG1hY3JvYmxvY2tzICovCi0gICAgICAgICAgICB2aWRlby0+c2xpY2VOb1ttYm51bV0gPSAodWludDgpIHNsaWNlX2NvdW50ZXI7Ci0KLSAgICAgICAgICAgIC8qIGRlY29kZSBDT0QsIE1DQlBDLCBBQ3ByZWRfZmxhZywgQ1BCWSBhbmQgRFFVQU5UICovCi0gICAgICAgICAgICAvKiBXZSBoYXZlIHRvIGRpc2NhcmQgc3R1ZmZlZCBNQiBoZWFkZXIgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CaGVhZGVyKHZpZGVvLCAmUVApOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIChzdGFydFBhY2tldCAmIC04KSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIHRoZSBRUCB2YWx1ZSBmb3IgbGF0ZXIgdXNlIGluIEFDIHByZWRpY3Rpb24gKi8KLSAgICAgICAgICAgIFFQTUJbbWJudW1dID0gUVA7Ci0KLSAgICAgICAgICAgIGlmIChNb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBEQ1QgY29lZmljaWVudHMgZm9yIHRoZSBNQiAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEdldE1CRGF0YSh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OwotICAgICAgICAgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgKHN0YXJ0UGFja2V0ICYgLTgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBNT0RFX1NLSVBQRUQgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTa2lwcGVkTUJNb3Rpb25Db21wKHZpZGVvKTsgLyogIDA4LzA0LzA1ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBNb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBwdXQgdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jawotICAgICAgICAgICAgbWJudW0rKzsKLQotICAgICAgICAgICAgLyogcmVtb3ZlIGFueSBzdHVmZmluZyBiaXRzICovCi0gICAgICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgc3R1ZmZpbmdfbGVuZ3RoLCAmY29kZSk7Ci0gICAgICAgICAgICB3aGlsZSAoY29kZSA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIHN0dWZmaW5nX2xlbmd0aCwgJmNvZGUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBoYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdmlkZW8gcGFja2V0IG9yIHZvcD8gKi8KLSAgICAgICAgICAgIGlmIChzaG9ydFZpZGVvSGVhZGVyKQotICAgICAgICAgICAgewotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgICAgIGlmICghdmlkZW8tPnNsaWNlX3N0cnVjdHVyZSkKLSAgICAgICAgICAgICAgICB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ibnVtID49IChpbnQpKHZpZGVvLT5tYm51bV9yb3cgKyAxKSp2aWRlby0+bk1CaW5HT0IpICAgLyogIDEwLzExLzAxICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikgcmV0dXJuIFBWX1NVQ0NFU1M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgR09CX1JFU1lOQ19NQVJLRVJfTEVOR1RILCAmdG1wdmFyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcHZhciA9PSBHT0JfUkVTWU5DX01BUktFUikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9CaXRzdHJlYW1TaG93Qml0c0J5dGVBbGlnbihzdHJlYW0sIEdPQl9SRVNZTkNfTUFSS0VSX0xFTkdUSCwgJnRtcHZhcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRtcHZhciA9PSBHT0JfUkVTWU5DX01BUktFUikgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWJudW0gPj0gblRvdGFsTUIpICAvKiBpbiBjYXNlIG5vIHZhbGlkIHN0dWZmaW5nICAwNi8yMy8wMSAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHVmZmluZyA9IHZhbGlkU3R1ZmZpbmdfaDI2MyhzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkX3N0dWZmaW5nID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uY2VhbFBhY2tldCh2aWRlbywgbWJfc3RhcnQsIG5Ub3RhbE1CLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9TVUNDRVNTOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIEFOTkVYX0sgKi8KLSAgICAgICAgICAgICAgICAgICAgUFZfQml0c3RyZWFtU2hvd0JpdHNCeXRlQWxpZ25Ob0ZvcmNlU3R1ZmZpbmcoc3RyZWFtLCAxNywgJnRtcHZhcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0bXB2YXIgPT0gUkVTWU5DX01BUktFUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nX2gyNjMoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZF9zdHVmZmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogIDA2LzIxLzAxICovCi0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikgIC8qIGluIGNhc2Ugbm8gdmFsaWQgc3R1ZmZpbmcgIDA2LzIzLzAxICovCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiAgMTEvMDEvMjAwMiBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUgYW5kIHRoZXJlIGlzIHNvbWUgZ2FyYmFnZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lIChpLmUuIG5vIG5leHQgc3RhcnRjb2RlKSBicmVhayBpZiB0aGUgc3R1ZmZpbmcgaXMgdmFsaWQgKi8KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZF9zdHVmZmluZyA9PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgMTEvMDEvMjAwMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25jZWFsUGFja2V0KHZpZGVvLCBtYl9zdGFydCwgblRvdGFsTUIsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFBWX0JpdHN0cmVhbUJ5dGVBbGlnbihzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9CaXRzdHJlYW1TaG93Qml0c0J5dGVBbGlnbihzdHJlYW0sIDIzLCAmdG1wdmFyKTsgLyogdGhpcyBjYWxsIGlzIHZhbGlkIGZvciBmX2NvZGUgPCA4ICovCi0gICAgICAgICAgICAgICAgbG9uZ196ZXJvX2JpdHMgPSAhdG1wdmFyOwotCi0gICAgICAgICAgICAgICAgaWYgKCh0bXB2YXIgPj4gKDIzIC0gcmVzeW5jX21hcmtlcl9sZW5ndGgpKSA9PSBSRVNZTkNfTUFSS0VSIHx8IGxvbmdfemVyb19iaXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZF9zdHVmZmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiAgMDYvMjEvMDEgKi8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoVFJVRSk7Ci0KLSAgICAgICAgaWYgKHNob3J0VmlkZW9IZWFkZXIpCi0gICAgICAgIHsgLyogV2UgbmVlZCB0byBjaGVjayBuZXdnb2IgdG8gcmVmcmVzaCBxdWFudGl6ZXIgKi8KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgIGlmICghdmlkZW8tPnNsaWNlX3N0cnVjdHVyZSkKLSAgICAgICAgICAgIHsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHdoaWxlICgoc3RhdHVzID0gUFZfR29iSGVhZGVyKHZpZGVvKSkgPT0gUFZfRkFJTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gcXVpY2tTZWFyY2hHT0JIZWFkZXIoc3RyZWFtKSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYm51bSA9IGN1cnJWb3AtPmdvYk51bWJlciAqIHZpZGVvLT5uTUJpbkdPQjsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IFBWX0gyNjNTbGljZUhlYWRlcih2aWRlbywgJm1ibnVtKSkgPT0gUFZfRkFJTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdHVzID0gcXVpY2tTZWFyY2hIMjYzU2xpY2VIZWFkZXIoc3RyZWFtKSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKChzdGF0dXMgPSBQVl9SZWFkVmlkZW9QYWNrZXRIZWFkZXIodmlkZW8sICZtYm51bSkpID09IFBWX0ZBSUwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaFZpZGVvUGFja2V0SGVhZGVyKHN0cmVhbSwgcmVzeW5jX21hcmtlcl9sZW5ndGgpKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9FTkRfT0ZfVk9QKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYm51bSA9IG5Ub3RhbE1COwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ibnVtID4gdmlkZW8tPm1ibnVtICsgMSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uY2VhbFBhY2tldCh2aWRlbywgdmlkZW8tPm1ibnVtLCBtYm51bSwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgUVAgPSB2aWRlby0+Y3VyclZvcC0+cXVhbnRpemVyOwotICAgICAgICBzbGljZV9jb3VudGVyKys7Ci0gICAgICAgIGlmIChtYm51bSA+PSBuVG90YWxNQikgYnJlYWs7Ci0KLSAgICB9Ci0gICAgd2hpbGUgKFRSVUUpOwotICAgIHJldHVybiBQVl9TVUNDRVNTOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IEdldE1CSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlY29kZSBNQiBoZWFkZXIsIG5vdF9jb2RlZCwgbWNicGMsIGFjX3ByZWRfZmxhZywgY2JweSwgZHF1YW50LiAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgMy8yOS8wMCA6IENoYW5nZWQgdGhlIHJldHVybmVkIHZhbHVlIGFuZCBvcHRpbWl6ZWQgdGhlIGNvZGUuICAgICovCi0vKiAgICAgIDQvMDEvMDEgOiBuZXcgQUNEQyBwcmVkaWN0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIEdldE1CaGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludDE2ICpRUCkKLXsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKLSAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07Ci0gICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOwotICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7Ci0gICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOwotICAgIHR5cGVEQ0FDU3RvcmUgKkRDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX3JvdyArIHhfcG9zOwotICAgIHR5cGVEQ0FDU3RvcmUgKkRDQUNfY29sID0gdmlkZW8tPnByZWREQ0FDX2NvbDsKLSAgICBjb25zdCBzdGF0aWMgaW50MTYgIERRX3RhYls0XSA9IHsgLTEsIC0yLCAxLCAyfTsKLQotICAgIGludCBDQlBZLCBDQlBDOwotICAgIGludCBNQnR5cGUsIFZvcFR5cGU7Ci0gICAgaW50IE1DQlBDOwotICAgIHVpbnQgRFFVQU5UOwotICAgIGludCBjb21wOwotICAgIEJvb2wgbWJfY29kZWQ7Ci0KLSAgICBWb3BUeXBlID0gdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOwotICAgIG1iX2NvZGVkID0gKChWb3BUeXBlID09IElfVk9QKSA/IFRSVUUgOiAhQml0c3RyZWFtUmVhZDFCaXRzX0lOTElORShzdHJlYW0pKTsKLQotICAgIGlmICghbWJfY29kZWQpCi0gICAgewotICAgICAgICAvKiBza2lwcGVkIG1hY3JvYmxvY2sgKi8KLSAgICAgICAgTW9kZVttYm51bV0gPSBNT0RFX1NLSVBQRUQ7Ci0gICAgICAgIC8vb3NjbF9tZW1zZXQoRENBQ19yb3csIDAsIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7ICAgLyogIFNLSVBQRURfQUNEQyAqLwotICAgICAgICAvL29zY2xfbWVtc2V0KERDQUNfY29sLCAwLCBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotICAgICAgICBaRVJPX09VVF82NEJZVEVTKERDQUNfcm93KTsKLSAgICAgICAgWkVST19PVVRfNjRCWVRFUyhEQ0FDX2NvbCk7IC8qICAwOC8xMi8wNSAqLwotCi0gICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA2OyBjb21wKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogY29kZWQgbWFjcm9ibG9jayAqLwotICAgICAgICBpZiAoVm9wVHlwZSA9PSBJX1ZPUCkKLSAgICAgICAgewotICAgICAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50cmEoc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgIGlmICghdmlkZW8tPmRlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50ZXIoc3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNQ0JQQyA9IFBWX1ZsY0RlY01DQlBDX2NvbV9pbnRlcl9IMjYzKHN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50ZXIoc3RyZWFtKTsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChNQ0JQQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgTW9kZVttYm51bV0gPSAodWludDgpKE1CdHlwZSA9IE1CdHlwZV9tb2RlW01DQlBDICYgN10pOwotICAgICAgICBDQlBDID0gKE1DQlBDID4+IDQpICYgMzsKLQotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICBpZiAoTUJ0eXBlICYgSU5UUkFfTUFTSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAodWludDgpIEJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+YWR2YW5jZWRfSU5UUkEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWJsb2NrLT5kaXJlY3Rpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tYmxvY2stPmRpcmVjdGlvbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmICgoTUJ0eXBlICYgSU5UUkFfTUFTSykgJiYgIXZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+YWNQcmVkRmxhZ1ttYm51bV0gPSAodWludDgpIEJpdHN0cmVhbVJlYWQxQml0c19JTkxJTkUoc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9IDA7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBDQlBZID0gUFZfVmxjRGVjQ0JQWShzdHJlYW0sIE1CdHlwZSAmIElOVFJBX01BU0spOyAvKiBJTlRSQSB8fCBJTlRSQV9RICovCi0gICAgICAgIGlmIChDQlBZIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHVyAwNC8yMy85OQotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dID0gKHVpbnQ4KShDQlBZIDw8IDIgfCAoQ0JQQyAmIDMpKTsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgaWYgKE1CdHlwZSAmIFFfTUFTSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCF2aWRlby0+bW9kaWZpZWRfcXVhbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRFFVQU5UID0gQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDIpOwotICAgICAgICAgICAgICAgICpRUCArPSBEUV90YWJbRFFVQU5UXTsKLQotICAgICAgICAgICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpRUCA+IDMxKSAqUVAgPSAzMTsKLSAgICAgICAgICAgICAgICB2aWRlby0+UVBfQ0hSID0gKlFQOyAgLyogQU5ORVhfVCAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChCaXRzdHJlYW1SZWFkMUJpdHMoc3RyZWFtKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgKlFQICs9IERRX3RhYl9Bbm5leF9UXzExWypRUF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqUVAgKz0gRFFfdGFiX0FubmV4X1RfMTBbKlFQXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKlFQIDwgMSkgKlFQID0gMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKlFQID4gMzEpICpRUCA9IDMxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqUVAgPSAoaW50MTYpQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIDUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWRlby0+UVBfQ0hSID0gIE1RX2Nocm9tYV9RUF90YWJsZVsqUVBdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBpZiAoTUJ0eXBlICYgUV9NQVNLKQotICAgICAgICB7Ci0gICAgICAgICAgICBEUVVBTlQgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7Ci0gICAgICAgICAgICAqUVAgKz0gRFFfdGFiW0RRVUFOVF07Ci0KLSAgICAgICAgICAgIGlmICgqUVAgPCAxKSAqUVAgPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAoKlFQID4gMzEpICpRUCA9IDMxOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qICAgICAgIDMvMTAvMDAgIDogaW5pdGlhbCBtb2RpZmljYXRpb24gdG8gdGhlCi0qICAgICAgICAgICAgICAgIG5ldyBQVi1EZWNvZGVyIExpYiBmb3JtYXQuCi0qICAgICAgIDQvMi8yMDAwIDogQ2xlYW51cCBhbmQgZXJyb3ItaGFuZGxpbmcgbW9kaWZpY2F0aW9uLiAgVGhpcwotKiAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoYXMgYmVlbiBkaXZpZGVkIGludG8gc2V2ZXJhbCBzdWItZnVuY3Rpb25zIGZvcgotKiAgICAgICAgICAgICAgICAgICBiZXR0ZXIgY29kaW5nIHN0eWxlIGFuZCBtYWludGFpbmFuY2UgcmVhc29uLiAgSSBhbHNvCi0qICAgICAgICAgICAgICAgICAgIGdyZWF0bHkgc2hydW5rIHRoZSBjb2RlIHNpemUgaGVyZS4KLSogICAgICAgOS8xOC8yMDAwIDogVmxjRGVjb2RlK0RlcXVhbnQgb3B0aW1pemF0aW9uICoKLSogICAgICAgNC8wMS8yMDAxIDogbmV3IEFDREMgcHJlZGljdGlvbiBzdHJ1Y3R1cmUKLSogICAgICAgMy8yOS8yMDAyIDogcmVtb3ZlZCBHZXRJbnRyYU1CIGFuZCBHZXRJbnRlck1CCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRFbmQqKioqKioqKi8KLVBWX1NUQVRVUyBHZXRNQkRhdGEoVmlkZW9EZWNEYXRhICp2aWRlbykKLXsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKLSAgICBpbnQgbWJudW0gPSB2aWRlby0+bWJudW07Ci0gICAgTWFjcm9CbG9jayAqbWJsb2NrID0gdmlkZW8tPm1ibG9jazsKLSAgICBpbnQxNiAqZGF0YUJsb2NrOwotICAgIFBJWEVMICpjX2NvbXA7Ci0gICAgdWludCBtb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZVttYm51bV07Ci0gICAgdWludCBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOwotICAgIHR5cGVEQ1N0b3JlICpEQyA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKLSAgICBpbnQgaW50cmFfZGNfdmxjX3RociA9IHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyOwotICAgIGludDE2IFFQID0gdmlkZW8tPlFQTUJbbWJudW1dOwotICAgIGludDE2IFFQX3RtcCA9IFFQOwotICAgIGludCB3aWR0aCA9IHZpZGVvLT53aWR0aDsKLSAgICBpbnQgIGNvbXA7Ci0gICAgaW50ICBzd2l0Y2hlZDsKLSAgICBpbnQgbmNvZWZmc1s2XSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKLSAgICBpbnQgKm5vX2NvZWZmID0gbWJsb2NrLT5ub19jb2VmZjsKLSAgICBpbnQxNiBEQ19jb2VmZjsKLSAgICBQVl9TVEFUVVMgc3RhdHVzOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAvKiBwb3N0LXByb2Nlc3NpbmcgKi8KLSAgICB1aW50OCAqcHBfbW9kWzZdOwotICAgIGludCBUb3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCBNQl9pbl93aWR0aCA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0jZW5kaWYKLSAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OwotICAgIGludCB4X3BvcyA9IHZpZGVvLT5tYm51bV9jb2w7Ci0gICAgaW50MzIgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOwotCi0gICAgLyogRGVjb2RlIGVhY2ggOC1ieS04IGJsb2Nrcy4gY29tcCAwIH4gMyBhcmUgbHVtaW5hbmNlIGJsb2NrcywgNCB+IDUgKi8KLSAgICAvKiAgYXJlIGNocm9taW5hbmNlIGJsb2Nrcy4gICAwNC8wMy8yMDAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgLyoqIHBvc3QtcHJvY2Vzc2luZyAqKiovCi0gICAgICAgIHBwX21vZFswXSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoeV9wb3MgPDwgMSkgKiAoTUJfaW5fd2lkdGggPDwgMSkgKyAoeF9wb3MgPDwgMSk7Ci0gICAgICAgIHBwX21vZFsxXSA9IHBwX21vZFswXSArIDE7Ci0gICAgICAgIHBwX21vZFsyXSA9IHBwX21vZFswXSArIChNQl9pbl93aWR0aCA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzNdID0gcHBfbW9kWzJdICsgMTsKLSAgICAgICAgcHBfbW9kWzRdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChUb3RhbE1CIDw8IDIpICsgbWJudW07Ci0gICAgICAgIHBwX21vZFs1XSA9IHBwX21vZFs0XSArIFRvdGFsTUI7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiAgb3NjbF9tZW1zZXQobWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKHR5cGVNQlN0b3JlKSk7ICAgIEF1ZyA5LDIwMDUgKi8KLQotICAgIGlmIChtb2RlICYgSU5UUkFfTUFTSykgLyogTU9ERV9JTlRSQSB8fCBNT0RFX0lOVFJBX1EgKi8KLSAgICB7Ci0gICAgICAgIHN3aXRjaGVkID0gMDsKLSAgICAgICAgaWYgKGludHJhX2RjX3ZsY190aHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQotICAgICAgICAgICAgICAgIFFQX3RtcCA9IHZpZGVvLT5RUE1CW21ibnVtLTFdOyAgIC8qIHJ1bm5pbmcgUVAgIDA0LzI2LzAxICovCi0KLSAgICAgICAgICAgIHN3aXRjaGVkID0gKGludHJhX2RjX3ZsY190aHIgPT0gNyB8fCBRUF90bXAgPj0gaW50cmFfZGNfdmxjX3RociAqIDIgKyAxMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYmxvY2stPkRDU2NhbGFyTHVtID0gY2FsX2RjX3NjYWxlcihRUCwgTFVNSU5BTkNFX0RDX1RZUEUpOyAgIC8qICAzLzAxLzAxICovCi0gICAgICAgIG1ibG9jay0+RENTY2FsYXJDaHIgPSBjYWxfZGNfc2NhbGVyKFFQLCBDSFJPTUlOQU5DRV9EQ19UWVBFKTsKLQotICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhQmxvY2sgPSBtYmxvY2stPmJsb2NrW2NvbXBdOyAgICAvKiAxMC8yMC8yMDAwICovCi0KLSAgICAgICAgICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlcikKLSAgICAgICAgICAgIHsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgICAgICBpZiAoIXZpZGVvLT5hZHZhbmNlZF9JTlRSQSkKLSAgICAgICAgICAgICAgICB7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgRENfY29lZmYgPSAoaW50MTYpIEJpdHN0cmVhbVJlYWRCaXRzMTZfSU5MSU5FKHN0cmVhbSwgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChEQ19jb2VmZiAmIDB4N2YpID09IDApIC8qIDEyOCAmIDAgICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRseSB3ZSB3aWxsIG9ubHkgc2lnbmFsIEZBSUwgZm9yIDEyOC4gV2Ugd2lsbCBpZ25vcmUgdGhlIDAgY2FzZSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEQ19jb2VmZiA9PSAxMjgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKERDX2NvZWZmID09IDI1NSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRENfY29lZmYgPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGF0YUJsb2NrWzBdID0gKGludDE2KSBEQ19jb2VmZjsKLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRyYUJsb2NrX1NIKHZpZGVvLCBjb21wLCBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hlZCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRGVjb2RlUHJlZGljdGVkSW50cmFEQyhjb21wLCBzdHJlYW0sICZEQ19jb2VmZik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGF0YUJsb2NrWzBdID0gKGludDE2KSBEQ19jb2VmZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9jayh2aWRlbywgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZWQsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hlZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KChkYXRhQmxvY2sgKyAxKSwgMCwgc2l6ZW9mKGludDE2KSo2Myk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9fY29lZmZbY29tcF0gPSBuY29lZmZzW2NvbXBdOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpIFBvc3RQcm9jU2VtYXBob3JlKGRhdGFCbG9jayk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBNQmxvY2tJRENUKHZpZGVvKTsKLSAgICB9Ci0gICAgZWxzZSAgICAgIC8qIElOVEVSIG1vZGVzICovCi0gICAgeyAgIC8qICBtb3ZlZCBpdCBoZXJlIEF1ZyAxNSwgMjAwNSAqLwotICAgICAgICAvKiBkZWNvZGUgdGhlIG1vdGlvbiB2ZWN0b3IgKGlmIHRoZXJlIGFyZSBhbnkpICovCi0gICAgICAgIHN0YXR1cyA9IFBWX0dldE1CdmVjdG9ycyh2aWRlbywgbW9kZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0KLSAgICAgICAgTUJNb3Rpb25Db21wKHZpZGVvLCBDQlApOwotICAgICAgICBjX2NvbXAgID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OwotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCA0OyBjb21wKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgICgqREMpW2NvbXBdID0gbWlkX2dyYXk7Ci0gICAgICAgICAgICBpZiAoQ0JQICYgKDEgPDwgKDUgLSBjb21wKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgY29tcCwgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sICZtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7Ci0gICAgICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzW2NvbXBdKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPlFQTUJbbWJudW1dID0gdmlkZW8tPlFQX0NIUjsgICAgIC8qIEFOTkVYX1QgKi8KLQotCi0KLSAgICAgICAgKCpEQylbNF0gPSBtaWRfZ3JheTsKLSAgICAgICAgaWYgKENCUCAmIDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jb2VmZnNbNF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDQsIG1ibG9jay0+Yml0bWFwY29sWzRdLCAmbWJsb2NrLT5iaXRtYXByb3dbNF0pOwotICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzRdKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzRdID0gKHVpbnQ4KSgobmNvZWZmc1s0XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKLSAgICAgICAgaWYgKENCUCAmIDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jb2VmZnNbNV0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIDUsIG1ibG9jay0+Yml0bWFwY29sWzVdLCAmbWJsb2NrLT5iaXRtYXByb3dbNV0pOwotICAgICAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChuY29lZmZzWzVdKSkgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNjQsIG1ibG9jay0+YmxvY2tbNV0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sIG1ibG9jay0+Yml0bWFwcm93WzVdKTsKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gKHVpbnQ4KSgobmNvZWZmc1s1XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNV0gPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgdmlkZW8tPlFQTUJbbWJudW1dID0gUVA7ICAvKiByZXN0b3JlIHRoZSBRUCB2YWx1ZXMgIEFOTkVYX1QqLwotI2Vsc2UKLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKLSAgICAgICAgICAgIGlmIChDQlAgJiAoMSA8PCAoNSAtIGNvbXApKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuY29lZmZzW2NvbXBdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCBjb21wLCBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgJm1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKLSAgICAgICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgICAgIEJsb2NrSURDVChjX2NvbXAgKyAoY29tcCYyKSood2lkdGggPDwgMikgKyA4Kihjb21wJjEpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAoY29tcCYyKSo2NCArIDgqKGNvbXAmMSksIG1ibG9jay0+YmxvY2tbY29tcF0sIHdpZHRoLCBuY29lZmZzW2NvbXBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFtjb21wXSwgbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAodWludDgpKChuY29lZmZzW2NvbXBdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgICAgICpwcF9tb2RbY29tcF0gPSAwOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwotICAgICAgICBpZiAoQ0JQICYgMikKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s0XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNCwgbWJsb2NrLT5iaXRtYXBjb2xbNF0sICZtYmxvY2stPmJpdG1hcHJvd1s0XSk7Ci0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNF0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9IDA7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwotICAgICAgICBpZiAoQ0JQICYgMSkKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s1XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNSwgbWJsb2NrLT5iaXRtYXBjb2xbNV0sICZtYmxvY2stPmJpdG1hcHJvd1s1XSk7Ci0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNV0pKSByZXR1cm4gUFZfRkFJTDsKLQotICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT52Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI2NCwgbWJsb2NrLT5ibG9ja1s1XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgbWJsb2NrLT5iaXRtYXByb3dbNV0pOwotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNV0gPSAodWludDgpKChuY29lZmZzWzVdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9IDA7Ci0jZW5kaWYKLSNlbmRpZiAgLy8gUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0KLQotCi0KLQotCi0gICAgfQotCi0gICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAgICAgICAgIC8qIHNob3VsZCBiZSBzZXQgYWZ0ZXIgZGVjb2RpbmcgdGhlIGZpcnN0IENvZGVkICAwNC8yNy8wMSAqLwotICAgIHJldHVybiBQVl9TVUNDRVNTOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGIwNGIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5NCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICJ2bGNfZGVjb2RlLmgiCi0jaW5jbHVkZSAiYml0c3RyZWFtLmgiCi0jaW5jbHVkZSAic2NhbGluZy5oIgotI2luY2x1ZGUgIm1idHlwZV9tb2RlLmgiCi0jaW5jbHVkZSAiaWRjdC5oIgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTkRJVElPTkFMX0lTX0NPTlNUQU5UCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIGEgZnJhbWUgb2YgTVBFRzQgYml0c3RyZWFtIGluIGRhdGFwYXJ0aXRpb25pbmcgbW9kZS4gICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgMDQvMjUvMjAwMCA6IFJld3JpdGUgdGhlIGRhdGEgcGFydGl0aW9uaW5nIHBhdGggY29tcGxldGVseSAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBwc2V1ZG8gY29kZXMgaW4gTVBFRy00ICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAwOS8xOC8yMDAwIGFkZCBmYXN0IFZsY0RlY29kZStEZXF1YW50ICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgMDQvMTcvMjAwMSBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1czsKLSAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTsKLQotICAgIGludCBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OwotCi0gICAgaW50IHZvcFR5cGUgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKLSAgICBpbnQgbWJudW07Ci0gICAgaW50IG5Ub3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCBzbGljZV9jb3VudGVyOwotICAgIGludCByZXN5bmNfbWFya2VyX2xlbmd0aDsKLQotICAgIC8qIGNvcHkgYW5kIHBhZCB0byBwcmV2X1ZvcCBmb3IgSU5URVIgY29kaW5nICovCi0gICAgc3dpdGNoICh2b3BUeXBlKQotICAgIHsKLSAgICAgICAgY2FzZSBJX1ZPUCA6Ci0vLyAgICAgIG9zY2xfbWVtc2V0KE1vZGUsIE1PREVfSU5UUkEsIHNpemVvZih1aW50OCkqblRvdGFsTUIpOwotICAgICAgICAgICAgcmVzeW5jX21hcmtlcl9sZW5ndGggPSAxNzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBfVk9QIDoKLSAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tb3RYLCAwLCBzaXplb2YoTU9UKSo0Km5Ub3RhbE1CKTsKLSAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSo0Km5Ub3RhbE1CKTsKLS8vICAgICAgb3NjbF9tZW1zZXQoTW9kZSwgTU9ERV9JTlRFUiwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7Ci0gICAgICAgICAgICByZXN5bmNfbWFya2VyX2xlbmd0aCA9IDE2ICsgY3VyclZvcC0+ZmNvZGVGb3J3YXJkOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlRnJhbWVEYXRhUGFydE1vZGUoKTogVm9wIHR5cGUgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgfQotCi0gICAgLyoqIEluaXRpYWxpemUgc2xpY2VObyAqKiovCi0gICAgbWJudW0gPSBzbGljZV9jb3VudGVyID0gMDsKLS8vICBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgc2l6ZW9mKHVpbnQ4KSpuVG90YWxNQik7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gbW90aW9uX3NoYXBlX3RleHR1cmUoKSAqLwotICAgICAgICAvKiBpbiB0aGUgTVBFRy00IHN0YW5kYXJkLiAgICAgICAgICAgIDA0LzEzLzIwMDAgICAgICAqLwotICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKLSAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OwotCi0gICAgICAgIHN3aXRjaCAodm9wVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBJX1ZPUCA6Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gRGVjb2RlRGF0YVBhcnRfSV9WaWRlb1BhY2tldCh2aWRlbywgc2xpY2VfY291bnRlcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgUF9WT1AgOgotICAgICAgICAgICAgICAgIHN0YXR1cyA9IERlY29kZURhdGFQYXJ0X1BfVmlkZW9QYWNrZXQodmlkZW8sIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVGcmFtZURhdGFQYXJ0TW9kZSgpOiBWb3AgdHlwZSBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IFBWX1JlYWRWaWRlb1BhY2tldEhlYWRlcih2aWRlbywgJm1ibnVtKSkgPT0gUFZfRkFJTCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBxdWlja1NlYXJjaFZpZGVvUGFja2V0SGVhZGVyKHN0cmVhbSwgcmVzeW5jX21hcmtlcl9sZW5ndGgpKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9FTkRfT0ZfVk9QKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYm51bSA9IG5Ub3RhbE1COwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1ibnVtID4gdmlkZW8tPm1ibnVtICsgMSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29uY2VhbFBhY2tldCh2aWRlbywgdmlkZW8tPm1ibnVtLCBtYm51bSwgc2xpY2VfY291bnRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2xpY2VfY291bnRlcisrOwotICAgICAgICBpZiAobWJudW0gPj0gblRvdGFsTUIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgIH0KLSAgICB3aGlsZSAoVFJVRSk7Ci0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IERlY29kZURhdGFQYXJ0X0lfVmlkZW9QYWNrZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMjUvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBEZWNvZGUgRGF0YSBQYXJ0aXRpb25lZCBNb2RlIFZpZGVvIFBhY2tldCBpbiBJLVZPUCAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIFBWX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAwOS8xOC8yMDAwIGFkZCBmYXN0IFZsY0RlY29kZStEZXF1YW50ICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgMDQvMDEvMjAwMSBmaXhlZCBNQl9zdHVmZmluZywgcmVtb3ZlZCB1bm5lY2Vzc2FyeSBjb2RlICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X0lfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1czsKLSAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSA9IHZpZGVvLT5iaXRzdHJlYW07Ci0gICAgaW50ICBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgIG1ibnVtLCBtYl9zdGFydCwgbWJfZW5kOwotICAgIGludDE2IFFQLCAqUVBNQiA9IHZpZGVvLT5RUE1COwotICAgIGludCAgTUJ0eXBlLCBNQ0JQQywgQ0JQWTsKLSAgICB1aW50MzIgdG1wdmFyOwotICAgIHVpbnQgY29kZTsKLSAgICBpbnQgbk1CUGVyUm93ID0gdmlkZW8tPm5NQlBlclJvdzsKLSAgICBCb29sIHZhbGlkX3N0dWZmaW5nOwotICAgIGludDMyIHN0YXJ0U2Vjb25kUGFydCwgc3RhcnRGaXJzdFBhcnQgPSBnZXRQb2ludGVyKHN0cmVhbSk7Ci0KLSAgICAvKiBkZWNvZGUgdGhlIGZpcnN0IHBhcnRpdGlvbiAqLwotICAgIFFQID0gdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplcjsKLSAgICBtYl9zdGFydCA9IG1ibnVtID0gdmlkZW8tPm1ibnVtOwotICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgICAgICAgIC8qICAwNC8yNy8wMSAqLwotCi0KLSAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgOSwgJmNvZGUpOwotICAgIHdoaWxlIChjb2RlID09IDEpCi0gICAgewotICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA5KTsKLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDksICZjb2RlKTsKLSAgICB9Ci0KLSAgICBkbwotICAgIHsKLSAgICAgICAgLyogZGVjb2RlIENPRCwgTUNCUEMsIEFDcHJlZF9mbGFnLCBDUEJZIGFuZCBEUVVBTlQgKi8KLSAgICAgICAgTUNCUEMgPSBQVl9WbGNEZWNNQ0JQQ19jb21faW50cmEoc3RyZWFtKTsKLQotICAgICAgICBpZiAoIVZMQ19FUlJPUl9ERVRFQ1RFRChNQ0JQQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1vZGVbbWJudW1dID0gKHVpbnQ4KShNQnR5cGUgPSBNQnR5cGVfbW9kZVtNQ0JQQyAmIDddKTsKLSAgICAgICAgICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUFttYm51bV0gPSAodWludDgpKChNQ0JQQyA+PiA0KSAmIDMpOwotICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJoZWFkZXJEYXRhUGFydF9EUVVBTlRfREModmlkZW8sICZRUCk7Ci0gICAgICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgICAgICAgIC8qIHNldCBpdCBhZnRlciB0aGUgZmlyc3QgY29kZWQgTUIgICAgICAwNC8yNy8wMSAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLwotICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvLT5zbGljZU5vW21ibnVtXSA9ICh1aW50OCkgc2xpY2VfY291bnRlcjsKLSAgICAgICAgUVBNQlttYm51bV0gPSBRUDsKLSAgICAgICAgdmlkZW8tPm1ibnVtID0gKyttYm51bTsKLQotICAgICAgICBCaXRzdHJlYW1TaG93Qml0czE2KHN0cmVhbSwgOSwgJmNvZGUpOwotICAgICAgICB3aGlsZSAoY29kZSA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCA5KTsKLSAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCA5LCAmY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHZpZGVvIHBhY2tldCBvciB2b3A/ICovCi0gICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVNob3dCaXRzMzIoc3RyZWFtLCBEQ19NQVJLRVJfTEVOR1RILCAmdG1wdmFyKTsKLQotICAgIH0KLSAgICB3aGlsZSAodG1wdmFyICE9IERDX01BUktFUiAmJiB2aWRlby0+bWJudW0gPCBuVG90YWxNQik7Ci0KLSAgICBpZiAodG1wdmFyID09IERDX01BUktFUikKLSAgICB7Ci0gICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIERDX01BUktFUl9MRU5HVEgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdGF0dXMgPSBxdWlja1NlYXJjaERDTShzdHJlYW0pOwotICAgICAgICBpZiAoc3RhdHVzID09IFBWX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIG9ubHkgd2F5IHlvdSBjYW4gZW5kIHVwIGJlaW5nIGhlcmUgaXMgaW4gdGhlIGxhc3QgcGFja2V0LGFuZCB0aGVyZSBpcyBzdHVmZmluZyBhdAotICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgZmlyc3QgcGFydGl0aW9uICovCi0gICAgICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBEQ19NQVJLRVJfTEVOR1RIKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlcG9ydCB0aGUgZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiAgIDA2LzIwLzIwMDAgKi8KLSAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0Rmlyc3RQYXJ0KTsKLSAgICAgICAgICAgIHZpZGVvLT5tYm51bSA9IG1iX3N0YXJ0OwotICAgICAgICAgICAgLyogY29uY2VhbG1lbnQgd2lsbCBiZSB0YWtlbiBjYXJlIG9mIGluIHRoZSB1cHBlciBsYXllciAqLwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBkZWNvZGUgdGhlIHNlY29uZCBwYXJ0aXRpb24gKi8KLSAgICBzdGFydFNlY29uZFBhcnQgPSBnZXRQb2ludGVyKHN0cmVhbSk7Ci0KLSAgICBtYl9lbmQgPSB2aWRlby0+bWJudW07Ci0KLSAgICBmb3IgKG1ibnVtID0gbWJfc3RhcnQ7IG1ibnVtIDwgbWJfZW5kOyBtYm51bSsrKQotICAgIHsKLSAgICAgICAgTUJ0eXBlID0gTW9kZVttYm51bV07Ci0gICAgICAgIC8qIE5vIHNraXBwZWQgbW9kZSBpbiBJLXBhY2tldHMgIDMvMS8yMDAxICAgICovCi0gICAgICAgIHZpZGVvLT5tYm51bSA9IG1ibnVtOwotCi0gICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOyAgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBuYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KLSAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IG1ibnVtIC0gdmlkZW8tPm1ibnVtX3JvdyAqIG5NQlBlclJvdzsKLSAgICAgICAgLyogdGhlcmUgaXMgYWx3YXlzIGFjZGNwcmVkIGluIERhdGFQYXJ0IG1vZGUgIDA0LzEwLzAxICovCi0gICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnW21ibnVtXSA9ICh1aW50OCkgQml0c3RyZWFtUmVhZDFCaXRzKHN0cmVhbSk7Ci0KLSAgICAgICAgQ0JQWSA9IFBWX1ZsY0RlY0NCUFkoc3RyZWFtLCBNQnR5cGUgJiBJTlRSQV9NQVNLKTsgLyogTU9ERV9JTlRSQSB8fCBNT0RFX0lOVFJBX1EgKi8KLSAgICAgICAgaWYgKENCUFkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOyAvKiAgKi8KLSAgICAgICAgICAgIC8qIENvbmNlYWwgcGFja2V0LCAgMDUvMTUvMjAwMCAqLwotICAgICAgICAgICAgQ29uY2VhbFRleHR1cmVfSSh2aWRlbywgc3RhcnRGaXJzdFBhcnQsIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dIHw9ICh1aW50OCkoQ0JQWSA8PCAyKTsKLSAgICB9Ci0KLSAgICB2aWRlby0+dXNlUHJldlFQID0gMDsKLQotICAgIGZvciAobWJudW0gPSBtYl9zdGFydDsgbWJudW0gPCBtYl9lbmQ7IG1ibnVtKyspCi0gICAgewotICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKLQotICAgICAgICB2aWRlby0+bWJudW1fcm93ID0gUFZfR0VUX1JPVyhtYm51bSAsIG5NQlBlclJvdyk7ICAvKiAgVGhpcyBpcyBuZWVkZWQgaWYgbmJudW0gaXMgcmVhZCBmcm9tIHRoZSBwYWNrZXQgaGVhZGVyICovCi0gICAgICAgIHZpZGVvLT5tYm51bV9jb2wgPSBtYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0gICAgICAgIC8qIE5vIHNraXBwZWQgbW9kZSBpbiBJLXBhY2tldHMgIDMvMS8yMDAxICAgICovCi0gICAgICAgIC8qIGRlY29kZSB0aGUgRENUIGNvZWZpY2llbnRzIGZvciB0aGUgTUIgKi8KLSAgICAgICAgc3RhdHVzID0gR2V0TUJEYXRhX0RhdGFQYXJ0KHZpZGVvKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydFNlY29uZFBhcnQpOyAvKiAgKi8KLSAgICAgICAgICAgIC8qIENvbmNlYWwgcGFja2V0LCAgMDUvMTUvMjAwMCAqLwotICAgICAgICAgICAgQ29uY2VhbFRleHR1cmVfSSh2aWRlbywgc3RhcnRGaXJzdFBhcnQsIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgICAgICAgICAgIC8qICAwNC8yNy8wMSBzaG91bGQgYmUgc2V0IGFmdGVyIGRlY29kaW5nIGZpcnN0IE1CICovCi0gICAgfQotCi0gICAgdmFsaWRfc3R1ZmZpbmcgPSB2YWxpZFN0dWZmaW5nKHN0cmVhbSk7Ci0gICAgaWYgKCF2YWxpZF9zdHVmZmluZykKLSAgICB7Ci0gICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsKLSAgICAgICAgQ29uY2VhbFRleHR1cmVfSSh2aWRlbywgc3RhcnRGaXJzdFBhcnQsIG1iX3N0YXJ0LCBtYl9lbmQsIHNsaWNlX2NvdW50ZXIpOwotICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICB9Ci0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBEZWNvZGVEYXRhUGFydF9QX1ZpZGVvUGFja2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzI1LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIERhdGEgUGFydGl0aW9uZWQgTW9kZSBWaWRlbyBQYWNrZXQgaW4gUC1WT1AgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBQVl9GQUlMIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAwOS8xOC8yMDAwLCAgZmFzdCBWbGNEZWNvZGUrRGVxdWFudCAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgMDQvMTMvMjAwMSwgIGZpeGVkIE1CX3N0dWZmaW5nLCBuZXcgQUNEQyBwcmVkIHN0cnVjdHVyZSwgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAwOC8wNy8yMDAxLCAgcmVtb3ZlIE1CemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLVBWX1NUQVRVUyBEZWNvZGVEYXRhUGFydF9QX1ZpZGVvUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBzbGljZV9jb3VudGVyKQotewotICAgIFBWX1NUQVRVUyBzdGF0dXM7Ci0gICAgdWludDggKk1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlOwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgbWJudW0sIG1iX3N0YXJ0LCBtYl9lbmQ7Ci0gICAgaW50MTYgUVAsICpRUE1CID0gdmlkZW8tPlFQTUI7Ci0gICAgaW50IE1CdHlwZSwgQ0JQWTsKLSAgICBCb29sIHZhbGlkX3N0dWZmaW5nOwotICAgIGludCBpbnRyYV9NQjsKLSAgICB1aW50MzIgdG1wdmFyOwotICAgIHVpbnQgY29kZTsKLSAgICBpbnQzMiAgc3RhcnRGaXJzdFBhcnQsIHN0YXJ0U2Vjb25kUGFydDsKLSAgICBpbnQgbk1CUGVyUm93ID0gdmlkZW8tPm5NQlBlclJvdzsKLSAgICB1aW50OCAqcGJ5dGU7Ci0gICAgLyogZGVjb2RlIHRoZSBmaXJzdCBwYXJ0aXRpb24gKi8KLSAgICBzdGFydEZpcnN0UGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKLSAgICBtYl9zdGFydCA9IHZpZGVvLT5tYm51bTsKLSAgICB2aWRlby0+dXNlUHJldlFQID0gMDsgICAgICAgICAgICAvKiAgMDQvMjcvMDEgKi8KLQotICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCAxMCwgJmNvZGUpOwotICAgIHdoaWxlIChjb2RlID09IDEpCi0gICAgewotICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCAxMCk7Ci0gICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCAxMCwgJmNvZGUpOwotICAgIH0KLQotICAgIGRvCi0gICAgewotICAgICAgICAvKiBkZWNvZGUgQ09ELCBNQ0JQQywgQUNwcmVkX2ZsYWcsIENQQlkgYW5kIERRVUFOVCAqLwotICAgICAgICAvKiBXZSBoYXZlIHRvIGRpc2NhcmQgc3R1ZmZlZCBNQiBoZWFkZXIgKi8KLQotICAgICAgICBzdGF0dXMgPSBHZXRNQmhlYWRlckRhdGFQYXJ0X1AodmlkZW8pOwotCi0gICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLwotICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0gICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRGaXJzdFBhcnQpOwotICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHdlIG11c3QgdXBkYXRlIHNsaWNlX2NvdW50ZXIgYmVmb3JlIG1vdGlvbiB2ZWN0b3IgZGVjb2RpbmcuICAgKi8KLSAgICAgICAgdmlkZW8tPnNsaWNlTm9bdmlkZW8tPm1ibnVtXSA9ICh1aW50OCkgc2xpY2VfY291bnRlcjsKLQotICAgICAgICBpZiAoTW9kZVt2aWRlby0+bWJudW1dICYgSU5URVJfTUFTSykgLyogSU5URVIgfHwgSU5URVJfUSB8fCBJTlRFUl80ViAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkZWNvZGUgdGhlIG1vdGlvbiB2ZWN0b3IgKGlmIHRoZXJlIGFyZSBhbnkpICovCi0gICAgICAgICAgICBzdGF0dXMgPSBQVl9HZXRNQnZlY3RvcnModmlkZW8sIE1vZGVbdmlkZW8tPm1ibnVtXSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogUmVwb3J0IHRoZSBlcnJvciB0byB0aGUgYXBwbGljYXRpb24uICAgMDYvMjAvMjAwMCAqLwotICAgICAgICAgICAgICAgIFZpZGVvRGVjb2RlckVycm9yRGV0ZWN0ZWQodmlkZW8pOwotICAgICAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdmlkZW8tPm1ibnVtKys7Ci0KLSAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1codmlkZW8tPm1ibnVtLCBuTUJQZXJSb3cpOyAgIC8qICBUaGlzIGlzIG5lZWRlZCBpZiBtYm51bSBpcyByZWFkIGZyb20gdGhlIHBhY2tldCBoZWFkZXIgKi8KLSAgICAgICAgdmlkZW8tPm1ibnVtX2NvbCA9IHZpZGVvLT5tYm51bSAtIHZpZGVvLT5tYm51bV9yb3cgKiBuTUJQZXJSb3c7Ci0KLSAgICAgICAgQml0c3RyZWFtU2hvd0JpdHMxNihzdHJlYW0sIDEwLCAmY29kZSk7Ci0gICAgICAgIHdoaWxlIChjb2RlID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBWX0JpdHN0cmVhbUZsdXNoQml0cyhzdHJlYW0sIDEwKTsKLSAgICAgICAgICAgIEJpdHN0cmVhbVNob3dCaXRzMTYoc3RyZWFtLCAxMCwgJmNvZGUpOwotICAgICAgICB9Ci0gICAgICAgIC8qIGhhdmUgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB2aWRlbyBwYWNrZXQgb3Igdm9wPyAqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1TaG93Qml0czMyKHN0cmVhbSwgTU9USU9OX01BUktFUl9DT01CX0xFTkdUSCwgJnRtcHZhcik7Ci0gICAgICAgIC8qICAgICAgaWYgKHN0YXR1cyAhPSBQVl9TVUNDRVNTICYmIHN0YXR1cyAhPSBQVl9FTkRfT0ZfQlVGRkVSKSByZXR1cm4gc3RhdHVzOyAgKi8KLSAgICB9Ci0gICAgd2hpbGUgKHRtcHZhciAhPSBNT1RJT05fTUFSS0VSX0NPTUIgJiYgdmlkZW8tPm1ibnVtIDwgblRvdGFsTUIpOwotCi0gICAgaWYgKHRtcHZhciA9PSBNT1RJT05fTUFSS0VSX0NPTUIpCi0gICAgewotICAgICAgICBQVl9CaXRzdHJlYW1GbHVzaEJpdHMoc3RyZWFtLCBNT1RJT05fTUFSS0VSX0NPTUJfTEVOR1RIKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gcXVpY2tTZWFyY2hNb3Rpb25NYXJrZXIoc3RyZWFtKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBQVl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBvbmx5IHdheSB5b3UgY2FuIGVuZCB1cCBiZWluZyBoZXJlIGlzIGluIHRoZSBsYXN0IHBhY2tldCxhbmQgdGhlcmUgaXMgc3R1ZmZpbmcgYXQKLSAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIGZpcnN0IHBhcnRpdGlvbiAqLwotICAgICAgICAgICAgUFZfQml0c3RyZWFtRmx1c2hCaXRzKHN0cmVhbSwgTU9USU9OX01BUktFUl9DT01CX0xFTkdUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8oc3RyZWFtLCBzdGFydEZpcnN0UGFydCk7Ci0gICAgICAgICAgICB2aWRlby0+bWJudW0gPSBtYl9zdGFydDsKLSAgICAgICAgICAgIC8qIGNvbmNlYWxtZW50IHdpbGwgYmUgdGFrZW4gY2FyZSBvZiBpbiB0aGUgdXBwZXIgbGF5ZXIgICovCi0gICAgICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGRlY29kZSB0aGUgc2Vjb25kIHBhcnRpdGlvbiAqLwotICAgIHN0YXJ0U2Vjb25kUGFydCA9IGdldFBvaW50ZXIoc3RyZWFtKTsKLSAgICBRUCA9IHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXI7Ci0KLSAgICBtYl9lbmQgPSB2aWRlby0+bWJudW07Ci0KLSAgICBmb3IgKG1ibnVtID0gbWJfc3RhcnQ7IG1ibnVtIDwgbWJfZW5kOyBtYm51bSsrKQotICAgIHsKLSAgICAgICAgTUJ0eXBlID0gTW9kZVttYm51bV07Ci0KLSAgICAgICAgaWYgKE1CdHlwZSA9PSBNT0RFX1NLSVBQRUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFFQTUJbbWJudW1dID0gUVA7IC8qICAwMy8wMS8wMSAqLwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50cmFfTUIgPSAoTUJ0eXBlICYgSU5UUkFfTUFTSyk7IC8qIChNQnR5cGUgPT0gTU9ERV9JTlRSQSB8fCBNQnR5cGUgPT0gTU9ERV9JTlRSQV9RKSAqLwotICAgICAgICB2aWRlby0+bWJudW0gPSBtYm51bTsKLSAgICAgICAgdmlkZW8tPm1ibnVtX3JvdyA9IFBWX0dFVF9ST1cobWJudW0sIG5NQlBlclJvdyk7ICAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OwotCi0gICAgICAgIC8qIHRoZXJlIGlzIGFsd2F5cyBhY2RjcHJlZGljdGlvbiBpbiBEYXRhUGFydCBtb2RlICAgIDA0LzEwLzAxICovCi0gICAgICAgIGlmIChpbnRyYV9NQikKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWdbbWJudW1dID0gKHVpbnQ4KSBCaXRzdHJlYW1SZWFkMUJpdHNfSU5MSU5FKHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDQlBZID0gUFZfVmxjRGVjQ0JQWShzdHJlYW0sIGludHJhX01CKTsKLSAgICAgICAgaWYgKENCUFkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgICAgIC8qIENvbmNlYWwgc2Vjb25kIHBhcnRpdGlvbiwgIDUvMTUvMjAwMCAqLwotICAgICAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7Ci0gICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9QKHZpZGVvLCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSB8PSAodWludDgpKENCUFkgPDwgMik7Ci0gICAgICAgIGlmIChpbnRyYV9NQiB8fCBNQnR5cGUgPT0gTU9ERV9JTlRFUl9RKSAgICAgICAgICAgICAgICAgICAgIC8qICAwNC8yNi8wMSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyh2aWRlbywgJlFQKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+dXNlUHJldlFQID0gMTsgICAgICAgIC8qICAwNC8yNy8wMSAqLwotICAgICAgICBRUE1CW21ibnVtXSA9IFFQOwotICAgIH0KLQotICAgIHZpZGVvLT51c2VQcmV2UVAgPSAwOyAgLyogIDA0LzI3LzAxICovCi0KLSAgICBmb3IgKG1ibnVtID0gbWJfc3RhcnQ7IG1ibnVtIDwgbWJfZW5kOyBtYm51bSsrKQotICAgIHsKLSAgICAgICAgdmlkZW8tPm1ibnVtID0gbWJudW07Ci0gICAgICAgIHZpZGVvLT5tYm51bV9yb3cgPSBQVl9HRVRfUk9XKG1ibnVtLCBuTUJQZXJSb3cpOyAgLyogIFRoaXMgaXMgbmVlZGVkIGlmIG5ibnVtIGlzIHJlYWQgZnJvbSB0aGUgcGFja2V0IGhlYWRlciAqLwotICAgICAgICB2aWRlby0+bWJudW1fY29sID0gbWJudW0gLSB2aWRlby0+bWJudW1fcm93ICogbk1CUGVyUm93OwotCi0KLSAgICAgICAgaWYgKE1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgewotICAgICAgICAgICAgLyogZGVjb2RlIHRoZSBEQ1QgY29lZmljaWVudHMgZm9yIHRoZSBNQiAqLwotICAgICAgICAgICAgc3RhdHVzID0gR2V0TUJEYXRhX0RhdGFQYXJ0KHZpZGVvKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBSZXBvcnQgdGhlIGVycm9yIHRvIHRoZSBhcHBsaWNhdGlvbi4gICAwNi8yMC8yMDAwICovCi0gICAgICAgICAgICAgICAgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCh2aWRlbyk7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb25jZWFsIHNlY29uZCBwYXJ0aXRpb24sICA1LzE1LzIwMDAgKi8KLSAgICAgICAgICAgICAgICBtb3ZlUG9pbnRlclRvKHN0cmVhbSwgc3RhcnRTZWNvbmRQYXJ0KTsKLSAgICAgICAgICAgICAgICBDb25jZWFsVGV4dHVyZV9QKHZpZGVvLCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlkZW8tPnVzZVByZXZRUCA9IDE7ICAvKiAgMDQvMjcvMDEgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvLyBTS0lQUEVECi0KLSAgICAgICAgICAgIC8qIE1vdGlvbiBjb21wZW5zYXRpb24gYW5kIHB1dCBpdCB0byB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrICovCi0gICAgICAgICAgICBTa2lwcGVkTUJNb3Rpb25Db21wKHZpZGVvKTsKLQotICAgICAgICAgICAgLy9vc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfcm93ICsgdmlkZW8tPm1ibnVtX2NvbCwgMCwgc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsgLyogIFNLSVBQRURfQUNEQyAqLwotICAgICAgICAgICAgLy9vc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfY29sLCAwLCBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotICAgICAgICAgICAgLyogIDA4LzA4LzIwMDUgKi8KLSAgICAgICAgICAgIHBieXRlID0gKHVpbnQ4KikodmlkZW8tPnByZWREQ0FDX3JvdyArIHZpZGVvLT5tYm51bV9jb2wpOwotICAgICAgICAgICAgWkVST19PVVRfNjRCWVRFUyhwYnl0ZSk7Ci0gICAgICAgICAgICBwYnl0ZSA9ICh1aW50OCopKHZpZGVvLT5wcmVkRENBQ19jb2wpOwotICAgICAgICAgICAgWkVST19PVVRfNjRCWVRFUyhwYnl0ZSk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZhbGlkX3N0dWZmaW5nID0gdmFsaWRTdHVmZmluZyhzdHJlYW0pOyAgIC8qICAqLwotICAgIGlmICghdmFsaWRfc3R1ZmZpbmcpCi0gICAgewotICAgICAgICBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKHZpZGVvKTsKLSAgICAgICAgbW92ZVBvaW50ZXJUbyhzdHJlYW0sIHN0YXJ0U2Vjb25kUGFydCk7IC8qICAqLwotICAgICAgICBDb25jZWFsVGV4dHVyZV9QKHZpZGVvLCBtYl9zdGFydCwgbWJfZW5kLCBzbGljZV9jb3VudGVyKTsKLQotICAgICAgICByZXR1cm4gUFZfRkFJTDsKLSAgICB9Ci0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzI2LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRGVjb2RlIERRVUFOVCBhbmQgREMgaW4gRGF0YSBQYXJ0aXRpb25lZCBNb2RlIGZvciBib3RoICAgICAgICovCi0vKiAgICAgICAgICAgICBJLVZPUCBhbmQgUC1WT1AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIFBWX0ZBSUwgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAwMi8xMy8yMDAxIG5ldyBBQ0RDIHByZWRpY3Rpb24gc3RydWN0dXJlLCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1QVl9TVEFUVVMgR2V0TUJoZWFkZXJEYXRhUGFydF9EUVVBTlRfREMoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MTYgKlFQKQotewotICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOwotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKLSAgICBpbnQgaW50cmFfZGNfdmxjX3RociA9IHZpZGVvLT5jdXJyVm9wLT5pbnRyYURDVmxjVGhyOwotICAgIHVpbnQ4ICpNb2RlID0gdmlkZW8tPmhlYWRlckluZm8uTW9kZTsKLSAgICBpbnQgIE1CdHlwZSA9IE1vZGVbbWJudW1dOwotICAgIHR5cGVEQ1N0b3JlICpEQyA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKLSAgICBpbnQgIGNvbXA7Ci0gICAgQm9vbCBzd2l0Y2hlZDsKLSAgICB1aW50ICBEUVVBTlQ7Ci0gICAgaW50MTYgUVBfdG1wOwotCi0gICAgY29uc3Qgc3RhdGljIGludCAgRFFfdGFiWzRdID0geyAtMSwgLTIsIDEsIDJ9OwotCi0gICAgaWYgKE1CdHlwZSAmIFFfTUFTSykgICAgICAgICAgICAgLyogSU5UUkFfUSB8fCBJTlRFUl9RICovCi0gICAgewotICAgICAgICBEUVVBTlQgPSBCaXRzdHJlYW1SZWFkQml0czE2KHN0cmVhbSwgMik7Ci0gICAgICAgICpRUCArPSBEUV90YWJbRFFVQU5UXTsKLQotICAgICAgICBpZiAoKlFQIDwgMSkgKlFQID0gMTsKLSAgICAgICAgZWxzZSBpZiAoKlFQID4gMzEpICpRUCA9IDMxOwotICAgIH0KLSAgICBpZiAoTUJ0eXBlICYgSU5UUkFfTUFTSykgIC8qIElOVFJBIHx8IElOVFJBX1EgKi8gLyogbm8gc3dpdGNoLCBjb2RlIERDIHNlcGFyYXRlbHkgKi8KLSAgICB7Ci0gICAgICAgIFFQX3RtcCA9ICpRUDsgICAgICAgICAgICAgICAgICAgICAgLyogcnVubmluZyBRUCAgMDQvMjYvMDEqLwotICAgICAgICBzd2l0Y2hlZCA9IDA7Ci0gICAgICAgIGlmIChpbnRyYV9kY192bGNfdGhyKSAgICAgICAgICAgICAgICAgLyogIDA0LzI3LzAxICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+dXNlUHJldlFQKQotICAgICAgICAgICAgICAgIFFQX3RtcCA9IHZpZGVvLT5RUE1CW21ibnVtLTFdOwotICAgICAgICAgICAgc3dpdGNoZWQgPSAoaW50cmFfZGNfdmxjX3RociA9PSA3IHx8IFFQX3RtcCA+PSBpbnRyYV9kY192bGNfdGhyICogMiArIDExKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN3aXRjaGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0RlY29kZVByZWRpY3RlZEludHJhREMoY29tcCwgc3RyZWFtLCAoKkRDICsgY29tcCkpOyAgIC8qICAwMy8wMS8wMSAqLwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUFZfU1VDQ0VTUykgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgNjsgY29tcCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqREMpW2NvbXBdID0gMDsgICAvKiAgMDQvMjYvMDEgbmVlZGVkIGZvciBzd2l0Y2hlZCBjYXNlKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKkNvbW1lbnRCZWdpbioqKioqKgotKiAgICAgICAwNC8yNS8yMDAwIDogSW5pdGlhbCBtb2RpZmljYXRpb24gdG8gdGhlIG5ldyBQViBMaWIgZm9ybWF0LgotKiAgICAgICAwNC8xNy8yMDAxIDogbmV3IEFDREMgcHJlZCBzdHJ1Y3R1cmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEVuZCoqKioqKioqLwotUFZfU1RBVFVTIEdldE1CaGVhZGVyRGF0YVBhcnRfUChWaWRlb0RlY0RhdGEgKnZpZGVvKQotewotICAgIEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0gPSB2aWRlby0+Yml0c3RyZWFtOwotICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKLSAgICB1aW50OCAqTW9kZSA9IHZpZGVvLT5oZWFkZXJJbmZvLk1vZGU7Ci0gICAgdHlwZURDU3RvcmUgKkRDID0gdmlkZW8tPnByZWREQyArIG1ibnVtOwotICAgIHVpbnQgbm9fZGN0X2ZsYWc7Ci0gICAgaW50IGNvbXA7Ci0gICAgaW50IE1DQlBDOwotCi0gICAgbm9fZGN0X2ZsYWcgPSBCaXRzdHJlYW1SZWFkMUJpdHNfSU5MSU5FKHN0cmVhbSk7Ci0KLSAgICBpZiAobm9fZGN0X2ZsYWcpCi0gICAgewotICAgICAgICAvKiBza2lwcGVkIG1hY3JvYmxvY2sgKi8KLSAgICAgICAgTW9kZVttYm51bV0gPSBNT0RFX1NLSVBQRUQ7Ci0KLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKLSAgICAgICAgICAgIC8qICBBQ0RDIFJFTU9WRSBBQyBjb2VmcyBhcmUgc2V0IGluIERlY29kZURhdGFQYXJ0X1AgKi8KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBjb2RlZCBtYWNyb2Jsb2NrICovCi0gICAgICAgIE1DQlBDID0gUFZfVmxjRGVjTUNCUENfY29tX2ludGVyKHN0cmVhbSk7Ci0KLSAgICAgICAgaWYgKFZMQ19FUlJPUl9ERVRFQ1RFRChNQ0JQQykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotICAgICAgICB9Ci0KLSAgICAgICAgTW9kZVttYm51bV0gPSAodWludDgpTUJ0eXBlX21vZGVbTUNCUEMgJiA3XTsKLSAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQW21ibnVtXSA9ICh1aW50OCkoKE1DQlBDID4+IDQpICYgMyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFBWX1NVQ0NFU1M7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqQ29tbWVudEJlZ2luKioqKioqCi0qICAgICAgIDA0LzE3LzAxICBuZXcgQUNEQyBwcmVkIHN0cnVjdHVyZSwgcmVvcmdhbml6ZWQgY29kZSwgY2xlYW51cAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipDb21tZW50RW5kKioqKioqKiovCi1QVl9TVEFUVVMgR2V0TUJEYXRhX0RhdGFQYXJ0KFZpZGVvRGVjRGF0YSAqdmlkZW8pCi17Ci0gICAgaW50IG1ibnVtID0gdmlkZW8tPm1ibnVtOwotICAgIGludDE2ICpkYXRhQmxvY2s7Ci0gICAgTWFjcm9CbG9jayAqbWJsb2NrID0gdmlkZW8tPm1ibG9jazsKLSAgICBpbnQgUVAgPSB2aWRlby0+UVBNQlttYm51bV07Ci0gICAgaW50MzIgb2Zmc2V0OwotICAgIFBJWEVMICpjX2NvbXA7Ci0gICAgaW50IHdpZHRoID0gdmlkZW8tPndpZHRoOwotICAgIGludCBpbnRyYV9kY192bGNfdGhyID0gdmlkZW8tPmN1cnJWb3AtPmludHJhRENWbGNUaHI7Ci0gICAgdWludCBDQlAgPSB2aWRlby0+aGVhZGVySW5mby5DQlBbbWJudW1dOwotICAgIHVpbnQ4IG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKLSAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJudW1fY29sOwotICAgIHR5cGVEQ1N0b3JlICpEQyA9IHZpZGVvLT5wcmVkREMgKyBtYm51bTsKLSAgICBpbnQgIG5jb2VmZnNbNl0sICpub19jb2VmZiA9IG1ibG9jay0+bm9fY29lZmY7Ci0gICAgaW50ICBjb21wOwotICAgIEJvb2wgIHN3aXRjaGVkOwotICAgIGludCBRUF90bXAgPSBRUDsKLQotICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICB1aW50OCAqcHBfbW9kWzZdOwotICAgIGludCBUb3RhbE1CID0gdmlkZW8tPm5Ub3RhbE1COwotICAgIGludCBNQl9pbl93aWR0aCA9IHZpZGVvLT5uTUJQZXJSb3c7Ci0jZW5kaWYKLQotCi0KLSAgICAvKioqKioKLSAgICAqICAgICBEZWNvZGluZyBvZiB0aGUgNiBibG9ja3MgKGRlcGVuZGluZyBvbiB0cmFuc3BhcmVudCBwYXR0ZXJuKQotICAgICoqKioqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICAvKiogcG9zdC1wcm9jZXNzaW5nICoqKi8KLSAgICAgICAgcHBfbW9kWzBdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArICh5X3BvcyA8PCAxKSAqIChNQl9pbl93aWR0aCA8PCAxKSArICh4X3BvcyA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzFdID0gcHBfbW9kWzBdICsgMTsKLSAgICAgICAgcHBfbW9kWzJdID0gcHBfbW9kWzBdICsgKE1CX2luX3dpZHRoIDw8IDEpOwotICAgICAgICBwcF9tb2RbM10gPSBwcF9tb2RbMl0gKyAxOwotICAgICAgICBwcF9tb2RbNF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKFRvdGFsTUIgPDwgMikgKyBtYm51bTsKLSAgICAgICAgcHBfbW9kWzVdID0gcHBfbW9kWzRdICsgVG90YWxNQjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLwotCi0gICAgaWYgKG1vZGUgJiBJTlRSQV9NQVNLKSAvKiBNT0RFX0lOVFJBIHx8IG1vZGUgPT0gTU9ERV9JTlRSQV9RICovCi0gICAgewotICAgICAgICBzd2l0Y2hlZCA9IDA7Ci0gICAgICAgIGlmIChpbnRyYV9kY192bGNfdGhyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnVzZVByZXZRUCkKLSAgICAgICAgICAgICAgICBRUF90bXAgPSB2aWRlby0+UVBNQlttYm51bS0xXTsgICAvKiBydW5uaW5nIFFQICAwNC8yNi8wMSAqLwotCi0gICAgICAgICAgICBzd2l0Y2hlZCA9IChpbnRyYV9kY192bGNfdGhyID09IDcgfHwgUVBfdG1wID49IGludHJhX2RjX3ZsY190aHIgKiAyICsgMTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWJsb2NrLT5EQ1NjYWxhckx1bSA9IGNhbF9kY19zY2FsZXIoUVAsIExVTUlOQU5DRV9EQ19UWVBFKTsgICAgIC8qICAgQUNEQyAwMy8wMS8wMSAqLwotICAgICAgICBtYmxvY2stPkRDU2NhbGFyQ2hyID0gY2FsX2RjX3NjYWxlcihRUCwgQ0hST01JTkFOQ0VfRENfVFlQRSk7Ci0KLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDY7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgZGF0YUJsb2NrID0gbWJsb2NrLT5ibG9ja1tjb21wXTsgICAgLyosIDEwLzIwLzIwMDAgKi8KLQotICAgICAgICAgICAgZGF0YUJsb2NrWzBdID0gKCpEQylbY29tcF07Ci0KLSAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludHJhQmxvY2sodmlkZW8sIGNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZWQsIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotCi0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbY29tcF0pKSAgICAgICAgIC8qICAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hlZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmNvZWZmc1tjb21wXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KChkYXRhQmxvY2sgKyAxKSwgMCwgc2l6ZW9mKGludDE2KSo2Myk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9fY29lZmZbY29tcF0gPSBuY29lZmZzW2NvbXBdOwotICAgICAgICAgICAgLyogIG1vZGlmaWVkIHRvIG5ldyBzZW1hcGhvcmUgZm9yIHBvc3QtcHJvYyAqLwotICAgICAgICAgICAgLy8gRnV0dXJlIHdvcms6OiBjYW4gYmUgY29tYmluZWQgaW4gdGhlIGRlcXVhbnQgZnVuY3Rpb24KLSAgICAgICAgICAgIC8vIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jawotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSBQb3N0UHJvY1NlbWFwaG9yZShkYXRhQmxvY2spOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7Ci0gICAgfQotICAgIGVsc2UgLyogTU9ERSBJTlRFUiovCi0gICAgewotCi0KLQotCi0gICAgICAgIE1CTW90aW9uQ29tcCh2aWRlbywgQ0JQKTsKLSAgICAgICAgb2Zmc2V0ID0gKGludDMyKSh5X3BvcyA8PCA0KSAqIHdpZHRoICsgKHhfcG9zIDw8IDQpOwotICAgICAgICBjX2NvbXAgID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OwotCi0KLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDQ7IGNvbXArKykKLSAgICAgICAgewotICAgICAgICAgICAgKCpEQylbY29tcF0gPSBtaWRfZ3JheTsKLQotICAgICAgICAgICAgaWYgKENCUCAmICgxIDw8ICg1IC0gY29tcCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2sodmlkZW8sIGNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCAmbWJsb2NrLT5iaXRtYXByb3dbY29tcF0pOwotICAgICAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1tjb21wXSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotCi0KLSAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5jb2VmZnNbY29tcF0gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiAgQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrLCBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwotICAgICAgICBpZiAoQ0JQICYgMikKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s0XSA9IFZsY0RlcXVhbnRIMjYzSW50ZXJCbG9jayh2aWRlbywgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sICZtYmxvY2stPmJpdG1hcHJvd1s0XSk7Ci0gICAgICAgICAgICBpZiAoVkxDX0VSUk9SX0RFVEVDVEVEKG5jb2VmZnNbNF0pKQotICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUlMOwotCi0gICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjU2LCBtYmxvY2stPmJsb2NrWzRdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzRdLAotICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzRdLCBtYmxvY2stPmJpdG1hcHJvd1s0XSk7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5jb2VmZnNbNF0gPSAwOwotICAgICAgICB9Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAqcHBfbW9kWzRdID0gKHVpbnQ4KSgobmNvZWZmc1s0XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgICgqREMpWzVdID0gbWlkX2dyYXk7Ci0gICAgICAgIGlmIChDQlAgJiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBuY29lZmZzWzVdID0gVmxjRGVxdWFudEgyNjNJbnRlckJsb2NrKHZpZGVvLCA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs1XSwgJm1ibG9jay0+Yml0bWFwcm93WzVdKTsKLSAgICAgICAgICAgIGlmIChWTENfRVJST1JfREVURUNURUQobmNvZWZmc1s1XSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7Ci0KLSAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNjQsIG1ibG9jay0+YmxvY2tbNV0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNV0sIG1ibG9jay0+Yml0bWFwcm93WzVdKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbmNvZWZmc1s1XSA9IDA7Ci0gICAgICAgIH0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICpwcF9tb2RbNV0gPSAodWludDgpKChuY29lZmZzWzVdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKLQotCi0KLQotICAgICAgICAvKiBNb3Rpb24gY29tcGVuc2F0aW9uIGFuZCBwdXQgaXQgdG8gdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jayAqLwotICAgIH0KLSAgICByZXR1cm4gUFZfU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19jaHJvbWEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzc5YjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIERlcmluZ2luZ19DaHJvbWEoCi0gICAgdWludDggKlJlY19DLAotICAgIGludCB3aWR0aCwKLSAgICBpbnQgaGVpZ2h0LAotICAgIGludDE2ICpRUF9zdG9yZSwKLSAgICBpbnQsCi0gICAgdWludDggKnBwX21vZAotKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgdGhyZXM7Ci0gICAgaW50IHZfYmxrLCBoX2JsazsKLSAgICBpbnQgbWF4X2RpZmY7Ci0gICAgaW50IHZfcGVsLCBoX3BlbDsKLSAgICBpbnQgbWF4X2JsaywgbWluX2JsazsKLSAgICBpbnQgdjAsIGgwOwotICAgIHVpbnQ4ICpwdHI7Ci0gICAgaW50IHN1bSwgc3VtMSwgaW5jcjsKLSAgICBpbnQzMiBhZGRyX3Y7Ci0gICAgaW50IHNpZ25fdlsxMF0sIHN1bV92WzEwXTsKLSAgICBpbnQgKnB0cjIsICpwdHIzOwotICAgIHVpbnQ4IHBlbHUsIHBlbGMsIHBlbGw7Ci0gICAgaW5jciA9IHdpZHRoIC0gQkxLU0laRTsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAvKiBEbyB0aGUgZmlyc3QgbGluZSAoNyBwaXhlbHMgYXQgYSB0aW1lID0+IERvbid0IHVzZSBNTVgpKi8KLSAgICBmb3IgKGhfYmxrID0gMDsgaF9ibGsgPCB3aWR0aDsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICB7Ci0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlW2hfYmxrPj4zXSA+PiAyKSArIDQ7Ci0gICAgICAgIHB0ciA9ICZSZWNfQ1toX2Jsa107Ci0gICAgICAgIG1heF9ibGsgPSBtaW5fYmxrID0gKnB0cjsKLSAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2Jsaywgd2lkdGgpOwotICAgICAgICBoMCA9ICgoaF9ibGsgLSAxKSA+PSAxKSA/IChoX2JsayAtIDEpIDogMTsKLQotICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0KLSAgICAgICAgICAgIGZvciAodl9wZWwgPSAxOyB2X3BlbCA8IEJMS1NJWkUgLSAxOyB2X3BlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJfdiA9IChpbnQzMil2X3BlbCAqIHdpZHRoOwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1thZGRyX3YgKyBoMCAtIDFdOwotICAgICAgICAgICAgICAgIHB0cjIgPSAmc3VtX3ZbMF07Ci0gICAgICAgICAgICAgICAgcHRyMyA9ICZzaWduX3ZbMF07Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGhfcGVsID0gaDA7IGhfcGVsIDwgaF9ibGsgKyBCTEtTSVpFIC0gMTsgaF9wZWwrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHBlbGwgPSAqKHB0ciArIHdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAqcHRyMiA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgICAgICpwdHIzID0gSU5ERVgocGVsdSwgdGhyZXMpICsgSU5ERVgocGVsYywgdGhyZXMpICsgSU5ERVgocGVsbCwgdGhyZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1bTEgPSAqKHB0cjMgLSAyKSArICoocHRyMyAtIDEpICsgKnB0cjM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAoKihwdHIyIC0gMikgKyAoKihwdHIyIC0gMSkgPDwgMSkgKyAqcHRyMiArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUygqcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gPiAqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgcHRyMisrOwotICAgICAgICAgICAgICAgICAgICBwdHIzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICh2X2JsayA9IEJMS1NJWkU7IHZfYmxrIDwgaGVpZ2h0OyB2X2JsayArPSBCTEtTSVpFKQotICAgIHsKLSAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgIC8qIERvIHRoZSBmaXJzdCBibG9jayAocGl4ZWxzPTcgPT4gTm8gTU1YKSAqLwotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpdl9ibGsqd2lkdGgpPj4zKSk+PjNdID4+IDIpICsgNDsKLSAgICAgICAgcHRyID0gJlJlY19DWyhpbnQzMil2X2JsayAqIHdpZHRoXTsKLSAgICAgICAgbWF4X2JsayA9IG1pbl9ibGsgPSAqcHRyOwotICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLQotICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotCi0gICAgICAgICAgICBmb3IgKHZfcGVsID0gdjA7IHZfcGVsIDwgdl9ibGsgKyBCTEtTSVpFIC0gMTsgdl9wZWwrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyX3YgPSB2X3BlbCAqIHdpZHRoOwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1thZGRyX3ZdOwotICAgICAgICAgICAgICAgIHB0cjIgPSAmc3VtX3ZbMF07Ci0gICAgICAgICAgICAgICAgcHRyMyA9ICZzaWduX3ZbMF07Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBwZWx1ID0gKihwdHIgLSB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICpwdHIyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgICAgICpwdHIzKysgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGhfcGVsID0gMTsgaF9wZWwgPCBCTEtTSVpFIC0gMTsgaF9wZWwrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgcGVsYyA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHBlbGwgPSAqKHB0ciArIHdpZHRoKTsKLQotICAgICAgICAgICAgICAgICAgICAqcHRyMiA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgICAgICpwdHIzID0gSU5ERVgocGVsdSwgdGhyZXMpICsgSU5ERVgocGVsYywgdGhyZXMpICsgSU5ERVgocGVsbCwgdGhyZXMpOwotCi0gICAgICAgICAgICAgICAgICAgIHN1bTEgPSAqKHB0cjMgLSAyKSArICoocHRyMyAtIDEpICsgKnB0cjM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdW0xID09IDAgfHwgc3VtMSA9PSA5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAoKihwdHIyIC0gMikgKyAoKihwdHIyIC0gMSkgPDwgMSkgKyAqcHRyMiArIDgpID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0tOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUygqcHRyIC0gc3VtKSA+IG1heF9kaWZmKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gPiAqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSAqcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgICAgICAgICAgICAgcHRyMisrOwotICAgICAgICAgICAgICAgICAgICBwdHIzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBEbyB0aGUgcmVzdCBpbiBNTVggKi8KLSAgICAgICAgZm9yIChoX2JsayA9IEJMS1NJWkU7IGhfYmxrIDwgd2lkdGg7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgocHBfbW9kWyh2X2Jsay84KSood2lkdGgvOCkraF9ibGsvOF0mMHg0KSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMil2X2Jsayp3aWR0aCk+PjMpK2hfYmxrKT4+M10gPj4gMikgKyA0OwotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfQ1soaW50MzIpdl9ibGsgKiB3aWR0aCArIGhfYmxrXTsKLSAgICAgICAgICAgICAgICBtYXhfYmxrID0gbWluX2JsayA9ICpwdHI7Ci0gICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgaDAgPSBoX2JsayAtIDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWF4X2JsayAtIG1pbl9ibGsgPj0gNCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVzID0gKG1heF9ibGsgKyBtaW5fYmxrICsgMSkgPj4gMTsKLSNpZmRlZiBOb01NWAotICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfQywgdjAsIGgwLCB2X2JsaywgaF9ibGssIHRocmVzLCB3aWR0aCwgbWF4X2RpZmYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgoJlJlY19DWyhpbnQzMil2MCp3aWR0aCtoMF0sIHdpZHRoLCB0aHJlcywgbWF4X2RpZmYpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKiBtYWNyb2Jsb2NrIGxldmVsICovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NTc0YjQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2x1bWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLQotdm9pZCBEZXJpbmdpbmdfTHVtYSgKLSAgICB1aW50OCAqUmVjX1ksCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCwKLSAgICB1aW50OCAqcHBfbW9kKQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgdGhyZXNbNF0sIHJhbmdlWzRdLCBtYXhfcmFuZ2VfYmxrLCBtYXhfdGhyZXNfYmxrOwotICAgIGludCBNQl9WLCBNQl9ILCBCTEtfViwgQkxLX0g7Ci0gICAgaW50IHZfYmxrLCBoX2JsazsKLSAgICBpbnQgbWF4X2RpZmY7Ci0gICAgaW50IG1heF9ibGssIG1pbl9ibGs7Ci0gICAgaW50IHYwLCBoMDsKLSAgICB1aW50OCAqcHRyOwotICAgIGludCB0aHIsIGJsa3MsIGluY3I7Ci0gICAgaW50IG1iX2luZHgsIGJsa19pbmR4OwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbmNyID0gd2lkdGggLSBCTEtTSVpFOwotCi0gICAgLyogRGVyaW5nIHRoZSBmaXJzdCBsaW5lIG9mIG1hY3JvIGJsb2NrcyAqLwotICAgIGZvciAoTUJfSCA9IDA7IE1CX0ggPCB3aWR0aDsgTUJfSCArPSBNQlNJWkUpCi0gICAgewotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoTUJfSCk+PjRdID4+IDIpICsgNDsKLQotICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgIGJsa3MgPSAwOwotCi0gICAgICAgIGZvciAoQkxLX1YgPSAwOyBCTEtfViA8IE1CU0laRTsgQkxLX1YgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfWVsoaW50MzIpKEJMS19WKSAqIHdpZHRoICsgTUJfSCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLQotICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gKG1heF9ibGsgKyBtaW5fYmxrICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICByYW5nZVtibGtzXSA9IG1heF9ibGsgLSBtaW5fYmxrOwotCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdID49IG1heF9yYW5nZV9ibGspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gcmFuZ2VbYmxrc107Ci0gICAgICAgICAgICAgICAgICAgIG1heF90aHJlc19ibGsgPSB0aHJlc1tibGtzXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxrcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYmxrcyA9IDA7Ci0gICAgICAgIGZvciAodl9ibGsgPSAwOyB2X2JsayA8IE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgdjAgPSAoKHZfYmxrIC0gMSkgPj0gMSkgPyAodl9ibGsgLSAxKSA6IDE7Ci0gICAgICAgICAgICBmb3IgKGhfYmxrID0gTUJfSDsgaF9ibGsgPCBNQl9IICsgTUJTSVpFOyBoX2JsayArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGgwID0gKChoX2JsayAtIDEpID49IDEpID8gKGhfYmxrIC0gMSkgOiAxOwotCi0gICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGZsYXQgcmVnaW9uIGFkamFjZW50IHRvIG5vbi1mbGF0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXTwzMiAmJiBtYXhfcmFuZ2VfYmxrID49IDY0KQotICAgICAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IG1heF90aHJlc19ibGs7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZGVibG9ja2luZwotICAgICAgICAgICAgICAgIChibG9ja2luZXNzIGFubm95aW5nIGF0IERDIGRvbWluYW50IHJlZ2lvbikgKi8KLSAgICAgICAgICAgICAgICBpZiAobWF4X3JhbmdlX2JsayA+PSAxNikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0aXZlIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICB0aHIgPSB0aHJlc1tibGtzXTsKLQotICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfWSwgdjAsIGgwLCB2X2JsaywgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociwgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmxrcysrOwotICAgICAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotICAgICAgICB9Ci0gICAgfSAvKiBtYWNyb2Jsb2NrIGxldmVsICovCi0KLQotICAgIC8qIERvIHRoZSByZXN0IG9mIHRoZSBtYWNyby1ibG9jay1saW5lcyAqLwotICAgIGZvciAoTUJfViA9IE1CU0laRTsgTUJfViA8IGhlaWdodDsgTUJfViArPSBNQlNJWkUpCi0gICAgewotICAgICAgICAvKiBGaXJzdCBtYWNyby1ibG9jayAqLwotICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpTUJfVip3aWR0aCk+PjQpKT4+NF0gPj4gMikgKyA0OwotICAgICAgICAvKiB0aHJlc2hvbGQgZGV0ZXJtaW5hdGlvbiAqLwotICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgIGJsa3MgPSAwOwotICAgICAgICBmb3IgKEJMS19WID0gMDsgQkxLX1YgPCBNQlNJWkU7IEJMS19WICs9IEJMS1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQkxLX0ggPSAwOyBCTEtfSCA8IE1CU0laRTsgQkxLX0ggKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdHIgPSAmUmVjX1lbKGludDMyKShNQl9WICsgQkxLX1YpICogd2lkdGggKyBCTEtfSF07Ci0gICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJhbmdlW2Jsa3NdID0gbWF4X2JsayAtIG1pbl9ibGs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSByYW5nZVtibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibGtzID0gMDsKLSAgICAgICAgZm9yICh2X2JsayA9IE1CX1Y7IHZfYmxrIDwgTUJfViArIE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgICAgICBmb3IgKGhfYmxrID0gMDsgaF9ibGsgPCBNQlNJWkU7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaDAgPSAoKGhfYmxrIC0gMSkgPj0gMSkgPyAoaF9ibGsgLSAxKSA6IDE7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZmxhdCByZWdpb24gYWRqYWNlbnQgdG8gbm9uLWZsYXQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19ZLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gLyogYmxvY2sgbGV2ZWwgKEx1bWluYW5jZSkgKi8KLQotICAgICAgICAvKiBSZXN0IG9mIHRoZSBtYWNyby1ibG9ja3MgKi8KLSAgICAgICAgZm9yIChNQl9IID0gTUJTSVpFOyBNQl9IIDwgd2lkdGg7IE1CX0ggKz0gTUJTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXhfZGlmZiA9IChRUF9zdG9yZVsoKCgoaW50MzIpTUJfVip3aWR0aCk+PjQpK01CX0gpPj40XSA+PiAyKSArIDQ7Ci0KLSAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gbWF4X3RocmVzX2JsayA9IDA7Ci0gICAgICAgICAgICBibGtzID0gMDsKLQotICAgICAgICAgICAgbWJfaW5keCA9IChNQl9WIC8gOCkgKiAod2lkdGggLyA4KSArIE1CX0ggLyA4OwotICAgICAgICAgICAgZm9yIChCTEtfViA9IDA7IEJMS19WIDwgTUJTSVpFOyBCTEtfViArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoQkxLX0ggPSAwOyBCTEtfSCA8IE1CU0laRTsgQkxLX0ggKz0gQkxLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJsa19pbmR4ID0gbWJfaW5keCArIChCTEtfViAvIDgpICogd2lkdGggLyA4ICsgQkxLX0ggLyA4OwotICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgYmFzZWQgb24gcHBfbW9kIG9ubHkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbYmxrX2luZHhdJjB4NCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gJlJlY19ZWyhpbnQzMikoTUJfViArIEJMS19WKSAqIHdpZHRoICsgTUJfSCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VbYmxrc10gPSBtYXhfYmxrIC0gbWluX2JsazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdID49IG1heF9yYW5nZV9ibGspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3JhbmdlX2JsayA9IHJhbmdlW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90aHJlc19ibGsgPSB0aHJlc1tibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBibGtzID0gMDsKLSAgICAgICAgICAgIGZvciAodl9ibGsgPSBNQl9WOyB2X2JsayA8IE1CX1YgKyBNQlNJWkU7IHZfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdjAgPSB2X2JsayAtIDE7Ci0gICAgICAgICAgICAgICAgbWJfaW5keCA9ICh2X2JsayAvIDgpICogKHdpZHRoIC8gOCk7Ci0gICAgICAgICAgICAgICAgZm9yIChoX2JsayA9IE1CX0g7IGhfYmxrIDwgTUJfSCArIE1CU0laRTsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGgwID0gaF9ibGsgLSAxOwotICAgICAgICAgICAgICAgICAgICBibGtfaW5keCA9IG1iX2luZHggKyBoX2JsayAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocHBfbW9kW2Jsa19pbmR4XSYweDQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBmbGF0IHJlZ2lvbiBhZGphY2VudCB0byBub24tZmxhdCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXTwzMiAmJiBtYXhfcmFuZ2VfYmxrID49IDY0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja2luZXNzIGFubm95aW5nIGF0IERDIGRvbWluYW50IHJlZ2lvbikgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFkYXB0aXZlIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotI2lmZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgoUmVjX1ksIHYwLCBoMCwgdl9ibGssIGhfYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRociwgd2lkdGgsIG1heF9kaWZmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgoJlJlY19ZW3YwKndpZHRoK2gwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgdGhyLCBtYXhfZGlmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotICAgICAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9maW5kX21pbl9tYXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4OGExLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgaW5wdXRfcHRyID0gcG9pbnRlciB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdmFsdWVzIG9mIHR5cGUgVUNoYXIKLSAgICAgICAgICAgIGluIGEgMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBtaW5fcHRyID0gcG9pbnRlciB0byB0aGUgbWluaW11bSB2YWx1ZSBvZiB0eXBlIEludCB0byBiZSBmb3VuZCBpbiBhCi0gICAgICAgICAgc3F1YXJlIGJsb2NrIG9mIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBtYXhfcHRyID0gcG9pbnRlciB0byB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0eXBlIEludCB0byBiZSBmb3VuZCBpbiBhCi0gICAgICAgICAgc3F1YXJlIGJsb2NrIG9mIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLSAgICBpbmNyID0gdmFsdWUgb2YgdHlwZSBJbnQgcmVwcmVzZW50aW5nIHRoZSB3aWR0aCBvZiAyRCBibG9jayBvZiBkYXRhLgotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICBtaW5fcHRyIHBvaW50cyB0byB0aGUgZm91bmQgbWluaW11bSB2YWx1ZSBpbiB0aGUgc3F1YXJlIGJsb2NrIG9mCi0gICAgc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotCi0gICAgbWF4X3B0ciBwb2ludHMgdG8gdGhlIGZvdW5kIG1heGltdW0gdmFsdWUgaW4gdGhlIHNxdWFyZSBibG9jayBvZgotICAgIHNpemUgQkxLU0laRSBjb250YWluZWQgaW4gMkQgYmxvY2sgb2YgZGF0YS4KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIG1heGltdW0gYW5kIHRoZSBtaW5pbXVtIHZhbHVlcyBpbiBhIHNxdWFyZSBibG9jayBvZgotIGRhdGEgb2Ygc2l6ZSBCTEtTSVpFICogQkxLU0laRS4gVGhlIGRhdGEgaXMgY29udGFpbmVkIGluIHRoZSBidWZmZXIgd2hpY2gKLSByZXByZXNlbnRzIGEgMkQgYmxvY2sgb2YgZGF0YSB0aGF0IGlzIGxhcmdlciB0aGFuIEJMS1NJWkUgKiBCTEtTSVpFLgotIFRoaXMgaXMgaWxsdXN0cmF0ZWQgYmVsb3cuCi0KLSAgICBtZW0gbG9jIHggKyAwMGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotICAgIG1lbSBsb2MgeCArIDEwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgMjBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyAzMGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDQwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNTBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA2MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDcwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgODBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA5MGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotICAgIG1lbSBsb2MgeCArIEEwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgQjBoIC0+IG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8KLQotRm9yIGlsbHVzdHJhdGlvbiBwdXJwb3NlcywgdGhlIGRpYWdyYW0gYXNzdW1lcyB0aGF0IEJMS1NJWkUgaXMgZXF1YWwgdG8gOAotYnV0IHRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQuIEluIHRoaXMgZGlhZ3JhbSwgdGhlIGJ1ZmZlciBzdGFydHMgYXQKLWxvY2F0aW9uIHggYnV0IHRoZSBpbnB1dCBwb2ludGVyLCBpbnB1dF9wdHIsIHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24KLXdvdWxkIGJlIHRoZSBmaXJzdCByb3cgb2YgZGF0YSB0byBiZSBzZWFyY2hlZCB3aGljaCBpcyBhdCB4ICsgMTVoLiBUaGUKLXZhbHVlIG9mIGluY3IgcGFzc2VkIG9udG8gdGhpcyBmdW5jdGlvbiByZXByZXNlbnRzIHRoZSBhbW91bnQgdGhlIGlucHV0X3B0cgotbmVlZHMgdG8gYmUgaW5jcmVtZW50ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgcm93IG9mIGRhdGEuCi0KLVRoaXMgZnVuY3Rpb24gY29tcGFyZXMgZWFjaCB2YWx1ZSBpbiBhIHJvdyB0byB0aGUgY3VycmVudCBtYXhpbXVtIGFuZAotbWluaW11bS4gQWZ0ZXIgZWFjaCByb3csIGlucHV0X3B0ciBpcyBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUgbmV4dCByb3cuCi1UaGlzIGlzIHJlcGVhdGVkIHVudGlsIGFsbCByb3dzIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFdoZW4gdGhlIHNlYXJjaCBpcwotY29tcGxldGUgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgbWluX3B0ciBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZQotZm91bmQgYW5kIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IG1heF9wdHIgY29udGFpbnMgdGhlIG1heGltdW0gdmFsdWUgZm91bmQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCAgRmluZE1heE1pbigKLSAgICB1aW50OCAqaW5wdXRfcHRyLAotICAgIGludCAqbWluX3B0ciwKLSAgICBpbnQgKm1heF9wdHIsCi0gICAgaW50IGluY3IpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQgICAgaSwgajsKLSAgICBpbnQgbWluLCBtYXg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIG1heCA9IG1pbiA9ICppbnB1dF9wdHI7Ci0gICAgLyogIGluY3IgPSBpbmNyIC0gQkxLU0laRTsgKi8gICAvKiAgMDkvMDYvMjAwMSwgYWxyZWFkeSBwYXNzZWQgaW4gYXMgd2lkdGggLSBCTEtTSVpFICovCi0KLSAgICBmb3IgKGkgPSBCTEtTSVpFOyBpID4gMDsgaS0tKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gQkxLU0laRTsgaiA+IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCppbnB1dF9wdHIgPiBtYXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4ID0gKmlucHV0X3B0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCppbnB1dF9wdHIgPCBtaW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWluID0gKmlucHV0X3B0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0X3B0ciArPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByb3cqLwotICAgICAgICBpbnB1dF9wdHIgKz0gaW5jcjsKLSAgICB9Ci0KLSAgICAqbWF4X3B0ciA9IG1heDsKLSAgICAqbWluX3B0ciA9IG1pbjsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWNlNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jaW5jbHVkZSAibXA0ZGVmLmgiCi0jaW5jbHVkZSAiaWRjdC5oIgotI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCi0KLSNpZmRlZiBGQVNUX0lEQ1QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgdmNhX2lkY3QuYyA6IGNyZWF0ZWQgNi8xLzk5IGZvciBzZXZlcmFsIG9wdGlvbnMKLSogICAgICAgICAgICAgICAgICAgICBvZiBoYXJkLWNvZGVkIHJlZHVjZWQgaWRjdCBmdW5jdGlvbiAodXNpbmcgbnpfY29lZnMpCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcHJldGVzdGVkIHZlcnNpb24KLXZvaWQgaWRjdHJvdzAoaW50MTYgKiwgdWludDggKiwgdWludDggKiwgaW50KQotewotICAgIHJldHVybiA7Ci19Ci12b2lkIGlkY3Rjb2wwKGludDE2ICopCi17Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0cm93MShpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQotewotICAgIC8qIHNob3J0Y3V0ICovCi0gICAgaW50IHRtcDsKLSAgICBpbnQgaSA9IDg7Ci0gICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7Ci0gICAgaW50IHJlcywgcmVzMjsKLQotICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KLSAgICB3aWR0aCAtPSA0OwotICAgIGRzdCAtPSB3aWR0aDsKLSAgICBwcmVkIC09IDEyOwotICAgIGJsayAtPSA4OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHRtcCA9ICgqKGJsayArPSA4KSArIDMyKSA+PiA2OwotICAgICAgICAqYmxrID0gMDsKLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMpOwotICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKLSAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gdG1wICsgKHByZWRfd29yZCAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMpOwotICAgICAgICByZXMyID0gdG1wICsgKChwcmVkX3dvcmQgPj4gOCkgJiAweEZGKTsKLSAgICAgICAgQ0xJUF9SRVNVTFQocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9IHRtcCArICgocHJlZF93b3JkID4+IDE2KSAmIDB4RkYpOwotICAgICAgICBDTElQX1JFU1VMVChyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gdG1wICsgKChwcmVkX3dvcmQgPj4gMjQpICYgMHhGRik7Ci0gICAgICAgIENMSVBfUkVTVUxUKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIGlkY3Rjb2wxKGludDE2ICpibGspCi17IC8qIHNob3J0Y3V0ICovCi0gICAgYmxrWzBdID0gYmxrWzhdID0gYmxrWzE2XSA9IGJsa1syNF0gPSBibGtbMzJdID0gYmxrWzQwXSA9IGJsa1s0OF0gPSBibGtbNTZdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtbMF0gPDwgMzsKLSAgICByZXR1cm47Ci19Ci0KLXZvaWQgaWRjdHJvdzIoaW50MTYgKmJsaywgdWludDggKnByZWQsIHVpbnQ4ICpkc3QsIGludCB3aWR0aCkKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4NCwgeDU7Ci0gICAgaW50IGkgPSA4OwotICAgIHVpbnQzMiBwcmVkX3dvcmQsIGRzdF93b3JkOwotICAgIGludCByZXMsIHJlczI7Ci0KLSAgICAvKiBwcmVzZXQgdGhlIG9mZnNldCwgc3VjaCB0aGF0IHdlIGNhbiB0YWtlIGFkdmFudGFnZSBwcmUtb2Zmc2V0IGFkZHJlc3NpbmcgbW9kZSAgICovCi0gICAgd2lkdGggLT0gNDsKLSAgICBkc3QgLT0gd2lkdGg7Ci0gICAgcHJlZCAtPSAxMjsKLSAgICBibGsgLT0gODsKLQotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICAvKiBzaG9ydGN1dCAqLwotICAgICAgICB4NCA9IGJsa1s5XTsKLSAgICAgICAgYmxrWzldID0gMDsKLSAgICAgICAgeDAgPSAoKCooYmxrICs9IDgpKSA8PCA4KSArIDgxOTI7Ci0gICAgICAgICpibGsgPSAwOyAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0KLSAgICAgICAgLyogZmlyc3Qgc3RhZ2UgKi8KLSAgICAgICAgeDUgPSAoVzcgKiB4NCArIDQpID4+IDM7Ci0gICAgICAgIHg0ID0gKFcxICogeDQgKyA0KSA+PiAzOwotCi0gICAgICAgIC8qIHRoaXJkIHN0YWdlICovCi0gICAgICAgIHgyID0gKDE4MSAqICh4NCArIHg1KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDEgPSAoMTgxICogKHg0IC0geDUpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIC8qIGZvdXJ0aCBzdGFnZSAqLwotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gKHgwICsgeDQpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7Ci0gICAgICAgIHJlczIgPSAoeDAgKyB4MikgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9ICh4MCArIHgxKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gKHgwICsgeDUpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gKHgwIC0geDUpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7Ci0gICAgICAgIHJlczIgPSAoeDAgLSB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9ICh4MCAtIHgyKSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gKHgwIC0geDQpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLSAgICB9Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0Y29sMihpbnQxNiAqYmxrKQotewotICAgIGludDMyIHgwLCB4MSwgeDMsIHg1LCB4NzsvLywgeDg7Ci0KLSAgICB4MSA9IGJsa1s4XTsKLSAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKLSAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCi0KLSAgICB4NyA9IFc3ICogeDE7Ci0gICAgeDEgPSBXMSAqIHgxOwotCi0gICAgeDMgPSB4NzsKLSAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7Ci0gICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OwotCi0gICAgYmxrWzBdID0gKHgwICsgeDEpID4+IDg7Ci0gICAgYmxrWzhdID0gKHgwICsgeDcpID4+IDg7Ci0gICAgYmxrWzE2XSA9ICh4MCArIHg1KSA+PiA4OwotICAgIGJsa1syNF0gPSAoeDAgKyB4MykgPj4gODsKLSAgICBibGtbNTZdID0gKHgwIC0geDEpID4+IDg7Ci0gICAgYmxrWzQ4XSA9ICh4MCAtIHg3KSA+PiA4OwotICAgIGJsa1s0MF0gPSAoeDAgLSB4NSkgPj4gODsKLSAgICBibGtbMzJdID0gKHgwIC0geDMpID4+IDg7Ci0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3czKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKLSAgICBpbnQgaSA9IDg7Ci0gICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7Ci0gICAgaW50IHJlcywgcmVzMjsKLQotICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KLSAgICB3aWR0aCAtPSA0OwotICAgIGRzdCAtPSB3aWR0aDsKLSAgICBwcmVkIC09IDEyOwotICAgIGJsayAtPSA4OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgyID0gYmxrWzEwXTsKLSAgICAgICAgYmxrWzEwXSA9IDA7Ci0gICAgICAgIHgxID0gYmxrWzldOwotICAgICAgICBibGtbOV0gPSAwOwotICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKLSAgICAgICAgKmJsayA9IDA7ICAgLyogZm9yIHByb3BlciByb3VuZGluZyBpbiB0aGUgZm91cnRoIHN0YWdlICovCi0gICAgICAgIC8qIGJvdGggdXBwZXIgYW5kIGxvd2VyKi8KLSAgICAgICAgLyogYm90aCB4Mm9yeDYgYW5kIHgwb3J4NCAqLwotCi0gICAgICAgIHg0ID0geDA7Ci0gICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDggPSB4MCAtIHgyOwotICAgICAgICB4MCArPSB4MjsKLSAgICAgICAgeDIgPSB4ODsKLSAgICAgICAgeDggPSB4NCAtIHg2OwotICAgICAgICB4NCArPSB4NjsKLSAgICAgICAgeDYgPSB4ODsKLQotICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHgzID0geDc7Ci0gICAgICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKLSAgICAgICAgeDcgPSAoMTgxICogKHgxICsgeDcpICsgMTI4KSA+PiA4OwotCi0gICAgICAgIHByZWRfd29yZCA9ICooKHVpbnQzMiopKHByZWQgKz0gMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDAgKyB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4NCArIHg3KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHg2ICsgeDUpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDIgKyB4MykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDQpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gcHJlZCAqLwotICAgICAgICByZXMgPSAoeDIgLSB4MykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDEocmVzKTsKLSAgICAgICAgcmVzMiA9ICh4NiAtIHg1KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMihyZXMyKTsKLSAgICAgICAgZHN0X3dvcmQgPSAocmVzMiA8PCA4KSB8IHJlczsKLSAgICAgICAgcmVzID0gKHg0IC0geDcpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAzKHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMTYpOwotICAgICAgICByZXMgPSAoeDAgLSB4MSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDQocmVzKTsKLSAgICAgICAgZHN0X3dvcmQgfD0gKHJlcyA8PCAyNCk7Ci0gICAgICAgICooKHVpbnQzMiopKGRzdCArPSA0KSkgPSBkc3Rfd29yZDsgLyogc2F2ZSA0IGJ5dGVzIHRvIGRzdCAqLwotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLXZvaWQgaWRjdGNvbDMoaW50MTYgKmJsaykKLXsKLSAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwotCi0gICAgeDIgPSBibGtbMTZdOwotICAgIHgxID0gYmxrWzhdOwotICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgMTEpICsgMTI4OwotCi0gICAgeDQgPSB4MDsKLSAgICB4NiA9IFc2ICogeDI7Ci0gICAgeDIgPSBXMiAqIHgyOwotICAgIHg4ID0geDAgLSB4MjsKLSAgICB4MCArPSB4MjsKLSAgICB4MiA9IHg4OwotICAgIHg4ID0geDQgLSB4NjsKLSAgICB4NCArPSB4NjsKLSAgICB4NiA9IHg4OwotCi0gICAgeDcgPSBXNyAqIHgxOwotICAgIHgxID0gVzEgKiB4MTsKLSAgICB4MyA9IHg3OwotICAgIHg1ID0gKDE4MSAqICh4MSAtIHg3KSArIDEyOCkgPj4gODsKLSAgICB4NyA9ICgxODEgKiAoeDEgKyB4NykgKyAxMjgpID4+IDg7Ci0KLSAgICBibGtbMF0gPSAoeDAgKyB4MSkgPj4gODsKLSAgICBibGtbOF0gPSAoeDQgKyB4NykgPj4gODsKLSAgICBibGtbMTZdID0gKHg2ICsgeDUpID4+IDg7Ci0gICAgYmxrWzI0XSA9ICh4MiArIHgzKSA+PiA4OwotICAgIGJsa1s1Nl0gPSAoeDAgLSB4MSkgPj4gODsKLSAgICBibGtbNDhdID0gKHg0IC0geDcpID4+IDg7Ci0gICAgYmxrWzQwXSA9ICh4NiAtIHg1KSA+PiA4OwotICAgIGJsa1szMl0gPSAoeDIgLSB4MykgPj4gODsKLQotICAgIHJldHVybjsKLX0KLQotCi12b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKLSAgICBpbnQgaSA9IDg7Ci0gICAgdWludDMyIHByZWRfd29yZCwgZHN0X3dvcmQ7Ci0gICAgaW50IHJlcywgcmVzMjsKLQotICAgIC8qIHByZXNldCB0aGUgb2Zmc2V0LCBzdWNoIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIHByZS1vZmZzZXQgYWRkcmVzc2luZyBtb2RlICAgKi8KLSAgICB3aWR0aCAtPSA0OwotICAgIGRzdCAtPSB3aWR0aDsKLSAgICBwcmVkIC09IDEyOwotICAgIGJsayAtPSA4OwotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIHgyID0gYmxrWzEwXTsKLSAgICAgICAgYmxrWzEwXSA9IDA7Ci0gICAgICAgIHgxID0gYmxrWzldOwotICAgICAgICBibGtbOV0gPSAwOwotICAgICAgICB4MyA9IGJsa1sxMV07Ci0gICAgICAgIGJsa1sxMV0gPSAwOwotICAgICAgICB4MCA9ICgoKihibGsgKz0gOCkpIDw8IDgpICsgODE5MjsKLSAgICAgICAgKmJsayA9IDA7ICAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLwotCi0gICAgICAgIHg0ID0geDA7Ci0gICAgICAgIHg2ID0gKFc2ICogeDIgKyA0KSA+PiAzOwotICAgICAgICB4MiA9IChXMiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDggPSB4MCAtIHgyOwotICAgICAgICB4MCArPSB4MjsKLSAgICAgICAgeDIgPSB4ODsKLSAgICAgICAgeDggPSB4NCAtIHg2OwotICAgICAgICB4NCArPSB4NjsKLSAgICAgICAgeDYgPSB4ODsKLQotICAgICAgICB4NyA9IChXNyAqIHgxICsgNCkgPj4gMzsKLSAgICAgICAgeDEgPSAoVzEgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHg1ID0gKFczICogeDMgKyA0KSA+PiAzOwotICAgICAgICB4MyA9ICgtIFc1ICogeDMgKyA0KSA+PiAzOwotICAgICAgICB4OCA9IHgxIC0geDU7Ci0gICAgICAgIHgxICs9IHg1OwotICAgICAgICB4NSA9IHg4OwotICAgICAgICB4OCA9IHg3IC0geDM7Ci0gICAgICAgIHgzICs9IHg3OwotICAgICAgICB4NyA9ICgxODEgKiAoeDUgKyB4OCkgKyAxMjgpID4+IDg7Ci0gICAgICAgIHg1ID0gKDE4MSAqICh4NSAtIHg4KSArIDEyOCkgPj4gODsKLQotICAgICAgICBwcmVkX3dvcmQgPSAqKCh1aW50MzIqKShwcmVkICs9IDEyKSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gKHgwICsgeDEpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7Ci0gICAgICAgIHJlczIgPSAoeDQgKyB4NykgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9ICh4NiArIHg1KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gKHgyICsgeDMpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gd2lkdGgpKSA9IGRzdF93b3JkOyAvKiBzYXZlIDQgYnl0ZXMgdG8gZHN0ICovCi0KLSAgICAgICAgcHJlZF93b3JkID0gKigodWludDMyKikocHJlZCArPSA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHByZWQgKi8KLSAgICAgICAgcmVzID0gKHgyIC0geDMpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVAxKHJlcyk7Ci0gICAgICAgIHJlczIgPSAoeDYgLSB4NSkgPj4gMTQ7Ci0gICAgICAgIEFERF9BTkRfQ0xJUDIocmVzMik7Ci0gICAgICAgIGRzdF93b3JkID0gKHJlczIgPDwgOCkgfCByZXM7Ci0gICAgICAgIHJlcyA9ICh4NCAtIHg3KSA+PiAxNDsKLSAgICAgICAgQUREX0FORF9DTElQMyhyZXMpOwotICAgICAgICBkc3Rfd29yZCB8PSAocmVzIDw8IDE2KTsKLSAgICAgICAgcmVzID0gKHgwIC0geDEpID4+IDE0OwotICAgICAgICBBRERfQU5EX0NMSVA0KHJlcyk7Ci0gICAgICAgIGRzdF93b3JkIHw9IChyZXMgPDwgMjQpOwotICAgICAgICAqKCh1aW50MzIqKShkc3QgKz0gNCkpID0gZHN0X3dvcmQ7IC8qIHNhdmUgNCBieXRlcyB0byBkc3QgKi8KLSAgICB9Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0Y29sNChpbnQxNiAqYmxrKQotewotICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7Ci0gICAgeDIgPSBibGtbMTZdOwotICAgIHgxID0gYmxrWzhdOwotICAgIHgzID0gYmxrWzI0XTsKLSAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDExKSArIDEyODsKLQotICAgIHg0ID0geDA7Ci0gICAgeDYgPSBXNiAqIHgyOwotICAgIHgyID0gVzIgKiB4MjsKLSAgICB4OCA9IHgwIC0geDI7Ci0gICAgeDAgKz0geDI7Ci0gICAgeDIgPSB4ODsKLSAgICB4OCA9IHg0IC0geDY7Ci0gICAgeDQgKz0geDY7Ci0gICAgeDYgPSB4ODsKLQotICAgIHg3ID0gVzcgKiB4MTsKLSAgICB4MSA9IFcxICogeDE7Ci0gICAgeDUgPSBXMyAqIHgzOwotICAgIHgzID0gLVc1ICogeDM7Ci0gICAgeDggPSB4MSAtIHg1OwotICAgIHgxICs9IHg1OwotICAgIHg1ID0geDg7Ci0gICAgeDggPSB4NyAtIHgzOwotICAgIHgzICs9IHg3OwotICAgIHg3ID0gKDE4MSAqICh4NSArIHg4KSArIDEyOCkgPj4gODsKLSAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7Ci0KLQotICAgIGJsa1swXSA9ICh4MCArIHgxKSA+PiA4OwotICAgIGJsa1s4XSA9ICh4NCArIHg3KSA+PiA4OwotICAgIGJsa1sxNl0gPSAoeDYgKyB4NSkgPj4gODsKLSAgICBibGtbMjRdID0gKHgyICsgeDMpID4+IDg7Ci0gICAgYmxrWzU2XSA9ICh4MCAtIHgxKSA+PiA4OwotICAgIGJsa1s0OF0gPSAoeDQgLSB4NykgPj4gODsKLSAgICBibGtbNDBdID0gKHg2IC0geDUpID4+IDg7Ci0gICAgYmxrWzMyXSA9ICh4MiAtIHgzKSA+PiA4OwotCi0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0cm93MF9pbnRyYShpbnQxNiAqLCBQSVhFTCAqLCBpbnQpCi17Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBpZGN0cm93MV9pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQotewotICAgIC8qIHNob3J0Y3V0ICovCi0gICAgaW50MzIgdG1wOwotICAgIGludCBpID0gODsKLSAgICBpbnQgb2Zmc2V0ID0gd2lkdGg7Ci0gICAgdWludDMyIHdvcmQ7Ci0KLSAgICBjb21wIC09IG9mZnNldDsKLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgdG1wID0gKChibGtbMF0gKyAzMikgPj4gNik7Ci0gICAgICAgIGJsa1swXSA9IDA7Ci0gICAgICAgIENMSVBfUkVTVUxUKHRtcCkKLQotICAgICAgICB3b3JkID0gKHRtcCA8PCA4KSB8IHRtcDsKLSAgICAgICAgd29yZCA9ICh3b3JkIDw8IDE2KSB8IHdvcmQ7Ci0KLSAgICAgICAgKigodWludDMyKikoY29tcCArPSBvZmZzZXQpKSA9IHdvcmQ7Ci0gICAgICAgICooKHVpbnQzMiopKGNvbXAgKyA0KSkgPSB3b3JkOwotCi0KLQotCi0gICAgICAgIGJsayArPSBCX1NJWkU7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotdm9pZCBpZGN0cm93Ml9pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQotewotICAgIGludDMyIHgwLCB4MSwgeDIsIHg0LCB4NSwgdGVtcDsKLSAgICBpbnQgaSA9IDg7Ci0gICAgaW50IG9mZnNldCA9IHdpZHRoOwotICAgIGludDMyIHdvcmQ7Ci0KLSAgICBjb21wIC09IG9mZnNldDsKLSAgICB3aGlsZSAoaS0tKQotICAgIHsKLSAgICAgICAgLyogc2hvcnRjdXQgKi8KLSAgICAgICAgeDQgPSBibGtbMV07Ci0gICAgICAgIGJsa1sxXSA9IDA7Ci0gICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOwotICAgICAgICBibGtbMF0gPSAwOyAgIC8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLwotCi0gICAgICAgIC8qIGZpcnN0IHN0YWdlICovCi0gICAgICAgIHg1ID0gKFc3ICogeDQgKyA0KSA+PiAzOwotICAgICAgICB4NCA9IChXMSAqIHg0ICsgNCkgPj4gMzsKLQotICAgICAgICAvKiB0aGlyZCBzdGFnZSAqLwotICAgICAgICB4MiA9ICgxODEgKiAoeDQgKyB4NSkgKyAxMjgpID4+IDg7Ci0gICAgICAgIHgxID0gKDE4MSAqICh4NCAtIHg1KSArIDEyOCkgPj4gODsKLQotICAgICAgICAvKiBmb3VydGggc3RhZ2UgKi8KLSAgICAgICAgd29yZCA9ICgoeDAgKyB4NCkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQotCi0gICAgICAgIHRlbXAgPSAoKHgwICsgeDIpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLSAgICAgICAgdGVtcCA9ICgoeDAgKyB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLSAgICAgICAgdGVtcCA9ICgoeDAgKyB4NSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKLQotICAgICAgICB3b3JkID0gKCh4MCAtIHg1KSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0gICAgICAgIHRlbXAgPSAoKHgwIC0geDEpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4MikgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDE2KTsKLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4NCkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKLQotICAgICAgICBibGsgKz0gQl9TSVpFOwotICAgIH0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3czX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKLSAgICBpbnQgaSA9IDg7Ci0gICAgaW50IG9mZnNldCA9IHdpZHRoOwotICAgIGludDMyIHdvcmQ7Ci0KLSAgICBjb21wIC09IG9mZnNldDsKLQotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICB4MiA9IGJsa1syXTsKLSAgICAgICAgYmxrWzJdID0gMDsKLSAgICAgICAgeDEgPSBibGtbMV07Ci0gICAgICAgIGJsa1sxXSA9IDA7Ci0gICAgICAgIHgwID0gKChpbnQzMilibGtbMF0gPDwgOCkgKyA4MTkyOwotICAgICAgICBibGtbMF0gPSAwOy8qIGZvciBwcm9wZXIgcm91bmRpbmcgaW4gdGhlIGZvdXJ0aCBzdGFnZSAqLwotICAgICAgICAvKiBib3RoIHVwcGVyIGFuZCBsb3dlciovCi0gICAgICAgIC8qIGJvdGggeDJvcng2IGFuZCB4MG9yeDQgKi8KLQotICAgICAgICB4NCA9IHgwOwotICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7Ci0gICAgICAgIHg4ID0geDAgLSB4MjsKLSAgICAgICAgeDAgKz0geDI7Ci0gICAgICAgIHgyID0geDg7Ci0gICAgICAgIHg4ID0geDQgLSB4NjsKLSAgICAgICAgeDQgKz0geDY7Ci0gICAgICAgIHg2ID0geDg7Ci0KLSAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOwotICAgICAgICB4MyA9IHg3OwotICAgICAgICB4NSA9ICgxODEgKiAoeDEgLSB4NykgKyAxMjgpID4+IDg7Ci0gICAgICAgIHg3ID0gKDE4MSAqICh4MSArIHg3KSArIDEyOCkgPj4gODsKLQotICAgICAgICB3b3JkID0gKCh4MCArIHgxKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0gICAgICAgIHRlbXAgPSAoKHg0ICsgeDcpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLQotCi0gICAgICAgIHRlbXAgPSAoKHg2ICsgeDUpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDIgKyB4MykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKLQotICAgICAgICB3b3JkID0gKCh4MiAtIHgzKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0KLSAgICAgICAgdGVtcCA9ICgoeDYgLSB4NSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotCi0gICAgICAgIHRlbXAgPSAoKHg0IC0geDcpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKLQotICAgICAgICBibGsgKz0gQl9TSVpFOwotICAgIH0KLSAgICByZXR1cm4gOwotfQotCi12b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCi17Ci0gICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKLSAgICBpbnQgaSA9IDg7Ci0gICAgaW50IG9mZnNldCA9IHdpZHRoOwotICAgIGludDMyIHdvcmQ7Ci0KLSAgICBjb21wIC09IG9mZnNldDsKLQotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICB4MiA9IGJsa1syXTsKLSAgICAgICAgYmxrWzJdID0gMDsKLSAgICAgICAgeDEgPSBibGtbMV07Ci0gICAgICAgIGJsa1sxXSA9IDA7Ci0gICAgICAgIHgzID0gYmxrWzNdOwotICAgICAgICBibGtbM10gPSAwOwotICAgICAgICB4MCA9ICgoaW50MzIpYmxrWzBdIDw8IDgpICsgODE5MjsKLSAgICAgICAgYmxrWzBdID0gMDsvKiBmb3IgcHJvcGVyIHJvdW5kaW5nIGluIHRoZSBmb3VydGggc3RhZ2UgKi8KLQotICAgICAgICB4NCA9IHgwOwotICAgICAgICB4NiA9IChXNiAqIHgyICsgNCkgPj4gMzsKLSAgICAgICAgeDIgPSAoVzIgKiB4MiArIDQpID4+IDM7Ci0gICAgICAgIHg4ID0geDAgLSB4MjsKLSAgICAgICAgeDAgKz0geDI7Ci0gICAgICAgIHgyID0geDg7Ci0gICAgICAgIHg4ID0geDQgLSB4NjsKLSAgICAgICAgeDQgKz0geDY7Ci0gICAgICAgIHg2ID0geDg7Ci0KLSAgICAgICAgeDcgPSAoVzcgKiB4MSArIDQpID4+IDM7Ci0gICAgICAgIHgxID0gKFcxICogeDEgKyA0KSA+PiAzOwotICAgICAgICB4NSA9IChXMyAqIHgzICsgNCkgPj4gMzsKLSAgICAgICAgeDMgPSAoLSBXNSAqIHgzICsgNCkgPj4gMzsKLSAgICAgICAgeDggPSB4MSAtIHg1OwotICAgICAgICB4MSArPSB4NTsKLSAgICAgICAgeDUgPSB4ODsKLSAgICAgICAgeDggPSB4NyAtIHgzOwotICAgICAgICB4MyArPSB4NzsKLSAgICAgICAgeDcgPSAoMTgxICogKHg1ICsgeDgpICsgMTI4KSA+PiA4OwotICAgICAgICB4NSA9ICgxODEgKiAoeDUgLSB4OCkgKyAxMjgpID4+IDg7Ci0KLSAgICAgICAgd29yZCA9ICgoeDAgKyB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh3b3JkKQotCi0gICAgICAgIHRlbXAgPSAoKHg0ICsgeDcpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCA4KTsKLQotCi0gICAgICAgIHRlbXAgPSAoKHg2ICsgeDUpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDIgKyB4MykgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICs9IG9mZnNldCkpID0gd29yZDsKLQotICAgICAgICB3b3JkID0gKCh4MiAtIHgzKSA+PiAxNCk7Ci0gICAgICAgIENMSVBfUkVTVUxUKHdvcmQpCi0KLSAgICAgICAgdGVtcCA9ICgoeDYgLSB4NSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDgpOwotCi0gICAgICAgIHRlbXAgPSAoKHg0IC0geDcpID4+IDE0KTsKLSAgICAgICAgQ0xJUF9SRVNVTFQodGVtcCkKLSAgICAgICAgd29yZCA9IHdvcmQgfCAodGVtcCA8PCAxNik7Ci0KLSAgICAgICAgdGVtcCA9ICgoeDAgLSB4MSkgPj4gMTQpOwotICAgICAgICBDTElQX1JFU1VMVCh0ZW1wKQotICAgICAgICB3b3JkID0gd29yZCB8ICh0ZW1wIDw8IDI0KTsKLSAgICAgICAgKigoaW50MzIqKShjb21wICsgNCkpID0gd29yZDsKLQotICAgICAgICBibGsgKz0gQl9TSVpFOwotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzcyM2QuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAibTR2X2gyNjMiCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHZpZGVvID0gcG9pbnRlciB0byBzdHJ1Y3R1cmUgb2YgdHlwZSBWaWRlb0RlY0RhdGEKLQotIExvY2FsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICByb3VuZHRhYjE2ID0gcm91bmRpbmcgdGFibGUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBOb25lCi0KLSBQb2ludGVycyBhbmQgQnVmZmVycyBNb2RpZmllZDoKLSAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gY29udGVudHMgYXJlIHRoZSBuZXdseSBjYWxjdWxhdGVkIGx1bWluYW5jZQotICAgICAgZGF0YQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY2hyb21pbmFuY2UKLSAgICAgIGIgZGF0YQotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiBjb250ZW50cyBhcmUgdGhlIG5ld2x5IGNhbGN1bGF0ZWQgY2hyb21pbmFuY2UKLSAgICAgIHIgZGF0YQotICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwaG9yZSBwcm9wYWdhdGlvbgotICAgICAgdmFsdWVzCi0KLSBMb2NhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEZVTkNUSU9OIERFU0NSSVBUSU9OCi0KLSBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGhpZ2ggbGV2ZWwgbW90aW9uIGNvbXBlbnNhdGlvbiBvbiB0aGUgbHVtaW5hbmNlIGFuZAotIGNocm9taW5hbmNlIGRhdGEuIEl0IHNldHMgdXAgYWxsIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBmdW5jdGlvbnMKLSB0aGF0IHBlcmZvcm0gbHVtaW5hbmNlIGFuZCBjaHJvbWluYW5jZSBwcmVkaWN0aW9uIGFuZCBpdCBpbml0aWFsaXplcyB0aGUKLSBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlcyBvZiBhIGdpdmVuIGJsb2NrLiBJdCBhbHNvIGNoZWNrcwotIHRoZSBtb3Rpb24gY29tcGVuc2F0aW9uIG1vZGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGx1bWluYW5jZSBvcgotIGNocm9taW5hbmNlIHByZWRpY3Rpb24gZnVuY3Rpb25zIHRvIGNhbGwgYW5kIGRldGVybWluZXMgaG93IHRoZSBwb3N0Ci0gcHJvY2Vzc2luZyBzZW1hcGhvcmVzIGFyZSB1cGRhdGVkLgotCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgIm1vdGlvbl9jb21wLmgiCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAwOS8yOS8yMDAwIGJyaW5nIHRoaXMgZnJvbSBtcDRkZWYuaCAqLwotLy8gY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjRbXSA9IHswLDEsMSwxfTsKLS8vIGNvbnN0IHN0YXRpYyBpbnQgcm91bmR0YWI4W10gPSB7MCwwLDEsMSwxLDEsMSwyfTsKLS8qKiogMTAvMzAgZm9yIFRQUyAqLwotLy8gY29uc3Qgc3RhdGljIGludCByb3VuZHRhYjEyW10gPSB7MCwwLDAsMSwxLDEsMSwxLDEsMSwyLDJ9OwotLyogMTAvMzAgZm9yIFRQUyAqKiovCi1jb25zdCBzdGF0aWMgaW50IHJvdW5kdGFiMTZbXSA9IHswLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyfTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiogbW9kaWZpZWQgMyBBdWd1c3QgMjAwNSB0byBkbyBwcmVkaWN0aW9uIGFuZCBwdXQgdGhlIHJlc3VsdHMgaW4KLXZpZGVvLT5tYmxvY2stPnByZWRfYmxvY2ssIG5vIGFkZGluZyB3aXRoIHJlc2lkdWUgKi8KLQotdm9pZCAgTUJNb3Rpb25Db21wKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCi0gICAgaW50IENCUAotKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIFByZXZpb3VzIFZpZGVvIE9iamVjdCBQbGFuZSAqLwotICAgIFZvcCAqcHJldiA9IHZpZGVvLT5wcmV2Vm9wOwotCi0gICAgLyogQ3VycmVudCBNYWNyb2Jsb2NrIChNQikgaW4gdGhlIFZPUCAqLwotICAgIGludCBtYm51bSA9IHZpZGVvLT5tYm51bTsKLQotICAgIC8qIE51bWJlciBvZiBNQiBwZXIgZGF0YSByb3cgKi8KLSAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OwotICAgIGludCB5cG9zLCB4cG9zOwotICAgIFBJWEVMICpjX2NvbXAsICpjX3ByZXY7Ci0gICAgUElYRUwgKmN1X2NvbXAsICpjdV9wcmV2OwotICAgIFBJWEVMICpjdl9jb21wLCAqY3ZfcHJldjsKLSAgICBpbnQgaGVpZ2h0LCB3aWR0aCwgcHJlZF93aWR0aDsKLSAgICBpbnQgaW12LCBtdndpZHRoOwotICAgIGludDMyIG9mZnNldDsKLSAgICB1aW50OCBtb2RlOwotICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAqcHJlZDsKLQotICAgIC8qIE1vdGlvbiB2ZWN0b3IgKGR4LGR5KSBpbiBoYWxmLXBlbCByZXNvbHV0aW9uICovCi0gICAgaW50IGR4LCBkeTsKLQotICAgIE1PVCBweFs0XSwgcHlbNF07Ci0gICAgaW50IHhwcmVkLCB5cHJlZDsKLSAgICBpbnQgeHN1bTsKLSAgICBpbnQgcm91bmQxOwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMSAgICAgIAotICAgIC8qIFRvdGFsIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIFZPTCAqLwotICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT5uVG90YWxNQiA8PCA4OwotICAgIHVpbnQ4ICpwcF9kZWNfeSwgKnBwX2RlY191OwotICAgIGludCBsbFs0XTsKLSAgICBpbnQgdG1wID0gMDsKLSAgICB1aW50OCBtc2tfZGVibG9jayA9IDA7Ci0jZW5kaWYKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIFNldCByb3VuZGluZyB0eXBlICovCi0gICAgLyogY2hhbmdlIGZyb20gYXJyYXkgdG8gc2luZ2xlIDA5LzI5LzIwMDAgKi8KLSAgICByb3VuZDEgPSAoaW50KSgxIC0gdmlkZW8tPmN1cnJWb3AtPnJvdW5kaW5nVHlwZSk7Ci0KLSAgICAvKiB3aWR0aCBvZiBsdW1pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHkgYXhpcykgKi8KLSAgICB3aWR0aCA9IHZpZGVvLT53aWR0aDsKLQotICAgIC8qIGhlaWd0aCBvZiBsdW1pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHggYXhpcykgKi8KLSAgICBoZWlnaHQgPSB2aWRlby0+aGVpZ2h0OwotCi0gICAgLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93ICovCi0gICAgbXZ3aWR0aCA9IE1CX2luX3dpZHRoIDw8IDE7Ci0KLSAgICAvKiBzdGFydGluZyB5IHBvc2l0aW9uIGluIGN1cnJlbnQgTUI7IG9yaWdpbiBvZiBNQiAqLwotICAgIHlwb3MgPSB2aWRlby0+bWJudW1fcm93IDw8IDQgOwotICAgIC8qIHN0YXJ0aW5nIHggcG9zaXRpb24gaW4gY3VycmVudCBNQjsgb3JpZ2luIG9mIE1CICovCi0gICAgeHBvcyA9IHZpZGVvLT5tYm51bV9jb2wgPDwgNCA7Ci0KLSAgICAvKiBvZmZzZXQgdG8gKHgseSkgcG9zaXRpb24gaW4gY3VycmVudCBsdW1pbmFuY2UgTUIgKi8KLSAgICAvKiBpbiBwaXhlbCByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB5cG9zKndpZHRoIC0+IHJvdywgK3ggLT4gY29sdW1uICovCi0gICAgb2Zmc2V0ID0gKGludDMyKXlwb3MgKiB3aWR0aCArIHhwb3M7Ci0KLSAgICAvKiBnZXQgbW9kZSBmb3IgY3VycmVudCBNQiAqLwotICAgIG1vZGUgPSB2aWRlby0+aGVhZGVySW5mby5Nb2RlW21ibnVtXTsKLQotICAgIC8qIGJsb2NrIGluZGV4ICovCi0gICAgLyogaW12ID0gKHhwb3MvOCkgKyAoKHlwb3MvOCkgKiBtdndpZHRoKSAqLwotICAgIGltdiA9IChvZmZzZXQgPj4gNikgLSAoeHBvcyA+PiA2KSArICh4cG9zID4+IDMpOwotICAgIGlmIChtb2RlICYgSU5URVJfMVZNQVNLKQotICAgIHsKLSAgICAgICAgZHggPSBweFswXSA9IHB4WzFdID0gcHhbMl0gPSBweFszXSA9IHZpZGVvLT5tb3RYW2ltdl07Ci0gICAgICAgIGR5ID0gcHlbMF0gPSBweVsxXSA9IHB5WzJdID0gcHlbM10gPSB2aWRlby0+bW90WVtpbXZdOwotICAgICAgICBpZiAoKGR4ICYgMykgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZHggPSBkeCA+PiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogeCBjb21wb25lbnQgb2YgTVYgaXMgb3InZWQgZm9yIHJvdW5kaW5nICg/KSAqLwotICAgICAgICAgICAgZHggPSAoZHggPj4gMSkgfCAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogeSBjb21wb25lbnQgb2YgbW90aW9uIHZlY3RvcjsgZGl2aWRlIGJ5IDIgZm9yIHRvICovCi0gICAgICAgIC8qIGNvbnZlcnQgdG8gZnVsbC1wZWwgcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoKGR5ICYgMykgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZHkgPSBkeSA+PiAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogeSBjb21wb25lbnQgb2YgTVYgaXMgb3InZWQgZm9yIHJvdW5kaW5nICg/KSAqLwotICAgICAgICAgICAgZHkgPSAoZHkgPj4gMSkgfCAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHB4WzBdID0gdmlkZW8tPm1vdFhbaW12XTsKLSAgICAgICAgcHhbMV0gPSB2aWRlby0+bW90WFtpbXYrMV07Ci0gICAgICAgIHB4WzJdID0gdmlkZW8tPm1vdFhbaW12K212d2lkdGhdOwotICAgICAgICBweFszXSA9IHZpZGVvLT5tb3RYW2ltdittdndpZHRoKzFdOwotICAgICAgICB4c3VtID0gcHhbMF0gKyBweFsxXSArIHB4WzJdICsgcHhbM107Ci0gICAgICAgIGR4ID0gUFZfU0lHTih4c3VtKSAqIChyb3VuZHRhYjE2WyhQVl9BQlMoeHN1bSkpICYgMHhGXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChQVl9BQlMoeHN1bSkpID4+IDQpIDw8IDEpKTsKLSAgICAgICAgcHlbMF0gPSB2aWRlby0+bW90WVtpbXZdOwotICAgICAgICBweVsxXSA9IHZpZGVvLT5tb3RZW2ltdisxXTsKLSAgICAgICAgcHlbMl0gPSB2aWRlby0+bW90WVtpbXYrbXZ3aWR0aF07Ci0gICAgICAgIHB5WzNdID0gdmlkZW8tPm1vdFlbaW12K212d2lkdGgrMV07Ci0gICAgICAgIHhzdW0gPSBweVswXSArIHB5WzFdICsgcHlbMl0gKyBweVszXTsKLSAgICAgICAgZHkgPSBQVl9TSUdOKHhzdW0pICogKHJvdW5kdGFiMTZbKFBWX0FCUyh4c3VtKSkgJiAweEZdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKFBWX0FCUyh4c3VtKSkgPj4gNCkgPDwgMSkpOwotICAgIH0KLQotICAgIC8qIFBvaW50ZXIgdG8gcHJldmlvdXMgbHVtaW5hbmNlIGZyYW1lICovCi0gICAgY19wcmV2ICA9IHByZXYtPnlDaGFuOwotICAgIGlmICghY19wcmV2KSB7Ci0gICAgICAgIEFMT0dFKCJiLzM1MjY5NjM1Iik7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzUyNjk2MzUiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByZWRfYmxvY2sgPSB2aWRlby0+bWJsb2NrLT5wcmVkX2Jsb2NrOwotCi0gICAgLyogc29tZSBibG9ja3MgaGF2ZSBubyByZXNpZHVlIG9yIElOVEVSNFYgKi8KLSAgICAvKmlmIChtb2RlID09IE1PREVfSU5URVI0VikgICAwNS8wOC8xNSAqLwotICAgIC8qIE1vdGlvbiBDb21wZW5zYXRpb24gZm9yIGFuIDh4OCBibG9jayB3aXRoaW4gYSBNQiAqLwotICAgIC8qICg0IE1WIHBlciBNQikgKi8KLQotCi0KLSAgICAvKiBDYWxsIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgbHVtaW5hbmNlIHByZWRpY3Rpb24gKi8KLSAgICAvKiAgICAgIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXI0dih4cG9zLCB5cG9zLCBweCwgcHksIGNfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1ibG9jay0+cHJlZF9ibG9jaywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgcm91bmQxLCBtdndpZHRoLCAmeHN1bSwgJnlzdW0pOyovCi0gICAgY19jb21wID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgb2Zmc2V0OwotCi0KLSAgICB4cHJlZCA9IChpbnQpKCh4cG9zIDw8IDEpICsgcHhbMF0pOwotICAgIHlwcmVkID0gKGludCkoKHlwb3MgPDwgMSkgKyBweVswXSk7Ci0KLSAgICBpZiAoKENCUCA+PiA1KSYxKQotICAgIHsKLSAgICAgICAgcHJlZCA9IHByZWRfYmxvY2s7Ci0gICAgICAgIHByZWRfd2lkdGggPSAxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJlZCA9IGNfY29tcDsKLSAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgotICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICA7Ci0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKLSAgICB9Ci0KLQotICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiB2YWx1ZXMgb3ZlciBjdXJyZW50IGx1bWluYW5jZSBNQiAqLwotICAgIC8qIChibG9ja3MgMSk7IGFkZCBtb3Rpb24gdmVjdG9yIHByaW9yIHRvIGlucHV0OyAgICAgICAqLwotICAgIC8qIGFkZCA4IHRvIHhfcG9zIHRvIGFkdmFuY2UgdG8gbmV4dCBibG9jayAgICAgICAgICovCi0gICAgeHByZWQgPSAoaW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHhbMV0pOwotICAgIHlwcmVkID0gKGludCkoKHlwb3MgPDwgMSkgKyBweVsxXSk7Ci0KLSAgICBpZiAoKENCUCA+PiA0KSYxKQotICAgIHsKLSAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyA4OwotICAgICAgICBwcmVkX3dpZHRoID0gMTY7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHByZWQgPSBjX2NvbXAgKyA4OwotICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgaWYgKHhwcmVkID49IDAgJiYgeHByZWQgPD0gKCh3aWR0aCA8PCAxKSAtICgyKkJfU0laRSkpICYmCi0gICAgICAgICAgICB5cHJlZCA+PSAwICYmIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqQl9TSVpFKSkpCi0gICAgeyAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIEdldFByZWRBZHZCVGFibGVbeXByZWQmMV1beHByZWQmMV0oY19wcmV2ICsgKHhwcmVkID4+IDEpICsgKCh5cHJlZCA+PiAxKSp3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIChwcmVkX3dpZHRoIDw8IDEpIHwgcm91bmQxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAoeCx5KSBpcyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsIGNfcHJldiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJlZCwgd2lkdGgsIGhlaWdodCwgcm91bmQxLCBwcmVkX3dpZHRoKTsKLSAgICB9Ci0KLQotCi0gICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIHZhbHVlcyBvdmVyIGN1cnJlbnQgbHVtaW5hbmNlIE1CICovCi0gICAgLyogKGJsb2NrcyAyKTsgYWRkIG1vdGlvbiB2ZWN0b3IgcHJpb3IgdG8gaW5wdXQgICAgICAgICovCi0gICAgLyogYWRkIDggdG8geV9wb3MgdG8gYWR2YW5jZSB0byBibG9jayBvbiBuZXh0IHJvdyAgICAgICovCi0gICAgeHByZWQgPSAoaW50KSgoeHBvcyA8PCAxKSArIHB4WzJdKTsKLSAgICB5cHJlZCA9IChpbnQpKCgoeXBvcyArIEJfU0laRSkgPDwgMSkgKyBweVsyXSk7Ci0KLSAgICBpZiAoKENCUCA+PiAzKSYxKQotICAgIHsKLSAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAxMjg7Ci0gICAgICAgIHByZWRfd2lkdGggPSAxNjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJlZCA9IGNfY29tcCArICh3aWR0aCA8PCAzKTsKLSAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgotICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCBjX3ByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7Ci0gICAgfQotCi0KLQotICAgIC8qIENvbXB1dGUgcHJlZGljdGlvbiB2YWx1ZXMgb3ZlciBjdXJyZW50IGx1bWluYW5jZSBNQiAqLwotICAgIC8qIChibG9ja3MgMyk7IGFkZCBtb3Rpb24gdmVjdG9yIHByaW9yIHRvIGlucHV0OyAgICAgICAqLwotICAgIC8qIGFkZCA4IHRvIHhfcG9zIGFuZCB5X3BvcyB0byBhZHZhbmNlIHRvIG5leHQgYmxvY2sgICAqLwotICAgIC8qIG9uIG5leHQgcm93ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgeHByZWQgPSAoaW50KSgoKHhwb3MgKyBCX1NJWkUpIDw8IDEpICsgcHhbM10pOwotICAgIHlwcmVkID0gKGludCkoKCh5cG9zICsgQl9TSVpFKSA8PCAxKSArIHB5WzNdKTsKLQotICAgIGlmICgoQ0JQID4+IDIpJjEpCi0gICAgewotICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDEzNjsKLSAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwcmVkID0gY19jb21wICsgKHdpZHRoIDw8IDMpICsgODsKLSAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1WIHBvaW50cyBvdXRzaWRlIHRoZSBmcmFtZSAqLwotICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipCX1NJWkUpKSAmJgotICAgICAgICAgICAgeXByZWQgPj0gMCAmJiB5cHJlZCA8PSAoKGhlaWdodCA8PCAxKSAtICgyKkJfU0laRSkpKQotICAgIHsgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIGluc2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGNfcHJldiArICh4cHJlZCA+PiAxKSArICgoeXByZWQgPj4gMSkqd2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCAocHJlZF93aWR0aCA8PCAxKSB8IHJvdW5kMSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCBjX3ByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7Ci0gICAgfQotICAgIC8qIENhbGwgZnVuY3Rpb24gdG8gc2V0IGRlLWJsb2NraW5nIGFuZCBkZS1yaW5naW5nICovCi0gICAgLyogICBzZW1hcGhvcmVzIGZvciBsdW1pbmFuY2UgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICBpZiAobW9kZSZJTlRFUl8xVk1BU0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgICAgIGxsWzBdID0gMTsKLSAgICAgICAgICAgIGxsWzFdID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICBsbFsyXSA9IDE7Ci0gICAgICAgICAgICBsbFszXSA9IC1tdndpZHRoIC0gMTsKLSAgICAgICAgICAgIG1za19kZWJsb2NrID0gcHBfc2VtYXBob3JlX2x1bWEoeHByZWQsIHlwcmVkLCBwcF9kZWNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgbGwsICZ0bXAsIHB4WzBdLCBweVswXSwgbXZ3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0KLSAgICAgICAgICAgIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoeHByZWQsIHlwcmVkLCBwcF9kZWNfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgZHgsIGR5LCBtdndpZHRoLCBoZWlnaHQsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgbXNrX2RlYmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nIG1vZGUgKE1CTV9JTlRFUjgpICovCi0gICAgICAgICAgICAvKiBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcpICovCi0gICAgICAgICAgICBwcF9kZWNfeSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyBpbXY7Ci0gICAgICAgICAgICAqcHBfZGVjX3kgPSA0OwotICAgICAgICAgICAgKihwcF9kZWNfeSArIDEpID0gNDsKLSAgICAgICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9IDQ7Ci0gICAgICAgICAgICAqKHBwX2RlY195ICsgbXZ3aWR0aCArIDEpID0gNDsKLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0gICAgICAgICAgICAqcHBfZGVjX3UgPSA0OwotICAgICAgICAgICAgcHBfZGVjX3Vbc2l6ZT4+OF0gPSA0OwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLQotICAgIC8qIHhwcmVkIGFuZCB5cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgKi8KLSAgICAvKiBpbiBmdWxsLXBlbCByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBDaHJvbWluYW5jZSAqLwotICAgIC8qIHdpZHRoIG9mIGNocm9taW5hbmNlIGRhdGEgaW4gcGl4ZWxzICh5IGF4aXMpICovCi0gICAgd2lkdGggPj49IDE7Ci0KLSAgICAvKiBoZWlndGggb2YgY2hyb21pbmFuY2UgZGF0YSBpbiBwaXhlbHMgKHggYXhpcykgKi8KLSAgICBoZWlnaHQgPj49IDE7Ci0KLSAgICAvKiBQb2ludGVyIHRvIHByZXZpb3VzIGNocm9taW5hbmNlIGIgZnJhbWUgKi8KLSAgICBjdV9wcmV2ID0gcHJldi0+dUNoYW47Ci0KLSAgICAvKiBQb2ludGVyIHRvIHByZXZpb3VzIGNocm9taW5hbmNlIHIgZnJhbWUgKi8KLSAgICBjdl9wcmV2ID0gcHJldi0+dkNoYW47Ci0KLSAgICAvKiB4IHBvc2l0aW9uIGluIHByZWRpY3Rpb24gZGF0YSBvZmZzZXQgYnkgbW90aW9uIHZlY3RvciAqLwotICAgIC8qIHhwcmVkIGNhbGN1bGF0aW9uIGZvciBDaHJvbWluYW5jZSBpcyBpbiBmdWxsLXBlbCAgICAgICovCi0gICAgLyogcmVzb2x1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB4cHJlZCA9IHhwb3MgKyBkeDsKLQotICAgIC8qIHkgcG9zaXRpb24gaW4gcHJlZGljdGlvbiBkYXRhIG9mZnNldCBieSBtb3Rpb24gdmVjdG9yICovCi0gICAgLyogeXByZWQgY2FsY3VsYXRpb24gZm9yIENocm9taW5hbmNlIGlzIGluIGZ1bGwtcGVsICAgICAgKi8KLSAgICAvKiByZXNvbHV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHlwcmVkID0geXBvcyArIGR5OwotCi0gICAgY3VfY29tcCA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKLSAgICBjdl9jb21wID0gdmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOwotCi0gICAgLyogQ2FsbCBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGNocm9taW5hbmNlIHByZWRpY3Rpb24gKi8KLSAgICAvKiAgICAgIGNocm9taW5hbmNlX3ByZWQoeHByZWQsIHlwcmVkLCBjdV9wcmV2LCBjdl9wcmV2LAotICAgICAgICAgICAgcHJlZF9ibG9jaywgd2lkdGhfdXYsIGhlaWdodF91diwKLSAgICAgICAgICAgIHJvdW5kMSk7Ki8KLSAgICBpZiAoeHByZWQgPj0gMCAmJiB4cHJlZCA8PSAoKHdpZHRoIDw8IDEpIC0gKDIqQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgotICAgICAgICAgICAgeXByZWQgPD0gKChoZWlnaHQgPDwgMSkgLSAoMipCX1NJWkUpKSkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGlmICgoQ0JQID4+IDEpJjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjU2OwotICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IGN1X2NvbXA7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIGIgKGJsb2NrWzRdKSAqLwotICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGN1X3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOwotCi0gICAgICAgIGlmIChDQlAmMSkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IHByZWRfYmxvY2sgKyAyNjQ7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkID0gY3ZfY29tcDsKLSAgICAgICAgICAgIHByZWRfd2lkdGggPSB3aWR0aDsKLSAgICAgICAgfQotICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIHIgKGJsb2NrWzVdKSAqLwotICAgICAgICBHZXRQcmVkQWR2QlRhYmxlW3lwcmVkJjFdW3hwcmVkJjFdKGN2X3ByZXYgKyAoeHByZWQgPj4gMSkgKyAoKHlwcmVkID4+IDEpKndpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgKHByZWRfd2lkdGggPDwgMSkgfCByb3VuZDEpOwotCi0gICAgICAgIHJldHVybiA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGlmICgoQ0JQID4+IDEpJjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWQgPSBwcmVkX2Jsb2NrICsgMjU2OwotICAgICAgICAgICAgcHJlZF93aWR0aCA9IDE2OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZCA9IGN1X2NvbXA7Ci0gICAgICAgICAgICBwcmVkX3dpZHRoID0gd2lkdGg7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDb21wdXRlIHByZWRpY3Rpb24gZm9yIENocm9taW5hbmNlIGIgKGJsb2NrWzRdKSAqLwotICAgICAgICBHZXRQcmVkT3V0c2lkZSh4cHJlZCwgeXByZWQsICAgIGN1X3ByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgIHByZWQsIHdpZHRoLCBoZWlnaHQsIHJvdW5kMSwgcHJlZF93aWR0aCk7Ci0KLSAgICAgICAgaWYgKENCUCYxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmVkID0gcHJlZF9ibG9jayArIDI2NDsKLSAgICAgICAgICAgIHByZWRfd2lkdGggPSAxNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWQgPSBjdl9jb21wOwotICAgICAgICAgICAgcHJlZF93aWR0aCA9IHdpZHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBwcmVkaWN0aW9uIGZvciBDaHJvbWluYW5jZSByIChibG9ja1s1XSkgKi8KLSAgICAgICAgR2V0UHJlZE91dHNpZGUoeHByZWQsIHlwcmVkLCAgICBjdl9wcmV2LAotICAgICAgICAgICAgICAgICAgICAgICBwcmVkLCB3aWR0aCwgaGVpZ2h0LCByb3VuZDEsIHByZWRfd2lkdGgpOwotCi0gICAgICAgIHJldHVybiA7Ci0gICAgfQotCi19Ci0KLS8qKiogc3BlY2lhbCBmdW5jdGlvbiBmb3Igc2tpcHBlZCBtYWNyb2Jsb2NrLCAgQXVnIDE1LCAyMDA1ICovCi12b2lkICBTa2lwcGVkTUJNb3Rpb25Db21wKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8KLSkKLXsKLSAgICBWb3AgKnByZXYgPSB2aWRlby0+cHJldlZvcDsKLSAgICBWb3AgKmNvbXA7Ci0gICAgaW50IHlwb3MsIHhwb3M7Ci0gICAgUElYRUwgKmNfY29tcCwgKmNfcHJldjsKLSAgICBQSVhFTCAqY3VfY29tcCwgKmN1X3ByZXY7Ci0gICAgUElYRUwgKmN2X2NvbXAsICpjdl9wcmV2OwotICAgIGludCB3aWR0aCwgd2lkdGhfdXY7Ci0gICAgaW50MzIgb2Zmc2V0OwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMSAgICAgIAotICAgIGludCBpbXY7Ci0gICAgaW50MzIgc2l6ZSA9IChpbnQzMikgdmlkZW8tPm5Ub3RhbE1CIDw8IDg7Ci0gICAgdWludDggKnBwX2RlY195LCAqcHBfZGVjX3U7Ci0gICAgdWludDggKnBwX3ByZXYxOwotICAgIGludCBtdndpZHRoID0gdmlkZW8tPm5NQlBlclJvdyA8PCAxOwotI2VuZGlmCi0KLSAgICB3aWR0aCA9IHZpZGVvLT53aWR0aDsKLSAgICB3aWR0aF91diAgPSB3aWR0aCA+PiAxOwotICAgIHlwb3MgPSB2aWRlby0+bWJudW1fcm93IDw8IDQgOwotICAgIHhwb3MgPSB2aWRlby0+bWJudW1fY29sIDw8IDQgOwotICAgIG9mZnNldCA9IChpbnQzMil5cG9zICogd2lkdGggKyB4cG9zOwotCi0KLSAgICAvKiB6ZXJvIG1vdGlvbiBjb21wZW5zYXRpb24gZm9yIHByZXZpb3VzIGZyYW1lICovCi0gICAgLyptYnkqd2lkdGggKyBtYng7Ki8KLSAgICBjX3ByZXYgID0gcHJldi0+eUNoYW47Ci0gICAgaWYgKCFjX3ByZXYpIHsKLSAgICAgICAgQUxPR0UoImIvMzUyNjk2MzUiKTsKLSAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNTI2OTYzNSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNfcHJldiArPSBvZmZzZXQ7Ci0KLSAgICAvKmJ5KndpZHRoX3V2ICsgYng7Ki8KLSAgICBjdV9wcmV2ID0gcHJldi0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7Ci0gICAgLypieSp3aWR0aF91diArIGJ4OyovCi0gICAgY3ZfcHJldiA9IHByZXYtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4cG9zID4+IDIpOwotCi0gICAgY29tcCA9IHZpZGVvLT5jdXJyVm9wOwotCi0gICAgY19jb21wICA9IGNvbXAtPnlDaGFuICsgb2Zmc2V0OwotICAgIGN1X2NvbXAgPSBjb21wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeHBvcyA+PiAyKTsKLSAgICBjdl9jb21wID0gY29tcC0+dkNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhwb3MgPj4gMik7Ci0KLQotICAgIC8qIENvcHkgcHJldmlvdXMgcmVjb25zdHJ1Y3RlZCBmcmFtZSBpbnRvIHRoZSBjdXJyZW50IGZyYW1lICovCi0gICAgUHV0U0tJUFBFRF9NQihjX2NvbXAsICBjX3ByZXYsIHdpZHRoKTsKLSAgICBQdXRTS0lQUEVEX0IoY3VfY29tcCwgY3VfcHJldiwgd2lkdGhfdXYpOwotICAgIFB1dFNLSVBQRURfQihjdl9jb21wLCBjdl9wcmV2LCB3aWR0aF91dik7Ci0KLSAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlIGdlbmVyYXRpb24gKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTiAvLyAyLzE0LzIwMDEKLSAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICB7Ci0gICAgICAgIGltdiA9IChvZmZzZXQgPj4gNikgLSAoeHBvcyA+PiA2KSArICh4cG9zID4+IDMpOwotICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcgbW9kZSAoY29weSBwcmV2aW91cyBNQikgKi8KLSAgICAgICAgcHBfcHJldjEgPSB2aWRlby0+cHN0cHJjVHlwUHJ2ICsgaW12OwotICAgICAgICBwcF9kZWNfeSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyBpbXY7Ci0gICAgICAgICpwcF9kZWNfeSA9ICpwcF9wcmV2MTsKLSAgICAgICAgKihwcF9kZWNfeSArIDEpID0gKihwcF9wcmV2MSArIDEpOwotICAgICAgICAqKHBwX2RlY195ICsgbXZ3aWR0aCkgPSAqKHBwX3ByZXYxICsgbXZ3aWR0aCk7Ci0gICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoICsgMSkgPSAqKHBwX3ByZXYxICsgbXZ3aWR0aCArIDEpOwotCi0gICAgICAgIC8qIGNocm9taW5hbmNlICovCi0gICAgICAgIC8qNCpNQl9pbl93aWR0aCpNQl9pbl9oZWlnaHQqLwotICAgICAgICBwcF9wcmV2MSA9IHZpZGVvLT5wc3RwcmNUeXBQcnYgKyAoc2l6ZSA+PiA2KSArCi0gICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0gICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgKnBwX2RlY191ID0gKnBwX3ByZXYxOwotICAgICAgICBwcF9kZWNfdVtzaXplPj44XSA9IHBwX3ByZXYxW3NpemU+PjhdOwotICAgIH0KLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIHJldHVybjsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkNGVkYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZm5kZWYgX01QNERFQ0xJQl9IXwotI2RlZmluZSBfTVA0REVDTElCX0hfCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAibXA0ZGVmLmgiIC8qIHR5cGVkZWYgKi8KLSNpbmNsdWRlICJtcDRsaWJfaW50LmgiIC8qIG1haW4gdmlkZW8gc3RydWN0dXJlICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBWQVJJQUJMRVMgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBTSU1QTEUgVFlQRURFRidTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVOVU1FUkFURUQgVFlQRURFRidTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IFNUUlVDVFVSRVMgVFlQRURFRidTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEdMT0JBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi17Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotICAgIC8qIGRlZmluZWQgaW4gcHZkZWNfYXBpLmMsIHRoZXNlIGZ1bmN0aW9uIGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUgICAgKi8KLSAgICAvKiBleHBvc2VkIHRvIHByb2dyYW1tZXJzIG91dHNpZGUgUGFja2V0VmlkZW8uICAwOC8xNS8yMDAwLiAgICAqLwotICAgIHVpbnQgVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLQotI2lmZGVmIEVOQUJMRV9MT0cKLSAgICB2b2lkIG00dmRlY19kcHJpbnRmKGNoYXIgKmZvcm1hdCwgLi4uKTsKLSNkZWZpbmUgbXA0ZGVjX2xvZyhtZXNzYWdlKSBtNHZkZWNfZHByaW50ZihtZXNzYWdlKQotI2Vsc2UKLSNkZWZpbmUgbXA0ZGVjX2xvZyhtZXNzYWdlKQotI2VuZGlmCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGZyYW1lX2J1ZmZlci5jICovCi0gICAgUFZfU1RBVFVTIEZpbGxGcmFtZUJ1ZmZlck5ldyhCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtKTsKLSAgICBQVl9TVEFUVVMgRmlsbEZyYW1lQnVmZmVyKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIGludCBzaG9ydF9oZWFkZXIpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBkY19hY19wcmVkLmMgKi8KLSAgICBpbnQgY2FsX2RjX3NjYWxlcihpbnQgUVAsIGludCB0eXBlKTsKLSAgICBQVl9TVEFUVVMgUFZfRGVjb2RlUHJlZGljdGVkSW50cmFEQyhpbnQgY29tcG51bSwgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqSW50cmFEQ19kZWx0YSk7Ci0KLSAgICB2b2lkICAgIGRvRENBQ1ByZWRpY3Rpb24oVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsIGludDE2ICpxX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpcmVjdGlvbik7Ci0KLSNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKLSAgICB2b2lkICAgIGRvRENBQ1ByZWRpY3Rpb25fSShWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwgaW50MTYgKnFfYmxvY2spOwotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBibG9ja19pZGN0LmMgKi8KLSAgICB2b2lkIE1CbG9ja0lEQ1RBZGQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IG56X2NvZWZzW10pOwotCi0gICAgdm9pZCBCbG9ja0lEQ1QodWludDggKmRzdCwgdWludDggKnByZWQsIGludDE2ICpibGssIGludCB3aWR0aCwgaW50IG56Y29lZnMsCi0gICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggYml0bWFwcm93KTsKLQotICAgIHZvaWQgTUJsb2NrSURDVChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLSAgICB2b2lkIEJsb2NrSURDVF9pbnRyYShNYWNyb0Jsb2NrICptYmxvY2ssIFBJWEVMICpjX2NvbXAsIGludCBjb21wLCBpbnQgd2lkdGhfb2Zmc2V0KTsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGNvbWJpbmVkX2RlY29kZS5jICovCi0gICAgUFZfU1RBVFVTIERlY29kZUZyYW1lQ29tYmluZWRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApOwotICAgIFBWX1NUQVRVUyBHZXRNQkRhdGEoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGRhdGFwYXJ0X2RlY29kZS5jICovCi0gICAgUFZfU1RBVFVTIERlY29kZUZyYW1lRGF0YVBhcnRNb2RlKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X0RRVUFOVF9EQyhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQxNiAqUVApOwotICAgIFBWX1NUQVRVUyBHZXRNQmhlYWRlckRhdGFQYXJ0X1AoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0gICAgUFZfU1RBVFVTIERlY29kZURhdGFQYXJ0X0lfVmlkZW9QYWNrZXQoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IHNsaWNlX2NvdW50ZXIpOwotICAgIFBWX1NUQVRVUyBEZWNvZGVEYXRhUGFydF9QX1ZpZGVvUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBzbGljZV9jb3VudGVyKTsKLSAgICBQVl9TVEFUVVMgR2V0TUJEYXRhX0RhdGFQYXJ0KFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBwYWNrZXRfdXRpbC5jICovCi0gICAgUFZfU1RBVFVTIFBWX1JlYWRWaWRlb1BhY2tldEhlYWRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgKm5leHRfTUIpOwotICAgIFBWX1NUQVRVUyBSZWNvdmVyUGFja2V0RXJyb3IoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgaW50IG1hcmtlcl9sZW5ndGgsIGludDMyICpuZXh0Vm9wKTsKLSAgICBQVl9TVEFUVVMgUmVjb3ZlckdPQkVycm9yKEJpdHN0cmVhbURlY1ZpZGVvICpzdHJlYW0sIGludCBtYXJrZXJfbGVuZ3RoLCBpbnQzMiAqdm9wUG9zKTsKLSAgICBQVl9TVEFUVVMgUFZfR29iSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8pOwotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgIFBWX1NUQVRVUyBQVl9IMjYzU2xpY2VIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlb0ludCwgaW50ICpuZXh0X01CKTsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gbW90aW9uX2NvbXAuYyAqLwotICAgIHZvaWQgTUJNb3Rpb25Db21wKFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBDQlApOwotICAgIHZvaWQgIFNraXBwZWRNQk1vdGlvbkNvbXAoVmlkZW9EZWNEYXRhICp2aWRlbyk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGNocm9taW5hbmNlX3ByZWQuYyAqLwotICAgIHZvaWQgY2hyb21pbmFuY2VfcHJlZCgKLSAgICAgICAgaW50IHhwcmVkLCAgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqY3VfcHJldiwgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKmN2X3ByZXYsICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGhfdXYsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodF91diwgICAgICAvKiBpICovCi0gICAgICAgIGludCByb3VuZDEKLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyLmMgKi8KLSAgICB2b2lkIGx1bWluYW5jZV9wcmVkX21vZGVfaW50ZXIoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCByb3VuZDEKLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBsdW1pbmFuY2VfcHJlZF9tb2RlX2ludGVyNHYuYyAqLwotICAgIHZvaWQgbHVtaW5hbmNlX3ByZWRfbW9kZV9pbnRlcjR2KAotICAgICAgICBpbnQgeHBvcywgICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwb3MsICAgICAgICAgICAvKiBpICovCi0gICAgICAgIE1PVCAqcHgsICAgICAgICAgICAgLyogaSAqLwotICAgICAgICBNT1QgKnB5LCAgICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCByb3VuZDEsICAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqeHN1bV9wdHIsICAgICAgICAgIC8qIGkvbyAqLwotICAgICAgICBpbnQgKnlzdW1fcHRyICAgICAgICAgICAvKiBpL28gKi8KLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyLmMgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIHZvaWQgcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlcigKLSAgICAgICAgaW50IHhwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICAqcHBfZGVjX3UsICAvKiBpL28gKi8KLSAgICAgICAgdWludDggICAqcHN0cHJjVHlwUHJ2LCAgLyogaSAqLwotICAgICAgICBpbnQgZHgsICAgICAvKiBpICovCi0gICAgICAgIGludCBkeSwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12d2lkdGgsICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50MzIgICBzaXplLCAgICAgICAvKiBpICovCi0gICAgICAgIGludCBtdl9sb2MsICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgbXNrX2RlYmxvY2sgLyogaSAqLwotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIHBwX3NlbWFwaG9yZV9sdW1hLmMgKi8KLSAgICB1aW50OCBwcF9zZW1hcGhvcmVfbHVtYSgKLSAgICAgICAgaW50IHhwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHlwcmVkLCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICAqcHBfZGVjX3ksICAvKiBpL28gKi8KLSAgICAgICAgdWludDggICAqcHN0cHJjVHlwUHJ2LCAgLyogaSAqLwotICAgICAgICBpbnQgKmxsLCAgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgKm12X2xvYywgICAgLyogaS9vICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0ICAgICAgLyogaSAqLwotICAgICk7Ci0jZW5kaWYKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX2Fkdl9tYl9hZGQuYyAqLwotICAgIGludCBHZXRQcmVkQWR2YW5jZWRNQigKLSAgICAgICAgaW50IHhwb3MsCi0gICAgICAgIGludCB5cG9zLAotICAgICAgICB1aW50OCAqY19wcmV2LAotICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywKLSAgICAgICAgaW50IHdpZHRoLAotICAgICAgICBpbnQgcm5kMQotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX2Fkdl9iX2FkZC5jICovCi0gICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MHgwKAotICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLwotICAgICk7Ci0KLSAgICBpbnQgR2V0UHJlZEFkdmFuY2VkQnkweDEoCi0gICAgICAgIHVpbnQ4ICpjX3ByZXYsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywgICAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBwcmVkX3dpZHRoX3JuZCAvKiBpICovCi0gICAgKTsKLQotICAgIGludCBHZXRQcmVkQWR2YW5jZWRCeTF4MCgKLSAgICAgICAgdWludDggKmNfcHJldiwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICpwcmVkX2Jsb2NrLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHByZWRfd2lkdGhfcm5kIC8qIGkgKi8KLSAgICApOwotCi0gICAgaW50IEdldFByZWRBZHZhbmNlZEJ5MXgxKAotICAgICAgICB1aW50OCAqY19wcmV2LCAgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggKnByZWRfYmxvY2ssICAgICAgLyogaSAqLwotICAgICAgICBpbnQgd2lkdGgsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgcHJlZF93aWR0aF9ybmQgLyogaSAqLwotICAgICk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIGdldF9wcmVkX291dHNpZGUuYyAqLwotICAgIGludCBHZXRQcmVkT3V0c2lkZSgKLSAgICAgICAgaW50IHhwb3MsCi0gICAgICAgIGludCB5cG9zLAotICAgICAgICB1aW50OCAqY19wcmV2LAotICAgICAgICB1aW50OCAqcHJlZF9ibG9jaywKLSAgICAgICAgaW50IHdpZHRoLAotICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICBpbnQgcm5kMSwKLSAgICAgICAgaW50IHByZWRfd2lkdGgKLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBmaW5kX3BtdnNFcnJSZXMuYyAqLwotICAgIHZvaWQgbXZfcHJlZGljdGlvbihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgYmxvY2ssIE1PVCAqbXZ4LCBNT1QgKm12eSk7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIGRlZmluZWQgaW4gbWJfdXRpbHMuYyAqLwotICAgIHZvaWQgQ29weV9NQl9pbnRvX1ZvcCh1aW50OCAqY29tcCwgaW50IHlDaGFuW11bTkNPRUZGX0JMT0NLXSwgaW50IHdpZHRoKTsKLSAgICB2b2lkIENvcHlfQl9pbnRvX1ZvcCh1aW50OCAqY29tcCwgaW50IGNDaGFuW10sIGludCB3aWR0aCk7Ci0gICAgdm9pZCBQdXRTS0lQUEVEX01CKHVpbnQ4ICpjb21wLCB1aW50OCAqY19wcmV2LCBpbnQgd2lkdGgpOwotICAgIHZvaWQgUHV0U0tJUFBFRF9CKHVpbnQ4ICpjb21wLCB1aW50OCAqY19wcmV2LCBpbnQgd2lkdGgpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiB2b3AuYyAqLwotICAgIFBWX1NUQVRVUyBEZWNvZGVHT1ZIZWFkZXIoQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbSwgdWludDMyICp0aW1lX2Jhc2UpOwotICAgIFBWX1NUQVRVUyBEZWNvZGVWT0xIZWFkZXIoVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGxheWVyKTsKLSAgICBQVl9TVEFUVVMgRGVjb2RlVk9QSGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCwgQm9vbCB1c2VfZXh0X3RpZW1zdGFtcCk7Ci0gICAgUFZfU1RBVFVTIERlY29kZVNob3J0SGVhZGVyKFZpZGVvRGVjRGF0YSAqdmlkZW8sIFZvcCAqY3VyclZvcCk7Ci0gICAgUFZfU1RBVFVTIFBWX0RlY29kZVZvcChWaWRlb0RlY0RhdGEgKnZpZGVvKTsKLSAgICB1aW50MzIgQ2FsY1ZvcERpc3BsYXlUaW1lKFZvbCAqY3VyclZvbCwgVm9wICpjdXJyVm9wLCBpbnQgc2hvcnRWaWRlb0hlYWRlcik7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBkZWZpbmVkIGluIHBvc3RfcHJvYy5jICovCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0gICAgdm9pZCBIMjYzX0RlYmxvY2sodWludDggKnJlYywgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwgdWludDggKm1vZGUsIGludCBjaHIsIGludCBUKTsKLSNlbmRpZgotICAgIGludCAgUG9zdFByb2NTZW1hcGhvcmUoaW50MTYgKnFfYmxvY2spOwotICAgIHZvaWQgUG9zdEZpbHRlcihWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgZmlsZXJfdHlwZSwgdWludDggKm91dHB1dCk7Ci0gICAgdm9pZCBGaW5kTWF4TWluKHVpbnQ4ICpwdHIsIGludCAqbWluLCBpbnQgKm1heCwgaW50IGluY3IpOwotICAgIHZvaWQgRGVyaW5nQWRhcHRpdmVTbW9vdGhNTVgodWludDggKmltZywgaW50IGluY3IsIGludCB0aHJlcywgaW50IG14ZGYpOwotICAgIHZvaWQgQWRhcHRpdmVTbW9vdGhfTm9NTVgodWludDggKlJlY19ZLCBpbnQgdjAsIGludCBoMCwgaW50IHZfYmxrLCBpbnQgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyLCBpbnQgd2lkdGgsIGludCBtYXhfZGlmZik7Ci0gICAgdm9pZCBEZXJpbmdpbmdfTHVtYSh1aW50OCAqUmVjX1ksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbWJpbmVkLCB1aW50OCAqcHBfbW9kKTsKLSAgICB2b2lkIERlcmluZ2luZ19DaHJvbWEodWludDggKlJlY19DLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDE2ICpRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENvbWJpbmVkLCB1aW50OCAqcHBfbW9kKTsKLSAgICB2b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIodWludDggKnJlYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNiAqUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHIsIHVpbnQ4ICpwcF9tb2QpOwotICAgIHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKHVpbnQ4ICpyZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MTYgKlFQX3N0b3JlLAotICAgICAgICAgICAgaW50IGNociwgdWludDggKnBwX21vZCk7Ci0gICAgdm9pZCBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcih1aW50OCAqcmVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNiAqUVBfc3RvcmUsIGludCBjaHIsIHVpbnQ4ICpwcF9tb2QpOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBjb25jZWFsLmMgKi8KLSAgICB2b2lkIENvbmNlYWxUZXh0dXJlX0koVmlkZW9EZWNEYXRhICp2aWRlbywgaW50MzIgc3RhcnRGaXJzdFBhcnRpdGlvbiwgaW50IG1iX3N0YXJ0LCBpbnQgbWJfc3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlX2NvdW50ZXIpOwotICAgIHZvaWQgQ29uY2VhbFRleHR1cmVfUChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgbWJfc3RhcnQsIGludCBtYl9zdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfY291bnRlcik7Ci0gICAgdm9pZCBDb25jZWFsUGFja2V0KFZpZGVvRGVjRGF0YSAqdmlkZW8sIGludCBtYl9zdGFydCwgaW50IG1iX3N0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV9jb3VudGVyKTsKLSAgICB2b2lkIENvcHlWb3BNQihWb3AgKmN1cnIsIHVpbnQ4ICpwcmV2LCBpbnQgbWJudW0sIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0KLSAgICAvKiBkZWZpbmUgaW4gdmxjX2RlcXVhbnQuYyAsICAwOS8xOC8yMDAwKi8KLSNpZmRlZiBQVl9TVVBQT1JUX01BSU5fUFJPRklMRQotICAgIGludCBWbGNEZXF1YW50TXBlZ0ludHJhQmxvY2sodm9pZCAqdmlkZW8sIGludCBjb21wLCBpbnQgc3dpdGNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKLSAgICBpbnQgVmxjRGVxdWFudE1wZWdJbnRlckJsb2NrKHZvaWQgKnZpZGVvLCBpbnQgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOwotI2VuZGlmCi0gICAgaW50IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9jayhWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwgaW50IHN3aXRjaGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKmJpdG1hcGNvbCwgdWludDggKmJpdG1hcHJvdyk7Ci0gICAgaW50IFZsY0RlcXVhbnRIMjYzSW50cmFCbG9ja19TSChWaWRlb0RlY0RhdGEgKnZpZGVvLCBpbnQgY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpiaXRtYXBjb2wsIHVpbnQ4ICpiaXRtYXByb3cpOwotICAgIGludCBWbGNEZXF1YW50SDI2M0ludGVyQmxvY2soVmlkZW9EZWNEYXRhICp2aWRlbywgaW50IGNvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqYml0bWFwY29sLCB1aW50OCAqYml0bWFwcm93KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVORAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzYwNTBjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi0jaW5jbHVkZSAgICAibW90aW9uX2NvbXAuaCIKLSNpbmNsdWRlICJtYnR5cGVfbW9kZS5oIgotY29uc3Qgc3RhdGljIGludCBTVFJFTkdUSF90YWJbXSA9IHswLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA3LCA4LCA4LCA4LCA5LCA5LCA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyfTsKLSNlbmRpZgotCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgUG9zdEZpbHRlcigKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvLAotICAgIGludCBmaWx0ZXJfdHlwZSwKLSAgICB1aW50OCAqb3V0cHV0KQotewotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICB1aW50OCAqcHBfbW9kOwotICAgIGludDE2ICpRUF9zdG9yZTsKLSAgICBpbnQgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlcjsKLSAgICBpbnQgblRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IHdpZHRoLCBoZWlnaHQ7Ci0gICAgaW50MzIgc2l6ZTsKLSAgICBpbnQgc29mdERlYmxvY2tpbmc7Ci0gICAgdWludDggKmRlY29kZWRGcmFtZSA9IHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzLT5vdXRwdXRGcmFtZTsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOwotICAgIGhlaWdodCA9IHZpZGVvLT5oZWlnaHQ7Ci0gICAgc2l6ZSA9IChpbnQzMil3aWR0aCAqIGhlaWdodDsKLQotICAgIG9zY2xfbWVtY3B5KG91dHB1dCwgZGVjb2RlZEZyYW1lLCBzaXplKTsKLSAgICBvc2NsX21lbWNweShvdXRwdXQgKyBzaXplLCBkZWNvZGVkRnJhbWUgKyBzaXplLCAoc2l6ZSA+PiAyKSk7Ci0gICAgb3NjbF9tZW1jcHkob3V0cHV0ICsgc2l6ZSArIChzaXplID4+IDIpLCBkZWNvZGVkRnJhbWUgKyBzaXplICsgKHNpemUgPj4gMiksIChzaXplID4+IDIpKTsKLQotICAgIGlmIChmaWx0ZXJfdHlwZSA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBUaGUgc29mdERlY29kaW5nIGN1dG9mZiBjb3JyZXNwb25kcyB0byB+OTMwMDAgYnBzIGZvciBRQ0lGIDE1ZnBzIGNsaXAgICovCi0gICAgaWYgKFBWR2V0RGVjQml0cmF0ZSh2aWRlby0+dmlkZW9EZWNDb250cm9scykgPiAoMTAwKnZpZGVvLT5mcmFtZVJhdGUqKHNpemUgPj4gMTIpKSkgIC8vIE1DX3NvZkRlYmxvY2sKLSAgICAgICAgc29mdERlYmxvY2tpbmcgPSBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHNvZnREZWJsb2NraW5nID0gVFJVRTsKLQotICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIgPSBmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0s7Ci0gICAgUVBfc3RvcmUgPSB2aWRlby0+UVBNQjsKLQotICAgIC8qIEx1bWEgKi8KLSAgICBwcF9tb2QgPSB2aWRlby0+cHN0cHJjVHlwQ3VyOwotCi0gICAgaWYgKChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spICYmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykpCi0gICAgewotICAgICAgICBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcihvdXRwdXQsIHdpZHRoLCBoZWlnaHQsIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29mdERlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcihvdXRwdXQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUF9zdG9yZSwgMCwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcob3V0cHV0LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUF9zdG9yZSwgMCwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlcmluZ2luZ19MdW1hKG91dHB1dCwgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyLCBwcF9tb2QpOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDaHJvbWEgKi8KLQotICAgIHBwX21vZCArPSAoblRvdGFsTUIgPDwgMik7Ci0gICAgb3V0cHV0ICs9IHNpemU7Ci0KLSAgICBpZiAoKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykgJiYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKSkKLSAgICB7Ci0gICAgICAgIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzb2Z0RGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyhvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykKLSAgICAgICAgewotICAgICAgICAgICAgRGVyaW5naW5nX0Nocm9tYShvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyLCBwcF9tb2QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHBfbW9kICs9IG5Ub3RhbE1COwotICAgIG91dHB1dCArPSAoc2l6ZSA+PiAyKTsKLQotICAgIGlmICgoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKSAmJiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpKQotICAgIHsKLSAgICAgICAgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvZnREZWJsb2NraW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXJpbmdpbmdfQ2hyb21hKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAgc3dhcCBjdXJyZW50IHBwX21vZCB0byBwcmV2X2ZyYW1lIHBwX21vZCAqLwotICAgIHBwX21vZCA9IHZpZGVvLT5wc3RwcmNUeXBDdXI7Ci0gICAgdmlkZW8tPnBzdHByY1R5cEN1ciA9IHZpZGVvLT5wc3RwcmNUeXBQcnY7Ci0gICAgdmlkZW8tPnBzdHByY1R5cFBydiA9IHBwX21vZDsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotCi0jaWZkZWYgUFZfQU5ORVhfSUpLVF9TVVBQT1JUCi12b2lkIEgyNjNfRGVibG9jayh1aW50OCAqcmVjLAotICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDE2ICpRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgIHVpbnQ4ICptb2RlLAotICAgICAgICAgICAgICAgICAgaW50IGNociwgaW50IGFubmV4X1QpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBpLCBqLCBrOwotICAgIHVpbnQ4ICpyZWNfeTsKLSAgICBpbnQgdG1wdmFyOwotICAgIGludCBtYm51bSwgc3RyZW5ndGgsIEFfRCwgZDFfMiwgZDEsIGQyLCBBLCBCLCBDLCBELCBiX3NpemU7Ci0gICAgaW50IGQsIG9mZnNldCwgbk1CUGVyUm93LCBuTUJQZXJDb2wsIHdpZHRoMiA9ICh3aWR0aCA8PCAxKTsKLSAgICAvKiBNQUtFIFNVUkUgSS1WT1AgSU5UUkEgTUFDUk9CTE9DS1MgQVJFIFNFVCBUTyBOT04tU0tJUFBFRCBNT0RFKi8KLSAgICBtYm51bSA9IDA7Ci0KLSAgICBpZiAoY2hyKQotICAgIHsKLSAgICAgICAgbk1CUGVyUm93ID0gd2lkdGggPj4gMzsKLSAgICAgICAgbk1CUGVyQ29sID0gaGVpZ2h0ID4+IDM7Ci0gICAgICAgIGJfc2l6ZSA9IDg7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG5NQlBlclJvdyA9IHdpZHRoID4+IDQ7Ci0gICAgICAgIG5NQlBlckNvbCA9IGhlaWdodCA+PiA0OwotICAgICAgICBiX3NpemUgPSAxNjsKLSAgICB9Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVkVSVElDQUwgRklMVEVSSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogdmVydGljYWwgZmlsdGVyaW5nIG9mIG1pZCBzZWN0aW9ucyBubyBuZWVkIHRvIGNoZWNrIG5laWdoYm9yaW5nIFFQJ3MgZXRjICovCi0gICAgaWYgKCFjaHIpCi0gICAgewotICAgICAgICByZWNfeSA9IHJlYyArICh3aWR0aCA8PCAzKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IChoZWlnaHQgPj4gNCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8ICh3aWR0aCA+PiA0KTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiW1FQX3N0b3JlW21ibnVtXV07Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEEgPSAgKihyZWNfeSAtIHdpZHRoMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEID0gKihyZWNfeSArIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOwotICAgICAgICAgICAgICAgICAgICAgICAgQyA9ICpyZWNfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEIgPSAqKHJlY195IC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQxIDwgLShzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPCAtc3RyZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC1kMSAtIChzdHJlbmd0aCA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gZCA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA+IChzdHJlbmd0aCA8PCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gKHN0cmVuZ3RoIDw8IDEpIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSBkMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC0oLUFfRCA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gLWQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gQV9EID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyID4gZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyID0gZDFfMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgLSB3aWR0aDIpID0gQSAtIGQyOwotICAgICAgICAgICAgICAgICAgICAgICAgdG1wdmFyID0gQiArIGQxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoKSA9IHRtcHZhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEMgLSBkMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgICAgICpyZWNfeSA9IHRtcHZhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICoocmVjX3kgKyB3aWR0aCkgPSBEICsgZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNfeSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWJudW0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY195ICs9ICgxNSAqIHdpZHRoKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVkVSVElDQUwgYm91bmRhcnkgYmxvY2tzICovCi0KLQotICAgIHJlY195ID0gcmVjICsgd2lkdGggKiBiX3NpemU7Ci0KLSAgICBtYm51bSA9IG5NQlBlclJvdzsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sIC0gMTsgaSsrKQotICAgIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IG5NQlBlclJvdzsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEIHx8IG1vZGVbbWJudW0gLSBuTUJQZXJSb3ddICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBrID0gYl9zaXplOwotICAgICAgICAgICAgICAgIGlmIChtb2RlW21ibnVtXSAhPSBNT0RFX1NLSVBQRUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYlsoYW5uZXhfVCA/ICBNUV9jaHJvbWFfUVBfdGFibGVbUVBfc3RvcmVbbWJudW1dXSA6IFFQX3N0b3JlW21ibnVtXSldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYlsoYW5uZXhfVCA/ICBNUV9jaHJvbWFfUVBfdGFibGVbUVBfc3RvcmVbbWJudW0gLSBuTUJQZXJSb3ddXSA6IFFQX3N0b3JlW21ibnVtIC0gbk1CUGVyUm93XSldOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdoaWxlIChrLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSB3aWR0aDIpOwotICAgICAgICAgICAgICAgICAgICBEID0gICoocmVjX3kgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEFfRCA9IEEgLSBEOwotICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OwotICAgICAgICAgICAgICAgICAgICBCID0gKihyZWNfeSAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIHdpZHRoMikgPSBBIC0gZDI7Ci0gICAgICAgICAgICAgICAgICAgIHRtcHZhciA9IEIgKyBkMTsKLSAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wdmFyKQotICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gd2lkdGgpID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgd2lkdGgpID0gRCArIGQyOwotICAgICAgICAgICAgICAgICAgICByZWNfeSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWNfeSArPSBiX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYm51bSsrOwotICAgICAgICB9Ci0gICAgICAgIHJlY195ICs9ICgoYl9zaXplIC0gMSkgKiB3aWR0aCk7Ci0KLSAgICB9Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKipIT1JJWk9OVEFMIEZJTFRFUklORyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBtYm51bSA9IDA7Ci0gICAgLyogSE9SSVpPTlRBTCBJTk5FUiAqLwotICAgIGlmICghY2hyKQotICAgIHsKLSAgICAgICAgcmVjX3kgPSByZWMgKyA4OwotICAgICAgICBvZmZzZXQgPSB3aWR0aCAqIGJfc2l6ZSAtIGJfc2l6ZTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuTUJQZXJSb3c7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgayA9IDE2OwotICAgICAgICAgICAgICAgICAgICBzdHJlbmd0aCA9IFNUUkVOR1RIX3RhYltRUF9zdG9yZVttYm51bV1dOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoay0tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBID0gICoocmVjX3kgLSAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgQV9EID0gQSAtIEQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDID0gKnJlY195OwotICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKChDIC0gQikgPDwgMikgKyBBX0QpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtKC1kID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMSA8IC0oc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAtZDEgLSAoc3RyZW5ndGggPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxXzIgPSAtZDEgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGQgPj4gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxID4gc3RyZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMV8yID0gZDEgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFfRCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQyIDwgLWQxXzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IEFfRCA+PiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGQxXzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMikgPSBBIC0gZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195IC0gMSkgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXB2YXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAqcmVjX3kgPSB0bXB2YXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgMSkgPSBEICsgZDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNfeSArPSB3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZWNfeSAtPSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY195ICs9IGJfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWJudW0rKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY195ICs9ICgxNSAqIHdpZHRoKTsKLQotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qIEhPUklaT05UQUwgRURHRSAqLwotICAgIHJlY195ID0gcmVjICsgYl9zaXplOwotICAgIG9mZnNldCA9IHdpZHRoICogYl9zaXplIC0gYl9zaXplOwotICAgIG1ibnVtID0gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbk1CUGVyQ29sOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbk1CUGVyUm93IC0gMTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobW9kZVttYm51bV0gIT0gTU9ERV9TS0lQUEVEIHx8IG1vZGVbbWJudW0tMV0gIT0gTU9ERV9TS0lQUEVEKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGsgPSBiX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZGVbbWJudW1dICE9IE1PREVfU0tJUFBFRCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bV1dIDogUVBfc3RvcmVbbWJudW1dKV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVuZ3RoID0gU1RSRU5HVEhfdGFiWyhhbm5leF9UID8gIE1RX2Nocm9tYV9RUF90YWJsZVtRUF9zdG9yZVttYm51bSAtIDFdXSA6IFFQX3N0b3JlW21ibnVtIC0gMV0pXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoay0tKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQSA9ICAqKHJlY195IC0gMik7Ci0gICAgICAgICAgICAgICAgICAgIEQgPSAgKihyZWNfeSArIDEpOwotICAgICAgICAgICAgICAgICAgICBBX0QgPSBBIC0gRDsKLSAgICAgICAgICAgICAgICAgICAgQyA9ICpyZWNfeTsKLSAgICAgICAgICAgICAgICAgICAgQiA9ICoocmVjX3kgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgZCA9ICgoKEMgLSBCKSA8PCAyKSArIEFfRCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGQgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkMSA9IC0oLWQgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPCAtKHN0cmVuZ3RoIDw8IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQxIDwgLXN0cmVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxID0gLWQxIC0gKHN0cmVuZ3RoIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IC1kMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBkID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDEgPiAoc3RyZW5ndGggPDwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZDEgPiBzdHJlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IChzdHJlbmd0aCA8PCAxKSAtIGQxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZDFfMiA9IGQxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoQV9EIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSAtKC1BX0QgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZDIgPCAtZDFfMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IC1kMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBBX0QgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMiA+IGQxXzIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBkMV8yOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIDIpID0gQSAtIGQyOwotICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBCICsgZDE7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgKihyZWNfeSAtIDEpID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICB0bXB2YXIgPSBDIC0gZDE7Ci0gICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcHZhcikKLSAgICAgICAgICAgICAgICAgICAgKnJlY195ID0gdG1wdmFyOwotICAgICAgICAgICAgICAgICAgICAqKHJlY195ICsgMSkgPSBEICsgZDI7Ci0gICAgICAgICAgICAgICAgICAgIHJlY195ICs9IHdpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWNfeSAtPSBvZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVjX3kgKz0gYl9zaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWJudW0rKzsKLSAgICAgICAgfQotICAgICAgICByZWNfeSArPSAoKHdpZHRoICogKGJfc2l6ZSAtIDEpKSArIGJfc2l6ZSk7Ci0gICAgICAgIG1ibnVtKys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvY19zZW1hcGhvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmM2YmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgcV9ibG9jayA9IHBvaW50ZXIgdG8gYnVmZmVyIG9mIGludmVyc2UgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgb2YgdHlwZQotICAgICAgICAgICAgICBpbnQgZm9yIGludHJhLVZPUCBtb2RlIG9yIGJ1ZmZlciBvZiByZXNpZHVhbCBkYXRhIG9mIHR5cGUgaW50Ci0gICAgICAgICAgICAgIGZvciBpbnRlci1WT1AgbW9kZQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBwb3N0bW9kZSA9IHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgd2l0aCB0aGUgdmVydGljYWwgZGVibG9ja2luZywKLSAgICAgICAgICAgICAgIGhvcml6b250YWwgZGVibG9ja2luZywgYW5kIGRlcmluZ2luZyBiaXRzIHNldCB1cCBhY2NvcmRpbmdseQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBwb3N0bW9kZSBzZW1hcGhvcmUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZQotIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHFfYmxvY2suIFRoZSBmdW5jdGlvbiBzdGFydHMgb3V0IHdpdGggdGhlIGFzc3VtcHRpb24KLSB0aGF0IGFsbCBlbnRyaWVzIG9mIHFfYmxvY2ssIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGVudHJ5IChxX2Jsb2NrWzBdKSwgYXJlCi0gemVyby4gVGhpcyBjYXNlIGNhbiBpbmR1Y2UgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYmxvY2tpbmcgYXJ0aWZhY3RzLAotIHRoZXJlZm9yZSwgYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkZWJsb2NraW5nIGJpdHMgYXJlIGVuYWJsZWQuCi0KLSBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRlc3RlZCB3aGVuIHNldHRpbmcgdXAgdGhlIGhvcml6b250YWwvdmVydGljYWwKLSBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcgYml0czoKLSAxLiBXaGVuIG9ubHkgdGhlIGVsZW1lbnRzIG9mIHRoZSB0b3Agcm93IG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSkgYXJlIG5vbi16ZXJvLCB2ZXJ0aWNhbCBibG9ja2luZyBhcnRpZmFjdHMKLSAgICBtYXkgcmVzdWx0LCB0aGVyZWZvcmUsIG9ubHkgdGhlIHZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQuCi0gICAgT3RoZXJ3aXNlLCB0aGUgdmVydGljYWwgZGVibG9ja2luZyBiaXQgaXMgZGlzYWJsZWQuCi0gMi4gV2hlbiBvbmx5IHRoZSBlbGVtZW50cyBvZiB0aGUgZmFyIGxlZnQgY29sdW1uIG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuKkJfU0laRV0sIG4gPSAwLCAuLi4sIEJfU0laRS0xKSBhcmUgbm9uLXplcm8sIGhvcml6b250YWwgYmxvY2tpbmcKLSAgICBhcnRpZmFjdHMgbWF5IHJlc3VsdCwgdGhlcmVmb3JlLCBvbmx5IHRoZSBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzCi0gICAgZW5hYmxlZC4gT3RoZXJ3aXNlLCB0aGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdCBpcyBkaXNhYmxlZC4KLSAzLiBJZiBhbnkgbm9uLXplcm8gZWxlbWVudHMgZXhpc3QgaW4gcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwKLSAgICBxX2Jsb2NrWzFdLCBvciBxX2Jsb2NrW0JfU0laRV0sIHRoZSBkZXJpbmdpbmcgYml0IGlzIGVuYWJsZWQuIE90aGVyd2lzZSwKLSAgICBpdCBpcyBkaXNhYmxlZC4KLQotIFRoZSAzIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgcG9zdG1vZGUgZGVmaW5lcyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsCi0gZGVibG9ja2luZyBhbmQgZGVyaW5naW5nLgotCi0gVGhlIHZhbGlkIHZhbHVlcyBhcmUgc2hvd24gYmVsb3c6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIHwgRW5hYmxlZCB8IERpc2FibGVkIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBWZXJ0aWNhbCBEZWJsb2NraW5nIChCaXQgIzApICAgfCAgICAxICAgIHwgICAgIDAgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IEhvcml6b250YWwgRGVibG9ja2luZyAoQml0ICMxKSB8ICAgIDEgICAgfCAgICAgMCAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgRGVyaW5naW5nIChCaXQgIzIpICAgICAgICAgICAgIHwgICAgMSAgICB8ICAgICAwICAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBQb3N0UHJvY1NlbWFwaG9yZSgKLSAgICBpbnQxNiAqcV9ibG9jaykKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGksIGo7Ci0KLSAgICAvKiBTZXQgZGVmYXVsdCB2YWx1ZSB0byB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGVuYWJsZWQgKi8KLSAgICAvKiBJbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCBvbmx5IHFfYmxvY2tbMF0gZWxlbWVudCBpcyBub24temVybywgKi8KLSAgICAvKiB0aGVyZWZvcmUsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0cyBhcmUgc2V0IHRvIDEgKi8KLSAgICBpbnQgcG9zdG1vZGUgPSAweDM7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIFZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgdG9wIHJvdyBvZiAgICovCi0gICAgLyogdGhlIEJfU0laRSB4IEJfU0laRSBibG9jaywgaS5lLiwgcV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSwgICAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIFNpbmNlIGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBlbGVtZW50cywgZXhjZXB0ICAqLwotICAgIC8qIHFfYmxvY2tbMF0sIGlzIHplcm8sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgICovCi0gICAgLyogdG9wIHJvdyB0byAgZGV0ZXJtaW5lIGlmIGFsbCBvciBzb21lIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1sxXSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgcV9ibG9ja1swXSBhbmQgcV9ibG9ja1sxXSBhcmUgbm9uLXplcm8sIHdoaWxlICovCi0gICAgICAgIC8qIHFfYmxvY2tbbl0sIG4gPSAyLC4uLiwgQl9TSVpFLTEsIGFyZSB6ZXJvLiBUaGVyZWZvcmUsIHdlICAgICAqLwotICAgICAgICAvKiBuZWVkIHRvIGRpc2FibGUgdmVydGljYWwgZGVibG9ja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhFOwotICAgIH0KLQotICAgIGZvciAoaSA9IDI7IGkgPCBCX1NJWkU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMiwuLi4sIEJfU0laRS0xLCBhcmUgbm9uLXplcm8uKi8KLSAgICAgICAgICAgIC8qIElmIGFueSBvZiB0aGVtIHR1cm4gb3V0IHRvIGJlIG5vbi16ZXJvLCB3ZSBuZWVkIHRvICAgICAqLwotICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBkZWJsb2NraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEU7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIb3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgZmFyICovCi0gICAgLyogbGVmdCBjb2x1bW4sIGkuZS4sIHFfYmxvY2tbbipCX1NJWkVdLCBuID0gMCwgLi4uLCBCX1NJWkUtMSwgICAqLwotICAgIC8qIGFyZSBub24temVyby4gU2luY2UgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYWxsIGVsZW1lbnRzLCAgKi8KLSAgICAvKiBleGNlcHQgcV9ibG9ja1swXSwgaXMgemVybywgd2UgbmVlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nICAgICovCi0gICAgLyogZWxlbWVudHMgaW4gdGhlIGZhciBsZWZ0IGNvbHVtbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9yIHNvbWUgICAqLwotICAgIC8qIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1tCX1NJWkVdKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb25seSBxX2Jsb2NrWzBdIGFuZCBxX2Jsb2NrW0JfU0laRV0gYXJlIG5vbi16ZXJvLCAqLwotICAgICAgICAvKiB3aGlsZSBxX2Jsb2NrW24qQl9TSVpFXSwgbiA9IDIsIDMsLi4uLCBCX1NJWkUtMSwgYXJlIHplcm8uICAgICAgICovCi0gICAgICAgIC8qIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhEOwotICAgIH0KLQotICAgIGZvciAoaSA9IDE2OyBpIDwgTkNPRUZGX0JMT0NLOyBpICs9IEJfU0laRSkKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMipCX1NJWkUsLi4uLChCX1NJWkUtMSkqQl9TSVpFLCAgKi8KLSAgICAgICAgICAgIC8qIGFyZSBub24temVyby4gSWYgYW55IG9mIHRoZW0gdHVybiBvdXQgdG8gYmUgbm9uLXplcm8sICAgICAqLwotICAgICAgICAgICAgLyogd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEQ7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50LCBvbmx5IHRoZSBmaXJzdCByb3cgYW5kIGZhciBsZWZ0IGNvbHVtbiBlbGVtZW50cyAqLwotICAgIC8qIGhhdmUgYmVlbiB0ZXN0ZWQuIElmIGRlcmluZ2luZyBiaXQgaXMgc3RpbGwgbm90IHNldCBhdCB0aGlzICAgICovCi0gICAgLyogcG9pbnQsIGNoZWNrIHRoZSByZXN0IG9mIHFfYmxvY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50cyAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIElmIGFsbCBlbGVtZW50cywgYmVzaWRlcyBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdLCAqLwotICAgIC8qIG9yIHFfYmxvY2tbQl9TSVpFXSBhcmUgbm9uLXplcm8sIGRlcmluZ2luZyBiaXQgbXVzdCBiZSBzZXQgICAgICovCi0gICAgaWYgKChwb3N0bW9kZSAmIDB4NCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBCX1NJWkU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IEJfU0laRTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChxX2Jsb2NrWyhpPDwzKStqXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHFfYmxvY2tbMF0gYW5kIGFub3RoZXIgcV9ibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50IGFyZSBub24temVybywgdGhlcmVmb3JlLCB3ZSBuZWVkIHRvICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBvc3Rtb2RlICY9IDB4QzsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEZXJpbmdpbmcgaXMgZW5hYmxlZCBpZiBhbnkgbm9uemVybyBlbGVtZW50cyBleGlzdCBpbiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBxX2Jsb2NrW0JfU0laRV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwb3N0bW9kZSB8PSAweDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogU2V0IG91dGVyIEZPUiBsb29wIGNvdW50IHRvIEJfU0laRSB0byBnZXQgb3V0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dGVyIEZPUiBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpID0gQl9TSVpFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEdldCBvdXQgb2YgaW5uZXIgRk9SIGxvb3AgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybiAocG9zdG1vZGUpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjAyMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgeHByZWQgPSB4LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2sgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHlwcmVkID0geS1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICBwcF9kZWNfdSA9IHBvaW50ZXIgdG8gdGhlIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgZm9yIGNocm9taW5hbmNlCi0gICAgICAgICAgICAgICAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IGluIHRoZSBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgaGVpZ2h0ID0gbHVtaW5hbmNlIFZPUCBoZWlnaHQgaW4gcGl4ZWxzIChpbnQpCi0gICAgc2l6ZSA9IHRvdGFsIG51bWJlciBvZiBwaXhlbCBpbiB0aGUgY3VycmVudCBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgbXZfbG9jID0gZmxhZyBpbmRpY2F0aW5nIGxvY2F0aW9uIG9mIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQKLSAgICAgICAgICh4LHkpIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbHVtaW5hbmNlIE1CIChpbnQpOwotICAgICAgICAgMCAtPiBpbnNpZGUgTUIsIDEgLT4gb3V0c2lkZSBNQgotICAgIG1za19kZWJsb2NrID0gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGVyZm9ybSBkZWJsb2NraW5nCi0gICAgICAgICAgICAgIChtc2tfZGVibG9jayA9IDApIG9yIG5vdCAobXNrX2RlYmxvY2sgPSAxKSAodWludDgpCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHBwX2RlY191IGNvbnRlbnRzIGFyZSB0aGUgdXBkYXRlZCBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgY2hyb21pbmFuY2UgcHJlZGljdGlvbiBpbiBpbnRlcmZyYW1lIHByb2Nlc3NpbmcgbW9kZS4KLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19hcGkuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGVU5DVElPTiBDT0RFCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdm9pZCBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfdSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgLyogaSAqLwotICAgICAgICBpbnQzMiAgIHNpemUsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12X2xvYywgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBtbXZ5LCBtbXZ4LCBubXZ5LCBubXZ4OwotICAgICAgICB1aW50OCAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIC8qIDA5LzI4LzIwMDAsIG1vZGlmeSBzZW1hcGhvcmUgcHJvcGFnYXRpb24gdG8gKi8KLSAgICAgICAgLyogYWNjb21tb2RhdGUgc21hcnQgaW5kZXhpbmcgKi8KLSAgICAgICAgbW12eCA9IHhwcmVkID4+IDQ7ICAvKiBibG9jayB4IGNvb3IgKi8KLSAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgbW12eSA9IHlwcmVkID4+IDQ7ICAvKiBibG9jayB5IGNvb3IgKi8KLSAgICAgICAgbm12eSA9IG1tdnk7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgaWYgKG12X2xvYyA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQZXJmb3JtIGJvdW5kYXJ5IGNoZWNrICovCi0gICAgICAgICAgICBpZiAobm12eCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG12d2lkdGggLSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm12eSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ5ID4gKGhlaWdodCA+PiA0KSAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IChoZWlnaHQgPj4gNCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHBvaW50ZXIgdG8gZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmVzIGluICAgICAgICovCi0gICAgICAgIC8qIHBzdHByY1R5cFBydiwgaS5lLiwgZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmUgaXMgaW4gICAgICAqLwotICAgICAgICAvKiAocHN0cHJjVHlwUHJ2ICsgKHNpemU+PjYpKS4gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBTaW5jZSB0b3RhbCBudW1iZXIgb2YgY2hyb21pbmFuY2UgYmxvY2tzIHBlciByb3cgaW4gYSBWT1AgICAgKi8KLSAgICAgICAgLyogaXMgaGFsZiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGx1bWluYW5jZSBibG9ja3MgcGVyIHJvdyBpbiBhICovCi0gICAgICAgIC8qIFZPUCwgd2UgdXNlIChtdndpZHRoID4+IDEpIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHJvdyBvZmZzZXQuICAqLwotICAgICAgICBwcF9wcmV2MSA9IHBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsgbm12eCArIG5tdnkgKiAobXZ3aWR0aCA+PiAxKSA7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotICAgICAgICAvKiAgMS81LzAxLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvdXQgb2YgYm91bmQgKi8KLSAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDQpIC0gMSkpCi0gICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyAobXZ3aWR0aCA+PiAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogIDEvNS8wMSwgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gb3V0IG9mIGJvdW5kICovCi0gICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgKG12d2lkdGggPj4gMSkgLSAxKSkKLSAgICAgICAgeyAgIC8qIGR4IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgIC8qIHBwX3ByZXYyIGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjEgKyAxOwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgLyogYmVsb3cgcHBfcHJldjEgYmxvY2sgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBsb2NhdGlvbiBvZiBmaXJzdCBDaHJvbWluYW5jZSBSIHNlbWFwaG9yZSBpbiAqLwotICAgICAgICAvKiBwc3RwcmNUeXBQcnYuIFNpbmNlIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgQ2hyb21pbmFuY2UgVk9QICAqLwotICAgICAgICAvKiBpcyAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLzQpLCBhbmQgdGhlcmUgYXJlIDY0ICAgICAqLwotICAgICAgICAvKiBwaXhlbHMgaW4gYW4gOHg4IENocm9taW5hbmNlIGJsb2NrLCB0aGUgb2Zmc2V0IGNhbiBiZSAgICAgICovCi0gICAgICAgIC8qIGNhbGN1bGF0ZWQgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICBtdl9sb2MgPSAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLyg0KjY0KSkgICAqLwotICAgICAgICAvKiAgICAgICAgID0gc2l6ZS8yNTYgPSBzaXplPj44ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgbXZfbG9jID0gKHNpemUgPj4gOCk7Ci0KLSAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiBiIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotCi0gICAgICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBwb2ludCB0byBDaHJvbWluYW5jZSByIHNlbWFwaG9yZXMgKi8KLSAgICAgICAgICAgIHBwX2RlY191ICs9IG12X2xvYzsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiByIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgQiBibG9jayAqLwotICAgICAgICAgICAgaWYgKCgqKHBwX2RlY191KSY0KSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICoocHBfZGVjX3UpIHw9ICgoKihwcF9wcmV2MSkgfCAqKHBwX3ByZXYyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkdmFuY2Ugb2Zmc2V0IHRvIHBvaW50IHRvIENocm9taW5hbmNlIHIgc2VtYXBob3JlcyAqLwotICAgICAgICAgICAgcHBfZGVjX3UgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjEgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjIgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjMgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjQgKz0gbXZfbG9jOwotCi0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSBSICovCi0gICAgICAgICAgICBpZiAoKCoocHBfZGVjX3UpJjQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihwcF9kZWNfdSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjMpIHwgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTFlYmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2x1bWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHhwcmVkID0geC1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIE1CIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICB5cHJlZCA9IHktYXhpcyBjb29yZGluYXRlIG9mIHRoZSBNQiB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgcHBfZGVjX3kgPSBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGZvciBjdXJyZW50Ci0gICAgICAgICAgIGx1bWluYW5jZSBmcmFtZSAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBsbCA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAoaW50KQotICAgIG12X2xvYyA9IGZsYWcgaW5kaWNhdGluZyBsb2NhdGlvbiBvZiB0aGUgbW90aW9uIGNvbXBlbnNhdGVkCi0gICAgICAgICAoeCx5KSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGx1bWluYW5jZSBNQiAoaW50KTsKLSAgICAgICAgIDAgLT4gaW5zaWRlIE1CLCAxIC0+IG91dHNpZGUgTUIKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IChpbnQpCi0gICAgd2lkdGggPSBsdW1pbmFuY2UgVk9QIHdpZHRoIGluIHBpeGVscyAoaW50KQotICAgIGhlaWdodCA9IGx1bWluYW5jZSBWT1AgaGVpZ2h0IGluIHBpeGVscyAoaW50KQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBtc2tfZGVibG9jayA9IGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBkZWJsb2NraW5nIGlzIHRvIGJlCi0gICAgICAgICAgICAgIHBlcmZvcm1lZCAobXNrX2RlYmxvY2sgPSAwKSBvciBub3QgKG1za19kZWJsb2NrID0KLSAgICAgICAgICAgICAgMSkgKHVpbnQ4KQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgcHBfZGVjX3kgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwb2hvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgbHVtaW5hbmNlIHByZWRpY3Rpb24uCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfYXBpLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRlVOQ1RJT04gQ09ERQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4IHBwX3NlbWFwaG9yZV9sdW1hKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfeSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCAqbGwsICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqbXZfbG9jLCAgICAvKiBpL28gKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQgICAgICAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBraywgbW12eSwgbW12eCwgbm12eCwgbm12eTsKLSAgICAgICAgdWludDggICAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0gICAgICAgIHVpbnQ4ICAgbXNrX2RlYmxvY2sgPSAwOyAgICAgICAgLyogIDExLzMvMDAgKi8KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIC8qIEludGVyZnJhbWUgUHJvY2Vzc2luZyAtIDEgTVYgcGVyIE1CICovCi0KLSAgICAgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipNQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgotICAgICAgICAgICAgICAgIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqTUJfU0laRSkpKQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIG5vIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAwOwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeCBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICAqLwotICAgICAgICAgICAgLyogY29udmVydGluZyBoYWxmLXBpeGVsIHJlc29sdXRpb24gdG8gYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1tdnggPSB4cHJlZCA+PiA0OwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICovCi0gICAgICAgICAgICAvKiBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbiB0byBibG9jayAgICAgICAgICovCi0gICAgICAgICAgICBtbXZ5ID0geXByZWQgPj4gNDsKLQotICAgICAgICAgICAgLyogRmluZCBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGxvY2F0aW9uIGZvciBibG9jayAqLwotICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIHBwX3ByZXYxID0gJnBzdHByY1R5cFBydlttbXZ5Km12d2lkdGhdW21tdnhdICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXYxID0gcHN0cHJjVHlwUHJ2ICsgbW12eCArIG1tdnkgKiBtdndpZHRoOwotCi0gICAgICAgICAgICAvKiBDaGVjayBpZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBpZiAoKGR4JjB4RikgIT0gMCkKLSAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjIgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxICsgMTsKLQotICAgICAgICAgICAgICAgIGlmICgoZHkmMHhGKSAhPSAwKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGR5JjB4RikgIT0gMCkKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2suICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgICAgIG1za19kZWJsb2NrID0gMHgzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFBlcmZvcm0gcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgZWFjaCAqLwotICAgICAgICAgICAgLyogb2YgdGhlIDQgYmxvY2tzIGluIGEgTUIuICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IDQ7IGtrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkgJiA0KSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAobXNrX2RlYmxvY2sgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcF9kZWNfeSArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjEgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXYyICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2MyArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjQgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAxOwotCi0gICAgICAgICAgICAvKiBQZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIGVhY2ggKi8KLSAgICAgICAgICAgIC8qIG9mIHRoZSA0IGJsb2NrcyBpbiBhIE1CLiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCA0OyBraysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB4IGNvb3JkaW5hdGUgYW5kIHJvdW5kICg/KS4gICovCi0gICAgICAgICAgICAgICAgLyogRGl2aWRlIGJ5IDE2IGlzIGZvciBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgICAgKi8KLSAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHRvIGJsb2NrLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1tdnggPSAoeHByZWQgKyAoKGtrICYgMSkgPDwgMykpID4+IDQ7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlIGFuZCByb3VuZCAoPykuICAqLwotICAgICAgICAgICAgICAgIC8qIERpdmlkZSBieSAxNiBpcyBmb3IgY29udmVydGluZyBoYWxmLXBpeGVsICAgICovCi0gICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiB0byBibG9jay4gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtbXZ5ID0gKHlwcmVkICsgKChrayAmIDIpIDw8IDIpKSA+PiA0OwotICAgICAgICAgICAgICAgIG5tdnkgPSBtbXZ5OwotCi0gICAgICAgICAgICAgICAgLyogUGVyZm9ybSBib3VuZGFyeSBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmIChubXZ4IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ4ID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5tdnkgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5tdnkgPiAoaGVpZ2h0ID4+IDMpIC0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnkgPSAoaGVpZ2h0ID4+IDMpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgbG9jYXRpb24gZm9yIGJsb2NrICovCi0gICAgICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSA9ICZwc3RwcmNUeXBQcnZbbm12eSptdndpZHRoXVtubXZ4XSAgICAgICovCi0gICAgICAgICAgICAgICAgcHBfcHJldjEgPSBwc3RwcmNUeXBQcnYgKyBubXZ4ICsgbm12eSAqIG12d2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB4IGNvbXBvbmVudCBvZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICAgICovCi0gICAgICAgICAgICAgICAgLyogYW5kIGNoZWNrIGlmIGJsb2NrIHggY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAqLwotICAgICAgICAgICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgbXZ3aWR0aCAtIDEpKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHggY29vcmRpbmF0ZSBpcyB3aXRoaW4gdGhlIGJvdW5kcyAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MiBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgeSBjb21wb25lbnQgb2YgTVYgaXMgYSBtdWx0aXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvZiAxNiBhbmQgY2hlY2sgaWYgYmxvY2sgeSBjb29yZGluYXRlIGlzICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDMpIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBibG9jayB5IGNvb3JkaW5hdGUgaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2l0aGluIHRoZSBib3VuZHMgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgcHJlZGljdGlvbiBhcmUgZnJvbSBkaWZmZXJlbnQgYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2tfZGVibG9jayA9IDB4MzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXY0IGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayB4ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHkgY29tcG9uZW50IG9mIE1WIGlzIGEgbXVsdGlwbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb2YgMTYgYW5kIGNoZWNrIGlmIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvdXQgb2YgYm91bmRzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGR5JjB4RikgIT0gMCkgJiYgKG1tdnkgKyAxIDwgKGhlaWdodCA+PiAzKSAtIDEpKQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmxvY2sgeSBjb29yZGluYXRlIGlzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgYm91bmRzICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrLiAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkmNCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpIHw9ICgoKihwcF9wcmV2MSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjIpIHwgKihwcF9wcmV2MykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYT0gKi8KLSAgICAgICAgICAgICAgICAvKiB0aW9uIGZvciBkZWJsb2NraW5nICovCi0gICAgICAgICAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHBfZGVjX3kgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybiAobXNrX2RlYmxvY2spOwotICAgIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzBmY2ZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzgxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jZGVmaW5lIExPR19UQUcgInB2ZGVjX2FwaSIKLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgInZsY19kZWNvZGUuaCIKLSNpbmNsdWRlICJiaXRzdHJlYW0uaCIKLQotI2lmbmRlZiBJTlQzMl9NQVgKLSNkZWZpbmUgSU5UMzJfTUFYIDB4N2ZmZmZmZmYKLSNlbmRpZgotCi0jaWZuZGVmIFNJWkVfTUFYCi0jZGVmaW5lIFNJWkVfTUFYICgoc2l6ZV90KSAtMSkKLSNlbmRpZgotCi0jZGVmaW5lIE9TQ0xfRElTQUJMRV9XQVJOSU5HX0NPTkRJVElPTkFMX0lTX0NPTlNUQU5UCi0KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotI2RlZmluZSBRQ0lGX01CUyA5OQotI2RlZmluZSBRQ0lGX0JTICg0KlFDSUZfTUJTKQotI2RlZmluZSBRQ0lGX01CX1JPV1MgMTEKLWV4dGVybiB1aW50OCAgICAgICAgICAgICAgICBJTUVNX3NsaWNlTm9bUUNJRl9NQlNdOwotZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fYWNQcmVkRmxhZ1tRQ0lGX01CU107Ci1leHRlcm4gdWludDggICAgICAgICAgICAgICAgSU1FTV9oZWFkZXJJbmZvX01vZGVbUUNJRl9NQlNdOwotZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1faGVhZGVySW5mb19DQlBbUUNJRl9NQlNdOwotZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgIElNRU1faGVhZGVySW5mb19RUE1CW1FDSUZfTUJTXTsKLWV4dGVybiBNYWNyb0Jsb2NrICAgICAgICAgICBJTUVNX21ibG9jazsKLWV4dGVybiBNT1QgICAgICAgICAgICAgICAgICBJTUVNX21vdFhbUUNJRl9CU107Ci1leHRlcm4gTU9UICAgICAgICAgICAgICAgICAgSU1FTV9tb3RZW1FDSUZfQlNdOwotZXh0ZXJuIEJpdHN0cmVhbURlY1ZpZGVvICAgIElNRU1fQml0c3RyZWFtRGVjVmlkZW9bNF07Ci1leHRlcm4gdHlwZURDU3RvcmUgICAgICAgICAgSU1FTV9wcmVkRENbUUNJRl9NQlNdOwotZXh0ZXJuIHR5cGVEQ0FDU3RvcmUgICAgICAgIElNRU1fcHJlZERDQUNfY29sW1FDSUZfTUJfUk9XUysxXTsKLQotZXh0ZXJuIFZpZGVvRGVjRGF0YSAgICAgICAgIElNRU1fVmlkZW9EZWNEYXRhWzFdOwotZXh0ZXJuIFZvcCAgICAgICAgICAgICAgICAgIElNRU1fY3VyclZvcFsxXTsKLWV4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ByZXZWb3BbMV07Ci1leHRlcm4gUElYRUwgICAgICAgICAgICAgICAgSU1FTV9jdXJyVm9wX3lDaGFuW1FDSUZfTUJTKjEyOCozXTsKLWV4dGVybiBQSVhFTCAgICAgICAgICAgICAgICBJTUVNX3ByZXZWb3BfeUNoYW5bUUNJRl9NQlMqMTI4KjNdOwotZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fcHN0cHJjVHlwQ3VyWzYqUUNJRl9NQlNdOwotZXh0ZXJuIHVpbnQ4ICAgICAgICAgICAgICAgIElNRU1fcHN0cHJjVHlwUHJ2WzYqUUNJRl9NQlNdOwotCi0KLWV4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ZvcEhFQURFUlsyXTsKLWV4dGVybiBWb2wgICAgICAgICAgICAgICAgICBJTUVNX1ZPTFsyXTsKLWV4dGVybiBWb3AgICAgICAgICAgICAgICAgICBJTUVNX3ZvcEhlYWRlclsyXVsxXTsKLWV4dGVybiBWb2wgICAgICAgICAgICAgICAgICBJTUVNX3ZvbFsyXVsxXTsKLQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZJbml0VmlkZW9EZWNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNC8xMS8yMDAwLCAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IEluaXRpYWxpemF0aW9uIG9mIHRoZSBNUEVHLTQgdmlkZW8gZGVjb2RlciBsaWJyYXJ5LiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgVGhlIHJldHVybiB0eXBlIGlzIEJvb2wgaW5zdGVhZCBvZiBQVl9TVEFUVVMgYmVjYXVzZSAgICAgICAgICovCi0vKiAgICAgICAgICAgICB3ZSBkb24ndCB3YW50IHRvIGV4cG9zZSBQVl9TVEFUVVMgdG8gKG91dHNpZGUpIHByb2dyYW1tZXJzICAgKi8KLS8qICAgICAgICAgICAgIHRoYXQgdXNlIG91ciBkZWNvZGVyIGxpYnJhcnkgU0RLLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkluaXRWaWRlb0RlY29kZXIoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnZvbGJ1ZltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyICp2b2xidWZfc2l6ZSwgaW50IG5MYXllcnMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgTVA0RGVjb2RpbmdNb2RlIG1vZGUpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7Ci0gICAgaW50IGlkeDsKLSAgICBCaXRzdHJlYW1EZWNWaWRlbyAqc3RyZWFtOwotCi0KLSAgICBvc2NsX21lbXNldChkZWNDdHJsLCAwLCBzaXplb2YoVmlkZW9EZWNDb250cm9scykpOyAvKiBmaXggYSBzaXplIGJ1Zy4gICAwMy8yOC8yMDAxICovCi0gICAgZGVjQ3RybC0+bkxheWVycyA9IG5MYXllcnM7Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKLSAgICB7Ci0gICAgICAgIGRlY0N0cmwtPnZvbGJ1ZltpZHhdID0gdm9sYnVmW2lkeF07Ci0gICAgICAgIGRlY0N0cmwtPnZvbGJ1Zl9zaXplW2lkeF0gPSB2b2xidWZfc2l6ZVtpZHhdOwotICAgIH0KLQotICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uICYgaW5pdGlhbGl6YXRpb24gKi8KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgIHZpZGVvID0gSU1FTV9WaWRlb0RlY0RhdGE7Ci0jZWxzZQotICAgIHZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBvc2NsX21hbGxvYyhzaXplb2YoVmlkZW9EZWNEYXRhKSk7Ci0jZW5kaWYKLSAgICBpZiAodmlkZW8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLCAwLCBzaXplb2YoVmlkZW9EZWNEYXRhKSk7Ci0gICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSA9IHNpemVvZihWaWRlb0RlY0RhdGEpOwotICAgICAgICB2aWRlby0+bnVtYmVyT2ZMYXllcnMgPSBuTGF5ZXJzOwotI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCi0gICAgICAgIHZpZGVvLT52b2wgPSAoVm9sICoqKSBJTUVNX1ZPTDsKLSNlbHNlCi0gICAgICAgIGlmICgoc2l6ZV90KW5MYXllcnMgPiBTSVpFX01BWCAvIHNpemVvZihWb2wgKikpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvLT52b2wgPSAoVm9sICoqKSBvc2NsX21hbGxvYyhuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKSk7Ci0jZW5kaWYKLSAgICAgICAgaWYgKHZpZGVvLT52b2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuTGF5ZXJzICogc2l6ZW9mKFZvbCAqKTsKLQotICAgICAgICAvKiBiZSBzdXJlIG5vdCB0byBsZWFrIGFueSBwcmV2aW91cyBzdGF0ZSAqLwotICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIoZGVjQ3RybCk7Ci0gICAgICAgIC8qIHdlIG5lZWQgdG8gc2V0dXAgdGhpcyBwb2ludGVyIGZvciB0aGUgYXBwbGljYXRpb24gdG8gKi8KLSAgICAgICAgLyogICAgcGFzcyBpdCBhcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhID0gKHZvaWQgKikgdmlkZW87Ci0gICAgICAgIHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzID0gZGVjQ3RybDsgIC8qIHllcy4gd2UgaGF2ZSBhIGN5Y2xpYyAqLwotICAgICAgICAvKiByZWZlcmVuY2VzIGhlcmUgOikgICAgKi8KLQotICAgICAgICAvKiBBbGxvY2F0aW5nIFZvcCBzcGFjZSwgdGhpcyBoYXMgdG8gY2hhbmdlIHdoZW4gd2UgYWRkICovCi0gICAgICAgIC8qICAgIHNwYXRpYWwgc2NhbGFiaWxpdHkgdG8gdGhlIGRlY29kZXIgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgICAgICB2aWRlby0+Y3VyclZvcCA9IElNRU1fY3VyclZvcDsKLSAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5jdXJyVm9wLCAwLCBzaXplb2YoVm9wKSk7Ci0gICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gSU1FTV9wcmV2Vm9wOwotICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AsIDAsIHNpemVvZihWb3ApKTsKLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSAqIDIpOwotICAgICAgICB2aWRlby0+dm9wSGVhZGVyID0gKFZvcCAqKikgSU1FTV92b3BIRUFERVI7Ci0jZWxzZQotCi0gICAgICAgIHZpZGVvLT5jdXJyVm9wID0gKFZvcCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9wKSk7Ci0gICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+Y3VyclZvcCwgMCwgc2l6ZW9mKFZvcCkpOwotICAgICAgICB2aWRlby0+cHJldlZvcCA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOwotICAgICAgICBpZiAodmlkZW8tPnByZXZWb3AgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AsIDAsIHNpemVvZihWb3ApKTsKLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSAqIDIpOwotCi0gICAgICAgIGlmICgoc2l6ZV90KW5MYXllcnMgPiBTSVpFX01BWCAvIHNpemVvZihWb3AgKikpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW8tPnZvcEhlYWRlciA9IChWb3AgKiopIG9zY2xfbWFsbG9jKHNpemVvZihWb3AgKikgKiBuTGF5ZXJzKTsKLSNlbmRpZgotICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlciA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+dm9wSGVhZGVyLCAwLCBzaXplb2YoVm9wICopKm5MYXllcnMpOwotICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3AgKikgKiBuTGF5ZXJzKTsKLQotICAgICAgICB2aWRlby0+aW5pdGlhbGl6ZWQgPSBQVl9GQUxTRTsKLSAgICAgICAgLyogRGVjb2RlIHRoZSBoZWFkZXIgdG8gZ2V0IGFsbCBpbmZvcm1hdGlvbiB0byBhbGxvY2F0ZSBkYXRhICovCi0gICAgICAgIGlmIChzdGF0dXMgPT0gUFZfVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBkZWNvZGVkIGZyYW1lIGNvdW50ZXIuICAgMDQvMjQvMjAwMSAqLwotICAgICAgICAgICAgdmlkZW8tPmZyYW1lX2lkeCA9IC0xOwotCi0KLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCi0gICAgICAgICAgICB7Ci0KLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9IElNRU1fdm9wSGVhZGVyW2lkeF07Ci0jZWxzZQotICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9IChWb3AgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvcCkpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9wSGVhZGVyW2lkeF0sIDAsIHNpemVvZihWb3ApKTsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPSAwOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemVvZihWb3ApKTsKLSAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwotICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKLSNlbHNlCi0gICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKFZvbCk7Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0cmVhbSA9IChCaXRzdHJlYW1EZWNWaWRlbyAqKSBvc2NsX21hbGxvYyhzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pOwotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzIgYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYnVmZmVyX3NpemUgPSBCaXRzdHJlYW1PcGVuKHN0cmVhbSwgaWR4KSkgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJJbml0VmlkZW9EZWNvZGVyKCk6IENhbid0IGFsbG9jYXRlIGJpdHN0cmVhbSBidWZmZXIuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IGJ1ZmZlcl9zaXplOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT52b2xJRCA9IGlkeDsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT50aW1lSW5jX29mZnNldCA9IDA7ICAvKiAgMTEvMTIvMDEgKi8KLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50cmEgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZsY0RlY0NvZWZmSW50ZXIgPSAmVmxjRGVjVENPRUZTaG9ydEhlYWRlcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gTVBFRzRfTU9ERSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHVwIFZPTCBoZWFkZXIgYml0c3RyZWFtIGZvciBmcmFtZS1iYXNlZCBkZWNvZGluZy4gIDA4LzMwLzIwMDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgZGVjQ3RybC0+dm9sYnVmW2lkeF0sIGRlY0N0cmwtPnZvbGJ1Zl9zaXplW2lkeF0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKERlY29kZVZPTEhlYWRlcih2aWRlbywgaWR4KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWX1NVQ0NFU1MgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9UUlVFOyAgIC8qICB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGlmIGZpcnN0IGxheWVyIGlzIGJhZCwgc2Vjb25kIGxheWVyIGlzIGdvb2QgcmV0dXJuIFBWX0ZBSUwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFBWX1RPTEVSQVRFX1ZPTF9FUlJPUlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBWX0JBRF9WT0xIRUFERVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNob3J0VmlkZW9IZWFkZXIgPSBQVl9UUlVFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyID09IFBWX1RSVUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBIMjYzX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgbWF4IHdpZHRoIGFuZCBoZWlnaHQuICBJbiBILjI2MyBtb2RlLCB3ZSB1c2UgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICB2b2xidWZfc2l6ZVswXSB0byBwYXNzIGluIHdpZHRoIGFuZCB2b2xidWZfc2l6ZVsxXSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogIHRvIHBhc3MgaW4gaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgMDQvMjMvMjAwMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AtPnRlbXBvcmFsUmVmID0gMDsgLyogIDExLzEyLzAxICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHNvbWUgY29udmVuaWVuY2UgdmFyaWFibGVzOiAgIDA0LzIzLzIwMDEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+cXVhbnRUeXBlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+cXVhbnRQcmVjaXNpb24gPSA1OwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5lcnJvclJlc0Rpc2FibGUgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdLT5kYXRhUGFydGl0aW9uaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+dXNlUmV2ZXJzZVZMQyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFfYWNkY1ByZWREaXNhYmxlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XS0+c2NhbGFiaWxpdHkgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheVdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT53aWR0aCA9ICh3aWR0aCArIDE1KSAmIC0xNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5oZWlnaHQgPSAoaGVpZ2h0ICsgMTUpICYgLTE2OwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnNpemUgPSAoaW50MzIpdmlkZW8tPndpZHRoICogdmlkZW8tPmhlaWdodDsKLQotI2lmZGVmIFBWX0FOTkVYX0lKS1RfU1VQUE9SVAotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm1vZGlmaWVkX3F1YW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5hZHZhbmNlZF9JTlRSQSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGVibG9ja2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2Vfc3RydWN0dXJlID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IFBWX0ZBTFNFKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBQVkFsbG9jVmlkZW9EYXRhKGRlY0N0cmwsIHdpZHRoLCBoZWlnaHQsIG5MYXllcnMpOwotICAgICAgICAgICAgdmlkZW8tPmluaXRpYWxpemVkID0gUFZfVFJVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0KLWZhaWw6Ci0gICAgaWYgKHN0YXR1cyA9PSBQVl9GQUxTRSkgUFZDbGVhblVwVmlkZW9EZWNvZGVyKGRlY0N0cmwpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotQm9vbCBQVkFsbG9jVmlkZW9EYXRhKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5MYXllcnMpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7Ci0gICAgaW50IG5Ub3RhbE1COwotICAgIGludCBuTUJQZXJSb3c7Ci0gICAgaW50MzIgc2l6ZTsKLQotICAgIGlmICh2aWRlby0+c2hvcnRWaWRlb0hlYWRlciA9PSBQVl9UUlVFKQotICAgIHsKLSAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHdpZHRoOwotICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdmlkZW8tPndpZHRoID0gKHdpZHRoICsgMTUpICYgLTE2OwotICAgICAgICB2aWRlby0+aGVpZ2h0ID0gKGhlaWdodCArIDE1KSAmIC0xNjsKLQotICAgICAgICB2aWRlby0+bk1CUGVyUm93ID0KLSAgICAgICAgICAgIHZpZGVvLT5uTUJpbkdPQiAgPSB2aWRlby0+d2lkdGggLyBNQl9TSVpFOwotICAgICAgICB2aWRlby0+bk1CUGVyQ29sID0KLSAgICAgICAgICAgIHZpZGVvLT5uR09CaW5Wb3AgPSB2aWRlby0+aGVpZ2h0IC8gTUJfU0laRTsKLSAgICAgICAgdmlkZW8tPm5Ub3RhbE1CID0KLSAgICAgICAgICAgIHZpZGVvLT5uTUJQZXJSb3cgKiB2aWRlby0+bk1CUGVyQ29sOwotICAgIH0KLQotICAgIGlmICgoKHVpbnQ2NF90KXZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQpID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIHNpemVvZihQSVhFTCkpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLQotICAgIHNpemUgPSAoaW50MzIpc2l6ZW9mKFBJWEVMKSAqIHZpZGVvLT53aWR0aCAqIHZpZGVvLT5oZWlnaHQ7Ci0jaWZkZWYgUFZfTUVNT1JZX1BPT0wKLSAgICBkZWNDdHJsLT5zaXplID0gc2l6ZTsKLSNlbHNlCi0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBJTUVNX2N1cnJWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwotICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOwotICAgIH0KLQotICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IElNRU1fcHJldlZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCi0gICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIHsKLSAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCi0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIHsKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7Ci0gICAgfQotICAgIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KLSAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2UgewotICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKLSAgICB9Ci0jZW5kaWYKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemUgKiAzKTsKLSNlbmRpZiAgIC8vIE1FTU9SWV9QT09MCi0gICAgLyogTm90ZSB0aGF0IGJhc2VWb3AsIGVuaGNWb3AgaXMgb25seSB1c2VkIHRvIGhvbGQgZW5oYW5jZW1lbnQgKi8KLSAgICAvKiAgICBsYXllciBoZWFkZXIgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgMDUvMDQvMjAwMCAgKi8KLSAgICBpZiAobkxheWVycyA+IDEpCi0gICAgewotICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AgPSAoVm9wICopIG9zY2xfbWFsbG9jKHNpemVvZihWb3ApKTsKLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoVm9wKSk7Ci0gICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldkVuaGNWb3AsIDAsIHNpemVvZihWb3ApKTsKLSNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKLSAgICAgICAgICAgIGlmIChzaXplID4gSU5UMzJfTUFYIC8gMykgewotICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKDMgKiBzaXplIC8gMik7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHNsaWNlcywgQUMgcHJlZGljdGlvbiBmbGFnLCBhbmQgKi8KLSAgICAvKiAgICBBQy9EQyBwcmVkaWN0aW9uIHN0b3JhZ2UgKi8KLSAgICBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBuTUJQZXJSb3cgPSB2aWRlby0+bk1CUGVyUm93OwotCi0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKShJTUVNX3NsaWNlTm8pOwotICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7Ci0gICAgdmlkZW8tPmFjUHJlZEZsYWcgPSAodWludDggKikoSU1FTV9hY1ByZWRGbGFnKTsKLSAgICBpZiAodmlkZW8tPmFjUHJlZEZsYWcgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7Ci0gICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKShJTUVNX3ByZWREQyk7Ci0gICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwotICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKShJTUVNX3ByZWREQ0FDX2NvbCk7Ci0gICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfY29sICsgMTsKLSAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKHVpbnQ4ICopKElNRU1faGVhZGVySW5mb19Nb2RlKTsKLSAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uTW9kZSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7Ci0gICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKHVpbnQ4ICopKElNRU1faGVhZGVySW5mb19DQlApOwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwotICAgIHZpZGVvLT5RUE1CID0gKGludCAqKShJTUVNX2hlYWRlckluZm9fUVBNQik7Ci0gICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7Ci0gICAgdmlkZW8tPm1ibG9jayA9ICZJTUVNX21ibG9jazsKLSAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBvc2NsX21lbXNldCh2aWRlby0+bWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKGludDE2KSo2Kk5DT0VGRl9CTE9DSyk7IC8vICBBdWcgMjMsMjAwNQotCi0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihNYWNyb0Jsb2NrKTsKLSAgICB2aWRlby0+bW90WCA9IChNT1QgKikoSU1FTV9tb3RYKTsKLSAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPm1vdFkgPSAoTU9UICopKElNRU1fbW90WSk7Ci0gICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwotI2Vsc2UKLSAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7Ci0gICAgaWYgKHZpZGVvLT5zbGljZU5vID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIG5Ub3RhbE1CKTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7Ci0KLSAgICB2aWRlby0+YWNQcmVkRmxhZyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwotICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5hY1ByZWRGbGFnLCAwLCBuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIpOwotCi0gICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENTdG9yZSkpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+cHJlZERDID0gKHR5cGVEQ1N0b3JlICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7Ci0gICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDLCAwLCBuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKLQotICAgIGlmIChuTUJQZXJSb3cgPiBJTlQzMl9NQVggLSAxCi0gICAgICAgICAgICB8fCAoc2l6ZV90KShuTUJQZXJSb3cgKyAxKSA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKSB7Ci0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICB9Ci0gICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopIG9zY2xfbWFsbG9jKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7Ci0gICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfY29sLCAwLCAobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKLQotICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCi0gICAgLyogIHRoZSByZXN0IHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyBob3Jpem9udGFsIChyb3cpIEFDIGNvZWZmaWNpZW50cyAgKi8KLSAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gdmlkZW8tPnByZWREQ0FDX2NvbCArIDE7ICAgICAgICAvKiAgQUNEQyAqLwotCi0gICAgLyogQWxsb2NhdGluZyBIZWFkZXJJbmZvIHN0cnVjdHVyZSAmIFF1YW50aXplciBhcnJheSAqLwotICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmhlYWRlckluZm8uTW9kZSwgMCwgblRvdGFsTUIpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKLSAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBvc2NsX21lbXNldCAodmlkZW8tPmhlYWRlckluZm8uQ0JQLCAwLCBuVG90YWxNQik7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwotCi0gICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihpbnQxNikpIHsKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIH0KLSAgICB2aWRlby0+UVBNQiA9IChpbnQxNiAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwotICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG1lbXNldCh2aWRlby0+UVBNQiwgMHgwLCBuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7Ci0KLSAgICAvKiBBbGxvY2F0aW5nIG1hY3JvYmxvY2sgc3BhY2UgKi8KLSAgICB2aWRlby0+bWJsb2NrID0gKE1hY3JvQmxvY2sgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1hY3JvQmxvY2spKTsKLSAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5tYmxvY2stPmJsb2NrLCAwLCBzaXplb2YoaW50MTYpKjYqTkNPRUZGX0JMT0NLKTsgLy8gIEF1ZyAyMywyMDA1Ci0KLSAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IHNpemVvZihNYWNyb0Jsb2NrKTsKLSAgICB9Ci0gICAgLyogQWxsb2NhdGluZyBtb3Rpb24gdmVjdG9yIHNwYWNlICovCi0gICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIChzaXplb2YoTU9UKSAqIDQpKSB7Ci0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICB9Ci0gICAgdmlkZW8tPm1vdFggPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKLSAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKLSAgICB2aWRlby0+bW90WSA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+bW90WSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwotI2VuZGlmCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHBvc3QtcHJvY2Vzc2luZyBNb2RlICovCi0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gSU1FTV9wc3RwcmNUeXBDdXI7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwQ3VyID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cEN1ciwgMCwgNCpuVG90YWxNQiArIDIqblRvdGFsTUIpOwotICAgIH0KLQotICAgIHZpZGVvLT5wc3RwcmNUeXBQcnYgPSBJTUVNX3BzdHByY1R5cFBydjsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwUHJ2LCAwLCBuVG90YWxNQio2KTsKLSAgICB9Ci0KLSNlbHNlCi0gICAgaWYgKG5Ub3RhbE1CID4gSU5UMzJfTUFYIC8gNikgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiA2KTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwQ3VyLCAwLCA0Km5Ub3RhbE1CICsgMipuVG90YWxNQik7Ci0gICAgfQotCi0gICAgdmlkZW8tPnBzdHByY1R5cFBydiA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIDYpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBQcnYsIDAsIG5Ub3RhbE1CKjYpOwotICAgIH0KLQotI2VuZGlmCi0KLSNlbmRpZgotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBsaWJyYXJ5ICovCi0gICAgdmlkZW8tPnByZXZWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCA9IDA7Ci0jaWZuZGVmIFBWX01FTU9SWV9QT09MCi0gICAgb3NjbF9tZW1zZXQodmlkZW8tPnByZXZWb3AtPnlDaGFuLCAxNiwgc2l6ZW9mKHVpbnQ4KSpzaXplKTsgICAgIC8qICAxMC8zMS8wMSAqLwotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiwgMTI4LCBzaXplb2YodWludDgpKnNpemUgLyAyKTsKLQotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5jdXJyVm9wLT55Q2hhbiwgMCwgc2l6ZW9mKHVpbnQ4KSpzaXplKjMgLyAyKTsKLSAgICBpZiAobkxheWVycyA+IDEpCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuLCAwLCBzaXplb2YodWludDgpKnNpemUqMyAvIDIpOwotICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IDA7Ci0gICAgfQotICAgIHZpZGVvLT5jb25jZWFsRnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47ICAgICAgICAgICAgICAgLyogIDA3LzA3LzIwMDEgKi8KLSAgICBkZWNDdHJsLT5vdXRwdXRGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgIC8qICAwNi8xOS8yMDAyICovCi0jZW5kaWYKLQotICAgIC8qIGFsd2F5cyBzdGFydCBmcm9tIGJhc2UgbGF5ZXIgKi8KLSAgICB2aWRlby0+Y3VyckxheWVyID0gMDsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWUmVzZXRWaWRlb0RlY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDEvMTQvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBSZXNldCB2aWRlbyB0aW1lc3RhbXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBQVlJlc2V0VmlkZW9EZWNvZGVyKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBpbnQgaWR4OwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBkZWNDdHJsLT5uTGF5ZXJzOyBpZHgrKykKLSAgICB7Ci0gICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wID0gMDsKLSAgICB9Ci0gICAgdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCA9IDA7Ci0gICAgaWYgKGRlY0N0cmwtPm5MYXllcnMgPiAxKQotICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IDA7Ci0KLSAgICBvc2NsX21lbXNldCh2aWRlby0+bWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKGludDE2KSo2Kk5DT0VGRl9CTE9DSyk7IC8vICBBdWcgMjMsMjAwNQotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkNsZWFuVXBWaWRlb0RlY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzExLzIwMDAsIDA4LzI5LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogQ2xlYW51cCBvZiB0aGUgTVBFRy00IHZpZGVvIGRlY29kZXIgbGlicmFyeS4gICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiBCb29sIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQotewotICAgIGludCBpZHg7Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAotICAgIGlmICh2aWRlbykKLSAgICB7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgdmlkZW8tPnBzdHByY1R5cEN1ciA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5wc3RwcmNUeXBQcnYgPSBOVUxMOwotI2VuZGlmCi0KLSAgICAgICAgdmlkZW8tPmFjUHJlZEZsYWcgICAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+c2xpY2VObyAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5tb3RYICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPm1vdFkgICAgICAgICAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+bWJsb2NrICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5RUE1CICAgICAgICAgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPnByZWREQyAgICAgICAgICAgPSBOVUxMOwotICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ICAgICA9IE5VTEw7Ci0gICAgICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgICAgID0gTlVMTDsKLSAgICAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSAgPSBOVUxMOwotICAgICAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgICA9IE5VTEw7Ci0gICAgICAgIGlmICh2aWRlby0+bnVtYmVyT2ZMYXllcnMgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSBOVUxMOwotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKSBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbik7Ci0gICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2RW5oY1ZvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wKQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSBOVUxMOwotICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gTlVMTDsKLSAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4pCi0gICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gTlVMTDsKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAodmlkZW8tPnByZXZWb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbikKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBOVUxMOwotICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT52b2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPm51bWJlck9mTGF5ZXJzOyBpZHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtQ2xvc2UodmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZGVvLT52b3BIZWFkZXJbaWR4XSA9IE5VTEw7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT52b2wgPSBOVUxMOwotICAgICAgICAgICAgdmlkZW8tPnZvcEhlYWRlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICB2aWRlbyA9IE5VTEw7Ci0gICAgICAgIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEgPSBOVUxMOwotICAgIH0KLQotI2Vsc2UKLQotICAgIGlmICh2aWRlbykKLSAgICB7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIpIG9zY2xfZnJlZSh2aWRlby0+cHN0cHJjVHlwQ3VyKTsKLSAgICAgICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYpIG9zY2xfZnJlZSh2aWRlby0+cHN0cHJjVHlwUHJ2KTsKLSNlbmRpZgotICAgICAgICBpZiAodmlkZW8tPnByZWREQykgb3NjbF9mcmVlKHZpZGVvLT5wcmVkREMpOwotICAgICAgICB2aWRlby0+cHJlZERDQUNfcm93ID0gTlVMTDsKLSAgICAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wpIG9zY2xfZnJlZSh2aWRlby0+cHJlZERDQUNfY29sKTsKLSAgICAgICAgaWYgKHZpZGVvLT5tb3RYKSBvc2NsX2ZyZWUodmlkZW8tPm1vdFgpOwotICAgICAgICBpZiAodmlkZW8tPm1vdFkpIG9zY2xfZnJlZSh2aWRlby0+bW90WSk7Ci0gICAgICAgIGlmICh2aWRlby0+bWJsb2NrKSBvc2NsX2ZyZWUodmlkZW8tPm1ibG9jayk7Ci0gICAgICAgIGlmICh2aWRlby0+UVBNQikgb3NjbF9mcmVlKHZpZGVvLT5RUE1CKTsKLSAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUpIG9zY2xfZnJlZSh2aWRlby0+aGVhZGVySW5mby5Nb2RlKTsKLSAgICAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCkgb3NjbF9mcmVlKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCk7Ci0gICAgICAgIGlmICh2aWRlby0+c2xpY2VObykgb3NjbF9mcmVlKHZpZGVvLT5zbGljZU5vKTsKLSAgICAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnKSBvc2NsX2ZyZWUodmlkZW8tPmFjUHJlZEZsYWcpOwotCi0gICAgICAgIGlmICh2aWRlby0+bnVtYmVyT2ZMYXllcnMgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSBOVUxMOwotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuKSBvc2NsX2ZyZWUodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbik7Ci0gICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2RW5oY1ZvcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wKQotICAgICAgICB7Ci0KLSNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbikKLSAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPmN1cnJWb3AtPnlDaGFuKTsKLSNlbmRpZgotICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5jdXJyVm9wKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmlkZW8tPnByZXZWb3ApCi0gICAgICAgIHsKLSNpZm5kZWYgUFZfTUVNT1JZX1BPT0wKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IE5VTEw7Ci0gICAgICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSBOVUxMOwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbikKLSAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnByZXZWb3AtPnlDaGFuKTsKLSNlbmRpZgotICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT5wcmV2Vm9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2aWRlby0+dm9sKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5udW1iZXJPZkxheWVyczsgaWR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPmJpdHN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtQ2xvc2UodmlkZW8tPnZvbFtpZHhdLT5iaXRzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgb3NjbF9mcmVlKHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8tPnZvbFtpZHhdKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zY2xfZnJlZSh2aWRlby0+dm9sKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPm51bWJlck9mTGF5ZXJzOyBpZHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT52b3BIZWFkZXJbaWR4XSkgb3NjbF9mcmVlKHZpZGVvLT52b3BIZWFkZXJbaWR4XSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPnZvcEhlYWRlcikgb3NjbF9mcmVlKHZpZGVvLT52b3BIZWFkZXIpOwotCi0gICAgICAgIG9zY2xfZnJlZSh2aWRlbyk7Ci0gICAgICAgIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEgPSBOVUxMOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBQVl9UUlVFOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldFZpZGVvRGltZW5zaW9ucygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0MDUwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IHRoZSBkaXNwbGF5X3dpZHRoIGFuZCBkaXNwbGF5X2hlaWdodCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgdGhlIGZyYW1lIGluIHRoZSBjdXJyZW50IGxheWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiBUaGlzIGlzIG5vdCBhIG1hY3JvIG9yIGlubGluZSBmdW5jdGlvbiBiZWNhdXNlIHdlIGRvICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICBub3Qgd2FudCB0byBleHBvc2Ugb3VyIGludGVybmFsIGRhdGEgc3RydWN0dXJlLiAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiB2b2lkIFBWR2V0VmlkZW9EaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICpkaXNwbGF5X3dpZHRoLCBpbnQzMiAqZGlzcGxheV9oZWlnaHQpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgICpkaXNwbGF5X3dpZHRoID0gdmlkZW8tPmRpc3BsYXlXaWR0aDsKLSAgICAqZGlzcGxheV9oZWlnaHQgPSB2aWRlby0+ZGlzcGxheUhlaWdodDsKLX0KLQotT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZHZXRCdWZmZXJEaW1lbnNpb25zKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIGludDMyICp3aWR0aCwgaW50MzIgKmhlaWdodCkgewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICAqd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgKmhlaWdodCA9IHZpZGVvLT5oZWlnaHQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRWaWRlb1RpbWVTdGFtcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNC8yNy8yMDAwLCAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBjdXJyZW50IHRpbWUgc3RhbXAgaW4gbWlsbGlzZWNvbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVpbnQzMiBQVkdldFZpZGVvVGltZVN0YW1wKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHJldHVybiB2aWRlby0+Y3VyclRpbWVzdGFtcDsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWU2V0UG9zdFByb2NUeXBlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDcvMDcvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogU2V0IHBvc3QtcHJvY2Vzc2luZyBmaWx0ZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IC4gMDgvMjkvMjAwMCBjaGFuZ2VzIHRoZSBuYW1lIGZvciBjb25zaXN0ZW5jeS4gICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgdm9pZCBQVlNldFBvc3RQcm9jVHlwZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCBpbnQgbW9kZSkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgdmlkZW8tPnBvc3RGaWx0ZXJUeXBlID0gbW9kZTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0RGVjQml0cmF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMjMvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhdmVyYWdlIGJpdHMgcGVyIHNlY29uZC4gICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgUFZHZXREZWNCaXRyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludCAgICAgaWR4OwotICAgIGludDMyICAgc3VtID0gMDsKLQotICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQklUUkFURV9BVkVSQUdFX1dJTkRPVzsgaWR4KyspCi0gICAgewotICAgICAgICBzdW0gKz0gdmlkZW8tPm5CaXRzUGVyVm9wW2lkeF07Ci0gICAgfQotICAgIHN1bSA9IChzdW0gKiB2aWRlby0+ZnJhbWVSYXRlKSAvICgxMCAqIEJJVFJBVEVfQVZFUkFHRV9XSU5ET1cpOwotICAgIHJldHVybiAoaW50KSBzdW07Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldERlY0ZyYW1lcmF0ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYXZlcmFnZSBmcmFtZSBwZXIgMTAgc2Vjb25kLiAgICAgICAqLwotLyogIE5vdGUgICAgIDogVGhlIGZwcyBjYW4gYmUgY2FsY3VsYXRlZCBieSBQVkdldERlY0ZyYW1lcmF0ZSgpLzEwICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFBWR2V0RGVjRnJhbWVyYXRlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotCi0gICAgcmV0dXJuIHZpZGVvLT5mcmFtZVJhdGU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRPdXRwdXRGcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNS8wNy8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmcmFtZSAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVpbnQ4ICpQVkdldERlY091dHB1dEZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgcmV0dXJuIGRlY0N0cmwtPm91dHB1dEZyYW1lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0TGF5ZXJJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDcvMDkvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGRlY29kZWQgZnJhbWUgbGF5ZXIgaWQgKEJBU0UvRU5IQU5DRSkgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgUFZHZXRMYXllcklEKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHJldHVybiB2aWRlby0+Y3VyckxheWVyOwotfQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldERlY01lbW9yeVVzYWdlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIzLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkLiAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50MzIgUFZHZXREZWNNZW1vcnlVc2FnZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsKQotewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICByZXR1cm4gdmlkZW8tPm1lbW9yeVVzYWdlOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXREZWNCaXRzdHJlYW1Nb2RlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yMy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRlY29kaW5nIG1vZGUgb2YgdGhlIGJhc2VsYXllciAgICAgKi8KLS8qICAgICAgICAgICAgICBiaXRzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIE1QNERlY29kaW5nTW9kZSBQVkdldERlY0JpdHN0cmVhbU1vZGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCkKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgaWYgKHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEgyNjNfTU9ERTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIE1QRUc0X01PREU7Ci0gICAgfQotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZFeHRyYWN0Vm9sSGVhZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBFeHRyYWN0IHZvbCBoZWFkZXIgb2YgdGhlIGJpdHN0cmVhbSBmcm9tIGJ1ZmZlcltdLiAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUJvb2wgUFZFeHRyYWN0Vm9sSGVhZGVyKHVpbnQ4ICp2aWRlb19idWZmZXIsIHVpbnQ4ICp2b2xfaGVhZGVyLCBpbnQzMiAqdm9sX2hlYWRlcl9zaXplKQotewotICAgIGludCBpZHggPSAtMTsKLSAgICB1aW50OCBzdGFydF9jb2RlX3ByZWZpeFtdID0geyAweDAwLCAweDAwLCAweDAxIH07Ci0gICAgdWludDggaDI2M19wcmVmaXhbXSA9IHsgMHgwMCwgMHgwMCwgMHg4MCB9OwotCi0gICAgaWYgKG9zY2xfbWVtY21wKGgyNjNfcHJlZml4LCB2aWRlb19idWZmZXIsIDMpID09IDApIC8qIHdlIGhhdmUgc2hvcnQgaGVhZGVyIHN0cmVhbSAqLwotICAgIHsKLSAgICAgICAgb3NjbF9tZW1jcHkodm9sX2hlYWRlciwgdmlkZW9fYnVmZmVyLCAzMik7Ci0gICAgICAgICp2b2xfaGVhZGVyX3NpemUgPSAzMjsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChvc2NsX21lbWNtcChzdGFydF9jb2RlX3ByZWZpeCwgdmlkZW9fYnVmZmVyLCAzKSB8fAotICAgICAgICAgICAgICAgICh2aWRlb19idWZmZXJbM10gIT0gMHhiMCAmJiB2aWRlb19idWZmZXJbM10gPj0gMHgyMCkpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgIHdoaWxlIChvc2NsX21lbWNtcChzdGFydF9jb2RlX3ByZWZpeCwgdmlkZW9fYnVmZmVyICsgaWR4LCAzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ICsgMyA+PSAqdm9sX2hlYWRlcl9zaXplKSBnb3RvIHF1aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKHZpZGVvX2J1ZmZlcltpZHgrM10gIT0gMHhiMyAmJiB2aWRlb19idWZmZXJbaWR4KzNdICE9IDB4YjYpOwotCi0gICAgICAgIG9zY2xfbWVtY3B5KHZvbF9oZWFkZXIsIHZpZGVvX2J1ZmZlciwgaWR4KTsKLSAgICAgICAgKnZvbF9oZWFkZXJfc2l6ZSA9IGlkeDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi1xdWl0OgotICAgIG9zY2xfbWVtY3B5KHZvbF9oZWFkZXIsIHZpZGVvX2J1ZmZlciwgKnZvbF9oZWFkZXJfc2l6ZSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZMb2NhdGVGcmFtZUhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNC84LzIwMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBSZXR1cm4gdGhlIG9mZnNldCB0byB0aGUgZmlyc3QgU0MgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludDMyIFBWTG9jYXRlRnJhbWVIZWFkZXIodWludDggKnB0ciwgaW50MzIgc2l6ZSkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGludDMyIGkgPSBzaXplOwotCi0gICAgaWYgKHNpemUgPCAxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgICBpZiAoKGNvdW50ID4gMSkgJiYgKCpwdHIgPT0gMHgwMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpwdHIrKykKLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgcmV0dXJuIChzaXplIC0gKGkgKyAxKSk7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkxvY2F0ZUgyNjNGcmFtZUhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzgvMjAwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFJldHVybiB0aGUgb2Zmc2V0IHRvIHRoZSBmaXJzdCBTQyBpbiB0aGUgYnVmZmVyICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50MzIgUFZMb2NhdGVIMjYzRnJhbWVIZWFkZXIodWludDggKnB0ciwgaW50MzIgc2l6ZSkKLXsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGludDMyIGkgPSBzaXplOwotCi0gICAgaWYgKHNpemUgPCAxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgd2hpbGUgKGktLSkKLSAgICB7Ci0gICAgICAgIGlmICgoY291bnQgPiAxKSAmJiAoKCpwdHIgJiAweEZDKSA9PSAweDgwKSkKLSAgICAgICAgewotICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKnB0cisrKQotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb3VudCsrOwotICAgIH0KLSAgICByZXR1cm4gKHNpemUgLSAoaSArIDEpKTsKLX0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWRGVjb2RlVmlkZW9GcmFtZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMjkvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBEZWNvZGUgb25lIHZpZGVvIGZyYW1lIGFuZCByZXR1cm4gYSBZVVYtMTIgaW1hZ2UuICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDA0LzE3LzIwMDEgcmVtb3ZlZCBQVl9FT1MsIFBWX0VORF9PRl9CVUZGRVIgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgOiAwOC8yMi8yMDAyIGJyZWFrIHVwIGludG8gMiBmdW5jdGlvbnMgUFZEZWNvZGVWb3BIZWFkZXIgYW5kICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgUFZEZWNvZGVWb3BCb2R5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZEZWNvZGVWaWRlb0ZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpidWZmZXJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGltZXN0YW1wW10sIGludDMyIGJ1ZmZlcl9zaXplW10sIHVpbnQgdXNlX2V4dF90aW1lc3RhbXBbXSwgdWludDggKmN1cnJZVVYpCi17Ci0gICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKLQotICAgIHN0YXR1cyA9IChQVl9TVEFUVVMpUFZEZWNvZGVWb3BIZWFkZXIoZGVjQ3RybCwgYnVmZmVyLCB0aW1lc3RhbXAsIGJ1ZmZlcl9zaXplLCAmaGVhZGVyX2luZm8sIHVzZV9leHRfdGltZXN0YW1wLCBjdXJyWVVWKTsKLSAgICBpZiAoc3RhdHVzICE9IFBWX1RSVUUpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotICAgIGlmIChQVkRlY29kZVZvcEJvZHkoZGVjQ3RybCwgYnVmZmVyX3NpemUpICE9IFBWX1RSVUUpCi0gICAgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZEZWNvZGVWb3BIZWFkZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERldGVybWluZSB0YXJnZXQgbGF5ZXIgYW5kIGRlY29kZSB2b3AgaGVhZGVyLCBtb2RpZmllZCBmcm9tICAqLwotLyogICAgICAgICAgICAgIG9yaWdpbmFsIFBWRGVjb2RlVmlkZW9GcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBQVkRlY29kZVZvcEhlYWRlcihWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqYnVmZmVyW10sCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0aW1lc3RhbXBbXSwgaW50MzIgYnVmZmVyX3NpemVbXSwgVm9wSGVhZGVySW5mbyAqaGVhZGVyX2luZm8sIHVpbnQgdXNlX2V4dF90aW1lc3RhbXAgW10sIHVpbnQ4ICpjdXJyWVVWKQotewotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8gPSAoVmlkZW9EZWNEYXRhICopIGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgVm9sICpjdXJyVm9sOwotICAgIFZvcCAqY3VyclZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgIFZvcCAqKnZvcEhlYWRlciA9IHZpZGVvLT52b3BIZWFkZXI7Ci0gICAgQml0c3RyZWFtRGVjVmlkZW8gKnN0cmVhbTsKLQotICAgIGludCB0YXJnZXRfbGF5ZXI7Ci0KLSNpZmRlZiBQVl9TVVBQT1JUX1RFTVBPUkFMX1NDQUxBQklMSVRZCi0gICAgUFZfU1RBVFVTIHN0YXR1cyA9IFBWX0ZBSUw7Ci0gICAgaW50IGlkeDsKLSAgICBpbnQzMiBkaXNwbGF5X3RpbWU7Ci0KLSAgICAvKiBkZWNpZGUgd2hpY2ggZnJhbWUgdG8gZGVjb2RlIG5leHQgKi8KLSAgICBpZiAoZGVjQ3RybC0+bkxheWVycyA+IDEpCi0gICAgewotICAgICAgICBkaXNwbGF5X3RpbWUgPSB0YXJnZXRfbGF5ZXIgPSAtMTsKLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBkZWNDdHJsLT5uTGF5ZXJzOyBpZHgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBkYXRhIGZvciB0aGlzIGxheWVyPyAqLwotICAgICAgICAgICAgaWYgKGJ1ZmZlcl9zaXplW2lkeF0gPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBbaWR4XSA9IC0xOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBkaWQgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGUgYSB0aW1lc3RhbXAgZm9yIHRoaXMgdm9wPyAqLwotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcFtpZHhdIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodm9wSGVhZGVyW2lkeF0tPnRpbWVTdGFtcCA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBkZWNvZGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYml0c3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSBpZHg7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHZpZGVvLT52b2xbaWR4XS0+Yml0c3RyZWFtOwotICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1SZXNldChzdHJlYW0sIGJ1ZmZlcltpZHhdLCBidWZmZXJfc2l6ZVtpZHhdKTsKLQotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHN0YXR1cyA9IERlY29kZVZPUEhlYWRlcih2aWRlbywgdm9wSGVhZGVyW2lkeF0sIEZBTFNFKSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSBWT1AgaGVhZGVyIGluIHRoZSBidWZmZXIuICAgMDgvMzAvMjAwMC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBkYXRhIGZvciBlbmhhbmNlbWVudCBsYXllciwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBkb24ndCBqdXN0IHN0b3AuICAgMDkvMDcvMjAwMC4gICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVtpZHhdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvcEhlYWRlcltpZHhdLT50aW1lU3RhbXAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFtpZHhdID0gQ2FsY1ZvcERpc3BsYXlUaW1lKHZpZGVvLT52b2xbaWR4XSwgdm9wSGVhZGVyW2lkeF0sIHZpZGVvLT5zaG9ydFZpZGVvSGVhZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPT0gMCkgdm9wSGVhZGVyW2lkeF0tPnJlZlNlbGVjdENvZGUgPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFdlJ3ZlIGRlY29kZWQgdGhpcyB2b3AgaGVhZGVyIGluIHRoZSBwcmV2aW91cyBydW4gYWxyZWFkeS4gKi8KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wW2lkeF0gPSB2b3BIZWFkZXJbaWR4XS0+dGltZVN0YW1wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogVXNlIHRpbWVzdGFtcHMgdG8gc2VsZWN0IHRoZSBuZXh0IFZPUCB0byBiZSBkZWNvZGVkICovCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wW2lkeF0gPj0gMCAmJiAoZGlzcGxheV90aW1lIDwgMCB8fCBkaXNwbGF5X3RpbWUgPiB0aW1lc3RhbXBbaWR4XSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlzcGxheV90aW1lID0gdGltZXN0YW1wW2lkeF07Ci0gICAgICAgICAgICAgICAgdGFyZ2V0X2xheWVyID0gaWR4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoZGlzcGxheV90aW1lID09IHRpbWVzdGFtcFtpZHhdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIGhhdmUgdG8gaGFuZGxlIGVpdGhlciBTTlIgb3Igc3BhdGlhbCBzY2FsYWJpbGl0eSBoZXJlLiAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh0YXJnZXRfbGF5ZXIgPCAwKSByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICAgICAgLyogc2V0IHVwIGZvciBkZWNvZGluZyB0aGUgdGFyZ2V0IGxheWVyICovCi0gICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSB0YXJnZXRfbGF5ZXI7Ci0gICAgICAgIGN1cnJWb2wgPSB2aWRlby0+dm9sW3RhcmdldF9sYXllcl07Ci0gICAgICAgIHZpZGVvLT5iaXRzdHJlYW0gPSBzdHJlYW0gPSBjdXJyVm9sLT5iaXRzdHJlYW07Ci0KLSAgICAgICAgLyogV2UgbmVlZCB0byBkZWNvZGUgdGhlIHZvcCBoZWFkZXIgaWYgZXh0ZXJuYWwgdGltZXN0YW1wICAgKi8KLSAgICAgICAgLyogICAgaXMgcHJvdmlkZWQuICAgIDEwLzA0LzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0gPSB2aWRlby0+dm9sW3RhcmdldF9sYXllcl0tPmJpdHN0cmVhbTsKLSAgICAgICAgICAgIEJpdHN0cmVhbVJlc2V0KHN0cmVhbSwgYnVmZmVyW3RhcmdldF9sYXllcl0sIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0pOwotCi0gICAgICAgICAgICB3aGlsZSAoRGVjb2RlVk9QSGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXSwgVFJVRSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZmluZCBhIFZPUCBoZWFkZXIgaW4gdGhlIGJ1ZmZlci4gICAwOC8zMC8yMDAwLiAqLwotICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRNNFZGcmFtZShzdHJlYW0pICE9IFBWX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIGRhdGEgZm9yIGVuaGFuY2VtZW50IGxheWVyLCAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICBkb24ndCBqdXN0IHN0b3AuICAgMDkvMDcvMjAwMC4gICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXS0+dGltZUluY19vZmZzZXQgPSB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXS0+dGltZUluYzsKLSAgICAgICAgICAgIHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXS0+bW9kdWxvVGltZUJhc2UgPSB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXTsKLSAgICAgICAgICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIgPT0gMCkgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnJlZlNlbGVjdENvZGUgPSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogYmFzZSBsYXllciBvbmx5IGRlY29kaW5nICovCi0gICAgewotI2VuZGlmCi0gICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSB0YXJnZXRfbGF5ZXIgPSAwOwotICAgICAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFswXTsKLSAgICAgICAgdmlkZW8tPmJpdHN0cmVhbSA9IHN0cmVhbSA9IGN1cnJWb2wtPmJpdHN0cmVhbTsKLSAgICAgICAgaWYgKGJ1ZmZlcl9zaXplWzBdIDw9IDApIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgQml0c3RyZWFtUmVzZXQoc3RyZWFtLCBidWZmZXJbMF0sIGJ1ZmZlcl9zaXplWzBdKTsKLQotICAgICAgICBpZiAodmlkZW8tPnNob3J0VmlkZW9IZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlIChEZWNvZGVTaG9ydEhlYWRlcih2aWRlbywgdm9wSGVhZGVyWzBdKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQVlNlYXJjaE5leHRIMjYzRnJhbWUoc3RyZWFtKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhlcmUgaXMgbm8gdm9wIGhlYWRlciBpbiB0aGUgYnVmZmVyLCAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgIGNsZWFuIGJpdHN0cmVhbSBidWZmZXIuICAgICAyLzUvMjAwMSAgICovCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplWzBdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbml0aWFsaXplZCA9PSBQVl9GQUxTRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPmRpc3BsYXlXaWR0aCA9IHZpZGVvLT53aWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZGlzcGxheUhlaWdodCA9IHZpZGVvLT5oZWlnaHQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1c2VfZXh0X3RpbWVzdGFtcFswXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBNVEIgZm9yIEgyNjMgaXMgYWJzb2x1dGUgVFIgKi8KLSAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgbGluZSBpcyBlcXVpdmFsZW50IHRvICByb3VuZCgodGltZXN0YW1wWzBdKjMwKS8xMDAxKTsgICAxMS8xMy8yMDAxICovCi0gICAgICAgICAgICAgICAgdmlkZW8tPnZvbFswXS0+bW9kdWxvVGltZUJhc2UgPSAzMCAqICgodGltZXN0YW1wWzBdICsgMTcpIC8gMTAwMSkgKyAoMzAgKiAoKHRpbWVzdGFtcFswXSArIDE3KSAlIDEwMDEpIC8gMTAwMSk7Ci0gICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSBDYWxjVm9wRGlzcGxheVRpbWUoY3VyclZvbCwgdm9wSGVhZGVyWzBdLCB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoRGVjb2RlVk9QSGVhZGVyKHZpZGVvLCB2b3BIZWFkZXJbMF0sIEZBTFNFKSAhPSBQVl9TVUNDRVNTKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmaW5kIGEgVk9QIGhlYWRlciBpbiB0aGUgYnVmZmVyLiAgIDA4LzMwLzIwMDAuICovCi0gICAgICAgICAgICAgICAgaWYgKFBWU2VhcmNoTmV4dE00VkZyYW1lKHN0cmVhbSkgIT0gUFZfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHZvcCBoZWFkZXIgaW4gdGhlIGJ1ZmZlciwgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogICBjbGVhbiBiaXRzdHJlYW0gYnVmZmVyLiAgICAgMi81LzIwMDEgICAqLwotICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZVswXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh1c2VfZXh0X3RpbWVzdGFtcFswXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+dm9sWzBdLT50aW1lSW5jX29mZnNldCA9IHZvcEhlYWRlclswXS0+dGltZUluYzsKLSAgICAgICAgICAgICAgICB2aWRlby0+dm9sWzBdLT5tb2R1bG9UaW1lQmFzZSA9IHRpbWVzdGFtcFswXTsgIC8qICAxMS8xMi8yMDAxICovCi0gICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSB0aW1lc3RhbXBbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdm9wSGVhZGVyWzBdLT50aW1lU3RhbXAgPSBDYWxjVm9wRGlzcGxheVRpbWUoY3VyclZvbCwgdm9wSGVhZGVyWzBdLCB2aWRlby0+c2hvcnRWaWRlb0hlYWRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgdXAgc29tZSBiYXNlLWxheWVyIG9ubHkgcGFyYW1ldGVycyAqLwotICAgICAgICB2b3BIZWFkZXJbMF0tPnJlZlNlbGVjdENvZGUgPSAxOwotI2lmZGVmIFBWX1NVUFBPUlRfVEVNUE9SQUxfU0NBTEFCSUxJVFkKLSAgICB9Ci0jZW5kaWYKLSAgICB0aW1lc3RhbXBbdGFyZ2V0X2xheWVyXSA9IHZpZGVvLT5jdXJyVGltZXN0YW1wID0gdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnRpbWVTdGFtcDsKLSNpZmRlZiBQVl9NRU1PUllfUE9PTAotICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT55Q2hhbiA9IChQSVhFTCAqKWN1cnJZVVY7Ci0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnVDaGFuID0gKFBJWEVMICopY3VycllVViArIGRlY0N0cmwtPnNpemU7Ci0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnZDaGFuID0gKFBJWEVMICopKHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT51Q2hhbikgKyAoZGVjQ3RybC0+c2l6ZSA+PiAyKTsKLSNlbHNlCi0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnlDaGFuID0gY3VyclZvcC0+eUNoYW47Ci0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnVDaGFuID0gY3VyclZvcC0+dUNoYW47Ci0gICAgdm9wSGVhZGVyW3RhcmdldF9sYXllcl0tPnZDaGFuID0gY3VyclZvcC0+dkNoYW47Ci0jZW5kaWYKLSAgICBvc2NsX21lbWNweShjdXJyVm9wLCB2b3BIZWFkZXJbdGFyZ2V0X2xheWVyXSwgc2l6ZW9mKFZvcCkpOwotCi0jaWZkZWYgUFZfU1VQUE9SVF9URU1QT1JBTF9TQ0FMQUJJTElUWQotICAgIHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT50aW1lU3RhbXAgPSAtMTsKLSNlbmRpZgotICAgIC8qIHB1dCBoZWFkZXIgaW5mbyBpbnRvIHRoZSBzdHJ1Y3R1cmUgKi8KLSAgICBoZWFkZXJfaW5mby0+Y3VyckxheWVyID0gdGFyZ2V0X2xheWVyOwotICAgIGhlYWRlcl9pbmZvLT50aW1lc3RhbXAgPSB2aWRlby0+Y3VyclRpbWVzdGFtcDsKLSAgICBoZWFkZXJfaW5mby0+ZnJhbWVUeXBlID0gKE1QNEZyYW1lVHlwZSljdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKLSAgICBoZWFkZXJfaW5mby0+cmVmU2VsQ29kZSA9IHZvcEhlYWRlclt0YXJnZXRfbGF5ZXJdLT5yZWZTZWxlY3RDb2RlOwotICAgIGhlYWRlcl9pbmZvLT5xdWFudGl6ZXIgPSBjdXJyVm9wLT5xdWFudGl6ZXI7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIHJldHVybiBQVl9UUlVFOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZEZWNvZGVWb3BCb2R5KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlY29kZSB2b3AgYm9keSBhZnRlciB0aGUgaGVhZGVyIGlzIGRlY29kZWQsIG1vZGlmaWVkIGZyb20gICAqLwotLyogICAgICAgICAgICAgIG9yaWdpbmFsIFBWRGVjb2RlVmlkZW9GcmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBQVkRlY29kZVZvcEJvZHkoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50MzIgYnVmZmVyX3NpemVbXSkKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfRkFJTDsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludCB0YXJnZXRfbGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOwotICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbdGFyZ2V0X2xheWVyXTsKLSAgICBWb3AgKmN1cnJWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICBWb3AgKnByZXZWb3AgPSB2aWRlby0+cHJldlZvcDsKLSAgICBWb3AgKnRlbXBWb3BQdHI7Ci0gICAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsgLyogUmVjb3JkIGhvdyBtYW55IGJpdHMgd2UgdXNlZCBpbiB0aGUgYnVmZmVyLiAgIDA0LzI0LzIwMDEgKi8KLQotICAgIGludCBpZHg7Ci0KLSAgICBpZiAoY3VyclZvcC0+dm9wQ29kZWQgPT0gMCkgICAgICAgICAgICAgICAgICAvKiAgMDcvMDMvMjAwMSAqLwotICAgIHsKLSAgICAgICAgUFZfQml0c3RyZWFtQnl0ZUFsaWduKGN1cnJWb2wtPmJpdHN0cmVhbSk7Ci0gICAgICAgIC8qIFdlIHNob3VsZCBhbHdheXMgY2xlYXIgdXAgYml0c3RyZWFtIGJ1ZmZlci4gICAxMC8xMC8yMDAwICovCi0gICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gKGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKSArIDcpID4+IDM7Ci0KLSAgICAgICAgaWYgKGJ5dGVzX2NvbnN1bWVkID4gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPCBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJZiB3ZSBvbmx5IGNvbnN1bWUgcGFydCBvZiB0aGUgYml0cyBpbiB0aGUgYnVmZmVyLCB0YWtlIHRob3NlICovCi0gICAgICAgICAgICAvKiAgb3V0LiAgICAgMDQvMjQvMjAwMSAqLwotICAgICAgICAgICAgLyogICAgICAgICAgb3NjbF9tZW1jcHkoYnVmZmVyW3RhcmdldF9sYXllcl0sIGJ1ZmZlclt0YXJnZXRfbGF5ZXJdK2J5dGVzX2NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdLT1ieXRlc19jb25zdW1lZCkpOyAqLwotICAgICAgICAgICAgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSAtPSBieXRlc19jb25zdW1lZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1ZmZlcl9zaXplW3RhcmdldF9sYXllcl0gPSAwOwotICAgICAgICB9Ci0jaWZkZWYgUFZfTUVNT1JZX1BPT0wKLQotICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPiB2aWRlby0+cHJldlZvcC0+dGltZVN0YW1wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCF2aWRlby0+cHJldlZvcC0+eUNoYW4pIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzM1MjY5NjM1Iik7Ci0gICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjM1MjY5NjM1Iik7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3NjbF9tZW1jcHkoY3VyclZvcC0+eUNoYW4sIHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiwgKGRlY0N0cmwtPnNpemUqMykgLyAyKTsKLQotICAgICAgICB2aWRlby0+cHJldlZvcCA9IHByZXZWb3A7Ci0KLSAgICAgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IGN1cnJWb3AtPnlDaGFuOyAgICAgICAvKiAgMDcvMDcvMjAwMSAqLwotCi0gICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsgLyogIDA3LzA5LzAxICovCi0KLSAgICAgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSBjdXJyVm9wLT55Q2hhbjsKLQotICAgICAgICAvKiBTd2FwIFZPUCBwb2ludGVycy4gIE5vIGVuaGMuIGZyYW1lIG9zY2xfbWVtY3B5KCkgYW55bW9yZSEgICAwNC8yNC8yMDAxICovCi0gICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AgPSB2aWRlby0+Y3VyclZvcDsKLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldlZvcDsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcCA9IHRlbXBWb3BQdHI7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpICAgICAgIC8qIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGZsYXNoYmFjayBwcm9ibGVtcyAgIDA2LzIxLzIwMDIqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA9IGN1cnJWb3AtPnRpbWVTdGFtcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXAgPSBjdXJyVm9wLT50aW1lU3RhbXA7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gY3VyclZvcC0+cHJlZGljdGlvblR5cGU7IC8qICAwNy8wOS8wMSAqLwotICAgICAgICAvKiB0aGUgZm9sbG93aW5nIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBkaXNwbGF5aW5nIGFuIG5vdENvZGVkIEktVk9QIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBzZXNzaW9uCi0gICAgICAgIG9yIGFmdGVyIHJhbmRvbSBwb3NpdGlvbmluZyAgMDcvMDMvMDIqLwotICAgICAgICBpZiAoY3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT52b3BfY29kaW5nX3R5cGUgPSBQX1ZPUDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcmV0dXJuIFBWX1RSVUU7Ci0gICAgfQotICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSAgICAvKiAgRGVjb2RlIHZvcCBib2R5IChpZiB0aGVyZSBpcyBubyBlcnJvciBpbiB0aGUgaGVhZGVyISkgICovCi0gICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0gICAgLyogZmlyc3QsIHdlIG5lZWQgdG8gc2VsZWN0IGEgcmVmZXJlbmNlIGZyYW1lICovCi0gICAgaWYgKGRlY0N0cmwtPm5MYXllcnMgPiAxKQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkbyBub3RoaW5nIGhlcmUgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBQX1ZPUCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChjdXJyVm9wLT5yZWZTZWxlY3RDb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMCA6IC8qIG1vc3QgcmVjZW50bHkgZGVjb2RlZCBlbmhhbmNlbWVudCB2b3AgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogU2V0dXAgdmlkZW8tPnByZXZWb3AgYmVmb3JlIHdlIGNhbGwgUFZfRGVjb2RlVm9wKCkuICAgMDQvMjQvMjAwMSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT50aW1lU3RhbXAgPj0gdmlkZW8tPnByZXZWb3AtPnRpbWVTdGFtcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2Vm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgMSA6IC8qIG1vc3QgcmVjZW50bHkgZGlzcGxheWVkIGJhc2UtbGF5ZXIgdm9wICovCi0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRfbGF5ZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnRpbWVTdGFtcCA+IHZpZGVvLT5wcmV2Vm9wLT50aW1lU3RhbXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZWb3AgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDIgOiAvKiBuZXh0IGJhc2UtbGF5ZXIgdm9wIGluIGRpc3BsYXkgb3JkZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDMgOiAvKiB0ZW1wb3JhbGx5IGNvaW5jaWRlbnQgYmFzZS1sYXllciB2b3AgKG5vIE1WJ3MpICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogd2UgaGF2ZSBhIEItVm9wICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1wNGRlY19sb2coIkRlY29kZVZpZGVvRnJhbWUoKTogQi1WT1Agbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhpcyBpcyBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSBmcmFtZSByYXRlIGFuZCBiaXRyYXRlLiAqLwotICAgIGlkeCA9ICsrdmlkZW8tPmZyYW1lX2lkeCAlIEJJVFJBVEVfQVZFUkFHRV9XSU5ET1c7Ci0KLSAgICAvKiBDYWxjdWxhdGUgYml0cmF0ZSBmb3IgdGhpcyBsYXllci4gICAwOC8yMy8yMDAwICovCi0gICAgc3RhdHVzID0gUFZfRGVjb2RlVm9wKHZpZGVvKTsKLSAgICB2aWRlby0+bkJpdHNQZXJWb3BbaWR4XSA9IGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKTsKLSAgICB2aWRlby0+cHJldlRpbWVzdGFtcFtpZHhdID0gY3VyclZvcC0+dGltZVN0YW1wOwotCi0gICAgLyogcmVzdG9yZSB2aWRlby0+cHJldlZvcCBhZnRlciBQVl9EZWNvZGVWb3AoKS4gICAwNC8yNC8yMDAxICovCi0vLyAgaWYgKGN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPT0gMCkgdmlkZW8tPnByZXZWb3AgPSBwcmV2Vm9wOwotICAgIHZpZGVvLT5wcmV2Vm9wID0gcHJldlZvcDsKLQotICAgIC8qIEVzdGltYXRlIHRoZSBmcmFtZSByYXRlLiAgIDA4LzIzLzIwMDAgKi8KLSAgICB2aWRlby0+ZHVyYXRpb24gPSB2aWRlby0+cHJldlRpbWVzdGFtcFtpZHhdOwotICAgIHZpZGVvLT5kdXJhdGlvbiAtPSB2aWRlby0+cHJldlRpbWVzdGFtcFsoKytpZHgpJUJJVFJBVEVfQVZFUkFHRV9XSU5ET1ddOwotICAgIGlmICh2aWRlby0+ZHVyYXRpb24gPiAwKQotICAgIHsgLyogT25seSB1cGRhdGUgZnJhbWVyYXRlIHdoZW4gdGhlIHRpbWVzdGFtcCBpcyByaWdodCAqLwotICAgICAgICB2aWRlby0+ZnJhbWVSYXRlID0gKGludCkoRlJBTUVSQVRFX1NDQUxFKSAvIHZpZGVvLT5kdXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKiBXZSBzaG91bGQgYWx3YXlzIGNsZWFyIHVwIGJpdHN0cmVhbSBidWZmZXIuICAgMTAvMTAvMjAwMCAqLwotICAgIGJ5dGVzX2NvbnN1bWVkID0gKGdldFBvaW50ZXIoY3VyclZvbC0+Yml0c3RyZWFtKSArIDcpID4+IDM7IC8qICAxMS80LzAzICovCi0KLSAgICBpZiAoYnl0ZXNfY29uc3VtZWQgPiBjdXJyVm9sLT5iaXRzdHJlYW0tPmRhdGFfZW5kX3BvcykKLSAgICB7Ci0gICAgICAgIGJ5dGVzX2NvbnN1bWVkID0gY3VyclZvbC0+Yml0c3RyZWFtLT5kYXRhX2VuZF9wb3M7Ci0gICAgfQotCi0gICAgaWYgKGJ5dGVzX2NvbnN1bWVkIDwgYnVmZmVyX3NpemVbdGFyZ2V0X2xheWVyXSkKLSAgICB7Ci0gICAgICAgIC8qIElmIHdlIG9ubHkgY29uc3VtZSBwYXJ0IG9mIHRoZSBiaXRzIGluIHRoZSBidWZmZXIsIHRha2UgdGhvc2UgKi8KLSAgICAgICAgLyogIG91dC4gICAgIDA0LzI0LzIwMDEgKi8KLSAgICAgICAgLyogICAgICBvc2NsX21lbWNweShidWZmZXJbdGFyZ2V0X2xheWVyXSwgYnVmZmVyW3RhcmdldF9sYXllcl0rYnl0ZXNfY29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgIChidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdLT1ieXRlc19jb25zdW1lZCkpOyAqLwotICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdIC09IGJ5dGVzX2NvbnN1bWVkOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBidWZmZXJfc2l6ZVt0YXJnZXRfbGF5ZXJdID0gMDsKLSAgICB9Ci0gICAgc3dpdGNoIChzdGF0dXMpCi0gICAgewotICAgICAgICBjYXNlIFBWX0ZBSUwgOgotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOyAgICAgICAgLyogdGhpcyB3aWxsIHRha2UgY2FyZSBvZiBjb25jZWFsbWVudCBpZiB3ZSBsb3NlIHdob2xlIGZyYW1lICAqLwotCi0gICAgICAgIGNhc2UgUFZfRU5EX09GX1ZPUCA6Ci0gICAgICAgICAgICAvKiB3ZSBtYXkgd2FudCB0byBkaWZmZXJlbmNpYXRlIFBWX0VORF9PRl9WT1AgYW5kIFBWX1NVQ0NFU1MgKi8KLSAgICAgICAgICAgIC8qICAgIGluIHRoZSBmdXR1cmUuICAgICAwNS8xMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgY2FzZSBQVl9TVUNDRVNTIDoKLSAgICAgICAgICAgIC8qIE5vaHRpbmcgaXMgd3JvbmcgOikuICovCi0KLQotICAgICAgICAgICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsgICAgICAgLyogIDA3LzA3LzIwMDEgKi8KLQotICAgICAgICAgICAgdmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsgLyogIDA3LzA5LzAxICovCi0KLSAgICAgICAgICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOwotCi0gICAgICAgICAgICAvKiBTd2FwIFZPUCBwb2ludGVycy4gIE5vIGVuaGMuIGZyYW1lIG9zY2xfbWVtY3B5KCkgYW55bW9yZSEgICAwNC8yNC8yMDAxICovCi0gICAgICAgICAgICBpZiAodGFyZ2V0X2xheWVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldkVuaGNWb3A7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wVm9wUHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBWb3BQdHIgPSB2aWRlby0+cHJldlZvcDsKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldlZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcFZvcFB0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQgOgotICAgICAgICAgICAgLyogVGhpcyB3aWxsIG5ldmVyIGhhcHBlbiAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLSNpZmRlZiBQVl9NRU1PUllfUE9PTAotT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZTZXRSZWZlcmVuY2VZVVYoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKllVVikKLXsKLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKWRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGE7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gKFBJWEVMICopWVVWOwotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IChQSVhFTCAqKVlVViArIHZpZGVvLT5zaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IChQSVhFTCAqKXZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChkZWNDdHJsLT5zaXplID4+IDIpOwotICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiwgMTYsIHNpemVvZih1aW50OCkqZGVjQ3RybC0+c2l6ZSk7ICAgICAvKiAgMTAvMzEvMDEgKi8KLSAgICBvc2NsX21lbXNldCh2aWRlby0+cHJldlZvcC0+dUNoYW4sIDEyOCwgc2l6ZW9mKHVpbnQ4KSpkZWNDdHJsLT5zaXplIC8gMik7Ci0gICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsgICAgICAgICAgICAgICAvKiAgMDcvMDcvMjAwMSAqLwotICAgIGRlY0N0cmwtPm91dHB1dEZyYW1lID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuOyAgICAgICAgICAgICAgLyogIDA2LzE5LzIwMDIgKi8KLX0KLSNlbmRpZgotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogVmlkZW9EZWNvZGVyRXJyb3JEZXRlY3RlZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNi8yMC8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5dGltZSBhbiBlcnJvciBpbnQgdGhlICAgICAgKi8KLS8qICAgICAgICAgICAgICBiaXRzdHJlYW0gaXMgZGV0ZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdWludCBWaWRlb0RlY29kZXJFcnJvckRldGVjdGVkKFZpZGVvRGVjRGF0YSAqKQotewotICAgIC8qIFRoaXMgaXMgb25seSB1c2VkIGZvciB0cmFwcGluZyBiaXRzdHJlYW0gZXJyb3IgZm9yIGRlYnVnaW5nICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBFTkFCTEVfTE9HCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogbTR2ZGVjX2RwcmludGYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8xNS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFRoaXMgaXMgYSBmdW5jdGlvbiB0aGF0IGxvZ3MgbWVzc2FnZXMgaW4gdGhlIG1wZWc0IHZpZGVvICAgICAqLwotLyogICAgICAgICAgICAgZGVjb2Rlci4gIFdlIGNhbiBjYWxsIHRoZSBzdGFuZGFyZCBQYWNrZXRWaWRlbyBQVk1lc3NhZ2UgICAgICovCi0vKiAgICAgICAgICAgICBmcm9tIGluc2lkZSB0aGlzIGZ1bmN0aW9uIGlmIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiBUbyB0dXJuIG9uIHRoZSBsb2dnaW5nLCBMT0dfTVA0REVDX01FU1NBR0UgbXVzdCBiZSBkZWZpbmVkICAgKi8KLS8qICAgICAgICAgICAgICB3aGVuIGNvbXBpbGluZyB0aGlzIGZpbGUgKG9ubHkgdGhpcyBmaWxlKS4gICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXZvaWQgbTR2ZGVjX2RwcmludGYoY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gICAgRklMRSAqbG9nX2ZwOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotCi0gICAgLyogb3BlbiB0aGUgbG9nIGZpbGUgKi8KLSAgICBsb2dfZnAgPSBmb3BlbigiXFxtcDRkZWNfbG9nLnR4dCIsICJhKyIpOwotICAgIGlmIChsb2dfZnAgPT0gTlVMTCkgcmV0dXJuOwotICAgIC8qIG91dHB1dCB0aGUgbWVzc2FnZSAqLwotICAgIHZmcHJpbnRmKGxvZ19mcCwgZm9ybWF0LCBhcmdzKTsKLSAgICBmY2xvc2UobG9nX2ZwKTsKLQotICAgIHZhX2VuZChhcmdzKTsKLX0KLSNlbmRpZgotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogSXNJbnRyYUZyYW1lKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNS8yOS8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBUaGUgbW9zdCByZWNlbnRseSBkZWNvZGVkIGZyYW1lIGlzIGFuIEludHJhIGZyYW1lLiAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLUJvb2wgSXNJbnRyYUZyYW1lKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwpCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHJldHVybiAodmlkZW8tPnZvcF9jb2RpbmdfdHlwZSA9PSBJX1ZPUCk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZEZWNQb3N0UHJvY2VzcygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwMS8wOS8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFBvc3RQcm9jZXNzIG9uZSB2aWRlbyBmcmFtZSBhbmQgcmV0dXJuIGEgWVVWLTEyIGltYWdlLiAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOb3RlICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXZvaWQgUFZEZWNQb3N0UHJvY2VzcyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqb3V0cHV0WVVWKQotewotICAgIHVpbnQ4ICpvdXRwdXRCdWZmZXI7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludDMyIHRtcHZhcjsKLSAgICBpZiAob3V0cHV0WVVWKQotICAgIHsKLSAgICAgICAgb3V0cHV0QnVmZmVyID0gb3V0cHV0WVVWOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBkZWNDdHJsLT5vdXRwdXRGcmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUpCi0gICAgewotICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcsICAqLwotICAgICAgICBQb3N0RmlsdGVyKHZpZGVvLCB2aWRlby0+cG9zdEZpbHRlclR5cGUsIG91dHB1dEJ1ZmZlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChvdXRwdXRZVVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZGVjb2RlZCBmcmFtZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgIHRtcHZhciA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotICAgICAgICAgICAgb3NjbF9tZW1jcHkob3V0cHV0QnVmZmVyLCBkZWNDdHJsLT5vdXRwdXRGcmFtZSwgdG1wdmFyKjMgLyAyKTsgICAgICAgICAgIC8qICAzLzMvMDEgKi8KLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgb3V0cHV0QnVmZmVyID0gZGVjQ3RybC0+b3V0cHV0RnJhbWU7Ci0gICAgb3V0cHV0WVVWOwotI2VuZGlmCi0gICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSBvdXRwdXRCdWZmZXI7Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZEZWNTZXRSZWZlcmVuY2UoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgdWludDggKnJlZllVViwgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHRpbWVzdGFtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA3LzIyLzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogR2V0IFlVViByZWZlcmVuY2UgZnJhbWUgZnJvbSBleHRlcm5hbCBzb3VyY2UuICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiBZVVYgNC0yLTAgZnJhbWUgY29udGFpbmluZyBuZXcgcmVmZXJlbmNlIGZyYW1lIGluIHRoZSBzYW1lICAgKi8KLS8qICAgOiBkaW1lbnNpb24gYXMgb3JpZ2luYWwsIGkuZS4sIGRvZXNuJ3QgaGF2ZSB0byBiZSBtdWx0aXBsZSBvZiAxNiAhISEuICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWRGVjU2V0UmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsIHVpbnQzMiB0aW1lc3RhbXApCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBWb3AgKnByZXZWb3AgPSB2aWRlby0+cHJldlZvcDsKLSAgICBpbnQgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgdWludDggKmRzdFB0ciwgKm9yZ1B0ciwgKmRzdFB0cjIsICpvcmdQdHIyOwotICAgIGludDMyIHNpemUgPSAoaW50MzIpd2lkdGggKiB2aWRlby0+aGVpZ2h0OwotCi0KLSAgICAvKiBzZXQgbmV3IHBhcmFtZXRlcnMgKi8KLSAgICBwcmV2Vm9wLT50aW1lU3RhbXAgPSB0aW1lc3RhbXA7Ci0gICAgcHJldlZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKLQotICAgIGRzdFB0ciA9IHByZXZWb3AtPnlDaGFuOwotICAgIG9yZ1B0ciA9IHJlZllVVjsKLSAgICBvc2NsX21lbWNweShkc3RQdHIsIG9yZ1B0ciwgc2l6ZSk7Ci0gICAgZHN0UHRyID0gcHJldlZvcC0+dUNoYW47Ci0gICAgZHN0UHRyMiA9IHByZXZWb3AtPnZDaGFuOwotICAgIG9yZ1B0ciA9IHJlZllVViArIHNpemU7Ci0gICAgb3JnUHRyMiA9IG9yZ1B0ciArIChzaXplID4+IDIpOwotICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCAoc2l6ZSA+PiAyKSk7Ci0gICAgb3NjbF9tZW1jcHkoZHN0UHRyMiwgb3JnUHRyMiwgKHNpemUgPj4gMikpOwotCi0gICAgdmlkZW8tPmNvbmNlYWxGcmFtZSA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbjsKLSAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gSV9WT1A7Ci0gICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSB2aWRlby0+cHJldlZvcC0+eUNoYW47Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkRlY1NldEVuaFJlZmVyZW5jZShWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqcmVmWVVWLCAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHRpbWVzdGFtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA3LzIzLzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogR2V0IFlVViBlbmhhbmNlIHJlZmVyZW5jZSBmcmFtZSBmcm9tIGV4dGVybmFsIHNvdXJjZS4gICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiBZVVYgNC0yLTAgZnJhbWUgY29udGFpbmluZyBuZXcgcmVmZXJlbmNlIGZyYW1lIGluIHRoZSBzYW1lICAgKi8KLS8qICAgOiBkaW1lbnNpb24gYXMgb3JpZ2luYWwsIGkuZS4sIGRvZXNuJ3QgaGF2ZSB0byBiZSBtdWx0aXBsZSBvZiAxNiAhISEuICAqLwotLyogIFJldHVybiAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTm90ZSAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1Cb29sIFBWRGVjU2V0RW5oUmVmZXJlbmNlKFZpZGVvRGVjQ29udHJvbHMgKmRlY0N0cmwsIHVpbnQ4ICpyZWZZVVYsIHVpbnQzMiB0aW1lc3RhbXApCi17Ci0gICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKikgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YTsKLSAgICBWb3AgKnByZXZFbmhjVm9wID0gdmlkZW8tPnByZXZFbmhjVm9wOwotICAgIHVpbnQ4ICpkc3RQdHIsICpvcmdQdHIsICpkc3RQdHIyLCAqb3JnUHRyMjsKLSAgICBpbnQzMiBzaXplID0gKGludDMyKSB2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotCi0gICAgaWYgKHZpZGVvLT5udW1iZXJPZkxheWVycyA8PSAxKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0KLQotICAgIC8qIHNldCBuZXcgcGFyYW1ldGVycyAqLwotICAgIHByZXZFbmhjVm9wLT50aW1lU3RhbXAgPSB0aW1lc3RhbXA7Ci0gICAgcHJldkVuaGNWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7Ci0KLSAgICBkc3RQdHIgPSBwcmV2RW5oY1ZvcC0+eUNoYW47Ci0gICAgb3JnUHRyID0gcmVmWVVWOwotICAgIG9zY2xfbWVtY3B5KGRzdFB0ciwgb3JnUHRyLCBzaXplKTsKLSAgICBkc3RQdHIgPSBwcmV2RW5oY1ZvcC0+dUNoYW47Ci0gICAgZHN0UHRyMiA9IHByZXZFbmhjVm9wLT52Q2hhbjsKLSAgICBvcmdQdHIgPSByZWZZVVYgKyBzaXplOwotICAgIG9yZ1B0cjIgPSBvcmdQdHIgKyAoc2l6ZSA+PiAyKTsKLSAgICBvc2NsX21lbWNweShkc3RQdHIsIG9yZ1B0ciwgKHNpemUgPj4gMikpOwotICAgIG9zY2xfbWVtY3B5KGRzdFB0cjIsIG9yZ1B0cjIsIChzaXplID4+IDIpKTsKLSAgICB2aWRlby0+Y29uY2VhbEZyYW1lID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbjsKLSAgICB2aWRlby0+dm9wX2NvZGluZ190eXBlID0gSV9WT1A7Ci0gICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuOwotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldFZvbEluZm8oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzA2LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogR2V0IHRoZSB2b2wgaW5mbyhvbmx5IGJhc2UtbGF5ZXIpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAwNi8yNC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotQm9vbCBQVkdldFZvbEluZm8oVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgVm9sSW5mbyAqcFZvbEluZm8pCi17Ci0gICAgVm9sICpjdXJyVm9sOwotCi0gICAgaWYgKHBWb2xJbmZvID09IE5VTEwgfHwgZGVjQ3RybCA9PSBOVUxMIHx8IGRlY0N0cmwtPnZpZGVvRGVjb2RlckRhdGEgPT0gTlVMTCB8fAotICAgICAgICAgICAgKChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhKS0+dm9sWzBdID09IE5VTEwpIHJldHVybiBQVl9GQUxTRTsKLQotICAgIGN1cnJWb2wgPSAoKFZpZGVvRGVjRGF0YSAqKShkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhKSktPnZvbFswXTsKLQotICAgIC8vIGdldCB0aGUgVk9MIGluZm8KLSAgICBwVm9sSW5mby0+c2hvcnRWaWRlb0hlYWRlciA9IChpbnQzMikoKFZpZGVvRGVjRGF0YSAqKShkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhKSktPnNob3J0VmlkZW9IZWFkZXI7Ci0gICAgcFZvbEluZm8tPmRhdGFQYXJ0aXRpb25pbmcgPSAoaW50MzIpY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZzsKLSAgICBwVm9sSW5mby0+ZXJyb3JSZXNEaXNhYmxlICA9IChpbnQzMiljdXJyVm9sLT5lcnJvclJlc0Rpc2FibGU7Ci0gICAgcFZvbEluZm8tPnVzZVJldmVyc2VWTEMgICAgPSAoaW50MzIpY3VyclZvbC0+dXNlUmV2ZXJzZVZMQzsKLSAgICBwVm9sSW5mby0+c2NhbGFiaWxpdHkgICAgICA9IChpbnQzMiljdXJyVm9sLT5zY2FsYWJpbGl0eTsKLSAgICBwVm9sSW5mby0+bmJpdHNUaW1lSW5jUmVzICA9IChpbnQzMiljdXJyVm9sLT5uYml0c1RpbWVJbmNSZXM7Ci0gICAgcFZvbEluZm8tPnByb2ZpbGVfbGV2ZWxfaWQgPSAoaW50MzIpY3VyclZvbC0+cHJvZmlsZV9sZXZlbF9pZDsKLQotICAgIHJldHVybiBQVl9UUlVFOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3NTNlNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiTXBlZzRIMjYzRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAiTXBlZzRIMjYzRGVjb2RlclRlc3QuY3BwIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjU3MmIwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wZWc0SDI2MyBEZWNvZGVyIHVuaXQgdGVzdHMiPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KLSAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcGVnNEgyNjNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKLSAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvTXBlZzRIMjYzRGVjb2Rlci0xLjEuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0UmVzLyIgLz4KLSAgICA8L3RhcmdldF9wcmVwYXJlcj4KLQotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdFJlcy8iIC8+Ci0gICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCmluZGV4IGI4YmMyNGUuLmQxMGU0MGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKQEAgLTEsNTkgKzEsMjAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKLSAgICBdLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9iaXRzdHJlYW1faW8uY3BwIiwKLSAgICAgICAgInNyYy9jb21iaW5lZF9lbmNvZGUuY3BwIiwgInNyYy9kYXRhcGFydF9lbmNvZGUuY3BwIiwKLSAgICAgICAgInNyYy9kY3QuY3BwIiwKLSAgICAgICAgInNyYy9maW5kaGFsZnBlbC5jcHAiLAotICAgICAgICAic3JjL2Zhc3Rjb2RlbWIuY3BwIiwKLSAgICAgICAgInNyYy9mYXN0aWRjdC5jcHAiLAotICAgICAgICAic3JjL2Zhc3RxdWFudC5jcHAiLAotICAgICAgICAic3JjL21lX3V0aWxzLmNwcCIsCi0gICAgICAgICJzcmMvbXA0ZW5jX2FwaS5jcHAiLAotICAgICAgICAic3JjL3JhdGVfY29udHJvbC5jcHAiLAotICAgICAgICAic3JjL21vdGlvbl9lc3QuY3BwIiwKLSAgICAgICAgInNyYy9tb3Rpb25fY29tcC5jcHAiLAotICAgICAgICAic3JjL3NhZC5jcHAiLAotICAgICAgICAic3JjL3NhZF9oYWxmcGVsLmNwcCIsCi0gICAgICAgICJzcmMvdmxjX2VuY29kZS5jcHAiLAotICAgICAgICAic3JjL3ZvcC5jcHAiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EQlhfUkMiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLQotICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotfQotCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE1QRUc0RW5jb2Rlci5jcHAiXSwKIAotICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLURCWF9SQyIsCiAgICAgXSwKQEAgLTY3LDI5ICsyOCwzIEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQotCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmNfdGVzdCIsCi0gICAgZ3Rlc3Q6IGZhbHNlLAotCi0gICAgc3JjczogWyJ0ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcCJdLAotCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItREJYX1JDIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0KLSAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIl0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAppbmRleCBmYTdkYjgxLi5mYjZjNGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKQEAgLTUyOCw2ICs1MjgsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRlbmNfYXBpLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU0ZmRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL21wNGVuY19hcGkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMxMCArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaW5jbHVkZSAibXA0ZW5jX2xpYi5oIgotI2luY2x1ZGUgImJpdHN0cmVhbV9pby5oIgotI2luY2x1ZGUgInJhdGVfY29udHJvbC5oIgotI2luY2x1ZGUgIm00dmVuY19vc2NsLmgiCi0KLSNpZm5kZWYgSU5UMzJfTUFYCi0jZGVmaW5lIElOVDMyX01BWCAweDdmZmZmZmZmCi0jZW5kaWYKLQotI2lmbmRlZiBTSVpFX01BWAotI2RlZmluZSBTSVpFX01BWCAoKHNpemVfdCkgLTEpCi0jZW5kaWYKLQotLyogSW52ZXJzZSBub3JtYWwgemlnemFnICovCi1jb25zdCBzdGF0aWMgSW50IHppZ3phZ19pW05DT0VGRl9CTE9DS10gPQotewotICAgIDAsIDEsIDgsIDE2LCA5LCAyLCAzLCAxMCwKLSAgICAxNywgMjQsIDMyLCAyNSwgMTgsIDExLCA0LCA1LAotICAgIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKLSAgICAyNywgMjAsIDEzLCA2LCA3LCAxNCwgMjEsIDI4LAotICAgIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKLSAgICAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCi0gICAgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAotICAgIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MwotfTsKLQotLyogSU5UUkEgKi8KLWNvbnN0IHN0YXRpYyBJbnQgbXBlZ19pcW1hdF9kZWZbTkNPRUZGX0JMT0NLXSA9Ci0gICAgeyAgOCwgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsCi0gICAgICAgMTcsIDE4LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI4LAotICAgICAgIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwKLSAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsCi0gICAgICAgMjIsIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LAotICAgICAgIDIzLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwKLSAgICAgICAyNSwgMjYsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsCi0gICAgICAgMjcsIDI4LCAzMCwgMzIsIDM1LCAzOCwgNDEsIDQ1Ci0gICAgfTsKLQotLyogSU5URVIgKi8KLWNvbnN0IHN0YXRpYyBJbnQgbXBlZ19ucW1hdF9kZWZbNjRdICA9Ci0gICAgeyAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsCi0gICAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCi0gICAgICAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsCi0gICAgICAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNiwgMjcsCi0gICAgICAyMCwgMjEsIDIyLCAyMywgMjUsIDI2LCAyNywgMjgsCi0gICAgICAyMSwgMjIsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMzAsCi0gICAgICAyMiwgMjMsIDI0LCAyNiwgMjcsIDI4LCAzMCwgMzEsCi0gICAgICAyMywgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMKLSAgICB9OwotCi0vKiBQcm9maWxlcyBhbmQgbGV2ZWxzICovCi0vKiBTaW1wbGUgcHJvZmlsZShsZXZlbCAwLTMpIGFuZCBDb3JlIHByb2ZpbGUgKGxldmVsIDEtMikgKi8KLS8qIHtTUEwwLCBTUEwxLCBTUEwyLCBTUEwzLCBDUEwxLCBDUEwyLCBDUEwyLCBDUEwyfSAsIFNQTDA6IFNpbXBsZSBQcm9maWxlQExldmVsMCwgQ1BMMTogQ29yZSBQcm9maWxlQExldmVsMSwgdGhlIGxhc3QgdHdvIGFyZSByZWR1bmRhbnQgZm9yIGVhc3kgdGFibGUgbWFuaXB1bGF0aW9uICovCi1jb25zdCBzdGF0aWMgSW50IHByb2ZpbGVfbGV2ZWxfY29kZVs4XSA9Ci17Ci0gICAgMHgwOCwgMHgwMSwgMHgwMiwgMHgwMywgMHgyMSwgMHgyMiwgMHgyMiwgMHgyMgotfTsKLQotY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzhdID0KLXsKLSAgICA2NDAwMCwgNjQwMDAsIDEyODAwMCwgMzg0MDAwLCAzODQwMDAsIDIwMDAwMDAsIDIwMDAwMDAsIDIwMDAwMDAKLX07Ci0KLWNvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbOF0gPQotewotICAgIDIwNDgsIDIwNDgsIDQwOTYsIDgxOTIsIDQwOTYsIDgxOTIsIDgxOTIsIDgxOTIKLX07Ci0KLWNvbnN0IHN0YXRpYyBJbnQgcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjWzhdID0KLXsKLSAgICAxNDg1LCAxNDg1LCA1OTQwLCAxMTg4MCwgNTk0MCwgMjM3NjAsIDIzNzYwLCAyMzc2MAotfTsKLQotY29uc3Qgc3RhdGljIEludCBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs4XSA9Ci17Ci0gICAgMTYzODQwLCAxNjM4NDAsIDY1NTM2MCwgNjU1MzYwLCAyNjIxNDQsIDEzMTA3MjAsIDEzMTA3MjAsIDEzMTA3MjAKLX07Ci0KLQotLyogU2ltcGxlIHNjYWxhYmxlIHByb2ZpbGUgKGxldmVsIDAtMikgYW5kIENvcmUgc2NhbGFibGUgcHJvZmlsZSAobGV2ZWwgMS0zKSAqLwotLyoge1NTUEwwLCBTU1BMMSwgU1NQTDIsIFNTUEwyLCBDU1BMMSwgQ1NQTDIsIENTUEwzLCBDU1BMM30gLCBTU1BMMDogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGVATGV2ZWwwLCBDU1BMMTogQ29yZSBTY2FsYWJsZSBQcm9maWxlQExldmVsMSwgdGhlIGZvdXJ0aCBpcyByZWR1bmRhbnQgZm9yIGVhc3kgdGFibGUgbWFuaXB1bGF0aW9uICovCi0KLWNvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlWzhdID0KLXsKLSAgICAweDEwLCAweDExLCAweDEyLCAweDEyLCAweEExLCAweEEyLCAweEEzLCAweEEzCi19OwotCi1jb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbOF0gPQotewotICAgIDEyODAwMCwgMTI4MDAwLCAyNTYwMDAsIDI1NjAwMCwgNzY4MDAwLCAxNTAwMDAwLCA0MDAwMDAwLCA0MDAwMDAwCi19OwotCi0vKiBpbiBiaXRzICovCi1jb25zdCBzdGF0aWMgSW50IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplWzhdID0KLXsKLSAgICAyMDQ4LCAyMDQ4LCA0MDk2LCA0MDk2LCA0MDk2LCA0MDk2LCAxNjM4NCwgMTYzODQKLX07Ci0KLWNvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjWzhdID0KLXsKLSAgICAxNDg1LCA3NDI1LCAyMzc2MCwgMjM3NjAsIDE0ODUwLCAyOTcwMCwgMTIwOTYwLCAxMjA5NjAKLX07Ci0KLWNvbnN0IHN0YXRpYyBJbnQgc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbOF0gPQotewotICAgIDE2Mzg0MCwgNjU1MzYwLCA2NTUzNjAsIDY1NTM2MCwgMTA0ODU3NiwgMTMxMDcyMCwgMTMxMDcyMCwgMTMxMDcyMAotfTsKLQotCi0vKiBIMjYzIHByb2ZpbGUgMCBAIGxldmVsIDEwLTcwICovCi1jb25zdCBzdGF0aWMgSW50ICAgaDI2M0xldmVsWzhdID0gezAsIDEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwfTsKLWNvbnN0IHN0YXRpYyBmbG9hdCByQlJfYm91bmRbOF0gPSB7MCwgMSwgMiwgNiwgMzIsIDY0LCAxMjgsIDI1Nn07Ci1jb25zdCBzdGF0aWMgZmxvYXQgbWF4X2gyNjNfZnJhbWVyYXRlWzJdID0geyhmbG9hdCkzMDAwMCAvIChmbG9hdCkyMDAyLAotICAgICAgICAoZmxvYXQpMzAwMDAgLyAoZmxvYXQpMTAwMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci1jb25zdCBzdGF0aWMgSW50ICAgbWF4X2gyNjNfd2lkdGhbMl0gID0gezE3NiwgMzUyfTsKLWNvbnN0IHN0YXRpYyBJbnQgICBtYXhfaDI2M19oZWlnaHRbMl0gPSB7MTQ0LCAyODh9OwotCi0vKiA2LzIvMjAwMSwgbmV3bHkgYWRkZWQgZnVuY3Rpb25zIHRvIG1ha2UgUFZFbmNvZGVWb3AgbW9yZSByZWFkYWJsZS4gKi8KLUludCBEZXRlcm1pbmVDb2RpbmdMYXllcihWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgKm5MYXllciwgVUxvbmcgbW9kVGltZSk7Ci12b2lkIERldGVybWluZVZvcFR5cGUoVmlkZW9FbmNEYXRhICp2aWRlbywgSW50IGN1cnJMYXllcik7Ci1JbnQgVXBkYXRlU2tpcE5leHRGcmFtZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBVTG9uZyAqbW9kVGltZSwgSW50ICpzaXplLCBQVl9TVEFUVVMgc3RhdHVzKTsKLUJvb2wgU2V0UHJvZmlsZV9CdWZmZXJTaXplKFZpZGVvRW5jRGF0YSAqdmlkZW8sIGZsb2F0IGRlbGF5LCBJbnQgYkluaXRpYWxpemVkKTsKLQotI2lmZGVmIFBSSU5UX1JDX0lORk8KLWV4dGVybiBGSUxFICpmYWNjdDsKLWV4dGVybiBpbnQgdGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQ7Ci1leHRlcm4gaW50IGlTdHVmZkJpdHM7Ci0jZW5kaWYKLQotI2lmZGVmIFBSSU5UX0VDCi1leHRlcm4gRklMRSAqZmVjOwotI2VuZGlmCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldERlZmF1bHRFbmNPcHRpb24oKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDEyLzEyLzIwMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldERlZmF1bHRFbmNPcHRpb24oVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24sIEludCBlbmNVc2VDYXNlKQotewotICAgIFZpZGVvRW5jT3B0aW9ucyBkZWZhdWx0VXNlQ2FzZSA9IHtIMjYzX01PREUsIHByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW1NJTVBMRV9QUk9GSUxFX0xFVkVMMF0gPj4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNUExFX1BST0ZJTEVfTEVWRUwwLCBQVl9PRkYsIDAsIDEsIDEwMDAsIDMzLCB7MTQ0LCAxNDR9LCB7MTc2LCAxNzZ9LCB7MTUsIDMwfSwgezY0MDAwLCAxMjgwMDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsIDEwfSwgezEyLCAxMn0sIHswLCAwfSwgQ0JSXzEsIDAuMCwgUFZfT0ZGLCAtMSwgMCwgUFZfT0ZGLCAxNiwgUFZfT0ZGLCAwLCBQVl9PTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBPU0NMX1VOVVNFRF9BUkcoZW5jVXNlQ2FzZSk7IC8vIHVudXNlZCBmb3Igbm93LiBMYXRlciB3ZSBjYW4gYWRkIG1vcmUgZGVmYXVsdHMgc2V0dGluZyBhbmQgdXNlIHRoaXMKLSAgICAvLyBhcmd1bWVudCB0byBzZWxlY3QgdGhlIHJpZ2h0IG9uZS4KLSAgICAvKiBpbiB0aGUgZnV0dXJlIHdlIGNhbiBjcmVhdGUgbW9yZSBtZWFuaW5nZnVsIHVzZS1jYXNlcyAqLwotICAgIGlmIChlbmNPcHRpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICB9Ci0KLSAgICBNNFZFTkNfTUVNQ1BZKGVuY09wdGlvbiwgJmRlZmF1bHRVc2VDYXNlLCBzaXplb2YoVmlkZW9FbmNPcHRpb25zKSk7Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkluaXRWaWRlb0VuY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogSW5pdGlhbGl6YXRpb24gb2YgTVA0IEVuY29kZXIgYW5kIFZPIGJpdHN0cmVhbSAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogIDUvMjEvMDEsIGFsbG9jYXRlIG9ubHkgeUNoYW4gYW5kIGFzc2lnbiB1Q2hhbiAmIHZDaGFuICAgKi8KLS8qICAgICAgICAgICAgICAxMi8xMi8wNSwgYWRkIGVuY29kaW5nIG9wdGlvbiBhcyBpbnB1dCBhcmd1bWVudCAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLU9TQ0xfRVhQT1JUX1JFRiBCb29sICAgIFBWSW5pdFZpZGVvRW5jb2RlcihWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCwgVmlkZW9FbmNPcHRpb25zICplbmNPcHRpb24pCi17Ci0KLSAgICBCb29sICAgICAgICBzdGF0dXMgPSBQVl9UUlVFOwotICAgIEludCAgICAgICAgIG5MYXllcnMsIGlkeCwgaSwgajsKLSAgICBJbnQgICAgICAgICBtYXggPSAwLCBtYXhfd2lkdGggPSAwLCBtYXhfaGVpZ2h0ID0gMCwgcGl0Y2gsIG9mZnNldDsKLSAgICBJbnQgICAgICAgICBzaXplID0gMCwgblRvdGFsTUIgPSAwOwotICAgIFZpZGVvRW5jRGF0YSAqdmlkZW87Ci0gICAgVm9sICAgICAgICAgKnBWb2w7Ci0gICAgVmlkZW9FbmNQYXJhbXMgICpwRW5jUGFyYW1zOwotICAgIEludCAgICAgICAgIHRlbXBfdywgdGVtcF9oLCBtYnNQZXJTZWM7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgdGhpcyBwYXJ0IHVzZSB0byBiZSBQVlNldEVuY29kZSgpICovCi0gICAgSW50IHByb2ZpbGVfdGFibGVfaW5kZXgsICpwcm9maWxlX2xldmVsX3RhYmxlOwotICAgIEludCBwcm9maWxlX2xldmVsID0gZW5jT3B0aW9uLT5wcm9maWxlX2xldmVsOwotICAgIEludCBQYWNrZXRTaXplID0gZW5jT3B0aW9uLT5wYWNrZXRTaXplIDw8IDM7Ci0gICAgSW50IHRpbWVJbmMsIHRpbWVJbmNSZXM7Ci0gICAgZmxvYXQgcHJvZmlsZV9tYXhfZnJhbWVyYXRlOwotICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXM7Ci0KLSAgICBpZiAoZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEpIC8qIHRoaXMgaGFzIGJlZW4gY2FsbGVkICovCi0gICAgewotICAgICAgICBpZiAoZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckluaXQpIC8qIGNoZWNrIGlmIFBWSW5pdFZpZGVvRW5jb2RlcigpIGhhcyBiZWVuIGNhbGxlZCAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9FbmNvZGVyKGVuY29kZXJDb250cm9sKTsKLSAgICAgICAgICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIE00VkVOQ19GUkVFKGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhKTsKLSAgICAgICAgZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGEgPSBOVUxMOwotICAgIH0KLSAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDA7ICAgLyogcmVzZXQgdGhpcyB2YWx1ZSAqLwotCi0gICAgdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopTTRWRU5DX01BTExPQyhzaXplb2YoVmlkZW9FbmNEYXRhKSk7IC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZW5jRGF0YSAqLwotCi0gICAgaWYgKHZpZGVvID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotICAgIE00VkVOQ19NRU1TRVQodmlkZW8sIDAsIHNpemVvZihWaWRlb0VuY0RhdGEpKTsKLQotICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhID0gKHZvaWQgKikgdmlkZW87ICAgICAgICAgLyogc2V0IHVwIHBvaW50ZXIgaW4gVmlkZW9FbmNEYXRhIHN0cnVjdHVyZSAqLwotCi0gICAgdmlkZW8tPmVuY1BhcmFtcyA9IChWaWRlb0VuY1BhcmFtcyAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKFZpZGVvRW5jUGFyYW1zKSk7Ci0gICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMgPT0gTlVMTCkKLSAgICAgICAgZ290byBDTEVBTl9VUDsKLQotICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPmVuY1BhcmFtcywgMCwgc2l6ZW9mKFZpZGVvRW5jUGFyYW1zKSk7Ci0KLSAgICBlbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOwotICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IGVuY09wdGlvbi0+bnVtTGF5ZXJzOwotCi0gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgaW5wdXQgcGFja2V0c2l6ZSBpcyB2YWxpZCAoTm90ZTogcHV0IGNvZGUgaGVyZSAoYmVmb3JlIGFueSBtZW1vcnkgYWxsb2NhdGlvbikgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWsgKi8KLSAgICBpZiAoKEludClwcm9maWxlX2xldmVsIDwgKEludCkoU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwwKSkgIC8qIG5vbi1zY2FsYWJsZSBwcm9maWxlICovCi0gICAgewotICAgICAgICBwcm9maWxlX2xldmVsX3RhYmxlID0gKEludCAqKXByb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplOwotICAgICAgICBwcm9maWxlX3RhYmxlX2luZGV4ID0gKEludClwcm9maWxlX2xldmVsOwotICAgICAgICBpZiAoZW5jUGFyYW1zLT5uTGF5ZXJzICE9IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgIH0KLQotICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjWzBdID0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW3Byb2ZpbGVfdGFibGVfaW5kZXhdOwotCi0gICAgfQotICAgIGVsc2UgICAvKiBzY2FsYWJsZSBwcm9maWxlICovCi0gICAgewotICAgICAgICBwcm9maWxlX2xldmVsX3RhYmxlID0gKEludCAqKXNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplOwotICAgICAgICBwcm9maWxlX3RhYmxlX2luZGV4ID0gKEludClwcm9maWxlX2xldmVsIC0gKEludCkoU0lNUExFX1NDQUxBQkxFX1BST0ZJTEVfTEVWRUwwKTsKLSAgICAgICAgaWYgKGVuY1BhcmFtcy0+bkxheWVycyA8IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2ldID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW3Byb2ZpbGVfdGFibGVfaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKiBjYW5ub3QgaGF2ZSB6ZXJvIHNpemUgcGFja2V0IHdpdGggdGhlc2UgbW9kZXMgKi8KLSAgICBpZiAoUGFja2V0U2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBEQVRBX1BBUlRJVElPTklOR19NT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlbmNPcHRpb24tPmVuY01vZGUgPT0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUykKLSAgICAgICAgewotICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNNb2RlID0gQ09NQklORV9NT0RFX05PX0VSUl9SRVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZW5jT3B0aW9uLT5nb2JIZWFkZXJJbnRlcnZhbCA9PSAwKQotICAgIHsKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jTW9kZSA9PSBIMjYzX01PREVfV0lUSF9FUlJfUkVTKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNPcHRpb24tPmVuY01vZGUgPSBIMjYzX01PREU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNNb2RlID09IFNIT1JUX0hFQURFUl9XSVRIX0VSUl9SRVMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jTW9kZSA9IFNIT1JUX0hFQURFUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChQYWNrZXRTaXplID4gcHJvZmlsZV9sZXZlbF90YWJsZVtwcm9maWxlX3RhYmxlX2luZGV4XSkKLSAgICAgICAgZ290byBDTEVBTl9VUDsKLQotICAgIC8qIEluaXRpYWwgRGVmYXVsdHMgZm9yIGFsbCBNb2RlcyAqLwotCi0gICAgZW5jUGFyYW1zLT5TZXF1ZW5jZVN0YXJ0Q29kZSA9IDE7Ci0gICAgZW5jUGFyYW1zLT5HT1ZfRW5hYmxlZCA9IDA7Ci0gICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOwotICAgIGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RociA9IFBWX01BWChQVl9NSU4oZW5jT3B0aW9uLT5pbnRyYURDVmxjVGgsIDcpLCAwKTsKLSAgICBlbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uID0gKChlbmNPcHRpb24tPnVzZUFDUHJlZCA9PSBQVl9PTikgPyBUUlVFIDogRkFMU0UpOwotICAgIGVuY1BhcmFtcy0+UkNfVHlwZSA9IGVuY09wdGlvbi0+cmNUeXBlOwotICAgIGVuY1BhcmFtcy0+UmVmcmVzaCA9IGVuY09wdGlvbi0+bnVtSW50cmFNQjsKLSAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBFbmFibGUgUmVzeW5jIE1hcmtlciAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGVuY09wdGlvbi0+bnVtTGF5ZXJzOyBpKyspCi0gICAgewotI2lmZGVmIE5PX01QRUdfUVVBTlQKLSAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbaV0gPSAwOwotI2Vsc2UKLSAgICAgICAgZW5jUGFyYW1zLT5RdWFudFR5cGVbaV0gPSBlbmNPcHRpb24tPnF1YW50VHlwZVtpXTsgICAgICAvKiBIMjYzICovCi0jZW5kaWYKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+cFF1YW50W2ldID49IDEgJiYgZW5jT3B0aW9uLT5wUXVhbnRbaV0gPD0gMzEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtpXSA9IGVuY09wdGlvbi0+cFF1YW50W2ldOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5jT3B0aW9uLT5pUXVhbnRbaV0gPj0gMSAmJiBlbmNPcHRpb24tPmlRdWFudFtpXSA8PSAzMSkKLSAgICAgICAgewotICAgICAgICAgICAgZW5jUGFyYW1zLT5Jbml0UXVhbnRJdm9wW2ldID0gZW5jT3B0aW9uLT5pUXVhbnRbaV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZW5jUGFyYW1zLT5IYWxmUGVsX0VuYWJsZWQgPSAxOwotICAgIGVuY1BhcmFtcy0+U2VhcmNoUmFuZ2UgPSBlbmNPcHRpb24tPnNlYXJjaFJhbmdlOyAvKiA0LzE2LzIwMDEgKi8KLSAgICBlbmNQYXJhbXMtPkZ1bGxTZWFyY2hfRW5hYmxlZCA9IDA7Ci0jaWZkZWYgTk9fSU5URVI0VgotICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7Ci0jZWxzZQotICAgIGVuY1BhcmFtcy0+TVY4eDhfRW5hYmxlZCA9IDA7Ly8gY29tbWVudCBvdXQgZm9yIG5vdyEhIGVuY09wdGlvbi0+bXY4eDhFbmFibGU7Ci0jZW5kaWYKLSAgICBlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA9IDA7Ci0gICAgZW5jUGFyYW1zLT5HT0JfSGVhZGVyX0ludGVydmFsID0gMDsgLy8gbmVlZCB0byBiZSByZXNldCB0byAwCi0gICAgZW5jUGFyYW1zLT5JbnRyYVBlcmlvZCA9IGVuY09wdGlvbi0+aW50cmFQZXJpb2Q7ICAgIC8qIEludHJhIHVwZGF0ZSBwZXJpb2QgdXBkYXRlIGRlZmF1bHQqLwotICAgIGVuY1BhcmFtcy0+U2NlbmVDaGFuZ2VfRGV0ID0gZW5jT3B0aW9uLT5zY2VuZURldGVjdDsKLSAgICBlbmNQYXJhbXMtPkZpbmVGcmFtZVNraXBfRW5hYmxlZCA9IDA7Ci0gICAgZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID0gZW5jT3B0aW9uLT5ub0ZyYW1lU2tpcHBlZDsKLSAgICBlbmNQYXJhbXMtPk5vUHJlU2tpcF9FbmFibGVkID0gZW5jT3B0aW9uLT5ub0ZyYW1lU2tpcHBlZDsKLSAgICBlbmNQYXJhbXMtPkdldFZvbEhlYWRlclswXSA9IDA7Ci0gICAgZW5jUGFyYW1zLT5HZXRWb2xIZWFkZXJbMV0gPSAwOwotICAgIGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSA9IGVuY09wdGlvbi0+cGFja2V0U2l6ZSA8PCAzOwotICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID0gMDsKLSAgICBlbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9IDA7Ci0gICAgZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9IChmbG9hdCkwLjA7Ci0gICAgZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IChmbG9hdCkwLjA7Ci0gICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSBlbmNPcHRpb24tPnZidkRlbGF5OyAgLyogMnNlYyBWQlYgYnVmZmVyIHNpemUgKi8KLQotICAgIHN3aXRjaCAoZW5jT3B0aW9uLT5lbmNNb2RlKQotICAgIHsKLQotICAgICAgICBjYXNlIFNIT1JUX0hFQURFUjoKLSAgICAgICAgY2FzZSBTSE9SVF9IRUFERVJfV0lUSF9FUlJfUkVTOgotCi0gICAgICAgICAgICAvKiBGcm9tIFRhYmxlIDYtMjYgKi8KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IDE7Ci0gICAgICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVswXSA9IDA7ICAgIC8qSDI2MyAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAvKiBDb21iaW5lZCBNb2RlICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgIC8qIERpc2FibGUgUlZMQyAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOwotICAgICAgICAgICAgZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyID0gNzsgICAvKiB1c2VfaW50cmFfZGNfdmxjID0gMCAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsKLQotICAgICAgICAgICAgZW5jUGFyYW1zLT5HT0JfSGVhZGVyX0ludGVydmFsID0gZW5jT3B0aW9uLT5nb2JIZWFkZXJJbnRlcnZhbDsKLSAgICAgICAgICAgIGVuY1BhcmFtcy0+SDI2M19FbmFibGVkID0gMjsKLSAgICAgICAgICAgIGVuY1BhcmFtcy0+R09WX0VuYWJsZWQgPSAwOwotICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gMzAwMDA7ICAgICAgICAvKiB0aW1lSW5jcmVtZW50UmVzIGZvciBIMjYzICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEgyNjNfTU9ERToKLSAgICAgICAgY2FzZSBIMjYzX01PREVfV0lUSF9FUlJfUkVTOgotCi0gICAgICAgICAgICAvKiBGcm9tIFRhYmxlIDYtMjYgKi8KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+bkxheWVycyA9IDE7Ci0gICAgICAgICAgICBlbmNQYXJhbXMtPlF1YW50VHlwZVswXSA9IDA7ICAgIC8qSDI2MyAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gMTsgLyogRGlzYWJsZSBSZXN5bmMgTWFya2VyICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPkRhdGFQYXJ0aXRpb25pbmcgPSAwOyAvKiBDb21iaW5lZCBNb2RlICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgIC8qIERpc2FibGUgUlZMQyAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5Sb3VuZGluZ1R5cGUgPSAwOwotICAgICAgICAgICAgZW5jUGFyYW1zLT5JbnRyYURDVmxjVGhyID0gNzsgICAvKiB1c2VfaW50cmFfZGNfdmxjID0gMCAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5NVjh4OF9FbmFibGVkID0gMDsKLQotICAgICAgICAgICAgZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQgPSAxOwotICAgICAgICAgICAgZW5jUGFyYW1zLT5HT1ZfRW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSAzMDAwMDsgICAgICAgIC8qIHRpbWVJbmNyZW1lbnRSZXMgZm9yIEgyNjMgKi8KLQotICAgICAgICAgICAgYnJlYWs7Ci0jaWZuZGVmIEgyNjNfT05MWQotICAgICAgICBjYXNlIERBVEFfUEFSVElUSU9OSU5HX01PREU6Ci0KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDE7ICAgICAgICAvKiBCYXNlIExheWVyIERhdGEgUGFydGl0aW9uaW5nICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBSZXN5bmMgTWFya2VyICovCi0jaWZkZWYgTk9fUlZMQwotICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXZlcnNpYmxlVkxDID0gMDsKLSNlbHNlCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAoZW5jT3B0aW9uLT5ydmxjRW5hYmxlID09IFBWX09OKTsgLyogUlZMQyB3aGVuIERhdGEgUGFydGl0aW9uaW5nICovCi0jZW5kaWYKLSAgICAgICAgICAgIGVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZSA9IFBhY2tldFNpemU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM6Ci0KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7ICAgICAgICAvKiBDb21iaW5lZCBNb2RlICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAwOyAvKiBSZXN5bmMgTWFya2VyICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJldmVyc2libGVWTEMgPSAwOyAgICAgICAgICAgLyogTm8gUlZMQyAqLwotICAgICAgICAgICAgZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplID0gUGFja2V0U2l6ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09NQklORV9NT0RFX05PX0VSUl9SRVM6Ci0KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+RGF0YVBhcnRpdGlvbmluZyA9IDA7ICAgICAgICAvKiBDb21iaW5lZCBNb2RlICovCi0gICAgICAgICAgICBlbmNQYXJhbXMtPlJlc3luY01hcmtlckRpc2FibGUgPSAxOyAvKiBEaXNhYmxlIFJlc3luYyBNYXJrZXIgKi8KLSAgICAgICAgICAgIGVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQyA9IDA7ICAgICAgICAgICAvKiBObyBSVkxDICovCi0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICB9Ci0gICAgLyogU2V0IHRoZSBjb25zdHJhaW50cyAobWF4aW11bSB2YWx1ZXMpIGFjY29yZGluZyB0byB0aGUgaW5wdXQgcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAvKiBOb3RlIHRoYXQgcHJvZmlsZV90YWJsZV9pbmRleCBpcyBhbHJlYWR5IGZpZ3VyZWQgb3V0IGFib3ZlICovCi0KLSAgICAvKiBiYXNlIGxheWVyICovCi0gICAgZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4ICAgID0gcHJvZmlsZV90YWJsZV9pbmRleDsgLyogVXNlZCB0byBsaW1pdCB0aGUgcHJvZmlsZSBhbmQgbGV2ZWwgaW4gU2V0UHJvZmlsZV9CdWZmZXJTaXplKCkgKi8KLQotICAgIC8qIGNoZWNrIHRpbWVJbmNSZXMgKi8KLSAgICB0aW1lSW5jUmVzID0gZW5jT3B0aW9uLT50aW1lSW5jUmVzOwotICAgIHRpbWVJbmMgPSBlbmNPcHRpb24tPnRpY2tQZXJTcmM7Ci0KLSAgICBpZiAoKHRpbWVJbmNSZXMgPj0gMSkgJiYgKHRpbWVJbmNSZXMgPD0gNjU1MzYpICYmICh0aW1lSW5jIDwgdGltZUluY1JlcykgJiYgKHRpbWVJbmMgIT0gMCkpCi0gICAgewotICAgICAgICBpZiAoIWVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBlbmNQYXJhbXMtPlRpbWVJbmNyZW1lbnRSZXMgPSB0aW1lSW5jUmVzOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzID0gMzAwMDA7Ci0vLyAgICAgICAgICB2aWRlby0+RnJhbWVSYXRlID0gMzAwMDAvKGZsb2F0KTEwMDE7IC8qIGZpeCBpdCB0byAyOS45NyBmcHMgKi8KLSAgICAgICAgfQotICAgICAgICB2aWRlby0+RnJhbWVSYXRlID0gdGltZUluY1JlcyAvICgoZmxvYXQpdGltZUluYyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZnJhbWUgZGltZW5zaW9uICovCi0gICAgaWYgKGVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQotICAgIHsKLSAgICAgICAgc3dpdGNoIChlbmNPcHRpb24tPmVuY1dpZHRoWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gOTYpIC8qIHNvdXJjZV9mb3JtYXQgPSAxICovCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE3NjoKLSAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gMTQ0KSAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzNTI6Ci0gICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDI4OCkgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA3MDQ6Ci0gICAgICAgICAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jSGVpZ2h0WzBdICE9IDU3NikgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQwODoKLSAgICAgICAgICAgICAgICBpZiAoZW5jT3B0aW9uLT5lbmNIZWlnaHRbMF0gIT0gMTE1MikgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChlbmNPcHRpb24tPmVuY0hlaWdodFtpXSA9PSAwIHx8IGVuY09wdGlvbi0+ZW5jV2lkdGhbaV0gPT0gMCB8fAotICAgICAgICAgICAgICAgIGVuY09wdGlvbi0+ZW5jSGVpZ2h0W2ldICUgMTYgIT0gMCB8fCBlbmNPcHRpb24tPmVuY1dpZHRoW2ldICUgMTYgIT0gMCkKLSAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0gPSBlbmNPcHRpb24tPmVuY0hlaWdodFtpXTsKLSAgICAgICAgZW5jUGFyYW1zLT5MYXllcldpZHRoW2ldID0gZW5jT3B0aW9uLT5lbmNXaWR0aFtpXTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBmcmFtZSByYXRlICovCi0gICAgZm9yIChpID0gMDsgaSA8IGVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQotICAgIHsKLSAgICAgICAgZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSA9IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlW2ldOwotICAgIH0KLQotICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgPiAxKQotICAgIHsKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzBdID09IGVuY09wdGlvbi0+ZW5jRnJhbWVSYXRlWzFdIHx8Ci0gICAgICAgICAgICAgICAgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMF0gPT0gMC4gfHwgZW5jT3B0aW9uLT5lbmNGcmFtZVJhdGVbMV0gPT0gMC4pIC8qIDcvMzEvMDMgKi8KLSAgICAgICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgfQotICAgIC8qIHNldCBtYXggZnJhbWUgcmF0ZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBlbmNQYXJhbXMtPm5MYXllcnM7IGkrKykKLSAgICB7Ci0KLSAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBtYXhpbXVtIGZyYW1lcmF0ZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGdpdmVuIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgICAgIG5Ub3RhbE1CID0gKChlbmNQYXJhbXMtPkxheWVyV2lkdGhbaV0gKyAxNSkgLyAxNikgKiAoKGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0gKyAxNSkgLyAxNik7Ci0KLSAgICAgICAgaWYgKG5Ub3RhbE1CID4gMCkKLSAgICAgICAgICAgIHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZSA9IChmbG9hdCllbmNQYXJhbXMtPkxheWVyTWF4TWJzUGVyU2VjW2ldIC8gKGZsb2F0KW5Ub3RhbE1COwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByb2ZpbGVfbWF4X2ZyYW1lcmF0ZSA9IChmbG9hdCkzMC4wOwotCi0gICAgICAgIGVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbaV0gPSBQVl9NSU4ocHJvZmlsZV9tYXhfZnJhbWVyYXRlLCBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayBiaXQgcmF0ZSAqLwotICAgIC8qIHNldCBtYXggYml0IHJhdGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCi0gICAgewotICAgICAgICBlbmNQYXJhbXMtPkxheWVyQml0UmF0ZVtpXSA9IGVuY09wdGlvbi0+Yml0UmF0ZVtpXTsKLSAgICAgICAgZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbaV0gPSBlbmNPcHRpb24tPmJpdFJhdGVbaV07Ci0gICAgfQotICAgIGlmIChlbmNQYXJhbXMtPm5MYXllcnMgPiAxKQotICAgIHsKLSAgICAgICAgaWYgKGVuY09wdGlvbi0+Yml0UmF0ZVswXSA9PSBlbmNPcHRpb24tPmJpdFJhdGVbMV0gfHwKLSAgICAgICAgICAgICAgICBlbmNPcHRpb24tPmJpdFJhdGVbMF0gPT0gMCB8fCBlbmNPcHRpb24tPmJpdFJhdGVbMV0gPT0gMCkgLyogNy8zMS8wMyAqLwotICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICB9Ci0gICAgLyogY2hlY2sgcmF0ZSBjb250cm9sIGFuZCB2YnYgZGVsYXkqLwotICAgIGVuY1BhcmFtcy0+UkNfVHlwZSA9IGVuY09wdGlvbi0+cmNUeXBlOwotCi0gICAgaWYgKGVuY09wdGlvbi0+dmJ2RGVsYXkgPT0gMC4wKSAvKiBzZXQgdG8gZGVmYXVsdCAqLwotICAgIHsKLSAgICAgICAgc3dpdGNoIChlbmNPcHRpb24tPnJjVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBDQlJfMToKLSAgICAgICAgICAgIGNhc2UgQ0JSXzI6Ci0gICAgICAgICAgICAgICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSAoZmxvYXQpMi4wOyAvKiBkZWZhdWx0IDJzZWMgVkJWIGJ1ZmZlciBzaXplICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQ0JSX0xPV0RFTEFZOgotICAgICAgICAgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gKGZsb2F0KTAuNTsgLyogZGVmYXVsdCAwLjVzZWMgVkJWIGJ1ZmZlciBzaXplICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgVkJSXzE6Ci0gICAgICAgICAgICBjYXNlIFZCUl8yOgotICAgICAgICAgICAgICAgIGVuY1BhcmFtcy0+VkJWX2RlbGF5ID0gKGZsb2F0KTEwLjA7IC8qIGRlZmF1bHQgMTBzZWMgVkJWIGJ1ZmZlciBzaXplICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgLyogZm9yY2UgdGhpcyB2YWx1ZSAqLwotICAgIHsKLSAgICAgICAgZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSBlbmNPcHRpb24tPnZidkRlbGF5OwotICAgIH0KLQotICAgIC8qIGNoZWNrIHNlYXJjaCByYW5nZSAqLwotICAgIGlmIChlbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCAmJiBlbmNPcHRpb24tPnNlYXJjaFJhbmdlID4gMTYpCi0gICAgewotICAgICAgICBlbmNQYXJhbXMtPlNlYXJjaFJhbmdlID0gMTY7IC8qIDQvMTYvMjAwMSAqLwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBjaGVja2luZyBmb3IgY29uZmxpY3QgYmV0d2VlbiBvcHRpb25zICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSXzEgfHwgdmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDQlJfMiB8fCB2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkgIC8qIGlmIENCUiAqLwotICAgIHsKLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+Tm9GcmFtZVNraXBfRW5hYmxlZCA9PSBQVl9PTiB8fAotICAgICAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPk5vUHJlU2tpcF9FbmFibGVkID09IFBWX09OKSAvKiBkb24ndCBhbGxvdyBmcmFtZSBza2lwKi8KLSAgICAgICAgICAgIHByaW50ZigiV0FSTklORyEhISEgQ0JSIHdpdGggTm9GcmFtZVNraXBcbiIpOwotI2VuZGlmCi0gICAgfQotICAgIGVsc2UgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ09OU1RBTlRfUSkgICAvKiBjb25zdGFudF9RICovCi0gICAgewotICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5Ob0ZyYW1lU2tpcF9FbmFibGVkID0gUFZfT047ICAvKiBubyBmcmFtZSBza2lwICovCi0gICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPk5vUHJlU2tpcF9FbmFibGVkID0gUFZfT047ICAgIC8qIG5vIGZyYW1lIHNraXAgKi8KLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgICAgICBwcmludGYoIlR1cm4gb24gTm9GcmFtZVNraXBcbiIpOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPk5vRnJhbWVTa2lwX0VuYWJsZWQgPT0gUFZfT04pIC8qIGlmIG5vIGZyYW1lIHNraXAgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkZpbmVGcmFtZVNraXBfRW5hYmxlZCA9IFBWX09GRjsKLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgICAgICBwcmludGYoIk5vRnJhbWVTa2lwICEhISBtYXkgdmlvbGF0ZSBWQlZfQlVGRkVSIGNvbnN0cmFpbnQuXG4iKTsKLSAgICAgICAgcHJpbnRmKCJUdXJuIG9mZiBGaW5lRnJhbWVTa2lwXG4iKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIG5MYXllcnMgPSB2aWRlby0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyAvKiBOdW1iZXIgb2YgTGF5ZXJzIHRvIGJlIGVuY29kZWQgKi8KLQotICAgIC8qIEZpbmQgdGhlIG1heGltdW0gd2lkdGgqaGVpZ2h0IGZvciBtZW1vcnkgYWxsb2NhdGlvbiBvZiB0aGUgVk9QcyAqLwotICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbkxheWVyczsgaWR4KyspCi0gICAgewotICAgICAgICB0ZW1wX3cgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllcldpZHRoW2lkeF07Ci0gICAgICAgIHRlbXBfaCA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0W2lkeF07Ci0KLSAgICAgICAgaWYgKCh0ZW1wX3cqdGVtcF9oKSA+IG1heCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF4ID0gdGVtcF93ICogdGVtcF9oOwotICAgICAgICAgICAgbWF4X3dpZHRoID0gKCh0ZW1wX3cgKyAxNSkgPj4gNCkgPDwgNDsKLSAgICAgICAgICAgIG1heF9oZWlnaHQgPSAoKHRlbXBfaCArIDE1KSA+PiA0KSA8PCA0OwotICAgICAgICAgICAgaWYgKCgodWludDY0X3QpbWF4X3dpZHRoICogbWF4X2hlaWdodCkgPiAodWludDY0X3QpSU5UMzJfTUFYCi0gICAgICAgICAgICAgICAgICAgIHx8IHRlbXBfdyA+IElOVDMyX01BWCAtIDE1IHx8IHRlbXBfaCA+IElOVDMyX01BWCAtIDE1KSB7Ci0gICAgICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5Ub3RhbE1CID0gKChtYXhfd2lkdGggKiBtYXhfaGVpZ2h0KSA+PiA4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIGlmIHRoZSB2aWRlbyBzaXplIGFuZCBmcmFtZXJhdGUoTUJzUGVyU2VjKSBhcmUgdmFsZCAqLwotICAgICAgICBtYnNQZXJTZWMgPSAoSW50KShuVG90YWxNQiAqIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2lkeF0pOwotICAgICAgICBpZiAobWJzUGVyU2VjID4gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaWR4XSkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogU2V0IFByb2ZpbGUgYW5kIFZpZGVvIEJ1ZmZlciBTaXplIGZvciBlYWNoIGxheWVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZKSB2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXkgPSAwLjU7IC8qIEZvciBDQlJfTE9XREVMQVksIHdlIHNldCAwLjVzZWMgYnVmZmVyICovCi0gICAgc3RhdHVzID0gU2V0UHJvZmlsZV9CdWZmZXJTaXplKHZpZGVvLCB2aWRlby0+ZW5jUGFyYW1zLT5WQlZfZGVsYXksIDEpOwotICAgIGlmIChzdGF0dXMgIT0gUFZfVFJVRSkKLSAgICAgICAgZ290byBDTEVBTl9VUDsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHZpZGVvID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0KLSAgICAvKiBjeWNsaWMgcmVmZXJlbmNlIGZvciBwYXNzaW5nIHRocm91Z2ggYm90aCBzdHJ1Y3R1cmVzICovCi0gICAgdmlkZW8tPnZpZGVvRW5jQ29udHJvbHMgPSBlbmNvZGVyQ29udHJvbDsKLQotICAgIC8vdmlkZW8tPmN1cnJMYXllciA9IDA7IC8qIFNldCBjdXJyZW50IExheWVyIHRvIDAgKi8KLSAgICAvL3ZpZGVvLT5jdXJyRnJhbWVObyA9IDA7IC8qIFNldCBjdXJyZW50IGZyYW1lIE51bWJlciB0byAwICovCi0gICAgdmlkZW8tPm5leHRNb2RUaW1lID0gMDsKLSAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAwOyAvKiBTZXRzIHVwIHZlcnkgZmlyc3QgZnJhbWUgdG8gYmUgSS1WT1AhICovCi0gICAgdmlkZW8tPm51bVZvcHNJbkdPUCA9IDA7IC8qIGNvdW50ZXIgZm9yIFZvcHMgaW4gR29wLCAyLzgvMDEgKi8KLQotICAgIC8vdmlkZW8tPmZyYW1lUmF0ZSA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzBdOyAvKiBTZXQgY3VycmVudCBsYXllciBmcmFtZSByYXRlICovCi0KLSAgICB2aWRlby0+UVBNQiA9IChVQ2hhciAqKSBNNFZFTkNfTUFMTE9DKG5Ub3RhbE1CICogc2l6ZW9mKFVDaGFyKSk7IC8qIE1lbW9yeSBmb3IgTUIgcXVhbnRpemVycyAqLwotICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0KLSAgICB2aWRlby0+aGVhZGVySW5mby5Nb2RlID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsgLyogTWVtb3J5IGZvciBNQiBNb2RlcyAqLwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgdmlkZW8tPmhlYWRlckluZm8uQ0JQID0gKFVDaGFyICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIG5Ub3RhbE1CKTsgICAvKiBNZW1vcnkgZm9yIENCUCAoWSBhbmQgQykgb2YgZWFjaCBNQiAqLwotICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLQotICAgIC8qIEFsbG9jYXRpbmcgbW90aW9uIHZlY3RvciBzcGFjZSBhbmQgaW50ZXJwb2xhdGlvbiBtZW1vcnkqLwotCi0gICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihNT1QgKikpIHsKLSAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICB9Ci0gICAgdmlkZW8tPm1vdCA9IChNT1QgKiopTTRWRU5DX01BTExPQyhzaXplb2YoTU9UICopICogblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+bW90ID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5Ub3RhbE1COyBpZHgrKykKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5tb3RbaWR4XSA9IChNT1QgKilNNFZFTkNfTUFMTE9DKHNpemVvZihNT1QpICogOCk7Ci0gICAgICAgIGlmICh2aWRlby0+bW90W2lkeF0gPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZpZGVvLT5pbnRyYUFycmF5ID0gKFVDaGFyICopTTRWRU5DX01BTExPQyhzaXplb2YoVUNoYXIpICogblRvdGFsTUIpOwotICAgIGlmICh2aWRlby0+aW50cmFBcnJheSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0gICAgdmlkZW8tPnNsaWNlTm8gPSAoVUNoYXIgKikgTTRWRU5DX01BTExPQyhuVG90YWxNQik7IC8qIE1lbW9yeSBmb3IgU2xpY2UgTnVtYmVycyAqLwotICAgIGlmICh2aWRlby0+c2xpY2VObyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHByZWREQ0FDW11bOF1bMTZdLCBOb3QgdGhhdCBJIGludGVudGlvbmFsbHkgICovCi0gICAgLyogICAgaW5jcmVhc2UgdGhlIGRpbWVuc2lvbiBvZiBwcmVkRENBQyBmcm9tIFtdWzZdWzE1XSB0byBbXVs4XVsxNl0gKi8KLSAgICAvKiAgICBzbyB0aGF0IGNvbXBpbGVycyBjYW4gZ2VuZXJhdGUgZmFzdGVyIGNvZGUgdG8gaW5kZXhpbmcgdGhlICAgICAqLwotICAgIC8qICAgIGRhdGEgaW5zaWRlIChieSB1c2luZyA8PCBpbnN0ZWFkIG9mICopLiAgICAgICAgIDA0LzE0LzIwMDAuICovCi0gICAgLyogNS8yOS8wMSwgdXNlICBkZWNvZGVyIGxpYiBBQ0RDIHByZWRpY3Rpb24gbWVtb3J5IHNjaGVtZS4gICovCi0gICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENTdG9yZSkpIHsKLSAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICB9Ci0gICAgdmlkZW8tPnByZWREQyA9ICh0eXBlRENTdG9yZSAqKSBNNFZFTkNfTUFMTE9DKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7Ci0gICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLQotICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQotICAgIHsKLSAgICAgICAgaWYgKChzaXplX3QpKChtYXhfd2lkdGggPj4gNCkgKyAxKSA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKSB7Ci0gICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICB9Ci0gICAgICAgIHZpZGVvLT5wcmVkRENBQ19jb2wgPSAodHlwZURDQUNTdG9yZSAqKSBNNFZFTkNfTUFMTE9DKCgobWF4X3dpZHRoID4+IDQpICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwotICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0gICAgICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCi0gICAgICAgIC8qICB0aGUgcmVzdCB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgaG9yaXpvbnRhbCAocm93KSBBQyBjb2VmZmljaWVudHMgICovCi0gICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSB2aWRlby0+cHJlZERDQUNfY29sICsgMTsgICAgICAgIC8qICBBQ0RDICovCi0KLSAgICAgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihJbnQpKSB7Ci0gICAgICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICB9Ci0gICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKEludCAqKSBNNFZFTkNfTUFMTE9DKG5Ub3RhbE1CICogc2l6ZW9mKEludCkpOyAvKiBNZW1vcnkgZm9yIGFjUHJlZEZsYWcgKi8KLSAgICAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgfQotCi0gICAgdmlkZW8tPm91dHB1dE1CID0gKE1hY3JvQmxvY2sgKikgTTRWRU5DX01BTExPQyhzaXplb2YoTWFjcm9CbG9jaykpOyAvKiBBbGxvY2F0aW5nIG1hY3JvYmxvY2sgc3BhY2UgKi8KLSAgICBpZiAodmlkZW8tPm91dHB1dE1CID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgTTRWRU5DX01FTVNFVCh2aWRlby0+b3V0cHV0TUItPmJsb2NrWzBdLCAwLCAoc2l6ZW9mKFNob3J0KSA8PCA2KSo2KTsKLQotICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPmRhdGFCbG9jaywgMCwgc2l6ZW9mKFNob3J0KSA8PCA3KTsKLSAgICAvKiBBbGxvY2F0ZSAoMipwYWNrZXRzaXplKSB3b3JraW5nIGJpdHN0cmVhbXMgKi8KLQotICAgIHZpZGVvLT5iaXRzdHJlYW0xID0gQml0U3RyZWFtQ3JlYXRlRW5jKDIgKiA0MDk2KTsgLyphbGxvY2F0ZSB3b3JraW5nIHN0cmVhbSAxKi8KLSAgICBpZiAodmlkZW8tPmJpdHN0cmVhbTEgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICB2aWRlby0+Yml0c3RyZWFtMiA9IEJpdFN0cmVhbUNyZWF0ZUVuYygyICogNDA5Nik7IC8qYWxsb2NhdGUgd29ya2luZyBzdHJlYW0gMiovCi0gICAgaWYgKHZpZGVvLT5iaXRzdHJlYW0yID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgdmlkZW8tPmJpdHN0cmVhbTMgPSBCaXRTdHJlYW1DcmVhdGVFbmMoMiAqIDQwOTYpOyAvKmFsbG9jYXRlIHdvcmtpbmcgc3RyZWFtIDMqLwotICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMyA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0gICAgLyogYWxsb2NhdGUgb3ZlcnJ1biBidWZmZXIgKi8KLSAgICAvLyB0aGlzIGJ1ZmZlciBpcyB1c2VkIHdoZW4gdXNlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgdG8gaG9sZCBvbmUgZnJhbWUuCi0gICAgLy8gSXQgaXMgbm90IG5lZWRlZCBmb3Igc2xpY2UtYmFzZWQgZW5jb2RpbmcuCi0gICAgaWYgKG5MYXllcnMgPT0gMSkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5vQlNpemUgPSBlbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPj4gMzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdmlkZW8tPm9CU2l6ZSA9IFBWX01BWCgoZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdID4+IDMpLCAoZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdID4+IDMpKTsKLSAgICB9Ci0KLSAgICBpZiAodmlkZW8tPm9CU2l6ZSA+IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRSB8fCBlbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ09OU1RBTlRfUSkgLy8gc2V0IGxpbWl0Ci0gICAgewotICAgICAgICB2aWRlby0+b0JTaXplID0gREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFOwotICAgIH0KLSAgICB2aWRlby0+b3ZlcnJ1bkJ1ZmZlciA9IChVQ2hhciopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFVDaGFyKSAqIHZpZGVvLT5vQlNpemUpOwotICAgIGlmICh2aWRlby0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0KLSAgICB2aWRlby0+Y3VyclZvcCA9IChWb3AgKikgTTRWRU5DX01BTExPQyhzaXplb2YoVm9wKSk7IC8qIE1lbW9yeSBmb3IgQ3VycmVudCBWT1AgKi8KLSAgICBpZiAodmlkZW8tPmN1cnJWb3AgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLQotICAgIC8qIGFkZCBwYWRkaW5nLCAwOS8xOS8wNSAqLwotICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIC8qIG1ha2UgaXQgY29uZGl0aW9uYWwgIDExLzI4LzA1ICovCi0gICAgewotICAgICAgICBwaXRjaCA9IG1heF93aWR0aDsKLSAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcGl0Y2ggPSBtYXhfd2lkdGggKyAzMjsKLSAgICAgICAgb2Zmc2V0ID0gKHBpdGNoIDw8IDQpICsgMTY7Ci0gICAgICAgIG1heF9oZWlnaHQgKz0gMzI7Ci0gICAgfQotICAgIGlmICgoKHVpbnQ2NF90KXBpdGNoICogbWF4X2hlaWdodCkgPiAodWludDY0X3QpSU5UMzJfTUFYKSB7Ci0gICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgfQotICAgIHNpemUgPSBwaXRjaCAqIG1heF9oZWlnaHQ7Ci0KLSAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAtIChzaXplID4+IDEpCi0gICAgICAgICAgICB8fCAoc2l6ZV90KShzaXplICsgKHNpemUgPj4gMSkpID4gU0laRV9NQVggLyBzaXplb2YoUElYRUwpKSB7Ci0gICAgICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgfQotICAgIHZpZGVvLT5jdXJyVm9wLT5hbGxDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gKFBJWEVMICopTTRWRU5DX01BTExPQyhzaXplb2YoUElYRUwpICogKHNpemUgKyAoc2l6ZSA+PiAxKSkpOyAvKiBNZW1vcnkgZm9yIGN1cnJWb3AgWSAqLwotICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOy8qIE1lbW9yeSBmb3IgY3VyclZvcCBVICovCi0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7LyogTWVtb3J5IGZvciBjdXJyVm9wIFYgKi8KLQotICAgIC8qIHNoaWZ0IGZvciB0aGUgb2Zmc2V0ICovCi0gICAgaWYgKG9mZnNldCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCi0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OwotICAgIH0KLQotICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPmN1cnJWb3A7ICAgICAgLyogIEluaXRpYWxpemUgZm9yd2FyZFJlZlZvcCAqLwotICAgIHZpZGVvLT5iYWNrd2FyZFJlZlZvcCA9IHZpZGVvLT5jdXJyVm9wOyAgICAgLyogIEluaXRpYWxpemUgYmFja3dhcmRSZWZWb3AgKi8KLQotICAgIHZpZGVvLT5wcmV2QmFzZVZvcCA9IChWb3AgKikgTTRWRU5DX01BTExPQyhzaXplb2YoVm9wKSk7ICAgICAgICAgLyogTWVtb3J5IGZvciBQcmV2aW91cyBCYXNlIFZvcCAqLwotICAgIGlmICh2aWRlby0+cHJldkJhc2VWb3AgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICB2aWRlby0+cHJldkJhc2VWb3AtPmFsbENoYW4gPSB2aWRlby0+cHJldkJhc2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBwcmV2QmFzZVZvcCBZICovCi0gICAgaWYgKHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZCYXNlVm9wLT55Q2hhbiArIHNpemU7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgVSAqLwotICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7IC8qIE1lbW9yeSBmb3IgcHJldkJhc2VWb3AgViAqLwotCi0gICAgaWYgKG9mZnNldCkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+eUNoYW4gKz0gb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG9yaWdpbi4qLwotICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OwotICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnZDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OwotICAgIH0KLQotCi0gICAgaWYgKDApIC8qIElmIEIgRnJhbWVzICovCi0gICAgewotICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AgPSAoVm9wICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFZvcCkpOyAgICAgICAgIC8qIE1lbW9yeSBmb3IgTmV4dCBCYXNlIFZvcCAqLwotICAgICAgICBpZiAodmlkZW8tPm5leHRCYXNlVm9wID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgIHZpZGVvLT5uZXh0QmFzZVZvcC0+YWxsQ2hhbiA9IHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gPSAoUElYRUwgKikgTTRWRU5DX01BTExPQyhzaXplb2YoUElYRUwpICogKHNpemUgKyAoc2l6ZSA+PiAxKSkpOyAvKiBNZW1vcnkgZm9yIG5leHRCYXNlVm9wIFkgKi8KLSAgICAgICAgaWYgKHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT51Q2hhbiA9IHZpZGVvLT5uZXh0QmFzZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIG5leHRCYXNlVm9wIFUgKi8KLSAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT52Q2hhbiA9IHZpZGVvLT5uZXh0QmFzZVZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsgLyogTWVtb3J5IGZvciBuZXh0QmFzZVZvcCBWICovCi0KLSAgICAgICAgaWYgKG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCi0gICAgICAgICAgICB2aWRlby0+bmV4dEJhc2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OwotICAgICAgICAgICAgdmlkZW8tPm5leHRCYXNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChuTGF5ZXJzID4gMSkgICAvKiBJZiBlbmhhbmNlbWVudCBsYXllcnMgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9IChWb3AgKikgTTRWRU5DX01BTExPQyhzaXplb2YoVm9wKSk7ICAgICAgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBWb3AgKi8KLSAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPmFsbENoYW4gPSB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnlDaGFuID0gKFBJWEVMICopIE00VkVOQ19NQUxMT0Moc2l6ZW9mKFBJWEVMKSAqIChzaXplICsgKHNpemUgPj4gMSkpKTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFaGFuY2VtZW50IFkgKi8KLSAgICAgICAgaWYgKHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLSAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+eUNoYW4gKyBzaXplOyAvKiBNZW1vcnkgZm9yIFByZXZpb3VzIEVuaGFuY2VtZW50IFUgKi8KLSAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsgLyogTWVtb3J5IGZvciBQcmV2aW91cyBFbmhhbmNlbWVudCBWICovCi0KLSAgICAgICAgaWYgKG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT55Q2hhbiArPSBvZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgb3JpZ2luLiovCi0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnVDaGFuICs9IChvZmZzZXQgPj4gMikgKyA0OwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wLT52Q2hhbiArPSAob2Zmc2V0ID4+IDIpICsgNDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZpZGVvLT5udW1iZXJPZkxheWVycyA9IG5MYXllcnM7IC8qIE51bWJlciBvZiBMYXllcnMgKi8KLSAgICB2aWRlby0+c3VtTUFEID0gMDsKLQotCi0gICAgLyogMDQvMDkvMDEsIGZvciBWb3BzIGluIHRoZSB1c2UgbXVsdGlwYXNzIHByb2Nlc3NpbmcgKi8KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQotICAgIHsKLSAgICAgICAgdmlkZW8tPnBNUFtpZHhdID0gKE11bHRpUGFzcyAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKE11bHRpUGFzcykpOwotICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdID09IE5VTEwpICAgIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgIE00VkVOQ19NRU1TRVQodmlkZW8tPnBNUFtpZHhdLCAwLCBzaXplb2YoTXVsdGlQYXNzKSk7Ci0KLSAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5lbmNvZGVkX2ZyYW1lcyA9IC0xOyAvKiBmb3JnZXQgYWJvdXQgdGhlIHZlcnkgZmlyc3QgSSBmcmFtZSAqLwotCi0KLSAgICAgICAgLyogUkRJbmZvICoqcFJEU2FtcGxlcyAqLwotICAgICAgICB2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMgPSAoUkRJbmZvICoqKU00VkVOQ19NQUxMT0MoMzAgKiBzaXplb2YoUkRJbmZvICopKTsKLSAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlcyA9PSBOVUxMKSAgICBnb3RvIENMRUFOX1VQOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldID0gKFJESW5mbyAqKU00VkVOQ19NQUxMT0MoMzIgKiBzaXplb2YoUkRJbmZvKSk7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdLT5wUkRTYW1wbGVzW2ldID09IE5VTEwpIGdvdG8gQ0xFQU5fVVA7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgICAgTTRWRU5DX01FTVNFVCgmKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXVtqXSksIDAsIHNpemVvZihSREluZm8pKTsKLSAgICAgICAgfQotICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UgPSAoSW50KSh2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpZHhdICogMS4wKTsgLyogMS4wcyB0aW1lIGZyYW1lKi8KLSAgICAgICAgdmlkZW8tPnBNUFtpZHhdLT5mcmFtZVJhbmdlID0gUFZfTUFYKHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSwgNSk7Ci0gICAgICAgIHZpZGVvLT5wTVBbaWR4XS0+ZnJhbWVSYW5nZSA9IFBWX01JTih2aWRlby0+cE1QW2lkeF0tPmZyYW1lUmFuZ2UsIDMwKTsKLQotICAgICAgICB2aWRlby0+cE1QW2lkeF0tPmZyYW1lUG9zID0gLTE7Ci0KLSAgICB9Ci0gICAgLyogLy8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotCi0gICAgaWYgKChzaXplX3QpbkxheWVycyA+IFNJWkVfTUFYIC8gc2l6ZW9mKFZvbCAqKSkgewotICAgICAgICBnb3RvIENMRUFOX1VQOwotICAgIH0KLSAgICB2aWRlby0+dm9sID0gKFZvbCAqKilNNFZFTkNfTUFMTE9DKG5MYXllcnMgKiBzaXplb2YoVm9sICopKTsgLyogTWVtb3J5IGZvciBWT0wgcG9pbnRlcnMgKi8KLQotICAgIC8qIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBJbml0aWFsaXphdGlvbiBvZiBWb2xzIGFuZCB3cml0aW5nIG9mIGhlYWRlcnMgKi8KLSAgICBpZiAodmlkZW8tPnZvbCA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykKLSAgICB7Ci0gICAgICAgIHZpZGVvLT52b2xJbml0aWFsaXplW2lkeF0gPSAxOwotICAgICAgICB2aWRlby0+cmVmVGlja1tpZHhdID0gMDsKLSAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaWR4XSA9IDEwMDA7Ci0gICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IChWb2wgKilNNFZFTkNfTUFMTE9DKHNpemVvZihWb2wpKTsKLSAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKSAgZ290byBDTEVBTl9VUDsKLQotICAgICAgICBwVm9sID0gdmlkZW8tPnZvbFtpZHhdOwotICAgICAgICBwRW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKLQotICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwotICAgICAgICAvKiBJbml0aWFsaXplIHNvbWUgVk9MIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgcFZvbC0+dm9sSUQgPSBpZHg7ICAvKiBTZXQgVk9MIElEICovCi0gICAgICAgIHBWb2wtPnNob3J0VmlkZW9IZWFkZXIgPSBwRW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQ7IC8qU2hvcnQgSGVhZGVyICovCi0gICAgICAgIHBWb2wtPkdPVlN0YXJ0ID0gcEVuY1BhcmFtcy0+R09WX0VuYWJsZWQ7IC8qIEdPViBIZWFkZXIgKi8KLSAgICAgICAgcFZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gPSB2aWRlby0+ZW5jUGFyYW1zLT5UaW1lSW5jcmVtZW50UmVzOwotICAgICAgICBwVm9sLT5uYml0c1RpbWVJbmNSZXMgPSAxOwotICAgICAgICB3aGlsZSAocFZvbC0+dGltZUluY3JlbWVudFJlc29sdXRpb24gPiAoMSA8PCBwVm9sLT5uYml0c1RpbWVJbmNSZXMpKQotICAgICAgICB7Ci0gICAgICAgICAgICBwVm9sLT5uYml0c1RpbWVJbmNSZXMrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHRpbWluZyBzdHVmZiAqLwotICAgICAgICBwVm9sLT50aW1lSW5jcmVtZW50ID0gMDsKLSAgICAgICAgcFZvbC0+bW9kdWxvVGltZUJhc2UgPSAwOwotICAgICAgICBwVm9sLT5maXhlZFZvcFJhdGUgPSAwOyAvKiBObyBmaXhlZCBWT1AgcmF0ZSAqLwotICAgICAgICBwVm9sLT5zdHJlYW0gPSAoQml0c3RyZWFtRW5jVmlkZW8gKilNNFZFTkNfTUFMTE9DKHNpemVvZihCaXRzdHJlYW1FbmNWaWRlbykpOyAvKiBhbGxvY2F0ZSBCaXRzdHJlYW1FbmNWaWRlbyBJbnN0YW5jZSAqLwotICAgICAgICBpZiAocFZvbC0+c3RyZWFtID09IE5VTEwpICBnb3RvIENMRUFOX1VQOwotCi0gICAgICAgIHBWb2wtPndpZHRoID0gcEVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpZHhdOyAgICAgIC8qIExheWVyIFdpZHRoICovCi0gICAgICAgIHBWb2wtPmhlaWdodCA9IHBFbmNQYXJhbXMtPkxheWVySGVpZ2h0W2lkeF07ICAgIC8qIExheWVyIEhlaWdodCAqLwotICAgICAgICAvLyAgcFZvbC0+aW50cmFfYWNkY1ByZWREaXNhYmxlID0gcEVuY1BhcmFtcy0+QUNEQ1ByZWRpY3Rpb247IC8qIEFDREMgUHJlZGljdGlvbiAqLwotICAgICAgICBwVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlID0gcEVuY1BhcmFtcy0+UmVzeW5jTWFya2VyRGlzYWJsZTsgLyogUmVzeW5jIE1hcmtlciBNb2RlICovCi0gICAgICAgIHBWb2wtPmRhdGFQYXJ0aXRpb25pbmcgPSBwRW5jUGFyYW1zLT5EYXRhUGFydGl0aW9uaW5nOyAvKiBEYXRhIFBhcnRpdGlvbmluZyAqLwotICAgICAgICBwVm9sLT51c2VSZXZlcnNlVkxDID0gcEVuY1BhcmFtcy0+UmV2ZXJzaWJsZVZMQzsgLyogUlZMQyAqLwotICAgICAgICBpZiAoaWR4ID4gMCkgLyogU2NhbGFiaWxpdHkgbGF5ZXJzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBWb2wtPlJlc3luY01hcmtlckRpc2FibGUgPSAxOwotICAgICAgICAgICAgcFZvbC0+ZGF0YVBhcnRpdGlvbmluZyA9IDA7Ci0gICAgICAgICAgICBwVm9sLT51c2VSZXZlcnNlVkxDID0gMDsgLyogIE5vIFJWTEMgKi8KLSAgICAgICAgfQotICAgICAgICBwVm9sLT5xdWFudFR5cGUgPSBwRW5jUGFyYW1zLT5RdWFudFR5cGVbaWR4XTsgICAgICAgICAgIC8qIFF1YW50aXplciBUeXBlICovCi0KLSAgICAgICAgLyogbm8gbmVlZCB0byBpbml0IFF1YW50IE1hdHJpY2VzICovCi0KLSAgICAgICAgcFZvbC0+c2NhbGFiaWxpdHkgPSAwOyAgLyogVm9sIFNjYWxhYmlsaXR5ICovCi0gICAgICAgIGlmIChpZHggPiAwKQotICAgICAgICAgICAgcFZvbC0+c2NhbGFiaWxpdHkgPSAxOyAvKiBNdWx0aXBsZSBsYXllcnMgPT4gU2NhbGFiaWxpdHkgKi8KLQotICAgICAgICAvKiBJbml0aWFsaXplIFZvbCB0byBUZW1wb3JhbCBzY2FsYWJpbGl0eS4gIEl0IGNhbiBjaGFuZ2UgZHVyaW5nIGVuY29kaW5nICovCi0gICAgICAgIHBWb2wtPnNjYWxUeXBlID0gMTsKLSAgICAgICAgLyogSW5pdGlhbGl6ZSByZWZlcmVuY2UgVm9sIElEIHRvIHRoZSBiYXNlIGxheWVyID0gMCAqLwotICAgICAgICBwVm9sLT5yZWZWb2xJRCA9IDA7Ci0gICAgICAgIC8qIEluaXRpYWxpemUgbGF5ZXIgcmVzb2x1dGlvbiB0byBzYW1lIGFzIHRoZSByZWZlcmVuY2UgKi8KLSAgICAgICAgcFZvbC0+cmVmU2FtcERpciA9IDA7Ci0gICAgICAgIHBWb2wtPmhvclNhbXBfbSA9IDE7Ci0gICAgICAgIHBWb2wtPmhvclNhbXBfbiA9IDE7Ci0gICAgICAgIHBWb2wtPnZlclNhbXBfbSA9IDE7Ci0gICAgICAgIHBWb2wtPnZlclNhbXBfbiA9IDE7Ci0gICAgICAgIHBWb2wtPmVuaGFuY2VtZW50VHlwZSA9IDA7IC8qIFdlIGFsd2F5cyBlbmhhbmNlIHRoZSBlbnRpcmUgcmVnaW9uICovCi0KLSAgICAgICAgcFZvbC0+bk1CUGVyUm93ID0gKHBWb2wtPndpZHRoICsgMTUpIC8gMTY7Ci0gICAgICAgIHBWb2wtPm5NQlBlckNvbCA9IChwVm9sLT5oZWlnaHQgKyAxNSkgLyAxNjsKLSAgICAgICAgcFZvbC0+blRvdGFsTUIgPSBwVm9sLT5uTUJQZXJSb3cgKiBwVm9sLT5uTUJQZXJDb2w7Ci0KLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDEpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxOwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMykKLSAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDI7Ci0gICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA1KQotICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMzsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDkpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA0OwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMTcpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA1OwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMzMpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA2OwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNjUpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSA3OwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gMTI5KQotICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gODsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDI1NykKLSAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDk7Ci0gICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSA1MTMpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxMDsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDEwMjUpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxMTsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDIwNDkpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxMjsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDQwOTcpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxMzsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDgxOTMpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxNDsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDE2Mzg1KQotICAgICAgICAgICAgcFZvbC0+bkJpdHNGb3JNQklEID0gMTU7Ci0gICAgICAgIGlmIChwVm9sLT5uVG90YWxNQiA+PSAzMjc2OSkKLSAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE2OwotICAgICAgICBpZiAocFZvbC0+blRvdGFsTUIgPj0gNjU1MzcpCi0gICAgICAgICAgICBwVm9sLT5uQml0c0Zvck1CSUQgPSAxNzsKLSAgICAgICAgaWYgKHBWb2wtPm5Ub3RhbE1CID49IDEzMTA3MykKLSAgICAgICAgICAgIHBWb2wtPm5CaXRzRm9yTUJJRCA9IDE4OwotCi0gICAgICAgIGlmIChwVm9sLT5zaG9ydFZpZGVvSGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHBWb2wtPndpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMTI4OgotICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDk2KSAgLyogc291cmNlX2Zvcm1hdCA9IDEgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIDE3NjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBWb2wtPmhlaWdodCA9PSAxNDQpICAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSA5OwotICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwVm9sLT5oZWlnaHQgPT0gMjg4KSAgLyogc291cmNlX2Zvcm1hdCA9IDIgKi8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bkdPQmluVm9wID0gMTg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uTUJpbkdPQiA9IDIyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgNzA0OgotICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDU3NikgIC8qIHNvdXJjZV9mb3JtYXQgPSAyICovCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5HT0JpblZvcCA9IDE4OwotICAgICAgICAgICAgICAgICAgICAgICAgcFZvbC0+bk1CaW5HT0IgPSA4ODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDA4OgotICAgICAgICAgICAgICAgICAgICBpZiAocFZvbC0+aGVpZ2h0ID09IDExNTIpICAvKiBzb3VyY2VfZm9ybWF0ID0gMiAqLwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwVm9sLT5uR09CaW5Wb3AgPSAxODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBWb2wtPm5NQmluR09CID0gMzUyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcmF0ZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogQkVHSU4gSU5JVElBTElaQVRJT04gT0YgQU5ORVggTCBSQVRFIENPTlRST0wgKi8KLSAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSAhPSBDT05TVEFOVF9RKQotICAgIHsKLSAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuTGF5ZXJzOyBpZHgrKykgLyogMTIvMjUvMDAgKi8KLSAgICAgICAgewotICAgICAgICAgICAgdmlkZW8tPnJjW2lkeF0gPQotICAgICAgICAgICAgICAgIChyYXRlQ29udHJvbCAqKU00VkVOQ19NQUxMT0Moc2l6ZW9mKHJhdGVDb250cm9sKSk7Ci0KLSAgICAgICAgICAgIGlmICh2aWRlby0+cmNbaWR4XSA9PSBOVUxMKSBnb3RvIENMRUFOX1VQOwotCi0gICAgICAgICAgICBNNFZFTkNfTUVNU0VUKHZpZGVvLT5yY1tpZHhdLCAwLCBzaXplb2YocmF0ZUNvbnRyb2wpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoUFZfU1VDQ0VTUyAhPSBSQ19Jbml0aWFsaXplKHZpZGVvKSkKLSAgICAgICAgewotICAgICAgICAgICAgZ290byBDTEVBTl9VUDsKLSAgICAgICAgfQotICAgICAgICAvKiBpbml0aWFsaXphdGlvbiBmb3IgMi1wYXNzIHJhdGUgY29udHJvbCAqLwotICAgIH0KLSAgICAvKiBFTkQgSU5JVElBTElaQVRJT04gT0YgQU5ORVggTCBSQVRFIENPTlRST0wgKi8KLQotICAgIC8qKioqKioqKioqIGFzc2lnbiBwbGF0Zm9ybSBkZXBlbmRlbnQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIDEvMjMvMDEgKi8KLSAgICAvKiBUaGlzIG11c3QgYmUgZG9uZSBhdCBydW4tdGltZSBub3QgYSBjb21waWxlIHRpbWUgKi8KLSAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyID0gKEZ1bmNQdHIqKSBNNFZFTkNfTUFMTE9DKHNpemVvZihGdW5jUHRyKSk7Ci0gICAgaWYgKHZpZGVvLT5mdW5jdGlvblBvaW50ZXIgPT0gTlVMTCkgZ290byBDTEVBTl9VUDsKLQotICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPkNvbXB1dGVNQlN1bSA9ICZDb21wdXRlTUJTdW1fQzsKLSAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7Ci0gICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hhbGZQZWxfQ3hoOwotICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJlNBRF9NQl9IYWxmUGVsX0N5aDsKLSAgICB2aWRlby0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSGFsZlBlbF9DeGh5aDsKLQotI2lmbmRlZiBOT19JTlRFUjRWCi0gICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+U0FEX0Jsa19IYWxmUGVsID0gJlNBRF9CbGtfSGFsZlBlbF9DOwotICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9CbG9jayA9ICZTQURfQmxvY2tfQzsKLSNlbmRpZgotICAgIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NYWNyb2Jsb2NrX0M7Ci0gICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+Q2hvb3NlTW9kZSA9ICZDaG9vc2VNb2RlX0M7Ci0gICAgdmlkZW8tPmZ1bmN0aW9uUG9pbnRlci0+R2V0SGFsZlBlbE1CUmVnaW9uID0gJkdldEhhbGZQZWxNQlJlZ2lvbl9DOwotLy8gIHZpZGVvLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9QQURESU5HID0gJlNBRF9NQl9QQURESU5HOyAvKiA0LzIxLzAxICovCi0KLQotICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJJbml0ID0gMTsgIC8qIGluaXQgZG9uZSEgKi8KLQotICAgIHJldHVybiBQVl9UUlVFOwotCi1DTEVBTl9VUDoKLSAgICBQVkNsZWFuVXBWaWRlb0VuY29kZXIoZW5jb2RlckNvbnRyb2wpOwotCi0gICAgcmV0dXJuIFBWX0ZBTFNFOwotfQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZDbGVhblVwVmlkZW9FbmNvZGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwOC8yMi8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IERlYWxsb2NhdGVzIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBJbml0VmlkZW9FbmNvZGVyKCkgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6IDUvMjEvMDEsIGZyZWUgb25seSB5Q2hhbiBpbiBWb3AgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCAgICBQVkNsZWFuVXBWaWRlb0VuY29kZXIoVmlkZW9FbmNDb250cm9scyAqZW5jb2RlckNvbnRyb2wpCi17Ci0gICAgSW50IGlkeCwgaTsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhOwotICAgIGludCBuVG90YWxNQjsKLSAgICBpbnQgbWF4X3dpZHRoLCBvZmZzZXQ7Ci0KLSNpZmRlZiBQUklOVF9SQ19JTkZPCi0gICAgaWYgKGZhY2N0ICE9IE5VTEwpCi0gICAgewotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7Ci0gICAgICAgIGZwcmludGYoZmFjY3QsICJUT1RBTCBOVU0gQklUUyBHRU5FUkFURUQgJWRcbiIsIHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOwotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVE9UQUwgTlVNQkVSIE9GIEZSQU1FUyBDT0RFRCAlZFxuIiwKLSAgICAgICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5yY1swXS0+dG90YWxGcmFtZU51bWJlcik7Ci0gICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIkF2ZXJhZ2UgQml0UmF0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAodGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQgLyAoOTAgLyAzMCkpKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOwotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVE9UQUwgTlVNQkVSIE9GIFNUVUZGIEJJVFMgJWRcbiIsIChpU3R1ZmZCaXRzICsgMTA3NDApKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOwotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVE9UQUwgTlVNQkVSIE9GIEJJVFMgVE8gTkVUV09SSyAlZFxuIiwgKDM1ODAwKjkwIC8gMzApKTs7Ci0gICAgICAgIGZwcmludGYoZmFjY3QsICJAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAXG4iKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIlNVTSBPRiBTVFVGRiBCSVRTIEFORCBHRU5FUkFURUQgQklUUyAlZFxuIiwKLSAgICAgICAgICAgICAgICAodGlUb3RhbE51bUJpdHNHZW5lcmF0ZWQgKyBpU3R1ZmZCaXRzICsgMTA3NDApKTsKLSAgICAgICAgZnByaW50ZihmYWNjdCwgIkBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBcbiIpOwotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiVU5BQ0NPVU5URUQgRElGRkVSRU5DRSAlZFxuIiwKLSAgICAgICAgICAgICAgICAoKDM1ODAwKjkwIC8gMzApIC0gKHRpVG90YWxOdW1CaXRzR2VuZXJhdGVkICsgaVN0dWZmQml0cyArIDEwNzQwKSkpOwotICAgICAgICBmcHJpbnRmKGZhY2N0LCAiQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFxuIik7Ci0gICAgICAgIGZjbG9zZShmYWNjdCk7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBQUklOVF9FQwotICAgIGZjbG9zZShmZWMpOwotI2VuZGlmCi0KLSAgICBpZiAodmlkZW8gIT0gTlVMTCkKLSAgICB7Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5RUE1CKSBNNFZFTkNfRlJFRSh2aWRlby0+UVBNQik7Ci0gICAgICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlKU00VkVOQ19GUkVFKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUpOwotICAgICAgICBpZiAodmlkZW8tPmhlYWRlckluZm8uQ0JQKU00VkVOQ19GUkVFKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCk7Ci0KLQotICAgICAgICBpZiAodmlkZW8tPm1vdCkKLSAgICAgICAgewotICAgICAgICAgICAgblRvdGFsTUIgPSB2aWRlby0+dm9sWzBdLT5uVG90YWxNQjsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMTsgaWR4IDwgdmlkZW8tPmN1cnJMYXllcjsgaWR4KyspCi0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XS0+blRvdGFsTUIgPiBuVG90YWxNQikKLSAgICAgICAgICAgICAgICAgICAgblRvdGFsTUIgPSB2aWRlby0+dm9sW2lkeF0tPm5Ub3RhbE1COwotICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBuVG90YWxNQjsgaWR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5tb3RbaWR4XSkKLSAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm1vdFtpZHhdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5tb3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUFycmF5KSBNNFZFTkNfRlJFRSh2aWRlby0+aW50cmFBcnJheSk7Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5zbGljZU5vKU00VkVOQ19GUkVFKHZpZGVvLT5zbGljZU5vKTsKLSAgICAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnKU00VkVOQ19GUkVFKHZpZGVvLT5hY1ByZWRGbGFnKTsKLS8vICAgICAgaWYodmlkZW8tPnByZWREQ0FDKU00VkVOQ19GUkVFKHZpZGVvLT5wcmVkRENBQyk7Ci0gICAgICAgIGlmICh2aWRlby0+cHJlZERDKSBNNFZFTkNfRlJFRSh2aWRlby0+cHJlZERDKTsKLSAgICAgICAgdmlkZW8tPnByZWREQ0FDX3JvdyA9IE5VTEw7Ci0gICAgICAgIGlmICh2aWRlby0+cHJlZERDQUNfY29sKSBNNFZFTkNfRlJFRSh2aWRlby0+cHJlZERDQUNfY29sKTsKLSAgICAgICAgaWYgKHZpZGVvLT5vdXRwdXRNQilNNFZFTkNfRlJFRSh2aWRlby0+b3V0cHV0TUIpOwotCi0gICAgICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMSlCaXRzdHJlYW1DbG9zZUVuYyh2aWRlby0+Yml0c3RyZWFtMSk7Ci0gICAgICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMilCaXRzdHJlYW1DbG9zZUVuYyh2aWRlby0+Yml0c3RyZWFtMik7Ci0gICAgICAgIGlmICh2aWRlby0+Yml0c3RyZWFtMylCaXRzdHJlYW1DbG9zZUVuYyh2aWRlby0+Yml0c3RyZWFtMyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5vdmVycnVuQnVmZmVyKSBNNFZFTkNfRlJFRSh2aWRlby0+b3ZlcnJ1bkJ1ZmZlcik7Ci0KLSAgICAgICAgbWF4X3dpZHRoID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFswXTsKLSAgICAgICAgbWF4X3dpZHRoID0gKCgobWF4X3dpZHRoICsgMTUpID4+IDQpIDw8IDQpOyAvKiAwOS8xOS8wNSAqLwotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgb2Zmc2V0ID0gKChtYXhfd2lkdGggKyAzMikgPDwgNCkgKyAxNjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2aWRlby0+Y3VyclZvcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5hbGxDaGFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5jdXJyVm9wLT5hbGxDaGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5jdXJyVm9wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+bmV4dEJhc2VWb3AtPmFsbENoYW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPm5leHRCYXNlVm9wLT5hbGxDaGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5uZXh0QmFzZVZvcCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPnByZXZCYXNlVm9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnByZXZCYXNlVm9wLT5hbGxDaGFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2QmFzZVZvcC0+YWxsQ2hhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cHJldkJhc2VWb3ApOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGFuY2VWb3AtPmFsbENoYW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnByZXZFbmhhbmNlVm9wLT5hbGxDaGFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wcmV2RW5oYW5jZVZvcCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAwNC8wOS8wMSwgZm9yIFZvcHMgaW4gdGhlIHVzZSBtdWx0aXBhc3MgcHJvY2Vzc2luZyAqLwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZpZGVvLT5lbmNQYXJhbXMtPm5MYXllcnM7IGlkeCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPnBNUFtpZHhdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cE1QW2lkeF0tPnBSRFNhbXBsZXNbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT5wTVBbaWR4XS0+cFJEU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTTRWRU5DX01FTVNFVCh2aWRlby0+cE1QW2lkeF0sIDAsIHNpemVvZihNdWx0aVBhc3MpKTsKLSAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cE1QW2lkeF0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIC8vICBFbmQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCi0KLSAgICAgICAgaWYgKHZpZGVvLT52b2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgaWR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+dm9sW2lkeF0tPnN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgIE00VkVOQ19GUkVFKHZpZGVvLT52b2xbaWR4XS0+c3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPnZvbFtpZHhdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+dm9sKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIHN0b3AgcmF0ZSBjb250cm9sIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAvKiBBTk5FWCBMIFJBVEUgQ09OVFJPTCAqLwotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UkNfVHlwZSAhPSBDT05TVEFOVF9RKQotICAgICAgICB7Ci0gICAgICAgICAgICBSQ19DbGVhbnVwKHZpZGVvLT5yYywgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVycyk7Ci0KLSAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgaWR4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5yY1tpZHhdKQotICAgICAgICAgICAgICAgICAgICBNNFZFTkNfRlJFRSh2aWRlby0+cmNbaWR4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodmlkZW8tPmZ1bmN0aW9uUG9pbnRlcikgTTRWRU5DX0ZSRUUodmlkZW8tPmZ1bmN0aW9uUG9pbnRlcik7Ci0KLSAgICAgICAgLyogSWYgYXBwbGljYXRpb24gaGFzIGNhbGxlZCBQVkNsZWFuVXBWaWRlb0VuY29kZXIgdGhlbiB3ZSBkZWFsbG9jYXRlICovCi0gICAgICAgIC8qIElmIFBWSW5pdFZpZGVvRW5jb2RlciBjbGFzcyBpdCwgdGhlbiB3ZSBETyBOT1QgZGVhbGxvY2F0ZSAqLwotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcykKLSAgICAgICAgewotICAgICAgICAgICAgTTRWRU5DX0ZSRUUodmlkZW8tPmVuY1BhcmFtcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBNNFZFTkNfRlJFRSh2aWRlbyk7Ci0gICAgICAgIGVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhID0gTlVMTDsgLyogdmlkZW8gKi8KLSAgICB9Ci0KLSAgICBlbmNvZGVyQ29udHJvbC0+dmlkZW9FbmNvZGVySW5pdCA9IDA7Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldFZvbEhlYWRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDcvMTcvMjAwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldFZvbEhlYWRlcihWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBVQ2hhciAqdm9sSGVhZGVyLCBJbnQgKnNpemUsIEludCBsYXllcikKLXsKLSAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7Ci0gICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOwotICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKLQotCi0gICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0KLSAgICBlbmNEYXRhLT5jdXJyTGF5ZXIgPSBsYXllcjsgLyogU2V0IExheWVyICovCi0gICAgLypwdl9zdGF0dXMgPSAqLwotICAgIEVuY29kZVZPU19TdGFydChlbmNDdHJsKTsgLyogRW5jb2RlIFZPTCBIZWFkZXIgKi8KLQotICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2xheWVyXSA9IDE7IC8qIFNldCB1c2FnZSBmbGFnOiBOZWVkZWQgdG8gc3VwcG9ydCBvbGQgbWV0aG9kKi8KLQotICAgIC8qIENvcHkgYml0c3RyZWFtIHRvIGJ1ZmZlciBhbmQgc2V0IHRoZSBzaXplICovCi0KLSAgICBpZiAoKnNpemUgPiBlbmNEYXRhLT5iaXRzdHJlYW0xLT5ieXRlQ291bnQpCi0gICAgewotICAgICAgICAqc2l6ZSA9IGVuY0RhdGEtPmJpdHN0cmVhbTEtPmJ5dGVDb3VudDsKLSAgICAgICAgTTRWRU5DX01FTUNQWSh2b2xIZWFkZXIsIGVuY0RhdGEtPmJpdHN0cmVhbTEtPmJpdHN0cmVhbUJ1ZmZlciwgKnNpemUpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotICAgIC8qIFJlc2V0IGJpdHN0cmVhbTEgYnVmZmVyIHBhcmFtZXRlcnMgKi8KLSAgICBCaXRzdHJlYW1FbmNSZXNldChlbmNEYXRhLT5iaXRzdHJlYW0xKTsKLQotICAgIHJldHVybiBQVl9UUlVFOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0T3ZlcnJ1bkJ1ZmZlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogR2V0IHRoZSBvdmVycnVuIGJ1ZmZlciBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBvaW50ZXIgdG8gb3ZlcnJ1biBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotT1NDTF9FWFBPUlRfUkVGIFVDaGFyKiBQVkdldE92ZXJydW5CdWZmZXIoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKLXsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0gICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7Ci0gICAgVm9sICpjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOwotCi0gICAgaWYgKGN1cnJWb2wtPnN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICE9IHZpZGVvLT5vdmVycnVuQnVmZmVyKSAvLyBub3QgdXNlZAotICAgIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZpZGVvLT5vdmVycnVuQnVmZmVyOwotfQotCi0KLQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IEVuY29kZVZpZGVvRnJhbWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDgvMjIvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBFbmNvZGUgdmlkZW8gZnJhbWUgYW5kIHJldHVybiBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAwMi4xNC4yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgIEZpbmlzaGluZyBuZXcgdGltZXN0YW1wIDMyLWJpdCBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgQXBwbGljYXRpb25zIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHdyYXAtYXJvdW5kICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZFbmNvZGVWaWRlb0ZyYW1lKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX2luLCBWaWRlb0VuY0ZyYW1lSU8gKnZpZF9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxvbmcgKm5leHRNb2RUaW1lLCBVQ2hhciAqYnN0cmVhbSwgSW50ICpzaXplLCBJbnQgKm5MYXllcikKLXsKLSAgICBCb29sIHN0YXR1cyA9IFBWX1RSVUU7Ci0gICAgUFZfU1RBVFVTIHB2X3N0YXR1czsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0gICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7Ci0gICAgVm9sICpjdXJyVm9sOwotICAgIFZvcCAqdGVtcEZvcndSZWZWb3AgPSBOVUxMOwotICAgIEludCB0ZW1wUmVmU2VsQ29kZSA9IDA7Ci0gICAgUFZfU1RBVFVTICAgRW5jb2RlVk9TX1N0YXJ0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpOwotICAgIEludCB3aWR0aF8xNiwgaGVpZ2h0XzE2OwotICAgIEludCB3aWR0aCwgaGVpZ2h0OwotICAgIFZvcCAqdGVtcDsKLSAgICBJbnQgZW5jb2RlVm9wID0gMDsKLSAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7Ci0gICAgSW50IGN1cnJMYXllciA9IC0xOwotICAgIC8vSW50IG5MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7Ci0KLSAgICBVTG9uZyBtb2RUaW1lID0gdmlkX2luLT50aW1lc3RhbXA7Ci0KLSNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERSAgIC8qIGFkZCByYW5kb20gc2VsZWN0aW9uIG9mIHJlZmVyZW5jZSBWb3AgKi8KLSAgICBJbnQgcmFuZG9tX3ZhbFszMF0gPSB7MCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMH07Ci0gICAgc3RhdGljIEludCByYW5kX2lkeCA9IDA7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERldGVybWluZSBOZXh0IFZvcCB0byBlbmNvZGUsIGlmIGFueSwgYW5kIG5MYXllciAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8vaSA9IG5MYXllcnMtMTsKLQotICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVswXSkgLyogZmlyc3Qgdm9sIHRvIGNvZGUgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5uZXh0TW9kVGltZSA9IHZpZGVvLT5tb2RUaW1lUmVmID0gKChtb2RUaW1lKSAtICgobW9kVGltZSkgJSAxMDAwKSk7Ci0gICAgfQotCi0gICAgZW5jb2RlVm9wID0gRGV0ZXJtaW5lQ29kaW5nTGF5ZXIodmlkZW8sIG5MYXllciwgbW9kVGltZSk7Ci0gICAgY3VyckxheWVyID0gKm5MYXllcjsKLSAgICBpZiAoKGN1cnJMYXllciA8IDApIHx8IChjdXJyTGF5ZXIgPiBlbmNQYXJhbXMtPm5MYXllcnMgLSAxKSkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJZiBwb3N0LXNraXBwaW5nIHN0aWxsIGVmZmVjdGl2ZSAtLS0gcmV0dXJuICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmICghZW5jb2RlVm9wKSAvKiBza2lwIGVuaCBsYXllciwgbm8gYmFzZSBsYXllciBjb2RlZCAtLS0gcmV0dXJuICovCi0gICAgewotI2lmZGVmIF9QUklOVF9TVEFUCi0gICAgICAgIHByaW50ZigiTm8gZnJhbWUgY29kZWQuIENvbnRpbnVlIHRvIG5leHQgZnJhbWUuIik7Ci0jZW5kaWYKLSAgICAgICAgLyogZXhwZWN0ZWQgbmV4dCBjb2RlIHRpbWUsIGNvbnZlcnQgYmFjayB0byBtaWxsaXNlYyAqLwotICAgICAgICAqbmV4dE1vZFRpbWUgPSB2aWRlby0+bmV4dE1vZFRpbWU7Ci0KLSNpZmRlZiBBTExPV19WT1BfTk9UX0NPREVECi0gICAgICAgIGlmICh2aWRlby0+dm9sWzBdLT5zaG9ydFZpZGVvSGVhZGVyKSAvKiBTaG9ydCBWaWRlbyBIZWFkZXIgPSAxICovCi0gICAgICAgIHsKLSAgICAgICAgICAgICpzaXplID0gMDsKLSAgICAgICAgICAgICpuTGF5ZXIgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpuTGF5ZXIgPSAwOwotICAgICAgICAgICAgRW5jb2RlVm9wTm90Q29kZWQodmlkZW8sIGJzdHJlYW0sIHNpemUsIG1vZFRpbWUpOwotICAgICAgICAgICAgKnNpemUgPSB2aWRlby0+dm9sWzBdLT5zdHJlYW0tPmJ5dGVDb3VudDsKLSAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgKnNpemUgPSAwOwotICAgICAgICAqbkxheWVyID0gLTE7Ci0jZW5kaWYKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLQotLy9FTkNPREVfVk9QX0FHQUlOOiAgLyogMTIvMzAvMDAgKi8KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBJbml0aWFsaXplIFZvbCBzdHJlYW0gc3RydWN0dXJlIHdpdGggYXBwbGljYXRpb24gYml0c3RyZWFtICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKLSAgICBjdXJyVm9sLT5zdHJlYW0tPmJpdHN0cmVhbUJ1ZmZlciA9IGJzdHJlYW07Ci0gICAgY3VyclZvbC0+c3RyZWFtLT5idWZmZXJTaXplID0gKnNpemU7Ci0gICAgQml0c3RyZWFtRW5jUmVzZXQoY3VyclZvbC0+c3RyZWFtKTsKLSAgICBCaXRzdHJlYW1TZXRPdmVycnVuQnVmZmVyKGN1cnJWb2wtPnN0cmVhbSwgdmlkZW8tPm92ZXJydW5CdWZmZXIsIHZpZGVvLT5vQlNpemUsIHZpZGVvKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCi0gICAgewotICAgICAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IDA7Ci0gICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dGltZUluYyA9IDA7Ci0gICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+R2V0Vm9sSGVhZGVyW2N1cnJMYXllcl0pCi0gICAgICAgICAgICBwdl9zdGF0dXMgPSBFbmNvZGVWT1NfU3RhcnQoZW5jQ3RybCk7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBDb3B5IElucHV0IFZpZGVvIEZyYW1lIHRvIEludGVybmFsIFZpZGVvIEJ1ZmZlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogRGV0ZXJtaW5lIFdpZHRoIGFuZCBIZWlnaHQgb2YgVm9wIExheWVyICovCi0KLSAgICB3aWR0aCA9IGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtjdXJyTGF5ZXJdOyAgIC8qIEdldCBpbnB1dCB3aWR0aCAqLwotICAgIGhlaWdodCA9IGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbY3VyckxheWVyXTsgLyogR2V0IGlucHV0IGhlaWdodCAqLwotICAgIC8qIFJvdW5kIFVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgOiBNUEVHLTQgU3RhbmRhcmQgKi8KLQotICAgIHdpZHRoXzE2ID0gKCh3aWR0aCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KLSAgICBoZWlnaHRfMTYgPSAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAvKiBSb3VuZCB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICB2aWRlby0+aW5wdXQgPSB2aWRfaW47ICAvKiBwb2ludCB0byB0aGUgZnJhbWUgaW5wdXQgKi8KLQotICAgIC8qLy8gIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERldGVybWluZSBWT1AgVHlwZSAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiA2LzIvMjAwMSwgc2VwYXJhdGUgZnVuY3Rpb24gICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBEZXRlcm1pbmVWb3BUeXBlKHZpZGVvLCBjdXJyTGF5ZXIpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgSW5pdGlhbGl6ZSBWT1AgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgdmlkZW8tPmN1cnJWb3AtPnZvbElEID0gY3VyclZvbC0+dm9sSUQ7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPndpZHRoID0gd2lkdGhfMTY7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPmhlaWdodCA9IGhlaWdodF8xNjsKLSAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiAgMTEvMjgvMDUgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlby0+Y3VyclZvcC0+cGl0Y2ggPSB3aWR0aF8xNiArIDMyOwotICAgIH0KLSAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnQ7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZvcENvZGVkID0gMTsKLSAgICB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlID0gMDsKLSAgICB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RocjsKLQotICAgIGlmIChjdXJyTGF5ZXIgPT0gMAotI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLwotICAgICAgICAgICAgfHwgcmFuZG9tX3ZhbFtyYW5kX2lkeF0gfHwgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXQotI2VuZGlmCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgdGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCi0gICAgICAgIGlmICh0ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB0ZW1wUmVmU2VsQ29kZSA9IHRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOwotCi0gICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOwotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0gICAgfQotI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgdGVtcEZvcndSZWZWb3AgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcDsgLyoga2VlcCBpbml0aWFsIHN0YXRlICovCi0gICAgICAgIGlmICh0ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB0ZW1wUmVmU2VsQ29kZSA9IHRlbXBGb3J3UmVmVm9wLT5yZWZTZWxlY3RDb2RlOwotCi0gICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOwotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDA7Ci0gICAgfQotICAgIHJhbmRfaWR4Kys7Ci0gICAgcmFuZF9pZHggJT0gMzA7Ci0jZW5kaWYKLQotICAgIHZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlID0gdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPmdvYk51bWJlciA9IDA7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPmdvYkZyYW1lSUQgPSB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsUmVmID0gKG1vZFRpbWUgKiAzMCAvIDEwMDEpICUgMjU2OwotCi0gICAgdmlkZW8tPmN1cnJWb3AtPnRlbXBvcmFsSW50ZXJ2YWwgPSAwOwotCi0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50SXZvcFtjdXJyTGF5ZXJdOwotICAgIGVsc2UKLSAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnF1YW50aXplciA9IGVuY1BhcmFtcy0+SW5pdFF1YW50UHZvcFtjdXJyTGF5ZXJdOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKi8KLSAgICAvKiBFbmNvZGUgVm9wICovCi0gICAgLyoqKioqKioqKioqKioqKiovCi0gICAgdmlkZW8tPnNsaWNlX2NvZGluZyA9IDA7Ci0KLSAgICBwdl9zdGF0dXMgPSBFbmNvZGVWb3AodmlkZW8pOwotI2lmZGVmIF9QUklOVF9TVEFUCi0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKLSAgICAgICAgcHJpbnRmKCIgSS1WT1AgIik7Ci0gICAgZWxzZQotICAgICAgICBwcmludGYoIiBQLVZPUCAocmVmLiVkKSIsIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlKTsKLSNlbmRpZgotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBVcGRhdGUgU2tpcCBOZXh0IEZyYW1lICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgKm5MYXllciA9IFVwZGF0ZVNraXBOZXh0RnJhbWUodmlkZW8sIG5leHRNb2RUaW1lLCBzaXplLCBwdl9zdGF0dXMpOwotICAgIGlmICgqbkxheWVyID09IC0xKSAvKiBza2lwIGN1cnJlbnQgZnJhbWUgKi8KLSAgICB7Ci0gICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHBvaW50ZXJzIGFyZSByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgc3RhdGUgKi8KLSAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHRlbXBGb3J3UmVmVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCi0gICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IHRlbXBSZWZTZWxDb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvKiBJZiBJLVZPUCB3YXMgZW5jb2RlZCwgcmVzZXQgSW50cmFQZXJpb2QgKi8KLSAgICBpZiAoKGN1cnJMYXllciA9PSAwKSAmJiAoZW5jUGFyYW1zLT5JbnRyYVBlcmlvZCA+IDApICYmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApKQotICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOwotCi0gICAgLyogU2V0IEhpbnRUcmFjayBJbmZvcm1hdGlvbiAqLwotICAgIGlmIChjdXJyTGF5ZXIgIT0gLTEpCi0gICAgewotICAgICAgICBpZiAoY3VyclZvbC0+cHJldk1vZHVsb1RpbWVCYXNlKQotICAgICAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTVRCID0gMDsKLSAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTGF5ZXJJRCA9IChVQ2hhciljdXJyVm9sLT52b2xJRDsKLSAgICAgICAgdmlkZW8tPmhpbnRUcmFja0luZm8uQ29kZVR5cGUgPSAoVUNoYXIpdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlOwotICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlID0gKFVDaGFyKXZpZGVvLT5jdXJyVm9wLT5yZWZTZWxlY3RDb2RlOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogRGV0ZXJtaW5lIG5MYXllciBhbmQgdGltZUluYyBmb3IgbmV4dCBlbmNvZGUgKi8KLSAgICAvKiAxMi8yNy8wMCBhbHdheXMgZ28gYnkgdGhlIGhpZ2hlc3QgbGF5ZXIqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBDb3B5IFJlY29uc3RydWN0ZWQgQnVmZmVyIHRvIE91dHB1dCBWaWRlbyBGcmFtZSBCdWZmZXIgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICB2aWRfb3V0LT55Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbjsKLSAgICB2aWRfb3V0LT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbjsKLSAgICB2aWRfb3V0LT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT52Q2hhbjsKLSAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKQotICAgIHsKLSAgICAgICAgdmlkX291dC0+aGVpZ2h0ID0gdmlkZW8tPmN1cnJWb3AtPmhlaWdodDsgLyogcGFkZGVkIGhlaWdodCAqLwotICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aDsgLyogcGFkZGVkIHdpZHRoICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQgKyAzMjsgLyogcGFkZGVkIGhlaWdodCAqLwotICAgICAgICB2aWRfb3V0LT5waXRjaCA9IHZpZGVvLT5jdXJyVm9wLT53aWR0aCArIDMyOyAvKiBwYWRkZWQgd2lkdGggKi8KLSAgICB9Ci0gICAgLy92aWRlb19vdXQtPnRpbWVzdGFtcCA9IHZpZGVvLT5tb2RUaW1lOwotICAgIHZpZF9vdXQtPnRpbWVzdGFtcCA9IChVTG9uZykoKCh2aWRlby0+cHJldkZyYW1lTnVtW2N1cnJMYXllcl0gKiAxMDAwKSAvIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbY3VyckxheWVyXSkgKyB2aWRlby0+bW9kVGltZVJlZiArIDAuNSk7Ci0KLSAgICAvKi8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFVwZGF0ZSBPdXB1dCBic3RyZWFtIGJ5dGUgY291bnQgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAqc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50OwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogU3dhcCBWb3AgUG9pbnRlcnMgZm9yIEJhc2UgTGF5ZXIgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKGN1cnJMYXllciA9PSAwKQotICAgIHsKLSAgICAgICAgdGVtcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsKLSAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+cGFkZGVkID0gMDsgLyogbm90IHBhZGRlZCAqLwotICAgICAgICB2aWRlby0+Y3VyclZvcCAgPSB0ZW1wOwotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsgLyogRm9yIFAtVm9wIGJhc2Ugb25seSAqLwotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHRlbXAgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7Ci0gICAgICAgIHZpZGVvLT5wcmV2RW5oYW5jZVZvcCA9IHZpZGVvLT5jdXJyVm9wOwotICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KLSAgICAgICAgdmlkZW8tPmN1cnJWb3AgPSB0ZW1wOwotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2RW5oYW5jZVZvcDsKLSAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIE1vZGlmeSB0aGUgaW50aWFsaXplIGZsYWcgYXQgdGhlIGVuZC4qLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQotICAgICAgICB2aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdID0gMDsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLSNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWRW5jb2RlRnJhbWVTZXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMTgvMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBFbnRlciBhIHZpZGVvIGZyYW1lIGFuZCBwZXJmb3JtIGZyb250LWVuZCB0aW1lIGNoZWNrIHBsdXMgTUUgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkVuY29kZUZyYW1lU2V0KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFZpZGVvRW5jRnJhbWVJTyAqdmlkX2luLCBVTG9uZyAqbmV4dE1vZFRpbWUsIEludCAqbkxheWVyKQotewotICAgIEJvb2wgc3RhdHVzID0gUFZfVFJVRTsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0gICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7Ci0gICAgVm9sICpjdXJyVm9sOwotICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKLSAgICBJbnQgd2lkdGhfMTYsIGhlaWdodF8xNjsKLSAgICBJbnQgd2lkdGgsIGhlaWdodDsKLSAgICBJbnQgZW5jb2RlVm9wID0gMDsKLSAgICB2b2lkICBQYWRkaW5nRWRnZShWb3AgKnBhZFZvcCk7Ci0gICAgSW50IGN1cnJMYXllciA9IC0xOwotICAgIC8vSW50IG5MYXllcnMgPSBlbmNQYXJhbXMtPm5MYXllcnM7Ci0KLSAgICBVTG9uZyAgIG1vZFRpbWUgPSB2aWRfaW4tPnRpbWVzdGFtcDsKLQotI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLwotICAgIEludCByYW5kb21fdmFsWzMwXSA9IHswLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAwfTsKLSAgICBzdGF0aWMgSW50IHJhbmRfaWR4ID0gMDsKLSNlbmRpZgotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERldGVybWluZSBOZXh0IFZvcCB0byBlbmNvZGUsIGlmIGFueSwgYW5kIG5MYXllciAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgdmlkZW8tPm1vZFRpbWUgPSBtb2RUaW1lOwotCi0gICAgLy9pID0gbkxheWVycy0xOwotCi0gICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplWzBdKSAvKiBmaXJzdCB2b2wgdG8gY29kZSAqLwotICAgIHsKLSAgICAgICAgdmlkZW8tPm5leHRNb2RUaW1lID0gdmlkZW8tPm1vZFRpbWVSZWYgPSAoKG1vZFRpbWUpIC0gKChtb2RUaW1lKSAlIDEwMDApKTsKLSAgICB9Ci0KLQotICAgIGVuY29kZVZvcCA9IERldGVybWluZUNvZGluZ0xheWVyKHZpZGVvLCBuTGF5ZXIsIG1vZFRpbWUpOwotCi0gICAgY3VyckxheWVyID0gKm5MYXllcjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogSWYgcG9zdC1za2lwcGluZyBzdGlsbCBlZmZlY3RpdmUgLS0tIHJldHVybiAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoIWVuY29kZVZvcCkgLyogc2tpcCBlbmggbGF5ZXIsIG5vIGJhc2UgbGF5ZXIgY29kZWQgLS0tIHJldHVybiAqLwotICAgIHsKLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgICAgICBwcmludGYoIk5vIGZyYW1lIGNvZGVkLiBDb250aW51ZSB0byBuZXh0IGZyYW1lLiIpOwotI2VuZGlmCi0gICAgICAgICpuTGF5ZXIgPSAtMTsKLQotICAgICAgICAvKiBleHBlY3RlZCBuZXh0IGNvZGUgdGltZSwgY29udmVydCBiYWNrIHRvIG1pbGxpc2VjICovCi0gICAgICAgICpuZXh0TW9kVGltZSA9IHZpZGVvLT5uZXh0TW9kVGltZTs7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemUgVm9sIHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBiaXRzdHJlYW0gKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOwotICAgIGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSA9IDA7Ci0gICAgQml0c3RyZWFtRW5jUmVzZXQoY3VyclZvbC0+c3RyZWFtKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCi0gICAgewotICAgICAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IDA7Ci0gICAgICAgIHZpZGVvLT5wcmV2QmFzZVZvcC0+dGltZUluYyA9IDA7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBDb3B5IElucHV0IFZpZGVvIEZyYW1lIHRvIEludGVybmFsIFZpZGVvIEJ1ZmZlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogRGV0ZXJtaW5lIFdpZHRoIGFuZCBIZWlnaHQgb2YgVm9wIExheWVyICovCi0KLSAgICB3aWR0aCA9IGVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtjdXJyTGF5ZXJdOyAgIC8qIEdldCBpbnB1dCB3aWR0aCAqLwotICAgIGhlaWdodCA9IGVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbY3VyckxheWVyXTsgLyogR2V0IGlucHV0IGhlaWdodCAqLwotICAgIC8qIFJvdW5kIFVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgOiBNUEVHLTQgU3RhbmRhcmQgKi8KLQotICAgIHdpZHRoXzE2ID0gKCh3aWR0aCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAgIC8qIFJvdW5kIHVwIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgMTYgKi8KLSAgICBoZWlnaHRfMTYgPSAoKGhlaWdodCArIDE1KSAvIDE2KSAqIDE2OyAgICAgICAgICAvKiBSb3VuZCB1cCB0byBuZWFyZXN0IG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICB2aWRlby0+aW5wdXQgPSB2aWRfaW47ICAvKiBwb2ludCB0byB0aGUgZnJhbWUgaW5wdXQgKi8KLQotICAgIC8qLy8gIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIERldGVybWluZSBWT1AgVHlwZSAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiA2LzIvMjAwMSwgc2VwYXJhdGUgZnVuY3Rpb24gICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBEZXRlcm1pbmVWb3BUeXBlKHZpZGVvLCBjdXJyTGF5ZXIpOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgSW5pdGlhbGl6ZSBWT1AgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgdmlkZW8tPmN1cnJWb3AtPnZvbElEID0gY3VyclZvbC0+dm9sSUQ7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPndpZHRoID0gd2lkdGhfMTY7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPmhlaWdodCA9IGhlaWdodF8xNjsKLSAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkKSAvKiAgMTEvMjgvMDUgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT5waXRjaCA9IHdpZHRoXzE2OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICB2aWRlby0+Y3VyclZvcC0+cGl0Y2ggPSB3aWR0aF8xNiArIDMyOwotICAgIH0KLSAgICB2aWRlby0+Y3VyclZvcC0+dGltZUluYyA9IGN1cnJWb2wtPnRpbWVJbmNyZW1lbnQ7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZvcENvZGVkID0gMTsKLSAgICB2aWRlby0+Y3VyclZvcC0+cm91bmRpbmdUeXBlID0gMDsKLSAgICB2aWRlby0+Y3VyclZvcC0+aW50cmFEQ1ZsY1RociA9IGVuY1BhcmFtcy0+SW50cmFEQ1ZsY1RocjsKLQotICAgIGlmIChjdXJyTGF5ZXIgPT0gMAotI2lmZGVmIFJBTkRPTV9SRUZTRUxDT0RFICAgLyogYWRkIHJhbmRvbSBzZWxlY3Rpb24gb2YgcmVmZXJlbmNlIFZvcCAqLwotICAgICAgICAgICAgfHwgcmFuZG9tX3ZhbFtyYW5kX2lkeF0gfHwgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXQotI2VuZGlmCi0gICAgICAgKQotICAgIHsKLSAgICAgICAgdmlkZW8tPnRlbXBGb3J3UmVmVm9wID0gdmlkZW8tPmZvcndhcmRSZWZWb3A7IC8qIGtlZXAgaW5pdGlhbCBzdGF0ZSAqLwotICAgICAgICBpZiAodmlkZW8tPnRlbXBGb3J3UmVmVm9wICE9IE5VTEwpIHZpZGVvLT50ZW1wUmVmU2VsQ29kZSA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcC0+cmVmU2VsZWN0Q29kZTsKLQotICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT5wcmV2QmFzZVZvcDsKLSAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAxOwotICAgIH0KLSNpZmRlZiBSQU5ET01fUkVGU0VMQ09ERQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHZpZGVvLT50ZW1wRm9yd1JlZlZvcCA9IHZpZGVvLT5mb3J3YXJkUmVmVm9wOyAvKiBrZWVwIGluaXRpYWwgc3RhdGUgKi8KLSAgICAgICAgaWYgKHZpZGVvLT50ZW1wRm9yd1JlZlZvcCAhPSBOVUxMKSB2aWRlby0+dGVtcFJlZlNlbENvZGUgPSB2aWRlby0+dGVtcEZvcndSZWZWb3AtPnJlZlNlbGVjdENvZGU7Ci0KLSAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AgPSB2aWRlby0+cHJldkVuaGFuY2VWb3A7Ci0gICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gMDsKLSAgICB9Ci0gICAgcmFuZF9pZHgrKzsKLSAgICByYW5kX2lkeCAlPSAzMDsKLSNlbmRpZgotCi0gICAgdmlkZW8tPmN1cnJWb3AtPnJlZlNlbGVjdENvZGUgPSB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+Z29iTnVtYmVyID0gMDsKLSAgICB2aWRlby0+Y3VyclZvcC0+Z29iRnJhbWVJRCA9IHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dGVtcG9yYWxSZWYgPSAoKG1vZFRpbWUpICogMzAgLyAxMDAxKSAlIDI1NjsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT50ZW1wb3JhbEludGVydmFsID0gMDsKLQotICAgIGlmICh2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCi0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudEl2b3BbY3VyckxheWVyXTsKLSAgICBlbHNlCi0gICAgICAgIHZpZGVvLT5jdXJyVm9wLT5xdWFudGl6ZXIgPSBlbmNQYXJhbXMtPkluaXRRdWFudFB2b3BbY3VyckxheWVyXTsKLQotICAgIC8qKioqKioqKioqKioqKioqLwotICAgIC8qIEVuY29kZSBWb3AgICAqLwotICAgIC8qKioqKioqKioqKioqKioqLwotICAgIHZpZGVvLT5zbGljZV9jb2RpbmcgPSAxOwotCi0gICAgLypwdl9zdGF0dXMgPSovCi0gICAgRW5jb2RlVm9wKHZpZGVvKTsKLQotI2lmZGVmIF9QUklOVF9TVEFUCi0gICAgaWYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkKLSAgICAgICAgcHJpbnRmKCIgSS1WT1AgIik7Ci0gICAgZWxzZQotICAgICAgICBwcmludGYoIiBQLVZPUCAocmVmLiVkKSIsIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlKTsKLSNlbmRpZgotCi0gICAgLyogU2V0IEhpbnRUcmFjayBJbmZvcm1hdGlvbiAqLwotICAgIGlmIChjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2UpCi0gICAgICAgIHZpZGVvLT5oaW50VHJhY2tJbmZvLk1UQiA9IDE7Ci0gICAgZWxzZQotICAgICAgICB2aWRlby0+aGludFRyYWNrSW5mby5NVEIgPSAwOwotCi0gICAgdmlkZW8tPmhpbnRUcmFja0luZm8uTGF5ZXJJRCA9IChVQ2hhciljdXJyVm9sLT52b2xJRDsKLSAgICB2aWRlby0+aGludFRyYWNrSW5mby5Db2RlVHlwZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGU7Ci0gICAgdmlkZW8tPmhpbnRUcmFja0luZm8uUmVmU2VsQ29kZSA9IChVQ2hhcil2aWRlby0+Y3VyclZvcC0+cmVmU2VsZWN0Q29kZTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYgLyogTk9fU0xJQ0VfRU5DT0RFICovCi0KLSNpZm5kZWYgTk9fU0xJQ0VfRU5DT0RFCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWRW5jb2RlUGFja2V0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMTgvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBFbmNvZGUgb25lIHBhY2tldCBhbmQgcmV0dXJuIGJpdHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkVuY29kZVNsaWNlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIFVDaGFyICpic3RyZWFtLCBJbnQgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludCAqZW5kb2ZGcmFtZSwgVmlkZW9FbmNGcmFtZUlPICp2aWRfb3V0LCBVTG9uZyAqbmV4dE1vZFRpbWUpCi17Ci0gICAgUFZfU1RBVFVTIHB2X3N0YXR1czsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0gICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7Ci0gICAgVm9sICpjdXJyVm9sOwotICAgIFBWX1NUQVRVUyAgIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsKTsKLSAgICBWb3AgKnRlbXA7Ci0gICAgdm9pZCAgUGFkZGluZ0VkZ2UoVm9wICpwYWRWb3ApOwotICAgIEludCBjdXJyTGF5ZXIgPSB2aWRlby0+Y3VyckxheWVyOwotICAgIEludCBwcmVfc2tpcDsKLSAgICBJbnQgcHJlX3NpemU7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEluaXRpYWxpemUgVm9sIHN0cmVhbSBzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBiaXRzdHJlYW0gKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBjdXJyVm9sID0gdmlkZW8tPnZvbFtjdXJyTGF5ZXJdOwotICAgIGN1cnJWb2wtPnN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnN0cmVhbTsKLSAgICBwcmVfc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50OwotICAgIGN1cnJWb2wtPnN0cmVhbS0+YnVmZmVyU2l6ZSA9IHByZV9zaXplICsgKCpzaXplKTsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBFbmNvZGUgVk9TIGFuZCBWT0wgSGVhZGVycyBvbiBmaXJzdCBjYWxsIGZvciBlYWNoIGxheWVyICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHZpZGVvLT52b2xJbml0aWFsaXplW2N1cnJMYXllcl0pCi0gICAgewotICAgICAgICBpZiAoIXZpZGVvLT5lbmNQYXJhbXMtPkdldFZvbEhlYWRlcltjdXJyTGF5ZXJdKQotICAgICAgICAgICAgcHZfc3RhdHVzID0gRW5jb2RlVk9TX1N0YXJ0KGVuY0N0cmwpOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqLwotICAgIC8qIEVuY29kZSBTbGljZSAqLwotICAgIC8qKioqKioqKioqKioqKioqLwotICAgIHB2X3N0YXR1cyA9IEVuY29kZVNsaWNlKHZpZGVvKTsKLQotICAgICplbmRvZkZyYW1lID0gMDsKLQotICAgIGlmICh2aWRlby0+bWJudW0gPj0gY3VyclZvbC0+blRvdGFsTUIgJiYgIXZpZGVvLT5lbmRfb2ZfYnVmKQotICAgIHsKLSAgICAgICAgKmVuZG9mRnJhbWUgPSAxOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFVwZGF0ZSBTa2lwIE5leHQgRnJhbWUgICAgICAgICAgICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIHByZV9za2lwID0gVXBkYXRlU2tpcE5leHRGcmFtZSh2aWRlbywgbmV4dE1vZFRpbWUsIHNpemUsIHB2X3N0YXR1cyk7IC8qIG1vZGlmaWVkIHN1Y2ggdGhhdCBubyBwcmUtc2tpcHBlZCAqLwotCi0gICAgICAgIGlmIChwcmVfc2tpcCA9PSAtMSkgLyogZXJyb3IgKi8KLSAgICAgICAgewotICAgICAgICAgICAgKmVuZG9mRnJhbWUgPSAtMTsKLSAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHBvaW50ZXJzIGFyZSByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgc3RhdGUgKi8KLSAgICAgICAgICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcCA9IHZpZGVvLT50ZW1wRm9yd1JlZlZvcDsgLyogRm9yIFAtVm9wIGJhc2Ugb25seSAqLwotICAgICAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wLT5yZWZTZWxlY3RDb2RlID0gdmlkZW8tPnRlbXBSZWZTZWxDb2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gcHZfc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSWYgSS1WT1Agd2FzIGVuY29kZWQsIHJlc2V0IEludHJhUGVyaW9kICovCi0gICAgICAgIGlmICgoY3VyckxheWVyID09IDApICYmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID4gMCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCi0gICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSBlbmNQYXJhbXMtPkludHJhUGVyaW9kOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBDb3B5IFJlY29uc3RydWN0ZWQgQnVmZmVyIHRvIE91dHB1dCBWaWRlbyBGcmFtZSBCdWZmZXIgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIHZpZF9vdXQtPnlDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuOwotICAgICAgICB2aWRfb3V0LT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbjsKLSAgICAgICAgdmlkX291dC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dkNoYW47Ci0gICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQ7IC8qIHBhZGRlZCBoZWlnaHQgKi8KLSAgICAgICAgICAgIHZpZF9vdXQtPnBpdGNoID0gdmlkZW8tPmN1cnJWb3AtPndpZHRoOyAvKiBwYWRkZWQgd2lkdGggKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZF9vdXQtPmhlaWdodCA9IHZpZGVvLT5jdXJyVm9wLT5oZWlnaHQgKyAzMjsgLyogcGFkZGVkIGhlaWdodCAqLwotICAgICAgICAgICAgdmlkX291dC0+cGl0Y2ggPSB2aWRlby0+Y3VyclZvcC0+d2lkdGggKyAzMjsgLyogcGFkZGVkIHdpZHRoICovCi0gICAgICAgIH0KLSAgICAgICAgLy92aWRfb3V0LT50aW1lc3RhbXAgPSB2aWRlby0+bW9kVGltZTsKLSAgICAgICAgdmlkX291dC0+dGltZXN0YW1wID0gKFVMb25nKSgoKHZpZGVvLT5wcmV2RnJhbWVOdW1bY3VyckxheWVyXSAqIDEwMDApIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtjdXJyTGF5ZXJdKSArIHZpZGVvLT5tb2RUaW1lUmVmICsgMC41KTsKLQotICAgICAgICAvKi8vIEVuZCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBTd2FwIFZvcCBQb2ludGVycyBmb3IgQmFzZSBMYXllciAgICAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgaWYgKGN1cnJMYXllciA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZCYXNlVm9wOwotICAgICAgICAgICAgdmlkZW8tPnByZXZCYXNlVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkJhc2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcDsKLSAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZCYXNlVm9wOyAvKiBGb3IgUC1Wb3AgYmFzZSBvbmx5ICovCi0gICAgICAgICAgICB2aWRlby0+Zm9yd2FyZFJlZlZvcC0+cmVmU2VsZWN0Q29kZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhhbmNlVm9wID0gdmlkZW8tPmN1cnJWb3A7Ci0gICAgICAgICAgICB2aWRlby0+cHJldkVuaGFuY2VWb3AtPnBhZGRlZCA9IDA7IC8qIG5vdCBwYWRkZWQgKi8KLSAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wID0gdGVtcDsKLSAgICAgICAgICAgIHZpZGVvLT5mb3J3YXJkUmVmVm9wID0gdmlkZW8tPnByZXZFbmhhbmNlVm9wOwotICAgICAgICAgICAgdmlkZW8tPmZvcndhcmRSZWZWb3AtPnJlZlNlbGVjdENvZGUgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFVwZGF0ZSBPdXB1dCBic3RyZWFtIGJ5dGUgY291bnQgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAqc2l6ZSA9IGN1cnJWb2wtPnN0cmVhbS0+Ynl0ZUNvdW50IC0gcHJlX3NpemU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBNb2RpZnkgdGhlIGludGlhbGl6ZSBmbGFnIGF0IHRoZSBlbmQuKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSkKLSAgICAgICAgdmlkZW8tPnZvbEluaXRpYWxpemVbY3VyckxheWVyXSA9IDA7Ci0KLSAgICByZXR1cm4gcHZfc3RhdHVzOwotfQotI2VuZGlmIC8qIE5PX1NMSUNFX0VOQ09ERSAqLwotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRIMjYzUHJvZmlsZUxldmVsSUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwMi8wNS8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IEdldCBILjI2MyBQcm9maWxlIElEIGFuZCBsZXZlbCBJRCBmb3IgcHJvZmlsZSAwICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogUHJvZmlsZSBJRD0wLCBsZXZlbElEIGlzIHdoYXQgd2Ugd2FudCAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vdGUgICAgIDogaDI2M0xldmVsWzhdLCByQlJfYm91bmRbOF0sIG1heF9oMjYzX2ZyYW1lcmF0ZVsyXSAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICBtYXhfaDI2M193aWR0aFsyXSwgbWF4X2gyNjNfaGVpZ2h0WzJdIGFyZSBnbG9iYWwgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldEgyNjNQcm9maWxlTGV2ZWxJRChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKnByb2ZpbGVJRCwgSW50ICpsZXZlbElEKQotewotICAgIFZpZGVvRW5jRGF0YSAqZW5jRGF0YTsKLSAgICBJbnQgd2lkdGgsIGhlaWdodDsKLSAgICBmbG9hdCBiaXRyYXRlX3IsIGZyYW1lcmF0ZTsKLQotCi0gICAgLyogRm9yIHRoaXMgdmVyc2lvbiwgd2Ugb25seSBzdXBwb3J0IEguMjYzIHByb2ZpbGUgMCAqLwotICAgICpwcm9maWxlSUQgPSAwOwotCi0gICAgKmxldmVsSUQgPSAwOwotICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKLQotICAgIGlmIChlbmNEYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotICAgIGlmICghZW5jRGF0YS0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpIHJldHVybiBQVl9GQUxTRTsKLQotCi0gICAgLyogZ2V0IGltYWdlIHdpZHRoLCBoZWlnaHQsIGJpdHJhdGUgYW5kIGZyYW1lcmF0ZSAqLwotICAgIHdpZHRoICAgICA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFswXTsKLSAgICBoZWlnaHQgICAgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0WzBdOwotICAgIGJpdHJhdGVfciA9IChmbG9hdCkoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbMF0pIC8gKGZsb2F0KTY0MDAwLjA7Ci0gICAgZnJhbWVyYXRlID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsKLSAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQgfHwgIShiaXRyYXRlX3IgPiAwICYmIGZyYW1lcmF0ZSA+IDApKSByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICAvKiBUaGlzIGlzIHRoZSBtb3N0IGZyZXF1ZW50IGNhc2UgOiBsZXZlbCAxMCAqLwotICAgIGlmIChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzFdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMF0gJiYKLSAgICAgICAgICAgICh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFswXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzBdKSkKLSAgICB7Ci0gICAgICAgICpsZXZlbElEID0gaDI2M0xldmVsWzFdOwotICAgICAgICByZXR1cm4gUFZfVFJVRTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYml0cmF0ZV9yID4gckJSX2JvdW5kWzRdIHx8Ci0gICAgICAgICAgICAgKHdpZHRoID4gbWF4X2gyNjNfd2lkdGhbMV0gfHwgaGVpZ2h0ID4gbWF4X2gyNjNfaGVpZ2h0WzFdKSB8fAotICAgICAgICAgICAgIGZyYW1lcmF0ZSA+IG1heF9oMjYzX2ZyYW1lcmF0ZVsxXSkgICAgLyogY2hlY2sgdGhlIGhpZ2hlc3QgbGV2ZWwgNzAgKi8KLSAgICB7Ci0gICAgICAgICpsZXZlbElEID0gaDI2M0xldmVsWzddOwotICAgICAgICByZXR1cm4gUFZfVFJVRTsKLSAgICB9Ci0gICAgZWxzZSAgIC8qIHNlYXJjaCBsZXZlbCAyMCwgMzAsIDQwICovCi0gICAgewotCi0gICAgICAgIC8qIHBpY2sgb3V0IGxldmVsIDIwICovCi0gICAgICAgIGlmIChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzJdICYmCi0gICAgICAgICAgICAgICAgKCh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFswXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzBdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMV0pIHx8Ci0gICAgICAgICAgICAgICAgICh3aWR0aCA8PSBtYXhfaDI2M193aWR0aFsxXSAmJiBoZWlnaHQgPD0gbWF4X2gyNjNfaGVpZ2h0WzFdICYmIGZyYW1lcmF0ZSA8PSBtYXhfaDI2M19mcmFtZXJhdGVbMF0pKSkKLSAgICAgICAgewotICAgICAgICAgICAgKmxldmVsSUQgPSBoMjYzTGV2ZWxbMl07Ci0gICAgICAgICAgICByZXR1cm4gUFZfVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlICAgLyogd2lkdGgsIGhlaWdodCBhbmQgZnJhbWVyYXRlIGFyZSBvaywgbm93IGNob29zZSBsZXZlbCAzMCBvciA0MCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAqbGV2ZWxJRCA9IChiaXRyYXRlX3IgPD0gckJSX2JvdW5kWzNdID8gaDI2M0xldmVsWzNdIDogaDI2M0xldmVsWzRdKTsKLSAgICAgICAgICAgIHJldHVybiBQVl9UUlVFOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IFBWR2V0TVBFRzRQcm9maWxlTGV2ZWxJRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMjYvMDYvMjAwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBHZXQgTVBFRzQgTGV2ZWwgYWZ0ZXIgaW5pdGlhbGl6ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6IHByb2ZpbGVfbGV2ZWwgYWNjb3JkaW5nIHRvIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldE1QRUc0UHJvZmlsZUxldmVsSUQoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpwcm9maWxlX2xldmVsLCBJbnQgbkxheWVyKQotewotICAgIFZpZGVvRW5jRGF0YSogdmlkZW87Ci0gICAgSW50IGk7Ci0KLSAgICB2aWRlbyA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOwotCi0gICAgaWYgKG5MYXllciA9PSAwKQotICAgIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9PSBwcm9maWxlX2xldmVsX2NvZGVbaV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKnByb2ZpbGVfbGV2ZWwgPSBpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzBdID09IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfY29kZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAqcHJvZmlsZV9sZXZlbCA9IGkgKyBTSU1QTEVfU0NBTEFCTEVfUFJPRklMRV9MRVZFTDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZm5kZWYgTElNSVRFRF9BUEkKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVFbmNGcmFtZVJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNC8wOC8yMDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFVwZGF0ZSB0YXJnZXQgZnJhbWUgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSAgICAqLwotLyogICAgICAgICAgICAgbGF5ZXIoaWYgYW55KSB3aGlsZSBlbmNvZGluZyBvcGVyYXRpb24gaXMgb25nb2luZyAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVlVwZGF0ZUVuY0ZyYW1lUmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBmbG9hdCAqZnJhbWVSYXRlKQotewotICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKLSAgICBJbnQgaTsvLyBuVG90YWxNQiwgbWJQZXJTZWM7Ci0KLSAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0KLSAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICAvKiBVcGRhdGUgdGhlIGZyYW1lcmF0ZXMgZm9yIGFsbCB0aGUgbGF5ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGVuY0RhdGEtPmVuY1BhcmFtcy0+bkxheWVyczsgaSsrKQotICAgIHsKLQotICAgICAgICAvKiBOZXcgY2hlY2s6IGVuY29kaW5nIGZyYW1lcmF0ZSBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSBnaXZlbiBwcm9maWxlIGFuZCBsZXZlbCAqLwotICAgICAgICAvL25Ub3RhbE1CID0gKCgoZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllcldpZHRoW2ldKzE1KS8xNikqMTYpKigoKGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJIZWlnaHRbaV0rMTUpLzE2KSoxNikvKDE2KjE2KTsKLSAgICAgICAgLy9tYlBlclNlYyA9IChJbnQpKG5Ub3RhbE1CICogZnJhbWVSYXRlW2ldKTsKLSAgICAgICAgLy9pZihtYlBlclNlYyA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhNYnNQZXJTZWNbaV0pIHJldHVybiBQVl9GQUxTRTsKLSAgICAgICAgaWYgKGZyYW1lUmF0ZVtpXSA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbaV0pIHJldHVybiBQVl9GQUxTRTsgLyogc2V0IGJ5IHVzZXJzIG9yIHByb2ZpbGUgKi8KLQotICAgICAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldID0gZnJhbWVSYXRlW2ldOwotICAgIH0KLQotICAgIHJldHVybiBSQ19VcGRhdGVCWFJDUGFyYW1zKCh2b2lkKikgZW5jRGF0YSk7Ci0KLX0KLSNlbmRpZgotI2lmbmRlZiBMSU1JVEVEX0FQSQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVlVwZGF0ZUJpdFJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogVXBkYXRlIHRhcmdldCBiaXQgcmF0ZXMgb2YgdGhlIGVuY29kZWQgYmFzZSBhbmQgZW5oYW5jZSAgICAgICovCi0vKiAgICAgICAgICAgICBsYXllcihpZiBhbnkpIHdoaWxlIGVuY29kaW5nIG9wZXJhdGlvbiBpcyBvbmdvaW5nICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogUFZfVFJVRSBpZiBzdWNjZXNzZWQsIFBWX0ZBTFNFIGlmIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLU9TQ0xfRVhQT1JUX1JFRiBCb29sIFBWVXBkYXRlQml0UmF0ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKmJpdFJhdGUpCi17Ci0gICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOwotICAgIEludCBpOwotCi0gICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOwotCi0gICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgLyogVXBkYXRlIHRoZSBiaXRyYXRlcyBmb3IgYWxsIHRoZSBsYXllcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzOyBpKyspCi0gICAgewotICAgICAgICBpZiAoYml0UmF0ZVtpXSA+IGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlW2ldKSAvKiBzZXQgYnkgdXNlcnMgb3IgcHJvZmlsZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5MYXllckJpdFJhdGVbaV0gPSBiaXRSYXRlW2ldOwotICAgIH0KLQotICAgIHJldHVybiBSQ19VcGRhdGVCWFJDUGFyYW1zKCh2b2lkKikgZW5jRGF0YSk7Ci0KLX0KLSNlbmRpZgotI2lmbmRlZiBMSU1JVEVEX0FQSQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVWQlZEZWxheSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDQvMjMvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IFVwZGF0ZSBWQlYgYnVmZmVyIHNpemUoaW4gZGVsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotQm9vbCBQVlVwZGF0ZVZCVkRlbGF5KFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwsIGZsb2F0IGRlbGF5KQotewotCi0gICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOwotICAgIEludCB0b3RhbF9iaXRyYXRlLCBtYXhfYnVmZmVyX3NpemU7Ci0gICAgaW50IGluZGV4OwotCi0gICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOwotCi0gICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgLyogQ2hlY2sgd2hldGhlciB0aGUgaW5wdXQgZGVsYXkgaXMgdmFsaWQgYmFzZWQgb24gdGhlIGdpdmVuIHByb2ZpbGUgKi8KLSAgICB0b3RhbF9iaXRyYXRlICAgPSAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDEgPyBlbmNEYXRhLT5lbmNQYXJhbXMtPkxheWVyQml0UmF0ZVswXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgIGVuY0RhdGEtPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzFdKTsKLSAgICBpbmRleCA9IGVuY0RhdGEtPmVuY1BhcmFtcy0+cHJvZmlsZV90YWJsZV9pbmRleDsKLSAgICBtYXhfYnVmZmVyX3NpemUgPSAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDEgPyBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0gOgotICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVtpbmRleF0pOwotCi0gICAgaWYgKHRvdGFsX2JpdHJhdGUqZGVsYXkgPiAoZmxvYXQpbWF4X2J1ZmZlcl9zaXplKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPlZCVl9kZWxheSA9IGRlbGF5OwotICAgIHJldHVybiBQVl9UUlVFOwotCi19Ci0jZW5kaWYKLSNpZm5kZWYgTElNSVRFRF9BUEkKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZVcGRhdGVJRnJhbWVJbnRlcnZhbCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDQvMTAvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiB1cGRhdGVzIHRoZSBJTlRSQSBmcmFtZSByZWZyZXNoIGludGVydmFsIHdoaWxlIGVuY29kaW5nICAgICAgKi8KLS8qICAgICAgICAgICAgIGlzIG9uZ29pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZVcGRhdGVJRnJhbWVJbnRlcnZhbChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgYUlGcmFtZVBlcmlvZCkKLXsKLSAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7Ci0KLSAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0KLSAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICBlbmNEYXRhLT5lbmNQYXJhbXMtPkludHJhUGVyaW9kID0gYUlGcmFtZVBlcmlvZDsKLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLSNlbmRpZgotI2lmbmRlZiBMSU1JVEVEX0FQSQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVlNldE51bUludHJhTUJSZWZyZXNoKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzA1LzIwMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotT1NDTF9FWFBPUlRfUkVGIEJvb2wgICAgUFZVcGRhdGVOdW1JbnRyYU1CUmVmcmVzaChWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgbnVtTUIpCi17Ci0gICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOwotCi0gICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOwotCi0gICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotCi0gICAgZW5jRGF0YS0+ZW5jUGFyYW1zLT5SZWZyZXNoID0gbnVtTUI7Ci0KLSAgICByZXR1cm4gUFZfVFJVRTsKLX0KLSNlbmRpZgotI2lmbmRlZiBMSU1JVEVEX0FQSQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVklGcmFtZVJlcXVlc3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzEwLzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogZW5jb2RlcyB0aGUgbmV4dCBiYXNlIGZyYW1lIGFzIGFuIEktVm9wICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVklGcmFtZVJlcXVlc3QoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCkKLXsKLSAgICBWaWRlb0VuY0RhdGEgICAgKmVuY0RhdGE7Ci0KLSAgICBlbmNEYXRhID0gKFZpZGVvRW5jRGF0YSAqKWVuY0N0cmwtPnZpZGVvRW5jb2RlckRhdGE7Ci0KLSAgICBpZiAoZW5jRGF0YSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgaWYgKGVuY0RhdGEtPmVuY1BhcmFtcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0KLSAgICBlbmNEYXRhLT5uZXh0RW5jSVZvcCA9IDE7Ci0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0jZW5kaWYKLSNpZm5kZWYgTElNSVRFRF9BUEkKLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRFbmNNZW1vcnlVc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxMC8xNy8yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotT1NDTF9FWFBPUlRfUkVGIEludCBQVkdldEVuY01lbW9yeVVzYWdlKFZpZGVvRW5jQ29udHJvbHMgKmVuY0N0cmwpCi17Ci0gICAgVmlkZW9FbmNEYXRhICAgICplbmNEYXRhOwotCi0gICAgZW5jRGF0YSA9IChWaWRlb0VuY0RhdGEgKillbmNDdHJsLT52aWRlb0VuY29kZXJEYXRhOwotCi0gICAgaWYgKGVuY0RhdGEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgIHJldHVybiBlbmNEYXRhLT5lbmNQYXJhbXMtPk1lbW9yeVVzYWdlOwotfQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRIaW50VHJhY2soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAxLzE3LzIwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXRIaW50VHJhY2soVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgTVA0SGludFRyYWNrICppbmZvKQotewotICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKLQotICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKLQotICAgIGlmIChlbmNEYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICBpbmZvLT5NVEIgPSBlbmNEYXRhLT5oaW50VHJhY2tJbmZvLk1UQjsKLSAgICBpbmZvLT5MYXllcklEID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5MYXllcklEOwotICAgIGluZm8tPkNvZGVUeXBlID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5Db2RlVHlwZTsKLSAgICBpbmZvLT5SZWZTZWxDb2RlID0gZW5jRGF0YS0+aGludFRyYWNrSW5mby5SZWZTZWxDb2RlOwotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogUFZHZXRNYXhWaWRlb0ZyYW1lU2l6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiA3LzE3LzIwMDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IEZ1bmN0aW9uIG1lcmVseSByZXR1cm5zIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBQVl9UUlVFIGlmIHN1Y2Nlc3NlZCwgUFZfRkFMU0UgaWYgZmFpbGVkLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotT1NDTF9FWFBPUlRfUkVGIEJvb2wgUFZHZXRNYXhWaWRlb0ZyYW1lU2l6ZShWaWRlb0VuY0NvbnRyb2xzICplbmNDdHJsLCBJbnQgKm1heFZpZGVvRnJhbWVTaXplKQotewotICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKLQotICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKLQotICAgIGlmIChlbmNEYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotCi0KLSAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF07Ci0KLSAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zLT5uTGF5ZXJzID09IDIpCi0gICAgICAgIGlmICgqbWF4VmlkZW9GcmFtZVNpemUgPCBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV0pCi0gICAgICAgICAgICAqbWF4VmlkZW9GcmFtZVNpemUgPSBlbmNEYXRhLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMV07Ci0gICAgKm1heFZpZGVvRnJhbWVTaXplID4+PSAzOyAgIC8qIENvbnZlcnQgdG8gQnl0ZXMgKi8KLQotICAgIGlmICgqbWF4VmlkZW9GcmFtZVNpemUgPD0gNDAwMCkKLSAgICAgICAgKm1heFZpZGVvRnJhbWVTaXplID0gNDAwMDsKLQotICAgIHJldHVybiBQVl9UUlVFOwotfQotI2lmbmRlZiBMSU1JVEVEX0FQSQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBQVkdldFZCVlNpemUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDQvMTUvMjAwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRnVuY3Rpb24gbWVyZWx5IHJldHVybnMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1PU0NMX0VYUE9SVF9SRUYgQm9vbCBQVkdldFZCVlNpemUoVmlkZW9FbmNDb250cm9scyAqZW5jQ3RybCwgSW50ICpWQlZTaXplKQotewotICAgIFZpZGVvRW5jRGF0YSAgICAqZW5jRGF0YTsKLQotICAgIGVuY0RhdGEgPSAoVmlkZW9FbmNEYXRhICopZW5jQ3RybC0+dmlkZW9FbmNvZGVyRGF0YTsKLQotICAgIGlmIChlbmNEYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLSAgICBpZiAoZW5jRGF0YS0+ZW5jUGFyYW1zID09IE5VTEwpCi0gICAgICAgIHJldHVybiBQVl9GQUxTRTsKLQotICAgICpWQlZTaXplID0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdOwotICAgIGlmIChlbmNEYXRhLT5lbmNQYXJhbXMtPm5MYXllcnMgPT0gMikKLSAgICAgICAgKlZCVlNpemUgKz0gZW5jRGF0YS0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdOwotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci0KLX0KLSNlbmRpZgotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBFbmNvZGVWT1NfU3RhcnQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRW5jb2RlcyB0aGUgVk9TLFZPLCBhbmQgVk9MIG9yIFNob3J0IEhlYWRlcnMgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotUFZfU1RBVFVTIEVuY29kZVZPU19TdGFydChWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCkKLXsKLQotICAgIFZpZGVvRW5jRGF0YSAqdmlkZW8gPSAoVmlkZW9FbmNEYXRhICopZW5jb2RlckNvbnRyb2wtPnZpZGVvRW5jb2RlckRhdGE7Ci0gICAgVm9sICAgICAgICAgKmN1cnJWb2wgPSB2aWRlby0+dm9sW3ZpZGVvLT5jdXJyTGF5ZXJdOwotICAgIFBWX1NUQVRVUyBzdGF0dXMgPSBQVl9TVUNDRVNTOwotICAgIC8vaW50IHByb2ZpbGVfbGV2ZWw9MHgwMTsKLSAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gdmlkZW8tPmJpdHN0cmVhbTE7Ci0gICAgaW50IGksIGo7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogQ2hlY2sgZm9yIHNob3J0X3ZpZGVvX2hlYWRlciAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoY3VyclZvbC0+c2hvcnRWaWRlb0hlYWRlciA9PSAxKQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFNob3J0IFZpZGVvIEhlYWRlciBvciBNNFYgKi8KLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFZpc3VhbE9iamVjdFNlcXVlbmNlICgpKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBTRVNTSU9OX1NUQVJUX0NPREUpOwotICAgICAgICAvKiAgRGV0ZXJtaW5lIHByb2ZpbGVfbGV2ZWwgKi8KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFt2aWRlby0+Y3VyckxheWVyXSk7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVmlzdWFsT2JqZWN0KCkgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIDMyLCBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUpOwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOyAvKiB2aXN1YWwgb2JqZWN0IGlkZW50aWZpZXIgKi8KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDQsIDB4MDEpOyAvKiB2aXN1YWwgb2JqZWN0IFR5cGUgPT0gInZpZGVvIElEIiAqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOyAvKiBubyB2aWRlbyBzaWduYWwgdHlwZSAqLwotCi0gICAgICAgIC8qdGVtcCAgID0gKi8KLSAgICAgICAgQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhzdHJlYW0pOwotCi0KLSAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1QxNkJpdHMoc3RyZWFtLCAyNywgVk9fU1RBUlRfQ09ERSk7LyogYnl0ZSBhbGlnbjogc2hvdWxkIGJlIDIgYml0cyAqLwotICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgMHgwMCk7LyogIFZpZGVvIElEID0gMCAgKi8KLQotCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFZpZGVvT2JqZWN0TGF5ZXIoKSAqLwotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgaWYgKGN1cnJWb2wtPnNob3J0VmlkZW9IZWFkZXIgPT0gMCkKLSAgICAgICAgeyAvKiBNNFYgIGVsc2UgU2hvcnQgVmlkZW8gSGVhZGVyICovCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRHVDE2Qml0cyhzdHJlYW0sIFZPTF9TVEFSVF9DT0RFX0xFTkdUSCwgVk9MX1NUQVJUX0NPREUpOwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDQsIGN1cnJWb2wtPnZvbElEKTsvKiAgdmlkZW9fb2JqZWN0X2xheWVyX2lkICovCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qICBSYW5kb20gQWNjZXNzID0gMCAgKi8KLQotICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyTGF5ZXIgPT0gMCkKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMHgwMSk7LyogVmlkZW8gT2JqZWN0IFR5cGUgSW5kaWNhdGlvbiA9IDEgIC4uLiBTaW1wbGUgT2JqZWN0IFR5cGUgKi8KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMHgwMik7LyogVmlkZW8gT2JqZWN0IFR5cGUgSW5kaWNhdGlvbiA9IDIgIC4uLiBTaW1wbGUgU2NhbGFibGUgT2JqZWN0IFR5cGUgKi8KLQotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiAgaXNfb2JqZWN0X2xheWVyX2lkZW50aWZlciA9IDAgKi8KLQotCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgMHgwMSk7IC8qIGFzcGVjdF9yYXRpb19pbmZvID0gMSAuLi4gMToxKFNxdWFyZSkgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMCk7Lyogdm9sX2NvbnRyb2xfcGFyYW1ldGVycyA9IDAgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCAyLCAweDAwKTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfc2hhcGUgPSAwMCAuLi4gcmVjdGFuZ3VsYXIgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDE2LCBjdXJyVm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbik7Lyogdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5maXhlZFZvcFJhdGUpOy8qIGZpeGVkX3ZvcF9yYXRlID0gMCAqLwotCi0gICAgICAgICAgICAvKiBGb3IgUmVjdGFuZ3VsYXIgVk8gbGF5ZXIgc2hhcGUgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7LyogbWFya2VyIGJpdCAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0R1Q4Qml0cyhzdHJlYW0sIDEzLCBjdXJyVm9sLT53aWR0aCk7LyogdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoICovCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOy8qIG1hcmtlciBiaXQgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEdUOEJpdHMoc3RyZWFtLCAxMywgY3VyclZvbC0+aGVpZ2h0KTsvKiB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOy8qbWFya2VyIGJpdCAqLwotCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDApOy8qaW50ZXJsYWNlZCA9IDAgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgMHgwMSk7Lyogb2JtY19kaXNhYmxlID0gMSAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiBzcHJpdGVfZW5hYmxlID0gMCAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCAweDAwKTsvKiBub3RfOF9iaXQgPSAwICovCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnF1YW50VHlwZSk7LyogICBxdWFudF90eXBlICovCi0KLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5xdWFudFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCk7IC8qIEludHJhIHF1YW50IG1hdHJpeCAqLwotICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5sb2FkSW50cmFRdWFudE1hdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDYzOyBqID49IDE7IGotLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyVm9sLT5pcW1hdFsqKHppZ3phZ19pK2opXSAhPSBjdXJyVm9sLT5pcW1hdFsqKHppZ3phZ19pK2otMSldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGogPT0gMSkgJiYgKGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraildID09IGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2krai0xKV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqICsgMTsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIGN1cnJWb2wtPmlxbWF0WyooemlnemFnX2kraSldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPCA2MykKLSAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA4LCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyVm9sLT5pcW1hdFtqXSA9IG1wZWdfaXFtYXRfZGVmW2pdOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+bG9hZE5vbkludHJhUXVhbnRNYXQpOyAvKiBOb24tSW50cmEgcXVhbnQgbWF0cml4ICovCi0gICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPmxvYWROb25JbnRyYVF1YW50TWF0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gNjM7IGogPj0gMTsgai0tKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2opXSAhPSBjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqLTEpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChqID09IDEpICYmIChjdXJyVm9sLT5uaXFtYXRbKih6aWd6YWdfaStqKV0gPT0gY3VyclZvbC0+bmlxbWF0WyooemlnemFnX2krai0xKV0pKQotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqICsgMTsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDgsIGN1cnJWb2wtPm5pcW1hdFsqKHppZ3phZ19pK2kpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqIDwgNjMpCi0gICAgICAgICAgICAgICAgICAgICAgICBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgOCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgY3VyclZvbC0+bmlxbWF0W2pdID0gbXBlZ19ucW1hdF9kZWZbal07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIDB4MDEpOyAgIC8qIGNvbXBsZXhpdHlfZXN0aW1hdGlvbl9kaXNhYmxlID0gMSAqLwotICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5SZXN5bmNNYXJrZXJEaXNhYmxlKTsvKiBSZXN5bmNfbWFya2VyX2Rpc2FibGUgKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZyk7LyogRGF0YSBwYXJ0aXRpb25lZCAqLwotCi0gICAgICAgICAgICBpZiAoY3VyclZvbC0+ZGF0YVBhcnRpdGlvbmluZykKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnVzZVJldmVyc2VWTEMpOyAvKiBSZXZlcnNpYmxlX3ZsYyAqLwotCi0KLSAgICAgICAgICAgIGlmIChjdXJyVm9sLT5zY2FsYWJpbGl0eSkgLyogU2NhbGFiaWxpdHkqLwotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsYWJpbGl0eSk7LyogU2NhbGFiaWxpdHkgPSAxICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5zY2FsVHlwZSk7LyogaGllcmFyY2h5IF90eXBlIC4uLiBTcGF0aWFsPSAwIGFuZCBUZW1wb3JhbCA9IDEgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNCwgY3VyclZvbC0+cmVmVm9sSUQpOy8qIHJlZl9sYXllcl9pZCAgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXQxQml0cyhzdHJlYW0sIGN1cnJWb2wtPnJlZlNhbXBEaXIpOy8qIHJlZl9sYXllcl9zYW1wbGluZ19kaXJlYyovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0Qml0cyhzdHJlYW0sIDUsIGN1cnJWb2wtPmhvclNhbXBfbik7Lypob3Jfc2FtcGxpbmdfZmFjdG9yX24qLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT5ob3JTYW1wX20pOy8qaG9yX3NhbXBsaW5nX2ZhY3Rvcl9tKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgNSwgY3VyclZvbC0+dmVyU2FtcF9uKTsvKnZlcnRfc2FtcGxpbmdfZmFjdG9yX24qLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dEJpdHMoc3RyZWFtLCA1LCBjdXJyVm9sLT52ZXJTYW1wX20pOy8qdmVydF9zYW1wbGluZ19mYWN0b3JfbSovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtUHV0MUJpdHMoc3RyZWFtLCBjdXJyVm9sLT5lbmhhbmNlbWVudFR5cGUpOy8qIGVuaGFuY2VtZW50X3R5cGUqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBObyBTY2FsYWJpbGl0eSAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVB1dDFCaXRzKHN0cmVhbSwgY3VyclZvbC0+c2NhbGFiaWxpdHkpOy8qIFNjYWxhYmlsaXR5ID0gMCAqLwotCi0gICAgICAgICAgICAvKnRlbXAgPSAqLwotICAgICAgICAgICAgQml0c3RyZWFtTXBlZzRCeXRlQWxpZ25TdHVmZmluZyhzdHJlYW0pOyAvKiBCeXRlIGFsaWduIEhlYWRlcnMgZm9yIFZPUCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBWT1NfRW5kKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA4LzIyLzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogVmlzdWFsIE9iamVjdCBTZXF1ZW5jZSBFbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXR1cm4gICA6IFBWX1RSVUUgaWYgc3VjY2Vzc2VkLCBQVl9GQUxTRSBpZiBmYWlsZWQuICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1QVl9TVEFUVVMgVk9TX0VuZChWaWRlb0VuY0NvbnRyb2xzICplbmNvZGVyQ29udHJvbCkKLXsKLSAgICBQVl9TVEFUVVMgc3RhdHVzID0gUFZfU1VDQ0VTUzsKLSAgICBWaWRlb0VuY0RhdGEgKnZpZGVvID0gKFZpZGVvRW5jRGF0YSAqKWVuY29kZXJDb250cm9sLT52aWRlb0VuY29kZXJEYXRhOwotICAgIFZvbCAgICAgICAgICpjdXJyVm9sID0gdmlkZW8tPnZvbFt2aWRlby0+Y3VyckxheWVyXTsKLSAgICBCaXRzdHJlYW1FbmNWaWRlbyAqc3RyZWFtID0gY3VyclZvbC0+c3RyZWFtOwotCi0KLSAgICBzdGF0dXMgPSBCaXRzdHJlYW1QdXRCaXRzKHN0cmVhbSwgU0VTU0lPTl9FTkRfQ09ERSwgMzIpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBEZXRlcm1pbmVDb2RpbmdMYXllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA2LzAyLzIwMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogRmluZCBsYXllciB0byBjb2RlIGJhc2VkIG9uIGN1cnJlbnQgbW9kIHRpbWUsIGFzc3VtaW5nIHRoYXQKLSAgICAgICAgICAgICAgIGl0J3MgdGltZSB0byBlbmNvZGUgZW5oYW5jZWQgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiBOdW1iZXIgb2YgbGF5ZXIgdG8gY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotSW50IERldGVybWluZUNvZGluZ0xheWVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCAqbkxheWVyLCBVTG9uZyBtb2RUaW1lKQotewotICAgIFZvbCAqKnZvbCA9IHZpZGVvLT52b2w7Ci0gICAgVmlkZW9FbmNQYXJhbXMgKmVuY1BhcmFtcyA9IHZpZGVvLT5lbmNQYXJhbXM7Ci0gICAgSW50IG51bUxheWVycyA9IGVuY1BhcmFtcy0+bkxheWVyczsKLSAgICBVSW50IG1vZFRpbWVSZWYgPSB2aWRlby0+bW9kVGltZVJlZjsKLSAgICBmbG9hdCAqTGF5ZXJGcmFtZVJhdGUgPSBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlOwotICAgIFVJbnQgZnJhbWVOdW1bNF0sIGZyYW1lVGljazsKLSAgICBVTG9uZyBmcmFtZU1vZFRpbWUsIG5leHRGcm1Nb2RUaW1lOwotI2lmZGVmIFJFRFVDRV9GUkFNRV9WQVJJQU5DRSAgICAvKiBUbyBsaW1pdCBob3cgY2xvc2UgMiBmcmFtZXMgY2FuIGJlICovCi0gICAgZmxvYXQgZnJhbWVJbnRlcnZhbDsKLSNlbmRpZgotICAgIGZsb2F0IHNyY0ZyYW1lSW50ZXJ2YWw7Ci0gICAgSW50IGZyYW1lSW5jOwotICAgIEludCBpLCBleHRyYV9za2lwOwotICAgIEludCBlbmNvZGVWb3AgPSAwOwotCi0gICAgaSA9IG51bUxheWVycyAtIDE7Ci0KLSAgICBpZiAobW9kVGltZSAtIHZpZGVvLT5uZXh0TW9kVGltZSA+ICgoVUxvbmcpKC0xKSkgPj4gMSkgLyogbmV4dCB0aW1lIHdyYXBwZWQgYXJvdW5kICovCi0gICAgICAgIHJldHVybiAwOyAvKiBub3QgdGltZSB0byBjb2RlIGl0IHlldCAqLwotCi0gICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gLT0gMTAwMDsKLSAgICB2aWRlby0+bmV4dEVuY0lWb3AtLTsgIC8qIG51bWJlciBvZiBWb3BzIGluIGhpZ2hlc3QgbGF5ZXIgcmVzb2x1dGlvbi4gKi8KLSAgICB2aWRlby0+bnVtVm9wc0luR09QKys7Ci0KLSAgICAvKiBmcm9tIHRoaXMgcG9pbnQgZnJhbWVNb2RUaW1lIGFuZCBuZXh0RnJtTW9kVGltZSBhcmUgaW50ZXJuYWwgKi8KLQotICAgIGZyYW1lTnVtW2ldID0gKFVJbnQpKChtb2RUaW1lIC0gbW9kVGltZVJlZikgKiBMYXllckZyYW1lUmF0ZVtpXSArIDUwMCkgLyAxMDAwOwotICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtpXSkKLSAgICB7Ci0gICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0gPSBmcmFtZU51bVtpXSAtIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKGZyYW1lTnVtW2ldIDw9IHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pCi0gICAgewotICAgICAgICByZXR1cm4gMDsgLyogZG8gbm90IGVuY29kZSB0aGlzIGZyYW1lICovCi0gICAgfQotCi0gICAgLyoqKiogdGhpcyBwYXJ0IGNvbXB1dGVzIGV4cGVjdGVkIG5leHQgZnJhbWUgKioqKioqKi8KLSAgICBmcmFtZU1vZFRpbWUgPSAoVUxvbmcpKCgoZnJhbWVOdW1baV0gKiAxMDAwKSAvIExheWVyRnJhbWVSYXRlW2ldKSArIG1vZFRpbWVSZWYgKyAwLjUpOyAvKiByZWMuIHRpbWUgKi8KLSAgICBuZXh0RnJtTW9kVGltZSA9IChVTG9uZykoKCgoZnJhbWVOdW1baV0gKyAxKSAqIDEwMDApIC8gTGF5ZXJGcmFtZVJhdGVbaV0pICsgbW9kVGltZVJlZiArIDAuNSk7IC8qIHJlYy4gdGltZSAqLwotCi0gICAgc3JjRnJhbWVJbnRlcnZhbCA9IDEwMDAgLyB2aWRlby0+RnJhbWVSYXRlOwotCi0gICAgdmlkZW8tPm5leHRNb2RUaW1lID0gbmV4dEZybU1vZFRpbWUgLSAoVUxvbmcpKHNyY0ZyYW1lSW50ZXJ2YWwgLyAyLikgLSAxOyAvKiBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5leHQgZnJhbWUgKi8KLQotI2lmZGVmIFJFRFVDRV9GUkFNRV9WQVJJQU5DRSAgICAvKiBUbyBsaW1pdCBob3cgY2xvc2UgMiBmcmFtZXMgY2FuIGJlICovCi0gICAgZnJhbWVJbnRlcnZhbCA9IDEwMDAgLyBMYXllckZyYW1lUmF0ZVtpXTsgLyogbmV4dCByZWMuIHRpbWUgKi8KLSAgICBkZWx0YSA9IChJbnQpKGZyYW1lSW50ZXJ2YWwgLyA0KTsgLyogZW1waXJpY2FsIG51bWJlciAqLwotICAgIGlmICh2aWRlby0+bmV4dE1vZFRpbWUgLSBtb2RUaW1lICA8IChVTG9uZylkZWx0YSkgLyogbmVlZCB0byBtb3ZlIG5leHRNb2RUaW1lIGZ1cnRoZXIuICovCi0gICAgewotICAgICAgICB2aWRlby0+bmV4dE1vZFRpbWUgKz0gKChkZWx0YSAtIHZpZGVvLT5uZXh0TW9kVGltZSArIG1vZFRpbWUpKTsgLyogZW1waXJpY2FsIGZvcm11bGEgICovCi0gICAgfQotI2VuZGlmCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBtYXAgZnJhbWUgbm8udG8gdGljayBmcm9tIG1vZFRpbWVSZWYgKi8KLSAgICAvKmZyYW1lVGljayA9IChmcmFtZU51bVtpXSp2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKSA7Ci0gICAgZnJhbWVUaWNrID0gKFVJbnQpKChmcmFtZVRpY2sgKyAoZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXS8yKSkvZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7Ki8KLSAgICAvKiAgMTEvMTYvMDEsIGNoYW5nZSBmcmFtZVRpY2sgdG8gYmUgdGhlIGNsb3Nlc3QgdGljayBmcm9tIHRoZSBhY3R1YWwgbW9kVGltZSAqLwotICAgIC8qICAxMi8xMi8wMiwgYWRkIChkb3VibGUpIHRvIHByZXZlbnQgbGFyZ2UgbnVtYmVyIHdyYXAtYXJvdW5kICovCi0gICAgZnJhbWVUaWNrID0gKEludCkoKChkb3VibGUpKG1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIHZvbFtpXS0+dGltZUluY3JlbWVudFJlc29sdXRpb24gKyA1MDApIC8gMTAwMCk7Ci0KLSAgICAvKiBmaW5kIHRpbWVJbmNyZW1lbnQgdG8gYmUgcHV0IGluIHRoZSBiaXRzdHJlYW0gKi8KLSAgICAvKiByZWZUaWNrIGlzIHNlY29uZCBib3VuZGFyeSByZWZlcmVuY2UuICovCi0gICAgdm9sW2ldLT50aW1lSW5jcmVtZW50ID0gZnJhbWVUaWNrIC0gdmlkZW8tPnJlZlRpY2tbaV07Ci0KLQotICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UgPSAwOwotICAgIHdoaWxlICh2b2xbaV0tPnRpbWVJbmNyZW1lbnQgPj0gdm9sW2ldLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbikKLSAgICB7Ci0gICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCAtPSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOwotICAgICAgICB2b2xbaV0tPm1vZHVsb1RpbWVCYXNlKys7Ci0gICAgICAgIC8qIGRvIG5vdCB1cGRhdGUgcmVmVGljayBhbmQgbW9kVGltZVJlZiB5ZXQsIGRvIGl0IGFmdGVyIGVuY29kaW5nISEgKi8KLSAgICB9Ci0KLSAgICBpZiAodmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gPD0gMCkgICAgLyogbm8gc2tpcHBpbmcgKi8KLSAgICB7Ci0gICAgICAgIGVuY29kZVZvcCA9IDE7Ci0gICAgICAgIHZpZGVvLT5jdXJyTGF5ZXIgPSAqbkxheWVyID0gaTsKLSAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0gMTAwMDsKLQotICAgICAgICAvKiB0YWtlcyBjYXJlIG9mIG1vcmUgZHJvcHBlZCBmcmFtZSB0aGFuIGV4cGVjdGVkICovCi0gICAgICAgIGV4dHJhX3NraXAgPSAtMTsKLSAgICAgICAgZnJhbWVJbmMgPSAoZnJhbWVOdW1baV0gLSB2aWRlby0+cHJldkZyYW1lTnVtW2ldKTsKLSAgICAgICAgZXh0cmFfc2tpcCArPSBmcmFtZUluYzsKLQotICAgICAgICBpZiAoZXh0cmFfc2tpcCA+IDApCi0gICAgICAgIHsgICAvKiB1cGRhdGUgcmMtPk5yLCByYy0+QiwgKHJjLT5ScikqLwotICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wIC09IGV4dHJhX3NraXA7Ci0gICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QICs9IGV4dHJhX3NraXA7Ci0gICAgICAgICAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUkNfVXBkYXRlQnVmZmVyKHZpZGVvLCBpLCBleHRyYV9za2lwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotICAgIC8qIHVwZGF0ZSBmcmFtZSBuby4gKi8KLSAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV07Ci0KLSAgICAvKiBnbyB0aHJvdWdoIGFsbCBsb3dlciBsYXllciAqLwotICAgIGZvciAoaSA9IChudW1MYXllcnMgLSAyKTsgaSA+PSAwOyBpLS0pCi0gICAgewotCi0gICAgICAgIHZpZGVvLT5yZWxMYXllckNvZGVUaW1lW2ldIC09IDEwMDA7Ci0KLSAgICAgICAgLyogZmluZCB0aW1lSW5jcmVtZW50IHRvIGJlIHB1dCBpbiB0aGUgYml0c3RyZWFtICovCi0gICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCA9IGZyYW1lVGljayAtIHZpZGVvLT5yZWZUaWNrW2ldOwotCi0gICAgICAgIGlmICh2aWRlby0+cmVsTGF5ZXJDb2RlVGltZVtpXSA8PSAwKSAvKiB0aW1lIHRvIGVuY29kZSBiYXNlICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIDEyLzI3LzAwICovCi0gICAgICAgICAgICBlbmNvZGVWb3AgPSAxOwotICAgICAgICAgICAgdmlkZW8tPmN1cnJMYXllciA9ICpuTGF5ZXIgPSBpOwotICAgICAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0KLSAgICAgICAgICAgICAgICAoSW50KSgoMTAwMC4wICogZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtudW1MYXllcnMtMV0pIC8gZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVtpXSk7Ci0KLSAgICAgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UgPSAwOwotICAgICAgICAgICAgd2hpbGUgKHZvbFtpXS0+dGltZUluY3JlbWVudCA+PSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZvbFtpXS0+dGltZUluY3JlbWVudCAtPSB2b2xbaV0tPnRpbWVJbmNyZW1lbnRSZXNvbHV0aW9uOwotICAgICAgICAgICAgICAgIHZvbFtpXS0+bW9kdWxvVGltZUJhc2UrKzsKLSAgICAgICAgICAgICAgICAvKiBkbyBub3QgdXBkYXRlIHJlZlRpY2sgYW5kIG1vZFRpbWVSZWYgeWV0LCBkbyBpdCBhZnRlciBlbmNvZGluZyEhICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHRha2VzIGNhcmUgb2YgbW9yZSBkcm9wcGVkIGZyYW1lIHRoYW4gZXhwZWN0ZWQgKi8KLSAgICAgICAgICAgIGZyYW1lTnVtW2ldID0gKFVJbnQpKChmcmFtZU1vZFRpbWUgLSBtb2RUaW1lUmVmKSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0gKyA1MDApIC8gMTAwMDsKLSAgICAgICAgICAgIGlmICh2aWRlby0+dm9sSW5pdGlhbGl6ZVtpXSkKLSAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV0gLSAxOwotCi0gICAgICAgICAgICBleHRyYV9za2lwID0gLTE7Ci0gICAgICAgICAgICBmcmFtZUluYyA9IChmcmFtZU51bVtpXSAtIHZpZGVvLT5wcmV2RnJhbWVOdW1baV0pOwotICAgICAgICAgICAgZXh0cmFfc2tpcCArPSBmcmFtZUluYzsKLQotICAgICAgICAgICAgaWYgKGV4dHJhX3NraXAgPiAwKQotICAgICAgICAgICAgeyAgIC8qIHVwZGF0ZSByYy0+TnIsIHJjLT5CLCAocmMtPlJyKSovCi0gICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSAhPSBDT05TVEFOVF9RKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUkNfVXBkYXRlQnVmZmVyKHZpZGVvLCBpLCBleHRyYV9za2lwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiB1cGRhdGUgZnJhbWUgbm8uICovCi0gICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldID0gZnJhbWVOdW1baV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgIGlmIChlbmNvZGVWb3ApCi0gICAgICAgIHByaW50ZigiIFRJOiAlZCAiLCB2b2xbKm5MYXllcl0tPnRpbWVJbmNyZW1lbnQpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gZW5jb2RlVm9wOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qICBGdW5jdGlvbiA6IERldGVybWluZVZvcFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGUgICAgIDogMDYvMDIvMjAwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHVycG9zZSAgOiBUaGUgbmFtZSBzYXlzIGl0IGFsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogdm9pZCAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgRGV0ZXJtaW5lVm9wVHlwZShWaWRlb0VuY0RhdGEgKnZpZGVvLCBJbnQgY3VyckxheWVyKQotewotICAgIFZpZGVvRW5jUGFyYW1zICplbmNQYXJhbXMgPSB2aWRlby0+ZW5jUGFyYW1zOwotLy8gIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKLQotICAgIGlmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IDApIC8qIEktVk9QcyBvbmx5ICovCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA+IDApCi0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKLSAgICAgICAgICAgIGlmICh2aWRlby0+bnVtVm9wc0luR09QID49IDEzMikKLSAgICAgICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IC0xKSAgLyogSVBQUFBQLi4uICovCi0gICAgewotCi0gICAgICAgIC8qIG1haW50YWluIGZyYW1lIHR5cGUgaWYgcHJldmlvdXMgZnJhbWUgaXMgcHJlLXNraXBwZWQsIDA2LzAyLzIwMDEgKi8KLSAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RIHx8IHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5za2lwX25leHRfZnJhbWUgIT0gLTEpCi0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKLQotICAgICAgICBpZiAodmlkZW8tPmN1cnJMYXllciA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoLyp2aWRlby0+bnVtVm9wc0luR09QPj0xMzIgfHwgKi92aWRlby0+dm9sSW5pdGlhbGl6ZVtjdXJyTGF5ZXJdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9IElfVk9QOwotICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOyAvKiBmb3JjZSBJTlRSQSB1cGRhdGUgZXZlcnkgMTMyIGJhc2UgZnJhbWVzKi8KLSAgICAgICAgICAgICAgICB2aWRlby0+bmV4dEVuY0lWb3AgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm5leHRFbmNJVm9wID09IDAgfHwgdmlkZW8tPmN1cnJWb3AtPnByZWRpY3Rpb25UeXBlID09IElfVk9QKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZpZGVvLT5udW1Wb3BzSW5HT1AgPSAwOwotICAgICAgICAgICAgICAgIHZpZGVvLT5uZXh0RW5jSVZvcCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAgIC8qIEludHJhUGVyaW9kPjAgOiBJUFBQUFBJUFBQUFBJLi4uICovCi0gICAgewotCi0gICAgICAgIC8qIG1haW50YWluIGZyYW1lIHR5cGUgaWYgcHJldmlvdXMgZnJhbWUgaXMgcHJlLXNraXBwZWQsIDA2LzAyLzIwMDEgKi8KLSAgICAgICAgaWYgKGVuY1BhcmFtcy0+UkNfVHlwZSA9PSBDT05TVEFOVF9RIHx8IHZpZGVvLT5yY1tjdXJyTGF5ZXJdLT5za2lwX25leHRfZnJhbWUgIT0gLTEpCi0gICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBQX1ZPUDsKLQotICAgICAgICBpZiAoY3VyckxheWVyID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2aWRlby0+bmV4dEVuY0lWb3AgPD0gMCB8fCB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPT0gSV9WT1ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gZW5jUGFyYW1zLT5JbnRyYVBlcmlvZDsKLSAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclZvcC0+cHJlZGljdGlvblR5cGUgPSBJX1ZPUDsKLSAgICAgICAgICAgICAgICB2aWRlby0+bnVtVm9wc0luR09QID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiA7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogIEZ1bmN0aW9uIDogVXBkYXRlU2tpcE5leHRGcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF0ZSAgICAgOiAwNi8wMi8yMDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQdXJwb3NlICA6IEZyb20gcmF0ZSBjb250cm9sIGZyYW1lIHNraXBwaW5nIGRlY2lzaW9uLCB1cGRhdGUgdGltaW5nCi0gICAgICAgICAgICAgICAgcmVsYXRlZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJldHVybiAgIDogQ3VycmVudCBjb2RlZCBsYXllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLUludCBVcGRhdGVTa2lwTmV4dEZyYW1lKFZpZGVvRW5jRGF0YSAqdmlkZW8sIFVMb25nICptb2RUaW1lLCBJbnQgKnNpemUsIFBWX1NUQVRVUyBzdGF0dXMpCi17Ci0gICAgSW50IGN1cnJMYXllciA9IHZpZGVvLT5jdXJyTGF5ZXI7Ci0gICAgSW50IG5MYXllciA9IGN1cnJMYXllcjsKLSAgICBWaWRlb0VuY1BhcmFtcyAqZW5jUGFyYW1zID0gdmlkZW8tPmVuY1BhcmFtczsKLSAgICBJbnQgbnVtTGF5ZXJzID0gZW5jUGFyYW1zLT5uTGF5ZXJzOwotICAgIFZvbCAqY3VyclZvbCA9IHZpZGVvLT52b2xbY3VyckxheWVyXTsKLSAgICBWb2wgKip2b2wgPSB2aWRlby0+dm9sOwotICAgIEludCBudW1fc2tpcCwgZXh0cmFfc2tpcDsKLSAgICBJbnQgaTsKLSAgICBVSW50IG5ld1JlZlRpY2ssIGRlbHRhTW9kVGltZTsKLSAgICBVSW50IHRlbXA7Ci0KLSAgICBpZiAoZW5jUGFyYW1zLT5SQ19UeXBlICE9IENPTlNUQU5UX1EpCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPnZvbEluaXRpYWxpemVbMF0gJiYgY3VyckxheWVyID09IDApICAvKiBhbHdheXMgZW5jb2RlIHRoZSBmaXJzdCBmcmFtZSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBSQ19SZXNldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcik7Ci0gICAgICAgICAgICAvL3JldHVybiBjdXJyTGF5ZXI7ICAwOS8xNS8wNQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJDX0dldFNraXBOZXh0RnJhbWUodmlkZW8sIGN1cnJMYXllcikgPCAwIHx8IHN0YXR1cyA9PSBQVl9FTkRfT0ZfQlVGKSAgIC8qIFNraXAgQ3VycmVudCBGcmFtZSAqLwotICAgICAgICAgICAgewotCi0jaWZkZWYgX1BSSU5UX1NUQVQKLSAgICAgICAgICAgICAgICBwcmludGYoIlNraXAgY3VycmVudCBmcmFtZSIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgY3VyclZvbC0+bW9kdWxvVGltZUJhc2UgPSBjdXJyVm9sLT5wcmV2TW9kdWxvVGltZUJhc2U7Ci0KLSAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgIC8qIHByZXBhcmUgdG8gcmV0dXJuICovCi0gICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAqc2l6ZSA9IDA7ICAvKiBTZXQgQml0c3RyZWFtIGJ1ZmZlciB0byB6ZXJvICovCi0KLSAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgbkxheWVyIGFuZCBtb2RUaW1lIGZvciBuZXh0IGVuY29kZSAqLwotCi0gICAgICAgICAgICAgICAgKm1vZFRpbWUgPSB2aWRlby0+bmV4dE1vZFRpbWU7Ci0gICAgICAgICAgICAgICAgbkxheWVyID0gLTE7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gbkxheWVyOyAvKiByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aG91dCB1cGRhdGluZyBSZWZUaWNrICYgbW9kVGltZVJlZiAqLwotICAgICAgICAgICAgICAgIC8qIElmIEktVk9QIHdhcyBhdHRlbXB0ZWQsIHRoZW4gZW5zdXJlIG5leHQgYmFzZSBpcyBJLVZPUCAqLwotICAgICAgICAgICAgICAgIC8qaWYoKGVuY1BhcmFtcy0+SW50cmFQZXJpb2Q+MCkgJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZSA9PSBJX1ZPUCkpCi0gICAgICAgICAgICAgICAgdmlkZW8tPm5leHRFbmNJVm9wID0gMDsgY29tbWVudGVkIG91dCBieSAwNi8wNS8wMSAqLwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgobnVtX3NraXAgPSBSQ19HZXRTa2lwTmV4dEZyYW1lKHZpZGVvLCBjdXJyTGF5ZXIpKSA+IDApCi0gICAgICAgICAgICB7Ci0KLSNpZmRlZiBfUFJJTlRfU1RBVAotICAgICAgICAgICAgICAgIHByaW50ZigiU2tpcCBuZXh0ICVkIGZyYW1lcyIsIG51bV9za2lwKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIC8qIHRvIGtlZXAgdGhlIE5yIG9mIGVuaCBsYXllciB0aGUgc2FtZSAqLwotICAgICAgICAgICAgICAgIC8qIGFkanVzdCByZWxMYXllckNvZGVUaW1lIG9ubHksIGRvIG5vdCBhZGp1c3QgbGF5ZXJDb2RlVGltZVtudW1MYXllcnMtMV0gKi8KLSAgICAgICAgICAgICAgICBleHRyYV9za2lwID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VyckxheWVyOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gPD0gMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfc2tpcCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJMYXllcjsgaSA8IG51bUxheWVyczsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnJlbExheWVyQ29kZVRpbWVbaV0gKz0gKG51bV9za2lwICsgZXh0cmFfc2tpcCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEludCkoKDEwMDAuMCAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbbnVtTGF5ZXJzLTFdKSAvIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0vKiBmaXJzdCBmcmFtZSAqLwotICAgIH0KLSAgICAvKioqKiogIGN1cnJlbnQgZnJhbWUgaXMgZW5jb2RlZCwgbm93IHVwZGF0ZSByZWZUaWNrICoqKioqKi8KLQotICAgIHZpZGVvLT5yZWZUaWNrW2N1cnJMYXllcl0gKz0gdm9sW2N1cnJMYXllcl0tPnByZXZNb2R1bG9UaW1lQmFzZSAqIHZvbFtjdXJyTGF5ZXJdLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbjsKLQotICAgIC8qIFJlc2V0IGxheWVyQ29kZVRpbWUgZXZlcnkgSS1WT1AgdG8gcHJldmVudCBvdmVyZmxvdyAqLwotICAgIGlmIChjdXJyTGF5ZXIgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qICAxMi8xMi8wMiwgZml4IGZvciB3ZWlyZCB0YXJnZXIgZnJhbWUgcmF0ZSBvZiA5Ljk5IGZwcyBvciAzLjMzIGZwcyAqLwotICAgICAgICBpZiAoKChlbmNQYXJhbXMtPkludHJhUGVyaW9kICE9IDApIC8qJiYgKHZpZGVvLT5jdXJyVm9wLT5wcmVkaWN0aW9uVHlwZT09SV9WT1ApKi8pIHx8Ci0gICAgICAgICAgICAgICAgKChlbmNQYXJhbXMtPkludHJhUGVyaW9kID09IDApICYmICh2aWRlby0+bnVtVm9wc0luR09QID09IDApKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3UmVmVGljayA9IHZpZGVvLT5yZWZUaWNrWzBdOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbnVtTGF5ZXJzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5yZWZUaWNrW2ldIDwgbmV3UmVmVGljaykKLSAgICAgICAgICAgICAgICAgICAgbmV3UmVmVGljayA9IHZpZGVvLT5yZWZUaWNrW2ldOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdXBkYXRlIGlzIGludGVnZXIgbXVsdGlwbGUgb2YgZnJhbWUgbnVtYmVyICovCi0gICAgICAgICAgICAvKiBob3cgbWFueSBtc2VjIGVsYXBzZWQgZnJvbSBsYXN0IG1vZFRpbWVSZWYgKi8KLSAgICAgICAgICAgIGRlbHRhTW9kVGltZSA9IChuZXdSZWZUaWNrIC8gdm9sWzBdLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbikgKiAxMDAwOwotCi0gICAgICAgICAgICBmb3IgKGkgPSBudW1MYXllcnMgLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZW1wID0gKFVJbnQpKGRlbHRhTW9kVGltZSAqIGVuY1BhcmFtcy0+TGF5ZXJGcmFtZVJhdGVbaV0pOyAvKiAxMi8xMi8wMiAqLwotICAgICAgICAgICAgICAgIGlmICh0ZW1wICUgMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgbmV3UmVmVGljayA9IDA7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdSZWZUaWNrID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2aWRlby0+bW9kVGltZVJlZiArPSBkZWx0YU1vZFRpbWU7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gbnVtTGF5ZXJzIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2aWRlby0+cHJldkZyYW1lTnVtW2ldIC09IChVSW50KShkZWx0YU1vZFRpbWUgKiBlbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlW2ldKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvLT5yZWZUaWNrW2ldIC09IG5ld1JlZlRpY2s7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm1vZFRpbWUgPSAgdmlkZW8tPm5leHRNb2RUaW1lOwotCi0gICAgcmV0dXJuIG5MYXllcjsKLX0KLQotCi0jaWZuZGVmIE9SSUdJTkFMX1ZFUlNJT04KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgRnVuY3Rpb24gOiBTZXRQcm9maWxlX0J1ZmZlclNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXRlICAgICA6IDA0LzA4LzIwMDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFB1cnBvc2UgIDogU2V0IHByb2ZpbGUgYW5kIHZpZGVvIGJ1ZmZlciBzaXplLCBjb3BpZWQgZnJvbSBKaW0ncyBjb2RlICAgICovCi0vKiAgICAgICAgICAgICBpbiBQVkluaXRWaWRlb0VuY29kZXIoLiksIHNpbmNlIHdlIGhhdmUgZGlmZmVyZW50IHBsYWNlcyAgICAgKi8KLS8qICAgICAgICAgICAgIHRvIHJlc2V0IHByb2ZpbGUgYW5kIHZpZGVvIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV0dXJuICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotQm9vbCBTZXRQcm9maWxlX0J1ZmZlclNpemUoVmlkZW9FbmNEYXRhICp2aWRlbywgZmxvYXQgZGVsYXksIEludCBiSW5pdGlhbGl6ZWQpCi17Ci0gICAgSW50IGksIGosIHN0YXJ0LCBlbmQ7Ci0vLyAgSW50IEJhc2VNQnNQZXJTZWMgPSAwLCBFbmhNQnNQZXJTZWMgPSAwOwotICAgIEludCBuVG90YWxNQiA9IDA7Ci0gICAgSW50IGlkeCwgdGVtcF93LCB0ZW1wX2gsIG1heCA9IDAsIG1heF93aWR0aCwgbWF4X2hlaWdodDsKLQotICAgIEludCBuTGF5ZXJzID0gdmlkZW8tPmVuY1BhcmFtcy0+bkxheWVyczsgLyogTnVtYmVyIG9mIExheWVycyB0byBiZSBlbmNvZGVkICovCi0KLSAgICBJbnQgdG90YWxfYml0cmF0ZSA9IDAsIGJhc2VfYml0cmF0ZTsKLSAgICBJbnQgdG90YWxfcGFja2V0X3NpemUgPSAwLCBiYXNlX3BhY2tldF9zaXplOwotICAgIEludCB0b3RhbF9NQnNQZXJTZWMgPSAwLCBiYXNlX01Cc1BlclNlYzsKLSAgICBJbnQgdG90YWxfVkJWX3NpemUgPSAwLCBiYXNlX1ZCVl9zaXplLCBlbmhhbmNlX1ZCVl9zaXplID0gMDsKLSAgICBmbG9hdCB0b3RhbF9mcmFtZXJhdGUsIGJhc2VfZnJhbWVyYXRlOwotICAgIGZsb2F0IHVwcGVyX2JvdW5kX3JhdGlvOwotICAgIEludCBiRm91bmQgPSAwOwotICAgIEludCBrID0gMCwgd2lkdGgxNiwgaGVpZ2h0MTYsIGluZGV4OwotICAgIEludCBsb3dlc3RfbGV2ZWw7Ci0KLSNkZWZpbmUgTUlOX0JVRkYgICAgMTYwMDAgLyogMTZrIG1pbmltdW0gYnVmZmVyIHNpemUgKi8KLSNkZWZpbmUgQlVGRl9DT05TVCAgMi4wICAgIC8qIDIwMDBtcyAqLwotI2RlZmluZSBVUFBFUl9CT1VORF9SQVRJTyA4LjU0IC8qIHVwcGVyX2JvdW5kID0gMS40KigxLjErYm91bmQvMTApKmJpdHJhdGUvZnJhbWVyYXRlICovCi0KLSNkZWZpbmUgUUNJRl9XSURUSCAgMTc2Ci0jZGVmaW5lIFFDSUZfSEVJR0hUIDE0NAotCi0gICAgaW5kZXggPSB2aWRlby0+ZW5jUGFyYW1zLT5wcm9maWxlX3RhYmxlX2luZGV4OwotCi0gICAgLyogQ2FsY3VsYXRlICJuVG90YWxNQiIgKi8KLSAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIHdpZHRoKmhlaWdodCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhlIFZPUHMgKi8KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5MYXllcnM7IGlkeCsrKQotICAgIHsKLSAgICAgICAgdGVtcF93ID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJXaWR0aFtpZHhdOwotICAgICAgICB0ZW1wX2ggPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckhlaWdodFtpZHhdOwotCi0gICAgICAgIGlmICgodGVtcF93KnRlbXBfaCkgPiBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heCA9IHRlbXBfdyAqIHRlbXBfaDsKLSAgICAgICAgICAgIG1heF93aWR0aCA9IHRlbXBfdzsKLSAgICAgICAgICAgIG1heF9oZWlnaHQgPSB0ZW1wX2g7Ci0gICAgICAgICAgICBuVG90YWxNQiA9ICgobWF4X3dpZHRoICsgMTUpID4+IDQpICogKChtYXhfaGVpZ2h0ICsgMTUpID4+IDQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHVwcGVyX2JvdW5kX3JhdGlvID0gKHZpZGVvLT5lbmNQYXJhbXMtPlJDX1R5cGUgPT0gQ0JSX0xPV0RFTEFZID8gKGZsb2F0KTUuMCA6IChmbG9hdClVUFBFUl9CT1VORF9SQVRJTyk7Ci0KLQotICAgIC8qIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb246IGJpdHJhdGUsIHBhY2tldF9zaXplLCBNQnMvcyBhbmQgVkJWX3NpemUgKi8KLSAgICBiYXNlX2JpdHJhdGUgICAgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzBdOwotICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gIT0gMCkgLyogdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID09IDAgbWVhbnMgaXQgaGFzIG5vdCBiZWVuIHNldCAqLwotICAgIHsKLSAgICAgICAgYmFzZV9iaXRyYXRlICAgID0gUFZfTUFYKGJhc2VfYml0cmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdKTsKLSAgICB9Ci0gICAgZWxzZSAvKiBpZiB0aGUgbWF4IGlzIG5vdCBzZXQsIHNldCBpdCB0byB0aGUgc3BlY2lmaWVkIHByb2ZpbGUvbGV2ZWwgKi8KLSAgICB7Ci0gICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdOwotICAgIH0KLQotICAgIGJhc2VfZnJhbWVyYXRlICAgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5MYXllckZyYW1lUmF0ZVswXTsKLSAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gIT0gMCkKLSAgICB7Ci0gICAgICAgIGJhc2VfZnJhbWVyYXRlICA9IFBWX01BWChiYXNlX2ZyYW1lcmF0ZSwgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0pOwotICAgIH0KLSAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLwotICAgIHsKLSAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2luZGV4XSAvIG5Ub3RhbE1COwotICAgIH0KLQotICAgIGJhc2VfcGFja2V0X3NpemUgICAgPSB2aWRlby0+ZW5jUGFyYW1zLT5SZXN5bmNQYWNrZXRzaXplOwotICAgIGJhc2VfTUJzUGVyU2VjICAgICAgPSAoSW50KShiYXNlX2ZyYW1lcmF0ZSAqIG5Ub3RhbE1CKTsKLSAgICBiYXNlX1ZCVl9zaXplICAgICAgID0gUFZfTUFYKChJbnQpKGJhc2VfYml0cmF0ZSAqIGRlbGF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJbnQpKHVwcGVyX2JvdW5kX3JhdGlvICogYmFzZV9iaXRyYXRlIC8gYmFzZV9mcmFtZXJhdGUpKTsKLSAgICBiYXNlX1ZCVl9zaXplICAgICAgID0gUFZfTUFYKGJhc2VfVkJWX3NpemUsIE1JTl9CVUZGKTsKLQotICAgIC8qIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBidWZmZXIgc2l6ZSwgd2UnbGwgY2xpcCBpdCAqLwotICAgIGlmIChiYXNlX1ZCVl9zaXplID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbNV0pCi0gICAgICAgIGJhc2VfVkJWX3NpemUgPSBwcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs1XTsKLQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBleGNlZWRzIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplIGdpdmVuIHRoZSBtYXhpbXVtIHByb2ZpbGUgYW5kIGxldmVsICovCi0gICAgaWYgKG5MYXllcnMgPT0gMSAmJiBiYXNlX1ZCVl9zaXplID4gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQotICAgIGlmIChuTGF5ZXJzID09IDIpCi0gICAgewotICAgICAgICB0b3RhbF9iaXRyYXRlICAgICAgID0gdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJCaXRSYXRlWzFdOwotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRvdGFsX2JpdHJhdGUgICA9IFBWX01JTih0b3RhbF9iaXRyYXRlLCB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogaWYgdGhlIG1heCBpcyBub3Qgc2V0LCBzZXQgaXQgdG8gdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgdG90YWxfZnJhbWVyYXRlICAgICA9IHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyRnJhbWVSYXRlWzFdOwotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0gIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdG90YWxfZnJhbWVyYXRlICAgICA9IFBWX01JTih0b3RhbF9mcmFtZXJhdGUsIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzFdKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qIGlmIHRoZSBtYXggaXMgbm90IHNldCwgc2V0IGl0IHRvIHRoZSBzcGVjaWZpZWQgcHJvZmlsZS9sZXZlbCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9IChmbG9hdClzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdIC8gblRvdGFsTUI7Ci0gICAgICAgIH0KLQotICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgID0gdmlkZW8tPmVuY1BhcmFtcy0+UmVzeW5jUGFja2V0c2l6ZTsKLSAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA9IChJbnQpKHRvdGFsX2ZyYW1lcmF0ZSAqIG5Ub3RhbE1CKTsKLQotICAgICAgICBlbmhhbmNlX1ZCVl9zaXplICAgID0gUFZfTUFYKChJbnQpKCh0b3RhbF9iaXRyYXRlIC0gYmFzZV9iaXRyYXRlKSAqIGRlbGF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSW50KSh1cHBlcl9ib3VuZF9yYXRpbyAqICh0b3RhbF9iaXRyYXRlIC0gYmFzZV9iaXRyYXRlKSAvICh0b3RhbF9mcmFtZXJhdGUgLSBiYXNlX2ZyYW1lcmF0ZSkpKTsKLSAgICAgICAgZW5oYW5jZV9WQlZfc2l6ZSAgICA9IFBWX01BWChlbmhhbmNlX1ZCVl9zaXplLCBNSU5fQlVGRik7Ci0KLSAgICAgICAgdG90YWxfVkJWX3NpemUgICAgICA9IGJhc2VfVkJWX3NpemUgKyBlbmhhbmNlX1ZCVl9zaXplOwotCi0gICAgICAgIC8qIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gbWF4aW11bSBidWZmZXIgc2l6ZSwgd2UnbGwgY2xpcCBpdCAqLwotICAgICAgICBpZiAodG90YWxfVkJWX3NpemUgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs2XSkKLSAgICAgICAgewotICAgICAgICAgICAgdG90YWxfVkJWX3NpemUgPSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9WQlZfc2l6ZVs2XTsKLSAgICAgICAgICAgIGVuaGFuY2VfVkJWX3NpemUgPSB0b3RhbF9WQlZfc2l6ZSAtIGJhc2VfVkJWX3NpemU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBDaGVjayBpZiB0aGUgYnVmZmVyIGV4Y2VlZHMgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZ2l2ZW4gdGhlIG1heGltdW0gcHJvZmlsZSBhbmQgbGV2ZWwgKi8KLSAgICAgICAgaWYgKHRvdGFsX1ZCVl9zaXplID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCi0gICAgaWYgKCFiSW5pdGlhbGl6ZWQpIC8qIEhhcyBiZWVuIGluaXRpYWxpemVkIC0tPiBwcm9maWxlIEAgbGV2ZWwgaGFzIGJlZW4gZmlndXJlZCBvdXQhICovCi0gICAgewotICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdID0gYmFzZV9WQlZfc2l6ZTsKLSAgICAgICAgaWYgKG5MYXllcnMgPiAxKQotICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVsxXSA9IGVuaGFuY2VfVkJWX3NpemU7Ci0KLSAgICAgICAgcmV0dXJuIFBWX1RSVUU7Ci0gICAgfQotCi0KLSAgICAvKiBQcm9maWxlIEAgbGV2ZWwgZGV0ZXJtaW5hdGlvbiAqLwotICAgIGlmIChuTGF5ZXJzID09IDEpCi0gICAgewotICAgICAgICAvKiBCQVNFIE9OTFkgOiBTaW1wbGUgUHJvZmlsZShTUCkgT3IgQ29yZSBQcm9maWxlKENQKSAqLwotICAgICAgICBpZiAoYmFzZV9iaXRyYXRlICAgICA+IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaW5kZXhdICAgICB8fAotICAgICAgICAgICAgICAgIGJhc2VfcGFja2V0X3NpemUgPiBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpbmRleF0gfHwKLSAgICAgICAgICAgICAgICBiYXNlX01Cc1BlclNlYyAgID4gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2luZGV4XSAgIHx8Ci0gICAgICAgICAgICAgICAgYmFzZV9WQlZfc2l6ZSAgICA+IHByb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2luZGV4XSkKLQotICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOyAvKiBCZXlvbmQgdGhlIGJvdW5kIG9mIENvcmUgUHJvZmlsZSBAIExldmVsMiAqLwotCi0gICAgICAgIC8qIEZvciBIMjYzL1Nob3J0IGhlYWRlciwgZGV0ZXJtaW5lIGsqMTYzODQgKi8KLSAgICAgICAgd2lkdGgxNiAgPSAoKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyV2lkdGhbMF0gKyAxNSkgPj4gNCkgPDwgNDsKLSAgICAgICAgaGVpZ2h0MTYgPSAoKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVySGVpZ2h0WzBdICsgMTUpID4+IDQpIDw8IDQ7Ci0gICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5IMjYzX0VuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGsgPSA0OwotICAgICAgICAgICAgaWYgKHdpZHRoMTYgID09IDIqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSAyKlFDSUZfSEVJR0hUKSAgLyogQ0lGICovCi0gICAgICAgICAgICAgICAgayA9IDE2OwotCi0gICAgICAgICAgICBlbHNlIGlmICh3aWR0aDE2ICA9PSA0KlFDSUZfV0lEVEggJiYgaGVpZ2h0MTYgPT0gNCpRQ0lGX0hFSUdIVCkgIC8qIDRDSUYgKi8KLSAgICAgICAgICAgICAgICBrID0gMzI7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKHdpZHRoMTYgID09IDgqUUNJRl9XSURUSCAmJiBoZWlnaHQxNiA9PSA4KlFDSUZfSEVJR0hUKSAgLyogMTZDSUYgKi8KLSAgICAgICAgICAgICAgICBrID0gNjQ7Ci0KLSAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPm1heEZyYW1lU2l6ZSAgPSBrICogMTYzODQ7Ci0KLSAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIHNpemUgaXMgbGltaXRlZCB0byB0aGUgdG9wIHByb2ZpbGUgYW5kIGxldmVsOiB0aGUgQ29yZSBwcm9maWxlIGFuZCBsZXZlbCAyICovCi0gICAgICAgICAgICBpZiAoYmFzZV9WQlZfc2l6ZSA+IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlWzVdKjEwMDEuMCAvIDMwMDAwLjApKQotICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgPSAoSW50KShrICogMTYzODQgKyA0ICogKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbNV0gKiAxMDAxLjAgLyAzMDAwMC4wKTsKLQotICAgICAgICAgICAgaWYgKGJhc2VfVkJWX3NpemUgPiAoSW50KShrKjE2Mzg0ICsgNCooZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0qMTAwMS4wIC8gMzAwMDAuMCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VhcmNoIHRoZSBhcHByb3ByaWF0ZSBwcm9maWxlQGxldmVsIGluZGV4ICovCi0gICAgICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmCi0gICAgICAgICAgICAgICAgKHZpZGVvLT5lbmNQYXJhbXMtPkludHJhRENWbGNUaHIgIT0gMCB8fCB2aWRlby0+ZW5jUGFyYW1zLT5TZWFyY2hSYW5nZSA+IDE2KSkKLSAgICAgICAgewotICAgICAgICAgICAgbG93ZXN0X2xldmVsID0gMTsgLyogY2Fubm90IGFsbG93IFNQTDAgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvd2VzdF9sZXZlbCA9IDA7IC8qIFNQTDAgKi8KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IGxvd2VzdF9sZXZlbDsgaSA8PSBpbmRleDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSA0ICYmIC8qIHNraXAgQ29yZSBQcm9maWxlQExldmVsMSBiZWNhdXNlIHRoZSBwYXJhbWV0ZXJzIGluIGl0IGFyZSBzbWFsbGVyIHRoYW4gdGhvc2UgaW4gU2ltcGxlIFByb2ZpbGVATGV2ZWwzICovCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfYml0cmF0ZSAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXSAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgYmFzZV9wYWNrZXRfc2l6ZSA8PSBwcm9maWxlX2xldmVsX21heF9wYWNrZXRfc2l6ZVtpXSAmJgotICAgICAgICAgICAgICAgICAgICBiYXNlX01Cc1BlclNlYyAgIDw9IHByb2ZpbGVfbGV2ZWxfbWF4X21ic1BlclNlY1tpXSAgICYmCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgICAgPD0gKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCA/IChJbnQpKGsqMTYzODQgKyA0KihmbG9hdClwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldKjEwMDEuMCAvIDMwMDAwLjApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaV0pKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID4gaW5kZXgpIHJldHVybiBQVl9GQUxTRTsgLyogTm90aGluZyBmb3VuZCEhICovCi0KLSAgICAgICAgLyogRm91bmQgb3V0IHRoZSBhY3R1YWwgcHJvZmlsZSBAIGxldmVsIDogaW5kZXggImkiICovCi0gICAgICAgIGlmIChpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEZvciBTaW1wbGUgUHJvZmlsZSBAIExldmVsIDAsIHdlIG5lZWQgdG8gZG8gb25lIG1vcmUgY2hlY2s6IGltYWdlIHNpemUgPD0gUUNJRiAqLwotICAgICAgICAgICAgaWYgKHdpZHRoMTYgPiBRQ0lGX1dJRFRIIHx8IGhlaWdodDE2ID4gUUNJRl9IRUlHSFQpCi0gICAgICAgICAgICAgICAgaSA9IDE7IC8qIGltYWdlIHNpemUgPiBRQ0lGLCB0aGVuIHNldCBTUCBsZXZlbDEgKi8KLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9IHByb2ZpbGVfbGV2ZWxfY29kZVtpXTsKLSAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+QnVmZmVyU2l6ZVswXSAgID0gYmFzZV9WQlZfc2l6ZTsKLQotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzBdID09IDApCi0gICAgICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPSBwcm9maWxlX2xldmVsX21heF9iaXRyYXRlW2ldOwotCi0gICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVswXSA9PSAwKQotICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPSBQVl9NSU4oMzAsIChmbG9hdClwcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gLyBuVG90YWxNQik7Ci0KLSAgICAgICAgLyogRm9yIEgyNjMvU2hvcnQgaGVhZGVyLCBvbmUgc3BlY2lhbCBjb25zdHJhaW50IGZvciBWQlYgYnVmZmVyIHNpemUgKi8KLSAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkgyNjNfRW5hYmxlZCkKLSAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkJ1ZmZlclNpemVbMF0gPSAoSW50KShrICogMTYzODQgKyA0ICogKGZsb2F0KXByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0gKiAxMDAxLjAgLyAzMDAwMC4wKTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBTQ0FMQUJBTEUgTU9ERTogU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUoU1NQKSBPciBDb3JlIFNjYWxhYmxlIFByb2ZpbGUoQ1NQKSAqLwotCi0gICAgICAgIGlmICh0b3RhbF9iaXRyYXRlICAgICAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpbmRleF0gICAgIHx8Ci0gICAgICAgICAgICAgICAgdG90YWxfcGFja2V0X3NpemUgICA+IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplW2luZGV4XSB8fAotICAgICAgICAgICAgICAgIHRvdGFsX01Cc1BlclNlYyAgICAgPiBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaW5kZXhdICAgfHwKLSAgICAgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgID4gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbaW5kZXhdKQotCi0gICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIEJleW9uZCBnaXZlbiBwcm9maWxlIGFuZCBsZXZlbCAqLwotCi0gICAgICAgIC8qIE9uZS10aW1lIGNoZWNrOiBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZSBvciBDb3JlIFNjYWxhYmxlIFByb2ZpbGUgKi8KLSAgICAgICAgaWYgKHRvdGFsX2JpdHJhdGUgICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVsyXSAgICAgICAgJiYKLSAgICAgICAgICAgICAgICB0b3RhbF9wYWNrZXRfc2l6ZSAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X3BhY2tldF9zaXplWzJdICAgICYmCi0gICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbMl0gICAgICAmJgotICAgICAgICAgICAgICAgIHRvdGFsX1ZCVl9zaXplICAgICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbMl0pCi0KLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSAwOwotICAgICAgICAgICAgZW5kID0gaW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXJ0ID0gNDsKLSAgICAgICAgICAgIGVuZCA9IGluZGV4OwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBTZWFyY2ggdGhlIHNjYWxhYmxlIHByb2ZpbGUgKi8KLSAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b3RhbF9iaXRyYXRlICAgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbaV0gICAgICYmCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsX3BhY2tldF9zaXplICAgPD0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbaV0gJiYKLSAgICAgICAgICAgICAgICAgICAgdG90YWxfTUJzUGVyU2VjICAgICA8PSBzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gICAmJgotICAgICAgICAgICAgICAgICAgICB0b3RhbF9WQlZfc2l6ZSAgICAgIDw9IHNjYWxhYmxlX3Byb2ZpbGVfbGV2ZWxfbWF4X1ZCVl9zaXplW2ldKQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPiBlbmQpIHJldHVybiBQVl9GQUxTRTsKLQotICAgICAgICAvKiBTZWFyY2ggdGhlIGJhc2UgcHJvZmlsZSAqLwotICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgIGJGb3VuZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgYkZvdW5kID0gMDsKLQotICAgICAgICBmb3IgKGogPSBzdGFydDsgIWJGb3VuZCAmJiBqIDw9IGk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJhc2VfYml0cmF0ZSAgICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtqXSAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfcGFja2V0X3NpemUgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfcGFja2V0X3NpemVbal0gICYmCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfTUJzUGVyU2VjICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2pdICAgICYmCi0gICAgICAgICAgICAgICAgICAgIGJhc2VfVkJWX3NpemUgICAgICAgPD0gcHJvZmlsZV9sZXZlbF9tYXhfVkJWX3NpemVbal0pCi0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiRm91bmQgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFiRm91bmQpIC8vICYmIHN0YXJ0ID09IDQpCi0gICAgICAgICAgICByZXR1cm4gUFZfRkFMU0U7IC8qIG1pcy1tYXRjaCBpbiB0aGUgcHJvZmlsZXMgYmV0d2VlbiBiYXNlIGxheWVyIGFuZCBlbmhhbmNlbWVudCBsYXllciAqLwotCi0gICAgICAgIC8qIGogZm9yIGJhc2UgbGF5ZXIsIGkgZm9yIGVuaGFuY2VtZW50IGxheWVyICovCi0gICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPlByb2ZpbGVMZXZlbFswXSA9IHByb2ZpbGVfbGV2ZWxfY29kZVtqXTsKLSAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+UHJvZmlsZUxldmVsWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9jb2RlW2ldOwotICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzBdICAgPSBiYXNlX1ZCVl9zaXplOwotICAgICAgICB2aWRlby0+ZW5jUGFyYW1zLT5CdWZmZXJTaXplWzFdICAgPSBlbmhhbmNlX1ZCVl9zaXplOwotCi0gICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEJpdFJhdGVbMF0gPT0gMCkKLSAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVswXSA9IHByb2ZpbGVfbGV2ZWxfbWF4X2JpdHJhdGVbal07Ci0KLSAgICAgICAgaWYgKHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4Qml0UmF0ZVsxXSA9PSAwKQotICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhCaXRSYXRlWzFdID0gc2NhbGFibGVfcHJvZmlsZV9sZXZlbF9tYXhfYml0cmF0ZVtpXTsKLQotICAgICAgICBpZiAodmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMF0gPT0gMCkKLSAgICAgICAgICAgIHZpZGVvLT5lbmNQYXJhbXMtPkxheWVyTWF4RnJhbWVSYXRlWzBdID0gUFZfTUlOKDMwLCAoZmxvYXQpcHJvZmlsZV9sZXZlbF9tYXhfbWJzUGVyU2VjW2pdIC8gblRvdGFsTUIpOwotCi0gICAgICAgIGlmICh2aWRlby0+ZW5jUGFyYW1zLT5MYXllck1heEZyYW1lUmF0ZVsxXSA9PSAwKQotICAgICAgICAgICAgdmlkZW8tPmVuY1BhcmFtcy0+TGF5ZXJNYXhGcmFtZVJhdGVbMV0gPSBQVl9NSU4oMzAsIChmbG9hdClzY2FsYWJsZV9wcm9maWxlX2xldmVsX21heF9tYnNQZXJTZWNbaV0gLyBuVG90YWxNQik7Ci0KLQotICAgIH0gLyogZW5kIG9mOiBpZihuTGF5ZXJzID09IDEpICovCi0KLQotICAgIGlmICghdmlkZW8tPmVuY1BhcmFtcy0+SDI2M19FbmFibGVkICYmICh2aWRlby0+ZW5jUGFyYW1zLT5Qcm9maWxlTGV2ZWxbMF0gPT0gMHgwOCkpIC8qIFNQTDAgcmVzdHJpY3Rpb24qLwotICAgIHsKLSAgICAgICAgLyogUFYgb25seSBhbGxvdyBmcmFtZS1iYXNlZCByYXRlIGNvbnRyb2wsIG5vIFFQIGNoYW5nZSBmcm9tIG9uZSBNQiB0byBhbm90aGVyCi0gICAgICAgIGlmKHZpZGVvLT5lbmNQYXJhbXMtPkFDRENQcmVkaWN0aW9uID09IFRSVUUgJiYgTUItYmFzZWQgcmF0ZSBjb250cm9sKQotICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFICovCi0gICAgfQotCi0gICAgcmV0dXJuIFBWX1RSVUU7Ci19Ci0KLSNlbmRpZiAvKiAjaWZuZGVmIE9SSUdJTkFMX1ZFUlNJT04gKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTgyZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotY2NfdGVzdCB7Ci0gICAgbmFtZTogIk1wZWc0SDI2M0VuY29kZXJUZXN0IiwKLSAgICBndGVzdDogdHJ1ZSwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLQotICAgIHNyY3MgOiBbICJNcGVnNEgyNjNFbmNvZGVyVGVzdC5jcHAiIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDk2MTA2ZjEuLmI2NjljODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTEsOTMgKzEsMTkgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKIAotICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9wdm1wM19ub3JtYWxpemUuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19jcmMuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19kZWNvZGVfaGVhZGVyLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGVjb2RlX2h1ZmZfY3cuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19nZXRiaXRzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGVxdWFudGl6ZV9zYW1wbGUuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19mcmFtZWRlY29kZXIuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19nZXRfbWFpbl9kYXRhX3NpemUuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZ2V0X3NjYWxlX2ZhY3RvcnMuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19tcGVnMl9nZXRfc2NhbGVfZGF0YS5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX21wZWcyX2dldF9zY2FsZV9mYWN0b3JzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfbXBlZzJfc3RlcmVvX3Byb2MuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19odWZmbWFuX2RlY29kaW5nLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfaHVmZm1hbl9wYXJzaW5nLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfdGFibGVzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfaW1kY3Rfc3ludGguY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19tZGN0XzYuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19kY3RfNi5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3BvbHlfcGhhc2Vfc3ludGhlc2lzLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZXF1YWxpemVyLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfc2Vla19zeW5jaC5jcHAiLAotICAgICAgICAic3JjL3B2bXAzX3N0ZXJlb19wcm9jLmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfcmVvcmRlci5jcHAiLAotCi0gICAgICAgICJzcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19tZGN0XzE4LmNwcCIsCi0gICAgICAgICJzcmMvcHZtcDNfZGN0XzkuY3BwIiwKLSAgICAgICAgInNyYy9wdm1wM19kY3RfMTYuY3BwIiwKLSAgICBdLAotCi0gICAgYXJjaDogewotICAgICAgICBhcm06IHsKLSAgICAgICAgICAgIGV4Y2x1ZGVfc3JjczogWwotICAgICAgICAgICAgICAgICJzcmMvcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3cuY3BwIiwKLSAgICAgICAgICAgICAgICAic3JjL3B2bXAzX21kY3RfMTguY3BwIiwKLSAgICAgICAgICAgICAgICAic3JjL3B2bXAzX2RjdF85LmNwcCIsCi0gICAgICAgICAgICAgICAgInNyYy9wdm1wM19kY3RfMTYuY3BwIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBzcmNzOiBbCi0gICAgICAgICAgICAgICAgInNyYy9hc20vcHZtcDNfcG9seXBoYXNlX2ZpbHRlcl93aW5kb3dfZ2NjLnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX21kY3RfMThfZ2NjLnMiLAotICAgICAgICAgICAgICAgICJzcmMvYXNtL3B2bXAzX2RjdF85X2djYy5zIiwKLSAgICAgICAgICAgICAgICAic3JjL2FzbS9wdm1wM19kY3RfMTZfZ2NjLnMiLAotICAgICAgICAgICAgXSwKLQotICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKLSAgICAgICAgfSwKLSAgICB9LAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgICAgICJzcmMiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICBdLAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAogfQogCi0vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wM2RlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVAzLmNwcCJdLAogCi0gICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJzcmMiLAotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTk5LDM1ICsyNSwzIEBACiAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKIH0KLQotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1jY190ZXN0IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXAzZGVjX3Rlc3QiLAotICAgIGd0ZXN0OiBmYWxzZSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInRlc3QvbXAzZGVjX3Rlc3QuY3BwIiwKLSAgICAgICAgInRlc3QvbXAzcmVhZGVyLmNwcCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCi0KLSAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgInNyYyIsCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICB9LAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wM2RlYyIsCi0gICAgICAgICJsaWJzbmRmaWxlIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsibGliYXVkaW91dGlscyJdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKaW5kZXggYjVkMzJlZC4uMDdiYjQ1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIAotI2luY2x1ZGUgImluY2x1ZGUvcHZtcDNkZWNvZGVyX2FwaS5oIgorI2luY2x1ZGUgPHB2bXAzZGVjb2Rlcl9hcGkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00OTgsNiArNDk4LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQgKmNyZWF0ZVNvZnRPTVhDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLCBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1RFU1RfTUFQUElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzN2Q2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1RFU1RfTUFQUElORworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLy8gbWFwcGluZ3MgZm9yIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYwotewotICAicHJlc3VibWl0IjogWwotICAgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKLSAgICAvLyB7ICJuYW1lIjogIk1wM0RlY29kZXJUZXN0In0KLSAgXQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MmFlOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1jY190ZXN0IHsKLSAgICBuYW1lOiAiTXAzRGVjb2RlclRlc3QiLAotICAgIGd0ZXN0OiB0cnVlLAotICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAotCi0gICAgc3JjczogWwotICAgICAgICAibXAzcmVhZGVyLmNwcCIsCi0gICAgICAgICJNcDNEZWNvZGVyVGVzdC5jcHAiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKLSAgICAgICAgImxpYnNuZGZpbGUiLAotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzZjliYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wMyBEZWNvZGVyIHVuaXQgdGVzdCI+Ci0gICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0IiAvPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LTEuMS56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotCi0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcDNEZWNvZGVyVGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4NGMwYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk1wM0RlY29kZXJUZXN0IgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIm1wM3JlYWRlci5oIgotI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKLQotI2luY2x1ZGUgIk1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCIKLQotI2RlZmluZSBPVVRQVVRfRklMRSAiL2RhdGEvbG9jYWwvdG1wL21wM0RlY29kZS5vdXQiCi0KLWNvbnN0ZXhwciBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSAxMDI0ICogMTA7Ci1jb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDQ2MDggKiAyOwotY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Ci1jb25zdGV4cHIgaW50MzJfdCBrTnVtRnJhbWVSZXNldCA9IDE1MDsKLQotc3RhdGljIE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwotCi1jbGFzcyBNcDNEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nPiB7Ci0gIHB1YmxpYzoKLSAgICBNcDNEZWNvZGVyVGVzdCgpIDogbUNvbmZpZyhudWxscHRyKSB7fQotCi0gICAgfk1wM0RlY29kZXJUZXN0KCkgewotICAgICAgICBpZiAobUNvbmZpZykgewotICAgICAgICAgICAgZGVsZXRlIG1Db25maWc7Ci0gICAgICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKLSAgICAgICAgQVNTRVJUX05FKG1Db25maWcsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWcuIE5vIE1lbW9yeSBhdmFpbGFibGUiOwotICAgICAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKLSAgICAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwotICAgIH0KLQotICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKLSAgICBNcDNSZWFkZXIgbU1wM1JlYWRlcjsKLQotICAgIEVSUk9SX0NPREUgRGVjb2RlRnJhbWVzKHZvaWQgKmRlY29kZXJidWYsIFNOREZJTEUgKm91dEZpbGVIYW5kbGUsIFNGX0lORk8gc2ZJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IElOVDMyX01BWCk7Ci0gICAgU05ERklMRSAqb3Blbk91dHB1dEZpbGUoU0ZfSU5GTyAqc2ZJbmZvKTsKLX07Ci0KLUVSUk9SX0NPREUgTXAzRGVjb2RlclRlc3Q6OkRlY29kZUZyYW1lcyh2b2lkICpkZWNvZGVyQnVmLCBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLCBTRl9JTkZPIHNmSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQpIHsKLSAgICB1aW50OF90IGlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOwotICAgIGludDE2X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKLSAgICB1aW50MzJfdCBieXRlc1JlYWQ7Ci0gICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOwotICAgIHdoaWxlIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTXAzUmVhZGVyLmdldEZyYW1lKGlucHV0QnVmLCAmYnl0ZXNSZWFkKTsKLSAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBieXRlc1JlYWQ7Ci0gICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKLSAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKLSAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gaW5wdXRCdWY7Ci0gICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7Ci0gICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOwotICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgYnJlYWs7Ci0gICAgICAgIHNmX3dyaXRlZl9zaG9ydChvdXRGaWxlSGFuZGxlLCBvdXRwdXRCdWYsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIHNmSW5mby5jaGFubmVscyk7Ci0gICAgICAgIGZyYW1lQ291bnQtLTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlY29kZXJFcnI7Ci19Ci0KLVNOREZJTEUgKk1wM0RlY29kZXJUZXN0OjpvcGVuT3V0cHV0RmlsZShTRl9JTkZPICpzZkluZm8pIHsKLSAgICBtZW1zZXQoc2ZJbmZvLCAwLCBzaXplb2YoU0ZfSU5GTykpOwotICAgIHNmSW5mby0+Y2hhbm5lbHMgPSBtTXAzUmVhZGVyLmdldE51bUNoYW5uZWxzKCk7Ci0gICAgc2ZJbmZvLT5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgU0ZfRk9STUFUX1BDTV8xNjsKLSAgICBzZkluZm8tPnNhbXBsZXJhdGUgPSBtTXAzUmVhZGVyLmdldFNhbXBsZVJhdGUoKTsKLSAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gc2Zfb3BlbihPVVRQVVRfRklMRSwgU0ZNX1dSSVRFLCBzZkluZm8pOwotICAgIHJldHVybiBvdXRGaWxlSGFuZGxlOwotfQotCi1URVNUX0YoTXAzRGVjb2RlclRlc3QsIE11bHRpQ3JlYXRlTXAzRGVjb2RlclRlc3QpIHsKLSAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIEFTU0VSVF9ORShtZW1SZXF1aXJlbWVudHMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnQgc2l6ZSI7Ci0gICAgdm9pZCAqZGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOwotICAgIEFTU0VSVF9ORShkZWNvZGVyQnVmLCBudWxscHRyKQotICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGVyIG1lbW9yeSBvZiBzaXplICIgPDwgbWVtUmVxdWlyZW1lbnRzOwotICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKLSAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7Ci0gICAgICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgfQotICAgIGlmIChkZWNvZGVyQnVmKSB7Ci0gICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7Ci0gICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOwotICAgIH0KLX0KLQotVEVTVF9QKE1wM0RlY29kZXJUZXN0LCBEZWNvZGVUZXN0KSB7Ci0gICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBBU1NFUlRfTkUobWVtUmVxdWlyZW1lbnRzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IHNpemUiOwotICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKLSAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKLSAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKLQotICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOwotICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKLSAgICBib29sIHN0YXR1cyA9IG1NcDNSZWFkZXIuaW5pdChpbnB1dEZpbGUuY19zdHIoKSk7Ci0gICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1wM1JlYWRlciI7Ci0KLSAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KLSAgICBTRl9JTkZPIHNmSW5mbzsKLSAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7Ci0gICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKLQotICAgIEVSUk9SX0NPREUgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhkZWNvZGVyQnVmLCBvdXRGaWxlSGFuZGxlLCBzZkluZm8pOwotICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCBOT19ERUNPRElOR19FUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGZyYW1lcyI7Ci0gICAgQVNTRVJUX0VRKHNmSW5mby5jaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIjsKLSAgICBBU1NFUlRfRVEoc2ZJbmZvLnNhbXBsZXJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSkgPDwgIlNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIjsKLQotICAgIG1NcDNSZWFkZXIuY2xvc2UoKTsKLSAgICBzZl9jbG9zZShvdXRGaWxlSGFuZGxlKTsKLSAgICBpZiAoZGVjb2RlckJ1ZikgewotICAgICAgICBmcmVlKGRlY29kZXJCdWYpOwotICAgICAgICBkZWNvZGVyQnVmID0gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLVRFU1RfUChNcDNEZWNvZGVyVGVzdCwgUmVzZXREZWNvZGVyVGVzdCkgewotICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7Ci0gICAgQVNTRVJUX05FKG1lbVJlcXVpcmVtZW50cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudCBzaXplIjsKLSAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7Ci0gICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCi0gICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7Ci0KLSAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKLSAgICBBTE9HVigiRGVjb2RlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOwotICAgIGJvb2wgc3RhdHVzID0gbU1wM1JlYWRlci5pbml0KGlucHV0RmlsZS5jX3N0cigpKTsKLSAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgbXAzUmVhZGVyIjsKLQotICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlLgotICAgIFNGX0lORk8gc2ZJbmZvOwotICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBvcGVuT3V0cHV0RmlsZSgmc2ZJbmZvKTsKLSAgICBBU1NFUlRfTkUob3V0RmlsZUhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcgZGVjb2RlZCBvdXRwdXQiOwotCi0gICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOwotICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvLCBrTnVtRnJhbWVSZXNldCk7Ci0gICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIE5PX0RFQ09ESU5HX0VSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgZnJhbWVzIjsKLSAgICBBU1NFUlRfRVEoc2ZJbmZvLmNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpIDw8ICJOdW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2giOwotICAgIEFTU0VSVF9FUShzZkluZm8uc2FtcGxlcmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKSA8PCAiU2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2giOwotCi0gICAgcHZtcDNfcmVzZXREZWNvZGVyKGRlY29kZXJCdWYpOwotICAgIC8vIERlY29kZSB0aGUgc2FtZSBmaWxlLgotICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvKTsKLSAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgTk9fREVDT0RJTkdfRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBmcmFtZXMiOwotICAgIEFTU0VSVF9FUShzZkluZm8uY2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscykgPDwgIk51bWJlciBvZiBjaGFubmVscyBkb2VzIG5vdCBtYXRjaCI7Ci0gICAgQVNTRVJUX0VRKHNmSW5mby5zYW1wbGVyYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpIDw8ICJTYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCI7Ci0KLSAgICBtTXAzUmVhZGVyLmNsb3NlKCk7Ci0gICAgc2ZfY2xvc2Uob3V0RmlsZUhhbmRsZSk7Ci0gICAgaWYgKGRlY29kZXJCdWYpIHsKLSAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKLSAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7Ci0gICAgfQotfQotCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTXAzRGVjb2RlclRlc3RBbGwsIE1wM0RlY29kZXJUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYnVnXzEzNjA1Mzg4NS5tcDMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiKSkpOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICBnRW52ID0gbmV3IE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQoKTsKLSAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKLSAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKLSAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCBlODQ5NDEwLi5hYmQxMzc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnMmRlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAppbmRleCA5ZDVmMzQyLi45ZjgwMDFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcApAQCAtODY0LDYgKzg2NCw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCmluZGV4IDgyYmI4ZDEuLmJhNmRjMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX29uMl9kZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX29uMl9kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGRlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAppbmRleCAwZjJmZjE3Li5iZmZjMjNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcApAQCAtMzU1LDYgKzM1NSw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCmluZGV4IDcwNWU1NTQuLmU4NWZmOTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX29uMl9lbmNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX29uMl9lbmNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGVuYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IGQwY2IwNzEuLmU5YjQzNDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTc3NSw2ICs3NzUsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDcxYTJhMGQuLjNkOGFmNjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X29wdXNkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IDRmNjFhYTguLmRjZDhkZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtNTgsNiArNTgsOCBAQAogICAgICAgbUlucHV0QnVmZmVyQ291bnQoMCksCiAgICAgICBtRGVjb2RlcihOVUxMKSwKICAgICAgIG1IZWFkZXIoTlVMTCksCisgICAgICBtTnVtQ2hhbm5lbHMoMSksCisgICAgICBtU2FtcGxpbmdSYXRlKGtSYXRlKSwKICAgICAgIG1Db2RlY0RlbGF5KDApLAogICAgICAgbVNlZWtQcmVSb2xsKDApLAogICAgICAgbUFuY2hvclRpbWVVcygwKSwKQEAgLTE2OSwxMSArMTcxLDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5BdWRpb0JhbmRXaWR0aCA9IDA7Ci0gICAgICAgICAgICBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgb3B1c1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU2FtcGxpbmdSYXRlOwogICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkJpdFJhdGUgPSAwOwogCiAgICAgICAgICAgICBpZiAoIWlzQ29uZmlndXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtTnVtQ2hhbm5lbHM7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOwogICAgICAgICAgICAgfQpAQCAtMjc0LDcgKzI3Niw4IEBACiAgICAgICAgICAgICBpZiAob3B1c1BhcmFtcy0+blBvcnRJbmRleCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gb3B1c1BhcmFtcy0+bkNoYW5uZWxzOworICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlOwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtNDk2LDYgKzQ5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Kj4oaW5IZWFkZXItPnBCdWZmZXIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uT2Zmc2V0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxpbmdSYXRlID0ga1JhdGU7CisgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gbUhlYWRlci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIDEsIDAsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19ESVNBQkxFRDsKICAgICAgICAgICAgIH0KQEAgLTY2MSw2ICs2NjYsNyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCitfX2F0dHJpYnV0ZV9fKChjZmlfY2Fub25pY2FsX2p1bXBfdGFibGUpKQogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAogICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCmluZGV4IDkxY2FmYTEuLjAwMDU4YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCkBAIC03MCw2ICs3MCw4IEBACiAgICAgT3B1c01TRGVjb2RlciAqbURlY29kZXI7CiAgICAgT3B1c0hlYWRlciAqbUhlYWRlcjsKIAorICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKICAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OwogICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOwogICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKaW5kZXggZmNjN2EwYS4uMzY3Mzc4NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX3Jhd19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2RlY3NfcmF3X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9yYXdkZWMiLAogICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCmluZGV4IDBlMzE4MDQuLjgyZGQxNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcApAQCAtMjczLDYgKzI3Myw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDNlZmI5NTIuLjc3NjQyOTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX3ZvcmJpc19kZWNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29kZWNzX3ZvcmJpc19kZWNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYyIsCiAgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAppbmRleCAwOGUyMGNjLi4zZGFlZDEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApAQCAtNjM2LDYgKzYzNiw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKK19fYXR0cmlidXRlX18oKGNmaV9jYW5vbmljYWxfanVtcF90YWJsZSkpCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCiAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDUzODVkYmMuLjFkMDNjMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF94YWFjZGVjIiwKICAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCkBAIC0xNCw2ICsyMyw5IEBACiAgICAgICAgIC8vIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwgXSwKICAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBjb25maWc6IHsKKyAgICAgICAgICAgIGNmaV9hc3NlbWJseV9zdXBwb3J0OiB0cnVlLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKaW5kZXggODdlOGZkNC4uYTQ3ODY0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApAQCAtMTY5Myw2ICsxNjkzLDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAorX19hdHRyaWJ1dGVfXygoY2ZpX2Nhbm9uaWNhbF9qdW1wX3RhYmxlKSkKIGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQqIGNyZWF0ZVNvZnRPTVhDb21wb25lbnQoY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfUFRSIGFwcERhdGEsIE9NWF9DT01QT05FTlRUWVBFKiogY29tcG9uZW50KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCmluZGV4IDZiMDhiMDguLjA2Y2ViZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9jb2xvcmNvbnZlcnNpb25fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfY29sb3Jjb252ZXJzaW9uX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icAppbmRleCA2MTZiNGIzLi42ZGEyY2NiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnhtbCIsCiAgICAgc3JjOiAibWVkaWFfY29kZWNzX3N3LnhtbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKaW5kZXggZGQyZWVkMy4uYTRlMzQyNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbApAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIiB0eXBlPSJ2aWRlby9hdjAxIiB2YXJpYW50PSIhc2xvdy1jcHUiPgotICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjE5MjB4MTA4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDEyMDAwLDE2MDAwLDI0MDAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI1MDAtNTEyMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTEwIiAgZGVmYXVsdD0iNSIgLz4KLSAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSLFZCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CiAgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CkBAIC0yNzQsNiArMjc0LDkgQEAKICAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KICAgICAgICAgICAgIDwvVmFyaWFudD4KICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CisgICAgICAgICAgICA8IS0tIFZpZGVvIFF1YWxpdHkgY29udHJvbCAtLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBzdXBwb3J0cyBRUCBib3VuZGluZyB3aXRoIHN0YW5kYXJkIGtleXMgLS0+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJxcC1ib3VuZHMiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KICAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCmluZGV4IDg4ZjMwYzQuLmFjYzllODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIiwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNTU4MDdkNy4uNjY1YWFlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsMjcgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mbGFjX2RlY19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mbGFjX2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGTEFDRGVjb2Rlci5jcHAiLApAQCAtMzMsNiArNTMsMTMgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGNlZjBiYzYuLmY1ZTk1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTQzMyw3ICs0MzMsNyBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1CdWZmZXJEYXRhU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlY29kZU9uZUZyYW1lOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRGF0YVRvQnVmZmVyOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IG1CdWZmZXJEYXRhU2l6ZSArIGluQnVmZmVyTGVuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9BbmRyb2lkLmJwCmluZGV4IDcwY2E4MGEuLmE0YzI3MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9mbGFjX2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZmxhY19kZWNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkZsYWNEZWNvZGVyVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAppbmRleCA4YTdjM2ViLi4wYTRlNTk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHMuYXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcy5zdHJpbmcoKSwgcy5zaXplKCkpOworICAgICh2b2lkKXdyaXRlKGZkLCBzLnN0cmluZygpLCBzLnNpemUoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCmluZGV4IDc3NTJiZGEuLmMyMTE0YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuY3BwCkBAIC0zMyw3ICszMyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAotI2lmbmRlZiBfX0FORFJPSURfVk5ES19fCisjaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjZW5kaWYKIApAQCAtNTQsMTMgKzU0LDExIEBACiAKIEFNZXNzYWdlOjpBTWVzc2FnZSh2b2lkKQogICAgIDogbVdoYXQoMCksCi0gICAgICBtVGFyZ2V0KDApLAotICAgICAgbU51bUl0ZW1zKDApIHsKKyAgICAgIG1UYXJnZXQoMCkgewogfQogCiBBTWVzc2FnZTo6QU1lc3NhZ2UodWludDMyX3Qgd2hhdCwgY29uc3Qgc3A8Y29uc3QgQUhhbmRsZXI+ICZoYW5kbGVyKQotICAgIDogbVdoYXQod2hhdCksCi0gICAgICBtTnVtSXRlbXMoMCkgeworICAgIDogbVdoYXQod2hhdCkgewogICAgIHNldFRhcmdldChoYW5kbGVyKTsKIH0KIApAQCAtODksMTMgKzg3LDEzIEBACiB9CiAKIHZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKLSAgICAgICAgSXRlbSAqaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGRlbGV0ZVtdIGl0ZW0tPm1OYW1lOwotICAgICAgICBpdGVtLT5tTmFtZSA9IE5VTEw7Ci0gICAgICAgIGZyZWVJdGVtVmFsdWUoaXRlbSk7CisgICAgLy8gSXRlbSBuZWVkcyB0byBiZSBoYW5kbGVkIGRlbGljYXRlbHkKKyAgICBmb3IgKEl0ZW0gJml0ZW0gOiBtSXRlbXMpIHsKKyAgICAgICAgZGVsZXRlW10gaXRlbS5tTmFtZTsKKyAgICAgICAgaXRlbS5tTmFtZSA9IE5VTEw7CisgICAgICAgIGZyZWVJdGVtVmFsdWUoJml0ZW0pOwogICAgIH0KLSAgICBtTnVtSXRlbXMgPSAwOworICAgIG1JdGVtcy5jbGVhcigpOwogfQogCiB2b2lkIEFNZXNzYWdlOjpmcmVlSXRlbVZhbHVlKEl0ZW0gKml0ZW0pIHsKQEAgLTE1Nyw3ICsxNTUsNyBAQAogICAgIHNpemVfdCBtZW1jaGVja3MgPSAwOwogI2VuZGlmCiAgICAgc2l6ZV90IGkgPSAwOwotICAgIGZvciAoOyBpIDwgbU51bUl0ZW1zOyBpKyspIHsKKyAgICBmb3IgKDsgaSA8IG1JdGVtcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobGVuICE9IG1JdGVtc1tpXS5tTmFtZUxlbmd0aCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTE3Miw3ICsxNzAsNyBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKICAgICAgICAgKytnRmluZEl0ZW1DYWxsczsKLSAgICAgICAgZ0F2ZXJhZ2VOdW1JdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIGdBdmVyYWdlTnVtSXRlbXMgKz0gbUl0ZW1zLnNpemUoKTsKICAgICAgICAgZ0F2ZXJhZ2VOdW1NZW1DaGVja3MgKz0gbWVtY2hlY2tzOwogICAgICAgICBnQXZlcmFnZU51bUNoZWNrcyArPSBpOwogICAgICAgICByZXBvcnRTdGF0cygpOwpAQCAtMTg4LDIwICsxODYsMjYgQEAKICAgICBtZW1jcHkoKHZvaWQqKW1OYW1lLCBuYW1lLCBsZW4gKyAxKTsKIH0KIAorQU1lc3NhZ2U6Okl0ZW06Okl0ZW0oY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKKyAgICA6IG1UeXBlKGtUeXBlSW50MzIpIHsKKyAgICAvLyBtTmFtZSBhbmQgbU5hbWVMZW5ndGggYXJlIGluaXRpYWxpemVkIGJ5IHNldE5hbWUKKyAgICBzZXROYW1lKG5hbWUsIGxlbik7Cit9CisKIEFNZXNzYWdlOjpJdGVtICpBTWVzc2FnZTo6YWxsb2NhdGVJdGVtKGNvbnN0IGNoYXIgKm5hbWUpIHsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOwogICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBsZW4pOwogICAgIEl0ZW0gKml0ZW07CiAKLSAgICBpZiAoaSA8IG1OdW1JdGVtcykgeworICAgIGlmIChpIDwgbUl0ZW1zLnNpemUoKSkgewogICAgICAgICBpdGVtID0gJm1JdGVtc1tpXTsKICAgICAgICAgZnJlZUl0ZW1WYWx1ZShpdGVtKTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhtTnVtSXRlbXMgPCBrTWF4TnVtSXRlbXMpOwotICAgICAgICBpID0gbU51bUl0ZW1zKys7CisgICAgICAgIENIRUNLKG1JdGVtcy5zaXplKCkgPCBrTWF4TnVtSXRlbXMpOworICAgICAgICBpID0gbUl0ZW1zLnNpemUoKTsKKyAgICAgICAgLy8gcGxhY2UgYSAnYmxhbmsnIGl0ZW0gYXQgdGhlIGVuZCAtIHRoaXMgaXMgb2YgdHlwZSBrVHlwZUludDMyCisgICAgICAgIG1JdGVtcy5lbXBsYWNlX2JhY2sobmFtZSwgbGVuKTsKICAgICAgICAgaXRlbSA9ICZtSXRlbXNbaV07Ci0gICAgICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVJbnQzMjsKLSAgICAgICAgaXRlbS0+c2V0TmFtZShuYW1lLCBsZW4pOwogICAgIH0KIAogICAgIHJldHVybiBpdGVtOwpAQCAtMjEwLDcgKzIxNCw3IEBACiBjb25zdCBBTWVzc2FnZTo6SXRlbSAqQU1lc3NhZ2U6OmZpbmRJdGVtKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBUeXBlIHR5cGUpIGNvbnN0IHsKICAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgICBpZiAoaSA8IG1OdW1JdGVtcykgeworICAgIGlmIChpIDwgbUl0ZW1zLnNpemUoKSkgewogICAgICAgICBjb25zdCBJdGVtICppdGVtID0gJm1JdGVtc1tpXTsKICAgICAgICAgcmV0dXJuIGl0ZW0tPm1UeXBlID09IHR5cGUgPyBpdGVtIDogTlVMTDsKIApAQCAtMjIwLDcgKzIyNCw3IEBACiAKIGJvb2wgQU1lc3NhZ2U6OmZpbmRBc0Zsb2F0KGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICp2YWx1ZSkgY29uc3QgewogICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOwotICAgIGlmIChpIDwgbU51bUl0ZW1zKSB7CisgICAgaWYgKGkgPCBtSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gKml0ZW0gPSAmbUl0ZW1zW2ldOwogICAgICAgICBzd2l0Y2ggKGl0ZW0tPm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIGtUeXBlRmxvYXQ6CkBAIC0yNDcsNyArMjUxLDcgQEAKIAogYm9vbCBBTWVzc2FnZTo6ZmluZEFzSW50NjQoY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0IHsKICAgICBzaXplX3QgaSA9IGZpbmRJdGVtSW5kZXgobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgICBpZiAoaSA8IG1OdW1JdGVtcykgeworICAgIGlmIChpIDwgbUl0ZW1zLnNpemUoKSkgewogICAgICAgICBjb25zdCBJdGVtICppdGVtID0gJm1JdGVtc1tpXTsKICAgICAgICAgc3dpdGNoIChpdGVtLT5tVHlwZSkgewogICAgICAgICAgICAgY2FzZSBrVHlwZUludDY0OgpAQCAtMjY1LDE1ICsyNjksMTYgQEAKIAogYm9vbCBBTWVzc2FnZTo6Y29udGFpbnMoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewogICAgIHNpemVfdCBpID0gZmluZEl0ZW1JbmRleChuYW1lLCBzdHJsZW4obmFtZSkpOwotICAgIHJldHVybiBpIDwgbU51bUl0ZW1zOworICAgIHJldHVybiBpIDwgbUl0ZW1zLnNpemUoKTsKIH0KIAogI2RlZmluZSBCQVNJQ19UWVBFKE5BTUUsRklFTEROQU1FLFRZUEVOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBBTWVzc2FnZTo6c2V0IyNOQU1FKGNvbnN0IGNoYXIgKm5hbWUsIFRZUEVOQU1FIHZhbHVlKSB7ICAgICAgICAgICAgXAogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGl0ZW0tPm1UeXBlID0ga1R5cGUjI05BTUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGl0ZW0tPnUuRklFTEROQU1FID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpdGVtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpdGVtLT5tVHlwZSA9IGtUeXBlIyNOQU1FOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpdGVtLT51LkZJRUxETkFNRSA9IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogLyogTk9MSU5UIGFkZGVkIHRvIGF2b2lkIGluY29ycmVjdCB3YXJuaW5nL2ZpeCBmcm9tIGNsYW5nLnRpZHkgKi8gICAgICAgXApAQCAtMjk4LDggKzMwMywxMCBAQAogdm9pZCBBTWVzc2FnZTo6c2V0U3RyaW5nKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzLCBzc2l6ZV90IGxlbikgewogICAgIEl0ZW0gKml0ZW0gPSBhbGxvY2F0ZUl0ZW0obmFtZSk7Ci0gICAgaXRlbS0+bVR5cGUgPSBrVHlwZVN0cmluZzsKLSAgICBpdGVtLT51LnN0cmluZ1ZhbHVlID0gbmV3IEFTdHJpbmcocywgbGVuIDwgMCA/IHN0cmxlbihzKSA6IGxlbik7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgaXRlbS0+bVR5cGUgPSBrVHlwZVN0cmluZzsKKyAgICAgICAgaXRlbS0+dS5zdHJpbmdWYWx1ZSA9IG5ldyBBU3RyaW5nKHMsIGxlbiA8IDAgPyBzdHJsZW4ocykgOiBsZW4pOworICAgIH0KIH0KIAogdm9pZCBBTWVzc2FnZTo6c2V0U3RyaW5nKApAQCAtMzEwLDEwICszMTcsMTIgQEAKIHZvaWQgQU1lc3NhZ2U6OnNldE9iamVjdEludGVybmFsKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxSZWZCYXNlPiAmb2JqLCBUeXBlIHR5cGUpIHsKICAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOwotICAgIGl0ZW0tPm1UeXBlID0gdHlwZTsKKyAgICBpZiAoaXRlbSkgeworICAgICAgICBpdGVtLT5tVHlwZSA9IHR5cGU7CiAKLSAgICBpZiAob2JqICE9IE5VTEwpIHsgb2JqLT5pbmNTdHJvbmcodGhpcyk7IH0KLSAgICBpdGVtLT51LnJlZlZhbHVlID0gb2JqLmdldCgpOworICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsgb2JqLT5pbmNTdHJvbmcodGhpcyk7IH0KKyAgICAgICAgaXRlbS0+dS5yZWZWYWx1ZSA9IG9iai5nZXQoKTsKKyAgICB9CiB9CiAKIHZvaWQgQU1lc3NhZ2U6OnNldE9iamVjdChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBzcDxSZWZCYXNlPiAmb2JqKSB7CkBAIC0zMjYsMjIgKzMzNSwyNiBAQAogCiB2b2lkIEFNZXNzYWdlOjpzZXRNZXNzYWdlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb2JqKSB7CiAgICAgSXRlbSAqaXRlbSA9IGFsbG9jYXRlSXRlbShuYW1lKTsKLSAgICBpdGVtLT5tVHlwZSA9IGtUeXBlTWVzc2FnZTsKKyAgICBpZiAoaXRlbSkgeworICAgICAgICBpdGVtLT5tVHlwZSA9IGtUeXBlTWVzc2FnZTsKIAotICAgIGlmIChvYmogIT0gTlVMTCkgeyBvYmotPmluY1N0cm9uZyh0aGlzKTsgfQotICAgIGl0ZW0tPnUucmVmVmFsdWUgPSBvYmouZ2V0KCk7CisgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeyBvYmotPmluY1N0cm9uZyh0aGlzKTsgfQorICAgICAgICBpdGVtLT51LnJlZlZhbHVlID0gb2JqLmdldCgpOworICAgIH0KIH0KIAogdm9pZCBBTWVzc2FnZTo6c2V0UmVjdCgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIHsKICAgICBJdGVtICppdGVtID0gYWxsb2NhdGVJdGVtKG5hbWUpOwotICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVSZWN0OworICAgIGlmIChpdGVtKSB7CisgICAgICAgIGl0ZW0tPm1UeXBlID0ga1R5cGVSZWN0OwogCi0gICAgaXRlbS0+dS5yZWN0VmFsdWUubUxlZnQgPSBsZWZ0OwotICAgIGl0ZW0tPnUucmVjdFZhbHVlLm1Ub3AgPSB0b3A7Ci0gICAgaXRlbS0+dS5yZWN0VmFsdWUubVJpZ2h0ID0gcmlnaHQ7Ci0gICAgaXRlbS0+dS5yZWN0VmFsdWUubUJvdHRvbSA9IGJvdHRvbTsKKyAgICAgICAgaXRlbS0+dS5yZWN0VmFsdWUubUxlZnQgPSBsZWZ0OworICAgICAgICBpdGVtLT51LnJlY3RWYWx1ZS5tVG9wID0gdG9wOworICAgICAgICBpdGVtLT51LnJlY3RWYWx1ZS5tUmlnaHQgPSByaWdodDsKKyAgICAgICAgaXRlbS0+dS5yZWN0VmFsdWUubUJvdHRvbSA9IGJvdHRvbTsKKyAgICB9CiB9CiAKIGJvb2wgQU1lc3NhZ2U6OmZpbmRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqdmFsdWUpIGNvbnN0IHsKQEAgLTQ2NiwxOCArNDc5LDE4IEBACiAKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6ZHVwKCkgY29uc3QgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UobVdoYXQsIG1IYW5kbGVyLnByb21vdGUoKSk7Ci0gICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CisgICAgbXNnLT5tSXRlbXMgPSBtSXRlbXM7CiAKICNpZmRlZiBEVU1QX1NUQVRTCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgICAgICArK2dEdXBDYWxsczsKLSAgICAgICAgZ0F2ZXJhZ2VEdXBJdGVtcyArPSBtTnVtSXRlbXM7CisgICAgICAgIGdBdmVyYWdlRHVwSXRlbXMgKz0gbUl0ZW1zLnNpemUoKTsKICAgICAgICAgcmVwb3J0U3RhdHMoKTsKICAgICB9CiAjZW5kaWYKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUl0ZW1zOyArK2kpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JdGVtcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBJdGVtICpmcm9tID0gJm1JdGVtc1tpXTsKICAgICAgICAgSXRlbSAqdG8gPSAmbXNnLT5tSXRlbXNbaV07CiAKQEAgLTU2MCw3ICs1NzMsNyBAQAogICAgIH0KICAgICBzLmFwcGVuZCgiKSA9IHtcbiIpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUl0ZW1zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IEl0ZW0gJml0ZW0gPSBtSXRlbXNbaV07CiAKICAgICAgICAgc3dpdGNoIChpdGVtLm1UeXBlKSB7CkBAIC02NDYsMjYgKzY1OSwyNyBAQAogICAgIHJldHVybiBzOwogfQogCi0jaWZuZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogLy8gc3RhdGljCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwsIHNpemVfdCBtYXhOZXN0aW5nTGV2ZWwpIHsKICAgICBpbnQzMl90IHdoYXQgPSBwYXJjZWwucmVhZEludDMyKCk7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOwogICAgIG1zZy0+c2V0V2hhdCh3aGF0KTsKIAotICAgIG1zZy0+bU51bUl0ZW1zID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwotICAgIGlmIChtc2ctPm1OdW1JdGVtcyA+IGtNYXhOdW1JdGVtcykgeworICAgIHNpemVfdCBudW1JdGVtcyA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBpZiAobnVtSXRlbXMgPiBrTWF4TnVtSXRlbXMpIHsKICAgICAgICAgQUxPR0UoIlRvbyBsYXJnZSBudW1iZXIgb2YgaXRlbXMgY2xpcHBlZC4iKTsKLSAgICAgICAgbXNnLT5tTnVtSXRlbXMgPSBrTWF4TnVtSXRlbXM7CisgICAgICAgIG51bUl0ZW1zID0ga01heE51bUl0ZW1zOwogICAgIH0KKyAgICBtc2ctPm1JdGVtcy5yZXNpemUobnVtSXRlbXMpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtc2ctPm1OdW1JdGVtczsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtc2ctPm1JdGVtcy5zaXplKCk7ICsraSkgewogICAgICAgICBJdGVtICppdGVtID0gJm1zZy0+bUl0ZW1zW2ldOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBwYXJjZWwucmVhZENTdHJpbmcoKTsKICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCByZWFkaW5nIG5hbWUgZm9yIGFuIGl0ZW0uIFBhcnNpbmcgYWJvcnRlZC4iKTsKLSAgICAgICAgICAgIG1zZy0+bU51bUl0ZW1zID0gaTsKKyAgICAgICAgICAgIG1zZy0+bUl0ZW1zLnJlc2l6ZShpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTcwOSw3ICs3MjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgcmVhZGluZyBzdHJpbmcgdmFsdWUgZnJvbSBhIHBhcmNlbC4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIlBhcnNpbmcgYWJvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5tTnVtSXRlbXMgPSBpOworICAgICAgICAgICAgICAgICAgICBtc2ctPm1JdGVtcy5yZXNpemUoaSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbG9vcCB3aWxsIHRlcm1pbmF0ZSBzdWJzZXF1ZW50bHkuCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTc1NCwxMSArNzY4LDkgQEAKIAogdm9pZCBBTWVzc2FnZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtV2hhdCkpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtTnVtSXRlbXMpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUl0ZW1zLnNpemUoKSkpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgewotICAgICAgICBjb25zdCBJdGVtICZpdGVtID0gbUl0ZW1zW2ldOwotCisgICAgZm9yIChjb25zdCBJdGVtICZpdGVtIDogbUl0ZW1zKSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVDU3RyaW5nKGl0ZW0ubU5hbWUpOwogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaXRlbS5tVHlwZSkpOwogCkBAIC04MTMsNyArODI1LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KLSNlbmRpZiAgLy8gX19BTkRST0lEX1ZOREtfXworI2VuZGlmICAvLyAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogCiBzcDxBTWVzc2FnZT4gQU1lc3NhZ2U6OmNoYW5nZXNGcm9tKGNvbnN0IHNwPGNvbnN0IEFNZXNzYWdlPiAmb3RoZXIsIGJvb2wgZGVlcCkgY29uc3QgewogICAgIGlmIChvdGhlciA9PSBOVUxMKSB7CkBAIC04MjgsOCArODQwLDcgQEAKICAgICAgICAgZGlmZi0+c2V0VGFyZ2V0KG1IYW5kbGVyLnByb21vdGUoKSk7CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSXRlbXM7ICsraSkgewotICAgICAgICBjb25zdCBJdGVtICZpdGVtID0gbUl0ZW1zW2ldOworICAgIGZvciAoY29uc3QgSXRlbSAmaXRlbSA6IG1JdGVtcykgewogICAgICAgICBjb25zdCBJdGVtICpvaXRlbSA9IG90aGVyLT5maW5kSXRlbShpdGVtLm1OYW1lLCBpdGVtLm1UeXBlKTsKICAgICAgICAgc3dpdGNoIChpdGVtLm1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIGtUeXBlSW50MzI6CkBAIC05MzYsMTEgKzk0NywxMSBAQAogfQogCiBzaXplX3QgQU1lc3NhZ2U6OmNvdW50RW50cmllcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU51bUl0ZW1zOworICAgIHJldHVybiBtSXRlbXMuc2l6ZSgpOwogfQogCiBjb25zdCBjaGFyICpBTWVzc2FnZTo6Z2V0RW50cnlOYW1lQXQoc2l6ZV90IGluZGV4LCBUeXBlICp0eXBlKSBjb25zdCB7Ci0gICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgIGlmIChpbmRleCA+PSBtSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgICp0eXBlID0ga1R5cGVJbnQzMjsKIAogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTk1Myw3ICs5NjQsNyBAQAogCiBBTWVzc2FnZTo6SXRlbURhdGEgQU1lc3NhZ2U6OmdldEVudHJ5QXQoc2l6ZV90IGluZGV4KSBjb25zdCB7CiAgICAgSXRlbURhdGEgaXQ7Ci0gICAgaWYgKGluZGV4IDwgbU51bUl0ZW1zKSB7CisgICAgaWYgKGluZGV4IDwgbUl0ZW1zLnNpemUoKSkgewogICAgICAgICBzd2l0Y2ggKG1JdGVtc1tpbmRleF0ubVR5cGUpIHsKICAgICAgICAgICAgIGNhc2Uga1R5cGVJbnQzMjogICAgaXQuc2V0KG1JdGVtc1tpbmRleF0udS5pbnQzMlZhbHVlKTsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIGtUeXBlSW50NjQ6ICAgIGl0LnNldChtSXRlbXNbaW5kZXhdLnUuaW50NjRWYWx1ZSk7IGJyZWFrOwpAQCAtOTg2LDcgKzk5Nyw3IEBACiB9CiAKIHN0YXR1c190IEFNZXNzYWdlOjpzZXRFbnRyeU5hbWVBdChzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBpZiAoaW5kZXggPj0gbU51bUl0ZW1zKSB7CisgICAgaWYgKGluZGV4ID49IG1JdGVtcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKICAgICB9CiAgICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewpAQCAtOTk2LDcgKzEwMDcsNyBAQAogICAgICAgICByZXR1cm4gT0s7IC8vIG5hbWUgaGFzIG5vdCBjaGFuZ2VkCiAgICAgfQogICAgIHNpemVfdCBsZW4gPSBzdHJsZW4obmFtZSk7Ci0gICAgaWYgKGZpbmRJdGVtSW5kZXgobmFtZSwgbGVuKSA8IG1OdW1JdGVtcykgeworICAgIGlmIChmaW5kSXRlbUluZGV4KG5hbWUsIGxlbikgPCBtSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKICAgICB9CiAgICAgZGVsZXRlW10gbUl0ZW1zW2luZGV4XS5tTmFtZTsKQEAgLTEwMTEsNyArMTAyMiw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZ1ZhbHVlOwogICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOwogCi0gICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgIGlmIChpbmRleCA+PSBtSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CiAgICAgfQogICAgIGlmICghaXRlbS51c2VkKCkpIHsKQEAgLTEwNjAsMjkgKzEwNzEsNDEgQEAKIH0KIAogc3RhdHVzX3QgQU1lc3NhZ2U6OnJlbW92ZUVudHJ5QXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4ID49IG1OdW1JdGVtcykgeworICAgIGlmIChpbmRleCA+PSBtSXRlbXMuc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CiAgICAgfQogICAgIC8vIGRlbGV0ZSBlbnRyeSBkYXRhIGFuZCBvYmplY3RzCi0gICAgLS1tTnVtSXRlbXM7CiAgICAgZGVsZXRlW10gbUl0ZW1zW2luZGV4XS5tTmFtZTsKICAgICBtSXRlbXNbaW5kZXhdLm1OYW1lID0gbnVsbHB0cjsKICAgICBmcmVlSXRlbVZhbHVlKCZtSXRlbXNbaW5kZXhdKTsKIAogICAgIC8vIHN3YXAgZW50cnkgd2l0aCBsYXN0IGVudHJ5IGFuZCBjbGVhciBsYXN0IGVudHJ5J3MgZGF0YQotICAgIGlmIChpbmRleCA8IG1OdW1JdGVtcykgewotICAgICAgICBtSXRlbXNbaW5kZXhdID0gbUl0ZW1zW21OdW1JdGVtc107Ci0gICAgICAgIG1JdGVtc1ttTnVtSXRlbXNdLm1OYW1lID0gbnVsbHB0cjsKLSAgICAgICAgbUl0ZW1zW21OdW1JdGVtc10ubVR5cGUgPSBrVHlwZUludDMyOworICAgIHNpemVfdCBsYXN0SW5kZXggPSBtSXRlbXMuc2l6ZSgpIC0gMTsKKyAgICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHsKKyAgICAgICAgbUl0ZW1zW2luZGV4XSA9IG1JdGVtc1tsYXN0SW5kZXhdOworICAgICAgICBtSXRlbXNbbGFzdEluZGV4XS5tTmFtZSA9IG51bGxwdHI7CisgICAgICAgIG1JdGVtc1tsYXN0SW5kZXhdLm1UeXBlID0ga1R5cGVJbnQzMjsKICAgICB9CisgICAgbUl0ZW1zLnBvcF9iYWNrKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBTWVzc2FnZTo6cmVtb3ZlRW50cnlCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgeworICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IGluZGV4ID0gZmluZEVudHJ5QnlOYW1lKG5hbWUpOworICAgIGlmIChpbmRleCA+PSBtSXRlbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIHJldHVybiByZW1vdmVFbnRyeUF0KGluZGV4KTsKK30KKwogdm9pZCBBTWVzc2FnZTo6c2V0SXRlbShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBJdGVtRGF0YSAmaXRlbSkgewogICAgIGlmIChpdGVtLnVzZWQoKSkgewogICAgICAgICBJdGVtICppdCA9IGFsbG9jYXRlSXRlbShuYW1lKTsKICAgICAgICAgaWYgKGl0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHNldEVudHJ5QXQoaXQgLSBtSXRlbXMsIGl0ZW0pOworICAgICAgICAgICAgc2V0RW50cnlBdChpdCAtICZtSXRlbXNbMF0sIGl0ZW0pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTA5NywxMSArMTEyMCwxMSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG90aGVyLT5tTnVtSXRlbXM7ICsraXgpIHsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgb3RoZXItPm1JdGVtcy5zaXplKCk7ICsraXgpIHsKICAgICAgICAgSXRlbSAqaXQgPSBhbGxvY2F0ZUl0ZW0ob3RoZXItPm1JdGVtc1tpeF0ubU5hbWUpOwogICAgICAgICBpZiAoaXQgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgSXRlbURhdGEgZGF0YSA9IG90aGVyLT5nZXRFbnRyeUF0KGl4KTsKLSAgICAgICAgICAgIHNldEVudHJ5QXQoaXQgLSBtSXRlbXMsIGRhdGEpOworICAgICAgICAgICAgc2V0RW50cnlBdChpdCAtICZtSXRlbXNbMF0sIGRhdGEpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggNGJkMTg2Yy4uYjFlZDA3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiQURlYnVnLmgiCiAjaW5jbHVkZSAiQVN0cmluZy5oIgogCi0jaWZuZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC0zNjUsNyArMzY1LDcgQEAKICAgICByZXR1cm4gIXN0cmNhc2VjbXAobURhdGEgKyBtU2l6ZSAtIHN1ZmZpeExlbiwgc3VmZml4KTsKIH0KIAotI2lmbmRlZiBfX0FORFJPSURfVk5ES19fCisjaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIC8vIHN0YXRpYwogQVN0cmluZyBBU3RyaW5nOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CkBAIC0zODAsMTcgKzM4MCwyMSBAQAogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQotI2VuZGlmCisjZW5kaWYgLy8gIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKIAogQVN0cmluZyBBU3RyaW5nUHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSB7CiAgICAgdmFfbGlzdCBhcDsKICAgICB2YV9zdGFydChhcCwgZm9ybWF0KTsKIAogICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CisgICAgaW50IGJ1ZmZlclNpemUgPSB2YXNwcmludGYoJmJ1ZmZlciwgZm9ybWF0LCBhcCk7CiAKICAgICB2YV9lbmQoYXApOwogCisgICAgaWYoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmcoKTsKKyAgICB9CisKICAgICBBU3RyaW5nIHJlc3VsdChidWZmZXIpOwogCiAgICAgZnJlZShidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IGY0NDBlMDAuLmRkMmM2NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMTIsNiArMzEsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCkBAIC0yNSw3ICs0NSw5IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgLy8gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHZlbmRvciB2YXJpYW50IHRoYXQgcmVtb3ZlcyBsaWJiaW5kZXIsIGJ1dCB2ZW5kb3IKKyAgICAgICAgLy8gdGFyZ2V0IGJlbG93IGRvZXMgbm90IGFsbG93IGFkZGluZyBoZWFkZXJfbGlicy4KKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCkBAIC02Myw2ICs4NSw3IEBACiAgICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkJ5dGVVdGlscy5jcHAiLAogICAgICAgICAiQ29sb3JVdGlscy5jcHAiLAorICAgICAgICAiQ29sb3JVdGlsc19maWxsLmNwcCIsCiAgICAgICAgICJGb3VuZGF0aW9uVXRpbHMuY3BwIiwKICAgICAgICAgIk1lZGlhQnVmZmVyLmNwcCIsCiAgICAgICAgICJNZWRpYUJ1ZmZlckJhc2UuY3BwIiwKQEAgLTc5LDYgKzEwMiw3IEBACiAKICAgICB0YXJnZXQ6IHsKICAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICAvLyBUT0RPOiBhZGQgbGliYmluZGVyX2hlYWRlcnMgaGVyZSBpbnN0ZWFkIG9mIGFib3ZlIHdoZW4gaXQgYmVjb21lcyBzdXBwb3J0ZWQKICAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKICAgICAgICAgICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgICAgIF0sCkBAIC04Niw2ICsxMTAsMTQgQEAKICAgICAgICAgICAgICAgICAiLUROT19JTUVNT1JZIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGFwZXg6IHsKKyAgICAgICAgICAgIGV4Y2x1ZGVfc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCiAgICAgfSwKIAogICAgIGNsYW5nOiB0cnVlLApAQCAtMTE3LDMgKzE0OSw2NiBAQAogICAgICAgICAiLUROT19JTUVNT1JZIiwKICAgICBdLAogfQorCisvLyB0aGlzIGdldHMgbGlua2VkIGludG8gZXh0cmFjdG9ycyBpbiBtZWRpYSBtYWlubGluZSBtb2R1bGUKKy8vIHNvIG11c3QgYmUgbmRrIGFwaSAyOSBzbyB0aGF0IGl0IHJ1bnMgb24gPj1RCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fY29sb3J1dGlsc19uZGsiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsICAgICAgICAgICAgIC8vIGZvciBzcDw+CisgICAgICAgIC8vIGFjdHVhbGx5IGludm9rZXMgdGhpcywgYnV0IGNhbGxlZCBmcm9tIGZvbGtzIHdobyBhbHJlYWR5IGxvYWQgaXQKKyAgICAgICAgLy8gImxpYm1lZGlhbmRrIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgLy8gdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHZlbmRvciB2YXJpYW50IHRoYXQgcmVtb3ZlcyBsaWJiaW5kZXIsIGJ1dCB2ZW5kb3IKKyAgICAgICAgLy8gdGFyZ2V0IGJlbG93IGRvZXMgbm90IGFsbG93IGFkZGluZyBoZWFkZXJfbGlicy4KKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29sb3JVdGlsc19uZGsuY3BwIiwKKyAgICAgICAgIkNvbG9yVXRpbHNfZmlsbC5jcHAiLAorICAgIF0sCisKKyAgICBjbGFuZzogdHJ1ZSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBdLAorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCmluZGV4IDA3MGUzMjUuLmZhNzIyYjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcApAQCAtNjEzLDYgKzYxMywzNSBAQAogfQogCiAvLyBzdGF0aWMKK3ZvaWQgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRGF0YVNwYWNlKAorICAgICAgICBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSAmZGF0YXNwYWNlLCBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKnRyYW5zZmVyKSB7CisgICAgdWludDMyX3QgZ2Z4UmFuZ2UgPQorICAgICAgICAoZGF0YXNwYWNlICYgSEFMX0RBVEFTUEFDRV9SQU5HRV9NQVNLKSA+PiBIQUxfREFUQVNQQUNFX1JBTkdFX1NISUZUOworICAgIHVpbnQzMl90IGdmeFN0YW5kYXJkID0KKyAgICAgICAgKGRhdGFzcGFjZSAmIEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfTUFTSykgPj4gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9TSElGVDsKKyAgICB1aW50MzJfdCBnZnhUcmFuc2ZlciA9CisgICAgICAgIChkYXRhc3BhY2UgJiBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX01BU0spID4+IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfU0hJRlQ7CisKKyAgICAvLyBhc3N1bWUgMS10by0xIG1hcHBpbmcgdG8gSEFMIHZhbHVlcyAodG8gZGVhbCB3aXRoIHBvdGVudGlhbCB2ZW5kb3IgZXh0ZW5zaW9ucykKKyAgICBDVTo6Q29sb3JSYW5nZSAgICBjdVJhbmdlICAgID0gQ1U6OmtDb2xvclJhbmdlVW5zcGVjaWZpZWQ7CisgICAgQ1U6OkNvbG9yU3RhbmRhcmQgY3VTdGFuZGFyZCA9IENVOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkOworICAgIENVOjpDb2xvclRyYW5zZmVyIGN1VHJhbnNmZXIgPSBDVTo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZDsKKyAgICAvLyBUUklDS1k6IHVzZSAmIHRvIGVuc3VyZSBhbGwgdGhyZWUgbWFwcGluZ3MgYXJlIGNvbXBsZXRlZAorICAgIGlmICghKHNHZnhSYW5nZXMubWFwKGdmeFJhbmdlLCAmY3VSYW5nZSkgJiBzR2Z4U3RhbmRhcmRzLm1hcChnZnhTdGFuZGFyZCwgJmN1U3RhbmRhcmQpCisgICAgICAgICAgICAmIHNHZnhUcmFuc2ZlcnMubWFwKGdmeFRyYW5zZmVyLCAmY3VUcmFuc2ZlcikpKSB7CisgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgc2FmZWx5IG1hcCBncmFwaGljcyBkYXRhc3BhY2UgKFI6JXUgUzoldSBUOiV1KSB0byAiCisgICAgICAgICAgICAgICJwbGF0Zm9ybSBjb2xvciBhc3BlY3RzIChSOiV1KCVzKSBTOiV1KCVzKSBUOiV1KCVzKSIsCisgICAgICAgICAgICAgIGdmeFJhbmdlLCBnZnhTdGFuZGFyZCwgZ2Z4VHJhbnNmZXIsCisgICAgICAgICAgICAgIGN1UmFuZ2UsICAgIGFzU3RyaW5nKGN1UmFuZ2UpLAorICAgICAgICAgICAgICBjdVN0YW5kYXJkLCBhc1N0cmluZyhjdVN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgY3VUcmFuc2ZlciwgYXNTdHJpbmcoY3VUcmFuc2ZlcikpOworICAgIH0KKyAgICAqcmFuZ2UgICAgPSBjdVJhbmdlOworICAgICpzdGFuZGFyZCA9IGN1U3RhbmRhcmQ7CisgICAgKnRyYW5zZmVyID0gY3VUcmFuc2ZlcjsKK30KKworLy8gc3RhdGljCiB2b2lkIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbUZvcm1hdCgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpIHsKICAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIHJhbmdlKSkgewpAQCAtNjkzLDEzICs3MjIsNiBAQAogICAgICAgICAgICAgdHJhbnNmZXIsIGFzU3RyaW5nKChDb2xvclRyYW5zZmVyKXRyYW5zZmVyKSk7CiB9CiAKLQotLy8gc3RhdGljCi12b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KAotICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgewotICAgIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm8sIGZvcm1hdC0+bUZvcm1hdCk7Ci19Ci0KIC8vIHN0YXRpYwogdm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdCgKICAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKQEAgLTcwNyw0OCArNzI5LDcgQEAKIAogICAgIC8vIENvbnZlcnQgdGhlIGRhdGEgaW4gaW5mb0J1ZmZlciB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdCBhcyBkZWZpbmVkIGJ5IENUQS04NjEtMwogICAgIHVpbnQ4X3QgKmRhdGEgPSBpbmZvQnVmZmVyLT5kYXRhKCk7Ci0gICAgLy8gU3RhdGljX01ldGFkYXRhX0Rlc2NyaXB0b3JfSUQKLSAgICBkYXRhWzBdID0gaW5mby5tSUQ7Ci0KLSAgICAvLyBkaXNwbGF5IHByaW1hcnkgMAotICAgIGRhdGFbMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubVIueCk7Ci0gICAgZGF0YVsyXSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tUi54KTsKLSAgICBkYXRhWzNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1SLnkpOwotICAgIGRhdGFbNF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubVIueSk7Ci0KLSAgICAvLyBkaXNwbGF5IHByaW1hcnkgMQotICAgIGRhdGFbNV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUcueCk7Ci0gICAgZGF0YVs2XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tRy54KTsKLSAgICBkYXRhWzddID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1HLnkpOwotICAgIGRhdGFbOF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUcueSk7Ci0KLSAgICAvLyBkaXNwbGF5IHByaW1hcnkgMgotICAgIGRhdGFbOV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUIueCk7Ci0gICAgZGF0YVsxMF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUIueCk7Ci0gICAgZGF0YVsxMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUIueSk7Ci0gICAgZGF0YVsxMl0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUIueSk7Ci0KLSAgICAvLyB3aGl0ZSBwb2ludAotICAgIGRhdGFbMTNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1XLngpOwotICAgIGRhdGFbMTRdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1XLngpOwotICAgIGRhdGFbMTVdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1XLnkpOwotICAgIGRhdGFbMTZdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1XLnkpOwotCi0gICAgLy8gTWF4RGlzcGxheUx1bWluYW5jZQotICAgIGRhdGFbMTddID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKLSAgICBkYXRhWzE4XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSk7Ci0KLSAgICAvLyBNaW5EaXNwbGF5THVtaW5hbmNlCi0gICAgZGF0YVsxOV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UpOwotICAgIGRhdGFbMjBdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlKTsKLQotICAgIC8vIE1heENvbnRlbnRMaWdodExldmVsCi0gICAgZGF0YVsyMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKLSAgICBkYXRhWzIyXSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwpOwotCi0gICAgLy8gTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbAotICAgIGRhdGFbMjNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKTsKLSAgICBkYXRhWzI0XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7CisgICAgZmlsbEhkclN0YXRpY0luZm9CdWZmZXIoaW5mbywgZGF0YSk7CiAKICAgICBmb3JtYXQtPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgaW5mb0J1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHNfZmlsbC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHNfZmlsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3NDkzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlsc19maWxsLmNwcApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2xvclV0aWxzIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzaG9ydGN1dCBuYW1lcyBmb3IgYnJldml0eSBpbiB0aGUgZm9sbG93aW5nIHRhYmxlcwordHlwZWRlZiBDb2xvckFzcGVjdHMgQ0E7Cit0eXBlZGVmIENvbG9yVXRpbHMgQ1U7CisKKyNkZWZpbmUgSElfVUlOVDE2KGEpICgoKGEpID4+IDgpICYgMHhGRikKKyNkZWZpbmUgTE9fVUlOVDE2KGEpICgoYSkgJiAweEZGKQorCisvLworLy8gc3RhdGljCit2b2lkIENvbG9yVXRpbHM6OmZpbGxIZHJTdGF0aWNJbmZvQnVmZmVyKCBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCB1aW50OF90ICpkYXRhKSB7CisgICAgLy8gU3RhdGljX01ldGFkYXRhX0Rlc2NyaXB0b3JfSUQKKyAgICBkYXRhWzBdID0gaW5mby5tSUQ7CisKKyAgICAvLyBkaXNwbGF5IHByaW1hcnkgMAorICAgIGRhdGFbMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubVIueCk7CisgICAgZGF0YVsyXSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tUi54KTsKKyAgICBkYXRhWzNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1SLnkpOworICAgIGRhdGFbNF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubVIueSk7CisKKyAgICAvLyBkaXNwbGF5IHByaW1hcnkgMQorICAgIGRhdGFbNV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUcueCk7CisgICAgZGF0YVs2XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tRy54KTsKKyAgICBkYXRhWzddID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1HLnkpOworICAgIGRhdGFbOF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUcueSk7CisKKyAgICAvLyBkaXNwbGF5IHByaW1hcnkgMgorICAgIGRhdGFbOV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUIueCk7CisgICAgZGF0YVsxMF0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUIueCk7CisgICAgZGF0YVsxMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubUIueSk7CisgICAgZGF0YVsxMl0gPSBISV9VSU5UMTYoaW5mby5zVHlwZTEubUIueSk7CisKKyAgICAvLyB3aGl0ZSBwb2ludAorICAgIGRhdGFbMTNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1XLngpOworICAgIGRhdGFbMTRdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1XLngpOworICAgIGRhdGFbMTVdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1XLnkpOworICAgIGRhdGFbMTZdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1XLnkpOworCisgICAgLy8gTWF4RGlzcGxheUx1bWluYW5jZQorICAgIGRhdGFbMTddID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICBkYXRhWzE4XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSk7CisKKyAgICAvLyBNaW5EaXNwbGF5THVtaW5hbmNlCisgICAgZGF0YVsxOV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UpOworICAgIGRhdGFbMjBdID0gSElfVUlOVDE2KGluZm8uc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlKTsKKworICAgIC8vIE1heENvbnRlbnRMaWdodExldmVsCisgICAgZGF0YVsyMV0gPSBMT19VSU5UMTYoaW5mby5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICBkYXRhWzIyXSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwpOworCisgICAgLy8gTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbAorICAgIGRhdGFbMjNdID0gTE9fVUlOVDE2KGluZm8uc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsKTsKKyAgICBkYXRhWzI0XSA9IEhJX1VJTlQxNihpbmZvLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzX25kay5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHNfbmRrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWQyNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzX25kay5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29sb3JVdGlscyIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoCisgICAgICAgIGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopIG1hbGxvYygyNSk7CisgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICBmaWxsSGRyU3RhdGljSW5mb0J1ZmZlcihpbmZvLCBkYXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsICJoZHItc3RhdGljLWluZm8iLCBkYXRhLCAyNSk7CisgICAgICAgIGZyZWUoZGF0YSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCmluZGV4IDhlMjQ1ZGMuLjY4ZGYyMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCkBAIC01MSwxMiArNTEsMTIgQEAKICAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKICAgICAgIG1Pd25zRGF0YSh0cnVlKSwKICAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSB7Ci0jaWZuZGVmIE5PX0lNRU1PUlkKKyNpZiAhZGVmaW5lZChOT19JTUVNT1JZKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAogICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgewogI2VuZGlmCiAgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotI2lmbmRlZiBOT19JTUVNT1JZCisjaWYgIWRlZmluZWQoTk9fSU1FTU9SWSkgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7CiAgICAgICAgIHNpemVfdCBuZXdTaXplID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCmluZGV4IDNjMjUwNDcuLmZjOThmMjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckdyb3VwLmNwcApAQCAtNjIsNyArNjIsNyBAQAogICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7CiAgICAgfQogCi0jaWZuZGVmIE5PX0lNRU1PUlkKKyNpZiAhZGVmaW5lZChOT19JTUVNT1JZKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogICAgIGlmIChidWZmZXJfc2l6ZSA+PSBrU2hhcmVkTWVtb3J5VGhyZXNob2xkKSB7CiAgICAgICAgIEFMT0dEKCJjcmVhdGluZyBNZW1vcnlEZWFsZXIiKTsKICAgICAgICAgLy8gVXNpbmcgYSBzaW5nbGUgTWVtb3J5RGVhbGVyIGlzIGVmZmljaWVudCBmb3IgYSBncm91cCBvZiBzaGFyZWQgbWVtb3J5IG9iamVjdHMuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKaW5kZXggYTA4ZmVkMS4uYWRhNWQ4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHID0gImltYWdlL2pwZWciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDID0gImltYWdlL3ZuZC5hbmRyb2lkLmhlaWMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRiA9ICJpbWFnZS9hdmlmIjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOwpAQCAtNTcsNiArNTgsOCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyA9ICJhdWRpby9lYWMzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DID0gImF1ZGlvL2VhYzMtam9jIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FDNCA9ICJhdWRpby9hYzQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMSA9ICJhdWRpby9taGExIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01QRUdIX01ITTEgPSAiYXVkaW8vbWhtMSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgPSAiYXVkaW8veC1tcy13bWEiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcAppbmRleCA4MTc0NTk3Li43ZjQ4Y2ZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKLSNpZm5kZWYgX19BTkRST0lEX1ZOREtfXworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2VuZGlmCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIE1ldGFEYXRhOjp+TWV0YURhdGEoKSB7CiB9CiAKLSNpZm5kZWYgX19BTkRST0lEX1ZOREtfXworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAvKiBzdGF0aWMgKi8KIHNwPE1ldGFEYXRhPiBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKaW5kZXggNGI0MzljNi4uM2YwNTBlYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogCi0jaWZuZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpZiAhZGVmaW5lZChfX0FORFJPSURfVk5ES19fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNlbmRpZgogCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICB9CiB9CiAKLSNpZm5kZWYgX19BTkRST0lEX1ZOREtfXworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiBzdGF0dXNfdCBNZXRhRGF0YUJhc2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpIHsKICAgICBzdGF0dXNfdCByZXQ7CiAgICAgc2l6ZV90IG51bUl0ZW1zID0gbUludGVybmFsRGF0YS0+bUl0ZW1zLnNpemUoKTsKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIEFMT0dXKCJubyBtZXRhZGF0YSBpbiBwYXJjZWwiKTsKICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KLSNlbmRpZgorI2VuZGlmIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuY3BwCmluZGV4IDc4NGU4MDIuLjMwZDBhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcApAQCAtMTQ2LDYgKzE0NiwxMCBAQAogaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpIHsKICAgICAvLyBTZWUgaHR0cHM6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyLgorICAgIGlmIChoZWFkZXIuY2hhbm5lbHMgPCAxIHx8IGhlYWRlci5jaGFubmVscyA+IGtNYXhDaGFubmVscykgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIGNvdW50OiAlZCIsIGhlYWRlci5jaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci5jaGFubmVsczsKICAgICBpZiAob3V0cHV0X3NpemUgPCB0b3RhbF9zaXplKSB7CiAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCBmb3IgaGVhZGVyLiIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwppbmRleCA4MGFkOWZiLi5hNzBjMzUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1RFU1RfTUFQUElORworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwpAQCAtMSw4ICsxLDEzIEBACisvLyBtYXBwaW5ncyBmb3IgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uCiB7Ci0gICJwcmVzdWJtaXQiOiBbCi0gICAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAotICAgIC8veyAibmFtZSI6ICJPcHVzSGVhZGVyVGVzdCIgfSwKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJPcHVzSGVhZGVyVGVzdCIgfQorICBdLAogCisgICJwcmVzdWJtaXQiOiBbCiAgICAgeyAibmFtZSI6ICJzZl9mb3VuZGF0aW9uX3Rlc3QiIH0sCiAgICAgeyAibmFtZSI6ICJNZXRhRGF0YUJhc2VVbml0VGVzdCJ9CiAgIF0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcAppbmRleCBmNTNkMmM5Li45ZDY4ODdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCkBAIC01NTksMTEgKzU1OSw5IEBACiAgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKICAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKIAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCBfX3VudXNlZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgX191bnVzZWQ7CiAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkCisgICAgICAgIGJyLnNraXBCaXRzKDMpOyAvL3ZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eQogICAgIH0KICAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faW5mbyA9IGJyLmdldEJpdHMoNCk7CiAgICAgaWYgKGFzcGVjdF9yYXRpb19pbmZvID09IDB4MGYgLyogZXh0ZW5kZWQgUEFSICovKSB7CkBAIC02MjIsNyArNjIwLDcgQEAKICAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7CiAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CiAKLSAgICB1bnNpZ25lZCBpbnRlcmxhY2VkIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICBici5za2lwQml0cygxKTsgLy8gaW50ZXJsYWNlZAogCiAgICAgKndpZHRoID0gdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoOwogICAgICpoZWlnaHQgPSB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0OwpAQCAtNjY4LDcgKzY2Niw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB1bnNpZ25lZCBwcm90ZWN0aW9uIF9fdW51c2VkID0gKGhlYWRlciA+PiAxNikgJiAxOworICAgIC8vIHdlIGNhbiBnZXQgcHJvdGVjdGlvbiB2YWx1ZSBmcm9tIChoZWFkZXIgPj4gMTYpICYgMQogCiAgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAppbmRleCBhYjE3YTAyLi5lNGI5OWJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtMTQ4LDcgKzE0OCw4IEBACiAgICAgc3RhdGljIGNoYXIgKkdldERlYnVnTmFtZShjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIGlubGluZSBzdGF0aWMgYm9vbCBpc0V4cGVyaW1lbnRFbmFibGVkKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSBfX3VudXNlZCAvKiBub25udWxsICovLCBib29sIGFsbG93IF9fdW51c2VkID0gdHJ1ZSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSAvKiBub25udWxsICovLAorICAgICAgICAgICAgYm9vbCBhbGxvdyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHRydWUpIHsKICNpZmRlZiBFTkFCTEVfU1RBR0VGUklHSFRfRVhQRVJJTUVOVFMKICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImxlZ2FjeS1hZGFwdGl2ZSIpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0RXhwZXJpbWVudEZsYWcoYWxsb3csIG5hbWUsIDIsIDEpOyAvLyBldmVyeSBvdGhlciBkYXkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oCmluZGV4IGI1ZDY2NjYuLjk2MDIxMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOwpAQCAtNjMsNyArNjUsNyBAQAogICAgIEFNZXNzYWdlKCk7CiAgICAgQU1lc3NhZ2UodWludDMyX3Qgd2hhdCwgY29uc3Qgc3A8Y29uc3QgQUhhbmRsZXI+ICZoYW5kbGVyKTsKIAotI2lmbmRlZiBfX0FORFJPSURfVk5ES19fCisjaWYgIWRlZmluZWQoX19BTkRST0lEX1ZOREtfXykgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICAgICAvLyBDb25zdHJ1Y3QgYW4gQU1lc3NhZ2UgZnJvbSBhIHBhcmNlbC4KICAgICAvLyBuZXN0aW5nQWxsb3dlZCBkZXRlcm1pbmVzIGhvdyBtYW55IGxldmVscyBBTWVzc2FnZSBjYW4gYmUgbmVzdGVkIGluc2lkZQogICAgIC8vIEFNZXNzYWdlLiBUaGUgZGVmYXVsdCB2YWx1ZSBoZXJlIGlzIGFyYml0cmFyaWx5IHNldCB0byAyNTUuCkBAIC04OCwxMyArOTAsMTQgQEAKICAgICAvLyBBbGwgaXRlbXMgaW4gdGhlIEFNZXNzYWdlIG11c3QgaGF2ZSB0eXBlcyB0aGF0IGFyZSByZWNvZ25pemVkIGJ5CiAgICAgLy8gRnJvbVBhcmNlbCgpOyBvdGhlcndpc2UsIFRSRVNQQVNTIGVycm9yIHdpbGwgb2NjdXIuCiAgICAgdm9pZCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKLSNlbmRpZgorI2VuZGlmIC8vICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAKICAgICB2b2lkIHNldFdoYXQodWludDMyX3Qgd2hhdCk7CiAgICAgdWludDMyX3Qgd2hhdCgpIGNvbnN0OwogCiAgICAgdm9pZCBzZXRUYXJnZXQoY29uc3Qgc3A8Y29uc3QgQUhhbmRsZXI+ICZoYW5kbGVyKTsKIAorICAgIC8vIHJlbW92ZXMgYWxsIGl0ZW1zCiAgICAgdm9pZCBjbGVhcigpOwogCiAgICAgdm9pZCBzZXRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90IHZhbHVlKTsKQEAgLTI2MSw2ICsyNjQsMTcgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCByZW1vdmVFbnRyeUF0KHNpemVfdCBpbmRleCk7CiAKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFuIGVudHJ5IGJhc2VkIG9uIG5hbWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZSAgbmFtZSBvZiB0aGUgZW50cnkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgT0sgdGhlIGVudHJ5IHdhcyByZW1vdmVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQkFEX1ZBTFVFIG5hbWUgaXMgaW52YWxpZCAobnVsbCkKKyAgICAgKiBccmV0dmFsIEJBRF9JTkRFWCBuYW1lIG5vdCBmb3VuZAorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZUVudHJ5QnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1lc3NhZ2UoKTsKIApAQCAtMjkxLDE2ICszMDUsMzkgQEAKICAgICAgICAgc2l6ZV90ICAgICAgbU5hbWVMZW5ndGg7CiAgICAgICAgIFR5cGUgbVR5cGU7CiAgICAgICAgIHZvaWQgc2V0TmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKTsKKyAgICAgICAgSXRlbSgpIDogbU5hbWUobnVsbHB0ciksIG1OYW1lTGVuZ3RoKDApLCBtVHlwZShrVHlwZUludDMyKSB7IH0KKyAgICAgICAgSXRlbShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoKTsKICAgICB9OwogCiAgICAgZW51bSB7Ci0gICAgICAgIGtNYXhOdW1JdGVtcyA9IDY0CisgICAgICAgIGtNYXhOdW1JdGVtcyA9IDI1NgogICAgIH07Ci0gICAgSXRlbSBtSXRlbXNba01heE51bUl0ZW1zXTsKLSAgICBzaXplX3QgbU51bUl0ZW1zOworICAgIHN0ZDo6dmVjdG9yPEl0ZW0+IG1JdGVtczsKIAorICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhbiBpdGVtIHdpdGggdGhlIGdpdmVuIGtleSB8bmFtZXwuIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogaXRlbSB2YWx1ZSBpcyBmcmVlZC4gT3RoZXJ3aXNlIGEgbmV3IGl0ZW0gaXMgYWRkZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBjdXJyZW50bHkgYXNzZXJ0cyBpZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdvdWxkIGV4Y2VlZCB0aGUgbWF4IG51bWJlciBvZgorICAgICAqIGVsZW1lbnRzIGFsbG93ZWQgKGtNYXhOdW1JdGVtcykuIFRoaXMgaXMgYSBzZWN1cml0eSBwcmVjYXV0aW9uIHRvIGF2b2lkIGFyYml0cmFyaWx5IGxhcmdlCisgICAgICogQU1lc3NhZ2Ugc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIEB0b2RvKGIvMTkyMTUzMjQ1KSBFaXRoZXIgcmV2aXNpdCB0aGlzIHNlY3VyaXR5IHByZWNhdXRpb24sIG9yIGNoYW5nZSB0aGUgYmVoYXZpb3IgdG8KKyAgICAgKiAgICAgIHNpbGVudGx5IGlnbm9yZSBrZXlzIGFkZGVkIGFmdGVyIHRoZSBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGFyZSByZWFjaGVkLgorICAgICAqCisgICAgICogQG5vdGUgQWxsIHByZXZpb3VzbHkgcmV0dXJuZWQgSXRlbSogcG9pbnRlcnMgYXJlIGRlZW1lZCBpbnZhbGlkIGFmdGVyIHRoaXMgY2FsbC4gKEUuZy4gZnJvbQorICAgICAqICAgICAgIGFsbG9jYXRlSXRlbSBvciBmaW5kSXRlbSkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBrZXkgZm9yIHRoZSByZXF1ZXN0ZWQgaXRlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSXRlbSogYSBwb2ludGVyIHRvIHRoZSBpdGVtLgorICAgICAqLwogICAgIEl0ZW0gKmFsbG9jYXRlSXRlbShjb25zdCBjaGFyICpuYW1lKTsKKworICAgIC8qKiBGcmVlcyB0aGUgdmFsdWUgZm9yIHRoZSBpdGVtLiAqLwogICAgIHZvaWQgZnJlZUl0ZW1WYWx1ZShJdGVtICppdGVtKTsKKworICAgIC8qKiBGaW5kcyBhbiBpdGVtIHdpdGggZ2l2ZW4ga2V5IHxuYW1lfCBhbmQgfHR5cGV8LiBSZXR1cm5zIG51bGxwdHIgaWYgaXRlbSBpcyBub3QgZm91bmQuICovCiAgICAgY29uc3QgSXRlbSAqZmluZEl0ZW0oY29uc3QgY2hhciAqbmFtZSwgVHlwZSB0eXBlKSBjb25zdDsKIAogICAgIHZvaWQgc2V0T2JqZWN0SW50ZXJuYWwoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggZGVlZjBkNC4uNTE3Nzc0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaApAQCAtODksNyArODksNyBAQAogCiAgICAgdm9pZCB0b2xvd2VyKCk7CiAKLSNpZm5kZWYgX19BTkRST0lEX1ZOREtfXworI2lmICFkZWZpbmVkKF9fQU5EUk9JRF9WTkRLX18pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAgICAgc3RhdGljIEFTdHJpbmcgRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKaW5kZXggYWY2YjM1Ny4uM2I2NDZkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKQEAgLTYzLDcgKzYzLDcgQEAKIAogdGVtcGxhdGU8Y2xhc3MgVD4KIHZvaWQgRU5TVVJFX1VOU0lHTkVEX1RZUEUoKSB7Ci0gICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXSBfX3VudXNlZDsKKyAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwogfQogCiAvLyBuZWVkbGUgaXMgaW4gcmFuZ2UgW2hheVN0YXJ0LCBoYXlTdGFydCArIGhheVNpemUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKaW5kZXggY2QwYWYyYi4uYTJiNmM0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaApAQCAtMTU2LDYgKzE1NiwxMCBAQAogICAgIC8vIHN1aXRlZCB0byBibGVuZGluZy4gVGhpcyByZXF1aXJlcyBpbXBsaWNpdCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG9uIHBhcnQgb2YgdGhlIGRldmljZS4KICAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKENvbG9yQXNwZWN0cyAmYXNwZWN0cywgYm9vbCBtYXlFeHBhbmQpOwogCisgICAgLy8gaXQgcmV0dXJucyB0aGUgcGxhdGZvcm0gY29sb3IgY29uZmlncyBmcm9tIGdpdmVuIHxkYXRhc3BhY2V8LgorICAgIHN0YXRpYyB2b2lkIGdldENvbG9yQ29uZmlnRnJvbURhdGFTcGFjZSgKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlICZkYXRhc3BhY2UsIGludCAqcmFuZ2UsIGludCAqc3RhbmRhcmQsIGludCAqdHJhbnNmZXIpOworCiAgICAgLy8gY29udmVydHMgfGRhdGFTcGFjZXwgdG8gYSBWMCBlbnVtLCBhbmQgcmV0dXJucyB0cnVlIGlmIGRhdGFTcGFjZSBpcyBhbiBhc3BlY3Qtb25seSB2YWx1ZQogICAgIHN0YXRpYyBib29sIGNvbnZlcnREYXRhU3BhY2VUb1YwKGFuZHJvaWRfZGF0YXNwYWNlICZkYXRhU3BhY2UpOwogCkBAIC0xODcsNiArMTkxLDggQEAKICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAgICAgLy8gd3JpdGVzIHxpbmZvfCBpbnRvIGZvcm1hdC4KICAgICBzdGF0aWMgdm9pZCBzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgLy8gKGludGVybmFsKSB1c2VkIGJ5IHRoZSBzZXRIRFJTdGF0aWNJbmZvSW5mbyogcm91dGluZXMKKyAgICBzdGF0aWMgdm9pZCBmaWxsSGRyU3RhdGljSW5mb0J1ZmZlciggY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgdWludDhfdCAqZGF0YSk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKGFuZHJvaWQ6OkNvbG9yVXRpbHM6OkNvbG9yU3RhbmRhcmQgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAppbmRleCAxZjllNjM2Li5mNWNlY2VmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaApAQCAtMjIsNiArMjIsNyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfSlBFRzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfSU1BR0VfQVZJRjsKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CkBAIC01OSw2ICs2MCw4IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR0hfTUhBMTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHSF9NSE0xOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQTsKQEAgLTg5LDYgKzkyLDggQEAKICAgICBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0ID0gMiwKICAgICBrQXVkaW9FbmNvZGluZ1BjbThiaXQgPSAzLAogICAgIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgPSA0LAorICAgIGtBdWRpb0VuY29kaW5nUGNtMjRiaXRQYWNrZWQgPSAyMSwKKyAgICBrQXVkaW9FbmNvZGluZ1BjbTMyYml0ID0gMjIsCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BTWVzc2FnZV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQU1lc3NhZ2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMTMyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQU1lc3NhZ2VfdGVzdC5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQURhdGFfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgQU1lc3NhZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCisKK1RFU1QoQU1lc3NhZ2VfdGVzdHMsIGl0ZW1fbWFuaXB1bGF0aW9uKSB7CisgIHNwPEFNZXNzYWdlPiBtMSA9IG5ldyBBTWVzc2FnZSgpOworCisgIG0xLT5zZXRJbnQzMigidmFsdWUiLCAyKTsKKyAgbTEtPnNldEludDMyKCJiYXIiLCAzKTsKKworICBpbnQzMl90IGkzMjsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRJbnQzMigidmFsdWUiLCAmaTMyKSk7CisgIEVYUEVDVF9FUSgyLCBpMzIpOworCisgIEVYUEVDVF9UUlVFKG0xLT5maW5kSW50MzIoImJhciIsICZpMzIpKTsKKyAgRVhQRUNUX0VRKDMsIGkzMik7CisKKworICBtMS0+c2V0SW50NjQoImJpZyIsIElOVDY0X01BWCk7CisgIG0xLT5zZXRJbnQ2NCgic21hbGxlciIsIElOVDY0X01BWCAtIDIpOworICBtMS0+c2V0SW50NjQoInNtYWxsZXN0IiwgMjU3KTsKKworICBpbnQ2NF90IGk2NDsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRJbnQ2NCgiYmlnIiwgJmk2NCkpOworICBFWFBFQ1RfRVEoSU5UNjRfTUFYLCBpNjQpOworCisgIEVYUEVDVF9UUlVFKG0xLT5maW5kSW50NjQoInNtYWxsZXIiLCAmaTY0KSk7CisgIEVYUEVDVF9FUShJTlQ2NF9NQVggLSAyLCBpNjQpOworCisgIG0xLT5zZXRTaXplKCJzaXplMSIsIDI1Nyk7CisgIG0xLT5zZXRTaXplKCJzaXplMiIsIDEwMjMpOworCisgIHNpemVfdCBzaXppbmc7CisgIEVYUEVDVF9UUlVFKG0xLT5maW5kU2l6ZSgic2l6ZTIiLCAmc2l6aW5nKSk7CisgIEVYUEVDVF9FUSgxMDIzLCBzaXppbmcpOworICBFWFBFQ1RfVFJVRShtMS0+ZmluZFNpemUoInNpemUxIiwgJnNpemluZykpOworICBFWFBFQ1RfRVEoMjU3LCBzaXppbmcpOworCisgIG0xLT5zZXREb3VibGUoInByZWNpc2UiLCAxMC41KTsKKyAgbTEtPnNldERvdWJsZSgic21hbGwiLCAwLjEyNSk7CisKKyAgZG91YmxlIGQ7CisgIEVYUEVDVF9UUlVFKG0xLT5maW5kRG91YmxlKCJwcmVjaXNlIiwgJmQpKTsKKyAgRVhQRUNUX0VRKDEwLjUsIGQpOworCisgIEVYUEVDVF9UUlVFKG0xLT5maW5kRG91YmxlKCJzbWFsbCIsICZkKSk7CisgIEVYUEVDVF9FUSgwLjEyNSwgZCk7CisKKyAgLy8gc2hvdWxkIGJlIHVuY2hhbmdlZCBmcm9tIHRoZSB0b3Agb2YgdGhlIHRlc3QKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRJbnQzMigiYmFyIiwgJmkzMikpOworICBFWFBFQ1RfRVEoMywgaTMyKTsKKworICBFWFBFQ1RfRkFMU0UobTEtPmZpbmRJbnQzMigibm9uZXN1Y2giLCAmaTMyKSk7CisgIEVYUEVDVF9GQUxTRShtMS0+ZmluZEludDY0KCJub25lc3VjaDIiLCAmaTY0KSk7CisgIC8vIHR5cGVzIGRpc2FncmVlLCBub3QgZm91bmQKKyAgRVhQRUNUX0ZBTFNFKG0xLT5maW5kSW50MzIoImJpZyIsICZpMzIpKTsKKyAgRVhQRUNUX0ZBTFNFKG0xLT5maW5kSW50MzIoInByZWNpc2UiLCAmaTMyKSk7CisKKyAgLy8gaW50ZWdyYWwgdHlwZXMgc2hvdWxkIGNvbWUgYmFjayB0cnVlCisgIEVYUEVDVF9UUlVFKG0xLT5maW5kQXNJbnQ2NCgiYmlnIiwgJmk2NCkpOworICBFWFBFQ1RfRVEoSU5UNjRfTUFYLCBpNjQpOworICBFWFBFQ1RfVFJVRShtMS0+ZmluZEFzSW50NjQoImJhciIsICZpNjQpKTsKKyAgRVhQRUNUX0VRKDMsIGk2NCk7CisgIEVYUEVDVF9GQUxTRShtMS0+ZmluZEFzSW50NjQoInByZWNpc2UiLCAmaTY0KSk7CisKKyAgLy8gcmVjb3ZlcnMgaW50cywgc2l6ZSwgYW5kIGZsb2F0aW5nIHBvaW50IHZhbHVlcworICBmbG9hdCB2YWx1ZTsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRBc0Zsb2F0KCJ2YWx1ZSIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMiwgdmFsdWUpOworICBFWFBFQ1RfVFJVRShtMS0+ZmluZEFzRmxvYXQoInNtYWxsZXN0IiwgJnZhbHVlKSk7CisgIEVYUEVDVF9FUSgyNTcsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRBc0Zsb2F0KCJzaXplMiIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMTAyMywgdmFsdWUpOworICBFWFBFQ1RfVFJVRShtMS0+ZmluZEFzRmxvYXQoInByZWNpc2UiLCAmdmFsdWUpKTsKKyAgRVhQRUNUX0VRKDEwLjUsIHZhbHVlKTsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRBc0Zsb2F0KCJzbWFsbCIsICZ2YWx1ZSkpOworICBFWFBFQ1RfRVEoMC4xMjUsIHZhbHVlKTsKKworCisgIC8vIG5lZWQgdG8gaGFuZGxlIHN0aWxsOgorICAvLyBzdHJpbmdzCisgIC8vIE9iamVjdAorICAvLyBCdWZmZXIKKyAgLy8gTWVzc2FnZSAobmVzdGVkKQorICAvLworCisgIC8vIHJlbW92YWwKKyAgbTEtPnNldEludDMyKCJzaG9ydGxpdmVkIiwgMik7CisgIG0xLT5zZXRJbnQzMigiYWxpdHRsZWxvbmdlciIsIDIpOworICBFWFBFQ1RfRVEoT0ssIG0xLT5yZW1vdmVFbnRyeUJ5TmFtZSgic2hvcnRsaXZlZCIpKTsKKyAgRVhQRUNUX0VRKEJBRF9WQUxVRSwgbTEtPnJlbW92ZUVudHJ5QnlOYW1lKG51bGxwdHIpKTsKKyAgRVhQRUNUX0VRKEJBRF9JTkRFWCwgbTEtPnJlbW92ZUVudHJ5QnlOYW1lKCJ0aGVteXRoaWNhbG5vbmVzdWNoIikpOworICBFWFBFQ1RfRkFMU0UobTEtPmZpbmRJbnQzMigic2hvcnRsaXZlZCIsICZpMzIpKTsKKyAgRVhQRUNUX1RSVUUobTEtPmZpbmRJbnQzMigiYWxpdHRsZWxvbmdlciIsICZpMzIpKTsKKworICBFWFBFQ1RfTkUoT0ssIG0xLT5yZW1vdmVFbnRyeUJ5TmFtZSgibm90cHJlc2VudCIpKTsKKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YTdiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTg1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBVkNVdGlsc1VuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oIgorI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmgiCisKKyNpbmNsdWRlICJBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgc2l6ZV90IGtTbWFsbEJ1ZmZlclNpemUgPSAyOworY29uc3RleHByIHVpbnQ4X3Qga1NQU21hc2sgPSAweDFmOworY29uc3RleHByIHVpbnQ4X3Qga1NQU1N0YXJ0Q29kZSA9IDB4MDc7Citjb25zdGV4cHIgdWludDhfdCBrQ29uZmlnVmVyc2lvbiA9IDB4MDE7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcGVnQXVkaW9Vbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LyphdWRpb0hlYWRlciovIHVpbnQzMl90LCAvKmZyYW1lU2l6ZSovIGludDMyX3QsIC8qc2FtcGxlUmF0ZSovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtQ2hhbm5lbHMqLyBpbnQzMl90LCAvKmJpdFJhdGUqLyBpbnQzMl90LCAvKm51bVNhbXBsZXMqLyBpbnQzMl90Pj4ge307CisKK2NsYXNzIFZPTERpbWVuc2lvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qdm9sV2lkdGgqLyBpbnQzMl90LCAvKnZvbEhlaWdodCovIGludDMyX3Q+PiB7fTsKKworY2xhc3MgQVZDVXRpbHMgeworICBwdWJsaWM6CisgICAgYm9vbCBTZXRVcEFWQ1V0aWxzKHN0cmluZyBmaWxlTmFtZSwgc3RyaW5nIGluZm9GaWxlTmFtZSkgeworICAgICAgICBtSW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBmaWxlTmFtZTsKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIGlmICghbUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBtSW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGluZm9GaWxlTmFtZTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4obUluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAoIW1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIH5BVkNVdGlscygpIHsKKyAgICAgICAgaWYgKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRGaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5mb0ZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICBzdHJpbmcgbUluZm9GaWxlOworCisgICAgaWZzdHJlYW0gbUlucHV0RmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitjbGFzcyBBVkNEaW1lbnNpb25UZXN0CisgICAgOiBwdWJsaWMgQVZDVXRpbHMsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKmluZm9GaWxlTmFtZSovIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgLyphdmNXaWR0aCovIHNpemVfdCwgLyphdmNIZWlnaHQqLyBzaXplX3QsIC8qbnVtYmVyT2ZOQUxVbml0cyovIGludDMyX3Q+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc3RyaW5nLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBBVkNVdGlsczo6U2V0VXBBVkNVdGlscyhmaWxlTmFtZSwgaW5mb0ZpbGVOYW1lKTsKKworICAgICAgICBtRnJhbWVXaWR0aCA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBtRnJhbWVIZWlnaHQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICAgICAgbU5hbFVuaXRzRXhwZWN0ZWQgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUZyYW1lV2lkdGg7CisgICAgc2l6ZV90IG1GcmFtZUhlaWdodDsKKyAgICBpbnQzMl90IG1OYWxVbml0c0V4cGVjdGVkOworfTsKKworY2xhc3MgQXZjY0JveFRlc3QgOiBwdWJsaWMgQVZDRGltZW5zaW9uVGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFWQ0RpbWVuc2lvblRlc3Q6OlNldFVwKCk7IH0KK307CisKK2NsYXNzIEFWQ0ZyYW1lVGVzdAorICAgIDogcHVibGljIEFWQ1V0aWxzLAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgICAgIEFWQ1V0aWxzOjpTZXRVcEFWQ1V0aWxzKGZpbGVOYW1lLCBpbmZvRmlsZU5hbWUpOworICAgIH0KK307CisKK1RFU1RfUChNcGVnQXVkaW9Vbml0VGVzdCwgQXVkaW9Qcm9maWxlVGVzdCkgeworICAgIHR1cGxlPHVpbnQzMl90LCBzaXplX3QsIGludCwgaW50LCBpbnQsIGludD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICB1aW50MzJfdCBoZWFkZXIgPSBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHNpemVfdCBhdWRpb0ZyYW1lU2l6ZSA9IGdldDwxPihwYXJhbXMpOworICAgIGludCBhdWRpb1NhbXBsZVJhdGUgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1DaGFubmVscyA9IGdldDwzPihwYXJhbXMpOworICAgIGludCBhdWRpb0JpdFJhdGUgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1TYW1wbGVzID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKKyAgICBpbnQgc2FtcGxlUmF0ZSA9IDA7CisgICAgaW50IG51bUNoYW5uZWxzID0gMDsKKyAgICBpbnQgYml0UmF0ZSA9IDA7CisgICAgaW50IG51bVNhbXBsZXMgPSAwOworCisgICAgYm9vbCBzdGF0dXMgPSBHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU2FtcGxlcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBBdWRpbyBwcm9wZXJ0aWVzIjsKKworICAgIEFTU0VSVF9FUShmcmFtZVNpemUsIGF1ZGlvRnJhbWVTaXplKSA8PCAiV3JvbmcgZnJhbWUgc2l6ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZSwgYXVkaW9TYW1wbGVSYXRlKSA8PCAiV3Jvbmcgc2FtcGxlIHJhdGUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKG51bUNoYW5uZWxzLCBhdWRpb051bUNoYW5uZWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGZvdW5kIjsKKworICAgIEFTU0VSVF9FUShiaXRSYXRlLCBhdWRpb0JpdFJhdGUpIDw8ICJXcm9uZyBiaXQgcmF0ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEobnVtU2FtcGxlcywgYXVkaW9OdW1TYW1wbGVzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIHNhbXBsZXMgZm91bmQiOworfQorCitURVNUX1AoVk9MRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgaW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBpZnN0cmVhbSBpbnB1dEZpbGVTdHJlYW07CisgICAgaW5wdXRGaWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgIEFTU0VSVF9UUlVFKGlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbjogIiA8PCBpbnB1dEZpbGU7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFTU0VSVF9ORShmaWxlU2l6ZSwgMCkgPDwgIkludmFsaWQgZmlsZSBzaXplIGZvdW5kIjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnZvbEJ1ZmZlciA9IG5ldyB1aW50OF90W2ZpbGVTaXplXTsKKyAgICBBU1NFUlRfTkUodm9sQnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIFZPTCBidWZmZXIgb2Ygc2l6ZTogIiA8PCBmaWxlU2l6ZTsKKworICAgIGlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopKHZvbEJ1ZmZlciksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoaW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IGlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgIGludDMyX3Qgd2lkdGggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IGdldDwyPihwYXJhbXMpOworICAgIGludDMyX3Qgdm9sV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IHZvbEhlaWdodCA9IC0xOworCisgICAgYm9vbCBzdGF0dXMgPSBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIodm9sQnVmZmVyLCBmaWxlU2l6ZSwgJnZvbFdpZHRoLCAmdm9sSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBWT0wgZGltZW5zaW9ucyBmcm9tIGZ1bmN0aW9uOiBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoKSI7CisKKyAgICBBU1NFUlRfRVEodm9sV2lkdGgsIHdpZHRoKSA8PCAiRXhwZWN0ZWQgd2lkdGg6ICIgPDwgd2lkdGggPDwgIkZvdW5kOiAiIDw8IHZvbFdpZHRoOworCisgICAgQVNTRVJUX0VRKHZvbEhlaWdodCwgaGVpZ2h0KSA8PCAiRXhwZWN0ZWQgaGVpZ2h0OiAiIDw8IGhlaWdodCA8PCAiRm91bmQ6ICIgPDwgdm9sSGVpZ2h0OworCisgICAgZGVsZXRlW10gdm9sQnVmZmVyOworfQorCitURVNUX1AoQVZDRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIGludDMyX3QgbnVtTmFsVW5pdHMgPSAwOworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbUlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICBzaXplX3Qgc21hbGxCdWZmZXJTaXplID0ga1NtYWxsQnVmZmVyU2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2FuaXR5RGF0YSA9IG5ldyB1aW50OF90W3NtYWxsQnVmZmVyU2l6ZV07CisgICAgICAgIG1lbWNweSgodm9pZCAqKXNhbml0eURhdGEsICh2b2lkICopZGF0YSwgc21hbGxCdWZmZXJTaXplKTsKKworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXROZXh0TkFMVW5pdCgmc2FuaXR5RGF0YSwgJnNtYWxsQnVmZmVyU2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIC1FQUdBSU4pIDw8ICJJbnZhbGlkIHJlc3VsdCBmb3VuZCB3aGVuIHdyb25nIE5BTCB1bml0IHBhc3NlZCI7CisKKyAgICAgICAgd2hpbGUgKCFnZXROZXh0TkFMVW5pdCgmZGF0YSwgJmNodW5rTGVuZ3RoLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSkgeworICAgICAgICAgICAgbnVtTmFsVW5pdHMrKzsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gU1BTCisgICAgICAgICAgICBpZiAoKG5hbFN0YXJ0WzBdICYga1NQU21hc2spICE9IGtTUFNTdGFydENvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUobmFsU2l6ZSA+IDApIDw8ICJOQUwgdW5pdCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBzcHNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShzcHNCdWZmZXIsIG51bGxwdHIpIDw8ICJBQnVmZmVyIHJldHVybmVkIG51bGwgZm9yIHNpemU6ICIgPDwgbmFsU2l6ZTsKKworICAgICAgICAgICAgbWVtY3B5KHNwc0J1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7CisgICAgICAgICAgICBGaW5kQVZDRGltZW5zaW9ucyhzcHNCdWZmZXIsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgICAgICAgICBzcHNCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCB3aWR0aDogIiA8PCBtRnJhbWVXaWR0aCA8PCAiRm91bmQ6ICIgPDwgYXZjV2lkdGg7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIGhlaWdodDogIiA8PCBtRnJhbWVIZWlnaHQgPDwgIkZvdW5kOiAiIDw8IGF2Y0hlaWdodDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICBpZiAobU5hbFVuaXRzRXhwZWN0ZWQgPCAwKSB7CisgICAgICAgIEFTU0VSVF9HVChudW1OYWxVbml0cywgMCkgPDwgIkZhaWxlZCB0byBmaW5kIGFuIE5BTCBVbml0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OYWxVbml0c0V4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBudW1iZXIgb2YgTkFMIHVuaXRzOiAiIDw8IG1OYWxVbml0c0V4cGVjdGVkCisgICAgICAgICAgICAgICAgPDwgIiBmb3VuZDogIiA8PCBudW1OYWxVbml0czsKKyAgICB9Cit9CisKK1RFU1RfUChBdmNjQm94VGVzdCwgQXZjY0JveFZhbGlkYXRpb25UZXN0KSB7CisgICAgaW50MzJfdCBhdmNXaWR0aCA9IC0xOworICAgIGludDMyX3QgYXZjSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCBhY2Nlc3NVbml0TGVuZ3RoID0gMDsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpbnQzMl90IGxldmVsID0gLTE7CisgICAgc3RyaW5nIGxpbmU7CisgICAgc3RyaW5nIHR5cGU7CisgICAgc2l6ZV90IGNodW5rTGVuZ3RoOworICAgIHdoaWxlIChnZXRsaW5lKG1JbmZvRmlsZVN0cmVhbSwgbGluZSkpIHsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHR5cGUgPj4gY2h1bmtMZW5ndGg7CisKKyAgICAgICAgaWYgKHR5cGUuY29tcGFyZSgiU1BTIikgJiYgdHlwZS5jb21wYXJlKCJQUFMiKSkgY29udGludWU7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBhY2Nlc3NVbml0TGVuZ3RoICs9IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlmICghdHlwZS5jb21wYXJlKCJTUFMiKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OworICAgICAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWRhdGEsICh1aW50MzJfdCljaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgICAgIHdoaWxlICghZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZjaHVua0xlbmd0aCwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIFNQUworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIGtTUFNtYXNrKSA9PSBrU1BTU3RhcnRDb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgU1BTIjsKKworICAgICAgICAgICAgICAgIEFTU0VSVF9HRShuYWxTaXplLCA0KSA8PCAiU1BTIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNCI7CisKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gbmFsU3RhcnRbMV07CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBuYWxTdGFydFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqYWNjZXNzVW5pdERhdGEgPSBuZXcgdWludDhfdFthY2Nlc3NVbml0TGVuZ3RoXTsKKyAgICBBU1NFUlRfTkUoYWNjZXNzVW5pdERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1JbnB1dEZpbGVTdHJlYW0uc2Vla2coMCwgaW9zOjpiZWcpOworICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgYWNjZXNzVW5pdExlbmd0aCkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdExlbmd0aCk7CisgICAgQVNTRVJUX05FKGFjY2Vzc1VuaXQsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhbiBhbmRyb2lkIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBzcDxBQnVmZmVyPiBjc2REYXRhQnVmZmVyID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX05FKGNzZERhdGFCdWZmZXIsIG51bGxwdHIpIDw8ICJObyBkYXRhIHJldHVybmVkIGZyb20gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCkiOworCisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCkgPDwgIkV4cGVjdGVkIHdpZHRoOiAiIDw8IG1GcmFtZVdpZHRoIDw8ICJGb3VuZDogIiA8PCBhdmNXaWR0aDsKKworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBoZWlnaHQ6ICIgPDwgbUZyYW1lSGVpZ2h0IDw8ICJGb3VuZDogIiA8PCBhdmNIZWlnaHQ7CisKKyAgICB1aW50OF90ICpjc2REYXRhID0gY3NkRGF0YUJ1ZmZlci0+ZGF0YSgpOworICAgIEFTU0VSVF9FUSgqY3NkRGF0YSwga0NvbmZpZ1ZlcnNpb24pIDw8ICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiI7CisKKyAgICBBU1NFUlRfR0UoY3NkRGF0YUJ1ZmZlci0+c2l6ZSgpLCA0KSA8PCAiQ1NEIGRhdGEgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0IjsKKworICAgIEFTU0VSVF9FUSgqKGNzZERhdGEgKyAxKSwgcHJvZmlsZSkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBBVkMgcHJvZmlsZTogIiA8PCBwcm9maWxlIDw8ICIgZm91bmQ6ICIgPDwgKihjc2REYXRhICsgMSk7CisKKyAgICBBU1NFUlRfRVEoKihjc2REYXRhICsgMyksIGxldmVsKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIEFWQyBsZXZlbDogIiA8PCBsZXZlbCA8PCAiIGZvdW5kOiAiIDw8ICooY3NkRGF0YSArIDMpOworICAgIGNzZERhdGFCdWZmZXIuY2xlYXIoKTsKKyAgICBkZWxldGVbXSBhY2Nlc3NVbml0RGF0YTsKKyAgICBhY2Nlc3NVbml0LmNsZWFyKCk7Cit9CisKK1RFU1RfUChBVkNGcmFtZVRlc3QsIEZyYW1lVGVzdCkgeworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICBpbnQzMl90IGZyYW1lTGF5ZXJJRDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIHVpbnQzMl90IGxheWVySUQgPSAwOworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aCA+PiBmcmFtZUxheWVySUQ7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBjaGFyICpkYXRhID0gbmV3IGNoYXJbY2h1bmtMZW5ndGhdOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0aW9uIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgaWYgKCF0eXBlLmNvbXBhcmUoIklEUiIpKSB7CisgICAgICAgICAgICBib29sIGlzSURSID0gSXNJRFIoKHVpbnQ4X3QgKilkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0lEUik7CisKKyAgICAgICAgICAgIGxheWVySUQgPSBGaW5kQVZDTGF5ZXJJZCgodWludDhfdCAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsYXllcklELCBmcmFtZUxheWVySUQpIDw8ICJXcm9uZyBsYXllciBJRCBmb3VuZCI7CisgICAgICAgIH0gZWxzZSBpZiAoIXR5cGUuY29tcGFyZSgiUCIpIHx8ICF0eXBlLmNvbXBhcmUoIkIiKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShhY2Nlc3NVbml0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhY2Nlc3MgVW5pdCI7CisKKyAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIGJvb2wgaXNSZWZlcmVuY2VGcmFtZSA9IElzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc1JlZmVyZW5jZUZyYW1lKTsKKworICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgbGF5ZXJJRCA9IEZpbmRBVkNMYXllcklkKCh1aW50OF90ICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGxheWVySUQsIGZyYW1lTGF5ZXJJRCkgPDwgIldyb25nIGxheWVyIElEIGZvdW5kIjsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFWQ1V0aWxzVGVzdEFsbCwgTXBlZ0F1ZGlvVW5pdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgweEZGRkI5MjA0LCA0MTgsIDQ0MTAwLCAyLCAxMjgsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZCNzYwNCwgMjg5LCA0ODAwMCwgMiwgOTYsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZFNTYwNCwgMTY0LCA0ODAwMCwgMiwgMTYwLCAzODQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEFWQ1V0aWxzVGVzdEFsbCwgQVZDRGltZW5zaW9uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5pbmZvIiwgNjQwLCAzNjAsIDExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaW5mbyIsIDEyODAsIDcyMCwgMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaW5mbyIsIDE5MjAsIDEwODAsIDE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmluZm8iLCAzODQwLCAyMTYwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQVZDVXRpbHNUZXN0QWxsLCBBdmNjQm94VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iLCAxMjgwLCA3MjAsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmluZm8iLCAxOTIwLCAxMDgwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBVkNVdGlsc1Rlc3RBbGwsIFZPTERpbWVuc2lvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgidm9sRGF0YV83MjBfNDgwIiwgNzIwLCA0ODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTI4MF83MjAiLCAxMjgwLCA3MjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTkyMF8xMDgwIiwgMTkyMCwgMTA4MCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlLCBsZW5ndGggYW5kIGxheWVyIElEIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQVZDVXRpbHNUZXN0QWxsLCBBVkNGcmFtZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaW5mbyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NGRhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFWQ1V0aWxzVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQVZDVXRpbHNVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwODhhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBBVkMgVXRpbHMgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkFWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkFWQ1V0aWxzVW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJBVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdC8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDlkNzJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEFWQ1V0aWxzIFRlc3QKK1RoZSBBVkMgVXRpbGl0eSBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhdmNfdXRpbHMgbGlicmFyaXkgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24uCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEFWQ1V0aWxzVW5pdFRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQVZDVXRpbHNVbml0VGVzdC9BVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQVZDVXRpbHNVbml0VGVzdC9BVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBBVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogQVZDVXRpbHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0LworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBVkNVdGlsc1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGYyMTU3YzkuLmU1MDc0MmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxNCBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAic2ZfZm91bmRhdGlvbl90ZXN0IiwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKQEAgLTE5LDkgKzMwLDM5IEBACiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBRGF0YV90ZXN0LmNwcCIsCisgICAgICAgICJBTWVzc2FnZV90ZXN0LmNwcCIsCiAgICAgICAgICJCYXNlNjRfdGVzdC5jcHAiLAogICAgICAgICAiRmxhZ2dlZF90ZXN0LmNwcCIsCiAgICAgICAgICJUeXBlVHJhaXRzX3Rlc3QuY3BwIiwKICAgICAgICAgIlV0aWxzX3Rlc3QuY3BwIiwKICAgICBdLAogfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFCYXNlVW5pdFRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDEgPSAxOTIwOworY29uc3RleHByIGludDMyX3Qga0hlaWdodDEgPSAxMDgwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMiA9IDEyODA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MiA9IDkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDMgPSA3MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MyA9IDQ4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcm9maWxlID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtMZXZlbCA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxhdGZvcm1WYWx1ZSA9IDE7CisKKy8vIFJlY3RhbmdsZSBtYXJnaW5zCitjb25zdGV4cHIgaW50MzJfdCBrTGVmdCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtUb3AgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmlnaHQgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQm90dG9tID0gMTAwOworCitjb25zdGV4cHIgaW50NjRfdCBrRHVyYXRpb25VcyA9IDYwMDAwMDAwOworCitjb25zdGV4cHIgZmxvYXQga0NhcHR1cmVSYXRlID0gMzAuMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2VVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ3JlYXRlTWV0YURhdGFCYXNlVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgLy8gVGVzdGluZyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YUNvcHkgPSBtZXRhRGF0YTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGFDb3B5LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEgY29weSI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgU2V0QW5kRmluZERhdGFUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBTZXR0aW5nIHRoZSBkaWZmZXJlbnQga2V5LXZhbHVlIHBhaXIgdHlwZSBmb3IgZmlyc3QgdGltZSwgb3ZlcndyaXRlCisgICAgLy8gZXhwZWN0ZWQgdG8gYmUgZmFsc2UKKyAgICBib29sIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlNSU1FVHlwZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBrUHJvZmlsZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9Qcm9maWxlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwga0xldmVsKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb0xldmVsLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwga0R1cmF0aW9uVXMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUR1cmF0aW9uLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCBrQ2FwdHVyZVJhdGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNhcHR1cmVGcmFtZXJhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBjb25zdCBpbnQzMl90ICpwbGF0Zm9ybSA9ICZrUGxhdGZvcm1WYWx1ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAodm9pZCAqKXBsYXRmb3JtKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlQbGF0Zm9ybVByaXZhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGtMZWZ0LCBrVG9wLCBrUmlnaHQsIGtCb3R0b20pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNyb3BSZWN0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gRHVtcCB0byBsb2cgZm9yIHJlZmVyZW5jZQorICAgIG1ldGFEYXRhLT5kdW1wVG9Mb2coKTsKKworICAgIC8vIEZpbmQgdGhlIGRhdGEgd2hpY2ggd2FzIHNldAorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlNSU1FVHlwZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSA8PCAiSW5jb3JyZWN0IG1pbWUgdHlwZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHByb2ZpbGUsIGxldmVsOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlXaWR0aCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEod2lkdGgsIGtXaWR0aDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2Ygd2lkdGggcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5SGVpZ2h0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShoZWlnaHQsIGtIZWlnaHQxKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGhlaWdodCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9Qcm9maWxlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwcm9maWxlLCBrUHJvZmlsZSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBwcm9maWxlIHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVZpZGVvTGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxldmVsLCBrTGV2ZWwpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgbGV2ZWwgcmV0dXJuZWQiOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5RHVyYXRpb24ga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGR1cmF0aW9uLCBrRHVyYXRpb25VcykgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBkdXJhdGlvbiByZXR1cm5lZCI7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNhcHR1cmVGcmFtZXJhdGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGZyYW1lUmF0ZSwga0NhcHR1cmVSYXRlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGNhcHR1cmVGcmFtZVJhdGUgcmV0dXJuZWQiOworCisgICAgaW50MzJfdCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNyb3BSZWN0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShsZWZ0LCBrTGVmdCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZWZ0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKHRvcCwga1RvcCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB0b3AgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEocmlnaHQsIGtSaWdodCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiByaWdodCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShib3R0b20sIGtCb3R0b20pIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgYm90dG9tIG1hcmdpbiByZXR1cm5lZCI7CisKKyAgICB2b2lkICpwbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcGxhdGZvcm1WYWx1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVBsYXRmb3JtUHJpdmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEocGxhdGZvcm1WYWx1ZSwgJmtQbGF0Zm9ybVZhbHVlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHBvaW50ZXIgcmV0dXJuZWQiOworCisgICAgLy8gQ2hlY2sgZm9yIHRoZSBrZXkgd2hpY2ggaXMgbm90IGFkZGVkIHRvIG1ldGFkYXRhCisgICAgaW50MzJfdCBhbmdsZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmFuZ2xlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiVmFsdWUgZm9yIGFuIGludmFsaWQga2V5IGlzIHJldHVybmVkIHdoZW4gdGhlIGtleSBpcyBub3Qgc2V0IjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIE92ZXJXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBzZXQvc2V0L3JlYWQgdG8gY2hlY2sgZmlyc3Qgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleU1JTUVUeXBlIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gQ2hlY2sgdGhlIHZhbHVlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSA8PCAiTWltZSB2YWx1ZSBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgLy8gc2V0L3NldC9zZXQvcmVhZCB0byBjaGVjayBzZWNvbmQgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlXaWR0aCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0Mik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5SGVpZ2h0IGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZSBhZ2FpbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMykgPDwgIlZhbHVlIG9mIHdpZHRoIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDMpIDw8ICJWYWx1ZSBvZiBoZWlnaHQgaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIFJlbW92ZUtleVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGRvZXMgbm90IGhhdmUgdGhlIG1pbWUga2V5IjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBrS2V5TUlNRVR5cGUga2V5IjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgcmVtb3ZpbmcgaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFJlbW92ZSB0aGUgbm9uIGV4aXN0aW5nIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUgbm9uIGV4aXN0aW5nIGtleSI7CisKKyAgICAvLyBDaGVjayBvdmVyd3JpdGluZyB0aGUgcmVtb3ZlZCBrZXkKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBrZXkgd2FzIHJlbW92ZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgZmluZGluZyBrZXkgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWV0YURhdGEgZm91bmQga0tleVdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5V2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIHdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIG1pbWUga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENoZWNrIHJlbW92aW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+cmVtb3ZlKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIlJlbW92ZWQgdGhlIGtleSwgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhIjsKKworICAgIC8vIENoZWNraW5nIHNldCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ29udmVydFRvU3RyaW5nVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgU3RyaW5nOCBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKGluZm8ubGVuZ3RoKCksIDApIDw8ICJFbXB0eSBNZXRhRGF0YSBsZW5ndGggaXMgbm9uLXplcm86ICIgPDwgaW5mby5sZW5ndGgoKTsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0dUKGluZm8ubGVuZ3RoKCksIDApIDw8ICJNZXRhRGF0YSBjb250YWlucyBubyBpbmZvcm1hdGlvbiI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gQ2xlYXIgd2hvbGUgbWV0YWRhdGEKKyAgICBtZXRhRGF0YS0+Y2xlYXIoKTsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybyBhZnRlciBjbGVhcmluZyBpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmI0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiT3B1c0hlYWRlclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiT3B1c0hlYWRlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZTE2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIG9wdXMgaGVhZGVyIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJPcHVzSGVhZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJPcHVzSGVhZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJPcHVzSGVhZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5YzkxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9wdXNIZWFkZXJUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKKyNpbmNsdWRlICJPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC9PcHVzT3V0cHV0IgorCisvLyBPcHVzIGluIFdlYk0gaXMgYSB3ZWxsLWtub3duLCB5ZXQgdW5kZXItZG9jdW1lbnRlZCwgZm9ybWF0LiBUaGUgY29kZWMgcHJpdmF0ZSBkYXRhCisvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKy8vIGNoYW5uZWwgbWFwcGluZyBvZmZzZXQgaW4gb3B1cyBoZWFkZXIKK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSAyMTsKK2NvbnN0ZXhwciBzaXplX3Qga01heE9wdXNIZWFkZXJTaXplID0gMTAwOworLy8gQU9QVVNIRFIgKyBBT1BVU0hEUkxlbmd0aCArCisvLyAoOCArIDggKSArCisvLyBIZWFkZXIoY3NkKSArIG51bV9zdHJlYW1zICsgbnVtX2NvdXBsZWQgKyAxCisvLyAoMTkgKyAxICsgMSArIDEpICsKKy8vIEFPUFVTRExZICsgQU9QVVNETFlMZW5ndGggKyBERUxBWSArIEFPUFVTUFJMICsgQU9QVVNQUkxMZW5ndGggKyBQUkwKKy8vICg4ICsgOCArIDggKyA4ICsgOCArIDgpCisvLyA9IDg2Citjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcE9mZnNldCA9IDg2OworY29uc3RleHByIHVpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOworY29uc3RleHByIHVpbnQ2NF90IGtPcHVzU2Vla1ByZXJvbGxOcyA9IDgwMDAwMDAwOworY29uc3RleHByIGludDY0X3Qga05zZWNQZXJTZWMgPSAxMDAwMDAwMDAwbGw7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworY29uc3RleHByIHVpbnQ4X3Qga09wdXNDaGFubmVsTWFwW2tNYXhDaGFubmVsc11ba01heENoYW5uZWxzXSA9IHsKKyAgICAgICAgezB9LAorICAgICAgICB7MCwgMX0sCisgICAgICAgIHswLCAyLCAxfSwKKyAgICAgICAgezAsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1fSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDUsIDZ9LAorICAgICAgICB7MCwgNiwgMSwgMiwgMywgNCwgNSwgN30sCit9OworCitzdGF0aWMgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIE9wdXNIZWFkZXJUZXN0IHsKKyAgcHVibGljOgorICAgIE9wdXNIZWFkZXJUZXN0KCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5PcHVzSGVhZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0uaXNfb3BlbigpKSBtRWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGZyZWUobUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBPcHVzSGVhZGVyUGFyc2VUZXN0IDogcHVibGljIE9wdXNIZWFkZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyogSW5wdXRGaWxlTmFtZSAqLywgaW50MzJfdCAvKiBDaGFubmVsQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIGlzSGVhZGVyVmFsaWQgKi8sIGJvb2wgLyogaXNDb2RlY0RlbGF5VmFsaWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIGlzU2Vla1ByZVJvbGxWYWxpZCAqLywgYm9vbCAvKiBpc0lucHV0VmFsaWQgKi8+PiB7Cit9OworCitjbGFzcyBPcHVzSGVhZGVyV3JpdGVUZXN0CisgICAgOiBwdWJsaWMgT3B1c0hlYWRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLCBpbnQzMl90IC8qIHNraXBTYW1wbGVzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgLyogcmVmZXJlbmNlRmlsZSAqLz4+IHt9OworCitURVNUX1AoT3B1c0hlYWRlcldyaXRlVGVzdCwgV3JpdGVUZXN0KSB7CisgICAgdHVwbGU8aW50MzJfdCwgaW50MzJfdCwgc3RyaW5nPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIE9wdXNIZWFkZXIgd3JpdHRlbkhlYWRlcjsKKyAgICBtZW1zZXQoJndyaXR0ZW5IZWFkZXIsIDAsIHNpemVvZih3cml0dGVuSGVhZGVyKSk7CisgICAgaW50MzJfdCBjaGFubmVscyA9IGdldDwwPihwYXJhbXMpOworICAgIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICB3cml0dGVuSGVhZGVyLm51bV9zdHJlYW1zID0gY2hhbm5lbHM7CisgICAgd3JpdHRlbkhlYWRlci5jaGFubmVsX21hcHBpbmcgPSAoKGNoYW5uZWxzID4gOCkgPyAyNTUgOiAoY2hhbm5lbHMgPiAyKSk7CisgICAgaW50MzJfdCBza2lwU2FtcGxlcyA9IGdldDwxPihwYXJhbXMpOworICAgIHN0cmluZyByZWZlcmVuY2VGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDI+KHBhcmFtcyk7CisgICAgd3JpdHRlbkhlYWRlci5za2lwX3NhbXBsZXMgPSBza2lwU2FtcGxlczsKKyAgICB1aW50NjRfdCBjb2RlY0RlbGF5TnMgPSBza2lwU2FtcGxlcyAqIGtOc2VjUGVyU2VjIC8ga09wdXNTYW1wbGVSYXRlOworICAgIHVpbnQ4X3QgaGVhZGVyRGF0YVtrTWF4T3B1c0hlYWRlclNpemVdOworICAgIGludDMyX3QgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcnMod3JpdHRlbkhlYWRlciwga09wdXNTYW1wbGVSYXRlLCBoZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlckRhdGEpLCBjb2RlY0RlbGF5TnMsIGtPcHVzU2Vla1ByZXJvbGxOcyk7CisgICAgQVNTRVJUX0dUKGhlYWRlclNpemUsIDApIDw8ICJmYWlsZWQgdG8gZ2VuZXJhdGUgT3B1cyBoZWFkZXIiOworICAgIEFTU0VSVF9MRShoZWFkZXJTaXplLCBrTWF4T3B1c0hlYWRlclNpemUpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgY2FuJ3QgZXhjZWVkIGtNYXhPcHVzSGVhZGVyU2l6ZSI7CisKKyAgICBvZnN0cmVhbSBvc3RybTsKKyAgICBvc3RybS5vcGVuKE9VVFBVVF9GSUxFX05BTUUsIG9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9UUlVFKG9zdHJtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRTsKKyAgICBvc3RybS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIgKj4oaGVhZGVyRGF0YSksIGhlYWRlclNpemUpOworICAgIG9zdHJtLmNsb3NlKCk7CisKKyAgICBtRWxlU3RyZWFtLm9wZW4ocmVmZXJlbmNlRmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIHJlZmVyZW5jZUZpbGVOYW1lICIgPDwgZ2V0PDI+KHBhcmFtcyk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0U3RhdHVzID0gc3RhdChyZWZlcmVuY2VGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdFN0YXR1cywgMCkgPDwgIlVuYWJsZSB0byBnZXQgZmlsZSBwcm9wZXJ0aWVzIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeS4gTWFsbG9jIGZhaWxlZCBmb3Igc2l6ZSAiIDw8IGZpbGVTaXplOworCisgICAgbUVsZVN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGZpbGVTaXplKSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgaGVhZGVyU2l6ZSkKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBpbiBzaXplIGJldHdlZW4gaGVhZGVyIGdlbmVyYXRlZCBhbmQgcmVmZXJlbmNlIGhlYWRlciI7CisgICAgaW50MzJfdCBtYXRjaCA9IG1lbWNtcChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihoZWFkZXJEYXRhKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtYXRjaCwgMCkgPDwgIk9wdXMgaGVhZGVyIGRvZXMgbm90IG1hdGNoIHJlZmVyZW5jZSBmaWxlOiAiIDw8IHJlZmVyZW5jZUZpbGVOYW1lOworCisgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgIGJvb2wgc3RhdHVzID0gR2V0T3B1c0hlYWRlckJ1ZmZlcnMoaGVhZGVyRGF0YSwgaGVhZGVyU2l6ZSwgJm9wdXNIZWFkQnVmLCAmb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3IgaW4gR2V0T3B1c0hlYWRlckJ1ZmZlcnMiOworCisgICAgdWludDY0X3QgdmFsdWUgPSAqKCh1aW50NjRfdCAqKWNvZGVjRGVsYXlCdWYpOworICAgIEFTU0VSVF9FUSh2YWx1ZSwgY29kZWNEZWxheU5zKTsKKworICAgIHZhbHVlID0gKigodWludDY0X3QgKilzZWVrUHJlUm9sbEJ1Zik7CisgICAgQVNTRVJUX0VRKHZhbHVlLCBrT3B1c1NlZWtQcmVyb2xsTnMpOworCisgICAgT3B1c0hlYWRlciBwYXJzZWRIZWFkZXI7CisgICAgc3RhdHVzID0gUGFyc2VPcHVzSGVhZGVyKCh1aW50OF90ICopb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSwgJnBhcnNlZEhlYWRlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMsIHBhcnNlZEhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuc2tpcF9zYW1wbGVzLCBwYXJzZWRIZWFkZXIuc2tpcF9zYW1wbGVzKQorICAgICAgICAgICAgPDwgIk1pc21hdGNoIGJldHdlZW4gbm8gb2Ygc2tpcFNhbXBsZXMgd3JpdHRlbiAiCisgICAgICAgICAgICAgICAiYW5kIG5vIG9mIHNraXBTYW1wbGVzIGdvdCBhZnRlciBwYXJzaW5nIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLmNoYW5uZWxfbWFwcGluZywgcGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWxNYXBwaW5nIHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgImFuZCBjaGFubmVsTWFwcGluZyBnb3QgYWZ0ZXIgcGFyc2luZyI7CisKKyAgICBpZiAocGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBBU1NFUlRfR1QocGFyc2VkSGVhZGVyLmNoYW5uZWxzLCAyKTsKKyAgICAgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgICAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgICAgIEFTU0VSVF9FUShwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQgKyBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5jaGFubmVscyk7CisKKyAgICAgICAgQVNTRVJUX0xFKHBhcnNlZEhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE51bWJlciBvZiBjb3VwbGVkIHN0cmVhbXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgIm51bWJlciAiCisgICAgICAgICAgICAgICAgICAgIm9mIHN0cmVhbXMuIjsKKworICAgICAgICBBU1NFUlRfRVEoaGVhZGVyU2l6ZSwga09wdXNIZWFkZXJDaGFubmVsTWFwT2Zmc2V0ICsgd3JpdHRlbkhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIDg2ICsgIgorICAgICAgICAgICAgICAgICAgICJ3cml0dGVuSGVhZGVyLmNoYW5uZWxzIjsKKworICAgICAgICB1aW50OF90IG1hcHBlZENoYW5uZWxOdW1iZXI7CisgICAgICAgIGZvciAoaW50MzJfdCBjaGFubmVsTnVtYmVyID0gMDsgY2hhbm5lbE51bWJlciA8IGNoYW5uZWxzOyBjaGFubmVsTnVtYmVyKyspIHsKKyAgICAgICAgICAgIG1hcHBlZENoYW5uZWxOdW1iZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihvcHVzSGVhZEJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBjaGFubmVsTnVtYmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChtYXBwZWRDaGFubmVsTnVtYmVyLCBjaGFubmVscykgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBncmVhdGVyIHRoYW4gY2hhbm5lbCBjb3VudC4iOworCisgICAgICAgICAgICBBU1NFUlRfRVEobWFwcGVkQ2hhbm5lbE51bWJlciwga09wdXNDaGFubmVsTWFwW2NoYW5uZWxzIC0gMV1bY2hhbm5lbE51bWJlcl0pCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyBpcyBub3QgYXMgcGVyIHNwZWNpZmljYXRpb24uIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9MRShwYXJzZWRIZWFkZXIuY2hhbm5lbHMsIDIpOworICAgIH0KK30KKworVEVTVF9QKE9wdXNIZWFkZXJQYXJzZVRlc3QsIFBhcnNlVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGdldDwwPihwYXJhbXMpOworICAgIGJvb2wgaXNIZWFkZXJWYWxpZCA9IGdldDwyPihwYXJhbXMpOworICAgIGJvb2wgaXNDb2RlY0RlbGF5VmFsaWQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICBib29sIGlzU2Vla1ByZVJvbGxWYWxpZCA9IGdldDw0PihwYXJhbXMpOworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeS4gTWFsbG9jIGZhaWxlZCBmb3Igc2l6ZSAiIDw8IGZpbGVTaXplOworCisgICAgbUVsZVN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGZpbGVTaXplKSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKworICAgIE9wdXNIZWFkZXIgaGVhZGVyOworICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICBib29sIHN0YXR1cyA9IEdldE9wdXNIZWFkZXJCdWZmZXJzKG1JbnB1dEJ1ZmZlciwgZmlsZVNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgIGlmICghaXNIZWFkZXJWYWxpZCkgeworICAgICAgICBBU1NFUlRfRVEob3B1c0hlYWRCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShvcHVzSGVhZEJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghaXNDb2RlY0RlbGF5VmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKGNvZGVjRGVsYXlCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShjb2RlY0RlbGF5QnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFpc1NlZWtQcmVSb2xsVmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXNJbnB1dFZhbGlkKSA8PCAiR2V0T3B1c0hlYWRlckJ1ZmZlcnMgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IFBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZoZWFkZXIpOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBBU1NFUlRfVFJVRShpc0lucHV0VmFsaWQpIDw8ICJQYXJzZSBvcHVzIGhlYWRlciBkaWRuJ3QgZmFpbCBmb3IgaW52YWxpZCBpbnB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlzSW5wdXRWYWxpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNoYW5uZWxzID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jaGFubmVscywgY2hhbm5lbHMpIDw8ICJQYXJzZXIgcmV0dXJuZWQgaW52YWxpZCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfTEUoaGVhZGVyLmNoYW5uZWxzLCBrTWF4Q2hhbm5lbHMpOworCisgICAgQVNTRVJUX0xFKGhlYWRlci5udW1fY291cGxlZCwgaGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTnVtYmVyIG9mIGNvdXBsZWQgc3RyZWFtcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG51bWJlciAiCisgICAgICAgICAgICAgICAib2Ygc3RyZWFtcy4iOworCisgICAgQVNTRVJUX0VRKGhlYWRlci5udW1fY291cGxlZCArIGhlYWRlci5udW1fc3RyZWFtcywgaGVhZGVyLmNoYW5uZWxzKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIHVpbnQ4X3QgbWFwcGVkQ2hhbm5lbE51bWJlcjsKKyAgICAgICAgZm9yIChpbnQzMl90IGNoYW5uZWxOdW1iZXIgPSAwOyBjaGFubmVsTnVtYmVyIDwgY2hhbm5lbHM7IGNoYW5uZWxOdW1iZXIrKykgeworICAgICAgICAgICAgbWFwcGVkQ2hhbm5lbE51bWJlciA9ICoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG9wdXNIZWFkQnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGNoYW5uZWxOdW1iZXIpOworICAgICAgICAgICAgQVNTRVJUX0xUKG1hcHBlZENoYW5uZWxOdW1iZXIsIGNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIuIENoYW5uZWwgbWFwcGluZyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGNoYW5uZWwgY291bnQuIjsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1hcHBlZENoYW5uZWxOdW1iZXIsIGtPcHVzQ2hhbm5lbE1hcFtjaGFubmVscyAtIDFdW2NoYW5uZWxOdW1iZXJdKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFzIHBlciBzcGVjaWZpY2F0aW9uLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgT3B1c0hlYWRlclRlc3RBbGwsIE9wdXNIZWFkZXJXcml0ZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoMSwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzFza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsIDMxMiwgIm91dHB1dF9jaGFubmVsc18yc2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg1LCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfNXNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNiwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzZza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDEsIDAsICJvdXRwdXRfY2hhbm5lbHNfMXNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsIDAsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDUsIDAsICJvdXRwdXRfY2hhbm5lbHNfNXNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDAsICJvdXRwdXRfY2hhbm5lbHNfNnNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDEsIDYyNCwgIm91dHB1dF9jaGFubmVsc18xc2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzYyNC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNSwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc182MjQub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDYyNCwgIm91dHB1dF9jaGFubmVsc182c2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE9wdXNIZWFkZXJUZXN0QWxsLCBPcHVzSGVhZGVyUGFyc2VUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfdmFsaWRfc2l6ZTgzQi5vcHVzIiwgMiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX3ZhbGlkX3NpemU4OEIub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjVjaF92YWxpZC5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI2Y2hfdmFsaWQub3B1cyIsIDYsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMWNoX3ZhbGlkLm9wdXMiLCAxLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF92YWxpZC5vcHVzIiwgMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9zaXplLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfc3RyZWFtcy5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjVjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nLm9wdXMiLCA1LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfaW52YWxpZF9jb3VwbGVkc3RyZWFtcy5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNmNoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmcub3B1cyIsIDYsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjljaF9pbnZhbGlkX2NoYW5uZWxzLm9wdXMiLCA5LCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVyLm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVybGVuZ3RoXzE2Lm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVybGVuZ3RoXzI1Ni5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX3NpemUub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9jaGFubmVsbWFwcGluZ18wLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfY291cGxlZHN0cmVhbXMub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJsZW5ndGgub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMS5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUyLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTMub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9ub2RlbGF5Lm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfbm9wcmVyb2xsLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HRCgiT3B1cyBIZWFkZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTYzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19PUFVTX0hFQURFUl9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGM4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBPcHVzIEhlYWRlcgorVGhlIE9wdXNIZWFkZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIE9QVVMgaGVhZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gT3B1c0hlYWRlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvT3B1c0hlYWRlclRlc3QvT3B1c0hlYWRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9PcHVzSGVhZGVyVGVzdC9PcHVzSGVhZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBPcHVzSGVhZGVyIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogT3B1c0hlYWRlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXIvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IE9wdXNIZWFkZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwCmluZGV4IDFlMjA0OWQuLmQ1MzgzZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBlbnVtIElBIDogaW50MzJfdCB7IH07CiB9OwogCi0vLyA9PT09PT09PT09PSBiYXNpYyBzYW5pdHkgdGVzdHMgZm9yIHR5cGUtc3VwcG9ydCB0ZW1wbGF0ZXMKKy8vID09PT09PT09PT09IGJhc2ljIHRlc3RzIGZvciB0eXBlLXN1cHBvcnQgdGVtcGxhdGVzCiBURVNUX0YoVHlwZVRyYWl0c1Rlc3QsIFN0YXRpY1Rlc3RzKSB7CiAKICAgICAvLyA9PT09PT09PT09PT0gaXNfaW50ZWdyYWxfb3JfZW51bQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL2NvbG9ydXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVhMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkNvbG9yVXRpbHNUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNvbG9yVXRpbHNUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9jb2xvcnV0aWxzX25kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDJiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvY29sb3J1dGlscy9Db2xvclV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw3NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvbG9yVXRpbHNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworY29uc3Qgc2l6ZV90IGtIRFJCdWZmZXJTaXplID0gMjU7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTEgPSA0MjA7Citjb25zdCB1aW50MTZfdCBrSERSSW5mb1Rlc3RWYWx1ZTIgPSA0MjA2OTsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3R5cGVkZWYgQ29sb3JBc3BlY3RzIENBOworCitjbGFzcyBDb2xvclJhbmdlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08LyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2U+IHsKKyAgcHVibGljOgorICAgIENvbG9yUmFuZ2VUZXN0KCkgeyBtUmFuZ2UgPSBHZXRQYXJhbSgpOyB9OworCisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKK307CisKK2NsYXNzIENvbG9yVHJhbnNmZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2Zlcj4geworICBwdWJsaWM6CisgICAgQ29sb3JUcmFuc2ZlclRlc3QoKSB7IG1UcmFuc2ZlciA9IEdldFBhcmFtKCk7IH07CisKKyAgICBDQTo6VHJhbnNmZXIgbVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JTdGFuZGFyZFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcz4+IHsKKyAgcHVibGljOgorICAgIENvbG9yU3RhbmRhcmRUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhbmRhcmQgKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVHJhbnNmZXIgKi8gaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtVHJhbnNmZXIgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbU1hdHJpeENvZWZmcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1TdGFuZGFyZCA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtUGxhdGZvcm1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgaW50MzJfdCBtUGxhdGZvcm1TdGFuZGFyZDsKKyAgICBpbnQzMl90IG1QbGF0Zm9ybVRyYW5zZmVyOworfTsKKworY2xhc3MgQ29sb3JBc3BlY3RzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JUcmFuc2ZlciAqLyBDQTo6VHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JTdGFuZGFyZCAqLyBDQTo6U3RhbmRhcmQ+PiB7CisgIHB1YmxpYzoKKyAgICBDb2xvckFzcGVjdHNUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDM+KEdldFBhcmFtKCkpOworICAgICAgICBtU3RhbmRhcmQgPSBzdGQ6OmdldDw0PihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlN0YW5kYXJkIG1TdGFuZGFyZDsKK307CisKK2NsYXNzIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdpZHRoICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGVpZ2h0ICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4Q29lZmZzICovIENBOjpNYXRyaXhDb2VmZnM+PiB7CisgIHB1YmxpYzoKKyAgICBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCgpIHsKKyAgICAgICAgbVdpZHRoID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1IZWlnaHQgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVByaW1hcmllcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworfTsKKworY2xhc3MgRGF0YVNwYWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp0dXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yUmFuZ2UgKi8gQ0E6OlJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdjBfYW5kcm9pZF9kYXRhc3BhY2UgKi8gYW5kcm9pZF9kYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmRyb2lkX2RhdGFzcGFjZSAqLyBhbmRyb2lkX2RhdGFzcGFjZT4+IHsKKyAgcHVibGljOgorICAgIERhdGFTcGFjZVRlc3QoKSB7CisgICAgICAgIG1SYW5nZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1EYXRhU3BhY2VWMCA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgICAgICBtRGF0YVNwYWNlID0gc3RkOjpnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIENBOjpSYW5nZSBtUmFuZ2U7CisgICAgQ0E6OlByaW1hcmllcyBtUHJpbWFyaWVzOworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyBtTWF0cml4Q29lZmZzOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2VWMDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtRGF0YVNwYWNlOworfTsKKworVEVTVF9QKENvbG9yUmFuZ2VUZXN0LCBXcmFwQ29sb3JSYW5nZVRlc3QpIHsKKyAgICBpbnQzMl90IHJhbmdlID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKG1SYW5nZSk7CisgICAgQ0E6OlJhbmdlIHVud3JhcHBlZFJhbmdlOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKHJhbmdlLCAmdW53cmFwcGVkUmFuZ2UpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBDb2xvckFzcGVjdHMgZnJvbSBDb2xvclJhbmdlIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZFJhbmdlLCBtUmFuZ2UpIDw8ICJSZXR1cm5lZCBDb2xvclJhbmdlIGRvZXNuJ3QgbWF0Y2giOworICAgIEFMT0dWKCJ0b1N0cmluZyB0ZXN0OiBSYW5nZTogJXMiLCBhc1N0cmluZyhtUmFuZ2UsICJkZWZhdWx0IikpOworfQorCitURVNUX1AoQ29sb3JUcmFuc2ZlclRlc3QsIFdyYXBDb2xvclRyYW5zZmVyVGVzdCkgeworICAgIGludDMyX3QgdHJhbnNmZXIgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yVHJhbnNmZXIobVRyYW5zZmVyKTsKKyAgICBDQTo6VHJhbnNmZXIgdW53cmFwcGVkVHJhbnNmZXI7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIodHJhbnNmZXIsICZ1bndyYXBwZWRUcmFuc2Zlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIENvbG9yQXNwZWN0cyBmcm9tIENvbG9yVHJhbnNmZXIgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkVHJhbnNmZXIsIG1UcmFuc2ZlcikgPDwgIlJldHVybmVkIENvbG9yVHJhbnNmZXIgZG9lc24ndCBtYXRjaCI7CisgICAgQUxPR1YoInRvU3RyaW5nIHRlc3Q6IFRyYW5zZmVyOiAlcyIsIGFzU3RyaW5nKG1UcmFuc2ZlciwgImRlZmF1bHQiKSk7Cit9CisKK1RFU1RfUChDb2xvclN0YW5kYXJkVGVzdCwgV3JhcENvbG9yU3RhbmRhcmRUZXN0KSB7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChtUHJpbWFyaWVzLCBtTWF0cml4Q29lZmZzKTsKKyAgICBDQTo6UHJpbWFyaWVzIHVud3JhcHBlZFByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIHVud3JhcHBlZE1hdHJpeENvZWZmczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChzdGFuZGFyZCwgJnVud3JhcHBlZFByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW53cmFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgQ29sb3JBc3BlY3RzIGZyb20gQ29sb3JTdGFuZGFyZCBmYWlsZWQiOworICAgIEVYUEVDVF9FUSh1bndyYXBwZWRQcmltYXJpZXMsIG1QcmltYXJpZXMpIDw8ICJSZXR1cm5lZCBwcmltYXJpZXMgZG9lc24ndCBtYXRjaCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZE1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykgPDwgIlJldHVybmVkICBtYXRyaXhDb2VmZnMgZG9lc24ndCBtYXRjaCI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBQbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhhc3BlY3RzLCAmcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBDb2xvckFzcGVjdHMgdG8gUGxhdGZvcm1Bc3BlY3RzIGZhaWxlZCI7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydFBsYXRmb3JtQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocmFuZ2UsIHN0YW5kYXJkLCB0cmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZEFzcGVjdHMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiQ29udmVyc2lvbiBvZiBQbGF0Zm9ybUFzcGVjdHMgdG8gQ29sb3JBc3BlY3RzIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKQorICAgICAgICAgICAgPDwgInJhbmdlIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIGFzcGVjdHMubVByaW1hcmllcykKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKK30KKworVEVTVF9QKENvbG9yQXNwZWN0c1Rlc3QsIElzb0FzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IHByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgY29sb3JUcmFuc2ZlciA9IC0xOworICAgIGludDMyX3QgbWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoYXNwZWN0cywgJnByaW1hcmllcywgJmNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworCisgICAgQ0EgcmV0dXJuZWRBc3BlY3RzOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhwcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsIG1hdHJpeENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFJhbmdlLCByZXR1cm5lZEFzcGVjdHMpOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVJhbmdlLCBhc3BlY3RzLm1SYW5nZSkKKyAgICAgICAgICAgIDw8ICJyYW5nZSBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikKKyAgICAgICAgICAgIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgYXNwZWN0cy5tTWF0cml4Q29lZmZzKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIElzb0FzcGVjdHMiOworfQorCitURVNUX1AoSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0LCBJc29Bc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBpbnQzMl90IGlzb1ByaW1hcmllcyA9IC0xOworICAgIGludDMyX3QgaXNvVHJhbnNmZXIgPSAtMTsKKyAgICBpbnQzMl90IGlzb01hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbHJhbmdlID0gZmFsc2U7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKGFzcGVjdHMsICZpc29QcmltYXJpZXMsICZpc29UcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzb01hdHJpeENvZWZmcywgJmZ1bGxyYW5nZSk7CisKKyAgICBpbnQzMl90IHJhbmdlID0gLTE7CisgICAgaW50MzJfdCBzdGFuZGFyZCA9IC0xOworICAgIGludDMyX3QgdHJhbnNmZXIgPSAtMTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscmFuZ2UsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIGlmIChmdWxscmFuZ2UpIHsKKyAgICAgICAgRVhQRUNUX0VRKHJhbmdlLCBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpCisgICAgICAgICAgICAgICAgPDwgInJhbmdlIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgfQorICAgIEVYUEVDVF9FUShzdGFuZGFyZCwgbVBsYXRmb3JtU3RhbmRhcmQpIDw8ICJzdGFuZGFyZCBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUSh0cmFuc2ZlciwgbVBsYXRmb3JtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBpbmNvcnJlY3QgY29udmVydGluZyB0byBQbGF0Zm9ybUFzcGVjdHMiOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgUGFja0NvbG9yQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKyAgICB1aW50MzJfdCBwYWNrZWRDb2xvckFzcGVjdHMgPSBDb2xvclV0aWxzOjpwYWNrVG9VMzIoYXNwZWN0cyk7CisKKyAgICBDQSB1bnBhY2tlZEFzcGVjdHMgPSBDb2xvclV0aWxzOjp1bnBhY2tUb0NvbG9yQXNwZWN0cyhwYWNrZWRDb2xvckFzcGVjdHMpOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVJhbmdlLCBtUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubVRyYW5zZmVyLCBtVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEVYUEVDVF9FUSh1bnBhY2tlZEFzcGVjdHMubU1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2ggYWZ0ZXIgdW5wYWNraW5nIjsKKyAgICBBTE9HVigidG9TdHJpbmcgdGVzdDogU3RhbmRhcmQ6ICVzIiwgYXNTdHJpbmcobVN0YW5kYXJkLCAiZGVmYXVsdCIpKTsKK30KKworVEVTVF9QKERlZmF1bHRDb2xvckFzcGVjdHNUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisKKyAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1SYW5nZSwgQ0E6OlJhbmdlTGltaXRlZCkgPDwgInJhbmdlIG5vdCBzZXQgdG8gZGVmYXVsdCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVByaW1hcmllcywgbVByaW1hcmllcykgPDwgInByaW1hcmllcyBub3Qgc2V0IHRvIGRlZmF1bHQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1NYXRyaXhDb2VmZnMsIG1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbm90IHNldCB0byBkZWZhdWx0IjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tVHJhbnNmZXIsIENBOjpUcmFuc2ZlclNNUFRFMTcwTSkgPDwgInRyYW5zZmVyIG5vdCBzZXQgdG8gZGVmYXVsdCI7Cit9CisKK1RFU1RfUChEYXRhU3BhY2VUZXN0LCBEYXRhU3BhY2VUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgZmFsc2UpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIG1EYXRhU3BhY2UpIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgZGF0YXNwYWNlIjsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydERhdGFTcGFjZVRvVjAoZGF0YVNwYWNlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJSZXR1cm5lZCB2MCBkYXRhc3BhY2UgaXMgbm90IGFzcGVjdC1vbmx5IjsKKyAgICBFWFBFQ1RfRVEoZGF0YVNwYWNlLCBtRGF0YVNwYWNlVjApIDw8ICJSZXR1cm5lZCBpbmNvcnJlY3QgdjAgZGF0YXNwYWNlIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEFzcGVjdHNDaGFuZ2VkVGVzdCkgeworICAgIENBIG9yaWdBc3BlY3RzOworICAgIG9yaWdBc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworICAgIG9yaWdBc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81OworICAgIG9yaWdBc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzU7CisKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNTsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNTsKKworICAgIGJvb2wgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlVW5zcGVjaWZpZWQpIDw8ICJyYW5nZSBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZTo6UmFuZ2VGdWxsOworCisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQjsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzLCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME07CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cywgdHJ1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJwcmltYXJpZXMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JDb25maWdGcm9tRm9ybWF0VGVzdCkgeworICAgIGludCByYW5nZSA9IC0xOworICAgIGludCBzdGFuZGFyZCA9IC0xOworICAgIGludCB0cmFuc2ZlciA9IC0xOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlIHwgc3RhbmRhcmQgfCB0cmFuc2ZlciwgMCkgPDwgImNvbG9yIGNvbmZpZyBkaWRuJ3QgZGVmYXVsdCB0byAwIjsKKworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1JBTkdFLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpOworICAgIENvbG9yVXRpbHM6OmdldENvbG9yQ29uZmlnRnJvbUZvcm1hdChmb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgc3A8QU1lc3NhZ2U+IGNvcHlGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoY29weUZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworICAgIENvbG9yVXRpbHM6OmNvcHlDb2xvckNvbmZpZyhmb3JtYXQsIGNvcHlGb3JtYXQpOworICAgIGJvb2wgc3RhdHVzID0gY29weUZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9SQU5HRSwgJnJhbmdlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckNvbmZpZyByYW5nZSBlbnRyeSBtaXNzaW5nIjsKKyAgICBzdGF0dXMgPSBjb3B5Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQ29uZmlnIHN0YW5kYXJkIGVudHJ5IG1pc3NpbmciOworICAgIHN0YXR1cyA9IGNvcHlGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsICZ0cmFuc2Zlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JDb25maWcgdHJhbnNmZXIgZW50cnkgbWlzc2luZyI7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaGQiOworCisgICAgcmFuZ2UgPSBzdGFuZGFyZCA9IHRyYW5zZmVyID0gLTE7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGNvcHlGb3JtYXQsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpIDw8ICJzdGFuZGFyZCBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKSA8PCAidHJhbnNmZXIgbWlzbWF0Y2giOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgRm9ybWF0VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKyAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIGZvcm1hdCwgdHJ1ZSk7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworCisgICAgYXNwZWN0cy5tUmFuZ2UgPSBtUmFuZ2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gbVByaW1hcmllczsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IG1UcmFuc2ZlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBtTWF0cml4Q29lZmZzOworICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgZm9ybWF0KTsKKworICAgIG1lbXNldCgmcmV0dXJuZWRBc3BlY3RzLCAwLCBzaXplb2YocmV0dXJuZWRBc3BlY3RzKSk7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChmb3JtYXQsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgYXNwZWN0cy5tVHJhbnNmZXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2giOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgSERSU3RhdGljSW5mb1Rlc3QpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworCisgICAgSERSU3RhdGljSW5mbyByZXR1cm5lZEluZm9IRFI7CisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJIRFIgaW5mbyBzaG91bGQgYmUgYWJzZW50IGluIGVtcHR5IGZvcm1hdCI7CisKKyAgICBIRFJTdGF0aWNJbmZvIGluZm9IRFI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1SLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVIueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tRy54ID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1HLnkgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubUIueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tQi55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1XLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVcueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdChpbmZvSERSLCBmb3JtYXQpOworCisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmcmV0dXJuZWRJbmZvSERSKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IEhEUiBpbmZvIGZyb20gZm9ybWF0IjsKKyAgICBBU1NFUlRfRVEoMCwgbWVtY21wKCZyZXR1cm5lZEluZm9IRFIsICZpbmZvSERSLCBzaXplb2YoaW5mb0hEUikpKSA8PCAiIEhEUlN0YXRpY0luZm8gbWlzbWF0Y2giOworCisgICAgQU1lZGlhRm9ybWF0ICptZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUobWVkaWFGb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIEFNZWRpYUZvcm1hdCI7CisgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mb0hEUiwgbWVkaWFGb3JtYXQpOworICAgIG1lbXNldCgmcmV0dXJuZWRJbmZvSERSLCAwLCBzaXplb2YocmV0dXJuZWRJbmZvSERSKSk7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQobWVkaWFGb3JtYXQtPm1Gb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWVkaWFGb3JtYXQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgSERSIGluZm8gZnJvbSBtZWRpYSBmb3JtYXQiOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoJnJldHVybmVkSW5mb0hEUiwgJmluZm9IRFIsIHNpemVvZihpbmZvSERSKSkpIDw8ICIgSERSU3RhdGljSW5mbyBtaXNtYXRjaCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBTYW5pdHlUZXN0KSB7CisgICAgQ0E6OlByaW1hcmllcyB1bm1hcHBlZFByaW1hcmllcyA9IChDQTo6UHJpbWFyaWVzKShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNPdGhlciArIDEpOworICAgIENBOjpNYXRyaXhDb2VmZnMgdW5tYXBwZWRNYXRyaXhDb2VmZnMgPSAoQ0E6Ok1hdHJpeENvZWZmcykoQ0E6Ok1hdHJpeE90aGVyICsgMSk7CisgICAgaW50MzJfdCBjb2xvclN0YW5kYXJkID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZCh1bm1hcHBlZFByaW1hcmllcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCB1bnNwZWNpZmllZCBleHBlY3RlZCI7CisgICAgY29sb3JTdGFuZGFyZCA9CisgICAgICAgICAgICBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc090aGVyLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0VRKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiU3RhbmRhcmQgdW5zcGVjaWZpZWQgZXhwZWN0ZWQiOworICAgIGNvbG9yU3RhbmRhcmQgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeEJUMjAyMCk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworICAgIHVubWFwcGVkUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCArIDEpOworICAgIHVubWFwcGVkTWF0cml4Q29lZmZzID0gKENBOjpNYXRyaXhDb2VmZnMpKENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCArIDEpOworICAgIGNvbG9yU3RhbmRhcmQgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHVubWFwcGVkUHJpbWFyaWVzLCB1bm1hcHBlZE1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0dFKGNvbG9yU3RhbmRhcmQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRXh0ZW5kZWRTdGFydCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCBncmVhdGVyIHRoYW4gZXh0ZW5kZWQgc3RhcnQgZXhwZWN0ZWQiOworCisgICAgQ0EgYXNwZWN0czsKKyAgICBpbnQzMl90IGNvbG9yUmFuZ2UgPSAtMTsKKyAgICBjb2xvclN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc090aGVyICsgMSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICBhc3BlY3RzLCAmY29sb3JSYW5nZSwgJmNvbG9yU3RhbmRhcmQsICZjb2xvclRyYW5zZmVyKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgImludmFsaWQgY29sb3JBc3BlY3RzIHZhbHVlIGFjY2VwdGVkIjsKKworICAgIGludDMyX3QgY29sb3JQcmltYXJpZXMgPSAtMTsKKyAgICBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgaW50MzJfdCBjb2xvck1hdHJpeENvZWZmcyA9IC0xOworICAgIGJvb2wgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc090aGVyOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeE90aGVyOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhhc3BlY3RzLCAmY29sb3JQcmltYXJpZXMsICZjb2xvclRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JNYXRyaXhDb2VmZnMsICZmdWxsUmFuZ2UpOworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICAvLyBpbnZhbGlkIHZhbHVlcywgb3RoZXIgdmFsdWUgZXF1YWxzIDB4RkYKKyAgICBjb2xvclByaW1hcmllcyA9IENBOjpQcmltYXJpZXNPdGhlcjsKKyAgICBjb2xvclRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyT3RoZXI7CisgICAgY29sb3JNYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4T3RoZXI7CisgICAgZnVsbFJhbmdlID0gZmFsc2U7CisgICAgbWVtc2V0KCZyZXR1cm5lZEFzcGVjdHMsIDAsIHNpemVvZihyZXR1cm5lZEFzcGVjdHMpKTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoY29sb3JQcmltYXJpZXMsIGNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWF0cml4Q29lZmZzLCBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgUHJpbWFyaWVzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgVHJhbnNmZXIiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubU1hdHJpeENvZWZmcywgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIE1hdHJpeENvZWZmcyI7CisKKyAgICBDQTo6UHJpbWFyaWVzIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZChDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJpZXMsICZtYXRyaXhDb2VmZnMpOworICAgIEVYUEVDVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBhc3BlY3RzIGZyb20gY29sb3Igc3RhbmRhcmQgZmFpbGVkIjsKKworICAgIHByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBtYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yU3RhbmRhcmQoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFZlbmRvclN0YXJ0ICogNCwgJnByaW1hcmllcywgJm1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIGFzcGVjdHMgZnJvbSBjb2xvciBzdGFuZGFyZCBmYWlsZWQiOworCisgICAgY29sb3JSYW5nZSA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZSgoQ0E6OlJhbmdlKShDQTo6UmFuZ2VPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JSYW5nZSwgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VVbnNwZWNpZmllZCkgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIGNvbG9yIHJhbmdlIjsKKworICAgIENBOjpSYW5nZSByYW5nZTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JSYW5nZSgKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEsICZyYW5nZSk7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJpbnZhbGlkIHJhbmdlIHZhbHVlIGFjY2VwdGVkIjsKKyAgICBFWFBFQ1RfRVEocmFuZ2UsIENBOjpSYW5nZU90aGVyKSA8PCAicmV0dXJuZWQgdW5leHBlY3RlZCByYW5nZSB2YWx1ZSI7CisKKyAgICBjb2xvclRyYW5zZmVyID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcigoQ0E6OlRyYW5zZmVyKShDQTo6VHJhbnNmZXJPdGhlciArIDEpKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JUcmFuc2ZlciwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBjb2xvciB0cmFuc2ZlciI7CisKKyAgICBDQTo6VHJhbnNmZXIgdHJhbnNmZXI7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoCisgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclZlbmRvclN0YXJ0ICsgQ0E6OlRyYW5zZmVyT3RoZXIgKyAxLCAmdHJhbnNmZXIpOworICAgIEVYUEVDVF9ORShzdGF0dXMsIE9LKSA8PCAiaW52YWxpZCB0cmFuc2ZlciB2YWx1ZSBhY2NlcHRlZCI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBDQTo6VHJhbnNmZXJPdGhlcikgPDwgImV4cGVjdGVkIG90aGVyIGNvbG9yIHRyYW5zZmVyIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIEhEUkluZm9TYW5pdHlUZXN0KSB7CisgICAgSERSU3RhdGljSW5mbyBoZHJJbmZvOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisKKyAgICBib29sIGJvb2xTdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZoZHJJbmZvKTsKKyAgICBFWFBFQ1RfRkFMU0UoYm9vbFN0YXR1cykgPDwgIkhEUlN0YXRpY0luZm8gc2hvdWxkIG5vdCBiZSBwcmVzZW50IjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRTaXplSERSSW5mb0J1ZmZlciA9IG5ldyBBQnVmZmVyKGtIRFJCdWZmZXJTaXplIC0gMSk7CisgICAgQVNTRVJUX05FKGludmFsaWRTaXplSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgZm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIHNwPEFCdWZmZXI+IGludmFsaWRIRFJJbmZvQnVmZmVyID0gbmV3IEFCdWZmZXIoa0hEUkJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9ORShpbnZhbGlkSERSSW5mb0J1ZmZlciwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQUJ1ZmZlciI7CisgICAgdWludDhfdCAqZGF0YSA9IGludmFsaWRIRFJJbmZvQnVmZmVyLT5kYXRhKCk7CisgICAgKmRhdGEgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTEgKyAxOworICAgIGZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGludmFsaWRIRFJJbmZvQnVmZmVyKTsKKyAgICBtZW1zZXQoJmhkckluZm8sIDAsIHNpemVvZihoZHJJbmZvKSk7CisgICAgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiaW5jb3JyZWN0IEhEUlN0YXRpY0luZm8gYnVmZmVyIGFjY2VwdGVkIjsKKworICAgIENBIGFzcGVjdHM7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlVmVuZG9yU3RhcnQgKyBDQTo6UmFuZ2VPdGhlciArIDEpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ3MDkpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX1RSQU5TRkVSLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyKTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgYXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2VPdGhlcikgPDwgInVuZXhwZWN0ZWQgcmFuZ2UiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgRGF0YVNwYWNlU2FuaXR5VGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2VVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUpOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIDApIDw8ICJleHBlY3RlZCBpbnZhbGlkIGRhdGFzcGFjZSI7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhCVDIwMjBDb25zdGFudDsKKyAgICBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSk7CisgICAgRVhQRUNUX05FKGRhdGFTcGFjZSwgMCkgPDwgInVuZXhwZWN0ZWQgdmFsdWUiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclJhbmdlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VVbnNwZWNpZmllZCwgQ0E6OlJhbmdlOjpSYW5nZU90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yVHJhbnNmZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JUcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyR2FtbWEyMiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMjQwTSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlclh2WUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckJUMTM2MSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNUNDI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2Zlck90aGVyKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvclN0YW5kYXJkVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjApLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0dlbmVyaWNGaWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yQXNwZWN0c1Rlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBDb2xvclJhbmdlLCBDb2xvclN0YW5kYXJkCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhTTVBURTI0ME0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ0NzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1QyMDg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVySExHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDQ3MF82TSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNHZW5lcmljRmlsbSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNjAxXzYyNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIElzb1RvUGxhdGZvcm1Bc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCBTdGFuZGFyZCwgVHJhbnNmZXIKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkLCBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNzA5XzUsIENBOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ3MDksIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyTGluZWFyKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXJTUkdCLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyU1JHQiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzYyNSwgQ0E6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV82MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTTVBURV8xNzBNKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6VHJhbnNmZXJHYW1tYTIyLCBDQTo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyR2FtbWEyMiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyR2FtbWEyOCwgQ0E6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjVfVW5hZGp1c3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTI4KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6OlRyYW5zZmVyU1QyMDg0LCBDQTo6TWF0cml4QlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMCwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTVDIwODQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXJITEcsIENBOjpNYXRyaXhCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDIwMjBDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJITEcpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ0NzBfNk0sIENBOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDQTo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ0NzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0dlbmVyaWNGaWxtLCBDQTo6VHJhbnNmZXJMaW5lYXIsIENBOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkRmlsbSwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJMaW5lYXIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQ29sb3JVdGlsc1VuaXRUZXN0LCBEZWZhdWx0Q29sb3JBc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gV2lkdGgsIEhlaWdodCwgUHJpbWFyaWVzLCBNYXRyaXhDb2VmZnMKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoMzg0MCwgMzg0MCwgQ0E6OlByaW1hcmllc0JUMjAyMCwgQ0E6Ok1hdHJpeEJUMjAyMCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKDcyMCwgNTc2LCBDQTo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpNYXRyaXhCVDYwMV82KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoNDgwLCAzNjAsIENBOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSg0ODAsIDE5MjAsIENBOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6TWF0cml4QlQ3MDlfNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIERhdGFTcGFjZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIC8vIENvbG9yUmFuZ2UsIFByaW1hcmllcywgQ29sb3JUcmFuc2ZlciwgTWF0cml4Q29lZmZzLCB2MF9hbmRyb2lkX2RhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAvLyBhbmRyb2lkX2RhdGFzcGFjZQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNSR0IsIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfU1JHQiwgSEFMX0RBVEFTUEFDRV9TUkdCKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9TUkdCX0xJTkVBUiwgSEFMX0RBVEFTUEFDRV9TUkdCX0xJTkVBUiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlRnVsbCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiwgSEFMX0RBVEFTUEFDRV9KRklGKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNDcwXzZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV82MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNjI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ3MDksIEhBTF9EQVRBU1BBQ0VfQlQ3MDkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwQ29uc3RhbnQsIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX0JUNjAxXzUyNSkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAppbmRleCA4NjU1Y2FmLi5mNGQ2ZDk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9odHRwX3N1cHBvcnQiLAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCAxMmU3Y2E2Li4wYjBhY2JmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9odHRwbGl2ZSIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggZGIzN2ZlOS4uM2Y1YmE0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2lkM19saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9pZDNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKQEAgLTUsNyArMjQsOSBAQAogICAgIHNyY3M6IFsiSUQzLmNwcCJdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCkBAIC0xOSw2ICs0MCwxMiBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvVEVTVF9NQVBQSU5HCmluZGV4IGU0NDU0YzEuLmQ4MmQyNmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL1RFU1RfTUFQUElORwpAQCAtMSw5ICsxLDEzIEBACiAvLyBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMwogewotICAicHJlc3VibWl0IjogWwotICAgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKLSAgICAvL3sgIm5hbWUiOiAiSUQzVGVzdCIgfSwKKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJJRDNUZXN0IiB9CisgIF0sCiAKKyAgInByZXN1Ym1pdC1sYXJnZSI6IFsKICAgICAvLyB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBydW4gYW55IHRlc3RzLgogICAgIC8vIGJ1dDogY3RzLXRyYWRlZmVkIHJ1biAtbSBDdHNNZWRpYVRlc3RDYXNlcyAtdCBhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhUmV0cmlldmVyVGVzdAogICAgIC8vIGRvZXMgcnVuIGhlIDMyIGFuZCA2NCBiaXQgdGVzdHMsIGJ1dCBub3QgdGhlIGluc3RhbnQgdGVzdHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwCmluZGV4IDlkMjZlZWMuLjUyY2RmYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZC5icApAQCAtMTQsOCArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2lkM19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfaWQzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJJRDNUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKICAgICBndGVzdDogdHJ1ZSwKIAogICAgIHNyY3M6IFsiSUQzVGVzdC5jcHAiXSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0ZyYW1lRGVjb2Rlci5oCmluZGV4IDE5YWUwZTMuLmQ1OWU0ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvRnJhbWVEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9GcmFtZURlY29kZXIuaApAQCAtMTM1LDcgKzEzNSw4IEBACiBwcml2YXRlOgogICAgIHNwPEZyYW1lQ2FwdHVyZUxheWVyPiBtQ2FwdHVyZUxheWVyOwogICAgIFZpZGVvRnJhbWUgKm1GcmFtZTsKLSAgICBib29sIG1Jc0F2Y09ySGV2YzsKKyAgICBib29sIG1Jc0F2YzsKKyAgICBib29sIG1Jc0hldmM7CiAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtU2Vla01vZGU7CiAgICAgaW50NjRfdCBtVGFyZ2V0VGltZVVzOwogICAgIExpc3Q8aW50NjRfdD4gbVNhbXBsZUR1cmF0aW9uczsKQEAgLTE0NSw4ICsxNDYsOCBAQAogICAgIHN0YXR1c190IGNhcHR1cmVTdXJmYWNlKCk7CiB9OwogCi1zdHJ1Y3QgSW1hZ2VEZWNvZGVyIDogcHVibGljIEZyYW1lRGVjb2RlciB7Ci0gICAgSW1hZ2VEZWNvZGVyKAorc3RydWN0IE1lZGlhSW1hZ2VEZWNvZGVyIDogcHVibGljIEZyYW1lRGVjb2RlciB7CisgICBNZWRpYUltYWdlRGVjb2RlcigKICAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJnRyYWNrTWV0YSwKICAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hldmNVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IZXZjVXRpbHMuaAppbmRleCAwZjU5NjMxLi42YTRhMTY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hldmNVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSGV2Y1V0aWxzLmgKQEAgLTMwLDYgKzMwLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0geworICAgIGtIZXZjTmFsVW5pdFR5cGVDb2RlZFNsaWNlSWRyID0gMTksCisgICAga0hldmNOYWxVbml0VHlwZUNvZGVkU2xpY2VJZHJOb0xQID0gMjAsCisgICAga0hldmNOYWxVbml0VHlwZUNvZGVkU2xpY2VDcmEgPSAyMSwKKwogICAgIGtIZXZjTmFsVW5pdFR5cGVWcHMgPSAzMiwKICAgICBrSGV2Y05hbFVuaXRUeXBlU3BzID0gMzMsCiAgICAga0hldmNOYWxVbml0VHlwZVBwcyA9IDM0LApAQCAtOTAsOCArOTQsMTEgQEAKICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBub3Qgd3JpdGUgdGhlIHN0YXJ0IGNvZGUuCiAgICAgYm9vbCB3cml0ZShzaXplX3QgaW5kZXgsIHVpbnQ4X3QqIGRlc3QsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBtYWtlSHZjYyh1aW50OF90ICpodmNjLCBzaXplX3QgKmh2Y2NTaXplLCBzaXplX3QgbmFsU2l6ZUxlbmd0aCk7CisgICAgdm9pZCBGaW5kSEVWQ0RpbWVuc2lvbnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmU3BzQnVmZmVyLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKIAogICAgIEluZm8gZ2V0SW5mbygpIGNvbnN0IHsgcmV0dXJuIG1JbmZvOyB9CisgICAgc3RhdGljIGJvb2wgSXNIZXZjSURSKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBwYXJzZVZwcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAppbmRleCA4M2U5MmI5Li5jODRjYzEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4yL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIApAQCAtNTQsNiArNTUsNyBAQAogc3RydWN0IERlc2NyaWJlQ29sb3JGb3JtYXQyUGFyYW1zOwogc3RydWN0IERhdGFDb252ZXJ0ZXI7CiAKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8yOjpCdWZmZXJVc2FnZTsKIHR5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7CiB0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCkBAIC0xNDcsNiArMTQ5LDcgQEAKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKICAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKKyAgICAgICAga1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyID0gJ3NieG8nLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTE2NCw3ICsxNjcsOCBAQAogICAgIGVudW0gewogICAgICAgICBrVmlkZW9HcmFsbG9jVXNhZ2UgPSAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KEJ1ZmZlclVzYWdlOjpWSURFT19ERUNPREVSKSwKICAgICB9OwogCiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewpAQCAtMjcyLDYgKzI3Niw4IEBACiAgICAgYm9vbCBtU2h1dGRvd25JblByb2dyZXNzOwogICAgIGJvb2wgbUV4cGxpY2l0U2h1dGRvd247CiAgICAgYm9vbCBtSXNMZWdhY3lWUDlEZWNvZGVyOworICAgIGJvb2wgbUlzU3RyZWFtQ29ycnVwdEZyZWU7CisgICAgYm9vbCBtSXNMb3dMYXRlbmN5OwogCiAgICAgLy8gSWYgIm1LZWVwQ29tcG9uZW50QWxsb2NhdGVkIiB3ZSBvbmx5IHRyYW5zaXRpb24gYmFjayB0byBMb2FkZWQgc3RhdGUKICAgICAvLyBhbmQgZG8gbm90IHJlbGVhc2UgdGhlIGNvbXBvbmVudCBpbnN0YW5jZS4KQEAgLTQ5OSw2ICs1MDUsNyBAQAogICAgIHN0YXR1c190IHNldHVwQU1SQ29kZWMoYm9vbCBlbmNvZGVyLCBib29sIGlzV0FNUiwgaW50MzJfdCBiaXRSYXRlKTsKICAgICBzdGF0dXNfdCBzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cE9wdXNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAgICAgc3RhdHVzX3Qgc2V0dXBGbGFjQ29kZWMoCiAgICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAogICAgICAgICAgICAgQXVkaW9FbmNvZGluZyBlbmNvZGluZyk7CkBAIC01MTEsNiArNTE4LDcgQEAKICAgICBzdGF0dXNfdCBzZXRMb3dMYXRlbmN5KGludDMyX3QgbG93TGF0ZW5jeSk7CiAgICAgc3RhdHVzX3Qgc2V0TGF0ZW5jeSh1aW50MzJfdCBsYXRlbmN5KTsKICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKyAgICBzdGF0dXNfdCBzZXRUdW5uZWxQZWVrKGludDMyX3QgdHVubmVsUGVlayk7CiAgICAgc3RhdHVzX3Qgc2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpOwogICAgIHN0YXR1c190IHNldE9wZXJhdGluZ1JhdGUoZmxvYXQgcmF0ZUZsb2F0LCBib29sIGlzVmlkZW8pOwogICAgIHN0YXR1c190IGdldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCAqaW50cmFSZWZyZXNoUGVyaW9kKTsKQEAgLTU3MSw2ICs1NzksOCBAQAogICAgIHZvaWQgbm90aWZ5T2ZSZW5kZXJlZEZyYW1lcygKICAgICAgICAgICAgIGJvb2wgZHJvcEluY29tcGxldGUgPSBmYWxzZSwgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICp1bnRpbCA9IE5VTEwpOwogCisgICAgdm9pZCBvbkZpcnN0VHVubmVsRnJhbWVSZWFkeSgpOworCiAgICAgLy8gUGFzcyB8ZXhwZWN0ZWRGb3JtYXR8IHRvIHByaW50IGEgd2FybmluZyBpZiB0aGUgZm9ybWF0IGRpZmZlcnMgZnJvbSBpdC4KICAgICAvLyBVc2luZyBzcDw+IGluc3RlYWQgb2YgY29uc3Qgc3A8PiYgYmVjYXVzZSBleHBlY3RlZEZvcm1hdCBpcyBsaWtlbHkgdGhlIGN1cnJlbnQgbU91dHB1dEZvcm1hdAogICAgIC8vIHdoaWNoIHdpbGwgZ2V0IHVwZGF0ZWQgaW5zaWRlLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDQ1MWFhNTcuLjQzZDUwZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTMxLDIyICszMSwzNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIGNsYXNzIEF1ZGlvUmVjb3JkOwogCiBzdHJ1Y3QgQXVkaW9Tb3VyY2UgOiBwdWJsaWMgTWVkaWFTb3VyY2UsIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKICAgICAvLyBOb3RlIHRoYXQgdGhlICJjaGFubmVscyIgcGFyYW1ldGVyIF9pc18gdGhlIG51bWJlciBvZiBjaGFubmVscywKICAgICAvLyBfbm90XyBhIGJpdG1hc2sgb2YgYXVkaW9fY2hhbm5lbHNfdCBjb25zdGFudHMuCiAgICAgQXVkaW9Tb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgIHVpbnQzMl90IG91dFNhbXBsZVJhdGUgPSAwLAotICAgICAgICAgICAgdWlkX3QgdWlkID0gLTEsCi0gICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCi0gICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKLSAgICAgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxzLAorICAgICAgICB1aW50MzJfdCBvdXRTYW1wbGVSYXRlID0gMCwKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CisKKyAgICAvLyBMZWdhY3kgY29uc3RydWN0b3Iga2VwdCBmb3IgdmVuZG9yIGRlcGVuZGVuY2llcworICAgIEF1ZGlvU291cmNlKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSA9IDAsCisgICAgICAgIHVpZF90IHVpZCA9IC0xLAorICAgICAgICBwaWRfdCBwaWQgPSAtMSwKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtMTMxLDYgKzE0NCwxNiBAQAogCiAgICAgQXVkaW9Tb3VyY2UoY29uc3QgQXVkaW9Tb3VyY2UgJik7CiAgICAgQXVkaW9Tb3VyY2UgJm9wZXJhdG9yPShjb25zdCBBdWRpb1NvdXJjZSAmKTsKKworICAgIHZvaWQgc2V0KAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVscywKKyAgICAgICAgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSA9IDAsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9OT1JNQUwpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCmluZGV4IDZmMGQzYjUuLmU4NzcwZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaApAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CkBAIC00MCwxNyArMzksNiBAQAogY2xhc3MgQ2FtZXJhU291cmNlIDogcHVibGljIE1lZGlhU291cmNlLCBwdWJsaWMgTWVkaWFCdWZmZXJPYnNlcnZlciB7CiBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IENhbWVyYVNvdXJjZSB1c2luZyB0aGUgY3VycmVudAotICAgICAqIHNldHRpbmdzIChzdWNoIGFzIHZpZGVvIHNpemUsIGZyYW1lIHJhdGUsIGNvbG9yIGZvcm1hdCwgZXRjKQotICAgICAqIGZyb20gdGhlIGRlZmF1bHQgY2FtZXJhLgotICAgICAqCi0gICAgICogQHBhcmFtIGNsaWVudE5hbWUgVGhlIHBhY2thZ2UvcHJvY2VzcyBuYW1lIG9mIHRoZSBjbGllbnQgYXBwbGljYXRpb24uCi0gICAgICogICAgVGhpcyBpcyB1c2VkIGZvciBwZXJtaXNzaW9ucyBjaGVja2luZy4KLSAgICAgKiBAcmV0dXJuIE5VTEwgb24gZXJyb3IuCi0gICAgICovCi0gICAgc3RhdGljIENhbWVyYVNvdXJjZSAqQ3JlYXRlKGNvbnN0IFN0cmluZzE2ICZjbGllbnROYW1lKTsKLQotICAgIC8qKgogICAgICAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBDYW1lcmFTb3VyY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY2FtZXJhIHRoZSB2aWRlbyBpbnB1dCBmcmFtZSBkYXRhIHNvdXJjZS4gSWYgaXQgaXMgTlVMTCwKQEAgLTg5LDggKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzID0gdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2UoKTsKIApAQCAtMTMyLDI2ICsxMTksNiBAQAogcHJvdGVjdGVkOgogCiAgICAgLyoqCi0gICAgICogVGhlIGNsYXNzIGZvciBsaXN0ZW5pbmcgdG8gQm5DYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLiBUaGlzIGlzIHVzZWQgdG8gcmVjZWl2ZSB2aWRlbwotICAgICAqIGJ1ZmZlcnMgaW4gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVYgYW5kIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEKLSAgICAgKiBtb2RlLiBXaGVuIGEgZnJhbWUgaXMgYXZhaWxhYmxlLCBDYW1lcmFTb3VyY2U6OmRhdGFDYWxsYmFja1RpbWVzdGFtcCgpIHdpbGwgYmUgY2FsbGVkLgotICAgICAqLwotICAgIGNsYXNzIFByb3h5TGlzdGVuZXI6IHB1YmxpYyBCbkNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgUHJveHlMaXN0ZW5lcihjb25zdCBzcDxDYW1lcmFTb3VyY2U+JiBzb3VyY2UpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsCi0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiB0aW1lc3RhbXBzVXMsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3A8Q2FtZXJhU291cmNlPiBtU291cmNlOwotICAgIH07Ci0KLSAgICAvKioKICAgICAgKiBUaGUgY2xhc3MgZm9yIGxpc3RlbmluZyB0byBCdWZmZXJRdWV1ZSdzIG9uRnJhbWVBdmFpbGFibGUuIFRoaXMgaXMgdXNlZCB0byByZWNlaXZlIHZpZGVvCiAgICAgICogYnVmZmVycyBpbiBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgbW9kZS4gV2hlbiBhIGZyYW1lIGlzIGF2YWlsYWJsZSwKICAgICAgKiBDYW1lcmFTb3VyY2U6OnByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lKCkgd2lsbCBiZSBjYWxsZWQuCkBAIC0xOTIsNiArMTU5LDcgQEAKICAgICBpbnQzMl90ICBtQ29sb3JGb3JtYXQ7CiAgICAgaW50MzJfdCAgbUVuY29kZXJGb3JtYXQ7CiAgICAgaW50MzJfdCAgbUVuY29kZXJEYXRhU3BhY2U7CisgICAgaW50MzJfdCAgbUJ1ZmZlckRhdGFTcGFjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgc3A8Q2FtZXJhPiAgIG1DYW1lcmE7CkBAIC0yMTMsMzIgKzE4MSwxNSBAQAogICAgIENhbWVyYVNvdXJjZShjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnROYW1lLCB1aWRfdCBjbGllbnRVaWQsIHBpZF90IGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgU2l6ZSB2aWRlb1NpemUsIGludDMyX3QgZnJhbWVSYXRlLAotICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMpOworICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0Q2FtZXJhUmVjb3JkaW5nKCk7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgZnJhbWUpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotICAgIC8vIHN0YWdlZnJpZ2h0IHJlY29yZGVyIG5vdCB1c2luZyB0aGlzIGZvciBub3cKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBmcmFtZS4KICAgICAvLyBDYWxsZWQgZnJvbSBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAuCiAgICAgdmlydHVhbCBib29sIHNraXBDdXJyZW50RnJhbWUoaW50NjRfdCAvKnRpbWVzdGFtcFVzKi8pIHtyZXR1cm4gZmFsc2U7fQogCi0gICAgLy8gQ2FsbGJhY2sgY2FsbGVkIHdoZW4gc3RpbGwgY2FtZXJhIHJhdyBkYXRhIGlzIGF2YWlsYWJsZS4KLSAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrKGludDMyX3QgLyptc2dUeXBlKi8sIGNvbnN0IHNwPElNZW1vcnk+JiAvKmRhdGEqLykge30KLQotICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGEpOwotCi0gICAgdmlydHVhbCB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKTsKLQotICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgdGltZXN0YW1wc1VzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCiAgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBpdGVtIHJlY2VpdmVkIGluIEJ1ZmZlclF1ZXVlTGlzdGVuZXIuCiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NCdWZmZXJRdWV1ZUZyYW1lKEJ1ZmZlckl0ZW0mIGJ1ZmZlcik7CiAKQEAgLTI2MSw5ICsyMTIsNiBAQAogICAgIGludDY0X3QgbUdsaXRjaER1cmF0aW9uVGhyZXNob2xkVXM7CiAgICAgYm9vbCBtQ29sbGVjdFN0YXRzOwogCi0gICAgLy8gVGhlIG1vZGUgdmlkZW8gYnVmZmVycyBhcmUgcmVjZWl2ZWQgZnJvbSBjYW1lcmEuIE9uZSBvZiBWSURFT19CVUZGRVJfTU9ERV8qLgotICAgIGludDMyX3QgbVZpZGVvQnVmZmVyTW9kZTsKLQogICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGVmYXVsdFZpZGVvQnVmZmVyQ291bnQgPSAzMjsKIAogICAgIC8qKgpAQCAtMjk3LDEyICsyNDUsMTIgQEAKIAogICAgIHN0YXR1c190IGluaXQoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5LAogICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwgY29uc3QgU3RyaW5nMTYmIGNsaWVudE5hbWUsIHVpZF90IGNsaWVudFVpZCwgcGlkX3QgY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgU2l6ZSB2aWRlb1NpemUsIGludDMyX3QgZnJhbWVSYXRlLCBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUpOwogCiAgICAgc3RhdHVzX3QgaW5pdFdpdGhDYW1lcmFBY2Nlc3MoCiAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYT4mIGNhbWVyYSwgY29uc3Qgc3A8SUNhbWVyYVJlY29yZGluZ1Byb3h5PiYgcHJveHksCiAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgdWlkX3QgY2xpZW50VWlkLCBwaWRfdCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwgaW50MzJfdCBmcmFtZVJhdGUsIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgIFNpemUgdmlkZW9TaXplLCBpbnQzMl90IGZyYW1lUmF0ZSk7CiAKICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXIgcXVldWUgdXNlZCBpbiBWSURFT19CVUZGRVJfTU9ERV9CVUZGRVJfUVVFVUUgbW9kZS4KICAgICBzdGF0dXNfdCBpbml0QnVmZmVyUXVldWUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmgKaW5kZXggNTMzZTMzYi4uM2MzMTFjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5oCkBAIC00NSw4ICs0NSw3IEBACiAgICAgICAgIFNpemUgdmlkZW9TaXplLAogICAgICAgICBpbnQzMl90IHZpZGVvRnJhbWVSYXRlLAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAotICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyA9IHRydWUpOworICAgICAgICBpbnQ2NF90IHRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhU291cmNlVGltZUxhcHNlKCk7CiAKQEAgLTEyMiw4ICsxMjEsNyBAQAogICAgICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICAgICAgaW50MzJfdCB2aWRlb0ZyYW1lUmF0ZSwKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgIGludDY0X3QgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcywKLSAgICAgICAgYm9vbCBzdG9yZU1ldGFEYXRhSW5WaWRlb0J1ZmZlcnMgPSB0cnVlKTsKKyAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKIAogICAgIC8vIFdyYXBwZXIgb3ZlciBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkgdG8gaW1wbGVtZW50IHF1aWNrIHN0b3AuCiAgICAgLy8gSXQgb25seSBoYW5kbGVzIHRoZSBjYXNlIHdoZW4gbUxhc3RSZWFkQnVmZmVyQ29weSBpcyBzaWduYWxsZWQuIE90aGVyd2lzZQpAQCAtMTM3LDMzICsxMzUsNiBAQAogICAgIC8vIGZyYW1lIG5lZWRzIHRvIGJlIHNraXBwZWQgYW5kIHRoaXMgZnVuY3Rpb24ganVzdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiBtU2tpcEN1cnJlbnRGcmFtZS4KICAgICB2aXJ0dWFsIGJvb2wgc2tpcEN1cnJlbnRGcmFtZShpbnQ2NF90IHRpbWVzdGFtcFVzKTsKIAotICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKLSAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KLSAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKCkKLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfWVVWIGFuZAotICAgIC8vIFZJREVPX0JVRkZFUl9NT0RFX0RBVEFfQ0FMTEJBQ0tfTUVUQURBVEEgbW9kZS4KLSAgICB2aXJ0dWFsIHZvaWQgZGF0YUNhbGxiYWNrVGltZXN0YW1wKGludDY0X3QgdGltZXN0YW1wVXMsIGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhKTsKLQotICAgIC8vIEluIHRoZSB2aWRlbyBjYW1lcmEgY2FzZSBjYWxscyBza2lwRnJhbWVBbmRNb2RpZnlUaW1lU3RhbXAoKSB0byBtb2RpZnkKLSAgICAvLyB0aW1lc3RhbXAgYW5kIHNldCBtU2tpcEN1cnJlbnRGcmFtZS4KLSAgICAvLyBUaGVuIGl0IGNhbGxzIHRoZSBiYXNlIENhbWVyYVNvdXJjZTo6cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCgpIG9yCi0gICAgLy8gQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goKQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgaW4gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19NRVRBREFUQSBtb2RlIHdoZW4KLSAgICAvLyB0aGUgbWV0YWRhdGEgaXMgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YS4KLSAgICB2aXJ0dWFsIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcFVzLAotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpOwotCi0gICAgLy8gSW4gdGhlIHZpZGVvIGNhbWVyYSBjYXNlIGNhbGxzIHNraXBGcmFtZUFuZE1vZGlmeVRpbWVTdGFtcCgpIHRvIG1vZGlmeQotICAgIC8vIHRpbWVzdGFtcCBhbmQgc2V0IG1Ta2lwQ3VycmVudEZyYW1lLgotICAgIC8vIFRoZW4gaXQgY2FsbHMgdGhlIGJhc2UgQ2FtZXJhU291cmNlOjpyZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wKCkgb3IKLSAgICAvLyBDYW1lcmFTb3VyY2U6OnJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgpCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBWSURFT19CVUZGRVJfTU9ERV9EQVRBX0NBTExCQUNLX01FVEFEQVRBIG1vZGUgd2hlbgotICAgIC8vIHRoZSBtZXRhZGF0YSBpcyBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhLgotICAgIHZpcnR1YWwgdm9pZCByZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2goCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgdGltZXN0YW1wc1VzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4mIGhhbmRsZXMpOwotCiAgICAgLy8gUHJvY2VzcyBhIGJ1ZmZlciBpdGVtIHJlY2VpdmVkIGluIENhbWVyYVNvdXJjZTo6QnVmZmVyUXVldWVMaXN0ZW5lci4KICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIGluIFZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSBtb2RlLgogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQnVmZmVyUXVldWVGcmFtZShCdWZmZXJJdGVtJiBidWZmZXIpOwpAQCAtMTg3LDkgKzE1OCw2IEBACiAgICAgLy8gV3JhcHBlciB0byBlbnRlciB0aHJlYWRUaW1lTGFwc2VFbnRyeSgpCiAgICAgc3RhdGljIHZvaWQgKlRocmVhZFRpbWVMYXBzZVdyYXBwZXIodm9pZCAqbWUpOwogCi0gICAgLy8gQ3JlYXRlcyBhIGNvcHkgb2Ygc291cmNlX2RhdGEgaW50byBhIG5ldyBtZW1vcnkgb2YgZmluYWwgdHlwZSBNZW1vcnlCYXNlLgotICAgIHNwPElNZW1vcnk+IGNyZWF0ZUlNZW1vcnlDb3B5KGNvbnN0IHNwPElNZW1vcnk+ICZzb3VyY2VfZGF0YSk7Ci0KICAgICBDYW1lcmFTb3VyY2VUaW1lTGFwc2UoY29uc3QgQ2FtZXJhU291cmNlVGltZUxhcHNlICYpOwogICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmb3BlcmF0b3I9KGNvbnN0IENhbWVyYVNvdXJjZVRpbWVMYXBzZSAmKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCBkZDZkZjkwLi40ODcyMWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTYxLDYgKzYxLDExIEBACiAKIHVzaW5nIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6SURlc2NyYW1ibGVyOwogCitzdHJ1Y3QgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7Cit9OworCiBzdHJ1Y3QgQ29kZWNCYXNlIDogcHVibGljIEFIYW5kbGVyLCAvKiBzdGF0aWMgKi8gQ29sb3JVdGlscyB7CiAgICAgLyoqCiAgICAgICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBldmVudHMgZmlyaW5nIGZyb20gQ29kZWNCYXNlIGJhY2sgdG8gTWVkaWFDb2RlYy4KQEAgLTE3Myw2ICsxNzgsMTAgQEAKICAgICAgICAgICogTm90aWZ5IE1lZGlhQ29kZWMgdGhhdCBvdXRwdXQgYnVmZmVycyBhcmUgY2hhbmdlZC4KICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgPSAwOworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5IE1lZGlhQ29kZWMgdGhhdCB0aGUgZmlyc3QgdHVubmVsIGZyYW1lIGlzIHJlYWR5LgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5KCkgPSAwOwogICAgIH07CiAKICAgICAvKioKQEAgLTIzMyw2ICsyNDIsNTQgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgPSAwOwogCisgICAgLyoqCisgICAgICogUXVlcnkgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSB0aGlzIGluc3RhbmNlLCBhbmQgZmlsbCB8bmFtZXN8IHdpdGggdGhlCisgICAgICogbmFtZXMgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZXMgc3RyaW5nIHZlY3RvciB0byBmaWxsIHdpdGggc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsOworICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHxuYW1lc3wgaXMgbnVsbDsKKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGFscmVhZHkgcmVsZWFzZWQ7CisgICAgICogICAgICAgICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAqbmFtZXMpOworICAgIC8qKgorICAgICAqIEZpbGwgfGRlc2N8IHdpdGggZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlciB3aXRoIHxuYW1lfC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBkZXNjcmliZQorICAgICAqIFxwYXJhbSBkZXNjIHBvaW50ZXIgdG8gQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yIHRvIGJlIGZpbGxlZAorICAgICAqIFxyZXR1cm4gT0sgaWYgc3VjY2Vzc2Z1bDsKKyAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB8ZGVzY3wgaXMgbnVsbDsKKyAgICAgKiAgICAgICAgIE5BTUVfTk9UX0ZPVU5EIGlmIHxuYW1lfCBpcyBub3QgcmVjb2duaXplZCBieSB0aGUgY29tcG9uZW50OworICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgYWxyZWFkeSByZWxlYXNlZDsKKyAgICAgKiAgICAgICAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXNjcmliZVBhcmFtZXRlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yICpkZXNjKTsKKyAgICAvKioKKyAgICAgKiBTdWJzY3JpYmUgdG8gcGFyYW1ldGVycyBpbiB8bmFtZXN8IGFuZCBnZXQgb3V0cHV0IGZvcm1hdCBjaGFuZ2UgZXZlbnQKKyAgICAgKiB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIFVucmVjb2duaXplZCAvIGFscmVhZHkgc3Vic2NyaWJlZCBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWVzIG5hbWVzIG9mIHBhcmFtZXRlcnMgdG8gc3Vic2NyaWJlCisgICAgICogXHJldHVybiBPSyBpZiBzdWNjZXNzZnVsOworICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgYWxyZWFkeSByZWxlYXNlZDsKKyAgICAgKiAgICAgICAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJzY3JpYmVUb1BhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcyk7CisgICAgLyoqCisgICAgICogVW5zdWJzY3JpYmUgZnJvbSBwYXJhbWV0ZXJzIGluIHxuYW1lc3wgYW5kIG5vIGxvbmdlciBnZXQKKyAgICAgKiBvdXRwdXQgZm9ybWF0IGNoYW5nZSBldmVudCB3aGVuIHRoZXkgY2hhbmdlLgorICAgICAqIFVucmVjb2duaXplZCAvIGFscmVhZHkgdW5zdWJzY3JpYmVkIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZXMgbmFtZXMgb2YgcGFyYW1ldGVycyB0byB1bnN1YnNjcmliZQorICAgICAqIFxyZXR1cm4gT0sgaWYgc3VjY2Vzc2Z1bDsKKyAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGFscmVhZHkgcmVsZWFzZWQ7CisgICAgICogICAgICAgICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5zdWJzY3JpYmVGcm9tUGFyYW1ldGVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJm5hbWVzKTsKKwogICAgIHR5cGVkZWYgQ29kZWNCYXNlICooKkNyZWF0ZUNvZGVjRnVuYykodm9pZCk7CiAgICAgdHlwZWRlZiBQZXJzaXN0ZW50U3VyZmFjZSAqKCpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jKSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IDUwMWNmMmMuLjdjM2VjYTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogICAgIC8vIFJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlcmUgaXMgbm8gc291cmNlIG9yIHRyYWNrLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKICAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtOTcsNiArOTcsNyBAQAogICAgIHNwPE1ldGFEYXRhPiBtU3RhcnRNZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSXNSZWFsVGltZVJlY29yZGluZzsKKyAgICBib29sIG1Jc0JhY2tncm91bmRNb2RlOwogICAgIGJvb2wgbVVzZTRCeXRlTmFsTGVuZ3RoOwogICAgIGJvb2wgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQ7CiAgICAgYm9vbCBtUGF1c2VkOwpAQCAtMTA2LDYgKzEwNyw3IEBACiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIG9mZjY0X3QgbVByZUFsbG9jYXRlRmlsZUVuZE9mZnNldDsgIC8vRW5kIG9mIGZpbGUgb2Zmc2V0IGR1cmluZyBwcmVhbGxvY2F0aW9uLgogICAgIG9mZjY0X3QgbU1kYXRPZmZzZXQ7CisgICAgb2ZmNjRfdCBtTWF4T2Zmc2V0QXBwZW5kOyAvLyBGaWxlIG9mZnNldCB3cml0dGVuIHVwdG8gd2hpbGUgYXBwZW5kaW5nLgogICAgIG9mZjY0X3QgbU1kYXRFbmRPZmZzZXQ7ICAvLyBFbmQgb2Zmc2V0IG9mIG1kYXQgYXRvbS4KICAgICB1aW50OF90ICptSW5NZW1vcnlDYWNoZTsKICAgICBvZmY2NF90IG1Jbk1lbW9yeUNhY2hlT2Zmc2V0OwpAQCAtMTI2LDYgKzEyOCw3IEBACiAgICAgYm9vbCBtV3JpdGVTZWVrRXJyOwogICAgIGJvb2wgbUZhbGxvY2F0ZUVycjsKICAgICBib29sIG1QcmVBbGxvY2F0aW9uRW5hYmxlZDsKKyAgICBzdGF0dXNfdCBtUmVzZXRTdGF0dXM7CiAgICAgLy8gUXVldWUgdG8gaG9sZCB0b3AgbG9uZyB3cml0ZSBkdXJhdGlvbnMKICAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMsIHN0ZDo6dmVjdG9yPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+LAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpncmVhdGVyPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+PiBtV3JpdGVEdXJhdGlvblBROwpAQCAtMTM1LDcgKzEzOCw5IEBACiAgICAgc3A8QUhhbmRsZXJSZWZsZWN0b3I8TVBFRzRXcml0ZXI+ID4gbVJlZmxlY3RvcjsKIAogICAgIE11dGV4IG1Mb2NrOworICAgIC8vIFNlcmlhbGl6ZSByZXNldCBjYWxscyBmcm9tIGNsaWVudCBvZiBNUEVHNFdyaXRlciBhbmQgTVA0V3RyQ3RybEhscExvb3Blci4KICAgICBzdGQ6Om11dGV4IG1SZXNldE11dGV4OworICAgIC8vIFNlcmlhbGl6ZSBwcmVhbGxvY2F0aW9uIGNhbGxzIGZyb20gZGlmZmVyZW50IHRyYWNrIHRocmVhZHMuCiAgICAgc3RkOjptdXRleCBtRmFsbG9jTXV0ZXg7CiAgICAgYm9vbCBtUHJlQWxsb2NGaXJzdFRpbWU7IC8vIFByZS1hbGxvY2F0ZSBzcGFjZSBmb3IgZmlsZSBhbmQgdHJhY2sgaGVhZGVycyBvbmx5IG9uY2UgcGVyIGZpbGUuCiAgICAgdWludDY0X3QgbVByZXZBbGxUcmFja3NUb3RhbE1ldGFEYXRhU2l6ZUVzdGltYXRlOwpAQCAtMjcxLDYgKzI3NiwxMCBAQAogICAgIC8vIEJ5IGRlZmF1bHQsIHJlYWwgdGltZSByZWNvcmRpbmcgaXMgb24uCiAgICAgYm9vbCBpc1JlYWxUaW1lUmVjb3JkaW5nKCkgY29uc3Q7CiAKKyAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgd3JpdGVyIGlzIHVzZWQgaW4gYmFja2dyb3VuZCBtb2RlIGZvciBtZWRpYQorICAgIC8vIHRyYW5zY29kaW5nLgorICAgIGJvb2wgaXNCYWNrZ3JvdW5kTW9kZSgpIGNvbnN0OworCiAgICAgdm9pZCBsb2NrKCk7CiAgICAgdm9pZCB1bmxvY2soKTsKIApAQCAtMzA0LDcgKzMxMyw3IEBACiAgICAgdm9pZCB3cml0ZUdlb0RhdGFCb3goKTsKICAgICB2b2lkIHdyaXRlTGF0aXR1ZGUoaW50IGRlZ3JlZXgxMDAwMCk7CiAgICAgdm9pZCB3cml0ZUxvbmdpdHVkZShpbnQgZGVncmVleDEwMDAwKTsKLSAgICB2b2lkIGZpbmlzaEN1cnJlbnRTZXNzaW9uKCk7CisgICAgc3RhdHVzX3QgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKIAogICAgIHZvaWQgYWRkRGV2aWNlTWV0YSgpOwogICAgIHZvaWQgd3JpdGVIZGxyKGNvbnN0IGNoYXIgKmhhbmRsZXJUeXBlKTsKQEAgLTMzNyw3ICszNDYsNyBAQAogICAgIHZvaWQgc2VuZFNlc3Npb25TdW1tYXJ5KCk7CiAgICAgc3RhdHVzX3QgcmVsZWFzZSgpOwogICAgIHN0YXR1c190IHN3aXRjaEZkKCk7Ci0gICAgc3RhdHVzX3QgcmVzZXQoYm9vbCBzdG9wU291cmNlID0gdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzZXQoYm9vbCBzdG9wU291cmNlID0gdHJ1ZSwgYm9vbCB3YWl0Rm9yQW55UHJldmlvdXNDYWxsVG9Db21wbGV0ZSA9IHRydWUpOwogCiAgICAgc3RhdGljIHVpbnQzMl90IGdldE1wZWc0VGltZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaAppbmRleCAxNzdhOWU5Li5jN2Q3NzY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmgKQEAgLTU4LDYgKzU4LDcgQEAKIAogcHJpdmF0ZToKICAgICBNdXRleCBtQWRhcHRlckxvY2s7CisgICAgc3RkOjptdXRleCBtQnVmZmVyR2F0aW5nTXV0ZXg7CiAgICAgLy8gTWFrZSBzdXJlIHRoZSByZWFkKCkgd2FpdCBmb3IgdGhlIGluY29taW5nIGJ1ZmZlci4KICAgICBDb25kaXRpb24gbUJ1ZmZlclJlYWRDb25kOwogICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHVzaEJ1ZmZlcigpIHdhaXQgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciBjb25zdW1lZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFwcGVuZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmNmYxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBcHBlbmRlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX0FQUEVOREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9BUFBFTkRFUl9ICisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPHN0YWNrPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUFwcGVuZGVyIDogcHVibGljIE1lZGlhTXV4ZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBlbnVtIEFwcGVuZE1vZGUgeworICAgICAgICBBUFBFTkRfTU9ERV9GSVJTVCA9IDAsCisgICAgICAgIEFQUEVORF9NT0RFX0lHTk9SRV9MQVNUX1ZJREVPX0dPUCA9IEFQUEVORF9NT0RFX0ZJUlNULAorICAgICAgICBBUFBFTkRfTU9ERV9BRERfVE9fRVhJU1RJTkdfREFUQSA9IDEsCisgICAgICAgIEFQUEVORF9NT0RFX0xBU1QgPSBBUFBFTkRfTU9ERV9BRERfVE9fRVhJU1RJTkdfREFUQSwKKyAgICB9OworCisgICAgc3RhdGljIHNwPE1lZGlhQXBwZW5kZXI+IGNyZWF0ZShpbnQgZmQsIEFwcGVuZE1vZGUgbW9kZSk7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUFwcGVuZGVyKCk7CisKKyAgICBzdGF0dXNfdCBpbml0KCk7CisKKyAgICBzdGF0dXNfdCBzdGFydCgpOworCisgICAgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgc3RhdHVzX3Qgd3JpdGVTYW1wbGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIsIHNpemVfdCB0cmFja0luZGV4LCBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpOworCisgICAgc3RhdHVzX3Qgc2V0T3JpZW50YXRpb25IaW50KGludCBkZWdyZWVzKTsKKworICAgIHN0YXR1c190IHNldExvY2F0aW9uKGludCBsYXRpdHVkZSwgaW50IGxvbmdpdHVkZSk7CisKKyAgICBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKworICAgIHNzaXplX3QgZ2V0VHJhY2tDb3VudCgpOworCisgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpZHgpOworCitwcml2YXRlOgorICAgIE1lZGlhQXBwZW5kZXIoaW50IGZkLCBBcHBlbmRNb2RlIG1vZGUpOworCisgICAgaW50IG1GZDsKKyAgICBNZWRpYU11eGVyOjpPdXRwdXRGb3JtYXQgbUZvcm1hdDsKKyAgICBBcHBlbmRNb2RlIG1Nb2RlOworICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7CisgICAgc3A8TWVkaWFNdXhlcj4gbU11eGVyOworICAgIHNpemVfdCBtVHJhY2tDb3VudDsKKyAgICAvLyBNYXAgdHJhY2sgaW5kZXggZ2l2ZW4gYnkgZXh0cmFjdG9yIHRvIHRoZSBvbmVzIHJlY2VpdmVkIGZyb20gbXV4ZXIuCisgICAgc3RkOjptYXA8c2l6ZV90LCBzc2l6ZV90PiBtVHJhY2tJbmRleE1hcDsKKyAgICAvLyBDb3VudCBvZiB0aGUgc2FtcGxlcyBpbiBlYWNoIHRyYWNrLCBpbmRleGVkIGJ5IGV4dHJhY3RvciB0cmFjayBpZHMuCisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBtU2FtcGxlQ291bnRWZWN0OworICAgIC8vIEV4dHJhY3RvciB0cmFjayBpbmRleCBvZiBzYW1wbGVzLgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gbVNhbXBsZUluZGV4VmVjdDsKKyAgICAvLyBUcmFjayBmb3JtYXQgaW5kZXhlZCBieSBleHRyYWN0b3IgdHJhY2sgaWRzLgorICAgIHN0ZDo6bWFwPHNpemVfdCwgc3A8QU1lc3NhZ2U+PiBtRm10SW5kZXhNYXA7CisgICAgLy8gU2l6ZSBvZiBzYW1wbGVzLgorICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gbVNhbXBsZVNpemVWZWN0OworICAgIC8vIFByZXNlbnRhdGlvbiB0aW1lIHN0YW1wIG9mIHNhbXBsZXMuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbVNhbXBsZVRpbWVWZWN0OworICAgIC8vIFRpbWVzdGFtcCBvZiBsYXN0IHNhbXBsZSBvZiB0cmFja3MuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbU1heFRpbWVzdGFtcFZlY3Q7CisgICAgLy8gTWV0YWRhdGEgb2Ygc2FtcGxlcy4KKyAgICBzdGQ6OnZlY3RvcjxzcDxNZXRhRGF0YT4+IG1TYW1wbGVNZXRhVmVjdDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAvLyBUaW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3luYyBzYW1wbGUgb2YgdHJhY2tzLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1MYXN0U3luY1NhbXBsZVRpbWVWZWN0OworCisgICAgc3RydWN0IHNhbXBsZURhdGFJbmZvOworICAgIHN0ZDo6dmVjdG9yPHNhbXBsZURhdGFJbmZvPiBtU0RJOworCisgICAgZW51bSA6IGludCB7CisgICAgICAgIFVOSU5JVElBTElaRUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBTVEFSVEVELAorICAgICAgICBTVE9QUEVELAorICAgICAgICBFUlJPUiwKKyAgICB9IG1TdGF0ZSBHVUFSREVEX0JZKG1NdXRleCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBBTkRST0lEX01FRElBX0FQUEVOREVSX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKaW5kZXggOTE0NWI2My4uMmMwM2YyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApAQCAtNDYsNyArNDYsNyBAQAogICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKIAogICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotI2lmbmRlZiBOT19JTUVNT1JZCisjaWYgIWRlZmluZWQoTk9fSU1FTU9SWSkgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6CiAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCiAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KQEAgLTk3LDcgKzk3LDcgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKLSNpZm5kZWYgTk9fSU1FTU9SWQorI2lmICFkZWZpbmVkKE5PX0lNRU1PUlkpICYmICFkZWZpbmVkKF9fQU5EUk9JRF9BUEVYX18pCiAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCiAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKICAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotI2lmbmRlZiBOT19JTUVNT1JZCisjaWYgIWRlZmluZWQoTk9fSU1FTU9SWSkgJiYgIWRlZmluZWQoX19BTkRST0lEX0FQRVhfXykKICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCiAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyBib29sIGlzRGVhZE9iamVjdChjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5KSB7Ci0jaWZuZGVmIE5PX0lNRU1PUlkKKyNpZiAhZGVmaW5lZChOT19JTUVNT1JZKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwogICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCiAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCkBAIC0yMzUsNyArMjM1LDcgQEAKICAgICB9OwogCiAgICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7Ci0jaWZuZGVmIE5PX0lNRU1PUlkKKyNpZiAhZGVmaW5lZChOT19JTUVNT1JZKSAmJiAhZGVmaW5lZChfX0FORFJPSURfQVBFWF9fKQogICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwogICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCiAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IGY3ZTZjMjcuLmQzNzIxNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC01MCw2ICs1MCw3IEBACiBzdHJ1Y3QgQmF0dGVyeUNoZWNrZXI7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBDb2RlY0Jhc2U7CitzdHJ1Y3QgQ29kZWNQYXJhbWV0ZXJEZXNjcmlwdG9yOwogY2xhc3MgSUJhdHRlcnlTdGF0czsKIHN0cnVjdCBJQ3J5cHRvOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKQEAgLTU3LDYgKzU4LDcgQEAKIHN0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXI7CiBjbGFzcyBTdXJmYWNlOworY2xhc3MgUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yOwogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBjYXMgewogbmFtZXNwYWNlIG5hdGl2ZSB7CkBAIC04MSw2ICs4MywxMyBAQAogICAgICAgICBCVUZGRVJfRkxBR19NVVhFUl9EQVRBICAgID0gMTYsCiAgICAgfTsKIAorICAgIGVudW0gQ1ZPRGVncmVlIHsKKyAgICAgICAgQ1ZPX0RFR1JFRV8wICAgPSAwLAorICAgICAgICBDVk9fREVHUkVFXzkwICA9IDkwLAorICAgICAgICBDVk9fREVHUkVFXzE4MCA9IDE4MCwKKyAgICAgICAgQ1ZPX0RFR1JFRV8yNzAgPSAyNzAsCisgICAgfTsKKwogICAgIGVudW0gewogICAgICAgICBDQl9JTlBVVF9BVkFJTEFCTEUgPSAxLAogICAgICAgICBDQl9PVVRQVVRfQVZBSUxBQkxFID0gMiwKQEAgLTk2LDYgKzEwNSwxMCBAQAogICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgQVN0cmluZyAmbWltZSwgYm9vbCBlbmNvZGVyLCBzdGF0dXNfdCAqZXJyID0gTlVMTCwKICAgICAgICAgICAgIHBpZF90IHBpZCA9IGtOb1BpZCwgdWlkX3QgdWlkID0ga05vVWlkKTsKIAorICAgIHN0YXRpYyBzcDxNZWRpYUNvZGVjPiBDcmVhdGVCeVR5cGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBjb25zdCBBU3RyaW5nICZtaW1lLCBib29sIGVuY29kZXIsIHN0YXR1c190ICplcnIsCisgICAgICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCwgc3A8QU1lc3NhZ2U+IGZvcm1hdCk7CisKICAgICBzdGF0aWMgc3A8TWVkaWFDb2RlYz4gQ3JlYXRlQnlDb21wb25lbnROYW1lKAogICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgY29uc3QgQVN0cmluZyAmbmFtZSwgc3RhdHVzX3QgKmVyciA9IE5VTEwsCiAgICAgICAgICAgICBwaWRfdCBwaWQgPSBrTm9QaWQsIHVpZF90IHVpZCA9IGtOb1VpZCk7CkBAIC0xMjEsNiArMTM0LDggQEAKIAogICAgIHN0YXR1c190IHNldE9uRnJhbWVSZW5kZXJlZE5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKKyAgICBzdGF0dXNfdCBzZXRPbkZpcnN0VHVubmVsRnJhbWVSZWFkeU5vdGlmaWNhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CisKICAgICBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2Uoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4qIGJ1ZmZlclByb2R1Y2VyKTsKIAogICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOwpAQCAtMjM5LDYgKzI1NCwxMSBAQAogCiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAKKyAgICBzdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZlbmRvclBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpuYW1lcyk7CisgICAgc3RhdHVzX3QgZGVzY3JpYmVQYXJhbWV0ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIENvZGVjUGFyYW1ldGVyRGVzY3JpcHRvciAqZGVzYyk7CisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9WZW5kb3JQYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmbmFtZXMpOworICAgIHN0YXR1c190IHVuc3Vic2NyaWJlRnJvbVZlbmRvclBhcmFtZXRlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZuYW1lcyk7CisKICAgICAvLyBDcmVhdGUgYSBNZWRpYUNvZGVjIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGZyb20gYSBsaXN0IG9mIHJlbmRlcmVkIG9yIGRyb3BwZWQgcmVuZGVyIGluZm9zCiAgICAgLy8gYnkgYWRkaW5nIHJlbmRlcmVkIGZyYW1lIGluZm9ybWF0aW9uIHRvIGEgYmFzZSBub3RpZmljYXRpb24gbWVzc2FnZS4gUmV0dXJucyB0aGUgbnVtYmVyCiAgICAgLy8gb2YgZnJhbWVzIHRoYXQgd2VyZSByZW5kZXJlZC4KQEAgLTM1NCw2ICszNzQsMzAgQEAKICAgICAgICAgYm9vbCBtT3duZWRCeUNsaWVudDsKICAgICB9OwogCisgICAgLy8gVGhpcyB0eXBlIGlzIHVzZWQgdG8gdHJhY2sgdGhlIHR1bm5lbCBtb2RlIHZpZGVvIHBlZWsgc3RhdGUgbWFjaGluZToKKyAgICAvLworICAgIC8vIERpc2FibGVkTm9CdWZmZXIgLT4gRW5hYmxlZE5vQnVmZmVyICB3aGVuIHR1bm5lbC1wZWVrID0gdHJ1ZQorICAgIC8vIERpc2FibGVkUXVldWVkICAgLT4gRW5hYmxlZFF1ZXVlZCAgICB3aGVuIHR1bm5lbC1wZWVrID0gdHJ1ZQorICAgIC8vIERpc2FibGVkTm9CdWZmZXIgLT4gRGlzYWJsZWRRdWV1ZWQgICB3aGVuIGZpcnN0IGZyYW1lIHF1ZXVlZAorICAgIC8vIEVuYWJsZWROb0J1ZmZlciAgLT4gRGlzYWJsZWROb0J1ZmZlciB3aGVuIHR1bm5lbC1wZWVrID0gZmFsc2UKKyAgICAvLyBFbmFibGVkUXVldWVkICAgIC0+IERpc2FibGVkUXVldWVkICAgd2hlbiB0dW5uZWwtcGVlayA9IGZhbHNlCisgICAgLy8gRW5hYmxlZE5vQnVmZmVyICAtPiBFbmFibGVkUXVldWVkICAgIHdoZW4gZmlyc3QgZnJhbWUgcXVldWVkCisgICAgLy8gRGlzYWJsZWROb0J1ZmZlciAtPiBCdWZmZXJEZWNvZGVkICAgIHdoZW4ga1doYXRGaXJzdFR1bm5lbEZyYW1lUmVhZHkKKyAgICAvLyBEaXNhYmxlZFF1ZXVlZCAgIC0+IEJ1ZmZlckRlY29kZWQgICAgd2hlbiBrV2hhdEZpcnN0VHVubmVsRnJhbWVSZWFkeQorICAgIC8vIEVuYWJsZWROb0J1ZmZlciAgLT4gQnVmZmVyRGVjb2RlZCAgICB3aGVuIGtXaGF0Rmlyc3RUdW5uZWxGcmFtZVJlYWR5CisgICAgLy8gRW5hYmxlZFF1ZXVlZCAgICAtPiBCdWZmZXJEZWNvZGVkICAgIHdoZW4ga1doYXRGaXJzdFR1bm5lbEZyYW1lUmVhZHkKKyAgICAvLyBCdWZmZXJEZWNvZGVkICAgIC0+IEJ1ZmZlclJlbmRlcmVkICAgd2hlbiBrV2hhdEZyYW1lUmVuZGVyZWQKKyAgICAvLyA8YWxsIHN0YXRlcz4gICAgIC0+IEVuYWJsZWROb0J1ZmZlciAgd2hlbiBmbHVzaAorICAgIC8vIDxhbGwgc3RhdGVzPiAgICAgLT4gRW5hYmxlZE5vQnVmZmVyICB3aGVuIHN0b3AgdGhlbiBjb25maWd1cmUgdGhlbiBzdGFydAorICAgIGVudW0gc3RydWN0IFR1bm5lbFBlZWtTdGF0ZSB7CisgICAgICAgIGtEaXNhYmxlZE5vQnVmZmVyLAorICAgICAgICBrRW5hYmxlZE5vQnVmZmVyLAorICAgICAgICBrRGlzYWJsZWRRdWV1ZWQsCisgICAgICAgIGtFbmFibGVkUXVldWVkLAorICAgICAgICBrQnVmZmVyRGVjb2RlZCwKKyAgICAgICAga0J1ZmZlclJlbmRlcmVkLAorICAgIH07CisKICAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5OwogCiAgICAgU3RhdGUgbVN0YXRlOwpAQCAtMzY2LDcgKzQxMCwxMCBAQAogICAgIEFTdHJpbmcgbU93bmVyTmFtZTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CisgICAgc3RkOjpzdHJpbmcgbUxhc3RSZXBseU9yaWdpbjsKKyAgICBzdGQ6OnZlY3RvcjxzcDxBTWVzc2FnZT4+IG1EZWZlcnJlZE1lc3NhZ2VzOwogICAgIHVpbnQzMl90IG1GbGFnczsKKyAgICBpbnQ2NF90IG1QcmVzZW50YXRpb25UaW1lVXMgPSAwOwogICAgIHN0YXR1c190IG1TdGlja3lFcnJvcjsKICAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwpAQCAtMzc4LDE2ICs0MjUsMjEgQEAKICAgICB2b2lkIGZsdXNoTWVkaWFtZXRyaWNzKCk7CiAgICAgdm9pZCB1cGRhdGVFcGhlbWVyYWxNZWRpYW1ldHJpY3MobWVkaWFtZXRyaWNzX2hhbmRsZV90IGl0ZW0pOwogICAgIHZvaWQgdXBkYXRlTG93TGF0ZW5jeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgKmFzU3RyaW5nKFR1bm5lbFBlZWtTdGF0ZSBzdGF0ZSwgY29uc3QgY2hhciAqZGVmYXVsdF9zdHJpbmc9Ij8iKTsKKyAgICB2b2lkIHVwZGF0ZVR1bm5lbFBlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgdXBkYXRlUGxheWJhY2tEdXJhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtQ2FsbGJhY2s7CiAgICAgc3A8QU1lc3NhZ2U+IG1PbkZyYW1lUmVuZGVyZWROb3RpZmljYXRpb247CiAgICAgc3A8QU1lc3NhZ2U+IG1Bc3luY1JlbGVhc2VDb21wbGV0ZU5vdGlmaWNhdGlvbjsKKyAgICBzcDxBTWVzc2FnZT4gbU9uRmlyc3RUdW5uZWxGcmFtZVJlYWR5Tm90aWZpY2F0aW9uOwogCiAgICAgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5PiBtUmVzb3VyY2VNYW5hZ2VyUHJveHk7CiAKICAgICBib29sIG1Jc1ZpZGVvOworICAgIEFTdHJpbmcgbUxvZ1Nlc3Npb25JZDsKICAgICBpbnQzMl90IG1WaWRlb1dpZHRoOwogICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OwogICAgIGludDMyX3QgbVJvdGF0aW9uRGVncmVlczsKQEAgLTM5OSw2ICs0NTEsMTcgQEAKICAgICAvLyBjb25maWd1cmUgcGFyYW1ldGVyCiAgICAgc3A8QU1lc3NhZ2U+IG1Db25maWd1cmVNc2c7CiAKKyAgICAvLyByZXdyaXRlcyB0aGUgZm9ybWF0IGRlc2NyaXB0aW9uIGR1cmluZyBjb25maWd1cmUoKSBmb3IgZW5jb2RpbmcuCisgICAgLy8gZm9ybWF0IGFuZCBmbGFncyBhcyB0aGV5IGV4aXN0IHdpdGhpbiBjb25maWd1cmUoKQorICAgIC8vIHRoZSAocG9zc2libHkpIHVwZGF0ZWQgZm9ybWF0IGlzIHJldHVybmVkIGluIHBsYWNlLgorICAgIHN0YXR1c190IHNoYXBlTWVkaWFGb3JtYXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKworICAgIC8vIHBvcHVsYXRlIHRoZSBmb3JtYXQgc2hhcGVyIGxpYnJhcnkgd2l0aCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb2RlYyBlbmNvZGluZworICAgIC8vIGZvciB0aGUgaW5kaWNhdGVkIG1lZGlhIHR5cGUKKyAgICBzdGF0dXNfdCBzZXR1cEZvcm1hdFNoYXBlcihBU3RyaW5nIG1lZGlhVHlwZSk7CisKICAgICAvLyBVc2VkIG9ubHkgdG8gc3luY2hyb25pemUgYXN5bmNocm9ub3VzIGdldEJ1ZmZlckFuZEZvcm1hdAogICAgIC8vIGFjcm9zcyBhbGwgdGhlIG90aGVyIChzeW5jaHJvbm91cykgYnVmZmVyIHN0YXRlIGNoYW5nZQogICAgIC8vIG9wZXJhdGlvbnMsIHN1Y2ggYXMgZGUvcXVldWVJbi9PdXRwdXRCdWZmZXIsIHN0YXJ0IGFuZApAQCAtNDE2LDYgKzQ3OSwxMSBAQAogCiAgICAgc3A8SUNyeXB0bz4gbUNyeXB0bzsKIAorICAgIGludDMyX3QgbVR1bm5lbGVkSW5wdXRXaWR0aDsKKyAgICBpbnQzMl90IG1UdW5uZWxlZElucHV0SGVpZ2h0OworICAgIGJvb2wgbVR1bm5lbGVkOworICAgIFR1bm5lbFBlZWtTdGF0ZSBtVHVubmVsUGVla1N0YXRlOworCiAgICAgc3A8SURlc2NyYW1ibGVyPiBtRGVzY3JhbWJsZXI7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbUNTRDsKQEAgLTQyOCwxMyArNDk2LDIwIEBACiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IG1CdWZmZXJDaGFubmVsOwogCi0gICAgTWVkaWFDb2RlYyhjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgUGxheWJhY2tEdXJhdGlvbkFjY3VtdWxhdG9yICogbVBsYXliYWNrRHVyYXRpb25BY2N1bXVsYXRvcjsKKyAgICBib29sIG1Jc1N1cmZhY2VUb1NjcmVlbjsKKworICAgIE1lZGlhQ29kZWMoCisgICAgICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLCBwaWRfdCBwaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKik+IGdldENvZGVjQmFzZSA9IG51bGxwdHIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8gPSBudWxscHRyKTsKIAogICAgIHN0YXRpYyBzcDxDb2RlY0Jhc2U+IEdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lciA9IG51bGxwdHIpOwogCiAgICAgc3RhdGljIHN0YXR1c190IFBvc3RBbmRBd2FpdFJlc3BvbnNlKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpOwogCisgICAgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgZXJyKTsKICAgICB2b2lkIFBvc3RSZXBseVdpdGhFcnJvcihjb25zdCBzcDxBUmVwbHlUb2tlbj4gJnJlcGx5SUQsIGludDMyX3QgZXJyKTsKIAogICAgIHN0YXR1c190IGluaXQoY29uc3QgQVN0cmluZyAmbmFtZSk7CkBAIC00NDUsNiArNTIwLDcgQEAKICAgICBzaXplX3QgdXBkYXRlQnVmZmVycyhpbnQzMl90IHBvcnRJbmRleCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHN0YXR1c190IG9uUXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgc3RhdHVzX3Qgb25SZWxlYXNlT3V0cHV0QnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICBCdWZmZXJJbmZvICpwZWVrTmV4dFBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpOwogICAgIHNzaXplX3QgZGVxdWV1ZVBvcnRCdWZmZXIoaW50MzJfdCBwb3J0SW5kZXgpOwogCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyQW5kRm9ybWF0KApAQCAtNDc2LDYgKzU1Miw3IEBACiAgICAgc3RhdHVzX3Qgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAogICAgIHN0YXR1c190IGFtZW5kT3V0cHV0Rm9ybWF0V2l0aENvZGVjU3BlY2lmaWNEYXRhKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlSWZOZWVkZWQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgYm9vbCBpc0V4ZWN1dGluZygpIGNvbnN0OwogCiAgICAgdWludDY0X3QgZ2V0R3JhcGhpY0J1ZmZlclNpemUoKTsKQEAgLTQ4NCw2ICs1NjEsOSBAQAogICAgIGJvb2wgaGFzUGVuZGluZ0J1ZmZlcihpbnQgcG9ydEluZGV4KTsKICAgICBib29sIGhhc1BlbmRpbmdCdWZmZXIoKTsKIAorICAgIHZvaWQgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhzdGQ6OnN0cmluZyBvcmlnaW4sIHN0YXR1c190IGVyciA9IE9LKTsKKyAgICB2b2lkIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoc3RkOjpzdHJpbmcgb3JpZ2luLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlc3BvbnNlKTsKKwogICAgIC8qIGNhbGxlZCB0byBnZXQgdGhlIGxhc3QgY29kZWMgZXJyb3Igd2hlbiB0aGUgc3RpY2t5IGZsYWcgaXMgc2V0LgogICAgICAqIGlmIG5vIHN1Y2ggY29kZWMgZXJyb3IgaXMgZm91bmQsIHJldHVybnMgVU5LTk9XTl9FUlJPUi4KICAgICAgKi8KQEAgLTUwNiw2ICs1ODYsMTUgQEAKICAgICBzdGQ6OmRlcXVlPEJ1ZmZlckZsaWdodFRpbWluZ190PiBtQnVmZmVyc0luRmxpZ2h0OwogICAgIE11dGV4IG1MYXRlbmN5TG9jazsKICAgICBpbnQ2NF90IG1MYXRlbmN5VW5rbm93bjsgICAgLy8gYnVmZmVycyBmb3Igd2hpY2ggd2UgY291bGRuJ3QgY2FsY3VsYXRlIGxhdGVuY3kKKworICAgIE11dGV4IG1PdXRwdXRTdGF0c0xvY2s7CisgICAgaW50NjRfdCBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICBpbnQ2NF90IG1FYXJsaWVzdEVuY29kZWRQdHNVcyA9IElOVDY0X01BWDsKKyAgICBpbnQ2NF90IG1MYXRlc3RFbmNvZGVkUHRzVXMgPSBJTlQ2NF9NSU47CisgICAgaW50NjRfdCBtRnJhbWVzRW5jb2RlZCA9IDA7CisgICAgaW50NjRfdCBtQnl0ZXNJbnB1dCA9IDA7CisgICAgaW50NjRfdCBtRnJhbWVzSW5wdXQgPSAwOworCiAgICAgaW50NjRfdCBtTnVtTG93TGF0ZW5jeUVuYWJsZXM7ICAvLyBob3cgbWFueSB0aW1lcyBsb3cgbGF0ZW5jeSBtb2RlIGlzIGVuYWJsZWQKICAgICBpbnQ2NF90IG1OdW1Mb3dMYXRlbmN5RGlzYWJsZXM7ICAvLyBob3cgbWFueSB0aW1lcyBsb3cgbGF0ZW5jeSBtb2RlIGlzIGRpc2FibGVkCiAgICAgYm9vbCBtSXNMb3dMYXRlbmN5TW9kZU9uOyAgLy8gaXMgbG93IGxhdGVuY3kgbW9kZSBvbiBjdXJyZW50bHkKQEAgLTUyMSw4ICs2MTAsOCBAQAogCiAgICAgc3A8QmF0dGVyeUNoZWNrZXI+IG1CYXR0ZXJ5Q2hlY2tlcjsKIAotICAgIHZvaWQgc3RhdHNCdWZmZXJTZW50KGludDY0X3QgcHJlc2VudGF0aW9uVXMpOwotICAgIHZvaWQgc3RhdHNCdWZmZXJSZWNlaXZlZChpbnQ2NF90IHByZXNlbnRhdGlvblVzKTsKKyAgICB2b2lkIHN0YXRzQnVmZmVyU2VudChpbnQ2NF90IHByZXNlbnRhdGlvblVzLCBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHN0YXRzQnVmZmVyUmVjZWl2ZWQoaW50NjRfdCBwcmVzZW50YXRpb25VcywgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICBlbnVtIHsKICAgICAgICAgLy8gdGhlIGRlZmF1bHQgc2hhcGUgb2Ygb3VyIGxhdGVuY3kgaGlzdG9ncmFtIGJ1Y2tldHMKQEAgLTU2OSw2ICs2NTgsMTAgQEAKIAogICAgIEhpc3RvZ3JhbSBtTGF0ZW5jeUhpc3Q7CiAKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopPiBtR2V0Q29kZWNCYXNlOworICAgIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoY29uc3QgQVN0cmluZyAmLCBzcDxNZWRpYUNvZGVjSW5mbz4gKik+IG1HZXRDb2RlY0luZm87CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhVGVzdEhlbHBlcjsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhQ29kZWMpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAppbmRleCAxNzhkMzM0Li40MjM3ZThjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtNTU3LDEyICs1NTcsMTQgQEAKIH0KIAogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NCUiA9IDI7Citjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfQ0JSX0ZEID0gMzsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DUSA9IDA7CiBjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfVkJSID0gMTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19CaXRyYXRlTW9kZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgY2FzZSBCSVRSQVRFX01PREVfQ0JSOiAgcmV0dXJuICJDQlIiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DQlJfRkQ6IHJldHVybiAiQ0JSX0ZEIjsKICAgICAgICAgY2FzZSBCSVRSQVRFX01PREVfQ1E6ICAgcmV0dXJuICJDUSI7CiAgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX1ZCUjogIHJldHVybiAiVkJSIjsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKQEAgLTYxOSw2ICs2MjEsNyBAQAogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hciAgICAgICAgPSAyNDsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEZsZXhpYmxlICAgICAgICAgID0gMHg3RjQ0NDg4ODsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkICAgICAgID0gMjk7Citjb25zdGV4cHIgaW50MzJfdCBDT0xPUl9Gb3JtYXRZVVZQMDEwICAgICAgICAgICAgICAgICA9IDU0OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyICAgPSAweDdmYTMwYzAwOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N2YwMDAxMDA7CiAKQEAgLTY4Myw2ICs2ODYsNyBAQAogY29uc3RleHByIGNoYXIgRkVBVFVSRV9BZGFwdGl2ZVBsYXliYWNrW10gICAgICAgPSAiYWRhcHRpdmUtcGxheWJhY2siOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9JbnRyYVJlZnJlc2hbXSA9ICJpbnRyYS1yZWZyZXNoIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUGFydGlhbEZyYW1lW10gPSAicGFydGlhbC1mcmFtZSI7Citjb25zdGV4cHIgY2hhciBGRUFUVVJFX1FwQm91bmRzW10gPSAicXAtYm91bmRzIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfU2VjdXJlUGxheWJhY2tbXSAgICAgICAgID0gInNlY3VyZS1wbGF5YmFjayI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX1R1bm5lbGVkUGxheWJhY2tbXSAgICAgICA9ICJ0dW5uZWxlZC1wbGF5YmFjayI7CiAKQEAgLTc0NCw2ICs3NDgsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlRbXSA9ICJhYWMtbWF4LW91dHB1dC1jaGFubmVsX2NvdW50IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfUFJPRklMRVtdID0gImFhYy1wcm9maWxlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BQUNfU0JSX01PREVbXSA9ICJhYWMtc2JyLW1vZGUiOworY29uc3RleHByIGNoYXIgS0VZX0FMTE9XX0ZSQU1FX0RST1BbXSA9ICJhbGxvdy1mcmFtZS1kcm9wIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9BVURJT19TRVNTSU9OX0lEW10gPSAiYXVkaW8tc2Vzc2lvbi1pZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQklUX1JBVEVbXSA9ICJiaXRyYXRlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9CSVRSQVRFX01PREVbXSA9ICJiaXRyYXRlLW1vZGUiOwpAQCAtNzUxLDcgKzc1Niw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU1lTVEVNX0lEW10gPSAiY2Etc3lzdGVtLWlkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9QUklWQVRFX0RBVEFbXSA9ICJjYS1wcml2YXRlLWRhdGEiOwogY29uc3RleHByIGNoYXIgS0VZX0NBUFRVUkVfUkFURVtdID0gImNhcHR1cmUtcmF0ZSI7Ci1jb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9DT1VOVFtdID0gImNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJjaGFubmVsLWNvdW50IjsgICAvLyB2YWx1ZSBOLCBlcSB0byByYW5nZSAxLi5OCiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9NQVNLW10gPSAiY2hhbm5lbC1tYXNrIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DT0xPUl9GT1JNQVRbXSA9ICJjb2xvci1mb3JtYXQiOwogY29uc3RleHByIGNoYXIgS0VZX0NPTE9SX1JBTkdFW10gPSAiY29sb3ItcmFuZ2UiOwpAQCAtNzkyLDcgKzc5Nyw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfUENNX0VOQ09ESU5HW10gPSAicGNtLWVuY29kaW5nIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9fSEVJR0hUW10gPSAic2FyLWhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfUElYRUxfQVNQRUNUX1JBVElPX1dJRFRIW10gPSAic2FyLXdpZHRoIjsKLWNvbnN0ZXhwciBjaGFyIEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVNbXSA9ICJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyI7Citjb25zdGV4cHIgY2hhciBLRVlfUFJFUEVORF9IRUFERVJfVE9fU1lOQ19GUkFNRVNbXSA9ICJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyI7CiBjb25zdGV4cHIgY2hhciBLRVlfUFJJT1JJVFlbXSA9ICJwcmlvcml0eSI7CiBjb25zdGV4cHIgY2hhciBLRVlfUFJPRklMRVtdID0gInByb2ZpbGUiOwogY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKQEAgLTgwNiw2ICs4MTEsMTQgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9USUxFX0hFSUdIVFtdID0gInRpbGUtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9USUxFX1dJRFRIW10gPSAidGlsZS13aWR0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfVFJBQ0tfSURbXSA9ICJ0cmFjay1pZCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfQl9NQVhbXSA9ICJ2aWRlby1xcC1iLW1heCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfQl9NSU5bXSA9ICJ2aWRlby1xcC1iLW1pbiI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfSV9NQVhbXSA9ICJ2aWRlby1xcC1pLW1heCI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfSV9NSU5bXSA9ICJ2aWRlby1xcC1pLW1pbiI7Citjb25zdGV4cHIgY2hhciBLRVlfVklERU9fUVBfTUFYW10gPSAidmlkZW8tcXAtbWF4IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9WSURFT19RUF9NSU5bXSA9ICJ2aWRlby1xcC1taW4iOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX1BfTUFYW10gPSAidmlkZW8tcXAtcC1tYXgiOworY29uc3RleHByIGNoYXIgS0VZX1ZJREVPX1FQX1BfTUlOW10gPSAidmlkZW8tcXAtcC1taW4iOwogY29uc3RleHByIGNoYXIgS0VZX1dJRFRIW10gPSAid2lkdGgiOwogCiAvLyBmcm9tIE1lZGlhQ29kZWMuamF2YQpAQCAtODQ3LDkgKzg2MCw5IEBACiBjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRVtdID0gInJlcXVlc3Qtc3luYyI7CiBjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1NVU1BFTkRbXSA9ICJkcm9wLWlucHV0LWZyYW1lcyI7CiBjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRVtdID0gImRyb3Atc3RhcnQtdGltZS11cyI7Citjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX1RVTk5FTF9QRUVLW10gPSAgInR1bm5lbC1wZWVrIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CiAKICNlbmRpZiAgLy8gTUVESUFfQ09ERUNfQ09OU1RBTlRTX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAppbmRleCBlNjgxZDI1Li4zY2Y0NTVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCkBAIC03NSw2ICs3NSwxNiBAQAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoaW5nQ29kZWNzKTsKIAorICAgIC8vIGFkZCBvcHRpb25hbCBmb3JtYXQsIHRvIGZ1cnRoZXIgcmVmaW5lIG1hdGNoaW5nIGNvZGVjcworICAgIHN0YXRpYyB2b2lkIGZpbmRNYXRjaGluZ0NvZGVjcygKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsCisgICAgICAgICAgICBib29sIGNyZWF0ZUVuY29kZXIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQsCisgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gKm1hdGNoaW5nQ29kZWNzKTsKKworICAgIHN0YXRpYyBib29sIGNvZGVjSGFuZGxlc0Zvcm1hdChjb25zdCBjaGFyICptaW1lLCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbywgc3A8QU1lc3NhZ2U+IGZvcm1hdCk7CisKICAgICBzdGF0aWMgYm9vbCBpc1NvZnR3YXJlQ29kZWMoY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSk7CiAKIHByaXZhdGU6CkBAIC04OCw3ICs5OCw3IEBACiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKIAotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3RhdHVzX3QgbUluaXRDaGVja3tOT19JTklUfTsKIAogICAgIHNwPEFNZXNzYWdlPiBtR2xvYmFsU2V0dGluZ3M7CiAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+ID4gbUNvZGVjSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggZjUzYjIzZS4uYmY4NWQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBNRURJQV9DT0RFQ19MSVNUX1dSSVRFUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNjUsNiArNjQsNyBAQAogICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gbUNvZGVjSW5mb3M7CiAKICAgICBmcmllbmQgc3RydWN0IE1lZGlhQ29kZWNMaXN0OworICAgIGZyaWVuZCBjbGFzcyBNZWRpYVRlc3RIZWxwZXI7CiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKaW5kZXggMmY5OGFmMS4uMGY3YjUzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmgKQEAgLTY0LDEyICs2NCwxNSBAQAogCiAgICAgLy8gTWVkaWFCdWZmZXJPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFbmNvZGluZ0JpdHJhdGUoaW50MzJfdCBiaXRSYXRlIC8qIGJwcyAqLyk7CiAKICAgICAvLyBmb3IgQUhhbmRsZXJSZWZsZWN0b3IKICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogCiAKKyAgICBzdGF0dXNfdCByZXF1ZXN0SURSRnJhbWUoKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhQ29kZWNTb3VyY2UoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDU0MThmMTAuLmQxZGYyY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTc1LDcgKzc1LDMyIEBACiAgICAgRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT04gICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTQsCiAgICAgRVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURSAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTUsCiAgICAgRVJST1JfRFJNX0lOVkFMSURfU1RBVEUgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTYsCi0gICAgRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTYsCisKKyAgICAvLyBOZXcgaW4gUyAvIGRybUAxLjQ6CisgICAgRVJST1JfRFJNX0NFUlRJRklDQVRFX01BTEZPUk1FRCAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTcsCisgICAgRVJST1JfRFJNX0NFUlRJRklDQVRFX01JU1NJTkcgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTgsCisgICAgRVJST1JfRFJNX0NSWVBUT19MSUJSQVJZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMTksCisgICAgRVJST1JfRFJNX0dFTkVSSUNfT0VNICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjAsCisgICAgRVJST1JfRFJNX0dFTkVSSUNfUExVR0lOICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjEsCisgICAgRVJST1JfRFJNX0lOSVRfREFUQSAgICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjIsCisgICAgRVJST1JfRFJNX0tFWV9OT1RfTE9BREVEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjMsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfUEFSU0UgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjQsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfUE9MSUNZICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjUsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfUkVMRUFTRSAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjYsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRCAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjcsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfUkVTVE9SRSAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjgsCisgICAgRVJST1JfRFJNX0xJQ0VOU0VfU1RBVEUgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMjksCisgICAgRVJST1JfRFJNX01FRElBX0ZSQU1FV09SSyAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzAsCisgICAgRVJST1JfRFJNX1BST1ZJU0lPTklOR19DRVJUSUZJQ0FURSAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzEsCisgICAgRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUcgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzIsCisgICAgRVJST1JfRFJNX1BST1ZJU0lPTklOR19QQVJTRSAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzMsCisgICAgRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEICA9IERSTV9FUlJPUl9CQVNFIC0gMzQsCisgICAgRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWSAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzUsCisgICAgRVJST1JfRFJNX1NFQ1VSRV9TVE9QX1JFTEVBU0UgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzYsCisgICAgRVJST1JfRFJNX1NUT1JBR0VfUkVBRCAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzcsCisgICAgRVJST1JfRFJNX1NUT1JBR0VfV1JJVEUgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzgsCisgICAgRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUyAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gMzksCisgICAgRVJST1JfRFJNX0xBU1RfVVNFRF9FUlJPUkNPREUgICAgICAgICAgICA9IEVSUk9SX0RSTV9aRVJPX1NVQlNBTVBMRVMsCiAKICAgICBFUlJPUl9EUk1fVkVORE9SX01BWCAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA1MDAsCiAgICAgRVJST1JfRFJNX1ZFTkRPUl9NSU4gICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOTk5LApAQCAtMTM4LDYgKzE2Myw1NyBAQAogICAgICAgICAgICAgfHwgKEVSUk9SX0RSTV9WRU5ET1JfTUlOIDw9IGVyciAmJiBlcnIgPD0gRVJST1JfRFJNX1ZFTkRPUl9NQVgpOwogfQogCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIFN0ckNyeXB0b0Vycm9yKHN0YXR1c190IGVycikgeworI2RlZmluZSBTVEFUVVNfQ0FTRShTVEFUVVMpIFwKKyAgICBjYXNlIFNUQVRVUzogICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAjU1RBVFVTCisKKyAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fVU5LTk9XTik7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9OT19MSUNFTlNFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0xJQ0VOU0VfRVhQSVJFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9ERUNSWVBUKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0NBTk5PVF9IQU5ETEUpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fVEFNUEVSX0RFVEVDVEVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX05PVF9QUk9WSVNJT05FRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9ERVZJQ0VfUkVWT0tFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0lOU1VGRklDSUVOVF9PVVRQVVRfUFJPVEVDVElPTik7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFkpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1JFU09VUkNFX0NPTlRFTlRJT04pOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0lOVkFMSURfU1RBVEUpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fQ0VSVElGSUNBVEVfTUFMRk9STUVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0NFUlRJRklDQVRFX01JU1NJTkcpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fQ1JZUFRPX0xJQlJBUlkpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fR0VORVJJQ19PRU0pOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fR0VORVJJQ19QTFVHSU4pOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fSU5JVF9EQVRBKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0tFWV9OT1RfTE9BREVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0xJQ0VOU0VfUEFSU0UpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fTElDRU5TRV9QT0xJQ1kpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fTElDRU5TRV9SRUxFQVNFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX0xJQ0VOU0VfUkVRVUVTVF9SRUpFQ1RFRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9MSUNFTlNFX1JFU1RPUkUpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fTElDRU5TRV9TVEFURSk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9NRURJQV9GUkFNRVdPUkspOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fUFJPVklTSU9OSU5HX0NFUlRJRklDQVRFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1BST1ZJU0lPTklOR19DT05GSUcpOworICAgICAgICBTVEFUVVNfQ0FTRShFUlJPUl9EUk1fUFJPVklTSU9OSU5HX1BBUlNFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVFVRVNUX1JFSkVDVEVEKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1BST1ZJU0lPTklOR19SRVRSWSk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9TRUNVUkVfU1RPUF9SRUxFQVNFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1NUT1JBR0VfUkVBRCk7CisgICAgICAgIFNUQVRVU19DQVNFKEVSUk9SX0RSTV9TVE9SQUdFX1dSSVRFKTsKKyAgICAgICAgU1RBVFVTX0NBU0UoRVJST1JfRFJNX1pFUk9fU1VCU0FNUExFUyk7CisjdW5kZWYgU1RBVFVTX0NBU0UKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1c1RvU3RyaW5nKGVycik7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTUVESUFfRVJST1JTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCmluZGV4IGExYjk0NjUuLmU5N2E2NWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oCkBAIC0yMiw3ICsyMiwxMiBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgiCisjaW5jbHVkZSAiTWVkaWFNdXhlckJhc2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMyw2ICszOCw3IEBACiBzdHJ1Y3QgTWVkaWFTb3VyY2U7CiBjbGFzcyBNZXRhRGF0YTsKIHN0cnVjdCBNZWRpYVdyaXRlcjsKK3N0cnVjdCBOdU1lZGlhRXh0cmFjdG9yOwogCiAvLyBNZWRpYU11eGVyIGlzIHVzZWQgdG8gbXV4IG11bHRpcGxlIHRyYWNrcyBpbnRvIGEgdmlkZW8uIEN1cnJlbnRseSwgd2Ugb25seQogLy8gc3VwcG9ydCBhIG1wNCBmaWxlIGFzIHRoZSBvdXRwdXQuCkBAIC00MCwxOSArNDYsOCBAQAogLy8gQ29uc3RydWN0b3IgLT4gYWRkVHJhY2srIC0+IHN0YXJ0IC0+IHdyaXRlU2FtcGxlRGF0YSsgLT4gc3RvcAogLy8gSWYgbXV4aW5nIG9wZXJhdGlvbiBuZWVkIHRvIGJlIGNhbmNlbGxlZCwgdGhlIGFwcCBpcyByZXNwb25zaWJsZSBmb3IKIC8vIGRlbGV0aW5nIHRoZSBvdXRwdXQgZmlsZSBhZnRlciBzdG9wLgotc3RydWN0IE1lZGlhTXV4ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitzdHJ1Y3QgTWVkaWFNdXhlciA6IHB1YmxpYyBNZWRpYU11eGVyQmFzZSB7CiBwdWJsaWM6Ci0gICAgLy8gUGxlYXNlIHVwZGF0ZSBtZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFNdXhlci5qYXZhIGlmIHRoZQotICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgotICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKLSAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgICAgICA9IDAsCi0gICAgICAgIE9VVFBVVF9GT1JNQVRfV0VCTSAgICAgICAgPSAxLAotICAgICAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCAgID0gMiwKLSAgICAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGICAgICAgICA9IDMsCi0gICAgICAgIE9VVFBVVF9GT1JNQVRfT0dHICAgICAgICAgPSA0LAotICAgICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKLSAgICB9OwotCiAgICAgLy8gQ29uc3RydWN0IHRoZSBtdXhlciB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IuIE5vdGUgdGhhdCB0aGUgTWVkaWFNdXhlcgogICAgIC8vIHdpbGwgY2xvc2UgdGhpcyBmaWxlIGF0IHN0b3AoKS4KICAgICBNZWRpYU11eGVyKGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCk7CkBAIC0xMTcsMTAgKzExMiwyNSBAQAogICAgIHN0YXR1c190IHdyaXRlU2FtcGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBzaXplX3QgdHJhY2tJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIHVpbnQzMl90IGZsYWdzKSA7CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdHJhY2tzIGFkZGVkIHN1Y2Nlc3NmdWxseS4gIFNob3VsZCBiZSBjYWxsZWQgaW4KKyAgICAgKiBJTklUSUFMSVpFRChhZnRlciBjb25zdHJ1Y3Rvcikgb3IgU1RBUlRFRChhZnRlciBzdGFydCgpKSBzdGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdHJhY2tzIG9yIC0xIGluIHdyb25nIHN0YXRlLgorICAgICAqLworICAgIHNzaXplX3QgZ2V0VHJhY2tDb3VudCgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayBieSB0aGVpciBpbmRleC4KKyAgICAgKiBAcGFyYW0gaWR4IDogaW5kZXggb2YgdGhlIHRyYWNrIHdob3NlIGZvcm1hdCBpcyB3YW50ZWQuCisgICAgICogQHJldHVybiBzbWFydCBwb2ludGVyIHRvIEFNZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGZvcm1hdCBkZXRhaWxzLgorICAgICAqLworICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0Zvcm1hdChzaXplX3QgaWR4KTsKKwogcHJpdmF0ZToKICAgICBjb25zdCBPdXRwdXRGb3JtYXQgbUZvcm1hdDsKICAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBWZWN0b3I8IHNwPE1lZGlhQWRhcHRlcj4gPiBtVHJhY2tMaXN0OyAgLy8gRWFjaCB0cmFjayBoYXMgaXRzIE1lZGlhQWRhcHRlci4KKyAgICBWZWN0b3I8IHNwPEFNZXNzYWdlPiA+IG1Gb3JtYXRMaXN0OyAvLyBGb3JtYXQgb2YgZWFjaCB0cmFjay4KICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOyAgLy8gTWV0YWRhdGEgZm9yIHRoZSB3aG9sZSBmaWxlLgogICAgIE11dGV4IG1NdXhlckxvY2s7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJkNTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyQmFzZS5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9NVVhFUl9CQVNFX0hfCisjZGVmaW5lIE1FRElBX01VWEVSX0JBU0VfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgQU1lc3NhZ2U7CisKKy8vIE1lZGlhTXV4ZXIgaXMgdXNlZCB0byBtdXggbXVsdGlwbGUgdHJhY2tzIGludG8gYSB2aWRlby4gQ3VycmVudGx5LCB3ZSBvbmx5CisvLyBzdXBwb3J0IGEgbXA0IGZpbGUgYXMgdGhlIG91dHB1dC4KKy8vIFRoZSBleHBlY3RlZCBjYWxsaW5nIG9yZGVyIG9mIHRoZSBmdW5jdGlvbnMgaXM6CisvLyBDb25zdHJ1Y3RvciAtPiBhZGRUcmFjaysgLT4gc3RhcnQgLT4gd3JpdGVTYW1wbGVEYXRhKyAtPiBzdG9wCisvLyBJZiBtdXhpbmcgb3BlcmF0aW9uIG5lZWQgdG8gYmUgY2FuY2VsbGVkLCB0aGUgYXBwIGlzIHJlc3BvbnNpYmxlIGZvcgorLy8gZGVsZXRpbmcgdGhlIG91dHB1dCBmaWxlIGFmdGVyIHN0b3AuCitzdHJ1Y3QgTWVkaWFNdXhlckJhc2UgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gUGxlYXNlIHVwZGF0ZSBtZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFNdXhlci5qYXZhIGlmIHRoZQorICAgIC8vIE91dHB1dEZvcm1hdCBpcyB1cGRhdGVkLgorICAgIGVudW0gT3V0cHV0Rm9ybWF0IHsKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9NUEVHXzQgICAgICA9IDAsCisgICAgICAgIE9VVFBVVF9GT1JNQVRfV0VCTSAgICAgICAgPSAxLAorICAgICAgICBPVVRQVVRfRk9STUFUX1RIUkVFX0dQUCAgID0gMiwKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGICAgICAgICA9IDMsCisgICAgICAgIE9VVFBVVF9GT1JNQVRfT0dHICAgICAgICAgPSA0LAorICAgICAgICBPVVRQVVRfRk9STUFUX0xJU1RfRU5EIC8vIG11c3QgYmUgbGFzdCAtIHVzZWQgdG8gdmFsaWRhdGUgZm9ybWF0IHR5cGUKKyAgICB9OworCisgICAgLy8gQ29uc3RydWN0IHRoZSBtdXhlciB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IuIE5vdGUgdGhhdCB0aGUgTWVkaWFNdXhlcgorICAgIC8vIHdpbGwgY2xvc2UgdGhpcyBmaWxlIGF0IHN0b3AoKS4KKyAgICBNZWRpYU11eGVyQmFzZSgpIHt9OworCisgICAgdmlydHVhbCB+TWVkaWFNdXhlckJhc2UoKSB7fTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHRyYWNrIHdpdGggaXRzIGZvcm1hdCBpbmZvcm1hdGlvbi4gVGhpcyBzaG91bGQgYmUKKyAgICAgKiBjYWxsZWQgYmVmb3JlIHN0YXJ0KCkuCisgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgdHJhY2sncyBmb3JtYXQuCisgICAgICogQHJldHVybiB0aGUgdHJhY2sncyBpbmRleCBvciBuZWdhdGl2ZSBudW1iZXIgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGFkZFRyYWNrKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBtdXhpbmcuIE1ha2Ugc3VyZSBhbGwgdGhlIHRyYWNrcyBoYXZlIGJlZW4gYWRkZWQgYmVmb3JlCisgICAgICogY2FsbGluZyB0aGlzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9yaWVudGF0aW9uIGhpbnQuCisgICAgICogQHBhcmFtIGRlZ3JlZXMgVGhlIHJvdGF0aW9uIGRlZ3JlZXMuIEl0IGhhcyB0byBiZSBlaXRoZXIgMCwKKyAgICAgKiAgICAgICAgICAgICAgICA5MCwgMTgwIG9yIDI3MC4KKyAgICAgKiBAcmV0dXJuIE9LIGlmIG5vIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3JpZW50YXRpb25IaW50KGludCBkZWdyZWVzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBsYXRpdHVkZSBUaGUgbGF0aXR1ZGUgaW4gZGVncmVlIHggMTAwMC4gSXRzIHZhbHVlIG11c3QgYmUgaW4gdGhlIHJhbmdlCisgICAgICogWy05MDAwMDAsIDkwMDAwMF0uCisgICAgICogQHBhcmFtIGxvbmdpdHVkZSBUaGUgbG9uZ2l0dWRlIGluIGRlZ3JlZSB4IDEwMDAuIEl0cyB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZQorICAgICAqIFstMTgwMDAwMCwgMTgwMDAwMF0uCisgICAgICogQHJldHVybiBPSyBpZiBubyBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvY2F0aW9uKGludCBsYXRpdHVkZSwgaW50IGxvbmdpdHVkZSkgPSAwOworCisgICAgLyoqCisgICAgICogU3RvcCBtdXhpbmcuCisgICAgICogVGhpcyBtZXRob2QgaXMgYSBibG9ja2luZyBjYWxsLiBEZXBlbmRpbmcgb24gaG93CisgICAgICogbXVjaCBkYXRhIGlzIGJ1ZmZlcnJlZCBpbnRlcm5hbGx5LCB0aGUgdGltZSBuZWVkZWQgZm9yIHN0b3BwaW5nCisgICAgICogdGhlIG11eGVyIG1heSBiZSB0aW1lIGNvbnN1bWluZy4gVUkgdGhyZWFkIGlzCisgICAgICogbm90IHJlY29tbWVuZGVkIGZvciBsYXVuY2hpbmcgdGhpcyBjYWxsLgorICAgICAqIEByZXR1cm4gT0sgaWYgbm8gZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLyoqCisgICAgICogU2VuZCBhIHNhbXBsZSBidWZmZXIgZm9yIG11eGluZy4KKyAgICAgKiBUaGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgb25jZSB0aGlzIG1ldGhvZCByZXR1cm5zLiBUeXBpY2FsbHksCisgICAgICogdGhpcyBmdW5jdGlvbiB3b24ndCBiZSBibG9ja2VkIGZvciB2ZXJ5IGxvbmcsIGFuZCB0aHVzIHRoZXJlCisgICAgICogaXMgbm8gbmVlZCB0byB1c2UgYSBzZXBhcmF0ZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCB0bworICAgICAqIHB1c2ggYSBidWZmZXIuCisgICAgICogQHBhcmFtIGJ1ZmZlciB0aGUgaW5jb21pbmcgc2FtcGxlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCB0aGUgYnVmZmVyJ3MgdHJhY2sgaW5kZXggbnVtYmVyLgorICAgICAqIEBwYXJhbSB0aW1lVXMgdGhlIGJ1ZmZlcidzIHRpbWUgc3RhbXAuCisgICAgICogQHBhcmFtIGZsYWdzIHRoZSBvbmx5IHN1cHBvcnRlZCBmbGFnIGZvciBub3cgaXMKKyAgICAgKiAgICAgICAgICAgICAgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FLgorICAgICAqIEByZXR1cm4gT0sgaWYgbm8gZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZVNhbXBsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgc2l6ZV90IHRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCB1aW50MzJfdCBmbGFncykgPSAwIDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG51bWJlciBvZiB0cmFja3MgYWRkZWQgc3VjY2Vzc2Z1bGx5LiAgU2hvdWxkIGJlIGNhbGxlZCBpbgorICAgICAqIElOSVRJQUxJWkVEKGFmdGVyIGNvbnN0cnVjdG9yKSBvciBTVEFSVEVEKGFmdGVyIHN0YXJ0KCkpIHN0YXRlLgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja3Mgb3IgLTEgaW4gd3Jvbmcgc3RhdGUuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGdldFRyYWNrQ291bnQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIGJ5IHRoZWlyIGluZGV4LgorICAgICAqIEBwYXJhbSBpZHggOiBpbmRleCBvZiB0aGUgdHJhY2sgd2hvc2UgZm9ybWF0IGlzIHdhbnRlZC4KKyAgICAgKiBAcmV0dXJuIHNtYXJ0IHBvaW50ZXIgdG8gQU1lc3NhZ2UgY29udGFpbmluZyB0aGUgZm9ybWF0IGRldGFpbHMuCisgICAgICovCisgICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGlkeCkgPSAwOworCitwcml2YXRlOgorCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVkaWFNdXhlckJhc2UpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9NVVhFUl9CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAppbmRleCAxZjRmYmNiLi45ZjIwMTg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCkBAIC01NCw2ICs1NCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXRTdGFydFRpbWVPZmZzZXRNcyhpbnQgLyptcyovKSB7fQogICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRNcygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5leHRGZChpbnQgLypmZCovKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDVk9EZWdyZWVzKGludDMyX3QgLypjdm9EZWdyZWVzKi8pIHt9CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgLypwYXlsb2FkVHlwZSovKSB7fQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVTb2NrZXROZXR3b3JrKGludDY0X3QgLypzb2NrZXROZXR3b3JrKi8pIHt9CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTZXF1ZW5jZU51bSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGdldEFjY3VtdWxhdGl2ZUJ5dGVzKCkgeyByZXR1cm4gMDsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWVkaWFXcml0ZXIoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKaW5kZXggNjRlYjhiNC4uYzgwMDEyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC02Miw2ICs2Miw3IEBACiAgICAga0tleURWQ0MgICAgICAgICAgICAgID0gJ2R2Y2MnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5QVYxQyAgICAgICAgICAgICAgPSAnYXYxYycsICAvLyByYXcgZGF0YQogICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCisgICAga0tleVRodW1ibmFpbEFWMUMgICAgID0gJ3RhdjEnLCAgLy8gcmF3IGRhdGEKICAgICBrS2V5RDI2MyAgICAgICAgICAgICAgPSAnZDI2MycsICAvLyByYXcgZGF0YQogICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCiAgICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQpAQCAtMTI2LDYgKzEyNyw4IEBACiAgICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAogCiAgICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKKyAgICBrS2V5QmFja2dyb3VuZE1vZGUgPSAnYmttZCcsICAvLyBib29sIChpbnQzMl90KQorCiAgICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAogCiAgICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCkBAIC0xNTIsNiArMTU1LDEwIEBACiAgICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKICAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90CiAKKyAgICBrS2V5TXBlZ2hQcm9maWxlTGV2ZWxJbmRpY2F0aW9uID0gJ2hwbGknLCAvLyBpbnQzMl90CisgICAga0tleU1wZWdoUmVmZXJlbmNlQ2hhbm5lbExheW91dCA9ICdocmNsJywgLy8gaW50MzJfdAorICAgIGtLZXlNcGVnaENvbXBhdGlibGVTZXRzICAgICAgICAgPSAnaGNvcycsIC8vIHJhdyBkYXRhCisKICAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAogICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgogICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQpAQCAtMjI0LDYgKzIzMSw4IEBACiAgICAga0tleUV4aWZTaXplICAgICAgICAgPSAnZXhzeicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBzaXplCiAgICAga0tleUV4aWZUaWZmT2Zmc2V0ICAgPSAndGhkcicsIC8vIGludDMyX3QsIGlmID4gMCwgYnVmZmVyIGNvbnRhaW5zIGV4aWYgZGF0YSBibG9jayB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpZmYgaGRyIGF0IHNwZWNpZmllZCBvZmZzZXQKKyAgICBrS2V5WG1wT2Zmc2V0ICAgICAgICA9ICd4bW9mJywgLy8gaW50NjRfdCwgWE1QIGRhdGEgb2Zmc2V0CisgICAga0tleVhtcFNpemUgICAgICAgICAgPSAneG1zeicsIC8vIGludDY0X3QsIFhNUCBkYXRhIHNpemUKICAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKIAogICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKQEAgLTI0Nyw2ICsyNTYsMjUgQEAKIAogICAgIC8vIFRyZWF0IGVtcHR5IHRyYWNrIGFzIG1hbGZvcm1lZCBmb3IgTWVkaWFSZWNvcmRlci4KICAgICBrS2V5RW1wdHlUcmFja01hbEZvcm1lZCA9ICduZW10JywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlWcHMgICAgICAgICAgICAgID0gJ3NWcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgdnBzLgorICAgIGtLZXlTcHMgICAgICAgICAgICAgID0gJ3NTcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgc3BzLgorICAgIGtLZXlQcHMgICAgICAgICAgICAgID0gJ3NQcHMnLCAvLyBpbnQzMl90LCBpbmRpY2F0ZXMgdGhhdCBhIGJ1ZmZlciBoYXMgcHBzLgorICAgIGtLZXlTZWxmSUQgICAgICAgICAgID0gJ3NmaWQnLCAvLyBpbnQzMl90LCBzb3VyY2UgSUQgdG8gaWRlbnRpZnkgaXRzZWxmIG9uIFJUUCBwcm90b2NvbC4KKyAgICBrS2V5UGF5bG9hZFR5cGUgICAgICA9ICdwVHlwJywgLy8gaW50MzJfdCwgU0RQIG5lZ290aWF0ZWQgcGF5bG9hZCB0eXBlLgorICAgIGtLZXlSdHBFeHRNYXAgICAgICAgID0gJ2V4dG0nLCAvLyBpbnQzMl90LCBydHAgZXh0ZW5zaW9uIElEIGZvciBjdm8gb24gUlRQIHByb3RvY29sLgorICAgIGtLZXlSdHBDdm9EZWdyZWVzICAgID0gJ2N2b2QnLCAvLyBpbnQzMl90LCBydHAgY3ZvIGRlZ3JlZXMgYXMgcGVyIDNHUFAgMjYuMTE0LgorICAgIGtLZXlSdHBEc2NwICAgICAgICAgID0gJ2RzY3AnLCAvLyBpbnQzMl90LCBEU0NQKERpZmZlcmVudGlhdGVkIHNlcnZpY2VzIGNvZGVwb2ludCkgb2YgUkZDIDI0NzQuCisgICAga0tleVNvY2tldE5ldHdvcmsgICAgPSAnc05ldCcsIC8vIGludDY0X3QsIHNvY2tldCB3aWxsIGJlIGJvdW5kIHRvIG5ldHdvcmsgaGFuZGxlLgorCisgICAgLy8gU2xvdy1tb3Rpb24gbWFya2VycworICAgIGtLZXlTbG93TW90aW9uTWFya2VycyA9ICdzbG1vJywgLy8gcmF3IGRhdGEsIGJ5dGUgYXJyYXkgZm9sbG93aW5nIHNwZWMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWRpYUZvcm1hdCNLRVlfU0xPV19NT1RJT05fTUFSS0VSUworCisgICAga0tleVNhbXBsZUZpbGVPZmZzZXQgPSAnc2ZvZicsIC8vIGludDY0X3QsIHNhbXBsZSdzIG9mZnNldCBpbiBhIG1lZGlhIGZpbGUuCisgICAga0tleUxhc3RTYW1wbGVJbmRleEluQ2h1bmsgPSAnbHNpYycsICAvL2ludDY0X3QsIGluZGV4IG9mIGxhc3Qgc2FtcGxlIGluIGEgY2h1bmsuCisgICAga0tleVNhbXBsZVRpbWVCZWZvcmVBcHBlbmQgPSAnbHNiYScsIC8vIGludDY0X3QsIHRpbWVzdGFtcCBvZiBsYXN0IHNhbXBsZSBvZiBhIHRyYWNrLgorCiB9OwogCiBlbnVtIHsKQEAgLTI1Niw2ICsyODQsNyBAQAogICAgIGtUeXBlQVYxQyAgICAgICAgPSAnYXYxYycsCiAgICAga1R5cGVEVkNDICAgICAgICA9ICdkdmNjJywKICAgICBrVHlwZUQyNjMgICAgICAgID0gJ2QyNjMnLAorICAgIGtUeXBlSENPUyAgICAgICAgPSAnaGNvcycsCiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggMjI3Y2VhZC4uZDE3YTQ4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmgKQEAgLTQ3LDEyICs0NywxNCBAQAogICAgICAgICBTQU1QTEVfRkxBR19FTkNSWVBURUQgICA9IDIsCiAgICAgfTsKIAorICAgIHR5cGVkZWYgSU1lZGlhRXh0cmFjdG9yOjpFbnRyeVBvaW50IEVudHJ5UG9pbnQ7CisKICAgICAvLyBpZGVudGljYWwgdG8gSU1lZGlhRXh0cmFjdG9yOjpHZXRUcmFja01ldGFEYXRhRmxhZ3MKICAgICBlbnVtIEdldFRyYWNrRm9ybWF0RmxhZ3MgewogICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMSwgLy8gcmVhZHMgc2FtcGxlIHRhYmxlIGFuZCBwb3NzaWJseSBzdHJlYW0gaGVhZGVycwogICAgIH07CiAKLSAgICBOdU1lZGlhRXh0cmFjdG9yKCk7CisgICAgZXhwbGljaXQgTnVNZWRpYUV4dHJhY3RvcihFbnRyeVBvaW50IGVudHJ5UG9pbnQpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKQEAgLTk4LDYgKzEwMCwxMCBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QXVkaW9QcmVzZW50YXRpb25zKHNpemVfdCB0cmFja0lkeCwgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKIAorICAgIHN0YXR1c190IHNldExvZ1Nlc3Npb25JZChjb25zdCBTdHJpbmc4JiBsb2dTZXNzaW9uSWQpOworCisgICAgY29uc3QgY2hhciogZ2V0TmFtZSgpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVNZWRpYUV4dHJhY3RvcigpOwogCkBAIC0xMjgsNiArMTM0LDggQEAKICAgICAgICAgdWludDMyX3QgbVRyYWNrRmxhZ3M7ICAvLyBiaXRtYXNrIG9mICJUcmFja0ZsYWdzIgogICAgIH07CiAKKyAgICBjb25zdCBFbnRyeVBvaW50IG1FbnRyeVBvaW50OworCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAogICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwpAQCAtMTM5LDYgKzE0Nyw4IEBACiAgICAgaW50NjRfdCBtVG90YWxCaXRyYXRlOyAgLy8gaW4gYml0cy9zZWMKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogCisgICAgdm9pZCBzZXRFbnRyeVBvaW50VG9SZW1vdGVNZWRpYUV4dHJhY3RvcigpOworCiAgICAgc3NpemVfdCBmZXRjaEFsbFRyYWNrU2FtcGxlcygKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IC0xbGwsCiAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oCmluZGV4IDBiZTFhNTIuLmI4YTNjMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmgKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCwxMSArMzEsMjAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgcGlkKTsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UHJvY2Vzc0luZm8oKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUHJvY2Vzc0luZm9PdmVycmlkZSB7CisgICAgICAgIGludCBwcm9jU3RhdGU7CisgICAgICAgIGludCBvb21TY29yZTsKKyAgICB9OworICAgIHN0ZDo6bXV0ZXggbU92ZXJyaWRlTG9jazsKKyAgICBzdGQ6Om1hcDxpbnQsIFByb2Nlc3NJbmZvT3ZlcnJpZGU+IG1PdmVycmlkZU1hcCBHVUFSREVEX0JZKG1PdmVycmlkZUxvY2spOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJvY2Vzc0luZm8pOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oCmluZGV4IGIzOTExMmEuLjkyNjAxODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmgKQEAgLTI0LDYgKzI0LDggQEAKIHN0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkUGlkKGludCBwaWQpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpOworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+UHJvY2Vzc0luZm9JbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAppbmRleCBkODJiZThhLi5kNjA1Y2RhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZURhdGFTb3VyY2UuaApAQCAtNDEsNiArNDEsMTEgQEAKICAgICAgICAgY2xvc2UoKTsKICAgICB9CiAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRJTWVtb3J5KCkgZmFpbGVkLCBtTWVtb3J5IGlzIG51bGxwdHIiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtTWVtb3J5OwogICAgIH0KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewpAQCAtNDgsMTkgKzUzLDM1IEBACiAgICAgICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKICAgICAgICAgICAgIHNpemUgPSBrQnVmZmVyU2l6ZTsKICAgICAgICAgfQorCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1Tb3VyY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInJlYWRBdCgpIGZhaWxlZCwgbVNvdXJjZSBpcyBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbU1lbW9yeS0+dW5zZWN1cmVQb2ludGVyKCksIHNpemUpOwogICAgIH0KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtU291cmNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRTaXplKCkgZmFpbGVkLCBtU291cmNlIGlzIG51bGxwdHIiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShzaXplKTsKICAgICB9CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgewogICAgICAgICAvLyBQcm90ZWN0IHN0cm9uZyBwb2ludGVyIGFzc2lnbm1lbnRzLiBUaGlzIGFsc28gY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBiaW5kZXIKICAgICAgICAgLy8gY2xlYW4tdXAgcHJvY2VkdXJlIHdoaWNoIGlzIHJ1bm5pbmcgb24gYSBzZXBhcmF0ZSB0aHJlYWQuCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DbG9zZUxvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIG1Tb3VyY2UgPSBudWxscHRyOwogICAgICAgICBtTWVtb3J5ID0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRGbGFncygpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBpZiAobVNvdXJjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0U2l6ZSgpIGZhaWxlZCwgbVNvdXJjZSBpcyBudWxscHRyIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gbVNvdXJjZS0+ZmxhZ3MoKTsKICAgICB9CiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgIHsKQEAgLTc1LDkgKzk2LDEwIEBACiAgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKICAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwogICAgIFN0cmluZzggbU5hbWU7Ci0gICAgTXV0ZXggbUNsb3NlTG9jazsKKyAgICBNdXRleCBtTG9jazsKIAogICAgIGV4cGxpY2l0IFJlbW90ZURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrQnVmZmVyU2l6ZSwgIlJlbW90ZURhdGFTb3VyY2UiKTsKICAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoa0J1ZmZlclNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDJjZTdiYzcuLjlhZDkwZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTQyLDYgKzQyLDggQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKICAgICB2aXJ0dWFsIFN0cmluZzggbmFtZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RW50cnlQb2ludChFbnRyeVBvaW50IGVudHJ5UG9pbnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9nU2Vzc2lvbklkKGNvbnN0IFN0cmluZzgmIGxvZ1Nlc3Npb25JZCk7CiAKIHByaXZhdGU6CiAgICAgTWVkaWFFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaAppbmRleCBhZTU1YzY1Li4zNWIzZmEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKQEAgLTM4LDYgKzM4LDggQEAKICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgcm90YXRpb24sIGludCB1c2FnZSwgYm9vbCByZWNvbm5lY3QpOwogdm9pZCBzZXROYXRpdmVXaW5kb3dIZHJNZXRhZGF0YSgKICAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIEhEUlN0YXRpY0luZm8gKmluZm8gLyogbm9ubnVsbCAqLyk7CitzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dSb3RhdGlvbigKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIGludCByb3RhdGlvbik7CiBzdGF0dXNfdCBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8pOwogc3RhdHVzX3QgbmF0aXZlV2luZG93Q29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwogc3RhdHVzX3QgbmF0aXZlV2luZG93RGlzY29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCmluZGV4IDJiOWI3NTkuLjE2NzMxMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwotdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCitzdGF0dXNfdCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwogCiAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBOQUwgc3RhcnQgY29kZSBpbiBidWZmZXIgb2Ygc2l6ZSB8bGVuZ3RofCBzdGFydGluZyBhdCB8ZGF0YXwsIG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggZmJiMmQwYy4uYTk3MDIyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMSwxMiArMSwzMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X21wZWcydHNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbXBlZzJ0c19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJBbm90aGVyUGFja2V0U291cmNlLmNwcCIsCiAgICAgICAgICJBVFNQYXJzZXIuY3BwIiwKICAgICAgICAgIkNhc01hbmFnZXIuY3BwIiwKICAgICAgICAgIkVTUXVldWUuY3BwIiwKLSAgICAgICAgIkhsc1NhbXBsZURlY3J5cHRvci5jcHAiLAogICAgIF0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTI4LDcgKzQ2LDYgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLApAQCAtMzYsOSArNTMsMTAgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCkBAIC00OCw0ICs2NiwzOSBAQAogICAgIF0sCiAKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnRfZGVmYXVsdHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREVOQUJMRV9DUllQVE8iLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJIbHNTYW1wbGVEZWNyeXB0b3IuY3BwIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCBlYTVkMmRlLi4xOTJiYTc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KIAotI2lmbmRlZiBfX0FORFJPSURfQVBFWF9fCisjaWZkZWYgRU5BQkxFX0NSWVBUTwogI2luY2x1ZGUgIkhsc1NhbXBsZURlY3J5cHRvci5oIgogI2VuZGlmCiAKQEAgLTU1LDEwICs1NSwxMCBAQAogICAgIC8vIENyZWF0ZSB0aGUgZGVjcnlwdG9yIGFueXdheSBzaW5jZSB3ZSBkb24ndCBrbm93IHRoZSB1c2UtY2FzZSB1bmxlc3Mga2V5IGlzIHByb3ZpZGVkCiAgICAgLy8gV29uJ3QgZGVjcnlwdCBpZiBrZXkgaW5mbyBub3QgYXZhaWxhYmxlIChlLmcuLCBzY2FubmVyL2V4dHJhY3RvciBqdXN0IHBhcnNpbmcgdHMgZmlsZXMpCiAgICAgbVNhbXBsZURlY3J5cHRvciA9IGlzU2FtcGxlRW5jcnlwdGVkKCkgPwotI2lmZGVmIF9fQU5EUk9JRF9BUEVYX18KLSAgICAgICAgbmV3IFNhbXBsZURlY3J5cHRvcgotI2Vsc2UKKyNpZmRlZiBFTkFCTEVfQ1JZUFRPCiAgICAgICAgIG5ldyBIbHNTYW1wbGVEZWNyeXB0b3IKKyNlbHNlCisgICAgICAgIG5ldyBTYW1wbGVEZWNyeXB0b3IKICNlbmRpZgogICAgICAgICA6IE5VTEw7CiB9CkBAIC0xNzIsMjkgKzE3MiwyNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB1bnNpZ25lZCBic21vZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICBiaXRzLnNraXBCaXRzKDMpOyAvLyBic21vZAogICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOwotICAgIHVuc2lnbmVkIGNtaXhsZXYgX191bnVzZWQgPSAwOwotICAgIHVuc2lnbmVkIHN1cm1peGxldiBfX3VudXNlZCA9IDA7Ci0gICAgdW5zaWduZWQgZHN1cm1vZCBfX3VudXNlZCA9IDA7CiAKICAgICBpZiAoKGFjbW9kICYgMSkgPiAwICYmIGFjbW9kICE9IDEpIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGNtaXhsZXYgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vY21peGxldgogICAgIH0KICAgICBpZiAoKGFjbW9kICYgNCkgPiAwKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBzdXJtaXhsZXYgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vc3VybWl4bGV2CiAgICAgfQogICAgIGlmIChhY21vZCA9PSAyKSB7CiAgICAgICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBkc3VybW9kID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvL2RzdXJtb2QKICAgICB9CiAKICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMSkgewpAQCAtMjY5LDcgKzI2Niw3IEBACiAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKLSAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy8gbnVtYmxrc2NvZAogICAgIH0KIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOwpAQCAtMTA4Nyw3ICsxMDg0LDcgQEAKICAgICB9CiAgICAgdW5zaWduZWQgbnVtQVVzID0gYml0cy5nZXRCaXRzKDgpOwogICAgIGJpdHMuc2tpcEJpdHMoOCk7Ci0gICAgdW5zaWduZWQgcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOworICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIHF1YW50aXphdGlvbl93b3JkX2xlbmd0aAogICAgIHVuc2lnbmVkIGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGJpdHMuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBudW1fY2hhbm5lbHMgPSBiaXRzLmdldEJpdHMoMyk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9URVNUX01BUFBJTkcKaW5kZXggYjI1ZDczMi4uOWY0YmJkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9URVNUX01BUFBJTkcKQEAgLTEsNyArMSw5IEBACiAvLyBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMKIHsKLSAgInByZXN1Ym1pdCI6IFsKLSAgICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50Ci0gICAgLy97ICJuYW1lIjogIk1wZWcydHNVbml0VGVzdCIgfQorICAvLyB0ZXN0cyB3aGljaCByZXF1aXJlIGR5bmFtaWMgY29udGVudAorICAvLyBpbnZva2Ugd2l0aDogYXRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorICAvLyBUT0RPKGIvMTQ4MDk0MDU5KTogdW5pdCB0ZXN0cyBub3QgYWxsb3dlZCB0byBkb3dubG9hZCBjb250ZW50CisgICJkeW5hbWljLXByZXN1Ym1pdCI6IFsKKyAgICB7ICJuYW1lIjogIk1wZWcydHNVbml0VGVzdCIgfQogICBdCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCmluZGV4IGJhY2YyM2IuLjQ2NGIwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCkBAIC0xNCwxMyArMTQsMjQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWNjX3Rlc3QgeworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbXBlZzJ0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbXBlZzJ0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0ewogICAgIG5hbWU6ICJNcGVnMnRzVW5pdFRlc3QiLAogICAgIGd0ZXN0OiB0cnVlLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAogCiAgICAgc3JjczogWwotICAgICAgICAiTXBlZzJ0c1VuaXRUZXN0LmNwcCIsCisgICAgICAgICJNcGVnMnRzVW5pdFRlc3QuY3BwIgogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCmluZGV4IGVlZjljZTMuLmViMTUwMzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PbXhHcmFwaGljQnVmZmVyU291cmNlLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dPbXhOb2RlLmg+CkBAIC00MSwyMSArNDEsMjEgQEAKIGNvbnN0ZXhwciBzaXplX3Qga01heE5vZGVJbnN0YW5jZXMgPSAoMSA8PCAxNik7CiAKIE9teDo6T214KCkgOgotICAgIG1NYXN0ZXIobmV3IE9NWE1hc3RlcigpKSwKKyAgICBtU3RvcmUobmV3IE9NWFN0b3JlKCkpLAogICAgIG1QYXJzZXIoKSB7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CiAgICAgKHZvaWQpbVBhcnNlci5wYXJzZVhtbFBhdGgobVBhcnNlci5kZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOwogfQogCiBPbXg6On5PbXgoKSB7Ci0gICAgZGVsZXRlIG1NYXN0ZXI7CisgICAgZGVsZXRlIG1TdG9yZTsKIH0KIAogUmV0dXJuPHZvaWQ+IE9teDo6bGlzdE5vZGVzKGxpc3ROb2Rlc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6bGlzdDw6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8+IGxpc3Q7CiAgICAgY2hhciBjb21wb25lbnROYW1lWzI1Nl07CiAgICAgZm9yIChPTVhfVTMyIGluZGV4ID0gMDsKLSAgICAgICAgICAgIG1NYXN0ZXItPmVudW1lcmF0ZUNvbXBvbmVudHMoCisgICAgICAgICAgICBtU3RvcmUtPmVudW1lcmF0ZUNvbXBvbmVudHMoCiAgICAgICAgICAgICBjb21wb25lbnROYW1lLCBzaXplb2YoY29tcG9uZW50TmFtZSksIGluZGV4KSA9PSBPTVhfRXJyb3JOb25lOwogICAgICAgICAgICAgKytpbmRleCkgewogICAgICAgICBsaXN0LnB1c2hfYmFjayg6OmFuZHJvaWQ6OklPTVg6OkNvbXBvbmVudEluZm8oKSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIGluZm8ubU5hbWUgPSBjb21wb25lbnROYW1lOwogICAgICAgICA6OmFuZHJvaWQ6OlZlY3Rvcjw6OmFuZHJvaWQ6OlN0cmluZzg+IHJvbGVzOwogICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9Ci0gICAgICAgICAgICAgICAgbU1hc3Rlci0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOworICAgICAgICAgICAgICAgIG1TdG9yZS0+Z2V0Um9sZXNPZkNvbXBvbmVudChjb21wb25lbnROYW1lLCAmcm9sZXMpOwogICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IHJvbGVzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgaW5mby5tUm9sZXMucHVzaF9iYWNrKHJvbGVzW2ldKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgIHRoaXMsIG5ldyBMV09teE9ic2VydmVyKG9ic2VydmVyKSwgbmFtZS5jX3N0cigpKTsKIAogICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqaGFuZGxlOwotICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1NYXN0ZXItPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKKyAgICAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBtU3RvcmUtPm1ha2VDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICZPTVhOb2RlSW5zdGFuY2U6OmtDYWxsYmFja3MsCiAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZ2V0KCksICZoYW5kbGUpOwogCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX0Vycm9yTm9uZTsKICAgICBpZiAoaW5zdGFuY2UtPmhhbmRsZSgpICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbU1hc3Rlci0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBlcnIgPSBtU3RvcmUtPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxPTVhfQ09NUE9ORU5UVFlQRSo+KGluc3RhbmNlLT5oYW5kbGUoKSkpOwogICAgIH0KICAgICByZXR1cm4gU3RhdHVzRnJvbU9NWEVycm9yKGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCmluZGV4IDY3ZjQ3OGUuLmI1YzExNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwCkBAIC01NCw2ICs1NCwyNCBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBpZiAoIW5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBhbnlOb2RlID0gbm9kZXMuY2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBmaXJzdCA9IGFueU5vZGUtPmNiZWdpbigpOworICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGFueU5vZGUtPmNlbmQoKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA6IG5vZGVzKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQxID0gZmlyc3Q7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDIgPSBuYW1lLmNiZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdDEgIT0gbGFzdCAmJiBpdDIgIT0gbmFtZS5jZW5kKCkgJiYgdG9sb3dlcigqaXQxKSA9PSB0b2xvd2VyKCppdDIpOworICAgICAgICAgICAgICAgICAgICArK2l0MSwgKytpdDIpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgPSBpdDE7CisgICAgICAgIH0KKyAgICAgICAgbVByZWZpeCA9IHN0ZDo6c3RyaW5nKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJvbXggY29tbW9uIHByZWZpeDogJyIgPDwgbVByZWZpeC5jX3N0cigpIDw8ICInIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiBubyBub2RlcyI7CisgICAgfQorCiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyOwogICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKHhtbE5hbWVzLCBzZWFyY2hEaXJzKTsKICAgICBpZiAocHJvZmlsaW5nUmVzdWx0c1htbFBhdGggIT0gbnVsbHB0cikgewpAQCAtMTEyLDggKzEzMCw2IEBACiAgICAgICAgIG1Sb2xlTGlzdFtpXSA9IHN0ZDo6bW92ZShyb2xlKTsKICAgICAgICAgKytpOwogICAgIH0KLQotICAgIG1QcmVmaXggPSBwYXJzZXIuZ2V0Q29tbW9uUHJlZml4KCk7CiB9CiAKIE9teFN0b3JlOjp+T214U3RvcmUoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDdkMjE3ZWIuLmY3YmYzYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSBvdmVycmlkZSB7CiAgICAgICAgIE1lc3NhZ2UgdE1zZzsKICAgICAgICAgdE1zZy50eXBlID0gTWVzc2FnZTo6VHlwZTo6RVZFTlQ7Ci0gICAgICAgIHRNc2cuZmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCAwKTsKKyAgICAgICAgdE1zZy5mZW5jZS5zZXRUbyhuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCAwKSwgLyogc2hvdWxkT3duID0gKi8gdHJ1ZSk7CiAgICAgICAgIHRNc2cuZGF0YS5ldmVudERhdGEuZXZlbnQgPSB1aW50MzJfdChPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkKTsKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMSA9IGRhdGFTcGFjZTsKICAgICAgICAgdE1zZy5kYXRhLmV2ZW50RGF0YS5kYXRhMiA9IGFzcGVjdHM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCmluZGV4IDc4YjRmMTkuLjU0YzU2OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMjIgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9vbXhfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfb214X2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtNyw3ICsyNiw3IEBACiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiT01YTWFzdGVyLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLAogICAgICAgICAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLApAQCAtMjI3LDQgKzI0NiwzIEBACiAgICAgfSwKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRiMWY1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk9NWE1hc3RlciIKLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLQotI2luY2x1ZGUgPHZuZGtzdXBwb3J0L2xpbmtlci5oPgotCi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU9NWE1hc3Rlcjo6T01YTWFzdGVyKCkgewotCi0gICAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7Ci0gICAgY2hhciBmaWxlbmFtZVsyMF07Ci0gICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIvcHJvYy8lZC9jb21tIiwgcGlkKTsKLSAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgQUxPR1coImNvdWxkbid0IGRldGVybWluZSBwcm9jZXNzIG5hbWUiKTsKLSAgICAgIHN0cmxjcHkobVByb2Nlc3NOYW1lLCAiPHVua25vd24+Iiwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzc2l6ZV90IGxlbiA9IHJlYWQoZmQsIG1Qcm9jZXNzTmFtZSwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOwotICAgICAgaWYgKGxlbiA8IDIpIHsKLSAgICAgICAgQUxPR1coImNvdWxkbid0IGRldGVybWluZSBwcm9jZXNzIG5hbWUiKTsKLSAgICAgICAgc3RybGNweShtUHJvY2Vzc05hbWUsICI8dW5rbm93bj4iLCBzaXplb2YobVByb2Nlc3NOYW1lKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyB0aGUgbmFtZSBpcyBuZXdsaW5lIHRlcm1pbmF0ZWQsIHNvIGVyYXNlIHRoZSBuZXdsaW5lCi0gICAgICAgIG1Qcm9jZXNzTmFtZVtsZW4gLSAxXSA9IDA7Ci0gICAgICB9Ci0gICAgICBjbG9zZShmZCk7Ci0gICAgfQotCi0gICAgYWRkVmVuZG9yUGx1Z2luKCk7Ci0gICAgYWRkUGxhdGZvcm1QbHVnaW4oKTsKLX0KLQotT01YTWFzdGVyOjp+T01YTWFzdGVyKCkgewotICAgIGNsZWFyUGx1Z2lucygpOwotfQotCi12b2lkIE9NWE1hc3Rlcjo6YWRkVmVuZG9yUGx1Z2luKCkgewotICAgIGFkZFBsdWdpbigibGlic3RhZ2VmcmlnaHRody5zbyIpOwotfQotCi12b2lkIE9NWE1hc3Rlcjo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7Ci0gICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbi5zbyIpOwotfQotCi12b2lkIE9NWE1hc3Rlcjo6YWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpIHsKLSAgICBpZiAoOjphbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eSgidmVuZG9yLm1lZGlhLm9teCIsIGludDY0X3QoMSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZvaWQgKmxpYkhhbmRsZSA9IGFuZHJvaWRfbG9hZF9zcGhhbF9saWJyYXJ5KGxpYm5hbWUsIFJUTERfTk9XKTsKLQotICAgIGlmIChsaWJIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHlwZWRlZiBPTVhQbHVnaW5CYXNlICooKkNyZWF0ZU9NWFBsdWdpbkZ1bmMpKCk7Ci0gICAgQ3JlYXRlT01YUGx1Z2luRnVuYyBjcmVhdGVPTVhQbHVnaW4gPQotICAgICAgICAoQ3JlYXRlT01YUGx1Z2luRnVuYylkbHN5bSgKLSAgICAgICAgICAgICAgICBsaWJIYW5kbGUsICJjcmVhdGVPTVhQbHVnaW4iKTsKLSAgICBpZiAoIWNyZWF0ZU9NWFBsdWdpbikKLSAgICAgICAgY3JlYXRlT01YUGx1Z2luID0gKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbGliSGFuZGxlLCAiX1pON2FuZHJvaWQxNWNyZWF0ZU9NWFBsdWdpbkV2Iik7Ci0KLSAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBudWxscHRyOwotICAgIGlmIChjcmVhdGVPTVhQbHVnaW4pIHsKLSAgICAgICAgcGx1Z2luID0gKCpjcmVhdGVPTVhQbHVnaW4pKCk7Ci0gICAgfQotCi0gICAgaWYgKHBsdWdpbikgewotICAgICAgICBtUGx1Z2lucy5wdXNoX2JhY2soeyBwbHVnaW4sIGxpYkhhbmRsZSB9KTsKLSAgICAgICAgYWRkUGx1Z2luKHBsdWdpbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYW5kcm9pZF91bmxvYWRfc3BoYWxfbGlicmFyeShsaWJIYW5kbGUpOwotICAgIH0KLX0KLQotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgT01YX1UzMiBpbmRleCA9IDA7Ci0KLSAgICBjaGFyIG5hbWVbMTI4XTsKLSAgICBPTVhfRVJST1JUWVBFIGVycjsKLSAgICB3aGlsZSAoKGVyciA9IHBsdWdpbi0+ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2l6ZW9mKG5hbWUpLCBpbmRleCsrKSkgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBTdHJpbmc4IG5hbWU4KG5hbWUpOwotCi0gICAgICAgIGlmIChtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkobmFtZTgpID49IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJBIGNvbXBvbmVudCBvZiBuYW1lICclcycgYWxyZWFkeSBleGlzdHMsIGlnbm9yaW5nIHRoaXMgb25lLiIsCi0gICAgICAgICAgICAgICAgIG5hbWU4LnN0cmluZygpKTsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtUGx1Z2luQnlDb21wb25lbnROYW1lLmFkZChuYW1lOCwgcGx1Z2luKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vTW9yZSkgewotICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICV6dSAiCi0gICAgICAgICAgICAgImNvbXBvbmVudHMiLCBlcnIsIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgT01YTWFzdGVyOjpjbGVhclBsdWdpbnMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKLSAgICBtUGx1Z2luQnlJbnN0YW5jZS5jbGVhcigpOwotCi0gICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveU9NWFBsdWdpbkZ1bmMpKE9NWFBsdWdpbkJhc2UqKTsKLSAgICBmb3IgKGNvbnN0IFBsdWdpbiAmcGx1Z2luIDogbVBsdWdpbnMpIHsKLSAgICAgICAgRGVzdHJveU9NWFBsdWdpbkZ1bmMgZGVzdHJveU9NWFBsdWdpbiA9Ci0gICAgICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tTGliSGFuZGxlLCAiZGVzdHJveU9NWFBsdWdpbiIpOwotICAgICAgICBpZiAoZGVzdHJveU9NWFBsdWdpbikKLSAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4ocGx1Z2luLm1PbXgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWxldGUgcGx1Z2luLm1PbXg7Ci0KLSAgICAgICAgYW5kcm9pZF91bmxvYWRfc3BoYWxfbGlicmFyeShwbHVnaW4ubUxpYkhhbmRsZSk7Ci0gICAgfQotCi0gICAgbVBsdWdpbnMuY2xlYXIoKTsKLX0KLQotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6Om1ha2VDb21wb25lbnRJbnN0YW5jZSgKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICBPTVhfUFRSIGFwcERhdGEsCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KSB7Ci0gICAgQUxPR0koIm1ha2VDb21wb25lbnRJbnN0YW5jZSglcykgaW4gJXMgcHJvY2VzcyIsIG5hbWUsIG1Qcm9jZXNzTmFtZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgICpjb21wb25lbnQgPSBOVUxMOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuaW5kZXhPZktleShTdHJpbmc4KG5hbWUpKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOwotICAgIH0KLQotICAgIE9NWFBsdWdpbkJhc2UgKnBsdWdpbiA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUudmFsdWVBdChpbmRleCk7Ci0gICAgT01YX0VSUk9SVFlQRSBlcnIgPQotICAgICAgICBwbHVnaW4tPm1ha2VDb21wb25lbnRJbnN0YW5jZShuYW1lLCBjYWxsYmFja3MsIGFwcERhdGEsIGNvbXBvbmVudCk7Ci0KLSAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtUGx1Z2luQnlJbnN0YW5jZS5hZGQoKmNvbXBvbmVudCwgcGx1Z2luKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1QbHVnaW5CeUluc3RhbmNlLmluZGV4T2ZLZXkoY29tcG9uZW50KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKLSAgICB9Ci0KLSAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlJbnN0YW5jZS52YWx1ZUF0KGluZGV4KTsKLSAgICBtUGx1Z2luQnlJbnN0YW5jZS5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgIHJldHVybiBwbHVnaW4tPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQpOwotfQotCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6ZW51bWVyYXRlQ29tcG9uZW50cygKLSAgICAgICAgT01YX1NUUklORyBuYW1lLAotICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgT01YX1UzMiBpbmRleCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzaXplX3QgbnVtQ29tcG9uZW50cyA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpOwotCi0gICAgaWYgKGluZGV4ID49IG51bUNvbXBvbmVudHMpIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vTW9yZTsKLSAgICB9Ci0KLSAgICBjb25zdCBTdHJpbmc4ICZuYW1lOCA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUua2V5QXQoaW5kZXgpOwotCi0gICAgQ0hFQ0soc2l6ZSA+PSAxICsgbmFtZTguc2l6ZSgpKTsKLSAgICBzdHJjcHkobmFtZSwgbmFtZTguc3RyaW5nKCkpOwotCi0gICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Ci19Ci0KLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjpnZXRSb2xlc09mQ29tcG9uZW50KAotICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICBWZWN0b3I8U3RyaW5nOD4gKnJvbGVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJvbGVzLT5jbGVhcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuaW5kZXhPZktleShTdHJpbmc4KG5hbWUpKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOwotICAgIH0KLQotICAgIE9NWFBsdWdpbkJhc2UgKnBsdWdpbiA9IG1QbHVnaW5CeUNvbXBvbmVudE5hbWUudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHBsdWdpbi0+Z2V0Um9sZXNPZkNvbXBvbmVudChuYW1lLCByb2xlcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGFjNDIzNzMuLmJlYmQ1MTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZmVlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPTVhTdG9yZSIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCisjaW5jbHVkZSA8dm5ka3N1cHBvcnQvbGlua2VyLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworT01YU3RvcmU6Ok9NWFN0b3JlKCkgeworCisgICAgcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisgICAgY2hhciBmaWxlbmFtZVsyMF07CisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIvcHJvYy8lZC9jb21tIiwgcGlkKTsKKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgQUxPR1coImNvdWxkbid0IGRldGVybWluZSBwcm9jZXNzIG5hbWUiKTsKKyAgICAgIHN0cmxjcHkobVByb2Nlc3NOYW1lLCAiPHVua25vd24+Iiwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOworICAgIH0gZWxzZSB7CisgICAgICBzc2l6ZV90IGxlbiA9IHJlYWQoZmQsIG1Qcm9jZXNzTmFtZSwgc2l6ZW9mKG1Qcm9jZXNzTmFtZSkpOworICAgICAgaWYgKGxlbiA8IDIpIHsKKyAgICAgICAgQUxPR1coImNvdWxkbid0IGRldGVybWluZSBwcm9jZXNzIG5hbWUiKTsKKyAgICAgICAgc3RybGNweShtUHJvY2Vzc05hbWUsICI8dW5rbm93bj4iLCBzaXplb2YobVByb2Nlc3NOYW1lKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB0aGUgbmFtZSBpcyBuZXdsaW5lIHRlcm1pbmF0ZWQsIHNvIGVyYXNlIHRoZSBuZXdsaW5lCisgICAgICAgIG1Qcm9jZXNzTmFtZVtsZW4gLSAxXSA9IDA7CisgICAgICB9CisgICAgICBjbG9zZShmZCk7CisgICAgfQorCisgICAgYWRkVmVuZG9yUGx1Z2luKCk7CisgICAgYWRkUGxhdGZvcm1QbHVnaW4oKTsKK30KKworT01YU3RvcmU6On5PTVhTdG9yZSgpIHsKKyAgICBjbGVhclBsdWdpbnMoKTsKK30KKwordm9pZCBPTVhTdG9yZTo6YWRkVmVuZG9yUGx1Z2luKCkgeworICAgIGFkZFBsdWdpbigibGlic3RhZ2VmcmlnaHRody5zbyIpOworfQorCit2b2lkIE9NWFN0b3JlOjphZGRQbGF0Zm9ybVBsdWdpbigpIHsKKyAgICBhZGRQbHVnaW4oImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXhfcGx1Z2luLnNvIik7Cit9CisKK3ZvaWQgT01YU3RvcmU6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7CisgICAgaWYgKDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoInZlbmRvci5tZWRpYS5vbXgiLCBpbnQ2NF90KDEpKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShsaWJuYW1lLCBSVExEX05PVyk7CisKKyAgICBpZiAobGliSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHR5cGVkZWYgT01YUGx1Z2luQmFzZSAqKCpDcmVhdGVPTVhQbHVnaW5GdW5jKSgpOworICAgIENyZWF0ZU9NWFBsdWdpbkZ1bmMgY3JlYXRlT01YUGx1Z2luID0KKyAgICAgICAgKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgbGliSGFuZGxlLCAiY3JlYXRlT01YUGx1Z2luIik7CisgICAgaWYgKCFjcmVhdGVPTVhQbHVnaW4pCisgICAgICAgIGNyZWF0ZU9NWFBsdWdpbiA9IChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAorICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOworCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbnVsbHB0cjsKKyAgICBpZiAoY3JlYXRlT01YUGx1Z2luKSB7CisgICAgICAgIHBsdWdpbiA9ICgqY3JlYXRlT01YUGx1Z2luKSgpOworICAgIH0KKworICAgIGlmIChwbHVnaW4pIHsKKyAgICAgICAgbVBsdWdpbnMucHVzaF9iYWNrKHsgcGx1Z2luLCBsaWJIYW5kbGUgfSk7CisgICAgICAgIGFkZFBsdWdpbihwbHVnaW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkobGliSGFuZGxlKTsKKyAgICB9Cit9CisKK3ZvaWQgT01YU3RvcmU6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgT01YX1UzMiBpbmRleCA9IDA7CisKKyAgICBjaGFyIG5hbWVbMTI4XTsKKyAgICBPTVhfRVJST1JUWVBFIGVycjsKKyAgICB3aGlsZSAoKGVyciA9IHBsdWdpbi0+ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2l6ZW9mKG5hbWUpLCBpbmRleCsrKSkgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTdHJpbmc4IG5hbWU4KG5hbWUpOworCisgICAgICAgIGlmIChtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkobmFtZTgpID49IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBIGNvbXBvbmVudCBvZiBuYW1lICclcycgYWxyZWFkeSBleGlzdHMsIGlnbm9yaW5nIHRoaXMgb25lLiIsCisgICAgICAgICAgICAgICAgIG5hbWU4LnN0cmluZygpKTsKKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBtUGx1Z2luQnlDb21wb25lbnROYW1lLmFkZChuYW1lOCwgcGx1Z2luKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vTW9yZSkgeworICAgICAgICBBTE9HRSgiT01YIHBsdWdpbiBmYWlsZWQgdy8gZXJyb3IgMHglMDh4IGFmdGVyIHJlZ2lzdGVyaW5nICV6dSAiCisgICAgICAgICAgICAgImNvbXBvbmVudHMiLCBlcnIsIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgT01YU3RvcmU6OmNsZWFyUGx1Z2lucygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5jbGVhcigpOworICAgIG1QbHVnaW5CeUluc3RhbmNlLmNsZWFyKCk7CisKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95T01YUGx1Z2luRnVuYykoT01YUGx1Z2luQmFzZSopOworICAgIGZvciAoY29uc3QgUGx1Z2luICZwbHVnaW4gOiBtUGx1Z2lucykgeworICAgICAgICBEZXN0cm95T01YUGx1Z2luRnVuYyBkZXN0cm95T01YUGx1Z2luID0KKyAgICAgICAgICAgIChEZXN0cm95T01YUGx1Z2luRnVuYylkbHN5bSgKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luLm1MaWJIYW5kbGUsICJkZXN0cm95T01YUGx1Z2luIik7CisgICAgICAgIGlmIChkZXN0cm95T01YUGx1Z2luKQorICAgICAgICAgICAgZGVzdHJveU9NWFBsdWdpbihwbHVnaW4ubU9teCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbGV0ZSBwbHVnaW4ubU9teDsKKworICAgICAgICBhbmRyb2lkX3VubG9hZF9zcGhhbF9saWJyYXJ5KHBsdWdpbi5tTGliSGFuZGxlKTsKKyAgICB9CisKKyAgICBtUGx1Z2lucy5jbGVhcigpOworfQorCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqKmNvbXBvbmVudCkgeworICAgIEFMT0dJKCJtYWtlQ29tcG9uZW50SW5zdGFuY2UoJXMpIGluICVzIHByb2Nlc3MiLCBuYW1lLCBtUHJvY2Vzc05hbWUpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAqY29tcG9uZW50ID0gTlVMTDsKKworICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkoU3RyaW5nOChuYW1lKSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKKyAgICB9CisKKyAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLnZhbHVlQXQoaW5kZXgpOworICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KKyAgICAgICAgcGx1Z2luLT5tYWtlQ29tcG9uZW50SW5zdGFuY2UobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworCisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgbVBsdWdpbkJ5SW5zdGFuY2UuYWRkKCpjb21wb25lbnQsIHBsdWdpbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3NpemVfdCBpbmRleCA9IG1QbHVnaW5CeUluc3RhbmNlLmluZGV4T2ZLZXkoY29tcG9uZW50KTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlJbnN0YW5jZS52YWx1ZUF0KGluZGV4KTsKKyAgICBtUGx1Z2luQnlJbnN0YW5jZS5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKworICAgIHJldHVybiBwbHVnaW4tPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQpOworfQorCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjplbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBPTVhfVTMyIGluZGV4KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHNpemVfdCBudW1Db21wb25lbnRzID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5zaXplKCk7CisKKyAgICBpZiAoaW5kZXggPj0gbnVtQ29tcG9uZW50cykgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9Nb3JlOworICAgIH0KKworICAgIGNvbnN0IFN0cmluZzggJm5hbWU4ID0gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZS5rZXlBdChpbmRleCk7CisKKyAgICBDSEVDSyhzaXplID49IDEgKyBuYW1lOC5zaXplKCkpOworICAgIHN0cmNweShuYW1lLCBuYW1lOC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBPTVhTdG9yZTo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICByb2xlcy0+Y2xlYXIoKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLmluZGV4T2ZLZXkoU3RyaW5nOChuYW1lKSk7CisKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50TmFtZTsKKyAgICB9CisKKyAgICBPTVhQbHVnaW5CYXNlICpwbHVnaW4gPSBtUGx1Z2luQnlDb21wb25lbnROYW1lLnZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBwbHVnaW4tPmdldFJvbGVzT2ZDb21wb25lbnQobmFtZSwgcm9sZXMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggMWI4NDkzYS4uNDliMmRlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0xNzIsNiArMTcyLDggQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjNCIsICJhdWRpb19lbmNvZGVyLmFjNCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCiAgICAgICAgICAgICAiaW1hZ2VfZGVjb2Rlci5oZWljIiwgImltYWdlX2VuY29kZXIuaGVpYyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BVklGLAorICAgICAgICAgICAgImltYWdlX2RlY29kZXIuYXZpZiIsICJpbWFnZV9lbmNvZGVyLmF2aWYiIH0sCiAgICAgfTsKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bU1pbWVUb1JvbGUgPQpAQCAtMzU0LDcgKzM1Niw3IEBACiAgICAgRGVzY3JpYmVDb2xvckZvcm1hdDJQYXJhbXMgZGVzY3JpYmVQYXJhbXM7CiAgICAgSW5pdE9NWFBhcmFtcygmZGVzY3JpYmVQYXJhbXMpOwogICAgIGRlc2NyaWJlUGFyYW1zLmVDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSljb2xvckZvcm1hdDsKLSAgICAvLyByZWFzb25hYmxlIGR1bW15IHZhbHVlcworICAgIC8vIHJlYXNvbmFibGUgaW5pdGlhbCB2YWx1ZXMgKHRoYXQgd2lsbCBiZSBvdmVyd3JpdHRlbikKICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVXaWR0aCA9IDEyODsKICAgICBkZXNjcmliZVBhcmFtcy5uRnJhbWVIZWlnaHQgPSAxMjg7CiAgICAgZGVzY3JpYmVQYXJhbXMublN0cmlkZSA9IDEyODsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBkZGI0NTlmLi40NDQxNWFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC0xNyw2ICsxNywxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTaW1wbGVTb2Z0T01YQ29tcG9uZW50IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisjaW5jbHVkZSA8T01YX0F1ZGlvRXh0Lmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC03NCw3ICs3OCw3IEBACiAKICAgICBPTVhfVTMyIHBvcnRJbmRleDsKIAotICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICBzd2l0Y2ggKChpbnQpaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmcyA9CkBAIC0xMDgsNiArMTEyLDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjRHJjUHJlc2VudGF0aW9uOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobVN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNEUkNQUkVTRU5UQVRJT05UWVBFICphYWNQcmVzUGFyYW1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUFDRFJDUFJFU0VOVEFUSU9OVFlQRSAqKXBhcmFtczsKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKGFhY1ByZXNQYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAppbmRleCA1YTQ2YjI2Li44NGFlNTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT01YTWFzdGVyOworc3RydWN0IE9NWFN0b3JlOwogc3RydWN0IE9NWE5vZGVJbnN0YW5jZTsKIAogbmFtZXNwYWNlIGhhcmR3YXJlIHsKQEAgLTUxLDcgKzUxLDcgQEAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiB1c2luZyA6OmFuZHJvaWQ6OndwOwogCi11c2luZyA6OmFuZHJvaWQ6Ok9NWE1hc3RlcjsKK3VzaW5nIDo6YW5kcm9pZDo6T01YU3RvcmU7CiB1c2luZyA6OmFuZHJvaWQ6Ok9NWE5vZGVJbnN0YW5jZTsKIAogc3RydWN0IE9teCA6IHB1YmxpYyBJT214LCBwdWJsaWMgaGlkbF9kZWF0aF9yZWNpcGllbnQgewpAQCAtNzMsNyArNzMsNyBAQAogICAgIHN0YXR1c190IGZyZWVOb2RlKHNwPE9NWE5vZGVJbnN0YW5jZT4gY29uc3QmIGluc3RhbmNlKTsKIAogcHJvdGVjdGVkOgotICAgIE9NWE1hc3RlciogbU1hc3RlcjsKKyAgICBPTVhTdG9yZSogbVN0b3JlOwogICAgIE11dGV4IG1Mb2NrOwogICAgIEtleWVkVmVjdG9yPHdwPElCYXNlPiwgc3A8T01YTm9kZUluc3RhbmNlPiA+IG1MaXZlTm9kZXM7CiAgICAgS2V5ZWRWZWN0b3I8T01YTm9kZUluc3RhbmNlKiwgd3A8SUJhc2U+ID4gbU5vZGUyT2JzZXJ2ZXI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZWFlZjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgT01YX01BU1RFUl9IXwotCi0jZGVmaW5lIE9NWF9NQVNURVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL09NWFBsdWdpbkJhc2UuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE9NWE1hc3RlciA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKLSAgICBPTVhNYXN0ZXIoKTsKLSAgICB2aXJ0dWFsIH5PTVhNYXN0ZXIoKTsKLQotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBtYWtlQ29tcG9uZW50SW5zdGFuY2UoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAotICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAotICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKLSAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGVudW1lcmF0ZUNvbXBvbmVudHMoCi0gICAgICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIE9NWF9VMzIgaW5kZXgpOwotCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFJvbGVzT2ZDb21wb25lbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcyk7Ci0KLXByaXZhdGU6Ci0gICAgY2hhciBtUHJvY2Vzc05hbWVbMTZdOwotICAgIE11dGV4IG1Mb2NrOwotICAgIHN0cnVjdCBQbHVnaW4gewotICAgICAgICBPTVhQbHVnaW5CYXNlICptT214OwotICAgICAgICB2b2lkICptTGliSGFuZGxlOwotICAgIH07Ci0gICAgTGlzdDxQbHVnaW4+IG1QbHVnaW5zOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZTsKLSAgICBLZXllZFZlY3RvcjxPTVhfQ09NUE9ORU5UVFlQRSAqLCBPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5CeUluc3RhbmNlOwotCi0gICAgdm9pZCBhZGRWZW5kb3JQbHVnaW4oKTsKLSAgICB2b2lkIGFkZFBsYXRmb3JtUGx1Z2luKCk7Ci0gICAgdm9pZCBhZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSk7Ci0gICAgdm9pZCBhZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKTsKLSAgICB2b2lkIGNsZWFyUGx1Z2lucygpOwotCi0gICAgT01YTWFzdGVyKGNvbnN0IE9NWE1hc3RlciAmKTsKLSAgICBPTVhNYXN0ZXIgJm9wZXJhdG9yPShjb25zdCBPTVhNYXN0ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE9NWF9NQVNURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaAppbmRleCBhNzYxZWY2Li41ZjMyYzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCkBAIC0zMyw3ICszMyw3IEBACiBjbGFzcyBHcmFwaGljQnVmZmVyOwogY2xhc3MgSU9NWEJ1ZmZlclNvdXJjZTsKIGNsYXNzIElPTVhPYnNlcnZlcjsKLXN0cnVjdCBPTVhNYXN0ZXI7CitzdHJ1Y3QgT01YU3RvcmU7CiBjbGFzcyBPTVhCdWZmZXI7CiB1c2luZyBJSGlkbE1lbW9yeSA9IGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKIHVzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6T214OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZjM2VkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgT01YX1NUT1JFX0hfCisKKyNkZWZpbmUgT01YX1NUT1JFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+CisKKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBPTVhTdG9yZSA6IHB1YmxpYyBPTVhQbHVnaW5CYXNlIHsKKyAgICBPTVhTdG9yZSgpOworICAgIHZpcnR1YWwgfk9NWFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOworCitwcml2YXRlOgorICAgIGNoYXIgbVByb2Nlc3NOYW1lWzE2XTsKKyAgICBNdXRleCBtTG9jazsKKyAgICBzdHJ1Y3QgUGx1Z2luIHsKKyAgICAgICAgT01YUGx1Z2luQmFzZSAqbU9teDsKKyAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsKKyAgICB9OworICAgIExpc3Q8UGx1Z2luPiBtUGx1Z2luczsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5CeUNvbXBvbmVudE5hbWU7CisgICAgS2V5ZWRWZWN0b3I8T01YX0NPTVBPTkVOVFRZUEUgKiwgT01YUGx1Z2luQmFzZSAqPiBtUGx1Z2luQnlJbnN0YW5jZTsKKworICAgIHZvaWQgYWRkVmVuZG9yUGx1Z2luKCk7CisgICAgdm9pZCBhZGRQbGF0Zm9ybVBsdWdpbigpOworICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOworICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CisgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKKworICAgIE9NWFN0b3JlKGNvbnN0IE9NWFN0b3JlICYpOworICAgIE9NWFN0b3JlICZvcGVyYXRvcj0oY29uc3QgT01YU3RvcmUgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9NWF9TVE9SRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAppbmRleCBmZWZiM2JiLi44M2NjODBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIyIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfb214X3Rlc3RzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X29teF90ZXN0c19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAib214X3Rlc3RzIiwKICAgICBndGVzdDogZmFsc2UsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2JhZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvQW5kcm9pZC5icApAQCAtMCwwICsxLDExOSBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogInJlbmRlcmZyaWdodF9kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRExPR19UQUc9XCJyZW5kZXJmcmlnaHRcIiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XdGhyZWFkLXNhZmV0eSIsCisgICAgICAgICItV3VudXNlZCIsCisgICAgICAgICItV3VucmVhY2hhYmxlLWNvZGUiLAorICAgIF0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X2RlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJyZW5kZXJmcmlnaHRfZGVmYXVsdHMiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ER0xfR0xFWFRfUFJPVE9UWVBFUyIsCisgICAgICAgICItREVHTF9FR0xFWFRfUFJPVE9UWVBFUyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MV9DTSIsCisgICAgICAgICJsaWJHTEVTdjIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic3luYyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJsaWJyZW5kZXJmcmlnaHRfc291cmNlcyIsCisgICAgc3JjczogWworICAgICAgICAiRGVzY3JpcHRpb24uY3BwIiwKKyAgICAgICAgIk1lc2guY3BwIiwKKyAgICAgICAgIlJlbmRlckVuZ2luZS5jcHAiLAorICAgICAgICAiVGV4dHVyZS5jcHAiLAorICAgIF0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImxpYnJlbmRlcmZyaWdodF9nbF9zb3VyY2VzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJnbC9HTEVTUmVuZGVyRW5naW5lLmNwcCIsCisgICAgICAgICJnbC9HTEV4dGVuc2lvbnMuY3BwIiwKKyAgICAgICAgImdsL0dMRnJhbWVidWZmZXIuY3BwIiwKKyAgICAgICAgImdsL0dMSW1hZ2UuY3BwIiwKKyAgICAgICAgImdsL0dMU2hhZG93VGV4dHVyZS5jcHAiLAorICAgICAgICAiZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImdsL0dMU2tpYVNoYWRvd1BvcnQuY3BwIiwKKyAgICAgICAgImdsL0dMVmVydGV4QnVmZmVyLmNwcCIsCisgICAgICAgICJnbC9JbWFnZU1hbmFnZXIuY3BwIiwKKyAgICAgICAgImdsL1Byb2dyYW0uY3BwIiwKKyAgICAgICAgImdsL1Byb2dyYW1DYWNoZS5jcHAiLAorICAgICAgICAiZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmNwcCIsCisgICAgICAgICJnbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmNwcCIsCisgICAgXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X3RocmVhZGVkX3NvdXJjZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRocmVhZGVkL1JlbmRlckVuZ2luZVRocmVhZGVkLmNwcCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJyZW5kZXJmcmlnaHQiLAorICAgIGRlZmF1bHRzOiBbImxpYnJlbmRlcmZyaWdodF9kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgdm5kazogeworICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgIH0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIGNsYW5nOiB0cnVlLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2Vycm9yPWZvcm1hdCIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6bGlicmVuZGVyZnJpZ2h0X3NvdXJjZXMiLAorICAgICAgICAiOmxpYnJlbmRlcmZyaWdodF9nbF9zb3VyY2VzIiwKKyAgICAgICAgIjpsaWJyZW5kZXJmcmlnaHRfdGhyZWFkZWRfc291cmNlcyIsCisgICAgXSwKKyAgICBsdG86IHsKKyAgICAgICAgdGhpbjogdHJ1ZSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnJlbmRlcmZyaWdodF9tb2NrcyIsCisgICAgZGVmYXVsdHM6IFsibGlicmVuZGVyZnJpZ2h0X2RlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAibW9jay9GcmFtZWJ1ZmZlci5jcHAiLAorICAgICAgICAibW9jay9JbWFnZS5jcHAiLAorICAgICAgICAibW9jay9SZW5kZXJFbmdpbmUuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJndGVzdCIsCisgICAgICAgICJsaWJnbW9jayIsCisgICAgXSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L0Rlc2NyaXB0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9EZXNjcmlwdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljZWExMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9EZXNjcmlwdGlvbi5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbiBEZXNjcmlwdGlvbjo6ZGF0YVNwYWNlVG9UcmFuc2ZlckZ1bmN0aW9uKHVpOjpEYXRhc3BhY2UgZGF0YVNwYWNlKSB7CisgICAgdWk6OkRhdGFzcGFjZSB0cmFuc2ZlciA9IHN0YXRpY19jYXN0PHVpOjpEYXRhc3BhY2U+KGRhdGFTcGFjZSAmIHVpOjpEYXRhc3BhY2U6OlRSQU5TRkVSX01BU0spOworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSB1aTo6RGF0YXNwYWNlOjpUUkFOU0ZFUl9TVDIwODQ6CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OlNUMjA4NDsKKyAgICAgICAgY2FzZSB1aTo6RGF0YXNwYWNlOjpUUkFOU0ZFUl9ITEc6CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkhMRzsKKyAgICAgICAgY2FzZSB1aTo6RGF0YXNwYWNlOjpUUkFOU0ZFUl9MSU5FQVI6CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkxJTkVBUjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6U1JHQjsKKyAgICB9Cit9CisKK2Jvb2wgRGVzY3JpcHRpb246Omhhc0lucHV0VHJhbnNmb3JtTWF0cml4KCkgY29uc3QgeworICAgIGNvbnN0IG1hdDQgaWRlbnRpdHk7CisgICAgcmV0dXJuIGlucHV0VHJhbnNmb3JtTWF0cml4ICE9IGlkZW50aXR5OworfQorCitib29sIERlc2NyaXB0aW9uOjpoYXNPdXRwdXRUcmFuc2Zvcm1NYXRyaXgoKSBjb25zdCB7CisgICAgY29uc3QgbWF0NCBpZGVudGl0eTsKKyAgICByZXR1cm4gb3V0cHV0VHJhbnNmb3JtTWF0cml4ICE9IGlkZW50aXR5OworfQorCitib29sIERlc2NyaXB0aW9uOjpoYXNDb2xvck1hdHJpeCgpIGNvbnN0IHsKKyAgICBjb25zdCBtYXQ0IGlkZW50aXR5OworICAgIHJldHVybiBjb2xvck1hdHJpeCAhPSBpZGVudGl0eTsKK30KKworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvTWVzaC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvTWVzaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyZjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9NZXNoLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9NZXNoLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK01lc2g6Ok1lc2goUHJpbWl0aXZlIHByaW1pdGl2ZSwgc2l6ZV90IHZlcnRleENvdW50LCBzaXplX3QgdmVydGV4U2l6ZSwgc2l6ZV90IHRleENvb3JkU2l6ZSwKKyAgICAgICAgICAgc2l6ZV90IGNyb3BDb29yZHNTaXplLCBzaXplX3Qgc2hhZG93Q29sb3JTaXplLCBzaXplX3Qgc2hhZG93UGFyYW1zU2l6ZSwKKyAgICAgICAgICAgc2l6ZV90IGluZGV4Q291bnQpCisgICAgICA6IG1WZXJ0ZXhDb3VudCh2ZXJ0ZXhDb3VudCksCisgICAgICAgIG1WZXJ0ZXhTaXplKHZlcnRleFNpemUpLAorICAgICAgICBtVGV4Q29vcmRzU2l6ZSh0ZXhDb29yZFNpemUpLAorICAgICAgICBtQ3JvcENvb3Jkc1NpemUoY3JvcENvb3Jkc1NpemUpLAorICAgICAgICBtU2hhZG93Q29sb3JTaXplKHNoYWRvd0NvbG9yU2l6ZSksCisgICAgICAgIG1TaGFkb3dQYXJhbXNTaXplKHNoYWRvd1BhcmFtc1NpemUpLAorICAgICAgICBtUHJpbWl0aXZlKHByaW1pdGl2ZSksCisgICAgICAgIG1JbmRleENvdW50KGluZGV4Q291bnQpIHsKKyAgICBpZiAodmVydGV4Q291bnQgPT0gMCkgeworICAgICAgICBtVmVydGljZXMucmVzaXplKDEpOworICAgICAgICBtVmVydGljZXNbMF0gPSAwLjBmOworICAgICAgICBtU3RyaWRlID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc3RyaWRlID0gdmVydGV4U2l6ZSArIHRleENvb3JkU2l6ZSArIGNyb3BDb29yZHNTaXplICsgc2hhZG93Q29sb3JTaXplICsgc2hhZG93UGFyYW1zU2l6ZTsKKyAgICBzaXplX3QgcmVtYWluZGVyID0gKHN0cmlkZSAqIHZlcnRleENvdW50KSAvIHZlcnRleENvdW50OworICAgIC8vIFNpbmNlIGFsbCBvZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUgdW5zaWduZWQsIGlmIHN0cmlkZSBpcyBsZXNzIHRoYW4KKyAgICAvLyBlaXRoZXIgdmVydGV4U2l6ZSBvciB0ZXhDb29yZFNpemUsIGl0IG11c3QgaGF2ZSBvdmVyZmxvd2VkLiByZW1haW5kZXIKKyAgICAvLyB3aWxsIGJlIGVxdWFsIHRvIHN0cmlkZSBhcyBsb25nIGFzIHN0cmlkZSAqIHZlcnRleENvdW50IGRvZXNuJ3Qgb3ZlcmZsb3cuCisgICAgaWYgKChzdHJpZGUgPCB2ZXJ0ZXhTaXplKSB8fCAocmVtYWluZGVyICE9IHN0cmlkZSkpIHsKKyAgICAgICAgQUxPR0UoIk92ZXJmbG93IGluIE1lc2goLi4uLCAlenUsICV6dSwgJXp1LCAlenUsICV6dSwgJXp1KSIsIHZlcnRleENvdW50LCB2ZXJ0ZXhTaXplLAorICAgICAgICAgICAgICB0ZXhDb29yZFNpemUsIGNyb3BDb29yZHNTaXplLCBzaGFkb3dDb2xvclNpemUsIHNoYWRvd1BhcmFtc1NpemUpOworICAgICAgICBtVmVydGljZXMucmVzaXplKDEpOworICAgICAgICBtVmVydGljZXNbMF0gPSAwLjBmOworICAgICAgICBtVmVydGV4Q291bnQgPSAwOworICAgICAgICBtVmVydGV4U2l6ZSA9IDA7CisgICAgICAgIG1UZXhDb29yZHNTaXplID0gMDsKKyAgICAgICAgbUNyb3BDb29yZHNTaXplID0gMDsKKyAgICAgICAgbVNoYWRvd0NvbG9yU2l6ZSA9IDA7CisgICAgICAgIG1TaGFkb3dQYXJhbXNTaXplID0gMDsKKyAgICAgICAgbVN0cmlkZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtVmVydGljZXMucmVzaXplKHN0cmlkZSAqIHZlcnRleENvdW50KTsKKyAgICBtU3RyaWRlID0gc3RyaWRlOworICAgIG1JbmRpY2VzLnJlc2l6ZShpbmRleENvdW50KTsKK30KKworTWVzaDo6UHJpbWl0aXZlIE1lc2g6OmdldFByaW1pdGl2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByaW1pdGl2ZTsKK30KKworZmxvYXQgY29uc3QqIE1lc2g6OmdldFBvc2l0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZlcnRpY2VzLmRhdGEoKTsKK30KK2Zsb2F0KiBNZXNoOjpnZXRQb3NpdGlvbnMoKSB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCk7Cit9CisKK2Zsb2F0IGNvbnN0KiBNZXNoOjpnZXRUZXhDb29yZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZTsKK30KK2Zsb2F0KiBNZXNoOjpnZXRUZXhDb29yZHMoKSB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZTsKK30KKworZmxvYXQgY29uc3QqIE1lc2g6OmdldENyb3BDb29yZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZSArIG1UZXhDb29yZHNTaXplOworfQorZmxvYXQqIE1lc2g6OmdldENyb3BDb29yZHMoKSB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZSArIG1UZXhDb29yZHNTaXplOworfQorCitmbG9hdCBjb25zdCogTWVzaDo6Z2V0U2hhZG93Q29sb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0aWNlcy5kYXRhKCkgKyBtVmVydGV4U2l6ZSArIG1UZXhDb29yZHNTaXplICsgbUNyb3BDb29yZHNTaXplOworfQorZmxvYXQqIE1lc2g6OmdldFNoYWRvd0NvbG9yKCkgeworICAgIHJldHVybiBtVmVydGljZXMuZGF0YSgpICsgbVZlcnRleFNpemUgKyBtVGV4Q29vcmRzU2l6ZSArIG1Dcm9wQ29vcmRzU2l6ZTsKK30KKworZmxvYXQgY29uc3QqIE1lc2g6OmdldFNoYWRvd1BhcmFtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZlcnRpY2VzLmRhdGEoKSArIG1WZXJ0ZXhTaXplICsgbVRleENvb3Jkc1NpemUgKyBtQ3JvcENvb3Jkc1NpemUgKyBtU2hhZG93Q29sb3JTaXplOworfQorZmxvYXQqIE1lc2g6OmdldFNoYWRvd1BhcmFtcygpIHsKKyAgICByZXR1cm4gbVZlcnRpY2VzLmRhdGEoKSArIG1WZXJ0ZXhTaXplICsgbVRleENvb3Jkc1NpemUgKyBtQ3JvcENvb3Jkc1NpemUgKyBtU2hhZG93Q29sb3JTaXplOworfQorCit1aW50MTZfdCBjb25zdCogTWVzaDo6Z2V0SW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGljZXMuZGF0YSgpOworfQorCit1aW50MTZfdCogTWVzaDo6Z2V0SW5kaWNlcygpIHsKKyAgICByZXR1cm4gbUluZGljZXMuZGF0YSgpOworfQorCitzaXplX3QgTWVzaDo6Z2V0VmVydGV4Q291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0ZXhDb3VudDsKK30KKworc2l6ZV90IE1lc2g6OmdldFZlcnRleFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJ0ZXhTaXplOworfQorCitzaXplX3QgTWVzaDo6Z2V0VGV4Q29vcmRzU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRleENvb3Jkc1NpemU7Cit9CisKK3NpemVfdCBNZXNoOjpnZXRTaGFkb3dDb2xvclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaGFkb3dDb2xvclNpemU7Cit9CisKK3NpemVfdCBNZXNoOjpnZXRTaGFkb3dQYXJhbXNTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2hhZG93UGFyYW1zU2l6ZTsKK30KKworc2l6ZV90IE1lc2g6OmdldEJ5dGVTdHJpZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TdHJpZGUgKiBzaXplb2YoZmxvYXQpOworfQorCitzaXplX3QgTWVzaDo6Z2V0U3RyaWRlKCkgY29uc3QgeworICAgIHJldHVybiBtU3RyaWRlOworfQorCitzaXplX3QgTWVzaDo6Z2V0SW5kZXhDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluZGV4Q291bnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L1JlbmRlckVuZ2luZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvUmVuZGVyRW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZmZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L1JlbmRlckVuZ2luZS5jcHAKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlICJnbC9HTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAidGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK3N0ZDo6dW5pcXVlX3B0cjxSZW5kZXJFbmdpbmU+IFJlbmRlckVuZ2luZTo6Y3JlYXRlKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncykgeworICAgIFJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZSA9IGFyZ3MucmVuZGVyRW5naW5lVHlwZTsKKworICAgIC8vIEtlZXAgdGhlIGFiaWxpdHkgdG8gb3ZlcnJpZGUgYnkgUFJPUEVSVElFUzoKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoUFJPUEVSVFlfREVCVUdfUkVOREVSRU5HSU5FX0JBQ0tFTkQsIHByb3AsICIiKTsKKyAgICBpZiAoc3RyY21wKHByb3AsICJnbGVzIikgPT0gMCkgeworICAgICAgICByZW5kZXJFbmdpbmVUeXBlID0gUmVuZGVyRW5naW5lVHlwZTo6R0xFUzsKKyAgICB9CisgICAgaWYgKHN0cmNtcChwcm9wLCAidGhyZWFkZWQiKSA9PSAwKSB7CisgICAgICAgIHJlbmRlckVuZ2luZVR5cGUgPSBSZW5kZXJFbmdpbmVUeXBlOjpUSFJFQURFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbmRlckVuZ2luZVR5cGUpIHsKKyAgICAgICAgY2FzZSBSZW5kZXJFbmdpbmVUeXBlOjpUSFJFQURFRDoKKyAgICAgICAgICAgIEFMT0dEKCJUaHJlYWRlZCBSZW5kZXJFbmdpbmUgd2l0aCBHTEVTIEJhY2tlbmQiKTsKKyAgICAgICAgICAgIHJldHVybiByZW5kZXJlbmdpbmU6OnRocmVhZGVkOjpSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Y3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBbYXJnc10oKSB7IHJldHVybiBhbmRyb2lkOjpyZW5kZXJlbmdpbmU6OmdsOjpHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGUoYXJncyk7IH0pOworICAgICAgICBjYXNlIFJlbmRlckVuZ2luZVR5cGU6OkdMRVM6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiUmVuZGVyRW5naW5lIHdpdGggR0xFUyBCYWNrZW5kIik7CisgICAgICAgICAgICByZXR1cm4gcmVuZGVyZW5naW5lOjpnbDo6R0xFU1JlbmRlckVuZ2luZTo6Y3JlYXRlKGFyZ3MpOworICAgIH0KK30KKworUmVuZGVyRW5naW5lOjp+UmVuZGVyRW5naW5lKCkgPSBkZWZhdWx0OworCisvLyBzdGF0aWMKK1N5bmNGZWF0dXJlcyAmU3luY0ZlYXR1cmVzOjpHZXRJbnN0YW5jZSgpIHsKKyAgICBzdGF0aWMgU3luY0ZlYXR1cmVzIHN5bmNGZWF0dXJlczsKKyAgICByZXR1cm4gc3luY0ZlYXR1cmVzOworfQorCitib29sIFN5bmNGZWF0dXJlczo6dXNlTmF0aXZlRmVuY2VTeW5jKCkgY29uc3QgeyByZXR1cm4gbUhhc05hdGl2ZUZlbmNlU3luYzsgfQorYm9vbCBTeW5jRmVhdHVyZXM6OnVzZUZlbmNlU3luYygpIGNvbnN0IHsgcmV0dXJuIG1IYXNGZW5jZVN5bmM7IH0KK2Jvb2wgU3luY0ZlYXR1cmVzOjp1c2VXYWl0U3luYygpIGNvbnN0IHsgcmV0dXJuIG1IYXNXYWl0U3luYzsgfQorCitTeW5jRmVhdHVyZXM6OlN5bmNGZWF0dXJlcygpCisgICAgOiBtSGFzTmF0aXZlRmVuY2VTeW5jKGZhbHNlKSwKKyAgICAgIG1IYXNGZW5jZVN5bmMoZmFsc2UpLAorICAgICAgbUhhc1dhaXRTeW5jKGZhbHNlKSB7CisgICAgRUdMRGlzcGxheSBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgIC8vIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIGFmdGVyIEVHTCBoYXMgYmVlbiBpbml0aWFsaXplZDsgb3RoZXJ3aXNlIHRoZQorICAgIC8vIGNoZWNrIGJlbG93IHdpbGwgYWJvcnQuCisgICAgY29uc3QgY2hhciogZXh0cyA9IGVnbFF1ZXJ5U3RyaW5nKGRweSwgRUdMX0VYVEVOU0lPTlMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZXh0cyA9PSBudWxscHRyLCAiZWdsUXVlcnlTdHJpbmcgZmFpbGVkIik7CisgICAgaWYgKHN0cnN0cihleHRzLCAiRUdMX0FORFJPSURfbmF0aXZlX2ZlbmNlX3N5bmMiKSkgeworICAgICAgICAvLyBUaGlzIG1ha2VzIEdMQ29uc3VtZXIgdXNlIHRoZSBFR0xfQU5EUk9JRF9uYXRpdmVfZmVuY2Vfc3luYworICAgICAgICAvLyBleHRlbnNpb24gdG8gY3JlYXRlIEFuZHJvaWQgbmF0aXZlIGZlbmNlcyB0byBzaWduYWwgd2hlbiBhbGwKKyAgICAgICAgLy8gR0xFUyByZWFkcyBmb3IgYSBnaXZlbiBidWZmZXIgaGF2ZSBjb21wbGV0ZWQuCisgICAgICAgIG1IYXNOYXRpdmVGZW5jZVN5bmMgPSB0cnVlOworICAgIH0KKyAgICBpZiAoc3Ryc3RyKGV4dHMsICJFR0xfS0hSX2ZlbmNlX3N5bmMiKSkgeworICAgICAgICBtSGFzRmVuY2VTeW5jID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHN0cnN0cihleHRzLCAiRUdMX0tIUl93YWl0X3N5bmMiKSkgeworICAgICAgICBtSGFzV2FpdFN5bmMgPSB0cnVlOworICAgIH0KK30KKworbmFtZXNwYWNlIGltcGwgeworCitSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZShjb25zdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3MmIGFyZ3MpIDogbUFyZ3MoYXJncykge30KKworUmVuZGVyRW5naW5lOjp+UmVuZGVyRW5naW5lKCkgPSBkZWZhdWx0OworCitib29sIFJlbmRlckVuZ2luZTo6dXNlTmF0aXZlRmVuY2VTeW5jKCkgY29uc3QgeworICAgIHJldHVybiBTeW5jRmVhdHVyZXM6OkdldEluc3RhbmNlKCkudXNlTmF0aXZlRmVuY2VTeW5jKCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lOjp1c2VXYWl0U3luYygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3luY0ZlYXR1cmVzOjpHZXRJbnN0YW5jZSgpLnVzZVdhaXRTeW5jKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGltcGwKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L1RleHR1cmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L1RleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGNkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvVGV4dHVyZS5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9UZXh0dXJlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitUZXh0dXJlOjpUZXh0dXJlKCkKKyAgICAgIDogbVRleHR1cmVOYW1lKDApLCBtVGV4dHVyZVRhcmdldChURVhUVVJFXzJEKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApLCBtRmlsdGVyaW5nKGZhbHNlKSB7fQorCitUZXh0dXJlOjpUZXh0dXJlKFRhcmdldCB0ZXh0dXJlVGFyZ2V0LCB1aW50MzJfdCB0ZXh0dXJlTmFtZSkKKyAgICAgIDogbVRleHR1cmVOYW1lKHRleHR1cmVOYW1lKSwKKyAgICAgICAgbVRleHR1cmVUYXJnZXQodGV4dHVyZVRhcmdldCksCisgICAgICAgIG1XaWR0aCgwKSwKKyAgICAgICAgbUhlaWdodCgwKSwKKyAgICAgICAgbUZpbHRlcmluZyhmYWxzZSkge30KKwordm9pZCBUZXh0dXJlOjppbml0KFRhcmdldCB0ZXh0dXJlVGFyZ2V0LCB1aW50MzJfdCB0ZXh0dXJlTmFtZSkgeworICAgIG1UZXh0dXJlTmFtZSA9IHRleHR1cmVOYW1lOworICAgIG1UZXh0dXJlVGFyZ2V0ID0gdGV4dHVyZVRhcmdldDsKK30KKworVGV4dHVyZTo6flRleHR1cmUoKSB7fQorCit2b2lkIFRleHR1cmU6OnNldE1hdHJpeChmbG9hdCBjb25zdCogbWF0cml4KSB7CisgICAgbVRleHR1cmVNYXRyaXggPSBtYXQ0KG1hdHJpeCk7Cit9CisKK3ZvaWQgVGV4dHVyZTo6c2V0RmlsdGVyaW5nKGJvb2wgZW5hYmxlZCkgeworICAgIG1GaWx0ZXJpbmcgPSBlbmFibGVkOworfQorCit2b2lkIFRleHR1cmU6OnNldERpbWVuc2lvbnMoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKK30KKwordWludDMyX3QgVGV4dHVyZTo6Z2V0VGV4dHVyZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1UZXh0dXJlTmFtZTsKK30KKwordWludDMyX3QgVGV4dHVyZTo6Z2V0VGV4dHVyZVRhcmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRleHR1cmVUYXJnZXQ7Cit9CisKK2NvbnN0IG1hdDQmIFRleHR1cmU6OmdldE1hdHJpeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRleHR1cmVNYXRyaXg7Cit9CisKK2Jvb2wgVGV4dHVyZTo6Z2V0RmlsdGVyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtRmlsdGVyaW5nOworfQorCitzaXplX3QgVGV4dHVyZTo6Z2V0V2lkdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1XaWR0aDsKK30KKworc2l6ZV90IFRleHR1cmU6OmdldEhlaWdodCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhlaWdodDsKK30KKworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFU1JlbmRlckVuZ2luZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFU1JlbmRlckVuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYTlhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEVTUmVuZGVyRW5naW5lLmNwcApAQCAtMCwwICsxLDE3NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlJlbmRlckVuZ2luZSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL01lc2guaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvVGV4dHVyZS5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8c3luYy9zeW5jLmg+CisjaW5jbHVkZSA8dWkvQ29sb3JTcGFjZS5oPgorI2luY2x1ZGUgPHVpL0RlYnVnVXRpbHMuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJHTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCisjaW5jbHVkZSAiR0xGcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgIkdMSW1hZ2UuaCIKKyNpbmNsdWRlICJHTFNoYWRvd1ZlcnRleEdlbmVyYXRvci5oIgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKyNpbmNsdWRlICJmaWx0ZXJzL0JsdXJGaWx0ZXIuaCIKKworYm9vbCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3AsIGludCBsaW5lTnVtYmVyKSB7CisgICAgYm9vbCBlcnJvckZvdW5kID0gZmFsc2U7CisgICAgR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7CisgICAgd2hpbGUgKGVycm9yICE9IEdMX05PX0VSUk9SKSB7CisgICAgICAgIGVycm9yRm91bmQgPSB0cnVlOworICAgICAgICBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICAgICAgQUxPR1YoImFmdGVyICVzKCkgKGxpbmUgIyAlZCkgZ2xFcnJvciAoMHgleClcbiIsIG9wLCBsaW5lTnVtYmVyLCBlcnJvcik7CisgICAgfQorICAgIHJldHVybiBlcnJvckZvdW5kOworfQorCitzdGF0aWMgY29uc3RleHByIGJvb2wgb3V0cHV0RGVidWdQUE1zID0gZmFsc2U7CisKK3ZvaWQgd3JpdGVQUE0oY29uc3QgY2hhciogYmFzZW5hbWUsIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCkgeworICAgIEFMT0dWKCJ3cml0ZVBQTSAjJXM6ICVkIHggJWQiLCBiYXNlbmFtZSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBzdGQ6OnZlY3RvcjxHTHVieXRlPiBwaXhlbHMod2lkdGggKiBoZWlnaHQgKiA0KTsKKyAgICBzdGQ6OnZlY3RvcjxHTHVieXRlPiBvdXRCdWZmZXIod2lkdGggKiBoZWlnaHQgKiAzKTsKKworICAgIC8vIFRPRE8oY291cnRuZXlnbyk6IFdlIGNhbiBub3cgaGF2ZSBmbG9hdCBmb3JtYXRzLCBuZWVkCisgICAgLy8gdG8gcmVtb3ZlIHRoaXMgY29kZSBvciB1cGRhdGUgdG8gc3VwcG9ydC4KKyAgICAvLyBNYWtlIHJldHVybmVkIHBpeGVscyBmaXQgaW4gdWludDMyX3QsIG9uZSBieXRlIHBlciBjb21wb25lbnQKKyAgICBnbFJlYWRQaXhlbHMoMCwgMCwgd2lkdGgsIGhlaWdodCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcGl4ZWxzLmRhdGEoKSk7CisgICAgaWYgKGNoZWNrR2xFcnJvcihfX0ZVTkNUSU9OX18sIF9fTElORV9fKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUoYmFzZW5hbWUpOworICAgIGZpbGVuYW1lLmFwcGVuZCgiLnBwbSIpOworICAgIHN0ZDo6b2ZzdHJlYW0gZmlsZShmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgICBpZiAoIWZpbGUuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gb3BlbiBmaWxlOiAlcyIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiWW91IG1heSBuZWVkIHRvIGRvOiBcImFkYiBzaGVsbCBzZXRlbmZvcmNlIDBcIiB0byBlbmFibGUgIgorICAgICAgICAgICAgICAic3VyZmFjZWZsaW5nZXIgdG8gd3JpdGUgZGVidWcgaW1hZ2VzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmaWxlIDw8ICJQNlxuIjsKKyAgICBmaWxlIDw8IHdpZHRoIDw8ICJcbiI7CisgICAgZmlsZSA8PCBoZWlnaHQgPDwgIlxuIjsKKyAgICBmaWxlIDw8IDI1NSA8PCAiXG4iOworCisgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwaXhlbHMuZGF0YSgpKTsKKyAgICBhdXRvIG91dFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG91dEJ1ZmZlci5kYXRhKCkpOworICAgIGZvciAoaW50IHkgPSBoZWlnaHQgLSAxOyB5ID49IDA7IHktLSkgeworICAgICAgICBjaGFyKiBkYXRhID0gcHRyICsgeSAqIHdpZHRoICogc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgICBmb3IgKEdMdWludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIC8vIE9ubHkgY29weSBSLCBHIGFuZCBCIGNvbXBvbmVudHMKKyAgICAgICAgICAgIG91dFB0clswXSA9IGRhdGFbMF07CisgICAgICAgICAgICBvdXRQdHJbMV0gPSBkYXRhWzFdOworICAgICAgICAgICAgb3V0UHRyWzJdID0gZGF0YVsyXTsKKyAgICAgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgIG91dFB0ciArPSAzOworICAgICAgICB9CisgICAgfQorICAgIGZpbGUud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3V0QnVmZmVyLmRhdGEoKSksIG91dEJ1ZmZlci5zaXplKCkpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK3VzaW5nIGJhc2U6OlN0cmluZ0FwcGVuZEY7Cit1c2luZyB1aTo6RGF0YXNwYWNlOworCitzdGF0aWMgc3RhdHVzX3Qgc2VsZWN0Q29uZmlnRm9yQXR0cmlidXRlKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgY29uc3QqIGF0dHJzLCBFR0xpbnQgYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgd2FudGVkLCBFR0xDb25maWcqIG91dENvbmZpZykgeworICAgIEVHTGludCBudW1Db25maWdzID0gLTEsIG4gPSAwOworICAgIGVnbEdldENvbmZpZ3MoZHB5LCBudWxscHRyLCAwLCAmbnVtQ29uZmlncyk7CisgICAgc3RkOjp2ZWN0b3I8RUdMQ29uZmlnPiBjb25maWdzKG51bUNvbmZpZ3MsIEVHTF9OT19DT05GSUdfS0hSKTsKKyAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBhdHRycywgY29uZmlncy5kYXRhKCksIGNvbmZpZ3Muc2l6ZSgpLCAmbik7CisgICAgY29uZmlncy5yZXNpemUobik7CisKKyAgICBpZiAoIWNvbmZpZ3MuZW1wdHkoKSkgeworICAgICAgICBpZiAoYXR0cmlidXRlICE9IEVHTF9OT05FKSB7CisgICAgICAgICAgICBmb3IgKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7CisgICAgICAgICAgICAgICAgRUdMaW50IHZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIGF0dHJpYnV0ZSwgJnZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAod2FudGVkID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRDb25maWcgPSBjb25maWc7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBqdXN0IHBpY2sgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICAgKm91dENvbmZpZyA9IGNvbmZpZ3NbMF07CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBzZWxlY3RFR0xDb25maWcoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xpbnQgZm9ybWF0LCBFR0xpbnQgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyogY29uZmlnKSB7CisgICAgLy8gc2VsZWN0IG91ciBFR0xDb25maWcuIEl0IG11c3Qgc3VwcG9ydCBFR0xfUkVDT1JEQUJMRV9BTkRST0lEIGlmCisgICAgLy8gaXQgaXMgdG8gYmUgdXNlZCB3aXRoIFdJRkkgZGlzcGxheXMKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgRUdMaW50IHdhbnRlZEF0dHJpYnV0ZTsKKyAgICBFR0xpbnQgd2FudGVkQXR0cmlidXRlVmFsdWU7CisKKyAgICBzdGQ6OnZlY3RvcjxFR0xpbnQ+IGF0dHJpYnM7CisgICAgaWYgKHJlbmRlcmFibGVUeXBlKSB7CisgICAgICAgIGNvbnN0IHVpOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCA9IHN0YXRpY19jYXN0PHVpOjpQaXhlbEZvcm1hdD4oZm9ybWF0KTsKKyAgICAgICAgY29uc3QgYm9vbCBpczEwMTAxMDIgPSBwaXhlbEZvcm1hdCA9PSB1aTo6UGl4ZWxGb3JtYXQ6OlJHQkFfMTAxMDEwMjsKKworICAgICAgICAvLyBEZWZhdWx0IHRvIDggYml0cyBwZXIgY2hhbm5lbC4KKyAgICAgICAgY29uc3QgRUdMaW50IHRtcEF0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLAorICAgICAgICAgICAgICAgIHJlbmRlcmFibGVUeXBlLAorICAgICAgICAgICAgICAgIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQsCisgICAgICAgICAgICAgICAgRUdMX1RSVUUsCisgICAgICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwKKyAgICAgICAgICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAgICAgICBFR0xfRlJBTUVCVUZGRVJfVEFSR0VUX0FORFJPSUQsCisgICAgICAgICAgICAgICAgRUdMX1RSVUUsCisgICAgICAgICAgICAgICAgRUdMX1JFRF9TSVpFLAorICAgICAgICAgICAgICAgIGlzMTAxMDEwMiA/IDEwIDogOCwKKyAgICAgICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwKKyAgICAgICAgICAgICAgICBpczEwMTAxMDIgPyAxMCA6IDgsCisgICAgICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwKKyAgICAgICAgICAgICAgICBpczEwMTAxMDIgPyAxMCA6IDgsCisgICAgICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsCisgICAgICAgICAgICAgICAgaXMxMDEwMTAyID8gMiA6IDgsCisgICAgICAgICAgICAgICAgRUdMX05PTkUsCisgICAgICAgIH07CisgICAgICAgIHN0ZDo6Y29weSh0bXBBdHRyaWJzLCB0bXBBdHRyaWJzICsgKHNpemVvZih0bXBBdHRyaWJzKSAvIHNpemVvZihFR0xpbnQpKSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihhdHRyaWJzKSk7CisgICAgICAgIHdhbnRlZEF0dHJpYnV0ZSA9IEVHTF9OT05FOworICAgICAgICB3YW50ZWRBdHRyaWJ1dGVWYWx1ZSA9IEVHTF9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGlmIG5vIHJlbmRlcmFibGUgdHlwZSBzcGVjaWZpZWQsIGZhbGxiYWNrIHRvIGEgc2ltcGxpZmllZCBxdWVyeQorICAgICAgICB3YW50ZWRBdHRyaWJ1dGUgPSBFR0xfTkFUSVZFX1ZJU1VBTF9JRDsKKyAgICAgICAgd2FudGVkQXR0cmlidXRlVmFsdWUgPSBmb3JtYXQ7CisgICAgfQorCisgICAgZXJyID0gc2VsZWN0Q29uZmlnRm9yQXR0cmlidXRlKGRpc3BsYXksIGF0dHJpYnMuZGF0YSgpLCB3YW50ZWRBdHRyaWJ1dGUsIHdhbnRlZEF0dHJpYnV0ZVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgRUdMaW50IGNhdmVhdDsKKyAgICAgICAgaWYgKGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCAqY29uZmlnLCBFR0xfQ09ORklHX0NBVkVBVCwgJmNhdmVhdCkpCisgICAgICAgICAgICBBTE9HV19JRihjYXZlYXQgPT0gRUdMX1NMT1dfQ09ORklHLCAiRUdMX1NMT1dfQ09ORklHIHNlbGVjdGVkISIpOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxHTEVTUmVuZGVyRW5naW5lPiBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGUoY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzJiBhcmdzKSB7CisgICAgLy8gaW5pdGlhbGl6ZSBFR0wgZm9yIHRoZSBkZWZhdWx0IGRpc3BsYXkKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgIGlmICghZWdsSW5pdGlhbGl6ZShkaXNwbGF5LCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBFR0wiKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIGVnbFZlcnNpb24gPSBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfVkVSU0lPTik7CisgICAgaWYgKCFlZ2xWZXJzaW9uKSB7CisgICAgICAgIGNoZWNrR2xFcnJvcihfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiZWdsUXVlcnlTdHJpbmcoRUdMX1ZFUlNJT04pIGZhaWxlZCIpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gZWdsRXh0ZW5zaW9ucyA9IGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9FWFRFTlNJT05TKTsKKyAgICBpZiAoIWVnbEV4dGVuc2lvbnMpIHsKKyAgICAgICAgY2hlY2tHbEVycm9yKF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJlZ2xRdWVyeVN0cmluZyhFR0xfRVhURU5TSU9OUykgZmFpbGVkIik7CisgICAgfQorCisgICAgR0xFeHRlbnNpb25zJiBleHRlbnNpb25zID0gR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpOworICAgIGV4dGVuc2lvbnMuaW5pdFdpdGhFR0xTdHJpbmdzKGVnbFZlcnNpb24sIGVnbEV4dGVuc2lvbnMpOworCisgICAgLy8gVGhlIGNvZGUgYXNzdW1lcyB0aGF0IEVTMiBvciBsYXRlciBpcyBhdmFpbGFibGUgaWYgdGhpcyBleHRlbnNpb24gaXMKKyAgICAvLyBzdXBwb3J0ZWQuCisgICAgRUdMQ29uZmlnIGNvbmZpZyA9IEVHTF9OT19DT05GSUc7CisgICAgaWYgKCFleHRlbnNpb25zLmhhc05vQ29uZmlnQ29udGV4dCgpKSB7CisgICAgICAgIGNvbmZpZyA9IGNob29zZUVnbENvbmZpZyhkaXNwbGF5LCBhcmdzLnBpeGVsRm9ybWF0LCAvKmxvZ0NvbmZpZyovIHRydWUpOworICAgIH0KKworICAgIGJvb2wgdXNlQ29udGV4dFByaW9yaXR5ID0KKyAgICAgICAgICAgIGV4dGVuc2lvbnMuaGFzQ29udGV4dFByaW9yaXR5KCkgJiYgYXJncy5jb250ZXh0UHJpb3JpdHkgPT0gQ29udGV4dFByaW9yaXR5OjpISUdIOworICAgIEVHTENvbnRleHQgcHJvdGVjdGVkQ29udGV4dCA9IEVHTF9OT19DT05URVhUOworICAgIGlmIChhcmdzLmVuYWJsZVByb3RlY3RlZENvbnRleHQgJiYgZXh0ZW5zaW9ucy5oYXNQcm90ZWN0ZWRDb250ZW50KCkpIHsKKyAgICAgICAgcHJvdGVjdGVkQ29udGV4dCA9IGNyZWF0ZUVnbENvbnRleHQoZGlzcGxheSwgY29uZmlnLCBudWxscHRyLCB1c2VDb250ZXh0UHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3Rpb246OlBST1RFQ1RFRCk7CisgICAgICAgIEFMT0dFX0lGKHByb3RlY3RlZENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQsICJDYW4ndCBjcmVhdGUgcHJvdGVjdGVkIGNvbnRleHQiKTsKKyAgICB9CisKKyAgICBFR0xDb250ZXh0IGN0eHQgPSBjcmVhdGVFZ2xDb250ZXh0KGRpc3BsYXksIGNvbmZpZywgcHJvdGVjdGVkQ29udGV4dCwgdXNlQ29udGV4dFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGlvbjo6VU5QUk9URUNURUQpOworCisgICAgLy8gaWYgY2FuJ3QgY3JlYXRlIGEgR0wgY29udGV4dCwgd2UgY2FuIG9ubHkgYWJvcnQuCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjdHh0ID09IEVHTF9OT19DT05URVhULCAiRUdMQ29udGV4dCBjcmVhdGlvbiBmYWlsZWQiKTsKKworICAgIEVHTFN1cmZhY2Ugc3R1YiA9IEVHTF9OT19TVVJGQUNFOworICAgIGlmICghZXh0ZW5zaW9ucy5oYXNTdXJmYWNlbGVzc0NvbnRleHQoKSkgeworICAgICAgICBzdHViID0gY3JlYXRlU3R1YkVnbFBidWZmZXJTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywgYXJncy5waXhlbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0aW9uOjpVTlBST1RFQ1RFRCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3R1YiA9PSBFR0xfTk9fU1VSRkFDRSwgImNhbid0IGNyZWF0ZSBzdHViIHBidWZmZXIiKTsKKyAgICB9CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgc3R1Yiwgc3R1YiwgY3R4dCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighc3VjY2VzcywgImNhbid0IG1ha2Ugc3R1YiBwYnVmZmVyIGN1cnJlbnQiKTsKKyAgICBleHRlbnNpb25zLmluaXRXaXRoR0xTdHJpbmdzKGdsR2V0U3RyaW5nKEdMX1ZFTkRPUiksIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pLCBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CisKKyAgICBFR0xTdXJmYWNlIHByb3RlY3RlZFN0dWIgPSBFR0xfTk9fU1VSRkFDRTsKKyAgICBpZiAocHJvdGVjdGVkQ29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCAmJiAhZXh0ZW5zaW9ucy5oYXNTdXJmYWNlbGVzc0NvbnRleHQoKSkgeworICAgICAgICBwcm90ZWN0ZWRTdHViID0gY3JlYXRlU3R1YkVnbFBidWZmZXJTdXJmYWNlKGRpc3BsYXksIGNvbmZpZywgYXJncy5waXhlbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0aW9uOjpQUk9URUNURUQpOworICAgICAgICBBTE9HRV9JRihwcm90ZWN0ZWRTdHViID09IEVHTF9OT19TVVJGQUNFLCAiY2FuJ3QgY3JlYXRlIHByb3RlY3RlZCBzdHViIHBidWZmZXIiKTsKKyAgICB9CisKKyAgICAvLyBub3cgZmlndXJlIG91dCB3aGF0IHZlcnNpb24gb2YgR0wgZGlkIHdlIGFjdHVhbGx5IGdldAorICAgIEdsZXNWZXJzaW9uIHZlcnNpb24gPSBwYXJzZUdsZXNWZXJzaW9uKGV4dGVuc2lvbnMuZ2V0VmVyc2lvbigpKTsKKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXJncy5zdXBwb3J0c0JhY2tncm91bmRCbHVyICYmIHZlcnNpb24gPCBHTEVTX1ZFUlNJT05fM18wLAorICAgICAgICAiQmx1cnMgcmVxdWlyZSBPcGVuR0wgRVMgMy4wLiBQbGVhc2UgdW5zZXQgcm8uc3VyZmFjZV9mbGluZ2VyLnN1cHBvcnRzX2JhY2tncm91bmRfYmx1ciIpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgcmVuZGVyZXIgd2hpbGUgR0wgaXMgY3VycmVudAorICAgIHN0ZDo6dW5pcXVlX3B0cjxHTEVTUmVuZGVyRW5naW5lPiBlbmdpbmU7CisgICAgc3dpdGNoICh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgR0xFU19WRVJTSU9OXzFfMDoKKyAgICAgICAgY2FzZSBHTEVTX1ZFUlNJT05fMV8xOgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU3VyZmFjZUZsaW5nZXIgcmVxdWlyZXMgT3BlbkdMIEVTIDIuMCBtaW5pbXVtIHRvIHJ1bi4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMRVNfVkVSU0lPTl8yXzA6CisgICAgICAgIGNhc2UgR0xFU19WRVJTSU9OXzNfMDoKKyAgICAgICAgICAgIGVuZ2luZSA9IHN0ZDo6bWFrZV91bmlxdWU8R0xFU1JlbmRlckVuZ2luZT4oYXJncywgZGlzcGxheSwgY29uZmlnLCBjdHh0LCBzdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWRDb250ZXh0LCBwcm90ZWN0ZWRTdHViKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFMT0dJKCJPcGVuR0wgRVMgaW5mb3JtYXRpb25zOiIpOworICAgIEFMT0dJKCJ2ZW5kb3IgICAgOiAlcyIsIGV4dGVuc2lvbnMuZ2V0VmVuZG9yKCkpOworICAgIEFMT0dJKCJyZW5kZXJlciAgOiAlcyIsIGV4dGVuc2lvbnMuZ2V0UmVuZGVyZXIoKSk7CisgICAgQUxPR0koInZlcnNpb24gICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRWZXJzaW9uKCkpOworICAgIEFMT0dJKCJleHRlbnNpb25zOiAlcyIsIGV4dGVuc2lvbnMuZ2V0RXh0ZW5zaW9ucygpKTsKKyAgICBBTE9HSSgiR0xfTUFYX1RFWFRVUkVfU0laRSA9ICV6dSIsIGVuZ2luZS0+Z2V0TWF4VGV4dHVyZVNpemUoKSk7CisgICAgQUxPR0koIkdMX01BWF9WSUVXUE9SVF9ESU1TID0gJXp1IiwgZW5naW5lLT5nZXRNYXhWaWV3cG9ydERpbXMoKSk7CisKKyAgICByZXR1cm4gZW5naW5lOworfQorCitFR0xDb25maWcgR0xFU1JlbmRlckVuZ2luZTo6Y2hvb3NlRWdsQ29uZmlnKEVHTERpc3BsYXkgZGlzcGxheSwgaW50IGZvcm1hdCwgYm9vbCBsb2dDb25maWcpIHsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKworICAgIC8vIEZpcnN0IHRyeSB0byBnZXQgYW4gRVMzIGNvbmZpZworICAgIGVyciA9IHNlbGVjdEVHTENvbmZpZyhkaXNwbGF5LCBmb3JtYXQsIEVHTF9PUEVOR0xfRVMzX0JJVCwgJmNvbmZpZyk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAvLyBJZiBFUzMgZmFpbHMsIHRyeSB0byBnZXQgYW4gRVMyIGNvbmZpZworICAgICAgICBlcnIgPSBzZWxlY3RFR0xDb25maWcoZGlzcGxheSwgZm9ybWF0LCBFR0xfT1BFTkdMX0VTMl9CSVQsICZjb25maWcpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBJZiBFUzIgc3RpbGwgZG9lc24ndCB3b3JrLCBwcm9iYWJseSBiZWNhdXNlIHdlJ3JlIG9uIHRoZSBlbXVsYXRvci4KKyAgICAgICAgICAgIC8vIHRyeSBhIHNpbXBsaWZpZWQgcXVlcnkKKyAgICAgICAgICAgIEFMT0dXKCJubyBzdWl0YWJsZSBFR0xDb25maWcgZm91bmQsIHRyeWluZyBhIHNpbXBsZXIgcXVlcnkiKTsKKyAgICAgICAgICAgIGVyciA9IHNlbGVjdEVHTENvbmZpZyhkaXNwbGF5LCBmb3JtYXQsIDAsICZjb25maWcpOworICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgRUdMIGlzIHRvbyBsYW1lIGZvciBhbmRyb2lkCisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgibm8gc3VpdGFibGUgRUdMQ29uZmlnIGZvdW5kLCBnaXZpbmcgdXAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsb2dDb25maWcpIHsKKyAgICAgICAgLy8gcHJpbnQgc29tZSBkZWJ1Z2dpbmcgaW5mbworICAgICAgICBFR0xpbnQgciwgZywgYiwgYTsKKyAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX1JFRF9TSVpFLCAmcik7CisgICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmZyk7CisgICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIEVHTF9CTFVFX1NJWkUsICZiKTsKKyAgICAgICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0FMUEhBX1NJWkUsICZhKTsKKyAgICAgICAgQUxPR0koIkVHTCBpbmZvcm1hdGlvbjoiKTsKKyAgICAgICAgQUxPR0koInZlbmRvciAgICA6ICVzIiwgZWdsUXVlcnlTdHJpbmcoZGlzcGxheSwgRUdMX1ZFTkRPUikpOworICAgICAgICBBTE9HSSgidmVyc2lvbiAgIDogJXMiLCBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfVkVSU0lPTikpOworICAgICAgICBBTE9HSSgiZXh0ZW5zaW9uczogJXMiLCBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfRVhURU5TSU9OUykpOworICAgICAgICBBTE9HSSgiQ2xpZW50IEFQSTogJXMiLCBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfQ0xJRU5UX0FQSVMpID86ICJOb3QgU3VwcG9ydGVkIik7CisgICAgICAgIEFMT0dJKCJFR0xTdXJmYWNlOiAlZC0lZC0lZC0lZCwgY29uZmlnPSVwIiwgciwgZywgYiwgYSwgY29uZmlnKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29uZmlnOworfQorCitHTEVTUmVuZGVyRW5naW5lOjpHTEVTUmVuZGVyRW5naW5lKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncywgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IGN0eHQsIEVHTFN1cmZhY2Ugc3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBwcm90ZWN0ZWRDb250ZXh0LCBFR0xTdXJmYWNlIHByb3RlY3RlZFN0dWIpCisgICAgICA6IHJlbmRlcmVuZ2luZTo6aW1wbDo6UmVuZGVyRW5naW5lKGFyZ3MpLAorICAgICAgICBtRUdMRGlzcGxheShkaXNwbGF5KSwKKyAgICAgICAgbUVHTENvbmZpZyhjb25maWcpLAorICAgICAgICBtRUdMQ29udGV4dChjdHh0KSwKKyAgICAgICAgbVN0dWJTdXJmYWNlKHN0dWIpLAorICAgICAgICBtUHJvdGVjdGVkRUdMQ29udGV4dChwcm90ZWN0ZWRDb250ZXh0KSwKKyAgICAgICAgbVByb3RlY3RlZFN0dWJTdXJmYWNlKHByb3RlY3RlZFN0dWIpLAorICAgICAgICBtVnBXaWR0aCgwKSwKKyAgICAgICAgbVZwSGVpZ2h0KDApLAorICAgICAgICBtRnJhbWVidWZmZXJJbWFnZUNhY2hlU2l6ZShhcmdzLmltYWdlQ2FjaGVTaXplKSwKKyAgICAgICAgbVVzZUNvbG9yTWFuYWdlbWVudChhcmdzLnVzZUNvbG9yTWFuYWdlbWVudCkgeworICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1NYXhUZXh0dXJlU2l6ZSk7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVklFV1BPUlRfRElNUywgbU1heFZpZXdwb3J0RGltcyk7CisKKyAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDQpOworICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOworCisgICAgLy8gSW5pdGlhbGl6ZSBwcm90ZWN0ZWQgRUdMIENvbnRleHQuCisgICAgaWYgKG1Qcm90ZWN0ZWRFR0xDb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIEVHTEJvb2xlYW4gc3VjY2VzcyA9IGVnbE1ha2VDdXJyZW50KGRpc3BsYXksIG1Qcm90ZWN0ZWRTdHViU3VyZmFjZSwgbVByb3RlY3RlZFN0dWJTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvdGVjdGVkRUdMQ29udGV4dCk7CisgICAgICAgIEFMT0dFX0lGKCFzdWNjZXNzLCAiY2FuJ3QgbWFrZSBwcm90ZWN0ZWQgY29udGV4dCBjdXJyZW50Iik7CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7CisgICAgICAgIGdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOworICAgICAgICBzdWNjZXNzID0gZWdsTWFrZUN1cnJlbnQoZGlzcGxheSwgbVN0dWJTdXJmYWNlLCBtU3R1YlN1cmZhY2UsIG1FR0xDb250ZXh0KTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighc3VjY2VzcywgImNhbid0IG1ha2UgZGVmYXVsdCBjb250ZXh0IGN1cnJlbnQiKTsKKyAgICB9CisKKyAgICAvLyBtQ29sb3JCbGluZG5lc3NDb3JyZWN0aW9uID0gTTsKKworICAgIGlmIChtVXNlQ29sb3JNYW5hZ2VtZW50KSB7CisgICAgICAgIGNvbnN0IENvbG9yU3BhY2Ugc3JnYihDb2xvclNwYWNlOjpzUkdCKCkpOworICAgICAgICBjb25zdCBDb2xvclNwYWNlIGRpc3BsYXlQMyhDb2xvclNwYWNlOjpEaXNwbGF5UDMoKSk7CisgICAgICAgIGNvbnN0IENvbG9yU3BhY2UgYnQyMDIwKENvbG9yU3BhY2U6OkJUMjAyMCgpKTsKKworICAgICAgICAvLyBubyBjaHJvbWF0aWMgYWRhcHRhdGlvbiBuZWVkZWQgc2luY2UgYWxsIGNvbG9yIHNwYWNlcyB1c2UgRDY1IGZvciB0aGVpciB3aGl0ZSBwb2ludHMuCisgICAgICAgIG1TcmdiVG9YeXogPSBtYXQ0KHNyZ2IuZ2V0UkdCdG9YWVooKSk7CisgICAgICAgIG1EaXNwbGF5UDNUb1h5eiA9IG1hdDQoZGlzcGxheVAzLmdldFJHQnRvWFlaKCkpOworICAgICAgICBtQnQyMDIwVG9YeXogPSBtYXQ0KGJ0MjAyMC5nZXRSR0J0b1hZWigpKTsKKyAgICAgICAgbVh5elRvU3JnYiA9IG1hdDQoc3JnYi5nZXRYWVp0b1JHQigpKTsKKyAgICAgICAgbVh5elRvRGlzcGxheVAzID0gbWF0NChkaXNwbGF5UDMuZ2V0WFladG9SR0IoKSk7CisgICAgICAgIG1YeXpUb0J0MjAyMCA9IG1hdDQoYnQyMDIwLmdldFhZWnRvUkdCKCkpOworCisgICAgICAgIC8vIENvbXB1dGUgc1JHQiB0byBEaXNwbGF5IFAzIGFuZCBCVDIwMjAgdHJhbnNmb3JtIG1hdHJpeC4KKyAgICAgICAgLy8gTk9URTogRm9yIG5vdywgd2UgYXJlIGxpbWl0aW5nIG91dHB1dCB3aWRlIGNvbG9yIHNwYWNlIHN1cHBvcnQgdG8KKyAgICAgICAgLy8gRGlzcGxheS1QMyBhbmQgQlQyMDIwIG9ubHkuCisgICAgICAgIG1TcmdiVG9EaXNwbGF5UDMgPSBtWHl6VG9EaXNwbGF5UDMgKiBtU3JnYlRvWHl6OworICAgICAgICBtU3JnYlRvQnQyMDIwID0gbVh5elRvQnQyMDIwICogbVNyZ2JUb1h5ejsKKworICAgICAgICAvLyBDb21wdXRlIERpc3BsYXkgUDMgdG8gc1JHQiBhbmQgQlQyMDIwIHRyYW5zZm9ybSBtYXRyaXguCisgICAgICAgIG1EaXNwbGF5UDNUb1NyZ2IgPSBtWHl6VG9TcmdiICogbURpc3BsYXlQM1RvWHl6OworICAgICAgICBtRGlzcGxheVAzVG9CdDIwMjAgPSBtWHl6VG9CdDIwMjAgKiBtRGlzcGxheVAzVG9YeXo7CisKKyAgICAgICAgLy8gQ29tcHV0ZSBCVDIwMjAgdG8gc1JHQiBhbmQgRGlzcGxheSBQMyB0cmFuc2Zvcm0gbWF0cml4CisgICAgICAgIG1CdDIwMjBUb1NyZ2IgPSBtWHl6VG9TcmdiICogbUJ0MjAyMFRvWHl6OworICAgICAgICBtQnQyMDIwVG9EaXNwbGF5UDMgPSBtWHl6VG9EaXNwbGF5UDMgKiBtQnQyMDIwVG9YeXo7CisgICAgfQorCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLnRyYWNlR3B1Q29tcGxldGlvbiIsIHZhbHVlLCAiMCIpOworICAgIGlmIChhdG9pKHZhbHVlKSkgeworICAgICAgICBtVHJhY2VHcHVDb21wbGV0aW9uID0gdHJ1ZTsKKyAgICAgICAgbUZsdXNoVHJhY2VyID0gc3RkOjptYWtlX3VuaXF1ZTxGbHVzaFRyYWNlcj4odGhpcyk7CisgICAgfQorCisgICAgaWYgKGFyZ3Muc3VwcG9ydHNCYWNrZ3JvdW5kQmx1cikgeworICAgICAgICBtQmx1ckZpbHRlciA9IG5ldyBCbHVyRmlsdGVyKCp0aGlzKTsKKyAgICAgICAgY2hlY2tFcnJvcnMoIkJsdXJGaWx0ZXIgY3JlYXRpb24iKTsKKyAgICB9CisKKyAgICBtSW1hZ2VNYW5hZ2VyID0gc3RkOjptYWtlX3VuaXF1ZTxJbWFnZU1hbmFnZXI+KHRoaXMpOworICAgIG1JbWFnZU1hbmFnZXItPmluaXRUaHJlYWQoYXJncy5yZWFsdGltZSk7CisgICAgbURyYXdpbmdCdWZmZXIgPSBjcmVhdGVGcmFtZWJ1ZmZlcigpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9CisgICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcigxLCAxLCBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsICJwbGFjZWhvbGRlciIpOworCisgICAgY29uc3Qgc3RhdHVzX3QgZXJyID0gYnVmLT5pbml0Q2hlY2soKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBhbGxvY2F0aW5nIHBsYWNlaG9sZGVyIGJ1ZmZlcjogJWQiLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1QbGFjZWhvbGRlckJ1ZmZlciA9IGJ1Zi5nZXQoKTsKKyAgICBFR0xpbnQgYXR0cmlidXRlc1tdID0geworICAgICAgICAgICAgRUdMX05PTkUsCisgICAgfTsKKyAgICBtUGxhY2Vob2xkZXJJbWFnZSA9IGVnbENyZWF0ZUltYWdlS0hSKG1FR0xEaXNwbGF5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGFjZWhvbGRlckJ1ZmZlciwgYXR0cmlidXRlcyk7CisgICAgQUxPR0VfSUYobVBsYWNlaG9sZGVySW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUiwgIkZhaWxlZCB0byBjcmVhdGUgcGxhY2Vob2xkZXIgaW1hZ2U6ICUjeCIsCisgICAgICAgICAgICAgZWdsR2V0RXJyb3IoKSk7Cit9CisKK0dMRVNSZW5kZXJFbmdpbmU6On5HTEVTUmVuZGVyRW5naW5lKCkgeworICAgIC8vIERlc3Ryb3kgdGhlIGltYWdlIG1hbmFnZXIgZmlyc3QuCisgICAgbUltYWdlTWFuYWdlciA9IG51bGxwdHI7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbmRlcmluZ011dGV4KTsKKyAgICB1bmJpbmRGcmFtZUJ1ZmZlcihtRHJhd2luZ0J1ZmZlci5nZXQoKSk7CisgICAgbURyYXdpbmdCdWZmZXIgPSBudWxscHRyOworICAgIHdoaWxlICghbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5lbXB0eSgpKSB7CisgICAgICAgIEVHTEltYWdlS0hSIGV4cGlyZWQgPSBtRnJhbWVidWZmZXJJbWFnZUNhY2hlLmZyb250KCkuc2Vjb25kOworICAgICAgICBtRnJhbWVidWZmZXJJbWFnZUNhY2hlLnBvcF9mcm9udCgpOworICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIGV4cGlyZWQpOworICAgIH0KKyAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIG1QbGFjZWhvbGRlckltYWdlKTsKKyAgICBtSW1hZ2VDYWNoZS5jbGVhcigpOworICAgIGVnbE1ha2VDdXJyZW50KG1FR0xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICBlZ2xUZXJtaW5hdGUobUVHTERpc3BsYXkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8RnJhbWVidWZmZXI+IEdMRVNSZW5kZXJFbmdpbmU6OmNyZWF0ZUZyYW1lYnVmZmVyKCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEdMRnJhbWVidWZmZXI+KCp0aGlzKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEltYWdlPiBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVJbWFnZSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHTEltYWdlPigqdGhpcyk7Cit9CisKK0ZyYW1lYnVmZmVyKiBHTEVTUmVuZGVyRW5naW5lOjpnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKSB7CisgICAgcmV0dXJuIG1EcmF3aW5nQnVmZmVyLmdldCgpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnByaW1lQ2FjaGUoKSBjb25zdCB7CisgICAgUHJvZ3JhbUNhY2hlOjpnZXRJbnN0YW5jZSgpLnByaW1lQ2FjaGUobUluUHJvdGVjdGVkQ29udGV4dCA/IG1Qcm90ZWN0ZWRFR0xDb250ZXh0IDogbUVHTENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFyZ3MudXNlQ29sb3JNYW5hZ2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcmdzLnByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkpOworfQorCitiYXNlOjp1bmlxdWVfZmQgR0xFU1JlbmRlckVuZ2luZTo6Zmx1c2goKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXNOYXRpdmVGZW5jZVN5bmMoKSkgeworICAgICAgICByZXR1cm4gYmFzZTo6dW5pcXVlX2ZkKCk7CisgICAgfQorCisgICAgRUdMU3luY0tIUiBzeW5jID0gZWdsQ3JlYXRlU3luY0tIUihtRUdMRGlzcGxheSwgRUdMX1NZTkNfTkFUSVZFX0ZFTkNFX0FORFJPSUQsIG51bGxwdHIpOworICAgIGlmIChzeW5jID09IEVHTF9OT19TWU5DX0tIUikgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNyZWF0ZSBFR0wgbmF0aXZlIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gYmFzZTo6dW5pcXVlX2ZkKCk7CisgICAgfQorCisgICAgLy8gbmF0aXZlIGZlbmNlIGZkIHdpbGwgbm90IGJlIHBvcHVsYXRlZCB1bnRpbCBmbHVzaCgpIGlzIGRvbmUuCisgICAgZ2xGbHVzaCgpOworCisgICAgLy8gZ2V0IHRoZSBmZW5jZSBmZAorICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGVnbER1cE5hdGl2ZUZlbmNlRkRBTkRST0lEKG1FR0xEaXNwbGF5LCBzeW5jKSk7CisgICAgZWdsRGVzdHJveVN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMpOworICAgIGlmIChmZW5jZUZkID09IEVHTF9OT19OQVRJVkVfRkVOQ0VfRkRfQU5EUk9JRCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGR1cCBFR0wgbmF0aXZlIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgIH0KKworICAgIC8vIE9ubHkgdHJhY2UgaWYgd2UgaGF2ZSBhIHZhbGlkIGZlbmNlLCBhcyBjdXJyZW50IHVzYWdlIGZhbGxzIGJhY2sgdG8KKyAgICAvLyBjYWxsaW5nIGZpbmlzaCgpIGlmIHRoZSBmZW5jZSBmZCBpcyBpbnZhbGlkLgorICAgIGlmIChDQ19VTkxJS0VMWShtVHJhY2VHcHVDb21wbGV0aW9uICYmIG1GbHVzaFRyYWNlcikgJiYgZmVuY2VGZC5nZXQoKSA+PSAwKSB7CisgICAgICAgIG1GbHVzaFRyYWNlci0+cXVldWVTeW5jKGVnbENyZWF0ZVN5bmNLSFIobUVHTERpc3BsYXksIEVHTF9TWU5DX0ZFTkNFX0tIUiwgbnVsbHB0cikpOworICAgIH0KKworICAgIHJldHVybiBmZW5jZUZkOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmZpbmlzaCgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhc0ZlbmNlU3luYygpKSB7CisgICAgICAgIEFMT0dXKCJubyBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRUdMU3luY0tIUiBzeW5jID0gZWdsQ3JlYXRlU3luY0tIUihtRUdMRGlzcGxheSwgRUdMX1NZTkNfRkVOQ0VfS0hSLCBudWxscHRyKTsKKyAgICBpZiAoc3luYyA9PSBFR0xfTk9fU1lOQ19LSFIpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBjcmVhdGUgRUdMIGZlbmNlIHN5bmM6ICUjeCIsIGVnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKENDX1VOTElLRUxZKG1UcmFjZUdwdUNvbXBsZXRpb24gJiYgbUZsdXNoVHJhY2VyKSkgeworICAgICAgICBtRmx1c2hUcmFjZXItPnF1ZXVlU3luYyhlZ2xDcmVhdGVTeW5jS0hSKG1FR0xEaXNwbGF5LCBFR0xfU1lOQ19GRU5DRV9LSFIsIG51bGxwdHIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gd2FpdFN5bmMoc3luYywgRUdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUX0tIUik7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6d2FpdFN5bmMoRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MpIHsKKyAgICBFR0xpbnQgcmVzdWx0ID0gZWdsQ2xpZW50V2FpdFN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMsIGZsYWdzLCAyMDAwMDAwMDAwIC8qMiBzZWMqLyk7CisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICBlZ2xEZXN0cm95U3luY0tIUihtRUdMRGlzcGxheSwgc3luYyk7CisgICAgaWYgKHJlc3VsdCAhPSBFR0xfQ09ORElUSU9OX1NBVElTRklFRF9LSFIpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFR0xfVElNRU9VVF9FWFBJUkVEX0tIUikgeworICAgICAgICAgICAgQUxPR1coImZlbmNlIHdhaXQgdGltZWQgb3V0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiZXJyb3Igd2FpdGluZyBvbiBFR0wgZmVuY2U6ICUjeCIsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6d2FpdEZlbmNlKGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKSB7CisgICAgaWYgKCFHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkuaGFzTmF0aXZlRmVuY2VTeW5jKCkgfHwKKyAgICAgICAgIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXNXYWl0U3luYygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyByZWxlYXNlIHRoZSBmZCBhbmQgdHJhbnNmZXIgdGhlIG93bmVyc2hpcCB0byBFR0xTeW5jCisgICAgRUdMaW50IGF0dHJpYnNbXSA9IHtFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfRkRfQU5EUk9JRCwgZmVuY2VGZC5yZWxlYXNlKCksIEVHTF9OT05FfTsKKyAgICBFR0xTeW5jS0hSIHN5bmMgPSBlZ2xDcmVhdGVTeW5jS0hSKG1FR0xEaXNwbGF5LCBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRCwgYXR0cmlicyk7CisgICAgaWYgKHN5bmMgPT0gRUdMX05PX1NZTkNfS0hSKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIEVHTCBuYXRpdmUgZmVuY2Ugc3luYzogJSN4IiwgZWdsR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBYWFg6IFRoZSBzcGVjIGRyYWZ0IGlzIGluY29uc2lzdGVudCBhcyB0byB3aGV0aGVyIHRoaXMgc2hvdWxkIHJldHVybiBhbgorICAgIC8vIEVHTGludCBvciB2b2lkLiAgSWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZm9yIG5vdywgYXMgaXQncyBub3Qgc3RyaWN0bHkKKyAgICAvLyBuZWVkZWQuCisgICAgZWdsV2FpdFN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMsIDApOworICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7CisgICAgZWdsRGVzdHJveVN5bmNLSFIobUVHTERpc3BsYXksIHN5bmMpOworICAgIGlmIChlcnJvciAhPSBFR0xfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHdhaXQgZm9yIEVHTCBuYXRpdmUgZmVuY2Ugc3luYzogJSN4IiwgZXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6Y2xlYXJXaXRoQ29sb3IoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CisgICAgZ2xDbGVhckNvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmZpbGxSZWdpb25XaXRoQ29sb3IoY29uc3QgUmVnaW9uJiByZWdpb24sIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEpIHsKKyAgICBzaXplX3QgYzsKKyAgICBSZWN0IGNvbnN0KiByID0gcmVnaW9uLmdldEFycmF5KCZjKTsKKyAgICBNZXNoIG1lc2ggPSBNZXNoOjpCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQcmltaXRpdmUoTWVzaDo6VFJJQU5HTEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZlcnRpY2VzKGMgKiA2IC8qIGNvdW50ICovLCAyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBwb3NpdGlvbihtZXNoLmdldFBvc2l0aW9uQXJyYXk8dmVjMj4oKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjOyBpKyssIHIrKykgeworICAgICAgICBwb3NpdGlvbltpICogNiArIDBdLnggPSByLT5sZWZ0OworICAgICAgICBwb3NpdGlvbltpICogNiArIDBdLnkgPSByLT50b3A7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMV0ueCA9IHItPmxlZnQ7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMV0ueSA9IHItPmJvdHRvbTsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAyXS54ID0gci0+cmlnaHQ7CisgICAgICAgIHBvc2l0aW9uW2kgKiA2ICsgMl0ueSA9IHItPmJvdHRvbTsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAzXS54ID0gci0+bGVmdDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyAzXS55ID0gci0+dG9wOworICAgICAgICBwb3NpdGlvbltpICogNiArIDRdLnggPSByLT5yaWdodDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyA0XS55ID0gci0+Ym90dG9tOworICAgICAgICBwb3NpdGlvbltpICogNiArIDVdLnggPSByLT5yaWdodDsKKyAgICAgICAgcG9zaXRpb25baSAqIDYgKyA1XS55ID0gci0+dG9wOworICAgIH0KKyAgICBzZXR1cEZpbGxXaXRoQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGRyYXdNZXNoKG1lc2gpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldFNjaXNzb3IoY29uc3QgUmVjdCYgcmVnaW9uKSB7CisgICAgZ2xTY2lzc29yKHJlZ2lvbi5sZWZ0LCByZWdpb24udG9wLCByZWdpb24uZ2V0V2lkdGgoKSwgcmVnaW9uLmdldEhlaWdodCgpKTsKKyAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRpc2FibGVTY2lzc29yKCkgeworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmdlblRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QqIG5hbWVzKSB7CisgICAgZ2xHZW5UZXh0dXJlcyhjb3VudCwgbmFtZXMpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIG1UZXh0dXJlVmlldy5lcmFzZShuYW1lc1tpXSk7CisgICAgfQorICAgIGdsRGVsZXRlVGV4dHVyZXMoY291bnQsIG5hbWVzKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodWludDMyX3QgdGV4TmFtZSwgY29uc3QgSW1hZ2UmIGltYWdlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjb25zdCBHTEltYWdlJiBnbEltYWdlID0gc3RhdGljX2Nhc3Q8Y29uc3QgR0xJbWFnZSY+KGltYWdlKTsKKyAgICBjb25zdCBHTGVudW0gdGFyZ2V0ID0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVM7CisKKyAgICBnbEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4TmFtZSk7CisgICAgaWYgKGdsSW1hZ2UuZ2V0RUdMSW1hZ2UoKSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVModGFyZ2V0LCBzdGF0aWNfY2FzdDxHTGVnbEltYWdlT0VTPihnbEltYWdlLmdldEVHTEltYWdlKCkpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEdMRVNSZW5kZXJFbmdpbmU6OmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RmVuY2U+JiBidWZmZXJGZW5jZSkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgICAgICBhdXRvIGNhY2hlZEltYWdlID0gbUltYWdlQ2FjaGUuZmluZChidWZmZXItPmdldElkKCkpOworICAgICAgICBmb3VuZCA9IChjYWNoZWRJbWFnZSAhPSBtSW1hZ2VDYWNoZS5lbmQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UgY291bGRuJ3QgZmluZCB0aGUgaW1hZ2UgaW4gdGhlIGNhY2hlIGF0IHRoaXMgdGltZSwgdGhlbiBlaXRoZXIKKyAgICAvLyBTdXJmYWNlRmxpbmdlciBtZXNzZWQgdXAgcmVnaXN0ZXJpbmcgdGhlIGJ1ZmZlciBhaGVhZCBvZiB0aW1lIG9yIHdlIGdvdAorICAgIC8vIGJhY2tlZCB1cCBjcmVhdGluZyBvdGhlciBFR0xJbWFnZXMuCisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBzdGF0dXNfdCBjYWNoZVJlc3VsdCA9IG1JbWFnZU1hbmFnZXItPmNhY2hlKGJ1ZmZlcik7CisgICAgICAgIGlmIChjYWNoZVJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlUmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2hldGhlciBvciBub3Qgd2UgbmVlZGVkIHRvIGNhY2hlLCByZS1jaGVjayBtSW1hZ2VDYWNoZSB0byBtYWtlIHN1cmUgdGhhdAorICAgIC8vIHRoZXJlJ3MgYW4gRUdMSW1hZ2UuIFRoZSBjdXJyZW50IHRocmVhZGluZyBtb2RlbCBndWFyYW50ZWVzIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBkZXN0cm95IGEgY2FjaGVkIGltYWdlIHVudGlsIGl0J3MgcmVhbGx5IG5vdCBuZWVkZWQgYW55bW9yZSAoaS5lLiB0aGlzCisgICAgLy8gZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQpLCBzbyB0aGUgb25seSBwb3NzaWJpbGl0eSBpcyB0aGF0IHNvbWV0aGluZworICAgIC8vIHRlcnJpYmxlIHdlbnQgd3JvbmcgYW5kIHdlIHNob3VsZCBqdXN0IGJpbmQgc29tZXRoaW5nIGFuZCBtb3ZlIG9uLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbmRlcmluZ011dGV4KTsKKyAgICAgICAgYXV0byBjYWNoZWRJbWFnZSA9IG1JbWFnZUNhY2hlLmZpbmQoYnVmZmVyLT5nZXRJZCgpKTsKKworICAgICAgICBpZiAoY2FjaGVkSW1hZ2UgPT0gbUltYWdlQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGZhaWxlZCBjcmVhdGluZyB0aGUgaW1hZ2UgaWYgd2UgZ290IGhlcmUsIHNvIGJhaWwgb3V0LgorICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgYW4gRUdMSW1hZ2Ugd2hlbiByZW5kZXJpbmciKTsKKyAgICAgICAgICAgIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh0ZXhOYW1lLCAqY3JlYXRlSW1hZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh0ZXhOYW1lLCAqY2FjaGVkSW1hZ2UtPnNlY29uZCk7CisgICAgICAgIG1UZXh0dXJlVmlldy5pbnNlcnRfb3JfYXNzaWduKHRleE5hbWUsIGJ1ZmZlci0+Z2V0SWQoKSk7CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgdGhlIG5ldyBidWZmZXIgdG8gYmUgcmVhZHkuCisgICAgaWYgKGJ1ZmZlckZlbmNlICE9IG51bGxwdHIgJiYgYnVmZmVyRmVuY2UtPmlzVmFsaWQoKSkgeworICAgICAgICBpZiAoR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhc1dhaXRTeW5jKCkpIHsKKyAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGJ1ZmZlckZlbmNlLT5kdXAoKSk7CisgICAgICAgICAgICBpZiAoZmVuY2VGZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBkdXAnaW5nIGZlbmNlIGZkOiAlZCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF3YWl0RmVuY2Uoc3RkOjptb3ZlKGZlbmNlRmQpKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gd2FpdCBvbiBmZW5jZSBmZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYnVmZmVyRmVuY2UtPndhaXRGb3JldmVyKCJSZW5kZXJFbmdpbmU6OmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIiKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3Igd2FpdGluZyBmb3IgZmVuY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIHsKKyAgICBtSW1hZ2VNYW5hZ2VyLT5jYWNoZUFzeW5jKGJ1ZmZlciwgbnVsbHB0cik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxJbWFnZU1hbmFnZXI6OkJhcnJpZXI+IEdMRVNSZW5kZXJFbmdpbmU6OmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZygKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikgeworICAgIGF1dG8gYmFycmllciA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPigpOworICAgIG1JbWFnZU1hbmFnZXItPmNhY2hlQXN5bmMoYnVmZmVyLCBiYXJyaWVyKTsKKyAgICByZXR1cm4gYmFycmllcjsKK30KKworc3RhdHVzX3QgR0xFU1JlbmRlckVuZ2luZTo6Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVuZGVyaW5nTXV0ZXgpOworICAgICAgICBpZiAobUltYWdlQ2FjaGUuY291bnQoYnVmZmVyLT5nZXRJZCgpKSA+IDApIHsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBpbWFnZSB0aGVuIGZhaWwgZmFzdCBoZXJlLgorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBDcmVhdGUgdGhlIGltYWdlIHdpdGhvdXQgaG9sZGluZyBhIGxvY2sgc28gdGhhdCB3ZSBkb24ndCBibG9jayBhbnl0aGluZy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2U+IG5ld0ltYWdlID0gY3JlYXRlSW1hZ2UoKTsKKworICAgIGJvb2wgY3JlYXRlZCA9IG5ld0ltYWdlLT5zZXROYXRpdmVXaW5kb3dCdWZmZXIoYnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0VXNhZ2UoKSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKTsKKyAgICBpZiAoIWNyZWF0ZWQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UuIHNpemU9JXV4JXUgc3Q9JXUgdXNhZ2U9JSMiIFBSSXg2NCAiIGZtdD0lZCIsCisgICAgICAgICAgICAgIGJ1ZmZlci0+Z2V0V2lkdGgoKSwgYnVmZmVyLT5nZXRIZWlnaHQoKSwgYnVmZmVyLT5nZXRTdHJpZGUoKSwgYnVmZmVyLT5nZXRVc2FnZSgpLAorICAgICAgICAgICAgICBidWZmZXItPmdldFBpeGVsRm9ybWF0KCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgIGlmIChtSW1hZ2VDYWNoZS5jb3VudChidWZmZXItPmdldElkKCkpID4gMCkgeworICAgICAgICAgICAgLy8gSW4gdGhlb3J5IGl0J3MgcG9zc2libGUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIHJlY2FjaGUgdGhlIGltYWdlLAorICAgICAgICAgICAgLy8gc28gYmFpbCBvdXQgaWYgYW5vdGhlciB0aHJlYWQgd29uLgorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1JbWFnZUNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihidWZmZXItPmdldElkKCksIHN0ZDo6bW92ZShuZXdJbWFnZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgbUltYWdlTWFuYWdlci0+cmVsZWFzZUFzeW5jKGJ1ZmZlcklkLCBudWxscHRyKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEltYWdlTWFuYWdlcjo6QmFycmllcj4gR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZygKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQpIHsKKyAgICBhdXRvIGJhcnJpZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltYWdlTWFuYWdlcjo6QmFycmllcj4oKTsKKyAgICBtSW1hZ2VNYW5hZ2VyLT5yZWxlYXNlQXN5bmMoYnVmZmVySWQsIGJhcnJpZXIpOworICAgIHJldHVybiBiYXJyaWVyOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlckludGVybmFsKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlPiBpbWFnZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgIGNvbnN0IGF1dG8mIGNhY2hlZEltYWdlID0gbUltYWdlQ2FjaGUuZmluZChidWZmZXJJZCk7CisKKyAgICAgICAgaWYgKGNhY2hlZEltYWdlICE9IG1JbWFnZUNhY2hlLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiRGVzdHJveWluZyBpbWFnZSBmb3IgYnVmZmVyOiAlIiBQUkl1NjQsIGJ1ZmZlcklkKTsKKyAgICAgICAgICAgIC8vIE1vdmUgdGhlIGJ1ZmZlciBvdXQgb2YgY2FjaGUgZmlyc3QsIHNvIHRoYXQgd2UgY2FuIGRlc3Ryb3kKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgaG9sZGluZyB0aGUgY2FjaGUncyBsb2NrLgorICAgICAgICAgICAgaW1hZ2UgPSBzdGQ6Om1vdmUoY2FjaGVkSW1hZ2UtPnNlY29uZCk7CisgICAgICAgICAgICBtSW1hZ2VDYWNoZS5lcmFzZShidWZmZXJJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIkZhaWxlZCB0byBmaW5kIGltYWdlIGZvciBidWZmZXI6ICUiIFBSSXU2NCwgYnVmZmVySWQpOworfQorCitGbG9hdFJlY3QgR0xFU1JlbmRlckVuZ2luZTo6c2V0dXBMYXllckNyb3BwaW5nKGNvbnN0IExheWVyU2V0dGluZ3MmIGxheWVyLCBNZXNoJiBtZXNoKSB7CisgICAgLy8gVHJhbnNsYXRlIHdpbiBieSB0aGUgcm91bmRlZCBjb3JuZXJzIHJlY3QgY29vcmRpbmF0ZXMsIHRvIGhhdmUgYWxsIHZhbHVlcyBpbgorICAgIC8vIGxheWVyIGNvb3JkaW5hdGUgc3BhY2UuCisgICAgRmxvYXRSZWN0IGNyb3BXaW4gPSBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzOworICAgIGNvbnN0IEZsb2F0UmVjdCYgcm91bmRlZENvcm5lcnNDcm9wID0gbGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNDcm9wOworICAgIGNyb3BXaW4ubGVmdCAtPSByb3VuZGVkQ29ybmVyc0Nyb3AubGVmdDsKKyAgICBjcm9wV2luLnJpZ2h0IC09IHJvdW5kZWRDb3JuZXJzQ3JvcC5sZWZ0OworICAgIGNyb3BXaW4udG9wIC09IHJvdW5kZWRDb3JuZXJzQ3JvcC50b3A7CisgICAgY3JvcFdpbi5ib3R0b20gLT0gcm91bmRlZENvcm5lcnNDcm9wLnRvcDsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiBjcm9wQ29vcmRzKG1lc2guZ2V0Q3JvcENvb3JkQXJyYXk8dmVjMj4oKSk7CisgICAgY3JvcENvb3Jkc1swXSA9IHZlYzIoY3JvcFdpbi5sZWZ0LCBjcm9wV2luLnRvcCk7CisgICAgY3JvcENvb3Jkc1sxXSA9IHZlYzIoY3JvcFdpbi5sZWZ0LCBjcm9wV2luLnRvcCArIGNyb3BXaW4uZ2V0SGVpZ2h0KCkpOworICAgIGNyb3BDb29yZHNbMl0gPSB2ZWMyKGNyb3BXaW4ucmlnaHQsIGNyb3BXaW4udG9wICsgY3JvcFdpbi5nZXRIZWlnaHQoKSk7CisgICAgY3JvcENvb3Jkc1szXSA9IHZlYzIoY3JvcFdpbi5yaWdodCwgY3JvcFdpbi50b3ApOworCisgICAgc2V0dXBDb3JuZXJSYWRpdXNDcm9wU2l6ZShyb3VuZGVkQ29ybmVyc0Nyb3AuZ2V0V2lkdGgoKSwgcm91bmRlZENvcm5lcnNDcm9wLmdldEhlaWdodCgpKTsKKyAgICByZXR1cm4gY3JvcFdpbjsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpoYW5kbGVSb3VuZGVkQ29ybmVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExheWVyU2V0dGluZ3MmIGxheWVyLCBjb25zdCBNZXNoJiBtZXNoKSB7CisgICAgLy8gV2Ugc2VwYXJhdGUgdGhlIGxheWVyIGludG8gMyBwYXJ0cyBlc3NlbnRpYWxseSwgc3VjaCB0aGF0IHdlIG9ubHkgdHVybiBvbiBibGVuZGluZyBmb3IgdGhlCisgICAgLy8gdG9wIHJlY3RhbmdsZSBhbmQgdGhlIGJvdHRvbSByZWN0YW5nbGUsIGFuZCB0dXJuIG9mZiBibGVuZGluZyBmb3IgdGhlIG1pZGRsZSByZWN0YW5nbGUuCisgICAgRmxvYXRSZWN0IGJvdW5kcyA9IGxheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzQ3JvcDsKKworICAgIC8vIEV4cGxpY2l0bHkgY29tcHV0ZSB0aGUgdHJhbnNmb3JtIGZyb20gdGhlIGNsaXAgcmVjdGFuZ2xlIHRvIHRoZSBwaHlzaWNhbAorICAgIC8vIGRpc3BsYXkuIE5vcm1hbGx5LCB0aGlzIGlzIGRvbmUgaW4gZ2xWaWV3cG9ydCBidXQgd2UgZXhwbGljaXRseSBjb21wdXRlCisgICAgLy8gaXQgaGVyZSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHNjaXNzb3IgYm91bmRzIGNvcnJlY3QuCisgICAgY29uc3QgUmVjdCYgc291cmNlID0gZGlzcGxheS5jbGlwOworICAgIGNvbnN0IFJlY3QmIGRlc3RpbmF0aW9uID0gZGlzcGxheS5waHlzaWNhbERpc3BsYXk7CisgICAgLy8gSGVyZSB3ZSBjb21wdXRlIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtOgorICAgIC8vIDEuIFRyYW5zbGF0ZSB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBzb3VyY2UgY2xpcCB0byAoMCwgMCkKKyAgICAvLyAyLiBSb3RhdGUgdGhlIGNsaXAgcmVjdGFuZ2xlIGFib3V0IHRoZSBvcmlnaW4gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgIC8vIG9yaWVudGF0aW9uIGZsYWcKKyAgICAvLyAzLiBUcmFuc2xhdGUgdGhlIHRvcCBsZWZ0IGNvcm5lciBiYWNrIHRvIHRoZSBvcmlnaW4uCisgICAgLy8gNC4gU2NhbGUgdGhlIGNsaXAgcmVjdGFuZ2xlIHRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUgZGltZW5zaW9ucworICAgIC8vIDUuIFRyYW5zbGF0ZSB0aGUgdG9wIGxlZnQgY29ybmVyIHRvIHRoZSBkZXN0aW5hdGlvbiByZWN0YW5nbGUncyB0b3AgbGVmdAorICAgIC8vIGNvcm5lci4KKyAgICBjb25zdCBtYXQ0IHRyYW5zbGF0ZVNvdXJjZSA9IG1hdDQ6OnRyYW5zbGF0ZSh2ZWM0KC1zb3VyY2UubGVmdCwgLXNvdXJjZS50b3AsIDAsIDEpKTsKKyAgICBtYXQ0IHJvdGF0aW9uOworICAgIGludCBkaXNwbGFjZW1lbnRYID0gMDsKKyAgICBpbnQgZGlzcGxhY2VtZW50WSA9IDA7CisgICAgZmxvYXQgZGVzdGluYXRpb25XaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0PihkZXN0aW5hdGlvbi5nZXRXaWR0aCgpKTsKKyAgICBmbG9hdCBkZXN0aW5hdGlvbkhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihkZXN0aW5hdGlvbi5nZXRIZWlnaHQoKSk7CisgICAgZmxvYXQgc291cmNlV2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4oc291cmNlLmdldFdpZHRoKCkpOworICAgIGZsb2F0IHNvdXJjZUhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0Pihzb3VyY2UuZ2V0SGVpZ2h0KCkpOworICAgIGNvbnN0IGZsb2F0IHJvdDkwSW5SYWRpYW5zID0gMi4wZiAqIHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSAvIDQuMGY7CisgICAgc3dpdGNoIChkaXNwbGF5Lm9yaWVudGF0aW9uKSB7CisgICAgICAgIGNhc2UgdWk6OlRyYW5zZm9ybTo6Uk9UXzkwOgorICAgICAgICAgICAgcm90YXRpb24gPSBtYXQ0Ojpyb3RhdGUocm90OTBJblJhZGlhbnMsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WCA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzb3VyY2VIZWlnaHQsIHNvdXJjZVdpZHRoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHVpOjpUcmFuc2Zvcm06OlJPVF8xODA6CisgICAgICAgICAgICByb3RhdGlvbiA9IG1hdDQ6OnJvdGF0ZShyb3Q5MEluUmFkaWFucyAqIDIuMGYsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WSA9IHNvdXJjZS5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGRpc3BsYWNlbWVudFggPSBzb3VyY2UuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHVpOjpUcmFuc2Zvcm06OlJPVF8yNzA6CisgICAgICAgICAgICByb3RhdGlvbiA9IG1hdDQ6OnJvdGF0ZShyb3Q5MEluUmFkaWFucyAqIDMuMGYsIHZlYzMoMCwgMCwgMSkpOworICAgICAgICAgICAgZGlzcGxhY2VtZW50WSA9IHNvdXJjZS5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RkOjpzd2FwKHNvdXJjZUhlaWdodCwgc291cmNlV2lkdGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjb25zdCBtYXQ0IGludGVybWVkaWF0ZVRyYW5zbGF0aW9uID0gbWF0NDo6dHJhbnNsYXRlKHZlYzQoZGlzcGxhY2VtZW50WCwgZGlzcGxhY2VtZW50WSwgMCwgMSkpOworICAgIGNvbnN0IG1hdDQgc2NhbGUgPSBtYXQ0OjpzY2FsZSgKKyAgICAgICAgICAgIHZlYzQoZGVzdGluYXRpb25XaWR0aCAvIHNvdXJjZVdpZHRoLCBkZXN0aW5hdGlvbkhlaWdodCAvIHNvdXJjZUhlaWdodCwgMSwgMSkpOworICAgIGNvbnN0IG1hdDQgdHJhbnNsYXRlRGVzdGluYXRpb24gPQorICAgICAgICAgICAgbWF0NDo6dHJhbnNsYXRlKHZlYzQoZGVzdGluYXRpb24ubGVmdCwgZGVzdGluYXRpb24udG9wLCAwLCAxKSk7CisgICAgY29uc3QgbWF0NCBnbG9iYWxUcmFuc2Zvcm0gPQorICAgICAgICAgICAgdHJhbnNsYXRlRGVzdGluYXRpb24gKiBzY2FsZSAqIGludGVybWVkaWF0ZVRyYW5zbGF0aW9uICogcm90YXRpb24gKiB0cmFuc2xhdGVTb3VyY2U7CisKKyAgICBjb25zdCBtYXQ0IHRyYW5zZm9ybU1hdHJpeCA9IGdsb2JhbFRyYW5zZm9ybSAqIGxheWVyLmdlb21ldHJ5LnBvc2l0aW9uVHJhbnNmb3JtOworICAgIGNvbnN0IHZlYzQgbGVmdFRvcENvb3JkaW5hdGUoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIDEuMCwgMS4wKTsKKyAgICBjb25zdCB2ZWM0IHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZShib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20sIDEuMCwgMS4wKTsKKyAgICBjb25zdCB2ZWM0IGxlZnRUb3BDb29yZGluYXRlSW5CdWZmZXIgPSB0cmFuc2Zvcm1NYXRyaXggKiBsZWZ0VG9wQ29vcmRpbmF0ZTsKKyAgICBjb25zdCB2ZWM0IHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZUluQnVmZmVyID0gdHJhbnNmb3JtTWF0cml4ICogcmlnaHRCb3R0b21Db29yZGluYXRlOworICAgIGJvdW5kcyA9IEZsb2F0UmVjdChzdGQ6Om1pbihsZWZ0VG9wQ29vcmRpbmF0ZUluQnVmZmVyWzBdLCByaWdodEJvdHRvbUNvb3JkaW5hdGVJbkJ1ZmZlclswXSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGxlZnRUb3BDb29yZGluYXRlSW5CdWZmZXJbMV0sIHJpZ2h0Qm90dG9tQ29vcmRpbmF0ZUluQnVmZmVyWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgobGVmdFRvcENvb3JkaW5hdGVJbkJ1ZmZlclswXSwgcmlnaHRCb3R0b21Db29yZGluYXRlSW5CdWZmZXJbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChsZWZ0VG9wQ29vcmRpbmF0ZUluQnVmZmVyWzFdLCByaWdodEJvdHRvbUNvb3JkaW5hdGVJbkJ1ZmZlclsxXSkpOworCisgICAgLy8gRmluYWxseSwgd2UgY3V0IHRoZSBsYXllciBpbnRvIDMgcGFydHMsIHdpdGggdG9wIGFuZCBib3R0b20gcGFydHMgaGF2aW5nIHJvdW5kZWQgY29ybmVycworICAgIC8vIGFuZCB0aGUgbWlkZGxlIHBhcnQgd2l0aG91dCByb3VuZGVkIGNvcm5lcnMuCisgICAgY29uc3QgaW50MzJfdCByYWRpdXMgPSBjZWlsKGxheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzKTsKKyAgICBjb25zdCBSZWN0IHRvcFJlY3QoYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy5yaWdodCwgYm91bmRzLnRvcCArIHJhZGl1cyk7CisgICAgc2V0U2Npc3Nvcih0b3BSZWN0KTsKKyAgICBkcmF3TWVzaChtZXNoKTsKKyAgICBjb25zdCBSZWN0IGJvdHRvbVJlY3QoYm91bmRzLmxlZnQsIGJvdW5kcy5ib3R0b20gLSByYWRpdXMsIGJvdW5kcy5yaWdodCwgYm91bmRzLmJvdHRvbSk7CisgICAgc2V0U2Npc3Nvcihib3R0b21SZWN0KTsKKyAgICBkcmF3TWVzaChtZXNoKTsKKworICAgIC8vIFRoZSBtaWRkbGUgcGFydCBvZiB0aGUgbGF5ZXIgY2FuIHR1cm4gb2ZmIGJsZW5kaW5nLgorICAgIGlmICh0b3BSZWN0LmJvdHRvbSA8IGJvdHRvbVJlY3QudG9wKSB7CisgICAgICAgIGNvbnN0IFJlY3QgbWlkZGxlUmVjdChib3VuZHMubGVmdCwgYm91bmRzLnRvcCArIHJhZGl1cywgYm91bmRzLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSAtIHJhZGl1cyk7CisgICAgICAgIHNldFNjaXNzb3IobWlkZGxlUmVjdCk7CisgICAgICAgIG1TdGF0ZS5jb3JuZXJSYWRpdXMgPSAwLjA7CisgICAgICAgIGRpc2FibGVCbGVuZGluZygpOworICAgICAgICBkcmF3TWVzaChtZXNoKTsKKyAgICB9CisgICAgZGlzYWJsZVNjaXNzb3IoKTsKK30KKworc3RhdHVzX3QgR0xFU1JlbmRlckVuZ2luZTo6YmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgR0xGcmFtZWJ1ZmZlciogZ2xGcmFtZWJ1ZmZlciA9IHN0YXRpY19jYXN0PEdMRnJhbWVidWZmZXIqPihmcmFtZWJ1ZmZlcik7CisgICAgRUdMSW1hZ2VLSFIgZWdsSW1hZ2UgPSBnbEZyYW1lYnVmZmVyLT5nZXRFR0xJbWFnZSgpOworICAgIHVpbnQzMl90IHRleHR1cmVOYW1lID0gZ2xGcmFtZWJ1ZmZlci0+Z2V0VGV4dHVyZU5hbWUoKTsKKyAgICB1aW50MzJfdCBmcmFtZWJ1ZmZlck5hbWUgPSBnbEZyYW1lYnVmZmVyLT5nZXRGcmFtZWJ1ZmZlck5hbWUoKTsKKworICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgYW5kIHR1cm4gb3VyIEVHTEltYWdlIGludG8gYSB0ZXh0dXJlCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlTmFtZSk7CisgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFXzJELCAoR0xlZ2xJbWFnZU9FUyllZ2xJbWFnZSk7CisKKyAgICAvLyBCaW5kIHRoZSBGcmFtZWJ1ZmZlciB0byByZW5kZXIgaW50bworICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlck5hbWUpOworICAgIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsIEdMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9URVhUVVJFXzJELCB0ZXh0dXJlTmFtZSwgMCk7CisKKyAgICB1aW50MzJfdCBnbFN0YXR1cyA9IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTF9GUkFNRUJVRkZFUik7CisgICAgQUxPR0VfSUYoZ2xTdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTLCAiZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTIGVycm9yICVkIiwKKyAgICAgICAgICAgICBnbFN0YXR1cyk7CisKKyAgICByZXR1cm4gZ2xTdGF0dXMgPT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTID8gTk9fRVJST1IgOiBCQURfVkFMVUU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6dW5iaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIC8qZnJhbWVidWZmZXIqLykgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBiYWNrIHRvIG1haW4gZnJhbWVidWZmZXIKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Cit9CisKK2Jvb2wgR0xFU1JlbmRlckVuZ2luZTo6Y2xlYW51cFBvc3RSZW5kZXIoQ2xlYW51cE1vZGUgbW9kZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBpZiAobVByaW9yUmVzb3VyY2VzQ2xlYW5lZCB8fAorICAgICAgICAobUxhc3REcmF3RmVuY2UgIT0gbnVsbHB0ciAmJiBtTGFzdERyYXdGZW5jZS0+Z2V0U3RhdHVzKCkgIT0gRmVuY2U6OlN0YXR1czo6U2lnbmFsZWQpKSB7CisgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBwcmlvciBmcmFtZSBuZWVkaW5nIGNsZWFudXAsIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGEgYml0IG9mIGEgYmFuZC1haWQgZml4IGZvciBGcmFtZUNhcHR1cmVQcm9jZXNzb3IsIGFzIHdlIHNob3VsZAorICAgIC8vIG5vdCBuZWVkIHRvIGtlZXAgbWVtb3J5IGFyb3VuZCBpZiB3ZSBkb24ndCBuZWVkIHRvIGRvIHNvLgorICAgIGlmIChtb2RlID09IENsZWFudXBNb2RlOjpDTEVBTl9BTEwpIHsKKyAgICAgICAgLy8gVE9ETzogU3VyZmFjZUZsaW5nZXIgbWVtb3J5IHV0aWxpemF0aW9uIG1heSBiZW5lZml0IGZyb20gcmVzZXR0aW5nCisgICAgICAgIC8vIHRleHR1cmUgYmluZGluZ3MgYXMgd2VsbC4gQXNzZXNzIGlmIGl0IGRvZXMgYW5kIHRoZXJlJ3Mgbm8gcGVyZm9ybWFuY2UgcmVncmVzc2lvbgorICAgICAgICAvLyB3aGVuIHJlYmluZGluZyB0aGUgc2FtZSBpbWFnZSBkYXRhIHRvIHRoZSBzYW1lIHRleHR1cmUsIGFuZCBpZiBzbyB0aGVuIGl0cyBtb2RlCisgICAgICAgIC8vIGJlaGF2aW9yIGNhbiBiZSB0d2Vha2VkLgorICAgICAgICBpZiAobVBsYWNlaG9sZGVySW1hZ2UgIT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICAgICAgZm9yIChhdXRvIFt0ZXh0dXJlTmFtZSwgYnVmZmVySWRdIDogbVRleHR1cmVWaWV3KSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcklkICYmIG1QbGFjZWhvbGRlckltYWdlICE9IEVHTF9OT19JTUFHRV9LSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgdGV4dHVyZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEdMZWdsSW1hZ2VPRVM+KG1QbGFjZWhvbGRlckltYWdlKSk7CisgICAgICAgICAgICAgICAgICAgIG1UZXh0dXJlVmlld1t0ZXh0dXJlTmFtZV0gPSBzdGQ6Om51bGxvcHQ7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZW5kZXJpbmdNdXRleCk7CisgICAgICAgICAgICBtSW1hZ2VDYWNoZS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQmluZCB0aGUgdGV4dHVyZSB0byBwbGFjZWhvbGRlciBzbyB0aGF0IGJhY2tpbmcgaW1hZ2UgZGF0YSBjYW4gYmUgZnJlZWQuCisgICAgR0xGcmFtZWJ1ZmZlciogZ2xGcmFtZWJ1ZmZlciA9IHN0YXRpY19jYXN0PEdMRnJhbWVidWZmZXIqPihnZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKSk7CisgICAgZ2xGcmFtZWJ1ZmZlci0+YWxsb2NhdGVCdWZmZXJzKDEsIDEsIG1QbGFjZWhvbGRlckRyYXdCdWZmZXIpOworICAgIC8vIFJlbGVhc2UgdGhlIGNhY2hlZCBmZW5jZSBoZXJlLCBzbyB0aGF0IHdlIGRvbid0IGNodXJuIHJlYWxsb2NhdGlvbnMgd2hlbgorICAgIC8vIHdlIGNvdWxkIG5vLW9wIHJlcGVhdGVkIGNhbGxzIG9mIHRoaXMgbWV0aG9kIGluc3RlYWQuCisgICAgbUxhc3REcmF3RmVuY2UgPSBudWxscHRyOworICAgIG1QcmlvclJlc291cmNlc0NsZWFuZWQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNoZWNrRXJyb3JzKCkgY29uc3QgeworICAgIGNoZWNrRXJyb3JzKG51bGxwdHIpOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmNoZWNrRXJyb3JzKGNvbnN0IGNoYXIqIHRhZykgY29uc3QgeworICAgIGRvIHsKKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBlcnJvciBmbGFnCisgICAgICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKKyAgICAgICAgaWYgKGVycm9yID09IEdMX05PX0VSUk9SKSBicmVhazsKKyAgICAgICAgaWYgKHRhZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiR0wgZXJyb3IgMHglMDR4IiwgaW50KGVycm9yKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiR0wgZXJyb3I6ICVzIC0+IDB4JTA0eCIsIHRhZywgaW50KGVycm9yKSk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICh0cnVlKTsKK30KKworYm9vbCBHTEVTUmVuZGVyRW5naW5lOjpzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcm90ZWN0ZWRFR0xDb250ZXh0ICE9IEVHTF9OT19DT05URVhUOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OnVzZVByb3RlY3RlZENvbnRleHQoYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KSB7CisgICAgaWYgKHVzZVByb3RlY3RlZENvbnRleHQgPT0gbUluUHJvdGVjdGVkQ29udGV4dCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHVzZVByb3RlY3RlZENvbnRleHQgJiYgbVByb3RlY3RlZEVHTENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBFR0xTdXJmYWNlIHN1cmZhY2UgPSB1c2VQcm90ZWN0ZWRDb250ZXh0ID8gbVByb3RlY3RlZFN0dWJTdXJmYWNlIDogbVN0dWJTdXJmYWNlOworICAgIGNvbnN0IEVHTENvbnRleHQgY29udGV4dCA9IHVzZVByb3RlY3RlZENvbnRleHQgPyBtUHJvdGVjdGVkRUdMQ29udGV4dCA6IG1FR0xDb250ZXh0OworICAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9IGVnbE1ha2VDdXJyZW50KG1FR0xEaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KSA9PSBFR0xfVFJVRTsKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBtSW5Qcm90ZWN0ZWRDb250ZXh0ID0gdXNlUHJvdGVjdGVkQ29udGV4dDsKKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CitFR0xJbWFnZUtIUiBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVGcmFtZWJ1ZmZlckltYWdlSWZOZWVkZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcm90ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IEdyYXBoaWNCdWZmZXI6OmZyb20obmF0aXZlQnVmZmVyKTsKKyAgICBpZiAodXNlRnJhbWVidWZmZXJDYWNoZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGltYWdlIDogbUZyYW1lYnVmZmVySW1hZ2VDYWNoZSkgeworICAgICAgICAgICAgaWYgKGltYWdlLmZpcnN0ID09IGdyYXBoaWNCdWZmZXItPmdldElkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2Uuc2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEVHTGludCBhdHRyaWJ1dGVzW10gPSB7CisgICAgICAgICAgICBpc1Byb3RlY3RlZCA/IEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQgOiBFR0xfTk9ORSwKKyAgICAgICAgICAgIGlzUHJvdGVjdGVkID8gRUdMX1RSVUUgOiBFR0xfTk9ORSwKKyAgICAgICAgICAgIEVHTF9OT05FLAorICAgIH07CisgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBlZ2xDcmVhdGVJbWFnZUtIUihtRUdMRGlzcGxheSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVCdWZmZXIsIGF0dHJpYnV0ZXMpOworICAgIGlmICh1c2VGcmFtZWJ1ZmZlckNhY2hlKSB7CisgICAgICAgIGlmIChpbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgICAgICAgICAgaWYgKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuc2l6ZSgpID49IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVTaXplKSB7CisgICAgICAgICAgICAgICAgRUdMSW1hZ2VLSFIgZXhwaXJlZCA9IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUuZnJvbnQoKS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIobUVHTERpc3BsYXksIGV4cGlyZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUZyYW1lYnVmZmVySW1hZ2VDYWNoZS5wdXNoX2JhY2soe2dyYXBoaWNCdWZmZXItPmdldElkKCksIGltYWdlfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK3N0YXR1c190IEdMRVNSZW5kZXJFbmdpbmU6OmRyYXdMYXllcnMoY29uc3QgRGlzcGxheVNldHRpbmdzJiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBMYXllclNldHRpbmdzKj4mIGxheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlLCBiYXNlOjp1bmlxdWVfZmQmJiBidWZmZXJGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6dW5pcXVlX2ZkKiBkcmF3RmVuY2UpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChsYXllcnMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiRHJhd2luZyBlbXB0eSBsYXllciBzdGFjayIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlckZlbmNlLmdldCgpID49IDApIHsKKyAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBmZW5jZSBmb3IgcGFzc2luZyB0byB3YWl0RmVuY2UuCisgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCBidWZmZXJGZW5jZUR1cChkdXAoYnVmZmVyRmVuY2UuZ2V0KCkpKTsKKyAgICAgICAgaWYgKGJ1ZmZlckZlbmNlRHVwIDwgMCB8fCAhd2FpdEZlbmNlKHN0ZDo6bW92ZShidWZmZXJGZW5jZUR1cCkpKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiV2FpdGluZyBiZWZvcmUgZHJhdyIpOworICAgICAgICAgICAgc3luY193YWl0KGJ1ZmZlckZlbmNlLmdldCgpLCAtMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIk5vIG91dHB1dCBidWZmZXIgcHJvdmlkZWQuIEFib3J0aW5nIEdQVSBjb21wb3NpdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QmluZE5hdGl2ZUJ1ZmZlckFzRnJhbWVidWZmZXI+IGZibzsKKyAgICAvLyBHYXRoZXJpbmcgbGF5ZXJzIHRoYXQgcmVxdWVzdGVkIGJsdXIsIHdlJ2xsIG5lZWQgdGhlbSB0byBkZWNpZGUgd2hlbiB0byByZW5kZXIgdG8gYW4KKyAgICAvLyBvZmZzY3JlZW4gYnVmZmVyLCBhbmQgd2hlbiB0byByZW5kZXIgdG8gdGhlIG5hdGl2ZSBidWZmZXIuCisgICAgc3RkOjpkZXF1ZTxjb25zdCBMYXllclNldHRpbmdzKj4gYmx1ckxheWVyczsKKyAgICBpZiAoQ0NfTElLRUxZKG1CbHVyRmlsdGVyICE9IG51bGxwdHIpKSB7CisgICAgICAgIGZvciAoYXV0byBsYXllciA6IGxheWVycykgeworICAgICAgICAgICAgaWYgKGxheWVyLT5iYWNrZ3JvdW5kQmx1clJhZGl1cyA+IDApIHsKKyAgICAgICAgICAgICAgICBibHVyTGF5ZXJzLnB1c2hfYmFjayhsYXllcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgYXV0byBibHVyTGF5ZXJzU2l6ZSA9IGJsdXJMYXllcnMuc2l6ZSgpOworCisgICAgaWYgKGJsdXJMYXllcnNTaXplID09IDApIHsKKyAgICAgICAgZmJvID0gc3RkOjptYWtlX3VuaXF1ZTxCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcj4oKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKS0+Z2V0TmF0aXZlQnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lYnVmZmVyQ2FjaGUpOworICAgICAgICBpZiAoZmJvLT5nZXRTdGF0dXMoKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBiaW5kIGZyYW1lYnVmZmVyISBBYm9ydGluZyBHUFUgY29tcG9zaXRpb24gZm9yIGJ1ZmZlciAoJXApLiIsCisgICAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICBjaGVja0Vycm9ycygpOworICAgICAgICAgICAgcmV0dXJuIGZiby0+Z2V0U3RhdHVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0Vmlld3BvcnRBbmRQcm9qZWN0aW9uKGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LCBkaXNwbGF5LmNsaXApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldFZpZXdwb3J0QW5kUHJvamVjdGlvbihkaXNwbGF5LnBoeXNpY2FsRGlzcGxheSwgZGlzcGxheS5jbGlwKTsKKyAgICAgICAgYXV0byBzdGF0dXMgPQorICAgICAgICAgICAgICAgIG1CbHVyRmlsdGVyLT5zZXRBc0RyYXdUYXJnZXQoZGlzcGxheSwgYmx1ckxheWVycy5mcm9udCgpLT5iYWNrZ3JvdW5kQmx1clJhZGl1cyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJlcGFyZSBibHVyIGZpbHRlciEgQWJvcnRpbmcgR1BVIGNvbXBvc2l0aW9uIGZvciBidWZmZXIgKCVwKS4iLAorICAgICAgICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjbGVhciB0aGUgZW50aXJlIGJ1ZmZlciwgc29tZXRpbWVzIHdoZW4gd2UgcmV1c2UgYnVmZmVycyB3ZSdkIHBlcnNpc3QKKyAgICAvLyBnaG9zdCBpbWFnZXMgb3RoZXJ3aXNlLgorICAgIC8vIHdlIGFsc28gcmVxdWlyZSBhIGZ1bGwgdHJhbnNwYXJlbnQgZnJhbWVidWZmZXIgZm9yIG92ZXJsYXlzLiBUaGlzIGlzCisgICAgLy8gcHJvYmFibHkgbm90IHF1aXRlIGVmZmljaWVudCBvbiBhbGwgR1BVcywgc2luY2Ugd2UgY291bGQgZmlsdGVyIG91dAorICAgIC8vIG9wYXF1ZSBsYXllcnMuCisgICAgY2xlYXJXaXRoQ29sb3IoMC4wLCAwLjAsIDAuMCwgMC4wKTsKKworICAgIHNldE91dHB1dERhdGFTcGFjZShkaXNwbGF5Lm91dHB1dERhdGFzcGFjZSk7CisgICAgc2V0RGlzcGxheU1heEx1bWluYW5jZShkaXNwbGF5Lm1heEx1bWluYW5jZSk7CisKKyAgICBjb25zdCBtYXQ0IHByb2plY3Rpb25NYXRyaXggPQorICAgICAgICAgICAgdWk6OlRyYW5zZm9ybShkaXNwbGF5Lm9yaWVudGF0aW9uKS5hc01hdHJpeDQoKSAqIG1TdGF0ZS5wcm9qZWN0aW9uTWF0cml4OworICAgIGlmICghZGlzcGxheS5jbGVhclJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZmlsbFJlZ2lvbldpdGhDb2xvcihkaXNwbGF5LmNsZWFyUmVnaW9uLCAwLjAsIDAuMCwgMC4wLCAxLjApOworICAgIH0KKworICAgIE1lc2ggbWVzaCA9IE1lc2g6OkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByaW1pdGl2ZShNZXNoOjpUUklBTkdMRV9GQU4pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmVydGljZXMoNCAvKiBjb3VudCAqLywgMiAvKiBzaXplICovKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRleENvb3JkcygyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Q3JvcENvb3JkcygyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICBmb3IgKGF1dG8gY29uc3QgbGF5ZXIgOiBsYXllcnMpIHsKKyAgICAgICAgaWYgKGJsdXJMYXllcnMuc2l6ZSgpID4gMCAmJiBibHVyTGF5ZXJzLmZyb250KCkgPT0gbGF5ZXIpIHsKKyAgICAgICAgICAgIGJsdXJMYXllcnMucG9wX2Zyb250KCk7CisKKyAgICAgICAgICAgIGF1dG8gc3RhdHVzID0gbUJsdXJGaWx0ZXItPnByZXBhcmUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlbmRlciBibHVyIGVmZmVjdCEgQWJvcnRpbmcgR1BVIGNvbXBvc2l0aW9uIGZvciBidWZmZXIgKCVwKS4iLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygiQ2FuJ3QgcmVuZGVyIGZpcnN0IGJsdXIgcGFzcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChibHVyTGF5ZXJzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uZSBibHVycmluZywgdGltZSB0byBiaW5kIHRoZSBuYXRpdmUgRkJPIGFuZCByZW5kZXIgb3VyIGJsdXIgb250byBpdC4KKyAgICAgICAgICAgICAgICBmYm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEJpbmROYXRpdmVCdWZmZXJBc0ZyYW1lYnVmZmVyPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0TmF0aXZlQnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVidWZmZXJDYWNoZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmJvLT5nZXRTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICBzZXRWaWV3cG9ydEFuZFByb2plY3Rpb24oZGlzcGxheS5waHlzaWNhbERpc3BsYXksIGRpc3BsYXkuY2xpcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgc3RpbGwgc29tZXRoaW5nIGVsc2UgdG8gYmx1ciwgc28gbGV0J3Mga2VlcCByZW5kZXJpbmcgdG8gb3VyIEZCTworICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdG8gdGhlIGRpc3BsYXkuCisgICAgICAgICAgICAgICAgc3RhdHVzID0gbUJsdXJGaWx0ZXItPnNldEFzRHJhd1RhcmdldChkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ckxheWVycy5mcm9udCgpLT5iYWNrZ3JvdW5kQmx1clJhZGl1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBiaW5kIGZyYW1lYnVmZmVyISBBYm9ydGluZyBHUFUgY29tcG9zaXRpb24gZm9yIGJ1ZmZlciAoJXApLiIsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCJDYW4ndCBiaW5kIG5hdGl2ZSBmcmFtZWJ1ZmZlciIpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CbHVyRmlsdGVyLT5yZW5kZXIoYmx1ckxheWVyc1NpemUgPiAxKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlbmRlciBibHVyIGVmZmVjdCEgQWJvcnRpbmcgR1BVIGNvbXBvc2l0aW9uIGZvciBidWZmZXIgKCVwKS4iLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjaGVja0Vycm9ycygiQ2FuJ3QgcmVuZGVyIGJsdXIgZmlsdGVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1TdGF0ZS5tYXhNYXN0ZXJpbmdMdW1pbmFuY2UgPSBsYXllci0+c291cmNlLmJ1ZmZlci5tYXhNYXN0ZXJpbmdMdW1pbmFuY2U7CisgICAgICAgIG1TdGF0ZS5tYXhDb250ZW50THVtaW5hbmNlID0gbGF5ZXItPnNvdXJjZS5idWZmZXIubWF4Q29udGVudEx1bWluYW5jZTsKKyAgICAgICAgbVN0YXRlLnByb2plY3Rpb25NYXRyaXggPSBwcm9qZWN0aW9uTWF0cml4ICogbGF5ZXItPmdlb21ldHJ5LnBvc2l0aW9uVHJhbnNmb3JtOworCisgICAgICAgIGNvbnN0IEZsb2F0UmVjdCBib3VuZHMgPSBsYXllci0+Z2VvbWV0cnkuYm91bmRhcmllczsKKyAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4gcG9zaXRpb24obWVzaC5nZXRQb3NpdGlvbkFycmF5PHZlYzI+KCkpOworICAgICAgICBwb3NpdGlvblswXSA9IHZlYzIoYm91bmRzLmxlZnQsIGJvdW5kcy50b3ApOworICAgICAgICBwb3NpdGlvblsxXSA9IHZlYzIoYm91bmRzLmxlZnQsIGJvdW5kcy5ib3R0b20pOworICAgICAgICBwb3NpdGlvblsyXSA9IHZlYzIoYm91bmRzLnJpZ2h0LCBib3VuZHMuYm90dG9tKTsKKyAgICAgICAgcG9zaXRpb25bM10gPSB2ZWMyKGJvdW5kcy5yaWdodCwgYm91bmRzLnRvcCk7CisKKyAgICAgICAgc2V0dXBMYXllckNyb3BwaW5nKCpsYXllciwgbWVzaCk7CisgICAgICAgIHNldENvbG9yVHJhbnNmb3JtKGRpc3BsYXkuY29sb3JUcmFuc2Zvcm0gKiBsYXllci0+Y29sb3JUcmFuc2Zvcm0pOworCisgICAgICAgIGJvb2wgdXNlUHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBkaXNhYmxlVGV4dHVyZSA9IHRydWU7CisgICAgICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGxheWVyLT5zb3VyY2UuYnVmZmVyLmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkaXNhYmxlVGV4dHVyZSA9IGZhbHNlOworICAgICAgICAgICAgaXNPcGFxdWUgPSBsYXllci0+c291cmNlLmJ1ZmZlci5pc09wYXF1ZTsKKworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ0J1ZiA9IGxheWVyLT5zb3VyY2UuYnVmZmVyLmJ1ZmZlcjsKKyAgICAgICAgICAgIGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIobGF5ZXItPnNvdXJjZS5idWZmZXIudGV4dHVyZU5hbWUsIGdCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5zb3VyY2UuYnVmZmVyLmZlbmNlKTsKKworICAgICAgICAgICAgdXNlUHJlbXVsdGlwbGllZEFscGhhID0gbGF5ZXItPnNvdXJjZS5idWZmZXIudXNlUHJlbXVsdGlwbGllZEFscGhhOworICAgICAgICAgICAgVGV4dHVyZSB0ZXh0dXJlKFRleHR1cmU6OlRFWFRVUkVfRVhURVJOQUwsIGxheWVyLT5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lKTsKKyAgICAgICAgICAgIG1hdDQgdGV4TWF0cml4ID0gbGF5ZXItPnNvdXJjZS5idWZmZXIudGV4dHVyZVRyYW5zZm9ybTsKKworICAgICAgICAgICAgdGV4dHVyZS5zZXRNYXRyaXgodGV4TWF0cml4LmFzQXJyYXkoKSk7CisgICAgICAgICAgICB0ZXh0dXJlLnNldEZpbHRlcmluZyhsYXllci0+c291cmNlLmJ1ZmZlci51c2VUZXh0dXJlRmlsdGVyaW5nKTsKKworICAgICAgICAgICAgdGV4dHVyZS5zZXREaW1lbnNpb25zKGdCdWYtPmdldFdpZHRoKCksIGdCdWYtPmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgIHNldFNvdXJjZVk0MTBCVDIwMjAobGF5ZXItPnNvdXJjZS5idWZmZXIuaXNZNDEwQlQyMDIwKTsKKworICAgICAgICAgICAgcmVuZGVyZW5naW5lOjpNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPiB0ZXhDb29yZHMobWVzaC5nZXRUZXhDb29yZEFycmF5PHZlYzI+KCkpOworICAgICAgICAgICAgdGV4Q29vcmRzWzBdID0gdmVjMigwLjAsIDAuMCk7CisgICAgICAgICAgICB0ZXhDb29yZHNbMV0gPSB2ZWMyKDAuMCwgMS4wKTsKKyAgICAgICAgICAgIHRleENvb3Jkc1syXSA9IHZlYzIoMS4wLCAxLjApOworICAgICAgICAgICAgdGV4Q29vcmRzWzNdID0gdmVjMigxLjAsIDAuMCk7CisgICAgICAgICAgICBzZXR1cExheWVyVGV4dHVyaW5nKHRleHR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgaGFsZjMgc29saWRDb2xvciA9IGxheWVyLT5zb3VyY2Uuc29saWRDb2xvcjsKKyAgICAgICAgY29uc3QgaGFsZjQgY29sb3IgPSBoYWxmNChzb2xpZENvbG9yLnIsIHNvbGlkQ29sb3IuZywgc29saWRDb2xvci5iLCBsYXllci0+YWxwaGEpOworICAgICAgICAvLyBCdWZmZXIgc291cmNlcyB3aWxsIGhhdmUgYSBibGFjayBzb2xpZCBjb2xvciBpZ25vcmVkIGluIHRoZSBzaGFkZXIsCisgICAgICAgIC8vIHNvIGluIHRoYXQgc2NlbmFyaW8gdGhlIHNvbGlkIGNvbG9yIHBhc3NlZCBoZXJlIGlzIGFyYml0cmFyeS4KKyAgICAgICAgc2V0dXBMYXllckJsZW5kaW5nKHVzZVByZW11bHRpcGxpZWRBbHBoYSwgaXNPcGFxdWUsIGRpc2FibGVUZXh0dXJlLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc1JhZGl1cyk7CisgICAgICAgIGlmIChsYXllci0+ZGlzYWJsZUJsZW5kaW5nKSB7CisgICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgICAgICB9CisgICAgICAgIHNldFNvdXJjZURhdGFTcGFjZShsYXllci0+c291cmNlRGF0YXNwYWNlKTsKKworICAgICAgICBpZiAobGF5ZXItPnNoYWRvdy5sZW5ndGggPiAwLjBmKSB7CisgICAgICAgICAgICBoYW5kbGVTaGFkb3cobGF5ZXItPmdlb21ldHJ5LmJvdW5kYXJpZXMsIGxheWVyLT5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc1JhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+c2hhZG93KTsKKyAgICAgICAgfQorICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gZG8gYSBzcGVjaWFsIGhhbmRsaW5nIGZvciByb3VuZGVkIGNvcm5lcnMgd2hlbiBoYXZpbmcgcm91bmRlZCBjb3JuZXJzCisgICAgICAgIC8vIGlzIHRoZSBvbmx5IHJlYXNvbiBpdCBuZWVkcyB0byB0dXJuIG9uIGJsZW5kaW5nLCBvdGhlcndpc2UsIHdlIGhhbmRsZSBpdCBsaWtlIHRoZQorICAgICAgICAvLyB1c3VhbCB3YXkgc2luY2UgaXQgbmVlZHMgdG8gdHVybiBvbiBibGVuZGluZyBhbnl3YXkuCisgICAgICAgIGVsc2UgaWYgKGxheWVyLT5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc1JhZGl1cyA+IDAuMCAmJiBjb2xvci5hID49IDEuMGYgJiYgaXNPcGFxdWUpIHsKKyAgICAgICAgICAgIGhhbmRsZVJvdW5kZWRDb3JuZXJzKGRpc3BsYXksICpsYXllciwgbWVzaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkcmF3TWVzaChtZXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENsZWFudXAgaWYgdGhlcmUncyBhIGJ1ZmZlciBzb3VyY2UKKyAgICAgICAgaWYgKGxheWVyLT5zb3VyY2UuYnVmZmVyLmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkaXNhYmxlQmxlbmRpbmcoKTsKKyAgICAgICAgICAgIHNldFNvdXJjZVk0MTBCVDIwMjAoZmFsc2UpOworICAgICAgICAgICAgZGlzYWJsZVRleHR1cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRyYXdGZW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICpkcmF3RmVuY2UgPSBmbHVzaCgpOworICAgIH0KKyAgICAvLyBJZiBmbHVzaCBmYWlsZWQgb3Igd2UgZG9uJ3Qgc3VwcG9ydCBuYXRpdmUgZmVuY2VzLCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQorICAgIC8vIGdsIGNvbW1hbmQgc3RyZWFtIHRvIGJlIGV4ZWN1dGVkLgorICAgIGlmIChkcmF3RmVuY2UgPT0gbnVsbHB0ciB8fCBkcmF3RmVuY2UtPmdldCgpIDwgMCkgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSBmaW5pc2goKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIFJlbmRlckVuZ2luZSBjb21tYW5kcyIpOworICAgICAgICAgICAgY2hlY2tFcnJvcnMoKTsKKyAgICAgICAgICAgIC8vIENoYW5jZXMgYXJlLCBzb21ldGhpbmcgaWxsZWdhbCBoYXBwZW5lZCAoZWl0aGVyIHRoZSBjYWxsZXIgcGFzc2VkCisgICAgICAgICAgICAvLyB1cyBiYWQgcGFyYW1ldGVycywgb3Igd2UgbWVzc2VkIHVwIG91ciBzaGFkZXIgZ2VuZXJhdGlvbikuCisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgbUxhc3REcmF3RmVuY2UgPSBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIGRyYXdGZW5jZSwgc28gd2UgbmVlZCB0byBkdXBsaWNhdGUgdGhlCisgICAgICAgIC8vIGZkIGhlcmUuCisgICAgICAgIG1MYXN0RHJhd0ZlbmNlID0gbmV3IEZlbmNlKGR1cChkcmF3RmVuY2UtPmdldCgpKSk7CisgICAgfQorICAgIG1QcmlvclJlc291cmNlc0NsZWFuZWQgPSBmYWxzZTsKKworICAgIGNoZWNrRXJyb3JzKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldFZpZXdwb3J0QW5kUHJvamVjdGlvbihSZWN0IHZpZXdwb3J0LCBSZWN0IGNsaXApIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIG1WcFdpZHRoID0gdmlld3BvcnQuZ2V0V2lkdGgoKTsKKyAgICBtVnBIZWlnaHQgPSB2aWV3cG9ydC5nZXRIZWlnaHQoKTsKKworICAgIC8vIFdlIHBhc3MgdGhlIHRvcCBsZWZ0IGNvcm5lciBpbnN0ZWFkIG9mIHRoZSBib3R0b20gbGVmdCBjb3JuZXIsCisgICAgLy8gYmVjYXVzZSBzaW5jZSB3ZSdyZSByZW5kZXJpbmcgb2ZmLXNjcmVlbiBmaXJzdC4KKyAgICBnbFZpZXdwb3J0KHZpZXdwb3J0LmxlZnQsIHZpZXdwb3J0LnRvcCwgbVZwV2lkdGgsIG1WcEhlaWdodCk7CisKKyAgICBtU3RhdGUucHJvamVjdGlvbk1hdHJpeCA9IG1hdDQ6Om9ydGhvKGNsaXAubGVmdCwgY2xpcC5yaWdodCwgY2xpcC50b3AsIGNsaXAuYm90dG9tLCAwLCAxKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXR1cExheWVyQmxlbmRpbmcoYm9vbCBwcmVtdWx0aXBsaWVkQWxwaGEsIGJvb2wgb3BhcXVlLCBib29sIGRpc2FibGVUZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFsZjQmIGNvbG9yLCBmbG9hdCBjb3JuZXJSYWRpdXMpIHsKKyAgICBtU3RhdGUuaXNQcmVtdWx0aXBsaWVkQWxwaGEgPSBwcmVtdWx0aXBsaWVkQWxwaGE7CisgICAgbVN0YXRlLmlzT3BhcXVlID0gb3BhcXVlOworICAgIG1TdGF0ZS5jb2xvciA9IGNvbG9yOworICAgIG1TdGF0ZS5jb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXM7CisKKyAgICBpZiAoZGlzYWJsZVRleHR1cmUpIHsKKyAgICAgICAgbVN0YXRlLnRleHR1cmVFbmFibGVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGNvbG9yLmEgPCAxLjBmIHx8ICFvcGFxdWUgfHwgY29ybmVyUmFkaXVzID4gMC4wZikgeworICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7CisgICAgICAgIGdsQmxlbmRGdW5jKHByZW11bHRpcGxpZWRBbHBoYSA/IEdMX09ORSA6IEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICB9Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0U291cmNlWTQxMEJUMjAyMChib29sIGVuYWJsZSkgeworICAgIG1TdGF0ZS5pc1k0MTBCVDIwMjAgPSBlbmFibGU7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6c2V0U291cmNlRGF0YVNwYWNlKERhdGFzcGFjZSBzb3VyY2UpIHsKKyAgICBtRGF0YVNwYWNlID0gc291cmNlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldE91dHB1dERhdGFTcGFjZShEYXRhc3BhY2UgZGF0YXNwYWNlKSB7CisgICAgbU91dHB1dERhdGFTcGFjZSA9IGRhdGFzcGFjZTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXREaXNwbGF5TWF4THVtaW5hbmNlKGNvbnN0IGZsb2F0IG1heEx1bWluYW5jZSkgeworICAgIG1TdGF0ZS5kaXNwbGF5TWF4THVtaW5hbmNlID0gbWF4THVtaW5hbmNlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldHVwTGF5ZXJUZXh0dXJpbmcoY29uc3QgVGV4dHVyZSYgdGV4dHVyZSkgeworICAgIEdMdWludCB0YXJnZXQgPSB0ZXh0dXJlLmdldFRleHR1cmVUYXJnZXQoKTsKKyAgICBnbEJpbmRUZXh0dXJlKHRhcmdldCwgdGV4dHVyZS5nZXRUZXh0dXJlTmFtZSgpKTsKKyAgICBHTGVudW0gZmlsdGVyID0gR0xfTkVBUkVTVDsKKyAgICBpZiAodGV4dHVyZS5nZXRGaWx0ZXJpbmcoKSkgeworICAgICAgICBmaWx0ZXIgPSBHTF9MSU5FQVI7CisgICAgfQorICAgIGdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBnbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXIpOworICAgIGdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyKTsKKworICAgIG1TdGF0ZS50ZXh0dXJlID0gdGV4dHVyZTsKKyAgICBtU3RhdGUudGV4dHVyZUVuYWJsZWQgPSB0cnVlOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OnNldENvbG9yVHJhbnNmb3JtKGNvbnN0IG1hdDQmIGNvbG9yVHJhbnNmb3JtKSB7CisgICAgbVN0YXRlLmNvbG9yTWF0cml4ID0gY29sb3JUcmFuc2Zvcm07Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6ZGlzYWJsZVRleHR1cmluZygpIHsKKyAgICBtU3RhdGUudGV4dHVyZUVuYWJsZWQgPSBmYWxzZTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpkaXNhYmxlQmxlbmRpbmcoKSB7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXR1cEZpbGxXaXRoQ29sb3IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYiwgZmxvYXQgYSkgeworICAgIG1TdGF0ZS5pc1ByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7CisgICAgbVN0YXRlLmlzT3BhcXVlID0gZmFsc2U7CisgICAgbVN0YXRlLmNvbG9yID0gaGFsZjQociwgZywgYiwgYSk7CisgICAgbVN0YXRlLnRleHR1cmVFbmFibGVkID0gZmFsc2U7CisgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpzZXR1cENvcm5lclJhZGl1c0Nyb3BTaXplKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpIHsKKyAgICBtU3RhdGUuY3JvcFNpemUgPSBoYWxmMih3aWR0aCwgaGVpZ2h0KTsKK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpkcmF3TWVzaChjb25zdCBNZXNoJiBtZXNoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobWVzaC5nZXRUZXhDb29yZHNTaXplKCkpIHsKKyAgICAgICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjp0ZXhDb29yZHMpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoUHJvZ3JhbTo6dGV4Q29vcmRzLCBtZXNoLmdldFRleENvb3Jkc1NpemUoKSwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRCeXRlU3RyaWRlKCksIG1lc2guZ2V0VGV4Q29vcmRzKCkpOworICAgIH0KKworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihQcm9ncmFtOjpwb3NpdGlvbiwgbWVzaC5nZXRWZXJ0ZXhTaXplKCksIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRCeXRlU3RyaWRlKCksIG1lc2guZ2V0UG9zaXRpb25zKCkpOworCisgICAgaWYgKG1TdGF0ZS5jb3JuZXJSYWRpdXMgPiAwLjBmKSB7CisgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoUHJvZ3JhbTo6Y3JvcENvb3Jkcyk7CisgICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihQcm9ncmFtOjpjcm9wQ29vcmRzLCBtZXNoLmdldFZlcnRleFNpemUoKSwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRCeXRlU3RyaWRlKCksIG1lc2guZ2V0Q3JvcENvb3JkcygpKTsKKyAgICB9CisKKyAgICBpZiAobVN0YXRlLmRyYXdTaGFkb3dzKSB7CisgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoUHJvZ3JhbTo6c2hhZG93Q29sb3IpOworICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoUHJvZ3JhbTo6c2hhZG93Q29sb3IsIG1lc2guZ2V0U2hhZG93Q29sb3JTaXplKCksIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2guZ2V0Qnl0ZVN0cmlkZSgpLCBtZXNoLmdldFNoYWRvd0NvbG9yKCkpOworCisgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoUHJvZ3JhbTo6c2hhZG93UGFyYW1zKTsKKyAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKFByb2dyYW06OnNoYWRvd1BhcmFtcywgbWVzaC5nZXRTaGFkb3dQYXJhbXNTaXplKCksIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc2guZ2V0Qnl0ZVN0cmlkZSgpLCBtZXNoLmdldFNoYWRvd1BhcmFtcygpKTsKKyAgICB9CisKKyAgICBEZXNjcmlwdGlvbiBtYW5hZ2VkU3RhdGUgPSBtU3RhdGU7CisgICAgLy8gQnkgZGVmYXVsdCwgRElTUExBWV9QMyBpcyB0aGUgb25seSBzdXBwb3J0ZWQgd2lkZSBjb2xvciBvdXRwdXQuIEhvd2V2ZXIsCisgICAgLy8gd2hlbiBIRFIgY29udGVudCBpcyBwcmVzZW50LCBoYXJkd2FyZSBjb21wb3NlciBtYXkgYmUgYWJsZSB0byBoYW5kbGUKKyAgICAvLyBCVDIwMjAgZGF0YSBzcGFjZSwgaW4gdGhhdCBjYXNlLCB0aGUgb3V0cHV0IGRhdGEgc3BhY2UgaXMgc2V0IHRvIGJlCisgICAgLy8gQlQyMDIwX0hMRyBvciBCVDIwMjBfUFEgcmVzcGVjdGl2ZWx5LiBJbiBHUFUgZmFsbCBiYWNrIHdlIG5lZWQKKyAgICAvLyB0byByZXNwZWN0IHRoaXMgYW5kIGNvbnZlcnQgbm9uLUhEUiBjb250ZW50IHRvIEhEUiBmb3JtYXQuCisgICAgaWYgKG1Vc2VDb2xvck1hbmFnZW1lbnQpIHsKKyAgICAgICAgRGF0YXNwYWNlIGlucHV0U3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KG1EYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlNUQU5EQVJEX01BU0spOworICAgICAgICBEYXRhc3BhY2UgaW5wdXRUcmFuc2ZlciA9IHN0YXRpY19jYXN0PERhdGFzcGFjZT4obURhdGFTcGFjZSAmIERhdGFzcGFjZTo6VFJBTlNGRVJfTUFTSyk7CisgICAgICAgIERhdGFzcGFjZSBvdXRwdXRTdGFuZGFyZCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihtT3V0cHV0RGF0YVNwYWNlICYgRGF0YXNwYWNlOjpTVEFOREFSRF9NQVNLKTsKKyAgICAgICAgRGF0YXNwYWNlIG91dHB1dFRyYW5zZmVyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KG1PdXRwdXREYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlRSQU5TRkVSX01BU0spOworICAgICAgICBib29sIG5lZWRzWFlaQ29udmVyc2lvbiA9IG5lZWRzWFlaVHJhbnNmb3JtTWF0cml4KCk7CisKKyAgICAgICAgLy8gTk9URTogaWYgdGhlIGlucHV0IHN0YW5kYXJkIG9mIHRoZSBpbnB1dCBkYXRhc3BhY2UgaXMgbm90IFNUQU5EQVJEX0RDSV9QMyBvcgorICAgICAgICAvLyBTVEFOREFSRF9CVDIwMjAsIGl0IHdpbGwgYmUgIHRyZWF0ZWQgYXMgU1RBTkRBUkRfQlQ3MDkKKyAgICAgICAgaWYgKGlucHV0U3RhbmRhcmQgIT0gRGF0YXNwYWNlOjpTVEFOREFSRF9EQ0lfUDMgJiYKKyAgICAgICAgICAgIGlucHV0U3RhbmRhcmQgIT0gRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjApIHsKKyAgICAgICAgICAgIGlucHV0U3RhbmRhcmQgPSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUNzA5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzWFlaQ29udmVyc2lvbikgeworICAgICAgICAgICAgLy8gVGhlIHN1cHBvcnRlZCBpbnB1dCBjb2xvciBzcGFjZXMgYXJlIHN0YW5kYXJkIFJHQiwgRGlzcGxheSBQMyBhbmQgQlQyMDIwLgorICAgICAgICAgICAgc3dpdGNoIChpbnB1dFN0YW5kYXJkKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEYXRhc3BhY2U6OlNUQU5EQVJEX0RDSV9QMzoKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFN0YXRlLmlucHV0VHJhbnNmb3JtTWF0cml4ID0gbURpc3BsYXlQM1RvWHl6OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFzcGFjZTo6U1RBTkRBUkRfQlQyMDIwOgorICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkU3RhdGUuaW5wdXRUcmFuc2Zvcm1NYXRyaXggPSBtQnQyMDIwVG9YeXo7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5pbnB1dFRyYW5zZm9ybU1hdHJpeCA9IG1TcmdiVG9YeXo7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUaGUgc3VwcG9ydGVkIG91dHB1dCBjb2xvciBzcGFjZXMgYXJlIEJUMjAyMCwgRGlzcGxheSBQMyBhbmQgc3RhbmRhcmQgUkdCLgorICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRTdGFuZGFyZCkgeworICAgICAgICAgICAgICAgIGNhc2UgRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjA6CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtWHl6VG9CdDIwMjA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YXNwYWNlOjpTVEFOREFSRF9EQ0lfUDM6CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtWHl6VG9EaXNwbGF5UDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtWHl6VG9TcmdiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpbnB1dFN0YW5kYXJkICE9IG91dHB1dFN0YW5kYXJkKSB7CisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgaW5wdXQgZGF0YSBzcGFjZSBhbmQgb3V0cHV0IGRhdGEgc3BhY2UgY291bGQgYmUgYm90aAorICAgICAgICAgICAgLy8gSERSIGRhdGEgc3BhY2VzLCBidXQgdGhleSBtYXRjaCBlYWNoIG90aGVyLCB3ZSBkbyBub3RoaW5nIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIC8vIEluIGFkZGl0aW9uIHRvIHRoZSBjYXNlIGFib3ZlLCB0aGUgaW5wdXQgZGF0YSBzcGFjZSBjb3VsZCBiZQorICAgICAgICAgICAgLy8gLSBzY1JHQiBsaW5lYXIKKyAgICAgICAgICAgIC8vIC0gc2NSR0Igbm9uLWxpbmVhcgorICAgICAgICAgICAgLy8gLSBzUkdCCisgICAgICAgICAgICAvLyAtIERpc3BsYXkgUDMKKyAgICAgICAgICAgIC8vIC0gQlQyMDIwCisgICAgICAgICAgICAvLyBUaGUgb3V0cHV0IGRhdGEgc3BhY2VzIGNvdWxkIGJlCisgICAgICAgICAgICAvLyAtIHNSR0IKKyAgICAgICAgICAgIC8vIC0gRGlzcGxheSBQMworICAgICAgICAgICAgLy8gLSBCVDIwMjAKKyAgICAgICAgICAgIHN3aXRjaCAob3V0cHV0U3RhbmRhcmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERhdGFzcGFjZTo6U1RBTkRBUkRfQlQyMDIwOgorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRTdGFuZGFyZCA9PSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUNzA5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkU3RhdGUub3V0cHV0VHJhbnNmb3JtTWF0cml4ID0gbVNyZ2JUb0J0MjAyMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dFN0YW5kYXJkID09IERhdGFzcGFjZTo6U1RBTkRBUkRfRENJX1AzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkU3RhdGUub3V0cHV0VHJhbnNmb3JtTWF0cml4ID0gbURpc3BsYXlQM1RvQnQyMDIwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRGF0YXNwYWNlOjpTVEFOREFSRF9EQ0lfUDM6CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFN0YW5kYXJkID09IERhdGFzcGFjZTo6U1RBTkRBUkRfQlQ3MDkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtU3JnYlRvRGlzcGxheVAzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0U3RhbmRhcmQgPT0gRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtQnQyMDIwVG9EaXNwbGF5UDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RhbmRhcmQgPT0gRGF0YXNwYWNlOjpTVEFOREFSRF9EQ0lfUDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtRGlzcGxheVAzVG9TcmdiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0U3RhbmRhcmQgPT0gRGF0YXNwYWNlOjpTVEFOREFSRF9CVDIwMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5vdXRwdXRUcmFuc2Zvcm1NYXRyaXggPSBtQnQyMDIwVG9TcmdiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgbmVlZCB0byBjb252ZXJ0IHRoZSBSR0IgdmFsdWUgdG8gbGluZWFyIHNwYWNlIGFuZCBjb252ZXJ0IGl0IGJhY2sgd2hlbjoKKyAgICAgICAgLy8gLSB0aGVyZSBpcyBhIGNvbG9yIG1hdHJpeCB0aGF0IGlzIG5vdCBhbiBpZGVudGl0eSBtYXRyaXgsIG9yCisgICAgICAgIC8vIC0gdGhlcmUgaXMgYW4gb3V0cHV0IHRyYW5zZm9ybSBtYXRyaXggdGhhdCBpcyBub3QgYW4gaWRlbnRpdHkgbWF0cml4LCBvcgorICAgICAgICAvLyAtIHRoZSBpbnB1dCB0cmFuc2ZlciBmdW5jdGlvbiBkb2Vzbid0IG1hdGNoIHRoZSBvdXRwdXQgdHJhbnNmZXIgZnVuY3Rpb24uCisgICAgICAgIGlmIChtYW5hZ2VkU3RhdGUuaGFzQ29sb3JNYXRyaXgoKSB8fCBtYW5hZ2VkU3RhdGUuaGFzT3V0cHV0VHJhbnNmb3JtTWF0cml4KCkgfHwKKyAgICAgICAgICAgIGlucHV0VHJhbnNmZXIgIT0gb3V0cHV0VHJhbnNmZXIpIHsKKyAgICAgICAgICAgIG1hbmFnZWRTdGF0ZS5pbnB1dFRyYW5zZmVyRnVuY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjo6ZGF0YVNwYWNlVG9UcmFuc2ZlckZ1bmN0aW9uKGlucHV0VHJhbnNmZXIpOworICAgICAgICAgICAgbWFuYWdlZFN0YXRlLm91dHB1dFRyYW5zZmVyRnVuY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjo6ZGF0YVNwYWNlVG9UcmFuc2ZlckZ1bmN0aW9uKG91dHB1dFRyYW5zZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFByb2dyYW1DYWNoZTo6Z2V0SW5zdGFuY2UoKS51c2VQcm9ncmFtKG1JblByb3RlY3RlZENvbnRleHQgPyBtUHJvdGVjdGVkRUdMQ29udGV4dCA6IG1FR0xDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRTdGF0ZSk7CisKKyAgICBpZiAobVN0YXRlLmRyYXdTaGFkb3dzKSB7CisgICAgICAgIGdsRHJhd0VsZW1lbnRzKG1lc2guZ2V0UHJpbWl0aXZlKCksIG1lc2guZ2V0SW5kZXhDb3VudCgpLCBHTF9VTlNJR05FRF9TSE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzaC5nZXRJbmRpY2VzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdsRHJhd0FycmF5cyhtZXNoLmdldFByaW1pdGl2ZSgpLCAwLCBtZXNoLmdldFZlcnRleENvdW50KCkpOworICAgIH0KKworICAgIGlmIChtVXNlQ29sb3JNYW5hZ2VtZW50ICYmIG91dHB1dERlYnVnUFBNcykgeworICAgICAgICBzdGF0aWMgdWludDY0X3QgbWFuYWdlZENvbG9yRnJhbWVDb3VudCA9IDA7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgICAgIG91dCA8PCAiL2RhdGEvdGV4dHVyZV9vdXQiIDw8IG1hbmFnZWRDb2xvckZyYW1lQ291bnQrKzsKKyAgICAgICAgd3JpdGVQUE0ob3V0LnN0cigpLmNfc3RyKCksIG1WcFdpZHRoLCBtVnBIZWlnaHQpOworICAgIH0KKworICAgIGlmIChtZXNoLmdldFRleENvb3Jkc1NpemUoKSkgeworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjp0ZXhDb29yZHMpOworICAgIH0KKworICAgIGlmIChtU3RhdGUuY29ybmVyUmFkaXVzID4gMC4wZikgeworICAgICAgICBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShQcm9ncmFtOjpjcm9wQ29vcmRzKTsKKyAgICB9CisKKyAgICBpZiAobVN0YXRlLmRyYXdTaGFkb3dzKSB7CisgICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KFByb2dyYW06OnNoYWRvd0NvbG9yKTsKKyAgICAgICAgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoUHJvZ3JhbTo6c2hhZG93UGFyYW1zKTsKKyAgICB9Cit9CisKK3NpemVfdCBHTEVTUmVuZGVyRW5naW5lOjpnZXRNYXhUZXh0dXJlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1heFRleHR1cmVTaXplOworfQorCitzaXplX3QgR0xFU1JlbmRlckVuZ2luZTo6Z2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3QgeworICAgIHJldHVybiBtTWF4Vmlld3BvcnREaW1zWzBdIDwgbU1heFZpZXdwb3J0RGltc1sxXSA/IG1NYXhWaWV3cG9ydERpbXNbMF0gOiBtTWF4Vmlld3BvcnREaW1zWzFdOworfQorCit2b2lkIEdMRVNSZW5kZXJFbmdpbmU6OmR1bXAoc3RkOjpzdHJpbmcmIHJlc3VsdCkgeworICAgIGNvbnN0IEdMRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyA9IEdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKTsKKyAgICBQcm9ncmFtQ2FjaGUmIGNhY2hlID0gUHJvZ3JhbUNhY2hlOjpnZXRJbnN0YW5jZSgpOworCisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiRUdMIGltcGxlbWVudGF0aW9uIDogJXNcbiIsIGV4dGVuc2lvbnMuZ2V0RUdMVmVyc2lvbigpKTsKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICIlc1xuIiwgZXh0ZW5zaW9ucy5nZXRFR0xFeHRlbnNpb25zKCkpOworICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIkdMRVM6ICVzLCAlcywgJXNcbiIsIGV4dGVuc2lvbnMuZ2V0VmVuZG9yKCksIGV4dGVuc2lvbnMuZ2V0UmVuZGVyZXIoKSwKKyAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuZ2V0VmVyc2lvbigpKTsKKyAgICBTdHJpbmdBcHBlbmRGKCZyZXN1bHQsICIlc1xuIiwgZXh0ZW5zaW9ucy5nZXRFeHRlbnNpb25zKCkpOworICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIlJlbmRlckVuZ2luZSBzdXBwb3J0cyBwcm90ZWN0ZWQgY29udGV4dDogJWRcbiIsCisgICAgICAgICAgICAgICAgICBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIGlzIGluIHByb3RlY3RlZCBjb250ZXh0OiAlZFxuIiwgbUluUHJvdGVjdGVkQ29udGV4dCk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIHByb2dyYW0gY2FjaGUgc2l6ZSBmb3IgdW5wcm90ZWN0ZWQgY29udGV4dDogJXp1XG4iLAorICAgICAgICAgICAgICAgICAgY2FjaGUuZ2V0U2l6ZShtRUdMQ29udGV4dCkpOworICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIlJlbmRlckVuZ2luZSBwcm9ncmFtIGNhY2hlIHNpemUgZm9yIHByb3RlY3RlZCBjb250ZXh0OiAlenVcbiIsCisgICAgICAgICAgICAgICAgICBjYWNoZS5nZXRTaXplKG1Qcm90ZWN0ZWRFR0xDb250ZXh0KSk7CisgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIGxhc3QgZGF0YXNwYWNlIGNvbnZlcnNpb246ICglcykgdG8gKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgIGRhdGFzcGFjZURldGFpbHMoc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KG1EYXRhU3BhY2UpKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgZGF0YXNwYWNlRGV0YWlscyhzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4obU91dHB1dERhdGFTcGFjZSkpLmNfc3RyKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbmRlcmluZ011dGV4KTsKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIGltYWdlIGNhY2hlIHNpemU6ICV6dVxuIiwgbUltYWdlQ2FjaGUuc2l6ZSgpKTsKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiRHVtcGluZyBidWZmZXIgaWRzLi4uXG4iKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBbaWQsIHVudXNlZF0gOiBtSW1hZ2VDYWNoZSkgeworICAgICAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiMHglIiBQUkl4NjQgIlxuIiwgaWQpOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUZyYW1lYnVmZmVySW1hZ2VDYWNoZU11dGV4KTsKKyAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiUmVuZGVyRW5naW5lIGZyYW1lYnVmZmVyIGltYWdlIGNhY2hlIHNpemU6ICV6dVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVidWZmZXJJbWFnZUNhY2hlLnNpemUoKSk7CisgICAgICAgIFN0cmluZ0FwcGVuZEYoJnJlc3VsdCwgIkR1bXBpbmcgYnVmZmVyIGlkcy4uLlxuIik7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgW2lkLCB1bnVzZWRdIDogbUZyYW1lYnVmZmVySW1hZ2VDYWNoZSkgeworICAgICAgICAgICAgU3RyaW5nQXBwZW5kRigmcmVzdWx0LCAiMHglIiBQUkl4NjQgIlxuIiwgaWQpOworICAgICAgICB9CisgICAgfQorfQorCitHTEVTUmVuZGVyRW5naW5lOjpHbGVzVmVyc2lvbiBHTEVTUmVuZGVyRW5naW5lOjpwYXJzZUdsZXNWZXJzaW9uKGNvbnN0IGNoYXIqIHN0cikgeworICAgIGludCBtYWpvciwgbWlub3I7CisgICAgaWYgKHNzY2FuZihzdHIsICJPcGVuR0wgRVMtQ00gJWQuJWQiLCAmbWFqb3IsICZtaW5vcikgIT0gMikgeworICAgICAgICBpZiAoc3NjYW5mKHN0ciwgIk9wZW5HTCBFUyAlZC4lZCIsICZtYWpvciwgJm1pbm9yKSAhPSAyKSB7CisgICAgICAgICAgICBBTE9HVygiVW5hYmxlIHRvIHBhcnNlIEdMX1ZFUlNJT04gc3RyaW5nOiBcIiVzXCIiLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIEdMRVNfVkVSU0lPTl8xXzA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFqb3IgPT0gMSAmJiBtaW5vciA9PSAwKSByZXR1cm4gR0xFU19WRVJTSU9OXzFfMDsKKyAgICBpZiAobWFqb3IgPT0gMSAmJiBtaW5vciA+PSAxKSByZXR1cm4gR0xFU19WRVJTSU9OXzFfMTsKKyAgICBpZiAobWFqb3IgPT0gMiAmJiBtaW5vciA+PSAwKSByZXR1cm4gR0xFU19WRVJTSU9OXzJfMDsKKyAgICBpZiAobWFqb3IgPT0gMyAmJiBtaW5vciA+PSAwKSByZXR1cm4gR0xFU19WRVJTSU9OXzNfMDsKKworICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgT3BlbkdMIEVTIHZlcnNpb246ICVkLiVkIiwgbWFqb3IsIG1pbm9yKTsKKyAgICByZXR1cm4gR0xFU19WRVJTSU9OXzFfMDsKK30KKworRUdMQ29udGV4dCBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVFZ2xDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlQ29udGV4dCwgYm9vbCB1c2VDb250ZXh0UHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdGVjdGlvbiBwcm90ZWN0aW9uKSB7CisgICAgRUdMaW50IHJlbmRlcmFibGVUeXBlID0gMDsKKyAgICBpZiAoY29uZmlnID09IEVHTF9OT19DT05GSUcpIHsKKyAgICAgICAgcmVuZGVyYWJsZVR5cGUgPSBFR0xfT1BFTkdMX0VTM19CSVQ7CisgICAgfSBlbHNlIGlmICghZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX1JFTkRFUkFCTEVfVFlQRSwgJnJlbmRlcmFibGVUeXBlKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJjYW4ndCBxdWVyeSBFR0xDb25maWcgUkVOREVSQUJMRV9UWVBFIik7CisgICAgfQorICAgIEVHTGludCBjb250ZXh0Q2xpZW50VmVyc2lvbiA9IDA7CisgICAgaWYgKHJlbmRlcmFibGVUeXBlICYgRUdMX09QRU5HTF9FUzNfQklUKSB7CisgICAgICAgIGNvbnRleHRDbGllbnRWZXJzaW9uID0gMzsKKyAgICB9IGVsc2UgaWYgKHJlbmRlcmFibGVUeXBlICYgRUdMX09QRU5HTF9FUzJfQklUKSB7CisgICAgICAgIGNvbnRleHRDbGllbnRWZXJzaW9uID0gMjsKKyAgICB9IGVsc2UgaWYgKHJlbmRlcmFibGVUeXBlICYgRUdMX09QRU5HTF9FU19CSVQpIHsKKyAgICAgICAgY29udGV4dENsaWVudFZlcnNpb24gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIm5vIHN1cHBvcnRlZCBFR0xfUkVOREVSQUJMRV9UWVBFcyIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEVHTGludD4gY29udGV4dEF0dHJpYnV0ZXM7CisgICAgY29udGV4dEF0dHJpYnV0ZXMucmVzZXJ2ZSg3KTsKKyAgICBjb250ZXh0QXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04pOworICAgIGNvbnRleHRBdHRyaWJ1dGVzLnB1c2hfYmFjayhjb250ZXh0Q2xpZW50VmVyc2lvbik7CisgICAgaWYgKHVzZUNvbnRleHRQcmlvcml0eSkgeworICAgICAgICBjb250ZXh0QXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX0NPTlRFWFRfUFJJT1JJVFlfTEVWRUxfSU1HKTsKKyAgICAgICAgY29udGV4dEF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9DT05URVhUX1BSSU9SSVRZX0hJR0hfSU1HKTsKKyAgICB9CisgICAgaWYgKHByb3RlY3Rpb24gPT0gUHJvdGVjdGlvbjo6UFJPVEVDVEVEKSB7CisgICAgICAgIGNvbnRleHRBdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfUFJPVEVDVEVEX0NPTlRFTlRfRVhUKTsKKyAgICAgICAgY29udGV4dEF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9UUlVFKTsKKyAgICB9CisgICAgY29udGV4dEF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9OT05FKTsKKworICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgY29uZmlnLCBzaGFyZUNvbnRleHQsIGNvbnRleHRBdHRyaWJ1dGVzLmRhdGEoKSk7CisKKyAgICBpZiAoY29udGV4dENsaWVudFZlcnNpb24gPT0gMyAmJiBjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIC8vIGVnbEdldENvbmZpZ0F0dHJpYiBpbmRpY2F0ZWQgd2UgY2FuIGNyZWF0ZSBHTEVTIDMgY29udGV4dCwgYnV0IHdlIGZhaWxlZCwgdGh1cworICAgICAgICAvLyBFR0xfTk9fQ09OVEVYVCBzbyB0aGF0IHdlIGNhbiBhYm9ydC4KKyAgICAgICAgaWYgKGNvbmZpZyAhPSBFR0xfTk9fQ09ORklHKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB8Y29uZmlnfCBpcyBFR0xfTk9fQ09ORklHLCB3ZSBzcGVjdWxhdGl2ZWx5IHRyeSB0byBjcmVhdGUgR0xFUyAzIGNvbnRleHQsIHNvIHdlIHNob3VsZAorICAgICAgICAvLyB0cnkgdG8gZmFsbCBiYWNrIHRvIEdMRVMgMi4KKyAgICAgICAgY29udGV4dEF0dHJpYnV0ZXNbMV0gPSAyOworICAgICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBjb25maWcsIHNoYXJlQ29udGV4dCwgY29udGV4dEF0dHJpYnV0ZXMuZGF0YSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29udGV4dDsKK30KKworRUdMU3VyZmFjZSBHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGVTdHViRWdsUGJ1ZmZlclN1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGh3Y0Zvcm1hdCwgUHJvdGVjdGlvbiBwcm90ZWN0aW9uKSB7CisgICAgRUdMQ29uZmlnIHN0dWJDb25maWcgPSBjb25maWc7CisgICAgaWYgKHN0dWJDb25maWcgPT0gRUdMX05PX0NPTkZJRykgeworICAgICAgICBzdHViQ29uZmlnID0gY2hvb3NlRWdsQ29uZmlnKGRpc3BsYXksIGh3Y0Zvcm1hdCwgLypsb2dDb25maWcqLyB0cnVlKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8RUdMaW50PiBhdHRyaWJ1dGVzOworICAgIGF0dHJpYnV0ZXMucmVzZXJ2ZSg3KTsKKyAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfV0lEVEgpOworICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKDEpOworICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKEVHTF9IRUlHSFQpOworICAgIGF0dHJpYnV0ZXMucHVzaF9iYWNrKDEpOworICAgIGlmIChwcm90ZWN0aW9uID09IFByb3RlY3Rpb246OlBST1RFQ1RFRCkgeworICAgICAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfUFJPVEVDVEVEX0NPTlRFTlRfRVhUKTsKKyAgICAgICAgYXR0cmlidXRlcy5wdXNoX2JhY2soRUdMX1RSVUUpOworICAgIH0KKyAgICBhdHRyaWJ1dGVzLnB1c2hfYmFjayhFR0xfTk9ORSk7CisKKyAgICByZXR1cm4gZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoZGlzcGxheSwgc3R1YkNvbmZpZywgYXR0cmlidXRlcy5kYXRhKCkpOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmlzSGRyRGF0YVNwYWNlKGNvbnN0IERhdGFzcGFjZSBkYXRhU3BhY2UpIGNvbnN0IHsKKyAgICBjb25zdCBEYXRhc3BhY2Ugc3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGRhdGFTcGFjZSAmIERhdGFzcGFjZTo6U1RBTkRBUkRfTUFTSyk7CisgICAgY29uc3QgRGF0YXNwYWNlIHRyYW5zZmVyID0gc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihkYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlRSQU5TRkVSX01BU0spOworICAgIHJldHVybiBzdGFuZGFyZCA9PSBEYXRhc3BhY2U6OlNUQU5EQVJEX0JUMjAyMCAmJgorICAgICAgICAgICAgKHRyYW5zZmVyID09IERhdGFzcGFjZTo6VFJBTlNGRVJfU1QyMDg0IHx8IHRyYW5zZmVyID09IERhdGFzcGFjZTo6VFJBTlNGRVJfSExHKTsKK30KKworLy8gRm9yIGNvbnZlbmllbmNlLCB3ZSB3YW50IHRvIGNvbnZlcnQgdGhlIGlucHV0IGNvbG9yIHNwYWNlIHRvIFhZWiBjb2xvciBzcGFjZSBmaXJzdCwKKy8vIGFuZCB0aGVuIGNvbnZlcnQgZnJvbSBYWVogY29sb3Igc3BhY2UgdG8gb3V0cHV0IGNvbG9yIHNwYWNlIHdoZW4KKy8vIC0gU0RSIGFuZCBIRFIgY29udGVudHMgYXJlIG1peGVkLCBlaXRoZXIgU0RSIGNvbnRlbnQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gSERSIG9yCisvLyAgIEhEUiBjb250ZW50IHdpbGwgYmUgdG9uZS1tYXBwZWQgdG8gU0RSOyBPciwKKy8vIC0gdGhlcmUgYXJlIEhEUiBQUSBhbmQgSExHIGNvbnRlbnRzIHByZXNlbnRlZCBhdCB0aGUgc2FtZSB0aW1lLCB3aGVyZSB3ZSB3YW50IHRvIGNvbnZlcnQKKy8vICAgSExHIGNvbnRlbnQgdG8gUFEgY29udGVudC4KKy8vIEluIGVpdGhlciBjYXNlIGFib3ZlLCB3ZSBuZWVkIHRvIG9wZXJhdGUgdGhlIFkgdmFsdWUgaW4gWFlaIGNvbG9yIHNwYWNlLiBUaHVzLCB3aGVuIGVpdGhlcgorLy8gaW5wdXQgZGF0YSBzcGFjZSBvciBvdXRwdXQgZGF0YSBzcGFjZSBpcyBIRFIgZGF0YSBzcGFjZSwgYW5kIHRoZSBpbnB1dCB0cmFuc2ZlciBmdW5jdGlvbgorLy8gZG9lc24ndCBtYXRjaCB0aGUgb3V0cHV0IHRyYW5zZmVyIGZ1bmN0aW9uLCB3ZSB3b3VsZCBlbmFibGUgYW4gaW50ZXJtZWRpYXRlIHRyYW5zZnJvbSB0bworLy8gWFlaIGNvbG9yIHNwYWNlLgorYm9vbCBHTEVTUmVuZGVyRW5naW5lOjpuZWVkc1hZWlRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0IHsKKyAgICBjb25zdCBib29sIGlzSW5wdXRIZHJEYXRhU3BhY2UgPSBpc0hkckRhdGFTcGFjZShtRGF0YVNwYWNlKTsKKyAgICBjb25zdCBib29sIGlzT3V0cHV0SGRyRGF0YVNwYWNlID0gaXNIZHJEYXRhU3BhY2UobU91dHB1dERhdGFTcGFjZSk7CisgICAgY29uc3QgRGF0YXNwYWNlIGlucHV0VHJhbnNmZXIgPSBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KG1EYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlRSQU5TRkVSX01BU0spOworICAgIGNvbnN0IERhdGFzcGFjZSBvdXRwdXRUcmFuc2ZlciA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KG1PdXRwdXREYXRhU3BhY2UgJiBEYXRhc3BhY2U6OlRSQU5TRkVSX01BU0spOworCisgICAgcmV0dXJuIChpc0lucHV0SGRyRGF0YVNwYWNlIHx8IGlzT3V0cHV0SGRyRGF0YVNwYWNlKSAmJiBpbnB1dFRyYW5zZmVyICE9IG91dHB1dFRyYW5zZmVyOworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbmRlcmluZ011dGV4KTsKKyAgICBjb25zdCBhdXRvJiBjYWNoZWRJbWFnZSA9IG1JbWFnZUNhY2hlLmZpbmQoYnVmZmVySWQpOworICAgIHJldHVybiBjYWNoZWRJbWFnZSAhPSBtSW1hZ2VDYWNoZS5lbmQoKTsKK30KKworYm9vbCBHTEVTUmVuZGVyRW5naW5lOjppc1RleHR1cmVOYW1lS25vd25Gb3JUZXN0aW5nKHVpbnQzMl90IHRleE5hbWUpIHsKKyAgICBjb25zdCBhdXRvJiBlbnRyeSA9IG1UZXh0dXJlVmlldy5maW5kKHRleE5hbWUpOworICAgIHJldHVybiBlbnRyeSAhPSBtVGV4dHVyZVZpZXcuZW5kKCk7Cit9CisKK3N0ZDo6b3B0aW9uYWw8dWludDY0X3Q+IEdMRVNSZW5kZXJFbmdpbmU6OmdldEJ1ZmZlcklkRm9yVGV4dHVyZU5hbWVGb3JUZXN0aW5nKHVpbnQzMl90IHRleE5hbWUpIHsKKyAgICBjb25zdCBhdXRvJiBlbnRyeSA9IG1UZXh0dXJlVmlldy5maW5kKHRleE5hbWUpOworICAgIHJldHVybiBlbnRyeSAhPSBtVGV4dHVyZVZpZXcuZW5kKCkgPyBlbnRyeS0+c2Vjb25kIDogc3RkOjpudWxsb3B0OworfQorCitib29sIEdMRVNSZW5kZXJFbmdpbmU6OmlzRnJhbWVidWZmZXJJbWFnZUNhY2hlZEZvclRlc3RpbmcodWludDY0X3QgYnVmZmVySWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXgpOworICAgIHJldHVybiBzdGQ6OmFueV9vZihtRnJhbWVidWZmZXJJbWFnZUNhY2hlLmNiZWdpbigpLCBtRnJhbWVidWZmZXJJbWFnZUNhY2hlLmNlbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWz1dKHN0ZDo6cGFpcjx1aW50NjRfdCwgRUdMSW1hZ2VLSFI+IGltYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1hZ2UuZmlyc3QgPT0gYnVmZmVySWQ7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworfQorCisvLyBGbHVzaFRyYWNlciBpbXBsZW1lbnRhdGlvbgorR0xFU1JlbmRlckVuZ2luZTo6Rmx1c2hUcmFjZXI6OkZsdXNoVHJhY2VyKEdMRVNSZW5kZXJFbmdpbmUqIGVuZ2luZSkgOiBtRW5naW5lKGVuZ2luZSkgeworICAgIG1UaHJlYWQgPSBzdGQ6OnRocmVhZCgmR0xFU1JlbmRlckVuZ2luZTo6Rmx1c2hUcmFjZXI6Omxvb3AsIHRoaXMpOworfQorCitHTEVTUmVuZGVyRW5naW5lOjpGbHVzaFRyYWNlcjo6fkZsdXNoVHJhY2VyKCkgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgaWYgKG1UaHJlYWQuam9pbmFibGUoKSkgeworICAgICAgICBtVGhyZWFkLmpvaW4oKTsKKyAgICB9Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6Rmx1c2hUcmFjZXI6OnF1ZXVlU3luYyhFR0xTeW5jS0hSIHN5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGNoYXIgbmFtZVs2NF07CisgICAgY29uc3QgdWludDY0X3QgZnJhbWVOdW0gPSBtRnJhbWVzUXVldWVkKys7CisgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiUXVldWVpbmcgc3luYyBmb3IgZnJhbWU6ICVsdSIsCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZnJhbWVOdW0pKTsKKyAgICBBVFJBQ0VfTkFNRShuYW1lKTsKKyAgICBtUXVldWUucHVzaCh7c3luYywgZnJhbWVOdW19KTsKKyAgICBBVFJBQ0VfSU5UKCJHUFUgRnJhbWVzIE91dHN0YW5kaW5nIiwgbVF1ZXVlLnNpemUoKSk7CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7Cit9CisKK3ZvaWQgR0xFU1JlbmRlckVuZ2luZTo6Rmx1c2hUcmFjZXI6Omxvb3AoKSB7CisgICAgd2hpbGUgKG1SdW5uaW5nKSB7CisgICAgICAgIFF1ZXVlRW50cnkgZW50cnk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMobU11dGV4KSB7IHJldHVybiAhbVF1ZXVlLmVtcHR5KCkgfHwgIW1SdW5uaW5nOyB9KTsKKworICAgICAgICAgICAgaWYgKCFtUnVubmluZykgeworICAgICAgICAgICAgICAgIC8vIGlmIG1SdW5uaW5nIGlzIGZhbHNlLCB0aGVuIEZsdXNoVHJhY2VyIGlzIGJlaW5nIGRlc3Ryb3llZCwgc28KKyAgICAgICAgICAgICAgICAvLyBiYWlsIG91dCBub3cuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRyeSA9IG1RdWV1ZS5mcm9udCgpOworICAgICAgICAgICAgbVF1ZXVlLnBvcCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgbmFtZVs2NF07CisgICAgICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ3YWl0aW5nIGZvciBmcmFtZSAlbHUiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oZW50cnkubUZyYW1lTnVtKSk7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRShuYW1lKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPndhaXRTeW5jKGVudHJ5Lm1TeW5jLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHTEVTUmVuZGVyRW5naW5lOjpoYW5kbGVTaGFkb3coY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LCBmbG9hdCBjYXN0ZXJDb3JuZXJSYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaGFkb3dTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGNvbnN0IGZsb2F0IGNhc3RlclogPSBzZXR0aW5ncy5sZW5ndGggLyAyLjBmOworICAgIGNvbnN0IEdMU2hhZG93VmVydGV4R2VuZXJhdG9yIHNoYWRvd3MoY2FzdGVyUmVjdCwgY2FzdGVyQ29ybmVyUmFkaXVzLCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY2FzdGVySXNUcmFuc2x1Y2VudCwgc2V0dGluZ3MuYW1iaWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc3BvdENvbG9yLCBzZXR0aW5ncy5saWdodFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmxpZ2h0UmFkaXVzKTsKKworICAgIC8vIHNldHVwIG1lc2ggZm9yIGJvdGggc2hhZG93cworICAgIE1lc2ggbWVzaCA9IE1lc2g6OkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByaW1pdGl2ZShNZXNoOjpUUklBTkdMRVMpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmVydGljZXMoc2hhZG93cy5nZXRWZXJ0ZXhDb3VudCgpLCAyIC8qIHNpemUgKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2hhZG93QXR0cnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGljZXMoc2hhZG93cy5nZXRJbmRleENvdW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzI+IHBvc2l0aW9uID0gbWVzaC5nZXRQb3NpdGlvbkFycmF5PHZlYzI+KCk7CisgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjND4gc2hhZG93Q29sb3IgPSBtZXNoLmdldFNoYWRvd0NvbG9yQXJyYXk8dmVjND4oKTsKKyAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiBzaGFkb3dQYXJhbXMgPSBtZXNoLmdldFNoYWRvd1BhcmFtc0FycmF5PHZlYzM+KCk7CisgICAgc2hhZG93cy5maWxsVmVydGljZXMocG9zaXRpb24sIHNoYWRvd0NvbG9yLCBzaGFkb3dQYXJhbXMpOworICAgIHNoYWRvd3MuZmlsbEluZGljZXMobWVzaC5nZXRJbmRpY2VzQXJyYXkoKSk7CisKKyAgICBtU3RhdGUuY29ybmVyUmFkaXVzID0gMC4wZjsKKyAgICBtU3RhdGUuZHJhd1NoYWRvd3MgPSB0cnVlOworICAgIHNldHVwTGF5ZXJUZXh0dXJpbmcobVNoYWRvd1RleHR1cmUuZ2V0VGV4dHVyZSgpKTsKKyAgICBkcmF3TWVzaChtZXNoKTsKKyAgICBtU3RhdGUuZHJhd1NoYWRvd3MgPSBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRVNSZW5kZXJFbmdpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEVTUmVuZGVyRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2ZWFlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEVTUmVuZGVyRW5naW5lLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0ZfR0xFU1JFTkRFUkVOR0lORV9IXworI2RlZmluZSBTRl9HTEVTUkVOREVSRU5HSU5FX0hfCisKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL3ByaXZhdGUvRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJHTFNoYWRvd1RleHR1cmUuaCIKKyNpbmNsdWRlICJJbWFnZU1hbmFnZXIuaCIKKworI2RlZmluZSBFR0xfTk9fQ09ORklHICgoRUdMQ29uZmlnKTApCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIE1lc2g7CitjbGFzcyBUZXh0dXJlOworCituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEltYWdlOworY2xhc3MgQmx1ckZpbHRlcjsKKworY2xhc3MgR0xFU1JlbmRlckVuZ2luZSA6IHB1YmxpYyBpbXBsOjpSZW5kZXJFbmdpbmUgeworcHVibGljOgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8R0xFU1JlbmRlckVuZ2luZT4gY3JlYXRlKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncyk7CisKKyAgICBHTEVTUmVuZGVyRW5naW5lKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncywgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBjdHh0LCBFR0xTdXJmYWNlIHN0dWIsIEVHTENvbnRleHQgcHJvdGVjdGVkQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcHJvdGVjdGVkU3R1Yik7CisgICAgfkdMRVNSZW5kZXJFbmdpbmUoKSBvdmVycmlkZSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworCisgICAgdm9pZCBwcmltZUNhY2hlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBnZW5UZXh0dXJlcyhzaXplX3QgY291bnQsIHVpbnQzMl90KiBuYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlcyhzaXplX3QgY291bnQsIHVpbnQzMl90IGNvbnN0KiBuYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodWludDMyX3QgdGV4TmFtZSwgY29uc3QgSW1hZ2UmIGltYWdlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBiaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQzMl90IHRleE5hbWUsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4mIGZlbmNlKSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworICAgIHZvaWQgY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikgRVhDTFVERVMobVJlbmRlcmluZ011dGV4KTsKKyAgICB2b2lkIHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcih1aW50NjRfdCBidWZmZXJJZCkgRVhDTFVERVMobVJlbmRlcmluZ011dGV4KTsKKyAgICBzdGF0dXNfdCBiaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIHVuYmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzUHJvdGVjdGVkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUluUHJvdGVjdGVkQ29udGV4dDsgfQorICAgIGJvb2wgc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KGJvb2wgdXNlUHJvdGVjdGVkQ29udGV4dCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZHJhd0xheWVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBMYXllclNldHRpbmdzKj4mIGxheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCYmIGJ1ZmZlckZlbmNlLCBiYXNlOjp1bmlxdWVfZmQqIGRyYXdGZW5jZSkgb3ZlcnJpZGU7CisgICAgYm9vbCBjbGVhbnVwUG9zdFJlbmRlcihDbGVhbnVwTW9kZSBtb2RlKSBvdmVycmlkZTsKKworICAgIEVHTERpc3BsYXkgZ2V0RUdMRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1FR0xEaXNwbGF5OyB9CisgICAgLy8gQ3JlYXRlcyBhbiBvdXRwdXQgaW1hZ2UgZm9yIHJlbmRlcmluZyB0bworICAgIEVHTEltYWdlS0hSIGNyZWF0ZUZyYW1lYnVmZmVySW1hZ2VJZk5lZWRlZChBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVCdWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkKKyAgICAgICAgICAgIEVYQ0xVREVTKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVNdXRleCk7CisKKyAgICAvLyBUZXN0LW9ubHkgbWV0aG9kcworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgbUltYWdlQ2FjaGUgY29udGFpbnMgYW4gaW1hZ2Uga2V5ZWQgYnkgYnVmZmVySWQKKyAgICBib29sIGlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKHVpbnQ2NF90IGJ1ZmZlcklkKSBFWENMVURFUyhtUmVuZGVyaW5nTXV0ZXgpOworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGV4TmFtZSB3YXMgcHJldmlvdXNseSBnZW5lcmF0ZWQgYnkgUmVuZGVyRW5naW5lIGFuZCB3YXMKKyAgICAvLyBub3QgZGVzdHJveWVkLgorICAgIGJvb2wgaXNUZXh0dXJlTmFtZUtub3duRm9yVGVzdGluZyh1aW50MzJfdCB0ZXhOYW1lKTsKKyAgICAvLyBSZXR1cm5zIHRoZSBidWZmZXIgSUQgb2YgdGhlIGNvbnRlbnQgYm91bmQgdG8gdGV4TmFtZSwgb3IgbnVsbG9wdCBpZiBubworICAgIC8vIHN1Y2ggbWFwcGluZyBleGlzdHMuCisgICAgc3RkOjpvcHRpb25hbDx1aW50NjRfdD4gZ2V0QnVmZmVySWRGb3JUZXh0dXJlTmFtZUZvclRlc3RpbmcodWludDMyX3QgdGV4TmFtZSk7CisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiBtRnJhbWVidWZmZXJJbWFnZUNhY2hlIGNvbnRhaW5zIGFuIGltYWdlIGtleWVkIGJ5IGJ1ZmZlcklkCisgICAgYm9vbCBpc0ZyYW1lYnVmZmVySW1hZ2VDYWNoZWRGb3JUZXN0aW5nKHVpbnQ2NF90IGJ1ZmZlcklkKQorICAgICAgICAgICAgRVhDTFVERVMobUZyYW1lYnVmZmVySW1hZ2VDYWNoZU11dGV4KTsKKyAgICAvLyBUaGVzZSBhcmUgd3JhcHBlcnMgYXJvdW5kIHB1YmxpYyBtZXRob2RzIGFib3ZlLCBidXQgZXhwb3NpbmcgQmFycmllcgorICAgIC8vIG9iamVjdHMgc28gdGhhdCB0ZXN0cyBjYW4gYmxvY2suCisgICAgc3RkOjpzaGFyZWRfcHRyPEltYWdlTWFuYWdlcjo6QmFycmllcj4gY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXJGb3JUZXN0aW5nKAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltYWdlTWFuYWdlcjo6QmFycmllcj4gdW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZyh1aW50NjRfdCBidWZmZXJJZCk7CisKK3Byb3RlY3RlZDoKKyAgICBGcmFtZWJ1ZmZlciogZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nJiByZXN1bHQpIG92ZXJyaWRlIEVYQ0xVREVTKG1SZW5kZXJpbmdNdXRleCkKKyAgICAgICAgICAgIEVYQ0xVREVTKG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGVNdXRleCk7CisgICAgc2l6ZV90IGdldE1heFRleHR1cmVTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGdldE1heFZpZXdwb3J0RGltcygpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0gR2xlc1ZlcnNpb24geworICAgICAgICBHTEVTX1ZFUlNJT05fMV8wID0gMHgxMDAwMCwKKyAgICAgICAgR0xFU19WRVJTSU9OXzFfMSA9IDB4MTAwMDEsCisgICAgICAgIEdMRVNfVkVSU0lPTl8yXzAgPSAweDIwMDAwLAorICAgICAgICBHTEVTX1ZFUlNJT05fM18wID0gMHgzMDAwMCwKKyAgICB9OworCisgICAgc3RhdGljIEVHTENvbmZpZyBjaG9vc2VFZ2xDb25maWcoRUdMRGlzcGxheSBkaXNwbGF5LCBpbnQgZm9ybWF0LCBib29sIGxvZ0NvbmZpZyk7CisgICAgc3RhdGljIEdsZXNWZXJzaW9uIHBhcnNlR2xlc1ZlcnNpb24oY29uc3QgY2hhciogc3RyKTsKKyAgICBzdGF0aWMgRUdMQ29udGV4dCBjcmVhdGVFZ2xDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgc2hhcmVDb250ZXh0LCBib29sIHVzZUNvbnRleHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RlY3Rpb24gcHJvdGVjdGlvbik7CisgICAgc3RhdGljIEVHTFN1cmZhY2UgY3JlYXRlU3R1YkVnbFBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGh3Y0Zvcm1hdCwgUHJvdGVjdGlvbiBwcm90ZWN0aW9uKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RnJhbWVidWZmZXI+IGNyZWF0ZUZyYW1lYnVmZmVyKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdlPiBjcmVhdGVJbWFnZSgpOworICAgIHZvaWQgY2hlY2tFcnJvcnMoKSBjb25zdDsKKyAgICB2b2lkIGNoZWNrRXJyb3JzKGNvbnN0IGNoYXIqIHRhZykgY29uc3Q7CisgICAgdm9pZCBzZXRTY2lzc29yKGNvbnN0IFJlY3QmIHJlZ2lvbik7CisgICAgdm9pZCBkaXNhYmxlU2Npc3NvcigpOworICAgIGJvb2wgd2FpdFN5bmMoRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MpOworICAgIHN0YXR1c190IGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVySW50ZXJuYWwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgIEVYQ0xVREVTKG1SZW5kZXJpbmdNdXRleCk7CisgICAgdm9pZCB1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbCh1aW50NjRfdCBidWZmZXJJZCkgRVhDTFVERVMobVJlbmRlcmluZ011dGV4KTsKKworICAgIC8vIEEgZGF0YSBzcGFjZSBpcyBjb25zaWRlcmVkIEhEUiBkYXRhIHNwYWNlIGlmIGl0IGhhcyBCVDIwMjAgY29sb3Igc3BhY2UKKyAgICAvLyB3aXRoIFBRIG9yIEhMRyB0cmFuc2ZlciBmdW5jdGlvbi4KKyAgICBib29sIGlzSGRyRGF0YVNwYWNlKGNvbnN0IHVpOjpEYXRhc3BhY2UgZGF0YVNwYWNlKSBjb25zdDsKKyAgICBib29sIG5lZWRzWFlaVHJhbnNmb3JtTWF0cml4KCkgY29uc3Q7CisgICAgLy8gRGVmaW5lcyB0aGUgdmlld3BvcnQsIGFuZCBzZXRzIHRoZSBwcm9qZWN0aW9uIG1hdHJpeCB0byB0aGUgcHJvamVjdGlvbgorICAgIC8vIGRlZmluZWQgYnkgdGhlIGNsaXAuCisgICAgdm9pZCBzZXRWaWV3cG9ydEFuZFByb2plY3Rpb24oUmVjdCB2aWV3cG9ydCwgUmVjdCBjbGlwKTsKKyAgICAvLyBFdmljdHMgc3RhbGUgaW1hZ2VzIGZyb20gdGhlIGJ1ZmZlciBjYWNoZS4KKyAgICB2b2lkIGV2aWN0SW1hZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPExheWVyU2V0dGluZ3M+JiBsYXllcnMpOworICAgIC8vIENvbXB1dGVzIHRoZSBjcm9wcGluZyB3aW5kb3cgZm9yIHRoZSBsYXllciBhbmQgc2V0cyB1cCBjcm9wcGluZworICAgIC8vIGNvb3JkaW5hdGVzIGZvciB0aGUgbWVzaC4KKyAgICBGbG9hdFJlY3Qgc2V0dXBMYXllckNyb3BwaW5nKGNvbnN0IExheWVyU2V0dGluZ3MmIGxheWVyLCBNZXNoJiBtZXNoKTsKKworICAgIC8vIFdlIGRvIGEgc3BlY2lhbCBoYW5kbGluZyBmb3Igcm91bmRlZCBjb3JuZXJzIHdoZW4gaXQncyBwb3NzaWJsZSB0byB0dXJuIG9mZiBibGVuZGluZworICAgIC8vIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIGxheWVyLiBUaGUgcm91bmRlZCBjb3JuZXJzIG5lZWRzIHRvIHR1cm4gb24gYmxlbmRpbmcgc3VjaCB0aGF0CisgICAgLy8gd2UgY2FuIHNldCB0aGUgYWxwaGEgdmFsdWUgY29ycmVjdGx5LCBob3dldmVyLCBvbmx5IHRoZSBjb3JuZXJzIG5lZWQgdGhpcywgYW5kIHNpbmNlCisgICAgLy8gYmxlbmRpbmcgaXMgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiwgd2Ugd2FudCB0byB0dXJuIG9mZiBibGVuZGluZyB3aGVuIGl0J3Mgbm90IG5lY2Vzc2FyeS4KKyAgICB2b2lkIGhhbmRsZVJvdW5kZWRDb3JuZXJzKGNvbnN0IERpc3BsYXlTZXR0aW5ncyYgZGlzcGxheSwgY29uc3QgTGF5ZXJTZXR0aW5ncyYgbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNoJiBtZXNoKTsKKyAgICBiYXNlOjp1bmlxdWVfZmQgZmx1c2goKTsKKyAgICBib29sIGZpbmlzaCgpOworICAgIGJvb2wgd2FpdEZlbmNlKGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKTsKKyAgICB2b2lkIGNsZWFyV2l0aENvbG9yKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKKyAgICB2b2lkIGZpbGxSZWdpb25XaXRoQ29sb3IoY29uc3QgUmVnaW9uJiByZWdpb24sIGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKTsKKyAgICB2b2lkIGhhbmRsZVNoYWRvdyhjb25zdCBGbG9hdFJlY3QmIGNhc3RlclJlY3QsIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaGFkb3dTZXR0aW5ncyYgc2hhZG93U2V0dGluZ3MpOworICAgIHZvaWQgc2V0dXBMYXllckJsZW5kaW5nKGJvb2wgcHJlbXVsdGlwbGllZEFscGhhLCBib29sIG9wYXF1ZSwgYm9vbCBkaXNhYmxlVGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYWxmNCYgY29sb3IsIGZsb2F0IGNvcm5lclJhZGl1cyk7CisgICAgdm9pZCBzZXR1cExheWVyVGV4dHVyaW5nKGNvbnN0IFRleHR1cmUmIHRleHR1cmUpOworICAgIHZvaWQgc2V0dXBGaWxsV2l0aENvbG9yKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOworICAgIHZvaWQgc2V0Q29sb3JUcmFuc2Zvcm0oY29uc3QgbWF0NCYgY29sb3JUcmFuc2Zvcm0pOworICAgIHZvaWQgZGlzYWJsZVRleHR1cmluZygpOworICAgIHZvaWQgZGlzYWJsZUJsZW5kaW5nKCk7CisgICAgdm9pZCBzZXR1cENvcm5lclJhZGl1c0Nyb3BTaXplKGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpOworCisgICAgLy8gSERSIGFuZCBjb2xvciBtYW5hZ2VtZW50IHJlbGF0ZWQgZnVuY3Rpb25zIGFuZCBzdGF0ZQorICAgIHZvaWQgc2V0U291cmNlWTQxMEJUMjAyMChib29sIGVuYWJsZSk7CisgICAgdm9pZCBzZXRTb3VyY2VEYXRhU3BhY2UodWk6OkRhdGFzcGFjZSBzb3VyY2UpOworICAgIHZvaWQgc2V0T3V0cHV0RGF0YVNwYWNlKHVpOjpEYXRhc3BhY2UgZGF0YXNwYWNlKTsKKyAgICB2b2lkIHNldERpc3BsYXlNYXhMdW1pbmFuY2UoY29uc3QgZmxvYXQgbWF4THVtaW5hbmNlKTsKKworICAgIC8vIGRyYXdpbmcKKyAgICB2b2lkIGRyYXdNZXNoKGNvbnN0IE1lc2gmIG1lc2gpOworCisgICAgRUdMRGlzcGxheSBtRUdMRGlzcGxheTsKKyAgICBFR0xDb25maWcgbUVHTENvbmZpZzsKKyAgICBFR0xDb250ZXh0IG1FR0xDb250ZXh0OworICAgIEVHTFN1cmZhY2UgbVN0dWJTdXJmYWNlOworICAgIEVHTENvbnRleHQgbVByb3RlY3RlZEVHTENvbnRleHQ7CisgICAgRUdMU3VyZmFjZSBtUHJvdGVjdGVkU3R1YlN1cmZhY2U7CisgICAgR0xpbnQgbU1heFZpZXdwb3J0RGltc1syXTsKKyAgICBHTGludCBtTWF4VGV4dHVyZVNpemU7CisgICAgR0x1aW50IG1WcFdpZHRoOworICAgIEdMdWludCBtVnBIZWlnaHQ7CisgICAgRGVzY3JpcHRpb24gbVN0YXRlOworICAgIEdMU2hhZG93VGV4dHVyZSBtU2hhZG93VGV4dHVyZTsKKworICAgIG1hdDQgbVNyZ2JUb1h5ejsKKyAgICBtYXQ0IG1EaXNwbGF5UDNUb1h5ejsKKyAgICBtYXQ0IG1CdDIwMjBUb1h5ejsKKyAgICBtYXQ0IG1YeXpUb1NyZ2I7CisgICAgbWF0NCBtWHl6VG9EaXNwbGF5UDM7CisgICAgbWF0NCBtWHl6VG9CdDIwMjA7CisgICAgbWF0NCBtU3JnYlRvRGlzcGxheVAzOworICAgIG1hdDQgbVNyZ2JUb0J0MjAyMDsKKyAgICBtYXQ0IG1EaXNwbGF5UDNUb1NyZ2I7CisgICAgbWF0NCBtRGlzcGxheVAzVG9CdDIwMjA7CisgICAgbWF0NCBtQnQyMDIwVG9TcmdiOworICAgIG1hdDQgbUJ0MjAyMFRvRGlzcGxheVAzOworCisgICAgYm9vbCBtSW5Qcm90ZWN0ZWRDb250ZXh0ID0gZmFsc2U7CisgICAgLy8gSWYgc2V0IHRvIHRydWUsIHRoZW4gZW5hYmxlcyB0cmFjaW5nIGZsdXNoKCkgYW5kIGZpbmlzaCgpIHRvIHN5c3RyYWNlLgorICAgIGJvb2wgbVRyYWNlR3B1Q29tcGxldGlvbiA9IGZhbHNlOworICAgIC8vIE1heGltdW0gc2l6ZSBvZiBtRnJhbWVidWZmZXJJbWFnZUNhY2hlLiBJZiBtb3JlIGltYWdlcyB3b3VsZCBiZSBjYWNoZWQsIHRoZW4gKGFwcHJveGltYXRlbHkpCisgICAgLy8gdGhlIGxhc3QgcmVjZW50bHkgdXNlZCBidWZmZXIgc2hvdWxkIGJlIGtpY2tlZCBvdXQuCisgICAgdWludDMyX3QgbUZyYW1lYnVmZmVySW1hZ2VDYWNoZVNpemUgPSAwOworCisgICAgLy8gQ2FjaGUgb2Ygb3V0cHV0IGltYWdlcywga2V5ZWQgYnkgY29ycmVzcG9uZGluZyBHcmFwaGljQnVmZmVyIElELgorICAgIHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHVpbnQ2NF90LCBFR0xJbWFnZUtIUj4+IG1GcmFtZWJ1ZmZlckltYWdlQ2FjaGUKKyAgICAgICAgICAgIEdVQVJERURfQlkobUZyYW1lYnVmZmVySW1hZ2VDYWNoZU11dGV4KTsKKyAgICAvLyBUaGUgb25seSByZWFzb24gd2h5IHdlIGhhdmUgdGhpcyBtdXRleCBpcyBzbyB0aGF0IHdlIGRvbid0IHNlZ2ZhdWx0IHdoZW4KKyAgICAvLyBkdW1waW5nIGluZm8uCisgICAgc3RkOjptdXRleCBtRnJhbWVidWZmZXJJbWFnZUNhY2hlTXV0ZXg7CisKKyAgICAvLyBDdXJyZW50IGRhdGFzcGFjZSBvZiBsYXllciBiZWluZyByZW5kZXJlZAorICAgIHVpOjpEYXRhc3BhY2UgbURhdGFTcGFjZSA9IHVpOjpEYXRhc3BhY2U6OlVOS05PV047CisKKyAgICAvLyBDdXJyZW50IG91dHB1dCBkYXRhc3BhY2Ugb2YgdGhlIHJlbmRlciBlbmdpbmUKKyAgICB1aTo6RGF0YXNwYWNlIG1PdXRwdXREYXRhU3BhY2UgPSB1aTo6RGF0YXNwYWNlOjpVTktOT1dOOworCisgICAgLy8gV2hldGhlciBkZXZpY2Ugc3VwcG9ydHMgY29sb3IgbWFuYWdlbWVudCwgY3VycmVudGx5IGNvbG9yIG1hbmFnZW1lbnQKKyAgICAvLyBzdXBwb3J0cyBzUkdCLCBEaXNwbGF5UDMgY29sb3Igc3BhY2VzLgorICAgIGNvbnN0IGJvb2wgbVVzZUNvbG9yTWFuYWdlbWVudCA9IGZhbHNlOworCisgICAgLy8gQ2FjaGUgb2YgR0wgaW1hZ2VzIHRoYXQgd2UnbGwgc3RvcmUgcGVyIEdyYXBoaWNCdWZmZXIgSUQKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZT4+IG1JbWFnZUNhY2hlIEdVQVJERURfQlkobVJlbmRlcmluZ011dGV4KTsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIHN0ZDo6b3B0aW9uYWw8dWludDY0X3Q+PiBtVGV4dHVyZVZpZXc7CisKKyAgICAvLyBNdXRleCBndWFyZGluZyByZW5kZXJpbmcgb3BlcmF0aW9ucywgc28gdGhhdDoKKyAgICAvLyAxLiBHTCBvcGVyYXRpb25zIGFyZW4ndCBpbnRlcmxlYXZlZCwgYW5kCisgICAgLy8gMi4gSW50ZXJuYWwgc3RhdGUgcmVsYXRlZCB0byByZW5kZXJpbmcgdGhhdCBpcyBwb3RlbnRpYWxseSBtb2RpZmllZCBieQorICAgIC8vIG11bHRpcGxlIHRocmVhZHMgaXMgZ3VhcmFudGVlZCB0aHJlYWQtc2FmZS4KKyAgICBzdGQ6Om11dGV4IG1SZW5kZXJpbmdNdXRleDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxGcmFtZWJ1ZmZlcj4gbURyYXdpbmdCdWZmZXI7CisgICAgLy8gdGhpcyBpcyBhIDF4MSBSR0IgYnVmZmVyLCBidXQgb3Zlci1hbGxvY2F0ZSBpbiBjYXNlIGEgZHJpdmVyIHdhbnRzIG1vcmUKKyAgICAvLyBtZW1vcnkgb3IgaWYgaXQgbmVlZHMgdG8gc2F0aXNmeSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLiBJbiB0aGlzIGNhc2U6CisgICAgLy8gYXNzdW1lIHRoYXQgZWFjaCBjaGFubmVsIHJlcXVpcmVzIDQgYnl0ZXMsIGFuZCBhZGQgMyBhZGRpdGlvbmFsIGJ5dGVzIHRvCisgICAgLy8gZW5zdXJlIHRoYXQgd2UgYWxpZ24gb24gYSB3b3JkLiBBbGxvY2F0aW5nIDE2IGJ5dGVzIHdpbGwgcHJvdmlkZSBhCisgICAgLy8gZ3VhcmFudGVlIHRoYXQgd2UgZG9uJ3QgY2xvYmJlciBtZW1vcnkuCisgICAgdWludDMyX3QgbVBsYWNlaG9sZGVyRHJhd0J1ZmZlcls0XTsKKyAgICAvLyBQbGFjZWhvbGRlciBidWZmZXIgYW5kIGltYWdlLCBzaW1pbGFyIHRvIG1QbGFjZWhvbGRlckRyYXdCdWZmZXIsIGJ1dAorICAgIC8vIGluc3RlYWQgdGhlc2UgYXJlIGludGVuZGVkIGZvciBjbGVhbmluZyB1cCB0ZXh0dXJlIG1lbW9yeSB3aXRoIHRoZQorICAgIC8vIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTIHRhcmdldC4KKyAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBtUGxhY2Vob2xkZXJCdWZmZXIgPSBudWxscHRyOworICAgIEVHTEltYWdlIG1QbGFjZWhvbGRlckltYWdlID0gRUdMX05PX0lNQUdFX0tIUjsKKyAgICBzcDxGZW5jZT4gbUxhc3REcmF3RmVuY2U7CisgICAgLy8gU3RvcmUgYSBzZXBhcmF0ZSBib29sZWFuIGNoZWNraW5nIGlmIHByaW9yIHJlc291cmNlcyB3ZXJlIGNsZWFuZWQgdXAsIGFzCisgICAgLy8gZGV2aWNlcyB0aGF0IGRvbid0IHN1cHBvcnQgbmF0aXZlIHN5bmMgZmVuY2VzIGNhbid0IHJlbHkgb24gYSBsYXN0IGRyYXcKKyAgICAvLyBmZW5jZSB0aGF0IGRvZXNuJ3QgZXhpc3QuCisgICAgYm9vbCBtUHJpb3JSZXNvdXJjZXNDbGVhbmVkID0gdHJ1ZTsKKworICAgIC8vIEJsdXIgZWZmZWN0IHByb2Nlc3Nvciwgb25seSBpbnN0YW50aWF0ZWQgd2hlbiBhIGxheWVyIHJlcXVlc3RzIGl0LgorICAgIEJsdXJGaWx0ZXIqIG1CbHVyRmlsdGVyID0gbnVsbHB0cjsKKworICAgIGNsYXNzIEZsdXNoVHJhY2VyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEZsdXNoVHJhY2VyKEdMRVNSZW5kZXJFbmdpbmUqIGVuZ2luZSk7CisgICAgICAgIH5GbHVzaFRyYWNlcigpOworICAgICAgICB2b2lkIHF1ZXVlU3luYyhFR0xTeW5jS0hSIHN5bmMpIEVYQ0xVREVTKG1NdXRleCk7CisKKyAgICAgICAgc3RydWN0IFF1ZXVlRW50cnkgeworICAgICAgICAgICAgRUdMU3luY0tIUiBtU3luYyA9IG51bGxwdHI7CisgICAgICAgICAgICB1aW50NjRfdCBtRnJhbWVOdW0gPSAwOworICAgICAgICB9OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBsb29wKCk7CisgICAgICAgIEdMRVNSZW5kZXJFbmdpbmUqIGNvbnN0IG1FbmdpbmU7CisgICAgICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSBtQ29uZGl0aW9uOworICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpxdWV1ZTxRdWV1ZUVudHJ5PiBtUXVldWUgR1VBUkRFRF9CWShtTXV0ZXgpOworICAgICAgICB1aW50NjRfdCBtRnJhbWVzUXVldWVkIEdVQVJERURfQlkobU11dGV4KSA9IDA7CisgICAgICAgIGJvb2wgbVJ1bm5pbmcgPSB0cnVlOworICAgIH07CisgICAgZnJpZW5kIGNsYXNzIEZsdXNoVHJhY2VyOworICAgIGZyaWVuZCBjbGFzcyBJbWFnZU1hbmFnZXI7CisgICAgZnJpZW5kIGNsYXNzIEdMRnJhbWVidWZmZXI7CisgICAgZnJpZW5kIGNsYXNzIEJsdXJGaWx0ZXI7CisgICAgZnJpZW5kIGNsYXNzIEdlbmVyaWNQcm9ncmFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxGbHVzaFRyYWNlcj4gbUZsdXNoVHJhY2VyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZU1hbmFnZXI+IG1JbWFnZU1hbmFnZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEltYWdlTWFuYWdlcj4odGhpcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBTRl9HTEVTUkVOREVSRU5HSU5FX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFeHRlbnNpb25zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEV4dGVuc2lvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjRiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xFeHRlbnNpb25zLmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKGFuZHJvaWQ6OnJlbmRlcmVuZ2luZTo6Z2w6OkdMRXh0ZW5zaW9ucykKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCituYW1lc3BhY2UgeworCitjbGFzcyBFeHRlbnNpb25TZXQgeworcHVibGljOgorICAgIEV4dGVuc2lvblNldChjb25zdCBjaGFyKiBleHRlbnNpb25zKSB7CisgICAgICAgIGNoYXIgY29uc3QqIGN1cnIgPSBleHRlbnNpb25zOworICAgICAgICBjaGFyIGNvbnN0KiBoZWFkID0gY3VycjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaGVhZCA9IHN0cmNocihjdXJyLCAnICcpOworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IGhlYWQgPyBoZWFkIC0gY3VyciA6IHN0cmxlbihjdXJyKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgbUV4dGVuc2lvbnMuZW1wbGFjZShjdXJyLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VyciA9IGhlYWQgKyAxOworICAgICAgICB9IHdoaWxlIChoZWFkKTsKKyAgICB9CisKKyAgICBib29sIGhhc0V4dGVuc2lvbihjb25zdCBjaGFyKiBleHRlbnNpb24pIGNvbnN0IHsgcmV0dXJuIG1FeHRlbnNpb25zLmNvdW50KGV4dGVuc2lvbikgPiAwOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBtRXh0ZW5zaW9uczsKK307CisKK30gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCit2b2lkIEdMRXh0ZW5zaW9uczo6aW5pdFdpdGhHTFN0cmluZ3MoR0x1Ynl0ZSBjb25zdCogdmVuZG9yLCBHTHVieXRlIGNvbnN0KiByZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGNvbnN0KiB2ZXJzaW9uLCBHTHVieXRlIGNvbnN0KiBleHRlbnNpb25zKSB7CisgICAgbVZlbmRvciA9IChjaGFyIGNvbnN0Kil2ZW5kb3I7CisgICAgbVJlbmRlcmVyID0gKGNoYXIgY29uc3QqKXJlbmRlcmVyOworICAgIG1WZXJzaW9uID0gKGNoYXIgY29uc3QqKXZlcnNpb247CisgICAgbUV4dGVuc2lvbnMgPSAoY2hhciBjb25zdCopZXh0ZW5zaW9uczsKKworICAgIEV4dGVuc2lvblNldCBleHRlbnNpb25TZXQobUV4dGVuc2lvbnMuY19zdHIoKSk7CisgICAgaWYgKGV4dGVuc2lvblNldC5oYXNFeHRlbnNpb24oIkdMX0VYVF9wcm90ZWN0ZWRfdGV4dHVyZXMiKSkgeworICAgICAgICBtSGFzUHJvdGVjdGVkVGV4dHVyZSA9IHRydWU7CisgICAgfQorfQorCitjaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldFZlbmRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVZlbmRvci5zdHJpbmcoKTsKK30KKworY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRSZW5kZXJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbVJlbmRlcmVyLnN0cmluZygpOworfQorCitjaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldFZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1WZXJzaW9uLnN0cmluZygpOworfQorCitjaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldEV4dGVuc2lvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1FeHRlbnNpb25zLnN0cmluZygpOworfQorCit2b2lkIEdMRXh0ZW5zaW9uczo6aW5pdFdpdGhFR0xTdHJpbmdzKGNoYXIgY29uc3QqIGVnbFZlcnNpb24sIGNoYXIgY29uc3QqIGVnbEV4dGVuc2lvbnMpIHsKKyAgICBtRUdMVmVyc2lvbiA9IGVnbFZlcnNpb247CisgICAgbUVHTEV4dGVuc2lvbnMgPSBlZ2xFeHRlbnNpb25zOworCisgICAgRXh0ZW5zaW9uU2V0IGV4dGVuc2lvblNldChlZ2xFeHRlbnNpb25zKTsKKworICAgIC8vIEVHTF9BTkRST0lEWF9ub19jb25maWdfY29udGV4dCBpcyBhbiBleHBlcmltZW50YWwgZXh0ZW5zaW9uIHdpdGggbm8KKyAgICAvLyB3cml0dGVuIHNwZWNpZmljYXRpb24uIEl0IHdpbGwgYmUgcmVwbGFjZWQgYnkgc29tZXRoaW5nIG1vcmUgZm9ybWFsLgorICAgIC8vIFN1cmZhY2VGbGluZ2VyIGlzIHVzaW5nIGl0IHRvIGFsbG93IGEgc2luZ2xlIEVHTENvbnRleHQgdG8gcmVuZGVyIHRvCisgICAgLy8gYm90aCBhIDE2LWJpdCBwcmltYXJ5IGRpc3BsYXkgZnJhbWVidWZmZXIgYW5kIGEgMzItYml0IHZpcnR1YWwgZGlzcGxheQorICAgIC8vIGZyYW1lYnVmZmVyLgorICAgIC8vCisgICAgLy8gRUdMX0tIUl9ub19jb25maWdfY29udGV4dCBpcyBvZmZpY2lhbCBleHRlbnNpb24gdG8gYWxsb3cgY3JlYXRpbmcgYQorICAgIC8vIGNvbnRleHQgdGhhdCB3b3JrcyB3aXRoIGFueSBzdXJmYWNlIG9mIGEgZGlzcGxheS4KKyAgICBpZiAoZXh0ZW5zaW9uU2V0Lmhhc0V4dGVuc2lvbigiRUdMX0FORFJPSURYX25vX2NvbmZpZ19jb250ZXh0IikgfHwKKyAgICAgICAgZXh0ZW5zaW9uU2V0Lmhhc0V4dGVuc2lvbigiRUdMX0tIUl9ub19jb25maWdfY29udGV4dCIpKSB7CisgICAgICAgIG1IYXNOb0NvbmZpZ0NvbnRleHQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfQU5EUk9JRF9uYXRpdmVfZmVuY2Vfc3luYyIpKSB7CisgICAgICAgIG1IYXNOYXRpdmVGZW5jZVN5bmMgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZXh0ZW5zaW9uU2V0Lmhhc0V4dGVuc2lvbigiRUdMX0tIUl9mZW5jZV9zeW5jIikpIHsKKyAgICAgICAgbUhhc0ZlbmNlU3luYyA9IHRydWU7CisgICAgfQorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfS0hSX3dhaXRfc3luYyIpKSB7CisgICAgICAgIG1IYXNXYWl0U3luYyA9IHRydWU7CisgICAgfQorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfRVhUX3Byb3RlY3RlZF9jb250ZW50IikpIHsKKyAgICAgICAgbUhhc1Byb3RlY3RlZENvbnRlbnQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZXh0ZW5zaW9uU2V0Lmhhc0V4dGVuc2lvbigiRUdMX0lNR19jb250ZXh0X3ByaW9yaXR5IikpIHsKKyAgICAgICAgbUhhc0NvbnRleHRQcmlvcml0eSA9IHRydWU7CisgICAgfQorICAgIGlmIChleHRlbnNpb25TZXQuaGFzRXh0ZW5zaW9uKCJFR0xfS0hSX3N1cmZhY2VsZXNzX2NvbnRleHQiKSkgeworICAgICAgICBtSGFzU3VyZmFjZWxlc3NDb250ZXh0ID0gdHJ1ZTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RUdMVmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVHTFZlcnNpb24uc3RyaW5nKCk7Cit9CisKK2NoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RUdMRXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUVHTEV4dGVuc2lvbnMuc3RyaW5nKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEV4dGVuc2lvbnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEV4dGVuc2lvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAwMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRXh0ZW5zaW9ucy5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0ZfR0xFWFRFTlNJT05fSAorI2RlZmluZSBBTkRST0lEX1NGX0dMRVhURU5TSU9OX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEV4dGVuc2lvbnMgOiBwdWJsaWMgU2luZ2xldG9uPEdMRXh0ZW5zaW9ucz4geworcHVibGljOgorICAgIGJvb2wgaGFzTm9Db25maWdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbUhhc05vQ29uZmlnQ29udGV4dDsgfQorICAgIGJvb2wgaGFzTmF0aXZlRmVuY2VTeW5jKCkgY29uc3QgeyByZXR1cm4gbUhhc05hdGl2ZUZlbmNlU3luYzsgfQorICAgIGJvb2wgaGFzRmVuY2VTeW5jKCkgY29uc3QgeyByZXR1cm4gbUhhc0ZlbmNlU3luYzsgfQorICAgIGJvb2wgaGFzV2FpdFN5bmMoKSBjb25zdCB7IHJldHVybiBtSGFzV2FpdFN5bmM7IH0KKyAgICBib29sIGhhc1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBtSGFzUHJvdGVjdGVkQ29udGVudDsgfQorICAgIGJvb2wgaGFzQ29udGV4dFByaW9yaXR5KCkgY29uc3QgeyByZXR1cm4gbUhhc0NvbnRleHRQcmlvcml0eTsgfQorICAgIGJvb2wgaGFzU3VyZmFjZWxlc3NDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbUhhc1N1cmZhY2VsZXNzQ29udGV4dDsgfQorICAgIGJvb2wgaGFzUHJvdGVjdGVkVGV4dHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1IYXNQcm90ZWN0ZWRUZXh0dXJlOyB9CisKKyAgICB2b2lkIGluaXRXaXRoR0xTdHJpbmdzKEdMdWJ5dGUgY29uc3QqIHZlbmRvciwgR0x1Ynl0ZSBjb25zdCogcmVuZGVyZXIsIEdMdWJ5dGUgY29uc3QqIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVieXRlIGNvbnN0KiBleHRlbnNpb25zKTsKKyAgICBjaGFyIGNvbnN0KiBnZXRWZW5kb3IoKSBjb25zdDsKKyAgICBjaGFyIGNvbnN0KiBnZXRSZW5kZXJlcigpIGNvbnN0OworICAgIGNoYXIgY29uc3QqIGdldFZlcnNpb24oKSBjb25zdDsKKyAgICBjaGFyIGNvbnN0KiBnZXRFeHRlbnNpb25zKCkgY29uc3Q7CisKKyAgICB2b2lkIGluaXRXaXRoRUdMU3RyaW5ncyhjaGFyIGNvbnN0KiBlZ2xWZXJzaW9uLCBjaGFyIGNvbnN0KiBlZ2xFeHRlbnNpb25zKTsKKyAgICBjaGFyIGNvbnN0KiBnZXRFR0xWZXJzaW9uKCkgY29uc3Q7CisgICAgY2hhciBjb25zdCogZ2V0RUdMRXh0ZW5zaW9ucygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgR0xFeHRlbnNpb25zKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248R0xFeHRlbnNpb25zPjsKKworICAgIGJvb2wgbUhhc05vQ29uZmlnQ29udGV4dCA9IGZhbHNlOworICAgIGJvb2wgbUhhc05hdGl2ZUZlbmNlU3luYyA9IGZhbHNlOworICAgIGJvb2wgbUhhc0ZlbmNlU3luYyA9IGZhbHNlOworICAgIGJvb2wgbUhhc1dhaXRTeW5jID0gZmFsc2U7CisgICAgYm9vbCBtSGFzUHJvdGVjdGVkQ29udGVudCA9IGZhbHNlOworICAgIGJvb2wgbUhhc0NvbnRleHRQcmlvcml0eSA9IGZhbHNlOworICAgIGJvb2wgbUhhc1N1cmZhY2VsZXNzQ29udGV4dCA9IGZhbHNlOworICAgIGJvb2wgbUhhc1Byb3RlY3RlZFRleHR1cmUgPSBmYWxzZTsKKworICAgIFN0cmluZzggbVZlbmRvcjsKKyAgICBTdHJpbmc4IG1SZW5kZXJlcjsKKyAgICBTdHJpbmc4IG1WZXJzaW9uOworICAgIFN0cmluZzggbUV4dGVuc2lvbnM7CisgICAgU3RyaW5nOCBtRUdMVmVyc2lvbjsKKyAgICBTdHJpbmc4IG1FR0xFeHRlbnNpb25zOworCisgICAgR0xFeHRlbnNpb25zKGNvbnN0IEdMRXh0ZW5zaW9ucyYpOworICAgIEdMRXh0ZW5zaW9ucyYgb3BlcmF0b3I9KGNvbnN0IEdMRXh0ZW5zaW9ucyYpOworfTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRl9HTEVYVEVOU0lPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xGcmFtZWJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xGcmFtZWJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ODJiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEZyYW1lYnVmZmVyLmNwcApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgIkdMRnJhbWVidWZmZXIuaCIKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzMvZ2wzLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJHTEVTUmVuZGVyRW5naW5lLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworR0xGcmFtZWJ1ZmZlcjo6R0xGcmFtZWJ1ZmZlcihHTEVTUmVuZGVyRW5naW5lJiBlbmdpbmUpCisgICAgICA6IG1FbmdpbmUoZW5naW5lKSwgbUVHTERpc3BsYXkoZW5naW5lLmdldEVHTERpc3BsYXkoKSksIG1FR0xJbWFnZShFR0xfTk9fSU1BR0VfS0hSKSB7CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbVRleHR1cmVOYW1lKTsKKyAgICBnbEdlbkZyYW1lYnVmZmVycygxLCAmbUZyYW1lYnVmZmVyTmFtZSk7Cit9CisKK0dMRnJhbWVidWZmZXI6On5HTEZyYW1lYnVmZmVyKCkgeworICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtRnJhbWVidWZmZXJOYW1lKTsKKyAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtVGV4dHVyZU5hbWUpOworfQorCitib29sIEdMRnJhbWVidWZmZXI6OnNldE5hdGl2ZVdpbmRvd0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVCdWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtRUdMSW1hZ2UgIT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICBpZiAoIXVzaW5nRnJhbWVidWZmZXJDYWNoZSkgeworICAgICAgICAgICAgZWdsRGVzdHJveUltYWdlS0hSKG1FR0xEaXNwbGF5LCBtRUdMSW1hZ2UpOworICAgICAgICB9CisgICAgICAgIG1FR0xJbWFnZSA9IEVHTF9OT19JTUFHRV9LSFI7CisgICAgICAgIG1CdWZmZXJXaWR0aCA9IDA7CisgICAgICAgIG1CdWZmZXJIZWlnaHQgPSAwOworICAgIH0KKworICAgIGlmIChuYXRpdmVCdWZmZXIpIHsKKyAgICAgICAgbUVHTEltYWdlID0gbUVuZ2luZS5jcmVhdGVGcmFtZWJ1ZmZlckltYWdlSWZOZWVkZWQobmF0aXZlQnVmZmVyLCBpc1Byb3RlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVidWZmZXJDYWNoZSk7CisgICAgICAgIGlmIChtRUdMSW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHVzaW5nRnJhbWVidWZmZXJDYWNoZSA9IHVzZUZyYW1lYnVmZmVyQ2FjaGU7CisgICAgICAgIG1CdWZmZXJXaWR0aCA9IG5hdGl2ZUJ1ZmZlci0+d2lkdGg7CisgICAgICAgIG1CdWZmZXJIZWlnaHQgPSBuYXRpdmVCdWZmZXItPmhlaWdodDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR0xGcmFtZWJ1ZmZlcjo6YWxsb2NhdGVCdWZmZXJzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHZvaWQqIGRhdGEpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZU5hbWUpOworICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIHdpZHRoLCBoZWlnaHQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfQllURSwgZGF0YSk7CisgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfTUlSUk9SRURfUkVQRUFUKTsKKyAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX01JUlJPUkVEX1JFUEVBVCk7CisKKyAgICBtQnVmZmVySGVpZ2h0ID0gaGVpZ2h0OworICAgIG1CdWZmZXJXaWR0aCA9IHdpZHRoOworICAgIG1FbmdpbmUuY2hlY2tFcnJvcnMoIkFsbG9jYXRpbmcgRmJvIHRleHR1cmUiKTsKKworICAgIGJpbmQoKTsKKyAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwgbVRleHR1cmVOYW1lLCAwKTsKKyAgICBtU3RhdHVzID0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMX0ZSQU1FQlVGRkVSKTsKKyAgICB1bmJpbmQoKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworCisgICAgaWYgKG1TdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpIHsKKyAgICAgICAgQUxPR0UoIkZyYW1lIGJ1ZmZlciBpcyBub3QgY29tcGxldGUuIEVycm9yICVkIiwgbVN0YXR1cyk7CisgICAgfQorfQorCit2b2lkIEdMRnJhbWVidWZmZXI6OmJpbmQoKSBjb25zdCB7CisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GcmFtZWJ1ZmZlck5hbWUpOworfQorCit2b2lkIEdMRnJhbWVidWZmZXI6OmJpbmRBc1JlYWRCdWZmZXIoKSBjb25zdCB7CisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfUkVBRF9GUkFNRUJVRkZFUiwgbUZyYW1lYnVmZmVyTmFtZSk7Cit9CisKK3ZvaWQgR0xGcmFtZWJ1ZmZlcjo6YmluZEFzRHJhd0J1ZmZlcigpIGNvbnN0IHsKKyAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9EUkFXX0ZSQU1FQlVGRkVSLCBtRnJhbWVidWZmZXJOYW1lKTsKK30KKwordm9pZCBHTEZyYW1lYnVmZmVyOjp1bmJpbmQoKSBjb25zdCB7CisgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOworfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xGcmFtZWJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRnJhbWVidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU3Njk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMRnJhbWVidWZmZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9GcmFtZWJ1ZmZlci5oPgorCitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEVTUmVuZGVyRW5naW5lOworCitjbGFzcyBHTEZyYW1lYnVmZmVyIDogcHVibGljIHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEdMRnJhbWVidWZmZXIoR0xFU1JlbmRlckVuZ2luZSYgZW5naW5lKTsKKyAgICBleHBsaWNpdCBHTEZyYW1lYnVmZmVyKEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSwgYm9vbCBtdWx0aVRhcmdldCk7CisgICAgfkdMRnJhbWVidWZmZXIoKSBvdmVycmlkZTsKKworICAgIGJvb2wgc2V0TmF0aXZlV2luZG93QnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZUJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUpIG92ZXJyaWRlOworICAgIHZvaWQgYWxsb2NhdGVCdWZmZXJzKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHZvaWQqIGRhdGEgPSBudWxscHRyKTsKKyAgICBFR0xJbWFnZUtIUiBnZXRFR0xJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1FR0xJbWFnZTsgfQorICAgIHVpbnQzMl90IGdldFRleHR1cmVOYW1lKCkgY29uc3QgeyByZXR1cm4gbVRleHR1cmVOYW1lOyB9CisgICAgdWludDMyX3QgZ2V0RnJhbWVidWZmZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lYnVmZmVyTmFtZTsgfQorICAgIGludDMyX3QgZ2V0QnVmZmVySGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlckhlaWdodDsgfQorICAgIGludDMyX3QgZ2V0QnVmZmVyV2lkdGgoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyV2lkdGg7IH0KKyAgICBHTGVudW0gZ2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorICAgIHZvaWQgYmluZCgpIGNvbnN0OworICAgIHZvaWQgYmluZEFzUmVhZEJ1ZmZlcigpIGNvbnN0OworICAgIHZvaWQgYmluZEFzRHJhd0J1ZmZlcigpIGNvbnN0OworICAgIHZvaWQgdW5iaW5kKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgR0xFU1JlbmRlckVuZ2luZSYgbUVuZ2luZTsKKyAgICBFR0xEaXNwbGF5IG1FR0xEaXNwbGF5OworICAgIEVHTEltYWdlS0hSIG1FR0xJbWFnZTsKKyAgICBib29sIHVzaW5nRnJhbWVidWZmZXJDYWNoZSA9IGZhbHNlOworICAgIEdMZW51bSBtU3RhdHVzID0gR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQ7CisgICAgdWludDMyX3QgbVRleHR1cmVOYW1lLCBtRnJhbWVidWZmZXJOYW1lOworCisgICAgaW50MzJfdCBtQnVmZmVySGVpZ2h0ID0gMDsKKyAgICBpbnQzMl90IG1CdWZmZXJXaWR0aCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xJbWFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlNjQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmNwcApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUworCisjaW5jbHVkZSAiR0xJbWFnZS5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisjaW5jbHVkZSAiR0xFU1JlbmRlckVuZ2luZS5oIgorI2luY2x1ZGUgIkdMRXh0ZW5zaW9ucy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxFR0xpbnQ+IGJ1aWxkQXR0cmlidXRlTGlzdChib29sIGlzUHJvdGVjdGVkKSB7CisgICAgc3RkOjp2ZWN0b3I8RUdMaW50PiBhdHRyczsKKyAgICBhdHRycy5yZXNlcnZlKDE2KTsKKworICAgIGF0dHJzLnB1c2hfYmFjayhFR0xfSU1BR0VfUFJFU0VSVkVEX0tIUik7CisgICAgYXR0cnMucHVzaF9iYWNrKEVHTF9UUlVFKTsKKworICAgIGlmIChpc1Byb3RlY3RlZCAmJiBHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkuaGFzUHJvdGVjdGVkQ29udGVudCgpKSB7CisgICAgICAgIGF0dHJzLnB1c2hfYmFjayhFR0xfUFJPVEVDVEVEX0NPTlRFTlRfRVhUKTsKKyAgICAgICAgYXR0cnMucHVzaF9iYWNrKEVHTF9UUlVFKTsKKyAgICB9CisKKyAgICBhdHRycy5wdXNoX2JhY2soRUdMX05PTkUpOworCisgICAgcmV0dXJuIGF0dHJzOworfQorCitHTEltYWdlOjpHTEltYWdlKGNvbnN0IEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSkgOiBtRUdMRGlzcGxheShlbmdpbmUuZ2V0RUdMRGlzcGxheSgpKSB7fQorCitHTEltYWdlOjp+R0xJbWFnZSgpIHsKKyAgICBzZXROYXRpdmVXaW5kb3dCdWZmZXIobnVsbHB0ciwgZmFsc2UpOworfQorCitib29sIEdMSW1hZ2U6OnNldE5hdGl2ZVdpbmRvd0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtRUdMSW1hZ2UgIT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICBpZiAoIWVnbERlc3Ryb3lJbWFnZUtIUihtRUdMRGlzcGxheSwgbUVHTEltYWdlKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBkZXN0cm95IGltYWdlOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgfQorICAgICAgICBtRUdMSW1hZ2UgPSBFR0xfTk9fSU1BR0VfS0hSOworICAgIH0KKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RUdMaW50PiBhdHRycyA9IGJ1aWxkQXR0cmlidXRlTGlzdChpc1Byb3RlY3RlZCk7CisgICAgICAgIG1FR0xJbWFnZSA9IGVnbENyZWF0ZUltYWdlS0hSKG1FR0xEaXNwbGF5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RUdMQ2xpZW50QnVmZmVyPihidWZmZXIpLCBhdHRycy5kYXRhKCkpOworICAgICAgICBpZiAobUVHTEltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIEVHTEltYWdlOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtUHJvdGVjdGVkID0gaXNQcm90ZWN0ZWQ7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTEltYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDZjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xJbWFnZS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9JbWFnZS5oPgorCitzdHJ1Y3QgQU5hdGl2ZVdpbmRvd0J1ZmZlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEVTUmVuZGVyRW5naW5lOworCitjbGFzcyBHTEltYWdlIDogcHVibGljIHJlbmRlcmVuZ2luZTo6SW1hZ2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEdMSW1hZ2UoY29uc3QgR0xFU1JlbmRlckVuZ2luZSYgZW5naW5lKTsKKyAgICB+R0xJbWFnZSgpIG92ZXJyaWRlOworCisgICAgYm9vbCBzZXROYXRpdmVXaW5kb3dCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBib29sIGlzUHJvdGVjdGVkKSBvdmVycmlkZTsKKworICAgIEVHTEltYWdlS0hSIGdldEVHTEltYWdlKCkgY29uc3QgeyByZXR1cm4gbUVHTEltYWdlOyB9CisgICAgYm9vbCBpc1Byb3RlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm90ZWN0ZWQ7IH0KKworcHJpdmF0ZToKKyAgICBFR0xEaXNwbGF5IG1FR0xEaXNwbGF5OworICAgIEVHTEltYWdlS0hSIG1FR0xJbWFnZSA9IEVHTF9OT19JTUFHRV9LSFI7CisgICAgYm9vbCBtUHJvdGVjdGVkID0gZmFsc2U7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR0xJbWFnZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dUZXh0dXJlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1RleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjNhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dUZXh0dXJlLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDxHTEVTMy9nbDMuaD4KKworI2luY2x1ZGUgIkdMU2hhZG93VGV4dHVyZS5oIgorI2luY2x1ZGUgIkdMU2tpYVNoYWRvd1BvcnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitHTFNoYWRvd1RleHR1cmU6OkdMU2hhZG93VGV4dHVyZSgpIHsKKyAgICBmaWxsU2hhZG93VGV4dHVyZURhdGEobVRleHR1cmVEYXRhLCBTSEFET1dfVEVYVFVSRV9XSURUSCk7CisKKyAgICBnbEdlblRleHR1cmVzKDEsICZtTmFtZSk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtTmFtZSk7CisgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAgLyogYmFzZSBpbWFnZSBsZXZlbCAqLywgR0xfQUxQSEEsIFNIQURPV19URVhUVVJFX1dJRFRILAorICAgICAgICAgICAgICAgICBTSEFET1dfVEVYVFVSRV9IRUlHSFQsIDAgLyogYm9yZGVyICovLCBHTF9BTFBIQSwgR0xfVU5TSUdORURfQllURSwgbVRleHR1cmVEYXRhKTsKKyAgICBtVGV4dHVyZS5pbml0KFRleHR1cmU6OlRFWFRVUkVfMkQsIG1OYW1lKTsKKyAgICBtVGV4dHVyZS5zZXRGaWx0ZXJpbmcodHJ1ZSk7CisgICAgbVRleHR1cmUuc2V0RGltZW5zaW9ucyhTSEFET1dfVEVYVFVSRV9XSURUSCwgMSk7Cit9CisKK0dMU2hhZG93VGV4dHVyZTo6fkdMU2hhZG93VGV4dHVyZSgpIHsKKyAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZtTmFtZSk7Cit9CisKK2NvbnN0IFRleHR1cmUmIEdMU2hhZG93VGV4dHVyZTo6Z2V0VGV4dHVyZSgpIHsKKyAgICByZXR1cm4gbVRleHR1cmU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1RleHR1cmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNoYWRvd1RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBhOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VGV4dHVyZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL1RleHR1cmUuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMU2hhZG93VGV4dHVyZSB7CitwdWJsaWM6CisgICAgR0xTaGFkb3dUZXh0dXJlKCk7CisgICAgfkdMU2hhZG93VGV4dHVyZSgpOworCisgICAgY29uc3QgVGV4dHVyZSYgZ2V0VGV4dHVyZSgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IFNIQURPV19URVhUVVJFX1dJRFRIID0gMTI4OworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IFNIQURPV19URVhUVVJFX0hFSUdIVCA9IDE7CisKKyAgICBHTHVpbnQgbU5hbWU7CisgICAgVGV4dHVyZSBtVGV4dHVyZTsKKyAgICB1aW50OF90IG1UZXh0dXJlRGF0YVtTSEFET1dfVEVYVFVSRV9XSURUSF07Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VmVydGV4R2VuZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgxZjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VmVydGV4R2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL01lc2guaD4KKworI2luY2x1ZGUgPG1hdGgvdmVjNC5oPgorCisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHVpL1RyYW5zZm9ybS5oPgorCisjaW5jbHVkZSAiR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitHTFNoYWRvd1ZlcnRleEdlbmVyYXRvcjo6R0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IoY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywgZmxvYXQgY2FzdGVyWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhc3RlcklzVHJhbnNsdWNlbnQsIGNvbnN0IHZlYzQmIGFtYmllbnRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWM0JiBzcG90Q29sb3IsIGNvbnN0IHZlYzMmIGxpZ2h0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGlnaHRSYWRpdXMpIHsKKyAgICBtRHJhd0FtYmllbnRTaGFkb3cgPSBhbWJpZW50Q29sb3IuYSA+IDAuZjsKKyAgICBtRHJhd1Nwb3RTaGFkb3cgPSBzcG90Q29sb3IuYSA+IDAuZjsKKworICAgIC8vIEdlbmVyYXRlIGdlb21ldHJpZXMgYW5kIGZpbmQgbnVtYmVyIG9mIHZlcnRpY2VzIHRvIGdlbmVyYXRlCisgICAgaWYgKG1EcmF3QW1iaWVudFNoYWRvdykgeworICAgICAgICBtQW1iaWVudFNoYWRvd0dlb21ldHJ5ID0gZ2V0QW1iaWVudFNoYWRvd0dlb21ldHJ5KGNhc3RlclJlY3QsIGNhc3RlckNvcm5lclJhZGl1cywgY2FzdGVyWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZXJJc1RyYW5zbHVjZW50LCBhbWJpZW50Q29sb3IpOworICAgICAgICBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50ID0gZ2V0VmVydGV4Q291bnRGb3JHZW9tZXRyeSgqbUFtYmllbnRTaGFkb3dHZW9tZXRyeS5nZXQoKSk7CisgICAgICAgIG1BbWJpZW50U2hhZG93SW5kZXhDb3VudCA9IGdldEluZGV4Q291bnRGb3JHZW9tZXRyeSgqbUFtYmllbnRTaGFkb3dHZW9tZXRyeS5nZXQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUFtYmllbnRTaGFkb3dWZXJ0ZXhDb3VudCA9IDA7CisgICAgICAgIG1BbWJpZW50U2hhZG93SW5kZXhDb3VudCA9IDA7CisgICAgfQorCisgICAgaWYgKG1EcmF3U3BvdFNoYWRvdykgeworICAgICAgICBtU3BvdFNoYWRvd0dlb21ldHJ5ID0KKyAgICAgICAgICAgICAgICBnZXRTcG90U2hhZG93R2VvbWV0cnkoY2FzdGVyUmVjdCwgY2FzdGVyQ29ybmVyUmFkaXVzLCBjYXN0ZXJaLCBjYXN0ZXJJc1RyYW5zbHVjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG90Q29sb3IsIGxpZ2h0UG9zaXRpb24sIGxpZ2h0UmFkaXVzKTsKKyAgICAgICAgbVNwb3RTaGFkb3dWZXJ0ZXhDb3VudCA9IGdldFZlcnRleENvdW50Rm9yR2VvbWV0cnkoKm1TcG90U2hhZG93R2VvbWV0cnkuZ2V0KCkpOworICAgICAgICBtU3BvdFNoYWRvd0luZGV4Q291bnQgPSBnZXRJbmRleENvdW50Rm9yR2VvbWV0cnkoKm1TcG90U2hhZG93R2VvbWV0cnkuZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TcG90U2hhZG93VmVydGV4Q291bnQgPSAwOworICAgICAgICBtU3BvdFNoYWRvd0luZGV4Q291bnQgPSAwOworICAgIH0KK30KKworc2l6ZV90IEdMU2hhZG93VmVydGV4R2VuZXJhdG9yOjpnZXRWZXJ0ZXhDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFtYmllbnRTaGFkb3dWZXJ0ZXhDb3VudCArIG1TcG90U2hhZG93VmVydGV4Q291bnQ7Cit9CisKK3NpemVfdCBHTFNoYWRvd1ZlcnRleEdlbmVyYXRvcjo6Z2V0SW5kZXhDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFtYmllbnRTaGFkb3dJbmRleENvdW50ICsgbVNwb3RTaGFkb3dJbmRleENvdW50OworfQorCit2b2lkIEdMU2hhZG93VmVydGV4R2VuZXJhdG9yOjpmaWxsVmVydGljZXMoTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4mIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+JiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiYgcGFyYW1zKSBjb25zdCB7CisgICAgaWYgKG1EcmF3QW1iaWVudFNoYWRvdykgeworICAgICAgICBmaWxsVmVydGljZXNGb3JHZW9tZXRyeSgqbUFtYmllbnRTaGFkb3dHZW9tZXRyeS5nZXQoKSwgbUFtYmllbnRTaGFkb3dWZXJ0ZXhDb3VudCwgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCBwYXJhbXMpOworICAgIH0KKyAgICBpZiAobURyYXdTcG90U2hhZG93KSB7CisgICAgICAgIGZpbGxWZXJ0aWNlc0Zvckdlb21ldHJ5KCptU3BvdFNoYWRvd0dlb21ldHJ5LmdldCgpLCBtU3BvdFNoYWRvd1ZlcnRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMyPihwb3NpdGlvbiwgbUFtYmllbnRTaGFkb3dWZXJ0ZXhDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+KGNvbG9yLCBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMz4ocGFyYW1zLCBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50KSk7CisgICAgfQorfQorCit2b2lkIEdMU2hhZG93VmVydGV4R2VuZXJhdG9yOjpmaWxsSW5kaWNlcyh1aW50MTZfdCogaW5kaWNlcykgY29uc3QgeworICAgIGlmIChtRHJhd0FtYmllbnRTaGFkb3cpIHsKKyAgICAgICAgZmlsbEluZGljZXNGb3JHZW9tZXRyeSgqbUFtYmllbnRTaGFkb3dHZW9tZXRyeS5nZXQoKSwgbUFtYmllbnRTaGFkb3dJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogc3RhcnRpbmcgdmVydGV4IG9mZnNldCAqLywgaW5kaWNlcyk7CisgICAgfQorICAgIGlmIChtRHJhd1Nwb3RTaGFkb3cpIHsKKyAgICAgICAgZmlsbEluZGljZXNGb3JHZW9tZXRyeSgqbVNwb3RTaGFkb3dHZW9tZXRyeS5nZXQoKSwgbVNwb3RTaGFkb3dJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbWJpZW50U2hhZG93VmVydGV4Q291bnQgLyogc3RhcnRpbmcgdmVydGV4IG9mZnNldCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGluZGljZXNbbUFtYmllbnRTaGFkb3dJbmRleENvdW50XSkpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VmVydGV4R2VuZXJhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTJmOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2hhZG93VmVydGV4R2VuZXJhdG9yLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtYXRoL3ZlYzQuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisKKyNpbmNsdWRlICJHTFNraWFTaGFkb3dQb3J0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitjbGFzcyBNZXNoOworCituYW1lc3BhY2UgZ2wgeworCisvKioKKyAqIEdlbmVyYXRlcyBnbCBhdHRyaWJ1dGVzIHJlcXVpcmVkIHRvIGRyYXcgc2hhZG93IHNwb3QgYW5kL29yIGFtYmllbnQgc2hhZG93cy4KKyAqCisgKiBFYWNoIHNoYWRvdyBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgY29sb3JzLiBUaGlzIGNsYXNzIGdlbmVyYXRlcyB0aHJlZSB2ZXJ0ZXggYXR0cmlidXRlcyBmb3IKKyAqIGVhY2ggc2hhZG93LCBpdHMgcG9zaXRpb24sIGNvbG9yIGFuZCBzaGFkb3cgcGFyYW1zKG9mZnNldCBhbmQgZGlzdGFuY2UpLiBUaGVzZSBjYW4gYmUgc2VudAorICogdXNpbmcgYSBzaW5nbGUgZ2xEcmF3RWxlbWVudHMgY2FsbC4KKyAqLworY2xhc3MgR0xTaGFkb3dWZXJ0ZXhHZW5lcmF0b3IgeworcHVibGljOgorICAgIEdMU2hhZG93VmVydGV4R2VuZXJhdG9yKGNvbnN0IEZsb2F0UmVjdCYgY2FzdGVyUmVjdCwgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLCBmbG9hdCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCwgY29uc3QgdmVjNCYgYW1iaWVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlYzQmIHNwb3RDb2xvciwgY29uc3QgdmVjMyYgbGlnaHRQb3NpdGlvbiwgZmxvYXQgbGlnaHRSYWRpdXMpOworICAgIH5HTFNoYWRvd1ZlcnRleEdlbmVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIHNpemVfdCBnZXRWZXJ0ZXhDb3VudCgpIGNvbnN0OworICAgIHNpemVfdCBnZXRJbmRleENvdW50KCkgY29uc3Q7CisgICAgdm9pZCBmaWxsVmVydGljZXMoTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4mIHBvc2l0aW9uLCBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWM0PiYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMz4mIHBhcmFtcykgY29uc3Q7CisgICAgdm9pZCBmaWxsSW5kaWNlcyh1aW50MTZfdCogaW5kaWNlcykgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtRHJhd0FtYmllbnRTaGFkb3c7CisgICAgc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBtQW1iaWVudFNoYWRvd0dlb21ldHJ5OworICAgIGludCBtQW1iaWVudFNoYWRvd1ZlcnRleENvdW50ID0gMDsKKyAgICBpbnQgbUFtYmllbnRTaGFkb3dJbmRleENvdW50ID0gMDsKKworICAgIGJvb2wgbURyYXdTcG90U2hhZG93OworICAgIHN0ZDo6dW5pcXVlX3B0cjxHZW9tZXRyeT4gbVNwb3RTaGFkb3dHZW9tZXRyeTsKKyAgICBpbnQgbVNwb3RTaGFkb3dWZXJ0ZXhDb3VudCA9IDA7CisgICAgaW50IG1TcG90U2hhZG93SW5kZXhDb3VudCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTa2lhU2hhZG93UG9ydC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTa2lhU2hhZG93UG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4YjQzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFNraWFTaGFkb3dQb3J0LmNwcApAQCAtMCwwICsxLDY1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hdGgvdmVjNC5oPgorCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL01lc2guaD4KKworI2luY2x1ZGUgPHVpL1JlY3QuaD4KKyNpbmNsdWRlIDx1aS9UcmFuc2Zvcm0uaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiR0xTa2lhU2hhZG93UG9ydC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKKy8qKgorICogVGhlIHNoYWRvdyBnZW9tZXRyeSBsb2dpYyBhbmQgdmVydGV4IGdlbmVyYXRpb24gY29kZSBoYXMgYmVlbiBwb3J0ZWQgZnJvbSBza2lhIHNoYWRvdworICogZmFzdCBwYXRoIE9wZW5HTCBpbXBsZW1lbnRhdGlvbiB0byBkcmF3IHNoYWRvd3MgYXJvdW5kIHJlY3RzIGFuZCByb3VuZGVkIHJlY3RzIGluY2x1ZGluZworICogY2lyY2xlcy4KKyAqCisgKiBwYXRoOiBza2lhL3NyYy9ncHUvR3JSZW5kZXJUYXJnZXRDb250ZXh0LmNwcCBHclJlbmRlclRhcmdldENvbnRleHQ6OmRyYXdGYXN0U2hhZG93CisgKgorICogTW9kaWZpY2F0aW9ucyBtYWRlOgorICogLSBTd2l0Y2hlZCB0byB1c2luZyBzdGQgbGliIG1hdGggZnVuY3Rpb25zCisgKiAtIEZhbGwgb2ZmIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHZlcnRleCBzaGFkZXIgcmF0aGVyIHRoYW4gYSBzaGFkb3cgdGV4dHVyZQorICogLSBSZW1vdmVkIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIG9uIHRoZSBjYXN0ZXIgcmVjdCBzaW5jZSB0aGUgY2FzdGVyIHdpbGwgYmUgaW4gbG9jYWwKKyAqICAgY29vcmRpbmF0ZSBzcGFjZSBhbmQgd2lsbCBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgdmVydGV4IHNoYWRlci4KKyAqLworCitzdGF0aWMgaW5saW5lIGZsb2F0IGRpdmlkZV9hbmRfcGluKGZsb2F0IG51bWVyLCBmbG9hdCBkZW5vbSwgZmxvYXQgbWluLCBmbG9hdCBtYXgpIHsKKyAgICBpZiAoZGVub20gPT0gMC4wZikgcmV0dXJuIG1pbjsKKyAgICByZXR1cm4gc3RkOjpjbGFtcChudW1lciAvIGRlbm9tLCBtaW4sIG1heCk7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgYXV0byBTS19TY2FsYXJTcXJ0MiA9IDEuNDE0MjEzNTZmOworc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtBbWJpZW50SGVpZ2h0RmFjdG9yID0gMS4wZiAvIDEyOC4wZjsKK3N0YXRpYyBjb25zdGV4cHIgYXV0byBrQW1iaWVudEdlb21GYWN0b3IgPSA2NC4wZjsKKy8vIEFzc3VtaW5nIHRoYXQgd2UgaGF2ZSBhIGxpZ2h0IGhlaWdodCBvZiA2MDAgZm9yIHRoZSBzcG90IHNoYWRvdywKKy8vIHRoZSBzcG90IHZhbHVlcyB3aWxsIHJlYWNoIHRoZWlyIG1heGltdW0gYXQgYSBoZWlnaHQgb2YgYXBwcm94aW1hdGVseSAyOTIuMzA3Ny4KKy8vIFdlJ2xsIHJvdW5kIHVwIHRvIDMwMCB0byBrZWVwIGl0IHNpbXBsZS4KK3N0YXRpYyBjb25zdGV4cHIgYXV0byBrTWF4QW1iaWVudFJhZGl1cyA9IDMwMCAqIGtBbWJpZW50SGVpZ2h0RmFjdG9yICoga0FtYmllbnRHZW9tRmFjdG9yOworCitpbmxpbmUgZmxvYXQgQW1iaWVudEJsdXJSYWRpdXMoZmxvYXQgaGVpZ2h0KSB7CisgICAgcmV0dXJuIHN0ZDo6bWluKGhlaWdodCAqIGtBbWJpZW50SGVpZ2h0RmFjdG9yICoga0FtYmllbnRHZW9tRmFjdG9yLCBrTWF4QW1iaWVudFJhZGl1cyk7Cit9CitpbmxpbmUgZmxvYXQgQW1iaWVudFJlY2lwQWxwaGEoZmxvYXQgaGVpZ2h0KSB7CisgICAgcmV0dXJuIDEuMGYgKyBzdGQ6Om1heChoZWlnaHQgKiBrQW1iaWVudEhlaWdodEZhY3RvciwgMC4wZik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ2lyY2xlIERhdGEKKy8vCisvLyBXZSBoYXZlIHR3byBwb3NzaWJsZSBjYXNlcyBmb3IgZ2VvbWV0cnkgZm9yIGEgY2lyY2xlOgorCisvLyBJbiB0aGUgY2FzZSBvZiBhIG5vcm1hbCBmaWxsLCB3ZSBkcmF3IGdlb21ldHJ5IGZvciB0aGUgY2lyY2xlIGFzIGFuIG9jdGFnb24uCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ0ZpbGxDaXJjbGVJbmRpY2VzW10gPSB7CisgICAgICAgIC8vIGVudGVyIHRoZSBvY3RhZ29uCisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKKyAgICAgICAgIDAsIDEsIDgsIDEsIDIsIDgsCisgICAgICAgICAyLCAzLCA4LCAzLCA0LCA4LAorICAgICAgICAgNCwgNSwgOCwgNSwgNiwgOCwKKyAgICAgICAgIDYsIDcsIDgsIDcsIDAsIDgsCisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorfTsKKworLy8gRm9yIHN0cm9rZWQgY2lyY2xlcywgd2UgdXNlIHR3byBuZXN0ZWQgb2N0YWdvbnMuCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ1N0cm9rZUNpcmNsZUluZGljZXNbXSA9IHsKKyAgICAgICAgLy8gZW50ZXIgdGhlIG9jdGFnb24KKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgMCwgMSwgIDksIDAsICA5LCAgOCwKKyAgICAgICAgIDEsIDIsIDEwLCAxLCAxMCwgIDksCisgICAgICAgICAyLCAzLCAxMSwgMiwgMTEsIDEwLAorICAgICAgICAgMywgNCwgMTIsIDMsIDEyLCAxMSwKKyAgICAgICAgIDQsIDUsIDEzLCA0LCAxMywgMTIsCisgICAgICAgICA1LCA2LCAxNCwgNSwgMTQsIDEzLAorICAgICAgICAgNiwgNywgMTUsIDYsIDE1LCAxNCwKKyAgICAgICAgIDcsIDAsICA4LCA3LCAgOCwgMTUsCisgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorfTsKKworI2RlZmluZSBTS19BUlJBWV9DT1VOVChhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKChhKVswXSkpCitzdGF0aWMgY29uc3QgaW50IGtJbmRpY2VzUGVyRmlsbENpcmNsZSA9IFNLX0FSUkFZX0NPVU5UKGdGaWxsQ2lyY2xlSW5kaWNlcyk7CitzdGF0aWMgY29uc3QgaW50IGtJbmRpY2VzUGVyU3Ryb2tlQ2lyY2xlID0gU0tfQVJSQVlfQ09VTlQoZ1N0cm9rZUNpcmNsZUluZGljZXMpOworc3RhdGljIGNvbnN0IGludCBrVmVydHNQZXJTdHJva2VDaXJjbGUgPSAxNjsKK3N0YXRpYyBjb25zdCBpbnQga1ZlcnRzUGVyRmlsbENpcmNsZSA9IDk7CisKK3N0YXRpYyBpbnQgY2lyY2xlX3R5cGVfdG9fdmVydF9jb3VudChib29sIHN0cm9rZWQpIHsKKyAgICByZXR1cm4gc3Ryb2tlZCA/IGtWZXJ0c1BlclN0cm9rZUNpcmNsZSA6IGtWZXJ0c1BlckZpbGxDaXJjbGU7Cit9CisKK3N0YXRpYyBpbnQgY2lyY2xlX3R5cGVfdG9faW5kZXhfY291bnQoYm9vbCBzdHJva2VkKSB7CisgICAgcmV0dXJuIHN0cm9rZWQgPyBrSW5kaWNlc1BlclN0cm9rZUNpcmNsZSA6IGtJbmRpY2VzUGVyRmlsbENpcmNsZTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90KiBjaXJjbGVfdHlwZV90b19pbmRpY2VzKGJvb2wgc3Ryb2tlZCkgeworICAgIHJldHVybiBzdHJva2VkID8gZ1N0cm9rZUNpcmNsZUluZGljZXMgOiBnRmlsbENpcmNsZUluZGljZXM7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFJvdW5kUmVjdCBEYXRhCisvLworLy8gVGhlIGdlb21ldHJ5IGZvciBhIHNoYWRvdyByb3VuZHJlY3QgaXMgc2ltaWxhciB0byBhIDktcGF0Y2g6CisvLyAgICBfX19fX19fX19fX18KKy8vICAgfF98X19fX19fX198X3wKKy8vICAgfCB8ICAgICAgICB8IHwKKy8vICAgfCB8ICAgICAgICB8IHwKKy8vICAgfCB8ICAgICAgICB8IHwKKy8vICAgfF98X19fX19fX198X3wKKy8vICAgfF98X19fX19fX198X3wKKy8vCisvLyBIb3dldmVyLCBlYWNoIGNvcm5lciBpcyByZW5kZXJlZCBhcyBhIGZhbiByYXRoZXIgdGhhbiBhIHNpbXBsZSBxdWFkLCBhcyBiZWxvdy4gKFRoZSBkaWFncmFtCisvLyBzaG93cyB0aGUgdXBwZXIgcGFydCBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIuIFRoZSBib3R0b20gdHJpYW5nbGUgd291bGQgc2ltaWxhcmx5IGJlIHNwbGl0CisvLyBpbnRvIHR3byB0cmlhbmdsZXMuKQorLy8gICAgX19fX19fX18KKy8vICAgfFwgIFwgICB8CisvLyAgIHwgIFwgXCAgfAorLy8gICB8ICAgIFxcIHwKKy8vICAgfCAgICAgIFx8CisvLyAgIC0tLS0tLS0tCisvLworLy8gVGhlIGNlbnRlciBvZiB0aGUgZmFuIGhhbmRsZXMgdGhlIGN1cnZlIG9mIHRoZSBjb3JuZXIuIEZvciByb3VuZHJlY3RzIHdoZXJlIHRoZSBzdHJva2Ugd2lkdGgKKy8vIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29ybmVyIHJhZGl1cywgdGhlIG91dGVyIHRyaWFuZ2xlcyBibGVuZCBmcm9tIHRoZSBjdXJ2ZSB0byB0aGUgc3RyYWlnaHQKKy8vIHNpZGVzLiBPdGhlcndpc2UgdGhlc2UgdHJpYW5nbGVzIHdpbGwgYmUgZGVnZW5lcmF0ZS4KKy8vCisvLyBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3Ryb2tlIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgY29ybmVyIHJhZGl1cyBhbmQgdGhlCisvLyBibHVyIHJhZGl1cyAob3ZlcnN0cm9rZSksIHdlIGFkZCBhZGRpdGlvbmFsIGdlb21ldHJ5IHRvIG1hcmsgb3V0IHRoZSByZWN0YW5nbGUgaW4gdGhlIGNlbnRlci4KKy8vIFRoaXMgcmVjdGFuZ2xlIGV4dGVuZHMgdGhlIGNvdmVyYWdlIHZhbHVlcyBvZiB0aGUgY2VudGVyIGVkZ2VzIG9mIHRoZSA5LXBhdGNoLgorLy8gICAgX19fX19fX19fX19fCisvLyAgIHxffF9fX19fX19ffF98CisvLyAgIHwgfFwgX19fXyAvfCB8CisvLyAgIHwgfCB8ICAgIHwgfCB8CisvLyAgIHwgfCB8X19fX3wgfCB8CisvLyAgIHxffC9fX19fX19cfF98CisvLyAgIHxffF9fX19fX19ffF98CisvLworLy8gRm9yIGZpbGxlZCBycmVjdHMgd2UgcmV1c2UgdGhlIHN0cm9rZSBnZW9tZXRyeSBidXQgYWRkIGFuIGFkZGl0aW9uYWwgcXVhZCB0byB0aGUgY2VudGVyLgorCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ1JSZWN0SW5kaWNlc1tdID0geworICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgIC8vIG92ZXJzdHJva2UgcXVhZHMKKyAgICAgLy8gd2UgcGxhY2UgdGhpcyBhdCB0aGUgYmVnaW5uaW5nIHNvIHRoYXQgd2UgY2FuIHNraXAgdGhlc2UgaW5kaWNlcyB3aGVuIHJlbmRlcmluZyBhcyBmaWxsZWQKKyAgICAgMCwgNiwgMjUsIDAsIDI1LCAyNCwKKyAgICAgNiwgMTgsIDI3LCA2LCAyNywgMjUsCisgICAgIDE4LCAxMiwgMjYsIDE4LCAyNiwgMjcsCisgICAgIDEyLCAwLCAyNCwgMTIsIDI0LCAyNiwKKworICAgICAvLyBjb3JuZXJzCisgICAgIDAsIDEsIDIsIDAsIDIsIDMsIDAsIDMsIDQsIDAsIDQsIDUsCisgICAgIDYsIDExLCAxMCwgNiwgMTAsIDksIDYsIDksIDgsIDYsIDgsIDcsCisgICAgIDEyLCAxNywgMTYsIDEyLCAxNiwgMTUsIDEyLCAxNSwgMTQsIDEyLCAxNCwgMTMsCisgICAgIDE4LCAxOSwgMjAsIDE4LCAyMCwgMjEsIDE4LCAyMSwgMjIsIDE4LCAyMiwgMjMsCisKKyAgICAgLy8gZWRnZXMKKyAgICAgMCwgNSwgMTEsIDAsIDExLCA2LAorICAgICA2LCA3LCAxOSwgNiwgMTksIDE4LAorICAgICAxOCwgMjMsIDE3LCAxOCwgMTcsIDEyLAorICAgICAxMiwgMTMsIDEsIDEyLCAxLCAwLAorCisgICAgIC8vIGZpbGwgcXVhZAorICAgICAvLyB3ZSBwbGFjZSB0aGlzIGF0IHRoZSBlbmQgc28gdGhhdCB3ZSBjYW4gc2tpcCB0aGVzZSBpbmRpY2VzIHdoZW4gcmVuZGVyaW5nIGFzIHN0cm9rZWQKKyAgICAgMCwgNiwgMTgsIDAsIDE4LCAxMiwKKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCit9OworCisvLyBvdmVyc3Ryb2tlIGNvdW50CitzdGF0aWMgY29uc3QgaW50IGtJbmRpY2VzUGVyT3ZlcnN0cm9rZVJSZWN0ID0gU0tfQVJSQVlfQ09VTlQoZ1JSZWN0SW5kaWNlcykgLSA2OworLy8gc2ltcGxlIHN0cm9rZSBjb3VudCBza2lwcyBvdmVyc3Ryb2tlIGluZGljZXMKK3N0YXRpYyBjb25zdCBpbnQga0luZGljZXNQZXJTdHJva2VSUmVjdCA9IGtJbmRpY2VzUGVyT3ZlcnN0cm9rZVJSZWN0IC0gNiAqIDQ7CisvLyBmaWxsIGNvdW50IGFkZHMgZmluYWwgcXVhZCB0byBzdHJva2UgY291bnQKK3N0YXRpYyBjb25zdCBpbnQga0luZGljZXNQZXJGaWxsUlJlY3QgPSBrSW5kaWNlc1BlclN0cm9rZVJSZWN0ICsgNjsKK3N0YXRpYyBjb25zdCBpbnQga1ZlcnRzUGVyU3Ryb2tlUlJlY3QgPSAyNDsKK3N0YXRpYyBjb25zdCBpbnQga1ZlcnRzUGVyT3ZlcnN0cm9rZVJSZWN0ID0gMjg7CitzdGF0aWMgY29uc3QgaW50IGtWZXJ0c1BlckZpbGxSUmVjdCA9IDI0OworCitzdGF0aWMgaW50IHJyZWN0X3R5cGVfdG9fdmVydF9jb3VudChSUmVjdFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIGtGaWxsX1JSZWN0VHlwZToKKyAgICAgICAgICAgIHJldHVybiBrVmVydHNQZXJGaWxsUlJlY3Q7CisgICAgICAgIGNhc2Uga1N0cm9rZV9SUmVjdFR5cGU6CisgICAgICAgICAgICByZXR1cm4ga1ZlcnRzUGVyU3Ryb2tlUlJlY3Q7CisgICAgICAgIGNhc2Uga092ZXJzdHJva2VfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGtWZXJ0c1Blck92ZXJzdHJva2VSUmVjdDsKKyAgICB9CisgICAgQUxPR0UoIkludmFsaWQgcmVjdCB0eXBlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBycmVjdF90eXBlX3RvX2luZGV4X2NvdW50KFJSZWN0VHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2Uga0ZpbGxfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGtJbmRpY2VzUGVyRmlsbFJSZWN0OworICAgICAgICBjYXNlIGtTdHJva2VfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGtJbmRpY2VzUGVyU3Ryb2tlUlJlY3Q7CisgICAgICAgIGNhc2Uga092ZXJzdHJva2VfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGtJbmRpY2VzUGVyT3ZlcnN0cm9rZVJSZWN0OworICAgIH0KKyAgICBBTE9HRSgiSW52YWxpZCByZWN0IHR5cGU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgdWludDE2X3QqIHJyZWN0X3R5cGVfdG9faW5kaWNlcyhSUmVjdFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIGtGaWxsX1JSZWN0VHlwZToKKyAgICAgICAgY2FzZSBrU3Ryb2tlX1JSZWN0VHlwZToKKyAgICAgICAgICAgIHJldHVybiBnUlJlY3RJbmRpY2VzICsgNiAqIDQ7CisgICAgICAgIGNhc2Uga092ZXJzdHJva2VfUlJlY3RUeXBlOgorICAgICAgICAgICAgcmV0dXJuIGdSUmVjdEluZGljZXM7CisgICAgfQorICAgIEFMT0dFKCJJbnZhbGlkIHJlY3QgdHlwZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RhdGljIHZvaWQgZmlsbEluQ2lyY2xlVmVydHMoY29uc3QgR2VvbWV0cnkmIGFyZ3MsIGJvb2wgaXNTdHJva2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4mIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjND4mIHNoYWRvd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMz4mIHNoYWRvd1BhcmFtcykgeworICAgIHZlYzQgY29sb3IgPSBhcmdzLmZDb2xvcjsKKyAgICBmbG9hdCBvdXRlclJhZGl1cyA9IGFyZ3MuZk91dGVyUmFkaXVzOworICAgIGZsb2F0IGlubmVyUmFkaXVzID0gYXJncy5mSW5uZXJSYWRpdXM7CisgICAgZmxvYXQgYmx1clJhZGl1cyA9IGFyZ3MuZkJsdXJSYWRpdXM7CisgICAgZmxvYXQgZGlzdGFuY2VDb3JyZWN0aW9uID0gb3V0ZXJSYWRpdXMgLyBibHVyUmFkaXVzOworCisgICAgY29uc3QgRmxvYXRSZWN0JiBib3VuZHMgPSBhcmdzLmZEZXZCb3VuZHM7CisKKyAgICAvLyBUaGUgaW5uZXIgcmFkaXVzIGluIHRoZSB2ZXJ0ZXggZGF0YSBtdXN0IGJlIHNwZWNpZmllZCBpbiBub3JtYWxpemVkIHNwYWNlLgorICAgIGlubmVyUmFkaXVzID0gaW5uZXJSYWRpdXMgLyBvdXRlclJhZGl1czsKKworICAgIHZlYzIgY2VudGVyID0gdmVjMihib3VuZHMuZ2V0V2lkdGgoKSAvIDIuMGYsIGJvdW5kcy5nZXRIZWlnaHQoKSAvIDIuMGYpOworICAgIGZsb2F0IGhhbGZXaWR0aCA9IDAuNWYgKiBib3VuZHMuZ2V0V2lkdGgoKTsKKyAgICBmbG9hdCBvY3RPZmZzZXQgPSAwLjQxNDIxMzU2MjM3ZjsgLy8gc3FydCgyKSAtIDEKKyAgICBpbnQgdmVydGV4Q291bnQgPSAwOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtb2N0T2Zmc2V0ICogaGFsZldpZHRoLCAtaGFsZldpZHRoKTsKKyAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtb2N0T2Zmc2V0LCAtMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMihvY3RPZmZzZXQgKiBoYWxmV2lkdGgsIC1oYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKG9jdE9mZnNldCwgLTEsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoaGFsZldpZHRoLCAtb2N0T2Zmc2V0ICogaGFsZldpZHRoKTsKKyAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygxLCAtb2N0T2Zmc2V0LCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgIHZlcnRleENvdW50Kys7CisKKyAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKGhhbGZXaWR0aCwgb2N0T2Zmc2V0ICogaGFsZldpZHRoKTsKKyAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygxLCBvY3RPZmZzZXQsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIob2N0T2Zmc2V0ICogaGFsZldpZHRoLCBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKG9jdE9mZnNldCwgMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtb2N0T2Zmc2V0ICogaGFsZldpZHRoLCBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC1vY3RPZmZzZXQsIDEsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgdmVydGV4Q291bnQrKzsKKworICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoLWhhbGZXaWR0aCwgb2N0T2Zmc2V0ICogaGFsZldpZHRoKTsKKyAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtMSwgb2N0T2Zmc2V0LCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgIHZlcnRleENvdW50Kys7CisKKyAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1oYWxmV2lkdGgsIC1vY3RPZmZzZXQgKiBoYWxmV2lkdGgpOworICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKC0xLCAtb2N0T2Zmc2V0LCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgIHZlcnRleENvdW50Kys7CisKKyAgICBpZiAoaXNTdHJva2VkKSB7CisgICAgICAgIC8vIGNvbXB1dGUgdGhlIGlubmVyIHJpbmcKKworICAgICAgICAvLyBjb3NpbmUgYW5kIHNpbmUgb2YgcGkvOAorICAgICAgICBmbG9hdCBjID0gMC45MjM1Nzk1MzNmOworICAgICAgICBmbG9hdCBzID0gMC4zODI2ODM0MzJmOworICAgICAgICBmbG9hdCByID0gYXJncy5mSW5uZXJSYWRpdXM7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtcyAqIHIsIC1jICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtcyAqIGlubmVyUmFkaXVzLCAtYyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIocyAqIHIsIC1jICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMyhzICogaW5uZXJSYWRpdXMsIC1jICogaW5uZXJSYWRpdXMsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMihjICogciwgLXMgKiByKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKGMgKiBpbm5lclJhZGl1cywgLXMgKiBpbm5lclJhZGl1cywgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKGMgKiByLCBzICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMyhjICogaW5uZXJSYWRpdXMsIHMgKiBpbm5lclJhZGl1cywgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKHMgKiByLCBjICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMyhzICogaW5uZXJSYWRpdXMsIGMgKiBpbm5lclJhZGl1cywgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXIgKyB2ZWMyKC1zICogciwgYyAqIHIpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoLXMgKiBpbm5lclJhZGl1cywgYyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IGNlbnRlciArIHZlYzIoLWMgKiByLCBzICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtYyAqIGlubmVyUmFkaXVzLCBzICogaW5uZXJSYWRpdXMsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gY2VudGVyICsgdmVjMigtYyAqIHIsIC1zICogcik7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygtYyAqIGlubmVyUmFkaXVzLCAtcyAqIGlubmVyUmFkaXVzLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZpbGxlZAorICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSBjZW50ZXI7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygwLCAwLCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbEluUlJlY3RWZXJ0cyhjb25zdCBHZW9tZXRyeSYgYXJncywgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4mIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWM0PiYgc2hhZG93Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzM+JiBzaGFkb3dQYXJhbXMpIHsKKyAgICB2ZWM0IGNvbG9yID0gYXJncy5mQ29sb3I7CisgICAgZmxvYXQgb3V0ZXJSYWRpdXMgPSBhcmdzLmZPdXRlclJhZGl1czsKKworICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRzID0gYXJncy5mRGV2Qm91bmRzOworCisgICAgZmxvYXQgdW1icmFJbnNldCA9IGFyZ3MuZlVtYnJhSW5zZXQ7CisgICAgZmxvYXQgbWluRGltID0gMC41ZiAqIHN0ZDo6bWluKGJvdW5kcy5nZXRXaWR0aCgpLCBib3VuZHMuZ2V0SGVpZ2h0KCkpOworICAgIGlmICh1bWJyYUluc2V0ID4gbWluRGltKSB7CisgICAgICAgIHVtYnJhSW5zZXQgPSBtaW5EaW07CisgICAgfQorCisgICAgZmxvYXQgeElubmVyWzRdID0ge2JvdW5kcy5sZWZ0ICsgdW1icmFJbnNldCwgYm91bmRzLnJpZ2h0IC0gdW1icmFJbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmxlZnQgKyB1bWJyYUluc2V0LCBib3VuZHMucmlnaHQgLSB1bWJyYUluc2V0fTsKKyAgICBmbG9hdCB4TWlkWzRdID0ge2JvdW5kcy5sZWZ0ICsgb3V0ZXJSYWRpdXMsIGJvdW5kcy5yaWdodCAtIG91dGVyUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmxlZnQgKyBvdXRlclJhZGl1cywgYm91bmRzLnJpZ2h0IC0gb3V0ZXJSYWRpdXN9OworICAgIGZsb2F0IHhPdXRlcls0XSA9IHtib3VuZHMubGVmdCwgYm91bmRzLnJpZ2h0LCBib3VuZHMubGVmdCwgYm91bmRzLnJpZ2h0fTsKKyAgICBmbG9hdCB5SW5uZXJbNF0gPSB7Ym91bmRzLnRvcCArIHVtYnJhSW5zZXQsIGJvdW5kcy50b3AgKyB1bWJyYUluc2V0LCBib3VuZHMuYm90dG9tIC0gdW1icmFJbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdHRvbSAtIHVtYnJhSW5zZXR9OworICAgIGZsb2F0IHlNaWRbNF0gPSB7Ym91bmRzLnRvcCArIG91dGVyUmFkaXVzLCBib3VuZHMudG9wICsgb3V0ZXJSYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICBib3VuZHMuYm90dG9tIC0gb3V0ZXJSYWRpdXMsIGJvdW5kcy5ib3R0b20gLSBvdXRlclJhZGl1c307CisgICAgZmxvYXQgeU91dGVyWzRdID0ge2JvdW5kcy50b3AsIGJvdW5kcy50b3AsIGJvdW5kcy5ib3R0b20sIGJvdW5kcy5ib3R0b219OworCisgICAgZmxvYXQgYmx1clJhZGl1cyA9IGFyZ3MuZkJsdXJSYWRpdXM7CisKKyAgICAvLyBJbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGluc2V0IG1vcmUgZm9yIHRoZSB1bWJyYSwgb3VyIHR3byB0cmlhbmdsZXMgaW4gdGhlCisgICAgLy8gY29ybmVyIGdldCBza2V3ZWQgdG8gYSBkaWFtb25kIHJhdGhlciB0aGFuIGEgc3F1YXJlLiBUbyBjb3JyZWN0IGZvciB0aGF0LAorICAgIC8vIHdlIGFsc28gc2tldyB0aGUgdmVjdG9ycyB3ZSBzZW5kIHRvIHRoZSBzaGFkZXIgdGhhdCBoZWxwIGRlZmluZSB0aGUgY2lyY2xlLgorICAgIC8vIEJ5IGRvaW5nIHNvLCB3ZSBlbmQgdXAgd2l0aCBhIHF1YXJ0ZXIgY2lyY2xlIGluIHRoZSBjb3JuZXIgcmF0aGVyIHRoYW4gdGhlCisgICAgLy8gZWxsaXB0aWNhbCBjdXJ2ZS4KKworICAgIC8vIFRoaXMgaXMgYSBiaXQgbWFnaWNhbCwgYnV0IGl0IGdpdmVzIHVzIHRoZSBjb3JyZWN0IHJlc3VsdHMgYXQgZXh0cmVtYToKKyAgICAvLyAgIGEpIHVtYnJhSW5zZXQgPT0gb3V0ZXJSYWRpdXMgcHJvZHVjZXMgYW4gb3J0aG9nb25hbCB2ZWN0b3IKKyAgICAvLyAgIGIpIG91dGVyUmFkaXVzID09IDAgcHJvZHVjZXMgYSBkaWFnb25hbCB2ZWN0b3IKKyAgICAvLyBBbmQgdmlzdWFsbHkgdGhlIGNvcm5lciBsb29rcyBjb3JyZWN0LgorICAgIHZlYzIgb3V0ZXJWZWMgPSB2ZWMyKG91dGVyUmFkaXVzIC0gdW1icmFJbnNldCwgLW91dGVyUmFkaXVzIC0gdW1icmFJbnNldCk7CisgICAgb3V0ZXJWZWMgPSBub3JtYWxpemUob3V0ZXJWZWMpOworICAgIC8vIFdlIHdhbnQgdGhlIGNpcmNsZSBlZGdlIHRvIGZhbGwgZnJhY3Rpb25hbGx5IGFsb25nIHRoZSBkaWFnb25hbCBhdAorICAgIC8vICAgICAgKHNxcnQoMikqKHVtYnJhSW5zZXQgLSBvdXRlclJhZGl1cykgKyBvdXRlclJhZGl1cykvc3FydCgyKSp1bWJyYUluc2V0CisgICAgLy8KKyAgICAvLyBTZXR0aW5nIHRoZSBjb21wb25lbnRzIG9mIHRoZSBkaWFnb25hbCBvZmZzZXQgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZSB3aWxsIGdpdmUgdXMgdGhhdC4KKyAgICBmbG9hdCBkaWFnVmFsID0gdW1icmFJbnNldCAvIChTS19TY2FsYXJTcXJ0MiAqIChvdXRlclJhZGl1cyAtIHVtYnJhSW5zZXQpIC0gb3V0ZXJSYWRpdXMpOworICAgIHZlYzIgZGlhZ1ZlYyA9IHZlYzIoZGlhZ1ZhbCwgZGlhZ1ZhbCk7CisgICAgZmxvYXQgZGlzdGFuY2VDb3JyZWN0aW9uID0gdW1icmFJbnNldCAvIGJsdXJSYWRpdXM7CisKKyAgICBpbnQgdmVydGV4Q291bnQgPSAwOworICAgIC8vIGJ1aWxkIGNvcm5lciBieSBjb3JuZXIKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAvLyBpbm5lciBwb2ludAorICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKHhJbm5lcltpXSwgeUlubmVyW2ldKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDAsIDAsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgLy8gb3V0ZXIgcG9pbnRzCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoeE91dGVyW2ldLCB5SW5uZXJbaV0pOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgLTEsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMih4T3V0ZXJbaV0sIHlNaWRbaV0pOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMob3V0ZXJWZWMueCwgb3V0ZXJWZWMueSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKHhPdXRlcltpXSwgeU91dGVyW2ldKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKGRpYWdWZWMueCwgZGlhZ1ZlYy55LCBkaXN0YW5jZUNvcnJlY3Rpb24pOworICAgICAgICB2ZXJ0ZXhDb3VudCsrOworCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoeE1pZFtpXSwgeU91dGVyW2ldKTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKG91dGVyVmVjLngsIG91dGVyVmVjLnksIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMih4SW5uZXJbaV0sIHlPdXRlcltpXSk7CisgICAgICAgIHNoYWRvd0NvbG9yW3ZlcnRleENvdW50XSA9IGNvbG9yOworICAgICAgICBzaGFkb3dQYXJhbXNbdmVydGV4Q291bnRdID0gdmVjMygwLCAtMSwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKyAgICB9CisKKyAgICAvLyBBZGQgdGhlIGFkZGl0aW9uYWwgdmVydGljZXMgZm9yIG92ZXJzdHJva2VkIHJyZWN0cy4KKyAgICAvLyBFZmZlY3RpdmVseSB0aGlzIGlzIGFuIGFkZGl0aW9uYWwgc3Ryb2tlZCBycmVjdCwgd2l0aCBpdHMKKyAgICAvLyBwYXJhbWV0ZXJzIGVxdWFsIHRvIHRob3NlIGluIHRoZSBjZW50ZXIgb2YgdGhlIDktcGF0Y2guIFRoaXMgd2lsbAorICAgIC8vIGdpdmUgY29uc3RhbnQgdmFsdWVzIGFjcm9zcyB0aGlzIGlubmVyIHJpbmcuCisgICAgaWYgKGtPdmVyc3Ryb2tlX1JSZWN0VHlwZSA9PSBhcmdzLmZUeXBlKSB7CisgICAgICAgIGZsb2F0IGluc2V0ID0gdW1icmFJbnNldCArIGFyZ3MuZklubmVyUmFkaXVzOworCisgICAgICAgIC8vIFRMCisgICAgICAgIHBvc2l0aW9uW3ZlcnRleENvdW50XSA9IHZlYzIoYm91bmRzLmxlZnQgKyBpbnNldCwgYm91bmRzLnRvcCArIGluc2V0KTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDAsIDAsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgLy8gVFIKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMihib3VuZHMucmlnaHQgLSBpbnNldCwgYm91bmRzLnRvcCArIGluc2V0KTsKKyAgICAgICAgc2hhZG93Q29sb3JbdmVydGV4Q291bnRdID0gY29sb3I7CisgICAgICAgIHNoYWRvd1BhcmFtc1t2ZXJ0ZXhDb3VudF0gPSB2ZWMzKDAsIDAsIGRpc3RhbmNlQ29ycmVjdGlvbik7CisgICAgICAgIHZlcnRleENvdW50Kys7CisKKyAgICAgICAgLy8gQkwKKyAgICAgICAgcG9zaXRpb25bdmVydGV4Q291bnRdID0gdmVjMihib3VuZHMubGVmdCArIGluc2V0LCBib3VuZHMuYm90dG9tIC0gaW5zZXQpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgMCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKworICAgICAgICAvLyBCUgorICAgICAgICBwb3NpdGlvblt2ZXJ0ZXhDb3VudF0gPSB2ZWMyKGJvdW5kcy5yaWdodCAtIGluc2V0LCBib3VuZHMuYm90dG9tIC0gaW5zZXQpOworICAgICAgICBzaGFkb3dDb2xvclt2ZXJ0ZXhDb3VudF0gPSBjb2xvcjsKKyAgICAgICAgc2hhZG93UGFyYW1zW3ZlcnRleENvdW50XSA9IHZlYzMoMCwgMCwgZGlzdGFuY2VDb3JyZWN0aW9uKTsKKyAgICAgICAgdmVydGV4Q291bnQrKzsKKyAgICB9Cit9CisKK2ludCBnZXRWZXJ0ZXhDb3VudEZvckdlb21ldHJ5KGNvbnN0IEdlb21ldHJ5JiBzaGFkb3dHZW9tZXRyeSkgeworICAgIGlmIChzaGFkb3dHZW9tZXRyeS5mSXNDaXJjbGUpIHsKKyAgICAgICAgcmV0dXJuIGNpcmNsZV90eXBlX3RvX3ZlcnRfY291bnQoc2hhZG93R2VvbWV0cnkuZlR5cGUpOworICAgIH0KKworICAgIHJldHVybiBycmVjdF90eXBlX3RvX3ZlcnRfY291bnQoc2hhZG93R2VvbWV0cnkuZlR5cGUpOworfQorCitpbnQgZ2V0SW5kZXhDb3VudEZvckdlb21ldHJ5KGNvbnN0IEdlb21ldHJ5JiBzaGFkb3dHZW9tZXRyeSkgeworICAgIGlmIChzaGFkb3dHZW9tZXRyeS5mSXNDaXJjbGUpIHsKKyAgICAgICAgcmV0dXJuIGNpcmNsZV90eXBlX3RvX2luZGV4X2NvdW50KGtTdHJva2VfUlJlY3RUeXBlID09IHNoYWRvd0dlb21ldHJ5LmZUeXBlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcnJlY3RfdHlwZV90b19pbmRleF9jb3VudChzaGFkb3dHZW9tZXRyeS5mVHlwZSk7Cit9CisKK3ZvaWQgZmlsbFZlcnRpY2VzRm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5LCBpbnQgLyogdmVydGV4Q291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc2g6OlZlcnRleEFycmF5PHZlYzI+IHBvc2l0aW9uLCBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWM0PiBzaGFkb3dDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMz4gc2hhZG93UGFyYW1zKSB7CisgICAgaWYgKHNoYWRvd0dlb21ldHJ5LmZJc0NpcmNsZSkgeworICAgICAgICBmaWxsSW5DaXJjbGVWZXJ0cyhzaGFkb3dHZW9tZXRyeSwgc2hhZG93R2VvbWV0cnkuZklzU3Ryb2tlZCwgcG9zaXRpb24sIHNoYWRvd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkb3dQYXJhbXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxJblJSZWN0VmVydHMoc2hhZG93R2VvbWV0cnksIHBvc2l0aW9uLCBzaGFkb3dDb2xvciwgc2hhZG93UGFyYW1zKTsKKyAgICB9Cit9CisKK3ZvaWQgZmlsbEluZGljZXNGb3JHZW9tZXRyeShjb25zdCBHZW9tZXRyeSYgc2hhZG93R2VvbWV0cnksIGludCBpbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGluZ1ZlcnRleE9mZnNldCwgdWludDE2X3QqIGluZGljZXMpIHsKKyAgICBpZiAoc2hhZG93R2VvbWV0cnkuZklzQ2lyY2xlKSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90KiBwcmltSW5kaWNlcyA9IGNpcmNsZV90eXBlX3RvX2luZGljZXMoc2hhZG93R2VvbWV0cnkuZklzU3Ryb2tlZCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpbmRpY2VzW2ldID0gcHJpbUluZGljZXNbaV0gKyBzdGFydGluZ1ZlcnRleE9mZnNldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90KiBwcmltSW5kaWNlcyA9IHJyZWN0X3R5cGVfdG9faW5kaWNlcyhzaGFkb3dHZW9tZXRyeS5mVHlwZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpbmRpY2VzW2ldID0gcHJpbUluZGljZXNbaV0gKyBzdGFydGluZ1ZlcnRleE9mZnNldDsKKyAgICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHZvaWQgR2V0U3BvdFBhcmFtcyhmbG9hdCBvY2NsdWRlclosIGZsb2F0IGxpZ2h0WCwgZmxvYXQgbGlnaHRZLCBmbG9hdCBsaWdodFosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxpZ2h0UmFkaXVzLCBmbG9hdCYgYmx1clJhZGl1cywgZmxvYXQmIHNjYWxlLCB2ZWMyJiB0cmFuc2xhdGUpIHsKKyAgICBmbG9hdCB6UmF0aW8gPSBkaXZpZGVfYW5kX3BpbihvY2NsdWRlclosIGxpZ2h0WiAtIG9jY2x1ZGVyWiwgMC4wZiwgMC45NWYpOworICAgIGJsdXJSYWRpdXMgPSBsaWdodFJhZGl1cyAqIHpSYXRpbzsKKyAgICBzY2FsZSA9IGRpdmlkZV9hbmRfcGluKGxpZ2h0WiwgbGlnaHRaIC0gb2NjbHVkZXJaLCAxLjBmLCAxLjk1Zik7CisgICAgdHJhbnNsYXRlLnggPSAtelJhdGlvICogbGlnaHRYOworICAgIHRyYW5zbGF0ZS55ID0gLXpSYXRpbyAqIGxpZ2h0WTsKK30KKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxHZW9tZXRyeT4gZ2V0U2hhZG93R2VvbWV0cnkoY29uc3QgdmVjNCYgY29sb3IsIGNvbnN0IEZsb2F0UmVjdCYgZGV2UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRldlJhZGl1cywgZmxvYXQgYmx1clJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGluc2V0V2lkdGgpIHsKKyAgICAvLyBBbiBpbnNldFdpZHRoID4gMS8yIHJlY3Qgd2lkdGggb3IgaGVpZ2h0IGluZGljYXRlcyBhIHNpbXBsZSBmaWxsLgorICAgIGNvbnN0IGJvb2wgaXNDaXJjbGUgPSAoKGRldlJhZGl1cyA+PSBkZXZSZWN0LmdldFdpZHRoKCkpICYmIChkZXZSYWRpdXMgPj0gZGV2UmVjdC5nZXRIZWlnaHQoKSkpOworCisgICAgRmxvYXRSZWN0IGJvdW5kcyA9IGRldlJlY3Q7CisgICAgZmxvYXQgaW5uZXJSYWRpdXMgPSAwLjBmOworICAgIGZsb2F0IG91dGVyUmFkaXVzID0gZGV2UmFkaXVzOworICAgIGZsb2F0IHVtYnJhSW5zZXQ7CisKKyAgICBSUmVjdFR5cGUgdHlwZSA9IGtGaWxsX1JSZWN0VHlwZTsKKyAgICBpZiAoaXNDaXJjbGUpIHsKKyAgICAgICAgdW1icmFJbnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW1icmFJbnNldCA9IHN0ZDo6bWF4KG91dGVyUmFkaXVzLCBibHVyUmFkaXVzKTsKKyAgICB9CisKKyAgICAvLyBJZiBzdHJva2UgaXMgZ3JlYXRlciB0aGFuIHdpZHRoIG9yIGhlaWdodCwgdGhpcyBpcyBzdGlsbCBhIGZpbGwsCisgICAgLy8gb3RoZXJ3aXNlIHdlIGNvbXB1dGUgc3Ryb2tlIHBhcmFtcy4KKyAgICBpZiAoaXNDaXJjbGUpIHsKKyAgICAgICAgaW5uZXJSYWRpdXMgPSBkZXZSYWRpdXMgLSBpbnNldFdpZHRoOworICAgICAgICB0eXBlID0gaW5uZXJSYWRpdXMgPiAwID8ga1N0cm9rZV9SUmVjdFR5cGUgOiBrRmlsbF9SUmVjdFR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluc2V0V2lkdGggPD0gMC41ZiAqIHN0ZDo6bWluKGRldlJlY3QuZ2V0V2lkdGgoKSwgZGV2UmVjdC5nZXRIZWlnaHQoKSkpIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IHdvcnJ5IGFib3V0IGEgcmVhbCBpbm5lciByYWRpdXMsIHdlIGp1c3QgbmVlZCB0byBrbm93IGlmIHdlCisgICAgICAgICAgICAvLyBuZWVkIHRvIGNyZWF0ZSBvdmVyc3Ryb2tlIHZlcnRpY2VzLgorICAgICAgICAgICAgaW5uZXJSYWRpdXMgPSBzdGQ6Om1heChpbnNldFdpZHRoIC0gdW1icmFJbnNldCwgMC4wZik7CisgICAgICAgICAgICB0eXBlID0gaW5uZXJSYWRpdXMgPiAwID8ga092ZXJzdHJva2VfUlJlY3RUeXBlIDoga1N0cm9rZV9SUmVjdFR5cGU7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgYm9vbCBpc1N0cm9rZWQgPSAoa1N0cm9rZV9SUmVjdFR5cGUgPT0gdHlwZSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8R2VvbWV0cnk+KEdlb21ldHJ5e2NvbG9yLCBvdXRlclJhZGl1cywgdW1icmFJbnNldCwgaW5uZXJSYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXJSYWRpdXMsIGJvdW5kcywgdHlwZSwgaXNDaXJjbGUsIGlzU3Ryb2tlZH0pOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8R2VvbWV0cnk+IGdldEFtYmllbnRTaGFkb3dHZW9tZXRyeShjb25zdCBGbG9hdFJlY3QmIGNhc3RlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYXN0ZXJDb3JuZXJSYWRpdXMsIGZsb2F0IGNhc3RlclosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhc3RlcklzVHJhbnNsdWNlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWM0JiBhbWJpZW50Q29sb3IpIHsKKyAgICBmbG9hdCBkZXZTcGFjZUluc2V0V2lkdGggPSBBbWJpZW50Qmx1clJhZGl1cyhjYXN0ZXJaKTsKKyAgICBjb25zdCBmbG9hdCB1bWJyYVJlY2lwQWxwaGEgPSBBbWJpZW50UmVjaXBBbHBoYShjYXN0ZXJaKTsKKyAgICBjb25zdCBmbG9hdCBkZXZTcGFjZUFtYmllbnRCbHVyID0gZGV2U3BhY2VJbnNldFdpZHRoICogdW1icmFSZWNpcEFscGhhOworCisgICAgLy8gT3V0c2V0IHRoZSBzaGFkb3cgcnJlY3QgdG8gdGhlIGJvcmRlciBvZiB0aGUgcGVudW1icmEKKyAgICBmbG9hdCBhbWJpZW50UGF0aE91dHNldCA9IGRldlNwYWNlSW5zZXRXaWR0aDsKKyAgICBGbG9hdFJlY3Qgb3V0c2V0UmVjdChjYXN0ZXJSZWN0KTsKKyAgICBvdXRzZXRSZWN0LmxlZnQgLT0gYW1iaWVudFBhdGhPdXRzZXQ7CisgICAgb3V0c2V0UmVjdC50b3AgLT0gYW1iaWVudFBhdGhPdXRzZXQ7CisgICAgb3V0c2V0UmVjdC5yaWdodCArPSBhbWJpZW50UGF0aE91dHNldDsKKyAgICBvdXRzZXRSZWN0LmJvdHRvbSArPSBhbWJpZW50UGF0aE91dHNldDsKKworICAgIGZsb2F0IG91dHNldFJhZCA9IGNhc3RlckNvcm5lclJhZGl1cyArIGFtYmllbnRQYXRoT3V0c2V0OworICAgIGlmIChjYXN0ZXJJc1RyYW5zbHVjZW50KSB7CisgICAgICAgIC8vIHNldCBhIGxhcmdlIGluc2V0IHRvIGZvcmNlIGEgZmlsbAorICAgICAgICBkZXZTcGFjZUluc2V0V2lkdGggPSBvdXRzZXRSZWN0LmdldFdpZHRoKCk7CisgICAgfQorCisgICAgcmV0dXJuIGdldFNoYWRvd0dlb21ldHJ5KGFtYmllbnRDb2xvciwgb3V0c2V0UmVjdCwgc3RkOjphYnMob3V0c2V0UmFkKSwgZGV2U3BhY2VBbWJpZW50Qmx1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphYnMoZGV2U3BhY2VJbnNldFdpZHRoKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxHZW9tZXRyeT4gZ2V0U3BvdFNoYWRvd0dlb21ldHJ5KGNvbnN0IEZsb2F0UmVjdCYgY2FzdGVyUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywgZmxvYXQgY2FzdGVyWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCwgY29uc3QgdmVjNCYgc3BvdENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjMyYgbGlnaHRQb3NpdGlvbiwgZmxvYXQgbGlnaHRSYWRpdXMpIHsKKyAgICBmbG9hdCBkZXZTcGFjZVNwb3RCbHVyOworICAgIGZsb2F0IHNwb3RTY2FsZTsKKyAgICB2ZWMyIHNwb3RPZmZzZXQ7CisgICAgR2V0U3BvdFBhcmFtcyhjYXN0ZXJaLCBsaWdodFBvc2l0aW9uLngsIGxpZ2h0UG9zaXRpb24ueSwgbGlnaHRQb3NpdGlvbi56LCBsaWdodFJhZGl1cywKKyAgICAgICAgICAgICAgICAgIGRldlNwYWNlU3BvdEJsdXIsIHNwb3RTY2FsZSwgc3BvdE9mZnNldCk7CisgICAgLy8gaGFuZGxlIHNjYWxlIG9mIHJhZGl1cyBkdWUgdG8gQ1RNCisgICAgY29uc3QgZmxvYXQgc3JjU3BhY2VTcG90Qmx1ciA9IGRldlNwYWNlU3BvdEJsdXI7CisKKyAgICAvLyBBZGp1c3QgdHJhbnNsYXRlIGZvciB0aGUgZWZmZWN0IG9mIHRoZSBzY2FsZS4KKyAgICBzcG90T2Zmc2V0LnggKz0gc3BvdFNjYWxlOworICAgIHNwb3RPZmZzZXQueSArPSBzcG90U2NhbGU7CisKKyAgICAvLyBDb21wdXRlIHRoZSB0cmFuc2Zvcm1lZCBzaGFkb3cgcmVjdAorICAgIHVpOjpUcmFuc2Zvcm0gc2hhZG93VHJhbnNmb3JtOworICAgIHNoYWRvd1RyYW5zZm9ybS5zZXQoc3BvdE9mZnNldC54LCBzcG90T2Zmc2V0LnkpOworICAgIHNoYWRvd1RyYW5zZm9ybS5zZXQoc3BvdFNjYWxlLCAwLCAwLCBzcG90U2NhbGUpOworICAgIEZsb2F0UmVjdCBzcG90U2hhZG93UmVjdCA9IHNoYWRvd1RyYW5zZm9ybS50cmFuc2Zvcm0oY2FzdGVyUmVjdCk7CisgICAgZmxvYXQgc3BvdFNoYWRvd1JhZGl1cyA9IGNhc3RlckNvcm5lclJhZGl1cyAqIHNwb3RTY2FsZTsKKworICAgIC8vIENvbXB1dGUgdGhlIGluc2V0V2lkdGgKKyAgICBmbG9hdCBibHVyT3V0c2V0ID0gc3JjU3BhY2VTcG90Qmx1cjsKKyAgICBmbG9hdCBpbnNldFdpZHRoID0gYmx1ck91dHNldDsKKyAgICBpZiAoY2FzdGVySXNUcmFuc2x1Y2VudCkgeworICAgICAgICAvLyBJZiB0cmFuc3BhcmVudCwganVzdCBkbyBhIGZpbGwKKyAgICAgICAgaW5zZXRXaWR0aCArPSBzcG90U2hhZG93UmVjdC5nZXRXaWR0aCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvciBzaGFkb3dzLCBpbnN0ZWFkIG9mIHVzaW5nIGEgc3Ryb2tlIHdlIHNwZWNpZnkgYW4gaW5zZXQgZnJvbSB0aGUgcGVudW1icmEKKyAgICAgICAgLy8gYm9yZGVyLiBXZSB3YW50IHRvIGV4dGVuZCB0aGlzIGluc2V0IGFyZWEgc28gdGhhdCBpdCBtZWV0cyB1cCB3aXRoIHRoZSBjYXN0ZXIKKyAgICAgICAgLy8gZ2VvbWV0cnkuIFRoZSBpbnNldCBnZW9tZXRyeSB3aWxsIGJ5IGRlZmF1bHQgYWxyZWFkeSBiZSBpbnNldCBieSB0aGUgYmx1ciB3aWR0aC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgY29tcGFyZSB0aGUgbWluIGFuZCBtYXggY29ybmVycyBpbnNldCBieSB0aGUgcmFkaXVzIGJldHdlZW4gdGhlIG9yaWdpbmFsCisgICAgICAgIC8vIHJyZWN0IGFuZCB0aGUgc2hhZG93IHJyZWN0LiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgdHdvIHBsdXMgdGhlIGRpZmZlcmVuY2UKKyAgICAgICAgLy8gYmV0d2VlbiB0aGUgc2NhbGVkIHJhZGl1cyBhbmQgdGhlIG9yaWdpbmFsIHJhZGl1cyBnaXZlcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKyAgICAgICAgLy8gdHJhbnNmb3JtZWQgc2hhZG93IHNoYXBlIHRvIHRoZSBvcmlnaW5hbCBzaGFwZSBpbiB0aGF0IGNvcm5lci4gVGhlIG1heAorICAgICAgICAvLyBvZiB0aGVzZSBnaXZlcyB0aGUgbWF4aW11bSBkaXN0YW5jZSB3ZSBuZWVkIHRvIGNvdmVyLgorICAgICAgICAvLworICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgb3V0c2V0dGluZyBieSAxLzIgdGhlIGJsdXIgZGlzdGFuY2UsIHdlIGp1c3QgYWRkIHRoZSBtYXhPZmZzZXQgdG8KKyAgICAgICAgLy8gdGhhdCB0byBnZXQgdGhlIGZ1bGwgaW5zZXRXaWR0aC4KKyAgICAgICAgZmxvYXQgbWF4T2Zmc2V0OworICAgICAgICBpZiAoY2FzdGVyQ29ybmVyUmFkaXVzIDw9IDAuZikgeworICAgICAgICAgICAgLy8gTWFuaGF0dGFuIGRpc3RhbmNlIHdvcmtzIGJldHRlciBmb3IgcmVjdHMKKyAgICAgICAgICAgIG1heE9mZnNldCA9IHN0ZDo6bWF4KHN0ZDo6bWF4KHN0ZDo6YWJzKHNwb3RTaGFkb3dSZWN0LmxlZnQgLSBjYXN0ZXJSZWN0LmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphYnMoc3BvdFNoYWRvd1JlY3QudG9wIC0gY2FzdGVyUmVjdC50b3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHN0ZDo6YWJzKHNwb3RTaGFkb3dSZWN0LnJpZ2h0IC0gY2FzdGVyUmVjdC5yaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmFicyhzcG90U2hhZG93UmVjdC5ib3R0b20gLSBjYXN0ZXJSZWN0LmJvdHRvbSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGRyID0gc3BvdFNoYWRvd1JhZGl1cyAtIGNhc3RlckNvcm5lclJhZGl1czsKKyAgICAgICAgICAgIHZlYzIgdXBwZXJMZWZ0T2Zmc2V0ID0gdmVjMihzcG90U2hhZG93UmVjdC5sZWZ0IC0gY2FzdGVyUmVjdC5sZWZ0ICsgZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BvdFNoYWRvd1JlY3QudG9wIC0gY2FzdGVyUmVjdC50b3AgKyBkcik7CisgICAgICAgICAgICB2ZWMyIGxvd2VyUmlnaHRPZmZzZXQgPSB2ZWMyKHNwb3RTaGFkb3dSZWN0LnJpZ2h0IC0gY2FzdGVyUmVjdC5yaWdodCAtIGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG90U2hhZG93UmVjdC5ib3R0b20gLSBjYXN0ZXJSZWN0LmJvdHRvbSAtIGRyKTsKKyAgICAgICAgICAgIG1heE9mZnNldCA9IHNxcnQoc3RkOjptYXgoZG90KHVwcGVyTGVmdE9mZnNldCwgbG93ZXJSaWdodE9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdChsb3dlclJpZ2h0T2Zmc2V0LCBsb3dlclJpZ2h0T2Zmc2V0KSkpICsKKyAgICAgICAgICAgICAgICAgICAgZHI7CisgICAgICAgIH0KKyAgICAgICAgaW5zZXRXaWR0aCArPSBzdGQ6Om1heChibHVyT3V0c2V0LCBtYXhPZmZzZXQpOworICAgIH0KKworICAgIC8vIE91dHNldCB0aGUgc2hhZG93IHJyZWN0IHRvIHRoZSBib3JkZXIgb2YgdGhlIHBlbnVtYnJhCisgICAgc3BvdFNoYWRvd1JhZGl1cyArPSBibHVyT3V0c2V0OworICAgIHNwb3RTaGFkb3dSZWN0LmxlZnQgLT0gYmx1ck91dHNldDsKKyAgICBzcG90U2hhZG93UmVjdC50b3AgLT0gYmx1ck91dHNldDsKKyAgICBzcG90U2hhZG93UmVjdC5yaWdodCArPSBibHVyT3V0c2V0OworICAgIHNwb3RTaGFkb3dSZWN0LmJvdHRvbSArPSBibHVyT3V0c2V0OworCisgICAgcmV0dXJuIGdldFNoYWRvd0dlb21ldHJ5KHNwb3RDb2xvciwgc3BvdFNoYWRvd1JlY3QsIHN0ZDo6YWJzKHNwb3RTaGFkb3dSYWRpdXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjBmICogZGV2U3BhY2VTcG90Qmx1ciwgc3RkOjphYnMoaW5zZXRXaWR0aCkpOworfQorCit2b2lkIGZpbGxTaGFkb3dUZXh0dXJlRGF0YSh1aW50OF90KiBkYXRhLCBzaXplX3Qgc2hhZG93VGV4dHVyZVdpZHRoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaGFkb3dUZXh0dXJlV2lkdGg7IGkrKykgeworICAgICAgICBjb25zdCBmbG9hdCBkID0gMSAtIGkgLyAoKHNoYWRvd1RleHR1cmVXaWR0aCAqIDEuMGYpIC0gMS4wZik7CisgICAgICAgIGRhdGFbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZXhwKC00LjBmICogZCAqIGQpIC0gMC4wMThmKSAqIDI1NSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvR0xTa2lhU2hhZG93UG9ydC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2tpYVNoYWRvd1BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJjOGJiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMU2tpYVNoYWRvd1BvcnQuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1hdGgvdmVjNC5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9NZXNoLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKKy8qKgorICogVGhlIHNoYWRvdyBnZW9tZXRyeSBsb2dpYyBhbmQgdmVydGV4IGdlbmVyYXRpb24gY29kZSBoYXMgYmVlbiBwb3J0ZWQgZnJvbSBza2lhIHNoYWRvdworICogZmFzdCBwYXRoIE9wZW5HTCBpbXBsZW1lbnRhdGlvbiB0byBkcmF3IHNoYWRvd3MgYXJvdW5kIHJlY3RzIGFuZCByb3VuZGVkIHJlY3RzIGluY2x1ZGluZworICogY2lyY2xlcy4KKyAqCisgKiBwYXRoOiBza2lhL3NyYy9ncHUvR3JSZW5kZXJUYXJnZXRDb250ZXh0LmNwcCBHclJlbmRlclRhcmdldENvbnRleHQ6OmRyYXdGYXN0U2hhZG93CisgKgorICogTW9kaWZpY2F0aW9ucyBtYWRlOgorICogLSBTd2l0Y2hlZCB0byB1c2luZyBzdGQgbGliIG1hdGggZnVuY3Rpb25zCisgKiAtIEZhbGwgb2ZmIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGluIHZlcnRleCBzaGFkZXIgcmF0aGVyIHRoYW4gYSBzaGFkb3cgdGV4dHVyZQorICogLSBSZW1vdmVkIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIG9uIHRoZSBjYXN0ZXIgcmVjdCBzaW5jZSB0aGUgY2FzdGVyIHdpbGwgYmUgaW4gbG9jYWwKKyAqICAgY29vcmRpbmF0ZSBzcGFjZSBhbmQgd2lsbCBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgdmVydGV4IHNoYWRlci4KKyAqLworCitlbnVtIFJSZWN0VHlwZSB7CisgICAga0ZpbGxfUlJlY3RUeXBlLAorICAgIGtTdHJva2VfUlJlY3RUeXBlLAorICAgIGtPdmVyc3Ryb2tlX1JSZWN0VHlwZSwKK307CisKK3N0cnVjdCBHZW9tZXRyeSB7CisgICAgdmVjNCBmQ29sb3I7CisgICAgZmxvYXQgZk91dGVyUmFkaXVzOworICAgIGZsb2F0IGZVbWJyYUluc2V0OworICAgIGZsb2F0IGZJbm5lclJhZGl1czsKKyAgICBmbG9hdCBmQmx1clJhZGl1czsKKyAgICBGbG9hdFJlY3QgZkRldkJvdW5kczsKKyAgICBSUmVjdFR5cGUgZlR5cGU7CisgICAgYm9vbCBmSXNDaXJjbGU7CisgICAgYm9vbCBmSXNTdHJva2VkOworfTsKKworc3RkOjp1bmlxdWVfcHRyPEdlb21ldHJ5PiBnZXRTcG90U2hhZG93R2VvbWV0cnkoY29uc3QgRmxvYXRSZWN0JiBjYXN0ZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2FzdGVyQ29ybmVyUmFkaXVzLCBmbG9hdCBjYXN0ZXJaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50LCBjb25zdCB2ZWM0JiBzcG90Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWMzJiBsaWdodFBvc2l0aW9uLCBmbG9hdCBsaWdodFJhZGl1cyk7CisKK3N0ZDo6dW5pcXVlX3B0cjxHZW9tZXRyeT4gZ2V0QW1iaWVudFNoYWRvd0dlb21ldHJ5KGNvbnN0IEZsb2F0UmVjdCYgY2FzdGVyUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNhc3RlckNvcm5lclJhZGl1cywgZmxvYXQgY2FzdGVyWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlYzQmIGFtYmllbnRDb2xvcik7CisKK2ludCBnZXRWZXJ0ZXhDb3VudEZvckdlb21ldHJ5KGNvbnN0IEdlb21ldHJ5JiBzaGFkb3dHZW9tZXRyeSk7CisKK2ludCBnZXRJbmRleENvdW50Rm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5KTsKKwordm9pZCBmaWxsVmVydGljZXNGb3JHZW9tZXRyeShjb25zdCBHZW9tZXRyeSYgc2hhZG93R2VvbWV0cnksIGludCB2ZXJ0ZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzaDo6VmVydGV4QXJyYXk8dmVjMj4gcG9zaXRpb24sIE1lc2g6OlZlcnRleEFycmF5PHZlYzQ+IHNoYWRvd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNoOjpWZXJ0ZXhBcnJheTx2ZWMzPiBzaGFkb3dQYXJhbXMpOworCit2b2lkIGZpbGxJbmRpY2VzRm9yR2VvbWV0cnkoY29uc3QgR2VvbWV0cnkmIHNoYWRvd0dlb21ldHJ5LCBpbnQgaW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRpbmdWZXJ0ZXhPZmZzZXQsIHVpbnQxNl90KiBpbmRpY2VzKTsKKworLyoqCisgKiBNYXBzIHNoYWRvdyBnZW9tZXRyeSAnYWxwaGEnIHZhcnlpbmcgKDEgZm9yIGRhcmtlc3QsIDAgZm9yIHRyYW5zcGFyZW50KSB0bworICogZGFya25lc3MgYXQgdGhhdCBzcG90LiBWYWx1ZXMgYXJlIGRldGVybWluZWQgYnkgYW4gZXhwb25lbnRpYWwgZmFsbG9mZgorICogZnVuY3Rpb24gcHJvdmlkZWQgYnkgVVguCisgKgorICogVGhlIHRleHR1cmUgaXMgdXNlZCBmb3IgcXVpY2sgbG9va3VwIGluIHRoZXNoYWRvdyBzaGFkZXIuCisgKgorICogdGV4dHVyZURhdGEgLSBmaWxsZWQgd2l0aCBzaGFkb3cgdGV4dHVyZSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgYXQgbGVhc3Qgb2YKKyAqICAgICAgICAgICAgICAgc2l6ZSB0ZXh0dXJlV2lkdGgKKyAqCisgKiB0ZXh0dXJlV2lkdGggLSB3aWR0aCBvZiB0aGUgdGV4dHVyZSwgaGVpZ2h0IGlzIGFsd2F5cyAxCisgKi8KK3ZvaWQgZmlsbFNoYWRvd1RleHR1cmVEYXRhKHVpbnQ4X3QqIHRleHR1cmVEYXRhLCBzaXplX3QgdGV4dHVyZVdpZHRoKTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFZlcnRleEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwYzQ3MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFZlcnRleEJ1ZmZlci5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKworI2luY2x1ZGUgIkdMVmVydGV4QnVmZmVyLmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8bmF0aXZlYmFzZS9uYXRpdmViYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitHTFZlcnRleEJ1ZmZlcjo6R0xWZXJ0ZXhCdWZmZXIoKSB7CisgICAgZ2xHZW5CdWZmZXJzKDEsICZtQnVmZmVyTmFtZSk7Cit9CisKK0dMVmVydGV4QnVmZmVyOjp+R0xWZXJ0ZXhCdWZmZXIoKSB7CisgICAgZ2xEZWxldGVCdWZmZXJzKDEsICZtQnVmZmVyTmFtZSk7Cit9CisKK3ZvaWQgR0xWZXJ0ZXhCdWZmZXI6OmFsbG9jYXRlQnVmZmVycyhjb25zdCBHTGZsb2F0IGRhdGFbXSwgY29uc3QgR0x1aW50IHNpemUpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGJpbmQoKTsKKyAgICBnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBzaXplICogc2l6ZW9mKEdMZmxvYXQpLCBkYXRhLCBHTF9TVEFUSUNfRFJBVyk7CisgICAgdW5iaW5kKCk7Cit9CisKK3ZvaWQgR0xWZXJ0ZXhCdWZmZXI6OmJpbmQoKSBjb25zdCB7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbUJ1ZmZlck5hbWUpOworfQorCit2b2lkIEdMVmVydGV4QnVmZmVyOjp1bmJpbmQoKSBjb25zdCB7CisgICAgZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFZlcnRleEJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0dMVmVydGV4QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmZDBjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9HTFZlcnRleEJ1ZmZlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK3N0cnVjdCBBTmF0aXZlV2luZG93QnVmZmVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK2NsYXNzIEdMRVNSZW5kZXJFbmdpbmU7CisKK2NsYXNzIEdMVmVydGV4QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBHTFZlcnRleEJ1ZmZlcigpOworICAgIH5HTFZlcnRleEJ1ZmZlcigpOworCisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoY29uc3QgR0xmbG9hdCBkYXRhW10sIGNvbnN0IEdMdWludCBzaXplKTsKKyAgICB1aW50MzJfdCBnZXRCdWZmZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlck5hbWU7IH0KKyAgICB2b2lkIGJpbmQoKSBjb25zdDsKKyAgICB2b2lkIHVuYmluZCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1CdWZmZXJOYW1lOworfTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0ltYWdlTWFuYWdlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvSW1hZ2VNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBjZjUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0ltYWdlTWFuYWdlci5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlJlbmRlckVuZ2luZSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvc2NoZWRfcG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlICJHTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiSW1hZ2VNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworSW1hZ2VNYW5hZ2VyOjpJbWFnZU1hbmFnZXIoR0xFU1JlbmRlckVuZ2luZSogZW5naW5lKSA6IG1FbmdpbmUoZW5naW5lKSB7fQorCit2b2lkIEltYWdlTWFuYWdlcjo6aW5pdFRocmVhZChib29sIHJlYWx0aW1lKSB7CisgICAgbVRocmVhZCA9IHN0ZDo6dGhyZWFkKFt0aGlzXSgpIHsgdGhyZWFkTWFpbigpOyB9KTsKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAobVRocmVhZC5uYXRpdmVfaGFuZGxlKCksICJJbWFnZU1hbmFnZXIiKTsKKyAgICBpZiAocmVhbHRpbWUpIHsKKyAgICAgICAgLy8gVXNlIFNDSEVEX0ZJRk8gdG8gbWluaW1pemUgaml0dGVyCisgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHswfTsKKyAgICAgICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAyOworICAgICAgICBpZiAocHRocmVhZF9zZXRzY2hlZHBhcmFtKG1UaHJlYWQubmF0aXZlX2hhbmRsZSgpLCBTQ0hFRF9GSUZPLCAmcGFyYW0pICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBzZXQgU0NIRURfRklGTyBmb3IgSW1hZ2VNYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ltYWdlTWFuYWdlcjo6fkltYWdlTWFuYWdlcigpIHsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgIGlmIChtVGhyZWFkLmpvaW5hYmxlKCkpIHsKKyAgICAgICAgbVRocmVhZC5qb2luKCk7CisgICAgfQorfQorCit2b2lkIEltYWdlTWFuYWdlcjo6Y2FjaGVBc3luYyhjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJhcnJpZXI+JiBiYXJyaWVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICAgICAgICAgIGJhcnJpZXItPmlzT3BlbiA9IHRydWU7CisgICAgICAgICAgICBiYXJyaWVyLT5yZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgYmFycmllci0+Y29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFF1ZXVlRW50cnkgZW50cnkgPSB7UXVldWVFbnRyeTo6T3BlcmF0aW9uOjpJbnNlcnQsIGJ1ZmZlciwgYnVmZmVyLT5nZXRJZCgpLCBiYXJyaWVyfTsKKyAgICBxdWV1ZU9wZXJhdGlvbihzdGQ6Om1vdmUoZW50cnkpKTsKK30KKworc3RhdHVzX3QgSW1hZ2VNYW5hZ2VyOjpjYWNoZShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBhdXRvIGJhcnJpZXIgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJhcnJpZXI+KCk7CisgICAgY2FjaGVBc3luYyhidWZmZXIsIGJhcnJpZXIpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICBiYXJyaWVyLT5jb25kaXRpb24ud2FpdChiYXJyaWVyLT5tdXRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhiYXJyaWVyLT5tdXRleCkgeyByZXR1cm4gYmFycmllci0+aXNPcGVuOyB9KTsKKyAgICByZXR1cm4gYmFycmllci0+cmVzdWx0OworfQorCit2b2lkIEltYWdlTWFuYWdlcjo6cmVsZWFzZUFzeW5jKHVpbnQ2NF90IGJ1ZmZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QmFycmllcj4mIGJhcnJpZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFF1ZXVlRW50cnkgZW50cnkgPSB7UXVldWVFbnRyeTo6T3BlcmF0aW9uOjpEZWxldGUsIG51bGxwdHIsIGJ1ZmZlcklkLCBiYXJyaWVyfTsKKyAgICBxdWV1ZU9wZXJhdGlvbihzdGQ6Om1vdmUoZW50cnkpKTsKK30KKwordm9pZCBJbWFnZU1hbmFnZXI6OnF1ZXVlT3BlcmF0aW9uKGNvbnN0IFF1ZXVlRW50cnkmJiBlbnRyeSkgeworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVF1ZXVlLmVtcGxhY2UoZW50cnkpOworICAgICAgICBBVFJBQ0VfSU5UKCJJbWFnZU1hbmFnZXJRdWV1ZURlcHRoIiwgbVF1ZXVlLnNpemUoKSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworfQorCit2b2lkIEltYWdlTWFuYWdlcjo6dGhyZWFkTWFpbigpIHsKKyAgICBzZXRfc2NoZWRfcG9saWN5KDAsIFNQX0ZPUkVHUk9VTkQpOworICAgIGJvb2wgcnVuOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcnVuID0gbVJ1bm5pbmc7CisgICAgfQorICAgIHdoaWxlIChydW4pIHsKKyAgICAgICAgUXVldWVFbnRyeSBlbnRyeTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMobU11dGV4KSB7IHJldHVybiAhbVF1ZXVlLmVtcHR5KCkgfHwgIW1SdW5uaW5nOyB9KTsKKyAgICAgICAgICAgIHJ1biA9IG1SdW5uaW5nOworCisgICAgICAgICAgICBpZiAoIW1SdW5uaW5nKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgbVJ1bm5pbmcgaXMgZmFsc2UsIHRoZW4gSW1hZ2VNYW5hZ2VyIGlzIGJlaW5nIGRlc3Ryb3llZCwgc28KKyAgICAgICAgICAgICAgICAvLyBiYWlsIG91dCBub3cuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudHJ5ID0gbVF1ZXVlLmZyb250KCk7CisgICAgICAgICAgICBtUXVldWUucG9wKCk7CisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJJbWFnZU1hbmFnZXJRdWV1ZURlcHRoIiwgbVF1ZXVlLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKKyAgICAgICAgc3dpdGNoIChlbnRyeS5vcCkgeworICAgICAgICAgICAgY2FzZSBRdWV1ZUVudHJ5OjpPcGVyYXRpb246OkRlbGV0ZToKKyAgICAgICAgICAgICAgICBtRW5naW5lLT51bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXJJbnRlcm5hbChlbnRyeS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFF1ZXVlRW50cnk6Ok9wZXJhdGlvbjo6SW5zZXJ0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1FbmdpbmUtPmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVySW50ZXJuYWwoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnkuYmFycmllciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGVudHJ5TG9jayhlbnRyeS5iYXJyaWVyLT5tdXRleCk7CisgICAgICAgICAgICAgICAgZW50cnkuYmFycmllci0+cmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgICAgIGVudHJ5LmJhcnJpZXItPmlzT3BlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRyeS5iYXJyaWVyLT5jb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR0QoIlJlYWNoZWQgZW5kIG9mIHRocmVhZE1haW4sIHRlcm1pbmF0aW5nIEltYWdlTWFuYWdlciB0aHJlYWQhIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9JbWFnZU1hbmFnZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9JbWFnZU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmU4ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL0ltYWdlTWFuYWdlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHTEVTUmVuZGVyRW5naW5lOworCitjbGFzcyBJbWFnZU1hbmFnZXIgeworcHVibGljOgorICAgIHN0cnVjdCBCYXJyaWVyIHsKKyAgICAgICAgc3RkOjptdXRleCBtdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvbjsKKyAgICAgICAgYm9vbCBpc09wZW4gR1VBUkRFRF9CWShtdXRleCkgPSBmYWxzZTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0IEdVQVJERURfQlkobXV0ZXgpID0gTk9fRVJST1I7CisgICAgfTsKKyAgICBJbWFnZU1hbmFnZXIoR0xFU1JlbmRlckVuZ2luZSogZW5naW5lKTsKKyAgICB+SW1hZ2VNYW5hZ2VyKCk7CisgICAgLy8gU3RhcnRzIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBmb3IgdGhlIEltYWdlTWFuYWdlcgorICAgIC8vIFdlIG5lZWQgdGhpcyB0byBndWFyYW50ZWUgdGhhdCB0aGUgY2xhc3MgaXMgZnVsbHktY29uc3RydWN0ZWQgYmVmb3JlIHRoZQorICAgIC8vIHRocmVhZCBiZWdpbnMgcnVubmluZy4KKyAgICB2b2lkIGluaXRUaHJlYWQoYm9vbCByZWFsdGltZSk7CisgICAgdm9pZCBjYWNoZUFzeW5jKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCYXJyaWVyPiYgYmFycmllcikKKyAgICAgICAgICAgIEVYQ0xVREVTKG1NdXRleCk7CisgICAgc3RhdHVzX3QgY2FjaGUoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlcik7CisgICAgdm9pZCByZWxlYXNlQXN5bmModWludDY0X3QgYnVmZmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCYXJyaWVyPiYgYmFycmllcikgRVhDTFVERVMobU11dGV4KTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7CisgICAgICAgIGVudW0gY2xhc3MgT3BlcmF0aW9uIHsgRGVsZXRlLCBJbnNlcnQgfTsKKworICAgICAgICBPcGVyYXRpb24gb3AgPSBPcGVyYXRpb246OkRlbGV0ZTsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSAwOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QmFycmllcj4gYmFycmllciA9IG51bGxwdHI7CisgICAgfTsKKworICAgIHZvaWQgcXVldWVPcGVyYXRpb24oY29uc3QgUXVldWVFbnRyeSYmIGVudHJ5KTsKKyAgICB2b2lkIHRocmVhZE1haW4oKTsKKyAgICBHTEVTUmVuZGVyRW5naW5lKiBjb25zdCBtRW5naW5lOworICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQ7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IG1Db25kaXRpb247CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpxdWV1ZTxRdWV1ZUVudHJ5PiBtUXVldWUgR1VBUkRFRF9CWShtTXV0ZXgpOworCisgICAgYm9vbCBtUnVubmluZyBHVUFSREVEX0JZKG1NdXRleCkgPSB0cnVlOworfTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW0uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmJmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbS5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qR2x1aW50CisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQcm9ncmFtLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxtYXRoL21hdDQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSAiUHJvZ3JhbUNhY2hlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIGdsIHsKKworUHJvZ3JhbTo6UHJvZ3JhbShjb25zdCBQcm9ncmFtQ2FjaGU6OktleSYgLypuZWVkcyovLCBjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KQorICAgICAgOiBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKKyAgICBHTHVpbnQgdmVydGV4SWQgPSBidWlsZFNoYWRlcih2ZXJ0ZXgsIEdMX1ZFUlRFWF9TSEFERVIpOworICAgIEdMdWludCBmcmFnbWVudElkID0gYnVpbGRTaGFkZXIoZnJhZ21lbnQsIEdMX0ZSQUdNRU5UX1NIQURFUik7CisgICAgR0x1aW50IHByb2dyYW1JZCA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW1JZCwgdmVydGV4SWQpOworICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW1JZCwgZnJhZ21lbnRJZCk7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbUlkLCBwb3NpdGlvbiwgInBvc2l0aW9uIik7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbUlkLCB0ZXhDb29yZHMsICJ0ZXhDb29yZHMiKTsKKyAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtSWQsIGNyb3BDb29yZHMsICJjcm9wQ29vcmRzIik7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbUlkLCBzaGFkb3dDb2xvciwgInNoYWRvd0NvbG9yIik7CisgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbUlkLCBzaGFkb3dQYXJhbXMsICJzaGFkb3dQYXJhbXMiKTsKKyAgICBnbExpbmtQcm9ncmFtKHByb2dyYW1JZCk7CisKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbUlkLCBHTF9MSU5LX1NUQVRVUywgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9UUlVFKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciB3aGlsZSBsaW5raW5nIHNoYWRlcnM6Iik7CisgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOworICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtSWQsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOworICAgICAgICBpZiAoaW5mb0xlbiA+IDEpIHsKKyAgICAgICAgICAgIEdMY2hhciBsb2dbaW5mb0xlbl07CisgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW1JZCwgaW5mb0xlbiwgMCwgJmxvZ1swXSk7CisgICAgICAgICAgICBBTE9HRSgiJXMiLCBsb2cpOworICAgICAgICB9CisgICAgICAgIGdsRGV0YWNoU2hhZGVyKHByb2dyYW1JZCwgdmVydGV4SWQpOworICAgICAgICBnbERldGFjaFNoYWRlcihwcm9ncmFtSWQsIGZyYWdtZW50SWQpOworICAgICAgICBnbERlbGV0ZVNoYWRlcih2ZXJ0ZXhJZCk7CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50SWQpOworICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbUlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUHJvZ3JhbSA9IHByb2dyYW1JZDsKKyAgICAgICAgbVZlcnRleFNoYWRlciA9IHZlcnRleElkOworICAgICAgICBtRnJhZ21lbnRTaGFkZXIgPSBmcmFnbWVudElkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBtUHJvamVjdGlvbk1hdHJpeExvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgInByb2plY3Rpb24iKTsKKyAgICAgICAgbVRleHR1cmVNYXRyaXhMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJ0ZXh0dXJlIik7CisgICAgICAgIG1TYW1wbGVyTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAic2FtcGxlciIpOworICAgICAgICBtQ29sb3JMb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtSWQsICJjb2xvciIpOworICAgICAgICBtRGlzcGxheU1heEx1bWluYW5jZUxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgImRpc3BsYXlNYXhMdW1pbmFuY2UiKTsKKyAgICAgICAgbU1heE1hc3RlcmluZ0x1bWluYW5jZUxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgIm1heE1hc3RlcmluZ0x1bWluYW5jZSIpOworICAgICAgICBtTWF4Q29udGVudEx1bWluYW5jZUxvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgIm1heENvbnRlbnRMdW1pbmFuY2UiKTsKKyAgICAgICAgbUlucHV0VHJhbnNmb3JtTWF0cml4TG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAiaW5wdXRUcmFuc2Zvcm1NYXRyaXgiKTsKKyAgICAgICAgbU91dHB1dFRyYW5zZm9ybU1hdHJpeExvYyA9IGdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW1JZCwgIm91dHB1dFRyYW5zZm9ybU1hdHJpeCIpOworICAgICAgICBtQ29ybmVyUmFkaXVzTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAiY29ybmVyUmFkaXVzIik7CisgICAgICAgIG1Dcm9wQ2VudGVyTG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbUlkLCAiY3JvcENlbnRlciIpOworCisgICAgICAgIC8vIHNldC11cCB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIG91ciB1bmlmb3JtcworICAgICAgICBnbFVzZVByb2dyYW0ocHJvZ3JhbUlkKTsKKyAgICAgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1Qcm9qZWN0aW9uTWF0cml4TG9jLCAxLCBHTF9GQUxTRSwgbWF0NCgpLmFzQXJyYXkoKSk7CisgICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7CisgICAgfQorfQorCitib29sIFByb2dyYW06OmlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0aWFsaXplZDsKK30KKwordm9pZCBQcm9ncmFtOjp1c2UoKSB7CisgICAgZ2xVc2VQcm9ncmFtKG1Qcm9ncmFtKTsKK30KKworR0x1aW50IFByb2dyYW06OmdldEF0dHJpYihjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7CisgICAgLy8gVE9ETzogbWF5YmUgdXNlIGEgbG9jYWwgY2FjaGUKKyAgICByZXR1cm4gZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgbmFtZSk7Cit9CisKK0dMaW50IFByb2dyYW06OmdldFVuaWZvcm0oY29uc3QgY2hhciogbmFtZSkgY29uc3QgeworICAgIC8vIFRPRE86IG1heWJlIHVzZSBhIGxvY2FsIGNhY2hlCisgICAgcmV0dXJuIGdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCBuYW1lKTsKK30KKworR0x1aW50IFByb2dyYW06OmJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpIHsKKyAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc291cmNlLCAwKTsKKyAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICBHTGludCBzdGF0dXM7CisgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IEdMX1RSVUUpIHsKKyAgICAgICAgLy8gU29tZSBkcml2ZXJzIHJldHVybiB3cm9uZyB2YWx1ZXMgZm9yIEdMX0lORk9fTE9HX0xFTkdUSAorICAgICAgICAvLyB1c2UgYSBmaXhlZCBzaXplIGluc3RlYWQKKyAgICAgICAgR0xjaGFyIGxvZ1s1MTJdOworICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBzaXplb2YobG9nKSwgMCwgbG9nKTsKKyAgICAgICAgQUxPR0UoIkVycm9yIHdoaWxlIGNvbXBpbGluZyBzaGFkZXI6IFxuJXNcbiVzIiwgc291cmNlLCBsb2cpOworICAgICAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKwordm9pZCBQcm9ncmFtOjpzZXRVbmlmb3Jtcyhjb25zdCBEZXNjcmlwdGlvbiYgZGVzYykgeworICAgIC8vIFRPRE86IHdlIHNob3VsZCBoYXZlIGEgbWVjaGFuaXNtIGhlcmUgdG8gbm90IGFsd2F5cyByZXNldCB1bmlmb3JtcyB0aGF0CisgICAgLy8gZGlkbid0IGNoYW5nZSBmb3IgdGhpcyBwcm9ncmFtLgorCisgICAgaWYgKG1TYW1wbGVyTG9jID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtMWkobVNhbXBsZXJMb2MsIDApOworICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVRleHR1cmVNYXRyaXhMb2MsIDEsIEdMX0ZBTFNFLCBkZXNjLnRleHR1cmUuZ2V0TWF0cml4KCkuYXNBcnJheSgpKTsKKyAgICB9CisgICAgaWYgKG1Db2xvckxvYyA+PSAwKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGNvbG9yWzRdID0ge2Rlc2MuY29sb3IuciwgZGVzYy5jb2xvci5nLCBkZXNjLmNvbG9yLmIsIGRlc2MuY29sb3IuYX07CisgICAgICAgIGdsVW5pZm9ybTRmdihtQ29sb3JMb2MsIDEsIGNvbG9yKTsKKyAgICB9CisgICAgaWYgKG1JbnB1dFRyYW5zZm9ybU1hdHJpeExvYyA+PSAwKSB7CisgICAgICAgIG1hdDQgaW5wdXRUcmFuc2Zvcm1NYXRyaXggPSBkZXNjLmlucHV0VHJhbnNmb3JtTWF0cml4OworICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobUlucHV0VHJhbnNmb3JtTWF0cml4TG9jLCAxLCBHTF9GQUxTRSwgaW5wdXRUcmFuc2Zvcm1NYXRyaXguYXNBcnJheSgpKTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXRUcmFuc2Zvcm1NYXRyaXhMb2MgPj0gMCkgeworICAgICAgICAvLyBUaGUgb3V0cHV0IHRyYW5zZm9ybSBtYXRyaXggYW5kIGNvbG9yIG1hdHJpeCBjYW4gYmUgY29tYmluZWQgYXMgb25lIG1hdHJpeAorICAgICAgICAvLyB0aGF0IGlzIGFwcGxpZWQgcmlnaHQgYmVmb3JlIGFwcGx5aW5nIE9FVEYuCisgICAgICAgIG1hdDQgb3V0cHV0VHJhbnNmb3JtTWF0cml4ID0gZGVzYy5jb2xvck1hdHJpeCAqIGRlc2Mub3V0cHV0VHJhbnNmb3JtTWF0cml4OworICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobU91dHB1dFRyYW5zZm9ybU1hdHJpeExvYywgMSwgR0xfRkFMU0UsIG91dHB1dFRyYW5zZm9ybU1hdHJpeC5hc0FycmF5KCkpOworICAgIH0KKyAgICBpZiAobURpc3BsYXlNYXhMdW1pbmFuY2VMb2MgPj0gMCkgeworICAgICAgICBnbFVuaWZvcm0xZihtRGlzcGxheU1heEx1bWluYW5jZUxvYywgZGVzYy5kaXNwbGF5TWF4THVtaW5hbmNlKTsKKyAgICB9CisgICAgaWYgKG1NYXhNYXN0ZXJpbmdMdW1pbmFuY2VMb2MgPj0gMCkgeworICAgICAgICBnbFVuaWZvcm0xZihtTWF4TWFzdGVyaW5nTHVtaW5hbmNlTG9jLCBkZXNjLm1heE1hc3RlcmluZ0x1bWluYW5jZSk7CisgICAgfQorICAgIGlmIChtTWF4Q29udGVudEx1bWluYW5jZUxvYyA+PSAwKSB7CisgICAgICAgIGdsVW5pZm9ybTFmKG1NYXhDb250ZW50THVtaW5hbmNlTG9jLCBkZXNjLm1heENvbnRlbnRMdW1pbmFuY2UpOworICAgIH0KKyAgICBpZiAobUNvcm5lclJhZGl1c0xvYyA+PSAwKSB7CisgICAgICAgIGdsVW5pZm9ybTFmKG1Db3JuZXJSYWRpdXNMb2MsIGRlc2MuY29ybmVyUmFkaXVzKTsKKyAgICB9CisgICAgaWYgKG1Dcm9wQ2VudGVyTG9jID49IDApIHsKKyAgICAgICAgZ2xVbmlmb3JtMmYobUNyb3BDZW50ZXJMb2MsIGRlc2MuY3JvcFNpemUueCAvIDIuMGYsIGRlc2MuY3JvcFNpemUueSAvIDIuMGYpOworICAgIH0KKyAgICAvLyB0aGVzZSB1bmlmb3JtcyBhcmUgYWx3YXlzIHByZXNlbnQKKyAgICBnbFVuaWZvcm1NYXRyaXg0ZnYobVByb2plY3Rpb25NYXRyaXhMb2MsIDEsIEdMX0ZBTFNFLCBkZXNjLnByb2plY3Rpb25NYXRyaXguYXNBcnJheSgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW0uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzNzU1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0ZfUkVOREVSX0VOR0lORV9QUk9HUkFNX0gKKyNkZWZpbmUgU0ZfUkVOREVSX0VOR0lORV9QUk9HUkFNX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL3ByaXZhdGUvRGVzY3JpcHRpb24uaD4KKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKKy8qCisgKiBBYnN0cmFjdHMgYSBHTFNMIHByb2dyYW0gY29tcHJpc2luZyBhIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyCisgKi8KK2NsYXNzIFByb2dyYW0geworcHVibGljOgorICAgIC8vIGtub3duIGxvY2F0aW9ucyBmb3IgcG9zaXRpb24gYW5kIHRleHR1cmUgY29vcmRpbmF0ZXMKKyAgICBlbnVtIHsKKyAgICAgICAgLyogcG9zaXRpb24gb2YgZWFjaCB2ZXJ0ZXggZm9yIHZlcnRleCBzaGFkZXIgKi8KKyAgICAgICAgcG9zaXRpb24gPSAwLAorCisgICAgICAgIC8qIFVWIGNvb3JkaW5hdGVzIGZvciB0ZXh0dXJlIG1hcHBpbmcgKi8KKyAgICAgICAgdGV4Q29vcmRzID0gMSwKKworICAgICAgICAvKiBDcm9wIGNvb3JkaW5hdGVzLCBpbiBwaXhlbHMgKi8KKyAgICAgICAgY3JvcENvb3JkcyA9IDIsCisKKyAgICAgICAgLyogU2hhZG93IGNvbG9yICovCisgICAgICAgIHNoYWRvd0NvbG9yID0gMywKKworICAgICAgICAvKiBTaGFkb3cgcGFyYW1zICovCisgICAgICAgIHNoYWRvd1BhcmFtcyA9IDQsCisgICAgfTsKKworICAgIFByb2dyYW0oY29uc3QgUHJvZ3JhbUNhY2hlOjpLZXkmIG5lZWRzLCBjb25zdCBjaGFyKiB2ZXJ0ZXgsIGNvbnN0IGNoYXIqIGZyYWdtZW50KTsKKyAgICB+UHJvZ3JhbSgpID0gZGVmYXVsdDsKKworICAgIC8qIHdoZXRoZXIgdGhpcyBvYmplY3QgaXMgdXNhYmxlICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgICAvKiBCaW5kcyB0aGlzIHByb2dyYW0gdG8gdGhlIEdMRVMgY29udGV4dCAqLworICAgIHZvaWQgdXNlKCk7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSAqLworICAgIEdMdWludCBnZXRBdHRyaWIoY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHVuaWZvcm0gKi8KKyAgICBHTGludCBnZXRVbmlmb3JtKGNvbnN0IGNoYXIqIG5hbWUpIGNvbnN0OworCisgICAgLyogc2V0LXVwIHVuaWZvcm1zIGZyb20gdGhlIGRlc2NyaXB0aW9uICovCisgICAgdm9pZCBzZXRVbmlmb3Jtcyhjb25zdCBEZXNjcmlwdGlvbiYgZGVzYyk7CisKK3ByaXZhdGU6CisgICAgR0x1aW50IGJ1aWxkU2hhZGVyKGNvbnN0IGNoYXIqIHNvdXJjZSwgR0xlbnVtIHR5cGUpOworCisgICAgLy8gd2hldGhlciB0aGUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkCisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisKKyAgICAvLyBOYW1lIG9mIHRoZSBPcGVuR0wgcHJvZ3JhbSBhbmQgc2hhZGVycworICAgIEdMdWludCBtUHJvZ3JhbTsKKyAgICBHTHVpbnQgbVZlcnRleFNoYWRlcjsKKyAgICBHTHVpbnQgbUZyYWdtZW50U2hhZGVyOworCisgICAgLyogbG9jYXRpb24gb2YgdGhlIHByb2plY3Rpb24gbWF0cml4IHVuaWZvcm0gKi8KKyAgICBHTGludCBtUHJvamVjdGlvbk1hdHJpeExvYzsKKworICAgIC8qIGxvY2F0aW9uIG9mIHRoZSB0ZXh0dXJlIG1hdHJpeCB1bmlmb3JtICovCisgICAgR0xpbnQgbVRleHR1cmVNYXRyaXhMb2M7CisKKyAgICAvKiBsb2NhdGlvbiBvZiB0aGUgc2FtcGxlciB1bmlmb3JtICovCisgICAgR0xpbnQgbVNhbXBsZXJMb2M7CisKKyAgICAvKiBsb2NhdGlvbiBvZiB0aGUgY29sb3IgdW5pZm9ybSAqLworICAgIEdMaW50IG1Db2xvckxvYzsKKworICAgIC8qIGxvY2F0aW9uIG9mIGRpc3BsYXkgbHVtaW5hbmNlIHVuaWZvcm0gKi8KKyAgICBHTGludCBtRGlzcGxheU1heEx1bWluYW5jZUxvYzsKKyAgICAvKiBsb2NhdGlvbiBvZiBtYXggbWFzdGVyaW5nIGx1bWluYW5jZSB1bmlmb3JtICovCisgICAgR0xpbnQgbU1heE1hc3RlcmluZ0x1bWluYW5jZUxvYzsKKyAgICAvKiBsb2NhdGlvbiBvZiBtYXggY29udGVudCBsdW1pbmFuY2UgdW5pZm9ybSAqLworICAgIEdMaW50IG1NYXhDb250ZW50THVtaW5hbmNlTG9jOworCisgICAgLyogbG9jYXRpb24gb2YgdHJhbnNmb3JtIG1hdHJpeCAqLworICAgIEdMaW50IG1JbnB1dFRyYW5zZm9ybU1hdHJpeExvYzsKKyAgICBHTGludCBtT3V0cHV0VHJhbnNmb3JtTWF0cml4TG9jOworCisgICAgLyogbG9jYXRpb24gb2YgY29ybmVyIHJhZGl1cyB1bmlmb3JtICovCisgICAgR0xpbnQgbUNvcm5lclJhZGl1c0xvYzsKKworICAgIC8qIGxvY2F0aW9uIG9mIHN1cmZhY2UgY3JvcCBvcmlnaW4gdW5pZm9ybSwgZm9yIHJvdW5kZWQgY29ybmVyIGNsaXBwaW5nICovCisgICAgR0xpbnQgbUNyb3BDZW50ZXJMb2M7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBTRl9SRU5ERVJfRU5HSU5FX1BST0dSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW1DYWNoZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbUNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWUzNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL1Byb2dyYW1DYWNoZS5jcHAKQEAgLTAsMCArMSw4MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlICJQcm9ncmFtQ2FjaGUuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIlByb2dyYW0uaCIKKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKGFuZHJvaWQ6OnJlbmRlcmVuZ2luZTo6Z2w6OlByb2dyYW1DYWNoZSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCisvKgorICogQSBzaW1wbGUgZm9ybWF0dGVyIGNsYXNzIHRvIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSBlbmRsIGFuZAorICogbWFuYWdlIHRoZSBpbmRlbnRhdGlvbi4KKyAqLworCitjbGFzcyBGb3JtYXR0ZXI7CitzdGF0aWMgRm9ybWF0dGVyJiBpbmRlbnQoRm9ybWF0dGVyJiBmKTsKK3N0YXRpYyBGb3JtYXR0ZXImIGRlZGVudChGb3JtYXR0ZXImIGYpOworCitjbGFzcyBGb3JtYXR0ZXIgeworICAgIFN0cmluZzggbVN0cmluZzsKKyAgICBpbnQgbUluZGVudDsKKyAgICB0eXBlZGVmIEZvcm1hdHRlciYgKCpGb3JtYXRlck1hbmlwRnVuYykoRm9ybWF0dGVyJik7CisgICAgZnJpZW5kIEZvcm1hdHRlciYgaW5kZW50KEZvcm1hdHRlciYgZik7CisgICAgZnJpZW5kIEZvcm1hdHRlciYgZGVkZW50KEZvcm1hdHRlciYgZik7CisKK3B1YmxpYzoKKyAgICBGb3JtYXR0ZXIoKSA6IG1JbmRlbnQoMCkge30KKworICAgIFN0cmluZzggZ2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZzsgfQorCisgICAgZnJpZW5kIEZvcm1hdHRlciYgb3BlcmF0b3I8PChGb3JtYXR0ZXImIG91dCwgY29uc3QgY2hhciogaW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXQubUluZGVudDsgaSsrKSB7CisgICAgICAgICAgICBvdXQubVN0cmluZy5hcHBlbmQoIiAgICAiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQubVN0cmluZy5hcHBlbmQoaW4pOworICAgICAgICBvdXQubVN0cmluZy5hcHBlbmQoIlxuIik7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQorICAgIGZyaWVuZCBpbmxpbmUgRm9ybWF0dGVyJiBvcGVyYXRvcjw8KEZvcm1hdHRlciYgb3V0LCBjb25zdCBTdHJpbmc4JiBpbikgeworICAgICAgICByZXR1cm4gb3BlcmF0b3I8PChvdXQsIGluLnN0cmluZygpKTsKKyAgICB9CisgICAgZnJpZW5kIGlubGluZSBGb3JtYXR0ZXImIG9wZXJhdG9yPDwoRm9ybWF0dGVyJiB0bywgRm9ybWF0ZXJNYW5pcEZ1bmMgZnVuYykgeworICAgICAgICByZXR1cm4gKCpmdW5jKSh0byk7CisgICAgfQorfTsKK0Zvcm1hdHRlciYgaW5kZW50KEZvcm1hdHRlciYgZikgeworICAgIGYubUluZGVudCsrOworICAgIHJldHVybiBmOworfQorRm9ybWF0dGVyJiBkZWRlbnQoRm9ybWF0dGVyJiBmKSB7CisgICAgZi5tSW5kZW50LS07CisgICAgcmV0dXJuIGY7Cit9CisKK3ZvaWQgUHJvZ3JhbUNhY2hlOjpwcmltZUNhY2hlKAorICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQsIGJvb2wgdXNlQ29sb3JNYW5hZ2VtZW50LCBib29sIHRvbmVNYXBwZXJTaGFkZXJPbmx5KSB7CisgICAgYXV0byYgY2FjaGUgPSBtQ2FjaGVzW2NvbnRleHRdOworICAgIHVpbnQzMl90IHNoYWRlckNvdW50ID0gMDsKKworICAgIGlmICh0b25lTWFwcGVyU2hhZGVyT25seSkgeworICAgICAgICBLZXkgc2hhZGVyS2V5OworICAgICAgICAvLyBiYXNlIHNldHRpbmdzIHVzZWQgYnkgSERSLT5TRFIgdG9uZW1hcCBvbmx5CisgICAgICAgIHNoYWRlcktleS5zZXQoS2V5OjpCTEVORF9NQVNLIHwgS2V5OjpJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSyB8IEtleTo6T1VUUFVUX1RGX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6T1BBQ0lUWV9NQVNLIHwgS2V5OjpBTFBIQV9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICBLZXk6OlJPVU5ERURfQ09STkVSU19NQVNLIHwgS2V5OjpURVhUVVJFX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgS2V5OjpCTEVORF9OT1JNQUwgfCBLZXk6OklOUFVUX1RSQU5TRk9STV9NQVRSSVhfT04gfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfT04gfCBLZXk6Ok9VVFBVVF9URl9TUkdCIHwKKyAgICAgICAgICAgICAgICAgICAgICBLZXk6Ok9QQUNJVFlfT1BBUVVFIHwgS2V5OjpBTFBIQV9FUV9PTkUgfAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6Uk9VTkRFRF9DT1JORVJTX09GRiB8IEtleTo6VEVYVFVSRV9FWFQpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgLy8gQ2FjaGUgaW5wdXQgdHJhbnNmZXIgZm9yIEhMRyAmIFNUMjA4NAorICAgICAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6OklOUFVUX1RGX01BU0ssIChpICYgMSkgPworICAgICAgICAgICAgICAgICAgICBLZXk6OklOUFVUX1RGX0hMRyA6IEtleTo6SU5QVVRfVEZfU1QyMDg0KTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgWTQxMCBpbnB1dCBvbiBvciBvZmYKKyAgICAgICAgICAgIHNoYWRlcktleS5zZXQoS2V5OjpZNDEwX0JUMjAyMF9NQVNLLCAoaSAmIDIpID8KKyAgICAgICAgICAgICAgICAgICAgS2V5OjpZNDEwX0JUMjAyMF9PTiA6IEtleTo6WTQxMF9CVDIwMjBfT0ZGKTsKKyAgICAgICAgICAgIGlmIChjYWNoZS5jb3VudChzaGFkZXJLZXkpID09IDApIHsKKyAgICAgICAgICAgICAgICBjYWNoZS5lbXBsYWNlKHNoYWRlcktleSwgZ2VuZXJhdGVQcm9ncmFtKHNoYWRlcktleSkpOworICAgICAgICAgICAgICAgIHNoYWRlckNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQzMl90IGtleU1hc2sgPSBLZXk6OkJMRU5EX01BU0sgfCBLZXk6Ok9QQUNJVFlfTUFTSyB8IEtleTo6QUxQSEFfTUFTSyB8IEtleTo6VEVYVFVSRV9NQVNLCisgICAgICAgIHwgS2V5OjpST1VOREVEX0NPUk5FUlNfTUFTSzsKKyAgICAvLyBQcmltZSB0aGUgY2FjaGUgZm9yIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIG1hc2tzLAorICAgIC8vIGxlYXZpbmcgb2ZmIHRoZSBleHBlcmltZW50YWwgY29sb3IgbWF0cml4IG1hc2sgb3B0aW9ucy4KKworICAgIG5zZWNzX3QgdGltZUJlZm9yZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHVpbnQzMl90IGtleVZhbCA9IDA7IGtleVZhbCA8PSBrZXlNYXNrOyBrZXlWYWwrKykgeworICAgICAgICBLZXkgc2hhZGVyS2V5OworICAgICAgICBzaGFkZXJLZXkuc2V0KGtleU1hc2ssIGtleVZhbCk7CisgICAgICAgIHVpbnQzMl90IHRleCA9IHNoYWRlcktleS5nZXRUZXh0dXJlVGFyZ2V0KCk7CisgICAgICAgIGlmICh0ZXggIT0gS2V5OjpURVhUVVJFX09GRiAmJiB0ZXggIT0gS2V5OjpURVhUVVJFX0VYVCAmJiB0ZXggIT0gS2V5OjpURVhUVVJFXzJEKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FjaGUuY291bnQoc2hhZGVyS2V5KSA9PSAwKSB7CisgICAgICAgICAgICBjYWNoZS5lbXBsYWNlKHNoYWRlcktleSwgZ2VuZXJhdGVQcm9ncmFtKHNoYWRlcktleSkpOworICAgICAgICAgICAgc2hhZGVyQ291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByaW1lIGZvciBzUkdCLT5QMyBjb252ZXJzaW9uCisgICAgaWYgKHVzZUNvbG9yTWFuYWdlbWVudCkgeworICAgICAgICBLZXkgc2hhZGVyS2V5OworICAgICAgICBzaGFkZXJLZXkuc2V0KEtleTo6QkxFTkRfTUFTSyB8IEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSyB8IEtleTo6SU5QVVRfVEZfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXk6Ok9VVFBVVF9URl9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgIEtleTo6QkxFTkRfUFJFTVVMVCB8IEtleTo6T1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfT04gfCBLZXk6OklOUFVUX1RGX1NSR0IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5OjpPVVRQVVRfVEZfU1JHQik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6Ok9QQUNJVFlfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgJiAxKSA/IEtleTo6T1BBQ0lUWV9PUEFRVUUgOiBLZXk6Ok9QQUNJVFlfVFJBTlNMVUNFTlQpOworICAgICAgICAgICAgc2hhZGVyS2V5LnNldChLZXk6OkFMUEhBX01BU0ssIChpICYgMikgPyBLZXk6OkFMUEhBX0xUX09ORSA6IEtleTo6QUxQSEFfRVFfT05FKTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgcm91bmRlZCBjb3JuZXJzCisgICAgICAgICAgICBzaGFkZXJLZXkuc2V0KEtleTo6Uk9VTkRFRF9DT1JORVJTX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpICYgNCkgPyBLZXk6OlJPVU5ERURfQ09STkVSU19PTiA6IEtleTo6Uk9VTkRFRF9DT1JORVJTX09GRik7CisKKyAgICAgICAgICAgIC8vIENhY2hlIHRleHR1cmUgb2ZmIG9wdGlvbiBmb3Igd2luZG93IHRyYW5zaXRpb24KKyAgICAgICAgICAgIHNoYWRlcktleS5zZXQoS2V5OjpURVhUVVJFX01BU0ssIChpICYgOCkgPyBLZXk6OlRFWFRVUkVfRVhUIDogS2V5OjpURVhUVVJFX09GRik7CisgICAgICAgICAgICBpZiAoY2FjaGUuY291bnQoc2hhZGVyS2V5KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2FjaGUuZW1wbGFjZShzaGFkZXJLZXksIGdlbmVyYXRlUHJvZ3JhbShzaGFkZXJLZXkpKTsKKyAgICAgICAgICAgICAgICBzaGFkZXJDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbnNlY3NfdCB0aW1lQWZ0ZXIgPSBzeXN0ZW1UaW1lKCk7CisgICAgZmxvYXQgY29tcGlsZVRpbWVNcyA9IHN0YXRpY19jYXN0PGZsb2F0Pih0aW1lQWZ0ZXIgLSB0aW1lQmVmb3JlKSAvIDEuMEU2OworICAgIEFMT0dEKCJzaGFkZXIgY2FjaGUgZ2VuZXJhdGVkIC0gJXUgc2hhZGVycyBpbiAlZiBtc1xuIiwgc2hhZGVyQ291bnQsIGNvbXBpbGVUaW1lTXMpOworfQorCitQcm9ncmFtQ2FjaGU6OktleSBQcm9ncmFtQ2FjaGU6OmNvbXB1dGVLZXkoY29uc3QgRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKSB7CisgICAgS2V5IG5lZWRzOworICAgIG5lZWRzLnNldChLZXk6OlRFWFRVUkVfTUFTSywKKyAgICAgICAgICAgICAgIWRlc2NyaXB0aW9uLnRleHR1cmVFbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgPyBLZXk6OlRFWFRVUkVfT0ZGCisgICAgICAgICAgICAgICAgICAgICAgOiBkZXNjcmlwdGlvbi50ZXh0dXJlLmdldFRleHR1cmVUYXJnZXQoKSA9PSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBLZXk6OlRFWFRVUkVfRVhUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0aW9uLnRleHR1cmUuZ2V0VGV4dHVyZVRhcmdldCgpID09IEdMX1RFWFRVUkVfMkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBLZXk6OlRFWFRVUkVfMkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBLZXk6OlRFWFRVUkVfT0ZGKQorICAgICAgICAgICAgLnNldChLZXk6OkFMUEhBX01BU0ssIChkZXNjcmlwdGlvbi5jb2xvci5hIDwgMSkgPyBLZXk6OkFMUEhBX0xUX09ORSA6IEtleTo6QUxQSEFfRVFfT05FKQorICAgICAgICAgICAgLnNldChLZXk6OkJMRU5EX01BU0ssCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmlzUHJlbXVsdGlwbGllZEFscGhhID8gS2V5OjpCTEVORF9QUkVNVUxUIDogS2V5OjpCTEVORF9OT1JNQUwpCisgICAgICAgICAgICAuc2V0KEtleTo6T1BBQ0lUWV9NQVNLLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5pc09wYXF1ZSA/IEtleTo6T1BBQ0lUWV9PUEFRVUUgOiBLZXk6Ok9QQUNJVFlfVFJBTlNMVUNFTlQpCisgICAgICAgICAgICAuc2V0KEtleTo6S2V5OjpJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX01BU0ssCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmhhc0lucHV0VHJhbnNmb3JtTWF0cml4KCkgPyBLZXk6OklOUFVUX1RSQU5TRk9STV9NQVRSSVhfT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEtleTo6SU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PRkYpCisgICAgICAgICAgICAuc2V0KEtleTo6S2V5OjpPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLLAorICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5oYXNPdXRwdXRUcmFuc2Zvcm1NYXRyaXgoKSB8fCBkZXNjcmlwdGlvbi5oYXNDb2xvck1hdHJpeCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPyBLZXk6Ok9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX09OCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBLZXk6Ok9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX09GRikKKyAgICAgICAgICAgIC5zZXQoS2V5OjpST1VOREVEX0NPUk5FUlNfTUFTSywKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uY29ybmVyUmFkaXVzID4gMCA/IEtleTo6Uk9VTkRFRF9DT1JORVJTX09OIDogS2V5OjpST1VOREVEX0NPUk5FUlNfT0ZGKQorICAgICAgICAgICAgLnNldChLZXk6OlNIQURPV19NQVNLLCBkZXNjcmlwdGlvbi5kcmF3U2hhZG93cyA/IEtleTo6U0hBRE9XX09OIDogS2V5OjpTSEFET1dfT0ZGKTsKKyAgICBuZWVkcy5zZXQoS2V5OjpZNDEwX0JUMjAyMF9NQVNLLAorICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5pc1k0MTBCVDIwMjAgPyBLZXk6Olk0MTBfQlQyMDIwX09OIDogS2V5OjpZNDEwX0JUMjAyMF9PRkYpOworCisgICAgaWYgKG5lZWRzLmhhc1RyYW5zZm9ybU1hdHJpeCgpIHx8CisgICAgICAgIChkZXNjcmlwdGlvbi5pbnB1dFRyYW5zZmVyRnVuY3Rpb24gIT0gZGVzY3JpcHRpb24ub3V0cHV0VHJhbnNmZXJGdW5jdGlvbikpIHsKKyAgICAgICAgc3dpdGNoIChkZXNjcmlwdGlvbi5pbnB1dFRyYW5zZmVyRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkxJTkVBUjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbmVlZHMuc2V0KEtleTo6SU5QVVRfVEZfTUFTSywgS2V5OjpJTlBVVF9URl9MSU5FQVIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6U1JHQjoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpJTlBVVF9URl9NQVNLLCBLZXk6OklOUFVUX1RGX1NSR0IpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBEZXNjcmlwdGlvbjo6VHJhbnNmZXJGdW5jdGlvbjo6U1QyMDg0OgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6OklOUFVUX1RGX01BU0ssIEtleTo6SU5QVVRfVEZfU1QyMDg0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkhMRzoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpJTlBVVF9URl9NQVNLLCBLZXk6OklOUFVUX1RGX0hMRyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLm91dHB1dFRyYW5zZmVyRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkxJTkVBUjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbmVlZHMuc2V0KEtleTo6T1VUUFVUX1RGX01BU0ssIEtleTo6T1VUUFVUX1RGX0xJTkVBUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERlc2NyaXB0aW9uOjpUcmFuc2ZlckZ1bmN0aW9uOjpTUkdCOgorICAgICAgICAgICAgICAgIG5lZWRzLnNldChLZXk6Ok9VVFBVVF9URl9NQVNLLCBLZXk6Ok9VVFBVVF9URl9TUkdCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OlNUMjA4NDoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpPVVRQVVRfVEZfTUFTSywgS2V5OjpPVVRQVVRfVEZfU1QyMDg0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRGVzY3JpcHRpb246OlRyYW5zZmVyRnVuY3Rpb246OkhMRzoKKyAgICAgICAgICAgICAgICBuZWVkcy5zZXQoS2V5OjpPVVRQVVRfVEZfTUFTSywgS2V5OjpPVVRQVVRfVEZfSExHKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZWVkczsKK30KKworLy8gR2VuZXJhdGUgRU9URiB0aGF0IGNvbnZlcnRzIHNpZ25hbCB2YWx1ZXMgdG8gcmVsYXRpdmUgZGlzcGxheSBsaWdodCwKKy8vIGJvdGggbm9ybWFsaXplZCB0byBbMCwgMV0uCit2b2lkIFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVFT1RGKEZvcm1hdHRlciYgZnMsIGNvbnN0IEtleSYgbmVlZHMpIHsKKyAgICBzd2l0Y2ggKG5lZWRzLmdldElucHV0VEYoKSkgeworICAgICAgICBjYXNlIEtleTo6SU5QVVRfVEZfU1JHQjoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBmbG9hdCBFT1RGX3NSR0IoZmxvYXQgc3JnYikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3JnYiA8PSAwLjA0MDQ1ID8gc3JnYiAvIDEyLjkyIDogcG93KChzcmdiICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmVjMyBFT1RGX3NSR0IoY29uc3QgdmVjMyBzcmdiKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzKEVPVEZfc1JHQihzcmdiLnIpLCBFT1RGX3NSR0Ioc3JnYi5nKSwgRU9URl9zUkdCKHNyZ2IuYikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlYzMgRU9URihjb25zdCB2ZWMzIHNyZ2IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24oc3JnYi5yZ2IpICogRU9URl9zUkdCKGFicyhzcmdiLnJnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleTo6SU5QVVRfVEZfU1QyMDg0OgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIHZlYzMgRU9URihjb25zdCBoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IG0xID0gKDI2MTAuMCAvIDQwOTYuMCkgLyA0LjA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IG0yID0gKDI1MjMuMCAvIDQwOTYuMCkgKiAxMjguMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYzEgPSAoMzQyNC4wIC8gNDA5Ni4wKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYzIgPSAoMjQxMy4wIC8gNDA5Ni4wKSAqIDMyLjA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGMzID0gKDIzOTIuMCAvIDQwOTYuMCkgKiAzMi4wOworCisgICAgICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgdG1wID0gcG93KGNsYW1wKGNvbG9yLCAwLjAsIDEuMCksIDEuMCAvIHZlYzMobTIpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbWF4KHRtcCAtIGMxLCAwLjApIC8gKGMyIC0gYzMgKiB0bXApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG93KHRtcCwgMS4wIC8gdmVjMyhtMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleTo6SU5QVVRfVEZfSExHOgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIGZsb2F0IEVPVEZfY2hhbm5lbChjb25zdCBoaWdocCBmbG9hdCBjaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAwLjE3ODgzMjc3OworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBiID0gMC4yODQ2Njg5MjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYyA9IDAuNTU5OTEwNzM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsIDw9IDAuNSA/IGNoYW5uZWwgKiBjaGFubmVsIC8gMy4wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwKChjaGFubmVsIC0gYykgLyBhKSArIGIpIC8gMTIuMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2ZWMzIEVPVEYoY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVjMyhFT1RGX2NoYW5uZWwoY29sb3IuciksIEVPVEZfY2hhbm5lbChjb2xvci5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFT1RGX2NoYW5uZWwoY29sb3IuYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIHZlYzMgRU9URihjb25zdCB2ZWMzIGxpbmVhcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZWFyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OmdlbmVyYXRlVG9uZU1hcHBpbmdQcm9jZXNzKEZvcm1hdHRlciYgZnMsIGNvbnN0IEtleSYgbmVlZHMpIHsKKyAgICAvLyBDb252ZXJ0IHJlbGF0aXZlIGxpZ2h0IHRvIGFic29sdXRlIGxpZ2h0LgorICAgIHN3aXRjaCAobmVlZHMuZ2V0SW5wdXRURigpKSB7CisgICAgICAgIGNhc2UgS2V5OjpJTlBVVF9URl9TVDIwODQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBTY2FsZUx1bWluYW5jZShoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIDEwMDAwLjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5OjpJTlBVVF9URl9ITEc6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBTY2FsZUx1bWluYW5jZShoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmb3JtdWxhIGlzOgorICAgICAgICAgICAgICAgICAgICAvLyBhbHBoYSAqIHBvdyhZLCBnYW1tYSAtIDEuMCkgKiBjb2xvciArIGJldGE7CisgICAgICAgICAgICAgICAgICAgIC8vIHdoZXJlIGFscGhhIGlzIDEwMDAuMCwgZ2FtbWEgaXMgMS4yLCBiZXRhIGlzIDAuMC4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yICogMTAwMC4wICogcG93KGNvbG9yLnksIDAuMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBTY2FsZUx1bWluYW5jZShoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIGRpc3BsYXlNYXhMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gVG9uZSBtYXAgYWJzb2x1dGUgbGlnaHQgdG8gZGlzcGxheSBsdW1pbmFuY2UgcmFuZ2UuCisgICAgc3dpdGNoIChuZWVkcy5nZXRJbnB1dFRGKCkpIHsKKyAgICAgICAgY2FzZSBLZXk6OklOUFVUX1RGX1NUMjA4NDoKKyAgICAgICAgY2FzZSBLZXk6OklOUFVUX1RGX0hMRzoKKyAgICAgICAgICAgIHN3aXRjaCAobmVlZHMuZ2V0T3V0cHV0VEYoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfSExHOgorICAgICAgICAgICAgICAgICAgICAvLyBSaWdodCBub3cgd2hlbiBtaXhlZCBQUSBhbmQgSExHIGNvbnRlbnRzIGFyZSBwcmVzZW50ZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIEhMRyBjb250ZW50IHdpbGwgYWx3YXlzIGJlIGNvbnZlcnRlZCB0byBQUS4gSG93ZXZlciwgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXRlbmVzcywgd2Ugc2ltcGx5IGNsYW1wIHRoZSB2YWx1ZSB0byBbMC4wLCAxMDAwLjBdLgorICAgICAgICAgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFRvbmVNYXAoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChjb2xvciwgMC4wLCAxMDAwLjApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfU1QyMDg0OgorICAgICAgICAgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFRvbmVNYXAoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIFRvbmVNYXAoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heE1hc3RlcmluZ0x1bWkgPSBtYXhNYXN0ZXJpbmdMdW1pbmFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4Q29udGVudEx1bWkgPSBtYXhDb250ZW50THVtaW5hbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heEluTHVtaSA9IG1pbihtYXhNYXN0ZXJpbmdMdW1pLCBtYXhDb250ZW50THVtaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4T3V0THVtaSA9IGRpc3BsYXlNYXhMdW1pbmFuY2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBuaXRzID0gY29sb3IueTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYW1wIHRvIG1heCBpbnB1dCBsdW1pbmFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXRzID0gY2xhbXAobml0cywgMC4wLCBtYXhJbkx1bWkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgWzAuMCwgbWF4SW5MdW1pXSB0byBbMC4wLCBtYXhPdXRMdW1pXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXhJbkx1bWkgPD0gbWF4T3V0THVtaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgKiAobWF4T3V0THVtaSAvIG1heEluTHVtaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgY29udHJvbCBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgeDAgPSAxMC4wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB5MCA9IDE3LjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgxID0gbWF4T3V0THVtaSAqIDAuNzU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkxID0geDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyID0geDEgKyAobWF4SW5MdW1pIC0geDEpIC8gMi4wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MiA9IHkxICsgKG1heE91dEx1bWkgLSB5MSkgKiAwLjc1OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhvcml6b250YWwgZGlzdGFuY2VzIGJldHdlZW4gdGhlIGxhc3QgdGhyZWUgY29udHJvbCBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDEyID0geDIgLSB4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaDIzID0gbWF4SW5MdW1pIC0geDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhbmdlbnRzIGF0IHRoZSBsYXN0IHRocmVlIGNvbnRyb2wgcG9pbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG0xID0gKHkyIC0geTEpIC8gaDEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtMyA9IChtYXhPdXRMdW1pIC0geTIpIC8gaDIzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtMiA9IChtMSArIG0zKSAvIDIuMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobml0cyA8IHgwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBbMC4wLCB4MF0gdG8gWzAuMCwgeTBdIGxpbmVhcmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzbG9wZSA9IHkwIC8geDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgKiBzbG9wZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuaXRzIDwgeDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFt4MCwgeDFdIHRvIFt5MCwgeTFdIGxpbmVhcmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzbG9wZSA9ICh5MSAtIHkwKSAvICh4MSAtIHgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pdHMgPSB5MCArIChuaXRzIC0geDApICogc2xvcGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobml0cyA8IHgyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBbeDEsIHgyXSB0byBbeTEsIHkyXSB1c2luZyBIZXJtaXRlIGludGVycAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdCA9IChuaXRzIC0geDEpIC8gaDEyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbml0cyA9ICh5MSAqICgxLjAgKyAyLjAgKiB0KSArIGgxMiAqIG0xICogdCkgKiAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeTIgKiAoMy4wIC0gMi4wICogdCkgKyBoMTIgKiBtMiAqICh0IC0gMS4wKSkgKiB0ICogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFt4MiwgbWF4SW5MdW1pXSB0byBbeTIsIG1heE91dEx1bWldIHVzaW5nIEhlcm1pdGUgaW50ZXJwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ID0gKG5pdHMgLSB4MikgLyBoMjM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXRzID0gKHkyICogKDEuMCArIDIuMCAqIHQpICsgaDIzICogbTIgKiB0KSAqICgxLjAgLSB0KSAqICgxLjAgLSB0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhPdXRMdW1pICogKDMuMCAtIDIuMCAqIHQpICsgaDIzICogbTMgKiAodCAtIDEuMCkpICogdCAqIHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvci55IGlzIGdyZWF0ZXIgdGhhbiB4MCBhbmQgaXMgdGh1cyBub24temVybworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIChuaXRzIC8gY29sb3IueSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIGludmVyc2UgdG9uZSBtYXA7IHRoZSBvdXRwdXQgbHVtaW5hbmNlIGNhbiBiZSB1cCB0byBtYXhPdXRMdW1pLgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgVG9uZU1hcChoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG1heE91dEx1bWkgPSAzMDAwLjA7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgeDAgPSA1LjA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHkwID0gMi41OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MSA9IGRpc3BsYXlNYXhMdW1pbmFuY2UgKiAwLjc7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkxID0gbWF4T3V0THVtaSAqIDAuMTU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyID0gZGlzcGxheU1heEx1bWluYW5jZSAqIDAuOTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTIgPSBtYXhPdXRMdW1pICogMC40NTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMgPSBkaXNwbGF5TWF4THVtaW5hbmNlOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MyA9IG1heE91dEx1bWk7CisKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYzEgPSB5MSAvIDMuMDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYzIgPSB5MiAvIDIuMDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYzMgPSB5MyAvIDEuNTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBuaXRzID0gY29sb3IueTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5pdHMgPD0geDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFswLjAsIHgwXSB0byBbMC4wLCB5MF0gbGluZWFybHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNsb3BlID0geTAgLyB4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvciAqIHNsb3BlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5pdHMgPD0geDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFt4MCwgeDFdIHRvIFt5MCwgeTFdIHVzaW5nIGEgY3VydmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQgPSAobml0cyAtIHgwKSAvICh4MSAtIHgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pdHMgPSAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB5MCArIDIuMCAqICgxLjAgLSB0KSAqIHQgKiBjMSArIHQgKiB0ICogeTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobml0cyA8PSB4MikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NhbGUgW3gxLCB4Ml0gdG8gW3kxLCB5Ml0gdXNpbmcgYSBjdXJ2ZQorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdCA9IChuaXRzIC0geDEpIC8gKHgyIC0geDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbml0cyA9ICgxLjAgLSB0KSAqICgxLjAgLSB0KSAqIHkxICsgMi4wICogKDEuMCAtIHQpICogdCAqIGMyICsgdCAqIHQgKiB5MjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxlIFt4MiwgeDNdIHRvIFt5MiwgeTNdIHVzaW5nIGEgY3VydmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQgPSAobml0cyAtIHgyKSAvICh4MyAtIHgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5pdHMgPSAoMS4wIC0gdCkgKiAoMS4wIC0gdCkgKiB5MiArIDIuMCAqICgxLjAgLSB0KSAqIHQgKiBjMyArIHQgKiB0ICogeTM7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjb2xvci55IGlzIGdyZWF0ZXIgdGhhbiB4MCBhbmQgaXMgdGh1cyBub24temVybworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgKiAobml0cyAvIGNvbG9yLnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGNvbnZlcnQgYWJzb2x1dGUgbGlnaHQgdG8gcmVsYXRpdmUgbGlnaHQuCisgICAgc3dpdGNoIChuZWVkcy5nZXRPdXRwdXRURigpKSB7CisgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfU1QyMDg0OgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgTm9ybWFsaXplTHVtaW5hbmNlKGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yIC8gMTAwMDAuMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXk6Ok9VVFBVVF9URl9ITEc6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBOb3JtYWxpemVMdW1pbmFuY2UoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgLyAxMDAwLjAgKiBwb3coY29sb3IueSAvIDEwMDAuMCwgLTAuMiAvIDEuMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBOb3JtYWxpemVMdW1pbmFuY2UoaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3IgLyBkaXNwbGF5TWF4THVtaW5hbmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gR2VuZXJhdGUgT09URiB0aGF0IG1vZGlmaWVzIHRoZSByZWxhdGl2ZSBzY2VuY2UgbGlnaHQgdG8gcmVsYXRpdmUgZGlzcGxheSBsaWdodC4KK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZU9PVEYoRm9ybWF0dGVyJiBmcywgY29uc3QgUHJvZ3JhbUNhY2hlOjpLZXkmIG5lZWRzKSB7CisgICAgaWYgKCFuZWVkcy5uZWVkc1RvbmVNYXBwaW5nKCkpIHsKKyAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgaGlnaHAgdmVjMyBPT1RGKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CisgICAgICAgICAgICB9CisgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0ZVRvbmVNYXBwaW5nUHJvY2VzcyhmcywgbmVlZHMpOworICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICBoaWdocCB2ZWMzIE9PVEYoY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemVMdW1pbmFuY2UoVG9uZU1hcChTY2FsZUx1bWluYW5jZShjb2xvcikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKV9fU0hBREVSX18iOworICAgIH0KK30KKworLy8gR2VuZXJhdGUgT0VURiB0aGF0IGNvbnZlcnRzIHJlbGF0aXZlIGRpc3BsYXkgbGlnaHQgdG8gc2lnbmFsIHZhbHVlcywKKy8vIGJvdGggbm9ybWFsaXplZCB0byBbMCwgMV0KK3ZvaWQgUHJvZ3JhbUNhY2hlOjpnZW5lcmF0ZU9FVEYoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcykgeworICAgIHN3aXRjaCAobmVlZHMuZ2V0T3V0cHV0VEYoKSkgeworICAgICAgICBjYXNlIEtleTo6T1VUUFVUX1RGX1NSR0I6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgZmxvYXQgT0VURl9zUkdCKGNvbnN0IGZsb2F0IGxpbmVhcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZWFyIDw9IDAuMDAzMTMwOCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWFyICogMTIuOTIgOiAocG93KGxpbmVhciwgMS4wIC8gMi40KSAqIDEuMDU1KSAtIDAuMDU1OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlYzMgT0VURl9zUkdCKGNvbnN0IHZlYzMgbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzKE9FVEZfc1JHQihsaW5lYXIuciksIE9FVEZfc1JHQihsaW5lYXIuZyksIE9FVEZfc1JHQihsaW5lYXIuYikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlYzMgT0VURihjb25zdCB2ZWMzIGxpbmVhcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbihsaW5lYXIucmdiKSAqIE9FVEZfc1JHQihhYnMobGluZWFyLnJnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleTo6T1VUUFVUX1RGX1NUMjA4NDoKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICB2ZWMzIE9FVEYoY29uc3QgdmVjMyBsaW5lYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgbTEgPSAoMjYxMC4wIC8gNDA5Ni4wKSAvIDQuMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgbTIgPSAoMjUyMy4wIC8gNDA5Ni4wKSAqIDEyOC4wOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjMSA9ICgzNDI0LjAgLyA0MDk2LjApOworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBjMiA9ICgyNDEzLjAgLyA0MDk2LjApICogMzIuMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYzMgPSAoMjM5Mi4wIC8gNDA5Ni4wKSAqIDMyLjA7CisKKyAgICAgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyB0bXAgPSBwb3cobGluZWFyLCB2ZWMzKG0xKSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IChjMSArIGMyICogdG1wKSAvICgxLjAgKyBjMyAqIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3codG1wLCB2ZWMzKG0yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5OjpPVVRQVVRfVEZfSExHOgorICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIGZsb2F0IE9FVEZfY2hhbm5lbChjb25zdCBoaWdocCBmbG9hdCBjaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAwLjE3ODgzMjc3OworICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWdocCBmbG9hdCBiID0gMC4yODQ2Njg5MjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaHAgZmxvYXQgYyA9IDAuNTU5OTEwNzM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsIDw9IDEuMCAvIDEyLjAgPyBzcXJ0KDMuMCAqIGNoYW5uZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICogbG9nKDEyLjAgKiBjaGFubmVsIC0gYikgKyBjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZlYzMgT0VURihjb25zdCBoaWdocCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZWMzKE9FVEZfY2hhbm5lbChjb2xvci5yKSwgT0VURl9jaGFubmVsKGNvbG9yLmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9FVEZfY2hhbm5lbChjb2xvci5iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgdmVjMyBPRVRGKGNvbnN0IHZlYzMgbGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lYXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgS2V5JiBuZWVkcykgeworICAgIEZvcm1hdHRlciB2czsKKyAgICBpZiAobmVlZHMuaGFzVGV4dHVyZUNvb3JkcygpKSB7CisgICAgICAgIHZzIDw8ICJhdHRyaWJ1dGUgdmVjNCB0ZXhDb29yZHM7IgorICAgICAgICAgICA8PCAidmFyeWluZyB2ZWMyIG91dFRleENvb3JkczsiOworICAgIH0KKyAgICBpZiAobmVlZHMuaGFzUm91bmRlZENvcm5lcnMoKSkgeworICAgICAgICB2cyA8PCAiYXR0cmlidXRlIGxvd3AgdmVjNCBjcm9wQ29vcmRzOyI7CisgICAgICAgIHZzIDw8ICJ2YXJ5aW5nIGxvd3AgdmVjMiBvdXRDcm9wQ29vcmRzOyI7CisgICAgfQorICAgIGlmIChuZWVkcy5kcmF3U2hhZG93cygpKSB7CisgICAgICAgIHZzIDw8ICJhdHRyaWJ1dGUgbG93cCB2ZWM0IHNoYWRvd0NvbG9yOyI7CisgICAgICAgIHZzIDw8ICJ2YXJ5aW5nIGxvd3AgdmVjNCBvdXRTaGFkb3dDb2xvcjsiOworICAgICAgICB2cyA8PCAiYXR0cmlidXRlIGxvd3AgdmVjNCBzaGFkb3dQYXJhbXM7IjsKKyAgICAgICAgdnMgPDwgInZhcnlpbmcgbG93cCB2ZWMzIG91dFNoYWRvd1BhcmFtczsiOworICAgIH0KKyAgICB2cyA8PCAiYXR0cmlidXRlIHZlYzQgcG9zaXRpb247IgorICAgICAgIDw8ICJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbjsiCisgICAgICAgPDwgInVuaWZvcm0gbWF0NCB0ZXh0dXJlOyIKKyAgICAgICA8PCAidm9pZCBtYWluKHZvaWQpIHsiIDw8IGluZGVudCA8PCAiZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogcG9zaXRpb247IjsKKyAgICBpZiAobmVlZHMuaGFzVGV4dHVyZUNvb3JkcygpKSB7CisgICAgICAgIHZzIDw8ICJvdXRUZXhDb29yZHMgPSAodGV4dHVyZSAqIHRleENvb3Jkcykuc3Q7IjsKKyAgICB9CisgICAgaWYgKG5lZWRzLmhhc1JvdW5kZWRDb3JuZXJzKCkpIHsKKyAgICAgICAgdnMgPDwgIm91dENyb3BDb29yZHMgPSBjcm9wQ29vcmRzLnN0OyI7CisgICAgfQorICAgIGlmIChuZWVkcy5kcmF3U2hhZG93cygpKSB7CisgICAgICAgIHZzIDw8ICJvdXRTaGFkb3dDb2xvciA9IHNoYWRvd0NvbG9yOyI7CisgICAgICAgIHZzIDw8ICJvdXRTaGFkb3dQYXJhbXMgPSBzaGFkb3dQYXJhbXMueHl6OyI7CisgICAgfQorICAgIHZzIDw8IGRlZGVudCA8PCAifSI7CisgICAgcmV0dXJuIHZzLmdldFN0cmluZygpOworfQorCitTdHJpbmc4IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVGcmFnbWVudFNoYWRlcihjb25zdCBLZXkmIG5lZWRzKSB7CisgICAgRm9ybWF0dGVyIGZzOworICAgIGlmIChuZWVkcy5nZXRUZXh0dXJlVGFyZ2V0KCkgPT0gS2V5OjpURVhUVVJFX0VYVCkgeworICAgICAgICBmcyA8PCAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZSI7CisgICAgfQorCisgICAgLy8gZGVmYXVsdCBwcmVjaXNpb24gaXMgcmVxdWlyZWQtaXNoIGluIGZyYWdtZW50IHNoYWRlcnMKKyAgICBmcyA8PCAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7IjsKKworICAgIGlmIChuZWVkcy5nZXRUZXh0dXJlVGFyZ2V0KCkgPT0gS2V5OjpURVhUVVJFX0VYVCkgeworICAgICAgICBmcyA8PCAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgc2FtcGxlcjsiOworICAgIH0gZWxzZSBpZiAobmVlZHMuZ2V0VGV4dHVyZVRhcmdldCgpID09IEtleTo6VEVYVFVSRV8yRCkgeworICAgICAgICBmcyA8PCAidW5pZm9ybSBzYW1wbGVyMkQgc2FtcGxlcjsiOworICAgIH0KKworICAgIGlmIChuZWVkcy5oYXNUZXh0dXJlQ29vcmRzKCkpIHsKKyAgICAgICAgZnMgPDwgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7IjsKKyAgICB9CisKKyAgICBpZiAobmVlZHMuaGFzUm91bmRlZENvcm5lcnMoKSkgeworICAgICAgICAvLyBSb3VuZGVkIGNvcm5lcnMgaW1wbGVtZW50YXRpb24gdXNpbmcgYSBzaWduZWQgZGlzdGFuY2UgZnVuY3Rpb24uCisgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgIHVuaWZvcm0gZmxvYXQgY29ybmVyUmFkaXVzOworICAgICAgICAgICAgdW5pZm9ybSB2ZWMyIGNyb3BDZW50ZXI7CisgICAgICAgICAgICB2YXJ5aW5nIHZlYzIgb3V0Q3JvcENvb3JkczsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBjdXJyZW50IGNyb3AgY29vcmRpbmF0ZXMgYW5kIGNhbGN1bGF0ZXMgYW4gYWxwaGEgdmFsdWUgYmFzZWQKKyAgICAgICAgICAgICAqIG9uIHRoZSBjb3JuZXIgcmFkaXVzIGFuZCBkaXN0YW5jZSBmcm9tIHRoZSBjcm9wIGNlbnRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmxvYXQgYXBwbHlDb3JuZXJSYWRpdXModmVjMiBjcm9wQ29vcmRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlYzIgcG9zaXRpb24gPSBjcm9wQ29vcmRzIC0gY3JvcENlbnRlcjsKKyAgICAgICAgICAgICAgICAvLyBTY2FsZSBkb3duIHRoZSBkaXN0IHZlY3RvciBoZXJlLCBhcyBvdGhlcndpc2UgbGFyZ2UgY29ybmVyCisgICAgICAgICAgICAgICAgLy8gcmFkaWkgY2FuIGNhdXNlIGZsb2F0aW5nIHBvaW50IGlzc3VlcyB3aGVuIGNvbXB1dGluZyB0aGUgbm9ybQorICAgICAgICAgICAgICAgIHZlYzIgZGlzdCA9IChhYnMocG9zaXRpb24pIC0gY3JvcENlbnRlciArIHZlYzIoY29ybmVyUmFkaXVzKSkgLyAxNi4wOworICAgICAgICAgICAgICAgIC8vIE9uY2Ugd2UndmUgZm91bmQgdGhlIG5vcm0sIHRoZW4gc2NhbGUgYmFjayB1cC4KKyAgICAgICAgICAgICAgICBmbG9hdCBwbGFuZSA9IGxlbmd0aChtYXgoZGlzdCwgdmVjMigwLjApKSkgKiAxNi4wOworICAgICAgICAgICAgICAgIHJldHVybiAxLjAgLSBjbGFtcChwbGFuZSAtIGNvcm5lclJhZGl1cywgMC4wLCAxLjApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgIH0KKworICAgIGlmIChuZWVkcy5kcmF3U2hhZG93cygpKSB7CisgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgIHZhcnlpbmcgbG93cCB2ZWM0IG91dFNoYWRvd0NvbG9yOworICAgICAgICAgICAgdmFyeWluZyBsb3dwIHZlYzMgb3V0U2hhZG93UGFyYW1zOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFJldHVybnMgdGhlIHNoYWRvdyBjb2xvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdmVjNCBnZXRTaGFkb3dDb2xvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG93cCBmbG9hdCBkID0gbGVuZ3RoKG91dFNoYWRvd1BhcmFtcy54eSk7CisgICAgICAgICAgICAgICAgdmVjMiB1diA9IHZlYzIob3V0U2hhZG93UGFyYW1zLnogKiAoMS4wIC0gZCksIDAuNSk7CisgICAgICAgICAgICAgICAgbG93cCBmbG9hdCBmYWN0b3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgdXYpLmE7CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dFNoYWRvd0NvbG9yICogZmFjdG9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgIH0KKworICAgIGlmIChuZWVkcy5nZXRUZXh0dXJlVGFyZ2V0KCkgPT0gS2V5OjpURVhUVVJFX09GRiB8fCBuZWVkcy5oYXNBbHBoYSgpKSB7CisgICAgICAgIGZzIDw8ICJ1bmlmb3JtIHZlYzQgY29sb3I7IjsKKyAgICB9CisKKyAgICBpZiAobmVlZHMuaXNZNDEwQlQyMDIwKCkpIHsKKyAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgdmVjMyBjb252ZXJ0WTQxMEJUMjAyMChjb25zdCB2ZWMzIGNvbG9yKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdmVjMyBvZmZzZXQgPSB2ZWMzKDAuMDYyNSwgMC41LCAwLjUpOworICAgICAgICAgICAgICAgIGNvbnN0IG1hdDMgdHJhbnNmb3JtID0gbWF0MygKKyAgICAgICAgICAgICAgICAgICAgdmVjMygxLjE2NzgsICAxLjE2NzgsIDEuMTY3OCksCisgICAgICAgICAgICAgICAgICAgIHZlYzMoICAgMC4wLCAtMC4xODc4LCAyLjE0ODEpLAorICAgICAgICAgICAgICAgICAgICB2ZWMzKDEuNjgzNiwgLTAuNjUyMywgICAwLjApKTsKKyAgICAgICAgICAgICAgICAvLyBZIGlzIGluIEcsIFUgaXMgaW4gUiwgYW5kIFYgaXMgaW4gQgorICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcCh0cmFuc2Zvcm0gKiAoY29sb3IuZ3JiIC0gb2Zmc2V0KSwgMC4wLCAxLjApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKV9fU0hBREVSX18iOworICAgIH0KKworICAgIGlmIChuZWVkcy5oYXNUcmFuc2Zvcm1NYXRyaXgoKSB8fCAobmVlZHMuZ2V0SW5wdXRURigpICE9IG5lZWRzLmdldE91dHB1dFRGKCkpKSB7CisgICAgICAgIGlmIChuZWVkcy5uZWVkc1RvbmVNYXBwaW5nKCkpIHsKKyAgICAgICAgICAgIGZzIDw8ICJ1bmlmb3JtIGZsb2F0IGRpc3BsYXlNYXhMdW1pbmFuY2U7IjsKKyAgICAgICAgICAgIGZzIDw8ICJ1bmlmb3JtIGZsb2F0IG1heE1hc3RlcmluZ0x1bWluYW5jZTsiOworICAgICAgICAgICAgZnMgPDwgInVuaWZvcm0gZmxvYXQgbWF4Q29udGVudEx1bWluYW5jZTsiOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5lZWRzLmhhc0lucHV0VHJhbnNmb3JtTWF0cml4KCkpIHsKKyAgICAgICAgICAgIGZzIDw8ICJ1bmlmb3JtIG1hdDQgaW5wdXRUcmFuc2Zvcm1NYXRyaXg7IjsKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIElucHV0VHJhbnNmb3JtKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKHZlYzMoaW5wdXRUcmFuc2Zvcm1NYXRyaXggKiB2ZWM0KGNvbG9yLCAxLjApKSwgMC4wLCAxLjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZzIDw8IFIiX19TSEFERVJfXygKKyAgICAgICAgICAgICAgICBoaWdocCB2ZWMzIElucHV0VHJhbnNmb3JtKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIClfX1NIQURFUl9fIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGEgd2lkZXIgY29sb3JzcGFjZSB0byBhIG5hcnJvd2VyIG9uZSBjYW4KKyAgICAgICAgLy8gcmVzdWx0IGluID4xLjAgb3IgPDAuMCBwaXhlbCB2YWx1ZXMKKyAgICAgICAgaWYgKG5lZWRzLmhhc091dHB1dFRyYW5zZm9ybU1hdHJpeCgpKSB7CisgICAgICAgICAgICBmcyA8PCAidW5pZm9ybSBtYXQ0IG91dHB1dFRyYW5zZm9ybU1hdHJpeDsiOworICAgICAgICAgICAgZnMgPDwgUiJfX1NIQURFUl9fKAorICAgICAgICAgICAgICAgIGhpZ2hwIHZlYzMgT3V0cHV0VHJhbnNmb3JtKGNvbnN0IGhpZ2hwIHZlYzMgY29sb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYW1wKHZlYzMob3V0cHV0VHJhbnNmb3JtTWF0cml4ICogdmVjNChjb2xvciwgMS4wKSksIDAuMCwgMS4wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcyA8PCBSIl9fU0hBREVSX18oCisgICAgICAgICAgICAgICAgaGlnaHAgdmVjMyBPdXRwdXRUcmFuc2Zvcm0oY29uc3QgaGlnaHAgdmVjMyBjb2xvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoY29sb3IsIDAuMCwgMS4wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApX19TSEFERVJfXyI7CisgICAgICAgIH0KKworICAgICAgICBnZW5lcmF0ZUVPVEYoZnMsIG5lZWRzKTsKKyAgICAgICAgZ2VuZXJhdGVPT1RGKGZzLCBuZWVkcyk7CisgICAgICAgIGdlbmVyYXRlT0VURihmcywgbmVlZHMpOworICAgIH0KKworICAgIGZzIDw8ICJ2b2lkIG1haW4odm9pZCkgeyIgPDwgaW5kZW50OworICAgIGlmIChuZWVkcy5kcmF3U2hhZG93cygpKSB7CisgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IgPSBnZXRTaGFkb3dDb2xvcigpOyI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5lZWRzLmlzVGV4dHVyaW5nKCkpIHsKKyAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc2FtcGxlciwgb3V0VGV4Q29vcmRzKTsiOworICAgICAgICAgICAgaWYgKG5lZWRzLmlzWTQxMEJUMjAyMCgpKSB7CisgICAgICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5yZ2IgPSBjb252ZXJ0WTQxMEJUMjAyMChnbF9GcmFnQ29sb3IucmdiKTsiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5yZ2IgPSBjb2xvci5yZ2I7IjsKKyAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IuYSA9IDEuMDsiOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkcy5pc09wYXF1ZSgpKSB7CisgICAgICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yLmEgPSAxLjA7IjsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHMuaGFzQWxwaGEoKSkgeworICAgICAgICAgICAgLy8gbW9kdWxhdGUgdGhlIGN1cnJlbnQgYWxwaGEgdmFsdWUgd2l0aCBhbHBoYSBzZXQKKyAgICAgICAgICAgIGlmIChuZWVkcy5pc1ByZW11bHRpcGxpZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgdGhlIGNvbG9yIHRvbyBpZiB3ZSdyZSBwcmVtdWx0aXBsaWVkCisgICAgICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvciAqPSBjb2xvci5hOyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IuYSAqPSBjb2xvci5hOyI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZHMuaGFzVHJhbnNmb3JtTWF0cml4KCkgfHwgKG5lZWRzLmdldElucHV0VEYoKSAhPSBuZWVkcy5nZXRPdXRwdXRURigpKSkgeworICAgICAgICBpZiAoIW5lZWRzLmlzT3BhcXVlKCkgJiYgbmVlZHMuaXNQcmVtdWx0aXBsaWVkKCkpIHsKKyAgICAgICAgICAgIC8vIHVuLXByZW11bHRpcGx5IGlmIG5lZWRlZCBiZWZvcmUgbGluZWFyaXphdGlvbgorICAgICAgICAgICAgLy8gYXZvaWQgZGl2aWRlIGJ5IDAgYnkgYWRkaW5nIDAuNS8yNTYgdG8gdGhlIGFscGhhIGNoYW5uZWwKKyAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IucmdiID0gZ2xfRnJhZ0NvbG9yLnJnYiAvIChnbF9GcmFnQ29sb3IuYSArIDAuMDAxOSk7IjsKKyAgICAgICAgfQorICAgICAgICBmcyA8PCAiZ2xfRnJhZ0NvbG9yLnJnYiA9ICIKKyAgICAgICAgICAgICAgIk9FVEYoT3V0cHV0VHJhbnNmb3JtKE9PVEYoSW5wdXRUcmFuc2Zvcm0oRU9URihnbF9GcmFnQ29sb3IucmdiKSkpKSk7IjsKKyAgICAgICAgaWYgKCFuZWVkcy5pc09wYXF1ZSgpICYmIG5lZWRzLmlzUHJlbXVsdGlwbGllZCgpKSB7CisgICAgICAgICAgICAvLyBhbmQgcmUtcHJlbXVsdGlwbHkgaWYgbmVlZGVkIGFmdGVyIGdhbW1hIGNvcnJlY3Rpb24KKyAgICAgICAgICAgIGZzIDw8ICJnbF9GcmFnQ29sb3IucmdiID0gZ2xfRnJhZ0NvbG9yLnJnYiAqIChnbF9GcmFnQ29sb3IuYSArIDAuMDAxOSk7IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZWVkcy5oYXNSb3VuZGVkQ29ybmVycygpKSB7CisgICAgICAgIGlmIChuZWVkcy5pc1ByZW11bHRpcGxpZWQoKSkgeworICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvciAqPSB2ZWM0KGFwcGx5Q29ybmVyUmFkaXVzKG91dENyb3BDb29yZHMpKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnMgPDwgImdsX0ZyYWdDb2xvci5hICo9IGFwcGx5Q29ybmVyUmFkaXVzKG91dENyb3BDb29yZHMpOyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcyA8PCBkZWRlbnQgPDwgIn0iOworICAgIHJldHVybiBmcy5nZXRTdHJpbmcoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IFByb2dyYW1DYWNoZTo6Z2VuZXJhdGVQcm9ncmFtKGNvbnN0IEtleSYgbmVlZHMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgLy8gdmVydGV4IHNoYWRlcgorICAgIFN0cmluZzggdnMgPSBnZW5lcmF0ZVZlcnRleFNoYWRlcihuZWVkcyk7CisKKyAgICAvLyBmcmFnbWVudCBzaGFkZXIKKyAgICBTdHJpbmc4IGZzID0gZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihuZWVkcyk7CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxQcm9ncmFtPihuZWVkcywgdnMuc3RyaW5nKCksIGZzLnN0cmluZygpKTsKK30KKwordm9pZCBQcm9ncmFtQ2FjaGU6OnVzZVByb2dyYW0oRUdMQ29udGV4dCBjb250ZXh0LCBjb25zdCBEZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pIHsKKyAgICAvLyBnZW5lcmF0ZSB0aGUga2V5IGZvciB0aGUgc2hhZGVyIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbgorICAgIEtleSBuZWVkcyhjb21wdXRlS2V5KGRlc2NyaXB0aW9uKSk7CisKKyAgICAvLyBsb29rLXVwIHRoZSBwcm9ncmFtIGluIHRoZSBjYWNoZQorICAgIGF1dG8mIGNhY2hlID0gbUNhY2hlc1tjb250ZXh0XTsKKyAgICBhdXRvIGl0ID0gY2FjaGUuZmluZChuZWVkcyk7CisgICAgaWYgKGl0ID09IGNhY2hlLmVuZCgpKSB7CisgICAgICAgIC8vIHdlIGRpZG4ndCBmaW5kIG91ciBwcm9ncmFtLCBzbyBnZW5lcmF0ZSBvbmUuLi4KKyAgICAgICAgbnNlY3NfdCB0aW1lID0gc3lzdGVtVGltZSgpOworICAgICAgICBpdCA9IGNhY2hlLmVtcGxhY2UobmVlZHMsIGdlbmVyYXRlUHJvZ3JhbShuZWVkcykpLmZpcnN0OworICAgICAgICB0aW1lID0gc3lzdGVtVGltZSgpIC0gdGltZTsKKworICAgICAgICBBTE9HVigiPj4+IGdlbmVyYXRlZCBuZXcgcHJvZ3JhbSBmb3IgY29udGV4dCAlcDogbmVlZHM9JTA4WCwgdGltZT0ldSBtcyAoJXp1IHByb2dyYW1zKSIsCisgICAgICAgICAgICAgIGNvbnRleHQsIG5lZWRzLm1LZXksIHVpbnQzMl90KG5zMm1zKHRpbWUpKSwgY2FjaGUuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBoZXJlIHdlIGhhdmUgYSBzdWl0YWJsZSBwcm9ncmFtIGZvciB0aGlzIGRlc2NyaXB0aW9uCisgICAgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+JiBwcm9ncmFtID0gaXQtPnNlY29uZDsKKyAgICBpZiAocHJvZ3JhbS0+aXNWYWxpZCgpKSB7CisgICAgICAgIHByb2dyYW0tPnVzZSgpOworICAgICAgICBwcm9ncmFtLT5zZXRVbmlmb3JtcyhkZXNjcmlwdGlvbik7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbUNhY2hlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvUHJvZ3JhbUNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZTYzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9Qcm9ncmFtQ2FjaGUuaApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9SRU5ERVJfRU5HSU5FX1BST0dSQU1DQUNIRV9ICisjZGVmaW5lIFNGX1JFTkRFUl9FTkdJTkVfUFJPR1JBTUNBQ0hFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworc3RydWN0IERlc2NyaXB0aW9uOworCituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBGb3JtYXR0ZXI7CitjbGFzcyBQcm9ncmFtOworCisvKgorICogVGhpcyBjbGFzcyBnZW5lcmF0ZXMgR0xTTCBwcm9ncmFtcyBzdWl0YWJsZSB0byBoYW5kbGUgYSBnaXZlbgorICogRGVzY3JpcHRpb24uIEl0J3MgcmVzcG9uc2libGUgZm9yIGZpZ3VyaW5nIG91dCB3aGF0IHRvCisgKiBnZW5lcmF0ZSBmcm9tIGEgRGVzY3JpcHRpb24uCisgKiBJdCBhbHNvIG1haW50YWlucyBhIGNhY2hlIG9mIHRoZXNlIFByb2dyYW1zLgorICovCitjbGFzcyBQcm9ncmFtQ2FjaGUgOiBwdWJsaWMgU2luZ2xldG9uPFByb2dyYW1DYWNoZT4geworcHVibGljOgorICAgIC8qCisgICAgICogS2V5IGlzIHVzZWQgdG8gcmV0cmlldmUgYSBQcm9ncmFtIGluIHRoZSBjYWNoZS4KKyAgICAgKiBBIEtleSBpcyBnZW5lcmF0ZWQgZnJvbSBhIERlc2NyaXB0aW9uLgorICAgICAqLworICAgIGNsYXNzIEtleSB7CisgICAgICAgIGZyaWVuZCBjbGFzcyBQcm9ncmFtQ2FjaGU7CisgICAgICAgIHR5cGVkZWYgdWludDMyX3Qga2V5X3Q7CisgICAgICAgIGtleV90IG1LZXk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0geworICAgICAgICAgICAgQkxFTkRfU0hJRlQgPSAwLAorICAgICAgICAgICAgQkxFTkRfTUFTSyA9IDEgPDwgQkxFTkRfU0hJRlQsCisgICAgICAgICAgICBCTEVORF9QUkVNVUxUID0gMSA8PCBCTEVORF9TSElGVCwKKyAgICAgICAgICAgIEJMRU5EX05PUk1BTCA9IDAgPDwgQkxFTkRfU0hJRlQsCisKKyAgICAgICAgICAgIE9QQUNJVFlfU0hJRlQgPSAxLAorICAgICAgICAgICAgT1BBQ0lUWV9NQVNLID0gMSA8PCBPUEFDSVRZX1NISUZULAorICAgICAgICAgICAgT1BBQ0lUWV9PUEFRVUUgPSAxIDw8IE9QQUNJVFlfU0hJRlQsCisgICAgICAgICAgICBPUEFDSVRZX1RSQU5TTFVDRU5UID0gMCA8PCBPUEFDSVRZX1NISUZULAorCisgICAgICAgICAgICBBTFBIQV9TSElGVCA9IDIsCisgICAgICAgICAgICBBTFBIQV9NQVNLID0gMSA8PCBBTFBIQV9TSElGVCwKKyAgICAgICAgICAgIEFMUEhBX0xUX09ORSA9IDEgPDwgQUxQSEFfU0hJRlQsCisgICAgICAgICAgICBBTFBIQV9FUV9PTkUgPSAwIDw8IEFMUEhBX1NISUZULAorCisgICAgICAgICAgICBURVhUVVJFX1NISUZUID0gMywKKyAgICAgICAgICAgIFRFWFRVUkVfTUFTSyA9IDMgPDwgVEVYVFVSRV9TSElGVCwKKyAgICAgICAgICAgIFRFWFRVUkVfT0ZGID0gMCA8PCBURVhUVVJFX1NISUZULAorICAgICAgICAgICAgVEVYVFVSRV9FWFQgPSAxIDw8IFRFWFRVUkVfU0hJRlQsCisgICAgICAgICAgICBURVhUVVJFXzJEID0gMiA8PCBURVhUVVJFX1NISUZULAorCisgICAgICAgICAgICBST1VOREVEX0NPUk5FUlNfU0hJRlQgPSA1LAorICAgICAgICAgICAgUk9VTkRFRF9DT1JORVJTX01BU0sgPSAxIDw8IFJPVU5ERURfQ09STkVSU19TSElGVCwKKyAgICAgICAgICAgIFJPVU5ERURfQ09STkVSU19PRkYgPSAwIDw8IFJPVU5ERURfQ09STkVSU19TSElGVCwKKyAgICAgICAgICAgIFJPVU5ERURfQ09STkVSU19PTiA9IDEgPDwgUk9VTkRFRF9DT1JORVJTX1NISUZULAorCisgICAgICAgICAgICBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZUID0gNiwKKyAgICAgICAgICAgIElOUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSyA9IDEgPDwgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9TSElGVCwKKyAgICAgICAgICAgIElOUFVUX1RSQU5TRk9STV9NQVRSSVhfT0ZGID0gMCA8PCBJTlBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZULAorICAgICAgICAgICAgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PTiA9IDEgPDwgSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9TSElGVCwKKworICAgICAgICAgICAgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQgPSA3LAorICAgICAgICAgICAgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSyA9IDEgPDwgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9PRkYgPSAwIDw8IE9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZULAorICAgICAgICAgICAgT1VUUFVUX1RSQU5TRk9STV9NQVRSSVhfT04gPSAxIDw8IE9VVFBVVF9UUkFOU0ZPUk1fTUFUUklYX1NISUZULAorCisgICAgICAgICAgICBJTlBVVF9URl9TSElGVCA9IDgsCisgICAgICAgICAgICBJTlBVVF9URl9NQVNLID0gMyA8PCBJTlBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIElOUFVUX1RGX0xJTkVBUiA9IDAgPDwgSU5QVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBJTlBVVF9URl9TUkdCID0gMSA8PCBJTlBVVF9URl9TSElGVCwKKyAgICAgICAgICAgIElOUFVUX1RGX1NUMjA4NCA9IDIgPDwgSU5QVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBJTlBVVF9URl9ITEcgPSAzIDw8IElOUFVUX1RGX1NISUZULAorCisgICAgICAgICAgICBPVVRQVVRfVEZfU0hJRlQgPSAxMCwKKyAgICAgICAgICAgIE9VVFBVVF9URl9NQVNLID0gMyA8PCBPVVRQVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVEZfTElORUFSID0gMCA8PCBPVVRQVVRfVEZfU0hJRlQsCisgICAgICAgICAgICBPVVRQVVRfVEZfU1JHQiA9IDEgPDwgT1VUUFVUX1RGX1NISUZULAorICAgICAgICAgICAgT1VUUFVUX1RGX1NUMjA4NCA9IDIgPDwgT1VUUFVUX1RGX1NISUZULAorICAgICAgICAgICAgT1VUUFVUX1RGX0hMRyA9IDMgPDwgT1VUUFVUX1RGX1NISUZULAorCisgICAgICAgICAgICBZNDEwX0JUMjAyMF9TSElGVCA9IDEyLAorICAgICAgICAgICAgWTQxMF9CVDIwMjBfTUFTSyA9IDEgPDwgWTQxMF9CVDIwMjBfU0hJRlQsCisgICAgICAgICAgICBZNDEwX0JUMjAyMF9PRkYgPSAwIDw8IFk0MTBfQlQyMDIwX1NISUZULAorICAgICAgICAgICAgWTQxMF9CVDIwMjBfT04gPSAxIDw8IFk0MTBfQlQyMDIwX1NISUZULAorCisgICAgICAgICAgICBTSEFET1dfU0hJRlQgPSAxMywKKyAgICAgICAgICAgIFNIQURPV19NQVNLID0gMSA8PCBTSEFET1dfU0hJRlQsCisgICAgICAgICAgICBTSEFET1dfT0ZGID0gMCA8PCBTSEFET1dfU0hJRlQsCisgICAgICAgICAgICBTSEFET1dfT04gPSAxIDw8IFNIQURPV19TSElGVCwKKyAgICAgICAgfTsKKworICAgICAgICBpbmxpbmUgS2V5KCkgOiBtS2V5KDApIHt9CisgICAgICAgIGlubGluZSBLZXkoY29uc3QgS2V5JiByaHMpIDogbUtleShyaHMubUtleSkge30KKworICAgICAgICBpbmxpbmUgS2V5JiBzZXQoa2V5X3QgbWFzaywga2V5X3QgdmFsdWUpIHsKKyAgICAgICAgICAgIG1LZXkgPSAobUtleSAmIH5tYXNrKSB8IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGJvb2wgaXNUZXh0dXJpbmcoKSBjb25zdCB7IHJldHVybiAobUtleSAmIFRFWFRVUkVfTUFTSykgIT0gVEVYVFVSRV9PRkY7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgaGFzVGV4dHVyZUNvb3JkcygpIGNvbnN0IHsgcmV0dXJuIGlzVGV4dHVyaW5nKCkgJiYgIWRyYXdTaGFkb3dzKCk7IH0KKyAgICAgICAgaW5saW5lIGludCBnZXRUZXh0dXJlVGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gKG1LZXkgJiBURVhUVVJFX01BU0spOyB9CisgICAgICAgIGlubGluZSBib29sIGlzUHJlbXVsdGlwbGllZCgpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgQkxFTkRfTUFTSykgPT0gQkxFTkRfUFJFTVVMVDsgfQorICAgICAgICBpbmxpbmUgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgT1BBQ0lUWV9NQVNLKSA9PSBPUEFDSVRZX09QQVFVRTsgfQorICAgICAgICBpbmxpbmUgYm9vbCBoYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgQUxQSEFfTUFTSykgPT0gQUxQSEFfTFRfT05FOyB9CisgICAgICAgIGlubGluZSBib29sIGhhc1JvdW5kZWRDb3JuZXJzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChtS2V5ICYgUk9VTkRFRF9DT1JORVJTX01BU0spID09IFJPVU5ERURfQ09STkVSU19PTjsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBkcmF3U2hhZG93cygpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgU0hBRE9XX01BU0spID09IFNIQURPV19PTjsgfQorICAgICAgICBpbmxpbmUgYm9vbCBoYXNJbnB1dFRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUtleSAmIElOUFVUX1RSQU5TRk9STV9NQVRSSVhfTUFTSykgPT0gSU5QVVRfVFJBTlNGT1JNX01BVFJJWF9PTjsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBoYXNPdXRwdXRUcmFuc2Zvcm1NYXRyaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1LZXkgJiBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9NQVNLKSA9PSBPVVRQVVRfVFJBTlNGT1JNX01BVFJJWF9PTjsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgYm9vbCBoYXNUcmFuc2Zvcm1NYXRyaXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gaGFzSW5wdXRUcmFuc2Zvcm1NYXRyaXgoKSB8fCBoYXNPdXRwdXRUcmFuc2Zvcm1NYXRyaXgoKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgaW50IGdldElucHV0VEYoKSBjb25zdCB7IHJldHVybiAobUtleSAmIElOUFVUX1RGX01BU0spOyB9CisgICAgICAgIGlubGluZSBpbnQgZ2V0T3V0cHV0VEYoKSBjb25zdCB7IHJldHVybiAobUtleSAmIE9VVFBVVF9URl9NQVNLKTsgfQorCisgICAgICAgIC8vIFdoZW4gSERSIGFuZCBub24tSERSIGNvbnRlbnRzIGFyZSBtaXhlZCwgb3IgZGlmZmVyZW50IHR5cGVzIG9mIEhEUiBjb250ZW50cyBhcmUKKyAgICAgICAgLy8gbWl4ZWQsIHdlIHdpbGwgZG8gYSB0b25lIG1hcHBpbmcgcHJvY2VzcyB0byB0b25lIG1hcCB0aGUgaW5wdXQgY29udGVudCB0byBvdXRwdXQKKyAgICAgICAgLy8gY29udGVudC4gQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGhhbmRsZWQsIHRoZXkgYXJlOgorICAgICAgICAvLyAqIFNEUiAtPiBITEcKKyAgICAgICAgLy8gKiBTRFIgLT4gUFEKKyAgICAgICAgLy8gKiBITEcgLT4gUFEKKyAgICAgICAgaW5saW5lIGJvb2wgbmVlZHNUb25lTWFwcGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIGludCBpbnB1dFRGID0gZ2V0SW5wdXRURigpOworICAgICAgICAgICAgaW50IG91dHB1dFRGID0gZ2V0T3V0cHV0VEYoKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIGZhbHNlIHdoZW4gY29udmVydGluZyBmcm9tIFNEUiB0byBTRFIuCisgICAgICAgICAgICBpZiAoaW5wdXRURiA9PSBLZXk6OklOUFVUX1RGX1NSR0IgJiYgb3V0cHV0VEYgPT0gS2V5OjpPVVRQVVRfVEZfTElORUFSKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlucHV0VEYgPT0gS2V5OjpJTlBVVF9URl9MSU5FQVIgJiYgb3V0cHV0VEYgPT0gS2V5OjpPVVRQVVRfVEZfU1JHQikgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5wdXRURiA+Pj0gS2V5OjpJTlBVVF9URl9TSElGVDsKKyAgICAgICAgICAgIG91dHB1dFRGID4+PSBLZXk6Ok9VVFBVVF9URl9TSElGVDsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFRGICE9IG91dHB1dFRGOworICAgICAgICB9CisgICAgICAgIGlubGluZSBib29sIGlzWTQxMEJUMjAyMCgpIGNvbnN0IHsgcmV0dXJuIChtS2V5ICYgWTQxMF9CVDIwMjBfTUFTSykgPT0gWTQxMF9CVDIwMjBfT047IH0KKworICAgICAgICAvLyBmb3IgdXNlIGJ5IHN0ZDo6dW5vcmRlcmVkX21hcAorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXkmIG90aGVyKSBjb25zdCB7IHJldHVybiBtS2V5ID09IG90aGVyLm1LZXk7IH0KKworICAgICAgICBzdHJ1Y3QgSGFzaCB7CisgICAgICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBLZXkmIGtleSkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihrZXkubUtleSk7IH0KKyAgICAgICAgfTsKKyAgICB9OworCisgICAgUHJvZ3JhbUNhY2hlKCkgPSBkZWZhdWx0OworICAgIH5Qcm9ncmFtQ2FjaGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBHZW5lcmF0ZSBzaGFkZXJzIHRvIHBvcHVsYXRlIHRoZSBjYWNoZQorICAgIHZvaWQgcHJpbWVDYWNoZShjb25zdCBFR0xDb250ZXh0IGNvbnRleHQsIGJvb2wgdXNlQ29sb3JNYW5hZ2VtZW50LCBib29sIHRvbmVNYXBwZXJTaGFkZXJPbmx5KTsKKworICAgIHNpemVfdCBnZXRTaXplKGNvbnN0IEVHTENvbnRleHQgY29udGV4dCkgeyByZXR1cm4gbUNhY2hlc1tjb250ZXh0XS5zaXplKCk7IH0KKworICAgIC8vIHVzZVByb2dyYW0gbG9va3VwIGEgc3VpdGFibGUgcHJvZ3JhbSBpbiB0aGUgY2FjaGUgb3IgZ2VuZXJhdGVzIG9uZQorICAgIC8vIGlmIG5vbmUgY2FuIGJlIGZvdW5kLgorICAgIHZvaWQgdXNlUHJvZ3JhbShjb25zdCBFR0xDb250ZXh0IGNvbnRleHQsIGNvbnN0IERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CisKK3ByaXZhdGU6CisgICAgLy8gY29tcHV0ZSBhIGNhY2hlIEtleSBmcm9tIGEgRGVzY3JpcHRpb24KKyAgICBzdGF0aWMgS2V5IGNvbXB1dGVLZXkoY29uc3QgRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKKyAgICAvLyBHZW5lcmF0ZSBFT1RGIGJhc2VkIGZyb20gS2V5LgorICAgIHN0YXRpYyB2b2lkIGdlbmVyYXRlRU9URihGb3JtYXR0ZXImIGZzLCBjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBHZW5lcmF0ZSBuZWNlc3NhcnkgdG9uZSBtYXBwaW5nIG1ldGhvZHMgZm9yIE9PVEYuCisgICAgc3RhdGljIHZvaWQgZ2VuZXJhdGVUb25lTWFwcGluZ1Byb2Nlc3MoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcyk7CisgICAgLy8gR2VuZXJhdGUgT09URiBiYXNlZCBmcm9tIEtleS4KKyAgICBzdGF0aWMgdm9pZCBnZW5lcmF0ZU9PVEYoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcyk7CisgICAgLy8gR2VuZXJhdGUgT0VURiBiYXNlZCBmcm9tIEtleS4KKyAgICBzdGF0aWMgdm9pZCBnZW5lcmF0ZU9FVEYoRm9ybWF0dGVyJiBmcywgY29uc3QgS2V5JiBuZWVkcyk7CisgICAgLy8gZ2VuZXJhdGVzIGEgcHJvZ3JhbSBmcm9tIHRoZSBLZXkKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFByb2dyYW0+IGdlbmVyYXRlUHJvZ3JhbShjb25zdCBLZXkmIG5lZWRzKTsKKyAgICAvLyBnZW5lcmF0ZXMgdGhlIHZlcnRleCBzaGFkZXIgZnJvbSB0aGUgS2V5CisgICAgc3RhdGljIFN0cmluZzggZ2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgS2V5JiBuZWVkcyk7CisgICAgLy8gZ2VuZXJhdGVzIHRoZSBmcmFnbWVudCBzaGFkZXIgZnJvbSB0aGUgS2V5CisgICAgc3RhdGljIFN0cmluZzggZ2VuZXJhdGVGcmFnbWVudFNoYWRlcihjb25zdCBLZXkmIG5lZWRzKTsKKworICAgIC8vIEtleS9WYWx1ZSBtYXAgdXNlZCBmb3IgY2FjaGluZyBQcm9ncmFtcy4gQ3VycmVudGx5IHRoZSBjYWNoZQorICAgIC8vIGlzIG5ldmVyIHNocnVuayAoYW5kIHRoZSBHTCBwcm9ncmFtIG9iamVjdHMgYXJlIG5ldmVyIGRlbGV0ZWQpLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxFR0xDb250ZXh0LCBzdGQ6OnVub3JkZXJlZF9tYXA8S2V5LCBzdGQ6OnVuaXF1ZV9wdHI8UHJvZ3JhbT4sIEtleTo6SGFzaD4+CisgICAgICAgICAgICBtQ2FjaGVzOworfTsKKworfSAvLyBuYW1lc3BhY2UgZ2wKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorCitBTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyhyZW5kZXJlbmdpbmU6OmdsOjpQcm9ncmFtQ2FjaGU6OktleSkKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLyogU0ZfUkVOREVSX0VOR0lORV9QUk9HUkFNQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL2ZpbHRlcnMvQmx1ckZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWYxOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2dsL2ZpbHRlcnMvQmx1ckZpbHRlci5jcHAKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlICJCbHVyRmlsdGVyLmgiCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMy9nbDMuaD4KKyNpbmNsdWRlIDxHTEVTMy9nbDNleHQuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljVHlwZXMuaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitCbHVyRmlsdGVyOjpCbHVyRmlsdGVyKEdMRVNSZW5kZXJFbmdpbmUmIGVuZ2luZSkKKyAgICAgIDogbUVuZ2luZShlbmdpbmUpLAorICAgICAgICBtQ29tcG9zaXRpb25GYm8oZW5naW5lKSwKKyAgICAgICAgbVBpbmdGYm8oZW5naW5lKSwKKyAgICAgICAgbVBvbmdGYm8oZW5naW5lKSwKKyAgICAgICAgbU1peFByb2dyYW0oZW5naW5lKSwKKyAgICAgICAgbUJsdXJQcm9ncmFtKGVuZ2luZSkgeworICAgIG1NaXhQcm9ncmFtLmNvbXBpbGUoZ2V0VmVydGV4U2hhZGVyKCksIGdldE1peEZyYWdTaGFkZXIoKSk7CisgICAgbU1Qb3NMb2MgPSBtTWl4UHJvZ3JhbS5nZXRBdHRyaWJ1dGVMb2NhdGlvbigiYVBvc2l0aW9uIik7CisgICAgbU1VdkxvYyA9IG1NaXhQcm9ncmFtLmdldEF0dHJpYnV0ZUxvY2F0aW9uKCJhVVYiKTsKKyAgICBtTVRleHR1cmVMb2MgPSBtTWl4UHJvZ3JhbS5nZXRVbmlmb3JtTG9jYXRpb24oInVUZXh0dXJlIik7CisgICAgbU1Db21wb3NpdGlvblRleHR1cmVMb2MgPSBtTWl4UHJvZ3JhbS5nZXRVbmlmb3JtTG9jYXRpb24oInVDb21wb3NpdGlvblRleHR1cmUiKTsKKyAgICBtTU1peExvYyA9IG1NaXhQcm9ncmFtLmdldFVuaWZvcm1Mb2NhdGlvbigidU1peCIpOworCisgICAgbUJsdXJQcm9ncmFtLmNvbXBpbGUoZ2V0VmVydGV4U2hhZGVyKCksIGdldEZyYWdtZW50U2hhZGVyKCkpOworICAgIG1CUG9zTG9jID0gbUJsdXJQcm9ncmFtLmdldEF0dHJpYnV0ZUxvY2F0aW9uKCJhUG9zaXRpb24iKTsKKyAgICBtQlV2TG9jID0gbUJsdXJQcm9ncmFtLmdldEF0dHJpYnV0ZUxvY2F0aW9uKCJhVVYiKTsKKyAgICBtQlRleHR1cmVMb2MgPSBtQmx1clByb2dyYW0uZ2V0VW5pZm9ybUxvY2F0aW9uKCJ1VGV4dHVyZSIpOworICAgIG1CT2Zmc2V0TG9jID0gbUJsdXJQcm9ncmFtLmdldFVuaWZvcm1Mb2NhdGlvbigidU9mZnNldCIpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHNpemUgPSAyLjBmOworICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB0cmFuc2xhdGlvbiA9IDEuMGY7CisgICAgY29uc3QgR0xmbG9hdCB2Ym9EYXRhW10gPSB7CisgICAgICAgIC8vIFZlcnRleCBkYXRhCisgICAgICAgIHRyYW5zbGF0aW9uIC0gc2l6ZSwgLXRyYW5zbGF0aW9uIC0gc2l6ZSwKKyAgICAgICAgdHJhbnNsYXRpb24gLSBzaXplLCAtdHJhbnNsYXRpb24gKyBzaXplLAorICAgICAgICB0cmFuc2xhdGlvbiArIHNpemUsIC10cmFuc2xhdGlvbiArIHNpemUsCisgICAgICAgIC8vIFVWIGRhdGEKKyAgICAgICAgMC4wZiwgMC4wZiAtIHRyYW5zbGF0aW9uLAorICAgICAgICAwLjBmLCBzaXplIC0gdHJhbnNsYXRpb24sCisgICAgICAgIHNpemUsIHNpemUgLSB0cmFuc2xhdGlvbgorICAgIH07CisgICAgbU1lc2hCdWZmZXIuYWxsb2NhdGVCdWZmZXJzKHZib0RhdGEsIDEyIC8qIHNpemUgKi8pOworfQorCitzdGF0dXNfdCBCbHVyRmlsdGVyOjpzZXRBc0RyYXdUYXJnZXQoY29uc3QgRGlzcGxheVNldHRpbmdzJiBkaXNwbGF5LCB1aW50MzJfdCByYWRpdXMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQmx1ckZpbHRlcjo6c2V0QXNEcmF3VGFyZ2V0Iik7CisgICAgbVJhZGl1cyA9IHJhZGl1czsKKyAgICBtRGlzcGxheVggPSBkaXNwbGF5LnBoeXNpY2FsRGlzcGxheS5sZWZ0OworICAgIG1EaXNwbGF5WSA9IGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LnRvcDsKKworICAgIGlmIChtRGlzcGxheVdpZHRoIDwgZGlzcGxheS5waHlzaWNhbERpc3BsYXkud2lkdGgoKSB8fAorICAgICAgICBtRGlzcGxheUhlaWdodCA8IGRpc3BsYXkucGh5c2ljYWxEaXNwbGF5LmhlaWdodCgpKSB7CisgICAgICAgIEFUUkFDRV9OQU1FKCJCbHVyRmlsdGVyOjphbGxvY2F0aW5nVGV4dHVyZXMiKTsKKworICAgICAgICBtRGlzcGxheVdpZHRoID0gZGlzcGxheS5waHlzaWNhbERpc3BsYXkud2lkdGgoKTsKKyAgICAgICAgbURpc3BsYXlIZWlnaHQgPSBkaXNwbGF5LnBoeXNpY2FsRGlzcGxheS5oZWlnaHQoKTsKKyAgICAgICAgbUNvbXBvc2l0aW9uRmJvLmFsbG9jYXRlQnVmZmVycyhtRGlzcGxheVdpZHRoLCBtRGlzcGxheUhlaWdodCk7CisKKyAgICAgICAgY29uc3QgdWludDMyX3QgZmJvV2lkdGggPSBmbG9vcmYobURpc3BsYXlXaWR0aCAqIGtGYm9TY2FsZSk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGZib0hlaWdodCA9IGZsb29yZihtRGlzcGxheUhlaWdodCAqIGtGYm9TY2FsZSk7CisgICAgICAgIG1QaW5nRmJvLmFsbG9jYXRlQnVmZmVycyhmYm9XaWR0aCwgZmJvSGVpZ2h0KTsKKyAgICAgICAgbVBvbmdGYm8uYWxsb2NhdGVCdWZmZXJzKGZib1dpZHRoLCBmYm9IZWlnaHQpOworCisgICAgICAgIGlmIChtUGluZ0Ziby5nZXRTdGF0dXMoKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgcGluZyBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBtUGluZ0Ziby5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBvbmdGYm8uZ2V0U3RhdHVzKCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHBvbmcgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbVBvbmdGYm8uZ2V0U3RhdHVzKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Db21wb3NpdGlvbkZiby5nZXRTdGF0dXMoKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY29tcG9zaXRpb24gYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbUNvbXBvc2l0aW9uRmJvLmdldFN0YXR1cygpOworICAgICAgICB9CisgICAgICAgIGlmICghbUJsdXJQcm9ncmFtLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc2hhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gR0xfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQ29tcG9zaXRpb25GYm8uYmluZCgpOworICAgIGdsVmlld3BvcnQoMCwgMCwgbUNvbXBvc2l0aW9uRmJvLmdldEJ1ZmZlcldpZHRoKCksIG1Db21wb3NpdGlvbkZiby5nZXRCdWZmZXJIZWlnaHQoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEJsdXJGaWx0ZXI6OmRyYXdNZXNoKEdMdWludCB1diwgR0x1aW50IHBvc2l0aW9uKSB7CisKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHV2KTsKKyAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHBvc2l0aW9uKTsKKyAgICBtTWVzaEJ1ZmZlci5iaW5kKCk7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKHBvc2l0aW9uLCAyIC8qIHNpemUgKi8sIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZihHTGZsb2F0KSAvKiBzdHJpZGUgKi8sIDAgLyogb2Zmc2V0ICovKTsKKyAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIodXYsIDIgLyogc2l6ZSAqLywgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwIC8qIHN0cmlkZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEdMdm9pZCopKDYgKiBzaXplb2YoR0xmbG9hdCkpIC8qIG9mZnNldCAqLyk7CisgICAgbU1lc2hCdWZmZXIudW5iaW5kKCk7CisKKyAgICAvLyBkcmF3IG1lc2gKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwIC8qIGZpcnN0ICovLCAzIC8qIGNvdW50ICovKTsKK30KKworc3RhdHVzX3QgQmx1ckZpbHRlcjo6cHJlcGFyZSgpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQmx1ckZpbHRlcjo6cHJlcGFyZSIpOworCisgICAgLy8gS2F3YXNlIGlzIGFuIGFwcHJveGltYXRpb24gb2YgR2F1c3NpYW4sIGJ1dCBpdCBiZWhhdmVzIGRpZmZlcmVudGx5IGZyb20gaXQuCisgICAgLy8gQSByYWRpdXMgdHJhbnNmb3JtYXRpb24gaXMgcmVxdWlyZWQgZm9yIGFwcHJveGltYXRpbmcgdGhlbSwgYW5kIGFsc28gdG8gaW50cm9kdWNlCisgICAgLy8gbm9uLWludGVnZXIgc3RlcHMsIG5lY2Vzc2FyeSB0byBzbW9vdGhseSBpbnRlcnBvbGF0ZSBsYXJnZSByYWRpaS4KKyAgICBjb25zdCBhdXRvIHJhZGl1cyA9IG1SYWRpdXMgLyA2LjBmOworCisgICAgLy8gQ2FsY3VsYXRlIGhvdyBtYW55IHBhc3NlcyB3ZSdsbCBkbywgYmFzZWQgb24gdGhlIHJhZGl1cy4KKyAgICAvLyBUb28gbWFueSBwYXNzZXMgd2lsbCBtYWtlIHRoZSBvcGVyYXRpb24gZXhwZW5zaXZlLgorICAgIGNvbnN0IGF1dG8gcGFzc2VzID0gbWluKGtNYXhQYXNzZXMsICh1aW50MzJfdCljZWlsKHJhZGl1cykpOworCisgICAgY29uc3QgZmxvYXQgcmFkaXVzQnlQYXNzZXMgPSByYWRpdXMgLyAoZmxvYXQpcGFzc2VzOworICAgIGNvbnN0IGZsb2F0IHN0ZXBYID0gcmFkaXVzQnlQYXNzZXMgLyAoZmxvYXQpbUNvbXBvc2l0aW9uRmJvLmdldEJ1ZmZlcldpZHRoKCk7CisgICAgY29uc3QgZmxvYXQgc3RlcFkgPSByYWRpdXNCeVBhc3NlcyAvIChmbG9hdCltQ29tcG9zaXRpb25GYm8uZ2V0QnVmZmVySGVpZ2h0KCk7CisKKyAgICAvLyBMZXQncyBzdGFydCBieSBkb3duc2FtcGxpbmcgYW5kIGJsdXJyaW5nIHRoZSBjb21wb3NpdGVkIGZyYW1lIHNpbXVsdGFuZW91c2x5LgorICAgIG1CbHVyUHJvZ3JhbS51c2VQcm9ncmFtKCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBnbFVuaWZvcm0xaShtQlRleHR1cmVMb2MsIDApOworICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbUNvbXBvc2l0aW9uRmJvLmdldFRleHR1cmVOYW1lKCkpOworICAgIGdsVW5pZm9ybTJmKG1CT2Zmc2V0TG9jLCBzdGVwWCwgc3RlcFkpOworICAgIGdsVmlld3BvcnQoMCwgMCwgbVBpbmdGYm8uZ2V0QnVmZmVyV2lkdGgoKSwgbVBpbmdGYm8uZ2V0QnVmZmVySGVpZ2h0KCkpOworICAgIG1QaW5nRmJvLmJpbmQoKTsKKyAgICBkcmF3TWVzaChtQlV2TG9jLCBtQlBvc0xvYyk7CisKKyAgICAvLyBBbmQgbm93IHdlJ2xsIHBpbmcgcG9uZyBiZXR3ZWVuIG91ciB0ZXh0dXJlcywgdG8gYWNjdW11bGF0ZSB0aGUgcmVzdWx0IG9mIHZhcmlvdXMgb2Zmc2V0cy4KKyAgICBHTEZyYW1lYnVmZmVyKiByZWFkID0gJm1QaW5nRmJvOworICAgIEdMRnJhbWVidWZmZXIqIGRyYXcgPSAmbVBvbmdGYm87CisgICAgZ2xWaWV3cG9ydCgwLCAwLCBkcmF3LT5nZXRCdWZmZXJXaWR0aCgpLCBkcmF3LT5nZXRCdWZmZXJIZWlnaHQoKSk7CisgICAgZm9yIChhdXRvIGkgPSAxOyBpIDwgcGFzc2VzOyBpKyspIHsKKyAgICAgICAgQVRSQUNFX05BTUUoIkJsdXJGaWx0ZXI6OnJlbmRlclBhc3MiKTsKKyAgICAgICAgZHJhdy0+YmluZCgpOworCisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgcmVhZC0+Z2V0VGV4dHVyZU5hbWUoKSk7CisgICAgICAgIGdsVW5pZm9ybTJmKG1CT2Zmc2V0TG9jLCBzdGVwWCAqIGksIHN0ZXBZICogaSk7CisKKyAgICAgICAgZHJhd01lc2gobUJVdkxvYywgbUJQb3NMb2MpOworCisgICAgICAgIC8vIFN3YXAgYnVmZmVycyBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgICAgYXV0byB0bXAgPSBkcmF3OworICAgICAgICBkcmF3ID0gcmVhZDsKKyAgICAgICAgcmVhZCA9IHRtcDsKKyAgICB9CisgICAgbUxhc3REcmF3VGFyZ2V0ID0gcmVhZDsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQmx1ckZpbHRlcjo6cmVuZGVyKGJvb2wgbXVsdGlQYXNzKSB7CisgICAgQVRSQUNFX05BTUUoIkJsdXJGaWx0ZXI6OnJlbmRlciIpOworCisgICAgLy8gTm93IGxldCdzIHNjYWxlIG91ciBibHVyIHVwLiBJdCB3aWxsIGJlIGludGVycG9sYXRlZCB3aXRoIHRoZSBsYXJnZXIgY29tcG9zaXRlZAorICAgIC8vIHRleHR1cmUgZm9yIHRoZSBmaXJzdCBmcmFtZXMsIHRvIGhpZGUgZG93bnNjYWxpbmcgYXJ0aWZhY3RzLgorICAgIEdMZmxvYXQgbWl4ID0gZm1pbigxLjAsIG1SYWRpdXMgLyBrTWF4Q3Jvc3NGYWRlUmFkaXVzKTsKKworICAgIC8vIFdoZW4gZG9pbmcgbXVsdGlwbGUgcGFzc2VzLCB3ZSBjYW5ub3QgdHJ5IHRvIHJlYWQgbUNvbXBvc2l0aW9uRmJvLCBnaXZlbiB0aGF0IHdlJ2xsCisgICAgLy8gYmUgd3JpdGluZyBvbnRvIGl0LiBMZXQncyBkaXNhYmxlIHRoZSBjcm9zc2ZhZGUsIG90aGVyd2lzZSB3ZSdkIG5lZWQgMSBleHRyYSBmcmFtZSBidWZmZXIsCisgICAgLy8gYXMgbGFyZ2UgYXMgdGhlIHNjcmVlbiBzaXplLgorICAgIGlmIChtaXggPj0gMSB8fCBtdWx0aVBhc3MpIHsKKyAgICAgICAgbUxhc3REcmF3VGFyZ2V0LT5iaW5kQXNSZWFkQnVmZmVyKCk7CisgICAgICAgIGdsQmxpdEZyYW1lYnVmZmVyKDAsIDAsIG1MYXN0RHJhd1RhcmdldC0+Z2V0QnVmZmVyV2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3REcmF3VGFyZ2V0LT5nZXRCdWZmZXJIZWlnaHQoKSwgbURpc3BsYXlYLCBtRGlzcGxheVksIG1EaXNwbGF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgbU1peFByb2dyYW0udXNlUHJvZ3JhbSgpOworICAgIGdsVW5pZm9ybTFmKG1NTWl4TG9jLCBtaXgpOworICAgIGdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtTGFzdERyYXdUYXJnZXQtPmdldFRleHR1cmVOYW1lKCkpOworICAgIGdsVW5pZm9ybTFpKG1NVGV4dHVyZUxvYywgMCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUxKTsKKyAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1Db21wb3NpdGlvbkZiby5nZXRUZXh0dXJlTmFtZSgpKTsKKyAgICBnbFVuaWZvcm0xaShtTUNvbXBvc2l0aW9uVGV4dHVyZUxvYywgMSk7CisKKyAgICBkcmF3TWVzaChtTVV2TG9jLCBtTVBvc0xvYyk7CisKKyAgICBnbFVzZVByb2dyYW0oMCk7CisgICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKKyAgICBtRW5naW5lLmNoZWNrRXJyb3JzKCJEcmF3aW5nIGJsdXIgbWVzaCIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RyaW5nIEJsdXJGaWx0ZXI6OmdldFZlcnRleFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUiJTSEFERVIoI3ZlcnNpb24gMzEwIGVzCisgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OworCisgICAgICAgIGluIHZlYzIgYVBvc2l0aW9uOworICAgICAgICBpbiBoaWdocCB2ZWMyIGFVVjsKKyAgICAgICAgb3V0IGhpZ2hwIHZlYzIgdlVWOworCisgICAgICAgIHZvaWQgbWFpbigpIHsKKyAgICAgICAgICAgIHZVViA9IGFVVjsKKyAgICAgICAgICAgIGdsX1Bvc2l0aW9uID0gdmVjNChhUG9zaXRpb24sIDAuMCwgMS4wKTsKKyAgICAgICAgfQorICAgIClTSEFERVIiOworfQorCitzdHJpbmcgQmx1ckZpbHRlcjo6Z2V0RnJhZ21lbnRTaGFkZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFIiU0hBREVSKCN2ZXJzaW9uIDMxMCBlcworICAgICAgICBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKworICAgICAgICB1bmlmb3JtIHNhbXBsZXIyRCB1VGV4dHVyZTsKKyAgICAgICAgdW5pZm9ybSB2ZWMyIHVPZmZzZXQ7CisKKyAgICAgICAgaW4gaGlnaHAgdmVjMiB2VVY7CisgICAgICAgIG91dCB2ZWM0IGZyYWdDb2xvcjsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisgICAgICAgICAgICBmcmFnQ29sb3IgID0gdGV4dHVyZSh1VGV4dHVyZSwgdlVWLCAwLjApOworICAgICAgICAgICAgZnJhZ0NvbG9yICs9IHRleHR1cmUodVRleHR1cmUsIHZVViArIHZlYzIoIHVPZmZzZXQueCwgIHVPZmZzZXQueSksIDAuMCk7CisgICAgICAgICAgICBmcmFnQ29sb3IgKz0gdGV4dHVyZSh1VGV4dHVyZSwgdlVWICsgdmVjMiggdU9mZnNldC54LCAtdU9mZnNldC55KSwgMC4wKTsKKyAgICAgICAgICAgIGZyYWdDb2xvciArPSB0ZXh0dXJlKHVUZXh0dXJlLCB2VVYgKyB2ZWMyKC11T2Zmc2V0LngsICB1T2Zmc2V0LnkpLCAwLjApOworICAgICAgICAgICAgZnJhZ0NvbG9yICs9IHRleHR1cmUodVRleHR1cmUsIHZVViArIHZlYzIoLXVPZmZzZXQueCwgLXVPZmZzZXQueSksIDAuMCk7CisKKyAgICAgICAgICAgIGZyYWdDb2xvciA9IHZlYzQoZnJhZ0NvbG9yLnJnYiAqIDAuMiwgMS4wKTsKKyAgICAgICAgfQorICAgIClTSEFERVIiOworfQorCitzdHJpbmcgQmx1ckZpbHRlcjo6Z2V0TWl4RnJhZ1NoYWRlcigpIGNvbnN0IHsKKyAgICBzdHJpbmcgc2hhZGVyID0gUiJTSEFERVIoI3ZlcnNpb24gMzEwIGVzCisgICAgICAgIHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OworCisgICAgICAgIGluIGhpZ2hwIHZlYzIgdlVWOworICAgICAgICBvdXQgdmVjNCBmcmFnQ29sb3I7CisKKyAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdUNvbXBvc2l0aW9uVGV4dHVyZTsKKyAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdVRleHR1cmU7CisgICAgICAgIHVuaWZvcm0gZmxvYXQgdU1peDsKKworICAgICAgICB2b2lkIG1haW4oKSB7CisgICAgICAgICAgICB2ZWM0IGJsdXJyZWQgPSB0ZXh0dXJlKHVUZXh0dXJlLCB2VVYpOworICAgICAgICAgICAgdmVjNCBjb21wb3NpdGlvbiA9IHRleHR1cmUodUNvbXBvc2l0aW9uVGV4dHVyZSwgdlVWKTsKKyAgICAgICAgICAgIGZyYWdDb2xvciA9IG1peChjb21wb3NpdGlvbiwgYmx1cnJlZCwgdU1peCk7CisgICAgICAgIH0KKyAgICApU0hBREVSIjsKKyAgICByZXR1cm4gc2hhZGVyOworfQorCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9CbHVyRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzYThmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0JsdXJGaWx0ZXIuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHVpL0dyYXBoaWNUeXBlcy5oPgorI2luY2x1ZGUgIi4uL0dMRVNSZW5kZXJFbmdpbmUuaCIKKyNpbmNsdWRlICIuLi9HTEZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAiLi4vR0xWZXJ0ZXhCdWZmZXIuaCIKKyNpbmNsdWRlICJHZW5lcmljUHJvZ3JhbS5oIgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKKy8qKgorICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIEthd2FzZSBibHVyLCBhcyBkZXNjcmliZWQgaW4gaGVyZToKKyAqIGh0dHBzOi8vY29tbXVuaXR5LmFybS5jb20vY2ZzLWZpbGUvX19rZXkvY29tbXVuaXR5c2VydmVyLWJsb2dzLWNvbXBvbmVudHMtd2VibG9nZmlsZXMvCisgKiAwMC0wMC0wMC0yMC02Ni9zaWdncmFwaDIwMTVfMkQwMF9tbWdfMkQwMF9tYXJpdXNfMkQwMF9ub3Rlcy5wZGYKKyAqLworY2xhc3MgQmx1ckZpbHRlciB7CitwdWJsaWM6CisgICAgLy8gRG93bnNhbXBsZSBGQk8gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQorICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0Zib1NjYWxlID0gMC4yNWY7CisgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgcmVuZGVyIHBhc3NlcworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFBhc3NlcyA9IDQ7CisgICAgLy8gVG8gYXZvaWQgZG93bnNjYWxpbmcgYXJ0aWZhY3RzLCB3ZSBpbnRlcnBvbGF0ZSB0aGUgYmx1cnJlZCBmYm8gd2l0aCB0aGUgZnVsbCBjb21wb3NpdGVkCisgICAgLy8gaW1hZ2UsIHVwIHRvIHRoaXMgcmFkaXVzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga01heENyb3NzRmFkZVJhZGl1cyA9IDMwLjBmOworCisgICAgZXhwbGljaXQgQmx1ckZpbHRlcihHTEVTUmVuZGVyRW5naW5lJiBlbmdpbmUpOworICAgIHZpcnR1YWwgfkJsdXJGaWx0ZXIoKXt9OworCisgICAgLy8gU2V0IHVwIHJlbmRlciB0YXJnZXRzLCByZWRpcmVjdGluZyBvdXRwdXQgdG8gb2Zmc2NyZWVuIHRleHR1cmUuCisgICAgc3RhdHVzX3Qgc2V0QXNEcmF3VGFyZ2V0KGNvbnN0IERpc3BsYXlTZXR0aW5ncyYsIHVpbnQzMl90IHJhZGl1cyk7CisgICAgLy8gRXhlY3V0ZSBibHVyIHBhc3NlcywgcmVuZGVyaW5nIHRvIG9mZnNjcmVlbiB0ZXh0dXJlLgorICAgIHN0YXR1c190IHByZXBhcmUoKTsKKyAgICAvLyBSZW5kZXIgYmx1ciB0byB0aGUgYm91bmQgZnJhbWVidWZmZXIgKHNjcmVlbikuCisgICAgc3RhdHVzX3QgcmVuZGVyKGJvb2wgbXVsdGlQYXNzKTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtUmFkaXVzOworICAgIHZvaWQgZHJhd01lc2goR0x1aW50IHV2LCBHTHVpbnQgcG9zaXRpb24pOworICAgIHN0cmluZyBnZXRWZXJ0ZXhTaGFkZXIoKSBjb25zdDsKKyAgICBzdHJpbmcgZ2V0RnJhZ21lbnRTaGFkZXIoKSBjb25zdDsKKyAgICBzdHJpbmcgZ2V0TWl4RnJhZ1NoYWRlcigpIGNvbnN0OworCisgICAgR0xFU1JlbmRlckVuZ2luZSYgbUVuZ2luZTsKKyAgICAvLyBGcmFtZSBidWZmZXIgaG9sZGluZyB0aGUgY29tcG9zaXRlZCBiYWNrZ3JvdW5kLgorICAgIEdMRnJhbWVidWZmZXIgbUNvbXBvc2l0aW9uRmJvOworICAgIC8vIEZyYW1lIGJ1ZmZlcnMgaG9sZGluZyB0aGUgYmx1ciBwYXNzZXMuCisgICAgR0xGcmFtZWJ1ZmZlciBtUGluZ0ZibzsKKyAgICBHTEZyYW1lYnVmZmVyIG1Qb25nRmJvOworICAgIHVpbnQzMl90IG1EaXNwbGF5V2lkdGggPSAwOworICAgIHVpbnQzMl90IG1EaXNwbGF5SGVpZ2h0ID0gMDsKKyAgICB1aW50MzJfdCBtRGlzcGxheVggPSAwOworICAgIHVpbnQzMl90IG1EaXNwbGF5WSA9IDA7CisgICAgLy8gQnVmZmVyIGhvbGRpbmcgdGhlIGZpbmFsIGJsdXIgcGFzcy4KKyAgICBHTEZyYW1lYnVmZmVyKiBtTGFzdERyYXdUYXJnZXQ7CisKKyAgICAvLyBWQk8gY29udGFpbmluZyB2ZXJ0ZXggYW5kIHV2IGRhdGEgb2YgYSBmdWxsc2NyZWVuIHRyaWFuZ2xlLgorICAgIEdMVmVydGV4QnVmZmVyIG1NZXNoQnVmZmVyOworCisgICAgR2VuZXJpY1Byb2dyYW0gbU1peFByb2dyYW07CisgICAgR0x1aW50IG1NUG9zTG9jOworICAgIEdMdWludCBtTVV2TG9jOworICAgIEdMdWludCBtTU1peExvYzsKKyAgICBHTHVpbnQgbU1UZXh0dXJlTG9jOworICAgIEdMdWludCBtTUNvbXBvc2l0aW9uVGV4dHVyZUxvYzsKKworICAgIEdlbmVyaWNQcm9ncmFtIG1CbHVyUHJvZ3JhbTsKKyAgICBHTHVpbnQgbUJQb3NMb2M7CisgICAgR0x1aW50IG1CVXZMb2M7CisgICAgR0x1aW50IG1CVGV4dHVyZUxvYzsKKyAgICBHTHVpbnQgbUJPZmZzZXRMb2M7Cit9OworCit9IC8vIG5hbWVzcGFjZSBnbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9HZW5lcmljUHJvZ3JhbS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9HZW5lcmljUHJvZ3JhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzNTg4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkdlbmVyaWNQcm9ncmFtLmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBnbCB7CisKK0dlbmVyaWNQcm9ncmFtOjpHZW5lcmljUHJvZ3JhbShHTEVTUmVuZGVyRW5naW5lJiBlbmdpbmUpIDogbUVuZ2luZShlbmdpbmUpIHt9CisKK0dlbmVyaWNQcm9ncmFtOjp+R2VuZXJpY1Byb2dyYW0oKSB7CisgICAgaWYgKG1WZXJ0ZXhTaGFkZXJIYW5kbGUgIT0gMCkgeworICAgICAgICBpZiAobVByb2dyYW1IYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgZ2xEZXRhY2hTaGFkZXIobVByb2dyYW1IYW5kbGUsIG1WZXJ0ZXhTaGFkZXJIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGdsRGVsZXRlU2hhZGVyKG1WZXJ0ZXhTaGFkZXJIYW5kbGUpOworICAgIH0KKworICAgIGlmIChtRnJhZ21lbnRTaGFkZXJIYW5kbGUgIT0gMCkgeworICAgICAgICBpZiAobVByb2dyYW1IYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgZ2xEZXRhY2hTaGFkZXIobVByb2dyYW1IYW5kbGUsIG1GcmFnbWVudFNoYWRlckhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgZ2xEZWxldGVTaGFkZXIobUZyYWdtZW50U2hhZGVySGFuZGxlKTsKKyAgICB9CisKKyAgICBpZiAobVByb2dyYW1IYW5kbGUgIT0gMCkgeworICAgICAgICBnbERlbGV0ZVByb2dyYW0obVByb2dyYW1IYW5kbGUpOworICAgIH0KK30KKwordm9pZCBHZW5lcmljUHJvZ3JhbTo6Y29tcGlsZShzdHJpbmcgdmVydGV4U2hhZGVyLCBzdHJpbmcgZnJhZ21lbnRTaGFkZXIpIHsKKyAgICBtVmVydGV4U2hhZGVySGFuZGxlID0gY29tcGlsZVNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB2ZXJ0ZXhTaGFkZXIpOworICAgIG1GcmFnbWVudFNoYWRlckhhbmRsZSA9IGNvbXBpbGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNoYWRlcik7CisgICAgaWYgKG1WZXJ0ZXhTaGFkZXJIYW5kbGUgPT0gMCB8fCBtRnJhZ21lbnRTaGFkZXJIYW5kbGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiQWJvcnRpbmcgcHJvZ3JhbSBjcmVhdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUHJvZ3JhbUhhbmRsZSA9IGNyZWF0ZUFuZExpbmsobVZlcnRleFNoYWRlckhhbmRsZSwgbUZyYWdtZW50U2hhZGVySGFuZGxlKTsKKyAgICBtRW5naW5lLmNoZWNrRXJyb3JzKCJMaW5raW5nIHByb2dyYW0iKTsKK30KKwordm9pZCBHZW5lcmljUHJvZ3JhbTo6dXNlUHJvZ3JhbSgpIGNvbnN0IHsKKyAgICBnbFVzZVByb2dyYW0obVByb2dyYW1IYW5kbGUpOworfQorCitHTHVpbnQgR2VuZXJpY1Byb2dyYW06OmNvbXBpbGVTaGFkZXIoR0x1aW50IHR5cGUsIHN0cmluZyBzcmMpIGNvbnN0IHsKKyAgICBjb25zdCBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgaWYgKHNoYWRlciA9PSAwKSB7CisgICAgICAgIG1FbmdpbmUuY2hlY2tFcnJvcnMoIkNyZWF0aW5nIHNoYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgR0xjaGFyKiBjaGFyU3JjID0gKGNvbnN0IEdMY2hhciopc3JjLmNfc3RyKCk7CisgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmY2hhclNyYywgbnVsbHB0cik7CisgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisKKyAgICBHTGludCBpc0NvbXBpbGVkID0gMDsKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZpc0NvbXBpbGVkKTsKKyAgICBpZiAoaXNDb21waWxlZCA9PSBHTF9GQUxTRSkgeworICAgICAgICBHTGludCBtYXhMZW5ndGggPSAwOworICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbWF4TGVuZ3RoKTsKKyAgICAgICAgc3RyaW5nIGVycm9yTG9nOworICAgICAgICBlcnJvckxvZy5yZXNlcnZlKG1heExlbmd0aCk7CisgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIG1heExlbmd0aCwgJm1heExlbmd0aCwgZXJyb3JMb2cuZGF0YSgpKTsKKyAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKKyAgICAgICAgQUxPR0UoIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6ICVzIiwgZXJyb3JMb2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gc2hhZGVyOworfQorR0x1aW50IEdlbmVyaWNQcm9ncmFtOjpjcmVhdGVBbmRMaW5rKEdMdWludCB2ZXJ0ZXhTaGFkZXIsIEdMdWludCBmcmFnbWVudFNoYWRlcikgY29uc3QgeworICAgIGNvbnN0IEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgbUVuZ2luZS5jaGVja0Vycm9ycygiQ3JlYXRpbmcgcHJvZ3JhbSIpOworCisgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKKyAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7CisgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKKyAgICBtRW5naW5lLmNoZWNrRXJyb3JzKCJMaW5raW5nIHByb2dyYW0iKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKworR0x1aW50IEdlbmVyaWNQcm9ncmFtOjpnZXRVbmlmb3JtTG9jYXRpb24oY29uc3Qgc3RyaW5nIG5hbWUpIGNvbnN0IHsKKyAgICBpZiAobVByb2dyYW1IYW5kbGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiQ2FuJ3QgZ2V0IGxvY2F0aW9uIG9mICVzIG9uIGFuIGludmFsaWQgcHJvZ3JhbS4iLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBnbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbUhhbmRsZSwgKGNvbnN0IEdMY2hhciopbmFtZS5jX3N0cigpKTsKK30KKworR0x1aW50IEdlbmVyaWNQcm9ncmFtOjpnZXRBdHRyaWJ1dGVMb2NhdGlvbihjb25zdCBzdHJpbmcgbmFtZSkgY29uc3QgeworICAgIGlmIChtUHJvZ3JhbUhhbmRsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJDYW4ndCBnZXQgbG9jYXRpb24gb2YgJXMgb24gYW4gaW52YWxpZCBwcm9ncmFtLiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW1IYW5kbGUsIChjb25zdCBHTGNoYXIqKW5hbWUuY19zdHIoKSk7Cit9CisKK2Jvb2wgR2VuZXJpY1Byb2dyYW06OmlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcm9ncmFtSGFuZGxlICE9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9nbC9maWx0ZXJzL0dlbmVyaWNQcm9ncmFtLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9HZW5lcmljUHJvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYTJhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvZ2wvZmlsdGVycy9HZW5lcmljUHJvZ3JhbS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dWkvR3JhcGhpY1R5cGVzLmg+CisjaW5jbHVkZSAiLi4vR0xFU1JlbmRlckVuZ2luZS5oIgorI2luY2x1ZGUgIi4uL0dMRnJhbWVidWZmZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgZ2wgeworCitjbGFzcyBHZW5lcmljUHJvZ3JhbSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgR2VuZXJpY1Byb2dyYW0oR0xFU1JlbmRlckVuZ2luZSYgcmVuZGVyRW5naW5lKTsKKyAgICB+R2VuZXJpY1Byb2dyYW0oKTsKKyAgICB2b2lkIGNvbXBpbGUoc3RyaW5nIHZlcnRleFNoYWRlciwgc3RyaW5nIGZyYWdtZW50U2hhZGVyKTsKKyAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKKyAgICB2b2lkIHVzZVByb2dyYW0oKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0QXR0cmlidXRlTG9jYXRpb24oY29uc3Qgc3RyaW5nIG5hbWUpIGNvbnN0OworICAgIEdMdWludCBnZXRVbmlmb3JtTG9jYXRpb24oY29uc3Qgc3RyaW5nIG5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIEdMdWludCBjb21waWxlU2hhZGVyKEdMdWludCB0eXBlLCBjb25zdCBzdHJpbmcgc3JjKSBjb25zdDsKKyAgICBHTHVpbnQgY3JlYXRlQW5kTGluayhHTHVpbnQgdmVydGV4U2hhZGVyLCBHTHVpbnQgZnJhZ21lbnRTaGFkZXIpIGNvbnN0OworCisgICAgR0xFU1JlbmRlckVuZ2luZSYgbUVuZ2luZTsKKyAgICBHTHVpbnQgbVZlcnRleFNoYWRlckhhbmRsZSA9IDA7CisgICAgR0x1aW50IG1GcmFnbWVudFNoYWRlckhhbmRsZSA9IDA7CisgICAgR0x1aW50IG1Qcm9ncmFtSGFuZGxlID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGdsCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9EaXNwbGF5U2V0dGluZ3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9EaXNwbGF5U2V0dGluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE2ZDJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0Rpc3BsYXlTZXR0aW5ncy5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW9zZndkPgorCisjaW5jbHVkZSA8bWF0aC9tYXQ0Lmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY1R5cGVzLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgorI2luY2x1ZGUgPHVpL1RyYW5zZm9ybS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworLy8gRGlzcGxheVNldHRpbmdzIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSBhcHBsaWNhYmxlIHdoZW4gZHJhd2luZyBhbGwKKy8vIGxheWVycyBmb3IgYSBnaXZlbiBkaXNwbGF5Lgorc3RydWN0IERpc3BsYXlTZXR0aW5ncyB7CisgICAgLy8gUmVjdGFuZ2xlIGRlc2NyaWJpbmcgdGhlIHBoeXNpY2FsIGRpc3BsYXkuIFdlIHdpbGwgcHJvamVjdCBmcm9tIHRoZQorICAgIC8vIGxvZ2ljYWwgY2xpcCBvbnRvIHRoaXMgcmVjdGFuZ2xlLgorICAgIFJlY3QgcGh5c2ljYWxEaXNwbGF5ID0gUmVjdDo6SU5WQUxJRF9SRUNUOworCisgICAgLy8gUmVjdGFuZ2xlIGJvdW5kZWQgYnkgdGhlIHgseS0gY2xpcHBpbmcgcGxhbmVzIGluIHRoZSBsb2dpY2FsIGRpc3BsYXksIHNvCisgICAgLy8gdGhhdCB0aGUgb3J0aG9ncmFwaGljIHByb2plY3Rpb24gbWF0cml4IGNhbiBiZSBjb21wdXRlZC4gV2hlbgorICAgIC8vIGNvbnN0cnVjdGluZyB0aGlzIG1hdHJpeCwgei1jb29yZGluYXRlIGJvdW5kIGFyZSBhc3N1bWVkIHRvIGJlIGF0IHo9MCBhbmQKKyAgICAvLyB6PTEuCisgICAgUmVjdCBjbGlwID0gUmVjdDo6SU5WQUxJRF9SRUNUOworCisgICAgLy8gTWF4aW11bSBsdW1pbmFuY2UgcHVsbGVkIGZyb20gdGhlIGRpc3BsYXkncyBIRFIgY2FwYWJpbGl0aWVzLgorICAgIGZsb2F0IG1heEx1bWluYW5jZSA9IDEuMGY7CisKKyAgICAvLyBPdXRwdXQgZGF0YXNwYWNlIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgd2lkZSBjb2xvciBnYW11dCBpcyB1c2VkLCBvcgorICAgIC8vIERhdGFTcGFjZTo6VU5LTk9XTiBvdGhlcndpc2UuCisgICAgdWk6OkRhdGFzcGFjZSBvdXRwdXREYXRhc3BhY2UgPSB1aTo6RGF0YXNwYWNlOjpVTktOT1dOOworCisgICAgLy8gQWRkaXRpb25hbCBjb2xvciB0cmFuc2Zvcm0gdG8gYXBwbHkgaW4gbGluZWFyIHNwYWNlIGFmdGVyIHRyYW5zZm9ybWluZworICAgIC8vIHRvIHRoZSBvdXRwdXQgZGF0YXNwYWNlLgorICAgIG1hdDQgY29sb3JUcmFuc2Zvcm0gPSBtYXQ0KCk7CisKKyAgICAvLyBSZWdpb24gdGhhdCB3aWxsIGJlIGNsZWFyZWQgdG8gKDAsIDAsIDAsIDEpIHByaW9yIHRvIHJlbmRlcmluZy4KKyAgICAvLyBUaGlzIGlzIHNwZWNpZmllZCBpbiBsYXllci1zdGFjayBzcGFjZS4KKyAgICBSZWdpb24gY2xlYXJSZWdpb24gPSBSZWdpb246OklOVkFMSURfUkVHSU9OOworCisgICAgLy8gQW4gYWRkaXRpb25hbCBvcmllbnRhdGlvbiBmbGFnIHRvIGJlIGFwcGxpZWQgYWZ0ZXIgY2xpcHBpbmcgdGhlIG91dHB1dC4KKyAgICAvLyBCeSB3YXkgb2YgZXhhbXBsZSwgdGhpcyBtYXkgYmUgdXNlZCBmb3Igc3VwcG9ydGluZyBmdWxsc2NyZWVuIHNjcmVlbnNob3QKKyAgICAvLyBjYXB0dXJlIG9mIGEgZGV2aWNlIGluIGxhbmRzY2FwZSB3aGlsZSB0aGUgYnVmZmVyIGlzIGluIHBvcnRyYWl0CisgICAgLy8gb3JpZW50YXRpb24uCisgICAgdWludDMyX3Qgb3JpZW50YXRpb24gPSB1aTo6VHJhbnNmb3JtOjpST1RfMDsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERpc3BsYXlTZXR0aW5ncyYgbGhzLCBjb25zdCBEaXNwbGF5U2V0dGluZ3MmIHJocykgeworICAgIHJldHVybiBsaHMucGh5c2ljYWxEaXNwbGF5ID09IHJocy5waHlzaWNhbERpc3BsYXkgJiYgbGhzLmNsaXAgPT0gcmhzLmNsaXAgJiYKKyAgICAgICAgICAgIGxocy5tYXhMdW1pbmFuY2UgPT0gcmhzLm1heEx1bWluYW5jZSAmJiBsaHMub3V0cHV0RGF0YXNwYWNlID09IHJocy5vdXRwdXREYXRhc3BhY2UgJiYKKyAgICAgICAgICAgIGxocy5jb2xvclRyYW5zZm9ybSA9PSByaHMuY29sb3JUcmFuc2Zvcm0gJiYKKyAgICAgICAgICAgIGxocy5jbGVhclJlZ2lvbi5oYXNTYW1lUmVjdHMocmhzLmNsZWFyUmVnaW9uKSAmJiBsaHMub3JpZW50YXRpb24gPT0gcmhzLm9yaWVudGF0aW9uOworfQorCisvLyBEZWZpbmluZyBQcmludFRvIGhlbHBzIHdpdGggR29vZ2xlIFRlc3RzLgorc3RhdGljIGlubGluZSB2b2lkIFByaW50VG8oY29uc3QgRGlzcGxheVNldHRpbmdzJiBzZXR0aW5ncywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJEaXNwbGF5U2V0dGluZ3MgeyI7CisgICAgKm9zIDw8ICJcbiAgICAucGh5c2ljYWxEaXNwbGF5ID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSwgb3MpOworICAgICpvcyA8PCAiXG4gICAgLmNsaXAgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MuY2xpcCwgb3MpOworICAgICpvcyA8PCAiXG4gICAgLm1heEx1bWluYW5jZSA9ICIgPDwgc2V0dGluZ3MubWF4THVtaW5hbmNlOworICAgICpvcyA8PCAiXG4gICAgLm91dHB1dERhdGFzcGFjZSA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5vdXRwdXREYXRhc3BhY2UsIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5jb2xvclRyYW5zZm9ybSA9ICIgPDwgc2V0dGluZ3MuY29sb3JUcmFuc2Zvcm07CisgICAgKm9zIDw8ICJcbiAgICAuY2xlYXJSZWdpb24gPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MuY2xlYXJSZWdpb24sIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5vcmllbnRhdGlvbiA9ICIgPDwgc2V0dGluZ3Mub3JpZW50YXRpb247CisgICAgKm9zIDw8ICJcbn0iOworfQorCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9GcmFtZWJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0ZyYW1lYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxMTEyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9GcmFtZWJ1ZmZlci5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitjbGFzcyBGcmFtZWJ1ZmZlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+RnJhbWVidWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TmF0aXZlV2luZG93QnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZUJ1ZmZlciwgYm9vbCBpc1Byb3RlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkgPSAwOworfTsKKworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvSW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjQ3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvSW1hZ2UuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitjbGFzcyBJbWFnZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW1hZ2UoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCBib29sIHNldE5hdGl2ZVdpbmRvd0J1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGJvb2wgaXNQcm90ZWN0ZWQpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL0xheWVyU2V0dGluZ3MuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9MYXllclNldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlOTM2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9MYXllclNldHRpbmdzLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW9zZndkPgorCisjaW5jbHVkZSA8bWF0aC9tYXQ0Lmg+CisjaW5jbHVkZSA8bWF0aC92ZWMzLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL1RleHR1cmUuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0Zsb2F0UmVjdC5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljVHlwZXMuaD4KKyNpbmNsdWRlIDx1aS9SZWN0Lmg+CisjaW5jbHVkZSA8dWkvUmVnaW9uLmg+CisjaW5jbHVkZSA8dWkvVHJhbnNmb3JtLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCisvLyBNZXRhZGF0YSBkZXNjcmliaW5nIHRoZSBpbnB1dCBidWZmZXIgdG8gcmVuZGVyIGZyb20uCitzdHJ1Y3QgQnVmZmVyIHsKKyAgICAvLyBCdWZmZXIgY29udGFpbmluZyB0aGUgaW1hZ2UgdGhhdCB3ZSB3aWxsIHJlbmRlci4KKyAgICAvLyBJZiBidWZmZXIgPT0gbnVsbHB0ciwgdGhlbiB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIGluIHRoaXMgc3RydWN0IHdpbGwgYmUKKyAgICAvLyBpZ25vcmVkLgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICAvLyBGZW5jZSB0aGF0IHdpbGwgZmlyZSB3aGVuIHRoZSBidWZmZXIgaXMgcmVhZHkgdG8gYmUgYm91bmQuCisgICAgc3A8RmVuY2U+IGZlbmNlID0gbnVsbHB0cjsKKworICAgIC8vIFRleHR1cmUgaWRlbnRpZmllciB0byBiaW5kIHRoZSBleHRlcm5hbCB0ZXh0dXJlIHRvLgorICAgIC8vIFRPRE8oYWxlY21vdXJpKTogVGhpcyBpcyBHTC1zcGVjaWZpYy4uLm1ha2UgdGhlIHR5cGUgYmFja2VuZC1hZ25vc3RpYy4KKyAgICB1aW50MzJfdCB0ZXh0dXJlTmFtZSA9IDA7CisKKyAgICAvLyBXaGV0aGVyIHRvIHVzZSBmaWx0ZXJpbmcgd2hlbiByZW5kZXJpbmcgdGhlIHRleHR1cmUuCisgICAgYm9vbCB1c2VUZXh0dXJlRmlsdGVyaW5nID0gZmFsc2U7CisKKyAgICAvLyBUcmFuc2Zvcm0gbWF0cml4IHRvIGFwcGx5IHRvIHRleHR1cmUgY29vcmRpbmF0ZXMuCisgICAgbWF0NCB0ZXh0dXJlVHJhbnNmb3JtID0gbWF0NCgpOworCisgICAgLy8gV2hldGhlciB0byB1c2UgcHJlLW11bHRpcGxpZWQgYWxwaGEuCisgICAgYm9vbCB1c2VQcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOworCisgICAgLy8gT3ZlcnJpZGUgZmxhZyB0aGF0IGFscGhhIGZvciBlYWNoIHBpeGVsIGluIHRoZSBidWZmZXIgKm11c3QqIGJlIDEuMC4KKyAgICAvLyBMYXllclNldHRpbmdzOjphbHBoYSBpcyBzdGlsbCB1c2VkIGlmIGlzT3BhcXVlPT10cnVlIC0gdGhpcyBmbGFnIG9ubHkKKyAgICAvLyBvdmVycmlkZXMgdGhlIGFscGhhIGNoYW5uZWwgb2YgdGhlIGJ1ZmZlci4KKyAgICBib29sIGlzT3BhcXVlID0gZmFsc2U7CisKKyAgICAvLyBIRFIgY29sb3Itc3BhY2Ugc2V0dGluZyBmb3IgWTQxMC4KKyAgICBib29sIGlzWTQxMEJUMjAyMCA9IGZhbHNlOworICAgIGZsb2F0IG1heE1hc3RlcmluZ0x1bWluYW5jZSA9IDAuMDsKKyAgICBmbG9hdCBtYXhDb250ZW50THVtaW5hbmNlID0gMC4wOworfTsKKworLy8gTWV0YWRhdGEgZGVzY3JpYmluZyB0aGUgbGF5ZXIgZ2VvbWV0cnkuCitzdHJ1Y3QgR2VvbWV0cnkgeworICAgIC8vIEJvdW5kYXJpZXMgb2YgdGhlIGxheWVyLgorICAgIEZsb2F0UmVjdCBib3VuZGFyaWVzID0gRmxvYXRSZWN0KCk7CisKKyAgICAvLyBUcmFuc2Zvcm0gbWF0cml4IHRvIGFwcGx5IHRvIG1lc2ggY29vcmRpbmF0ZXMuCisgICAgbWF0NCBwb3NpdGlvblRyYW5zZm9ybSA9IG1hdDQoKTsKKworICAgIC8vIFJhZGl1cyBvZiByb3VuZGVkIGNvcm5lcnMsIGlmIGdyZWF0ZXIgdGhhbiAwLiBPdGhlcndpc2UsIHRoaXMgbGF5ZXIncworICAgIC8vIGNvcm5lcnMgYXJlIG5vdCByb3VuZGVkLgorICAgIC8vIEhhdmluZyBjb3JuZXIgcmFkaXVzIHdpbGwgZm9yY2UgR1BVIGNvbXBvc2l0aW9uIG9uIHRoZSBsYXllciBhbmQgaXRzIGNoaWxkcmVuLCBkcmF3aW5nIGl0CisgICAgLy8gd2l0aCBhIHNwZWNpYWwgc2hhZGVyLiBUaGUgc2hhZGVyIHdpbGwgcmVjZWl2ZSB0aGUgcmFkaXVzIGFuZCB0aGUgY3JvcCByZWN0YW5nbGUgYXMgaW5wdXQsCisgICAgLy8gbW9kaWZ5aW5nIHRoZSBvcGFjaXR5IG9mIHRoZSBkZXN0aW5hdGlvbiB0ZXh0dXJlLCBtdWx0aXBseWluZyBpdCBieSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuCisgICAgLy8gV2UgcXVlcnkgTGF5ZXIjZ2V0Um91bmRlZENvcm5lclN0YXRlKCkgdG8gcmV0cmlldmUgdGhlIHJhZGl1cyBhcyB3ZWxsIGFzIHRoZSByb3VuZGVkIGNyb3AKKyAgICAvLyByZWN0YW5nbGUgdG8gZmlndXJlIG91dCBob3cgdG8gYXBwbHkgdGhlIHJhZGl1cyBmb3IgdGhpcyBsYXllci4gVGhlIGNyb3AgcmVjdGFuZ2xlIHdpbGwgYmUKKyAgICAvLyBpbiBsb2NhbCBsYXllciBjb29yZGluYXRlIHNwYWNlLCBzbyB3ZSBoYXZlIHRvIHRha2UgdGhlIGxheWVyIHRyYW5zZm9ybSBpbnRvIGFjY291bnQgd2hlbgorICAgIC8vIHdhbGtpbmcgdXAgdGhlIHRyZWUuCisgICAgZmxvYXQgcm91bmRlZENvcm5lcnNSYWRpdXMgPSAwLjA7CisKKyAgICAvLyBSZWN0YW5nbGUgd2l0aGluIHdoaWNoIGNvcm5lcnMgd2lsbCBiZSByb3VuZGVkLgorICAgIEZsb2F0UmVjdCByb3VuZGVkQ29ybmVyc0Nyb3AgPSBGbG9hdFJlY3QoKTsKK307CisKKy8vIERlc2NyaXB0b3Igb2YgdGhlIHNvdXJjZSBwaXhlbHMgZm9yIHRoaXMgbGF5ZXIuCitzdHJ1Y3QgUGl4ZWxTb3VyY2UgeworICAgIC8vIFNvdXJjZSBidWZmZXIKKyAgICBCdWZmZXIgYnVmZmVyID0gQnVmZmVyKCk7CisKKyAgICAvLyBUaGUgc29saWQgY29sb3Igd2l0aCB3aGljaCB0byBmaWxsIHRoZSBsYXllci4KKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHBvcHVsYXRlZCBpZiB3ZSBkb24ndCByZW5kZXIgZnJvbSBhbiBhcHBsaWNhdGlvbgorICAgIC8vIGJ1ZmZlci4KKyAgICBoYWxmMyBzb2xpZENvbG9yID0gaGFsZjMoMC4wZiwgMC4wZiwgMC4wZik7Cit9OworCisvKgorICogQ29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzaGFkb3dzIGRyYXduIGJ5IHNpbmdsZSBsYXllci4gU2hhZG93IGZvbGxvd3MKKyAqIG1hdGVyaWFsIGRlc2lnbiBndWlkZWxpbmVzLgorICovCitzdHJ1Y3QgU2hhZG93U2V0dGluZ3MgeworICAgIC8vIENvbG9yIHRvIHRoZSBhbWJpZW50IHNoYWRvdy4gVGhlIGFscGhhIGlzIHByZW11bHRpcGxpZWQuCisgICAgdmVjNCBhbWJpZW50Q29sb3IgPSB2ZWM0KCk7CisKKyAgICAvLyBDb2xvciB0byB0aGUgc3BvdCBzaGFkb3cuIFRoZSBhbHBoYSBpcyBwcmVtdWx0aXBsaWVkLiBUaGUgcG9zaXRpb24gb2YgdGhlIHNwb3Qgc2hhZG93CisgICAgLy8gZGVwZW5kcyBvbiB0aGUgbGlnaHQgcG9zaXRpb24uCisgICAgdmVjNCBzcG90Q29sb3IgPSB2ZWM0KCk7CisKKyAgICAvLyBQb3NpdGlvbiBvZiB0aGUgbGlnaHQgc291cmNlIHVzZWQgdG8gY2FzdCB0aGUgc3BvdCBzaGFkb3cuCisgICAgdmVjMyBsaWdodFBvcyA9IHZlYzMoKTsKKworICAgIC8vIFJhZGl1cyBvZiB0aGUgc3BvdCBsaWdodCBzb3VyY2UuIFNtYWxsZXIgcmFkaXVzIHdpbGwgaGF2ZSBzaGFycGVyIGVkZ2VzLAorICAgIC8vIGxhcmdlciByYWRpdXMgd2lsbCBoYXZlIHNvZnRlciBzaGFkb3dzCisgICAgZmxvYXQgbGlnaHRSYWRpdXMgPSAwLmY7CisKKyAgICAvLyBMZW5ndGggb2YgdGhlIGNhc3Qgc2hhZG93LiBJZiBsZW5ndGggaXMgPD0gMC5mIG5vIHNoYWRvd3Mgd2lsbCBiZSBkcmF3bi4KKyAgICBmbG9hdCBsZW5ndGggPSAwLmY7CisKKyAgICAvLyBJZiB0cnVlIGZpbGwgaW4gdGhlIGNhc3RpbmcgbGF5ZXIgaXMgdHJhbnNsdWNlbnQgYW5kIHRoZSBzaGFkb3cgbmVlZHMgdG8gZmlsbCB0aGUgYm91bmRzLgorICAgIC8vIE90aGVyd2lzZSB0aGUgc2hhZG93IHdpbGwgb25seSBiZSBkcmF3biBhcm91bmQgdGhlIGVkZ2VzIG9mIHRoZSBjYXN0aW5nIGxheWVyLgorICAgIGJvb2wgY2FzdGVySXNUcmFuc2x1Y2VudCA9IGZhbHNlOworfTsKKworLy8gVGhlIHNldHRpbmdzIHRoYXQgUmVuZGVyRW5naW5lIHJlcXVpcmVzIGZvciBjb3JyZWN0bHkgcmVuZGVyaW5nIGEgTGF5ZXIuCitzdHJ1Y3QgTGF5ZXJTZXR0aW5ncyB7CisgICAgLy8gR2VvbWV0cnkgaW5mb3JtYXRpb24KKyAgICBHZW9tZXRyeSBnZW9tZXRyeSA9IEdlb21ldHJ5KCk7CisKKyAgICAvLyBTb3VyY2UgcGl4ZWxzIGZvciB0aGlzIGxheWVyLgorICAgIFBpeGVsU291cmNlIHNvdXJjZSA9IFBpeGVsU291cmNlKCk7CisKKyAgICAvLyBBbHBoYSBvcHRpb24gdG8gYmxlbmQgd2l0aCB0aGUgc291cmNlIHBpeGVscworICAgIGhhbGYgYWxwaGEgPSBoYWxmKDAuMCk7CisKKyAgICAvLyBDb2xvciBzcGFjZSBkZXNjcmliaW5nIGhvdyB0aGUgc291cmNlIHBpeGVscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQuCisgICAgdWk6OkRhdGFzcGFjZSBzb3VyY2VEYXRhc3BhY2UgPSB1aTo6RGF0YXNwYWNlOjpVTktOT1dOOworCisgICAgLy8gQWRkaXRpb25hbCBsYXllci1zcGVjaWZpYyBjb2xvciB0cmFuc2Zvcm0gdG8gYmUgYXBwbGllZCBiZWZvcmUgdGhlIGdsb2JhbAorICAgIC8vIHRyYW5zZm9ybS4KKyAgICBtYXQ0IGNvbG9yVHJhbnNmb3JtID0gbWF0NCgpOworCisgICAgLy8gVHJ1ZSBpZiBibGVuZGluZyB3aWxsIGJlIGZvcmNlZCB0byBiZSBkaXNhYmxlZC4KKyAgICBib29sIGRpc2FibGVCbGVuZGluZyA9IGZhbHNlOworCisgICAgU2hhZG93U2V0dGluZ3Mgc2hhZG93OworCisgICAgaW50IGJhY2tncm91bmRCbHVyUmFkaXVzID0gMDsKK307CisKKy8vIEtlZXAgaW4gc3luYyB3aXRoIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIGluCisvLyBjb21wb3NpdGlvbmVuZ2luZS9pbXBsL0NsaWVudENvbXBvc2l0aW9uUmVxdWVzdENhY2hlLmNwcAorc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQnVmZmVyJiBsaHMsIGNvbnN0IEJ1ZmZlciYgcmhzKSB7CisgICAgcmV0dXJuIGxocy5idWZmZXIgPT0gcmhzLmJ1ZmZlciAmJiBsaHMuZmVuY2UgPT0gcmhzLmZlbmNlICYmCisgICAgICAgICAgICBsaHMudGV4dHVyZU5hbWUgPT0gcmhzLnRleHR1cmVOYW1lICYmCisgICAgICAgICAgICBsaHMudXNlVGV4dHVyZUZpbHRlcmluZyA9PSByaHMudXNlVGV4dHVyZUZpbHRlcmluZyAmJgorICAgICAgICAgICAgbGhzLnRleHR1cmVUcmFuc2Zvcm0gPT0gcmhzLnRleHR1cmVUcmFuc2Zvcm0gJiYKKyAgICAgICAgICAgIGxocy51c2VQcmVtdWx0aXBsaWVkQWxwaGEgPT0gcmhzLnVzZVByZW11bHRpcGxpZWRBbHBoYSAmJgorICAgICAgICAgICAgbGhzLmlzT3BhcXVlID09IHJocy5pc09wYXF1ZSAmJiBsaHMuaXNZNDEwQlQyMDIwID09IHJocy5pc1k0MTBCVDIwMjAgJiYKKyAgICAgICAgICAgIGxocy5tYXhNYXN0ZXJpbmdMdW1pbmFuY2UgPT0gcmhzLm1heE1hc3RlcmluZ0x1bWluYW5jZSAmJgorICAgICAgICAgICAgbGhzLm1heENvbnRlbnRMdW1pbmFuY2UgPT0gcmhzLm1heENvbnRlbnRMdW1pbmFuY2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEdlb21ldHJ5JiBsaHMsIGNvbnN0IEdlb21ldHJ5JiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmJvdW5kYXJpZXMgPT0gcmhzLmJvdW5kYXJpZXMgJiYgbGhzLnBvc2l0aW9uVHJhbnNmb3JtID09IHJocy5wb3NpdGlvblRyYW5zZm9ybSAmJgorICAgICAgICAgICAgbGhzLnJvdW5kZWRDb3JuZXJzUmFkaXVzID09IHJocy5yb3VuZGVkQ29ybmVyc1JhZGl1cyAmJgorICAgICAgICAgICAgbGhzLnJvdW5kZWRDb3JuZXJzQ3JvcCA9PSByaHMucm91bmRlZENvcm5lcnNDcm9wOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQaXhlbFNvdXJjZSYgbGhzLCBjb25zdCBQaXhlbFNvdXJjZSYgcmhzKSB7CisgICAgcmV0dXJuIGxocy5idWZmZXIgPT0gcmhzLmJ1ZmZlciAmJiBsaHMuc29saWRDb2xvciA9PSByaHMuc29saWRDb2xvcjsKK30KKworc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2hhZG93U2V0dGluZ3MmIGxocywgY29uc3QgU2hhZG93U2V0dGluZ3MmIHJocykgeworICAgIHJldHVybiBsaHMuYW1iaWVudENvbG9yID09IHJocy5hbWJpZW50Q29sb3IgJiYgbGhzLnNwb3RDb2xvciA9PSByaHMuc3BvdENvbG9yICYmCisgICAgICAgICAgICBsaHMubGlnaHRQb3MgPT0gcmhzLmxpZ2h0UG9zICYmIGxocy5saWdodFJhZGl1cyA9PSByaHMubGlnaHRSYWRpdXMgJiYKKyAgICAgICAgICAgIGxocy5sZW5ndGggPT0gcmhzLmxlbmd0aCAmJiBsaHMuY2FzdGVySXNUcmFuc2x1Y2VudCA9PSByaHMuY2FzdGVySXNUcmFuc2x1Y2VudDsKK30KKworc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTGF5ZXJTZXR0aW5ncyYgbGhzLCBjb25zdCBMYXllclNldHRpbmdzJiByaHMpIHsKKyAgICByZXR1cm4gbGhzLmdlb21ldHJ5ID09IHJocy5nZW9tZXRyeSAmJiBsaHMuc291cmNlID09IHJocy5zb3VyY2UgJiYgbGhzLmFscGhhID09IHJocy5hbHBoYSAmJgorICAgICAgICAgICAgbGhzLnNvdXJjZURhdGFzcGFjZSA9PSByaHMuc291cmNlRGF0YXNwYWNlICYmCisgICAgICAgICAgICBsaHMuY29sb3JUcmFuc2Zvcm0gPT0gcmhzLmNvbG9yVHJhbnNmb3JtICYmCisgICAgICAgICAgICBsaHMuZGlzYWJsZUJsZW5kaW5nID09IHJocy5kaXNhYmxlQmxlbmRpbmcgJiYgbGhzLnNoYWRvdyA9PSByaHMuc2hhZG93ICYmCisgICAgICAgICAgICBsaHMuYmFja2dyb3VuZEJsdXJSYWRpdXMgPT0gcmhzLmJhY2tncm91bmRCbHVyUmFkaXVzOworfQorCisvLyBEZWZpbmluZyBQcmludFRvIGhlbHBzIHdpdGggR29vZ2xlIFRlc3RzLgorCitzdGF0aWMgaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBCdWZmZXImIHNldHRpbmdzLCA6OnN0ZDo6b3N0cmVhbSogb3MpIHsKKyAgICAqb3MgPDwgIkJ1ZmZlciB7IjsKKyAgICAqb3MgPDwgIlxuICAgIC5idWZmZXIgPSAiIDw8IHNldHRpbmdzLmJ1ZmZlci5nZXQoKTsKKyAgICAqb3MgPDwgIlxuICAgIC5mZW5jZSA9ICIgPDwgc2V0dGluZ3MuZmVuY2UuZ2V0KCk7CisgICAgKm9zIDw8ICJcbiAgICAudGV4dHVyZU5hbWUgPSAiIDw8IHNldHRpbmdzLnRleHR1cmVOYW1lOworICAgICpvcyA8PCAiXG4gICAgLnVzZVRleHR1cmVGaWx0ZXJpbmcgPSAiIDw8IHNldHRpbmdzLnVzZVRleHR1cmVGaWx0ZXJpbmc7CisgICAgKm9zIDw8ICJcbiAgICAudGV4dHVyZVRyYW5zZm9ybSA9ICIgPDwgc2V0dGluZ3MudGV4dHVyZVRyYW5zZm9ybTsKKyAgICAqb3MgPDwgIlxuICAgIC51c2VQcmVtdWx0aXBsaWVkQWxwaGEgPSAiIDw8IHNldHRpbmdzLnVzZVByZW11bHRpcGxpZWRBbHBoYTsKKyAgICAqb3MgPDwgIlxuICAgIC5pc09wYXF1ZSA9ICIgPDwgc2V0dGluZ3MuaXNPcGFxdWU7CisgICAgKm9zIDw8ICJcbiAgICAuaXNZNDEwQlQyMDIwID0gIiA8PCBzZXR0aW5ncy5pc1k0MTBCVDIwMjA7CisgICAgKm9zIDw8ICJcbiAgICAubWF4TWFzdGVyaW5nTHVtaW5hbmNlID0gIiA8PCBzZXR0aW5ncy5tYXhNYXN0ZXJpbmdMdW1pbmFuY2U7CisgICAgKm9zIDw8ICJcbiAgICAubWF4Q29udGVudEx1bWluYW5jZSA9ICIgPDwgc2V0dGluZ3MubWF4Q29udGVudEx1bWluYW5jZTsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IEdlb21ldHJ5JiBzZXR0aW5ncywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJHZW9tZXRyeSB7IjsKKyAgICAqb3MgPDwgIlxuICAgIC5ib3VuZGFyaWVzID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLmJvdW5kYXJpZXMsIG9zKTsKKyAgICAqb3MgPDwgIlxuICAgIC5wb3NpdGlvblRyYW5zZm9ybSA9ICIgPDwgc2V0dGluZ3MucG9zaXRpb25UcmFuc2Zvcm07CisgICAgKm9zIDw8ICJcbiAgICAucm91bmRlZENvcm5lcnNSYWRpdXMgPSAiIDw8IHNldHRpbmdzLnJvdW5kZWRDb3JuZXJzUmFkaXVzOworICAgICpvcyA8PCAiXG4gICAgLnJvdW5kZWRDb3JuZXJzQ3JvcCA9ICI7CisgICAgUHJpbnRUbyhzZXR0aW5ncy5yb3VuZGVkQ29ybmVyc0Nyb3AsIG9zKTsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IFBpeGVsU291cmNlJiBzZXR0aW5ncywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJQaXhlbFNvdXJjZSB7IjsKKyAgICAqb3MgPDwgIlxuICAgIC5idWZmZXIgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3MuYnVmZmVyLCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAuc29saWRDb2xvciA9ICIgPDwgc2V0dGluZ3Muc29saWRDb2xvcjsKKyAgICAqb3MgPDwgIlxufSI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IFNoYWRvd1NldHRpbmdzJiBzZXR0aW5ncywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJTaGFkb3dTZXR0aW5ncyB7IjsKKyAgICAqb3MgPDwgIlxuICAgIC5hbWJpZW50Q29sb3IgPSAiIDw8IHNldHRpbmdzLmFtYmllbnRDb2xvcjsKKyAgICAqb3MgPDwgIlxuICAgIC5zcG90Q29sb3IgPSAiIDw8IHNldHRpbmdzLnNwb3RDb2xvcjsKKyAgICAqb3MgPDwgIlxuICAgIC5saWdodFBvcyA9ICIgPDwgc2V0dGluZ3MubGlnaHRQb3M7CisgICAgKm9zIDw8ICJcbiAgICAubGlnaHRSYWRpdXMgPSAiIDw8IHNldHRpbmdzLmxpZ2h0UmFkaXVzOworICAgICpvcyA8PCAiXG4gICAgLmxlbmd0aCA9ICIgPDwgc2V0dGluZ3MubGVuZ3RoOworICAgICpvcyA8PCAiXG4gICAgLmNhc3RlcklzVHJhbnNsdWNlbnQgPSAiIDw8IHNldHRpbmdzLmNhc3RlcklzVHJhbnNsdWNlbnQ7CisgICAgKm9zIDw8ICJcbn0iOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUHJpbnRUbyhjb25zdCBMYXllclNldHRpbmdzJiBzZXR0aW5ncywgOjpzdGQ6Om9zdHJlYW0qIG9zKSB7CisgICAgKm9zIDw8ICJMYXllclNldHRpbmdzIHsiOworICAgICpvcyA8PCAiXG4gICAgLmdlb21ldHJ5ID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLmdlb21ldHJ5LCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAuc291cmNlID0gIjsKKyAgICBQcmludFRvKHNldHRpbmdzLnNvdXJjZSwgb3MpOworICAgICpvcyA8PCAiXG4gICAgLmFscGhhID0gIiA8PCBzZXR0aW5ncy5hbHBoYTsKKyAgICAqb3MgPDwgIlxuICAgIC5zb3VyY2VEYXRhc3BhY2UgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3Muc291cmNlRGF0YXNwYWNlLCBvcyk7CisgICAgKm9zIDw8ICJcbiAgICAuY29sb3JUcmFuc2Zvcm0gPSAiIDw8IHNldHRpbmdzLmNvbG9yVHJhbnNmb3JtOworICAgICpvcyA8PCAiXG4gICAgLmRpc2FibGVCbGVuZGluZyA9ICIgPDwgc2V0dGluZ3MuZGlzYWJsZUJsZW5kaW5nOworICAgICpvcyA8PCAiXG4gICAgLmJhY2tncm91bmRCbHVyUmFkaXVzID0gIiA8PCBzZXR0aW5ncy5iYWNrZ3JvdW5kQmx1clJhZGl1czsKKyAgICAqb3MgPDwgIlxuICAgIC5zaGFkb3cgPSAiOworICAgIFByaW50VG8oc2V0dGluZ3Muc2hhZG93LCBvcyk7CisgICAgKm9zIDw8ICJcbn0iOworfQorCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9NZXNoLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvTWVzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2N2YxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvTWVzaC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNGX1JFTkRFUl9FTkdJTkVfTUVTSF9ICisjZGVmaW5lIFNGX1JFTkRFUl9FTkdJTkVfTUVTSF9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CisKK2NsYXNzIE1lc2ggeworcHVibGljOgorICAgIGNsYXNzIEJ1aWxkZXI7CisKKyAgICBlbnVtIFByaW1pdGl2ZSB7CisgICAgICAgIFRSSUFOR0xFUyA9IDB4MDAwNCwgICAgICAvLyBHTF9UUklBTkdMRVMKKyAgICAgICAgVFJJQU5HTEVfU1RSSVAgPSAweDAwMDUsIC8vIEdMX1RSSUFOR0xFX1NUUklQCisgICAgICAgIFRSSUFOR0xFX0ZBTiA9IDB4MDAwNiAgICAvLyBHTF9UUklBTkdMRV9GQU4KKyAgICB9OworCisgICAgfk1lc2goKSA9IGRlZmF1bHQ7CisKKyAgICAvKgorICAgICAqIFZlcnRleEFycmF5IGhhbmRsZXMgdGhlIHN0cmlkZSBhdXRvbWF0aWNhbGx5LgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgorICAgIGNsYXNzIFZlcnRleEFycmF5IHsKKyAgICAgICAgZnJpZW5kIGNsYXNzIE1lc2g7CisgICAgICAgIGZsb2F0KiBtRGF0YTsKKyAgICAgICAgc2l6ZV90IG1TdHJpZGU7CisgICAgICAgIHNpemVfdCBtT2Zmc2V0ID0gMDsKKyAgICAgICAgVmVydGV4QXJyYXkoZmxvYXQqIGRhdGEsIHNpemVfdCBzdHJpZGUpIDogbURhdGEoZGF0YSksIG1TdHJpZGUoc3RyaWRlKSB7fQorCisgICAgcHVibGljOgorICAgICAgICAvLyBSZXR1cm5zIGEgdmVydGV4IGFycmF5IGF0IGFuIG9mZnNldCBzbyBpdHMgZWFzaWVyIHRvIGFwcGVuZCBhdHRyaWJ1dGVzIGZyb20KKyAgICAgICAgLy8gbXVsdGlwbGUgc291cmNlcy4KKyAgICAgICAgVmVydGV4QXJyYXkoVmVydGV4QXJyYXk8VFlQRT4mIG90aGVyLCBzaXplX3Qgb2Zmc2V0KQorICAgICAgICAgICAgICA6IG1EYXRhKG90aGVyLm1EYXRhKSwgbVN0cmlkZShvdGhlci5tU3RyaWRlKSwgbU9mZnNldChvZmZzZXQpIHt9CisKKyAgICAgICAgVFlQRSYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oJm1EYXRhWyhpbmRleCArIG1PZmZzZXQpICogbVN0cmlkZV0pOworICAgICAgICB9CisgICAgICAgIFRZUEUgY29uc3QmIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VFlQRSBjb25zdCo+KCZtRGF0YVsoaW5kZXggKyBtT2Zmc2V0KSAqIG1TdHJpZGVdKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KKyAgICBWZXJ0ZXhBcnJheTxUWVBFPiBnZXRQb3NpdGlvbkFycmF5KCkgeworICAgICAgICByZXR1cm4gVmVydGV4QXJyYXk8VFlQRT4oZ2V0UG9zaXRpb25zKCksIG1TdHJpZGUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgorICAgIFZlcnRleEFycmF5PFRZUEU+IGdldFRleENvb3JkQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBWZXJ0ZXhBcnJheTxUWVBFPihnZXRUZXhDb29yZHMoKSwgbVN0cmlkZSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+CisgICAgVmVydGV4QXJyYXk8VFlQRT4gZ2V0Q3JvcENvb3JkQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBWZXJ0ZXhBcnJheTxUWVBFPihnZXRDcm9wQ29vcmRzKCksIG1TdHJpZGUpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgorICAgIFZlcnRleEFycmF5PFRZUEU+IGdldFNoYWRvd0NvbG9yQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBWZXJ0ZXhBcnJheTxUWVBFPihnZXRTaGFkb3dDb2xvcigpLCBtU3RyaWRlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KKyAgICBWZXJ0ZXhBcnJheTxUWVBFPiBnZXRTaGFkb3dQYXJhbXNBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIFZlcnRleEFycmF5PFRZUEU+KGdldFNoYWRvd1BhcmFtcygpLCBtU3RyaWRlKTsKKyAgICB9CisKKyAgICB1aW50MTZfdCogZ2V0SW5kaWNlc0FycmF5KCkgeyByZXR1cm4gZ2V0SW5kaWNlcygpOyB9CisKKyAgICBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmVydGljZXMgcG9zaXRpb25zCisgICAgZmxvYXQgY29uc3QqIGdldFBvc2l0aW9ucygpIGNvbnN0OworCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZlcnRpY2VzIHRleHR1cmUgY29vcmRpbmF0ZXMKKyAgICBmbG9hdCBjb25zdCogZ2V0VGV4Q29vcmRzKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmVydGljZXMgY3JvcCBjb29yZGluYXRlcworICAgIGZsb2F0IGNvbnN0KiBnZXRDcm9wQ29vcmRzKCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBjb2xvcnMKKyAgICBmbG9hdCBjb25zdCogZ2V0U2hhZG93Q29sb3IoKSBjb25zdDsKKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzaGFkb3cgcGFyYW1zCisgICAgZmxvYXQgY29uc3QqIGdldFNoYWRvd1BhcmFtcygpIGNvbnN0OworCisgICAgLy8gcmV0dXJucyBhIHBvaW50ZXIgdG8gaW5kaWNlcworICAgIHVpbnQxNl90IGNvbnN0KiBnZXRJbmRpY2VzKCkgY29uc3Q7CisKKyAgICAvLyBudW1iZXIgb2YgdmVydGljZXMgaW4gdGhpcyBtZXNoCisgICAgc2l6ZV90IGdldFZlcnRleENvdW50KCkgY29uc3Q7CisKKyAgICAvLyBkaW1lbnNpb24gb2YgdmVydGljZXMKKyAgICBzaXplX3QgZ2V0VmVydGV4U2l6ZSgpIGNvbnN0OworCisgICAgLy8gZGltZW5zaW9uIG9mIHRleHR1cmUgY29vcmRpbmF0ZXMKKyAgICBzaXplX3QgZ2V0VGV4Q29vcmRzU2l6ZSgpIGNvbnN0OworCisgICAgc2l6ZV90IGdldFNoYWRvd1BhcmFtc1NpemUoKSBjb25zdDsKKworICAgIHNpemVfdCBnZXRTaGFkb3dDb2xvclNpemUoKSBjb25zdDsKKworICAgIHNpemVfdCBnZXRJbmRleENvdW50KCkgY29uc3Q7CisKKyAgICAvLyByZXR1cm4gc3RyaWRlIGluIGJ5dGVzCisgICAgc2l6ZV90IGdldEJ5dGVTdHJpZGUoKSBjb25zdDsKKworICAgIC8vIHJldHVybiBzdHJpZGUgaW4gZmxvYXRzCisgICAgc2l6ZV90IGdldFN0cmlkZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIE1lc2goUHJpbWl0aXZlIHByaW1pdGl2ZSwgc2l6ZV90IHZlcnRleENvdW50LCBzaXplX3QgdmVydGV4U2l6ZSwgc2l6ZV90IHRleENvb3JkU2l6ZSwKKyAgICAgICAgIHNpemVfdCBjcm9wQ29vcmRzU2l6ZSwgc2l6ZV90IHNoYWRvd0NvbG9yU2l6ZSwgc2l6ZV90IHNoYWRvd1BhcmFtc1NpemUsIHNpemVfdCBpbmRleENvdW50KTsKKyAgICBNZXNoKGNvbnN0IE1lc2gmKTsKKyAgICBNZXNoJiBvcGVyYXRvcj0oY29uc3QgTWVzaCYpOworICAgIE1lc2ggY29uc3QmIG9wZXJhdG9yPShjb25zdCBNZXNoJikgY29uc3Q7CisKKyAgICBmbG9hdCogZ2V0UG9zaXRpb25zKCk7CisgICAgZmxvYXQqIGdldFRleENvb3JkcygpOworICAgIGZsb2F0KiBnZXRDcm9wQ29vcmRzKCk7CisgICAgZmxvYXQqIGdldFNoYWRvd0NvbG9yKCk7CisgICAgZmxvYXQqIGdldFNoYWRvd1BhcmFtcygpOworICAgIHVpbnQxNl90KiBnZXRJbmRpY2VzKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbVZlcnRpY2VzOworICAgIHNpemVfdCBtVmVydGV4Q291bnQ7CisgICAgc2l6ZV90IG1WZXJ0ZXhTaXplOworICAgIHNpemVfdCBtVGV4Q29vcmRzU2l6ZTsKKyAgICBzaXplX3QgbUNyb3BDb29yZHNTaXplOworICAgIHNpemVfdCBtU2hhZG93Q29sb3JTaXplOworICAgIHNpemVfdCBtU2hhZG93UGFyYW1zU2l6ZTsKKyAgICBzaXplX3QgbVN0cmlkZTsKKyAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gbUluZGljZXM7CisgICAgc2l6ZV90IG1JbmRleENvdW50OworfTsKKworY2xhc3MgTWVzaDo6QnVpbGRlciB7CitwdWJsaWM6CisgICAgQnVpbGRlciYgc2V0UHJpbWl0aXZlKFByaW1pdGl2ZSBwcmltaXRpdmUpIHsKKyAgICAgICAgbVByaW1pdGl2ZSA9IHByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH07CisgICAgQnVpbGRlciYgc2V0VmVydGljZXMoc2l6ZV90IHZlcnRleENvdW50LCBzaXplX3QgdmVydGV4U2l6ZSkgeworICAgICAgICBtVmVydGV4Q291bnQgPSB2ZXJ0ZXhDb3VudDsKKyAgICAgICAgbVZlcnRleFNpemUgPSB2ZXJ0ZXhTaXplOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKyAgICBCdWlsZGVyJiBzZXRUZXhDb29yZHMoc2l6ZV90IHRleENvb3Jkc1NpemUpIHsKKyAgICAgICAgbVRleENvb3Jkc1NpemUgPSB0ZXhDb29yZHNTaXplOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKyAgICBCdWlsZGVyJiBzZXRDcm9wQ29vcmRzKHNpemVfdCBjcm9wQ29vcmRzU2l6ZSkgeworICAgICAgICBtQ3JvcENvb3Jkc1NpemUgPSBjcm9wQ29vcmRzU2l6ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH07CisgICAgQnVpbGRlciYgc2V0U2hhZG93QXR0cnMoKSB7CisgICAgICAgIG1TaGFkb3dQYXJhbXNTaXplID0gMzsKKyAgICAgICAgbVNoYWRvd0NvbG9yU2l6ZSA9IDQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9OworICAgIEJ1aWxkZXImIHNldEluZGljZXMoc2l6ZV90IGluZGV4Q291bnQpIHsKKyAgICAgICAgbUluZGV4Q291bnQgPSBpbmRleENvdW50OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfTsKKyAgICBNZXNoIGJ1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTWVzaHttUHJpbWl0aXZlLCAgICAgIG1WZXJ0ZXhDb3VudCwgICAgIG1WZXJ0ZXhTaXplLCAgICAgICBtVGV4Q29vcmRzU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbUNyb3BDb29yZHNTaXplLCBtU2hhZG93Q29sb3JTaXplLCBtU2hhZG93UGFyYW1zU2l6ZSwgbUluZGV4Q291bnR9OworICAgIH0KKworcHJpdmF0ZToKKyAgICBzaXplX3QgbVZlcnRleENvdW50ID0gMDsKKyAgICBzaXplX3QgbVZlcnRleFNpemUgPSAwOworICAgIHNpemVfdCBtVGV4Q29vcmRzU2l6ZSA9IDA7CisgICAgc2l6ZV90IG1Dcm9wQ29vcmRzU2l6ZSA9IDA7CisgICAgc2l6ZV90IG1TaGFkb3dDb2xvclNpemUgPSAwOworICAgIHNpemVfdCBtU2hhZG93UGFyYW1zU2l6ZSA9IDA7CisgICAgc2l6ZV90IG1JbmRleENvdW50ID0gMDsKKyAgICBQcmltaXRpdmUgbVByaW1pdGl2ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmIC8qIFNGX1JFTkRFUl9FTkdJTkVfTUVTSF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczZDA3YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9SZW5kZXJFbmdpbmUuaApAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTRl9SRU5ERVJFTkdJTkVfSF8KKyNkZWZpbmUgU0ZfUkVOREVSRU5HSU5FX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8bWF0aC9tYXQ0Lmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0Rpc3BsYXlTZXR0aW5ncy5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9GcmFtZWJ1ZmZlci5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9JbWFnZS5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9MYXllclNldHRpbmdzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY1R5cGVzLmg+CisjaW5jbHVkZSA8dWkvVHJhbnNmb3JtLmg+CisKKy8qKgorICogQWxsb3dzIHRvIHNldCBSZW5kZXJFbmdpbmUgYmFja2VuZCB0byBHTEVTIChkZWZhdWx0KSBvciBWdWxrYW4gKE5PVCB5ZXQgc3VwcG9ydGVkKS4KKyAqLworI2RlZmluZSBQUk9QRVJUWV9ERUJVR19SRU5ERVJFTkdJTkVfQkFDS0VORCAiZGVidWcuc3RhZ2VmcmlnaHQucmVuZGVyZW5naW5lLmJhY2tlbmQiCisKK3N0cnVjdCBBTmF0aXZlV2luZG93QnVmZmVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFJlY3Q7CitjbGFzcyBSZWdpb247CisKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitjbGFzcyBCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcjsKK2NsYXNzIEltYWdlOworY2xhc3MgTWVzaDsKK2NsYXNzIFRleHR1cmU7CitzdHJ1Y3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzOworCituYW1lc3BhY2UgdGhyZWFkZWQgeworY2xhc3MgUmVuZGVyRW5naW5lVGhyZWFkZWQ7Cit9CisKK25hbWVzcGFjZSBpbXBsIHsKK2NsYXNzIFJlbmRlckVuZ2luZTsKK30KKworZW51bSBjbGFzcyBQcm90ZWN0aW9uIHsKKyAgICBVTlBST1RFQ1RFRCA9IDEsCisgICAgUFJPVEVDVEVEID0gMiwKK307CisKK2NsYXNzIFJlbmRlckVuZ2luZSB7CitwdWJsaWM6CisgICAgZW51bSBjbGFzcyBDb250ZXh0UHJpb3JpdHkgeworICAgICAgICBMT1cgPSAxLAorICAgICAgICBNRURJVU0gPSAyLAorICAgICAgICBISUdIID0gMywKKyAgICB9OworCisgICAgZW51bSBjbGFzcyBSZW5kZXJFbmdpbmVUeXBlIHsKKyAgICAgICAgR0xFUyA9IDEsCisgICAgICAgIFRIUkVBREVEID0gMiwKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJFbmdpbmU+IGNyZWF0ZShjb25zdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3MmIGFyZ3MpOworCisgICAgdmlydHVhbCB+UmVuZGVyRW5naW5lKCkgPSAwOworCisgICAgLy8gLS0tLS0gQkVHSU4gREVQUkVDQVRFRCBJTlRFUkZBQ0UgLS0tLS0KKyAgICAvLyBUaGlzIGludGVyZmFjZSwgd2hpbGUgc3RpbGwgaW4gdXNlIHVudGlsIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgaXMgYnVpbHQsCisgICAgLy8gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVwcmVjYXRlZCwgbWludXMgc29tZSBtZXRob2RzIHdoaWNoIHN0aWxsIG1heSBiZQorICAgIC8vIHVzZWQgdG8gc3VwcG9ydCBsZWdhY3kgYmVoYXZpb3IuCisgICAgdmlydHVhbCB2b2lkIHByaW1lQ2FjaGUoKSBjb25zdCA9IDA7CisKKyAgICAvLyBkdW1wIHRoZSBleHRlbnNpb24gc3RyaW5ncy4gYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MuCisgICAgdmlydHVhbCB2b2lkIGR1bXAoc3RkOjpzdHJpbmcmIHJlc3VsdCkgPSAwOworCisgICAgdmlydHVhbCBib29sIHVzZU5hdGl2ZUZlbmNlU3luYygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgdXNlV2FpdFN5bmMoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGdlblRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QqIG5hbWVzKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGJpbmRFeHRlcm5hbFRleHR1cmVJbWFnZSh1aW50MzJfdCB0ZXhOYW1lLCBjb25zdCBJbWFnZSYgaW1hZ2UpID0gMDsKKyAgICAvLyBMZWdhY3kgcHVibGljIG1ldGhvZCB1c2VkIGJ5IGRldmljZXMgdGhhdCBkb24ndCBzdXBwb3J0IG5hdGl2ZSBmZW5jZQorICAgIC8vIHN5bmNocm9uaXphdGlvbiBpbiB0aGVpciBHUFUgZHJpdmVyLCBhcyB0aGlzIG1ldGhvZCBwcm92aWRlcyBpbXBsaWNpdAorICAgIC8vIHN5bmNocm9uaXphdGlvbiBmb3IgbGF0Y2hpbmcgYnVmZmVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RmVuY2U+JiBmZW5jZSkgPSAwOworICAgIC8vIENhY2hlcyBJbWFnZSByZXNvdXJjZXMgZm9yIHRoaXMgYnVmZmVyLCBidXQgZG9lcyBub3QgYmluZCB0aGUgYnVmZmVyIHRvCisgICAgLy8gYSBwYXJ0aWN1bGFyIHRleHR1cmUuCisgICAgLy8gTm90ZSB0aGF0IHdvcmsgaXMgZGVmZXJyZWQgdG8gYW4gYWRkaXRpb25hbCB0aHJlYWQsIGkuZS4gdGhpcyBjYWxsCisgICAgLy8gaXMgbWFkZSBhc3luY2hyb25vdXNseSwgYnV0IHRoZSBjYWxsZXIgY2FuIGV4cGVjdCB0aGF0IGNhY2hlL3VuYmluZCBjYWxscworICAgIC8vIGFyZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgdGhhdCdzIGNvbmZsaWN0IHNlcmlhbGl6YWJsZSwgaS5lLiB1bmJpbmRpbmcKKyAgICAvLyBhIGJ1ZmZlciBzaG91bGQgbmV2ZXIgb2NjdXIgYmVmb3JlIGJpbmRpbmcgdGhlIGJ1ZmZlciBpZiB0aGUgY2FsbGVyCisgICAgLy8gY2FsbGVkIHtiaW5kLCBjYWNoZX1FeHRlcm5hbFRleHR1cmVCdWZmZXIgYmVmb3JlIGNhbGxpbmcgdW5iaW5kLgorICAgIHZpcnR1YWwgdm9pZCBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSA9IDA7CisgICAgLy8gUmVtb3ZlcyBpbnRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYnVmZmVySWQuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQorICAgIC8vIGludm9rZWQgd2hlbiB0aGUgY2FsbGVyIHdpbGwgbm8gbG9uZ2VyIGhvbGQgYSByZWZlcmVuY2UgdG8gYSBHcmFwaGljQnVmZmVyCisgICAgLy8gYW5kIG5lZWRzIHRvIGNsZWFuIHVwIGl0cyByZXNvdXJjZXMuCisgICAgLy8gTm90ZSB0aGF0IHdvcmsgaXMgZGVmZXJyZWQgdG8gYW4gYWRkaXRpb25hbCB0aHJlYWQsIGkuZS4gdGhpcyBjYWxsCisgICAgLy8gaXMgbWFkZSBhc3luY2hyb25vdXNseSwgYnV0IHRoZSBjYWxsZXIgY2FuIGV4cGVjdCB0aGF0IGNhY2hlL3VuYmluZCBjYWxscworICAgIC8vIGFyZSBwZXJmb3JtZWQgaW4gYSBtYW5uZXIgdGhhdCdzIGNvbmZsaWN0IHNlcmlhbGl6YWJsZSwgaS5lLiB1bmJpbmRpbmcKKyAgICAvLyBhIGJ1ZmZlciBzaG91bGQgbmV2ZXIgb2NjdXIgYmVmb3JlIGJpbmRpbmcgdGhlIGJ1ZmZlciBpZiB0aGUgY2FsbGVyCisgICAgLy8gY2FsbGVkIHtiaW5kLCBjYWNoZX1FeHRlcm5hbFRleHR1cmVCdWZmZXIgYmVmb3JlIGNhbGxpbmcgdW5iaW5kLgorICAgIHZpcnR1YWwgdm9pZCB1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDY0X3QgYnVmZmVySWQpID0gMDsKKyAgICAvLyBXaGVuIGJpbmRpbmcgYSBuYXRpdmUgYnVmZmVyLCBpdCBtdXN0IGJlIGRvbmUgYmVmb3JlIHNldFZpZXdwb3J0QW5kUHJvamVjdGlvbgorICAgIC8vIFJldHVybnMgTk9fRVJST1Igd2hlbiBiaW5kcyBzdWNjZXNzZnVsbHksIE5PX01FTU9SWSB3aGVuIHRoZXJlJ3Mgbm8gbWVtb3J5IGZvciBhbGxvY2F0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgdm9pZCB1bmJpbmRGcmFtZUJ1ZmZlcihGcmFtZWJ1ZmZlciogZnJhbWVidWZmZXIpID0gMDsKKworICAgIGVudW0gY2xhc3MgQ2xlYW51cE1vZGUgeworICAgICAgICBDTEVBTl9PVVRQVVRfUkVTT1VSQ0VTLAorICAgICAgICBDTEVBTl9BTEwsCisgICAgfTsKKyAgICAvLyBDbGVhbi11cCBtZXRob2QgdGhhdCBzaG91bGQgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZCBhZnRlciB0aGUKKyAgICAvLyBkcmF3RmVuY2UgcmV0dXJuZWQgYnkgZHJhd0xheWVycyBmaXJlcy4gVGhpcyBtZXRob2Qgd2lsbCBmcmVlIHVwCisgICAgLy8gcmVzb3VyY2VzIHVzZWQgYnkgdGhlIG1vc3QgcmVjZW50bHkgZHJhd24gZnJhbWUuIElmIHRoZSBmcmFtZSBpcyBzdGlsbAorICAgIC8vIGJlaW5nIGRyYXduLCB0aGVuIHRoaXMgY2FsbCBpcyBzaWxlbnRseSBpZ25vcmVkLgorICAgIC8vCisgICAgLy8gSWYgbW9kZSBpcyBDTEVBTl9PVVRQVVRfUkVTT1VSQ0VTLCB0aGVuIG9ubHkgcmVzb3VyY2VzIHJlbGF0ZWQgdG8gdGhlCisgICAgLy8gb3V0cHV0IGZyYW1lYnVmZmVyIGFyZSBjbGVhbmVkIHVwLCBpbmNsdWRpbmcgdGhlIHNpYmxpbmcgdGV4dHVyZS4KKyAgICAvLworICAgIC8vIElmIG1vZGUgaXMgQ0xFQU5fQUxMLCB0aGVuIHdlIGFsc28gY2xlYW51cCByZXNvdXJjZXMgcmVsYXRlZCB0byBhbnkgaW5wdXQKKyAgICAvLyBidWZmZXJzLgorICAgIC8vCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHJlc291cmNlcyB3ZXJlIGNsZWFuZWQgdXAsIGFuZCBmYWxzZSBpZiB3ZSBkaWRuJ3QgbmVlZCB0bworICAgIC8vIGRvIGFueSB3b3JrLgorICAgIHZpcnR1YWwgYm9vbCBjbGVhbnVwUG9zdFJlbmRlcihDbGVhbnVwTW9kZSBtb2RlID0gQ2xlYW51cE1vZGU6OkNMRUFOX09VVFBVVF9SRVNPVVJDRVMpID0gMDsKKworICAgIC8vIHF1ZXJpZXMKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRNYXhUZXh0dXJlU2l6ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCBnZXRNYXhWaWV3cG9ydERpbXMoKSBjb25zdCA9IDA7CisKKyAgICAvLyAtLS0tLSBFTkQgREVQUkVDQVRFRCBJTlRFUkZBQ0UgLS0tLS0KKworICAgIC8vIC0tLS0tIEJFR0lOIE5FVyBJTlRFUkZBQ0UgLS0tLS0KKworICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KGJvb2wgdXNlUHJvdGVjdGVkQ29udGV4dCkgPSAwOworCisgICAgLy8gUmVuZGVycyBsYXllcnMgZm9yIGEgcGFydGljdWxhciBkaXNwbGF5IHZpYSBHUFUgY29tcG9zaXRpb24uIFRoaXMgbWV0aG9kCisgICAgLy8gc2hvdWxkIGJlIGNhbGxlZCBmb3IgZXZlcnkgZGlzcGxheSB0aGF0IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHZpYSB0aGUgR1BVLgorICAgIC8vIEBwYXJhbSBkaXNwbGF5IFRoZSBkaXNwbGF5LXdpZGUgc2V0dGluZ3MgdGhhdCBzaG91bGQgYmUgYXBwbGllZCBwcmlvciB0bworICAgIC8vIGRyYXdpbmcgYW55IGxheWVycy4KKyAgICAvLworICAgIC8vIEFzc3VtcHRpb25zIHdoZW4gY2FsbGluZyB0aGlzIG1ldGhvZDoKKyAgICAvLyAxLiBUaGVyZSBpcyBleGFjdGx5IG9uZSBjYWxsZXIgLSBpLmUuIG11bHRpLXRocmVhZGluZyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIC8vIDIuIEFkZGl0aW9uYWwgdGhyZWFkcyBtYXkgYmUgY2FsbGluZyB0aGUge2JpbmQsY2FjaGV9RXh0ZXJuYWxUZXh0dXJlCisgICAgLy8gbWV0aG9kcyBhYm92ZS4gQnV0IHRoZSBtYWluIHRocmVhZCBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyByZXNvdXJjZXMKKyAgICAvLyBzdWNoIHRoYXQgSW1hZ2UgZGVzdHJ1Y3Rpb24gZG9lcyBub3Qgb2NjdXIgd2hpbGUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgorICAgIC8vCisgICAgLy8gVE9ETyhiLzEzNjgwNjM0Mik6IFRoaXMgc2hvdWxkIGJlaGF2aW9yIHNob3VsZCBpZGVhbGx5IGJlIGZpeGVkIHNpbmNlCisgICAgLy8gdGhlIGFib3ZlIHR3byBhc3N1bXB0aW9ucyBhcmUgYnJpdHRsZSwgYXMgY29uZGl0aW9uYWwgdGhyZWFkIHNhZmV0eW5lc3MKKyAgICAvLyBtYXkgYmUgaW5zdWZmaWNpZW50IHdoZW4gbWF4aW1pemluZyByZW5kZXJpbmcgcGVyZm9ybWFuY2UgaW4gdGhlIGZ1dHVyZS4KKyAgICAvLworICAgIC8vIEBwYXJhbSBsYXllcnMgVGhlIGxheWVycyB0byBkcmF3IG9udG8gdGhlIGRpc3BsYXksIGluIFotb3JkZXIuCisgICAgLy8gQHBhcmFtIGJ1ZmZlciBUaGUgYnVmZmVyIHdoaWNoIHdpbGwgYmUgZHJhd24gdG8uIFRoaXMgYnVmZmVyIHdpbGwgYmUKKyAgICAvLyByZWFkeSBvbmNlIGRyYXdGZW5jZSBmaXJlcy4KKyAgICAvLyBAcGFyYW0gdXNlRnJhbWVidWZmZXJDYWNoZSBUcnVlIGlmIHRoZSBmcmFtZWJ1ZmZlciBjYWNoZSBzaG91bGQgYmUgdXNlZC4KKyAgICAvLyBJZiBhbiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjYWNoZSBvdXRwdXQgZnJhbWVidWZmZXJzLCB0aGVuIHRoaXMKKyAgICAvLyBwYXJhbWV0ZXIgZG9lcyBub3RoaW5nLgorICAgIC8vIEBwYXJhbSBidWZmZXJGZW5jZSBGZW5jZSBzaWduYWxsaW5nIHRoYXQgdGhlIGJ1ZmZlciBpcyByZWFkeSB0byBiZSBkcmF3bgorICAgIC8vIHRvLgorICAgIC8vIEBwYXJhbSBkcmF3RmVuY2UgQSBwb2ludGVyIHRvIGEgZmVuY2UsIHdoaWNoIHdpbGwgZmlyZSB3aGVuIHRoZSBidWZmZXIKKyAgICAvLyBoYXMgYmVlbiBkcmF3biB0byBhbmQgaXMgcmVhZHkgdG8gYmUgZXhhbWluZWQuIFRoZSBmZW5jZSB3aWxsIGJlCisgICAgLy8gaW5pdGlhbGl6ZWQgYnkgdGhpcyBtZXRob2QuIFRoZSBjYWxsZXIgd2lsbCBiZSByZXNwb25zaWJsZSBmb3Igb3duaW5nIHRoZQorICAgIC8vIGZlbmNlLgorICAgIC8vIEByZXR1cm4gQW4gZXJyb3IgY29kZSBpbmRpY2F0aW5nIHdoZXRoZXIgZHJhd2luZyB3YXMgc3VjY2Vzc2Z1bC4gRm9yCisgICAgLy8gbm93LCB0aGlzIGFsd2F5cyByZXR1cm5zIE5PX0VSUk9SLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhd0xheWVycyhjb25zdCBEaXNwbGF5U2V0dGluZ3MmIGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IExheWVyU2V0dGluZ3MqPiYgbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLCBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OnVuaXF1ZV9mZCYmIGJ1ZmZlckZlbmNlLCBiYXNlOjp1bmlxdWVfZmQqIGRyYXdGZW5jZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gR2V0cyBhIGZyYW1lYnVmZmVyIHRvIHJlbmRlciB0by4gVGhpcyBmcmFtZWJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBiZQorICAgIC8vIGNhY2hlZCBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IHRyYW5zZmVyIG93bmVyc2hpcCwgc28gdGhlIGNhbGxlciBtb3N0IG5vdAorICAgIC8vIGxpdmUgbG9uZ2VyIHRoYW4gUmVuZGVyRW5naW5lLgorICAgIHZpcnR1YWwgRnJhbWVidWZmZXIqIGdldEZyYW1lYnVmZmVyRm9yRHJhd2luZygpID0gMDsKKyAgICBmcmllbmQgY2xhc3MgQmluZE5hdGl2ZUJ1ZmZlckFzRnJhbWVidWZmZXI7CisgICAgZnJpZW5kIGNsYXNzIHRocmVhZGVkOjpSZW5kZXJFbmdpbmVUaHJlYWRlZDsKK307CisKK3N0cnVjdCBSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3MgeworICAgIGludCBwaXhlbEZvcm1hdDsKKyAgICB1aW50MzJfdCBpbWFnZUNhY2hlU2l6ZTsKKyAgICBib29sIHVzZUNvbG9yTWFuYWdlbWVudDsKKyAgICBib29sIGVuYWJsZVByb3RlY3RlZENvbnRleHQ7CisgICAgYm9vbCBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5OworICAgIGJvb2wgc3VwcG9ydHNCYWNrZ3JvdW5kQmx1cjsKKyAgICBSZW5kZXJFbmdpbmU6OkNvbnRleHRQcmlvcml0eSBjb250ZXh0UHJpb3JpdHk7CisgICAgUmVuZGVyRW5naW5lOjpSZW5kZXJFbmdpbmVUeXBlIHJlbmRlckVuZ2luZVR5cGU7CisgICAgYm9vbCByZWFsdGltZTsKKworICAgIHN0cnVjdCBCdWlsZGVyOworCitwcml2YXRlOgorICAgIC8vIG11c3QgYmUgY3JlYXRlZCBieSBCdWlsZGVyIHZpYSBjb25zdHJ1Y3RvciB3aXRoIGZ1bGwgYXJndW1lbnQgbGlzdAorICAgIFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyhpbnQgX3BpeGVsRm9ybWF0LCB1aW50MzJfdCBfaW1hZ2VDYWNoZVNpemUsIGJvb2wgX3VzZUNvbG9yTWFuYWdlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfZW5hYmxlUHJvdGVjdGVkQ29udGV4dCwgYm9vbCBfcHJlY2FjaGVUb25lTWFwcGVyU2hhZGVyT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfc3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHkgX2NvbnRleHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyRW5naW5lOjpSZW5kZXJFbmdpbmVUeXBlIF9yZW5kZXJFbmdpbmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9yZWFsdGltZSkKKyAgICAgICAgICA6IHBpeGVsRm9ybWF0KF9waXhlbEZvcm1hdCksCisgICAgICAgICAgICBpbWFnZUNhY2hlU2l6ZShfaW1hZ2VDYWNoZVNpemUpLAorICAgICAgICAgICAgdXNlQ29sb3JNYW5hZ2VtZW50KF91c2VDb2xvck1hbmFnZW1lbnQpLAorICAgICAgICAgICAgZW5hYmxlUHJvdGVjdGVkQ29udGV4dChfZW5hYmxlUHJvdGVjdGVkQ29udGV4dCksCisgICAgICAgICAgICBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5KF9wcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5KSwKKyAgICAgICAgICAgIHN1cHBvcnRzQmFja2dyb3VuZEJsdXIoX3N1cHBvcnRzQmFja2dyb3VuZEJsdXIpLAorICAgICAgICAgICAgY29udGV4dFByaW9yaXR5KF9jb250ZXh0UHJpb3JpdHkpLAorICAgICAgICAgICAgcmVuZGVyRW5naW5lVHlwZShfcmVuZGVyRW5naW5lVHlwZSksCisgICAgICAgICAgICByZWFsdGltZShfcmVhbHRpbWUpIHt9CisgICAgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzKCkgPSBkZWxldGU7Cit9OworCitzdHJ1Y3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzOjpCdWlsZGVyIHsKKyAgICBCdWlsZGVyKCkge30KKworICAgIEJ1aWxkZXImIHNldFBpeGVsRm9ybWF0KGludCBwaXhlbEZvcm1hdCkgeworICAgICAgICB0aGlzLT5waXhlbEZvcm1hdCA9IHBpeGVsRm9ybWF0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIEJ1aWxkZXImIHNldEltYWdlQ2FjaGVTaXplKHVpbnQzMl90IGltYWdlQ2FjaGVTaXplKSB7CisgICAgICAgIHRoaXMtPmltYWdlQ2FjaGVTaXplID0gaW1hZ2VDYWNoZVNpemU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0VXNlQ29sb3JNYW5hZ2VybWVudChib29sIHVzZUNvbG9yTWFuYWdlbWVudCkgeworICAgICAgICB0aGlzLT51c2VDb2xvck1hbmFnZW1lbnQgPSB1c2VDb2xvck1hbmFnZW1lbnQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0RW5hYmxlUHJvdGVjdGVkQ29udGV4dChib29sIGVuYWJsZVByb3RlY3RlZENvbnRleHQpIHsKKyAgICAgICAgdGhpcy0+ZW5hYmxlUHJvdGVjdGVkQ29udGV4dCA9IGVuYWJsZVByb3RlY3RlZENvbnRleHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0UHJlY2FjaGVUb25lTWFwcGVyU2hhZGVyT25seShib29sIHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkpIHsKKyAgICAgICAgdGhpcy0+cHJlY2FjaGVUb25lTWFwcGVyU2hhZGVyT25seSA9IHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0U3VwcG9ydHNCYWNrZ3JvdW5kQmx1cihib29sIHN1cHBvcnRzQmFja2dyb3VuZEJsdXIpIHsKKyAgICAgICAgdGhpcy0+c3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciA9IHN1cHBvcnRzQmFja2dyb3VuZEJsdXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0Q29udGV4dFByaW9yaXR5KFJlbmRlckVuZ2luZTo6Q29udGV4dFByaW9yaXR5IGNvbnRleHRQcmlvcml0eSkgeworICAgICAgICB0aGlzLT5jb250ZXh0UHJpb3JpdHkgPSBjb250ZXh0UHJpb3JpdHk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgQnVpbGRlciYgc2V0UmVuZGVyRW5naW5lVHlwZShSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZSkgeworICAgICAgICB0aGlzLT5yZW5kZXJFbmdpbmVUeXBlID0gcmVuZGVyRW5naW5lVHlwZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBCdWlsZGVyJiBzZXRSZWFsdGltZShib29sIHJlYWx0aW1lKSB7CisgICAgICAgIHRoaXMtPnJlYWx0aW1lID0gcmVhbHRpbWU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzIGJ1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzKHBpeGVsRm9ybWF0LCBpbWFnZUNhY2hlU2l6ZSwgdXNlQ29sb3JNYW5hZ2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVByb3RlY3RlZENvbnRleHQsIHByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNCYWNrZ3JvdW5kQmx1ciwgY29udGV4dFByaW9yaXR5LCByZW5kZXJFbmdpbmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWx0aW1lKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gMSBtZWFucyBSR0JBXzg4ODgKKyAgICBpbnQgcGl4ZWxGb3JtYXQgPSAxOworICAgIHVpbnQzMl90IGltYWdlQ2FjaGVTaXplID0gMDsKKyAgICBib29sIHVzZUNvbG9yTWFuYWdlbWVudCA9IHRydWU7CisgICAgYm9vbCBlbmFibGVQcm90ZWN0ZWRDb250ZXh0ID0gZmFsc2U7CisgICAgYm9vbCBwcmVjYWNoZVRvbmVNYXBwZXJTaGFkZXJPbmx5ID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0JhY2tncm91bmRCbHVyID0gZmFsc2U7CisgICAgUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHkgY29udGV4dFByaW9yaXR5ID0gUmVuZGVyRW5naW5lOjpDb250ZXh0UHJpb3JpdHk6Ok1FRElVTTsKKyAgICBSZW5kZXJFbmdpbmU6OlJlbmRlckVuZ2luZVR5cGUgcmVuZGVyRW5naW5lVHlwZSA9IFJlbmRlckVuZ2luZTo6UmVuZGVyRW5naW5lVHlwZTo6R0xFUzsKKyAgICBib29sIHJlYWx0aW1lID0gdHJ1ZTsKK307CisKK2NsYXNzIEJpbmROYXRpdmVCdWZmZXJBc0ZyYW1lYnVmZmVyIHsKK3B1YmxpYzoKKyAgICBCaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcihSZW5kZXJFbmdpbmUmIGVuZ2luZSwgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgdXNlRnJhbWVidWZmZXJDYWNoZSkKKyAgICAgICAgICA6IG1FbmdpbmUoZW5naW5lKSwgbUZyYW1lYnVmZmVyKG1FbmdpbmUuZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nKCkpLCBtU3RhdHVzKE5PX0VSUk9SKSB7CisgICAgICAgIG1TdGF0dXMgPSBtRnJhbWVidWZmZXItPnNldE5hdGl2ZVdpbmRvd0J1ZmZlcihidWZmZXIsIG1FbmdpbmUuaXNQcm90ZWN0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lYnVmZmVyQ2FjaGUpCisgICAgICAgICAgICAgICAgPyBtRW5naW5lLmJpbmRGcmFtZUJ1ZmZlcihtRnJhbWVidWZmZXIpCisgICAgICAgICAgICAgICAgOiBOT19NRU1PUlk7CisgICAgfQorICAgIH5CaW5kTmF0aXZlQnVmZmVyQXNGcmFtZWJ1ZmZlcigpIHsKKyAgICAgICAgbUZyYW1lYnVmZmVyLT5zZXROYXRpdmVXaW5kb3dCdWZmZXIobnVsbHB0ciwgZmFsc2UsIC8qYXJiaXRyYXJ5Ki8gdHJ1ZSk7CisgICAgICAgIG1FbmdpbmUudW5iaW5kRnJhbWVCdWZmZXIobUZyYW1lYnVmZmVyKTsKKyAgICB9CisgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCitwcml2YXRlOgorICAgIFJlbmRlckVuZ2luZSYgbUVuZ2luZTsKKyAgICBGcmFtZWJ1ZmZlciogbUZyYW1lYnVmZmVyOworICAgIHN0YXR1c190IG1TdGF0dXM7Cit9OworCitjbGFzcyBTeW5jRmVhdHVyZXMgeworcHVibGljOgorICAgIHN0YXRpYyBTeW5jRmVhdHVyZXMgJkdldEluc3RhbmNlKCk7CisgICAgYm9vbCB1c2VOYXRpdmVGZW5jZVN5bmMoKSBjb25zdDsKKyAgICBib29sIHVzZUZlbmNlU3luYygpIGNvbnN0OworICAgIGJvb2wgdXNlV2FpdFN5bmMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBTeW5jRmVhdHVyZXMoKTsKKyAgICBib29sIG1IYXNOYXRpdmVGZW5jZVN5bmM7CisgICAgYm9vbCBtSGFzRmVuY2VTeW5jOworICAgIGJvb2wgbUhhc1dhaXRTeW5jOworfTsKKworbmFtZXNwYWNlIGltcGwgeworCisvLyBpbXBsOjpSZW5kZXJFbmdpbmUgY29udGFpbnMgY29tbW9uIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgZ3JhcGhpY3MgYmFjay1lbmQgYWdub3N0aWMuCitjbGFzcyBSZW5kZXJFbmdpbmUgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUgeworcHVibGljOgorICAgIHZpcnR1YWwgflJlbmRlckVuZ2luZSgpID0gMDsKKworICAgIGJvb2wgdXNlTmF0aXZlRmVuY2VTeW5jKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCB1c2VXYWl0U3luYygpIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgUmVuZGVyRW5naW5lKGNvbnN0IFJlbmRlckVuZ2luZUNyZWF0aW9uQXJncyYgYXJncyk7CisgICAgY29uc3QgUmVuZGVyRW5naW5lQ3JlYXRpb25BcmdzIG1BcmdzOworfTsKKworfSAvLyBuYW1lc3BhY2UgaW1wbAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvKiBTRl9SRU5ERVJFTkdJTkVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9UZXh0dXJlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWFjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvVGV4dHVyZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0ZfUkVOREVSX0VOR0lORV9URVhUVVJFX0gKKyNkZWZpbmUgU0ZfUkVOREVSX0VOR0lORV9URVhUVVJFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWF0aC9tYXQ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworCitjbGFzcyBUZXh0dXJlIHsKK3B1YmxpYzoKKyAgICBlbnVtIFRhcmdldCB7IFRFWFRVUkVfMkQgPSAweDBERTEsIFRFWFRVUkVfRVhURVJOQUwgPSAweDhENjUgfTsKKworICAgIFRleHR1cmUoKTsKKyAgICBUZXh0dXJlKFRhcmdldCB0ZXh0dXJlVGFyZ2V0LCB1aW50MzJfdCB0ZXh0dXJlTmFtZSk7CisgICAgflRleHR1cmUoKTsKKworICAgIHZvaWQgaW5pdChUYXJnZXQgdGV4dHVyZVRhcmdldCwgdWludDMyX3QgdGV4dHVyZU5hbWUpOworCisgICAgdm9pZCBzZXRNYXRyaXgoZmxvYXQgY29uc3QqIG1hdHJpeCk7CisgICAgdm9pZCBzZXRGaWx0ZXJpbmcoYm9vbCBlbmFibGVkKTsKKyAgICB2b2lkIHNldERpbWVuc2lvbnMoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KTsKKworICAgIHVpbnQzMl90IGdldFRleHR1cmVOYW1lKCkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0VGV4dHVyZVRhcmdldCgpIGNvbnN0OworCisgICAgY29uc3QgbWF0NCYgZ2V0TWF0cml4KCkgY29uc3Q7CisgICAgYm9vbCBnZXRGaWx0ZXJpbmcoKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0V2lkdGgoKSBjb25zdDsKKyAgICBzaXplX3QgZ2V0SGVpZ2h0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbVRleHR1cmVOYW1lOworICAgIHVpbnQzMl90IG1UZXh0dXJlVGFyZ2V0OworICAgIHNpemVfdCBtV2lkdGg7CisgICAgc2l6ZV90IG1IZWlnaHQ7CisgICAgYm9vbCBtRmlsdGVyaW5nOworICAgIG1hdDQgbVRleHR1cmVNYXRyaXg7Cit9OworCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKyNlbmRpZiAvKiBTRl9SRU5ERVJfRU5HSU5FX1RFWFRVUkVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svRnJhbWVidWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL0ZyYW1lYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNmE0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL0ZyYW1lYnVmZmVyLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9GcmFtZWJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBtb2NrIHsKKworY2xhc3MgRnJhbWVidWZmZXIgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpGcmFtZWJ1ZmZlciB7CitwdWJsaWM6CisgICAgRnJhbWVidWZmZXIoKTsKKyAgICB+RnJhbWVidWZmZXIoKSBvdmVycmlkZTsKKworICAgIE1PQ0tfTUVUSE9EMyhzZXROYXRpdmVXaW5kb3dCdWZmZXIsIGJvb2woQU5hdGl2ZVdpbmRvd0J1ZmZlciosIGJvb2wsIGNvbnN0IGJvb2wpKTsKK307CisKK30gLy8gbmFtZXNwYWNlIG1vY2sKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svSW1hZ2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL0ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwZWVkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL0ltYWdlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9JbWFnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBtb2NrIHsKKworY2xhc3MgSW1hZ2UgOiBwdWJsaWMgcmVuZGVyZW5naW5lOjpJbWFnZSB7CitwdWJsaWM6CisgICAgSW1hZ2UoKTsKKyAgICB+SW1hZ2UoKSBvdmVycmlkZTsKKworICAgIE1PQ0tfTUVUSE9EMihzZXROYXRpdmVXaW5kb3dCdWZmZXIsIGJvb2woQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBib29sIGlzUHJvdGVjdGVkKSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBtb2NrCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL1JlbmRlckVuZ2luZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L2luY2x1ZGUvcmVuZGVyZW5naW5lL21vY2svUmVuZGVyRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzZGQ1OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9tb2NrL1JlbmRlckVuZ2luZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Z21vY2svZ21vY2suaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvRGlzcGxheVNldHRpbmdzLmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL0xheWVyU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvTWVzaC5oPgorI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9SZW5kZXJFbmdpbmUuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvVGV4dHVyZS5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBtb2NrIHsKKworY2xhc3MgUmVuZGVyRW5naW5lIDogcHVibGljIHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lIHsKK3B1YmxpYzoKKyAgICBSZW5kZXJFbmdpbmUoKTsKKyAgICB+UmVuZGVyRW5naW5lKCkgb3ZlcnJpZGU7CisKKyAgICBNT0NLX01FVEhPRDAoZ2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nLCBGcmFtZWJ1ZmZlciooKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKHByaW1lQ2FjaGUsIHZvaWQoKSk7CisgICAgTU9DS19NRVRIT0QxKGR1bXAsIHZvaWQoc3RkOjpzdHJpbmcmKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKHVzZU5hdGl2ZUZlbmNlU3luYywgYm9vbCgpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAodXNlV2FpdFN5bmMsIGJvb2woKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGlzQ3VycmVudCwgYm9vbCgpKTsKKyAgICBNT0NLX01FVEhPRDIoZ2VuVGV4dHVyZXMsIHZvaWQoc2l6ZV90LCB1aW50MzJfdCopKTsKKyAgICBNT0NLX01FVEhPRDIoZGVsZXRlVGV4dHVyZXMsIHZvaWQoc2l6ZV90LCB1aW50MzJfdCBjb25zdCopKTsKKyAgICBNT0NLX01FVEhPRDIoYmluZEV4dGVybmFsVGV4dHVyZUltYWdlLCB2b2lkKHVpbnQzMl90LCBjb25zdCByZW5kZXJlbmdpbmU6OkltYWdlJikpOworICAgIE1PQ0tfTUVUSE9EMShjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlciwgdm9pZChjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYpKTsKKyAgICBNT0NLX01FVEhPRDMoYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgc3RhdHVzX3QodWludDMyX3QsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiwgY29uc3Qgc3A8RmVuY2U+JikpOworICAgIE1PQ0tfTUVUSE9EMSh1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIsIHZvaWQodWludDY0X3QpKTsKKyAgICBNT0NLX01FVEhPRDEoYmluZEZyYW1lQnVmZmVyLCBzdGF0dXNfdChyZW5kZXJlbmdpbmU6OkZyYW1lYnVmZmVyKikpOworICAgIE1PQ0tfTUVUSE9EMSh1bmJpbmRGcmFtZUJ1ZmZlciwgdm9pZChyZW5kZXJlbmdpbmU6OkZyYW1lYnVmZmVyKikpOworICAgIE1PQ0tfTUVUSE9EMShkcmF3TWVzaCwgdm9pZChjb25zdCByZW5kZXJlbmdpbmU6Ok1lc2gmKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGdldE1heFRleHR1cmVTaXplLCBzaXplX3QoKSk7CisgICAgTU9DS19DT05TVF9NRVRIT0QwKGdldE1heFZpZXdwb3J0RGltcywgc2l6ZV90KCkpOworICAgIE1PQ0tfQ09OU1RfTUVUSE9EMChpc1Byb3RlY3RlZCwgYm9vbCgpKTsKKyAgICBNT0NLX0NPTlNUX01FVEhPRDAoc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50LCBib29sKCkpOworICAgIE1PQ0tfTUVUSE9EMSh1c2VQcm90ZWN0ZWRDb250ZXh0LCBib29sKGJvb2wpKTsKKyAgICBNT0NLX01FVEhPRDEoY2xlYW51cFBvc3RSZW5kZXIsIGJvb2woQ2xlYW51cE1vZGUgbW9kZSkpOworICAgIE1PQ0tfTUVUSE9ENihkcmF3TGF5ZXJzLAorICAgICAgICAgICAgICAgICBzdGF0dXNfdChjb25zdCBEaXNwbGF5U2V0dGluZ3MmLCBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBMYXllclNldHRpbmdzKj4mLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYsIGNvbnN0IGJvb2wsIGJhc2U6OnVuaXF1ZV9mZCYmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQqKSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBtb2NrCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9pbmNsdWRlL3JlbmRlcmVuZ2luZS9wcml2YXRlL0Rlc2NyaXB0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvaW5jbHVkZS9yZW5kZXJlbmdpbmUvcHJpdmF0ZS9EZXNjcmlwdGlvbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0ZfUkVOREVSX0VOR0lORV9ERVNDUklQVElPTl9IXworI2RlZmluZSBTRl9SRU5ERVJfRU5HSU5FX0RFU0NSSVBUSU9OX0hfCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvVGV4dHVyZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNUeXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBzdGF0ZSBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZS4KKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgR0xTTCBwcm9ncmFtIGFuZCBzZXQgdGhlCisgKiBhcHByb3ByaWF0ZSB1bmlmb3JtLgorICovCitzdHJ1Y3QgRGVzY3JpcHRpb24geworICAgIGVudW0gY2xhc3MgVHJhbnNmZXJGdW5jdGlvbiA6IGludCB7CisgICAgICAgIExJTkVBUiwKKyAgICAgICAgU1JHQiwKKyAgICAgICAgU1QyMDg0LAorICAgICAgICBITEcsIC8vIEh5YnJpZCBMb2ctR2FtbWEgZm9yIEhEUi4KKyAgICB9OworCisgICAgc3RhdGljIFRyYW5zZmVyRnVuY3Rpb24gZGF0YVNwYWNlVG9UcmFuc2ZlckZ1bmN0aW9uKHVpOjpEYXRhc3BhY2UgZGF0YVNwYWNlKTsKKworICAgIERlc2NyaXB0aW9uKCkgPSBkZWZhdWx0OworICAgIH5EZXNjcmlwdGlvbigpID0gZGVmYXVsdDsKKworICAgIGJvb2wgaGFzSW5wdXRUcmFuc2Zvcm1NYXRyaXgoKSBjb25zdDsKKyAgICBib29sIGhhc091dHB1dFRyYW5zZm9ybU1hdHJpeCgpIGNvbnN0OworICAgIGJvb2wgaGFzQ29sb3JNYXRyaXgoKSBjb25zdDsKKworICAgIC8vIHdoZXRoZXIgdGV4dHVyZXMgYXJlIHByZW11bHRpcGxpZWQKKyAgICBib29sIGlzUHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7CisgICAgLy8gd2hldGhlciB0aGlzIGxheWVyIGlzIG1hcmtlZCBhcyBvcGFxdWUKKyAgICBib29sIGlzT3BhcXVlID0gdHJ1ZTsKKworICAgIC8vIGNvcm5lciByYWRpdXMgb2YgdGhlIGxheWVyCisgICAgZmxvYXQgY29ybmVyUmFkaXVzID0gMDsKKworICAgIC8vIFNpemUgb2YgdGhlIHJvdW5kZWQgcmVjdGFuZ2xlIHdlIGFyZSBjcm9wcGluZyB0bworICAgIGhhbGYyIGNyb3BTaXplOworCisgICAgLy8gVGV4dHVyZSB0aGlzIGxheWVyIHVzZXMKKyAgICBUZXh0dXJlIHRleHR1cmU7CisgICAgYm9vbCB0ZXh0dXJlRW5hYmxlZCA9IGZhbHNlOworCisgICAgLy8gY29sb3IgdXNlZCB3aGVuIHRleHR1cmluZyBpcyBkaXNhYmxlZCBvciB3aGVuIHNldHRpbmcgYWxwaGEuCisgICAgaGFsZjQgY29sb3I7CisKKyAgICAvLyB0cnVlIGlmIHRoZSBzYW1wbGVkIHBpeGVsIHZhbHVlcyBhcmUgaW4gWTQxMC9CVDIwMjAgcmF0aGVyIHRoYW4gUkdCQQorICAgIGJvb2wgaXNZNDEwQlQyMDIwID0gZmFsc2U7CisKKyAgICAvLyB0cmFuc2ZlciBmdW5jdGlvbnMgZm9yIHRoZSBpbnB1dC9vdXRwdXQKKyAgICBUcmFuc2ZlckZ1bmN0aW9uIGlucHV0VHJhbnNmZXJGdW5jdGlvbiA9IFRyYW5zZmVyRnVuY3Rpb246OkxJTkVBUjsKKyAgICBUcmFuc2ZlckZ1bmN0aW9uIG91dHB1dFRyYW5zZmVyRnVuY3Rpb24gPSBUcmFuc2ZlckZ1bmN0aW9uOjpMSU5FQVI7CisKKyAgICBmbG9hdCBkaXNwbGF5TWF4THVtaW5hbmNlOworICAgIGZsb2F0IG1heE1hc3RlcmluZ0x1bWluYW5jZTsKKyAgICBmbG9hdCBtYXhDb250ZW50THVtaW5hbmNlOworCisgICAgLy8gcHJvamVjdGlvbiBtYXRyaXgKKyAgICBtYXQ0IHByb2plY3Rpb25NYXRyaXg7CisKKyAgICAvLyBUaGUgY29sb3IgbWF0cml4IHdpbGwgYmUgYXBwbGllZCBpbiBsaW5lYXIgc3BhY2UgcmlnaHQgYmVmb3JlIE9FVEYuCisgICAgbWF0NCBjb2xvck1hdHJpeDsKKyAgICBtYXQ0IGlucHV0VHJhbnNmb3JtTWF0cml4OworICAgIG1hdDQgb3V0cHV0VHJhbnNmb3JtTWF0cml4OworCisgICAgLy8gVHJ1ZSBpZiB0aGlzIGxheWVyIHdpbGwgZHJhdyBhIHNoYWRvdy4KKyAgICBib29sIGRyYXdTaGFkb3dzID0gZmFsc2U7Cit9OworCit9IC8vIG5hbWVzcGFjZSByZW5kZXJlbmdpbmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIFNGX1JFTkRFUl9FTkdJTkVfREVTQ1JJUFRJT05fSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9tb2NrL0ZyYW1lYnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC9tb2NrL0ZyYW1lYnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmRjYWFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svRnJhbWVidWZmZXIuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvbW9jay9GcmFtZWJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSBtb2NrIHsKKworLy8gVGhlIEdvb2dsZSBNb2NrIGRvY3VtZW50YXRpb24gcmVjb21tZW5kcyBleHBsaWNpdCBub24taGVhZGVyIGluc3RhbnRpYXRpb25zCisvLyBmb3IgYmV0dGVyIGNvbXBpbGUgdGltZSBwZXJmb3JtYW5jZS4KK0ZyYW1lYnVmZmVyOjpGcmFtZWJ1ZmZlcigpID0gZGVmYXVsdDsKK0ZyYW1lYnVmZmVyOjp+RnJhbWVidWZmZXIoKSA9IGRlZmF1bHQ7CisKK30gLy8gbmFtZXNwYWNlIG1vY2sKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svSW1hZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svSW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZjQzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9JbWFnZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHJlbmRlcmVuZ2luZS9tb2NrL0ltYWdlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCisvLyBUaGUgR29vZ2xlIE1vY2sgZG9jdW1lbnRhdGlvbiByZWNvbW1lbmRzIGV4cGxpY2l0IG5vbi1oZWFkZXIgaW5zdGFudGlhdGlvbnMKKy8vIGZvciBiZXR0ZXIgY29tcGlsZSB0aW1lIHBlcmZvcm1hbmNlLgorSW1hZ2U6OkltYWdlKCkgPSBkZWZhdWx0OworSW1hZ2U6On5JbWFnZSgpID0gZGVmYXVsdDsKKworfSAvLyBuYW1lc3BhY2UgbW9jaworfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvbW9jay9SZW5kZXJFbmdpbmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svUmVuZGVyRW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE2MzZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L21vY2svUmVuZGVyRW5naW5lLmNwcApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL21vY2svUmVuZGVyRW5naW5lLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSByZW5kZXJlbmdpbmUgeworbmFtZXNwYWNlIG1vY2sgeworCisvLyBUaGUgR29vZ2xlIE1vY2sgZG9jdW1lbnRhdGlvbiByZWNvbW1lbmRzIGV4cGxpY2l0IG5vbi1oZWFkZXIgaW5zdGFudGlhdGlvbnMKKy8vIGZvciBiZXR0ZXIgY29tcGlsZSB0aW1lIHBlcmZvcm1hbmNlLgorUmVuZGVyRW5naW5lOjpSZW5kZXJFbmdpbmUoKSA9IGRlZmF1bHQ7CitSZW5kZXJFbmdpbmU6On5SZW5kZXJFbmdpbmUoKSA9IGRlZmF1bHQ7CisKK30gLy8gbmFtZXNwYWNlIG1vY2sKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIxM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfbGljZW5zZSJdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibGlicmVuZGVyZnJpZ2h0X3Rlc3QiLAorICAgIGRlZmF1bHRzOiBbInN1cmZhY2VmbGluZ2VyX2RlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3JjczogWworICAgICAgICAiUmVuZGVyRW5naW5lVGVzdC5jcHAiLAorICAgICAgICAiUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgICAgICAibGlicmVuZGVyZnJpZ2h0IiwKKyAgICAgICAgImxpYnJlbmRlcmZyaWdodF9tb2NrcyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlic3luYyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjk3ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL1JlbmRlckVuZ2luZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVE9ETyhiLzEyOTQ4MTE2NSk6IHJlbW92ZSB0aGUgI3ByYWdtYSBiZWxvdyBhbmQgZml4IGNvbnZlcnNpb24gaXNzdWVzCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY29udmVyc2lvbiIKKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxyZW5kZXJlbmdpbmUvUmVuZGVyRW5naW5lLmg+CisjaW5jbHVkZSA8c3luYy9zeW5jLmg+CisjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KKyNpbmNsdWRlICIuLi9nbC9HTEVTUmVuZGVyRW5naW5lLmgiCisjaW5jbHVkZSAiLi4vdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCIKKworY29uc3RleHByIGludCBERUZBVUxUX0RJU1BMQVlfV0lEVEggPSAxMjg7Citjb25zdGV4cHIgaW50IERFRkFVTFRfRElTUExBWV9IRUlHSFQgPSAyNTY7Citjb25zdGV4cHIgaW50IERFRkFVTFRfRElTUExBWV9PRkZTRVQgPSA2NDsKK2NvbnN0ZXhwciBib29sIFdSSVRFX0JVRkZFUl9UT19GSUxFX09OX0ZBSUxVUkUgPSBmYWxzZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgUmVuZGVyRW5naW5lVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgIHN0YXRpYyB2b2lkIFNldFVwVGVzdFN1aXRlKCkgeworICAgICAgICBzUkUgPSByZW5kZXJlbmdpbmU6OmdsOjpHTEVTUmVuZGVyRW5naW5lOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgcmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmVDcmVhdGlvbkFyZ3M6OkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBpeGVsRm9ybWF0KHN0YXRpY19jYXN0PGludD4odWk6OlBpeGVsRm9ybWF0OjpSR0JBXzg4ODgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEltYWdlQ2FjaGVTaXplKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VXNlQ29sb3JNYW5hZ2VybWVudChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRFbmFibGVQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZWNhY2hlVG9uZU1hcHBlclNoYWRlck9ubHkoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U3VwcG9ydHNCYWNrZ3JvdW5kQmx1cih0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbnRleHRQcmlvcml0eShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q29udGV4dFByaW9yaXR5OjpNRURJVU0pCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVuZGVyRW5naW5lVHlwZShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6UmVuZGVyRW5naW5lVHlwZTo6R0xFUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBUZWFyRG93blRlc3RTdWl0ZSgpIHsKKyAgICAgICAgLy8gVGhlIG9yZGVyaW5nIGhlcmUgaXMgaW1wb3J0YW50IC0gc0N1cnJlbnRCdWZmZXIgbXVzdCBsaXZlIGxvbmdlcgorICAgICAgICAvLyB0aGFuIFJlbmRlckVuZ2luZSB0byBhdm9pZCBhIG51bGwgcmVmZXJlbmNlIG9uIHRlYXItZG93bi4KKyAgICAgICAgc1JFID0gbnVsbHB0cjsKKyAgICAgICAgc0N1cnJlbnRCdWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHN0YXRpYyBzcDxHcmFwaGljQnVmZmVyPiBhbGxvY2F0ZURlZmF1bHRCdWZmZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JhcGhpY0J1ZmZlcihERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQiKTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZXMgYSAxeDEgYnVmZmVyIHRvIGZpbGwgd2l0aCBhIHNvbGlkIGNvbG9yCisgICAgc3RhdGljIHNwPEdyYXBoaWNCdWZmZXI+IGFsbG9jYXRlU291cmNlQnVmZmVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljQnVmZmVyKHdpZHRoLCBoZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCIpOworICAgIH0KKworICAgIFJlbmRlckVuZ2luZVRlc3QoKSB7IG1CdWZmZXIgPSBhbGxvY2F0ZURlZmF1bHRCdWZmZXIoKTsgfQorCisgICAgflJlbmRlckVuZ2luZVRlc3QoKSB7CisgICAgICAgIGlmIChXUklURV9CVUZGRVJfVE9fRklMRV9PTl9GQUlMVVJFICYmIDo6dGVzdGluZzo6VGVzdDo6SGFzRmFpbHVyZSgpKSB7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlclRvRmlsZSgiL2RhdGEvdGV4dHVyZV9vdXRfIik7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCB0ZXhOYW1lIDogbVRleE5hbWVzKSB7CisgICAgICAgICAgICBzUkUtPmRlbGV0ZVRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShzUkUtPmlzVGV4dHVyZU5hbWVLbm93bkZvclRlc3RpbmcodGV4TmFtZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB3cml0ZUJ1ZmZlclRvRmlsZShjb25zdCBjaGFyKiBiYXNlbmFtZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZShiYXNlbmFtZSk7CisgICAgICAgIGZpbGVuYW1lLmFwcGVuZCg6OnRlc3Rpbmc6OlVuaXRUZXN0OjpHZXRJbnN0YW5jZSgpLT5jdXJyZW50X3Rlc3RfaW5mbygpLT5uYW1lKCkpOworICAgICAgICBmaWxlbmFtZS5hcHBlbmQoIi5wcG0iKTsKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBmaWxlKGZpbGVuYW1lLmNfc3RyKCksIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICBpZiAoIWZpbGUuaXNfb3BlbigpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9wZW4gZmlsZTogJXMiLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJZb3UgbWF5IG5lZWQgdG8gZG86IFwiYWRiIHNoZWxsIHNldGVuZm9yY2UgMFwiIHRvIGVuYWJsZSAiCisgICAgICAgICAgICAgICAgICAic3VyZmFjZWZsaW5nZXIgdG8gd3JpdGUgZGVidWcgaW1hZ2VzIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBwaXhlbHM7CisgICAgICAgIG1CdWZmZXItPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworCisgICAgICAgIGZpbGUgPDwgIlA2XG4iOworICAgICAgICBmaWxlIDw8IG1CdWZmZXItPmdldFdpZHRoKCkgPDwgIlxuIjsKKyAgICAgICAgZmlsZSA8PCBtQnVmZmVyLT5nZXRIZWlnaHQoKSA8PCAiXG4iOworICAgICAgICBmaWxlIDw8IDI1NSA8PCAiXG4iOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dEJ1ZmZlcihtQnVmZmVyLT5nZXRXaWR0aCgpICogbUJ1ZmZlci0+Z2V0SGVpZ2h0KCkgKiAzKTsKKyAgICAgICAgYXV0byBvdXRQdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvdXRCdWZmZXIuZGF0YSgpKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbUJ1ZmZlci0+Z2V0SGVpZ2h0KCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjID0gcGl4ZWxzICsgKG1CdWZmZXItPmdldFN0cmlkZSgpICogaikgKiA0OworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1CdWZmZXItPmdldFdpZHRoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgY29weSBSLCBHIGFuZCBCIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICBvdXRQdHJbMF0gPSBzcmNbMF07CisgICAgICAgICAgICAgICAgb3V0UHRyWzFdID0gc3JjWzFdOworICAgICAgICAgICAgICAgIG91dFB0clsyXSA9IHNyY1syXTsKKyAgICAgICAgICAgICAgICBvdXRQdHIgKz0gMzsKKworICAgICAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbGUud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ob3V0QnVmZmVyLmRhdGEoKSksIG91dEJ1ZmZlci5zaXplKCkpOworICAgICAgICBtQnVmZmVyLT51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIGV4cGVjdEJ1ZmZlckNvbG9yKGNvbnN0IFJlZ2lvbiYgcmVnaW9uLCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiLCB1aW50OF90IGEpIHsKKyAgICAgICAgc2l6ZV90IGM7CisgICAgICAgIFJlY3QgY29uc3QqIHJlY3QgPSByZWdpb24uZ2V0QXJyYXkoJmMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGM7IGkrKywgcmVjdCsrKSB7CisgICAgICAgICAgICBleHBlY3RCdWZmZXJDb2xvcigqcmVjdCwgciwgZywgYiwgYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGV4cGVjdEJ1ZmZlckNvbG9yKGNvbnN0IFJlY3QmIHJlY3QsIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIsIHVpbnQ4X3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdG9sZXJhbmNlID0gMCkgeworICAgICAgICBhdXRvIGNvbG9yQ29tcGFyZSA9IFt0b2xlcmFuY2VdKGNvbnN0IHVpbnQ4X3QqIGNvbG9yQSwgY29uc3QgdWludDhfdCogY29sb3JCKSB7CisgICAgICAgICAgICBhdXRvIGNvbG9yQml0Q29tcGFyZSA9IFt0b2xlcmFuY2VdKHVpbnQ4X3QgYSwgdWludDhfdCBiKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCB0bXAgPSBhID49IGIgPyBhIC0gYiA6IGIgLSBhOworICAgICAgICAgICAgICAgIHJldHVybiB0bXAgPD0gdG9sZXJhbmNlOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmVxdWFsKGNvbG9yQSwgY29sb3JBICsgNCwgY29sb3JCLCBjb2xvckJpdENvbXBhcmUpOworICAgICAgICB9OworCisgICAgICAgIGV4cGVjdEJ1ZmZlckNvbG9yKHJlY3QsIHIsIGcsIGIsIGEsIGNvbG9yQ29tcGFyZSk7CisgICAgfQorCisgICAgdm9pZCBleHBlY3RCdWZmZXJDb2xvcihjb25zdCBSZWN0JiByZWdpb24sIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIsIHVpbnQ4X3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKT4gY29sb3JDb21wYXJlKSB7CisgICAgICAgIHVpbnQ4X3QqIHBpeGVsczsKKyAgICAgICAgbUJ1ZmZlci0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmcGl4ZWxzKSk7CisgICAgICAgIGludDMyX3QgbWF4RmFpbHMgPSAxMDsKKyAgICAgICAgaW50MzJfdCBmYWlscyA9IDA7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHJlZ2lvbi5nZXRIZWlnaHQoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMgPQorICAgICAgICAgICAgICAgICAgICBwaXhlbHMgKyAobUJ1ZmZlci0+Z2V0U3RyaWRlKCkgKiAocmVnaW9uLnRvcCArIGopICsgcmVnaW9uLmxlZnQpICogNDsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlZ2lvbi5nZXRXaWR0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGV4cGVjdGVkWzRdID0ge3IsIGcsIGIsIGF9OworICAgICAgICAgICAgICAgIGJvb2wgZXF1YWwgPSBjb2xvckNvbXBhcmUoc3JjLCBleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoZXF1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAicGl4ZWwgQCAoIiA8PCByZWdpb24ubGVmdCArIGkgPDwgIiwgIiA8PCByZWdpb24udG9wICsgaiA8PCAiKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgImV4cGVjdGVkICgiIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihyKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZykgPDwgIiwgIiA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYikgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGEpIDw8ICIpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiZ290ICgiIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNbMF0pIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNbMV0pIDw8ICIsICIgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNyY1syXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNyY1szXSkgPDwgIikiOworICAgICAgICAgICAgICAgIHNyYyArPSA0OworICAgICAgICAgICAgICAgIGlmICghZXF1YWwgJiYgKytmYWlscyA+PSBtYXhGYWlscykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFpbHMgPj0gbWF4RmFpbHMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyLT51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIGV4cGVjdEFscGhhKGNvbnN0IFJlY3QmIHJlY3QsIHVpbnQ4X3QgYSkgeworICAgICAgICBhdXRvIGNvbG9yQ29tcGFyZSA9IFtdKGNvbnN0IHVpbnQ4X3QqIGNvbG9yQSwgY29uc3QgdWludDhfdCogY29sb3JCKSB7CisgICAgICAgICAgICByZXR1cm4gY29sb3JBWzNdID09IGNvbG9yQlszXTsKKyAgICAgICAgfTsKKyAgICAgICAgZXhwZWN0QnVmZmVyQ29sb3IocmVjdCwgMC4wZiAvKiByICovLCAwLjBmIC8qZyAqLywgMC4wZiAvKiBiICovLCBhLCBjb2xvckNvbXBhcmUpOworICAgIH0KKworICAgIHZvaWQgZXhwZWN0U2hhZG93Q29sb3IoY29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzJiBjYXN0aW5nTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzJiBzaGFkb3csIGNvbnN0IHVieXRlNCYgY2FzdGVyQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1Ynl0ZTQmIGJhY2tncm91bmRDb2xvcikgeworICAgICAgICBjb25zdCBSZWN0IGNhc3RlclJlY3QoY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMpOworICAgICAgICBSZWdpb24gY2FzdGVyUmVnaW9uID0gUmVnaW9uKGNhc3RlclJlY3QpOworICAgICAgICBjb25zdCBmbG9hdCBjYXN0ZXJDb3JuZXJSYWRpdXMgPSBjYXN0aW5nTGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNSYWRpdXM7CisgICAgICAgIGlmIChjYXN0ZXJDb3JuZXJSYWRpdXMgPiAwLjBmKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNvcm5lcnMgaWYgYSBjb3JuZXIgcmFkaXVzIGlzIHNldAorICAgICAgICAgICAgUmVjdCBjb3JuZXJSZWN0KGNhc3RlckNvcm5lclJhZGl1cywgY2FzdGVyQ29ybmVyUmFkaXVzKTsKKyAgICAgICAgICAgIGNhc3RlclJlZ2lvbi5zdWJ0cmFjdFNlbGYoY29ybmVyUmVjdC5vZmZzZXRUbyhjYXN0ZXJSZWN0LmxlZnQsIGNhc3RlclJlY3QudG9wKSk7CisgICAgICAgICAgICBjYXN0ZXJSZWdpb24uc3VidHJhY3RTZWxmKAorICAgICAgICAgICAgICAgICAgICBjb3JuZXJSZWN0Lm9mZnNldFRvKGNhc3RlclJlY3QucmlnaHQgLSBjYXN0ZXJDb3JuZXJSYWRpdXMsIGNhc3RlclJlY3QudG9wKSk7CisgICAgICAgICAgICBjYXN0ZXJSZWdpb24uc3VidHJhY3RTZWxmKAorICAgICAgICAgICAgICAgICAgICBjb3JuZXJSZWN0Lm9mZnNldFRvKGNhc3RlclJlY3QubGVmdCwgY2FzdGVyUmVjdC5ib3R0b20gLSBjYXN0ZXJDb3JuZXJSYWRpdXMpKTsKKyAgICAgICAgICAgIGNhc3RlclJlZ2lvbi5zdWJ0cmFjdFNlbGYoY29ybmVyUmVjdC5vZmZzZXRUbyhjYXN0ZXJSZWN0LnJpZ2h0IC0gY2FzdGVyQ29ybmVyUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RlclJlY3QuYm90dG9tIC0gY2FzdGVyQ29ybmVyUmFkaXVzKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBmbG9hdCBzaGFkb3dJbnNldCA9IHNoYWRvdy5sZW5ndGggKiAtMS4wZjsKKyAgICAgICAgY29uc3QgUmVjdCBjYXN0ZXJXaXRoU2hhZG93ID0KKyAgICAgICAgICAgICAgICBSZWN0KGNhc3RlclJlY3QpLmluc2V0KHNoYWRvd0luc2V0LCBzaGFkb3dJbnNldCwgc2hhZG93SW5zZXQsIHNoYWRvd0luc2V0KTsKKyAgICAgICAgY29uc3QgUmVnaW9uIHNoYWRvd1JlZ2lvbiA9IFJlZ2lvbihjYXN0ZXJXaXRoU2hhZG93KS5zdWJ0cmFjdFNlbGYoY2FzdGVyUmVjdCk7CisgICAgICAgIGNvbnN0IFJlZ2lvbiBiYWNrZ3JvdW5kUmVnaW9uID0gUmVnaW9uKGZ1bGxzY3JlZW5SZWN0KCkpLnN1YnRyYWN0U2VsZihjYXN0ZXJXaXRoU2hhZG93KTsKKworICAgICAgICAvLyB2ZXJpZnkgY2FzdGluZyBsYXllcgorICAgICAgICBleHBlY3RCdWZmZXJDb2xvcihjYXN0ZXJSZWdpb24sIGNhc3RlckNvbG9yLnIsIGNhc3RlckNvbG9yLmcsIGNhc3RlckNvbG9yLmIsIGNhc3RlckNvbG9yLmEpOworCisgICAgICAgIC8vIHZlcmlmeSBzaGFkb3dzIGJ5IHRlc3RpbmcganVzdCB0aGUgYWxwaGEgc2luY2UgaXRzIGRpZmZpY3VsdCB0byB2YWxpZGF0ZSB0aGUgc2hhZG93IGNvbG9yCisgICAgICAgIHNpemVfdCBjOworICAgICAgICBSZWN0IGNvbnN0KiByID0gc2hhZG93UmVnaW9uLmdldEFycmF5KCZjKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjOyBpKyssIHIrKykgeworICAgICAgICAgICAgZXhwZWN0QWxwaGEoKnIsIDI1NSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgYmFja2dyb3VuZAorICAgICAgICBleHBlY3RCdWZmZXJDb2xvcihiYWNrZ3JvdW5kUmVnaW9uLCBiYWNrZ3JvdW5kQ29sb3IuciwgYmFja2dyb3VuZENvbG9yLmcsIGJhY2tncm91bmRDb2xvci5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IuYSk7CisgICAgfQorCisgICAgc3RhdGljIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3MgZ2V0U2hhZG93U2V0dGluZ3MoY29uc3QgdmVjMiYgY2FzdGVyUG9zLCBmbG9hdCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYXN0ZXJJc1RyYW5zbHVjZW50KSB7CisgICAgICAgIHJlbmRlcmVuZ2luZTo6U2hhZG93U2V0dGluZ3Mgc2hhZG93OworICAgICAgICBzaGFkb3cuYW1iaWVudENvbG9yID0gezAuMGYsIDAuMGYsIDAuMGYsIDAuMDM5Zn07CisgICAgICAgIHNoYWRvdy5zcG90Q29sb3IgPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4xOWZ9OworICAgICAgICBzaGFkb3cubGlnaHRQb3MgPSB2ZWMzKGNhc3RlclBvcy54LCBjYXN0ZXJQb3MueSwgMCk7CisgICAgICAgIHNoYWRvdy5saWdodFJhZGl1cyA9IDAuMGY7CisgICAgICAgIHNoYWRvdy5sZW5ndGggPSBzaGFkb3dMZW5ndGg7CisgICAgICAgIHNoYWRvdy5jYXN0ZXJJc1RyYW5zbHVjZW50ID0gY2FzdGVySXNUcmFuc2x1Y2VudDsKKyAgICAgICAgcmV0dXJuIHNoYWRvdzsKKyAgICB9CisKKyAgICBzdGF0aWMgUmVjdCBmdWxsc2NyZWVuUmVjdCgpIHsgcmV0dXJuIFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKTsgfQorCisgICAgc3RhdGljIFJlY3Qgb2Zmc2V0UmVjdCgpIHsKKyAgICAgICAgcmV0dXJuIFJlY3QoREVGQVVMVF9ESVNQTEFZX09GRlNFVCwgREVGQVVMVF9ESVNQTEFZX09GRlNFVCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKTsKKyAgICB9CisKKyAgICBzdGF0aWMgUmVjdCBvZmZzZXRSZWN0QXRaZXJvKCkgeworICAgICAgICByZXR1cm4gUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLSBERUZBVUxUX0RJU1BMQVlfT0ZGU0VULAorICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC0gREVGQVVMVF9ESVNQTEFZX09GRlNFVCk7CisgICAgfQorCisgICAgdm9pZCBpbnZva2VEcmF3KHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnMsCisgICAgICAgICAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcikgeworICAgICAgICBiYXNlOjp1bmlxdWVfZmQgZmVuY2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIGJ1ZmZlciwgdHJ1ZSwgYmFzZTo6dW5pcXVlX2ZkKCksICZmZW5jZSk7CisgICAgICAgIHNDdXJyZW50QnVmZmVyID0gYnVmZmVyOworCisgICAgICAgIGludCBmZCA9IGZlbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgIHN5bmNfd2FpdChmZCwgLTEpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdGF0dXMpOworICAgICAgICBpZiAobGF5ZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHNSRS0+aXNGcmFtZWJ1ZmZlckltYWdlQ2FjaGVkRm9yVGVzdGluZyhidWZmZXItPmdldElkKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZHJhd0VtcHR5TGF5ZXJzKCkgeworICAgICAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworICAgICAgICAvLyBNZWFuaW5nbGVzcyBidWZmZXIgc2luY2Ugd2UgZG9uJ3QgZG8gYW55IGRyYXdpbmcKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBidWZmZXIpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlcihoYWxmIHIsIGhhbGYgZywgaGFsZiBiLCBoYWxmIGEpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsUmVkQnVmZmVyKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxHcmVlbkJ1ZmZlcigpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQmx1ZUJ1ZmZlcigpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsUmVkVHJhbnNwYXJlbnRCdWZmZXIoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbFJlZE9mZnNldEJ1ZmZlcigpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyUGh5c2ljYWxPZmZzZXQoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNoZWNrZXJzKHVpbnQzMl90IHJvdGF0aW9uKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMCgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MCgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUxODAoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJXaXRoTGF5ZXJUcmFuc2Zvcm0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxCdWZmZXJXaXRoQ29sb3JUcmFuc2Zvcm0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlckNvbG9yVHJhbnNmb3JtKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KKyAgICB2b2lkIGZpbGxSZWRCdWZmZXJXaXRoUm91bmRlZENvcm5lcnMoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgZmlsbEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVycygpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBmaWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmQoKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50PgorICAgIHZvaWQgb3ZlcmxheUNvcm5lcnMoKTsKKworICAgIHZvaWQgZmlsbFJlZEJ1ZmZlclRleHR1cmVUcmFuc2Zvcm0oKTsKKworICAgIHZvaWQgZmlsbEJ1ZmZlclRleHR1cmVUcmFuc2Zvcm0oKTsKKworICAgIHZvaWQgZmlsbFJlZEJ1ZmZlcldpdGhQcmVtdWx0aXBseUFscGhhKCk7CisKKyAgICB2b2lkIGZpbGxCdWZmZXJXaXRoUHJlbXVsdGlwbHlBbHBoYSgpOworCisgICAgdm9pZCBmaWxsUmVkQnVmZmVyV2l0aG91dFByZW11bHRpcGx5QWxwaGEoKTsKKworICAgIHZvaWQgZmlsbEJ1ZmZlcldpdGhvdXRQcmVtdWx0aXBseUFscGhhKCk7CisKKyAgICB2b2lkIGZpbGxHcmVlbkNvbG9yQnVmZmVyVGhlbkNsZWFyUmVnaW9uKCk7CisKKyAgICB2b2lkIGNsZWFyTGVmdFJlZ2lvbigpOworCisgICAgdm9pZCBjbGVhclJlZ2lvbigpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+CisgICAgdm9pZCBkcmF3U2hhZG93KGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyYgY2FzdGluZ0xheWVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzJiBzaGFkb3csIGNvbnN0IHVieXRlNCYgY2FzdGVyQ29sb3IsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVieXRlNCYgYmFja2dyb3VuZENvbG9yKTsKKworICAgIC8vIEtlZXAgYXJvdW5kIHRoZSBzYW1lIHJlbmRlcmVuZ2luZSBvYmplY3QgdG8gc2F2ZSBvbiBpbml0aWFsaXphdGlvbiB0aW1lLgorICAgIC8vIEZvciBub3csIGV4ZXJjaXNlIHRoZSBHTCBiYWNrZW5kIGRpcmVjdGx5IHNvIHRoYXQgc29tZSBjYWNoaW5nIHNwZWNpZmljcworICAgIC8vIGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgaW50ZXJmYWNlLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpnbDo6R0xFU1JlbmRlckVuZ2luZT4gc1JFOworICAgIC8vIEhhY2sgdG8gYXZvaWQgTlBFIGluIHRoZSBFR0wgZHJpdmVyOiB0aGUgR3JhcGhpY0J1ZmZlciBuZWVkcyB0bworICAgIC8vIGJlIGZyZWVkICphZnRlciogUmVuZGVyRW5naW5lIGlzIGRlc3Ryb3llZCwgc28gdGhhdCB0aGUgRUdMIGltYWdlIGlzCisgICAgLy8gZGVzdHJveWVkIGZpcnN0LgorICAgIHN0YXRpYyBzcDxHcmFwaGljQnVmZmVyPiBzQ3VycmVudEJ1ZmZlcjsKKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbVRleE5hbWVzOworfTsKKworc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6Z2w6OkdMRVNSZW5kZXJFbmdpbmU+IFJlbmRlckVuZ2luZVRlc3Q6OnNSRSA9IG51bGxwdHI7CitzcDxHcmFwaGljQnVmZmVyPiBSZW5kZXJFbmdpbmVUZXN0OjpzQ3VycmVudEJ1ZmZlciA9IG51bGxwdHI7CisKK3N0cnVjdCBDb2xvclNvdXJjZVZhcmlhbnQgeworICAgIHN0YXRpYyB2b2lkIGZpbGxDb2xvcihyZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGxheWVyLCBoYWxmIHIsIGhhbGYgZywgaGFsZiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJFbmdpbmVUZXN0KiAvKmZpeHR1cmUqLykgeworICAgICAgICBsYXllci5zb3VyY2Uuc29saWRDb2xvciA9IGhhbGYzKHIsIGcsIGIpOworICAgIH0KK307CisKK3N0cnVjdCBSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQgeworICAgIHN0YXRpYyB2b2lkIHNldE9wYXF1ZUJpdChyZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGxheWVyKSB7CisgICAgICAgIGxheWVyLnNvdXJjZS5idWZmZXIuaXNPcGFxdWUgPSBmYWxzZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdWludDhfdCBnZXRBbHBoYUNoYW5uZWwoKSB7IHJldHVybiAyNTU7IH0KK307CisKK3N0cnVjdCBGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQgeworICAgIHN0YXRpYyB2b2lkIHNldE9wYXF1ZUJpdChyZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MmIGxheWVyKSB7CisgICAgICAgIGxheWVyLnNvdXJjZS5idWZmZXIuaXNPcGFxdWUgPSB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB1aW50OF90IGdldEFscGhhQ2hhbm5lbCgpIHsKKyAgICAgICAgLy8gVGhlIGlzT3BhcXVlIGJpdCB3aWxsIG92ZXJyaWRlIHRoZSBhbHBoYSBjaGFubmVsLCBzbyB0aGlzIHNob3VsZCBiZQorICAgICAgICAvLyBhcmJpdHJhcnkuCisgICAgICAgIHJldHVybiAxMDsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BhcXVlbmVzc1ZhcmlhbnQ+CitzdHJ1Y3QgQnVmZmVyU291cmNlVmFyaWFudCB7CisgICAgc3RhdGljIHZvaWQgZmlsbENvbG9yKHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyYgbGF5ZXIsIGhhbGYgciwgaGFsZiBnLCBoYWxmIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlckVuZ2luZVRlc3QqIGZpeHR1cmUpIHsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmID0gUmVuZGVyRW5naW5lVGVzdDo6YWxsb2NhdGVTb3VyY2VCdWZmZXIoMSwgMSk7CisgICAgICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgICAgIGZpeHR1cmUtPnNSRS0+Z2VuVGV4dHVyZXMoMSwgJnRleE5hbWUpOworICAgICAgICBmaXh0dXJlLT5tVGV4TmFtZXMucHVzaF9iYWNrKHRleE5hbWUpOworCisgICAgICAgIHVpbnQ4X3QqIHBpeGVsczsKKyAgICAgICAgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworCisgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBidWYtPmdldEhlaWdodCgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIGl0ZXIgPSBwaXhlbHMgKyAoYnVmLT5nZXRTdHJpZGUoKSAqIGopICogNDsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBidWYtPmdldFdpZHRoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGl0ZXJbMF0gPSB1aW50OF90KHIgKiAyNTUpOworICAgICAgICAgICAgICAgIGl0ZXJbMV0gPSB1aW50OF90KGcgKiAyNTUpOworICAgICAgICAgICAgICAgIGl0ZXJbMl0gPSB1aW50OF90KGIgKiAyNTUpOworICAgICAgICAgICAgICAgIGl0ZXJbM10gPSBPcGFxdWVuZXNzVmFyaWFudDo6Z2V0QWxwaGFDaGFubmVsKCk7CisgICAgICAgICAgICAgICAgaXRlciArPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmLT51bmxvY2soKTsKKworICAgICAgICBsYXllci5zb3VyY2UuYnVmZmVyLmJ1ZmZlciA9IGJ1ZjsKKyAgICAgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci50ZXh0dXJlTmFtZSA9IHRleE5hbWU7CisgICAgICAgIE9wYXF1ZW5lc3NWYXJpYW50OjpzZXRPcGFxdWVCaXQobGF5ZXIpOworICAgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyKGhhbGYgciwgaGFsZiBnLCBoYWxmIGIsIGhhbGYgYSkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXIsIHIsIGcsIGIsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gYTsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkQnVmZmVyKCkgeworICAgIGZpbGxCdWZmZXI8U291cmNlVmFyaWFudD4oMS4wZiwgMC4wZiwgMC4wZiwgMS4wZik7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoZnVsbHNjcmVlblJlY3QoKSwgMjU1LCAwLCAwLCAyNTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEdyZWVuQnVmZmVyKCkgeworICAgIGZpbGxCdWZmZXI8U291cmNlVmFyaWFudD4oMC4wZiwgMS4wZiwgMC4wZiwgMS4wZik7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoZnVsbHNjcmVlblJlY3QoKSwgMCwgMjU1LCAwLCAyNTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJsdWVCdWZmZXIoKSB7CisgICAgZmlsbEJ1ZmZlcjxTb3VyY2VWYXJpYW50PigwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAwLCAwLCAyNTUsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkVHJhbnNwYXJlbnRCdWZmZXIoKSB7CisgICAgZmlsbEJ1ZmZlcjxTb3VyY2VWYXJpYW50PigxLjBmLCAwLjBmLCAwLjBmLCAuMmYpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDUxLCAwLCAwLCA1MSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkT2Zmc2V0QnVmZmVyKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IG9mZnNldFJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gb2Zmc2V0UmVjdEF0WmVybygpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBvZmZzZXRSZWN0QXRaZXJvKCkudG9GbG9hdFJlY3QoKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gMS4wZjsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0KCkgeworICAgIGZpbGxSZWRPZmZzZXRCdWZmZXI8U291cmNlVmFyaWFudD4oKTsKKworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX09GRlNFVCwgREVGQVVMVF9ESVNQTEFZX09GRlNFVCwgREVGQVVMVF9ESVNQTEFZX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMjU1LCAwLCAwLCAyNTUpOworICAgIFJlY3Qgb2Zmc2V0UmVnaW9uTGVmdChERUZBVUxUX0RJU1BMQVlfT0ZGU0VULCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKTsKKyAgICBSZWN0IG9mZnNldFJlZ2lvblRvcChERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9PRkZTRVQpOworCisgICAgZXhwZWN0QnVmZmVyQ29sb3Iob2Zmc2V0UmVnaW9uTGVmdCwgMCwgMCwgMCwgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3Iob2Zmc2V0UmVnaW9uVG9wLCAwLCAwLCAwLCAwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJDaGVja2Vycyh1aW50MzJfdCBvcmllbnRhdGlvbkZsYWcpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIC8vIEhlcmUgbG9naWNhbCBzcGFjZSBpcyAyeDIKKyAgICBzZXR0aW5ncy5jbGlwID0gUmVjdCgyLCAyKTsKKyAgICBzZXR0aW5ncy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uRmxhZzsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllck9uZTsKKyAgICBSZWN0IHJlY3RPbmUoMCwgMCwgMSwgMSk7CisgICAgbGF5ZXJPbmUuZ2VvbWV0cnkuYm91bmRhcmllcyA9IHJlY3RPbmUudG9GbG9hdFJlY3QoKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXJPbmUsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyT25lLmFscGhhID0gMS4wZjsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllclR3bzsKKyAgICBSZWN0IHJlY3RUd28oMCwgMSwgMSwgMik7CisgICAgbGF5ZXJUd28uZ2VvbWV0cnkuYm91bmRhcmllcyA9IHJlY3RUd28udG9GbG9hdFJlY3QoKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXJUd28sIDAuMGYsIDEuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyVHdvLmFscGhhID0gMS4wZjsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllclRocmVlOworICAgIFJlY3QgcmVjdFRocmVlKDEsIDAsIDIsIDEpOworICAgIGxheWVyVGhyZWUuZ2VvbWV0cnkuYm91bmRhcmllcyA9IHJlY3RUaHJlZS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllclRocmVlLCAwLjBmLCAwLjBmLCAxLjBmLCB0aGlzKTsKKyAgICBsYXllclRocmVlLmFscGhhID0gMS4wZjsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyT25lKTsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllclR3byk7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXJUaHJlZSk7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMCgpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnM8U291cmNlVmFyaWFudD4odWk6OlRyYW5zZm9ybTo6Uk9UXzApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLCAyNTUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTUsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDI1NSwgMCwgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTkwKCkgeworICAgIGZpbGxCdWZmZXJDaGVja2VyczxTb3VyY2VWYXJpYW50Pih1aTo6VHJhbnNmb3JtOjpST1RfOTApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLCAwLCAyNTUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUsIDAsIDAsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMjU1LCAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MCgpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnM8U291cmNlVmFyaWFudD4odWk6OlRyYW5zZm9ybTo6Uk9UXzE4MCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdCgwLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMjU1LCAwLCAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLAorICAgICAgICAgICAgICAgICAgICAgIDI1NSwgMCwgMCwgMjU1KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLCBERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMjU1LCAyNTUpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwKCkgeworICAgIGZpbGxCdWZmZXJDaGVja2VyczxTb3VyY2VWYXJpYW50Pih1aTo6VHJhbnNmb3JtOjpST1RfMjcwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyKSwgMCwgMCwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMjU1LCAwLCAyNTUpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUsIDAsIDAsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyV2l0aExheWVyVHJhbnNmb3JtKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgLy8gSGVyZSBsb2dpY2FsIHNwYWNlIGlzIDJ4MgorICAgIHNldHRpbmdzLmNsaXAgPSBSZWN0KDIsIDIpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBSZWN0KDEsIDEpLnRvRmxvYXRSZWN0KCk7CisgICAgLy8gVHJhbnNsYXRlIG9uZSBwaXhlbCBkaWFnb25hbGx5CisgICAgbGF5ZXIuZ2VvbWV0cnkucG9zaXRpb25UcmFuc2Zvcm0gPSBtYXQ0KDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuc291cmNlLnNvbGlkQ29sb3IgPSBoYWxmMygxLjBmLCAwLjBmLCAwLjBmKTsKKyAgICBsYXllci5hbHBoYSA9IDEuMGY7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtKCkgeworICAgIGZpbGxCdWZmZXJXaXRoTGF5ZXJUcmFuc2Zvcm08U291cmNlVmFyaWFudD4oKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDIpLCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDIsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAyNTUsIDAsIDAsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyV2l0aENvbG9yVHJhbnNmb3JtKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IFJlY3QoMSwgMSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IFJlY3QoMSwgMSkudG9GbG9hdFJlY3QoKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXIsIDAuNWYsIDAuMjVmLCAwLjEyNWYsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gMS4wZjsKKworICAgIC8vIGNvbnN0cnVjdCBhIGZha2UgY29sb3IgbWF0cml4CisgICAgLy8gYW5uaWhpbGF0ZSBncmVlbiBhbmQgYmx1ZSBjaGFubmVscworICAgIHNldHRpbmdzLmNvbG9yVHJhbnNmb3JtID0gbWF0NDo6c2NhbGUodmVjNCgxLCAwLCAwLCAxKSk7CisgICAgLy8gc2V0IHJlZCBjaGFubmVsIHRvIHJlZCArIGdyZWVuCisgICAgbGF5ZXIuY29sb3JUcmFuc2Zvcm0gPSBtYXQ0KDEsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEpOworCisgICAgbGF5ZXIuYWxwaGEgPSAxLjBmOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBSZWN0KDEsIDEpLnRvRmxvYXRSZWN0KCk7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU291cmNlVmFyaWFudD4KK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlckNvbG9yVHJhbnNmb3JtKCkgeworICAgIGZpbGxCdWZmZXJXaXRoQ29sb3JUcmFuc2Zvcm08U291cmNlVmFyaWFudD4oKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAxOTEsIDAsIDAsIDI1NSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkQnVmZmVyV2l0aFJvdW5kZWRDb3JuZXJzKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBsYXllci5nZW9tZXRyeS5yb3VuZGVkQ29ybmVyc1JhZGl1cyA9IDUuMGY7CisgICAgbGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNDcm9wID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjBmOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJXaXRoUm91bmRlZENvcm5lcnMoKSB7CisgICAgZmlsbFJlZEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVyczxTb3VyY2VWYXJpYW50PigpOworICAgIC8vIENvcm5lcnMgc2hvdWxkIGJlIGlnbm9yZWQuLi4KKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KDAsIDAsIDEsIDEpLCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAtIDEsIDAsIERFRkFVTFRfRElTUExBWV9XSURUSCwgMSksIDAsIDAsIDAsIDApOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoMCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAtIDEsIDEsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpLCAwLCAwLCAwLCAwKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAtIDEsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKKyAgICAvLyAuLi5BbmQgdGhlIG5vbi1yb3VuZGVkIHBvcnRpb24gc2hvdWxkIGJlIHJlZC4KKyAgICAvLyBPdGhlciBwaXhlbHMgbWF5IGJlIGFudGktYWxpYXNlZCwgc28gbGV0J3Mgbm90IGNoZWNrIHRob3NlLgorICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoNSwgNSwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC0gNSwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAtIDUpLCAyNTUsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgMjU1KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicm8uc3VyZmFjZV9mbGluZ2VyLnN1cHBvcnRzX2JhY2tncm91bmRfYmx1ciIsIHZhbHVlLCAiMCIpOworICAgIGlmICghYXRvaSh2YWx1ZSkpIHsKKyAgICAgICAgLy8gVGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGJsdXJzLCBuby1vcC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gYmx1clJhZGl1cyA9IDUwOworICAgIGF1dG8gY2VudGVyID0gREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMjsKKworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgYmFja2dyb3VuZExheWVyOworICAgIGJhY2tncm91bmRMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihiYWNrZ3JvdW5kTGF5ZXIsIDAuMGYsIDEuMGYsIDAuMGYsIHRoaXMpOworICAgIGJhY2tncm91bmRMYXllci5hbHBoYSA9IDEuMGY7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmYmFja2dyb3VuZExheWVyKTsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsZWZ0TGF5ZXI7CisgICAgbGVmdExheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPQorICAgICAgICAgICAgUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKS50b0Zsb2F0UmVjdCgpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsZWZ0TGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxlZnRMYXllci5hbHBoYSA9IDEuMGY7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGVmdExheWVyKTsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBibHVyTGF5ZXI7CisgICAgYmx1ckxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgYmx1ckxheWVyLmJhY2tncm91bmRCbHVyUmFkaXVzID0gYmx1clJhZGl1czsKKyAgICBibHVyTGF5ZXIuYWxwaGEgPSAwOworICAgIGxheWVycy5wdXNoX2JhY2soJmJsdXJMYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworCisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChjZW50ZXIgLSAxLCBjZW50ZXIgLSA1LCBjZW50ZXIsIGNlbnRlciArIDUpLCAxNTAsIDE1MCwgMCwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgIDUwIC8qIHRvbGVyYW5jZSAqLyk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChjZW50ZXIsIGNlbnRlciAtIDUsIGNlbnRlciArIDEsIGNlbnRlciArIDUpLCAxNTAsIDE1MCwgMCwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgIDUwIC8qIHRvbGVyYW5jZSAqLyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VWYXJpYW50Pgordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpvdmVybGF5Q29ybmVycygpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBmdWxsc2NyZWVuUmVjdCgpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzRmlyc3Q7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXJPbmU7CisgICAgbGF5ZXJPbmUuZ2VvbWV0cnkuYm91bmRhcmllcyA9CisgICAgICAgICAgICBGbG9hdFJlY3QoMCwgMCwgREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wLCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUIC8gMy4wKTsKKyAgICBTb3VyY2VWYXJpYW50OjpmaWxsQ29sb3IobGF5ZXJPbmUsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyT25lLmFscGhhID0gMC4yOworCisgICAgbGF5ZXJzRmlyc3QucHVzaF9iYWNrKCZsYXllck9uZSk7CisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzRmlyc3QsIG1CdWZmZXIpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMywgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMpLCA1MSwgMCwgMCwgNTEpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMyArIDEsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAzICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRElTUExBWV9XSURUSCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnNTZWNvbmQ7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyVHdvOworICAgIGxheWVyVHdvLmdlb21ldHJ5LmJvdW5kYXJpZXMgPQorICAgICAgICAgICAgRmxvYXRSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDMuMCwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMuMCwKKyAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfV0lEVEgsIERFRkFVTFRfRElTUExBWV9IRUlHSFQpOworICAgIFNvdXJjZVZhcmlhbnQ6OmZpbGxDb2xvcihsYXllclR3bywgMC4wZiwgMS4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXJUd28uYWxwaGEgPSAxLjBmOworCisgICAgbGF5ZXJzU2Vjb25kLnB1c2hfYmFjaygmbGF5ZXJUd28pOworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVyc1NlY29uZCwgbUJ1ZmZlcik7CisKKyAgICBleHBlY3RCdWZmZXJDb2xvcihSZWN0KERFRkFVTFRfRElTUExBWV9XSURUSCAvIDMsIERFRkFVTFRfRElTUExBWV9IRUlHSFQgLyAzKSwgMCwgMCwgMCwgMCk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAzICsgMSwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ESVNQTEFZX1dJRFRILCBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyNTUsIDAsIDI1NSk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbFJlZEJ1ZmZlclRleHR1cmVUcmFuc2Zvcm0oKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gUmVjdCgxLCAxKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICAvLyBIZXJlIHdpbGwgYWxsb2NhdGUgYSBjaGVja2VyIGJvYXJkIHRleHR1cmUsIGJ1dCB0cmFuc2Zvcm0gdGV4dHVyZQorICAgIC8vIGNvb3JkaW5hdGVzIHNvIHRoYXQgb25seSB0aGUgdXBwZXIgbGVmdCBpcyBhcHBsaWVkLgorICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IGFsbG9jYXRlU291cmNlQnVmZmVyKDIsIDIpOworICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgUmVuZGVyRW5naW5lVGVzdDo6c1JFLT5nZW5UZXh0dXJlcygxLCAmdGV4TmFtZSk7CisgICAgdGhpcy0+bVRleE5hbWVzLnB1c2hfYmFjayh0ZXhOYW1lKTsKKworICAgIHVpbnQ4X3QqIHBpeGVsczsKKyAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZwaXhlbHMpKTsKKyAgICAvLyBSZWQgdG9wIGxlZnQsIEdyZWVuIHRvcCByaWdodCwgQmx1ZSBib3R0b20gbGVmdCwgQmxhY2sgYm90dG9tIHJpZ2h0CisgICAgcGl4ZWxzWzBdID0gMjU1OworICAgIHBpeGVsc1sxXSA9IDA7CisgICAgcGl4ZWxzWzJdID0gMDsKKyAgICBwaXhlbHNbM10gPSAyNTU7CisgICAgcGl4ZWxzWzRdID0gMDsKKyAgICBwaXhlbHNbNV0gPSAyNTU7CisgICAgcGl4ZWxzWzZdID0gMDsKKyAgICBwaXhlbHNbN10gPSAyNTU7CisgICAgcGl4ZWxzWzhdID0gMDsKKyAgICBwaXhlbHNbOV0gPSAwOworICAgIHBpeGVsc1sxMF0gPSAyNTU7CisgICAgcGl4ZWxzWzExXSA9IDI1NTsKKyAgICBidWYtPnVubG9jaygpOworCisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci5idWZmZXIgPSBidWY7CisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci50ZXh0dXJlTmFtZSA9IHRleE5hbWU7CisgICAgLy8gVHJhbnNmb3JtIGNvb3JkaW5hdGVzIHRvIG9ubHkgYmUgaW5zaWRlIHRoZSByZWQgcXVhZHJhbnQuCisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci50ZXh0dXJlVHJhbnNmb3JtID0gbWF0NDo6c2NhbGUodmVjNCgwLjIsIDAuMiwgMSwgMSkpOworICAgIGxheWVyLmFscGhhID0gMS4wZjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gUmVjdCgxLCAxKS50b0Zsb2F0UmVjdCgpOworCisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsQnVmZmVyVGV4dHVyZVRyYW5zZm9ybSgpIHsKKyAgICBmaWxsUmVkQnVmZmVyVGV4dHVyZVRyYW5zZm9ybSgpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDI1NSwgMCwgMCwgMjU1KTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUZXN0OjpmaWxsUmVkQnVmZmVyV2l0aFByZW11bHRpcGx5QWxwaGEoKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICAvLyBIZXJlIGxvZ2ljYWwgc3BhY2UgaXMgMXgxCisgICAgc2V0dGluZ3MuY2xpcCA9IFJlY3QoMSwgMSk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmID0gYWxsb2NhdGVTb3VyY2VCdWZmZXIoMSwgMSk7CisgICAgdWludDMyX3QgdGV4TmFtZTsKKyAgICBSZW5kZXJFbmdpbmVUZXN0OjpzUkUtPmdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKKyAgICB0aGlzLT5tVGV4TmFtZXMucHVzaF9iYWNrKHRleE5hbWUpOworCisgICAgdWludDhfdCogcGl4ZWxzOworICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJnBpeGVscykpOworICAgIHBpeGVsc1swXSA9IDI1NTsKKyAgICBwaXhlbHNbMV0gPSAwOworICAgIHBpeGVsc1syXSA9IDA7CisgICAgcGl4ZWxzWzNdID0gMjU1OworICAgIGJ1Zi0+dW5sb2NrKCk7CisKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLmJ1ZmZlciA9IGJ1ZjsKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnRleHR1cmVOYW1lID0gdGV4TmFtZTsKKyAgICBsYXllci5zb3VyY2UuYnVmZmVyLnVzZVByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7CisgICAgbGF5ZXIuYWxwaGEgPSAwLjVmOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBSZWN0KDEsIDEpLnRvRmxvYXRSZWN0KCk7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmZpbGxCdWZmZXJXaXRoUHJlbXVsdGlwbHlBbHBoYSgpIHsKKyAgICBmaWxsUmVkQnVmZmVyV2l0aFByZW11bHRpcGx5QWxwaGEoKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAxMjgsIDAsIDAsIDEyOCk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbFJlZEJ1ZmZlcldpdGhvdXRQcmVtdWx0aXBseUFscGhhKCkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgLy8gSGVyZSBsb2dpY2FsIHNwYWNlIGlzIDF4MQorICAgIHNldHRpbmdzLmNsaXAgPSBSZWN0KDEsIDEpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IGFsbG9jYXRlU291cmNlQnVmZmVyKDEsIDEpOworICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgUmVuZGVyRW5naW5lVGVzdDo6c1JFLT5nZW5UZXh0dXJlcygxLCAmdGV4TmFtZSk7CisgICAgdGhpcy0+bVRleE5hbWVzLnB1c2hfYmFjayh0ZXhOYW1lKTsKKworICAgIHVpbnQ4X3QqIHBpeGVsczsKKyAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZwaXhlbHMpKTsKKyAgICBwaXhlbHNbMF0gPSAyNTU7CisgICAgcGl4ZWxzWzFdID0gMDsKKyAgICBwaXhlbHNbMl0gPSAwOworICAgIHBpeGVsc1szXSA9IDI1NTsKKyAgICBidWYtPnVubG9jaygpOworCisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci5idWZmZXIgPSBidWY7CisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci50ZXh0dXJlTmFtZSA9IHRleE5hbWU7CisgICAgbGF5ZXIuc291cmNlLmJ1ZmZlci51c2VQcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZTsKKyAgICBsYXllci5hbHBoYSA9IDAuNWY7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IFJlY3QoMSwgMSkudG9GbG9hdFJlY3QoKTsKKworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6ZmlsbEJ1ZmZlcldpdGhvdXRQcmVtdWx0aXBseUFscGhhKCkgeworICAgIGZpbGxSZWRCdWZmZXJXaXRob3V0UHJlbXVsdGlwbHlBbHBoYSgpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKGZ1bGxzY3JlZW5SZWN0KCksIDEyOCwgMCwgMCwgNjQsIDEpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmNsZWFyTGVmdFJlZ2lvbigpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIC8vIEhlcmUgbG9naWNhbCBzcGFjZSBpcyA0eDQKKyAgICBzZXR0aW5ncy5jbGlwID0gUmVjdCg0LCA0KTsKKyAgICBzZXR0aW5ncy5jbGVhclJlZ2lvbiA9IFJlZ2lvbihSZWN0KDIsIDQpKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgLy8gZmFrZSBsYXllciwgd2l0aG91dCBib3VuZHMgc2hvdWxkIG5vdCByZW5kZXIgYW55dGhpbmcKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworICAgIGludm9rZURyYXcoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlcik7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGVzdDo6Y2xlYXJSZWdpb24oKSB7CisgICAgLy8gUmV1c2UgbUJ1ZmZlcgorICAgIGNsZWFyTGVmdFJlZ2lvbigpOworICAgIGV4cGVjdEJ1ZmZlckNvbG9yKFJlY3QoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCksIDAsIDAsIDAsIDI1NSk7CisgICAgZXhwZWN0QnVmZmVyQ29sb3IoUmVjdChERUZBVUxUX0RJU1BMQVlfV0lEVEggLyAyLCAwLCBERUZBVUxUX0RJU1BMQVlfV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RJU1BMQVlfSEVJR0hUKSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVZhcmlhbnQ+Cit2b2lkIFJlbmRlckVuZ2luZVRlc3Q6OmRyYXdTaGFkb3coY29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzJiBjYXN0aW5nTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyZW5naW5lOjpTaGFkb3dTZXR0aW5ncyYgc2hhZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVieXRlNCYgY2FzdGVyQ29sb3IsIGNvbnN0IHVieXRlNCYgYmFja2dyb3VuZENvbG9yKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKworICAgIC8vIGFkZCBiYWNrZ3JvdW5kIGxheWVyCisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGJnTGF5ZXI7CisgICAgYmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIENvbG9yU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGJnTGF5ZXIsIGJhY2tncm91bmRDb2xvci5yIC8gMjU1LjBmLCBiYWNrZ3JvdW5kQ29sb3IuZyAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IuYiAvIDI1NS4wZiwgdGhpcyk7CisgICAgYmdMYXllci5hbHBoYSA9IGJhY2tncm91bmRDb2xvci5hIC8gMjU1LjBmOworICAgIGxheWVycy5wdXNoX2JhY2soJmJnTGF5ZXIpOworCisgICAgLy8gYWRkIHNoYWRvdyBsYXllcgorICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBzaGFkb3dMYXllcjsKKyAgICBzaGFkb3dMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGluZ0xheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXM7CisgICAgc2hhZG93TGF5ZXIuYWxwaGEgPSBjYXN0aW5nTGF5ZXIuYWxwaGE7CisgICAgc2hhZG93TGF5ZXIuc2hhZG93ID0gc2hhZG93OworICAgIGxheWVycy5wdXNoX2JhY2soJnNoYWRvd0xheWVyKTsKKworICAgIC8vIGFkZCBsYXllciBjYXN0aW5nIHRoZSBzaGFkb3cKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXIgPSBjYXN0aW5nTGF5ZXI7CisgICAgU291cmNlVmFyaWFudDo6ZmlsbENvbG9yKGxheWVyLCBjYXN0ZXJDb2xvci5yIC8gMjU1LjBmLCBjYXN0ZXJDb2xvci5nIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0ZXJDb2xvci5iIC8gMjU1LjBmLCB0aGlzKTsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBpbnZva2VEcmF3KHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19ub0xheWVyc1RvRHJhdykgeworICAgIGRyYXdFbXB0eUxheWVycygpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19udWxsT3V0cHV0QnVmZmVyKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pjo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBudWxscHRyLCB0cnVlLCBiYXNlOjp1bmlxdWVfZmQoKSwgJmZlbmNlKTsKKworICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIHN0YXR1cyk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX251bGxPdXRwdXRGZW5jZSkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgQnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+OjpmaWxsQ29sb3IobGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gMS4wOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IHNSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyLCB0cnVlLCBiYXNlOjp1bmlxdWVfZmQoKSwgbnVsbHB0cik7CisgICAgc0N1cnJlbnRCdWZmZXIgPSBtQnVmZmVyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAyNTUsIDAsIDAsIDI1NSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2RvZXNOb3RDYWNoZUZyYW1lYnVmZmVyKSB7CisgICAgcmVuZGVyZW5naW5lOjpEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3MucGh5c2ljYWxEaXNwbGF5ID0gZnVsbHNjcmVlblJlY3QoKTsKKyAgICBzZXR0aW5ncy5jbGlwID0gZnVsbHNjcmVlblJlY3QoKTsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyo+IGxheWVyczsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD46OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisgICAgbGF5ZXIuYWxwaGEgPSAxLjA7CisgICAgbGF5ZXJzLnB1c2hfYmFjaygmbGF5ZXIpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIsIGZhbHNlLCBiYXNlOjp1bmlxdWVfZmQoKSwgbnVsbHB0cik7CisgICAgc0N1cnJlbnRCdWZmZXIgPSBtQnVmZmVyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBBU1NFUlRfRkFMU0Uoc1JFLT5pc0ZyYW1lYnVmZmVySW1hZ2VDYWNoZWRGb3JUZXN0aW5nKG1CdWZmZXItPmdldElkKCkpKTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihmdWxsc2NyZWVuUmVjdCgpLCAyNTUsIDAsIDAsIDI1NSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxSZWRCdWZmZXJfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsUmVkQnVmZmVyPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEdyZWVuQnVmZmVyX2NvbG9yU291cmNlKSB7CisgICAgZmlsbEdyZWVuQnVmZmVyPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJsdWVCdWZmZXJfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsQmx1ZUJ1ZmZlcjxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcl9jb2xvclNvdXJjZSkgeworICAgIGZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcjxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJQaHlzaWNhbE9mZnNldF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJQaHlzaWNhbE9mZnNldDxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTBfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUwPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlOTBfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MDxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MDxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTI3MF9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTI3MDxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJMYXllclRyYW5zZm9ybV9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybTxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDb2xvclRyYW5zZm9ybV9jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybTxDb2xvclNvdXJjZVZhcmlhbnQ+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJSb3VuZGVkQ29ybmVyc19jb2xvclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJXaXRoUm91bmRlZENvcm5lcnM8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmRfY29sb3JTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmQ8Q29sb3JTb3VyY2VWYXJpYW50PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19vdmVybGF5Q29ybmVyc19jb2xvclNvdXJjZSkgeworICAgIG92ZXJsYXlDb3JuZXJzPENvbG9yU291cmNlVmFyaWFudD4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZEJ1ZmZlcl9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsUmVkQnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEdyZWVuQnVmZmVyX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxHcmVlbkJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCbHVlQnVmZmVyX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCbHVlQnVmZmVyPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFJlZFRyYW5zcGFyZW50QnVmZmVyX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJQaHlzaWNhbE9mZnNldF9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyUGh5c2ljYWxPZmZzZXQ8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUwX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTA8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MF9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGU5MDxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTE4MF9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUxODA8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUyNzBfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtX29wYXF1ZUJ1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJMYXllclRyYW5zZm9ybTxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJDb2xvclRyYW5zZm9ybV9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyTGF5ZXJUcmFuc2Zvcm08QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyUm91bmRlZENvcm5lcnNfb3BhcXVlQnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhSb3VuZGVkQ29ybmVyczxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJBbmRCbHVyQmFja2dyb3VuZF9vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmQ8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19vdmVybGF5Q29ybmVyc19vcGFxdWVCdWZmZXJTb3VyY2UpIHsKKyAgICBvdmVybGF5Q29ybmVyczxCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxSZWRCdWZmZXJfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbFJlZEJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxHcmVlbkJ1ZmZlcl9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsR3JlZW5CdWZmZXI8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQmx1ZUJ1ZmZlcl9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQmx1ZUJ1ZmZlcjxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxSZWRUcmFuc3BhcmVudEJ1ZmZlcl9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsUmVkVHJhbnNwYXJlbnRCdWZmZXI8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyUGh5c2ljYWxPZmZzZXRfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlclBoeXNpY2FsT2Zmc2V0PEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMF9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUwPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlOTBfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlOTA8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ2hlY2tlcnNSb3RhdGUxODBfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMTgwPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlckNoZWNrZXJzUm90YXRlMjcwX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJDaGVja2Vyc1JvdGF0ZTI3MDxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJMYXllclRyYW5zZm9ybV9idWZmZXJTb3VyY2UpIHsKKyAgICBmaWxsQnVmZmVyTGF5ZXJUcmFuc2Zvcm08QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQ29sb3JUcmFuc2Zvcm1fYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckxheWVyVHJhbnNmb3JtPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbEJ1ZmZlclJvdW5kZWRDb3JuZXJzX2J1ZmZlclNvdXJjZSkgeworICAgIGZpbGxCdWZmZXJXaXRoUm91bmRlZENvcm5lcnM8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyQW5kQmx1ckJhY2tncm91bmRfYnVmZmVyU291cmNlKSB7CisgICAgZmlsbEJ1ZmZlckFuZEJsdXJCYWNrZ3JvdW5kPEJ1ZmZlclNvdXJjZVZhcmlhbnQ8UmVsYXhPcGFxdWVCdWZmZXJWYXJpYW50Pj4oKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfb3ZlcmxheUNvcm5lcnNfYnVmZmVyU291cmNlKSB7CisgICAgb3ZlcmxheUNvcm5lcnM8QnVmZmVyU291cmNlVmFyaWFudDxSZWxheE9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsQnVmZmVyVGV4dHVyZVRyYW5zZm9ybSkgeworICAgIGZpbGxCdWZmZXJUZXh0dXJlVHJhbnNmb3JtKCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJfcHJlbXVsdGlwbGllc0FscGhhKSB7CisgICAgZmlsbEJ1ZmZlcldpdGhQcmVtdWx0aXBseUFscGhhKCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxCdWZmZXJfd2l0aG91dFByZW11bHRpcGx5aW5nQWxwaGEpIHsKKyAgICBmaWxsQnVmZmVyV2l0aG91dFByZW11bHRpcGx5QWxwaGEoKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfY2xlYXJSZWdpb24pIHsKKyAgICBjbGVhclJlZ2lvbigpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgZHJhd0xheWVyc19maWxsc0J1ZmZlckFuZENhY2hlc0ltYWdlcykgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgbGF5ZXI7CisgICAgbGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGZ1bGxzY3JlZW5SZWN0KCkudG9GbG9hdFJlY3QoKTsKKyAgICBCdWZmZXJTb3VyY2VWYXJpYW50PEZvcmNlT3BhcXVlQnVmZmVyVmFyaWFudD46OmZpbGxDb2xvcihsYXllciwgMS4wZiwgMC4wZiwgMC4wZiwgdGhpcyk7CisKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisgICAgaW52b2tlRHJhdyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyKTsKKyAgICB1aW50NjRfdCBidWZmZXJJZCA9IGxheWVyLnNvdXJjZS5idWZmZXIuYnVmZmVyLT5nZXRJZCgpOworICAgIEVYUEVDVF9UUlVFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8cmVuZGVyZW5naW5lOjpnbDo6SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPiBiYXJyaWVyID0KKyAgICAgICAgICAgIHNSRS0+dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyRm9yVGVzdGluZyhidWZmZXJJZCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYmFycmllci0+bXV0ZXgpOworICAgIEFTU0VSVF9UUlVFKGJhcnJpZXItPmNvbmRpdGlvbi53YWl0X2ZvcihiYXJyaWVyLT5tdXRleCwgc3RkOjpjaHJvbm86OnNlY29uZHMoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSgpIFJFUVVJUkVTKGJhcnJpZXItPm11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFycmllci0+aXNPcGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgRVhQRUNUX0ZBTFNFKHNSRS0+aXNJbWFnZUNhY2hlZEZvclRlc3RpbmcoYnVmZmVySWQpKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGJhcnJpZXItPnJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBiaW5kRXh0ZXJuYWxCdWZmZXJfd2l0aE51bGxCdWZmZXIpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBzUkUtPmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMCwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGJpbmRFeHRlcm5hbEJ1ZmZlcl9jYWNoZXNJbWFnZXMpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBhbGxvY2F0ZVNvdXJjZUJ1ZmZlcigxLCAxKTsKKyAgICB1aW50MzJfdCB0ZXhOYW1lOworICAgIHNSRS0+Z2VuVGV4dHVyZXMoMSwgJnRleE5hbWUpOworICAgIG1UZXhOYW1lcy5wdXNoX2JhY2sodGV4TmFtZSk7CisKKyAgICBzUkUtPmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodGV4TmFtZSwgYnVmLCBudWxscHRyKTsKKyAgICB1aW50NjRfdCBidWZmZXJJZCA9IGJ1Zi0+Z2V0SWQoKTsKKyAgICBFWFBFQ1RfVFJVRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHJlbmRlcmVuZ2luZTo6Z2w6OkltYWdlTWFuYWdlcjo6QmFycmllcj4gYmFycmllciA9CisgICAgICAgICAgICBzUkUtPnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlckZvclRlc3RpbmcoYnVmZmVySWQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGJhcnJpZXItPm11dGV4KTsKKyAgICBBU1NFUlRfVFJVRShiYXJyaWVyLT5jb25kaXRpb24ud2FpdF9mb3IoYmFycmllci0+bXV0ZXgsIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhiYXJyaWVyLT5tdXRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhcnJpZXItPmlzT3BlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgYmFycmllci0+cmVzdWx0KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc1JFLT5pc0ltYWdlQ2FjaGVkRm9yVGVzdGluZyhidWZmZXJJZCkpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgY2FjaGVFeHRlcm5hbEJ1ZmZlcl93aXRoTnVsbEJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxyZW5kZXJlbmdpbmU6OmdsOjpJbWFnZU1hbmFnZXI6OkJhcnJpZXI+IGJhcnJpZXIgPQorICAgICAgICAgICAgc1JFLT5jYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlckZvclRlc3RpbmcobnVsbHB0cik7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYmFycmllci0+bXV0ZXgpOworICAgIEFTU0VSVF9UUlVFKGJhcnJpZXItPmNvbmRpdGlvbi53YWl0X2ZvcihiYXJyaWVyLT5tdXRleCwgc3RkOjpjaHJvbm86OnNlY29uZHMoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSgpIFJFUVVJUkVTKGJhcnJpZXItPm11dGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFycmllci0+aXNPcGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgRVhQRUNUX1RSVUUoYmFycmllci0+aXNPcGVuKTsKKyAgICBFWFBFQ1RfRVEoQkFEX1ZBTFVFLCBiYXJyaWVyLT5yZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGVzdCwgY2FjaGVFeHRlcm5hbEJ1ZmZlcl9jYWNoZXNJbWFnZXMpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBhbGxvY2F0ZVNvdXJjZUJ1ZmZlcigxLCAxKTsKKyAgICB1aW50NjRfdCBidWZmZXJJZCA9IGJ1Zi0+Z2V0SWQoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8cmVuZGVyZW5naW5lOjpnbDo6SW1hZ2VNYW5hZ2VyOjpCYXJyaWVyPiBiYXJyaWVyID0KKyAgICAgICAgICAgIHNSRS0+Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXJGb3JUZXN0aW5nKGJ1Zik7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhiYXJyaWVyLT5tdXRleCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJhcnJpZXItPmNvbmRpdGlvbi53YWl0X2ZvcihiYXJyaWVyLT5tdXRleCwgc3RkOjpjaHJvbm86OnNlY29uZHMoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oKSBSRVFVSVJFUyhiYXJyaWVyLT5tdXRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXJyaWVyLT5pc09wZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgIEVYUEVDVF9FUShOT19FUlJPUiwgYmFycmllci0+cmVzdWx0KTsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUoc1JFLT5pc0ltYWdlQ2FjaGVkRm9yVGVzdGluZyhidWZmZXJJZCkpOworICAgIGJhcnJpZXIgPSBzUkUtPnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlckZvclRlc3RpbmcoYnVmZmVySWQpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYmFycmllci0+bXV0ZXgpOworICAgICAgICBBU1NFUlRfVFJVRShiYXJyaWVyLT5jb25kaXRpb24ud2FpdF9mb3IoYmFycmllci0+bXV0ZXgsIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKCkgUkVRVUlSRVMoYmFycmllci0+bXV0ZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFycmllci0+aXNPcGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGJhcnJpZXItPnJlc3VsdCk7CisgICAgfQorICAgIEVYUEVDVF9GQUxTRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxTaGFkb3dfY2FzdGVyTGF5ZXJNaW5TaXplKSB7CisgICAgY29uc3QgdWJ5dGU0IGNhc3RlckNvbG9yKDI1NSwgMCwgMCwgMjU1KTsKKyAgICBjb25zdCB1Ynl0ZTQgYmFja2dyb3VuZENvbG9yKDI1NSwgMjU1LCAyNTUsIDI1NSk7CisgICAgY29uc3QgZmxvYXQgc2hhZG93TGVuZ3RoID0gNS4wZjsKKyAgICBSZWN0IGNhc3RlckJvdW5kcygxLCAxKTsKKyAgICBjYXN0ZXJCb3VuZHMub2Zmc2V0Qnkoc2hhZG93TGVuZ3RoICsgMSwgc2hhZG93TGVuZ3RoICsgMSk7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGNhc3RpbmdMYXllcjsKKyAgICBjYXN0aW5nTGF5ZXIuZ2VvbWV0cnkuYm91bmRhcmllcyA9IGNhc3RlckJvdW5kcy50b0Zsb2F0UmVjdCgpOworICAgIGNhc3RpbmdMYXllci5hbHBoYSA9IDEuMGY7CisgICAgcmVuZGVyZW5naW5lOjpTaGFkb3dTZXR0aW5ncyBzZXR0aW5ncyA9CisgICAgICAgICAgICBnZXRTaGFkb3dTZXR0aW5ncyh2ZWMyKGNhc3RlckJvdW5kcy5sZWZ0LCBjYXN0ZXJCb3VuZHMudG9wKSwgc2hhZG93TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogY2FzdGVySXNUcmFuc2x1Y2VudCAqLyk7CisKKyAgICBkcmF3U2hhZG93PENvbG9yU291cmNlVmFyaWFudD4oY2FzdGluZ0xheWVyLCBzZXR0aW5ncywgY2FzdGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7CisgICAgZXhwZWN0U2hhZG93Q29sb3IoY2FzdGluZ0xheWVyLCBzZXR0aW5ncywgY2FzdGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUZXN0LCBkcmF3TGF5ZXJzX2ZpbGxTaGFkb3dfY2FzdGVyQ29sb3JMYXllcikgeworICAgIGNvbnN0IHVieXRlNCBjYXN0ZXJDb2xvcigyNTUsIDAsIDAsIDI1NSk7CisgICAgY29uc3QgdWJ5dGU0IGJhY2tncm91bmRDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgIGNvbnN0IGZsb2F0IHNoYWRvd0xlbmd0aCA9IDUuMGY7CisgICAgUmVjdCBjYXN0ZXJCb3VuZHMoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wZiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMuMGYpOworICAgIGNhc3RlckJvdW5kcy5vZmZzZXRCeShzaGFkb3dMZW5ndGggKyAxLCBzaGFkb3dMZW5ndGggKyAxKTsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgY2FzdGluZ0xheWVyOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmFscGhhID0gMS4wZjsKKyAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNldHRpbmdzID0KKyAgICAgICAgICAgIGdldFNoYWRvd1NldHRpbmdzKHZlYzIoY2FzdGVyQm91bmRzLmxlZnQsIGNhc3RlckJvdW5kcy50b3ApLCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYXN0ZXJJc1RyYW5zbHVjZW50ICovKTsKKworICAgIGRyYXdTaGFkb3c8Q29sb3JTb3VyY2VWYXJpYW50PihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKKyAgICBleHBlY3RTaGFkb3dDb2xvcihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFNoYWRvd19jYXN0ZXJPcGFxdWVCdWZmZXJMYXllcikgeworICAgIGNvbnN0IHVieXRlNCBjYXN0ZXJDb2xvcigyNTUsIDAsIDAsIDI1NSk7CisgICAgY29uc3QgdWJ5dGU0IGJhY2tncm91bmRDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgIGNvbnN0IGZsb2F0IHNoYWRvd0xlbmd0aCA9IDUuMGY7CisgICAgUmVjdCBjYXN0ZXJCb3VuZHMoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wZiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMuMGYpOworICAgIGNhc3RlckJvdW5kcy5vZmZzZXRCeShzaGFkb3dMZW5ndGggKyAxLCBzaGFkb3dMZW5ndGggKyAxKTsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgY2FzdGluZ0xheWVyOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmFscGhhID0gMS4wZjsKKyAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNldHRpbmdzID0KKyAgICAgICAgICAgIGdldFNoYWRvd1NldHRpbmdzKHZlYzIoY2FzdGVyQm91bmRzLmxlZnQsIGNhc3RlckJvdW5kcy50b3ApLCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYXN0ZXJJc1RyYW5zbHVjZW50ICovKTsKKworICAgIGRyYXdTaGFkb3c8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yKTsKKyAgICBleHBlY3RTaGFkb3dDb2xvcihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFNoYWRvd19jYXN0ZXJXaXRoUm91bmRlZENvcm5lcikgeworICAgIGNvbnN0IHVieXRlNCBjYXN0ZXJDb2xvcigyNTUsIDAsIDAsIDI1NSk7CisgICAgY29uc3QgdWJ5dGU0IGJhY2tncm91bmRDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgIGNvbnN0IGZsb2F0IHNoYWRvd0xlbmd0aCA9IDUuMGY7CisgICAgUmVjdCBjYXN0ZXJCb3VuZHMoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wZiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMuMGYpOworICAgIGNhc3RlckJvdW5kcy5vZmZzZXRCeShzaGFkb3dMZW5ndGggKyAxLCBzaGFkb3dMZW5ndGggKyAxKTsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgY2FzdGluZ0xheWVyOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmdlb21ldHJ5LnJvdW5kZWRDb3JuZXJzUmFkaXVzID0gMy4wZjsKKyAgICBjYXN0aW5nTGF5ZXIuZ2VvbWV0cnkucm91bmRlZENvcm5lcnNDcm9wID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmFscGhhID0gMS4wZjsKKyAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNldHRpbmdzID0KKyAgICAgICAgICAgIGdldFNoYWRvd1NldHRpbmdzKHZlYzIoY2FzdGVyQm91bmRzLmxlZnQsIGNhc3RlckJvdW5kcy50b3ApLCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBjYXN0ZXJJc1RyYW5zbHVjZW50ICovKTsKKworICAgIGRyYXdTaGFkb3c8QnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+PihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yKTsKKyAgICBleHBlY3RTaGFkb3dDb2xvcihjYXN0aW5nTGF5ZXIsIHNldHRpbmdzLCBjYXN0ZXJDb2xvciwgYmFja2dyb3VuZENvbG9yKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGRyYXdMYXllcnNfZmlsbFNoYWRvd190cmFuc2x1Y2VudENhc3RlcldpdGhBbHBoYSkgeworICAgIGNvbnN0IHVieXRlNCBjYXN0ZXJDb2xvcigyNTUsIDAsIDAsIDI1NSk7CisgICAgY29uc3QgdWJ5dGU0IGJhY2tncm91bmRDb2xvcigyNTUsIDI1NSwgMjU1LCAyNTUpOworICAgIGNvbnN0IGZsb2F0IHNoYWRvd0xlbmd0aCA9IDUuMGY7CisgICAgUmVjdCBjYXN0ZXJCb3VuZHMoREVGQVVMVF9ESVNQTEFZX1dJRFRIIC8gMy4wZiwgREVGQVVMVF9ESVNQTEFZX0hFSUdIVCAvIDMuMGYpOworICAgIGNhc3RlckJvdW5kcy5vZmZzZXRCeShzaGFkb3dMZW5ndGggKyAxLCBzaGFkb3dMZW5ndGggKyAxKTsKKyAgICByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MgY2FzdGluZ0xheWVyOworICAgIGNhc3RpbmdMYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gY2FzdGVyQm91bmRzLnRvRmxvYXRSZWN0KCk7CisgICAgY2FzdGluZ0xheWVyLmFscGhhID0gMC41ZjsKKyAgICByZW5kZXJlbmdpbmU6OlNoYWRvd1NldHRpbmdzIHNldHRpbmdzID0KKyAgICAgICAgICAgIGdldFNoYWRvd1NldHRpbmdzKHZlYzIoY2FzdGVyQm91bmRzLmxlZnQsIGNhc3RlckJvdW5kcy50b3ApLCBzaGFkb3dMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGNhc3RlcklzVHJhbnNsdWNlbnQgKi8pOworCisgICAgZHJhd1NoYWRvdzxCdWZmZXJTb3VyY2VWYXJpYW50PFJlbGF4T3BhcXVlQnVmZmVyVmFyaWFudD4+KGNhc3RpbmdMYXllciwgc2V0dGluZ3MsIGNhc3RlckNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IpOworCisgICAgLy8gdmVyaWZ5IG9ubHkgdGhlIGJhY2tncm91bmQgc2luY2UgdGhlIHNoYWRvdyB3aWxsIGRyYXcgYmVoaW5kIHRoZSBjYXN0ZXIKKyAgICBjb25zdCBmbG9hdCBzaGFkb3dJbnNldCA9IHNldHRpbmdzLmxlbmd0aCAqIC0xLjBmOworICAgIGNvbnN0IFJlY3QgY2FzdGVyV2l0aFNoYWRvdyA9CisgICAgICAgICAgICBSZWN0KGNhc3RlckJvdW5kcykuaW5zZXQoc2hhZG93SW5zZXQsIHNoYWRvd0luc2V0LCBzaGFkb3dJbnNldCwgc2hhZG93SW5zZXQpOworICAgIGNvbnN0IFJlZ2lvbiBiYWNrZ3JvdW5kUmVnaW9uID0gUmVnaW9uKGZ1bGxzY3JlZW5SZWN0KCkpLnN1YnRyYWN0U2VsZihjYXN0ZXJXaXRoU2hhZG93KTsKKyAgICBleHBlY3RCdWZmZXJDb2xvcihiYWNrZ3JvdW5kUmVnaW9uLCBiYWNrZ3JvdW5kQ29sb3IuciwgYmFja2dyb3VuZENvbG9yLmcsIGJhY2tncm91bmRDb2xvci5iLAorICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5hKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGNsZWFudXBQb3N0UmVuZGVyX2NsZWFuc1VwT25jZSkgeworICAgIHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnBoeXNpY2FsRGlzcGxheSA9IGZ1bGxzY3JlZW5SZWN0KCk7CisgICAgc2V0dGluZ3MuY2xpcCA9IGZ1bGxzY3JlZW5SZWN0KCk7CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzIGxheWVyOworICAgIGxheWVyLmdlb21ldHJ5LmJvdW5kYXJpZXMgPSBmdWxsc2NyZWVuUmVjdCgpLnRvRmxvYXRSZWN0KCk7CisgICAgQnVmZmVyU291cmNlVmFyaWFudDxGb3JjZU9wYXF1ZUJ1ZmZlclZhcmlhbnQ+OjpmaWxsQ29sb3IobGF5ZXIsIDEuMGYsIDAuMGYsIDAuMGYsIHRoaXMpOworICAgIGxheWVyLmFscGhhID0gMS4wOworICAgIGxheWVycy5wdXNoX2JhY2soJmxheWVyKTsKKworICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZU9uZTsKKyAgICBzUkUtPmRyYXdMYXllcnMoc2V0dGluZ3MsIGxheWVycywgbUJ1ZmZlciwgdHJ1ZSwgYmFzZTo6dW5pcXVlX2ZkKCksICZmZW5jZU9uZSk7CisgICAgYmFzZTo6dW5pcXVlX2ZkIGZlbmNlVHdvOworICAgIHNSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBtQnVmZmVyLCB0cnVlLCBzdGQ6Om1vdmUoZmVuY2VPbmUpLCAmZmVuY2VUd28pOworCisgICAgY29uc3QgaW50IGZkID0gZmVuY2VUd28uZ2V0KCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgc3luY193YWl0KGZkLCAtMSk7CisgICAgfQorICAgIC8vIE9ubHkgY2xlYW51cCB0aGUgZmlyc3QgdGltZS4KKyAgICBFWFBFQ1RfVFJVRShzUkUtPmNsZWFudXBQb3N0UmVuZGVyKAorICAgICAgICAgICAgcmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9PVVRQVVRfUkVTT1VSQ0VTKSk7CisgICAgRVhQRUNUX0ZBTFNFKHNSRS0+Y2xlYW51cFBvc3RSZW5kZXIoCisgICAgICAgICAgICByZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX09VVFBVVF9SRVNPVVJDRVMpKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRlc3QsIGNsZWFudXBQb3N0UmVuZGVyX3doZW5DbGVhbmluZ0FsbF9yZXBsYWNlc1RleHR1cmVNZW1vcnkpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5waHlzaWNhbERpc3BsYXkgPSBmdWxsc2NyZWVuUmVjdCgpOworICAgIHNldHRpbmdzLmNsaXAgPSBmdWxsc2NyZWVuUmVjdCgpOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgcmVuZGVyZW5naW5lOjpMYXllclNldHRpbmdzKj4gbGF5ZXJzOworICAgIHJlbmRlcmVuZ2luZTo6TGF5ZXJTZXR0aW5ncyBsYXllcjsKKyAgICBsYXllci5nZW9tZXRyeS5ib3VuZGFyaWVzID0gZnVsbHNjcmVlblJlY3QoKS50b0Zsb2F0UmVjdCgpOworICAgIEJ1ZmZlclNvdXJjZVZhcmlhbnQ8Rm9yY2VPcGFxdWVCdWZmZXJWYXJpYW50Pjo6ZmlsbENvbG9yKGxheWVyLCAxLjBmLCAwLjBmLCAwLjBmLCB0aGlzKTsKKyAgICBsYXllci5hbHBoYSA9IDEuMDsKKyAgICBsYXllcnMucHVzaF9iYWNrKCZsYXllcik7CisKKyAgICBiYXNlOjp1bmlxdWVfZmQgZmVuY2U7CisgICAgc1JFLT5kcmF3TGF5ZXJzKHNldHRpbmdzLCBsYXllcnMsIG1CdWZmZXIsIHRydWUsIGJhc2U6OnVuaXF1ZV9mZCgpLCAmZmVuY2UpOworCisgICAgY29uc3QgaW50IGZkID0gZmVuY2UuZ2V0KCk7CisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgc3luY193YWl0KGZkLCAtMSk7CisgICAgfQorCisgICAgdWludDY0X3QgYnVmZmVySWQgPSBsYXllci5zb3VyY2UuYnVmZmVyLmJ1ZmZlci0+Z2V0SWQoKTsKKyAgICB1aW50MzJfdCB0ZXhOYW1lID0gbGF5ZXIuc291cmNlLmJ1ZmZlci50ZXh0dXJlTmFtZTsKKyAgICBFWFBFQ1RfVFJVRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7CisgICAgRVhQRUNUX0VRKGJ1ZmZlcklkLCBzUkUtPmdldEJ1ZmZlcklkRm9yVGV4dHVyZU5hbWVGb3JUZXN0aW5nKHRleE5hbWUpKTsKKworICAgIEVYUEVDVF9UUlVFKHNSRS0+Y2xlYW51cFBvc3RSZW5kZXIocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9BTEwpKTsKKworICAgIC8vIE5vdyBjaGVjayB0aGF0IG91ciB2aWV3IG9mIG1lbW9yeSBpcyBnb29kLgorICAgIEVYUEVDVF9GQUxTRShzUkUtPmlzSW1hZ2VDYWNoZWRGb3JUZXN0aW5nKGJ1ZmZlcklkKSk7CisgICAgRVhQRUNUX0VRKHN0ZDo6bnVsbG9wdCwgc1JFLT5nZXRCdWZmZXJJZEZvclRleHR1cmVOYW1lRm9yVGVzdGluZyhidWZmZXJJZCkpOworICAgIEVYUEVDVF9UUlVFKHNSRS0+aXNUZXh0dXJlTmFtZUtub3duRm9yVGVzdGluZyh0ZXhOYW1lKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gVE9ETyhiLzEyOTQ4MTE2NSk6IHJlbW92ZSB0aGUgI3ByYWdtYSBiZWxvdyBhbmQgZml4IGNvbnZlcnNpb24gaXNzdWVzCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wIC8vIGlnbm9yZWQgIi1XY29udmVyc2lvbiIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3Rlc3RzL1JlbmRlckVuZ2luZVRocmVhZGVkVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdjNzQ0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90ZXN0cy9SZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QuY3BwCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8cmVuZGVyZW5naW5lL21vY2svUmVuZGVyRW5naW5lLmg+CisjaW5jbHVkZSAiLi4vdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpNb2NrOwordXNpbmcgdGVzdGluZzo6UmV0dXJuOworCitzdHJ1Y3QgUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgICAgflJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCgpIHt9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtVGhyZWFkZWRSRSA9IHJlbmRlcmVuZ2luZTo6dGhyZWFkZWQ6OlJlbmRlckVuZ2luZVRocmVhZGVkOjpjcmVhdGUoCisgICAgICAgICAgICAgICAgW3RoaXNdKCkgeyByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lPihtUmVuZGVyRW5naW5lKTsgfSk7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6dGhyZWFkZWQ6OlJlbmRlckVuZ2luZVRocmVhZGVkPiBtVGhyZWFkZWRSRTsKKyAgICByZW5kZXJlbmdpbmU6Om1vY2s6OlJlbmRlckVuZ2luZSogbVJlbmRlckVuZ2luZSA9IG5ldyByZW5kZXJlbmdpbmU6Om1vY2s6OlJlbmRlckVuZ2luZSgpOworfTsKKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgZHVtcCkgeworICAgIHN0ZDo6c3RyaW5nIHRlc3RTdHJpbmcgPSAiWFlaIjsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgZHVtcChfKSk7CisgICAgbVRocmVhZGVkUkUtPmR1bXAodGVzdFN0cmluZyk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHByaW1lQ2FjaGUpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgcHJpbWVDYWNoZSgpKTsKKyAgICBtVGhyZWFkZWRSRS0+cHJpbWVDYWNoZSgpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBnZW5UZXh0dXJlcykgeworICAgIHVpbnQzMl90IHRleE5hbWU7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKSk7CisgICAgbVRocmVhZGVkUkUtPmdlblRleHR1cmVzKDEsICZ0ZXhOYW1lKTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgZGVsZXRlVGV4dHVyZXMpIHsKKyAgICB1aW50MzJfdCB0ZXhOYW1lOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBkZWxldGVUZXh0dXJlcygxLCAmdGV4TmFtZSkpOworICAgIG1UaHJlYWRlZFJFLT5kZWxldGVUZXh0dXJlcygxLCAmdGV4TmFtZSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGJpbmRFeHRlcm5hbEJ1ZmZlcl9udWxscHRyQnVmZmVyKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMCwgRXEobnVsbHB0ciksIEVxKG51bGxwdHIpKSkKKyAgICAgICAgICAgIC5XaWxsT25jZShSZXR1cm4oQkFEX1ZBTFVFKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMCwgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgYmluZEV4dGVybmFsQnVmZmVyX3dpdGhCdWZmZXIpIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYgPSBuZXcgR3JhcGhpY0J1ZmZlcigpOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBiaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKDAsIGJ1ZiwgRXEobnVsbHB0cikpKQorICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybihOT19FUlJPUikpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKDAsIGJ1ZiwgbnVsbHB0cik7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcl9udWxscHRyKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKEVxKG51bGxwdHIpKSk7CisgICAgbVRocmVhZGVkUkUtPmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKG51bGxwdHIpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcl93aXRoQnVmZmVyKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgY2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIoYnVmKSk7CisgICAgbVRocmVhZGVkUkUtPmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGJ1Zik7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcikgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCB1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIoMHgwKSk7CisgICAgbVRocmVhZGVkUkUtPnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcigweDApOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBiaW5kRnJhbWVCdWZmZXJfcmV0dXJuc0JhZFZhbHVlKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXI+IGZyYW1lYnVmZmVyOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBiaW5kRnJhbWVCdWZmZXIoZnJhbWVidWZmZXIuZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4oQkFEX1ZBTFVFKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlci5nZXQoKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgYmluZEZyYW1lQnVmZmVyX3JldHVybnNOb0Vycm9yKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXI+IGZyYW1lYnVmZmVyOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBiaW5kRnJhbWVCdWZmZXIoZnJhbWVidWZmZXIuZ2V0KCkpKS5XaWxsT25jZShSZXR1cm4oTk9fRVJST1IpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+YmluZEZyYW1lQnVmZmVyKGZyYW1lYnVmZmVyLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIHVuYmluZEZyYW1lQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6RnJhbWVidWZmZXI+IGZyYW1lYnVmZmVyOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCB1bmJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlci5nZXQoKSkpOworICAgIG1UaHJlYWRlZFJFLT51bmJpbmRGcmFtZUJ1ZmZlcihmcmFtZWJ1ZmZlci5nZXQoKSk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGdldE1heFRleHR1cmVTaXplX3JldHVybnMyMCkgeworICAgIHNpemVfdCBzaXplID0gMjA7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGdldE1heFRleHR1cmVTaXplKCkpLldpbGxPbmNlKFJldHVybihzaXplKSk7CisgICAgc2l6ZV90IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5nZXRNYXhUZXh0dXJlU2l6ZSgpOworICAgIEFTU0VSVF9FUShzaXplLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBnZXRNYXhUZXh0dXJlU2l6ZV9yZXR1cm5zMCkgeworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgZ2V0TWF4VGV4dHVyZVNpemUoKSkuV2lsbE9uY2UoUmV0dXJuKHNpemUpKTsKKyAgICBzaXplX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmdldE1heFRleHR1cmVTaXplKCk7CisgICAgQVNTRVJUX0VRKHNpemUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGdldE1heFZpZXdwb3J0RGltc19yZXR1cm5zMjApIHsKKyAgICBzaXplX3QgZGltcyA9IDIwOworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBnZXRNYXhWaWV3cG9ydERpbXMoKSkuV2lsbE9uY2UoUmV0dXJuKGRpbXMpKTsKKyAgICBzaXplX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPmdldE1heFZpZXdwb3J0RGltcygpOworICAgIEFTU0VSVF9FUShkaW1zLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBnZXRNYXhWaWV3cG9ydERpbXNfcmV0dXJuczApIHsKKyAgICBzaXplX3QgZGltcyA9IDA7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGdldE1heFZpZXdwb3J0RGltcygpKS5XaWxsT25jZShSZXR1cm4oZGltcykpOworICAgIHNpemVfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+Z2V0TWF4Vmlld3BvcnREaW1zKCk7CisgICAgQVNTRVJUX0VRKGRpbXMsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGlzUHJvdGVjdGVkX3JldHVybnNGYWxzZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBpc1Byb3RlY3RlZCgpKS5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+aXNQcm90ZWN0ZWQoKTsKKyAgICBBU1NFUlRfRVEoZmFsc2UsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGlzUHJvdGVjdGVkX3JldHVybnNUcnVlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIGlzUHJvdGVjdGVkKCkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisgICAgc2l6ZV90IHJlc3VsdCA9IG1UaHJlYWRlZFJFLT5pc1Byb3RlY3RlZCgpOworICAgIEFTU0VSVF9FUSh0cnVlLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnRfcmV0dXJuc0ZhbHNlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsIHN1cHBvcnRzUHJvdGVjdGVkQ29udGVudCgpKS5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+c3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCk7CisgICAgQVNTRVJUX0VRKGZhbHNlLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCBzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnRfcmV0dXJuc1RydWUpIHsKKyAgICBFWFBFQ1RfQ0FMTCgqbVJlbmRlckVuZ2luZSwgc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCkpLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPnN1cHBvcnRzUHJvdGVjdGVkQ29udGVudCgpOworICAgIEFTU0VSVF9FUSh0cnVlLCByZXN1bHQpOworfQorCitURVNUX0YoUmVuZGVyRW5naW5lVGhyZWFkZWRUZXN0LCB1c2VQcm90ZWN0ZWRDb250ZXh0X3JldHVybnNGYWxzZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCB1c2VQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKSkuV2lsbE9uY2UoUmV0dXJuKGZhbHNlKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVRocmVhZGVkUkUtPnVzZVByb3RlY3RlZENvbnRleHQoZmFsc2UpOworICAgIEFTU0VSVF9FUShmYWxzZSwgcmVzdWx0KTsKK30KKworVEVTVF9GKFJlbmRlckVuZ2luZVRocmVhZGVkVGVzdCwgdXNlUHJvdGVjdGVkQ29udGV4dF9yZXR1cm5zVHJ1ZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCB1c2VQcm90ZWN0ZWRDb250ZXh0KGZhbHNlKSkuV2lsbE9uY2UoUmV0dXJuKHRydWUpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+dXNlUHJvdGVjdGVkQ29udGV4dChmYWxzZSk7CisgICAgQVNTRVJUX0VRKHRydWUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGNsZWFudXBQb3N0UmVuZGVyX3JldHVybnNGYWxzZSkgeworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLAorICAgICAgICAgICAgICAgIGNsZWFudXBQb3N0UmVuZGVyKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDbGVhbnVwTW9kZTo6Q0xFQU5fQUxMKSkKKyAgICAgICAgICAgIC5XaWxsT25jZShSZXR1cm4oZmFsc2UpKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPQorICAgICAgICAgICAgbVRocmVhZGVkUkUtPmNsZWFudXBQb3N0UmVuZGVyKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lOjpDbGVhbnVwTW9kZTo6Q0xFQU5fQUxMKTsKKyAgICBBU1NFUlRfRVEoZmFsc2UsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGNsZWFudXBQb3N0UmVuZGVyX3JldHVybnNUcnVlKSB7CisgICAgRVhQRUNUX0NBTEwoKm1SZW5kZXJFbmdpbmUsCisgICAgICAgICAgICAgICAgY2xlYW51cFBvc3RSZW5kZXIocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU6OkNsZWFudXBNb2RlOjpDTEVBTl9BTEwpKQorICAgICAgICAgICAgLldpbGxPbmNlKFJldHVybih0cnVlKSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0KKyAgICAgICAgICAgIG1UaHJlYWRlZFJFLT5jbGVhbnVwUG9zdFJlbmRlcihyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZTo6Q2xlYW51cE1vZGU6OkNMRUFOX0FMTCk7CisgICAgQVNTRVJUX0VRKHRydWUsIHJlc3VsdCk7Cit9CisKK1RFU1RfRihSZW5kZXJFbmdpbmVUaHJlYWRlZFRlc3QsIGRyYXdMYXllcnMpIHsKKyAgICByZW5kZXJlbmdpbmU6OkRpc3BsYXlTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiBsYXllcnM7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICBiYXNlOjp1bmlxdWVfZmQgYnVmZmVyRmVuY2U7CisgICAgYmFzZTo6dW5pcXVlX2ZkIGRyYXdGZW5jZTsKKworICAgIEVYUEVDVF9DQUxMKCptUmVuZGVyRW5naW5lLCBkcmF3TGF5ZXJzKQorICAgICAgICAgICAgLldpbGxPbmNlKFtdKGNvbnN0IHJlbmRlcmVuZ2luZTo6RGlzcGxheVNldHRpbmdzJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCByZW5kZXJlbmdpbmU6OkxheWVyU2V0dGluZ3MqPiYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mLCBjb25zdCBib29sLCBiYXNlOjp1bmlxdWVfZmQmJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQqKSAtPiBzdGF0dXNfdCB7IHJldHVybiBOT19FUlJPUjsgfSk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtVGhyZWFkZWRSRS0+ZHJhd0xheWVycyhzZXR0aW5ncywgbGF5ZXJzLCBidWZmZXIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShidWZmZXJGZW5jZSksICZkcmF3RmVuY2UpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmVzdWx0KTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcmVuZGVyZnJpZ2h0L3RocmVhZGVkL1JlbmRlckVuZ2luZVRocmVhZGVkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyZDNlZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5jcHAKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisKKyNpbmNsdWRlICJSZW5kZXJFbmdpbmVUaHJlYWRlZC5oIgorCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8ZnV0dXJlPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJnbC9HTEVTUmVuZGVyRW5naW5lLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHJlbmRlcmVuZ2luZSB7CituYW1lc3BhY2UgdGhyZWFkZWQgeworCitzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyRW5naW5lVGhyZWFkZWQ+IFJlbmRlckVuZ2luZVRocmVhZGVkOjpjcmVhdGUoQ3JlYXRlSW5zdGFuY2VGYWN0b3J5IGZhY3RvcnkpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxSZW5kZXJFbmdpbmVUaHJlYWRlZD4oc3RkOjptb3ZlKGZhY3RvcnkpKTsKK30KKworUmVuZGVyRW5naW5lVGhyZWFkZWQ6OlJlbmRlckVuZ2luZVRocmVhZGVkKENyZWF0ZUluc3RhbmNlRmFjdG9yeSBmYWN0b3J5KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrVGhyZWFkKG1UaHJlYWRNdXRleCk7CisgICAgbVRocmVhZCA9IHN0ZDo6dGhyZWFkKCZSZW5kZXJFbmdpbmVUaHJlYWRlZDo6dGhyZWFkTWFpbiwgdGhpcywgZmFjdG9yeSk7Cit9CisKK1JlbmRlckVuZ2luZVRocmVhZGVkOjp+UmVuZGVyRW5naW5lVGhyZWFkZWQoKSB7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBpZiAobVRocmVhZC5qb2luYWJsZSgpKSB7CisgICAgICAgIG1UaHJlYWQuam9pbigpOworICAgIH0KK30KKworLy8gTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyBpcyBiZWNhdXNlIHN0ZDo6dW5pcXVlX2xvY2sgcHJlc2VudGx5IGxhY2tzIHRocmVhZCBzYWZldHkgYW5ub3RhdGlvbnMuCit2b2lkIFJlbmRlckVuZ2luZVRocmVhZGVkOjp0aHJlYWRNYWluKENyZWF0ZUluc3RhbmNlRmFjdG9yeSBmYWN0b3J5KSBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0gezB9OworICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gMjsKKyAgICBpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEX0ZJRk8sICZwYXJhbSkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ291bGRuJ3Qgc2V0IFNDSEVEX0ZJRk8iKTsKKyAgICB9CisKKyAgICBtUmVuZGVyRW5naW5lID0gZmFjdG9yeSgpOworCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgcHRocmVhZF9zZXRuYW1lX25wKHB0aHJlYWRfc2VsZigpLCBtVGhyZWFkTmFtZSk7CisKKyAgICB3aGlsZSAobVJ1bm5pbmcpIHsKKyAgICAgICAgaWYgKCFtRnVuY3Rpb25DYWxscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBhdXRvIHRhc2sgPSBtRnVuY3Rpb25DYWxscy5mcm9udCgpOworICAgICAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucG9wKCk7CisgICAgICAgICAgICB0YXNrKCptUmVuZGVyRW5naW5lKTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZGl0aW9uLndhaXQobG9jaywgW3RoaXNdKCkgUkVRVUlSRVMobVRocmVhZE11dGV4KSB7CisgICAgICAgICAgICByZXR1cm4gIW1SdW5uaW5nIHx8ICFtRnVuY3Rpb25DYWxscy5lbXB0eSgpOworICAgICAgICB9KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnByaW1lQ2FjaGUoKSBjb25zdCB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6cHJpbWVDYWNoZSIpOworICAgICAgICAgICAgaW5zdGFuY2UucHJpbWVDYWNoZSgpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJlc3VsdEZ1dHVyZS53YWl0KCk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmR1bXAoc3RkOjpzdHJpbmcmIHJlc3VsdCkgeworICAgIHN0ZDo6cHJvbWlzZTxzdGQ6OnN0cmluZz4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxzdGQ6OnN0cmluZz4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJnJlc3VsdF0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6ZHVtcCIpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbG9jYWxSZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBpbnN0YW5jZS5kdW1wKGxvY2FsUmVzdWx0KTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHN0ZDo6bW92ZShsb2NhbFJlc3VsdCkpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgLy8gTm90ZTogVGhpcyBpcyBhbiBydmFsdWUuCisgICAgcmVzdWx0LmFzc2lnbihyZXN1bHRGdXR1cmUuZ2V0KCkpOworfQorCitib29sIFJlbmRlckVuZ2luZVRocmVhZGVkOjp1c2VOYXRpdmVGZW5jZVN5bmMoKSBjb25zdCB7CisgICAgc3RkOjpwcm9taXNlPGJvb2w+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIC8qaW5zdGFuY2UqLykgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OnVzZU5hdGl2ZUZlbmNlU3luYyIpOworICAgICAgICAgICAgYm9vbCByZXR1cm5WYWx1ZSA9IFN5bmNGZWF0dXJlczo6R2V0SW5zdGFuY2UoKS51c2VOYXRpdmVGZW5jZVN5bmMoKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHJldHVyblZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnVzZVdhaXRTeW5jKCkgY29uc3QgeworICAgIHN0ZDo6cHJvbWlzZTxib29sPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2VdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiAvKmluc3RhbmNlKi8pIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjp1c2VXYWl0U3luYyIpOworICAgICAgICAgICAgYm9vbCByZXR1cm5WYWx1ZSA9IFN5bmNGZWF0dXJlczo6R2V0SW5zdGFuY2UoKS51c2VXYWl0U3luYygpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUocmV0dXJuVmFsdWUpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6Z2VuVGV4dHVyZXMoc2l6ZV90IGNvdW50LCB1aW50MzJfdCogbmFtZXMpIHsKKyAgICBzdGQ6OnByb21pc2U8dm9pZD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCBjb3VudCwgbmFtZXNdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgQVRSQUNFX05BTUUoIlJFVGhyZWFkZWQ6OmdlblRleHR1cmVzIik7CisgICAgICAgICAgICBpbnN0YW5jZS5nZW5UZXh0dXJlcyhjb3VudCwgbmFtZXMpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJlc3VsdEZ1dHVyZS53YWl0KCk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmRlbGV0ZVRleHR1cmVzKHNpemVfdCBjb3VudCwgdWludDMyX3QgY29uc3QqIG5hbWVzKSB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgY291bnQsICZuYW1lc10ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6ZGVsZXRlVGV4dHVyZXMiKTsKKyAgICAgICAgICAgIGluc3RhbmNlLmRlbGV0ZVRleHR1cmVzKGNvdW50LCBuYW1lcyk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6YmluZEV4dGVybmFsVGV4dHVyZUltYWdlKHVpbnQzMl90IHRleE5hbWUsIGNvbnN0IEltYWdlJiBpbWFnZSkgeworICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaCgKKyAgICAgICAgICAgICAgICBbJnJlc3VsdFByb21pc2UsIHRleE5hbWUsICZpbWFnZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuYmluZEV4dGVybmFsVGV4dHVyZUltYWdlKHRleE5hbWUsIGltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKworc3RhdHVzX3QgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIodWludDMyX3QgdGV4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4mIGZlbmNlKSB7CisgICAgc3RkOjpwcm9taXNlPHN0YXR1c190PiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHN0YXR1c190PiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goCisgICAgICAgICAgICAgICAgWyZyZXN1bHRQcm9taXNlLCB0ZXhOYW1lLCAmYnVmZmVyLCAmZmVuY2VdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6YmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YW5jZS5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHRleE5hbWUsIGJ1ZmZlciwgZmVuY2UpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCit2b2lkIFJlbmRlckVuZ2luZVRocmVhZGVkOjpjYWNoZUV4dGVybmFsVGV4dHVyZUJ1ZmZlcihjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJmJ1ZmZlcl0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6Y2FjaGVFeHRlcm5hbFRleHR1cmVCdWZmZXIiKTsKKyAgICAgICAgICAgIGluc3RhbmNlLmNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKwordm9pZCBSZW5kZXJFbmdpbmVUaHJlYWRlZDo6dW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSB7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8dm9pZD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJmJ1ZmZlcklkXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjp1bmJpbmRFeHRlcm5hbFRleHR1cmVCdWZmZXIiKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnVuYmluZEV4dGVybmFsVGV4dHVyZUJ1ZmZlcihidWZmZXJJZCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZSgpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmVzdWx0RnV0dXJlLndhaXQoKTsKK30KKworc3RhdHVzX3QgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmJpbmRGcmFtZUJ1ZmZlcihGcmFtZWJ1ZmZlciogZnJhbWVidWZmZXIpIHsKKyAgICBzdGQ6OnByb21pc2U8c3RhdHVzX3Q+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2UsICZmcmFtZWJ1ZmZlcl0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6YmluZEZyYW1lQnVmZmVyIik7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YW5jZS5iaW5kRnJhbWVCdWZmZXIoZnJhbWVidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoc3RhdHVzKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK3ZvaWQgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OnVuYmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgeworICAgIHN0ZDo6cHJvbWlzZTx2b2lkPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHZvaWQ+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaChbJnJlc3VsdFByb21pc2UsICZmcmFtZWJ1ZmZlcl0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6dW5iaW5kRnJhbWVCdWZmZXIiKTsKKyAgICAgICAgICAgIGluc3RhbmNlLnVuYmluZEZyYW1lQnVmZmVyKGZyYW1lYnVmZmVyKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXN1bHRGdXR1cmUud2FpdCgpOworfQorCitzaXplX3QgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmdldE1heFRleHR1cmVTaXplKCkgY29uc3QgeworICAgIHN0ZDo6cHJvbWlzZTxzaXplX3Q+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8c2l6ZV90PiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpnZXRNYXhUZXh0dXJlU2l6ZSIpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBpbnN0YW5jZS5nZXRNYXhUZXh0dXJlU2l6ZSgpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoc2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitzaXplX3QgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmdldE1heFZpZXdwb3J0RGltcygpIGNvbnN0IHsKKyAgICBzdGQ6OnByb21pc2U8c2l6ZV90PiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPHNpemVfdD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6Z2V0TWF4Vmlld3BvcnREaW1zIik7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGluc3RhbmNlLmdldE1heFZpZXdwb3J0RGltcygpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUoc2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitib29sIFJlbmRlckVuZ2luZVRocmVhZGVkOjppc1Byb3RlY3RlZCgpIGNvbnN0IHsKKyAgICBzdGQ6OnByb21pc2U8Ym9vbD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjppc1Byb3RlY3RlZCIpOworICAgICAgICAgICAgYm9vbCByZXR1cm5WYWx1ZSA9IGluc3RhbmNlLmlzUHJvdGVjdGVkKCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShyZXR1cm5WYWx1ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitib29sIFJlbmRlckVuZ2luZVRocmVhZGVkOjpzdXBwb3J0c1Byb3RlY3RlZENvbnRlbnQoKSBjb25zdCB7CisgICAgc3RkOjpwcm9taXNlPGJvb2w+IHJlc3VsdFByb21pc2U7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6c3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50Iik7CisgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gaW5zdGFuY2Uuc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCk7CisgICAgICAgICAgICByZXN1bHRQcm9taXNlLnNldF92YWx1ZShyZXR1cm5WYWx1ZSk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitib29sIFJlbmRlckVuZ2luZVRocmVhZGVkOjp1c2VQcm90ZWN0ZWRDb250ZXh0KGJvb2wgdXNlUHJvdGVjdGVkQ29udGV4dCkgeworICAgIHN0ZDo6cHJvbWlzZTxib29sPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPGJvb2w+IHJlc3VsdEZ1dHVyZSA9IHJlc3VsdFByb21pc2UuZ2V0X2Z1dHVyZSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobVRocmVhZE11dGV4KTsKKyAgICAgICAgbUZ1bmN0aW9uQ2FsbHMucHVzaCgKKyAgICAgICAgICAgICAgICBbJnJlc3VsdFByb21pc2UsIHVzZVByb3RlY3RlZENvbnRleHRdKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6dXNlUHJvdGVjdGVkQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICBib29sIHJldHVyblZhbHVlID0gaW5zdGFuY2UudXNlUHJvdGVjdGVkQ29udGV4dCh1c2VQcm90ZWN0ZWRDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUocmV0dXJuVmFsdWUpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCitGcmFtZWJ1ZmZlciogUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmdldEZyYW1lYnVmZmVyRm9yRHJhd2luZygpIHsKKyAgICBzdGQ6OnByb21pc2U8RnJhbWVidWZmZXIqPiByZXN1bHRQcm9taXNlOworICAgIHN0ZDo6ZnV0dXJlPEZyYW1lYnVmZmVyKj4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6Z2V0RnJhbWVidWZmZXJGb3JEcmF3aW5nIik7CisgICAgICAgICAgICBGcmFtZWJ1ZmZlciogZnJhbWVidWZmZXIgPSBpbnN0YW5jZS5nZXRGcmFtZWJ1ZmZlckZvckRyYXdpbmcoKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKGZyYW1lYnVmZmVyKTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIHJldHVybiByZXN1bHRGdXR1cmUuZ2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmNsZWFudXBQb3N0UmVuZGVyKENsZWFudXBNb2RlIG1vZGUpIHsKKyAgICBzdGQ6OnByb21pc2U8Ym9vbD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxib29sPiByZXN1bHRGdXR1cmUgPSByZXN1bHRQcm9taXNlLmdldF9mdXR1cmUoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1UaHJlYWRNdXRleCk7CisgICAgICAgIG1GdW5jdGlvbkNhbGxzLnB1c2goWyZyZXN1bHRQcm9taXNlLCBtb2RlXShyZW5kZXJlbmdpbmU6OlJlbmRlckVuZ2luZSYgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJSRVRocmVhZGVkOjpjbGVhbnVwUG9zdFJlbmRlciIpOworICAgICAgICAgICAgYm9vbCByZXR1cm5WYWx1ZSA9IGluc3RhbmNlLmNsZWFudXBQb3N0UmVuZGVyKG1vZGUpOworICAgICAgICAgICAgcmVzdWx0UHJvbWlzZS5zZXRfdmFsdWUocmV0dXJuVmFsdWUpOworICAgICAgICB9KTsKKyAgICB9CisgICAgbUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKK30KKworc3RhdHVzX3QgUmVuZGVyRW5naW5lVGhyZWFkZWQ6OmRyYXdMYXllcnMoY29uc3QgRGlzcGxheVNldHRpbmdzJiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgTGF5ZXJTZXR0aW5ncyo+JiBsYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB1c2VGcmFtZWJ1ZmZlckNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6dW5pcXVlX2ZkJiYgYnVmZmVyRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQqIGRyYXdGZW5jZSkgeworICAgIHN0ZDo6cHJvbWlzZTxzdGF0dXNfdD4gcmVzdWx0UHJvbWlzZTsKKyAgICBzdGQ6OmZ1dHVyZTxzdGF0dXNfdD4gcmVzdWx0RnV0dXJlID0gcmVzdWx0UHJvbWlzZS5nZXRfZnV0dXJlKCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtVGhyZWFkTXV0ZXgpOworICAgICAgICBtRnVuY3Rpb25DYWxscy5wdXNoKFsmcmVzdWx0UHJvbWlzZSwgJmRpc3BsYXksICZsYXllcnMsICZidWZmZXIsIHVzZUZyYW1lYnVmZmVyQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJGZW5jZSwgJmRyYXdGZW5jZV0ocmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmUmIGluc3RhbmNlKSB7CisgICAgICAgICAgICBBVFJBQ0VfTkFNRSgiUkVUaHJlYWRlZDo6ZHJhd0xheWVycyIpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFuY2UuZHJhd0xheWVycyhkaXNwbGF5LCBsYXllcnMsIGJ1ZmZlciwgdXNlRnJhbWVidWZmZXJDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGJ1ZmZlckZlbmNlKSwgZHJhd0ZlbmNlKTsKKyAgICAgICAgICAgIHJlc3VsdFByb21pc2Uuc2V0X3ZhbHVlKHN0YXR1cyk7CisgICAgICAgIH0pOworICAgIH0KKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICByZXR1cm4gcmVzdWx0RnV0dXJlLmdldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSB0aHJlYWRlZAorfSAvLyBuYW1lc3BhY2UgcmVuZGVyZW5naW5lCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3JlbmRlcmZyaWdodC90aHJlYWRlZC9SZW5kZXJFbmdpbmVUaHJlYWRlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9yZW5kZXJmcmlnaHQvdGhyZWFkZWQvUmVuZGVyRW5naW5lVGhyZWFkZWQuaApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAicmVuZGVyZW5naW5lL1JlbmRlckVuZ2luZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVuZGVyZW5naW5lIHsKK25hbWVzcGFjZSB0aHJlYWRlZCB7CisKK3VzaW5nIENyZWF0ZUluc3RhbmNlRmFjdG9yeSA9IHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lPigpPjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGV4dGVuZHMgYSBiYXNpYyBSZW5kZXJFbmdpbmUgY2xhc3MuIEl0IGNvbnRhaW5zIGEgdGhyZWFkLiBFYWNoIHRpbWUgYSBmdW5jdGlvbiBvZgorICogdGhpcyBjbGFzcyBpcyBjYWxsZWQsIHdlIGNyZWF0ZSBhIGxhbWJkYSBmdW5jdGlvbiB0aGF0IGlzIHB1dCBvbiBhIHF1ZXVlLiBUaGUgbWFpbiB0aHJlYWQgdGhlbgorICogZXhlY3V0ZXMgdGhlIGZ1bmN0aW9ucyBpbiBvcmRlci4KKyAqLworY2xhc3MgUmVuZGVyRW5naW5lVGhyZWFkZWQgOiBwdWJsaWMgUmVuZGVyRW5naW5lIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlbmRlckVuZ2luZVRocmVhZGVkPiBjcmVhdGUoQ3JlYXRlSW5zdGFuY2VGYWN0b3J5IGZhY3RvcnkpOworCisgICAgUmVuZGVyRW5naW5lVGhyZWFkZWQoQ3JlYXRlSW5zdGFuY2VGYWN0b3J5IGZhY3RvcnkpOworICAgIH5SZW5kZXJFbmdpbmVUaHJlYWRlZCgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJpbWVDYWNoZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nJiByZXN1bHQpIG92ZXJyaWRlOworCisgICAgYm9vbCB1c2VOYXRpdmVGZW5jZVN5bmMoKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIHVzZVdhaXRTeW5jKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBnZW5UZXh0dXJlcyhzaXplX3QgY291bnQsIHVpbnQzMl90KiBuYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBkZWxldGVUZXh0dXJlcyhzaXplX3QgY291bnQsIHVpbnQzMl90IGNvbnN0KiBuYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCBiaW5kRXh0ZXJuYWxUZXh0dXJlSW1hZ2UodWludDMyX3QgdGV4TmFtZSwgY29uc3QgSW1hZ2UmIGltYWdlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBiaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQzMl90IHRleE5hbWUsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxGZW5jZT4mIGZlbmNlKSBvdmVycmlkZTsKKyAgICB2b2lkIGNhY2hlRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgdW5iaW5kRXh0ZXJuYWxUZXh0dXJlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBiaW5kRnJhbWVCdWZmZXIoRnJhbWVidWZmZXIqIGZyYW1lYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIHVuYmluZEZyYW1lQnVmZmVyKEZyYW1lYnVmZmVyKiBmcmFtZWJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGdldE1heFRleHR1cmVTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc2l6ZV90IGdldE1heFZpZXdwb3J0RGltcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYm9vbCBpc1Byb3RlY3RlZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgc3VwcG9ydHNQcm90ZWN0ZWRDb250ZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCB1c2VQcm90ZWN0ZWRDb250ZXh0KGJvb2wgdXNlUHJvdGVjdGVkQ29udGV4dCkgb3ZlcnJpZGU7CisgICAgYm9vbCBjbGVhbnVwUG9zdFJlbmRlcihDbGVhbnVwTW9kZSBtb2RlKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGRyYXdMYXllcnMoY29uc3QgRGlzcGxheVNldHRpbmdzJiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgTGF5ZXJTZXR0aW5ncyo+JiBsYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyLCBjb25zdCBib29sIHVzZUZyYW1lYnVmZmVyQ2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjp1bmlxdWVfZmQmJiBidWZmZXJGZW5jZSwgYmFzZTo6dW5pcXVlX2ZkKiBkcmF3RmVuY2UpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgRnJhbWVidWZmZXIqIGdldEZyYW1lYnVmZmVyRm9yRHJhd2luZygpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHZvaWQgdGhyZWFkTWFpbihDcmVhdGVJbnN0YW5jZUZhY3RvcnkgZmFjdG9yeSk7CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgKiBUaHJlYWRpbmcKKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBjb25zdCBtVGhyZWFkTmFtZSA9ICJSZW5kZXJFbmdpbmVUaHJlYWQiOworICAgIC8vIFByb3RlY3RzIHRoZSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gb2YgbVRocmVhZC4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVRocmVhZE11dGV4OworICAgIHN0ZDo6dGhyZWFkIG1UaHJlYWQgR1VBUkRFRF9CWShtVGhyZWFkTXV0ZXgpOworICAgIGJvb2wgbVJ1bm5pbmcgR1VBUkRFRF9CWShtVGhyZWFkTXV0ZXgpID0gdHJ1ZTsKKyAgICBtdXRhYmxlIHN0ZDo6cXVldWU8c3RkOjpmdW5jdGlvbjx2b2lkKHJlbmRlcmVuZ2luZTo6UmVuZGVyRW5naW5lJiBpbnN0YW5jZSk+PiBtRnVuY3Rpb25DYWxscworICAgICAgICAgICAgR1VBUkRFRF9CWShtVGhyZWFkTXV0ZXgpOworICAgIG11dGFibGUgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAqIFJlbmRlciBFbmdpbmUKKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8cmVuZGVyZW5naW5lOjpSZW5kZXJFbmdpbmU+IG1SZW5kZXJFbmdpbmU7Cit9OworfSAvLyBuYW1lc3BhY2UgdGhyZWFkZWQKK30gLy8gbmFtZXNwYWNlIHJlbmRlcmVuZ2luZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQUFWQ0Fzc2VtYmxlci5jcHAKaW5kZXggNGJjNjdlOC4uM2Y0ZDY2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuY3BwCkBAIC0yNSw0MCArMjUsMjExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjb25zdCBkb3VibGUgSklUVEVSX01VTFRJUExFID0gMS41ZjsKKwogLy8gc3RhdGljCiBBQVZDQXNzZW1ibGVyOjpBQVZDQXNzZW1ibGVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQogICAgIDogbU5vdGlmeU1zZyhub3RpZnkpLAogICAgICAgbUFjY2Vzc1VuaXRSVFBUaW1lKDApLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQoZmFsc2UpLAogICAgICAgbU5leHRFeHBlY3RlZFNlcU5vKDApLAotICAgICAgbUFjY2Vzc1VuaXREYW1hZ2VkKGZhbHNlKSB7CisgICAgICBtQWNjZXNzVW5pdERhbWFnZWQoZmFsc2UpLAorICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQoZmFsc2UpLAorICAgICAgbUxhc3RDdm8oLTEpLAorICAgICAgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXMoMCksCisgICAgICBtTGFzdFJ0cFRpbWVKaXR0ZXJEYXRhVXMoMCksCisgICAgICBtV2lkdGgoMCksCisgICAgICBtSGVpZ2h0KDApIHsKIH0KIAogQUFWQ0Fzc2VtYmxlcjo6fkFBVkNBc3NlbWJsZXIoKSB7CiB9CiAKK2ludDMyX3QgQUFWQ0Fzc2VtYmxlcjo6YWRkTmFjaygKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIExpc3Q8c3A8QUJ1ZmZlcj4+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKyAgICBpbnQzMl90IG5hY2tDb3VudCA9IDA7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoaXQgPT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIHJldHVybiBuYWNrQ291bnQgLyogMCAqLzsKKyAgICB9CisKKyAgICB1aW50MTZfdCBxdWV1ZUhlYWRTZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisKKyAgICAvLyBtb3ZlIHRvIHRoZSBwYWNrZXQgYWZ0ZXIgd2hpY2ggUlRDUDpOQUNLIHdhcyBzZW50LgorICAgIGZvciAoOyBpdCAhPSBxdWV1ZS0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaW50MzJfdCBzZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIGlmIChzZXFOdW0gPj0gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBuYWNrU3RhcnRBdCA9IC0xOworCisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICBpbnQzMl90IHNlcUJlZm9yZUxhc3QgPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIC8vIGluY3JlYXNlIGl0ZXJhdG9yLgorICAgICAgICBpZiAoKCsraXQpID09IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBzZXFMYXN0ID0gKCppdCktPmludDMyRGF0YSgpOworCisgICAgICAgIGlmICgoc2VxTGFzdCAtIHNlcUJlZm9yZUxhc3QpIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoImFkZE5hY2s6IGZvdW5kIGVuZCBvZiBzZXFOdW0gZnJvbSglZCkgdG8oJWQpIiwgc2VxQmVmb3JlTGFzdCwgc2VxTGFzdCk7CisgICAgICAgICAgICBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlciA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBtaXNzZWQgcGFja2V0IGZvdW5kCisgICAgICAgIGlmIChzZXFMYXN0ID4gKHNlcUJlZm9yZUxhc3QgKyAxKSAmJgorICAgICAgICAgICAgICAgIC8vIHdlIGRpZG4ndCBzZW5kIFJUQ1A6TkFDSyBmb3IgdGhpcyBwYWNrZXQgeWV0LgorICAgICAgICAgICAgICAgIChzZXFMYXN0IC0gMSkgPiBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcikgeworICAgICAgICAgICAgc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgPSBzZXFMYXN0IC0gMTsKKyAgICAgICAgICAgIG5hY2tTdGFydEF0ID0gc2VxQmVmb3JlTGFzdCArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKG5hY2tTdGFydEF0ICE9IC0xKSB7CisgICAgICAgIG5hY2tDb3VudCA9IHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyIC0gbmFja1N0YXJ0QXQgKyAxOworICAgICAgICBBTE9HRCgiYWRkTmFjazogbmFja0NvdW50PSVkLCBuYWNrRnJvbT0lZCwgbmFja1RvPSVkIiwgbmFja0NvdW50LAorICAgICAgICAgICAgICAgIG5hY2tTdGFydEF0LCBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcik7CisKKyAgICAgICAgdWludDE2X3QgbWFzayA9ICh1aW50MTZfdCkoMHhmZmZmKSA+PiAoMTYgLSBuYWNrQ291bnQgKyAxKTsKKyAgICAgICAgc291cmNlLT5zZXRTZXFOdW1Ub05BQ0sobmFja1N0YXJ0QXQsIG1hc2ssIHF1ZXVlSGVhZFNlcU51bSk7CisgICAgfQorCisgICAgcmV0dXJuIG5hY2tDb3VudDsKK30KKwogQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUFWQ0Fzc2VtYmxlcjo6YWRkTkFMVW5pdCgKICAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgewogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUgPSBzb3VyY2UtPnF1ZXVlKCk7CisgICAgY29uc3QgdWludDMyX3QgZmlyc3RSVFBUaW1lID0gc291cmNlLT5tRmlyc3RSdHBUaW1lOwogCiAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7Ci0gICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgewotICAgICAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gbU5leHRFeHBlY3RlZFNlcU5vKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRPYmplY3QoInNvdXJjZSIsIHNvdXJjZSk7CiAKLSAgICAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICAvKioKKyAgICAgKiBSRkMzNTUwIGNhbGN1bGF0ZXMgdGhlIGludGVyYXJyaXZhbCBqaXR0ZXIgdGltZSBmb3IgJ0FMTCBwYWNrZXRzJy4KKyAgICAgKiBCdXQgdGhhdCBpcyBub3QgdXNlZnVsIGFzIGFuIGluZ3JlZGllbnQgb2YgYnVmZmVyaW5nIHRpbWUuCisgICAgICogSW5zdGVhZCwgd2UgY2FsY3VsYXRlcyB0aGUgdGltZSBvbmx5IGZvciBhbGwgJ05BTCB1bml0cycuCisgICAgICovCisgICAgaW50NjRfdCBydHBUaW1lID0gZmluZFJUUFRpbWUoZmlyc3RSVFBUaW1lLCBidWZmZXIpOworICAgIGludDY0X3Qgbm93VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpZiAocnRwVGltZSAhPSBtTGFzdFJ0cFRpbWVKaXR0ZXJEYXRhVXMpIHsKKyAgICAgICAgc291cmNlLT5wdXRCYXNlSml0dGVyRGF0YShydHBUaW1lLCBub3dUaW1lVXMpOworICAgICAgICBtTGFzdFJ0cFRpbWVKaXR0ZXJEYXRhVXMgPSBydHBUaW1lOworICAgIH0KKyAgICBzb3VyY2UtPnB1dEludGVyQXJyaXZhbEppdHRlckRhdGEocnRwVGltZSwgbm93VGltZVVzKTsKKworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lTXMgPSBzb3VyY2UtPm1TeXNBbmNob3JUaW1lIC8gMTAwMDsKKyAgICBjb25zdCBpbnQ2NF90IG5vd1RpbWVNcyA9IG5vd1RpbWVVcyAvIDEwMDA7CisgICAgY29uc3QgaW50MzJfdCBzdGF0aWNKaXR0ZXJUaW1lTXMgPSBzb3VyY2UtPmdldFN0YXRpY0ppdHRlclRpbWVNcygpOworICAgIGNvbnN0IGludDMyX3QgYmFzZUppdHRlclRpbWVNcyA9IHNvdXJjZS0+Z2V0QmFzZUppdHRlclRpbWVNcygpOworICAgIGNvbnN0IGludDMyX3QgZHluYW1pY0ppdHRlclRpbWVNcyA9IHNvdXJjZS0+Z2V0SW50ZXJBcnJpdmFsSml0dGVyVGltZU1zKCk7CisgICAgY29uc3QgaW50NjRfdCBjbG9ja1JhdGUgPSBzb3VyY2UtPm1DbG9ja1JhdGU7CisKKyAgICBpbnQ2NF90IHBsYXllZFRpbWVNcyA9IG5vd1RpbWVNcyAtIHN0YXJ0VGltZU1zOworICAgIGludDY0X3QgcGxheWVkVGltZVJ0cCA9IHNvdXJjZS0+bUZpcnN0UnRwVGltZSArIE1zVG9SdHAocGxheWVkVGltZU1zLCBjbG9ja1JhdGUpOworCisgICAgLyoqCisgICAgICogQmFzZWQgb24gZXhwZXJpZW5jZXMgaW4gcmVhbCBjb21tZXJjaWFsIG5ldHdvcmsgc2VydmljZXMsCisgICAgICogMzAwIG1zIGlzIGEgbWF4aW11bSBoZXVyaXN0aWMgaml0dGVyIGJ1ZmZlciB0aW1lIGZvciB2aWRlbyBSVFAgc2VydmljZS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIGppdHRlciBpcyBhbiBleHBlY3RlZCBhZGRpdGlvbmFsIHByb3BhZ2F0aW9uIHRpbWUuCisgICAgICogV2UgY2FuIGRyb3AgcGFja2V0cyBpZiB0aGUgdGltZSBkb2Vzbid0IG1lZXQgb3VyIHN0YW5kYXJkcy4KKyAgICAgKiBJZiBpdCBnZXRzIHNob3J0ZXIsIHdlIGNhbiBnZXQgZmFzdGVyIHJlc3BvbnNlIGJ1dCBzaG91bGQgZHJvcCBkZWxheWVkIHBhY2tldHMuCisgICAgICogRXhwZWN0aW5nIHJhbmdlIDogNTBtcyB+IDEwMDBtcyAoQnV0IDMwMCBtcyB3b3VsZCBiZSBwcmFjdGljYWwgdXBwZXIgYm91bmQpCisgICAgICovCisgICAgY29uc3QgaW50MzJfdCBiYXNlSmJUaW1lTXMgPSBzdGQ6Om1pbihzdGQ6Om1heChzdGF0aWNKaXR0ZXJUaW1lTXMsIGJhc2VKaXR0ZXJUaW1lTXMpLCAzMDApOworICAgIC8qKgorICAgICAqIER5bmFtaWMgaml0dGVyIGlzIGEgdmFyaWFuY2Ugb2YgaW50ZXJhcnJpdmFsIHRpbWUgYXMgZGVmaW5lZCBpbiB0aGUgNi40LjEgb2YgUkZDIDM1NTAuCisgICAgICogV2UgY2FuIHJlZ2FyZCB0aGlzIGFzIGEgdG9sZXJhbmNlIG9mIGV2ZXJ5IGRhdGEgcHV0dGluZyBtb21lbnRzLgorICAgICAqIEV4cGVjdGluZyByYW5nZSA6IDBtcyB+IDE1MG1zIChOb3QgdG8gb3ZlciAzMDAgbXMgcHJhY3RpY2FsbHkpCisgICAgICovCisgICAgY29uc3QgaW50MzJfdCBkeW5hbWljSmJUaW1lTXMgPSBzdGQ6Om1pbihkeW5hbWljSml0dGVyVGltZU1zLCAxNTApOworICAgIGNvbnN0IGludDY0X3QgZHluYW1pY0piVGltZVJ0cCA9IE1zVG9SdHAoZHluYW1pY0piVGltZU1zLCBjbG9ja1JhdGUpOworICAgIC8qIEZ1bmRhbWVudGFsIGppdHRlciB0aW1lICovCisgICAgY29uc3QgaW50MzJfdCBqaXR0ZXJUaW1lTXMgPSBiYXNlSmJUaW1lTXM7CisgICAgY29uc3QgaW50NjRfdCBqaXR0ZXJUaW1lUnRwID0gTXNUb1J0cChqaXR0ZXJUaW1lTXMsIGNsb2NrUmF0ZSk7CisKKyAgICAvLyBUaWxsIChUKSwgdGhpcyBhc3NlbWJsZXIgd2FpdHMgdW5jb25kaXRpb25hbGx5IHRvIGNvbGxlY3QgY3VycmVudCBOQUwgdW5pdAorICAgIGludDY0X3QgZXhwaXJlZFRpbWVSdHAgPSBydHBUaW1lICsgaml0dGVyVGltZVJ0cDsgICAgICAgLy8gV2hlbiBkb2VzIHRoaXMgYnVmZmVyIGV4cGlyZSA/IChUKQorICAgIGludDY0X3QgZGlmZlRpbWVSdHAgPSBwbGF5ZWRUaW1lUnRwIC0gZXhwaXJlZFRpbWVSdHA7CisgICAgYm9vbCBpc0V4cGlyZWQgPSAoZGlmZlRpbWVSdHAgPj0gMCk7ICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGV4cGlyZWQgaWYgVCBpcyBwYXNzZWQgYXdheQorCisgICAgLy8gRnJvbSAoVCksIHRoaXMgYXNzZW1ibGVyIHRyaWVzIHRvIGNvbXBsZXRlIHRoZSBOQUwgdGlsbCAoVCArIHRyeSkKKyAgICBpbnQzMl90IHRyeUpiVGltZU1zID0gYmFzZUppdHRlclRpbWVNcyAvIDIgKyBkeW5hbWljSmJUaW1lTXM7CisgICAgaW50NjRfdCB0cnlKYlRpbWVSdHAgPSBNc1RvUnRwKHRyeUpiVGltZU1zLCBjbG9ja1JhdGUpOworICAgIGJvb2wgaXNGaXJzdExpbmVCcm9rZW4gPSAoZGlmZlRpbWVSdHAgPiB0cnlKYlRpbWVSdHApOworCisgICAgLy8gQWZ0ZXIgKFQgKyB0cnkpLCBpdCBnaXZlcyBsYXN0IGNoYW5jZSB0aWxsIChUICsgdHJ5ICsgYSkgd2l0aCB3YXJuaW5nIG1lc3NhZ2VzLgorICAgIGludDY0X3QgYWxwaGEgPSBkeW5hbWljSmJUaW1lUnRwICogSklUVEVSX01VTFRJUExFOyAgICAgLy8gVXNlIER5biBhcyAnYScKKyAgICBib29sIGlzU2Vjb25kTGluZUJyb2tlbiA9IChkaWZmVGltZVJ0cCA+ICh0cnlKYlRpbWVSdHAgKyBhbHBoYSkpOyAgIC8vIFRoZSBNYWdpbm90IGxpbmUKKworICAgIGlmIChtU2hvd1F1ZXVlICYmIG1TaG93UXVldWVDbnQgPCAyMCkgeworICAgICAgICBzaG93Q3VycmVudFF1ZXVlKHF1ZXVlKTsKKyAgICAgICAgcHJpbnROb3dUaW1lTXMoc3RhcnRUaW1lTXMsIG5vd1RpbWVNcywgcGxheWVkVGltZU1zKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lUnRwLCBpc0V4cGlyZWQpOworICAgICAgICBtU2hvd1F1ZXVlQ250Kys7CisgICAgfQorCisgICAgQUFWQ0Fzc2VtYmxlcjo6YWRkTmFjayhzb3VyY2UpOworCisgICAgaWYgKCFpc0V4cGlyZWQpIHsKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmluZyBpbiBqaXR0ZXIgYnVmZmVyLiIpOworICAgICAgICAvLyBzZXQgYW4gYWxhcm0gZm9yIGppdHRlciBidWZmZXIgdGltZSBleHBpcmF0aW9uLgorICAgICAgICAvLyBhZGRpbmcgMW1zIGJlY2F1c2Ugaml0dGVyIGJ1ZmZlciB0aW1lIGlzIGtlZXAgY2hhbmdpbmcuCisgICAgICAgIGludDY0X3QgZXhwVGltZVVzID0gKFJ0cFRvTXMoc3RkOjphYnMoZGlmZlRpbWVSdHApLCBjbG9ja1JhdGUpICsgMSkgKiAxMDAwOworICAgICAgICBzb3VyY2UtPnNldEpiQWxhcm1UaW1lKG5vd1RpbWVVcywgZXhwVGltZVVzKTsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBpZiAoaXNGaXJzdExpbmVCcm9rZW4pIHsKKyAgICAgICAgaW50NjRfdCB0b3RhbERpZmZUaW1lTXMgPSBSdHBUb01zKGRpZmZUaW1lUnRwICsgaml0dGVyVGltZVJ0cCwgY2xvY2tSYXRlKTsKKyAgICAgICAgU3RyaW5nOCBpbmZvOworICAgICAgICBpbmZvLmFwcGVuZEZvcm1hdCgiUlRQIGRpZmYgZnJvbSBleHAgPSVsbGQgXHQgTVMgZGlmZiBmcm9tIHN0YW1wID0gJWxsZFx0XHQiCisgICAgICAgICAgICAgICAgICAgICJTZXEjICVkIFx0IEV4cFNlcSMgJWQgXHQiCisgICAgICAgICAgICAgICAgICAgICJKaXR0ZXJNcyAlZCArICglZCArICVkICogJS4zZikiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRpZmZUaW1lUnRwLCAobG9uZyBsb25nKXRvdGFsRGlmZlRpbWVNcywKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5pbnQzMkRhdGEoKSwgbU5leHRFeHBlY3RlZFNlcU5vLAorICAgICAgICAgICAgICAgICAgICBqaXR0ZXJUaW1lTXMsIHRyeUpiVGltZU1zLCBkeW5hbWljSmJUaW1lTXMsIEpJVFRFUl9NVUxUSVBMRSk7CisgICAgICAgIGlmIChpc1NlY29uZExpbmVCcm9rZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyIsIGluZm8uc3RyaW5nKCkpOworICAgICAgICAgICAgcHJpbnROb3dUaW1lTXMoc3RhcnRUaW1lTXMsIG5vd1RpbWVNcywgcGxheWVkVGltZU1zKTsKKyAgICAgICAgICAgIHByaW50UlRQVGltZShydHBUaW1lLCBwbGF5ZWRUaW1lUnRwLCBleHBpcmVkVGltZVJ0cCwgaXNFeHBpcmVkKTsKKworICAgICAgICB9ICBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyIsIGluZm8uc3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKSB7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IHBpY2tTdGFydFNlcShxdWV1ZSwgZmlyc3RSVFBUaW1lLCBwbGF5ZWRUaW1lUnRwLCBqaXR0ZXJUaW1lUnRwKTsKKyAgICAgICAgaW50MzJfdCBjbnRSZW1vdmUgPSBkZWxldGVVbml0VW5kZXJTZXEocXVldWUsIG1OZXh0RXhwZWN0ZWRTZXFObyk7CisKKyAgICAgICAgaWYgKGNudFJlbW92ZSA+IDApIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZSA9IHF1ZXVlLT5zaXplKCk7CisgICAgICAgICAgICBzb3VyY2UtPm5vdGljZUFiYW5kb25CdWZmZXIoY250UmVtb3ZlKTsKKyAgICAgICAgICAgIEFMT0dXKCJkZWxldGUgJWQgb2YgJWQgYnVmZmVycyIsIGNudFJlbW92ZSwgc2l6ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKQEAgLTY2LDcgKzIzNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisgICAgYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOwogCiAgICAgaWYgKCFtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgewogICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCA9IHRydWU7CkBAIC0xMjMsMTUgKzI5NCw3MiBAQAogICAgIH0KIH0KIAordm9pZCBBQVZDQXNzZW1ibGVyOjpjaGVja1Nwc1VwZGF0ZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gZGF0YVswXSAmIDB4MWY7CisgICAgaWYgKG5hbFR5cGUgPT0gMHg3KSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICAgICAgICBGaW5kQVZDRGltZW5zaW9ucyhidWZmZXIsICZ3aWR0aCwgJmhlaWdodCk7CisgICAgICAgIGlmICh3aWR0aCAhPSBtV2lkdGggfHwgaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgIG1GaXJzdElGcmFtZVByb3ZpZGVkID0gZmFsc2U7CisgICAgICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBBTE9HRCgiZm91bmQgYSBuZXcgcmVzb2x1dGlvbiAoJXUgeCAldSkiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFBVkNBc3NlbWJsZXI6OmNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSA9PSAweDUpIHsKKyAgICAgICAgbUxhc3RJRnJhbWVQcm92aWRlZEF0TXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMDsKKyAgICAgICAgaWYgKCFtRmlyc3RJRnJhbWVQcm92aWRlZCkgeworICAgICAgICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQgPSB0cnVlOworCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBBTE9HRCgiZ290IEZpcnN0IEktZnJhbWUgdG8gYmUgZGVjb2RlZC4gcnRwVGltZT0lZCwgc2l6ZT0lenUiLCBydHBUaW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQUFWQ0Fzc2VtYmxlcjo6ZHJvcEZyYW1lc1VudGlsSWZyYW1lKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IGRhdGFbMF0gJiAweDFmOworICAgIGlmICghbUZpcnN0SUZyYW1lUHJvdmlkZWQgJiYgbmFsVHlwZSA8IDB4NSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgQUFWQ0Fzc2VtYmxlcjo6YWRkU2luZ2xlTkFMVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgQUxPR1YoImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAlenUiLCBidWZmZXItPnNpemUoKSk7CiAjaWYgIUxPR19OREVCVUcKICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAjZW5kaWYKIAorICAgIGNoZWNrU3BzVXBkYXRlZChidWZmZXIpOworICAgIGNoZWNrSUZyYW1lUHJvdmlkZWQoYnVmZmVyKTsKKwogICAgIHVpbnQzMl90IHJ0cFRpbWU7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CiAKKyAgICBpZiAoZHJvcEZyYW1lc1VudGlsSWZyYW1lKGJ1ZmZlcikpIHsKKyAgICAgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gbnVsbHB0cjsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoInNvdXJjZSIsIChzcDxhbmRyb2lkOjpSZWZCYXNlPiopJnNvdXJjZSk7CisgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIklzc3VlZCBGSVIgdG8gZ2V0IHRoZSBJLWZyYW1lIik7CisgICAgICAgICAgICBzb3VyY2UtPm9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJEcm9wcGluZyBQLWZyYW1lIHRpbGwgSS1mcmFtZSBwcm92aWRlZC4gcnRwVGltZSAldSIsIHJ0cFRpbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaWYgKCFtTkFMVW5pdHMuZW1wdHkoKSAmJiBydHBUaW1lICE9IG1BY2Nlc3NVbml0UlRQVGltZSkgewogICAgICAgICBzdWJtaXRBY2Nlc3NVbml0KCk7CiAgICAgfQpAQCAtMjE2LDYgKzQ0NCwxMCBAQAogICAgIHNpemVfdCB0b3RhbENvdW50ID0gMTsKICAgICBib29sIGNvbXBsZXRlID0gZmFsc2U7CiAKKyAgICB1aW50MzJfdCBydHBUaW1lU3RhcnRBdDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWVTdGFydEF0KSk7CisgICAgdWludDMyX3Qgc3RhcnRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisKICAgICBpZiAoZGF0YVsxXSAmIDB4NDApIHsKICAgICAgICAgLy8gSHVoPyBFbmQgYml0IGFsc28gc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCiAKQEAgLTIzMywzNCArNDY1LDMzIEBACiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwogCiAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgIT0gZXhwZWN0ZWRTZXFObykgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBub3QgY29tcGxldGUsIGV4cGVjdGVkIHNlcU5vICVkLCBnb3QgJWQiLAotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXFObywgKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2VxdWVuY2Ugbm90IGNvbXBsZXRlLCBleHBlY3RlZCBzZXFObyAldSwgZ290ICV1LCBuYWxUeXBlICV1IiwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8sICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpLCBuYWxUeXBlKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpemUgPCAyCi0gICAgICAgICAgICAgICAgICAgIHx8IGRhdGFbMF0gIT0gaW5kaWNhdG9yCi0gICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHgxZikgIT0gbmFsVHlwZQotICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsxXSAmIDB4ODApKSB7CisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlci4iKTsKLQotICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgd2hvbGUgc3RhcnQgb2YgdGhlIEZVLgotCi0gICAgICAgICAgICAgICAgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSB0b3RhbENvdW50OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgICAgICAgICAgICAgaXQgPSBxdWV1ZS0+ZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRhdGFbMF0gIT0gaW5kaWNhdG9yCisgICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzFdICYgMHgxZikgIT0gbmFsVHlwZQorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsxXSAmIDB4ODApCisgICAgICAgICAgICAgICAgICAgIHx8IHJ0cFRpbWUgIT0gcnRwVGltZVN0YXJ0QXQpIHsKKyAgICAgICAgICAgICAgICAvLyBBc3NlbWJsZXIgYWxyZWFkeSBoYXZlIGdpdmVuIGVub3VnaCB0aW1lIGJ5IGppdHRlciBidWZmZXIKKyAgICAgICAgICAgICAgICBBTE9HRCgiU2VlbXMgYW5vdGhlciBmcmFtZS4gSW5jb21wbGV0ZSBmcmFtZSBbJWQgfiAlZCkgXHQgJWQgRlVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VxTm8sIGV4cGVjdGVkU2VxTm8sIChpbnQpcXVldWUtPmRpc3RhbmNlKHF1ZXVlLT5iZWdpbigpLCBpdCkpOworICAgICAgICAgICAgICAgIGV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBzaXplIC0gMjsKICAgICAgICAgICAgICsrdG90YWxDb3VudDsKIAotICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9IGV4cGVjdGVkU2VxTm8gKyAxOworICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpICsgMTsKIAogICAgICAgICAgICAgaWYgKGRhdGFbMV0gJiAweDQwKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbGFzdCBmcmFnbWVudC4KQEAgLTI5MCw2ICs1MjEsOCBAQAogICAgIHVuaXQtPmRhdGEoKVswXSA9IChucmkgPDwgNSkgfCBuYWxUeXBlOwogCiAgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBudWxscHRyOwogICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgewogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwpAQCAtMzAwLDYgKzUzMyw5IEBACiAjZW5kaWYKIAogICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDIsIGJ1ZmZlci0+c2l6ZSgpIC0gMik7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoInNvdXJjZSIsIChzcDxhbmRyb2lkOjpSZWZCYXNlPiopJnNvdXJjZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5zaXplKCkgLSAyOwogCiAgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKQEAgLTMwNyw2ICs1NDMsMTYgQEAKIAogICAgIHVuaXQtPnNldFJhbmdlKDAsIHRvdGFsU2l6ZSk7CiAKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgdW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICAgICAgbUxhc3RDdm8gPSBjdm87CisgICAgfSBlbHNlIGlmIChtTGFzdEN2byA+PSAwKSB7CisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIG1MYXN0Q3ZvKTsKKyAgICB9CisgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIH0KKwogICAgIGFkZFNpbmdsZU5BTFVuaXQodW5pdCk7CiAKICAgICBBTE9HVigic3VjY2Vzc2Z1bGx5IGFzc2VtYmxlZCBhIE5BTCB1bml0IGZyb20gZnJhZ21lbnRzLiIpOwpAQCAtMzE3LDcgKzU2MywxMSBAQAogdm9pZCBBQVZDQXNzZW1ibGVyOjpzdWJtaXRBY2Nlc3NVbml0KCkgewogICAgIENIRUNLKCFtTkFMVW5pdHMuZW1wdHkoKSk7CiAKLSAgICBBTE9HVigiQWNjZXNzIHVuaXQgY29tcGxldGUgKCV6dSBuYWwgdW5pdHMpIiwgbU5BTFVuaXRzLnNpemUoKSk7CisgICAgaWYoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5mcHMiLCBmYWxzZSkpIHsKKyAgICAgICAgQUxPR0QoIkFjY2VzcyB1bml0IGNvbXBsZXRlICglenUgbmFsIHVuaXRzKSIsIG1OQUxVbml0cy5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKKyAgICB9CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKQEAgLTMyNyw2ICs1NzcsNyBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50MzJfdCBjdm8gPSAtMTsKICAgICBmb3IgKExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtTkFMVW5pdHMuYmVnaW4oKTsKICAgICAgICAgIGl0ICE9IG1OQUxVbml0cy5lbmQoKTsgKytpdCkgewogICAgICAgICBtZW1jcHkoYWNjZXNzVW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCAiXHgwMFx4MDBceDAwXHgwMSIsIDQpOwpAQCAtMzM1LDYgKzU4Niw4IEBACiAgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9ICppdDsKICAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKICAgICAgICAgb2Zmc2V0ICs9IG5hbC0+c2l6ZSgpOworCisgICAgICAgIG5hbC0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOwogICAgIH0KIAogICAgIENvcHlUaW1lcyhhY2Nlc3NVbml0LCAqbU5BTFVuaXRzLmJlZ2luKCkpOwpAQCAtMzQzLDYgKzU5Niw5IEBACiAgICAgcHJpbnRmKG1BY2Nlc3NVbml0RGFtYWdlZCA/ICJYIiA6ICIuIik7CiAgICAgZmZsdXNoKHN0ZG91dCk7CiAjZW5kaWYKKyAgICBpZiAoY3ZvID49IDApIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiY3ZvIiwgY3ZvKTsKKyAgICB9CiAKICAgICBpZiAobUFjY2Vzc1VuaXREYW1hZ2VkKSB7CiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImRhbWFnZWQiLCB0cnVlKTsKQEAgLTM1NiwyMiArNjEyLDY1IEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK2ludDMyX3QgQUFWQ0Fzc2VtYmxlcjo6cGlja1N0YXJ0U2VxKGNvbnN0IFF1ZXVlICpxdWV1ZSwKKyAgICAgICAgdWludDMyX3QgZmlyc3QsIGludDY0X3QgcGxheSwgaW50NjRfdCBqaXQpIHsKKyAgICAvLyBwaWNrIHRoZSBmaXJzdCBzZXF1ZW5jZSBudW1iZXIgaGFzIHRoZSBzdGFydCBiaXQuCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKihxdWV1ZS0+YmVnaW4oKSk7CisgICAgaW50MzJfdCBmaXJzdFNlcU5vID0gYnVmZmVyLT5pbnQzMkRhdGEoKTsKKworICAgIC8vIFRoaXMgb25seSB3b3JrcyBmb3IgRlUtQSB0eXBlICYgbm9uLXN0YXJ0IHNlcXVlbmNlCisgICAgdW5zaWduZWQgbmFsVHlwZSA9IGJ1ZmZlci0+ZGF0YSgpWzBdICYgMHgxZjsKKyAgICBpZiAobmFsVHlwZSAhPSAyOCB8fCBidWZmZXItPmRhdGEoKVsxXSAmIDB4ODApIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0U2VxTm87CisgICAgfQorCisgICAgZm9yIChhdXRvIGl0IDogKnF1ZXVlKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBpdC0+ZGF0YSgpOworICAgICAgICBpbnQ2NF90IHJ0cFRpbWUgPSBmaW5kUlRQVGltZShmaXJzdCwgaXQpOworICAgICAgICBpZiAocnRwVGltZSArIGppdCA+PSBwbGF5KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSkgeworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFObyA9IGl0LT5pbnQzMkRhdGEoKTsKKyAgICAgICAgICAgIEFMT0dFKCJmaW5kaW5nIFtIRUFEXSBwa3QuIFx0IFNlcSMgKCVkIH4gKVslZCIsIGZpcnN0U2VxTm8sIHNlcU5vKTsKKyAgICAgICAgICAgIGZpcnN0U2VxTm8gPSBzZXFObzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaXJzdFNlcU5vOworfQorCitpbnQzMl90IEFBVkNBc3NlbWJsZXI6OmRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcXVldWUsIHVpbnQzMl90IHNlcSkgeworICAgIGludDMyX3QgaW5pdFNpemUgPSBxdWV1ZS0+c2l6ZSgpOworICAgIFF1ZXVlOjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gc2VxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCksIGl0KTsKKyAgICByZXR1cm4gaW5pdFNpemUgLSBxdWV1ZS0+c2l6ZSgpOworfQorCiBBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBQVZDQXNzZW1ibGVyOjphc3NlbWJsZU1vcmUoCiAgICAgICAgIGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBBc3NlbWJseVN0YXR1cyBzdGF0dXMgPSBhZGROQUxVbml0KHNvdXJjZSk7CiAgICAgaWYgKHN0YXR1cyA9PSBNQUxGT1JNRURfUEFDS0VUKSB7Ci0gICAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IHRydWU7CisgICAgICAgIHVpbnQ2NF90IG1zZWNzU2luY2VMYXN0SUZyYW1lID0gKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwKSAtIG1MYXN0SUZyYW1lUHJvdmlkZWRBdE1zOworICAgICAgICBpZiAobXNlY3NTaW5jZUxhc3RJRnJhbWUgPiAxMDAwKSB7CisgICAgICAgICAgICBBTE9HVigicmVxdWVzdCBGSVIgdG8gZ2V0IGEgbmV3IEktRnJhbWUsIHRpbWUgc2luY2UgIgorICAgICAgICAgICAgICAgICAgICAibGFzdCBJLUZyYW1lICVsbHUgbXMiLCAodW5zaWduZWQgbG9uZyBsb25nKW1zZWNzU2luY2VMYXN0SUZyYW1lKTsKKyAgICAgICAgICAgIHNvdXJjZS0+b25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjpwYWNrZXRMb3N0KCkgewogICAgIENIRUNLKG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKTsKLSAgICBBTE9HVigicGFja2V0TG9zdCAoZXhwZWN0ZWQgJWQpIiwgbU5leHRFeHBlY3RlZFNlcU5vKTsKLQorICAgIEFMT0dEKCJwYWNrZXRMb3N0IChleHBlY3RlZCAldSkiLCBtTmV4dEV4cGVjdGVkU2VxTm8pOwogICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOwotCi0gICAgbUFjY2Vzc1VuaXREYW1hZ2VkID0gdHJ1ZTsKIH0KIAogdm9pZCBBQVZDQXNzZW1ibGVyOjpvbkJ5ZVJlY2VpdmVkKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BQVZDQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaAppbmRleCBlMTk0ODBjLi4yZjhiOGJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FBVkNBc3NlbWJsZXIuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzEsNiArMzIsNyBAQAogc3RydWN0IEFBVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CiAgICAgZXhwbGljaXQgQUFWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7CiAKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBRdWV1ZTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQVZDQXNzZW1ibGVyKCk7CiAKQEAgLTQ1LDggKzQ3LDE4IEBACiAgICAgYm9vbCBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZDsKICAgICB1aW50MzJfdCBtTmV4dEV4cGVjdGVkU2VxTm87CiAgICAgYm9vbCBtQWNjZXNzVW5pdERhbWFnZWQ7CisgICAgYm9vbCBtRmlyc3RJRnJhbWVQcm92aWRlZDsKKyAgICBpbnQzMl90IG1MYXN0Q3ZvOworICAgIHVpbnQ2NF90IG1MYXN0SUZyYW1lUHJvdmlkZWRBdE1zOworICAgIGludDY0X3QgbUxhc3RSdHBUaW1lSml0dGVyRGF0YVVzOworICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbU5BTFVuaXRzOwogCisgICAgaW50MzJfdCBhZGROYWNrKGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpOworICAgIHZvaWQgY2hlY2tTcHNVcGRhdGVkKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgY2hlY2tJRnJhbWVQcm92aWRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBib29sIGRyb3BGcmFtZXNVbnRpbElmcmFtZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICBBc3NlbWJseVN0YXR1cyBhZGROQUxVbml0KGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpOwogICAgIHZvaWQgYWRkU2luZ2xlTkFMVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKICAgICBBc3NlbWJseVN0YXR1cyBhZGRGcmFnbWVudGVkTkFMVW5pdChMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKTsKQEAgLTU0LDYgKzY2LDkgQEAKIAogICAgIHZvaWQgc3VibWl0QWNjZXNzVW5pdCgpOwogCisgICAgaW50MzJfdCBwaWNrU3RhcnRTZXEoY29uc3QgUXVldWUgKnEsIHVpbnQzMl90IGZpcnN0LCBpbnQ2NF90IHBsYXksIGludDY0X3Qgaml0KTsKKyAgICBpbnQzMl90IGRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcSwgdWludDMyX3Qgc2VxKTsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFBVkNBc3NlbWJsZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjQwMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5jcHAKQEAgLTAsMCArMSw2OTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIRVZDQXNzZW1ibGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUhFVkNBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgIkFSVFBTb3VyY2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGluY2x1ZGUvSGV2Y1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBIMjY1X05BTFVfTUFTSyAweDNGCisjZGVmaW5lIEgyNjVfTkFMVV9WUFMgMHgyMAorI2RlZmluZSBIMjY1X05BTFVfU1BTIDB4MjEKKyNkZWZpbmUgSDI2NV9OQUxVX1BQUyAweDIyCisjZGVmaW5lIEgyNjVfTkFMVV9BUCAweDMwCisjZGVmaW5lIEgyNjVfTkFMVV9GVSAweDMxCisjZGVmaW5lIEgyNjVfTkFMVV9QQUNJIDB4MzIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IGRvdWJsZSBKSVRURVJfTVVMVElQTEUgPSAxLjVmOworCisvLyBzdGF0aWMKK0FIRVZDQXNzZW1ibGVyOjpBSEVWQ0Fzc2VtYmxlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKKyAgICA6IG1Ob3RpZnlNc2cobm90aWZ5KSwKKyAgICAgIG1BY2Nlc3NVbml0UlRQVGltZSgwKSwKKyAgICAgIG1OZXh0RXhwZWN0ZWRTZXFOb1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObygwKSwKKyAgICAgIG1BY2Nlc3NVbml0RGFtYWdlZChmYWxzZSksCisgICAgICBtRmlyc3RJRnJhbWVQcm92aWRlZChmYWxzZSksCisgICAgICBtTGFzdEN2bygtMSksCisgICAgICBtTGFzdElGcmFtZVByb3ZpZGVkQXRNcygwKSwKKyAgICAgIG1MYXN0UnRwVGltZUppdHRlckRhdGFVcygwKSwKKyAgICAgIG1XaWR0aCgwKSwKKyAgICAgIG1IZWlnaHQoMCkgeworCisgICAgICBBTE9HVigiQ29uc3RydWN0b3IiKTsKK30KKworQUhFVkNBc3NlbWJsZXI6On5BSEVWQ0Fzc2VtYmxlcigpIHsKK30KKworaW50MzJfdCBBSEVWQ0Fzc2VtYmxlcjo6YWRkTmFjaygKKyAgICAgICAgY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSkgeworICAgIExpc3Q8c3A8QUJ1ZmZlcj4+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKyAgICBpbnQzMl90IG5hY2tDb3VudCA9IDA7CisKKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gcXVldWUtPmJlZ2luKCk7CisKKyAgICBpZiAoaXQgPT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIHJldHVybiBuYWNrQ291bnQgLyogMCAqLzsKKyAgICB9CisKKyAgICB1aW50MTZfdCBxdWV1ZUhlYWRTZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisKKyAgICAvLyBtb3ZlIHRvIHRoZSBwYWNrZXQgYWZ0ZXIgd2hpY2ggUlRDUDpOQUNLIHdhcyBzZW50LgorICAgIGZvciAoOyBpdCAhPSBxdWV1ZS0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaW50MzJfdCBzZXFOdW0gPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIGlmIChzZXFOdW0gPj0gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBuYWNrU3RhcnRBdCA9IC0xOworCisgICAgd2hpbGUgKGl0ICE9IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICBpbnQzMl90IHNlcUJlZm9yZUxhc3QgPSAoKml0KS0+aW50MzJEYXRhKCk7CisgICAgICAgIC8vIGluY3JlYXNlIGl0ZXJhdG9yLgorICAgICAgICBpZiAoKCsraXQpID09IHF1ZXVlLT5lbmQoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHNlcUxhc3QgPSAoKml0KS0+aW50MzJEYXRhKCk7CisKKyAgICAgICAgaWYgKChzZXFMYXN0IC0gc2VxQmVmb3JlTGFzdCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRCgiYWRkTmFjazogZm91bmQgZW5kIG9mIHNlcU51bSBmcm9tKCVkKSB0byglZCkiLCBzZXFCZWZvcmVMYXN0LCBzZXFMYXN0KTsKKyAgICAgICAgICAgIHNvdXJjZS0+bUhpZ2hlc3ROYWNrTnVtYmVyID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1pc3NlZCBwYWNrZXQgZm91bmQKKyAgICAgICAgaWYgKHNlcUxhc3QgPiAoc2VxQmVmb3JlTGFzdCArIDEpICYmCisgICAgICAgICAgICAvLyB3ZSBkaWRuJ3Qgc2VuZCBSVENQOk5BQ0sgZm9yIHRoaXMgcGFja2V0IHlldC4KKyAgICAgICAgICAgIChzZXFMYXN0IC0gMSkgPiBzb3VyY2UtPm1IaWdoZXN0TmFja051bWJlcikgeworICAgICAgICAgICAgc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgPSBzZXFMYXN0IC0xOworICAgICAgICAgICAgbmFja1N0YXJ0QXQgPSBzZXFCZWZvcmVMYXN0ICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBpZiAobmFja1N0YXJ0QXQgIT0gLTEpIHsKKyAgICAgICAgbmFja0NvdW50ID0gc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIgLSBuYWNrU3RhcnRBdCArIDE7CisgICAgICAgIEFMT0dEKCJhZGROYWNrOiBuYWNrQ291bnQ9JWQsIG5hY2tGcm9tPSVkLCBuYWNrVG89JWQiLCBuYWNrQ291bnQsCisgICAgICAgICAgICBuYWNrU3RhcnRBdCwgc291cmNlLT5tSGlnaGVzdE5hY2tOdW1iZXIpOworCisgICAgICAgIHVpbnQxNl90IG1hc2sgPSAodWludDE2X3QpKDB4ZmZmZikgPj4gKDE2IC0gbmFja0NvdW50ICsgMSk7CisgICAgICAgIHNvdXJjZS0+c2V0U2VxTnVtVG9OQUNLKG5hY2tTdGFydEF0LCBtYXNrLCBxdWV1ZUhlYWRTZXFOdW0pOworICAgIH0KKworICAgIHJldHVybiBuYWNrQ291bnQ7Cit9CisKK0FSVFBBc3NlbWJsZXI6OkFzc2VtYmx5U3RhdHVzIEFIRVZDQXNzZW1ibGVyOjphZGROQUxVbml0KAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSA9IHNvdXJjZS0+cXVldWUoKTsKKyAgICBjb25zdCB1aW50MzJfdCBmaXJzdFJUUFRpbWUgPSBzb3VyY2UtPm1GaXJzdFJ0cFRpbWU7CisKKyAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqcXVldWUtPmJlZ2luKCk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKKworICAgIC8qKgorICAgICAqIFJGQzM1NTAgY2FsY3VsYXRlcyB0aGUgaW50ZXJhcnJpdmFsIGppdHRlciB0aW1lIGZvciAnQUxMIHBhY2tldHMnLgorICAgICAqIEJ1dCB0aGF0IGlzIG5vdCB1c2VmdWwgYXMgYW4gaW5ncmVkaWVudCBvZiBidWZmZXJpbmcgdGltZS4KKyAgICAgKiBJbnN0ZWFkLCB3ZSBjYWxjdWxhdGVzIHRoZSB0aW1lIG9ubHkgZm9yIGFsbCAnTkFMIHVuaXRzJy4KKyAgICAgKi8KKyAgICBpbnQ2NF90IHJ0cFRpbWUgPSBmaW5kUlRQVGltZShmaXJzdFJUUFRpbWUsIGJ1ZmZlcik7CisgICAgaW50NjRfdCBub3dUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGlmIChydHBUaW1lICE9IG1MYXN0UnRwVGltZUppdHRlckRhdGFVcykgeworICAgICAgICBzb3VyY2UtPnB1dEJhc2VKaXR0ZXJEYXRhKHJ0cFRpbWUsIG5vd1RpbWVVcyk7CisgICAgICAgIG1MYXN0UnRwVGltZUppdHRlckRhdGFVcyA9IHJ0cFRpbWU7CisgICAgfQorICAgIHNvdXJjZS0+cHV0SW50ZXJBcnJpdmFsSml0dGVyRGF0YShydHBUaW1lLCBub3dUaW1lVXMpOworCisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWVNcyA9IHNvdXJjZS0+bVN5c0FuY2hvclRpbWUgLyAxMDAwOworICAgIGNvbnN0IGludDY0X3Qgbm93VGltZU1zID0gbm93VGltZVVzIC8gMTAwMDsKKyAgICBjb25zdCBpbnQzMl90IHN0YXRpY0ppdHRlclRpbWVNcyA9IHNvdXJjZS0+Z2V0U3RhdGljSml0dGVyVGltZU1zKCk7CisgICAgY29uc3QgaW50MzJfdCBiYXNlSml0dGVyVGltZU1zID0gc291cmNlLT5nZXRCYXNlSml0dGVyVGltZU1zKCk7CisgICAgY29uc3QgaW50MzJfdCBkeW5hbWljSml0dGVyVGltZU1zID0gc291cmNlLT5nZXRJbnRlckFycml2YWxKaXR0ZXJUaW1lTXMoKTsKKyAgICBjb25zdCBpbnQ2NF90IGNsb2NrUmF0ZSA9IHNvdXJjZS0+bUNsb2NrUmF0ZTsKKworICAgIGludDY0X3QgcGxheWVkVGltZU1zID0gbm93VGltZU1zIC0gc3RhcnRUaW1lTXM7CisgICAgaW50NjRfdCBwbGF5ZWRUaW1lUnRwID0gc291cmNlLT5tRmlyc3RSdHBUaW1lICsgTXNUb1J0cChwbGF5ZWRUaW1lTXMsIGNsb2NrUmF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBCYXNlZCBvbiBleHBlcmllbmNlcyBpbiByZWFsIGNvbW1lcmNpYWwgbmV0d29yayBzZXJ2aWNlcywKKyAgICAgKiAzMDAgbXMgaXMgYSBtYXhpbXVtIGhldXJpc3RpYyBqaXR0ZXIgYnVmZmVyIHRpbWUgZm9yIHZpZGVvIFJUUCBzZXJ2aWNlLgorICAgICAqLworCisgICAgLyoqCisgICAgICogVGhlIGJhc2Ugaml0dGVyIGlzIGFuIGV4cGVjdGVkIGFkZGl0aW9uYWwgcHJvcGFnYXRpb24gdGltZS4KKyAgICAgKiBXZSBjYW4gZHJvcCBwYWNrZXRzIGlmIHRoZSB0aW1lIGRvZXNuJ3QgbWVldCBvdXIgc3RhbmRhcmRzLgorICAgICAqIElmIGl0IGdldHMgc2hvcnRlciwgd2UgY2FuIGdldCBmYXN0ZXIgcmVzcG9uc2UgYnV0IHNob3VsZCBkcm9wIGRlbGF5ZWQgcGFja2V0cy4KKyAgICAgKiBFeHBlY3RpbmcgcmFuZ2UgOiA1MG1zIH4gMTAwMG1zIChCdXQgMzAwIG1zIHdvdWxkIGJlIHByYWN0aWNhbCB1cHBlciBib3VuZCkKKyAgICAgKi8KKyAgICBjb25zdCBpbnQzMl90IGJhc2VKYlRpbWVNcyA9IHN0ZDo6bWluKHN0ZDo6bWF4KHN0YXRpY0ppdHRlclRpbWVNcywgYmFzZUppdHRlclRpbWVNcyksIDMwMCk7CisgICAgLyoqCisgICAgICogRHluYW1pYyBqaXR0ZXIgaXMgYSB2YXJpYW5jZSBvZiBpbnRlcmFycml2YWwgdGltZSBhcyBkZWZpbmVkIGluIHRoZSA2LjQuMSBvZiBSRkMgMzU1MC4KKyAgICAgKiBXZSBjYW4gcmVnYXJkIHRoaXMgYXMgYSB0b2xlcmFuY2Ugb2YgZXZlcnkgZGF0YSBwdXR0aW5nIG1vbWVudHMuCisgICAgICogRXhwZWN0aW5nIHJhbmdlIDogMG1zIH4gMTUwbXMgKE5vdCB0byBvdmVyIDMwMCBtcyBwcmFjdGljYWxseSkKKyAgICAgKi8KKyAgICBjb25zdCBpbnQzMl90IGR5bmFtaWNKYlRpbWVNcyA9IHN0ZDo6bWluKGR5bmFtaWNKaXR0ZXJUaW1lTXMsIDE1MCk7CisgICAgY29uc3QgaW50NjRfdCBkeW5hbWljSmJUaW1lUnRwID0gTXNUb1J0cChkeW5hbWljSmJUaW1lTXMsIGNsb2NrUmF0ZSk7CisgICAgLyogRnVuZGFtZW50YWwgaml0dGVyIHRpbWUgKi8KKyAgICBjb25zdCBpbnQzMl90IGppdHRlclRpbWVNcyA9IGJhc2VKYlRpbWVNczsKKyAgICBjb25zdCBpbnQ2NF90IGppdHRlclRpbWVSdHAgPSBNc1RvUnRwKGppdHRlclRpbWVNcywgY2xvY2tSYXRlKTsKKworICAgIC8vIFRpbGwgKFQpLCB0aGlzIGFzc2VtYmxlciB3YWl0cyB1bmNvbmRpdGlvbmFsbHkgdG8gY29sbGVjdCBjdXJyZW50IE5BTCB1bml0CisgICAgaW50NjRfdCBleHBpcmVkVGltZVJ0cCA9IHJ0cFRpbWUgKyBqaXR0ZXJUaW1lUnRwOyAgICAgICAvLyBXaGVuIGRvZXMgdGhpcyBidWZmZXIgZXhwaXJlID8gKFQpCisgICAgaW50NjRfdCBkaWZmVGltZVJ0cCA9IHBsYXllZFRpbWVSdHAgLSBleHBpcmVkVGltZVJ0cDsKKyAgICBib29sIGlzRXhwaXJlZCA9IChkaWZmVGltZVJ0cCA+PSAwKTsgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgZXhwaXJlZCBpZiBUIGlzIHBhc3NlZCBhd2F5CisKKyAgICAvLyBGcm9tIChUKSwgdGhpcyBhc3NlbWJsZXIgdHJpZXMgdG8gY29tcGxldGUgdGhlIE5BTCB0aWxsIChUICsgdHJ5KQorICAgIGludDMyX3QgdHJ5SmJUaW1lTXMgPSBiYXNlSml0dGVyVGltZU1zIC8gMiArIGR5bmFtaWNKYlRpbWVNczsKKyAgICBpbnQ2NF90IHRyeUpiVGltZVJ0cCA9IE1zVG9SdHAodHJ5SmJUaW1lTXMsIGNsb2NrUmF0ZSk7CisgICAgYm9vbCBpc0ZpcnN0TGluZUJyb2tlbiA9IChkaWZmVGltZVJ0cCA+IHRyeUpiVGltZVJ0cCk7CisKKyAgICAvLyBBZnRlciAoVCArIHRyeSksIGl0IGdpdmVzIGxhc3QgY2hhbmNlIHRpbGwgKFQgKyB0cnkgKyBhKSB3aXRoIHdhcm5pbmcgbWVzc2FnZXMuCisgICAgaW50NjRfdCBhbHBoYSA9IGR5bmFtaWNKYlRpbWVSdHAgKiBKSVRURVJfTVVMVElQTEU7ICAgICAvLyBVc2UgRHluIGFzICdhJworICAgIGJvb2wgaXNTZWNvbmRMaW5lQnJva2VuID0gKGRpZmZUaW1lUnRwID4gKHRyeUpiVGltZVJ0cCArIGFscGhhKSk7ICAgLy8gVGhlIE1hZ2lub3QgbGluZQorCisgICAgaWYgKG1TaG93UXVldWVDbnQgPCAyMCkgeworICAgICAgICBzaG93Q3VycmVudFF1ZXVlKHF1ZXVlKTsKKyAgICAgICAgcHJpbnROb3dUaW1lTXMoc3RhcnRUaW1lTXMsIG5vd1RpbWVNcywgcGxheWVkVGltZU1zKTsKKyAgICAgICAgcHJpbnRSVFBUaW1lKHJ0cFRpbWUsIHBsYXllZFRpbWVSdHAsIGV4cGlyZWRUaW1lUnRwLCBpc0V4cGlyZWQpOworICAgICAgICBtU2hvd1F1ZXVlQ250Kys7CisgICAgfQorCisgICAgQUhFVkNBc3NlbWJsZXI6OmFkZE5hY2soc291cmNlKTsKKworICAgIGlmICghaXNFeHBpcmVkKSB7CisgICAgICAgIEFMT0dWKCJidWZmZXJpbmcgaW4gaml0dGVyIGJ1ZmZlci4iKTsKKyAgICAgICAgLy8gc2V0IGFuIGFsYXJtIGZvciBqaXR0ZXIgYnVmZmVyIHRpbWUgZXhwaXJhdGlvbi4KKyAgICAgICAgLy8gYWRkaW5nIDFtcyBiZWNhdXNlIGppdHRlciBidWZmZXIgdGltZSBpcyBrZWVwIGNoYW5naW5nLgorICAgICAgICBpbnQ2NF90IGV4cFRpbWVVcyA9IChSdHBUb01zKHN0ZDo6YWJzKGRpZmZUaW1lUnRwKSwgY2xvY2tSYXRlKSArIDEpICogMTAwMDsKKyAgICAgICAgc291cmNlLT5zZXRKYkFsYXJtVGltZShub3dUaW1lVXMsIGV4cFRpbWVVcyk7CisgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgaWYgKGlzRmlyc3RMaW5lQnJva2VuKSB7CisgICAgICAgIGludDY0X3QgdG90YWxEaWZmVGltZU1zID0gUnRwVG9NcyhkaWZmVGltZVJ0cCArIGppdHRlclRpbWVSdHAsIGNsb2NrUmF0ZSk7CisgICAgICAgIFN0cmluZzggaW5mbzsKKyAgICAgICAgaW5mby5hcHBlbmRGb3JtYXQoIlJUUCBkaWZmIGZyb20gZXhwID0lbGxkIFx0IE1TIGRpZmYgZnJvbSBzdGFtcCA9ICVsbGRcdFx0IgorICAgICAgICAgICAgICAgICAgICAiU2VxIyAlZCBcdCBFeHBTZXEjICVkIFx0IgorICAgICAgICAgICAgICAgICAgICAiSml0dGVyTXMgJWQgKyAoJWQgKyAlZCAqICUuM2YpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkaWZmVGltZVJ0cCwgKGxvbmcgbG9uZyl0b3RhbERpZmZUaW1lTXMsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+aW50MzJEYXRhKCksIG1OZXh0RXhwZWN0ZWRTZXFObywKKyAgICAgICAgICAgICAgICAgICAgaml0dGVyVGltZU1zLCB0cnlKYlRpbWVNcywgZHluYW1pY0piVGltZU1zLCBKSVRURVJfTVVMVElQTEUpOworICAgICAgICBpZiAoaXNTZWNvbmRMaW5lQnJva2VuKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMiLCBpbmZvLnN0cmluZygpKTsKKyAgICAgICAgICAgIHByaW50Tm93VGltZU1zKHN0YXJ0VGltZU1zLCBub3dUaW1lTXMsIHBsYXllZFRpbWVNcyk7CisgICAgICAgICAgICBwcmludFJUUFRpbWUocnRwVGltZSwgcGxheWVkVGltZVJ0cCwgZXhwaXJlZFRpbWVSdHAsIGlzRXhwaXJlZCk7CisKKyAgICAgICAgfSAgZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMiLCBpbmZvLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBwaWNrU3RhcnRTZXEocXVldWUsIGZpcnN0UlRQVGltZSwgcGxheWVkVGltZVJ0cCwgaml0dGVyVGltZVJ0cCk7CisgICAgICAgIGludDMyX3QgY250UmVtb3ZlID0gZGVsZXRlVW5pdFVuZGVyU2VxKHF1ZXVlLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgICAgIGlmIChjbnRSZW1vdmUgPiAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHNpemUgPSBxdWV1ZS0+c2l6ZSgpOworICAgICAgICAgICAgc291cmNlLT5ub3RpY2VBYmFuZG9uQnVmZmVyKGNudFJlbW92ZSk7CisgICAgICAgICAgICBBTE9HVygiZGVsZXRlICVkIG9mICVkIGJ1ZmZlcnMiLCBjbnRSZW1vdmUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyID0gKnF1ZXVlLT5iZWdpbigpOworCisgICAgaWYgKCFtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCkgeworICAgICAgICBtTmV4dEV4cGVjdGVkU2VxTm9WYWxpZCA9IHRydWU7CisgICAgICAgIG1OZXh0RXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpOworICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgIT0gbU5leHRFeHBlY3RlZFNlcU5vKSB7CisgICAgICAgIEFMT0dWKCJOb3QgdGhlIHNlcXVlbmNlIG51bWJlciBJIGV4cGVjdGVkIik7CisKKyAgICAgICAgcmV0dXJuIFdST05HX1NFUVVFTkNFX05VTUJFUjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIGlmIChzaXplIDwgMSB8fCAoZGF0YVswXSAmIDB4ODApKSB7CisgICAgICAgIC8vIENvcnJ1cHQuCisKKyAgICAgICAgQUxPR1YoIklnbm9yaW5nIGNvcnJ1cHQgYnVmZmVyLiIpOworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworCisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gKGRhdGFbMF0gPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKyAgICBpZiAobmFsVHlwZSA+IDAgJiYgbmFsVHlwZSA8IEgyNjVfTkFMVV9BUCkgeworICAgICAgICBhZGRTaW5nbGVOQUxVbml0KGJ1ZmZlcik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9GVSkgeworICAgICAgICAvLyBGVS1BCisgICAgICAgIHJldHVybiBhZGRGcmFnbWVudGVkTkFMVW5pdChxdWV1ZSk7CisgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IEgyNjVfTkFMVV9BUCkgeworICAgICAgICAvLyBTVEFQLUEKKyAgICAgICAgYm9vbCBzdWNjZXNzID0gYWRkU2luZ2xlVGltZUFnZ3JlZ2F0aW9uUGFja2V0KGJ1ZmZlcik7CisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworCisgICAgICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBNQUxGT1JNRURfUEFDS0VUOworICAgIH0gZWxzZSBpZiAobmFsVHlwZSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyB1bmRlZmluZWQgbmFsIHR5cGUuIik7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJJZ25vcmluZyB1bnN1cHBvcnRlZCBidWZmZXIgKG5hbFR5cGU9JWQpIiwgbmFsVHlwZSk7CisKKyAgICAgICAgcXVldWUtPmVyYXNlKHF1ZXVlLT5iZWdpbigpKTsKKyAgICAgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87CisKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorfQorCit2b2lkIEFIRVZDQXNzZW1ibGVyOjpjaGVja1Nwc1VwZGF0ZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIEhldmNQYXJhbWV0ZXJTZXRzIHBhcmFtU2V0czsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gKGRhdGFbMF0gPj4gMSkgJiBIMjY1X05BTFVfTUFTSzsKKyAgICBpZiAobmFsVHlwZSA9PSBIMjY1X05BTFVfU1BTKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICAgICAgICBwYXJhbVNldHMuRmluZEhFVkNEaW1lbnNpb25zKGJ1ZmZlciwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICAgICAgQUxPR1YoImV4aXN0aW5nIHJlc29sdXRpb24gKCV1IHggJXUpIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgaWYgKHdpZHRoICE9IG1XaWR0aCB8fCBoZWlnaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgbUZpcnN0SUZyYW1lUHJvdmlkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBhIG5ldyByZXNvbHV0aW9uICgldSB4ICV1KSIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OmNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAoZGF0YVswXSA+PiAxKSAmIEgyNjVfTkFMVV9NQVNLOworICAgIGlmIChuYWxUeXBlID4gMHgwRiAmJiBuYWxUeXBlIDwgMHgxOCkgeworICAgICAgICBtTGFzdElGcmFtZVByb3ZpZGVkQXRNcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwOworICAgICAgICBpZiAoIW1GaXJzdElGcmFtZVByb3ZpZGVkKSB7CisgICAgICAgICAgICBtRmlyc3RJRnJhbWVQcm92aWRlZCA9IHRydWU7CisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBBTE9HRCgiZ290IEZpcnN0IEktZnJhbWUgdG8gYmUgZGVjb2RlZC4gcnRwVGltZT0lZCwgc2l6ZT0lenUiLCBydHBUaW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQUhFVkNBc3NlbWJsZXI6OmRyb3BGcmFtZXNVbnRpbElmcmFtZShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgdW5zaWduZWQgbmFsVHlwZSA9IChkYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisgICAgcmV0dXJuICFtRmlyc3RJRnJhbWVQcm92aWRlZCAmJiBuYWxUeXBlIDwgMHgxMDsKK30KKwordm9pZCBBSEVWQ0Fzc2VtYmxlcjo6YWRkU2luZ2xlTkFMVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgQUxPR1YoImFkZFNpbmdsZU5BTFVuaXQgb2Ygc2l6ZSAlenUiLCBidWZmZXItPnNpemUoKSk7CisjaWYgIUxPR19OREVCVUcKKyAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKyAgICBjaGVja1Nwc1VwZGF0ZWQoYnVmZmVyKTsKKyAgICBjaGVja0lGcmFtZVByb3ZpZGVkKGJ1ZmZlcik7CisKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgaWYgKGRyb3BGcmFtZXNVbnRpbElmcmFtZShidWZmZXIpKSB7CisgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IG51bGxwdHI7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJzb3VyY2UiLCAoc3A8YW5kcm9pZDo6UmVmQmFzZT4qKSZzb3VyY2UpOworICAgICAgICBpZiAoc291cmNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJJc3N1ZWQgRklSIHRvIGdldCB0aGUgSS1mcmFtZSIpOworICAgICAgICAgICAgc291cmNlLT5vbklzc3VlRklSQnlBc3NlbWJsZXIoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiZHJvcCBQLWZyYW1lcyB0aWxsIGFuIEktZnJhbWUgcHJvdmlkZWQuIHJ0cFRpbWUgJXUiLCBydHBUaW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbU5BTFVuaXRzLmVtcHR5KCkgJiYgcnRwVGltZSAhPSBtQWNjZXNzVW5pdFJUUFRpbWUpIHsKKyAgICAgICAgc3VibWl0QWNjZXNzVW5pdCgpOworICAgIH0KKyAgICBtQWNjZXNzVW5pdFJUUFRpbWUgPSBydHBUaW1lOworCisgICAgbU5BTFVuaXRzLnB1c2hfYmFjayhidWZmZXIpOworfQorCitib29sIEFIRVZDQXNzZW1ibGVyOjphZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgaWYgKHNpemUgPCAzKSB7CisgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIHRvbyBzbWFsbCBTVEFQLUEgcGFja2V0LiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKytkYXRhOworICAgIC0tc2l6ZTsKKyAgICB3aGlsZSAoc2l6ZSA+PSAyKSB7CisgICAgICAgIHNpemVfdCBuYWxTaXplID0gKGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdOworCisgICAgICAgIGlmIChzaXplIDwgbmFsU2l6ZSArIDIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJEaXNjYXJkaW5nIG1hbGZvcm1lZCBTVEFQLUEgcGFja2V0LiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKG5hbFNpemUpOworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpLCAmZGF0YVsyXSwgbmFsU2l6ZSk7CisKKyAgICAgICAgQ29weVRpbWVzKHVuaXQsIGJ1ZmZlcik7CisKKyAgICAgICAgYWRkU2luZ2xlTkFMVW5pdCh1bml0KTsKKworICAgICAgICBkYXRhICs9IDIgKyBuYWxTaXplOworICAgICAgICBzaXplIC09IDIgKyBuYWxTaXplOworICAgIH0KKworICAgIGlmIChzaXplICE9IDApIHsKKyAgICAgICAgQUxPR1YoIlVuZXhwZWN0ZWQgcGFkZGluZyBhdCBlbmQgb2YgU1RBUC1BIHBhY2tldC4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQVJUUEFzc2VtYmxlcjo6QXNzZW1ibHlTdGF0dXMgQUhFVkNBc3NlbWJsZXI6OmFkZEZyYWdtZW50ZWROQUxVbml0KAorICAgICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gKnF1ZXVlKSB7CisgICAgQ0hFQ0soIXF1ZXVlLT5lbXB0eSgpKTsKKworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICpxdWV1ZS0+YmVnaW4oKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKKworICAgIENIRUNLKHNpemUgPiAwKTsKKyAgICAvKiAgIEgyNjUgcGF5bG9hZCBoZWFkZXIgaXMgMTYgYml0CisgICAgICAgIDAgMSAyIDMgNCA1IDYgNyAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICB8RnwgICAgIFR5cGUgIHwgIExheWVyIElEIHwgVElEIHwKKyAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbmRpY2F0b3IgPSAoZGF0YVswXSA+PiAxKTsKKworICAgIENIRUNLKChpbmRpY2F0b3IgJiBIMjY1X05BTFVfTUFTSykgPT0gSDI2NV9OQUxVX0ZVKTsKKworICAgIGlmIChzaXplIDwgMykgeworICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlciAoc2l6ZSA9ICV6dSkiLCBzaXplKTsKKworICAgICAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCkpOworICAgICAgICArK21OZXh0RXhwZWN0ZWRTZXFObzsKKyAgICAgICAgcmV0dXJuIE1BTEZPUk1FRF9QQUNLRVQ7CisgICAgfQorCisgICAgaWYgKCEoZGF0YVsyXSAmIDB4ODApKSB7CisgICAgICAgIC8vIFN0YXJ0IGJpdCBub3Qgc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyAgICAgICAgQUxPR1YoIlN0YXJ0IGJpdCBub3Qgc2V0IG9uIGZpcnN0IGJ1ZmZlciIpOworCisgICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7CisgICAgICAgICsrbU5leHRFeHBlY3RlZFNlcU5vOworICAgICAgICByZXR1cm4gTUFMRk9STUVEX1BBQ0tFVDsKKyAgICB9CisKKyAgICAvKiAgRlUgSU5ESUNBVE9SIEhEUgorICAgICAgICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgIHxTfEV8ICAgVHlwZSAgICB8CisgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgICAgKi8KKyAgICB1aW50MzJfdCBuYWxUeXBlID0gZGF0YVsyXSAmIEgyNjVfTkFMVV9NQVNLOworICAgIHVpbnQzMl90IHRpZCA9IGRhdGFbMV0gJiAweDc7CisgICAgQUxPR1YoIm5hbFR5cGUgPSV1LCB0aWQgPSV1IiwgbmFsVHlwZSwgdGlkKTsKKworICAgIHVpbnQzMl90IGV4cGVjdGVkU2VxTm8gPSAodWludDMyX3QpYnVmZmVyLT5pbnQzMkRhdGEoKSArIDE7CisgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNpemUgLSAzOworICAgIHNpemVfdCB0b3RhbENvdW50ID0gMTsKKyAgICBib29sIGNvbXBsZXRlID0gZmFsc2U7CisKKyAgICB1aW50MzJfdCBydHBUaW1lU3RhcnRBdDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWVTdGFydEF0KSk7CisgICAgdWludDMyX3Qgc3RhcnRTZXFObyA9IGJ1ZmZlci0+aW50MzJEYXRhKCk7CisKKyAgICBpZiAoZGF0YVsyXSAmIDB4NDApIHsKKyAgICAgICAgLy8gSHVoPyBFbmQgYml0IGFsc28gc2V0IG9uIHRoZSBmaXJzdCBidWZmZXIuCisKKyAgICAgICAgQUxPR1YoIkdycnIuIFRoaXMgaXNuJ3QgZnJhZ21lbnRlZCBhdCBhbGwuIik7CisKKyAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSArK3F1ZXVlLT5iZWdpbigpOworICAgICAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigic2VxdWVuY2UgbGVuZ3RoICV6dSIsIHRvdGFsQ291bnQpOworCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOworCisgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgIT0gZXhwZWN0ZWRTZXFObykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBub3QgY29tcGxldGUsIGV4cGVjdGVkIHNlcU5vICV1LCBnb3QgJXUsIG5hbFR5cGUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXFObywgKHVuc2lnbmVkKWJ1ZmZlci0+aW50MzJEYXRhKCksIG5hbFR5cGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOworICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigicnRwLXRpbWUiLCAoaW50MzJfdCAqKSZydHBUaW1lKSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JpbmcgbWFsZm9ybWVkIEZVIGJ1ZmZlci4iKTsKKyAgICAgICAgICAgICAgICBpdCA9IHF1ZXVlLT5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKChkYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0spICE9IGluZGljYXRvcgorICAgICAgICAgICAgICAgICAgICB8fCAoZGF0YVsyXSAmIEgyNjVfTkFMVV9NQVNLKSAhPSBuYWxUeXBlCisgICAgICAgICAgICAgICAgICAgIHx8IChkYXRhWzJdICYgMHg4MCkKKyAgICAgICAgICAgICAgICAgICAgfHwgcnRwVGltZSAhPSBydHBUaW1lU3RhcnRBdCkgeworICAgICAgICAgICAgICAgIC8vIEFzc2VtYmxlciBhbHJlYWR5IGhhdmUgZ2l2ZW4gZW5vdWdoIHRpbWUgYnkgaml0dGVyIGJ1ZmZlcgorICAgICAgICAgICAgICAgIEFMT0dEKCJTZWVtcyBhbm90aGVyIGZyYW1lLiBJbmNvbXBsZXRlIGZyYW1lIFslZCB+ICVkKSBcdCAlZCBGVXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZXFObywgZXhwZWN0ZWRTZXFObywgKGludClxdWV1ZS0+ZGlzdGFuY2UocXVldWUtPmJlZ2luKCksIGl0KSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRTZXFObyA9ICh1aW50MzJfdClidWZmZXItPmludDMyRGF0YSgpOworICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG90YWxTaXplICs9IHNpemUgLSAzOworICAgICAgICAgICAgKyt0b3RhbENvdW50OworCisgICAgICAgICAgICBleHBlY3RlZFNlcU5vID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCkgKyAxOworCisgICAgICAgICAgICBpZiAoZGF0YVsyXSAmIDB4NDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYXN0IGZyYWdtZW50LgorICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghY29tcGxldGUpIHsKKyAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBtTmV4dEV4cGVjdGVkU2VxTm8gPSBleHBlY3RlZFNlcU5vOworCisgICAgLy8gV2UgZm91bmQgYWxsIHRoZSBmcmFnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjb21wbGV0ZSBOQUwgdW5pdC4KKworICAgIC8vIExlYXZlIHJvb20gZm9yIHRoZSBoZWFkZXIuIFNvIGZhciB0b3RhbFNpemUgZGlkIG5vdCBpbmNsdWRlIHRoZQorICAgIC8vIGhlYWRlciBieXRlLgorICAgIHRvdGFsU2l6ZSArPSAyOworCisgICAgc3A8QUJ1ZmZlcj4gdW5pdCA9IG5ldyBBQnVmZmVyKHRvdGFsU2l6ZSk7CisgICAgQ29weVRpbWVzKHVuaXQsICpxdWV1ZS0+YmVnaW4oKSk7CisKKyAgICB1bml0LT5kYXRhKClbMF0gPSAobmFsVHlwZSA8PCAxKTsKKyAgICB1bml0LT5kYXRhKClbMV0gPSB0aWQ7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMjsKKyAgICBpbnQzMl90IGN2byA9IC0xOworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvdGFsQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OworCisgICAgICAgIEFMT0dWKCJwaWVjZSAjJXp1LyV6dSIsIGkgKyAxLCB0b3RhbENvdW50KTsKKyNpZiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisjZW5kaWYKKworICAgICAgICBtZW1jcHkodW5pdC0+ZGF0YSgpICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSArIDMsIGJ1ZmZlci0+c2l6ZSgpIC0gMyk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImN2byIsICZjdm8pOworICAgICAgICBvZmZzZXQgKz0gYnVmZmVyLT5zaXplKCkgLSAzOworCisgICAgICAgIGl0ID0gcXVldWUtPmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB1bml0LT5zZXRSYW5nZSgwLCB0b3RhbFNpemUpOworCisgICAgaWYgKGN2byA+PSAwKSB7CisgICAgICAgIHVuaXQtPm1ldGEoKS0+c2V0SW50MzIoImN2byIsIGN2byk7CisgICAgICAgIG1MYXN0Q3ZvID0gY3ZvOworICAgIH0gZWxzZSBpZiAobUxhc3RDdm8gPj0gMCkgeworICAgICAgICB1bml0LT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBtTGFzdEN2byk7CisgICAgfQorCisgICAgYWRkU2luZ2xlTkFMVW5pdCh1bml0KTsKKworICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgYXNzZW1ibGVkIGEgTkFMIHVuaXQgZnJvbSBmcmFnbWVudHMuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OnN1Ym1pdEFjY2Vzc1VuaXQoKSB7CisgICAgQ0hFQ0soIW1OQUxVbml0cy5lbXB0eSgpKTsKKworICAgIEFMT0dWKCJBY2Nlc3MgdW5pdCBjb21wbGV0ZSAoJXp1IG5hbCB1bml0cykiLCBtTkFMVW5pdHMuc2l6ZSgpKTsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbU5BTFVuaXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHRvdGFsU2l6ZSArPSA0ICsgKCppdCktPnNpemUoKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIodG90YWxTaXplKTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQzMl90IGN2byA9IC0xOworICAgIGZvciAoTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdCA9IG1OQUxVbml0cy5iZWdpbigpOworICAgICAgICAgaXQgIT0gbU5BTFVuaXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCkgKyBvZmZzZXQsICJceDAwXHgwMFx4MDBceDAxIiwgNCk7CisgICAgICAgIG9mZnNldCArPSA0OworCisgICAgICAgIHNwPEFCdWZmZXI+IG5hbCA9ICppdDsKKyAgICAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgbmFsLT5kYXRhKCksIG5hbC0+c2l6ZSgpKTsKKyAgICAgICAgb2Zmc2V0ICs9IG5hbC0+c2l6ZSgpOworICAgICAgICBuYWwtPm1ldGEoKS0+ZmluZEludDMyKCJjdm8iLCAmY3ZvKTsKKyAgICB9CisKKyAgICBDb3B5VGltZXMoYWNjZXNzVW5pdCwgKm1OQUxVbml0cy5iZWdpbigpKTsKKworI2lmIDAKKyAgICBwcmludGYobUFjY2Vzc1VuaXREYW1hZ2VkID8gIlgiIDogIi4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorICAgIGlmIChjdm8gPj0gMCkgeworICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjdm8iLCBjdm8pOworICAgIH0KKworICAgIGlmIChtQWNjZXNzVW5pdERhbWFnZWQpIHsKKyAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGFtYWdlZCIsIHRydWUpOworICAgIH0KKworICAgIG1OQUxVbml0cy5jbGVhcigpOworICAgIG1BY2Nlc3NVbml0RGFtYWdlZCA9IGZhbHNlOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0QnVmZmVyKCJhY2Nlc3MtdW5pdCIsIGFjY2Vzc1VuaXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCitpbnQzMl90IEFIRVZDQXNzZW1ibGVyOjpwaWNrU3RhcnRTZXEoY29uc3QgUXVldWUgKnF1ZXVlLAorICAgICAgICB1aW50MzJfdCBmaXJzdCwgaW50NjRfdCBwbGF5LCBpbnQ2NF90IGppdCkgeworICAgIC8vIHBpY2sgdGhlIGZpcnN0IHNlcXVlbmNlIG51bWJlciBoYXMgdGhlIHN0YXJ0IGJpdC4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqKHF1ZXVlLT5iZWdpbigpKTsKKyAgICBpbnQzMl90IGZpcnN0U2VxTm8gPSBidWZmZXItPmludDMyRGF0YSgpOworCisgICAgLy8gVGhpcyBvbmx5IHdvcmtzIGZvciBGVS1BIHR5cGUgJiBub24tc3RhcnQgc2VxdWVuY2UKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gYnVmZmVyLT5kYXRhKClbMF0gJiAweDFmOworICAgIGlmIChuYWxUeXBlICE9IDI4IHx8IGJ1ZmZlci0+ZGF0YSgpWzJdICYgMHg4MCkgeworICAgICAgICByZXR1cm4gZmlyc3RTZXFObzsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gaXQgOiAqcXVldWUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGl0LT5kYXRhKCk7CisgICAgICAgIGludDY0X3QgcnRwVGltZSA9IGZpbmRSVFBUaW1lKGZpcnN0LCBpdCk7CisgICAgICAgIGlmIChydHBUaW1lICsgaml0ID49IHBsYXkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgoZGF0YVsyXSAmIDB4ODApKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcU5vID0gaXQtPmludDMyRGF0YSgpOworICAgICAgICAgICAgQUxPR0UoImZpbmRpbmcgW0hFQURdIHBrdC4gXHQgU2VxIyAoJWQgfiApWyVkIiwgZmlyc3RTZXFObywgc2VxTm8pOworICAgICAgICAgICAgZmlyc3RTZXFObyA9IHNlcU5vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZpcnN0U2VxTm87Cit9CisKK2ludDMyX3QgQUhFVkNBc3NlbWJsZXI6OmRlbGV0ZVVuaXRVbmRlclNlcShRdWV1ZSAqcXVldWUsIHVpbnQzMl90IHNlcSkgeworICAgIGludDMyX3QgaW5pdFNpemUgPSBxdWV1ZS0+c2l6ZSgpOworICAgIFF1ZXVlOjppdGVyYXRvciBpdCA9IHF1ZXVlLT5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBxdWV1ZS0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKCh1aW50MzJfdCkoKml0KS0+aW50MzJEYXRhKCkgPj0gc2VxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdCsrOworICAgIH0KKyAgICBxdWV1ZS0+ZXJhc2UocXVldWUtPmJlZ2luKCksIGl0KTsKKyAgICByZXR1cm4gaW5pdFNpemUgLSBxdWV1ZS0+c2l6ZSgpOworfQorCitBUlRQQXNzZW1ibGVyOjpBc3NlbWJseVN0YXR1cyBBSEVWQ0Fzc2VtYmxlcjo6YXNzZW1ibGVNb3JlKAorICAgICAgICBjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKSB7CisgICAgQXNzZW1ibHlTdGF0dXMgc3RhdHVzID0gYWRkTkFMVW5pdChzb3VyY2UpOworICAgIGlmIChzdGF0dXMgPT0gTUFMRk9STUVEX1BBQ0tFVCkgeworICAgICAgICB1aW50NjRfdCBtc2Vjc1NpbmNlTGFzdElGcmFtZSA9IChBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCkgLSBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICAgICAgaWYgKG1zZWNzU2luY2VMYXN0SUZyYW1lID4gMTAwMCkgeworICAgICAgICAgICAgQUxPR1YoInJlcXVlc3QgRklSIHRvIGdldCBhIG5ldyBJLUZyYW1lLCB0aW1lIGFmdGVyICIKKyAgICAgICAgICAgICAgICAgICAgImxhc3QgSS1GcmFtZSBpbiAlbGx1IG1zIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltc2Vjc1NpbmNlTGFzdElGcmFtZSk7CisgICAgICAgICAgICBzb3VyY2UtPm9uSXNzdWVGSVJCeUFzc2VtYmxlcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6OnBhY2tldExvc3QoKSB7CisgICAgQ0hFQ0sobU5leHRFeHBlY3RlZFNlcU5vVmFsaWQpOworICAgIEFMT0dEKCJwYWNrZXRMb3N0IChleHBlY3RlZCAldSkiLCBtTmV4dEV4cGVjdGVkU2VxTm8pOworCisgICAgKyttTmV4dEV4cGVjdGVkU2VxTm87Cit9CisKK3ZvaWQgQUhFVkNBc3NlbWJsZXI6Om9uQnllUmVjZWl2ZWQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnlNc2ctPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIG1zZy0+cG9zdCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BSEVWQ0Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzVkOGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FIRVZDQXNzZW1ibGVyLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9IRVZDX0FTU0VNQkxFUl9IXworCisjZGVmaW5lIEFfSEVWQ19BU1NFTUJMRVJfSF8KKworI2luY2x1ZGUgIkFSVFBBc3NlbWJsZXIuaCIKKworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOworCitzdHJ1Y3QgQUhFVkNBc3NlbWJsZXIgOiBwdWJsaWMgQVJUUEFzc2VtYmxlciB7CisgICAgQUhFVkNBc3NlbWJsZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOworCisgICAgdHlwZWRlZiBMaXN0PHNwPEFCdWZmZXI+ID4gUXVldWU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BSEVWQ0Fzc2VtYmxlcigpOworCisgICAgdmlydHVhbCBBc3NlbWJseVN0YXR1cyBhc3NlbWJsZU1vcmUoY29uc3Qgc3A8QVJUUFNvdXJjZT4gJnNvdXJjZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQnllUmVjZWl2ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFja2V0TG9zdCgpOworCitwcml2YXRlOgorICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5TXNnOworCisgICAgdWludDMyX3QgbUFjY2Vzc1VuaXRSVFBUaW1lOworICAgIGJvb2wgbU5leHRFeHBlY3RlZFNlcU5vVmFsaWQ7CisgICAgdWludDMyX3QgbU5leHRFeHBlY3RlZFNlcU5vOworICAgIGJvb2wgbUFjY2Vzc1VuaXREYW1hZ2VkOworICAgIGJvb2wgbUZpcnN0SUZyYW1lUHJvdmlkZWQ7CisgICAgaW50MzJfdCBtTGFzdEN2bzsKKyAgICB1aW50NjRfdCBtTGFzdElGcmFtZVByb3ZpZGVkQXRNczsKKyAgICBpbnQ2NF90IG1MYXN0UnRwVGltZUppdHRlckRhdGFVczsKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1OQUxVbml0czsKKworICAgIGludDMyX3QgYWRkTmFjayhjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGNoZWNrU3BzVXBkYXRlZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIGNoZWNrSUZyYW1lUHJvdmlkZWQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgYm9vbCBkcm9wRnJhbWVzVW50aWxJZnJhbWUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgQXNzZW1ibHlTdGF0dXMgYWRkTkFMVW5pdChjb25zdCBzcDxBUlRQU291cmNlPiAmc291cmNlKTsKKyAgICB2b2lkIGFkZFNpbmdsZU5BTFVuaXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisgICAgQXNzZW1ibHlTdGF0dXMgYWRkRnJhZ21lbnRlZE5BTFVuaXQoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CisgICAgYm9vbCBhZGRTaW5nbGVUaW1lQWdncmVnYXRpb25QYWNrZXQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2b2lkIHN1Ym1pdEFjY2Vzc1VuaXQoKTsKKworICAgIGludDMyX3QgcGlja1N0YXJ0U2VxKGNvbnN0IFF1ZXVlICpxLCB1aW50MzJfdCBmaXJzdCwgaW50NjRfdCBwbGF5LCBpbnQ2NF90IGppdCk7CisgICAgaW50MzJfdCBkZWxldGVVbml0VW5kZXJTZXEoUXVldWUgKnF1ZXVlLCB1aW50MzJfdCBzZXEpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQUhFVkNBc3NlbWJsZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBX0hFVkNfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAppbmRleCA1NzRiZDdhLi4xNjlkZjQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKQEAgLTQ1NCw2ICs0NTQsMTcgQEAKIAogICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjUvIiwgNSkpIHsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKCFzZXNzaW9uRGVzYy0+Z2V0RGltZW5zaW9ucyhpbmRleCwgUFQsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgIHdpZHRoID0gLTE7CisgICAgICAgICAgICBoZWlnaHQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBoZWlnaHQpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0yMDAwLyIsIDEwKQogICAgICAgICAgICAgfHwgIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiSDI2My0xOTk4LyIsIDEwKSkgewogICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2Myk7CkBAIC01ODMsNCArNTk0LDE1IEBACiAgICAgcmV0dXJuIG1Gb3JtYXQ7CiB9CiAKK2Jvb2wgQVBhY2tldFNvdXJjZTo6aXNWaWRlbygpIHsKKyAgICBib29sIGlzVmlkZW8gPSBmYWxzZTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaWYgKG1Gb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKSB7CisgICAgICAgIGlzVmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworICAgIH0KKworICAgIHJldHVybiBpc1ZpZGVvOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaAppbmRleCA1MzBlNTM3Li4yYjliNWJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuaApAQCAtMzMsNiArMzMsOCBAQAogCiAgICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCk7CiAKKyAgICBib29sIGlzVmlkZW8oKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFQYWNrZXRTb3VyY2UoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKaW5kZXggYmVmYzIyNi4uNTJhYTNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkFSVFBBc3NlbWJsZXIiCiAjaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0yMSwxMiArMjIsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQVJUUEFzc2VtYmxlcjo6QVJUUEFzc2VtYmxlcigpCi0gICAgOiBtRmlyc3RGYWlsdXJlVGltZVVzKC0xKSB7CisgICAgOiBtU2hvd1F1ZXVlQ250KDApLAorICAgICAgbUZpcnN0RmFpbHVyZVRpbWVVcygtMSkgeworICAgIG1TaG93UXVldWUgPSBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LnJ0cCIsIGZhbHNlKTsKIH0KIAogdm9pZCBBUlRQQXNzZW1ibGVyOjpvblBhY2tldFJlY2VpdmVkKGNvbnN0IHNwPEFSVFBTb3VyY2U+ICZzb3VyY2UpIHsKQEAgLTE0MSw0ICsxNDYsMTUgQEAKICAgICByZXR1cm4gYWNjZXNzVW5pdDsKIH0KIAordm9pZCBBUlRQQXNzZW1ibGVyOjpzaG93Q3VycmVudFF1ZXVlKExpc3Q8c3A8QUJ1ZmZlcj4gPiAqcXVldWUpIHsKKyAgICBBU3RyaW5nIHRlbXAoIlF1ZXVlIGVsZW0gc2l6ZSA6ICIpOworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBxdWV1ZS0+YmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gcXVldWUtPmVuZCgpKSB7CisgICAgICAgIHRlbXAuYXBwZW5kKCgqaXQpLT5zaXplKCkpOworICAgICAgICB0ZW1wLmFwcGVuZCgiICBcdCIpOworICAgICAgICBpdCsrOworICAgIH0KKyAgICBBTE9HRCgiJXMiLHRlbXAuY19zdHIoKSk7Cit9OworCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAppbmRleCA0MDgyZDRjLi5mOTU5YzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuaApAQCAtMTksNiArMTksOSBAQAogI2RlZmluZSBBX1JUUF9BU1NFTUJMRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCkBAIC01NiwxMiArNTksNTIgQEAKICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gTWFrZUNvbXBvdW5kRnJvbVBhY2tldHMoCiAgICAgICAgICAgICBjb25zdCBMaXN0PHNwPEFCdWZmZXI+ID4gJmZyYW1lcyk7CiAKKyAgICB2b2lkIHNob3dDdXJyZW50UXVldWUoTGlzdDxzcDxBQnVmZmVyPiA+ICpxdWV1ZSk7CisKKyAgICBib29sIG1TaG93UXVldWU7CisgICAgaW50MzJfdCBtU2hvd1F1ZXVlQ250OworCisgICAgLy8gVXRpbGl0eSBmdW5jdGlvbnMKKyAgICBpbmxpbmUgaW50NjRfdCBmaW5kUlRQVGltZShjb25zdCB1aW50MzJfdCYgZmlyc3RSVFBUaW1lLCBjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKTsKKyAgICBpbmxpbmUgaW50NjRfdCBNc1RvUnRwKGludDY0X3QgbXMsIGludDY0X3QgY2xvY2tSYXRlKTsKKyAgICBpbmxpbmUgaW50NjRfdCBSdHBUb01zKGludDY0X3QgcnRwLCBpbnQ2NF90IGNsb2NrUmF0ZSk7CisgICAgaW5saW5lIHZvaWQgcHJpbnROb3dUaW1lTXMoaW50NjRfdCBzdGFydCwgaW50NjRfdCBub3csIGludDY0X3QgcGxheSk7CisgICAgaW5saW5lIHZvaWQgcHJpbnRSVFBUaW1lKGludDY0X3QgcnRwLCBpbnQ2NF90IHBsYXksIGludDY0X3QgZXhwLCBib29sIGlzRXhwKTsKKwogcHJpdmF0ZToKICAgICBpbnQ2NF90IG1GaXJzdEZhaWx1cmVUaW1lVXM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBUlRQQXNzZW1ibGVyKTsKIH07CiAKK2lubGluZSBpbnQ2NF90IEFSVFBBc3NlbWJsZXI6OmZpbmRSVFBUaW1lKGNvbnN0IHVpbnQzMl90JiBmaXJzdFJUUFRpbWUsIGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpIHsKKyAgICAvKiBJZiB5b3Ugd2FudCB0byArLC0sKiBydHBUaW1lLCByZWNvbW1lbmQgdG8gZGVjbGFyZSBydHBUaW1lIGFzIGludDY0X3QuCisgICAgICAgQmVjYXVzZSBydHBUaW1lIGNhbiBiZSBuZWFyIFVJTlQzMl9NQVguIEJld2FyZSB0aGUgb3ZlcmZsb3cuICovCisgICAgaW50NjRfdCBydHBUaW1lID0gMDsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICAvLyBJZiB0aGUgZmlyc3Qgb3ZlcnMgMl4zMSBhbmQgcnRwIHVuZGVycyAyXjMxLCB0aGUgcnRwIHZhbHVlIGlzIG92ZXJmbG93ZWQgb25lLgorICAgIGludDY0X3Qgb3ZlcmZsb3dNYXNrID0gKGZpcnN0UlRQVGltZSAmIDB4ODAwMDAwMDAgJiB+cnRwVGltZSkgPDwgMTsKKyAgICByZXR1cm4gcnRwVGltZSB8IG92ZXJmbG93TWFzazsKK30KKworaW5saW5lIGludDY0X3QgQVJUUEFzc2VtYmxlcjo6TXNUb1J0cChpbnQ2NF90IG1zLCBpbnQ2NF90IGNsb2NrUmF0ZSkgeworICAgIHJldHVybiBtcyAqIGNsb2NrUmF0ZSAvIDEwMDA7Cit9CisKK2lubGluZSBpbnQ2NF90IEFSVFBBc3NlbWJsZXI6OlJ0cFRvTXMoaW50NjRfdCBydHAsIGludDY0X3QgY2xvY2tSYXRlKSB7CisgICAgcmV0dXJuIHJ0cCAqIDEwMDAgLyBjbG9ja1JhdGU7Cit9CisKK2lubGluZSB2b2lkIEFSVFBBc3NlbWJsZXI6OnByaW50Tm93VGltZU1zKGludDY0X3Qgc3RhcnQsIGludDY0X3Qgbm93LCBpbnQ2NF90IHBsYXkpIHsKKyAgICBBTE9HRCgic3RhcnQ9JWxsZCwgbm93PSVsbGQsIHBsYXllZD0lbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpc3RhcnQsIChsb25nIGxvbmcpbm93LCAobG9uZyBsb25nKXBsYXkpOworfQorCitpbmxpbmUgdm9pZCBBUlRQQXNzZW1ibGVyOjpwcmludFJUUFRpbWUoaW50NjRfdCBydHAsIGludDY0X3QgcGxheSwgaW50NjRfdCBleHAsIGJvb2wgaXNFeHApIHsKKyAgICBBTE9HRCgicnRwLXRpbWUoSkIpPSVsbGQsIHBsYXllZC1ydHAtdGltZShKQik9JWxsZCwgZXhwaXJlZC1ydHAtdGltZShKQik9JWxsZCBleHBpcmVkPSVkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpcnRwLCAobG9uZyBsb25nKXBsYXksIChsb25nIGxvbmcpZXhwLCBpc0V4cCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gQV9SVFBfQVNTRU1CTEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCmluZGV4IDZhNDcwNmQuLjBiZDM0MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCkBAIC0xOCw5ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkFSVFBDb25uZWN0aW9uIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSAiQVJUUEFzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCi0KICNpbmNsdWRlICJBUlRQU291cmNlLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgogCkBAIC0zMCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL211bHRpbmV0d29yay5oPgorCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCkBAIC01Myw2ICs1Myw3IEBACiBjb25zdCBpbnQ2NF90IEFSVFBDb25uZWN0aW9uOjprU2VsZWN0VGltZW91dFVzID0gMTAwMExMOwogCiBzdHJ1Y3QgQVJUUENvbm5lY3Rpb246OlN0cmVhbUluZm8geworICAgIGJvb2wgaXNJUHY2OwogICAgIGludCBtUlRQU29ja2V0OwogICAgIGludCBtUlRDUFNvY2tldDsKICAgICBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiBtU2Vzc2lvbkRlc2M7CkBAIC02MywxNCArNjQsMjMgQEAKICAgICBpbnQ2NF90IG1OdW1SVENQUGFja2V0c1JlY2VpdmVkOwogICAgIGludDY0X3QgbU51bVJUUFBhY2tldHNSZWNlaXZlZDsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJlbW90ZVJUQ1BBZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbVJlbW90ZVJUQ1BBZGRyNjsKIAogICAgIGJvb2wgbUlzSW5qZWN0ZWQ7CisKKyAgICAvLyBBIHBsYWNlIHRvIHNhdmUgdGltZSB3aGVuIGl0IHBvbGxzCisgICAgaW50NjRfdCBtTGFzdFBvbGxUaW1lVXM7CisgICAgLy8gUlRDUCBFeHRlbnNpb24gZm9yIENWTworICAgIGludCBtQ1ZPRXh0TWFwOyAvLyB3aWxsIGJlIHNldCB0byAwIGlmIGN2byBpcyBub3QgbmVnb3RpYXRlZCBpbiBzZHAKIH07CiAKIEFSVFBDb25uZWN0aW9uOjpBUlRQQ29ubmVjdGlvbih1aW50MzJfdCBmbGFncykKICAgICA6IG1GbGFncyhmbGFncyksCiAgICAgICBtUG9sbEV2ZW50UGVuZGluZyhmYWxzZSksCi0gICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzKC0xKSB7CisgICAgICBtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzKC0xKSwKKyAgICAgIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcygtMSksCisgICAgICBtVGFyZ2V0Qml0cmF0ZSgtMSksCisgICAgICBtU3RhdGljSml0dGVyVGltZU1zKGtTdGF0aWNKaXR0ZXJUaW1lTXMpIHsKIH0KIAogQVJUUENvbm5lY3Rpb246On5BUlRQQ29ubmVjdGlvbigpIHsKQEAgLTkyLDYgKzEwMiwxMSBAQAogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIEFSVFBDb25uZWN0aW9uOjpzZWVrU3RyZWFtKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrU3RyZWFtLCB0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwogdm9pZCBBUlRQQ29ubmVjdGlvbjo6cmVtb3ZlU3RyZWFtKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0KSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbW92ZVN0cmVhbSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CkBAIC0xMjEsNyArMTM2LDcgQEAKICAgICB1bnNpZ25lZCBzdGFydCA9ICh1bnNpZ25lZCkoKHJhbmQoKSogMTAwMExMKS9SQU5EX01BWCkgKyAxNTU1MDsKICAgICBzdGFydCAmPSB+MTsKIAotICAgIGZvciAodW5zaWduZWQgcG9ydCA9IHN0YXJ0OyBwb3J0IDwgNjU1MzY7IHBvcnQgKz0gMikgeworICAgIGZvciAodW5zaWduZWQgcG9ydCA9IHN0YXJ0OyBwb3J0IDwgNjU1MzU7IHBvcnQgKz0gMikgewogICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKICAgICAgICAgbWVtc2V0KGFkZHIuc2luX3plcm8sIDAsIHNpemVvZihhZGRyLnNpbl96ZXJvKSk7CiAgICAgICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC0xMzksMTIgKzE1NCwxMzAgQEAKICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IDApIHsKICAgICAgICAgICAgICpydHBQb3J0ID0gcG9ydDsKICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdlIHNob3VsZCByZWNyZWF0ZSBhIFJUUCBzb2NrZXQgdG8gYXZvaWQgYmluZCBvdGhlciBwb3J0IGluIHNhbWUgUlRQIHNvY2tldAorICAgICAgICAgICAgY2xvc2UoKnJ0cFNvY2tldCk7CisKKyAgICAgICAgICAgICpydHBTb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgICAgICAgICBDSEVDS19HRSgqcnRwU29ja2V0LCAwKTsKKyAgICAgICAgICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydHBTb2NrZXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgVFJFU1BBU1MoKTsKIH0KIAorLy8gc3RhdGljCit2b2lkIEFSVFBDb25uZWN0aW9uOjpNYWtlUlRQU29ja2V0UGFpcigKKyAgICAgICAgaW50ICpydHBTb2NrZXQsIGludCAqcnRjcFNvY2tldCwgY29uc3QgY2hhciAqbG9jYWxJcCwgY29uc3QgY2hhciAqcmVtb3RlSXAsCisgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgdW5zaWduZWQgcmVtb3RlUG9ydCwgaW50NjRfdCBzb2NrZXROZXR3b3JrKSB7CisgICAgYm9vbCBpc0lQdjYgPSBmYWxzZTsKKyAgICBpZiAoc3RyY2hyKGxvY2FsSXAsICc6JykgIT0gTlVMTCkKKyAgICAgICAgaXNJUHY2ID0gdHJ1ZTsKKworICAgICpydHBTb2NrZXQgPSBzb2NrZXQoaXNJUHY2ID8gQUZfSU5FVDYgOiBBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRSgqcnRwU29ja2V0LCAwKTsKKworICAgIGJ1bXBTb2NrZXRCdWZmZXJTaXplKCpydHBTb2NrZXQpOworCisgICAgKnJ0Y3BTb2NrZXQgPSBzb2NrZXQoaXNJUHY2ID8gQUZfSU5FVDYgOiBBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBDSEVDS19HRSgqcnRjcFNvY2tldCwgMCk7CisKKyAgICBpZiAoc29ja2V0TmV0d29yayAhPSAwKSB7CisgICAgICAgIEFMT0dEKCJ0cnlpbmcgdG8gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpLiIsCisgICAgICAgICAgICAgICAgKnJ0cFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzb2NrZXROZXR3b3JrKTsKKworICAgICAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yaygobmV0X2hhbmRsZV90KXNvY2tldE5ldHdvcmssICpydHBTb2NrZXQpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQoJWQpIHRvIGJpbmQgcnRwIHNvY2tldCglZCkgdG8gbmV0d29yayglbGx1KSIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgKnJ0cFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZylzb2NrZXROZXR3b3JrKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBhbmRyb2lkX3NldHNvY2tuZXR3b3JrKChuZXRfaGFuZGxlX3Qpc29ja2V0TmV0d29yaywgKnJ0Y3BTb2NrZXQpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQoJWQpIHRvIGJpbmQgcnRjcCBzb2NrZXQoJWQpIHRvIG5ldHdvcmsoJWxsdSkiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQsICpydGNwU29ja2V0LCAodW5zaWduZWQgbG9uZyBsb25nKXNvY2tldE5ldHdvcmspOworICAgICAgICB9CisgICAgfQorCisgICAgYnVtcFNvY2tldEJ1ZmZlclNpemUoKnJ0Y3BTb2NrZXQpOworCisgICAgc3RydWN0IHNvY2thZGRyICphZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyNDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI2OworCisgICAgaWYgKGlzSVB2NikgeworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyNjsKKyAgICAgICAgbWVtc2V0KCZhZGRyNiwgMCwgc2l6ZW9mKGFkZHI2KSk7CisgICAgICAgIGFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGluZXRfcHRvbihBRl9JTkVUNiwgbG9jYWxJcCwgJmFkZHI2LnNpbjZfYWRkcik7CisgICAgICAgIGFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdClsb2NhbFBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmFkZHI0OworICAgICAgICBtZW1zZXQoJmFkZHI0LCAwLCBzaXplb2YoYWRkcjQpKTsKKyAgICAgICAgYWRkcjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGFkZHI0LnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihsb2NhbElwKTsKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpbG9jYWxQb3J0KTsKKyAgICB9CisKKyAgICBpbnQgc29ja29wdCA9IDE7CisgICAgc2V0c29ja29wdCgqcnRwU29ja2V0LCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChpbnQgKikmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKyAgICBzZXRzb2Nrb3B0KCpydGNwU29ja2V0LCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChpbnQgKikmc29ja29wdCwgc2l6ZW9mKHNvY2tvcHQpKTsKKworICAgIGludCBzaXplU29ja1N0ID0gaXNJUHY2ID8gc2l6ZW9mKGFkZHI2KSA6IHNpemVvZihhZGRyNCk7CisKKyAgICBpZiAoYmluZCgqcnRwU29ja2V0LCBhZGRyLCBzaXplU29ja1N0KSA9PSAwKSB7CisgICAgICAgIEFMT0dJKCJydHAgc29ja2V0IHN1Y2Nlc3NmdWxseSBiaW5kZWQuIGFkZHI9JXM6JWQiLCBsb2NhbElwLCBsb2NhbFBvcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYmluZCBydHAgc29ja2V0IGFkZHI9JXM6JWQgZXJyPSVzIiwgbG9jYWxJcCwgbG9jYWxQb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzSVB2NikKKyAgICAgICAgYWRkcjYuc2luNl9wb3J0ID0gaHRvbnMobG9jYWxQb3J0ICsgMSk7CisgICAgZWxzZQorICAgICAgICBhZGRyNC5zaW5fcG9ydCA9IGh0b25zKGxvY2FsUG9ydCArIDEpOworCisgICAgaWYgKGJpbmQoKnJ0Y3BTb2NrZXQsIGFkZHIsIHNpemVTb2NrU3QpID09IDApIHsKKyAgICAgICAgQUxPR0koInJ0Y3Agc29ja2V0IHN1Y2Nlc3NmdWxseSBiaW5kZWQuIGFkZHI9JXM6JWQiLCBsb2NhbElwLCBsb2NhbFBvcnQgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGJpbmQgcnRjcCBzb2NrZXQgYWRkcj0lczolZCBlcnI9JXMiLCBsb2NhbElwLAorICAgICAgICAgICAgICAgIGxvY2FsUG9ydCArIDEsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLy8gUmUgdXNlcyBhZGRyIHZhcmlhYmxlIGFzIHJlbW90ZSBhZGRyLgorICAgIGlmIChpc0lQdjYpIHsKKyAgICAgICAgbWVtc2V0KCZhZGRyNiwgMCwgc2l6ZW9mKGFkZHI2KSk7CisgICAgICAgIGFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGluZXRfcHRvbihBRl9JTkVUNiwgcmVtb3RlSXAsICZhZGRyNi5zaW42X2FkZHIpOworICAgICAgICBhZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpcmVtb3RlUG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KCZhZGRyNCwgMCwgc2l6ZW9mKGFkZHI0KSk7CisgICAgICAgIGFkZHI0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBhZGRyNC5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIocmVtb3RlSXApOworICAgICAgICBhZGRyNC5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClyZW1vdGVQb3J0KTsKKyAgICB9CisgICAgaWYgKGNvbm5lY3QoKnJ0cFNvY2tldCwgYWRkciwgc2l6ZVNvY2tTdCkgPT0gMCkgeworICAgICAgICBBTE9HSSgicnRwIHNvY2tldCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHJlbW90ZT0lczolZCIsIHJlbW90ZUlwLCByZW1vdGVQb3J0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGNvbm5lY3QgcnRwIHNvY2tldCB0byByZW1vdGUgYWRkcj0lczolZCBlcnI9JXMiLCByZW1vdGVJcCwKKyAgICAgICAgICAgICAgICByZW1vdGVQb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlzSVB2NikKKyAgICAgICAgYWRkcjYuc2luNl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCArIDEpOworICAgIGVsc2UKKyAgICAgICAgYWRkcjQuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0ICsgMSk7CisKKyAgICBpZiAoY29ubmVjdCgqcnRjcFNvY2tldCwgYWRkciwgc2l6ZVNvY2tTdCkgPT0gMCkgeworICAgICAgICBBTE9HSSgicnRjcCBzb2NrZXQgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byByZW1vdGU9JXM6JWQiLCByZW1vdGVJcCwgcmVtb3RlUG9ydCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY29ubmVjdCBydGNwIHNvY2tldCBhZGRyPSVzOiVkIGVycj0lcyIsIHJlbW90ZUlwLAorICAgICAgICAgICAgICAgIHJlbW90ZVBvcnQgKyAxLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCiB2b2lkIEFSVFBDb25uZWN0aW9uOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdEFkZFN0cmVhbToKQEAgLTE1Myw2ICsyODYsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNlZWtTdHJlYW06CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2Vla1N0cmVhbShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UmVtb3ZlU3RyZWFtOgogICAgICAgICB7CiAgICAgICAgICAgICBvblJlbW92ZVN0cmVhbShtc2cpOwpAQCAtMTY1LDYgKzMwNCwxMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0QWxhcm1TdHJlYW06CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uQWxhcm1TdHJlYW0obXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBrV2hhdEluamVjdFBhY2tldDoKICAgICAgICAgewogICAgICAgICAgICAgb25JbmplY3RQYWNrZXQobXNnKTsKQEAgLTIwNCwxMiArMzQ5LDM3IEBACiAgICAgaW5mby0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIGluZm8tPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQgPSAwOwogICAgIG1lbXNldCgmaW5mby0+bVJlbW90ZVJUQ1BBZGRyLCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyKSk7CisgICAgbWVtc2V0KCZpbmZvLT5tUmVtb3RlUlRDUEFkZHI2LCAwLCBzaXplb2YoaW5mby0+bVJlbW90ZVJUQ1BBZGRyNikpOworCisgICAgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gc2Vzc2lvbkRlc2MgPSBpbmZvLT5tU2Vzc2lvbkRlc2M7CisgICAgaW5mby0+bUNWT0V4dE1hcCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzZXNzaW9uRGVzYy0+Y291bnRUcmFja3MoKTsgKytpKSB7CisgICAgICAgIGludDMyX3QgY3ZvRXh0TWFwOworICAgICAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldEN2b0V4dE1hcChpLCAmY3ZvRXh0TWFwKSkgeworICAgICAgICAgICAgaW5mby0+bUNWT0V4dE1hcCA9IGN2b0V4dE1hcDsKKyAgICAgICAgICAgIEFMT0dJKCJ1cm46M2dwcDp2aWRlby1vcmllbnRhdGlvbihjdm8pIGZvdW5kIGFzIGV4dG1hcDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0koInVybjozZ3BwOnZpZGVvLW9yaWVudGF0aW9uKGN2bykgbm90IGZvdW5kIDolZCIsIGluZm8tPm1DVk9FeHRNYXApOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKCFpbmplY3RlZCkgewogICAgICAgICBwb3N0UG9sbEV2ZW50KCk7CiAgICAgfQogfQogCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvblNlZWtTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAodm9pZCltc2c7IC8vIHVudXNlZCBwYXJhbSBhcyBvZiBub3cuCisgICAgTGlzdDxTdHJlYW1JbmZvPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtcy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0LT5tU291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8QVJUUFNvdXJjZT4gc291cmNlID0gaXQtPm1Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBzb3VyY2UtPnRpbWVSZXNldCgpOworICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorfQorCiB2b2lkIEFSVFBDb25uZWN0aW9uOjpvblJlbW92ZVN0cmVhbShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDMyX3QgcnRwU29ja2V0LCBydGNwU29ja2V0OwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJydHAtc29ja2V0IiwgJnJ0cFNvY2tldCkpOwpAQCAtMjc1LDYgKzQ0NSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQgcmVzID0gc2VsZWN0KG1heFNvY2tldCArIDEsICZycywgTlVMTCwgTlVMTCwgJnR2KTsKIAogICAgIGlmIChyZXMgPiAwKSB7CkBAIC0yODQsNiArNDU1LDcgQEAKICAgICAgICAgICAgICAgICArK2l0OwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaXQtPm1MYXN0UG9sbFRpbWVVcyA9IG5vd1VzOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICAgICAgICAgIGlmIChGRF9JU1NFVChpdC0+bVJUUFNvY2tldCwgJnJzKSkgewpAQCAtMjk1LDE3ICs0NjcsNTggQEAKIAogICAgICAgICAgICAgaWYgKGVyciA9PSAtRUNPTk5SRVNFVCkgewogICAgICAgICAgICAgICAgIC8vIHNvY2tldCBmYWlsdXJlLCB0aGlzIHN0cmVhbSBpcyBkZWFkLCBKaW0uCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdC0+bVNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGl0LT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCA0MDApOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgMSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlbmRlciIsIGl0LT5tU291cmNlcy52YWx1ZUF0KGkpLT5nZXRTZWxmSUQoKSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogCi0gICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byByZWNlaXZlIFJUUC9SVENQIGRhdGFncmFtLiIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlY2VpdmUgUlRQL1JUQ1AgZGF0YWdyYW0uIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBhZGQgTkFDSyBhbmQgRklSIHRoYXQgbmVlZHMgdG8gYmUgc2VudCBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhVRFBTaXplKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXQtPm1Tb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgY250ID0gaXQtPm1Tb3VyY2VzLnZhbHVlQXQoaSktPmFkZE5BQ0soYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoY250ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2VuZCBOQUNLIGZvciBsb3N0ICVkIFBhY2tldHMiLCBjbnQpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpdC0+bVNvdXJjZXMudmFsdWVBdChpKS0+YWRkRklSKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiU2VuZCBGSVIgaW1tZWRpYXRlbHkgZm9yIGxvc3QgUGFja2V0cyIpOworICAgICAgICAgICAgICAgICAgICBzZW5kKCYqaXQsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBpdC0+bVNvdXJjZXMudmFsdWVBdChpKS0+YWRkVE1NQlIoYnVmZmVyLCBtVGFyZ2V0Qml0cmF0ZSk7CisgICAgICAgICAgICAgICAgbVRhcmdldEJpdHJhdGUgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTZW5kaW5nIFRNTUJSLi4uIik7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbiA9IHNlbmQoJippdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAoc3NpemVfdClidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBzZW5kIFJUQ1AgVE1NQlIgKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID49IDAgPyAiY29ubmVjdGlvbiBnb25lIiA6IHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgKytpdDsKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGNoZWNrUnhCaXRyYXRlKG5vd1VzKTsKKwogICAgIGlmIChtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzIDw9IDAKICAgICAgICAgICAgIHx8IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgKyA1MDAwMDAwTEwgPD0gbm93VXMpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOwpAQCAtMzQwLDI0ICs1NTMsMTQgQEAKICAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVigiU2VuZGluZyBSUi4uLiIpOwogCi0gICAgICAgICAgICAgICAgc3NpemVfdCBuOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgbiA9IHNlbmR0bygKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1SVENQU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnMtPm1SZW1vdGVSVENQQWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5tUmVtb3RlUlRDUEFkZHIpKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgICAgICAgICAgc3NpemVfdCBuID0gc2VuZChzLCBidWZmZXIpOwogCi0gICAgICAgICAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgICAgIGlmIChuICE9IChzc2l6ZV90KWJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gc2VuZCBSVENQIHJlY2VpdmVyIHJlcG9ydCAoJXMpLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbiA9PSAwID8gImNvbm5lY3Rpb24gZ29uZSIgOiBzdHJlcnJvcihlcnJubykpOwotCi0gICAgICAgICAgICAgICAgICAgIGl0ID0gbVN0cmVhbXMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPj0gMCA/ICJjb25uZWN0aW9uIGdvbmUiIDogc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobiwgKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpOwotCiAgICAgICAgICAgICAgICAgbUxhc3RSZWNlaXZlclJlcG9ydFRpbWVVcyA9IG5vd1VzOwogICAgICAgICAgICAgfQogCkBAIC0zNzAsNiArNTczLDEzIEBACiAgICAgfQogfQogCit2b2lkIEFSVFBDb25uZWN0aW9uOjpvbkFsYXJtU3RyZWFtKGNvbnN0IHNwPEFNZXNzYWdlPiBtc2cpIHsKKyAgICBzcDxBUlRQU291cmNlPiBzb3VyY2UgPSBudWxscHRyOworICAgIGlmIChtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsIChzcDxhbmRyb2lkOjpSZWZCYXNlPiopJnNvdXJjZSkpIHsKKyAgICAgICAgc291cmNlLT5wcm9jZXNzUlRQUGFja2V0KCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cmVjZWl2ZShTdHJlYW1JbmZvICpzLCBib29sIHJlY2VpdmVSVFApIHsKICAgICBBTE9HVigicmVjZWl2aW5nICVzIiwgcmVjZWl2ZVJUUCA/ICJSVFAiIDogIlJUQ1AiKTsKIApAQCAtMzc3LDkgKzU4NywyMiBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoNjU1MzYpOwogCisgICAgc3RydWN0IHNvY2thZGRyICpwUmVtb3RlUlRDUEFkZHI7CisgICAgaW50IHNpemVTb2NrU3Q7CisgICAgaWYgKHMtPmlzSVB2NikgeworICAgICAgICBwUmVtb3RlUlRDUEFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnMtPm1SZW1vdGVSVENQQWRkcjY7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5tUmVtb3RlUlRDUEFkZHI7CisgICAgICAgIHNpemVTb2NrU3QgPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICB9CiAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPQogICAgICAgICAoIXJlY2VpdmVSVFAgJiYgcy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPT0gMCkKLSAgICAgICAgICAgID8gc2l6ZW9mKHMtPm1SZW1vdGVSVENQQWRkcikgOiAwOworICAgICAgICAgICAgPyBzaXplU29ja1N0IDogMDsKKworICAgIGlmIChtRmxhZ3MgJiBrVmlMVEVDb25uZWN0aW9uKSB7CisgICAgICAgIHJlbW90ZUFkZHJMZW4gPSAwOworICAgIH0KIAogICAgIHNzaXplX3QgbmJ5dGVzOwogICAgIGRvIHsKQEAgLTM4OCwxMiArNjExLDIwIEBACiAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwKICAgICAgICAgICAgIGJ1ZmZlci0+Y2FwYWNpdHkoKSwKICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICByZW1vdGVBZGRyTGVuID4gMCA/IChzdHJ1Y3Qgc29ja2FkZHIgKikmcy0+bVJlbW90ZVJUQ1BBZGRyIDogTlVMTCwKKyAgICAgICAgICAgIHJlbW90ZUFkZHJMZW4gPiAwID8gcFJlbW90ZVJUQ1BBZGRyIDogTlVMTCwKICAgICAgICAgICAgIHJlbW90ZUFkZHJMZW4gPiAwID8gJnJlbW90ZUFkZHJMZW4gOiBOVUxMKTsKKyAgICAgICAgbUN1bXVsYXRpdmVCeXRlcyArPSBuYnl0ZXM7CiAgICAgfSB3aGlsZSAobmJ5dGVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CiAKICAgICBpZiAobmJ5dGVzIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIC1FQ09OTlJFU0VUOworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHJlY3YgcnRwIHBhY2tldC4gY2F1c2U9JXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAvLyBFQ09OTlJFRlVTRUQgbWF5IGhhcHBlbiBpbiBuZXh0IHJlY3Zmcm9tKCkgY2FsbGluZyBpZiBvbmUgb2YKKyAgICAgICAgLy8gb3V0Z29pbmcgcGFja2V0IGNhbiBub3QgYmUgZGVsaXZlcmVkIHRvIHJlbW90ZSBieSB1c2luZyBzZW5kdG8oKQorICAgICAgICBpZiAoZXJybm8gPT0gRUNPTk5SRUZVU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gLUVDT05OUkVGVVNFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtRUNPTk5SRVNFVDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgbmJ5dGVzKTsKQEAgLTQxMCwxMyArNjQxLDQxIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUlRQKFN0cmVhbUluZm8gKnMsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBpZiAocy0+bU51bVJUUFBhY2tldHNSZWNlaXZlZCsrID09IDApIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJmaXJzdC1ydHAiLCB0cnVlKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQorc3NpemVfdCBBUlRQQ29ubmVjdGlvbjo6c2VuZChjb25zdCBTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIpIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyKiBwUmVtb3RlUlRDUEFkZHI7CisgICAgICAgIGludCBzaXplU29ja1N0OwogCisgICAgICAgIC8qIEl0IHNlZW1zIHRoaXMgaXNJUHY2IHZhcmlhYmxlIGlzIHVzZWxlc3MuCisgICAgICAgICAqIFdlIHNob3VsZCByZW1vdmUgaXQgdG8gcHJldmVudCBjb25mdXNpb24gKi8KKyAgICAgICAgaWYgKGluZm8tPmlzSVB2NikgeworICAgICAgICAgICAgcFJlbW90ZVJUQ1BBZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZpbmZvLT5tUmVtb3RlUlRDUEFkZHI2OworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBSZW1vdGVSVENQQWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmaW5mby0+bVJlbW90ZVJUQ1BBZGRyOworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GbGFncyAmIGtWaUxURUNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIEFMT0dWKCJWaUxURSBSVENQIik7CisgICAgICAgICAgICBwUmVtb3RlUlRDUEFkZHIgPSBOVUxMOworICAgICAgICAgICAgc2l6ZVNvY2tTdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IG47CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIG4gPSBzZW5kdG8oCisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1SVENQU29ja2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsCisgICAgICAgICAgICAgICAgICAgIHBSZW1vdGVSVENQQWRkciwgc2l6ZVNvY2tTdCk7CisgICAgICAgIH0gd2hpbGUgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gc2VuZCBydGNwIHBhY2tldC4gY2F1c2U9JXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG47Cit9CisKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVJUUChTdHJlYW1JbmZvICpzLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnNpemUoKTsKIAogICAgIGlmIChzaXplIDwgMTIpIHsKQEAgLTQzMSw2ICs2OTAsMTEgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIGlmICgoZGF0YVsxXSAmIDB4N2YpID09IDIwIC8qIGRlY2ltYWwgKi8pIHsKKyAgICAgICAgLy8gVW5hc3NpZ25lZCBwYXlsb2FkIHR5cGUKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGlmIChkYXRhWzBdICYgMHgyMCkgewogICAgICAgICAvLyBQYWRkaW5nIHByZXNlbnQuCiAKQEAgLTQ1NCw2ICs3MTgsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgaW50MzJfdCBjdm9EZWdyZWVzID0gLTE7CiAgICAgaWYgKGRhdGFbMF0gJiAweDEwKSB7CiAgICAgICAgIC8vIEhlYWRlciBlWHRlbnNpb24gcHJlc2VudC4KIApAQCAtNDY3LDEzICs3MzIsMTQgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqZXh0ZW5zaW9uRGF0YSA9ICZkYXRhW3BheWxvYWRPZmZzZXRdOwogCiAgICAgICAgIHNpemVfdCBleHRlbnNpb25MZW5ndGggPQotICAgICAgICAgICAgNCAqIChleHRlbnNpb25EYXRhWzJdIDw8IDggfCBleHRlbnNpb25EYXRhWzNdKTsKKyAgICAgICAgICAgICg0ICogKGV4dGVuc2lvbkRhdGFbMl0gPDwgOCB8IGV4dGVuc2lvbkRhdGFbM10pKSArIDQ7CiAKLSAgICAgICAgaWYgKHNpemUgPCBwYXlsb2FkT2Zmc2V0ICsgNCArIGV4dGVuc2lvbkxlbmd0aCkgeworICAgICAgICBpZiAoc2l6ZSA8IHBheWxvYWRPZmZzZXQgKyBleHRlbnNpb25MZW5ndGgpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIHBheWxvYWRPZmZzZXQgKz0gNCArIGV4dGVuc2lvbkxlbmd0aDsKKyAgICAgICAgcGFyc2VSVFBFeHQocywgKGNvbnN0IHVpbnQ4X3QgKilleHRlbnNpb25EYXRhLCBleHRlbnNpb25MZW5ndGgsICZjdm9EZWdyZWVzKTsKKyAgICAgICAgcGF5bG9hZE9mZnNldCArPSBleHRlbnNpb25MZW5ndGg7CiAgICAgfQogCiAgICAgdWludDMyX3Qgc3JjSWQgPSB1MzJhdCgmZGF0YVs4XSk7CkBAIC00ODcsMjAgKzc1Myw4OSBAQAogICAgIG1ldGEtPnNldEludDMyKCJydHAtdGltZSIsIHJ0cFRpbWUpOwogICAgIG1ldGEtPnNldEludDMyKCJQVCIsIGRhdGFbMV0gJiAweDdmKTsKICAgICBtZXRhLT5zZXRJbnQzMigiTSIsIGRhdGFbMV0gPj4gNyk7CisgICAgaWYgKGN2b0RlZ3JlZXMgPj0gMCkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMigiY3ZvIiwgY3ZvRGVncmVlcyk7CisgICAgfQogCi0gICAgYnVmZmVyLT5zZXRJbnQzMkRhdGEodTE2YXQoJmRhdGFbMl0pKTsKKyAgICBpbnQzMl90IHNlcSA9IHUxNmF0KCZkYXRhWzJdKTsKKyAgICBidWZmZXItPnNldEludDMyRGF0YShzZXEpOwogICAgIGJ1ZmZlci0+c2V0UmFuZ2UocGF5bG9hZE9mZnNldCwgc2l6ZSAtIHBheWxvYWRPZmZzZXQpOwogCisgICAgaWYgKHMtPm1OdW1SVFBQYWNrZXRzUmVjZWl2ZWQrKyA9PSAwKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmlyc3QtcnRwIiwgdHJ1ZSk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgQVJUUFNvdXJjZTo6UlRQX0ZJUlNUX1BBQ0tFVCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QpcnRwVGltZSk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0cC1zZXEtbnVtIiwgc2VxKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgIEFMT0dEKCJzZW5kIGZpcnN0LXJ0cCBldmVudCB0byB1cHBlciBsYXllciIpOworICAgIH0KKwogICAgIHNvdXJjZS0+cHJvY2Vzc1JUUFBhY2tldChidWZmZXIpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVFBFeHQoU3RyZWFtSW5mbyAqcywKKyAgICAgICAgY29uc3QgdWludDhfdCAqZXh0SGVhZGVyLCBzaXplX3QgZXh0TGVuLCBpbnQzMl90ICpjdm9EZWdyZWVzKSB7CisgICAgaWYgKGV4dExlbiA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHVpbnQxNl90IGhlYWRlciA9IChleHRIZWFkZXJbMF0gPDwgOCkgfCAoZXh0SGVhZGVyWzFdKTsKKyAgICBib29sIGlzT25lYnl0ZUhlYWRlciA9IGZhbHNlOworCisgICAgaWYgKGhlYWRlciA9PSAweEJFREUpIHsKKyAgICAgICAgaXNPbmVieXRlSGVhZGVyID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGhlYWRlciA9PSAweDEwMDApIHsKKyAgICAgICAgQUxPR1coInBhcnNlUlRQRXh0OiB0d28tYnl0ZSBoZWFkZXIgaXMgbm90IGltcGxlbWVudGVkIHlldCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInBhcnNlUlRQRXh0OiBjYW4gbm90IHJlY29nbml6ZSBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmV4dFBheWxvYWQgPSBleHRIZWFkZXIgKyA0OworICAgIGV4dExlbiAtPSA0OworICAgIHNpemVfdCBvZmZzZXQgPSAwOyAvL3N0YXJ0IGZyb20gZmlyc3QgcGF5bG9hZCBvZiBydHAgZXh0ZW5zaW9uLgorICAgIC8vIG9uZS1ieXRlIGhlYWRlciBwYXJzZXIKKyAgICB3aGlsZSAoaXNPbmVieXRlSGVhZGVyICYmIG9mZnNldCA8IGV4dExlbikgeworICAgICAgICB1aW50OF90IGV4dG1hcElkID0gZXh0UGF5bG9hZFtvZmZzZXRdID4+IDQ7CisgICAgICAgIHVpbnQ4X3QgbGVuZ3RoID0gKGV4dFBheWxvYWRbb2Zmc2V0XSAmIDB4RikgKyAxOworICAgICAgICBvZmZzZXQrKzsKKworICAgICAgICAvLyBwYWRkaW5nIGNhc2UKKyAgICAgICAgaWYgKGV4dG1hcElkID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB1aW50OF90IGRhdGFbMTZdOyAvLyBtYXhpbXVtIGxlbmd0aCB2YWx1ZQorICAgICAgICBmb3IgKHVpbnQ4X3QgaiA9IDA7IG9mZnNldCArIGogPD0gZXh0TGVuICYmIGogPCBsZW5ndGg7IGorKykgeworICAgICAgICAgICAgZGF0YVtqXSA9IGV4dFBheWxvYWRbb2Zmc2V0ICsgal07CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gbGVuZ3RoOworCisgICAgICAgIGlmIChleHRtYXBJZCA9PSBzLT5tQ1ZPRXh0TWFwKSB7CisgICAgICAgICAgICAqY3ZvRGVncmVlcyA9IChpbnQzMl90KWRhdGFbMF07CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCiBzdGF0dXNfdCBBUlRQQ29ubmVjdGlvbjo6cGFyc2VSVENQKFN0cmVhbUluZm8gKnMsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBpZiAocy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQrKyA9PSAwKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmlyc3QtcnRjcCIsIHRydWUpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIEFSVFBTb3VyY2U6OlJUQ1BfRklSU1RfUEFDS0VUKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgicmVjdi10aW1lLXVzIiwgQUxvb3Blcjo6R2V0Tm93VXMoKSk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgICAgIEFMT0dEKCJzZW5kIGZpcnN0LXJ0Y3AgZXZlbnQgdG8gdXBwZXIgbGF5ZXIiKTsKICAgICB9CiAKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CkBAIC01NTEsOCArODg2LDEyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgMjA1OiAgLy8gVFNGQiAodHJhbnNwb3J0IGxheWVyIHNwZWNpZmljIGZlZWRiYWNrKQorICAgICAgICAgICAgICAgIHBhcnNlVFNGQihzLCBkYXRhLCBoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyMDY6ICAvLyBQU0ZCIChwYXlsb2FkIHNwZWNpZmljIGZlZWRiYWNrKQogICAgICAgICAgICAgICAgIC8vIGhleGR1bXAoZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYXJzZVBTRkIocywgZGF0YSwgaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiUlRDUCBwYWNrZXQgdHlwZSAldSBvZiBzaXplICV6dSIsICh1bnNpZ25lZClkYXRhWzFdLCBoZWFkZXJMZW5ndGgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIDIwMzoKQEAgLTU4OSw2ICs5MjgsMTIgQEAKIAogICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IGZpbmRTb3VyY2UocywgaWQpOwogCisgICAgLy8gUmVwb3J0IGEgZmluYWwgc3Rhc3RpY3MgdG8gYmUgdXNlZCBmb3IgcnRwIGRhdGEgdXNhZ2UuCisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50MzJfdCB0aW1lRGlmZiA9IChub3dVcyAtIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcykgLyAxMDAwMDAwbGw7CisgICAgaW50MzJfdCBiaXRyYXRlID0gbUN1bXVsYXRpdmVCeXRlcyAqIDggLyB0aW1lRGlmZjsKKyAgICBzb3VyY2UtPm5vdGlmeVBrdEluZm8oYml0cmF0ZSwgbm93VXMsIHRydWUgLyogaXNSZWd1bGFyICovKTsKKwogICAgIHNvdXJjZS0+YnllUmVjZWl2ZWQoKTsKIAogICAgIHJldHVybiBPSzsKQEAgLTYyMSw2ICs5NjYsMTQ0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXR1c190IEFSVFBDb25uZWN0aW9uOjpwYXJzZVRTRkIoCisgICAgICAgIFN0cmVhbUluZm8gKnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgICAvLyBicm9rZW4gcGFja2V0CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50OF90IG1zZ1R5cGUgPSBkYXRhWzBdICYgMHgxZjsKKyAgICB1aW50MzJfdCBpZCA9IHUzMmF0KCZkYXRhWzRdKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9ICZkYXRhWzEyXTsKKyAgICBzaXplIC09IDEyOworCisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzaXplX3QgRkNJU2l6ZTsKKyAgICBzd2l0Y2gobXNnVHlwZSkgeworICAgICAgICBjYXNlIDE6ICAgICAvLyBHZW5lcmljIE5BQ0sKKyAgICAgICAgeworICAgICAgICAgICAgRkNJU2l6ZSA9IDQ7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSA+PSBGQ0lTaXplKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgUElEID0gdTE2YXQoJnB0clswXSk7ICAvLyBsb3N0IHBhY2tldCBSVFAgbnVtYmVyCisgICAgICAgICAgICAgICAgdWludDE2X3QgQkxQID0gdTE2YXQoJnB0clsyXSk7ICAvLyBCaXRtYXNrIG9mIGZvbGxvd2luZyBMb3N0IFBhY2tldHMKKworICAgICAgICAgICAgICAgIHNpemUgLT0gRkNJU2l6ZTsKKyAgICAgICAgICAgICAgICBwdHIgKz0gRkNJU2l6ZTsKKworICAgICAgICAgICAgICAgIEFTdHJpbmcgbGlzdF9vZl9sb3N0czsKKyAgICAgICAgICAgICAgICBsaXN0X29mX2xvc3RzLmFwcGVuZChQSUQpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTYgOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19sb3N0ID0gQkxQICYgKDB4MSA8PCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rfb2ZfbG9zdHMuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9vZl9sb3N0cy5hcHBlbmQoUElEICsgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR0koIk9wcG9uZW50IGxvc3RzIHBhY2tldCBvZiBSVFAgJXMiLCBsaXN0X29mX2xvc3RzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAzOiAgICAgLy8gVE1NQlIKKyAgICAgICAgY2FzZSA0OiAgICAgLy8gVE1NQk4KKyAgICAgICAgeworICAgICAgICAgICAgRkNJU2l6ZSA9IDg7CisgICAgICAgICAgICB3aGlsZSAoc2l6ZSA+PSBGQ0lTaXplKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgTXhUQlIgPSB1MzJhdCgmcHRyWzRdKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBNeFRCUkV4cCA9IE14VEJSID4+IDI2OworICAgICAgICAgICAgICAgIHVpbnQzMl90IE14VEJSTWFudGlzc2EgPSAoTXhUQlIgPj4gOSkgJiAweDAxRkZGRjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBvdmVyaGVhZCA9IE14VEJSICYgMHgwMUZGOworCisgICAgICAgICAgICAgICAgc2l6ZSAtPSBGQ0lTaXplOworICAgICAgICAgICAgICAgIHB0ciArPSBGQ0lTaXplOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgYml0UmF0ZSA9ICgxIDw8IE14VEJSRXhwKSAqIE14VEJSTWFudGlzc2E7CisKKyAgICAgICAgICAgICAgICBpZiAobXNnVHlwZSA9PSAzKQorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiT3AgLT4gVUUgUmVxIFR4IGJpdHJhdGUgOiAlZCBYIDJeJWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBNeFRCUk1hbnRpc3NhLCBNeFRCUkV4cCwgYml0UmF0ZSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobXNnVHlwZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiT1AgLT4gVUUgTm90aSBSeCBiaXRyYXRlIDogJWQgWCAyXiVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgTXhUQlJNYW50aXNzYSwgTXhUQlJFeHAsIGJpdFJhdGUpOworCisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IHMtPm1Ob3RpZnlNc2ctPmR1cCgpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCAyMDUpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImZlZWRiYWNrLXR5cGUiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZW5kZXIiLCBpZCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiYml0LXJhdGUiLCBiaXRSYXRlKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgib3ZlcmhlYWQgOiAlZCIsIG92ZXJoZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dJKCJOb3Qgc3VwcG9ydGVkIFRTRkIgdHlwZSAlZCIsIG1zZ1R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgQVJUUENvbm5lY3Rpb246OnBhcnNlUFNGQigKKyAgICAgICAgU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEyKSB7CisgICAgICAgIC8vIGJyb2tlbiBwYWNrZXQKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQ4X3QgbXNnVHlwZSA9IGRhdGFbMF0gJiAweDFmOworICAgIHVpbnQzMl90IGlkID0gdTMyYXQoJmRhdGFbNF0pOworCisgICAgY29uc3QgdWludDhfdCAqcHRyID0gJmRhdGFbMTJdOworICAgIHNpemUgLT0gMTI7CisKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIHN3aXRjaChtc2dUeXBlKSB7CisgICAgICAgIGNhc2UgMTogICAgIC8vIFBpY3R1cmUgTG9zcyBJbmRpY2F0aW9uIChQTEkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIC8vIFBMSSBkb2VzIG5vdCBuZWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gcy0+bU5vdGlmeU1zZy0+ZHVwKCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCAyMDYpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZmVlZGJhY2stdHlwZSIsIG1zZ1R5cGUpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2VuZGVyIiwgaWQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBBTE9HSSgiUExJIGRldGVjdGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSA0OiAgICAgLy8gRnVsbCBJbnRyYSBSZXF1ZXN0IChGSVIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgNCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcmVxdWVzdGVkSWQgPSB1MzJhdCgmcHRyWzBdKTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRJZCA9PSAodWludDMyX3QpbVNlbGZJRCkgeworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBzLT5tTm90aWZ5TXNnLT5kdXAoKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJydGNwLWV2ZW50IiwgMSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGF5bG9hZC10eXBlIiwgMjA2KTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgbXNnVHlwZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2VuZGVyIiwgaWQpOworICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJGSVIgZGV0ZWN0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HSSgiTm90IHN1cHBvcnRlZCBQU0ZCIHR5cGUgJWQiLCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CiBzcDxBUlRQU291cmNlPiBBUlRQQ29ubmVjdGlvbjo6ZmluZFNvdXJjZShTdHJlYW1JbmZvICppbmZvLCB1aW50MzJfdCBzcmNJZCkgewogICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZTsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5mby0+bVNvdXJjZXMuaW5kZXhPZktleShzcmNJZCk7CkBAIC02MzAsNiArMTExMywxNSBAQAogICAgICAgICBzb3VyY2UgPSBuZXcgQVJUUFNvdXJjZSgKICAgICAgICAgICAgICAgICBzcmNJZCwgaW5mby0+bVNlc3Npb25EZXNjLCBpbmZvLT5tSW5kZXgsIGluZm8tPm1Ob3RpZnlNc2cpOwogCisgICAgICAgIGlmIChtRmxhZ3MgJiBrVmlMVEVDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBzZXRTdGF0aWNKaXR0ZXJUaW1lTXMoNTApOworICAgICAgICAgICAgc291cmNlLT5zZXRQZXJpb2RpY0ZJUihmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBzb3VyY2UtPnNldFNlbGZJRChtU2VsZklEKTsKKyAgICAgICAgc291cmNlLT5zZXRTdGF0aWNKaXR0ZXJUaW1lTXMobVN0YXRpY0ppdHRlclRpbWVNcyk7CisgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lciA9IG5ldyBBTWVzc2FnZShrV2hhdEFsYXJtU3RyZWFtLCB0aGlzKTsKKyAgICAgICAgc291cmNlLT5zZXRKYlRpbWVyKHRpbWVyKTsKICAgICAgICAgaW5mby0+bVNvdXJjZXMuYWRkKHNyY0lkLCBzb3VyY2UpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNvdXJjZSA9IGluZm8tPm1Tb3VyY2VzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNjQ1LDYgKzExMzcsNzggQEAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAordm9pZCBBUlRQQ29ubmVjdGlvbjo6c2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCkgeworICAgIG1TZWxmSUQgPSBzZWxmSUQ7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OnNldFN0YXRpY0ppdHRlclRpbWVNcyhjb25zdCB1aW50MzJfdCBqYlRpbWVNcykgeworICAgIG1TdGF0aWNKaXR0ZXJUaW1lTXMgPSBqYlRpbWVNczsKK30KKwordm9pZCBBUlRQQ29ubmVjdGlvbjo6c2V0VGFyZ2V0Qml0cmF0ZShpbnQzMl90IHRhcmdldEJpdHJhdGUpIHsKKyAgICBtVGFyZ2V0Qml0cmF0ZSA9IHRhcmdldEJpdHJhdGU7Cit9CisKK3ZvaWQgQVJUUENvbm5lY3Rpb246OmNoZWNrUnhCaXRyYXRlKGludDY0X3Qgbm93VXMpIHsKKyAgICBpZiAobUxhc3RCaXRyYXRlUmVwb3J0VGltZVVzIDw9IDApIHsKKyAgICAgICAgbUN1bXVsYXRpdmVCeXRlcyA9IDA7CisgICAgICAgIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcyA9IG5vd1VzOworICAgIH0KKyAgICBlbHNlIGlmIChtTGFzdEVhcmx5Tm90aWZ5VGltZVVzICsgMTAwMDAwbGwgPD0gbm93VXMpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lRGlmZiA9IChub3dVcyAtIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcykgLyAxMDAwMDAwbGw7CisgICAgICAgIGludDMyX3QgYml0cmF0ZSA9IG1DdW11bGF0aXZlQnl0ZXMgKiA4IC8gdGltZURpZmY7CisgICAgICAgIG1MYXN0RWFybHlOb3RpZnlUaW1lVXMgPSBub3dVczsKKworICAgICAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICAgICAgU3RyZWFtSW5mbyAqcyA9ICYqaXQ7CisgICAgICAgICAgICBpZiAocy0+bUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLT5tU291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IHMtPm1Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+aXNOZWVkVG9FYXJseU5vdGlmeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+bm90aWZ5UGt0SW5mbyhiaXRyYXRlLCBub3dVcywgZmFsc2UgLyogaXNSZWd1bGFyICovKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RFYXJseU5vdGlmeVRpbWVVcyA9IG5vd1VzICsgKDEwMDAwMDBsbCAqIDM2MDAgKiAyNCk7IC8vIGFmdGVyIDEgZGF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXMgKyAxMDAwMDAwbGwgPD0gbm93VXMpIHsKKyAgICAgICAgaW50MzJfdCB0aW1lRGlmZiA9IChub3dVcyAtIG1MYXN0Qml0cmF0ZVJlcG9ydFRpbWVVcykgLyAxMDAwMDAwbGw7CisgICAgICAgIGludDMyX3QgYml0cmF0ZSA9IG1DdW11bGF0aXZlQnl0ZXMgKiA4IC8gdGltZURpZmY7CisgICAgICAgIEFMT0dJKCJBY3R1YWwgUnggYml0cmF0ZSA6ICVkIGJpdHMvc2VjIiwgYml0cmF0ZSk7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOworICAgICAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtcy5lbmQoKSkgeworICAgICAgICAgICAgU3RyZWFtSW5mbyAqcyA9ICYqaXQ7CisgICAgICAgICAgICBpZiAocy0+bUlzSW5qZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+bU51bVJUQ1BQYWNrZXRzUmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbmV2ZXIgcmVjZWl2ZWQgYW55IFJUQ1AgcGFja2V0cyBvbiB0aGlzIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBldmVuIGtub3cgd2hlcmUgdG8gc2VuZCBhIHJlcG9ydC4KKyAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDApOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLT5tU291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPEFSVFBTb3VyY2U+IHNvdXJjZSA9IHMtPm1Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgc291cmNlLT5ub3RpZnlQa3RJbmZvKGJpdHJhdGUsIG5vd1VzLCB0cnVlIC8qIGlzUmVndWxhciAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIG1DdW11bGF0aXZlQnl0ZXMgPSAwOworICAgICAgICBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXMgPSBub3dVczsKKyAgICAgICAgbUxhc3RFYXJseU5vdGlmeVRpbWVVcyA9IG5vd1VzOworICAgIH0KK30KIHZvaWQgQVJUUENvbm5lY3Rpb246Om9uSW5qZWN0UGFja2V0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBpbmRleDsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKQEAgLTY3Miw0ICsxMjM2LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5oCmluZGV4IGQ1ZjdjMmUuLjM2Y2NhMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmgKQEAgLTMwLDYgKzMwLDcgQEAKIHN0cnVjdCBBUlRQQ29ubmVjdGlvbiA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIGtSZWd1bGFybHlSZXF1ZXN0RklSID0gMiwKKyAgICAgICAga1ZpTFRFQ29ubmVjdGlvbiA9IDQsCiAgICAgfTsKIAogICAgIGV4cGxpY2l0IEFSVFBDb25uZWN0aW9uKHVpbnQzMl90IGZsYWdzID0gMCk7CkBAIC0zOSwxNiArNDAsMjcgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+ICZzZXNzaW9uRGVzYywgc2l6ZV90IGluZGV4LAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgICAgICBib29sIGluamVjdGVkKTsKLQorICAgIHZvaWQgc2Vla1N0cmVhbSgpOwogICAgIHZvaWQgcmVtb3ZlU3RyZWFtKGludCBydHBTb2NrZXQsIGludCBydGNwU29ja2V0KTsKIAogICAgIHZvaWQgaW5qZWN0UGFja2V0KGludCBpbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKKyAgICB2b2lkIHNldFNlbGZJRChjb25zdCB1aW50MzJfdCBzZWxmSUQpOworICAgIHZvaWQgc2V0U3RhdGljSml0dGVyVGltZU1zKGNvbnN0IHVpbnQzMl90IGpiVGltZU1zKTsKKyAgICB2b2lkIHNldFRhcmdldEJpdHJhdGUoaW50MzJfdCB0YXJnZXRCaXRyYXRlKTsKKwogICAgIC8vIENyZWF0ZXMgYSBwYWlyIG9mIFVEUCBkYXRhZ3JhbSBzb2NrZXRzIGJvdW5kIHRvIGFkamFjZW50IHBvcnRzCiAgICAgLy8gKHRoZSBydHBTb2NrZXQgaXMgYm91bmQgdG8gYW4gZXZlbiBwb3J0LCB0aGUgcnRjcFNvY2tldCB0byB0aGUKICAgICAvLyBuZXh0IGhpZ2hlciBwb3J0KS4KICAgICBzdGF0aWMgdm9pZCBNYWtlUG9ydFBhaXIoCiAgICAgICAgICAgICBpbnQgKnJ0cFNvY2tldCwgaW50ICpydGNwU29ja2V0LCB1bnNpZ25lZCAqcnRwUG9ydCk7CisgICAgLy8gQ3JlYXRlcyBhIHBhaXIgb2YgVURQIGRhdGFncmFtIHNvY2tldHMgYm91bmQgdG8gYXNzaWduZWQgaXAgYW5kCisgICAgLy8gcG9ydHMgKHRoZSBydHBTb2NrZXQgaXMgYm91bmQgdG8gYW4gZXZlbiBwb3J0LCB0aGUgcnRjcFNvY2tldAorICAgIC8vIHRvIHRoZSBuZXh0IGhpZ2hlciBwb3J0KS4KKyAgICBzdGF0aWMgdm9pZCBNYWtlUlRQU29ja2V0UGFpcigKKyAgICAgICAgICAgIGludCAqcnRwU29ja2V0LCBpbnQgKnJ0Y3BTb2NrZXQsCisgICAgICAgICAgICBjb25zdCBjaGFyICpsb2NhbElwLCBjb25zdCBjaGFyICpyZW1vdGVJcCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvY2FsUG9ydCwgdW5zaWduZWQgcmVtb3RlUG9ydCwgaW50NjRfdCBzb2NrZXROZXR3b3JrID0gMCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BUlRQQ29ubmVjdGlvbigpOwpAQCAtNTcsOSArNjksMTEgQEAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0QWRkU3RyZWFtLAorICAgICAgICBrV2hhdFNlZWtTdHJlYW0sCiAgICAgICAgIGtXaGF0UmVtb3ZlU3RyZWFtLAogICAgICAgICBrV2hhdFBvbGxTdHJlYW1zLAogICAgICAgICBrV2hhdEluamVjdFBhY2tldCwKKyAgICAgICAga1doYXRBbGFybVN0cmVhbSwKICAgICB9OwogCiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NlbGVjdFRpbWVvdXRVczsKQEAgLTcxLDE4ICs4NSwzNCBAQAogCiAgICAgYm9vbCBtUG9sbEV2ZW50UGVuZGluZzsKICAgICBpbnQ2NF90IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdEJpdHJhdGVSZXBvcnRUaW1lVXM7CisgICAgaW50NjRfdCBtTGFzdEVhcmx5Tm90aWZ5VGltZVVzOworCisgICAgaW50MzJfdCBtU2VsZklEOworICAgIGludDMyX3QgbVRhcmdldEJpdHJhdGU7CisKKyAgICB1aW50MzJfdCBtU3RhdGljSml0dGVyVGltZU1zOworCisgICAgaW50MzJfdCBtQ3VtdWxhdGl2ZUJ5dGVzOwogCiAgICAgdm9pZCBvbkFkZFN0cmVhbShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNlZWtTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25SZW1vdmVTdHJlYW0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25Qb2xsU3RyZWFtcygpOworICAgIHZvaWQgb25BbGFybVN0cmVhbShjb25zdCBzcDxBTWVzc2FnZT4gbXNnKTsKICAgICB2b2lkIG9uSW5qZWN0UGFja2V0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uU2VuZFJlY2VpdmVyUmVwb3J0cygpOworICAgIHZvaWQgY2hlY2tSeEJpdHJhdGUoaW50NjRfdCBub3dVcyk7CiAKICAgICBzdGF0dXNfdCByZWNlaXZlKFN0cmVhbUluZm8gKmluZm8sIGJvb2wgcmVjZWl2ZVJUUCk7CisgICAgc3NpemVfdCBzZW5kKGNvbnN0IFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHNwPEFCdWZmZXI+IGJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBwYXJzZVJUUChTdHJlYW1JbmZvICppbmZvLCBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBzdGF0dXNfdCBwYXJzZVJUUEV4dChTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpleHREYXRhLCBzaXplX3QgZXh0TGVuLCBpbnQzMl90ICpjdm9EZWdyZWVzKTsKICAgICBzdGF0dXNfdCBwYXJzZVJUQ1AoU3RyZWFtSW5mbyAqaW5mbywgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgc3RhdHVzX3QgcGFyc2VTUihTdHJlYW1JbmZvICppbmZvLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VUU0ZCKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVBTRkIoU3RyZWFtSW5mbyAqaW5mbywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQllFKFN0cmVhbUluZm8gKmluZm8sIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHNwPEFSVFBTb3VyY2U+IGZpbmRTb3VyY2UoU3RyZWFtSW5mbyAqaW5mbywgdWludDMyX3QgaWQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKaW5kZXggZjVmODEyOC4uMzhhMzcwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlICJBQU1SQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQUFWQ0Fzc2VtYmxlci5oIgorI2luY2x1ZGUgIkFIRVZDQXNzZW1ibGVyLmgiCiAjaW5jbHVkZSAiQUgyNjNBc3NlbWJsZXIuaCIKICNpbmNsdWRlICJBTVBFRzJUU0Fzc2VtYmxlci5oIgogI2luY2x1ZGUgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmgiCkBAIC0zMywyMyArMzQsNDEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga1NvdXJjZUlEID0gMHhkZWFkYmVlZjsKK3N0YXRpYyB1aW50MzJfdCBrU291cmNlSUQgPSAweGRlYWRiZWVmOwogCiBBUlRQU291cmNlOjpBUlRQU291cmNlKAogICAgICAgICB1aW50MzJfdCBpZCwKICAgICAgICAgY29uc3Qgc3A8QVNlc3Npb25EZXNjcmlwdGlvbj4gJnNlc3Npb25EZXNjLCBzaXplX3QgaW5kZXgsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbUlEKGlkKSwKKyAgICA6IG1GaXJzdFJ0cFRpbWUoMCksCisgICAgICBtRmlyc3RTeXNUaW1lKDApLAorICAgICAgbUNsb2NrUmF0ZSgwKSwKKyAgICAgIG1TeXNBbmNob3JUaW1lKDApLAorICAgICAgbUxhc3RTeXNBbmNob3JUaW1lVXBkYXRlZFVzKDApLAorICAgICAgbUZpcnN0U3NyYygwKSwKKyAgICAgIG1IaWdoZXN0TmFja051bWJlcigwKSwKKyAgICAgIG1JRChpZCksCiAgICAgICBtSGlnaGVzdFNlcU51bWJlcigwKSwKICAgICAgIG1QcmV2RXhwZWN0ZWQoMCksCiAgICAgICBtQmFzZVNlcU51bWJlcigwKSwKICAgICAgIG1OdW1CdWZmZXJzUmVjZWl2ZWQoMCksCiAgICAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZCgwKSwKLSAgICAgIG1MYXN0TlRQVGltZSgwKSwKLSAgICAgIG1MYXN0TlRQVGltZVVwZGF0ZVVzKDApLAorICAgICAgbVByZXZFeHBlY3RlZEZvclJSKDApLAorICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWRGb3JSUigwKSwKKyAgICAgIG1MYXRlc3RSdHBUaW1lKDApLAorICAgICAgbVN0YXRpY0piVGltZU1zKGtTdGF0aWNKaXR0ZXJUaW1lTXMpLAorICAgICAgbUxhc3RTclJ0cFRpbWUoMCksCisgICAgICBtTGFzdFNyTnRwVGltZSgwKSwKKyAgICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMoMCksCisgICAgICBtSXNGaXJzdFJ0cFJ0Y3BHYXAodHJ1ZSksCisgICAgICBtQXZnUnRwUnRjcEdhcE1zKDApLAorICAgICAgbUF2Z1VuZGVybGluZURlbGF5TXMoMCksCiAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyhmYWxzZSksCisgICAgICBtSXNzdWVGSVJCeUFzc2VtYmxlcihmYWxzZSksCiAgICAgICBtTGFzdEZJUlJlcXVlc3RVcygtMSksCiAgICAgICBtTmV4dEZJUlNlcU5vKChyYW5kKCkgKiAyNTYuMCkgLyBSQU5EX01BWCksCiAgICAgICBtTm90aWZ5KG5vdGlmeSkgewpAQCAtNjEsNiArODAsOSBAQAogICAgIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY0LyIsIDUpKSB7CiAgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUFWQ0Fzc2VtYmxlcihub3RpZnkpOwogICAgICAgICBtSXNzdWVGSVJSZXF1ZXN0cyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChkZXNjLmNfc3RyKCksICJIMjY1LyIsIDUpKSB7CisgICAgICAgIG1Bc3NlbWJsZXIgPSBuZXcgQUhFVkNBc3NlbWJsZXIobm90aWZ5KTsKKyAgICAgICAgbUlzc3VlRklSUmVxdWVzdHMgPSB0cnVlOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoZGVzYy5jX3N0cigpLCAiTVA0QS1MQVRNLyIsIDEwKSkgewogICAgICAgICBtQXNzZW1ibGVyID0gbmV3IEFNUEVHNEF1ZGlvQXNzZW1ibGVyKG5vdGlmeSwgcGFyYW1zKTsKICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRlc2MuY19zdHIoKSwgIkgyNjMtMTk5OC8iLCAxMCkKQEAgLTg2LDYgKzEwOCwxMiBAQAogICAgIGlmIChtQXNzZW1ibGVyICE9IE5VTEwgJiYgIW1Bc3NlbWJsZXItPmluaXRDaGVjaygpKSB7CiAgICAgICAgIG1Bc3NlbWJsZXIuY2xlYXIoKTsKICAgICB9CisKKyAgICBpbnQzMl90IGNsb2NrUmF0ZSwgbnVtQ2hhbm5lbHM7CisgICAgQVNlc3Npb25EZXNjcmlwdGlvbjo6UGFyc2VGb3JtYXREZXNjKGRlc2MuY19zdHIoKSwgJmNsb2NrUmF0ZSwgJm51bUNoYW5uZWxzKTsKKyAgICBtQ2xvY2tSYXRlID0gY2xvY2tSYXRlOworICAgIG1MYXN0SmJBbGFybVRpbWVVcyA9IDA7CisgICAgbUppdHRlckNhbGMgPSBuZXcgSml0dGVyQ2FsYyhtQ2xvY2tSYXRlKTsKIH0KIAogc3RhdGljIHVpbnQzMl90IEFic0RpZmYodWludDMyX3Qgc2VxMSwgdWludDMyX3Qgc2VxMikgewpAQCAtOTgsMjcgKzEyNiwxNTcgQEAKICAgICB9CiB9CiAKK3ZvaWQgQVJUUFNvdXJjZTo6cHJvY2Vzc1JUUFBhY2tldCgpIHsKKyAgICBpZiAobUFzc2VtYmxlciAhPSBOVUxMICYmICFtUXVldWUuZW1wdHkoKSkgeworICAgICAgICBtQXNzZW1ibGVyLT5vblBhY2tldFJlY2VpdmVkKHRoaXMpOworICAgIH0KK30KKwogdm9pZCBBUlRQU291cmNlOjp0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpIHsKLSAgICBtTGFzdE5UUFRpbWUgPSBudHBUaW1lOwotICAgIG1MYXN0TlRQVGltZVVwZGF0ZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBtTGFzdFNyUnRwVGltZSA9IHJ0cFRpbWU7CisgICAgbUxhc3RTck50cFRpbWUgPSBudHBUaW1lOworICAgIG1MYXN0U3JVcGRhdGVUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwogICAgIG5vdGlmeS0+c2V0SW50MzIoInRpbWUtdXBkYXRlIiwgdHJ1ZSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicnRwLXRpbWUiLCBydHBUaW1lKTsKICAgICBub3RpZnktPnNldEludDY0KCJudHAtdGltZSIsIG50cFRpbWUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInJ0Y3AtZXZlbnQiLCAxKTsKKyAgICBub3RpZnktPnNldEludDMyKCJwYXlsb2FkLXR5cGUiLCBSVENQX1NSKTsKKyAgICBub3RpZnktPnNldEludDY0KCJyZWN2LXRpbWUtdXMiLCBtTGFzdFNyVXBkYXRlVGltZVVzKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAotYm9vbCBBUlRQU291cmNlOjpxdWV1ZVBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgdWludDMyX3Qgc2VxTnVtID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7Cit2b2lkIEFSVFBTb3VyY2U6OnRpbWVSZXNldCgpIHsKKyAgICBtRmlyc3RSdHBUaW1lID0gMDsKKyAgICBtRmlyc3RTeXNUaW1lID0gMDsKKyAgICBtU3lzQW5jaG9yVGltZSA9IDA7CisgICAgbUxhc3RTeXNBbmNob3JUaW1lVXBkYXRlZFVzID0gMDsKKyAgICBtRmlyc3RTc3JjID0gMDsKKyAgICBtSGlnaGVzdE5hY2tOdW1iZXIgPSAwOworICAgIG1IaWdoZXN0U2VxTnVtYmVyID0gMDsKKyAgICBtUHJldkV4cGVjdGVkID0gMDsKKyAgICBtQmFzZVNlcU51bWJlciA9IDA7CisgICAgbU51bUJ1ZmZlcnNSZWNlaXZlZCA9IDA7CisgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQgPSAwOworICAgIG1QcmV2RXhwZWN0ZWRGb3JSUiA9IDA7CisgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWRGb3JSUiA9IDA7CisgICAgbUxhdGVzdFJ0cFRpbWUgPSAwOworICAgIG1MYXN0U3JSdHBUaW1lID0gMDsKKyAgICBtTGFzdFNyTnRwVGltZSA9IDA7CisgICAgbUxhc3RTclVwZGF0ZVRpbWVVcyA9IDA7CisgICAgbUlzRmlyc3RSdHBSdGNwR2FwID0gdHJ1ZTsKKyAgICBtQXZnUnRwUnRjcEdhcE1zID0gMDsKKyAgICBtQXZnVW5kZXJsaW5lRGVsYXlNcyA9IDA7CisgICAgbUlzc3VlRklSQnlBc3NlbWJsZXIgPSBmYWxzZTsKKyAgICBtTGFzdEZJUlJlcXVlc3RVcyA9IC0xOworfQogCi0gICAgaWYgKG1OdW1CdWZmZXJzUmVjZWl2ZWQrKyA9PSAwKSB7Cit2b2lkIEFSVFBTb3VyY2U6OmNhbGNUaW1lR2FwUnRwUnRjcChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IG5vd1VzKSB7CisgICAgaWYgKG1MYXN0U3JVcGRhdGVUaW1lVXMgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50NjRfdCBlbGFwc2VkTXMgPSAobm93VXMgLSBtTGFzdFNyVXBkYXRlVGltZVVzKSAvIDEwMDA7CisgICAgaW50NjRfdCBlbGFwc2VkUnRwVGltZSA9IChlbGFwc2VkTXMgKiAobUNsb2NrUmF0ZSAvIDEwMDApKTsKKyAgICB1aW50MzJfdCBydHBUaW1lOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworCisgICAgaW50NjRfdCBhbmNob3JSdHBUaW1lID0gbUxhc3RTclJ0cFRpbWUgKyBlbGFwc2VkUnRwVGltZTsKKyAgICBpbnQ2NF90IHJ0cFRpbWVHYXAgPSBhbmNob3JSdHBUaW1lIC0gcnRwVGltZTsKKyAgICAvLyBydHBUaW1lIGNhbiBub3QgYmUgZmFzdGVyIHRoYW4gaXQncyBhbmNob3IgdGltZS4KKyAgICAvLyBiZWNhdXNlIHJ0cFRpbWUob2YgcnRwIHBhY2tldCkgcmVwcmVzZW50cyBpdCdzIGEgZnJhbWUgY2FwdHVyZWQgdGltZSBhbmQKKyAgICAvLyBhbmNob3JSdHBUaW1lKG9mIHJ0Y3A6c3IgcGFja2V0KSByZXByZXNlbnRzIGl0J3MgYSBydHAgcGFja2V0aXplZCB0aW1lLgorICAgIGlmIChydHBUaW1lR2FwIDwgMCB8fCBydHBUaW1lR2FwID4gKG1DbG9ja1JhdGUgKiA2MCkpIHsKKyAgICAgICAgLy8gaWdub3JlIGludmFsaWQgZGVsYXkgZ2FwIHN1Y2ggYXMgbmVnYXRpdmUgZGVsYXkgb3IgbGF0ZXIgdGhhbiAxIG1pbi4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgcnRwVGltZUdhcE1zID0gKHJ0cFRpbWVHYXAgKiAxMDAwIC8gbUNsb2NrUmF0ZSk7CisgICAgaWYgKG1Jc0ZpcnN0UnRwUnRjcEdhcCkgeworICAgICAgICBtSXNGaXJzdFJ0cFJ0Y3BHYXAgPSBmYWxzZTsKKyAgICAgICAgbUF2Z1J0cFJ0Y3BHYXBNcyA9IHJ0cFRpbWVHYXBNczsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGlzIGlzIG1lYXN1cmluZyBhdmcgcnRwIHRpbWVzdGFtcCBkaXN0YW5jZSBiZXR3ZWVuIHJ0cCBhbmQgcnRjcDpzciBwYWNrZXQuCisgICAgICAgIC8vIFJ0cCB0aW1lc3RhbXAgb2YgcnRwIHBhY2tldCByZXByZXNlbnRzIGl0J3MgcmF3IGZyYW1lIGNhcHR1cmVkIHRpbWUuCisgICAgICAgIC8vIFJ0cCB0aW1lc3RhbXAgb2YgcnRjcDpzciBwYWNrZXQgcmVwcmVzZW50cyBpdCdzIHBhY2tldGl6YXRpb24gdGltZS4KKyAgICAgICAgLy8gU28gdGhhdCwgdGhpcyB2YWx1ZSBpcyBzaG93aW5nIGhvdyBtdWNoIHRpbWUgZGVsYXllZCB0byBiZSBhIHJ0cCBwYWNrZXQKKyAgICAgICAgLy8gZnJvbSBhIHJhdyBmcmFtZSBjYXB0dXJlZCB0aW1lLgorICAgICAgICAvLyBUaGlzIHZhbHVlIG1heWJlIHJlZmVycmVkIHRvIGtub3cgYS92IHN5bmMgYW5kIHNlbmRlcidzIG93biBkZWxheSBvZiB0aGlzIG1lZGlhIHN0cmVhbS4KKyAgICAgICAgbUF2Z1J0cFJ0Y3BHYXBNcyA9ICgobUF2Z1J0cFJ0Y3BHYXBNcyAqIDE1KSArIHJ0cFRpbWVHYXBNcykgLyAxNjsKKyAgICB9Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6Y2FsY1VuZGVybGluZURlbGF5KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDY0X3Qgbm93VXMpIHsKKyAgICBpbnQ2NF90IGVsYXBzZWRNcyA9IChub3dVcyAtIG1TeXNBbmNob3JUaW1lKSAvIDEwMDA7CisgICAgaW50NjRfdCBlbGFwc2VkUnRwVGltZSA9IChlbGFwc2VkTXMgKiAobUNsb2NrUmF0ZSAvIDEwMDApKTsKKyAgICBpbnQ2NF90IGV4cGVjdGVkUnRwVGltZSA9IG1GaXJzdFJ0cFRpbWUgKyBlbGFwc2VkUnRwVGltZTsKKworICAgIGludDMyX3QgcnRwVGltZTsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKKyAgICBpbnQzMl90IGRlbGF5TXMgPSAoZXhwZWN0ZWRSdHBUaW1lIC0gcnRwVGltZSkgLyAobUNsb2NrUmF0ZSAvIDEwMDApOworCisgICAgbUF2Z1VuZGVybGluZURlbGF5TXMgPSAoKG1BdmdVbmRlcmxpbmVEZWxheU1zICogMTUpICsgZGVsYXlNcykgLyAxNjsKK30KKwordm9pZCBBUlRQU291cmNlOjphZGp1c3RBbmNob3JUaW1lSWZSZXF1aXJlZChpbnQ2NF90IG5vd1VzKSB7CisgICAgaWYgKG5vd1VzIC0gbUxhc3RTeXNBbmNob3JUaW1lVXBkYXRlZFVzIDwgMTAwMDAwMEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQXZnVW5kZXJsaW5lRGVsYXlNcyA8IC0zMCkgeworICAgICAgICAvLyBhZGp1c3QgdW5kZXJsaW5lIGRlbGF5IGEgcXVhcnRlciBvZiBkZXNpcmVkIGRlbGF5IGxpa2Ugc3RlcCBieSBzdGVwLgorICAgICAgICBtU3lzQW5jaG9yVGltZSArPSAoaW50NjRfdCkobUF2Z1VuZGVybGluZURlbGF5TXMgKiAxMDAwIC8gNCk7CisgICAgICAgIEFMT0dEKCJhbmNob3IgdGltZSB1cGRhdGVkOiBvcmlnaW5hbCglbGxkKSwgYW5jaG9yKCVsbGQpLCBkaWZmTXMoJWxsZCkiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUZpcnN0U3lzVGltZSwgKGxvbmcgbG9uZyltU3lzQW5jaG9yVGltZSwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRmlyc3RTeXNUaW1lIC0gbVN5c0FuY2hvclRpbWUpIC8gMTAwMCk7CisKKyAgICAgICAgbUF2Z1VuZGVybGluZURlbGF5TXMgPSAwOworICAgICAgICBtTGFzdFN5c0FuY2hvclRpbWVVcGRhdGVkVXMgPSBub3dVczsKKworICAgICAgICAvLyByZXNldCBhIGppdHRlciBzdGFzdGljcyBzaW5jZSBhbiBhbmNob3IgdGltZSBhZGp1c3RlZC4KKyAgICAgICAgbUppdHRlckNhbGMtPmluaXQobUZpcnN0UnRwVGltZSwgbVN5c0FuY2hvclRpbWUsIDAsIG1TdGF0aWNKYlRpbWVNcyAqIDEwMDApOworICAgIH0KK30KKworYm9vbCBBUlRQU291cmNlOjpxdWV1ZVBhY2tldChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgdWludDMyX3Qgc2VxTnVtID0gKHVpbnQzMl90KWJ1ZmZlci0+aW50MzJEYXRhKCk7CisgICAgaW50MzJfdCBzc3JjID0gMCwgcnRwVGltZSA9IDA7CisKKyAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJzc3JjIiwgJnNzcmMpOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInJ0cC10aW1lIiwgKGludDMyX3QgKikmcnRwVGltZSkpOworICAgIG1MYXRlc3RSdHBUaW1lID0gcnRwVGltZTsKKworICAgIGlmIChtTnVtQnVmZmVyc1JlY2VpdmVkKysgPT0gMCAmJiBtRmlyc3RTeXNUaW1lID09IDApIHsKKyAgICAgICAgbUZpcnN0U3lzVGltZSA9IG5vd1VzOworICAgICAgICBtU3lzQW5jaG9yVGltZSA9IG5vd1VzOworICAgICAgICBtTGFzdFN5c0FuY2hvclRpbWVVcGRhdGVkVXMgPSBub3dVczsKICAgICAgICAgbUhpZ2hlc3RTZXFOdW1iZXIgPSBzZXFOdW07CiAgICAgICAgIG1CYXNlU2VxTnVtYmVyID0gc2VxTnVtOworICAgICAgICBtRmlyc3RSdHBUaW1lID0gcnRwVGltZTsKKyAgICAgICAgbUZpcnN0U3NyYyA9IHNzcmM7CisgICAgICAgIEFMT0dEKCJmaXJzdC1ydHAgYXJyaXZlZDogZmlyc3QtcnRwLXRpbWU9JXUsIHN5cy10aW1lPSVsbGQsIHNlcS1udW09JXUsIHNzcmM9JWQiLAorICAgICAgICAgICAgICAgIG1GaXJzdFJ0cFRpbWUsIChsb25nIGxvbmcpbUZpcnN0U3lzVGltZSwgbUhpZ2hlc3RTZXFOdW1iZXIsIG1GaXJzdFNzcmMpOworICAgICAgICBtSml0dGVyQ2FsYy0+aW5pdChtRmlyc3RSdHBUaW1lLCBtRmlyc3RTeXNUaW1lLCAwLCBtU3RhdGljSmJUaW1lTXMgKiAxMDAwKTsKKyAgICAgICAgaWYgKG1RdWV1ZS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBBTE9HRCgiY2xlYXJpbmcgYnVmZmVycyB3aGljaCBiZWxvbmdlZCB0byBwcmV2aW91cyB0aW1lbGluZSIKKyAgICAgICAgICAgICAgICAgICAgIiBzaW5jZSBhIGJhc2UgdGltZWxpbmUgaGFzIGJlZW4gY2hhbmdlZC4iKTsKKyAgICAgICAgICAgIG1RdWV1ZS5jbGVhcigpOworICAgICAgICB9CiAgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2soYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgaWYgKG1GaXJzdFNzcmMgIT0gc3NyYykgeworICAgICAgICBBTE9HVygiRGlzY2FyZGluZyBhIGJ1ZmZlciBkdWUgdG8gdW5leHBlY3RlZCBzc3JjIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjYWxjVGltZUdhcFJ0cFJ0Y3AoYnVmZmVyLCBub3dVcyk7CisgICAgY2FsY1VuZGVybGluZURlbGF5KGJ1ZmZlciwgbm93VXMpOworICAgIGFkanVzdEFuY2hvclRpbWVJZlJlcXVpcmVkKG5vd1VzKTsKKwogICAgIC8vIE9ubHkgdGhlIGxvd2VyIDE2LWJpdCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVycyBhcmUgdHJhbnNtaXR0ZWQsCiAgICAgLy8gZGVyaXZlIHRoZSBoaWdoLW9yZGVyIGJpdHMgYnkgY2hvb3NpbmcgdGhlIGNhbmRpZGF0ZSBjbG9zZXN0CiAgICAgLy8gdG8gdGhlIGhpZ2hlc3Qgc2VxdWVuY2UgbnVtYmVyIChleHRlbmRlZCB0byAzMiBiaXRzKSByZWNlaXZlZCBzbyBmYXIuCkBAIC0xODEsMjAgKzMzOSwzNCBAQAogfQogCiB2b2lkIEFSVFBTb3VyY2U6OmFkZEZJUihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgaWYgKCFtSXNzdWVGSVJSZXF1ZXN0cykgeworICAgIGlmICghbUlzc3VlRklSUmVxdWVzdHMgJiYgIW1Jc3N1ZUZJUkJ5QXNzZW1ibGVyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBib29sIHNlbmQgPSBmYWxzZTsKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobUxhc3RGSVJSZXF1ZXN0VXMgPj0gMCAmJiBtTGFzdEZJUlJlcXVlc3RVcyArIDUwMDAwMDBMTCA+IG5vd1VzKSB7Ci0gICAgICAgIC8vIFNlbmQgRklSIHJlcXVlc3RzIGF0IG1vc3QgZXZlcnkgNSBzZWNzLgorICAgIGludDY0X3QgdXNlY3NTaW5jZUxhc3RGSVIgPSBub3dVcyAtIG1MYXN0RklSUmVxdWVzdFVzOworICAgIGlmIChtTGFzdEZJUlJlcXVlc3RVcyA8IDApIHsKKyAgICAgICAgLy8gQSBmaXJzdCBGSVIsIGp1c3Qgc2VuZCBpdC4KKyAgICAgICAgc2VuZCA9IHRydWU7CisgICAgfSAgZWxzZSBpZiAobUlzc3VlRklSQnlBc3NlbWJsZXIgJiYgKHVzZWNzU2luY2VMYXN0RklSID4gMTAwMDAwMCkpIHsKKyAgICAgICAgLy8gQSBGSVIgaXNzdWVkIGJ5IEFzc2VtYmxlci4KKyAgICAgICAgLy8gU2VuZCBpdCBpZiBsYXN0IEZJUiBpcyBub3Qgc2VudCB3aXRoaW4gYSBzZWMuCisgICAgICAgIHNlbmQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobUlzc3VlRklSUmVxdWVzdHMgJiYgKHVzZWNzU2luY2VMYXN0RklSID4gNTAwMDAwMCkpIHsKKyAgICAgICAgLy8gQSBGSVIgaXNzdWVkIHBlcmlvZGljYWxseSByZWdhcmRsZXNzIHBhY2tldCBsb3NzLgorICAgICAgICAvLyBTZW5kIGl0IGlmIGxhc3QgRklSIGlzIG5vdCBzZW50IHdpdGhpbiA1IHNlY3MuCisgICAgICAgIHNlbmQgPSB0cnVlOworICAgIH0KKworICAgIGlmICghc2VuZCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgbUxhc3RGSVJSZXF1ZXN0VXMgPSBub3dVczsKIAogICAgIGlmIChidWZmZXItPnNpemUoKSArIDIwID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBGSVIuIik7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgRklSLiIpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yMDMsNyArMzc1LDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDQ7CiAgICAgZGF0YVsxXSA9IDIwNjsgIC8vIFBTRkIKICAgICBkYXRhWzJdID0gMDsKLSAgICBkYXRhWzNdID0gNDsKKyAgICBkYXRhWzNdID0gNDsgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcwogICAgIGRhdGFbNF0gPSBrU291cmNlSUQgPj4gMjQ7CiAgICAgZGF0YVs1XSA9IChrU291cmNlSUQgPj4gMTYpICYgMHhmZjsKICAgICBkYXRhWzZdID0gKGtTb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CkBAIC0yMjUsMTQgKzM5NywxNiBAQAogICAgIGRhdGFbMThdID0gMHgwMDsKICAgICBkYXRhWzE5XSA9IDB4MDA7CiAKLSAgICBidWZmZXItPnNldFJhbmdlKGJ1ZmZlci0+b2Zmc2V0KCksIGJ1ZmZlci0+c2l6ZSgpICsgMjApOworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAoZGF0YVszXSArIDEpICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIG1Jc3N1ZUZJUkJ5QXNzZW1ibGVyID0gZmFsc2U7CiAKICAgICBBTE9HVigiQWRkZWQgRklSIHJlcXVlc3QuIik7CiB9CiAKIHZvaWQgQVJUUFNvdXJjZTo6YWRkUmVjZWl2ZXJSZXBvcnQoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGlmIChidWZmZXItPnNpemUoKSArIDMyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21vZGF0ZSBSUi4iKTsKKyAgICAgICAgQUxPR1coIlJUQ1AgYnVmZmVyIHRvbyBzbWFsbCB0byBhY2NvbW1vZGF0ZSBSUi4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMjQwLDE2ICs0MTQsMTYgQEAKIAogICAgIC8vIEFjY29yZGluZyB0byBhcHBlbmRpeCBBLjMgaW4gUkZDIDM1NTAKICAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOwotICAgIGludDY0X3QgaW50ZXJ2YWxFeHBlY3RlZCA9IGV4cGVjdGVkIC0gbVByZXZFeHBlY3RlZDsKLSAgICBpbnQ2NF90IGludGVydmFsUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkIC0gbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQ7CisgICAgaW50NjRfdCBpbnRlcnZhbEV4cGVjdGVkID0gZXhwZWN0ZWQgLSBtUHJldkV4cGVjdGVkRm9yUlI7CisgICAgaW50NjRfdCBpbnRlcnZhbFJlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZCAtIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkRm9yUlI7CiAgICAgaW50NjRfdCBpbnRlcnZhbFBhY2tldExvc3QgPSBpbnRlcnZhbEV4cGVjdGVkIC0gaW50ZXJ2YWxSZWNlaXZlZDsKIAogICAgIGlmIChpbnRlcnZhbEV4cGVjdGVkID4gMCAmJiBpbnRlcnZhbFBhY2tldExvc3QgPiAwKSB7CiAgICAgICAgIGZyYWN0aW9uID0gKGludGVydmFsUGFja2V0TG9zdCA8PCA4KSAvIGludGVydmFsRXhwZWN0ZWQ7CiAgICAgfQogCi0gICAgbVByZXZFeHBlY3RlZCA9IGV4cGVjdGVkOwotICAgIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICBtUHJldkV4cGVjdGVkRm9yUlIgPSBleHBlY3RlZDsKKyAgICBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSID0gbU51bUJ1ZmZlcnNSZWNlaXZlZDsKICAgICBpbnQzMl90IGN1bXVsYXRpdmVQYWNrZXRMb3N0ID0gKGludDMyX3QpZXhwZWN0ZWQgLSBtTnVtQnVmZmVyc1JlY2VpdmVkOwogCiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCk7CkBAIC0yNTcsNyArNDMxLDcgQEAKICAgICBkYXRhWzBdID0gMHg4MCB8IDE7CiAgICAgZGF0YVsxXSA9IDIwMTsgIC8vIFJSCiAgICAgZGF0YVsyXSA9IDA7Ci0gICAgZGF0YVszXSA9IDc7CisgICAgZGF0YVszXSA9IDc7ICAgIC8vIHRvdGFsICg3KzEpICogc2l6ZW9mKGludDMyX3QpID0gMzIgYnl0ZXMKICAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OwogICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CiAgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOwpAQCAtMjc5LDE4ICs0NTMsMTkgQEAKICAgICBkYXRhWzE4XSA9IChtSGlnaGVzdFNlcU51bWJlciA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVsxOV0gPSBtSGlnaGVzdFNlcU51bWJlciAmIDB4ZmY7CiAKLSAgICBkYXRhWzIwXSA9IDB4MDA7ICAvLyBJbnRlcmFycml2YWwgaml0dGVyCi0gICAgZGF0YVsyMV0gPSAweDAwOwotICAgIGRhdGFbMjJdID0gMHgwMDsKLSAgICBkYXRhWzIzXSA9IDB4MDA7CisgICAgdWludDMyX3Qgaml0dGVyVGltZSA9IDA7CisgICAgZGF0YVsyMF0gPSBqaXR0ZXJUaW1lID4+IDI0OyAgICAvLyBJbnRlcmFycml2YWwgaml0dGVyCisgICAgZGF0YVsyMV0gPSAoaml0dGVyVGltZSA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMjJdID0gKGppdHRlclRpbWUgPj4gOCkgJiAweGZmOworICAgIGRhdGFbMjNdID0gaml0dGVyVGltZSAmIDB4ZmY7CiAKICAgICB1aW50MzJfdCBMU1IgPSAwOwogICAgIHVpbnQzMl90IERMU1IgPSAwOwotICAgIGlmIChtTGFzdE5UUFRpbWUgIT0gMCkgewotICAgICAgICBMU1IgPSAobUxhc3ROVFBUaW1lID4+IDE2KSAmIDB4ZmZmZmZmZmY7CisgICAgaWYgKG1MYXN0U3JOdHBUaW1lICE9IDApIHsKKyAgICAgICAgTFNSID0gKG1MYXN0U3JOdHBUaW1lID4+IDE2KSAmIDB4ZmZmZmZmZmY7CiAKICAgICAgICAgRExTUiA9ICh1aW50MzJfdCkKLSAgICAgICAgICAgICgoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1MYXN0TlRQVGltZVVwZGF0ZVVzKSAqIDY1NTM2LjAgLyAxRTYpOworICAgICAgICAgICAgKChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUxhc3RTclVwZGF0ZVRpbWVVcykgKiA2NTUzNi4wIC8gMUU2KTsKICAgICB9CiAKICAgICBkYXRhWzI0XSA9IExTUiA+PiAyNDsKQEAgLTMwMyw5ICs0NzgsMjY0IEBACiAgICAgZGF0YVszMF0gPSAoRExTUiA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVszMV0gPSBETFNSICYgMHhmZjsKIAotICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAzMik7CisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIChkYXRhWzNdICsgMSkgKiBzaXplb2YoaW50MzJfdCkpOwogfQogCit2b2lkIEFSVFBTb3VyY2U6OmFkZFRNTUJSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDMyX3QgdGFyZ2V0Qml0cmF0ZSkgeworICAgIGlmIChidWZmZXItPnNpemUoKSArIDIwID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgUlIuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0Qml0cmF0ZSA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKworICAgIGRhdGFbMF0gPSAweDgwIHwgMzsgLy8gVE1NQlIKKyAgICBkYXRhWzFdID0gMjA1OyAgICAgIC8vIFRTRkIKKyAgICBkYXRhWzJdID0gMDsKKyAgICBkYXRhWzNdID0gNDsgICAgICAgIC8vIHRvdGFsICg0KzEpICogc2l6ZW9mKGludDMyX3QpID0gMjAgYnl0ZXMKKyAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBrU291cmNlSUQgJiAweGZmOworCisgICAgKihpbnQzMl90KikoJmRhdGFbOF0pID0gMDsgIC8vIDQgYnl0ZXMgYmxhbmsKKworICAgIGRhdGFbMTJdID0gbUlEID4+IDI0OworICAgIGRhdGFbMTNdID0gKG1JRCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMTRdID0gKG1JRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBtSUQgJiAweGZmOworCisgICAgLy8gRmluZCB0aGUgZmlyc3QgYml0ICcxJyBmcm9tIGxlZnQgJiByaWdodCBzaWRlIG9mIHRoZSB2YWx1ZS4KKyAgICBpbnQzMl90IGxlZnRFbmQgPSAzMSAtIF9fYnVpbHRpbl9jbHoodGFyZ2V0Qml0cmF0ZSk7CisgICAgaW50MzJfdCByaWdodEVuZCA9IGZmcyh0YXJnZXRCaXRyYXRlKSAtIDE7CisKKyAgICAvLyBNYW50aXNzYSBoYXZlIG9ubHkgMTdiaXQgc3BhY2UgYnkgUlRDUCBzcGVjaWZpY2F0aW9uLgorICAgIGlmICgobGVmdEVuZCAtIHJpZ2h0RW5kKSA+IDE2KSB7CisgICAgICAgIHJpZ2h0RW5kID0gbGVmdEVuZCAtIDE2OworICAgIH0KKyAgICBpbnQzMl90IG1hbnRpc3NhID0gdGFyZ2V0Qml0cmF0ZSA+PiByaWdodEVuZDsKKworICAgIGRhdGFbMTZdID0gKChyaWdodEVuZCA8PCAyKSAmIDB4ZmMpIHwgKChtYW50aXNzYSAmIDB4MTgwMDApID4+IDE1KTsKKyAgICBkYXRhWzE3XSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFudGlzc2EgJiAweDA3ZjgwKSA+PiA3OworICAgIGRhdGFbMThdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYW50aXNzYSAmIDB4MDAwN2YpIDw8IDE7CisgICAgZGF0YVsxOV0gPSA0MDsgICAgICAgICAgICAgIC8vIDQwIGJ5dGVzIG92ZXJoZWFkOworCisgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIChkYXRhWzNdICsgMSkgKiBzaXplb2YoaW50MzJfdCkpOworCisgICAgQUxPR0koIlVFIC0+IE9wIFJlcSBSeCBiaXRyYXRlIDogJWQgIiwgbWFudGlzc2EgPDwgcmlnaHRFbmQpOworfQorCitpbnQgQVJUUFNvdXJjZTo6YWRkTkFDSyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgY29uc3RleHByIHNpemVfdCBrTWF4RkNJcyA9IDEwOyAvLyBtYXggbnVtYmVyIG9mIEZDSXMKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgKyAoMyArIGtNYXhGQ0lzKSAqIHNpemVvZihpbnQzMl90KSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HVygiUlRDUCBidWZmZXIgdG9vIHNtYWxsIHRvIGFjY29tbW9kYXRlIE5BQ0suIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKTsKKworICAgIGRhdGFbMF0gPSAweDgwIHwgMTsgLy8gR2VuZXJpYyBOQUNLCisgICAgZGF0YVsxXSA9IDIwNTsgICAgICAvLyBUU0ZCCisgICAgZGF0YVsyXSA9IDA7CisgICAgZGF0YVszXSA9IDA7ICAgICAgICAvLyB3aWxsIGJlIGRlY2lkZWQgbGF0ZXIKKyAgICBkYXRhWzRdID0ga1NvdXJjZUlEID4+IDI0OworICAgIGRhdGFbNV0gPSAoa1NvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVs2XSA9IChrU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgIGRhdGFbN10gPSBrU291cmNlSUQgJiAweGZmOworCisgICAgZGF0YVs4XSA9IG1JRCA+PiAyNDsKKyAgICBkYXRhWzldID0gKG1JRCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMTBdID0gKG1JRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxMV0gPSBtSUQgJiAweGZmOworCisgICAgTGlzdDxpbnQ+IGxpc3Q7CisgICAgTGlzdDxpbnQ+OjppdGVyYXRvciBpdDsKKyAgICBnZXRTZXFOdW1Ub05BQ0sobGlzdCwga01heEZDSXMpOworICAgIHNpemVfdCBjbnQgPSAwOworCisgICAgaW50ICpGQ0kgPSAoaW50ICopKGRhdGEgKyAxMik7CisgICAgZm9yIChpdCA9IGxpc3QuYmVnaW4oKTsgaXQgIT0gbGlzdC5lbmQoKSAmJiBjbnQgPCBrTWF4RkNJczsgaXQrKykgeworICAgICAgICAqKEZDSSArIGNudCkgPSAqaXQ7CisgICAgICAgIGNudCsrOworICAgIH0KKworICAgIGRhdGFbM10gPSAoMyArIGNudCkgLSAxOyAgLy8gdG90YWwgKDMgKyAjb2ZGQ0kpICogc2l6ZW9mKGludDMyX3QpIGJ5dGUKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAoZGF0YVszXSArIDEpICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIHJldHVybiBjbnQ7Cit9CisKK2ludCBBUlRQU291cmNlOjpnZXRTZXFOdW1Ub05BQ0soTGlzdDxpbnQ+JiBsaXN0LCBpbnQgc2l6ZSkgeworICAgIEF1dG9NdXRleCBfbChtTWFwTG9jayk7CisgICAgaW50IGNudCA9IDA7CisKKyAgICBzdGQ6Om1hcDx1aW50MTZfdCwgaW5mb05BQ0s+OjppdGVyYXRvciBpdDsKKyAgICBmb3IoaXQgPSBtTkFDS01hcC5iZWdpbigpOyBpdCAhPSBtTkFDS01hcC5lbmQoKSAmJiBjbnQgPCBzaXplOyBpdCsrKSB7CisgICAgICAgIGluZm9OQUNLICZpbmZvX2l0ID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGluZm9faXQubmVlZFRvTkFDSykgeworICAgICAgICAgICAgaW5mb19pdC5uZWVkVG9OQUNLID0gZmFsc2U7CisgICAgICAgICAgICAvLyBzd2l0Y2ggTFNCIHRvIE1TQiBmb3Igc2VuZGluZyBOL1cKKyAgICAgICAgICAgIHVpbnQzMl90IEZDSTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnRlbXAgPSAodWludDhfdCAqKSZGQ0k7CisgICAgICAgICAgICB0ZW1wWzBdID0gKGluZm9faXQuc2VxTnVtID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIHRlbXBbMV0gPSAoaW5mb19pdC5zZXFOdW0pICAgICAgJiAweGZmOworICAgICAgICAgICAgdGVtcFsyXSA9IChpbmZvX2l0Lm1hc2sgPj4gOCkgICAmIDB4ZmY7CisgICAgICAgICAgICB0ZW1wWzNdID0gKGluZm9faXQubWFzaykgICAgICAgICYgMHhmZjsKKworICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2soRkNJKTsKKyAgICAgICAgICAgIGNudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNudDsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRTZXFOdW1Ub05BQ0sodWludDE2X3Qgc2VxTnVtLCB1aW50MTZfdCBtYXNrLCB1aW50MTZfdCBub3dKaXR0ZXJIZWFkU2VxTnVtKSB7CisgICAgQXV0b011dGV4IF9sKG1NYXBMb2NrKTsKKyAgICBpbmZvTkFDSyBpbmZvID0ge3NlcU51bSwgbWFzaywgbm93Sml0dGVySGVhZFNlcU51bSwgdHJ1ZX07CisgICAgc3RkOjptYXA8dWludDE2X3QsIGluZm9OQUNLPjo6aXRlcmF0b3IgaXQ7CisKKyAgICBpdCA9IG1OQUNLTWFwLmZpbmQoc2VxTnVtKTsKKyAgICBpZiAoaXQgIT0gbU5BQ0tNYXAuZW5kKCkpIHsKKyAgICAgICAgaW5mb05BQ0sgJmluZm9faXQgPSBpdC0+c2Vjb25kOworICAgICAgICAvLyByZW5ldyBpZiAobWFzayBvciBoZWFkIHNlcSkgaXMgY2hhbmdlZAorICAgICAgICBpZiAoKGluZm9faXQubWFzayAhPSBtYXNrKSB8fCAoaW5mb19pdC5ub3dKaXR0ZXJIZWFkU2VxTnVtICE9IG5vd0ppdHRlckhlYWRTZXFOdW0pKSB7CisgICAgICAgICAgICBpbmZvX2l0ID0gaW5mbzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1OQUNLTWFwW3NlcU51bV0gPSBpbmZvOworICAgIH0KKworICAgIC8vIGRlbGV0ZSBhbGwgTkFDSyBmYXIgZnJvbSBjdXJyZW50IEppdHRlcidzIGZpcnN0IHNlcXVlbmNlIG51bWJlcgorICAgIGl0ID0gbU5BQ0tNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbU5BQ0tNYXAuZW5kKCkpIHsKKyAgICAgICAgaW5mb05BQ0sgJmluZm9faXQgPSBpdC0+c2Vjb25kOworCisgICAgICAgIGludCBkaWZmID0gbm93Sml0dGVySGVhZFNlcU51bSAtIGluZm9faXQubm93Sml0dGVySGVhZFNlcU51bTsKKyAgICAgICAgaWYgKGRpZmYgPiAxMDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJEZWxldGUgJWQgcGt0IGZyb20gTkFDSyBtYXAgIiwgaW5mb19pdC5zZXFOdW0pOworICAgICAgICAgICAgaXQgPSBtTkFDS01hcC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCsrOworICAgICAgICB9CisgICAgfQorCit9CisKK3VpbnQzMl90IEFSVFBTb3VyY2U6OmdldFNlbGZJRCgpIHsKKyAgICByZXR1cm4ga1NvdXJjZUlEOworfQorCit2b2lkIEFSVFBTb3VyY2U6OnNldFNlbGZJRChjb25zdCB1aW50MzJfdCBzZWxmSUQpIHsKKyAgICBrU291cmNlSUQgPSBzZWxmSUQ7Cit9CisKK3ZvaWQgQVJUUFNvdXJjZTo6c2V0UGVyaW9kaWNGSVIoYm9vbCBlbmFibGUpIHsKKyAgICBBTE9HRCgic2V0UGVyaW9kaWNGSVIgJWQiLCBlbmFibGUpOworICAgIG1Jc3N1ZUZJUlJlcXVlc3RzID0gZW5hYmxlOworfQorCitpbnQzMl90IEFSVFBTb3VyY2U6OmdldFN0YXRpY0ppdHRlclRpbWVNcygpIHsKKyAgICByZXR1cm4gbVN0YXRpY0piVGltZU1zOworfQorCitpbnQzMl90IEFSVFBTb3VyY2U6OmdldEJhc2VKaXR0ZXJUaW1lTXMoKSB7CisgICAgcmV0dXJuIG1KaXR0ZXJDYWxjLT5nZXRCYXNlSml0dGVyTXMoKTsKK30KKworaW50MzJfdCBBUlRQU291cmNlOjpnZXRJbnRlckFycml2YWxKaXR0ZXJUaW1lTXMoKSB7CisgICAgcmV0dXJuIG1KaXR0ZXJDYWxjLT5nZXRJbnRlckFycml2YWxKaXR0ZXJNcygpOworfQorCit2b2lkIEFSVFBTb3VyY2U6OnNldFN0YXRpY0ppdHRlclRpbWVNcyhjb25zdCB1aW50MzJfdCBqYlRpbWVNcykgeworICAgIG1TdGF0aWNKYlRpbWVNcyA9IGpiVGltZU1zOworfQorCit2b2lkIEFSVFBTb3VyY2U6OnB1dEJhc2VKaXR0ZXJEYXRhKHVpbnQzMl90IHRpbWVTdGFtcCwgaW50NjRfdCBhcnJpdmFsVGltZSkgeworICAgIG1KaXR0ZXJDYWxjLT5wdXRCYXNlRGF0YSh0aW1lU3RhbXAsIGFycml2YWxUaW1lKTsKK30KKwordm9pZCBBUlRQU291cmNlOjpwdXRJbnRlckFycml2YWxKaXR0ZXJEYXRhKHVpbnQzMl90IHRpbWVTdGFtcCwgaW50NjRfdCBhcnJpdmFsVGltZSkgeworICAgIG1KaXR0ZXJDYWxjLT5wdXRJbnRlckFycml2YWxEYXRhKHRpbWVTdGFtcCwgYXJyaXZhbFRpbWUpOworfQorCit2b2lkIEFSVFBTb3VyY2U6OnNldEpiVGltZXIoY29uc3Qgc3A8QU1lc3NhZ2U+IHRpbWVyKSB7CisgICAgbUpiVGltZXIgPSB0aW1lcjsKK30KKwordm9pZCBBUlRQU291cmNlOjpzZXRKYkFsYXJtVGltZShpbnQ2NF90IG5vd1RpbWVVcywgaW50NjRfdCBhbGFybUFmdGVyVXMpIHsKKyAgICBpZiAobUpiVGltZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDY0X3QgYWxhcm1UaW1lVXMgPSBub3dUaW1lVXMgKyBhbGFybUFmdGVyVXM7CisgICAgYm9vbCBhbGFybSA9IGZhbHNlOworICAgIGlmIChtTGFzdEpiQWxhcm1UaW1lVXMgPD0gbm93VGltZVVzKSB7CisgICAgICAgIC8vIG5vIG1vcmUgYWxhcm0gaW4gcGVuZGluZy4KKyAgICAgICAgbUxhc3RKYkFsYXJtVGltZVVzID0gbm93VGltZVVzICsgYWxhcm1BZnRlclVzOworICAgICAgICBhbGFybSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtTGFzdEpiQWxhcm1UaW1lVXMgPiBhbGFybVRpbWVVcyArIDUwMDBMKSB7CisgICAgICAgIC8vIGJyaW5nIGFuIGFsYXJtIGZvcndhcmQgbW9yZSB0aGFuIDVtcy4KKyAgICAgICAgbUxhc3RKYkFsYXJtVGltZVVzID0gYWxhcm1UaW1lVXM7CisgICAgICAgIGFsYXJtID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB3b3VsZCBub3Qgc2V0IGFsYXJtIGlmIGl0IGlzIGNsb3NlIHdpdGggYmVmb3JlIG9uZS4KKyAgICB9CisKKyAgICBpZiAoYWxhcm0pIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1KYlRpbWVyLT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoInNvdXJjZSIsIHRoaXMpOworICAgICAgICBub3RpZnktPnBvc3QoYWxhcm1BZnRlclVzKTsKKyAgICB9Cit9CisKK2Jvb2wgQVJUUFNvdXJjZTo6aXNOZWVkVG9FYXJseU5vdGlmeSgpIHsKKyAgICB1aW50MzJfdCBleHBlY3RlZCA9IG1IaWdoZXN0U2VxTnVtYmVyIC0gbUJhc2VTZXFOdW1iZXIgKyAxOworICAgIGludDMyX3QgaW50ZXJ2YWxFeHBlY3RlZEluTm93ID0gZXhwZWN0ZWQgLSBtUHJldkV4cGVjdGVkOworICAgIGludDMyX3QgaW50ZXJ2YWxSZWNlaXZlZEluTm93ID0gbU51bUJ1ZmZlcnNSZWNlaXZlZCAtIG1QcmV2TnVtQnVmZmVyc1JlY2VpdmVkOworCisgICAgaWYgKGludGVydmFsRXhwZWN0ZWRJbk5vdyAtIGludGVydmFsUmVjZWl2ZWRJbk5vdyA+IDUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBUlRQU291cmNlOjpub3RpZnlQa3RJbmZvKGludDMyX3QgYml0cmF0ZSwgaW50NjRfdCBub3dVcywgYm9vbCBpc1JlZ3VsYXIpIHsKKyAgICBpbnQzMl90IHBheWxvYWRUeXBlID0gaXNSZWd1bGFyID8gUlRQX1FVQUxJVFkgOiBSVFBfUVVBTElUWV9FTUM7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRjcC1ldmVudCIsIDEpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInBheWxvYWQtdHlwZSIsIHBheWxvYWRUeXBlKTsKKyAgICBub3RpZnktPnNldEludDMyKCJmZWVkYmFjay10eXBlIiwgMCk7CisgICAgLy8gc2VuZGluZyB0YXJnZXQgYml0cmF0ZSB1cCB0byBhcHBsaWNhdGlvbiB0byBzaGFyZSBydHAgcXVhbGl0eS4KKyAgICBub3RpZnktPnNldEludDMyKCJiaXQtcmF0ZSIsIGJpdHJhdGUpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImhpZ2hlc3Qtc2VxLW51bSIsIG1IaWdoZXN0U2VxTnVtYmVyKTsKKyAgICBub3RpZnktPnNldEludDMyKCJiYXNlLXNlcS1udW0iLCBtQmFzZVNlcU51bWJlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicHJldi1leHBlY3RlZCIsIG1QcmV2RXhwZWN0ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIm51bS1idWYtcmVjdiIsIG1OdW1CdWZmZXJzUmVjZWl2ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoInByZXYtbnVtLWJ1Zi1yZWN2IiwgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImxhdGVzdC1ydHAtdGltZSIsIG1MYXRlc3RSdHBUaW1lKTsKKyAgICBub3RpZnktPnNldEludDY0KCJyZWN2LXRpbWUtdXMiLCBub3dVcyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicnRwLWppdHRlci10aW1lLW1zIiwKKyAgICAgICAgICAgIHN0ZDo6bWF4KGdldEJhc2VKaXR0ZXJUaW1lTXMoKSwgZ2V0U3RhdGljSml0dGVyVGltZU1zKCkpKTsKKyAgICBub3RpZnktPnNldEludDMyKCJydHAtcnRjcHNyLXRpbWUtZ2FwLW1zIiwgKGludDMyX3QpbUF2Z1J0cFJ0Y3BHYXBNcyk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICBpZiAoaXNSZWd1bGFyKSB7CisgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkID0gbUhpZ2hlc3RTZXFOdW1iZXIgLSBtQmFzZVNlcU51bWJlciArIDE7CisgICAgICAgIG1QcmV2RXhwZWN0ZWQgPSBleHBlY3RlZDsKKyAgICAgICAgbVByZXZOdW1CdWZmZXJzUmVjZWl2ZWQgPSBtTnVtQnVmZmVyc1JlY2VpdmVkOworICAgIH0KK30KKwordm9pZCBBUlRQU291cmNlOjpvbklzc3VlRklSQnlBc3NlbWJsZXIoKSB7CisgICAgbUlzc3VlRklSQnlBc3NlbWJsZXIgPSB0cnVlOworfQorCit2b2lkIEFSVFBTb3VyY2U6Om5vdGljZUFiYW5kb25CdWZmZXIoaW50IGNudCkgeworICAgIG1OdW1CdWZmZXJzUmVjZWl2ZWQgLT0gY250OworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCmluZGV4IGY0NGU4M2YuLjQ5ODRlOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5oCkBAIC0yMyw5ICsyMywxNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorCisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSAiSml0dGVyQ2FsY3VsYXRvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NvbnN0IHVpbnQzMl90IGtTdGF0aWNKaXR0ZXJUaW1lTXMgPSAxMDA7ICAgLy8gMTAwbXMKKwogc3RydWN0IEFCdWZmZXI7CiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdHJ1Y3QgQVJUUEFzc2VtYmxlcjsKQEAgLTM3LDcgKzQ0LDIyIEBACiAgICAgICAgICAgICBjb25zdCBzcDxBU2Vzc2lvbkRlc2NyaXB0aW9uPiAmc2Vzc2lvbkRlc2MsIHNpemVfdCBpbmRleCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKIAorICAgIGVudW0geworICAgICAgICBSVFBfRklSU1RfUEFDS0VUID0gMTAwLAorICAgICAgICBSVENQX0ZJUlNUX1BBQ0tFVCA9IDEwMSwKKyAgICAgICAgUlRQX1FVQUxJVFkgPSAxMDIsCisgICAgICAgIFJUUF9RVUFMSVRZX0VNQyA9IDEwMywKKyAgICAgICAgUlRDUF9TUiA9IDIwMCwKKyAgICAgICAgUlRDUF9SUiA9IDIwMSwKKyAgICAgICAgUlRDUF9UU0ZCID0gMjA1LAorICAgICAgICBSVENQX1BTRkIgPSAyMDYsCisgICAgICAgIFJUUF9DVk8gPSAzMDAsCisgICAgICAgIFJUUF9BVVRPRE9XTiA9IDQwMCwKKyAgICB9OworCiAgICAgdm9pZCBwcm9jZXNzUlRQUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgcHJvY2Vzc1JUUFBhY2tldCgpOworICAgIHZvaWQgdGltZVJlc2V0KCk7CiAgICAgdm9pZCB0aW1lVXBkYXRlKHVpbnQzMl90IHJ0cFRpbWUsIHVpbnQ2NF90IG50cFRpbWUpOwogICAgIHZvaWQgYnllUmVjZWl2ZWQoKTsKIApAQCAtNDUsMjcgKzY3LDkwIEBACiAKICAgICB2b2lkIGFkZFJlY2VpdmVyUmVwb3J0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgYWRkRklSKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgYWRkVE1NQlIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCB0YXJnZXRCaXRyYXRlKTsKKyAgICBpbnQgYWRkTkFDSyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICB2b2lkIHNldFNlcU51bVRvTkFDSyh1aW50MTZfdCBzZXFOdW0sIHVpbnQxNl90IG1hc2ssIHVpbnQxNl90IG5vd0ppdHRlckhlYWRTZXFOdW0pOworICAgIHVpbnQzMl90IGdldFNlbGZJRCgpOworICAgIHZvaWQgc2V0U2VsZklEKGNvbnN0IHVpbnQzMl90IHNlbGZJRCk7CisgICAgdm9pZCBzZXRQZXJpb2RpY0ZJUihib29sIGVuYWJsZSk7CisKKyAgICBpbnQzMl90IGdldFN0YXRpY0ppdHRlclRpbWVNcygpOworICAgIGludDMyX3QgZ2V0QmFzZUppdHRlclRpbWVNcygpOworICAgIGludDMyX3QgZ2V0SW50ZXJBcnJpdmFsSml0dGVyVGltZU1zKCk7CisgICAgdm9pZCBzZXRTdGF0aWNKaXR0ZXJUaW1lTXMoY29uc3QgdWludDMyX3QgamJUaW1lTXMpOworICAgIHZvaWQgcHV0QmFzZUppdHRlckRhdGEodWludDMyX3QgdGltZVN0YW1wLCBpbnQ2NF90IGFycml2YWxUaW1lKTsKKyAgICB2b2lkIHB1dEludGVyQXJyaXZhbEppdHRlckRhdGEodWludDMyX3QgdGltZVN0YW1wLCBpbnQ2NF90IGFycml2YWxUaW1lKTsKKyAgICB2b2lkIHNldEpiVGltZXIoY29uc3Qgc3A8QU1lc3NhZ2U+IHRpbWVyKTsKKyAgICB2b2lkIHNldEpiQWxhcm1UaW1lKGludDY0X3Qgbm93VGltZVVzLCBpbnQ2NF90IGFsYXJtQWZ0ZXJVcyk7CisKKyAgICBib29sIGlzTmVlZFRvRWFybHlOb3RpZnkoKTsKKyAgICB2b2lkIG5vdGlmeVBrdEluZm8oaW50MzJfdCBiaXRyYXRlLCBpbnQ2NF90IG5vd1VzLCBib29sIGlzUmVndWxhcik7CisgICAgLy8gRklSIG5lZWRzIHRvIGJlIHNlbnQgYnkgbWlzc2luZyBwYWNrZXQgb3IgYnJva2VuIHZpZGVvIGltYWdlLgorICAgIHZvaWQgb25Jc3N1ZUZJUkJ5QXNzZW1ibGVyKCk7CisKKyAgICB2b2lkIG5vdGljZUFiYW5kb25CdWZmZXIoaW50IGNudD0xKTsKKworICAgIHVpbnQzMl90IG1GaXJzdFJ0cFRpbWU7CisgICAgaW50NjRfdCBtRmlyc3RTeXNUaW1lOworICAgIGludDMyX3QgbUNsb2NrUmF0ZTsKKworICAgIGludDY0X3QgbVN5c0FuY2hvclRpbWU7CisgICAgaW50NjRfdCBtTGFzdFN5c0FuY2hvclRpbWVVcGRhdGVkVXM7CisKKyAgICBpbnQzMl90IG1GaXJzdFNzcmM7CisgICAgaW50MzJfdCBtSGlnaGVzdE5hY2tOdW1iZXI7CiAKIHByaXZhdGU6CisKICAgICB1aW50MzJfdCBtSUQ7CiAgICAgdWludDMyX3QgbUhpZ2hlc3RTZXFOdW1iZXI7CiAgICAgdWludDMyX3QgbVByZXZFeHBlY3RlZDsKICAgICB1aW50MzJfdCBtQmFzZVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1CdWZmZXJzUmVjZWl2ZWQ7CiAgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZDsKKyAgICB1aW50MzJfdCBtUHJldkV4cGVjdGVkRm9yUlI7CisgICAgaW50MzJfdCBtUHJldk51bUJ1ZmZlcnNSZWNlaXZlZEZvclJSOworCisgICAgdWludDMyX3QgbUxhdGVzdFJ0cFRpbWU7CiAKICAgICBMaXN0PHNwPEFCdWZmZXI+ID4gbVF1ZXVlOwogICAgIHNwPEFSVFBBc3NlbWJsZXI+IG1Bc3NlbWJsZXI7CiAKLSAgICB1aW50NjRfdCBtTGFzdE5UUFRpbWU7Ci0gICAgaW50NjRfdCBtTGFzdE5UUFRpbWVVcGRhdGVVczsKKyAgICBpbnQzMl90IG1TdGF0aWNKYlRpbWVNczsKKyAgICBzcDxKaXR0ZXJDYWxjPiBtSml0dGVyQ2FsYzsKKyAgICBzcDxBTWVzc2FnZT4gbUpiVGltZXI7CisKKyAgICB0eXBlZGVmIHN0cnVjdCBpbmZvTkFDSyB7CisgICAgICAgIHVpbnQxNl90IHNlcU51bTsKKyAgICAgICAgdWludDE2X3QgbWFzazsKKyAgICAgICAgdWludDE2X3Qgbm93Sml0dGVySGVhZFNlcU51bTsKKyAgICAgICAgYm9vbCAgICBuZWVkVG9OQUNLOworICAgIH0gaW5mb05BQ0s7CisKKyAgICBNdXRleCBtTWFwTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50MTZfdCwgaW5mb05BQ0s+IG1OQUNLTWFwOworICAgIGludCBnZXRTZXFOdW1Ub05BQ0soTGlzdDxpbnQ+JiBsaXN0LCBpbnQgc2l6ZSk7CisKKyAgICB1aW50MzJfdCBtTGFzdFNyUnRwVGltZTsKKyAgICB1aW50NjRfdCBtTGFzdFNyTnRwVGltZTsKKyAgICBpbnQ2NF90IG1MYXN0U3JVcGRhdGVUaW1lVXM7CisKKyAgICBib29sIG1Jc0ZpcnN0UnRwUnRjcEdhcDsKKyAgICBkb3VibGUgbUF2Z1J0cFJ0Y3BHYXBNczsKKyAgICBkb3VibGUgbUF2Z1VuZGVybGluZURlbGF5TXM7CisgICAgaW50NjRfdCBtTGFzdEpiQWxhcm1UaW1lVXM7CiAKICAgICBib29sIG1Jc3N1ZUZJUlJlcXVlc3RzOworICAgIGJvb2wgbUlzc3VlRklSQnlBc3NlbWJsZXI7CiAgICAgaW50NjRfdCBtTGFzdEZJUlJlcXVlc3RVczsKICAgICB1aW50OF90IG1OZXh0RklSU2VxTm87CiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIAorICAgIHZvaWQgY2FsY1RpbWVHYXBSdHBSdGNwKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDY0X3Qgbm93VXMpOworICAgIHZvaWQgY2FsY1VuZGVybGluZURlbGF5KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGludDY0X3Qgbm93VXMpOworICAgIHZvaWQgYWRqdXN0QW5jaG9yVGltZUlmUmVxdWlyZWQoaW50NjRfdCBub3dVcyk7CisKICAgICBib29sIHF1ZXVlUGFja2V0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQVJUUFNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAppbmRleCA1OGQ2MDg2Li4xMWM3YWViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIkFSVFBXcml0ZXIuaCIKIAotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zMiwxMyArMzAsNDMgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPHV0aWxzL0J5dGVPcmRlci5oPgogCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKICNkZWZpbmUgUFQgICAgICA5NwogI2RlZmluZSBQVF9TVFIgICI5NyIKIAorI2RlZmluZSBIMjY0X05BTFVfTUFTSyAweDFGCisjZGVmaW5lIEgyNjRfTkFMVV9TUFMgMHg3CisjZGVmaW5lIEgyNjRfTkFMVV9QUFMgMHg4CisjZGVmaW5lIEgyNjRfTkFMVV9JRlJBTUUgMHg1CisjZGVmaW5lIEgyNjRfTkFMVV9QRlJBTUUgMHgxCisKKyNkZWZpbmUgSDI2NV9OQUxVX01BU0sgMHgzRgorI2RlZmluZSBIMjY1X05BTFVfVlBTIDB4MjAKKyNkZWZpbmUgSDI2NV9OQUxVX1NQUyAweDIxCisjZGVmaW5lIEgyNjVfTkFMVV9QUFMgMHgyMgorCisjZGVmaW5lIElQVjRfSEVBREVSX1NJWkUgMjAKKyNkZWZpbmUgSVBWNl9IRUFERVJfU0laRSA0MAorI2RlZmluZSBVRFBfSEVBREVSX1NJWkUgOAorI2RlZmluZSBUQ1BJUFY0X0hFQURFUl9TSVpFIChJUFY0X0hFQURFUl9TSVpFICsgVURQX0hFQURFUl9TSVpFKQorI2RlZmluZSBUQ1BJUFY2X0hFQURFUl9TSVpFIChJUFY2X0hFQURFUl9TSVpFICsgVURQX0hFQURFUl9TSVpFKQorI2RlZmluZSBUQ1BJUF9IRUFERVJfU0laRSBUQ1BJUFY0X0hFQURFUl9TSVpFCisjZGVmaW5lIFJUUF9IRUFERVJfU0laRSAxMgorI2RlZmluZSBSVFBfSEVBREVSX0VYVF9TSVpFIDgKKyNkZWZpbmUgUlRQX0ZVX0hFQURFUl9TSVpFIDIKKyNkZWZpbmUgUlRQX1BBWUxPQURfUk9PTV9TSVpFIDEwMCAvLyBST09NIHNpemUgZm9yIElQdjYgaGVhZGVyLCBFU1AgYW5kIGV0Yy4KKworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFBhY2tldFNpemUgPSA2NTUwNzsgIC8vIG1heGltdW0gcGF5bG9hZCBpbiBVRFAgb3ZlciBJUAotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFja2V0U2l6ZSA9IDE1MDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhQYWNrZXRTaXplID0gMTI4MDsKK3N0YXRpYyBjaGFyIGtDTkFNRVsyNTVdID0gInNvbWVvbmVAc29tZXdoZXJlIjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhZmZpY1JlY29yZGVyTWF4RW50cmllcyA9IDEyODsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1RyYWZmaWNSZWNvcmRlck1heFRpbWVTcGFuTXMgPSAyMDAwOwogCiBzdGF0aWMgaW50IFVuaWZvcm1SYW5kKGludCBsaW1pdCkgewogICAgIHJldHVybiAoKGRvdWJsZSlyYW5kKCkgKiBsaW1pdCkgLyBSQU5EX01BWDsKQEAgLTQ4LDE1ICs3NiwyMCBAQAogICAgIDogbUZsYWdzKDApLAogICAgICAgbUZkKGR1cChmZCkpLAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCi0gICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPih0aGlzKSkgeworICAgICAgbVJlZmxlY3RvcihuZXcgQUhhbmRsZXJSZWZsZWN0b3I8QVJUUFdyaXRlcj4odGhpcykpLAorICAgICAgbVRyYWZmaWNSZWMobmV3IFRyYWZmaWNSZWNvcmRlcjx1aW50MzJfdCAvKiBUaW1lICovLCBCeXRlcz4oCisgICAgICAgICAgICAgIGtUcmFmZmljUmVjb3JkZXJNYXhFbnRyaWVzLCBrVHJhZmZpY1JlY29yZGVyTWF4VGltZVNwYW5NcykpIHsKICAgICBDSEVDS19HRShmZCwgMCk7CisgICAgbUlzSVB2NiA9IGZhbHNlOwogCiAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRwIHdyaXRlciIpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yKTsKICAgICBtTG9vcGVyLT5zdGFydCgpOwogCi0gICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKLSAgICBDSEVDS19HRShtU29ja2V0LCAwKTsKKyAgICBtUlRQU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVFBTb2NrZXQsIDApOworICAgIG1SVENQU29ja2V0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworICAgIENIRUNLX0dFKG1SVENQU29ja2V0LCAwKTsKIAogICAgIG1lbXNldChtUlRQQWRkci5zaW5femVybywgMCwgc2l6ZW9mKG1SVFBBZGRyLnNpbl96ZXJvKSk7CiAgICAgbVJUUEFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CkBAIC03Miw2ICsxMDUsNDYgQEAKIAogICAgIG1SVENQQWRkciA9IG1SVFBBZGRyOwogICAgIG1SVENQQWRkci5zaW5fcG9ydCA9IGh0b25zKG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSB8IDEpOworICAgIG1TUFNCdWYgPSBOVUxMOworICAgIG1QUFNCdWYgPSBOVUxMOworCisjaWYgTE9HX1RPX0ZJTEVTCisgICAgbVJUUEZkID0gb3BlbigKKyAgICAgICAgICAgICIvZGF0YS9taXNjL3J0cG91dC5iaW4iLAorICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywKKyAgICAgICAgICAgIDA2NDQpOworICAgIENIRUNLX0dFKG1SVFBGZCwgMCk7CisKKyAgICBtUlRDUEZkID0gb3BlbigKKyAgICAgICAgICAgICIvZGF0YS9taXNjL3J0Y3BvdXQuYmluIiwKKyAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAwNjQ0KTsKKyAgICBDSEVDS19HRShtUlRDUEZkLCAwKTsKKyNlbmRpZgorfQorCitBUlRQV3JpdGVyOjpBUlRQV3JpdGVyKGludCBmZCwgU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwgU3RyaW5nOCYgcmVtb3RlSXAsCisgICAgaW50IHJlbW90ZVBvcnQsIHVpbnQzMl90IHNlcU5vKQorICAgIDogbUZsYWdzKDApLAorICAgICAgbUZkKGR1cChmZCkpLAorICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCisgICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPih0aGlzKSksCisgICAgICBtVHJhZmZpY1JlYyhuZXcgVHJhZmZpY1JlY29yZGVyPHVpbnQzMl90IC8qIFRpbWUgKi8sIEJ5dGVzPigKKyAgICAgICAgICAgICAga1RyYWZmaWNSZWNvcmRlck1heEVudHJpZXMsIGtUcmFmZmljUmVjb3JkZXJNYXhUaW1lU3Bhbk1zKSkgeworICAgIENIRUNLX0dFKGZkLCAwKTsKKyAgICBtSXNJUHY2ID0gZmFsc2U7CisKKyAgICBtTG9vcGVyLT5zZXROYW1lKCJydHAgd3JpdGVyIik7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworICAgIG1Mb29wZXItPnN0YXJ0KCk7CisKKyAgICBtYWtlU29ja2V0UGFpckFuZEJpbmQobG9jYWxJcCwgbG9jYWxQb3J0LCByZW1vdGVJcCAsIHJlbW90ZVBvcnQpOworICAgIG1WUFNCdWYgPSBOVUxMOworICAgIG1TUFNCdWYgPSBOVUxMOworICAgIG1QUFNCdWYgPSBOVUxMOworCisgICAgaW5pdFN0YXRlKCk7CisgICAgbVNlcU5vID0gc2VxTm87ICAgICAvLyBNdXN0IHVzZSBleHBsaWNpdCAjIG9mIHNlcSBmb3IgUlRQIGNvbnRpbnVpdHkKIAogI2lmIExPR19UT19GSUxFUwogICAgIG1SVFBGZCA9IG9wZW4oCkBAIC04OSw2ICsxNjIsMjEgQEAKIH0KIAogQVJUUFdyaXRlcjo6fkFSVFBXcml0ZXIoKSB7CisgICAgaWYgKG1WUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtVlBTQnVmLT5yZWxlYXNlKCk7CisgICAgICAgIG1WUFNCdWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtU1BTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVNQU0J1Zi0+cmVsZWFzZSgpOworICAgICAgICBtU1BTQnVmID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobVBQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1QUFNCdWYtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBQU0J1ZiA9IE5VTEw7CisgICAgfQorCiAjaWYgTE9HX1RPX0ZJTEVTCiAgICAgY2xvc2UobVJUQ1BGZCk7CiAgICAgbVJUQ1BGZCA9IC0xOwpAQCAtOTcsMTMgKzE4NSwzOCBAQAogICAgIG1SVFBGZCA9IC0xOwogI2VuZGlmCiAKLSAgICBjbG9zZShtU29ja2V0KTsKLSAgICBtU29ja2V0ID0gLTE7CisgICAgY2xvc2UobVJUUFNvY2tldCk7CisgICAgbVJUUFNvY2tldCA9IC0xOworCisgICAgY2xvc2UobVJUQ1BTb2NrZXQpOworICAgIG1SVENQU29ja2V0ID0gLTE7CiAKICAgICBjbG9zZShtRmQpOwogICAgIG1GZCA9IC0xOwogfQogCit2b2lkIEFSVFBXcml0ZXI6OmluaXRTdGF0ZSgpIHsKKyAgICBpZiAobVNvdXJjZUlEID09IDApCisgICAgICAgIG1Tb3VyY2VJRCA9IHJhbmQoKTsKKyAgICBtUGF5bG9hZFR5cGUgPSAwOworICAgIGlmIChtU2VxTm8gPT0gMCkKKyAgICAgICAgbVNlcU5vID0gVW5pZm9ybVJhbmQoNjU1MzYpOworICAgIG1SVFBUaW1lQmFzZSA9IDA7CisgICAgbU51bVJUUFNlbnQgPSAwOworICAgIG1OdW1SVFBPY3RldHNTZW50ID0gMDsKKworICAgIG1PcHBvbmVudElEID0gMDsKKyAgICBtQml0cmF0ZSA9IDE5MjAwMDsKKworICAgIG1OdW1TUnNTZW50ID0gMDsKKyAgICBtUlRQQ1ZPRXh0TWFwID0gLTE7CisgICAgbVJUUENWT0RlZ3JlZXMgPSAwOworICAgIG1SVFBTb2NrTmV0d29yayA9IDA7CisKKyAgICBtTW9kZSA9IElOVkFMSUQ7CisgICAgbUNsb2NrUmF0ZSA9IDE2MDAwOworfQorCiBzdGF0dXNfdCBBUlRQV3JpdGVyOjphZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKICAgICBtU291cmNlID0gc291cmNlOwogICAgIHJldHVybiBPSzsKQEAgLTExNCwzNCArMjI3LDY1IEBACiAgICAgcmV0dXJuIChtRmxhZ3MgJiBrRmxhZ0VPUykgIT0gMDsKIH0KIAotc3RhdHVzX3QgQVJUUFdyaXRlcjo6c3RhcnQoTWV0YURhdGEgKiAvKiBwYXJhbXMgKi8pIHsKK3N0YXR1c190IEFSVFBXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhICogcGFyYW1zKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBtRmxhZ3MgJj0gfmtGbGFnRU9TOwotICAgIG1Tb3VyY2VJRCA9IHJhbmQoKTsKLSAgICBtU2VxTm8gPSBVbmlmb3JtUmFuZCg2NTUzNik7Ci0gICAgbVJUUFRpbWVCYXNlID0gcmFuZCgpOwotICAgIG1OdW1SVFBTZW50ID0gMDsKLSAgICBtTnVtUlRQT2N0ZXRzU2VudCA9IDA7Ci0gICAgbUxhc3RSVFBUaW1lID0gMDsKLSAgICBtTGFzdE5UUFRpbWUgPSAwOwotICAgIG1OdW1TUnNTZW50ID0gMDsKKyAgICBpbml0U3RhdGUoKTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgQ0hFQ0sobVNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKIAotICAgIG1Nb2RlID0gSU5WQUxJRDsKKyAgICBpbnQzMl90IHNlbGZJRCA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKGtLZXlTZWxmSUQsICZzZWxmSUQpKQorICAgICAgICBtU291cmNlSUQgPSBzZWxmSUQ7CisKKyAgICBpbnQzMl90IHBheWxvYWRUeXBlID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVBheWxvYWRUeXBlLCAmcGF5bG9hZFR5cGUpKQorICAgICAgICBtUGF5bG9hZFR5cGUgPSBwYXlsb2FkVHlwZTsKKworICAgIGludDMyX3QgcnRwRXh0TWFwID0gMDsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoa0tleVJ0cEV4dE1hcCwgJnJ0cEV4dE1hcCkpCisgICAgICAgIG1SVFBDVk9FeHRNYXAgPSBydHBFeHRNYXA7CisKKyAgICBpbnQzMl90IHJ0cENWT0RlZ3JlZXMgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5UnRwQ3ZvRGVncmVlcywgJnJ0cENWT0RlZ3JlZXMpKQorICAgICAgICBtUlRQQ1ZPRGVncmVlcyA9IHJ0cENWT0RlZ3JlZXM7CisKKyAgICBpbnQzMl90IGRzY3AgPSAwOworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihrS2V5UnRwRHNjcCwgJmRzY3ApKQorICAgICAgICB1cGRhdGVTb2NrZXREc2NwKGRzY3ApOworCisgICAgaW50NjRfdCBzb2NrTmV0d29yayA9IDA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KGtLZXlTb2NrZXROZXR3b3JrLCAmc29ja05ldHdvcmspKQorICAgICAgICB1cGRhdGVTb2NrZXROZXR3b3JrKHNvY2tOZXR3b3JrKTsKKwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CisgICAgICAgIC8vIHJmYzYxODQ6IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgSC4yNjQgVmlkZW8KKyAgICAgICAgLy8gVGhlIGNsb2NrIHJhdGUgaW4gdGhlICJhPXJ0cG1hcCIgbGluZSBNVVNUIGJlIDkwMDAwLgogICAgICAgICBtTW9kZSA9IEgyNjQ7CisgICAgICAgIG1DbG9ja1JhdGUgPSA5MDAwMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIC8vIHJmYzc3OTg6IFJUUCBQYXlsb2FkIEZvcm1hdCBmb3IgSGlnaCBFZmZpY2llbmN5IFZpZGVvIENvZGluZyAoSEVWQykKKyAgICAgICAgLy8gVGhlIGNsb2NrIHJhdGUgaW4gdGhlICJhPXJ0cG1hcCIgbGluZSBNVVNUIGJlIDkwMDAwLgorICAgICAgICBtTW9kZSA9IEgyNjU7CisgICAgICAgIG1DbG9ja1JhdGUgPSA5MDAwMDsKICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CiAgICAgICAgIG1Nb2RlID0gSDI2MzsKKyAgICAgICAgLy8gcmZjNDYyOTogUlRQIFBheWxvYWQgRm9ybWF0IGZvciBJVFUtVCBSZWMuIEguMjYzIFZpZGVvCisgICAgICAgIC8vIFRoZSBjbG9jayByYXRlIGluIHRoZSAiYT1ydHBtYXAiIGxpbmUgTVVTVCBiZSA5MDAwMC4KKyAgICAgICAgbUNsb2NrUmF0ZSA9IDkwMDAwOwogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSkgewogICAgICAgICBtTW9kZSA9IEFNUl9OQjsKKyAgICAgICAgLy8gcmZjNDg2NzogUlRQIFBheWxvYWQgRm9ybWF0IC4uLiAoQU1SKSBhbmQgKEFNUi1XQikKKyAgICAgICAgLy8gVGhlIFJUUCBjbG9jayByYXRlIGluICJhPXJ0cG1hcCIgTVVTVCBiZSA4MDAwIGZvciBBTVIgYW5kIDE2MDAwIGZvciBBTVItV0IKKyAgICAgICAgbUNsb2NrUmF0ZSA9IDgwMDA7CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpKSB7CiAgICAgICAgIG1Nb2RlID0gQU1SX1dCOworICAgICAgICBtQ2xvY2tSYXRlID0gMTYwMDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CkBAIC0xODcsMTEgKzMzMSwxMzggQEAKICAgICB9CiB9CiAKK3N0YXRpYyBjb25zdCB1aW50OF90IFNQQ1NpemUgPSA0OyAgICAgIC8vIFN0YXJ0IFByZWZpeCBDb2RlIFNpemUKK3N0YXRpYyBjb25zdCB1aW50OF90IHN0YXJ0UHJlZml4Q29kZVtTUENTaXplXSA9IHswLCAwLCAwLCAxfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHNwY0tNUGlkeFtTUENTaXplXSA9IHswLCAwLCAyLCAwfTsKK3N0YXRpYyB2b2lkIFNwc1Bwc1BhcnNlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqc3BzQnVmZmVyLCBNZWRpYUJ1ZmZlckJhc2UgKipwcHNCdWZmZXIpIHsKKworICAgIHdoaWxlIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICBjb25zdCB1aW50OF90ICpOQUxQdHIgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgdWludDhfdCBuYWxUeXBlID0gKCpOQUxQdHIpICYgSDI2NF9OQUxVX01BU0s7CisKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqdGFyZ2V0UHRyID0gTlVMTDsKKyAgICAgICAgaWYgKG5hbFR5cGUgPT0gSDI2NF9OQUxVX1NQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gc3BzQnVmZmVyOworICAgICAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSDI2NF9OQUxVX1BQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gcHBzQnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJTUFMoNykgb3IgUFBTKDgpIGZvdW5kLiBUeXBlICVkIiwgbmFsVHlwZSk7CisKKyAgICAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqJnRhcmdldCA9ICp0YXJnZXRQdHI7CisgICAgICAgIHVpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgICAgICAgYm9vbCBpc0JvdW5kRm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZmZlclNpemU7IGkrKykgeworICAgICAgICAgICAgd2hpbGUgKGogPiAwICYmIE5BTFB0cltpXSAhPSBzdGFydFByZWZpeENvZGVbal0pIHsKKyAgICAgICAgICAgICAgICBqID0gc3BjS01QaWR4W2ogLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOQUxQdHJbaV0gPT0gc3RhcnRQcmVmaXhDb2RlW2pdKSB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGlmIChqID09IFNQQ1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNCb3VuZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgdGFyZ2V0U2l6ZTsKKyAgICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0YXJnZXQtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3RlIHRoYXQgdGFyZ2V0U2l6ZSBpcyBuZXZlciAwIGFzIHRoZSBmaXJzdCBieXRlIGlzIG5ldmVyIHBhcnQKKyAgICAgICAgLy8gb2YgYSBzdGFydCBwcmVmaXgKKyAgICAgICAgaWYgKGlzQm91bmRGb3VuZCkgeworICAgICAgICAgICAgdGFyZ2V0U2l6ZSA9IGkgLSBTUENTaXplICsgMTsKKyAgICAgICAgICAgIHRhcmdldCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKHRhcmdldFNpemUpOworICAgICAgICAgICAgbWVtY3B5KHRhcmdldC0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgIHRhcmdldFNpemUpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIHRhcmdldFNpemUgKyBTUENTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIHRhcmdldFNpemUgLSBTUENTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRhcmdldFNpemUgPSBidWZmZXJTaXplOworICAgICAgICAgICAgdGFyZ2V0ID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUodGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkodGFyZ2V0LT5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZShidWZmZXItPnJhbmdlX29mZnNldCgpICsgYnVmZmVyU2l6ZSwgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFZwc1Nwc1Bwc1BhcnNlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqdnBzQnVmZmVyLCBNZWRpYUJ1ZmZlckJhc2UgKipzcHNCdWZmZXIsIE1lZGlhQnVmZmVyQmFzZSAqKnBwc0J1ZmZlcikgeworCisgICAgd2hpbGUgKGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKk5BTFB0ciA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgICAgICB1aW50OF90IG5hbFR5cGUgPSAoKCpOQUxQdHIpID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqdGFyZ2V0UHRyID0gTlVMTDsKKyAgICAgICAgaWYgKG5hbFR5cGUgPT0gSDI2NV9OQUxVX1ZQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gdnBzQnVmZmVyOworICAgICAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSDI2NV9OQUxVX1NQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gc3BzQnVmZmVyOworICAgICAgICB9IGVsc2UgaWYgKG5hbFR5cGUgPT0gSDI2NV9OQUxVX1BQUykgeworICAgICAgICAgICAgdGFyZ2V0UHRyID0gcHBzQnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJWUFMoMzIpIFNQUygzMykgb3IgUFBTKDM0KSBmb3VuZC4gVHlwZSAlZCIsIG5hbFR5cGUpOworCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKiZ0YXJnZXQgPSAqdGFyZ2V0UHRyOworICAgICAgICB1aW50MzJfdCBpID0gMCwgaiA9IDA7CisgICAgICAgIGJvb2wgaXNCb3VuZEZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJTaXplOyBpKyspIHsKKyAgICAgICAgICAgIHdoaWxlIChqID4gMCAmJiBOQUxQdHJbaV0gIT0gc3RhcnRQcmVmaXhDb2RlW2pdKSB7CisgICAgICAgICAgICAgICAgaiA9IHNwY0tNUGlkeFtqIC0gMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTkFMUHRyW2ldID09IHN0YXJ0UHJlZml4Q29kZVtqXSkgeworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBTUENTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGlzQm91bmRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHRhcmdldFNpemU7CisgICAgICAgIGlmICh0YXJnZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgdGFyZ2V0LT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm90ZSB0aGF0IHRhcmdldFNpemUgaXMgbmV2ZXIgMCBhcyB0aGUgZmlyc3QgYnl0ZSBpcyBuZXZlciBwYXJ0CisgICAgICAgIC8vIG9mIGEgc3RhcnQgcHJlZml4CisgICAgICAgIGlmIChpc0JvdW5kRm91bmQpIHsKKyAgICAgICAgICAgIHRhcmdldFNpemUgPSBpIC0gU1BDU2l6ZSArIDE7CisgICAgICAgICAgICB0YXJnZXQgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSh0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIG1lbWNweSh0YXJnZXQtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICB0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyB0YXJnZXRTaXplICsgU1BDU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSB0YXJnZXRTaXplIC0gU1BDU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXRTaXplID0gYnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIHRhcmdldCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKHRhcmdldFNpemUpOworICAgICAgICAgICAgbWVtY3B5KHRhcmdldC0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgIHRhcmdldFNpemUpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGJ1ZmZlclNpemUsIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEFSVFBXcml0ZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKG1Tb3VyY2UtPnN0YXJ0KCksIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleVRpbWUsIDEwbGwpOworICAgICAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZS0+c3RhcnQobWV0YS5nZXQoKSksIChzdGF0dXNfdClPSyk7CiAKICNpZiAwCiAgICAgICAgICAgICBpZiAobU1vZGUgPT0gSDI2NCkgewpAQCAtMjY0LDYgKzUzNSwxOCBAQAogICAgIH0KIH0KIAordm9pZCBBUlRQV3JpdGVyOjpzZXRUTU1CTkluZm8odWludDMyX3Qgb3Bwb25lbnRJRCwgdWludDMyX3QgYml0cmF0ZSkgeworICAgIG1PcHBvbmVudElEID0gb3Bwb25lbnRJRDsKKyAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcig2NTUzNik7CisgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIGFkZFRNTUJOKGJ1ZmZlcik7CisKKyAgICBzZW5kKGJ1ZmZlciwgdHJ1ZSAvKiBpc1JUQ1AgKi8pOworfQorCiB2b2lkIEFSVFBXcml0ZXI6Om9uUmVhZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWY7CiAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmbWVkaWFCdWYpOwpAQCAtMjgxLDcgKzU2NCwxNiBAQAogCiAgICAgICAgIGlmIChtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShtZWRpYUJ1Zik7Ci0gICAgICAgICAgICBzZW5kQVZDRGF0YShtZWRpYUJ1Zik7CisgICAgICAgICAgICBTcHNQcHNQYXJzZXIobWVkaWFCdWYsICZtU1BTQnVmLCAmbVBQU0J1Zik7CisgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNlbmRBVkNEYXRhKG1lZGlhQnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBIMjY1KSB7CisgICAgICAgICAgICBTdHJpcFN0YXJ0Y29kZShtZWRpYUJ1Zik7CisgICAgICAgICAgICBWcHNTcHNQcHNQYXJzZXIobWVkaWFCdWYsICZtVlBTQnVmLCAmbVNQU0J1ZiwgJm1QUFNCdWYpOworICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzZW5kSEVWQ0RhdGEobWVkaWFCdWYpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEgyNjMpIHsKICAgICAgICAgICAgIHNlbmRIMjYzRGF0YShtZWRpYUJ1Zik7CiAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gQU1SX05CIHx8IG1Nb2RlID09IEFNUl9XQikgewpAQCAtMzA5LDEyICs2MDEsMzkgQEAKIH0KIAogdm9pZCBBUlRQV3JpdGVyOjpzZW5kKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsIGJvb2wgaXNSVENQKSB7Ci0gICAgc3NpemVfdCBuID0gc2VuZHRvKAotICAgICAgICAgICAgbVNvY2tldCwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCAwLAotICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKShpc1JUQ1AgPyAmbVJUQ1BBZGRyIDogJm1SVFBBZGRyKSwKLSAgICAgICAgICAgIHNpemVvZihtUlRDUEFkZHIpKTsKKyAgICBpbnQgc2l6ZVNvY2tTdDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKnJlbUFkZHI7CiAKLSAgICBDSEVDS19FUShuLCAoc3NpemVfdClidWZmZXItPnNpemUoKSk7CisgICAgaWYgKG1Jc0lQdjYpIHsKKyAgICAgICAgc2l6ZVNvY2tTdCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyAgICAgICAgaWYgKGlzUlRDUCkKKyAgICAgICAgICAgIHJlbUFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJm1SVENQQWRkcjY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbUFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJm1SVFBBZGRyNjsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplU29ja1N0ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisgICAgICAgIGlmIChpc1JUQ1ApCisgICAgICAgICAgICByZW1BZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZtUlRDUEFkZHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlbUFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJm1SVFBBZGRyOworICAgIH0KKworICAgIC8vIFVuc2VhbCBjb2RlIGlmIG1vZGVyYXRvciBpcyBuZWVkZWQgKHByZXZlbnQgb3ZlcmZsb3cgb2YgaW5zdGFudCBiYW5kd2lkdGgpCisgICAgLy8gU2V0IGxpbWl0IGJpdHMgcGVyIHBlcmlvZCB0aHJvdWdoIHRoZSBtb2RlcmF0b3IuCisgICAgLy8gZXgpIDZLQnl0ZS8xMG1zID0gNDhLQml0LzEwbXMgPSA0LjhNQml0L3MgaW5zdGFudCBsaW1pdAorICAgIC8vIE1vZGVyYXRlSW5zdGFudFRyYWZmaWMoMTAsIDYgKiAxMDI0KTsKKworICAgIHNzaXplX3QgbiA9IHNlbmR0byhpc1JUQ1AgPyBtUlRDUFNvY2tldCA6IG1SVFBTb2NrZXQsCisgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIDAsIHJlbUFkZHIsIHNpemVTb2NrU3QpOworCisgICAgaWYgKG4gIT0gKHNzaXplX3QpYnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgQUxPR1coInBhY2tldHMgY2FuIG5vdCBiZSBzZW50LiByZXQ9JWQsIGJ1Zj0lZCIsIChpbnQpbiwgKGludClidWZmZXItPnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVjb3JkIGN1cnJlbnQgdHJhZmZpYyAmIFByaW50IGJpdHMgd2hpbGUgbGFzdCAxc2VjICgxMDAwbXMpCisgICAgICAgIG1UcmFmZmljUmVjLT53cml0ZUJ5dGVzKGJ1ZmZlci0+c2l6ZSgpICsKKyAgICAgICAgICAgICAgICAobUlzSVB2NiA/IFRDUElQVjZfSEVBREVSX1NJWkUgOiBUQ1BJUFY0X0hFQURFUl9TSVpFKSk7CisgICAgICAgIG1UcmFmZmljUmVjLT5wcmludEFjY3VCaXRzRm9yTGFzdFBlcmlvZCgxMDAwLCAxMDAwKTsKKyAgICB9CiAKICNpZiBMT0dfVE9fRklMRVMKICAgICBpbnQgZmQgPSBpc1JUQ1AgPyBtUlRDUEZkIDogbVJUUEZkOwpAQCAtMzM5LDE5ICs2NTgsMjcgQEAKICAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CiAgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CiAKLSAgICBkYXRhWzhdID0gbUxhc3ROVFBUaW1lID4+ICg2NCAtIDgpOwotICAgIGRhdGFbOV0gPSAobUxhc3ROVFBUaW1lID4+ICg2NCAtIDE2KSkgJiAweGZmOwotICAgIGRhdGFbMTBdID0gKG1MYXN0TlRQVGltZSA+PiAoNjQgLSAyNCkpICYgMHhmZjsKLSAgICBkYXRhWzExXSA9IChtTGFzdE5UUFRpbWUgPj4gMzIpICYgMHhmZjsKLSAgICBkYXRhWzEyXSA9IChtTGFzdE5UUFRpbWUgPj4gMjQpICYgMHhmZjsKLSAgICBkYXRhWzEzXSA9IChtTGFzdE5UUFRpbWUgPj4gMTYpICYgMHhmZjsKLSAgICBkYXRhWzE0XSA9IChtTGFzdE5UUFRpbWUgPj4gOCkgJiAweGZmOwotICAgIGRhdGFbMTVdID0gbUxhc3ROVFBUaW1lICYgMHhmZjsKKyAgICB1aW50NjRfdCBudHBUaW1lID0gR2V0Tm93TlRQKCk7CisgICAgZGF0YVs4XSA9IG50cFRpbWUgPj4gKDY0IC0gOCk7CisgICAgZGF0YVs5XSA9IChudHBUaW1lID4+ICg2NCAtIDE2KSkgJiAweGZmOworICAgIGRhdGFbMTBdID0gKG50cFRpbWUgPj4gKDY0IC0gMjQpKSAmIDB4ZmY7CisgICAgZGF0YVsxMV0gPSAobnRwVGltZSA+PiAzMikgJiAweGZmOworICAgIGRhdGFbMTJdID0gKG50cFRpbWUgPj4gMjQpICYgMHhmZjsKKyAgICBkYXRhWzEzXSA9IChudHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxNF0gPSAobnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxNV0gPSBudHBUaW1lICYgMHhmZjsKIAotICAgIGRhdGFbMTZdID0gKG1MYXN0UlRQVGltZSA+PiAyNCkgJiAweGZmOwotICAgIGRhdGFbMTddID0gKG1MYXN0UlRQVGltZSA+PiAxNikgJiAweGZmOwotICAgIGRhdGFbMThdID0gKG1MYXN0UlRQVGltZSA+PiA4KSAmIDB4ZmY7Ci0gICAgZGF0YVsxOV0gPSBtTGFzdFJUUFRpbWUgJiAweGZmOworICAgIC8vIEEgY3VycmVudCBydHBUaW1lIGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gQUxvb3Blcjo6R2V0Tm93VXMoKS4KKyAgICAvLyBUaGlzIGlzIGV4cGVjdGluZyBhIHRpbWVzdGFtcCBvZiByYXcgZnJhbWUgZnJvbSBhIG1lZGlhIHNvdXJjZSBpcworICAgIC8vIG9uIHRoZSBzYW1lIHRpbWUgY29udGV4dCBhY3Jvc3MgY29tcG9uZW50cyBpbiBhbmRyb2lkIG1lZGlhIGZyYW1ld29yaworICAgIC8vIHdoaWNoIGNhbiBiZSBxdWVyaWVkIGJ5IEFMb29wZXI6OkdldE5vd1VzKCkuCisgICAgLy8gSW4gb3RoZXIgd29yZHMsIEFMb29wZXI6OkdldE5vd1VzKCkgaXMgb24gdGhlIHNhbWUgdGltZWxpbmUgYXMgdGhlIHRpbWUKKyAgICAvLyBvZiBrS2V5VGltZSBpbiBhIE1lZGlhQnVmZmVyQmFzZQorICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBnZXRSdHBUaW1lKEFMb29wZXI6OkdldE5vd1VzKCkpOworICAgIGRhdGFbMTZdID0gKHJ0cFRpbWUgPj4gMjQpICYgMHhmZjsKKyAgICBkYXRhWzE3XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgZGF0YVsxOF0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVsxOV0gPSBydHBUaW1lICYgMHhmZjsKIAogICAgIGRhdGFbMjBdID0gbU51bVJUUFNlbnQgPj4gMjQ7CiAgICAgZGF0YVsyMV0gPSAobU51bVJUUFNlbnQgPj4gMTYpICYgMHhmZjsKQEAgLTM3OSw3ICs3MDYsNiBAQAogCiAgICAgZGF0YVtvZmZzZXQrK10gPSAxOyAgLy8gQ05BTUUKIAotICAgIHN0YXRpYyBjb25zdCBjaGFyICprQ05BTUUgPSAic29tZW9uZUBzb21ld2hlcmUiOwogICAgIGRhdGFbb2Zmc2V0KytdID0gc3RybGVuKGtDTkFNRSk7CiAKICAgICBtZW1jcHkoJmRhdGFbb2Zmc2V0XSwga0NOQU1FLCBzdHJsZW4oa0NOQU1FKSk7CkBAIC00MTYsOSArNzQyLDU1IEBACiAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSArIG9mZnNldCk7CiB9CiAKK3ZvaWQgQVJUUFdyaXRlcjo6YWRkVE1NQk4oY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXItPnNpemUoKSArIDIwID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dXKCJSVENQIGJ1ZmZlciB0b28gc21hbGwgdG8gYWNjb21tb2RhdGUgU1IuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1PcHBvbmVudElEID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+c2l6ZSgpOworCisgICAgZGF0YVswXSA9IDB4ODAgfCA0OyAvLyBUTU1CTgorICAgIGRhdGFbMV0gPSAyMDU7ICAgICAgLy8gVFNGQgorICAgIGRhdGFbMl0gPSAwOworICAgIGRhdGFbM10gPSA0OyAgICAgICAgLy8gdG90YWwgKDQrMSkgKiBzaXplb2YoaW50MzJfdCkgPSAyMCBieXRlcworICAgIGRhdGFbNF0gPSBtU291cmNlSUQgPj4gMjQ7CisgICAgZGF0YVs1XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICBkYXRhWzZdID0gKG1Tb3VyY2VJRCA+PiA4KSAmIDB4ZmY7CisgICAgZGF0YVs3XSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CisKKyAgICAqKGludDMyX3QqKSgmZGF0YVs4XSkgPSAwOyAgLy8gNCBieXRlcyBibGFuaworCisgICAgZGF0YVsxMl0gPSBtT3Bwb25lbnRJRCA+PiAyNDsKKyAgICBkYXRhWzEzXSA9IChtT3Bwb25lbnRJRCA+PiAxNikgJiAweGZmOworICAgIGRhdGFbMTRdID0gKG1PcHBvbmVudElEID4+IDgpICYgMHhmZjsKKyAgICBkYXRhWzE1XSA9IG1PcHBvbmVudElEICYgMHhmZjsKKworICAgIC8vIEZpbmQgdGhlIGZpcnN0IGJpdCAnMScgZnJvbSBsZWZ0ICYgcmlnaHQgc2lkZSBvZiB0aGUgdmFsdWUuCisgICAgaW50MzJfdCBsZWZ0RW5kID0gMzEgLSBfX2J1aWx0aW5fY2x6KG1CaXRyYXRlKTsKKyAgICBpbnQzMl90IHJpZ2h0RW5kID0gZmZzKG1CaXRyYXRlKSAtIDE7CisKKyAgICAvLyBNYW50aXNzYSBoYXZlIG9ubHkgMTdiaXQgc3BhY2UgYnkgUlRDUCBzcGVjaWZpY2F0aW9uLgorICAgIGlmICgobGVmdEVuZCAtIHJpZ2h0RW5kKSA+IDE2KSB7CisgICAgICAgIHJpZ2h0RW5kID0gbGVmdEVuZCAtIDE2OworICAgIH0KKyAgICBpbnQzMl90IG1hbnRpc3NhID0gbUJpdHJhdGUgPj4gcmlnaHRFbmQ7CisKKyAgICBkYXRhWzE2XSA9ICgocmlnaHRFbmQgPDwgMikgJiAweGZjKSB8ICgobWFudGlzc2EgJiAweDE4MDAwKSA+PiAxNSk7CisgICAgZGF0YVsxN10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hbnRpc3NhICYgMHgwN2Y4MCkgPj4gNzsKKyAgICBkYXRhWzE4XSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFudGlzc2EgJiAweDAwMDdmKSA8PCAxOworICAgIGRhdGFbMTldID0gNDA7ICAgICAgICAgICAgICAvLyA0MCBieXRlcyBvdmVyaGVhZDsKKworICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkgKyAyMCk7CisKKyAgICBBTE9HSSgiVUUgLT4gT3AgTm90aSBUeCBiaXRyYXRlIDogJWQgIiwgbWFudGlzc2EgPDwgcmlnaHRFbmQpOworfQorCiAvLyBzdGF0aWMKIHVpbnQ2NF90IEFSVFBXcml0ZXI6OkdldE5vd05UUCgpIHsKLSAgICB1aW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgdWludDY0X3Qgbm93VXMgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1JFQUxUSU1FKSAvIDEwMDBsbDsKIAogICAgIG5vd1VzICs9ICgoNzBMTCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwTEw7CiAKQEAgLTQyOCw2ICs4MDAsMTMgQEAKICAgICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwogfQogCit1aW50MzJfdCBBUlRQV3JpdGVyOjpnZXRSdHBUaW1lKGludDY0X3QgdGltZVVzKSB7CisgICAgaW50MzJfdCBjbG9ja1Blck1zID0gbUNsb2NrUmF0ZSAvIDEwMDA7CisgICAgaW50NjRfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIGNsb2NrUGVyTXMgLyAxMDAwTEwpOworCisgICAgcmV0dXJuICh1aW50MzJfdClydHBUaW1lOworfQorCiB2b2lkIEFSVFBXcml0ZXI6OmR1bXBTZXNzaW9uRGVzYygpIHsKICAgICBBU3RyaW5nIHNkcDsKICAgICBzZHAgPSAidj0wXHJcbiI7CkBAIC00NjMsNyArODQyLDcgQEAKICAgICAgICAgc2RwLmFwcGVuZCgibT1hdWRpbyAiKTsKICAgICB9CiAKLSAgICBzZHAuYXBwZW5kKEFTdHJpbmdQcmludGYoIiVkIiwgbnRvaHMobVJUUEFkZHIuc2luX3BvcnQpKSk7CisgICAgc2RwLmFwcGVuZChBU3RyaW5nUHJpbnRmKCIlZCIsIG1Jc0lQdjYgPyBudG9ocyhtUlRQQWRkcjYuc2luNl9wb3J0KSA6IG50b2hzKG1SVFBBZGRyLnNpbl9wb3J0KSkpOwogICAgIHNkcC5hcHBlbmQoCiAgICAgICAgICAgIiBSVFAvQVZQICIgUFRfU1RSICJcclxuIgogICAgICAgICAgICJiPUFTIDMyMDAwMFxyXG4iCkBAIC01NjksMjQgKzk0OCw5MyBAQAogICAgIHNlbmQoYnVmZmVyLCB0cnVlIC8qIGlzUlRDUCAqLyk7CiB9CiAKLXZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zikgewordm9pZCBBUlRQV3JpdGVyOjpzZW5kU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpZiAoKG1lZGlhRGF0YVswXSAmIEgyNjRfTkFMVV9NQVNLKSAhPSBIMjY0X05BTFVfSUZSQU1FKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVNQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1TUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtU1BTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5U3BzLCAxKTsKKyAgICAgICAgc2VuZEFWQ0RhdGEobVNQU0J1Zik7CisgICAgfQorCisgICAgaWYgKG1QUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtUFBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVBQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVBwcywgMSk7CisgICAgICAgIHNlbmRBVkNEYXRhKG1QUFNCdWYpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kVlBTU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpbnQgbmFsVHlwZSA9ICgobWVkaWFEYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0spOworICAgIGlmICghKG5hbFR5cGUgPj0gMTYgJiYgbmFsVHlwZSA8PSAyMSkgLypIMjY1X05BTFVfSUZSQU1FKi8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtVlBTQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVZQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgIG1WUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWcHMsIDEpOworICAgICAgICBzZW5kSEVWQ0RhdGEobVZQU0J1Zik7CisgICAgfQorCisgICAgaWYgKG1TUFNCdWYgIT0gTlVMTCkgeworICAgICAgICBtU1BTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgbVNQU0J1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVNwcywgMSk7CisgICAgICAgIHNlbmRIRVZDRGF0YShtU1BTQnVmKTsKKyAgICB9CisKKyAgICBpZiAobVBQU0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1QUFNCdWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICBtUFBTQnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5UHBzLCAxKTsKKyAgICAgICAgc2VuZEhFVkNEYXRhKG1QUFNCdWYpOworICAgIH0KK30KKwordm9pZCBBUlRQV3JpdGVyOjpzZW5kSEVWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgewogICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCiAgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKIAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMExMKTsKKyAgICBzZW5kVlBTU1BTUFBTSWZJRnJhbWUobWVkaWFCdWYsIHRpbWVVcyk7CiAKKyAgICB1aW50MzJfdCBydHBUaW1lID0gZ2V0UnRwVGltZSh0aW1lVXMpOworCisgICAgQ0hFQ0sobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpID4gMCk7CiAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOwogCisgICAgaW50MzJfdCBpc05vblZDTCA9IDA7CisgICAgaWYgKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVZwcywgJmlzTm9uVkNMKSB8fAorICAgICAgICAgICAgbWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5U3BzLCAmaXNOb25WQ0wpIHx8CisgICAgICAgICAgICBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlQcHMsICZpc05vblZDTCkpIHsKKyAgICAgICAgaXNOb25WQ0wgPSAxOworICAgIH0KKwogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGtNYXhQYWNrZXRTaXplKTsKLSAgICBpZiAobWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpICsgMTIgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRQorICAgICAgICAgICAgKyBSVFBfUEFZTE9BRF9ST09NX1NJWkUgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CiAgICAgICAgIC8vIFRoZSBkYXRhIGZpdHMgaW50byBhIHNpbmdsZSBwYWNrZXQKICAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICBkYXRhWzBdID0gMHg4MDsKLSAgICAgICAgZGF0YVsxXSA9ICgxIDw8IDcpIHwgUFQ7ICAvLyBNLWJpdAorICAgICAgICBpZiAobVJUUENWT0V4dE1hcCA+IDApIHsKKyAgICAgICAgICAgIGRhdGFbMF0gfD0gMHgxMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNOb25WQ0wpIHsKKyAgICAgICAgICAgIGRhdGFbMV0gPSBtUGF5bG9hZFR5cGU7ICAvLyBNYXJrZXIgYml0IHNob3VsZCBub3QgYmUgc2V0IGluIGNhc2Ugb2YgTm9uLVZDTAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YVsxXSA9ICgxIDw8IDcpIHwgbVBheWxvYWRUeXBlOyAgLy8gTS1iaXQKKyAgICAgICAgfQogICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CiAgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOwogICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKQEAgLTU5OCwzNCArMTA0Niw3NSBAQAogICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOwogICAgICAgICBkYXRhWzExXSA9IG1Tb3VyY2VJRCAmIDB4ZmY7CiAKLSAgICAgICAgbWVtY3B5KCZkYXRhWzEyXSwKKyAgICAgICAgaW50IHJ0cEV4dEluZGV4ID0gMDsKKyAgICAgICAgaWYgKG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgIHwgICAgICAgMHhCRSAgICB8ICAgIDB4REUgICAgICAgfCAgICAgICAgICAgbGVuZ3RoPTMgICAgICAgICAgICB8CisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgfCAgSUQgICB8IEw9MCAgIHwgICAgIGRhdGEgICAgICB8ICBJRCAgIHwgIEw9MSAgfCAgIGRhdGEuLi4KKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhICAgfCAgICAwIChwYWQpICAgIHwgICAgMCAocGFkKSAgICB8ICBJRCAgIHwgTD0zICAgfAorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisKKyAgICAgICAgICAgICAgSW4gdGhlIG9uZS1ieXRlIGhlYWRlciBmb3JtIG9mIGV4dGVuc2lvbnMsIHRoZSAxNi1iaXQgdmFsdWUgcmVxdWlyZWQKKyAgICAgICAgICAgICAgYnkgdGhlIFJUUCBzcGVjaWZpY2F0aW9uIGZvciBhIGhlYWRlciBleHRlbnNpb24sIGxhYmVsZWQgaW4gdGhlIFJUUAorICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIGFzICJkZWZpbmVkIGJ5IHByb2ZpbGUiLCB0YWtlcyB0aGUgZml4ZWQgYml0IHBhdHRlcm4KKyAgICAgICAgICAgICAgMHhCRURFICh0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gd2FzIHdyaXR0ZW4gb24gdGhlCisgICAgICAgICAgICAgIGZlYXN0IGRheSBvZiB0aGUgVmVuZXJhYmxlIEJlZGUpLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRhdGFbMTJdID0gMHhCRTsKKyAgICAgICAgICAgIGRhdGFbMTNdID0gMHhERTsKKyAgICAgICAgICAgIC8vIHB1dCBhIGxlbmd0aCBvZiBSVFAgRXh0ZW5zaW9uLgorICAgICAgICAgICAgZGF0YVsxNF0gPSAweDAwOworICAgICAgICAgICAgZGF0YVsxNV0gPSAweDAxOworICAgICAgICAgICAgLy8gcHV0IGV4dG1hcCBvZiBSVFAgYXNzaWduZWQgZm9yIENWTy4KKyAgICAgICAgICAgIGRhdGFbMTZdID0gKG1SVFBDVk9FeHRNYXAgPDwgNCkgfCAweDA7CisgICAgICAgICAgICAvLyBwdXQgaW1hZ2UgZGVncmVlcyBhcyBwZXIgQ1ZPIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICBkYXRhWzE3XSA9IG1SVFBDVk9EZWdyZWVzOworICAgICAgICAgICAgZGF0YVsxOF0gPSAweDA7CisgICAgICAgICAgICBkYXRhWzE5XSA9IDB4MDsKKyAgICAgICAgICAgIHJ0cEV4dEluZGV4ID0gODsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweSgmZGF0YVsxMiArIHJ0cEV4dEluZGV4XSwKICAgICAgICAgICAgICAgIG1lZGlhRGF0YSwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKTsKIAotICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSArIDEyKTsKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyAoMTIgKyBydHBFeHRJbmRleCkpOwogCiAgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOwogCiAgICAgICAgICsrbVNlcU5vOwogICAgICAgICArK21OdW1SVFBTZW50OwotICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOworICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtICgxMiArIHJ0cEV4dEluZGV4KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGVS1BCiAKLSAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG1lZGlhRGF0YVswXTsKLSAgICAgICAgc2l6ZV90IG9mZnNldCA9IDE7CisgICAgICAgIHVuc2lnbmVkIG5hbFR5cGUgPSAobWVkaWFEYXRhWzBdID4+IDEpICYgSDI2NV9OQUxVX01BU0s7CisgICAgICAgIEFMT0dWKCJIMjY1IG5hbFR5cGUgMHgleCwgZGF0YVswXT0weCV4IiwgbmFsVHlwZSwgbWVkaWFEYXRhWzBdKTsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDI7IC8vSDI2NSBwYXlsb2FkIGhlYWRlciBpcyAxNiBiaXQuCiAKICAgICAgICAgYm9vbCBmaXJzdFBhY2tldCA9IHRydWU7CiAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkpIHsKICAgICAgICAgICAgIHNpemVfdCBzaXplID0gbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpIC0gb2Zmc2V0OwogICAgICAgICAgICAgYm9vbCBsYXN0UGFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzaXplICsgMTIgKyAyID4gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICBpZiAoc2l6ZSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRSArCisgICAgICAgICAgICAgICAgICAgIFJUUF9GVV9IRUFERVJfU0laRSArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgewogICAgICAgICAgICAgICAgIGxhc3RQYWNrZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gMTIgLSAyOworICAgICAgICAgICAgICAgIHNpemUgPSBidWZmZXItPmNhcGFjaXR5KCkgLSBUQ1BJUF9IRUFERVJfU0laRSAtIFJUUF9IRUFERVJfU0laRSAtCisgICAgICAgICAgICAgICAgICAgIFJUUF9IRUFERVJfRVhUX1NJWkUgLSBSVFBfRlVfSEVBREVSX1NJWkUgLSBSVFBfUEFZTE9BRF9ST09NX1NJWkU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICAgICAgZGF0YVsxXSA9IChsYXN0UGFja2V0ID8gKDEgPDwgNykgOiAweDAwKSB8IFBUOyAgLy8gTS1iaXQKKyAgICAgICAgICAgIGlmIChsYXN0UGFja2V0ICYmIG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgZGF0YVswXSB8PSAweDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YVsxXSA9IChsYXN0UGFja2V0ID8gKDEgPDwgNykgOiAweDAwKSB8IG1QYXlsb2FkVHlwZTsgIC8vIE0tYml0CiAgICAgICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CiAgICAgICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKICAgICAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OwpAQCAtNjM3LDMyICsxMTI2LDI0NyBAQAogICAgICAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKICAgICAgICAgICAgIGRhdGFbMTFdID0gbVNvdXJjZUlEICYgMHhmZjsKIAotICAgICAgICAgICAgZGF0YVsxMl0gPSAyOCB8IChuYWxUeXBlICYgMHhlMCk7CisgICAgICAgICAgICBpbnQgcnRwRXh0SW5kZXggPSAwOworICAgICAgICAgICAgaWYgKGxhc3RQYWNrZXQgJiYgbVJUUENWT0V4dE1hcCA+IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhWzEyXSA9IDB4QkU7CisgICAgICAgICAgICAgICAgZGF0YVsxM10gPSAweERFOworICAgICAgICAgICAgICAgIGRhdGFbMTRdID0gMHgwMDsKKyAgICAgICAgICAgICAgICBkYXRhWzE1XSA9IDB4MDE7CisgICAgICAgICAgICAgICAgZGF0YVsxNl0gPSAobVJUUENWT0V4dE1hcCA8PCA0KSB8IDB4MDsKKyAgICAgICAgICAgICAgICBkYXRhWzE3XSA9IG1SVFBDVk9EZWdyZWVzOworICAgICAgICAgICAgICAgIGRhdGFbMThdID0gMHgwOworICAgICAgICAgICAgICAgIGRhdGFbMTldID0gMHgwOworICAgICAgICAgICAgICAgIHJ0cEV4dEluZGV4ID0gODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogIEgyNjUgcGF5bG9hZCBoZWFkZXIgaXMgMTYgYml0CisgICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNyAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgICB8RnwgICAgVHlwZSAgIHwgIExheWVyIElEIHwgVElEIHwKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBBTE9HVigiSDI2NSBwYXlsb2FkIGhlYWRlciAweCV4ICV4IiwgbWVkaWFEYXRhWzBdLCBtZWRpYURhdGFbMV0pOworICAgICAgICAgICAgLy8gZXhjbHVkZXMgVHlwZSBmcm9tIDFzdCBieXRlIG9mIEgyNjUgcGF5bG9hZCBoZWFkZXIuCisgICAgICAgICAgICBkYXRhWzEyICsgcnRwRXh0SW5kZXhdID0gbWVkaWFEYXRhWzBdICYgMHg4MTsKKyAgICAgICAgICAgIC8vIGZpbGxzIFR5cGUgYXMgRlUgKDQ5ID09IDB4MzEpCisgICAgICAgICAgICBkYXRhWzEyICsgcnRwRXh0SW5kZXhdID0gZGF0YVsxMiArIHJ0cEV4dEluZGV4XSB8ICgweDMxIDw8IDEpOworICAgICAgICAgICAgZGF0YVsxMyArIHJ0cEV4dEluZGV4XSA9IG1lZGlhRGF0YVsxXTsKKworICAgICAgICAgICAgQUxPR1YoIkgyNjUgRlUgaGVhZGVyIDB4JXggJXgiLCBkYXRhWzEyICsgcnRwRXh0SW5kZXhdLCBkYXRhWzEzICsgcnRwRXh0SW5kZXhdKTsKIAogICAgICAgICAgICAgQ0hFQ0soIWZpcnN0UGFja2V0IHx8ICFsYXN0UGFja2V0KTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgRlUgSU5ESUNBVE9SIEhEUgorICAgICAgICAgICAgICAgICAwIDEgMiAzIDQgNSA2IDcKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgIHxTfEV8ICAgVHlwZSAgICB8CisgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgIGRhdGFbMTNdID0KKyAgICAgICAgICAgIGRhdGFbMTQgKyBydHBFeHRJbmRleF0gPQogICAgICAgICAgICAgICAgIChmaXJzdFBhY2tldCA/IDB4ODAgOiAweDAwKQogICAgICAgICAgICAgICAgIHwgKGxhc3RQYWNrZXQgPyAweDQwIDogMHgwMCkKLSAgICAgICAgICAgICAgICB8IChuYWxUeXBlICYgMHgxZik7CisgICAgICAgICAgICAgICAgfCAobmFsVHlwZSAmIEgyNjVfTkFMVV9NQVNLKTsKKyAgICAgICAgICAgIEFMT0dWKCJIMjY1IEZVIGluZGljYXRvciAweCV4IiwgZGF0YVsxNF0pOwogCi0gICAgICAgICAgICBtZW1jcHkoJmRhdGFbMTRdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOworICAgICAgICAgICAgbWVtY3B5KCZkYXRhWzE1ICsgcnRwRXh0SW5kZXhdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOwogCi0gICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE0ICsgc2l6ZSk7CisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE1ICsgcnRwRXh0SW5kZXggKyBzaXplKTsKIAogICAgICAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CiAKICAgICAgICAgICAgICsrbVNlcU5vOwogICAgICAgICAgICAgKyttTnVtUlRQU2VudDsKLSAgICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gMTI7CisgICAgICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtICgxMiArIHJ0cEV4dEluZGV4KTsKIAogICAgICAgICAgICAgZmlyc3RQYWNrZXQgPSBmYWxzZTsKICAgICAgICAgICAgIG9mZnNldCArPSBzaXplOwogICAgICAgICB9CiAgICAgfQorfQogCi0gICAgbUxhc3RSVFBUaW1lID0gcnRwVGltZTsKLSAgICBtTGFzdE5UUFRpbWUgPSBHZXROb3dOVFAoKTsKK3ZvaWQgQVJUUFdyaXRlcjo6c2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZikgeworICAgIC8vIDEyIGJ5dGVzIFJUUCBoZWFkZXIgKyAyIGJ5dGVzIGZvciB0aGUgRlUtaW5kaWNhdG9yIGFuZCBGVS1oZWFkZXIuCisgICAgQ0hFQ0tfR0Uoa01heFBhY2tldFNpemUsIDEydSArIDJ1KTsKKworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKworICAgIHNlbmRTUFNQUFNJZklGcmFtZShtZWRpYUJ1ZiwgdGltZVVzKTsKKworICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBnZXRSdHBUaW1lKHRpbWVVcyk7CisKKyAgICBDSEVDSyhtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPiAwKTsKKyAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CisKKyAgICBpbnQzMl90IHNwcywgcHBzOworICAgIGJvb2wgaXNTcHNQcHMgPSBmYWxzZTsKKyAgICBpZiAobWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5U3BzLCAmc3BzKSB8fAorICAgICAgICAgICAgbWVkaWFCdWYtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5UHBzLCAmcHBzKSkgeworICAgICAgICBpc1Nwc1BwcyA9IHRydWU7CisgICAgfQorCisgICAgbVRyYWZmaWNSZWMtPnVwZGF0ZUNsb2NrKEFMb29wZXI6OkdldE5vd1VzKCkgLyAxMDAwKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihrTWF4UGFja2V0U2l6ZSk7CisgICAgaWYgKG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRQorICAgICAgICAgICAgKyBSVFBfUEFZTE9BRF9ST09NX1NJWkUgPD0gYnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIC8vIFRoZSBkYXRhIGZpdHMgaW50byBhIHNpbmdsZSBwYWNrZXQKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgaWYgKG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICBkYXRhWzBdIHw9IDB4MTA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU3BzUHBzKSB7CisgICAgICAgICAgICBkYXRhWzFdID0gbVBheWxvYWRUeXBlOyAgLy8gTWFya2VyIGJpdCBzaG91bGQgbm90IGJlIHNldCBpbiBjYXNlIG9mIHNwcy9wcHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFbMV0gPSAoMSA8PCA3KSB8IG1QYXlsb2FkVHlwZTsKKyAgICAgICAgfQorICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbM10gPSBtU2VxTm8gJiAweGZmOworICAgICAgICBkYXRhWzRdID0gcnRwVGltZSA+PiAyNDsKKyAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbNl0gPSAocnRwVGltZSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGRhdGFbN10gPSBydHBUaW1lICYgMHhmZjsKKyAgICAgICAgZGF0YVs4XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgZGF0YVs5XSA9IChtU291cmNlSUQgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMF0gPSAobVNvdXJjZUlEID4+IDgpICYgMHhmZjsKKyAgICAgICAgZGF0YVsxMV0gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgICAgIGludCBydHBFeHRJbmRleCA9IDA7CisgICAgICAgIGlmIChtUlRQQ1ZPRXh0TWFwID4gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICB8ICAgICAgIDB4QkUgICAgfCAgICAweERFICAgICAgIHwgICAgICAgICAgIGxlbmd0aD0zICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgIHwgIElEICAgfCBMPTAgICB8ICAgICBkYXRhICAgICAgfCAgSUQgICB8ICBMPTEgIHwgICBkYXRhLi4uCisgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSAgIHwgICAgMCAocGFkKSAgICB8ICAgIDAgKHBhZCkgICAgfCAgSUQgICB8IEw9MyAgIHwKKyAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworCisgICAgICAgICAgICAgIEluIHRoZSBvbmUtYnl0ZSBoZWFkZXIgZm9ybSBvZiBleHRlbnNpb25zLCB0aGUgMTYtYml0IHZhbHVlIHJlcXVpcmVkCisgICAgICAgICAgICAgIGJ5IHRoZSBSVFAgc3BlY2lmaWNhdGlvbiBmb3IgYSBoZWFkZXIgZXh0ZW5zaW9uLCBsYWJlbGVkIGluIHRoZSBSVFAKKyAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBhcyAiZGVmaW5lZCBieSBwcm9maWxlIiwgdGFrZXMgdGhlIGZpeGVkIGJpdCBwYXR0ZXJuCisgICAgICAgICAgICAgIDB4QkVERSAodGhlIGZpcnN0IHZlcnNpb24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uIHdhcyB3cml0dGVuIG9uIHRoZQorICAgICAgICAgICAgICBmZWFzdCBkYXkgb2YgdGhlIFZlbmVyYWJsZSBCZWRlKS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBkYXRhWzEyXSA9IDB4QkU7CisgICAgICAgICAgICBkYXRhWzEzXSA9IDB4REU7CisgICAgICAgICAgICAvLyBwdXQgYSBsZW5ndGggb2YgUlRQIEV4dGVuc2lvbi4KKyAgICAgICAgICAgIGRhdGFbMTRdID0gMHgwMDsKKyAgICAgICAgICAgIGRhdGFbMTVdID0gMHgwMTsKKyAgICAgICAgICAgIC8vIHB1dCBleHRtYXAgb2YgUlRQIGFzc2lnbmVkIGZvciBDVk8uCisgICAgICAgICAgICBkYXRhWzE2XSA9IChtUlRQQ1ZPRXh0TWFwIDw8IDQpIHwgMHgwOworICAgICAgICAgICAgLy8gcHV0IGltYWdlIGRlZ3JlZXMgYXMgcGVyIENWTyBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgZGF0YVsxN10gPSBtUlRQQ1ZPRGVncmVlczsKKyAgICAgICAgICAgIGRhdGFbMThdID0gMHgwOworICAgICAgICAgICAgZGF0YVsxOV0gPSAweDA7CisgICAgICAgICAgICBydHBFeHRJbmRleCA9IDg7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoJmRhdGFbMTIgKyBydHBFeHRJbmRleF0sCisgICAgICAgICAgICAgICBtZWRpYURhdGEsIG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgKyAoMTIgKyBydHBFeHRJbmRleCkpOworCisgICAgICAgIHNlbmQoYnVmZmVyLCBmYWxzZSAvKiBpc1JUQ1AgKi8pOworCisgICAgICAgICsrbVNlcU5vOworICAgICAgICArK21OdW1SVFBTZW50OworICAgICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtICgxMiArIHJ0cEV4dEluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBGVS1BCisKKyAgICAgICAgdW5zaWduZWQgbmFsVHlwZSA9IG1lZGlhRGF0YVswXSAmIEgyNjRfTkFMVV9NQVNLOworICAgICAgICBBTE9HVigiSDI2NCBuYWxUeXBlIDB4JXgsIGRhdGFbMF09MHgleCIsIG5hbFR5cGUsIG1lZGlhRGF0YVswXSk7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSAxOworCisgICAgICAgIGJvb2wgZmlyc3RQYWNrZXQgPSB0cnVlOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbWVkaWFCdWYtPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IG1lZGlhQnVmLT5yYW5nZV9sZW5ndGgoKSAtIG9mZnNldDsKKyAgICAgICAgICAgIGJvb2wgbGFzdFBhY2tldCA9IHRydWU7CisgICAgICAgICAgICBpZiAoc2l6ZSArIFRDUElQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9TSVpFICsgUlRQX0hFQURFUl9FWFRfU0laRSArCisgICAgICAgICAgICAgICAgICAgIFJUUF9GVV9IRUFERVJfU0laRSArIFJUUF9QQVlMT0FEX1JPT01fU0laRSA+IGJ1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIGxhc3RQYWNrZXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gVENQSVBfSEVBREVSX1NJWkUgLSBSVFBfSEVBREVSX1NJWkUgLQorICAgICAgICAgICAgICAgICAgICBSVFBfSEVBREVSX0VYVF9TSVpFIC0gUlRQX0ZVX0hFQURFUl9TSVpFIC0gUlRQX1BBWUxPQURfUk9PTV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBkYXRhWzBdID0gMHg4MDsKKyAgICAgICAgICAgIGlmIChsYXN0UGFja2V0ICYmIG1SVFBDVk9FeHRNYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgZGF0YVswXSB8PSAweDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YVsxXSA9IChsYXN0UGFja2V0ID8gKDEgPDwgNykgOiAweDAwKSB8IG1QYXlsb2FkVHlwZTsgIC8vIE0tYml0CisgICAgICAgICAgICBkYXRhWzJdID0gKG1TZXFObyA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzNdID0gbVNlcU5vICYgMHhmZjsKKyAgICAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OworICAgICAgICAgICAgZGF0YVs1XSA9IChydHBUaW1lID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzZdID0gKHJ0cFRpbWUgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVs3XSA9IHJ0cFRpbWUgJiAweGZmOworICAgICAgICAgICAgZGF0YVs4XSA9IG1Tb3VyY2VJRCA+PiAyNDsKKyAgICAgICAgICAgIGRhdGFbOV0gPSAobVNvdXJjZUlEID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBkYXRhWzEwXSA9IChtU291cmNlSUQgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgZGF0YVsxMV0gPSBtU291cmNlSUQgJiAweGZmOworCisgICAgICAgICAgICBpbnQgcnRwRXh0SW5kZXggPSAwOworICAgICAgICAgICAgaWYgKGxhc3RQYWNrZXQgJiYgbVJUUENWT0V4dE1hcCA+IDApIHsKKyAgICAgICAgICAgICAgICBkYXRhWzEyXSA9IDB4QkU7CisgICAgICAgICAgICAgICAgZGF0YVsxM10gPSAweERFOworICAgICAgICAgICAgICAgIGRhdGFbMTRdID0gMHgwMDsKKyAgICAgICAgICAgICAgICBkYXRhWzE1XSA9IDB4MDE7CisgICAgICAgICAgICAgICAgZGF0YVsxNl0gPSAobVJUUENWT0V4dE1hcCA8PCA0KSB8IDB4MDsKKyAgICAgICAgICAgICAgICBkYXRhWzE3XSA9IG1SVFBDVk9EZWdyZWVzOworICAgICAgICAgICAgICAgIGRhdGFbMThdID0gMHgwOworICAgICAgICAgICAgICAgIGRhdGFbMTldID0gMHgwOworICAgICAgICAgICAgICAgIHJ0cEV4dEluZGV4ID0gODsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogIEgyNjQgcGF5bG9hZCBoZWFkZXIgaXMgOCBiaXQKKyAgICAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3CisgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSsKKyAgICAgICAgICAgICAgICB8RnxOUkl8ICBUeXBlICAgfAorICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAqLworICAgICAgICAgICAgQUxPR1YoIkgyNjQgcGF5bG9hZCBoZWFkZXIgMHgleCIsIG1lZGlhRGF0YVswXSk7CisgICAgICAgICAgICAvLyBleGNsdWRlcyBUeXBlIGZyb20gMXN0IGJ5dGUgb2YgSDI2NCBwYXlsb2FkIGhlYWRlci4KKyAgICAgICAgICAgIGRhdGFbMTIgKyBydHBFeHRJbmRleF0gPSBtZWRpYURhdGFbMF0gJiAweGUwOworICAgICAgICAgICAgLy8gZmlsbHMgVHlwZSBhcyBGVSAoMjggPT0gMHgxQykKKyAgICAgICAgICAgIGRhdGFbMTIgKyBydHBFeHRJbmRleF0gPSBkYXRhWzEyICsgcnRwRXh0SW5kZXhdIHwgMHgxQzsKKworICAgICAgICAgICAgQ0hFQ0soIWZpcnN0UGFja2V0IHx8ICFsYXN0UGFja2V0KTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgRlUgaGVhZGVyCisgICAgICAgICAgICAgICAgIDAgMSAyIDMgNCA1IDYgNworICAgICAgICAgICAgICAgICstKy0rLSstKy0rLSstKy0rCisgICAgICAgICAgICAgICAgfFN8RXxSfCAgVHlwZSAgIHwKKyAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKworICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgZGF0YVsxMyArIHJ0cEV4dEluZGV4XSA9CisgICAgICAgICAgICAgICAgKGZpcnN0UGFja2V0ID8gMHg4MCA6IDB4MDApCisgICAgICAgICAgICAgICAgfCAobGFzdFBhY2tldCA/IDB4NDAgOiAweDAwKQorICAgICAgICAgICAgICAgIHwgKG5hbFR5cGUgJiBIMjY0X05BTFVfTUFTSyk7CisgICAgICAgICAgICBBTE9HVigiSDI2NCBGVSBoZWFkZXIgMHgleCIsIGRhdGFbMTNdKTsKKworICAgICAgICAgICAgbWVtY3B5KCZkYXRhWzE0ICsgcnRwRXh0SW5kZXhdLCAmbWVkaWFEYXRhW29mZnNldF0sIHNpemUpOworCisgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIDE0ICsgcnRwRXh0SW5kZXggKyBzaXplKTsKKworICAgICAgICAgICAgc2VuZChidWZmZXIsIGZhbHNlIC8qIGlzUlRDUCAqLyk7CisKKyAgICAgICAgICAgICsrbVNlcU5vOworICAgICAgICAgICAgKyttTnVtUlRQU2VudDsKKyAgICAgICAgICAgIG1OdW1SVFBPY3RldHNTZW50ICs9IGJ1ZmZlci0+c2l6ZSgpIC0gKDEyICsgcnRwRXh0SW5kZXgpOworCisgICAgICAgICAgICBmaXJzdFBhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQVJUUFdyaXRlcjo6c2VuZEgyNjNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpIHsKQEAgLTY3MSw3ICsxMzc1LDcgQEAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKLSAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBMTCk7CisgICAgdWludDMyX3QgcnRwVGltZSA9IGdldFJ0cFRpbWUodGltZVVzKTsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKm1lZGlhRGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopbWVkaWFCdWYtPmRhdGEoKSArIG1lZGlhQnVmLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTY5Niw3ICsxNDAwLDcgQEAKIAogICAgICAgICB1aW50OF90ICpkYXRhID0gYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIGRhdGFbMF0gPSAweDgwOwotICAgICAgICBkYXRhWzFdID0gKGxhc3RQYWNrZXQgPyAweDgwIDogMHgwMCkgfCBQVDsgIC8vIE0tYml0CisgICAgICAgIGRhdGFbMV0gPSAobGFzdFBhY2tldCA/IDB4ODAgOiAweDAwKSB8IG1QYXlsb2FkVHlwZTsgIC8vIE0tYml0CiAgICAgICAgIGRhdGFbMl0gPSAobVNlcU5vID4+IDgpICYgMHhmZjsKICAgICAgICAgZGF0YVszXSA9IG1TZXFObyAmIDB4ZmY7CiAgICAgICAgIGRhdGFbNF0gPSBydHBUaW1lID4+IDI0OwpAQCAtNzIyLDkgKzE0MjYsNTggQEAKICAgICAgICAgKyttTnVtUlRQU2VudDsKICAgICAgICAgbU51bVJUUE9jdGV0c1NlbnQgKz0gYnVmZmVyLT5zaXplKCkgLSAxMjsKICAgICB9Cit9CiAKLSAgICBtTGFzdFJUUFRpbWUgPSBydHBUaW1lOwotICAgIG1MYXN0TlRQVGltZSA9IEdldE5vd05UUCgpOwordm9pZCBBUlRQV3JpdGVyOjp1cGRhdGVDVk9EZWdyZWVzKGludDMyX3QgY3ZvRGVncmVlcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgbVJUUENWT0RlZ3JlZXMgPSBjdm9EZWdyZWVzOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIG1QYXlsb2FkVHlwZSA9IHBheWxvYWRUeXBlOworfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVNvY2tldERzY3AoaW50MzJfdCBkc2NwKSB7CisgICAgbVJ0cExheWVyM0RzY3AgPSBkc2NwIDw8IDI7CisKKyAgICAvKiBtUnRwTGF5ZXIzRHNjcCB3aWxsIGJlIG1hcHBlZCB0byBXTU0oV2lmaSkgYXMgcGVyIG9wZXJhdG9yJ3MgcmVxdWlyZW1lbnQgKi8KKyAgICBpZiAoc2V0c29ja29wdChtUlRQU29ja2V0LCBJUFBST1RPX0lQLCBJUF9UT1MsCisgICAgICAgICAgICAgICAgKGludCAqKSZtUnRwTGF5ZXIzRHNjcCwgc2l6ZW9mKG1SdHBMYXllcjNEc2NwKSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGRzY3Agb24gcnRwc29jay4gZXJyPSVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgic3VjY2Vzc2Z1bGx5IHNldCBkc2NwIG9uIHJ0cHNvY2suIG9wdD0lZCIsIG1SdHBMYXllcjNEc2NwKTsKKyAgICAgICAgc2V0c29ja29wdChtUlRDUFNvY2tldCwgSVBQUk9UT19JUCwgSVBfVE9TLAorICAgICAgICAgICAgICAgIChpbnQgKikmbVJ0cExheWVyM0RzY3AsIHNpemVvZihtUnRwTGF5ZXIzRHNjcCkpOworICAgICAgICBBTE9HRCgic3VjY2Vzc2Z1bGx5IHNldCBkc2NwIG9uIHJ0Y3Bzb2NrLiBvcHQ9JWQiLCBtUnRwTGF5ZXIzRHNjcCk7CisgICAgfQorfQorCit2b2lkIEFSVFBXcml0ZXI6OnVwZGF0ZVNvY2tldE5ldHdvcmsoaW50NjRfdCBzb2NrZXROZXR3b3JrKSB7CisgICAgbVJUUFNvY2tOZXR3b3JrID0gKG5ldF9oYW5kbGVfdClzb2NrZXROZXR3b3JrOworICAgIEFMT0dJKCJ0cnlpbmcgdG8gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpLiIsCisgICAgICAgICAgICAgICAgbVJUUFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUlRQU29ja05ldHdvcmspOworCisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWRfc2V0c29ja25ldHdvcmsobVJUUFNvY2tOZXR3b3JrLCBtUlRQU29ja2V0KTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCglZCkgdG8gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICByZXN1bHQsIG1SVFBTb2NrZXQsICh1bnNpZ25lZCBsb25nIGxvbmcpbVJUUFNvY2tOZXR3b3JrKTsKKyAgICB9CisgICAgcmVzdWx0ID0gYW5kcm9pZF9zZXRzb2NrbmV0d29yayhtUlRQU29ja05ldHdvcmssIG1SVENQU29ja2V0KTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCglZCkgdG8gYmluZCBydGNwIHNvY2tldCglZCkgdG8gbmV0d29yayglbGx1KSIsCisgICAgICAgICAgICAgICAgcmVzdWx0LCBtUlRDUFNvY2tldCwgKHVuc2lnbmVkIGxvbmcgbG9uZyltUlRQU29ja05ldHdvcmspOworICAgIH0KKyAgICBBTE9HSSgiZG9uZS4gYmluZCBydHAgc29ja2V0KCVkKSB0byBuZXR3b3JrKCVsbHUpIiwKKyAgICAgICAgICAgICAgICBtUlRQU29ja2V0LCAodW5zaWduZWQgbG9uZyBsb25nKW1SVFBTb2NrTmV0d29yayk7Cit9CisKK3VpbnQzMl90IEFSVFBXcml0ZXI6OmdldFNlcXVlbmNlTnVtKCkgeworICAgIHJldHVybiBtU2VxTm87Cit9CisKK3VpbnQ2NF90IEFSVFBXcml0ZXI6OmdldEFjY3VtdWxhdGl2ZUJ5dGVzKCkgeworICAgIHJldHVybiBtVHJhZmZpY1JlYy0+cmVhZEJ5dGVzRm9yVG90YWwoKTsKIH0KIAogc3RhdGljIHNpemVfdCBnZXRGcmFtZVNpemUoYm9vbCBpc1dpZGUsIHVuc2lnbmVkIEZUKSB7CkBAIC03NTUsNyArMTUwOCw3IEBACiAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgLyAoaXNXaWRlID8gMjUwIDogMTI1KSk7CisgICAgdWludDMyX3QgcnRwVGltZSA9IGdldFJ0cFRpbWUodGltZVVzKTsKIAogICAgIC8vIGhleGR1bXAobWVkaWFEYXRhLCBtZWRpYUxlbmd0aCk7CiAKQEAgLTc3OCw3ICsxNTMxLDcgQEAKICAgICAvLyBUaGUgZGF0YSBmaXRzIGludG8gYSBzaW5nbGUgcGFja2V0CiAgICAgdWludDhfdCAqZGF0YSA9IGJ1ZmZlci0+ZGF0YSgpOwogICAgIGRhdGFbMF0gPSAweDgwOwotICAgIGRhdGFbMV0gPSBQVDsKKyAgICBkYXRhWzFdID0gbVBheWxvYWRUeXBlOwogICAgIGlmIChtTnVtUlRQU2VudCA9PSAwKSB7CiAgICAgICAgIC8vIFNpZ25hbCBzdGFydCBvZiB0YWxrLXNwdXJ0LgogICAgICAgICBkYXRhWzFdIHw9IDB4ODA7ICAvLyBNLWJpdApAQCAtODI5LDEwICsxNTgyLDkzIEBACiAgICAgKyttU2VxTm87CiAgICAgKyttTnVtUlRQU2VudDsKICAgICBtTnVtUlRQT2N0ZXRzU2VudCArPSBidWZmZXItPnNpemUoKSAtIDEyOworfQogCi0gICAgbUxhc3RSVFBUaW1lID0gcnRwVGltZTsKLSAgICBtTGFzdE5UUFRpbWUgPSBHZXROb3dOVFAoKTsKK3ZvaWQgQVJUUFdyaXRlcjo6bWFrZVNvY2tldFBhaXJBbmRCaW5kKFN0cmluZzgmIGxvY2FsSXAsIGludCBsb2NhbFBvcnQsCisgICAgICAgIFN0cmluZzgmIHJlbW90ZUlwLCBpbnQgcmVtb3RlUG9ydCkgeworICAgIHN0YXRpYyBjaGFyIGtTb21lb25lWzE2XSA9ICJzb21lb25lQCI7CisgICAgaW50IG5hbWVMZW5ndGggPSBzdHJsZW4oa1NvbWVvbmUpOworICAgIG1lbWNweShrQ05BTUUsIGtTb21lb25lLCBuYW1lTGVuZ3RoKTsKKyAgICBtZW1jcHkoa0NOQU1FICsgbmFtZUxlbmd0aCwgbG9jYWxJcC5jX3N0cigpLCBsb2NhbElwLmxlbmd0aCgpICsgMSk7CisKKyAgICBpZiAobG9jYWxJcC5jb250YWlucygiOiIpKQorICAgICAgICBtSXNJUHY2ID0gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIG1Jc0lQdjYgPSBmYWxzZTsKKworICAgIG1SVFBTb2NrZXQgPSBzb2NrZXQobUlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UobVJUUFNvY2tldCwgMCk7CisgICAgbVJUQ1BTb2NrZXQgPSBzb2NrZXQobUlzSVB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisgICAgQ0hFQ0tfR0UobVJUQ1BTb2NrZXQsIDApOworCisgICAgaW50IHNvY2tvcHQgPSAxOworICAgIHNldHNvY2tvcHQobVJUUFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisgICAgc2V0c29ja29wdChtUlRDUFNvY2tldCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAoaW50ICopJnNvY2tvcHQsIHNpemVvZihzb2Nrb3B0KSk7CisKKyAgICBpZiAobUlzSVB2NikgeworICAgICAgICBtZW1zZXQoJm1Mb2NhbEFkZHI2LCAwLCBzaXplb2YobUxvY2FsQWRkcjYpKTsKKyAgICAgICAgbWVtc2V0KCZtUlRQQWRkcjYsIDAsIHNpemVvZihtUlRQQWRkcjYpKTsKKyAgICAgICAgbWVtc2V0KCZtUlRDUEFkZHI2LCAwLCBzaXplb2YobVJUQ1BBZGRyNikpOworCisgICAgICAgIG1Mb2NhbEFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGluZXRfcHRvbihBRl9JTkVUNiwgbG9jYWxJcC5zdHJpbmcoKSwgJm1Mb2NhbEFkZHI2LnNpbjZfYWRkcik7CisgICAgICAgIG1Mb2NhbEFkZHI2LnNpbjZfcG9ydCA9IGh0b25zKCh1aW50MTZfdClsb2NhbFBvcnQpOworCisgICAgICAgIG1SVFBBZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBpbmV0X3B0b24oQUZfSU5FVDYsIHJlbW90ZUlwLnN0cmluZygpLCAmbVJUUEFkZHI2LnNpbjZfYWRkcik7CisgICAgICAgIG1SVFBBZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpcmVtb3RlUG9ydCk7CisKKyAgICAgICAgbVJUQ1BBZGRyNiA9IG1SVFBBZGRyNjsKKyAgICAgICAgbVJUQ1BBZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpKHJlbW90ZVBvcnQgKyAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KCZtTG9jYWxBZGRyLCAwLCBzaXplb2YobUxvY2FsQWRkcikpOworICAgICAgICBtZW1zZXQoJm1SVFBBZGRyLCAwLCBzaXplb2YobVJUUEFkZHIpKTsKKyAgICAgICAgbWVtc2V0KCZtUlRDUEFkZHIsIDAsIHNpemVvZihtUlRDUEFkZHIpKTsKKworICAgICAgICBtTG9jYWxBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBtTG9jYWxBZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihsb2NhbElwLnN0cmluZygpKTsKKyAgICAgICAgbUxvY2FsQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClsb2NhbFBvcnQpOworCisgICAgICAgIG1SVFBBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBtUlRQQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIocmVtb3RlSXAuc3RyaW5nKCkpOworICAgICAgICBtUlRQQWRkci5zaW5fcG9ydCA9IGh0b25zKCh1aW50MTZfdClyZW1vdGVQb3J0KTsKKworICAgICAgICBtUlRDUEFkZHIgPSBtUlRQQWRkcjsKKyAgICAgICAgbVJUQ1BBZGRyLnNpbl9wb3J0ID0gaHRvbnMoKHVpbnQxNl90KShyZW1vdGVQb3J0ICsgMSkpOworICAgIH0KKworICAgIHN0cnVjdCBzb2NrYWRkciAqbG9jYWxBZGRyID0gbUlzSVB2NiA/CisgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIqKSZtTG9jYWxBZGRyNiA6IChzdHJ1Y3Qgc29ja2FkZHIqKSZtTG9jYWxBZGRyOworCisgICAgaW50IHNpemVTb2NrU3QgPSBtSXNJUHY2ID8gc2l6ZW9mKG1Mb2NhbEFkZHI2KSA6IHNpemVvZihtTG9jYWxBZGRyKTsKKworICAgIGlmIChiaW5kKG1SVFBTb2NrZXQsIGxvY2FsQWRkciwgc2l6ZVNvY2tTdCkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBiaW5kIHJ0cCAlczolZCBlcnI9JXMiLCBsb2NhbElwLnN0cmluZygpLCBsb2NhbFBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoInN1Y2NlZWQgdG8gYmluZCBydHAgJXM6JWQiLCBsb2NhbElwLnN0cmluZygpLCBsb2NhbFBvcnQpOworICAgIH0KKworICAgIGlmIChtSXNJUHY2KQorICAgICAgICBtTG9jYWxBZGRyNi5zaW42X3BvcnQgPSBodG9ucygodWludDE2X3QpKGxvY2FsUG9ydCArIDEpKTsKKyAgICBlbHNlCisgICAgICAgIG1Mb2NhbEFkZHIuc2luX3BvcnQgPSBodG9ucygodWludDE2X3QpKGxvY2FsUG9ydCArIDEpKTsKKworICAgIGlmIChiaW5kKG1SVENQU29ja2V0LCBsb2NhbEFkZHIsIHNpemVTb2NrU3QpID09IC0xKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYmluZCBydGNwICVzOiVkIGVycj0lcyIsIGxvY2FsSXAuc3RyaW5nKCksIGxvY2FsUG9ydCArIDEsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoInN1Y2NlZWQgdG8gYmluZCBydGNwICVzOiVkIiwgbG9jYWxJcC5zdHJpbmcoKSwgbG9jYWxQb3J0ICsgMSk7CisgICAgfQorfQorCisvLyBUT0RPIDogRGV2ZWxvcCBtb3JlIGFkdmFuY2VkIG1vZGVyYXRvciBiYXNlZCBvbiBBUyAmIFRNTUJSIHZhbHVlCit2b2lkIEFSVFBXcml0ZXI6Ok1vZGVyYXRlSW5zdGFudFRyYWZmaWModWludDMyX3Qgc2FtcGxlUGVyaW9kLCB1aW50MzJfdCBsaW1pdEJ5dGVzKSB7CisgICAgdW5zaWduZWQgaW50IGJ5dGVzID0gIG1UcmFmZmljUmVjLT5yZWFkQnl0ZXNGb3JMYXN0UGVyaW9kKHNhbXBsZVBlcmlvZCk7CisgICAgaWYgKGJ5dGVzID4gbGltaXRCeXRlcykgeworICAgICAgICBBTE9HSSgiTnVjbGVhciBtb2RlcmF0b3IuICNzZXEgPSAlZCBcdFx0ICVkIGJpdHMgLyAxMG1zIiwKKyAgICAgICAgICAgICAgbVNlcU5vLCBieXRlcyAqIDgpOworICAgICAgICB1c2xlZXAoNDAwMCk7CisgICAgICAgIG1UcmFmZmljUmVjLT51cGRhdGVDbG9jayhBTG9vcGVyOjpHZXROb3dVcygpIC8gMTAwMCk7CisgICAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCmluZGV4IDJmMTM0ODYuLjI5ODJjZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5oCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9tdWx0aW5ldHdvcmsuaD4KKyNpbmNsdWRlICJUcmFmZmljUmVjb3JkZXIuaCIKKwogI2RlZmluZSBMT0dfVE9fRklMRVMgICAgMAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zNiwxNCArMzksMjQgQEAKIAogc3RydWN0IEFSVFBXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewogICAgIGV4cGxpY2l0IEFSVFBXcml0ZXIoaW50IGZkKTsKKyAgICBleHBsaWNpdCBBUlRQV3JpdGVyKGludCBmZCwgU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgcmVtb3RlSXAsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXFObyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgdmlydHVhbCBib29sIHJlYWNoZWRFT1MoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKyAgICB2b2lkIHVwZGF0ZUNWT0RlZ3JlZXMoaW50MzJfdCBjdm9EZWdyZWVzKTsKKyAgICB2b2lkIHVwZGF0ZVBheWxvYWRUeXBlKGludDMyX3QgcGF5bG9hZFR5cGUpOworICAgIHZvaWQgdXBkYXRlU29ja2V0RHNjcChpbnQzMl90IGRzY3ApOworICAgIHZvaWQgdXBkYXRlU29ja2V0TmV0d29yayhpbnQ2NF90IHNvY2tldE5ldHdvcmspOworICAgIHVpbnQzMl90IGdldFNlcXVlbmNlTnVtKCk7CisgICAgdmlydHVhbCB1aW50NjRfdCBnZXRBY2N1bXVsYXRpdmVCeXRlcygpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VE1NQk5JbmZvKHVpbnQzMl90IG9wcG9uZW50SUQsIHVpbnQzMl90IGJpdHJhdGUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVJUUFdyaXRlcigpOwpAQCAtNzYsMjYgKzg5LDQ1IEBACiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKICAgICBzcDxBSGFuZGxlclJlZmxlY3RvcjxBUlRQV3JpdGVyPiA+IG1SZWZsZWN0b3I7CiAKLSAgICBpbnQgbVNvY2tldDsKKyAgICBib29sIG1Jc0lQdjY7CisgICAgaW50IG1SVFBTb2NrZXQsIG1SVENQU29ja2V0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtTG9jYWxBZGRyOwogICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBtUlRQQWRkcjsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbVJUQ1BBZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgbUxvY2FsQWRkcjY7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBtUlRQQWRkcjY7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiBtUlRDUEFkZHI2OworICAgIGludDMyX3QgbVJ0cExheWVyM0RzY3A7CisgICAgbmV0X2hhbmRsZV90IG1SVFBTb2NrTmV0d29yazsKIAogICAgIEFTdHJpbmcgbVByb2ZpbGVMZXZlbDsKICAgICBBU3RyaW5nIG1TZXFQYXJhbVNldDsKICAgICBBU3RyaW5nIG1QaWNQYXJhbVNldDsKIAorICAgIE1lZGlhQnVmZmVyQmFzZSAqbVZQU0J1ZjsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1TUFNCdWY7CisgICAgTWVkaWFCdWZmZXJCYXNlICptUFBTQnVmOworCisgICAgdWludDMyX3QgbUNsb2NrUmF0ZTsKICAgICB1aW50MzJfdCBtU291cmNlSUQ7CisgICAgdWludDMyX3QgbVBheWxvYWRUeXBlOwogICAgIHVpbnQzMl90IG1TZXFObzsKICAgICB1aW50MzJfdCBtUlRQVGltZUJhc2U7CiAgICAgdWludDMyX3QgbU51bVJUUFNlbnQ7CiAgICAgdWludDMyX3QgbU51bVJUUE9jdGV0c1NlbnQ7Ci0gICAgdWludDMyX3QgbUxhc3RSVFBUaW1lOwotICAgIHVpbnQ2NF90IG1MYXN0TlRQVGltZTsKKworICAgIHVpbnQzMl90IG1PcHBvbmVudElEOworICAgIHVpbnQzMl90IG1CaXRyYXRlOworICAgIHR5cGVkZWYgdWludDY0X3QgQnl0ZXM7CisgICAgc3A8VHJhZmZpY1JlY29yZGVyPHVpbnQzMl90IC8qIFRpbWUgKi8sIEJ5dGVzPiA+IG1UcmFmZmljUmVjOwogCiAgICAgaW50MzJfdCBtTnVtU1JzU2VudDsKKyAgICBpbnQzMl90IG1SVFBDVk9FeHRNYXA7CisgICAgaW50MzJfdCBtUlRQQ1ZPRGVncmVlczsKIAogICAgIGVudW0gewogICAgICAgICBJTlZBTElELAorICAgICAgICBIMjY1LAogICAgICAgICBIMjY0LAogICAgICAgICBIMjYzLAogICAgICAgICBBTVJfTkIsCkBAIC0xMDMsMjMgKzEzNSwzMSBAQAogICAgIH0gbU1vZGU7CiAKICAgICBzdGF0aWMgdWludDY0X3QgR2V0Tm93TlRQKCk7CisgICAgdWludDMyX3QgZ2V0UnRwVGltZShpbnQ2NF90IHRpbWVVcyk7CiAKKyAgICB2b2lkIGluaXRTdGF0ZSgpOwogICAgIHZvaWQgb25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uU2VuZFNSKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZvaWQgYWRkU1IoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRTREVTKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworICAgIHZvaWQgYWRkVE1NQk4oY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKICAgICB2b2lkIG1ha2VIMjY0U1Byb3BQYXJhbVNldHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwogICAgIHZvaWQgZHVtcFNlc3Npb25EZXNjKCk7CiAKICAgICB2b2lkIHNlbmRCeWUoKTsKKyAgICB2b2lkIHNlbmRWUFNTUFNQUFNJZklGcmFtZShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmLCBpbnQ2NF90IHRpbWVVcyk7CisgICAgdm9pZCBzZW5kU1BTUFBTSWZJRnJhbWUoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1ZiwgaW50NjRfdCB0aW1lVXMpOworICAgIHZvaWQgc2VuZEhFVkNEYXRhKE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYpOwogICAgIHZvaWQgc2VuZEFWQ0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CiAgICAgdm9pZCBzZW5kSDI2M0RhdGEoTWVkaWFCdWZmZXJCYXNlICptZWRpYUJ1Zik7CiAgICAgdm9pZCBzZW5kQU1SRGF0YShNZWRpYUJ1ZmZlckJhc2UgKm1lZGlhQnVmKTsKIAogICAgIHZvaWQgc2VuZChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBib29sIGlzUlRDUCk7CisgICAgdm9pZCBtYWtlU29ja2V0UGFpckFuZEJpbmQoU3RyaW5nOCYgbG9jYWxJcCwgaW50IGxvY2FsUG9ydCwgU3RyaW5nOCYgcmVtb3RlSXAsIGludCByZW1vdGVQb3J0KTsKIAorICAgIHZvaWQgTW9kZXJhdGVJbnN0YW50VHJhZmZpYyh1aW50MzJfdCBzYW1wbGVQZXJpb2QsIHVpbnQzMl90IGxpbWl0Qnl0ZXMpOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFSVFBXcml0ZXIpOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IGJiNjZmNGMuLmMzM2JmM2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTMyOSw2ICszMjksNyBAQAogICAgIG1QYXNzLmNsZWFyKCk7CiAgICAgbUF1dGhUeXBlID0gTk9ORTsKICAgICBtTm9uY2UuY2xlYXIoKTsKKyAgICBtUmVhbG0uY2xlYXIoKTsKIAogICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKIH0KQEAgLTkxMSw2ICs5MTIsMTQgQEAKICAgICAgICAgQ0hFQ0tfR0UoaiwgMCk7CiAKICAgICAgICAgbU5vbmNlLnNldFRvKHZhbHVlLCBpICsgNywgaiAtIGkgLSA3KTsKKworICAgICAgICBpID0gdmFsdWUuZmluZCgicmVhbG09Iik7CisgICAgICAgIENIRUNLX0dFKGksIDApOworICAgICAgICBDSEVDS19FUSh2YWx1ZS5jX3N0cigpW2kgKyA2XSwgJ1wiJyk7CisgICAgICAgIGogPSB2YWx1ZS5maW5kKCJcIiIsIGkgKyA3KTsKKyAgICAgICAgQ0hFQ0tfR0UoaiwgMCk7CisKKyAgICAgICAgbVJlYWxtLnNldFRvKHZhbHVlLCBpICsgNywgaiAtIGkgLSA3KTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTk5Myw3ICsxMDAyLDcgQEAKICAgICBBU3RyaW5nIEExOwogICAgIEExLmFwcGVuZChtVXNlcik7CiAgICAgQTEuYXBwZW5kKCI6Iik7Ci0gICAgQTEuYXBwZW5kKCJTdHJlYW1pbmcgU2VydmVyIik7CisgICAgQTEuYXBwZW5kKG1SZWFsbSk7CiAgICAgQTEuYXBwZW5kKCI6Iik7CiAgICAgQTEuYXBwZW5kKG1QYXNzKTsKIApAQCAtMTAyOSw2ICsxMDM4LDkgQEAKICAgICBmcmFnbWVudC5hcHBlbmQoIlwiLCAiKTsKICAgICBmcmFnbWVudC5hcHBlbmQoInJlc3BvbnNlPVwiIik7CiAgICAgZnJhZ21lbnQuYXBwZW5kKGRpZ2VzdCk7CisgICAgZnJhZ21lbnQuYXBwZW5kKCJcIiwgIik7CisgICAgZnJhZ21lbnQuYXBwZW5kKCJyZWFsbT1cIiIpOworICAgIGZyYWdtZW50LmFwcGVuZChtUmVhbG0pOwogICAgIGZyYWdtZW50LmFwcGVuZCgiXCIiKTsKICAgICBmcmFnbWVudC5hcHBlbmQoIlxyXG4iKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKaW5kZXggNTZiNjA0ZC4uN2NkZDRjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCkBAIC04NCw2ICs4NCw3IEBACiAgICAgQVN0cmluZyBtVXNlciwgbVBhc3M7CiAgICAgQXV0aFR5cGUgbUF1dGhUeXBlOwogICAgIEFTdHJpbmcgbU5vbmNlOworICAgIEFTdHJpbmcgbVJlYWxtOwogICAgIGludCBtU29ja2V0OwogICAgIGludDMyX3QgbUNvbm5lY3Rpb25JRDsKICAgICBpbnQzMl90IG1OZXh0Q1NlcTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDJiNDIwNDAuLjViNWI0YjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtMjcsNiArMjcsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NvbnN0ZXhwciB1bnNpZ25lZCBrRGVmYXVsdEFzID0gOTYwOyAvLyBrYnBzPworCiBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpBU2Vzc2lvbkRlc2NyaXB0aW9uKCkKICAgICA6IG1Jc1ZhbGlkKGZhbHNlKSB7CiB9CkBAIC0xMDMsNyArMTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAga2V5LnNldFRvKGxpbmUsIDAsIGNvbG9uUG9zKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09ICJhPWZtdHAiIHx8IGtleSA9PSAiYT1ydHBtYXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwga2V5ID09ICJhPWZyYW1lc2l6ZSIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBrZXkgPT0gImE9ZnJhbWVzaXplIiB8fCBrZXkgPT0gImE9ZXh0bWFwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBzcGFjZVBvcyA9IGxpbmUuZmluZCgiICIsIGNvbG9uUG9zICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhY2VQb3MgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAxLDYgKzIwMywzMyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIEFTZXNzaW9uRGVzY3JpcHRpb246OmdldEN2b0V4dE1hcCgKKyAgICAgICAgc2l6ZV90IGluZGV4LCBpbnQzMl90ICpjdm9FeHRNYXApIGNvbnN0IHsKKyAgICBDSEVDS19HRShpbmRleCwgMHUpOworICAgIENIRUNLX0xUKGluZGV4LCBtVHJhY2tzLnNpemUoKSk7CisKKyAgICBBU3RyaW5nIGtleSwgdmFsdWU7CisgICAgKmN2b0V4dE1hcCA9IDA7CisKKyAgICBjb25zdCBBdHRyaWJzICZ0cmFjayA9IG1UcmFja3MuaXRlbUF0KGluZGV4KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHZhbHVlID0gdHJhY2sudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHZhbHVlLnNpemUoKSA+IDAgJiYgc3RyY21wKHZhbHVlLmNfc3RyKCksICJ1cm46M2dwcDp2aWRlby1vcmllbnRhdGlvbiIpID09IDApIHsKKyAgICAgICAgICAgIGtleSA9IHRyYWNrLmtleUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoa2V5LnNpemUoKSA+IDApIHsKKyAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJyY2hyKGtleS5jX3N0cigpLCAnOicpOworICAgICAgICBjb2xvblBvcysrOworICAgICAgICAqY3ZvRXh0TWFwID0gYXRvaShjb2xvblBvcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBBU2Vzc2lvbkRlc2NyaXB0aW9uOjpnZXRGb3JtYXRUeXBlKAogICAgICAgICBzaXplX3QgaW5kZXgsIHVuc2lnbmVkIGxvbmcgKlBULAogICAgICAgICBBU3RyaW5nICpkZXNjLCBBU3RyaW5nICpwYXJhbXMpIGNvbnN0IHsKQEAgLTM0NSw1ICszNzQsNzQgQEAKICAgICByZXR1cm4gKm5wdDIgPiAqbnB0MTsKIH0KIAorLy8gc3RhdGljCit2b2lkIEFTZXNzaW9uRGVzY3JpcHRpb246OlNEUFN0cmluZ0ZhY3RvcnkoQVN0cmluZyAmc2RwLAorICAgICAgICBjb25zdCBjaGFyICppcCwgYm9vbCBpc0F1ZGlvLCB1bnNpZ25lZCBwb3J0LCB1bnNpZ25lZCBwYXlsb2FkVHlwZSwKKyAgICAgICAgdW5zaWduZWQgYXMsIGNvbnN0IGNoYXIgKmNvZGVjLCBjb25zdCBjaGFyICpmbXRwLAorICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBjdm9FeHRNYXApCit7CisgICAgYm9vbCBpc0lQdjQgPSAoQVN0cmluZyhpcCkuZmluZCgiOjoiKSA9PSAtMSkgPyB0cnVlIDogZmFsc2U7CisgICAgc2RwLmNsZWFyKCk7CisgICAgc2RwLmFwcGVuZCgidj0wXHJcbiIpOworCisgICAgc2RwLmFwcGVuZCgiYT1yYW5nZTpucHQ9bm93LVxyXG4iKTsKKworICAgIHNkcC5hcHBlbmQoIm09Iik7CisgICAgc2RwLmFwcGVuZChpc0F1ZGlvID8gImF1ZGlvICIgOiAidmlkZW8gIik7CisgICAgc2RwLmFwcGVuZChwb3J0KTsKKyAgICBzZHAuYXBwZW5kKCIgUlRQL0FWUCAiKTsKKyAgICBzZHAuYXBwZW5kKHBheWxvYWRUeXBlKTsKKyAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICBzZHAuYXBwZW5kKCJjPSBJTiBJUCIpOworICAgIGlmIChpc0lQdjQpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiNCAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZHAuYXBwZW5kKCI2ICIpOworICAgIH0KKyAgICBzZHAuYXBwZW5kKGlwKTsKKyAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICBzZHAuYXBwZW5kKCJiPUFTOiIpOworICAgIHNkcC5hcHBlbmQoYXMgPiAwID8gYXMgOiBrRGVmYXVsdEFzKTsKKyAgICBzZHAuYXBwZW5kKCJcclxuIik7CisKKyAgICBzZHAuYXBwZW5kKCJhPXJ0cG1hcDoiKTsKKyAgICBzZHAuYXBwZW5kKHBheWxvYWRUeXBlKTsKKyAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgc2RwLmFwcGVuZChjb2RlYyk7CisgICAgc2RwLmFwcGVuZCgiLyIpOworICAgIHNkcC5hcHBlbmQoaXNBdWRpbyA/ICI4MDAwIiA6ICI5MDAwMCIpOworICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKworICAgIGlmIChmbXRwICE9IE5VTEwpIHsKKyAgICAgICAgc2RwLmFwcGVuZCgiYT1mbXRwOiIpOworICAgICAgICBzZHAuYXBwZW5kKHBheWxvYWRUeXBlKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiICIpOworICAgICAgICBzZHAuYXBwZW5kKGZtdHApOworICAgICAgICBzZHAuYXBwZW5kKCJcclxuIik7CisgICAgfQorCisgICAgaWYgKCFpc0F1ZGlvICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKSB7CisgICAgICAgIHNkcC5hcHBlbmQoImE9ZnJhbWVzaXplOiIpOworICAgICAgICBzZHAuYXBwZW5kKHBheWxvYWRUeXBlKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiICIpOworICAgICAgICBzZHAuYXBwZW5kKHdpZHRoKTsKKyAgICAgICAgc2RwLmFwcGVuZCgiLSIpOworICAgICAgICBzZHAuYXBwZW5kKGhlaWdodCk7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKyAgICB9CisKKyAgICBpZiAoY3ZvRXh0TWFwID4gMCkgeworICAgICAgICBzZHAuYXBwZW5kKCJhPWV4dG1hcDoiKTsKKyAgICAgICAgc2RwLmFwcGVuZChjdm9FeHRNYXApOworICAgICAgICBzZHAuYXBwZW5kKCIgIik7CisgICAgICAgIHNkcC5hcHBlbmQoInVybjozZ3BwOnZpZGVvLW9yaWVudGF0aW9uIik7CisgICAgICAgIHNkcC5hcHBlbmQoIlxyXG4iKTsKKyAgICB9CisKKyAgICBBTE9HVigiU0RQU3RyaW5nRmFjdG9yeSA9PiAlcyIsIHNkcC5jX3N0cigpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaAppbmRleCBiNDYyOTgzLi45MWY1NDQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uaApAQCAtNDAsNiArNDAsOCBAQAogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHZvaWQgZ2V0Rm9ybWF0KHNpemVfdCBpbmRleCwgQVN0cmluZyAqdmFsdWUpIGNvbnN0OwogCisgICAgYm9vbCBnZXRDdm9FeHRNYXAoc2l6ZV90IGluZGV4LCBpbnQzMl90ICpjdm9FeHRNYXApIGNvbnN0OworCiAgICAgdm9pZCBnZXRGb3JtYXRUeXBlKAogICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1bnNpZ25lZCBsb25nICpQVCwKICAgICAgICAgICAgIEFTdHJpbmcgKmRlc2MsIEFTdHJpbmcgKnBhcmFtcykgY29uc3Q7CkBAIC02Myw2ICs2NSw5IEBACiAgICAgLy8gaS5lLiB3ZSBoYXZlIGEgZml4ZWQgZHVyYXRpb24sIG90aGVyd2lzZSB0aGlzIGlzIGxpdmUgc3RyZWFtaW5nLgogICAgIHN0YXRpYyBib29sIHBhcnNlTlRQUmFuZ2UoY29uc3QgY2hhciAqcywgZmxvYXQgKm5wdDEsIGZsb2F0ICpucHQyKTsKIAorICAgIHN0YXRpYyB2b2lkIFNEUFN0cmluZ0ZhY3RvcnkoQVN0cmluZyAmc2RwLCBjb25zdCBjaGFyICppcCwgYm9vbCBpc0F1ZGlvLCB1bnNpZ25lZCBwb3J0LAorICAgICAgICB1bnNpZ25lZCBwYXlsb2FkVHlwZSwgdW5zaWduZWQgYXMsIGNvbnN0IGNoYXIgKmNvZGVjLCBjb25zdCBjaGFyICpmbXRwID0gTlVMTCwKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDAsIGludDMyX3QgaGVpZ2h0ID0gMCwgaW50MzJfdCBjdm9FeHRNYXAgPSAwKTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BU2Vzc2lvbkRlc2NyaXB0aW9uKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icAppbmRleCBhNWE4OTVlLi4zNGQxNzg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsMjkgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9ydHNwX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3J0c3BfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9ydHNwX2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFBTVJBc3NlbWJsZXIuY3BwIiwKICAgICAgICAgIkFBVkNBc3NlbWJsZXIuY3BwIiwKKyAgICAgICAgIkFIRVZDQXNzZW1ibGVyLmNwcCIsCiAgICAgICAgICJBSDI2M0Fzc2VtYmxlci5jcHAiLAogICAgICAgICAiQU1QRUcyVFNBc3NlbWJsZXIuY3BwIiwKICAgICAgICAgIkFNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcCIsCkBAIC0xNiwxMCArMzYsMTIgQEAKICAgICAgICAgIkFSVFBXcml0ZXIuY3BwIiwKICAgICAgICAgIkFSVFNQQ29ubmVjdGlvbi5jcHAiLAogICAgICAgICAiQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAiLAorICAgICAgICAiSml0dGVyQ2FsY3VsYXRvci5jcHAiLAogICAgICAgICAiU0RQTG9hZGVyLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhbmRyb2lkX25ldCIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJtZWRpYSIsCkBAIC0yOCw2ICs1MCw3IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQiLAogICAgIF0sCiAKICAgICBhcmNoOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2I1YTgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmNwcApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJKaXR0ZXJDYWxjIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiSml0dGVyQ2FsY3VsYXRvci5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSml0dGVyQ2FsYzo6Sml0dGVyQ2FsYyhpbnQzMl90IGNsb2NrUmF0ZSkKKyAgICA6IG1DbG9ja1JhdGUoY2xvY2tSYXRlKSB7CisgICAgaW5pdCgwLCAwLCAwLCAwKTsKK30KKwordm9pZCBKaXR0ZXJDYWxjOjppbml0KHVpbnQzMl90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcywgaW50MzJfdCBiYXNlLCBpbnQzMl90IGludGVyKSB7CisgICAgbUZpcnN0VGltZVN0YW1wID0gcnRwVGltZTsKKyAgICBtTGFzdFRpbWVTdGFtcCA9IHJ0cFRpbWU7CisgICAgbUZpcnN0QXJyaXZhbFRpbWVVcyA9IGFycml2YWxUaW1lVXM7CisgICAgbUxhc3RBcnJpdmFsVGltZVVzID0gYXJyaXZhbFRpbWVVczsKKworICAgIG1CYXNlSml0dGVyVXMgPSBiYXNlOworICAgIG1JbnRlckFycml2YWxKaXR0ZXJVcyA9IGludGVyOworfQorCit2b2lkIEppdHRlckNhbGM6OnB1dEJhc2VEYXRhKGludDY0X3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzKSB7CisgICAgLy8gQSBSVFAgdGltZSB3cmFwcyBhcm91bmQgYWZ0ZXIgVUlOVDMyX01BWC4gV2UgbXVzdCBjb25zaWRlciB0aGlzIGNhc2UuCisgICAgY29uc3QgaW50NjRfdCBVSU5UMzJfTVNCID0gMHg4MDAwMDAwMDsKKyAgICBpbnQ2NF90IG92ZXJmbG93TWFzayA9IChtRmlyc3RUaW1lU3RhbXAgJiBVSU5UMzJfTVNCICYgfnJ0cFRpbWUpIDw8IDE7CisgICAgaW50NjRfdCB0ZW1wUnRwVGltZSA9IG92ZXJmbG93TWFzayB8IHJ0cFRpbWU7CisKKyAgICAvLyBCYXNlIGppdHRlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdmFyaW91cworICAgIGludDY0X3Qgc2NoZWR1bGVkVGltZVVzID0gKHRlbXBSdHBUaW1lIC0gKGludDY0X3QpbUZpcnN0VGltZVN0YW1wKSAqIDEwMDAwMDBsbCAvIG1DbG9ja1JhdGU7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYXJyaXZhbFRpbWVVcyAtIG1GaXJzdEFycml2YWxUaW1lVXM7CisgICAgaW50NjRfdCBjb3JyZWN0aW9uVGltZVVzID0gZWxhcHNlZFRpbWVVcyAtIHNjaGVkdWxlZFRpbWVVczsgLy8gYWRkaXRpb25hbCBwcm9wYWdhdGlvbiBkZWxheTsKKyAgICBtQmFzZUppdHRlclVzID0gKG1CYXNlSml0dGVyVXMgKiAxNSArIGNvcnJlY3Rpb25UaW1lVXMpIC8gMTY7CisgICAgQUxPR1YoIkJhc2VKaXR0ZXJVcyA6ICVsbGQgXHRcdCBjb3JyZWN0aW9uVGltZVVzIDogJWxsZCIsCisgICAgICAgICAgICAobG9uZyBsb25nKW1CYXNlSml0dGVyVXMsIChsb25nIGxvbmcpY29ycmVjdGlvblRpbWVVcyk7Cit9CisKK3ZvaWQgSml0dGVyQ2FsYzo6cHV0SW50ZXJBcnJpdmFsRGF0YShpbnQ2NF90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWVVcykgeworICAgIGNvbnN0IGludDY0X3QgVUlOVDMyX01TQiA9IDB4ODAwMDAwMDA7CisgICAgaW50NjRfdCB0ZW1wUnRwVGltZSA9IHJ0cFRpbWU7CisgICAgaW50NjRfdCB0ZW1wTGFzdFRpbWVTdGFtcCA9IG1MYXN0VGltZVN0YW1wOworCisgICAgLy8gQSBSVFAgdGltZSB3cmFwcyBhcm91bmQgYWZ0ZXIgVUlOVDMyX01BWC4gV2UgbXVzdCBjb25zaWRlciB0aGlzIGNhc2UuCisgICAgaW50NjRfdCBvdmVyZmxvd01hc2sgPSAobUxhc3RUaW1lU3RhbXAgXiBydHBUaW1lKSAmIFVJTlQzMl9NU0I7CisgICAgdGVtcFJ0cFRpbWUgfD0gKChvdmVyZmxvd01hc2sgJiB+cnRwVGltZSkgPDwgMSk7CisgICAgdGVtcExhc3RUaW1lU3RhbXAgfD0gKChvdmVyZmxvd01hc2sgJiB+bUxhc3RUaW1lU3RhbXApIDw8IDEpOworCisgICAgLy8gNi40LjEgb2YgUkZDMzU1MCBkZWZpbmVzIHRoaXMgaW50ZXJhcnJpdmFsIGppdHRlciB2YWx1ZS4KKyAgICBpbnQ2NF90IGRpZmZUaW1lU3RhbXBVcyA9IGFicyh0ZW1wUnRwVGltZSAtIHRlbXBMYXN0VGltZVN0YW1wKSAqIDEwMDAwMDBsbCAvIG1DbG9ja1JhdGU7CisgICAgaW50NjRfdCBkaWZmQXJyaXZhbFVzID0gYXJyaXZhbFRpbWVVcyAtIG1MYXN0QXJyaXZhbFRpbWVVczsgLy8gQ2FuJ3QgYmUgbWludXMKKyAgICBBTE9HVigiZGlmZlRpbWVTdGFtcFVzICVsbGQgXHRcdCBkaWZmQXJyaXZhbFVzICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylkaWZmVGltZVN0YW1wVXMsIChsb25nIGxvbmcpZGlmZkFycml2YWxVcyk7CisKKyAgICBpbnQ2NF90IHZhcmlhbmNlVXMgPSBkaWZmQXJyaXZhbFVzIC0gZGlmZlRpbWVTdGFtcFVzOworICAgIG1JbnRlckFycml2YWxKaXR0ZXJVcyA9IChtSW50ZXJBcnJpdmFsSml0dGVyVXMgKiAxNSArIGFicyh2YXJpYW5jZVVzKSkgLyAxNjsKKworICAgIG1MYXN0VGltZVN0YW1wID0gKHVpbnQzMl90KXJ0cFRpbWU7CisgICAgbUxhc3RBcnJpdmFsVGltZVVzID0gYXJyaXZhbFRpbWVVczsKK30KKworaW50MzJfdCBKaXR0ZXJDYWxjOjpnZXRCYXNlSml0dGVyTXMoKSB7CisgICAgcmV0dXJuIG1CYXNlSml0dGVyVXMgLyAxMDAwOworfQorCitpbnQzMl90IEppdHRlckNhbGM6OmdldEludGVyQXJyaXZhbEppdHRlck1zKCkgeworICAgIHJldHVybiBtSW50ZXJBcnJpdmFsSml0dGVyVXMgLyAxMDAwOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0ppdHRlckNhbGN1bGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM2ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9KaXR0ZXJDYWxjdWxhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9KSVRURVJfQ0FMQ1VMQVRPUl9IXworCisjZGVmaW5lIEFfSklUVEVSX0NBTENVTEFUT1JfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBKaXR0ZXJDYWxjIDogcHVibGljIFJlZkJhc2UgeworcHJpdmF0ZToKKyAgICAvLyBUaW1lIFN0YW1wIHBlciBTZWNvbmQKKyAgICBjb25zdCBpbnQzMl90IG1DbG9ja1JhdGU7CisKKyAgICB1aW50MzJfdCBtRmlyc3RUaW1lU3RhbXA7CisgICAgdWludDMyX3QgbUxhc3RUaW1lU3RhbXA7CisgICAgaW50NjRfdCBtRmlyc3RBcnJpdmFsVGltZVVzOworICAgIGludDY0X3QgbUxhc3RBcnJpdmFsVGltZVVzOworCisgICAgaW50MzJfdCBtQmFzZUppdHRlclVzOworICAgIGludDMyX3QgbUludGVyQXJyaXZhbEppdHRlclVzOworCitwdWJsaWM6CisgICAgSml0dGVyQ2FsYyhpbnQzMl90IGNsb2NrUmF0ZSk7CisKKyAgICB2b2lkIGluaXQodWludDMyX3QgcnRwVGltZSwgaW50NjRfdCBhcnJpdmFsVGltZVVzLCBpbnQzMl90IGJhc2UsIGludDMyX3QgaW50ZXIpOworICAgIHZvaWQgcHV0SW50ZXJBcnJpdmFsRGF0YShpbnQ2NF90IHJ0cFRpbWUsIGludDY0X3QgYXJyaXZhbFRpbWUpOworICAgIHZvaWQgcHV0QmFzZURhdGEoaW50NjRfdCBydHBUaW1lLCBpbnQ2NF90IGFycml2YWxUaW1lVXMpOworICAgIGludDMyX3QgZ2V0QmFzZUppdHRlck1zKCk7CisgICAgaW50MzJfdCBnZXRJbnRlckFycml2YWxKaXR0ZXJNcygpOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9KSVRURVJfQ0FMQ1VMQVRPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggN2YwMjVhNS4uOTg4Y2VjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC03NCw3ICs3NCw4IEBACiAKIC8vIFRoZSBhbGxvd2VkIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIGFjY2VzcyB1bml0cyBhdCB0aGUgYmVnaW5uaW5nIG9mCiAvLyBhIG5ldyBzZXF1ZW5jZS4KLXN0YXRpYyBpbnQzMl90IGtNYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyA9IDIwOworc3RhdGljIGludDMyX3Qga01heEFsbG93ZWRTdGFsZUF1ZGlvQWNjZXNzVW5pdHMgPSAyMDsKK3N0YXRpYyBpbnQzMl90IGtNYXhBbGxvd2VkU3RhbGVWaWRlb0FjY2Vzc1VuaXRzID0gNDAwOwogCiBzdGF0aWMgaW50NjRfdCBrVGVhckRvd25UaW1lb3V0VXMgPSAzMDAwMDAwbGw7CiAKQEAgLTEwOCw2ICsxMDksMTAgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQzMl90IEdldE1heEFsbG93ZWRTdGFsZUNvdW50KGJvb2wgaXNWaWRlbykgeworICAgIHJldHVybiBpc1ZpZGVvID8ga01heEFsbG93ZWRTdGFsZVZpZGVvQWNjZXNzVW5pdHMgOiBrTWF4QWxsb3dlZFN0YWxlQXVkaW9BY2Nlc3NVbml0czsKK30KKwogc3RydWN0IE15SGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29ubmVjdGVkICAgICAgICAgICAgICAgICAgPSAnY29ubicsCkBAIC0xMDMyLDYgKzEwMzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaW50MzJfdCBydGNwRXZlbnQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJydGNwLWV2ZW50IiwgJnJ0Y3BFdmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgKyttTnVtQWNjZXNzVW5pdHNSZWNlaXZlZDsKICAgICAgICAgICAgICAgICBwb3N0QWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOwogCkBAIC0xMzI1LDYgKzEzMzUsOCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicnRwLWluZm86ICVzIiwgcmVzcG9uc2UtPm1IZWFkZXJzLnZhbHVlQXQoaSkuY19zdHIoKSk7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SVFBDb25uLT5zZWVrU3RyZWFtKCk7CisKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJzZWVrIGNvbXBsZXRlZC4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE1MDksNyArMTUyMSw3IEBACiAgICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgaW5mby0+bUZpcnN0U2VxTnVtSW5TZWdtZW50ID0gc2VxOwogICAgICAgICAgICAgaW5mby0+bU5ld1NlZ21lbnQgPSB0cnVlOwotICAgICAgICAgICAgaW5mby0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0ga01heEFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzOworICAgICAgICAgICAgaW5mby0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gR2V0TWF4QWxsb3dlZFN0YWxlQ291bnQoaW5mby0+bUlzVmlkZW8pOwogCiAgICAgICAgICAgICBDSEVDSyhHZXRBdHRyaWJ1dGUoKCppdCkuY19zdHIoKSwgInJ0cHRpbWUiLCAmdmFsKSk7CiAKQEAgLTE1NTEsNiArMTU2Myw3IEBACiAgICAgICAgIGludCBtUlRQU29ja2V0OwogICAgICAgICBpbnQgbVJUQ1BTb2NrZXQ7CiAgICAgICAgIGJvb2wgbVVzaW5nSW50ZXJsZWF2ZWRUQ1A7CisgICAgICAgIGJvb2wgbUlzVmlkZW87CiAgICAgICAgIHVpbnQzMl90IG1GaXJzdFNlcU51bUluU2VnbWVudDsKICAgICAgICAgYm9vbCBtTmV3U2VnbWVudDsKICAgICAgICAgaW50MzJfdCBtQWxsb3dlZFN0YWxlQWNjZXNzVW5pdHM7CkBAIC0xNjM1LDkgKzE2NDgsMTAgQEAKICAgICAgICAgaW5mby0+bVVSTCA9IHRyYWNrVVJMOwogICAgICAgICBpbmZvLT5tUGFja2V0U291cmNlID0gc291cmNlOwogICAgICAgICBpbmZvLT5tVXNpbmdJbnRlcmxlYXZlZFRDUCA9IGZhbHNlOworICAgICAgICBpbmZvLT5tSXNWaWRlbyA9IHNvdXJjZS0+aXNWaWRlbygpOwogICAgICAgICBpbmZvLT5tRmlyc3RTZXFOdW1JblNlZ21lbnQgPSAwOwogICAgICAgICBpbmZvLT5tTmV3U2VnbWVudCA9IHRydWU7Ci0gICAgICAgIGluZm8tPm1BbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyA9IGtNYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0czsKKyAgICAgICAgaW5mby0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gR2V0TWF4QWxsb3dlZFN0YWxlQ291bnQoaW5mby0+bUlzVmlkZW8pOwogICAgICAgICBpbmZvLT5tUlRQU29ja2V0ID0gLTE7CiAgICAgICAgIGluZm8tPm1SVENQU29ja2V0ID0gLTE7CiAgICAgICAgIGluZm8tPm1SVFBBbmNob3IgPSAwOwpAQCAtMTgzMywxMSArMTg0NywxMiBAQAogICAgICAgICAgICAgICAgIC8vIGJ5IEFSVFBTb3VyY2UuIE9ubHkgdGhlIGxvdyAxNiBiaXRzIG9mIHNlcSBpbiBSVFAtSW5mbyBvZiByZXBseSBvZgogICAgICAgICAgICAgICAgIC8vIFJUU1AgIlBMQVkiIGNvbW1hbmQgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSBmaXJzdCBSVFAgcGFja2V0CiAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgc2Vla2luZy4KKyAgICAgICAgICAgICAgICBpbnQzMl90IG1heEFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gR2V0TWF4QWxsb3dlZFN0YWxlQ291bnQodHJhY2stPm1Jc1ZpZGVvKTsKICAgICAgICAgICAgICAgICBpZiAobVNlZWthYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VxTnVtMTYgPSBzZXFOdW0gJiAweGZmZmY7CiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdFNlcU51bUluU2VnbWVudDE2ID0gdHJhY2stPm1GaXJzdFNlcU51bUluU2VnbWVudCAmIDB4ZmZmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXFOdW0xNiA+IGZpcnN0U2VxTnVtSW5TZWdtZW50MTYgKyBrTWF4QWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXFOdW0xNiA+IGZpcnN0U2VxTnVtSW5TZWdtZW50MTYgKyBtYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzZXFOdW0xNiA8IGZpcnN0U2VxTnVtSW5TZWdtZW50MTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgdGhlIGZpcnN0IHJ0cCBwYWNrZXQgb2YgdGhlIHN0cmVhbSBhZnRlciBzZWVraW5nLCBkaXNjYXJkaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMtLTsKQEAgLTE4NTIsNyArMTg2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HV19JRih0cmFjay0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGlsbCBubyBmaXJzdCBydHAgcGFja2V0IGFmdGVyICVkIHN0YWxlIG9uZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4QWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBbGxvd2VkU3RhbGVBY2Nlc3NVbml0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUFsbG93ZWRTdGFsZUFjY2Vzc1VuaXRzID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCmluZGV4IGNjMzZiNzguLmMwNTNiZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTE0LDYgKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvUXVhbE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUXVhbE1hbmFnZXIiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIlF1YWxNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUXVhbE1hbmFnZXI6OldhdGNoZXI6OldhdGNoZXIoaW50MzJfdCB0aW1lTGltaXQpCisgICAgOiBUaHJlYWQoZmFsc2UpLCBtV2F0Y2hpbmcoZmFsc2UpLCBtU3dpdGNoKGZhbHNlKSwKKyAgICAgIG1UaW1lTGltaXQodGltZUxpbWl0ICogMTAwMDAwMExMKSAgICAgLy8gdGltZUxpbWl0IG1zCit7Cit9CisKK2Jvb2wgUXVhbE1hbmFnZXI6OldhdGNoZXI6OmlzRXhwaXJlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Td2l0Y2g7Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OldhdGNoZXI6OnNldHVwKCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAobVdhdGNoaW5nID09IGZhbHNlKSB7CisgICAgICAgIG1XYXRjaGluZyA9IHRydWU7CisgICAgICAgIG1NeUNvbmQuc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpXYXRjaGVyOjpyZWxlYXNlKCkgeworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAobVN3aXRjaCkgeworICAgICAgICBBTE9HVygiJXMgRElTQVJNRUQiLCBuYW1lKTsKKyAgICAgICAgbVN3aXRjaCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobVdhdGNoaW5nID09IHRydWUpIHsKKyAgICAgICAgQUxPR1coIiVzIERJU0FSTUVEIiwgbmFtZSk7CisgICAgICAgIG1XYXRjaGluZyA9IGZhbHNlOworICAgICAgICBtTXlDb25kLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6ZXhpdCgpIHsKKyAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CisgICAgLy8gVGhlIG9yZGVyIGlzIGltcG9ydGFudCB0byBhdm9pZCBkZWFkIGxvY2suCisgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdCgpOworICAgIG1NeUNvbmQuc2lnbmFsKCk7Cit9CisKK1F1YWxNYW5hZ2VyOjpXYXRjaGVyOjp+V2F0Y2hlcigpIHsKKyAgICBBTE9HSSgiJXMgdGhyZWFkIGRlYWQiLCBuYW1lKTsKK30KKworYm9vbCBRdWFsTWFuYWdlcjo6V2F0Y2hlcjo6dGhyZWFkTG9vcCgpIHsKKyAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgcHJjdGwoUFJfR0VUX05BTUUsIG5hbWUsIDAsIDAsIDApOworI2VuZGlmCisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgIEFMT0dXKCIlcyBUaW1lciBpbml0IiwgbmFtZSk7CisgICAgICAgIG1NeUNvbmQud2FpdChtTXlMb2NrKTsgICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdHMgYXMgbm9uLXdhdGNoaW5nIHN0YXRlCisgICAgICAgIGlmIChleGl0UGVuZGluZygpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBBTE9HVygiJXMgdGltZXIgQk9PTSBhZnRlciAlZCBtc2VjIiwgbmFtZSwgKGludCkobVRpbWVMaW1pdCAvIDEwMDAwMDBMTCkpOworICAgICAgICBtTXlDb25kLndhaXRSZWxhdGl2ZShtTXlMb2NrLCBtVGltZUxpbWl0KTsgIC8vIHdhaXRzIGFzIHdhdGNoaW5nIHNhdHRlCisgICAgICAgIGlmIChtV2F0Y2hpbmcgPT0gdHJ1ZSkgeworICAgICAgICAgICAgbVN3aXRjaCA9IHRydWU7CisgICAgICAgICAgICBBTE9HVygiJXMgQk9PTSEhISEiLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBtV2F0Y2hpbmcgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK1F1YWxNYW5hZ2VyOjpRdWFsTWFuYWdlcigpCisgICAgOiBtTWluQml0cmF0ZSgtMSksIG1NYXhCaXRyYXRlKC0xKSwKKyAgICAgIG1UYXJnZXRCaXRyYXRlKDUxMjAwMCksIG1MYXN0VGFyZ2V0Qml0cmF0ZSgtMSksCisgICAgICBtTGFzdFNldEJpdHJhdGVUaW1lKDApLCBtSXNOZXdUYXJnZXRCaXRyYXRlKGZhbHNlKQoreworICAgIFZGUFdhdGNoZXIgPSBuZXcgV2F0Y2hlcigzMDAwKTsgICAgIC8vVmVyeSBGZXcgUGFja2V0IFdhdGNoZXIKKyAgICBWRlBXYXRjaGVyLT5ydW4oIlZlcnlGZXdQdGsiKTsKKyAgICBMQlJXYXRjaGVyID0gbmV3IFdhdGNoZXIoMTAwMDApOyAgICAvL0xvdyBCaXQgUmF0ZSBXYXRjaGVyCisgICAgTEJSV2F0Y2hlci0+cnVuKCJMb3dCaXRSYXRlIik7Cit9CisKK1F1YWxNYW5hZ2VyOjp+UXVhbE1hbmFnZXIoKSB7CisgICAgVkZQV2F0Y2hlci0+ZXhpdCgpOworICAgIExCUldhdGNoZXItPmV4aXQoKTsKK30KKworaW50MzJfdCBRdWFsTWFuYWdlcjo6Z2V0VGFyZ2V0Qml0cmF0ZSgpIHsKKyAgICBpZiAobUlzTmV3VGFyZ2V0Qml0cmF0ZSkgeworICAgICAgICBtSXNOZXdUYXJnZXRCaXRyYXRlID0gZmFsc2U7CisgICAgICAgIG1MYXN0VGFyZ2V0Qml0cmF0ZSA9IGNsYW1waW5nQml0cmF0ZShtVGFyZ2V0Qml0cmF0ZSk7CisgICAgICAgIG1UYXJnZXRCaXRyYXRlID0gbUxhc3RUYXJnZXRCaXRyYXRlOworICAgICAgICByZXR1cm4gbVRhcmdldEJpdHJhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworYm9vbCBRdWFsTWFuYWdlcjo6aXNOZWVkVG9Eb3duZ3JhZGUoKSB7CisgICAgcmV0dXJuIExCUldhdGNoZXItPmlzRXhwaXJlZCgpOworfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpzZXRUYXJnZXRCaXRyYXRlKHVpbnQ4X3QgZnJhY3Rpb24sIGludDY0X3Qgbm93VXMsIGJvb2wgaXNUb29Mb3dQa3RzKSB7CisgICAgLyogVG9vIExvdyBQYWNrZXQuIE1heWJlIG9wcG9uZW50IGlzIHN3aXRjaGluZyBjYW1lcmEuCisgICAgICogSWYgdGhpcyBjb25kaXRpb24gZ29lcyBsb25nZXIsIHdlIHNob3VsZCBkb3duIGJpdHJhdGUuCisgICAgICovCisgICAgaWYgKGlzVG9vTG93UGt0cykgeworICAgICAgICBWRlBXYXRjaGVyLT5zZXR1cCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFZGUFdhdGNoZXItPnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBpZiAoKGZyYWN0aW9uID4gKDI1NiAqIDUgLyAxMDApICYmICFpc1Rvb0xvd1BrdHMpIHx8IFZGUFdhdGNoZXItPmlzRXhwaXJlZCgpKSB7CisgICAgICAgIC8vIGxvc3MgbW9yZSB0aGFuIDUlICAgICAgICAgICAgICAgICAgICAgICAgICBvciAgVkZQV2F0Y2hlciBCT09NRUQKKyAgICAgICAgbVRhcmdldEJpdHJhdGUgLT0gbUJpdHJhdGVTdGVwICogMzsKKyAgICB9IGVsc2UgaWYgKGZyYWN0aW9uIDw9ICgyNTYgKiAyIC8xMDApKSB7CisgICAgICAgIC8vIGxvc3MgbGVzcyB0aGFuIDIlCisgICAgICAgIG1UYXJnZXRCaXRyYXRlICs9IG1CaXRyYXRlU3RlcDsKKyAgICB9CisKKyAgICBpZiAobVRhcmdldEJpdHJhdGUgPiBtTWF4Qml0cmF0ZSkgeworICAgICAgICBtVGFyZ2V0Qml0cmF0ZSA9IG1NYXhCaXRyYXRlICsgbUJpdHJhdGVTdGVwOworICAgIH0gZWxzZSBpZiAobVRhcmdldEJpdHJhdGUgPCBtTWluQml0cmF0ZSkgeworICAgICAgICBMQlJXYXRjaGVyLT5zZXR1cCgpOworICAgICAgICBtVGFyZ2V0Qml0cmF0ZSA9IG1NaW5CaXRyYXRlIC0gbUJpdHJhdGVTdGVwOworICAgIH0KKworICAgIGlmIChtTGFzdFRhcmdldEJpdHJhdGUgIT0gY2xhbXBpbmdCaXRyYXRlKG1UYXJnZXRCaXRyYXRlKSB8fAorICAgICAgICBub3dVcyAtIG1MYXN0U2V0Qml0cmF0ZVRpbWUgPiA1MDAwMDAwbGwpIHsKKyAgICAgICAgbUlzTmV3VGFyZ2V0Qml0cmF0ZSA9IHRydWU7CisgICAgICAgIG1MYXN0U2V0Qml0cmF0ZVRpbWUgPSBub3dVczsKKyAgICB9Cit9CisKK3ZvaWQgUXVhbE1hbmFnZXI6OnNldE1pbk1heEJpdHJhdGUoaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgICAgbU1pbkJpdHJhdGUgPSBtaW47CisgICAgbU1heEJpdHJhdGUgPSBtYXg7CisgICAgbUJpdHJhdGVTdGVwID0gKG1heCAtIG1pbikgLyA4OworfQorCit2b2lkIFF1YWxNYW5hZ2VyOjpzZXRCaXRyYXRlRGF0YShpbnQzMl90IGJpdHJhdGUsIGludDY0X3QgLypub3cqLykgeworICAgIC8vIEEgYml0cmF0ZSB0aGF0IGlzIGNvbnNpZGVyZWQgcGFja2V0bG9zcyBhbHNvIHNob3VsZCBiZSBnb29kLgorICAgIGlmIChiaXRyYXRlID49IG1NaW5CaXRyYXRlICYmIG1UYXJnZXRCaXRyYXRlID49IG1NaW5CaXRyYXRlKSB7CisgICAgICAgIExCUldhdGNoZXItPnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgaWYgKGJpdHJhdGUgPCBtTWluQml0cmF0ZSl7CisgICAgICAgIExCUldhdGNoZXItPnNldHVwKCk7CisgICAgfQorfQorCitpbnQzMl90IFF1YWxNYW5hZ2VyOjpjbGFtcGluZ0JpdHJhdGUoaW50MzJfdCBiaXRyYXRlKSB7CisgICAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KG1NaW5CaXRyYXRlLCBiaXRyYXRlKSwgbU1heEJpdHJhdGUpOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9RdWFsTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGM5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1F1YWxNYW5hZ2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUVVBTF9NQU5BR0VSX0hfCisKKyNkZWZpbmUgUVVBTF9NQU5BR0VSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgUXVhbE1hbmFnZXIgeworcHVibGljOgorICAgIFF1YWxNYW5hZ2VyKCk7CisgICAgflF1YWxNYW5hZ2VyKCk7CisKKyAgICBpbnQzMl90IGdldFRhcmdldEJpdHJhdGUoKTsKKyAgICBib29sIGlzTmVlZFRvRG93bmdyYWRlKCk7CisKKyAgICB2b2lkIHNldFRhcmdldEJpdHJhdGUodWludDhfdCBmcmFjdGlvbiwgaW50NjRfdCBub3dVcywgYm9vbCBpc1Rvb0xvd1BrdHMpOworICAgIHZvaWQgc2V0TWluTWF4Qml0cmF0ZShpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpOworICAgIHZvaWQgc2V0Qml0cmF0ZURhdGEoaW50MzJfdCBiaXRyYXRlLCBpbnQ2NF90IG5vdyk7Citwcml2YXRlOgorICAgIGNsYXNzIFdhdGNoZXIgOiBwdWJsaWMgVGhyZWFkCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgV2F0Y2hlcihpbnQzMl90IHRpbWVMaW1pdCk7CisKKyAgICAgICAgdm9pZCBzZXR1cCgpOworICAgICAgICB2b2lkIHJlbGVhc2UoKTsKKyAgICAgICAgdm9pZCBleGl0KCk7CisgICAgICAgIGJvb2wgaXNFeHBpcmVkKCkgY29uc3Q7CisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB+V2F0Y2hlcigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOworCisgICAgICAgIGNoYXIgbmFtZVszMl0gPSB7MCx9OworCisgICAgICAgIENvbmRpdGlvbiBtTXlDb25kOworICAgICAgICBNdXRleCBtTXlMb2NrOworCisgICAgICAgIGJvb2wgbVdhdGNoaW5nOworICAgICAgICBib29sIG1Td2l0Y2g7CisgICAgICAgIGNvbnN0IG5zZWNzX3QgbVRpbWVMaW1pdDsKKyAgICB9OworICAgIHNwPFdhdGNoZXI+IFZGUFdhdGNoZXI7CisgICAgc3A8V2F0Y2hlcj4gTEJSV2F0Y2hlcjsKKyAgICBpbnQzMl90IG1NaW5CaXRyYXRlOworICAgIGludDMyX3QgbU1heEJpdHJhdGU7CisgICAgaW50MzJfdCBtQml0cmF0ZVN0ZXA7CisKKyAgICBpbnQzMl90IG1UYXJnZXRCaXRyYXRlOworICAgIGludDMyX3QgbUxhc3RUYXJnZXRCaXRyYXRlOworICAgIGludDY0X3QgbUxhc3RTZXRCaXRyYXRlVGltZTsKKworICAgIGJvb2wgbUlzTmV3VGFyZ2V0Qml0cmF0ZTsKKworICAgIGludDMyX3QgY2xhbXBpbmdCaXRyYXRlKGludDMyX3QgYml0cmF0ZSk7Cit9OworfSAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUVVBTF9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1RyYWZmaWNSZWNvcmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE4ZjkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9UcmFmZmljUmVjb3JkZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQV9UUkFGRklDX1JFQ09SREVSX0hfCisKKyNkZWZpbmUgQV9UUkFGRklDX1JFQ09SREVSX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDaXJjdWxhciBhcnJheSB0byBzYXZlIHJlY2VudCBhbW91bnQgb2YgYnl0ZXMKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK2NsYXNzIFRyYWZmaWNSZWNvcmRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBzaXplX3Qga01pbk51bUVudHJpZXMgPSA0OworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IGtNYXhOdW1FbnRyaWVzID0gMTAyNDsKKworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbVNpemVNYXNrOworICAgIFRpbWUgKm1UaW1lQXJyYXkgPSBOVUxMOworICAgIEJ5dGVzICptQnl0ZXNBcnJheSA9IE5VTEw7CisgICAgc2l6ZV90IG1IZWFkSWR4OworICAgIHNpemVfdCBtVGFpbElkeDsKKworICAgIGludCBtTGFzdFJlYWRJZHg7CisKKyAgICBjb25zdCBUaW1lIG1SZWNvcmRMaW1pdDsKKyAgICBUaW1lIG1DbG9jazsKKyAgICBUaW1lIG1MYXN0VGltZU9mUHJpbnQ7CisgICAgQnl0ZXMgbUFjY3VCeXRlczsKKworcHVibGljOgorICAgIFRyYWZmaWNSZWNvcmRlcihzaXplX3Qgc2l6ZSwgVGltZSBhY2N1VGltZUxpbWl0KTsKKyAgICB2aXJ0dWFsIH5UcmFmZmljUmVjb3JkZXIoKTsKKworICAgIHZvaWQgaW5pdCgpOworICAgIHZvaWQgdXBkYXRlQ2xvY2soVGltZSBub3cpOworICAgIEJ5dGVzIHJlYWRCeXRlc0ZvclRvdGFsKCk7CisgICAgQnl0ZXMgcmVhZEJ5dGVzRm9yTGFzdFBlcmlvZChUaW1lIHBlcmlvZCk7CisgICAgdm9pZCB3cml0ZUJ5dGVzKEJ5dGVzIGJ5dGVzKTsKKyAgICB2b2lkIHByaW50QWNjdUJpdHNGb3JMYXN0UGVyaW9kKFRpbWUgcGVyaW9kLCBUaW1lIHVuaXQpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6VHJhZmZpY1JlY29yZGVyKHNpemVfdCBzaXplLCBUaW1lIHJlY29yZExpbWl0KQorICAgIDogbVJlY29yZExpbWl0KHJlY29yZExpbWl0KSB7CisgICAgaWYgKHNpemUgPiBrTWF4TnVtRW50cmllcykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkxpbWl0aW5nIFRyYWZmaWNSZWNvcmRlciBzaXplIHRvICIgPDwga01heE51bUVudHJpZXM7CisgICAgICAgIHNpemUgPSBrTWF4TnVtRW50cmllczsKKyAgICB9IGVsc2UgaWYgKHNpemUgPCBrTWluTnVtRW50cmllcykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkxpbWl0aW5nIFRyYWZmaWNSZWNvcmRlciBzaXplIHRvICIgPDwga01heE51bUVudHJpZXM7CisgICAgICAgIHNpemUgPSBrTWluTnVtRW50cmllczsKKyAgICB9CisKKyAgICBzaXplX3QgZXhwID0gKChzaXplb2Yoc2l6ZV90KSA9PSA4KSA/CisgICAgICAgICAgICAgICAgICA2NCAtIF9fYnVpbHRpbl9jbHpsKHNpemUgLSAxKSA6CisgICAgICAgICAgICAgICAgICAzMiAtIF9fYnVpbHRpbl9jbHooc2l6ZSAtIDEpKTsKKyAgICBtU2l6ZSA9ICgxdWwgPDwgZXhwKTsgICAgICAgICAvLyBzaXplID0gMl5leHAKKyAgICBtU2l6ZU1hc2sgPSBtU2l6ZSAtIDE7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgIlRyYWZmaWNSZWNvcmRlciBJbml0IHNpemUgIiA8PCBtU2l6ZTsKKyAgICBtVGltZUFycmF5ID0gbmV3IFRpbWVbbVNpemVdOworICAgIG1CeXRlc0FycmF5ID0gbmV3IEJ5dGVzW21TaXplXTsKKworICAgIGluaXQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6flRyYWZmaWNSZWNvcmRlcigpIHsKKyAgICBkZWxldGVbXSBtVGltZUFycmF5OworICAgIGRlbGV0ZVtdIG1CeXRlc0FycmF5OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVGltZSwgY2xhc3MgQnl0ZXM+Cit2b2lkIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OmluaXQoKSB7CisgICAgbUhlYWRJZHggPSAwOworICAgIG1UYWlsSWR4ID0gbVNpemVNYXNrOworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG1TaXplIDsgaSsrKSB7CisgICAgICAgIG1UaW1lQXJyYXlbaV0gPSAwOworICAgICAgICBtQnl0ZXNBcnJheVtpXSA9IDA7CisgICAgfQorICAgIG1DbG9jayA9IDA7CisgICAgbUxhc3RSZWFkSWR4ID0gMDsKKyAgICBtTGFzdFRpbWVPZlByaW50ID0gMDsKKyAgICBtQWNjdUJ5dGVzID0gMDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgordm9pZCBUcmFmZmljUmVjb3JkZXI8VGltZSwgQnl0ZXM+Ojp1cGRhdGVDbG9jayhUaW1lIG5vdykgeworICAgIG1DbG9jayA9IG5vdzsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRpbWUsIGNsYXNzIEJ5dGVzPgorQnl0ZXMgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6cmVhZEJ5dGVzRm9yVG90YWwoKSB7CisgICAgcmV0dXJuIG1BY2N1Qnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK0J5dGVzIFRyYWZmaWNSZWNvcmRlcjxUaW1lLCBCeXRlcz46OnJlYWRCeXRlc0Zvckxhc3RQZXJpb2QoVGltZSBwZXJpb2QpIHsKKyAgICAvLyBOb3QgZW5vdWdoIGRhdGEKKyAgICBpZiAocGVyaW9kID4gbUNsb2NrKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEJ5dGVzIGJ5dGVzID0gMDsKKyAgICBpbnQgaSA9IG1IZWFkSWR4OworICAgIHdoaWxlIChpICE9IG1UYWlsSWR4KSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUkVBRCAiIDw8IGkgPDwgIiB0aW1lICIgPDwgbVRpbWVBcnJheVtpXQorICAgICAgICAgICAgICAgIDw8ICIgXHQgRW5kT2ZQZXJpb2QgIiA8PCBtQ2xvY2sgLSBwZXJpb2QKKyAgICAgICAgICAgICAgICA8PCAiXHRcdCBCeXRlczoiIDw8IG1CeXRlc0FycmF5W2ldIDw8ICJcdFx0IEFjY3U6ICIgPDwgYnl0ZXM7CisgICAgICAgIGlmIChtVGltZUFycmF5W2ldIDwgbUNsb2NrIC0gcGVyaW9kKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBieXRlcyArPSBtQnl0ZXNBcnJheVtpXTsKKyAgICAgICAgaSA9IChpIC0gMSkgJiBtU2l6ZU1hc2s7CisgICAgfQorICAgIG1MYXN0UmVhZElkeCA9IChpICsgMSkgJiBtU2l6ZU1hc2s7CisKKyAgICByZXR1cm4gYnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK3ZvaWQgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6d3JpdGVCeXRlcyhCeXRlcyBieXRlcykgeworICAgIGludCB3cml0ZUlkeDsKKyAgICBpZiAobUNsb2NrID09IG1UaW1lQXJyYXlbbUhlYWRJZHhdKSB7CisgICAgICAgIHdyaXRlSWR4ID0gbUhlYWRJZHg7CisgICAgICAgIG1CeXRlc0FycmF5W3dyaXRlSWR4XSArPSBieXRlczsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZUlkeCA9IChtSGVhZElkeCArIDEpICYgbVNpemVNYXNrOworICAgICAgICBtVGltZUFycmF5W3dyaXRlSWR4XSA9IG1DbG9jazsKKyAgICAgICAgbUJ5dGVzQXJyYXlbd3JpdGVJZHhdID0gYnl0ZXM7CisgICAgfQorCisgICAgTE9HKFZFUkJPU0UpIDw8ICJXUklURSAiIDw8IHdyaXRlSWR4IDw8ICIgdGltZSAiIDw8IG1DbG9jazsKKyAgICBpZiAod3JpdGVJZHggPT0gbVRhaWxJZHgpIHsKKyAgICAgICAgbVRhaWxJZHggPSAobVRhaWxJZHggKyAxKSAmIG1TaXplTWFzazsKKyAgICB9CisKKyAgICBtSGVhZElkeCA9IHdyaXRlSWR4OworICAgIG1BY2N1Qnl0ZXMgKz0gYnl0ZXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUaW1lLCBjbGFzcyBCeXRlcz4KK3ZvaWQgVHJhZmZpY1JlY29yZGVyPFRpbWUsIEJ5dGVzPjo6cHJpbnRBY2N1Qml0c0Zvckxhc3RQZXJpb2QoVGltZSBwZXJpb2QsIFRpbWUgdW5pdCkgeworICAgIFRpbWUgdGltZVNpbmNlTGFzdFByaW50ID0gbUNsb2NrIC0gbUxhc3RUaW1lT2ZQcmludDsKKyAgICBpZiAodGltZVNpbmNlTGFzdFByaW50IDwgcGVyaW9kKQorICAgICAgICByZXR1cm47CisKKyAgICBCeXRlcyBzdW0gPSByZWFkQnl0ZXNGb3JMYXN0UGVyaW9kKHBlcmlvZCk7CisgICAgVGltZSByZWFkUGVyaW9kID0gbUNsb2NrIC0gbVRpbWVBcnJheVttTGFzdFJlYWRJZHhdOworCisgICAgZmxvYXQgbnVtT2ZVbml0ID0gKGZsb2F0KShyZWFkUGVyaW9kKSAvICh1bml0ICsgRkxUX01JTik7CisgICAgQUxPR0QoIkFjdHVhbCBUeCBwZXJpb2QgJS4zZiB1bml0IFx0ICUuMGYgYnl0ZXMgKCUuMGYgS2JpdHMpL1VuaXQiLAorICAgICAgICAgIG51bU9mVW5pdCwgc3VtIC8gbnVtT2ZVbml0LCBzdW0gKiA4LmYgLyBudW1PZlVuaXQgLyAxMDAwLmYpOworICAgIG1MYXN0VGltZU9mUHJpbnQgPSBtQ2xvY2s7CisKKyAgICBpZiAobUNsb2NrIC0gbVRpbWVBcnJheVttVGFpbElkeF0gPCBtUmVjb3JkTGltaXQpIHsKKyAgICAgICAgLy8gU2l6ZSBpcyBub3QgZW5vdWdoIHRvIHJlY29yZCBieXRlcyBmb3IgbVJlY29yZExpbWl0IHBlcmlvZAorICAgICAgICBBTE9HVygiVHJhZmZpYyByZWNvcmRlciBzaXplIGlzIG5vdCBlbm91Z2guIG1SZWNvcmRMaW1pdCAlZCIsIG1SZWNvcmRMaW1pdCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfVFJBRkZJQ19SRUNPUkRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYTdmOTRjMS4uYTc5OWExMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMjQgQEAKIC8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QiLAogCkBAIC05LDcgKzI4LDYgQEAKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKQEAgLTE3LDExICszNSw4IEBACiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKQEAgLTQ0LDQgKzU5LDQgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTliMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRVNEU1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRVNEU1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmJjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgRVNEUyB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFU0RTVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWUwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRVNEU1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxFU0RTLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJFU0RTVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgRVNEU1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBFU0RTUGFyYW1zIHsKKyAgICBjb25zdCBjaGFyICppbnB1dEZpbGU7CisgICAgaW50MzJfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKKyAgICBjb25zdCBjaGFyICpjb2RlY1NwZWNpZmljSW5mb0RhdGE7CisgICAgaW50MzJfdCBjb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplOworICAgIGludDMyX3QgYml0cmF0ZU1heDsKKyAgICBpbnQzMl90IGJpdHJhdGVBdmc7Cit9OworCitjbGFzcyBFU0RTVW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dEZpbGUgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYmplY3RUeXBlSW5kaWNhdGlvbiAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGEgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdHJhdGVNYXggKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0cmF0ZUF2ZyAqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgRVNEU1VuaXRUZXN0KCkgOiBtRVNEU0RhdGEobnVsbHB0cikgeworICAgICAgICBtRVNEU1BhcmFtcy5pbnB1dEZpbGUgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLm9iamVjdFR5cGVJbmRpY2F0aW9uID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGEgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVNYXggPSBnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVBdmcgPSBnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlKSBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBpZiAobUlucHV0RnApIHsKKyAgICAgICAgICAgIGZjbG9zZShtSW5wdXRGcCk7CisgICAgICAgICAgICBtSW5wdXRGcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlYWRFU0RTRGF0YSgpKTsgfQorICAgIGNvbnN0IHZvaWQgKm1FU0RTRGF0YTsKKyAgICBzaXplX3QgbUVTRFNTaXplOworICAgIEVTRFNQYXJhbXMgbUVTRFNQYXJhbXM7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHJlYWRFU0RTRGF0YSgpIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgbUVTRFNQYXJhbXMuaW5wdXRGaWxlOworICAgICAgICBtSW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEZwLCBudWxscHRyKSA8PCAiRmlsZSBvcGVuIGZhaWxlZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obUlucHV0RnApOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGaWxlIGRlc2NyaXB0b3IgaW52YWxpZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlOiAiIDw8IG1FU0RTUGFyYW1zLmlucHV0RmlsZTsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisKKyAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCAwLCBmaWxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtRGF0YVNvdXJjZSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobURhdGFTb3VyY2UpOworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlVuYWJsZSB0byBjcmVhdGUgZXh0cmFjdG9yIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJObyB0cmFja3MgaW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIEFTU0VSVF9UUlVFKGVzZHNEYXRhUHJlc2VudChudW1UcmFja3MsIGV4dHJhY3RvcikpCisgICAgICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBmaW5kIGVzZHMgaW4gYW55IHRyYWNrIGluIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgIH0KKworICAgIGJvb2wgZXNkc0RhdGFQcmVzZW50KHNpemVfdCBudW1UcmFja3MsIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yKSB7CisgICAgICAgIGJvb2wgZm91bmRFU0RTID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJm1FU0RTRGF0YSwgJm1FU0RTU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZm91bmRFU0RTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmRFU0RTOworICAgIH0KKworICAgIEZJTEUgKm1JbnB1dEZwOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworfTsKKworVEVTVF9QKEVTRFNVbml0VGVzdCwgSW52YWxpZERhdGFUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBjYWxsb2MobUVTRFNTaXplLCAxKTsKKyAgICBBU1NFUlRfTkUoaW52YWxpZERhdGEsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IjsKKyAgICBFU0RTIGVzZHMoaW52YWxpZERhdGEsIG1FU0RTU2l6ZSk7CisgICAgZnJlZShpbnZhbGlkRGF0YSk7CisgICAgQVNTRVJUX05FKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworfQorCitURVNUKEVTRFNTYW5pdHlVbml0VGVzdCwgQ29uc3RydWN0b3JTYW5pdHlUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBtYWxsb2MoMSk7CisgICAgQVNTRVJUX05FKGludmFsaWREYXRhLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSI7CisgICAgRVNEUyBlc2RzX3plcm8oaW52YWxpZERhdGEsIDApOworICAgIGZyZWUoaW52YWxpZERhdGEpOworICAgIEFTU0VSVF9ORShlc2RzX3plcm8uSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworCisgICAgRVNEUyBlc2RzX251bGwoTlVMTCwgMCk7CisgICAgQVNTRVJUX05FKGVzZHNfbnVsbC5Jbml0Q2hlY2soKSwgT0spIDw8ICJpbnZhbGlkIEVTRFMgZGF0YSBhY2NlcHRlZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIENyZWF0ZUFuZERlc3Ryb3lUZXN0KSB7CisgICAgRVNEUyBlc2RzKG1FU0RTRGF0YSwgbUVTRFNTaXplKTsKKyAgICBBU1NFUlRfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spIDw8ICJFU0RTIGRhdGEgaW52YWxpZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIE9iamVjdFR5cGVJbmRpY2F0aW9uVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShvYmplY3RUeXBlSW5kaWNhdGlvbiwgbUVTRFNQYXJhbXMub2JqZWN0VHlwZUluZGljYXRpb24pCisgICAgICAgICAgICA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBDb2RlY1NwZWNpZmljSW5mb1Rlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgY29uc3Qgdm9pZCAqY29kZWNTcGVjaWZpY0luZm87CisgICAgc2l6ZV90IGNvZGVjU3BlY2lmaWNJbmZvU2l6ZTsKKyAgICBzdGF0dXMgPSBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY1NwZWNpZmljSW5mbywgJmNvZGVjU3BlY2lmaWNJbmZvU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJFU0RTIGdldENvZGVjU3BlY2lmaWNJbmZvIGRhdGEgaW52YWxpZCI7CisgICAgQVNTRVJUX0VRKG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIGNvZGVjU3BlY2lmaWNJbmZvU2l6ZSkKKyAgICAgICAgICAgIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworICAgIHN0YXR1cyA9IG1lbWNtcChjb2RlY1NwZWNpZmljSW5mbywgbUVTRFNQYXJhbXMuY29kZWNTcGVjaWZpY0luZm9EYXRhLCBjb2RlY1NwZWNpZmljSW5mb1NpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBHZXRCaXRyYXRlVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQzMl90IGJpdHJhdGVNYXg7CisgICAgdWludDMyX3QgYml0cmF0ZUF2ZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlc2RzLmdldEJpdFJhdGUoJmJpdHJhdGVNYXgsICZiaXRyYXRlQXZnKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkVTRFMgYml0UmF0ZSBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShiaXRyYXRlTWF4LCBtRVNEU1BhcmFtcy5iaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShiaXRyYXRlQXZnLCBtRVNEU1BhcmFtcy5iaXRyYXRlQXZnKSA8PCAiRVNEUyBiaXRyYXRlQXZnIGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9MRShiaXRyYXRlQXZnLCBiaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGlzIGxlc3MgdGhhbiBiaXRyYXRlQXZnIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFU0RTVW5pdFRlc3RBbGwsIEVTRFNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gSW5wdXRGaWxlLCBPYmplY3RUeXBlSW5kaWNhdGlvbiwgQ29kZWNTcGVjaWZpY0luZm9EYXRhLAorICAgICAgICAgICAgICAgIC8vIENvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIEJpdHJhdGVNYXgsIEJpdHJhdGVBdmcKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfc3RlcmVvXzEyOGticHNfMjIwNTBoei4zZ3AiLCA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEzXHg5MCIsIDIsIDEzMTA3MiwgMCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTI4MHg3MjBfbXA0X21wZWcyXzMwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDFceEIzXHg1MFx4MDJceEQwXHgzNVx4RkZceEZGXHhFMVx4QTBceDAwXHgwMFx4MDFceEI1XHgxNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDZBXHgwMFx4MDFceDAwXHgwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMzQxNTQ1MiwgMzQxNTQ1MiksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX21vbm9fMjRrYnBzXzExMDI1aHouM2dwIiwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxNVx4MDgiLCAyLCAyNDU3NiwgMCkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgLy8gTWVkaWFFeHRyYWN0b3IgbmVlZHMgYmluZGVyIHRocmVhZCBwb29sCisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIGdFbnYgPSBuZXcgRVNEU1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0VTRFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEVTRFNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBFU0RTVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEVTRFNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGZiODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgRVNEUyBVbml0IFRlc3QgOgorVGhlIEVTRFMgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgRVNEUyBjbGFzcyBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEVTRFNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0VTRFNUZXN0L0VTRFNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvRVNEU1Rlc3QvRVNEU1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXApCitEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggRVNEU1Rlc3RSZXMgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBFU0RTVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEVTRFNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmYzODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiSEVWQ1V0aWxzVW5pdFRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjg1MGEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIEhFVkMgVXRpbHMgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJIRVZDVXRpbHNVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0hFVkNVdGlscy9IRVZDVXRpbHNVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJIRVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0LyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ4MWUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19IRVZDX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YTA0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIZXZjVXRpbGl0eVRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisjaW5jbHVkZSAiaW5jbHVkZS9IZXZjVXRpbHMuaCIKKworI2luY2x1ZGUgIkhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLy8gbWF4IHNpemUgb2YgaHZjYyBib3ggaXMgMiBLQgorY29uc3RleHByIHVpbnQzMl90IGtIdmNjQm94TWF4U2l6ZSA9IDIwNDg7Citjb25zdGV4cHIgdWludDMyX3Qga0h2Y2NCb3hNaW5TaXplID0gMjA7Citjb25zdGV4cHIgdWludDMyX3Qga1ZQU0NvZGUgPSAzMjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrU1BTQ29kZSA9IDMzOworY29uc3RleHByIHVpbnQzMl90IGtQUFNDb2RlID0gMzQ7Citjb25zdGV4cHIgdWludDMyX3Qga05BTFNpemVMZW5ndGggPSAyOworCitzdGF0aWMgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgSEVWQ1V0aWxzVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nLCAvKm51bVZQU05hbHMqLyBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtU1BTTmFscyovIHNpemVfdCwgLypudW1QUFNOYWxzKi8gc2l6ZV90LCAvKmZyYW1lUmF0ZSovIGludDE2X3QsCisgICAgICAgICAgICAgICAgICAgIC8qaXNIZHIqLyBib29sPj4geworICBwdWJsaWM6CisgICAgfkhFVkNVdGlsc1VuaXRUZXN0KCkgeworICAgICAgICBpZiAobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1NZWRpYUZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbmZvRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbmZvRmlsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzdHJpbmcsIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludDE2X3QsIGJvb2w+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dE1lZGlhRmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1NZWRpYUZpbGVTdHJlYW0ub3BlbihpbnB1dE1lZGlhRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobU1lZGlhRmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBtZWRpYSBmaWxlOiAiIDw8IGlucHV0TWVkaWFGaWxlOworCisgICAgICAgIHN0cmluZyBpbnB1dEluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4oaW5wdXRJbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGluZm8gZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworCisgICAgICAgIG1OdW1WUFNOYWxzID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIG1OdW1TUFNOYWxzID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1OdW1QUFNOYWxzID0gZ2V0PDQ+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBnZXQ8NT4ocGFyYW1zKTsKKyAgICAgICAgbUlzSERSID0gZ2V0PDY+KHBhcmFtcyk7CisgICAgfQorCisgICAgc2l6ZV90IG1OdW1WUFNOYWxzOworICAgIHNpemVfdCBtTnVtU1BTTmFsczsKKyAgICBzaXplX3QgbU51bVBQU05hbHM7CisgICAgaW50MTZfdCBtRnJhbWVSYXRlOworICAgIGJvb2wgbUlzSERSOworICAgIGlmc3RyZWFtIG1NZWRpYUZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworVEVTVF9QKEhFVkNVdGlsc1VuaXRUZXN0LCBOQUxVbml0VGVzdCkgeworICAgIEhldmNQYXJhbWV0ZXJTZXRzIGhldmNQYXJhbXM7CisKKyAgICBzdHJpbmcgbGluZTsKKyAgICBpbnQzMl90IGluZGV4ID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBzdHJpbmcgdHlwZTsKKyAgICAgICAgaW50MzJfdCBjaHVua0xlbmd0aDsKKworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aDsKKyAgICAgICAgQVNTRVJUX0dUKGNodW5rTGVuZ3RoLCAwKSA8PCAiTGVuZ3RoIG9mIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBtTWVkaWFGaWxlU3RyZWFtLnJlYWQoZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbU1lZGlhRmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICAvLyBBIHZhbGlkIHN0YXJ0Y29kZSBjb25zaXN0cyBvZiBhdCBsZWFzdCB0d28gMHgwMCBieXRlcyBmb2xsb3dlZCBieSAweDAxLgorICAgICAgICBpbnQzMl90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoOyBvZmZzZXQgKyAyIDwgY2h1bmtMZW5ndGg7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICBpZiAoZGF0YVtvZmZzZXQgKyAyXSA9PSAweDAxICYmIGRhdGFbb2Zmc2V0ICsgMV0gPT0gMHgwMCAmJiBkYXRhW29mZnNldF0gPT0gMHgwMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9mZnNldCArPSAzOworICAgICAgICBBU1NFUlRfTEUob2Zmc2V0LCBjaHVua0xlbmd0aCkgPDwgIk5BTCB1bml0IG9mZnNldCBtdXN0IG5vdCBleGNlZWQgdGhlIGNodW5rIGxlbmd0aCI7CisKKyAgICAgICAgdWludDhfdCAqbmFsVW5pdCA9ICh1aW50OF90ICopKGRhdGEgKyBvZmZzZXQpOworICAgICAgICBzaXplX3QgbmFsVW5pdExlbmd0aCA9IGNodW5rTGVuZ3RoIC0gb2Zmc2V0OworCisgICAgICAgIC8vIEFkZCBOQUwgdW5pdHMgb25seSBpZiB0aGV5J3JlIG9mIHR5cGU6IFZQUy9TUFMvUFBTL1NFSQorICAgICAgICBpZiAoISgodHlwZS5jb21wYXJlKCJWUFMiKSAmJiB0eXBlLmNvbXBhcmUoIlNQUyIpICYmIHR5cGUuY29tcGFyZSgiUFBTIikgJiYKKyAgICAgICAgICAgICAgIHR5cGUuY29tcGFyZSgiU0VJIikpKSkgeworICAgICAgICAgICAgZXJyID0gaGV2Y1BhcmFtcy5hZGROYWxVbml0KG5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBOQUwgVW5pdCB0eXBlOiAiIDw8IHR5cGUgPDwgIiBTaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIHNpemVfdCBzaXplTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0U2l6ZShpbmRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoc2l6ZU5hbFVuaXQsIG5hbFVuaXRMZW5ndGgpIDw8ICJJbnZhbGlkIHNpemUgcmV0dXJuZWQgZm9yIE5BTDogIiA8PCB0eXBlOworCisgICAgICAgICAgICB1aW50OF90ICpkZXN0aW5hdGlvbiA9ICh1aW50OF90ICopbWFsbG9jKG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX05FKGRlc3RpbmF0aW9uLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplOiAiIDw8IG5hbFVuaXRMZW5ndGg7CisKKyAgICAgICAgICAgIGJvb2wgc3RhdHVzID0gaGV2Y1BhcmFtcy53cml0ZShpbmRleCwgZGVzdGluYXRpb24sIG5hbFVuaXRMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIHdyaXRlIE5BTCBVbml0IGRhdGEiOworCisgICAgICAgICAgICBmcmVlKGRlc3RpbmF0aW9uKTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBoZXZjUGFyYW1zLmFkZE5hbFVuaXQobmFsVW5pdCwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJJbnZhbGlkIE5BTCBVbml0IGFkZGVkLCB0eXBlOiAiIDw8IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICB9CisKKyAgICBzaXplX3QgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtWUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1WUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFZQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtTUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1TUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFNQUyBOQUwgVW5pdHMiOworCisgICAgbnVtTmFsVW5pdHMgPSBoZXZjUGFyYW1zLmdldE51bU5hbFVuaXRzT2ZUeXBlKGtQUFNDb2RlKTsKKyAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OdW1QUFNOYWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIFBQUyBOQUwgVW5pdHMiOworCisgICAgSGV2Y1BhcmFtZXRlclNldHM6OkluZm8gaW5mbyA9IGhldmNQYXJhbXMuZ2V0SW5mbygpOworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSXNIZHIsCisgICAgICAgICAgICAgIChtSXNIRFIgPyBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Jc0hkciA6IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb05vbmUpKQorICAgICAgICAgICAgPDwgIldyb25nIGluZm8gYWJvdXQgSERSIjsKKworICAgIEFTU0VSVF9FUShpbmZvICYgSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSGFzQ29sb3JEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgKG1Jc0hEUiA/IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb0hhc0NvbG9yRGVzY3JpcHRpb24gOiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Ob25lKSkKKyAgICAgICAgICAgIDw8ICJXcm9uZyBpbmZvIGFib3V0IGNvbG9yIGRlc2NyaXB0aW9uIjsKKworICAgIC8vIGFuIEhFVkMgZmlsZSBzdGFydHMgd2l0aCBWUFMsIFNQUyBhbmQgUFBTIE5BTCB1bml0cyBpbiBzZXF1ZW5jZS4KKyAgICB1aW50OF90IHR5cGVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRUeXBlKDApOworICAgIEFTU0VSVF9FUSh0eXBlTmFsVW5pdCwga0hldmNOYWxVbml0VHlwZVZwcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBOQUwgdHlwZTogMzIoVlBTKSwgZm91bmQ6ICIgPDwgdHlwZU5hbFVuaXQ7CisKKyAgICB0eXBlTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0VHlwZSgxKTsKKyAgICBBU1NFUlRfRVEodHlwZU5hbFVuaXQsIGtIZXZjTmFsVW5pdFR5cGVTcHMpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgTkFMIHR5cGU6IDMzKFNQUyksIGZvdW5kOiAiIDw8IHR5cGVOYWxVbml0OworCisgICAgdHlwZU5hbFVuaXQgPSBoZXZjUGFyYW1zLmdldFR5cGUoMik7CisgICAgQVNTRVJUX0VRKHR5cGVOYWxVbml0LCBrSGV2Y05hbFVuaXRUeXBlUHBzKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIE5BTCB0eXBlOiAzNChQUFMpLCBmb3VuZDogIiA8PCB0eXBlTmFsVW5pdDsKKworICAgIHNpemVfdCBodmNjQm94U2l6ZSA9IGtIdmNjQm94TWF4U2l6ZTsKKyAgICB1aW50OF90ICpodmNjID0gKHVpbnQ4X3QgKiltYWxsb2Moa0h2Y2NCb3hNYXhTaXplKTsKKyAgICBBU1NFUlRfTkUoaHZjYywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGh2Y2MgYnVmZmVyIG9mIHNpemU6ICIgPDwga0h2Y2NCb3hNYXhTaXplOworCisgICAgZXJyID0gaGV2Y1BhcmFtcy5tYWtlSHZjYyhodmNjLCAmaHZjY0JveFNpemUsIGtOQUxTaXplTGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJVbmFibGUgdG8gY3JlYXRlIGh2Y2MgYm94IjsKKworICAgIEFTU0VSVF9HVChodmNjQm94U2l6ZSwga0h2Y2NCb3hNaW5TaXplKQorICAgICAgICAgICAgPDwgIkh2Y2MgYm94IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gIiA8PCBrSHZjY0JveE1pblNpemU7CisKKyAgICBpbnQxNl90IGZyYW1lUmF0ZSA9IGh2Y2Nba0h2Y2NCb3hNaW5TaXplIC0gMV0gfCAoaHZjY1trSHZjY0JveE1pblNpemVdIDw8IDgpOworICAgIGlmIChmcmFtZVJhdGUgIT0gbUZyYW1lUmF0ZSkKKyAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIEV4cGVjdGVkIGZyYW1lIHJhdGU6ICIgPDwgbUZyYW1lUmF0ZSA8PCAiIEZvdW5kOiAiIDw8IGZyYW1lUmF0ZQorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmcmVlKGh2Y2MpOworfQorCisvLyBJbmZvIEZpbGUgY29udGFpbnMgdGhlIHR5cGUgYW5kIGxlbmd0aCBmb3IgZWFjaCBjaHVuay9mcmFtZQorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBIRVZDVXRpbHNVbml0VGVzdEFsbCwgSEVWQ1V0aWxzVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzM4NDB4MjE2MHA1MGYzMDBfMzI1MDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8zODQweDIxNjBwNTBmMzAwXzMyNTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgNTAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDI0ZjMwMF80NTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMjRmMzAwXzMwMDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzUwMGticHMuaW5mbyIsIDEsIDEsIDEsIDI0LCBmYWxzZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTBlOTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEhFVkMgVXRpbHMgVGVzdAorVGhlIEhFVkMgVXRpbGl0eSBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBIZXZjVXRpbHMgbGlicmFyeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEhFVkNVdGlsc1VuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0hFVkNVdGlsc1VuaXRUZXN0L0hFVkNVdGlsc1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0hFVkNVdGlscy9IRVZDVXRpbHNVbml0VGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBIRVZDVXRpbHNVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEhFVkNVdGlsc1VuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZXh0cmFjdG9yRmFjdG9yeS9BbmRyb2lkLmJwCmluZGV4IDI2ZWM1MDcuLjEzZDViODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2V4dHJhY3RvckZhY3RvcnkvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9leHRyYWN0b3JGYWN0b3J5L0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIkV4dHJhY3RvckZhY3RvcnlUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDk3ODMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIiwKKyAgICBdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21lZGlhY2xvY2tfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYUNsb2NrRnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21lZGlhc2Nhbm5lcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyRnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NraXBjdXRidWZmZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJTa2lwQ3V0QnVmZmVyRnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21lZGlhbXV4ZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJNZWRpYU11eGVyRnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mdXp6ZXJfZGVmYXVsdHMiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZyYW1lRGVjb2Rlcl9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkZyYW1lRGVjb2RlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZnV6emVyX2RlZmF1bHRzIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF93cml0ZXJfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJGdXp6ZXJNZWRpYVV0aWxpdHkuY3BwIiwKKyAgICAgICAgIldyaXRlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgZGljdGlvbmFyeTogImRpY3Rpb25hcmllcy9mb3JtYXRzLmRpY3QiLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJvZ2ciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1MTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnJhbWVEZWNvZGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvRnJhbWVEZWNvZGVyLmgiCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSAiRnJhbWVEZWNvZGVySGVscGVycy5oIgorI2luY2x1ZGUgIklNZWRpYVNvdXJjZUZ1enpJbXBsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBNQVhfTUVESUFfQlVGRkVSX1NJWkUgMjA0OAorCisvLyBGdXp6ZXIgZW50cnkgcG9pbnQuCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgLy8gSW5pdCBvdXIgd3JhcHBlcgorICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAoZGF0YSwgc2l6ZSk7CisKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoZmRwLnJlbWFpbmluZ19ieXRlcygpKTsKKyAgICBBU3RyaW5nIGNvbXBvbmVudE5hbWUobmFtZS5jX3N0cigpKTsKKyAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gZ2VuZXJhdGVNZXRhRGF0YSgmZmRwKTsKKyAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IG5ldyBJTWVkaWFTb3VyY2VGdXp6SW1wbCgmZmRwLCBNQVhfTUVESUFfQlVGRkVSX1NJWkUpOworCisgICAgLy8gSW1hZ2Ugb3IgdmlkZW8gRGVjb2Rlcj8KKyAgICBzcDxGcmFtZURlY29kZXI+IGRlY29kZXI7CisgICAgYm9vbCBpc1ZpZGVvRGVjb2RlciA9IGZkcC5Db25zdW1lQm9vbCgpOworICAgIGlmIChpc1ZpZGVvRGVjb2RlcikgeworICAgICAgICBkZWNvZGVyID0gbmV3IFZpZGVvRnJhbWVEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZWNvZGVyID0gbmV3IE1lZGlhSW1hZ2VEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKKyAgICB9CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgMykpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBkZWNvZGVyLT5pbml0KC8qZnJhbWVUaW1lVXMqLyBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9wdGlvbiovIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb2xvckZvcm1hdCovIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBkZWNvZGVyLT5leHRyYWN0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgICAgIEZyYW1lUmVjdCByZWN0OworICAgICAgICAgICAgICAgIHJlY3QubGVmdCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICByZWN0LnRvcCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICByZWN0LnJpZ2h0ID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgICAgIHJlY3QuYm90dG9tID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICAgICAgICAgIGRlY29kZXItPmV4dHJhY3RGcmFtZSgmcmVjdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gZ2VuZXJhdGVNZXRhRGF0YSgmZmRwKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLT5nZXRNZXRhZGF0YU9ubHkodHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbG9yRm9ybWF0Ki8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGh1bWJuYWlsKi8gZmRwLkNvbnN1bWVCb29sKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZ2VuZXJhdGVkX21pbWVfdHlwZXMuY2xlYXIoKTsKKworICAgIHJldHVybiAwOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJIZWxwZXJzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0ZyYW1lRGVjb2RlckhlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhjMDRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GcmFtZURlY29kZXJIZWxwZXJzLmgKQEAgLTAsMCArMSw5MCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgIk1lZGlhTWltZVR5cGVzLmgiCisKKyNkZWZpbmUgTUFYX01FVEFEQVRBX0JVRl9TSVpFIDUxMgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjaGFyPj4gZ2VuZXJhdGVkX21pbWVfdHlwZXM7CisKK3NwPE1ldGFEYXRhPiBnZW5lcmF0ZU1ldGFEYXRhKEZ1enplZERhdGFQcm92aWRlciAqZmRwKSB7CisgICAgc3A8TWV0YURhdGE+IG5ld01ldGEgPSBuZXcgTWV0YURhdGEoKTsKKworICAgIC8vIHJhbmRvbSBNSU1FIFR5cGUKKyAgICBjb25zdCBjaGFyICptaW1lX3R5cGU7CisgICAgc2l6ZV90IGluZGV4ID0gZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga01pbWVUeXBlcy5zaXplKCkpOworICAgIC8vIExldCB0aGVyZSBiZSBhIGNoYW5jZSBvZiBhIHRydWUgcmFuZG9tIHN0cmluZworICAgIGlmIChpbmRleCA9PSBrTWltZVR5cGVzLnNpemUoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBtaW1lX3N0ciA9IGZkcC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyg2NCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjaGFyPiBtaW1lX2NzdHIobmV3IGNoYXJbbWltZV9zdHIubGVuZ3RoKCkrMV0pOworICAgICAgICBnZW5lcmF0ZWRfbWltZV90eXBlcy5wdXNoX2JhY2sobWltZV9jc3RyKTsKKyAgICAgICAgc3RybmNweShtaW1lX2NzdHIuZ2V0KCksIG1pbWVfc3RyLmNfc3RyKCksIG1pbWVfc3RyLmxlbmd0aCgpKzEpOworICAgICAgICBtaW1lX3R5cGUgPSBtaW1lX2NzdHIuZ2V0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWltZV90eXBlID0ga01pbWVUeXBlc1tpbmRleF07CisgICAgfQorICAgIG5ld01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lX3R5cGUpOworCisgICAgLy8gVGh1bWJuYWlsIHRpbWUKKyAgICBuZXdNZXRhLT5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisKKyAgICAvLyBWYWx1ZXMgdXNlZCBieSBhbGxvY1ZpZGVvRnJhbWUKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHNpemVfdCBwcm9maWxlX3NpemUgPQorICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBNQVhfTUVUQURBVEFfQlVGX1NJWkUpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHByb2ZpbGVfYnl0ZXMgPQorICAgICAgICBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90Pihwcm9maWxlX3NpemUpOworICAgIG5ld01ldGEtPnNldERhdGEoa0tleUljY1Byb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9ieXRlcy5lbXB0eSgpID8gbnVsbHB0ciA6IHByb2ZpbGVfYnl0ZXMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9ieXRlcy5zaXplKCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlTQVJXaWR0aCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleVNBUkhlaWdodCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgLy8gVmFsdWVzIHVzZWQgYnkgZmluZFRodW1ibmFpbEluZm8KKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIG5ld01ldGEtPnNldEludDMyKGtLZXlUaHVtYm5haWxIZWlnaHQsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHNpemVfdCB0aHVtYm5haWxfc2l6ZSA9CisgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIE1BWF9NRVRBREFUQV9CVUZfU0laRSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGh1bWJfYnl0ZXMgPQorICAgICAgICBmZHAtPkNvbnN1bWVCeXRlczx1aW50OF90Pih0aHVtYm5haWxfc2l6ZSk7CisgICAgbmV3TWV0YS0+c2V0RGF0YShrS2V5VGh1bWJuYWlsSFZDQywKKyAgICAgICAgICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCksCisgICAgICAgICAgICAgICAgICAgICB0aHVtYl9ieXRlcy5lbXB0eSgpID8gbnVsbHB0ciA6IHRodW1iX2J5dGVzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgIHRodW1iX2J5dGVzLnNpemUoKSk7CisKKyAgICAvLyBWYWx1ZXMgdXNlZCBieSBmaW5kR3JpZEluZm8KKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5VGlsZVdpZHRoLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5VGlsZUhlaWdodCwgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgbmV3TWV0YS0+c2V0SW50MzIoa0tleUdyaWRSb3dzLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5R3JpZENvbHMsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgLy8gQSBmZXcgZnVuY3Rpb25zIHBlcmZvcm0gYSBDSEVDSygpIHRoYXQgaGVpZ2h0L3dpZHRoIGFyZSBzZXQKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICBuZXdNZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGZkcC0+Q29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgcmV0dXJuIG5ld01ldGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL0Z1enplck1lZGlhVXRpbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwYWU5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmNwcApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkZ1enplck1lZGlhVXRpbGl0eS5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CisKKyNpbmNsdWRlICJNZWRpYU1pbWVUeXBlcy5oIgorI2luY2x1ZGUgIndlYm0vV2VibVdyaXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitzdGQ6OnN0cmluZyBnZW5NaW1lVHlwZShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlcikgeworICAgIHVpbnQ4X3QgaWR4ID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIGtNaW1lVHlwZXMuc2l6ZSgpIC0gMSk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGtNaW1lVHlwZXNbaWR4XSk7Cit9CisKK3NwPElNZWRpYUV4dHJhY3Rvcj4gZ2VuTWVkaWFFeHRyYWN0b3IoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHN0ZDo6c3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBtYXhEYXRhQW1vdW50KSB7CisgICAgdWludDMyX3QgZGF0YUJsb2JTaXplID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQxNl90PigwLCBtYXhEYXRhQW1vdW50KTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lQnl0ZXM8dWludDhfdD4oZGF0YUJsb2JTaXplKTsKKyAgICAvLyBkYXRhOls8bWVkaWF0eXBlPl1bO2Jhc2U2NF0sPGRhdGE+CisgICAgc3RkOjpzdHJpbmcgdXJpKCJkYXRhOiIpOworICAgIHVyaSArPSBtaW1lVHlwZTsKKyAgICAvLyBDdXJyZW50bHkgbGlic3RhZ2VmcmlnaHQgb25seSBhY2NlcHRzIGJhc2U2NCB1cmlzCisgICAgdXJpICs9ICI7YmFzZTY0LCI7CisgICAgYW5kcm9pZDo6QVN0cmluZyBvdXQ7CisgICAgYW5kcm9pZDo6ZW5jb2RlQmFzZTY0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwgJm91dCk7CisgICAgdXJpICs9IG91dC5jX3N0cigpOworCisgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KKyAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCktPkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgdXJpLmNfc3RyKCkpOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShzb3VyY2UpOworfQorCitzcDxNZWRpYVNvdXJjZT4gZ2VuTWVkaWFTb3VyY2UoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHVpbnQxNl90IG1heE1lZGlhQmxvYlNpemUpIHsKKyAgICBzdGQ6OnN0cmluZyBtaW1lID0gZ2VuTWltZVR5cGUoZGF0YVByb3ZpZGVyKTsKKyAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IGdlbk1lZGlhRXh0cmFjdG9yKGRhdGFQcm92aWRlciwgbWltZSwgbWF4TWVkaWFCbG9iU2l6ZSk7CisKKyAgICBpZiAoZXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7ICsraSkgeworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKworICAgICAgICBjb25zdCBjaGFyICp0cmFja01pbWU7CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIHRyYWNrTWltZSkpIHsKKyAgICAgICAgICAgIHNwPElNZWRpYVNvdXJjZT4gdHJhY2sgPSBleHRyYWN0b3ItPmdldFRyYWNrKGkpOworICAgICAgICAgICAgaWYgKHRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tNZWRpYVNvdXJjZSh0cmFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3A8TWVkaWFXcml0ZXI+IGNyZWF0ZVdyaXRlcihpbnQgZmQsIFN0YW5kYXJkV3JpdGVycyB3cml0ZXJUeXBlLCBzcDxNZXRhRGF0YT4gZmlsZU1ldGEpIHsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyOworICAgIHN3aXRjaCAod3JpdGVyVHlwZSkgeworICAgICAgICBjYXNlIE9HRzoKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPZ2dXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9PR0cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUFDOgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IEFBQ1dyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FBQ19BRElGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQ19BRFRTOgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IEFBQ1dyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FBQ19BRFRTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdFQk06CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX1dFQk0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVBFRzQ6CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOworICAgICAgICAgICAgZmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU1SX05COgorICAgICAgICAgICAgd3JpdGVyID0gbmV3IEFNUldyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FNUl9OQik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTVJfV0I6CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgQU1SV3JpdGVyKGZkKTsKKyAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfQU1SX1dCKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUcyVFM6CisgICAgICAgICAgICB3cml0ZXIgPSBuZXcgTVBFRzJUU1dyaXRlcihmZCk7CisgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX01QRUcyVFMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKHdyaXRlciAhPSBudWxscHRyKSB7CisgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5UmVhbFRpbWVSZWNvcmRpbmcsIGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlcjsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9GdXp6ZXJNZWRpYVV0aWxpdHkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThiZmI5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvRnV6emVyTWVkaWFVdGlsaXR5LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NhbGxiYWNrTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2VudW0gU3RhbmRhcmRXcml0ZXJzIHsKKyAgICBPR0csCisgICAgQUFDLAorICAgIEFBQ19BRFRTLAorICAgIFdFQk0sCisgICAgTVBFRzQsCisgICAgQU1SX05CLAorICAgIEFNUl9XQiwKKyAgICBNUEVHMlRTLAorICAgIC8vIEFsbG93cyBGdXp6ZWREYXRhUHJvdmlkZXIgdG8gZmluZCB0aGUgZW5kIG9mIHRoaXMgZW51bS4KKyAgICBrTWF4VmFsdWUgPSBNUEVHMlRTLAorfTsKKworc3RkOjpzdHJpbmcgZ2VuTWltZVR5cGUoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIpOworc3A8SU1lZGlhRXh0cmFjdG9yPiBnZW5NZWRpYUV4dHJhY3RvcihGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgdWludDE2X3QgZGF0YUFtb3VudCk7CitzcDxNZWRpYVNvdXJjZT4gZ2VuTWVkaWFTb3VyY2UoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHVpbnQxNl90IG1heE1lZGlhQmxvYlNpemUpOworCitzcDxNZWRpYVdyaXRlcj4gY3JlYXRlV3JpdGVyKGludDMyX3QgZmQsIFN0YW5kYXJkV3JpdGVycyB3cml0ZXJUeXBlLCBzcDxNZXRhRGF0YT4gZmlsZU1ldGEpOworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvSU1lZGlhU291cmNlRnV6ekltcGwuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvSU1lZGlhU291cmNlRnV6ekltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY5OTUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9JTWVkaWFTb3VyY2VGdXp6SW1wbC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElNRURJQVNPVVJDRUZVWlpJTVBMX0gKKyNkZWZpbmUgSU1FRElBU09VUkNFRlVaWklNUExfSAorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJTWVkaWFTb3VyY2VGdXp6SW1wbCA6IHB1YmxpYyBJTWVkaWFTb3VyY2UgeworIHB1YmxpYzoKKyAgICBJTWVkaWFTb3VyY2VGdXp6SW1wbChGdXp6ZWREYXRhUHJvdmlkZXIgKl9mZHAsIHNpemVfdCBfbWF4X2J1ZmZlcl9zaXplKSA6CisgICAgICAgIGZkcChfZmRwKSwKKyAgICAgICAgbWF4X2J1ZmZlcl9zaXplKF9tYXhfYnVmZmVyX3NpemUpIHt9CisgICAgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEqKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0KCkgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHN0YXR1c190IHJlYWQoTWVkaWFCdWZmZXJCYXNlKiosCisgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyopIG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlYWRNdWx0aXBsZShWZWN0b3I8TWVkaWFCdWZmZXJCYXNlKj4qLCB1aW50MzJfdCwKKyAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKikgb3ZlcnJpZGU7CisgICAgYm9vbCBzdXBwb3J0UmVhZE11bHRpcGxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICBzdGF0dXNfdCBwYXVzZSgpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKworIHByb3RlY3RlZDoKKyAgICBJQmluZGVyKiBvbkFzQmluZGVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgcHJpdmF0ZToKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8TWVkaWFCdWZmZXJCYXNlPj4gYnVmZmVyX2Jhc2VzOworICAgIGNvbnN0IHNpemVfdCBtYXhfYnVmZmVyX3NpemU7Cit9OworCisvLyBUaGlzIGNsYXNzIGlzIHNpbXBseSB0byBleHBvc2UgdGhlIGRlc3RydWN0b3IKK2NsYXNzIE1lZGlhQnVmZmVyRnV6ekltcGwgOiBwdWJsaWMgTWVkaWFCdWZmZXIgeworIHB1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckZ1enpJbXBsKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSA6IE1lZGlhQnVmZmVyKGRhdGEsIHNpemUpIHt9CisgICAgfk1lZGlhQnVmZmVyRnV6ekltcGwoKSB7fQorfTsKKworc3RhdHVzX3QgSU1lZGlhU291cmNlRnV6ekltcGw6OnJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAorICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKyAgICBWZWN0b3I8TWVkaWFCdWZmZXJCYXNlKj4gYnVmZmVyczsKKyAgICBzdGF0dXNfdCByZXQgPSByZWFkTXVsdGlwbGUoJmJ1ZmZlcnMsIDEsIG9wdGlvbnMpOworICAgICpidWZmZXIgPSBidWZmZXJzLmVtcHR5KCkgPyBudWxscHRyIDogYnVmZmVyc1swXTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IElNZWRpYVNvdXJjZUZ1enpJbXBsOjpyZWFkTXVsdGlwbGUoVmVjdG9yPE1lZGlhQnVmZmVyQmFzZSo+KiBidWZmZXJzLAorICAgICAgICB1aW50MzJfdCBtYXhOdW1CdWZmZXJzLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqKSB7CisgICAgdWludDMyX3QgbnVtX2J1ZmZlcnMgPQorICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDAsIG1heE51bUJ1ZmZlcnMpOworICAgIGZvcih1aW50MzJfdCBpID0gMDsgaSA8IG51bV9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmID0gZmRwLT5Db25zdW1lQnl0ZXM8dWludDhfdD4oCisgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBtYXhfYnVmZmVyX3NpemUpKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFCdWZmZXJCYXNlPiBtYmIoCisgICAgICAgICAgICBuZXcgTWVkaWFCdWZmZXJGdXp6SW1wbChidWYuZGF0YSgpLCBidWYuc2l6ZSgpKSk7CisKKyAgICAgICAgYnVmZmVyX2Jhc2VzLnB1c2hfYmFjayhtYmIpOworICAgICAgICBidWZmZXJzLT5wdXNoX2JhY2sobWJiLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBTVEFUVVNfT0sKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gSU1FRElBU09VUkNFRlVaWklNUExfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhQ2xvY2tGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYUNsb2NrRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYUNsb2NrRnV6emVyLmNwcApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KKy8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc3A8TWVkaWFDbG9jaz4gbUNsb2NrKG5ldyBNZWRpYUNsb2NrKTsKKworICAgIGJvb2wgcmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkgPiAwKSB7CisgICAgICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgNSkpIHsKKyAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DbG9jay0+aW5pdCgpOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydGluZ1RpbWVNZWRpYVVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgICAgICAgICAgIG1DbG9jay0+c2V0U3RhcnRpbmdUaW1lTWVkaWEoc3RhcnRpbmdUaW1lTWVkaWFVcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgICAgICBtQ2xvY2stPmNsZWFyQW5jaG9yKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGFuY2hvclRpbWVSZWFsVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICAgICAgICAgICAgaW50NjRfdCBhbmNob3JUaW1lTWVkaWFVcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYVVzID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpOworICAgICAgICAgICAgICAgIG1DbG9jay0+dXBkYXRlQW5jaG9yKGFuY2hvclRpbWVNZWRpYVVzLCBhbmNob3JUaW1lUmVhbFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNDogeworICAgICAgICAgICAgICAgIGludDY0X3QgbWF4VGltZU1lZGlhVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICAgICAgICAgICAgbUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWF4VGltZU1lZGlhVXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNTogeworICAgICAgICAgICAgICAgIHdwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBtQ2xvY2stPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2UobXNnLnByb21vdGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTWltZVR5cGVzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTWltZVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzMzdhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNaW1lVHlwZXMuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZVWlpFUl9NRURJQU1JTUVUWVBFU19IXworI2RlZmluZSBGVVpaRVJfTUVESUFNSU1FVFlQRVNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBrTWltZVR5cGVzIHsKKyAgICBNRURJQV9NSU1FVFlQRV9JTUFHRV9KUEVHLAorICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyLAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1JBVywKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fU0NSQU1CTEVELAorICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDMsCisgICAgTUVESUFfTUlNRVRZUEVfVklERU9fWFZJRCwKKyAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUksCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTUlESSwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fUUNFTFAsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSwKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVELAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMsCisgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fV01BLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNLAorICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00sCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0LAorICAgIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYsCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRywKKyAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EsCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMsCisgICAgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSwKKyAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUywKKyAgICBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRiwKKyAgICBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFAsCisgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9TVUJSSVAsCisgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9WVFQsCisgICAgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNjA4LAorICAgIE1FRElBX01JTUVUWVBFX1RFWFRfQ0VBXzcwOCwKKyAgICBNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBGVVpaRVJfTUVESUFNSU1FVFlQRVNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNdXhlckZ1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjMyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL01lZGlhTXV4ZXJGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KKy8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisKKyNpbmNsdWRlIDxNZWRpYU11eGVyRnV6emVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgorI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIENhbid0IHNlZW0gdG8gZ2V0IHNldEJ1ZmZlciBvciBzZXRTdHJpbmcgd29ya2luZy4gSXQgYWx3YXlzIHNlZ2ZhdWx0cyBvbiBhCisvLyBudWxsIHBvaW50ZXIgcmVhZCBvciBtZW1sZWFrcy4gU28gdGhhdCBmdW5jdGlvbmFsaXR5IGlzIG1pc3NpbmcuCit2b2lkIGNyZWF0ZU1lc3NhZ2UoQU1lc3NhZ2UgKm1zZywgRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIHsKKyAgc2l6ZV90IGNvdW50ID0gZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgMzIpOworICB3aGlsZSAoZmRwLT5yZW1haW5pbmdfYnl0ZXMoKSA+IDAgJiYgY291bnQgPiAwKSB7CisgICAgdWludDhfdCBmdW5jdGlvbl9pZCA9CisgICAgICAgIGZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCBhbWVzc2FnZV9zZXR2YWxzLnNpemUoKSAtIDEpOworICAgIGFtZXNzYWdlX3NldHZhbHNbZnVuY3Rpb25faWRdKG1zZywgZmRwKTsKKyAgICBjb3VudC0tOworICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICBzaXplX3QgZGF0YV9zaXplID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBzaXplKTsKKyAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oIm1lZGlhbXV4ZXJfZnV6el9yZWdpb24iLCBkYXRhX3NpemUpOworICBpZiAoZmQgPCAwKQorICAgIHJldHVybiAwOworCisgIHVpbnQ4X3QgKnNoX2RhdGEgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KAorICAgICAgbW1hcChOVUxMLCBkYXRhX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKSk7CisgIGlmIChzaF9kYXRhID09IE1BUF9GQUlMRUQpCisgICAgcmV0dXJuIDA7CisKKyAgTWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0IGZvcm1hdCA9CisgICAgICAoTWVkaWFNdXhlcjo6T3V0cHV0Rm9ybWF0KWZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KDAsIDQpOworICBzcDxNZWRpYU11eGVyPiBtTXV4ZXIobmV3IE1lZGlhTXV4ZXIoZmQsIGZvcm1hdCkpOworCisgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkgPiAxKSB7CisgICAgc3dpdGNoIChmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCA0KSkgeworICAgIGNhc2UgMDogeworICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIGl0IG9ubHkgbGlrZXMgbXA0cyBoZXJlLi4uCisgICAgICBpZiAoZm9ybWF0ID09IDEgfHwgZm9ybWF0ID09IDQpCisgICAgICAgIGJyZWFrOworCisgICAgICBzcDxBTWVzc2FnZT4gYV9mb3JtYXQobmV3IEFNZXNzYWdlKTsKKyAgICAgIGNyZWF0ZU1lc3NhZ2UoYV9mb3JtYXQuZ2V0KCksICZmZHApOworICAgICAgbU11eGVyLT5hZGRUcmFjayhhX2Zvcm1hdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxOiB7CisgICAgICBtTXV4ZXItPnN0YXJ0KCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiB7CisgICAgICBpbnQgZGVncmVlcyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50PigpOworICAgICAgbU11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoZGVncmVlcyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAzOiB7CisgICAgICBpbnQgbGF0aXR1ZGUgPSBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgIGludCBsb25naXR1ZGUgPSBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgIG1NdXhlci0+c2V0TG9jYXRpb24obGF0aXR1ZGUsIGxvbmdpdHVkZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICBzaXplX3QgYnVmX3NpemUgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGRhdGFfc2l6ZSk7CisgICAgICBzcDxBQnVmZmVyPiBhX2J1ZmZlcihuZXcgQUJ1ZmZlcihidWZfc2l6ZSkpOworCisgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpOworICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCk7CisgICAgICB1aW50MzJfdCBmbGFncyA9IGZkcC5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgICBtTXV4ZXItPndyaXRlU2FtcGxlRGF0YShhX2J1ZmZlciwgdHJhY2tJbmRleCwgdGltZVVzLCBmbGFncyk7CisgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChmZHAuQ29uc3VtZUJvb2woKSkKKyAgICBtTXV4ZXItPnN0b3AoKTsKKworICBtdW5tYXAoc2hfZGF0YSwgZGF0YV9zaXplKTsKKyAgY2xvc2UoZmQpOworICByZXR1cm4gMDsKK30KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNdXhlckZ1enplci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9NZWRpYU11eGVyRnV6emVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q0NDIxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvTWVkaWFNdXhlckZ1enplci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KKy8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBNYXBwaW5ncyB2ZWN0b3JzIGFyZSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIHRoYXQgdGhlIE1lZGlhTXV4ZXIKKy8vIGNsYXNzIGxvb2tzIGZvciBpbiB0aGUgbWVzc2FnZS4KK3N0YXRpYyBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGZsb2F0TWFwcGluZ3N7CisgICAgImNhcHR1cmUtcmF0ZSIsCisgICAgInRpbWUtbGFwc2UtZnBzIiwKKyAgICAiZnJhbWUtcmF0ZSIsCit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBpbnQ2NE1hcHBpbmdzeworICAgICJleGlmLW9mZnNldCIsICAgICJleGlmLXNpemUiLCAidGFyZ2V0LXRpbWUiLAorICAgICJ0aHVtYm5haWwtdGltZSIsICJ0aW1lVXMiLCAgICAiZHVyYXRpb25VcyIsCit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBpbnQzMk1hcHBpbmdzeyJsb29wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUtc2NhbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvLW1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcmFtZS1jb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtYml0cmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY20tYmlnLWVuZGlhbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhbC1sYXllci1jb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhbC1sYXllci1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHVtYm5haWwtd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGh1bWJuYWlsLWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjay1pZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZC1zYW1wbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yLWZvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYS1zeXN0ZW0taWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMtc3luYy1mcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXRyYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC1iaXRyYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXItd2lkdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FyLWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNwbGF5LXdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXktaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzLWRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGlsZS13aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aWxlLWhlaWdodCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmlkLXJvd3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JpZC1jb2xzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvdGF0aW9uLWRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbC1jb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUtcmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXRzLXBlci1zYW1wbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbC1tYXNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZXItZGVsYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2Rlci1wYWRkaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzLWFkdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUtcmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC13aWR0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtaW5wdXQtc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXB0aWMtY2hhbm5lbC1jb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwY20tZW5jb2RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWFjLXByb2ZpbGUifTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChBTWVzc2FnZSAqLCBGdXp6ZWREYXRhUHJvdmlkZXIgKik+PgorICAgIGFtZXNzYWdlX3NldHZhbHMgPSB7CisgICAgICAgIFtdKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSAtPiB2b2lkIHsKKyAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpLAorICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oQU1lc3NhZ2UgKm1zZywgRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIC0+IHZvaWQgeworICAgICAgICAgIG1zZy0+c2V0RmxvYXQoZmxvYXRNYXBwaW5nc1tmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBmbG9hdE1hcHBpbmdzLnNpemUoKSAtIDEpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+Q29uc3VtZUZsb2F0aW5nUG9pbnQ8ZmxvYXQ+KCkpOworICAgICAgICB9LAorICAgICAgICBbXShBTWVzc2FnZSAqbXNnLCBGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkgLT4gdm9pZCB7CisgICAgICAgICAgbXNnLT5zZXRJbnQ2NChpbnQ2NE1hcHBpbmdzW2ZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGludDY0TWFwcGluZ3Muc2l6ZSgpIC0gMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEFNZXNzYWdlICptc2csIEZ1enplZERhdGFQcm92aWRlciAqZmRwKSAtPiB2b2lkIHsKKyAgICAgICAgICBtc2ctPnNldEludDMyKGludDMyTWFwcGluZ3NbZmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW50MzJNYXBwaW5ncy5zaXplKCkgLSAxKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBmZHAtPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgfX07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL1NraXBDdXRCdWZmZXJGdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Ta2lwQ3V0QnVmZmVyRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc4ZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9Ta2lwQ3V0QnVmZmVyRnV6emVyLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gQXV0aG9yczogY29yYmluLnNvdWZmcmFudEBsZXZpYXRoYW5zZWN1cml0eS5jb20KKy8vICAgICAgICAgIGR5bGFuLmthdHpAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisKKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgIHNpemVfdCBza2lwID0gZmRwLkNvbnN1bWVJbnRlZ3JhbDxzaXplX3Q+KCk7CisgIHNpemVfdCBjdXQgPSBmZHAuQ29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgc2l6ZV90IG51bTE2Q2hhbm5lbHMgPSBmZHAuQ29uc3VtZUludGVncmFsPHNpemVfdD4oKTsKKyAgc3A8U2tpcEN1dEJ1ZmZlcj4gc0J1ZmZlcihuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIG51bTE2Q2hhbm5lbHMpKTsKKworICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMCkgeworICAgIC8vIENhcCBzaXplIHRvIDEwMjQgdG8gbGltaXQgbWF4IGFtb3VudCBhbGxvY2F0ZWQuCisgICAgc2l6ZV90IGJ1Zl9zaXplID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCAxMDI0KTsKKyAgICBzaXplX3QgcmFuZ2UgPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGJ1Zl9zaXplKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBidWZfc2l6ZSAtIHJhbmdlKTsKKworICAgIHN3aXRjaCAoZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgNCkpIHsKKyAgICBjYXNlIDA6IHsKKyAgICAgIHNwPEFCdWZmZXI+IGFfYnVmZmVyKG5ldyBBQnVmZmVyKGJ1Zl9zaXplKSk7CisgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0KG5ldyBBTWVzc2FnZSk7CisgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBzX2J1ZmZlcihuZXcgTWVkaWFDb2RlY0J1ZmZlcihmb3JtYXQsIGFfYnVmZmVyKSk7CisgICAgICBzX2J1ZmZlci0+c2V0UmFuZ2UocmFuZ2UsIGxlbmd0aCk7CisgICAgICBzQnVmZmVyLT5zdWJtaXQoc19idWZmZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTogeworICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQnVmZmVyQmFzZT4gbV9idWZmZXIobmV3IE1lZGlhQnVmZmVyKGJ1Zl9zaXplKSk7CisgICAgICBtX2J1ZmZlci0+c2V0X3JhbmdlKHJhbmdlLCBsZW5ndGgpOworICAgICAgc0J1ZmZlci0+c3VibWl0KHJlaW50ZXJwcmV0X2Nhc3Q8TWVkaWFCdWZmZXIgKj4obV9idWZmZXIuZ2V0KCkpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIHNwPEFCdWZmZXI+IGFfYnVmZmVyKG5ldyBBQnVmZmVyKGJ1Zl9zaXplKSk7CisgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0KG5ldyBBTWVzc2FnZSk7CisgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBzX2J1ZmZlcihuZXcgTWVkaWFDb2RlY0J1ZmZlcihmb3JtYXQsIGFfYnVmZmVyKSk7CisgICAgICBhX2J1ZmZlci0+c2V0UmFuZ2UocmFuZ2UsIGxlbmd0aCk7CisgICAgICBzQnVmZmVyLT5zdWJtaXQoYV9idWZmZXIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMzogeworICAgICAgc0J1ZmZlci0+Y2xlYXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDQ6IHsKKyAgICAgIHNCdWZmZXItPnNpemUoKTsKKyAgICB9CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lckZ1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyRnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTBjOTUxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lckZ1enplci5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmg+CisKKyNpbmNsdWRlIDxjc3RkaW8+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIEZ1enpNZWRpYVNjYW5uZXJDbGllbnQgOiBwdWJsaWMgTWVkaWFTY2FubmVyQ2xpZW50IHsKKyBwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBzY2FuRmlsZShjb25zdCBjaGFyKiwgbG9uZyBsb25nLCBsb25nIGxvbmcsIGJvb2wsIGJvb2wpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVTdHJpbmdUYWcoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKSB7IHJldHVybiAwOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pbWVUeXBlKGNvbnN0IGNoYXIqKSB7IHJldHVybiAwOyB9Cit9OworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lciBtU2Nhbm5lciA9IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyKCk7CisgICAgLy8gV2l0aG91dCB0aGlzLCB0aGUgZnV6emVyIGNyYXNoZXMgZm9yIHNvbWUgcmVhc29uLgorICAgIG1TY2FubmVyLnNldExvY2FsZSgiIik7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpID4gMCkgeworICAgICAgICBzd2l0Y2ggKGZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIDEpKSB7CisgICAgICAgICAgICBjYXNlIDA6IHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoZmRwLnJlbWFpbmluZ19ieXRlcygpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtaW1lVHlwZSA9CisgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lZGlhU2Nhbm5lckNsaWVudD4gY2xpZW50KG5ldyBGdXp6TWVkaWFTY2FubmVyQ2xpZW50KCkpOworICAgICAgICAgICAgICAgIG1TY2FubmVyLnByb2Nlc3NGaWxlKHBhdGguY19zdHIoKSwgbWltZVR5cGUuY19zdHIoKSwgKmNsaWVudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgICAgICBpbnQgZmQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgICAgICAgICAgICBpZiAoZmQgPj0gMCAmJiBmZCA8PSAyKSBmZCA9IDM7CisgICAgICAgICAgICAgICAgbVNjYW5uZXIuZXh0cmFjdEFsYnVtQXJ0KGZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL1dyaXRlckZ1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9mdXp6ZXJzL1dyaXRlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMTE2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvV3JpdGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vIEF1dGhvcnM6IGNvcmJpbi5zb3VmZnJhbnRAbGV2aWF0aGFuc2VjdXJpdHkuY29tCisvLyAgICAgICAgICBkeWxhbi5rYXR6QGxldmlhdGhhbnNlY3VyaXR5LmNvbQorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJGdXp6ZXJNZWRpYVV0aWxpdHkuaCIKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisKK3N0YXRpYyBjb25zdGV4cHIgdWludDE2X3Qga01heE9wZXJhdGlvbnMgPSA1MDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50OF90IGtNYXhQYWNrYWdlTmFtZUxlbiA9IDUwOworLy8gRm9yIG90aGVyIHN0cmluZ3MgaW4gbXBlZyB3ZSB3YW50IGEgaGlnaGVyIGxpbWl0Lgorc3RhdGljIGNvbnN0ZXhwciB1aW50MTZfdCBrTWF4TVBFR1N0ckxlbiA9IDEwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQxNl90IGtNYXhNZWRpYUJsb2JTaXplID0gMTAwMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCitzdGQ6OnN0cmluZyBnZXRGb3VyQ0MoRnV6emVkRGF0YVByb3ZpZGVyICpmZHApIHsKKyAgICBzdGQ6OnN0cmluZyBmb3VyQ0MgPSBmZHAtPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoNCk7CisgICAgLy8gUmVwbGFjZSBhbnkgZXhpc3RpbmcgbnVsbHMKKyAgICBmb3IgKHNpemVfdCBwb3MgPSAwOyBwb3MgPCBmb3VyQ0MubGVuZ3RoKCk7IHBvcysrKSB7CisgICAgICAgIGlmIChmb3VyQ0MuYXQocG9zKSA9PSAnXDAnKSB7CisgICAgICAgICAgICBmb3VyQ0MucmVwbGFjZShwb3MsIDEsICJhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBvdXIgc3RyaW5nIGlzIHRvbyBzaG9ydCwgZmlsbCB0aGUgcmVtYWluZGVyIHdpdGggImEicy4KKyAgICB3aGlsZSAoZm91ckNDLmxlbmd0aCgpIDwgNCkgeworICAgICAgICBmb3VyQ0MgKz0gJ2EnOworICAgIH0KKyAgICByZXR1cm4gZm91ckNDOworfQorCit0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFXcml0ZXI+LCBzcDxNZXRhRGF0YT4sIGludCB0bXBGaWxlRmQpPj4gT3BlcmF0aW9uVmVjOwordHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnV6emVkRGF0YVByb3ZpZGVyKiwgTVBFRzRXcml0ZXIqKT4+IE1QRUc0T3BlcmF0aW9uVmVjOworc3RhdGljIGNvbnN0IE9wZXJhdGlvblZlYyBvcGVyYXRpb25zID0geworICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlciwgc3A8TWV0YURhdGE+LCBpbnQpIHsKKyAgICAgICAgbWVkaWFXcml0ZXItPnBhdXNlKCk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyLCBzcDxNZXRhRGF0YT4sIGludCB0bXBGZCkgeworICAgICAgICBib29sIHZhbGlkX2ZkID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgICAgICBpbnQgZmQgPSAtMTsKKyAgICAgICAgaWYgKHZhbGlkX2ZkKSB7CisgICAgICAgICAgICBmZCA9IHRtcEZkOworICAgICAgICB9CisgICAgICAgIC8vIEFyZ3MgZG9uJ3Qgc2VlbSB0byBiZSB1c2VkCisgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgbWVkaWFXcml0ZXItPmR1bXAoZmQsIGFyZ3MpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlciwgc3A8TWV0YURhdGE+LCBpbnQgdG1wRmQpIHsKKyAgICAgICAgYm9vbCB2YWxpZF9mZCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKKyAgICAgICAgaW50IGZkID0gLTE7CisgICAgICAgIGlmICh2YWxpZF9mZCkgeworICAgICAgICAgICAgZmQgPSB0bXBGZDsKKyAgICAgICAgfQorICAgICAgICBtZWRpYVdyaXRlci0+c2V0TmV4dEZkKGZkKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50KSB7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRDYXB0dXJlUmF0ZShkYXRhUHJvdmlkZXItPkNvbnN1bWVGbG9hdGluZ1BvaW50PGZsb2F0PigpKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50KSB7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24oZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyLCBzcDxNZXRhRGF0YT4sIGludCkgeworICAgICAgICBtZWRpYVdyaXRlci0+c2V0U3RhcnRUaW1lT2Zmc2V0TXMoZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpKTsKKworICAgICAgICAvLyBMaWtlbHkgd29uJ3QgZG8gbXVjaCwgYnV0IG1pZ2h0IGFzIHdlbGwgYXMgZG8gYSBxdWljayBjaGVjaworICAgICAgICAvLyB3aGlsZSB3ZSdyZSBoZXJlLgorICAgICAgICBtZWRpYVdyaXRlci0+Z2V0U3RhcnRUaW1lT2Zmc2V0TXMoKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBzcDxNZWRpYVdyaXRlcj4gbWVkaWFXcml0ZXIsIHNwPE1ldGFEYXRhPiwgaW50KSB7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24oZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgc3A8TWVkaWFXcml0ZXI+IG1lZGlhV3JpdGVyLCBzcDxNZXRhRGF0YT4sIGludCkgeworICAgICAgICBtZWRpYVdyaXRlci0+c2V0TWF4RmlsZUR1cmF0aW9uKGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworICAgIH0sCit9OworCitzdGF0aWMgY29uc3QgTVBFRzRPcGVyYXRpb25WZWMgbXBlZzRPcGVyYXRpb25zID0geworICAgIFtdKEZ1enplZERhdGFQcm92aWRlciosIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeyBtZWRpYVdyaXRlci0+bm90aWZ5QXBwcm9hY2hpbmdMaW1pdCgpOyB9LAorICAgIC8vIExvd2VyIGxldmVsIHdyaXRlIG1ldGhvZHMuCisgICAgLy8gSGlnaC1sZXZlbCBzdGFydEJveC9lbmRCb3gvZXRjIGFyZSBhbGwgY2FsbGVkIGVsc2V3aGVyZSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7CisgICAgICAgIHVpbnQ4X3QgdmFsID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDhfdD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPndyaXRlSW50OCh2YWwpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICB1aW50MTZfdCB2YWwgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPndyaXRlSW50MTYodmFsKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgdWludDMyX3QgdmFsID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgICAgIG1lZGlhV3JpdGVyLT53cml0ZUludDMyKHZhbCk7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7CisgICAgICAgIHVpbnQ2NF90IHZhbCA9IGRhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpbnQ2NF90PigpOworICAgICAgICBtZWRpYVdyaXRlci0+d3JpdGVJbnQ2NCh2YWwpOworICAgIH0sCisgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIE1QRUc0V3JpdGVyICptZWRpYVdyaXRlcikgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHJWYWwgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heE1QRUdTdHJMZW4pOworICAgICAgICBtZWRpYVdyaXRlci0+d3JpdGVDU3RyaW5nKHN0clZhbC5jX3N0cigpKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZm91ckNDID0gZ2V0Rm91ckNDKGRhdGFQcm92aWRlcik7CisgICAgICAgIG1lZGlhV3JpdGVyLT53cml0ZUZvdXJjYyhmb3VyQ0MuY19zdHIoKSk7CisgICAgfSwKKworICAgIC8vIE1pc2Mgc2V0dGVycworICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgdWludDMyX3QgbGF5ZXJzID0gZGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRUZW1wb3JhbExheWVyQ291bnQobGF5ZXJzKTsKKyAgICB9LAorICAgIFtdKEZ1enplZERhdGFQcm92aWRlciAqZGF0YVByb3ZpZGVyLCBNUEVHNFdyaXRlciAqbWVkaWFXcml0ZXIpIHsKKyAgICAgICAgdWludDMyX3QgZHVyYXRpb24gPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICAgICAgbWVkaWFXcml0ZXItPnNldEludGVybGVhdmVEdXJhdGlvbihkdXJhdGlvbik7CisgICAgfSwKKyAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIgKmRhdGFQcm92aWRlciwgTVBFRzRXcml0ZXIgKm1lZGlhV3JpdGVyKSB7CisgICAgICAgIGludCBsYXQgPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgIGludCBsb24gPSBkYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgIG1lZGlhV3JpdGVyLT5zZXRHZW9EYXRhKGxhdCwgbG9uKTsKKyAgICB9LAorfTsKKworLy8gTm90IGFsbCB3cml0ZXJzIGNhbiBhbHdheXMgYWRkIG5ldyBzb3VyY2VzLCBzbyB3ZSdsbCBuZWVkIGFkZGl0aW9uYWwgY2hlY2tzLgordm9pZCBhZGRTb3VyY2UoRnV6emVkRGF0YVByb3ZpZGVyICpkYXRhUHJvdmlkZXIsIHNwPE1lZGlhV3JpdGVyPiBtZWRpYVdyaXRlcikgeworICAgIHNwPE1lZGlhU291cmNlPiBtZWRpYVNvdXJjZSA9IGdlbk1lZGlhU291cmNlKGRhdGFQcm92aWRlciwga01heE1lZGlhQmxvYlNpemUpOworICAgIGlmIChtZWRpYVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFRoZXJlJ3MgYSBzdGF0aWMgY2hlY2sgcHJldmVudGluZyBOVUxMcyBpbiBhZGRTb3VyY2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVkaWFXcml0ZXItPmFkZFNvdXJjZShtZWRpYVNvdXJjZSk7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIFRlbXBvcmFyeUZpbGUgdGY7CisgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgIFN0YW5kYXJkV3JpdGVycyB3cml0ZXJUeXBlID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVFbnVtPFN0YW5kYXJkV3JpdGVycz4oKTsKKyAgICBzcDxNZWRpYVdyaXRlcj4gd3JpdGVyID0gY3JlYXRlV3JpdGVyKHRmLmZkLCB3cml0ZXJUeXBlLCBmaWxlTWV0YSk7CisKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFBhY2thZ2VOYW1lTGVuKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBkYXRhUHJvdmlkZXIuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnRva2VuID0gc3A8QkJpbmRlcj46Om1ha2UoKTsKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtciA9IG5ldyBNZWRpYVJlY29yZGVyKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICB3cml0ZXItPnNldExpc3RlbmVyKG1yKTsKKworICAgIHVpbnQ4X3QgYmFzZU9wTGVuID0gb3BlcmF0aW9ucy5zaXplKCk7CisgICAgdWludDhfdCB0b3RhbExlbiA9IGJhc2VPcExlbjsKKyAgICB1aW50OF90IG1heFNvdXJjZXM7CisgICAgLy8gRGlmZmVyZW50IHdyaXRlcnMgc3VwcG9ydCBkaWZmZXJlbnQgYW1vdW50cyBvZiBzb3VyY2VzLgorICAgIHN3aXRjaCAod3JpdGVyVHlwZSkgeworICAgICAgICBjYXNlIFN0YW5kYXJkV3JpdGVyczo6QUFDOgorICAgICAgICBjYXNlIFN0YW5kYXJkV3JpdGVyczo6QUFDX0FEVFM6CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpBTVJfTkI6CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpBTVJfV0I6CisgICAgICAgIGNhc2UgU3RhbmRhcmRXcml0ZXJzOjpPR0c6CisgICAgICAgICAgICBtYXhTb3VyY2VzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YW5kYXJkV3JpdGVyczo6V0VCTToKKyAgICAgICAgICAgIG1heFNvdXJjZXMgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtYXhTb3VyY2VzID0gVUlOVDhfTUFYOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIEluaXRpYWxpemUgc29tZSBudW1iZXIgb2Ygc291cmNlcyBhbmQgYWRkIHRoZW0gdG8gb3VyIHdyaXRlci4KKyAgICB1aW50OF90IHNvdXJjZUNvdW50ID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgbWF4U291cmNlcyk7CisgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgc291cmNlQ291bnQ7IGkrKykgeworICAgICAgICBhZGRTb3VyY2UoJmRhdGFQcm92aWRlciwgd3JpdGVyKTsKKyAgICB9CisKKyAgICAvLyBJbmNyZWFzZSBvdXIgcmFuZ2UgaWYgYWRkaXRpb25hbCBvcGVyYXRpb25zIGFyZSBpbXBsZW1lbnRlZC4KKyAgICAvLyBDdXJyZW50bHkgb25seSBNUEVHNCBoYXMgYWRkaXRpb25hIHB1YmxpYyBvcGVyYXRpb25zIG9uIHRoZWlyIHdyaXRlci4KKyAgICBpZiAod3JpdGVyVHlwZSA9PSBTdGFuZGFyZFdyaXRlcnM6Ok1QRUc0KSB7CisgICAgICAgIHRvdGFsTGVuICs9IG1wZWc0T3BlcmF0aW9ucy5zaXplKCk7CisgICAgfQorCisgICAgLy8gTWFueSBvcGVyYXRpb25zIHJlcXVpcmUgdGhlIHdyaXRlciB0byBiZSBzdGFydGVkLgorICAgIHdyaXRlci0+c3RhcnQoZmlsZU1ldGEuZ2V0KCkpOworICAgIGZvciAoc2l6ZV90IG9wc19ydW4gPSAwOyBkYXRhUHJvdmlkZXIucmVtYWluaW5nX2J5dGVzKCkgPiAwICYmIG9wc19ydW4gPCBrTWF4T3BlcmF0aW9ucyAtIDE7CisgICAgICAgICAgICBvcHNfcnVuKyspIHsKKyAgICAgICAgdWludDhfdCBvcCA9IGRhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIHRvdGFsTGVuIC0gMSk7CisgICAgICAgIGlmIChvcCA8IGJhc2VPcExlbikgeworICAgICAgICAgICAgb3BlcmF0aW9uc1tvcF0oJmRhdGFQcm92aWRlciwgd3JpdGVyLCBmaWxlTWV0YSwgdGYuZmQpOworICAgICAgICB9IGVsc2UgaWYgKHdyaXRlclR5cGUgPT0gU3RhbmRhcmRXcml0ZXJzOjpNUEVHNCkgeworICAgICAgICAgICAgbXBlZzRPcGVyYXRpb25zW29wIC0gYmFzZU9wTGVuXSgmZGF0YVByb3ZpZGVyLCAoTVBFRzRXcml0ZXIqKXdyaXRlci5nZXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBIZXJlIGp1c3QgaW4gY2FzZSwgd2lsbCBlcnJvciBvdXQuCisgICAgICAgICAgICBvcGVyYXRpb25zW29wXSgmZGF0YVByb3ZpZGVyLCB3cml0ZXIsIGZpbGVNZXRhLCB0Zi5mZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGVyLT5zdG9wKCk7CisKKyAgICB3cml0ZXIuY2xlYXIoKTsKKyAgICB3cml0ZXIgPSBudWxscHRyOworICAgIHJldHVybiAwOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvZGljdGlvbmFyaWVzL2Zvcm1hdHMuZGljdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL2Z1enplcnMvZGljdGlvbmFyaWVzL2Zvcm1hdHMuZGljdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWIyMmRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvZnV6emVycy9kaWN0aW9uYXJpZXMvZm9ybWF0cy5kaWN0CkBAIC0wLDAgKzEsMjk5IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBmaWxlIGlzIGEgY29tYmluYXRpb24gb2YgdGhlc2UgZGljdGlvbmFyaWVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Z1enppbmcvYmxvYi8wYzQ4NTMxYzRkMzE3Y2VhOTQ3OWIzZWMxYjBkZGI5ZWRjNDM4YzNhL2RpY3Rpb25hcmllcy9tcDQuZGljdCAgICAjCisjIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZnV6emluZy9ibG9iLzBjNDg1MzFjNGQzMTdjZWE5NDc5YjNlYzFiMGRkYjllZGM0MzhjM2EvZGljdGlvbmFyaWVzL3dlYm0uZGljdCAgICMKKyMgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mdXp6aW5nL2Jsb2IvMGM0ODUzMWM0ZDMxN2NlYTk0NzliM2VjMWIwZGRiOWVkYzQzOGMzYS9kaWN0aW9uYXJpZXMvb2dnLmRpY3QgICAgIworIyBNUEVHNCwgT0dHLCBhbmQgV0VCTSBhcmUgYWxsIGZvcm1hdHMgdXNlZCBieSBNZWRpYVdyaXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbXA0LmRpY3QKKyMgVGFrZW4gZnJvbSBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvbWFzdGVyL21lZGlhL3Rlc3QvbXA0LmRpY3QKK0ZPVVJDQ19OVUxMPSJceDAwXHgwMFx4MDBceDAwIgorRk9VUkNDX0FDMyA9Ilx4NjFceDYzXHgyZFx4MzMiCitGT1VSQ0NfRUFDMz0iXHg2NVx4NjNceDJkXHgzMyIKK0ZPVVJDQ19BVkMxPSJceDYxXHg3Nlx4NjNceDMxIgorRk9VUkNDX0FWQzM9Ilx4NjFceDc2XHg2M1x4MzMiCitGT1VSQ0NfQVZDQz0iXHg2MVx4NzZceDYzXHg0MyIKK0ZPVVJDQ19CTE9DPSJceDYyXHg2Q1x4NkZceDYzIgorRk9VUkNDX0NFTkM9Ilx4NjNceDY1XHg2ZVx4NjMiCitGT1VSQ0NfQ082ND0iXHg2M1x4NmZceDM2XHgzNCIKK0ZPVVJDQ19DVFRTPSJceDYzXHg3NFx4NzRceDczIgorRk9VUkNDX0RJTkY9Ilx4NjRceDY5XHg2ZVx4NjYiCitGT1VSQ0NfRURUUz0iXHg2NVx4NjRceDc0XHg3MyIKK0ZPVVJDQ19FTVNHPSJceDY1XHg2ZFx4NzNceDY3IgorRk9VUkNDX0VMU1Q9Ilx4NjVceDZjXHg3M1x4NzQiCitGT1VSQ0NfRU5DQT0iXHg2NVx4NmVceDYzXHg2MSIKK0ZPVVJDQ19FTkNWPSJceDY1XHg2ZVx4NjNceDc2IgorRk9VUkNDX0VTRFM9Ilx4NjVceDczXHg2NFx4NzMiCitGT1VSQ0NfRlJFRT0iXHg2Nlx4NzJceDY1XHg2NSIKK0ZPVVJDQ19GUk1BPSJceDY2XHg3Mlx4NmRceDYxIgorRk9VUkNDX0ZUWVA9Ilx4NjZceDc0XHg3OVx4NzAiCitGT1VSQ0NfSERMUj0iXHg2OFx4NjRceDZjXHg3MiIKK0ZPVVJDQ19ISU5UPSJceDY4XHg2OVx4NmVceDc0IgorRk9VUkNDX0hWQzE9Ilx4NjhceDc2XHg2M1x4MzEiCitGT1VSQ0NfSFZDQz0iXHg2OFx4NzZceDYzXHg0MyIKK0ZPVVJDQ19JT0RTPSJceDY5XHg2Zlx4NjRceDczIgorRk9VUkNDX01EQVQ9Ilx4NmRceDY0XHg2MVx4NzQiCitGT1VSQ0NfTURIRD0iXHg2ZFx4NjRceDY4XHg2NCIKK0ZPVVJDQ19NRElBPSJceDZkXHg2NFx4NjlceDYxIgorRk9VUkNDX01FQ089Ilx4NmRceDY1XHg2M1x4NmYiCitGT1VSQ0NfTUVIRD0iXHg2ZFx4NjVceDY4XHg2NCIKK0ZPVVJDQ19NRVRBPSJceDZkXHg2NVx4NzRceDYxIgorRk9VUkNDX01GSEQ9Ilx4NmRceDY2XHg2OFx4NjQiCitGT1VSQ0NfTUZSQT0iXHg2ZFx4NjZceDcyXHg2MSIKK0ZPVVJDQ19NSU5GPSJceDZkXHg2OVx4NmVceDY2IgorRk9VUkNDX01PT0Y9Ilx4NmRceDZmXHg2Zlx4NjYiCitGT1VSQ0NfTU9PVj0iXHg2ZFx4NmZceDZmXHg3NiIKK0ZPVVJDQ19NUDRBPSJceDZkXHg3MFx4MzRceDYxIgorRk9VUkNDX01QNFY9Ilx4NmRceDcwXHgzNFx4NzYiCitGT1VSQ0NfTVZFWD0iXHg2ZFx4NzZceDY1XHg3OCIKK0ZPVVJDQ19NVkhEPSJceDZkXHg3Nlx4NjhceDY0IgorRk9VUkNDX1BBU1A9Ilx4NzBceDYxXHg3M1x4NzAiCitGT1VSQ0NfUERJTj0iXHg3MFx4NjRceDY5XHg2ZSIKK0ZPVVJDQ19QUkZUPSJceDcwXHg3Mlx4NjZceDc0IgorRk9VUkNDX1BTU0g9Ilx4NzBceDczXHg3M1x4NjgiCitGT1VSQ0NfU0FJTz0iXHg3M1x4NjFceDY5XHg2ZiIKK0ZPVVJDQ19TQUlaPSJceDczXHg2MVx4NjlceDdhIgorRk9VUkNDX1NCR1A9Ilx4NzNceDYyXHg2N1x4NzAiCitGT1VSQ0NfU0NIST0iXHg3M1x4NjNceDY4XHg2OSIKK0ZPVVJDQ19TQ0hNPSJceDczXHg2M1x4NjhceDZkIgorRk9VUkNDX1NEVFA9Ilx4NzNceDY0XHg3NFx4NzAiCitGT1VSQ0NfU0VJRz0iXHg3M1x4NjVceDY5XHg2NyIKK0ZPVVJDQ19TRU5DPSJceDczXHg2NVx4NmVceDYzIgorRk9VUkNDX1NHUEQ9Ilx4NzNceDY3XHg3MFx4NjQiCitGT1VSQ0NfU0lEWD0iXHg3M1x4NjlceDY0XHg3OCIKK0ZPVVJDQ19TSU5GPSJceDczXHg2OVx4NmVceDY2IgorRk9VUkNDX1NLSVA9Ilx4NzNceDZiXHg2OVx4NzAiCitGT1VSQ0NfU01IRD0iXHg3M1x4NmRceDY4XHg2NCIKK0ZPVVJDQ19TT1VOPSJceDczXHg2Zlx4NzVceDZlIgorRk9VUkNDX1NTSVg9Ilx4NzNceDczXHg2OVx4NzgiCitGT1VSQ0NfU1RCTD0iXHg3M1x4NzRceDYyXHg2YyIKK0ZPVVJDQ19TVENPPSJceDczXHg3NFx4NjNceDZmIgorRk9VUkNDX1NUU0M9Ilx4NzNceDc0XHg3M1x4NjMiCitGT1VSQ0NfU1RTRD0iXHg3M1x4NzRceDczXHg2NCIKK0ZPVVJDQ19TVFNTPSJceDczXHg3NFx4NzNceDczIgorRk9VUkNDX1NUU1o9Ilx4NzNceDc0XHg3M1x4N2EiCitGT1VSQ0NfU1RUUz0iXHg3M1x4NzRceDc0XHg3MyIKK0ZPVVJDQ19TVFlQPSJceDczXHg3NFx4NzlceDcwIgorRk9VUkNDX1RFTkM9Ilx4NzRceDY1XHg2ZVx4NjMiCitGT1VSQ0NfVEZEVD0iXHg3NFx4NjZceDY0XHg3NCIKK0ZPVVJDQ19URkhEPSJceDc0XHg2Nlx4NjhceDY0IgorRk9VUkNDX1RLSEQ9Ilx4NzRceDZiXHg2OFx4NjQiCitGT1VSQ0NfVFJBRj0iXHg3NFx4NzJceDYxXHg2NiIKK0ZPVVJDQ19UUkFLPSJceDc0XHg3Mlx4NjFceDZiIgorRk9VUkNDX1RSRVg9Ilx4NzRceDcyXHg2NVx4NzgiCitGT1VSQ0NfVFJVTj0iXHg3NFx4NzJceDc1XHg2ZSIKK0ZPVVJDQ19VRFRBPSJceDc1XHg2NFx4NzRceDYxIgorRk9VUkNDX1VVSUQ9Ilx4NzVceDc1XHg2OVx4NjQiCitGT1VSQ0NfVklERT0iXHg3Nlx4NjlceDY0XHg2NSIKK0ZPVVJDQ19WTUhEPSJceDc2XHg2ZFx4NjhceDY0IgorRk9VUkNDX1dJREU9Ilx4NzdceDY5XHg2NFx4NjUiCisKKyMgb2dnLmRpY3QKKyMgaHR0cHM6Ly94aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorCitoZWFkZXI9Ik9nZ1MiCisKKyMgQ29kZWNzCisiQkJDRFx4MDAiCisiXHg3ZkZMQUMiCisiXHg4MHRoZW9yYSIKKyJceDAxdm9yYmlzIgorIkNFTFQgICAgIgorIkNNTUxceDAwXHgwMFx4MDBceDAwIgorIlx4OGJKTkdceDBkXHgwYVx4MWFceDBhIgorIlx4ODBrYXRlXHgwMFx4MDBceDAwIgorIk9nZ01JRElceDAwIgorIlx4OGFNTkdceDBkXHgwYVx4MWFceDBhIgorIlBDTSAgICAgIgorIlx4ODlQTkdceDBkXHgwYVx4MWFceDBhIgorIlNwZWV4ICAgIgorIllVVjRNUEVHIgorCisjIE1ldGFkYXRhCisiVElUTEU9IgorIlZFUlNJT049IgorIkFMQlVNPSIKKyJUUkFDS05VTUJFUj0iCisiQVJUSVNUPSIKKyJQRVJGT1JNRVI9IgorIkNPUFlSSUdIVD0iCisiTElDRU5TRT0iCisiT1JHQU5JWkFUSU9OPSIKKyJERVNDUklQVElPTj0iCisiR0VOUkU9IgorIkRBVEU9IgorIkxPQ0FUSU9OPSIKKyJDT05UQUNUPSIKKyJJU1JDPSIKKworIyB3ZWJtLmRpY3QKKyMgRWxlbWVudCBJRHMuCitJZEFlc1NldHRpbmdzQ2lwaGVyTW9kZSA9ICJceDQ3XHhFOCIKK0lkQWxwaGFNb2RlID0gIlx4NTNceEMwIgorSWRBc3BlY3RSYXRpb1R5cGUgPSAiXHg1NFx4QjMiCitJZEF1ZGlvID0gIlx4RTEiCitJZEJpdERlcHRoID0gIlx4NjJceDY0IgorSWRCaXRzUGVyQ2hhbm5lbCA9ICJceDU1XHhCMiIKK0lkQmxvY2sgPSAiXHhBMSIKK0lkQmxvY2tBZGRJZCA9ICJceEVFIgorSWRCbG9ja0FkZGl0aW9uYWwgPSAiXHhBNSIKK0lkQmxvY2tBZGRpdGlvbnMgPSAiXHg3NVx4QTEiCitJZEJsb2NrRHVyYXRpb24gPSAiXHg5QiIKK0lkQmxvY2tHcm91cCA9ICJceEEwIgorSWRCbG9ja01vcmUgPSAiXHhBNiIKK0lkQmxvY2tWaXJ0dWFsID0gIlx4QTIiCitJZENiU3Vic2FtcGxpbmdIb3J6ID0gIlx4NTVceEI1IgorSWRDYlN1YnNhbXBsaW5nVmVydCA9ICJceDU1XHhCNiIKK0lkQ2hhbm5lbHMgPSAiXHg5RiIKK0lkQ2hhcENvdW50cnkgPSAiXHg0M1x4N0UiCitJZENoYXBMYW5ndWFnZSA9ICJceDQzXHg3QyIKK0lkQ2hhcFN0cmluZyA9ICJceDg1IgorSWRDaGFwdGVyQXRvbSA9ICJceEI2IgorSWRDaGFwdGVyRGlzcGxheSA9ICJceDgwIgorSWRDaGFwdGVyU3RyaW5nVUlEID0gIlx4NTZceDU0IgorSWRDaGFwdGVyU3RyaW5nVWlkID0gIlx4NTZceDU0IgorSWRDaGFwdGVyVGltZUVuZCA9ICJceDkyIgorSWRDaGFwdGVyVGltZVN0YXJ0ID0gIlx4OTEiCitJZENoYXB0ZXJVSUQgPSAiXHg3M1x4QzQiCitJZENoYXB0ZXJVaWQgPSAiXHg3M1x4QzQiCitJZENoYXB0ZXJzID0gIlx4MTBceDQzXHhBN1x4NzAiCitJZENocm9tYVNpdGluZ0hvcnogPSAiXHg1NVx4QjciCitJZENocm9tYVNpdGluZ1ZlcnQgPSAiXHg1NVx4QjgiCitJZENocm9tYVN1YnNhbXBsaW5nSG9yeiA9ICJceDU1XHhCMyIKK0lkQ2hyb21hU3Vic2FtcGxpbmdWZXJ0ID0gIlx4NTVceEI0IgorSWRDbHVzdGVyID0gIlx4MUZceDQzXHhCNlx4NzUiCitJZENvZGVjRGVsYXkgPSAiXHg1Nlx4QUEiCitJZENvZGVjSUQgPSAiXHg4NiIKK0lkQ29kZWNOYW1lID0gIlx4MjVceDg2XHg4OCIKK0lkQ29kZWNQcml2YXRlID0gIlx4NjNceEEyIgorSWRDb2xvdXIgPSAiXHg1NVx4QjAiCitJZENvbnRlbnRFbmNBRVNTZXR0aW5ncyA9ICJceDQ3XHhFNyIKK0lkQ29udGVudEVuY0Flc1NldHRpbmdzID0gIlx4NDdceEU3IgorSWRDb250ZW50RW5jQWxnbyA9ICJceDQ3XHhFMSIKK0lkQ29udGVudEVuY0tleUlkID0gIlx4NDdceEUyIgorSWRDb250ZW50RW5jb2RpbmcgPSAiXHg2Mlx4NDAiCitJZENvbnRlbnRFbmNvZGluZ09yZGVyID0gIlx4NTBceDMxIgorSWRDb250ZW50RW5jb2RpbmdTY29wZSA9ICJceDUwXHgzMiIKK0lkQ29udGVudEVuY29kaW5nVHlwZSA9ICJceDUwXHgzMyIKK0lkQ29udGVudEVuY29kaW5ncyA9ICJceDZEXHg4MCIKK0lkQ29udGVudEVuY3J5cHRpb24gPSAiXHg1MFx4MzUiCitJZEN1ZUJsb2NrTnVtYmVyID0gIlx4NTNceDc4IgorSWRDdWVDbHVzdGVyUG9zaXRpb24gPSAiXHhGMSIKK0lkQ3VlRHVyYXRpb24gPSAiXHhCMiIKK0lkQ3VlUG9pbnQgPSAiXHhCQiIKK0lkQ3VlUmVsYXRpdmVQb3NpdGlvbiA9ICJceEYwIgorSWRDdWVUaW1lID0gIlx4QjMiCitJZEN1ZVRyYWNrID0gIlx4RjciCitJZEN1ZVRyYWNrUG9zaXRpb25zID0gIlx4QjciCitJZEN1ZXMgPSAiXHgxQ1x4NTNceEJCXHg2QiIKK0lkRGF0ZVVUQyA9ICJceDQ0XHg2MSIKK0lkRGF0ZVV0YyA9ICJceDQ0XHg2MSIKK0lkRGVmYXVsdER1cmF0aW9uID0gIlx4MjNceEUzXHg4MyIKK0lkRGlzY2FyZFBhZGRpbmcgPSAiXHg3NVx4QTIiCitJZERpc3BsYXlIZWlnaHQgPSAiXHg1NFx4QkEiCitJZERpc3BsYXlVbml0ID0gIlx4NTRceEIyIgorSWREaXNwbGF5V2lkdGggPSAiXHg1NFx4QjAiCitJZERvY1R5cGUgPSAiXHg0Mlx4ODIiCitJZERvY1R5cGVSZWFkVmVyc2lvbiA9ICJceDQyXHg4NSIKK0lkRG9jVHlwZVZlcnNpb24gPSAiXHg0Mlx4ODciCitJZER1cmF0aW9uID0gIlx4NDRceDg5IgorSWRFQk1MID0gIlx4MUFceDQ1XHhERlx4QTMiCitJZEVCTUxNYXhJRExlbmd0aCA9ICJceDQyXHhGMiIKK0lkRUJNTE1heFNpemVMZW5ndGggPSAiXHg0Mlx4RjMiCitJZEVCTUxSZWFkVmVyc2lvbiA9ICJceDQyXHhGNyIKK0lkRUJNTFZlcnNpb24gPSAiXHg0Mlx4ODYiCitJZEVibWwgPSAiXHgxQVx4NDVceERGXHhBMyIKK0lkRWJtbE1heElkTGVuZ3RoID0gIlx4NDJceEYyIgorSWRFYm1sTWF4U2l6ZUxlbmd0aCA9ICJceDQyXHhGMyIKK0lkRWJtbFJlYWRWZXJzaW9uID0gIlx4NDJceEY3IgorSWRFYm1sVmVyc2lvbiA9ICJceDQyXHg4NiIKK0lkRWRpdGlvbkVudHJ5ID0gIlx4NDVceEI5IgorSWRGaWxlVXNlZEVuZFRpbWUgPSAiXHg0Nlx4NjIiCitJZEZpbGVVc2VkU3RhcnRUaW1lID0gIlx4NDZceDYxIgorSWRGbGFnRGVmYXVsdCA9ICJceDg4IgorSWRGbGFnRW5hYmxlZCA9ICJceEI5IgorSWRGbGFnRm9yY2VkID0gIlx4NTVceEFBIgorSWRGbGFnSW50ZXJsYWNlZCA9ICJceDlBIgorSWRGbGFnTGFjaW5nID0gIlx4OUMiCitJZEZyYW1lUmF0ZSA9ICJceDIzXHg4M1x4RTMiCitJZEluZm8gPSAiXHgxNVx4NDlceEE5XHg2NiIKK0lkTGFjZU51bWJlciA9ICJceENDIgorSWRMYW5ndWFnZSA9ICJceDIyXHhCNVx4OUMiCitJZEx1bWluYW5jZU1heCA9ICJceDU1XHhEOSIKK0lkTHVtaW5hbmNlTWluID0gIlx4NTVceERBIgorSWRNYXN0ZXJpbmdNZXRhZGF0YSA9ICJceDU1XHhEMCIKK0lkTWF0cml4Q29lZmZpY2llbnRzID0gIlx4NTVceEIxIgorSWRNYXhDbGwgPSAiXHg1NVx4QkMiCitJZE1heEZhbGwgPSAiXHg1NVx4QkQiCitJZE11eGluZ0FwcCA9ICJceDREXHg4MCIKK0lkTmFtZSA9ICJceDUzXHg2RSIKK0lkT3V0cHV0U2FtcGxpbmdGcmVxdWVuY3kgPSAiXHg3OFx4QjUiCitJZFBpeGVsQ3JvcEJvdHRvbSA9ICJceDU0XHhBQSIKK0lkUGl4ZWxDcm9wTGVmdCA9ICJceDU0XHhDQyIKK0lkUGl4ZWxDcm9wUmlnaHQgPSAiXHg1NFx4REQiCitJZFBpeGVsQ3JvcFRvcCA9ICJceDU0XHhCQiIKK0lkUGl4ZWxIZWlnaHQgPSAiXHhCQSIKK0lkUGl4ZWxXaWR0aCA9ICJceEIwIgorSWRQcmV2U2l6ZSA9ICJceEFCIgorSWRQcmltYXJpZXMgPSAiXHg1NVx4QkIiCitJZFByaW1hcnlCQ2hyb21hdGljaXR5WCA9ICJceDU1XHhENSIKK0lkUHJpbWFyeUJDaHJvbWF0aWNpdHlZID0gIlx4NTVceEQ2IgorSWRQcmltYXJ5R0Nocm9tYXRpY2l0eVggPSAiXHg1NVx4RDMiCitJZFByaW1hcnlHQ2hyb21hdGljaXR5WSA9ICJceDU1XHhENCIKK0lkUHJpbWFyeVJDaHJvbWF0aWNpdHlYID0gIlx4NTVceEQxIgorSWRQcmltYXJ5UkNocm9tYXRpY2l0eVkgPSAiXHg1NVx4RDIiCitJZFByb2plY3Rpb24gPSAiXHg3Nlx4NzAiCitJZFByb2plY3Rpb25Qb3NlUGl0Y2ggPSAiXHg3Nlx4NzQiCitJZFByb2plY3Rpb25Qb3NlUm9sbCA9ICJceDc2XHg3NSIKK0lkUHJvamVjdGlvblBvc2VZYXcgPSAiXHg3Nlx4NzMiCitJZFByb2plY3Rpb25Qcml2YXRlID0gIlx4NzZceDcyIgorSWRQcm9qZWN0aW9uVHlwZSA9ICJceDc2XHg3MSIKK0lkUmFuZ2UgPSAiXHg1NVx4QjkiCitJZFJlZmVyZW5jZUJsb2NrID0gIlx4RkIiCitJZFNhbXBsaW5nRnJlcXVlbmN5ID0gIlx4QjUiCitJZFNlZWsgPSAiXHg0RFx4QkIiCitJZFNlZWtIZWFkID0gIlx4MTFceDREXHg5Qlx4NzQiCitJZFNlZWtJRCA9ICJceDUzXHhBQiIKK0lkU2Vla1Bvc2l0aW9uID0gIlx4NTNceEFDIgorSWRTZWVrUHJlUm9sbCA9ICJceDU2XHhCQiIKK0lkU2VnbWVudCA9ICJceDE4XHg1M1x4ODBceDY3IgorSWRTaW1wbGVCbG9jayA9ICJceEEzIgorSWRTaW1wbGVUYWcgPSAiXHg2N1x4QzgiCitJZFNsaWNlRHVyYXRpb24gPSAiXHhDRiIKK0lkU2xpY2VzID0gIlx4OEUiCitJZFN0ZXJlb01vZGUgPSAiXHg1M1x4QjgiCitJZFRhZyA9ICJceDczXHg3MyIKK0lkVGFnQmluYXJ5ID0gIlx4NDRceDg1IgorSWRUYWdEZWZhdWx0ID0gIlx4NDRceDg0IgorSWRUYWdMYW5ndWFnZSA9ICJceDQ0XHg3QSIKK0lkVGFnTmFtZSA9ICJceDQ1XHhBMyIKK0lkVGFnU3RyaW5nID0gIlx4NDRceDg3IgorSWRUYWdUcmFja1VpZCA9ICJceDYzXHhDNSIKK0lkVGFncyA9ICJceDEyXHg1NFx4QzNceDY3IgorSWRUYXJnZXRUeXBlID0gIlx4NjNceENBIgorSWRUYXJnZXRUeXBlVmFsdWUgPSAiXHg2OFx4Q0EiCitJZFRhcmdldHMgPSAiXHg2M1x4QzAiCitJZFRpbWVTbGljZSA9ICJceEU4IgorSWRUaW1lY29kZSA9ICJceEU3IgorSWRUaW1lY29kZVNjYWxlID0gIlx4MkFceEQ3XHhCMSIKK0lkVGl0bGUgPSAiXHg3Qlx4QTkiCitJZFRyYWNrRW50cnkgPSAiXHhBRSIKK0lkVHJhY2tOdW1iZXIgPSAiXHhENyIKK0lkVHJhY2tUeXBlID0gIlx4ODMiCitJZFRyYWNrVUlEID0gIlx4NzNceEM1IgorSWRUcmFja3MgPSAiXHgxNlx4NTRceEFFXHg2QiIKK0lkVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSAiXHg1NVx4QkEiCitJZFRyaWNrTWFzdGVyVHJhY2tTZWdtZW50VUlEID0gIlx4QzQiCitJZFRyaWNrTWFzdGVyVHJhY2tVSUQgPSAiXHhDNyIKK0lkVHJpY2tUcmFja0ZsYWcgPSAiXHhDNiIKK0lkVHJpY2tUcmFja1NlZ21lbnRVSUQgPSAiXHhDMSIKK0lkVHJpY2tUcmFja1VJRCA9ICJceEMwIgorSWRWaWRlbyA9ICJceEUwIgorSWRWb2lkID0gIlx4RUMiCitJZFdoaXRlUG9pbnRDaHJvbWF0aWNpdHlYID0gIlx4NTVceEQ3IgorSWRXaGl0ZVBvaW50Q2hyb21hdGljaXR5WSA9ICJceDU1XHhEOCIKK0lkV3JpdGluZ0FwcCA9ICJceDU3XHg0MSIKKworIyBJbnRlcmVzdGluZyBzaXplcy4KK1NpemVVbmtub3duID0gIlx4RkYiCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2RjNmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90ZXN0c19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhY29kZWNUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhQ29kZWNUZXN0LmNwcCIsCisgICAgICAgICJNZWRpYVRlc3RIZWxwZXIuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhZHJtX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCisKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZTliMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSAiTWVkaWFUZXN0SGVscGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTW9ja0J1ZmZlckNoYW5uZWwgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UgeworcHVibGljOgorICAgIH5Nb2NrQnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNldENyeXB0bywgKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzZXREZXNjcmFtYmxlciwgKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHF1ZXVlSW5wdXRCdWZmZXIsIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpLAorICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIGF0dGFjaEJ1ZmZlciwKKyAgICAgICAgICAgIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMkJ1ZmZlciwgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciksCisgICAgICAgICAgICAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChzdGF0dXNfdCwgYXR0YWNoRW5jcnlwdGVkQnVmZmVyLAorICAgICAgICAgICAgKGNvbnN0IHNwPGhhcmR3YXJlOjpIaWRsTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAorICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpLAorICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHJlbmRlck91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSwKKyAgICAgICAgICAgIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBkaXNjYXJkQnVmZmVyLCAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGdldElucHV0QnVmZmVyQXJyYXksIChWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGdldE91dHB1dEJ1ZmZlckFycmF5LCAoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpLCAob3ZlcnJpZGUpKTsKK307CisKK2NsYXNzIE1vY2tDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIE1vY2tDb2RlYyhzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1vY2tCdWZmZXJDaGFubmVsPiAmKT4gbW9jaykgeworICAgICAgICBtTW9ja0J1ZmZlckNoYW5uZWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1vY2tCdWZmZXJDaGFubmVsPigpOworICAgICAgICBtb2NrKG1Nb2NrQnVmZmVyQ2hhbm5lbCk7CisgICAgfQorICAgIH5Nb2NrQ29kZWMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50LCAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudCwgKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZVNldElucHV0U3VyZmFjZSwgKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGluaXRpYXRlU3RhcnQsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZVNodXRkb3duLCAoYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgb25NZXNzYWdlUmVjZWl2ZWQsIChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBzZXRTdXJmYWNlLCAoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxGbHVzaCwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFJlc3VtZSwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFNldFBhcmFtZXRlcnMsIChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0sICgpLCAob3ZlcnJpZGUpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gZ2V0QnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Nb2NrQnVmZmVyQ2hhbm5lbDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbUNhbGxiYWNrOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gbU1vY2tCdWZmZXJDaGFubmVsOworfTsKKworY2xhc3MgQ291bnRlciB7CitwdWJsaWM6CisgICAgQ291bnRlcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBDb3VudGVyKGludDMyX3QgaW5pdENvdW50KSA6IG1Db3VudChpbml0Q291bnQpIHt9CisgICAgfkNvdW50ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IGFkdmFuY2UoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICArK21Db3VudDsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlcCwgdHlwZW5hbWUgUGVyaW9kLCB0eXBlbmFtZSAuLi5BcmdzPgorICAgIGludDMyX3Qgd2FpdEZvcihjb25zdCBzdGQ6OmNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+ICZkdXJhdGlvbiwgQXJncy4uLiB2YWx1ZXMpIHsKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGludDMyX3Q+IGxpc3QgPSB7dmFsdWVzLi4ufTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1Db25kaXRpb24ud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICBbJmxpc3QsIHRoaXNdeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKGxpc3QuYmVnaW4oKSwgbGlzdC5lbmQoKSwgbUNvdW50KSAhPSBsaXN0LmVuZCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGludDMyX3Qgd2FpdChBcmdzLi4uIHZhbHVlcykgeworICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50MzJfdD4gbGlzdCA9IHt2YWx1ZXMuLi59OworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KAorICAgICAgICAgICAgICAgIGxvY2ssCisgICAgICAgICAgICAgICAgWyZsaXN0LCB0aGlzXXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZChsaXN0LmJlZ2luKCksIGxpc3QuZW5kKCksIG1Db3VudCkgIT0gbGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBpbnQzMl90IG1Db3VudCA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6dGVzdGluZzo6XzsKKworc3RhdGljIHNwPE1lZGlhQ29kZWM+IFNldHVwTWVkaWFDb2RlYygKKyAgICAgICAgY29uc3QgQVN0cmluZyAmb3duZXIsCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSwKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbWVkaWFUeXBlLAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpPiBnZXRDb2RlY0Jhc2UpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+IGxpc3RXcml0ZXIgPQorICAgICAgICBNZWRpYVRlc3RIZWxwZXI6OkNyZWF0ZUNvZGVjTGlzdFdyaXRlcigpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gaW5mb1dyaXRlciA9IGxpc3RXcml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgaW5mb1dyaXRlci0+c2V0TmFtZShjb2RlY05hbWUuY19zdHIoKSk7CisgICAgaW5mb1dyaXRlci0+c2V0T3duZXIob3duZXIuY19zdHIoKSk7CisgICAgaW5mb1dyaXRlci0+YWRkTWVkaWFUeXBlKG1lZGlhVHlwZS5jX3N0cigpKTsKKyAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+IGNvZGVjSW5mb3M7CisgICAgTWVkaWFUZXN0SGVscGVyOjpXcml0ZUNvZGVjSW5mb3MobGlzdFdyaXRlciwgJmNvZGVjSW5mb3MpOworICAgIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoY29uc3QgQVN0cmluZyAmLCBzcDxNZWRpYUNvZGVjSW5mbz4gKik+IGdldENvZGVjSW5mbyA9CisgICAgICAgIFtjb2RlY0luZm9zXShjb25zdCBBU3RyaW5nICZuYW1lLCBzcDxNZWRpYUNvZGVjSW5mbz4gKmluZm8pIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5mb3MuYmVnaW4oKSwgY29kZWNJbmZvcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgWyZuYW1lXShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgKmluZm8gPSAoaXQgPT0gY29kZWNJbmZvcy5lbmQoKSkgPyBudWxscHRyIDogKml0OworICAgICAgICAgICAgcmV0dXJuICgqaW5mbykgPyBPSyA6IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9OworCisgICAgbG9vcGVyLT5zdGFydCgpOworICAgIHJldHVybiBNZWRpYVRlc3RIZWxwZXI6OkNyZWF0ZUNvZGVjKAorICAgICAgICAgICAgY29kZWNOYW1lLCBsb29wZXIsIGdldENvZGVjQmFzZSwgZ2V0Q29kZWNJbmZvKTsKK30KKworVEVTVChNZWRpYUNvZGVjVGVzdCwgUmVjbGFpbVJlbGVhc2VSYWNlKSB7CisgICAgLy8gVGVzdCBzY2VuYXJpbzoKKyAgICAvLworICAgIC8vIDEpIFJlc291cmNlTWFuYWdlciB0aHJlYWQgY2FsbHMgcmVjbGFpbSgpLCBtZXNzYWdlIHBvc3RlZCB0bworICAgIC8vICAgIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKyAgICAvLyAyKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgY2FsbHMgaW5pdGlhdGVTaHV0ZG93bigpLCBzaHV0ZG93biBiZWluZworICAgIC8vICAgIGhhbmRsZWQgYXQgdGhlIGNvbXBvbmVudCB0aHJlYWQuCisgICAgLy8gMykgQ2xpZW50IHRocmVhZCBjYWxscyByZWxlYXNlKCksIG1lc3NhZ2UgcG9zdGVkIHRvICYgaGFuZGxlIGF0CisgICAgLy8gICAgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkLgorICAgIC8vIDQpIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBtYXkgY2FsbCBpbml0aWF0ZVNodXRkb3duKCkuCisgICAgLy8gNSkgaW5pdGlhdGVTaHV0ZG93bigpIGZyb20gMikgaXMgaGFuZGxlZCBhdCBvblJlbGVhc2VDb21wbGV0ZSgpIGV2ZW50CisgICAgLy8gICAgcG9zdGVkIHRvIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKyAgICAvLyA2KSBJZiBjYWxsZWQsIGluaXRpYXRlU2h1dGRvd24oKSBmcm9tIDQpIGlzIGhhbmRsZWQgYW5kCisgICAgLy8gICAgb25SZWxlYXNlQ29tcGxldGUoKSBldmVudCBwb3N0ZWQgdG8gTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkLgorCisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKKworICAgIGVudW0geworICAgICAgICBrSW5pdCwKKyAgICAgICAga1NodXRkb3duRnJvbVJlY2xhaW1SZWNlaXZlZCwKKyAgICAgICAga1JlbGVhc2VDYWxsZWQsCisgICAgfTsKKyAgICBDb3VudGVyIGNvdW50ZXJ7a0luaXR9OworICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9CisgICAgICAgIFsmbW9ja0NvZGVjLCAmY291bnRlcl0oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopIHsKKyAgICAgICAgICAgIG1vY2tDb2RlYyA9IG5ldyBNb2NrQ29kZWMoW10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1vY2tCdWZmZXJDaGFubmVsPiAmKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbW9jayBzZXR1cCwgYXMgd2UgZG9uJ3QgZXhwZWN0IGFueSBidWZmZXIgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc2NlbmFyaW8uCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShjb25zdCBzcDxBTWVzc2FnZT4gJikgeworICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uQ29tcG9uZW50QWxsb2NhdGVkKGtDb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU2h1dGRvd24oXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlYywgJmNvdW50ZXJdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFnZSA9IGNvdW50ZXIud2FpdChrSW5pdCwga1JlbGVhc2VDYWxsZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhZ2UgPT0ga0luaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhhdCAyKSBoYXBwZW5lZCwgc28gdGVzdCBjYW4gcHJvY2VlZCB0byAzKQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0ga1JlbGVhc2VDYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG1vY2tDb2RlYzsKKyAgICAgICAgfTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcntuZXcgQUxvb3Blcn07CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBTZXR1cE1lZGlhQ29kZWMoCisgICAgICAgICAgICBrQ29kZWNPd25lciwga0NvZGVjTmFtZSwga01lZGlhVHlwZSwgbG9vcGVyLCBnZXRDb2RlY0Jhc2UpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb2RlYykgPDwgIkNvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtb2NrQ29kZWMpIDw8ICJNb2NrQ29kZWMgbXVzdCBub3QgYmUgbnVsbCI7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlY2xhaW1Db21wbGV0ZWQ7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlbGVhc2VDb21wbGV0ZWQ7CisgICAgQ291bnRlciB0aHJlYWRFeGl0Q291bnRlcjsKKyAgICBzdGQ6OnRocmVhZChbY29kZWMsICZyZWNsYWltQ29tcGxldGVkXXsKKyAgICAgICAgLy8gU2ltdWxhdGUgUmVzb3VyY2VNYW5hZ2VyIHRocmVhZC4gUHJvY2VlZCB3aXRoIDEpCisgICAgICAgIE1lZGlhVGVzdEhlbHBlcjo6UmVjbGFpbShjb2RlYywgdHJ1ZSAvKiBmb3JjZSAqLyk7CisgICAgICAgIHJlY2xhaW1Db21wbGV0ZWQuc2V0X3ZhbHVlKCk7CisgICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoW2NvZGVjLCAmY291bnRlciwgJnJlbGVhc2VDb21wbGV0ZWRdeworICAgICAgICAvLyBTaW11bGF0ZSBjbGllbnQgdGhyZWFkLiBXYWl0IHVudGlsIDIpIGlzIGNvbXBsZXRlCisgICAgICAgICh2b2lkKWNvdW50ZXIud2FpdChrU2h1dGRvd25Gcm9tUmVjbGFpbVJlY2VpdmVkKTsKKyAgICAgICAgLy8gUHJvY2VlZCB0byAzKSwgYW5kIG1hcmsgdGhhdCA1KSBpcyByZWFkeSB0byBoYXBwZW4uCisgICAgICAgIC8vIE5PVEU6IGl0J3MgZGlmZmljdWx0IHRvIHBpbnBvaW50IHdoZW4gNCkgaGFwcGVucywgc28gd2Ugd2lsbCBzbGVlcAorICAgICAgICAvLyAgICAgICB0byBtZWV0IHRoZSB0aW1pbmcuCisgICAgICAgIGNvdW50ZXIuYWR2YW5jZSgpOworICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICByZWxlYXNlQ29tcGxldGVkLnNldF92YWx1ZSgpOworICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFttb2NrQ29kZWMsICZjb3VudGVyXXsKKyAgICAgICAgLy8gU2ltdWxhdGUgY29tcG9uZW50IHRocmVhZC4gV2FpdCB1bnRpbCAzKSBpcyBjb21wbGV0ZQorICAgICAgICAodm9pZCljb3VudGVyLndhaXQoa1JlbGVhc2VDYWxsZWQpOworICAgICAgICAvLyBXZSB3YW50IDQpIHRvIGNvbXBsZXRlIGJlZm9yZSBtb3ZpbmcgZm9yd2FyZCwgYnV0IGl0IGlzIGhhcmQgdG8KKyAgICAgICAgLy8gd2FpdCBmb3IgdGhpcyBleGFjdCBldmVudC4gSnVzdCBzbGVlcCBzbyB0aGF0IHRoZSBvdGhlciB0aHJlYWQgY2FuCisgICAgICAgIC8vIHByb2NlZWQgYW5kIGNvbXBsZXRlIDQpLgorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICAgICAgLy8gUHJvY2VlZCB0byA1KS4KKyAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICB9KS5kZXRhY2goKTsKKyAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LAorICAgICAgICAgICAgcmVjbGFpbUNvbXBsZXRlZC5nZXRfZnV0dXJlKCkud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKQorICAgICAgICA8PCAicmVjbGFpbSB0aW1lZCBvdXQiOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgICAgIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksCisgICAgICAgICAgICByZWxlYXNlQ29tcGxldGVkLmdldF9mdXR1cmUoKS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSkpCisgICAgICAgIDw8ICJyZWxlYXNlIHRpbWVkIG91dCI7CisgICAgbG9vcGVyLT5zdG9wKCk7Cit9CisKK1RFU1QoTWVkaWFDb2RlY1Rlc3QsIEVycm9yV2hpbGVTdG9wcGluZykgeworICAgIC8vIFRlc3Qgc2NlbmFyaW86CisgICAgLy8KKyAgICAvLyAxKSBDbGllbnQgdGhyZWFkIGNhbGxzIHN0b3AoKTsgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGNhbGxzCisgICAgLy8gICAgaW5pdGlhdGVTaHV0ZG93bigpOyBzaHV0ZG93biBpcyBiZWluZyBoYW5kbGVkIGF0IHRoZSBjb21wb25lbnQgdGhyZWFkLgorICAgIC8vIDIpIEVycm9yIG9jY3VycmVkLCBidXQgdGhlIHNodXRkb3duIG9wZXJhdGlvbiBpcyBzdGlsbCBiZWluZyBkb25lLgorICAgIC8vIDMpIEFub3RoZXIgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBzaHV0ZG93biBvcGVyYXRpb24uCisgICAgLy8gNCkgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGhhbmRsZXMgdGhlIGVycm9yLgorICAgIC8vIDUpIENsaWVudCByZWxlYXNlcyB0aGUgY29kZWMgdXBvbiB0aGUgZXJyb3I7IHByZXZpb3VzIHNodXRkb3duIGlzIHN0aWxsCisgICAgLy8gICAgZ29pbmcgb24uCisgICAgLy8gNikgQ29tcG9uZW50IHRocmVhZCBjb21wbGV0ZXMgc2h1dGRvd24gYW5kIHBvc3RzIG9uU3RvcENvbXBsZXRlZCgpOworICAgIC8vICAgIFNodXRkb3duIGZyb20gcmVsZWFzZSBhbHNvIGNvbXBsZXRlcy4KKworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY05hbWV7InRlc3QuY29kZWMifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrQ29kZWNPd25lcnsibm9ib2R5In07CisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga01lZGlhVHlwZXsidmlkZW8veC10ZXN0In07CisKKyAgICBzcDxNb2NrQ29kZWM+IG1vY2tDb2RlYzsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpPiBnZXRDb2RlY0Jhc2UgPQorICAgICAgICBbJm1vY2tDb2RlY10oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopIHsKKyAgICAgICAgICAgIG1vY2tDb2RlYyA9IG5ldyBNb2NrQ29kZWMoW10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1vY2tCdWZmZXJDaGFubmVsPiAmKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbW9jayBzZXR1cCwgYXMgd2UgZG9uJ3QgZXhwZWN0IGFueSBidWZmZXIgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc2NlbmFyaW8uCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShjb25zdCBzcDxBTWVzc2FnZT4gJikgeworICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uQ29tcG9uZW50QWxsb2NhdGVkKGtDb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25Db21wb25lbnRDb25maWd1cmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy0+ZHVwKCksIG1zZy0+ZHVwKCkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVN0YXJ0KCkpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25TdGFydENvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZVNodXRkb3duKHRydWUpKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gMikKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gMykKKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVTaHV0ZG93bihmYWxzZSkpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlY10oYm9vbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcmV2aW91cyBzdG9wIGZpbmlzaGVkIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBhbHNvIGZpbmlzaGVkLgorICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG1vY2tDb2RlYzsKKyAgICAgICAgfTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcntuZXcgQUxvb3Blcn07CisgICAgc3A8TWVkaWFDb2RlYz4gY29kZWMgPSBTZXR1cE1lZGlhQ29kZWMoCisgICAgICAgICAgICBrQ29kZWNPd25lciwga0NvZGVjTmFtZSwga01lZGlhVHlwZSwgbG9vcGVyLCBnZXRDb2RlY0Jhc2UpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb2RlYykgPDwgIkNvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtb2NrQ29kZWMpIDw8ICJNb2NrQ29kZWMgbXVzdCBub3QgYmUgbnVsbCI7CisKKyAgICBjb2RlYy0+Y29uZmlndXJlKG5ldyBBTWVzc2FnZSwgbnVsbHB0ciwgbnVsbHB0ciwgMCk7CisgICAgY29kZWMtPnN0YXJ0KCk7CisgICAgLy8gc3RvcCgpIHdpbGwgZmFpbCBiZWNhdXNlIG9mIHRoZSBlcnJvcgorICAgIEVYUEVDVF9ORShPSywgY29kZWMtPnN0b3AoKSk7CisgICAgLy8gc2xlZXAgaGVyZSBzbyB0aGF0IHRoZSBsb29wZXIgdGhyZWFkIGNhbiBoYW5kbGUgYWxsIHRoZSBlcnJvcnMuCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMTAwKSk7CisgICAgLy8gdXBvbiByZWNlaXZpbmcgdGhlIGVycm9yLCBjbGllbnQgdHJpZXMgdG8gcmVsZWFzZSB0aGUgY29kZWMuCisgICAgY29kZWMtPnJlbGVhc2UoKTsKKyAgICBsb29wZXItPnN0b3AoKTsKK30KKworVEVTVChNZWRpYUNvZGVjVGVzdCwgRGVhZFdoaWxlQXN5bmNSZWxlYXNpbmcpIHsKKyAgICAvLyBUZXN0IHNjZW5hcmlvOgorICAgIC8vCisgICAgLy8gMSkgQ2xpZW50IHRocmVhZCBjYWxscyByZWxlYXNlKCk7IE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBjYWxscworICAgIC8vICAgIGluaXRpYXRlU2h1dGRvd24oKTsgc2h1dGRvd24gaXMgYmVpbmcgaGFuZGxlZCBhdCB0aGUgY29tcG9uZW50IHRocmVhZC4KKyAgICAvLyAyKSBDb2RlYyBzZXJ2aWNlIGRpZWQgZHVyaW5nIHRoZSBzaHV0ZG93biBvcGVyYXRpb24uCisgICAgLy8gMykgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkIGhhbmRsZXMgdGhlIGRlYXRoLgorCisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKKworICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9CisgICAgICAgIFsmbW9ja0NvZGVjXShjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKikgeworICAgICAgICAgICAgbW9ja0NvZGVjID0gbmV3IE1vY2tDb2RlYyhbXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TW9ja0J1ZmZlckNoYW5uZWw+ICYpIHsKKyAgICAgICAgICAgICAgICAvLyBObyBtb2NrIHNldHVwLCBhcyB3ZSBkb24ndCBleHBlY3QgYW55IGJ1ZmZlciBvcGVyYXRpb25zCisgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBzY2VuYXJpby4KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgT05fQ0FMTCgqbW9ja0NvZGVjLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KF8pKQorICAgICAgICAgICAgICAgIC5XaWxsQnlEZWZhdWx0KFttb2NrQ29kZWNdKGNvbnN0IHNwPEFNZXNzYWdlPiAmKSB7CisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25Db21wb25lbnRBbGxvY2F0ZWQoa0NvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVTaHV0ZG93bihfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShib29sKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDIpCisgICAgICAgICAgICAgICAgICAgIG1vY2tDb2RlYy0+Y2FsbGJhY2soKS0+b25FcnJvcihERUFEX09CSkVDVCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgICAgICAgICAvLyBDb2RlYyBzZXJ2aWNlIGhhcyBkaWVkLCBubyBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBtb2NrQ29kZWM7CisgICAgICAgIH07CisKKyAgICBzcDxBTG9vcGVyPiBsb29wZXJ7bmV3IEFMb29wZXJ9OworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gU2V0dXBNZWRpYUNvZGVjKAorICAgICAgICAgICAga0NvZGVjT3duZXIsIGtDb2RlY05hbWUsIGtNZWRpYVR5cGUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgY29kZWMpIDw8ICJDb2RlYyBtdXN0IG5vdCBiZSBudWxsIjsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgbW9ja0NvZGVjKSA8PCAiTW9ja0NvZGVjIG11c3Qgbm90IGJlIG51bGwiOworCisgICAgY29kZWMtPnJlbGVhc2VBc3luYyhuZXcgQU1lc3NhZ2UpOworICAgIC8vIHNsZWVwIGhlcmUgc28gdGhhdCB0aGUgbG9vcGVyIHRocmVhZCBjYW4gaGFuZGxlIHRoZSBlcnJvcgorICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDEwMCkpOworICAgIGxvb3Blci0+c3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTNjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKworI2luY2x1ZGUgIk1lZGlhVGVzdEhlbHBlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYworc3A8TWVkaWFDb2RlYz4gTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlYygKKyAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gZ2V0Q29kZWNCYXNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pIHsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYyA9IG5ldyBNZWRpYUNvZGVjKAorICAgICAgICAgICAgbG9vcGVyLCBNZWRpYUNvZGVjOjprTm9QaWQsIE1lZGlhQ29kZWM6OmtOb1VpZCwgZ2V0Q29kZWNCYXNlLCBnZXRDb2RlY0luZm8pOworICAgIGlmIChjb2RlYy0+aW5pdChuYW1lKSAhPSBPSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTWVkaWFUZXN0SGVscGVyOjpSZWNsYWltKGNvbnN0IHNwPE1lZGlhQ29kZWM+ICZjb2RlYywgYm9vbCBmb3JjZSkgeworICAgIGNvZGVjLT5yZWNsYWltKGZvcmNlKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+IE1lZGlhVGVzdEhlbHBlcjo6Q3JlYXRlQ29kZWNMaXN0V3JpdGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+KG5ldyBNZWRpYUNvZGVjTGlzdFdyaXRlcik7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYVRlc3RIZWxwZXI6OldyaXRlQ29kZWNJbmZvcygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiAmd3JpdGVyLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICpjb2RlY0luZm9zKSB7CisgICAgd3JpdGVyLT53cml0ZUNvZGVjSW5mb3MoY29kZWNJbmZvcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q2MTEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYVRlc3RIZWxwZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1RFU1RfSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfVEVTVF9IRUxQRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBDb2RlY0Jhc2U7CitzdHJ1Y3QgTWVkaWFDb2RlYzsKK3N0cnVjdCBNZWRpYUNvZGVjSW5mbzsKK3N0cnVjdCBNZWRpYUNvZGVjTGlzdFdyaXRlcjsKKworY2xhc3MgTWVkaWFUZXN0SGVscGVyIHsKK3B1YmxpYzoKKyAgICAvLyBNZWRpYUNvZGVjCisgICAgc3RhdGljIHNwPE1lZGlhQ29kZWM+IENyZWF0ZUNvZGVjKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopPiBnZXRDb2RlY0Jhc2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8pOworICAgIHN0YXRpYyB2b2lkIFJlY2xhaW0oY29uc3Qgc3A8TWVkaWFDb2RlYz4gJmNvZGVjLCBib29sIGZvcmNlKTsKKworICAgIC8vIE1lZGlhQ29kZWNMaXN0V3JpdGVyCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYUNvZGVjTGlzdFdyaXRlcj4gQ3JlYXRlQ29kZWNMaXN0V3JpdGVyKCk7CisgICAgc3RhdGljIHZvaWQgV3JpdGVDb2RlY0luZm9zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiAmd3JpdGVyLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiAqY29kZWNJbmZvcyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE1FRElBX1RFU1RfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkZjg5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZXRhRGF0YVV0aWxzVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZXRhRGF0YVV0aWxzVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ5N2YzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1ldGFEYXRhVXRpbHMgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1ldGFEYXRhVXRpbHNUZXN0LT4vZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNZXRhRGF0YVV0aWxzVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDVmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcApAQCAtMCwwICsxLDQ5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlsc1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPEVTRFMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CisKKyNpbmNsdWRlICJNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciB1aW50OF90IGtBZHRzQ3NkU2l6ZSA9IDc7CisvLyBmcm9tIEFBQyBzcGVjczogaHR0cHM6Ly93d3cuaXNvLm9yZy9zdGFuZGFyZC80MzM0NS5odG1sCitjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7OTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwgMjIwNTAsIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDB9OworY29uc3RleHByIHVpbnQ4X3Qga01heFNhbXBsaW5nRnJlcUluZGV4ID0gc2l6ZW9mKGtTYW1wbGluZ0ZyZXEpIC8gc2l6ZW9mKGtTYW1wbGluZ0ZyZXFbMF0pOworCitzdGF0aWMgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNZXRhRGF0YVZhbGlkYXRlIHsKKyAgcHVibGljOgorICAgIE1ldGFEYXRhVmFsaWRhdGUoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgfk1ldGFEYXRhVmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFNldFVwTWV0YURhdGFWYWxpZGF0ZShzdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChmaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgMCkgPDwgIkZhaWxlZCB0byBnZXQgZmlsZSBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBmaWxlTmFtZTsKKworICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEZJTEUgKmlucHV0RmlsZVB0ciA9IGZvcGVuKGZpbGVOYW1lLmNfc3RyKCksICJyYisiKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZVB0ciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3RbbUlucHV0QnVmZmVyU2l6ZV07CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgb2Ygc2l6ZTogIiA8PCBtSW5wdXRCdWZmZXJTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPQorICAgICAgICAgICAgICAgIGZyZWFkKChjaGFyICopbUlucHV0QnVmZmVyLCBzaXplb2YodWludDhfdCksIG1JbnB1dEJ1ZmZlclNpemUsIGlucHV0RmlsZVB0cik7CisgICAgICAgIEFTU0VSVF9FUShudW1CeXRlcywgbUlucHV0QnVmZmVyU2l6ZSkgPDwgbnVtQnl0ZXMgPDwgIiBvZiAiIDw8IG1JbnB1dEJ1ZmZlclNpemUgPDwgIiByZWFkIjsKKworICAgICAgICBmY2xvc2UoaW5wdXRGaWxlUHRyKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBdmNDU0RUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKmlucHV0RmlsZSovLCBzaXplX3QgLyphdmNXaWR0aCovLCBzaXplX3QgLyphdmNIZWlnaHQqLz4+IHsKKyAgcHVibGljOgorICAgIEF2Y0NTRFRlc3QoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgfkF2Y0NTRFRlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGRlbGV0ZVtdIG1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHNpemVfdCwgc2l6ZV90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lV2lkdGggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lSGVpZ2h0ID0gZ2V0PDI+KHBhcmFtcyk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBpbnQ4X3QgZXJyID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEZJTEUgKmlucHV0RmlsZVB0ciA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIrIik7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGVQdHIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBtSW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFttSW5wdXRCdWZmZXJTaXplXTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IG1JbnB1dEJ1ZmZlclNpemU7CisKKyAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9CisgICAgICAgICAgICAgICAgZnJlYWQoKGNoYXIgKiltSW5wdXRCdWZmZXIsIHNpemVvZih1aW50OF90KSwgbUlucHV0QnVmZmVyU2l6ZSwgaW5wdXRGaWxlUHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bUJ5dGVzLCBtSW5wdXRCdWZmZXJTaXplKSA8PCBudW1CeXRlcyA8PCAiIG9mICIgPDwgbUlucHV0QnVmZmVyU2l6ZSA8PCAiIHJlYWQiOworCisgICAgICAgIGZjbG9zZShpbnB1dEZpbGVQdHIpOworICAgIH0KKworICAgIHNpemVfdCBtRnJhbWVXaWR0aDsKKyAgICBzaXplX3QgbUZyYW1lSGVpZ2h0OworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIEF2Y0NTRFZhbGlkYXRlVGVzdCA6IHB1YmxpYyBNZXRhRGF0YVZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdHJpbmcgLyppbnB1dEZpbGUqLz4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwTWV0YURhdGFWYWxpZGF0ZShpbnB1dEZpbGUpKTsKKyAgICB9Cit9OworCitjbGFzcyBBYWNDU0RUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHVpbnQzMl90IC8qcHJvZmlsZSovLCB1aW50MzJfdCAvKnNhbXBsaW5nRnJlcUluZGV4Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qY2hhbm5lbENvbmZpZyovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTx1aW50MzJfdCwgdWludDMyX3QsIHVpbnQzMl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBtQWFjUHJvZmlsZSA9IGdldDwwPihwYXJhbXMpOworICAgICAgICBtQWFjU2FtcGxpbmdGcmVxSW5kZXggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUFhY0NoYW5uZWxDb25maWcgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBtQWFjUHJvZmlsZTsKKyAgICB1aW50MzJfdCBtQWFjU2FtcGxpbmdGcmVxSW5kZXg7CisgICAgdWludDMyX3QgbUFhY0NoYW5uZWxDb25maWc7Cit9OworCitjbGFzcyBBYWNBRFRTVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qYWR0c0ZpbGUqLywgdWludDMyX3QgLypjaGFubmVsQ291bnQqLywgdWludDMyX3QgLypzYW1wbGVSYXRlKi8+PiB7CisgIHB1YmxpYzoKKyAgICBBYWNBRFRTVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgdWludDMyX3QsIHVpbnQzMl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwwPihwYXJhbXMpOworICAgICAgICBtQWFjQ2hhbm5lbENvdW50ID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1BYWNTYW1wbGVSYXRlID0gZ2V0PDI+KHBhcmFtcyk7CisKKyAgICAgICAgRklMRSAqZmlsZVB0ciA9IGZvcGVuKGZpbGVOYW1lLmNfc3RyKCksICJyIik7CisgICAgICAgIEFTU0VSVF9ORShmaWxlUHRyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBmaWxlTmFtZTsKKworICAgICAgICBtSW5wdXRCdWZmZXIgPSBuZXcgdWludDhfdFtrQWR0c0NzZFNpemVdOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGEgbWVtb3J5IG9mIHNpemU6ICIgPDwga0FkdHNDc2RTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBmcmVhZCgodm9pZCAqKW1JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBrQWR0c0NzZFNpemUsIGZpbGVQdHIpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIGtBZHRzQ3NkU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBudW1CeXRlczsKKworICAgICAgICBmY2xvc2UoZmlsZVB0cik7CisgICAgfQorICAgIGludDMyX3QgbUFhY0NoYW5uZWxDb3VudDsKKyAgICBpbnQzMl90IG1BYWNTYW1wbGVSYXRlOworICAgIGNvbnN0IHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKK307CisKK2NsYXNzIEFhY0NTRFZhbGlkYXRlVGVzdCA6IHB1YmxpYyBNZXRhRGF0YVZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdHJpbmcgLyppbnB1dEZpbGUqLz4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKFNldFVwTWV0YURhdGFWYWxpZGF0ZShpbnB1dEZpbGUpKTsKKyAgICB9Cit9OworCitjbGFzcyBWb3JiaXNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZyAvKmZpbGVOYW1lKi8sIHN0cmluZyAvKmluZm9GaWxlKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIHN0cmluZyBpbnB1dE1lZGlhRmlsZSA9IGdFbnYtPmdldFJlcygpICsgcGFyYW1zLmZpcnN0OworICAgICAgICBtSW5wdXRGaWxlU3RyZWFtLm9wZW4oaW5wdXRNZWRpYUZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIEFTU0VSVF9UUlVFKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGF0YSBmaWxlOiAiIDw8IGlucHV0TWVkaWFGaWxlOworCisgICAgICAgIHN0cmluZyBpbnB1dEluZm9GaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBwYXJhbXMuc2Vjb25kOworICAgICAgICBtSW5mb0ZpbGVTdHJlYW0ub3BlbihpbnB1dEluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGRhdGEgZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworICAgICAgICBBU1NFUlRfRkFMU0UoaW5wdXRJbmZvRmlsZS5lbXB0eSgpKSA8PCAiRW1wdHkgaW5mbyBmaWxlOiAiIDw8IGlucHV0SW5mb0ZpbGU7CisgICAgfQorCisgICAgflZvcmJpc1Rlc3QoKSB7CisgICAgICAgIGlmIChtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgbUlucHV0RmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgaWZzdHJlYW0gbUlucHV0RmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitURVNUX1AoQXZjQ1NEVGVzdCwgQXZjQ1NEVmFsaWRhdGlvblRlc3QpIHsKKyAgICBBTWVkaWFGb3JtYXQgKmNzZERhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKGNzZERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gbWFrZSBBVkMgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJmF2Y1dpZHRoKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGF2YyB3aWR0aCI7CisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCk7CisKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBhdmMgaGVpZ2h0IjsKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpOworCisgICAgY29uc3QgY2hhciAqbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXRhRGF0YSBCYXNlIjsKKworICAgIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQVZDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBhdmNXaWR0aCA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmYXZjV2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBmaW5kIHRoZSB3aWR0aCI7CisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCk7CisKKyAgICBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBmaW5kIHRoZSBoZWlnaHQiOworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCk7CisKKyAgICB2b2lkICpjc2RBTWVkaWFGb3JtYXRCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RBTWVkaWFGb3JtYXRTaXplOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmY3NkQU1lZGlhRm9ybWF0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisgICAgQVNTRVJUX05FKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZyb20gQU1lZGlhRm9ybWF0IjsKKworICAgIGNvbnN0IHZvaWQgKmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgc2l6ZV90IGNzZE1ldGFEYXRhQmFzZVNpemUgPSAwOworICAgIHVpbnQzMl90IG1lZGlhVHlwZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZERhdGEoa0tleUFWQ0MsICZtZWRpYVR5cGUsICZjc2RNZXRhRGF0YUJhc2VCdWZmZXIsICZjc2RNZXRhRGF0YUJhc2VTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworICAgIEFTU0VSVF9ORShjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisgICAgQVNTRVJUX0dUKGNzZE1ldGFEYXRhQmFzZVNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKyAgICBBU1NFUlRfRVEoY3NkTWV0YURhdGFCYXNlU2l6ZSwgY3NkQU1lZGlhRm9ybWF0U2l6ZSkKKyAgICAgICAgICAgIDw8ICJDU0Qgc2l6ZSBvZiBNZXRhRGF0YSB0eXBlIGFuZCBBTWVkaWFGb3JtYXQgdHlwZSBtdXN0IGJlIHNhbWUiOworCisgICAgaW50MzJfdCByZXN1bHQgPSBtZW1jbXAoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIDApIDw8ICJDU0QgZnJvbSBBTWVkaWFGb3JtYXQgYW5kIE1ldGFEYXRhQmFzZSBkbyBub3QgbWF0Y2giOworCisgICAgZGVsZXRlIG1ldGFEYXRhOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoY3NkRGF0YSk7Cit9CisKK1RFU1RfUChBdmNDU0RWYWxpZGF0ZVRlc3QsIEF2Y1ZhbGlkYXRlVGVzdCkgeworICAgIEFNZWRpYUZvcm1hdCAqY3NkRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoY3NkRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICBib29sIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShjc2REYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEgd2l0aCBBTWVkaWFGb3JtYXQgc3VjY2VlZHMgd2l0aCBpbnZhbGlkIGRhdGEiOworCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE1ldGFEYXRhIEJhc2UiOworCisgICAgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIHdpdGggTWV0YURhdGFCYXNlIHN1Y2NlZWRzIHdpdGggaW52YWxpZCBkYXRhIjsKK30KKworVEVTVF9QKEFhY0NTRFRlc3QsIEFhY0NTRFZhbGlkYXRpb25UZXN0KSB7CisgICAgQU1lZGlhRm9ybWF0ICpjc2REYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShjc2REYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgIEFTU0VSVF9HRShtQWFjU2FtcGxpbmdGcmVxSW5kZXgsIDApOworICAgIEFTU0VSVF9MVChtQWFjU2FtcGxpbmdGcmVxSW5kZXgsIGtNYXhTYW1wbGluZ0ZyZXFJbmRleCk7CisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUFhY1Byb2ZpbGUsIG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWFjQ2hhbm5lbENvbmZpZyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxlIHJhdGUiOworICAgIEFTU0VSVF9FUShrU2FtcGxpbmdGcmVxW21BYWNTYW1wbGluZ0ZyZXFJbmRleF0sIHNhbXBsZVJhdGUpOworCisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ29uZmlnKTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgTWV0YURhdGEgQmFzZSI7CisKKyAgICBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtQWFjUHJvZmlsZSwgbUFhY1NhbXBsaW5nRnJlcUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWFjQ2hhbm5lbENvbmZpZyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxpbmcgcmF0ZSI7CisgICAgQVNTRVJUX0VRKGtTYW1wbGluZ0ZyZXFbbUFhY1NhbXBsaW5nRnJlcUluZGV4XSwgc2FtcGxlUmF0ZSk7CisKKyAgICBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZjaGFubmVsQ291bnQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudCwgbUFhY0NoYW5uZWxDb25maWcpOworCisgICAgbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICB2b2lkICpjc2RBTWVkaWFGb3JtYXRCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RBTWVkaWFGb3JtYXRTaXplID0gMDsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjc2RBTWVkaWFGb3JtYXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgQU1lZGlhRm9ybWF0IENTRCI7CisgICAgQVNTRVJUX0dUKGNzZEFNZWRpYUZvcm1hdFNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKyAgICBBU1NFUlRfTkUoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZm91bmQiOworCisgICAgY29uc3Qgdm9pZCAqY3NkTWV0YURhdGFCYXNlQnVmZmVyOworICAgIHNpemVfdCBjc2RNZXRhRGF0YUJhc2VTaXplID0gMDsKKyAgICB1aW50MzJfdCBtZWRpYVR5cGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmbWVkaWFUeXBlLCAmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgRVNEUyBkYXRhIGZyb20gTWV0YURhdGFCYXNlIjsKKyAgICBBU1NFUlRfR1QoY3NkTWV0YURhdGFCYXNlU2l6ZSwgMCkgPDwgIkNTRCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgRVNEUyBlc2RzKGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZXNkcy5nZXRDb2RlY1NwZWNpZmljSW5mbygmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHJlc3VsdCwgKHN0YXR1c190KU9LKSA8PCAiRmFpbGVkIHRvIGdldCBDU0QgZnJvbSBFU0RTIGRhdGEiOworICAgIEFTU0VSVF9ORShjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmb3VuZCI7CisgICAgQVNTRVJUX0VRKGNzZEFNZWRpYUZvcm1hdFNpemUsIGNzZE1ldGFEYXRhQmFzZVNpemUpCisgICAgICAgICAgICA8PCAiQ1NEIHNpemUgZG8gbm90IG1hdGNoIGJldHdlZW4gQU1lZGlhRm9ybWF0IHR5cGUgYW5kIE1ldGFEYXRhQmFzZSB0eXBlIjsKKworICAgIGludDMyX3QgbWVtY21wUmVzdWx0ID0KKyAgICAgICAgICAgIG1lbWNtcChjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIGNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgY3NkQU1lZGlhRm9ybWF0U2l6ZSk7CisgICAgQVNTRVJUX0VRKG1lbWNtcFJlc3VsdCwgMCkgPDwgIkFNZWRpYUZvcm1hdCBhbmQgTWV0YURhdGFCYXNlIENTRHMgZG8gbm90IG1hdGNoIjsKKworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoY3NkRGF0YSk7CisgICAgZGVsZXRlIG1ldGFEYXRhOworfQorCitURVNUX1AoQWFjQURUU1Rlc3QsIEFhY0FEVFNWYWxpZGF0aW9uVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIGtBZHRzQ3NkU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQUFDIENTRCBmcm9tIE1ldGFEYXRhQmFzZSI7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBzYW1wbGluZyByYXRlIjsKKyAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZSwgbUFhY1NhbXBsZVJhdGUpOworCisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZjaGFubmVsQ291bnQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBjb3VudCI7CisgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudCwgbUFhY0NoYW5uZWxDb3VudCk7CisKKyAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBtaW1lIHR5cGUiOworICAgIEFTU0VSVF9TVFJFUShtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKworICAgIGRlbGV0ZSBtZXRhRGF0YTsKK30KKworVEVTVF9QKEFhY0NTRFZhbGlkYXRlVGVzdCwgQWFjSW52YWxpZElucHV0VGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIGtBZHRzQ3NkU2l6ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSBzdWNjZWVkcyB3aXRoIGludmFsaWQgZGF0YSI7Cit9CisKK1RFU1RfUChWb3JiaXNUZXN0LCBWb3JiaXNDb21tZW50VGVzdCkgeworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0YWc7CisgICAgc3RyaW5nIGtleTsKKyAgICBzdHJpbmcgdmFsdWU7CisgICAgc2l6ZV90IGNvbW1lbnRMZW5ndGg7CisgICAgYm9vbCBzdGF0dXM7CisKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0YWcgPj4ga2V5ID4+IHZhbHVlID4+IGNvbW1lbnRMZW5ndGg7CisgICAgICAgIEFTU0VSVF9HVChjb21tZW50TGVuZ3RoLCAwKSA8PCAiVm9yYmlzIGNvbW1lbnQgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICBzdHJpbmcgY29tbWVudDsKKyAgICAgICAgc3RyaW5nIGRhdGFMaW5lOworCisgICAgICAgIGdldGxpbmUobUlucHV0RmlsZVN0cmVhbSwgZGF0YUxpbmUpOworICAgICAgICBpc3RyaW5nc3RyZWFtIGRhdGFTdHJpbmdMaW5lKGRhdGFMaW5lKTsKKyAgICAgICAgZGF0YVN0cmluZ0xpbmUgPj4gY29tbWVudDsKKworICAgICAgICBjaGFyICpidWZmZXIgPSBzdHJuZHVwKGNvbW1lbnQuY19zdHIoKSwgY29tbWVudExlbmd0aCk7CisgICAgICAgIEFTU0VSVF9ORShidWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemU6ICIgPDwgY29tbWVudExlbmd0aDsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICBBU1NFUlRfTkUoZmlsZU1ldGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudChmaWxlTWV0YSwgYnVmZmVyLCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgZnJlZShidWZmZXIpOworCisgICAgICAgIGlmICghc3RybmNhc2VjbXAodGFnLmNfc3RyKCksICJBTkRST0lEX0hBUFRJQyIsIHNpemVvZih0YWcpKSkgeworICAgICAgICAgICAgaW50MzJfdCBudW1DaGFubmVsRXhwZWN0ZWQgPSBzdG9pKHZhbHVlKTsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbEZvdW5kID0gLTE7CisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZmlsZU1ldGEsIGtleS5jX3N0cigpLCAmbnVtQ2hhbm5lbEZvdW5kKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGNoYW5uZWwgY291bnQiOworICAgICAgICAgICAgQVNTRVJUX0VRKG51bUNoYW5uZWxFeHBlY3RlZCwgbnVtQ2hhbm5lbEZvdW5kKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodGFnLmNfc3RyKCksICJBTkRST0lEX0xPT1AiLCBzaXplb2YodGFnKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbG9vcEV4cGVjdGVkID0gIXZhbHVlLmNvbXBhcmUoInRydWUiKTsKKyAgICAgICAgICAgIGludDMyX3QgbG9vcEZvdW5kID0gLTE7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmaWxlTWV0YSwgImxvb3AiLCAmbG9vcEZvdW5kKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGxvb3AgY291bnQiOworICAgICAgICAgICAgQVNTRVJUX0VRKGxvb3BFeHBlY3RlZCwgbG9vcEZvdW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZ1ZhbHVlID0gIiI7CisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZpbGVNZXRhLCBrZXkuY19zdHIoKSwgJnRhZ1ZhbHVlKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIHRhZyB2YWx1ZSI7CisgICAgICAgICAgICBBU1NFUlRfU1RSRVEodmFsdWUuY19zdHIoKSwgdGFnVmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZmlsZU1ldGEpOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBdmNDU0RUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInNwc19wcHNfdXNlcmRhdGEuaDI2NCIsIDgsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNwc191c2VyZGF0YV9wcHMuaDI2NCIsIDgsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNwc19wcHNfc3BzX3Bwcy5oMjY0IiwgOCwgOCkpKTsKKworLy8gVE9ETyhiLzE1ODA2NzY5MSk6IEFkZCBpbnZhbGlkIHRlc3QgdmVjdG9ycyB3aXRoIGluY29tcGxldGUgUFBTIG9yIG5vIFBQUworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBdmNDU0RWYWxpZGF0ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoInNwc19wcHNfb25seV9zdGFydGNvZGUuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwc19pbmNvbXBsZXRlX3Bwcy5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU4MDY3NjkxKSAic3BzX3Bwc19pbmNvbXBsZXRlLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5kb21kYXRhLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNTgwNjc2OTEpICJzcHMuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwcy5oMjY0IikpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0NTRFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZShBQUNPYmplY3RNYWluLCAxLCAxKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0FEVFNUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImxvdWRzb2Z0YWFjYWR0cyIsIDEsIDQ0MTAwKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTWV0YURhdGFVdGlsc1Rlc3RBbGwsIEFhY0NTRFZhbGlkYXRlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRoZWFkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3Vkc29mdGFhY2FkdHNfaW52YWxpZHByb2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3Vkc29mdGFhY2FkdHNfaW52YWxpZGNoYW5uZWxjb25maWciKSk7CisKKy8vIFRPRE8oYi8xNTc5NzQ1MDgpIEFkZCB0ZXN0IHZlY3RvciBmb3Igdm9yYmlzIHRodW1ibmFpbCB0YWcKKy8vIEluZm8gZmlsZSBjb250YWlucyBUQUcsIEtleSwgVmFsdWUgYW5kIHNpemUgb2YgdGhlIHZvcmJpcyBjb21tZW50CitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBWb3JiaXNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfc2ludGVsLmRhdCIsICJ2b3JiaXNjb21tZW50X3NpbnRlbC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidm9yYmlzY29tbWVudF9hbGJ1bS5kYXQiLCAidm9yYmlzY29tbWVudF9hbGJ1bS5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidm9yYmlzY29tbWVudF9sb29wLmRhdCIsICJ2b3JiaXNjb21tZW50X2xvb3AuaW5mbyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjQyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fTUVUQURBVEFfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBNZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fTUVUQURBVEFfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2MmEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBNZXRhRGF0YVV0aWxzIFRlc3QKK1RoZSBNZXRhRGF0YVV0aWxzIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMgbGlicmFyeSBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE1ldGFEYXRhVXRpbHNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L01ldGFEYXRhVXRpbHNUZXN0L01ldGFEYXRhVXRpbHNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvTWV0YURhdGFVdGlsc1Rlc3QvTWV0YURhdGFVdGlsc1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggTWV0YURhdGFVdGlsc1Rlc3RSZXMtMS4wIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogTWV0YURhdGFVdGlsc1Rlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTWV0YURhdGFVdGlsc1Rlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCmluZGV4IDdlMTY5Y2IuLjM4ZDVlY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGVzdHNfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3Rlc3RzX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJ3cml0ZXJUZXN0IiwKICAgICBndGVzdDogdHJ1ZSwKQEAgLTI4LDEzICszOSwxNSBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKLSAgICAgICAgImxpYmRhdGFzb3VyY2UiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlib2dnIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKaW5kZXggZDgzMTU1NS4uY2M4OTBmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSwxMiArMTksMTMgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0id3JpdGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXIuemlwP3VuemlwPXRydWUiCi0gICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3RSZXMvIiAvPgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJ3cml0ZXJUZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdFJlcy8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLUMgdHJ1ZSIgLz4KICAgICA8L3Rlc3Q+CiA8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZAppbmRleCBhZTA3OTE3Li4wZTU0Y2E3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKQEAgLTE5LDEzICsxOSwxOCBAQAogCiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L3dyaXRlclRlc3Qvd3JpdGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCiAKLVRoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvd3JpdGVyVGVzdFJlcy56aXApLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0UmVzLTEuMS56aXApLgogRG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIGZvbGRlci4gUHVzaCBhbGwgdGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIHRvIC9kYXRhL2xvY2FsL3RtcC8gb24gdGhlIGRldmljZS4KIGBgYAotYWRiIHB1c2ggd3JpdGVyVGVzdFJlcyAvZGF0YS9sb2NhbC90bXAvCithZGIgcHVzaCBXcml0ZXJUZXN0UmVzLTEuMS8uIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLwogYGBgCiAKLXVzYWdlOiB3cml0ZXJUZXN0IC1QIFw8cGF0aF90b19yZXNfZm9sZGVyXD4KK3VzYWdlOiB3cml0ZXJUZXN0IC1QIFw8cGF0aF90b19yZXNfZm9sZGVyXD4gLUMgPHJlbW92ZV9vdXRwdXRfZmlsZT4KIGBgYAotYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC8KK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvV3JpdGVyVGVzdFJlcy8gLUMgdHJ1ZQorYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCB3cml0ZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKIGBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWYwYTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlckxpc3RlbmVyLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgV1JJVEVSX0xJU1RFTkVSX0hfCisjZGVmaW5lIFdSSVRFUl9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBXcml0ZXJMaXN0ZW5lciA6IHB1YmxpYyBCbk1lZGlhUmVjb3JkZXJDbGllbnQgeworICBwdWJsaWM6CisgICAgV3JpdGVyTGlzdGVuZXIoKSA6IG1TaWduYWxlZFNpemUoZmFsc2UpLCBtU2lnbmFsZWREdXJhdGlvbihmYWxzZSkge30KKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50MzJfdCBtc2csIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKSB7CisgICAgICAgIEFMT0dWKCJtc2cgOiAlZCwgZXh0MSA6ICVkLCBleHQyIDogJWQiLCBtc2csIGV4dDEsIGV4dDIpOworICAgICAgICBpZiAoZXh0MSA9PSBNRURJQV9SRUNPUkRFUl9JTkZPX01BWF9GSUxFU0laRV9SRUFDSEVEKSB7CisgICAgICAgICAgICBtU2lnbmFsZWRTaXplID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChleHQxID09IE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQpIHsKKyAgICAgICAgICAgIG1TaWduYWxlZER1cmF0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvbGF0aWxlIGJvb2wgbVNpZ25hbGVkU2l6ZTsKKyAgICB2b2xhdGlsZSBib29sIG1TaWduYWxlZER1cmF0aW9uOworfTsKKworI2VuZGlmICAvLyBXUklURVJfTElTVEVORVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcAppbmRleCBmZjA2M2UzLi5kMTcwZTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCkBAIC0xOCw5ICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJXcml0ZXJUZXN0IgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC0zOSwxOCArNDMsNDAgQEAKIAogI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvd3JpdGVyLm91dCIKIAorLy8gU3R0cyB2YWx1ZXMgd2l0aGluIDAuMW1zKDEwMHVzKSBkaWZmZXJlbmNlIGFyZSBmdWRnZWQgdG8gc2F2ZSB0b28KKy8vIG1hbnkgc3R0cyBlbnRyaWVzIGluIE1QRUc0V3JpdGVyLgorY29uc3RleHByIGludDMyX3Qga01wZWc0TXV4VG9sZXJhbmNlVGltZVVzID0gMTAwOworLy8gVG9sZXJhbmNlIHZhbHVlIGZvciBvdGhlciB3cml0ZXJzCitjb25zdGV4cHIgaW50MzJfdCBrTXV4VG9sZXJhbmNlVGltZVVzID0gMTsKKwogc3RhdGljIFdyaXRlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKLXN0cnVjdCBjb25maWdGb3JtYXQgewotICAgIGNoYXIgbWltZVsxMjhdOwotICAgIGludDMyX3Qgd2lkdGg7Ci0gICAgaW50MzJfdCBoZWlnaHQ7Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50OworZW51bSBpbnB1dElkIHsKKyAgICAvLyBhdWRpbyBzdHJlYW1zCisgICAgQUFDXzEsCisgICAgQUFDX0FEVFNfMSwKKyAgICBBTVJfTkJfMSwKKyAgICBBTVJfV0JfMSwKKyAgICBGTEFDXzEsCisgICAgT1BVU18xLAorICAgIFZPUkJJU18xLAorICAgIC8vIHZpZGVvIHN0cmVhbXMKKyAgICBBVjFfMSwKKyAgICBBVkNfMSwKKyAgICBIMjYzXzEsCisgICAgSEVWQ18xLAorICAgIE1QRUc0XzEsCisgICAgVlA4XzEsCisgICAgVlA5XzEsCisgICAgLy8gaGVpZiBzdHJlYW0KKyAgICBIRUlDXzEsCisgICAgVU5VU0VEX0lELAorICAgIFVOS05PV05fSUQsCiB9OwogCiAvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCiBzdGF0aWMgY29uc3Qgc3RydWN0IElucHV0RGF0YSB7CisgICAgaW5wdXRJZCBpbnBJZDsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIHN0cmluZyBpbnB1dEZpbGU7CiAgICAgc3RyaW5nIGluZm87CkBAIC01OCw2NSArODQsNzMgQEAKICAgICBpbnQzMl90IHNlY29uZFBhcmFtOwogICAgIGJvb2wgaXNBdWRpbzsKIH0ga0lucHV0RGF0YVtdID0gewotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsCi0gICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCi0gICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUywgIk1wc18yX2MyX2ZyMV9TYzFfRGMyXzB4MDNfcmF3LmFkdHMiLAorICAgICAgICB7QUFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgImF1ZGlvX2FhY19zdGVyZW9fOGticHNfMTEwMjVoei5hYWMiLAorICAgICAgICAgImF1ZGlvX2FhY19zdGVyZW9fOGticHNfMTEwMjVoei5pbmZvIiwgMTEwMjUsIDIsIHRydWV9LAorICAgICAgICB7QUFDX0FEVFNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDX0FEVFMsICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5hZHRzIiwKICAgICAgICAgICJNcHNfMl9jMl9mcjFfU2MxX0RjMl8weDAzX3Jhdy5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCisgICAgICAgIHtBTVJfTkJfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiIsCiAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5pbmZvIiwgODAwMCwgMSwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAge0FNUl9XQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLCAxNjAwMCwgMSwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwKLSAgICAgICAgICJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLAorICAgICAgICB7RkxBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKICAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAotICAgICAgICAgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKLSAgICAgICAgICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAotICAgICAgICAgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKLSAgICAgICAgICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsCisgICAgICAgIHtPUFVTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLAorICAgICAgICAgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKKyAgICAgICAge1ZPUkJJU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfdm9yYmlzXzFjaF82NGticHNfMTZrSHoudm9yYmlzIiwKKyAgICAgICAgICJiYmJfdm9yYmlzXzFjaF82NGticHNfMTZrSHouaW5mbyIsIDE2MDAwLCAxLCB0cnVlfSwKKworICAgICAgICB7QVYxXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwgImJiYl9hdjFfMTc2XzE0NC5hdjEiLCAiYmJiX2F2MV8xNzZfMTQ0LmluZm8iLCAxNzYsIDE0NCwKKyAgICAgICAgIGZhbHNlfSwKKyAgICAgICAge0FWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJiYmJfYXZjXzM1MngyODhfNzY4a2Jwc18zMGZwcy5hdmMiLAorICAgICAgICAgImJiYl9hdmNfMzUyeDI4OF83NjhrYnBzXzMwZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAorICAgICAgICB7SDI2M18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMiLAogICAgICAgICAgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLAorICAgICAgICB7SEVWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiYmJiX2hldmNfMzQweDI4MF83NjhrYnBzXzMwZnBzLmhldmMiLAorICAgICAgICAgImJiYl9oZXZjXzM0MHgyODBfNzY4a2Jwc18zMGZwcy5pbmZvIiwgMzQwLCAyODAsIGZhbHNlfSwKKyAgICAgICAge01QRUc0XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0LCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYiLAogICAgICAgICAgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCisgICAgICAgIHtWUDhfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge1ZQOV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorCisgICAgICAgIHtIRUlDXzEsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGVpY18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCiB9OwogCi1jbGFzcyBXcml0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgaW50MzJfdD4+IHsKK2NsYXNzIFdyaXRlclRlc3QgewogICBwdWJsaWM6Ci0gICAgV3JpdGVyVGVzdCgpIDogbVdyaXRlcihudWxscHRyKSwgbUZpbGVNZXRhKG51bGxwdHIpLCBtQ3VycmVudFRyYWNrKG51bGxwdHIpIHt9CisgICAgV3JpdGVyVGVzdCgpIDogbVdyaXRlcihudWxscHRyKSwgbUZpbGVNZXRhKG51bGxwdHIpIHt9CiAKICAgICB+V3JpdGVyVGVzdCgpIHsKLSAgICAgICAgaWYgKG1Xcml0ZXIpIHsKLSAgICAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKLSAgICAgICAgICAgIG1Xcml0ZXIgPSBudWxscHRyOwotICAgICAgICB9CiAgICAgICAgIGlmIChtRmlsZU1ldGEpIHsKICAgICAgICAgICAgIG1GaWxlTWV0YS5jbGVhcigpOwogICAgICAgICAgICAgbUZpbGVNZXRhID0gbnVsbHB0cjsKICAgICAgICAgfQotICAgICAgICBpZiAobUN1cnJlbnRUcmFjaykgewotICAgICAgICAgICAgbUN1cnJlbnRUcmFjay5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRUcmFjayA9IG51bGxwdHI7CisgICAgICAgIGlmIChtV3JpdGVyKSB7CisgICAgICAgICAgICBtV3JpdGVyLmNsZWFyKCk7CisgICAgICAgICAgICBtV3JpdGVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ0Vudi0+Y2xlYW5VcCgpKSByZW1vdmUoT1VUUFVUX0ZJTEVfTkFNRSk7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGtNYXhUcmFja0NvdW50OyBpZHgrKykgeworICAgICAgICAgICAgbUJ1ZmZlckluZm9baWR4XS5jbGVhcigpOworICAgICAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS0+c3RvcCgpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XS5jbGVhcigpOworICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUlucHV0U3RyZWFtW2lkeF0uaXNfb3BlbigpKSBtSW5wdXRTdHJlYW1baWR4XS5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgICAgICBtTnVtQ3NkcyA9IDA7Ci0gICAgICAgIG1JbnB1dEZyYW1lSWQgPSAwOworICAgIHZvaWQgc2V0dXBXcml0ZXJUeXBlKHN0cmluZyB3cml0ZXJGb3JtYXQpIHsKICAgICAgICAgbVdyaXRlck5hbWUgPSB1bmtub3duX2NvbXA7CiAgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOwotCiAgICAgICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RhbmRhcmRXcml0ZXJzPiBtYXBXcml0ZXIgPSB7CiAgICAgICAgICAgICAgICAgeyJvZ2ciLCBPR0d9LCAgICAgeyJhYWMiLCBBQUN9LCAgICAgIHsiYWFjX2FkdHMiLCBBQUNfQURUU30sIHsid2VibSIsIFdFQk19LAogICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sIHsiYW1ybmIiLCBBTVJfTkJ9LCB7ImFtcndiIiwgQU1SX1dCfSwgICAgICB7Im1wZWcyVHMiLCBNUEVHMlRTfX07CiAgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAgICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OwogICAgICAgICBpZiAobWFwV3JpdGVyLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBXcml0ZXIuZW5kKCkpIHsKICAgICAgICAgICAgIG1Xcml0ZXJOYW1lID0gbWFwV3JpdGVyLmF0KHdyaXRlckZvcm1hdCk7CiAgICAgICAgIH0KQEAgLTEyNiwxNiArMTYwLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7Ci0gICAgICAgIG1CdWZmZXJJbmZvLmNsZWFyKCk7Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbyk7CisgICAgdm9pZCBnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8sIGludDMyX3QgaWR4ID0gMCk7CiAKICAgICBpbnQzMl90IGNyZWF0ZVdyaXRlcihpbnQzMl90IGZkKTsKIAotICAgIGludDMyX3QgYWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcyk7CisgICAgaW50MzJfdCBhZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zLCBpbnQzMl90IGlkeCA9IDApOworCisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc3RyaW5nIGlucHV0RmlsZU5hbWUsIGludDMyX3QgJnRyYWNrQ291bnQpOworCisgICAgdm9pZCBleHRyYWN0KEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25maWdGb3JtYXQgJnBhcmFtcywgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAorICAgICAgICAgICAgICAgICB1aW50OF90ICpidWZmZXIsIHNpemVfdCBidWZTaXplLCBzaXplX3QgKmJ5dGVzRXh0cmFjdGVkLCBpbnQzMl90IGlkeCk7CisKKyAgICB2b2lkIGNvbXBhcmVQYXJhbXMoY29uZmlnRm9ybWF0IHNyY1BhcmFtLCBjb25maWdGb3JtYXQgZHN0UGFyYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiBkc3RCdWZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KTsKIAogICAgIGVudW0gc3RhbmRhcmRXcml0ZXJzIHsKICAgICAgICAgT0dHLApAQCAtMTUyLDMyICsxODksNDIgQEAKICAgICBzdGFuZGFyZFdyaXRlcnMgbVdyaXRlck5hbWU7CiAgICAgc3A8TWVkaWFXcml0ZXI+IG1Xcml0ZXI7CiAgICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKLSAgICBzcDxNZWRpYUFkYXB0ZXI+IG1DdXJyZW50VHJhY2s7CisgICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrW2tNYXhUcmFja0NvdW50XXt9OwogCiAgICAgYm9vbCBtRGlzYWJsZVRlc3Q7Ci0gICAgaW50MzJfdCBtTnVtQ3NkczsKLSAgICBpbnQzMl90IG1JbnB1dEZyYW1lSWQ7Ci0gICAgaWZzdHJlYW0gbUlucHV0U3RyZWFtOwotICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVySW5mbzsKKyAgICBpbnQzMl90IG1OdW1Dc2RzW2tNYXhUcmFja0NvdW50XXt9OworICAgIGludDMyX3QgbUlucHV0RnJhbWVJZFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICBpZnN0cmVhbSBtSW5wdXRTdHJlYW1ba01heFRyYWNrQ291bnRde307CisgICAgdmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJJbmZvW2tNYXhUcmFja0NvdW50XTsKIH07CiAKLXZvaWQgV3JpdGVyVGVzdDo6Z2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvKSB7CitjbGFzcyBXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SWQgLyogaW5wdXRJZDEqLywgZmxvYXQgLyogQnVmZmVySW50ZXJ2YWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK3ZvaWQgV3JpdGVyVGVzdDo6Z2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvLCBpbnQzMl90IGlkeCkgewogICAgIHN0ZDo6aWZzdHJlYW0gZWxlSW5mbzsKICAgICBlbGVJbmZvLm9wZW4oaW5wdXRJbmZvLmNfc3RyKCkpOwogICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CiAgICAgaW50MzJfdCBieXRlc0NvdW50ID0gMDsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIGludDMyX3QgbnVtQ3NkcyA9IDA7CiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CiAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CiAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOwotICAgICAgICBtQnVmZmVySW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKLSAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHKSBtTnVtQ3NkcysrOworICAgICAgICBtQnVmZmVySW5mb1tpZHhdLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBpZiAoZmxhZ3MgPT0gQ09ERUNfQ09ORklHX0ZMQUcpIG51bUNzZHMrKzsKICAgICB9CiAgICAgZWxlSW5mby5jbG9zZSgpOwotICAgIG1JbnB1dFN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKLSAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgbU51bUNzZHNbaWR4XSA9IG51bUNzZHM7CisgICAgbUlucHV0U3RyZWFtW2lkeF0ub3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1JbnB1dFN0cmVhbVtpZHhdLmlzX29wZW4oKSwgdHJ1ZSk7CiB9CiAKIGludDMyX3QgV3JpdGVyVGVzdDo6Y3JlYXRlV3JpdGVyKGludDMyX3QgZmQpIHsKQEAgLTIyMywxMCArMjcwLDEwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludDMyX3QgV3JpdGVyVGVzdDo6YWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcykgewotICAgIGlmIChtSW5wdXRGcmFtZUlkKSByZXR1cm4gLTE7CitpbnQzMl90IFdyaXRlclRlc3Q6OmFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMsIGludDMyX3QgaWR4KSB7CisgICAgaWYgKG1JbnB1dEZyYW1lSWRbaWR4XSkgcmV0dXJuIC0xOwogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgaWYgKG1JbnB1dFN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICBpZiAobUlucHV0U3RyZWFtW2lkeF0uaXNfb3BlbigpKSB7CiAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgcGFyYW1zLm1pbWUpOwogICAgICAgICBpZiAoaXNBdWRpbykgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5jaGFubmVsQ291bnQpOwpAQCAtMjM1LDI1ICsyODIsMzQgQEAKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcGFyYW1zLndpZHRoKTsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHBhcmFtcy5oZWlnaHQpOwogICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBzdGF0dXMgPQotICAgICAgICAgICAgICAgIHdyaXRlSGVhZGVyQnVmZmVycyhtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBmb3JtYXQsIG1OdW1Dc2RzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChtTnVtQ3Nkc1tpZHhdKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YXR1cyA9IHdyaXRlSGVhZGVyQnVmZmVycyhtSW5wdXRTdHJlYW1baWR4XSwgbUJ1ZmZlckluZm9baWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWRbaWR4XSwgZm9ybWF0LCBtTnVtQ3Nkc1tpZHhdKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgcmV0dXJuIC0xOworICAgICAgICB9CiAgICAgfQorCiAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoZm9ybWF0LCB0cmFja01ldGEpOwotICAgIG1DdXJyZW50VHJhY2sgPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7Ci0gICAgaWYgKG1DdXJyZW50VHJhY2sgPT0gbnVsbHB0cikgeworICAgIG1DdXJyZW50VHJhY2tbaWR4XSA9IG5ldyBNZWRpYUFkYXB0ZXIodHJhY2tNZXRhKTsKKyAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIk1lZGlhQWRhcHRlciByZXR1cm5lZCBudWxscHRyIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG1DdXJyZW50VHJhY2spOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Xcml0ZXItPmFkZFNvdXJjZShtQ3VycmVudFRyYWNrW2lkeF0pOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQgZ2V0RmlsZURldGFpbHMoc3RyaW5nICZpbnB1dEZpbGVQYXRoLCBzdHJpbmcgJmluZm8sIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLCBib29sICZpc0F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUluZGV4ID0gMCkgewotICAgIGlmIChzdHJlYW1JbmRleCA+PSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJZCBpbnBJZCkgeworICAgIGludDMyX3QgaW5wdXREYXRhU2l6ZSA9IHNpemVvZihrSW5wdXREYXRhKSAvIHNpemVvZihrSW5wdXREYXRhWzBdKTsKKyAgICBpbnQzMl90IHN0cmVhbUluZGV4ID0gMDsKKyAgICBmb3IgKDsgc3RyZWFtSW5kZXggPCBpbnB1dERhdGFTaXplOyBzdHJlYW1JbmRleCsrKSB7CisgICAgICAgIGlmIChpbnBJZCA9PSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5pbnBJZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0cmVhbUluZGV4ID09IGlucHV0RGF0YVNpemUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnB1dEZpbGVQYXRoICs9IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmlucHV0RmlsZTsKQEAgLTI3MCw3ICszMjYsMTQ3IEBACiAgICAgcmV0dXJuOwogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgQ3JlYXRlV3JpdGVyVGVzdCkgewordm9pZCBXcml0ZXJUZXN0OjpzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3Rvciwgc3RyaW5nIGlucHV0RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJnRyYWNrQ291bnQpIHsKKyAgICBBTE9HVigiSW5wdXQgZmlsZSBmb3IgZXh0cmFjdG9yOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisKKyAgICBpbnQzMl90IGZkID0gb3BlbihpbnB1dEZpbGVOYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiB3cml0ZXIncyBvdXRwdXQgZmlsZSB0byB2YWxpZGF0ZSI7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0dXMgPSBmc3RhdChmZCwgJmJ1Zik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlIGZvciBleHRyYWN0b3IiOworCisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgQUxPR1YoIlNpemUgb2YgaW5wdXQgZmlsZSB0byBleHRyYWN0b3I6ICV6dSIsIGZpbGVTaXplKTsKKworICAgIHN0YXR1cyA9IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoZXh0cmFjdG9yLCBmZCwgMCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBzZXQgZGF0YSBzb3VyY2UgZm9yIGV4dHJhY3RvciI7CisKKyAgICB0cmFja0NvdW50ID0gQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoZXh0cmFjdG9yKTsKKyAgICBBU1NFUlRfR1QodHJhY2tDb3VudCwgMCkgPDwgIk5vIHRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IiOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciA6ICVkIiwgdHJhY2tDb3VudCk7CisgICAgcmV0dXJuOworfQorCit2b2lkIFdyaXRlclRlc3Q6OmV4dHJhY3QoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmJ5dGVzRXh0cmFjdGVkLCBpbnQzMl90IGlkeCkgeworICAgIEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhleHRyYWN0b3IsIGlkeCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoZXh0cmFjdG9yLCBpZHgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJUcmFjayBmb3JtYXQgaXMgTlVMTCI7CisgICAgQUxPR0koIlRyYWNrIGZvcm1hdCA9ICVzIiwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdCkpOworCisgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgIEFTU0VSVF9ORShtaW1lLCBudWxscHRyKSA8PCAiVHJhY2sgbWltZSBpcyBOVUxMIjsKKyAgICBBTE9HSSgiVHJhY2sgbWltZSA9ICVzIiwgbWltZSk7CisgICAgc3RybGNweShwYXJhbXMubWltZSwgbWltZSwga01pbWVTaXplKTsKKworICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmcGFyYW1zLmNoYW5uZWxDb3VudCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnBhcmFtcy5zYW1wbGVSYXRlKSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IHNhbXBsZSByYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKG1pbWUsICJ2aWRlby8iLCA2KSB8fCAhc3RybmNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJnBhcmFtcy53aWR0aCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmcGFyYW1zLmhlaWdodCkpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RvciBkaWQgbm90IHJlcG9ydCBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lICIgPDwgbWltZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGJ1ZmZlck9mZnNldCA9IDA7CisgICAgLy8gR2V0IENTRCBkYXRhCisgICAgaW50IGluZGV4ID0gMDsKKyAgICB2b2lkICpjc2RCdWY7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY3NkQnVmID0gbnVsbHB0cjsKKyAgICAgICAgY2hhciBjc2ROYW1lWzE2XTsKKyAgICAgICAgc25wcmludGYoY3NkTmFtZSwgMTYsICJjc2QtJWQiLCBpbmRleCk7CisgICAgICAgIHNpemVfdCBjc2RTaXplID0gMDsKKyAgICAgICAgYm9vbCBjc2RGb3VuZCA9IEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBjc2ROYW1lLCAmY3NkQnVmLCAmY3NkU2l6ZSk7CisgICAgICAgIGlmICghY3NkRm91bmQgfHwgIWNzZEJ1ZiB8fCAhY3NkU2l6ZSkgYnJlYWs7CisKKyAgICAgICAgYnVmZmVySW5mby5wdXNoX2JhY2soe3N0YXRpY19jYXN0PGludDMyX3Q+KGNzZFNpemUpLCBDT0RFQ19DT05GSUdfRkxBRywgMH0pOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgYnVmZmVyT2Zmc2V0LCBjc2RCdWYsIGNzZFNpemUpOworICAgICAgICBidWZmZXJPZmZzZXQgKz0gY3NkU2l6ZTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisKKyAgICAvLyBHZXQgZnJhbWUgZGF0YQorICAgIHdoaWxlICgxKSB7CisgICAgICAgIHNzaXplX3Qgc2FtcGxlU2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKGV4dHJhY3Rvcik7CisgICAgICAgIGlmIChzYW1wbGVTaXplIDwgMCkgYnJlYWs7CisKKyAgICAgICAgdWludDhfdCAqc2FtcGxlQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2Moc2FtcGxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShzYW1wbGVCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgc2FtcGxlU2l6ZTsKKworICAgICAgICBpbnQgYnl0ZXNSZWFkID0gQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKGV4dHJhY3Rvciwgc2FtcGxlQnVmZmVyLCBzYW1wbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGJ5dGVzUmVhZCwgc2FtcGxlU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiTnVtYmVyIG9mIGJ5dGVzIGV4dHJhY3RlZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNhbXBsZSBzaXplIjsKKyAgICAgICAgaW50NjRfdCBwdHMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShleHRyYWN0b3IpOworICAgICAgICB1aW50MzJfdCBmbGFnID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKGV4dHJhY3Rvcik7CisKKyAgICAgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7CisgICAgICAgICAgICAvLyBSZW1vdmluZyA0IGJ5dGVzIG9mIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyBmcm9tIHNhbXBsZSBzaXplCisgICAgICAgICAgICBieXRlc1JlYWQgPSBieXRlc1JlYWQgLSA0OworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX0xFKGJ1ZmZlck9mZnNldCArIGJ5dGVzUmVhZCwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiU2l6ZSBvZiB0aGUgYnVmZmVyIGlzIGluc3VmZmljaWVudCB0byBzdG9yZSB0aGUgZXh0cmFjdGVkIGRhdGEiOworICAgICAgICBidWZmZXJJbmZvLnB1c2hfYmFjayh7Ynl0ZXNSZWFkLCBmbGFnLCBwdHN9KTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlck9mZnNldCwgc2FtcGxlQnVmZmVyLCBieXRlc1JlYWQpOworICAgICAgICBidWZmZXJPZmZzZXQgKz0gYnl0ZXNSZWFkOworCisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKGV4dHJhY3Rvcik7CisgICAgICAgIGZyZWUoc2FtcGxlQnVmZmVyKTsKKyAgICB9CisgICAgKmJ5dGVzRXh0cmFjdGVkID0gYnVmZmVyT2Zmc2V0OworICAgIHJldHVybjsKK30KKwordm9pZCBXcml0ZXJUZXN0Ojpjb21wYXJlUGFyYW1zKGNvbmZpZ0Zvcm1hdCBzcmNQYXJhbSwgY29uZmlnRm9ybWF0IGRzdFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBkc3RCdWZJbmZvLCBpbnQzMl90IGluZGV4KSB7CisgICAgQVNTRVJUX1NUUkVRKHNyY1BhcmFtLm1pbWUsIGRzdFBhcmFtLm1pbWUpCisgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIG1pbWUgdHlwZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IG1pbWUgdHlwZSI7CisKKyAgICBpZiAoIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5jaGFubmVsQ291bnQsIGRzdFBhcmFtLmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIGNoYW5uZWwgY291bnQgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLnNhbXBsZVJhdGUsIGRzdFBhcmFtLnNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBzYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IHNhbXBsZSByYXRlIjsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJ2aWRlby8iLCA2KSB8fCAhc3RybmNtcChzcmNQYXJhbS5taW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLndpZHRoLCBkc3RQYXJhbS53aWR0aCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIHdpZHRoIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgd2lkdGgiOworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uaGVpZ2h0LCBkc3RQYXJhbS5oZWlnaHQpCisgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBoZWlnaHQgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lIHR5cGUiIDw8IHNyY1BhcmFtLm1pbWU7CisgICAgfQorCisgICAgaW50MzJfdCB0b2xlcmFuY2VWYWx1ZVVzID0ga011eFRvbGVyYW5jZVRpbWVVczsKKyAgICBpZiAobVdyaXRlck5hbWUgPT0gTVBFRzQpIHsKKyAgICAgICAgdG9sZXJhbmNlVmFsdWVVcyA9IGtNcGVnNE11eFRvbGVyYW5jZVRpbWVVczsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZHN0QnVmSW5mby5zaXplKCk7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUJ1ZmZlckluZm9baW5kZXhdW2ldLnNpemUsIGRzdEJ1ZkluZm9baV0uc2l6ZSkKKyAgICAgICAgICAgICAgICA8PCAiSW5wdXQgc2l6ZSAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS5zaXplIDw8ICIgbWlzbWF0Y2hlZCB3aXRoIGV4dHJhY3RlZCBzaXplICIKKyAgICAgICAgICAgICAgICA8PCBkc3RCdWZJbmZvW2ldLnNpemU7CisgICAgICAgIEFTU0VSVF9FUShtQnVmZmVySW5mb1tpbmRleF1baV0uZmxhZ3MsIGRzdEJ1ZkluZm9baV0uZmxhZ3MpCisgICAgICAgICAgICAgICAgPDwgIklucHV0IGZsYWcgIiA8PCBtQnVmZmVySW5mb1tpbmRleF1baV0uZmxhZ3MKKyAgICAgICAgICAgICAgICA8PCAiIG1pc21hdGNoZWQgd2l0aCBleHRyYWN0ZWQgc2l6ZSAiIDw8IGRzdEJ1ZkluZm9baV0uZmxhZ3M7CisgICAgICAgIEFTU0VSVF9MRShhYnMobUJ1ZmZlckluZm9baW5kZXhdW2ldLnRpbWVVcyAtIGRzdEJ1ZkluZm9baV0udGltZVVzKSwgdG9sZXJhbmNlVmFsdWVVcykKKyAgICAgICAgICAgICAgICA8PCAiRGlmZmVyZW5jZSBiZXR3ZWVuIG9yaWdpbmFsIHRpbWVzdGFtcCAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS50aW1lVXMKKyAgICAgICAgICAgICAgICA8PCAiIGFuZCBleHRyYWN0ZWQgdGltZXN0YW1wICIgPDwgZHN0QnVmSW5mb1tpXS50aW1lVXMKKyAgICAgICAgICAgICAgICA8PCAiaXMgZ3JlYXRlciB0aGFuIHRvbGVyYW5jZSB2YWx1ZSA9ICIgPDwgdG9sZXJhbmNlVmFsdWVVcyA8PCAiIG1pY3JvIHNlY29uZHMiOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBDcmVhdGVXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJUZXN0cyB0aGUgY3JlYXRpb24gb2Ygd3JpdGVycyIpOwogCkBAIC0yODEsMTQgKzQ3NywxNCBAQAogCiAgICAgLy8gQ3JlYXRpbmcgd3JpdGVyIHdpdGhpbiBhIHRlc3Qgc2NvcGUuIERlc3RydWN0b3Igc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSB0ZXN0IGVuZHMKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBjcmVhdGVXcml0ZXIoZmQpKQotICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgR2V0UGFyYW0oKS5maXJzdDsKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IGdldDwwPihHZXRQYXJhbSgpKTsKIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIFdyaXRlclRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBXcml0ZXJUZXN0KSB7CiAgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOwogICAgIEFMT0dWKCJDaGVja3MgaWYgZm9yIGEgZ2l2ZW4gaW5wdXQsIGEgdmFsaWQgbXV4ZWQgZmlsZSBoYXMgYmVlbiBjcmVhdGVkIG9yIG5vdCIpOwogCi0gICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CiAgICAgaW50MzJfdCBmZCA9CiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwpAQCAtMjk3LDM1ICs0OTMsMTEwIEBACiAgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OwogCi0gICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOwotICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKLSAgICBjb25maWdGb3JtYXQgcGFyYW07Ci0gICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOwotICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisgICAgaW5wdXRJZCBpbnBJZFtdID0ge2dldDwxPihHZXRQYXJhbSgpKSwgZ2V0PDI+KEdldFBhcmFtKCkpfTsKKyAgICBBU1NFUlRfTkUoaW5wSWRbMF0sIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOwogCi0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7Ci0gICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKLSAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisgICAgaW50MzJfdCBudW1UcmFja3MgPSAxOworICAgIGlmIChpbnBJZFsxXSAhPSBVTlVTRURfSUQpIHsKKyAgICAgICAgbnVtVHJhY2tzKys7CisgICAgfQorCisgICAgc2l6ZV90IGZpbGVTaXplW251bVRyYWNrc107CisgICAgY29uZmlnRm9ybWF0IHBhcmFtW251bVRyYWNrc107CisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIGJvb2wgaXNBdWRpbzsKKyAgICAgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtW2lkeF0sIGlzQXVkaW8sIGlucElkW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZToiIDw8IGlucHV0RmlsZTsKKyAgICAgICAgZmlsZVNpemVbaWR4XSA9IGJ1Zi5zdF9zaXplOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbywgaWR4KSk7CisgICAgICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbVtpZHhdLCBpZHgpOworICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisgICAgfQogCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSk7Ci0gICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKLSAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgZmxvYXQgaW50ZXJ2YWwgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX0xFKGludGVydmFsLCAxLjBmKSA8PCAiQnVmZmVyIGludGVydmFsIGludmFsaWQuIFNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4wIjsKIAorICAgIHNpemVfdCByYW5nZSA9IDA7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOworICAgIGludDMyX3Qgb2Zmc2V0W2tNYXhUcmFja0NvdW50XXt9OworICAgIHdoaWxlIChsb29wQ291bnQgPCBjZWlsKDEuMCAvIGludGVydmFsKSkgeworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICAgICAgcmFuZ2UgPSBtQnVmZmVySW5mb1tpZHhdLnNpemUoKSAqIGludGVydmFsOworICAgICAgICAgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1baWR4XSwgbUJ1ZmZlckluZm9baWR4XSwgbUlucHV0RnJhbWVJZFtpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0sIG9mZnNldFtpZHhdLCByYW5nZSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgICAgICAgICAgb2Zmc2V0W2lkeF0gKz0gcmFuZ2U7CisgICAgICAgIH0KKyAgICAgICAgbG9vcENvdW50Kys7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOwogICAgIGNsb3NlKGZkKTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBvdXRwdXQgbXV4ZWQgZmlsZSBjcmVhdGVkIGJ5IHdyaXRlcgorICAgIC8vIFRPRE8oYi8xNDY0MjMwMjIpOiBTa2lwIHZhbGlkYXRpbmcgb3V0cHV0IGZvciB3ZWJtIHdyaXRlcgorICAgIC8vIFRPRE8oYi8xNDY0MjEwMTgpOiBTa2lwIHZhbGlkYXRpbmcgb3V0cHV0IGZvciBvZ2cgd3JpdGVyCisgICAgaWYgKG1Xcml0ZXJOYW1lICE9IE9HRyAmJiBtV3JpdGVyTmFtZSAhPSBXRUJNKSB7CisgICAgICAgIGNvbmZpZ0Zvcm1hdCBleHRyYWN0b3JQYXJhbXNbbnVtVHJhY2tzXTsKKyAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+IGV4dHJhY3RvckJ1ZmZlckluZm9bbnVtVHJhY2tzXTsKKyAgICAgICAgaW50MzJfdCB0cmFja0NvdW50ID0gLTE7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CisgICAgICAgIEFTU0VSVF9ORShleHRyYWN0b3IsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGV4dHJhY3RvciI7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldHVwRXh0cmFjdG9yKGV4dHJhY3Rvciwgb3V0cHV0RmlsZSwgdHJhY2tDb3VudCkpOworICAgICAgICBBU1NFUlRfRVEodHJhY2tDb3VudCwgbnVtVHJhY2tzKQorICAgICAgICAgICAgICAgIDw8ICJUcmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgbnVtYmVyIG9mIHRyYWNrcyI7CisKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIGNoYXIgKmlucHV0QnVmZmVyID0gKGNoYXIgKiltYWxsb2MoZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfTkUoaW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGJ1ZmZlciBvZiBzaXplICIgPDwgZmlsZVNpemVbaWR4XTsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbVtpZHhdLnNlZWtnKDAsIG1JbnB1dFN0cmVhbVtpZHhdLmJlZyk7CisgICAgICAgICAgICBtSW5wdXRTdHJlYW1baWR4XS5yZWFkKGlucHV0QnVmZmVyLCBmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW1baWR4XS5nY291bnQoKSwgZmlsZVNpemVbaWR4XSk7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKmV4dHJhY3RlZEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RlZEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgIiA8PCBmaWxlU2l6ZVtpZHhdOworICAgICAgICAgICAgc2l6ZV90IGJ5dGVzRXh0cmFjdGVkID0gMDsKKworICAgICAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZXh0cmFjdChleHRyYWN0b3IsIGV4dHJhY3RvclBhcmFtc1tpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3JCdWZmZXJJbmZvW2lkeF0sIGV4dHJhY3RlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemVbaWR4XSwgJmJ5dGVzRXh0cmFjdGVkLCBpZHgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChieXRlc0V4dHJhY3RlZCwgMCkgPDwgIlRvdGFsIGJ5dGVzIGV4dHJhY3RlZCBieSBleHRyYWN0b3IgY2Fubm90IGJlIHplcm8iOworCisgICAgICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgICAgICAgICAgY29tcGFyZVBhcmFtcyhwYXJhbVtpZHhdLCBleHRyYWN0b3JQYXJhbXNbaWR4XSwgZXh0cmFjdG9yQnVmZmVySW5mb1tpZHhdLCBpZHgpKTsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1lbWNtcChleHRyYWN0ZWRCdWZmZXIsICh1aW50OF90ICopaW5wdXRCdWZmZXIsIGJ5dGVzRXh0cmFjdGVkKSwgMCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkV4dHJhY3RlZCBiaXQgc3RyZWFtIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgYml0IHN0cmVhbSI7CisKKyAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgZnJlZShleHRyYWN0ZWRCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoZXh0cmFjdG9yKTsKKyAgICB9CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBQYXVzZVdyaXRlclRlc3QpIHsKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBQYXVzZVdyaXRlclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAgICAgQUxPR1YoIlZhbGlkYXRlcyB0aGUgcGF1c2UoKSBhcGkgb2Ygd3JpdGVycyIpOwogCi0gICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKICAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CiAgICAgaW50MzJfdCBmZCA9CiAgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwpAQCAtMzM4LDggKzYwOSwxMCBAQAogICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKICAgICBjb25maWdGb3JtYXQgcGFyYW07CiAgICAgYm9vbCBpc0F1ZGlvOwotICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7Ci0gICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOwogICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CiAKICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKQEAgLTM0OCw4ICs2MjEsOCBAQAogCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUoKSAvIDQpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKICAgICBib29sIGlzUGF1c2VkID0gZmFsc2U7CkBAIC0zNTksMjYgKzYzMiwyNiBAQAogICAgICAgICBpc1BhdXNlZCA9IHRydWU7CiAgICAgfQogICAgIC8vIEluIHRoZSBwYXVzZSBzdGF0ZSwgd3JpdGVycyBzaG91bGRuJ3Qgd3JpdGUgYW55dGhpbmcuIFRlc3RpbmcgdGhlIHdyaXRlcnMgZm9yIHRoZSBzYW1lCi0gICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mby5zaXplKCkgLyA0OwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBudW1GcmFtZXNQYXVzZWQsIGlzUGF1c2VkKTsKKyAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbnVtRnJhbWVzUGF1c2VkLCBpc1BhdXNlZCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGlmIChpc1BhdXNlZCkgewogICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOwogICAgIH0KLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7Ci0gICAgbUN1cnJlbnRUcmFjay0+c3RvcCgpOworICAgIG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKIAogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKICAgICBjbG9zZShmZCk7CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBNdWx0aVN0YXJ0U3RvcFBhdXNlVGVzdCkgeworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIE11bHRpU3RhcnRTdG9wUGF1c2VUZXN0KSB7CiAgICAgLy8gVE9ETzogKGIvMTQ0ODIxODA0KQogICAgIC8vIEVuYWJsZSB0aGUgdGVzdCBmb3IgTVBFMlRTIHdyaXRlcgogICAgIGlmIChtRGlzYWJsZVRlc3QgfHwgbVdyaXRlck5hbWUgPT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHMlRTKSByZXR1cm47CkBAIC0zODksNyArNjYyLDcgQEAKICAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CiAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKIAotICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOwogICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OwogCkBAIC0zOTcsOCArNjcwLDEwIEBACiAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOwogICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKICAgICBib29sIGlzQXVkaW87Ci0gICAgaW50MzJfdCBpbnB1dEZpbGVJZHggPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucHV0RmlsZUlkeCk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CiAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOwpAQCAtNDE1LDggKzY5MCw4IEBACiAgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgfQogCi0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNCk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CkBAIC00MjUsMjAgKzcwMCwyMCBAQAogICAgIH0KIAogICAgIG1Xcml0ZXItPnBhdXNlKCk7Ci0gICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mby5zaXplKCkgLyA0OwotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG51bUZyYW1lc1BhdXNlZCwgdHJ1ZSk7CisgICAgaW50MzJfdCBudW1GcmFtZXNQYXVzZWQgPSBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG51bUZyYW1lc1BhdXNlZCwgdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CiAgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgfQogCi0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CiAKLSAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOwogCiAgICAgLy8gZmlyc3Qgc3RvcCBzaG91bGQgc3VjY2VlZC4KICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CkBAIC00NTEsMTkgKzcyNiwzODAgQEAKICAgICBjbG9zZShmZCk7CiB9CiAKK2NsYXNzIFdyaXRlclZhbGlkaXR5VGVzdAorICAgIDogcHVibGljIFdyaXRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyogd3JpdGVyRm9ybWF0Ki8sIGlucHV0SWQgLyogaW5wdXRJZDAqLywgYm9vbCAvKiBhZGRTb3VyY2VGYWlsKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwV3JpdGVyVHlwZShnZXQ8MD4oR2V0UGFyYW0oKSkpOyB9Cit9OworCitURVNUX1AoV3JpdGVyVmFsaWRpdHlUZXN0LCBJbnZhbGlkSW5wdXRUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJWYWxpZGF0ZXMgd3JpdGVyJ3MgYmVoYXZpb3IgZm9yIGludmFsaWQgaW5wdXRzIik7CisKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBhZGRTb3VyY2VGYWlsRXhwZWN0ZWQgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisKKyAgICAvLyBUZXN0IHdyaXRlcnMgZm9yIGludmFsaWQgRkQgdmFsdWUKKyAgICBpbnQzMl90IGZkID0gLTE7CisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR1YoImNyZWF0ZVdyaXRlciBmYWlsZWQgZm9yIGludmFsaWQgRkQsIHRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHdyaXRlciB3YXMgY3JlYXRlZCBmb3IgaW52YWxpZCBmZCwgdGVzdCBpdCBmdXJ0aGVyLgorICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBU1NFUlRfVFJVRShhZGRTb3VyY2VGYWlsRXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgICAgIEFMT0dWKCJhZGRXcml0ZXJTb3VyY2UgZmFpbGVkIGZvciBpbnZhbGlkIEZELCB0aGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzdGFydCB0aGUgd3JpdGVyIHdpdGggdmFsaWQgYXJndW1lbnQgYnV0IGludmFsaWQgRkQKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9ORSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIldyaXRlciBkaWQgbm90IGZhaWwgZm9yIGludmFsaWQgRkQiOworCisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpKTsKKyAgICBBU1NFUlRfTkUoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJXcml0ZXIgZGlkIG5vdCByZXBvcnQgZXJyb3IgZm9yIGludmFsaWQgRkQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworfQorCitURVNUX1AoV3JpdGVyVmFsaWRpdHlUZXN0LCBNYWxGb3JtZWREYXRhVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBFbmFibGUgdGVzdCBmb3IgT2dnIHdyaXRlcgorICAgIEFTU0VSVF9ORShtV3JpdGVyTmFtZSwgT0dHKSA8PCAiVE9ETyhiLzE2MDEwNTY0NikiOworICAgIEFMT0dWKCJUZXN0IHdyaXRlciBmb3IgbWFsZm9ybWVkIGlucHV0cyIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGJvb2wgYWRkU291cmNlRmFpbEV4cGVjdGVkID0gZ2V0PDI+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihPVVRQVVRfRklMRV9OQU1FLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgb3V0cHV0IGZvcm1hdCI7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICAvLyBSZW1vdmUgQ1NEIGRhdGEgZnJvbSBpbnB1dAorICAgIG1OdW1Dc2RzWzBdID0gMDsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoYWRkU291cmNlRmFpbEV4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIiOworICAgICAgICBBTE9HVigiJXMgd3JpdGVyIGZhaWxlZCB0byBhZGRTb3VyY2UgYWZ0ZXIgcmVtb3ZpbmcgQ1NEIGZyb20gaW5wdXQiLCB3cml0ZXJGb3JtYXQuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkNvdWxkIG5vdCBzdGFydCAiIDw8IHdyaXRlckZvcm1hdCA8PCAid3JpdGVyIjsKKworICAgIC8vIFNraXAgZmlyc3QgZmV3IGZyYW1lcy4gVGhlc2UgbWF5IGNvbnRhaW4gc3luYyBmcmFtZXMgYWxzby4KKyAgICBpbnQzMl90IGZyYW1lSUQgPSBtSW5wdXRGcmFtZUlkWzBdICsgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIGZyYW1lSUQsIG1DdXJyZW50VHJhY2tbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5kdW1wKGZkLCBhcmdzKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZHVtcCBzdGF0aXN0aWNzIGZyb20gd3JpdGVyIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgY2xvc2UoZmQpOworfQorCisvLyBUaGlzIHRlc3QgaXMgc3BlY2lmaWMgdG8gTVBFRzRXcml0ZXIgdG8gdGVzdCBtb3JlIEFQSXMKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBNcGVnNFdyaXRlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgaWYgKG1Xcml0ZXJOYW1lICE9IHN0YW5kYXJkV3JpdGVyczo6TVBFRzQpIHJldHVybjsKKyAgICBBTE9HVigiVGVzdCBNUEVHNCB3cml0ZXIgc3BlY2lmaWMgQVBJcyIpOworCisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgKHN0YXR1c190KU9LKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG1wZWc0IG91dHB1dCBmb3JtYXQiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgbXBlZzQgV3JpdGVyIjsKKworICAgIC8vIHNpZ25hbCBtZXRhIGRhdGEgZm9yIHRoZSB3cml0ZXIKKyAgICBzcDxNUEVHNFdyaXRlcj4gbXA0d3JpdGVyID0gc3RhdGljX2Nhc3Q8TVBFRzRXcml0ZXIgKj4obVdyaXRlci5nZXQoKSk7CisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRJbnRlcmxlYXZlRHVyYXRpb24oa0RlZmF1bHRJbnRlcmxlYXZlRHVyYXRpb24pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldEludGVybGVhdmVEdXJhdGlvbiBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbXA0d3JpdGVyLT5zZXRHZW9EYXRhKGtEZWZhdWx0TGF0aXR1ZGV4MTAwMDAsIGtEZWZhdWx0TG9uZ2l0dWRleDEwMDAwKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRHZW9EYXRhIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldENhcHR1cmVSYXRlKGtEZWZhdWx0RlBTKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJzZXRDYXB0dXJlUmF0ZSBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJDb3VsZCBub3Qgc3RhcnQgdGhlIHdyaXRlciI7CisKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIm1wZWc0IHdyaXRlciBmYWlsZWQiOworCisgICAgc3RhdHVzID0gbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CisgICAgbXA0d3JpdGVyLmNsZWFyKCk7CisgICAgY2xvc2UoZmQpOworfQorCitjbGFzcyBMaXN0ZW5lclRlc3QKKyAgICA6IHB1YmxpYyBXcml0ZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTwKKyAgICAgICAgICAgICAgc3RyaW5nIC8qIHdyaXRlckZvcm1hdCovLCBpbnB1dElkIC8qIGlucHV0SWQwKi8sIGlucHV0SWQgLyogaW5wdXRJZDEqLywKKyAgICAgICAgICAgICAgZmxvYXQgLyogRmlsZVNpemVMaW1pdCovLCBmbG9hdCAvKiBGaWxlRHVyYXRpb25MaW1pdCovLCBmbG9hdCAvKiBCdWZmZXJJbnRlcnZhbCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoZ2V0PDA+KEdldFBhcmFtKCkpKTsgfQorfTsKKworVEVTVF9QKExpc3RlbmVyVGVzdCwgU2V0TWF4RmlsZUxpbWl0c1Rlc3QpIHsKKyAgICAvLyBUT0RPKGIvMTUxODkyNDE0KTogRW5hYmxlIHRlc3QgZm9yIG90aGVyIHdyaXRlcnMKKyAgICBpZiAobURpc2FibGVUZXN0IHx8IG1Xcml0ZXJOYW1lICE9IE1QRUc0KSByZXR1cm47CisgICAgQUxPR1YoIlZhbGlkYXRlcyB3cml0ZXIgd2hlbiBtYXggZmlsZSBsaW1pdHMgYXJlIHNldCIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCB3cml0ZXJGb3JtYXQ7CisKKyAgICBpbnB1dElkIGlucElkW10gPSB7Z2V0PDE+KEdldFBhcmFtKCkpLCBnZXQ8Mj4oR2V0UGFyYW0oKSl9OworICAgIEFTU0VSVF9ORShpbnBJZFswXSwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBzaXplX3QgaW5wdXRGaWxlU2l6ZSA9IDA7CisgICAgaW50NjRfdCBsYXN0RnJhbWVUaW1lU3RhbXBVcyA9IElOVF9NQVg7CisgICAgaW50MzJfdCBudW1UcmFja3MgPSAxOworICAgIGlmIChpbnBJZFsxXSAhPSBVTlVTRURfSUQpIHsKKyAgICAgICAgbnVtVHJhY2tzKys7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgICAgIGJvb2wgaXNBdWRpbzsKKyAgICAgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8sIGlkeCkpOworICAgICAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0sIGlkeCk7CisgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKworICAgICAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKKworICAgICAgICBpbnB1dEZpbGVTaXplICs9IGJ1Zi5zdF9zaXplOworICAgICAgICBpZiAobGFzdEZyYW1lVGltZVN0YW1wVXMgPiBtQnVmZmVySW5mb1tpZHhdW21CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpIC0gMV0udGltZVVzKSB7CisgICAgICAgICAgICBsYXN0RnJhbWVUaW1lU3RhbXBVcyA9IG1CdWZmZXJJbmZvW2lkeF1bbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgLSAxXS50aW1lVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBmaWxlU2l6ZUxpbWl0ID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGZsb2F0IGZpbGVEdXJhdGlvbkxpbWl0ID0gZ2V0PDQ+KEdldFBhcmFtKCkpOworICAgIGludDY0X3QgbWF4RmlsZVNpemUgPSAwOworICAgIGludDY0X3QgbWF4RmlsZUR1cmF0aW9uID0gMDsKKyAgICBpZiAoZmlsZVNpemVMaW1pdCA+IDApIHsKKyAgICAgICAgbWF4RmlsZVNpemUgPSAoaW50NjRfdCkoZmlsZVNpemVMaW1pdCAqIGlucHV0RmlsZVNpemUpOworICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlU2l6ZShtYXhGaWxlU2l6ZSk7CisgICAgfQorICAgIGlmIChmaWxlRHVyYXRpb25MaW1pdCA+IDApIHsKKyAgICAgICAgbWF4RmlsZUR1cmF0aW9uID0gKGludDY0X3QpKGZpbGVEdXJhdGlvbkxpbWl0ICogbGFzdEZyYW1lVGltZVN0YW1wVXMpOworICAgICAgICBtV3JpdGVyLT5zZXRNYXhGaWxlRHVyYXRpb24obWF4RmlsZUR1cmF0aW9uKTsKKyAgICB9CisKKyAgICBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgV3JpdGVyTGlzdGVuZXIoKTsKKyAgICBBU1NFUlRfTkUobGlzdGVuZXIsIG51bGxwdHIpIDw8ICJ1bmFibGUgdG8gYWxsb2NhdGUgbGlzdGVuZXIiOworCisgICAgbVdyaXRlci0+c2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKKworICAgIGZsb2F0IGludGVydmFsID0gZ2V0PDU+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9MRShpbnRlcnZhbCwgMS4wZikgPDwgIkJ1ZmZlciBpbnRlcnZhbCBpbnZhbGlkLiBTaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEuMCI7CisKKyAgICBzaXplX3QgcmFuZ2UgPSAwOworICAgIGludDMyX3QgbG9vcENvdW50ID0gMDsKKyAgICBpbnQzMl90IG9mZnNldFtrTWF4VHJhY2tDb3VudF17fTsKKyAgICB3aGlsZSAobG9vcENvdW50IDwgY2VpbCgxLjAgLyBpbnRlcnZhbCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgICAgIHJhbmdlID0gbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgKiBpbnRlcnZhbDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtW2lkeF0sIG1CdWZmZXJJbmZvW2lkeF0sIG1JbnB1dEZyYW1lSWRbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLCBvZmZzZXRbaWR4XSwgcmFuZ2UsIGZhbHNlLCBsaXN0ZW5lcik7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgICAgICAgICAgb2Zmc2V0W2lkeF0gKz0gcmFuZ2U7CisgICAgICAgIH0KKyAgICAgICAgbG9vcENvdW50Kys7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUobVdyaXRlci0+cmVhY2hlZEVPUygpKSA8PCAiRU9TIG5vdCBzaWduYWxsZWQuIjsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgaWR4KyspIHsKKyAgICAgICAgaWYgKG1DdXJyZW50VHJhY2tbaWR4XSkgeworICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CisgICAgY2xvc2UoZmQpOworCisgICAgaWYgKG1heEZpbGVTaXplIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSBpZiAobWF4RmlsZVNpemUgPiAwICYmIG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA+IDAgJiYgbWF4RmlsZVNpemUgPD0gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplIHx8IGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbik7CisgICAgfQorCisgICAgaWYgKG1heEZpbGVTaXplID4gMCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQob3V0cHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9MRShidWYuc3Rfc2l6ZSwgbWF4RmlsZVNpemUpOworICAgIH0KK30KKworLy8gVE9ETzogKGIvMTUwOTIzMzg3KQorLy8gQWRkIFdFQk0gaW5wdXQKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChMaXN0ZW5lclRlc3RBbGwsIExpc3RlbmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJhYWMiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjYsIDAuNywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgVU5VU0VEX0lELCAwLjIsIDAuNiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yd2IiLCBBTVJfV0JfMSwgVU5VU0VEX0lELCAwLjUsIDAuNSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJUcyIsIEFBQ18xLCBVTlVTRURfSUQsIDAuMiwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjQsIDAuMywgMC4yNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAwLjMsIDEsIDAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgT1BVU18xLCBVTlVTRURfSUQsIDAuNywgMC4zLCAxKSkpOworCiAvLyBUT0RPOiAoYi8xNDQ0NzYxNjQpCiAvLyBBZGQgQUFDX0FEVFMsIEZMQUMsIEFWMSBpbnB1dAotSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFdyaXRlclRlc3RBbGwsIFdyaXRlclRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJvZ2ciLCAwKSwgbWFrZV9wYWlyKCJ3ZWJtIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhYWMiLCAxKSwgbWFrZV9wYWlyKCJtcGVnNCIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1ybmIiLCAzKSwgbWFrZV9wYWlyKCJhbXJ3YiIsIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2VibSIsIDUpLCBtYWtlX3BhaXIoIndlYm0iLCA3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndlYm0iLCA4KSwgbWFrZV9wYWlyKCJtcGVnNCIsIDkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMCksIG1ha2VfcGFpcigibXBlZzQiLCAxMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIDEzKSwgbWFrZV9wYWlyKCJtcGVnMlRzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMlRzIiwgOSkpKTsKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgV3JpdGVyVGVzdEFsbCwgV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJuYiIsIEFNUl9OQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMSksCisKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTQ0OTAyMDE4KTogRW5hYmxlIHRlc3QgZm9yIG1wZWcydHMKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQUFDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFWQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNTYzNTU4NTcpOiBBZGQgbXVsdGl0cmFjayBmb3IgbXBlZzJ0cworICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgQVZDXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBVkNfMSwgQUFDXzEsIDAuMjUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9OQl8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX1dCXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFSUNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFVkNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgQVZDXzEsIDAuMjUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIEFBQ18xLCAwLjc1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFNUl9XQl8xLCBBQUNfMSwgMC43NSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIEFNUl9XQl8xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgQU1SX05CXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgQUFDXzEsIDAuNzUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX05CXzEsIEFNUl9XQl8xLCAwLjI1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgQU1SX05CXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgSEVWQ18xLCAwLjc1KSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgVU5VU0VEX0lELCAxKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBPUFVTXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDhfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA5XzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOF8xLCBPUFVTXzEsIDAuNTApLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgVlA4XzEsIDAuMjUpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgV3JpdGVyVmFsaWRpdHlUZXN0LCBXcml0ZXJWYWxpZGl0eVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFhYyIsIEFBQ18xLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcm5iIiwgQU1SX05CXzEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgQU1SX1dCXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBQUNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX05CXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFWQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIMjYzXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFSUNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVWQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBmYWxzZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCBPUFVTXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIE9QVVNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWT1JCSVNfMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOF8xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOV8xLCBmYWxzZSkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwogICAgIGdFbnYgPSBuZXcgV3JpdGVyVGVzdEVudmlyb25tZW50KCk7CiAgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKaW5kZXggOTllNjg2Zi4uN2RhMGE2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMjUsNyArMjUsNyBAQAogCiBjbGFzcyBXcml0ZXJUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CiAgIHB1YmxpYzoKLSAgICBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisgICAgV3JpdGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSwgZGVsZXRlT3V0cHV0KHRydWUpIHt9CiAKICAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CkBAIC0zNCwxNiArMzQsMjEgQEAKIAogICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KIAorICAgIGJvb2wgY2xlYW5VcCgpIGNvbnN0IHsgcmV0dXJuIGRlbGV0ZU91dHB1dDsgfQorCiAgIHByaXZhdGU6CiAgICAgc3RyaW5nIHJlczsKKyAgICBib29sIGRlbGV0ZU91dHB1dDsKIH07CiAKIGludCBXcml0ZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKLSAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJjbGVhblVwIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdDJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwfX07CiAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6QzoiLCBvcHRpb25zLCAmaW5kZXgpOwogICAgICAgICBpZiAoYyA9PSAtMSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTUyLDYgKzU3LDExIEBACiAgICAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlT3V0cHV0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNjIsNyArNzIsOCBAQAogICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCiAgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgogICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCi0gICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iCisgICAgICAgICAgICAgICAgIi1DLCBkZWZhdWx0OnRydWUuIERlbGV0ZSBvdXRwdXQgZmlsZSBhZnRlciB0ZXN0IGNvbXBsZXRlc1xuIiwKICAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CiAgICAgICAgIHJldHVybiAyOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcAppbmRleCBmMjRjY2I2Li5hMzA0M2ZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCkBAIC0yNCw5ICsyNCwxNiBAQAogCiBpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkLCBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIpIHsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoaW5wdXRGcmFtZUlkID49IChpbnQpYnVmZmVySW5mby5zaXplKCkgfHwgaW5wdXRGcmFtZUlkID49IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbiB8fCBsaXN0ZW5lci0+bVNpZ25hbGVkU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJNYXggRmlsZSBsaW1pdCByZWFjaGVkLiBObyBtb3JlIGJ1ZmZlcnMgd2lsbCBiZSBzZW50IHRvIHRoZSB3cml0ZXIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3Qgc2l6ZSA9IGJ1ZmZlckluZm9baW5wdXRGcmFtZUlkXS5zaXplOwogICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CiAgICAgICAgIGlmICghZGF0YSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKaW5kZXggY2RkNjI0Ni4uNmI0NTZmYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCkBAIC0yNywxMyArMjcsMTkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQWRhcHRlci5oPgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CisjaW5jbHVkZSAiV3JpdGVyTGlzdGVuZXIuaCIKIAogI2RlZmluZSBDT0RFQ19DT05GSUdfRkxBRyAzMgogCitjb25zdGV4cHIgdWludDMyX3Qga01heFRyYWNrQ291bnQgPSAyOwogY29uc3RleHByIHVpbnQzMl90IGtNYXhDU0RTdHJsZW4gPSAxNjsKIGNvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q291bnQgPSAyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW1lU2l6ZSA9IDEyODsKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0SW50ZXJsZWF2ZUR1cmF0aW9uID0gMDsKKy8vIEdlb2RhdGEgaXMgc2V0IGFjY29yZGluZyB0byBJU08tNjcwOSBzdGFuZGFyZC4KK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TGF0aXR1ZGV4MTAwMDAgPSA1MDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrRGVmYXVsdExvbmdpdHVkZXgxMDAwMCA9IDEwMDAwMDA7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRGUFMgPSAzMC4wZjsKIAogc3RydWN0IEJ1ZmZlckluZm8gewogICAgIGludDMyX3Qgc2l6ZTsKQEAgLTQxLDkgKzQ3LDE4IEBACiAgICAgaW50NjRfdCB0aW1lVXM7CiB9OwogCitzdHJ1Y3QgY29uZmlnRm9ybWF0IHsKKyAgICBjaGFyIG1pbWVba01pbWVTaXplXTsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK307CisKIGludDMyX3Qgc2VuZEJ1ZmZlcnNUb1dyaXRlcihpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZpbnB1dEZyYW1lSWQsIHNwPE1lZGlhQWRhcHRlcj4gJmN1cnJlbnRUcmFjaywgaW50MzJfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8V3JpdGVyTGlzdGVuZXI+IGxpc3RlbmVyID0gbnVsbHB0cik7CiAKIGludDMyX3Qgd3JpdGVIZWFkZXJCdWZmZXJzKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCBudW1Dc2RzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKaW5kZXggNGY0Y2ViMS4uNjU5MGVmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwyMiBAQAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dF9saWNlbnNlIiwKKyAgICBdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90aW1lZHRleHRfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAogCkBAIC0yMiw1ICs0MSwzIEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVEVTVF9NQVBQSU5HCmluZGV4IDE4NWY4MjQuLjM1YTViMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RFU1RfTUFQUElORwpAQCAtMSw3ICsxLDkgQEAKIC8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dAogewotICAicHJlc3VibWl0IjogWwotICAgIC8vIFRPRE8oYi8xNDgwOTQwNTkpOiB1bml0IHRlc3RzIG5vdCBhbGxvd2VkIHRvIGRvd25sb2FkIGNvbnRlbnQKLSAgICAvL3sgIm5hbWUiOiAiVGltZWRUZXh0VW5pdFRlc3QiIH0KKyAgLy8gdGVzdHMgd2hpY2ggcmVxdWlyZSBkeW5hbWljIGNvbnRlbnQKKyAgLy8gaW52b2tlIHdpdGg6IGF0ZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKKyAgLy8gVE9ETyhiLzE0ODA5NDA1OSk6IHVuaXQgdGVzdHMgbm90IGFsbG93ZWQgdG8gZG93bmxvYWQgY29udGVudAorICAiZHluYW1pYy1wcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJUaW1lZFRleHRVbml0VGVzdCIgfQogICBdCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYzMmJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF90aW1lZHRleHRfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlRpbWVkVGV4dFVuaXRUZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlRpbWVkVGV4dFVuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NTRlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIFRpbWVkVGV4dCB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3NzRiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgVGltZWRUZXh0IFVuaXQgVGVzdCA6CitUaGUgVGltZWRUZXh0IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIFRleHREZXNjcmlwdGlvbiBjbGFzcyBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIFRpbWVkVGV4dFVuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvVGltZWRUZXh0VW5pdFRlc3QvVGltZWRUZXh0VW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC56aXApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIFRpbWVkVGV4dFVuaXRUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBUaW1lZFRleHRVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IFRpbWVkVGV4dFVuaXRUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI4MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgVGltZWRUZXh0VGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgVGltZWRUZXh0VGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1RJTUVEVEVYVF9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWFlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRpbWVkVGV4dFVuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKworI2luY2x1ZGUgInRpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgiCisKKyNpbmNsdWRlICJUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIGludDMyX3Qga1N0YXJ0VGltZU1zID0gMTAwMDA7CisKK2VudW0geworICAgIC8vIFRoZXNlIGtleXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIGtleXMgaW4KKyAgICAvLyBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmgKKyAgICBLRVlfRElTUExBWV9GTEFHUyA9IDEsCisgICAgS0VZX1NUWUxFX0ZMQUdTID0gMiwKKyAgICBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBID0gMywKKyAgICBLRVlfSElHSExJR0hUX0NPTE9SX1JHQkEgPSA0LAorICAgIEtFWV9TQ1JPTExfREVMQVkgPSA1LAorICAgIEtFWV9XUkFQX1RFWFQgPSA2LAorICAgIEtFWV9TVEFSVF9USU1FID0gNywKKyAgICBLRVlfU1RSVUNUX0JMSU5LSU5HX1RFWFRfTElTVCA9IDgsCisgICAgS0VZX1NUUlVDVF9GT05UX0xJU1QgPSA5LAorICAgIEtFWV9TVFJVQ1RfSElHSExJR0hUX0xJU1QgPSAxMCwKKyAgICBLRVlfU1RSVUNUX0hZUEVSX1RFWFRfTElTVCA9IDExLAorICAgIEtFWV9TVFJVQ1RfS0FSQU9LRV9MSVNUID0gMTIsCisgICAgS0VZX1NUUlVDVF9TVFlMRV9MSVNUID0gMTMsCisgICAgS0VZX1NUUlVDVF9URVhUX1BPUyA9IDE0LAorICAgIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTiA9IDE1LAorICAgIEtFWV9TVFJVQ1RfVEVYVCA9IDE2LAorCisgICAgS0VZX0dMT0JBTF9TRVRUSU5HID0gMTAxLAorICAgIEtFWV9MT0NBTF9TRVRUSU5HID0gMTAyLAorICAgIEtFWV9TVEFSVF9DSEFSID0gMTAzLAorICAgIEtFWV9FTkRfQ0hBUiA9IDEwNCwKKyAgICBLRVlfRk9OVF9JRCA9IDEwNSwKKyAgICBLRVlfRk9OVF9TSVpFID0gMTA2LAorICAgIEtFWV9URVhUX0NPTE9SX1JHQkEgPSAxMDcsCit9OworCitzdHJ1Y3QgRm9udEluZm8geworICAgIGludDMyX3QgZGlzcGxheUZsYWcgPSAtMTsKKyAgICBpbnQzMl90IGhvcml6b250YWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCB2ZXJ0aWNhbEp1c3RpZmljYXRpb24gPSAtMTsKKyAgICBpbnQzMl90IHJnYmFCYWNrZ3JvdW5kID0gLTE7CisgICAgaW50MzJfdCBsZWZ0UG9zID0gLTE7CisgICAgaW50MzJfdCB0b3BQb3MgPSAtMTsKKyAgICBpbnQzMl90IGJvdHRvbVBvcyA9IC0xOworICAgIGludDMyX3QgcmlnaHRQb3MgPSAtMTsKKyAgICBpbnQzMl90IHN0YXJ0Y2hhciA9IC0xOworICAgIGludDMyX3QgZW5kQ2hhciA9IC0xOworICAgIGludDMyX3QgZm9udElkID0gLTE7CisgICAgaW50MzJfdCBmYWNlU3R5bGUgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRTaXplID0gLTE7CisgICAgaW50MzJfdCByZ2JhVGV4dCA9IC0xOworICAgIGludDMyX3QgZW50cnlDb3VudCA9IC0xOworfTsKKworc3RydWN0IEZvbnRSZWNvcmQgeworICAgIGludDMyX3QgZm9udElEID0gLTE7CisgICAgaW50MzJfdCBmb250TmFtZUxlbmd0aCA9IC0xOworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQgPSBudWxscHRyOworfTsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBUaW1lZFRleHRVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08LypmaWxlbmFtZSovIHN0cmluZz4geworICBwdWJsaWM6CisgICAgVGltZWRUZXh0VW5pdFRlc3QoKXt9OworCisgICAgflRpbWVkVGV4dFVuaXRUZXN0KCkgeworICAgICAgICBpZiAobUVsZVN0cmVhbSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisgICAgICAgIG1FbGVTdHJlYW0ub3BlbihtSW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgR2V0UGFyYW0oKTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXQobUlucHV0RmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHByb3BlcnRpZXMgb2YgaW5wdXQgZmlsZTogIiA8PCBHZXRQYXJhbSgpOworICAgICAgICBtRmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgQUxPR0koIlNpemUgb2YgdGhlIGlucHV0IGZpbGUgJXMgPSAlenUiLCBHZXRQYXJhbSgpLmNfc3RyKCksIG1GaWxlU2l6ZSk7CisgICAgfQorCisgICAgc3RyaW5nIG1JbnB1dEZpbGVOYW1lOworICAgIHNpemVfdCBtRmlsZVNpemU7CisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKK307CisKK2NsYXNzIFNSVERlc2NyaXB0aW9uVGVzdCA6IHB1YmxpYyBUaW1lZFRleHRVbml0VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IFRpbWVkVGV4dFVuaXRUZXN0OjpTZXRVcCgpOyB9Cit9OworCitjbGFzcyBUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCA6IHB1YmxpYyBUaW1lZFRleHRVbml0VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IFRpbWVkVGV4dFVuaXRUZXN0OjpTZXRVcCgpOyB9Cit9OworCitURVNUX1AoU1JURGVzY3JpcHRpb25UZXN0LCBleHRyYWN0U1JURGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6Ok9VVF9PRl9CQU5EX1RFWFRfU1JUIHwgVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0xPQ0FMX1NFVFRJTkcpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RBUlRfVElNRSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBzdGFydCB0aW1lIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwga1N0YXJ0VGltZU1zKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHRpbWluZ3MiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfVEVYVCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBzdHJ1Y3QgdGV4dCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIG1GaWxlU2l6ZSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0ZXh0IGRhdGEiOworICAgIGludDMyX3QgZmlsZVNpemUgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGZpbGVTaXplLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgZmlsZSBzaXplIHZhbHVlIjsKKyAgICB1aW50OF90IHRtcERhdGFbZmlsZVNpemVdOworICAgIHN0YXR1cyA9IHBhcmNlbC5yZWFkKCh2b2lkICopdG1wRGF0YSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJGYWlsZWQgdG8gcmVhZCB0aGUgZGF0YSBmcm9tIHBhcmNlbCI7CisgICAgLy8gVG8gbWFrZSBzdXJlIGVuZCBvZiBwYXJjZWwgaXMgcmVhY2hlZAorICAgIEFTU0VSVF9FUShwYXJjZWwuZGF0YUF2YWlsKCksIDApIDw8ICJQYXJjZWwgaGFzIHNvbWUgZGF0YSBsZWZ0IHRvIHJlYWQiOworfQorCisvLyBUaGlzIHRlc3QgdXNlcyB0aGUgcHJvcGVydGllcyBvZiB0eDNnIGJveCBtZW50aW9uZWQgaW4gM0dQUCBUaW1lZCBUZXh0IEZvcm1hdAorLy8gU3BlY2lmaWNhdGlvbiM6IDI2LjI0NSAvIFNlY3Rpb246IDUuMTYoU2FtcGxlIERlc2NyaXB0aW9uIEZvcm1hdCkKKy8vIGh0dHBzOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzI2X3Nlcmllcy8yNi4yNDUvCisKK1RFU1RfUChUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCwgVGV4dDNHUFBHbG9iYWxEZXNjcmlwdGlvblRlc3QpIHsKKyAgICBjaGFyIGRhdGFbbUZpbGVTaXplXTsKKyAgICBtRWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5nY291bnQoKSwgbUZpbGVTaXplKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgaW50MzJfdCByZW1haW5pbmcgPSBtRmlsZVNpemU7CisgICAgRm9udEluZm8gZm9udEluZm87CisgICAgdmVjdG9yPEZvbnRSZWNvcmQ+IGZvbnRSZWNvcmRFbnRyaWVzOworCisgICAgLy8gU2tpcHBpbmcgdGhlIGJ5dGVzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2Ygc3ViYm94KHR4M2cpCisgICAgdG1wRGF0YSArPSAxNjsKKyAgICByZW1haW5pbmcgLT0gMTY7CisKKyAgICBmb250SW5mby5kaXNwbGF5RmxhZyA9IFUzMl9BVCh0bXBEYXRhKTsKKyAgICBBTE9HSSgiRGlzcGxheSBmbGFnOiAlZCIsIGZvbnRJbmZvLmRpc3BsYXlGbGFnKTsKKyAgICBmb250SW5mby5ob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNF07CisgICAgQUxPR0koIkhvcml6b250YWwgSnVzdGlmaWNhdGlvbjogJWQiLCBmb250SW5mby5ob3Jpem9udGFsSnVzdGlmaWNhdGlvbik7CisgICAgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uID0gdG1wRGF0YVs1XTsKKyAgICBBTE9HSSgiVmVydGljYWwgSnVzdGlmaWNhdGlvbjogJWQiLCBmb250SW5mby52ZXJ0aWNhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnJnYmFCYWNrZ3JvdW5kID0KKyAgICAgICAgICAgICoodG1wRGF0YSArIDYpIDw8IDI0IHwgKih0bXBEYXRhICsgNykgPDwgMTYgfCAqKHRtcERhdGEgKyA4KSA8PCA4IHwgKih0bXBEYXRhICsgOSk7CisgICAgQUxPR0koInJnYmEgdmFsdWUgb2YgYmFja2dyb3VuZDogJWQiLCBmb250SW5mby5yZ2JhQmFja2dyb3VuZCk7CisKKyAgICB0bXBEYXRhICs9IDEwOworICAgIHJlbWFpbmluZyAtPSAxMDsKKworICAgIGlmIChyZW1haW5pbmcgPj0gOCkgeworICAgICAgICBmb250SW5mby5sZWZ0UG9zID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICBBTE9HSSgiTGVmdDogJWQiLCBmb250SW5mby5sZWZ0UG9zKTsKKyAgICAgICAgZm9udEluZm8udG9wUG9zID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgQUxPR0koIlRvcDogJWQiLCBmb250SW5mby50b3BQb3MpOworICAgICAgICBmb250SW5mby5ib3R0b21Qb3MgPSBVMTZfQVQodG1wRGF0YSArIDQpOworICAgICAgICBBTE9HSSgiQm90dG9tOiAlZCIsIGZvbnRJbmZvLmJvdHRvbVBvcyk7CisgICAgICAgIGZvbnRJbmZvLnJpZ2h0UG9zID0gVTE2X0FUKHRtcERhdGEgKyA2KTsKKyAgICAgICAgQUxPR0koIlJpZ2h0OiAlZCIsIGZvbnRJbmZvLnJpZ2h0UG9zKTsKKworICAgICAgICB0bXBEYXRhICs9IDg7CisgICAgICAgIHJlbWFpbmluZyAtPSA4OworCisgICAgICAgIGlmIChyZW1haW5pbmcgPj0gMTIpIHsKKyAgICAgICAgICAgIGZvbnRJbmZvLnN0YXJ0Y2hhciA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgICAgIEFMT0dJKCJTdGFydCBjaGFyYWN0ZXI6ICVkIiwgZm9udEluZm8uc3RhcnRjaGFyKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmVuZENoYXIgPSBVMTZfQVQodG1wRGF0YSArIDIpOworICAgICAgICAgICAgQUxPR0koIkVuZCBjaGFyYWN0ZXI6ICVkIiwgZm9udEluZm8uZW5kQ2hhcik7CisgICAgICAgICAgICBmb250SW5mby5mb250SWQgPSBVMTZfQVQodG1wRGF0YSArIDQpOworICAgICAgICAgICAgQUxPR0koIlZhbHVlIG9mIGZvbnQgSWRlbnRpZmllcjogJWQiLCBmb250SW5mby5mb250SWQpOworICAgICAgICAgICAgZm9udEluZm8uZmFjZVN0eWxlID0gKih0bXBEYXRhICsgNik7CisgICAgICAgICAgICBBTE9HSSgiRmFjZSBzdHlsZSBmbGFnIDogJWQiLCBmb250SW5mby5mYWNlU3R5bGUpOworICAgICAgICAgICAgZm9udEluZm8uZm9udFNpemUgPSAqKHRtcERhdGEgKyA3KTsKKyAgICAgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBmb250OiAlZCIsIGZvbnRJbmZvLmZvbnRTaXplKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLnJnYmFUZXh0ID0gKih0bXBEYXRhICsgOCkgPDwgMjQgfCAqKHRtcERhdGEgKyA5KSA8PCAxNiB8ICoodG1wRGF0YSArIDEwKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0bXBEYXRhICsgMTEpOworICAgICAgICAgICAgQUxPR0koInJnYmEgdmFsdWUgb2YgdGhlIHRleHQ6ICVkIiwgZm9udEluZm8ucmdiYVRleHQpOworCisgICAgICAgICAgICB0bXBEYXRhICs9IDEyOworICAgICAgICAgICAgcmVtYWluaW5nIC09IDEyOworCisgICAgICAgICAgICBpZiAocmVtYWluaW5nID49IDEwKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcHBpbmcgdGhlIGJ5dGVzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2Ygc3ViYm94KGZ0YWIpCisgICAgICAgICAgICAgICAgZm9udEluZm8uZW50cnlDb3VudCA9IFUxNl9BVCh0bXBEYXRhICsgOCk7CisgICAgICAgICAgICAgICAgQUxPR0koIlZhbHVlIG9mIGVudHJ5IGNvdW50OiAlZCIsIGZvbnRJbmZvLmVudHJ5Q291bnQpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxMDsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmb250SW5mby5lbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRlbXBGb250SUQgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJGb250IElkOiAlZCIsIHRlbXBGb250SUQpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRlbXBGb250TmFtZUxlbmd0aCA9ICoodG1wRGF0YSArIDIpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiTGVuZ3RoIG9mIGZvbnQgbmFtZTogJWQiLCB0ZW1wRm9udE5hbWVMZW5ndGgpOworCisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IHRlbXBGb250TmFtZUxlbmd0aCkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcEZvbnQgPSB0bXBEYXRhOworICAgICAgICAgICAgICAgICAgICBjaGFyICp0bXBGb250TmFtZSA9IHN0cm5kdXAoKGNvbnN0IGNoYXIgKil0bXBGb250LCB0ZW1wRm9udE5hbWVMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTkUodG1wRm9udE5hbWUsIG51bGxwdHIpIDw8ICJGb250IE5hbWUgaXMgbnVsbCI7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJGb250TmFtZSA9ICVzIiwgdG1wRm9udE5hbWUpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wRGF0YSArPSB0ZW1wRm9udE5hbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSB0ZW1wRm9udE5hbWVMZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGZvbnRSZWNvcmRFbnRyaWVzLnB1c2hfYmFjayh7dGVtcEZvbnRJRCwgdGVtcEZvbnROYW1lTGVuZ3RoLCB0bXBGb250fSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUCB8IFRleHREZXNjcmlwdGlvbnM6OkdMT0JBTF9ERVNDUklQVElPTlM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBtRmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZywga1N0YXJ0VGltZU1zLCAmcGFyY2VsKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiZ2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMgcmV0dXJuZWQgZXJyb3IiOworICAgIEFMT0dJKCJTaXplIG9mIHRoZSBQYXJjZWw6ICV6dSIsIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICBBU1NFUlRfR1QocGFyY2VsLmRhdGFTaXplKCksIDApIDw8ICJQYXJjZWwgaXMgZW1wdHkiOworCisgICAgcGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBpbnQzMl90IGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfR0xPQkFMX1NFVFRJTkcpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRElTUExBWV9GTEFHUykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBESVNQTEFZIEZMQUdTIEtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZGlzcGxheUZsYWcpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGRpc3BsYXkgZmxhZyI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9KVVNUSUZJQ0FUSU9OKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBKVVNUSUZJQ0FUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIEhvcml6b250YWwganVzdGlmaWNhdGlvbiI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBWZXJ0aWNhbCBqdXN0aWZpY2F0aW9uIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEJBQ0tHUk9VTkQgQ09MT1Iga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhQmFja2dyb3VuZCkKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKworICAgIGlmIChwYXJjZWwuZGF0YUF2YWlsKCkgPT0gMCkgeworICAgICAgICBBTE9HVigiQ29tcGxldGVkIHJlYWRpbmcgdGhlIHBhcmNlbCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfVEVYVF9QT1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIFRFWFQgUE9TSVRJT04ga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5sZWZ0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnRvcFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5ib3R0b21Qb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmlnaHRQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1NUWUxFX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIFNUWUxFIExJU1Qga2V5IjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RBUlRfQ0hBUikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVEFSVCBDSEFSIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uc3RhcnRjaGFyKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBzdGFydCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9FTkRfQ0hBUikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBFTkQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVuZENoYXIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW5kIGNoYXJhY3RlciI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0ZPTlRfSUQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRk9OVCBJRCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRJZCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBmb250IElkIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RZTEVfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RZTEUgRkxBR1Mga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mYWNlU3R5bGUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3R5bGUgZmxhZ3MiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX1NJWkUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRk9OVCBTSVpFIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZm9udFNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBzaXplIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfVEVYVF9DT0xPUl9SR0JBKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFRFWFQgQ09MT1IgUkdCQSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJnYmFUZXh0KSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgdGV4dCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX0ZPTlRfTElTVCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgRk9OVCBMSVNUIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZW50cnlDb3VudCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBlbnRyeSBjb3VudCI7CisgICAgQVNTRVJUX0VRKGZvbnRJbmZvLmVudHJ5Q291bnQsIGZvbnRSZWNvcmRFbnRyaWVzLnNpemUoKSkKKyAgICAgICAgICAgIDw8ICJBcnJheSBzaXplIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBmb250SW5mby5lbnRyeUNvdW50OyBpKyspIHsKKyAgICAgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udFJlY29yZEVudHJpZXNbaV0uZm9udElEKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBuYW1lIGxlbmd0aCI7CisgICAgICAgIHVpbnQ4X3QgZm9udE5hbWVbZm9udFJlY29yZEVudHJpZXNbaV0uZm9udE5hbWVMZW5ndGhdOworICAgICAgICAvLyB3cml0dGVuIHdpdGggd3JpdGVCeXRlQXJyYXkoKSB3cml0ZXMgY291bnQsIHRoZW4gdGhlIGFjdHVhbCBkYXRhCisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgc3RhdHVzID0gcGFyY2VsLnJlYWQoKHZvaWQgKilmb250TmFtZSwgZm9udFJlY29yZEVudHJpZXNbaV0uZm9udE5hbWVMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGZvbnQgbmFtZSBmcm9tIHBhcmNlbCI7CisgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnQsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgIDApCisgICAgICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBmb250IjsKKyAgICB9CisgICAgLy8gVG8gbWFrZSBzdXJlIGVuZCBvZiBwYXJjZWwgaXMgcmVhY2hlZAorICAgIEFTU0VSVF9FUShwYXJjZWwuZGF0YUF2YWlsKCksIDApIDw8ICJQYXJjZWwgaGFzIHNvbWUgZGF0YSBsZWZ0IHRvIHJlYWQiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoVGltZWRUZXh0VW5pdFRlc3RBbGwsIFNSVERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInNhbXBsZVRlc3QxLnNydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2FtcGxlVGVzdDIuc3J0IikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInR4M2dCb3gxIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0eDNnQm94MiIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgVGltZWRUZXh0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAyY2ViZThmLi4zMmEyMmJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKIApAQCAtMzEsNiArNDAsNyBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDUxODNhNDkuLjQ0NDM3NjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJXZWJtRnJhbWVUaHJlYWRVbml0VGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNiODg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAid3JpdGVyLWZ1enplcmJhc2UtZGVmYXVsdHMiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJ3cml0ZXItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJ3cml0ZXItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ3cml0ZXJmdXp6ZXJiYXNlIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJ3cml0ZXJmdXp6ZXJiYXNlIiwKKyAgICBkZWZhdWx0czogWyJ3cml0ZXItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIldyaXRlckZ1enplckJhc2UuY3BwIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1ybmJfd3JpdGVyX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsid3JpdGVyLWZ1enplci1kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFtcl93cml0ZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQU1STkIiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJ3Yl93cml0ZXJfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJ3cml0ZXItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYW1yX3dyaXRlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lIDogIm1wZWc0X3dyaXRlcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzIDogWyJ3cml0ZXItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgc3JjcyA6IFsKKyAgICAgICAgIm1wZWc0X3dyaXRlcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lIDogIm9nZ193cml0ZXJfZnV6emVyIiwKKyAgICBkZWZhdWx0cyA6IFsid3JpdGVyLWZ1enplci1kZWZhdWx0cyJdLAorICAgIHNyY3MgOiBbCisgICAgICAgICJvZ2dfd3JpdGVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm9nZyIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZSA6ICJ3ZWJtX3dyaXRlcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzIDogWyJ3cml0ZXItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgc3JjcyA6IFsKKyAgICAgICAgIndlYm1fd3JpdGVyX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5NWVjYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL1JFQURNRS5tZApAQCAtMCwwICsxLDEwMCBAQAorIyBGdXp6ZXIgZm9yIHdyaXRlcnMKKworIyMgVGFibGUgb2YgY29udGVudHMKKysgIFtsaWJ3cml0ZXJmdXp6ZXJiYXNlXSgjV3JpdGVyRnV6emVyQmFzZSkKKysgIFtBbXIgV3JpdGVyXSgjYW1yV3JpdGVyRnV6emVyKQorKyAgW01QRUc0IFdyaXRlcl0oI21wZWc0V3JpdGVyRnV6emVyKQorKyAgW09HRyBXcml0ZXJdKCNvZ2dXcml0ZXJGdXp6ZXIpCisrICBbV0VCTSBXcml0ZXJdKCN3ZWJtV3JpdGVyRnV6emVyKQorCisjIDxhIG5hbWU9IldyaXRlckZ1enplckJhc2UiPjwvYT4gRnV6emVyIGZvciBsaWJ3cml0ZXJmdXp6ZXJiYXNlCitBbGwgdGhlIHdyaXRlcnMgaGF2ZSBhIGNvbW1vbiBBUEkgLSBjcmVhdGluZyBhIHdyaXRlciwgYWRkaW5nIGEgc291cmNlIGZvcgorYWxsIHRoZSB0cmFja3MsIGV0Yy4gVGhlc2UgY29tbW9uIEFQSXMgaGF2ZSBiZWVuIGFic3RyYWN0ZWQgaW4gYSBiYXNlIGNsYXNzCitjYWxsZWQgYFdyaXRlckZ1enplckJhc2VgIHRvIGVuc3VyZSBjb2RlIGlzIHJldXNlZCBiZXR3ZWVuIGZ1enplciBwbHVnaW5zLgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3Igd3JpdGVycyBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK3dyaXRlciBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitGdXp6ZXIgZm9yIHdyaXRlcnMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorMS4gVHJhY2sgTWltZSAocGFyYW1ldGVyIG5hbWU6IGBtaW1lYCkKKzIuIENoYW5uZWwgQ291bnQgKHBhcmFtZXRlciBuYW1lOiBgY2hhbm5lbC1jb3VudGApCiszLiBTYW1wbGUgUmF0ZSAocGFyYW1ldGVyIG5hbWU6IGBzYW1wbGUtcmF0ZWApCis0LiBGcmFtZSBIZWlnaHQgKHBhcmFtZXRlciBuYW1lOiBgaGVpZ2h0YCkKKzUuIEZyYW1lIFdpZHRoIChwYXJhbWV0ZXIgbmFtZTogYHdpZHRoYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBtaW1lYCB8IDAuIGBhdWRpby8zZ3BwYCAxLiBgYXVkaW8vYW1yLXdiYCAyLiBgYXVkaW8vdm9yYmlzYCAzLiBgYXVkaW8vb3B1c2AgNC4gYGF1ZGlvL21wNGEtbGF0bWAgNS4gYGF1ZGlvL21wZWdgIDYuIGBhdWRpby9tcGVnLUwxYCA3LiBgYXVkaW8vbXBlZy1MMmAgOC4gYGF1ZGlvL21pZGlgIDkuIGBhdWRpby9xY2VscGAgMTAuIGBhdWRpby9nNzExLWFsYXdgIDExLiBgYXVkaW8vZzcxMS1tbGF3YCAxMi4gYGF1ZGlvL2ZsYWNgIDEzLiBgYXVkaW8vYWFjLWFkdHNgIDE0LiBgYXVkaW8vZ3NtYCAxNS4gYGF1ZGlvL2FjM2AgMTYuIGBhdWRpby9lYWMzYCAxNy4gYGF1ZGlvL2VhYzMtam9jYCAxOC4gYGF1ZGlvL2FjNGAgMTkuIGBhdWRpby9zY3JhbWJsZWRgIDIwLiBgYXVkaW8vYWxhY2AgMjEuIGBhdWRpby94LW1zLXdtYWAgMjIuIGBhdWRpby94LWFkcGNtLW1zYCAyMy4gYGF1ZGlvL3gtYWRwY20tZHZpLWltYWAgMjQuIGB2aWRlby9hdmNgIDI1LiBgdmlkZW8vaGV2Y2AgMjYuIGB2aWRlby9tcDR2LWVzYCAyNy4gYHZpZGVvLzNncHBgIDI4LiBgdmlkZW8veC12bmQub24yLnZwOGAgMjkuIGB2aWRlby94LXZuZC5vbjIudnA5YCAzMC4gYHZpZGVvL2F2MDFgIDMxLiBgdmlkZW8vbXBlZzJgIDMyLiBgdmlkZW8vZG9sYnktdmlzaW9uYCAzMy4gYHZpZGVvL3NjcmFtYmxlZGAgMzQuIGB2aWRlby9kaXZ4YCAzNS4gYHZpZGVvL2RpdngzYCAzNi4gYHZpZGVvL3h2aWRgIDM3LiBgdmlkZW8veC1tb3Rpb24tanBlZ2AgMzguIGB0ZXh0LzNncHAtdHRgIDM5LiBgYXBwbGljYXRpb24veC1zdWJyaXBgIDQwLiBgdGV4dC92dHRgIDQxLiBgdGV4dC9jZWEtNjA4YCA0Mi4gYHRleHQvY2VhLTcwOGAgNDMuIGBhcHBsaWNhdGlvbi94LWlkM3Y0YCB8IEFsbCB0aGUgYml0cyBvZiAybmQgYnl0ZSBvZiBkYXRhIGZvciBmaXJzdCB0cmFjayBhbmQgMTF0aCBieXRlIG9mIGRhdGEgZm9yIHNlY29uZCB0cmFjayBhbmQgMjB0aCBieXRlIG9mIGRhdGEgZm9yIHRoaXJkIHRyYWNrKGlmIHByZXNlbnQpIG1vZHVsdXMgNDQgfAorfCBgY2hhbm5lbC1jb3VudGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gSU5UMzJfTUFYYCB8IEFsbCB0aGUgYml0cyBvZiAzcmQgYnl0ZSB0byA2dGggYnl0ZXMgb2YgZGF0YSBpZiBmaXJzdCB0cmFjayBpcyBhdWRpbyBhbmQgMTJ0aCB0byAxNXRoIGJ5dGVzIG9mIGRhdGEgaWYgc2Vjb25kIHRyYWNrIGlzIGF1ZGlvIHwKK3wgYHNhbXBsZS1yYXRlYCB8IEluIHRoZSByYW5nZSBgMSB0byBJTlQzMl9NQVhgIHwgQWxsIHRoZSBiaXRzIG9mIDd0aCBieXRlIHRvIDEwdGggYnl0ZXMgb2YgZGF0YSBpZiBmaXJzdCB0cmFjayBpcyBhdWRpbyBhbmQgMTZ0aCB0byAxOXRoIGJ5dGVzIG9mIGRhdGEgaWYgc2Vjb25kIHRyYWNrIGlzIGF1ZGlvIHwKK3wgYGhlaWdodGAgfCBJbiB0aGUgcmFuZ2UgYDAgdG8gSU5UMzJfTUFYYCB8IEFsbCB0aGUgYml0cyBvZiAzcmQgYnl0ZSB0byA2dGggYnl0ZXMgb2YgZGF0YSBpZiBmaXJzdCB0cmFjayBpcyB2aWRlbyBhbmQgMTJ0aCB0byAxNXRoIGJ5dGVzIG9mIGRhdGEgaWYgc2Vjb25kIHRyYWNrIGlzIHZpZGVvIHwKK3wgYHdpZHRoYCB8IEluIHRoZSByYW5nZSBgMCB0byBJTlQzMl9NQVhgIHwgQWxsIHRoZSBiaXRzIG9mIDd0aCBieXRlIHRvIDEwdGggYnl0ZXMgb2YgZGF0YSBpZiBmaXJzdCB0cmFjayBpcyB2aWRlbyBhbmQgMTZ0aCB0byAxOXRoIGJ5dGVzIG9mIGRhdGEgaWYgc2Vjb25kIHRyYWNrIGlzIHZpZGVvIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZGl2aWRlcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgaW50byBmcmFtZXMgYmFzZWQgb24gZnJhbWUgbWFya2Vycy4KK0lmIG5vIGZyYW1lIG1hcmtlciBpcyBmb3VuZCB0aGVuIHRoZSBlbnRpcmUgaW5wdXQgZGF0YSBpcyB0cmVhdGVkIGFzIHNpbmdsZSBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUgY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHZ1bG5lcmFiaWxpdGllcy4KKworIyA8YSBuYW1lPSJhbXJXcml0ZXJGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBBbXIgV3JpdGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBTVIgd3JpdGVyIHVzZXMgdGhlIGBXcml0ZXJGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZVdyaXRlcmAgdG8gY3JlYXRlIHRoZSBBTVIgd3JpdGVyIGNsYXNzLgorCisjIyMjIyBPdGhlciBjb25zaWRlcmF0aW9ucworICogVHdvIGZ1enplciBiaW5hcmllcyAtIGFtcm5iX3dyaXRlcl9mdXp6ZXIgYW5kIGFtcndiX3dyaXRlcl9mdXp6ZXIgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBmbGFnIC0gJ0FNUk5CJworCisjIDxhIG5hbWU9Im1wZWc0V3JpdGVyRnV6emVyIj48L2E+IEZ1enplciBmb3IgTVBFRzQgV3JpdGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUEVHNCB3cml0ZXIgdXNlcyB0aGUgYFdyaXRlckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlV3JpdGVyYCB0byBjcmVhdGUgdGhlIE1QRUc0IHdyaXRlciBjbGFzcy4KKworIyA8YSBuYW1lPSJvZ2dXcml0ZXJGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBPR0cgV3JpdGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBPR0cgd3JpdGVyIHVzZXMgdGhlIGBXcml0ZXJGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZVdyaXRlcmAgdG8gY3JlYXRlIHRoZSBPR0cgd3JpdGVyIGNsYXNzLgorCisjIDxhIG5hbWU9IndlYm1Xcml0ZXJGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBXRUJNIFdyaXRlcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgV0VCTSB3cml0ZXIgdXNlcyB0aGUgYFdyaXRlckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlV3JpdGVyYCB0byBjcmVhdGUgdGhlIFdFQk0gd3JpdGVyIGNsYXNzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCB3cml0ZXIgZnV6emVyIGJpbmFyaWVzLgorCisjIyMgQW5kcm9pZAorCitgKmAgPSBhbXJuYi9hbXJ3Yi9tcGVnNC9vZ2cvd2VibQorIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSAqX3dyaXRlcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtZWRpYSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC8qX3dyaXRlcl9mdXp6ZXIvKl93cml0ZXJfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvV3JpdGVyRnV6emVyQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9Xcml0ZXJGdXp6ZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTdhZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvV3JpdGVyRnV6emVyQmFzZS5jcHAKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiV3JpdGVyRnV6emVyQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBCdWZmZXIgc291cmNlIGltcGxlbWVudGF0aW9ucyB0byBwYXJzZSBpbnB1dCBmaWxlCisgKi8KKwordWludDMyX3QgV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXROdW1UcmFja3MoKSB7CisgICAgdWludDMyX3QgbnVtVHJhY2tzID0gMDsKKyAgICBpZiAobVNpemUgPiBzaXplb2YodWludDhfdCkpIHsKKyAgICAgICAgbnVtVHJhY2tzID0gbWluKG1EYXRhWzBdLCBrTWF4VHJhY2tDb3VudCk7CisgICAgICAgIG1SZWFkSW5kZXggKz0gc2l6ZW9mKHVpbnQ4X3QpOworICAgIH0KKyAgICByZXR1cm4gbnVtVHJhY2tzOworfQorCitib29sIFdyaXRlckZ1enplckJhc2U6OkJ1ZmZlclNvdXJjZTo6c2VhcmNoRm9yTWFya2VyKHNpemVfdCBzdGFydEluZGV4KSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGlzTWFya2VyKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC0tbVJlYWRJbmRleDsKKyAgICAgICAgaWYgKG1SZWFkSW5kZXggPCBzdGFydEluZGV4KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0NvbmZpZ0Zvcm1hdCBXcml0ZXJGdXp6ZXJCYXNlOjpCdWZmZXJTb3VyY2U6OmdldENvbmZpZ0Zvcm1hdChpbnQzMl90IHRyYWNrSW5kZXgpIHsKKyAgICByZXR1cm4gbVBhcmFtc1t0cmFja0luZGV4XTsKK30KKworaW50MzJfdCBXcml0ZXJGdXp6ZXJCYXNlOjpCdWZmZXJTb3VyY2U6OmdldE51bUNzZHMoaW50MzJfdCB0cmFja0luZGV4KSB7CisgICAgcmV0dXJuIG1OdW1Dc2RzW3RyYWNrSW5kZXhdOworfQorCit2ZWN0b3I8RnJhbWVEYXRhPiAmV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXRGcmFtZUxpc3QoaW50MzJfdCB0cmFja0luZGV4KSB7CisgICAgcmV0dXJuIG1GcmFtZUxpc3RbdHJhY2tJbmRleF07Cit9CisKK3ZvaWQgV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXRGcmFtZUluZm8oKSB7CisgICAgc2l6ZV90IHJlYWRJbmRleFN0YXJ0ID0gbVJlYWRJbmRleDsKKyAgICBpZiAobVNpemUgLSBtUmVhZEluZGV4ID4ga01hcmtlclNpemUgKyBrTWFya2VyU3VmZml4U2l6ZSkgeworICAgICAgICBib29sIGlzRnJhbWVBdmFpbGFibGUgPSB0cnVlOworICAgICAgICBzaXplX3QgYnl0ZXNSZW1haW5pbmcgPSBtU2l6ZTsKKyAgICAgICAgbVJlYWRJbmRleCA9IG1TaXplIC0ga01hcmtlclNpemU7CisgICAgICAgIHdoaWxlIChpc0ZyYW1lQXZhaWxhYmxlKSB7CisgICAgICAgICAgICBpc0ZyYW1lQXZhaWxhYmxlID0gc2VhcmNoRm9yTWFya2VyKHJlYWRJbmRleFN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChpc0ZyYW1lQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxvY2F0aW9uID0gbVJlYWRJbmRleCArIGtNYXJrZXJTaXplOworICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiArIGtNYXJrZXJTdWZmaXhTaXplID49IGJ5dGVzUmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIGlzQ1NEID0gaXNDU0RNYXJrZXIobG9jYXRpb24pOworICAgICAgICAgICAgICAgIGxvY2F0aW9uICs9IGtNYXJrZXJTdWZmaXhTaXplOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmZyYW1lUHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KCZtRGF0YVtsb2NhdGlvbl0pOworICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBieXRlc1JlbWFpbmluZyAtIGxvY2F0aW9uLCBidWZmZXJTaXplID0gMDsKKyAgICAgICAgICAgICAgICB1aW50OF90IHRyYWNrSW5kZXggPSBmcmFtZVB0clswXSAlIGtNYXhUcmFja0NvdW50OworICAgICAgICAgICAgICAgICsrZnJhbWVQdHI7CisgICAgICAgICAgICAgICAgdWludDhfdCBmbGFncyA9IDA7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChpc0NTRCAmJiBmcmFtZVNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGtDb2RlY0NvbmZpZ0ZsYWc7CisgICAgICAgICAgICAgICAgICAgIHB0cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICsrbU51bUNzZHNbdHJhY2tJbmRleF07CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBmcmFtZVNpemUgLSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVTaXplID4gc2l6ZW9mKHVpbnQ4X3QpICsgc2l6ZW9mKGludDY0X3QpICsgMSkgeworICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdUeXBlc1tmcmFtZVB0clswXSAlIHNpemUoZmxhZ1R5cGVzKV07CisgICAgICAgICAgICAgICAgICAgICsrZnJhbWVQdHI7CisgICAgICAgICAgICAgICAgICAgIGNvcHkoZnJhbWVQdHIsIGZyYW1lUHRyICsgc2l6ZW9mKGludDY0X3QpLCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJnB0cykpOworICAgICAgICAgICAgICAgICAgICBmcmFtZVB0ciArPSBzaXplb2YoaW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBmcmFtZVNpemUgLSAoc2l6ZW9mKHVpbnQ4X3QpICsgc2l6ZW9mKGludDY0X3QpKSAtIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1GcmFtZUxpc3RbdHJhY2tJbmRleF0uaW5zZXJ0KG1GcmFtZUxpc3RbdHJhY2tJbmRleF0uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZURhdGF7YnVmZmVyU2l6ZSwgZmxhZ3MsIHB0cywgZnJhbWVQdHJ9KTsKKyAgICAgICAgICAgICAgICBieXRlc1JlbWFpbmluZyAtPSAoZnJhbWVTaXplICsga01hcmtlclNpemUgKyBrTWFya2VyU3VmZml4U2l6ZSk7CisgICAgICAgICAgICAgICAgLS1tUmVhZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtRnJhbWVMaXN0WzBdLmVtcHR5KCkgJiYgbUZyYW1lTGlzdFsxXS5lbXB0eSgpKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTY2VuYXJpbyB3aGVyZSBpbnB1dCBkYXRhIGRvZXMgbm90IGNvbnRhaW4gdGhlIGN1c3RvbSBmcmFtZSBtYXJrZXJzLgorICAgICAgICAgKiBIZW5jZSBmZWVkIHRoZSBlbnRpcmUgZGF0YSBhcyBzaW5nbGUgZnJhbWUuCisgICAgICAgICAqLworICAgICAgICBtRnJhbWVMaXN0WzBdLmVtcGxhY2VfYmFjayhGcmFtZURhdGF7bVNpemUgLSByZWFkSW5kZXhTdGFydCwgMCwgMCwgbURhdGEgKyByZWFkSW5kZXhTdGFydH0pOworICAgIH0KK30KK2Jvb2wgV3JpdGVyRnV6emVyQmFzZTo6QnVmZmVyU291cmNlOjpnZXRUcmFja0luZm8oaW50MzJfdCB0cmFja0luZGV4KSB7CisgICAgaWYgKG1TaXplIDw9IG1SZWFkSW5kZXggKyBzaXplb2YodWludDhfdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzaXplX3QgbWltZVR5cGVJZHggPSBtRGF0YVttUmVhZEluZGV4XSAlIGtTdXBwb3J0ZWRNaW1lVHlwZXM7CisgICAgY2hhciAqbWltZSA9IChjaGFyICopc3VwcG9ydGVkTWltZVR5cGVzW21pbWVUeXBlSWR4XS5jX3N0cigpOworICAgIG1QYXJhbXNbdHJhY2tJbmRleF0ubWltZSA9IG1pbWU7CisgICAgbVJlYWRJbmRleCArPSBzaXplb2YodWludDhfdCk7CisKKyAgICBpZiAobVNpemUgPiBtUmVhZEluZGV4ICsgMiAqIHNpemVvZihpbnQzMl90KSkgeworICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgICAgICBjb3B5KG1EYXRhICsgbVJlYWRJbmRleCwgbURhdGEgKyBtUmVhZEluZGV4ICsgc2l6ZW9mKGludDMyX3QpLAorICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1QYXJhbXNbdHJhY2tJbmRleF0uY2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICBjb3B5KG1EYXRhICsgbVJlYWRJbmRleCArIHNpemVvZihpbnQzMl90KSwgbURhdGEgKyBtUmVhZEluZGV4ICsgMiAqIHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZtUGFyYW1zW3RyYWNrSW5kZXhdLnNhbXBsZVJhdGUpKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGNvcHkobURhdGEgKyBtUmVhZEluZGV4LCBtRGF0YSArIG1SZWFkSW5kZXggKyBzaXplb2YoaW50MzJfdCksCisgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPigmbVBhcmFtc1t0cmFja0luZGV4XS5oZWlnaHQpKTsKKyAgICAgICAgICAgIGNvcHkobURhdGEgKyBtUmVhZEluZGV4ICsgc2l6ZW9mKGludDMyX3QpLCBtRGF0YSArIG1SZWFkSW5kZXggKyAyICogc2l6ZW9mKGludDMyX3QpLAorICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oJm1QYXJhbXNbdHJhY2tJbmRleF0ud2lkdGgpKTsKKyAgICAgICAgfQorICAgICAgICBtUmVhZEluZGV4ICs9IDIgKiBzaXplb2YoaW50MzJfdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0cm5jbXAobWltZSwgInRleHQvIiwgNSkgJiYgc3RybmNtcChtaW1lLCAiYXBwbGljYXRpb24vIiwgMTIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgd3JpdGVIZWFkZXJCdWZmZXJzKHZlY3RvcjxGcmFtZURhdGE+ICZidWZmZXJJbmZvLCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgaW50MzJfdCBudW1Dc2RzKSB7CisgICAgY2hhciBjc2ROYW1lW2tNYXhDU0RTdHJsZW5dOworICAgIGZvciAoaW50IGNzZElkID0gMDsgY3NkSWQgPCBudW1Dc2RzOyArK2NzZElkKSB7CisgICAgICAgIGludDMyX3QgZmxhZ3MgPSBidWZmZXJJbmZvW2NzZElkXS5mbGFnczsKKyAgICAgICAgaWYgKGZsYWdzID09IGtDb2RlY0NvbmZpZ0ZsYWcpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNzZEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCh2b2lkICopYnVmZmVySW5mb1tjc2RJZF0uYnVmLCBidWZmZXJJbmZvW2NzZElkXS5zaXplKTsKKyAgICAgICAgICAgIGlmIChjc2RCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBjc2RCdWZmZXItPmJhc2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYoY3NkTmFtZSwgc2l6ZW9mKGNzZE5hbWUpLCAiY3NkLSVkIiwgY3NkSWQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoY3NkTmFtZSwgY3NkQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBXcml0ZXJGdXp6ZXJCYXNlOjpjcmVhdGVPdXRwdXRGaWxlKCkgeworICAgIG1GZCA9IG1lbWZkX2NyZWF0ZShtT3V0cHV0RmlsZU5hbWUuY19zdHIoKSwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgIGlmIChtRmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXcml0ZXJGdXp6ZXJCYXNlOjphZGRXcml0ZXJTb3VyY2UoaW50MzJfdCB0cmFja0luZGV4KSB7CisgICAgQ29uZmlnRm9ybWF0IHBhcmFtcyA9IG1CdWZmZXJTb3VyY2UtPmdldENvbmZpZ0Zvcm1hdCh0cmFja0luZGV4KTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgcGFyYW1zLm1pbWUpOworICAgIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGlmICghc3RybmNtcChwYXJhbXMubWltZSwgImF1ZGlvLzNncHAiLCAxMCkpIHsKKyAgICAgICAgICAgIHBhcmFtcy5jaGFubmVsQ291bnQgPSAxOworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSA4MDAwOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtcy5taW1lLCAiYXVkaW8vYW1yLXdiIiwgMTIpKSB7CisgICAgICAgICAgICBwYXJhbXMuY2hhbm5lbENvdW50ID0gMTsKKyAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IG1heCgxLCBwYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5jaGFubmVsQ291bnQpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtcy5taW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBwYXJhbXMud2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBwYXJhbXMuaGVpZ2h0KTsKKyAgICB9CisgICAgaW50MzJfdCBudW1Dc2RzID0gbUJ1ZmZlclNvdXJjZS0+Z2V0TnVtQ3Nkcyh0cmFja0luZGV4KTsKKyAgICBpZiAobnVtQ3NkcykgeworICAgICAgICB2ZWN0b3I8RnJhbWVEYXRhPiBtRnJhbWVzID0gbUJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWVMaXN0KHRyYWNrSW5kZXgpOworICAgICAgICB3cml0ZUhlYWRlckJ1ZmZlcnMobUZyYW1lcywgZm9ybWF0LCBudW1Dc2RzKTsKKyAgICB9CisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoZm9ybWF0LCB0cmFja01ldGEpOworICAgIG1DdXJyZW50VHJhY2tbdHJhY2tJbmRleF0gPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CisgICAgbVdyaXRlci0+YWRkU291cmNlKG1DdXJyZW50VHJhY2tbdHJhY2tJbmRleF0pOworfQorCit2b2lkIFdyaXRlckZ1enplckJhc2U6OnN0YXJ0KCkgeworICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleVJlYWxUaW1lUmVjb3JkaW5nLCBmYWxzZSk7CisgICAgbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKK30KKwordm9pZCBXcml0ZXJGdXp6ZXJCYXNlOjpzZW5kQnVmZmVyc1RvV3JpdGVyKHNwPE1lZGlhQWRhcHRlcj4gJmN1cnJlbnRUcmFjaywgaW50MzJfdCB0cmFja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRGcmFtZUluZGV4LCBpbnQzMl90IGVuZEZyYW1lSW5kZXgpIHsKKyAgICB2ZWN0b3I8RnJhbWVEYXRhPiBidWZmZXJJbmZvID0gbUJ1ZmZlclNvdXJjZS0+Z2V0RnJhbWVMaXN0KHRyYWNrSW5kZXgpOworICAgIGZvciAoaW50IGlkeCA9IHN0YXJ0RnJhbWVJbmRleDsgaWR4IDwgZW5kRnJhbWVJbmRleDsgKytpZHgpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoKHZvaWQgKilidWZmZXJJbmZvW2lkeF0uYnVmLCBidWZmZXJJbmZvW2lkeF0uc2l6ZSk7CisgICAgICAgIE1lZGlhQnVmZmVyICptZWRpYUJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXIpOworCisgICAgICAgIC8vIFJlbGVhc2VkIGluIE1lZGlhQWRhcHRlcjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoKS4KKyAgICAgICAgbWVkaWFCdWZmZXItPmFkZF9yZWYoKTsKKyAgICAgICAgbWVkaWFCdWZmZXItPnNldF9yYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YURhdGEgPSBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlUaW1lLCBidWZmZXJJbmZvW2lkeF0udGltZVVzKTsKKworICAgICAgICAvLyBKdXN0IHNldCB0aGUga0tleURlY29kaW5nVGltZSBhcyB0aGUgcHJlc2VudGF0aW9uIHRpbWUgZm9yIG5vdy4KKyAgICAgICAgc2FtcGxlTWV0YURhdGEuc2V0SW50NjQoa0tleURlY29kaW5nVGltZSwgYnVmZmVySW5mb1tpZHhdLnRpbWVVcyk7CisgICAgICAgIGlmIChidWZmZXJJbmZvW2lkeF0uZmxhZ3MgPT0gU2FtcGxlRmxhZzo6U1lOQ19GTEFHKSB7CisgICAgICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBwdXNoQnVmZmVyIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWVkaWFCdWZmZXIgaXMgY29uc3VtZWQuCisgICAgICAgIGN1cnJlbnRUcmFjay0+cHVzaEJ1ZmZlcihtZWRpYUJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIFdyaXRlckZ1enplckJhc2U6OnNlbmRCdWZmZXJzSW50ZXJsZWF2ZShpbnQzMl90IG51bVRyYWNrcywgdWludDhfdCBudW1CdWZmZXJzSW50ZXJsZWF2ZSkgeworICAgIGludDMyX3QgY3VycmVudEZyYW1lSW5kZXhbbnVtVHJhY2tzXSwgcmVtYWluaW5nTnVtRnJhbWVzW251bVRyYWNrc10sIG51bVRyYWNrRnJhbWVzRG9uZTsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyArK2lkeCkgeworICAgICAgICBjdXJyZW50RnJhbWVJbmRleFtpZHhdID0gbUJ1ZmZlclNvdXJjZS0+Z2V0TnVtQ3NkcyhpZHgpOworICAgICAgICByZW1haW5pbmdOdW1GcmFtZXNbaWR4XSA9IG1CdWZmZXJTb3VyY2UtPmdldEZyYW1lTGlzdChpZHgpLnNpemUoKSAtIGN1cnJlbnRGcmFtZUluZGV4W2lkeF07CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgbnVtVHJhY2tGcmFtZXNEb25lID0gbnVtVHJhY2tzOworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyArK2lkeCkgeworICAgICAgICAgICAgaWYgKHJlbWFpbmluZ051bUZyYW1lc1tpZHhdID4gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzSW50ZXJsZWF2ZSA9CisgICAgICAgICAgICAgICAgICAgIG1pbihyZW1haW5pbmdOdW1GcmFtZXNbaWR4XSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obnVtQnVmZmVyc0ludGVybGVhdmUpKTsKKyAgICAgICAgICAgICAgICBzZW5kQnVmZmVyc1RvV3JpdGVyKG1DdXJyZW50VHJhY2tbaWR4XSwgaWR4LCBjdXJyZW50RnJhbWVJbmRleFtpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZyYW1lSW5kZXhbaWR4XSArIG51bUZyYW1lc0ludGVybGVhdmUpOworICAgICAgICAgICAgICAgIGN1cnJlbnRGcmFtZUluZGV4W2lkeF0gKz0gbnVtRnJhbWVzSW50ZXJsZWF2ZTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdOdW1GcmFtZXNbaWR4XSAtPSBudW1GcmFtZXNJbnRlcmxlYXZlOworICAgICAgICAgICAgICAgIC0tbnVtVHJhY2tGcmFtZXNEb25lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobnVtVHJhY2tGcmFtZXNEb25lIDwgbnVtVHJhY2tzKTsKK30KKwordm9pZCBXcml0ZXJGdXp6ZXJCYXNlOjppbml0RmlsZVdyaXRlckFuZFByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKCFjcmVhdGVPdXRwdXRGaWxlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWNyZWF0ZVdyaXRlcigpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90IG51bUJ1ZmZlcnNJbnRlcmxlYXZlID0gKGRhdGFbMF0gPT0gMCA/IDEgOiBkYXRhWzBdKTsKKyAgICArK2RhdGE7CisgICAgLS1zaXplOworCisgICAgbUJ1ZmZlclNvdXJjZSA9IG5ldyBCdWZmZXJTb3VyY2UoZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFtQnVmZmVyU291cmNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbU51bVRyYWNrcyA9IG1CdWZmZXJTb3VyY2UtPmdldE51bVRyYWNrcygpOworICAgIGlmIChtTnVtVHJhY2tzID4gMCkgeworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbU51bVRyYWNrczsgKytpZHgpIHsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclNvdXJjZS0+Z2V0VHJhY2tJbmZvKGlkeCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1CdWZmZXJTb3VyY2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU51bVRyYWNrcyA9IGlkeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyU291cmNlLT5nZXRGcmFtZUluZm8oKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG1OdW1UcmFja3M7ICsraWR4KSB7CisgICAgICAgICAgICBhZGRXcml0ZXJTb3VyY2UoaWR4KTsKKyAgICAgICAgfQorICAgICAgICBzdGFydCgpOworICAgICAgICBzZW5kQnVmZmVyc0ludGVybGVhdmUobU51bVRyYWNrcywgbnVtQnVmZmVyc0ludGVybGVhdmUpOworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbU51bVRyYWNrczsgKytpZHgpIHsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZWxldGUgbUJ1ZmZlclNvdXJjZTsKKyAgICBtV3JpdGVyLT5zdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9hbXJfd3JpdGVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9hbXJfd3JpdGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiNmY5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL2Ftcl93cml0ZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIldyaXRlckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgQW1yV3JpdGVyRnV6emVyIDogcHVibGljIFdyaXRlckZ1enplckJhc2UgeworICAgcHVibGljOgorICAgIGJvb2wgY3JlYXRlV3JpdGVyKCk7Cit9OworCitib29sIEFtcldyaXRlckZ1enplcjo6Y3JlYXRlV3JpdGVyKCkgeworICAgIG1Xcml0ZXIgPSBuZXcgQU1SV3JpdGVyKG1GZCk7CisgICAgaWYgKCFtV3JpdGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworI2lmZGVmIEFNUk5CCisgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfQU1SX05CKTsKKyNlbHNlCisgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfQU1SX1dCKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQW1yV3JpdGVyRnV6emVyIHdyaXRlckZ1enplcjsKKyAgICB3cml0ZXJGdXp6ZXIuaW5pdEZpbGVXcml0ZXJBbmRQcm9jZXNzRGF0YShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL2luY2x1ZGUvV3JpdGVyRnV6emVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvaW5jbHVkZS9Xcml0ZXJGdXp6ZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxNTMyMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL2luY2x1ZGUvV3JpdGVyRnV6emVyQmFzZS5oCkBAIC0wLDAgKzEsMjExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2lmbmRlZiBfX1dSSVRFUl9GVVpaRVJfQkFTRV9IX18KKyNkZWZpbmUgX19XUklURVJfRlVaWkVSX0JBU0VfSF9fCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFkYXB0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjb25zdGV4cHIgdWludDMyX3Qga01pbWVTaXplID0gMTI4OworY29uc3RleHByIHVpbnQ4X3Qga01heFRyYWNrQ291bnQgPSAzOworY29uc3RleHByIHVpbnQzMl90IGtNYXhDU0RTdHJsZW4gPSAxNjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrQ29kZWNDb25maWdGbGFnID0gMzI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IENvbmZpZ0Zvcm1hdCB7CisgICAgY2hhciogbWltZTsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK307CisKK3N0cnVjdCBGcmFtZURhdGEgeworICAgIHNpemVfdCBzaXplOworICAgIHVpbnQ4X3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgY29uc3QgdWludDhfdCogYnVmOworfTsKKworc3RhdGljIHN0cmluZyBzdXBwb3J0ZWRNaW1lVHlwZXNbXSA9IHsiYXVkaW8vM2dwcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9hbXItd2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vdm9yYmlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL29wdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vbXA0YS1sYXRtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wZWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vbXBlZy1MMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9tcGVnLUwyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21pZGkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vcWNlbHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vZzcxMS1hbGF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2c3MTEtbWxhdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9mbGFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2FhYy1hZHRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2dzbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9hYzMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vZWFjMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9lYWMzLWpvYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9hYzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vc2NyYW1ibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL2FsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8veC1tcy13bWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8veC1hZHBjbS1tcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby94LWFkcGNtLWR2aS1pbWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vYXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL2hldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vbXA0di1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby8zZ3BwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL3gtdm5kLm9uMi52cDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8veC12bmQub24yLnZwOSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9hdjAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL21wZWcyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL2RvbGJ5LXZpc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9zY3JhbWJsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW8vZGl2eCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby9kaXZ4MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlby94dmlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvL3gtbW90aW9uLWpwZWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC8zZ3BwLXR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtc3VicmlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvdnR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvY2VhLTYwOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0L2NlYS03MDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veC1pZDN2NCJ9OworCitlbnVtIFNhbXBsZUZsYWcgeworICAgIERFRkFVTFRfRkxBRyA9IDAsCisgICAgU1lOQ19GTEFHID0gMSwKKyAgICBFTkNSWVBURURfRkxBRyA9IDIsCit9OworCitzdGF0aWMgdWludDhfdCBmbGFnVHlwZXNbXSA9IHtTYW1wbGVGbGFnOjpERUZBVUxUX0ZMQUcsIFNhbXBsZUZsYWc6OlNZTkNfRkxBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUZsYWc6OkVOQ1JZUFRFRF9GTEFHfTsKKworY2xhc3MgV3JpdGVyRnV6emVyQmFzZSB7CisgICBwdWJsaWM6CisgICAgV3JpdGVyRnV6emVyQmFzZSgpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5Xcml0ZXJGdXp6ZXJCYXNlKCkgeworICAgICAgICBpZiAobUZpbGVNZXRhKSB7CisgICAgICAgICAgICBtRmlsZU1ldGEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Xcml0ZXIpIHsKKyAgICAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Xcml0ZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgKytpZHgpIHsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0pIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgfTsKKworICAgIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgdGhlIG1lZGlhIHdyaXRlciBjb21wb25lbnQuCisgICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNyZWF0ZVdyaXRlcigpID0gMDsKKworICAgIC8qKiBQYXJlbnQgY2xhc3MgZnVuY3Rpb25zIHRvIGJlIHJldXNlZCBieSBkZXJpdmVkIGNsYXNzLgorICAgICAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGFsbCBtZWRpYSB3cml0ZXIgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBib29sIGNyZWF0ZU91dHB1dEZpbGUoKTsKKworICAgIHZvaWQgYWRkV3JpdGVyU291cmNlKGludDMyX3QgdHJhY2tJbmRleCk7CisKKyAgICB2b2lkIHN0YXJ0KCk7CisKKyAgICB2b2lkIHNlbmRCdWZmZXJzVG9Xcml0ZXIoc3A8TWVkaWFBZGFwdGVyPiYgY3VycmVudFRyYWNrLCBpbnQzMl90IHRyYWNrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRGcmFtZUluZGV4LCBpbnQzMl90IGVuZEZyYW1lSW5kZXgpOworCisgICAgdm9pZCBzZW5kQnVmZmVyc0ludGVybGVhdmUoaW50MzJfdCBudW1UcmFja3MsIHVpbnQ4X3QgbnVtQnVmZmVyc0ludGVybGVhdmUpOworCisgICAgdm9pZCBpbml0RmlsZVdyaXRlckFuZFByb2Nlc3NEYXRhKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworICAgcHJvdGVjdGVkOgorICAgIGNsYXNzIEJ1ZmZlclNvdXJjZSB7CisgICAgICAgcHVibGljOgorICAgICAgICBCdWZmZXJTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIDogbURhdGEoZGF0YSksIG1TaXplKHNpemUpLCBtUmVhZEluZGV4KDApIHt9CisgICAgICAgIH5CdWZmZXJTb3VyY2UoKSB7CisgICAgICAgICAgICBtRGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICBtU2l6ZSA9IDA7CisgICAgICAgICAgICBtUmVhZEluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBrTWF4VHJhY2tDb3VudDsgKytpZHgpIHsKKyAgICAgICAgICAgICAgICBtRnJhbWVMaXN0W2lkeF0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBnZXROdW1UcmFja3MoKTsKKyAgICAgICAgYm9vbCBnZXRUcmFja0luZm8oaW50MzJfdCB0cmFja0luZGV4KTsKKyAgICAgICAgdm9pZCBnZXRGcmFtZUluZm8oKTsKKyAgICAgICAgQ29uZmlnRm9ybWF0IGdldENvbmZpZ0Zvcm1hdChpbnQzMl90IHRyYWNrSW5kZXgpOworICAgICAgICBpbnQzMl90IGdldE51bUNzZHMoaW50MzJfdCB0cmFja0luZGV4KTsKKyAgICAgICAgdmVjdG9yPEZyYW1lRGF0YT4mIGdldEZyYW1lTGlzdChpbnQzMl90IHRyYWNrSW5kZXgpOworCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc01hcmtlcigpIHsgcmV0dXJuIChtZW1jbXAoJm1EYXRhW21SZWFkSW5kZXhdLCBrTWFya2VyLCBrTWFya2VyU2l6ZSkgPT0gMCk7IH0KKworICAgICAgICBib29sIGlzQ1NETWFya2VyKHNpemVfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIChtZW1jbXAoJm1EYXRhW3Bvc2l0aW9uXSwga0NzZE1hcmtlclN1ZmZpeCwga01hcmtlclN1ZmZpeFNpemUpID09IDApOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzZWFyY2hGb3JNYXJrZXIoc2l6ZV90IHN0YXJ0SW5kZXgpOworCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIG1EYXRhID0gbnVsbHB0cjsKKyAgICAgICAgc2l6ZV90IG1TaXplID0gMDsKKyAgICAgICAgc2l6ZV90IG1SZWFkSW5kZXggPSAwOworICAgICAgICBDb25maWdGb3JtYXQgbVBhcmFtc1trTWF4VHJhY2tDb3VudF0gPSB7fTsKKyAgICAgICAgaW50MzJfdCBtTnVtQ3Nkc1trTWF4VHJhY2tDb3VudF0gPSB7MH07CisgICAgICAgIHZlY3RvcjxGcmFtZURhdGE+IG1GcmFtZUxpc3Rba01heFRyYWNrQ291bnRdOworCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtTdXBwb3J0ZWRNaW1lVHlwZXMgPSBzaXplKHN1cHBvcnRlZE1pbWVUeXBlcyk7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrTWFya2VyW10gPSAiX01BUksiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQ4X3Qga0NzZE1hcmtlclN1ZmZpeFtdID0gIl9IXyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDhfdCBrRnJhbWVNYXJrZXJTdWZmaXhbXSA9ICJfRl8iOworICAgICAgICAvLyBBbGwgbWFya2VycyBzaG91bGQgYmUgNSBieXRlcyBsb25nICggc2l6ZW9mICdfTUFSSycgd2hpY2ggaXMgNSkKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01hcmtlclNpemUgPSAoc2l6ZW9mKGtNYXJrZXIpIC0gMSk7CisgICAgICAgIC8vIEFsbCBtYXJrZXIgdHlwZXMgc2hvdWxkIGJlIDMgYnl0ZXMgbG9uZyAoJ19IXycsICdfRl8nKQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWFya2VyU3VmZml4U2l6ZSA9IDM7CisgICAgfTsKKworICAgIEJ1ZmZlclNvdXJjZSogbUJ1ZmZlclNvdXJjZSA9IG51bGxwdHI7CisgICAgaW50MzJfdCBtRmQgPSAtMTsKKyAgICB1aW50MzJfdCBtTnVtVHJhY2tzID0gMDsKKyAgICBzdHJpbmcgbU91dHB1dEZpbGVOYW1lID0gIndyaXRlci5vdXQiOworICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyID0gbnVsbHB0cjsKKyAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhID0gbnVsbHB0cjsKKyAgICBzcDxNZWRpYUFkYXB0ZXI+IG1DdXJyZW50VHJhY2tba01heFRyYWNrQ291bnRdID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9fV1JJVEVSX0ZVWlpFUl9CQVNFX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvbXBlZzRfd3JpdGVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9tcGVnNF93cml0ZXJfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJkMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvbXBlZzRfd3JpdGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJXcml0ZXJGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTXBlZzRXcml0ZXJGdXp6ZXIgOiBwdWJsaWMgV3JpdGVyRnV6emVyQmFzZSB7CisgICBwdWJsaWM6CisgICAgYm9vbCBjcmVhdGVXcml0ZXIoKTsKK307CisKK2Jvb2wgTXBlZzRXcml0ZXJGdXp6ZXI6OmNyZWF0ZVdyaXRlcigpIHsKKyAgICBtV3JpdGVyID0gbmV3IE1QRUc0V3JpdGVyKG1GZCk7CisgICAgaWYgKCFtV3JpdGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBNcGVnNFdyaXRlckZ1enplciB3cml0ZXJGdXp6ZXI7CisgICAgd3JpdGVyRnV6emVyLmluaXRGaWxlV3JpdGVyQW5kUHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9vZ2dfd3JpdGVyX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93cml0ZXJfZnV6emVycy9vZ2dfd3JpdGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5Yzk0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL29nZ193cml0ZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgIldyaXRlckZ1enplckJhc2UuaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgT0dHV3JpdGVyRnV6emVyIDogcHVibGljIFdyaXRlckZ1enplckJhc2UgeworICAgcHVibGljOgorICAgIGJvb2wgY3JlYXRlV3JpdGVyKCk7Cit9OworCitib29sIE9HR1dyaXRlckZ1enplcjo6Y3JlYXRlV3JpdGVyKCkgeworICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKG1GZCk7CisgICAgaWYgKCFtV3JpdGVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUZpbGVNZXRhID0gbmV3IE1ldGFEYXRhOworICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX09HRyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBPR0dXcml0ZXJGdXp6ZXIgd3JpdGVyRnV6emVyOworICAgIHdyaXRlckZ1enplci5pbml0RmlsZVdyaXRlckFuZFByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd3JpdGVyX2Z1enplcnMvd2VibV93cml0ZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL3dlYm1fd3JpdGVyX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MWI3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dyaXRlcl9mdXp6ZXJzL3dlYm1fd3JpdGVyX2Z1enplci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJXcml0ZXJGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlIDx3ZWJtL1dlYm1Xcml0ZXIuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIFdFQk1Xcml0ZXJGdXp6ZXIgOiBwdWJsaWMgV3JpdGVyRnV6emVyQmFzZSB7CisgICBwdWJsaWM6CisgICAgYm9vbCBjcmVhdGVXcml0ZXIoKTsKK307CisKK2Jvb2wgV0VCTVdyaXRlckZ1enplcjo6Y3JlYXRlV3JpdGVyKCkgeworICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihtRmQpOworICAgIGlmICghbVdyaXRlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIFdFQk1Xcml0ZXJGdXp6ZXIgd3JpdGVyRnV6emVyOworICAgIHdyaXRlckZ1enplci5pbml0RmlsZVdyaXRlckFuZFByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAppbmRleCA3ZWQwZTg4Li4wNTVkZDgwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9saWJzdGFnZWZyaWdodF9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlcl9oZWFkZXJzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTQ5LDQgKzU4LDMgQEAKICAgICBzcmNzOiBbIm1lZGlhX2NvZGVjcy54c2QiXSwKICAgICBwYWNrYWdlX25hbWU6ICJtZWRpYS5jb2RlY3MiLAogfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCBhMjMyMTUwLi42N2M2MTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTE0Niw3ICsxNDYsMTAgQEAKICAgICAgICAgfTsKICAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG5hbWVzID0gewogICAgICAgICAgICAgcHJlZml4ZXNbMF0gKyB2YXJpYW50c1swXSArICIueG1sIiwKLSAgICAgICAgICAgIHByZWZpeGVzWzFdICsgdmFyaWFudHNbMV0gKyAiLnhtbCIKKyAgICAgICAgICAgIHByZWZpeGVzWzFdICsgdmFyaWFudHNbMV0gKyAiLnhtbCIsCisKKyAgICAgICAgICAgIC8vIHNoYXBpbmcgaW5mb3JtYXRpb24gaXMgbm90IGN1cnJlbnRseSB2YXJpYW50IHNwZWNpZmljLgorICAgICAgICAgICAgIm1lZGlhX2NvZGVjc19zaGFwaW5nLnhtbCIKICAgICAgICAgfTsKICAgICByZXR1cm4gbmFtZXM7CiB9CkBAIC0zNDYsNiArMzQ5LDggQEAKICAgICAgICAgc3RhdHVzX3QgYWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKTsKICAgICAgICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwogICAgICAgICBzdGF0dXNfdCBhZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICBzdGF0dXNfdCBhZGRNYXBwaW5nKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGFkZFR1bmluZyhjb25zdCBjaGFyICoqYXR0cnMpOwogICAgICAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCA9IG51bGxwdHIpOwogICAgICAgICBzdGF0dXNfdCBhZGRTZXR0aW5nKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqcHJlZml4ID0gbnVsbHB0cik7CiAgICAgICAgIHN0YXR1c190IGVudGVyTWVkaWFDb2RlYyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2Rlcik7CkBAIC00MjgsNyArNDMzLDcgQEAKICAgICAgICAgaWYgKGZpbmRGaWxlSW5EaXJzKHNlYXJjaERpcnMsIGZpbGVOYW1lLCAmcGF0aCkpIHsKICAgICAgICAgICAgIGVyciA9IHBhcnNlWG1sUGF0aChwYXRoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dEKCJDYW5ub3QgZmluZCAlcyIsIHBhdGguY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HSSgiRGlkIG5vdCBmaW5kICVzIGluIHNlYXJjaCBwYXRoIiwgZmlsZU5hbWUuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmVzID0gY29tYmluZVN0YXR1cyhyZXMsIGVycik7CiAgICAgfQpAQCAtNDM4LDcgKzQ0Myw3IEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6cGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1Mb2NrKTsKICAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpIHsKLSAgICAgICAgQUxPR0QoIkNhbm5vdCBmaW5kICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIkNhbm5vdCBmaW5kICVzIiwgcGF0aC5jX3N0cigpKTsKICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBjb21iaW5lU3RhdHVzKG1QYXJzaW5nU3RhdHVzLCBOQU1FX05PVF9GT1VORCk7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CkBAIC00OTMsNyArNDk4LDcgQEAKICAgICAgIG1QYXRoKHBhdGgpLAogICAgICAgbVN0YXR1cyhOT19JTklUKSB7CiAgICAgLy8gZGV0ZXJtaW5lIGhyZWZfYmFzZQotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgiLyIpOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgnLycpOwogICAgIGlmIChlbmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKICAgICAgICAgbUhyZWZCYXNlID0gcGF0aC5zdWJzdHIoMCwgZW5kICsgMSk7CiAgICAgfQpAQCAtNzQxLDEzICs3NDYsMTkgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gaWdub3JlIGxpbWl0cyBhbmQgZmVhdHVyZXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgdHlwZQogICAgICAgICAgICAgaWYgKCFtU3RhdGUtPmluVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpIHx8IHN0ckVxKG5hbWUsICJWYXJpYW50IikpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdHJFcShuYW1lLCAiVmFyaWFudCIpIHx8IHN0ckVxKG5hbWUsICJNYXBwaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0ckVxKG5hbWUsICJUdW5pbmciKSkpIHsKICAgICAgICAgICAgICAgICBQTE9HRCgiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG91dHNpZGUgb2YgYSBUeXBlIiwgbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTGltaXQiKSkgewogICAgICAgICAgICAgICAgIGVyciA9IGFkZExpbWl0KGF0dHJzKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkZlYXR1cmUiKSkgewogICAgICAgICAgICAgICAgIGVyciA9IGFkZEZlYXR1cmUoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTWFwcGluZyIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkTWFwcGluZyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJUdW5pbmciKSkgeworICAgICAgICAgICAgICAgIGVyciA9IGFkZFR1bmluZyhhdHRycyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikgJiYgc2VjdGlvbiAhPSBTRUNUSU9OX1ZBUklBTlQpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBsaW1pdFZhcmlhbnRzKGF0dHJzKTsKICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbihlcnIgPT0gT0sgPyBTRUNUSU9OX1ZBUklBTlQgOiBTRUNUSU9OX1VOS05PV04pOwpAQCAtOTgxLDcgKzk5Miw5IEBACiAgICAgVHlwZU1hcDo6aXRlcmF0b3IgdHlwZUl0OwogICAgIGlmIChjb2RlY0l0ID09IG1EYXRhLT5tQ29kZWNNYXAuZW5kKCkpIHsgLy8gTmV3IGNvZGVjIG5hbWUKICAgICAgICAgaWYgKHVwZGF0aW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgIk1lZGlhQ29kZWM6IGNhbm5vdCB1cGRhdGUgbm9uLWV4aXN0aW5nIGNvZGVjIiB9OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk1lZGlhQ29kZWM6IGNhbm5vdCB1cGRhdGUgbm9uLWV4aXN0aW5nIGNvZGVjOiAiOworICAgICAgICAgICAgbXNnID0gbXNnICsgbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB7IE5BTUVfTk9UX0ZPVU5ELCBtc2cgfTsKICAgICAgICAgfQogICAgICAgICAvLyBDcmVhdGUgYSBuZXcgY29kZWMgaW4gbUNvZGVjTWFwCiAgICAgICAgIGNvZGVjSXQgPSBtRGF0YS0+bUNvZGVjTWFwLmluc2VydChDb2RlYyhuYW1lLCBDb2RlY1Byb3BlcnRpZXMoKSkpLmZpcnN0OwpAQCAtOTk0LDE5ICsxMDA3LDI1IEBACiAgICAgICAgIGNvZGVjSXQtPnNlY29uZC5vcmRlciA9IG1EYXRhLT5tQ29kZWNNYXAuc2l6ZSgpOwogICAgIH0gZWxzZSB7IC8vIEV4aXN0aW5nIGNvZGVjIG5hbWUKICAgICAgICAgaWYgKCF1cGRhdGluZykgewotICAgICAgICAgICAgcmV0dXJuIHsgQUxSRUFEWV9FWElTVFMsICJNZWRpYUNvZGVjOiBjYW5ub3QgYWRkIGV4aXN0aW5nIGNvZGVjIiB9OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbXNnID0gIk1lZGlhQ29kZWM6IGNhbm5vdCBhZGQgZXhpc3RpbmcgY29kZWM6ICI7CisgICAgICAgICAgICBtc2cgPSBtc2cgKyBuYW1lOworICAgICAgICAgICAgcmV0dXJuIHsgQUxSRUFEWV9FWElTVFMsIG1zZyB9OwogICAgICAgICB9CiAgICAgICAgIGlmICh0eXBlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CiAgICAgICAgICAgICBpZiAodHlwZUl0ID09IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIG5vbi1leGlzdGluZyB0eXBlIGZvciBjb2RlYyIgfTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiTWVkaWFDb2RlYzogY2Fubm90IHVwZGF0ZSBub24tZXhpc3RpbmcgdHlwZSBmb3IgY29kZWM6ICI7CisgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgbmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgbXNnIH07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBoYXBwZW4gb25seSB3aGVuIHRoZSBjb2RlYyBoYXMgYXQgbW9zdCBvbmUgdHlwZS4KICAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmJlZ2luKCk7CiAgICAgICAgICAgICBpZiAodHlwZUl0ID09IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgIHx8IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHsgQkFEX1ZBTFVFLCAiTWVkaWFDb2RlYzogY2Fubm90IHVwZGF0ZSBjb2RlYyB3aXRob3V0IHR5cGUgc3BlY2lmaWVkIiB9OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1zZyA9ICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIGNvZGVjIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQ6ICI7CisgICAgICAgICAgICAgICAgbXNnID0gbXNnICsgbmFtZTsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBCQURfVkFMVUUsIG1zZyB9OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTM4Niw2ICsxNDA1LDkyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRNYXBwaW5nKGNvbnN0IGNoYXIgKiphdHRycykgeworICAgIENIRUNLKG1TdGF0ZS0+aW5UeXBlKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdmFsdWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfa2luZCA9IG51bGxwdHI7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJNYXBwaW5nOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImtpbmQiKSkgeworICAgICAgICAgICAgYV9raW5kID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIk1hcHBpbmc6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgLy8gRXZlcnkgbWFwcGluZyBtdXN0IGhhdmUgYWxsIDMgZmllbGRzCisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJNYXBwaW5nIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChhX2tpbmQgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiTWFwcGluZyB3aXRoIG5vICdraW5kJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoYV92YWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJNYXBwaW5nIHdpdGggbm8gJ3ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3RhdGUtPmFkZERldGFpbChzdGQ6OnN0cmluZygibWFwcGluZy0iKSArIGFfa2luZCArICItIiArIGFfbmFtZSwgYV92YWx1ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjphZGRUdW5pbmcoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pblR5cGUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV92YWx1ZSA9IG51bGxwdHI7CisKKyAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJNYXBwaW5nOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIlR1bmluZzogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICAvLyBFdmVyeSB0dW5pbmcgbXVzdCBoYXZlIGJvdGggZmllbGRzCisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJUdW5pbmcgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGFfdmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiVHVuaW5nIHdpdGggbm8gJ3ZhbHVlJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3RhdGUtPmFkZERldGFpbChzdGQ6OnN0cmluZygidHVuaW5nLSIpICsgYV9uYW1lLCBhX3ZhbHVlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIENIRUNLKG1TdGF0ZS0+aW5Db2RlYygpKTsKICAgICBzaXplX3QgaSA9IDA7CkBAIC0xNTI1LDcgKzE2MzAsNyBAQAogICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXsicmFuayIsIHJhbmt9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVMaXN0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvcmRlciksIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXIsIHN0ZDo6bW92ZShub2RlSW5mbykpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjZkNzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsNiBAQAorLy8gdGVzdCBtYXBwaW5nIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlcgoreworICAicHJlc3VibWl0IjogWworICAgIHsgIm5hbWUiOiAiWE1MUGFyc2VyVGVzdCIgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9jdXJyZW50LnR4dAppbmRleCAxNmM4YWY4Li5lY2ZkODVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0CisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvY3VycmVudC50eHQKQEAgLTY1LDYgKzY1LDE2IEBACiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldF9kZWZhdWx0KFN0cmluZyk7CiAgIH0KIAorICBwdWJsaWMgY2xhc3MgTWFwcGluZyB7CisgICAgY3RvciBwdWJsaWMgTWFwcGluZygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldEtpbmQoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0S2luZChTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyk7CisgIH0KKwogICBwdWJsaWMgY2xhc3MgTWVkaWFDb2RlYyB7CiAgICAgY3RvciBwdWJsaWMgTWVkaWFDb2RlYygpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkFsaWFzPiBnZXRBbGlhc19vcHRpb25hbCgpOwpAQCAtNzMsOSArODMsMTEgQEAKICAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRFbmFibGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuRmVhdHVyZT4gZ2V0RmVhdHVyZV9vcHRpb25hbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkxpbWl0PiBnZXRMaW1pdF9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLk1hcHBpbmc+IGdldE1hcHBpbmdfb3B0aW9uYWwoKTsKICAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuUXVpcms+IGdldFF1aXJrX29wdGlvbmFsKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0UmFuaygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlR1bmluZz4gZ2V0VHVuaW5nX29wdGlvbmFsKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlR5cGU+IGdldFR5cGVfb3B0aW9uYWwoKTsKICAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRVcGRhdGUoKTsKQEAgLTEyNSw2ICsxMzcsMTQgQEAKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5nPiBnZXRWYXJpYW50X29wdGlvbmFsKCk7CiAgIH0KIAorICBwdWJsaWMgY2xhc3MgVHVuaW5nIHsKKyAgICBjdG9yIHB1YmxpYyBUdW5pbmcoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcpOworICB9CisKICAgcHVibGljIGNsYXNzIFR5cGUgewogICAgIGN0b3IgcHVibGljIFR5cGUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5BbGlhcz4gZ2V0QWxpYXMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9tZWRpYV9jb2RlY3MueHNkIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QKaW5kZXggM2I1NjgxZi4uYzlhN2VmYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QKQEAgLTYzLDYgKzYzLDggQEAKICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFsaWFzIiB0eXBlPSJBbGlhcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgogICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTGltaXQiIHR5cGU9IkxpbWl0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CiAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGZWF0dXJlIiB0eXBlPSJGZWF0dXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNYXBwaW5nIiB0eXBlPSJNYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUdW5pbmciIHR5cGU9IlR1bmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgogICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0iVmFyaWFudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgogICAgICAgICA8L3hzOmNob2ljZT4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KQEAgLTEyMiw2ICsxMjQsMTUgQEAKICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzOnN0cmluZyIvPgogICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1hcHBpbmciPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImtpbmQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUdW5pbmciPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgogICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJJbmNsdWRlIj4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhNTJmMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlhNTFBhcnNlclRlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiWE1MUGFyc2VyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGRhdGE6IFsiOnhtbHBhcnNlcnRlc3RfdGVzdF9maWxlcyIsXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAieG1scGFyc2VydGVzdF90ZXN0X2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCIsCisgICAgICAgICJ0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMWIxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgeG1sIHBhcnNlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJYTUxQYXJzZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sLT4vZGF0YS9sb2NhbC90bXAvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im1lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iWE1MUGFyc2VyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IlhNTFBhcnNlclRlc3QiIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzYzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzMyBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFhNTCBQYXJzZXIKK1RoZSBYTUxQYXJzZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIFhNTFBhcnNlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIFhNTFBhcnNlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvWE1MUGFyc2VyVGVzdC9YTUxQYXJzZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogWE1MUGFyc2VyVGVzdAorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL1hNTFBhcnNlclRlc3QKK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgWE1MUGFyc2VyVGVzdAorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjlkOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcApAQCAtMCwwICsxLDQyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiWE1MUGFyc2VyVGVzdCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgiCisKKyNkZWZpbmUgWE1MX0ZJTEVfTkFNRSAibWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBDb2RlY1Byb3BlcnRpZXMgeworICAgIHN0cmluZyBjb2RlY05hbWU7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyBjb2RlY1Byb3A7Cit9OworCitzdHJ1Y3QgUm9sZVByb3BlcnRpZXMgeworICAgIHN0cmluZyByb2xlTmFtZTsKKyAgICBzdHJpbmcgdHlwZU5hbWU7CisgICAgc3RyaW5nIGNvZGVjTmFtZTsKKyAgICBib29sIGlzRW5jb2RlcjsKKyAgICBzaXplX3Qgb3JkZXI7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBhdHRyaWJ1dGVNYXA7Cit9OworCitjbGFzcyBYTUxQYXJzZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIH5YTUxQYXJzZVRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBtSW5wdXREYXRhVmVjdG9yLmNsZWFyKCk7CisgICAgICAgIG1JbnB1dFJvbGVWZWN0b3IuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldFVwRGF0YWJhc2UoKTsgfQorCisgICAgdm9pZCBzZXRVcERhdGFiYXNlKCk7CisKKyAgICB2b2lkIHNldENvZGVjUHJvcGVydGllcyhzdHJpbmcgY29kZWNOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwgc2V0PHN0cmluZz4gcXVpcmtTZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gZG9tYWluU2V0LCBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBkb21haW4sIHZlY3RvcjxzdHJpbmc+IGFsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJhbmspOworCisgICAgdm9pZCBzZXRSb2xlUHJvcGVydGllcyhzdHJpbmcgcm9sZU5hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29kZWNOYW1lLCB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGRvbWFpbik7CisKKyAgICB2b2lkIHNldFNlcnZpY2VBdHRyaWJ1dGUobWFwPHN0cmluZywgc3RyaW5nPiBzZXJ2aWNlQXR0cmlidXRlTmFtZVZhbHVlUGFpcik7CisKKyAgICB2b2lkIHByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYyk7CisKKyAgICB2b2lkIGNoZWNrUm9sZU1hcChpbnQzMl90IGluZGV4LCBib29sIGlzRW5jb2Rlciwgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0ck1hcCk7CisKKyAgICBib29sIGNvbXBhcmVNYXAoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmbGhzLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZyaHMpOworCisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBtUGFyc2VyOworICAgIHZlY3RvcjxDb2RlY1Byb3BlcnRpZXM+IG1JbnB1dERhdGFWZWN0b3I7CisgICAgdmVjdG9yPFJvbGVQcm9wZXJ0aWVzPiBtSW5wdXRSb2xlVmVjdG9yOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcDsKK307CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRVcERhdGFiYXNlKCkgeworICAgIC8vIFRoZSB2YWx1ZXMgc2V0IGJlbG93IGFyZSBzcGVjaWZpYyB0byB0ZXN0IHZlY3RvciB0ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbAorICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDEuZGVjb2RlciIsIGZhbHNlLCAxLCB7ImF0dHJpYnV0ZTo6ZGlzYWJsZWQiLCAicXVpcms6OnF1aXJrMSJ9LAorICAgICAgICAgICAgICAgICAgICAgICB7InRlbGVwaG9ueSJ9LCB7fSwgImF1ZGlvL21wZWciLCB7fSwgeyJhbGlhczEuZGVjb2RlciJ9LCAiNCIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0Mi5kZWNvZGVyIiwgZmFsc2UsIDIsIHsicXVpcms6OnF1aXJrMSJ9LCB7fSwge30sICJhdWRpby8zZ3BwIiwge30sIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QzLmRlY29kZXIiLCBmYWxzZSwgMywge30sIHt9LCB7fSwgImF1ZGlvL2Ftci13YiIsCisgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUyIiwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMyIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q0LmRlY29kZXIiLCBmYWxzZSwgNCwge30sIHt9LCB7fSwgImF1ZGlvL2ZsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKX0sIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q1LmRlY29kZXIiLCBmYWxzZSwgNSwgeyJhdHRyaWJ1dGU6OmF0dHJpYnV0ZVF1aXJrMSJ9LCB7fSwge30sCisgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9nNzExLW1sYXciLCB7fSwge30sICIiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDYuZGVjb2RlciIsIGZhbHNlLCA2LCB7fSwge30sIHsidmFyaWFudDEiLCAidmFyaWFudDIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvL21wNGEtbGF0bSIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0MS1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDFNaW4tdmFyaWFudDFMaW1pdDFNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQyLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50Mjo6OnZhcmlhbnQyTGltaXQxIiwgInZhcmlhbnQyTGltaXQxVmFsdWUiKX0sCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoCisgICAgICAgICAgICAidGVzdDcuZGVjb2RlciIsIGZhbHNlLCA3LCB7fSwge30sIHt9LCAiYXVkaW8vdm9yYmlzIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oIi1taW4tbGltaXQxIiwgImxpbWl0MU1pbiIpLAorICAgICAgICAgICAgICAgICAgICAvKnBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDEtaW4iLCAibGltaXQxSW4iKSwqLworICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXJhbmdlIiwgImxpbWl0Mk1pbi1saW1pdDJNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1zY2FsZSIsICJsaW1pdDJTY2FsZSIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLWRlZmF1bHQiLCAibGltaXQzVmFsMyIpLAorICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLXJhbmdlcyIsICJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q4LmVuY29kZXIiLCB0cnVlLCA4LCB7fSwge30sIHt9LCAiYXVkaW8vb3B1cyIsCisgICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigibWF4LWxpbWl0MSIsICJsaW1pdDFNYXgiKX0sIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q5LmVuY29kZXIiLCB0cnVlLCA5LCB7fSwge30sIHt9LCAidmlkZW8vYXZjIiwKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJtYXBwaW5nLXN1cmUtYmVmb3JlIiwgImFmdGVyIiksCisgICAgICAgICAgIH0sCisgICAgICAgICAgIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QxMC5lbmNvZGVyIiwgdHJ1ZSwgMTAsIHt9LCB7fSwge30sICJ2aWRlby9oZXZjIiwKKyAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJtYXBwaW5nLWZpcmUtZnJvbSIsICJ0byIpLAorICAgICAgICAgICB9LAorICAgICAgICAgICB7fSwgIiIpOworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDExLmVuY29kZXIiLCB0cnVlLCAxMSwge30sIHt9LCB7fSwgInZpZGVvL2F2MDEiLAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInR1bmluZy1odW5ncnkiLCAieWVzIiksCisgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInR1bmluZy1waSIsICIzLjE0MTUiKSwKKyAgICAgICAgICAgfSwKKyAgICAgICAgICAge30sICIiKTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLm1wMyIsIGZhbHNlLCAxLCAiYXVkaW8vbXBlZyIsICJ0ZXN0MS5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImF0dHJpYnV0ZTo6ZGlzYWJsZWQiLCAicHJlc2VudCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigicmFuayIsICI0Iil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmFtcm5iIiwgZmFsc2UsIDIsICJhdWRpby8zZ3BwIiwgInRlc3QyLmRlY29kZXIiLCB7fSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci5hbXJ3YiIsIGZhbHNlLCAzLCAiYXVkaW8vYW1yLXdiIiwgInRlc3QzLmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMSIsICJmZWF0dXJlMVZhbCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMiIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUzIiwgIjAiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvL2ZsYWMiLCBmYWxzZSwgNCwgImF1ZGlvL2ZsYWMiLCAidGVzdDQuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUxIiwgImZlYXR1cmUxVmFsIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmc3MTFtbGF3IiwgZmFsc2UsIDUsICJhdWRpby9nNzExLW1sYXciLCAidGVzdDUuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJhdHRyaWJ1dGU6OmF0dHJpYnV0ZVF1aXJrMSIsICJwcmVzZW50Iil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmFhYyIsIGZhbHNlLCA2LCAiYXVkaW8vbXA0YS1sYXRtIiwgInRlc3Q2LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0MS1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0MU1pbi12YXJpYW50MUxpbWl0MU1heCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0Mi1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQyOjo6dmFyaWFudDJMaW1pdDEiLCAidmFyaWFudDJMaW1pdDFWYWx1ZSIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZGVjb2Rlci52b3JiaXMiLCBmYWxzZSwgNywgImF1ZGlvL3ZvcmJpcyIsICJ0ZXN0Ny5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oIi1taW4tbGltaXQxIiwgImxpbWl0MU1pbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAvKnBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDEtaW4iLCAibGltaXQxSW4iKSwqLworICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXJhbmdlIiwgImxpbWl0Mk1pbi1saW1pdDJNYXgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1zY2FsZSIsICJsaW1pdDJTY2FsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLWRlZmF1bHQiLCAibGltaXQzVmFsMyIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQzLXJhbmdlcyIsICJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW9fZW5jb2Rlci5vcHVzIiwgdHJ1ZSwgOCwgImF1ZGlvL29wdXMiLCAidGVzdDguZW5jb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJtYXgtbGltaXQxIiwgImxpbWl0MU1heCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygidmlkZW9fZW5jb2Rlci5hdmMiLCB0cnVlLCA5LCAidmlkZW8vYXZjIiwgInRlc3Q5LmVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oIm1hcHBpbmctc3VyZS1iZWZvcmUiLCAiYWZ0ZXIiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoInZpZGVvX2VuY29kZXIuaGV2YyIsIHRydWUsIDEwLCAidmlkZW8vaGV2YyIsICJ0ZXN0MTAuZW5jb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAgIHsgcGFpcjxzdHJpbmcsIHN0cmluZz4oIm1hcHBpbmctZmlyZS1mcm9tIiwgInRvIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJ2aWRlb19lbmNvZGVyLmF2MDEiLCB0cnVlLCAxMSwgInZpZGVvL2F2MDEiLCAidGVzdDExLmVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oInR1bmluZy1odW5ncnkiLCAieWVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidHVuaW5nLXBpIiwgIjMuMTQxNSIpCisgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgc2V0U2VydmljZUF0dHJpYnV0ZSgKKyAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiZG9tYWluLXRlbGVwaG9ueSIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJkb21haW4tdHYiLCAiMCIpLAorICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJzZXR0aW5nMiIsICIwIiksIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50LXZhcmlhbnQxIiwgIjAiKX0pOworfQorCitib29sIFhNTFBhcnNlVGVzdDo6Y29tcGFyZU1hcChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZsaHMsIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnJocykgeworICAgIHJldHVybiBsaHMuc2l6ZSgpID09IHJocy5zaXplKCkgJiYgZXF1YWwobGhzLmJlZ2luKCksIGxocy5lbmQoKSwgcmhzLmJlZ2luKCkpOworfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0Q29kZWNQcm9wZXJ0aWVzKHN0cmluZyBjb2RlY05hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya1NldCwgc2V0PHN0cmluZz4gZG9tYWluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8c3RyaW5nPiB2YXJpYW50U2V0LCBzdHJpbmcgdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gZG9tYWluLCB2ZWN0b3I8c3RyaW5nPiBhbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmFuaykgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gQXR0cmlidXRlTWFwREI7CisgICAgZm9yIChjb25zdCBhdXRvICZBdHRyU3RyIDogZG9tYWluKSB7CisgICAgICAgIEF0dHJpYnV0ZU1hcERCLmluc2VydChBdHRyU3RyKTsKKyAgICB9CisgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcERhdGFCYXNlOworICAgIFR5cGVNYXBEYXRhQmFzZS5pbnNlcnQoCisgICAgICAgICAgICBwYWlyPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4odHlwZU5hbWUsIEF0dHJpYnV0ZU1hcERCKSk7CisgICAgQ29kZWNQcm9wZXJ0aWVzIGNvZGVjUHJvcGVydHk7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY05hbWUgPSBjb2RlY05hbWU7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLm9yZGVyID0gb3JkZXI7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AucXVpcmtTZXQgPSBxdWlya1NldDsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5kb21haW5TZXQgPSBkb21haW5TZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudmFyaWFudFNldCA9IHZhcmlhbnRTZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AudHlwZU1hcCA9IFR5cGVNYXBEYXRhQmFzZTsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5hbGlhc2VzID0gYWxpYXNlczsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5yYW5rID0gcmFuazsKKyAgICBtSW5wdXREYXRhVmVjdG9yLnB1c2hfYmFjayhjb2RlY1Byb3BlcnR5KTsKK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldFJvbGVQcm9wZXJ0aWVzKHN0cmluZyByb2xlTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0cmlidXRlTmFtZVZhbHVlUGFpcikgeworICAgIHN0cnVjdCBSb2xlUHJvcGVydGllcyByb2xlUHJvcGVydHk7CisgICAgcm9sZVByb3BlcnR5LnJvbGVOYW1lID0gcm9sZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LnR5cGVOYW1lID0gdHlwZU5hbWU7CisgICAgcm9sZVByb3BlcnR5LmNvZGVjTmFtZSA9IGNvZGVjTmFtZTsKKyAgICByb2xlUHJvcGVydHkuaXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIHJvbGVQcm9wZXJ0eS5vcmRlciA9IG9yZGVyOworICAgIHJvbGVQcm9wZXJ0eS5hdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVOYW1lVmFsdWVQYWlyOworICAgIG1JbnB1dFJvbGVWZWN0b3IucHVzaF9iYWNrKHJvbGVQcm9wZXJ0eSk7Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRTZXJ2aWNlQXR0cmlidXRlKG1hcDxzdHJpbmcsIHN0cmluZz4gc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNlcnZpY2VBdHRyU3RyIDogc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICAgICAgbUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoc2VydmljZUF0dHJTdHIpOworICAgIH0KK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnByaW50Q29kZWNNYXAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjIG1jb2RlYykgeworICAgIGNvbnN0IHN0cmluZyAmbmFtZSA9IG1jb2RlYy5maXJzdDsKKyAgICBBTE9HVigiY29kZWMgbmFtZSA9ICVzXG4iLCBuYW1lLmNfc3RyKCkpOworICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgJnByb3BlcnRpZXMgPSBtY29kZWMuc2Vjb25kOworICAgIGJvb2wgaXNFbmNvZGVyID0gcHJvcGVydGllcy5pc0VuY29kZXI7CisgICAgQUxPR1YoImlzRW5jb2RlciA9ICVkXG4iLCBpc0VuY29kZXIpOworICAgIHNpemVfdCBvcmRlciA9IHByb3BlcnRpZXMub3JkZXI7CisgICAgQUxPR1YoIm9yZGVyID0gJXp1XG4iLCBvcmRlcik7CisgICAgc3RyaW5nIHJhbmsgPSBwcm9wZXJ0aWVzLnJhbms7CisgICAgQUxPR1YoInJhbmsgPSAlc1xuIiwgcmFuay5jX3N0cigpKTsKKworICAgIGZvciAoYXV0byAmaXRyUXVpcmtTZXQgOiBwcm9wZXJ0aWVzLnF1aXJrU2V0KSB7CisgICAgICAgIEFMT0dWKCJxdWlya1NldD0gJXMiLCBpdHJRdWlya1NldC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gJml0ckRvbWFpblNldCA6IHByb3BlcnRpZXMuZG9tYWluU2V0KSB7CisgICAgICAgIEFMT0dWKCJkb21haW5TZXQ9ICVzIiwgaXRyRG9tYWluU2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIGZvciAoYXV0byAmaXRyVmFyaWFudFNldCA6IHByb3BlcnRpZXMudmFyaWFudFNldCkgeworICAgICAgICBBTE9HVigidmFyaWFudFNldD0gJXMiLCBpdHJWYXJpYW50U2V0LmNfc3RyKCkpOworICAgIH0KKworICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXAgPSBwcm9wZXJ0aWVzLnR5cGVNYXA7CisgICAgQUxPR1YoIlRoZSBUeXBlTWFwIGlzIDoiKTsKKworICAgIGZvciAoYXV0byAmaXRyVHlwZU1hcCA6IFR5cGVNYXApIHsKKyAgICAgICAgQUxPR1YoIml0clR5cGVNYXAtPmZpcnN0XHQlc1x0IiwgaXRyVHlwZU1hcC5maXJzdC5jX3N0cigpKTsKKworICAgICAgICBmb3IgKGF1dG8gJml0ckF0dHJpYnV0ZU1hcCA6IGl0clR5cGVNYXAuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HVigiQXR0cmlidXRlTWFwLT5maXJzdCA9ICVzIiwgaXRyQXR0cmlidXRlTWFwLmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZU1hcC0+c2Vjb25kID0gJXMiLCBpdHJBdHRyaWJ1dGVNYXAuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6Y2hlY2tSb2xlTWFwKGludDMyX3QgaW5kZXgsIGJvb2wgaXNFbmNvZGVyLCBzdHJpbmcgdHlwZU5hbWUsIHN0cmluZyBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gQXR0cmlidXRlUGFpck1hcCkgeworICAgIEFTU0VSVF9FUShpc0VuY29kZXIsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmlzRW5jb2RlcikKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gSXNFbmNvZGVyIG1pc21hdGNoIjsKKyAgICBBU1NFUlRfRVEodHlwZU5hbWUsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLnR5cGVOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiB0eXBlTmFtZSBtaXNtYXRjaCI7CisgICAgQVNTRVJUX0VRKGNvZGVjTmFtZSwgbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuY29kZWNOYW1lKQorICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBjb2RlY05hbWUgbWlzbWF0Y2giOworCisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcERCID0KKyAgICAgICAgICAgIChtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXApLmJlZ2luKCk7CisgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+Pjo6aXRlcmF0b3IgaXRyX2F0dHJpYnV0ZU1hcCA9IEF0dHJpYnV0ZVBhaXJNYXAuYmVnaW4oKTsKKyAgICBmb3IgKDsgaXRyX2F0dHJpYnV0ZU1hcCAhPSBBdHRyaWJ1dGVQYWlyTWFwLmVuZCgpICYmCisgICAgICAgICAgIGl0cl9hdHRyaWJ1dGVNYXBEQiAhPSBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5hdHRyaWJ1dGVNYXAuZW5kKCk7CisgICAgICAgICArK2l0cl9hdHRyaWJ1dGVNYXAsICsraXRyX2F0dHJpYnV0ZU1hcERCKSB7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lID0gaXRyX2F0dHJpYnV0ZU1hcC0+Zmlyc3Q7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVOYW1lREIgPSBpdHJfYXR0cmlidXRlTWFwREItPmZpcnN0OworICAgICAgICBzdHJpbmcgYXR0cmlidXRldmFsdWUgPSBpdHJfYXR0cmlidXRlTWFwLT5zZWNvbmQ7CisgICAgICAgIHN0cmluZyBhdHRyaWJ1dGVWYWx1ZURCID0gaXRyX2F0dHJpYnV0ZU1hcERCLT5zZWNvbmQ7CisgICAgICAgIEFTU0VSVF9FUShhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgbmFtZSBtaXNtYXRjaFx0IiA8PCBhdHRyaWJ1dGVOYW1lIDw8ICIgIT0gIgorICAgICAgICAgICAgICAgIDw8ICJhdHRyaWJ1dGVOYW1lREIiOworICAgICAgICBBU1NFUlRfRVEoYXR0cmlidXRldmFsdWUsIGF0dHJpYnV0ZVZhbHVlREIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgUm9sZU1hcCBkYXRhLiBBdHRyaWJ1dGUgdmFsdWUgbWlzbWF0Y2hcdCIgPDwgYXR0cmlidXRldmFsdWUgPDwgIiAhPSAiCisgICAgICAgICAgICAgICAgPDwgImF0dHJpYnV0ZVZhbHVlREIiOworICAgIH0KK30KKworVEVTVF9GKFhNTFBhcnNlVGVzdCwgQ29kZWNNYXBQYXJzZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgWE1MX0ZJTEVfTkFNRTsKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5wdXRmaWxlICIgPDwgaW5wdXRGaWxlTmFtZTsKKworICAgIG1QYXJzZXIucGFyc2VYbWxQYXRoKGlucHV0RmlsZU5hbWUpOworICAgIGZvciAoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjICZtY29kZWMgOiBtUGFyc2VyLmdldENvZGVjTWFwKCkpIHsKKyAgICAgICAgcHJpbnRDb2RlY01hcChtY29kZWMpOworICAgICAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbWNvZGVjLnNlY29uZDsKKyAgICAgICAgaW50MzJfdCBpbmRleCA9IHByb3BlcnRpZXMub3JkZXIgLSAxOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApIDw8ICJJbnZhbGlkIG9yZGVyIjsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjTmFtZSwgbWNvZGVjLmZpcnN0LmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gY29kZWNOYW1lIG1pc21hdGNoIjsKKyAgICAgICAgQVNTRVJUX0VRKHByb3BlcnRpZXMuaXNFbmNvZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AuaXNFbmNvZGVyKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIGlzRW5jb2RlciBtaXNtYXRjaCI7CisgICAgICAgIEFTU0VSVF9FUShwcm9wZXJ0aWVzLm9yZGVyLCBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3Aub3JkZXIpCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gb3JkZXIgbWlzbWF0Y2giOworCisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0REIgPSBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AucXVpcmtTZXQ7CisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrU2V0ID0gcHJvcGVydGllcy5xdWlya1NldDsKKyAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtEaWZmZXJlbmNlOworICAgICAgICBzZXRfZGlmZmVyZW5jZShxdWlya1NldERCLmJlZ2luKCksIHF1aXJrU2V0REIuZW5kKCksIHF1aXJrU2V0LmJlZ2luKCksIHF1aXJrU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlcihxdWlya0RpZmZlcmVuY2UsIHF1aXJrRGlmZmVyZW5jZS5lbmQoKSkpOworICAgICAgICBBU1NFUlRfRVEocXVpcmtEaWZmZXJlbmNlLnNpemUoKSwgMCkgPDwgIkNvZGVjTWFwOnF1aXJrIG1pc21hdGNoIjsKKworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwREIgPQorICAgICAgICAgICAgICAgIG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwID0gcHJvcGVydGllcy50eXBlTWFwOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXBEQiA9IFR5cGVNYXBEQi5iZWdpbigpOworICAgICAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPjo6aXRlcmF0b3IgaXRyX1R5cGVNYXAgPSBUeXBlTWFwLmJlZ2luKCk7CisKKyAgICAgICAgQVNTRVJUX0VRKFR5cGVNYXBEQi5zaXplKCksIFR5cGVNYXAuc2l6ZSgpKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIFR5cGVtYXAgc2l6ZSBtaXNtYXRjaCI7CisKKyAgICAgICAgZm9yICg7IGl0cl9UeXBlTWFwICE9IFR5cGVNYXAuZW5kKCkgJiYgaXRyX1R5cGVNYXBEQiAhPSBUeXBlTWFwREIuZW5kKCk7CisgICAgICAgICAgICAgKytpdHJfVHlwZU1hcCwgKytpdHJfVHlwZU1hcERCKSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoaXRyX1R5cGVNYXAtPmZpcnN0LCBpdHJfVHlwZU1hcERCLT5maXJzdCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gdHlwZSBtaXNtYXRjaCI7CisgICAgICAgICAgICBib29sIGZsYWcgPSBjb21wYXJlTWFwKGl0cl9UeXBlTWFwLT5zZWNvbmQsIGl0cl9UeXBlTWFwREItPnNlY29uZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmbGFnKSA8PCAidHlwZU1hcCBtaXNtYXRjaCI7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dERhdGFWZWN0b3IuYXQoaW5kZXgpLmNvZGVjUHJvcC5yYW5rLCBwcm9wZXJ0aWVzLnJhbmspCisgICAgICAgICAgICAgICAgPDwgIkludmFsaWQgQ29kZWNNYXAgZGF0YS4gcmFuayBtaXNtYXRjaCI7CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBSb2xlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKworICAgIGZvciAoYXV0byAmbVJvbGUgOiBtUGFyc2VyLmdldFJvbGVNYXAoKSkgeworICAgICAgICB0eXBlZGVmIHBhaXI8c3RyaW5nLCBzdHJpbmc+IEF0dHJpYnV0ZTsKKyAgICAgICAgY29uc3Qgc3RyaW5nICZyb2xlTmFtZSA9IG1Sb2xlLmZpcnN0OworICAgICAgICBBTE9HVigiUm9sZSBtYXA6bmFtZSA9ICVzXG4iLCByb2xlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbVJvbGUuc2Vjb25kOworICAgICAgICBzdHJpbmcgdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiB0eXBlID0gJXNcbiIsIHR5cGUuY19zdHIoKSk7CisKKyAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBwcm9wZXJ0aWVzLmlzRW5jb2RlcjsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOiBpc0VuY29kZXIgPSAlZFxuIiwgaXNFbmNvZGVyKTsKKworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz4gbm9kZUxpc3QgPSBwcm9wZXJ0aWVzLm5vZGVMaXN0OworICAgICAgICBtdWx0aW1hcDxzaXplX3QsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbz46Oml0ZXJhdG9yIGl0cl9Ob2RlOworICAgICAgICBBTE9HVigiXG5UaGUgbXVsdGltYXAgbm9kZUxpc3QgaXMgOiBcbiIpOworICAgICAgICBmb3IgKGl0cl9Ob2RlID0gbm9kZUxpc3QuYmVnaW4oKTsgaXRyX05vZGUgIT0gbm9kZUxpc3QuZW5kKCk7ICsraXRyX05vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJpdHJfTm9kZS0+Zmlyc3Q9T1JERVI9XHQlenVcdCIsIGl0cl9Ob2RlLT5maXJzdCk7CisgICAgICAgICAgICBpbnQzMl90IGluZGV4ID0gaXRyX05vZGUtPmZpcnN0IC0gMTsKKyAgICAgICAgICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpOb2RlSW5mbyBub2RlUHRyID0gaXRyX05vZGUtPnNlY29uZDsKKyAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDppdHJfTm9kZS0+c2Vjb25kLm5hbWUgPSAlc1xuIiwgbm9kZVB0ci5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgdmVjdG9yPEF0dHJpYnV0ZT4gYXR0ckxpc3QgPSBub2RlUHRyLmF0dHJpYnV0ZUxpc3Q7CisgICAgICAgICAgICBmb3IgKGF1dG8gYXR0ck5hbWVWYWx1ZUxpc3QgPSBhdHRyTGlzdC5iZWdpbigpOyBhdHRyTmFtZVZhbHVlTGlzdCAhPSBhdHRyTGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICAgKythdHRyTmFtZVZhbHVlTGlzdCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPmZpcnN0ID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVWYWx1ZUxpc3QtPmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJSb2xlIG1hcDpub2RlUHRyLmF0dHJpYnV0ZUxpc3QtPnNlY29uZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lVmFsdWVMaXN0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1JvbGVNYXAoaW5kZXgsIGlzRW5jb2RlciwgcHJvcGVydGllcy50eXBlLCBub2RlUHRyLm5hbWUuY19zdHIoKSwgYXR0ckxpc3QpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoWE1MUGFyc2VUZXN0LCBTZXJ2aWNlQXR0cmlidXRlTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKyAgICBjb25zdCBhdXRvIHNlcnZpY2VBdHRyaWJ1dGVNYXAgPSBtUGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZVBhaXIgOiBzZXJ2aWNlQXR0cmlidXRlTWFwKSB7CisgICAgICAgIEFMT0dWKCJzZXJ2aWNlQXR0cmlidXRlLmtleSA9ICVzIFx0IHNlcnZpY2VBdHRyaWJ1dGUudmFsdWUgPSAlcyIsCisgICAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXIuZmlyc3QuY19zdHIoKSwgYXR0cmlidXRlUGFpci5zZWNvbmQuY19zdHIoKSk7CisgICAgfQorICAgIGJvb2wgZmxhZyA9IGNvbXBhcmVNYXAobUlucHV0U2VydmljZUF0dHJpYnV0ZU1hcCwgc2VydmljZUF0dHJpYnV0ZU1hcCk7CisgICAgQVNTRVJUX1RSVUUoZmxhZykgPDwgIlNlcnZpY2VNYXBQYXJzZVRlc3Q6IHR5cGVNYXAgbWlzbWF0Y2giOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIlhNTCBQYXJzZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhMDllNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fWE1MX1BBUlNFUl9URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgWE1MUGFyc2VyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhZTQyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFJFRkVSRU5DRSA6IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QgLS0+Cis8SW5jbHVkZWQ+CisgICAgPFNldHRpbmdzPgorICAgICAgICA8RG9tYWluIG5hbWU9InRlbGVwaG9ueSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxEb21haW4gbmFtZT0idHYiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MSIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgICAgIDxTZXR0aW5nIG5hbWU9InNldHRpbmcxIiB2YWx1ZT0ic2V0dGluZ1ZhbHVlMSIgdXBkYXRlPSJ0cnVlIiAvPgorICAgICAgICA8U2V0dGluZyBuYW1lPSJzZXR0aW5nMiIgZW5hYmxlZD0iZmFsc2UiIC8+CisgICAgPC9TZXR0aW5ncz4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIGVuYWJsZWQsIGRvbWFpbiwgcmFuayBhbmQgdXBkYXRlIHByb3BlcnRpZXMgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3QxLmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wZWciIHVwZGF0ZT0iZmFsc2UiIGRvbWFpbj0idGVsZXBob255IiBlbmFibGVkPSJmYWxzZSIgcmFuaz0iNCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iYWxpYXMxLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIFF1aXJrIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0Mi5kZWNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIiBlbmFibGVkPSJ0cnVlIiA+CisgICAgICAgICAgICA8UXVpcmsgbmFtZT0icXVpcmsxIiB2YWx1ZT0icXVpcmsxVmFsdWUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEZlYXR1cmUgLS0+CisgICAgICAgIDwhLS0gZmVhdHVyZTIgdGFrZXMgdmFsdWUgMCAoZmVhdHVyZSB3aXRoIHNhbWUgbmFtZSB0YWtlcyBsb3dlciBmZWF0dXJlJ3MgdmFsdWUpIC0tPgorICAgICAgICA8IS0tIGZlYXR1cmUzIGdpdmVzIHZhbHVlIGFzIDAgc2luY2UgaXQncyBvcHRpb25hbCAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIGlzIG5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLiAtLT4KKyAgICAgICAgPCEtLSBvcHRpb25hbD0iZmFsc2UiIHJlcXVpcmVkPSJmYWxzZSIgaXMgbm90IGEgdmFsaWQgY29tYmluYXRpb24uIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0My5kZWNvZGVyIiB0eXBlPSJhdWRpby9hbXItd2IiID4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUxIiB2YWx1ZT0iZmVhdHVyZTFWYWwiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgdmFsdWU9ImZlYXR1cmUyVmFsIi8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMiIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImZlYXR1cmUzIiBvcHRpb25hbD0idHJ1ZSIgcmVxdWlyZWQ9ImZhbHNlIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVHlwZSAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDQuZGVjb2RlciI+CisgICAgICAgICAgICA8VHlwZSBuYW1lPSJhdWRpby9mbGFjIj4KKyAgICAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMSIgdmFsdWU9ImZlYXR1cmUxVmFsIiAvPgorICAgICAgICAgICAgPC9UeXBlPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgQXR0cmlidXRlIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0NS5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciID4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlUXVpcmsxIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVmFyaWFudCAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDYuZGVjb2RlciIgdHlwZT0iYXVkaW8vbXA0YS1sYXRtIiB2YXJpYW50PSJ2YXJpYW50MSx2YXJpYW50MiIgPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0idmFyaWFudDEiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJ2YXJpYW50MUxpbWl0MSIgbWluPSJ2YXJpYW50MUxpbWl0MU1pbiIgbWF4PSJ2YXJpYW50MUxpbWl0MU1heCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0idmFyaWFudDFMaW1pdDIiIHJhbmdlPSJ2YXJpYW50MUxpbWl0Mkxvdy12YXJpYW50MUxpbWl0MkhpZ2giIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJ2YXJpYW50MiI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InZhcmlhbnQyTGltaXQxIiB2YWx1ZT0idmFyaWFudDJMaW1pdDFWYWx1ZSIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIExpbWl0IC0tPgorICAgICAgICA8IS0tICdpbicgaXMgcHJlc2VudCBpbiB4c2QgZmlsZSBidXQgbm90IGhhbmRsZWQgaW4gTWVkaWFDb2RlY3NYbWxQYXJzZXIgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyIgPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgaW49ImxpbWl0MUluIiBtaW49ImxpbWl0MU1pbiIvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MiIgbWluPSJsaW1pdDJNaW4iIG1heD0ibGltaXQyTWF4IiBzY2FsZT0ibGltaXQyU2NhbGUiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ibGltaXQzIiByYW5nZXM9ImxpbWl0M1ZhbDEsbGltaXQzVmFsMixsaW1pdDNWYWwzIiBkZWZhdWx0PSJsaW1pdDNWYWwzIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9EZWNvZGVycz4KKyAgICA8RW5jb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q4LmVuY29kZXIiIHR5cGU9ImF1ZGlvL29wdXMiPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MSIgbWF4PSJsaW1pdDFNYXgiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBNYXBwaW5nIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0OS5lbmNvZGVyIiB0eXBlPSJ2aWRlby9hdmMiID4KKyAgICAgICAgICAgIDxNYXBwaW5nIGtpbmQ9InN1cmUiIG5hbWU9ImJlZm9yZSIgdmFsdWU9ImFmdGVyIi8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDEwLmVuY29kZXIiIHR5cGU9InZpZGVvL2hldmMiID4KKyAgICAgICAgICAgIDxNYXBwaW5nIGtpbmQ9ImZpcmUiIG5hbWU9ImZyb20iIHZhbHVlPSJ0byIvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDwhLS0gZW50cnkgZm9yIHRlc3RpbmcgVHVuaW5nIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0MTEuZW5jb2RlciIgdHlwZT0idmlkZW8vYXYwMSIgPgorICAgICAgICAgICAgPFR1bmluZyBuYW1lPSJodW5ncnkiIHZhbHVlPSJ5ZXMiLz4KKyAgICAgICAgICAgIDxUdW5pbmcgbmFtZT0icGkiIHZhbHVlPSIzLjE0MTUiLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjRjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwKQEAgLTAsMCArMSw0IEBACis8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEluY2x1ZGUgLS0+Cis8TWVkaWFDb2RlY3M+CisgICAgPEluY2x1ZGUgaHJlZj0ibWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiIC8+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwCmluZGV4IDEzMmNlODIuLjFlMzZjOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX2xpYnN0YWdlZnJpZ2h0X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogInZ0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjkwYmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MKLWluY2x1ZGUgdGVzdC92dHMvdG9vbHMvYnVpbGQvQW5kcm9pZC5ob3N0X2NvbmZpZy5tawpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlZTEwNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWRUZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBWVFMgVnRzVmFsaWRhdGVNZWRpYUNvZGVjcy4iPgotICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+Ci0gICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX2NvZGVjcy54c2QtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3MueHNkIi8+Ci0gICAgPC90YXJnZXRfcHJlcGFyZXI+Ci0gICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLlZ0c011bHRpRGV2aWNlVGVzdCI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1tb2R1bGUtbmFtZSIgdmFsdWU9IlZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MiLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfNjRiaXQ6OkRBVEEvbmF0aXZldGVzdDY0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXR5cGUiIHZhbHVlPSJndGVzdCIvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjMwcyIvPgotICAgIDwvdGVzdD4KLTwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJ3YXRjaGRvZy9BbmRyb2lkLmJwCmluZGV4IDFhODc4MjQuLjQxMWMyMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYndhdGNoZG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlid2F0Y2hkb2cvQW5kcm9pZC5icApAQCAtMTIsOCArMTIsMTggQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJ3YXRjaGRvZyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc3JjczogWwogICAgICAgICAiV2F0Y2hkb2cuY3BwIiwKICAgICBdLApAQCAtMjksNiArMzksMTEgQEAKICAgICAgICAgZGFyd2luOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKKyAgICAgICAgbGludXhfZ2xpYmM6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItRHNpZ2V2X25vdGlmeV90aHJlYWRfaWQ9X3NpZ2V2X3VuLl90aWQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKICAgICB9LAogICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icCBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKaW5kZXggYWZjYTdjNC4uZTI1NjU4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjEgQEAKIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbWVkaWFfbWVkaWFzZXJ2ZXJfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9tZWRpYXNlcnZlcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnJlZ2lzdGVybXNleHQiLAogICAgIHNyY3M6IFsicmVnaXN0ZXIuY3BwIl0sCkBAIC0xNyw2ICszNCw3IEBACiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJsaWJhbmRyb2lkaWN1IiwKKyAgICAgICAgImxpYmZtcSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKQEAgLTM0LDggKzUyLDEzIEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKICAgICBdLAogCi0gICAgLy8gYmFjayB0byAzMi1iaXQsIGIvMTI2NTAyNjEzCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICAvLyBCeSBkZWZhdWx0IG1lZGlhc2VydmVyIHJ1bnMgaW4gMzItYml0IHRvIHNhdmUgbWVtb3J5LCBleGNlcHQKKyAgICAvLyBvbiA2NC1iaXQtb25seSBsdW5jaCB0YXJnZXRzLgorICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvLyBUTyBFTkFCTEUgNjQtQklUIE1FRElBU0VSVkVSIE9OIE1JWEVEIDMyLzY0LUJJVCBERVZJQ0VTLCBDT01NRU5UCisgICAgLy8gT1VUIFRIRSBGT0xMT1dJTkcgTElORToKKyAgICAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgY29tcGlsZV9tdWx0aWxpYjogInByZWZlcjMyIiwKIAogICAgIGluaXRfcmM6IFsibWVkaWFzZXJ2ZXIucmMiXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAppbmRleCAzMTY3MzJiLi41OGUyZDJhIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBMT0dfVEFHICJtZWRpYXNlcnZlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPGFpY3UvQUljdS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CkBAIC0zOSw3ICszOCw2IEBACiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwotICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7CiAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwgYi9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwKaW5kZXggZjIzZWQ0NC4uYTViNDg5NiAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFuaWZlc3RfbWVkaWFfYzJfc29mdHdhcmUueG1sCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21hbmlmZXN0X21lZGlhX2MyX3NvZnR3YXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKICAgICA8aGFsPgogICAgICAgICA8bmFtZT5hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyPC9uYW1lPgogICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgogICAgICAgICA8aW50ZXJmYWNlPgogICAgICAgICAgICAgPG5hbWU+SUNvbXBvbmVudFN0b3JlPC9uYW1lPgogICAgICAgICAgICAgPGluc3RhbmNlPnNvZnR3YXJlPC9pbnN0YW5jZT4KZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggNjZhMzEzOS4uOTdlMmEyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDIzIEBACiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC8vCiAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIl0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm10cCIsCiAgICAgc3JjczogWwpAQCAtNTIsNSArNjksNSBAQAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnVzYmhvc3QiLAogICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsibGliY3V0aWxzX2hlYWRlcnMiXSwKIH0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oIGIvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCmluZGV4IDgxZmE2MGMuLjNiOWJiYjAgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaAorKysgYi9tZWRpYS9tdHAvSU10cERhdGFiYXNlLmgKQEAgLTM5LDcgKzM5LDcgQEAKICAgICAvLyBDYWxsZWQgdG8gcmVwb3J0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgU2VuZE9iamVjdCBmaWxlIHRyYW5zZmVyLgogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5kU2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2NlZWRlZCkgPSAwOwotICAgIAorCiAgICAgLy8gQ2FsbGVkIHRvIHJlc2NhbiBhIGZpbGUsIHN1Y2ggYXMgYWZ0ZXIgYW4gZWRpdC4KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIHJlc2NhbkZpbGUoY29uc3QgY2hhciogcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKQEAgLTkxLDYgKzkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgb3V0RmlsZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0Rm9ybWF0JiBvdXRGb3JtYXQpID0gMDsKIAorICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgICAgICAgICAgb3BlbkZpbGVQYXRoKGNvbnN0IGNoYXIqIHBhdGgsIGJvb2wgdHJhbnNjb2RlKSA9IDA7CisKICAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGJlZ2luRGVsZXRlT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZERlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgPSAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcCBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCmluZGV4IDk2NjVjNTguLjViZThlZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCisrKyBiL21lZGlhL210cC9NdHBEZXZpY2UuY3BwCkBAIC02MDgsNiArNjA4LDMyIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK2Jvb2wgTXRwRGV2aWNlOjpzZXREZXZpY2VQcm9wVmFsdWVTdHIoTXRwUHJvcGVydHkqIHByb3BlcnR5KSB7CisgICAgaWYgKHByb3BlcnR5ID09IG51bGxwdHIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOworCisgICAgaWYgKHByb3BlcnR5LT5nZXREYXRhVHlwZSgpICE9IE1UUF9UWVBFX1NUUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVJlcXVlc3QucmVzZXQoKTsKKyAgICBtUmVxdWVzdC5zZXRQYXJhbWV0ZXIoMSwgcHJvcGVydHktPmdldFByb3BlcnR5Q29kZSgpKTsKKworICAgIG1EYXRhLnJlc2V0KCk7CisgICAgbURhdGEucHV0U3RyaW5nKHByb3BlcnR5LT5nZXRDdXJyZW50VmFsdWUoKS5zdHIpOworCisgICBpZiAoc2VuZFJlcXVlc3QoTVRQX09QRVJBVElPTl9TRVRfREVWSUNFX1BST1BfVkFMVUUpICYmIHNlbmREYXRhKCkpIHsKKyAgICAgICAgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOworICAgICAgICBpZiAocmV0ICE9IE1UUF9SRVNQT05TRV9PSykgeworICAgICAgICAgICAgQUxPR1coIiVzOiBSZXNwb25zZT0weCUwNFhcbiIsIF9fZnVuY19fLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBNdHBQcm9wZXJ0eSogTXRwRGV2aWNlOjpnZXRPYmplY3RQcm9wRGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBjb2RlLCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxnKG1NdXRleCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBEZXZpY2UuaCBiL21lZGlhL210cC9NdHBEZXZpY2UuaAppbmRleCAwMWJjM2RiLi5iMWIzMGU0IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKKysrIGIvbWVkaWEvbXRwL010cERldmljZS5oCkBAIC0xMTIsNiArMTEyLDcgQEAKICAgICBNdHBPYmplY3RQcm9wZXJ0eUxpc3QqICBnZXRPYmplY3RQcm9wc1N1cHBvcnRlZChNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKIAogICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldERldmljZVByb3BEZXNjKE10cERldmljZVByb3BlcnR5IGNvZGUpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNldERldmljZVByb3BWYWx1ZVN0cihNdHBQcm9wZXJ0eSogcHJvcGVydHkpOwogICAgIE10cFByb3BlcnR5KiAgICAgICAgICAgIGdldE9iamVjdFByb3BEZXNjKE10cE9iamVjdFByb3BlcnR5IGNvZGUsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOwogCiAgICAgLy8gUmVhZHMgdmFsdWUgb2YgfHByb3BlcnR5fCBmb3IgfGhhbmRsZXwuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAppbmRleCBiZDZhNmM2Li4yZmZkNzc1IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcApAQCAtNzQsNiArNzQsNyBAQAogCiBNdHBGZnNIYW5kbGU6Ok10cEZmc0hhbmRsZShpbnQgY29udHJvbEZkKSB7CiAgICAgbUNvbnRyb2wucmVzZXQoY29udHJvbEZkKTsKKyAgICBtQmF0Y2hDYW5jZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInN5cy51c2IubXRwLmJhdGNoY2FuY2VsIiwgZmFsc2UpOwogfQogCiBNdHBGZnNIYW5kbGU6On5NdHBGZnNIYW5kbGUoKSB7fQpAQCAtMTE0LDExICsxMTUsMTEgQEAKIHZvaWQgTXRwRmZzSGFuZGxlOjphZHZpc2UoaW50IGZkKSB7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE5VTV9JT19CVUZTOyBpKyspIHsKICAgICAgICAgaWYgKHBvc2l4X21hZHZpc2UobUlvYnVmW2ldLmJ1ZnMuZGF0YSgpLCBNQVhfRklMRV9DSFVOS19TSVpFLAotICAgICAgICAgICAgICAgIFBPU0lYX01BRFZfU0VRVUVOVElBTCB8IFBPU0lYX01BRFZfV0lMTE5FRUQpIDwgMCkKKyAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSAhPSAwKQogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtYWR2aXNlIjsKICAgICB9CiAgICAgaWYgKHBvc2l4X2ZhZHZpc2UoZmQsIDAsIDAsCi0gICAgICAgICAgICAgICAgUE9TSVhfRkFEVl9TRVFVRU5USUFMIHwgUE9TSVhfRkFEVl9OT1JFVVNFIHwgUE9TSVhfRkFEVl9XSUxMTkVFRCkgPCAwKQorICAgICAgICAgICAgICAgIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSB8IFBPU0lYX0ZBRFZfV0lMTE5FRUQpICE9IDApCiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZmFkdmlzZSI7CiB9CiAKQEAgLTM3MCw3ICszNzEsNyBAQAogfQogCiBpbnQgTXRwRmZzSGFuZGxlOjpjYW5jZWxFdmVudHMoc3RydWN0IGlvY2IgKippb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKmV2ZW50cywgdW5zaWduZWQgc3RhcnQsCi0gICAgICAgIHVuc2lnbmVkIGVuZCkgeworICAgICAgICB1bnNpZ25lZCBlbmQsIGJvb2wgaXNfYmF0Y2hfY2FuY2VsKSB7CiAgICAgLy8gU29tZSBtYW5wYWdlcyBmb3IgaW9fY2FuY2VsIGFyZSBvdXQgb2YgZGF0ZSBhbmQgaW5jb3JyZWN0LgogICAgIC8vIGlvX2NhbmNlbCB3aWxsIHJldHVybiAtRUlOUFJPR1JFU1Mgb24gc3VjY2VzcyBhbmQgZG9lcwogICAgIC8vIG5vdCBwbGFjZSB0aGUgZXZlbnQgaW4gdGhlIGdpdmVuIG1lbW9yeS4gV2UgaGF2ZSB0byB1c2UKQEAgLTM4Niw2ICszODcsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG51bV9ldmVudHMrKzsKICAgICAgICAgfQorICAgICAgICBpZiAoaXNfYmF0Y2hfY2FuY2VsICYmIG51bV9ldmVudHMgPT0gMSkgeworICAgICAgICAgICAgbnVtX2V2ZW50cyA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG51bV9ldmVudHMgIT0gZW5kIC0gc3RhcnQpIHsKICAgICAgICAgcmV0ID0gLTE7CkBAIC00OTUsNyArNTAwLDggQEAKICAgICAgICAgICAgICAgICBudW1fZXZlbnRzICs9IHRoaXNfZXZlbnRzOwogCiAgICAgICAgICAgICAgICAgaWYgKGV2ZW50X3JldCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBjYW5jZWxFdmVudHMobUlvYnVmW2ldLmlvY2IuZGF0YSgpLCBpb2V2cywgbnVtX2V2ZW50cywgbUlvYnVmW2ldLmFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbEV2ZW50cyhtSW9idWZbaV0uaW9jYi5kYXRhKCksIGlvZXZzLCBudW1fZXZlbnRzLCBtSW9idWZbaV0uYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXRjaENhbmNlbCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0ICs9IGV2ZW50X3JldDsKQEAgLTUxMiw3ICs1MTgsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaG9ydF9wYWNrZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FuY2VsRXZlbnRzKG1Jb2J1ZltpXS5pb2NiLmRhdGEoKSwgaW9ldnMsIHNob3J0X2ksIG1Jb2J1ZltpXS5hY3R1YWwpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbEV2ZW50cyhtSW9idWZbaV0uaW9jYi5kYXRhKCksIGlvZXZzLCBzaG9ydF9pLCBtSW9idWZbaV0uYWN0dWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgbUJhdGNoQ2FuY2VsKSkgewogICAgICAgICAgICAgICAgICAgICB3cml0ZV9lcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjEzLDcgKzYyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2V2ZW50cykgIT0gcmV0KSB7CiAgICAgICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgIGNhbmNlbEV2ZW50cyhtSW9idWZbKGktMSklTlVNX0lPX0JVRlNdLmlvY2IuZGF0YSgpLCBpb2V2cywgbnVtX2V2ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jb2J1ZlsoaS0xKSVOVU1fSU9fQlVGU10uYWN0dWFsLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBoYXNfd3JpdGUgPSBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5oCmluZGV4IGZlMzQzZjcuLmU1NTJlMDMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuaAorKysgYi9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgX01UUF9GRlNfSEFORExFX0gKICNkZWZpbmUgX01UUF9GRlNfSEFORExFX0gKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Fpb19hYmkuaD4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTU3LDYgKzU4LDcgQEAKICAgICBzdGF0aWMgaW50IGdldFBhY2tldFNpemUoaW50IGZmc19mZCk7CiAKICAgICBib29sIG1DYW5jZWxlZDsKKyAgICBib29sIG1CYXRjaENhbmNlbDsKIAogICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBtQ29udHJvbDsKICAgICAvLyAiaW4iIGZyb20gdGhlIGhvc3QncyBwZXJzcGVjdGl2ZSA9PiBzaW5rIGZvciBtdHAgc2VydmVyCkBAIC03Niw3ICs3OCw4IEBACiAgICAgaW50IGlvYnVmU3VibWl0KHN0cnVjdCBpb19idWZmZXIgKmJ1ZiwgaW50IGZkLCB1bnNpZ25lZCBsZW5ndGgsIGJvb2wgcmVhZCk7CiAKICAgICAvLyBDYW5jZWwgc3VibWl0dGVkIHJlcXVlc3RzIGZyb20gc3RhcnQgdG8gZW5kIGluIHRoZSBnaXZlbiBhcnJheS4gUmV0dXJuIDAgb3IgLTEuCi0gICAgaW50IGNhbmNlbEV2ZW50cyhzdHJ1Y3QgaW9jYiAqKmlvY2IsIHN0cnVjdCBpb19ldmVudCAqZXZlbnRzLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKKyAgICBpbnQgY2FuY2VsRXZlbnRzKHN0cnVjdCBpb2NiICoqaW9jYiwgc3RydWN0IGlvX2V2ZW50ICpldmVudHMsIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQsCisJCSAgICAgYm9vbCBpc19iYXRjaF9jYW5jZWwpOwogCiAgICAgLy8gV2FpdCBmb3IgYXQgbWluaW11bSB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGV2ZW50cy4gUmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHJldHVybmVkCiAgICAgLy8gZXZlbnRzLiBJbmNyZW1lbnRzIGNvdW50ZXIgYnkgdGhlIG51bWJlciBvZiBldmVudHMgcmV0dXJuZWQuCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUGFja2V0LmNwcCBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCmluZGV4IDNiMjk4YTkuLmYwNjlhODMgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCisrKyBiL21lZGlhL210cC9NdHBQYWNrZXQuY3BwCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5lbmRwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+YnVmZmVyX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwKTsKICAgICByZXF1ZXN0LT5hY3R1YWxfbGVuZ3RoID0gcmVzdWx0OwogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwIGIvbWVkaWEvbXRwL010cFByb3BlcnR5LmNwcAppbmRleCA1YzAyYTBkLi45OGEyYWQzIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuY3BwCisrKyBiL21lZGlhL210cC9NdHBQcm9wZXJ0eS5jcHAKQEAgLTI0MCw2ICsyNDAsMTYgQEAKICAgICAgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOwogfQogCit2b2lkIE10cFByb3BlcnR5OjpzZXRDdXJyZW50VmFsdWUoY29uc3QgY2hhciogc3RyaW5nKSB7CisgICAgZnJlZShtQ3VycmVudFZhbHVlLnN0cik7CisgICAgaWYgKHN0cmluZykgeworICAgICAgICBNdHBTdHJpbmdCdWZmZXIgYnVmZmVyKHN0cmluZyk7CisgICAgICAgIG1DdXJyZW50VmFsdWUuc3RyID0gc3RyZHVwKGJ1ZmZlcik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOworfQorCiB2b2lkIE10cFByb3BlcnR5OjpzZXRDdXJyZW50VmFsdWUoTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CiAgICAgZnJlZShtQ3VycmVudFZhbHVlLnN0cik7CiAgICAgbUN1cnJlbnRWYWx1ZS5zdHIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFByb3BlcnR5LmggYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaAppbmRleCBiZmQ1ZjdmLi4zNmQ3MzYwIDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaAorKysgYi9tZWRpYS9tdHAvTXRwUHJvcGVydHkuaApAQCAtOTEsNiArOTEsNyBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoY29uc3QgdWludDE2X3QqIHN0cmluZyk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDdXJyZW50VmFsdWUoY29uc3QgdWludDE2X3QqIHN0cmluZyk7CisgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDdXJyZW50VmFsdWUoY29uc3QgY2hhciogc3RyaW5nKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNldEN1cnJlbnRWYWx1ZShNdHBEYXRhUGFja2V0JiBwYWNrZXQpOwogICAgIGNvbnN0IE10cFByb3BlcnR5VmFsdWUmIGdldEN1cnJlbnRWYWx1ZSgpIHsgcmV0dXJuIG1DdXJyZW50VmFsdWU7IH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAppbmRleCA4Njc3YjkwLi42ZmNmMTE5IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcApAQCAtNzkwLDExICs3OTAsNDAgQEAKICAgICBhdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAKICAgICBjb25zdCBjaGFyKiBmaWxlUGF0aCA9IChjb25zdCBjaGFyICopcGF0aEJ1ZjsKLSAgICBtdHBfZmlsZV9yYW5nZSAgbWZyOwotICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKLSAgICBpZiAobWZyLmZkIDwgMCkgewotICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CisgICAgbXRwX2ZpbGVfcmFuZ2UgbWZyOworICAgIHN0cnVjdCBzdGF0IHNzdGF0OworICAgIHVpbnQ2NF90IGZpbmFsc2l6ZTsKKyAgICBib29sIHRyYW5zY29kZSA9IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgic3lzLmZ1c2UudHJhbnNjb2RlX210cCIsIGZhbHNlKTsKKyAgICBib29sIGZpbGVQYXRoQWNjZXNzID0gdHJ1ZTsKKyAgICBBTE9HRCgiTXRwIHRyYW5zY29kZSA9ICVkIiwgdHJhbnNjb2RlKTsKKworICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBvbmx5IGF0dGVtcHQgYSBDb250ZW50UmVzb2x2ZXIgb3BlbiB3aGVuIHRyYW5zY29kZSBpcyByZXF1aXJlZC4KKyAgICAvLyBUaGlzIGlzIGZpbmUgYXMgbG9uZyBhcyB3ZSBkb24ndCB0cmFuc2NvZGUgYnkgZGVmYXVsdCBvbiB0aGUgZGV2aWNlLiBJZiB3ZSBzdWRkZW5seQorICAgIC8vIHRyYW5zY29kZSBieSBkZWZhdWx0LCB3ZSdsbCBuZWVkIHRvIGVuc3VyZSB0aGF0IE1UUCBkb2Vzbid0IHRyYW5zY29kZSBieSBkZWZhdWx0IGFuZCB3ZQorICAgIC8vIG1pZ2h0IG5lZWQgdG8gbWFrZSBhIGJpbmRlciBjYWxsIHRvIGF2b2lkIHRyYW5zY29kaW5nIG9yIGNvbWUgdXAgd2l0aCBhIGJldHRlciBzdHJhdGVneS4KKyAgICBpZiAodHJhbnNjb2RlKSB7CisgICAgICAgIG1mci5mZCA9IG1EYXRhYmFzZS0+b3BlbkZpbGVQYXRoKGZpbGVQYXRoLCB0cnVlKTsKKyAgICAgICAgZnN0YXQobWZyLmZkLCAmc3N0YXQpOworICAgICAgICBmaW5hbHNpemUgPSBzc3RhdC5zdF9zaXplOworICAgICAgICBmaWxlTGVuZ3RoID0gZmluYWxzaXplOworICAgICAgICBpZiAobWZyLmZkIDwgMCkgeworICAgICAgICAgICAgQUxPR1coIk10cCBvcGVuIHZpYSBJTXRwRGF0YWJhc2UgZmFpbGVkIGZvciAlcy4gRmFsbGluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbCIsCisgICAgICAgICAgICAgICAgICBmaWxlUGF0aCk7CisgICAgICAgICAgICBmaWxlUGF0aEFjY2VzcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlUGF0aEFjY2VzcyA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQorCisgICAgaWYgKGZpbGVQYXRoQWNjZXNzKSB7CisgICAgICAgIG1mci5mZCA9IG9wZW4oZmlsZVBhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKG1mci5mZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfR0VORVJBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBmc3RhdChtZnIuZmQsICZzc3RhdCk7CisgICAgICAgIGZpbmFsc2l6ZSA9IHNzdGF0LnN0X3NpemU7CisgICAgfQorCiAgICAgbWZyLm9mZnNldCA9IDA7CiAgICAgbWZyLmxlbmd0aCA9IGZpbGVMZW5ndGg7CiAgICAgbWZyLmNvbW1hbmQgPSBtUmVxdWVzdC5nZXRPcGVyYXRpb25Db2RlKCk7CkBAIC04MTUsOSArODQ0LDYgQEAKIAogICAgIGF1dG8gZW5kID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CiAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZT4gZGlmZiA9IGVuZCAtIHN0YXJ0OwotICAgIHN0cnVjdCBzdGF0IHNzdGF0OwotICAgIGZzdGF0KG1mci5mZCwgJnNzdGF0KTsKLSAgICB1aW50NjRfdCBmaW5hbHNpemUgPSBzc3RhdC5zdF9zaXplOwogICAgIEFMT0dWKCJTZW50IGEgZmlsZSBvdmVyIE1UUC4gVGltZTogJWYgcywgU2l6ZTogJSIgUFJJdTY0ICIsIFJhdGU6ICVmIGJ5dGVzL3MiLAogICAgICAgICAgICAgZGlmZi5jb3VudCgpLCBmaW5hbHNpemUsICgoZG91YmxlKSBmaW5hbHNpemUpIC8gZGlmZi5jb3VudCgpKTsKICAgICBjbG9zZU9iakZkKG1mci5mZCwgZmlsZVBhdGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1MDIwOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS8vCi0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJtdHBfZmZzX2hhbmRsZV90ZXN0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBzcmNzOiBbIk10cEZmc0hhbmRsZV90ZXN0LmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYm10cCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi19Ci0KLWNjX3Rlc3QgewotICAgIG5hbWU6ICJwb3NpeF9hc3luY19pb190ZXN0IiwKLSAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKLSAgICBzcmNzOiBbIlBvc2l4QXN5bmNJT190ZXN0LmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJiYXNlIiwKLSAgICAgICAgImxpYm10cCIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2V4dHJhIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbXRwL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNDc1My4uMDAwMDAwMAotLS0gYS9tZWRpYS9tdHAvdGVzdHMvQW5kcm9pZFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJDb25maWcgZm9yIG10cF9mZnNfaGFuZGxlX3Rlc3QiPgotICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Im10cF9mZnNfaGFuZGxlX3Rlc3QtPi9kYXRhL2xvY2FsL3RtcC9tdHBfZmZzX2hhbmRsZV90ZXN0IiAvPgotICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgotICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJhcGN0IiAvPgotICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0ibXRwX2Zmc19oYW5kbGVfdGVzdCIgLz4KLSAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZVRlc3QvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVUZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YzdhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVUZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbXRwX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtdHBfZmZzX2hhbmRsZV90ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzcmNzOiBbIk10cEZmc0hhbmRsZV90ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYm10cCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiYWIyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9NdHBGZnNIYW5kbGVUZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgbXRwX2Zmc19oYW5kbGVfdGVzdCI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0ibXRwX2Zmc19oYW5kbGVfdGVzdC0+L2RhdGEvbG9jYWwvdG1wL210cF9mZnNfaGFuZGxlX3Rlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJtdHBfZmZzX2hhbmRsZV90ZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZmc0hhbmRsZVRlc3QvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9tdHAvdGVzdHMvTXRwRmZzSGFuZGxlVGVzdC9NdHBGZnNIYW5kbGVfdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY1ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9tdHBfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXRwX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibXRwX2Z1enplci5jcHAiLAorICAgICAgICAiTXRwTW9ja0RhdGFiYXNlLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworCSJsaWJtdHAiLAorCSJsaWJiYXNlIiwKKwkibGlibG9nIiwKKwkibGlidXRpbHMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLURNVFBfREVWSUNFIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKyAgICBkaWN0aW9uYXJ5OiAibXRwX2Z1enplci5kaWN0IiwKKyAgICBjb3JwdXM6IFsiY29ycHVzLyoiXSwKKworICAgIGZ1enpfY29uZmlnOiB7CisKKyAgICAgICAgY2M6IFsiamFtZXN3ZWlAZ29vZ2xlLmNvbSJdLAorICAgICAgICBjb21wb25lbnRpZDogMTM0NCwKKyAgICAgICAgYWNrbm93bGVkZ2VtZW50OiBbCisgICAgICAgICAgICAiR3JhbnQgSGVybmFuZGV6IG9mIEdvb2dsZSIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0RhdGFiYXNlLmNwcCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0RhdGFiYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFmZTMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9NdHBNb2NrRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRnV6emVyIgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiTXRwRGVidWcuaCIKKyNpbmNsdWRlICJNdHBNb2NrRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworTXRwTW9ja0RhdGFiYXNlOjpNdHBNb2NrRGF0YWJhc2UoKSA6IG1MYXN0T2JqZWN0SGFuZGxlKDApIHt9CisKK010cE1vY2tEYXRhYmFzZTo6fk10cE1vY2tEYXRhYmFzZSgpIHsKKyAgICBmb3IgKE10cE9iamVjdEluZm8qIGkgOiBtT2JqZWN0cykgeworICAgICAgICBkZWxldGUgaTsKKyAgICB9CisgICAgbU9iamVjdHMuY2xlYXIoKTsKK30KKwordm9pZCBNdHBNb2NrRGF0YWJhc2U6OmFkZE9iamVjdChNdHBPYmplY3RJbmZvKiBpbmZvKSB7CisgICAgYXNzZXJ0KGhhc1N0b3JhZ2UoaW5mby0+c3RvcmFnZUlEKSk7CisKKyAgICAvLyB3ZSB0YWtlIG93bmVyc2hpcAorICAgIG1PYmplY3RzLnB1c2hfYmFjayhpbmZvKTsKKworICAgIHJldHVybjsKK30KKworTXRwT2JqZWN0SGFuZGxlIE10cE1vY2tEYXRhYmFzZTo6YWxsb2NhdGVPYmplY3RIYW5kbGUoKSB7CisgICAgLy8gdGhpcyBpcyBpbiBzeW5jIHdpdGggb3VyIG1PYmplY3RzIGRhdGFiYXNlCisgICAgcmV0dXJuIG1MYXN0T2JqZWN0SGFuZGxlKys7Cit9CisKKy8vIENhbGxlZCBmcm9tIFNlbmRPYmplY3RJbmZvIHRvIHJlc2VydmUgYSBkYXRhYmFzZSBlbnRyeSBmb3IgdGhlIGluY29taW5nIGZpbGUuCitNdHBPYmplY3RIYW5kbGUgTXRwTW9ja0RhdGFiYXNlOjpiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RIYW5kbGUgcGFyZW50LCBNdHBTdG9yYWdlSUQgc3RvcmFnZSkgeworICAgIGlmICghaGFzU3RvcmFnZShzdG9yYWdlKSkgeworICAgICAgICBBTE9HVygiJXM6IFRyaWVkIHRvIGxvb2t1cCBzdG9yYWdlSUQgJXUsIGJ1dCBkb2Vzbid0IGV4aXN0XG4iLCBfX2Z1bmNfXywgc3RvcmFnZSk7CisgICAgICAgIHJldHVybiBrSW52YWxpZE9iamVjdEhhbmRsZTsKKyAgICB9CisKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBwYXRoPSVzIG9mb3JtYXQ9MHglMDR4IHBhcmVudF9oYW5kbGU9JXUgIgorICAgICAgICAgICJzdG9yYWdlX2lkPSV1XG4iLAorICAgICAgICAgIF9fZnVuY19fLCBwYXRoLCBmb3JtYXQsIHBhcmVudCwgc3RvcmFnZSk7CisKKyAgICByZXR1cm4gbUxhc3RPYmplY3RIYW5kbGU7Cit9CisKKy8vIENhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIuCit2b2lkIE10cE1vY2tEYXRhYmFzZTo6ZW5kU2VuZE9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBib29sIHN1Y2NlZWRlZCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgc3VjY2VlZGVkPSVkXG4iLCBfX2Z1bmNfXywgaGFuZGxlLCBzdWNjZWVkZWQpOworfQorCisvLyBDYWxsZWQgdG8gcmVzY2FuIGEgZmlsZSwgc3VjaCBhcyBhZnRlciBhbiBlZGl0Lgordm9pZCBNdHBNb2NrRGF0YWJhc2U6OnJlc2NhbkZpbGUoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHBhdGg9JXMgb2hhbmRsZT0ldSwgb2Zvcm1hdD0weCUwNHhcbiIsIF9fZnVuY19fLCBwYXRoLCBoYW5kbGUsIGZvcm1hdCk7Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBzdG9yYWdlX2lkPSV1IG9mb3JtYXQ9MHglMDR4IG9oYW5kbGU9JXVcbiIsIF9fZnVuY19fLCBzdG9yYWdlSUQsIGZvcm1hdCwKKyAgICAgICAgICBwYXJlbnQpOworICAgIHJldHVybiBudWxscHRyOworfQorCitpbnQgTXRwTW9ja0RhdGFiYXNlOjpnZXROdW1PYmplY3RzKE10cFN0b3JhZ2VJRCBzdG9yYWdlSUQsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBzdG9yYWdlX2lkPSV1IG9mb3JtYXQ9MHglMDR4IG9oYW5kbGU9JXVcbiIsIF9fZnVuY19fLCBzdG9yYWdlSUQsIGZvcm1hdCwKKyAgICAgICAgICBwYXJlbnQpOworICAgIC8vIFRPRE86IHJldHVybiBNVFBfUkVTUE9OU0VfT0sgd2hlbiBpdCBzdG9wcyBzZWdmYXVsdGluZworICAgIHJldHVybiAwOworfQorCisvLyBjYWxsZWUgc2hvdWxkIGRlbGV0ZVtdIHRoZSByZXN1bHRzIGZyb20gdGhlc2UKKy8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKK010cE9iamVjdEZvcm1hdExpc3QqIE10cE1vY2tEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkUGxheWJhY2tGb3JtYXRzKCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXNcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KK010cE9iamVjdEZvcm1hdExpc3QqIE10cE1vY2tEYXRhYmFzZTo6Z2V0U3VwcG9ydGVkQ2FwdHVyZUZvcm1hdHMoKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlc1xuIiwgX19mdW5jX18pOworICAgIHJldHVybiBudWxscHRyOworfQorTXRwT2JqZWN0UHJvcGVydHlMaXN0KiBNdHBNb2NrRGF0YWJhc2U6OmdldFN1cHBvcnRlZE9iamVjdFByb3BlcnRpZXMoTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9mb3JtYXQ9MHglMDR4XG4iLCBfX2Z1bmNfXywgZm9ybWF0KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KK010cERldmljZVByb3BlcnR5TGlzdCogTXRwTW9ja0RhdGFiYXNlOjpnZXRTdXBwb3J0ZWREZXZpY2VQcm9wZXJ0aWVzKCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXNcbiIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldSBwcm9wZXJ0eT0lc1xuIiwgX19mdW5jX18sIGhhbmRsZSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6c2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldSBwcm9wZXJ0eT0lc1xuIiwgX19mdW5jX18sIGhhbmRsZSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6Z2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcHJvcGVydHk9JXNcbiIsIF9fZnVuY19fLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6c2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwRGF0YVBhY2tldCYgcGFja2V0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcHJvcGVydHk9JXNcbiIsIF9fZnVuY19fLCBNdHBEZWJ1Zzo6Z2V0RGV2aWNlUHJvcENvZGVOYW1lKHByb3BlcnR5KSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6cmVzZXREZXZpY2VQcm9wZXJ0eShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHByb3BlcnR5PSVzXG4iLCBfX2Z1bmNfXywgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBNb2NrRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5TGlzdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcGVydHksIGludCBncm91cENvZGUsIGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IGZvcm1hdD0lcyBwcm9wZXJ0eT0lcyBncm91cENvZGU9JWQgIgorICAgICAgICAgICJkZXB0aD0lZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgaGFuZGxlLCBNdHBEZWJ1Zzo6Z2V0Rm9ybWF0Q29kZU5hbWUoZm9ybWF0KSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSwgZ3JvdXBDb2RlLCBkZXB0aCk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RJbmZvJiBpbmZvKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisKKyAgICAvLyB1c2VkIGZvciB0aGUgcm9vdAorICAgIGlmIChoYW5kbGUgPT0ga0ludmFsaWRPYmplY3RIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1PYmplY3RzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfT0JKRUNUX0hBTkRMRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgaXMgdXNlZCB0byBsZXQgdGhlIGZ1enplciBtYWtlIHByb2dyZXNzLCBvdGhlcndpc2UKKyAgICAgICAgLy8gaXQgaGFzIHRvIGJydXRlLWZvcmNlIGEgMzItYml0IGhhbmRsZQorICAgICAgICBNdHBPYmplY3RIYW5kbGUgcmVkdWNlZEhhbmRsZSA9IGhhbmRsZSAlIG1PYmplY3RzLnNpemUoKTsKKyAgICAgICAgTXRwT2JqZWN0SW5mbyogb2JqID0gbU9iamVjdHNbcmVkdWNlZEhhbmRsZV07CisKKyAgICAgICAgLy8gbWFrZSBhIGNvcHksIGJ1dCBtYWtlIHN1cmUgdG8gbWFpbnRhaW4gb3duZXJzaGlwIG9mIHN0cmluZyBwb2ludGVycworICAgICAgICBpbmZvID0gKm9iajsKKworICAgICAgICAvLyBmaXh1cCB0aGUgcmVzcG9uc2UgaGFuZGxlCisgICAgICAgIGluZm8ubUhhbmRsZSA9IGhhbmRsZTsKKworICAgICAgICBpZiAob2JqLT5tTmFtZSkgaW5mby5tTmFtZSA9IHN0cmR1cChvYmotPm1OYW1lKTsKKyAgICAgICAgaWYgKG9iai0+bUtleXdvcmRzKSBpbmZvLm1LZXl3b3JkcyA9IHN0cmR1cChvYmotPm1LZXl3b3Jkcyk7CisKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKKyAgICB9Cit9CisKK3ZvaWQqIE10cE1vY2tEYXRhYmFzZTo6Z2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHNpemVfdCYgb3V0VGh1bWJTaXplKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisKKyAgICBzaXplX3QgYWxsb2NTaXplID0gaGFuZGxlICUgMHgxMDAwOworICAgIHZvaWQqIGRhdGEgPSBjYWxsb2MoYWxsb2NTaXplLCBzaXplb2YodWludDhfdCkpOworICAgIGlmICghZGF0YSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIG91dFRodW1iU2l6ZSA9IGFsbG9jU2l6ZTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpnZXRPYmplY3RGaWxlUGF0aChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RyaW5nQnVmZmVyJiBvdXRGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QmIG91dEZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQmIG91dEZvcm1hdCkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXVcbiIsIF9fZnVuY19fLCBoYW5kbGUpOworCisgICAgaWYgKG1PYmplY3RzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9PQkpFQ1RfSEFORExFOworICAgIH0KKworICAgIC8vIHRoaXMgaXMgdXNlZCB0byBsZXQgdGhlIGZ1enplciBtYWtlIHByb2dyZXNzLCBvdGhlcndpc2UKKyAgICAvLyBpdCBoYXMgdG8gYnJ1dGUtZm9yY2UgYSAzMi1iaXQgaGFuZGxlCisgICAgTXRwT2JqZWN0SGFuZGxlIHJlZHVjZWRIYW5kbGUgPSBoYW5kbGUgJSBtT2JqZWN0cy5zaXplKCk7CisgICAgTXRwT2JqZWN0SW5mbyogb2JqID0gbU9iamVjdHNbcmVkdWNlZEhhbmRsZV07CisgICAgTXRwU3RvcmFnZSogc3RvcmFnZSA9IG1TdG9yYWdlW29iai0+bVN0b3JhZ2VJRF07CisKKyAgICAvLyB3YWxrIHVwIHRoZSB0cmVlIHRvIGJ1aWxkIGEgZnVsbCBwYXRoIG9mIHRoZSBvYmplY3QKKyAgICBNdHBPYmplY3RIYW5kbGUgY3VycmVudEhhbmRsZSA9IHJlZHVjZWRIYW5kbGU7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9ICIiOworCisgICAgd2hpbGUgKGN1cnJlbnRIYW5kbGUgIT0gTVRQX1BBUkVOVF9ST09UKSB7CisgICAgICAgIE10cE9iamVjdEluZm8qIG5leHQgPSBtT2JqZWN0c1tjdXJyZW50SGFuZGxlXTsKKworICAgICAgICAvLyBwcmVwZW5kIHRoZSBuYW1lCisgICAgICAgIGlmIChwYXRoID09ICIiKQorICAgICAgICAgICAgcGF0aCA9IHN0ZDo6c3RyaW5nKG5leHQtPm1OYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGF0aCA9IHN0ZDo6c3RyaW5nKG5leHQtPm1OYW1lKSArICIvIiArIHBhdGg7CisKKyAgICAgICAgY3VycmVudEhhbmRsZSA9IG5leHQtPm1QYXJlbnQ7CisgICAgfQorCisgICAgb3V0RmlsZVBhdGguc2V0KHN0b3JhZ2UtPmdldFBhdGgoKSk7CisgICAgb3V0RmlsZVBhdGguYXBwZW5kKCIvIik7CisgICAgb3V0RmlsZVBhdGguYXBwZW5kKHBhdGguY19zdHIoKSk7CisKKyAgICBvdXRGb3JtYXQgPSBvYmotPm1Gb3JtYXQ7CisKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBnZXQgZmlsZSAlc1xuIiwgX19mdW5jX18sIChjb25zdCBjaGFyKilvdXRGaWxlUGF0aCk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzc3RhdDsKKyAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyBvdXIgZGF0YWJhc2UgdmlldyBvZiB0aGUgZmlsZXN5c3RlbSBpcyBvdXQgb2YKKyAgICAvLyBzeW5jCisgICAgaWYgKHN0YXQoKGNvbnN0IGNoYXIqKW91dEZpbGVQYXRoLCAmc3N0YXQpIDwgMCkgeworICAgICAgICBBTE9HRSgiTW9ja0RhdGFiYXNlICVzOiB1bmFibGUgdG8gc3RhdCAlc1xuIiwgX19mdW5jX18sIChjb25zdCBjaGFyKilvdXRGaWxlUGF0aCk7CisKKyAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9JTlZBTElEX09CSkVDVF9IQU5ETEU7CisgICAgfQorCisgICAgb3V0RmlsZUxlbmd0aCA9IHNzdGF0LnN0X3NpemU7CisKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCitpbnQgTXRwTW9ja0RhdGFiYXNlOjpvcGVuRmlsZVBhdGgoY29uc3QgY2hhciogcGF0aCwgYm9vbCB0cmFuc2NvZGUpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBmaWxlUGF0aD0lcyB0cmFuc2NvZGU9JWRcbiIsIF9fZnVuY19fLCBwYXRoLCB0cmFuc2NvZGUpOworICAgIHJldHVybiAwOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpiZWdpbkRlbGV0ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KK3ZvaWQgTXRwTW9ja0RhdGFiYXNlOjplbmREZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IHN1Y2NlZWRlZD0lZFxuIiwgX19mdW5jX18sIGhhbmRsZSwgc3VjY2VlZGVkKTsKKyAgICByZXR1cm47Cit9CisKK010cE9iamVjdEhhbmRsZUxpc3QqIE10cE1vY2tEYXRhYmFzZTo6Z2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogb2hhbmRsZT0ldVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK010cFJlc3BvbnNlQ29kZSBNdHBNb2NrRGF0YWJhc2U6OnNldE9iamVjdFJlZmVyZW5jZXMoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogcmVmZXJlbmNlcykgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXVcbiIsIF9fZnVuY19fLCBoYW5kbGUpOworICAgIHJldHVybiBNVFBfUkVTUE9OU0VfT0s7Cit9CisKK010cFByb3BlcnR5KiBNdHBNb2NrRGF0YWJhc2U6OmdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBPYmplY3RGb3JtYXQgZm9ybWF0KSB7CisgICAgQUxPR0QoIk1vY2tEYXRhYmFzZSAlczogcHJvcGVydHk9JXMgZm9ybWF0PSVzXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSwgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOworCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK010cFByb3BlcnR5KiBNdHBNb2NrRGF0YWJhc2U6OmdldERldmljZVByb3BlcnR5RGVzYyhNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IHByb3BlcnR5PSVzXG4iLCBfX2Z1bmNfXywgTXRwRGVidWc6OmdldERldmljZVByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworICAgIHJldHVybiBudWxscHRyOworfQorCitNdHBSZXNwb25zZUNvZGUgTXRwTW9ja0RhdGFiYXNlOjpiZWdpbk1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgbmV3U3RvcmFnZSkgeworICAgIEFMT0dEKCJNb2NrRGF0YWJhc2UgJXM6IG9oYW5kbGU9JXUgbmV3UGFyZW50PSV1IG5ld1N0b3JhZ2U9JXVcbiIsIF9fZnVuY19fLCBoYW5kbGUsIG5ld1BhcmVudCwKKyAgICAgICAgICBuZXdTdG9yYWdlKTsKKyAgICByZXR1cm4gTVRQX1JFU1BPTlNFX09LOworfQorCit2b2lkIE10cE1vY2tEYXRhYmFzZTo6ZW5kTW92ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgb2xkUGFyZW50LCBNdHBPYmplY3RIYW5kbGUgbmV3UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG9sZFN0b3JhZ2UsIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvbGRQYXJlbnQ9JXUgbmV3UGFyZW50PSV1IG9sZFN0b3JhZ2U9JXUgbmV3U3RvcmFnZT0ldSAiCisgICAgICAgICAgIm9oYW5kbGU9JXUgc3VjY2VlZGVkPSVkXG4iLAorICAgICAgICAgIF9fZnVuY19fLCBvbGRQYXJlbnQsIG5ld1BhcmVudCwgb2xkU3RvcmFnZSwgbmV3U3RvcmFnZSwgaGFuZGxlLCBzdWNjZWVkZWQpOworICAgIHJldHVybjsKK30KKworTXRwUmVzcG9uc2VDb2RlIE10cE1vY2tEYXRhYmFzZTo6YmVnaW5Db3B5T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZSBuZXdQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IG5ld1BhcmVudD0ldSBuZXdTdG9yYWdlPSV1XG4iLCBfX2Z1bmNfXywgaGFuZGxlLCBuZXdQYXJlbnQsCisgICAgICAgICAgbmV3U3RvcmFnZSk7CisgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PSzsKK30KKwordm9pZCBNdHBNb2NrRGF0YWJhc2U6OmVuZENvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpIHsKKyAgICBBTE9HRCgiTW9ja0RhdGFiYXNlICVzOiBvaGFuZGxlPSV1IHN1Y2NlZWRlZD0lZFxuIiwgX19mdW5jX18sIGhhbmRsZSwgc3VjY2VlZGVkKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0RhdGFiYXNlLmggYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tEYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZTZhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tEYXRhYmFzZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgX01UUF9NT0NLX0RBVEFCQVNFX0gKKyNkZWZpbmUgX01UUF9NT0NLX0RBVEFCQVNFX0gKKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgIklNdHBEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cFN0b3JhZ2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNdHBNb2NrRGF0YWJhc2UgOiBwdWJsaWMgSU10cERhdGFiYXNlIHsKKyAgICBzdGQ6Om1hcDxNdHBTdG9yYWdlSUQsIE10cFN0b3JhZ2UqPiBtU3RvcmFnZTsKKyAgICBzdGQ6OnZlY3RvcjxNdHBPYmplY3RJbmZvKj4gbU9iamVjdHM7CisgICAgdWludDMyX3QgbUxhc3RPYmplY3RIYW5kbGU7CisKK3B1YmxpYzoKKyAgICBNdHBNb2NrRGF0YWJhc2UoKTsKKyAgICB2aXJ0dWFsIH5NdHBNb2NrRGF0YWJhc2UoKTsKKworICAgIC8vIE10cEZ1enplciBtZXRob2RzCisgICAgdm9pZCBhZGRTdG9yYWdlKE10cFN0b3JhZ2UqIHN0b3JhZ2UpIHsKKyAgICAgICAgLy8gd2UgZG9uJ3Qgb3duIHRoaXMKKyAgICAgICAgbVN0b3JhZ2Vbc3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCldID0gc3RvcmFnZTsKKyAgICB9CisKKyAgICBib29sIGhhc1N0b3JhZ2UoTXRwU3RvcmFnZUlEIHN0b3JhZ2UpIHsgcmV0dXJuIG1TdG9yYWdlLmZpbmQoc3RvcmFnZSkgIT0gbVN0b3JhZ2UuZW5kKCk7IH0KKworICAgIHZvaWQgYWRkT2JqZWN0KE10cE9iamVjdEluZm8qIGluZm8pOworICAgIE10cE9iamVjdEhhbmRsZSBhbGxvY2F0ZU9iamVjdEhhbmRsZSgpOworCisgICAgLy8gbGlibXRwIGludGVyZmFjZSBtZXRob2RzCisgICAgLy8gQ2FsbGVkIGZyb20gU2VuZE9iamVjdEluZm8gdG8gcmVzZXJ2ZSBhIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgaW5jb21pbmcKKyAgICAvLyBmaWxlLgorICAgIE10cE9iamVjdEhhbmRsZSBiZWdpblNlbmRPYmplY3QoY29uc3QgY2hhciogcGF0aCwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBwYXJlbnQsIE10cFN0b3JhZ2VJRCBzdG9yYWdlKTsKKworICAgIC8vIENhbGxlZCB0byByZXBvcnQgc3VjY2VzcyBvciBmYWlsdXJlIG9mIHRoZSBTZW5kT2JqZWN0IGZpbGUgdHJhbnNmZXIuCisgICAgdm9pZCBlbmRTZW5kT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGJvb2wgc3VjY2VlZGVkKTsKKworICAgIC8vIENhbGxlZCB0byByZXNjYW4gYSBmaWxlLCBzdWNoIGFzIGFmdGVyIGFuIGVkaXQuCisgICAgdm9pZCByZXNjYW5GaWxlKGNvbnN0IGNoYXIqIHBhdGgsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEZvcm1hdCBmb3JtYXQpOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogZ2V0T2JqZWN0TGlzdChNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudCk7CisKKyAgICBpbnQgZ2V0TnVtT2JqZWN0cyhNdHBTdG9yYWdlSUQgc3RvcmFnZUlELCBNdHBPYmplY3RGb3JtYXQgZm9ybWF0LCBNdHBPYmplY3RIYW5kbGUgcGFyZW50KTsKKworICAgIC8vIGNhbGxlZSBzaG91bGQgZGVsZXRlW10gdGhlIHJlc3VsdHMgZnJvbSB0aGVzZQorICAgIC8vIHJlc3VsdHMgY2FuIGJlIE5VTEwKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBnZXRTdXBwb3J0ZWRQbGF5YmFja0Zvcm1hdHMoKTsKKyAgICBNdHBPYmplY3RGb3JtYXRMaXN0KiBnZXRTdXBwb3J0ZWRDYXB0dXJlRm9ybWF0cygpOworICAgIE10cE9iamVjdFByb3BlcnR5TGlzdCogZ2V0U3VwcG9ydGVkT2JqZWN0UHJvcGVydGllcyhNdHBPYmplY3RGb3JtYXQgZm9ybWF0KTsKKyAgICBNdHBEZXZpY2VQcm9wZXJ0eUxpc3QqIGdldFN1cHBvcnRlZERldmljZVByb3BlcnRpZXMoKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBnZXRPYmplY3RQcm9wZXJ0eVZhbHVlKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdFByb3BlcnR5IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgc2V0T2JqZWN0UHJvcGVydHlWYWx1ZShNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBEYXRhUGFja2V0JiBwYWNrZXQpOworCisgICAgTXRwUmVzcG9uc2VDb2RlIGdldERldmljZVByb3BlcnR5VmFsdWUoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHksIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgc2V0RGV2aWNlUHJvcGVydHlWYWx1ZShNdHBEZXZpY2VQcm9wZXJ0eSBwcm9wZXJ0eSwgTXRwRGF0YVBhY2tldCYgcGFja2V0KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSByZXNldERldmljZVByb3BlcnR5KE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBnZXRPYmplY3RQcm9wZXJ0eUxpc3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJvcGVydHksIGludCBncm91cENvZGUsIGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cERhdGFQYWNrZXQmIHBhY2tldCk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgZ2V0T2JqZWN0SW5mbyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RJbmZvJiBpbmZvKTsKKworICAgIHZvaWQqIGdldFRodW1ibmFpbChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBzaXplX3QmIG91dFRodW1iU2l6ZSk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgZ2V0T2JqZWN0RmlsZVBhdGgoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwU3RyaW5nQnVmZmVyJiBvdXRGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgb3V0RmlsZUxlbmd0aCwgTXRwT2JqZWN0Rm9ybWF0JiBvdXRGb3JtYXQpOworCisgICAgaW50IG9wZW5GaWxlUGF0aChjb25zdCBjaGFyKiBwYXRoLCBib29sIHRyYW5zY29kZSk7CisKKyAgICBNdHBSZXNwb25zZUNvZGUgYmVnaW5EZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CisgICAgdm9pZCBlbmREZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworCisgICAgTXRwT2JqZWN0SGFuZGxlTGlzdCogZ2V0T2JqZWN0UmVmZXJlbmNlcyhNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBzZXRPYmplY3RSZWZlcmVuY2VzKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIE10cE9iamVjdEhhbmRsZUxpc3QqIHJlZmVyZW5jZXMpOworCisgICAgTXRwUHJvcGVydHkqIGdldE9iamVjdFByb3BlcnR5RGVzYyhNdHBPYmplY3RQcm9wZXJ0eSBwcm9wZXJ0eSwgTXRwT2JqZWN0Rm9ybWF0IGZvcm1hdCk7CisKKyAgICBNdHBQcm9wZXJ0eSogZ2V0RGV2aWNlUHJvcGVydHlEZXNjKE10cERldmljZVByb3BlcnR5IHByb3BlcnR5KTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBiZWdpbk1vdmVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKTsKKworICAgIHZvaWQgZW5kTW92ZU9iamVjdChNdHBPYmplY3RIYW5kbGUgb2xkUGFyZW50LCBNdHBPYmplY3RIYW5kbGUgbmV3UGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgb2xkU3RvcmFnZSwgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UsIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VjY2VlZGVkKTsKKworICAgIE10cFJlc3BvbnNlQ29kZSBiZWdpbkNvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgTXRwT2JqZWN0SGFuZGxlIG5ld1BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cFN0b3JhZ2VJRCBuZXdTdG9yYWdlKTsKKyAgICB2b2lkIGVuZENvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9NVFBfTU9DS19EQVRBQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tIYW5kbGUuaCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvTXRwTW9ja0hhbmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL010cE1vY2tIYW5kbGUuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTVRQX01PQ0tfSEFORExFX0gKKyNkZWZpbmUgX01UUF9NT0NLX0hBTkRMRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFja2V0X3Q7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK2NsYXNzIE10cE1vY2tIYW5kbGUgOiBwdWJsaWMgSU10cEhhbmRsZSB7Citwcml2YXRlOgorICAgIHNpemVfdCBtUGFja2V0TnVtYmVyOworICAgIHNpemVfdCBtUGFja2V0T2Zmc2V0OworICAgIHN0ZDo6dmVjdG9yPHBhY2tldF90PiBtUGFja2V0czsKKworcHVibGljOgorICAgIE10cE1vY2tIYW5kbGUoKSA6IG1QYWNrZXROdW1iZXIoMCksIG1QYWNrZXRPZmZzZXQoMCkge30KKworICAgIHZvaWQgYWRkX3BhY2tldChwYWNrZXRfdCBwa3QpIHsgbVBhY2tldHMucHVzaF9iYWNrKHBrdCk7IH0KKworICAgIC8vIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZC93cml0dGVuLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CisgICAgaW50IHJlYWQodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICAgICAgICBpZiAobVBhY2tldE51bWJlciA+PSBtUGFja2V0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJlYWRBbXQgPSAwOworICAgICAgICAgICAgcGFja2V0X3QgcGt0ID0gbVBhY2tldHNbbVBhY2tldE51bWJlcl07CisKKyAgICAgICAgICAgIEFMT0dEKCIlczogc3ogJXp1LCBwa3QgJXp1KyV6dS8lenVcbiIsIF9fZnVuY19fLCBsZW4sIG1QYWNrZXROdW1iZXIsIG1QYWNrZXRPZmZzZXQsCisgICAgICAgICAgICAgICAgICBwa3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gcGFja2V0IGlzIGJpZ2dlciB0aGFuIHdoYXQgdGhlIGNhbGxlciBjYW4gaGFuZGxlLAorICAgICAgICAgICAgaWYgKHBrdC5zaXplKCkgPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgcGt0LmRhdGEoKSArIG1QYWNrZXRPZmZzZXQsIGxlbik7CisKKyAgICAgICAgICAgICAgICBtUGFja2V0T2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgICAgICByZWFkQW10ID0gbGVuOworICAgICAgICAgICAgICAgIC8vIHBhY2tldCBpcyBlcXVhbCBvciBzbWFsbGVyIHRoYW4gdGhlIGNhbGxlciBidWZmZXIKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHBrdC5kYXRhKCkgKyBtUGFja2V0T2Zmc2V0LCBwa3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIG1QYWNrZXROdW1iZXIrKzsKKyAgICAgICAgICAgICAgICBtUGFja2V0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICByZWFkQW10ID0gcGt0LnNpemUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlYWRBbXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IHdyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICAgICAgQUxPR0QoIk1vY2tIYW5kbGUgJXM6IGxlbj0lenVcbiIsIF9fZnVuY19fLCBsZW4pOworICAgICAgICAvLyBmYWtlIHRoZSB3cml0ZQorICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIC8vIFJldHVybiAwIGlmIHNlbmQvcmVjZWl2ZSBpcyBzdWNjZXNzZnVsLCBvciAtMSBhbmQgZXJybm8gaXMgc2V0CisgICAgaW50IHJlY2VpdmVGaWxlKG10cF9maWxlX3JhbmdlIG1mciwgYm9vbCB6ZXJvX3BhY2tldCkgeworICAgICAgICBBTE9HRCgiTW9ja0hhbmRsZSAlc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IHNlbmRGaWxlKG10cF9maWxlX3JhbmdlIG1mcikgeworICAgICAgICBBTE9HRCgiTW9ja0hhbmRsZSAlc1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IHNlbmRFdmVudChtdHBfZXZlbnQgbWUpIHsKKyAgICAgICAgQUxPR0QoIk1vY2tIYW5kbGUgJXM6IGxlbj0lenVcbiIsIF9fZnVuY19fLCBtZS5sZW5ndGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gMCBpZiBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgb3IgLTEgZWxzZQorICAgIGludCBzdGFydChib29sIHB0cCkgeyByZXR1cm4gMDsgfQorCisgICAgdm9pZCBjbG9zZSgpIHt9CisKKyAgICB2aXJ0dWFsIH5NdHBNb2NrSGFuZGxlKCkge30KK307Cit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX01UUF9NT0NLX0hBTkRMRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8xLW10cC1vcGVuX3Nlc3Npb24ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMS1tdHAtb3Blbl9zZXNzaW9uLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY4ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMS1tdHAtb3Blbl9zZXNzaW9uLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8yLW10cC1nZXRfZGV2aWNlX2luZm8ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMi1tdHAtZ2V0X2RldmljZV9pbmZvLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzU5MzgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMi1tdHAtZ2V0X2RldmljZV9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy8zLW10cC1nZXRfb2JqZWN0X2hhbmRsZXMucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMy1tdHAtZ2V0X29iamVjdF9oYW5kbGVzLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg0MTBmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvMy1tdHAtZ2V0X29iamVjdF9oYW5kbGVzLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy80LW10cC1nZXRfb2JqZWN0X2luZm8ucGt0IGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvNC1tdHAtZ2V0X29iamVjdF9pbmZvLnBrdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjgzZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9jb3JwdXMvNC1tdHAtZ2V0X29iamVjdF9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy81LW10cC1zZW5kX29iamVjdF9pbmZvLnBrdCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvY29ycHVzLzUtbXRwLXNlbmRfb2JqZWN0X2luZm8ucGt0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MjdmODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL2NvcnB1cy81LW10cC1zZW5kX29iamVjdF9pbmZvLnBrdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9tdHBfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTc4NDYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL3Rlc3RzL010cEZ1enplci9tdHBfZnV6emVyLmNwcApAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNkZWZpbmUgTE9HX1RBRyAiTXRwRnV6emVyIgorCisjaW5jbHVkZSAiSU10cEhhbmRsZS5oIgorI2luY2x1ZGUgIk10cE1vY2tEYXRhYmFzZS5oIgorI2luY2x1ZGUgIk10cE1vY2tIYW5kbGUuaCIKKyNpbmNsdWRlICJNdHBPYmplY3RJbmZvLmgiCisjaW5jbHVkZSAiTXRwU2VydmVyLmgiCisjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgorI2luY2x1ZGUgIk10cFV0aWxzLmgiCisKK2NvbnN0IGNoYXIqIHN0b3JhZ2VfZGVzYyA9ICJGdXp6IFN0b3JhZ2UiOworLy8gcHJlZmVyIHRtcGZzIGZvciBmaWxlIG9wZXJhdGlvbnMgdG8gYXZvaWQgd2VhcmluZyBvdXQgZmxhc2gKK2NvbnN0IGNoYXIqIHN0b3JhZ2VfcGF0aCA9ICIvc3RvcmFnZS9mdXp6ZXIvMCI7Citjb25zdCBjaGFyKiBzb3VyY2VfZGF0YWJhc2UgPSAic3JjZGIvIjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgTXRwTW9ja1NlcnZlciB7CitwdWJsaWM6CisgICAgc3RkOjp1bmlxdWVfcHRyPE10cE1vY2tIYW5kbGU+IG1IYW5kbGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPE10cFN0b3JhZ2U+IG1TdG9yYWdlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNdHBNb2NrRGF0YWJhc2U+IG1EYXRhYmFzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TXRwU2VydmVyPiBtTXRwOworICAgIGludCBtU3RvcmFnZUlkOworCisgICAgTXRwTW9ja1NlcnZlcihjb25zdCBjaGFyKiBzdG9yYWdlX3BhdGgpIDogbVN0b3JhZ2VJZCgwKSB7CisgICAgICAgIGJvb2wgcHRwID0gZmFsc2U7CisgICAgICAgIGNvbnN0IGNoYXIqIG1hbnUgPSAiR29vZ2xlIjsKKyAgICAgICAgY29uc3QgY2hhciogbW9kZWwgPSAiUGl4ZWwgM1hMIjsKKyAgICAgICAgY29uc3QgY2hhciogdmVyc2lvbiA9ICIxLjAiOworICAgICAgICBjb25zdCBjaGFyKiBzZXJpYWwgPSAiQUJERUYxMjMxIjsKKworICAgICAgICAvLyBUaGlzIGlzIHVudXNlZCBpbiBvdXIgaGFybmVzcworICAgICAgICBpbnQgY29udHJvbEZkID0gLTE7CisKKyAgICAgICAgbUhhbmRsZSA9IHN0ZDo6bWFrZV91bmlxdWU8TXRwTW9ja0hhbmRsZT4oKTsKKyAgICAgICAgbVN0b3JhZ2UgPSBzdGQ6Om1ha2VfdW5pcXVlPE10cFN0b3JhZ2U+KG1TdG9yYWdlSWQsIHN0b3JhZ2VfcGF0aCwgc3RvcmFnZV9kZXNjLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMDBMKTsKKyAgICAgICAgbURhdGFiYXNlID0gc3RkOjptYWtlX3VuaXF1ZTxNdHBNb2NrRGF0YWJhc2U+KCk7CisgICAgICAgIG1EYXRhYmFzZS0+YWRkU3RvcmFnZShtU3RvcmFnZS5nZXQoKSk7CisKKyAgICAgICAgbU10cCA9IHN0ZDo6bWFrZV91bmlxdWU8TXRwU2VydmVyPihtRGF0YWJhc2UuZ2V0KCksIGNvbnRyb2xGZCwgcHRwLCBtYW51LCBtb2RlbCwgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWwpOworICAgICAgICBtTXRwLT5hZGRTdG9yYWdlKG1TdG9yYWdlLmdldCgpKTsKKworICAgICAgICAvLyBjbGVhciB0aGUgb2xkIGhhbmRsZSBmaXJzdCwgc28gd2UgZG9uJ3QgbGVhayBtZW1vcnkKKyAgICAgICAgZGVsZXRlIG1NdHAtPm1IYW5kbGU7CisgICAgICAgIG1NdHAtPm1IYW5kbGUgPSBtSGFuZGxlLmdldCgpOworICAgIH0KKworICAgIHZvaWQgcnVuKCkgeyBtTXRwLT5ydW4oKTsgfQorCisgICAgaW50IGNyZWF0ZURhdGFiYXNlRnJvbVNvdXJjZURpcihjb25zdCBjaGFyKiBmcm9tUGF0aCwgY29uc3QgY2hhciogdG9QYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwT2JqZWN0SGFuZGxlIHBhcmVudEhhbmRsZSkgeworICAgICAgICBpbnQgcmV0ID0gMDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZnJvbVBhdGhTdHIoZnJvbVBhdGgpOworICAgICAgICBzdGQ6OnN0cmluZyB0b1BhdGhTdHIodG9QYXRoKTsKKworICAgICAgICBESVIqIGRpciA9IG9wZW5kaXIoZnJvbVBhdGgpOworICAgICAgICBpZiAoIWRpcikgeworICAgICAgICAgICAgQUxPR0UoIm9wZW5kaXIgJXMgZmFpbGVkIiwgZnJvbVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChmcm9tUGF0aFN0cltmcm9tUGF0aFN0ci5zaXplKCkgLSAxXSAhPSAnLycpIGZyb21QYXRoU3RyICs9ICcvJzsKKyAgICAgICAgaWYgKHRvUGF0aFN0clt0b1BhdGhTdHIuc2l6ZSgpIC0gMV0gIT0gJy8nKSB0b1BhdGhTdHIgKz0gJy8nOworCisgICAgICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGVudHJ5LT5kX25hbWU7CisKKyAgICAgICAgICAgIC8vIGlnbm9yZSAiLiIgYW5kICIuLiIKKyAgICAgICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAwIHx8IChuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09IDApKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRGaWxlID0gZnJvbVBhdGhTdHIgKyBuYW1lOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RmlsZSA9IHRvUGF0aFN0ciArIG5hbWU7CisKKyAgICAgICAgICAgIGlmIChlbnRyeS0+ZF90eXBlID09IERUX0RJUikgeworICAgICAgICAgICAgICAgIHJldCArPSBtYWtlRm9sZGVyKG5ld0ZpbGUuY19zdHIoKSk7CisKKyAgICAgICAgICAgICAgICBNdHBPYmplY3RJbmZvKiBvYmplY3RJbmZvID0gbmV3IE10cE9iamVjdEluZm8obURhdGFiYXNlLT5hbGxvY2F0ZU9iamVjdEhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tU3RvcmFnZUlEID0gbVN0b3JhZ2UtPmdldFN0b3JhZ2VJRCgpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1QYXJlbnQgPSBwYXJlbnRIYW5kbGU7CisgICAgICAgICAgICAgICAgb2JqZWN0SW5mby0+bUZvcm1hdCA9IE1UUF9GT1JNQVRfQVNTT0NJQVRJT047IC8vIGZvbGRlcgorICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1OYW1lID0gc3RyZHVwKG5hbWUpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1LZXl3b3JkcyA9IHN0cmR1cCgiIik7CisKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UtPmFkZE9iamVjdChvYmplY3RJbmZvKTsKKworICAgICAgICAgICAgICAgIHJldCArPSBjcmVhdGVEYXRhYmFzZUZyb21Tb3VyY2VEaXIob2xkRmlsZS5jX3N0cigpLCBuZXdGaWxlLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ICs9IGNvcHlGaWxlKG9sZEZpbGUuY19zdHIoKSwgbmV3RmlsZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIE10cE9iamVjdEluZm8qIG9iamVjdEluZm8gPSBuZXcgTXRwT2JqZWN0SW5mbyhtRGF0YWJhc2UtPmFsbG9jYXRlT2JqZWN0SGFuZGxlKCkpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1TdG9yYWdlSUQgPSBtU3RvcmFnZS0+Z2V0U3RvcmFnZUlEKCk7CisgICAgICAgICAgICAgICAgb2JqZWN0SW5mby0+bVBhcmVudCA9IHBhcmVudEhhbmRsZTsKKyAgICAgICAgICAgICAgICBvYmplY3RJbmZvLT5tRm9ybWF0ID0gTVRQX0ZPUk1BVF9URVhUOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1OYW1lID0gc3RyZHVwKG5hbWUpOworICAgICAgICAgICAgICAgIG9iamVjdEluZm8tPm1LZXl3b3JkcyA9IHN0cmR1cCgiIik7CisKKyAgICAgICAgICAgICAgICBtRGF0YWJhc2UtPmFkZE9iamVjdChvYmplY3RJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlZGlyKGRpcik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfTsKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIF9fYXR0cmlidXRlX18oKG9wdG5vbmUpKSB7CisgICAgLy8gcmVzZXQgb3VyIHN0b3JhZ2UgKGZyb20gTXRwVXRpbHMuaCkKKyAgICBhbmRyb2lkOjpkZWxldGVQYXRoKHN0b3JhZ2VfcGF0aCk7CisgICAgYW5kcm9pZDo6bWFrZUZvbGRlcigiL3N0b3JhZ2UvZnV6emVyIik7CisgICAgYW5kcm9pZDo6bWFrZUZvbGRlcihzdG9yYWdlX3BhdGgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6Ok10cE1vY2tTZXJ2ZXI+IG10cCA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPGFuZHJvaWQ6Ok10cE1vY2tTZXJ2ZXI+KHN0b3JhZ2VfcGF0aCk7CisKKyAgICBzaXplX3Qgb2ZmID0gMDsKKworICAgIC8vIFBhY2tldGl6ZSB0aGUgaW5wdXQgc3RyZWFtCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgLy8gQSBsb25nZXIgZGVsaW1pdGVyIGNvdWxkIGJlIHVzZWQsIGJ1dCB0aGlzIHdvcmtlZCBpbiBwcmFjdGljZQorICAgICAgICBpZiAoZGF0YVtpXSA9PSAnQCcpIHsKKyAgICAgICAgICAgIHNpemVfdCBwa3RzeiA9IGkgLSBvZmY7CisgICAgICAgICAgICBpZiAocGt0c3ogPiAwKSB7CisgICAgICAgICAgICAgICAgcGFja2V0X3QgcGt0ID0gcGFja2V0X3QoKHVuc2lnbmVkIGNoYXIqKWRhdGEgKyBvZmYsICh1bnNpZ25lZCBjaGFyKilkYXRhICsgaSk7CisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGludG8gcGFja2V0IGJ1ZmZlcgorICAgICAgICAgICAgICAgIG10cC0+bUhhbmRsZS0+YWRkX3BhY2tldChwa3QpOworICAgICAgICAgICAgICAgIG9mZiA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtdHAtPmNyZWF0ZURhdGFiYXNlRnJvbVNvdXJjZURpcihzb3VyY2VfZGF0YWJhc2UsIHN0b3JhZ2VfcGF0aCwgTVRQX1BBUkVOVF9ST09UKTsKKyAgICBtdHAtPnJ1bigpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuZGljdCBiL21lZGlhL210cC90ZXN0cy9NdHBGdXp6ZXIvbXRwX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2YxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdHAvdGVzdHMvTXRwRnV6emVyL210cF9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDc0IEBACittdHBfb3BlcmF0aW9uX2dldF9kZXZpY2VfaW5mbz0iXHgwMVx4MTAiCittdHBfb3BlcmF0aW9uX29wZW5fc2Vzc2lvbj0iXHgwMlx4MTAiCittdHBfb3BlcmF0aW9uX2Nsb3NlX3Nlc3Npb249Ilx4MDNceDEwIgorbXRwX29wZXJhdGlvbl9nZXRfc3RvcmFnZV9pZHM9Ilx4MDRceDEwIgorbXRwX29wZXJhdGlvbl9nZXRfc3RvcmFnZV9pbmZvPSJceDA1XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X251bV9vYmplY3RzPSJceDA2XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9oYW5kbGVzPSJceDA3XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9pbmZvPSJceDA4XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdD0iXHgwOVx4MTAiCittdHBfb3BlcmF0aW9uX2dldF90aHVtYj0iXHgwQVx4MTAiCittdHBfb3BlcmF0aW9uX2RlbGV0ZV9vYmplY3Q9Ilx4MEJceDEwIgorbXRwX29wZXJhdGlvbl9zZW5kX29iamVjdF9pbmZvPSJceDBDXHgxMCIKK210cF9vcGVyYXRpb25fc2VuZF9vYmplY3Q9Ilx4MERceDEwIgorbXRwX29wZXJhdGlvbl9pbml0aWF0ZV9jYXB0dXJlPSJceDBFXHgxMCIKK210cF9vcGVyYXRpb25fZm9ybWF0X3N0b3JlPSJceDBGXHgxMCIKK210cF9vcGVyYXRpb25fcmVzZXRfZGV2aWNlPSJceDEwXHgxMCIKK210cF9vcGVyYXRpb25fc2VsZl90ZXN0PSJceDExXHgxMCIKK210cF9vcGVyYXRpb25fc2V0X29iamVjdF9wcm90ZWN0aW9uPSJceDEyXHgxMCIKK210cF9vcGVyYXRpb25fcG93ZXJfZG93bj0iXHgxM1x4MTAiCittdHBfb3BlcmF0aW9uX2dldF9kZXZpY2VfcHJvcF9kZXNjPSJceDE0XHgxMCIKK210cF9vcGVyYXRpb25fZ2V0X2RldmljZV9wcm9wX3ZhbHVlPSJceDE1XHgxMCIKK210cF9vcGVyYXRpb25fc2V0X2RldmljZV9wcm9wX3ZhbHVlPSJceDE2XHgxMCIKK210cF9vcGVyYXRpb25fcmVzZXRfZGV2aWNlX3Byb3BfdmFsdWU9Ilx4MTdceDEwIgorbXRwX29wZXJhdGlvbl90ZXJtaW5hdGVfb3Blbl9jYXB0dXJlPSJceDE4XHgxMCIKK210cF9vcGVyYXRpb25fbW92ZV9vYmplY3Q9Ilx4MTlceDEwIgorbXRwX29wZXJhdGlvbl9jb3B5X29iamVjdD0iXHgxQVx4MTAiCittdHBfb3BlcmF0aW9uX2dldF9wYXJ0aWFsX29iamVjdD0iXHgxQlx4MTAiCittdHBfb3BlcmF0aW9uX2luaXRpYXRlX29wZW5fY2FwdHVyZT0iXHgxQ1x4MTAiCittdHBfb3BlcmF0aW9uX2dldF9vYmplY3RfcHJvcHNfc3VwcG9ydGVkPSJceDAxXHg5OCIKK210cF9vcGVyYXRpb25fZ2V0X29iamVjdF9wcm9wX2Rlc2M9Ilx4MDJceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfb2JqZWN0X3Byb3BfdmFsdWU9Ilx4MDNceDk4IgorbXRwX29wZXJhdGlvbl9zZXRfb2JqZWN0X3Byb3BfdmFsdWU9Ilx4MDRceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfb2JqZWN0X3Byb3BfbGlzdD0iXHgwNVx4OTgiCittdHBfb3BlcmF0aW9uX3NldF9vYmplY3RfcHJvcF9saXN0PSJceDA2XHg5OCIKK210cF9vcGVyYXRpb25fZ2V0X2ludGVyZGVwZW5kZW50X3Byb3BfZGVzYz0iXHgwN1x4OTgiCittdHBfb3BlcmF0aW9uX3NlbmRfb2JqZWN0X3Byb3BfbGlzdD0iXHgwOFx4OTgiCittdHBfb3BlcmF0aW9uX2dldF9vYmplY3RfcmVmZXJlbmNlcz0iXHgxMFx4OTgiCittdHBfb3BlcmF0aW9uX3NldF9vYmplY3RfcmVmZXJlbmNlcz0iXHgxMVx4OTgiCittdHBfb3BlcmF0aW9uX3NraXA9Ilx4MjBceDk4IgorbXRwX29wZXJhdGlvbl9nZXRfcGFydGlhbF9vYmplY3RfNjQ9Ilx4QzFceDk1IgorbXRwX29wZXJhdGlvbl9zZW5kX3BhcnRpYWxfb2JqZWN0PSJceEMyXHg5NSIKK210cF9vcGVyYXRpb25fdHJ1bmNhdGVfb2JqZWN0PSJceEMzXHg5NSIKK210cF9vcGVyYXRpb25fYmVnaW5fZWRpdF9vYmplY3Q9Ilx4QzRceDk1IgorbXRwX29wZXJhdGlvbl9lbmRfZWRpdF9vYmplY3Q9Ilx4QzVceDk1IgorCisjIEFzc29jaWF0aW9uIChmb3IgZXhhbXBsZSwgYSBmb2xkZXIpCittdHBfZm9ybWF0X2Fzc29jaWF0aW9uPSJceDAxXHgzMCIKKworIyB0eXBlcworbXRwX3R5cGVfdW5kZWZpbmVkPSJceDAwXHgwMCIKK210cF90eXBlX2ludDg9Ilx4MDFceDAwIgorbXRwX3R5cGVfdWludDg9Ilx4MDJceDAwIgorbXRwX3R5cGVfaW50MTY9Ilx4MDNceDAwIgorbXRwX3R5cGVfdWludDE2PSJceDA0XHgwMCIKK210cF90eXBlX2ludDMyPSJceDA1XHgwMCIKK210cF90eXBlX3VpbnQzMj0iXHgwNlx4MDAiCittdHBfdHlwZV9pbnQ2ND0iXHgwN1x4MDAiCittdHBfdHlwZV91aW50NjQ9Ilx4MDhceDAwIgorbXRwX3R5cGVfaW50MTI4PSJceDA5XHgwMCIKK210cF90eXBlX3VpbnQxMjg9Ilx4MEFceDAwIgorbXRwX3R5cGVfYWludDg9Ilx4MDFceDQwIgorbXRwX3R5cGVfYXVpbnQ4PSJceDAyXHg0MCIKK210cF90eXBlX2FpbnQxNj0iXHgwM1x4NDAiCittdHBfdHlwZV9hdWludDE2PSJceDA0XHg0MCIKK210cF90eXBlX2FpbnQzMj0iXHgwNVx4NDAiCittdHBfdHlwZV9hdWludDMyPSJceDA2XHg0MCIKK210cF90eXBlX2FpbnQ2ND0iXHgwN1x4NDAiCittdHBfdHlwZV9hdWludDY0PSJceDA4XHg0MCIKK210cF90eXBlX2FpbnQxMjg9Ilx4MDlceDQwIgorbXRwX3R5cGVfYXVpbnQxMjg9Ilx4MEFceDQwIgorbXRwX3R5cGVfc3RyPSJceEZGXHhGRiIKKworIyBhbHNvIHVzZWQgZm9yIG1heCBzaXplICg+NEdCKQorbXRwX3BhcmVudF9yb290PSJceEZGXHhGRlx4RkZceEZGIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL3Rlc3RzL1Bvc2l4QXN5bmNJT1Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljZjZiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MCBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbWVkaWFfbXRwX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX210cF9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJwb3NpeF9hc3luY19pb190ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzcmNzOiBbIlBvc2l4QXN5bmNJT190ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYm10cCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPVGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPVGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiMTBmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL210cC90ZXN0cy9Qb3NpeEFzeW5jSU9UZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgcG9zaXhfYXN5bmNfaW9fdGVzdCI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icG9zaXhfYXN5bmNfaW9fdGVzdC0+L2RhdGEvbG9jYWwvdG1wL3Bvc2l4X2FzeW5jX2lvX3Rlc3QiIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9ImFwY3QiIC8+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJwb3NpeF9hc3luY19pb190ZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwIGIvbWVkaWEvbXRwL3Rlc3RzL1Bvc2l4QXN5bmNJT1Rlc3QvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPX3Rlc3QuY3BwCnJlbmFtZSB0byBtZWRpYS9tdHAvdGVzdHMvUG9zaXhBc3luY0lPVGVzdC9Qb3NpeEFzeW5jSU9fdGVzdC5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNDM5YjA2My4uOGQ1MjdlOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDM3IEBACiAvLyB0byByZWZlciB0byBoZWFkZXJzIGluIHBhcmVudCBkaXJlY3RvcmllcyBhbmQgdGhlIGhlYWRlcnMgbGl2ZSBpbgogLy8gZnJhbWV3b3Jrcy9hdi9pbmNsdWRlLgogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9tZWRpYV9uZGtfbGljZW5zZSJdLAorfQorCisvLyBBZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgbGFyZ2Utc2NhbGUtY2hhbmdlIHRoYXQgdG9vayB0aGUgYXBwcm9hY2ggb2YKKy8vICdhcHBseSBldmVyeSBsaWNlbnNlIGZvdW5kIHRvIGV2ZXJ5IHRhcmdldCcuIFdoaWxlIHRoaXMgbWFrZXMgc3VyZSB3ZSByZXNwZWN0CisvLyBldmVyeSBsaWNlbnNlIHJlc3RyaWN0aW9uLCBpdCBtYXkgbm90IGJlIGVudGlyZWx5IGNvcnJlY3QuCisvLworLy8gZS5nLiBHUEwgaW4gYW4gTUlUIHByb2plY3QgbWlnaHQgb25seSBhcHBseSB0byB0aGUgY29udHJpYi8gZGlyZWN0b3J5LgorLy8KKy8vIFBsZWFzZSBjb25zaWRlciBzcGxpdHRpbmcgdGhlIHNpbmdsZSBsaWNlbnNlIGJlbG93IGludG8gbXVsdGlwbGUgbGljZW5zZXMsCisvLyB0YWtpbmcgY2FyZSBub3QgdG8gbG9zZSBhbnkgbGljZW5zZV9raW5kIGluZm9ybWF0aW9uLCBhbmQgb3ZlcnJpZGluZyB0aGUKKy8vIGRlZmF1bHQgbGljZW5zZSB1c2luZyB0aGUgJ2xpY2Vuc2VzOiBbLi4uXScgcHJvcGVydHkgb24gdGFyZ2V0cyBhcyBuZWVkZWQuCisvLworLy8gRm9yIHVudXNlZCBmaWxlcywgY29uc2lkZXIgY3JlYXRpbmcgYSAnZmlsZUdyb3VwJyB3aXRoICIvL3Zpc2liaWxpdHk6cHJpdmF0ZSIKKy8vIHRvIGF0dGFjaCB0aGUgbGljZW5zZSB0bywgYW5kIGluY2x1ZGluZyBhIGNvbW1lbnQgd2hldGhlciB0aGUgZmlsZXMgbWF5IGJlCisvLyB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCisvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCitsaWNlbnNlIHsKKyAgICBuYW1lOiAiZnJhbWV3b3Jrc19hdl9tZWRpYV9uZGtfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1NSVQiLAorICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItVW5pY29kZS1ERlMiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIG5ka19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWFuZGsiLAogICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCkBAIC00MywxMSArNzQsMjAgQEAKICAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAogICAgIF0sCiAgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCisgICAgbGxuZGs6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW5kay5tYXAudHh0IiwKKyAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAiTmRrSmF2YVZNSGVscGVyLmNwcCIsCkBAIC03Niw5ICsxMTYsMTEgQEAKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJncmFsbG9jdXNhZ2UiLAorICAgICAgICAibGlibmF0aXZlaGVscGVyX2xhenkiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAiam5pX2hlYWRlcnMiLAogICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3NfaGVhZGVycyIsCiAgICAgXSwKQEAgLTEwMywxMCArMTQ1LDE0IEBACiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAotICAgICAgICAibGlibmF0aXZlaGVscGVyIiwKICAgICBdLAogCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJqbmlfaGVhZGVycyJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgICAgICJpbmNsdWRlX3BsYXRmb3JtIiwKKyAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliZ3VpIiwKQEAgLTEyNCwxNCArMTcwLDYgQEAKICAgICB9LAogfQogCi1sbG5ka19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFuZGsiLAotICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwotICAgICAgICAiaW5jbHVkZSIsCi0gICAgXSwKLX0KLQogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrX3V0aWxzIiwKIApAQCAtMTk2LDMgKzIzNCw0NSBAQAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKICAgICBdLAogfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYm1lZGlhbmRrX2Zvcm1hdCIsCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka01lZGlhRm9ybWF0LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOnBsYXRmb3JtIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAppbmRleCAxMTQ1YjdiLi41ZmRkNDVhIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBpZiAobUlzQ2xvc2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaWYgKCFtUmVhZGVyLT5tSXNDbG9zZWQpIHsKKyAgICBpZiAobVJlYWRlci0+bUlzT3BlbikgewogICAgICAgICBtUmVhZGVyLT5yZWxlYXNlSW1hZ2VMb2NrZWQodGhpcywgcmVsZWFzZUZlbmNlRmQpOwogICAgIH0KICAgICAvLyBTaG91bGQgaGF2ZSBiZWVuIHNldCB0byBudWxscHRyIGluIHJlbGVhc2VJbWFnZUxvY2tlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUHJpdi5oIGIvbWVkaWEvbmRrL05ka0ltYWdlUHJpdi5oCmluZGV4IDBlOGNiY2IuLjA1MTE1YjkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VQcml2LmgKQEAgLTMwLDYgKzMwLDI2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisvLyBGb3JtYXRzIG5vdCBsaXN0ZWQgaW4gdGhlIHB1YmxpYyBBUEksIGJ1dCBzdGlsbCBhdmFpbGFibGUgdG8gQUltYWdlUmVhZGVyCitlbnVtIEFJTUFHRV9QUklWQVRFX0ZPUk1BVFMgeworICAgIC8qKgorICAgICAqIFVucHJvY2Vzc2VkIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCByYXcKKyAgICAgKiBkZXB0aCBtZWFzdXJlbWVudHMsIG9wYXF1ZSB3aXRoIDE2IGJpdAorICAgICAqIHNhbXBsZXMuCisgICAgICoKKyAgICAgKi8KKworICAgIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIID0gMHgxMDAyLAorCisgICAgLyoqCisgICAgICogRGV2aWNlIHNwZWNpZmljIDEwIGJpdHMgZGVwdGggUkFXIGltYWdlIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlVucHJvY2Vzc2VkIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCByYXcgZGVwdGggbWVhc3VyZW1lbnRzLCBvcGFxdWUgd2l0aCAxMCBiaXQgc2FtcGxlcworICAgICAqIGFuZCBkZXZpY2Ugc3BlY2lmaWMgYml0IGxheW91dC48L3A+CisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEgxMCA9IDB4MTAwMywKK307CisKIC8vIFRPRE86IHRoaXMgb25seSBzdXBwb3J0cyBJbWFnZVJlYWRlcgogc3RydWN0IEFJbWFnZSB7CiAgICAgQUltYWdlKEFJbWFnZVJlYWRlciogcmVhZGVyLCBpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIEJ1ZmZlckl0ZW0qIGJ1ZmZlciwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCmluZGV4IGMwY2ViM2QuLjEwNjdlMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcApAQCAtMjEsNyArMjEsNiBAQAogCiAjaW5jbHVkZSAiTmRrSW1hZ2VQcml2LmgiCiAjaW5jbHVkZSAiTmRrSW1hZ2VSZWFkZXJQcml2LmgiCi0jaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgpAQCAtNzMsNiArNzIsNyBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19ERVBUSDEwOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgLy8gRm9yIHByaXZhdGUgZm9ybWF0LCBjcHUgdXNhZ2UgaXMgcHJvaGliaXRlZC4KQEAgLTEwMyw2ICsxMDMsNyBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19ERVBUSDEwOgogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0yNzQsNyArMjc1LDcgQEAKIAogQUltYWdlUmVhZGVyOjp+QUltYWdlUmVhZGVyKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgTE9HX0ZBVEFMX0lGKCJBSW1hZ2VSZWFkZXIgbm90IGNsb3NlZCBiZWZvcmUgZGVzdHJ1Y3Rpb24iLCBtSXNDbG9zZWQgIT0gdHJ1ZSk7CisgICAgTE9HX0ZBVEFMX0lGKG1Jc09wZW4sICJBSW1hZ2VSZWFkZXIgbm90IGNsb3NlZCBiZWZvcmUgZGVzdHJ1Y3Rpb24iKTsKIH0KIAogbWVkaWFfc3RhdHVzX3QKQEAgLTM0OCwxNiArMzQ5LDE2IEBACiAgICAgfQogICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcih0aGlzKTsKICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7Ci0KKyAgICBtSXNPcGVuID0gdHJ1ZTsKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB2b2lkIEFJbWFnZVJlYWRlcjo6Y2xvc2UoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUlzQ2xvc2VkKSB7CisgICAgaWYgKCFtSXNPcGVuKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbUlzQ2xvc2VkID0gdHJ1ZTsKKyAgICBtSXNPcGVuID0gZmFsc2U7CiAgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbnVsbExpc3RlbmVyID0ge251bGxwdHIsIG51bGxwdHJ9OwogICAgIHNldEltYWdlTGlzdGVuZXJMb2NrZWQoJm51bGxMaXN0ZW5lcik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCAwNzc5YTcxLi4zN2M2MDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICBuYXRpdmVfaGFuZGxlX3QqICAgICAgICAgICBtV2luZG93SGFuZGxlID0gbnVsbHB0cjsKIAogICAgIExpc3Q8QUltYWdlKj4gICAgICAgICAgICAgIG1BY3F1aXJlZEltYWdlczsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSXNDbG9zZWQgPSBmYWxzZTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICBtSXNPcGVuID0gZmFsc2U7CiAKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggYWYyMWE5OS4uMWFlMmI0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMTksNyArMTksNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYUNvZGVjIgogCi0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWNQbGF0Zm9ybS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfSBlbHNlIGlmIChlcnIgPT0gLUVBR0FJTikgewogICAgICAgICByZXR1cm4gKG1lZGlhX3N0YXR1c190KSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQUNPREVDX0VSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRTsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBERUFEX09CSkVDVCkgeworICAgICAgICByZXR1cm4gQU1FRElBQ09ERUNfRVJST1JfUkVDTEFJTUVEOwogICAgIH0KICAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwogICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKQEAgLTI1NSw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKTsKLSAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyIHJlcG9ydGVkIGVycm9yKDB4JXgpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMgcmVwb3J0ZWQgZXJyb3IoMHgleCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvZGVjLT5tQXN5bmNDYWxsYmFja0xvY2spOwpAQCAtMzA4LDcgKzMxMiwxMSBAQAogCiBleHRlcm4gIkMiIHsKIAotc3RhdGljIEFNZWRpYUNvZGVjICogY3JlYXRlQU1lZGlhQ29kZWMoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBuYW1lX2lzX3R5cGUsIGJvb2wgZW5jb2Rlcikgeworc3RhdGljIEFNZWRpYUNvZGVjICogY3JlYXRlQU1lZGlhQ29kZWMoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmFtZV9pc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6a05vUGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6a05vVWlkKSB7CiAgICAgQU1lZGlhQ29kZWMgKm1EYXRhID0gbmV3IEFNZWRpYUNvZGVjKCk7CiAgICAgbURhdGEtPm1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICBtRGF0YS0+bUxvb3Blci0+c2V0TmFtZSgiTkRLIE1lZGlhQ29kZWNfbG9vcGVyIik7CkBAIC0zMjIsOSArMzMwLDIwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobmFtZV9pc190eXBlKSB7Ci0gICAgICAgIG1EYXRhLT5tQ29kZWMgPSBhbmRyb2lkOjpNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobURhdGEtPm1Mb29wZXIsIG5hbWUsIGVuY29kZXIpOworICAgICAgICBtRGF0YS0+bUNvZGVjID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLAorICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgZW5jb2RlciwKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIGVyciAqLywKKyAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgdWlkKTsKICAgICB9IGVsc2UgewotICAgICAgICBtRGF0YS0+bUNvZGVjID0gYW5kcm9pZDo6TWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKG1EYXRhLT5tTG9vcGVyLCBuYW1lKTsKKyAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZSgKKyAgICAgICAgICAgICAgICBtRGF0YS0+bUxvb3BlciwKKyAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogZXJyICovLAorICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICB1aWQpOwogICAgIH0KICAgICBpZiAobURhdGEtPm1Db2RlYyA9PSBOVUxMKSB7ICAvLyBmYWlsZWQgdG8gY3JlYXRlIGNvZGVjCiAgICAgICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtRGF0YSk7CkBAIC0zNDQsMTcgKzM2MywzOCBAQAogCiBFWFBPUlQKIEFNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIGZhbHNlLCBmYWxzZSk7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIGZhbHNlIC8qIG5hbWVfaXNfdHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLyk7CiB9CiAKIEVYUE9SVAogQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG1pbWVfdHlwZSwgdHJ1ZSwgZmFsc2UpOworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhtaW1lX3R5cGUsIHRydWUgLyogbmFtZV9pc190eXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKIH0KIAogRVhQT1JUCiBBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIHRydWUsIHRydWUpOworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhuYW1lLCB0cnVlIC8qIG5hbWVfaXNfdHlwZSAqLywgdHJ1ZSAvKiBlbmNvZGVyICovKTsKK30KKworRVhQT1JUCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFNZWRpYUNvZGVjKG5hbWUsIGZhbHNlIC8qIG5hbWVfaXNfdHlwZSAqLywgZmFsc2UgLyogZW5jb2RlciAqLywgcGlkLCB1aWQpOworfQorCitFWFBPUlQKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlRm9yQ2xpZW50KGNvbnN0IGNoYXIgKm1pbWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhtaW1lX3R5cGUsIHRydWUgLyogbmFtZV9pc190eXBlICovLCBmYWxzZSAvKiBlbmNvZGVyICovLCBwaWQsIHVpZCk7Cit9CisKK0VYUE9SVAorQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGVGb3JDbGllbnQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjcmVhdGVBTWVkaWFDb2RlYyhuYW1lLCB0cnVlIC8qIG5hbWVfaXNfdHlwZSAqLywgdHJ1ZSAvKiBlbmNvZGVyICovLCBwaWQsIHVpZCk7CiB9CiAKIEVYUE9SVApAQCAtOTE0LDUgKzk1NCwxMyBAQAogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfSERSMTBfUExVU19JTkZPID0gQU1FRElBRk9STUFUX0tFWV9IRFIxMF9QTFVTX0lORk87CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBQ09ERUNfS0VZX0xPV19MQVRFTkNZID0gQU1FRElBRk9STUFUX0tFWV9MT1dfTEFURU5DWTsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfT0ZGU0VUX1RJTUUgPSAidGltZS1vZmZzZXQtdXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUNPREVDX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUUgPSAicmVxdWVzdC1zeW5jIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfU1VTUEVORCA9ICJkcm9wLWlucHV0LWZyYW1lcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBQ09ERUNfS0VZX1NVU1BFTkRfVElNRSA9ICJkcm9wLXN0YXJ0LXRpbWUtdXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUNPREVDX0tFWV9WSURFT19CSVRSQVRFID0gInZpZGVvLWJpdHJhdGUiOworCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggM2FmOTc3MS4uNmU5OTQ1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC0zODAsMTIgKzM4MCwxNSBAQAogICAgIH0KICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbjsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5vcGVuU2Vzc2lvbihEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsTWF4LCBzZXNzaW9uKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1PYmotPm1JZHMucHVzaF9mcm9udChzZXNzaW9uKTsKLSAgICAgICAgTGlzdDxpZHZlY190Pjo6aXRlcmF0b3IgaXRlciA9IG1PYmotPm1JZHMuYmVnaW4oKTsKLSAgICAgICAgc2Vzc2lvbklkLT5wdHIgPSBpdGVyLT5hcnJheSgpOwotICAgICAgICBzZXNzaW9uSWQtPmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHNlc3Npb25JZC0+cHRyID0gTlVMTDsKKyAgICAgICAgc2Vzc2lvbklkLT5sZW5ndGggPSAwOworICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CiAgICAgfQorICAgIG1PYmotPm1JZHMucHVzaF9mcm9udChzZXNzaW9uKTsKKyAgICBMaXN0PGlkdmVjX3Q+OjppdGVyYXRvciBpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOworICAgIHNlc3Npb25JZC0+cHRyID0gaXRlci0+YXJyYXkoKTsKKyAgICBzZXNzaW9uSWQtPmxlbmd0aCA9IGl0ZXItPnNpemUoKTsKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCkBAIC00ODksNiArNDkyLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBrZXlTZXRJZC0+cHRyID0gTlVMTDsKICAgICAgICAga2V5U2V0SWQtPmxlbmd0aCA9IDA7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDBkYTA3NDAuLjA3ZmM1ZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlICJOZGtKYXZhVk1IZWxwZXJQcml2LmgiCiAjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oIgogCiAKQEAgLTYzLDcgKzY0LDEwIEBACiBBTWVkaWFFeHRyYWN0b3IqIEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSB7CiAgICAgQUxPR1YoImN0b3IiKTsKICAgICBBTWVkaWFFeHRyYWN0b3IgKm1EYXRhID0gbmV3IEFNZWRpYUV4dHJhY3RvcigpOwotICAgIG1EYXRhLT5tSW1wbCA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yKCk7CisgICAgbURhdGEtPm1JbXBsID0gbmV3IE51TWVkaWFFeHRyYWN0b3IoCisgICAgICAgIE5ka0phdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCkgIT0gbnVsbHB0cgorICAgICAgICAgICAgICAgID8gTnVNZWRpYUV4dHJhY3Rvcjo6RW50cnlQb2ludDo6TkRLX1dJVEhfSlZNCisgICAgICAgICAgICAgICAgOiBOdU1lZGlhRXh0cmFjdG9yOjpFbnRyeVBvaW50OjpOREtfTk9fSlZNICk7CiAgICAgcmV0dXJuIG1EYXRhOwogfQogCkBAIC00MTUsNiArNDE5LDcgQEAKIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsIEFNZWRpYUZvcm1hdCAqZm10KSB7CisgICAgQUxPR1YoIkFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQiKTsKICAgICBpZiAoZm10ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKICAgICB9CkBAIC00MjQsNiArNDI5LDkgQEAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKICAgICB9CisjaWZkZWYgTE9HX05ERUJVRworICAgIHNhbXBsZU1ldGEtPmR1bXBUb0xvZygpOworI2VuZGlmCiAKICAgICBzcDxBTWVzc2FnZT4gbWV0YTsKICAgICBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGZtdCwgJm1ldGEpOwpAQCAtNDc5LDYgKzQ4NywxOSBAQAogICAgICAgICBtZXRhLT5zZXRCdWZmZXIoQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYXVkaW9QcmVzZW50YXRpb25zRGF0YSk7CiAgICAgfQogCisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoc2FtcGxlTWV0YS0+ZmluZEludDY0KGtLZXlTYW1wbGVGaWxlT2Zmc2V0LCAmdmFsNjQpKSB7CisgICAgICAgIG1ldGEtPnNldEludDY0KCJzYW1wbGUtZmlsZS1vZmZzZXQiLCB2YWw2NCk7CisgICAgICAgIEFMT0dWKCJTYW1wbGVGaWxlT2Zmc2V0IEZvdW5kIik7CisgICAgfQorICAgIGlmIChzYW1wbGVNZXRhLT5maW5kSW50NjQoa0tleUxhc3RTYW1wbGVJbmRleEluQ2h1bmssICZ2YWw2NCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50NjQoImxhc3Qtc2FtcGxlLWluZGV4LWluLWNodW5rIiAvKkFNRURJQUZPUk1BVF9LRVlfTEFTVF9TQU1QTEVfSU5ERVhfSU5fQ0hVTksqLywKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsNjQpOworICAgICAgICBBTE9HVigia0tleUxhc3RTYW1wbGVJbmRleEluQ2h1bmsgRm91bmQiKTsKKyAgICB9CisKKyAgICBBTE9HVigiQU1lZGlhRm9ybWF0X3RvU3RyaW5nOiVzIiwgQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZtdCkpOworCiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKaW5kZXggYWIwY2I2My4uYzE3OTNjZSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTMzNyw2ICszMzQsNyBAQAogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSA9ICJpcy1zeW5jLWZyYW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwgPSAiaS1mcmFtZS1pbnRlcnZhbCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVNUX1NBTVBMRV9JTkRFWF9JTl9DSFVOSyA9ICJsYXN0LXNhbXBsZS1pbmRleC1pbi1jaHVuayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZID0gImxhdGVuY3kiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgPSAibGV2ZWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gPSAibG9jYXRpb24iOwpAQCAtMzYyLDE3ICszNjAsMjEgQEAKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIgPSAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OID0gInJvdGF0aW9uLWRlZ3JlZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX0ZJTEVfT0ZGU0VUID0gInNhbXBsZS1maWxlLW9mZnNldCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSA9ICJzYW1wbGUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfVElNRV9CRUZPUkVfQVBQRU5EID0gInNhbXBsZS10aW1lLWJlZm9yZS1hcHBlbmQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCA9ICJzYXItaGVpZ2h0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCA9ICJzYXItd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0VJID0gInNlaSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQgPSAic2xpY2UtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMT1dfTU9USU9OX01BUktFUlMgPSAic2xvdy1tb3Rpb24tbWFya2VycyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9BVjFDID0gInRodW1ibmFpbC1jc2QtYXYxYyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMgPSAidGh1bWJuYWlsLWNzZC1oZXZjIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgPSAidGh1bWJuYWlsLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfVElNRSA9ICJ0aHVtYm5haWwtdGltZSI7CkBAIC0zODQsNyArMzg2LDE3IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCA9ICJ0cmFjay1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWCA9ICJ0cmFjay1pbmRleCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTID0gInZhbGlkLXNhbXBsZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01BWCA9ICJ2aWRlby1xcC1iLW1heCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX0JfTUlOID0gInZpZGVvLXFwLWItbWluIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfSV9NQVggPSAidmlkZW8tcXAtaS1tYXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01JTiA9ICJ2aWRlby1xcC1pLW1pbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX01BWCA9ICJ2aWRlby1xcC1tYXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9NSU4gPSAidmlkZW8tcXAtbWluIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfUF9NQVggPSAidmlkZW8tcXAtcC1tYXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9QX01JTiA9ICJ2aWRlby1xcC1wLW1pbiI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9YTVBfT0ZGU0VUID0gInhtcC1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWE1QX1NJWkUgPSAieG1wLXNpemUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggZDE5OTJiZi4uMTk2NWU2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMTcsMjggKzE3LDI0IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhTXV4ZXIiCiAKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhTXV4ZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KLQotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhTXV4ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUFwcGVuZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQU1lZGlhTXV4ZXIgewotICAgIHNwPE1lZGlhTXV4ZXI+IG1JbXBsOwotCisgICAgc3A8TWVkaWFNdXhlckJhc2U+IG1JbXBsOwogfTsKIAogZXh0ZXJuICJDIiB7CkBAIC00Niw4ICs0MiwxNSBAQAogRVhQT1JUCiBBTWVkaWFNdXhlciogQU1lZGlhTXV4ZXJfbmV3KGludCBmZCwgT3V0cHV0Rm9ybWF0IGZvcm1hdCkgewogICAgIEFMT0dWKCJjdG9yIik7Ci0gICAgQU1lZGlhTXV4ZXIgKm1EYXRhID0gbmV3IEFNZWRpYU11eGVyKCk7Ci0gICAgbURhdGEtPm1JbXBsID0gbmV3IE1lZGlhTXV4ZXIoZmQsIChhbmRyb2lkOjpNZWRpYU11eGVyOjpPdXRwdXRGb3JtYXQpZm9ybWF0KTsKKyAgICBBTWVkaWFNdXhlciAqbURhdGEgPSBuZXcgKHN0ZDo6bm90aHJvdykgQU1lZGlhTXV4ZXIoKTsKKyAgICBpZiAobURhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbURhdGEtPm1JbXBsID0gbmV3IChzdGQ6Om5vdGhyb3cpIE1lZGlhTXV4ZXIoZmQsIChhbmRyb2lkOjpNZWRpYU11eGVyOjpPdXRwdXRGb3JtYXQpZm9ybWF0KTsKKyAgICBpZiAobURhdGEtPm1JbXBsID09IG51bGxwdHIpIHsKKyAgICAgICAgZGVsZXRlIG1EYXRhOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAgICAgcmV0dXJuIG1EYXRhOwogfQogCkBAIC05NCw2ICs5NywzNCBAQAogICAgICAgICAgICAgbXV4ZXItPm1JbXBsLT53cml0ZVNhbXBsZURhdGEoYnVmLCB0cmFja0lkeCwgaW5mby0+cHJlc2VudGF0aW9uVGltZVVzLCBpbmZvLT5mbGFncykpOwogfQogCitFWFBPUlQKK0FNZWRpYU11eGVyKiBBTWVkaWFNdXhlcl9hcHBlbmQoaW50IGZkLCBBcHBlbmRNb2RlIG1vZGUpIHsKKyAgICBBTE9HVigiYXBwZW5kIik7CisgICAgQU1lZGlhTXV4ZXIqIG1EYXRhID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFNZWRpYU11eGVyKCk7CisgICAgaWYgKG1EYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIG1EYXRhLT5tSW1wbCA9IE1lZGlhQXBwZW5kZXI6OmNyZWF0ZShmZCwgKGFuZHJvaWQ6Ok1lZGlhQXBwZW5kZXI6OkFwcGVuZE1vZGUpbW9kZSk7CisgICAgaWYgKG1EYXRhLT5tSW1wbCA9PSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZSBtRGF0YTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtRGF0YTsKK30KKworRVhQT1JUCitzc2l6ZV90IEFNZWRpYU11eGVyX2dldFRyYWNrQ291bnQoQU1lZGlhTXV4ZXIqIG11eGVyKSB7CisgICAgcmV0dXJuIG11eGVyLT5tSW1wbC0+Z2V0VHJhY2tDb3VudCgpOworfQorCitFWFBPUlQKK0FNZWRpYUZvcm1hdCogQU1lZGlhTXV4ZXJfZ2V0VHJhY2tGb3JtYXQoQU1lZGlhTXV4ZXIqIG11eGVyLCBzaXplX3QgaWR4KSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG11eGVyLT5tSW1wbC0+Z2V0VHJhY2tGb3JtYXQoaWR4KTsKKyAgICBpZiAoZm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZmb3JtYXQpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9URVNUX01BUFBJTkcgYi9tZWRpYS9uZGsvVEVTVF9NQVBQSU5HCmluZGV4IDFhODE1MzguLmU0MjA4MTIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9URVNUX01BUFBJTkcKKysrIGIvbWVkaWEvbmRrL1RFU1RfTUFQUElORwpAQCAtMSw2ICsxLDcgQEAKIC8vIG1hcHBpbmdzIGZvciBmcmFtZXdvcmtzL2F2L21lZGlhL25kawogewogICAicHJlc3VibWl0IjogWwotICAgIHsgIm5hbWUiOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIgfQorICAgIHsgIm5hbWUiOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIgfSwKKyAgICB7ICJuYW1lIjogImxpYm1lZGlhbmRrX3Rlc3QiIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKaW5kZXggNjJiODYyNC4uNzFiYzZkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCkBAIC01MCw3ICs1MCwxMCBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBBSW1hZ2UgQUltYWdlOwogCi0vLyBGb3JtYXRzIG5vdCBsaXN0ZWQgaGVyZSB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgYnkgQUltYWdlUmVhZGVyCisvKioKKyAqIEFJbWFnZSBzdXBwb3J0ZWQgZm9ybWF0czogQUltYWdlUmVhZGVyIG9ubHkgZ3VhcmFudGVlcyB0aGUgc3VwcG9ydCBmb3IgdGhlIGZvcm1hdHMKKyAqIGxpc3RlZCBoZXJlLgorICovCiBlbnVtIEFJTUFHRV9GT1JNQVRTIHsKICAgICAvKioKICAgICAgKiAzMiBiaXRzIFJHQkEgZm9ybWF0LCA4IGJpdHMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgY2hhbm5lbHMuCkBAIC01NTksOCArNTYyLDYgQEAKICAgICBpbnQzMl90IGJvdHRvbTsKIH0gQUltYWdlQ3JvcFJlY3Q7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogLyoqCiAgKiBSZXR1cm4gdGhlIGltYWdlIGJhY2sgdGhlIHRoZSBzeXN0ZW0gYW5kIGRlbGV0ZSB0aGUgQUltYWdlIG9iamVjdCBmcm9tIG1lbW9yeS4KICAqCkBAIC03NzcsMTAgKzc3OCw2IEBACiAgICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwKICAgICAgICAgLypvdXQqL3VpbnQ4X3QqKiBkYXRhLCAvKm91dCovaW50KiBkYXRhTGVuZ3RoKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKLQogLyoqCiAgKiBSZXR1cm4gdGhlIGltYWdlIGJhY2sgdGhlIHRoZSBzeXN0ZW0gYW5kIGRlbGV0ZSB0aGUgQUltYWdlIG9iamVjdCBmcm9tIG1lbW9yeSBhc3luY2hyb25vdXNseS4KICAqCkBAIC04MTksNyArODE2LDcgQEAKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCiAgKgogICogQHBhcmFtIGltYWdlIHRoZSB7QGxpbmsgQUltYWdlfSBvZiBpbnRlcmVzdC4KLSAqIEBwYXJhbSBvdXRCdWZmZXIgVGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgYnVmZmVyIHdpbGwgY29udGFpbiB0aGUgYWNxdWlyZWQgQUhhcmR3YXJlQnVmZmVyCisgKiBAcGFyYW0gYnVmZmVyIFRoZSBtZW1vcnkgYXJlYSBwb2ludGVkIHRvIGJ5IGJ1ZmZlciB3aWxsIGNvbnRhaW4gdGhlIGFjcXVpcmVkIEFIYXJkd2FyZUJ1ZmZlcgogICogICAgICAgICBoYW5kbGUuCiAgKiBAcmV0dXJuIDx1bD4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgpAQCAtODI5LDggKzgyNiw2IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovQUhhcmR3YXJlQnVmZmVyKiogYnVmZmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfSU1BR0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKaW5kZXggNjAwZmZjOS4uNGJkN2YyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCkBAIC01Myw4ICs1Myw2IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IEFJbWFnZVJlYWRlciBBSW1hZ2VSZWFkZXI7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjQKLQogLyoqCiAgKiBDcmVhdGUgYSBuZXcgcmVhZGVyIGZvciBpbWFnZXMgb2YgdGhlIGRlc2lyZWQgc2l6ZSBhbmQgZm9ybWF0LgogICoKQEAgLTMyMCwxMCArMzE4LDYgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCi0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKLQogLyoqCiAgKiBBSW1hZ2VSZWFkZXIgY29uc3RydWN0b3Igc2ltaWxhciB0byB7QGxpbmsgQUltYWdlUmVhZGVyX25ld30gdGhhdCB0YWtlcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlcgogICogZm9yIHRoZSBjb25zdW1lciB1c2FnZS4gQWxsIG90aGVyIHBhcmFtZXRlcnMgYW5kIHRoZSByZXR1cm4gdmFsdWVzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgcGFzc2VkCkBAIC0zMzQsMTAgKzMyOCwxMCBAQAogICogc3RpbGwgYWNxdWlyZSBpbWFnZXMgZnJvbSB0aGlzIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGFuZCBhY2Nlc3Mge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gdmlhCiAgKiB7QGxpbmsgQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKCl9LiBUaGUge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0gZ2FpbmVkIHRoaXMgd2F5IGNhbiB0aGVuCiAgKiBiZSBwYXNzZWQgYmFjayB0byBoYXJkd2FyZSAoc3VjaCBhcyBHUFUgb3IgaGFyZHdhcmUgZW5jb2RlciBpZiBzdXBwb3J0ZWQpIGZvciBmdXR1cmUgcHJvY2Vzc2luZy4KLSAqIEZvciBleGFtcGxlLCB5b3UgY2FuIG9idGFpbiBhbiB7QGxpbmsgRUdMQ2xpZW50QnVmZmVyfSBmcm9tIHRoZSB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSBieSB1c2luZwotICoge0BsaW5rIGVnbEdldE5hdGl2ZUNsaWVudEJ1ZmZlckFORFJPSUR9IGV4dGVuc2lvbiBhbmQgcGFzcyB0aGF0IHtAbGluayBFR0xDbGllbnRCdWZmZXJ9IHRvIHtAbGluawotICogZWdsQ3JlYXRlSW1hZ2VLSFJ9IHRvIGNyZWF0ZSBhbiB7QGxpbmsgRUdMSW1hZ2V9IHJlc291cmNlIHR5cGUsIHdoaWNoIG1heSB0aGVuIGJlIGJvdW5kIHRvIGEKLSAqIHRleHR1cmUgdmlhIHtAbGluayBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTfSBvbiBzdXBwb3J0ZWQgZGV2aWNlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvcgorICogRm9yIGV4YW1wbGUsIHlvdSBjYW4gb2J0YWluIGFuIEVHTENsaWVudEJ1ZmZlciBmcm9tIHRoZSB7QGxpbmsgQUhhcmR3YXJlQnVmZmVyfSBieSB1c2luZworICogZWdsR2V0TmF0aXZlQ2xpZW50QnVmZmVyQU5EUk9JRCBleHRlbnNpb24gYW5kIHBhc3MgdGhhdCBFR0xDbGllbnRCdWZmZXIgdG8KKyAqIGVnbENyZWF0ZUltYWdlS0hSIHRvIGNyZWF0ZSBhbiBFR0xJbWFnZSByZXNvdXJjZSB0eXBlLCB3aGljaCBtYXkgdGhlbiBiZSBib3VuZCB0byBhCisgKiB0ZXh0dXJlIHZpYSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIG9uIHN1cHBvcnRlZCBkZXZpY2VzLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yCiAgKiB0cmFuc3BvcnRpbmcgdGV4dHVyZXMgdGhhdCBtYXkgYmUgc2hhcmVkIGNyb3NzLXByb2Nlc3MuPC9wPgogICogPHA+SW4gZ2VuZXJhbCwgd2hlbiBzb2Z0d2FyZSBhY2Nlc3MgdG8gaW1hZ2UgZGF0YSBpcyBub3QgbmVjZXNzYXJ5LCBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfQogICogY3JlYXRlZCB3aXRoIHtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9IGZvcm1hdCBpcyBtb3JlIGVmZmljaWVudCwgY29tcGFyZWQgd2l0aCB7QGxpbmsKQEAgLTM0NSw3ICszMzksNyBAQAogICoKICAqIDxwPk5vdGUgdGhhdCBub3QgYWxsIGZvcm1hdCBhbmQgdXNhZ2UgZmxhZyBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJ9LAogICogZXNwZWNpYWxseSBpZiBcYyBmb3JtYXQgaXMge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURX0sIFxjIHVzYWdlIG11c3Qgbm90IGluY2x1ZGUgZWl0aGVyCi0gKiB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1JFQURfUkFSRUxZfSBvciB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX1JFQURfT0ZURU59PC9wPgorICoge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9SQVJFTFl9IG9yIHtAbGluayBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU59PC9wPgogICoKICAqIEBwYXJhbSB3aWR0aCBUaGUgZGVmYXVsdCB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIEltYWdlcyB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4KICAqIEBwYXJhbSBoZWlnaHQgVGhlIGRlZmF1bHQgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgSW1hZ2VzIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLgpAQCAtMzY0LDcgKzM1OCw3IEBACiAgKiAgIDx0aD5Db21wYXRpYmxlIHVzYWdlIGZsYWdzPC90aD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiAgIDx0ZD5ub24te0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURSBQUklWQVRFfSBmb3JtYXRzIGRlZmluZWQgaW4ge0BsaW5rIEFJbWFnZS5ofQorICogICA8dGQ+bm9uLXtAbGluayBBSU1BR0VfRk9STUFUX1BSSVZBVEV9IGZvcm1hdHMgZGVmaW5lZCBpbiB7QGxpbmsgTmRrSW1hZ2UuaH0KICAqIDwvdGQ+CiAgKiAgIDx0ZD57QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX1JBUkVMWX0gb3IKICAqICAge0BsaW5rIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTn08L3RkPgpAQCAtNDQ3LDYgKzQ0MSwxMCBAQAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwKICAgICAgICAgQUhhcmR3YXJlQnVmZmVyKiBidWZmZXIpOwogCisvKioKKyAqIEEgbGlzdGVuZXIgdG8gdGhlIEFIYXJkd2FyZUJ1ZmZlciByZW1vdmFsIGV2ZW50LCB1c2UKKyAqIHtAbGluayBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyfSB0byByZWdpc3RlciB0aGUgbGlzdGVuZXIgb2JqZWN0IHRvIEFJbWFnZVJlYWRlci4KKyAqLwogdHlwZWRlZiBzdHJ1Y3QgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciB7CiAgICAgLy8vIE9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlIGNhbGxiYWNrLgogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CkBAIC01MTAsOCArNTA4LDYgQEAKICAgICBBSW1hZ2VSZWFkZXIgKnJlYWRlciwgLyogb3V0ICovbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKICNlbmRpZgogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvL19OREtfSU1BR0VfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA4ZmI2YTg3Li41MTkxNDhlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0xMTQsMTQgKzExNCwxMiBAQAogICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsCiAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCk7CiAKLXN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNJbnB1dEF2YWlsYWJsZSAgb25Bc3luY0lucHV0QXZhaWxhYmxlOwogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jT3V0cHV0QXZhaWxhYmxlIG9uQXN5bmNPdXRwdXRBdmFpbGFibGU7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNGb3JtYXRDaGFuZ2VkICAgb25Bc3luY0Zvcm1hdENoYW5nZWQ7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNFcnJvciAgICAgICAgICAgb25Bc3luY0Vycm9yOwotfTsKLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQorfSBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjazsKIAogLyoqCiAgKiBDcmVhdGUgY29kZWMgYnkgbmFtZS4gVXNlIHRoaXMgaWYgeW91IGtub3cgdGhlIGV4YWN0IGNvZGVjIHlvdSB3YW50IHRvIHVzZS4KQEAgLTMxMSw4ICszMDksNiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZSgKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI2Ci0KIC8qKgogICogQ3JlYXRlcyBhIFN1cmZhY2UgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgaW5wdXQgdG8gZW5jb2RlciwgaW4gcGxhY2Ugb2YgaW5wdXQgYnVmZmVycwogICoKQEAgLTM5MywxMCArMzg5LDYgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KLQotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKioKICAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCiAgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgpAQCAtNDgyLDggKzQ3NCw2IEBACiAgKi8KIGJvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGludDMyX3QgYWN0aW9uQ29kZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCiB0eXBlZGVmIGVudW0gewogICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVIgPSAwLAogICAgIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUiA9IDEsCkBAIC01ODAsNyArNTcwLDEzIEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUNPREVDX0tFWV9IRFIxMF9QTFVTX0lORk8gX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfTE9XX0xBVEVOQ1kgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfT0ZGU0VUX1RJTUUgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FIF9fSU5UUk9EVUNFRF9JTigzMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBQ09ERUNfS0VZX1NVU1BFTkQgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFDT0RFQ19LRVlfU1VTUEVORF9USU1FIF9fSU5UUk9EVUNFRF9JTigzMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBQ09ERUNfS0VZX1ZJREVPX0JJVFJBVEUgX19JTlRST0RVQ0VEX0lOKDMxKTsKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKaW5kZXggM2ZhMDdjNy4uNTkwZDUxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHR5cGVkZWYgdWludDhfdCBBTWVkaWFVVUlEWzE2XTsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KQEAgLTY5LDggKzY3LDYgQEAKICAqLwogdm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0NSWVBUT19ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IDA1NzdkZjIuLjQxNThhOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC0zOCw4ICszOCw2IEBACiBzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZTsKIHR5cGVkZWYgc3RydWN0IEFNZWRpYURhdGFTb3VyY2UgQU1lZGlhRGF0YVNvdXJjZTsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAotCiAvKgogICogQU1lZGlhRGF0YVNvdXJjZSdzIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gYW4gaW1wbGVtZW50YXRpb24tZGVmaW5lZCB0aHJlYWQKICAqIG9yIHRocmVhZCBwb29sLiBObyBndWFyYW50ZWVzIGFyZSBwcm92aWRlZCBhYm91dCB3aGljaCB0aHJlYWQocykgd2lsbCBiZSB1c2VkIGZvcgpAQCAtOTMsOCArOTEsNiBAQAogICovCiBBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKLQogLyoqCiAgKiBDYWxsZWQgdG8gZ2V0IGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2UKICAqIHN0YXJ0aW5nIGF0IHxvZmZzZXR8IHdpdGhvdXQgYmxvY2tpbmcgZm9yIEkvTy4KQEAgLTEyNCw4ICsxMjAsNiBAQAogICAgICAgICBpbnQgbnVtaGVhZGVycywKICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGRhdGEgc291cmNlLgogICoKQEAgLTE4NSwxMCArMTc5LDYgQEAKICAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2VDbG9zZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5Ci0KIC8qKgogICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KICAqCkBAIC0yMTMsOCArMjAzLDYgQEAKICAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCi0jZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggMzFmNWM3ZC4uODQ5YThmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC0xNjUsOCArMTY1LDYgQEAKICAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGNvbnN0IEFNZWRpYURybUtleVN0YXR1cyAqa2V5U3RhdHVzLAogICAgICAgICBzaXplX3QgbnVtS2V5cywgYm9vbCBoYXNOZXdVc2FibGVLZXkpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDIxCi0KIC8qKgogICogUXVlcnkgaWYgdGhlIGdpdmVuIHNjaGVtZSBpZGVudGlmaWVkIGJ5IGl0cyBVVUlEIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgYW5kCiAgKiB3aGV0aGVyIHRoZSBkcm0gcGx1Z2luIGlzIGFibGUgdG8gaGFuZGxlIHRoZSBtZWRpYSBjb250YWluZXIgZm9ybWF0IHNwZWNpZmllZCBieSBtaW1lVHlwZS4KQEAgLTU3Niw4ICs1NzQsNiBAQAogICAgICAgICBjb25zdCBjaGFyICptYWNBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCBjb25zdCB1aW50OF90ICptZXNzYWdlLCBzaXplX3QgbWVzc2FnZVNpemUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KLQogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19NRURJQV9EUk1fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCmluZGV4IDJiZTFkNmUuLjAyZmRjNzkgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKQEAgLTQwLDcgKzQwLDExIEBACiAKIF9fQkVHSU5fREVDTFMKIAorLyoqCisgKiBNZWRpYSBlcnJvciBtZXNzYWdlIHR5cGVzIHJldHVybmVkIGZyb20gTkRLIG1lZGlhIGZ1bmN0aW9ucy4KKyAqLwogdHlwZWRlZiBlbnVtIHsKKyAgICAvKiogVGhlIHJlcXVlc3RlZCBtZWRpYSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gKi8KICAgICBBTUVESUFfT0sgPSAwLAogCiAgICAgLyoqCkBAIC01NSwxNCArNTksMzQgQEAKICAgICBBTUVESUFDT0RFQ19FUlJPUl9SRUNMQUlNRUQgICAgICAgICAgICAgPSAxMTAxLAogCiAgICAgQU1FRElBX0VSUk9SX0JBU0UgICAgICAgICAgICAgICAgICA9IC0xMDAwMCwKKworICAgIC8qKiBUaGUgY2FsbGVkIG1lZGlhIGZ1bmN0aW9uIGZhaWxlZCB3aXRoIGFuIHVua25vd24gZXJyb3IuICovCiAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gICAgICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFLAorCisgICAgLyoqIFRoZSBpbnB1dCBtZWRpYSBkYXRhIGlzIGNvcnJ1cHQgb3IgaW5jb21wbGV0ZS4gKi8KICAgICBBTUVESUFfRVJST1JfTUFMRk9STUVEICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAxLAorCisgICAgLyoqIFRoZSByZXF1aXJlZCBvcGVyYXRpb24gb3IgbWVkaWEgZm9ybWF0cyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KICAgICBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAyLAorCisgICAgLyoqIEFuIGludmFsaWQgKG9yIGFscmVhZHkgY2xvc2VkKSBvYmplY3QgaXMgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gKi8KICAgICBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1QgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSAzLAorCisgICAgLyoqIEF0IGxlYXN0IG9uZSBvZiB0aGUgaW52YWxpZCBwYXJhbWV0ZXJzIGlzIHVzZWQuICovCiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNCwKKworICAgIC8qKiBUaGUgbWVkaWEgb2JqZWN0IGlzIG5vdCBpbiB0aGUgcmlnaHQgc3RhdGUgZm9yIHRoZSByZXF1aXJlZCBvcGVyYXRpb24uICovCiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKKworICAgIC8qKiBNZWRpYSBzdHJlYW0gZW5kcyB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLiAqLwogICAgIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDYsCisKKyAgICAvKiogQW4gRXJyb3Igb2NjdXJyZWQgd2hlbiB0aGUgTWVkaWEgb2JqZWN0IGlzIGNhcnJ5aW5nIElPIG9wZXJhdGlvbi4gKi8KICAgICBBTUVESUFfRVJST1JfSU8gICAgICAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA3LAorCisgICAgLyoqIFRoZSByZXF1aXJlZCBvcGVyYXRpb24gd291bGQgaGF2ZSB0byBiZSBibG9ja2VkIChvbiBJL08gb3Igb3RoZXJzKSwKKyAgICAgKiAgIGJ1dCBibG9ja2luZyBpcyBub3QgZW5hYmxlZC4KKyAgICAgKi8KICAgICBBTUVESUFfRVJST1JfV09VTERfQkxPQ0sgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA4LAogCiAgICAgQU1FRElBX0RSTV9FUlJPUl9CQVNFICAgICAgICAgICAgICA9IC0yMDAwMCwKQEAgLTc3LDEwICsxMDEsMjAgQEAKICAgICBBTUVESUFfRFJNX0xJQ0VOU0VfRVhQSVJFRCAgICAgICAgID0gQU1FRElBX0RSTV9FUlJPUl9CQVNFIC0gOSwKIAogICAgIEFNRURJQV9JTUdSRUFERVJfRVJST1JfQkFTRSAgICAgICAgICA9IC0zMDAwMCwKKworICAgIC8qKiBUaGVyZSBhcmUgbm8gbW9yZSBpbWFnZSBidWZmZXJzIHRvIHJlYWQvd3JpdGUgaW1hZ2UgZGF0YS4gKi8KICAgICBBTUVESUFfSU1HUkVBREVSX05PX0JVRkZFUl9BVkFJTEFCTEUgPSBBTUVESUFfSU1HUkVBREVSX0VSUk9SX0JBU0UgLSAxLAorCisgICAgLyoqIFRoZSBBSW1hZ2Ugb2JqZWN0IGhhcyB1c2VkIHVwIHRoZSBhbGxvd2VkIG1heGltdW0gaW1hZ2UgYnVmZmVycy4gKi8KICAgICBBTUVESUFfSU1HUkVBREVSX01BWF9JTUFHRVNfQUNRVUlSRUQgPSBBTUVESUFfSU1HUkVBREVSX0VSUk9SX0JBU0UgLSAyLAorCisgICAgLyoqIFRoZSByZXF1aXJlZCBpbWFnZSBidWZmZXIgY291bGQgbm90IGJlIGxvY2tlZCB0byByZWFkLiAqLwogICAgIEFNRURJQV9JTUdSRUFERVJfQ0FOTk9UX0xPQ0tfSU1BR0UgICA9IEFNRURJQV9JTUdSRUFERVJfRVJST1JfQkFTRSAtIDMsCisKKyAgICAvKiogVGhlIG1lZGlhIGRhdGEgb3IgYnVmZmVyIGNvdWxkIG5vdCBiZSB1bmxvY2tlZC4gKi8KICAgICBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9VTkxPQ0tfSU1BR0UgPSBBTUVESUFfSU1HUkVBREVSX0VSUk9SX0JBU0UgLSA0LAorCisgICAgLyoqIFRoZSBtZWRpYS9idWZmZXIgbmVlZHMgdG8gYmUgbG9ja2VkIHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIG9wZXJhdGlvbi4gKi8KICAgICBBTUVESUFfSU1HUkVBREVSX0lNQUdFX05PVF9MT0NLRUQgICAgPSBBTUVESUFfSU1HUkVBREVSX0VSUk9SX0JBU0UgLSA1LAogCiB9IG1lZGlhX3N0YXR1c190OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKaW5kZXggMTQzMTljNC4uZTQyOTgyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCkBAIC0zNiw2ICszNiw3IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKICNkZWZpbmUgX05ES19NRURJQV9FWFRSQUNUT1JfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCkBAIC00OSw4ICs1MCw2IEBACiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yOwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yIEFNZWRpYUV4dHJhY3RvcjsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yLgogICoKQEAgLTgxLDggKzgwLDYgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosCiAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4Ci0KIC8qKgogICogU2V0IHRoZSBjdXN0b20gZGF0YSBzb3VyY2UgaW1wbGVtZW50YXRpb24gZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KICAqCkBAIC05MSw4ICs4OCw2IEBACiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICBBTWVkaWFEYXRhU291cmNlICpzcmMpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KLQogLyoqCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0cmFja3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIG1lZGlhIGZpbGUKICAqCkBAIC0yMTAsOCArMjA1LDYgQEAKICAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfRU5DUllQVEVEID0gMiwKIH07CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKLQogLyoqCiAgKiBSZXR1cm5zIHRoZSBmb3JtYXQgb2YgdGhlIGV4dHJhY3Rvci4gVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdAogICogdXNpbmcgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpLgpAQCAtMjY1LDEwICsyNTgsNiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IgKmV4LAogICAgICAgICBBTWVkaWFGb3JtYXQgKmZtdCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwotCi0jZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCi0KIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0VYVFJBQ1RPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA0OWQ4YjRhLi5mYmQ4NTVkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTM2LDkgKzM2LDE0IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKICNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaWYgIWRlZmluZWQoX19JTlRST0RVQ0VEX0lOKQorI2RlZmluZSBfX0lOVFJPRFVDRURfSU4oX19hcGlfbGV2ZWwpIC8qIG5vdGhpbmcgKi8KKyNlbmRpZgorCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCiBfX0JFR0lOX0RFQ0xTCkBAIC00Niw4ICs1MSw2IEBACiBzdHJ1Y3QgQU1lZGlhRm9ybWF0OwogdHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRm9ybWF0IEFNZWRpYUZvcm1hdDsKIAotI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQotCiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KQEAgLTE5MCw5ICsxOTMsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjEpOwotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI4CiAvKioKICAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KQEAgLTIxNiw5ICsyMTcsNyBAQAogICovCiB2b2lkIEFNZWRpYUZvcm1hdF9zZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSBfX0lOVFJPRFVDRURfSU4oMjgpOwotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI5CiAvKioKICAqIFJlbW92ZSBhbGwga2V5L3ZhbHVlIHBhaXJzIGZyb20gdGhlIGdpdmVuIEFNZWRpYUZvcm1hdC4KICAqCkBAIC0yOTIsOSArMjkxLDYgQEAKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLwotCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDMwCiAvKioKICAqIEFuIG9wdGlvbmFsIGtleSBkZXNjcmliaW5nIHRoZSBsb3cgbGF0ZW5jeSBkZWNvZGluZyBtb2RlLiBUaGlzIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlcgogICogdGhhdCBhcHBsaWVzIG9ubHkgdG8gZGVjb2RlcnMuIElmIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXNuJ3QgaG9sZCBpbnB1dCBhbmQgb3V0cHV0CkBAIC0zMDUsNyArMzAxLDI0IEBACiAgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMwLgogICovCiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT1dfTEFURU5DWSBfX0lOVFJPRFVDRURfSU4oMzApOwotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAzMCAqLworCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFIxMF9QTFVTX0lORk8gX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMT1dfTU9USU9OX01BUktFUlMgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfQVYxQyBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWE1QX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWE1QX1NJWkUgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9GSUxFX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFTVF9TQU1QTEVfSU5ERVhfSU5fQ0hVTksgX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9USU1FX0JFRk9SRV9BUFBFTkQgX19JTlRST0RVQ0VEX0lOKDMxKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9CX01JTiBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01BWCBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9JX01JTiBfX0lOVFJPRFVDRURfSU4oMzEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9WSURFT19RUF9NQVggX19JTlRST0RVQ0VEX0lOKDMxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfVklERU9fUVBfTUlOIF9fSU5UUk9EVUNFRF9JTigzMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUFYIF9fSU5UUk9EVUNFRF9JTigzMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX1ZJREVPX1FQX1BfTUlOIF9fSU5UUk9EVUNFRF9JTigzMSk7CiAKIF9fRU5EX0RFQ0xTCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAppbmRleCA5ZGUzZmJmLi5kN2VjY2I4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCkBAIC01NCw3ICs1NCwxNiBAQAogICAgIEFNRURJQU1VWEVSX09VVFBVVF9GT1JNQVRfVEhSRUVfR1BQICAgPSAyLAogfSBPdXRwdXRGb3JtYXQ7CiAKLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKK3R5cGVkZWYgZW51bSB7CisgICAgLyogTGFzdCBncm91cCBvZiBwaWN0dXJlcyhHT1ApIG9mIHZpZGVvIHRyYWNrIGNhbiBiZSBpbmNvbXBsZXRlLCBzbyBpdCB3b3VsZCBiZSBzYWZlIHRvCisgICAgICogc2NyYXAgdGhhdCBhbmQgcmV3cml0ZS4gIElmIGJvdGggYXVkaW8gYW5kIHZpZGVvIHRyYWNrcyBhcmUgcHJlc2VudCBpbiBhIGZpbGUsIHRoZW4KKyAgICAgKiBzYW1wbGVzIG9mIGF1ZGlvIHRyYWNrIGFmdGVyIGxhc3QgR09QIG9mIHZpZGVvIHdvdWxkIGJlIHNjcmFwcGVkIHRvby4KKyAgICAgKiBJZiBvbmx5IGF1ZGlvIHRyYWNrIGlzIHByZXNlbnQsIHRoZW4gbm8gc2FtcGxlIHdvdWxkIGJlIGRpc2NhcmRlZC4KKyAgICAgKi8KKyAgICBBTUVESUFNVVhFUl9BUFBFTkRfSUdOT1JFX0xBU1RfVklERU9fR09QID0gMCwKKyAgICAvLyBLZWVwIGFsbCBleGlzdGluZyBzYW1wbGVzIGFzIGl0IGlzIGFuZCBhcHBlbmQgbmV3IHNhbXBsZXMgYWZ0ZXIgdGhhdCBvbmx5LgorICAgIEFNRURJQU1VWEVSX0FQUEVORF9UT19FWElTVElOR19EQVRBID0gMSwKK30gQXBwZW5kTW9kZTsKIAogLyoqCiAgKiBDcmVhdGUgbmV3IG1lZGlhIG11eGVyLgpAQCAtMTQwLDcgKzE0OSw0NSBAQAogICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCiAgICAgICAgIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLworLyoqCisgKiBDcmVhdGVzIGEgbmV3IG1lZGlhIG11eGVyIGZvciBhcHBlbmRpbmcgZGF0YSB0byBhbiBleGlzdGluZyBNUEVHNCBmaWxlLgorICogVGhpcyBpcyBhIHN5bmNocm9ub3VzIEFQSSBjYWxsIGFuZCBjb3VsZCB0YWtlIGEgd2hpbGUgdG8gcmV0dXJuIGlmIHRoZSBleGlzdGluZyBmaWxlIGlzIGxhcmdlLgorICogT25seSB3b3JrcyBmb3IgTVBFRzQgZmlsZXMgbWF0Y2hpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyaXN0aWNzOgorICogPHVsPgorICogICAgPGxpPmEgc2luZ2xlIGF1ZGlvIHRyYWNrLjwvbGk+CisgKiAgICA8bGk+YSBzaW5nbGUgdmlkZW8gdHJhY2suPC9saT4KKyAqICAgIDxsaT5hIHNpbmdsZSBhdWRpbyBhbmQgYSBzaW5nbGUgdmlkZW8gdHJhY2suPC9saT4KKyAqIDwvdWw+CisgKiBAcGFyYW0gZmQgTXVzdCBiZSBvcGVuZWQgd2l0aCByZWFkIGFuZCB3cml0ZSBwZXJtaXNzaW9uLiBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZgorICogdGhpcyBmZCBpLmUuLCBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgZmQuCisgKiBAcGFyYW0gbW9kZSBTcGVjaWZpZXMgaG93IGRhdGEgd2lsbCBiZSBhcHBlbmRlZDsgdGhlIEFwcGVuZE1vZGUgZW51bSBkZXNjcmliZXMKKyAqICAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBtZXRob2RzIGZvciBhcHBlbmRpbmcuLgorICogQHJldHVybiBQb2ludGVyIHRvIEFNZWRpYU11eGVyIGlmIHRoZSBmaWxlKGZkKSBoYXMgdHJhY2tzIGFscmVhZHksIG90aGVyd2lzZSwgbnVsbHB0ci4KKyAqIHtAbGluayBBTWVkaWFNdXhlcl9kZWxldGV9IHNob3VsZCBiZSB1c2VkIHRvIGZyZWUgdGhlIHJldHVybmVkIHBvaW50ZXIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAqLworQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX2FwcGVuZChpbnQgZmQsIEFwcGVuZE1vZGUgbW9kZSkgX19JTlRST0RVQ0VEX0lOKDMxKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJhY2tzIGFkZGVkIGluIHRoZSBmaWxlIHBhc3NlZCB0byB7QGxpbmsgQU1lZGlhTXV4ZXJfbmV3fSBvcgorICogdGhlIG51bWJlciBvZiBleGlzdGluZyB0cmFja3MgaW4gdGhlIGZpbGUgcGFzc2VkIHRvIHtAbGluayBBTWVkaWFNdXhlcl9hcHBlbmR9LgorICogU2hvdWxkIGJlIGNhbGxlZCBpbiBJTklUSUFMSVpFRCBvciBTVEFSVEVEIHN0YXRlLCBvdGhlcndpc2UgcmV0dXJucyAtMS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICovCitzc2l6ZV90IEFNZWRpYU11eGVyX2dldFRyYWNrQ291bnQoQU1lZGlhTXV4ZXIqKSBfX0lOVFJPRFVDRURfSU4oMzEpOworCisvKioKKyAqIFJldHVybnMgQU1lZGlhRm9ybWF0IG9mIHRoZSBhZGRlZCB0cmFjayB3aXRoIGluZGV4IGlkeCBpbiB0aGUgZmlsZSBwYXNzZWQgdG8KKyAqIHtAbGluayBBTWVkaWFNdXhlcl9uZXd9IG9yIHRoZSBBTWVkaWFGb3JtYXQgb2YgdGhlIGV4aXN0aW5nIHRyYWNrIHdpdGggaW5kZXggaWR4CisgKiBpbiB0aGUgZmlsZSBwYXNzZWQgdG8ge0BsaW5rIEFNZWRpYU11eGVyX2FwcGVuZH0uCisgKiBTaG91bGQgYmUgY2FsbGVkIGluIElOSVRJQUxJWkVEIG9yIFNUQVJURUQgc3RhdGUsIG90aGVyd2lzZSByZXR1cm5zIG51bGxwdHIuCisgKiB7QGxpbmsgQU1lZGlhRm9ybWF0X2RlbGV0ZX0gc2hvdWxkIGJlIHVzZWQgdG8gZnJlZSB0aGUgcmV0dXJuZWQgcG9pbnRlci4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYU11eGVyX2dldFRyYWNrRm9ybWF0KEFNZWRpYU11eGVyKiBtdXhlciwgc2l6ZV90IGlkeCkgX19JTlRST0RVQ0VEX0lOKDMxKTsKIAogX19FTkRfREVDTFMKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzY4YTU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL25kay9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9QUklWQVRFX01FRElBX05ES0lNQUdFX0hfCi0jZGVmaW5lIF9QUklWQVRFX01FRElBX05ES0lNQUdFX0hfCi0vLyBGb3JtYXRzIG5vdCBsaXN0ZWQgaW4gdGhlIHB1YmxpYyBBUEksIGJ1dCBzdGlsbCBhdmFpbGFibGUgdG8gQUltYWdlUmVhZGVyCi1lbnVtIEFJTUFHRV9QUklWQVRFX0ZPUk1BVFMgewotICAgIC8qKgotICAgICAqIFVucHJvY2Vzc2VkIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCByYXcKLSAgICAgKiBkZXB0aCBtZWFzdXJlbWVudHMsIG9wYXF1ZSB3aXRoIDE2IGJpdAotICAgICAqIHNhbXBsZXMuCi0gICAgICoKLSAgICAgKi8KLQotICAgIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIID0gMHgxMDAyLAotfTsKLSNlbmRpZiAvLyBfUFJJVkFURV9NRURJQV9OREtJTUFHRQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGVfcGxhdGZvcm0vbWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmggYi9tZWRpYS9uZGsvaW5jbHVkZV9wbGF0Zm9ybS9tZWRpYS9OZGtNZWRpYUNvZGVjUGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRkNzEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGVfcGxhdGZvcm0vbWVkaWEvTmRrTWVkaWFDb2RlY1BsYXRmb3JtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19NRURJQV9DT0RFQ19QTEFURk9STV9ICisjZGVmaW5lIF9OREtfTUVESUFfQ09ERUNfUExBVEZPUk1fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisKK19fQkVHSU5fREVDTFMKKworLyoqCisgKiBTcGVjaWFsIHVpZCBhbmQgcGlkIHZhbHVlcyB1c2VkIHdpdGggQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQsCisgKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlRm9yQ2xpZW50IGFuZCBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlRm9yQ2xpZW50LgorICoKKyAqIEludHJvZHVjZWQgaW4gQVBJIDMxLgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBVaWQgdmFsdWUgdG8gaW5kaWNhdGUgdXNpbmcgY2FsbGluZyB1aWQuCisgICAgICovCisgICAgQU1FRElBQ09ERUNfQ0FMTElOR19VSUQgPSAtMSwKKyAgICAvKioKKyAgICAgKiBQaWQgdmFsdWUgdG8gaW5kaWNhdGUgdXNpbmcgY2FsbGluZyBwaWQuCisgICAgICovCisgICAgQU1FRElBQ09ERUNfQ0FMTElOR19QSUQgPSAtMSwKK307CisKKy8qKgorICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUgb24gYmVoYWxmIG9mIGEgY2xpZW50LgorICoKKyAqIFRoZSB1c2FnZSBpcyBzaW1pbGFyIHRvIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKCksIGV4Y2VwdCB0aGF0IHRoZSBjb2RlYyBpbnN0YW5jZQorICogd2lsbCBiZSBhdHRyaWJ1dGVkIHRvIHRoZSBjbGllbnQgb2Yge3VpZCwgcGlkfSwgaW5zdGVhZCBvZiB0aGUgY2FsbGVyLgorICoKKyAqIE9ubHkgY2VydGFpbiBwcml2aWxlZ2VkIHVzZXJzIGFyZSBhbGxvd2VkIHRvIHNwZWNpZnkge3VpZCwgcGlkfSB0aGF0J3MgZGlmZmVyZW50IGZyb20gdGhlCisgKiBjYWxsZXIncy4gV2l0aG91dCB0aGUgcHJpdmlsZWdlLCB0aGlzIEFQSSB3aWxsIGJlaGF2ZSB0aGUgc2FtZSBhcworICogQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWUoKS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDMxLgorICovCitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSBfX0lOVFJPRFVDRURfSU4oMzEpOworCisvKioKKyAqIENyZWF0ZSBjb2RlYyBieSBtaW1lIHR5cGUgb24gYmVoYWxmIG9mIGEgY2xpZW50LgorICoKKyAqIFRoZSB1c2FnZSBpcyBzaW1pbGFyIHRvIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoKSwgZXhjZXB0IHRoYXQgdGhlIGNvZGVjIGluc3RhbmNlCisgKiB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIGNsaWVudCBvZiB7dWlkLCBwaWR9LCBpbnN0ZWFkIG9mIHRoZSBjYWxsZXIuCisgKgorICogT25seSBjZXJ0YWluIHByaXZpbGVnZWQgdXNlcnMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSB7dWlkLCBwaWR9IHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAqIGNhbGxlcidzLiBXaXRob3V0IHRoZSBwcml2aWxlZ2UsIHRoaXMgQVBJIHdpbGwgYmVoYXZlIHRoZSBzYW1lIGFzCisgKiBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlKCkuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGVGb3JDbGllbnQoY29uc3QgY2hhciAqbWltZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSBfX0lOVFJPRFVDRURfSU4oMzEpOworCisvKioKKyAqIENyZWF0ZSBlbmNvZGVyIGJ5IG5hbWUgb24gYmVoYWxmIG9mIGEgY2xpZW50LgorICoKKyAqIFRoZSB1c2FnZSBpcyBzaW1pbGFyIHRvIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUoKSwgZXhjZXB0IHRoYXQgdGhlIGNvZGVjIGluc3RhbmNlCisgKiB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gdGhlIGNsaWVudCBvZiB7dWlkLCBwaWR9LCBpbnN0ZWFkIG9mIHRoZSBjYWxsZXIuCisgKgorICogT25seSBjZXJ0YWluIHByaXZpbGVnZWQgdXNlcnMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSB7dWlkLCBwaWR9IHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAqIGNhbGxlcidzLiBXaXRob3V0IHRoZSBwcml2aWxlZ2UsIHRoaXMgQVBJIHdpbGwgYmVoYXZlIHRoZSBzYW1lIGFzCisgKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKCkuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAzMS4KKyAqLworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGVGb3JDbGllbnQoY29uc3QgY2hhciAqbWltZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKSBfX0lOVFJPRFVDRURfSU4oMzEpOworCitfX0VORF9ERUNMUworCisjZW5kaWYgLy9fTkRLX01FRElBX0NPREVDX1BMQVRGT1JNX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IDI5ZjFkYTguLjdlOWU1N2UgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC0yNyw2ICsyNywxMyBAQAogICAgIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlX2dldFRpbWVzdGFtcDsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlX2dldFdpZHRoOyAjIGludHJvZHVjZWQ9MjQKKyAgICBBTUVESUFDT0RFQ19LRVlfSERSMTBfUExVU19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTMxCisgICAgQU1FRElBQ09ERUNfS0VZX0xPV19MQVRFTkNZOyAjIHZhciBpbnRyb2R1Y2VkPTMxCisgICAgQU1FRElBQ09ERUNfS0VZX09GRlNFVF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTMxCisgICAgQU1FRElBQ09ERUNfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRTsgIyB2YXIgaW50cm9kdWNlZD0zMQorICAgIEFNRURJQUNPREVDX0tFWV9TVVNQRU5EOyAjIHZhciBpbnRyb2R1Y2VkPTMxCisgICAgQU1FRElBQ09ERUNfS0VZX1NVU1BFTkRfVElNRTsgIyB2YXIgaW50cm9kdWNlZD0zMQorICAgIEFNRURJQUNPREVDX0tFWV9WSURFT19CSVRSQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTMxCiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1I7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT047ICMgdmFyIGludHJvZHVjZWQ9MjgKQEAgLTkxLDYgKzk4LDcgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfSERSMTBfUExVU19JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTMxCiAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRDsgIyB2YXIgaW50cm9kdWNlZD0yOApAQCAtMTAxLDYgKzEwOSw3IEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTEFTVF9TQU1QTEVfSU5ERVhfSU5fQ0hVTks7ICMgdmFyIGludHJvZHVjZWQ9MzEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1k7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQpAQCAtMTI2LDE3ICsxMzUsMjEgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVI7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfRklMRV9PRkZTRVQ7ICMgdmFyIGludHJvZHVjZWQ9MzEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9USU1FX0JFRk9SRV9BUFBFTkQ7ICMgdmFyIGludHJvZHVjZWQ9MzEKICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9TTE9XX01PVElPTl9NQVJLRVJTOyAjIHZhciBpbnRyb2R1Y2VkPTMxCiAgICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREU7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0FWMUM7ICMgdmFyIGludHJvZHVjZWQ9MzEKICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKQEAgLTE0OSw2ICsxNjIsOCBAQAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9YTVBfT0ZGU0VUOyAjIHZhciBpbnRyb2R1Y2VkPTMxCisgICAgQU1FRElBRk9STUFUX0tFWV9YTVBfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0zMQogICAgIEFNRURJQUZPUk1BVF9LRVlfWUVBUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQ7ICMgaW50cm9kdWNlZD0yOApAQCAtMTYzLDggKzE3OCwxMSBAQAogICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuOyAjIGludHJvZHVjZWQ9MjQKICAgICBBTWVkaWFDb2RlY19jb25maWd1cmU7CiAgICAgQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWU7CisgICAgQU1lZGlhQ29kZWNfY3JlYXRlQ29kZWNCeU5hbWVGb3JDbGllbnQ7ICMgYXBleCAjIGludHJvZHVjZWQ9MzEKICAgICBBTWVkaWFDb2RlY19jcmVhdGVEZWNvZGVyQnlUeXBlOworICAgIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGVGb3JDbGllbnQ7ICMgYXBleCAjIGludHJvZHVjZWQ9MzEKICAgICBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlOworICAgIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGVGb3JDbGllbnQ7ICMgYXBleCAjIGludHJvZHVjZWQ9MzEKICAgICBBTWVkaWFDb2RlY19kZWxldGU7CiAgICAgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXI7CkBAIC0yNzEsNyArMjg5LDEwIEBACiAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZzsKICAgICBBTWVkaWFGb3JtYXRfdG9TdHJpbmc7CiAgICAgQU1lZGlhTXV4ZXJfYWRkVHJhY2s7CisgICAgQU1lZGlhTXV4ZXJfYXBwZW5kOyAjIGludHJvZHVjZWQ9MzEKICAgICBBTWVkaWFNdXhlcl9kZWxldGU7CisgICAgQU1lZGlhTXV4ZXJfZ2V0VHJhY2tDb3VudDsgIyBpbnRyb2R1Y2VkPTMxCisgICAgQU1lZGlhTXV4ZXJfZ2V0VHJhY2tGb3JtYXQ7ICMgaW50cm9kdWNlZD0zMQogICAgIEFNZWRpYU11eGVyX25ldzsKICAgICBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbjsKICAgICBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQ7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKaW5kZXggNWI2NTA2NC4uMjc4NjRjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCisrKyBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApAQCAtMTcsMTAgKzE3LDEwIEBACiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8TmRrSW1hZ2VQcml2Lmg+CiAjaW5jbHVkZSA8TmRrSW1hZ2VSZWFkZXJQcml2Lmg+CiAjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KICNpbmNsdWRlIDxtZW1vcnk+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL25kay90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NGIzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gSGVhZGVycyBtb2R1bGUgaXMgaW4gZnJhbWV3b3Jrcy9hdi9BbmRyb2lkLmJwIGJlY2F1c2UgbW9kdWxlcyBhcmUgbm90IGFsbG93ZWQKKy8vIHRvIHJlZmVyIHRvIGhlYWRlcnMgaW4gcGFyZW50IGRpcmVjdG9yaWVzIGFuZCB0aGUgaGVhZGVycyBsaXZlIGluCisvLyBmcmFtZXdvcmtzL2F2L2luY2x1ZGUuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X21lZGlhX25ka19saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka190ZXN0IiwKKyAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYUZvcm1hdF90ZXN0LmNwcCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL25kay90ZXN0cy9OZGtNZWRpYUZvcm1hdF90ZXN0LmNwcCBiL21lZGlhL25kay90ZXN0cy9OZGtNZWRpYUZvcm1hdF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjhkMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL3Rlc3RzL05ka01lZGlhRm9ybWF0X3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTmRrTWVkaWFGb3JtYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfY3JlYXRlKSB7CisKKyAgIEFNZWRpYUZvcm1hdCAqZm10MSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgIEFNZWRpYUZvcm1hdCAqZm10MiA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKworICAgRVhQRUNUX05FKGZtdDEsIGZtdDIpOworICAgRVhQRUNUX05FKGZtdDEsIG51bGxwdHIpOworICAgRVhQRUNUX05FKGZtdDIsIG51bGxwdHIpOworCisgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZtdDEpOworICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmbXQyKTsKK30KKworVEVTVChOZGtNZWRpYUZvcm1hdF90ZXN0cywgdGVzdF9pbnQzMikgeworICAgQU1lZGlhRm9ybWF0ICpmbXQxID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgaW50MzJfdCBpMzI7CisgICBpbnQ2NF90IGk2NDsKKyAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmbXQxLCAiZml2ZSIsIDUpOworCisgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm10MSwgImZpdmUiLCAmaTMyKSk7CisgICBFWFBFQ1RfRkFMU0UoQU1lZGlhRm9ybWF0X2dldEludDY0KGZtdDEsICJmaXZlIiwgJmk2NCkpOworICAgRVhQRUNUX0VRKGkzMiwgNSk7CisKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfaW50NjQpIHsKKyAgIEFNZWRpYUZvcm1hdCAqZm10MSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgIGludDY0X3QgaTY0OworICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZtdDEsICJ2ZXJ5bGFyZ2UiLCBJTlQ2NF9NQVgpOworCisgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZm10MSwgInZlcnlsYXJnZSIsICZpNjQpKTsKKyAgIEVYUEVDVF9FUShpNjQsIElOVDY0X01BWCk7CisKKyAgIC8vIHJldHVybiB1bmNoYW5nZWQgaWYgbm90IGZvdW5kCisgICBpNjQgPSAtMTsKKyAgIEVYUEVDVF9GQUxTRShBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZm10MSwgImZpdmUiLCAmaTY0KSk7CisgICBFWFBFQ1RfRVEoaTY0LCAtMSk7CisKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3Rfc2l6ZSkgeworICAgQU1lZGlhRm9ybWF0ICpmbXQxID0gQU1lZGlhRm9ybWF0X25ldygpOworCisgICBzaXplX3Qgc2l6ZSA9IC0xNTsKKyAgIEFNZWRpYUZvcm1hdF9zZXRTaXplKGZtdDEsICJzbWFsbCIsIDEpOworICAgQU1lZGlhRm9ybWF0X3NldFNpemUoZm10MSwgIm1lZGl1bSIsIDEwKTsKKyAgIEFNZWRpYUZvcm1hdF9zZXRTaXplKGZtdDEsICJsYXJnZSIsIDEwMCk7CisgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0U2l6ZShmbXQxLCAibWVkaXVtIiwgJnNpemUpKTsKKyAgIEVYUEVDVF9FUShzaXplLCAxMCk7CisKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfZmxvYXQpIHsKKyAgIEFNZWRpYUZvcm1hdCAqZm10MSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgIGZsb2F0IGY7CisgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZm10MSwgImJvYXQiLCAxLjUpOworICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGZtdDEsICJzaGlwIiwgMC41KTsKKyAgIEVYUEVDVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRGbG9hdChmbXQxLCAiYm9hdCIsICZmKSk7CisgICBFWFBFQ1RfRVEoZiwgMS41KTsKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfZG91YmxlKSB7CisgICBBTWVkaWFGb3JtYXQgKmZtdDEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICBkb3VibGUgZDsKKyAgIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoZm10MSwgInRyb3VibGUiLCAxMDAuNSk7CisgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKGZtdDEsICJkaXAiLCAwLjUpOworICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldERvdWJsZShmbXQxLCAidHJvdWJsZSIsICZkKSk7CisgICBFWFBFQ1RfRVEoZCwgMTAwLjUpOworICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmbXQxKTsKK30KKworVEVTVChOZGtNZWRpYUZvcm1hdF90ZXN0cywgdGVzdF9zdHJpbmcpIHsKKyAgIEFNZWRpYUZvcm1hdCAqZm10MSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKworICAgY29uc3QgY2hhciAqY29udGVudCA9ICJUaGlzIGlzIG15IHRlc3Qgc3RyaW5nIjsKKyAgIGNvbnN0IGNoYXIgKm91dCA9IG51bGxwdHI7CisgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZtdDEsICJzdHJpbmd0aGVvcnkiLCBjb250ZW50KTsKKyAgIEVYUEVDVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm10MSwgInN0cmluZ3RoZW9yeSIsICZvdXQpKTsKKyAgIEVYUEVDVF9ORShvdXQsIG51bGxwdHIpOworICAgRVhQRUNUX0VRKHN0cmNtcChvdXQsY29udGVudCksIDApOworCisgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZtdDEpOworfQorCisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfY2xlYXIpIHsKKyAgIEFNZWRpYUZvcm1hdCAqZm10MSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKworICAgaW50MzJfdCBpMzI7CisgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoZm10MSwgImZpdmUiLCA1KTsKKyAgIHNpemVfdCBzaXplID0gLTE1OworICAgQU1lZGlhRm9ybWF0X3NldFNpemUoZm10MSwgIm1lZGl1bSIsIDEwKTsKKyAgIGZsb2F0IGY7CisgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoZm10MSwgImJvYXQiLCAxLjUpOworCisgICBBTWVkaWFGb3JtYXRfY2xlYXIoZm10MSk7CisgICBFWFBFQ1RfRkFMU0UoQU1lZGlhRm9ybWF0X2dldEludDMyKGZtdDEsICJmaXZlIiwgJmkzMikpOworICAgRVhQRUNUX0ZBTFNFKEFNZWRpYUZvcm1hdF9nZXRTaXplKGZtdDEsICJtZWRpdW0iLCAmc2l6ZSkpOworICAgRVhQRUNUX0ZBTFNFKEFNZWRpYUZvcm1hdF9nZXRGbG9hdChmbXQxLCAiYm9hdCIsICZmKSk7CisKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfY29weSkgeworICAgQU1lZGlhRm9ybWF0ICpmbXQxID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgQU1lZGlhRm9ybWF0ICpmbXQyID0gQU1lZGlhRm9ybWF0X25ldygpOworCisgICBkb3VibGUgZDsKKyAgIGludDMyX3QgaTMyOworCisgICAvLyB0ZXN0IGNvcHkgZnVuY3Rpb25hbGl0eSAoTkI6IHdlIGNsZWFyZWQgZXZlcnl0aGluZyBqdXN0IGFib3ZlIGhlcmUpCisgICBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKGZtdDEsICJ0cm91YmxlIiwgMTAwLjUpOworICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldERvdWJsZShmbXQxLCAidHJvdWJsZSIsICZkKSk7CisgICBFWFBFQ1RfRkFMU0UoQU1lZGlhRm9ybWF0X2dldERvdWJsZShmbXQyLCAidHJvdWJsZSIsICZkKSk7CisKKyAgIEVYUEVDVF9FUShBTUVESUFfT0ssIEFNZWRpYUZvcm1hdF9jb3B5KGZtdDIsIGZtdDEpKTsKKworICAgRVhQRUNUX1RSVUUoQU1lZGlhRm9ybWF0X2dldERvdWJsZShmbXQyLCAidHJvdWJsZSIsICZkKSk7CisgICBFWFBFQ1RfRVEoZCwgMTAwLjUpOworCisgICBBTWVkaWFGb3JtYXQgKmZtdDMgPSBudWxscHRyOworICAgRVhQRUNUX05FKEFNRURJQV9PSywgQU1lZGlhRm9ybWF0X2NvcHkoZm10MywgZm10MSkpOworICAgRVhQRUNUX05FKEFNRURJQV9PSywgQU1lZGlhRm9ybWF0X2NvcHkoZm10MSwgZm10MykpOworCisgICAvLyB3ZSBzaG91bGQgbG9zZSBhbiBlbnRyeSB3aGVuIHdlIGNvcHkgb3ZlciBpdAorICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZtdDIsICJ2YW5pc2hpbmciLCA1MCk7CisgICBFWFBFQ1RfRkFMU0UoQU1lZGlhRm9ybWF0X2dldEludDMyKGZtdDEsICJ2YW5pc2hpbmciLCAmaTMyKSk7CisgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm10MiwgInZhbmlzaGluZyIsICZpMzIpKTsKKyAgIEVYUEVDVF9FUShBTUVESUFfT0ssIEFNZWRpYUZvcm1hdF9jb3B5KGZtdDIsIGZtdDEpKTsKKyAgIEVYUEVDVF9GQUxTRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm10MiwgInZhbmlzaGluZyIsICZpMzIpKTsKKworICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmbXQxKTsKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10Mik7Cit9CisKK1RFU1QoTmRrTWVkaWFGb3JtYXRfdGVzdHMsIHRlc3RfYnVmZmVyKSB7CisgICBBTWVkaWFGb3JtYXQgKmZtdDEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisKKyAgIHR5cGVkZWYgc3RydWN0IGJsb2Nrb21lbSB7CisgICAgICAgIGludCBsZWFkaW5nOworICAgICAgICBpbnQgZmlsbGVkWzEwMF07CisgICAgICAgIGludCB0cmFpbGluZzsKKyAgIH0gYmxvY2tfdDsKKyAgIGJsb2NrX3QgYnVmID0ge307CisgICBidWYubGVhZGluZyA9IDE7CisgICBidWYudHJhaWxpbmcgPSAyOworICAgdm9pZCAqZGF0YTsKKyAgIHNpemVfdCBic2l6ZTsKKworICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmbXQxLCAibXlidWZmZXIiLCAmYnVmLCBzaXplb2YoYnVmKSk7CisgICBFWFBFQ1RfVFJVRShBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZtdDEsICJteWJ1ZmZlciIsICZkYXRhLCAmYnNpemUpKTsKKyAgIEVYUEVDVF9ORSgmYnVmLCBkYXRhKTsKKyAgIEVYUEVDVF9FUShzaXplb2YoYnVmKSwgYnNpemUpOworICAgYmxvY2tfdCAqYnVmcCA9IChibG9ja190KikgZGF0YTsKKyAgIEVYUEVDVF9FUShidWZwLT5sZWFkaW5nLCBidWYubGVhZGluZyk7CisgICBFWFBFQ1RfRVEoYnVmcC0+dHJhaWxpbmcsIGJ1Zi50cmFpbGluZyk7CisgICBFWFBFQ1RfRVEoMCwgbWVtY21wKCZidWYsIGRhdGEsIGJzaXplKSk7CisKKyAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm10MSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9SRUFETUUubWQgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTYgQEAKKyMgQi1GcmFtZXMgRW5jb2RpbmcgQXBwCisKK1RoaXMgaXMgYSBzYW1wbGUgYW5kcm9pZCBhcHBsaWNhdGlvbiBmb3IgZW5jb2RpbmcgQVZDL0hFVkMgc3RyZWFtcyB3aXRoIEItRnJhbWVzIGVuYWJsZWQuIEl0IHVzZXMgTWVkaWFSZWNvcmRlciBBUElzIHRvIHJlY29yZCBCLWZyYW1lcyBlbmFibGVkIHZpZGVvIGZyb20gY2FtZXJhMiBpbnB1dCBhbmQgTWVkaWFDb2RlYyBBUElzIHRvIGVuY29kZSByZWZlcmVuY2UgdGVzdCB2ZWN0b3IgdXNpbmcgaW5wdXQgc3VyZmFjZS4KKworVGhpcyBwYWdlIGRlc2NyaWJlcyBob3cgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCB0aGUgRW5jb2RlciBBcHAgYW5kIGhvdyB0byBydW4gdGhlIHRlc3RzIGZvciBpdC4KKworCisjIEdldHRpbmcgU3RhcnRlZAorCitUaGlzIGFwcCB1c2VzIHRoZSBHcmFkbGUgYnVpbGQgc3lzdGVtIGFzIHdlbGwgYXMgU29vbmcgQnVpbGQgU3lzdGVtLgorCitUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgR3JhZGxlIGJ1aWxkLCB1c2UgdGhlICJncmFkbGV3IGJ1aWxkIiBjb21tYW5kIG9yIHVzZSAiSW1wb3J0IFByb2plY3QiIGluIEFuZHJvaWQgU3R1ZGlvLgorCitUbyBidWlsZCB0aGUgYXBwIHVzaW5nIFNvb25nIEJ1aWxkIFN5c3RlbSwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKK2BgYAorbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyLworYGBgCisKK1RoZSBhcGsgaXMgZ2VuZXJhdGVkIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb246CitgYGAKK291dFx0YXJnZXRccHJvZHVjdFxzYXJnb1x0ZXN0Y2FzZXNcU2FtcGxlVmlkZW9FbmNvZGVyXGFybTY0XFNhbXBsZVZpZGVvRW5jb2Rlci5hcGsKK2BgYAorCitDb21tYW5kIHRvIGluc3RhbGwgdGhlIGFwazoKK2BgYAorYWRiIGluc3RhbGwgU2FtcGxlVmlkZW9FbmNvZGVyLmFwaworYGBgCisKK0NvbW1hbmQgdG8gbGF1bmNoIHRoZSBhcHA6CitgYGAKK2FkYiBzaGVsbCBhbSBzdGFydCAtbiAiY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyL2NvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkiCitgYGAKKworQWZ0ZXIgaW5zdGFsbGluZyB0aGUgYXBwLCBhIFRleHR1cmVWaWV3IHNob3dpbmcgY2FtZXJhIHByZXZpZXcgaXMgZGlzcGFseWVkIG9uIG9uZSB0aGlyZCBvZiB0aGUgc2NyZWVuLiBJdCBhbHNvIGZlYXR1cmVzIGNoZWNrYm94ZXMgdG8gc2VsZWN0IGVpdGhlciBhdmMvaGV2YyBhbmQgaHcvc3cgY29kZWNzLiBJdCBhbHNvIGhhcyBhbiBvcHRpb24gdG8gc2VsZWN0IGVpdGhlciBNZWRpYVJlY29yZGVyIEFQSXMgb3IgTWVkaWFDb2RlYywgYWxvbmcgd2l0aCB0aGUgJ1N0YXJ0JyBidXR0b24gdG8gc3RhcnQvc3RvcCByZWNvcmRpbmcuCisKKyMgUnVubmluZyBUZXN0cworCitUaGUgYXBwIGFsc28gY29udGFpbnMgYSB0ZXN0LCB3aGljaCB3aWxsIHRlc3QgdGhlIE1lZGlhQ29kZWMgQVBJcyBmb3IgZW5jb2RpbmcgYXZjL2hldmMgc3RyZWFtcyB3aXRoIEItZnJhbWVzIGVuYWJsZWQuIFRoaXMgZG9lcyBub3QgcmVxdWlyZSB1cyB0byB1c2UgYXBwbGljYXRpb24gVUkuCisKKyMjIFJ1bm5pbmcgdGhlIHRlc3RzIHVzaW5nIGF0ZXN0CitOb3RlIHRoYXQgYXRlc3QgY29tbWFuZCB3aWxsIGluc3RhbGwgdGhlIFNhbXBsZVZpZGVvRW5jb2RlciBhcHAgb24gdGhlIGRldmljZS4KKworQ29tbWFuZCB0byBydW4gdGhlIHRlc3RzOgorYGBgCithdGVzdCBTYW1wbGVWaWRlb0VuY29kZXIKK2BgYAorCisjIE91cHV0CisKK1RoZSBtdXhlZCBvdXB0cHV0IHZpZGVvIGlzIHNhdmVkIGluIHRoZSBhcHAgZGF0YSBhdDoKK2BgYAorL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyL2ZpbGVzLworYGBgCisKK1RoZSB0b3RhbCBudW1iZXIgb2YgSS1mcmFtZXMsIFAtZnJhbWVzIGFuZCBCLWZyYW1lcyBhZnRlciBlbmNvZGluZyBoYXMgYmVlbiBkb25lIHVzaW5nIE1lZGlhQ29kZWMgQVBJcyBhcmUgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4uCitUaGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGxvZ2NhdHMgb2YgdGhlIHRlc3QuCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiMjE5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJTYW1wbGVWaWRlb0VuY29kZXIiLAorCisgICAgbWFuaWZlc3Q6ICJzcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sIiwKKworICAgIHNyY3M6IFsic3JjLyoqLyouamF2YSJdLAorCisgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyNCIsIC8vIE4KKworICAgIHJlc291cmNlX2RpcnM6IFsKKyAgICAgICAgInNyYy9tYWluL3JlcyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkeC5hbm5vdGF0aW9uX2Fubm90YXRpb24iLAorICAgICAgICAiYW5kcm9pZHguYXBwY29tcGF0X2FwcGNvbXBhdCIsCisgICAgICAgICJhbmRyb2lkeC1jb25zdHJhaW50bGF5b3V0X2NvbnN0cmFpbnRsYXlvdXQiLAorICAgICAgICAianVuaXQiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5jb3JlIiwKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImhhbWNyZXN0LWxpYnJhcnkiLAorICAgIF0sCisKKyAgICBqYXZhY2ZsYWdzOiBbCisgICAgICAgICItWGxpbnQ6ZGVwcmVjYXRpb24iLAorICAgICAgICAiLVhsaW50OnVuY2hlY2tlZCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNDMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iUnVucyBTYW1wbGVWaWRlb0VuY29kZXIgVGVzdHMiPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJTYW1wbGVWaWRlb0VuY29kZXIuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRhZyIgdmFsdWU9IlNhbXBsZVZpZGVvRW5jb2RlciIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL2J1aWxkLmdyYWRsZSBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQuYXBwbGljYXRpb24nCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDMwCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjMwLjAuMiIKKworICAgIGRlZmF1bHRDb25maWcgeworICAgICAgICBhcHBsaWNhdGlvbklkICJjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIiCisgICAgICAgIG1pblNka1ZlcnNpb24gMjQKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAzMAorICAgICAgICB2ZXJzaW9uQ29kZSAxCisgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCisgICAgICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICB9CisKKyAgICBidWlsZFR5cGVzIHsKKyAgICAgICAgcmVsZWFzZSB7CisgICAgICAgICAgICBtaW5pZnlFbmFibGVkIGZhbHNlCisgICAgICAgICAgICBwcm9ndWFyZEZpbGVzIGdldERlZmF1bHRQcm9ndWFyZEZpbGUoJ3Byb2d1YXJkLWFuZHJvaWQtb3B0aW1pemUudHh0JyksICdwcm9ndWFyZC1ydWxlcy5wcm8nCisgICAgICAgIH0KKyAgICB9Cit9CisKK2RlcGVuZGVuY2llcyB7CisgICAgaW1wbGVtZW50YXRpb24gZmlsZVRyZWUoZGlyOiAibGlicyIsIGluY2x1ZGU6IFsiKi5qYXIiXSkKKyAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguYXBwY29tcGF0OmFwcGNvbXBhdDoxLjIuMCcKKyAgICBpbXBsZW1lbnRhdGlvbiAnYW5kcm9pZHguY29uc3RyYWludGxheW91dDpjb25zdHJhaW50bGF5b3V0OjIuMC40JworICAgIHRlc3RJbXBsZW1lbnRhdGlvbiAnanVuaXQ6anVuaXQ6NC4xMy4xJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMy4wJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4yJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXNwcmVzc286ZXNwcmVzc28tY29yZTozLjMuMCcKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmMzMyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2RlclRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5wbGF0Zm9ybS5hcHAuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5SOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2FtcGxlVmlkZW9FbmNvZGVyVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IFNhbXBsZVZpZGVvRW5jb2RlclRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKyAgICBwcml2YXRlIGludCBtTWF4QkZyYW1lczsKKyAgICBwcml2YXRlIGludCBtSW5wdXRSZXNJZDsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzU29mdHdhcmVFbmNvZGVyOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXRGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogTWltZVR5cGUsIGlzU29mdHdhcmVFbmNvZGVyLCBtYXhCRnJhbWVzCisgICAgICAgICAgICAgICAge01lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQywgZmFsc2UsIDF9LAorICAgICAgICAgICAgICAgIHtNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMsIHRydWUsIDF9LAorICAgICAgICAgICAgICAgIHtNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDLCBmYWxzZSwgMX0sCisgICAgICAgICAgICAgICAge01lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0hFVkMsIHRydWUsIDF9fSk7CisgICAgfQorCisgICAgcHVibGljIFNhbXBsZVZpZGVvRW5jb2RlclRlc3QoU3RyaW5nIG1pbWVUeXBlLCBib29sZWFuIGlzU29mdHdhcmVFbmNvZGVyLCBpbnQgbWF4QkZyYW1lcykgeworICAgICAgICB0aGlzLm1Db250ZXh0ID0gSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgICAgICB0aGlzLm1JbnB1dFJlc0lkID0gUi5yYXcuY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjU7CisgICAgICAgIHRoaXMubU1pbWUgPSBtaW1lVHlwZTsKKyAgICAgICAgdGhpcy5tSXNTb2Z0d2FyZUVuY29kZXIgPSBpc1NvZnR3YXJlRW5jb2RlcjsKKyAgICAgICAgdGhpcy5tTWF4QkZyYW1lcyA9IG1heEJGcmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3V0cHV0UGF0aCgpIHsKKyAgICAgICAgRmlsZSBkaXIgPSBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpOworICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBnZXQgZXh0ZXJuYWwgZGlyZWN0b3J5IHBhdGggdG8gc2F2ZSBvdXRwdXQgdmlkZW8iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB2aWRlb1BhdGggPSBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL1ZpZGVvLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIubXA0IjsKKyAgICAgICAgTG9nLmkoVEFHLCAiT3V0cHV0IHZpZGVvIGlzIHNhdmVkIGF0OiAiICsgdmlkZW9QYXRoKTsKKyAgICAgICAgcmV0dXJuIHZpZGVvUGF0aDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVN1cmZhY2VFbmNvZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvdXRwdXRGaWxlUGF0aCA9IGdldE91dHB1dFBhdGgoKTsKKyAgICAgICAgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIHN1cmZhY2VFbmNvZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKG1Db250ZXh0LCBtSW5wdXRSZXNJZCwgbU1pbWUsIG1Jc1NvZnR3YXJlRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVQYXRoLCBtTWF4QkZyYW1lcyk7CisgICAgICAgIGludCBlbmNvZGluZ1N0YXR1cyA9IHN1cmZhY2VFbmNvZGVyLnN0YXJ0RW5jb2RpbmdTdXJmYWNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZW5jb2RpbmdTdGF0dXMsIGlzKGVxdWFsVG8oMCkpKTsKKyAgICAgICAgaW50W10gZnJhbWVOdW1BcnJheSA9IHN1cmZhY2VFbmNvZGVyLmdldEZyYW1lVHlwZXMoKTsKKyAgICAgICAgTG9nLmkoVEFHLCAiUmVzdWx0czogSS1GcmFtZXM6ICIgKyBmcmFtZU51bUFycmF5WzBdICsgIjsgUC1GcmFtZXM6ICIgKyBmcmFtZU51bUFycmF5WzFdICsKKyAgICAgICAgICAgICAgICAiXG4gIiArICI7IEItRnJhbWVzOiIgKyBmcmFtZU51bUFycmF5WzJdKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJFbmNvZGVyIG1pbWU6ICIgKyBtTWltZSArICIgaXNTb2Z0d2FyZTogIiArIG1Jc1NvZnR3YXJlRW5jb2RlciArCisgICAgICAgICAgICAgICAgIiBmYWlsZWQgdG8gZ2VuZXJhdGUgQiBGcmFtZXMiLCBmcmFtZU51bUFycmF5WzJdLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NTQxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyIj4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIi8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iLz4KKworICAgIDxhcHBsaWNhdGlvbgorICAgICAgICBhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9uIgorICAgICAgICBhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJwb3J0cmFpdCIKKyAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDppY29uPSJAbWlwbWFwL2ljX2xhdW5jaGVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIgorICAgICAgICBhbmRyb2lkOnJvdW5kSWNvbj0iQG1pcG1hcC9pY19sYXVuY2hlcl9yb3VuZCIKKyAgICAgICAgYW5kcm9pZDpzdXBwb3J0c1J0bD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0aGVtZT0iQHN0eWxlL0FwcFRoZW1lIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKworICAgIDxpbnN0cnVtZW50YXRpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCisgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyIgorICAgICAgICBhbmRyb2lkOmxhYmVsPSJTYW1wbGVWaWRlb0VuY29kZXIgVGVzdCIvPgorCis8L21hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvQXV0b0ZpdFRleHR1cmVWaWV3LmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL0F1dG9GaXRUZXh0dXJlVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWE0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL0F1dG9GaXRUZXh0dXJlVmlldy5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKKworcHVibGljIGNsYXNzIEF1dG9GaXRUZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3IHsKKworICAgIHB1YmxpYyBBdXRvRml0VGV4dHVyZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEF1dG9GaXRUZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXV0b0ZpdFRleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBc3BlY3RSYXRpbyhpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTaXplIGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGF5b3V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NYWluQWN0aXZpdHkuamF2YSBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWFpbkFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMzUzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK2ltcG9ydCBhbmRyb2lkeC5hcHBjb21wYXQuYXBwLkFwcENvbXBhdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWR4LmNvcmUuYXBwLkFjdGl2aXR5Q29tcGF0OworCitpbXBvcnQgYW5kcm9pZC5NYW5pZmVzdDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuTWF0cml4OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdEY7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhQ2FwdHVyZVNlc3Npb247CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhbWVyYUNoYXJhY3RlcmlzdGljczsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FtZXJhRGV2aWNlOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5DYW1lcmFNZXRhZGF0YTsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIuQ2FwdHVyZVJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtcy5TdHJlYW1Db25maWd1cmF0aW9uTWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU3VyZmFjZVRleHR1cmU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcjsKKworaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOworaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkNoZWNrQm94OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5TaXplOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJhZGlvR3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Cb29sZWFuLkZBTFNFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQm9vbGVhbi5UUlVFOworCitwdWJsaWMgY2xhc3MgTWFpbkFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkKKyAgICAgICAgaW1wbGVtZW50cyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciwgQWN0aXZpdHlDb21wYXQuT25SZXF1ZXN0UGVybWlzc2lvbnNSZXN1bHRDYWxsYmFjayB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNhbXBsZVZpZGVvRW5jb2RlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUkVDT1JEX1BFUk1JU1NJT05TID0KKyAgICAgICAgICAgIHtNYW5pZmVzdC5wZXJtaXNzaW9uLkNBTUVSQSwgTWFuaWZlc3QucGVybWlzc2lvbi5SRUNPUkRfQVVESU99OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUX1JFQ09SRF9QRVJNSVNTSU9OUyA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBTZW1hcGhvcmUgbUNhbWVyYU9wZW5DbG9zZUxvY2sgPSBuZXcgU2VtYXBob3JlKDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19CSVRSQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0ZSQU1FUkFURSA9IDMwOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgdmFsdWVzIHRvIGZyYW1lIHR5cGVzIGFzc2lnbmVkIGhlcmUgYXJlIGludGVybmFsIHRvIHRoaXMgYXBwLgorICAgICAqIFRoZXNlIHZhbHVlcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgdmFsdWVzIGRlZmluZWQgaW4gYXZjL2hldmMgc3BlY2lmaWNhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVfVFlQRV9JID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGUkFNRV9UWVBFX1AgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1RZUEVfQiA9IDI7CisKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZSA9IE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQzsKKyAgICBwcml2YXRlIFN0cmluZyBtT3V0cHV0VmlkZW9QYXRoID0gbnVsbDsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNGcm9udENhbWVyYSA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0NvZGVjU29mdHdhcmUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbUlzTWVkaWFSZWNvcmRlciA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlY29yZGluZzsKKworICAgIHByaXZhdGUgQXV0b0ZpdFRleHR1cmVWaWV3IG1UZXh0dXJlVmlldzsKKyAgICBwcml2YXRlIFRleHRWaWV3IG1UZXh0VmlldzsKKyAgICBwcml2YXRlIENhbWVyYURldmljZSBtQ2FtZXJhRGV2aWNlOworICAgIHByaXZhdGUgQ2FtZXJhQ2FwdHVyZVNlc3Npb24gbVByZXZpZXdTZXNzaW9uOworICAgIHByaXZhdGUgQ2FwdHVyZVJlcXVlc3QuQnVpbGRlciBtUHJldmlld0J1aWxkZXI7CisgICAgcHJpdmF0ZSBNZWRpYVJlY29yZGVyIG1NZWRpYVJlY29yZGVyOworICAgIHByaXZhdGUgU2l6ZSBtVmlkZW9TaXplOworICAgIHByaXZhdGUgU2l6ZSBtUHJldmlld1NpemU7CisKKyAgICBwcml2YXRlIEhhbmRsZXIgbUJhY2tncm91bmRIYW5kbGVyOworICAgIHByaXZhdGUgSGFuZGxlclRocmVhZCBtQmFja2dyb3VuZFRocmVhZDsKKworICAgIHByaXZhdGUgQnV0dG9uIG1TdGFydEJ1dHRvbjsKKworICAgIHByaXZhdGUgaW50W10gbUZyYW1lVHlwZU9jY3VycmVuY2VzOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hY3Rpdml0eV9tYWluKTsKKworICAgICAgICBmaW5hbCBSYWRpb0dyb3VwIHJhZGlvR3JvdXBfbWltZSA9IGZpbmRWaWV3QnlJZChSLmlkLnJhZGlvX2dyb3VwX21pbWUpOworICAgICAgICByYWRpb0dyb3VwX21pbWUuc2V0T25DaGVja2VkQ2hhbmdlTGlzdGVuZXIobmV3IFJhZGlvR3JvdXAuT25DaGVja2VkQ2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hlY2tlZENoYW5nZWQoUmFkaW9Hcm91cCBncm91cCwgaW50IGNoZWNrZWRJZCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja2VkSWQgPT0gUi5pZC5hdmMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUgPSBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUgPSBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgUmFkaW9Hcm91cCByYWRpb0dyb3VwX2NvZGVjID0gZmluZFZpZXdCeUlkKFIuaWQucmFkaW9fZ3JvdXBfY29kZWMpOworICAgICAgICByYWRpb0dyb3VwX2NvZGVjLnNldE9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKG5ldyBSYWRpb0dyb3VwLk9uQ2hlY2tlZENoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoZWNrZWRDaGFuZ2VkKFJhZGlvR3JvdXAgZ3JvdXAsIGludCBjaGVja2VkSWQpIHsKKyAgICAgICAgICAgICAgICBtSXNDb2RlY1NvZnR3YXJlID0gY2hlY2tlZElkID09IFIuaWQuc3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIENoZWNrQm94IGNoZWNrQm94X21yID0gZmluZFZpZXdCeUlkKFIuaWQuY2hlY2tCb3hfbWVkaWFfcmVjb3JkZXIpOworICAgICAgICBmaW5hbCBDaGVja0JveCBjaGVja0JveF9tYyA9IGZpbmRWaWV3QnlJZChSLmlkLmNoZWNrQm94X21lZGlhX2NvZGVjKTsKKyAgICAgICAgbVRleHR1cmVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQudGV4dHVyZSk7CisgICAgICAgIG1UZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHRWaWV3UmVzdWx0cyk7CisKKyAgICAgICAgY2hlY2tCb3hfbXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSAoKENoZWNrQm94KSB2KS5pc0NoZWNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0JveF9tYy5zZXRDaGVja2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWVkaWFSZWNvcmRlciA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9Hcm91cF9jb2RlYy5nZXRDaGlsZENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9Hcm91cF9jb2RlYy5nZXRDaGlsZEF0KGkpLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgY2hlY2tCb3hfbWMuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrZWQgPSAoKENoZWNrQm94KSB2KS5pc0NoZWNrZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkgeworICAgICAgICAgICAgICAgICAgICBjaGVja0JveF9tci5zZXRDaGVja2VkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUlzTWVkaWFSZWNvcmRlciA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvR3JvdXBfY29kZWMuZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhZGlvR3JvdXBfY29kZWMuZ2V0Q2hpbGRBdChpKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRfYnV0dG9uKTsKKyAgICAgICAgbVN0YXJ0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICBpZiAodi5nZXRJZCgpID09IFIuaWQuc3RhcnRfYnV0dG9uKSB7CisgICAgICAgICAgICBtVGV4dFZpZXcuc2V0VGV4dChudWxsKTsKKyAgICAgICAgICAgIGlmIChtSXNNZWRpYVJlY29yZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc1JlY29yZGluZykgeworICAgICAgICAgICAgICAgICAgICBzdG9wUmVjb3JkaW5nVmlkZW8oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVjb3JkaW5nVmlkZW8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0VmlkZW9QYXRoID0gZ2V0VmlkZW9QYXRoKE1haW5BY3Rpdml0eS50aGlzKTsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjU3VyZmFjZUFzeW5jIGNvZGVjQXN5bmNUYXNrID0gbmV3IE1lZGlhQ29kZWNTdXJmYWNlQXN5bmModGhpcyk7CisgICAgICAgICAgICAgICAgY29kZWNBc3luY1Rhc2suZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbmNvZGluZyByZWZlcmVuY2UgdGVzdCB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjIEFQSXMgdXNpbmcgc3VyZmFjZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVkaWFDb2RlY1N1cmZhY2VBc3luYyBleHRlbmRzIEFzeW5jVGFzazxTdHJpbmcsIFN0cmluZywgSW50ZWdlcj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNYWluQWN0aXZpdHk+IGFjdGl2aXR5UmVmZXJlbmNlOworCisgICAgICAgIE1lZGlhQ29kZWNTdXJmYWNlQXN5bmMoTWFpbkFjdGl2aXR5IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGFjdGl2aXR5UmVmZXJlbmNlID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgSW50ZWdlciBkb0luQmFja2dyb3VuZChTdHJpbmcuLi4gc3RyaW5ncykgeworICAgICAgICAgICAgTWFpbkFjdGl2aXR5IG1haW5BY3Rpdml0eSA9IGFjdGl2aXR5UmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgaW50IHJlc0lkID0gUi5yYXcuY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjU7CisgICAgICAgICAgICBpbnQgZW5jb2RpbmdTdGF0dXMgPSAxOworICAgICAgICAgICAgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIGNvZGVjU3VyZmFjZUVuY29kZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKG1haW5BY3Rpdml0eS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1NaW1lLCBtYWluQWN0aXZpdHkubUlzQ29kZWNTb2Z0d2FyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubU91dHB1dFZpZGVvUGF0aCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVuY29kaW5nU3RhdHVzID0gY29kZWNTdXJmYWNlRW5jb2Rlci5zdGFydEVuY29kaW5nU3VyZmFjZSgpOworICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tRnJhbWVUeXBlT2NjdXJyZW5jZXMgPSBjb2RlY1N1cmZhY2VFbmNvZGVyLmdldEZyYW1lVHlwZXMoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmdTdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShJbnRlZ2VyIGVuY29kaW5nU3RhdHVzKSB7CisgICAgICAgICAgICBNYWluQWN0aXZpdHkgbWFpbkFjdGl2aXR5ID0gYWN0aXZpdHlSZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICBtYWluQWN0aXZpdHkubVN0YXJ0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmdTdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KG1haW5BY3Rpdml0eS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgIkVuY29kaW5nIENvbXBsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubVRleHRWaWV3LmFwcGVuZCgiXG4gRW5jb2RlZCBzdHJlYW0gY29udGFpbnM6ICIpOworICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tVGV4dFZpZXcuYXBwZW5kKCJcbiBOdW1iZXIgb2YgSS1GcmFtZXM6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1GcmFtZVR5cGVPY2N1cnJlbmNlc1tGUkFNRV9UWVBFX0ldKTsKKyAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubVRleHRWaWV3LmFwcGVuZCgiXG4gTnVtYmVyIG9mIFAtRnJhbWVzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1haW5BY3Rpdml0eS5tRnJhbWVUeXBlT2NjdXJyZW5jZXNbRlJBTUVfVFlQRV9QXSk7CisgICAgICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1UZXh0Vmlldy5hcHBlbmQoIlxuIE51bWJlciBvZiBCLUZyYW1lczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBtYWluQWN0aXZpdHkubUZyYW1lVHlwZU9jY3VycmVuY2VzW0ZSQU1FX1RZUEVfQl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChtYWluQWN0aXZpdHkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgIiArICJlbmNvZGluZyIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFpbkFjdGl2aXR5Lm1PdXRwdXRWaWRlb1BhdGggPSBudWxsOworICAgICAgICAgICAgc3VwZXIub25Qb3N0RXhlY3V0ZShlbmNvZGluZ1N0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgbVN1cmZhY2VUZXh0dXJlTGlzdGVuZXIgPQorICAgICAgICAgICAgbmV3IFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BlbkNhbWVyYSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlU2l6ZUNoYW5nZWQoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiS2VlcGluZyBjYW1lcmEgcHJldmlldyBzaXplIGZpeGVkIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisKKyAgICBwcml2YXRlIGZpbmFsIENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrIG1TdGF0ZUNhbGxiYWNrID0gbmV3IENhbWVyYURldmljZS5TdGF0ZUNhbGxiYWNrKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk9wZW5lZChDYW1lcmFEZXZpY2UgY2FtZXJhRGV2aWNlKSB7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gY2FtZXJhRGV2aWNlOworICAgICAgICAgICAgc3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICBtQ2FtZXJhT3BlbkNsb3NlTG9jay5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoQ2FtZXJhRGV2aWNlIGNhbWVyYURldmljZSkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKENhbWVyYURldmljZSBjYW1lcmFEZXZpY2UsIGludCBlcnJvcikgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICAgICAgY2FtZXJhRGV2aWNlLmNsb3NlKCk7CisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gTWFpbkFjdGl2aXR5LnRoaXM7CisgICAgICAgICAgICBhY3Rpdml0eS5maW5pc2goKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2hvd1JlcXVlc3RQZXJtaXNzaW9uUmF0aW9uYWxlKFN0cmluZ1tdIHJlY29yZFBlcm1pc3Npb25zKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHBlcm1pc3Npb24gOiByZWNvcmRQZXJtaXNzaW9ucykgeworICAgICAgICAgICAgaWYgKEFjdGl2aXR5Q29tcGF0LnNob3VsZFNob3dSZXF1ZXN0UGVybWlzc2lvblJhdGlvbmFsZSh0aGlzLCBwZXJtaXNzaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFJlY29yZFBlcm1pc3Npb25zKCkgeworICAgICAgICBpZiAoIXNob3VsZFNob3dSZXF1ZXN0UGVybWlzc2lvblJhdGlvbmFsZShSRUNPUkRfUEVSTUlTU0lPTlMpKSB7CisgICAgICAgICAgICBBY3Rpdml0eUNvbXBhdC5yZXF1ZXN0UGVybWlzc2lvbnModGhpcywgUkVDT1JEX1BFUk1JU1NJT05TLCBSRVFVRVNUX1JFQ09SRF9QRVJNSVNTSU9OUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RQZXJtaXNzaW9uc1Jlc3VsdChpbnQgcmVxdWVzdENvZGUsIFN0cmluZ1tdIHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGdyYW50UmVzdWx0cykgeworICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gUkVRVUVTVF9SRUNPUkRfUEVSTUlTU0lPTlMpIHsKKyAgICAgICAgICAgIGlmIChncmFudFJlc3VsdHMubGVuZ3RoID09IFJFQ09SRF9QRVJNSVNTSU9OUy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCByZXN1bHQgOiBncmFudFJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBlcm1pc3Npb24gaXMgbm90IGdyYW50ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIub25SZXF1ZXN0UGVybWlzc2lvbnNSZXN1bHQocmVxdWVzdENvZGUsIHBlcm1pc3Npb25zLCBncmFudFJlc3VsdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIk1pc3NpbmdQZXJtaXNzaW9uIikKKyAgICBwcml2YXRlIHZvaWQgb3BlbkNhbWVyYShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uR3JhbnRlZChSRUNPUkRfUEVSTUlTU0lPTlMpKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW1lcmEgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlY29yZCB2aWRlbyIpOworICAgICAgICAgICAgcmVxdWVzdFJlY29yZFBlcm1pc3Npb25zKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkgPSBNYWluQWN0aXZpdHkudGhpczsKKyAgICAgICAgaWYgKGFjdGl2aXR5ID09IG51bGwgfHwgYWN0aXZpdHkuaXNGaW5pc2hpbmcoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQWN0aXZpdHkgbm90IGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhTWFuYWdlciBtYW5hZ2VyID0gKENhbWVyYU1hbmFnZXIpIGFjdGl2aXR5LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMb2cudihUQUcsICJBY3F1aXJlIENhbWVyYSIpOworICAgICAgICAgICAgaWYgKCFtQ2FtZXJhT3BlbkNsb3NlTG9jay50cnlBY3F1aXJlKDI1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGltZWQgb3V0IHdhaXRpbmcgdG8gbG9jayBjYW1lcmEgb3BlbmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ2FtZXJhIEFjcXVpcmVkIik7CisKKyAgICAgICAgICAgIFN0cmluZyBjYW1lcmFJZCA9IG1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KClbMF07CisgICAgICAgICAgICBpZiAobUlzRnJvbnRDYW1lcmEpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFJZCA9IG1hbmFnZXIuZ2V0Q2FtZXJhSWRMaXN0KClbMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENhbWVyYUNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJpc3RpY3MgPSBtYW5hZ2VyLmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCk7CisgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uTWFwIG1hcCA9CisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljcy5nZXQoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLlNDQUxFUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NQVApOworICAgICAgICAgICAgbVZpZGVvU2l6ZSA9IGNob29zZVZpZGVvU2l6ZShtYXAuZ2V0T3V0cHV0U2l6ZXMoTWVkaWFSZWNvcmRlci5jbGFzcykpOworICAgICAgICAgICAgbVByZXZpZXdTaXplID0KKyAgICAgICAgICAgICAgICAgICAgY2hvb3NlT3B0aW1hbFNpemUobWFwLmdldE91dHB1dFNpemVzKFN1cmZhY2VUZXh0dXJlLmNsYXNzKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9TaXplKTsKKyAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRBc3BlY3RSYXRpbyhtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCksIG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgIG1hbmFnZXIub3BlbkNhbWVyYShjYW1lcmFJZCwgbVN0YXRlQ2FsbGJhY2ssIG51bGwpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQ2FtZXJhKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2suYWNxdWlyZSgpOworICAgICAgICAgICAgY2xvc2VQcmV2aWV3U2Vzc2lvbigpOworICAgICAgICAgICAgaWYgKG51bGwgIT0gbUNhbWVyYURldmljZSkgeworICAgICAgICAgICAgICAgIG1DYW1lcmFEZXZpY2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxsICE9IG1NZWRpYVJlY29yZGVyKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVycnVwdGVkIHdoaWxlIHRyeWluZyB0byBsb2NrIGNhbWVyYSBjbG9zaW5nLiIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbUNhbWVyYU9wZW5DbG9zZUxvY2sucmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZSBjaG9vc2VWaWRlb1NpemUoU2l6ZVtdIGNob2ljZXMpIHsKKyAgICAgICAgZm9yIChTaXplIHNpemUgOiBjaG9pY2VzKSB7CisgICAgICAgICAgICBpZiAoc2l6ZS5nZXRXaWR0aCgpID09IHNpemUuZ2V0SGVpZ2h0KCkgKiAxNiAvIDkgJiYgc2l6ZS5nZXRXaWR0aCgpIDw9IDE5MjApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMb2cuZShUQUcsICJDb3VsZG4ndCBmaW5kIGFueSBzdWl0YWJsZSB2aWRlbyBzaXplIik7CisgICAgICAgIHJldHVybiBjaG9pY2VzW2Nob2ljZXMubGVuZ3RoIC0gMV07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2l6ZSBjaG9vc2VPcHRpbWFsU2l6ZShTaXplW10gY2hvaWNlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTaXplIGFzcGVjdFJhdGlvKSB7CisgICAgICAgIExpc3Q8U2l6ZT4gYmlnRW5vdWdoID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGludCB3ID0gYXNwZWN0UmF0aW8uZ2V0V2lkdGgoKTsKKyAgICAgICAgaW50IGggPSBhc3BlY3RSYXRpby5nZXRIZWlnaHQoKTsKKyAgICAgICAgZm9yIChTaXplIG9wdGlvbiA6IGNob2ljZXMpIHsKKyAgICAgICAgICAgIGlmIChvcHRpb24uZ2V0SGVpZ2h0KCkgPT0gb3B0aW9uLmdldFdpZHRoKCkgKiBoIC8gdyAmJiBvcHRpb24uZ2V0V2lkdGgoKSA+PSB3aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBvcHRpb24uZ2V0SGVpZ2h0KCkgPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgYmlnRW5vdWdoLmFkZChvcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGljayB0aGUgc21hbGxlc3Qgb2YgdGhvc2UsIGFzc3VtaW5nIHdlIGZvdW5kIGFueQorICAgICAgICBpZiAoYmlnRW5vdWdoLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5taW4oYmlnRW5vdWdoLCBuZXcgQ29tcGFyZVNpemVzQnlBcmVhKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGRuJ3QgZmluZCBhbnkgc3VpdGFibGUgcHJldmlldyBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gY2hvaWNlc1swXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQZXJtaXNzaW9uR3JhbnRlZChTdHJpbmdbXSByZWNvcmRQZXJtaXNzaW9ucykgeworICAgICAgICBmb3IgKFN0cmluZyBwZXJtaXNzaW9uIDogcmVjb3JkUGVybWlzc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChBY3Rpdml0eUNvbXBhdC5jaGVja1NlbGZQZXJtaXNzaW9uKE1haW5BY3Rpdml0eS50aGlzLCBwZXJtaXNzaW9uKSAhPQorICAgICAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7CisgICAgICAgIHN0YXJ0QmFja2dyb3VuZFRocmVhZCgpOworICAgICAgICBpZiAobVRleHR1cmVWaWV3LmlzQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIG9wZW5DYW1lcmEobVRleHR1cmVWaWV3LmdldFdpZHRoKCksIG1UZXh0dXJlVmlldy5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcihtU3VyZmFjZVRleHR1cmVMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBjbG9zZUNhbWVyYSgpOworICAgICAgICBzdG9wQmFja2dyb3VuZFRocmVhZCgpOworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0QmFja2dyb3VuZFRocmVhZCgpIHsKKyAgICAgICAgbUJhY2tncm91bmRUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2FtZXJhQmFja2dyb3VuZCIpOworICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5zdGFydCgpOworICAgICAgICBtQmFja2dyb3VuZEhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQmFja2dyb3VuZFRocmVhZC5nZXRMb29wZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0b3BCYWNrZ3JvdW5kVGhyZWFkKCkgeworICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5xdWl0U2FmZWx5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQmFja2dyb3VuZFRocmVhZC5qb2luKCk7CisgICAgICAgICAgICBtQmFja2dyb3VuZFRocmVhZCA9IG51bGw7CisgICAgICAgICAgICBtQmFja2dyb3VuZEhhbmRsZXIgPSBudWxsOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0UmVjb3JkaW5nVmlkZW8oKSB7CisgICAgICAgIGlmIChudWxsID09IG1DYW1lcmFEZXZpY2UgfHwgIW1UZXh0dXJlVmlldy5pc0F2YWlsYWJsZSgpIHx8IG51bGwgPT0gbVByZXZpZXdTaXplKSB7CisgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChNYWluQWN0aXZpdHkudGhpcywgIkNhbm5vdCBzdGFydCByZWNvcmRpbmcuIiwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3Qgc3RhcnQgcmVjb3JkaW5nLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zZVByZXZpZXdTZXNzaW9uKCk7CisgICAgICAgICAgICBzZXRVcE1lZGlhUmVjb3JkZXIoKTsKKyAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHRleHR1cmUgPSBtVGV4dHVyZVZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKTsKKyAgICAgICAgICAgIGFzc2VydCB0ZXh0dXJlICE9IG51bGw7CisgICAgICAgICAgICB0ZXh0dXJlLnNldERlZmF1bHRCdWZmZXJTaXplKG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLCBtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgbVByZXZpZXdCdWlsZGVyID0gbUNhbWVyYURldmljZS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUkVDT1JEKTsKKyAgICAgICAgICAgIExpc3Q8U3VyZmFjZT4gc3VyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgLy8gU2V0IHVwIFN1cmZhY2UgZm9yIHRoZSBjYW1lcmEgcHJldmlldworICAgICAgICAgICAgU3VyZmFjZSBwcmV2aWV3U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHRleHR1cmUpOworICAgICAgICAgICAgc3VyZmFjZXMuYWRkKHByZXZpZXdTdXJmYWNlKTsKKyAgICAgICAgICAgIG1QcmV2aWV3QnVpbGRlci5hZGRUYXJnZXQocHJldmlld1N1cmZhY2UpOworCisgICAgICAgICAgICAvLyBTZXQgdXAgU3VyZmFjZSBmb3IgdGhlIE1lZGlhUmVjb3JkZXIKKyAgICAgICAgICAgIFN1cmZhY2UgcmVjb3JkZXJTdXJmYWNlID0gbU1lZGlhUmVjb3JkZXIuZ2V0U3VyZmFjZSgpOworICAgICAgICAgICAgc3VyZmFjZXMuYWRkKHJlY29yZGVyU3VyZmFjZSk7CisgICAgICAgICAgICBtUHJldmlld0J1aWxkZXIuYWRkVGFyZ2V0KHJlY29yZGVyU3VyZmFjZSk7CisKKyAgICAgICAgICAgIC8vU3RhcnQgYSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgICAgIG1DYW1lcmFEZXZpY2UuY3JlYXRlQ2FwdHVyZVNlc3Npb24oc3VyZmFjZXMsIG5ldyBDYW1lcmFDYXB0dXJlU2Vzc2lvbi5TdGF0ZUNhbGxiYWNrKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVkKENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uID0gc2Vzc2lvbjsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICBNYWluQWN0aXZpdHkudGhpcy5ydW5PblVpVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29yZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dChSLnN0cmluZy5zdG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db25maWd1cmVGYWlsZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY29uZmlndXJlLiBDYW5ub3Qgc3RhcnQgUmVjb3JkaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgbUJhY2tncm91bmRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ2FtZXJhQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0VXBNZWRpYVJlY29yZGVyKCkgeworICAgICAgICBmaW5hbCBBY3Rpdml0eSBhY3Rpdml0eSA9IE1haW5BY3Rpdml0eS50aGlzOworICAgICAgICBpZiAoYWN0aXZpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoTWFpbkFjdGl2aXR5LnRoaXMsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBNZWRpYVJlY29yZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBNZWRpYVJlY29yZGVyIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldEF1ZGlvU291cmNlKE1lZGlhUmVjb3JkZXIuQXVkaW9Tb3VyY2UuTUlDKTsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU291cmNlKE1lZGlhUmVjb3JkZXIuVmlkZW9Tb3VyY2UuU1VSRkFDRSk7CisgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRPdXRwdXRGb3JtYXQoTWVkaWFSZWNvcmRlci5PdXRwdXRGb3JtYXQuTVBFR180KTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXRWaWRlb1BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbU91dHB1dFZpZGVvUGF0aCA9IGdldFZpZGVvUGF0aChNYWluQWN0aXZpdHkudGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0T3V0cHV0RmlsZShtT3V0cHV0VmlkZW9QYXRoKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGluZ0JpdFJhdGUoVklERU9fQklUUkFURSk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvRnJhbWVSYXRlKFZJREVPX0ZSQU1FUkFURSk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvU2l6ZShtVmlkZW9TaXplLmdldFdpZHRoKCksIG1WaWRlb1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRPcmllbnRhdGlvbkhpbnQoMjcwKTsKKyAgICAgICAgaWYgKG1NaW1lLmVxdWFscyhNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGVyKE1lZGlhUmVjb3JkZXIuVmlkZW9FbmNvZGVyLkhFVkMpOworICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLk8pIHsKKyAgICAgICAgICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRWaWRlb0VuY29kaW5nUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ1Byb2ZpbGVNYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ01haW5UaWVyTGV2ZWw0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnNldFZpZGVvRW5jb2RlcihNZWRpYVJlY29yZGVyLlZpZGVvRW5jb2Rlci5IMjY0KTsKKyAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gQnVpbGQuVkVSU0lPTl9DT0RFUy5PKSB7CisgICAgICAgICAgICAgICAgbU1lZGlhUmVjb3JkZXIuc2V0VmlkZW9FbmNvZGluZ1Byb2ZpbGVMZXZlbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLkFWQ1Byb2ZpbGVNYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuQVZDTGV2ZWw0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTWVkaWFSZWNvcmRlci5zZXRBdWRpb0VuY29kZXIoTWVkaWFSZWNvcmRlci5BdWRpb0VuY29kZXIuQUFDKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1NZWRpYVJlY29yZGVyLnByZXBhcmUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFZpZGVvUGF0aChBY3Rpdml0eSBhY3Rpdml0eSkgeworICAgICAgICBGaWxlIGRpciA9IGFjdGl2aXR5LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpLmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCk7CisgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGdldCBleHRlcm5hbCBkaXJlY3RvcnkgcGF0aCB0byBzYXZlIG91dHB1dCB2aWRlbyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZpZGVvUGF0aCA9IGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvVmlkZW8tIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5tcDQiOworICAgICAgICBMb2cuZChUQUcsICJPdXRwdXQgdmlkZW8gaXMgc2F2ZWQgYXQ6ICIgKyB2aWRlb1BhdGgpOworICAgICAgICByZXR1cm4gdmlkZW9QYXRoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbG9zZVByZXZpZXdTZXNzaW9uKCkgeworICAgICAgICBpZiAobVByZXZpZXdTZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1QcmV2aWV3U2Vzc2lvbi5jbG9zZSgpOworICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9wUmVjb3JkaW5nVmlkZW8oKSB7CisgICAgICAgIG1Jc1JlY29yZGluZyA9IGZhbHNlOworICAgICAgICBtU3RhcnRCdXR0b24uc2V0VGV4dChSLnN0cmluZy5zdGFydCk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyLnN0b3AoKTsKKyAgICAgICAgbU1lZGlhUmVjb3JkZXIucmVzZXQoKTsKKyAgICAgICAgVG9hc3QubWFrZVRleHQoTWFpbkFjdGl2aXR5LnRoaXMsICJSZWNvcmRpbmcgRmluaXNoZWQiLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgbU91dHB1dFZpZGVvUGF0aCA9IG51bGw7CisgICAgICAgIHN0YXJ0UHJldmlldygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydFByZXZpZXcoKSB7CisgICAgICAgIGlmIChudWxsID09IG1DYW1lcmFEZXZpY2UgfHwgIW1UZXh0dXJlVmlldy5pc0F2YWlsYWJsZSgpIHx8IG51bGwgPT0gbVByZXZpZXdTaXplKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3NlUHJldmlld1Nlc3Npb24oKTsKKyAgICAgICAgICAgIFN1cmZhY2VUZXh0dXJlIHRleHR1cmUgPSBtVGV4dHVyZVZpZXcuZ2V0U3VyZmFjZVRleHR1cmUoKTsKKyAgICAgICAgICAgIGFzc2VydCB0ZXh0dXJlICE9IG51bGw7CisgICAgICAgICAgICB0ZXh0dXJlLnNldERlZmF1bHRCdWZmZXJTaXplKG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpLCBtUHJldmlld1NpemUuZ2V0SGVpZ2h0KCkpOworICAgICAgICAgICAgbVByZXZpZXdCdWlsZGVyID0gbUNhbWVyYURldmljZS5jcmVhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFEZXZpY2UuVEVNUExBVEVfUFJFVklFVyk7CisKKyAgICAgICAgICAgIFN1cmZhY2UgcHJldmlld1N1cmZhY2UgPSBuZXcgU3VyZmFjZSh0ZXh0dXJlKTsKKyAgICAgICAgICAgIG1QcmV2aWV3QnVpbGRlci5hZGRUYXJnZXQocHJldmlld1N1cmZhY2UpOworCisgICAgICAgICAgICBtQ2FtZXJhRGV2aWNlLmNyZWF0ZUNhcHR1cmVTZXNzaW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJldmlld1N1cmZhY2UpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2FtZXJhQ2FwdHVyZVNlc3Npb24uU3RhdGVDYWxsYmFjaygpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbmZpZ3VyZWQoQ2FtZXJhQ2FwdHVyZVNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3U2Vzc2lvbiA9IHNlc3Npb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJlRmFpbGVkKENhbWVyYUNhcHR1cmVTZXNzaW9uIHNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChNYWluQWN0aXZpdHkudGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25maWd1cmUgRmFpbGVkOyBDYW5ub3Qgc3RhcnQgIiArICJwcmV2aWV3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvbmZpZ3VyZSBmYWlsZWQ7IENhbm5vdCBzdGFydCBwcmV2aWV3Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0sIG1CYWNrZ3JvdW5kSGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZXZpZXcoKSB7CisgICAgICAgIGlmIChtQ2FtZXJhRGV2aWNlID09IG51bGwpIHsKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KE1haW5BY3Rpdml0eS50aGlzLCAiQ2FtZXJhIG5vdCBmb3VuZDsgQ2Fubm90IHVwZGF0ZSAiICsgInByZXZpZXciLAorICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbWVyYSBub3QgZm91bmQ7IENhbm5vdCB1cGRhdGUgcHJldmlldyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtUHJldmlld0J1aWxkZXIuc2V0KENhcHR1cmVSZXF1ZXN0LkNPTlRST0xfTU9ERSwgQ2FtZXJhTWV0YWRhdGEuQ09OVFJPTF9NT0RFX0FVVE8pOworICAgICAgICAgICAgSGFuZGxlclRocmVhZCB0aHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiQ2FtZXJhIHByZXZpZXciKTsKKyAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICAgICAgbVByZXZpZXdTZXNzaW9uLnNldFJlcGVhdGluZ1JlcXVlc3QobVByZXZpZXdCdWlsZGVyLmJ1aWxkKCksIG51bGwsIG1CYWNrZ3JvdW5kSGFuZGxlcik7CisgICAgICAgIH0gY2F0Y2ggKENhbWVyYUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRyYW5zZm9ybShpbnQgdmlld1dpZHRoLCBpbnQgdmlld0hlaWdodCkgeworICAgICAgICBBY3Rpdml0eSBhY3Rpdml0eSA9IE1haW5BY3Rpdml0eS50aGlzOworICAgICAgICBpZiAobnVsbCA9PSBtVGV4dHVyZVZpZXcgfHwgbnVsbCA9PSBtUHJldmlld1NpemUgfHwgbnVsbCA9PSBhY3Rpdml0eSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIE1hdHJpeCBtYXRyaXggPSBuZXcgTWF0cml4KCk7CisgICAgICAgIFJlY3RGIHZpZXdSZWN0ID0gbmV3IFJlY3RGKDAsIDAsIHZpZXdXaWR0aCwgdmlld0hlaWdodCk7CisgICAgICAgIFJlY3RGIGJ1ZmZlclJlY3QgPSBuZXcgUmVjdEYoMCwgMCwgbVByZXZpZXdTaXplLmdldEhlaWdodCgpLCBtUHJldmlld1NpemUuZ2V0V2lkdGgoKSk7CisgICAgICAgIGZsb2F0IGNlbnRlclggPSB2aWV3UmVjdC5jZW50ZXJYKCk7CisgICAgICAgIGZsb2F0IGNlbnRlclkgPSB2aWV3UmVjdC5jZW50ZXJZKCk7CisgICAgICAgIGJ1ZmZlclJlY3Qub2Zmc2V0KGNlbnRlclggLSBidWZmZXJSZWN0LmNlbnRlclgoKSwgY2VudGVyWSAtIGJ1ZmZlclJlY3QuY2VudGVyWSgpKTsKKyAgICAgICAgbWF0cml4LnNldFJlY3RUb1JlY3Qodmlld1JlY3QsIGJ1ZmZlclJlY3QsIE1hdHJpeC5TY2FsZVRvRml0LkZJTEwpOworICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWF4KChmbG9hdCkgdmlld0hlaWdodCAvIG1QcmV2aWV3U2l6ZS5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAoZmxvYXQpIHZpZXdXaWR0aCAvIG1QcmV2aWV3U2l6ZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgbWF0cml4LnBvc3RTY2FsZShzY2FsZSwgc2NhbGUsIGNlbnRlclgsIGNlbnRlclkpOworICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VHJhbnNmb3JtKG1hdHJpeCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIENvbXBhcmVTaXplc0J5QXJlYSBpbXBsZW1lbnRzIENvbXBhcmF0b3I8U2l6ZT4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNpemUgbGhzLCBTaXplIHJocykgeworICAgICAgICAgICAgcmV0dXJuIExvbmcuc2lnbnVtKChsb25nKSBsaHMuZ2V0V2lkdGgoKSAqIGxocy5nZXRIZWlnaHQoKSAtCisgICAgICAgICAgICAgICAgICAgIChsb25nKSByaHMuZ2V0V2lkdGgoKSAqIHJocy5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNCYXNlLmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjZTczYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTWVkaWFDb2RlY0Jhc2UuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2RlcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkNvbmRpdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKK2NsYXNzIENvZGVjQXN5bmNIYW5kbGVyIGV4dGVuZHMgTWVkaWFDb2RlYy5DYWxsYmFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IENvZGVjQXN5bmNIYW5kbGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIExvY2sgbUxvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOworICAgIHByaXZhdGUgZmluYWwgQ29uZGl0aW9uIG1Db25kaXRpb24gPSBtTG9jay5uZXdDb25kaXRpb24oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+PiBtQ2JJbnB1dFF1ZXVlOworICAgIHByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4+IG1DYk91dHB1dFF1ZXVlOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBDb2RlY0FzeW5jSGFuZGxlcigpIHsKKyAgICAgICAgbUNiSW5wdXRRdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgbUNiT3V0cHV0UXVldWUgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgY2xlYXJRdWV1ZXMoKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbUNiSW5wdXRRdWV1ZS5jbGVhcigpOworICAgICAgICBtQ2JPdXRwdXRRdWV1ZS5jbGVhcigpOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0Q29udGV4dCgpIHsKKyAgICAgICAgY2xlYXJRdWV1ZXMoKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZShNZWRpYUNvZGVjIGNvZGVjLCBpbnQgYnVmZmVySW5kZXgpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICBtQ2JJbnB1dFF1ZXVlLmFkZChuZXcgUGFpcjw+KGJ1ZmZlckluZGV4LCAoTWVkaWFDb2RlYy5CdWZmZXJJbmZvKSBudWxsKSk7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKE1lZGlhQ29kZWMgY29kZWMsIGludCBidWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gaW5mbykgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIG1DYk91dHB1dFF1ZXVlLmFkZChuZXcgUGFpcjw+KGJ1ZmZlckluZGV4LCBpbmZvKSk7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgbUNvbmRpdGlvbi5zaWduYWxBbGwoKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIExvZy5lKFRBRywgIlJlY2VpdmVkIG1lZGlhIGNvZGVjIGVycm9yIDogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFGb3JtYXQgZm9ybWF0KSB7CisgICAgICAgIExvZy5pKFRBRywgIk91dHB1dCBmb3JtYXQgY2hhbmdlZDogIiArIGZvcm1hdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICB2b2lkIHNldENhbGxCYWNrKE1lZGlhQ29kZWMgY29kZWMsIGJvb2xlYW4gaXNDb2RlY0luQXN5bmNNb2RlKSB7CisgICAgICAgIGlmIChpc0NvZGVjSW5Bc3luY01vZGUpIHsKKyAgICAgICAgICAgIGNvZGVjLnNldENhbGxiYWNrKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGdldE91dHB1dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFBhaXI8SW50ZWdlciwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBlbGVtZW50ID0gbnVsbDsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB3aGlsZSAoIW1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgaWYgKG1DYk91dHB1dFF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24uYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IG1DYk91dHB1dFF1ZXVlLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGdldFdvcmsoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZWxlbWVudCA9IG51bGw7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgd2hpbGUgKCFtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChtQ2JJbnB1dFF1ZXVlLmlzRW1wdHkoKSAmJiBtQ2JPdXRwdXRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbUNiT3V0cHV0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBtQ2JPdXRwdXRRdWV1ZS5yZW1vdmUoMCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1DYklucHV0UXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBtQ2JJbnB1dFF1ZXVlLnJlbW92ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICBib29sZWFuIGhhc1NlZW5FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIG1TaWduYWxsZWRFcnJvcjsKKyAgICB9Cit9CisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBNZWRpYUNvZGVjQmFzZSB7CisgICAgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IHNlbGVjdENvZGVjcyhTdHJpbmcgbWltZSwgQXJyYXlMaXN0PE1lZGlhRm9ybWF0PiBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmVhdHVyZXMsIGJvb2xlYW4gaXNFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NvZnR3YXJlKSB7CisKKyAgICAgICAgTWVkaWFDb2RlY0xpc3QgY29kZWNMaXN0ID0gbmV3IE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0LlJFR1VMQVJfQ09ERUNTKTsKKyAgICAgICAgTWVkaWFDb2RlY0luZm9bXSBjb2RlY0luZm9zID0gY29kZWNMaXN0LmdldENvZGVjSW5mb3MoKTsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbGlzdE9mQ29kZWNzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gY29kZWNJbmZvIDogY29kZWNJbmZvcykgeworICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIGlmICghY29kZWNJbmZvLmlzRW5jb2RlcigpKSBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjSW5mby5pc0VuY29kZXIoKSkgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuUSAmJiBjb2RlY0luZm8uaXNBbGlhcygpKSBjb250aW51ZTsKKyAgICAgICAgICAgIFN0cmluZ1tdIHR5cGVzID0gY29kZWNJbmZvLmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKG1pbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvLkNvZGVjQ2FwYWJpbGl0aWVzIGNvZGVjQ2FwYWJpbGl0aWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNZWRpYUZvcm1hdCBmb3JtYXQgOiBmb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2RlY0NhcGFiaWxpdGllcy5pc0Zvcm1hdFN1cHBvcnRlZChmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmZWF0dXJlIDogZmVhdHVyZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ2FwYWJpbGl0aWVzLmlzRmVhdHVyZVN1cHBvcnRlZChmZWF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaXNTb2Z0d2FyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjSW5mby5nZXROYW1lKCkuY29udGFpbnMoInNvZnR3YXJlIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygiYW5kcm9pZCIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjSW5mby5nZXROYW1lKCkuY29udGFpbnMoImdvb2dsZSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2spIGxpc3RPZkNvZGVjcy5hZGQoY29kZWNJbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygic29mdHdhcmUiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm8uZ2V0TmFtZSgpLmNvbnRhaW5zKCJhbmRyb2lkIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLmdldE5hbWUoKS5jb250YWlucygiZ29vZ2xlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2spIGxpc3RPZkNvZGVjcy5hZGQoY29kZWNJbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3RPZkNvZGVjczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL01lZGlhQ29kZWNTdXJmYWNlRW5jb2Rlci5qYXZhIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFjMzhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9NZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIuamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTXV4ZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5LkZSQU1FX1RZUEVfQjsKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eS5GUkFNRV9UWVBFX0k7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkuRlJBTUVfVFlQRV9QOworCitwdWJsaWMgY2xhc3MgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJREVPX0JJVFJBVEUgPSA4MDAwMDAwICAvKjggTWJwcyovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSURFT19GUkFNRVJBVEUgPSAzMDsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUFjdGl2aXR5Q29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUmVzSUQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heEJGcmFtZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1pbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU91dHB1dFBhdGg7CisgICAgcHJpdmF0ZSBpbnQgbVRyYWNrSUQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtRnJhbWVOdW0gPSAwOworICAgIHByaXZhdGUgaW50W10gbUZyYW1lVHlwZU9jY3VycmVuY2VzID0gezAsIDAsIDB9OworCisgICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOworICAgIHByaXZhdGUgTWVkaWFFeHRyYWN0b3IgbUV4dHJhY3RvcjsKKyAgICBwcml2YXRlIE1lZGlhQ29kZWMgbURlY29kZXI7CisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjIG1FbmNvZGVyOworICAgIHByaXZhdGUgTWVkaWFNdXhlciBtTXV4ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbUlzQ29kZWNTb2Z0d2FyZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNhd0RlY0lucHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2F3RGVjT3V0cHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2F3RW5jT3V0cHV0RU9TOworICAgIHByaXZhdGUgaW50IG1EZWNPdXRwdXRDb3VudDsKKyAgICBwcml2YXRlIGludCBtRW5jT3V0cHV0Q291bnQ7CisKKyAgICBwcml2YXRlIGZpbmFsIENvZGVjQXN5bmNIYW5kbGVyIG1Bc3luY0hhbmRsZUVuY29kZXIgPSBuZXcgQ29kZWNBc3luY0hhbmRsZXIoKTsKKyAgICBwcml2YXRlIGZpbmFsIENvZGVjQXN5bmNIYW5kbGVyIG1Bc3luY0hhbmRsZURlY29kZXIgPSBuZXcgQ29kZWNBc3luY0hhbmRsZXIoKTsKKworICAgIHB1YmxpYyBNZWRpYUNvZGVjU3VyZmFjZUVuY29kZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzSWQsIFN0cmluZyBtaW1lLCBib29sZWFuIGlzU29mdHdhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0cHV0UGF0aCwgaW50IG1heEJGcmFtZXMpIHsKKyAgICAgICAgbUFjdGl2aXR5Q29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIG1SZXNJRCA9IHJlc0lkOworICAgICAgICBtTWltZSA9IG1pbWU7CisgICAgICAgIG1Jc0NvZGVjU29mdHdhcmUgPSBpc1NvZnR3YXJlOworICAgICAgICBtT3V0cHV0UGF0aCA9IG91dHB1dFBhdGg7CisgICAgICAgIG1NYXhCRnJhbWVzID0gbWF4QkZyYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyKENvbnRleHQgY29udGV4dCwgaW50IHJlc0lkLCBTdHJpbmcgbWltZSwgYm9vbGVhbiBpc1NvZnR3YXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dHB1dFBhdGgpIHsKKyAgICAgICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBNZWRpYUZvcm1hdC5LRVlfTUFYX0JfRlJBTUVTIGlzIHNldCB0byAxLCBpZiBub3QgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLgorICAgICAgICB0aGlzKGNvbnRleHQsIHJlc0lkLCBtaW1lLCBpc1NvZnR3YXJlLCBvdXRwdXRQYXRoLCAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHN0YXJ0RW5jb2RpbmdTdXJmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQgPSBzZXRVcFNvdXJjZSgpOworICAgICAgICBpZiAoZGVjb2RlckZvcm1hdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVjb2Rlck1pbWUgPSBkZWNvZGVyRm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGxpc3RPZkRlb2NkZXJzID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjQmFzZS5zZWxlY3RDb2RlY3MoZGVjb2Rlck1pbWUsIG51bGwsIG51bGwsIGZhbHNlLCBtSXNDb2RlY1NvZnR3YXJlKTsKKyAgICAgICAgaWYgKGxpc3RPZkRlb2NkZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gc3VpdGFibGUgZGVjb2RlciBmb3VuZCBmb3IgbWltZTogIiArIGRlY29kZXJNaW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtRGVjb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUobGlzdE9mRGVvY2RlcnMuZ2V0KDApKTsKKworICAgICAgICBNZWRpYUZvcm1hdCBlbmNvZGVyRm9ybWF0ID0gc2V0VXBFbmNvZGVyRm9ybWF0KGRlY29kZXJGb3JtYXQpOworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0T2ZFbmNvZGVycyA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0Jhc2Uuc2VsZWN0Q29kZWNzKG1NaW1lLCBudWxsLCBudWxsLCB0cnVlLCBtSXNDb2RlY1NvZnR3YXJlKTsKKyAgICAgICAgaWYgKGxpc3RPZkVuY29kZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiTm8gc3VpdGFibGUgZW5jb2RlciBmb3VuZCBmb3IgbWltZTogIiArIG1NaW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gbXV4T3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChTdHJpbmcgZW5jb2RlciA6IGxpc3RPZkVuY29kZXJzKSB7CisgICAgICAgICAgICBtRW5jb2RlciA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUoZW5jb2Rlcik7CisgICAgICAgICAgICBtRXh0cmFjdG9yLnNlZWtUbygwLCBNZWRpYUV4dHJhY3Rvci5TRUVLX1RPX0NMT1NFU1RfU1lOQyk7CisgICAgICAgICAgICBpZiAobXV4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgaW50IG11eGVyRm9ybWF0ID0gTWVkaWFNdXhlci5PdXRwdXRGb3JtYXQuTVVYRVJfT1VUUFVUX01QRUdfNDsKKyAgICAgICAgICAgICAgICBtTXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihtT3V0cHV0UGF0aCwgbXV4ZXJGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlndXJlQ29kZWMoZGVjb2RlckZvcm1hdCwgZW5jb2RlckZvcm1hdCk7CisgICAgICAgICAgICBtRW5jb2Rlci5zdGFydCgpOworICAgICAgICAgICAgbURlY29kZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIGRvV29yayhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBxdWV1ZUVPUygpOworICAgICAgICAgICAgd2FpdEZvckFsbEVuY29kZXJPdXRwdXRzKCk7CisgICAgICAgICAgICBpZiAobXV4T3V0cHV0KSB7CisgICAgICAgICAgICAgICAgaWYgKG1UcmFja0lEICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIG1NdXhlci5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIG1UcmFja0lEID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtTXV4ZXIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtTXV4ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1EZWNvZGVyLnJlc2V0KCk7CisgICAgICAgICAgICBtRW5jb2Rlci5yZXNldCgpOworICAgICAgICAgICAgbVN1cmZhY2UucmVsZWFzZSgpOworICAgICAgICAgICAgbVN1cmZhY2UgPSBudWxsOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiTnVtYmVyIG9mIEktZnJhbWVzID0gIiArIG1GcmFtZVR5cGVPY2N1cnJlbmNlc1tGUkFNRV9UWVBFX0ldKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIk51bWJlciBvZiBQLWZyYW1lcyA9ICIgKyBtRnJhbWVUeXBlT2NjdXJyZW5jZXNbRlJBTUVfVFlQRV9QXSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJOdW1iZXIgb2YgQi1mcmFtZXMgPSAiICsgbUZyYW1lVHlwZU9jY3VycmVuY2VzW0ZSQU1FX1RZUEVfQl0pOworICAgICAgICB9CisgICAgICAgIG1FbmNvZGVyLnJlbGVhc2UoKTsKKyAgICAgICAgbURlY29kZXIucmVsZWFzZSgpOworICAgICAgICBtRXh0cmFjdG9yLnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBzZXRVcFNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1FeHRyYWN0b3IgPSBuZXcgTWVkaWFFeHRyYWN0b3IoKTsKKyAgICAgICAgQXNzZXRGaWxlRGVzY3JpcHRvciBmZCA9IG1BY3Rpdml0eUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkub3BlblJhd1Jlc291cmNlRmQobVJlc0lEKTsKKyAgICAgICAgbUV4dHJhY3Rvci5zZXREYXRhU291cmNlKGZkLmdldEZpbGVEZXNjcmlwdG9yKCksIGZkLmdldFN0YXJ0T2Zmc2V0KCksIGZkLmdldExlbmd0aCgpKTsKKyAgICAgICAgZm9yIChpbnQgdHJhY2tJRCA9IDA7IHRyYWNrSUQgPCBtRXh0cmFjdG9yLmdldFRyYWNrQ291bnQoKTsgdHJhY2tJRCsrKSB7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBtRXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KHRyYWNrSUQpOworICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci5zZWxlY3RUcmFjayh0cmFja0lEKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNDYXBhYmlsaXRpZXMuQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhY3Rvci5yZWxlYXNlKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFGb3JtYXQgc2V0VXBFbmNvZGVyRm9ybWF0KE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlckZvcm1hdCA9IG5ldyBNZWRpYUZvcm1hdCgpOworICAgICAgICBlbmNvZGVyRm9ybWF0LnNldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSwgbU1pbWUpOworICAgICAgICBlbmNvZGVyRm9ybWF0CisgICAgICAgICAgICAgICAgLnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1dJRFRILCBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1dJRFRIKSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hULAorICAgICAgICAgICAgICAgIGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hUKSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgVklERU9fRlJBTUVSQVRFKTsKKyAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSwgVklERU9fQklUUkFURSk7CisgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0RmxvYXQoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEuMGYpOworICAgICAgICBlbmNvZGVyRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllcy5DT0xPUl9Gb3JtYXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG1NaW1lLmVxdWFscyhNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDKSkgeworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLAorICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjSW5mby5Db2RlY1Byb2ZpbGVMZXZlbC5IRVZDUHJvZmlsZU1haW4pOworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuSEVWQ01haW5UaWVyTGV2ZWw0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm8uQ29kZWNQcm9maWxlTGV2ZWwuQVZDUHJvZmlsZU1haW4pOworICAgICAgICAgICAgZW5jb2RlckZvcm1hdAorICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwsIE1lZGlhQ29kZWNJbmZvLkNvZGVjUHJvZmlsZUxldmVsLkFWQ0xldmVsNCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSBCdWlsZC5WRVJTSU9OX0NPREVTLlEpIHsKKyAgICAgICAgICAgIGVuY29kZXJGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0JfRlJBTUVTLCBtTWF4QkZyYW1lcyk7CisgICAgICAgIH0gZWxzZSBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuTykgeworICAgICAgICAgICAgZW5jb2RlckZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MQVRFTkNZLCAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5jb2RlckZvcm1hdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRDb250ZXh0KCkgeworICAgICAgICBtQXN5bmNIYW5kbGVEZWNvZGVyLnJlc2V0Q29udGV4dCgpOworICAgICAgICBtQXN5bmNIYW5kbGVFbmNvZGVyLnJlc2V0Q29udGV4dCgpOworICAgICAgICBtU2F3RGVjSW5wdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgbVNhd0RlY091dHB1dEVPUyA9IGZhbHNlOworICAgICAgICBtU2F3RW5jT3V0cHV0RU9TID0gZmFsc2U7CisgICAgICAgIG1EZWNPdXRwdXRDb3VudCA9IDA7CisgICAgICAgIG1FbmNPdXRwdXRDb3VudCA9IDA7CisgICAgICAgIG1GcmFtZU51bSA9IDA7CisgICAgICAgIEFycmF5cy5maWxsKG1GcmFtZVR5cGVPY2N1cnJlbmNlcywgMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUNvZGVjKE1lZGlhRm9ybWF0IGRlY0Zvcm1hdCwgTWVkaWFGb3JtYXQgZW5jRm9ybWF0KSB7CisgICAgICAgIHJlc2V0Q29udGV4dCgpOworICAgICAgICBtQXN5bmNIYW5kbGVFbmNvZGVyLnNldENhbGxCYWNrKG1FbmNvZGVyLCB0cnVlKTsKKyAgICAgICAgbUVuY29kZXIuY29uZmlndXJlKGVuY0Zvcm1hdCwgbnVsbCwgbnVsbCwgTWVkaWFDb2RlYy5DT05GSUdVUkVfRkxBR19FTkNPREUpOworICAgICAgICBtU3VyZmFjZSA9IG1FbmNvZGVyLmNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICBpZiAoIW1TdXJmYWNlLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiU3VyZmFjZSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQXN5bmNIYW5kbGVEZWNvZGVyLnNldENhbGxCYWNrKG1EZWNvZGVyLCB0cnVlKTsKKyAgICAgICAgbURlY29kZXIuY29uZmlndXJlKGRlY0Zvcm1hdCwgbVN1cmZhY2UsIG51bGwsIDApOworICAgICAgICBMb2cuZChUQUcsICJDb2RlYyBjb25maWd1cmVkIik7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRW5jb2RlciBPdXRwdXQgZm9ybWF0OiAiICsgbUVuY29kZXIuZ2V0T3V0cHV0Rm9ybWF0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlcXVldWVEZWNvZGVyT3V0cHV0KGludCBidWZmZXJJbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKSB7CisgICAgICAgICAgICBtU2F3RGVjT3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywKKyAgICAgICAgICAgICAgICAgICAgIm91dHB1dDogaWQ6ICIgKyBidWZmZXJJbmRleCArICIgZmxhZ3M6ICIgKyBpbmZvLmZsYWdzICsgIiBzaXplOiAiICsgaW5mby5zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRpbWVzdGFtcDogIiArIGluZm8ucHJlc2VudGF0aW9uVGltZVVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby5zaXplID4gMCAmJiAoaW5mby5mbGFncyAmIE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKSA9PSAwKSB7CisgICAgICAgICAgICBtRGVjT3V0cHV0Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBtRGVjb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4LCBtU3VyZmFjZSAhPSBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5xdWV1ZURlY29kZXJJbnB1dChpbnQgYnVmZmVySW5kZXgpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dEJ1ZmZlciA9IG1EZWNvZGVyLmdldElucHV0QnVmZmVyKGJ1ZmZlckluZGV4KTsKKyAgICAgICAgaW50IHNpemUgPSBtRXh0cmFjdG9yLnJlYWRTYW1wbGVEYXRhKGlucHV0QnVmZmVyLCAwKTsKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBlbnF1ZXVlRGVjb2RlckVPUyhidWZmZXJJbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIHB0cyA9IG1FeHRyYWN0b3IuZ2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgaW50IGV4dHJhY3RvckZsYWdzID0gbUV4dHJhY3Rvci5nZXRTYW1wbGVGbGFncygpOworICAgICAgICAgICAgaW50IGNvZGVjRmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKChleHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yLlNBTVBMRV9GTEFHX1NZTkMpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChleHRyYWN0b3JGbGFncyAmIE1lZGlhRXh0cmFjdG9yLlNBTVBMRV9GTEFHX1BBUlRJQUxfRlJBTUUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfUEFSVElBTF9GUkFNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbUV4dHJhY3Rvci5hZHZhbmNlKCkpIHsKKyAgICAgICAgICAgICAgICBjb2RlY0ZsYWdzIHw9IE1lZGlhQ29kZWMuQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICBtU2F3RGVjSW5wdXRFT1MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW5wdXQ6IGlkOiAiICsgYnVmZmVySW5kZXggKyAiIHNpemU6ICIgKyBzaXplICsgIiBwdHM6ICIgKyBwdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBmbGFnczogIiArIGNvZGVjRmxhZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURlY29kZXIucXVldWVJbnB1dEJ1ZmZlcihidWZmZXJJbmRleCwgMCwgc2l6ZSwgcHRzLCBjb2RlY0ZsYWdzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1dvcmsoaW50IGZyYW1lTGltaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0RlY0lucHV0RU9TICYmIGZyYW1lQ291bnQgPCBmcmFtZUxpbWl0KSB7CisgICAgICAgICAgICBQYWlyPEludGVnZXIsIE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZWxlbWVudCA9IG1Bc3luY0hhbmRsZURlY29kZXIuZ2V0V29yaygpOworICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCBidWZmZXJJRCA9IGVsZW1lbnQuZmlyc3Q7CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8gPSBlbGVtZW50LnNlY29uZDsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDxpZCwgaW5mbz4gY29ycmVzcG9uZHMgdG8gb3V0cHV0IGNhbGxiYWNrLgorICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlRGVjb2Rlck91dHB1dChidWZmZXJJRCwgaW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gPGlkLCBudWxsPiBjb3JyZXNwb25kcyB0byBpbnB1dCBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZURlY29kZXJJbnB1dChidWZmZXJJRCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBkZWNvZGVyIEVPUworICAgICAgICAgICAgaWYgKG1TYXdEZWNPdXRwdXRFT1MpIG1FbmNvZGVyLnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIC8vIGVuY29kZXIgb3V0cHV0CisgICAgICAgICAgICBpZiAobURlY091dHB1dENvdW50IC0gbUVuY091dHB1dENvdW50ID4gbU1heEJGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0cnlFbmNvZGVyT3V0cHV0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcXVldWVFT1MoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB3aGlsZSAoIW1Bc3luY0hhbmRsZURlY29kZXIuaGFzU2VlbkVycm9yKCkgJiYgIW1TYXdEZWNJbnB1dEVPUykgeworICAgICAgICAgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGVsZW1lbnQgPSBtQXN5bmNIYW5kbGVEZWNvZGVyLmdldFdvcmsoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnQgYnVmZmVySUQgPSBlbGVtZW50LmZpcnN0OworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBpbmZvID0gZWxlbWVudC5zZWNvbmQ7CisgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlRGVjb2Rlck91dHB1dChidWZmZXJJRCwgaW5mbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZURlY29kZXJFT1MoZWxlbWVudC5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0RlY091dHB1dEVPUykgeworICAgICAgICAgICAgUGFpcjxJbnRlZ2VyLCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGRlY09wID0gbUFzeW5jSGFuZGxlRGVjb2Rlci5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGlmIChkZWNPcCAhPSBudWxsKSBkZXF1ZXVlRGVjb2Rlck91dHB1dChkZWNPcC5maXJzdCwgZGVjT3Auc2Vjb25kKTsKKyAgICAgICAgICAgIGlmIChtU2F3RGVjT3V0cHV0RU9TKSBtRW5jb2Rlci5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpZiAobURlY091dHB1dENvdW50IC0gbUVuY091dHB1dENvdW50ID4gbU1heEJGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0cnlFbmNvZGVyT3V0cHV0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdHJ5RW5jb2Rlck91dHB1dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaGFzU2VlbkVycm9yKCkgJiYgIW1TYXdFbmNPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgIFBhaXI8SW50ZWdlciwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBlbGVtZW50ID0gbUFzeW5jSGFuZGxlRW5jb2Rlci5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZXF1ZXVlRW5jb2Rlck91dHB1dChlbGVtZW50LmZpcnN0LCBlbGVtZW50LnNlY29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd2FpdEZvckFsbEVuY29kZXJPdXRwdXRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKCFoYXNTZWVuRXJyb3IoKSAmJiAhbVNhd0VuY091dHB1dEVPUykgeworICAgICAgICAgICAgdHJ5RW5jb2Rlck91dHB1dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVucXVldWVEZWNvZGVyRU9TKGludCBidWZmZXJJbmRleCkgeworICAgICAgICBpZiAoIW1TYXdEZWNJbnB1dEVPUykgeworICAgICAgICAgICAgbURlY29kZXIucXVldWVJbnB1dEJ1ZmZlcihidWZmZXJJbmRleCwgMCwgMCwgMCwgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIG1TYXdEZWNJbnB1dEVPUyA9IHRydWU7CisgICAgICAgICAgICBMb2cuZChUQUcsICJRdWV1ZWQgRW5kIG9mIFN0cmVhbSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlcXVldWVFbmNvZGVyT3V0cHV0KGludCBidWZmZXJJbmRleCwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGluZm8pIHsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJlbmNvZGVyIG91dHB1dDogaWQ6ICIgKyBidWZmZXJJbmRleCArICIgZmxhZ3M6ICIgKyBpbmZvLmZsYWdzICsgIiBzaXplOiAiICsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5zaXplICsgIiB0aW1lc3RhbXA6ICIgKyBpbmZvLnByZXNlbnRhdGlvblRpbWVVcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKSB7CisgICAgICAgICAgICBtU2F3RW5jT3V0cHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby5zaXplID4gMCkgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBtRW5jb2Rlci5nZXRPdXRwdXRCdWZmZXIoYnVmZmVySW5kZXgpOworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGJ1ZmZlciB0byBnZXQgdGhlIGZyYW1lIHR5cGUKKyAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAiWyBGcmFtZSA6ICIgKyAobUZyYW1lTnVtKyspICsgIiBdIik7CisgICAgICAgICAgICBpbnQgZnJhbWVUeXBlUmVzdWx0ID0gLTE7CisgICAgICAgICAgICBpZiAobU1pbWUgPT0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgICAgICAgICAgZnJhbWVUeXBlUmVzdWx0ID0gTmFsVW5pdFV0aWwuZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21BVkMoYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1pbWUgPT0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSEVWQyl7CisgICAgICAgICAgICAgICAgZnJhbWVUeXBlUmVzdWx0ID0gTmFsVW5pdFV0aWwuZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21IRVZDKGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk1pbWUgdHlwZSAiICsgbU1pbWUgKyAiIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYW1lVHlwZVJlc3VsdCAhPSAtMSkgeworICAgICAgICAgICAgICAgIG1GcmFtZVR5cGVPY2N1cnJlbmNlc1tmcmFtZVR5cGVSZXN1bHRdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTXV4ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2tJRCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBtVHJhY2tJRCA9IG1NdXhlci5hZGRUcmFjayhtRW5jb2Rlci5nZXRPdXRwdXRGb3JtYXQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1NdXhlci5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTXV4ZXIud3JpdGVTYW1wbGVEYXRhKG1UcmFja0lELCBidWYsIGluZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChpbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19DT0RFQ19DT05GSUcpID09IDApIHsKKyAgICAgICAgICAgICAgICBtRW5jT3V0cHV0Q291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW5jb2Rlci5yZWxlYXNlT3V0cHV0QnVmZmVyKGJ1ZmZlckluZGV4LCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1NlZW5FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIG1Bc3luY0hhbmRsZURlY29kZXIuaGFzU2VlbkVycm9yKCkgfHwgbUFzeW5jSGFuZGxlRW5jb2Rlci5oYXNTZWVuRXJyb3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50W10gZ2V0RnJhbWVUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZVR5cGVPY2N1cnJlbmNlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL05hbFVuaXRVdGlsLmphdmEgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvc2FtcGxldmlkZW9lbmNvZGVyL05hbFVuaXRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZjRmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvTmFsVW5pdFV0aWwuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyOworCitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eS5GUkFNRV9UWVBFX0I7CitpbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnNhbXBsZXZpZGVvZW5jb2Rlci5NYWluQWN0aXZpdHkuRlJBTUVfVFlQRV9JOworaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXIuTWFpbkFjdGl2aXR5LkZSQU1FX1RZUEVfUDsKKworcHVibGljIGNsYXNzIE5hbFVuaXRVdGlsIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gTWVkaWFDb2RlY1N1cmZhY2VFbmNvZGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBmaW5kTmFsVW5pdChieXRlW10gZGF0YUFycmF5LCBpbnQgcG9zLCBpbnQgbGltaXQpIHsKKyAgICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKKyAgICAgICAgaWYgKGxpbWl0IC0gcG9zIDwgNCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0T2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhQXJyYXlbcG9zXSA9PSAwICYmIGRhdGFBcnJheVtwb3MgKyAxXSA9PSAwICYmIGRhdGFBcnJheVtwb3MgKyAyXSA9PSAxKSB7CisgICAgICAgICAgICBzdGFydE9mZnNldCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGF0YUFycmF5W3Bvc10gPT0gMCAmJiBkYXRhQXJyYXlbcG9zICsgMV0gPT0gMCAmJiBkYXRhQXJyYXlbcG9zICsgMl0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBkYXRhQXJyYXlbcG9zICsgM10gPT0gMSkgeworICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFWQ05hbFVuaXRUeXBlKGJ5dGVbXSBkYXRhQXJyYXksIGludCBuYWxVbml0T2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBkYXRhQXJyYXlbbmFsVW5pdE9mZnNldF0gJiAweDFGOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZUFWQ05BTFVuaXREYXRhKGJ5dGVbXSBkYXRhQXJyYXksIGludCBvZmZzZXQsIGludCBsaW1pdCkgeworICAgICAgICBQYXJzYWJsZUJpdEFycmF5IGJpdEFycmF5ID0gbmV3IFBhcnNhYmxlQml0QXJyYXkoZGF0YUFycmF5KTsKKyAgICAgICAgYml0QXJyYXkucmVzZXQoZGF0YUFycmF5LCBvZmZzZXQsIGxpbWl0KTsKKworICAgICAgICBiaXRBcnJheS5za2lwQml0KCk7IC8vIGZvcmJpZGRlbl96ZXJvX2JpdAorICAgICAgICBiaXRBcnJheS5yZWFkQml0cygyKTsgLy8gbmFsX3JlZl9pZGMKKyAgICAgICAgYml0QXJyYXkuc2tpcEJpdHMoNSk7IC8vIG5hbF91bml0X3R5cGUKKworICAgICAgICBiaXRBcnJheS5yZWFkVUVWKCk7IC8vIGZpcnN0X21iX2luX3NsaWNlCisgICAgICAgIGlmICghYml0QXJyYXkuY2FuUmVhZFVFVigpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNsaWNlVHlwZSA9IGJpdEFycmF5LnJlYWRVRVYoKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZV90eXBlID0gIiArIHNsaWNlVHlwZSk7CisgICAgICAgIGlmIChzbGljZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfUDsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfQjsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRIRVZDTmFsVW5pdFR5cGUoYnl0ZVtdIGRhdGFBcnJheSwgaW50IG5hbFVuaXRPZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIChkYXRhQXJyYXlbbmFsVW5pdE9mZnNldF0gJiAweDdFKSA+PiAxOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZUhFVkNOQUxVbml0RGF0YShieXRlW10gZGF0YUFycmF5LCBpbnQgb2Zmc2V0LCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYWxVbml0VHlwZSkgeworICAgICAgICAvLyBuYWxfdW5pdF90eXBlIHZhbHVlcyBmcm9tIEguMjY1L0hFVkMgVGFibGUgNy0xLgorICAgICAgICBmaW5hbCBpbnQgQkxBX1dfTFAgPSAxNjsKKyAgICAgICAgZmluYWwgaW50IFJTVl9JUkFQX1ZDTDIzID0gMjM7CisKKyAgICAgICAgUGFyc2FibGVCaXRBcnJheSBiaXRBcnJheSA9IG5ldyBQYXJzYWJsZUJpdEFycmF5KGRhdGFBcnJheSk7CisgICAgICAgIGJpdEFycmF5LnJlc2V0KGRhdGFBcnJheSwgb2Zmc2V0LCBsaW1pdCk7CisKKyAgICAgICAgYml0QXJyYXkuc2tpcEJpdCgpOyAvLyBmb3JiaWRkZW4gemVybyBiaXQKKyAgICAgICAgYml0QXJyYXkucmVhZEJpdHMoNik7IC8vIG5hbF91bml0X2hlYWRlcgorICAgICAgICBiaXRBcnJheS5yZWFkQml0cyg2KTsgLy8gbnVoX2xheWVyX2lkCisgICAgICAgIGJpdEFycmF5LnJlYWRCaXRzKDMpOyAvLyBudWhfdGVtcG9yYWxfaWRfcGx1czEKKworICAgICAgICAvLyBQYXJzaW5nIHNsaWNlX3NlZ21lbnRfaGVhZGVyIHZhbHVlcyBmcm9tIEguMjY1L0hFVkMgVGFibGUgNy4zLjYuMQorICAgICAgICBib29sZWFuIGZpcnN0X3NsaWNlX3NlZ21lbnQgPSBiaXRBcnJheS5yZWFkQml0KCk7IC8vIGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcKKyAgICAgICAgaWYgKCFmaXJzdF9zbGljZV9zZWdtZW50KSByZXR1cm4gLTE7CisgICAgICAgIGlmIChuYWxVbml0VHlwZSA+PSBCTEFfV19MUCAmJiBuYWxVbml0VHlwZSA8PSBSU1ZfSVJBUF9WQ0wyMykgeworICAgICAgICAgICAgYml0QXJyYXkucmVhZEJpdCgpOyAgLy8gbm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZworICAgICAgICB9CisgICAgICAgIGJpdEFycmF5LnJlYWRVRVYoKTsgLy8gc2xpY2VfcGljX3BhcmFtZXRlcl9zZXRfaWQKKyAgICAgICAgLy8gQXNzdW1lIG51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0cyBlbGVtZW50IG9mIFBQUyBkYXRhIHRvIGJlIDAKKyAgICAgICAgaW50IHNsaWNlVHlwZSA9IGJpdEFycmF5LnJlYWRVRVYoKTsKKyAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZV90eXBlID0gIiArIHNsaWNlVHlwZSk7CisgICAgICAgIGlmIChzbGljZVR5cGUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfQjsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfUDsKKyAgICAgICAgfSBlbHNlIGlmIChzbGljZVR5cGUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1RZUEVfSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YW5kYXJkaXplZEZyYW1lVHlwZXNGcm9tQVZDKEJ5dGVCdWZmZXIgYnVmKSB7CisgICAgICAgIGludCBsaW1pdCA9IGJ1Zi5saW1pdCgpOworICAgICAgICBieXRlW10gZGF0YUFycmF5ID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKKyAgICAgICAgYnVmLmdldChkYXRhQXJyYXkpOworICAgICAgICBpbnQgZnJhbWVUeXBlID0gLTE7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyArIDMgPCBsaW1pdDsgKSB7CisgICAgICAgICAgICBpbnQgc3RhcnRPZmZzZXQgPSBOYWxVbml0VXRpbC5maW5kTmFsVW5pdChkYXRhQXJyYXksIHBvcywgbGltaXQpOworICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFsVW5pdFR5cGUgPSBnZXRBVkNOYWxVbml0VHlwZShkYXRhQXJyYXksIChwb3MgKyBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOYWxVbml0T2Zmc2V0ID0gIiArIChwb3MgKyBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOYWxVbml0VHlwZSA9ICIgKyBuYWxVbml0VHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFNMSUNFX05BTCA9IDE7IElEUl9TTElDRV9OQUwgPSA1CisgICAgICAgICAgICAgICAgaWYgKG5hbFVuaXRUeXBlID09IDEgfHwgbmFsVW5pdFR5cGUgPT0gNSkgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVR5cGUgPSBwYXJzZUFWQ05BTFVuaXREYXRhKGRhdGFBcnJheSwgKHBvcyArIHN0YXJ0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGltaXQgLSBwb3MgLSBzdGFydE9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zICs9IDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFtZVR5cGU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3RhbmRhcmRpemVkRnJhbWVUeXBlc0Zyb21IRVZDKEJ5dGVCdWZmZXIgYnVmKSB7CisgICAgICAgIGludCBsaW1pdCA9IGJ1Zi5saW1pdCgpOworICAgICAgICBieXRlW10gZGF0YUFycmF5ID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKKyAgICAgICAgYnVmLmdldChkYXRhQXJyYXkpOworICAgICAgICBpbnQgZnJhbWVUeXBlID0gLTE7CisgICAgICAgIGZvciAoaW50IHBvcyA9IDA7IHBvcyArIDMgPCBsaW1pdDsgKSB7CisgICAgICAgICAgICBpbnQgc3RhcnRPZmZzZXQgPSBOYWxVbml0VXRpbC5maW5kTmFsVW5pdChkYXRhQXJyYXksIHBvcywgbGltaXQpOworICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgbmFsVW5pdFR5cGUgPSBOYWxVbml0VXRpbC5nZXRIRVZDTmFsVW5pdFR5cGUoZGF0YUFycmF5LCAocG9zICsgc3RhcnRPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmFsVW5pdE9mZnNldCA9ICIgKyAocG9zICsgc3RhcnRPZmZzZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiTmFsVW5pdFR5cGUgPSAiICsgbmFsVW5pdFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBQYXJzZSBOQUxVbml0cyBjb250YWluaW5nIHNsaWNlX2hlYWRlcnMgd2hpY2ggbGllcyBpbiB0aGUgcmFuZ2Ugb2YgMCB0byAyMQorICAgICAgICAgICAgICAgIGlmIChuYWxVbml0VHlwZSA+PSAwICYmIG5hbFVuaXRUeXBlIDw9IDIxKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZSA9IHBhcnNlSEVWQ05BTFVuaXREYXRhKGRhdGFBcnJheSwgKHBvcyArIHN0YXJ0T2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGltaXQgLSBwb3MgLSBzdGFydE9mZnNldCksIG5hbFVuaXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZnJhbWVUeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvUGFyc2FibGVCaXRBcnJheS5qYXZhIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL3NhbXBsZXZpZGVvZW5jb2Rlci9QYXJzYWJsZUJpdEFycmF5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiZmFhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9zYW1wbGV2aWRlb2VuY29kZXIvUGFyc2FibGVCaXRBcnJheS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zYW1wbGV2aWRlb2VuY29kZXI7CisKK3B1YmxpYyBjbGFzcyBQYXJzYWJsZUJpdEFycmF5IHsKKyAgICBwdWJsaWMgYnl0ZVtdIGRhdGE7CisgICAgcHJpdmF0ZSBpbnQgYnl0ZU9mZnNldDsKKyAgICBwcml2YXRlIGludCBiaXRPZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgYnl0ZUxpbWl0OworCisgICAgcHVibGljIFBhcnNhYmxlQml0QXJyYXkoYnl0ZVtdIGRhdGFBcnJheSkgeworICAgICAgICB0aGlzKGRhdGFBcnJheSwgZGF0YUFycmF5Lmxlbmd0aCk7CisgICAgfQorCisgICAgcHVibGljIFBhcnNhYmxlQml0QXJyYXkoYnl0ZVtdIGRhdGFBcnJheSwgaW50IGxpbWl0KSB7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGFBcnJheTsKKyAgICAgICAgYnl0ZUxpbWl0ID0gbGltaXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsaW1pdCkgeworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICBieXRlT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBiaXRPZmZzZXQgPSAwOworICAgICAgICBieXRlTGltaXQgPSBsaW1pdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwQml0KCkgeworICAgICAgICBpZiAoKytiaXRPZmZzZXQgPT0gOCkgeworICAgICAgICAgICAgYml0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ5dGVPZmZzZXQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNraXBCaXRzKGludCBudW1CaXRzKSB7CisgICAgICAgIGludCBudW1CeXRlcyA9IG51bUJpdHMgLyA4OworICAgICAgICBieXRlT2Zmc2V0ICs9IG51bUJ5dGVzOworICAgICAgICBiaXRPZmZzZXQgKz0gbnVtQml0cyAtIChudW1CeXRlcyAqIDgpOworICAgICAgICBpZiAoYml0T2Zmc2V0ID4gNykgeworICAgICAgICAgICAgYnl0ZU9mZnNldCsrOworICAgICAgICAgICAgYml0T2Zmc2V0IC09IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkQml0KCkgeworICAgICAgICBib29sZWFuIHJldHVyblZhbHVlID0gKGRhdGFbYnl0ZU9mZnNldF0gJiAoMHg4MCA+PiBiaXRPZmZzZXQpKSAhPSAwOworICAgICAgICBza2lwQml0KCk7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRCaXRzKGludCBudW1CaXRzKSB7CisgICAgICAgIGlmIChudW1CaXRzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGludCByZXR1cm5WYWx1ZSA9IDA7CisgICAgICAgIGJpdE9mZnNldCArPSBudW1CaXRzOworICAgICAgICB3aGlsZSAoYml0T2Zmc2V0ID4gOCkgeworICAgICAgICAgICAgYml0T2Zmc2V0IC09IDg7CisgICAgICAgICAgICByZXR1cm5WYWx1ZSB8PSAoZGF0YVtieXRlT2Zmc2V0KytdICYgMHhGRikgPDwgYml0T2Zmc2V0OworICAgICAgICB9CisgICAgICAgIHJldHVyblZhbHVlIHw9IChkYXRhW2J5dGVPZmZzZXRdICYgMHhGRikgPj4gKDggLSBiaXRPZmZzZXQpOworICAgICAgICByZXR1cm5WYWx1ZSAmPSAweEZGRkZGRkZGID4+PiAoMzIgLSBudW1CaXRzKTsKKyAgICAgICAgaWYgKGJpdE9mZnNldCA9PSA4KSB7CisgICAgICAgICAgICBiaXRPZmZzZXQgPSAwOworICAgICAgICAgICAgYnl0ZU9mZnNldCsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZWFkVUVWKCkgeworICAgICAgICBpbnQgaW5pdGlhbEJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworICAgICAgICBpbnQgaW5pdGlhbEJpdE9mZnNldCA9IGJpdE9mZnNldDsKKyAgICAgICAgaW50IGxlYWRpbmdaZXJvcyA9IDA7CisgICAgICAgIHdoaWxlIChieXRlT2Zmc2V0IDwgYnl0ZUxpbWl0ICYmICFyZWFkQml0KCkpIHsKKyAgICAgICAgICAgIGxlYWRpbmdaZXJvcysrOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaGl0TGltaXQgPSBieXRlT2Zmc2V0ID09IGJ5dGVMaW1pdDsKKyAgICAgICAgYnl0ZU9mZnNldCA9IGluaXRpYWxCeXRlT2Zmc2V0OworICAgICAgICBiaXRPZmZzZXQgPSBpbml0aWFsQml0T2Zmc2V0OworICAgICAgICByZXR1cm4gIWhpdExpbWl0ICYmIGNhblJlYWRCaXRzKGxlYWRpbmdaZXJvcyAqIDIgKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHJlYWRVRVYoKSB7CisgICAgICAgIGludCBsZWFkaW5nWmVyb3MgPSAwOworICAgICAgICB3aGlsZSAoIXJlYWRCaXQoKSkgeworICAgICAgICAgICAgbGVhZGluZ1plcm9zKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgxIDw8IGxlYWRpbmdaZXJvcykgLSAxICsgKGxlYWRpbmdaZXJvcyA+IDAgPyByZWFkQml0cyhsZWFkaW5nWmVyb3MpIDogMCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gY2FuUmVhZEJpdHMoaW50IG51bUJpdHMpIHsKKyAgICAgICAgaW50IG9sZEJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworICAgICAgICBpbnQgbnVtQnl0ZXMgPSBudW1CaXRzIC8gODsKKyAgICAgICAgaW50IG5ld0J5dGVPZmZzZXQgPSBieXRlT2Zmc2V0ICsgbnVtQnl0ZXM7CisgICAgICAgIGludCBuZXdCaXRPZmZzZXQgPSBiaXRPZmZzZXQgKyBudW1CaXRzIC0gKG51bUJ5dGVzICogOCk7CisgICAgICAgIGlmIChuZXdCaXRPZmZzZXQgPiA3KSB7CisgICAgICAgICAgICBuZXdCeXRlT2Zmc2V0Kys7CisgICAgICAgICAgICBuZXdCaXRPZmZzZXQgLT0gODsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gb2xkQnl0ZU9mZnNldCArIDE7IGkgPD0gbmV3Qnl0ZU9mZnNldCAmJiBuZXdCeXRlT2Zmc2V0IDwgYnl0ZUxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaG91bGRTa2lwQnl0ZShpKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGJ5dGUgYW5kIGNoZWNrIHRocmVlIGJ5dGVzIGFoZWFkLgorICAgICAgICAgICAgICAgIG5ld0J5dGVPZmZzZXQrKzsKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld0J5dGVPZmZzZXQgPCBieXRlTGltaXQgfHwgKG5ld0J5dGVPZmZzZXQgPT0gYnl0ZUxpbWl0ICYmIG5ld0JpdE9mZnNldCA9PSAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkU2tpcEJ5dGUoaW50IG9mZnNldCkgeworICAgICAgICByZXR1cm4gKDIgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGJ5dGVMaW1pdCAmJiBkYXRhW29mZnNldF0gPT0gKGJ5dGUpIDB4MDMgJiYKKyAgICAgICAgICAgICAgICBkYXRhW29mZnNldCAtIDJdID09IChieXRlKSAweDAwICYmIGRhdGFbb2Zmc2V0IC0gMV0gPT0gKGJ5dGUpIDB4MDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUtdjI0L2ljX2xhdW5jaGVyX2ZvcmVncm91bmQueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUtdjI0L2ljX2xhdW5jaGVyX2ZvcmVncm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDY4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS12MjQvaWNfbGF1bmNoZXJfZm9yZWdyb3VuZC54bWwKQEAgLTAsMCArMSwzMCBAQAorPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgeG1sbnM6YWFwdD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYWFwdCIKKyAgICBhbmRyb2lkOndpZHRoPSIxMDhkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMTA4ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIxMDgiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMTA4Ij4KKyAgICA8cGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMzEsNjMuOTI4YzAsMCA2LjQsLTExIDEyLjEsLTEzLjFjNy4yLC0yLjYgMjYsLTEuNCAyNiwtMS40bDM4LjEsMzguMUwxMDcsMTA4LjkyOGwtMzIsLTFMMzEsNjMuOTI4eiI+CisgICAgICAgIDxhYXB0OmF0dHIgbmFtZT0iYW5kcm9pZDpmaWxsQ29sb3IiPgorICAgICAgICAgICAgPGdyYWRpZW50CisgICAgICAgICAgICAgICAgYW5kcm9pZDplbmRYPSI4NS44NDc1NyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVuZFk9IjkyLjQ5NjMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGFydFg9IjQyLjk0OTIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdGFydFk9IjQ5LjU5NzkzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dHlwZT0ibGluZWFyIj4KKyAgICAgICAgICAgICAgICA8aXRlbQorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbG9yPSIjNDQwMDAwMDAiCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b2Zmc2V0PSIwLjAiIC8+CisgICAgICAgICAgICAgICAgPGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9mZnNldD0iMS4wIiAvPgorICAgICAgICAgICAgPC9ncmFkaWVudD4KKyAgICAgICAgPC9hYXB0OmF0dHI+CisgICAgPC9wYXRoPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgorICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJub25aZXJvIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNjUuMyw0NS44MjhsMy44LC02LjZjMC4yLC0wLjQgMC4xLC0wLjkgLTAuMywtMS4xYy0wLjQsLTAuMiAtMC45LC0wLjEgLTEuMSwwLjNsLTMuOSw2LjdjLTYuMywtMi44IC0xMy40LC0yLjggLTE5LjcsMGwtMy45LC02LjdjLTAuMiwtMC40IC0wLjcsLTAuNSAtMS4xLC0wLjNDMzguOCwzOC4zMjggMzguNywzOC44MjggMzguOSwzOS4yMjhsMy44LDYuNkMzNi4yLDQ5LjQyOCAzMS43LDU2LjAyOCAzMSw2My45MjhoNDZDNzYuMyw1Ni4wMjggNzEuOCw0OS40MjggNjUuMyw0NS44Mjh6TTQzLjQsNTcuMzI4Yy0wLjgsMCAtMS41LC0wLjUgLTEuOCwtMS4yYy0wLjMsLTAuNyAtMC4xLC0xLjUgMC40LC0yLjFjMC41LC0wLjUgMS40LC0wLjcgMi4xLC0wLjRjMC43LDAuMyAxLjIsMSAxLjIsMS44QzQ1LjMsNTYuNTI4IDQ0LjUsNTcuMzI4IDQzLjQsNTcuMzI4TDQzLjQsNTcuMzI4ek02NC42LDU3LjMyOGMtMC44LDAgLTEuNSwtMC41IC0xLjgsLTEuMnMtMC4xLC0xLjUgMC40LC0yLjFjMC41LC0wLjUgMS40LC0wLjcgMi4xLC0wLjRjMC43LDAuMyAxLjIsMSAxLjIsMS44QzY2LjUsNTYuNTI4IDY1LjYsNTcuMzI4IDY0LjYsNTcuMzI4TDY0LjYsNTcuMzI4eiIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzAwMDAwMDAwIiAvPgorPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZC54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2hlcl9iYWNrZ3JvdW5kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Q1ZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZC54bWwKQEAgLTAsMCArMSwxNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOndpZHRoPSIxMDhkcCIKKyAgICBhbmRyb2lkOmhlaWdodD0iMTA4ZHAiCisgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIxMDgiCisgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMTA4Ij4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzNEREM4NCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgxMDh2MTA4aC0xMDh6IiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LDBMOSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwwTDE5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI5LDBMMjksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMzksMEwzOSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik00OSwwTDQ5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTU5LDBMNTksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNjksMEw2OSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik03OSwwTDc5LDEwOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTg5LDBMODksMTA4IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOTksMEw5OSwxMDgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDlMMTA4LDkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDE5TDEwOCwxOSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMjlMMTA4LDI5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwzOUwxMDgsMzkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDQ5TDEwOCw0OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsNTlMMTA4LDU5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCw2OUwxMDgsNjkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDc5TDEwOCw3OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsODlMMTA4LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCw5OUwxMDgsOTkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwyOUw4OSwyOSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDM5TDg5LDM5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksNDlMODksNDkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSw1OUw4OSw1OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDY5TDg5LDY5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksNzlMODksNzkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yOSwxOUwyOSw4OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTM5LDE5TDM5LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNDksMTlMNDksODkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorICAgIDxwYXRoCisgICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjMDAwMDAwMDAiCisgICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01OSwxOUw1OSw4OSIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VXaWR0aD0iMC44IgorICAgICAgICBhbmRyb2lkOnN0cm9rZUNvbG9yPSIjMzNGRkZGRkYiIC8+CisgICAgPHBhdGgKKyAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiMwMDAwMDAwMCIKKyAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTY5LDE5TDY5LDg5IgorICAgICAgICBhbmRyb2lkOnN0cm9rZVdpZHRoPSIwLjgiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlQ29sb3I9IiMzM0ZGRkZGRiIgLz4KKyAgICA8cGF0aAorICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzAwMDAwMDAwIgorICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNzksMTlMNzksODkiCisgICAgICAgIGFuZHJvaWQ6c3Ryb2tlV2lkdGg9IjAuOCIKKyAgICAgICAgYW5kcm9pZDpzdHJva2VDb2xvcj0iIzMzRkZGRkZGIiAvPgorPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9sYXlvdXQvYWN0aXZpdHlfbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MDEyZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL2xheW91dC9hY3Rpdml0eV9tYWluLnhtbApAQCAtMCwwICsxLDEzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxhbmRyb2lkeC5jb25zdHJhaW50bGF5b3V0LndpZGdldC5Db25zdHJhaW50TGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byIKKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgdG9vbHM6Y29udGV4dD0iY29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLk1haW5BY3Rpdml0eSI+CisKKyAgICA8Y29tLmFuZHJvaWQubWVkaWEuc2FtcGxldmlkZW9lbmNvZGVyLkF1dG9GaXRUZXh0dXJlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RleHR1cmUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzAwZHAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50VG9wPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Cb3R0b209IjE2ZHAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRCb3R0b21fdG9Ub3BPZj0iQCtpZC9jaGVja0JveF9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50U3RhcnRfdG9TdGFydE9mPSJwYXJlbnQiCisgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludFRvcF90b1RvcE9mPSJwYXJlbnQiIC8+CisKKyAgICA8Q2hlY2tCb3gKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jaGVja0JveF9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblN0YXJ0PSI5MGRwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiCisgICAgICAgIGFuZHJvaWQ6Zm9udEZhbWlseT0ic2Fucy1zZXJpZi1tZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tZWRpYV9yZWNvcmRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5MYXJnZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgYW5kcm9pZDpjaGVja2VkPSJ0cnVlIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvdGV4dHVyZSIvPgorCisgICAgPENoZWNrQm94CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iOTBkcCIKKyAgICAgICAgYW5kcm9pZDpmb250RmFtaWx5PSJzYW5zLXNlcmlmLW1lZGl1bSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21lZGlhX2NvZGVjIgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkxhcmdlIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfcmVjb3JkZXIiIC8+CisKKyAgICA8UmFkaW9Hcm91cAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JhZGlvX2dyb3VwX21pbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5TdGFydD0iNDBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50U3RhcnRfdG9TdGFydE9mPSJwYXJlbnQiCisgICAgICAgIGFwcDpsYXlvdXRfY29uc3RyYWludEJvdHRvbV90b1RvcE9mPSJAK2lkL2ZyYW1lTGF5b3V0MiIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hdmMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICBhbmRyb2lkOmNoZWNrZWQ9InRydWUiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvYXZjIiAvPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9oZXZjIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2hldmMiIC8+CisgICAgPC9SYWRpb0dyb3VwPgorCisgICAgPFJhZGlvR3JvdXAKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9yYWRpb19ncm91cF9jb2RlYyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMTBkcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luRW5kPSI0MGRwIgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50RW5kX3RvRW5kT2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvY2hlY2tCb3hfbWVkaWFfY29kZWMiPgorCisgICAgICAgIDxSYWRpb0J1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9odyIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6ZW5hYmxlZD0iZmFsc2UiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvaGFyZHdhcmUiIC8+CisKKyAgICAgICAgPFJhZGlvQnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N3IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDplbmFibGVkPSJmYWxzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zb2Z0d2FyZSIgLz4KKyAgICA8L1JhZGlvR3JvdXA+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFtZUxheW91dDIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL3JhZGlvX2dyb3VwX21pbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50U3RhcnQ9InRydWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjEwZHAiCisgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2NvbG9yUHJpbWFyeSIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2Y9IkAraWQvcmFkaW9fZ3JvdXBfbWltZSIKKyAgICAgICAgdG9vbHM6bGF5b3V0X2VkaXRvcl9hYnNvbHV0ZVg9IjgwZHAiPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjEwOGRwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zdGFydF9idXR0b24iCisgICAgICAgICAgICB0b29sczpsYXlvdXRfZWRpdG9yX2Fic29sdXRlWD0iMTU1ZHAiCisgICAgICAgICAgICB0b29sczpsYXlvdXRfZWRpdG9yX2Fic29sdXRlWT0iNDU1ZHAiIC8+CisKKyAgICA8L0ZyYW1lTGF5b3V0PgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dFZpZXdSZXN1bHRzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIxMGRwIgorICAgICAgICBhbmRyb2lkOmZvbnRGYW1pbHk9InNhbnMtc2VyaWYtbWVkaXVtIgorICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxOHNwIgorICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0ibm9ybWFsIgorICAgICAgICBhcHA6bGF5b3V0X2NvbnN0cmFpbnRTdGFydF90b1N0YXJ0T2Y9InBhcmVudCIKKyAgICAgICAgYXBwOmxheW91dF9jb25zdHJhaW50VG9wX3RvQm90dG9tT2YgPSAiQCtpZC9mcmFtZUxheW91dDIiIC8+CisKKzwvYW5kcm9pZHguY29uc3RyYWludGxheW91dC53aWRnZXQuQ29uc3RyYWludExheW91dD4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL21pcG1hcC1hbnlkcGktdjI2L2ljX2xhdW5jaGVyLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL21pcG1hcC1hbnlkcGktdjI2L2ljX2xhdW5jaGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E3MGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXIueG1sCkBAIC0wLDAgKzEsNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxhZGFwdGl2ZS1pY29uIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisgICAgPGJhY2tncm91bmQgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xhdW5jaGVyX2JhY2tncm91bmQiIC8+CisgICAgPGZvcmVncm91bmQgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2xhdW5jaGVyX2ZvcmVncm91bmQiIC8+Cis8L2FkYXB0aXZlLWljb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXJfcm91bmQueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvbWlwbWFwLWFueWRwaS12MjYvaWNfbGF1bmNoZXJfcm91bmQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTcwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9taXBtYXAtYW55ZHBpLXYyNi9pY19sYXVuY2hlcl9yb3VuZC54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPGFkYXB0aXZlLWljb24geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8YmFja2dyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfYmFja2dyb3VuZCIgLz4KKyAgICA8Zm9yZWdyb3VuZCBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbGF1bmNoZXJfZm9yZWdyb3VuZCIgLz4KKzwvYWRhcHRpdmUtaWNvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy9yYXcvY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubXA0IGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvcmF3L2Nyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA0MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvcmF3L2Nyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9jb2xvcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYWVjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cmVzb3VyY2VzPgorICAgIDxjb2xvciBuYW1lPSJjb2xvclByaW1hcnkiPiM2MjAwRUU8L2NvbG9yPgorICAgIDxjb2xvciBuYW1lPSJjb2xvclByaW1hcnlEYXJrIj4jMzcwMEIzPC9jb2xvcj4KKyAgICA8Y29sb3IgbmFtZT0iY29sb3JBY2NlbnQiPiMwM0RBQzU8L2NvbG9yPgorPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2FwcC9zcmMvbWFpbi9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjVhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwxMyBAQAorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5TYW1wbGVWaWRlb0VuY29kZXI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lZGlhX3JlY29yZGVyIj5NZWRpYVJlY29yZGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZWRpYV9jb2RlYyI+TWVkaWFDb2RlYzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhcnRfYnV0dG9uIj5TdGFydDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RvcCI+U3RvcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic3RhcnQiPlN0YXJ0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhdmMiPkFWQzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGV2YyI+SEVWQzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaGFyZHdhcmUiPkgvVzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic29mdHdhcmUiPlMvVzwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9hcHAvc3JjL21haW4vcmVzL3ZhbHVlcy9zdHlsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzkyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYXBwL3NyYy9tYWluL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApAQCAtMCwwICsxLDEwIEBACis8cmVzb3VyY2VzPgorICAgIDwhLS0gQmFzZSBhcHBsaWNhdGlvbiB0aGVtZS4gLS0+CisgICAgPHN0eWxlIG5hbWU9IkFwcFRoZW1lIiBwYXJlbnQ9IlRoZW1lLkFwcENvbXBhdC5MaWdodC5EYXJrQWN0aW9uQmFyIj4KKyAgICAgICAgPCEtLSBDdXN0b21pemUgeW91ciB0aGVtZSBoZXJlLiAtLT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JQcmltYXJ5Ij5AY29sb3IvY29sb3JQcmltYXJ5PC9pdGVtPgorICAgICAgICA8aXRlbSBuYW1lPSJjb2xvclByaW1hcnlEYXJrIj5AY29sb3IvY29sb3JQcmltYXJ5RGFyazwvaXRlbT4KKyAgICAgICAgPGl0ZW0gbmFtZT0iY29sb3JBY2NlbnQiPkBjb2xvci9jb2xvckFjY2VudDwvaXRlbT4KKyAgICA8L3N0eWxlPgorCis8L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvYnVpbGQuZ3JhZGxlIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EwYzdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTo0LjEuMScKKyAgICB9Cit9CisKK2FsbHByb2plY3RzIHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBnb29nbGUoKQorICAgICAgICBqY2VudGVyKCkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS5wcm9wZXJ0aWVzIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTQ0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0IEBACisjIFByb2plY3Qtd2lkZSBHcmFkbGUgc2V0dGluZ3MuCitvcmcuZ3JhZGxlLmp2bWFyZ3M9LVhteDIwNDhtIC1EZmlsZS5lbmNvZGluZz1VVEYtOAorYW5kcm9pZC51c2VBbmRyb2lkWD10cnVlCithbmRyb2lkLmVuYWJsZUpldGlmaWVyPXRydWUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Yjk2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhMTJlYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorI1dlZCBEZWMgMTYgMTA6MDY6NDUgSVNUIDIwMjAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTYuNS1iaW4uemlwCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxldyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxldwpAQCAtMCwwICsxLDE3MiBAQAorIyEvdXNyL2Jpbi9lbnYgc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgKKyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQorIyBSZXNvbHZlIGxpbmtzOiAkMCBtYXkgYmUgYSBsaW5rCitQUkc9IiQwIgorIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLgord2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgICAgbHM9YGxzIC1sZCAiJFBSRyJgCisgICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIFBSRz0iJGxpbmsiCisgICAgZWxzZQorICAgICAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiCisgICAgZmkKK2RvbmUKK1NBVkVEPSJgcHdkYCIKK2NkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsCitBUFBfSE9NRT0iYHB3ZCAtUGAiCitjZCAiJFNBVkVEIiA+L2Rldi9udWxsCisKK0FQUF9OQU1FPSJHcmFkbGUiCitBUFBfQkFTRV9OQU1FPWBiYXNlbmFtZSAiJDAiYAorCisjIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0LgorREVGQVVMVF9KVk1fT1BUUz0iIgorCisjIFVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUsIG9yIHNldCBNQVhfRkQgIT0gLTEgdG8gdXNlIHRoYXQgdmFsdWUuCitNQVhfRkQ9Im1heGltdW0iCisKK3dhcm4gKCkgeworICAgIGVjaG8gIiQqIgorfQorCitkaWUgKCkgeworICAgIGVjaG8KKyAgICBlY2hvICIkKiIKKyAgICBlY2hvCisgICAgZXhpdCAxCit9CisKKyMgT1Mgc3BlY2lmaWMgc3VwcG9ydCAobXVzdCBiZSAndHJ1ZScgb3IgJ2ZhbHNlJykuCitjeWd3aW49ZmFsc2UKK21zeXM9ZmFsc2UKK2Rhcndpbj1mYWxzZQorbm9uc3RvcD1mYWxzZQorY2FzZSAiYHVuYW1lYCIgaW4KKyAgQ1lHV0lOKiApCisgICAgY3lnd2luPXRydWUKKyAgICA7OworICBEYXJ3aW4qICkKKyAgICBkYXJ3aW49dHJ1ZQorICAgIDs7CisgIE1JTkdXKiApCisgICAgbXN5cz10cnVlCisgICAgOzsKKyAgTk9OU1RPUCogKQorICAgIG5vbnN0b3A9dHJ1ZQorICAgIDs7Citlc2FjCisKK0NMQVNTUEFUSD0kQVBQX0hPTUUvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCisKKyMgRGV0ZXJtaW5lIHRoZSBKYXZhIGNvbW1hbmQgdG8gdXNlIHRvIHN0YXJ0IHRoZSBKVk0uCitpZiBbIC1uICIkSkFWQV9IT01FIiBdIDsgdGhlbgorICAgIGlmIFsgLXggIiRKQVZBX0hPTUUvanJlL3NoL2phdmEiIF0gOyB0aGVuCisgICAgICAgICMgSUJNJ3MgSkRLIG9uIEFJWCB1c2VzIHN0cmFuZ2UgbG9jYXRpb25zIGZvciB0aGUgZXhlY3V0YWJsZXMKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIKKyAgICBlbHNlCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvYmluL2phdmEiCisgICAgZmkKKyAgICBpZiBbICEgLXggIiRKQVZBQ01EIiBdIDsgdGhlbgorICAgICAgICBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAkSkFWQV9IT01FCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCisgICAgZmkKK2Vsc2UKKyAgICBKQVZBQ01EPSJqYXZhIgorICAgIHdoaWNoIGphdmEgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCisKK1BsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4iCitmaQorCisjIEluY3JlYXNlIHRoZSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvcnMgaWYgd2UgY2FuLgoraWYgWyAiJGN5Z3dpbiIgPSAiZmFsc2UiIC1hICIkZGFyd2luIiA9ICJmYWxzZSIgLWEgIiRub25zdG9wIiA9ICJmYWxzZSIgXSA7IHRoZW4KKyAgICBNQVhfRkRfTElNSVQ9YHVsaW1pdCAtSCAtbmAKKyAgICBpZiBbICQ/IC1lcSAwIF0gOyB0aGVuCisgICAgICAgIGlmIFsgIiRNQVhfRkQiID0gIm1heGltdW0iIC1vICIkTUFYX0ZEIiA9ICJtYXgiIF0gOyB0aGVuCisgICAgICAgICAgICBNQVhfRkQ9IiRNQVhfRkRfTElNSVQiCisgICAgICAgIGZpCisgICAgICAgIHVsaW1pdCAtbiAkTUFYX0ZECisgICAgICAgIGlmIFsgJD8gLW5lIDAgXSA7IHRoZW4KKyAgICAgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBzZXQgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkQiCisgICAgICAgIGZpCisgICAgZWxzZQorICAgICAgICB3YXJuICJDb3VsZCBub3QgcXVlcnkgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IgbGltaXQ6ICRNQVhfRkRfTElNSVQiCisgICAgZmkKK2ZpCisKKyMgRm9yIERhcndpbiwgYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSBob3cgdGhlIGFwcGxpY2F0aW9uIGFwcGVhcnMgaW4gdGhlIGRvY2sKK2lmICRkYXJ3aW47IHRoZW4KKyAgICBHUkFETEVfT1BUUz0iJEdSQURMRV9PUFRTIFwiLVhkb2NrOm5hbWU9JEFQUF9OQU1FXCIgXCItWGRvY2s6aWNvbj0kQVBQX0hPTUUvbWVkaWEvZ3JhZGxlLmljbnNcIiIKK2ZpCisKKyMgRm9yIEN5Z3dpbiwgc3dpdGNoIHBhdGhzIHRvIFdpbmRvd3MgZm9ybWF0IGJlZm9yZSBydW5uaW5nIGphdmEKK2lmICRjeWd3aW4gOyB0aGVuCisgICAgQVBQX0hPTUU9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRBUFBfSE9NRSJgCisgICAgQ0xBU1NQQVRIPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQ0xBU1NQQVRIImAKKyAgICBKQVZBQ01EPWBjeWdwYXRoIC0tdW5peCAiJEpBVkFDTUQiYAorCisgICAgIyBXZSBidWlsZCB0aGUgcGF0dGVybiBmb3IgYXJndW1lbnRzIHRvIGJlIGNvbnZlcnRlZCB2aWEgY3lncGF0aAorICAgIFJPT1RESVJTUkFXPWBmaW5kIC1MIC8gLW1heGRlcHRoIDEgLW1pbmRlcHRoIDEgLXR5cGUgZCAyPi9kZXYvbnVsbGAKKyAgICBTRVA9IiIKKyAgICBmb3IgZGlyIGluICRST09URElSU1JBVyA7IGRvCisgICAgICAgIFJPT1RESVJTPSIkUk9PVERJUlMkU0VQJGRpciIKKyAgICAgICAgU0VQPSJ8IgorICAgIGRvbmUKKyAgICBPVVJDWUdQQVRURVJOPSIoXigkUk9PVERJUlMpKSIKKyAgICAjIEFkZCBhIHVzZXItZGVmaW5lZCBwYXR0ZXJuIHRvIHRoZSBjeWdwYXRoIGFyZ3VtZW50cworICAgIGlmIFsgIiRHUkFETEVfQ1lHUEFUVEVSTiIgIT0gIiIgXSA7IHRoZW4KKyAgICAgICAgT1VSQ1lHUEFUVEVSTj0iJE9VUkNZR1BBVFRFUk58KCRHUkFETEVfQ1lHUEFUVEVSTikiCisgICAgZmkKKyAgICAjIE5vdyBjb252ZXJ0IHRoZSBhcmd1bWVudHMgLSBrbHVkZ2UgdG8gbGltaXQgb3Vyc2VsdmVzIHRvIC9iaW4vc2gKKyAgICBpPTAKKyAgICBmb3IgYXJnIGluICIkQCIgOyBkbworICAgICAgICBDSEVDSz1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIiRPVVJDWUdQQVRURVJOIiAtYAorICAgICAgICBDSEVDSzI9YGVjaG8gIiRhcmcifGVncmVwIC1jICJeLSJgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjIERldGVybWluZSBpZiBhbiBvcHRpb24KKworICAgICAgICBpZiBbICRDSEVDSyAtbmUgMCBdICYmIFsgJENIRUNLMiAtZXEgMCBdIDsgdGhlbiAgICAgICAgICAgICAgICAgICAgIyMjIEFkZGVkIGEgY29uZGl0aW9uCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9YGN5Z3BhdGggLS1wYXRoIC0taWdub3JlIC0tbWl4ZWQgIiRhcmciYAorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsIGBlY2hvIGFyZ3MkaWA9IlwiJGFyZ1wiIgorICAgICAgICBmaQorICAgICAgICBpPSQoKGkrMSkpCisgICAgZG9uZQorICAgIGNhc2UgJGkgaW4KKyAgICAgICAgKDApIHNldCAtLSA7OworICAgICAgICAoMSkgc2V0IC0tICIkYXJnczAiIDs7CisgICAgICAgICgyKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgOzsKKyAgICAgICAgKDMpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiA7OworICAgICAgICAoNCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiIDs7CisgICAgICAgICg1KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgOzsKKyAgICAgICAgKDYpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiA7OworICAgICAgICAoNykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiIDs7CisgICAgICAgICg4KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgOzsKKyAgICAgICAgKDkpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiAiJGFyZ3M4IiA7OworICAgIGVzYWMKK2ZpCisKKyMgRXNjYXBlIGFwcGxpY2F0aW9uIGFyZ3MKK3NhdmUgKCkgeworICAgIGZvciBpIGRvIHByaW50ZiAlc1xcbiAiJGkiIHwgc2VkICJzLycvJ1xcXFwnJy9nOzFzL14vJy87XCRzL1wkLycgXFxcXC8iIDsgZG9uZQorICAgIGVjaG8gIiAiCit9CitBUFBfQVJHUz0kKHNhdmUgIiRAIikKKworIyBDb2xsZWN0IGFsbCBhcmd1bWVudHMgZm9yIHRoZSBqYXZhIGNvbW1hbmQsIGZvbGxvd2luZyB0aGUgc2hlbGwgcXVvdGluZyBhbmQgc3Vic3RpdHV0aW9uIHJ1bGVzCitldmFsIHNldCAtLSAkREVGQVVMVF9KVk1fT1BUUyAkSkFWQV9PUFRTICRHUkFETEVfT1BUUyAiXCItRG9yZy5ncmFkbGUuYXBwbmFtZT0kQVBQX0JBU0VfTkFNRVwiIiAtY2xhc3NwYXRoICJcIiRDTEFTU1BBVEhcIiIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICIkQVBQX0FSR1MiCisKKyMgYnkgZGVmYXVsdCB3ZSBzaG91bGQgYmUgaW4gdGhlIGNvcnJlY3QgcHJvamVjdCBkaXIsIGJ1dCB3aGVuIHJ1biBmcm9tIEZpbmRlciBvbiBNYWMsIHRoZSBjd2QgaXMgd3JvbmcKK2lmIFsgIiQodW5hbWUpIiA9ICJEYXJ3aW4iIF0gJiYgWyAiJEhPTUUiID0gIiRQV0QiIF07IHRoZW4KKyAgY2QgIiQoZGlybmFtZSAiJDAiKSIKK2ZpCisKK2V4ZWMgIiRKQVZBQ01EIiAiJEAiCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxldy5iYXQgYi9tZWRpYS90ZXN0cy9TYW1wbGVWaWRlb0VuY29kZXIvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9ncmFkbGV3LmJhdApAQCAtMCwwICsxLDg0IEBACitAaWYgIiVERUJVRyUiID09ICIiIEBlY2hvIG9mZgorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQHJlbQorQHJlbSAgR3JhZGxlIHN0YXJ0dXAgc2NyaXB0IGZvciBXaW5kb3dzCitAcmVtCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwKKworc2V0IERJUk5BTUU9JX5kcDAKK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4KK3NldCBBUFBfQkFTRV9OQU1FPSV+bjAKK3NldCBBUFBfSE9NRT0lRElSTkFNRSUKKworQHJlbSBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK3NldCBERUZBVUxUX0pWTV9PUFRTPQorCitAcmVtIEZpbmQgamF2YS5leGUKK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUKKworc2V0IEpBVkFfRVhFPWphdmEuZXhlCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmZpbmRKYXZhRnJvbUphdmFIb21lCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lCitzZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlCisKK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlCitlY2hvLgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KKworZ290byBmYWlsCisKKzppbml0CitAcmVtIEdldCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBoYW5kbGluZyBXaW5kb3dzIHZhcmlhbnRzCisKK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzCisKKzp3aW45eE1FX2FyZ3MKK0ByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCitzZXQgQ01EX0xJTkVfQVJHUz0KK3NldCBfU0tJUD0yCisKKzp3aW45eE1FX2FyZ3Nfc2x1cnAKK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlCisKK3NldCBDTURfTElORV9BUkdTPSUqCisKKzpleGVjdXRlCitAcmVtIFNldHVwIHRoZSBjb21tYW5kIGxpbmUKKworc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcgorCitAcmVtIEV4ZWN1dGUgR3JhZGxlCisiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUKKworOmVuZAorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJUVSUk9STEVWRUwlIj09IjAiIGdvdG8gbWFpbkVuZAorCis6ZmFpbAorcmVtIFNldCB2YXJpYWJsZSBHUkFETEVfRVhJVF9DT05TT0xFIGlmIHlvdSBuZWVkIHRoZSBfc2NyaXB0XyByZXR1cm4gY29kZSBpbnN0ZWFkIG9mCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSEKK2lmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxCitleGl0IC9iIDEKKworOm1haW5FbmQKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIGVuZGxvY2FsCisKKzpvbWVnYQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvU2FtcGxlVmlkZW9FbmNvZGVyL3NldHRpbmdzLmdyYWRsZSBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzYzNhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL1NhbXBsZVZpZGVvRW5jb2Rlci9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwyIEBACitpbmNsdWRlICc6YXBwJworcm9vdFByb2plY3QubmFtZSA9ICJTYW1wbGVWaWRlb0VuY29kZXIiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icAppbmRleCBkZTQwOGRkLi44NTAzYTljIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogc3ViZGlycyA9IFsKICAgICAic3JjIiwKICAgICAidGVzdHMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCmluZGV4IGQ4MGQ5YTUuLjJlMDZkYTUgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGFuZHJvaWRfdGVzdCB7CiAgICAgbmFtZTogIk1lZGlhQmVuY2htYXJrVGVzdCIsCiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhCmluZGV4IDQ4ZTE0MjIuLjQyMDI3MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5Lk5hdGl2ZTsKIGltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5TdGF0czsKIAoraW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CkBAIC01Nyw0MCArNTgsODcgQEAKIHB1YmxpYyBjbGFzcyBFbmNvZGVyVGVzdCB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29udGV4dCBtQ29udGV4dCA9CiAgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1GaWxlRGlyUGF0aCA9IG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiLyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1JbnB1dEZpbGVQYXRoID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmlucHV0X2ZpbGVfcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1PdXRwdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5vdXRwdXRfZmlsZV9wYXRoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVN0YXRzRmlsZSA9CiAgICAgICAgICAgICBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpICsgIi9FbmNvZGVyLiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuY3N2IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkVuY29kZXJUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFUl9URVNUX1RJTUVPVVRfTVMgPSAxMjAwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gV1JJVEVfT1VUUFVUID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRVJfVEVTVF9USU1FT1VUX01TID0gMTIwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFID0gMjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9NSU5fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFID0gMTI4MDAwIC8qIDEyOCBLYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGludCBtQ29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlIG1EZWNvZGVkRmlsZVFjaWY7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVGdWxsSGQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVBdWRpbzsKICAgICBwcml2YXRlIFN0cmluZyBtSW5wdXRGaWxlOworICAgIHByaXZhdGUgU3RyaW5nIG1NaW1lOworICAgIHByaXZhdGUgaW50IG1CaXRSYXRlOworICAgIHByaXZhdGUgaW50IG1JRnJhbWVJbnRlcnZhbDsKKyAgICBwcml2YXRlIGludCBtV2lkdGg7CisgICAgcHJpdmF0ZSBpbnQgbUhlaWdodDsKKyAgICBwcml2YXRlIGludCBtUHJvZmlsZTsKKyAgICBwcml2YXRlIGludCBtTGV2ZWw7CisgICAgcHJpdmF0ZSBpbnQgbVNhbXBsZVJhdGU7CisgICAgcHJpdmF0ZSBpbnQgbU51bUNoYW5uZWw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9GVUxMSERfSU5QVVQgPSAiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX1FDSUZfSU5QVVQgPSAiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfQVVESU9fSU5QVVQgPSAiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0ZVTExIRF9VTlBBQ0tFRCA9ICJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS55dXYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfUUNJRl9VTlBBQ0tFRCA9ICJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX21wZWc0Lnl1diI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9BVURJT19VTlBBQ0tFRCA9ICJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLnJhdyI7CiAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBpbnB1dEZpbGVzKCkgewogICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKICAgICAgICAgICAgICAgICAvLyBBdWRpbyBUZXN0Ci0gICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0In0sCi0gICAgICAgICAgICAgICAgeyJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl8zMHNlYy4zZ3AifSwKLSAgICAgICAgICAgICAgICB7ImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy4zZ3AifSwKLSAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfMzBzZWMubXA0In0sCi0gICAgICAgICAgICAgICAgeyJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0ifSwKKyAgICAgICAgICAgICAgICAvLyBQYXJhbWV0ZXJzOiBGaWxlbmFtZSwgbWltZVR5cGUsIGJpdHJhdGUsIHdpZHRoLCBoZWlnaHQsIGlGcmFtZUludGVydmFsLAorICAgICAgICAgICAgICAgIC8vIHByb2ZpbGUsIGxldmVsLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19BQUMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDEwMCwgMn0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQU1SX05CLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgODAwMCwgMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQU1SX1dCLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTYwMDAsIDF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0ZMQUMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0NDEwMCwgMn0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fT1BVUywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQ4MDAwLCAyfSwKKwogICAgICAgICAgICAgICAgIC8vIFZpZGVvIFRlc3QKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOS53ZWJtIn0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCJ9fSk7CisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogRmlsZW5hbWUsIG1pbWVUeXBlLCBiaXRyYXRlLCB3aWR0aCwgaGVpZ2h0LCBpRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAvLyBwcm9maWxlLCBsZXZlbCwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX1ZQOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0FWQywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX1ZJREVPX0JJVF9SQVRFLCAxOTIwLCAxMDgwLCAxLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgICAgICAgICAge0RFQ09ERV9GVUxMSERfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDksCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfUUNJRl9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fTVBFRzQsIEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDE0NCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfUUNJRl9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fSDI2MywgRU5DT0RFX01JTl9WSURFT19CSVRfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwgMTQ0LCAxLCAtMSwgLTEsIC0xLCAtMX19KTsKICAgICB9CiAKLSAgICBwdWJsaWMgRW5jb2RlclRlc3QoU3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKLSAgICAgICAgdGhpcy5tSW5wdXRGaWxlID0gaW5wdXRGaWxlTmFtZTsKKyAgICBwdWJsaWMgRW5jb2RlclRlc3QoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgbWltZSwgaW50IGJpdHJhdGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lSW50ZXJ2YWwsIGludCBwcm9maWxlLCBpbnQgbGV2ZWwsIGludCBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbENvdW50KSB7CisgICAgICAgIHRoaXMubUlucHV0RmlsZSA9IGZpbGVuYW1lOworICAgICAgICB0aGlzLm1NaW1lID0gbWltZTsKKyAgICAgICAgdGhpcy5tQml0UmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIHRoaXMubUlGcmFtZUludGVydmFsID0gZnJhbWVJbnRlcnZhbDsKKyAgICAgICAgdGhpcy5tV2lkdGggPSB3aWR0aDsKKyAgICAgICAgdGhpcy5tSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB0aGlzLm1Qcm9maWxlID0gcHJvZmlsZTsKKyAgICAgICAgdGhpcy5tTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgdGhpcy5tU2FtcGxlUmF0ZSA9IHNhbXBsZXJhdGU7CisgICAgICAgIHRoaXMubU51bUNoYW5uZWwgPSBjaGFubmVsQ291bnQ7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCkBAIC0xMDEsMzMgKzE0OSwzNiBAQAogICAgICAgICBMb2cuZChUQUcsICJTYXZpbmcgQmVuY2htYXJrIHJlc3VsdHMgaW46ICIgKyBtU3RhdHNGaWxlKTsKICAgICB9CiAKLSAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhdHVzOwotICAgICAgICBpbnQgZnJhbWVTaXplOwotICAgICAgICAvL1BhcmFtZXRlcnMgZm9yIHZpZGVvCi0gICAgICAgIGludCB3aWR0aCA9IDA7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpbnQgcHJvZmlsZSA9IDA7Ci0gICAgICAgIGludCBsZXZlbCA9IDA7Ci0gICAgICAgIGludCBmcmFtZVJhdGUgPSAwOworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmVwYXJlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCi0gICAgICAgIC8vUGFyYW1ldGVycyBmb3IgYXVkaW8KLSAgICAgICAgaW50IGJpdFJhdGUgPSAwOwotICAgICAgICBpbnQgc2FtcGxlUmF0ZSA9IDA7Ci0gICAgICAgIGludCBudW1DaGFubmVscyA9IDA7Ci0gICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgbURlY29kZWRGaWxlRnVsbEhkID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgREVDT0RFX0ZVTExIRF9VTlBBQ0tFRCk7CisgICAgICAgIGludCBzdGF0dXMgPSBkZWNvZGVGaWxlKG1JbnB1dEZpbGVQYXRoICsgREVDT0RFX0ZVTExIRF9JTlBVVCwgbURlY29kZWRGaWxlRnVsbEhkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMsIDAsIHN0YXR1cyk7CisKKyAgICAgICAgbURlY29kZWRGaWxlUWNpZiA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIERFQ09ERV9RQ0lGX1VOUEFDS0VEKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9RQ0lGX0lOUFVULCBtRGVjb2RlZEZpbGVRY2lmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMsIDAsIHN0YXR1cyk7CisKKyAgICAgICAgbURlY29kZWRGaWxlQXVkaW8gPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBERUNPREVfQVVESU9fVU5QQUNLRUQpOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVGaWxlKG1JbnB1dEZpbGVQYXRoICsgREVDT0RFX0FVRElPX0lOUFVULCBtRGVjb2RlZEZpbGVBdWRpbyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBkZWNvZGVGaWxlKFN0cmluZyBpbnB1dEZpbGVOYW1lLCBGaWxlIG91dHB1dERlY29kZUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBzdGF0dXMgPSAtMTsKKyAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShpbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAiICsgaW5wdXRGaWxlTmFtZSwgaW5wdXRGaWxlLmV4aXN0cygpKTsKICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKICAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBmaWxlSW5wdXQuZ2V0RkQoKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBkZWNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXREZWNvZGVGaWxlKTsKKwogICAgICAgICBFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOwogICAgICAgICBpbnQgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAodHJhY2tDb3VudCA+IDApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgdGhlIGdpdmVuIGlucHV0IGZpbGUiLCAodHJhY2tDb3VudCA+IDApKTsKICAgICAgICAgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+IGlucHV0QnVmZmVyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIEFycmF5TGlzdDxNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGZyYW1lSW5mbyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgewotICAgICAgICAgICAgaW50IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CiAgICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQoY3VycmVudFRyYWNrKTsKICAgICAgICAgICAgIC8vIEdldCBzYW1wbGVzIGZyb20gZXh0cmFjdG9yCkBAIC0xNDYsMTYzICsxOTcsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSW5mby5wcmVzZW50YXRpb25UaW1lVXMgKyAiIHNpemUgPSAiICsgYnVmSW5mby5zaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlIChzYW1wbGVTaXplID4gMCk7Ci0gICAgICAgICAgICBpbnQgdGlkID0gYW5kcm9pZC5vcy5Qcm9jZXNzLm15VGlkKCk7Ci0gICAgICAgICAgICBGaWxlIGRlY29kZWRGaWxlID0gbmV3IEZpbGUobUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvZGVjb2Rlcl8iICsgdGlkICsgIi5vdXQiKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZGVjb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVjb2RlZEZpbGUpOwogICAgICAgICAgICAgRGVjb2RlciBkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKICAgICAgICAgICAgIGRlY29kZXIuc2V0dXBEZWNvZGVyKGRlY29kZU91dHB1dFN0cmVhbSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBkZWNvZGVyLmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBmYWxzZSwgZm9ybWF0LCAiIik7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAwLAotICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwogICAgICAgICAgICAgTWVkaWFGb3JtYXQgZGVjb2RlckZvcm1hdCA9IGRlY29kZXIuZ2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKSkgeworICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlY29kZXIuZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgIGV4dHJhY3Rvci51bnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5jbGVhcigpOwogICAgICAgICAgICAgZnJhbWVJbmZvLmNsZWFyKCk7Ci0gICAgICAgICAgICBpZiAoZGVjb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIHRydWUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSArICIgdHJhY2sgOiAiICsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrICsgIiBtaW1lOiAiICsgbWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKLSAgICAgICAgICAgIEJvb2xlYW5bXSBlbmNvZGVNb2RlID0ge3RydWUsIGZhbHNlfTsKLSAgICAgICAgICAgIC8qIEVuY29kaW5nIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0ICovCi0gICAgICAgICAgICBmb3IgKEJvb2xlYW4gYXN5bmNNb2RlIDogZW5jb2RlTW9kZSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZW5jb2RlT3V0cHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRFbmNvZGVGaWxlID0gbmV3IEZpbGUobU91dHB1dEZpbGVQYXRoICsgImVuY29kZXIub3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0RW5jb2RlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUiICsgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS5kZWxldGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIGZpbGUgdG8gd3JpdGUgZW5jb2RlciBvdXRwdXQ6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksIG91dEVuY29kZUZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEVuY29kZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgcmF3RmlsZSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGZpbGUgdG8gd3JpdGUgZGVjb2RlZCBvdXRwdXQiLCByYXdGaWxlLmV4aXN0cygpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQYXRoIG9mIGRlY29kZWQgaW5wdXQgZmlsZTogIiArIHJhd0ZpbGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGVsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmF3RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9XSURUSCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZVJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0UmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuY29udGFpbnMoInZpZGVvLzNncHAiKSB8fCBtaW1lLmNvbnRhaW5zKCJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9NSU5fQklUX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfU0FNUExFX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ0hBTk5FTF9DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLypTZXR1cCBFbmNvZGUgRm9ybWF0Ki8KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1pbWUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUsIHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMLCBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULCBjb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVBdWRpb0Zvcm1hdChtaW1lLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gNDA5NjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBFbmNvZGVyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHVwRW5jb2RlcihlbmNvZGVPdXRwdXRTdHJlYW0sIGVsZVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXIuZW5jb2RlKGNvZGVjTmFtZSwgZW5jb2RlRm9ybWF0LCBtaW1lLCBmcmFtZVJhdGUsIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBhc3luY01vZGUpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLmRlSW5pdEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJmaWxlOiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiICsgbUlucHV0RmlsZSwgMCwgc3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5kdW1wU3RhdGlzdGljcyhtSW5wdXRGaWxlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuZ2V0Q2xpcER1cmF0aW9uKCksIG1TdGF0c0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJFbmNvZGluZyBjb21wbGV0ZSBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHdpdGggY29kZWM6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZm9yIGFTeW5jTW9kZSA9ICIgKyBhc3luY01vZGUpOwotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc2V0RW5jb2RlcigpOwotICAgICAgICAgICAgICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9DbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCi0gICAgICAgICAgICBpZiAoZGVjb2RlZEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgZGVjb2RlZEZpbGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBleHRyYWN0b3IuZGVpbml0RXh0cmFjdG9yKCk7CiAgICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlRW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAotICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIGludCB0aWQgPSBhbmRyb2lkLm9zLlByb2Nlc3MubXlUaWQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1EZWNvZGVkRmlsZSA9IG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0IjsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKLSAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBmaWxlSW5wdXQuZ2V0RkQoKTsKLSAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKLSAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciBmaWxlOiAiLCB0cmFja0NvdW50ID4gMCk7Ci0gICAgICAgIGZvciAoaW50IGN1cnJlbnRUcmFjayA9IDA7IGN1cnJlbnRUcmFjayA8IHRyYWNrQ291bnQ7IGN1cnJlbnRUcmFjaysrKSB7Ci0gICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKLSAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQoY3VycmVudFRyYWNrKTsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIHRydWUpOwotICAgICAgICAgICAgLy8gRW5jb2RpbmcgdGhlIGRlY29kZXIncyBvdXRwdXQKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpbnQgZnJhbWVTaXplOworCisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobU1pbWUsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIG1pbWV0eXBlOiAiICsgbU1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7CisgICAgICAgIEJvb2xlYW5bXSBlbmNvZGVNb2RlID0ge3RydWUsIGZhbHNlfTsKKyAgICAgICAgLy8gRW5jb2RpbmcgdGhlIGRlY29kZWQgaW5wdXQgZmlsZQorICAgICAgICBmb3IgKEJvb2xlYW4gYXN5bmNNb2RlIDogZW5jb2RlTW9kZSkgewogICAgICAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKLSAgICAgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRW5jb2RlciA9IG5ldyBOYXRpdmUoKTsKLSAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlRW5jb2RlcgotICAgICAgICAgICAgICAgICAgICAgICAgLkVuY29kZShtSW5wdXRGaWxlUGF0aCwgbUlucHV0RmlsZSwgbURlY29kZWRGaWxlLCBtU3RhdHNGaWxlLCBjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZW5jb2RlT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoV1JJVEVfT1VUUFVUKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0RW5jb2RlRmlsZSA9IG5ldyBGaWxlKG1PdXRwdXRGaWxlUGF0aCArICJlbmNvZGVyLm91dCIpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0RW5jb2RlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZXhpc3RpbmcgZmlsZSIgKyBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUuZGVsZXRlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBjcmVhdGUgZmlsZSB0byB3cml0ZSBlbmNvZGVyIG91dHB1dDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLCBvdXRFbmNvZGVGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEVuY29kZUZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlIHJhd0ZpbGUgPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBtSW5wdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgb3BlbiBkZWNvZGVkIGlucHV0IGZpbGUiLCByYXdGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUGF0aCBvZiBkZWNvZGVkIGlucHV0IGZpbGU6ICIgKyByYXdGaWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyYXdGaWxlKTsKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCBFbmNvZGUgRm9ybWF0CisgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlRm9ybWF0OworICAgICAgICAgICAgICAgIGlmIChtTWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1NaW1lLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JX0ZSQU1FX0lOVEVSVkFMLCBtSUZyYW1lSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIG1CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9maWxlICE9IC0xICYmIG1MZXZlbCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUsIG1Qcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwgbUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDQwOTY7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZUF1ZGlvRm9ybWF0KG1NaW1lLCBtU2FtcGxlUmF0ZSwgbU51bUNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIG1CaXRSYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRW5jb2RlciBlbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHVwRW5jb2RlcihlbmNvZGVPdXRwdXRTdHJlYW0sIGVsZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZW5jb2Rlci5lbmNvZGUoY29kZWNOYW1lLCBlbmNvZGVGb3JtYXQsIG1NaW1lLCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIGZyYW1lU2l6ZSwgYXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLmRlSW5pdEVuY29kZXIoKTsKICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAiZmlsZToiICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RmlsZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJtaW1lOiIgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWltZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRSZWZlcmVuY2U7CisgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGlmIChtTWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RmlsZSArICJfIiArIG1XaWR0aCArICJ4IiArIG1IZWlnaHQgKyAiXyIgKyBtQml0UmF0ZSArICJicHMiOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblVzID0gKCgoZWxlU3RyZWFtLmdldENoYW5uZWwoKS5zaXplKCkgKyBmcmFtZVNpemUgLSAxKSAvIGZyYW1lU2l6ZSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUpICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IG1JbnB1dEZpbGUgKyAiXyIgKyBtU2FtcGxlUmF0ZSArICJoel8iICsgbU51bUNoYW5uZWwgKyAiY2hfIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJhdGUgKyAiYnBzIjsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZVN0cmVhbS5nZXRDaGFubmVsKCkuc2l6ZSgpIC8gKG1TYW1wbGVSYXRlICogbU51bUNoYW5uZWwpKSAqIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVuY29kZXIuZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcywgbVN0YXRzRmlsZSk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW5jb2RpbmcgY29tcGxldGUgZm9yIG1pbWU6ICIgKyBtTWltZSArICIgd2l0aCBjb2RlYzogIiArIGNvZGVjTmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBhU3luY01vZGUgPSAiICsgYXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc2V0RW5jb2RlcigpOworICAgICAgICAgICAgICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgRmlsZSBkZWNvZGVkRmlsZSA9IG5ldyBGaWxlKG1EZWNvZGVkRmlsZSk7Ci0gICAgICAgIC8vIENsZWFudXAgdGVtcG9yYXJ5IGlucHV0IGZpbGUKLSAgICAgICAgaWYgKGRlY29kZWRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gZGVsZXRlIC0gIiArIG1EZWNvZGVkRmlsZSwgZGVjb2RlZEZpbGUuZGVsZXRlKCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgLSAiICsgbURlY29kZWRGaWxlKTsKKyAgICB9CisKKyAgICBAVGVzdCh0aW1lb3V0ID0gUEVSX1RFU1RfVElNRU9VVF9NUykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlRW5jb2RlcigpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtTWltZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoIk5vIHN1aXRhYmxlIGNvZGVjcyBmb3VuZCBmb3IgbWltZXR5cGU6ICIgKyBtTWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKKyAgICAgICAgICAgIE5hdGl2ZSBuYXRpdmVFbmNvZGVyID0gbmV3IE5hdGl2ZSgpOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IG5hdGl2ZUVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgLkVuY29kZShtRmlsZURpclBhdGgsIG1JbnB1dEZpbGUsIG1TdGF0c0ZpbGUsIGNvZGVjTmFtZSwgbU1pbWUsIG1CaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2xvckZvcm1hdCwgbUlGcmFtZUludGVydmFsLCBtV2lkdGgsIG1IZWlnaHQsIG1Qcm9maWxlLCBtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAibWltZToiICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgbU1pbWUsIDAsIHN0YXR1cyk7CiAgICAgICAgIH0KLSAgICAgICAgZmlsZUlucHV0LmNsb3NlKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGVjb2RlZEZpbGVzKCkgeworICAgICAgICBpZiAobURlY29kZWRGaWxlRnVsbEhkLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlRnVsbEhkLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkRmlsZUZ1bGxIZC5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlRnVsbEhkLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVjb2RlZEZpbGVRY2lmLmV4aXN0cygpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlUWNpZi50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVRY2lmLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVRY2lmLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtRGVjb2RlZEZpbGVBdWRpby5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUF1ZGlvLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1EZWNvZGVkRmlsZUF1ZGlvLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVBdWRpby50b1N0cmluZygpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9BbmRyb2lkLmJwCmluZGV4IDNlNWU0YzguLmFmOTI0MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3RfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2puaSIsCiAgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKaW5kZXggMTI3N2M4Yi4uMmY2NThlMyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRW5jb2Rlci5jcHAKQEAgLTMwLDE4OSArMzAsODEgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogCiBjb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFID0gMjU7Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKLWNvbnN0ZXhwciBpbnQzMl90IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfTUlOX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOwogCiBleHRlcm4gIkMiIEpOSUVYUE9SVCBpbnQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX21lZGlhX2JlbmNobWFya19saWJyYXJ5X05hdGl2ZV9FbmNvZGUoCi0gICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgakZpbGVQYXRoLCBqc3RyaW5nIGpGaWxlTmFtZSwganN0cmluZyBqT3V0RmlsZVBhdGgsCi0gICAgICAgIGpzdHJpbmcgalN0YXRzRmlsZSwganN0cmluZyBqQ29kZWNOYW1lKSB7CisgICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgakZpbGVQYXRoLCBqc3RyaW5nIGpGaWxlTmFtZSwganN0cmluZyBqU3RhdHNGaWxlLAorICAgICAgICBqc3RyaW5nIGpDb2RlY05hbWUsIGpzdHJpbmcgak1pbWUsIGppbnQgakJpdFJhdGUsIGppbnQgakNvbG9yRm9ybWF0LCBqaW50IGpGcmFtZUludGVydmFsLAorICAgICAgICBqaW50IGpXaWR0aCwgamludCBqSGVpZ2h0LCBqaW50IGpQcm9maWxlLCBqaW50IGpMZXZlbCwgamludCBqU2FtcGxlUmF0ZSwKKyAgICAgICAgamludCBqTnVtQ2hhbm5lbHMpIHsKKyAgICBVTlVTRUQodGhpeik7CiAgICAgY29uc3QgY2hhciAqZmlsZVBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgbnVsbHB0cik7CiAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgbnVsbHB0cik7Ci0gICAgc3RyaW5nIHNGaWxlUGF0aCA9IHN0cmluZyhmaWxlUGF0aCkgKyBzdHJpbmcoZmlsZU5hbWUpOwotICAgIFVOVVNFRCh0aGl6KTsKLSAgICBGSUxFICppbnB1dEZwID0gZm9wZW4oc0ZpbGVQYXRoLmNfc3RyKCksICJyYiIpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOwotICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgZmlsZVBhdGgpOwotICAgIGlmICghaW5wdXRGcCkgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZyIpOworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKKyAgICBjb25zdCBjaGFyICpjb2RlY05hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIG51bGxwdHIpOworICAgIHN0cmluZyBzQ29kZWNOYW1lID0gc3RyaW5nKGNvZGVjTmFtZSk7CisgICAgY29uc3QgY2hhciAqbWltZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoak1pbWUsIG51bGxwdHIpOworCisgICAgaWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZSwgaWZzdHJlYW06OmJpbmFyeSB8IGlmc3RyZWFtOjphdGUpOworICAgIGlmICghZWxlU3RyZWFtLmlzX29wZW4oKSkgeworICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciByZWFkaW5nISIsIGZpbGVOYW1lKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBmaWxlTmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBEZWNvZGVyICpkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKLSAgICBFeHRyYWN0b3IgKmV4dHJhY3RvciA9IGRlY29kZXItPmdldEV4dHJhY3RvcigpOwotICAgIGlmICghZXh0cmFjdG9yKSB7Ci0gICAgICAgIEFMT0dFKCJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgYm9vbCBhc3luY01vZGVbMl0gPSB7dHJ1ZSwgZmFsc2V9OworICAgIGZvciAoYm9vbCBtb2RlIDogYXN5bmNNb2RlKSB7CisgICAgICAgIHNpemVfdCBlbGVTaXplID0gZWxlU3RyZWFtLnRlbGxnKCk7CisgICAgICAgIGVsZVN0cmVhbS5zZWVrZygwLCBpZnN0cmVhbTo6YmVnKTsKIAotICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCi0gICAgc3RydWN0IHN0YXQgYnVmOwotICAgIHN0YXQoc0ZpbGVQYXRoLmNfc3RyKCksICZidWYpOwotICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOwotICAgIGlmIChmaWxlU2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7Ci0gICAgICAgIEFMT0dFKCJGaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1heGltdW0gYnVmZmVyIHNpemUiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOwotICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOwotICAgIGlmICh0cmFja0NvdW50IDw9IDApIHsKLSAgICAgICAgQUxPR0UoImluaXRFeHRyYWN0b3IgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgICAgIC8vIFNldCBlbmNvZGVyIHBhcmFtcworICAgICAgICBlbmNQYXJhbWV0ZXIgZW5jUGFyYW1zOworICAgICAgICBlbmNQYXJhbXMud2lkdGggPSBqV2lkdGg7CisgICAgICAgIGVuY1BhcmFtcy5oZWlnaHQgPSBqSGVpZ2h0OworICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGpCaXRSYXRlOworICAgICAgICBlbmNQYXJhbXMuaUZyYW1lSW50ZXJ2YWwgPSBqRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgZW5jUGFyYW1zLnNhbXBsZVJhdGUgPSBqU2FtcGxlUmF0ZTsKKyAgICAgICAgZW5jUGFyYW1zLm51bUNoYW5uZWxzID0gak51bUNoYW5uZWxzOworICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKKyAgICAgICAgZW5jUGFyYW1zLmNvbG9yRm9ybWF0ID0gakNvbG9yRm9ybWF0OworICAgICAgICBlbmNQYXJhbXMucHJvZmlsZSA9IGpQcm9maWxlOworICAgICAgICBlbmNQYXJhbXMubGV2ZWwgPSBqTGV2ZWw7CiAKLSAgICBmb3IgKGludCBjdXJUcmFjayA9IDA7IGN1clRyYWNrIDwgdHJhY2tDb3VudDsgY3VyVHJhY2srKykgewotICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3Rvci0+c2V0dXBUcmFja0Zvcm1hdChjdXJUcmFjayk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYWNrIEZvcm1hdCBpbnZhbGlkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7Ci0gICAgICAgIGlmICghaW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOwotICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKLSAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOwotCi0gICAgICAgIC8vIEdldCBmcmFtZSBkYXRhCi0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBkZWNvZGVyCi0gICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50Iik7Ci0gICAgICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKLSAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7Ci0gICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RmlsZVBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgbnVsbHB0cik7Ci0gICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZVBhdGgsICJ3YiIpOwotICAgICAgICBpZiAob3V0RnAgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3Igd3JpdGluZyEiLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKLSAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CisgICAgICAgIEVuY29kZXIgKmVuY29kZXIgPSBuZXcgRW5jb2RlcigpOworICAgICAgICBlbmNvZGVyLT5zZXR1cEVuY29kZXIoKTsKKyAgICAgICAgYXV0byBzdGF0dXMgPSBlbmNvZGVyLT5lbmNvZGUoc0NvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBtb2RlLCBlbmNQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhciAqPihtaW1lKSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRGVjb2RlIHJldHVybmVkIGVycm9yIik7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGVyIHJldHVybmVkIGVycm9yIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLQotICAgICAgICBBTWVkaWFGb3JtYXQgKmRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBleHRyYWN0b3ItPmdldEZvcm1hdCgpOwotICAgICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwotICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICBBTE9HVigiRW5jb2RpbmcgY29tcGxldGUgd2l0aCBjb2RlYyAlcyBmb3IgYXN5bmNNb2RlID0gJWQiLCBzQ29kZWNOYW1lLmNfc3RyKCksIG1vZGUpOworICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOworICAgICAgICBzdHJpbmcgaW5wdXRSZWZlcmVuY2U7CisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uVXM7CisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIGlucHV0UmVmZXJlbmNlID0gc3RyaW5nKGZpbGVOYW1lKSArICJfIiArIHRvX3N0cmluZyhqV2lkdGgpICsgIngiICsgdG9fc3RyaW5nKGpIZWlnaHQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgdG9fc3RyaW5nKGpCaXRSYXRlKSArICJicHMiOworICAgICAgICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSBqV2lkdGggKiBqSGVpZ2h0ICogMyAvIDI7CisgICAgICAgICAgICBjbGlwRHVyYXRpb25VcyA9CisgICAgICAgICAgICAgICAgICAgICgoKGVsZVNpemUgKyBmcmFtZVNpemUgLSAxKSAvIGZyYW1lU2l6ZSkgLyBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFKSAqIDEwMDAwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IHN0cmluZyhmaWxlTmFtZSkgKyAiXyIgKyB0b19zdHJpbmcoalNhbXBsZVJhdGUpICsgImh6XyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zdHJpbmcoak51bUNoYW5uZWxzKSArICJjaF8iICsgdG9fc3RyaW5nKGpCaXRSYXRlKSArICJicHMiOworICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPSAoZWxlU2l6ZSAvIChqU2FtcGxlUmF0ZSAqIGpOdW1DaGFubmVscykpICogMTAwMDAwMDsKICAgICAgICAgfQotICAgICAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKLSAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwotICAgICAgICBpZiAoIW1pbWUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWZzdHJlYW0gZWxlU3RyZWFtOwotICAgICAgICBlbGVTdHJlYW0ub3BlbihvdXRwdXRGaWxlUGF0aCwgaWZzdHJlYW06OmJpbmFyeSB8IGlmc3RyZWFtOjphdGUpOwotICAgICAgICBpZiAoIWVsZVN0cmVhbS5pc19vcGVuKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyAtIEZpbGUgZmFpbGVkIHRvIG9wZW4gZm9yIHJlYWRpbmchIiwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciAqY29kZWNOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBOVUxMKTsKLSAgICAgICAgY29uc3QgY2hhciAqaW5wdXRSZWZlcmVuY2UgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgbnVsbHB0cik7Ci0gICAgICAgIHN0cmluZyBzQ29kZWNOYW1lID0gc3RyaW5nKGNvZGVjTmFtZSk7Ci0gICAgICAgIHN0cmluZyBzSW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoaW5wdXRSZWZlcmVuY2UpOwotCi0gICAgICAgIGJvb2wgYXN5bmNNb2RlWzJdID0ge3RydWUsIGZhbHNlfTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIHNpemVfdCBlbGVTaXplID0gZWxlU3RyZWFtLnRlbGxnKCk7Ci0gICAgICAgICAgICBlbGVTdHJlYW0uc2Vla2coMCwgaWZzdHJlYW06OmJlZyk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBlbmNvZGVyIHBhcmFtcwotICAgICAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtczsKLSAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmZW5jUGFyYW1zLndpZHRoKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmVuY1BhcmFtcy5oZWlnaHQpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgJmVuY1BhcmFtcy5mcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsICZlbmNQYXJhbXMuYml0cmF0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy5iaXRyYXRlIDw9IDAgfHwgZW5jUGFyYW1zLmZyYW1lUmF0ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5mcmFtZVJhdGUgPSBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAidmlkZW8vM2dwcCIpIHx8ICFzdHJjbXAobWltZSwgInZpZGVvL21wNHYtZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfTUlOX0JJVF9SQVRFIC8qIDYwMCBLYnBzICovOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfREVGQVVMVF9CSVRfUkFURSAvKiA4IE1icHMgKi87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmZW5jUGFyYW1zLnByb2ZpbGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsICZlbmNQYXJhbXMubGV2ZWwpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihkZWNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5jb2xvckZvcm1hdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZlbmNQYXJhbXMuc2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLm51bUNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRW5jb2RlciAqZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5zZXR1cEVuY29kZXIoKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXItPmVuY29kZShzQ29kZWNOYW1lLCBlbGVTdHJlYW0sIGVsZVNpemUsIGFzeW5jTW9kZVtpXSwgZW5jUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbWltZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvZGVyIHJldHVybmVkIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkVuY29kaW5nIGNvbXBsZXRlIHdpdGggY29kZWMgJXMgZm9yIGFzeW5jTW9kZSA9ICVkIiwgc0NvZGVjTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgYXN5bmNNb2RlW2ldKTsKLSAgICAgICAgICAgIGVuY29kZXItPmRlSW5pdENvZGVjKCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOwotICAgICAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3Moc0lucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBzQ29kZWNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzeW5jTW9kZVtpXSA/ICJhc3luYyIgOiAic3luYyIpLCBzdGF0c0ZpbGUpOwotICAgICAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgc3RhdHNGaWxlKTsKLSAgICAgICAgICAgIGVuY29kZXItPnJlc2V0RW5jb2RlcigpOwotICAgICAgICAgICAgZGVsZXRlIGVuY29kZXI7Ci0gICAgICAgICAgICBlbmNvZGVyID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgaWYgKG91dEZwKSB7Ci0gICAgICAgICAgICBmY2xvc2Uob3V0RnApOwotICAgICAgICAgICAgb3V0RnAgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgaW5wdXRSZWZlcmVuY2UpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBjb2RlY05hbWUpOwotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqT3V0RmlsZVBhdGgsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgaWYgKGZvcm1hdCkgewotICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShmb3JtYXQpOwotICAgICAgICAgICAgZm9ybWF0ID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVjb2RlckZvcm1hdCkgewotICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShkZWNvZGVyRm9ybWF0KTsKLSAgICAgICAgICAgIGRlY29kZXJGb3JtYXQgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7Ci0gICAgICAgIGRlY29kZXItPnJlc2V0RGVjb2RlcigpOworICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgY2xpcER1cmF0aW9uVXMsIHNDb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlID8gImFzeW5jIiA6ICJzeW5jIiksIHN0YXRzRmlsZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7CisgICAgICAgIGVuY29kZXItPnJlc2V0RW5jb2RlcigpOworICAgICAgICBkZWxldGUgZW5jb2RlcjsKKyAgICAgICAgZW5jb2RlciA9IG51bGxwdHI7CiAgICAgfQotICAgIGlmIChpbnB1dEZwKSB7Ci0gICAgICAgIGZjbG9zZShpbnB1dEZwKTsKLSAgICAgICAgaW5wdXRGcCA9IG51bGxwdHI7Ci0gICAgfQotICAgIGV4dHJhY3Rvci0+ZGVJbml0RXh0cmFjdG9yKCk7Ci0gICAgZGVsZXRlIGRlY29kZXI7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVQYXRoLCBmaWxlUGF0aCk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBmaWxlTmFtZSk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak1pbWUsIG1pbWUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIGNvZGVjTmFtZSk7CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YQppbmRleCA0NWU1NTc0Li43NTRjZDhlIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEKQEAgLTE3NSwxMCArMTc1LDEwIEBACiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgQE5vbk51bGwgQ29kZWNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBtZWRpYUNvZGVjLnN0b3AoKTsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFDb2RlYy5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvZGVjRXJyb3I6ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb2RlYyBFcnJvcjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsgbUxvY2subm90aWZ5KCk7IH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQppbmRleCAzOGI2MDhhLi4zZTM5NjljIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgcHVibGljIG5hdGl2ZSBpbnQgRGVjb2RlKFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIHN0YXRzRmlsZSwKICAgICAgICAgICAgIFN0cmluZyBjb2RlY05hbWUsIGJvb2xlYW4gYXN5bmNNb2RlKTsKIAotICAgIHB1YmxpYyBuYXRpdmUgaW50IEVuY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBvdXRwdXRGaWxlUGF0aCwKLSAgICAgICAgICAgIFN0cmluZyBzdGF0c0ZpbGUsIFN0cmluZyBjb2RlY05hbWUpOworICAgIHB1YmxpYyBuYXRpdmUgaW50IEVuY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBzdGF0c0ZpbGUsCisgICAgICAgICAgICBTdHJpbmcgY29kZWNOYW1lLCBTdHJpbmcgbWltZSwgaW50IGJpdFJhdGUsIGludCBjb2xvckZvcm1hdCwgaW50IGZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBwcm9maWxlLCBpbnQgbGV2ZWwsIGludCBzYW1wbGVSYXRlLCBpbnQgbnVtQ2hhbm5lbCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZAppbmRleCAwNWZiZTZmLi4wNDdjMjg5IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQKQEAgLTEsNyArMSw3IEBACiAjIEJlbmNobWFyayB0ZXN0cwogCiBCZW5jaG1hcmsgYXBwIGFuYWx5c2VzIHRoZSB0aW1lIHRha2VuIGJ5IE1lZGlhQ29kZWMsIE1lZGlhRXh0cmFjdG9yIGFuZCBNZWRpYU11eGVyIGZvciBnaXZlbiBzZXQgb2YgaW5wdXRzLiBJdCBpcyB1c2VkIHRvIGJlbmNobWFyayB0aGVzZSBtb2R1bGVzIG9uIGFuZHJvaWQgZGV2aWNlcy4KLUJlbmNobWFyayByZXN1bHRzIGFyZSBlbWl0dGVkIHRvIGxvZ2NhdC4KK0JlbmNobWFyayByZXN1bHRzIGFyZSBwdWJsaXNoZWQgYXMgYSBDU1YgcmVwb3J0LgogCiBUaGlzIHBhZ2UgZGVzY3JpYmVzIHN0ZXBzIHRvIHJ1biB0aGUgTkRLIGFuZCBTREsgbGF5ZXIgdGVzdC4KIApAQCAtMTAsMzUgKzEwLDQ5IEBACiBtbW0gZnJhbWV3b3Jrcy9hdi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvCiBgYGAKIAotIyBOREsKLQotVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIG5hdGl2ZSBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLVRoZSBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8KLQotYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KLQotRWcuIGFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KLQotVG8gcnVuIHRoZSBiaW5hcnksIGZvbGxvdyB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGJlbG93IHVuZGVyIGVhY2ggbW9kdWxlLgotCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9vcGVuP2lkPTFnaE1yMTdCQko3bjBwcWJtN29SRWlUTl9NTmVtSlVxeSkKKyMgUmVzb3VyY2VzCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrLnppcCkKIAogRG93bmxvYWQgdGhlIE1lZGlhQmVuY2htYXJrLnppcCBmaWxlLCB1bnppcCBhbmQgcHVzaCBpdCB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCiAKIGBgYAogdW56aXAgTWVkaWFCZW5jaG1hcmsuemlwCi1hZGIgcHVzaCBNZWRpYUJlbmNobWFyayAvZGF0YS9sb2NhbC90bXAKK2FkYiBwdXNoIE1lZGlhQmVuY2htYXJrIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKIAorVGhlIHJlc291cmNlIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIGF0IC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvLiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBsb2NhdGlvbiwgYnV0IHlvdSBoYXZlIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHJlcGxhY2UgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8gd2l0aCB3aGVyZXZlciB5b3UgY2hvc2UgdG8gcHV0IHRoZSBmaWxlcy4KKworIyBOREsgQ0xJIFRlc3RzCitOb3RlOiBbQmVuY2htYXJrIEFwcGxpY2F0aW9uXSgjQmVuY2htYXJrQXBwbGljYXRpb24pIG5vdyBzdXBwb3J0cyBwcm9maWxpbmcgYm90aCBTREsgYW5kIE5ESyBBUElzIGFuZCB0aGF0IGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGJlbmNobWFyayBjb2RlY3MKKworVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIG5hdGl2ZSBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCisKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvLiBGb3IgZXhhbXBsZQorCitgYGAKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCisKK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0LyogL2RhdGEvbG9jYWwvdG1wLy4gRm9yIGV4YW1wbGUKKworYGBgCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC9leHRyYWN0b3JUZXN0L2V4dHJhY3RvclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHJ1biB0aGUgYmluYXJ5LCBmb2xsb3cgdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBiZWxvdyB1bmRlciBlYWNoIG1vZHVsZS4KKwogIyMgRXh0cmFjdG9yCiAKIFRoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVRoZSByZXNvdXJjZSBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBhdCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLy4gWW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24sIGJ1dCB5b3UgaGF2ZSB0byBtb2RpZnkgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB0byByZXBsYWNlIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIHdpdGggd2hlcmV2ZXIgeW91IGNob3NlIHRvIHB1dCB0aGUgZmlsZXMuCi0KLVRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQgdG8gYmUgZ2l2ZW4gZm9yIHRoZSB0ZXN0LgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZXh0cmFjdG9yVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC00Nyw4ICs2MSw2IEBACiAKIFRoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gTkRLLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBleHRyYWN0b3IuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9kZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC01Nyw4ICs2OSw2IEBACiAKIFRoZSB0ZXN0IG11eGVzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBtdXhlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvbXV4ZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTY3LDU1ICs3Nyw4MiBAQAogCiBUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZW5jb2RlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZW5jb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYAogCi0jIFNESworIyA8YSBuYW1lPSJCZW5jaG1hcmtBcHBsaWNhdGlvbiI+PC9hPiBCZW5jaG1hcmsgQXBwbGljYXRpb24KK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBTREsgYW5kIE5ESyBBUElzLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKK0JlbmNobWFyayBBcHBsaWNhdGlvbiBjYW4gYmUgcnVuIGluIHR3byB3YXlzLgogCi1UbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgU0RLIEFQSXMsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorIyMgU3RlcHMgdG8gcnVuIHdpdGggYXRlc3QKK05vdGUgdGhhdCBhdGVzdCBjb21tYW5kIHdpbGwgaW5zdGFsbCBCZW5jaG1hcmsgYXBwbGljYXRpb24gYW5kIHB1c2ggdGhlIHJlcXVpcmVkIHRlc3QgZmlsZXMgdG8gdGhlIGRldmljZSBhcyB3ZWxsLgorCitGb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kCitgYGAKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cyAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKKworRm9yIHJ1bm5pbmcgdGhlIHRlc3RzIGluZGl2aWR1YWxseSwgcnVuIHRoZSBmb2xsb3dpbmcgYXRlc3QgY29tbWFuZHM6CisKK2BgYAorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkV4dHJhY3RvclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5NdXhlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYXRlc3QgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkVuY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYAorCisjIyBTdGVwcyB0byBydW4gd2l0aG91dCBhdGVzdAogCiBUaGUgYXBrIHdpbGwgYmUgY3JlYXRlZCBhdCB0aGUgZm9sbG93aW5nIHBhdGg6Ci0kT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvCiAKLVRvIGdldCB0aGUgcmVzb3JjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbTkRLXSgjTkRLKQorVGhlIDY0LWJpdCBhcGsgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6CiskT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvCiAKIEZvciBpbnN0YWxsaW5nIHRoZSBhcGssIHJ1biB0aGUgY29tbWFuZDoKIGBgYAogYWRiIGluc3RhbGwgLWYgLXIgJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0L01lZGlhQmVuY2htYXJrVGVzdC5hcGsKIGBgYAogCi1Gb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGNvbW1hbmQ6CitUaGUgMzItYml0IGFwayB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDoKKyRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm0vCisKK0ZvciBpbnN0YWxsaW5nIHRoZSBhcGssIHJ1biB0aGUgY29tbWFuZDoKK2BgYAorYWRiIGluc3RhbGwgLWYgLXIgJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybS9NZWRpYUJlbmNobWFya1Rlc3QuYXBrCitgYGAKKworVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbUmVzb3VyY2VzXSgjUmVzb3VyY2VzKQorCitGb3IgcnVubmluZyBhbGwgdGhlIHRlc3RzLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIHBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBFeHRyYWN0b3IKIAotVGhlIHRlc3QgZXh0cmFjdHMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGV4dHJhY3RvcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FeHRyYWN0b3JUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgRGVjb2RlcgogCi1UaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRGVjb2RlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBNdXhlcgogCi1UaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyBkaWZmZXJlbnQgd3JpdGVycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgZGlmZmVyZW50IHdyaXRlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLk11eGVyVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIEVuY29kZXIKIAotVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZW5jb2RlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkVuY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKQEAgLTEyNCwyNCArMTYxLDI3IEBACiBUbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgY29kZWMyIGxheWVyLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKIAogVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKwogVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LwogCiBUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KLUVnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdDY0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKIAogVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgogYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC8qIC9kYXRhL2xvY2FsL3RtcC8KLUVnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKK2FkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3QvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAogCi1UbyBnZXQgdGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtOREtdKCNOREspCitUbyBnZXQgdGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGUgdGVzdCBmb2xsb3cgaW5zdHJ1Y3Rpb25zIGdpdmVuIGluIFtSZXNvdXJjZXNdKCNSZXNvdXJjZXMpCiAKICMjIEMyIERlY29kZXIKIAogVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGNvZGVjMiBkZWNvZGVycyBhdmFpbGFibGUgaW4gZGV2aWNlLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBbZXh0cmFjdG9yXSgjZXh0cmFjdG9yKS4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0MyRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtMTQ5LDggKzE4OSw5NSBAQAogCiBUaGUgdGVzdCBlbmNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgY29kZWMyIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBkZXZpY2UuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIFtleHRyYWN0b3JdKCNleHRyYWN0b3IpLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQzJFbmNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCisKKyMgQW5hbHlzaXMKKworVGhlIGJlbmNobWFyayByZXN1bHRzIGFyZSBzdG9yZWQgaW4gYSBDU1YgZmlsZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgYW5hbHlzaXMuIFRoZXNlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBmb2xsb3dpbmcgZm9ybWF0OgorPGFwcCBkaXJlY3Rvcnk+Lzxtb2R1bGVfbmFtZT4uPHRpbWVzdGFtcD4uY3N2CisKK05vdGU6IFRoaXMgdGltZXN0YW1wIGlzIGluIG5hbm8gc2Vjb25kcyBhbmQgd2lsbCBjaGFuZ2UgYmFzZWQgb24gY3VycmVudCBzeXN0ZW0gdGltZS4KKworVG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIENTViBmaWxlLCBsb29rIGZvciB0aGUgcGF0aCBpbiBsb2dzLiBFeGFtcGxlIGxvZyBiZWxvdyAtCisKK2BgYAorY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIEQvRGVjb2RlclRlc3Q6IFNhdmluZyBCZW5jaG1hcmsgcmVzdWx0cyBpbjogL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2ZpbGVzL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YKK2BgYAorCitUaGlzIGZpbGUgY2FuIGJlIHB1bGxlZCBmcm9tIHRoZSBkZXZpY2UgdXNpbmcgImFkYiBwdWxsIiBjb21tYW5kLgorYGBgCithZGIgcHVsbCAvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvZmlsZXMvRGVjb2Rlci4xNTg3NzMyMzk1Mzg3LmNzdiAuL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YKK2BgYAorCisjIyBDU1YgQ29sdW1ucworCitGb2xsb3dpbmcgY29sdW1ucyBhcmUgYXZhaWxhYmxlIGluIENTVi4KKworTm90ZTogQWxsIHRpbWUgdmFsdWVzIGFyZSBpbiBuYW5vIHNlY29uZHMKKworMS4gKipjdXJyZW50VGltZSoqIDogVGhlIHRpbWUgcmVjb3JkZWQgYXQgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdGF0cy4gVGhpcyBtYXkgYmUgdXNlZCB0byBlc3RpbWF0ZSB0aW1lIGJldHdlZW4gY29uc2VjdXRpdmUgdGVzdCBjbGlwcy4KKworMi4gKipmaWxlTmFtZSoqOiBUaGUgZmlsZSBiZWluZyB1c2VkIGFzIGFuIGlucHV0IGZvciB0aGUgYmVuY2htYXJrIHRlc3QuCisKKzMuICoqb3BlcmF0aW9uKio6IFRoZSBjdXJyZW50IG9wZXJhdGlvbiBvbiB0aGUgaW5wdXQgdGVzdCB2ZWN0b3IgaS5lLiBFeHRyYWN0L011eC9FbmNvZGUvRGVjb2RlLgorCis0LiAqKk5ESy9TREsqKjogVGhlIHRhcmdldCBBUElzIGkuZS4gQU1lZGlhIHZzIE1lZGlhIGNhbGxzIGZvciB0aGUgb3BlcmF0aW9uIGJlaW5nIHBlcmZvcm1lZC4KKworNS4gKipzeW5jL2FzeW5jKio6IFRoaXMgaXMgc3BlY2lmaWMgdG8gTWVkaWFDb2RlYyBvYmplY3RzIChpLmUuIEVuY29kZXIgYW5kIERlY29kZXIpLiBJdCBzcGVjaWZpZXMgdGhlIG1vZGUgaW4gd2hpY2ggTWVkaWFDb2RlYyBBUElzIGFyZSB3b3JraW5nLiBGb3IgYXN5bmMgbW9kZSwgY2FsbGJhY2tzIGFyZSBzZXQuIEZvciBzeW5jIG1vZGUsIHdlIGhhdmUgdG8gcG9sbCB0aGUgZGVxdWV1ZUJ1ZmZlciBBUElzIHRvIHF1ZXVlIGFuZCBkZXF1ZXVlIGlucHV0IG91dHB1dCBidWZmZXJzIHJlc3BlY3RpdmVseS4KKworNi4gKipzZXR1cFRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gc2V0IHVwIHRoZSBNZWRpYUV4dHJhY3Rvci9NdXhlci9Db2RlYyBpbnN0YW5jZS4KKworICAgICogTWVkaWFDb2RlYzogaW5jbHVkZXMgc2V0dGluZyBhc3luYy9zeW5jIG1vZGUsIGNvbmZpZ3VyaW5nIHdpdGggYSBmb3JtYXQgYW5kIGNvZGVjLnN0YXJ0CisKKyAgICAqIE1lZGlhRXh0cmFjdG9yOiBpbmNsdWRlcyBBTWVkaWFFeHRyYWN0b3JfbmV3IGFuZCBzZXREYXRhU291cmNlLgorCisgICAgKiBNZWRpYU11eGVyOiBpbmNsdWRlcyBjcmVhdGluZyB0aGUgb2JqZWN0LCBhZGRpbmcgdHJhY2ssIGFuZCBzdGFydGluZyB0aGUgbXV4ZXIuCisKKzcuICoqZGVzdHJveVRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gc3RvcCBhbmQgY2xvc2UgTWVkaWFFeHRyYWN0b3IvTXV4ZXIvQ29kZWMgaW5zdGFuY2UuCisKKzguICoqbWluaW11bVRpbWUqKjogVGhlIG1pbmltdW0gdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIGEgZnJhbWUuCisKKzkuICoqbWF4aW11bVRpbWUqKjogVGhlIG1heGltdW0gdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIGEgZnJhbWUuCisKKzEwLiAqKmF2ZXJhZ2VUaW1lKio6IEF2ZXJhZ2UgdGltZSB0YWtlbiB0byBleHRyYWN0L211eC9lbmNvZGUvZGVjb2RlIHBlciBmcmFtZS4KKworICAgICogTWVkaWFDb2RlYzogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gZW5jb2RlL2RlY29kZSBhbGwgZnJhbWVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgZW5jb2RlZC9kZWNvZGVkLgorCisgICAgKiBNZWRpYUV4dHJhY3RvcjogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gZXh0cmFjdCBhbGwgZnJhbWVzIGRpdmlkZWQgYnkgdGhlIG51bWJlciBvZiBmcmFtZXMgZXh0cmFjdGVkLgorCisgICAgKiBNZWRpYU11eGVyOiBjb21wdXRlZCBhcyB0aGUgdG90YWwgdGltZSB0YWtlbiB0byBtdXggYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIG11eGVkLgorCisxMS4gKip0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQqKjogVGhlIHRpbWUgcmVxdWlyZWQgdG8gcHJvY2VzcyBvbmUgc2Vjb25kIHdvcnRoIGlucHV0IGRhdGEuCisKKzEyLiAqKnRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMqKjogVGhlIG51bWJlciBvZiBieXRlcyBleHRyYWN0ZWQvbXV4ZWQvZGVjb2RlZC9lbmNvZGVkIHBlciBzZWNvbmQuCisKKzEzLiAqKnRpbWVUb0ZpcnN0RnJhbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gcmVjZWl2ZSB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lLgorCisxNC4gKip0b3RhbFNpemVJbkJ5dGVzKio6IFRoZSB0b3RhbCBvdXRwdXQgc2l6ZSBvZiB0aGUgb3BlcmF0aW9uIChpbiBieXRlcykuCisKKzE1LiAqKnRvdGFsVGltZSoqOiBUaGUgdGltZSB0YWtlbiB0byBwZXJmb3JtIHRoZSBjb21wbGV0ZSBvcGVyYXRpb24gKGkuZS4gRXh0cmFjdC9NdXgvRGVjb2RlL0VuY29kZSkgZm9yIHJlc3BlY3RpdmUgdGVzdCB2ZWN0b3IuCisKKworIyMgTXV4ZXIKKzEuICoqY29tcG9uZW50TmFtZSoqOiBUaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgTWVkaWEgZmlsZS4gRm9sbG93aW5nIG11eGVycyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKyAgICAgKiBPZ2csIFdlYm0sIDNncHAsIGFuZCBtcDQuCisKKyMjIERlY29kZXIKKzEuICoqY29tcG9uZW50TmFtZSoqOiBJbmNsdWRlcyBhbGwgc3VwcG9ydGVkIGNvZGVjcyBvbiB0aGUgZGV2aWNlLiBBbGlhc2VkIGNvbXBvbmVudHMgYXJlIHNraXBwZWQuCisgICAgKiAgIFZpZGVvOiBIMjYzLCBIMjY0LCBIMjY1LCBWUHgsIE1wZWc0LCBNcGVnMiwgQVYxCisgICAgKiAgIEF1ZGlvOiBBQUMsIEZsYWMsIE9wdXMsIE1QMywgVm9yYmlzLCBHU00sIEFNUi1OQi9XQgorCisjIyBFbmNvZGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogSW5jbHVkZXMgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gdGhlIGRldmljZS4gQWxpYXNlZCBjb21wb25lbnRzIGFyZSBza2lwcGVkLgorICAgICogICBWaWRlbzogSDI2MywgSDI2NCwgSDI2NSwgVlB4LCBNcGVnNAorICAgICogICBBdWRpbzogQUFDLCBGbGFjLCBPcHVzLCBBTVItTkIvV0IKKworIyMgQ29tbW9uIEZhaWx1cmVzCitPbiBzb21lIGRldmljZXMsIGlmIGEgY29kZWMgaXNuJ3Qgc3VwcG9ydGVkIHNvbWUgdGVzdHMgbWF5IHJlcG9ydCBhIGZhaWx1cmUgbGlrZSAiY29kZWMgbm90IGZvdW5kIGZvciIKKworRm9yIGV4YW1wbGU6IE9uIG1vYmlsZSBkZXZpY2VzIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXBlZzIgZGVjb2RlciwgZm9sbG93aW5nIGZhaWx1cmUgaXMgb2JzZXJ2ZWQ6CitgYGAKK1VuYWJsZSB0byBjcmVhdGUgY29kZWMgYnkgbWltZTogdmlkZW8vbXBlZzIKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icAppbmRleCBkNDM4OWRhLi42YjU0YzZhIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19jb21tb24iLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0FuZHJvaWQuYnAKaW5kZXggOTc5MWMxMS4uNjAxYjJmNiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKICAgICBkZWZhdWx0czogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCmluZGV4IDIwYTE0NjguLjY1MzlmMjQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKQEAgLTUzLDggKzUzLDggQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7Ci0gICAgbUNvbXBvbmVudCA9IG1DbGllbnQtPkNyZWF0ZUNvbXBvbmVudEJ5TmFtZShjb21wTmFtZS5jX3N0cigpLCBtTGlzdGVuZXIsICZtQ2xpZW50KTsKLSAgICBpZiAobUNvbXBvbmVudCA9PSBudWxscHRyKSB7CisgICAgaWYgKG1DbGllbnQtPkNyZWF0ZUNvbXBvbmVudEJ5TmFtZShjb21wTmFtZS5jX3N0cigpLCBtTGlzdGVuZXIsICZtQ29tcG9uZW50LCAmbUNsaWVudCkgIT0KKyAgICAgICAgQzJfT0spIHsKICAgICAgICAgQUxPR0UoIkNyZWF0ZSBjb21wb25lbnQgZmFpbGVkIGZvciAlcyIsIGNvbXBOYW1lLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTU2LDkgKzE1NiwxMSBAQAogICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOwogfQogCi12b2lkIEMyRGVjb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpIHsKK3ZvaWQgQzJEZWNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSkgewogICAgIHN0cmluZyBvcGVyYXRpb24gPSAiYzJkZWNvZGUiOwotICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25Vcyk7CisgICAgc3RyaW5nIG1vZGUgPSAiYXN5bmMiOworICAgIG1TdGF0cy0+ZHVtcFN0YXRpc3RpY3Mob3BlcmF0aW9uLCBpbnB1dFJlZmVyZW5jZSwgZHVyYXRpb25VcywgY29tcG9uZW50TmFtZSwgbW9kZSwgc3RhdHNGaWxlKTsKIH0KIAogdm9pZCBDMkRlY29kZXI6OnJlc2V0RGVjb2RlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oCmluZGV4IDRhM2ViOTYuLmZiMzVhNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaApAQCAtMzEsNyArMzEsOCBAQAogCiAgICAgdm9pZCBkZUluaXRDb2RlYygpOwogCi0gICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcyk7CisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKTsKIAogICAgIHZvaWQgcmVzZXREZWNvZGVyKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQW5kcm9pZC5icAppbmRleCA4ZGU3ODIzLi5hNzg3MDY4IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2VuY29kZXIiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKaW5kZXggMzM0MjllZi4uY2E3OTg4MSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcApAQCAtNjgsOCArNjgsOCBAQAogICAgIH0KIAogICAgIGludDY0X3Qgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKLSAgICBtQ29tcG9uZW50ID0gbUNsaWVudC0+Q3JlYXRlQ29tcG9uZW50QnlOYW1lKGNvbXBOYW1lLmNfc3RyKCksIG1MaXN0ZW5lciwgJm1DbGllbnQpOwotICAgIGlmIChtQ29tcG9uZW50ID09IG51bGxwdHIpIHsKKyAgICBpZiAobUNsaWVudC0+Q3JlYXRlQ29tcG9uZW50QnlOYW1lKGNvbXBOYW1lLmNfc3RyKCksIG1MaXN0ZW5lciwgJm1Db21wb25lbnQsICZtQ2xpZW50KSAhPQorICAgICAgICBDMl9PSykgewogICAgICAgICBBTE9HRSgiQ3JlYXRlIGNvbXBvbmVudCBmYWlsZWQgZm9yICVzIiwgY29tcE5hbWUuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0yNTEsOSArMjUxLDExIEBACiAgICAgbVN0YXRzLT5zZXREZUluaXRUaW1lKHRpbWVUYWtlbik7CiB9CiAKLXZvaWQgQzJFbmNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcykgewordm9pZCBDMkVuY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKSB7CiAgICAgc3RyaW5nIG9wZXJhdGlvbiA9ICJjMmVuY29kZSI7Ci0gICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzKTsKKyAgICBzdHJpbmcgbW9kZSA9ICJhc3luYyI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOwogfQogCiB2b2lkIEMyRW5jb2Rlcjo6cmVzZXRFbmNvZGVyKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKaW5kZXggYTRjYTA5Ny4uN2EwMjFmNCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oCkBAIC00NCw3ICs0NCw4IEBACiAKICAgICB2b2lkIGRlSW5pdENvZGVjKCk7CiAKLSAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpOwogCiAgICAgdm9pZCByZXNldEVuY29kZXIoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAKaW5kZXggMjZmYjFiOS4uMTVjNDc5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwCkBAIC0yMDMsMTMgKzIwMywxMyBAQAogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgbVBhcmFtcy53aWR0aCk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgbVBhcmFtcy5oZWlnaHQpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBtUGFyYW1zLmZyYW1lUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsIG1QYXJhbXMuaUZyYW1lSW50ZXJ2YWwpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgbVBhcmFtcy5iaXRyYXRlKTsKLSAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwgMSk7Ci0gICAgICAgIGlmIChtUGFyYW1zLnByb2ZpbGUgJiYgbVBhcmFtcy5sZXZlbCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsIG1QYXJhbXMuY29sb3JGb3JtYXQpOworICAgICAgICBpZiAobVBhcmFtcy5wcm9maWxlICE9IC0xICYmIG1QYXJhbXMubGV2ZWwgIT0gLTEpIHsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsIG1QYXJhbXMucHJvZmlsZSk7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgbVBhcmFtcy5sZXZlbCk7CiAgICAgICAgIH0KLSAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBtUGFyYW1zLmNvbG9yRm9ybWF0KTsKICAgICB9IGVsc2UgewogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVBhcmFtcy5zYW1wbGVSYXRlKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVBhcmFtcy5udW1DaGFubmVscyk7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oCmluZGV4IDVhZDE0MmIuLjMyNDMxN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oCkBAIC0yMywxMCArMjMsMTEgQEAKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDx0aHJlYWQ+CiAKLSNpbmNsdWRlICJtZWRpYS9OZGtJbWFnZS5oIgogI2luY2x1ZGUgIkJlbmNobWFya0NvbW1vbi5oIgogI2luY2x1ZGUgIlN0YXRzLmgiCiAKKy8vIGNvbnN0YW50IG5vdCBkZWZpbmVkIGluIE5ESyBhcGkKK2NvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlID0gMHg3RjQyMDg4ODsKIAogc3RydWN0IGVuY1BhcmFtZXRlciB7CiAgICAgaW50MzJfdCBiaXRyYXRlID0gLTE7CkBAIC0zOCw5ICszOSwxMCBAQAogICAgIGludDMyX3Qgd2lkdGggPSAwOwogICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IC0xOwotICAgIGludDMyX3QgcHJvZmlsZSA9IDA7Ci0gICAgaW50MzJfdCBsZXZlbCA9IDA7Ci0gICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg7CisgICAgaW50MzJfdCBpRnJhbWVJbnRlcnZhbCA9IDA7CisgICAgaW50MzJfdCBwcm9maWxlID0gLTE7CisgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKIH07CiAKIGNsYXNzIEVuY29kZXIgOiBwdWJsaWMgQ2FsbEJhY2tIYW5kbGUgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvQW5kcm9pZC5icAppbmRleCA3ZWQ5NDc2Li40OTQ2OTkwIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvQW5kcm9pZC5icAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvQW5kcm9pZC5icAppbmRleCBmNjY5ZDRhLi44NDk4NWU0IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL211eGVyL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfbXV4ZXIiLAogICAgIGRlZmF1bHRzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGY0NmZhNGEuLjBmYmQyMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiZXh0cmFjdG9yVGVzdCIsCiAgICAgZ3Rlc3Q6IHRydWUsCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKaW5kZXggYWUyZWVlMS4uNGVkYjA0OCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaApAQCAtMjUsNyArMjUsOSBAQAogCiBjbGFzcyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CiAgIHB1YmxpYzoKLSAgICBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL3NkY2FyZC9tZWRpYS8iKSB7fQorICAgIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpCisgICAgICAgIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyIpLAorICAgICAgICAgIHN0YXRzRmlsZSgiL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy9zdGF0cy5jc3YiKSB7fQogCiAgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKICAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CkBAIC0zNCw4ICszNiwxNSBAQAogCiAgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQogCisgICAgdm9pZCBzZXRTdGF0c0ZpbGUoY29uc3Qgc3RyaW5nIG1vZHVsZSkgeyBzdGF0c0ZpbGUgPSBnZXRSZXMoKSArIG1vZHVsZTsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFN0YXRzRmlsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRzRmlsZTsgfQorCisgICAgYm9vbCB3cml0ZVN0YXRzSGVhZGVyKCk7CisKICAgcHJpdmF0ZToKICAgICBzdHJpbmcgcmVzOworICAgIHN0cmluZyBzdGF0c0ZpbGU7CiB9OwogCiBpbnQgQmVuY2htYXJrVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CkBAIC03MCw0ICs3OSwyNiBAQAogICAgIHJldHVybiAwOwogfQogCisvKioKKyAqIFdyaXRlcyB0aGUgc3RhdHMgaGVhZGVyIHRvIGEgZmlsZQorICogPHA+CisgKiBccGFyYW0gc3RhdHNGaWxlICAgIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbgorICoqLworYm9vbCBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQ6OndyaXRlU3RhdHNIZWFkZXIoKSB7CisgICAgY2hhciBzdGF0c0hlYWRlcltdID0KKyAgICAgICAgImN1cnJlbnRUaW1lLCBmaWxlTmFtZSwgb3BlcmF0aW9uLCBjb21wb25lbnROYW1lLCBOREsvU0RLLCBzeW5jL2FzeW5jLCBzZXR1cFRpbWUsICIKKyAgICAgICAgImRlc3Ryb3lUaW1lLCBtaW5pbXVtVGltZSwgbWF4aW11bVRpbWUsIGF2ZXJhZ2VUaW1lLCB0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQsICIKKyAgICAgICAgInRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMsIHRpbWVUb0ZpcnN0RnJhbWUsIHRvdGFsU2l6ZUluQnl0ZXMsIHRvdGFsVGltZVxuIjsKKyAgICBGSUxFICpmcFN0YXRzID0gZm9wZW4oc3RhdHNGaWxlLmNfc3RyKCksICJ3Iik7CisgICAgaWYoIWZwU3RhdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IG51bUJ5dGVzID0gZndyaXRlKHN0YXRzSGVhZGVyLCBzaXplb2YoY2hhciksIHNpemVvZihzdGF0c0hlYWRlciksIGZwU3RhdHMpOworICAgIGZjbG9zZShmcFN0YXRzKTsKKyAgICBpZihudW1CeXRlcyAhPSBzaXplb2Yoc3RhdHNIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKICNlbmRpZiAgLy8gX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcAppbmRleCBkZWRjNzQzLi44NWRjYmMxIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCkBAIC0xMzYsNyArMTM2LDggQEAKICAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25VcywgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgICAgICAgICAgbURlY29kZXItPnJlc2V0RGVjb2RlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzgsNiArMTc5LDkgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkMyRGVjb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgICAgICAgIEFMT0dWKCJDMiBEZWNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCmluZGV4IDk4ZWIxN2EuLmIxOGQ4NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtMTQwLDcgKzE0MCw4IEBACiAgICAgICAgICAgICAgICAgbUVuY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMsIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTgwLDYgKzE4MSw5IEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJDMkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICAgICAgICBBTE9HVigiQzIgRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCmluZGV4IDlmOTZkM2IuLjgxZWYwMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcApAQCAtODQsNyArODQsOCBAQAogICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKICAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlID0gZ2V0PDA+KHBhcmFtcyk7Ci0gICAgICAgIGRlY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlKTsKKyAgICAgICAgZGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKICAgICB9CkBAIC0xNzksOCArMTgwLDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR0QoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcAppbmRleCBkYzJhMmRkLi43ZTE2ODFkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSAiRGVjb2Rlci5oIgogI2luY2x1ZGUgIkVuY29kZXIuaCIKIAorY29uc3RleHByIGludDMyX3Qga0VuY29kZURlZmF1bHRWaWRlb0JpdFJhdGUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKK2NvbnN0ZXhwciBpbnQzMl90IGtFbmNvZGVNaW5WaWRlb0JpdFJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87Citjb25zdGV4cHIgaW50MzJfdCBrRW5jb2RlRGVmYXVsdEF1ZGlvQml0UmF0ZSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKKwogc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKIGNsYXNzIEVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIHN0cmluZywgYm9vbD4+IHt9OwpAQCAtNzgsNyArODIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtODYsNiArOTAsNyBAQAogICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKICAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CiAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkRlY29kZSByZXR1cm5lZCBlcnJvciA6ICIgPDwgc3RhdHVzOworICAgICAgICBBTWVkaWFGb3JtYXQgKmRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07CiAgICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKQEAgLTEwOCwxMSArMTEzLDEzIEBACiAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLmJpdHJhdGUgPD0gMCB8fCBlbmNQYXJhbXMuZnJhbWVSYXRlIDw9IDApIHsKICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gMjU7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0ga0VuY29kZU1pblZpZGVvQml0UmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0VmlkZW9CaXRSYXRlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihkZWNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLmNvbG9yRm9ybWF0KTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsICZlbmNQYXJhbXMubGV2ZWwpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTIwLDggKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5zYW1wbGVSYXRlKSk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscykpOwotICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuc2FtcGxlUmF0ZSAqIGVuY1BhcmFtcy5udW1DaGFubmVscyAqIDE2IC8qIGJpdHNQZXJTYW1wbGUgKi87CisgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0QXVkaW9CaXRSYXRlOwogICAgICAgICB9CiAKICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CkBAIC0xMzMsNyArMTM5LDggQEAKICAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CiAgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZSA9IGdldDwwPihwYXJhbXMpOwotICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSk7CisgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKICAgICAgICAgaWYgKG91dEZwKSBmY2xvc2Uob3V0RnApOwogCkBAIC0xNDEsNiArMTQ4LDEwIEBACiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CiAgICAgICAgICAgICBmb3JtYXQgPSBudWxscHRyOwogICAgICAgICB9CisgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRlY29kZXJGb3JtYXQpOworICAgICAgICAgICAgZGVjb2RlckZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIH0KICAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CiAgICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwpAQCAtMjE0LDggKzIyNSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiRW5jb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dEKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKaW5kZXggYWQ4ZjFlNi4uZDE0ZDE1YiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcApAQCAtNDgsOCArNDgsNyBAQAogICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkV4dHJhY3Rpb24gZmFpbGVkIFxuIjsKIAogICAgIGV4dHJhY3RPYmotPmRlSW5pdEV4dHJhY3RvcigpOwotCi0gICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCk7CisgICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgIiIsIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKIAogICAgIGZjbG9zZShpbnB1dEZwKTsKICAgICBkZWxldGUgZXh0cmFjdE9iajsKQEAgLTc5LDggKzc4LDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJFeHRyYWN0b3IuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiIEV4dHJhY3RvciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiRXh0cmFjdG9yIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCmluZGV4IGZhMjYzNWQuLjk5MTY0NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIk11eCBmYWlsZWQiOwogCiAgICAgICAgIG11eGVyT2JqLT5kZUluaXRNdXhlcigpOwotICAgICAgICBtdXhlck9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCArICIuIiArIGZtdC5jX3N0cigpKTsKKyAgICAgICAgbXV4ZXJPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QgKyAiLiIgKyBmbXQuY19zdHIoKSwgZm10LCBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBmY2xvc2Uob3V0cHV0RnApOwogICAgICAgICBtdXhlck9iai0+cmVzZXRNdXhlcigpOwpAQCAtMTUxLDggKzE1MSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiTXV4ZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIk11eGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBlM2YxZTQ0Li5iZmU3M2Q1IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDE1IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlibWVkaWF1dGlscyIsCiAKQEAgLTI4LDE3ICszNywyNCBAQAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsCisgICAgICAgICJsaWJiYXR0ZXJ5c3RhdHNfYWlkbCIsCisgICAgICAgICJsaWJwcm9jZXNzaW5mb3NlcnZpY2VfYWlkbCIsCiAgICAgXSwKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLCAvLyBmb3IgY2xvY2suaAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlicGVybWlzc2lvbiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICBdLAorICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhdHRlcnlzdGF0c19haWRsIiwKKyAgICBdLAogCiAgICAgbG9ndGFnczogWyJFdmVudExvZ1RhZ3MubG9ndGFncyJdLAogCkBAIC01Myw2ICs2OSwxMCBAQAogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAorICAgIF0sCisKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgLy8gRm9yIERFQlVHR0VSX1NJR05BTAogICAgICAgICAic3lzdGVtL2NvcmUvZGVidWdnZXJkL2luY2x1ZGUiLApAQCAtNjAsMyArODAsMTAgQEAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsICAvLyByZXF1aXJlZCBmb3IgcGxhdGZvcm0vaGFyZHdhcmUvaW50ZXJmYWNlcworCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCmluZGV4IDY3ZjBlYTguLmMzOTdmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0zMSw3ICszMSw3IEBACiAjIDY6IFBlcmNlbnQKICMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KICMKLSMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHRhZ3MuCiAKICMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwIGIvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCmluZGV4IDExM2U0YTcuLmUyMTI3OTQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcAorKysgYi9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKQEAgLTIxLDEyICsyMSwxNSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVByb2Nlc3NJbmZvU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxwcm9jZXNzaW5mby9JUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IElOVkFMSURfQURKID0gLTEwMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IE5BVElWRV9BREogPSAtMTAwMDsKKwogUHJvY2Vzc0luZm86OlByb2Nlc3NJbmZvKCkge30KIAogYm9vbCBQcm9jZXNzSW5mbzo6Z2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgewpAQCAtMzUsOCArMzgsNiBAQAogCiAgICAgc2l6ZV90IGxlbmd0aCA9IDE7CiAgICAgaW50MzJfdCBzdGF0ZTsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBJTlZBTElEX0FESiA9IC0xMDAwMDsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBOQVRJVkVfQURKID0gLTEwMDA7CiAgICAgaW50MzJfdCBzY29yZSA9IElOVkFMSURfQURKOwogICAgIHN0YXR1c190IGVyciA9IHNlcnZpY2UtPmdldFByb2Nlc3NTdGF0ZXNBbmRPb21TY29yZXNGcm9tUGlkcyhsZW5ndGgsICZwaWQsICZzdGF0ZSwgJnNjb3JlKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC00NSw4ICs0NiwxNyBAQAogICAgIH0KICAgICBBTE9HVigicGlkICVkIHN0YXRlICVkIHNjb3JlICVkIiwgcGlkLCBzdGF0ZSwgc2NvcmUpOwogICAgIGlmIChzY29yZSA8PSBOQVRJVkVfQURKKSB7Ci0gICAgICAgIEFMT0dFKCJwaWQgJWQgaW52YWxpZCBPT00gYWRqdXN0bWVudHMgdmFsdWUgJWQiLCBwaWQsIHNjb3JlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bU92ZXJyaWRlTG9ja307CisKKyAgICAgICAgLy8gSWYgdGhpcyBwcm9jZXNzIGlmIG5vdCB0cmFja2VkIGJ5IEFjdGl2aXR5TWFuYWdlclNlcnZpY2UsIGxvb2sgZm9yIG92ZXJyaWRlcy4KKyAgICAgICAgYXV0byBpdCA9IG1PdmVycmlkZU1hcC5maW5kKHBpZCk7CisgICAgICAgIGlmIChpdCAhPSBtT3ZlcnJpZGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dJKCJwaWQgJWQgaW52YWxpZCBPT00gc2NvcmUgJWQsIG92ZXJyaWRlIHRvICVkIiwgcGlkLCBzY29yZSwgaXQtPnNlY29uZC5vb21TY29yZSk7CisgICAgICAgICAgICBzY29yZSA9IGl0LT5zZWNvbmQub29tU2NvcmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgicGlkICVkIGludmFsaWQgT09NIHNjb3JlICVkIiwgcGlkLCBzY29yZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBVc2UgT09NIGFkanVzdG1lbnRzIHZhbHVlIGFzIHRoZSBwcmlvcml0eS4gTG93ZXIgdGhlIHZhbHVlLCBoaWdoZXIgdGhlIHByaW9yaXR5LgpAQCAtNjEsNiArNzEsMjYgQEAKICAgICByZXR1cm4gKGNhbGxpbmdQaWQgPT0gZ2V0cGlkKCkpIHx8IChjYWxsaW5nUGlkID09IHBpZCkgfHwgKGNhbGxpbmdVaWQgPT0gQUlEX01FRElBKTsKIH0KIAorYm9vbCBQcm9jZXNzSW5mbzo6b3ZlcnJpZGVQcm9jZXNzSW5mbyhpbnQgcGlkLCBpbnQgcHJvY1N0YXRlLCBpbnQgb29tU2NvcmUpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bU92ZXJyaWRlTG9ja307CisKKyAgICBtT3ZlcnJpZGVNYXAuZXJhc2UocGlkKTsKKworICAgIC8vIERpc2FibGUgdGhlIG92ZXJyaWRlIGlmIG9vbVNjb3JlIGlzIHNldCB0byBOQVRJVkVfQURKIG9yIGJlbG93LgorICAgIGlmIChvb21TY29yZSA8PSBOQVRJVkVfQURKKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtT3ZlcnJpZGVNYXAuZW1wbGFjZShwaWQsIFByb2Nlc3NJbmZvT3ZlcnJpZGV7cHJvY1N0YXRlLCBvb21TY29yZX0pOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFByb2Nlc3NJbmZvOjpyZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7bU92ZXJyaWRlTG9ja307CisKKyAgICBtT3ZlcnJpZGVNYXAuZXJhc2UocGlkKTsKK30KKwogUHJvY2Vzc0luZm86On5Qcm9jZXNzSW5mbygpIHt9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmluZGV4IDg3ZWEwODQuLjljN2I4NjMgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCkBAIC0yMiw2ICsyMiwxMCBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CiAjaW5jbHVkZSAibWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWhhbC1lbnVtcy5oPgorI2luY2x1ZGUgPG1lZGlhL0FpZGxDb252ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb25VdGlsLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPGl0ZXJhdG9yPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KQEAgLTM2LDE0ICs0MCwxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CiAKIHN0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgewotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgaWYgKG9wUGFja2FnZU5hbWUuaGFzX3ZhbHVlKCkgJiYgb3BQYWNrYWdlTmFtZS52YWx1ZSgpLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWUudmFsdWUoKTsKICAgICB9CiAgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KICAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcwpAQCAtNTYsODAgKzYyLDEyMCBAQAogICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOwogICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIk5vIHBhY2thZ2VzIGZvciB1aWQgJWQiLCB1aWQpOwotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsgLy8gZW1wdHkgc3RyaW5nCisgICAgICAgIHJldHVybiBTdHJpbmcxNigpOwogICAgIH0KICAgICByZXR1cm4gcGFja2FnZXNbMF07CiB9CiAKLXN0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7CitpbnQzMl90IGdldE9wRm9yU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgeworICBzd2l0Y2ggKHNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CisgICAgICByZXR1cm4gQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPX0hPVFdPUkQ7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgIHJldHVybiBBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU9fT1VUUFVUOworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgorICAgICAgcmV0dXJuIEFwcE9wc01hbmFnZXI6Ok9QX1JFQ09SRF9JTkNPTUlOR19QSE9ORV9BVURJTzsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPOworICB9Cit9CisKK3N0ZDo6b3B0aW9uYWw8QXR0cmlidXRpb25Tb3VyY2VTdGF0ZT4gcmVzb2x2ZUF0dHJpYnV0aW9uU291cmNlKAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBjYWxsZXJBdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgbmV4dEF0dHJpYnV0aW9uU291cmNlID0gY2FsbGVyQXR0cmlidXRpb25Tb3VyY2U7CisKKyAgICBpZiAoIW5leHRBdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS5oYXNfdmFsdWUoKSkgeworICAgICAgICBuZXh0QXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKG5leHRBdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KG5leHRBdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICAgICAgbmV4dEF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfU3RyaW5nMTZfc3RyaW5nKAorICAgICAgICAgICAgICAgIHJlc29sdmVDYWxsaW5nUGFja2FnZShwZXJtaXNzaW9uQ29udHJvbGxlciwgVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nMTYobmV4dEF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlX29yKCIiKSkpLAorICAgICAgICAgICAgICAgIHVpZCkpKTsKKyAgICAgICAgaWYgKCFuZXh0QXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIG15QXR0cmlidXRpb25Tb3VyY2U7CisgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChhbmRyb2lkOjpsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGdldHVpZCgpKSk7CisgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChhbmRyb2lkOjpsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGdldHBpZCgpKSk7CisgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgbXlBdHRyaWJ1dGlvblNvdXJjZS5uZXh0LnB1c2hfYmFjayhuZXh0QXR0cmlidXRpb25Tb3VyY2UpOworCisgICAgcmV0dXJuIHN0ZDo6b3B0aW9uYWw8QXR0cmlidXRpb25Tb3VyY2VTdGF0ZT57bXlBdHRyaWJ1dGlvblNvdXJjZX07Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBtc2csIGJvb2wgc3RhcnQsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIG9yIG1lZGlhIHNlcnZlciBpcyB1cyBhbmQgaWYKICAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCiAgICAgLy8gc3lzdGVtX3NlcnZlciBsb3NlcyBpdHMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24gd2hlbiBhIHNlY29uZGFyeQogICAgIC8vIHVzZXIgaXMgYWN0aXZlLCBidXQgaXQgaXMgYSBjb3JlIHN5c3RlbSBzZXJ2aWNlIHNvIGxldCBpdCB0aHJvdWdoLgogICAgIC8vIFRPRE8oYi8xNDEyMTAxMjApOiBVc2VyTWFuYWdlci5ESVNBTExPV19SRUNPUkRfQVVESU8gc2hvdWxkIG5vdCBhZmZlY3Qgc3lzdGVtIHVzZXIgMAorICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyT3JTeXN0ZW1TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CiAKICAgICAvLyBXZSBzcGVjaWZ5IGEgcGlkIGFuZCB1aWQgaGVyZSBhcyBtZWRpYXNlcnZlciAoYWthIE1lZGlhUmVjb3JkZXIgb3IgU3RhZ2VGcmlnaHRSZWNvcmRlcikKLSAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuICBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KKyAgICAvLyBtYXkgb3BlbiBhIHJlY29yZCB0cmFjayBvbiBiZWhhbGYgb2YgYSBjbGllbnQuIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgogICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7CisgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxBdHRyaWJ1dGlvblNvdXJjZVN0YXRlPiByZXNvbHZlZEF0dHJpYnV0aW9uU291cmNlID0KKyAgICAgICAgICAgIHJlc29sdmVBdHRyaWJ1dGlvblNvdXJjZShhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgaWYgKCFyZXNvbHZlZEF0dHJpYnV0aW9uU291cmNlLmhhc192YWx1ZSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CisgICAgY29uc3QgaW50MzJfdCBhdHRyaWJ1dGVkT3BDb2RlID0gZ2V0T3BGb3JTb3VyY2Uoc291cmNlKTsKIAotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBwZXJtaXNzaW9uOjpQZXJtaXNzaW9uQ2hlY2tlciBwZXJtaXNzaW9uQ2hlY2tlcjsKKyAgICBib29sIHBlcm1pdHRlZCA9IGZhbHNlOwogICAgIGlmIChzdGFydCkgewotICAgICAgICBpZiAoYXBwT3BzLnN0YXJ0T3BOb1Rocm93KG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSkKLSAgICAgICAgICAgICAgICAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIHBlcm1pdHRlZCA9IChwZXJtaXNzaW9uQ2hlY2tlci5jaGVja1Blcm1pc3Npb25Gb3JTdGFydERhdGFEZWxpdmVyeUZyb21EYXRhc291cmNlKAorICAgICAgICAgICAgICAgIHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvLCByZXNvbHZlZEF0dHJpYnV0aW9uU291cmNlLnZhbHVlKCksIG1zZywKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVkT3BDb2RlKSAhPSBwZXJtaXNzaW9uOjpQZXJtaXNzaW9uQ2hlY2tlcjo6UEVSTUlTU0lPTl9IQVJEX0RFTklFRCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFwcE9wcy5jaGVja09wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBwZXJtaXR0ZWQgPSAocGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0RnJvbURhdGFzb3VyY2UoCisgICAgICAgICAgICAgICAgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHJlc29sdmVkQXR0cmlidXRpb25Tb3VyY2UudmFsdWUoKSwgbXNnLAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZWRPcENvZGUpICE9IHBlcm1pc3Npb246OlBlcm1pc3Npb25DaGVja2VyOjpQRVJNSVNTSU9OX0hBUkRfREVOSUVEKTsKICAgICB9CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcGVybWl0dGVkOwogfQogCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Citib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKGF0dHJpYnV0aW9uU291cmNlLCBTdHJpbmcxNigpLCAvKnN0YXJ0Ki8gZmFsc2UsIHNvdXJjZSk7CiB9CiAKLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Citib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLCBjb25zdCBTdHJpbmcxNiYgbXNnLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKKyAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChhdHRyaWJ1dGlvblNvdXJjZSwgbXNnLCAvKnN0YXJ0Ki8gdHJ1ZSwgc291cmNlKTsKIH0KIAotdm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgewordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgogICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm47CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJPclN5c3RlbVNlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm47CiAKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiBOb3RlIHRoYXQgcGlkIG1heSBiZSBhIHRpZC4KKyAgICAvLyBJTVBPUlRBTlQ6IERPTidUIFVTRSBQZXJtaXNzaW9uQ2FjaGUgLSBSVU5USU1FIFBFUk1JU1NJT05TIENIQU5HRS4KKyAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPEF0dHJpYnV0aW9uU291cmNlU3RhdGU+IHJlc29sdmVkQXR0cmlidXRpb25Tb3VyY2UgPQorICAgICAgICAgICAgcmVzb2x2ZUF0dHJpYnV0aW9uU291cmNlKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBpZiAoIXJlc29sdmVkQXR0cmlidXRpb25Tb3VyY2UuaGFzX3ZhbHVlKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKKyAgICBjb25zdCBpbnQzMl90IGF0dHJpYnV0ZWRPcENvZGUgPSBnZXRPcEZvclNvdXJjZShzb3VyY2UpOworICAgIHBlcm1pc3Npb246OlBlcm1pc3Npb25DaGVja2VyIHBlcm1pc3Npb25DaGVja2VyOworICAgIHBlcm1pc3Npb25DaGVja2VyLmZpbmlzaERhdGFEZWxpdmVyeUZyb21EYXRhc291cmNlKGF0dHJpYnV0ZWRPcENvZGUsCisgICAgICAgICAgICByZXNvbHZlZEF0dHJpYnV0aW9uU291cmNlLnZhbHVlKCkpOwogfQogCi1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CiAgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKQEAgLTEzNyw3ICsxODMsOSBAQAogICAgIHJldHVybiBvazsKIH0KIAotYm9vbCBjYXB0dXJlTWVkaWFPdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Citib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnVpZCkpOworICAgIHBpZF90IHBpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CiAgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlTWVkaWFPdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX01FRElBX09VVFBVVCIpOwogICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZU1lZGlhT3V0cHV0LCBwaWQsIHVpZCk7CkBAIC0xNDUsNyArMTkzLDE5IEBACiAgICAgcmV0dXJuIG9rOwogfQogCi1ib29sIGNhcHR1cmVWb2ljZUNvbW11bmljYXRpb25PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Citib29sIGNhcHR1cmVUdW5lckF1ZGlvSW5wdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpOworICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZVR1bmVyQXVkaW9JbnB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfVFVORVJfQVVESU9fSU5QVVQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVUdW5lckF1ZGlvSW5wdXQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HVigiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9UVU5FUl9BVURJT19JTlBVVCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBjYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgdWlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVWb2ljZUNvbW1PdXRwdXQoCiAgICAgICAgICJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9WT0lDRV9DT01NVU5JQ0FUSU9OX09VVFBVVCIpOwpAQCAtMTU0LDE0ICsyMTQsMTggQEAKICAgICByZXR1cm4gb2s7CiB9CiAKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKICAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpOworICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKIAogICAgIGlmIChvaykgewogICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgICAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgICAgICBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQsIHBpZCwgdWlkKTsKKyAgICAgICAgLy8gVXNlIFBlcm1pc3Npb25DaGVja2VyLCB3aGljaCBpbmNsdWRlcyBzb21lIGxvZ2ljIGZvciBhbGxvd2luZyB0aGUgaXNvbGF0ZWQKKyAgICAgICAgLy8gSG90d29yZERldGVjdGlvblNlcnZpY2UgdG8gaG9sZCBjZXJ0YWluIHBlcm1pc3Npb25zLgorICAgICAgICBwZXJtaXNzaW9uOjpQZXJtaXNzaW9uQ2hlY2tlciBwZXJtaXNzaW9uQ2hlY2tlcjsKKyAgICAgICAgb2sgPSAocGVybWlzc2lvbkNoZWNrZXIuY2hlY2tQZXJtaXNzaW9uRm9yUHJlZmxpZ2h0KAorICAgICAgICAgICAgICAgIHNDYXB0dXJlSG90d29yZEFsbG93ZWQsIGF0dHJpYnV0aW9uU291cmNlLCBTdHJpbmcxNigpLAorICAgICAgICAgICAgICAgIEFwcE9wc01hbmFnZXI6Ok9QX05PTkUpICE9IHBlcm1pc3Npb246OlBlcm1pc3Npb25DaGVja2VyOjpQRVJNSVNTSU9OX0hBUkRfREVOSUVEKTsKICAgICB9CiAgICAgaWYgKCFvaykgQUxPR1YoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKICAgICByZXR1cm4gb2s7CkBAIC0xNzgsMTEgKzI0MiwxMiBAQAogfQogCiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoCi0gICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICByZXR1cm4gbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChnZXRDYWxsaW5nQXR0cmlidXRpb25Tb3VyY2UoKSk7CiB9CiAKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpOwogICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHJldHVybiB0cnVlOwogICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCiAgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmcsIHBpZCwgdWlkKTsKQEAgLTE5MiwxMSArMjU3LDEyIEBACiB9CiAKIGJvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSB7Ci0gICAgcmV0dXJuIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKAotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmV0dXJuIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpKTsKIH0KIAotYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSByZXR1cm4gdHJ1ZTsKIAogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoCkBAIC0yMTcsMTQgKzI4MywxOCBAQAogICAgIHJldHVybiBvazsKIH0KIAotYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworYm9vbCBtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKICAgICBBTE9HRV9JRighb2ssICJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzTW9kaWZ5UGhvbmVTdGF0ZSkuY19zdHIoKSk7CiAgICAgcmV0dXJuIG9rOwogfQogCiAvLyBwcml2aWxlZ2VkIGJlaGF2aW9yIG5lZWRlZCBieSBEaWFsZXIsIFNldHRpbmdzLCBTZXR1cFdpemFyZCBhbmQgQ2VsbEJyb2FkY2FzdFJlY2VpdmVyCi1ib29sIGJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKK2Jvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcGlkX3QgcGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc1dyaXRlU2VjdXJlU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiKTsKICAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKQogICAgICAgICB8fCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzV3JpdGVTZWN1cmVTZXR0aW5ncywgcGlkLCB1aWQpCkBAIC0yMzQsNiArMzA0LDIwIEBACiAgICAgcmV0dXJuIG9rOwogfQogCitBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpIHsKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlID0gQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSgpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX0ZBVEFMKGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoCisgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICByZXR1cm4gYXR0cmlidXRpb25Tb3VyY2U7Cit9CisKK3ZvaWQgcHVyZ2VQZXJtaXNzaW9uQ2FjaGUoKSB7CisgICAgUGVybWlzc2lvbkNhY2hlOjpwdXJnZUNhY2hlKCk7Cit9CisKIHN0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkKIHsKICAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CkBAIC0yNTksNyArMzQzLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IE1lZGlhUGFja2FnZU1hbmFnZXI6OnJldHJlaXZlUGFja2FnZU1hbmFnZXIoKSB7CitzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpyZXRyaWV2ZVBhY2thZ2VNYW5hZ2VyKCkgewogICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBpZiAoc20gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HVygiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBkZWZhdWx0U2VydmljZU1hbmFnZXIiLCBfX2Z1bmNfXyk7CkBAIC0yNzYsMjcgKzM2MCwyNyBAQAogc3RkOjpvcHRpb25hbDxib29sPiBNZWRpYVBhY2thZ2VNYW5hZ2VyOjpkb0lzQWxsb3dlZCh1aWRfdCB1aWQpIHsKICAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKICAgICAgICAgLyoqIENhbiBub3QgZmV0Y2ggcGFja2FnZSBtYW5hZ2VyIGF0IGNvbnN0cnVjdGlvbiBpdCBtYXkgbm90IHlldCBiZSByZWdpc3RlcmVkLiAqLwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHJldHJpZXZlUGFja2FnZU1hbmFnZXIoKTsKICAgICAgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGFzIHBhY2thZ2UgbWFuYWdlciBpcyBub3QgcmVhY2hhYmxlIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIFJldHJpZXZlIHBhY2thZ2UgbmFtZXMgZm9yIHRoZSBVSUQgYW5kIHRyYW5zZm9ybSB0byBhIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPi4KKyAgICBWZWN0b3I8U3RyaW5nMTY+IHN0cjE2UGFja2FnZU5hbWVzOworICAgIFBlcm1pc3Npb25Db250cm9sbGVye30uZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBzdHIxNlBhY2thZ2VOYW1lcyk7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhY2thZ2VOYW1lczsKLSAgICBhdXRvIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+Z2V0TmFtZXNGb3JVaWRzKHsoaW50MzJfdCl1aWR9LCAmcGFja2FnZU5hbWVzKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cjE2UGFja2FnZU5hbWUgOiBzdHIxNlBhY2thZ2VOYW1lcykgeworICAgICAgICBwYWNrYWdlTmFtZXMuZW1wbGFjZV9iYWNrKFN0cmluZzgoc3RyMTZQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwogICAgIH0KICAgICBpZiAocGFja2FnZU5hbWVzLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGZvciB1aWQgJXUgaXMgZGVuaWVkIGFzIG5vIHBhY2thZ2UgbmFtZSBjb3VsZCBiZSByZXRyaWV2ZWQgIgotICAgICAgICAgICAgICAiZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgImZyb20gdGhlIHBhY2thZ2UgbWFuYWdlci4iLCBfX2Z1bmNfXywgdWlkKTsKICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKICAgICB9CiAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4gaXNBbGxvd2VkOwotICAgIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+aXNBdWRpb1BsYXliYWNrQ2FwdHVyZUFsbG93ZWQocGFja2FnZU5hbWVzLCAmaXNBbGxvd2VkKTsKKyAgICBhdXRvIHN0YXR1cyA9IG1QYWNrYWdlTWFuYWdlci0+aXNBdWRpb1BsYXliYWNrQ2FwdHVyZUFsbG93ZWQocGFja2FnZU5hbWVzLCAmaXNBbGxvd2VkKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR1coIiVzOiBQbGF5YmFjayBjYXB0dXJlIGlzIGRlbmllZCBmb3IgdWlkICV1IGFzIHRoZSBtYW5pZmVzdCBwcm9wZXJ0eSBjb3VsZCBub3QgYmUgIgogICAgICAgICAgICAgICAicmV0cmlldmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcAppbmRleCA1OWQ3NGRlLi44MTllMTQ2IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwCisrKyBiL21lZGlhL3V0aWxzL1RpbWVDaGVjay5jcHAKQEAgLTM5LDEwICszOSw5IEBACiAgICAgc3RhdGljIHN0ZDo6YXRvbWljPGludD4gY3VyQXVkaW9IYWxQaWRzID0gMDsKIAogICAgIGlmICh1cGRhdGUpIHsKLSAgICAgICAgYXVkaW9IYWxQaWRzWyhjdXJBdWRpb0hhbFBpZHMgKyAxKSAlIGtOdW1BdWRpb0hhbFBpZHNWZWN0b3JzXSA9ICpwaWRzOwotICAgICAgICBjdXJBdWRpb0hhbFBpZHMrKzsKKyAgICAgICAgYXVkaW9IYWxQaWRzWyhjdXJBdWRpb0hhbFBpZHMrKyArIDEpICUga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnNdID0gKnBpZHM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKnBpZHMgPSBhdWRpb0hhbFBpZHNbY3VyQXVkaW9IYWxQaWRzXTsKKyAgICAgICAgKnBpZHMgPSBhdWRpb0hhbFBpZHNbY3VyQXVkaW9IYWxQaWRzICUga051bUF1ZGlvSGFsUGlkc1ZlY3RvcnNdOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjk4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIiwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmF0dGVyeXN0YXRzX2FpZGwiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWMrKzJhLWV4dGVuc2lvbnMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKKyAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfYmF0dGVyeV9ub3RpZmllciIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIkJhdHRlcnlOb3RpZmllckZ1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9zY2hlZHVsaW5nX3BvbGljeV9zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2VGdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfc2VydmljZV91dGlsaXRpZXMiLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX3RpbWVfY2hlY2siLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJUaW1lQ2hlY2tGdXp6LmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiM2NjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDMwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbmd0aCA9IDUwMDsKK3VzaW5nIGFuZHJvaWQ6OkJhdHRlcnlOb3RpZmllcjsKKworc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIC8qZmxhc2hsaWdodF9uYW1lKi8sIHN0ZDo6c3RyaW5nIC8qY2FtZXJhX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCAvKnZpZGVvX2lkKi8sIHVpZF90IC8qYXVkaW9faWQqLywgdWlkX3QgLypsaWdodF9pZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IC8qY2FtZXJhX2lkKi8pPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldENhbWVyYSgpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90IHZpZGVvX2lkLCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRWaWRlbyh2aWRlb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QgdmlkZW9faWQsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wVmlkZW8odmlkZW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCBhdWRpb19pZCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRBdWRpbyhhdWRpb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90IGF1ZGlvX2lkLCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8oYXVkaW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T24obmFtZSwgbGlnaHRfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T2ZmKG5hbWUsIGxpZ2h0X2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lLCB1aWRfdCwgdWlkX3QsIHVpZF90LCB1aWRfdCBjYW1lcmFfaWQpIC0+IHZvaWQgeworICAgICAgICAgICAgYW5kcm9pZDo6U3RyaW5nOCBuYW1lKGNhbWVyYV9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydENhbWVyYShuYW1lLCBjYW1lcmFfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgY2FtZXJhX25hbWUsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90IGNhbWVyYV9pZCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoY2FtZXJhX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BDYW1lcmEobmFtZSwgY2FtZXJhX2lkKTsKKyAgICAgICAgfSwKK307CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCk7CisgICAgdWlkX3QgdmlkZW9faWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICB1aWRfdCBhdWRpb19pZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHVpZF90IGxpZ2h0X2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgdWlkX3QgY2FtZXJhX2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKGZsYXNobGlnaHRfbmFtZSwgY2FtZXJhX25hbWUsIHZpZGVvX2lkLCBhdWRpb19pZCwgbGlnaHRfaWQsIGNhbWVyYV9pZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMGZlZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQmF0dGVyeU5vdGlmaWVyRnV6emVyIgorI2luY2x1ZGUgPGJhdHRlcnlzdGF0cy9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgordXNpbmcgYW5kcm9pZDo6SUJhdHRlcnlTdGF0czsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RDcHVzZXRCb29zdDsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eTsKK3NwPElCYXR0ZXJ5U3RhdHM+IGdldEJhdHRlcnlTZXJ2aWNlKCkgeworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZTsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgYmF0dGVyeVN0YXRTZXJ2aWNlID0gY2hlY2tlZF9pbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0U2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmF0dGVyeVN0YXRTZXJ2aWNlOworfQorZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlKCk7CisgICAgLy8gVGhlcmUgaXMgc29tZSBzdGF0ZSBoZXJlLCBidXQgaXQncyBtb3N0bHkgZm9jdXNlZCBhcm91bmQgdGhyZWFkLXNhZmV0eSwgc28KKyAgICAvLyB3ZSB3b24ndCB3b3JyeSBhYm91dCBvcmRlci4KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBib29sIGlzX2Zvcl9hcHAgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBhc3luYyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkKCksIGdldHRpZCgpLCBwcmlvcml0eSwgaXNfZm9yX2FwcCwgYXN5bmMpOworICAgIC8vIFRPRE86IFZlcmlmeSBhbmQgcmUtZW5hYmxlIGluIEFPU1AgKFIpLgorICAgIC8vIGJvb2wgZW5hYmxlID0gZGF0YV9wcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIC8vIFdlIGFyZSBqdXN0IHVzaW5nIGJhdHRlcnlzdGF0cyB0byBhdm9pZCB0aGUgbmVlZAorICAgIC8vIHRvIHJlZ2lzdGVyIGEgbmV3IHNlcnZpY2UuCisgICAgLy8gcmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgSUludGVyZmFjZTo6YXNCaW5kZXIoYmF0dGVyeVN0YXRTZXJ2aWNlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MjUxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDUwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbiA9IDI1NjsKKwordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKEZ1enplZERhdGFQcm92aWRlciosIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIpPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShGdXp6ZWREYXRhUHJvdmlkZXIqIGRhdGFfcHJvdmlkZXIsIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIgcG0pIC0+IHZvaWQgeworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YV9wcm92aWRlci0+Q29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgICAgICAgICAgcG0uYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhX3Byb3ZpZGVyLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBtKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIGludCBzcGFjZXMgPSBkYXRhX3Byb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50PigpOworCisgICAgICAgICAgICAvLyBEdW1wIGV2ZXJ5dGhpbmcgaW50byAvZGV2L251bGwKKyAgICAgICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fV1JPTkxZKTsKKyAgICAgICAgICAgIHBtLmR1bXAoZmQsIHNwYWNlcyk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0sCit9OworCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgaW50MzJfdCB1aWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIGludDMyX3QgcGlkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4oZGF0YV9wcm92aWRlcgorICAgICAgICAuQ29uc3VtZUludGVncmFsPHN0ZDo6dW5kZXJseWluZ190eXBlX3Q8YXVkaW9fc291cmNlX3Q+PigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lU3RyID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworICAgIHN0ZDo6c3RyaW5nIG1zZ1N0ciA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuKTsKKyAgICBhbmRyb2lkOjpTdHJpbmcxNiBtc2dTdHIxNihwYWNrYWdlTmFtZVN0ci5jX3N0cigpKTsKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVTdHI7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gdWlkOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IHBpZDsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkJCaW5kZXI+OjptYWtlKCk7CisKKyAgICAvLyBUaGVyZSBpcyBub3Qgc3RhdGUgaGVyZSwgYW5kIG9yZGVyIGlzIG5vdCBzaWduaWZpY2FudCwKKyAgICAvLyBzbyB3ZSBjYW4gc2ltcGx5IGNhbGwgYWxsIG9mIHRoZSB0YXJnZXQgZnVuY3Rpb25zCisgICAgYW5kcm9pZDo6aXNTZXJ2aWNlVWlkKHVpZCk7CisgICAgYW5kcm9pZDo6aXNBdWRpb1NlcnZlclVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKHVpZCk7CisgICAgYW5kcm9pZDo6cmVjb3JkaW5nQWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSk7CisgICAgYW5kcm9pZDo6c3RhcnRSZWNvcmRpbmcoYXR0cmlidXRpb25Tb3VyY2UsIG1zZ1N0cjE2LCBzb3VyY2UpOworICAgIGFuZHJvaWQ6OmZpbmlzaFJlY29yZGluZyhhdHRyaWJ1dGlvblNvdXJjZSwgc291cmNlKTsKKyAgICBhbmRyb2lkOjpjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBhbmRyb2lkOjpjYXB0dXJlTWVkaWFPdXRwdXRBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBhbmRyb2lkOjpjYXB0dXJlSG90d29yZEFsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpOworICAgIGFuZHJvaWQ6Om1vZGlmeVBob25lU3RhdGVBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBhbmRyb2lkOjpieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICBhbmRyb2lkOjpzZXR0aW5nc0FsbG93ZWQoKTsKKyAgICBhbmRyb2lkOjptb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7CisgICAgYW5kcm9pZDo6bW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKTsKKyAgICBhbmRyb2lkOjpkdW1wQWxsb3dlZCgpOworCisgICAgLy8gTWVkaWFQYWNrYWdlTWFuYWdlciBkb2VzIGhhdmUgc3RhdGUsIHNvIHdlIG5lZWQgdGhlIGZ1enplciB0byBkZWNpZGUgb3JkZXIKKyAgICBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBhY2thZ2VNYW5hZ2VyOworICAgIHNpemVfdCBvcHNfcnVuID0gMDsKKyAgICB3aGlsZSAoZGF0YV9wcm92aWRlci5yZW1haW5pbmdfYnl0ZXMoKSA+IDAgJiYgb3BzX3J1bisrIDwga01heE9wZXJhdGlvbnMpIHsKKyAgICAgICAgdWludDhfdCBvcCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50OF90PigwLCBvcGVyYXRpb25zLnNpemUoKSAtIDEpOworICAgICAgICBvcGVyYXRpb25zW29wXSgmZGF0YV9wcm92aWRlciwgcGFja2FnZU1hbmFnZXIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViNmJhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvVGltZUNoZWNrRnV6ei5jcHAKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorI2luY2x1ZGUgIm1lZGlhdXRpbHMvVGltZUNoZWNrLmgiCisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhTdHJpbmdMZW4gPSAyNTY7CisKKy8vIFdoaWxlIGl0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIHRlc3QgbG9uZy1ydW5uaW5nCisvLyBqb2JzLCBpdCBzZWVtcyB1bmxpa2VseSBpdCdkIGxlYWQgdG8gdGhlIHR5cGVzIG9mIGNyYXNoZXMKKy8vIHdlJ3JlIGxvb2tpbmcgZm9yLCBhbmQgd291bGQgbWVhbiBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIGZ1enplciB0aW1lLgorLy8gVGhlcmVmb3JlLCB3ZSBhcmUgc2V0dGluZyBhIGxvdyBjYXAuCitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhUaW1lb3V0TXMgPSAxMDAwOworc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrTWluVGltZW91dE1zID0gMjAwOworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgLy8gVGhlcmUncyBlc3NlbnRpYWxseSA1IG9wZXJhdGlvbnMgdGhhdCB3ZSBjYW4gYWNjZXNzIGluIHRoaXMgY2xhc3MKKyAgICAvLyAxLiBUaGUgdGltZSBpdCB0YWtlcyB0byBydW4gdGhpcyBvcGVyYXRpb24uIEFzIG1lbnRpb25lZCBhYm92ZSwKKyAgICAvLyAgICBsb25nLXJ1bm5pbmcgdGFza3MgYXJlIG5vdCBnb29kIGZvciBmdXp6aW5nLCBidXQgdGhlcmUgd2lsbCBiZQorICAgIC8vICAgIHNvbWUgY2hhbmdlIGluIHRoZSBydW4gdGltZS4KKyAgICB1aW50MzJfdCB0aW1lb3V0TXMgPQorICAgICAgICBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KGtNaW5UaW1lb3V0TXMsIGtNYXhUaW1lb3V0TXMpOworICAgIHVpbnQ4X3QgcGlkX3NpemUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50OF90PigpOworICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzKHBpZF9zaXplKTsKKyAgICBmb3IgKGF1dG8mIHBpZCA6IHBpZHMpIHsKKyAgICAgICAgcGlkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8cGlkX3Q+KCk7CisgICAgfQorCisgICAgLy8gMi4gV2UgYWxzbyBoYXZlIHNldEF1ZGlvSGFsUGlkcywgd2hpY2ggaXMgcG9wdWxhdGVkIHdpdGggdGhlIHBpZHMgc2V0CisgICAgLy8gYWJvdmUuCisgICAgYW5kcm9pZDo6VGltZUNoZWNrOjpzZXRBdWRpb0hhbFBpZHMocGlkcyk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuKTsKKworICAgIC8vIDMuIFRoZSBjb25zdHJ1Y3Rvciwgd2hpY2ggaXMgZnV6emVkIGhlcmU6CisgICAgYW5kcm9pZDo6VGltZUNoZWNrIHRpbWVDaGVjayhuYW1lLmNfc3RyKCksIHRpbWVvdXRNcyk7CisgICAgLy8gV2Ugd2lsbCBsZWF2ZSBzb21lIGJ1ZmZlciB0byBhdm9pZCBzbGVlcGluZyB0b28gbG9uZworICAgIHVpbnQ4X3Qgc2xlZXBfYW1vdW50X21zID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIHRpbWVvdXRNcyAvIDIpOworCisgICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgY2FuIGNvdmVyIHRoZSB0aW1lIG91dCBmdW5jdGlvbmFsaXR5LgorICAgIGlmIChzbGVlcF9hbW91bnRfbXMpIHsKKyAgICAgICAgYXV0byBtcyA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMoc2xlZXBfYW1vdW50X21zKTsKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKG1zKTsKKyAgICB9CisKKyAgICAvLyA0LiBGaW5hbGx5LCB0aGUgZGVzdHJ1Y3RvciBvbiB0aW1lY2hlY2suIFRoZXNlIHNlZW0gdG8gYmUgdGhlIG9ubHkgZmFjdG9ycworICAgIC8vIGluIHBsYXkuCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmgKaW5kZXggYTRlNDJhZC4uMzgxMmQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBNRURJQV9CQVRURVJZX05PVElGSUVSX0gKICNkZWZpbmUgTUVESUFfQkFUVEVSWV9OT1RJRklFUl9ICiAKLSNpbmNsdWRlIDxiaW5kZXIvSUJhdHRlcnlTdGF0cy5oPgorI2luY2x1ZGUgPGJhdHRlcnlzdGF0cy9JQmF0dGVyeVN0YXRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaAppbmRleCAyMTI1OTlhLi43MzQzMTNjIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTI0LDYgKzI0LDEwIEBACiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1oYWwtZW51bXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvcGVybWlzc2lvbi9QZXJtaXNzaW9uQ2hlY2tlci5oPgogCiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG9wdGlvbmFsPgpAQCAtMzMsNiArMzcsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKIC8vIEF1ZGlvIHBlcm1pc3Npb24gdXRpbGl0aWVzCiAKIC8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIHN5c3RlbSBzZXJ2aWNlcy4KQEAgLTc4LDIxICs4NCwzMCBAQAogICAgIH0KIH0KIAotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCk7Citib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgIGNvbnN0IFN0cmluZzE2JiBtc2csIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Cit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKK3N0ZDo6b3B0aW9uYWw8QXR0cmlidXRpb25Tb3VyY2VTdGF0ZT4gcmVzb2x2ZUF0dHJpYnV0aW9uU291cmNlKAorICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGNhbGxlckF0dHJpYnV0aW9uU291cmNlKTsKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7Citib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOworYm9vbCBjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7Citib29sIGNhcHR1cmVWb2ljZUNvbW11bmljYXRpb25PdXRwdXRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7CiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKIGJvb2wgZHVtcEFsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotYm9vbCBieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOworYm9vbCBieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKTsKK3ZvaWQgcHVyZ2VQZXJtaXNzaW9uQ2FjaGUoKTsKK2ludDMyX3QgZ2V0T3BGb3JTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKworQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBnZXRDYWxsaW5nQXR0cmlidXRpb25Tb3VyY2UoKTsKIAogc3RhdHVzX3QgY2hlY2tJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KTsKIApAQCAtMTEwLDcgKzEyNSw3IEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciogbmF0aXZlUGFja2FnZU1hbmFnZXJOYW1lID0gInBhY2thZ2VfbmF0aXZlIjsKICAgICBzdGQ6Om9wdGlvbmFsPGJvb2w+IGRvSXNBbGxvd2VkKHVpZF90IHVpZCk7Ci0gICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gcmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpOworICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHJldHJpZXZlUGFja2FnZU1hbmFnZXIoKTsKICAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFwcHMgbWFuaWZlc3QKICAgICB1aW50X3QgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzID0gMDsKICAgICBzdHJ1Y3QgUGFja2FnZSB7CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU3luY2hyb25pemF0aW9uLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU3luY2hyb25pemF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNDk2NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscyB7CisKKy8qKgorICogVGhlIExvY2tJdGVtIGNsYXNzIGludHJvZHVjZXMgYSBzaW1wbGUgdGVtcGxhdGUgd2hpY2ggbWltaWNzIGF0b21pYzxUPgorICogZm9yIG5vbi10cml2aWFsbHkgY29weWFibGUgdHlwZXMuICBGb3IgdHJpdmlhbGx5IGNvcHlhYmxlIHR5cGVzLAorICogdGhlIExvY2tJdGVtIHdpbGwgc3RhdGljYWxseSBhc3NlcnQgdGhhdCBhbiBhdG9taWM8VD4gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAqCisgKiBUaGUgZGVmYXVsdCBsb2NrIG11dGV4IGlzIHN0ZDo6bXV0ZXggd2hpY2ggaXMgc3VpdGFibGUgZm9yIGFsbCBidXQgcmFyZSBjYXNlcworICogZS5nLiByZWN1cnNpdmUgY29uc3RydWN0b3JzIHRoYXQgbWlnaHQgYmUgZm91bmQgaW4gdHJlZSBjb25zdHJ1Y3Rpb24sCisgKiBzZXR0ZXJzIHRoYXQgbWlnaHQgcmVjdXJzZSBvbnRvIHRoZSBzYW1lIG9iamVjdC4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgTCA9IHN0ZDo6bXV0ZXgsIGludCBGTEFHUyA9IDA+CitjbGFzcyBMb2NrSXRlbSB7Citwcm90ZWN0ZWQ6CisgICAgbXV0YWJsZSBMIG1Mb2NrOworICAgIG11dGFibGUgVCBtVDsKKworcHVibGljOgorICAgIGVudW0geworICAgICAgICAvLyBCZXN0IHByYWN0aWNlcyBmb3Igc21hcnQgcG9pbnRlcnMgYW5kIGNvbXBsZXggY29udGFpbmVycyBpcyB0byBtb3ZlIHRvIGEgdGVtcAorICAgICAgICAvLyBhbmQgaW52b2tlIGRlc3RydWN0b3Igb3V0c2lkZSBvZiBsb2NrLiAgVGhpcyByZWR1Y2VzIHRpbWUgdW5kZXIgbG9jayBhbmQgaW4KKyAgICAgICAgLy8gc29tZSBjYXNlcyBlbGltaW5hdGVzIGRlYWRsb2NrLgorICAgICAgICBGTEFHX0RUT1JfT1VUX09GX0xPQ0sgPSAxLAorICAgIH07CisKKyAgICAvLyBDaGVjayB0eXBlLCBzdWdnZXN0IHN0ZDo6YXRvbWljIGlmIHBvc3NpYmxlLgorICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlX3Y8VD4sCisgICAgICAgICAgICAidHlwZSBpcyB0cml2aWFsbHkgY29weWFibGUsIHBsZWFzZSB1c2Ugc3RkOjphdG9taWMgaW5zdGVhZCIpOworCisgICAgLy8gQWxsb3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXMgZXhwZWN0ZWQgZm9yIHNvbWUgdHlwZXMsIGUuZy4gc3AgLT4gd3AuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgTG9ja0l0ZW0oQXJncyYmLi4uIGFyZ3MpIDogbVQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSB7CisgICAgfQorCisgICAgLy8gTk9UIGNvcHkgb3IgbW92ZSAvIGFzc2lnbmFibGUgb3IgY29uc3RydWN0aWJsZS4KKworICAgIC8vIERvIG5vdCBlbmFibGUgdGhpcyBiZWNhdXNlIGl0IG1heSBsZWFkIHRvIGNvbmZ1c2lvbiBiZWNhdXNlIGl0IHJldHVybnMKKyAgICAvLyBhIGNvcHktdmFsdWUgbm90IGEgcmVmZXJlbmNlLgorICAgIC8vIG9wZXJhdG9yIFQoKSBjb25zdCB7IHJldHVybiBsb2FkKCk7IH0KKworICAgIC8vIGFueSBjb252ZXJzaW9uIGRvbmUgdW5kZXIgbG9jay4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB2b2lkIG9wZXJhdG9yPShVJiYgdSkgeworICAgICAgICBzdG9yZShzdGQ6OmZvcndhcmQ8VT4odSkpOworICAgIH0KKworICAgIC8vIHJldHVybnMgYSBjb3B5LXZhbHVlIG5vdCBhIHJlZmVyZW5jZS4KKyAgICBUIGxvYWQoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1UOworICAgIH0KKworICAgIC8vIGFueSBjb252ZXJzaW9uIGRvbmUgdW5kZXIgbG9jay4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB2b2lkIHN0b3JlKFUmJiB1KSB7CisgICAgICAgIGlmIGNvbnN0ZXhwciAoKEZMQUdTICYgRkxBR19EVE9SX09VVF9PRl9MT0NLKSAhPSAwKSB7CisgICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICBUIHRlbXAgPSBzdGQ6Om1vdmUobVQpOworICAgICAgICAgICAgIG1UID0gc3RkOjpmb3J3YXJkPFU+KHUpOworICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisgICAgICAgICAgICBtVCA9IHN0ZDo6Zm9yd2FyZDxVPih1KTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8qKgorICogYXRvbWljX3dwPD4gYW5kIGF0b21pY19zcDw+IGFyZSB1c2VkIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byBBbmRyb2lkCisgKiBzcDw+IGFuZCB3cDw+IHNtYXJ0IHBvaW50ZXJzLCBpbmNsdWRpbmcgdGhlaXIgbW9kaWZpZXJzLiAgV2UKKyAqIHJldHVybiBhIGNvcHkgb2YgdGhlIHNtYXJ0IHBvaW50ZXIgd2l0aCBsb2FkKCkuCisgKgorICogSGlzdG9yaWNhbDogVGhlIGltcG9ydGFuY2Ugb2YgYW4gYXRvbWljPHN0ZDo6c2hhcmVkX3B0cjxUPj4gY2xhc3MgaXMgZGVzY3JpYmVkCisgKiBieSBIZXJiIFN1dHRlciBpbiB0aGUgZm9sbG93aW5nIElTTyBkb2N1bWVudCBodHRwczovL2lzb2NwcC5vcmcvZmlsZXMvcGFwZXJzL040MTYyLnBkZgorICogYW5kIGlzIHBhcnQgb2YgQysrMjAuICBMb2NrIGZyZWUgdmVyc2lvbnMgb2YgYXRvbWljIHNtYXJ0IHBvaW50ZXJzIGFyZSBhdmFpbGFibGUKKyAqIHB1YmxpY2x5IGJ1dCB1c3VhbGx5IHJlcXVpcmUgc3BlY2lhbGl6ZWQgc21hcnQgcG9pbnRlciBzdHJ1Y3RzLgorICogU2VlIGFsc28gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL21lbW9yeS9zaGFyZWRfcHRyL2F0b21pYworICogYW5kIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9tZW1vcnkvc2hhcmVkX3B0ci9hdG9taWMyCisgKgorICogV2Ugb2ZmZXIgbG9jayBiYXNlZCBhdG9taWNfd3A8PiBhbmQgYXRvbWljX3NwPD4gb2JqZWN0cyBoZXJlLiBUaGlzIGlzIHVzZWZ1bCB0bworICogY29weSB0aGUgQW5kcm9pZCBzbWFydCBwb2ludGVyIHRvIGEgZGlmZmVyZW50IHZhcmlhYmxlIGZvciBzdWJzZXF1ZW50IGxvY2FsIGFjY2VzcywKKyAqIHdoZXJlIHRoZSBjaGFuZ2Ugb2YgdGhlIG9yaWdpbmFsIG9iamVjdCBhZnRlciBjb3B5IGlzIGFjY2VwdGFibGUuCisgKgorICogTm90ZTogSW5zdGVhZCBvZiBhdG9taWNzLCBpdCBpcyBvZnRlbiBwcmVmZXJyYWJsZSB0byBjcmVhdGUgYW4gZXhwbGljaXQgdmlzaWJsZSBsb2NrIHRvCisgKiBlbnN1cmUgY29tcGxldGUgdHJhbnNhY3Rpb24gY29uc2lzdGVuY3kuICBGb3IgZXhhbXBsZSwgb25lIG1pZ2h0IHdhbnQgdG8gZW5zdXJlCisgKiB0aGF0IHRoZSBtZXRob2QgY2FsbGVkIGZyb20gdGhlIHNtYXJ0IHBvaW50ZXIgaXMgYWxzbyBkb25lIHVuZGVyIGxvY2suCisgKiBUaGlzIG1heSBub3QgYmUgcG9zc2libGUgZm9yIGNhbGxiYWNrcyBkdWUgdG8gaW52ZXJ0ZWQgbG9jayBvcmRlcmluZy4KKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIGF0b21pY193cCA9IExvY2tJdGVtPDo6YW5kcm9pZDo6d3A8VD4+OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIGF0b21pY19zcCA9IExvY2tJdGVtPAorICAgICAgICA6OmFuZHJvaWQ6OnNwPFQ+LCBzdGQ6Om11dGV4LCBMb2NrSXRlbTw6OmFuZHJvaWQ6OnNwPFQ+Pjo6RkxBR19EVE9SX09VVF9PRl9MT0NLPjsKKworLyoqCisgKiBEZWZlcnMgYSBmdW5jdGlvbiB0byBydW4gaW4gdGhlIFJBSUkgZGVzdHJ1Y3Rvci4KKyAqIEEgQysrIGltcGxlbWVudGF0aW9uIG9mIEdvIF9kZWZlcl8gaHR0cHM6Ly9nb2xhbmdyLmNvbS9kZWZlci8uCisgKi8KK2NsYXNzIERlZmVyIHsKK3B1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICBleHBsaWNpdCBEZWZlcihVICYmZikgOiBtVGh1bmsoc3RkOjpmb3J3YXJkPFU+KGYpKSB7fQorICAgIH5EZWZlcigpIHsgbVRodW5rKCk7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gbVRodW5rOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6bWVkaWF1dGlscworCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkzZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJtZWRpYV9zeW5jaHJvbml6YXRpb25fdGVzdHMiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9zeW5jaHJvbml6YXRpb25fdGVzdHMuY3BwIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvdGVzdHMvbWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzLmNwcCBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3N5bmNocm9uaXphdGlvbl90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5NzY4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL3Rlc3RzL21lZGlhX3N5bmNocm9uaXphdGlvbl90ZXN0cy5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzIgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhdXRpbHM7CisKKy8vIFNpbXBsZSBUZXN0IENsYXNzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIE15T2JqZWN0IDogcHVibGljIFJlZkJhc2UgeworICAgIFQgdmFsdWVfOworICBwdWJsaWM6CisgICAgTXlPYmplY3QoY29uc3QgVCYgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQorICAgIE15T2JqZWN0KGNvbnN0IE15T2JqZWN0PFQ+JiBtbykgOiB2YWx1ZV8obW8uZ2V0KCkpIHt9CisgICAgVCBnZXQoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKyAgICB2b2lkIHNldChjb25zdCBUJiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorfTsKKworVEVTVChtZWRpYV9zeW5jaHJvbml6YXRpb25fdGVzdHMsIGF0b21pY193cCkgeworICBzcDxNeU9iamVjdDxpbnQ+PiByZWZvYmogPSBuZXcgTXlPYmplY3Q8aW50PigyMCk7CisgIGF0b21pY193cDxNeU9iamVjdDxpbnQ+PiB3cG9iaiA9IHJlZm9iajsKKworICAvLyB3ZSBjYW4gcHJvbW90ZS4KKyAgQVNTRVJUX0VRKDIwLCB3cG9iai5sb2FkKCkucHJvbW90ZSgpLT5nZXQoKSk7CisKKyAgLy8gc2FtZSB1bmRlcmx5aW5nIG9iamVjdCBmb3Igc3AgYW5kIGF0b21pY193cC4KKyAgQVNTRVJUX0VRKHJlZm9iai5nZXQoKSwgd3BvYmoubG9hZCgpLnByb21vdGUoKS5nZXQoKSk7CisKKyAgLy8gYmVoYXZpb3IgaXMgY29uc2lzdGVudCB3aXRoIHNhbWUgdW5kZXJseWluZyBvYmplY3QuCisgIHdwb2JqLmxvYWQoKS5wcm9tb3RlKCktPnNldCgxMCk7CisgIEFTU0VSVF9FUSgxMCwgcmVmb2JqLT5nZXQoKSk7CisgIHJlZm9iai0+c2V0KDUpOworICBBU1NFUlRfRVEoNSwgd3BvYmoubG9hZCgpLnByb21vdGUoKS0+Z2V0KCkpOworCisgIC8vIHdlIGNhbiBjbGVhciBvdXIgd2VhayBwdHIuCisgIHdwb2JqID0gbnVsbHB0cjsKKyAgQVNTRVJUX0VRKG51bGxwdHIsIHdwb2JqLmxvYWQoKS5wcm9tb3RlKCkpOworCisgIC8vIGRpZG4ndCBhZmZlY3Qgb3VyIG9yaWdpbmFsIG9iai4KKyAgQVNTRVJUX05FKG51bGxwdHIsIHJlZm9iai5nZXQoKSk7Cit9CisKK1RFU1QobWVkaWFfc3luY2hyb25pemF0aW9uX3Rlc3RzLCBhdG9taWNfc3ApIHsKKyAgc3A8TXlPYmplY3Q8aW50Pj4gcmVmb2JqID0gbmV3IE15T2JqZWN0PGludD4oMjApOworICBhdG9taWNfc3A8TXlPYmplY3Q8aW50Pj4gc3BvYmogPSByZWZvYmo7CisKKyAgLy8gc2FtZSB1bmRlcmx5aW5nIG9iamVjdCBmb3Igc3AgYW5kIGF0b21pY19zcC4KKyAgQVNTRVJUX0VRKHJlZm9iai5nZXQoKSwgc3BvYmoubG9hZCgpLmdldCgpKTsKKworICAvLyBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggc2FtZSB1bmRlcmx5aW5nIG9iamVjdC4KKyAgQVNTRVJUX0VRKDIwLCBzcG9iai5sb2FkKCktPmdldCgpKTsKKyAgc3BvYmoubG9hZCgpLT5zZXQoMTApOworICBBU1NFUlRfRVEoMTAsIHJlZm9iai0+Z2V0KCkpOworICByZWZvYmotPnNldCg1KTsKKyAgQVNTRVJUX0VRKDUsIHNwb2JqLmxvYWQoKS0+Z2V0KCkpOworCisgIC8vIHdlIGNhbiBjbGVhciBzcG9iai4KKyAgc3BvYmogPSBudWxscHRyOworICBBU1NFUlRfRVEobnVsbHB0ciwgc3BvYmoubG9hZCgpLmdldCgpKTsKKworICAvLyBkaWRuJ3QgYWZmZWN0IG91ciBvcmlnaW5hbCBvYmouCisgIEFTU0VSVF9ORShudWxscHRyLCByZWZvYmouZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IDY2YTRiY2IuLmYwYjVlMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTUsMyArNSw1IEBACiBna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIG1hcmNvbmVAZ29vZ2xlLmNvbQorbmNoYWxrb0Bnb29nbGUuY29tCitxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCmluZGV4IDM4NzM2MDAuLmI5MWYzMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMjQgQEAKIAogCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfYXVkaW9mbGluZ2VyX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2F1ZGlvZmxpbmdlcl9saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF1ZGlvZmxpbmdlciIsCiAKQEAgLTM1LDYgKzU0LDExIEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9jbGllbnQtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiYXYtdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiZWZmZWN0LWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAogICAgICAgICAibGliYXVkaW9oYWwiLAogICAgICAgICAibGliYXVkaW9wcm9jZXNzaW5nIiwKQEAgLTUwLDIzICs3NCwzMSBAQAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJuYmFpbyIsCiAgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJzaG1lbWNvbXBhdCIsCiAgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjcHVzdGF0cyIsCiAgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJwZXJtaXNzaW9uIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPVwiU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcFwiIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBmMDE0MjA5Li42NWExNjNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHRocmVhZD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtNDMsNiArNDQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPG1lbXVucmVhY2hhYmxlL21lbXVucmVhY2hhYmxlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CkBAIC02MSwxMiArNjMsMTUgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9ucy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKICNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvUG93ZXJNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZhbGlkYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KQEAgLTk3LDYgKzEwMiw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgbWVkaWE6OklFZmZlY3RDbGllbnQ7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCiBzdGF0aWMgY29uc3QgY2hhciBrRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvRmxpbmdlciBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIGtIYXJkd2FyZUxvY2tlZFN0cmluZ1tdID0gIkhhcmR3YXJlIGxvY2sgaXMgdGFrZW5cbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrQ2xpZW50TG9ja2VkU3RyaW5nW10gPSAiQ2xpZW50IGxvY2sgaXMgdGFrZW5cbiI7CkBAIC0xMTEsOSArMTE5LDYgQEAKIC8vIHdlIGRlZmluZSBhIG1pbmltdW0gdGltZSBkdXJpbmcgd2hpY2ggYSBnbG9iYWwgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZW5hYmxlZC4KIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5HbG9iYWxFZmZlY3RFbmFibGV0aW1lTnMgPSBzZWNvbmRzKDcyMDApOwogCi1NdXRleCBnTG9jazsKLXdwPEF1ZGlvRmxpbmdlcj4gZ0F1ZGlvRmxpbmdlcjsKLQogLy8gS2VlcCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gbWVkaWEubG9nIHNlcnZpY2UgYXJvdW5kIGZvcmV2ZXIuCiAvLyBUaGUgc2VydmljZSBpcyB3aXRoaW4gb3VyIHBhcmVudCBwcm9jZXNzIHNvIGl0IGNhbiBuZXZlciBkaWUgaW4gYSB3YXkgdGhhdCB3ZSBjb3VsZCBvYnNlcnZlLgogLy8gVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgY29uc3QgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCkBAIC0xNTgsNiArMTYzLDM0IEBACiAgICAgfQogfTsKIAorLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCisvKiBzdGF0aWMgKi8KK0F0dHJpYnV0aW9uU291cmNlU3RhdGUgQXVkaW9GbGluZ2VyOjpjaGVja0F0dHJpYnV0aW9uU291cmNlUGFja2FnZSgKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgIFBlcm1pc3Npb25Db250cm9sbGVye30uZ2V0UGFja2FnZXNGb3JVaWQoYXR0cmlidXRpb25Tb3VyY2UudWlkLCBwYWNrYWdlcyk7CisKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGNoZWNrZWRBdHRyaWJ1dGlvblNvdXJjZSA9IGF0dHJpYnV0aW9uU291cmNlOworICAgIGlmICghYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUuaGFzX3ZhbHVlKCkKKyAgICAgICAgICAgIHx8IGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKCFwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNoZWNrZWRBdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZSA9CisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGxlZ2FjeTJhaWRsX1N0cmluZzE2X3N0cmluZyhwYWNrYWdlc1swXSkudmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VMZWdhY3kgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlX29yKCIiKSkpOworICAgICAgICBpZiAoc3RkOjpmaW5kX2lmKHBhY2thZ2VzLmJlZ2luKCksIHBhY2thZ2VzLmVuZCgpLAorICAgICAgICAgICAgICAgIFsmb3BQYWNrYWdlTGVnYWN5XShjb25zdCBhdXRvJiBwYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wUGFja2FnZUxlZ2FjeSA9PSBwYWNrYWdlOyB9KSA9PSBwYWNrYWdlcy5lbmQoKSkgeworICAgICAgICAgICAgQUxPR1coIlRoZSBwYWNrYWdlIG5hbWUoJXMpIHByb3ZpZGVkIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlX29yKCIiKS5jX3N0cigpLCBhdHRyaWJ1dGlvblNvdXJjZS51aWQpOworICAgICAgICAgICAgY2hlY2tlZEF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gc3RkOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4oKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hlY2tlZEF0dHJpYnV0aW9uU291cmNlOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0ZDo6c3RyaW5nIGZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTY4LDkgKzIwMSwxNSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjppbnN0YW50aWF0ZSgpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBzbS0+YWRkU2VydmljZShTdHJpbmcxNihJQXVkaW9GbGluZ2VyOjpERUZBVUxUX1NFUlZJQ0VfTkFNRSksCisgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvRmxpbmdlclNlcnZlckFkYXB0ZXIobmV3IEF1ZGlvRmxpbmdlcigpKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgSVNlcnZpY2VNYW5hZ2VyOjpEVU1QX0ZMQUdfUFJJT1JJVFlfREVGQVVMVCk7Cit9CisKIEF1ZGlvRmxpbmdlcjo6QXVkaW9GbGluZ2VyKCkKLSAgICA6IEJuQXVkaW9GbGluZ2VyKCksCi0gICAgICBtTWVkaWFMb2dOb3RpZmllcihuZXcgQXVkaW9GbGluZ2VyOjpNZWRpYUxvZ05vdGlmaWVyKCkpLAorICAgIDogbU1lZGlhTG9nTm90aWZpZXIobmV3IEF1ZGlvRmxpbmdlcjo6TWVkaWFMb2dOb3RpZmllcigpKSwKICAgICAgIG1QcmltYXJ5SGFyZHdhcmVEZXYoTlVMTCksCiAgICAgICBtQXVkaW9Id0RldnMoTlVMTCksCiAgICAgICBtSGFyZHdhcmVTdGF0dXMoQVVESU9fSFdfSURMRSksCkBAIC0xODgsMTMgKzIyNywzMCBAQAogICAgICAgbURldmljZUVmZmVjdE1hbmFnZXIodGhpcyksCiAgICAgICBtU3lzdGVtUmVhZHkoZmFsc2UpCiB7CisgICAgLy8gTW92ZSB0aGUgYXVkaW8gc2Vzc2lvbiB1bmlxdWUgSUQgZ2VuZXJhdG9yIHN0YXJ0IGJhc2UgYXMgdGltZSBwYXNzZXMgdG8gbGltaXQgcmlzayBvZgorICAgIC8vIGdlbmVyYXRpbmcgdGhlIHNhbWUgSUQgYWdhaW4gYWZ0ZXIgYW4gYXVkaW9zZXJ2ZXIgcmVzdGFydC4KKyAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGNsaWVudHMgd2lsbCByZXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBhdWRpbyBzZXNzaW9uIElEcworICAgIC8vIHdoZW4gcmVjb25uZWN0aW5nIGFmdGVyIGFuIGF1ZGlvc2VydmVyIHJlc3RhcnQgYW5kIG5ld2x5IGFsbG9jYXRlZCBJRHMgbWF5IGNvbmZsaWN0IHdpdGgKKyAgICAvLyBhY3RpdmUgY2xpZW50cy4KKyAgICAvLyBNb3ZpbmcgdGhlIGJhc2UgYnkgMSBmb3IgZWFjaCBlbGFwc2VkIHNlY29uZCBpcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGF2b2lkaW5nIG92ZXJsYXAKKyAgICAvLyBiZXR3ZWVuIGFsbG9jYXRpb24gcmFuZ2VzIGFuZCBub3QgcmVhY2hpbmcgd3JhcCBhcm91bmQgdG9vIHNvb24uCisgICAgdGltZXNwZWMgdHN7fTsKKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICAvLyB6ZXJvIElEIGhhcyBhIHNwZWNpYWwgbWVhbmluZywgc28gc3RhcnQgYWxsb2NhdGlvbiBhdCBsZWFzdCBhdCBBVURJT19VTklRVUVfSURfVVNFX01BWAorICAgIHVpbnQzMl90IG1vdmluZ0Jhc2UgPSAodWludDMyX3Qpc3RkOjptYXgoKGxvbmcpMSwgdHMudHZfc2VjKTsKICAgICAvLyB1bnNpZ25lZCBpbnN0ZWFkIG9mIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCwgYmVjYXVzZSArKyBvcGVyYXRvciBpcyB1bmF2YWlsYWJsZSBmb3IgZW51bQogICAgIGZvciAodW5zaWduZWQgdXNlID0gQVVESU9fVU5JUVVFX0lEX1VTRV9VTlNQRUNJRklFRDsgdXNlIDwgQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7IHVzZSsrKSB7Ci0gICAgICAgIC8vIHplcm8gSUQgaGFzIGEgc3BlY2lhbCBtZWFuaW5nLCBzbyB1bmF2YWlsYWJsZQotICAgICAgICBtTmV4dFVuaXF1ZUlkc1t1c2VdID0gQVVESU9fVU5JUVVFX0lEX1VTRV9NQVg7CisgICAgICAgIG1OZXh0VW5pcXVlSWRzW3VzZV0gPQorICAgICAgICAgICAgICAgICgodXNlID09IEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTiB8fCB1c2UgPT0gQVVESU9fVU5JUVVFX0lEX1VTRV9DTElFTlQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1vdmluZ0Jhc2UgOiAxKSAqIEFVRElPX1VOSVFVRV9JRF9VU0VfTUFYOwogICAgIH0KIAorI2lmIDEKKyAgICAvLyBGSVhNRSBTZWUgYnVnIDE2NTcwMjM5NCBhbmQgYnVnIDE2ODUxMTQ4NQorICAgIGNvbnN0IGJvb2wgZG9Mb2cgPSBmYWxzZTsKKyNlbHNlCiAgICAgY29uc3QgYm9vbCBkb0xvZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCBmYWxzZSk7CisjZW5kaWYKICAgICBpZiAoZG9Mb2cpIHsKICAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwKICAgICAgICAgICAgICAgICBNZW1vcnlIZWFwQmFzZTo6UkVBRF9PTkxZKTsKQEAgLTI0MCw3ICsyOTYsNyBAQAogCiAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKIAotICAgIGdBdWRpb0ZsaW5nZXIgPSB0aGlzOworICAgIGdBdWRpb0ZsaW5nZXIgPSB0aGlzOyAgLy8gd2UgYXJlIGFscmVhZHkgcmVmY291bnRlZCwgc3RvcmUgaW50byBhdG9taWMgcG9pbnRlci4KIAogICAgIG1EZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrID0gbmV3IERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2tJbXBsOwogICAgIG1EZXZpY2VzRmFjdG9yeUhhbC0+c2V0Q2FsbGJhY2tPbmNlKG1EZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrKTsKQEAgLTI1MSw2ICszMDcsNDIgQEAKICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFZpYnJhdG9ySW5mb3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1BdWRpb1ZpYnJhdG9ySW5mb3MgPSB2aWJyYXRvckluZm9zOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjp1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiBbdHJhY2tJZCwgc2Vjb25kYXJ5T3V0cHV0c10gOiB0cmFja1NlY29uZGFyeU91dHB1dHMpIHsKKyAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICBmb3IgKDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3RsKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjayA9IHRocmVhZC0+Z2V0VHJhY2tCeUlkX2wodHJhY2tJZCk7CisgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcyB0cmFja0lkOiAldSIsIF9fZnVuY19fLCB0cmFja0lkKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzRm9yVHJhY2tfbCh0cmFjay5nZXQoKSwgdGhyZWFkLCBzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HV19JRihpID49IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGZpbmQgdHJhY2sgd2l0aCBpZCAldSIsIF9fZnVuY19fLCB0cmFja0lkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvLyBnZXREZWZhdWx0VmlicmF0b3JJbmZvX2wgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXIgbG9jayBoZWxkLgorY29uc3QgbWVkaWE6OkF1ZGlvVmlicmF0b3JJbmZvKiBBdWRpb0ZsaW5nZXI6OmdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpIHsKKyAgICBpZiAobUF1ZGlvVmlicmF0b3JJbmZvcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gJm1BdWRpb1ZpYnJhdG9ySW5mb3MuZnJvbnQoKTsKK30KKwogQXVkaW9GbGluZ2VyOjp+QXVkaW9GbGluZ2VyKCkKIHsKICAgICB3aGlsZSAoIW1SZWNvcmRUaHJlYWRzLmlzRW1wdHkoKSkgewpAQCAtMjk3LDExICszODksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8TW1hcFN0cmVhbUludGVyZmFjZT4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKIHsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKLSAgICAgICAgYWYgPSBnQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICB9CisgICAgLy8gVE9ETzogVXNlIFNlcnZpY2VNYW5hZ2VyIHRvIGdldCBJQXVkaW9GbGluZ2VyIGluc3RlYWQgb2YgYnkgYXRvbWljIHBvaW50ZXIuCisgICAgLy8gVGhpcyBhbGxvd3MgbW92aW5nIG9ib2VzZXJ2aWNlIChBQXVkaW8pIHRvIGEgc2VwYXJhdGUgcHJvY2VzcyBpbiB0aGUgZnV0dXJlLgorICAgIHNwPEF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb0ZsaW5nZXI6OmdBdWRpb0ZsaW5nZXIubG9hZCgpOyAgLy8gZWl0aGVyIG51bGxwdHIgb3Igc2luZ2xldG9uIEFGLgogICAgIHN0YXR1c190IHJldCA9IE5PX0lOSVQ7CiAgICAgaWYgKGFmICE9IDApIHsKICAgICAgICAgcmV0ID0gYWYtPm9wZW5NbWFwU3RyZWFtKApAQCAtMzQyLDcgKzQzMiw3IEBACiAKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1UeXBlLCBjbGllbnQuY2xpZW50UGlkLCBjbGllbnQuY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLApAQCAtMzUzLDkgKzQ0Myw3IEBACiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ09SRF9SSUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQucGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEsIGRldmljZUlkLCAmcG9ydElkKTsKICAgICB9CkBAIC0zOTEsMTQgKzQ3OSwxOSBAQAogLyogc3RhdGljICovCiBpbnQgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKICAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOwotICAgIGlmIChldnMgIT0gMCkgeworICAgIGlmIChldnMgIT0gbnVsbHB0cikgewogICAgICAgICBpbnQzMl90IHJldDsKICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gZXZzLT5vbkV4dGVybmFsVmlicmF0aW9uU3RhcnQoKmV4dGVybmFsVmlicmF0aW9uLCAmcmV0KTsKICAgICAgICAgaWYgKHN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcywgc3RhcnQgZXh0ZXJuYWwgdmlicmF0aW9uIHdpdGggaW50ZW5zaXR5IGFzICVkIiwgX19mdW5jX18sIHJldCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKKyAgICBBTE9HRCgiJXMsIHN0YXJ0IGV4dGVybmFsIHZpYnJhdGlvbiB3aXRoIGludGVuc2l0eSBhcyBNVVRFIGR1ZSB0byAlcyIsCisgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgIGV2cyA9PSBudWxscHRyID8gImV4dGVybmFsIHZpYnJhdGlvbiBzZXJ2aWNlIG5vdCBmb3VuZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImVycm9yIHdoZW4gcXVlcnlpbmcgaW50ZW5zaXR5Iik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ob3M6OkhhcHRpY1NjYWxlOjpNVVRFKTsKIH0KIAogLyogc3RhdGljICovCkBAIC02ODQsOCArNzc3LDggQEAKIAogc3A8TkJMb2c6OldyaXRlcj4gQXVkaW9GbGluZ2VyOjpuZXdXcml0ZXJfbChzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICAvLyBJZiB0aGVyZSBpcyBubyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2dzLCByZXR1cm4gYSBkdW1teSB3cml0ZXIgdGhhdCBkb2VzIG5vdGhpbmcuCi0gICAgLy8gU2ltaWxhcmx5IGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIG1lZGlhLmxvZyBzZXJ2aWNlLCBhbHNvIHJldHVybiBhIGR1bW15IHdyaXRlci4KKyAgICAvLyBJZiB0aGVyZSBpcyBubyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsb2dzLCByZXR1cm4gYSBuby1vcCB3cml0ZXIgdGhhdCBkb2VzIG5vdGhpbmcuCisgICAgLy8gU2ltaWxhcmx5IGlmIHdlIGNhbid0IGNvbnRhY3QgdGhlIG1lZGlhLmxvZyBzZXJ2aWNlLCBhbHNvIHJldHVybiBhIG5vLW9wIHdyaXRlci4KICAgICBpZiAobUxvZ01lbW9yeURlYWxlciA9PSAwIHx8IHNNZWRpYUxvZ1NlcnZpY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gbmV3IE5CTG9nOjpXcml0ZXIoKTsKICAgICB9CkBAIC03MTEsNyArODA0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBFdmVuIGFmdGVyIGdhcmJhZ2UtY29sbGVjdGluZyBhbGwgb2xkIHdyaXRlcnMsIHRoZXJlIGlzIHN0aWxsIG5vdCBlbm91Z2ggbWVtb3J5LAotICAgICAgICAvLyBzbyByZXR1cm4gYSBkdW1teSB3cml0ZXIKKyAgICAgICAgLy8gc28gcmV0dXJuIGEgbm8tb3Agd3JpdGVyCiAgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KIHN1Y2Nlc3M6CkBAIC03MzksMTAgKzgzMiwxMyBAQAogCiAvLyBJQXVkaW9GbGluZ2VyIGludGVyZmFjZQogCi1zcDxJQXVkaW9UcmFjaz4gQXVkaW9GbGluZ2VyOjpjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVRyYWNrT3V0cHV0JiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpjcmVhdGVUcmFjayhjb25zdCBtZWRpYTo6Q3JlYXRlVHJhY2tSZXF1ZXN0JiBfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlJiBfb3V0cHV0KQogeworICAgIC8vIExvY2FsIHZlcnNpb24gb2YgVkFMVUVfT1JfUkVUVVJOLCBzcGVjaWZpYyB0byB0aGlzIG1ldGhvZCdzIGNhbGxpbmcgY29udmVudGlvbnMuCisgICAgQ3JlYXRlVHJhY2tJbnB1dCBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoQ3JlYXRlVHJhY2tJbnB1dDo6ZnJvbUFpZGwoX2lucHV0KSk7CisgICAgQ3JlYXRlVHJhY2tPdXRwdXQgb3V0cHV0OworCiAgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiB0cmFjazsKICAgICBzcDxUcmFja0hhbmRsZT4gdHJhY2tIYW5kbGU7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQ7CkBAIC03NTEsMjcgKzg0NywzMyBAQAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKIAotICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNTUzOiByZWZhY3RvciBvciBtYWtlIGNsZWFyZXIKKyAgICBwaWRfdCBjbGllbnRQaWQgPQorICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoaW5wdXQuY2xpZW50SW5mby5hdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICBib29sIHVwZGF0ZVBpZCA9IChjbGllbnRQaWQgPT0gKHBpZF90KS0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIHVpZF90IGNsaWVudFVpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50VWlkOworICAgIHVpZF90IGNsaWVudFVpZCA9CisgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChpbnB1dC5jbGllbnRJbmZvLmF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGVmZmVjdFRocmVhZElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBlZmZlY3RJZHM7CiAgICAgYXVkaW9fYXR0cmlidXRlc190IGxvY2FsQXR0ciA9IGlucHV0LmF0dHI7CiAKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGFkakF0dHJpYnV0aW9uU291cmNlID0gaW5wdXQuY2xpZW50SW5mby5hdHRyaWJ1dGlvblNvdXJjZTsKICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CisgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChjYWxsaW5nVWlkKSk7CiAgICAgICAgIGNsaWVudFVpZCA9IGNhbGxpbmdVaWQ7CiAgICAgICAgIHVwZGF0ZVBpZCA9IHRydWU7CiAgICAgfQotICAgIHBpZF90IGNsaWVudFBpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkOwogICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKHVwZGF0ZVBpZCkgewotICAgICAgICBBTE9HV19JRihjbGllbnRQaWQgIT0gLTEgJiYgY2xpZW50UGlkICE9IGNhbGxpbmdQaWQsCisgICAgICAgIEFMT0dXX0lGKGNsaWVudFBpZCAhPSAocGlkX3QpLTEgJiYgY2xpZW50UGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLAogICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50UGlkKTsKICAgICAgICAgY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKKyAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGNhbGxpbmdQaWQpKTsKICAgICB9CiAKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gaW5wdXQuc2Vzc2lvbklkOwpAQCAtNzg2LDcgKzg4OCw3IEBACiAgICAgb3V0cHV0Lm91dHB1dElkID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOwogICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmb3V0cHV0Lm91dHB1dElkLCBzZXNzaW9uSWQsICZzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgJmlucHV0LmNvbmZpZywgaW5wdXQuZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLCAmaW5wdXQuY29uZmlnLCBpbnB1dC5mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKQEAgLTg0NSwxMyArOTQ3LDE0IEBACiAgICAgICAgIG91dHB1dC5mcmFtZUNvdW50ID0gaW5wdXQuZnJhbWVDb3VudDsKICAgICAgICAgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgICAgICBvdXRwdXQuZmxhZ3MgPSBpbnB1dC5mbGFnczsKKyAgICAgICAgb3V0cHV0LnN0cmVhbVR5cGUgPSBzdHJlYW1UeXBlOwogCiAgICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgbG9jYWxBdHRyLCAmb3V0cHV0LnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuZnJhbWVDb3VudCwgJm91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5ub3RpZmljYXRpb25zUGVyQnVmZmVyLCBpbnB1dC5zcGVlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc2hhcmVkQnVmZmVyLCBzZXNzaW9uSWQsICZvdXRwdXQuZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGFkakF0dHJpYnV0aW9uU291cmNlLCBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCwgaW5wdXQuYXVkaW9UcmFja0NhbGxiYWNrKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigobFN0YXR1cyA9PSBOT19FUlJPUikgJiYgKHRyYWNrID09IDApKTsKICAgICAgICAgLy8gd2UgZG9uJ3QgYWJvcnQgeWV0IGlmIGxTdGF0dXMgIT0gTk9fRVJST1I7IHRoZXJlIGlzIHN0aWxsIHdvcmsgdG8gYmUgZG9uZSByZWdhcmRsZXNzCkBAIC04NjUsODggKzk2OCw3IEBACiAgICAgICAgICAgICAvLyBDb25uZWN0IHNlY29uZGFyeSBvdXRwdXRzLiBGYWlsdXJlIG9uIGEgc2Vjb25kYXJ5IG91dHB1dCBtdXN0IG5vdCBpbXBlZCB0aGUgcHJpbWFyeQogICAgICAgICAgICAgLy8gQW55IHNlY29uZGFyeSBvdXRwdXQgc2V0dXAgZmFpbHVyZSB3aWxsIGxlYWQgdG8gYSBkZXN5bmMgYmV0d2VlbiB0aGUgQVAgYW5kIEFGIHVudGlsCiAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgaXMgZGVzdHJveWVkLgotICAgICAgICAgICAgVGVlUGF0Y2hlcyB0ZWVQYXRjaGVzOwotICAgICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzZWNvbmRhcnlPdXRwdXQgOiBzZWNvbmRhcnlPdXRwdXRzKSB7Ci0gICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnNlY29uZGFyeVRocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzZWNvbmRhcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIGlmIChzZWNvbmRhcnlUaHJlYWQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBzZWNvbmRhcnkgb3V0cHV0ICVkIiwgb3V0cHV0Lm91dHB1dElkKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2l6ZV90IHNvdXJjZUZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIG91dHB1dC5zYW1wbGVSYXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHRocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgICAgICAgICAgICAgIHNpemVfdCBzaW5rRnJhbWVDb3VudCA9IHNlY29uZGFyeVRocmVhZC0+ZnJhbWVDb3VudCgpICogb3V0cHV0LnNhbXBsZVJhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gc2Vjb25kYXJ5VGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlY29uZGFyeSBvdXRwdXQgaGFzIGp1c3QgYmVlbiBvcGVuZWQsIHRoZSBmaXJzdCBzZWNvbmRhcnlUaHJlYWQgd3JpdGUKLSAgICAgICAgICAgICAgICAvLyB3aWxsIG5vdCBibG9jayBhcyBpdCB3aWxsIGZpbGwgdGhlIGVtcHR5IHN0YXJ0dXAgYnVmZmVyIG9mIHRoZSBIQUwsCi0gICAgICAgICAgICAgICAgLy8gc28gYSBzZWNvbmQgc2luayBidWZmZXIgbmVlZHMgdG8gYmUgcmVhZHkgZm9yIHRoZSBpbW1lZGlhdGUgbmV4dCBibG9ja2luZyB3cml0ZS4KLSAgICAgICAgICAgICAgICAvLyBBZGRpdGlvbmFsbHksIGhhdmUgYSBtYXJnaW4gb2Ygb25lIG1haW4gdGhyZWFkIGJ1ZmZlciBhcyB0aGUgc2NoZWR1bGluZyBqaXR0ZXIKLSAgICAgICAgICAgICAgICAvLyBjYW4gcmVvcmRlciB0aGUgd3JpdGVzIChlZyBpZiB0aHJlYWQgQSZCIGhhdmUgdGhlIHNhbWUgd3JpdGUgaW50ZXJ2YWxlLAotICAgICAgICAgICAgICAgIC8vIHRoZSBzY2hlZHVsZXIgY291bGQgc2NoZWR1bGUgQUIuLi5CQSkKLSAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IDIgKiBzaW5rRnJhbWVDb3VudCArIHNvdXJjZUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgLy8gVG90YWwgc2Vjb25kYXJ5IG91dHB1dCBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyB0aGUgcmVhZCBmcmFtZXMgcGx1cwotICAgICAgICAgICAgICAgIC8vIHRoZSBtYXJnaW4gb2YgYSBmZXcgYnVmZmVycyBvbiBib3RoIHNpZGVzIGluIGNhc2UgdGhlCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkcyBzY2hlZHVsaW5nIGhhcyBzb21lIGppdHRlci4KLSAgICAgICAgICAgICAgICAvLyBUaGF0IHZhbHVlIHNob3VsZCBub3QgaW1wYWN0IGxhdGVuY3kgYXMgdGhlIHNlY29uZGFyeSB0cmFjayBpcyBzdGFydGVkIGJlZm9yZQotICAgICAgICAgICAgICAgIC8vIGl0cyBidWZmZXIgaXMgZnVsbCwgc2VlIGZyYW1lQ291bnRUb0JlUmVhZHkuCi0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSBmcmFtZUNvdW50VG9CZVJlYWR5ICsgMiAqIChzb3VyY2VGcmFtZUNvdW50ICsgc2lua0ZyYW1lQ291bnQpOwotICAgICAgICAgICAgICAgIC8vIFRoZSBmcmFtZUNvdW50IHNob3VsZCBhbHNvIG5vdCBiZSBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZGFyeSB0aHJlYWQgbWluIGZyYW1lCi0gICAgICAgICAgICAgICAgLy8gY291bnQKLSAgICAgICAgICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IEF1ZGlvU3lzdGVtOjpjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXSB7IE11dGV4OjpBdXRvbG9jayBfbChzZWNvbmRhcnlUaHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjb25kYXJ5VGhyZWFkLT5sYXRlbmN5X2woKTsgfSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+bU5vcm1hbEZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zcGVlZCk7Ci0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IHN0ZDo6bWF4KGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwotCi0gICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwotICAgICAgICAgICAgICAgIGF1dG8gaW5DaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19vdXRfdG9faW4oaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgICAgICAgICAgc3AgcGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZChudWxscHRyIC8qIHRocmVhZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBidWZmZXIgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8pOwotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoUmVjb3JkIGluaXQgZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGNoZWNrIGNvbXBhdGliaWxpdHkgb2YgdGhlIHNlY29uZGFyeVRocmVhZCB3aXRoIHRoZSBQYXRjaFRyYWNrCi0gICAgICAgICAgICAgICAgLy8gZm9yIGZhc3QgdXNhZ2U6IHRocmVhZCBoYXMgZmFzdCBtaXhlciwgc2FtcGxlIHJhdGUgbWF0Y2hlcywgZXRjLjsKLSAgICAgICAgICAgICAgICAvLyBmb3Igbm93LCB3ZSBleGNsdWRlIGZhc3QgdHJhY2tzIGJ5IHJlbW92aW5nIHRoZSBGYXN0IGZsYWcuCi0gICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShvdXRwdXQuZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICAgICAgc3AgcGF0Y2hUcmFjayA9IG5ldyBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjayhzZWNvbmRhcnlUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+YnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnRUb0JlUmVhZHkpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHBhdGNoVHJhY2stPmluaXRDaGVjaygpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hUcmFjayBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVlUGF0Y2hlcy5wdXNoX2JhY2soe3BhdGNoUmVjb3JkLCBwYXRjaFRyYWNrfSk7Ci0gICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5hZGRQYXRjaFRyYWNrKHBhdGNoVHJhY2spOwotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIGRvd25zdHJlYW0gcGF0Y2hUcmFjayBvbiB0aGUgc2Vjb25kYXJ5VGhyZWFkIHRlbXBvcmFyaWx5IG91dGxpdmVzCi0gICAgICAgICAgICAgICAgLy8gb3VyIGNyZWF0ZWQgdHJhY2ssIGVuc3VyZSB0aGUgY29ycmVzcG9uZGluZyBwYXRjaFJlY29yZCBpcyBzdGlsbCBhbGl2ZS4KLSAgICAgICAgICAgICAgICBwYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2hSZWNvcmQsIHRydWUgLyogaG9sZFJlZmVyZW5jZSAqLyk7Ci0gICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaFRyYWNrLCBmYWxzZSAvKiBob2xkUmVmZXJlbmNlICovKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNrLT5zZXRUZWVQYXRjaGVzKHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKSk7CisgICAgICAgICAgICB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzRm9yVHJhY2tfbCh0cmFjay5nZXQoKSwgdGhyZWFkLCBzZWNvbmRhcnlPdXRwdXRzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG1vdmUgZWZmZWN0IGNoYWluIHRvIHRoaXMgb3V0cHV0IHRocmVhZCBpZiBhbiBlZmZlY3Qgb24gc2FtZSBzZXNzaW9uIHdhcyB3YWl0aW5nCkBAIC05OTgsMTUgKzEwMjAsMTQgQEAKICAgICAgICAgQXVkaW9TeXN0ZW06Om1vdmVFZmZlY3RzVG9JbyhlZmZlY3RJZHMsIGVmZmVjdFRocmVhZElkKTsKICAgICB9CiAKLSAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAotICAgIHRyYWNrSGFuZGxlID0gbmV3IFRyYWNrSGFuZGxlKHRyYWNrKTsKKyAgICBvdXRwdXQuYXVkaW9UcmFjayA9IG5ldyBUcmFja0hhbmRsZSh0cmFjayk7CisgICAgX291dHB1dCA9IFZBTFVFX09SX0ZBVEFMKG91dHB1dC50b0FpZGwoKSk7CiAKIEV4aXQ6CiAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgb3V0cHV0Lm91dHB1dElkICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQotICAgICpzdGF0dXMgPSBsU3RhdHVzOwotICAgIHJldHVybiB0cmFja0hhbmRsZTsKKyAgICByZXR1cm4gbFN0YXR1czsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpzYW1wbGVSYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKSBjb25zdApAQCAtMTI4Myw5ICsxMzA0LDkgQEAKICAgICB9CiAKICAgICAvLyBOb3cgc2V0IHRoZSBtYXN0ZXIgbXV0ZSBpbiBlYWNoIHBsYXliYWNrIHRocmVhZC4gIFBsYXliYWNrIHRocmVhZHMKLSAgICAvLyBhc3NpZ25lZCB0byBIQUxzIHdoaWNoIGRvIG5vdCBoYXZlIG1hc3RlciBtdXRlIHN1cHBvcnQgd2lsbCBhcHBseSBtYXN0ZXIKLSAgICAvLyBtdXRlIGR1cmluZyB0aGUgbWl4IG9wZXJhdGlvbi4gIFRocmVhZHMgd2l0aCBIQUxzIHdoaWNoIGRvIHN1cHBvcnQgbWFzdGVyCi0gICAgLy8gbXV0ZSB3aWxsIHNpbXBseSBpZ25vcmUgdGhlIHNldHRpbmcuCisgICAgLy8gYXNzaWduZWQgdG8gSEFMcyB3aGljaCBkbyBub3QgaGF2ZSBtYXN0ZXIgbXV0ZSBzdXBwb3J0IHdpbGwgYXBwbHkgbWFzdGVyIG11dGUKKyAgICAvLyBkdXJpbmcgdGhlIG1peCBvcGVyYXRpb24uICBUaHJlYWRzIHdpdGggSEFMcyB3aGljaCBkbyBzdXBwb3J0IG1hc3RlciBtdXRlCisgICAgLy8gd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBzZXR0aW5nLgogICAgIFZlY3RvcjxWb2x1bWVJbnRlcmZhY2UgKj4gdm9sdW1lSW50ZXJmYWNlcyA9IGdldEFsbFZvbHVtZUludGVyZmFjZXNfbCgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdm9sdW1lSW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICB2b2x1bWVJbnRlcmZhY2VzW2ldLT5zZXRNYXN0ZXJNdXRlKG11dGVkKTsKQEAgLTE0MzAsNyArMTQ1MSw3IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCit2b2lkIEF1ZGlvRmxpbmdlcjo6YnJvYWRjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwpAQCAtMTQ2MSw2ICsxNDgyLDIwIEBACiAgICAgfQogfQogCisvLyBVcGRhdGUgZG93bnN0cmVhbSBwYXRjaGVzIGZvciBhbGwgcGxheWJhY2sgdGhyZWFkcyBhdHRhY2hlZCB0byBhbiBNU0QgbW9kdWxlCit2b2lkIEF1ZGlvRmxpbmdlcjo6dXBkYXRlRG93blN0cmVhbVBhdGNoZXNfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8YXVkaW9faW9faGFuZGxlX3Q+IHN0cmVhbXMpCit7CisgICAgZm9yIChjb25zdCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IGNoZWNrUGxheWJhY2tUaHJlYWRfbChzdHJlYW0pOworICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQgPT0gbnVsbHB0ciB8fCAhcGxheWJhY2tUaHJlYWQtPmlzTXNkRGV2aWNlKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBsYXliYWNrVGhyZWFkLT5zZXREb3duU3RyZWFtUGF0Y2gocGF0Y2gpOworICAgICAgICBwbGF5YmFja1RocmVhZC0+c2VuZElvQ29uZmlnRXZlbnQoQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTU4OCw3ICsxNjIzLDcgQEAKICAgICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICAgIGlmICgocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpICYmCiAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSAhPSAwKSkgewotICAgICAgICAgICAgICAgIGJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzY1LDcgKzE4MDAsNyBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQordm9pZCBBdWRpb0ZsaW5nZXI6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC0xODQwLDEzICsxODc1LDE4IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQoteworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpIHsKKyAgICBtZWRpYTo6QXVkaW9Jb0Rlc2NyaXB0b3IgZGVzY0FpZGwgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvSW9EZXNjcmlwdG9yX0F1ZGlvSW9EZXNjcmlwdG9yKGlvRGVzYykpOworICAgIG1lZGlhOjpBdWRpb0lvQ29uZmlnRXZlbnQgZXZlbnRBaWRsID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19jb25maWdfZXZlbnRfQXVkaW9Jb0NvbmZpZ0V2ZW50KGV2ZW50KSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNsaWVudExvY2spOwogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmICgocGlkID09IDApIHx8IChtTm90aWZpY2F0aW9uQ2xpZW50cy5rZXlBdChpKSA9PSBwaWQpKSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5hdWRpb0ZsaW5nZXJDbGllbnQoKS0+aW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NBaWRsKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE5MjAsNyArMTk2MCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiAgICAgOiBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksIG1QaWQocGlkKSwgbVVpZCh1aWQpLCBtQXVkaW9GbGluZ2VyQ2xpZW50KGNsaWVudCkKQEAgLTE5NzUsMTAgKzIwMTUsMTIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVJlY29yZChjb25zdCBDcmVhdGVSZWNvcmRJbnB1dCYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZWNvcmRPdXRwdXQmIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZVJlY29yZFJlc3BvbnNlJiBfb3V0cHV0KQogeworICAgIENyZWF0ZVJlY29yZElucHV0IGlucHV0ID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhDcmVhdGVSZWNvcmRJbnB1dDo6ZnJvbUFpZGwoX2lucHV0KSk7CisgICAgQ3JlYXRlUmVjb3JkT3V0cHV0IG91dHB1dDsKKwogICAgIHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IHJlY29yZFRyYWNrOwogICAgIHNwPFJlY29yZEhhbmRsZT4gcmVjb3JkSGFuZGxlOwogICAgIHNwPENsaWVudD4gY2xpZW50OwpAQCAtMTk5MCwyMyArMjAzMiwyNyBAQAogICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CiAgICAgb3V0cHV0LmlucHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKIAotICAgIGJvb2wgdXBkYXRlUGlkID0gKGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkID09IC0xKTsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNTUzOiByZWZhY3RvciBvciBjbGVhbiB1cAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYWRqQXR0cmlidXRpb25Tb3VyY2UgPSBpbnB1dC5jbGllbnRJbmZvLmF0dHJpYnV0aW9uU291cmNlOworICAgIGJvb2wgdXBkYXRlUGlkID0gKGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKKyAgICBjb25zdCB1aWRfdCBjdXJyZW50VWlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KAorICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAorICAgICAgICBBTE9HV19JRihjdXJyZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKLSAgICAgICAgY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGN1cnJlbnRVaWQpOworICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoY2FsbGluZ1VpZCkpOwogICAgICAgICB1cGRhdGVQaWQgPSB0cnVlOwogICAgIH0KLSAgICBwaWRfdCBjbGllbnRQaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZDsKICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IHBpZF90IGN1cnJlbnRQaWQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoCisgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKICAgICBpZiAodXBkYXRlUGlkKSB7Ci0gICAgICAgIEFMT0dXX0lGKGNsaWVudFBpZCAhPSAtMSAmJiBjbGllbnRQaWQgIT0gY2FsbGluZ1BpZCwKKyAgICAgICAgQUxPR1dfSUYoY3VycmVudFBpZCAhPSAocGlkX3QpLTEgJiYgY3VycmVudFBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKLSAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudFBpZCk7Ci0gICAgICAgIGNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7CisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBjdXJyZW50UGlkKTsKKyAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGNhbGxpbmdQaWQpKTsKICAgICB9CiAKICAgICAvLyB3ZSBkb24ndCB5ZXQgc3VwcG9ydCBhbnl0aGluZyBvdGhlciB0aGFuIGxpbmVhciBQQ00KQEAgLTIwMzQsNyArMjA4MCw3IEBACiAgICAgb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQgPSBpbnB1dC5zZWxlY3RlZERldmljZUlkOwogICAgIG91dHB1dC5mbGFncyA9IGlucHV0LmZsYWdzOwogCi0gICAgY2xpZW50ID0gcmVnaXN0ZXJQaWQoY2xpZW50UGlkKTsKKyAgICBjbGllbnQgPSByZWdpc3RlclBpZChWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCkpKTsKIAogICAgIC8vIE5vdCBhIGNvbnZlbnRpb25hbCBsb29wLCBidXQgYSByZXRyeSBsb29wIGZvciBhdCBtb3N0IHR3byBpdGVyYXRpb25zIHRvdGFsLgogICAgIC8vIFRyeSBmaXJzdCBtYXliZSB3aXRoIEZBU1QgZmxhZyB0aGVuIHRyeSBhZ2FpbiB3aXRob3V0IEZBU1QgZmxhZyBpZiB0aGF0IGZhaWxzLgpAQCAtMjA1NCw5ICsyMTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY29tcGFyZSB0byBBdWRpb1RyYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5vcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzLCAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0yMDY4LDggKzIxMTIsOCBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBSZWNvcmRUaHJlYWQgKnRocmVhZCA9IGNoZWNrUmVjb3JkVGhyZWFkX2wob3V0cHV0LmlucHV0SWQpOwogICAgICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCwgaW5wdXQgaGFuZGxlICVkIiwgb3V0cHV0LmlucHV0SWQpOwotICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCwgaW5wdXQgaGFuZGxlICVkIiwgb3V0cHV0LmlucHV0SWQpOworICAgICAgICAgICAgbFN0YXR1cyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCkBAIC0yMDgzLDEwICsyMTI3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5mcmFtZUNvdW50LCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCAmb3V0cHV0LmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZSwgJm91dHB1dC5mbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbFN0YXR1cywgcG9ydElkLCBpbnB1dC5tYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZWNvcmRUcmFjayA9PSAwKSk7CiAKICAgICAgICAgLy8gbFN0YXR1cyA9PSBCQURfVFlQRSBtZWFucyBGQVNUIGZsYWcgd2FzIHJlamVjdGVkOiByZXF1ZXN0IGEgbmV3IGlucHV0IGZyb20KQEAgLTIxMTYsOCArMjE1OSw4IEBACiAgICAgb3V0cHV0LmJ1ZmZlcnMgPSByZWNvcmRUcmFjay0+Z2V0QnVmZmVycygpOwogICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CiAKLSAgICAvLyByZXR1cm4gaGFuZGxlIHRvIGNsaWVudAotICAgIHJlY29yZEhhbmRsZSA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOworICAgIG91dHB1dC5hdWRpb1JlY29yZCA9IG5ldyBSZWNvcmRIYW5kbGUocmVjb3JkVHJhY2spOworICAgIF9vdXRwdXQgPSBWQUxVRV9PUl9GQVRBTChvdXRwdXQudG9BaWRsKCkpOwogCiBFeGl0OgogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0yMTM1LDggKzIxNzgsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgKnN0YXR1cyA9IGxTdGF0dXM7Ci0gICAgcmV0dXJuIHJlY29yZEhhbmRsZTsKKyAgICByZXR1cm4gbFN0YXR1czsKIH0KIAogCkBAIC0yMzA4LDYgKzIzNTAsMTEgQEAKIHsKICAgICBBTE9HVihfX2Z1bmNfXyk7CiAKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnRDb25maWcoKmNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CiAgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CiAgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CkBAIC0yNTMzLDcgKzI1ODAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKLSAgICAgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbU9wZW5lZChvdXRId0RldiwgKm91dHB1dCk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1PcGVuZWQob3V0SHdEZXYsICpvdXRwdXQsICZwYXRjaCk7CisgICAgICAgICAgICBpZiAodGhyZWFkLT5pc01zZERldmljZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLT5zZXREb3duU3RyZWFtUGF0Y2goJnBhdGNoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0yNTQxLDIwICsyNTkyLDI4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuT3V0cHV0KGNvbnN0IG1lZGlhOjpPcGVuT3V0cHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5PdXRwdXRSZXNwb25zZSogcmVzcG9uc2UpCiB7CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChyZXF1ZXN0Lm1vZHVsZSkpOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ19hdWRpb19jb25maWdfdChyZXF1ZXN0LmNvbmZpZykpOworICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlRGVzY3JpcHRvckJhc2UocmVxdWVzdC5kZXZpY2UpKTsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2socmVxdWVzdC5mbGFncykpOworCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0OworICAgIHVpbnQzMl90IGxhdGVuY3lNczsKKwogICAgIEFMT0dJKCJvcGVuT3V0cHV0KCkgdGhpcyAlcCwgbW9kdWxlICVkIERldmljZSAlcywgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsICIKICAgICAgICAgICAgICAgIkNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKICAgICAgICAgICAgICAgdGhpcywgbW9kdWxlLAogICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgIGZsYWdzKTsKIAogICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZGV2aWNlLT50eXBlKCk7CkBAIC0yNTY2LDExICsyNjI1LDExIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3Blbk91dHB1dF9sKG1vZHVsZSwgb3V0cHV0LCBjb25maWcsIGRldmljZVR5cGUsIGFkZHJlc3MsIGZsYWdzKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuT3V0cHV0X2wobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBkZXZpY2VUeXBlLCBhZGRyZXNzLCBmbGFncyk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSA9PSAwKSB7CiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICAqbGF0ZW5jeU1zID0gcGxheWJhY2tUaHJlYWQtPmxhdGVuY3koKTsKKyAgICAgICAgICAgIGxhdGVuY3lNcyA9IHBsYXliYWNrVGhyZWFkLT5sYXRlbmN5KCk7CiAKICAgICAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9PUEVORUQpOwpAQCAtMjU5MCw2ICsyNjQ5LDExIEBACiAgICAgICAgICAgICBNbWFwVGhyZWFkICptbWFwVGhyZWFkID0gKE1tYXBUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CiAgICAgICAgICAgICBtbWFwVGhyZWFkLT5pb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX09QRU5FRCk7CiAgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UtPm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChvdXRwdXQpKTsKKyAgICAgICAgcmVzcG9uc2UtPmNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX3RfQXVkaW9Db25maWcoY29uZmlnKSk7CisgICAgICAgIHJlc3BvbnNlLT5sYXRlbmN5TXMgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihsYXRlbmN5TXMpKTsKKyAgICAgICAgcmVzcG9uc2UtPmZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19vdXRwdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjc0MiwyMiArMjgwNiwzNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGNvbnN0IG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6Ok9wZW5JbnB1dFJlc3BvbnNlKiByZXNwb25zZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKCpkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKHJlcXVlc3QuZGV2aWNlLnR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2lvX2hhbmRsZV90KHJlcXVlc3QuaW5wdXQpKTsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QocmVxdWVzdC5jb25maWcpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuSW5wdXRfbCgKLSAgICAgICAgICAgIG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MsIEFVRElPX0RFVklDRV9OT05FLCBTdHJpbmc4e30pOworICAgICAgICAgICAgVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX21vZHVsZV9oYW5kbGVfdChyZXF1ZXN0Lm1vZHVsZSkpLAorICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgIGRldmljZS5tVHlwZSwKKyAgICAgICAgICAgIGRldmljZS5hZGRyZXNzKCkuY19zdHIoKSwKKyAgICAgICAgICAgIFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHJlcXVlc3Quc291cmNlKSksCisgICAgICAgICAgICBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW5wdXRfZmxhZ3NfdF9tYXNrKHJlcXVlc3QuZmxhZ3MpKSwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9OT05FLAorICAgICAgICAgICAgU3RyaW5nOHt9KTsKKworICAgIHJlc3BvbnNlLT5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dCkpOworICAgIHJlc3BvbnNlLT5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKGNvbmZpZykpOworICAgIHJlc3BvbnNlLT5kZXZpY2UgPSByZXF1ZXN0LmRldmljZTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCkBAIC0yNzcxLDcgKzI4NDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKQEAgLTI4MDEsNyArMjg3OSw3IEBACiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBpbkh3SGFsID0gaW5Id0Rldi0+aHdEZXZpY2UoKTsKICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW5TdHJlYW07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLAorICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcywgc291cmNlLAogICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIG9wZW5JbnB1dFN0cmVhbSByZXR1cm5lZCBpbnB1dCAlcCwgZGV2aWNlcyAlI3gsIFNhbXBsaW5nUmF0ZSAlZCIKICAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJSN4LCBmbGFncyAlI3gsIHN0YXR1cyAlZCBhZGRyICVzIiwKQEAgLTI4MTEsNyArMjg4OSw3IEBACiAgICAgICAgICAgICBoYWxjb25maWcuZm9ybWF0LAogICAgICAgICAgICAgaGFsY29uZmlnLmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgc3RhdHVzLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIHN0YXR1cywgYWRkcmVzcyk7CiAKICAgICAvLyBJZiB0aGUgaW5wdXQgY291bGQgbm90IGJlIG9wZW5lZCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycyBhbmQgd2UgY2FuIGhhbmRsZSB0aGUKICAgICAvLyBjb252ZXJzaW9uIGludGVybmFsbHksIHRyeSB0byBvcGVuIGFnYWluIHdpdGggdGhlIHByb3Bvc2VkIHBhcmFtZXRlcnMuCkBAIC0yODE5LDEzICsyODk3LDEzIEBACiAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCiAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oaGFsY29uZmlnLmZvcm1hdCkgJiYKICAgICAgICAgKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgotICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzgpICYmCi0gICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDXzgpKSB7CisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfTElNSVQpICYmCisgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDX0xJTUlUKSkgewogICAgICAgICAvLyBGSVhNRSBkZXNjcmliZSB0aGUgY2hhbmdlIHByb3Bvc2VkIGJ5IEhBTCAoc2F2ZSBvbGQgdmFsdWVzIHNvIHdlIGNhbiBsb2cgdGhlbSBoZXJlKQogICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0uY2xlYXIoKTsKICAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CkBAIC0zMTQxLDcgKzMyMTksOCBAQAogLy8gZHVtcFRvVGhyZWFkTG9nX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpCiB7Ci0gICAgYXVkaW9fdXRpbHM6OkZkVG9TdHJpbmcgZmRUb1N0cmluZzsKKyAgICBjb25zdGV4cHIgaW50IFRIUkVBRF9EVU1QX1RJTUVPVVRfTVMgPSAyOworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmcoIi0gIiwgVEhSRUFEX0RVTVBfVElNRU9VVF9NUyk7CiAgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOwogICAgIGlmIChmZCA+PSAwKSB7CiAgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CkBAIC0zMjk3LDYgKzMzNzYsMTA0IEBACiAgICAgcmV0dXJuIG1pblRocmVhZDsKIH0KIAorQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlICpBdWRpb0ZsaW5nZXI6OmhhcHRpY1BsYXliYWNrVGhyZWFkX2woKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgaSAgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7ICsraSkgeworICAgICAgICBQbGF5YmFja1RocmVhZCAqdGhyZWFkID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLmdldCgpOworICAgICAgICBpZiAodGhyZWFkLT5oYXB0aWNDaGFubmVsTWFzaygpICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OnVwZGF0ZVNlY29uZGFyeU91dHB1dHNGb3JUcmFja19sKAorICAgICAgICBQbGF5YmFja1RocmVhZDo6VHJhY2sqIHRyYWNrLAorICAgICAgICBQbGF5YmFja1RocmVhZCogdGhyZWFkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gJnNlY29uZGFyeU91dHB1dHMpIGNvbnN0IHsKKyAgICBUZWVQYXRjaGVzIHRlZVBhdGNoZXM7CisgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzZWNvbmRhcnlPdXRwdXQgOiBzZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpzZWNvbmRhcnlUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc2Vjb25kYXJ5T3V0cHV0KTsKKyAgICAgICAgaWYgKHNlY29uZGFyeVRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgibm8gcGxheWJhY2sgdGhyZWFkIGZvdW5kIGZvciBzZWNvbmRhcnkgb3V0cHV0ICVkIiwgdGhyZWFkLT5pZCgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHNvdXJjZUZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKSAqIHRyYWNrLT5zYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICBzaXplX3Qgc2lua0ZyYW1lQ291bnQgPSBzZWNvbmRhcnlUaHJlYWQtPmZyYW1lQ291bnQoKSAqIHRyYWNrLT5zYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHNlY29uZGFyeVRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAvLyBJZiB0aGUgc2Vjb25kYXJ5IG91dHB1dCBoYXMganVzdCBiZWVuIG9wZW5lZCwgdGhlIGZpcnN0IHNlY29uZGFyeVRocmVhZCB3cml0ZQorICAgICAgICAvLyB3aWxsIG5vdCBibG9jayBhcyBpdCB3aWxsIGZpbGwgdGhlIGVtcHR5IHN0YXJ0dXAgYnVmZmVyIG9mIHRoZSBIQUwsCisgICAgICAgIC8vIHNvIGEgc2Vjb25kIHNpbmsgYnVmZmVyIG5lZWRzIHRvIGJlIHJlYWR5IGZvciB0aGUgaW1tZWRpYXRlIG5leHQgYmxvY2tpbmcgd3JpdGUuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSwgaGF2ZSBhIG1hcmdpbiBvZiBvbmUgbWFpbiB0aHJlYWQgYnVmZmVyIGFzIHRoZSBzY2hlZHVsaW5nIGppdHRlcgorICAgICAgICAvLyBjYW4gcmVvcmRlciB0aGUgd3JpdGVzIChlZyBpZiB0aHJlYWQgQSZCIGhhdmUgdGhlIHNhbWUgd3JpdGUgaW50ZXJ2YWxlLAorICAgICAgICAvLyB0aGUgc2NoZWR1bGVyIGNvdWxkIHNjaGVkdWxlIEFCLi4uQkEpCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gMiAqIHNpbmtGcmFtZUNvdW50ICsgc291cmNlRnJhbWVDb3VudDsKKyAgICAgICAgLy8gVG90YWwgc2Vjb25kYXJ5IG91dHB1dCBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyB0aGUgcmVhZCBmcmFtZXMgcGx1cworICAgICAgICAvLyB0aGUgbWFyZ2luIG9mIGEgZmV3IGJ1ZmZlcnMgb24gYm90aCBzaWRlcyBpbiBjYXNlIHRoZQorICAgICAgICAvLyB0aHJlYWRzIHNjaGVkdWxpbmcgaGFzIHNvbWUgaml0dGVyLgorICAgICAgICAvLyBUaGF0IHZhbHVlIHNob3VsZCBub3QgaW1wYWN0IGxhdGVuY3kgYXMgdGhlIHNlY29uZGFyeSB0cmFjayBpcyBzdGFydGVkIGJlZm9yZQorICAgICAgICAvLyBpdHMgYnVmZmVyIGlzIGZ1bGwsIHNlZSBmcmFtZUNvdW50VG9CZVJlYWR5LgorICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IGZyYW1lQ291bnRUb0JlUmVhZHkgKyAyICogKHNvdXJjZUZyYW1lQ291bnQgKyBzaW5rRnJhbWVDb3VudCk7CisgICAgICAgIC8vIFRoZSBmcmFtZUNvdW50IHNob3VsZCBhbHNvIG5vdCBiZSBzbWFsbGVyIHRoYW4gdGhlIHNlY29uZGFyeSB0aHJlYWQgbWluIGZyYW1lCisgICAgICAgIC8vIGNvdW50CisgICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gQXVkaW9TeXN0ZW06OmNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoCisgICAgICAgICAgICAgICAgICAgIFsmXSB7IE11dGV4OjpBdXRvbG9jayBfbChzZWNvbmRhcnlUaHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZGFyeVRocmVhZC0+bGF0ZW5jeV9sKCk7IH0oKSwKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5tTm9ybWFsRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmdldFNwZWVkKCkpOworICAgICAgICBmcmFtZUNvdW50ID0gc3RkOjptYXgoZnJhbWVDb3VudCwgbWluRnJhbWVDb3VudCk7CisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgICAgICBhdXRvIGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKHRyYWNrLT5jaGFubmVsTWFzaygpKTsKKyAgICAgICAgc3AgcGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZChudWxscHRyIC8qIHRocmVhZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoUmVjb3JkIGluaXQgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGNoZWNrIGNvbXBhdGliaWxpdHkgb2YgdGhlIHNlY29uZGFyeVRocmVhZCB3aXRoIHRoZSBQYXRjaFRyYWNrCisgICAgICAgIC8vIGZvciBmYXN0IHVzYWdlOiB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIsIHNhbXBsZSByYXRlIG1hdGNoZXMsIGV0Yy47CisgICAgICAgIC8vIGZvciBub3csIHdlIGV4Y2x1ZGUgZmFzdCB0cmFja3MgYnkgcmVtb3ZpbmcgdGhlIEZhc3QgZmxhZy4KKyAgICAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPQorICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkodHJhY2stPmdldE91dHB1dEZsYWdzKCkgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CisgICAgICAgIHNwIHBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soc2Vjb25kYXJ5VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zdHJlYW1UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZVJhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Zm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaFJlY29yZC0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50VG9CZVJlYWR5KTsKKyAgICAgICAgc3RhdHVzID0gcGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoVHJhY2sgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRlZVBhdGNoZXMucHVzaF9iYWNrKHtwYXRjaFJlY29yZCwgcGF0Y2hUcmFja30pOworICAgICAgICBzZWNvbmRhcnlUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2hUcmFjayk7CisgICAgICAgIC8vIEluIGNhc2UgdGhlIGRvd25zdHJlYW0gcGF0Y2hUcmFjayBvbiB0aGUgc2Vjb25kYXJ5VGhyZWFkIHRlbXBvcmFyaWx5IG91dGxpdmVzCisgICAgICAgIC8vIG91ciBjcmVhdGVkIHRyYWNrLCBlbnN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGF0Y2hSZWNvcmQgaXMgc3RpbGwgYWxpdmUuCisgICAgICAgIHBhdGNoVHJhY2stPnNldFBlZXJQcm94eShwYXRjaFJlY29yZCwgdHJ1ZSAvKiBob2xkUmVmZXJlbmNlICovKTsKKyAgICAgICAgcGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaFRyYWNrLCBmYWxzZSAvKiBob2xkUmVmZXJlbmNlICovKTsKKyAgICB9CisgICAgdHJhY2stPnNldFRlZVBhdGNoZXMoc3RkOjptb3ZlKHRlZVBhdGNoZXMpKTsKK30KKwogc3A8QXVkaW9GbGluZ2VyOjpTeW5jRXZlbnQ+IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlU3luY0V2ZW50KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBsaXN0ZW5lclNlc3Npb24sCkBAIC0zNDI3LDQwICszNjA0LDQ0IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3A8SUVmZmVjdD4gQXVkaW9GbGluZ2VyOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLAotICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAotICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICBib29sIHByb2JlLAotICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAotICAgICAgICBpbnQgKmlkLAotICAgICAgICBpbnQgKmVuYWJsZWQpCi17Ci0gICAgc3RhdHVzX3QgbFN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOwotICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlRWZmZWN0KGNvbnN0IG1lZGlhOjpDcmVhdGVFZmZlY3RSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkNyZWF0ZUVmZmVjdFJlc3BvbnNlKiByZXNwb25zZSkgeworICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQgPSByZXF1ZXN0LmNsaWVudDsKKyAgICBjb25zdCBpbnQzMl90IHByaW9yaXR5ID0gcmVxdWVzdC5wcmlvcml0eTsKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKHJlcXVlc3QuZGV2aWNlKSk7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhZGpBdHRyaWJ1dGlvblNvdXJjZSA9IHJlcXVlc3QuYXR0cmlidXRpb25Tb3VyY2U7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChyZXF1ZXN0LnNlc3Npb25JZCkpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVxdWVzdC5vdXRwdXQpKTsKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NJbiA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QocmVxdWVzdC5kZXNjKSk7CisgICAgY29uc3QgYm9vbCBwcm9iZSA9IHJlcXVlc3QucHJvYmU7CiAKKyAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NPdXQ7CisgICAgaW50IGVuYWJsZWRPdXQgPSAwOworICAgIGludCBpZE91dCA9IC0xOworCisgICAgc3RhdHVzX3QgbFN0YXR1cyA9IE5PX0VSUk9SOworCisgICAgLy8gVE9ETyBiLzE4MjM5MjU1MzogcmVmYWN0b3Igb3IgbWFrZSBjbGVhcmVyCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAocGlkID09IC0xIHx8ICFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChjYWxsaW5nVWlkKSk7CisgICAgcGlkX3QgY3VycmVudFBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpKTsKKyAgICBpZiAoY3VycmVudFBpZCA9PSAtMSB8fCAhaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgQUxPR1dfSUYocGlkICE9IC0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAorICAgICAgICBBTE9HV19JRihjdXJyZW50UGlkICE9IC0xICYmIGN1cnJlbnRQaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBwaWQpOwotICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOworICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY3VycmVudFBpZCk7CisgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChjYWxsaW5nUGlkKSk7CisgICAgICAgIGN1cnJlbnRQaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KIAogICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QgcGlkICVkLCBlZmZlY3RDbGllbnQgJXAsIHByaW9yaXR5ICVkLCBzZXNzaW9uSWQgJWQsIGlvICVkLCBmYWN0b3J5ICVwIiwKLSAgICAgICAgICAgIHBpZCwgZWZmZWN0Q2xpZW50LmdldCgpLCBwcmlvcml0eSwgc2Vzc2lvbklkLCBpbywgbUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKTsKLQotICAgIGlmIChwRGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9CisgICAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UucGlkLCBlZmZlY3RDbGllbnQuZ2V0KCksIHByaW9yaXR5LCBzZXNzaW9uSWQsIGlvLAorICAgICAgICAgIG1FZmZlY3RzRmFjdG9yeUhhbC5nZXQoKSk7CiAKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5SGFsID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBubyBlZmZlY3RzIGZhY3RvcnkgaGFsIiwgX19mdW5jX18pOwpAQCAtMzQ4OCw3ICszNjY5LDcgQEAKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7Ci0gICAgICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQocGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgZWZmZWN0IHBlcm1pc3Npb24gZGVuaWVkIGZvciB1aWQgJWQiLCBfX2Z1bmNfXywgY2FsbGluZ1VpZCk7CiAgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CkBAIC0zNTE3LDcgKzM2OTgsNyBAQAogICAgICAgICAvLyBvdGhlcndpc2Ugbm8gcHJlZmVyZW5jZS4KICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZSA9IChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSA6IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyk7Ci0gICAgICAgIGxTdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJnBEZXNjLT50eXBlLCBwcmVmZXJyZWRUeXBlLCAmZGVzYyk7CisgICAgICAgIGxTdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZkZXNjSW4udXVpZCwgJmRlc2NJbi50eXBlLCBwcmVmZXJyZWRUeXBlLCAmZGVzY091dCk7CiAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewogICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gZ2V0RWZmZWN0RGVzY3JpcHRvciIsIGxTdGF0dXMpOwogICAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMzUyNSw0NCArMzcwNiw1MiBAQAogCiAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhdXhpbGlhcnkgZWZmZWN0cyBvbiBhIHNlc3Npb24gZGlmZmVyZW50IGZyb20gMCAob3V0cHV0IG1peCkKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgICAoZGVzY091dC5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIHJlY29yZGluZyBwZXJtaXNzaW9uIGZvciB2aXN1YWxpemVyCi0gICAgICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCisgICAgICAgIGlmICgobWVtY21wKCZkZXNjT3V0LnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCiAgICAgICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIHN0YXJ0L3N0b3Agb3AgLSBpLmUuIGlzIHRoZXJlIHJlY29yZGluZyBiZWluZyBwZXJmb3JtZWQ/Ci0gICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKICAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIHJldHVybiBlZmZlY3QgZGVzY3JpcHRvcgotICAgICAgICAqcERlc2MgPSBkZXNjOworICAgICAgICBjb25zdCBib29sIGhhcHRpY1BsYXliYWNrUmVxdWlyZWQgPSBFZmZlY3RNb2R1bGU6OmlzSGFwdGljR2VuZXJhdG9yKCZkZXNjT3V0LnR5cGUpOworICAgICAgICBpZiAoaGFwdGljUGxheWJhY2tSZXF1aXJlZAorICAgICAgICAgICAgICAgICYmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkpIHsKKyAgICAgICAgICAgIC8vIGhhcHRpYy1nZW5lcmF0aW5nIGVmZmVjdCBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlIHNlc3Npb24gaWQgaXMgYSBnZW5lcmFsIHNlc3Npb24gaWQKKyAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGUgb3V0cHV0IHJldHVybmVkIGJ5IGdldE91dHB1dEZvckVmZmVjdCgpIGlzIHJlbW92ZWQgYmVmb3JlIHdlIGxvY2sgdGhlCiAgICAgICAgICAgICAvLyBtdXRleCBiZWxvdywgdGhlIGNhbGwgdG8gY2hlY2tQbGF5YmFja1RocmVhZF9sKGlvKSBiZWxvdyB3aWxsIGRldGVjdCBpdAogICAgICAgICAgICAgLy8gYW5kIHdlIHdpbGwgZXhpdCBzYWZlbHkKLSAgICAgICAgICAgIGlvID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckVmZmVjdCgmZGVzYyk7CisgICAgICAgICAgICBpbyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JFZmZlY3QoJmRlc2NPdXQpOwogICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUVmZmVjdCBnb3Qgb3V0cHV0ICVkIiwgaW8pOwogICAgICAgICB9CiAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7Ci0gICAgICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IHJlZ2lzdGVyUGlkKHBpZCk7CisgICAgICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IHJlZ2lzdGVyUGlkKGN1cnJlbnRQaWQpOwogICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSB0eXBlICUjeCBhZGRyZXNzICVzIiwgX19mdW5jX18sIGRldmljZS5tVHlwZSwgZGV2aWNlLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICBoYW5kbGUgPSBtRGV2aWNlRWZmZWN0TWFuYWdlci5jcmVhdGVFZmZlY3RfbCgKLSAgICAgICAgICAgICAgICAgICAgJmRlc2MsIGRldmljZSwgY2xpZW50LCBlZmZlY3RDbGllbnQsIG1QYXRjaFBhbmVsLnBhdGNoZXNfbCgpLAotICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCAmbFN0YXR1cywgcHJvYmUpOworICAgICAgICAgICAgICAgICAgICAmZGVzY091dCwgZGV2aWNlLCBjbGllbnQsIGVmZmVjdENsaWVudCwgbVBhdGNoUGFuZWwucGF0Y2hlc19sKCksCisgICAgICAgICAgICAgICAgICAgICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcHJvYmUpOwogICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKICAgICAgICAgICAgICAgICBjbGllbnQuY2xlYXIoKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgdmFsaWQgaGVyZSwgYnV0IGNoZWNrIGFnYWluIHRvIGJlIHNhZmUuCi0gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5nZXQoKSAhPSBudWxscHRyICYmIGlkICE9IG51bGxwdHIpICppZCA9IGhhbmRsZS0+aWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIpIGlkT3V0ID0gaGFuZGxlLT5pZCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZ290byBSZWdpc3RlcjsKICAgICAgICAgfQpAQCAtMzU5Miw4ICszNzgxLDggQEAKICAgICAgICAgICAgIC8vIERldGVjdCBpZiB0aGUgZWZmZWN0IGlzIGNyZWF0ZWQgYWZ0ZXIgYW4gQXVkaW9SZWNvcmQgaXMgZGVzdHJveWVkLgogICAgICAgICAgICAgaWYgKGdldE9ycGhhbkVmZmVjdENoYWluX2woc2Vzc2lvbklkKS5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBlZmZlY3QgJXMgd2l0aCBubyBzcGVjaWZpZWQgaW8gaGFuZGxlIGlzIGRlbmllZCBiZWNhdXNlIHRoZSBBdWRpb1JlY29yZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZm9yIHNlc3Npb24gJWQgbm8gbG9uZ2VyIGV4aXN0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MubmFtZSwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAiIGZvciBzZXNzaW9uICVkIG5vIGxvbmdlciBleGlzdHMiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjT3V0Lm5hbWUsIHNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2MDcsMTcgKzM3OTYsMjcgQEAKICAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBtUGxheWJhY2tUaHJlYWRzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlRWZmZWN0KCkgZ290IGlvICVkIGZvciBlZmZlY3QgJXMiLCBpbywgZGVzYy5uYW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVFZmZlY3QoKSBnb3QgaW8gJWQgZm9yIGVmZmVjdCAlcyIsIGlvLCBkZXNjT3V0Lm5hbWUpOwogICAgICAgICB9IGVsc2UgaWYgKGNoZWNrUGxheWJhY2tUaHJlYWRfbChpbykgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgLy8gYWxsb3cgb25seSBvbmUgZWZmZWN0IGNoYWluIHBlciBzZXNzaW9uSWQgb24gbVBsYXliYWNrVGhyZWFkcy4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGNoZWNrSW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpbyA9PSBjaGVja0lvKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW8gPT0gY2hlY2tJbykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFwdGljUGxheWJhY2tSZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5oYXB0aWNDaGFubmVsTWFzaygpID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBoYXB0aWMgcGxheWJhY2sgdGhyZWFkIGlzIHJlcXVpcmVkIHdoaWxlIHRoZSByZXF1aXJlZCBwbGF5YmFjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkKGlvPSVkKSBkb2Vzbid0IHN1cHBvcnQiLCBfX2Z1bmNfXywgKGludClpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzZXNzaW9uVHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIGlmICgoc2Vzc2lvblR5cGUgJiBUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGVmZmVjdCAlcyBpbyAlZCBkZW5pZWQgYmVjYXVzZSBzZXNzaW9uICVkIGVmZmVjdCBleGlzdHMgb24gaW8gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIChpbnQpaW8sIChpbnQpc2Vzc2lvbklkLCAoaW50KWNoZWNrSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzY091dC5uYW1lLCAoaW50KSBpbywgKGludCkgc2Vzc2lvbklkLCAoaW50KSBjaGVja0lvKTsKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjMyMzc5NzQiKTsKICAgICAgICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMzY0NSwxOSArMzg0NCwzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOworICAgICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IHJlZ2lzdGVyUGlkKGN1cnJlbnRQaWQpOwogCiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3Qgb24gc2VsZWN0ZWQgb3V0cHV0IHRocmVhZAogICAgICAgICBib29sIHBpbm5lZCA9ICFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uSWQpICYmIGlzU2Vzc2lvbkFjcXVpcmVkX2woc2Vzc2lvbklkKTsKKyAgICAgICAgVGhyZWFkQmFzZSAqb3JpVGhyZWFkID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKGhhcHRpY1BsYXliYWNrUmVxdWlyZWQgJiYgdGhyZWFkLT5oYXB0aWNDaGFubmVsTWFzaygpID09IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICAgICAgVGhyZWFkQmFzZSAqaGFwdGljVGhyZWFkID0gaGFwdGljUGxheWJhY2tUaHJlYWRfbCgpOworICAgICAgICAgICAgaWYgKGhhcHRpY1RocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGhhcHRpYyB0aHJlYWQgbm90IGZvdW5kIHdoaWxlIGl0IGlzIHJlcXVpcmVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFwdGljVGhyZWFkICE9IHRocmVhZCkgeworICAgICAgICAgICAgICAgIC8vIEZvcmNlIHRvIHVzZSBoYXB0aWMgdGhyZWFkIGZvciBoYXB0aWMtZ2VuZXJhdGluZyBlZmZlY3QuCisgICAgICAgICAgICAgICAgb3JpVGhyZWFkID0gdGhyZWFkOworICAgICAgICAgICAgICAgIHRocmVhZCA9IGhhcHRpY1RocmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBoYW5kbGUgPSB0aHJlYWQtPmNyZWF0ZUVmZmVjdF9sKGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICZkZXNjLCBlbmFibGVkLCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NPdXQsICZlbmFibGVkT3V0LCAmbFN0YXR1cywgcGlubmVkLCBwcm9iZSk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIC8vIHJlbW92ZSBsb2NhbCBzdHJvbmcgcmVmZXJlbmNlIHRvIENsaWVudCB3aXRoIG1DbGllbnRMb2NrIGhlbGQKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOwogICAgICAgICAgICAgY2xpZW50LmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSB2YWxpZCBoZXJlLCBidXQgY2hlY2sgYWdhaW4gdG8gYmUgc2FmZS4KLSAgICAgICAgICAgIGlmIChoYW5kbGUuZ2V0KCkgIT0gbnVsbHB0ciAmJiBpZCAhPSBudWxscHRyKSAqaWQgPSBoYW5kbGUtPmlkKCk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIpIGlkT3V0ID0gaGFuZGxlLT5pZCgpOworICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhdWRpbyBzZXNzaW9uIHdoZW4gaGFwdGljIHBsYXliYWNrIGlzIGNyZWF0ZWQuCisgICAgICAgICAgICBpZiAoaGFwdGljUGxheWJhY2tSZXF1aXJlZCAmJiBvcmlUaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb24gd2lsbCB0cmlnZ2VyIGxvY2tpbmcgdGhlIHRocmVhZC4KKyAgICAgICAgICAgICAgICBvcmlUaHJlYWQtPmludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzY3NSw5ICszODkzLDE0IEBACiAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KIAorICAgIHJlc3BvbnNlLT5pZCA9IGlkT3V0OworICAgIHJlc3BvbnNlLT5lbmFibGVkID0gZW5hYmxlZE91dCAhPSAwOworICAgIHJlc3BvbnNlLT5lZmZlY3QgPSBoYW5kbGU7CisgICAgcmVzcG9uc2UtPmRlc2MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKGRlc2NPdXQpKTsKKwogRXhpdDoKLSAgICAqc3RhdHVzID0gbFN0YXR1czsKLSAgICByZXR1cm4gaGFuZGxlOworICAgIHJldHVybiBsU3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKQEAgLTM3NzQsNyArMzk5Nyw3IEBACiAgICAgICAgIC8vIGlmIHRoZSBtb3ZlIHJlcXVlc3QgaXMgbm90IHJlY2VpdmVkIGZyb20gYXVkaW8gcG9saWN5IG1hbmFnZXIsIHRoZSBlZmZlY3QgbXVzdCBiZQogICAgICAgICAvLyByZS1yZWdpc3RlcmVkIHdpdGggdGhlIG5ldyBzdHJhdGVneSBhbmQgb3V0cHV0CiAgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7Ci0gICAgICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Y2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CisgICAgICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Z2V0Q2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbm5vdCBnZXQgY2hhaW4gZnJvbSBlZmZlY3QgJXAiLCBlZmZlY3QuZ2V0KCkpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CkBAIC0zODI0LDcgKzQwNDcsNyBAQAogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAKLSAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmNhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOworICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Z2V0Q2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7CiAgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKQEAgLTM5MjYsMTAgKzQxNDksMTE3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBCbkF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0V3JhcHBlcihUcmFuc2FjdGlvbkNvZGUgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiYgZGVsZWdhdGUpIHsKKyAgICAodm9pZCkgZGF0YTsKKyAgICAodm9pZCkgZmxhZ3M7CisKKyAgICAvLyBtYWtlIHN1cmUgdHJhbnNhY3Rpb25zIHJlc2VydmVkIHRvIEF1ZGlvUG9saWN5TWFuYWdlciBkbyBub3QgY29tZSBmcm9tIG90aGVyIHByb2Nlc3NlcworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX1NUUkVBTV9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfU1RSRUFNX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpPUEVOX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6Ok9QRU5fRFVQTElDQVRFX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkNMT1NFX09VVFBVVDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNVU1BFTkRfT1VUUFVUOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6UkVTVE9SRV9PVVRQVVQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpPUEVOX0lOUFVUOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6Q0xPU0VfSU5QVVQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpJTlZBTElEQVRFX1NUUkVBTToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9WT0lDRV9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpNT1ZFX0VGRkVDVFM6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfRUZGRUNUX1NVU1BFTkRFRDoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkxPQURfSFdfTU9EVUxFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6R0VUX0FVRElPX1BPUlQ6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfQVVESU9fUEFUQ0g6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpSRUxFQVNFX0FVRElPX1BBVENIOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6TElTVF9BVURJT19QQVRDSEVTOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX0FVRElPX1BPUlRfQ09ORklHOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKKyAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUkVDT1JEX1NJTEVOQ0VEOgorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfRUZGRUNUX1NVU1BFTkRFRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmFpbCBzaWxlbnRseSBpbiB0aGVzZSBjYXNlcy4KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9ucyBjb21lIGZyb20gc3lzdGVtIGNvbXBvbmVudHMKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9NQVNURVJfVk9MVU1FOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX01BU1RFUl9NVVRFOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6TUFTVEVSX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTU9ERToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9NSUNfTVVURToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9MT1dfUkFNX0RFVklDRToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNZU1RFTV9SRUFEWToKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9BVURJT19IQUxfUElEUzoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlNFVF9WSUJSQVRPUl9JTkZPUzoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OlVQREFURV9TRUNPTkRBUllfT1VUUFVUUzogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIC8vIHJldHVybiBzdGF0dXMgb25seSBmb3Igbm9uIHZvaWQgbWV0aG9kcworICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U1lTVEVNX1JFQURZOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZhaWwgc2lsZW50bHkgaW4gdGhlc2UgY2FzZXMuCisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gTGlzdCBvZiByZWxldmFudCBldmVudHMgdGhhdCB0cmlnZ2VyIGxvZyBtZXJnaW5nLgorICAgIC8vIExvZyBtZXJnaW5nIHNob3VsZCBhY3RpdmF0ZSBkdXJpbmcgYXVkaW8gYWN0aXZpdHkgb2YgYW55IGtpbmQuIFRoaXMgYXJlIGNvbnNpZGVyZWQgdGhlCisgICAgLy8gbW9zdCByZWxldmFudCBldmVudHMuCisgICAgLy8gVE9ETyBzaG91bGQgc2VsZWN0IG1vcmUgd2lzZWx5IHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0CisgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfVFJBQ0s6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpDUkVBVEVfUkVDT1JEOgorICAgICAgICBjYXNlIFRyYW5zYWN0aW9uQ29kZTo6U0VUX01BU1RFUl9WT0xVTUU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTUFTVEVSX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfTUlDX01VVEU6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTRVRfUEFSQU1FVEVSUzoKKyAgICAgICAgY2FzZSBUcmFuc2FjdGlvbkNvZGU6OkNSRUFURV9FRkZFQ1Q6CisgICAgICAgIGNhc2UgVHJhbnNhY3Rpb25Db2RlOjpTWVNURU1fUkVBRFk6IHsKKyAgICAgICAgICAgIHJlcXVlc3RMb2dNZXJnZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvRmxpbmdlciBjb21tYW5kICIgKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZV90PFRyYW5zYWN0aW9uQ29kZT4+KGNvZGUpKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBjb25uZWN0IHRvIEF1ZGlvIFBvbGljeSBTZXJ2aWNlIGJlZm9yZSBjYWxsaW5nIGludG8gQXVkaW9GbGluZ2VyOgorICAgIC8vICAtIEF1ZGlvRmxpbmdlciBjYW4gY2FsbCBpbnRvIEF1ZGlvIFBvbGljeSBTZXJ2aWNlIHdpdGggaXRzIGdsb2JhbCBtdXRleCBoZWxkCisgICAgLy8gIC0gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBBdWRpbyBQb2xpY3kgU2VydmljZSBpcyBxdWVyaWVkIGZyb20gaW5zaWRlIGF1ZGlvc2VydmVyIHByb2Nlc3MKKyAgICAvLyAgdGhpcyB3aWxsIHRyaWdnZXIgQXVkaW8gUG9saWN5IE1hbmFnZXIgaW5pdGlhbGl6YXRpb24uCisgICAgLy8gIC0gQXVkaW8gUG9saWN5IE1hbmFnZXIgaW5pdGlhbGl6YXRpb24gY2FsbHMgaW50byBBdWRpb0ZsaW5nZXIgd2hpY2ggd2lsbCB0cnkgdG8gbG9jaworICAgIC8vICBpdHMgZ2xvYmFsIG11dGV4IGFuZCBhIGRlYWRsb2NrIHdpbGwgb2NjdXIuCisgICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIGRlbGVnYXRlKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCAyMGY1NjFlLi5mZmY2MWY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0zMywxNyArMzMsMTkgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5BdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9JQXVkaW9UcmFja0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9vcy9CbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlci5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtSW50ZXJmYWNlLmg+CkBAIC03Myw2ICs3NSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TeW5jaHJvbml6YXRpb24uaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvRmRUb1N0cmluZy5oPgpAQCAtOTEsMTUgKzk0LDE3IEBACiAjaW5jbHVkZSAiVGhyZWFkTWV0cmljcy5oIgogI2luY2x1ZGUgIlRyYWNrTWV0cmljcy5oIgogCi0jaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lQb3dlck1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb0VmZmVjdFNoYXJlZC5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCiAjaW5jbHVkZSA8dmlicmF0b3IvRXh0ZXJuYWxWaWJyYXRpb24uaD4KKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvblV0aWxzLmg+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuQXVkaW9SZWNvcmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuRWZmZWN0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTIxLDI1ICsxMjYsMjQgQEAKIAogI2RlZmluZSBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogCi1jbGFzcyBBdWRpb0ZsaW5nZXIgOgotICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvRmxpbmdlcj4sCi0gICAgcHVibGljIEJuQXVkaW9GbGluZ2VyCit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOworCitjbGFzcyBBdWRpb0ZsaW5nZXIgOiBwdWJsaWMgQXVkaW9GbGluZ2VyU2VydmVyQWRhcHRlcjo6RGVsZWdhdGUKIHsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBdWRpb0ZsaW5nZXI+OyAgIC8vIGZvciBBdWRpb0ZsaW5nZXIoKQotCiBwdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldFNlcnZpY2VOYW1lKCkgQU5EUk9JRF9BUEkgeyByZXR1cm4gIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiOyB9CisgICAgc3RhdGljIHZvaWQgaW5zdGFudGlhdGUoKSBBTkRST0lEX0FQSTsKIAotICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBjaGVja0F0dHJpYnV0aW9uU291cmNlUGFja2FnZSgKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiAgICAgLy8gSUF1ZGlvRmxpbmdlciBpbnRlcmZhY2UsIGluIGJpbmRlciBvcGNvZGUgb3JkZXIKLSAgICB2aXJ0dWFsIHNwPElBdWRpb1RyYWNrPiBjcmVhdGVUcmFjayhjb25zdCBDcmVhdGVUcmFja0lucHV0JiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVUcmFja091dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgIHN0YXR1c190IGNyZWF0ZVRyYWNrKGNvbnN0IG1lZGlhOjpDcmVhdGVUcmFja1JlcXVlc3QmIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVUcmFja1Jlc3BvbnNlJiBvdXRwdXQpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzcDxtZWRpYTo6SUF1ZGlvUmVjb3JkPiBjcmVhdGVSZWNvcmQoY29uc3QgQ3JlYXRlUmVjb3JkSW5wdXQmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZVJlY29yZE91dHB1dCYgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgIHN0YXR1c190IGNyZWF0ZVJlY29yZChjb25zdCBtZWRpYTo6Q3JlYXRlUmVjb3JkUmVxdWVzdCYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpDcmVhdGVSZWNvcmRSZXNwb25zZSYgb3V0cHV0KSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpIGNvbnN0OwogICAgIHZpcnR1YWwgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwpAQCAtMTc1LDE3ICsxNzksMTMgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBjb25zdCBTdHJpbmc4JiBrZXlzKSBjb25zdDsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb0ZsaW5nZXJDbGllbnQ+JiBjbGllbnQpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50KTsKIAogICAgIHZpcnR1YWwgICAgIHNpemVfdCAgICAgIGdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChjb25zdCBtZWRpYTo6T3Blbk91dHB1dFJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpPcGVuT3V0cHV0UmVzcG9uc2UqIHJlc3BvbnNlKTsKIAogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQyKTsKQEAgLTE5NiwxMyArMTk2LDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdG9yZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dChjb25zdCBtZWRpYTo6T3BlbklucHV0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6T3BlbklucHV0UmVzcG9uc2UqIHJlc3BvbnNlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKQEAgLTIzMSwxOSArMjI2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzcDxJRWZmZWN0PiBjcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVxdWVzdCYgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6Q3JlYXRlRWZmZWN0UmVzcG9uc2UqIHJlc3BvbnNlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKQEAgLTI2NCw3ICsyNDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzKTsKIAogICAgIC8qIEdldCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpOwogCiAgICAgLyogQ3JlYXRlIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTI5MCwxMSArMjc0LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvSGFsUGlkcyhjb25zdCBzdGQ6OnZlY3RvcjxwaWRfdD4mIHBpZHMpOwogCi0gICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWJyYXRvckluZm9zKGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4mIHZpYnJhdG9ySW5mb3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpOworCisgICAgc3RhdHVzX3Qgb25UcmFuc2FjdFdyYXBwZXIoVHJhbnNhY3Rpb25Db2RlIGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4mIGRlbGVnYXRlKSBvdmVycmlkZTsKIAogICAgIC8vIGVuZCBvZiBJQXVkaW9GbGluZ2VyIGludGVyZmFjZQogCkBAIC0zMjAsNiArMzA2LDExIEBACiAgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlSWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKIAorICAgIHZvaWQgdXBkYXRlRG93blN0cmVhbVBhdGNoZXNfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxhdWRpb19pb19oYW5kbGVfdD4gc3RyZWFtcyk7CisKKyAgICBjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIGdldERlZmF1bHRWaWJyYXRvckluZm9fbCgpOworCiBwcml2YXRlOgogICAgIC8vIEZJWE1FIFRoZSA0MDAgaXMgdGVtcG9yYXJpbHkgdG9vIGhpZ2ggdW50aWwgYSBsZWFrIG9mIHdyaXRlcnMgaW4gbWVkaWEubG9nIGlzIGZpeGVkLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MDAgKiAxMDI0OwpAQCAtMzMwLDYgKzMyMSwyNCBAQAogICAgIE11dGV4ICAgICAgICAgICAgICAgbVVucmVnaXN0ZXJlZFdyaXRlcnNMb2NrOwogCiBwdWJsaWM6CisgICAgLy8gTGlmZSBjeWNsZSBvZiBnQXVkaW9GbGluZ2VyIGFuZCBBdWRpb0ZsaW5nZXI6CisgICAgLy8KKyAgICAvLyBBdWRpb0ZsaW5nZXIgaXMgY3JlYXRlZCBvbmNlIGFuZCBzdXJ2aXZlcyB1bnRpbCBhdWRpb3NlcnZlciBjcmFzaGVzCisgICAgLy8gaXJyZXNwZWN0aXZlIG9mIHNwPD4gYW5kIHdwPD4gYXMgaXQgaXMgcmVmY291bnRlZCBieSBTZXJ2aWNlTWFuYWdlciBhbmQgd2UKKyAgICAvLyBkb24ndCBpc3N1ZSBhIFNlcnZpY2VNYW5hZ2VyOjp0cnlVbnJlZ2lzdGVyU2VydmljZSgpLgorICAgIC8vCisgICAgLy8gZ0F1ZGlvRmxpbmdlciBpcyBhbiBhdG9taWMgcG9pbnRlciBzZXQgb24gQXVkaW9GbGluZ2VyOjpvbkZpcnN0UmVmKCkuCisgICAgLy8gQWZ0ZXIgdGhpcyBpcyBzZXQsIGl0IGlzIHNhZmUgdG8gb2J0YWluIGEgd3A8PiBvciBzcDw+IGZyb20gaXQgYXMgdGhlCisgICAgLy8gdW5kZXJseWluZyBvYmplY3QgZG9lcyBub3QgZ28gYXdheS4KKyAgICAvLworICAgIC8vIE5vdGU6IEZvciBtb3N0IGlubmVyIGNsYXNzZXMsIGl0IGlzIGFjY2VwdGFibGUgdG8gaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgb3V0ZXIKKyAgICAvLyBBdWRpb0ZsaW5nZXIgaW5zdGFuY2UgYXMgY3JlYXRpb24gcmVxdWlyZXMgQXVkaW9GbGluZ2VyIHRvIGV4aXN0IGluIHRoZSBmaXJzdCBwbGFjZS4KKyAgICAvLworICAgIC8vIEFuIGF0b21pYyBoZXJlIGVuc3VyZXMgdW5kZXJseWluZyB3cml0ZXMgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIHNldHRpbmcKKyAgICAvLyB0aGUgcG9pbnRlci4gQWNjZXNzIGJ5IG1lbW9yeV9vcmRlcl9zZXFfY3N0LgorICAgIC8vCisKKyAgICBzdGF0aWMgaW5saW5lIHN0ZDo6YXRvbWljPEF1ZGlvRmxpbmdlciAqPiBnQXVkaW9GbGluZ2VyID0gbnVsbHB0cjsKIAogICAgIGNsYXNzIFN5bmNFdmVudDsKIApAQCAtNDA1LDcgKzQxNCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewogICAgICAgICAgICAgLy8gSGFwdGljIGNoYW5uZWwgbWFzayBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGNoYW5uZWwgcG9zaXRpb24gbWFzay4KICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQpAQCAtNDg4LDEyICs0OTcsMTIgQEAKICAgICBjbGFzcyBOb3RpZmljYXRpb25DbGllbnQgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9GbGluZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKLSAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyQ2xpZW50PiBhdWRpb0ZsaW5nZXJDbGllbnQoKSBjb25zdCB7IHJldHVybiBtQXVkaW9GbGluZ2VyQ2xpZW50OyB9CisgICAgICAgICAgICAgICAgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+IGF1ZGlvRmxpbmdlckNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0ZsaW5nZXJDbGllbnQ7IH0KICAgICAgICAgICAgICAgICBwaWRfdCBnZXRQaWQoKSBjb25zdCB7IHJldHVybiBtUGlkOyB9CiAgICAgICAgICAgICAgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQogCkBAIC01MDYsNyArNTE1LDcgQEAKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiAgbUF1ZGlvRmxpbmdlcjsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgbVBpZDsKICAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgbVVpZDsKLSAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlckNsaWVudD4gbUF1ZGlvRmxpbmdlckNsaWVudDsKKyAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb0ZsaW5nZXJDbGllbnQ+IG1BdWRpb0ZsaW5nZXJDbGllbnQ7CiAgICAgfTsKIAogICAgIC8vIC0tLSBNZWRpYUxvZ05vdGlmaWVyIC0tLQpAQCAtNTM5LDYgKzU0OCw3IEBACiAgICAgY29uc3Qgc3A8TWVkaWFMb2dOb3RpZmllcj4gbU1lZGlhTG9nTm90aWZpZXI7CiAKICAgICAvLyBUaGlzIGlzIGEgaGVscGVyIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBpbmNvbWluZyBiaW5kZXIgY2FsbHMuCisgICAgLy8gUmVxdWVzdHMgbWVkaWEubG9nIHRvIHN0YXJ0IG1lcmdpbmcgbG9nIGJ1ZmZlcnMKICAgICB2b2lkIHJlcXVlc3RMb2dNZXJnZSgpOwogCiAgICAgY2xhc3MgVHJhY2tIYW5kbGU7CkBAIC02MjQsMjcgKzYzNCwzOCBAQAogICAgIH0KIAogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawotICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CisgICAgY2xhc3MgVHJhY2tIYW5kbGUgOiBwdWJsaWMgYW5kcm9pZDo6bWVkaWE6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCAgICAgICAgICAgIFRyYWNrSGFuZGxlKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkOjpUcmFjaz4mIHRyYWNrKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2tIYW5kbGUoKTsKLSAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRDYmxrKCkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZmx1c2goKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBwYXVzZSgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7Ci0gICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgb3ZlcnJpZGU7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHNpZ25hbCgpOyAvLyBzaWduYWwgcGxheWJhY2sgdGhyZWFkIGZvciBhIGNoYW5nZSBpbiBjb250cm9sIGJsb2NrCiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIGdldENibGsoc3RkOjpvcHRpb25hbDxtZWRpYTo6U2hhcmVkRmlsZVJlZ2lvbj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXJ0KGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgcGF1c2UoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgYXR0YWNoQXV4RWZmZWN0KGludDMyX3QgZWZmZWN0SWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHNldFBhcmFtZXRlcnMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc2VsZWN0UHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZ2V0VGltZXN0YW1wKG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsKiB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzaWduYWwoKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoCisgICAgICAgICAgICAgICAgaW50MzJfdCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpWb2x1bWVTaGFwZXJTdGF0ZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIGdldER1YWxNb25vTW9kZShtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHNldER1YWxNb25vTW9kZShtZWRpYTo6QXVkaW9EdWFsTW9ub01vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpIG92ZXJyaWRlOworICAgICAgICBiaW5kZXI6OlN0YXR1cyBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BsYXliYWNrUmF0ZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9QbGF5YmFja1JhdGUmIHBsYXliYWNrUmF0ZSkgb3ZlcnJpZGU7CiAKICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBzcDxQbGF5YmFja1RocmVhZDo6VHJhY2s+IG1UcmFjazsKQEAgLTY1OSwxMCArNjgwLDEyIEBACiAgICAgICAgICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAogICAgICAgICAgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2hhcmVBdWRpb0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNoYXJlZEF1ZGlvU3RhcnRNcyk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCBzcDxSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiBtUmVjb3JkVHJhY2s7CkBAIC02ODIsNiArNzA1LDcgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbiwgaW50NjRfdCAqdGltZU5hbm9zKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChjb25zdCBBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpOwpAQCAtNzA0LDcgKzcyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKQEAgLTc1Niw2ICs3ODAsMTMgQEAKIAogICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiBnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogCisgICAgICAgICAgICAgIFRocmVhZEJhc2UgKmhhcHRpY1BsYXliYWNrVGhyZWFkX2woKSBjb25zdDsKKworICAgICAgICAgICAgICB2b2lkIHVwZGF0ZVNlY29uZGFyeU91dHB1dHNGb3JUcmFja19sKAorICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkOjpUcmFjayogdHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQqIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIHNlY29uZGFyeU91dHB1dHMpIGNvbnN0OworCiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpOwpAQCAtNzgyLDcgKzgxMyw3IEBACiAKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKIAotICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgdm9pZCBicm9hZGNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CiAgICAgICAgICAgICAgICAgdm9pZCB1cGRhdGVPdXREZXZpY2VzRm9yUmVjb3JkVGhyZWFkc19sKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBkZXZpY2VzKTsKICAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCkBAIC05NjIsNyArOTkzLDEyIEBACiAgICAgU2ltcGxlTG9nICBtQXBwU2V0UGFyYW1ldGVyTG9nOwogICAgIFNpbXBsZUxvZyAgbVN5c3RlbVNldFBhcmFtZXRlckxvZzsKIAorICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbz4gbUF1ZGlvVmlicmF0b3JJbmZvczsKKwogICAgIHN0YXRpYyBpbmxpbmUgY29uc3RleHByIGNvbnN0IGNoYXIgKm1NZXRyaWNzSWQgPSBBTUVESUFNRVRSSUNTX0tFWV9BVURJT19GTElOR0VSOworCisgICAgLy8gS2VlcCBpbiBzeW5jIHdpdGggamF2YSBkZWZpbml0aW9uIGluIG1lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1JlY29yZC5qYXZhCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtNYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDUwMDA7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcAppbmRleCBkZGExNjRjLi4xNmIyNWY2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC05OCw1ICs5OCw5IEBACiAgICAgcmV0dXJuIG1Id0RldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoJnJlc3VsdCkgPT0gT0sgPyByZXN1bHQgOiBmYWxzZTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Id0RldmljZTo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdCB7CisgICAgcmV0dXJuIG1Id0RldmljZS0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworfQorCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCA2NzA5ZDE3Li5mYzJjNjkzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTgzLDYgKzgzLDggQEAKIAogICAgIGJvb2wgc3VwcG9ydHNBdWRpb1BhdGNoZXMoKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CisKIHByaXZhdGU6CiAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgICAgICAgIG1Nb2R1bGVOYW1lOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKaW5kZXggN2UwNjA5Ni4uZDg1NjViZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCkBAIC0xNzMsMjIgKzE3MywxNSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvU3RyZWFtT3V0OjpnZXRGb3JtYXQoKSBjb25zdAorYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb1N0cmVhbU91dDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgY29uc3QKIHsKLSAgICBhdWRpb19mb3JtYXRfdCByZXN1bHQ7Ci0gICAgcmV0dXJuIHN0cmVhbS0+Z2V0Rm9ybWF0KCZyZXN1bHQpID09IE9LID8gcmVzdWx0IDogQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvU3RyZWFtT3V0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCByZXN1bHQ7Ci0gICAgcmV0dXJuIHN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgmcmVzdWx0KSA9PSBPSyA/IHJlc3VsdCA6IDA7Ci19Ci0KLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvU3RyZWFtT3V0OjpnZXRDaGFubmVsTWFzaygpIGNvbnN0Ci17Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcmVzdWx0OwotICAgIHJldHVybiBzdHJlYW0tPmdldENoYW5uZWxNYXNrKCZyZXN1bHQpID09IE9LID8gcmVzdWx0IDogQVVESU9fQ0hBTk5FTF9JTlZBTElEOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgcmVzdWx0ID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgaWYgKHN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZyZXN1bHQpICE9IE9LKSB7CisgICAgICAgIHJlc3VsdC5zYW1wbGVfcmF0ZSA9IDA7CisgICAgICAgIHJlc3VsdC5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgICAgIHJlc3VsdC5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogaW50IEF1ZGlvU3RyZWFtT3V0OjpmbHVzaCgpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCmluZGV4IDE2ZmJjZjIuLjU2NWY0M2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCkBAIC04MSwyMiArODEsMTQgQEAKICAgICB2aXJ0dWFsIHNpemVfdCBnZXRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtSGFsRnJhbWVTaXplOyB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIGZvcm1hdCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICogQHJldHVybiBhdWRpbyBzdHJlYW0gY29uZmlndXJhdGlvbjogY2hhbm5lbCBtYXNrLCBmb3JtYXQsIHNhbXBsZSByYXRlOgorICAgICAqICAgLSBjaGFubmVsIG1hc2sgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLAorICAgICAqICAgICBUaGUgSEFMIGlzIGluIHN0ZXJlbyBtb2RlIHdoZW4gcGxheWluZyBtdWx0aS1jaGFubmVsIGNvbXByZXNzZWQgYXVkaW8gb3ZlciBIRE1JOworICAgICAqICAgLSBmb3JtYXQgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyOworICAgICAqICAgLSBzYW1wbGUgcmF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIsCisgICAgICogICAgIFRoZSBIQUwgbWF5IGJlIHJ1bm5pbmcgYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUgaWYsIGZvciBleGFtcGxlLCBwbGF5aW5nIHdyYXBwZWQgRUFDMy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIEhBTCBtYXkgYmUgcnVubmluZyBhdCBhIGhpZ2hlciBzYW1wbGUgcmF0ZSBpZiwgZm9yIGV4YW1wbGUsIHBsYXlpbmcgd3JhcHBlZCBFQUMzLgotICAgICAqIEByZXR1cm4gc2FtcGxlIHJhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgotICAgICAqLwotICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIEhBTCBpcyBpbiBzdGVyZW8gbW9kZSB3aGVuIHBsYXlpbmcgbXVsdGktY2hhbm5lbCBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSS4KLSAgICAgKiBAcmV0dXJuIGNoYW5uZWwgbWFzayBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0OwotCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldEF1ZGlvUHJvcGVydGllcygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwCmluZGV4IDVmZjcyMTUuLmNlY2Q1MmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5jcHAKQEAgLTMwLDYgKzMwLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBtZWRpYTo6SUVmZmVjdENsaWVudDsKKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICBjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gpIHsKICAgICBBTE9HVigiJXMgaGFuZGxlICVkIG1IYWxIYW5kbGUgJWQgbnVtIHNpbmtzICVkIGRldmljZSBzaW5rICUwOHgiLApAQCAtMTE1LDEwICsxMTcsMTkgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpjaGVja0VmZmVjdENvbXBhdGliaWxpdHkoCiAgICAgICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpIHsKKyAgICBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gZWZmZWN0c0ZhY3RvcnkgPSBtQXVkaW9GbGluZ2VyLmdldEVmZmVjdHNGYWN0b3J5KCk7CisgICAgaWYgKGVmZmVjdHNGYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKLSAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DCi0gICAgICAgICYmIChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKLSAgICAgICAgQUxPR1coIiVzKCkgbm9uIHByZS9wb3N0IHByb2Nlc3NpbmcgZGV2aWNlIGVmZmVjdCAlcyIsIF9fZnVuY19fLCBkZXNjLT5uYW1lKTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc01pbkRldmljZUVmZmVjdEhhbFZlcnNpb24gPSA2LjA7CisgICAgZmxvYXQgaGFsVmVyc2lvbiA9IGVmZmVjdHNGYWN0b3J5LT5nZXRIYWxWZXJzaW9uKCk7CisKKyAgICBpZiAoKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQworICAgICAgICAgICAgJiYgKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykKKyAgICAgICAgICAgIHx8IGhhbFZlcnNpb24gPCBzTWluRGV2aWNlRWZmZWN0SGFsVmVyc2lvbikgeworICAgICAgICBBTE9HVygiJXMoKSBub24gcHJlL3Bvc3QgcHJvY2Vzc2luZyBkZXZpY2UgZWZmZWN0ICVzIG9yIGluY29tcGF0aWJsZSBBUEkgdmVyc2lvbiAlZiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGRlc2MtPm5hbWUsIGhhbFZlcnNpb24pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9EZXZpY2VFZmZlY3RNYW5hZ2VyLmgKaW5kZXggODFlNjA2NS4uYTA1ZjVmZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oCkBAIC0zMyw3ICszMyw3IEBACiAgICAgc3A8RWZmZWN0SGFuZGxlPiBjcmVhdGVFZmZlY3RfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMsCiAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAogICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCkBAIC0xNjUsNiArMTY1LDcgQEAKICAgICB1aW50MzJfdCAgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgIHNpemVfdCAgICBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KICAgICB1aW50MzJfdCAgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CiAKQEAgLTE4Miw3ICsxODMsNyBAQAogICAgIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCBfX3VudXNlZCwgYm9vbCB0aHJlYWRMb2NrZWQgX191bnVzZWQpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCByZXNldFZvbHVtZSgpIG92ZXJyaWRlIHt9Ci0gICAgdWludDMyX3Qgc3RyYXRlZ3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KDApOyB9CiAgICAgaW50MzJfdCBhY3RpdmVUcmFja0NudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlIHt9CiAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCAzZGZlYjgzLi5iMjY3ZDg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfaGFwdGljZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X25zLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgpAQCAtMzMsNiArMzQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgorI2luY2x1ZGUgPG1lZGlhL1NobWVtQ29tcGF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KQEAgLTU4LDYgKzYwLDI4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYWlkbF91dGlsczo6c3RhdHVzVEZyb21CaW5kZXJTdGF0dXM7Cit1c2luZyBiaW5kZXI6OlN0YXR1czsKKworbmFtZXNwYWNlIHsKKworLy8gQXBwZW5kIGEgUE9EIHZhbHVlIGludG8gYSB2ZWN0b3Igb2YgYnl0ZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBhcHBlbmRUb0J1ZmZlcihjb25zdCBUJiB2YWx1ZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGJ1ZmZlcikgeworICAgIGNvbnN0IHVpbnQ4X3QqIGFyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCZ2YWx1ZSkpOworICAgIGJ1ZmZlci0+aW5zZXJ0KGJ1ZmZlci0+ZW5kKCksIGFyLCBhciArIHNpemVvZihUKSk7Cit9CisKKy8vIFdyaXRlIGEgUE9EIHZhbHVlIGludG8gYSB2ZWN0b3Igb2YgYnl0ZXMgKGNsZWFycyB0aGUgcHJldmlvdXMgYnVmZmVyCisvLyBjb250ZW50KS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHdyaXRlVG9CdWZmZXIoY29uc3QgVCYgdmFsdWUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIpIHsKKyAgICBidWZmZXItPmNsZWFyKCk7CisgICAgYXBwZW5kVG9CdWZmZXIodmFsdWUsIGJ1ZmZlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyAgRWZmZWN0QmFzZSBpbXBsZW1lbnRhdGlvbgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI4LDEyICsxNTIsMTIgQEAKICAgICBpZiAoZnJvbUhhbmRsZSkgewogICAgICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKHRoaXMsIGZhbHNlLCBmYWxzZSAvKnRocmVhZExvY2tlZCovKTsKKyAgICAgICAgICAgICAgICBnZXRDYWxsYmFjaygpLT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQodGhpcywgZmFsc2UsIGZhbHNlIC8qdGhyZWFkTG9ja2VkKi8pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRWZmZWN0RW5hYmxlKHRoaXMpOworICAgICAgICAgICAgICAgIGdldENhbGxiYWNrKCktPm9uRWZmZWN0RW5hYmxlKHRoaXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVmZmVjdERpc2FibGUodGhpcyk7CisgICAgICAgICAgICBnZXRDYWxsYmFjaygpLT5vbkVmZmVjdERpc2FibGUodGhpcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTIxNCw3ICsyMzgsNyBAQAogICAgIGJvb2wgZG9FbmFibGUgPSBmYWxzZTsKICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIHVpbnQzMl90IHN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTIyMyw4ICsyNDcsOSBAQAogICAgICAgICAgICAgZG9SZWdpc3RlciA9IHRydWU7CiAgICAgICAgICAgICBtUG9saWN5UmVnaXN0ZXJlZCA9IG1IYW5kbGVzLnNpemUoKSA+IDA7CiAgICAgICAgICAgICBpZiAobVBvbGljeVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBpbyA9IG1DYWxsYmFjay0+aW8oKTsKLSAgICAgICAgICAgICAgICBzdHJhdGVneSA9IG1DYWxsYmFjay0+c3RyYXRlZ3koKTsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgICBpbyA9IGNhbGxiYWNrLT5pbygpOworICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID0gY2FsbGJhY2stPnN0cmF0ZWd5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gZW5hYmxlIGVmZmVjdCB3aGVuIHJlZ2lzdGVyZWQgYWNjb3JkaW5nIHRvIGVuYWJsZSBzdGF0ZSByZXF1ZXN0ZWQgYnkgY29udHJvbGxpbmcgaGFuZGxlCkBAIC0yMzcsNiArMjYyLDEyIEBACiAgICAgICAgIH0KICAgICAgICAgcmVnaXN0ZXJlZCA9IG1Qb2xpY3lSZWdpc3RlcmVkOwogICAgICAgICBlbmFibGVkID0gbVBvbGljeUVuYWJsZWQ7CisgICAgICAgIC8vIFRoZSBzaW11bHRhbmVvdXMgcmVsZWFzZSBvZiB0d28gRWZmZWN0SGFuZGxlcyB3aXRoIHRoZSBzYW1lIEVmZmVjdE1vZHVsZQorICAgICAgICAvLyBtYXkgY2F1c2UgdXMgdG8gY2FsbCB0aGlzIG1ldGhvZCBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICAvLyBUaGlzIG1heSBkZWFkbG9jayB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgKGIvMTgwOTQxNzIwKS4gIEF2b2lkIHRoaXMuCisgICAgICAgIGlmICghZG9SZWdpc3RlciAmJiAhKHJlZ2lzdGVyZWQgJiYgZG9FbmFibGUpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgbVBvbGljeUxvY2subG9jaygpOwogICAgIH0KICAgICBBTE9HVigiJXMgbmFtZSAlcyBpZCAlZCBzZXNzaW9uICVkIGRvUmVnaXN0ZXIgJWQgcmVnaXN0ZXJlZCAlZCBkb0VuYWJsZSAlZCBlbmFibGVkICVkIiwKQEAgLTI5Miw2ICszMjMsOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgorICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCisgICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgogICAgIGlmIChtSGFuZGxlcy5zaXplKCkgPT0gMCAmJiAhbVBpbm5lZCkgewogICAgICAgICBtU3RhdGUgPSBERVNUUk9ZRUQ7CiAgICAgfQpAQCAtMzE2LDggKzM1MCw5IEBACiAvLyB1bnNhZmUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBlZmZlY3QgcGFyZW50IHRocmVhZCBoYXMgYmVlbiBkZXN0cm95ZWQKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpkaXNjb25uZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KQogeworICAgIGNvbnN0IGF1dG8gY2FsbGJhY2sgPSBnZXRDYWxsYmFjaygpOwogICAgIEFMT0dWKCJkaXNjb25uZWN0KCkgJXAgaGFuZGxlICVwIiwgdGhpcywgaGFuZGxlKTsKLSAgICBpZiAobUNhbGxiYWNrLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKGhhbmRsZSwgdW5waW5JZkxhc3QpKSB7CisgICAgaWYgKGNhbGxiYWNrLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKGhhbmRsZSwgdW5waW5JZkxhc3QpKSB7CiAgICAgICAgIHJldHVybiBtSGFuZGxlcy5zaXplKCk7CiAgICAgfQogCkBAIC0zMjUsNyArMzYwLDcgQEAKICAgICBzc2l6ZV90IG51bUhhbmRsZXMgPSByZW1vdmVIYW5kbGVfbChoYW5kbGUpOwogICAgIGlmICgobnVtSGFuZGxlcyA9PSAwKSAmJiAoIW1QaW5uZWQgfHwgdW5waW5JZkxhc3QpKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBtQ2FsbGJhY2stPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyh0aGlzKTsKKyAgICAgICAgY2FsbGJhY2stPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyh0aGlzKTsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgIH0KICAgICByZXR1cm4gbnVtSGFuZGxlczsKQEAgLTM0NCw3ICszNzksNyBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZTo6Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCB0aHJlYWRMb2NrZWQpIHsKLSAgICBtQ2FsbGJhY2stPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCh0aGlzLCBlbmFibGVkLCB0aHJlYWRMb2NrZWQpOworICAgIGdldENhbGxiYWNrKCktPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCh0aGlzLCBlbmFibGVkLCB0aHJlYWRMb2NrZWQpOwogfQogCiBzdGF0aWMgU3RyaW5nOCBlZmZlY3RGbGFnc1RvU3RyaW5nKHVpbnQzMl90IGZsYWdzKSB7CkBAIC01MjMsNyArNTU4LDggQEAKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtTWF4RGlzYWJsZVdhaXRDbnQoMSksIC8vIHNldCBieSBjb25maWd1cmUoKSwgc2hvdWxkIGJlID49IDEKICAgICAgIG1EaXNhYmxlV2FpdENudCgwKSwgICAgLy8gc2V0IGJ5IHByb2Nlc3MoKSBhbmQgdXBkYXRlU3RhdGUoKQotICAgICAgbU9mZmxvYWRlZChmYWxzZSkKKyAgICAgIG1PZmZsb2FkZWQoZmFsc2UpLAorICAgICAgbUFkZGVkVG9IYWwoZmFsc2UpCiAjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCiAgICAgICAsIG1TdXBwb3J0c0Zsb2F0KGZhbHNlKQogI2VuZGlmCkBAIC01NjUsMjAgKzYwMSw2IEBACiAKIH0KIAotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpCi17Ci0gICAgc3NpemVfdCBzdGF0dXMgPSBFZmZlY3RCYXNlOjpyZW1vdmVIYW5kbGVfbChoYW5kbGUpOwotCi0gICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgotICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCi0gICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgotICAgIGlmIChzdGF0dXMgPT0gMCAmJiAhbVBpbm5lZCkgewotICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jbG9zZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnVwZGF0ZVN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKQEAgLTgxNiw3ICs4MzgsNyBAQAogICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyAhPSBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3KSB7CiAgICAgICAgIC8vIElmIGFuIGluc2VydCBlZmZlY3QgaXMgaWRsZSBhbmQgaW5wdXQgYnVmZmVyIGlzIGRpZmZlcmVudCBmcm9tIG91dHB1dCBidWZmZXIsCiAgICAgICAgIC8vIGFjY3VtdWxhdGUgaW5wdXQgb250byBvdXRwdXQKLSAgICAgICAgaWYgKG1DYWxsYmFjay0+YWN0aXZlVHJhY2tDbnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChnZXRDYWxsYmFjaygpLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKICAgICAgICAgICAgIC8vIHNpbWlsYXIgaGFuZGxpbmcgd2l0aCBkYXRhX2J5cGFzcyBhYm92ZS4KICAgICAgICAgICAgIGlmIChtQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOwpAQCAtODQxLDYgKzg2Myw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHVpbnQzMl90IHNpemU7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IGNhbGxiYWNrOwogCiAgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwpAQCAtODUxLDcgKzg3NCw4IEBACiAgICAgLy8gVE9ETzogaGFuZGxlIGNvbmZpZ3VyYXRpb24gb2YgaW5wdXQgKHJlY29yZCkgU1cgZWZmZWN0cyBhYm92ZSB0aGUgSEFMLAogICAgIC8vIHNpbWlsYXIgdG8gb3V0cHV0IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUL1JFUExBQ0UsCiAgICAgLy8gaW4gd2hpY2ggY2FzZSBpbnB1dCBjaGFubmVsIG1hc2tzIHNob3VsZCBiZSB1c2VkIGhlcmUuCi0gICAgY2hhbm5lbE1hc2sgPSBtQ2FsbGJhY2stPmNoYW5uZWxNYXNrKCk7CisgICAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjaygpOworICAgIGNoYW5uZWxNYXNrID0gY2FsbGJhY2stPmNoYW5uZWxNYXNrKCk7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxNYXNrOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAKQEAgLTg3OSw2ICs5MDMsMTEgQEAKICAgICAgICAgfQogI2VuZGlmCiAgICAgfQorICAgIGlmIChpc0hhcHRpY0dlbmVyYXRvcigpKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gY2FsbGJhY2stPmhhcHRpY0NoYW5uZWxNYXNrKCk7CisgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgfD0gaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzIHw9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIH0KICAgICBtSW5DaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogICAgIG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgPQpAQCAtODg4LDExICs5MTcsMTEgQEAKICAgICBtQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKIAogICAgIC8vIERvbid0IHVzZSBzYW1wbGUgcmF0ZSBmb3IgdGhyZWFkIGlmIGVmZmVjdCBpc24ndCBvZmZsb2FkYWJsZS4KLSAgICBpZiAobUNhbGxiYWNrLT5pc09mZmxvYWRPckRpcmVjdCgpICYmICFpc09mZmxvYWRlZCgpKSB7CisgICAgaWYgKGNhbGxiYWNrLT5pc09mZmxvYWRPckRpcmVjdCgpICYmICFpc09mZmxvYWRlZCgpKSB7CiAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gREVGQVVMVF9PVVRQVVRfU0FNUExFX1JBVEU7CiAgICAgICAgIEFMT0dWKCJPdmVycmlkaW5nIGVmZmVjdCBpbnB1dCBhcyA0OGtIeiIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNhbGxiYWNrLT5zYW1wbGVSYXRlKCk7CisgICAgICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY2FsbGJhY2stPnNhbXBsZVJhdGUoKTsKICAgICB9CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtOTE4LDExICs5NDcsMTEgQEAKICAgICB9CiAgICAgbUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwotICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBtQ2FsbGJhY2stPmZyYW1lQ291bnQoKTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gY2FsbGJhY2stPmZyYW1lQ291bnQoKTsKICAgICBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQ7CiAKICAgICBBTE9HVigiY29uZmlndXJlKCkgJXAgY2hhaW4gJXAgYnVmZmVyICVwIGZyYW1lY291bnQgJXp1IiwKLSAgICAgICAgICB0aGlzLCBtQ2FsbGJhY2stPmNoYWluKCkucHJvbW90ZSgpLmdldCgpLAorICAgICAgICAgIHRoaXMsIGNhbGxiYWNrLT5jaGFpbigpLnByb21vdGUoKS5nZXQoKSwKICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwogCiAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwpAQCAtOTM4LDcgKzk2Nyw3IEBACiAKICNpZmRlZiBNVUxUSUNIQU5ORUxfRUZGRUNUX0NIQUlOCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJgotICAgICAgICAgICAgbUNhbGxiYWNrLT5pc091dHB1dCgpICYmCisgICAgICAgICAgICBjYWxsYmFjay0+aXNPdXRwdXQoKSAmJgogICAgICAgICAgICAgKG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPCiAgICAgICAgICAgICAgICAgICAgIHx8IG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKICAgICAgICAgLy8gT2xkZXIgZWZmZWN0cyBtYXkgcmVxdWlyZSBleGFjdCBTVEVSRU8gcG9zaXRpb24gbWFzay4KQEAgLTEwMDUsNyArMTAzNCw3IEBACiAgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludCk7CiAgICAgICAgICAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9MQVRFTkNZOwogCi0gICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gbUNhbGxiYWNrLT5sYXRlbmN5KCk7CisgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gY2FsbGJhY2stPmxhdGVuY3koKTsKIAogICAgICAgICAgICAgKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKT0gbGF0ZW5jeTsKICAgICAgICAgICAgIG1FZmZlY3RJbnRlcmZhY2UtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCkBAIC0xMDUyLDcgKzEwODEsMTIgQEAKIHsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CiAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7Ci0gICAgICAgICh2b2lkKW1DYWxsYmFjay0+YWRkRWZmZWN0VG9IYWwobUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgIGlmIChtQWRkZWRUb0hhbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgKHZvaWQpZ2V0Q2FsbGJhY2soKS0+YWRkRWZmZWN0VG9IYWwobUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgIG1BZGRlZFRvSGFsID0gdHJ1ZTsKICAgICB9CiB9CiAKQEAgLTEwNjUsNyArMTA5OSw3IEBACiAgICAgICAgIHN0YXR1cyA9IHN0YXJ0X2woKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtQ2FsbGJhY2stPnJlc2V0Vm9sdW1lKCk7CisgICAgICAgIGdldENhbGxiYWNrKCktPnJlc2V0Vm9sdW1lKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xMTE1LDcgKzExNDksNyBAQAogICAgICAgICAvLyBXZSBoYXZlIHRoZSBFZmZlY3RDaGFpbiBhbmQgRWZmZWN0TW9kdWxlIGxvY2ssIHBlcm1pdCBhIHJlZW50cmFudCBjYWxsIHRvIHNldFZvbHVtZToKICAgICAgICAgLy8gcmVzZXRWb2x1bWVfbCAtLT4gc2V0Vm9sdW1lX2wgLS0+IEVmZmVjdE1vZHVsZTo6c2V0Vm9sdW1lCiAgICAgICAgIG1TZXRWb2x1bWVSZWVudHJhbnRUaWQgPSBnZXR0aWQoKTsKLSAgICAgICAgbUNhbGxiYWNrLT5yZXNldFZvbHVtZSgpOworICAgICAgICBnZXRDYWxsYmFjaygpLT5yZXNldFZvbHVtZSgpOwogICAgICAgICBtU2V0Vm9sdW1lUmVlbnRyYW50VGlkID0gSU5WQUxJRF9QSUQ7CiAgICAgfQogCkBAIC0xMTQ4LDcgKzExODIsMTIgQEAKIHsKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BSRV9QUk9DIHx8CiAgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgewotICAgICAgICBtQ2FsbGJhY2stPnJlbW92ZUVmZmVjdEZyb21IYWwobUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgIGlmICghbUFkZGVkVG9IYWwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGdldENhbGxiYWNrKCktPnJlbW92ZUVmZmVjdEZyb21IYWwobUVmZmVjdEludGVyZmFjZSk7CisgICAgICAgIG1BZGRlZFRvSGFsID0gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTExNjAsMTEgKzExOTksMTAgQEAKICAgICByZXR1cm4gcmVtYWluZGVyID09IDAgPyAwIDogZGl2aXNvciAtIHJlbWFpbmRlcjsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbW1hbmQoaW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJlcGx5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiByZXBseSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEFMT0dWVigiY29tbWFuZCgpLCBjbWRDb2RlOiAlZCwgbUVmZmVjdEludGVyZmFjZTogJXAiLCBjbWRDb2RlLCBtRWZmZWN0SW50ZXJmYWNlLmdldCgpKTsKQEAgLTExNzUsNjMgKzEyMTMsNjggQEAKICAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gbVN0YXR1czsKICAgICB9CisgICAgaWYgKG1heFJlcGx5U2l6ZSA8IDAgfHwgbWF4UmVwbHlTaXplID4gRUZGRUNUX1BBUkFNX1NJWkVfTUFYKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzaXplX3QgY21kU2l6ZSA9IGNtZERhdGEuc2l6ZSgpOworICAgIGNvbnN0IGVmZmVjdF9wYXJhbV90KiBwYXJhbSA9IGNtZFNpemUgPj0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBlZmZlY3RfcGFyYW1fdCo+KGNtZERhdGEuZGF0YSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKICAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9QQVJBTSAmJgotICAgICAgICAgICAgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPiBjbWRTaXplIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoZWZmZWN0X3BhcmFtX3QgKilwQ21kRGF0YSktPnBzaXplID4gY21kU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSkpIHsKKyAgICAgICAgICAgIChwYXJhbSA9PSBudWxscHRyIHx8IHBhcmFtLT5wc2l6ZSA+IGNtZFNpemUgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpKSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNDM4NTk0Iik7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzMwMDM4MjIiKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX1BBUkFNICYmCi0gICAgICAgICAgICAoKnJlcGx5U2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUgPiAqcmVwbHlTaXplIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSkpIHsKKyAgICAgICAgICAgIChtYXhSZXBseVNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8CisgICAgICAgICAgICAgICAgICAgcGFyYW0tPnBzaXplID4gbWF4UmVwbHlTaXplIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSkpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTI1MTU1MyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfUEFSQU0gJiYKLSAgICAgICAgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPiAqcmVwbHlTaXplCi0gICAgICAgICAgfHwgKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUgPiAqcmVwbHlTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKLSAgICAgICAgICB8fCAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT52c2l6ZSA+ICpyZXBseVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT5wc2l6ZQotICAgICAgICAgIHx8IHJvdW5kVXBEZWx0YSgoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT5wc2l6ZSwgKHVpbnQzMl90KXNpemVvZihpbnQpKSA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+dnNpemUpKSB7CisgICAgICAgICAgICAoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSA+IG1heFJlcGx5U2l6ZQorICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+cHNpemUgPiBtYXhSZXBseVNpemUgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCisgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT52c2l6ZSA+IG1heFJlcGx5U2l6ZSAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBhcmFtLT5wc2l6ZQorICAgICAgICAgICAgICAgICAgICB8fCByb3VuZFVwRGVsdGEocGFyYW0tPnBzaXplLCAodWludDMyX3QpIHNpemVvZihpbnQpKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmVwbHlTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcGFyYW0tPnBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBhcmFtLT52c2l6ZSkpIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRUZGRUNUX0NNRF9HRVRfUEFSQU06IHJlcGx5IHNpemUgaW5jb25zaXN0ZW50Iik7CiAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjMyNzA1NDM4Iik7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICBpZiAoKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU0KLSAgICAgICAgICAgIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQpICYmICAvLyBERUZFUlJFRCBub3QgZ2VuZXJhbGx5IHVzZWQKLSAgICAgICAgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPiBjbWRTaXplCi0gICAgICAgICAgICB8fCAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT5wc2l6ZSA+IGNtZFNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCi0gICAgICAgICAgICB8fCAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT52c2l6ZSA+IGNtZFNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUKLSAgICAgICAgICAgIHx8IHJvdW5kVXBEZWx0YSgoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT5wc2l6ZSwgKHVpbnQzMl90KXNpemVvZihpbnQpKSA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZFNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhKS0+cHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGEpLT52c2l6ZSkpIHsKKyAgICAgICAgICAgIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfUEFSQU1fREVGRVJSRUQpCisgICAgICAgICAgICAmJiAgLy8gREVGRVJSRUQgbm90IGdlbmVyYWxseSB1c2VkCisgICAgICAgICAgICAgICAgICAgIChwYXJhbSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnBzaXplID4gY21kU2l6ZSAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+dnNpemUgPiBjbWRTaXplIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwYXJhbS0+cHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3VuZFVwRGVsdGEocGFyYW0tPnBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpIHNpemVvZihpbnQpKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2l6ZW9mKGVmZmVjdF9wYXJhbV90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBhcmFtLT5wc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHBhcmFtLT52c2l6ZSkpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMDIwNDMwMSIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisgICAgdWludDMyX3QgcmVwbHlTaXplID0gbWF4UmVwbHlTaXplOworICAgIHJlcGx5LT5yZXNpemUocmVwbHlTaXplKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmVwbHlEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KGNtZERhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS0+ZGF0YSgpKTsKKyAgICByZXBseS0+cmVzaXplKHN0YXR1cyA9PSBOT19FUlJPUiA/IHJlcGx5U2l6ZSA6IDApOwogICAgIGlmIChjbWRDb2RlICE9IEVGRkVDVF9DTURfR0VUX1BBUkFNICYmIHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICB1aW50MzJfdCBzaXplID0gKHJlcGx5U2l6ZSA9PSBOVUxMKSA/IDAgOiAqcmVwbHlTaXplOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1IYW5kbGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmggPSBtSGFuZGxlc1tpXTsKICAgICAgICAgICAgIGlmIChoICE9IE5VTEwgJiYgIWgtPmRpc2Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCBzaXplLCBwUmVwbHlEYXRhKTsKKyAgICAgICAgICAgICAgICBoLT5jb21tYW5kRXhlY3V0ZWQoY21kQ29kZSwgY21kRGF0YSwgKnJlcGx5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEyNjAsNyArMTMwMyw3IEBACiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdAogewotICAgIHJldHVybiBtQ2FsbGJhY2stPmlzT2ZmbG9hZE9yRGlyZWN0KCk7CisgICAgcmV0dXJuIGdldENhbGxiYWNrKCktPmlzT2ZmbG9hZE9yRGlyZWN0KCk7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSBjb25zdApAQCAtMTMwNCw3ICsxMzQ3LDcgQEAKICAgICAgICAgICAgICAgICB8fCBzaXplID4gbUluQ29udmVyc2lvbkJ1ZmZlci0+Z2V0U2l6ZSgpKSkgewogICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci5jbGVhcigpOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBhbGxvY2F0aW5nIG1JbkNvbnZlcnNpb25CdWZmZXIgJXp1IiwgX19mdW5jX18sIHNpemUpOwotICAgICAgICAgICAgKHZvaWQpbUNhbGxiYWNrLT5hbGxvY2F0ZUhhbEJ1ZmZlcihzaXplLCAmbUluQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICAodm9pZClnZXRDYWxsYmFjaygpLT5hbGxvY2F0ZUhhbEJ1ZmZlcihzaXplLCAmbUluQ29udmVyc2lvbkJ1ZmZlcik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JbkNvbnZlcnNpb25CdWZmZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbUluQ29udmVyc2lvbkJ1ZmZlci0+c2V0RnJhbWVDb3VudChpbkZyYW1lQ291bnQpOwpAQCAtMTM0OCw3ICsxMzkxLDcgQEAKICAgICAgICAgICAgICAgICB8fCBzaXplID4gbU91dENvbnZlcnNpb25CdWZmZXItPmdldFNpemUoKSkpIHsKICAgICAgICAgICAgIG1PdXRDb252ZXJzaW9uQnVmZmVyLmNsZWFyKCk7CiAgICAgICAgICAgICBBTE9HVigiJXM6IGFsbG9jYXRpbmcgbU91dENvbnZlcnNpb25CdWZmZXIgJXp1IiwgX19mdW5jX18sIHNpemUpOwotICAgICAgICAgICAgKHZvaWQpbUNhbGxiYWNrLT5hbGxvY2F0ZUhhbEJ1ZmZlcihzaXplLCAmbU91dENvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgKHZvaWQpZ2V0Q2FsbGJhY2soKS0+YWxsb2NhdGVIYWxCdWZmZXIoc2l6ZSwgJm1PdXRDb252ZXJzaW9uQnVmZmVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU91dENvbnZlcnNpb25CdWZmZXIgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXItPnNldEZyYW1lQ291bnQob3V0RnJhbWVDb3VudCk7CkBAIC0xNTIyLDYgKzE1NjUsNjkgQEAKICAgICByZXR1cm4gbU9mZmxvYWRlZDsKIH0KIAorLypzdGF0aWMqLworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNIYXB0aWNHZW5lcmF0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSkgeworICAgIHJldHVybiBtZW1jbXAodHlwZSwgRlhfSUlEX0hBUFRJQ0dFTkVSQVRPUiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc0hhcHRpY0dlbmVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNIYXB0aWNHZW5lcmF0b3IoJm1EZXNjcmlwdG9yLnR5cGUpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SGFwdGljSW50ZW5zaXR5KGludCBpZCwgaW50IGludGVuc2l0eSkKK3sKKyAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gbVN0YXR1czsKKyAgICB9CisgICAgaWYgKCFpc0hhcHRpY0dlbmVyYXRvcigpKSB7CisgICAgICAgIEFMT0dXKCJTaG91bGQgbm90IHNldCBoYXB0aWMgaW50ZW5zaXR5IGZvciBlZmZlY3RzIHRoYXQgYXJlIG5vdCBIYXB0aWNHZW5lcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Qoc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIDMgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICBlZmZlY3RfcGFyYW1fdCAqcGFyYW0gPSAoZWZmZWN0X3BhcmFtX3QqKSByZXF1ZXN0LmRhdGEoKTsKKyAgICBwYXJhbS0+cHNpemUgPSBzaXplb2YoaW50MzJfdCk7CisgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGludDMyX3QpICogMjsKKyAgICAqKGludDMyX3QqKXBhcmFtLT5kYXRhID0gSEdfUEFSQU1fSEFQVElDX0lOVEVOU0lUWTsKKyAgICAqKChpbnQzMl90KilwYXJhbS0+ZGF0YSArIDEpID0gaWQ7CisgICAgKigoaW50MzJfdCopcGFyYW0tPmRhdGEgKyAyKSA9IGludGVuc2l0eTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb21tYW5kKEVGRkVDVF9DTURfU0VUX1BBUkFNLCByZXF1ZXN0LCBzaXplb2YoaW50MzJfdCksICZyZXNwb25zZSk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3BvbnNlLnNpemUoKSAhPSA0KTsKKyAgICAgICAgc3RhdHVzID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RhdHVzX3QqPihyZXNwb25zZS5kYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0VmlicmF0b3JJbmZvKGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogdmlicmF0b3JJbmZvKQoreworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBtU3RhdHVzOworICAgIH0KKyAgICBpZiAoIWlzSGFwdGljR2VuZXJhdG9yKCkpIHsKKyAgICAgICAgQUxPR1coIlNob3VsZCBub3Qgc2V0IHZpYnJhdG9yIGluZm8gZm9yIGVmZmVjdHMgdGhhdCBhcmUgbm90IEhhcHRpY0dlbmVyYXRvciIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdCgKKyAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YoaW50MzJfdCkgKyAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gKGVmZmVjdF9wYXJhbV90KikgcmVxdWVzdC5kYXRhKCk7CisgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGludDMyX3QpOworICAgIHBhcmFtLT52c2l6ZSA9IDIgKiBzaXplb2YoZmxvYXQpOworICAgICooaW50MzJfdCopcGFyYW0tPmRhdGEgPSBIR19QQVJBTV9WSUJSQVRPUl9JTkZPOworICAgIGZsb2F0KiB2aWJyYXRvckluZm9QdHIgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ocGFyYW0tPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOworICAgIHZpYnJhdG9ySW5mb1B0clswXSA9IHZpYnJhdG9ySW5mby0+cmVzb25hbnRGcmVxdWVuY3k7CisgICAgdmlicmF0b3JJbmZvUHRyWzFdID0gdmlicmF0b3JJbmZvLT5xRmFjdG9yOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc3BvbnNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sIHJlcXVlc3QsIHNpemVvZihpbnQzMl90KSwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzcG9uc2Uuc2l6ZSgpICE9IHNpemVvZihzdGF0dXNfdCkpOworICAgICAgICBzdGF0dXMgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdGF0dXNfdCo+KHJlc3BvbnNlLmRhdGEoKSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHN0YXRpYyBzdGQ6OnN0cmluZyBkdW1wSW5PdXRCdWZmZXIoYm9vbCBpc0lucHV0LCBjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+ICZidWZmZXIpIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIApAQCAtMTYwMCw5ICsxNzA2LDkgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGUiCiAKIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSkKICAgICA6IEJuRWZmZWN0KCksCiAgICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0Q2xpZW50KGVmZmVjdENsaWVudCksIG1DbGllbnQoY2xpZW50KSwgbUNibGsoTlVMTCksCiAgICAgbVByaW9yaXR5KHByaW9yaXR5KSwgbUhhc0NvbnRyb2woZmFsc2UpLCBtRW5hYmxlZChmYWxzZSksIG1EaXNjb25uZWN0ZWQoZmFsc2UpCkBAIC0xNjM2LDIwICsxNzQyLDI0IEBACiAgICAgcmV0dXJuIG1DbGllbnQgPT0gMCB8fCBtQ2Jsa01lbW9yeSAhPSAwID8gT0sgOiBOT19NRU1PUlk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjplbmFibGUoKQorI2RlZmluZSBSRVRVUk4oY29kZSkgXAorICAqX2FpZGxfcmV0dXJuID0gKGNvZGUpOyBcCisgIHJldHVybiBTdGF0dXM6Om9rKCk7CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZW5hYmxlKGludDMyX3QqIF9haWRsX3JldHVybikKIHsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgIEFMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKICAgICBzcDxFZmZlY3RCYXNlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICBpZiAoZWZmZWN0ID09IDAgfHwgbURpc2Nvbm5lY3RlZCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIFJFVFVSTihERUFEX09CSkVDVCk7CiAgICAgfQogICAgIGlmICghbUhhc0NvbnRyb2wpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBSRVRVUk4oSU5WQUxJRF9PUEVSQVRJT04pOwogICAgIH0KIAogICAgIGlmIChtRW5hYmxlZCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIFJFVFVSTihOT19FUlJPUik7CiAgICAgfQogCiAgICAgbUVuYWJsZWQgPSB0cnVlOwpAQCAtMTY1Nyw1NCArMTc2Nyw1NSBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIFJFVFVSTihzdGF0dXMpOwogICAgIH0KIAogICAgIGVmZmVjdC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKHRydWUsIGZhbHNlIC8qdGhyZWFkTG9ja2VkKi8pOwogCiAgICAgLy8gY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKCkgY2FuIHN1c3BlbmQgdGhpcyBzYW1lIGVmZmVjdCB3aGVuIGVuYWJsZWQKICAgICBpZiAoZWZmZWN0LT5zdXNwZW5kZWQoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIFJFVFVSTihOT19FUlJPUik7CiAgICAgfQogCiAgICAgc3RhdHVzID0gZWZmZWN0LT5zZXRFbmFibGVkKHRydWUsIHRydWUgLypmcm9tSGFuZGxlKi8pOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBSRVRVUk4oc3RhdHVzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmRpc2FibGUoKQorU3RhdHVzIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNhYmxlKGludDMyX3QqIF9haWRsX3JldHVybikKIHsKICAgICBBTE9HVigiZGlzYWJsZSAlcCIsIHRoaXMpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgaWYgKGVmZmVjdCA9PSAwIHx8IG1EaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBSRVRVUk4oREVBRF9PQkpFQ1QpOwogICAgIH0KICAgICBpZiAoIW1IYXNDb250cm9sKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgUkVUVVJOKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICB9CiAKICAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgUkVUVVJOKE5PX0VSUk9SKTsKICAgICB9CiAgICAgbUVuYWJsZWQgPSBmYWxzZTsKIAogICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKIAogICAgIGlmIChlZmZlY3QtPnN1c3BlbmRlZCgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgUkVUVVJOKE5PX0VSUk9SKTsKICAgICB9CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UsIHRydWUgLypmcm9tSGFuZGxlKi8pOwotICAgIHJldHVybiBzdGF0dXM7CisgICAgUkVUVVJOKHN0YXR1cyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmRpc2Nvbm5lY3QoKQorU3RhdHVzIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkaXNjb25uZWN0KCkKIHsKICAgICBBTE9HVigiJXMgJXAiLCBfX0ZVTkNUSU9OX18sIHRoaXMpOwogICAgIGRpc2Nvbm5lY3QodHJ1ZSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6ZGlzY29ubmVjdChib29sIHVucGluSWZMYXN0KQpAQCAtMTc0MSwxMSArMTg1MiwxNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKQorU3RhdHVzIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpnZXRDYmxrKG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFjb252ZXJ0SU1lbW9yeVRvU2hhcmVkRmlsZVJlZ2lvbihtQ2Jsa01lbW9yeSwgX2FpZGxfcmV0dXJuKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpjb21tYW5kKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF4UmVzcG9uc2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikKIHsKICAgICBBTE9HVlYoImNvbW1hbmQoKSwgY21kQ29kZTogJWQsIG1IYXNDb250cm9sOiAlZCwgbUVmZmVjdDogJXAiLAogICAgICAgICAgICAgY21kQ29kZSwgbUhhc0NvbnRyb2wsIG1FZmZlY3QudW5zYWZlX2dldCgpKTsKQEAgLTE3NjUsNDkgKzE4ODEsNDYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNjIwMTk5OTIiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBSRVRVUk4oQkFEX1ZBTFVFKTsKICAgICB9CiAKICAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0VOQUJMRSkgewotICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8IHNpemVvZihpbnQpKSB7CisgICAgICAgIGlmIChtYXhSZXNwb25zZVNpemUgPCBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjA5NTcxMyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIFJFVFVSTihCQURfVkFMVUUpOwogICAgICAgICB9Ci0gICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IE5PX0VSUk9SOwotICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIHJldHVybiBlbmFibGUoKTsKKyAgICAgICAgd3JpdGVUb0J1ZmZlcihOT19FUlJPUiwgcmVzcG9uc2UpOworICAgICAgICByZXR1cm4gZW5hYmxlKF9haWRsX3JldHVybik7CiAgICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfRElTQUJMRSkgewotICAgICAgICBpZiAoKnJlcGx5U2l6ZSA8IHNpemVvZihpbnQpKSB7CisgICAgICAgIGlmIChtYXhSZXNwb25zZVNpemUgPCBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjA5NTcxMyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIFJFVFVSTihCQURfVkFMVUUpOwogICAgICAgICB9Ci0gICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IE5PX0VSUk9SOwotICAgICAgICAqcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgICAgIHJldHVybiBkaXNhYmxlKCk7CisgICAgICAgIHdyaXRlVG9CdWZmZXIoTk9fRVJST1IsIHJlc3BvbnNlKTsKKyAgICAgICAgcmV0dXJuIGRpc2FibGUoX2FpZGxfcmV0dXJuKTsKICAgICB9CiAKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgIHNwPEVmZmVjdEJhc2U+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgIGlmIChlZmZlY3QgPT0gMCB8fCBtRGlzY29ubmVjdGVkKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgUkVUVVJOKERFQURfT0JKRUNUKTsKICAgICB9CiAgICAgLy8gb25seSBnZXQgcGFyYW1ldGVyIGNvbW1hbmQgaXMgcGVybWl0dGVkIGZvciBhcHBsaWNhdGlvbnMgbm90IGNvbnRyb2xsaW5nIHRoZSBlZmZlY3QKICAgICBpZiAoIW1IYXNDb250cm9sICYmIGNtZENvZGUgIT0gRUZGRUNUX0NNRF9HRVRfUEFSQU0pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBSRVRVUk4oSU5WQUxJRF9PUEVSQVRJT04pOwogICAgIH0KIAogICAgIC8vIGhhbmRsZSBjb21tYW5kcyB0aGF0IGFyZSBub3QgZm9yd2FyZGVkIHRyYW5zcGFyZW50bHkgdG8gZWZmZWN0IGVuZ2luZQogICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX1BBUkFNX0NPTU1JVCkgewogICAgICAgICBpZiAobUNsaWVudCA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBSRVRVUk4oSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCpyZXBseVNpemUgPCBzaXplb2YoaW50KSkgeworICAgICAgICBpZiAobWF4UmVzcG9uc2VTaXplIDwgc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMzIwOTU3MTMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBSRVRVUk4oQkFEX1ZBTFVFKTsKICAgICAgICAgfQotICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSBOT19FUlJPUjsKLSAgICAgICAgKnJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB3cml0ZVRvQnVmZmVyKE5PX0VSUk9SLCByZXNwb25zZSk7CiAKICAgICAgICAgLy8gTm8gbmVlZCB0byB0cnlsb2NrKCkgaGVyZSBhcyB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIGluIHRoZSBiaW5kZXIgdGhyZWFkIHNlcnZpbmcgYQogICAgICAgICAvLyBwYXJ0aWN1bGFyIGNsaWVudCBwcm9jZXNzOiAgbm8gcmlzayB0byBibG9jayB0aGUgd2hvbGUgbWVkaWEgc2VydmVyIHByb2Nlc3Mgb3IgbWl4ZXIKQEAgLTE4MjAsMTAgKzE5MzMsMTAgQEAKICAgICAgICAgICAgIHNlcnZlckluZGV4ID4gRUZGRUNUX1BBUkFNX0JVRkZFUl9TSVpFKSB7CiAgICAgICAgICAgICBtQ2Jsay0+c2VydmVySW5kZXggPSAwOwogICAgICAgICAgICAgbUNibGstPmNsaWVudEluZGV4ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICBSRVRVUk4oQkFEX1ZBTFVFKTsKICAgICAgICAgfQogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICAgICAgZWZmZWN0X3BhcmFtX3QgKnBhcmFtID0gTlVMTDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW07CiAgICAgICAgIGZvciAodWludDMyX3QgaW5kZXggPSBzZXJ2ZXJJbmRleDsgaW5kZXggPCBjbGllbnRJbmRleDspIHsKICAgICAgICAgICAgIGludCAqcCA9IChpbnQgKikobUJ1ZmZlciArIGluZGV4KTsKICAgICAgICAgICAgIGNvbnN0IGludCBzaXplID0gKnArKzsKQEAgLTE4MzUsMjMgKzE5NDgsMTYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gY29weSB0byBsb2NhbCBtZW1vcnkgaW4gY2FzZSBvZiBjbGllbnQgY29ycnVwdGlvbiBiLzMyMjIwNzY5Ci0gICAgICAgICAgICBhdXRvICpuZXdQYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKXJlYWxsb2MocGFyYW0sIHNpemUpOwotICAgICAgICAgICAgaWYgKG5ld1BhcmFtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29tbWFuZCgpOiBvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW0gPSBuZXdQYXJhbTsKLSAgICAgICAgICAgIG1lbWNweShwYXJhbSwgcCwgc2l6ZSk7CisgICAgICAgICAgICBzdGQ6OmNvcHkocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocCksCisgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocCkgKyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihwYXJhbSkpOwogCi0gICAgICAgICAgICBpbnQgcmVwbHkgPSAwOwotICAgICAgICAgICAgdWludDMyX3QgcnNpemUgPSBzaXplb2YocmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVwbHlCdWZmZXI7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBlZmZlY3QtPmNvbW1hbmQoRUZGRUNUX0NNRF9TRVRfUEFSQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlCdWZmZXIpOworICAgICAgICAgICAgaW50IHJlcGx5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50Kj4ocmVwbHlCdWZmZXIuZGF0YSgpKTsKIAogICAgICAgICAgICAgLy8gdmVyaWZ5IHNoYXJlZCBtZW1vcnk6IHNlcnZlciBpbmRleCBzaG91bGRuJ3QgY2hhbmdlOyBjbGllbnQgaW5kZXggY2FuJ3QgZ28gYmFjay4KICAgICAgICAgICAgIGlmIChzZXJ2ZXJJbmRleCAhPSBtQ2Jsay0+c2VydmVySW5kZXgKQEAgLTE4NjQsMjEgKzE5NzAsMjQgQEAKICAgICAgICAgICAgIC8vIHN0b3AgYXQgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQKICAgICAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXQ7Ci0gICAgICAgICAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gcmVwbHk7CisgICAgICAgICAgICAgICAgd3JpdGVUb0J1ZmZlcihyZXBseSwgcmVzcG9uc2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChyZXBseSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IHJlcGx5OworICAgICAgICAgICAgICAgIHdyaXRlVG9CdWZmZXIocmVwbHksIHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZGV4ICs9IHNpemU7CiAgICAgICAgIH0KLSAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgIG1DYmxrLT5zZXJ2ZXJJbmRleCA9IDA7CiAgICAgICAgIG1DYmxrLT5jbGllbnRJbmRleCA9IDA7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIFJFVFVSTihzdGF0dXMpOwogICAgIH0KIAotICAgIHJldHVybiBlZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LT5jb21tYW5kKGNtZENvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJlc3BvbnNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UpOworICAgIFJFVFVSTihzdGF0dXMpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpzZXRDb250cm9sKGJvb2wgaGFzQ29udHJvbCwgYm9vbCBzaWduYWwsIGJvb2wgZW5hYmxlZCkKQEAgLTE4OTQsMTMgKzIwMDMsMTEgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZTo6Y29tbWFuZEV4ZWN1dGVkKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgY21kRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVwbHlEYXRhKQogewogICAgIGlmIChtRWZmZWN0Q2xpZW50ICE9IDApIHsKLSAgICAgICAgbUVmZmVjdENsaWVudC0+Y29tbWFuZEV4ZWN1dGVkKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOworICAgICAgICBtRWZmZWN0Q2xpZW50LT5jb21tYW5kRXhlY3V0ZWQoY21kQ29kZSwgY21kRGF0YSwgcmVwbHlEYXRhKTsKICAgICB9CiB9CiAKQEAgLTE5MTMsMTMgKzIwMjAsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQm5FZmZlY3Q6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpkdW1wVG9CdWZmZXIoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBib29sIGxvY2tlZCA9IG1DYmxrICE9IE5VTEwgJiYgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtQ2Jsay0+bG9jayk7CkBAIC0yMzg1LDYgKzI0ODUsMjUgQEAKICAgICB9CiB9CiAKKy8vIGNvbnRhaW5zSGFwdGljR2VuZXJhdGluZ0VmZmVjdF9sIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgb3IgRWZmZWN0Q2hhaW46Om1Mb2NrIGhlbGQKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5pc0hhcHRpY0dlbmVyYXRvcigpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0SGFwdGljSW50ZW5zaXR5X2woaW50IGlkLCBpbnQgaW50ZW5zaXR5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0SGFwdGljSW50ZW5zaXR5KGlkLCBpbnRlbnNpdHkpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpzeW5jSGFsRWZmZWN0c1N0YXRlKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMjcxNSwxMSArMjgzNCw3IEBACiAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBkZXZpY2VJZCwKICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fSU5JVDsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGFmID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGVmZmVjdHNGYWN0b3J5ID0gYWYtPmdldEVmZmVjdHNGYWN0b3J5KCk7CisgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGVmZmVjdHNGYWN0b3J5ID0gbUF1ZGlvRmxpbmdlci5nZXRFZmZlY3RzRmFjdG9yeSgpOwogICAgIGlmIChlZmZlY3RzRmFjdG9yeSAhPSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IGVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QocEVmZmVjdFV1aWQsIHNlc3Npb25JZCwgaW8oKSwgZGV2aWNlSWQsIGVmZmVjdCk7CiAgICAgfQpAQCAtMjcyOCwyNSArMjg0MywxOSBAQAogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjp1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZT4mIGVmZmVjdCkgewotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYWYgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYWYgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogICAgIC8vIGluIEVmZmVjdENoYWluIGNvbnRleHQsIGFuIEVmZmVjdEJhc2UgaXMgYWx3YXlzIGZyb20gYW4gRWZmZWN0TW9kdWxlIHNvIHN0YXRpYyBjYXN0IGlzIHNhZmUKLSAgICByZXR1cm4gYWYtPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhlZmZlY3QtPmFzRWZmZWN0TW9kdWxlKCkpOworICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhlZmZlY3QtPmFzRWZmZWN0TW9kdWxlKCkpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6YWxsb2NhdGVIYWxCdWZmZXIoCiAgICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihhZiA9PSBudWxscHRyLCAiYWxsb2NhdGVIYWxCdWZmZXIoKSBjb3VsZCBub3QgcmV0cmlldmVkIGF1ZGlvIGZsaW5nZXIiKTsKLSAgICByZXR1cm4gYWYtPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoc2l6ZSwgYnVmZmVyKTsKKyAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKHNpemUsIGJ1ZmZlcik7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjphZGRFZmZlY3RUb0hhbCgKICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19JTklUOwotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC0yNzYyLDcgKzI4NzEsNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OnJlbW92ZUVmZmVjdEZyb21IYWwoCiAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gTk9fSU5JVDsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMjc3Niw3ICsyODg1LDcgQEAKIH0KIAogYXVkaW9faW9faGFuZGxlX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlvKCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KQEAgLTI3ODQsNyArMjg5Myw3IEBACiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT3V0cHV0KCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMjc5Miw3ICsyOTAxLDcgQEAKIH0KIAogYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aXNPZmZsb2FkKCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI4MDAsNyArMjkwOSw3IEBACiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI4MDgsNyArMjkxNyw3IEBACiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0yODE2LDcgKzI5MjUsNyBAQAogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTI4MjQsNyArMjkzMyw3IEBACiB9CiAKIGF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpjaGFubmVsTWFzaygpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CiAgICAgfQpAQCAtMjgzMiwxNSArMjk0MSwyMyBAQAogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6Y2hhbm5lbENvdW50KCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiB0LT5jaGFubmVsQ291bnQoKTsKIH0KIAorYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3QgeworICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICByZXR1cm4gdC0+aGFwdGljQ2hhbm5lbE1hc2soKTsKK30KKwogc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpmcmFtZUNvdW50KCkgY29uc3QgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMjg0OCw3ICsyOTY1LDcgQEAKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmxhdGVuY3koKSBjb25zdCB7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIHNwPFRocmVhZEJhc2U+IHQgPSB0aHJlYWQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHQgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yODU2LDcgKzI5NzMsNyBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpzZXRWb2x1bWVGb3JPdXRwdXQoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIGNvbnN0IHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yODY1LDEzICsyOTgyLDEzIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCgKICAgICAgICAgY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCwgYm9vbCBlbmFibGVkLCBib29sIHRocmVhZExvY2tlZCkgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICB0LT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZW5hYmxlZCwgZWZmZWN0LT5zZXNzaW9uSWQoKSwgdGhyZWFkTG9ja2VkKTsKIAotICAgIHNwPEVmZmVjdENoYWluPiBjID0gbUNoYWluLnByb21vdGUoKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gYyA9IGNoYWluKCkucHJvbW90ZSgpOwogICAgIGlmIChjID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTI4ODAsNyArMjk5Nyw3IEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6Om9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpIHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yODkxLDcgKzMwMDgsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6b25FZmZlY3REaXNhYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpIHsKICAgICBjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZWZmZWN0LCBmYWxzZSwgZmFsc2UgLyp0aHJlYWRMb2NrZWQqLyk7CiAKLSAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IHRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yOTAwLDcgKzMwMTcsNyBAQAogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpkaXNjb25uZWN0RWZmZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bnBpbklmTGFzdCkgewotICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gdGhyZWFkKCkucHJvbW90ZSgpOwogICAgIGlmICh0ID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI5MDksNyArMzAyNiw3IEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OnJlc2V0Vm9sdW1lKCkgewotICAgIHNwPEVmZmVjdENoYWluPiBjID0gbUNoYWluLnByb21vdGUoKTsKKyAgICBzcDxFZmZlY3RDaGFpbj4gYyA9IGNoYWluKCkucHJvbW90ZSgpOwogICAgIGlmIChjID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTI5MTcsOCArMzAzNCw4IEBACiAKIH0KIAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OnN0cmF0ZWd5KCkgY29uc3QgewotICAgIHNwPEVmZmVjdENoYWluPiBjID0gbUNoYWluLnByb21vdGUoKTsKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6c3RyYXRlZ3koKSBjb25zdCB7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBjaGFpbigpLnByb21vdGUoKTsKICAgICBpZiAoYyA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiAgICAgfQpAQCAtMjkyNiw3ICszMDQzLDcgQEAKIH0KIAogaW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6YWN0aXZlVHJhY2tDbnQoKSBjb25zdCB7Ci0gICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgIHNwPEVmZmVjdENoYWluPiBjID0gY2hhaW4oKS5wcm9tb3RlKCk7CiAgICAgaWYgKGMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yOTQzLDEwICszMDYwLDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBtRWZmZWN0SGFuZGxlcykgeworICAgICAgICAgICAgU3RhdHVzIGJzOwogICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBoYW5kbGUuc2Vjb25kLT5lbmFibGUoKTsKKyAgICAgICAgICAgICAgICBicyA9IGhhbmRsZS5zZWNvbmQtPmVuYWJsZSgmc3RhdHVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gaGFuZGxlLnNlY29uZC0+ZGlzYWJsZSgpOworICAgICAgICAgICAgICAgIGJzID0gaGFuZGxlLnNlY29uZC0+ZGlzYWJsZSgmc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYnMuaXNPaygpKSB7CisgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMwMDUsNyArMzEyNiw3IEBACiAgICAgICAgICAgICBfX2Z1bmNfXywgcG9ydC0+dHlwZSwgcG9ydC0+ZXh0LmRldmljZS50eXBlLAogICAgICAgICAgICAgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBwb3J0LT5pZCwgcGF0Y2guaXNTb2Z0d2FyZSgpKTsKICAgICBpZiAocG9ydC0+dHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8IHBvcnQtPmV4dC5kZXZpY2UudHlwZSAhPSBtRGV2aWNlLm1UeXBlCi0gICAgICAgIHx8IHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcyAhPSBtRGV2aWNlLm1BZGRyZXNzKSB7CisgICAgICAgIHx8IHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcyAhPSBtRGV2aWNlLmFkZHJlc3MoKSkgewogICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwpAQCAtMzA1NCwxMCArMzE3NSwxNCBAQAogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgfHwgc3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIFN0YXR1cyBiczsKICAgICAgICAgaWYgKGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAoKmhhbmRsZSktPmVuYWJsZSgpOworICAgICAgICAgICAgYnMgPSAoKmhhbmRsZSktPmVuYWJsZSgmc3RhdHVzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICgqaGFuZGxlKS0+ZGlzYWJsZSgpOworICAgICAgICAgICAgYnMgPSAoKmhhbmRsZSktPmRpc2FibGUoJnN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFicy5pc09rKCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKGJzKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggMjgyNjI5Ny4uYTcyN2UwNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC0zNiw2ICszNiw3IEBACiAgICAgdmlydHVhbCB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3QgPSAwOwogCiAgICAgLy8gTm9uIHRyaXZpYWwgbWV0aG9kcyB1c3VhbGx5IGltcGxlbWVudGVkIHdpdGggaGVscCBmcm9tIFRocmVhZEJhc2U6CkBAIC01OCw3ICs1OSw3IEBACiAgICAgdmlydHVhbCBib29sIHVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0KSA9IDA7CiAKICAgICAvLyBNZXRob2RzIHVzdWFsbHkgaW1wbGVtZW50ZWQgd2l0aCBoZWxwIGZyb20gRWZmZWN0Q2hhaW46IHBheSBhdHRlbnRpb24gdG8gbXV0ZXggbG9ja2luZyBvcmRlcgotICAgIHZpcnR1YWwgdWludDMyX3Qgc3RyYXRlZ3koKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3koKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90IGFjdGl2ZVRyYWNrQ250KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdm9pZCByZXNldFZvbHVtZSgpID0gMDsKIApAQCAtMTMyLDE5ICsxMzMsMTkgQEAKICAgICB2b2lkICAgICAgICAgICAgIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCk7CiAgICAgYm9vbCAgICAgICAgICAgICBzdXNwZW5kZWQoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbWRTaXplIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSBfX3VudXNlZCkgeyByZXR1cm4gTk9fRVJST1I7IH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKGludDMyX3QgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIF9fdW51c2VkKSB7IHJldHVybiBOT19FUlJPUjsgfTsKIAorICAgIC8vIG1DYWxsYmFjayBpcyBhdG9taWMgc28gdGhpcyBjYW4gYmUgbG9jay1mcmVlLgogICAgIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYmFjaykgeyBtQ2FsbGJhY2sgPSBjYWxsYmFjazsgfQotICAgIHNwPEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlPiYgICAgIGNhbGxiYWNrKCkgeyByZXR1cm4gbUNhbGxiYWNrOyB9CisgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IGdldENhbGxiYWNrKCkgY29uc3QgeyByZXR1cm4gbUNhbGxiYWNrLmxvYWQoKTsgfQogCiAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKICAgICBzc2l6ZV90IGRpc2Nvbm5lY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsIGJvb2wgdW5waW5JZkxhc3QpOwogICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOworICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOwogICAgIEVmZmVjdEhhbmRsZSogY29udHJvbEhhbmRsZV9sKCk7CiAgICAgYm9vbCBwdXJnZUhhbmRsZXMoKTsKIApAQCAtMTcwLDcgKzE3MSw3IEBACiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVmZmVjdEJhc2UpOwogCiBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAvLyBtdXRleCBmb3IgcHJvY2VzcywgY29tbWFuZHMgYW5kIGhhbmRsZXMgbGlzdCBwcm90ZWN0aW9uCi0gICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFjazsgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgorICAgIG1lZGlhdXRpbHM6OmF0b21pY19zcDxFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrOyAvLyBwYXJlbnQgZWZmZWN0IGNoYWluCiAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICBtSWQ7ICAgICAgICAvLyB0aGlzIGluc3RhbmNlIHVuaXF1ZSBJRAogICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCAgICAgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRAogICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2NyaXB0b3I7Ly8gZWZmZWN0IGRlc2NyaXB0b3IgcmVjZWl2ZWQgZnJvbSBlZmZlY3QgZW5naW5lCkBAIC0yMTMsMTEgKzIxNCwxMCBAQAogCiAgICAgdm9pZCBwcm9jZXNzKCk7CiAgICAgYm9vbCB1cGRhdGVTdGF0ZSgpOwotICAgIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb21tYW5kKGludDMyX3QgY21kQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSZXBseVNpemUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogcmVwbHkpIG92ZXJyaWRlOwogCiAgICAgdm9pZCByZXNldF9sKCk7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlKCk7CkBAIC0yNDAsOCArMjQwLDYgQEAKICAgICAgICAgcmV0dXJuIG1PdXRCdWZmZXIgIT0gMCA/IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KG1PdXRCdWZmZXItPnB0cigpKSA6IE5VTEw7CiAgICAgfQogCi0gICAgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSkgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCAgICAgICAgIHNldERldmljZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRJbnB1dERldmljZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0Vm9sdW1lKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgY29udHJvbGxlcik7CkBAIC0yNTcsNiArMjU1LDEyIEBACiAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGFzRWZmZWN0TW9kdWxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQogCisgICAgc3RhdGljIGJvb2wgICAgICBpc0hhcHRpY0dlbmVyYXRvcihjb25zdCBlZmZlY3RfdXVpZF90KiB0eXBlKTsKKyAgICBib29sICAgICAgICAgICAgIGlzSGFwdGljR2VuZXJhdG9yKCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCAgICAgICAgIHNldEhhcHRpY0ludGVuc2l0eShpbnQgaWQsIGludCBpbnRlbnNpdHkpOworICAgIHN0YXR1c190ICAgICAgICAgc2V0VmlicmF0b3JJbmZvKGNvbnN0IG1lZGlhOjpBdWRpb1ZpYnJhdG9ySW5mbyogdmlicmF0b3JJbmZvKTsKKwogICAgIHZvaWQgICAgICAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgpAQCAtMjgyLDYgKzI4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kaW5nIGRpc2FibGUgY29tbWFuZC4KICAgICB1aW50MzJfdCBtRGlzYWJsZVdhaXRDbnQ7ICAgICAgIC8vIGN1cnJlbnQgcHJvY2VzcygpIGNhbGxzIGNvdW50IGR1cmluZyBkaXNhYmxlIHBlcmlvZC4KICAgICBib29sICAgICBtT2ZmbG9hZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBjdXJyZW50bHkgb2ZmbG9hZGVkIHRvIHRoZSBhdWRpbyBEU1AKKyAgICBib29sICAgICBtQWRkZWRUb0hhbDsgICAgICAgICAgIC8vIGVmZmVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgYXVkaW8gSEFMCiAKICNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KICAgICBib29sICAgIG1TdXBwb3J0c0Zsb2F0OyAgICAgICAgIC8vIGVmZmVjdCBzdXBwb3J0cyBmbG9hdCBwcm9jZXNzaW5nCkBAIC0zMTYsMzIgKzMyMSwyOSBAQAogLy8gVGhlcmUgaXMgb25lIEVmZmVjdEhhbmRsZSBvYmplY3QgZm9yIGVhY2ggYXBwbGljYXRpb24gY29udHJvbGxpbmcgKG9yIHVzaW5nKQogLy8gYW4gZWZmZWN0IG1vZHVsZS4KIC8vIFRoZSBFZmZlY3RIYW5kbGUgaXMgb2J0YWluZWQgYnkgY2FsbGluZyBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdCgpLgotY2xhc3MgRWZmZWN0SGFuZGxlOiBwdWJsaWMgYW5kcm9pZDo6Qm5FZmZlY3QgeworY2xhc3MgRWZmZWN0SGFuZGxlOiBwdWJsaWMgYW5kcm9pZDo6bWVkaWE6OkJuRWZmZWN0IHsKIHB1YmxpYzoKIAogICAgIEVmZmVjdEhhbmRsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0LAogICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKICAgICB2aXJ0dWFsIH5FZmZlY3RIYW5kbGUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCiAgICAgLy8gSUVmZmVjdAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNhYmxlKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwotcHJpdmF0ZToKLSAgICAgICAgICAgIHZvaWQgZGlzY29ubmVjdChib29sIHVucGluSWZMYXN0KTsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldENibGsoKSBjb25zdCB7IHJldHVybiBtQ2Jsa01lbW9yeTsgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CisgICAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZW5hYmxlKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZGlzYWJsZShpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNvbW1hbmQoaW50MzJfdCBjbWRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNtZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJlc3BvbnNlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgZGlzY29ubmVjdCgpIG92ZXJyaWRlOworICAgIGFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGdldENibGsobWVkaWE6OlNoYXJlZEZpbGVSZWdpb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKK3ByaXZhdGU6CisgICAgdm9pZCBkaXNjb25uZWN0KGJvb2wgdW5waW5JZkxhc3QpOwogCiAgICAgLy8gR2l2ZSBvciB0YWtlIGNvbnRyb2wgb2YgZWZmZWN0IG1vZHVsZQogICAgIC8vIC0gaGFzQ29udHJvbDogdHJ1ZSBpZiBjb250cm9sIGlzIGdpdmVuLCBmYWxzZSBpZiByZW1vdmVkCkBAIC0zNDksMTAgKzM1MSw4IEBACiAgICAgLy8gLSBlbmFibGVkOiBzdGF0ZSBvZiB0aGUgZWZmZWN0IHdoZW4gY29udHJvbCBpcyBwYXNzZWQKICAgICB2b2lkIHNldENvbnRyb2woYm9vbCBoYXNDb250cm9sLCBib29sIHNpZ25hbCwgYm9vbCBlbmFibGVkKTsKICAgICB2b2lkIGNvbW1hbmRFeGVjdXRlZCh1aW50MzJfdCBjbWRDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVwbHlTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBjbWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXBseURhdGEpOwogICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgIGJvb2wgZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkOyB9CiAKQEAgLTM3NSwxOSArMzc1LDIwIEBACiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgICAgICAgICAgLy8gZm9yIG1FZmZlY3QsIG1IYXNDb250cm9sLCBtRW5hYmxlZAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFZmZlY3RIYW5kbGUpOwogCi0gICAgTXV0ZXggbUxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdHMgSUVmZmVjdCBtZXRob2QgY2FsbHMKLSAgICB3cDxFZmZlY3RCYXNlPiBtRWZmZWN0OyAgICAgICAgICAgLy8gcG9pbnRlciB0byBjb250cm9sbGVkIEVmZmVjdE1vZHVsZQotICAgIHNwPElFZmZlY3RDbGllbnQ+IG1FZmZlY3RDbGllbnQ7ICAgIC8vIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgY2xpZW50IG5vdGlmaWNhdGlvbnMKLSAgICAvKmNvbnN0Ki8gc3A8Q2xpZW50PiBtQ2xpZW50OyAgICAgICAvLyBjbGllbnQgZm9yIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiwgc2VlIGRpc2Nvbm5lY3QoKQotICAgIHNwPElNZW1vcnk+ICAgICAgICAgbUNibGtNZW1vcnk7ICAgIC8vIHNoYXJlZCBtZW1vcnkgZm9yIGNvbnRyb2wgYmxvY2sKLSAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiBtQ2JsazsgICAgICAgICAvLyBjb250cm9sIGJsb2NrIGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZyB2aWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFyZWQgbWVtb3J5Ci0gICAgdWludDhfdCogICAgICAgICAgICBtQnVmZmVyOyAgICAgICAgLy8gcG9pbnRlciB0byBwYXJhbWV0ZXIgYXJlYSBpbiBzaGFyZWQgbWVtb3J5Ci0gICAgaW50IG1Qcmlvcml0eTsgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGFwcGxpY2F0aW9uIHByaW9yaXR5IHRvIGNvbnRyb2wgdGhlIGVmZmVjdAotICAgIGJvb2wgbUhhc0NvbnRyb2w7ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgdGhpcyBoYW5kbGUgaXMgY29udHJvbGxpbmcgdGhlIGVmZmVjdAotICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBlbmFibGUgc3RhdGU6IG5lZWRlZCB3aGVuIHRoZSBlZmZlY3QgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlZCBhZnRlciBiZWluZyBzdXNwZW5kZWQKLSAgICBib29sIG1EaXNjb25uZWN0ZWQ7ICAgICAgICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSBieSBkaXNjb25uZWN0KCkKKyAgICBNdXRleCBtTG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3RzIElFZmZlY3QgbWV0aG9kIGNhbGxzCisgICAgY29uc3Qgd3A8RWZmZWN0QmFzZT4gbUVmZmVjdDsgICAgICAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRyb2xsZWQgRWZmZWN0TW9kdWxlCisgICAgY29uc3Qgc3A8bWVkaWE6OklFZmZlY3RDbGllbnQ+IG1FZmZlY3RDbGllbnQ7ICAvLyBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGNsaWVudCBub3RpZmljYXRpb25zCisgICAgLypjb25zdCovIHNwPENsaWVudD4gbUNsaWVudDsgICAgICAgICAgICAvLyBjbGllbnQgZm9yIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiwgc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGRpc2Nvbm5lY3QoKQorICAgIHNwPElNZW1vcnk+IG1DYmxrTWVtb3J5OyAgICAgICAgICAgICAgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgY29udHJvbCBibG9jaworICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcgdmlhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFyZWQgbWVtb3J5CisgICAgdWludDhfdCogbUJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHBhcmFtZXRlciBhcmVhIGluIHNoYXJlZCBtZW1vcnkKKyAgICBpbnQgbVByaW9yaXR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBhcHBsaWNhdGlvbiBwcmlvcml0eSB0byBjb250cm9sIHRoZSBlZmZlY3QKKyAgICBib29sIG1IYXNDb250cm9sOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgdGhpcyBoYW5kbGUgaXMgY29udHJvbGxpbmcgdGhlIGVmZmVjdAorICAgIGJvb2wgbUVuYWJsZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FjaGVkIGVuYWJsZSBzdGF0ZTogbmVlZGVkIHdoZW4gdGhlIGVmZmVjdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZWQgYWZ0ZXIgYmVpbmcgc3VzcGVuZGVkCisgICAgYm9vbCBtRGlzY29ubmVjdGVkOyAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdG8gdHJ1ZSBieSBkaXNjb25uZWN0KCkKIH07CiAKIC8vIHRoZSBFZmZlY3RDaGFpbiBjbGFzcyByZXByZXNlbnRzIGEgZ3JvdXAgb2YgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIG9uZSBhdWRpbyBzZXNzaW9uLgpAQCAtNDY3LDggKzQ2OCw4IEBACiAgICAgdm9pZCBkZWNBY3RpdmVUcmFja0NudCgpIHsgYW5kcm9pZF9hdG9taWNfZGVjKCZtQWN0aXZlVHJhY2tDbnQpOyB9CiAgICAgaW50MzJfdCBhY3RpdmVUcmFja0NudCgpIGNvbnN0IHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUFjdGl2ZVRyYWNrQ250KTsgfQogCi0gICAgdWludDMyX3Qgc3RyYXRlZ3koKSBjb25zdCB7IHJldHVybiBtU3RyYXRlZ3k7IH0KLSAgICB2b2lkIHNldFN0cmF0ZWd5KHVpbnQzMl90IHN0cmF0ZWd5KQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJhdGVneTsgfQorICAgIHZvaWQgc2V0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQogICAgICAgICAgICAgeyBtU3RyYXRlZ3kgPSBzdHJhdGVneTsgfQogCiAgICAgLy8gc3VzcGVuZCBvciByZXN0b3JlIGVmZmVjdHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLiBUaGUgbnVtYmVyIG9mIHN1c3BlbmQgcmVxdWVzdHMgaXMgY291bnRlZApAQCAtNTAzLDYgKzUwNCwxMCBAQAogICAgIC8vIGlzQ29tcGF0aWJsZVdpdGhUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggdGhyZWFkLT5tTG9jayBoZWxkCiAgICAgYm9vbCBpc0NvbXBhdGlibGVXaXRoVGhyZWFkX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCkgY29uc3Q7CiAKKyAgICBib29sIGNvbnRhaW5zSGFwdGljR2VuZXJhdGluZ0VmZmVjdF9sKCk7CisKKyAgICB2b2lkIHNldEhhcHRpY0ludGVuc2l0eV9sKGludCBpZCwgaW50IGludGVuc2l0eSk7CisKICAgICBzcDxFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4gZWZmZWN0Q2FsbGJhY2soKSBjb25zdCB7IHJldHVybiBtRWZmZWN0Q2FsbGJhY2s7IH0KICAgICB3cDxUaHJlYWRCYXNlPiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0Q2FsbGJhY2stPnRocmVhZCgpOyB9CiAKQEAgLTUxMCwxNCArNTE1LDIxIEBACiAKIHByaXZhdGU6CiAKKyAgICAvLyBGb3IgdHJhbnNhY3Rpb24gY29uc2lzdGVuY3ksIHBsZWFzZSBjb25zaWRlciBob2xkaW5nIHRoZSBFZmZlY3RDaGFpbiBsb2NrIGJlZm9yZQorICAgIC8vIGNhbGxpbmcgdGhlIEVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjayBtZXRob2RzLCBleGNlcHRpbmcKKyAgICAvLyBjcmVhdGVFZmZlY3RIYWwgYW5kIGFsbG9jYXRlSGFsQnVmZmVyLgorICAgIC8vCisgICAgLy8gVGhpcyBwcmV2ZW50cyBtaWdyYXRpb24gb2YgdGhlIEVmZmVjdENoYWluIHRvIGFub3RoZXIgUGxheWJhY2tUaHJlYWQKKyAgICAvLyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBFZmZlY3RDYWxsYmFjay4KICAgICBjbGFzcyBFZmZlY3RDYWxsYmFjayA6ICBwdWJsaWMgRWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2UgewogICAgIHB1YmxpYzoKICAgICAgICAgLy8gTm90ZTogY3RvcnMgdGFraW5nIGEgd2VhayBwb2ludGVyIHRvIHRoZWlyIG93bmVyIG11c3Qgbm90IHByb21vdGUgaXQKICAgICAgICAgLy8gZHVyaW5nIGNvbnN0cnVjdGlvbiAoYnV0IG1heSBrZWVwIGEgcmVmZXJlbmNlIGZvciBsYXRlciBwcm9tb3Rpb24pLgogICAgICAgICBFZmZlY3RDYWxsYmFjayhjb25zdCB3cDxFZmZlY3RDaGFpbj4mIG93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKQotICAgICAgICAgICAgOiBtQ2hhaW4ob3duZXIpIHsKLSAgICAgICAgICAgIHNldFRocmVhZCh0aHJlYWQpOworICAgICAgICAgICAgOiBtQ2hhaW4ob3duZXIpCisgICAgICAgICAgICAsIG1UaHJlYWQodGhyZWFkKQorICAgICAgICAgICAgLCBtQXVkaW9GbGluZ2VyKCpnQXVkaW9GbGluZ2VyKSB7CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBjcmVhdGVFZmZlY3RIYWwoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCkBAIC01MzQsNiArNTQ2LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgaGFwdGljQ2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC01NDYsMjUgKzU1OSwyMyBAQAogICAgICAgICB2b2lkIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkLCBib29sIHRocmVhZExvY2tlZCkgb3ZlcnJpZGU7CiAgICAgICAgIHZvaWQgcmVzZXRWb2x1bWUoKSBvdmVycmlkZTsKLSAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3koKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGludDMyX3QgYWN0aXZlVHJhY2tDbnQoKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvbkVmZmVjdEVuYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0KSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCkgb3ZlcnJpZGU7CiAKICAgICAgICAgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUNoYWluOyB9CiAKLSAgICAgICAgd3A8VGhyZWFkQmFzZT4gdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICB3cDxUaHJlYWRCYXNlPiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkLmxvYWQoKTsgfQogCiAgICAgICAgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIHsKICAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7Ci0gICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiBwID0gdGhyZWFkLnByb21vdGUoKTsKLSAgICAgICAgICAgIG1BdWRpb0ZsaW5nZXIgPSBwID8gcC0+bUF1ZGlvRmxpbmdlciA6IG51bGxwdHI7CiAgICAgICAgIH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIHdwPEVmZmVjdENoYWluPiBtQ2hhaW47Ci0gICAgICAgIHdwPFRocmVhZEJhc2U+IG1UaHJlYWQ7Ci0gICAgICAgIHdwPEF1ZGlvRmxpbmdlcj4gbUF1ZGlvRmxpbmdlcjsKKyAgICAgICAgY29uc3Qgd3A8RWZmZWN0Q2hhaW4+IG1DaGFpbjsKKyAgICAgICAgbWVkaWF1dGlsczo6YXRvbWljX3dwPFRocmVhZEJhc2U+IG1UaHJlYWQ7CisgICAgICAgIEF1ZGlvRmxpbmdlciAmbUF1ZGlvRmxpbmdlcjsgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbDogb3V0ZXIgaW5zdGFuY2UgYWx3YXlzIGV4aXN0cy4KICAgICB9OwogCiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtVGhyZWFkLCBtRWZmZWN0cwpAQCAtNjE4LDcgKzYyOSw3IEBACiAgICAgICAgICAgICAgdWludDMyX3QgbVJpZ2h0Vm9sdW1lOyAgICAgIC8vIHByZXZpb3VzIHZvbHVtZSBvbiByaWdodCBjaGFubmVsCiAgICAgICAgICAgICAgdWludDMyX3QgbU5ld0xlZnRWb2x1bWU7ICAgICAgIC8vIG5ldyB2b2x1bWUgb24gbGVmdCBjaGFubmVsCiAgICAgICAgICAgICAgdWludDMyX3QgbU5ld1JpZ2h0Vm9sdW1lOyAgICAgIC8vIG5ldyB2b2x1bWUgb24gcmlnaHQgY2hhbm5lbAotICAgICAgICAgICAgIHVpbnQzMl90IG1TdHJhdGVneTsgLy8gc3RyYXRlZ3kgZm9yIHRoaXMgZWZmZWN0IGNoYWluCisgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsgLy8gc3RyYXRlZ3kgZm9yIHRoaXMgZWZmZWN0IGNoYWluCiAgICAgICAgICAgICAgLy8gbVN1c3BlbmRlZEVmZmVjdHMgbGlzdHMgYWxsIGVmZmVjdHMgY3VycmVudGx5IHN1c3BlbmRlZCBpbiB0aGUgY2hhaW4uCiAgICAgICAgICAgICAgLy8gVXNlIGVmZmVjdCB0eXBlIFVVSUQgdGltZWxvdyBmaWVsZCBhcyBrZXkuIFRoZXJlIGlzIG5vIHJlYWwgcmlzayBvZiBpZGVudGljYWwKICAgICAgICAgICAgICAvLyB0aW1lTG93IGZpZWxkcyBhbW9uZyBlZmZlY3QgdHlwZSBVVUlEcy4KQEAgLTY4NSw2ICs2OTYsNyBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsgfQogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CiAgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQogCkBAIC02OTcsNyArNzA5LDcgQEAKICAgICAgICAgdm9pZCBjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCBfX3VudXNlZCwgYm9vbCB0aHJlYWRMb2NrZWQgX191bnVzZWQpIG92ZXJyaWRlIHt9CiAgICAgICAgIHZvaWQgcmVzZXRWb2x1bWUoKSBvdmVycmlkZSB7fQotICAgICAgICB1aW50MzJfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KDApOyB9CiAgICAgICAgIGludDMyX3QgYWN0aXZlVHJhY2tDbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CiAgICAgICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KICAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IGQ2ZDZlMjUuLjI5NjMyMDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOwogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoY2hhbm5lbENvdW50ID49IDEgJiYgY2hhbm5lbENvdW50IDw9IEZDQ184KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA+PSAxICYmIGNoYW5uZWxDb3VudCA8PSBGQ0NfTElNSVQpOwogI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCAzZWFjYzhjLi44OGQ0ZWFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJUeXBlZExvZ2dlci5oIgpAQCAtNDgsNiArNDgsMTUgQEAKIAogLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCitzdGF0aWMgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZ2V0Q2hhbm5lbE1hc2tGcm9tQ291bnQoc2l6ZV90IGNvdW50KSB7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjb3VudCk7CisgICAgaWYgKG1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEKSB7CisgICAgICAgIC8vIHNvbWUgY291bnRzIGhhdmUgbm8gcG9zaXRpb25hbCBtYXNrcy4gVE9ETzogVXBkYXRlIHRoaXMgdG8gcmV0dXJuIGluZGV4IGNvdW50PworICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9tYXNrX2Zvcl9pbmRleF9hc3NpZ25tZW50X2Zyb21fY291bnQoY291bnQpOworICAgIH0KKyAgICByZXR1cm4gbWFzazsKK30KKwogRmFzdE1peGVyOjpGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgcGFyZW50SW9IYW5kbGUpCiAgICAgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCiAgICAgLy8gbUZhc3RUcmFja05hbWVzCkBAIC03OSw3ICs4OCw3IEBACiAgICAgbUR1bW15RHVtcFN0YXRlID0gJm1EdW1teUZhc3RNaXhlckR1bXBTdGF0ZTsKICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdC4KICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KLSAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICBtU2lua0NoYW5uZWxNYXNrID0gZ2V0Q2hhbm5lbE1hc2tGcm9tQ291bnQobVNpbmtDaGFubmVsQ291bnQpOwogCiAgICAgdW5zaWduZWQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OnNNYXhGYXN0VHJhY2tzOyArK2kpIHsKQEAgLTIzOCw3ICsyNDcsNyBAQAogICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU2lua0NoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpOwogCiAgICAgICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gZ2V0Q2hhbm5lbE1hc2tGcm9tQ291bnQobVNpbmtDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50ID0gbVNpbmtDaGFubmVsQ291bnQgLSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCiAgICAgICAgICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOwpAQCAtMzUzLDcgKzM2Miw4IEBACiAjZW5kaWYKICAgICAgICAgLy9BTE9HRCgiRXJpYyBGYXN0TWl4ZXI6Om9uV29yaygpIG1Jc1dhcm0iKTsKICAgICB9IGVsc2UgewotICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoCisgICAgICAgICAgICBkdW1wU3RhdGUtPm1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfQ09OVElOVU9VUyk7CiAgICAgICAgIC8vIFNlZSBjb21tZW50IGluIGlmIGJsb2NrLgogI2lmZGVmIEZBU1RNSVhFUl9MT0dfSElTVF9UUwogICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKaW5kZXggYTQyZTA5Yy4uM2YyMDI4MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAjZW5kaWYKLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCmluZGV4IDM5NmM3OTcuLjg1N2QzZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uVXRpbHMuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDksOCArNTAsNyBAQAogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGhhcHRpYyBwbGF5YmFjayBpcyBlbmFibGVkIG9yIG5vdAotICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7IC8vIGludGVuc2l0eSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHRpYyBkYXRhCisgICAgb3M6OkhhcHRpY1NjYWxlICAgICAgICAgbUhhcHRpY0ludGVuc2l0eSA9IG9zOjpIYXB0aWNTY2FsZTo6TVVURTsgLy8gaW50ZW5zaXR5IG9mIGhhcHRpYyBkYXRhCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCBiODNmNmI1Li5lYjY0MGJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI5LDggKzI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TW1hcFRyYWNrKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwppbmRleCBkMDJkOWUwLi4wMzRkMTYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKQEAgLTEsNCArMSw0IEBACitna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQotZ2thc3RlbkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKaW5kZXggYjU4ZmQ4Yi4uYTM4MWM3ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcApAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZhbGlkYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CkBAIC01NSw4ICs1NiwxMiBAQAogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCi17CitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvUG9ydCgqcG9ydCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmdldEF1ZGlvUG9ydChwb3J0KTsKIH0KQEAgLTY1LDYgKzcwLDExIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BhdGNoKCpwYXRjaCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsIGhhbmRsZSk7CiB9CkBAIC0xMDMsMTUgKzExMywyOCBAQAogfQogCiAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQgX191bnVzZWQpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkKIHsKLSAgICBBTE9HVihfX2Z1bmNfXyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmIChwb3J0LT50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgLy8gT25seSBxdWVyeSB0aGUgSEFMIHdoZW4gdGhlIHBvcnQgaXMgYSBkZXZpY2UuCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBnZXRBdWRpb1BvcnQgZm9yIG1peC4KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBBdWRpb0h3RGV2aWNlKiBod0RldmljZSA9IGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUocG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUpOworICAgIGlmIChod0RldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcyBjYW5ub3QgZmluZCBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWh3RGV2aWNlLT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIGh3RGV2aWNlLT5nZXRBdWRpb1BvcnQocG9ydCk7CiB9CiAKIC8qIENvbm5lY3QgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmRwb2ludFBhdGNoKQogewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNzQsNyArMTk3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFBhdGNoIG5ld1BhdGNoeypwYXRjaH07CisgICAgUGF0Y2ggbmV3UGF0Y2h7KnBhdGNoLCBlbmRwb2ludFBhdGNofTsKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaW5zZXJ0ZWRNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiAKICAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKQEAgLTM5NiwxMCArNDE5LDE1IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgb3V0cHV0IGFzIHNvdXJjZSBpZiBhbnkKLSAgICAgICAgICAgIGZvciAoYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyYXNlUGF0Y2goaXRlci5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gUHJldmVudCB0byByZW1vdmUgZW5kcG9pbnQgcGF0Y2hlcyAoaW52b2x2ZWQgaW4gYSBTd0JyaWRnZSkKKyAgICAgICAgICAgIC8vIFByZXZlbnQgdG8gcmVtb3ZlIEF1ZGlvUGF0Y2ggdXNlZCB0byByb3V0ZSBhbiBvdXRwdXQgaW52b2x2ZWQgaW4gYW4gZW5kcG9pbnQuCisgICAgICAgICAgICBpZiAoIWVuZHBvaW50UGF0Y2gpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQubUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQubWl4LmhhbmRsZSA9PSB0aHJlYWQtPmlkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXRlci5zZWNvbmQubUlzRW5kcG9pbnRQYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VQYXRjaChpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwpAQCAtNDEzLDEwICs0NDEsMTAgQEAKICAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgbUF1ZGlvRmxpbmdlci5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7CiAgICAgICAgIG5ld1BhdGNoLm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7CiAgICAgICAgIG1BdWRpb0ZsaW5nZXIubURldmljZUVmZmVjdE1hbmFnZXIuY3JlYXRlQXVkaW9QYXRjaCgqaGFuZGxlLCBuZXdQYXRjaCk7Ci0gICAgICAgIG1QYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCBzdGQ6Om1vdmUobmV3UGF0Y2gpKSk7CiAgICAgICAgIGlmIChpbnNlcnRlZE1vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcyhpbnNlcnRlZE1vZHVsZSwgKmhhbmRsZSk7CisgICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUsICZuZXdQYXRjaC5tQXVkaW9QYXRjaCk7CiAgICAgICAgIH0KKyAgICAgICAgbVBhdGNoZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpoYW5kbGUsIHN0ZDo6bW92ZShuZXdQYXRjaCkpKTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgIH0KQEAgLTQzNSw3ICs0NjMsOCBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAogICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0pLgogICAgICAgICAgICAgICAgIGFkZFNpbmsobVJlY29yZC50aHJlYWQoKSwgeyAuc291cmNlID0gQVVESU9fU09VUkNFX01JQyB9KS5wYXRjaCgpLAotICAgICAgICAgICAgbVJlY29yZC5oYW5kbGVQdHIoKSk7CisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZVB0cigpLAorICAgICAgICAgICAgdHJ1ZSAvKmVuZHBvaW50UGF0Y2gqLyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAqbVJlY29yZC5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNDQ1LDcgKzQ3NCw4IEBACiAgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zaW5rcyAhPSAwKSB7CiAgICAgICAgIHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAogICAgICAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtUGxheWJhY2sudGhyZWFkKCkpLmFkZFNpbmsobUF1ZGlvUGF0Y2guc2lua3NbMF0pLnBhdGNoKCksCi0gICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZVB0cigpKTsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlUHRyKCksCisgICAgICAgICAgICAgICAgdHJ1ZSAvKmVuZHBvaW50UGF0Y2gqLyk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC03ODEsMTAgKzgxMSwyMCBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtT3BlbmVkKAotICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pCisgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCkKIHsKICAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgewogICAgICAgICBtSW5zZXJ0ZWRNb2R1bGVzW2F1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpXS5zdHJlYW1zLmluc2VydChzdHJlYW0pOworICAgICAgICBpZiAocGF0Y2ggIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3IgPFNvZnR3YXJlUGF0Y2g+IHN3UGF0Y2hlczsKKyAgICAgICAgICAgIGdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoc3RyZWFtLCAmc3dQYXRjaGVzKTsKKyAgICAgICAgICAgIGlmIChzd1BhdGNoZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoc3dQYXRjaGVzWzBdLmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIGlmIChpdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IGl0ZXItPnNlY29uZC5tQXVkaW9QYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTgxMyw5ICs4NTMsMTMgQEAKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKLSAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpCiB7CiAgICAgbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN3X3BhdGNoZXMuaW5zZXJ0KGhhbmRsZSk7CisgICAgaWYgKCFtSW5zZXJ0ZWRNb2R1bGVzW21vZHVsZV0uc3RyZWFtcy5lbXB0eSgpKSB7CisgICAgICAgIG1BdWRpb0ZsaW5nZXIudXBkYXRlRG93blN0cmVhbVBhdGNoZXNfbChwYXRjaCwgbUluc2VydGVkTW9kdWxlc1ttb2R1bGVdLnN0cmVhbXMpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKaW5kZXggODlkNGViMS4uOTM1OTNhMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCkBAIC01MiwxMSArNTIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cyk7CiAKICAgICAvKiBHZXQgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydCAqLwotICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKIAogICAgIC8qIENyZWF0ZSBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KICAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZHBvaW50UGF0Y2ggPSBmYWxzZSk7CiAKICAgICAvKiBSZWxlYXNlIGEgcGF0Y2ggKi8KICAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwpAQCAtNzEsNyArNzIsOCBAQAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0OwogCiAgICAgLy8gTm90aWZpZXMgcGF0Y2ggcGFuZWwgYWJvdXQgYWxsIG9wZW5lZCBhbmQgY2xvc2VkIHN0cmVhbXMuCi0gICAgdm9pZCBub3RpZnlTdHJlYW1PcGVuZWQoQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIG5vdGlmeVN0cmVhbU9wZW5lZChBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCk7CiAgICAgdm9pZCBub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwpAQCAtMTYwLDcgKzE2Miw4IEBACiAKICAgICBjbGFzcyBQYXRjaCBmaW5hbCB7CiAgICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoKSA6IG1BdWRpb1BhdGNoKHBhdGNoKSB7fQorICAgICAgICBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoLCBib29sIGVuZHBvaW50UGF0Y2gpIDoKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoKHBhdGNoKSwgbUlzRW5kcG9pbnRQYXRjaChlbmRwb2ludFBhdGNoKSB7fQogICAgICAgICBQYXRjaCgpID0gZGVmYXVsdDsKICAgICAgICAgflBhdGNoKCk7CiAgICAgICAgIFBhdGNoKGNvbnN0IFBhdGNoJiBvdGhlcikgbm9leGNlcHQgewpAQCAtMTY5LDYgKzE3Miw3IEBACiAgICAgICAgICAgICBtUGxheWJhY2sgPSBvdGhlci5tUGxheWJhY2s7CiAgICAgICAgICAgICBtUmVjb3JkID0gb3RoZXIubVJlY29yZDsKICAgICAgICAgICAgIG1UaHJlYWQgPSBvdGhlci5tVGhyZWFkOworICAgICAgICAgICAgbUlzRW5kcG9pbnRQYXRjaCA9IG90aGVyLm1Jc0VuZHBvaW50UGF0Y2g7CiAgICAgICAgIH0KICAgICAgICAgUGF0Y2goUGF0Y2gmJiBvdGhlcikgbm9leGNlcHQgeyBzd2FwKG90aGVyKTsgfQogICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KFBhdGNoJiYgb3RoZXIpIG5vZXhjZXB0IHsKQEAgLTE4Myw2ICsxODcsNyBAQAogICAgICAgICAgICAgc3dhcChtUGxheWJhY2ssIG90aGVyLm1QbGF5YmFjayk7CiAgICAgICAgICAgICBzd2FwKG1SZWNvcmQsIG90aGVyLm1SZWNvcmQpOwogICAgICAgICAgICAgc3dhcChtVGhyZWFkLCBvdGhlci5tVGhyZWFkKTsKKyAgICAgICAgICAgIHN3YXAobUlzRW5kcG9pbnRQYXRjaCwgb3RoZXIubUlzRW5kcG9pbnRQYXRjaCk7CiAgICAgICAgIH0KIAogICAgICAgICBmcmllbmQgdm9pZCBzd2FwKFBhdGNoICZhLCBQYXRjaCAmYikgbm9leGNlcHQgewpAQCAtMjE3LDYgKzIyMiw3IEBACiAgICAgICAgIEVuZHBvaW50PFJlY29yZFRocmVhZCwgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gbVJlY29yZDsKIAogICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOworICAgICAgICBib29sIG1Jc0VuZHBvaW50UGF0Y2g7CiAgICAgfTsKIAogICAgIC8vIENhbGwgd2l0aCBBdWRpb0ZsaW5nZXIgbUxvY2sgaGVsZApAQCAtMjI2LDcgKzIzMiw4IEBACiAgICAgQXVkaW9Id0RldmljZSogZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGZpbmRId0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOwogICAgIHZvaWQgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKAotICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpOwogICAgIHZvaWQgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKICAgICB2b2lkIGVyYXNlUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBkOGVlYmYzLi4wOTI5MDU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMjYsMTAgKzI2LDEzIEBACiAgICAgYm9vbCBoYXNPcFBsYXlBdWRpbygpIGNvbnN0OwogCiAgICAgc3RhdGljIHNwPE9wUGxheUF1ZGlvTW9uaXRvcj4gY3JlYXRlSWZOZWVkZWQoCi0gICAgICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgaW50IGlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCBpZCwKKyAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgT3BQbGF5QXVkaW9Nb25pdG9yKHVpZF90IHVpZCwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgaW50IGlkKTsKKyAgICBPcFBsYXlBdWRpb01vbml0b3IoY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGludCBpZCk7CiAgICAgdm9pZCBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CiAgICAgc3RhdGljIHZvaWQgZ2V0UGFja2FnZXNGb3JVaWQodWlkX3QgdWlkLCBWZWN0b3I8U3RyaW5nMTY+JiBwYWNrYWdlcyk7CiAKQEAgLTQ5LDggKzUyLDcgQEAKICAgICB2b2lkIGNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKTsKIAogICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUhhc09wUGxheUF1ZGlvOwotICAgIFZlY3RvcjxTdHJpbmcxNj4gbVBhY2thZ2VzOwotICAgIGNvbnN0IHVpZF90IG1VaWQ7CisgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBtQXR0cmlidXRpb25Tb3VyY2U7CiAgICAgY29uc3QgaW50MzJfdCBtVXNhZ2U7IC8vIG9uIHB1cnBvc2Ugbm90IGF1ZGlvX3VzYWdlX3QgYmVjYXVzZSBhbHdheXMgY2hlY2tlZCBpbiBhcHBPcHMgYXMgaW50MzJfdAogICAgIGNvbnN0IGludCBtSWQ7IC8vIGZvciBsb2dnaW5nIHB1cnBvc2VzIG9ubHkKIH07CkBAIC03MSwxMyArNzMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gc3RhcnQgd2hlbiB0aGVyZSBhcmUgYXMgbWFueSBmcmFtZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlYWR5IGFzIHBvc3NpYmxlIChha2EuIEJ1ZmZlciBpcyBmdWxsKS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkgPSBTSVpFX01BWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5ID0gU0laRV9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gMS4wZik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCkBAIC0xMTUsNiArMTE4LDEyIEBACiAgICAgICAgICAgICBpbnQgICAgICAgICBhdXhFZmZlY3RJZCgpIGNvbnN0IHsgcmV0dXJuIG1BdXhFZmZlY3RJZDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2lnbmFsKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCogbW9kZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXREdWFsTW9ub01vZGUoYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChmbG9hdCogbGV2ZWxkQik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGF1ZGlvX3BsYXliYWNrX3JhdGVfdCogcGxheWJhY2tSYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoY29uc3QgYXVkaW9fcGxheWJhY2tfcmF0ZV90JiBwbGF5YmFja1JhdGUpOwogCiAvLyBpbXBsZW1lbnQgRmFzdE1peGVyU3RhdGU6OlZvbHVtZVByb3ZpZGVyIGludGVyZmFjZQogICAgIHZpcnR1YWwgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgZ2V0Vm9sdW1lTFIoKTsKQEAgLTEzOCwxNSArMTQ3LDcgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgIHNldEZpbmFsVm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgZmxvYXQgICAgICAgICAgICAgICBnZXRGaW5hbFZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1GaW5hbFZvbHVtZTsgfQogCi0gICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgaGFzIGNoYW5nZWQgKG1ldGFkYXRhIG9yIHZvbHVtZSkgc2luY2UKLSAgICAgKiAgICAgICAgICB0aGUgbGFzdCB0aW1lIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCwKLSAgICAgKiAgICAgICAgICB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gd2FzIG5ldmVyIGNhbGxlZCBzaW5jZSB0aGUgdHJhY2sgY3JlYXRpb24sCi0gICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqICBUaHJlYWQgc2FmZS4KLSAgICAgKi8KLSAgICBib29sICAgICAgICAgICAgcmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpIHsgcmV0dXJuICFtQ2hhbmdlTm90aWZpZWQudGVzdF9hbmRfc2V0KCk7IH0KLQotICAgIHVzaW5nIFNvdXJjZU1ldGFkYXRhcyA9IHN0ZDo6dmVjdG9yPHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Q+OworICAgIHVzaW5nIFNvdXJjZU1ldGFkYXRhcyA9IHN0ZDo6dmVjdG9yPHBsYXliYWNrX3RyYWNrX21ldGFkYXRhX3Y3X3Q+OwogICAgIHVzaW5nIE1ldGFkYXRhSW5zZXJ0ZXIgPSBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yPFNvdXJjZU1ldGFkYXRhcz47CiAgICAgLyoqIENvcHkgdGhlIHRyYWNrIG1ldGFkYXRhIGluIHRoZSBwcm92aWRlZCBpdGVyYXRvci4gVGhyZWFkIHNhZmUuICovCiAgICAgdmlydHVhbCB2b2lkICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Q7CkBAIC0xNTksMTIgKzE2MCwxMiBAQAogICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiogUmV0dXJuIGF0IHdoYXQgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljcywgdXNlZCBpbiBtaXhlci4gKi8KLSAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBnZXRIYXB0aWNJbnRlbnNpdHkoKSBjb25zdCB7IHJldHVybiBtSGFwdGljSW50ZW5zaXR5OyB9CisgICAgICAgICAgICBvczo6SGFwdGljU2NhbGUgZ2V0SGFwdGljSW50ZW5zaXR5KCkgY29uc3QgeyByZXR1cm4gbUhhcHRpY0ludGVuc2l0eTsgfQogICAgICAgICAgICAgLyoqIFNldCBpbnRlbnNpdHkgb2YgaGFwdGljIHBsYXliYWNrLCBzaG91bGQgYmUgc2V0IGFmdGVyIHF1ZXJ5aW5nIHZpYnJhdG9yIHNlcnZpY2UuICovCi0gICAgICAgICAgICB2b2lkICAgIHNldEhhcHRpY0ludGVuc2l0eShBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgaGFwdGljSW50ZW5zaXR5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKEF1ZGlvTWl4ZXI6OmlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljSW50ZW5zaXR5KSkgeworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNJbnRlbnNpdHkob3M6OkhhcHRpY1NjYWxlIGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICAgICAgICAgIGlmIChvczo6aXNWYWxpZEhhcHRpY1NjYWxlKGhhcHRpY0ludGVuc2l0eSkpIHsKICAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKLSAgICAgICAgICAgICAgICAgICAgc2V0SGFwdGljUGxheWJhY2tFbmFibGVkKG1IYXB0aWNJbnRlbnNpdHkgIT0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEUpOworICAgICAgICAgICAgICAgICAgICBzZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQobUhhcHRpY0ludGVuc2l0eSAhPSBvczo6SGFwdGljU2NhbGU6Ok1VVEUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gZ2V0RXh0ZXJuYWxWaWJyYXRpb24oKSBjb25zdCB7IHJldHVybiBtRXh0ZXJuYWxWaWJyYXRpb247IH0KQEAgLTE4MSw2ICsxODIsOSBAQAogICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCkpOwogICAgICAgIH0KICAgICB9CisKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBnZXRPdXRwdXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQorICAgIGZsb2F0IGdldFNwZWVkKCkgY29uc3QgeyByZXR1cm4gbVNwZWVkOyB9CiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMjA5LDE5ICsyMTMsMzQgQEAKICAgICB2b2lkIGZsdXNoQWNrKCk7CiAgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKICAgICB2b2lkIHJlc3VtZUFjaygpOworICAgIC8vIEZvciBkaXJlY3Qgb3Igb2ZmbG9hZGVkIHRyYWNrcyBlbnN1cmUgdGhhdCB0aGUgcGF1c2Ugc3RhdGUgaXMgYWNrbm93bGVkZ2VkCisgICAgLy8gYnkgdGhlIHBsYXliYWNrIHRocmVhZCBpbiBjYXNlIG9mIGFuIGltbWVkaWF0ZSBmbHVzaC4KKyAgICBib29sIGlzUGF1c2VQZW5kaW5nKCkgY29uc3QgeyByZXR1cm4gbVBhdXNlSHdQZW5kaW5nOyB9CisgICAgdm9pZCBwYXVzZUFjaygpOwogICAgIHZvaWQgdXBkYXRlVHJhY2tGcmFtZUluZm8oaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNpbmtGcmFtZXNXcml0dGVuLAogICAgICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CiAKICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtU2hhcmVkQnVmZmVyOyB9CiAKKyAgICAvLyBwcmVzZW50YXRpb25Db21wbGV0ZSBjaGVja2VkIGJ5IGZyYW1lcy4gKE1peGVkIFRyYWNrcykuCiAgICAgLy8gZnJhbWVzV3JpdHRlbiBpcyBjdW11bGF0aXZlLCBuZXZlciByZXNldCwgYW5kIGlzIHNoYXJlZCBhbGwgdHJhY2tzCiAgICAgLy8gYXVkaW9IYWxGcmFtZXMgaXMgZGVyaXZlZCBmcm9tIG91dHB1dCBsYXRlbmN5Ci0gICAgLy8gRklYTUUgcGFyYW1ldGVycyBub3QgbmVlZGVkLCBjb3VsZCBnZXQgdGhlbSBmcm9tIHRoZSB0aHJlYWQKICAgICBib29sIHByZXNlbnRhdGlvbkNvbXBsZXRlKGludDY0X3QgZnJhbWVzV3JpdHRlbiwgc2l6ZV90IGF1ZGlvSGFsRnJhbWVzKTsKKworICAgIC8vIHByZXNlbnRhdGlvbkNvbXBsZXRlIGNoZWNrZWQgYnkgdGltZS4gKERpcmVjdCBUcmFja3MpLgorICAgIGJvb2wgcHJlc2VudGF0aW9uQ29tcGxldGUodWludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIHZvaWQgcmVzZXRQcmVzZW50YXRpb25Db21wbGV0ZSgpIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gMDsKKyAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlVGltZU5zID0gMDsKKyAgICB9CisKKyAgICAvLyBub3RpZnlQcmVzZW50YXRpb25Db21wbGV0ZSBpcyBjYWxsZWQgd2hlbiBwcmVzZW50YXRpb25Db21wbGV0ZSgpIGRldGVjdHMKKyAgICAvLyB0aGF0IHRoZSB0cmFjayBpcyBmaW5pc2hlZCBzdG9wcGluZy4KKyAgICB2b2lkIG5vdGlmeVByZXNlbnRhdGlvbkNvbXBsZXRlKCk7CisKICAgICB2b2lkIHNpZ25hbENsaWVudEZsYWcoaW50MzJfdCBmbGFnKTsKIAotICAgIC8qKiBTZXQgdGhhdCBhIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIGFuZCBuZWVkcyB0byBiZSBub3RpZmllZCB0byBiYWNrZW5kLiBUaHJlYWQgc2FmZS4gKi8KLSAgICB2b2lkIHNldE1ldGFkYXRhSGFzQ2hhbmdlZCgpIHsgbUNoYW5nZU5vdGlmaWVkLmNsZWFyKCk7IH0KIHB1YmxpYzoKICAgICB2b2lkIHRyaWdnZXJFdmVudHMoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCB0eXBlKTsKICAgICB2aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZSgpOwpAQCAtMjUwLDkgKzI2OSw2IEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAqbUF1eEJ1ZmZlcjsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBib29sICAgICAgICAgICAgICAgIG1IYXNWb2x1bWVDb250cm9sbGVyOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzOyAvLyBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIQUwgd2hlbiB0aGlzIHRyYWNrIHdpbGwgYmUgZnVsbHkgcmVuZGVyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHplcm8gbWVhbnMgbm90IG1vbml0b3JpbmcKIAogICAgIC8vIGFjY2VzcyB0aGVzZSB0aHJlZSB2YXJpYWJsZXMgb25seSB3aGVuIGhvbGRpbmcgdGhyZWFkIGxvY2suCiAgICAgTGluZWFyTWFwPGludDY0X3Q+IG1GcmFtZU1hcDsgICAgICAgICAgIC8vIHRyYWNrIGZyYW1lIHRvIHNlcnZlciBmcmFtZSBtYXBwaW5nCkBAIC0yNjUsNyArMjgxLDcgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgaGFwdGljIHBsYXliYWNrIGVuYWJsZWQgb3Igbm90CiAgICAgLy8gaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljIGRhdGEKLSAgICBBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgbUhhcHRpY0ludGVuc2l0eSA9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFOworICAgIG9zOjpIYXB0aWNTY2FsZSBtSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpNVVRFOwogICAgIGNsYXNzIEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA6IHB1YmxpYyBvczo6Qm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKFRyYWNrKiB0cmFjaykgOiBtVHJhY2sodHJhY2spIHt9CkBAIC0yNzYsOCArMjkyLDEwIEBACiAgICAgfTsKICAgICBzcDxBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXI+IG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXI7CiAgICAgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiAgICBtRXh0ZXJuYWxWaWJyYXRpb247Ci0gICAgLyoqIEhvdyBtYW55IGZyYW1lcyBzaG91bGQgYmUgaW4gdGhlIGJ1ZmZlciBiZWZvcmUgdGhlIHRyYWNrIGlzIGNvbnNpZGVyZWQgcmVhZHkgKi8KLSAgICBjb25zdCBzaXplX3QgICAgICAgIG1GcmFtZUNvdW50VG9CZVJlYWR5OworCisgICAgYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtRHVhbE1vbm9Nb2RlID0gQVVESU9fRFVBTF9NT05PX01PREVfT0ZGOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbUF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbCA9IC1zdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICBhdWRpb19wbGF5YmFja19yYXRlX3QgIG1QbGF5YmFja1JhdGVQYXJhbWV0ZXJzID0gQVVESU9fUExBWUJBQ0tfUkFURV9JTklUSUFMSVpFUjsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgIGludGVyY2VwdEJ1ZmZlcihjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcik7CkBAIC0yODYsNiArMzA0LDE0IEBACiAgICAgICAgIGZvciAoYXV0byYgdHAgOiBtVGVlUGF0Y2hlcykgeyBmKHRwLnBhdGNoVHJhY2spOyB9CiAgICAgfTsKIAorICAgIHNpemVfdCAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gMDsgLy8gKFVzZWQgZm9yIE1peGVkIHRyYWNrcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIQUwgd2hlbiB0aGlzIHRyYWNrIGlzIGNvbnNpZGVyZWQgZnVsbHkgcmVuZGVyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBaZXJvIG1lYW5zIG5vdCBtb25pdG9yaW5nLgorICAgIGludDY0X3QgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlVGltZU5zID0gMDsgLy8gKFVzZWQgZm9yIERpcmVjdCB0cmFja3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGltZSB3aGVuIHRoaXMgdHJhY2sgaXMgY29uc2lkZXJlZCBmdWxseSByZW5kZXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFplcm8gbWVhbnMgbm90IG1vbml0b3JpbmcuCisKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIG1GYXN0SW5kZXggPT0gLTEgaWYgbm90IGlzRmFzdFRyYWNrKCkKQEAgLTMwMiwxMCArMzI4LDEwIEBACiAgICAgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nOyAvLyB0cmFjayB3YXMgcGF1c2VkIGluIHN0b3BwaW5nIHN0YXRlLgogICAgIGJvb2wgICAgICAgICAgICAgICAgbUZsdXNoSHdQZW5kaW5nOyAvLyB0cmFjayByZXF1ZXN0cyBmb3IgdGhyZWFkIGZsdXNoCisgICAgYm9vbCAgICAgICAgICAgICAgICBtUGF1c2VId1BlbmRpbmcgPSBmYWxzZTsgLy8gZGlyZWN0L29mZmxvYWQgdHJhY2sgcmVxdWVzdCBmb3IgdGhyZWFkIHBhdXNlCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIC8vIElmIHRoZSBsYXN0IHRyYWNrIGNoYW5nZSB3YXMgbm90aWZpZWQgdG8gdGhlIGNsaWVudCB3aXRoIHJlYWRBbmRDbGVhckhhc0NoYW5nZWQKLSAgICBzdGQ6OmF0b21pY19mbGFnICAgICBtQ2hhbmdlTm90aWZpZWQgPSBBVE9NSUNfRkxBR19JTklUOwogICAgIFRlZVBhdGNoZXMgIG1UZWVQYXRjaGVzOworICAgIGNvbnN0IGZsb2F0ICAgICAgICAgbVNwZWVkOwogfTsgIC8vIGVuZCBvZiBUcmFjawogCiAKQEAgLTMyNCw3ICszNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgfk91dHB1dFRyYWNrKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQgPQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCmluZGV4IGQ4NzIzOWQuLmU4NTUyYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKQEAgLTE1LDQ0ICsxNSwxMiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KKwogI2lmbmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCi0vLyBDaGVja3MgYW5kIG1vbml0b3JzIE9QX1JFQ09SRF9BVURJTwotY2xhc3MgT3BSZWNvcmRBdWRpb01vbml0b3IgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgfk9wUmVjb3JkQXVkaW9Nb25pdG9yKCkgb3ZlcnJpZGU7Ci0gICAgYm9vbCBoYXNPcFJlY29yZEF1ZGlvKCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgc3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IGNyZWF0ZUlmTmVlZGVkCi0gICAgICAgICh1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwotCi1wcml2YXRlOgotICAgIE9wUmVjb3JkQXVkaW9Nb25pdG9yKHVpZF90IHVpZCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwotICAgIHZvaWQgb25GaXJzdFJlZigpIG92ZXJyaWRlOwotCi0gICAgQXBwT3BzTWFuYWdlciBtQXBwT3BzTWFuYWdlcjsKLQotICAgIGNsYXNzIFJlY29yZEF1ZGlvT3BDYWxsYmFjayA6IHB1YmxpYyBCbkFwcE9wc0NhbGxiYWNrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IFJlY29yZEF1ZGlvT3BDYWxsYmFjayhjb25zdCB3cDxPcFJlY29yZEF1ZGlvTW9uaXRvcj4mIG1vbml0b3IpOwotICAgICAgICB2b2lkIG9wQ2hhbmdlZChpbnQzMl90IG9wLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUpIG92ZXJyaWRlOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3Qgd3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IG1Nb25pdG9yOwotICAgIH07Ci0KLSAgICBzcDxSZWNvcmRBdWRpb09wQ2FsbGJhY2s+IG1PcENhbGxiYWNrOwotICAgIC8vIGNhbGxlZCBieSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgd2hlbiBPUF9SRUNPUkRfQVVESU8gaXMgdXBkYXRlZCBpbiBBcHBPcCBjYWxsYmFjawotICAgIC8vIGFuZCBpbiBvbkZpcnN0UmVmKCkKLSAgICB2b2lkIGNoZWNrUmVjb3JkQXVkaW8oKTsKLQotICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUhhc09wUmVjb3JkQXVkaW87Ci0gICAgY29uc3QgdWlkX3QgbVVpZDsKLSAgICBjb25zdCBTdHJpbmcxNiBtUGFja2FnZTsKLX07Ci0KIC8vIHJlY29yZCB0cmFjawogY2xhc3MgUmVjb3JkVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlIHsKIHB1YmxpYzoKQEAgLTY3LDExICszNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RnJhbWVzID0gLTEpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflJlY29yZFRyYWNrKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtMTAzLDEyICs3MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KIAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBpZiAoIWlzUGF0Y2hUcmFjaygpKSBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0OworICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2hhcmVBdWRpb0hpc3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNoYXJlZEF1ZGlvU3RhcnRNcyk7CisgICAgICAgICAgICBpbnQzMl90ICAgICBzdGFydEZyYW1lcygpIHsgcmV0dXJuIG1TdGFydEZyYW1lczsgfQogCiAgICAgc3RhdGljICBib29sICAgICAgICBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgewpAQCAtMTQ3LDEwICsxMTgsOCBAQAogCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TaWxlbmNlZDsKIAotICAgICAgICAgICAgLy8gdXNlZCB0byBlbmZvcmNlIE9QX1JFQ09SRF9BVURJTwotICAgICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwotICAgICAgICAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZTsKLSAgICAgICAgICAgIHNwPE9wUmVjb3JkQXVkaW9Nb25pdG9yPiAgICAgICAgICAgbU9wUmVjb3JkQXVkaW9Nb25pdG9yOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9IHt9OworICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRGcmFtZXMgPSAtMTsKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCmluZGV4IGM3YWJhNzkuLjBjZTU2ODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmNwcApAQCAtMzksNyArMzksNyBAQAogICAgICAgICAsIG1TcGRpZkVuY29kZXIodGhpcywgZm9ybWF0KQogICAgICAgICAsIG1BcHBsaWNhdGlvbkZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCkKICAgICAgICAgLCBtQXBwbGljYXRpb25TYW1wbGVSYXRlKDApCi0gICAgICAgICwgbUFwcGxpY2F0aW9uQ2hhbm5lbE1hc2soMCkKKyAgICAgICAgLCBtQXBwbGljYXRpb25DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX05PTkUpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCAyYWYyN2Q4Li5iOWNkYWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgpAQCAtMTA3LDYgKzEwOCw3IEBACiAKIC8vIFRPRE86IE1vdmUgdGhlc2UgbWFjcm8vaW5saW5lcyB0byBhIGhlYWRlciBmaWxlLgogI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKwogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBzdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCiB7CkBAIC0xMTUsMTYgKzExNywzMyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIG1lZGlhOjpJRWZmZWN0Q2xpZW50OwordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gcmV0cnkgY291bnRzIGZvciBidWZmZXIgZmlsbCB0aW1lb3V0CiAvLyA1MCAqIH4yMG1zZWNzID0gMSBzZWNvbmQKIHN0YXRpYyBjb25zdCBpbnQ4X3Qga01heFRyYWNrUmV0cmllcyA9IDUwOwogc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tTdGFydHVwUmV0cmllcyA9IDUwOworCiAvLyBhbGxvdyBsZXNzIHJldHJ5IGF0dGVtcHRzIG9uIGRpcmVjdCBvdXRwdXQgdGhyZWFkLgogLy8gZGlyZWN0IG91dHB1dHMgY2FuIGJlIGEgc2NhcmNlIHJlc291cmNlIGluIGF1ZGlvIGhhcmR3YXJlIGFuZCBzaG91bGQKIC8vIGJlIHJlbGVhc2VkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi1zdGF0aWMgY29uc3QgaW50OF90IGtNYXhUcmFja1JldHJpZXNEaXJlY3QgPSAyOwotCi0KKy8vIE5vdGVzOgorLy8gMSkgVGhlIHJldHJ5IGR1cmF0aW9uIGtNYXhUcmFja1JldHJpZXNEaXJlY3RNcyBtYXkgYmUgaW5jcmVhc2VkCisvLyAgICBpbiBjYXNlIHRoZSBkYXRhIHdyaXRlIGlzIGJ1cnN0eSBmb3IgdGhlIEF1ZGlvVHJhY2suICBUaGUgYXBwbGljYXRpb24KKy8vICAgIHNob3VsZCBlbmRlYXZvciB0byB3cml0ZSBhdCBsZWFzdCBvbmNlIGV2ZXJ5IGtNYXhUcmFja1JldHJpZXNEaXJlY3RNcworLy8gICAgdG8gcHJldmVudCBhbiB1bmRlcnJ1biBzaXR1YXRpb24uICBJZiB0aGUgZGF0YSBpcyBidXJzdHksIHRoZW4KKy8vICAgIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWxzbyB0aHJvdHRsZSB0aGUgZGF0YSBzZW50IHRvIGJlIGV2ZW4uCisvLyAyKSBGb3IgY29tcHJlc3NlZCBhdWRpbyBkYXRhLCBhbnkgZGF0YSBwcmVzZW50IGluIHRoZSBBdWRpb1RyYWNrIGJ1ZmZlcgorLy8gICAgd2lsbCBiZSBzZW50IGFuZCByZXNldCB0aGUgcmV0cnkgY291bnQuICBUaGlzIGRlbGl2ZXJzIGRhdGEgYXMKKy8vICAgIGl0IGFycml2ZXMsIHdpdGggYXBwcm94aW1hdGVseSBrRGlyZWN0TWluU2xlZXBUaW1lVXMgPSAxMG1zIGNoZWNraW5nIGludGVydmFsLgorLy8gMykgRm9yIGxpbmVhciBQQ00gb3IgcHJvcG9ydGlvbmFsIFBDTSwgd2Ugd2FpdCBvbmUgcGVyaW9kIGZvciBhIHBlcmlvZCdzIHdvcnRoCisvLyAgICBvZiBkYXRhIHRvIGJlIGF2YWlsYWJsZSwgdGhlbiBhbnkgcmVtYWluaW5nIGRhdGEgaXMgZGVsaXZlcmVkLgorLy8gICAgVGhpcyBpcyByZXF1aXJlZCB0byBlbnN1cmUgdGhlIGxhc3QgYml0IG9mIGRhdGEgaXMgZGVsaXZlcmVkIGJlZm9yZSB1bmRlcnJ1bi4KKy8vCisvLyBTbGVlcCB0aW1lIHBlciBjeWNsZSBpcyBrRGlyZWN0TWluU2xlZXBUaW1lVXMgZm9yIGNvbXByZXNzZWQgdHJhY2tzCisvLyBvciB0aGUgc2l6ZSBvZiB0aGUgSEFMIHBlcmlvZCBmb3IgcHJvcG9ydGlvbmFsIC8gbGluZWFyIFBDTSB0cmFja3MuCitzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0TXMgPSAyMDA7CiAKIC8vIGRvbid0IHdhcm4gYWJvdXQgYmxvY2tlZCB3cml0ZXMgb3IgcmVjb3JkIGJ1ZmZlciBvdmVyZmxvd3MgbW9yZSBvZnRlbiB0aGFuIHRoaXMKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYXJuaW5nVGhyb3R0bGVOcyA9IHNlY29uZHMoNSk7CkBAIC02MjEsNyArNjQwLDcgQEAKICAgICBtSW9KaXR0ZXJNcy5yZXNldCgpOwogICAgIG1MYXRlbmN5TXMucmVzZXQoKTsKICAgICBtUHJvY2Vzc1RpbWVNcy5yZXNldCgpOwotICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkobVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9DT05USU5VT1VTKTsKIAogICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9IChDb25maWdFdmVudCAqKW5ldyBJb0NvbmZpZ0V2ZW50KGV2ZW50LCBwaWQsIHBvcnRJZCk7CiAgICAgc2VuZENvbmZpZ0V2ZW50X2woY29uZmlnRXZlbnQpOwpAQCAtNjk1LDYgKzcxNCwxMyBAQAogICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kUmVzaXplQnVmZmVyQ29uZmlnRXZlbnRfbChpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKQoreworICAgIEFMT0dfQVNTRVJUKHR5cGUoKSA9PSBSRUNPUkQsICJzZW5kUmVzaXplQnVmZmVyQ29uZmlnRXZlbnRfbCgpIGNhbGxlZCBvbiBub24gcmVjb3JkIHRocmVhZCIpOworICAgIHNwPENvbmZpZ0V2ZW50PiBjb25maWdFdmVudCA9CisgICAgICAgICAgICAoQ29uZmlnRXZlbnQgKiluZXcgUmVzaXplQnVmZmVyQ29uZmlnRXZlbnQobWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOworICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKK30KIAogLy8gcG9zdCBjb25kaXRpb246IG1Db25maWdFdmVudHMuaXNFbXB0eSgpCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkKQEAgLTc1Myw2ICs3NzksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgKFVwZGF0ZU91dERldmljZXNDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CiAgICAgICAgICAgICB1cGRhdGVPdXREZXZpY2VzKGRhdGEtPm1PdXREZXZpY2VzKTsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDRkdfRVZFTlRfUkVTSVpFX0JVRkZFUjogeworICAgICAgICAgICAgUmVzaXplQnVmZmVyQ29uZmlnRXZlbnREYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKFJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKKyAgICAgICAgICAgIHJlc2l6ZUlucHV0QnVmZmVyX2woZGF0YS0+bU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg0LDcgKzgxNSw3IEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJmcm9udC1yaWdodCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWNlbnRlciwgIik7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3ctZnJlcXVlbmN5LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWxlZnQtb2YtY2VudGVyLCAiKTsKQEAgLTc5NywxMiArODI4LDE2IEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtY2VudGVyLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgidG9wLWZyb250LXJpZ2h0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwotICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOwotICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUKSBzLmFwcGVuZCgidG9wLXNpZGUtbGVmdCwgIiApOwotICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiICk7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CKSBzLmFwcGVuZCgiaGFwdGljLUIsICIgKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpIHMuYXBwZW5kKCJoYXB0aWMtQSwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJib3R0b20tZnJvbnQtbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0JPVFRPTV9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJib3R0b20tZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQk9UVE9NX0ZST05UX1JJR0hUKSBzLmFwcGVuZCgiYm90dG9tLWZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWV8yKSBzLmFwcGVuZCgibG93LWZyZXF1ZW5jeS0yLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0IpIHMuYXBwZW5kKCJoYXB0aWMtQiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKQEAgLTgyMCw5ICs4NTUsOSBAQAogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfTEVGVCkgcy5hcHBlbmQoImJhY2stbGVmdCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0NFTlRFUikgcy5hcHBlbmQoImNlbnRlciwgIik7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKLSAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfTEVGVCkgcy5hcHBlbmQoInRvcC1sZWZ0LCAiICk7Ci0gICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX1JJR0hUKSBzLmFwcGVuZCgidG9wLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdy1mcmVxdWVuY3ksICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCkgcy5hcHBlbmQoInRvcC1yaWdodCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CkBAIC05ODUsMTUgKzEwMjAsMTYgQEAKICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7CiAgICAgICAgIC8vIFVzZXMgQUlEX0FVRElPU0VSVkVSIGZvciB3YWtlbG9jay4gIHVwZGF0ZVdha2VMb2NrVWlkc19sKCkgdXBkYXRlcyB3aXRoIGNsaWVudCB1aWRzLgotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAotICAgICAgICAgICAgICAgICAgICBiaW5kZXIsCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9ja0FzeW5jKGJpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAogICAgICAgICAgICAgICAgICAgICBnZXRXYWtlTG9ja1RhZygpLAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBGSVhNRSBmb3JjZSBvbmV3YXkgY29udHJhcnkgdG8gLmFpZGwgKi8pOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHt9IC8qIHdvcmtTb3VyY2UgKi8sCisgICAgICAgICAgICAgICAgICAgIHt9IC8qIGhpc3RvcnlUYWcgKi8pOworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgewogICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbVRocmVhZE5hbWUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1UaHJlYWROYW1lLCBzdGF0dXMuZXhjZXB0aW9uQ29kZSgpKTsKICAgICB9CiAKICAgICBnQm9vdHRpbWUuYWNxdWlyZShtV2FrZUxvY2tUb2tlbik7CkBAIC0xMDEzLDggKzEwNDksNyBAQAogICAgIGlmIChtV2FrZUxvY2tUb2tlbiAhPSAwKSB7CiAgICAgICAgIEFMT0dWKCJyZWxlYXNlV2FrZUxvY2tfbCgpICVzIiwgbVRocmVhZE5hbWUpOwogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7Ci0gICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKKyAgICAgICAgICAgIG1Qb3dlck1hbmFnZXItPnJlbGVhc2VXYWtlTG9ja0FzeW5jKG1XYWtlTG9ja1Rva2VuLCAwKTsKICAgICAgICAgfQogICAgICAgICBtV2FrZUxvY2tUb2tlbi5jbGVhcigpOwogICAgIH0KQEAgLTEwMjgsNyArMTA2Myw3IEBACiAgICAgICAgIGlmIChiaW5kZXIgPT0gMCkgewogICAgICAgICAgICAgQUxPR1coIlRocmVhZCAlcyBjYW5ub3QgY29ubmVjdCB0byB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIiwgbVRocmVhZE5hbWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBvd2VyTWFuYWdlciA9IGludGVyZmFjZV9jYXN0PElQb3dlck1hbmFnZXI+KGJpbmRlcik7CisgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8b3M6OklQb3dlck1hbmFnZXI+KGJpbmRlcik7CiAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDU1LDEwICsxMDkwLDkgQEAKICAgICB9CiAgICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gMCkgewogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHNBc0ludCh1aWRzLmJlZ2luKCksIHVpZHMuZW5kKCkpOyAvLyBwb3dlcm1hbmFnZXIgZXhwZWN0cyB1aWRzIGFzIGludHMKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvd2VyTWFuYWdlci0+dXBkYXRlV2FrZUxvY2tVaWRzKAotICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuLCB1aWRzQXNJbnQuc2l6ZSgpLCB1aWRzQXNJbnQuZGF0YSgpLAotICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKLSAgICAgICAgQUxPR1YoInVwZGF0ZVdha2VMb2NrVWlkc19sKCkgJXMgc3RhdHVzICVkIiwgbVRocmVhZE5hbWUsIHN0YXR1cyk7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPnVwZGF0ZVdha2VMb2NrVWlkc0FzeW5jKAorICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuLCB1aWRzQXNJbnQpOworICAgICAgICBBTE9HVigidXBkYXRlV2FrZUxvY2tVaWRzX2woKSAlcyBzdGF0dXMgJWQiLCBtVGhyZWFkTmFtZSwgc3RhdHVzLmV4Y2VwdGlvbkNvZGUoKSk7CiAgICAgfQogfQogCkBAIC0xMDc1LDYgKzExMDksMTEgQEAKICAgICBBTE9HRSgiJXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIFJlY29yZFRocmVhZCIsIF9fZnVuY19fKTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnJlc2l6ZUlucHV0QnVmZmVyX2woaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyBfX3VudXNlZCkKK3sKKyAgICBBTE9HRSgiJXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIFJlY29yZFRocmVhZCIsIF9fZnVuY19fKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKQEAgLTEyNDMsNiArMTI4MiwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KKworICAgIGlmIChFZmZlY3RNb2R1bGU6OmlzSGFwdGljR2VuZXJhdG9yKCZkZXNjLT50eXBlKSkgeworICAgICAgICBBTE9HRSgiJXMoKTogSGFwdGljR2VuZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gUmVjb3JkVGhyZWFkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTEyNjIsNiArMTMwNiwxMiBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCisgICAgaWYgKEVmZmVjdE1vZHVsZTo6aXNIYXB0aWNHZW5lcmF0b3IoJmRlc2MtPnR5cGUpICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IHRocmVhZCBkb2Vzbid0IHN1cHBvcnQgaGFwdGljIHBsYXliYWNrIHdoaWxlIHRoZSBlZmZlY3QgaXMgSGFwdGljR2VuZXJhdG9yIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgTUlYRVI6IHsKICNpZm5kZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgpAQCAtMTQyNCw2ICsxNDc0LDE2IEBACiAgICAgICAgICAgICBlZmZlY3QtPnNldE1vZGUobUF1ZGlvRmxpbmdlci0+Z2V0TW9kZSgpKTsKICAgICAgICAgICAgIGVmZmVjdC0+c2V0QXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlKTsKICAgICAgICAgfQorICAgICAgICBpZiAoZWZmZWN0LT5pc0hhcHRpY0dlbmVyYXRvcigpKSB7CisgICAgICAgICAgICAvLyBUT0RPKGIvMTg0MTk0MDU3KTogVXNlIHRoZSB2aWJyYXRvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aWJyYXRvciB0aGF0IHdpbGwgYmUgdXNlZAorICAgICAgICAgICAgLy8gZm9yIHRoZSBIYXB0aWNHZW5lcmF0b3IuCisgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9WaWJyYXRvckluZm8qIGRlZmF1bHRWaWJyYXRvckluZm8gPQorICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5nZXREZWZhdWx0VmlicmF0b3JJbmZvX2woKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0VmlicmF0b3JJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAvLyBPbmx5IHNldCB0aGUgdmlicmF0b3IgaW5mbyB3aGVuIGl0IGlzIGEgdmFsaWQgb25lLgorICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0VmlicmF0b3JJbmZvKGRlZmF1bHRWaWJyYXRvckluZm8pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3QgaGFuZGxlIGFuZCBjb25uZWN0IGl0IHRvIGVmZmVjdCBtb2R1bGUKICAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCBwcmlvcml0eSk7CiAgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOwpAQCAtMTU3OCw3ICsxNjM4LDcgQEAKICAgICAgICAgZGV0YWNoQXV4RWZmZWN0X2woZWZmZWN0LT5pZCgpKTsKICAgICB9CiAKLSAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBlZmZlY3QtPmNhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGVmZmVjdC0+Z2V0Q2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgLy8gcmVtb3ZlIGVmZmVjdCBjaGFpbiBpZiByZW1vdmluZyBsYXN0IGVmZmVjdAogICAgICAgICBpZiAoY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCwgcmVsZWFzZSkgPT0gMCkgewpAQCAtMTczOCw4ICsxNzk4LDE0IEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogYm9vbCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkFjdGl2ZVRyYWNrczxUPjo6cmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpIHsKLSAgICBjb25zdCBib29sIGhhc0NoYW5nZWQgPSBtSGFzQ2hhbmdlZDsKKyAgICBib29sIGhhc0NoYW5nZWQgPSBtSGFzQ2hhbmdlZDsKICAgICBtSGFzQ2hhbmdlZCA9IGZhbHNlOworCisgICAgZm9yIChjb25zdCBzcDxUPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgIC8vIERvIG5vdCBzaG9ydC1jaXJjdWl0IGFzIGFsbCBoYXNDaGFuZ2VkIHN0YXRlcyBtdXN0IGJlIHJlc2V0CisgICAgICAgIC8vIGFzIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGdvaW5nIHRvIGJlIHNlbnQKKyAgICAgICAgaGFzQ2hhbmdlZCB8PSB0cmFjay0+cmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpOworICAgIH0KICAgICByZXR1cm4gaGFzQ2hhbmdlZDsKIH0KIApAQCAtMTg2Myw3ICsxOTI5LDggQEAKICAgICAgICAgLy8gaW5kZXggMCBpcyByZXNlcnZlZCBmb3Igbm9ybWFsIG1peGVyJ3Mgc3VibWl4CiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbE1hc2soKCgxIDw8IEZhc3RNaXhlclN0YXRlOjpzTWF4RmFzdFRyYWNrcykgLSAxKSAmIH4xKSwKICAgICAgICAgbUh3U3VwcG9ydHNQYXVzZShmYWxzZSksIG1Id1BhdXNlZChmYWxzZSksIG1GbHVzaFBlbmRpbmcoZmFsc2UpLAotICAgICAgICBtTGVmdFZvbEZsb2F0KC0xLjApLCBtUmlnaHRWb2xGbG9hdCgtMS4wKQorICAgICAgICBtTGVmdFZvbEZsb2F0KC0xLjApLCBtUmlnaHRWb2xGbG9hdCgtMS4wKSwKKyAgICAgICAgbURvd25TdHJlYW1QYXRjaHt9CiB7CiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9PdXRfJVgiLCBpZCk7CiAgICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbVRocmVhZE5hbWUpOwpAQCAtMTkwMSw5ICsxOTY4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKICAgICB9CiAKLSAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCi0gICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKLSAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKKyAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFte3N0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpfTsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lID0gMC4wZjsKICAgICAgICAgbVN0cmVhbVR5cGVzW3N0cmVhbV0ubXV0ZSA9IG1BdWRpb0ZsaW5nZXItPnN0cmVhbU11dGVfbChzdHJlYW0pOwogICAgIH0KQEAgLTE5MjYsMTQgKzE5OTIsMTQgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBpZiAobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgaWYgKCFpc1N0cmVhbUluaXRpYWxpemVkKCkpIHsKICAgICAgICAgQUxPR0UoIlRoZSBzdHJlYW0gaXMgbm90IG9wZW4geWV0Iik7IC8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc2V0RXZlbnRDYWxsYmFjayB3aWxsIG5lZWQgYSBzdHJvbmcgcG9pbnRlciBhcyBhIHBhcmFtZXRlci4gQ2FsbGluZyBpdAogICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgY29uc3RydWN0b3Igb2YgUGxheWJhY2tUaHJlYWQgc28gdGhhdCB0aGUgb25GaXJzdFJlZgogICAgICAgICAvLyBjYWxsYmFjayB3b3VsZCBub3QgYmUgbWFkZSBvbiBhbiBpbmNvbXBsZXRlbHkgY29uc3RydWN0ZWQgb2JqZWN0LgogICAgICAgICBpZiAobU91dHB1dC0+c3RyZWFtLT5zZXRFdmVudENhbGxiYWNrKHRoaXMpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFkZCBldmVudCBjYWxsYmFjayIpOworICAgICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBhZGQgZXZlbnQgY2FsbGJhY2siKTsKICAgICAgICAgfQogICAgIH0KICAgICBydW4obVRocmVhZE5hbWUsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKQEAgLTIwNjMsOCArMjEyOSw4IEBACiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIHBpZF90IHRpZCwKLSAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1RyYWNrQ2FsbGJhY2s+JiBjYWxsYmFjaykKQEAgLTIxNTgsOCArMjIyNCw4IEBACiAgICAgICAgICAgICAgICAgInNhbXBsZVJhdGU9JXUgbVNhbXBsZVJhdGU9JXUgIgogICAgICAgICAgICAgICAgICJoYXNGYXN0TWl4ZXI9JWQgdGlkPSVkIGZhc3RUcmFja0F2YWlsTWFzaz0lI3giLAogICAgICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci5nZXQoKSwgZnJhbWVDb3VudCwgbUZyYW1lQ291bnQsIGZvcm1hdCwgbUZvcm1hdCwKLSAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIHNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKKyAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCksIGNoYW5uZWxNYXNrLCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBoYXNGYXN0TWl4ZXIoKSwgdGlkLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgICB9CiAgICAgfQpAQCAtMjMzMSwxMSArMjM5NywxMSBAQAogICAgICAgICAvLyBhbGwgdHJhY2tzIGluIHNhbWUgYXVkaW8gc2Vzc2lvbiBtdXN0IHNoYXJlIHRoZSBzYW1lIHJvdXRpbmcgc3RyYXRlZ3kgb3RoZXJ3aXNlCiAgICAgICAgIC8vIGNvbmZsaWN0cyB3aWxsIGhhcHBlbiB3aGVuIHRyYWNrcyBhcmUgbW92ZWQgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIgYnkgYXVkaW8gcG9saWN5CiAgICAgICAgIC8vIG1hbmFnZXIKLSAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3kgPSBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtVHlwZSk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW1UeXBlKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdCA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodCAhPSAwICYmIHQtPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgYWN0dWFsID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHQtPnN0cmVhbVR5cGUoKSk7CisgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGFjdHVhbCA9IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbSh0LT5zdHJlYW1UeXBlKCkpOwogICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdC0+c2Vzc2lvbklkKCkgJiYgc3RyYXRlZ3kgIT0gYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVUcmFja19sKCkgbWlzbWF0Y2hlZCBzdHJhdGVneTsgZXhwZWN0ZWQgJXUgYnV0IGZvdW5kICV1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwgYWN0dWFsKTsKQEAgLTIzNDUsMTAgKzI0MTEsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8vIFNldCBESVJFQ1QgZmxhZyBpZiBjdXJyZW50IHRocmVhZCBpcyBEaXJlY3RPdXRwdXRUaHJlYWQuIFRoaXMgY2FuCisgICAgICAgIC8vIGhhcHBlbiB3aGVuIHRoZSBwbGF5YmFjayBpcyByZXJvdXRlZCB0byBkaXJlY3Qgb3V0cHV0IHRocmVhZCBieQorICAgICAgICAvLyBkeW5hbWljIGF1ZGlvIHBvbGljeS4KKyAgICAgICAgLy8gRG8gTk9UIHJlcG9ydCB0aGUgZmxhZyBjaGFuZ2VzIGJhY2sgdG8gY2xpZW50LCBzaW5jZSB0aGUgY2xpZW50CisgICAgICAgIC8vIGRvZXNuJ3QgZXhwbGljaXRseSByZXF1ZXN0IGEgZGlyZWN0IGZsYWcuCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHRyYWNrRmxhZ3MgPSAqZmxhZ3M7CisgICAgICAgIGlmIChtVHlwZSA9PSBESVJFQ1QpIHsKKyAgICAgICAgICAgIHRyYWNrRmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4odHJhY2tGbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgIH0KKwogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCBhdHRyaWJ1dGlvblNvdXJjZSwgdHJhY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCwgU0laRV9NQVggLypmcmFtZUNvdW50VG9CZVJlYWR5Ki8sIHNwZWVkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMjM2MCw3ICsyNDM3LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9hdENiTChtQXVkaW9UcmFja0NiTG9jayk7CiAgICAgICAgICAgICBpZiAoY2FsbGJhY2suZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2tzLmVtcGxhY2UoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2FsbGJhY2tzLmVtcGxhY2UodHJhY2ssIGNhbGxiYWNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNTI3LDE1ICsyNjA0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwID8gVHJhY2s6OkZTX0ZJTExFRCA6IFRyYWNrOjpGU19GSUxMSU5HOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCi0gICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY2hhaW4gIT0gbnVsbHB0ciAmJiBjaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkpKSB7CiAgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAogICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGNvbnN0IGludCBpbnRlbnNpdHkgPSBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydCgKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3Q+KGludGVuc2l0eSkpOworICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxvczo6SGFwdGljU2NhbGU+KGludGVuc2l0eSkpOwogICAgICAgICAgICAgLy8gSGFwdGljIHBsYXliYWNrIHNob3VsZCBiZSBlbmFibGVkIGJ5IHZpYnJhdG9yIHNlcnZpY2UuCiAgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBoYXB0aWMgcGxheWJhY2sgb2YgYWxsIGFjdGl2ZSB0cmFjayB0byBlbnN1cmUgb25seQpAQCAtMjU0NCwxMiArMjYyMywxNiBAQAogICAgICAgICAgICAgICAgICAgICB0LT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGhhcHRpYyBpbnRlbnNpdHkgZm9yIGVmZmVjdAorICAgICAgICAgICAgaWYgKGNoYWluICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjaGFpbi0+c2V0SGFwdGljSW50ZW5zaXR5X2wodHJhY2stPmlkKCksIGludGVuc2l0eSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0cmFjay0+bVJlc2V0RG9uZSA9IGZhbHNlOwotICAgICAgICB0cmFjay0+bVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gMDsKKyAgICAgICAgdHJhY2stPnJlc2V0UHJlc2VudGF0aW9uQ29tcGxldGUoKTsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwotICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CiAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiYWRkVHJhY2tfbCgpIHN0YXJ0aW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uICVkIiwgY2hhaW4uZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CkBAIC0yNTg4LDYgKzI2NzEsMTAgQEAKICAgICBtTG9jYWxMb2cubG9nKCJyZW1vdmVUcmFja19sICglcCkgJXMiLCB0cmFjay5nZXQoKSwgcmVzdWx0LnN0cmluZygpKTsKIAogICAgIG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfYXRDYkwobUF1ZGlvVHJhY2tDYkxvY2spOworICAgICAgICBtQXVkaW9UcmFja0NhbGxiYWNrcy5lcmFzZSh0cmFjayk7CisgICAgfQogICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewogICAgICAgICBpbnQgaW5kZXggPSB0cmFjay0+bUZhc3RJbmRleDsKICAgICAgICAgQUxPR19BU1NFUlQoMCA8IGluZGV4ICYmIGluZGV4IDwgKGludClGYXN0TWl4ZXJTdGF0ZTo6c01heEZhc3RUcmFja3MpOwpAQCAtMjYxNCw3ICsyNzAxLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtT3V0cHV0ID09IG51bGxwdHIgfHwgbU91dHB1dC0+c3RyZWFtID09IG51bGxwdHIpIHsKKyAgICBpZiAoIWlzU3RyZWFtSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOwpAQCAtMjYyNiwxMiArMjcxMywxNiBAQAogICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkIiwgdGhpcywgZXZlbnQpOwogCiAgICAgZGVzYy0+bUlvSGFuZGxlID0gbUlkOworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaCA9IG1QYXRjaDsKKyAgICBpZiAoaXNNc2REZXZpY2UoKSkgeworICAgICAgICBwYXRjaCA9IG1Eb3duU3RyZWFtUGF0Y2g7CisgICAgfQogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKICAgICBjYXNlIEFVRElPX09VVFBVVF9SRUdJU1RFUkVEOgogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IHBhdGNoOwogICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7CiAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IG1Gb3JtYXQ7CkBAIC0yNjQxLDcgKzI3MzIsNyBAQAogICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgotICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IHBhdGNoOwogICAgICAgICBkZXNjLT5tUG9ydElkID0gcG9ydElkOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CkBAIC0yNjgzLDggKzI3NzQsOCBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6bWV0YWRhdGE6OmJ5dGVTdHJpbmdGcm9tRGF0YShtZXRhZGF0YSk7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvciBtZXRhZGF0YVZlYyhtZXRhRGF0YVN0ci5iZWdpbigpLCBtZXRhRGF0YVN0ci5lbmQoKSk7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUF1ZGlvVHJhY2tDYkxvY2spOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjYWxsYmFjayA6IG1BdWRpb1RyYWNrQ2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ29kZWNGb3JtYXRDaGFuZ2VkKG1ldGFkYXRhVmVjKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2FsbGJhY2tQYWlyIDogbUF1ZGlvVHJhY2tDYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja1BhaXIuc2Vjb25kLT5vbkNvZGVjRm9ybWF0Q2hhbmdlZChtZXRhZGF0YVZlYyk7CiAgICAgICAgICAgICB9CiAgICAgfSkuZGV0YWNoKCk7CiB9CkBAIC0yNzA4LDcgKzI3OTksNyBAQAogICAgICAgICAvLyB0aGUgdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIHRvIHJlc2V0IHRvIDAgZm9yIGRpcmVjdCBhbmQgb2ZmbG9hZCB0aHJlYWRzLgogICAgICAgICAvLyAoT3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGUgZGlzY29udGludWl0eSB3b3VsZCBiZSBoYW5kbGVkCiAgICAgICAgIC8vIGVsc2V3aGVyZSwgZS5nLiBpbiBmbHVzaCkuCi0gICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7CiAgICAgICAgIG1EcmFpblNlcXVlbmNlICY9IH4xOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CkBAIC0yNzE3LDggKzI4MDgsOSBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKIHsKICAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19BTFdBWVNfRkFUQUwKLSAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPmdldFNhbXBsZVJhdGUoKTsKLSAgICBtQ2hhbm5lbE1hc2sgPSBtT3V0cHV0LT5nZXRDaGFubmVsTWFzaygpOworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgYXVkaW9Db25maWcgPSBtT3V0cHV0LT5nZXRBdWRpb1Byb3BlcnRpZXMoKTsKKyAgICBtU2FtcGxlUmF0ZSA9IGF1ZGlvQ29uZmlnLnNhbXBsZV9yYXRlOworICAgIG1DaGFubmVsTWFzayA9IGF1ZGlvQ29uZmlnLmNoYW5uZWxfbWFzazsKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9jaGFubmVsKG1DaGFubmVsTWFzaykpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSEFMIGNoYW5uZWwgbWFzayAlI3ggbm90IHZhbGlkIGZvciBvdXRwdXQiLCBtQ2hhbm5lbE1hc2spOwogICAgIH0KQEAgLTI3MzEsMTEgKzI4MjMsMTEgQEAKICAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spOwogCiAgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgotICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0Rm9ybWF0KCZtSEFMRm9ybWF0KTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcyhudWxscHRyLCBudWxscHRyLCAmbUhBTEZvcm1hdCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHJldHJpZXZpbmcgb3V0cHV0IHN0cmVhbSBmb3JtYXQ6ICVkIiwgcmVzdWx0KTsKICAgICAvLyBHZXQgZm9ybWF0IGZyb20gdGhlIHNoaW0sIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gdGhlIEhBTCBmb3JtYXQKICAgICAvLyBpZiBwbGF5aW5nIGNvbXByZXNzZWQgYXVkaW8gb3ZlciBIRE1JIHBhc3N0aHJvdWdoLgotICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5nZXRGb3JtYXQoKTsKKyAgICBtRm9ybWF0ID0gYXVkaW9Db25maWcuZm9ybWF0OwogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KG1Gb3JtYXQpKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBmb3JtYXQgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUZvcm1hdCk7CiAgICAgfQpAQCAtMjg2Miw4ICsyOTU0LDggQEAKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1FZmZlY3RCdWZmZXIsIDMyLCBtRWZmZWN0QnVmZmVyU2l6ZSk7CiAgICAgfQogCi0gICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwotICAgIG1DaGFubmVsTWFzayAmPSB+bUhhcHRpY0NoYW5uZWxNYXNrOworICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgIG1DaGFubmVsTWFzayA9IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtQ2hhbm5lbE1hc2sgJiB+bUhhcHRpY0NoYW5uZWxNYXNrKTsKICAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1IYXB0aWNDaGFubmVsTWFzayk7CiAgICAgbUNoYW5uZWxDb3VudCAtPSBtSGFwdGljQ2hhbm5lbENvdW50OwogCkBAIC0yOTA2LDIzICsyOTk4LDE3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dXBkYXRlTWV0YWRhdGFfbCgpCiB7Ci0gICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0ciApIHsKLSAgICAgICAgcmV0dXJuOyAvLyBUaGF0IHNob3VsZCBub3QgaGFwcGVuCi0gICAgfQotICAgIGJvb2wgaGFzQ2hhbmdlZCA9IG1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpOwotICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKLSAgICAgICAgLy8gRG8gbm90IHNob3J0LWNpcmN1aXQgYXMgYWxsIGhhc0NoYW5nZWQgc3RhdGVzIG11c3QgYmUgcmVzZXQKLSAgICAgICAgLy8gYXMgYWxsIHRoZSBtZXRhZGF0YSBhcmUgZ29pbmcgdG8gYmUgc2VudAotICAgICAgICBoYXNDaGFuZ2VkIHw9IHRyYWNrLT5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCk7Ci0gICAgfQotICAgIGlmICghaGFzQ2hhbmdlZCkgeworICAgIGlmICghaXNTdHJlYW1Jbml0aWFsaXplZCgpIHx8ICFtQWN0aXZlVHJhY2tzLnJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKSkgewogICAgICAgICByZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KICAgICB9CiAgICAgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSBtZXRhZGF0YTsKICAgICBhdXRvIGJhY2tJbnNlcnRlciA9IHN0ZDo6YmFja19pbnNlcnRlcihtZXRhZGF0YS50cmFja3MpOwogICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgLy8gTm8gdHJhY2sgaXMgaW52YWxpZCBhcyB0aGlzIGlzIGNhbGxlZCBhZnRlciBwcmVwYXJlVHJhY2tfbCBpbiB0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uCi0gICAgICAgIHRyYWNrLT5jb3B5TWV0YWRhdGFUbyhiYWNrSW5zZXJ0ZXIpOworICAgICAgICAvLyBEbyBub3QgZm9yd2FyZCBtZXRhZGF0YSBmb3IgUGF0Y2hUcmFjayB3aXRoIHVuc3BlY2lmaWVkIHN0cmVhbSB0eXBlCisgICAgICAgIGlmICh0cmFjay0+c3RyZWFtVHlwZSgpICE9IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgdHJhY2stPmNvcHlNZXRhZGF0YVRvKGJhY2tJbnNlcnRlcik7CisgICAgICAgIH0KICAgICB9CiAgICAgc2VuZE1ldGFkYXRhVG9CYWNrZW5kX2wobWV0YWRhdGEpOwogfQpAQCAtMjk2MCw3ICszMDQ2LDcgQEAKICAgICB9CiB9CiAKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCitwcm9kdWN0X3N0cmF0ZWd5X3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICAvLyBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdAogICAgIC8vIGl0IGlzIG1vdmVkIHRvIGNvcnJlY3Qgb3V0cHV0IGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHdoZW4gQTJEUCBpcyBjb25uZWN0ZWQgb3IgZGlzY29ubmVjdGVkCkBAIC0zMjM1LDYgKzMzMjEsMTcgQEAKICAgICBpbnZhbGlkYXRlVHJhY2tzX2woc3RyZWFtVHlwZSk7CiB9CiAKKy8vIGdldFRyYWNrQnlJZF9sIG11c3QgYmUgY2FsbGVkIHdpdGggaG9sZGluZyB0aHJlYWQgbG9jaworQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2sqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFRyYWNrQnlJZF9sKAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHRyYWNrUG9ydElkKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtVHJhY2tzW2ldLT5wb3J0SWQoKSA9PSB0cmFja1BvcnRJZCkgeworICAgICAgICAgICAgcmV0dXJuIG1UcmFja3NbaV0uZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNoYWluLT5zZXNzaW9uSWQoKTsKQEAgLTMzOTcsNyArMzQ5NCw2IEBACiAKICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKICAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRXcml0dGVuID0gLTI7IC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCi0gICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAgICAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0zNDMzLDE0ICszNTI5LDYgQEAKIAogICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKLSAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcyBzaG91bGQgcmVzZXQgZnJhbWUgY291bnQgdG8gemVybyBvbiBzdG9wL2ZsdXNoCi0gICAgLy8gVE9ETzogYWRkIGNvbmZpcm1hdGlvbiBjaGVja3M6Ci0gICAgLy8gMSkgRElSRUNUIHRocmVhZHMgYW5kIGxpbmVhciBQQ00gZm9ybWF0IHJlYWxseSByZXNldHMgdG8gMD8KLSAgICAvLyAyKSBJcyBmcmFtZSBjb3VudCByZWFsbHkgdmFsaWQgaWYgbm90IGxpbmVhciBwY20/Ci0gICAgLy8gMykgQXJlIGFsbCA2NCBiaXRzIG9mIHBvc2l0aW9uIHJldHVybmVkLCBub3QganVzdCBsb3dlc3QgMzIgYml0cz8KLSAgICBpZiAobVR5cGUgPT0gT0ZGTE9BRCB8fCBtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLnNldERpc2NvbnRpbnVpdHlNb2RlKG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfWkVSTyk7Ci0gICAgfQogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKIAogICAgIC8vIGxvb3BDb3VudCBpcyB1c2VkIGZvciBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljcy4KQEAgLTM0ODEsNyArMzU2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgNSBzZWNvbmRzKS4KICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbkxhdGVuY3kgPSAwLiwgbWF4TGF0ZW5jeSA9IDUwMDAuOwogICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zID49IG1pbkxhdGVuY3kgJiYgbGF0ZW5jeU1zIDw9IG1heExhdGVuY3kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZXcgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvdXQgb2YgcmFuZ2UgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgbWluTGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWluTGF0ZW5jeTsKQEAgLTM1MTIsMTM1ICszNjAwLDggQEAKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KLSAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUgotICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORwotICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKLSAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeyAvLyBubyBpbmRlbnRhdGlvbgotICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCi0gICAgICAgICAgICAvLyBhbmQgYXNzb2NpYXRlIHdpdGggdGhlIHNpbmsgZnJhbWVzIHdyaXR0ZW4gb3V0LiAgV2UgbmVlZAotICAgICAgICAgICAgLy8gdGhpcyB0byBjb252ZXJ0IHRoZSBzaW5rIHRpbWVzdGFtcCB0byB0aGUgdHJhY2sgdGltZXN0YW1wLgotICAgICAgICAgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCi0gICAgICAgICAgICBpZiAobVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKCZ0aW1lc3RhbXApID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZCh0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICBjb2xsZWN0VGltZXN0YW1wc19sKCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOwotICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwgaWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogRG93bnN0cmVhbSBsYXRlbmN5IG9ubHkgYWRkZWQgaWYgdGltZXN0YW1wIGNvcnJlY3Rpb24gZW5hYmxlZC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwKSB7IC8vIHdlIGhhdmUgbGF0ZW5jeSBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBuZXdQb3NpdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpbnQ2NF90KG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXRNZWFuKCkgKiBtU2FtcGxlUmF0ZSAqIDFlLTMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCByZXRyb2dyYWRlCi0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gbWF4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU3VzcGVuZGVkRnJhbWVzKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBhbHdheXMgZmV0Y2ggdGhlIHRpbWVzdGFtcCBoZXJlIGJlY2F1c2Ugb2Z0ZW4gdGhlIGRvd25zdHJlYW0KLSAgICAgICAgICAgICAgICAvLyBzaW5rIHdpbGwgYmxvY2sgd2hpbGUgd3JpdGluZy4KLQotICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsaWQga2VybmVsIHBvc2l0aW9uIGluIGNhc2Ugd2UgYXJlIGluIHVuZGVycnVuCi0gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBzb21lIGVycm9yIGZyb20gdGhlIEhBTC4KLSAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxfTEFTVEtFUk5FTE9LXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotCi0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJfTEFTVEtFUk5FTE9LXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl07Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJnZXRUaW1lc3RhbXAgZXJyb3IgLSBubyB2YWxpZCBrZXJuZWwgcG9zaXRpb24iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb3B5IG92ZXIga2VybmVsIGluZm8KLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1TdXNwZW5kZWRGcmFtZXM7IC8vIGFkZCBmcmFtZXMgZGlzY2FyZGVkIHdoZW4gc3VzcGVuZGVkCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbUZyYW1lc1dyaXR0ZW4gZm9yIG5vbi1vZmZsb2FkZWQgdHJhY2tzIGFyZSBjb250aWd1b3VzCi0gICAgICAgICAgICAvLyBldmVuIGFmdGVyIHN0YW5kYnkoKSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdHJhY2sgZnJhbWUKLSAgICAgICAgICAgIC8vIHRvIHNpbmsgZnJhbWUgbWFwcGluZy4KLSAgICAgICAgICAgIGJvb2wgc2VydmVyTG9jYXRpb25VcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVzV3JpdHRlbiAhPSBsYXN0RnJhbWVzV3JpdHRlbikgewotICAgICAgICAgICAgICAgIHNlcnZlckxvY2F0aW9uVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsYXN0RnJhbWVzV3JpdHRlbiA9IG1GcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgdGltZXN0YW1wcyBpZiB0aGVyZSBpcyBhIG1lYW5pbmdmdWwgY2hhbmdlLgotICAgICAgICAgICAgLy8gRWl0aGVyIHRoZSBrZXJuZWwgdGltZXN0YW1wIG11c3QgYmUgdmFsaWQgb3Igd2UgaGF2ZSB3cml0dGVuIHNvbWV0aGluZy4KLSAgICAgICAgICAgIGlmIChrZXJuZWxMb2NhdGlvblVwZGF0ZSB8fCBzZXJ2ZXJMb2NhdGlvblVwZGF0ZSkgewotICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJMb2NhdGlvblVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHRpbWUgYmVmb3JlIHdlIGNhbGxlZCB0aGUgSEFMIHdyaXRlIC0gaXQgaXMgYSBiaXQgbW9yZSBhY2N1cmF0ZQotICAgICAgICAgICAgICAgICAgICAvLyB0byB3aGVuIHRoZSBzZXJ2ZXIgbGFzdCByZWFkIGRhdGEgdGhhbiB0aGUgY3VycmVudCB0aW1lIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RJb0JlZ2luTnMgd2lsbCBiZSAtMQotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgdXNlIHN5c3RlbVRpbWUoKS4KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RJb0JlZ2luTnMgPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0SW9CZWdpbk5zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXQtPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsgLy8gbm90ZSAwLiBtZWFucyB0aW1lc3RhbXAgaXMgZW1wdHkuCi0gICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IC8vIGlmIChtVHlwZSAuLi4gKSB7IC8vIG5vIGluZGVudGF0aW9uCi0jaWYgMAotICAgICAgICAgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKLSAgICAgICAgICAgIGlmICh6ICUgMTAwID09IDApIHsKLSAgICAgICAgICAgICAgICB0aW1lc3BlYyB0czsKLSAgICAgICAgICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKLSAgICAgICAgICAgICAgICBMT0dUKCJUaGlzIGlzIGFuIGludGVnZXIgJWQsIHRoaXMgaXMgYSBmbG9hdCAlZiwgdGhpcyBpcyBteSAiCi0gICAgICAgICAgICAgICAgICAgICJwaWQgJXAgJSUgJXMgJXQiLCA0MiwgMy4xNCwgImFuZCB0aGlzIGlzIGEgdGltZXN0YW1wIiwgdHMpOwotICAgICAgICAgICAgICAgIExPR1QoIkEgZGVjZXB0aXZlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgJVwwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK3o7Ci0jZW5kaWYKICAgICAgICAgICAgIHNhdmVPdXRwdXRUcmFja3MoKTsKICAgICAgICAgICAgIGlmIChtU2lnbmFsUGVuZGluZykgewogICAgICAgICAgICAgICAgIC8vIEEgc2lnbmFsIHdhcyByYWlzZWQgd2hpbGUgd2Ugd2VyZSB1bmxvY2tlZApAQCAtMzczMiw5ICszNjkzLDE1IEBACiAKICAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBzZXNzaW9uIHRvIHBpY2sgdXAgaGFwdGljIGRhdGEuCiAgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSB1bmRlciB0aGUgc2FtZSBsb2NrIGFzIHByZXBhcmVUcmFja3NfbCgpLgorICAgICAgICAgICAgLy8gVGhlIGhhcHRpYyBkYXRhIGZyb20gdGhlIGVmZmVjdCBpcyBhdCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBvbmUgZnJvbSB0cmFjay4KICAgICAgICAgICAgIC8vIFRPRE86IFdyaXRlIGhhcHRpYyBkYXRhIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyIHdoZW4gbWl4aW5nLgogICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwICYmIGVmZmVjdENoYWlucy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGVmZmVjdENoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0Q2hhaW4gIT0gbnVsbHB0ciAmJiBlZmZlY3RDaGFpbi0+Y29udGFpbnNIYXB0aWNHZW5lcmF0aW5nRWZmZWN0X2woKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC00MDgwLDYgKzQwNDcsMTQ4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNvbGxlY3RUaW1lc3RhbXBzX2woKQoreworICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgIGlmIChtVHlwZSAhPSBNSVhFUgorICAgICAgICAgICAgJiYgbVR5cGUgIT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgICYmIG1UeXBlICE9IERJUkVDVAorICAgICAgICAgICAgJiYgbVR5cGUgIT0gT0ZGTE9BRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKG1Id1BhdXNlZCkgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX0NPTlRJTlVPVVMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCisgICAgLy8gYW5kIGFzc29jaWF0ZSB3aXRoIHRoZSBzaW5rIGZyYW1lcyB3cml0dGVuIG91dC4gIFdlIG5lZWQKKyAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCisgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOworICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorCisgICAgLy8gQWx3YXlzIHF1ZXJ5IEhBTCB0aW1lc3RhbXAgYW5kIHVwZGF0ZSB0aW1lc3RhbXAgdmVyaWZpZXIuIEluIHN0YW5kYnkgb3IgcGF1c2UsCisgICAgLy8gSEFMIG1heSBiZSBkcmFpbmluZyBzb21lIHNtYWxsIGR1cmF0aW9uIGJ1ZmZlcmVkIGRhdGEgZm9yIGZhZGUgb3V0LgorICAgIGlmICh0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKCZ0aW1lc3RhbXApID09IE9LKSB7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgQUxPR1ZWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgQUxPR1ZWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgLy8gTm90ZTogRG93bnN0cmVhbSBsYXRlbmN5IG9ubHkgYWRkZWQgaWYgdGltZXN0YW1wIGNvcnJlY3Rpb24gZW5hYmxlZC4KKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtU3VzcGVuZGVkRnJhbWVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBhbHdheXMgZmV0Y2ggdGhlIHRpbWVzdGFtcCBoZXJlIGJlY2F1c2Ugb2Z0ZW4gdGhlIGRvd25zdHJlYW0KKyAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCisKKyAgICAgICAgLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbGFzdCB2YWxpZCBrZXJuZWwgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgaW4gdW5kZXJydW4KKyAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKKyAgICAgICAgLy8gaXMgc29tZSBlcnJvciBmcm9tIHRoZSBIQUwuCisgICAgICAgIGlmIChtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgeworICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworCisgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXTsKKyAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10gPQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl07CisgICAgICAgIH0KKworICAgICAgICBpZiAodGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPj0gMCkgeworICAgICAgICAgICAga2VybmVsTG9jYXRpb25VcGRhdGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1ZWKCJnZXRUaW1lc3RhbXAgZXJyb3IgLSBubyB2YWxpZCBrZXJuZWwgcG9zaXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgb3ZlciBrZXJuZWwgaW5mbworICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKKyAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKKyAgICB9CisKKyAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKKyAgICAvLyBldmVuIGFmdGVyIHN0YW5kYnkoKSBpcyBjYWxsZWQuIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgdHJhY2sgZnJhbWUKKyAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCisgICAgYm9vbCBzZXJ2ZXJMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOworICAgIGlmIChtRnJhbWVzV3JpdHRlbiAhPSBtTGFzdEZyYW1lc1dyaXR0ZW4pIHsKKyAgICAgICAgc2VydmVyTG9jYXRpb25VcGRhdGUgPSB0cnVlOworICAgICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBtRnJhbWVzV3JpdHRlbjsKKyAgICB9CisgICAgLy8gT25seSB1cGRhdGUgdGltZXN0YW1wcyBpZiB0aGVyZSBpcyBhIG1lYW5pbmdmdWwgY2hhbmdlLgorICAgIC8vIEVpdGhlciB0aGUga2VybmVsIHRpbWVzdGFtcCBtdXN0IGJlIHZhbGlkIG9yIHdlIGhhdmUgd3JpdHRlbiBzb21ldGhpbmcuCisgICAgaWYgKGtlcm5lbExvY2F0aW9uVXBkYXRlIHx8IHNlcnZlckxvY2F0aW9uVXBkYXRlKSB7CisgICAgICAgIGlmIChzZXJ2ZXJMb2NhdGlvblVwZGF0ZSkgeworICAgICAgICAgICAgLy8gdXNlIHRoZSB0aW1lIGJlZm9yZSB3ZSBjYWxsZWQgdGhlIEhBTCB3cml0ZSAtIGl0IGlzIGEgYml0IG1vcmUgYWNjdXJhdGUKKyAgICAgICAgICAgIC8vIHRvIHdoZW4gdGhlIHNlcnZlciBsYXN0IHJlYWQgZGF0YSB0aGFuIHRoZSBjdXJyZW50IHRpbWUgaGVyZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0SW9CZWdpbk5zIHdpbGwgYmUgLTEKKyAgICAgICAgICAgIC8vIGFuZCB3ZSB1c2Ugc3lzdGVtVGltZSgpLgorICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtRnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0SW9CZWdpbk5zID09IC0xCisgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RJb0JlZ2luTnM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGlmICghdC0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgICAgIHQtPnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpOworICAgICAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7IC8vIG5vdGUgMC4gbWVhbnMgdGltZXN0YW1wIGlzIGVtcHR5LgorICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfQorICAgIH0KKyNpZiAwCisgICAgLy8gbG9nRm9ybWF0IGV4YW1wbGUKKyAgICBpZiAoeiAlIDEwMCA9PSAwKSB7CisgICAgICAgIHRpbWVzcGVjIHRzOworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICAgICAgTE9HVCgiVGhpcyBpcyBhbiBpbnRlZ2VyICVkLCB0aGlzIGlzIGEgZmxvYXQgJWYsIHRoaXMgaXMgbXkgIgorICAgICAgICAgICAgInBpZCAlcCAlJSAlcyAldCIsIDQyLCAzLjE0LCAiYW5kIHRoaXMgaXMgYSB0aW1lc3RhbXAiLCB0cyk7CisgICAgICAgIExPR1QoIkEgZGVjZXB0aXZlIG51bGwtdGVybWluYXRlZCBzdHJpbmcgJVwwIik7CisgICAgfQorICAgICsrejsKKyNlbmRpZgorfQorCiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKQEAgLTQxMDQsMTMgKzQyMTMsMjAgQEAKICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG91ciB0cmFja3MgdmVjdG9yCiAgICAgICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKLSAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDAgJiYKKyAgICAgICAgICAgICAgICAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGFpbiAhPSBudWxscHRyICYmIGNoYWluLT5jb250YWluc0hhcHRpY0dlbmVyYXRpbmdFZmZlY3RfbCgpKSkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKICAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgogICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcCh0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisKKyAgICAgICAgICAgIC8vIFdoZW4gdGhlIHRyYWNrIGlzIHN0b3AsIHNldCB0aGUgaGFwdGljIGludGVuc2l0eSBhcyBNVVRFCisgICAgICAgICAgICAvLyBmb3IgdGhlIEhhcHRpY0dlbmVyYXRvciBlZmZlY3QuCisgICAgICAgICAgICBpZiAoY2hhaW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNoYWluLT5zZXRIYXB0aWNJbnRlbnNpdHlfbCh0cmFjay0+aWQoKSwgc3RhdGljX2Nhc3Q8aW50Pihvczo6SGFwdGljU2NhbGU6Ok1VVEUpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KQEAgLTQxMjYsMjAgKzQyNDIsMTUgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkgJiYgbU91dHB1dCAhPSBOVUxMKSB7Ci0gICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7Ci0gICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKLSAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKLSAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBjb2xsZWN0VGltZXN0YW1wc19sKCk7CisgICAgICAgIGlmIChtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgIHRpbWVzdGFtcC5tVGltZS50dl9zZWMgPSB0aW1lTnMgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICB0aW1lc3RhbXAubVRpbWUudHZfbnNlYyA9IHRpbWVOcyAtICh0aW1lc3RhbXAubVRpbWUudHZfc2VjICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtNDE5OSw3ICs0MzEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW51bWVyYXRlZCBkZXZpY2UgdHlwZSglI3gpIG11c3Qgbm90IGJlIHVzZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHBhdGNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpOwotICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGUgfCBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgZGV2aWNlVHlwZUFkZHJzLnB1c2hfYmFjayhBdWRpb0RldmljZVR5cGVBZGRyKHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsCiAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgIH0KQEAgLTQ0NDksMTEgKzQ1NjAsMTIgQEAKICAgICAgICAgLy8gd3JhcCB0aGUgc291cmNlIHNpZGUgb2YgdGhlIE1vbm9QaXBlIHRvIG1ha2UgaXQgYW4gQXVkaW9CdWZmZXJQcm92aWRlcgogICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9IG5ldyBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKG5ldyBNb25vUGlwZVJlYWRlcihtb25vUGlwZSkpOwogICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzayk7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXVkaW8gdG8gRmFzdE1peGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IG1Gb3JtYXQ7IC8vIG1QaXBlU2luayBmb3JtYXQgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTk9ORTsKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gb3M6OkhhcHRpY1NjYWxlOjpOT05FOwogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC00NDY0LDcgKzQ1NzYsOCBAQAogICAgICAgICAvLyBzcGVjaWZ5IHNpbmsgY2hhbm5lbCBtYXNrIHdoZW4gaGFwdGljIGNoYW5uZWwgbWFzayBwcmVzZW50IGFzIGl0IGNhbiBub3QKICAgICAgICAgLy8gYmUgY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIGNoYW5uZWwgY291bnQKICAgICAgICAgc3RhdGUtPm1TaW5rQ2hhbm5lbE1hc2sgPSBtSGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9OT05FCi0gICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUgOiBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgPyBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOwogICAgICAgICAvLyBhbHJlYWR5IGRvbmUgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdAogICAgICAgICAvL21GYXN0TWl4ZXJGdXRleCA9IDA7CkBAIC01NTM4LDggKzU2NTEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpCiB7CiAgICAgYm9vbCByZWNvbmZpZyA9IGZhbHNlOwotICAgIGJvb2wgYTJkcERldmljZUNoYW5nZWQgPSBmYWxzZTsKLQogICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgQXV0b1Bhcms8RmFzdE1peGVyPiBwYXJrKG1GYXN0TWl4ZXIpOwpAQCAtNTYxMSw3ICs1NzIyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiByZWNvbmZpZyB8fCBhMmRwRGV2aWNlQ2hhbmdlZDsKKyAgICByZXR1cm4gcmVjb25maWc7CiB9CiAKIApAQCAtNTgxMiw4ICs1OTIzLDE1IEBACiAgICAgICAgIHNwPFRyYWNrPiBsID0gbUFjdGl2ZVRyYWNrcy5nZXRMYXRlc3QoKTsKICAgICAgICAgYm9vbCBsYXN0ID0gbC5nZXQoKSA9PSB0cmFjazsKIAotICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7Ci0gICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CisgICAgICAgIGlmICh0cmFjay0+aXNQYXVzZVBlbmRpbmcoKSkgeworICAgICAgICAgICAgdHJhY2stPnBhdXNlQWNrKCk7CisgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBhIHRyYWNrIG1pZ2h0IGhhdmUgYmVlbiBmbHVzaGVkIG9yIHN0b3BwZWQuCisgICAgICAgICAgICAvLyBPdGhlciBvcGVyYXRpb25zIHN1Y2ggYXMgZmx1c2ggcGVuZGluZyBtaWdodCBvY2N1ciBvbiB0aGUgbmV4dCBwcmVwYXJlLgorICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFsd2F5cyBwZXJmb3JtIHBhdXNlLCBhcyBhbiBpbW1lZGlhdGUgZmx1c2ggd2lsbCBjaGFuZ2UKKyAgICAgICAgICAgIC8vIHRoZSBwYXVzZSBzdGF0ZSB0byBiZSBubyBsb25nZXIgaXNQYXVzaW5nKCkuCiAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiBsYXN0ICYmICFtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CkBAIC01ODM5LDExICs1OTU3LDE5IEBACiAgICAgICAgIC8vIEFsbG93IGRyYWluaW5nIHRoZSBidWZmZXIgaW4gY2FzZSB0aGUgY2xpZW50CiAgICAgICAgIC8vIGFwcCBkb2VzIG5vdCBjYWxsIHN0b3AoKSBhbmQgcmVsaWVzIG9uIHVuZGVycnVuIHRvIHN0b3A6CiAgICAgICAgIC8vIGhlbmNlIHRoZSB0ZXN0IG9uICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKS4KLSAgICAgICAgLy8gSWYgcmV0cnlDb3VudDw9MSB0aGVuIHRyYWNrIGlzIGFib3V0IHRvIHVuZGVycnVuIGFuZCBiZSByZW1vdmVkLgorICAgICAgICAvLyBJZiB0cmFjay0+bVJldHJ5Q291bnQgPD0gMSB0aGVuIHRyYWNrIGlzIGFib3V0IHRvIGJlIGRpc2FibGVkLCBwYXVzZWQsIHJlbW92ZWQsCisgICAgICAgIC8vIHNvIHdlIGFjY2VwdCBhbnkgbm9uemVybyBhbW91bnQgb2YgZGF0YSBkZWxpdmVyZWQgYnkgdGhlIEF1ZGlvVHJhY2sgKHdoaWNoIHdpbGwKKyAgICAgICAgLy8gcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIpLgogICAgICAgICAvLyBEbyBub3QgdXNlIGEgaGlnaCB0aHJlc2hvbGQgZm9yIGNvbXByZXNzZWQgYXVkaW8uCisKKyAgICAgICAgLy8gdGFyZ2V0IHJldHJ5IGNvdW50IHRoYXQgd2Ugd2lsbCB1c2UgaXMgYmFzZWQgb24gdGhlIHRpbWUgd2Ugd2FpdCBmb3IgcmV0cmllcy4KKyAgICAgICAgY29uc3QgaW50MzJfdCB0YXJnZXRSZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc0RpcmVjdE1zICogMTAwMCAvIG1BY3RpdmVTbGVlcFRpbWVVczsKKyAgICAgICAgLy8gdGhlIHJldHJ5IHRocmVzaG9sZCBpcyB3aGVuIHdlIGFjY2VwdCBhbnkgc2l6ZSBmb3IgUENNIGRhdGEuICBUaGlzIGlzIHNsaWdodGx5CisgICAgICAgIC8vIHNtYWxsZXIgdGhhbiB0aGUgcmV0cnkgY291bnQgc28gd2UgY2FuIHB1c2ggc21hbGwgYml0cyBvZiBkYXRhIHdpdGhvdXQgYSBnbGl0Y2guCisgICAgICAgIGNvbnN0IGludDMyX3QgcmV0cnlUaHJlc2hvbGQgPSB0YXJnZXRSZXRyeUNvdW50ID4gMiA/IHRhcmdldFJldHJ5Q291bnQgLSAxIDogMTsKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzOwogICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSA9PSAwKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMSgpICYmICF0cmFjay0+aXNQYXVzaW5nKCkKLSAgICAgICAgICAgICYmICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKSAmJiBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgJiYgKHRyYWNrLT5tUmV0cnlDb3VudCA+IHJldHJ5VGhyZXNob2xkKSAmJiBhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgewogICAgICAgICAgICAgbWluRnJhbWVzID0gbU5vcm1hbEZyYW1lQ291bnQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwpAQCAtNTg4Nyw3ICs2MDEzLDcgQEAKICAgICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjayA9IHRyYWNrOwogCiAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKLSAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0OworICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IHRhcmdldFJldHJ5Q291bnQ7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrID0gdDsKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKICAgICAgICAgICAgICAgICBpZiAobUh3UGF1c2VkKSB7CkBAIC01OTEyLDE2ICs2MDM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBpbmdfMigpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUgdHJhY2tzLgotICAgICAgICAgICAgICAgIHNpemVfdCBhdWRpb0hBTEZyYW1lczsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeV9sKCkgKiBtU2FtcGxlUmF0ZSkgLyAxMDAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvSEFMRnJhbWVzID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShsYXRlbmN5X2woKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1BhdXNlZCgpIHx8IG1Id1BhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwpAQCAtNTk0MSwxNSArNjA1OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmRpc2FibGUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSBkbyBodyBwYXVzZSB3aGVuIHRyYWNrIGlzIGdvaW5nIHRvIGJlIHJlbW92ZWQgZHVlIHRvIEJVRkZFUiBUSU1FT1VULgorICAgICAgICAgICAgICAgICAgICAvLyB1bmxpa2UgbWl4ZXJ0aHJlYWQsIEhBTCBjYW4gYmUgcGF1c2VkIGZvciBkaXJlY3Qgb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkeSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkICYmICFtU3RhbmRieSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYwMjEsMTYgKzYxNDEsMTMgQEAKICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKLSAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewotICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwICYmIGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7Ci0gICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CisgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1BY3RpdmVTbGVlcFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgIH0KKyAgICAvLyBOb3RlOiBJbiBTIG9yIGxhdGVyLCB3ZSBkbyBub3Qgd3JpdGUgemVyb2VzIGZvcgorICAgIC8vIGxpbmVhciBvciBwcm9wb3J0aW9uYWwgUENNIGRpcmVjdCB0cmFja3MgaW4gdW5kZXJydW4uCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnRocmVhZExvb3BfZXhpdCgpCkBAIC02MDcyLDggKzYxODksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewogICAgIGJvb2wgcmVjb25maWcgPSBmYWxzZTsKLSAgICBib29sIGEyZHBEZXZpY2VDaGFuZ2VkID0gZmFsc2U7Ci0KICAgICBzdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlyKTsKQEAgLTYxMDgsNyArNjIyMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gcmVjb25maWcgfHwgYTJkcERldmljZUNoYW5nZWQ7CisgICAgcmV0dXJuIHJlY29uZmlnOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6YWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdApAQCAtNjE2NSw3ICs2MjgwLDcgQEAKICAgICBtT3V0cHV0LT5mbHVzaCgpOwogICAgIG1Id1BhdXNlZCA9IGZhbHNlOwogICAgIG1GbHVzaFBlbmRpbmcgPSBmYWxzZTsKLSAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOyAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBmbHVzaCByZXNldHMgZnJhbWUgY291bnQuCisgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoZGlzY29udGludWl0eUZvclN0YW5kYnlPckZsdXNoKCkpOwogICAgIG1UaW1lc3RhbXAuY2xlYXIoKTsKIH0KIApAQCAtNjM1Nyw4ICs2NDcyLDE1IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkpIHsKLSAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKKyAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNlUGVuZGluZygpKSB7CisgICAgICAgICAgICB0cmFjay0+cGF1c2VBY2soKTsKKyAgICAgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIGEgdHJhY2sgbWlnaHQgaGF2ZSBiZWVuIGZsdXNoZWQgb3Igc3RvcHBlZC4KKyAgICAgICAgICAgIC8vIE90aGVyIG9wZXJhdGlvbnMgc3VjaCBhcyBmbHVzaCBwZW5kaW5nIG1pZ2h0IG9jY3VyIG9uIHRoZSBuZXh0IHByZXBhcmUuCisgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWx3YXlzIHBlcmZvcm0gcGF1c2UgaWYgbGFzdCwgYXMgYW4gaW1tZWRpYXRlIGZsdXNoIHdpbGwgY2hhbmdlCisgICAgICAgICAgICAvLyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgbm8gbG9uZ2VyIGlzUGF1c2luZygpLgogICAgICAgICAgICAgaWYgKGxhc3QpIHsKICAgICAgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbUh3UGF1c2VkKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CkBAIC02NDkxLDIzICs2NjEzLDE3IEBACiAgICAgICAgICAgICAgICAgLy8gRHJhaW4gaGFzIGNvbXBsZXRlZCBvciB3ZSBhcmUgaW4gc3RhbmRieSwgc2lnbmFsIHByZXNlbnRhdGlvbiBjb21wbGV0ZQogICAgICAgICAgICAgICAgIGlmICghKG1EcmFpblNlcXVlbmNlICYgMSkgfHwgIWxhc3QgfHwgbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBFRDsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0TGF0ZW5jeSgmbGF0ZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiByZXRyaWV2aW5nIG91dHB1dCBzdHJlYW0gbGF0ZW5jeTogJWQiLCByZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPSAobGF0ZW5jeSAqIG1TYW1wbGVSYXRlKSAvIDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiAvIG1PdXRwdXQtPmdldEZyYW1lU2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUobGF0ZW5jeV9sKCkpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgLy8gT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC02NzU1LDEzICs2ODcxLDIwIEBACiAgICAgLy8gZnJvbSBkaWZmZXJlbnQgT3V0cHV0VHJhY2tzIGFuZCB0aGVpciBhc3NvY2lhdGVkIE1peGVyVGhyZWFkcyAoZS5nLiBvbmUgbWF5CiAgICAgLy8gbmVhcmx5IGVtcHR5IGFuZCB0aGUgb3RoZXIgbWF5IGJlIGRyb3BwaW5nIGRhdGEpLgogCisgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsLCBtb3ZlIHRvIHNlcnZlciBlZGdlCisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZSA9IEF0dHJpYnV0aW9uU291cmNlU3RhdGUoKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KAorICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KAorICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOwogICAgIHNwPE91dHB1dFRyYWNrPiBvdXRwdXRUcmFjayA9IG5ldyBPdXRwdXRUcmFjayh0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXRUcmFjayAhPSAwID8gb3V0cHV0VHJhY2stPmluaXRDaGVjaygpIDogKHN0YXR1c190KSBOT19NRU1PUlk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiYWRkT3V0cHV0VHJhY2soKSBpbml0Q2hlY2sgZmFpbGVkICVkIiwgc3RhdHVzKTsKQEAgLTY4ODEsNyArNzAwNCw3IEBACiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKLSAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKKyAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAogICAgICAgICAgICAgICAgIG1JbnB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOwogICAgIH0KQEAgLTcxNzYsMTkgKzcyOTksMjkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gICAgdGhlIG9ubHkgYWN0aXZlIHRyYWNrCiAgICAgICAgICAgICAgICAgICAgIC8vIDIpIGludmFsaWRhdGUgdGhpcyB0cmFjazogdGhpcyB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gcmVjb25uZWN0IGFuZCBwb3NzaWJseQogICAgICAgICAgICAgICAgICAgICAvLyAgICBiZSBpbnZhbGlkYXRlZCBhZ2FpbiB1bnRpbCB1bnNpbGVuY2VkCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaW52YWxpZGF0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzU2lsZW5jZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2tUb1JlbW92ZSA9PSAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2tUb1JlbW92ZSA9IGFjdGl2ZVRyYWNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2woYWN0aXZlVHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVuY2VGYXN0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBmYXN0IHRyYWNrcyBpZiBhY2Nlc3MgdG8gYXVkaW8gaGlzdG9yeSBpcyByZXF1aXJlZCBhcyB0aGlzIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSB3aXRoIGZhc3QgdHJhY2tzLiBPbmNlIHRoZSBmYXN0IHRyYWNrIGhhcyBiZWVuIGludmFsaWRhdGVkLCBubyBuZXcKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFzdCB0cmFjayB3aWxsIGJlIGNyZWF0ZWQgdW50aWwgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zIGlzIGNsZWFyZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGludmFsaWRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChmYXN0VHJhY2tUb1JlbW92ZSA9PSAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFja1RvUmVtb3ZlID0gYWN0aXZlVHJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVUcmFja19sKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjayA9IGFjdGl2ZVRyYWNrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzMxMiw3ICs3NDQ1LDcgQEAKIAogICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQgPSBtUGlwZVNvdXJjZS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBtYXN0ZXIgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCisgICAgICAgICAgICAgICAgLy8gUGlwZVNvdXJjZSBpcyB0aGUgcHJpbWFyeSBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpYXZhaWxhYmxlVG9SZWFkID4gbVBpcGVGcmFtZXNQMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIGZyYW1lcyB0byByZWFkIHRoYW4gZmlmbyBzaXplLCAlemQgPiAlenUiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVG9SZWFkLCBtUGlwZUZyYW1lc1AyKTsKQEAgLTczNjUsNyArNzQ5OCw5IEBACiAgICAgICAgIGlmIChtUGlwZVNvdXJjZS5nZXQoKSA9PSBudWxscHRyIC8qIGRvbid0IG9idGFpbiBmb3IgRmFzdENhcHR1cmUsIGNvdWxkIGJsb2NrICovKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uLCB0aW1lOwogICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eShhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpID8KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9DT05USU5VT1VTIDoKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLkRJU0NPTlRJTlVJVFlfTU9ERV9aRVJPKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNvdXJjZS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpID09IE5PX0VSUk9SCiAgICAgICAgICAgICAgICAgICAgICYmIHRpbWUgPiBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pIHsKIApAQCAtNzM3MywxMiArNzUwOCwxMiBAQAogCiAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCiAgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CiAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NDI4LDcgKzc1NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lc1JlYWQgLSBwYXJ0MSkgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZWFyID0gbVJzbXBJblJlYXIgKz0gZnJhbWVzUmVhZDsKKyAgICAgICAgbVJzbXBJblJlYXIgPSBhdWRpb191dGlsczo6c2FmZV9hZGRfb3ZlcmZsb3cobVJzbXBJblJlYXIsIChpbnQzMl90KWZyYW1lc1JlYWQpOwogCiAgICAgICAgIHNpemUgPSBhY3RpdmVUcmFja3Muc2l6ZSgpOwogCkBAIC03NjczLDEyICs3ODA4LDEyIEBACiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHNpemVfdCAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCiAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCi0gICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKKyAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcykKIHsKICAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudDsKQEAgLTc2ODcsNiArNzgyMiw4IEBACiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBpbnB1dEZsYWdzID0gbUlucHV0LT5mbGFnczsKICAgICBhdWRpb19pbnB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOwogICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBjaGVja2VkQXR0cmlidXRpb25Tb3VyY2UgPSBBdWRpb0ZsaW5nZXI6OmNoZWNrQXR0cmlidXRpb25Tb3VyY2VQYWNrYWdlKAorICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UpOwogCiAgICAgbFN0YXR1cyA9IGluaXRDaGVjaygpOwogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC03NzAwLDEzICs3ODM3LDI1IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICBpZiAobWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgIT0gMCkgeworICAgICAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChjaGVja2VkQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zIDwgMAorICAgICAgICAgICAgICAgIHx8IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zID4gQXVkaW9GbGluZ2VyOjprTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpIHsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICB9CiAgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KICAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCi0gICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudAotICAgIGlmIChoYXNGYXN0Q2FwdHVyZSgpKSB7CisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IGNhcHR1cmUgaXMgcHJlc2VudCBhbmQgYWNjZXNzIHRvCisgICAgLy8gYXVkaW8gaGlzdG9yeSBpcyBub3QgcmVxdWlyZWQKKyAgICBpZiAoaGFzRmFzdENhcHR1cmUoKSAmJiBtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPT0gMCkgewogICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGlucHV0RmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0ZBU1QpOwogICAgIH0KIApAQCAtNzcxOCw4ICs3ODY3LDkgQEAKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKCpmbGFncyAmIGlucHV0RmxhZ3MpOwogICAgIH0KIAotICAgIC8vIGNsaWVudCBleHByZXNzZXMgYSBwcmVmZXJlbmNlIGZvciBGQVNULCBidXQgd2UgZ2V0IHRoZSBmaW5hbCBzYXkKLSAgICBpZiAoKmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CisgICAgLy8gY2xpZW50IGV4cHJlc3NlcyBhIHByZWZlcmVuY2UgZm9yIEZBU1QgYW5kIG5vIGFjY2VzcyB0byBhdWRpbyBoaXN0b3J5LAorICAgIC8vIGJ1dCB3ZSBnZXQgdGhlIGZpbmFsIHNheQorICAgIGlmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QgJiYgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgPT0gMCkgewogICAgICAgaWYgKAogICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAogICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBUUkFOU0ZFUl9PQlRBSU4gbW9kZQpAQCAtNzgwOCwxMSArNzk1OCwxOSBAQAogCiAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaW50MzJfdCBzdGFydEZyYW1lcyA9IC0xOworICAgICAgICBpZiAoIW1TaGFyZWRBdWRpb1BhY2thZ2VOYW1lLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9PSBjaGVja2VkQXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUKKyAgICAgICAgICAgICAgICAmJiBtU2hhcmVkQXVkaW9TZXNzaW9uSWQgPT0gc2Vzc2lvbklkCisgICAgICAgICAgICAgICAgJiYgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNoZWNrZWRBdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgIHN0YXJ0RnJhbWVzID0gbVNoYXJlZEF1ZGlvU3RhcnRGcmFtZXM7CisgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIG9wUGFja2FnZU5hbWUsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsCisgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZEF0dHJpYnV0aW9uU291cmNlLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnRGcmFtZXMpOwogCiAgICAgICAgIGxTdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC03ODI4LDYgKzc5ODYsMTAgQEAKICAgICAgICAgICAgIC8vIHNvIGFzayBhY3Rpdml0eSBtYW5hZ2VyIHRvIGRvIHRoaXMgb24gb3VyIGJlaGFsZgogICAgICAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKGNhbGxpbmdQaWQsIHRpZCwga1ByaW9yaXR5QXVkaW9BcHAsIHRydWUgLypmb3JBcHAqLyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAobWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMgIT0gMCkgeworICAgICAgICAgICAgc2VuZFJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50X2wobWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgbFN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtNzg2OSw3ICs4MDMxLDggQEAKICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CiAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgQUxPR1coIiVzIHRyYWNrICVkOiBpbnZhbGlkYXRlZCBiZWZvcmUgc3RhcnRJbnB1dCIsIF9fZnVuY19fLCByZWNvcmRUcmFjay0+cG9ydElkKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spID49IDApIHsKICAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORykgewpAQCAtNzg5OSw3ICs4MDYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgICAgICAgICAgICAgLy8gU1RBUlRJTkdfMiBmb3JjZXMgZGVzdHJveSB0byBjYWxsIHN0b3BJbnB1dC4KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyB0cmFjayAlZDogaW52YWxpZGF0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCIsIF9fZnVuY19fLCByZWNvcmRUcmFjay0+cG9ydElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVN0YXRlICE9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHVuc3luY2hyb25pemVkIG1TdGF0ZTolZCBjaGFuZ2UiLApAQCAtODAxOCw2ICs4MTgyLDkgQEAKIHsKICAgICBBTE9HVigiUmVjb3JkVGhyZWFkOjpnZXRBY3RpdmVNaWNyb3Bob25lcyIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgaWYgKCFpc1N0cmVhbUluaXRpYWxpemVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1JbnB1dC0+c3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTgwMjcsNiArODE5NCw5IEBACiB7CiAgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIGlmICghaXNTdHJlYW1Jbml0aWFsaXplZCgpKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KICAgICByZXR1cm4gbUlucHV0LT5zdHJlYW0tPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKIH0KIApAQCAtODAzNCwyMiArODIwNCw4NiBAQAogewogICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CiAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICBpZiAoIWlzU3RyZWFtSW5pdGlhbGl6ZWQoKSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzaGFyZUF1ZGlvSGlzdG9yeSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsIGF1ZGlvX3Nlc3Npb25fdCBzaGFyZWRTZXNzaW9uSWQsCisgICAgICAgIGludDY0X3Qgc2hhcmVkQXVkaW9TdGFydE1zKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gc2hhcmVBdWRpb0hpc3RvcnlfbChzaGFyZWRBdWRpb1BhY2thZ2VOYW1lLCBzaGFyZWRTZXNzaW9uSWQsIHNoYXJlZEF1ZGlvU3RhcnRNcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzaGFyZUF1ZGlvSGlzdG9yeV9sKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmVkQXVkaW9QYWNrYWdlTmFtZSwgYXVkaW9fc2Vzc2lvbl90IHNoYXJlZFNlc3Npb25JZCwKKyAgICAgICAgaW50NjRfdCBzaGFyZWRBdWRpb1N0YXJ0TXMpIHsKKworICAgIGlmICgoaGFzQXVkaW9TZXNzaW9uX2woc2hhcmVkU2Vzc2lvbklkKSAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc2hhcmVkQXVkaW9TdGFydE1zIDwgMAorICAgICAgICB8fCBzaGFyZWRBdWRpb1N0YXJ0TXMgPiBJTlQ2NF9NQVggLyBtU2FtcGxlUmF0ZSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGlucHV0IHJlc2FtcGxpbmcgYnVmZmVyIHdyYXBzIGFyb3VuZCBpbmRleGVzIGF0IDMyIGJpdC4KKyAgICAvLyBBcyB3ZSBjYW5ub3QgZGV0ZWN0IG1vcmUgdGhhbiBvbmUgd3JhcGFyb3VuZCwgb25seSBhY2NlcHQgdmFsdWVzIHVwIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24KKyAgICAvLyBhZnRlciBvbmUgd3JhcGFyb3VuZAorICAgIC8vIFdlIGFzc3VtZSByZWNlbnQgd3JhcGFyb3VuZHMgb24gbVJzbXBJblJlYXIgb25seSBnaXZlbiBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSByZXF1ZXN0aW5nCisgICAgLy8gYXBwIHdhaXRzIHNldmVyYWwgaG91cnMgYWZ0ZXIgdGhlIHN0YXJ0IHRpbWUgd2FzIGNvbXB1dGVkLgorICAgIGludDY0X3Qgc2hhcmVkQXVkaW9TdGFydEZyYW1lcyA9IHNoYXJlZEF1ZGlvU3RhcnRNcyAqIG1TYW1wbGVSYXRlIC8gMTAwMDsKKyAgICBjb25zdCBpbnQzMl90IHNoYXJlZE9mZnNldCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhtUnNtcEluUmVhciwKKyAgICAgICAgICAoaW50MzJfdClzaGFyZWRBdWRpb1N0YXJ0RnJhbWVzKTsKKyAgICAvLyBCcmluZyB0aGUgc3RhcnQgZnJhbWUgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBidWZmZXIgdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQKKyAgICAvLyAiYmVzdCBlZmZvcnQiIGJlaGF2aW9yIG9mIHRoZSBBUEkuCisgICAgaWYgKHNoYXJlZE9mZnNldCA8IDApIHsKKyAgICAgICAgc2hhcmVkQXVkaW9TdGFydEZyYW1lcyA9IG1Sc21wSW5SZWFyOworICAgIH0gZWxzZSBpZiAoc2hhcmVkT2Zmc2V0ID4gbVJzbXBJbkZyYW1lcykgeworICAgICAgICBzaGFyZWRBdWRpb1N0YXJ0RnJhbWVzID0KKyAgICAgICAgICAgICAgICBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cobVJzbXBJblJlYXIsIChpbnQzMl90KW1Sc21wSW5GcmFtZXMpOworICAgIH0KKworICAgIG1TaGFyZWRBdWRpb1BhY2thZ2VOYW1lID0gc2hhcmVkQXVkaW9QYWNrYWdlTmFtZTsKKyAgICBpZiAobVNoYXJlZEF1ZGlvUGFja2FnZU5hbWUuZW1wdHkoKSkgeworICAgICAgICByZXNldEF1ZGlvSGlzdG9yeV9sKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNoYXJlZEF1ZGlvU2Vzc2lvbklkID0gc2hhcmVkU2Vzc2lvbklkOworICAgICAgICBtU2hhcmVkQXVkaW9TdGFydEZyYW1lcyA9IChpbnQzMl90KXNoYXJlZEF1ZGlvU3RhcnRGcmFtZXM7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVzZXRBdWRpb0hpc3RvcnlfbCgpIHsKKyAgICBtU2hhcmVkQXVkaW9TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX05PTkU7CisgICAgbVNoYXJlZEF1ZGlvU3RhcnRGcmFtZXMgPSAtMTsKKyAgICBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9ICIiOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKLSAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fAotICAgICAgICAgICAgIW1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzU3RyZWFtSW5pdGlhbGl6ZWQoKSB8fCAhbUFjdGl2ZVRyYWNrcy5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCiAgICAgfQogICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgZm9yIChjb25zdCBzcDxSZWNvcmRUcmFjaz4gJnRyYWNrIDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAvLyBEbyBub3QgZm9yd2FyZCBQYXRjaFJlY29yZCBtZXRhZGF0YSB0byBhdWRpbyBIQUwKKyAgICAgICAgaWYgKHRyYWNrLT5pc1BhdGNoVHJhY2soKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgLy8gTm8gdHJhY2sgaXMgaW52YWxpZCBhcyB0aGlzIGlzIGNhbGxlZCBhZnRlciBwcmVwYXJlVHJhY2tfbCBpbiB0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uCi0gICAgICAgIG1ldGFkYXRhLnRyYWNrcy5wdXNoX2JhY2soeworICAgICAgICByZWNvcmRfdHJhY2tfbWV0YWRhdGFfdjdfdCB0cmFja01ldGFkYXRhOworICAgICAgICB0cmFja01ldGFkYXRhLmJhc2UgPSB7CiAgICAgICAgICAgICAgICAgLnNvdXJjZSA9IHRyYWNrLT5hdHRyaWJ1dGVzKCkuc291cmNlLAogICAgICAgICAgICAgICAgIC5nYWluID0gMSwgLy8gY2FwdHVyZSB0cmFja3MgZG8gbm90IGhhdmUgdm9sdW1lcwotICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS5jaGFubmVsX21hc2sgPSB0cmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgc3RybmNweSh0cmFja01ldGFkYXRhLnRhZ3MsIHRyYWNrLT5hdHRyaWJ1dGVzKCkudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKKworICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHRyYWNrTWV0YWRhdGEpOwogICAgIH0KICAgICBtSW5wdXQtPnN0cmVhbS0+dXBkYXRlU2lua01ldGFkYXRhKG1ldGFkYXRhKTsKIH0KQEAgLTgwNTksNiArODI5Myw3IEBACiB7CiAgICAgdHJhY2stPnRlcm1pbmF0ZSgpOwogICAgIHRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQRUQ7CisKICAgICAvLyBhY3RpdmUgdHJhY2tzIGFyZSByZW1vdmVkIGJ5IHRocmVhZExvb3AoKQogICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewogICAgICAgICByZW1vdmVUcmFja19sKHRyYWNrKTsKQEAgLTgxNjYsOCArODQwMSwyMyBAQAogewogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtUmVjb3JkVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOwogICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOwotICAgIG1Sc21wSW5Gcm9udCA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CiAgICAgbVJzbXBJblVucmVsID0gMDsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOworICAgIHNzaXplX3QgZGVsdGFGcmFtZXMgPSAwOworICAgIGlmIChtUmVjb3JkVHJhY2stPnN0YXJ0RnJhbWVzKCkgPj0gMCkgeworICAgICAgICBpbnQzMl90IHN0YXJ0RnJhbWVzID0gbVJlY29yZFRyYWNrLT5zdGFydEZyYW1lcygpOworICAgICAgICAvLyBBY2NlcHQgYSByZWNlbnQgd3JhcGFyb3VuZCBvZiBtUnNtcEluUmVhcgorICAgICAgICBpZiAoc3RhcnRGcmFtZXMgPD0gcmVhcikgeworICAgICAgICAgICAgZGVsdGFGcmFtZXMgPSByZWFyIC0gc3RhcnRGcmFtZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWx0YUZyYW1lcyA9IChpbnQzMl90KSgoaW50NjRfdClyZWFyICsgVUlOVDMyX01BWCArIDEgLSBzdGFydEZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhcnQgZnJhbWUgY2Fubm90IGJlIGZ1cnRoZXIgaW4gdGhlIHBhc3QgdGhhbiBzdGFydCBvZiByZXNhbXBsaW5nIGJ1ZmZlcgorICAgICAgICBpZiAoKHNpemVfdCkgZGVsdGFGcmFtZXMgPiByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXMpIHsKKyAgICAgICAgICAgIGRlbHRhRnJhbWVzID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzOworICAgICAgICB9CisgICAgfQorICAgIG1Sc21wSW5Gcm9udCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBzdGF0aWNfY2FzdDxpbnQzMl90PihkZWx0YUZyYW1lcykpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6c3luYygKQEAgLTgyMjEsNiArODQ3MSw3IEBACiAgICAgLy8gRklYTUUgaWYgY2xpZW50IG5vdCBrZWVwaW5nIHVwLCBkaXNjYXJkCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXMpKTsKICAgICAvLyAnZmlsbGVkJyBtYXkgYmUgbm9uLWNvbnRpZ3VvdXMsIHNvIHJldHVybiBvbmx5IHRoZSBmaXJzdCBjb250aWd1b3VzIGNodW5rCisKICAgICBmcm9udCAmPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXNQMiAtIDE7CiAgICAgc2l6ZV90IHBhcnQxID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzUDIgLSBmcm9udDsKICAgICBpZiAocGFydDEgPiAoc2l6ZV90KSBmaWxsZWQpIHsKQEAgLTgzMTcsNyArODU2OCw3IEBACiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUikgewogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrID0gKGF1ZGlvX2NoYW5uZWxfbWFza190KSB2YWx1ZTsKICAgICAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKG1hc2spIHx8Ci0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobWFzaykgPiBGQ0NfOCkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1hc2spID4gRkNDX0xJTUlUKSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1hc2s7CkBAIC04MzUwLDEzICs4NjAxLDExIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHJlY29uZmlnKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNSYXRlOwotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0LT5zdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygmc1JhdGUsICZjaGFubmVsTWFzaywgJmZvcm1hdCkgPT0gT0sgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKHJlcUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHNSYXRlIDw9IChBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBzYW1wbGluZ1JhdGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgPD0gRkNDXzgpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgICAgIGlmIChtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZjb25maWcpID09IE9LICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy5mb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20ocmVxRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlIDw9IChBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBzYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWcuY2hhbm5lbF9tYXNrKSA8PSBGQ0NfTElNSVQpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtODQxOCwxMCArODY2NywxMCBAQAogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOwogICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCi0gICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DaGFubmVsQ291bnQgPiBGQ0NfTElNSVQsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50LCBGQ0NfTElNSVQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfTElNSVQgY2hhbm5lbHMgaW4gZW5jb2RlZCBzdHJlYW1zLgogICAgICAgICBBTE9HSSgiSEFMIGZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBtRm9ybWF0KTsKICAgICB9CiAgICAgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPmdldEZyYW1lU2l6ZSgmbUZyYW1lU2l6ZSk7CkBAIC04NDM0LDMxICs4NjgzLDEwIEBACiAgICAgQUxPR1YoIiVwIFJlY29yZFRocmVhZCBwYXJhbXM6IG1DaGFubmVsQ291bnQ9JXUsIG1Gb3JtYXQ9JSN4LCBtRnJhbWVTaXplPSV6dSwgIgogICAgICAgICAgICAgIm1CdWZmZXJTaXplPSV6dSwgbUZyYW1lQ291bnQ9JXp1IiwKICAgICAgICAgICAgIHRoaXMsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQsIG1GcmFtZVNpemUsIG1CdWZmZXJTaXplLCBtRnJhbWVDb3VudCk7Ci0gICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KLSAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCi0gICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgotICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KLSAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKLSAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KLSAgICAvLwotICAgIC8vIE5vdGUgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbWF4aW11bSBkb3duc2FtcGxpbmcgcmF0aW8gcGVybWl0dGVkIGZvciBjYXB0dXJlLgotICAgIG1Sc21wSW5GcmFtZXMgPSBtRnJhbWVDb3VudCAqIDc7Ci0gICAgbVJzbXBJbkZyYW1lc1AyID0gcm91bmR1cChtUnNtcEluRnJhbWVzKTsKLSAgICBmcmVlKG1Sc21wSW5CdWZmZXIpOwotICAgIG1Sc21wSW5CdWZmZXIgPSBOVUxMOwogCi0gICAgLy8gVE9ETyBvcHRpbWl6ZSBhdWRpbyBjYXB0dXJlIGJ1ZmZlciBzaXplcyAuLi4KLSAgICAvLyBIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc2xpZGluZyBidWZmZXIgdXNlZCBhcyBhIHNvdXJjZQotICAgIC8vIGZvciByZXNhbXBsaW5nLiAgbVJzbXBJbkZyYW1lc1AyIGlzIGN1cnJlbnRseSByb3VuZHVwKG1GcmFtZUNvdW50ICogNykuCi0gICAgLy8gRm9yIGN1cnJlbnQgSEFMIGZyYW1lIGNvdW50cywgdGhpcyBpcyB1c3VhbGx5IDIwNDggPSA0MCBtcy4gIEl0IHdvdWxkCi0gICAgLy8gYmUgYmV0dGVyIHRvIGhhdmUgaXQgZGVyaXZlZCBmcm9tIHRoZSBwaXBlIGRlcHRoIGluIHRoZSBsb25nIHRlcm0uCi0gICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgaGlnaGVyIHRoYW4gbmVjZXNzYXJ5LiAgSG93ZXZlciBpdCBzaG91bGQgbm90IGFkZCB0byBsYXRlbmN5LgotCi0gICAgLy8gT3Zlci1hbGxvY2F0ZSBiZXlvbmQgbVJzbXBJbkZyYW1lc1AyIHRvIHBlcm1pdCBhIEhBTCByZWFkIHBhc3QgZW5kIG9mIGJ1ZmZlcgotICAgIG1Sc21wSW5GcmFtZXNPQSA9IG1Sc21wSW5GcmFtZXNQMiArIG1GcmFtZUNvdW50IC0gMTsKLSAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVJzbXBJbkJ1ZmZlciwgMzIsIG1Sc21wSW5GcmFtZXNPQSAqIG1GcmFtZVNpemUpOwotICAgIC8vIGlmIHBvc2l4X21lbWFsaWduIGZhaWxzLCB3aWxsIHNlZ3YgaGVyZS4KLSAgICBtZW1zZXQobVJzbXBJbkJ1ZmZlciwgMCwgbVJzbXBJbkZyYW1lc09BICogbUZyYW1lU2l6ZSk7CisgICAgLy8gbVJzbXBJbkZyYW1lcyBtdXN0IGJlIDAgYmVmb3JlIGNhbGxpbmcgcmVzaXplSW5wdXRCdWZmZXJfbCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBtUnNtcEluRnJhbWVzID0gMDsKKyAgICByZXNpemVJbnB1dEJ1ZmZlcl9sKDAgLyptYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyovKTsKIAogICAgIC8vIEF1ZGlvUmVjb3JkIG1TYW1wbGVSYXRlIGFuZCBtQ2hhbm5lbENvdW50IGFyZSBjb25zdGFudCBkdWUgdG8gQXVkaW9SZWNvcmQgQVBJIGNvbnN0cmFpbnRzLgogICAgIC8vIEJ1dCBpZiB0aHJlYWQncyBtU2FtcGxlUmF0ZSBvciBtQ2hhbm5lbENvdW50IGNoYW5nZXMsIGhvdyB3aWxsIHRoYXQgYWZmZWN0IGFjdGl2ZSB0cmFja3M/CkBAIC04NTU0LDcgKzg3ODIsNyBAQAogCiAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCiAgICAgbUluRGV2aWNlVHlwZUFkZHIubVR5cGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7Ci0gICAgbUluRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgbUluRGV2aWNlVHlwZUFkZHIuc2V0QWRkcmVzcyhwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBwYXRjaC0+c291cmNlc1swXS5pZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0SW5wdXREZXZpY2VfbChpbkRldmljZVR5cGVBZGRyKCkpOwpAQCAtODYzMyw2ICs4ODYxLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dXBkYXRlT3V0RGV2aWNlcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1PdXREZXZpY2VzID0gb3V0RGV2aWNlczsKICAgICBtT3V0RGV2aWNlVHlwZUFkZHJzID0gZGV2aWNlVHlwZUFkZHJzRnJvbURlc2NyaXB0b3JzKG1PdXREZXZpY2VzKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTg2NDAsNiArODg2OSwxMzMgQEAKICAgICB9CiB9CiAKK2ludDMyX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmdldE9sZGVzdEZyb250X2woKQoreworICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBtUnNtcEluUmVhcjsKKyAgICB9CisgICAgaW50MzJfdCBvbGRlc3RGcm9udCA9IG1Sc21wSW5SZWFyOworICAgIGludDMyX3QgbWF4RmlsbGVkID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBmcm9udCA9IG1UcmFja3NbaV0tPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+Z2V0RnJvbnQoKTsKKyAgICAgICAgaW50MzJfdCBmaWxsZWQ7CisgICAgICAgICh2b2lkKV9fYnVpbHRpbl9zdWJfb3ZlcmZsb3cobVJzbXBJblJlYXIsIGZyb250LCAmZmlsbGVkKTsKKyAgICAgICAgaWYgKGZpbGxlZCA+IG1heEZpbGxlZCkgeworICAgICAgICAgICAgb2xkZXN0RnJvbnQgPSBmcm9udDsKKyAgICAgICAgICAgIG1heEZpbGxlZCA9IGZpbGxlZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWF4RmlsbGVkID4gbVJzbXBJbkZyYW1lcykgeworICAgICAgICAodm9pZClfX2J1aWx0aW5fc3ViX292ZXJmbG93KG1Sc21wSW5SZWFyLCBtUnNtcEluRnJhbWVzLCAmb2xkZXN0RnJvbnQpOworICAgIH0KKyAgICByZXR1cm4gb2xkZXN0RnJvbnQ7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnVwZGF0ZUZyb250c19sKGludDMyX3Qgb2Zmc2V0KQoreworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpbnQzMl90IGZyb250ID0gbVRyYWNrc1tpXS0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5nZXRGcm9udCgpOworICAgICAgICBmcm9udCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhmcm9udCwgb2Zmc2V0KTsKKyAgICAgICAgbVRyYWNrc1tpXS0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5zZXRGcm9udChmcm9udCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpyZXNpemVJbnB1dEJ1ZmZlcl9sKGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpCit7CisgICAgLy8gVGhpcyBpcyB0aGUgZm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdGhlIHRlbXBvcmFyeSBidWZmZXIgc2l6ZS4KKyAgICAvLyBXaXRoIDcgSEFMIGJ1ZmZlcnMsIHdlIGNhbiBndWFyYW50ZWUgYWJpbGl0eSB0byBkb3duLXNhbXBsZSB0aGUgaW5wdXQgYnkgcmF0aW8gb2YgNjoxIHRvCisgICAgLy8gMSBmdWxsIG91dHB1dCBidWZmZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFsaWdubWVudCBvZiB0aGUgYXZhaWxhYmxlIGlucHV0LgorICAgIC8vIFRoZSB2YWx1ZSBpcyBzb21ld2hhdCBhcmJpdHJhcnksIGFuZCBjb3VsZCBwcm9iYWJseSBiZSBldmVuIGxhcmdlci4KKyAgICAvLyBBIGxhcmdlciB2YWx1ZSBzaG91bGQgYWxsb3cgbW9yZSBvbGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIGEgdHJhY2sgY2FsbHMgc3RhcnQoKSwKKyAgICAvLyB3aXRob3V0IGluY3JlYXNpbmcgbGF0ZW5jeS4KKyAgICAvLworICAgIC8vIE5vdGUgdGhpcyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgbWF4aW11bSBkb3duc2FtcGxpbmcgcmF0aW8gcGVybWl0dGVkIGZvciBjYXB0dXJlLgorICAgIHNpemVfdCBtaW5Sc21wSW5GcmFtZXMgPSBtRnJhbWVDb3VudCAqIDc7CisKKyAgICAvLyBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyAhPSAwIGluZGljYXRlcyBhIHJlcXVlc3QgdG8gcG9zc2libHkgbWFrZSBzb21lIHBhcnQgb2YgdGhlIGF1ZGlvCisgICAgLy8gY2FwdHVyZSBoaXN0b3J5IGF2YWlsYWJsZSB0byBhbm90aGVyIGNsaWVudCB1c2luZyB0aGUgc2FtZSBzZXNzaW9uIElEOgorICAgIC8vIGRpbWVuc2lvbiB0aGUgcmVzYW1wbGVyIGlucHV0IGJ1ZmZlciBhY2NvcmRpbmdseS4KKworICAgIC8vIEdldCBvbGRlc3QgY2xpZW50IHJlYWQgcG9zaXRpb246ICBnZXRPbGRlc3RGcm9udF9sKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFsdGVyaW5nCisgICAgLy8gbVJzbXBJblJlYXIsIG9yIG1Sc21wSW5GcmFtZXMKKyAgICBpbnQzMl90IHByZXZpb3VzRnJvbnQgPSBnZXRPbGRlc3RGcm9udF9sKCk7CisgICAgc2l6ZV90IHByZXZpb3VzUnNtcEluRnJhbWVzUDIgPSBtUnNtcEluRnJhbWVzUDI7CisgICAgaW50MzJfdCBwcmV2aW91c1JlYXIgPSBtUnNtcEluUmVhcjsKKyAgICBtUnNtcEluUmVhciA9IDA7CisKKyAgICBBTE9HX0FTU0VSVChtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA+PSAwCisgICAgICAgICAgICAmJiBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA8PSBBdWRpb0ZsaW5nZXI6OmtNYXhTaGFyZWRBdWRpb0hpc3RvcnlNcywKKyAgICAgICAgICAgICJyZXNpemVJbnB1dEJ1ZmZlcl9sKCkgY2FsbGVkIHdpdGggaW52YWxpZCBtYXggc2hhcmVkIGhpc3RvcnkgJWQiLAorICAgICAgICAgICAgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOworICAgIGlmIChtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyAhPSAwKSB7CisgICAgICAgIC8vIHJlc2l6ZUlucHV0QnVmZmVyX2wgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aXRoIGEgbm9uIHplcm8gc2hhcmVkIGhpc3RvcnkgaWYgdGhlCisgICAgICAgIC8vIGJ1ZmZlciB3YXMgbm90IGFscmVhZHkgYWxsb2NhdGVkCisgICAgICAgIEFMT0dfQVNTRVJUKG1Sc21wSW5CdWZmZXIgIT0gbnVsbHB0ciAmJiBtUnNtcEluRnJhbWVzICE9IDAsCisgICAgICAgICAgICAgICAgInJlc2l6ZUlucHV0QnVmZmVyX2woKSBjYWxsZWQgd2l0aCBzaGFyZWQgaGlzdG9yeSBhbmQgdW5hbGxvY2F0ZWQgYnVmZmVyIik7CisgICAgICAgIHNpemVfdCByc21wSW5GcmFtZXMgPSAoc2l6ZV90KW1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zICogbVNhbXBsZVJhdGUgLyAxMDAwOworICAgICAgICAvLyBuZXZlciByZWR1Y2UgcmVzYW1wbGVyIGlucHV0IGJ1ZmZlciBzaXplCisgICAgICAgIGlmIChyc21wSW5GcmFtZXMgPD0gbVJzbXBJbkZyYW1lcykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Sc21wSW5GcmFtZXMgPSByc21wSW5GcmFtZXM7CisgICAgfQorICAgIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOworICAgIC8vIE5vdGU6IG1Sc21wSW5GcmFtZXMgaXMgMCB3aGVuIGNhbGxlZCB3aXRoIG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zIGVxdWFscyB0byAwIHNvIGl0IGlzIGFsd2F5cworICAgIC8vIGluaXRpYWxpemVkCisgICAgaWYgKG1Sc21wSW5GcmFtZXMgPCBtaW5Sc21wSW5GcmFtZXMpIHsKKyAgICAgICAgbVJzbXBJbkZyYW1lcyA9IG1pblJzbXBJbkZyYW1lczsKKyAgICB9CisgICAgbVJzbXBJbkZyYW1lc1AyID0gcm91bmR1cChtUnNtcEluRnJhbWVzKTsKKworICAgIC8vIFRPRE8gb3B0aW1pemUgYXVkaW8gY2FwdHVyZSBidWZmZXIgc2l6ZXMgLi4uCisgICAgLy8gSGVyZSB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNsaWRpbmcgYnVmZmVyIHVzZWQgYXMgYSBzb3VyY2UKKyAgICAvLyBmb3IgcmVzYW1wbGluZy4gIG1Sc21wSW5GcmFtZXNQMiBpcyBjdXJyZW50bHkgcm91bmR1cChtRnJhbWVDb3VudCAqIDcpLgorICAgIC8vIEZvciBjdXJyZW50IEhBTCBmcmFtZSBjb3VudHMsIHRoaXMgaXMgdXN1YWxseSAyMDQ4ID0gNDAgbXMuICBJdCB3b3VsZAorICAgIC8vIGJlIGJldHRlciB0byBoYXZlIGl0IGRlcml2ZWQgZnJvbSB0aGUgcGlwZSBkZXB0aCBpbiB0aGUgbG9uZyB0ZXJtLgorICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGlzIGhpZ2hlciB0aGFuIG5lY2Vzc2FyeS4gIEhvd2V2ZXIgaXQgc2hvdWxkIG5vdCBhZGQgdG8gbGF0ZW5jeS4KKworICAgIC8vIE92ZXItYWxsb2NhdGUgYmV5b25kIG1Sc21wSW5GcmFtZXNQMiB0byBwZXJtaXQgYSBIQUwgcmVhZCBwYXN0IGVuZCBvZiBidWZmZXIKKyAgICBtUnNtcEluRnJhbWVzT0EgPSBtUnNtcEluRnJhbWVzUDIgKyBtRnJhbWVDb3VudCAtIDE7CisKKyAgICB2b2lkICpyc21wSW5CdWZmZXI7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJnJzbXBJbkJ1ZmZlciwgMzIsIG1Sc21wSW5GcmFtZXNPQSAqIG1GcmFtZVNpemUpOworICAgIC8vIGlmIHBvc2l4X21lbWFsaWduIGZhaWxzLCB3aWxsIHNlZ3YgaGVyZS4KKyAgICBtZW1zZXQocnNtcEluQnVmZmVyLCAwLCBtUnNtcEluRnJhbWVzT0EgKiBtRnJhbWVTaXplKTsKKworICAgIC8vIENvcHkgYXVkaW8gaGlzdG9yeSBpZiBhbnkgZnJvbSBvbGQgYnVmZmVyIGJlZm9yZSBmcmVlaW5nIGl0CisgICAgaWYgKHByZXZpb3VzUmVhciAhPSAwKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1Sc21wSW5CdWZmZXIgIT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAicmVzaXplSW5wdXRCdWZmZXJfbCgpIGNhbGxlZCB3aXRoIG51bGwgYnVmZmVyIGJ1dCBmcmFtZXMgYWxyZWFkeSByZWFkIGZyb20gSEFMIik7CisKKyAgICAgICAgc3NpemVfdCB1bnJlYWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocHJldmlvdXNSZWFyLCBwcmV2aW91c0Zyb250KTsKKyAgICAgICAgcHJldmlvdXNGcm9udCAmPSBwcmV2aW91c1JzbXBJbkZyYW1lc1AyIC0gMTsKKyAgICAgICAgc2l6ZV90IHBhcnQxID0gcHJldmlvdXNSc21wSW5GcmFtZXNQMiAtIHByZXZpb3VzRnJvbnQ7CisgICAgICAgIGlmIChwYXJ0MSA+IChzaXplX3QpIHVucmVhZCkgeworICAgICAgICAgICAgcGFydDEgPSB1bnJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcnQxICE9IDApIHsKKyAgICAgICAgICAgIG1lbWNweShyc21wSW5CdWZmZXIsIChjb25zdCB1aW50OF90KiltUnNtcEluQnVmZmVyICsgcHJldmlvdXNGcm9udCAqIG1GcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgcGFydDEgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIG1Sc21wSW5SZWFyID0gcGFydDE7CisgICAgICAgICAgICBwYXJ0MSA9IHVucmVhZCAtIHBhcnQxOworICAgICAgICAgICAgaWYgKHBhcnQxICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKXJzbXBJbkJ1ZmZlciArIG1Sc21wSW5SZWFyICogbUZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIsIHBhcnQxICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgbVJzbXBJblJlYXIgKz0gcGFydDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVXBkYXRlIGZyb250IGZvciBhbGwgY2xpZW50cyBhY2NvcmRpbmcgdG8gbmV3IHJlYXIKKyAgICAgICAgdXBkYXRlRnJvbnRzX2woYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHByZXZpb3VzUmVhciwgbVJzbXBJblJlYXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUnNtcEluUmVhciA9IDA7CisgICAgfQorICAgIGZyZWUobVJzbXBJbkJ1ZmZlcik7CisgICAgbVJzbXBJbkJ1ZmZlciA9IHJzbXBJbkJ1ZmZlcjsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YWRkUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtODY5Niw2ICs5MDUyLDExIEBACiAgICAgcmV0dXJuIG1UaHJlYWQtPmdldE1tYXBQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6Z2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CisgICAgcmV0dXJuIG1UaHJlYWQtPmdldEV4dGVybmFsUG9zaXRpb24ocG9zaXRpb24sIHRpbWVOYW5vcyk7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZEhhbmRsZTo6c3RhcnQoY29uc3QgQXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLCBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpCiAKQEAgLTg3MzEsNyArOTA5Miw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6fk1tYXBUaHJlYWQoKQogewotICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTg3ODEsNyArOTE0MSw2IEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBtU3RhbmRieSA9IHRydWU7Ci0gICAgYWNxdWlyZVdha2VMb2NrKCk7CiAgICAgcmV0dXJuIG1IYWxTdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIobWluU2l6ZUZyYW1lcywgaW5mbyk7CiB9CiAKQEAgLTg4MTIsNyArOTE3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBBTE9HVigiJXMgY2xpZW50VWlkICVkIG1TdGFuZGJ5ICVkIG1Qb3J0SWQgJWQgKmhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBtU3RhbmRieSwgbVBvcnRJZCwgKmhhbmRsZSk7CisgICAgICAgICAgY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCwgbVN0YW5kYnksIG1Qb3J0SWQsICpoYW5kbGUpOwogICAgIGlmIChtSGFsU3RyZWFtID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtODgyMCw4ICs5MTc5LDEyIEBACiAgICAgc3RhdHVzX3QgcmV0OwogCiAgICAgaWYgKCpoYW5kbGUgPT0gbVBvcnRJZCkgewotICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHRyYWNrLCByZXVzZSBwb3J0SWQgYW5kIHNlc3Npb24gYWxsb2NhdGVkIHdoZW4gdGhlIHN0cmVhbSB3YXMgb3BlbmVkCi0gICAgICAgIHJldHVybiBleGl0U3RhbmRieSgpOworICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHRyYWNrLCByZXVzZSBwb3J0SWQgYW5kIHNlc3Npb24gYWxsb2NhdGVkIHdoZW4gdGhlIHN0cmVhbSB3YXMgb3BlbmVkLgorICAgICAgICByZXQgPSBleGl0U3RhbmRieSgpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKQEAgLTg4NDAsOCArOTIwMyw3IEBACiAgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCkBAIC04ODU4LDkgKzkyMjAsNyBAQAogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ09SRF9SSUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5hdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSWQsCkBAIC04OTAwLDE2ICs5MjYwLDE2IEBACiAKICAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPwogICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIGF0dHIgPT0gbnVsbHB0ciA/IG1BdHRyIDogKmF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwgaXNPdXRwdXQoKSwgY2xpZW50LmNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsIGlzT3V0cHV0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgcG9ydElkKTsKIAogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIGZvcmNlIHZvbHVtZSB1cGRhdGUgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZAogICAgICAgICBtSGFsVm9sRmxvYXQgPSAtMS4wZjsKICAgICB9IGVsc2UgaWYgKCF0cmFjay0+aXNTaWxlbmNlZF9sKCkpIHsKICAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewotICAgICAgICAgICAgaWYgKHQtPmlzU2lsZW5jZWRfbCgpICYmIHQtPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCisgICAgICAgICAgICBpZiAodC0+aXNTaWxlbmNlZF9sKCkgJiYgdC0+dWlkKCkgIT0gY2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCkKICAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC04OTQyLDYgKzkzMDIsNyBAQAogCiAgICAgaWYgKGhhbmRsZSA9PSBtUG9ydElkKSB7CiAgICAgICAgIG1IYWxTdHJlYW0tPnN0b3AoKTsKKyAgICAgICAgcmVsZWFzZVdha2VMb2NrKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTkxODQsNyArOTU0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbnVtZXJhdGVkIGRldmljZSB0eXBlKCUjeCkgbXVzdCBub3QgYmUgdXNlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHBhdGNoZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKLSAgICAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKKyAgICAgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KHR5cGUgfCBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgICAgIHNpbmtEZXZpY2VUeXBlQWRkcnMucHVzaF9iYWNrKEF1ZGlvRGV2aWNlVHlwZUFkZHIocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwKICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcykpOwogICAgICAgICB9CkBAIC05MTk1LDcgKzk1NTYsNyBAQAogICAgICAgICBkZXZpY2VJZCA9IHBhdGNoLT5zb3VyY2VzWzBdLmlkOwogICAgICAgICBudW1EZXZpY2VzID0gbVBhdGNoLm51bV9zb3VyY2VzOwogICAgICAgICBzb3VyY2VEZXZpY2VUeXBlQWRkci5tVHlwZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKLSAgICAgICAgc291cmNlRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3M7CisgICAgICAgIHNvdXJjZURldmljZVR5cGVBZGRyLnNldEFkZHJlc3MocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKQEAgLTkzOTMsNiArOTc1NCwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChFZmZlY3RNb2R1bGU6OmlzSGFwdGljR2VuZXJhdG9yKCZkZXNjLT50eXBlKSkgeworICAgICAgICBBTE9HRSgiJXMoKTogSGFwdGljR2VuZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIE1tYXBUaHJlYWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC05NTk4LDIzICs5OTY0LDI5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICB0cmFjay0+c2V0TWV0YWRhdGFIYXNDaGFuZ2VkKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OnVwZGF0ZU1ldGFkYXRhX2woKQogewotICAgIGlmIChtT3V0cHV0ID09IG51bGxwdHIgfHwgbU91dHB1dC0+c3RyZWFtID09IG51bGxwdHIgfHwKLSAgICAgICAgICAgICFtQWN0aXZlVHJhY2tzLnJlYWRBbmRDbGVhckhhc0NoYW5nZWQoKSkgewotICAgICAgICByZXR1cm47CisgICAgaWYgKCFpc1N0cmVhbUluaXRpYWxpemVkKCkgfHwgIW1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpKSB7CisgICAgICAgIHJldHVybjsgLy8gbm90aGluZyB0byBkbwogICAgIH0KICAgICBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhIG1ldGFkYXRhOwogICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7CiAgICAgICAgIC8vIE5vIHRyYWNrIGlzIGludmFsaWQgYXMgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcHJlcGFyZVRyYWNrX2wgaW4gdGhlIHNhbWUgY3JpdGljYWwgc2VjdGlvbgotICAgICAgICBtZXRhZGF0YS50cmFja3MucHVzaF9iYWNrKHsKKyAgICAgICAgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdjdfdCB0cmFja01ldGFkYXRhOworICAgICAgICB0cmFja01ldGFkYXRhLmJhc2UgPSB7CiAgICAgICAgICAgICAgICAgLnVzYWdlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS51c2FnZSwKICAgICAgICAgICAgICAgICAuY29udGVudF90eXBlID0gdHJhY2stPmF0dHJpYnV0ZXMoKS5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgLmdhaW4gPSBtSGFsVm9sRmxvYXQsIC8vIFRPRE86IHByb3BhZ2F0ZSBmcm9tIGFhdWRpbyBwcmUtbWl4IHZvbHVtZQotICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS5jaGFubmVsX21hc2sgPSB0cmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgc3RybmNweSh0cmFja01ldGFkYXRhLnRhZ3MsIHRyYWNrLT5hdHRyaWJ1dGVzKCkudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh0cmFja01ldGFkYXRhKTsKICAgICB9CiAgICAgbU91dHB1dC0+c3RyZWFtLT51cGRhdGVTb3VyY2VNZXRhZGF0YShtZXRhZGF0YSk7CiB9CkBAIC05NjQ1LDYgKzEwMDE3LDIwIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6Z2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpCit7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVzdGFtcDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbihwb3NpdGlvbiwgJnRpbWVzdGFtcCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQgKyB0aW1lc3RhbXAudHZfbnNlYzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKICAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woZmQsIGFyZ3MpOwpAQCAtOTcxNCwxNyArMTAxMDAsMjAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKLSAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fAotICAgICAgICAgICAgIW1BY3RpdmVUcmFja3MucmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzU3RyZWFtSW5pdGlhbGl6ZWQoKSB8fCAhbUFjdGl2ZVRyYWNrcy5yZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkKCkpIHsKKyAgICAgICAgcmV0dXJuOyAvLyBub3RoaW5nIHRvIGRvCiAgICAgfQogICAgIFN0cmVhbUluSGFsSW50ZXJmYWNlOjpTaW5rTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKICAgICAgICAgLy8gTm8gdHJhY2sgaXMgaW52YWxpZCBhcyB0aGlzIGlzIGNhbGxlZCBhZnRlciBwcmVwYXJlVHJhY2tfbCBpbiB0aGUgc2FtZSBjcml0aWNhbCBzZWN0aW9uCi0gICAgICAgIG1ldGFkYXRhLnRyYWNrcy5wdXNoX2JhY2soeworICAgICAgICByZWNvcmRfdHJhY2tfbWV0YWRhdGFfdjdfdCB0cmFja01ldGFkYXRhOworICAgICAgICB0cmFja01ldGFkYXRhLmJhc2UgPSB7CiAgICAgICAgICAgICAgICAgLnNvdXJjZSA9IHRyYWNrLT5hdHRyaWJ1dGVzKCkuc291cmNlLAogICAgICAgICAgICAgICAgIC5nYWluID0gMSwgLy8gY2FwdHVyZSB0cmFja3MgZG8gbm90IGhhdmUgdm9sdW1lcwotICAgICAgICB9KTsKKyAgICAgICAgfTsKKyAgICAgICAgdHJhY2tNZXRhZGF0YS5jaGFubmVsX21hc2sgPSB0cmFjay0+Y2hhbm5lbE1hc2soKSwKKyAgICAgICAgc3RybmNweSh0cmFja01ldGFkYXRhLnRhZ3MsIHRyYWNrLT5hdHRyaWJ1dGVzKCkudGFncywgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFKTsKKyAgICAgICAgbWV0YWRhdGEudHJhY2tzLnB1c2hfYmFjayh0cmFja01ldGFkYXRhKTsKICAgICB9CiAgICAgbUlucHV0LT5zdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShtZXRhZGF0YSk7CiB9CkBAIC05NzQ5LDQgKzEwMTM4LDEzIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjpnZXRFeHRlcm5hbFBvc2l0aW9uKAorICAgICAgICB1aW50NjRfdCAqcG9zaXRpb24sIGludDY0X3QgKnRpbWVOYW5vcykKK3sKKyAgICBpZiAobUlucHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSW5wdXQtPmdldENhcHR1cmVQb3NpdGlvbigoaW50NjRfdCopcG9zaXRpb24sIHRpbWVOYW5vcyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCmluZGV4IGMxYWMyZTQuLjE2MDgyYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaApAQCAtNTMsNiArNTMsNyBAQAogICAgICAgICBDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENILAogICAgICAgICBDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSCwKICAgICAgICAgQ0ZHX0VWRU5UX1VQREFURV9PVVRfREVWSUNFLAorICAgICAgICBDRkdfRVZFTlRfUkVTSVpFX0JVRkZFUgogICAgIH07CiAKICAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTI0Miw2ICsyNDMsMjggQEAKICAgICAgICAgdmlydHVhbCB+VXBkYXRlT3V0RGV2aWNlc0NvbmZpZ0V2ZW50KCk7CiAgICAgfTsKIAorICAgIGNsYXNzIFJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgUmVzaXplQnVmZmVyQ29uZmlnRXZlbnREYXRhKGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpIDoKKyAgICAgICAgICAgIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyhtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcykge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJtTWF4U2hhcmVkQXVkaW9IaXN0b3J5TXM6ICVkIiwgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgbU1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zOworICAgIH07CisKKyAgICBjbGFzcyBSZXNpemVCdWZmZXJDb25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBSZXNpemVCdWZmZXJDb25maWdFdmVudChpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfUkVTSVpFX0JVRkZFUikgeworICAgICAgICAgICAgbURhdGEgPSBuZXcgUmVzaXplQnVmZmVyQ29uZmlnRXZlbnREYXRhKG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflJlc2l6ZUJ1ZmZlckNvbmZpZ0V2ZW50KCkge30KKyAgICB9OworCiAgICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIDogbVRocmVhZCh0aHJlYWQpIHt9CkBAIC0yNzIsNiArMjk1LDcgQEAKICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgYnkgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgYW5kIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIFtub3JtYWwgbWl4XSBidWZmZXIncyBmcmFtZSBjb3VudC4KICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgbGF0ZW5jeV9sKCkgY29uc3QgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFZvbHVtZUZvck91dHB1dF9sKGZsb2F0IGxlZnQgX191bnVzZWQsIGZsb2F0IHJpZ2h0IF9fdW51c2VkKSBjb25zdCB7fQogCkBAIC0zMDUsNiArMzI5LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRVcGRhdGVPdXREZXZpY2VDb25maWdFdmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBvdXREZXZpY2VzKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUmVzaXplQnVmZmVyQ29uZmlnRXZlbnRfbChpbnQzMl90IG1heFNoYXJlZEF1ZGlvSGlzdG9yeU1zKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTMxMyw2ICszMzgsOSBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHVwZGF0ZU91dERldmljZXMoY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIG91dERldmljZXMpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICByZXNpemVJbnB1dEJ1ZmZlcl9sKGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpOworCisKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKICAgICAgICAgICAgICAgICBib29sICAgICAgICBzdGFuZGJ5KCkgY29uc3QgeyByZXR1cm4gbVN0YW5kYnk7IH0KQEAgLTM0OCw3ICszNzYsNyBAQAogCiAgICAgICAgICAgICAgICAgc3A8RWZmZWN0SGFuZGxlPiBjcmVhdGVFZmZlY3RfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUVmZmVjdENsaWVudD4mIGVmZmVjdENsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLApAQCAtNDM0LDggKzQ2MiwxMCBAQAogCiAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgbm90IGltcG9ydGFudCBhcyB0aGUKICAgICAgICAgICAgICAgICAvLyBzdHJhdGVneSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFBsYXliYWNrVGhyZWFkIHdoaWNoIGltcGxlbWVudHMgdGhpcyBtZXRob2QKLSAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwOyB9CisgICAgICAgICAgICAgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkIF9fdW51c2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KDApOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHNvbWUgZWZmZWN0cyBtdXN0IGJlIHN1c3BlbmRlZC9yZXN0b3JlZCB3aGVuIGFuIGVmZmVjdCBpcyBlbmFibGVkCiAgICAgICAgICAgICAgICAgLy8gb3IgZGlzYWJsZWQKQEAgLTQ3OCw2ICs1MDgsMjcgQEAKICAgICAgICAgICAgICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAgICAgICAgICAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoKTsKIAorICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb25fbCBtdXN0IGJlIGNhbGxlZCB3aXRoIGhvbGRpbmcgbUxvY2suCisgICAgdmlydHVhbCAgICAgdm9pZCBpbnZhbGlkYXRlVHJhY2tzRm9yQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCkgY29uc3QgeyB9CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgdGhlIHRyYWNrcyB3aXRoIHRoZSBnaXZlbiBhdWRpbyBzZXNzaW9uLgorICAgICAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVUcmFja3NGb3JBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCYgdHJhY2tzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0Jhc2U+JiB0cmFjayA9IHRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgIHZpcnR1YWwgICAgIGJvb2wgaXNTdHJlYW1Jbml0aWFsaXplZCgpID0gMDsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgLy8gZW50cnkgZGVzY3JpYmluZyBhbiBlZmZlY3QgYmVpbmcgc3VzcGVuZGVkIGluIG1TdXNwZW5kZWRTZXNzaW9ucyBrZXllZCB2ZWN0b3IKQEAgLTU3NSw3ICs2MjYsNyBAQAogCiAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAga1RocmVhZE5hbWVMZW5ndGggPSAxNjsgLy8gcHJjdGwoUFJfU0VUX05BTUUpIGxpbWl0CiAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbVRocmVhZE5hbWVba1RocmVhZE5hbWVMZW5ndGhdOyAvLyBndWFyYW50ZWVkIE5VTC10ZXJtaW5hdGVkCi0gICAgICAgICAgICAgICAgc3A8SVBvd2VyTWFuYWdlcj4gICAgICAgbVBvd2VyTWFuYWdlcjsKKyAgICAgICAgICAgICAgICBzcDxvczo6SVBvd2VyTWFuYWdlcj4gICBtUG93ZXJNYW5hZ2VyOwogICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuOwogICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBNRGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKICAgICAgICAgICAgICAgICAvLyBsaXN0IG9mIHN1c3BlbmRlZCBlZmZlY3RzIHBlciBzZXNzaW9uIGFuZCBwZXIgdHlwZS4gVGhlIGZpcnN0IChvdXRlcikgdmVjdG9yIGlzCkBAIC01OTAsNiArNjQxLDExIEBACiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgogICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMgc2hvdWxkIHJlc2V0IGZyYW1lIGNvdW50IHRvIHplcm8gb24gc3RvcC9mbHVzaAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBjb25maXJtYXRpb24gY2hlY2tzOgorICAgICAgICAgICAgICAgIC8vIDEpIERJUkVDVCB0aHJlYWRzIGFuZCBsaW5lYXIgUENNIGZvcm1hdCByZWFsbHkgcmVzZXRzIHRvIDA/CisgICAgICAgICAgICAgICAgLy8gMikgSXMgZnJhbWUgY291bnQgcmVhbGx5IHZhbGlkIGlmIG5vdCBsaW5lYXIgcGNtPworICAgICAgICAgICAgICAgIC8vIDMpIEFyZSBhbGwgNjQgYml0cyBvZiBwb3NpdGlvbiByZXR1cm5lZCwgbm90IGp1c3QgbG93ZXN0IDMyIGJpdHM/CiAgICAgICAgICAgICAgICAgLy8gVGltZXN0YW1wIGNvcnJlY3RlZCBkZXZpY2Ugc2hvdWxkIGJlIGEgc2luZ2xlIGRldmljZS4KICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CiAKQEAgLTY4Nyw3ICs3NDMsOSBAQAogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgdXBkYXRlUG93ZXJTdGF0ZShzcDxUaHJlYWRCYXNlPiB0aHJlYWQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKICAgICAgICAgICAgICAgICAgICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiBvbmUgb3IgbW92ZSBhY3RpdmUgdHJhY2tzIHdhcyBhZGRlZCBvciByZW1vdmVkIHNpbmNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIG9yIHRoZSB2ZWN0b3Igd2FzIGNyZWF0ZWQuICovCisgICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgIGxhc3QgdGltZSB0aGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgb3IgdGhlIHZlY3RvciB3YXMgY3JlYXRlZC4KKyAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgdHJ1ZSBpZiB2b2x1bWUgb2Ygb25lIG9mIGFjdGl2ZSB0cmFja3Mgd2FzIGNoYW5nZWQuCisgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgcmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpOwogCiAgICAgICAgICAgICAgICAgcHJpdmF0ZToKQEAgLTg2MCw4ICs5MTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4mIGNhbGxiYWNrKTsKQEAgLTkwMyw3ICs5NjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKQEAgLTkzOSw2ICs5OTcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBvdXREZXZpY2VUeXBlcygpLmNvdW50KG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2UpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNTdHJlYW1Jbml0aWFsaXplZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzaygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0c0hhcHRpY1BsYXliYWNrKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1IYXB0aWNDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZvaWQgc2V0RG93blN0cmVhbVBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgbURvd25TdHJlYW1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZDo6VHJhY2sqIGdldFRyYWNrQnlJZF9sKGF1ZGlvX3BvcnRfaGFuZGxlX3QgdHJhY2tJZCk7CisKIHByb3RlY3RlZDoKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKQEAgLTEwMTcsNiArMTA5Myw4IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciBmcmFtZXMgd3JpdHRlbi4KICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXM7IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CiAKICAgICAvLyBtSGFwdGljQ2hhbm5lbE1hc2sgYW5kIG1IYXB0aWNDaGFubmVsQ291bnQgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIHRocmVhZCBzdXBwb3J0CkBAIC0xMDI5LDYgKzExMDcsMTQgQEAKICAgICAvLyBjb3B5IHJhdGhlciB0aGFuIHRoZSBvbmUgaW4gQXVkaW9GbGluZ2VyLiAgVGhpcyBvcHRpbWl6YXRpb24gc2F2ZXMgYSBsb2NrLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck11dGU7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyTXV0ZV9sKGJvb2wgbXV0ZWQpIHsgbU1hc3Rlck11dGUgPSBtdXRlZDsgfQorCisgICAgICAgICAgICAgICAgYXV0byBkaXNjb250aW51aXR5Rm9yU3RhbmRieU9yRmx1c2goKSBjb25zdCB7IC8vIGNhbGwgb24gdGhyZWFkTG9vcCBvciB3aXRoIGxvY2suCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKG1UeXBlID09IERJUkVDVCAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1UaW1lc3RhbXBWZXJpZmllci5ESVNDT05USU5VSVRZX01PREVfQ09OVElOVU9VUzsKKyAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICBBY3RpdmVUcmFja3M8VHJhY2s+ICAgICBtQWN0aXZlVHJhY2tzOwogCkBAIC0xMDYxLDYgKzExNDcsMTEgQEAKIAogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHRyYWNrQ291bnRGb3JVaWRfbCh1aWRfdCB1aWQpIGNvbnN0OwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW52YWxpZGF0ZVRyYWNrc0ZvckF1ZGlvU2Vzc2lvbl9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRCYXNlOjppbnZhbGlkYXRlVHJhY2tzRm9yQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkLCBtVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByaXZhdGU6CiAKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBudW1lcm91cwpAQCAtMTA3NSw2ICsxMTY2LDggQEAKICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgZmluYWw7CiAgICAgdmlydHVhbCB2b2lkIHNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAorICAgIHZvaWQgICAgICAgIGNvbGxlY3RUaW1lc3RhbXBzX2woKTsKKwogICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CkBAIC0xMTg2LDcgKzEyNzksNyBAQAogCiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NiTG9jazsKICAgICAvLyBSZWNvcmQgb2YgSUF1ZGlvVHJhY2tDYWxsYmFjawotICAgIHN0ZDo6c2V0PHNwPG1lZGlhOjpJQXVkaW9UcmFja0NhbGxiYWNrPj4gbUF1ZGlvVHJhY2tDYWxsYmFja3M7CisgICAgc3RkOjptYXA8c3A8VHJhY2s+LCBzcDxtZWRpYTo6SUF1ZGlvVHJhY2tDYWxsYmFjaz4+IG1BdWRpb1RyYWNrQ2FsbGJhY2tzOwogCiBwcml2YXRlOgogICAgIC8vIFRoZSBIQUwgb3V0cHV0IHNpbmsgaXMgdHJlYXRlZCBhcyBub24tYmxvY2tpbmcsIGJ1dCBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGJsb2NraW5nCkBAIC0xMjE3LDYgKzEzMTAsMTAgQEAKICAgICAgICAgICAgICAgICAvLyB2b2x1bWVzIGxhc3Qgc2VudCB0byBhdWRpbyBIQUwgd2l0aCBzdHJlYW0tPnNldFZvbHVtZSgpCiAgICAgICAgICAgICAgICAgZmxvYXQgbUxlZnRWb2xGbG9hdDsKICAgICAgICAgICAgICAgICBmbG9hdCBtUmlnaHRWb2xGbG9hdDsKKworICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGNoIHVzZWQgYnkgdGhlIGRvd25zdHJlYW0gc29mdHdhcmUgcGF0Y2guCisgICAgICAgICAgICAgICAgLy8gT25seSB1c2VkIGlmIFRocmVhZEJhc2U6Om1Jc01zZERldmljZSBpcyB0cnVlLgorICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtRG93blN0cmVhbVBhdGNoOwogfTsKIAogY2xhc3MgTWl4ZXJUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtMTU1Myw2ICsxNjUwLDkgQEAKICAgICAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKICAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgICAgIGdldEZyb250KCkgY29uc3QgeyByZXR1cm4gbVJzbXBJbkZyb250OyB9CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0RnJvbnQoaW50MzJfdCBmcm9udCkgeyBtUnNtcEluRnJvbnQgPSBmcm9udDsgfQogICAgIHByaXZhdGU6CiAgICAgICAgIFJlY29yZFRyYWNrICogY29uc3QgbVJlY29yZFRyYWNrOwogICAgICAgICBzaXplX3QgICAgICAgICAgICAgIG1Sc21wSW5VbnJlbDsgICAvLyB1bnJlbGVhc2VkIGZyYW1lcyByZW1haW5pbmcgZnJvbQpAQCAtMTU5OCwxMiArMTY5OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAotICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyk7CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHN0YXJ0KFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsCkBAIC0xNjI3LDYgKzE3MjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlT3V0RGV2aWNlcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkICAgICAgICByZXNpemVJbnB1dEJ1ZmZlcl9sKGludDMyX3QgbWF4U2hhcmVkQXVkaW9IaXN0b3J5TXMpIG92ZXJyaWRlOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOwpAQCAtMTY4Miw2ICsxNzgzLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbkRldmljZVR5cGUoKSA9PSBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzaGFyZUF1ZGlvSGlzdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmVkQXVkaW9QYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzaGFyZWRTZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNoYXJlZEF1ZGlvU3RhcnRNcyA9IC0xKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNoYXJlQXVkaW9IaXN0b3J5X2woY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2hhcmVkU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaGFyZWRBdWRpb1N0YXJ0TXMgPSAtMSk7CisgICAgICAgICAgICB2b2lkICAgICAgICByZXNldEF1ZGlvSGlzdG9yeV9sKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzU3RyZWFtSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CkBAIC0xNjk1LDYgKzE4MDgsOSBAQAogCiAgICAgICAgICAgICB2b2lkICAgIGNoZWNrQnROcmVjX2woKTsKIAorICAgICAgICAgICAgaW50MzJfdCBnZXRPbGRlc3RGcm9udF9sKCk7CisgICAgICAgICAgICB2b2lkICAgIHVwZGF0ZUZyb250c19sKGludDMyX3Qgb2Zmc2V0KTsKKwogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAgICAgICAgICAgICAgICAgICAgICAgKm1JbnB1dDsKICAgICAgICAgICAgIFNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptU291cmNlOwogICAgICAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8UmVjb3JkVHJhY2s+ID4gICAgbVRyYWNrczsKQEAgLTE3NjAsNiArMTg3NiwxMSBAQAogICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWQgPSAwOyAgICAvLyBjb250aW51b3VzIHJ1bm5pbmcgY291bnRlci4KIAogICAgICAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3IgICAgICAgICAgbU91dERldmljZXM7CisKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhTaGFyZWRBdWRpb0hpc3RvcnlNcyA9IDA7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmVkQXVkaW9QYWNrYWdlTmFtZSA9IHt9OworICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZEF1ZGlvU3RhcnRGcmFtZXMgPSAtMTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgICAgICAgICAgICAgIG1TaGFyZWRBdWRpb1Nlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fTk9ORTsKIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTc5MSw2ICsxOTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHN0YXR1c190IHN0b3AoYXVkaW9fcG9ydF9oYW5kbGVfdCBoYW5kbGUpOwogICAgIHN0YXR1c190IHN0YW5kYnkoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uLCBpbnQ2NF90ICp0aW1lTmFvcykgPSAwOwogCiAgICAgLy8gUmVmQmFzZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKQEAgLTE4NDIsNiArMTk2NCw4IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaWxlbmNlZCBfX3VudXNlZCkge30KIAorICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzU3RyZWFtSW5pdGlhbGl6ZWQoKSB7IHJldHVybiBmYWxzZTsgfQorCiAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3NfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwpAQCAtMTkwMiw2ICsyMDI2LDEyIEBACiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRFeHRlcm5hbFBvc2l0aW9uKHVpbnQ2NF90ICpwb3NpdGlvbiwgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzU3RyZWFtSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKQEAgLTE5MzIsNiArMjA2MiwxMiBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwogCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgZ2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb24sIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsICAgICBib29sICAgICAgICAgICBpc1N0cmVhbUluaXRpYWxpemVkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShtSW5wdXQgPT0gbnVsbHB0ciB8fCBtSW5wdXQtPnN0cmVhbSA9PSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qICBtSW5wdXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggMDFkNTM0NS4uOTJmMTI5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjUzLDYgKzI1MywxOSBAQAogICAgIC8vIENhbGxlZCB0byB0YWxseSB1bmRlcnJ1biBmcmFtZXMgaW4gcGxheWJhY2suCiAgICAgdmlydHVhbCB2b2lkIHRhbGx5VW5kZXJydW5GcmFtZXMoc2l6ZV90IC8qIGZyYW1lcyAqLykge30KIAorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CisKKyAgICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB0cmFjayBoYXMgY2hhbmdlZCAobWV0YWRhdGEgb3Igdm9sdW1lKSBzaW5jZQorICAgICAqICAgICAgICAgIHRoZSBsYXN0IHRpbWUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkLAorICAgICAqICAgICAgICAgIHRydWUgaWYgdGhpcyBmdW5jdGlvbiB3YXMgbmV2ZXIgY2FsbGVkIHNpbmNlIHRoZSB0cmFjayBjcmVhdGlvbiwKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogIFRocmVhZCBzYWZlLgorICAgICAqLworICAgIGJvb2wgcmVhZEFuZENsZWFySGFzQ2hhbmdlZCgpIHsgcmV0dXJuICFtQ2hhbmdlTm90aWZpZWQudGVzdF9hbmRfc2V0KCk7IH0KKworICAgIC8qKiBTZXQgdGhhdCBhIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIGFuZCBuZWVkcyB0byBiZSBub3RpZmllZCB0byBiYWNrZW5kLiBUaHJlYWQgc2FmZS4gKi8KKyAgICB2b2lkIHNldE1ldGFkYXRhSGFzQ2hhbmdlZCgpIHsgbUNoYW5nZU5vdGlmaWVkLmNsZWFyKCk7IH0KKwogcHJvdGVjdGVkOgogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFja0Jhc2UpOwogCkBAIC0yNzgsOCArMjkxLDYgQEAKIAogICAgIHNpemVfdCBmcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBtRnJhbWVTaXplOyB9CiAKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQotCiAgICAgdmlydHVhbCB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGU7IH0KIAogICAgIGJvb2wgaXNTdG9wcGVkKCkgY29uc3QgewpAQCAtMzkxLDYgKzQwMiw5IEBACiAgICAgc3RkOjphdG9taWM8RnJhbWVUaW1lPiBtS2VybmVsRnJhbWVUaW1le307ICAgICAvLyBsYXN0IGZyYW1lIHRpbWUgb24ga2VybmVsIHNpZGUuCiAgICAgY29uc3QgcGlkX3QgICAgICAgICBtQ3JlYXRvclBpZDsgIC8vIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBtY2xpZW50LT5waWQoKSBmb3IgaW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBjcmVhdGVkIGJ5IE51UGxheWVyIG9uIGJlaGFsZiBvZiBhIGNsaWVudAorCisgICAgLy8gSWYgdGhlIGxhc3QgdHJhY2sgY2hhbmdlIHdhcyBub3RpZmllZCB0byB0aGUgY2xpZW50IHdpdGggcmVhZEFuZENsZWFySGFzQ2hhbmdlZAorICAgIHN0ZDo6YXRvbWljX2ZsYWcgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tNZXRyaWNzLmgKaW5kZXggYWYxNjQ0OC4uN2ZiNjliZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrTWV0cmljcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja01ldHJpY3MuaApAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICBtSW50ZXJ2YWxTdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKICAgICB9CiAKLSAgICB2b2lkIGxvZ0NvbnN0cnVjdG9yKHBpZF90IGNyZWF0b3JQaWQsIHVpZF90IGNyZWF0b3JVaWQsCisgICAgdm9pZCBsb2dDb25zdHJ1Y3RvcihwaWRfdCBjcmVhdG9yUGlkLCB1aWRfdCBjcmVhdG9yVWlkLCBpbnQzMl90IGludGVybmFsVHJhY2tJZCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFpdHMgPSB7fSwKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSBjb25zdCB7CiAgICAgICAgIC8vIE9uY2UgdGhpcyBpdGVtIGlzIGxvZ2dlZCBieSB0aGUgc2VydmVyLCB0aGUgY2xpZW50IGNhbiBhZGQgcHJvcGVydGllcy4KQEAgLTc4LDYgKzc4LDcgQEAKICAgICAgICAgICAgIC5zZXQoQU1FRElBTUVUUklDU19QUk9QX0FMTE9XVUlELCAoaW50MzJfdCljcmVhdG9yVWlkKQogICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQU1FVFJJQ1NfUFJPUF9QUkVGSVhfU0VSVkVSIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVF9WQUxVRV9DVE9SKQorICAgICAgICAgICAgLnNldChBTUVESUFNRVRSSUNTX1BST1BfSU5URVJOQUxUUkFDS0lELCBpbnRlcm5hbFRyYWNrSWQpCiAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9UUkFJVFMsIHRyYWl0cyk7CiAgICAgICAgIC8vIGxvZyBzdHJlYW1UeXBlIGZyb20gdGhlIHNlcnZpY2UsIHNpbmNlIGNsaWVudCBkb2Vzbid0IGtub3cgY2hvc2VuIHN0cmVhbVR5cGUuCiAgICAgICAgIGlmIChzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDEyNjAxNWYuLmQyYTMwYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVmFsaWRhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CkBAIC01Miw4ICs1MywxOSBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAorLy8gVE9ETzogUmVtb3ZlIHdoZW4gdGhpcyBpcyBwdXQgaW50byBBaWRsQ29udmVyc2lvblV0aWwuaAorI2RlZmluZSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyh4KSAgICBcCisgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBhdXRvIF90bXAgPSAoeCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGlmICghX3RtcC5vaygpKSByZXR1cm4gOjphbmRyb2lkOjphaWRsX3V0aWxzOjpiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChfdG1wLmVycm9yKCkpOyBcCisgICAgICAgc3RkOjptb3ZlKF90bXAudmFsdWUoKSk7ICAgICAgICAgICAgIFwKKyAgICAgfSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyA6OmFuZHJvaWQ6OmFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUOwordXNpbmcgYmluZGVyOjpTdGF0dXM7Cit1c2luZyBjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogdXNpbmcgbWVkaWE6OlZvbHVtZVNoYXBlcjsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCkBAIC0yMjYsNiArMjM4LDE1IEBACiAgICAgfQogfQogCisvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKK3N0YXRpYyBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF1ZGlvU2VydmVyQXR0cmlidXRpb25Tb3VyY2UocGlkX3QgcGlkKSB7CisgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNle307CisgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBBSURfQVVESU9TRVJWRVI7CisgICBhdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBwaWQ7CisgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICByZXR1cm4gYXR0cmlidXRpb25Tb3VyY2U7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjppbml0Q2hlY2soKSBjb25zdAogewogICAgIHN0YXR1c190IHN0YXR1czsKQEAgLTMxOSw2NCArMzQwLDE1NiBAQAogICAgIG1UcmFjay0+ZGVzdHJveSgpOwogfQogCi1zcDxJTWVtb3J5PiBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRDYmxrKCkgY29uc3QgewotICAgIHJldHVybiBtVHJhY2stPmdldENibGsoKTsKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRDYmxrKAorICAgICAgICBzdGQ6Om9wdGlvbmFsPG1lZGlhOjpTaGFyZWRGaWxlUmVnaW9uPiogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IGxlZ2FjeTJhaWRsX051bGxhYmxlSU1lbW9yeV9TaGFyZWRGaWxlUmVnaW9uKG1UcmFjay0+Z2V0Q2JsaygpKS52YWx1ZSgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnN0YXJ0KCkgewotICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KCk7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c3RhcnQoaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IG1UcmFjay0+c3RhcnQoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnN0b3AoKSB7CitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c3RvcCgpIHsKICAgICBtVHJhY2stPnN0b3AoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmZsdXNoKCkgeworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmZsdXNoKCkgewogICAgIG1UcmFjay0+Zmx1c2goKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnBhdXNlKCkgeworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnBhdXNlKCkgewogICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKQorU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmF0dGFjaEF1eEVmZmVjdChpbnQzMl90IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgKl9haWRsX3JldHVybiA9IG1UcmFjay0+c2V0UGFyYW1ldGVycyhTdHJpbmc4KGtleVZhbHVlUGFpcnMuY19zdHIoKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZWxlY3RQcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Z2V0VGltZXN0YW1wKG1lZGlhOjpBdWRpb1RpbWVzdGFtcEludGVybmFsKiB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIEF1ZGlvVGltZXN0YW1wIGxlZ2FjeTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAobGVnYWN5KTsKKyAgICBpZiAoKl9haWRsX3JldHVybiAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgICAqdGltZXN0YW1wID0gbGVnYWN5MmFpZGxfQXVkaW9UaW1lc3RhbXBfQXVkaW9UaW1lc3RhbXBJbnRlcm5hbChsZWdhY3kpLnZhbHVlKCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNpZ25hbCgpIHsKKyAgICBtVHJhY2stPnNpZ25hbCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjphcHBseVZvbHVtZVNoYXBlcigKKyAgICAgICAgY29uc3QgbWVkaWE6OlZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24sCisgICAgICAgIGNvbnN0IG1lZGlhOjpWb2x1bWVTaGFwZXJPcGVyYXRpb24mIG9wZXJhdGlvbiwKKyAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgc3A8Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiBjb25mID0gbmV3IFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbigpOworICAgICpfYWlkbF9yZXR1cm4gPSBjb25mLT5yZWFkRnJvbVBhcmNlbGFibGUoY29uZmlndXJhdGlvbik7CisgICAgaWYgKCpfYWlkbF9yZXR1cm4gIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4gb3AgPSBuZXcgVm9sdW1lU2hhcGVyOjpPcGVyYXRpb24oKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gb3AtPnJlYWRGcm9tUGFyY2VsYWJsZShvcGVyYXRpb24pOworICAgIGlmICgqX2FpZGxfcmV0dXJuICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IG1UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZiwgb3ApOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRWb2x1bWVTaGFwZXJTdGF0ZSgKKyAgICAgICAgaW50MzJfdCBpZCwKKyAgICAgICAgc3RkOjpvcHRpb25hbDxtZWRpYTo6Vm9sdW1lU2hhcGVyU3RhdGU+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzcDxWb2x1bWVTaGFwZXI6OlN0YXRlPiBsZWdhY3kgPSBtVHJhY2stPmdldFZvbHVtZVNoYXBlclN0YXRlKGlkKTsKKyAgICBpZiAobGVnYWN5ID09IG51bGxwdHIpIHsKKyAgICAgICAgX2FpZGxfcmV0dXJuLT5yZXNldCgpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBtZWRpYTo6Vm9sdW1lU2hhcGVyU3RhdGUgYWlkbDsKKyAgICBsZWdhY3ktPndyaXRlVG9QYXJjZWxhYmxlKCZhaWRsKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gYWlkbDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Z2V0RHVhbE1vbm9Nb2RlKG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZSogX2FpZGxfcmV0dXJuKQogewotICAgIHJldHVybiBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChFZmZlY3RJZCk7CisgICAgYXVkaW9fZHVhbF9tb25vX21vZGVfdCBtb2RlID0gQVVESU9fRFVBTF9NT05PX01PREVfT0ZGOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0RHVhbE1vbm9Nb2RlKCZtb2RlKQorICAgICAgICAgICAgPzogQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlRHVhbE1vbm9Nb2RlKG1vZGUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2R1YWxfbW9ub19tb2RlX3RfQXVkaW9EdWFsTW9ub01vZGUobW9kZSkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgewotICAgIHJldHVybiBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKLX0KLQotVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+YXBwbHlWb2x1bWVTaGFwZXIoY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uKTsKLX0KLQotc3A8Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0Vm9sdW1lU2hhcGVyU3RhdGUoaWQpOwotfQotCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZXREdWFsTW9ub01vZGUoCisgICAgICAgIG1lZGlhOjpBdWRpb0R1YWxNb25vTW9kZSBtb2RlKQogewotICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgIGNvbnN0IGF1dG8gbG9jYWxNb25vTW9kZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EdWFsTW9ub01vZGVfYXVkaW9fZHVhbF9tb25vX21vZGVfdChtb2RlKSk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUR1YWxNb25vTW9kZShsb2NhbE1vbm9Nb2RlKQorICAgICAgICAgICAgPzogbVRyYWNrLT5zZXREdWFsTW9ub01vZGUobG9jYWxNb25vTW9kZSkpOwogfQogCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2lnbmFsKCkKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQqIF9haWRsX3JldHVybikKIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zaWduYWwoKTsKKyAgICBmbG9hdCBsZXZlbGRCID0gLXN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKCZsZXZlbGRCKQorICAgICAgICAgICAgPzogQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGxldmVsZEIpOworICAgIGlmIChzdGF0dXMgPT0gT0spICpfYWlkbF9yZXR1cm4gPSBsZXZlbGRCOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCitTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0IGxldmVsZEIpCiB7Ci0gICAgcmV0dXJuIEJuQXVkaW9UcmFjazo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwobGV2ZWxkQikKKyAgICAgICAgICAgICA/OiBtVHJhY2stPnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChsZXZlbGRCKSk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpnZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICBtZWRpYTo6QXVkaW9QbGF5YmFja1JhdGUqIF9haWRsX3JldHVybikKK3sKKyAgICBhdWRpb19wbGF5YmFja19yYXRlX3QgbG9jYWxQbGF5YmFja1JhdGV7fTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMoJmxvY2FsUGxheWJhY2tSYXRlKQorICAgICAgICAgICAgPzogQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlUGxheWJhY2tSYXRlKGxvY2FsUGxheWJhY2tSYXRlKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wbGF5YmFja19yYXRlX3RfQXVkaW9QbGF5YmFja1JhdGUobG9jYWxQbGF5YmFja1JhdGUpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7Cit9CisKK1N0YXR1cyBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9QbGF5YmFja1JhdGUmIHBsYXliYWNrUmF0ZSkKK3sKKyAgICBjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QgbG9jYWxQbGF5YmFja1JhdGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUGxheWJhY2tSYXRlX2F1ZGlvX3BsYXliYWNrX3JhdGVfdChwbGF5YmFja1JhdGUpKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlUGxheWJhY2tSYXRlKGxvY2FsUGxheWJhY2tSYXRlKQorICAgICAgICAgICAgPzogbVRyYWNrLT5zZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKGxvY2FsUGxheWJhY2tSYXRlKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NiwxMSArNDk5LDEzIEBACiAvLyBzdGF0aWMKIHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcj4KIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQoCi0gICAgICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgaW50IGlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCisgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBpbnQgaWQsCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCiB7CisgICAgVmVjdG9yIDxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKKyAgICBnZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKICAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKLSAgICAgICAgVmVjdG9yIDxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgICAgIGdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOwogICAgICAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IG5vdCBtdXRpbmcgdHJhY2s6JWQgdXNhZ2U6JWQgZm9yIHNlcnZpY2UgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgIGlkLApAQCAtNDEwLDEyICs1MjUsMTYgQEAKICAgICAgICAgICAgIGlkLCBhdHRyLmZsYWdzKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIHJldHVybiBuZXcgT3BQbGF5QXVkaW9Nb25pdG9yKHVpZCwgYXR0ci51c2FnZSwgaWQpOworCisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBjaGVja2VkQXR0cmlidXRpb25Tb3VyY2UgPSBBdWRpb0ZsaW5nZXI6OmNoZWNrQXR0cmlidXRpb25Tb3VyY2VQYWNrYWdlKAorICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UpOworICAgIHJldHVybiBuZXcgT3BQbGF5QXVkaW9Nb25pdG9yKGNoZWNrZWRBdHRyaWJ1dGlvblNvdXJjZSwgYXR0ci51c2FnZSwgaWQpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6Ok9wUGxheUF1ZGlvTW9uaXRvcigKLSAgICAgICAgdWlkX3QgdWlkLCBhdWRpb191c2FnZV90IHVzYWdlLCBpbnQgaWQpCi0gICAgICAgIDogbUhhc09wUGxheUF1ZGlvKHRydWUpLCBtVWlkKHVpZCksIG1Vc2FnZSgoaW50MzJfdCkgdXNhZ2UpLCBtSWQoaWQpCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLCBhdWRpb191c2FnZV90IHVzYWdlLCBpbnQgaWQpCisgICAgICAgIDogbUhhc09wUGxheUF1ZGlvKHRydWUpLCBtQXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpLCBtVXNhZ2UoKGludDMyX3QpIHVzYWdlKSwKKyAgICAgICAgbUlkKGlkKQogewogfQogCkBAIC00MjksMTEgKzU0OCwxMyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6b25GaXJzdFJlZigpCiB7Ci0gICAgZ2V0UGFja2FnZXNGb3JVaWQobVVpZCwgbVBhY2thZ2VzKTsKICAgICBjaGVja1BsYXlBdWRpb0ZvclVzYWdlKCk7Ci0gICAgaWYgKCFtUGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKG1BdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS5oYXNfdmFsdWUoKSkgewogICAgICAgICBtT3BDYWxsYmFjayA9IG5ldyBQbGF5QXVkaW9PcENhbGxiYWNrKHRoaXMpOwotICAgICAgICBtQXBwT3BzTWFuYWdlci5zdGFydFdhdGNoaW5nTW9kZShBcHBPcHNNYW5hZ2VyOjpPUF9QTEFZX0FVRElPLCBtUGFja2FnZXNbMF0sIG1PcENhbGxiYWNrKTsKKyAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ01vZGUoQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTywKKyAgICAgICAgICAgIFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X3N0cmluZ192aWV3X1N0cmluZzE2KAorICAgICAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlX29yKCIiKSkpCisgICAgICAgICAgICAsIG1PcENhbGxiYWNrKTsKICAgICB9CiB9CiAKQEAgLTQ0NiwxOCArNTY3LDE0IEBACiAvLyAtIG5vdCBjYWxsZWQgZnJvbSBQbGF5QXVkaW9PcENhbGxiYWNrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyBjYXNlCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6Y2hlY2tQbGF5QXVkaW9Gb3JVc2FnZSgpCiB7Ci0gICAgaWYgKG1QYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICBpZiAoIW1BdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS5oYXNfdmFsdWUoKSkgewogICAgICAgICBtSGFzT3BQbGF5QXVkaW8uc3RvcmUoZmFsc2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgaGFzSXQgPSB0cnVlOwotICAgICAgICBmb3IgKGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSA6IG1QYWNrYWdlcykgewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBtb2RlID0gbUFwcE9wc01hbmFnZXIuY2hlY2tBdWRpb09wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9QTEFZX0FVRElPLAotICAgICAgICAgICAgICAgICAgICBtVXNhZ2UsIG1VaWQsIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChtb2RlICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgICAgIGhhc0l0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmcxNihtQXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUudmFsdWVfb3IoIiIpKSk7CisgICAgICAgIGJvb2wgaGFzSXQgPSBtQXBwT3BzTWFuYWdlci5jaGVja0F1ZGlvT3BOb1Rocm93KEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8sCisgICAgICAgICAgICAgICAgICAgIG1Vc2FnZSwgdWlkLCBwYWNrYWdlTmFtZSkgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEOwogICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IHRyYWNrOiVkIHVzYWdlOiVkICVzbXV0ZWQiLCBtSWQsIG1Vc2FnZSwgaGFzSXQgPyAibm90ICIgOiAiIik7CiAgICAgICAgIG1IYXNPcFBsYXlBdWRpby5zdG9yZShoYXNJdCk7CiAgICAgfQpAQCAtNTA3LDExICs2MjQsMTIgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKLSAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50VG9CZVJlYWR5KQorICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHksCisgICAgICAgICAgICBmbG9hdCBzcGVlZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgY2xpZW50LCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwogICAgICAgICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCkBAIC01MTksNyArNjM3LDggQEAKICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgogICAgICAgICAgICAgICAgICAgKHNoYXJlZEJ1ZmZlciAhPSAwKSA/IHNoYXJlZEJ1ZmZlci0+dW5zZWN1cmVQb2ludGVyKCkgOiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5zaXplKCkgOiBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsIHRydWUgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLAorICAgICAgICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKSwgdHJ1ZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICBwb3J0SWQsCkBAIC01MzEsMTIgKzY1MCwxMSBAQAogICAgIG1NYWluQnVmZmVyKHRocmVhZC0+c2lua0J1ZmZlcigpKSwKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLAotICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcygwKSwKICAgICBtRnJhbWVNYXAoMTYgLyogc2luay1mcmFtZS10by10cmFjay1mcmFtZSBtYXAgbWVtb3J5ICovKSwKICAgICBtVm9sdW1lSGFuZGxlcihuZXcgbWVkaWE6OlZvbHVtZUhhbmRsZXIoc2FtcGxlUmF0ZSkpLAotICAgIG1PcFBsYXlBdWRpb01vbml0b3IoT3BQbGF5QXVkaW9Nb25pdG9yOjpjcmVhdGVJZk5lZWRlZCh1aWQsIGF0dHIsIGlkKCksIHN0cmVhbVR5cGUpKSwKKyAgICBtT3BQbGF5QXVkaW9Nb25pdG9yKE9wUGxheUF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQoYXR0cmlidXRpb25Tb3VyY2UsIGF0dHIsIGlkKCksCisgICAgICAgIHN0cmVhbVR5cGUpKSwKICAgICAvLyBtU2lua1RpbWVzdGFtcAotICAgIG1GcmFtZUNvdW50VG9CZVJlYWR5KGZyYW1lQ291bnRUb0JlUmVhZHkpLAogICAgIG1GYXN0SW5kZXgoLTEpLAogICAgIG1DYWNoZWRWb2x1bWUoMS4wKSwKICAgICAvKiBUaGUgdHJhY2sgbWlnaHQgbm90IHBsYXkgaW1tZWRpYXRlbHkgYWZ0ZXIgYmVpbmcgYWN0aXZlLCBzaW1pbGFybHkgYXMgaWYgaXRzIHZvbHVtZSB3YXMgMC4KQEAgLTU0NCw3ICs2NjIsOCBAQAogICAgIG1GaW5hbFZvbHVtZSgwLmYpLAogICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKSwKICAgICBtRmx1c2hId1BlbmRpbmcoZmFsc2UpLAotICAgIG1GbGFncyhmbGFncykKKyAgICBtRmxhZ3MoZmxhZ3MpLAorICAgIG1TcGVlZChzcGVlZCkKIHsKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwpAQCAtNTU2LDYgKzY3NSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnVpZCkpOwogICAgIGlmICghdGhyZWFkLT5pc1RyYWNrQWxsb3dlZF9sKGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNlc3Npb25JZCwgdWlkKSkgewogICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmVsZWFzZUNibGsoKTsgLy8gdGhpcyBtYWtlcyB0aGUgdHJhY2sgaW52YWxpZC4KQEAgLTU3MCw2ICs2OTAsNyBAQAogICAgICAgICAgICAgICAgIG1GcmFtZVNpemUsIHNhbXBsZVJhdGUpOwogICAgIH0KICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OworICAgIG1TZXJ2ZXJQcm94eS0+c2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcyhmcmFtZUNvdW50VG9CZVJlYWR5KTsgLy8gdXBkYXRlIHRoZSBDYmxrIHZhbHVlCiAKICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQogICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKQEAgLTU5NSwxNSArNzE2LDIwIEBACiAgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKICNlbmRpZgogCi0gICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgaWYgKHRocmVhZC0+c3VwcG9ydHNIYXB0aWNQbGF5YmFjaygpKSB7CisgICAgICAgIC8vIElmIHRoZSB0cmFjayBpcyBhdHRhY2hlZCB0byBoYXB0aWMgcGxheWJhY2sgdGhyZWFkLCBpdCBpcyBwb3RlbnRpYWxseSB0byBoYXZlCisgICAgICAgIC8vIEhhcHRpY0dlbmVyYXRvciBlZmZlY3QsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgaGFwdGljIGRhdGEsIG9uIHRoZSB0cmFjay4gSW4gdGhhdCBjYXNlLAorICAgICAgICAvLyBleHRlcm5hbCB2aWJyYXRpb24gaXMgYWx3YXlzIGNyZWF0ZWQgZm9yIGFsbCB0cmFja3MgYXR0YWNoZWQgdG8gaGFwdGljIHBsYXliYWNrIHRocmVhZC4KICAgICAgICAgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlciA9IG5ldyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIodGhpcyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lID0gYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUuaGFzX3ZhbHVlKCkgPworICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUudmFsdWUoKSA6ICIiOwogICAgICAgICBtRXh0ZXJuYWxWaWJyYXRpb24gPSBuZXcgb3M6OkV4dGVybmFsVmlicmF0aW9uKAotICAgICAgICAgICAgICAgIG1VaWQsICIiIC8qIHBrZyAqLywgbUF0dHIsIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIpOworICAgICAgICAgICAgICAgIG1VaWQsIHBhY2thZ2VOYW1lLCBtQXR0ciwgbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcik7CiAgICAgfQogCiAgICAgLy8gT25jZSB0aGlzIGl0ZW0gaXMgbG9nZ2VkIGJ5IHRoZSBzZXJ2ZXIsIHRoZSBjbGllbnQgY2FuIGFkZCBwcm9wZXJ0aWVzLgogICAgIGNvbnN0IGNoYXIgKiBjb25zdCB0cmFpdHMgPSBzaGFyZWRCdWZmZXIgPT0gMCA/ICIiIDogInN0YXRpYyI7Ci0gICAgbVRyYWNrTWV0cmljcy5sb2dDb25zdHJ1Y3RvcihjcmVhdG9yUGlkLCB1aWQsIHRyYWl0cywgc3RyZWFtVHlwZSk7CisgICAgbVRyYWNrTWV0cmljcy5sb2dDb25zdHJ1Y3RvcihjcmVhdG9yUGlkLCB1aWQsIGlkKCksIHRyYWl0cywgc3RyZWFtVHlwZSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQpAQCAtODk3LDcgKzEwMjMsMTAgQEAKICAgICB9CiAKICAgICBzaXplX3QgYnVmZmVyU2l6ZUluRnJhbWVzID0gbVNlcnZlclByb3h5LT5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKTsKLSAgICBzaXplX3QgZnJhbWVzVG9CZVJlYWR5ID0gc3RkOjptaW4obUZyYW1lQ291bnRUb0JlUmVhZHksIGJ1ZmZlclNpemVJbkZyYW1lcyk7CisgICAgLy8gTm90ZTogbVNlcnZlclByb3h5LT5nZXRTdGFydFRocmVzaG9sZEluRnJhbWVzKCkgaXMgY2xhbXBlZC4KKyAgICBjb25zdCBzaXplX3Qgc3RhcnRUaHJlc2hvbGRJbkZyYW1lcyA9IG1TZXJ2ZXJQcm94eS0+Z2V0U3RhcnRUaHJlc2hvbGRJbkZyYW1lcygpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZXNUb0JlUmVhZHkgPSBzdGQ6OmNsYW1wKCAgLy8gY2xhbXAgYWdhaW4gdG8gdmFsaWRhdGUgY2xpZW50IHZhbHVlcy4KKyAgICAgICAgICAgIHN0ZDo6bWluKHN0YXJ0VGhyZXNob2xkSW5GcmFtZXMsIGJ1ZmZlclNpemVJbkZyYW1lcyksIHNpemVfdCgxKSwgbUZyYW1lQ291bnQpOwogCiAgICAgaWYgKGZyYW1lc1JlYWR5KCkgPj0gZnJhbWVzVG9CZVJlYWR5IHx8IChtQ2Jsay0+bUZsYWdzICYgQ0JMS19GT1JDRVJFQURZKSkgewogICAgICAgICBBTE9HVigiJXMoJWQpOiBjb25zaWRlciB0cmFjayByZWFkeSB3aXRoICV6dS8lenUsIHRhcmdldCB3YXMgJXp1KSIsCkBAIC05MzYsNiArMTA2NSwxMyBAQAogICAgICAgICAvLyBpbml0aWFsIHN0YXRlLXN0b3BwaW5nLiBuZXh0IHN0YXRlLXBhdXNpbmcuCiAgICAgICAgIC8vIFdoYXQgaWYgcmVzdW1lIGlzIGNhbGxlZCA/CiAKKyAgICAgICAgaWYgKHN0YXRlID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIC8vIGF2b2lkIHVuZGVycnVuIGdsaXRjaGVzIHdoZW4gc3RhcnRpbmcgYWZ0ZXIgZmx1c2gKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhciBtUGF1c2VId1BlbmRpbmcgYmVjYXVzZSBvZiBwYXVzZSAoYW5kIHBvc3NpYmx5IGZsdXNoKSBkdXJpbmcgdW5kZXJydW4uCisgICAgICAgIG1QYXVzZUh3UGVuZGluZyA9IGZhbHNlOwogICAgICAgICBpZiAoc3RhdGUgPT0gUEFVU0VEIHx8IHN0YXRlID09IFBBVVNJTkcpIHsKICAgICAgICAgICAgIGlmIChtUmVzdW1lVG9TdG9wcGluZykgewogICAgICAgICAgICAgICAgIC8vIGhhcHBlbmVkIHdlIG5lZWQgdG8gcmVzdW1lIHRvIFNUT1BQSU5HXzEKQEAgLTEwNjcsNiArMTIwMyw5IEBACiAgICAgICAgICAgICBtU3RhdGUgPSBQQVVTSU5HOwogICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgb24gdGhyZWFkICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOworICAgICAgICAgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICAgICAgICAgIG1QYXVzZUh3UGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0xMTU0LDYgKzEyOTMsMTEgQEAKICAgICBtRmx1c2hId1BlbmRpbmcgPSBmYWxzZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2VBY2soKQoreworICAgIG1QYXVzZUh3UGVuZGluZyA9IGZhbHNlOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZXNldCgpCiB7CiAgICAgLy8gRG8gbm90IHJlc2V0IHR3aWNlIHRvIGF2b2lkIGRpc2NhcmRpbmcgZGF0YSB3cml0dGVuIGp1c3QgYWZ0ZXIgYSBmbHVzaCBhbmQgYmVmb3JlCkBAIC0xMjUxLDE2ICsxMzk1LDI0IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3QKIHsKLSAgICAqYmFja0luc2VydGVyKysgPSB7CisgICAgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGFfdjdfdCBtZXRhZGF0YTsKKyAgICBtZXRhZGF0YS5iYXNlID0gewogICAgICAgICAgICAgLnVzYWdlID0gbUF0dHIudXNhZ2UsCiAgICAgICAgICAgICAuY29udGVudF90eXBlID0gbUF0dHIuY29udGVudF90eXBlLAogICAgICAgICAgICAgLmdhaW4gPSBtRmluYWxWb2x1bWUsCiAgICAgfTsKKyAgICBtZXRhZGF0YS5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2ssCisgICAgc3RybmNweShtZXRhZGF0YS50YWdzLCBtQXR0ci50YWdzLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUpOworICAgICpiYWNrSW5zZXJ0ZXIrKyA9IG1ldGFkYXRhOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXRUZWVQYXRjaGVzKFRlZVBhdGNoZXMgdGVlUGF0Y2hlcykgewogICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5kZXN0cm95KCk7IH0pOwogICAgIG1UZWVQYXRjaGVzID0gc3RkOjptb3ZlKHRlZVBhdGNoZXMpOworICAgIGlmIChtU3RhdGUgPT0gVHJhY2tCYXNlOjpBQ1RJVkUgfHwgbVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcgfHwKKyAgICAgICAgICAgIG1TdGF0ZSA9PSBUcmFja0Jhc2U6OlNUT1BQSU5HXzEpIHsKKyAgICAgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPnN0YXJ0KCk7IH0pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQpAQCAtMTMwOSw2ICsxNDYxLDcgQEAKICAgICBtQXV4QnVmZmVyID0gYnVmZmVyOwogfQogCisvLyBwcmVzZW50YXRpb25Db21wbGV0ZSB2ZXJpZmllZCBieSBmcmFtZXMsIHVzZWQgYnkgTWl4ZWQgdHJhY2tzLgogYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cHJlc2VudGF0aW9uQ29tcGxldGUoCiAgICAgICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbiwgc2l6ZV90IGF1ZGlvSGFsRnJhbWVzKQogewpAQCAtMTMyNywzMCArMTQ4MCw3MCBAQAogICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIChsb25nIGxvbmcpZnJhbWVzV3JpdHRlbik7CiAgICAgaWYgKG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9PSAwKSB7CiAgICAgICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IGZyYW1lc1dyaXR0ZW4gKyBhdWRpb0hhbEZyYW1lczsKLSAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgIEFMT0dWKCIlcyglZCk6IHNldDoiCiAgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKICAgICBib29sIGNvbXBsZXRlOwotICAgIGlmIChpc09mZmxvYWRlZCgpKSB7Ci0gICAgICAgIGNvbXBsZXRlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGlzRGlyZWN0KCkgfHwgaXNGYXN0VHJhY2soKSkgeyAvLyB0aGVzZSBkbyBub3QgZ28gdGhyb3VnaCBsaW5lYXIgbWFwCisgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsgLy8gZG9lcyBub3QgZ28gdGhyb3VnaCBsaW5lYXIgbWFwCiAgICAgICAgIGNvbXBsZXRlID0gZnJhbWVzV3JpdHRlbiA+PSAoaW50NjRfdCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzOworICAgICAgICBBTE9HVigiJXMoJWQpOiAlcyBmcmFtZXNXcml0dGVuOiVsbGQgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lczolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoY29tcGxldGUgPyAiY29tcGxldGUiIDogIndhaXRpbmciKSwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZXNXcml0dGVuLCAobG9uZyBsb25nKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMpOwogICAgIH0gZWxzZSB7ICAvLyBOb3JtYWwgdHJhY2tzLCBPdXRwdXRUcmFja3MsIGFuZCBQYXRjaFRyYWNrcwogICAgICAgICBjb21wbGV0ZSA9IGZyYW1lc1dyaXR0ZW4gPj0gKGludDY0X3QpIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcwogICAgICAgICAgICAgICAgICYmIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmlzRHJhaW5lZCgpOwogICAgIH0KIAogICAgIGlmIChjb21wbGV0ZSkgewotICAgICAgICB0cmlnZ2VyRXZlbnRzKEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX1BSRVNFTlRBVElPTl9DT01QTEVURSk7Ci0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFN0cmVhbUVuZERvbmUoKTsKKyAgICAgICAgbm90aWZ5UHJlc2VudGF0aW9uQ29tcGxldGUoKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAorLy8gcHJlc2VudGF0aW9uQ29tcGxldGUgY2hlY2tlZCBieSB0aW1lLCB1c2VkIGJ5IERpcmVjdFRyYWNrcy4KK2Jvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnByZXNlbnRhdGlvbkNvbXBsZXRlKHVpbnQzMl90IGxhdGVuY3lNcykKK3sKKyAgICAvLyBGb3IgT2ZmbG9hZGVkIG9yIERpcmVjdCB0cmFja3MuCisKKyAgICAvLyBGb3IgYSBkaXJlY3QgdHJhY2ssIHdlIGluY29ycG9yYXRlZCB0aW1lIGJhc2VkIHRlc3RpbmcgZm9yIHByZXNlbnRhdGlvbkNvbXBsZXRlLgorCisgICAgLy8gRm9yIGFuIG9mZmxvYWRlZCB0cmFjayB0aGUgSEFMK2gvdyBkZWxheSBpcyB2YXJpYWJsZSBzbyBhIEhBTCBkcmFpbigpIGlzIHVzZWQKKyAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBsYXRlbmN5TXMgaXNuJ3QKKyAgICAvLyB1c2VmdWwgYmVjYXVzZSBpdCBkb2Vzbid0IGFsd2F5cyByZWZsZWN0IHdoZXRoZXIgdGhlcmUgaXMgZGF0YSBpbiB0aGUgaC93CisgICAgLy8gYnVmZmVycywgcGFydGljdWxhcmx5IGlmIGEgdHJhY2sgaGFzIGJlZW4gcGF1c2VkIGFuZCByZXN1bWVkIGR1cmluZyBkcmFpbmluZworCisgICAgY29uc3RleHByIGZsb2F0IE1JTl9TUEVFRCA9IDAuMTI1ZjsgLy8gbWluIHNwZWVkIHNjYWxpbmcgYWxsb3dlZCBmb3IgdGltZWx5IHJlc3BvbnNlLgorICAgIGlmIChtUHJlc2VudGF0aW9uQ29tcGxldGVUaW1lTnMgPT0gMCkgeworICAgICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVUaW1lTnMgPSBzeXN0ZW1UaW1lKCkgKyBsYXRlbmN5TXMgKiAxZTYgLyBmbWF4KG1TcGVlZCwgTUlOX1NQRUVEKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogc2V0OiBsYXRlbmN5TXMgJXUgIG1QcmVzZW50YXRpb25Db21wbGV0ZVRpbWVOczolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBsYXRlbmN5TXMsIChsb25nIGxvbmcpIG1QcmVzZW50YXRpb25Db21wbGV0ZVRpbWVOcyk7CisgICAgfQorCisgICAgYm9vbCBjb21wbGV0ZTsKKyAgICBpZiAoaXNPZmZsb2FkZWQoKSkgeworICAgICAgICBjb21wbGV0ZSA9IHRydWU7CisgICAgfSBlbHNlIHsgLy8gRGlyZWN0CisgICAgICAgIGNvbXBsZXRlID0gc3lzdGVtVGltZSgpID49IG1QcmVzZW50YXRpb25Db21wbGV0ZVRpbWVOczsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogJXMiLCBfX2Z1bmNfXywgbUlkLCAoY29tcGxldGUgPyAiY29tcGxldGUiIDogIndhaXRpbmciKSk7CisgICAgfQorICAgIGlmIChjb21wbGV0ZSkgeworICAgICAgICBub3RpZnlQcmVzZW50YXRpb25Db21wbGV0ZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpub3RpZnlQcmVzZW50YXRpb25Db21wbGV0ZSgpCit7CisgICAgLy8gVGhpcyBvbmx5IHRyaWdnZXJzIG9uY2UuIFRPRE86IHNob3VsZCB3ZSBlbmZvcmNlIHRoaXM/CisgICAgdHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOworICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldFN0cmVhbUVuZERvbmUoKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6dHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IHR5cGUpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3luY0V2ZW50cy5zaXplKCk7KSB7CkBAIC0xNDM3LDYgKzE2MzAsMTA4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QqIG1vZGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqdCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0LT5tTG9jayk7CisgICAgICAgICAgICBzdGF0dXMgPSB0LT5tT3V0cHV0LT5zdHJlYW0tPmdldER1YWxNb25vTW9kZShtb2RlKTsKKyAgICAgICAgICAgIEFMT0dEX0lGKChzdGF0dXMgPT0gTk9fRVJST1IpICYmIChtRHVhbE1vbm9Nb2RlICE9ICptb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBtb2RlICVkIGluY29uc2lzdGVudCIsIF9fZnVuY19fLCBtRHVhbE1vbm9Nb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0RHVhbE1vbm9Nb2RlKGF1ZGlvX2R1YWxfbW9ub19tb2RlX3QgbW9kZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gdCA9IHN0YXRpY19jYXN0PFBsYXliYWNrVGhyZWFkICo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayh0LT5tTG9jayk7CisgICAgICAgICAgICBzdGF0dXMgPSB0LT5tT3V0cHV0LT5zdHJlYW0tPnNldER1YWxNb25vTW9kZShtb2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtRHVhbE1vbm9Nb2RlID0gbW9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGZsb2F0KiBsZXZlbGRCKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYXV0byB0ID0gc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4odGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHQtPm1Mb2NrKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHQtPm1PdXRwdXQtPnN0cmVhbS0+Z2V0QXVkaW9EZXNjcmlwdGlvbk1peExldmVsKGxldmVsZEIpOworICAgICAgICAgICAgQUxPR0RfSUYoKHN0YXR1cyA9PSBOT19FUlJPUikgJiYgKG1BdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwgIT0gKmxldmVsZEIpLAorICAgICAgICAgICAgICAgICAgICAiJXM6IGxldmVsICUuM2YgaW5jb25zaXN0ZW50IiwgX19mdW5jX18sIG1BdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXRBdWRpb0Rlc2NyaXB0aW9uTWl4TGV2ZWwoZmxvYXQgbGV2ZWxkQikKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gdCA9IHN0YXRpY19jYXN0PFBsYXliYWNrVGhyZWFkICo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayh0LT5tTG9jayk7CisgICAgICAgICAgICBzdGF0dXMgPSB0LT5tT3V0cHV0LT5zdHJlYW0tPnNldEF1ZGlvRGVzY3JpcHRpb25NaXhMZXZlbChsZXZlbGRCKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9EZXNjcmlwdGlvbk1peExldmVsID0gbGV2ZWxkQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6Z2V0UGxheWJhY2tSYXRlUGFyYW1ldGVycygKKyAgICAgICAgYXVkaW9fcGxheWJhY2tfcmF0ZV90KiBwbGF5YmFja1JhdGUpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgaWYgKHRocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIHQgPSBzdGF0aWNfY2FzdDxQbGF5YmFja1RocmVhZCAqPih0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sodC0+bUxvY2spOworICAgICAgICAgICAgc3RhdHVzID0gdC0+bU91dHB1dC0+c3RyZWFtLT5nZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKHBsYXliYWNrUmF0ZSk7CisgICAgICAgICAgICBBTE9HRF9JRigoc3RhdHVzID09IE5PX0VSUk9SKSAmJgorICAgICAgICAgICAgICAgICAgICAhaXNBdWRpb1BsYXliYWNrUmF0ZUVxdWFsKG1QbGF5YmFja1JhdGVQYXJhbWV0ZXJzLCAqcGxheWJhY2tSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBwbGF5YmFja1JhdGUgaW5jb25zaXN0ZW50IiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpzZXRQbGF5YmFja1JhdGVQYXJhbWV0ZXJzKAorICAgICAgICBjb25zdCBhdWRpb19wbGF5YmFja19yYXRlX3QmIHBsYXliYWNrUmF0ZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgICAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF1dG8gdCA9IHN0YXRpY19jYXN0PFBsYXliYWNrVGhyZWFkICo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayh0LT5tTG9jayk7CisgICAgICAgICAgICBzdGF0dXMgPSB0LT5tT3V0cHV0LT5zdHJlYW0tPnNldFBsYXliYWNrUmF0ZVBhcmFtZXRlcnMocGxheWJhY2tSYXRlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtUGxheWJhY2tSYXRlUGFyYW1ldGVycyA9IHBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIGJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmlzUmVzdW1lUGVuZGluZygpIHsKIApAQCAtMTU4OSwxMiArMTg4NCwxMiBAQAogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlKQogICAgIDogICBUcmFjayhwbGF5YmFja1RocmVhZCwgTlVMTCwgQVVESU9fU1RSRUFNX1BBVENILAogICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBvdXRwdXQgdHJhY2sgKi8sCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgbnVsbHB0ciAvKiBzaGFyZWRCdWZmZXIgKi8sCi0gICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0cGlkKCksIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgYXR0cmlidXRpb25Tb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgIFRZUEVfT1VUUFVUKSwKICAgICBtQWN0aXZlKGZhbHNlKSwgbVNvdXJjZVRocmVhZChzb3VyY2VUaHJlYWQpCiB7CkBAIC0xODI0LDggKzIxMTksOCBAQAogICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKLSAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgQUlEX0FVRElPU0VSVkVSLCBmbGFncywgVFlQRV9QQVRDSCwKLSAgICAgICAgICAgICAgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgZnJhbWVDb3VudFRvQmVSZWFkeSksCisgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0cGlkKCksIGF1ZGlvU2VydmVyQXR0cmlidXRpb25Tb3VyY2UoZ2V0cGlkKCkpLCBmbGFncywKKyAgICAgICAgICAgICAgVFlQRV9QQVRDSCwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgZnJhbWVDb3VudFRvQmVSZWFkeSksCiAgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICpwbGF5YmFja1RocmVhZCwgdGltZW91dCkKIHsKQEAgLTE5MTgsNiArMjIxMywyNSBAQAogewogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogICAgIHJlc3RhcnRJZkRpc2FibGVkKCk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgUGF0Y2hUcmFjayBoYXMgZW5vdWdoIGRhdGEgdG8gd3JpdGUgb25jZSBpbiByZWxlYXNlQnVmZmVyKCkuCisgICAgLy8gSWYgbm90LCBwcmV2ZW50IGFuIHVuZGVycnVuIGZyb20gb2NjdXJyaW5nIGJ5IG1vdmluZyB0aGUgdHJhY2sgaW50byBGU19GSUxMSU5HOworICAgIC8vIHRoaXMgbG9naWMgYXZvaWRzIGdsaXRjaGVzIHdoZW4gc3VzcGVuZGluZyBBMkRQIHdpdGggQXVkaW9QbGF5YmFja0NhcHR1cmUuCisgICAgLy8gVE9ETzogcGVyaGFwcyB1bmRlcnJ1biBhdm9pZGFuY2UgY291bGQgYmUgYSB0cmFjayBwcm9wZXJ0eSBjaGVja2VkIGluIGlzUmVhZHkoKSBpbnN0ZWFkLgorICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzID09IEZTX0FDVElWRQorICAgICAgICAgICAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KQorICAgICAgICAgICAgJiYgIWlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBpZiAoc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgICB0aHJlYWQgIT0gMCkgeworICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogc2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgICAgICAgIC8gcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSgpIDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCkgTm90IGVub3VnaCBkYXRhLCB3YWl0IGZvciBidWZmZXIgdG8gZmlsbCIsIF9fZnVuY19fLCBtSWQpOworICAgICAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlc3RhcnRJZkRpc2FibGVkKCkKQEAgLTE5MzMsMTEwICsyMjQ3LDYgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgICAgIEFwcE9wIGZvciBhdWRpbyByZWNvcmRpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI3VuZGVmIExPR19UQUcKLSNkZWZpbmUgTE9HX1RBRyAiQUY6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yIgotCi0vLyBzdGF0aWMKLXNwPEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcj4KLUF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQoCi0gICAgICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCi17Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7Ci0gICAgICAgIEFMT0dWKCJub3Qgc2lsZW5jaW5nIHJlY29yZCBmb3Igc2VydmljZSB1aWQ6JWQgcGFjazolcyIsCi0gICAgICAgICAgICAgICAgdWlkLCBTdHJpbmc4KG9wUGFja2FnZU5hbWUpLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8gQ2FwdHVyaW5nIGZyb20gRk0gVFVORVIgb3V0cHV0IGlzIG5vdCBjb250cm9sbGVkIGJ5IE9QX1JFQ09SRF9BVURJTwotICAgIC8vIGJlY2F1c2UgaXQgZG9lcyBub3QgYWZmZWN0IHVzZXJzIHByaXZhY3kgYXMgZG9lcyBjYXB0dXJpbmcgZnJvbSBhbiBhY3R1YWwgbWljcm9waG9uZS4KLSAgICBpZiAoYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSB7Ci0gICAgICAgIEFMT0dWKCJub3QgbXV0aW5nIEZNIFRVTkVSIGNhcHR1cmUgZm9yIHVpZCAlZCIsIHVpZCk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIGlmIChvcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgICAgIC8vIG5vIHBhY2thZ2UgbmFtZSwgaGFwcGVucyB3aXRoIFNMIEVTIGNsaWVudHMKLSAgICAgICAgLy8gcXVlcnkgcGFja2FnZSBtYW5hZ2VyIHRvIGZpbmQgb25lCi0gICAgICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKLSAgICAgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigidXNpbmcgcGFjazolcyBmb3IgdWlkOiVkIiwgU3RyaW5nOChwYWNrYWdlc1swXSkuc3RyaW5nKCksIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9wUmVjb3JkQXVkaW9Nb25pdG9yKHVpZCwgcGFja2FnZXNbMF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBPcFJlY29yZEF1ZGlvTW9uaXRvcih1aWQsIG9wUGFja2FnZU5hbWUpOwotfQotCi1BdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yKAotICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQotICAgICAgICA6IG1IYXNPcFJlY29yZEF1ZGlvKHRydWUpLCBtVWlkKHVpZCksIG1QYWNrYWdlKG9wUGFja2FnZU5hbWUpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6fk9wUmVjb3JkQXVkaW9Nb25pdG9yKCkKLXsKLSAgICBpZiAobU9wQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcENhbGxiYWNrKTsKLSAgICB9Ci0gICAgbU9wQ2FsbGJhY2suY2xlYXIoKTsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6Om9uRmlyc3RSZWYoKQotewotICAgIGNoZWNrUmVjb3JkQXVkaW8oKTsKLSAgICBtT3BDYWxsYmFjayA9IG5ldyBSZWNvcmRBdWRpb09wQ2FsbGJhY2sodGhpcyk7Ci0gICAgQUxPR1YoInN0YXJ0IHdhdGNoaW5nIE9QX1JFQ09SRF9BVURJTyBmb3IgcGFjazolcyIsIFN0cmluZzgobVBhY2thZ2UpLnN0cmluZygpKTsKLSAgICBtQXBwT3BzTWFuYWdlci5zdGFydFdhdGNoaW5nTW9kZShBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU8sIG1QYWNrYWdlLCBtT3BDYWxsYmFjayk7Ci19Ci0KLWJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpoYXNPcFJlY29yZEF1ZGlvKCkgY29uc3QgewotICAgIHJldHVybiBtSGFzT3BSZWNvcmRBdWRpby5sb2FkKCk7Ci19Ci0KLS8vIENhbGxlZCBieSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgd2hlbiBPUF9SRUNPUkRfQVVESU8gaXMgdXBkYXRlZCBpbiBBcHBPcCBjYWxsYmFjawotLy8gYW5kIGluIG9uRmlyc3RSZWYoKQotLy8gTm90ZSB0aGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgKGFuZCBuZXZlciB0byBiZSkgZm9yIGF1ZGlvIHNlcnZlciAvIHJvb3QgdHJhY2sKLS8vIGR1ZSB0byB0aGUgVUlEIGluIGNyZWF0ZUlmTmVlZGVkKCkuIEFzIGEgcmVzdWx0IGZvciB0aG9zZSByZWNvcmQgdHJhY2ssIGl0J3M6Ci0vLyAtIG5vdCBjYWxsZWQgZnJvbSBjb25zdHJ1Y3RvciwKLS8vIC0gbm90IGNhbGxlZCBmcm9tIFJlY29yZEF1ZGlvT3BDYWxsYmFjayBiZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkIGluIHRoaXMgY2FzZQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6OmNoZWNrUmVjb3JkQXVkaW8oKQotewotICAgIGNvbnN0IGludDMyX3QgbW9kZSA9IG1BcHBPcHNNYW5hZ2VyLmNoZWNrT3AoQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPLAotICAgICAgICAgICAgbVVpZCwgbVBhY2thZ2UpOwotICAgIGNvbnN0IGJvb2wgaGFzSXQgPSAgKG1vZGUgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKTsKLSAgICAvLyB2ZXJib3NlIGxvZ2dpbmcgb25seSBsb2cgd2hlbiBhcHBPcCBjaGFuZ2VkCi0gICAgQUxPR0lfSUYoaGFzSXQgIT0gbUhhc09wUmVjb3JkQXVkaW8ubG9hZCgpLAotICAgICAgICAgICAgIk9QX1JFQ09SRF9BVURJTyBtaXNzaW5nLCAlc3NpbGVuY2luZyByZWNvcmQgdWlkJWQgcGFjazolcyIsCi0gICAgICAgICAgICBoYXNJdCA/ICJ1biIgOiAiIiwgbVVpZCwgU3RyaW5nOChtUGFja2FnZSkuc3RyaW5nKCkpOwotICAgIG1IYXNPcFJlY29yZEF1ZGlvLnN0b3JlKGhhc0l0KTsKLX0KLQotQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpSZWNvcmRBdWRpb09wQ2FsbGJhY2s6OlJlY29yZEF1ZGlvT3BDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgd3A8T3BSZWNvcmRBdWRpb01vbml0b3I+JiBtb25pdG9yKSA6IG1Nb25pdG9yKG1vbml0b3IpCi17IH0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6OlJlY29yZEF1ZGlvT3BDYWxsYmFjazo6b3BDaGFuZ2VkKGludDMyX3Qgb3AsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUpIHsKLSAgICBVTlVTRUQocGFja2FnZU5hbWUpOwotICAgIGlmIChvcCAhPSBBcHBPcHNNYW5hZ2VyOjpPUF9SRUNPUkRfQVVESU8pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzcDxPcFJlY29yZEF1ZGlvTW9uaXRvcj4gbW9uaXRvciA9IG1Nb25pdG9yLnByb21vdGUoKTsKLSAgICBpZiAobW9uaXRvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1vbml0b3ItPmNoZWNrUmVjb3JkQXVkaW8oKTsKLSAgICB9Ci19Ci0KLQotCiAjdW5kZWYgTE9HX1RBRwogI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkSGFuZGxlIgogCkBAIC0yMDU1LDcgKzIyNjUsNyBAQAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0YXJ0KGludCAvKkF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QqLyBldmVudCwKICAgICAgICAgaW50IC8qYXVkaW9fc2Vzc2lvbl90Ki8gdHJpZ2dlclNlc3Npb24pIHsKICAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAorICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKICAgICAgICAgbVJlY29yZFRyYWNrLT5zdGFydCgoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdClldmVudCwgKGF1ZGlvX3Nlc3Npb25fdCkgdHJpZ2dlclNlc3Npb24pKTsKIH0KIApAQCAtMjA3MCwyMiArMjI4MCwzMyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mb0RhdGE+KiBhY3RpdmVNaWNyb3Bob25lcykgewogICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCi0gICAgICAgICAgICBtUmVjb3JkVHJhY2stPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKSk7CisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBtaWNzOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoJm1pY3MpOworICAgIGFjdGl2ZU1pY3JvcGhvbmVzLT5yZXNpemUobWljcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzdGF0dXMgPT0gT0sgJiYgaSA8IG1pY3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICBzdGF0dXMgPSBtaWNzW2ldLndyaXRlVG9QYXJjZWxhYmxlKCZhY3RpdmVNaWNyb3Bob25lcy0+YXQoaSkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1Qoc3RhdHVzKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCiAgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pIHsKICAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdD4oZGlyZWN0aW9uKSkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKICAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2hhcmVBdWRpb0hpc3RvcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZWRBdWRpb1BhY2thZ2VOYW1lLCBpbnQ2NF90IHNoYXJlZEF1ZGlvU3RhcnRNcykgeworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+c2hhcmVBdWRpb0hpc3Rvcnkoc2hhcmVkQXVkaW9QYWNrYWdlTmFtZSwgc2hhcmVkQXVkaW9TdGFydE1zKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxMDUsMTQgKzIzMjYsMTYgQEAKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCi0gICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RnJhbWVzKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgIGNyZWF0b3JQaWQsIHVpZCwgZmFsc2UgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgY3JlYXRvclBpZCwKKyAgICAgICAgICAgICAgICAgIFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoYXR0cmlidXRpb25Tb3VyY2UudWlkKSksCisgICAgICAgICAgICAgICAgICBmYWxzZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX0RFRkFVTFQpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgPyBBTExPQ19QSVBFIDogQUxMT0NfQ0JMSykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1ZmZlciA9PSBOVUxMKSA/IEFMTE9DX0xPQ0FMIDogQUxMT0NfTk9ORSksCkBAIC0yMTI0LDcgKzIzNDcsNyBAQAogICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyKE5VTEwpLAogICAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgICBtU2lsZW5jZWQoZmFsc2UpLAotICAgICAgICBtT3BSZWNvcmRBdWRpb01vbml0b3IoT3BSZWNvcmRBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKHVpZCwgYXR0ciwgb3BQYWNrYWdlTmFtZSkpCisgICAgICAgIG1TdGFydEZyYW1lcyhzdGFydEZyYW1lcykKIHsKICAgICBpZiAobUNibGsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0yMTY1LDcgKzIzODgsNyBAQAogI2VuZGlmCiAKICAgICAvLyBPbmNlIHRoaXMgaXRlbSBpcyBsb2dnZWQgYnkgdGhlIHNlcnZlciwgdGhlIGNsaWVudCBjYW4gYWRkIHByb3BlcnRpZXMuCi0gICAgbVRyYWNrTWV0cmljcy5sb2dDb25zdHJ1Y3RvcihjcmVhdG9yUGlkLCB1aWQpOworICAgIG1UcmFja01ldHJpY3MubG9nQ29uc3RydWN0b3IoY3JlYXRvclBpZCwgdWlkKCksIGlkKCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCkBAIC0yMjA3LDcgKzI0MzAsOCBAQAogICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CiAgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnN0YXJ0KHRoaXMsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzIHRyYWNrICVkOiB0aHJlYWQgd2FzIGRlc3Ryb3llZCIsIF9fZnVuY19fLCBwb3J0SWQoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiB9CiAKQEAgLTIyMzMsNiArMjQ1Nyw5IEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CiAgICAgICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkLmdldCgpOwogICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIGlmICghbVNoYXJlZEF1ZGlvUGFja2FnZU5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFRocmVhZC0+cmVzZXRBdWRpb0hpc3RvcnlfbCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsgLy8gbW92ZSBtU3RhdGUgdG8gU1RPUFBFRCwgdGVybWluYXRlCiAgICAgICAgIH0KICAgICAgICAgLy8gQVBNIHBvcnRpZC9jbGllbnQgbWFuYWdlbWVudCBkb25lIG91dHNpZGUgb2YgbG9jay4KQEAgLTIzNzgsMTQgKzI2MDUsNiBAQAogICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAotYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmlzU2lsZW5jZWQoKSBjb25zdCB7Ci0gICAgaWYgKG1TaWxlbmNlZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgLy8gVGhlIG1vbml0b3IgaXMgb25seSBjcmVhdGVkIGZvciByZWNvcmQgdHJhY2tzIHRoYXQgY2FuIGJlIHNpbGVuY2VkLgotICAgIHJldHVybiBtT3BSZWNvcmRBdWRpb01vbml0b3IgPyAhbU9wUmVjb3JkQXVkaW9Nb25pdG9yLT5oYXNPcFJlY29yZEF1ZGlvKCkgOiBmYWxzZTsKLX0KLQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpCiB7CkBAIC0yNDE5LDYgKzI2MzgsMzggQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6c2hhcmVBdWRpb0hpc3RvcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZWRBdWRpb1BhY2thZ2VOYW1lLCBpbnQ2NF90IHNoYXJlZEF1ZGlvU3RhcnRNcykgeworCisgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGlmIChjYWxsaW5nVWlkICE9IG1VaWQgfHwgY2FsbGluZ1BpZCAhPSBtQ3JlYXRvclBpZCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZXt9OworICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChjYWxsaW5nVWlkKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF91aWRfdF9pbnQzMl90KGNhbGxpbmdQaWQpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWNvcmRUaHJlYWQtPnNoYXJlQXVkaW9IaXN0b3J5KAorICAgICAgICAgICAgICAgIHNoYXJlZEF1ZGlvUGFja2FnZU5hbWUsIG1TZXNzaW9uSWQsIHNoYXJlZEF1ZGlvU3RhcnRNcyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1TaGFyZWRBdWRpb1BhY2thZ2VOYW1lID0gc2hhcmVkQXVkaW9QYWNrYWdlTmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIkFGOjpQYXRjaFJlY29yZCIKQEAgLTI0MzUsOCArMjY4Niw4IEBACiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgQUlEX0FVRElPU0VSVkVSLAotICAgICAgICAgICAgICAgIGZsYWdzLCBUWVBFX1BBVENILCBTdHJpbmcxNigpKSwKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgYXVkaW9TZXJ2ZXJBdHRyaWJ1dGlvblNvdXJjZShnZXRwaWQoKSksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgUGF0Y2hUcmFja0Jhc2UobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICpyZWNvcmRUaHJlYWQsIHRpbWVvdXQpCiB7CkBAIC0yNzEzLDIxICsyOTY0LDIzIEBACiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICBib29sIGlzT3V0LAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBOVUxMLCBhdHRyLCBzYW1wbGVSYXRlLCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgKHNpemVfdCkwIC8qIGZyYW1lQ291bnQgKi8sCiAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIHVpZCwgaXNPdXQsCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsCisgICAgICAgICAgICAgICAgICBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnVpZCkpLAorICAgICAgICAgICAgICAgICAgaXNPdXQsCiAgICAgICAgICAgICAgICAgICBBTExPQ19OT05FLAogICAgICAgICAgICAgICAgICAgVFlQRV9ERUZBVUxULCBwb3J0SWQsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fTU1BUCkgKyBzdGQ6OnRvX3N0cmluZyhwb3J0SWQpKSwKLSAgICAgICAgbVBpZChwaWQpLCBtU2lsZW5jZWQoZmFsc2UpLCBtU2lsZW5jZWROb3RpZmllZChmYWxzZSkKKyAgICAgICAgbVBpZChWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGF0dHJpYnV0aW9uU291cmNlLnBpZCkpKSwKKyAgICAgICAgICAgIG1TaWxlbmNlZChmYWxzZSksIG1TaWxlbmNlZE5vdGlmaWVkKGZhbHNlKQogewogICAgIC8vIE9uY2UgdGhpcyBpdGVtIGlzIGxvZ2dlZCBieSB0aGUgc2VydmVyLCB0aGUgY2xpZW50IGNhbiBhZGQgcHJvcGVydGllcy4KLSAgICBtVHJhY2tNZXRyaWNzLmxvZ0NvbnN0cnVjdG9yKGNyZWF0b3JQaWQsIHVpZCk7CisgICAgbVRyYWNrTWV0cmljcy5sb2dDb25zdHJ1Y3RvcihjcmVhdG9yUGlkLCB1aWQoKSwgaWQoKSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjp+TW1hcFRyYWNrKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggNmVmMTliZi4uZmViNzFlMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTgwLDcgKzgwLDcgQEAKIAogLy8gVE9ETyBQZXJtaXQgZGlzYWJsaW5nIG9mIGxvZ2dpbmcgYXQgY29tcGlsZS10aW1lLgogCi0vLyBUT0RPIEEgbm9uLW51bGxwdHIgZHVtbXkgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhIG5vcCB3b3VsZCBiZSBmYXN0ZXIgdGhhbiBjaGVja2luZyBmb3IgbnVsbHB0cgorLy8gVE9ETyBBIG5vbi1udWxscHRyIHN0dWIgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBhIG5vcCB3b3VsZCBiZSBmYXN0ZXIgdGhhbiBjaGVja2luZyBmb3IgbnVsbHB0cgogLy8gICAgICBpbiB0aGUgY2FzZSB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZCBhdCBjb21waWxlLXRpbWUgYW5kIGVuYWJsZWQgYXQgcnVudGltZSwgYnV0IGl0IG1pZ2h0IGJlCiAvLyAgICAgIHNsb3dlciB0aGFuIG51bGxwdHIgY2hlY2sgd2hlbiBsb2dnaW5nIGlzIGVuYWJsZWQgYXQgY29tcGlsZS10aW1lIGFuZCBkaXNhYmxlZCBhdCBydW50aW1lLgogCkBAIC0xMjksOCArMTI5LDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogZXh0ZXJuICJDIiB7Ci0vLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsRHVtbXlOQkxvZ1dyaXRlciBhbmQgdGhlbgotLy8gaW5pdGlhbGl6ZSBiZWxvdyB0bE5CTG9nV3JpdGVyIHRvICZ0bER1bW15TkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCisvLyBUT0RPIGNvbnNpZGVyIGFkZGluZyBhIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyIHRsU3R1Yk5CTG9nV3JpdGVyIGFuZCB0aGVuCisvLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsU3R1Yk5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bwogLy8gY2hlY2sgZm9yIG51bGxwdHIgZXZlcnkgdGltZS4gQWxzbyByZWR1Y2VzIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyBsb2dnaW5nIG1hY3JvIGFib3ZlCiAvLyBlYWNoIHRpbWUgd2Ugd2FudCB0byBsb2cgYSBuZXcgdHlwZS4KIGV4dGVybiB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciAqdGxOQkxvZ1dyaXRlcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwCmluZGV4IGE0MmI4OWYuLmUwMThkZDMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA4ZDBlNWRiLi4yZTQ5ZTcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTE3LDE0ICsxNywxOCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPUE9MSUNZX0lOVEVSRkFDRV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBUaGUgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgYW5kIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlIGNsYXNzZXMgZGVmaW5lIHRoZSBjb21tdW5pY2F0aW9uIGludGVyZmFjZXMKQEAgLTEyMiw3ICsxMjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCkBAIC0xMzMsMTUgKzEzNywxNSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdG9wcyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwotICAgIC8vIHJlbGVhc2VzIHRoZSBvdXRwdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LCByZXR1cm4gdHJ1ZSBpZiB0aGUgb3V0cHV0IGRlc2NyaXB0b3IgaXMgcmVvcGVuZWQuCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIC8vIHJlcXVlc3QgYW4gaW5wdXQgYXBwcm9wcmlhdGUgZm9yIHJlY29yZCBmcm9tIHRoZSBzdXBwbGllZCBkZXZpY2Ugd2l0aCBzdXBwbGllZCBwYXJhbWV0ZXJzLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMTkxLDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOwogCiAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gc3RyZWFtIHR5cGUKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKIAogICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwpAQCAtMjA0LDcgKzIwOCw3IEBACiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKQEAgLTIyMCwxNiArMjI0LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgPSAwOwotICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIG9mZmxvYWRJbmZvKSA9IDA7CisgICAgdmlydHVhbCBhdWRpb19vZmZsb2FkX21vZGVfdCBnZXRPZmZsb2FkU3VwcG9ydChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpID0gMDsKQEAgLTI1MCwxMiArMjU0LDEyIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpCiAgICAgICAgICAgICA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpID0gMDsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLApAQCAtMjcyLDggKzI3NiwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cykgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCiAgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkgPSAwOwpAQCAtMjg1LDIzICsyOTIsNDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5LAorICAgICAgICAgICAgYm9vbCBmYWxsYmFja09uRGVmYXVsdCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwLCBib29sIGZhbGxiYWNrT25EZWZhdWx0KSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKIH07CiAKIApAQCAtNDE2LDE2ICs0NDcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgb25Sb3V0aW5nVXBkYXRlZCgpID0gMDsKKwogICAgIC8vIFVzZWQgdG8gbm90aWZ5IHRoZSBzb3VuZCB0cmlnZ2VyIG1vZHVsZSB0aGF0IGFuIGF1ZGlvIGNhcHR1cmUgaXMgYWJvdXQgdG8KICAgICAvLyB0YWtlIHBsYWNlLiBUaGlzIHNob3VsZCB0eXBpY2FsbHkgcmVzdWx0IGluIGFueSBhY3RpdmUgcmVjb2duaXRpb24KICAgICAvLyBzZXNzaW9ucyB0byBiZSBwcmVlbXB0ZWQgb24gbW9kdWxlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHNvdW5kIHRyaWdnZXIKICAgICAvLyByZWNvZ25pdGlvbiBjb25jdXJyZW50bHkgd2l0aCBhdWRpbyBjYXB0dXJlLgogICAgIHZpcnR1YWwgdm9pZCBzZXRTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cykgPSAwOwogfTsKIAotZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSk7Ci0KKyAgICAvLyBUaGVzZSBhcmUgdGhlIHNpZ25hdHVyZXMgb2YgY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyL2Rlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIKKyAgICAvLyBtZXRob2RzIHJlc3BlY3RpdmVseSwgZXhwZWN0ZWQgYnkgQXVkaW9Qb2xpY3lTZXJ2aWNlLCBuZWVkcyB0byBiZSBleHBvc2VkIGJ5CisgICAgLy8gbGliYXVkaW9wb2xpY3ltYW5hZ2VyY3VzdG9tLgorICAgIHVzaW5nIENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlID0gQXVkaW9Qb2xpY3lJbnRlcmZhY2UqICgqKShBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSopOworICAgIHVzaW5nIERlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXJJbnN0YW5jZSA9IHZvaWQgKCopKEF1ZGlvUG9saWN5SW50ZXJmYWNlKik7CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCmluZGV4IGE4NDgzZmEuLmRhOWQzMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTEsMyArMSwyIEBACiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icAppbmRleCA2ZTBkMmY2Li45MTcwMWFkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCA3YzhjZTgzLi43MzZmOGIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTI2LDYgKzEyNiw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpAQCAtMTM5LDYgKzE0MCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCAwNTM3MzY1Li41NzdmNjQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtNDIsNyArNDIsNyBAQAogCiAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHRoZSBwb2xpY3kgd2lsbCB1c2UgbWF4IG1peGVyIGNoYW5uZWwgY291bnQuCiAvLyBEbyBub3QgbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKLSNkZWZpbmUgTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQgRkNDXzgKKyNkZWZpbmUgTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQgRkNDX0xJTUlUCiAKIC8qKgogICogQWxpYXMgdG8gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIGRlZmluZWQgZm9yIGNsYXJpZmljYXRpb24gd2hlbiB0aGlzIHZhbHVlIGlzIHVzZWQgYnkgdm9sdW1lCkBAIC0yMjYsNiArMjI2LDggQEAKICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VUeXBlcy5jb3VudChBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSAhPSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VUeXBlcy5jb3VudChBVURJT19ERVZJQ0VfT1VUX0hETUlfRUFSQykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9PVVRfSERNSV9FQVJDOwogICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpICE9IDApIHsKICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FOwogICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfU1BESUYpICE9IDApIHsKQEAgLTI0MCw0ICsyNDIsNCBAQAogICAgICAgICAgICAgcmV0dXJuIGEyZHBEZXZpY2VzLmVtcHR5KCkgPyBBVURJT19ERVZJQ0VfTk9ORSA6IGEyZHBEZXZpY2VzWzBdOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icAppbmRleCA1N2YwYjViLi4yMjdjMmQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9JbnB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCmluZGV4IDZmNDdhYmMuLmE0MGY2YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZTsgfQogCi0gICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3Q7CiAgICAgdm9pZCBzZXRQcmVlbXB0ZWRTZXNzaW9ucyhjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiYgc2Vzc2lvbnMpOwogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IGdldFByZWVtcHRlZFNlc3Npb25zKCkgY29uc3Q7CiAgICAgYm9vbCBoYXNQcmVlbXB0ZWRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAppbmRleCAzOWQxMTQwLi4xZjliNTM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0xODIsNiArMTgyLDcgQEAKICAgICAgKiBBY3RpdmUgcmVmIGNvdW50IG9mIHRoZSBjbGllbnQgd2lsbCBiZSBpbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCB0aHJvdWdoIHNldEFjdGl2ZSBBUEkKICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpOworICAgIGJvb2wgaXNDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50KTsKIAogICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0OwogICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSA9IFZPTFVNRV9TT1VSQ0VfTk9ORSwKQEAgLTI2MCw3ICsyNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVBvbGljeUF1ZGlvUG9ydC0+YXNBdWRpb1BvcnQoKTsgfQogCi0gICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0OwogCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwogCkBAIC0zMzcsNiArMzM4LDggQEAKICAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwogICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcyk7CisgICAgdmlydHVhbCBib29sIGNvbnRhaW5zU2luZ2xlRGV2aWNlU3VwcG9ydGluZ0VuY29kZWRGb3JtYXRzKAorICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSkgY29uc3Q7CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCk7CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0MSAhPSBOVUxMICYmIG1PdXRwdXQyICE9IE5VTEwpOyB9CiAgICAgdmlydHVhbCBib29sIGlzRml4ZWRWb2x1bWUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwpAQCAtMzU3LDcgKzM2MCw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdDsKIAogICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLApAQCAtMzk1LDYgKzM5OCwxNCBAQAogICAgIGJvb2wgc3VwcG9ydHNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNEZXZpY2VzRm9yUGxheWJhY2sKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgaXMgYSBzdXBwb3J0ZWQgY29tYm8gZm9yIHBsYXliYWNrCisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlc0ZvclBsYXliYWNrKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBAYnJpZWYgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyB0YWtlcyBhIHZlY3RvciBvZiBkZXZpY2VzIGFuZCBmaWx0ZXJzIHRoZW0gYWNjb3JkaW5nIHRvIHRoZQogICAgICAqIGRldmljZSBzdXBwb3J0ZWQgYnkgdGhpcyBvdXRwdXQgKHRoZSBwcm9maWxlIGZyb20gd2hpY2ggdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tKQogICAgICAqIEBwYXJhbSBkZXZpY2VzIHJlZmVyZW5jZSBkZXZpY2UgdmVjdG9yIHRvIGJlIGZpbHRlcmVkCkBAIC00MTEsNiArNDIyLDcgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0CiAgICAgdWludDMyX3QgbURpcmVjdE9wZW5Db3VudDsgLy8gbnVtYmVyIG9mIGNsaWVudHMgdXNpbmcgdGhpcyBvdXRwdXQgKGRpcmVjdCBvdXRwdXRzIG9ubHkpCiAgICAgYXVkaW9fc2Vzc2lvbl90IG1EaXJlY3RDbGllbnRTZXNzaW9uOyAvLyBzZXNzaW9uIGlkIG9mIHRoZSBkaXJlY3Qgb3V0cHV0IGNsaWVudAorICAgIGJvb2wgbVBlbmRpbmdSZW9wZW5Ub1F1ZXJ5UHJvZmlsZXMgPSBmYWxzZTsKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgpAQCAtNDMxLDcgKzQ0Myw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KSBjb25zdDsKIAogICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IG1Tb3VyY2U7CiAKQEAgLTQ5OCwxMSArNTEwLDYgQEAKICAgICAgKi8KICAgICBib29sIGlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIGNvbnN0OwogCi0gICAgLyoqCi0gICAgICogcmV0dXJucyB0cnVlIGlmIEEyRFAgaXMgc3VwcG9ydGVkIChlaXRoZXIgdmlhIGhhcmR3YXJlIG9mZmxvYWQgb3Igc29mdHdhcmUgZW5jb2RpbmcpCi0gICAgICovCi0gICAgYm9vbCBpc0EyZHBTdXBwb3J0ZWQoKSBjb25zdDsKLQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAppbmRleCAzOTViYzcwLi5jZjFmNjRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaApAQCAtMzMsNiArMzMsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvLyBUaGlzIGNsYXNzIGdhdGhlcnMgdG9nZXRoZXIgdmFyaW91cyBiaXRzIG9mIEF1ZGlvUG9saWN5TWFuYWdlcgorLy8gY29uZmlndXJhdGlvbiwgd2hpY2ggYXJlIHVzdWFsbHkgZmlsbGVkIG91dCBhcyBhIHJlc3VsdCBvZiBwYXJzaW5nCisvLyB0aGUgYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUuCisvLworLy8gTm90ZSB0aGF0IEF1ZGlvUG9saWN5Q29uZmlnIGRvZXNuJ3Qgb3duIHNvbWUgb2YgdGhlIGRhdGEsCisvLyBpdCBzaW1wbHkgcHJveGllcyBhY2Nlc3MgdG8gdGhlIGZpZWxkcyBvZiBBdWRpb1BvbGljeU1hbmFnZXIKKy8vIGNsYXNzLiBCZSBjYXJlZnVsIGFib3V0IHRoZSBmaWVsZHMgdGhhdCBhcmUgcmVmZXJlbmNlcywKKy8vIGUuZy4gJ21PdXRwdXREZXZpY2VzJy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgaXQncyBpbXBvc3NpYmxlCisvLyB0byBpbXBsZW1lbnQgImRlZXAgY29weWluZyIgb2YgdGhpcyBjbGFzcyB3aXRob3V0IHJlLWRlc2lnbmluZyBpdC4KIGNsYXNzIEF1ZGlvUG9saWN5Q29uZmlnCiB7CiBwdWJsaWM6CkBAIC00MCwxNCArNDksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJm91dHB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZpbnB1dERldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2UpCi0gICAgICAgIDogbUVuZ2luZUxpYnJhcnlOYW1lU3VmZml4KGtEZWZhdWx0RW5naW5lTGlicmFyeU5hbWVTdWZmaXgpLAotICAgICAgICAgIG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKKyAgICAgICAgOiBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCiAgICAgICAgICAgbU91dHB1dERldmljZXMob3V0cHV0RGV2aWNlcyksCiAgICAgICAgICAgbUlucHV0RGV2aWNlcyhpbnB1dERldmljZXMpLAotICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpLAotICAgICAgICAgIG1Jc1NwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwKLSAgICAgICAgICBtSXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZChmYWxzZSkKLSAgICB7fQorICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKGRlZmF1bHRPdXRwdXREZXZpY2UpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtU291cmNlID0ge307CisgICAgICAgIG1FbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCA9IGtEZWZhdWx0RW5naW5lTGlicmFyeU5hbWVTdWZmaXg7CisgICAgICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKKyAgICAgICAgbU91dHB1dERldmljZXMuY2xlYXIoKTsKKyAgICAgICAgbUlucHV0RGV2aWNlcy5jbGVhcigpOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS5jbGVhcigpOworICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZCA9IGZhbHNlOworICAgICAgICBtSXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmNsZWFyKCk7CisgICAgfQogCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFNvdXJjZSgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Tb3VyY2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IGI4MjMwNWQuLmMyYTIwYzYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC03Nyw2ICs3Nyw3IEBACiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZURldmljZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkgY29uc3Q7CiAKICAgICAvKioKQEAgLTEwMSw3ICsxMDIsNyBAQAogICAgICAqICAgIEFuIGV4YW1wbGUgb2YgZmFpbHVyZSBpcyB3aGVuIHRoZXJlIGFyZSBhbHJlYWR5IHJ1bGVzIGluIHBsYWNlIHRvIHJlc3RyaWN0CiAgICAgICogICAgYSBtaXggdG8gdGhlIGdpdmVuIHVpZCAoaS5lLiB3aGVuIGEgTUFUQ0hfVUlEIHJ1bGUgd2FzIHNldCBmb3IgaXQpLgogICAgICAqLwotICAgIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKTsKICAgICBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CiAgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclVpZCh1aWRfdCB1aWQsIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3Q7CiAKQEAgLTExNSw3ICsxMTYsNyBAQAogICAgICAqICAgIEFuIGV4YW1wbGUgb2YgZmFpbHVyZSBpcyB3aGVuIHRoZXJlIGFyZSBhbHJlYWR5IHJ1bGVzIGluIHBsYWNlIHRvIHJlc3RyaWN0CiAgICAgICogICAgYSBtaXggdG8gdGhlIGdpdmVuIHVzZXJJZCAoaS5lLiB3aGVuIGEgTUFUQ0hfVVNFUklEIHJ1bGUgd2FzIHNldCBmb3IgaXQpLgogICAgICAqLwotICAgIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0dXNfdCBzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogICAgIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCk7CiAgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclVzZXJJZChpbnQgdXNlcklkLCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NsaWVudERlc2NyaXB0b3IuaAppbmRleCA5MjMzMTBjLi43NGIzNDA1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmgKQEAgLTEwOSwxMCArMTA5LDE2IEBACiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiYgZ2V0U2Vjb25kYXJ5T3V0cHV0cygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TZWNvbmRhcnlPdXRwdXRzOwogICAgIH07CisgICAgdm9pZCBzZXRTZWNvbmRhcnlPdXRwdXRzKHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4mJiBzZWNvbmRhcnlPdXRwdXRzKSB7CisgICAgICAgIG1TZWNvbmRhcnlPdXRwdXRzID0gc3RkOjptb3ZlKHNlY29uZGFyeU91dHB1dHMpOworICAgIH0KICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKCkgY29uc3QgeyByZXR1cm4gbVZvbHVtZVNvdXJjZTsgfQogICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiBnZXRQcmltYXJ5TWl4KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVByaW1hcnlNaXgucHJvbW90ZSgpOwogICAgIH07CisgICAgYm9vbCBoYXNMb3N0UHJpbWFyeU1peCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmltYXJ5TWl4LnVuc2FmZV9nZXQoKSAmJiAhbVByaW1hcnlNaXgucHJvbW90ZSgpOworICAgIH0KIAogICAgIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlKSBvdmVycmlkZQogICAgIHsKQEAgLTE0MCw3ICsxNDYsNyBAQAogICAgIGNvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBtU3RyYXRlZ3k7CiAgICAgY29uc3QgVm9sdW1lU291cmNlIG1Wb2x1bWVTb3VyY2U7CiAgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gbVNlY29uZGFyeU91dHB1dHM7CisgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBtU2Vjb25kYXJ5T3V0cHV0czsKICAgICBjb25zdCB3cDxBdWRpb1BvbGljeU1peD4gbVByaW1hcnlNaXg7CiAgICAgLyoqCiAgICAgICogcmVxdWlyZWQgZm9yIGR1cGxpY2F0aW5nIHRocmVhZCwgcHJldmVudCBmcm9tIHJlbW92aW5nIGFjdGl2ZSBjbGllbnQgZnJvbSBhbiBvdXRwdXQKQEAgLTE5NSwxMCArMjAxLDE4IEBACiAKICAgICB+U291cmNlQ2xpZW50RGVzY3JpcHRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAorICAgIHZvaWQgY29ubmVjdChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNpbmtEZXZpY2UpIHsKKyAgICAgICAgbVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7CisgICAgICAgIG1TaW5rRGV2aWNlID0gc2lua0RldmljZTsKKyAgICB9CisgICAgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgbVNpbmtEZXZpY2UgPSBudWxscHRyOworICAgIH0KKyAgICBib29sIGlzQ29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOyB9CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH0KLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7IG1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOyB9Ci0KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1TaW5rRGV2aWNlOyB9CiAgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVN3T3V0cHV0OyB9CiAgICAgdm9pZCBzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KTsKICAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtSHdPdXRwdXQ7IH0KQEAgLTIxMCw2ICsyMjQsNyBAQAogIHByaXZhdGU6CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbVNyY0RldmljZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU2lua0RldmljZTsKICAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OwogICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKaW5kZXggZGQxNDk5Yy4uMjBiNDA0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCkBAIC02NSw2ICs2NSw5IEBACiAKICAgICBib29sIHN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CiAKKyAgICB2b2lkIHNldER5bmFtaWMoKSB7IG1Jc0R5bmFtaWMgPSB0cnVlOyB9CisgICAgYm9vbCBpc0R5bmFtaWMoKSBjb25zdCB7IHJldHVybiBtSXNEeW5hbWljOyB9CisKICAgICAvLyBQb2xpY3lBdWRpb1BvcnRDb25maWcKICAgICB2aXJ0dWFsIHNwPFBvbGljeUF1ZGlvUG9ydD4gZ2V0UG9saWN5QXVkaW9Qb3J0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9saWN5QXVkaW9Qb3J0Kj4oY29uc3RfY2FzdDxEZXZpY2VEZXNjcmlwdG9yKj4odGhpcykpOwpAQCAtODUsNiArODgsNyBAQAogCiAgICAgLy8gQXVkaW9Qb3J0CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0OwogCiAgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnRBbmRQaWNrQXVkaW9Qcm9maWxlKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4mIHBvbGljeVBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSk7CkBAIC05NCw5ICs5OCwxOCBAQAogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPFQsIHN0cnVjdCBhdWRpb19wb3J0Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgc3RydWN0IGF1ZGlvX3BvcnRfdjc+Ojp2YWx1ZSwgaW50PiA9IDA+CisgICAgdm9pZCB0b0F1ZGlvUG9ydEludGVybmFsKFQqIHBvcnQpIGNvbnN0IHsKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0KHBvcnQpOworICAgICAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOworICAgIH0KKwogICAgIHN0ZDo6c3RyaW5nIG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCiAgICAgRm9ybWF0VmVjdG9yICAgICAgICBtRW5jb2RlZEZvcm1hdHM7CiAgICAgYXVkaW9fZm9ybWF0X3QgICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQ7CisgICAgYm9vbCAgICAgICAgICAgICAgICBtSXNEeW5hbWljID0gZmFsc2U7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgICBtRGVjbGFyZWRBZGRyZXNzOyAvLyBPcmlnaW5hbCBkZXZpY2UgYWRkcmVzcwogfTsKIAogY2xhc3MgRGV2aWNlVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxzcDxEZXZpY2VEZXNjcmlwdG9yPiA+CkBAIC0xNDYsNiArMTU5LDE1IEBACiAgICAgLy8gICAgIDQpIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgZGV2aWNlcyBpcyBpbnZhbGlkIGZvciBzZWxlY3Rpb24KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGb3JPcGVuaW5nKCkgY29uc3Q7CiAKKyAgICAvLyBSZXR1cm4gdGhlIGRldmljZSBkZXNjcmlwdG9yIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gQXVkaW9EZXZpY2VUeXBlQWRkcgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21EZXZpY2VUeXBlQWRkcigKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZVR5cGVBZGRyKSBjb25zdDsKKworICAgIC8vIFJldHVybiB0aGUgZGV2aWNlIHZlY3RvciB0aGF0IGNvbnRhaW5zIGRldmljZSBkZXNjcmlwdG9yIHdob3NlIEF1ZGlvRGV2aWNlVHlwZUFkZHIgYXBwZWFycworICAgIC8vIGluIHRoZSBnaXZlbiBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yCisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VUeXBlQWRkclZlY3RvcikgY29uc3Q7CisKICAgICAvLyBJZiB0aGVyZSBhcmUgZGV2aWNlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCB0aGUgZGV2aWNlcyB0byBhZGQgaXMgbm90IGVtcHR5LAogICAgIC8vIHJlbW92ZSBhbGwgdGhlIGRldmljZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgYWRkIGFsbCB0aGUgZGV2aWNlcyB0byBhZGQuCiAgICAgdm9pZCByZXBsYWNlRGV2aWNlc0J5VHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCk7CkBAIC0yMDQsNyArMjI2LDkgQEAKICAgICAgICAgICAgIGFkZChkZXZpY2VzKTsKICAgICAgICAgICAgIHJldHVybiBzaXplKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFNvcnRlZFZlY3Rvcjo6bWVyZ2UoZGV2aWNlcyk7CisgICAgICAgIHNzaXplX3QgcmV0ID0gU29ydGVkVmVjdG9yOjptZXJnZShkZXZpY2VzKTsKKyAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDgsMTMgKzI3MiwyMSBAQAogICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CiAgICAgfQogCi0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKyAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGdldFN1cHBvcnRlZFByb2ZpbGVzKCkgeyByZXR1cm4gbVN1cHBvcnRlZFByb2ZpbGVzOyB9CisKKyAgICAvLyBSZXR1cm4gYSBzdHJpbmcgdG8gZGVzY3JpYmUgdGhlIERldmljZVZlY3Rvci4gVGhlIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aWxsIG9ubHkgYmUKKyAgICAvLyBhZGRlZCB0byB0aGUgc3RyaW5nIGlmIGBpbmNsdWRlU2Vuc2l0aXZlSW5mb2AgaXMgdHJ1ZS4KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvID0gZmFsc2UpIGNvbnN0OwogCiAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKK3Byb3RlY3RlZDoKKyAgICBpbnQgICAgIGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0OwogcHJpdmF0ZToKICAgICB2b2lkIHJlZnJlc2hUeXBlcygpOworICAgIHZvaWQgcmVmcmVzaEF1ZGlvUHJvZmlsZXMoKTsKICAgICBEZXZpY2VUeXBlU2V0IG1EZXZpY2VUeXBlczsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbVN1cHBvcnRlZFByb2ZpbGVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKaW5kZXggYzRlYWIzMC4uNTllZWU1MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCkBAIC03Miw2ICs3Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogICAgIHZvaWQgbW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogCisgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0SW9Gb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKmVmZmVjdFR5cGUgPSBudWxscHRyKTsKKwogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggMjNmMGM5YS4uOWJhNzQ1YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTUyLDggKzUyLDEyIEBACiAgICAgICAgIGRldmljZXMubWVyZ2UobUR5bmFtaWNEZXZpY2VzKTsKICAgICAgICAgcmV0dXJuIGRldmljZXM7CiAgICAgfQorICAgIHN0ZDo6c3RyaW5nIGdldFRhZ0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhZGRyZXNzID0gU3RyaW5nOCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlYyA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB2b2lkIGFkZER5bmFtaWNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CisgICAgICAgIGRldmljZS0+c2V0RHluYW1pYygpOwogICAgICAgICBtRHluYW1pY0RldmljZXMuYWRkKGRldmljZSk7CiAgICAgfQogCkBAIC0xMzEsOCArMTM1LDE3IEBACiBwdWJsaWM6CiAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE1vZHVsZUZvckRldmljZVR5cGUgdHJ5IHRvIGdldCBhIGRldmljZSBmcm9tIHR5cGUgLyBmb3JtYXQgb24gYWxsIG1vZHVsZXMKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHR5cGUgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCB0byBjb25zaWRlcgorICAgICAqIEBwYXJhbVtvdXRdIHRhZ05hbWUgaWYgbm90IG51bGwsIGlmIGEgbWF0Y2hpbmcgZGV2aWNlIGlzIGZvdW5kLCB3aWxsIHJldHVybiB0aGUgdGFnTmFtZQorICAgICAqIG9mIG9yaWdpbmFsIGRldmljZSBmcm9tIFhNTCBmaWxlIHNvIHRoYXQgYXVkaW8gcm91dGVzIG1hdGNoaW4gcnVsZXMgd29yay4KKyAgICAgKiBAcmV0dXJuIHZhbGlkIG1vZHVsZSBpZiBjb25zaWRlcmVkIGRldmljZSBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UuCisgICAgICovCiAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZVR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICp0YWdOYW1lID0gbnVsbHB0cikgY29uc3Q7CiAKICAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaAppbmRleCA1ZjU1MWQ1Li5hNzRjZWZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0xMTIsNiArMTEyLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQGJyaWVmIGdldFRhZworICAgICAqIEBwYXJhbSBkZXZpY2VUeXBlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0YWdOYW1lIG9mIGZpcnN0IG1hdGNoaW5nIGRldmljZSBmb3IgdGhlIGNvbnNpZGVyZWQgdHlwZXMsIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RkOjpzdHJpbmcgZ2V0VGFnKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKHN1cHBvcnRzRGV2aWNlVHlwZXMoZGV2aWNlVHlwZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlcyhkZXZpY2VUeXBlcykuaXRlbUF0KDApLT5nZXRUYWdOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8qKgogICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQogICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CiAgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCkBAIC0xMzEsNyArMTQ0LDcgQEAKICAgICBib29sIGRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlcykgY29uc3QKICAgICB7CiAgICAgICAgIGlmIChkZXZpY2VUeXBlcy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gcmVxdWlyZWQgZm9yIGlzT2ZmbG9hZFN1cHBvcnRlZCgpIGNoZWNrCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gcmVxdWlyZWQgZm9yIGdldE9mZmxvYWRTdXBwb3J0KCkgY2hlY2sKICAgICAgICAgfQogICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9CiAgICAgICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVzKGRldmljZVR5cGVzKTsKQEAgLTE0Myw2ICsxNTYsOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgYm9vbCBjb250YWluc1NpbmdsZURldmljZVN1cHBvcnRpbmdFbmNvZGVkRm9ybWF0cyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlKSBjb25zdDsKKwogICAgIHZvaWQgY2xlYXJTdXBwb3J0ZWREZXZpY2VzKCkgeyBtU3VwcG9ydGVkRGV2aWNlcy5jbGVhcigpOyB9CiAgICAgdm9pZCBhZGRTdXBwb3J0ZWREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7CkBAIC0xNTAsNiArMTY1LDEyIEBACiAgICAgfQogICAgIHZvaWQgcmVtb3ZlU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCiAgICAgeworICAgICAgICBzc2l6ZV90IHJldCA9IG1TdXBwb3J0ZWREZXZpY2VzLmluZGV4T2YoZGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCA+PSAwICYmICFtU3VwcG9ydGVkRGV2aWNlcy5pdGVtQXQocmV0KS0+aXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgIC8vIGRldmljZXMgZXF1YWxpdHkgY2hlY2tzIG9ubHkgdHlwZSwgYWRkcmVzcywgbmFtZSBhbmQgZm9ybWF0CisgICAgICAgICAgICAvLyBQcmV2ZW50cyBmcm9tIHJlbW92aW5nIG5vbiBkeW5hbWljYWxseSBhZGRlZCBkZXZpY2VzCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KICAgICAgICAgbVN1cHBvcnRlZERldmljZXMucmVtb3ZlKGRldmljZSk7CiAgICAgfQogICAgIHZvaWQgc2V0U3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvUG9saWN5QXVkaW9Qb3J0LmgKaW5kZXggZDJmNjI5Ny4uYWIzM2IzOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaApAQCAtNDIsNiArNDIsMTEgQEAKIAogICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0VGFnTmFtZSgpIGNvbnN0ID0gMDsKIAorICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHJpZ2h0ICE9IDAgJiYgZ2V0VGFnTmFtZSgpID09IHJpZ2h0LT5nZXRUYWdOYW1lKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGFzQXVkaW9Qb3J0KCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKaW5kZXggNDhjNDE0Ny4uYjcwYzU5NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCkBAIC0yMSw1ICsyMSw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKy8vIEluIFZUUyBtb2RlIGFsbCB2ZW5kb3IgZXh0ZW5zaW9ucyBhcmUgaWdub3JlZC4gVGhpcyBpcyBkb25lIGJlY2F1c2UKKy8vIFZUUyB0ZXN0cyBhcmUgYnVpbHQgdXNpbmcgQU9TUCBjb2RlIGFuZCB0aHVzIGNhbiBub3QgdXNlIHZlbmRvciBvdmVybGF5cworLy8gb2Ygc3lzdGVtIGxpYnJhcmllcy4KK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlRm9yVnRzKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IGI5NjMxMjEuLjcwMTZhMDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTkyLDcgKzkyLDcgQEAKICAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBzb3VyY2UoKTsKIH0KIAotdm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3QKIHsKICAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOwogCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJWRcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzICVzXG4iLCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcodHJ1ZSAvKmluY2x1ZGVTZW5zaXRpdmVJbmZvKi8pLmNfc3RyKCkpOwogICAgIG1FbmFibGVkRWZmZWN0cy5kdW1wKGRzdCwgMSAvKnNwYWNlcyovLCBmYWxzZSAvKnZlcmJvc2UqLyk7CiAgICAgZHN0LT5hcHBlbmQoIiBBdWRpb1JlY29yZCBDbGllbnRzOlxuIik7CiAgICAgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKaW5kZXggZDZkNDcyYi4uNmIwOGY3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCkBAIC0xMjMsNiArMTIzLDEyIEBACiAgICAgY2xpZW50LT5zZXRBY3RpdmUoYWN0aXZlKTsKIH0KIAorYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQ2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICByZXR1cm4gY2xpZW50ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCkgIT0gZW5kKG1BY3RpdmVDbGllbnRzKTsKK30KKwogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2cywgdWludDMyX3QgaW5QYXN0TXMsIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKIHsKICAgICByZXR1cm4gKHZzID09IFZPTFVNRV9TT1VSQ0VfTk9ORSkgPwpAQCAtMjA5LDcgKzIxNSw3IEBACiAgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiB9CiAKLXZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3QKIHsKICAgICAvLyBTaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZHVwbGljYXRlZCBwb3J0cywgc2VlIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZy4KICAgICBtUG9saWN5QXVkaW9Qb3J0LT5hc0F1ZGlvUG9ydCgpLT50b0F1ZGlvUG9ydChwb3J0KTsKQEAgLTI0NSw3ICsyNTEsNyBAQAogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlczogJXNcbiIsIGRldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlczogJXNcbiIsIGRldmljZXMoKS50b1N0cmluZyh0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBHbG9iYWwgYWN0aXZlIGNvdW50OiAldVxuIiwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtUm91dGluZ0FjdGl2aXRpZXMpIHsKICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcm9kdWN0IFN0cmF0ZWd5IGlkOiAlZCIsIGl0ZXIuZmlyc3QpOwpAQCAtMzM4LDYgKzM0NCwxMyBAQAogICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnNBbGxEZXZpY2VzKGRldmljZXMpOwogfQogCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0c0RldmljZXNGb3JQbGF5YmFjayhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgLy8gTm8gY29uc2lkZXJpbmcgZHVwbGljYXRlZCBvdXRwdXQKKyAgICAvLyBUT0RPOiBuZWVkIHRvIHZlcmlmeSBpZiB0aGUgcHJvZmlsZSBzdXBwb3J0cyB0aGUgZGV2aWNlcyBjb21ibyBmb3IgcGxheWJhY2suCisgICAgcmV0dXJuICFpc0R1cGxpY2F0ZWQoKSAmJiBzdXBwb3J0c0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKIERldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKQEAgLTM1NCw2ICszNjcsMTYgQEAKICAgICB9CiB9CiAKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNvbnRhaW5zU2luZ2xlRGV2aWNlU3VwcG9ydGluZ0VuY29kZWRGb3JtYXRzKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlKSBjb25zdAoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5jb250YWluc1NpbmdsZURldmljZVN1cHBvcnRpbmdFbmNvZGVkRm9ybWF0cyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgbU91dHB1dDItPmNvbnRhaW5zU2luZ2xlRGV2aWNlU3VwcG9ydGluZ0VuY29kZWRGb3JtYXRzKGRldmljZSkpOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmNvbnRhaW5zU2luZ2xlRGV2aWNlU3VwcG9ydGluZ0VuY29kZWRGb3JtYXRzKGRldmljZSk7Cit9CisKIHVpbnQzMl90IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsYXRlbmN5KCkKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKQEAgLTQwMCw4ICs0MjMsNyBAQAogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CiB9CiAKLXZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0CiB7CiAgICAgQUxPR19BU1NFUlQoIWlzRHVwbGljYXRlZCgpLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBtSW9IYW5kbGUpOwogCkBAIC01MDUsNiArNTI3LDkgQEAKICAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uZHVyYXRpb25fdXMgPSAtMTsKICAgICAgICAgbENvbmZpZy5vZmZsb2FkX2luZm8uaGFzX3ZpZGVvID0gdHJ1ZTsgLy8gY29uc2VydmF0aXZlCiAgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQorICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGUgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5lbmNhcHN1bGF0aW9uX21vZGU7CisgICAgICAgIGxDb25maWcub2ZmbG9hZF9pbmZvLmNvbnRlbnRfaWQgPSBsQ29uZmlnLm9mZmxvYWRfaW5mby5jb250ZW50X2lkOworICAgICAgICBsQ29uZmlnLm9mZmxvYWRfaW5mby5zeW5jX2lkID0gbENvbmZpZy5vZmZsb2FkX2luZm8uc3luY19pZDsKICAgICB9CiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKQEAgLTY0OCw4ICs2NzMsNyBAQAogICAgIG1Tb3VyY2UtPnNyY0RldmljZSgpLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CiB9CiAKLXZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIGNvbnN0CiB7CiAgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0KHBvcnQpOwogfQpAQCAtNzY0LDExICs3ODgsNiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBMmRwU3VwcG9ydGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGlzQTJkcE9mZmxvYWRlZE9uUHJpbWFyeSgpIHx8IChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpOwotfQotCiBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldFByaW1hcnlPdXRwdXQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCBiNmRlNGJlLi5iMjA5YTg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0yMDgsMjQgKzIwOCwyNSBAQAogICAgICAgICAvLyBMb29wYmFjayByZW5kZXIgbWl4ZXMgYXJlIGNyZWF0ZWQgZnJvbSBhIHB1YmxpYyBBUEkgYW5kIHRodXMgcmVzdHJpY3RlZAogICAgICAgICAvLyB0byBub24gc2Vuc2libGUgYXVkaW8gdGhhdCBoYXZlIG5vdCBvcHRlZCBvdXQuCiAgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC0+bVJvdXRlRmxhZ3MpKSB7Ci0gICAgICAgICAgICBhdXRvIGhhc0ZsYWcgPSBbXShhdXRvIGZsYWdzLCBhdXRvIGZsYWcpIHsgcmV0dXJuIChmbGFncyAmIGZsYWcpID09IGZsYWc7IH07Ci0gICAgICAgICAgICBpZiAoaGFzRmxhZyhhdHRyaWJ1dGVzLmZsYWdzLCBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1peC0+bUFsbG93UHJpdmlsZWdlZFBsYXliYWNrQ2FwdHVyZSAmJgotICAgICAgICAgICAgICAgIGhhc0ZsYWcoYXR0cmlidXRlcy5mbGFncywgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OICYmCi0gICAgICAgICAgICAgICAgIW1peC0+bVZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVU5LTk9XTiB8fAogICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9NRURJQSB8fAogICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9HQU1FIHx8CiAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaGFzRmxhZyA9IFtdKGF1dG8gZmxhZ3MsIGF1dG8gZmxhZykgeyByZXR1cm4gKGZsYWdzICYgZmxhZykgPT0gZmxhZzsgfTsKKyAgICAgICAgICAgIGlmIChoYXNGbGFnKGF0dHJpYnV0ZXMuZmxhZ3MsIEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTikgeworICAgICAgICAgICAgICAgIGlmICghbWl4LT5tVm9pY2VDb21tdW5pY2F0aW9uQ2FwdHVyZUFsbG93ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtaXgtPm1BbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZSAmJgorICAgICAgICAgICAgICAgIGhhc0ZsYWcoYXR0cmlidXRlcy5mbGFncywgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgdXNlcklkID0gKGludCkgbXVsdGl1c2VyX2dldF91c2VyX2lkKHVpZCk7CkBAIC0zOTAsNiArMzkxLDcgQEAKIHNwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAogICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsRGV2aWNlcywKKyAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CkBAIC00MDEsNyArNDAzLDExIEBACiAgICAgICAgICAgICBpZiAoKFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCiAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlID09IGlucHV0U291cmNlKSB8fAogICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgIT0gaW5wdXRTb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlICE9IGlucHV0U291cmNlKSB8fAorICAgICAgICAgICAgICAgKFJVTEVfTUFUQ0hfVUlEID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgfHwKKyAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfVUlEID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkICE9IHVpZCkpIHsKICAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBQb2xpY3lNaXggb25seSBmb3IgcmVtb3RlIHN1Ym1peCBmb3IgaW5wdXQKICAgICAgICAgICAgICAgICAvLyBzbyBtaXgtPm1EZXZpY2VUeXBlIGNhbiBvbmx5IGJlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKQEAgLTQ2Myw3ICs0NjksNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCiAgICAgLy8gICAgIm1hdGNoIHVpZCIgcnVsZSBmb3IgdGhpcyB1aWQsIHJldHVybiBhbiBlcnJvcgogICAgIC8vICAgIChhZGRpbmcgYSB1aWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQpAQCAtNTY1LDcgKzU3MSw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCiAgICAgLy8gICAgIm1hdGNoIHVzZXJJZCIgcnVsZSBmb3IgdGhpcyB1c2VySWQsIHJldHVybiBhbiBlcnJvcgogICAgIC8vICAgIChhZGRpbmcgYSB1c2VySWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCAyYTE4ZjE5Li44NjY0MTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMzksMTIgKzM5LDEyIEBACiBib29sIEF1ZGlvUm91dGU6OnN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmc3JjUG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdAogewotICAgIGlmIChtU2luayA9PSAwIHx8IGRzdFBvcnQgPT0gMCB8fCBkc3RQb3J0ICE9IG1TaW5rKSB7CisgICAgaWYgKG1TaW5rID09IDAgfHwgc3JjUG9ydCA9PSAwIHx8IGRzdFBvcnQgPT0gMCB8fCAhZHN0UG9ydC0+ZXF1YWxzKG1TaW5rKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIEFMT0dWKCIlczogc2lua3MgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIG1TaW5rLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CiAgICAgZm9yIChjb25zdCBhdXRvICZzb3VyY2VQb3J0IDogbVNvdXJjZXMpIHsKLSAgICAgICAgaWYgKHNvdXJjZVBvcnQgPT0gc3JjUG9ydCkgeworICAgICAgICBpZiAoc291cmNlUG9ydC0+ZXF1YWxzKHNyY1BvcnQpKSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IHNvdXJjZXMgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIHNvdXJjZVBvcnQtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IGEyOWU2MGUuLmE5MmQzMWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC00OSwxMCArNDksMTMgQEAKIHsKIH0KIAorLy8gTGV0IERldmljZURlc2NyaXB0b3JCYXNlIGluaXRpYWxpemUgdGhlIGFkZHJlc3Mgc2luY2UgaXQgaGFuZGxlcyBzcGVjaWZpYyBjYXNlcyBsaWtlCisvLyBsZWdhY3kgcmVtb3RlIHN1Ym1peCB3aGVyZSAiMCIgaXMgYWRkZWQgYXMgZGVmYXVsdCBhZGRyZXNzLgogRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2VUeXBlQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKLSAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoZGV2aWNlVHlwZUFkZHIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbUVuY29kZWRGb3JtYXRzKGVuY29kZWRGb3JtYXRzKQorICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZShkZXZpY2VUeXBlQWRkciksIG1UYWdOYW1lKHRhZ05hbWUpLCBtRW5jb2RlZEZvcm1hdHMoZW5jb2RlZEZvcm1hdHMpLAorICAgICAgICBtRGVjbGFyZWRBZGRyZXNzKERldmljZURlc2NyaXB0b3JCYXNlOjphZGRyZXNzKCkpCiB7CiAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgLyogSWYgZnJhbWV3b3JrIHJ1bnMgYWdhaW5zdCBhIHByZSA1LjAgQXVkaW8gSEFMLCBlbmNvZGVkIGZvcm1hdHMgYXJlIGFic2VudCBmcm9tIHRoZSBjb25maWcuCkBAIC03NSw2ICs3OCwxMCBAQAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkZXRhY2goKSB7CiAgICAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBQb2xpY3lBdWRpb1BvcnQ6OmRldGFjaCgpOworICAgIC8vIFRoZSBkZXZpY2UgYWRkcmVzcyBtYXkgaGF2ZSBiZWVuIG92ZXJ3cml0dGVuIG9uIGRldmljZSBjb25uZWN0aW9uCisgICAgc2V0QWRkcmVzcyhtRGVjbGFyZWRBZGRyZXNzKTsKKyAgICAvLyBEZXZpY2UgUG9ydCBkb2VzIG5vdCBoYXZlIGEgbmFtZSB1bmxlc3MgcHJvdmlkZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlCisgICAgc2V0TmFtZSgiIik7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CkBAIC0xNTUsOCArMTYyLDEyIEBACiB2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAogewogICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlQWRkci5tVHlwZSk7Ci0gICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0KHBvcnQpOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CisgICAgdG9BdWRpb1BvcnRJbnRlcm5hbChwb3J0KTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkgY29uc3QgeworICAgIEFMT0dWKCJEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgpIHY3IGhhbmRsZSAlZCB0eXBlICUwOHgiLCBtSWQsIG1EZXZpY2VUeXBlQWRkci5tVHlwZSk7CisgICAgdG9BdWRpb1BvcnRJbnRlcm5hbChwb3J0KTsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjppbXBvcnRBdWRpb1BvcnRBbmRQaWNrQXVkaW9Qcm9maWxlKApAQCAtMjEzLDYgKzIyNCwxOCBAQAogICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlcyIsIGR1bXBEZXZpY2VUeXBlcyhtRGV2aWNlVHlwZXMpLmNfc3RyKCkpOwogfQogCit2b2lkIERldmljZVZlY3Rvcjo6cmVmcmVzaEF1ZGlvUHJvZmlsZXMoKSB7CisgICAgaWYgKGVtcHR5KCkpIHsKKyAgICAgICAgbVN1cHBvcnRlZFByb2ZpbGVzLmNsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVN1cHBvcnRlZFByb2ZpbGVzID0gaXRlbUF0KDApLT5nZXRBdWRpb1Byb2ZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBtU3VwcG9ydGVkUHJvZmlsZXMgPSBpbnRlcnNlY3RBdWRpb1Byb2ZpbGVzKAorICAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRQcm9maWxlcywgaXRlbUF0KGkpLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgIH0KK30KKwogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewpAQCAtMjI3LDIzICsyNTAsMjcgQEAKIHsKICAgICBib29sIGFkZGVkID0gZmFsc2U7CiAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZSAhPSBudWxscHRyLCAiTnVsbCBwb2ludGVyIGZvdW5kIHdoZW4gYWRkaW5nIERldmljZVZlY3RvciIpOwogICAgICAgICBpZiAoaW5kZXhPZihkZXZpY2UpIDwgMCAmJiBTb3J0ZWRWZWN0b3I6OmFkZChkZXZpY2UpID49IDApIHsKICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoYWRkZWQpIHsKICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIHJlZnJlc2hBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogfQogCiBzc2l6ZV90IERldmljZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQogeworICAgIEFMT0dfQVNTRVJUKGl0ZW0gIT0gbnVsbHB0ciwgIkFkZGluZyBudWxsIHBvaW50ZXIgdG8gRGV2aWNlVmVjdG9yIik7CiAgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOwogCiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7CiAgICAgICAgIGlmIChyZXQgPj0gMCkgewogICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgICAgICByZWZyZXNoQXVkaW9Qcm9maWxlcygpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1coIkRldmljZVZlY3Rvcjo6YWRkIGRldmljZSAlMDh4IGFscmVhZHkgaW4iLCBpdGVtLT50eXBlKCkpOwpAQCAtMjUyLDYgKzI3OSwyMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2ludCBEZXZpY2VWZWN0b3I6OmRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIGxkZXZpY2UgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPio+KGxocyk7CisgICAgY29uc3QgYXV0byByZGV2aWNlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4qPihyaHMpOworICAgIGludCByZXQgPSAwOworCisgICAgLy8gc29ydCBieSB0eXBlLgorICAgIHJldCA9IGNvbXBhcmVfdHlwZShsZGV2aWNlLT50eXBlKCksIHJkZXZpY2UtPnR5cGUoKSk7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIC8vIGZvciBzYW1lIHR5cGUgaGlnaGVyIHByaW9yaXR5IGZvciBsYXRlc3QgZGV2aWNlLgorICAgIHJldCA9IGNvbXBhcmVfdHlwZShyZGV2aWNlLT5nZXRJZCgpLCBsZGV2aWNlLT5nZXRJZCgpKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLy8gZmFsbGJhY2sgdG8gZGVmYXVsdCBzb3J0IHVzaW5nIHBvaW50ZXIgYWRkcmVzcworICAgIHJldHVybiBTb3J0ZWRWZWN0b3I6OmRvX2NvbXBhcmUobGhzLCByaHMpOworfQorCiBzc2l6ZV90IERldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQogewogICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKQEAgLTI2Miw2ICszMDYsNyBAQAogICAgICAgICByZXQgPSBTb3J0ZWRWZWN0b3I6OnJlbW92ZUF0KHJldCk7CiAgICAgICAgIGlmIChyZXQgPj0gMCkgewogICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgICAgICByZWZyZXNoQXVkaW9Qcm9maWxlcygpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC0zNzUsNyArNDIwLDcgQEAKICAgICBpZiAoaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIFJldHVybiBudWxscHRyIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBlbXB0eS4KICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2lzX2lucHV0X2RldmljZSkpIHsKKyAgICB9IGVsc2UgaWYgKGFyZUFsbE9mU2FtZURldmljZVR5cGUodHlwZXMoKSwgYXVkaW9fY2FsbF9pc19pbnB1dF9kZXZpY2UpKSB7CiAgICAgICAgIC8vIEZvciBpbnB1dCBjYXNlLCByZXR1cm4gdGhlIGZpcnN0IG9uZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGRldmljZS4KICAgICAgICAgcmV0dXJuIHNpemUoKSA+IDEgPyBudWxscHRyIDogKmJlZ2luKCk7CiAgICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UpKSB7CkBAIC0zODgsNiArNDMzLDI0IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbURldmljZVR5cGVBZGRyKAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlVHlwZUFkZHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGV2aWNlKGRldmljZVR5cGVBZGRyLm1UeXBlLCBTdHJpbmc4KGRldmljZVR5cGVBZGRyLmdldEFkZHJlc3MoKSksCisgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tRGV2aWNlVHlwZUFkZHJWZWMoCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRyVmVjdG9yKSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VUeXBlQWRkciA6IGRldmljZVR5cGVBZGRyVmVjdG9yKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGdldERldmljZUZyb21EZXZpY2VUeXBlQWRkcihkZXZpY2VUeXBlQWRkcik7CisgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKwogdm9pZCBEZXZpY2VWZWN0b3I6OnJlcGxhY2VEZXZpY2VzQnlUeXBlKAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCkgewogICAgIERldmljZVZlY3RvciBkZXZpY2VzVG9SZW1vdmUgPSBnZXREZXZpY2VzRnJvbVR5cGUodHlwZVRvUmVtb3ZlKTsKQEAgLTQwOCw3ICs0NzEsNyBAQAogICAgIH0KIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZygpIGNvbnN0CitzdGQ6OnN0cmluZyBEZXZpY2VWZWN0b3I6OnRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8pIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4geyJBVURJT19ERVZJQ0VfTk9ORSJ9OwpAQCAtNDE4LDcgKzQ4MSw3IEBACiAgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKICAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKICAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZyhpbmNsdWRlU2Vuc2l0aXZlSW5mbyk7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQgKyAifSI7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDQxNTk2MmEuLjg0M2Y1ZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMDIsNiArMjAyLDE5IEBACiAgICAgfQogfQogCithdWRpb19pb19oYW5kbGVfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0SW9Gb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKmVmZmVjdFR5cGUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoZWZmZWN0LT5tU2Vzc2lvbiA9PSBzZXNzaW9uSWQgJiYgKGVmZmVjdFR5cGUgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgICAgIG1lbWNtcCgmZWZmZWN0LT5tRGVzYy50eXBlLCBlZmZlY3RUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSB7CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0LT5tSW87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworfQorCiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdAogewogICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKaW5kZXggZDMxZTQ0My4uM2ExNDNiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcApAQCAtNDEsNiArNDEsMTQgQEAKICAgICB9CiB9CiAKK3N0ZDo6c3RyaW5nIEh3TW9kdWxlOjpnZXRUYWdGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyaW5nOCAmYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjKQoreworICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBnZXREZWNsYXJlZERldmljZXMoKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MsIGNvZGVjKTsKKyAgICByZXR1cm4gZGV2aWNlRGVzYyA/IGRldmljZURlc2MtPmdldFRhZ05hbWUoKSA6IHN0ZDo6c3RyaW5ne307Cit9CisKIHN0YXR1c190IEh3TW9kdWxlOjphZGRPdXRwdXRQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKIHsKQEAgLTQ5LDcgKzU3LDggQEAKICAgICBwcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobmV3IEF1ZGlvUHJvZmlsZShjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgIiIgLyp0YWdOYW1lKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBnZXRUYWdGb3JEZXZpY2UoZGV2aWNlKSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgYWRkRHluYW1pY0RldmljZShkZXZEZXNjKTsKICAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQogICAgIGRldkRlc2MtPmF0dGFjaCh0aGlzKTsKQEAgLTExNiw3ICsxMjUsOCBAQAogICAgIHByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShuZXcgQXVkaW9Qcm9maWxlKGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlLCAiIiAvKnRhZ05hbWUqLywgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGdldFRhZ0ZvckRldmljZShkZXZpY2UpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOwogICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCiAgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwpAQCAtMjcxLDggKzI4MSw5IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKK3NwPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICp0YWdOYW1lKSBjb25zdAogewogICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogKnRoaXMpIHsKICAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8KQEAgLTI4NCw5ICsyOTUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgc3AgPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgU3RyaW5nOCgpLCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFnTmFtZSA9IGRldmljZURlc2MtPmdldFRhZ05hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdGFnTmFtZSA9IHByb2ZpbGUtPmdldFRhZyh7dHlwZX0pOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzI1LDE1ICszNDIsMzIgQEAKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKCFhbGxvd1RvQ3JlYXRlKSB7CisgICAgICAgICAgICBhdXRvIGR5bmFtaWNEZXZpY2VzID0gaHdNb2R1bGUtPmdldER5bmFtaWNEZXZpY2VzKCk7CisgICAgICAgICAgICBhdXRvIGR5bmFtaWNEZXZpY2UgPSBkeW5hbWljRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgZGV2QWRkcmVzcywgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICBpZiAoZHluYW1pY0RldmljZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRGV2aWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIERldmljZVZlY3RvciBtb2R1bGVEZXZpY2VzID0gaHdNb2R1bGUtPmdldEFsbERldmljZXMoKTsKICAgICAgICAgYXV0byBtb2R1bGVEZXZpY2UgPSBtb2R1bGVEZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBkZXZBZGRyZXNzLCBlbmNvZGVkRm9ybWF0KTsKKworICAgICAgICAvLyBQcmV2ZW50IG92ZXJ3cml0dGluZyBtb2R1bGVEZXZpY2UgYWRkcmVzcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUKKyAgICAgICAgLy8gYWRkcmVzcyAoc2luY2UgZ2V0RGV2aWNlIHdpdGggZW1wdHkgYWRkcmVzcyBpZ25vcmVzIG1hdGNoIG9uIGFkZHJlc3MpLCB1c2UgZHluYW1pYyBkZXZpY2UKKyAgICAgICAgaWYgKG1vZHVsZURldmljZSAmJiBhbGxvd1RvQ3JlYXRlICYmCisgICAgICAgICAgICAgICAgKCFtb2R1bGVEZXZpY2UtPmFkZHJlc3MoKS5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgIChtb2R1bGVEZXZpY2UtPmFkZHJlc3MoKS5jb21wYXJlKGRldkFkZHJlc3MuY19zdHIoKSkgIT0gMCkpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBpZiAobW9kdWxlRGV2aWNlKSB7CiAgICAgICAgICAgICBpZiAoZW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhbGxvd1RvQ3JlYXRlKSB7CiAgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgICAgICAgICAgICAgIC8vIE5hbWUgbWF5IGJlIG92ZXJ3cml0dGVuLCByZXN0b3JlZCBvbiBkZXRhY2guCiAgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRBZGRyZXNzKGRldkFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIC8vIE5hbWUgbWF5IGJlIG92ZXJ3cml0dGVuLCByZXN0b3JlZCBvbiBkZXRhY2guCiAgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXROYW1lKG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG1vZHVsZURldmljZTsKQEAgLTM1MiwxOCArMzg2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKIHsKLSAgICBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKHR5cGUsIGVuY29kZWRGb3JtYXQpOworICAgIHN0ZDo6c3RyaW5nIHRhZ05hbWUgPSB7fTsKKyAgICBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKHR5cGUsIGVuY29kZWRGb3JtYXQsICZ0YWdOYW1lKTsKICAgICBpZiAoaHdNb2R1bGUgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwNHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZSwKICAgICAgICAgICAgICAgYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIG5hbWUsIGFkZHJlc3MpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIHRhZ05hbWUsIGFkZHJlc3MpOwogICAgIGRldmljZS0+c2V0TmFtZShuYW1lKTsKICAgICBkZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7Ci0KLSAgLy8gQWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3Qgb2YgZHluYW1pYyBkZXZpY2VzCisgICAgZGV2aWNlLT5zZXREeW5hbWljKCk7CisgICAgLy8gQWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3Qgb2YgZHluYW1pYyBkZXZpY2VzCiAgICAgaHdNb2R1bGUtPmFkZER5bmFtaWNEZXZpY2UoZGV2aWNlKTsKICAgICAvLyBSZWNpcHJvY2FsbHkgYXR0YWNoIHRoZSBkZXZpY2UgdG8gdGhlIG1vZHVsZQogICAgIGRldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKQEAgLTM3NSw3ICs0MTAsNyBAQAogICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CiAgICAgICAgIC8vIEFkZCB0aGUgZGV2aWNlIGFzIHN1cHBvcnRlZCB0byBhbGwgcHJvZmlsZSBzdXBwb3J0aW5nICJ3ZWFrbHkiIG9yIG5vdCB0aGUgZGV2aWNlCiAgICAgICAgIC8vIGFjY29yZGluZyB0byBpdHMgdHlwZQotICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCBmYWxzZSAvKm1hdGNoQWRyZXNzKi8pKSB7CisgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UsIGZhbHNlIC8qbWF0Y2hBZGRyZXNzKi8pKSB7CiAKICAgICAgICAgICAgIC8vIEB0b2RvIHF1aWQgb2YgYXVkaW8gcHJvZmlsZT8gaW1wb3J0IHRoZSBwcm9maWxlIGZyb20gZGV2aWNlIG9mIHRoZSBzYW1lIHR5cGU/CiAgICAgICAgICAgICBjb25zdCBhdXRvICZpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSA9CkBAIC00MDYsMTAgKzQ0MSw5IEBACiAKICAgICAgICAgZGV2aWNlLT5kZXRhY2goKTsKICAgICAgICAgLy8gT25seSByZW1vdmUgZnJvbSBkeW5hbWljIGxpc3QsIG5vdCBmcm9tIGRlY2xhcmVkIGxpc3QhISEKLSAgICAgICAgaWYgKCFod01vZHVsZS0+Z2V0RHluYW1pY0RldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgIGlmICghaHdNb2R1bGUtPnJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGh3TW9kdWxlLT5yZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CiAgICAgICAgIEFMT0dWKCIlczogcmVtb3ZlZCBkeW5hbWljIGRldmljZSAlcyBmcm9tIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCBiZjFhMGY3Li4wOWI2MTRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgpAQCAtMTA1LDYgKzEwNSwxNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIElPUHJvZmlsZTo6Y29udGFpbnNTaW5nbGVEZXZpY2VTdXBwb3J0aW5nRW5jb2RlZEZvcm1hdHMoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UpIGNvbnN0IHsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UtPnR5cGUoKSk7CisgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoZGV2aWNlTGlzdC5iZWdpbigpLCBkZXZpY2VMaXN0LmVuZCgpLAorICAgICAgICAgICAgWyZkZXZpY2VdKHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlID09IGRldmljZURlc2MgJiYgZGV2aWNlRGVzYy0+aGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKTsgfSkgPT0gMTsKK30KKwogdm9pZCBJT1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nIHBvcnRTdHI7CkBAIC0xMTIsMTIgKzEyMywxMSBAQAogICAgIGRzdC0+YXBwZW5kKHBvcnRTdHIuY19zdHIoKSk7CiAKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gZmxhZ3M6IDB4JTA0eCIsIGdldEZsYWdzKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZsYWdzTGl0ZXJhbDsKLSAgICBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgIElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7Ci0gICAgfSBlbHNlIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewotICAgICAgICBPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKLSAgICB9CisgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsID0KKyAgICAgICAgICAgIGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/CisgICAgICAgICAgICB0b1N0cmluZyhzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihnZXRGbGFncygpKSkgOgorICAgICAgICAgICAgZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgPworICAgICAgICAgICAgdG9TdHJpbmcoc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KGdldEZsYWdzKCkpKSA6ICIiOwogICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggODgzZTcxMy4uODRlZDY1NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmFyaWFudD4KIAotI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgogI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KQEAgLTM2LDExICszNiwxNCBAQAogCiBuYW1lc3BhY2UgewogCi0vLyBUT0RPKG1uYWdhbm92KTogQ29uc2lkZXIgZmluZGluZyBhbiBhbHRlcm5hdGl2ZSBmb3IgdXNpbmcgSElETCBjb2RlLgotdXNpbmcgaGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIGhhcmR3YXJlOjpTdGF0dXM7CiB1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKIAorc3RhdGljIGlubGluZSBib29sIG1heWJlVmVuZG9yRXh0ZW5zaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgLy8gT25seSBjaGVja3Mgd2hldGhlciB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAidmVuZG9yIHByZWZpeCIuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIHZlbmRvclByZWZpeCA9ICJWWF8iOworICAgIHJldHVybiBzLnNpemUoKSA+IHZlbmRvclByZWZpeC5zaXplKCkgJiYgcy5zdWJzdHIoMCwgdmVuZG9yUHJlZml4LnNpemUoKSkgPT0gdmVuZG9yUHJlZml4OworfQorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgogc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKICAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CkBAIC04OSw3ICs5Miw2IEBACiAKICAgICB9OwogCi0gICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiAgICAgLy8gTm8gY2hpbGRyZW4KIH07CiAKQEAgLTEwNiw4ICsxMDgsNiBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOwogICAgIH07Ci0KLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKIH07CiAKIHN0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KQEAgLTEyNSw3ICsxMjUsNiBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heEFjdGl2ZUNvdW50ID0gIm1heEFjdGl2ZUNvdW50IjsKICAgICB9OwogCi0gICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiAgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMKIH07CiAKQEAgLTE0Nyw3ICsxNDYsNiBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuY29kZWRGb3JtYXRzID0gImVuY29kZWRGb3JtYXRzIjsKICAgICB9OwogCi0gICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiAgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQogfTsKIApAQCAtMTY2LDggKzE2NCw2IEBACiAgICAgfTsKIAogICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiB9OwogCiBzdHJ1Y3QgTW9kdWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEh3TW9kdWxlLCBId01vZHVsZUNvbGxlY3Rpb24+CkBAIC0xODcsMTMgKzE4MywxNCBAQAogCiAgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CiAKLSAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKICAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCiAgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKIH07CiAKIHN0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKIHsKKyAgICB0eXBlZGVmIHN0ZDo6bW9ub3N0YXRlIEVsZW1lbnQ7CisKICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKIAogICAgIHN0cnVjdCBBdHRyaWJ1dGVzCkBAIC0yMDMsMTQgKzIwMCwxNiBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuZ2luZUxpYnJhcnlTdWZmaXggPSAiZW5naW5lX2xpYnJhcnkiOwogICAgIH07CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CiB9OwogCiBzdHJ1Y3QgU3Vycm91bmRTb3VuZFRyYWl0cwogeworICAgIHR5cGVkZWYgc3RkOjptb25vc3RhdGUgRWxlbWVudDsKKwogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInN1cnJvdW5kU291bmQiOwogCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OwogICAgIC8vIENoaWxkcmVuOiBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzCiB9OwogCkBAIC0yMjQsMzkgKzIyMyw1NCBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3ViZm9ybWF0cyA9ICJzdWJmb3JtYXRzIjsKICAgICB9OwotCi0gICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CiB9OwogCiBjbGFzcyBQb2xpY3lTZXJpYWxpemVyCiB7CiBwdWJsaWM6Ci0gICAgUG9saWN5U2VyaWFsaXplcigpIDogbVZlcnNpb257c3RkOjp0b19zdHJpbmcoZ01ham9yKSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKGdNaW5vcil9Ci0gICAgewotICAgICAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLCByb290TmFtZSk7Ci0gICAgfQotICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcsCisgICAgICAgICAgICBib29sIGlnbm9yZVZlbmRvckV4dGVuc2lvbnMgPSBmYWxzZSk7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+CisgICAgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICpjb2xsZWN0aW9uLAorICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgdGVtcGxhdGUgPGNsYXNzIFRyYWl0PgorICAgIHN0ZDo6dmFyaWFudDxzdGF0dXNfdCwgdHlwZW5hbWUgVHJhaXQ6OkVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWFqb3IgPSAxOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0gICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWlub3IgPSAwOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCiAKICAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7CiAKLSAgICBjb25zdCBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKKyAgICBib29sIG1JZ25vcmVWZW5kb3JFeHRlbnNpb25zID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgbUNoYW5uZWxNYXNrc1NlcGFyYXRvciA9ICIsIjsKKyAgICBzdGQ6OnN0cmluZyBtU2FtcGxpbmdSYXRlc1NlcGFyYXRvciA9ICIsIjsKKyAgICBzdGQ6OnN0cmluZyBtRmxhZ3NTZXBhcmF0b3IgPSAifCI7CiAKICAgICAvLyBDaGlsZHJlbjogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzLCBTdXJyb3VuZFNvdW5kVHJhaXRzIChvcHRpb25hbCkKIH07CiAKKy8vIERlbGV0ZXIgdXNpbmcgZnJlZSgpIGZvciB1c2Ugd2l0aCBzdGQ6OnVuaXF1ZV9wdHI8Pi4gU2VlIGFsc28gVW5pcXVlQ1B0cjw+IGJlbG93Lgorc3RydWN0IEZyZWVEZWxldGUgeworICAgIC8vIE5PVEU6IERlbGV0aW5nIGEgY29uc3Qgb2JqZWN0IGlzIHZhbGlkIGJ1dCBmcmVlKCkgdGFrZXMgYSBub24tY29uc3QgcG9pbnRlci4KKyAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgdm9pZCogcHRyKSBjb25zdCB7CisgICAgICAgIGZyZWUoY29uc3RfY2FzdDx2b2lkKj4ocHRyKSk7CisgICAgfQorfTsKKworLy8gQWxpYXMgZm9yIHN0ZDo6dW5pcXVlX3B0cjw+IHRoYXQgdXNlcyB0aGUgQyBmdW5jdGlvbiBmcmVlKCkgdG8gZGVsZXRlIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIFVuaXF1ZUNQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRnJlZURlbGV0ZT47CisKIHRlbXBsYXRlIDxjbGFzcyBUPgogY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKIHRlbXBsYXRlIDw+CiBjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOwotLy8gaHR0cDovL2IvMTExMDY3Mjc3IC0gQWRkIGJhY2sgY29uc3RleHByIHdoZW4gd2Ugc3dpdGNoIHRvIEMrKzE3LgogdGVtcGxhdGUgPD4KLWF1dG8geG1sRGVsZXRlcjx4bWxDaGFyPiA9IFtdKHhtbENoYXIgKnMpIHsgeG1sRnJlZShzKTsgfTsKK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CiAKIC8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KIHRlbXBsYXRlIDxjbGFzcyBUPgpAQCAtMjk2LDcgKzMxMCw3IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdD4KLXN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihjb25zdCB4bWxOb2RlICpjdXIsCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAogICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAqY29sbGVjdGlvbiwKICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKIHsKQEAgLTMwOSwxNCArMzIzLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBUcmFpdDo6ZGVzZXJpYWxpemUoY2hpbGQsIHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGF1dG8gbWF5YmVFbGVtZW50ID0gZGVzZXJpYWxpemU8VHJhaXQ+KGNoaWxkLCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChtYXliZUVsZW1lbnQuaW5kZXgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDE+KG1heWJlRWxlbWVudCksIGNvbGxlY3Rpb24pOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobUlnbm9yZVZlbmRvckV4dGVuc2lvbnMgJiYgc3RkOjpnZXQ8c3RhdHVzX3Q+KG1heWJlRWxlbWVudCkgPT0gTk9fSU5JVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGEgdmVuZG9yIGV4dGVuc2lvbiBlbGVtZW50LgogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzI5LDE1ICszNDYsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVJldHVybjxBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAotICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPEF1ZGlvR2FpblRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgQXVkaW9HYWluVHJhaXRzOjpQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogeworICAgIHVzaW5nIEF0dHJpYnV0ZXMgPSBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGF0aWMgdWludDMyX3QgaW5kZXggPSAwOwotICAgIEVsZW1lbnQgZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgrKywgdHJ1ZSk7CisgICAgQXVkaW9HYWluVHJhaXRzOjpFbGVtZW50IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4KyssIHRydWUpOwogCiAgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7Ci0gICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKKyAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSwgIiAiKSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOwpAQCAtMzkyLDIwICs0MTIsMjggQEAKICAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIGdhaW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiB9CiAKLVJldHVybjxBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAotICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+CitQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxBdWRpb1Byb2ZpbGVUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIEF1ZGlvUHJvZmlsZVRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOworCiAgICAgc3RkOjpzdHJpbmcgc2FtcGxpbmdSYXRlcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOwogICAgIHN0ZDo6c3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmZvcm1hdCk7CiAgICAgc3RkOjpzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOwogCi0gICAgRWxlbWVudCBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAotICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKLSAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOworICAgIGlmIChtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucyAmJiBtYXliZVZlbmRvckV4dGVuc2lvbihmb3JtYXQpKSB7CisgICAgICAgIEFMT0dJKCIlczogdmVuZG9yIGV4dGVuc2lvbiBmb3JtYXQgXCIlc1wiIHNraXBwZWQiLCBfX2Z1bmNfXywgZm9ybWF0LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpFbGVtZW50IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCisgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCBtQ2hhbm5lbE1hc2tzU2VwYXJhdG9yLmNfc3RyKCkpLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgbVNhbXBsaW5nUmF0ZXNTZXBhcmF0b3IuY19zdHIoKSkpOwogCiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBnRHluYW1pY0Zvcm1hdCk7CiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuZW1wdHkoKSk7CkBAIC00MTQsMzAgKzQ0MiwzMyBAQAogICAgIHJldHVybiBwcm9maWxlOwogfQogCi1SZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCi0gICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCit0ZW1wbGF0ZTw+CitzdGQ6OnZhcmlhbnQ8c3RhdHVzX3QsIE1peFBvcnRUcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPE1peFBvcnRUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCwgTWl4UG9ydFRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczsKKwogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCBNaXhQb3J0VHJhaXRzOjp0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CiAgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIEVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgcG9ydFJvbGUpOworICAgIE1peFBvcnRUcmFpdHM6OkVsZW1lbnQgbWl4UG9ydCA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgcG9ydFJvbGUpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKHByb2ZpbGVzLmVtcHR5KCkpIHsKICAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoZ0R5bmFtaWNGb3JtYXQpKTsKQEAgLTQ1MSwxMCArNDgyLDEwIEBACiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7Ci0gICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhPdXRwdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOworICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBTaW5rIHJvbGUKLSAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MpKTsKKyAgICAgICAgICAgIG1peFBvcnQtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsIG1GbGFnc1NlcGFyYXRvci5jX3N0cigpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgc3RkOjpzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOwpAQCAtNDY5LDQzICs1MDAsNTEgQEAKICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7CiAgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY2hpbGQsICZnYWlucywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBtaXhQb3J0LT5zZXRHYWlucyhnYWlucyk7CiAKICAgICByZXR1cm4gbWl4UG9ydDsKIH0KIAotUmV0dXJuPERldmljZVBvcnRUcmFpdHM6OkVsZW1lbnQ+IERldmljZVBvcnRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKLSAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3RlbXBsYXRlPD4KK3N0ZDo6dmFyaWFudDxzdGF0dXNfdCwgRGV2aWNlUG9ydFRyYWl0czo6RWxlbWVudD4gUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemU8RGV2aWNlUG9ydFRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgRGV2aWNlUG9ydFRyYWl0czo6UHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczsKKyAgICBhdXRvJiB0YWcgPSBEZXZpY2VQb3J0VHJhaXRzOjp0YWc7CisKICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dGFnTmFtZSk7CiAgICAgaWYgKG5hbWUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKICAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogbm8gdHlwZSBmb3IgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOwogICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6cm9sZSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPwogICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAorICAgIGlmIChtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucyAmJiBtYXliZVZlbmRvckV4dGVuc2lvbih0eXBlTmFtZSkpIHsKKyAgICAgICAgQUxPR0koIiVzOiB2ZW5kb3IgZXh0ZW5zaW9uIGRldmljZSB0eXBlIFwiJXNcIiBza2lwcGVkIiwgX19mdW5jX18sIHR5cGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBpZiAoIWRldmljZUZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CisgICAgaWYgKCFEZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcodHlwZU5hbWUsIHR5cGUpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpIHsKICAgICAgICAgQUxPR1coIiVzOiBiYWQgdHlwZSAlMDh4IiwgX19mdW5jX18sIHR5cGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBlbmNvZGVkRm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cyk7CiAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzLCBlbmNvZGVkRm9ybWF0c0xpdGVyYWwuY19zdHIoKSk7CkBAIC01MTQsMTIgKzU1MywxMyBAQAogICAgICAgICBlbmNvZGVkRm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKGVuY29kZWRGb3JtYXRzTGl0ZXJhbCwgIiAiKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOwotICAgIEVsZW1lbnQgZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIG5hbWUsIGFkZHJlc3MsIGVuY29kZWRGb3JtYXRzKTsKKyAgICBEZXZpY2VQb3J0VHJhaXRzOjpFbGVtZW50IGRldmljZURlc2MgPQorICAgICAgICAgICAgbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgbmFtZSwgYWRkcmVzcywgZW5jb2RlZEZvcm1hdHMpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGN1ciwgJnByb2ZpbGVzLCBOVUxMKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChwcm9maWxlcy5lbXB0eSgpKSB7CiAgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKGdEeW5hbWljRm9ybWF0KSk7CkBAIC01MzIsNTcgKzU3Miw2OSBAQAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgogICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGN1ciwgJmRldmljZURlc2MtPm1HYWlucywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgZGV2aWNlRGVzYy0+Z2V0TmFtZSgpLmNfc3RyKCksIHR5cGUsIGRldmljZURlc2MtPmFkZHJlc3MoKS5jX3N0cigpKTsKICAgICByZXR1cm4gZGV2aWNlRGVzYzsKIH0KIAotUmV0dXJuPFJvdXRlVHJhaXRzOjpFbGVtZW50PiBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCit0ZW1wbGF0ZTw+CitzdGQ6OnZhcmlhbnQ8c3RhdHVzX3QsIFJvdXRlVHJhaXRzOjpFbGVtZW50PiBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxSb3V0ZVRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUm91dGVUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnR5cGUpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBhdWRpb19yb3V0ZV90eXBlX3Qgcm91dGVUeXBlID0gKHR5cGUgPT0gQXR0cmlidXRlczo6dHlwZU1peCkgPwogICAgICAgICAgICAgICAgIEFVRElPX1JPVVRFX01JWCA6IEFVRElPX1JPVVRFX01VWDsKIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOwotICAgIEVsZW1lbnQgcm91dGUgPSBuZXcgQXVkaW9Sb3V0ZShyb3V0ZVR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgUm91dGVUcmFpdHM6OnRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBSb3V0ZVRyYWl0czo6RWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKICAgICBzdGQ6OnN0cmluZyBzaW5rQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNpbmspOwogICAgIGlmIChzaW5rQXR0ci5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c2luayk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIENvbnZlcnQgU2luayBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc2luayA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoc2lua0F0dHIpOwotICAgIGlmIChzaW5rID09IE5VTEwpIHsKKyAgICBpZiAoc2luayA9PSBOVUxMICYmICFtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucykgewogICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoc2luayA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJTa2lwcGluZyByb3V0ZSB0byBzaW5rIFwiJXNcIiBhcyBpdCBsaWtlbHkgaGFzIHZlbmRvciBleHRlbnNpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgc2lua0F0dHIuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByb3V0ZS0+c2V0U2luayhzaW5rKTsKIAogICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gVG9rZW5pemUgYW5kIENvbnZlcnQgU291cmNlcyBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIFBvbGljeUF1ZGlvUG9ydFZlY3RvciBzb3VyY2VzOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHNvdXJjZXNMaXRlcmFse3N0cm5kdXAoCisgICAgVW5pcXVlQ1B0cjxjaGFyPiBzb3VyY2VzTGl0ZXJhbHtzdHJuZHVwKAogICAgICAgICAgICAgICAgIHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSl9OwogICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayhzb3VyY2VzTGl0ZXJhbC5nZXQoKSwgIiwiKTsKICAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKICAgICAgICAgICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc291cmNlID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShkZXZUYWcpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwgJiYgIW1JZ25vcmVWZW5kb3JFeHRlbnNpb25zKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIGRldlRhZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJTa2lwcGluZyByb3V0ZSBzb3VyY2UgXCIlc1wiIGFzIGl0IGxpa2VseSBoYXMgdmVuZG9yIGV4dGVuc2lvbiB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldlRhZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2VzLmFkZChzb3VyY2UpOwogICAgICAgICB9CiAgICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCAiLCIpOwogICAgIH0KQEAgLTU5NiwxMiArNjQ4LDIwIEBACiAgICAgcmV0dXJuIHJvdXRlOwogfQogCi1SZXR1cm48TW9kdWxlVHJhaXRzOjpFbGVtZW50PiBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBNb2R1bGVUcmFpdHM6OkVsZW1lbnQ+IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPE1vZHVsZVRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgTW9kdWxlVHJhaXRzOjpQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7CisgICAgdXNpbmcgQXR0cmlidXRlcyA9IE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczsKKyAgICBhdXRvJiB0YWcgPSBNb2R1bGVUcmFpdHM6OnRhZzsKKyAgICBhdXRvJiBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZXNUYWc7CisgICAgYXV0byYgY2hpbGRBdHRhY2hlZERldmljZVRhZyA9IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZVRhZzsKKyAgICBhdXRvJiBjaGlsZERlZmF1bHRPdXRwdXREZXZpY2VUYWcgPSBNb2R1bGVUcmFpdHM6OmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKKwogICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHVpbnQzMl90IHZlcnNpb25NYWpvciA9IDAsIHZlcnNpb25NaW5vciA9IDA7CiAgICAgc3RkOjpzdHJpbmcgdmVyc2lvbkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKQEAgLTYxMSwyOSArNjcxLDI5IEBACiAgICAgICAgICAgICAgIHZlcnNpb25NYWpvciwgdmVyc2lvbk1ham9yKTsKICAgICB9CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIE1vZHVsZVRyYWl0czo6dGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwogCi0gICAgRWxlbWVudCBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CisgICAgTW9kdWxlVHJhaXRzOjpFbGVtZW50IG1vZHVsZSA9IG5ldyBId01vZHVsZShuYW1lLmNfc3RyKCksIHZlcnNpb25NYWpvciwgdmVyc2lvbk1pbm9yKTsKIAotICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuczogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKKyAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbjogQXVkaW8gTWl4IFBvcnQsIEF1ZGlvIERldmljZSBQb3J0cyAoU291cmNlL1NpbmspLCBBdWRpbyBSb3V0ZXMKICAgICBNaXhQb3J0VHJhaXRzOjpDb2xsZWN0aW9uIG1peFBvcnRzOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihjdXIsICZtaXhQb3J0cywgTlVMTCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICBtb2R1bGUtPnNldFByb2ZpbGVzKG1peFBvcnRzKTsKIAogICAgIERldmljZVBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gZGV2aWNlUG9ydHM7CiAgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGN1ciwgJmRldmljZVBvcnRzLCBOVUxMKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZVBvcnRzKTsKIAogICAgIFJvdXRlVHJhaXRzOjpDb2xsZWN0aW9uIHJvdXRlczsKICAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGN1ciwgJnJvdXRlcywgbW9kdWxlLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIG1vZHVsZS0+c2V0Um91dGVzKHJvdXRlcyk7CiAKQEAgLTY1Myw2ICs3MTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZyb21UYWdOYW1lKHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZERldmljZS5nZXQoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0ciAmJiBtSWdub3JlVmVuZG9yRXh0ZW5zaW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJTa2lwcGVkIGF0dGFjaGVkIGRldmljZSBcIiVzXCIgYmVjYXVzZSBpdCBsaWtlbHkgdXNlcyBhIHZlbmRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24gdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhdHRhY2hlZERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGREZXZpY2UoZGV2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY3OCwxMCArNzQ0LDE1IEBACiAgICAgcmV0dXJuIG1vZHVsZTsKIH0KIAotc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBHbG9iYWxDb25maWdUcmFpdHM6OkVsZW1lbnQ+CitQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZTxHbG9iYWxDb25maWdUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpyb290LCBHbG9iYWxDb25maWdUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGNvbmZpZykKIHsKKyAgICB1c2luZyBBdHRyaWJ1dGVzID0gR2xvYmFsQ29uZmlnVHJhaXRzOjpBdHRyaWJ1dGVzOworCiAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KEdsb2JhbENvbmZpZ1RyYWl0czo6dGFnKSkpIHsKICAgICAgICAgICAgIGJvb2wgdmFsdWU7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBhdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWQpOwogICAgICAgICAgICAgaWYgKCFhdHRyLmVtcHR5KCkgJiYKQEAgLTcwMywxMiArNzc0LDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQordGVtcGxhdGU8Pgorc3RkOjp2YXJpYW50PHN0YXR1c190LCBTdXJyb3VuZFNvdW5kVHJhaXRzOjpFbGVtZW50PgorUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemU8U3Vycm91bmRTb3VuZFRyYWl0cz4oCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QsIFN1cnJvdW5kU291bmRUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IGNvbmZpZykKIHsKICAgICBjb25maWctPnNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKIAogICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihTdXJyb3VuZFNvdW5kVHJhaXRzOjp0YWcpKSkgewogICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cyBmb3JtYXRzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAogICAgICAgICAgICAgICAgICAgICBjdXIsICZmb3JtYXRzLCBudWxscHRyKTsKQEAgLTcyMSwyMCArNzk1LDI5IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1SZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCi0gICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3RlbXBsYXRlPD4KK3N0ZDo6dmFyaWFudDxzdGF0dXNfdCwgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4KK1BvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplPFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM+KAorICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIsIFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OlB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7CisgICAgdXNpbmcgQXR0cmlidXRlcyA9IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHM6OkF0dHJpYnV0ZXM7CisKICAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CiAgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKG1JZ25vcmVWZW5kb3JFeHRlbnNpb25zICYmIG1heWJlVmVuZG9yRXh0ZW5zaW9uKGZvcm1hdExpdGVyYWwpKSB7CisgICAgICAgIEFMT0dJKCIlczogdmVuZG9yIGV4dGVuc2lvbiBmb3JtYXQgXCIlc1wiIHNraXBwZWQiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0TGl0ZXJhbCk7CiAgICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewogICAgICAgICBBTE9HRSgiJXM6IFVucmVjb2duaXplZCBmb3JtYXQgJXMiLCBfX2Z1bmNfXywgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgRWxlbWVudCBwYWlyID0gc3RkOjptYWtlX3BhaXIoZm9ybWF0LCBDb2xsZWN0aW9uOjptYXBwZWRfdHlwZXt9KTsKKyAgICBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzOjpFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIGZvcm1hdCwgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6Q29sbGVjdGlvbjo6bWFwcGVkX3R5cGV7fSk7CiAKICAgICBzdGQ6OnN0cmluZyBzdWJmb3JtYXRzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN1YmZvcm1hdHMpOwogICAgIGlmIChzdWJmb3JtYXRzTGl0ZXJhbC5lbXB0eSgpKSByZXR1cm4gcGFpcjsKQEAgLTc0MywxNCArODI2LDE2IEBACiAgICAgICAgIGF1dG8gcmVzdWx0ID0gcGFpci5zZWNvbmQuaW5zZXJ0KHN1YmZvcm1hdCk7CiAgICAgICAgIGlmICghcmVzdWx0LnNlY29uZCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIHN1YmZvcm1hdCAleCB0byBjb2xsZWN0aW9uIiwgX19mdW5jX18sIHN1YmZvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcGFpcjsKIH0KIAotc3RhdHVzX3QgUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKK3N0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlnbm9yZVZlbmRvckV4dGVuc2lvbnMpCiB7CisgICAgbUlnbm9yZVZlbmRvckV4dGVuc2lvbnMgPSBpZ25vcmVWZW5kb3JFeHRlbnNpb25zOwogICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKICAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwpAQCAtNzc2LDEyICs4NjEsMTQgQEAKICAgICAgICAgQUxPR0UoIiVzOiBObyB2ZXJzaW9uIGZvdW5kIGluIHJvb3Qgbm9kZSAlcyIsIF9fZnVuY19fLCByb290TmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh2ZXJzaW9uICE9IG1WZXJzaW9uKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ICVzIGdvdCAlcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLAotICAgICAgICAgICAgICB2ZXJzaW9uLmNfc3RyKCkpOworICAgIGlmICh2ZXJzaW9uID09ICI3LjAiKSB7CisgICAgICAgIG1DaGFubmVsTWFza3NTZXBhcmF0b3IgPSBtU2FtcGxpbmdSYXRlc1NlcGFyYXRvciA9IG1GbGFnc1NlcGFyYXRvciA9ICIgIjsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb24gIT0gIjEuMCIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3RlZCBcIjEuMFwiIG9yIFwiNy4wXCIgZ290IFwiJXNcIiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHZlcnNpb24uY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIExldHMgZGVzZXJpYWxpemUgY2hpbGRyZW4KKyAgICAvLyBMZXQncyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihyb290LCAmbW9kdWxlcywgY29uZmlnKTsKQEAgLTc5MSwxMCArODc4LDEwIEBACiAgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKyAgICBkZXNlcmlhbGl6ZTxHbG9iYWxDb25maWdUcmFpdHM+KHJvb3QsIGNvbmZpZyk7CiAKICAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCi0gICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKyAgICBkZXNlcmlhbGl6ZTxTdXJyb3VuZFNvdW5kVHJhaXRzPihyb290LCBjb25maWcpOwogCiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQpAQCAtODA0LDcgKzg5MSwxNyBAQAogc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7CiAgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOwotICAgIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGVOYW1lLCBjb25maWcpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZU5hbWUsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgY29uZmlnLT5jbGVhcigpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlRm9yVnRzKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGVOYW1lLCBjb25maWcsIHRydWUgLyppZ25vcmVWZW5kb3JFeHRlbnNpb25zKi8pOworICAgIGlmIChzdGF0dXMgIT0gT0spIGNvbmZpZy0+Y2xlYXIoKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCmluZGV4IGY0NjEwYmIuLjY3MWIzMGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xNyw2ICsxNywxNSBAQAogc29vbmdfbmFtZXNwYWNlIHsKIH0KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJhMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2EyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzMjNmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQTJkcCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iYTJkcCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSGVhZHBob25lcyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIFNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgPC9kZXZpY2VQb3J0cz4KKyAgICA8cm91dGVzPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgSGVhZHBob25lcyIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImEyZHAgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBBMkRQIEluIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWFkNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBJbnB1dCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYTJkcCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iYTJkcCBpbnB1dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9IkJUIEEyRFAgSW4iLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggYjI4MzgxYi4uZGNkYzAzNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWNsYXJhdGlvbiwgaS5lLiBTaW5rIERFVklDRSBQT1JUIC0tPgogICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkVhcnBpZWNlIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFIiByb2xlPSJzaW5rIj4KICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgogICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiByb2xlPSJzaW5rIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIGFkZHJlc3M9IiI+CiAgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MWEwMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iNy4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKworICAgIDwhLS0gTW9kdWxlcyBzZWN0aW9uOgorICAgICAgICBUaGVyZSBpcyBvbmUgc2VjdGlvbiBwZXIgYXVkaW8gSFcgbW9kdWxlIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtLgorICAgICAgICBFYWNoIG1vZHVsZSBzZWN0aW9uIHdpbGwgY29udGFpbnMgdHdvIG1hbmRhdG9yeSB0YWdzIGZvciBhdWRpbyBIQUwg4oCcaGFsVmVyc2lvbuKAnSBhbmQg4oCcbmFtZeKAnS4KKyAgICAgICAgVGhlIG1vZHVsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgaW4gY3VycmVudCAuY29uZiBmaWxlOgorICAgICAgICAgICAgICAgIOKAnHByaW1hcnnigJ0sIOKAnEEyRFDigJ0sIOKAnHJlbW90ZV9zdWJtaXjigJ0sIOKAnFVTQuKAnQorICAgICAgICBFYWNoIG1vZHVsZSB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKKyAgICAgICAg4oCcZGV2aWNlUG9ydHPigJ06IGEgbGlzdCBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgZm9yIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgYWNjZXNzaWJsZSB2aWEgdGhpcworICAgICAgICBtb2R1bGUuCisgICAgICAgIFRoaXMgY29udGFpbnMgYm90aCBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzIGFuZCByZW1vdmFibGUgZGV2aWNlcy4KKyAgICAgICAg4oCcbWl4UG9ydHPigJ06IGxpc3RpbmcgYWxsIG91dHB1dCBhbmQgaW5wdXQgc3RyZWFtcyBleHBvc2VkIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAg4oCccm91dGVz4oCdOiBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb25zIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIG9yIGJldHdlZW4gc3RyZWFtIGFuZAorICAgICAgICBkZXZpY2VzLgorICAgICAgICAgICAgInJvdXRlIjogaXMgZGVmaW5lZCBieSBhbiBhdHRyaWJ1dGU6CisgICAgICAgICAgICAgICAgLSJ0eXBlIjogPG11eHxtaXg+IG1lYW5zIGFsbCBzb3VyY2VzIGFyZSBtdXR1YWwgZXhjbHVzaXZlIChtdXgpIG9yIGNhbiBiZSBtaXhlZCAobWl4KQorICAgICAgICAgICAgICAgIC0ic2luayI6IHRoZSBzaW5rIGludm9sdmVkIGluIHRoaXMgcm91dGUKKyAgICAgICAgICAgICAgICAtInNvdXJjZXMiOiBhbGwgdGhlIHNvdXJjZXMgdGhhbiBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaW5rIHZpYSB2aXMgcm91dGUKKyAgICAgICAg4oCcYXR0YWNoZWREZXZpY2Vz4oCdOiBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICBUaGUgYXR0YWNoZWREZXZpY2VzIHNlY3Rpb24gaXMgYSBsaXN0IG9mIGRldmljZXMgbmFtZXMuIFRoZSBuYW1lcyBjb3JyZXNwb25kIHRvIGRldmljZSBuYW1lcworICAgICAgICBkZWZpbmVkIGluIDxkZXZpY2VQb3J0cz4gc2VjdGlvbi4KKyAgICAgICAg4oCcZGVmYXVsdE91dHB1dERldmljZeKAnTogZGV2aWNlIHRvIGJlIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vIHBvbGljeSBydWxlIGFwcGxpZXMKKyAgICAtLT4KKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIzLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBCYWNrIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRlZXBfYnVmZmVyIiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJjb21wcmVzc2VkX29mZmxvYWQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9NUDMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUNfTEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pY2VfdHgiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJ2b2ljZV9yeCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVjbGFyYXRpb24sIGkuZS4gU2luayBERVZJQ0UgUE9SVCAtLT4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJFYXJwaWVjZSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgcm9sZT0ic2luayIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiBhZGRyZXNzPSIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgICAgICA8Z2FpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z2FpbiBuYW1lPSJnYWluXzEiIG1vZGU9IkFVRElPX0dBSU5fTU9ERV9KT0lOVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlTUI9Ii04NDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWVNQj0iNDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZU1CPSIwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcFZhbHVlTUI9IjEwMCIvPgorICAgICAgICAgICAgICAgICAgICA8L2dhaW5zPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkc2V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkcGhvbmVzIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIEhlYWRzZXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIENhciBLaXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJUZWxlcGhvbnkgVHgiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisKKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gQmFjayBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CQUNLX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDExMDI1IDEyMDAwIDE2MDAwIDIyMDUwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyBBVURJT19DSEFOTkVMX0lOX1NURVJFTyBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iV2lyZWQgSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTEwMjUgMTIwMDAgMTYwMDAgMjIwNTAgMjQwMDAgMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iVGVsZXBob255IFJ4IiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KKyAgICAgICAgICAgIDwhLS0gcm91dGUgZGVjbGFyYXRpb24sIGkuZS4gbGlzdCBhbGwgYXZhaWxhYmxlIHNvdXJjZXMgZm9yIGEgZ2l2ZW4gc2luayAtLT4KKyAgICAgICAgICAgIDxyb3V0ZXM+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iRWFycGllY2UiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLGNvbXByZXNzZWRfb2ZmbG9hZCxCVCBTQ08gSGVhZHNldCBNaWMsVGVsZXBob255IFJ4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iV2lyZWQgSGVhZHNldCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJXaXJlZCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkZWVwX2J1ZmZlcixjb21wcmVzc2VkX29mZmxvYWQsQlQgU0NPIEhlYWRzZXQgTWljLFRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJUZWxlcGhvbnkgVHgiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxCdWlsdC1JbiBCYWNrIE1pYyxXaXJlZCBIZWFkc2V0IE1pYyxCVCBTQ08gSGVhZHNldCBNaWMsIHZvaWNlX3R4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0idm9pY2VfcngiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisKKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBBMmRwIElucHV0IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCIvPgorCisgICAgPC9tb2R1bGVzPgorICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KKworICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCmluZGV4IGI0Y2MxZDMuLjVmNGU1ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbApAQCAtMTg1LDYgKzE4NSw5IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibGVfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKICAgICAgICAgPCEtLSBNU0QgQXVkaW8gSEFMIChvcHRpb25hbCkgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9Im1zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCBjZTc4ZWIwLi45ODQxNWI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMTAsNiArMTAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgogICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIExlIEF1ZGlvIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJsZSBhdWRpbyBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8zMl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CiAgICAgPC9taXhQb3J0cz4KICAgICA8ZGV2aWNlUG9ydHM+CiAgICAgICAgIDwhLS0gQTJEUCBBdWRpbyBQb3J0cyAtLT4KQEAgLTMwLDYgKzQyLDEzIEBACiAgICAgICAgIDwvZGV2aWNlUG9ydD4KICAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CiAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgICAgICA8IS0tIEJMRSBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPCEtLSBOb3RlIHRoYXQgdGhlc2UgZGV2aWNlIHR5cGVzIGFyZSBub3QgdmFsaWQgaW4gSEFMIHZlcnNpb25zIDwgNy4gQW55IGRldmljZQorICAgICAgICAgICAgIHJ1bm5pbmcgcHJlLVY3IEhBTCBhbmQgdXNpbmcgdGhpcyBmaWxlIHdpbGwgbm90IHBhc3MgVlRTLiBOZWVkIHRvIHVzZQorICAgICAgICAgICAgIGJsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGluc3RlYWQuCisgICAgICAgIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgSGVhZHNldCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX0hFQURTRVQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIFNwZWFrZXIgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9TUEVBS0VSIiByb2xlPSJzaW5rIi8+CiAgICAgPC9kZXZpY2VQb3J0cz4KICAgICA8cm91dGVzPgogICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBBMkRQIE91dCIKQEAgLTQwLDUgKzU5LDkgQEAKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImEyZHAgb3V0cHV0Ii8+CiAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEhlYXJpbmcgQWlkIE91dCIKICAgICAgICAgICAgICAgIHNvdXJjZXM9ImhlYXJpbmcgYWlkIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgSGVhZHNldCBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0ibGUgYXVkaW8gb3V0cHV0Ii8+CiAgICAgPC9yb3V0ZXM+CiA8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9ibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU3NTcxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIEJsdWV0b290aCBBdWRpbyBIQUwgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSAtLT4KKzxtb2R1bGUgbmFtZT0iYmx1ZXRvb3RoIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPCEtLSBBMkRQIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIG91dHB1dCIgcm9sZT0ic291cmNlIi8+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJoZWFyaW5nIGFpZCBvdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIyNDAwMCAxNjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPCEtLSBMZSBBdWRpbyBBdWRpbyBQb3J0cyAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibGUgYXVkaW8gb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwIDE2MDAwIDI0MDAwIDMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMzJfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCAxNjAwMCAyNDAwMCAzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwIDQ4MDAwIDg4MjAwIDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCA0ODAwMCA4ODIwMCA5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAgNDgwMDAgODgyMDAgOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICAgICAgPCEtLSBCTEUgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBIZWFkc2V0IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVCIgcm9sZT0ic2luayIvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCTEUgU3BlYWtlciBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiIHJvbGU9InNpbmsiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJMRSBIZWFkc2V0IE91dCIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9ImxlIGF1ZGlvIG91dHB1dCIvPgorICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCTEUgU3BlYWtlciBPdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzM2NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImhlYXJpbmdfYWlkIiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAgMTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgPC9taXhQb3J0cz4KKyAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEhlYXJpbmcgQWlkIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCIgcm9sZT0ic2luayIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IiBzb3VyY2VzPSJoZWFyaW5nIGFpZCBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2xlX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkYzcyYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9sZV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gTGUgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImJsdWV0b290aCIgaGFsVmVyc2lvbj0iMi4xIj4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxlIGF1ZGlvIG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCxBVURJT19GT1JNQVRfUENNXzI0X0JJVCxBVURJT19GT1JNQVRfUENNXzMyX0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICA8L21peFBvcnRzPgorICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQkxFIEhlYWRzZXQgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiByb2xlPSJzaW5rIi8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJMRSBTcGVha2VyIE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiIgcm9sZT0ic2luayIvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIEhlYWRzZXQgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQkxFIFNwZWFrZXIgT3V0IiBzb3VyY2VzPSJsZSBhdWRpbyBvdXRwdXQiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjdmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uXzdfMC54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAgNDQxMDAgNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwIDQ0MTAwIDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCA0NDEwMCA0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl83XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGE1NmIyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fN18wLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICAgICAgPGl0ZW0+QnVpbHQtSW4gTWljPC9pdGVtPgorICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlNwZWFrZXI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAgMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKworICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIKKyAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCdWlsdC1JbiBNaWMiLz4KKyAgICA8L3JvdXRlcz4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTFjNjlmMi4uNTBjNWVhYgotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xMiw2ICsxMiwxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9oZWFkZXJzIHsKICAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA3ZjMzOWRjLi4wZjhiMGE1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKSBvdmVycmlkZTsKIAogICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAotICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC03OSw5ICs3OSwxMSBAQAogCiAgICAgVm9sdW1lR3JvdXBWZWN0b3IgZ2V0Vm9sdW1lR3JvdXBzKCkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQgPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKAorICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQgPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0IG92ZXJyaWRlOwogCkBAIC05MywxMyArOTUsMTMgQEAKIAogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgb3ZlcnJpZGU7CiAKLSAgICBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpIG92ZXJyaWRlOwogCi0gICAgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CiAKQEAgLTEyNywxMSArMTI5LDU0IEBACiAKICAgICBzdGF0dXNfdCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCisgICAgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZGV2aWNlcyByb2xlIGZvciBjYXB0dXJlIHByZXNldC4gV2hlbiBgZm9yY2VNYXRjaGVkYCBpcyB0cnVlLCB0aGUgZGV2aWNlcyB0byBiZQorICAgICAqIHJlbW92ZWQgbXVzdCBhbGwgc2hvdyBhcyByb2xlIGZvciB0aGUgY2FwdHVyZSBwcmVzZXQuIE90aGVyd2lzZSwgb25seSBkZXZpY2VzIHRoYXQgaGFzIHNob3duCisgICAgICogYXMgcm9sZSBmb3IgdGhlIGNhcHR1cmUgcHJlc2V0IHdpbGwgYmUgcmVtb3ZlLgorICAgICAqLworICAgIHN0YXR1c190IGRvUmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAorICAgICAgICAgICAgYm9vbCBmb3JjZU1hdGNoZWQ9dHJ1ZSk7CisKKyAgICBzdGF0dXNfdCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdCBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRBY3RpdmVNZWRpYURldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKSBjb25zdCBvdmVycmlkZTsKKwogcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBHZXQgbWVkaWEgZGV2aWNlcyBhcyB0aGUgZ2l2ZW4gcm9sZQorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgdGhlIGF1ZGlvIGRldmljZXMgcm9sZQorICAgICAqIEBwYXJhbSBhdmFpbGFibGVEZXZpY2VzIGFsbCBhdmFpbGFibGUgZGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBEZXZpY2VWZWN0b3IgdG8gc3RvcmUgZGV2aWNlcyBhcyB0aGUgZ2l2ZW4gcm9sZQorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYWxsIGRldmljZXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gcm9sZSBhcmUgcHJlc2VudCBpbiBhdmFpbGFibGUgZGV2aWNlcworICAgICAqICAgICAgICAgTkFNRV9OT19GT1VORCBpZiB0aGVyZSBpcyBubyBzdHJhdGVneSBmb3IgbWVkaWEgb3IgdGhlcmUgYXJlIG5vIGRldmljZXMgYXNzb2NpYXRlIHRvCisgICAgICogICAgICAgICB0aGUgZ2l2ZW4gcm9sZQorICAgICAqICAgICAgICAgTk9UX0VOT1VHSF9EQVRBIGlmIG5vdCBhbGwgZGV2aWNlcyBhcyBnaXZlbiByb2xlIGFyZSBwcmVzZW50IGluIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0TWVkaWFEZXZpY2VzRm9yUm9sZShkZXZpY2Vfcm9sZV90IHJvbGUsIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcywKKyAgICAgICAgICAgIERldmljZVZlY3RvciYgZGV2aWNlcykgY29uc3Q7CisKKyAgICB2b2lkIGR1bXBDYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKKwogICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXIgPSBudWxscHRyOwogCiAgICAgUHJvZHVjdFN0cmF0ZWd5TWFwIG1Qcm9kdWN0U3RyYXRlZ2llczsKLSAgICBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwIG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzOworICAgIFByb2R1Y3RTdHJhdGVneURldmljZXNSb2xlTWFwIG1Qcm9kdWN0U3RyYXRlZ3lEZXZpY2VSb2xlTWFwOworICAgIENhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcCBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwOwogICAgIFZvbHVtZUdyb3VwTWFwIG1Wb2x1bWVHcm91cHM7CiAgICAgTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcyBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlczsKICAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGUgPSBBVURJT19NT0RFX05PUk1BTDsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTMwNTNhNC4uZDdmOGIxZQotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKQEAgLTM2LDYgKzM2LDggQEAKICAgICB2b2lkIHNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOwogICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygKICAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZSgKKyAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZXhjbHVkZWREZXZpY2VzLCBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXAgPSBHUk9VUF9OT05FKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICBzdHJ1Y3QgRGV2aWNlR3JvdXBEZXNjcmlwdG9yIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaAppbmRleCAzZWJlN2QxLi4yYWEyZjlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0xOCwxNyArMTgsMjAgQEAKIAogI2luY2x1ZGUgIlZvbHVtZUdyb3VwLmgiCiAKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEhhbmRsZUdlbmVyYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTI2LDcgKzEyOSw4IEBACiAgICAgICogQHBhcmFtIGF0dHIKICAgICAgKiBAcmV0dXJuIGFwcGxpY2FibGUgcHJvZHVjdCBzdHJhdGVneSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSwgZGVmYXVsdCBpZiBub25lIGFwcGxpY2FibGUuCiAgICAgICovCi0gICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0OwogCiAgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKQEAgLTE1MCw5ICsxNTQsMTEgQEAKIAogICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKIAotICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0OwogCi0gICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0OwogCiAgICAgdm9sdW1lX2dyb3VwX3QgZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3Q7CiAKQEAgLTE2NCwxMCArMTcwLDEyIEBACiAgICAgcHJvZHVjdF9zdHJhdGVneV90IG1EZWZhdWx0U3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiB9OwogCi1jbGFzcyBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwIDogcHVibGljIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgQXVkaW9EZXZpY2VUeXBlQWRkcj4KLXsKLXB1YmxpYzoKLSAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7Ci19OwordXNpbmcgUHJvZHVjdFN0cmF0ZWd5RGV2aWNlc1JvbGVNYXAgPQorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8cHJvZHVjdF9zdHJhdGVneV90LCBkZXZpY2Vfcm9sZV90PiwgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj47CisKK3ZvaWQgZHVtcFByb2R1Y3RTdHJhdGVneURldmljZXNSb2xlTWFwKAorICAgICAgICBjb25zdCBQcm9kdWN0U3RyYXRlZ3lEZXZpY2VzUm9sZU1hcCYgcHJvZHVjdFN0cmF0ZWd5RGV2aWNlUm9sZU1hcCwKKyAgICAgICAgU3RyaW5nOCAqZHN0LAorICAgICAgICBpbnQgc3BhY2VzKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcAppbmRleCAxYmM3ZmUzLi4xNTBhOWE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApAQCAtMTcsNiArMTcsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9CYXNlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKwogI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKICNpbmNsdWRlICJFbmdpbmVEZWZhdWx0Q29uZmlnLmgiCiAjaW5jbHVkZSA8VHlwZUNvbnZlcnRlci5oPgpAQCAtNzQsOSArNzgsMTAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXByb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyLCBmYWxsYmFja09uRGVmYXVsdCk7CiB9CiAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgRW5naW5lQmFzZTo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdApAQCAtMTQ3LDEwICsxNTIsMTUgQEAKICAgICAgICAgfSk7CiAgICAgICAgIHJldHVybiBpdGVyICE9IGVuZCh2b2x1bWVHcm91cHMpOwogICAgIH07CisgICAgYXV0byBmaWxlRXhpc3RzID0gW10oY29uc3QgY2hhciogcGF0aCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKKyAgICAgICAgcmV0dXJuIHN0YXQocGF0aCwgJmZpbGVTdGF0KSA9PSAwICYmIFNfSVNSRUcoZmlsZVN0YXQuc3RfbW9kZSk7CisgICAgfTsKIAotICAgIGF1dG8gcmVzdWx0ID0gZW5naW5lQ29uZmlnOjpwYXJzZSgpOworICAgIGF1dG8gcmVzdWx0ID0gZmlsZUV4aXN0cyhlbmdpbmVDb25maWc6OkRFRkFVTFRfUEFUSCkgPworICAgICAgICAgICAgZW5naW5lQ29uZmlnOjpwYXJzZShlbmdpbmVDb25maWc6OkRFRkFVTFRfUEFUSCkgOiBlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHR7fTsKICAgICBpZiAocmVzdWx0LnBhcnNlZENvbmZpZyA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dXKCIlczogTm8gY29uZmlndXJhdGlvbiBmb3VuZCwgdXNpbmcgZGVmYXVsdCBtYXRjaGluZyBwaG9uZSBleHBlcmllbmNlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dEKCIlczogTm8gY29uZmlndXJhdGlvbiBmb3VuZCwgdXNpbmcgZGVmYXVsdCBtYXRjaGluZyBwaG9uZSBleHBlcmllbmNlLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIGVuZ2luZUNvbmZpZzo6Q29uZmlnIGNvbmZpZyA9IGdEZWZhdWx0RW5naW5lQ29uZmlnOwogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCByZXQgPSBlbmdpbmVDb25maWc6OnBhcnNlTGVnYWN5Vm9sdW1lcyhjb25maWcudm9sdW1lR3JvdXBzKTsKICAgICAgICAgcmVzdWx0ID0ge3N0ZDo6bWFrZV91bmlxdWU8ZW5naW5lQ29uZmlnOjpDb25maWc+KGNvbmZpZyksCkBAIC0zMjAsMTQgKzMzMCwxNiBAQAogICAgIHJldHVybiBncm91cDsKIH0KIAotdm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3ZvbHVtZV9ncm91cF90IEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBib29sIGZhbGxiYWNrT25EZWZhdWx0KSBjb25zdAogewotICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIsIGZhbGxiYWNrT25EZWZhdWx0KTsKIH0KIAotdm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAordm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCkgY29uc3QKIHsKLSAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSwgZmFsbGJhY2tPbkRlZmF1bHQpOwogfQogCiBzdGF0dXNfdCBFbmdpbmVCYXNlOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdApAQCAtMzM5LDU3ICszNTEsMjkyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCi17Ci0gICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cwotICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKK25hbWVzcGFjZSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHNldERldmljZXNSb2xlRm9yVCgKKyAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPFQsIGRldmljZV9yb2xlX3Q+LCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPiYgdERldmljZXNSb2xlTWFwLAorICAgICAgICBUIHQsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvZ1N0ciwgc3RkOjpmdW5jdGlvbjxib29sKFQpPiBwKSB7CisgICAgaWYgKCFwKHQpKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkICVzICV1IiwgX19mdW5jX18sIGxvZ1N0ci5jX3N0cigpLCB0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlc1tzdHJhdGVneV0gPSBkZXZpY2U7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBFbmdpbmVCYXNlOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCi17Ci0gICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cwotICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOiB7CisgICAgICAgIHREZXZpY2VzUm9sZU1hcFtzdGQ6Om1ha2VfcGFpcih0LCByb2xlKV0gPSBkZXZpY2VzOworICAgICAgICAvLyBUaGUgcHJlZmVycmVkIGRldmljZXMgYW5kIGRpc2FibGVkIGRldmljZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gT25jZSBhIGRldmljZSBpcyBhZGRlZAorICAgICAgICAvLyB0aGUgYSBsaXN0LCBpdCBtdXN0IGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgb25lLgorICAgICAgICBjb25zdCBkZXZpY2Vfcm9sZV90IHJvbGVUb1JlbW92ZSA9IHJvbGUgPT0gREVWSUNFX1JPTEVfUFJFRkVSUkVEID8gREVWSUNFX1JPTEVfRElTQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IERFVklDRV9ST0xFX1BSRUZFUlJFRDsKKyAgICAgICAgYXV0byBpdCA9IHREZXZpY2VzUm9sZU1hcC5maW5kKHN0ZDo6bWFrZV9wYWlyKHQsIHJvbGVUb1JlbW92ZSkpOworICAgICAgICBpZiAoaXQgIT0gdERldmljZXNSb2xlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kID0gZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oaXQtPnNlY29uZCwgZGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdERldmljZXNSb2xlTWFwLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyBpdCBpcyBubyBuZWVkIHRvIHNldCBkZXZpY2Ugcm9sZSBhcyBub25lIGZvciBhIHN0cmF0ZWd5LgorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgaWYgKG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVyYXNlKHN0cmF0ZWd5KSA9PSAwKSB7Ci0gICAgICAgIC8vIG5vIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRW5naW5lQmFzZTo6Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBjb25zdAotewotICAgIC8vIHZlcmlmeSBzdHJhdGVneSBleGlzdHMKLSAgICBpZiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQoc3RyYXRlZ3kpID09IG1Qcm9kdWN0U3RyYXRlZ2llcy5lbmQoKSkgewotICAgICAgICBBTE9HRSgiJXMgdW5rbm93biBzdHJhdGVneSAldSIsIF9fZnVuY19fLCBzdHJhdGVneSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXR1c190IHJlbW92ZUFsbERldmljZXNSb2xlRm9yVCgKKyAgICAgICAgc3RkOjptYXA8c3RkOjpwYWlyPFQsIGRldmljZV9yb2xlX3Q+LCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPiYgdERldmljZXNSb2xlTWFwLAorICAgICAgICBUIHQsIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGxvZ1N0ciwgc3RkOjpmdW5jdGlvbjxib29sKFQpPiBwKSB7CisgICAgaWYgKCFwKHQpKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkICVzICV1IiwgX19mdW5jX18sIGxvZ1N0ci5jX3N0cigpLCB0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgLy8gcHJlZmVycmVkIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneT8KLSAgICBhdXRvIGRldkl0ID0gbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZmluZChzdHJhdGVneSk7Ci0gICAgaWYgKGRldkl0ID09IG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBubyBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAldSIsIF9fZnVuY19fLCBzdHJhdGVneSk7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIHN3aXRjaCAocm9sZSkgeworICAgIGNhc2UgREVWSUNFX1JPTEVfUFJFRkVSUkVEOgorICAgIGNhc2UgREVWSUNFX1JPTEVfRElTQUJMRUQ6CisgICAgICAgIGlmICh0RGV2aWNlc1JvbGVNYXAuZXJhc2Uoc3RkOjptYWtlX3BhaXIodCwgcm9sZSkpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIHByZWZlcnJlZC9kaXNhYmxlZCBkZXZpY2Ugd2FzIHNldAorICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVtb3ZlIGRldmljZXMgd2l0aAorICAgICAgICAvLyByb2xlIGFzIERFVklDRV9ST0xFX05PTkUKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdHVzX3QgZ2V0RGV2aWNlc1JvbGVGb3JUKAorICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnBhaXI8VCwgZGV2aWNlX3JvbGVfdD4sIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+JiB0RGV2aWNlc1JvbGVNYXAsCisgICAgICAgIFQgdCwgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzLCBjb25zdCBzdGQ6OnN0cmluZyYgbG9nU3RyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woVCk+IHApIHsKKyAgICBpZiAoIXAodCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgJXMgJXUiLCBfX2Z1bmNfXywgbG9nU3RyLmNfc3RyKCksIHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGRldmljZSA9IGRldkl0LT5zZWNvbmQ7CisgICAgc3dpdGNoIChyb2xlKSB7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9QUkVGRVJSRUQ6CisgICAgY2FzZSBERVZJQ0VfUk9MRV9ESVNBQkxFRDogeworICAgICAgICBhdXRvIGl0ID0gdERldmljZXNSb2xlTWFwLmZpbmQoc3RkOjptYWtlX3BhaXIodCwgcm9sZSkpOworICAgICAgICBpZiAoaXQgPT0gdERldmljZXNSb2xlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gZGV2aWNlIGFzIHJvbGUgJXUgZm9yICVzICV1IiwgX19mdW5jX18sIHJvbGUsIGxvZ1N0ci5jX3N0cigpLCB0KTsKKyAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfQorCisgICAgICAgIGRldmljZXMgPSBpdC0+c2Vjb25kOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBERVZJQ0VfUk9MRV9OT05FOgorICAgICAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwtdGhyb3VnaCBhcyB0aGUgREVWSUNFX1JPTEVfTk9ORSBpcyBuZXZlciBzZXQKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK30gLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChwcm9kdWN0X3N0cmF0ZWd5X3QpPiBwID0gW3RoaXNdKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgeworICAgICAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQoc3RyYXRlZ3kpICE9IG1Qcm9kdWN0U3RyYXRlZ2llcy5lbmQoKTsKKyAgICB9OworICAgIHJldHVybiBzZXREZXZpY2VzUm9sZUZvclQoCisgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWd5RGV2aWNlUm9sZU1hcCwgc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMsICJzdHJhdGVneSIgLypsb2dTdHIqLywgcCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LCBkZXZpY2Vfcm9sZV90IHJvbGUpCit7CisgICAgc3RkOjpmdW5jdGlvbjxib29sKHByb2R1Y3Rfc3RyYXRlZ3lfdCk+IHAgPSBbdGhpc10ocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSB7CisgICAgICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgIT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpOworICAgIH07CisgICAgcmV0dXJuIHJlbW92ZUFsbERldmljZXNSb2xlRm9yVCgKKyAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ3lEZXZpY2VSb2xlTWFwLCBzdHJhdGVneSwgcm9sZSwgInN0cmF0ZWd5IiAvKmxvZ1N0ciovLCBwKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgc3RkOjpmdW5jdGlvbjxib29sKHByb2R1Y3Rfc3RyYXRlZ3lfdCk+IHAgPSBbdGhpc10ocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSB7CisgICAgICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgIT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpOworICAgIH07CisgICAgcmV0dXJuIGdldERldmljZXNSb2xlRm9yVCgKKyAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ3lEZXZpY2VSb2xlTWFwLCBzdHJhdGVneSwgcm9sZSwgZGV2aWNlcywgInN0cmF0ZWd5IiAvKmxvZ1N0ciovLCBwKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgc3RkOjpmdW5jdGlvbjxib29sKGF1ZGlvX3NvdXJjZV90KT4gcCA9IFtdKGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlKSB7CisgICAgICAgIHJldHVybiBhdWRpb19pc192YWxpZF9hdWRpb19zb3VyY2UoYXVkaW9Tb3VyY2UpOworICAgIH07CisgICAgcmV0dXJuIHNldERldmljZXNSb2xlRm9yVCgKKyAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXAsIGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzLCAiYXVkaW8gc291cmNlIiAvKmxvZ1N0ciovLCBwKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCit7CisgICAgLy8gdmVyaWZ5IGlmIHRoZSBhdWRpbyBzb3VyY2UgaXMgdmFsaWQKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShhdWRpb1NvdXJjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYXVkaW8gc291cmNlICV1IiwgX19mdW5jX18sIGF1ZGlvU291cmNlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOiB7CisgICAgICAgIGNvbnN0IGF1dG8gYXVkaW9Tb3VyY2VSb2xlID0gc3RkOjptYWtlX3BhaXIoYXVkaW9Tb3VyY2UsIHJvbGUpOworICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwW2F1ZGlvU291cmNlUm9sZV0gPSBleGNsdWRlRGV2aWNlVHlwZUFkZHJzRnJvbSgKKyAgICAgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwW2F1ZGlvU291cmNlUm9sZV0sIGRldmljZXMpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXBbYXVkaW9Tb3VyY2VSb2xlXS5wdXNoX2JhY2soZGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBXaGVuIHRoZSBkZXZpY2VzIGFyZSBzZXQgYXMgcHJlZmVycmVkIGRldmljZXMsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGRpc2FibGVkIGRldmljZXMuCisgICAgICAgIGRvUmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgIHJvbGUgPT0gREVWSUNFX1JPTEVfUFJFRkVSUkVEID8gREVWSUNFX1JPTEVfRElTQUJMRUQgOiBERVZJQ0VfUk9MRV9QUkVGRVJSRUQsCisgICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBmYWxzZSAvKmZvcmNlTWF0Y2hlZCovKTsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgaXQgaXMgbm8gbmVlZCB0byBzZXQgZGV2aWNlIHJvbGUgYXMgbm9uZQorICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHJvbGUgJWQiLCBfX2Z1bmNfXywgcm9sZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgcmV0dXJuIGRvUmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6ZG9SZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcywgYm9vbCBmb3JjZU1hdGNoZWQpCit7CisgICAgLy8gdmVyaWZ5IGlmIHRoZSBhdWRpbyBzb3VyY2UgaXMgdmFsaWQKKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2F1ZGlvX3NvdXJjZShhdWRpb1NvdXJjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzIHVua25vd24gYXVkaW8gc291cmNlICV1IiwgX19mdW5jX18sIGF1ZGlvU291cmNlKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJvbGUpIHsKKyAgICBjYXNlIERFVklDRV9ST0xFX1BSRUZFUlJFRDoKKyAgICBjYXNlIERFVklDRV9ST0xFX0RJU0FCTEVEOiB7CisgICAgICAgIGNvbnN0IGF1dG8gYXVkaW9Tb3VyY2VSb2xlID0gc3RkOjptYWtlX3BhaXIoYXVkaW9Tb3VyY2UsIHJvbGUpOworICAgICAgICBpZiAobUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcC5maW5kKGF1ZGlvU291cmNlUm9sZSkgPT0KKyAgICAgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciByZW1haW5pbmdEZXZpY2VzID0gZXhjbHVkZURldmljZVR5cGVBZGRyc0Zyb20oCisgICAgICAgICAgICAgICAgbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcFthdWRpb1NvdXJjZVJvbGVdLCBkZXZpY2VzKTsKKyAgICAgICAgaWYgKGZvcmNlTWF0Y2hlZCAmJiByZW1haW5pbmdEZXZpY2VzLnNpemUoKSAhPQorICAgICAgICAgICAgICAgIG1DYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXBbYXVkaW9Tb3VyY2VSb2xlXS5zaXplKCkgLSBkZXZpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgZGV2aWNlcyBmcm9tIGBkZXZpY2VzVG9SZW1vdmVgIHRoYXQgYXJlIG5vdCBzaG93biBpbiB0aGUgY2FjaGVkIHJlY29yZAorICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwW2F1ZGlvU291cmNlUm9sZV0gPSByZW1haW5pbmdEZXZpY2VzOworICAgICAgICBpZiAobUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcFthdWRpb1NvdXJjZVJvbGVdLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcm9sZSB3aGVuIGRldmljZSBsaXN0IGlzIGVtcHR5CisgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwLmVyYXNlKGF1ZGlvU291cmNlUm9sZSk7CisgICAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgREVWSUNFX1JPTEVfTk9ORToKKyAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsLXRocm91Z2ggYXMgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVtb3ZlIGRldmljZXMgd2l0aAorICAgICAgICAvLyByb2xlIGFzIERFVklDRV9ST0xFX05PTkUKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCByb2xlICVkIiwgX19mdW5jX18sIHJvbGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKQoreworICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChhdWRpb19zb3VyY2VfdCk+IHAgPSBbXShhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSkgeworICAgICAgICByZXR1cm4gYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKTsKKyAgICB9OworICAgIHJldHVybiByZW1vdmVBbGxEZXZpY2VzUm9sZUZvclQoCisgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwLCBhdWRpb1NvdXJjZSwgcm9sZSwgImF1ZGlvIHNvdXJjZSIgLypsb2dTdHIqLywgcCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChhdWRpb19zb3VyY2VfdCk+IHAgPSBbXShhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSkgeworICAgICAgICByZXR1cm4gYXVkaW9faXNfdmFsaWRfYXVkaW9fc291cmNlKGF1ZGlvU291cmNlKTsKKyAgICB9OworICAgIHJldHVybiBnZXREZXZpY2VzUm9sZUZvclQoCisgICAgICAgICAgICBtQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwLCBhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcywgImF1ZGlvIHNvdXJjZSIgLypsb2dTdHIqLywgcCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OmdldE1lZGlhRGV2aWNlc0ZvclJvbGUoZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMsIERldmljZVZlY3RvciYgZGV2aWNlcykgY29uc3QKK3sKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoIlNUUkFURUdZX01FRElBIiAvKm5hbWUqLyk7CisgICAgaWYgKHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICBzdHJhdGVneSA9IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIH0KKyAgICBpZiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VBZGRyVmVjOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZUFkZHJWZWMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgZGV2aWNlcyA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYyhkZXZpY2VBZGRyVmVjKTsKKyAgICByZXR1cm4gZGV2aWNlQWRkclZlYy5zaXplKCkgPT0gZGV2aWNlcy5zaXplKCkgPyBOT19FUlJPUiA6IE5PVF9FTk9VR0hfREFUQTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZUJhc2U6OmdldEFjdGl2ZU1lZGlhRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpIGNvbnN0Cit7CisgICAgLy8gVGhlIHByaW9yaXR5IG9mIGFjdGl2ZSBkZXZpY2VzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogdGhlIGF2YWlsYWJsZSBwcmVmZXJyZWQgZGV2aWNlcyBmb3IgbWVkaWEKKyAgICAvLyAyOiB0aGUgbGF0ZXN0IGNvbm5lY3RlZCByZW1vdmFibGUgbWVkaWEgZGV2aWNlIHRoYXQgaXMgZW5hYmxlZAorICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOworICAgIGlmIChnZXRNZWRpYURldmljZXNGb3JSb2xlKAorICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVELCBhdmFpbGFibGVEZXZpY2VzLCBhY3RpdmVEZXZpY2VzKSAhPSBOT19FUlJPUikgeworICAgICAgICBhY3RpdmVEZXZpY2VzLmNsZWFyKCk7CisgICAgICAgIERldmljZVZlY3RvciBkaXNhYmxlZERldmljZXM7CisgICAgICAgIGdldE1lZGlhRGV2aWNlc0ZvclJvbGUoREVWSUNFX1JPTEVfRElTQUJMRUQsIGF2YWlsYWJsZURldmljZXMsIGRpc2FibGVkRGV2aWNlcyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICAgICAgbUxhc3RSZW1vdmFibGVNZWRpYURldmljZXMuZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlKGRpc2FibGVkRGV2aWNlcyk7CisgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYWN0aXZlRGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWN0aXZlRGV2aWNlczsKK30KKwordm9pZCBFbmdpbmVCYXNlOjpkdW1wQ2FwdHVyZVByZXNldERldmljZXNSb2xlTWFwKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNEZXZpY2Ugcm9sZSBwZXIgY2FwdHVyZSBwcmVzZXQgZHVtcDoiLCBzcGFjZXMsICIiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIFtjYXB0dXJlUHJlc2V0Um9sZVBhaXIsIGRldmljZXNdIDogbUNhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNDYXB0dXJlIHByZXNldCgldSkgRGV2aWNlIFJvbGUoJXUpIERldmljZXMoJXMpIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgY2FwdHVyZVByZXNldFJvbGVQYWlyLmZpcnN0LCBjYXB0dXJlUHJlc2V0Um9sZVBhaXIuc2Vjb25kLAorICAgICAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMsIHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKKyAgICB9CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuIik7Cit9CisKIHZvaWQgRW5naW5lQmFzZTo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7CiAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmR1bXAoZHN0LCAyKTsKLSAgICBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlcy5kdW1wKGRzdCwgMik7CisgICAgZHVtcFByb2R1Y3RTdHJhdGVneURldmljZXNSb2xlTWFwKG1Qcm9kdWN0U3RyYXRlZ3lEZXZpY2VSb2xlTWFwLCBkc3QsIDIpOworICAgIGR1bXBDYXB0dXJlUHJlc2V0RGV2aWNlc1JvbGVNYXAoZHN0LCAyKTsKICAgICBtVm9sdW1lR3JvdXBzLmR1bXAoZHN0LCAyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCmluZGV4IDk4MTU4MmUuLmQzOWVmZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKQEAgLTI2LDggKzI2LDggQEAKICAgICB7IlNUUkFURUdZX1BIT05FIiwKICAgICAgewogICAgICAgICAgeyJwaG9uZSIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCAiQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLAotICAgICAgICAgICAgIiJ9fSwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fSwKICAgICAgICAgIH0sCiAgICAgICAgICB7InNjbyIsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPLCAiQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLAogICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX1NDTywKQEAgLTM5LDEwICszOSwxMSBAQAogICAgICB7CiAgICAgICAgICB7InJpbmciLCBBVURJT19TVFJFQU1fUklORywgIkFVRElPX1NUUkVBTV9SSU5HIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0sCiAgICAgICAgICB7ImFsYXJtIiwgQVVESU9fU1RSRUFNX0FMQVJNLCAiQVVESU9fU1RSRUFNX0FMQVJNIiwKLSAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0sCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn19LAogICAgICAgICAgfQogICAgICB9LAogICAgIH0sCkBAIC01OCw3ICs1OSw3IEBACiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksICJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIsCiAgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtNjYsMTUgKzY3LDE2IEBACiAgICAgIHsKICAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLAogICAgICAgICAgIHsKLSAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfSwKQEAgLTgzLDIxICs4NSwyNSBAQAogICAgICB7CiAgICAgICAgICB7ImFzc2lzdGFudCIsIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQsICJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiwKICAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn19CiAgICAgICAgICB9LAogICAgICAgICAgeyJtdXNpYyIsIEFVRElPX1NUUkVBTV9NVVNJQywgIkFVRElPX1NUUkVBTV9NVVNJQyIsCiAgICAgICAgICAgewotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAotICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKLSAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCi0gICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9LAogICAgICAgICAgfSwKICAgICAgICAgIHsic3lzdGVtIiwgQVVESU9fU1RSRUFNX1NZU1RFTSwgIkFVRElPX1NUUkVBTV9TWVNURU0iLAogICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LApAQCAtMTA2LDcgKzExMiw3IEBACiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9EVE1GLCAiQVVESU9fU1RSRUFNX0RUTUYiLAogICAgICAgICAgIHsKICAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkcsCi0gICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0KICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0sCkBAIC0xMTQsNyArMTIwLDggQEAKICAgICB7IlNUUkFURUdZX0NBTExfQVNTSVNUQU5UIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQsICJBVURJT19TVFJFQU1fQ0FMTF9BU1NJU1RBTlQiLAotICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0NBTExfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fQogICAgICAgICAgfQogICAgICB9LAogICAgIH0sCkBAIC0xMzYsMTQgKzE0MywxNiBAQAogICAgIHsicmVyb3V0aW5nIiwKICAgICAgewogICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUkVST1VUSU5HLCAiQVVESU9fU1RSRUFNX1JFUk9VVElORyIsCi0gICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX05PTkUsICIifX0KICAgICAgICAgIH0KICAgICAgfSwKICAgICB9LAogICAgIHsicGF0Y2giLAogICAgICB7CiAgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9QQVRDSCwgIkFVRElPX1NUUkVBTV9QQVRDSCIsCi0gICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9fQogICAgICAgICAgfQogICAgICB9LAogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA4N2I2YWFmLi5iM2Y4OTQ3Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwCkBAIC01NSw2ICs1NSwxNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBleGNsdWRlZERldmljZXMsIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCkgY29uc3QgeworICAgIGZvciAoYXV0byBpdGVyID0gbU1lZGlhRGV2aWNlcy5iZWdpbigpOyBpdGVyICE9IG1NZWRpYURldmljZXMuZW5kKCk7ICsraXRlcikgeworICAgICAgICBpZiAoKGdyb3VwID09IEdST1VQX05PTkUgfHwgZ3JvdXAgPT0gZ2V0RGV2aWNlT3V0R3JvdXAoKGl0ZXItPmRlc2MpLT50eXBlKCkpKSAmJgorICAgICAgICAgICAgICAgICFleGNsdWRlZERldmljZXMuY29udGFpbnMoaXRlci0+ZGVzYykpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLT5kZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCiBkZXZpY2Vfb3V0X2dyb3VwX3QgTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlczo6Z2V0RGV2aWNlT3V0R3JvdXAoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKIHsKICAgICBzd2l0Y2ggKGRldmljZSkgewpAQCAtNjksNiArODAsMTEgQEAKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgLy8gVE9ETyAoYi8xMjI5MzEyNjEpOiByZW1vdmUgd2hlbiBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZgorICAgIC8vICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUC4KKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgcmV0dXJuIEdST1VQX0JUX0EyRFA7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEdST1VQX05PTkU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcAppbmRleCAxNTFjN2JiLi5iM2QxNDRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Qcm9kdWN0U3RyYXRlZ3kuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTE2OSw3ICsxNjksNyBAQAogfQogCiBwcm9kdWN0X3N0cmF0ZWd5X3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0CisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCkgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgewogICAgICAgICBpZiAoaXRlci5zZWNvbmQtPm1hdGNoZXMoYXR0cikpIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIH0KICAgICBBTE9HVigiJXM6IE5vIG1hdGNoaW5nIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIGF0dHJpYnV0ZXMgJXMsIHJldHVybiBkZWZhdWx0IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOwotICAgIHJldHVybiBnZXREZWZhdWx0KCk7CisgICAgcmV0dXJuIGZhbGxiYWNrT25EZWZhdWx0PyBnZXREZWZhdWx0KCkgOiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CiB9CiAKIGF1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdApAQCAtMjcyLDcgKzI3Miw4IEBACiAgICAgcmV0dXJuIGF0KHBzSWQpLT5nZXREZXZpY2VBZGRyZXNzKCk7CiB9CiAKLXZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQpIGNvbnN0CiB7CiAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBpdGVyLnNlY29uZC0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOwpAQCAtMjgwLDEwICsyODEsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBncm91cDsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7CisgICAgcmV0dXJuIGZhbGxiYWNrT25EZWZhdWx0ID8gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgOiBWT0xVTUVfR1JPVVBfTk9ORTsKIH0KIAotdm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZSgKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQpIGNvbnN0CiB7CiAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKICAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBpdGVyLnNlY29uZC0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CkBAIC0yOTIsNyArMjk0LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBBTE9HVygiJXM6IG5vIHZvbHVtZSBncm91cCBmb3IgJXMsIHVzaW5nIGRlZmF1bHQiLCBfX2Z1bmNfXywgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7CisgICAgcmV0dXJuIGZhbGxiYWNrT25EZWZhdWx0ID8gZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgOiBWT0xVTUVfR1JPVVBfTk9ORTsKIH0KIAogdm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdApAQCAtMzE4LDEzICszMjAsMTUgQEAKICAgICB9CiB9CiAKLXZvaWQgUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkUm91dGluZ01hcDo6ZHVtcChhbmRyb2lkOjpTdHJpbmc4KiBkc3QsIGludCBzcGFjZXMpIGNvbnN0IHsKLSAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNQcmVmZXJyZWQgZGV2aWNlcyBwZXIgcHJvZHVjdCBzdHJhdGVneSBkdW1wOiIsIHNwYWNlcywgIiIpOwotICAgIGZvciAoY29uc3QgYXV0byYgaXRlciA6ICp0aGlzKSB7Ci0gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1N0cmF0ZWd5ICV1IGRldjolMDh4IGFkZHI6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBpdGVyLmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnNlY29uZC5tVHlwZSwgaXRlci5zZWNvbmQubUFkZHJlc3MuY19zdHIoKSk7Cit2b2lkIGR1bXBQcm9kdWN0U3RyYXRlZ3lEZXZpY2VzUm9sZU1hcCgKKyAgICAgICAgY29uc3QgUHJvZHVjdFN0cmF0ZWd5RGV2aWNlc1JvbGVNYXAmIHByb2R1Y3RTdHJhdGVneURldmljZVJvbGVNYXAsCisgICAgICAgIFN0cmluZzggKmRzdCwKKyAgICAgICAgaW50IHNwYWNlcykgeworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc0RldmljZSByb2xlIHBlciBwcm9kdWN0IHN0cmF0ZWd5IGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvJiBbc3RyYXRlZ3lSb2xlUGFpciwgZGV2aWNlc10gOiBwcm9kdWN0U3RyYXRlZ3lEZXZpY2VSb2xlTWFwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1N0cmF0ZWd5KCV1KSBEZXZpY2UgUm9sZSgldSkgRGV2aWNlcyglcykiLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICBzdHJhdGVneVJvbGVQYWlyLmZpcnN0LCBzdHJhdGVneVJvbGVQYWlyLnNlY29uZCwKKyAgICAgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzLCB0cnVlIC8qaW5jbHVkZVNlbnNpdGl2ZUluZm8qLykuY19zdHIoKSk7CiAgICAgfQogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwCmluZGV4IGMzNTI1NzguLjhhYTRiMDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKQEAgLTQzLDEwICs0MywyNCBAQAogICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1heDsKICAgICB9CiAKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG5ldyB2b2x1bWUgaW5kZXgKICAgICBzaXplX3QgbmJDdXJ2ZVBvaW50cyA9IG1DdXJ2ZVBvaW50cy5zaXplKCk7Ci0gICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbQotICAgIGludCBuYlN0ZXBzID0gMSArIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUluZGV4IC0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleDsKLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKKworICAgIGludCB2b2xJZHg7CisgICAgaWYgKHZvbEluZGV4TWluID09IHZvbEluZGV4TWF4KSB7CisgICAgICAgIGlmIChpbmRleEluVWkgPT0gdm9sSW5kZXhNaW4pIHsKKyAgICAgICAgICAgIHZvbElkeCA9IHZvbEluZGV4TWluOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhpcyB3b3VsZCByZXN1bHQgaW4gYSBkaXZpZGUtYnktemVybyBiZWxvdworICAgICAgICAgICAgQUxPR19BU1NFUlQodm9sSW5kZXhtaW4gIT0gdm9sSW5kZXhNYXgsICJJbnZhbGlkIHZvbHVtZSBpbmRleCByYW5nZSAmIHZhbHVlOiAwIik7CisgICAgICAgICAgICByZXR1cm4gTkFOOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaW50ZXJwb2xhYXRlCisgICAgICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KKyAgICAgICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OworICAgICAgICB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOworICAgIH0KIAogICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50CiAgICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icAppbmRleCBmZjg0MGY5Li40NTljYzc4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Y2UxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiYXVkaW9wb2xpY3lfZW5naW5lY29uZmlnX3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCmluZGV4IDVkMjJjMjQuLmM1NjU5MjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKQEAgLTExMSw2ICsxMTEsOCBAQAogICovCiBQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOwogYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKTsKKy8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuCithbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoY29uc3QgY2hhciogcGF0aCwgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpOwogCiB9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCmluZGV4IDQ4NDJjYjIuLjgxZTgwM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtMTM5LDExICsxMzksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7CiB9OwogCi11c2luZyB4bWxDaGFyVW5pcXVlID0gc3RkOjp1bmlxdWVfcHRyPHhtbENoYXIsIGRlY2x0eXBlKHhtbEZyZWUpPjsKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sQ2hhcj4gPSBbXSh4bWxDaGFyICpzKSB7IHhtbEZyZWUocyk7IH07CisKKy8qKiBAcmV0dXJuIGEgdW5pcXVlX3B0ciB3aXRoIHRoZSBjb3JyZWN0IGRlbGV0ZXIgZm9yIHRoZSBsaWJ4bWwyIG9iamVjdC4gKi8KK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGF1dG8gbWFrZV94bWxVbmlxdWUoVCAqdCkgeworICAgIC8vIFdyYXAgZGVsZXRlciBpbiBsYW1iZGEgdG8gZW5hYmxlIGVtcHR5IGJhc2Ugb3B0aW1pemF0aW9uCisgICAgYXV0byBkZWxldGVyID0gW10oVCAqdCkgeyB4bWxEZWxldGVyPFQ+KHQpOyB9OworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCwgZGVjbHR5cGUoZGVsZXRlcik+e3QsIGRlbGV0ZXJ9OworfQogCiBzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCiB7Ci0gICAgeG1sQ2hhclVuaXF1ZSBjaGFyUHRyKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4oYXR0cmlidXRlKSksIHhtbEZyZWUpOworICAgIGF1dG8gY2hhclB0ciA9IG1ha2VfeG1sVW5pcXVlKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4oYXR0cmlidXRlKSkpOwogICAgIGlmIChjaGFyUHRyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KQEAgLTIyOCw3ICsyNDEsOCBAQAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKIAogICAgICAgICAgICAgQUxPR1YoIiVzIGZsYWdzICVzIiwgIF9fRlVOQ1RJT05fXywgZmxhZ3MuY19zdHIoKSk7Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzLmZsYWdzID0gQXVkaW9GbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgIiAiKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzLCAiICIpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZUtleSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJrZXkiKTsKQEAgLTQ0MCw3ICs0NTQsNyBAQAogICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPwogICAgICAgICAgcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgYXV0byBwb2ludFhtbCA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOwogICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQpAQCAtNDcwLDE0ICs0ODQsMTQgQEAKIAogICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKICAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6bmFtZSkpIHsKLSAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgbmFtZVhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGF1dG8gbmFtZVhtbCA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOwogICAgICAgICAgICAgaWYgKG5hbWVYbWwgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZVhtbC5nZXQoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6aW5kZXhNaW4pKSB7Ci0gICAgICAgICAgICB4bWxDaGFyVW5pcXVlIGluZGV4TWluWG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgYXV0byBpbmRleE1pblhtbCA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOwogICAgICAgICAgICAgaWYgKGluZGV4TWluWG1sID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQpAQCAtNDg3LDcgKzUwMSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6aW5kZXhNYXgpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyVW5pcXVlIGluZGV4TWF4WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgYXV0byBpbmRleE1heFhtbCA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOwogICAgICAgICAgICAgaWYgKGluZGV4TWF4WG1sID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQpAQCAtNTQ3LDcgKzU2MSw3IEBACiAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/CiAgICAgICAgICBjdXItPnhtbENoaWxkcmVuTm9kZSA6IHJlZi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CiAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcpKSB7Ci0gICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgYXV0byBwb2ludFhtbCA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOwogICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQpAQCAtNTg4LDYgKzYwMiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisgICAgVm9sdW1lR3JvdXBzIHRlbXBWb2x1bWVHcm91cHMgPSB2b2x1bWVHcm91cHM7CiAgICAgZm9yIChjb25zdCBhdXRvICZ2b2x1bWVNYXBJdGVyIDogbGVnYWN5Vm9sdW1lTWFwKSB7CiAgICAgICAgIC8vIEluIG9yZGVyIHRvIGxldCBBdWRpb1NlcnZpY2Ugc2V0dGluZyB0aGUgbWluIGFuZCBtYXggKGNvbXBhdGliaWxpdHkpLCBzZXQgTWluIGFuZCBNYXgKICAgICAgICAgLy8gdG8gLTEgZXhjZXB0IGZvciBwcml2YXRlIHN0cmVhbXMKQEAgLTU5OCw4ICs2MTMsMTAgQEAKICAgICAgICAgfQogICAgICAgICBpbnQgaW5kZXhNaW4gPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMCA6IC0xOwogICAgICAgICBpbnQgaW5kZXhNYXggPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMTAwIDogLTE7Ci0gICAgICAgIHZvbHVtZUdyb3Vwcy5wdXNoX2JhY2soeyB2b2x1bWVNYXBJdGVyLmZpcnN0LCBpbmRleE1pbiwgaW5kZXhNYXgsIHZvbHVtZU1hcEl0ZXIuc2Vjb25kIH0pOworICAgICAgICB0ZW1wVm9sdW1lR3JvdXBzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CiAgICAgfQorICAgIHN0ZDo6c3dhcCh0ZW1wVm9sdW1lR3JvdXBzLCB2b2x1bWVHcm91cHMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNjM2LDE5ICs2NTMsMjEgQEAKIAogUGFyc2luZ1Jlc3VsdCBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgWG1sRXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlcjsKLSAgICB4bWxEb2NQdHIgZG9jOwotICAgIGRvYyA9IHhtbFBhcnNlRmlsZShwYXRoKTsKKyAgICBhdXRvIGRvYyA9IG1ha2VfeG1sVW5pcXVlKHhtbFBhcnNlRmlsZShwYXRoKSk7CiAgICAgaWYgKGRvYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgLy8gSXQgaXMgT0sgbm90IHRvIGZpbmQgYW4gZW5naW5lIGNvbmZpZyBmaWxlIGF0IHRoZSBkZWZhdWx0IGxvY2F0aW9uCisgICAgICAgIC8vIGFzIHRoZSBjYWxsZXIgd2lsbCBkZWZhdWx0IHRvIGhhcmRjb2RlZCBkZWZhdWx0IGNvbmZpZworICAgICAgICBpZiAoc3RybmNtcChwYXRoLCBERUZBVUxUX1BBVEgsIHN0cmxlbihERUZBVUxUX1BBVEgpKSkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgcGFyc2UgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CiAgICAgfQotICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYy5nZXQoKSk7CiAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlOiBlbXB0eSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7Ci0gICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKICAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKICAgICB9Ci0gICAgaWYgKHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MpIDwgMCkgeworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKICAgICAgICAgcmV0dXJuIHtudWxscHRyLCAwfTsKICAgICB9CkBAIC02NjEsNjggKzY4MCw0NSBAQAogICAgIGF1dG8gY29uZmlnID0gc3RkOjptYWtlX3VuaXF1ZTxDb25maWc+KCk7CiAgICAgY29uZmlnLT52ZXJzaW9uID0gc3RkOjpzdG9mKHZlcnNpb24pOwogICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxQcm9kdWN0U3RyYXRlZ3lUcmFpdHM+KAotICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPnByb2R1Y3RTdHJhdGVnaWVzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgZG9jLmdldCgpLCBjdXIsIGNvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKICAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Q3JpdGVyaW9uVHJhaXRzPigKLSAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpYSwgbmJTa2lwcGVkRWxlbWVudHMpOworICAgICAgICAgICAgICAgIGRvYy5nZXQoKSwgY3VyLCBjb25maWctPmNyaXRlcmlhLCBuYlNraXBwZWRFbGVtZW50cyk7CiAgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPENyaXRlcmlvblR5cGVUcmFpdHM+KAotICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPmNyaXRlcmlvblR5cGVzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgICAgICAgICAgICAgZG9jLmdldCgpLCBjdXIsIGNvbmZpZy0+Y3JpdGVyaW9uVHlwZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKICAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lR3JvdXBUcmFpdHM+KAotICAgICAgICAgICAgICAgIGRvYywgY3VyLCBjb25maWctPnZvbHVtZUdyb3VwcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgICAgICAgICAgICAgIGRvYy5nZXQoKSwgY3VyLCBjb25maWctPnZvbHVtZUdyb3VwcywgbmJTa2lwcGVkRWxlbWVudHMpOwogCiAgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHN9OwogfQogCiBhbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoY29uc3QgY2hhciogcGF0aCwgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpIHsKICAgICBYbWxFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOwotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKHBhdGgpKTsKICAgICBpZiAoZG9jID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MuZ2V0KCkpOwogICAgIGlmIChjdXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYy5nZXQoKSkgPCAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7Ci0gICAgcmV0dXJuIGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihkb2MsIGN1ciwgdm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihkb2MuZ2V0KCksIGN1ciwgdm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQgZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoID0gMTI4OwotCi1zdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbVhtbENvbmZpZ0ZpbGVOYW1lID0gImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7Ci1zdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSA9Ci0gICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIjsKLQogYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7Ci0gICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoXTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGZpbGVOYW1lczsKLSAgICBzdGF0dXNfdCByZXQ7Ci0KLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpICYmCi0gICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKLSAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUpOworICAgIGlmIChzdGQ6OnN0cmluZyBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUgPSBhdWRpb19nZXRfYXVkaW9fcG9saWN5X2NvbmZpZ19maWxlKCk7CisgICAgICAgICAgICAhYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUuY19zdHIoKSwgdm9sdW1lR3JvdXBzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiTm8gcmVhZGFibGUgYXVkaW8gcG9saWN5IGNvbmZpZyBmaWxlIGZvdW5kIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soYXBtWG1sQ29uZmlnRmlsZU5hbWUpOwotCi0gICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBhdWRpb19nZXRfY29uZmlndXJhdGlvbl9wYXRocygpKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwgcGF0aC5jX3N0cigpLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCB2b2x1bWVHcm91cHMpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgZW5naW5lQ29uZmlnCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5MWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDM0IEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeV9lbmdpbmVjb25maWdfdGVzdHMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCisKKyAgICBzcmNzOiBbImVuZ2luZWNvbmZpZ190ZXN0cy5jcHAiXSwKKworICAgIGRhdGE6IFsiOmF1ZGlvcG9saWN5X2VuZ2luZWNvbmZpZ19maWxlcyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL2VuZ2luZWNvbmZpZ190ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL2VuZ2luZWNvbmZpZ190ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZTAyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvZW5naW5lY29uZmlnX3Rlc3RzLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX1Rlc3QiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJFbmdpbmVDb25maWcuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK1RFU1QoRW5naW5lQ29uZmlnVGVzdEluaXQsIExlZ2FjeVZvbHVtZUdyb3Vwc0xvYWRpbmdJc1RyYW5zYWN0aW9uYWwpIHsKKyAgICBlbmdpbmVDb25maWc6OlZvbHVtZUdyb3VwcyBncm91cHM7CisgICAgQVNTRVJUX1RSVUUoZ3JvdXBzLmVtcHR5KCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGVuZ2luZUNvbmZpZzo6cGFyc2VMZWdhY3lWb2x1bWVGaWxlKAorICAgICAgICAgICAgKGJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvdGVzdF9pbnZhbGlkX2FwbV92b2x1bWVfdGFibGVzLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICBncm91cHMpOworICAgIEFTU0VSVF9ORShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfVFJVRShncm91cHMuZW1wdHkoKSk7CisgICAgc3RhdHVzID0gZW5naW5lQ29uZmlnOjpwYXJzZUxlZ2FjeVZvbHVtZUZpbGUoCisgICAgICAgICAgICAoYmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICBncm91cHMpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfRkFMU0UoZ3JvdXBzLmVtcHR5KCkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy90ZXN0cy9yZXNvdXJjZXMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlZTk3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeV9lbmdpbmVjb25maWdfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInRlc3RfYXBtX3ZvbHVtZV90YWJsZXMueG1sIiwKKyAgICAgICAgInRlc3RfaW52YWxpZF9hcG1fdm9sdW1lX3RhYmxlcy54bWwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXBtX3ZvbHVtZV90YWJsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2FwbV92b2x1bWVfdGFibGVzLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPGdsb2JhbENvbmZpZ3VyYXRpb24gc3BlYWtlcl9kcmNfZW5hYmxlZD0idHJ1ZSIvPgorICAgIDx2b2x1bWVzPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIKKyAgICAgICAgICAgICAgICByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVzPgorICAgIDx2b2x1bWVzPgorICAgICAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgICAgIDwhLS0gRnVsbCBTY2FsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICA8L3ZvbHVtZXM+Cis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfaW52YWxpZF9hcG1fdm9sdW1lX3RhYmxlcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzVkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXBtX3ZvbHVtZV90YWJsZXMueG1sCkBAIC0wLDAgKzEsNTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGZpbGUgdXNlcyBhIG5vbi1leGlzdGVudCBhdWRpbyBzdHJlYW0gbmFtZS4gLS0+Cis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9OT05fRVhJU1RJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUklORyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9NVVNJQyIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BTEFSTSIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yOTcwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjAxMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTEwMjA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCisgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgorICAgICAgICAgICAgICAgIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9EVE1GIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCisgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lcz4KKyAgICA8dm9sdW1lcz4KKyAgICAgICAgPHJlZmVyZW5jZSBuYW1lPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSI+CisgICAgICAgICAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgPC92b2x1bWVzPgorPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKaW5kZXggMmVhNDJiNi4uNWRkNWFkYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvRW5naW5lSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oCmluZGV4IGRmYjIwYjUuLjUxOGY4NmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvRW5naW5lSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9FbmdpbmVJbnRlcmZhY2UuaApAQCAtMTYsNiArMTYsOCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgpAQCAtMzQsNiArMzYsOCBAQAogdXNpbmcgRGV2aWNlU3RyYXRlZ3lNYXAgPSBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIERldmljZVZlY3Rvcj47CiB1c2luZyBTdHJhdGVneVZlY3RvciA9IHN0ZDo6dmVjdG9yPHByb2R1Y3Rfc3RyYXRlZ3lfdD47CiB1c2luZyBWb2x1bWVHcm91cFZlY3RvciA9IHN0ZDo6dmVjdG9yPHZvbHVtZV9ncm91cF90PjsKK3VzaW5nIENhcHR1cmVQcmVzZXREZXZpY2VzUm9sZU1hcCA9CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxhdWRpb19zb3VyY2VfdCwgZGV2aWNlX3JvbGVfdD4sIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+OwogCiAvKioKICAqIFRoaXMgaW50ZXJmYWNlIGlzIGRlZGljYXRlZCB0byB0aGUgcG9saWN5IG1hbmFnZXIgdGhhdCBhIFBvbGljeSBFbmdpbmUgc2hhbGwgaW1wbGVtZW50LgpAQCAtMTA4LDExICsxMTIsMTIgQEAKICAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBzZWxlY3RlZCBAcHJvZHVjdF9zdHJhdGVneV90IGZvbGxvd2VkIGJ5LgotICAgICAqCisgICAgICogQHBhcmFtIGZhbGxiYWNrT25EZWZhdWx0IGlmIHRydWUsIHdpbGwgcmV0dXJuIHRoZSBmYWxsYmFjayBzdHJhdGVneSBpZiB0aGUgYXR0cmlidXRlcworICAgICAqIGFyZSBub3QgZXhwbGljaXRseSBhc3NpZ25lZCB0byBhIGdpdmVuIHN0cmF0ZWd5LgogICAgICAqIEByZXR1cm4gQHByb2R1Y3Rfc3RyYXRlZ3lfdCB0byBiZSBmb2xsb3dlZC4KICAgICAgKi8KICAgICB2aXJ0dWFsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAotICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQgPSB0cnVlKSBjb25zdCA9IDA7CiAKICAgICAvKioKICAgICAgKiBAYnJpZWYgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMgcmV0cmlldmVzIHRoZSBkZXZpY2VzIHRvIGJlIHVzZWQgZm9yIGdpdmVuCkBAIC0xNjgsOCArMTczLDEwIEBACiAgICAgICogQHBhcmFtW291dF0gbWl4IHRvIGJlIHVzZWQgaWYgYSBtaXggaGFzIGJlZW4gaW5zdGFsbGVkIGZvciB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KICAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIGlucHV0IGRldmljZSBmb3IgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMsIG1heSBiZSBudWxsIGlmIGVycm9yLgogICAgICAqLwotICAgIHZpcnR1YWwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAotICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKm1peCA9IG51bGxwdHIpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKm1peCA9IG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUgZm9yIGEgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KQEAgLTI2OSwxOSArMjc2LDI1IEBACiAgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgogICAgICAqIEF1ZGlvIEF0dHJpYnV0ZXMuCiAgICAgICogQHBhcmFtIGF0dHIgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBmYWxsYmFja09uRGVmYXVsdCBpZiB0cnVlLCB3aWxsIHJldHVybiB0aGUgZmFsbGJhY2sgdm9sdW1lIGdyb3VwIGlmIHRoZSBhdHRyaWJ1dGVzCisgICAgICogYXJlIG5vdCBhc3NvY2lhdGVkIHRvIGFueSB2b2x1bWUgZ3JvdXAuCiAgICAgICogQHJldHVybiB2b2x1bWUgZ3JvdXAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcywgZGVmYXVsdCBncm91cCBpZiBub25lCiAgICAgICogYXBwbGljYWJsZSwgVk9MVU1FX0dST1VQX05PTkUgaWYgbm8gZGVmYXVsdCBncm91cCBkZWZpbmVkLgogICAgICAqLwotICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBib29sIGZhbGxiYWNrT25EZWZhdWx0ID0gdHJ1ZSkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZSBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgogICAgICAqIGxlZ2FjeSBzdHJlYW0gdHlwZQogICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGZhbGxiYWNrT25EZWZhdWx0IGlmIHRydWUsIHdpbGwgcmV0dXJuIHRoZSBmYWxsYmFjayB2b2x1bWUgZ3JvdXAgaWYgdGhlIHN0cmVhbSB0eXBlCisgICAgICogaXMgbm90IGFzc29jaWF0ZWQgdG8gYW55IHZvbHVtZSBncm91cC4KICAgICAgKiBAcmV0dXJuIHZvbHVtZSBncm91cCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgZGVmYXVsdCBncm91cCBpZiBub25lIGFwcGxpY2FibGUsCiAgICAgICogVk9MVU1FX0dST1VQX05PTkUgaWYgbm8gZGVmYXVsdCBncm91cCBkZWZpbmVkLgogICAgICAqLwotICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCA9IHRydWUpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIEBicmllZiBsaXN0QXVkaW9Wb2x1bWVHcm91cHMgaW50cm9zcGVjdGlvbiBBUEkgdG8gZ2V0IHRoZSBBdWRpbyBWb2x1bWUgR3JvdXBzLCBha2EKQEAgLTI5MywzNyArMzA2LDEyMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykgY29uc3QgPSAwOwogCiAgICAgLyoqCi0gICAgICogQGJyaWVmIHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5IHNldHMgdGhlIGRlZmF1bHQgZGV2aWNlIHRvIGJlIHVzZWQgZm9yIGEKLSAgICAgKiBzdHJhdGVneSB3aGVuIGF2YWlsYWJsZQorICAgICAqIEBicmllZiBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5IHNldHMgZGV2aWNlcyByb2xlIGZvciBhIHN0cmF0ZWd5IHdoZW4gYXZhaWxhYmxlLiBUbyByZW1vdmUKKyAgICAgKiBkZXZpY2VzIHJvbGUsIHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kgbXVzdCBiZSBjYWxsZWQuIFdoZW4gZGV2aWNlcyByb2xlIGlzIHNldAorICAgICAqIHN1Y2Nlc3NmdWxseSwgcHJldmlvdXNseSBzZXQgZGV2aWNlcyBmb3IgdGhlIHNhbWUgcm9sZSBhbmQgc3RyYXRlZ3kgd2lsbCBiZSByZW1vdmVkLgogICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgYXVkaW8gc3RyYXRlZ3kgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCi0gICAgICogQHBhcmFtIGRldmljZSB0aGUgYXVkaW8gZGV2aWNlIHRvIHJvdXRlIHRvIHdoZW4gYXZhaWxhYmxlCi0gICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIHN0cmF0ZWd5IGlzIGludmFsaWQsCi0gICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBwcmVmZXJyZWQgZGV2aWNlIHdhcyBzZXQKKyAgICAgKiBAcGFyYW0gcm9sZSB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3IgdGhlIHN0cmF0ZWd5LiBBbGwgZGV2aWNlIHJvbGVzIGFyZSBkZWZpbmVkIGF0CisgICAgICogICAgICAgICAgICAgc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUvc3lzdGVtL2F1ZGlvX3BvbGljeS5oLiBERVZJQ0VfUk9MRV9OT05FIGlzIGludmFsaWQKKyAgICAgKiAgICAgICAgICAgICBmb3Igc2V0dGluZy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0aGUgYXVkaW8gZGV2aWNlcyB0byBiZSBzZXQKKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgb3Igcm9sZSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgcm9sZSBvZiB0aGUgZGV2aWNlcyBmb3Igc3RyYXRlZ3kgd2FzIHNldAogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgPSAwOwogCiAgICAgLyoqCi0gICAgICogQGJyaWVmIHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5IHJlbW92ZXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgcHJldmlvdXNseSBzZXQKKyAgICAgKiBAYnJpZWYgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneSByZW1vdmVzIHRoZSByb2xlIG9mIGRldmljZShzKSBwcmV2aW91c2x5IHNldAogICAgICAqIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kKICAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgdGhlIGF1ZGlvIHN0cmF0ZWd5IHdob3NlIHJvdXRpbmcgd2lsbCBiZSBhZmZlY3RlZAotICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBpcyBpbnZhbGlkLAotICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgcHJlZmVycmVkIGRldmljZSB3YXMgcmVtb3ZlZAorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciBzdHJhdGVneQorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2VzIGZvciB0aGlzIHJvbGUgd2FzIHJlbW92ZWQKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpID0gMDsKIAogICAgIC8qKgotICAgICAqIEBicmllZiBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneSBxdWVyaWVzIHdoaWNoIGRldmljZSBpcyBzZXQgYXMgdGhlCi0gICAgICogcHJlZmVycmVkIGRldmljZSBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5CisgICAgICogQGJyaWVmIGdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3kgcXVlcmllcyB3aGljaCBkZXZpY2VzIGhhdmUgdGhlIHNwZWNpZmllZCByb2xlIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgc3RyYXRlZ3kKICAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgdGhlIHN0cmF0ZWd5IHRvIHF1ZXJ5Ci0gICAgICogQHBhcmFtIGRldmljZSByZXR1cm5zIGNvbmZpZ3VyZWQgYXMgdGhlIHByZWZlcnJlZCBkZXZpY2UgaWYgb25lIHdhcyBzZXQKLSAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgaXMgaW52YWxpZCwKLSAgICAgKiAgICAgb3IgTkFNRV9OT1RfRk9VTkQgaWYgbm8gcHJlZmVycmVkIGRldmljZSB3YXMgc2V0Ci0gICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2UgcGFyYW1ldGVyIHdhcyBpbml0aWFsaXplZCB0byB0aGUgcHJlZmVycmVkIGRldmljZQorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIHRvIHF1ZXJ5CisgICAgICogQHBhcmFtIGRldmljZXMgcmV0dXJucyBsaXN0IG9mIGRldmljZXMgd2l0aCBtYXRjaGluZyByb2xlIGZvciB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5LgorICAgICAqICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX05PTkUgaXMgaW52YWxpZCBhcyBpbnB1dC4KKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgb3Igcm9sZSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOQU1FX05PVF9GT1VORCBpZiBubyBkZXZpY2UgZm9yIHRoZSByb2xlIGFuZCBzdHJhdGVneSB3YXMgc2V0CisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2VzIHBhcmFtZXRlciBjb250YWlucyBhIGxpc3Qgb2YgZGV2aWNlcwogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgY29uc3QgPSAwOwogCisgICAgLyoqCisgICAgICogQGJyaWVmIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCBzZXRzIGRldmljZXMgcm9sZSBmb3IgYSBjYXB0dXJlIHByZXNldCB3aGVuIGF2YWlsYWJsZS4KKyAgICAgKiBUbyByZW1vdmUgZGV2aWNlcyByb2xlLCByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgbXVzdCBiZSBjYWxsZWQuIENhbGxpbmcKKyAgICAgKiBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCB3aWxsIHJlbW92ZSBhbGwgZGV2aWNlcyBhcyByb2xlLiBXaGVuIGRldmljZXMgcm9sZSBpcyBzZXQKKyAgICAgKiBzdWNjZXNzZnVsbHksIHByZXZpb3VzbHkgc2V0IGRldmljZXMgZm9yIHRoZSBzYW1lIHJvbGUgYW5kIGNhcHR1cmUgcHJlc2V0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIGF1ZGlvIGNhcHR1cmUgcHJlc2V0IHdob3NlIHJvdXRpbmcgd2lsbCBiZSBhZmZlY3RlZAorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgY2FwdHVyZSBwcmVzZXQuIEFsbCBkZXZpY2Ugcm9sZXMgYXJlIGRlZmluZWQgYXQKKyAgICAgKiAgICAgICAgICAgICBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmguIERFVklDRV9ST0xFX05PTkUgaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgIGZvciBzZXR0aW5nLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBhdWRpbyBkZXZpY2VzIHRvIGJlIHNldAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBjYXB0dXJlIHByZXNldCBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciBjYXB0dXJlIHByZXNldCB3YXMgc2V0CisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBhZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgYWRkcyBkZXZpY2VzIHJvbGUgZm9yIGEgY2FwdHVyZSBwcmVzZXQgd2hlbiBhdmFpbGFibGUuCisgICAgICogVG8gcmVtb3ZlIGRldmljZXMgcm9sZSwgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IG11c3QgYmUgY2FsbGVkLiBDYWxsaW5nCisgICAgICogY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgd2lsbCByZW1vdmUgYWxsIGRldmljZXMgYXMgcm9sZS4KKyAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIGF1ZGlvIGNhcHR1cmUgcHJlc2V0IHdob3NlIHJvdXRpbmcgd2lsbCBiZSBhZmZlY3RlZAorICAgICAqIEBwYXJhbSByb2xlIHRoZSByb2xlIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgY2FwdHVyZSBwcmVzZXQuIEFsbCBkZXZpY2Ugcm9sZXMgYXJlIGRlZmluZWQgYXQKKyAgICAgKiAgICAgICAgICAgICBzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZS9zeXN0ZW0vYXVkaW9fcG9saWN5LmguIERFVklDRV9ST0xFX05PTkUgaXMgaW52YWxpZAorICAgICAqICAgICAgICAgICAgIGZvciBzZXR0aW5nLgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBhdWRpbyBkZXZpY2VzIHRvIGJlIGFkZGVkCisgICAgICogQHJldHVybiBCQURfVkFMVUUgaWYgdGhlIGNhcHR1cmUgcHJlc2V0IG9yIHJvbGUgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIGNhcHR1cmUgcHJlc2V0IHdhcyBhZGRlZAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0IHJlbW92ZXMgdGhlIHJvbGUgb2YgZGV2aWNlKHMpIHByZXZpb3VzbHkgc2V0CisgICAgICogZm9yIHRoZSBnaXZlbiBjYXB0dXJlIHByZXNldAorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldAorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSBkZXZpY2VzIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiAxKSB0aGUgY2FwdHVyZSBwcmVzZXQgaXMgaW52YWxpZCwgMikgcm9sZSBpcyBpbnZhbGlkIG9yIDMpIHRoZSBsaXN0IG9mCisgICAgICogICAgIGRldmljZXMgdG8gYmUgcmVtb3ZlZCBhcmUgbm90IGFsbCBwcmVzZW50IGFzIHJvbGUgZm9yIGEgY2FwdHVyZSBwcmVzZXQKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgZm9yIHRoaXMgcm9sZSB3YXMgcmVtb3ZlZAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQgcmVtb3ZlcyB0aGUgcm9sZSBvZiBhbGwgZGV2aWNlKHMpIHByZXZpb3VzbHkgc2V0CisgICAgICogZm9yIHRoZSBnaXZlbiBjYXB0dXJlIHByZXNldAorICAgICAqIEBwYXJhbSBhdWRpb1NvdXJjZSB0aGUgYXVkaW8gY2FwdHVyZSBwcmVzZXQgd2hvc2Ugcm91dGluZyB3aWxsIGJlIGFmZmVjdGVkCisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgZm9yIHRoZSBjYXB0dXJlIHByZXNldAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBjYXB0dXJlIHByZXNldCBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2VzIGZvciB0aGlzIHJvbGUgd2FzIHJlbW92ZWQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQgcXVlcmllcyB3aGljaCBkZXZpY2VzIGhhdmUgdGhlIHNwZWNpZmllZCByb2xlIGZvcgorICAgICAqIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBwcmVzZXQKKyAgICAgKiBAcGFyYW0gYXVkaW9Tb3VyY2UgdGhlIGNhcHR1cmUgcHJlc2V0IHRvIHF1ZXJ5CisgICAgICogQHBhcmFtIHJvbGUgdGhlIHJvbGUgb2YgdGhlIGRldmljZXMgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyByZXR1cm5zIGxpc3Qgb2YgZGV2aWNlcyB3aXRoIG1hdGNoaW5nIHJvbGUgZm9yIHRoZSBzcGVjaWZpZWQgY2FwdHVyZSBwcmVzZXQuCisgICAgICogICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfTk9ORSBpcyBpbnZhbGlkIGFzIGlucHV0LgorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBjYXB0dXJlIHByZXNldCBvciByb2xlIGlzIGludmFsaWQsCisgICAgICogICAgIG9yIE5BTUVfTk9UX0ZPVU5EIGlmIG5vIGRldmljZSBmb3IgdGhlIHJvbGUgYW5kIGNhcHR1cmUgcHJlc2V0IHdhcyBzZXQKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZXMgcGFyYW1ldGVyIGNvbnRhaW5zIGEgbGlzdCBvZiBkZXZpY2VzCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBY3RpdmVNZWRpYURldmljZXMgcmV0dXJucyB3aGljaCBkZXZpY2VzIHdpbGwgbW9zdCBsaWtlbHkgdG8gYmUgdXNlZCBmb3IgbWVkaWEKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlRGV2aWNlcyBhbGwgYXZhaWxhYmxlIGRldmljZXMKKyAgICAgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRldmljZXMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBnZXRBY3RpdmVNZWRpYURldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVEZXZpY2VzKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0ID0gMDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icAppbmRleCA4ZjUyMmYwLi5hNzQ3ODIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX2ludGVyZmFjZV9oZWFkZXJzIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvQW5kcm9pZC5icAppbmRleCBmZTNlYWUwLi5iM2QxZjk3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xNiw2ICsxNiwxNSBAQAogCiAvLyBSb290IHNvb25nX25hbWVzcGFjZSBmb3IgY29tbW9uIGNvbXBvbmVudHMKIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL0FuZHJvaWQuYnAKaW5kZXggZjkxM2ExNC4uZTQ2YjYwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiwxNSBAQAogICAgIF0sCiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9BbmRyb2lkLmJwCmluZGV4IGZhZTZiN2IuLmFkNmVlYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDE1IEBACiAgICAgXSwKIH0KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9BbmRyb2lkLmJwCmluZGV4IDk0ZDMzYmQuLjc3M2E5OWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9BbmRyb2lkLmJwCkBAIC0yMiw2ICsyMiwxNSBAQAogICAgIF0sCiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYTczODhkYS4uYmMzMjQxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgogCiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CkBAIC03MiwxMiArNzgsNiBAQAogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+Ci0gICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4KLSAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KLSAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgotICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgotICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvQW5kcm9pZC5icAppbmRleCA5MGViZmZkLi5lZTYyZDVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDE1IEBACiAKIC8vIFJvb3Qgc29vbmdfbmFtZXNwYWNlIGZvciBjb21tb24gY29tcG9uZW50cwogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHByZWJ1aWx0X2V0YyB7CiAgICAgbmFtZTogIlBvbGljeUNsYXNzLnhtbCIsCiAgICAgdmVuZG9yOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5icAppbmRleCA4MmIxYjZkLi5iYzcyNDg0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5icApAQCAtMjYsNiArMjYsMTUgQEAKIC8vCiAvLyBHZW5lcmF0ZSBBdWRpbyBQb2xpY3kgUGFyYW1ldGVyIEZyYW1ld29yayBQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIGZpbGUgZnJvbSB0ZW1wbGF0ZQogLy8KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLmJwCmluZGV4IGU0NjA1YjIuLjExZGE4YzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLmJwCkBAIC0yNyw2ICsyNywxNSBAQAogLy8KIC8vIEdlbmVyYXRlIEF1ZGlvIFBvbGljeSBQYXJhbWV0ZXIgRnJhbWV3b3JrIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBmcm9tIHRlbXBsYXRlCiAvLworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJQcm9kdWN0U3RyYXRlZ2llcy54bWwiLAogICAgIHZlbmRvcjogdHJ1ZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLmJwCmluZGV4IDYxYjU0Y2YuLjkxZmZlYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5icApAQCAtMjYsNiArMjYsMTUgQEAKIC8vCiAvLyBHZW5lcmF0ZSBBdWRpbyBQb2xpY3kgUGFyYW1ldGVyIEZyYW1ld29yayBQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIGZpbGUgZnJvbSB0ZW1wbGF0ZQogLy8KK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vSW5wdXQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9JbnB1dC9BbmRyb2lkLmJwCmluZGV4IDlhYmNiNzAuLmNhYzYzZmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9JbnB1dC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9JbnB1dC9BbmRyb2lkLmJwCkBAIC0yMyw2ICsyMywxNSBAQAogICAgIF0sCiB9CiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogcHJlYnVpbHRfZXRjIHsKICAgICBuYW1lOiAicGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kiLAogICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9BbmRyb2lkLmJwCmluZGV4IDI3MTcyYTQuLjMzN2YzNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L0FuZHJvaWQuYnAKQEAgLTIzLDYgKzIzLDE1IEBACiAgICAgXSwKIH0KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeSIsCiAgICAgZmlsZW5hbWVfZnJvbV9zcmM6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwCmluZGV4IDI2ODVjNmQuLjAzOThmYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJwb2xpY3ktc3Vic3lzdGVtIiwKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAppbmRleCBmOTFmOGQ3Li5mOGE2ZmMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogYm9vbCBJbnB1dFNvdXJjZTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQogewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVJbnB1dERldmljZTsKKyAgICBhdWRpb19kZXZpY2VzX3QgYXBwbGljYWJsZUlucHV0RGV2aWNlOwogICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlSW5wdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlSW5wdXREZXZpY2UpKTsKICAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UobUlkLCBhcHBsaWNhYmxlSW5wdXREZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCmluZGV4IDI0NGYwODIuLjZjOGViNjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTMyLDcgKzMyLDcgQEAKIAogICAgIHN0cnVjdCBEZXZpY2UKICAgICB7Ci0gICAgICAgIHVpbnQzMl90IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhcHBsaWNhYmxlRGV2aWNlOyAvKio8IGFwcGxpY2FibGUgZGV2aWNlIGZvciB0aGlzIHN0cmF0ZWd5LiAqLwogICAgICAgICBjaGFyIGRldmljZUFkZHJlc3NbbU1heFN0cmluZ1NpemVdOyAvKio8IGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmF0ZWd5LiAqLwogICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAppbmRleCA2ZDQyZmNmLi5iMGMzNzZhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCkBAIC0zMTAsNiArMzEwLDcgQEAKIH0KIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRW5naW5lOjpnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXgpIGNvbnN0CiB7CiAgICAgY29uc3QgYXV0byAmcG9saWN5TWl4ZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdWRpb1BvbGljeU1peENvbGxlY3Rpb24oKTsKQEAgLTMyOCw3ICszMjksMTAgQEAKICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICB9CiAKLSAgICBkZXZpY2UgPSBwb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtaXgpOworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4KTsKICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaAppbmRleCAzYjM3MWQ4Li5kOGUyNzQyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTYxLDggKzYxLDEwIEBACiAgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZTsKIAogICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBhYTA2YWUzLi5mNDY0NWU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBtQXBwbGljYWJsZURldmljZXMgPSBkZXZpY2VzOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBkZXZpY2VzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihkZXZpY2VzIHwgQVVESU9fREVWSUNFX0JJVF9JTik7CiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlcykpIHsKICAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icAppbmRleCAzZTQ3MzI0Li40MGVmYjNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIHB5dGhvbl9kZWZhdWx0cyB7CiAgICAgbmFtZTogInRvb2xzX2RlZmF1bHQiLAogICAgIHZlcnNpb246IHsKQEAgLTQyLDggKzUxLDggQEAKICAgICBjbWQ6ICJjcCAkKGxvY2F0aW9ucyA6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZmlsZXMpICQoZ2VuRGlyKS8uICYmICIgKwogICAgICAgICAgImNwICQobG9jYXRpb24gOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3RvcF9maWxlKSAkKGdlbkRpcikvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sICYmICIgKwogICAgICAgICAgIiQobG9jYXRpb24gYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSkgIiArCi0gICAgICAgICAvLyBAdG9kbyB1cGRhdGUgaWYgMTQyODY1OSBpcyBtZXJnZWQgIi0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlciAkKGxvY2F0aW9uIDphbmRyb2lkX2F1ZGlvX2Jhc2VfaGVhZGVyX2ZpbGUpICIgKwotICAgICAgICAgIiAtLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUvc3lzdGVtL2F1ZGlvLWJhc2UuaCAiICsKKyAgICAgICAgICIgLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICQobG9jYXRpb24gOmxpYmF1ZGlvX3N5c3RlbV9hdWRpb19iYXNlKSAiICsKKyAgICAgICAgICIgLS1hbmRyb2lkYXVkaW9jb21tb25iYXNlaGVhZGVyICQobG9jYXRpb24gOmxpYmF1ZGlvX3N5c3RlbV9hdWRpb19jb21tb25fYmFzZSkgIiArCiAgICAgICAgICAiLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICQoZ2VuRGlyKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgIiArCiAgICAgICAgICAiLS1jcml0ZXJpb250eXBlcyAkKGxvY2F0aW9uIDphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlc190ZW1wbGF0ZSkgIiArCiAgICAgICAgICAiLS1vdXRwdXRmaWxlICQob3V0KSIsCkBAIC01MSw2ICs2MCw4IEBACiAgICAgICAgIC8vIFRoZSBjb21tZW50ZWQgaW5wdXRzIG11c3QgYmUgcHJvdmlkZWQgdG8gdXNlIHRoaXMgZ2VucnVsZV9kZWZhdWx0cwogICAgICAgICAvLyBAdG9kbyB1bmNvbW1lbnQgaWYgMTQyODY1OSBpcyBtZXJnZWQiOmFuZHJvaWRfYXVkaW9fYmFzZV9oZWFkZXJfZmlsZSIsCiAgICAgICAgICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXNfdGVtcGxhdGUiLAorICAgICAgICAiOmxpYmF1ZGlvX3N5c3RlbV9hdWRpb19iYXNlIiwKKyAgICAgICAgIjpsaWJhdWRpb19zeXN0ZW1fYXVkaW9fY29tbW9uX2Jhc2UiLAogICAgICAgICAvLyAiOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3RvcF9maWxlIiwKICAgICAgICAgLy8gIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9maWxlcyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQppbmRleCA5YTdmYThmLi40M2IzZGQyIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CkBAIC01MiwxMyArNTIsMTkgQEAKIGRlZiBmaW5kQml0UG9zKGRlY2ltYWwpOgogICAgIHBvcyA9IDAKICAgICBpID0gMQotICAgIHdoaWxlIGkgIT0gZGVjaW1hbDoKKyAgICB3aGlsZSBpIDwgZGVjaW1hbDoKICAgICAgICAgaSA9IGkgPDwgMQogICAgICAgICBwb3MgPSBwb3MgKyAxCiAgICAgICAgIGlmIHBvcyA9PSAzMjoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgIHJldHVybiBwb3MKIAorICAgICMgVE9ETzogYi8xNjgwNjU3MDYuIFRoaXMgaXMganVzdCB0byBmaXggdGhlIGJ1aWxkLiBUaGF0IHRoZSBwcm9ibGVtIG9mIGRldmljZXMgd2l0aAorICAgICMgbXVsdGlwbGUgYml0cyBzZXQgbXVzdCBiZSBhZGRyZXNzZWQgbW9yZSBnZW5lcmFsbHkgaW4gdGhlIGNvbmZpZ3VyYWJsZSBhdWRpbyBwb2xpY3kKKyAgICAjIGFuZCBwYXJhbWV0ZXIgZnJhbWV3b3JrLgorICAgIGlmIGkgPiBkZWNpbWFsOgorICAgICAgICBsb2dnaW5nLmluZm8oIkRldmljZTp7fSB3aGljaCBoYXMgbXVsdGlwbGUgYml0cyBzZXQgaXMgc2tpcHBlZC4gYi8xNjgwNjU3MDYiLmZvcm1hdChkZWNpbWFsKSkKKyAgICAgICAgcmV0dXJuIC0yCisgICAgcmV0dXJuIHBvcwogCiBkZWYgZ2VuZXJhdGVYbWxTdHJ1Y3R1cmVGaWxlKGNvbXBvbmVudFR5cGVEaWN0LCBzdHJ1Y3R1cmVUeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgogCkBAIC03NCwxMCArODAsMTIgQEAKICAgICAgICAgICAgICAgICBpZiBiaXRwYXJhbWV0ZXJzX25vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWRfdmFsdWVzID0gT3JkZXJlZERpY3Qoc29ydGVkKHZhbHVlc19kaWN0Lml0ZW1zKCksIGtleT1sYW1iZGEgeDogeFsxXSkpCiAgICAgICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9yZGVyZWRfdmFsdWVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudChiaXRwYXJhbWV0ZXJzX25vZGUsICJCaXRQYXJhbWV0ZXIiKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ05hbWUnLCBrZXkpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnU2l6ZScsICIxIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdQb3MnLCBzdHIoZmluZEJpdFBvcyh2YWx1ZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZmluZEJpdFBvcyh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KGJpdHBhcmFtZXRlcnNfbm9kZSwgIkJpdFBhcmFtZXRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ05hbWUnLCBrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1NpemUnLCAiMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1BvcycsIHN0cihwb3MpKQogCiAgICAgICAgICAgICAgICAgZW51bV9wYXJhbWV0ZXJfbm9kZSA9IGNvbXBvbmVudF90eXBlLmZpbmQoIkVudW1QYXJhbWV0ZXIiKQogICAgICAgICAgICAgICAgIGlmIGVudW1fcGFyYW1ldGVyX25vZGUgaXMgbm90IE5vbmU6CkBAIC0xMTgsOSArMTI2LDkgQEAKICAgICBpZ25vcmVkX3ZhbHVlcyA9IFsnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORSddCiAKICAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKLSAgICAgICAgciJccyooP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNvbXBvbmVudF90eXBlX21hcHBpbmdfdGFibGUua2V5cygpKSArICIpKV8iIFwKLSAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAotICAgICAgICByIig/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdKykiKQorICAgICAgICByIlxzKlZcKCg/UDx0eXBlPig/OiIrJ3wnLmpvaW4oY29tcG9uZW50X3R5cGVfbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAorICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3KilccyosXHMqIiBcCisgICAgICAgIHIiKD86QVVESU9fREVWSUNFX0JJVF9JTiBcfCApPyg/UDx2YWx1ZXM+KD86MFt4WF0pWzAtOWEtZkEtRl0rfFswLTldKykiKQogCiAgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQogCkBAIC0xNTYsMTMgKzE2NCwxNCBAQAogCiAgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ0eXBlOnt9LCBsaXRlcmFsOnt9LCB2YWx1ZXM6e30uIi5mb3JtYXQoY29tcG9uZW50X3R5cGVfbmFtZSwgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCwgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlKSkKIAotICAgICMgVHJhbnNmb3JtIGlucHV0IHNvdXJjZSBpbiBpbmNsdXNpdmUgY3JpdGVyaW9uCi0gICAgc2hpZnQgPSBsZW4oYWxsX2NvbXBvbmVudF90eXBlc1snT3V0cHV0RGV2aWNlc01hc2snXSkKLSAgICBpZiBzaGlmdCA+IDMyOgotICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKCJPdXRwdXREZXZpY2VzTWFzayBpbmNvbXBhdGlibGUgd2l0aCBjcml0ZXJpb24gcmVwcmVzZW50YXRpb24gb24gMzIgYml0cyIpCi0gICAgICAgIGxvZ2dpbmcuaW5mbygiRVhJVCBPTiBGQUlMVVJFIikKLSAgICAgICAgZXhpdCgxKQorICAgIGlmICJzdHViIiBub3QgaW4gYWxsX2NvbXBvbmVudF90eXBlc1siT3V0cHV0RGV2aWNlc01hc2siXToKKyAgICAgICAgYWxsX2NvbXBvbmVudF90eXBlc1siT3V0cHV0RGV2aWNlc01hc2siXVsic3R1YiJdID0gMHg0MDAwMDAwMAorICAgICAgICBsb2dnaW5nLmluZm8oImFkZGVkIHN0dWIgb3V0cHV0IGRldmljZSBtYXNrIikKKyAgICBpZiAic3R1YiIgbm90IGluIGFsbF9jb21wb25lbnRfdHlwZXNbIklucHV0RGV2aWNlc01hc2siXToKKyAgICAgICAgYWxsX2NvbXBvbmVudF90eXBlc1siSW5wdXREZXZpY2VzTWFzayJdWyJzdHViIl0gPSAweDQwMDAwMDAwCisgICAgICAgIGxvZ2dpbmcuaW5mbygiYWRkZWQgc3R1YiBpbnB1dCBkZXZpY2UgbWFzayIpCiAKKyAgICAjIFRyYW5zZm9ybSBpbnB1dCBzb3VyY2UgaW4gaW5jbHVzaXZlIGNyaXRlcmlvbgogICAgIGZvciBjb21wb25lbnRfdHlwZXMgaW4gYWxsX2NvbXBvbmVudF90eXBlczoKICAgICAgICAgdmFsdWVzID0gJywnLmpvaW4oJ3t9Ont9Jy5mb3JtYXQodmFsdWUsIGtleSkgZm9yIGtleSwgdmFsdWUgaW4gYWxsX2NvbXBvbmVudF90eXBlc1tjb21wb25lbnRfdHlwZXNdLml0ZW1zKCkpCiAgICAgICAgIGxvZ2dpbmcuaW5mbygie306IDx7fT4iLmZvcm1hdChjb21wb25lbnRfdHlwZXMsIHZhbHVlcykpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CmluZGV4IGI4YjYwYzEuLjc2YzM1YzEgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CkBAIC01NSw2ICs1NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYW5kcm9pZGF1ZGlvY29tbW9uYmFzZWhlYWRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIENvbW1vbkJhc2UgQyBoZWFkZXIgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJBTkRST0lEX0FVRElPX0NPTU1PTl9CQVNFX0hFQURFUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQogICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUsIE1hbmRhdG9yeS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iKEFVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpIiwKQEAgLTE3NiwxMiArMTgxLDEyIEBACiAjICAgLU91dHB1dCBkZXZpY2VzIHR5cGUKICMgICAtSW5wdXQgZGV2aWNlcyB0eXBlCiAjCi1kZWYgcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKToKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUsIGFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXJGaWxlKToKICAgICAjCiAgICAgIyBBZGFwdGF0aW9uIHRhYmxlIGJldHdlZW4gQW5kcm9pZCBFbnVtZXJhdGlvbiBwcmVmaXggYW5kIEF1ZGlvIFBGVyBDcml0ZXJpb24gdHlwZSBuYW1lcwogICAgICMKICAgICBjcml0ZXJpb25fbWFwcGluZ190YWJsZSA9IHsKLSAgICAgICAgJ0FVRElPX01PREUnIDogIkFuZHJvaWRNb2RlVHlwZSIsCisgICAgICAgICdIQUxfQVVESU9fTU9ERScgOiAiQW5kcm9pZE1vZGVUeXBlIiwKICAgICAgICAgJ0FVRElPX0RFVklDRV9PVVQnIDogIk91dHB1dERldmljZXNNYXNrVHlwZSIsCiAgICAgICAgICdBVURJT19ERVZJQ0VfSU4nIDogIklucHV0RGV2aWNlc01hc2tUeXBlIn0KIApAQCAtMTk1LDEwICsyMDAsMTUgQEAKICAgICAjCiAgICAgaWdub3JlZF92YWx1ZXMgPSBbJ0NOVCcsICdNQVgnLCAnQUxMJywgJ05PTkUnXQogCisgICAgIworICAgICMgUmVhY2hpbmcgMzIgYml0IGxpbWl0IGZvciBpbmNsdXNpdmUgY3JpdGVyaW9uIG91dCBkZXZpY2VzOiByZW1vdmluZworICAgICMKKyAgICBpZ25vcmVkX291dHB1dF9kZXZpY2VfdmFsdWVzID0gWydCbGVTcGVha2VyJywgJ0JsZUhlYWRzZXQnXQorCiAgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCi0gICAgICAgIHIiXHMqKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAotICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3Kilccyo9XHMqIiBcCi0gICAgICAgIHIiKD9QPHZhbHVlcz4oPzowW3hYXSk/WzAtOWEtZkEtRl0rKSIpCisgICAgICAgIHIiXHMqVlwoKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAorICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3KilccyosXHMqIiBcCisgICAgICAgIHIiKD86QVVESU9fREVWSUNFX0JJVF9JTiBcfCApPyg/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdK3xbMC05XSspIikKIAogICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQW5kcm9pZCBIZWFkZXIgZmlsZSB7fSIuZm9ybWF0KGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKSkKIApAQCAtMjA5LDI3ICsyMTksOTMgQEAKICAgICAgICAgICAgICAgICBhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZS5uYW1lLCBsaW5lX251bWJlciwgbGluZSkpCiAKICAgICAgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uX21hcHBpbmdfdGFibGVbbWF0Y2guZ3JvdXBkaWN0KClbJ3R5cGUnXV0KLSAgICAgICAgICAgIGxpdGVyYWwgPSAnJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBtYXRjaC5ncm91cGRpY3QoKVsnbGl0ZXJhbCddLnNwbGl0KCdfJykpKQotICAgICAgICAgICAgbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCisgICAgICAgICAgICBjcml0ZXJpb25fbGl0ZXJhbCA9IFwKKyAgICAgICAgICAgICAgICAnJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBtYXRjaC5ncm91cGRpY3QoKVsnbGl0ZXJhbCddLnNwbGl0KCdfJykpKQorICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IG1hdGNoLmdyb3VwZGljdCgpWyd2YWx1ZXMnXQogCi0gICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0CisgICAgICAgICAgICAjIGZvciBBVURJT19ERVZJQ0VfSU46IG5lZWQgdG8gcmVtb3ZlIHNpZ24gYml0IC8gcmVuYW1lIGRlZmF1bHQgdG8gc3R1YgogICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2tUeXBlIjoKLSAgICAgICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KG51bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbGl0ZXJhbCA9PSAiRGVmYXVsdCI6CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KCIweDQwMDAwMDAwIiwgMCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2ludCA9IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygidmFsdWUge306e30gZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApICYgfjIxNDc0ODM2NDgpCisKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9uYW1lID09ICJPdXRwdXREZXZpY2VzTWFza1R5cGUiOgorICAgICAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9saXRlcmFsID09ICJEZWZhdWx0IjoKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoIjB4NDAwMDAwMDAiLCAwKSkKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fbGl0ZXJhbCBpbiBpZ25vcmVkX291dHB1dF9kZXZpY2VfdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIk91dHB1dERldmljZXNNYXNrVHlwZSBza2lwcGluZyB7fSIuZm9ybWF0KGNyaXRlcmlvbl9saXRlcmFsKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdHJpbmdfaW50ID0gaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIEhhbmRsZSB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZm9yIGNyaXRlcmlvbiB7fSBpcyBub3QgYSBudW1iZXIsIGlnbm9yaW5nIgorICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIGNyaXRlcmlvbl9saXRlcmFsLCBjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWUKIAogICAgICAgICAgICAgIyBSZW1vdmUgZHVwbGljYXRlZCBudW1lcmljYWwgdmFsdWVzCi0gICAgICAgICAgICBpZiBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgaW50KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0udmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJjcml0ZXJpb24ge30gZHVwbGljYXRlZCB2YWx1ZXM6Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQotICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306e30iLmZvcm1hdChudW1lcmljYWxfdmFsdWUsIGxpdGVyYWwpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygie306e30iLmZvcm1hdChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCBjcml0ZXJpb25fbGl0ZXJhbCkpCiAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJLRUVQSU5HIExBVEVTVCIpCiAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBsaXN0KGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV0pOgotICAgICAgICAgICAgICAgICAgICBpZiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0gPT0gaW50KG51bWVyaWNhbF92YWx1ZSwgMCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCk6CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldCiAKLSAgICAgICAgICAgIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1bbGl0ZXJhbF0gPSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKQorICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtjcml0ZXJpb25fbGl0ZXJhbF0gPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKIAogICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidHlwZTp7fSwiLmZvcm1hdChjcml0ZXJpb25fbmFtZSkpCi0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJpdGVyYWw6e30sIi5mb3JtYXQobGl0ZXJhbCkpCi0gICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ2YWx1ZXM6e30uIi5mb3JtYXQobnVtZXJpY2FsX3ZhbHVlKSkKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIml0ZXJhbDp7fSwiLmZvcm1hdChjcml0ZXJpb25fbGl0ZXJhbCkpCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ2YWx1ZXM6e30uIi5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSkpCisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEFuZHJvaWQgQ29tbW9uIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvY29tbW9uYmFzZWhlYWRlckZpbGUpKQorCisgICAgY3JpdGVyaWFfcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgIHIiXHMqKD9QPHR5cGU+KD86IisnfCcuam9pbihjcml0ZXJpb25fbWFwcGluZ190YWJsZS5rZXlzKCkpICsgIikpXyIgXAorICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3Kilccyo9XHMqIiBcCisgICAgICAgIHIiKD86QVVESU9fREVWSUNFX0JJVF9JTiBcfCApPyg/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdK3xbMC05XSspIikKKworICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBlbnVtZXJhdGUoYW5kcm9pZGF1ZGlvY29tbW9uYmFzZWhlYWRlckZpbGUpOgorICAgICAgICBtYXRjaCA9IGNyaXRlcmlhX3BhdHRlcm4ubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJUaGUgZm9sbG93aW5nIGxpbmUgaXMgVkFMSUQ6IHt9Ont9XG57fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXJGaWxlLm5hbWUsIGxpbmVfbnVtYmVyLCBsaW5lKSkKKworICAgICAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb25fbWFwcGluZ190YWJsZVttYXRjaC5ncm91cGRpY3QoKVsndHlwZSddXQorICAgICAgICAgICAgY3JpdGVyaW9uX2xpdGVyYWwgPSBcCisgICAgICAgICAgICAgICAgJycuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbWF0Y2guZ3JvdXBkaWN0KClbJ2xpdGVyYWwnXS5zcGxpdCgnXycpKSkKKyAgICAgICAgICAgIGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0cmluZ19pbnQgPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgSGFuZGxlIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRoZSB2YWx1ZSB7fTp7fSBpcyBmb3IgY3JpdGVyaW9uIHt9IGlzIG5vdCBhIG51bWJlciwgaWdub3JpbmciCisgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwsIGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLnZhbHVlcygpOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiY3JpdGVyaW9uIHt9IGR1cGxpY2F0ZWQgdmFsdWVzOiIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9Ont9Ii5mb3JtYXQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgY3JpdGVyaW9uX2xpdGVyYWwpKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiS0VFUElORyBMQVRFU1QiKQorICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gbGlzdChhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldID09IGludChjcml0ZXJpb25fbnVtZXJpY2FsX3ZhbHVlLCAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0KKworICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtjcml0ZXJpb25fbGl0ZXJhbF0gPSBpbnQoY3JpdGVyaW9uX251bWVyaWNhbF92YWx1ZSwgMCkKKworICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidHlwZTp7fSwiLmZvcm1hdChjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJpdGVyYWw6e30sIi5mb3JtYXQoY3JpdGVyaW9uX2xpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KGNyaXRlcmlvbl9udW1lcmljYWxfdmFsdWUpKQogCiAgICAgcmV0dXJuIGFsbF9jcml0ZXJpYQogCkBAIC0yMzgsNyArMzE0LDggQEAKICAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQogICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQogCi0gICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcikKKyAgICBhbGxfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYXJncy5hbmRyb2lkYXVkaW9iYXNlaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFuZHJvaWRhdWRpb2NvbW1vbmJhc2VoZWFkZXIpCiAKICAgICBhZGRyZXNzX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uRmlsZShhcmdzLmF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCmluZGV4IDMwMWVjYzAuLjNlMDRiNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9wZnd3cmFwcGVyIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icAppbmRleCBhYWY0MTU4Li43ZjljMGFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQiLAogICAgIHNyY3M6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5icAppbmRleCAwYmZjYWExLi41OWE3MDRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSwxNSBAQAogc29vbmdfbmFtZXNwYWNlIHsKIH0KIAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBwcmVidWlsdF9ldGMgewogICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCmluZGV4IGE3Mzg4ZGEuLmJjMzI0MTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgogCiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CkBAIC03MiwxMiArNzgsNiBAQAogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+Ci0gICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4KLSAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KLSAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgotICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgotICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGIxNGQyYmIuLmM3M2MxN2QKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0xNDIsNTggKzE0MiwyMiBAQAogICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAotRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdAordm9pZCBFbmdpbmU6OmZpbHRlck91dHB1dERldmljZXNGb3JTdHJhdGVneShsZWdhY3lfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMpIGNvbnN0CiB7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwogCiAgICAgc3dpdGNoIChzdHJhdGVneSkgewotCi0gICAgY2FzZSBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI6Ci0gICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKLSAgICAgICAgICAgIGRldmljZXMgPSBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2wgbWVkaWFfYWN0aXZlX2xvY2FsbHkgPQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkKLSAgICAgICAgICAgICAgICAgICAgfHwgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSksCi0gICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDogeworICAgICAgICBpZiAoIShpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7CiAgICAgICAgICAgICAvLyByb3V0aW5nIGlzIHNhbWUgYXMgbWVkaWEgd2l0aG91dCB0aGUgInJlbW90ZSIgZGV2aWNlCiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSk7Ci0gICAgICAgICAgICBkZXZpY2VzID0gZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KFNUUkFURUdZX01FRElBLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwotICAgICAgICAgICAgLy8gaWYgbm8gbWVkaWEgaXMgcGxheWluZyBvbiB0aGUgZGV2aWNlLCBjaGVjayBmb3IgbWFuZGF0b3J5IHVzZSBvZiAic2FmZSIgc3BlYWtlcgotICAgICAgICAgICAgLy8gd2hlbiBtZWRpYSB3b3VsZCBoYXZlIHBsYXllZCBvbiBzcGVha2VyLCBhbmQgdGhlIHNhZmUgc3BlYWtlciBwYXRoIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgaWYgKCFtZWRpYV9hY3RpdmVfbG9jYWxseSkgewotICAgICAgICAgICAgICAgIGRldmljZXMucmVwbGFjZURldmljZXNCeVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBicmVhazsKLQorICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKLSAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKLSAgICAgICAgICAgIGRldmljZXMgPSBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX01FRElBLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLQotICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CisgICAgY2FzZSBTVFJBVEVHWV9QSE9ORTogewogICAgICAgICAvLyBGb3JjZSB1c2Ugb2Ygb25seSBkZXZpY2VzIG9uIHByaW1hcnkgb3V0cHV0IGlmOgogICAgICAgICAvLyAtIGluIGNhbGwgQU5ECiAgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCkBAIC0yMTYsODcgKzE4MCwxMDIgQEAKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpOwogCiAgICAgICAgICAgICBpZiAoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSA9PSBudWxscHRyKSB8fAotICAgICAgICAgICAgICAgICAgICAoKGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhEZXZpY2UsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCkgIT0gbnVsbHB0cikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpbWFyeU91dHB1dC0+Z2V0UG9saWN5QXVkaW9Qb3J0KCktPmdldE1vZHVsZVZlcnNpb25NYWpvcigpIDwgMykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgICAgICgoYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4RGV2aWNlLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5nZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSkpIHsKICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieQotICAgICAgICAvLyBvcmRlciBvZiBwcmlvcml0eQotICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpIHx8IHN0cmF0ZWd5ICE9IFNUUkFURUdZX0RUTUYpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ099KTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCi0gICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAotICAgICAgICBkZWZhdWx0OiAgICAvLyBGT1JDRV9OT05FCi0gICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7Ci0gICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKLSAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVN9KTsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBEbyBub3QgdXNlIEEyRFAgZGV2aWNlcyB3aGVuIGluIGNhbGwgYnV0IHVzZSB0aGVtIHdoZW4gbm90IGluIGNhbGwKKyAgICAgICAgLy8gKGUuZyBmb3Igdm9pY2UgbWFpbCBwbGF5YmFjaykKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSLCB9KSk7CisgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk6IHsKKyAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQorICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+Z2V0Rm9ybWF0KCkpKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGVzYy0+ZGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZXMoeworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCBBVURJT19ERVZJQ0VfT1VUX1NQRElGLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQywgQVVESU9fREVWSUNFX09VVF9IRE1JX0VBUkN9KSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0xJTkUsIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRX0pOwotICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZLCBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCwgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVH0pOwotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOworICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lOjpyZW1hcFN0cmF0ZWd5RnJvbUNvbnRleHQocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdCB7CisgICAgYXV0byBsZWdhY3lTdHJhdGVneSA9IG1MZWdhY3lTdHJhdGVneU1hcC5maW5kKHN0cmF0ZWd5KSAhPSBlbmQobUxlZ2FjeVN0cmF0ZWd5TWFwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lTdHJhdGVneU1hcC5hdChzdHJhdGVneSkgOiBTVFJBVEVHWV9OT05FOworCisgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgc3dpdGNoIChsZWdhY3lTdHJhdGVneSkgeworICAgICAgICBjYXNlIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKKyAgICAgICAgY2FzZSBTVFJBVEVHWV9NRURJQToKKyAgICAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CisgICAgICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6CisgICAgICAgICAgICBsZWdhY3lTdHJhdGVneSA9IFNUUkFURUdZX1BIT05FOwogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUjoKLSAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvCi0gICAgICAgICAgICAvLyBBMkRQIHNwZWFrZXIgd2hlbiBmb3JjaW5nIHRvIHNwZWFrZXIgb3V0cHV0Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUik7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZLCBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVH0pOwotICAgICAgICAgICAgICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzdHJhdGVneTsKICAgICAgICAgfQotICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobGVnYWN5U3RyYXRlZ3kpIHsKKyAgICAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKKyAgICAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CisgICAgICAgICAgICBpZiAob3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgeworICAgICAgICAgICAgICAgIGxlZ2FjeVN0cmF0ZWd5ID0gU1RSQVRFR1lfUEhPTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgICAgICBpZiAob3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORykpIHx8CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0FMQVJNKSkpIHsKKyAgICAgICAgICAgICAgICBsZWdhY3lTdHJhdGVneSA9IFNUUkFURUdZX1NPTklGSUNBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3k7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdldFByb2R1Y3RTdHJhdGVneUZyb21MZWdhY3kobGVnYWN5U3RyYXRlZ3kpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQobGVnYWN5X3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworCisgICAgc3dpdGNoIChzdHJhdGVneSkgeworCisgICAgY2FzZSBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI6CisgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6IHsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpOworICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKKyAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygpKTsKKyAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CisgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKTsKKyAgICB9IGJyZWFrOwogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046Ci0KLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlCi0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewotICAgICAgICAgICAgZGV2aWNlcyA9IGdldERldmljZXNGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLQogICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKICAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCiAgICAgICAgIC8vIGV4Y2VwdDoKQEAgLTMyNyw3ICszMDYsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFVzZSBib3RoIEJsdWV0b290aCBTQ08gYW5kIHBob25lIGRlZmF1bHQgb3V0cHV0IHdoZW4gcmluZ2luZyBpbiBub3JtYWwgbW9kZQotICAgICAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgeworICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2JsdWV0b290aF9vdXRfc2NvX2RldmljZShnZXRQcmVmZXJyZWREZXZpY2VUeXBlRm9yTGVnYWN5U3RyYXRlZ3koCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsIFNUUkFURUdZX1BIT05FKSkpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgIGRldmljZXMucmVwbGFjZURldmljZXNCeVR5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSLApAQCAtMzQzLDMyICszMjMsOSBAQAogICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCisgICAgY2FzZSBTVFJBVEVHWV9EVE1GOgogICAgIGNhc2UgU1RSQVRFR1lfQUNDRVNTSUJJTElUWToKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKLSAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNBY3RpdmUoKSAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShkZXNjLT5nZXRGb3JtYXQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGVzYy0+ZGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSwgQVVESU9fREVWSUNFX09VVF9TUERJRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDfSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERldmljZXNGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBvdGhlciBjYXNlcywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBiZWhhdmVzIGxpa2UgU1RSQVRFR1lfTUVESUEKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0KLSAgICAvLyBGSVhNRTogU1RSQVRFR1lfUkVST1VUSU5HIGZvbGxvdyBTVFJBVEVHWV9NRURJQSBmb3Igbm93CisgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKICAgICBjYXNlIFNUUkFURUdZX1JFUk9VVElORzoKICAgICBjYXNlIFNUUkFURUdZX01FRElBOiB7CiAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzMjsKQEAgLTM4MSwyMyArMzM4LDEzIEBACiAgICAgICAgICAgICAgICAgZGV2aWNlczIuYWRkKHJlbW90ZVN1Ym1peCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgJiYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSkgewotICAgICAgICAgICAgZGV2aWNlcyA9IGdldERldmljZXNGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciBzb2x1dGlvbiB0byBwcmV2ZW50IHJvdXRpbmcgdG8gQlQgaGVhcmluZyBhaWQoYi8xMjI5MzEyNjEpLgotICAgICAgICBpZiAoKGRldmljZXMyLmlzRW1wdHkoKSkgJiYKLSAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7Ci0gICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpOwotICAgICAgICB9CisKICAgICAgICAgaWYgKChkZXZpY2VzMi5pc0VtcHR5KCkpICYmCiAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CiAgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZXMyLmlzRW1wdHkoKSAmJiAoZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygpLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICBpZiAoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBpZiAoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSkgewogICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjb25uZWN0ZWQgZGV2aWNlIG9mIHdpcmVkIGFuZCBibHVldG9vdGggYTJkcAogICAgICAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKCkpOwpAQCAtNDIzLDcgKzM3MCw5IEBACiAgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgewogICAgICAgICAgICAgLy8gQVJDLCBTUERJRiBhbmQgQVVYX0xJTkUgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzLgogICAgICAgICAgICAgZGV2aWNlczMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoewotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDLCBBVURJT19ERVZJQ0VfT1VUX1NQRElGLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FfSk7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMsIEFVRElPX0RFVklDRV9PVVRfSERNSV9FQVJDLAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRElGLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FLAorICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogCiAgICAgICAgIGRldmljZXMyLmFkZChkZXZpY2VzMyk7CkBAIC00MzgsOSArMzg3LDIxIEBACiAgICAgICAgICAgICBkZXZpY2VzLnJlbW92ZShkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGZvciBTVFJBVEVHWV9TT05JRklDQVRJT046CisgICAgICAgIGJvb2wgbWVkaWFBY3RpdmVMb2NhbGx5ID0KKyAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKQorICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KAorICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSksCisgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKKworICAgICAgICBib29sIHJpbmdBY3RpdmVMb2NhbGx5ID0gb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpLCAwKTsKKyAgICAgICAgLy8gLSBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIGFuZCByaW5ndG9uZSBhY3RpdmU6CiAgICAgICAgIC8vIGlmIFNQRUFLRVIgd2FzIHNlbGVjdGVkLCBhbmQgU1BFQUtFUl9TQUZFIGlzIGF2YWlsYWJsZSwgdXNlIFNQRUFLRVJfU0FGRSBpbnN0ZWFkCi0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgLy8gLSBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6CisgICAgICAgIC8vIGlmIG5vIG1lZGlhIGlzIHBsYXlpbmcgb24gdGhlIGRldmljZSwgY2hlY2sgZm9yIG1hbmRhdG9yeSB1c2Ugb2YgInNhZmUiIHNwZWFrZXIKKyAgICAgICAgLy8gd2hlbiBtZWRpYSB3b3VsZCBoYXZlIHBsYXllZCBvbiBzcGVha2VyLCBhbmQgdGhlIHNhZmUgc3BlYWtlciBwYXRoIGlzIGF2YWlsYWJsZQorICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHx8IHJpbmdBY3RpdmVMb2NhbGx5CisgICAgICAgICAgICB8fCAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgJiYgIW1lZGlhQWN0aXZlTG9jYWxseSkpIHsKICAgICAgICAgICAgIGRldmljZXMucmVwbGFjZURldmljZXNCeVR5cGUoCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiwKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCkBAIC00NTIsMjIgKzQxMywyNiBAQAogICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgU1RSQVRFR1lfTk9ORToKKyAgICAgICAgLy8gSGFwcGVucyB3aGVuIGludGVybmFsIHN0cmF0ZWdpZXMgYXJlIHByb2Nlc3NlZCAoInJlcm91dGluZyIsICJwYXRjaCIuLi4pCisgICAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZXNGb3JTdHJhdGVneSgpIHVua25vd24gc3RyYXRlZ3k6ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzdHJhdGVneTogJWQiLCBfX2Z1bmNfXywgc3RyYXRlZ3kpOwogICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAoZGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoImdldERldmljZXNGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3Igc3RyYXRlZ3kgJWQiLCBzdHJhdGVneSk7CisgICAgICAgIEFMT0dWKCIlcyBubyBkZXZpY2UgZm91bmQgZm9yIHN0cmF0ZWd5ICVkIiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdE91dHB1dERldmljZSA9IGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKTsKICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIH0KICAgICAgICAgQUxPR0VfSUYoZGV2aWNlcy5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICJnZXREZXZpY2VzRm9yU3RyYXRlZ3koKSBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIik7CisgICAgICAgICAgICAgICAgICIlcyBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIiwgX19mdW5jX18pOwogICAgIH0KIAotICAgIEFMT0dWVigiZ2V0RGV2aWNlcyBGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXMiLAorICAgIEFMT0dWVigiJXMgc3RyYXRlZ3kgJWQsIGRldmljZSAlcyIsIF9fZnVuY19fLAogICAgICAgICAgICBzdHJhdGVneSwgZHVtcERldmljZVR5cGVzKGRldmljZXMudHlwZXMoKSkuY19zdHIoKSk7CiAgICAgcmV0dXJuIGRldmljZXM7CiB9CkBAIC01MDIsMjAgKzQ2NywyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgYXVkaW9fZGV2aWNlc190IGNvbW1EZXZpY2VUeXBlID0KKyAgICAgICAgZ2V0UHJlZmVycmVkRGV2aWNlVHlwZUZvckxlZ2FjeVN0cmF0ZWd5KGF2YWlsYWJsZU91dHB1dERldmljZXMsIFNUUkFURUdZX1BIT05FKTsKKwogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwotICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX2JsdWV0b290aF9vdXRfc2NvX2RldmljZShjb21tRGV2aWNlVHlwZSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKQEAgLTUyOCw0NiArNDk3LDY0IEBACiAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeURldmljZXM7CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGNvbW1EZXZpY2VUeXBlKSkgewogICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbW1EZXZpY2VUeXBlKSB7CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVDoKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQywKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVH0pOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoewotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBub3QgdXNlIHByaW1hcnkgb3V0cHV0IGNyaXRlcmlhIGZvciBIb3R3b3JkIGJ1dCByYXRoZXIgbGltaXQKLSAgICAgICAgICAgIC8vIHRvIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUgSFcgbW9kdWxlIGFzIHRoZSBidWlsZCBpbiBtaWMKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXZhaWxhYmxlUHJpbWFyeURldmljZXMuaXNFbXB0eSgpLCAiUHJpbWFyeSBkZXZpY2VzIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlEZXZpY2VzOworICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGNvbW1EZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2UgQkxVRVRPT1RIX0JMRSBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4gQlVJTFRJTl9NSUMsCisgICAgICAgIC8vIGJlY2F1c2Ugc29tZXRpbWVzIHVzZXIgd2FudCB0byBkbyB2b2ljZSBzZWFyY2ggYnkgYnQgcmVtb3RlCisgICAgICAgIC8vIGV2ZW4gaWYgQlVJTERJTl9NSUMgaXMgYXZhaWxhYmxlLgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgcHJpbWFyeSBvdXRwdXQgY3JpdGVyaWEgZm9yIEhvdHdvcmQgYnV0IHJhdGhlciBsaW1pdAorICAgICAgICAvLyB0byBkZXZpY2VzIGF0dGFjaGVkIHRvIHRoZSBzYW1lIEhXIG1vZHVsZSBhcyB0aGUgYnVpbGQgaW4gbWljCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYXZhaWxhYmxlUHJpbWFyeURldmljZXMuaXNFbXB0eSgpLCAiUHJpbWFyeSBkZXZpY2VzIG5vdCBmb3VuZCIpOworICAgICAgICBhdmFpbGFibGVEZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeURldmljZXM7CisgICAgICAgIGlmIChhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UoY29tbURldmljZVR5cGUpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXRGaXJzdEV4aXN0aW5nRGV2aWNlKHsKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULAotICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN9KTsKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxFX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKICAgICAgICAgLy8gRm9yIGEgZGV2aWNlIHdpdGhvdXQgYnVpbHQtaW4gbWljLCBhZGRpbmcgdXNiIGRldmljZQpAQCAtNTg0LDcgKzU3MSw4IEBACiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CiAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKLSAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQkxFLAorICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgogICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKQEAgLTYwOSw2ICs1OTcsNyBAQAogICAgICAgICBBTE9HRV9JRihkZXZpY2UgPT0gbnVsbHB0ciwKICAgICAgICAgICAgICAgICAgImdldERldmljZUZvcklucHV0U291cmNlKCkgbm8gZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIpOwogICAgIH0KKwogICAgIEFMT0dWX0lGKGRldmljZSAhPSBudWxscHRyLAogICAgICAgICAgICAgICJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsCiAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIGRldmljZS0+dHlwZSgpKTsKQEAgLTYyNiwzNCArNjE1LDcxIEBACiAgICAgfQogfQogCi1EZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QgewotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOwotCi0gICAgLy8gY2hlY2sgaWYgdGhpcyBzdHJhdGVneSBoYXMgYSBwcmVmZXJyZWQgZGV2aWNlIHRoYXQgaXMgYXZhaWxhYmxlLAotICAgIC8vIGlmIHllcywgZ2l2ZSBwcmlvcml0eSB0byBpdAotICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2U7Ci0gICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIHRoZXJlIGlzIGEgcHJlZmVycmVkIGRldmljZSwgaXMgaXQgYXZhaWxhYmxlPwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBwcmVmZXJyZWRBdmFpbGFibGVEZXZEZXNjciA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAotICAgICAgICAgICAgICAgIHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlLm1UeXBlLAotICAgICAgICAgICAgICAgIFN0cmluZzgocHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubUFkZHJlc3MuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwotICAgICAgICBpZiAocHJlZmVycmVkQXZhaWxhYmxlRGV2RGVzY3IgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR1ZWKCIlcyB1c2luZyBwcmVmIGRldmljZSAweCUwOHgvJXMgZm9yIHN0cmF0ZWd5ICV1IiwKLSAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubVR5cGUsCi0gICAgICAgICAgICAgICAgICAgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubUFkZHJlc3MuY19zdHIoKSwgc3RyYXRlZ3kpOwotICAgICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWRBdmFpbGFibGVEZXZEZXNjcik7Citwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tTGVnYWN5KGxlZ2FjeV9zdHJhdGVneSBsZWdhY3lTdHJhdGVneSkgY29uc3QgeworICAgIGZvciAoY29uc3QgYXV0byYgc3RyYXRlZ3lNYXAgOiBtTGVnYWN5U3RyYXRlZ3lNYXApIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5TWFwLnNlY29uZCA9PSBsZWdhY3lTdHJhdGVneSkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5TWFwLmZpcnN0OwogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7Cit9CiAKLSAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CithdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXRQcmVmZXJyZWREZXZpY2VUeXBlRm9yTGVnYWN5U3RyYXRlZ3koCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbGVnYWN5X3N0cmF0ZWd5IGxlZ2FjeVN0cmF0ZWd5KSBjb25zdCB7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUxlZ2FjeShsZWdhY3lTdHJhdGVneSk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBnZXRQcmVmZXJyZWRBdmFpbGFibGVEZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KAorICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgc3RyYXRlZ3kpOworICAgIGlmIChkZXZpY2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmV0dXJuIGRldmljZXNbMF0tPnR5cGUoKTsKKyAgICB9CisgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRQcmVmZXJyZWRBdmFpbGFibGVEZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZU91dHB1dERldmljZXMsIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QgeworICAgIERldmljZVZlY3RvciBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMgPSB7fTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlczsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KAorICAgICAgICAgICAgc3RyYXRlZ3ksIERFVklDRV9ST0xFX1BSRUZFUlJFRCwgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2VzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHRoZXJlIGlzIGEgcHJlZmVycmVkIGRldmljZSwgaXMgaXQgYXZhaWxhYmxlPworICAgICAgICBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMgPQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21EZXZpY2VUeXBlQWRkclZlYyhwcmVmZXJyZWRTdHJhdGVneURldmljZXMpOworICAgICAgICBpZiAocHJlZmVycmVkQXZhaWxhYmxlRGV2VmVjLnNpemUoKSA9PSBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HVlYoIiVzIHVzaW5nIHByZWYgZGV2aWNlICVzIGZvciBzdHJhdGVneSAldSIsCisgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYy50b1N0cmluZygpLmNfc3RyKCksIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJldHVybiBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHByZWZlcnJlZEF2YWlsYWJsZURldlZlYzsKK30KKworCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QgewogICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworCisgICAgLy8gVGFrZSBjb250ZXh0IGludG8gYWNjb3VudCB0byByZW1hcCBwcm9kdWN0IHN0cmF0ZWd5IGJlZm9yZQorICAgIC8vIGNoZWNraW5nIHByZWZlcnJlZCBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFuZCBhcHBseWluZyBkZWZhdWx0IHJvdXRpbmcgcnVsZXMKKyAgICBzdHJhdGVneSA9IHJlbWFwU3RyYXRlZ3lGcm9tQ29udGV4dChzdHJhdGVneSwgb3V0cHV0cyk7CisKICAgICBhdXRvIGxlZ2FjeVN0cmF0ZWd5ID0gbUxlZ2FjeVN0cmF0ZWd5TWFwLmZpbmQoc3RyYXRlZ3kpICE9IGVuZChtTGVnYWN5U3RyYXRlZ3lNYXApID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwLmF0KHN0cmF0ZWd5KSA6IFNUUkFURUdZX05PTkU7CisKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKworICAgIGZpbHRlck91dHB1dERldmljZXNGb3JTdHJhdGVneShsZWdhY3lTdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgb3V0cHV0cyk7CisKKyAgICAvLyBjaGVjayBpZiB0aGlzIHN0cmF0ZWd5IGhhcyBhIHByZWZlcnJlZCBkZXZpY2UgdGhhdCBpcyBhdmFpbGFibGUsCisgICAgLy8gaWYgeWVzLCBnaXZlIHByaW9yaXR5IHRvIGl0LgorICAgIERldmljZVZlY3RvciBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMgPQorICAgICAgICAgICAgZ2V0UHJlZmVycmVkQXZhaWxhYmxlRGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBzdHJhdGVneSk7CisgICAgaWYgKCFwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwcmVmZXJyZWRBdmFpbGFibGVEZXZWZWM7CisgICAgfQorCiAgICAgcmV0dXJuIGdldERldmljZXNGb3JTdHJhdGVneUludChsZWdhY3lTdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cyk7CiB9CiAKIERldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKQEAgLTY4OSw2ICs3MTUsNyBAQAogfQogCiBzcDxEZXZpY2VEZXNjcmlwdG9yPiBFbmdpbmU6OmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKm1peCkgY29uc3QKIHsKICAgICBjb25zdCBhdXRvICZwb2xpY3lNaXhlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbigpOwpAQCAtNzA4LDcgKzczNSwxMCBAQAogICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgIH0KIAotICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgZGV2aWNlID0gcG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgpOwogICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKaW5kZXggYmI5ZTJkZi4uNTk1ZTI4OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTYyLDggKzYyLDEwIEBACiAgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCi0gICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZTsKIAogICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKIApAQCAtNzQsMTUgKzc2LDI3IEBACiAKICAgICBzdGF0dXNfdCBzZXREZWZhdWx0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgdm9pZCBmaWx0ZXJPdXRwdXREZXZpY2VzRm9yU3RyYXRlZ3kobGVnYWN5X3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCByZW1hcFN0cmF0ZWd5RnJvbUNvbnRleHQocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cykgY29uc3Q7CisKICAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdDsKIAogICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3Q7CiAKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUxlZ2FjeShsZWdhY3lfc3RyYXRlZ3kgbGVnYWN5U3RyYXRlZ3kpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCBnZXRQcmVmZXJyZWREZXZpY2VUeXBlRm9yTGVnYWN5U3RyYXRlZ3koCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbGVnYWN5X3N0cmF0ZWd5IGxlZ2FjeVN0cmF0ZWd5KSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0UHJlZmVycmVkQXZhaWxhYmxlRGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCiAgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogCiAgICAgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBsZWdhY3lfc3RyYXRlZ3k+IG1MZWdhY3lTdHJhdGVneU1hcDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMTVkNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImF1ZGlvcG9saWN5X2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAiYXVkaW9wb2xpY3lfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlieG1sMiIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANy4wLWVudW1zIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIGRhdGE6IFsiOmF1ZGlvcG9saWN5ZnV6emVyX2NvbmZpZ3VyYXRpb25fZmlsZXMiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDcyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNjMgQEAKKyMgRnV6emVyIGZvciBsaWJhdWRpb3BvbGljeQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGliYXVkaW9wb2xpY3kgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlCit1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZXJ2aWNlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0F1ZGlvUG9saWN5IEFQSXMgY29udGFpbiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBBdWRpb0Zvcm1hdHMKKzIuIEF1ZGlvQ2hhbm5lbE1hc2tzCiszLiBBdWRpb091dHB1dEZsYWdzCis0LiBBdWRpb0RldmljZXMKKzUuIE1peFR5cGVzCis2LiBNaXhSb3V0ZUZsYWdzCis3LiBTYW1wbGVSYXRlcworOC4gQXVkaW9Vc2FnZXMKKzkuIEF1ZGlvQ29udGVudFR5cGVzCisxMC4gQXVkaW9Tb3VyY2VzCisxMS4gQXVkaW9GbGFnTWFza3MKKzEyLiBBdWRpb1BvbGljeURldmljZVN0YXRlcworCit8IFBhcmFtZXRlcnwgVmFsaWQgSW5wdXQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYEF1ZGlvRm9ybWF0YCB8IDc3IHZhbHVlcyBvZiB0eXBlIGBhdWRpb19mb3JtYXRfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYEF1ZGlvQ2hhbm5lbE1hc2tgIHwgODMgdmFsdWVzIG9mIHR5cGUgYGF1ZGlvX2NoYW5uZWxfbWFza190YCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgQXVkaW9PdXRwdXRGbGFnYCB8IDE2IHZhbHVlcyBvZiB0eXBlIGBhdWRpb19vdXRwdXRfZmxhZ3NfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYEF1ZGlvRGV2aWNlYCAgIHwgYEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUxgLCBgQVVESU9fREVWSUNFX09VVF9TVFVCYCwgYEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMYCwgYEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTGAsIGBBVURJT19ERVZJQ0VfSU5fU1RVQmAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYE1peFR5cGVgICAgfCBgTUlYX1RZUEVfUExBWUVSU2AsIGBNSVhfVFlQRV9SRUNPUkRFUlNgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBNaXhSb3V0ZUZsYWdgICAgfCBgTUlYX1JPVVRFX0ZMQUdfUkVOREVSYCwgYE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS2AsIGBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUmAsIGBNSVhfUk9VVEVfRkxBR19BTExgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBTYW1wbGVSYXRlYCB8IGAwYCB0byBgVUlOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBBdWRpb1VzYWdlYCB8IGBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUYCwgYEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlRgLCBgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRGAsIGBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlRgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBBdWRpb0NvbnRlbnRUeXBlYCB8IGBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTmAsIGBBVURJT19DT05URU5UX1RZUEVfU1BFRUNIYCwgYEFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQ2AsIGBBVURJT19DT05URU5UX1RZUEVfTU9WSUVgLCBgQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTmAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYEF1ZGlvU291cmNlYCB8IDE0IHZhbHVlcyBvZiB0eXBlIGBhdWRpb19zb3VyY2VfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYEF1ZGlvRmxhZ01hc2tgIHwgMTUgdmFsdWVzIG9mIHR5cGUgYGF1ZGlvX2ZsYWdzX21hc2tfdGAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYEF1ZGlvUG9saWN5RGV2aWNlU3RhdGVzYCB8IGBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFYCwgYEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFYCwgYEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQ05UYCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMgQnVpbGQKKworVGhpcyBkZXNjcmliZXMgc3RlcHMgdG8gYnVpbGQgYXVkaW9wb2xpY3lfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhdWRpb3BvbGljeV9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2F1ZGlvcG9saWN5X2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL2F1ZGlvcG9saWN5X2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMGNkOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9hdWRpb3BvbGljeV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsOTg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaWJ4bWwveGluY2x1ZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oPgorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX1Y3XzAtZW51bXMuaD4KKyNpbmNsdWRlIDxmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8dGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oPgorI2luY2x1ZGUgPHRlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oPgorI2luY2x1ZGUgPHRlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx4c2RjL1hzZGNTdXBwb3J0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgeHNkIHsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmF1ZGlvOjpwb2xpY3k6OmNvbmZpZ3VyYXRpb246OlY3XzA7Cit9CisKK3VzaW5nIGNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGU7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4ga0F1ZGlvRm9ybWF0cyA9IFtdIHsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byBlbnVtVmFsIDogeHNkY19lbnVtX3JhbmdlPHhzZDo6QXVkaW9Gb3JtYXQ+e30pIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXRIYWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF1ZGlvRm9ybWF0ID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGlmIChhdWRpb19mb3JtYXRfZnJvbV9zdHJpbmcoYXVkaW9Gb3JtYXQuY19zdHIoKSwgJmF1ZGlvRm9ybWF0SGFsKSkgeworICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb0Zvcm1hdEhhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30oKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiBrQXVkaW9DaGFubmVsT3V0TWFza3MgPSBbXSB7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s+e30pIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgYXVkaW9DaGFubmVsTWFza0hhbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXVkaW9DaGFubmVsTWFzayA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBpZiAoZW51bVZhbCAhPSB4c2Q6OkF1ZGlvQ2hhbm5lbE1hc2s6OkFVRElPX0NIQU5ORUxfTk9ORSAmJgorICAgICAgICAgICAgYXVkaW9DaGFubmVsTWFzay5maW5kKCJfSU5fIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3N0cmluZyhhdWRpb0NoYW5uZWxNYXNrLmNfc3RyKCksICZhdWRpb0NoYW5uZWxNYXNrSGFsKSkgeworICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb0NoYW5uZWxNYXNrSGFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfSgpOworCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IGtBdWRpb0NoYW5uZWxJbk1hc2tzID0gW10geworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NoYW5uZWxNYXNrPnt9KSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGF1ZGlvQ2hhbm5lbE1hc2tIYWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF1ZGlvQ2hhbm5lbE1hc2sgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgaWYgKGVudW1WYWwgIT0geHNkOjpBdWRpb0NoYW5uZWxNYXNrOjpBVURJT19DSEFOTkVMX05PTkUgJiYKKyAgICAgICAgICAgIGF1ZGlvQ2hhbm5lbE1hc2suZmluZCgiX09VVF8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fc3RyaW5nKGF1ZGlvQ2hhbm5lbE1hc2suY19zdHIoKSwgJmF1ZGlvQ2hhbm5lbE1hc2tIYWwpKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGF1ZGlvQ2hhbm5lbE1hc2tIYWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9KCk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19vdXRwdXRfZmxhZ3NfdD4ga0F1ZGlvT3V0cHV0RmxhZ3MgPSBbXSB7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvSW5PdXRGbGFnPnt9KSB7CisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGF1ZGlvT3V0cHV0RmxhZ0hhbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXVkaW9PdXRwdXRGbGFnID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGlmIChhdWRpb091dHB1dEZsYWcuZmluZCgiX09VVFBVVF8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdfZnJvbV9zdHJpbmcoYXVkaW9PdXRwdXRGbGFnLmNfc3RyKCksICZhdWRpb091dHB1dEZsYWdIYWwpKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGF1ZGlvT3V0cHV0RmxhZ0hhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30oKTsKKworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4ga0F1ZGlvRGV2aWNlcyA9IFtdIHsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvRGV2aWNlPnt9KSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdWRpb0RldmljZUhhbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXVkaW9EZXZpY2UgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9mcm9tX3N0cmluZyhhdWRpb0RldmljZS5jX3N0cigpLCAmYXVkaW9EZXZpY2VIYWwpKSB7CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGF1ZGlvRGV2aWNlSGFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfSgpOworCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4ga0F1ZGlvVXNhZ2VzID0gW10geworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvVXNhZ2U+e30pIHsKKyAgICAgICAgYXVkaW9fdXNhZ2VfdCBhdWRpb1VzYWdlSGFsOworICAgICAgICBzdGQ6OnN0cmluZyBhdWRpb1VzYWdlID0gdG9TdHJpbmcoZW51bVZhbCk7CisgICAgICAgIGlmIChhdWRpb191c2FnZV9mcm9tX3N0cmluZyhhdWRpb1VzYWdlLmNfc3RyKCksICZhdWRpb1VzYWdlSGFsKSkgeworICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb1VzYWdlSGFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfSgpOworCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fc291cmNlX3Q+IGtBdWRpb1NvdXJjZXMgPSBbXSB7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fc291cmNlX3Q+IHJlc3VsdDsKKyAgICBmb3IgKGNvbnN0IGF1dG8gZW51bVZhbCA6IHhzZGNfZW51bV9yYW5nZTx4c2Q6OkF1ZGlvU291cmNlPnt9KSB7CisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlSGFsOworICAgICAgICBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZSA9IHRvU3RyaW5nKGVudW1WYWwpOworICAgICAgICBpZiAoYXVkaW9fc291cmNlX2Zyb21fc3RyaW5nKGF1ZGlvU291cmNlLmNfc3RyKCksICZhdWRpb1NvdXJjZUhhbCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soYXVkaW9Tb3VyY2VIYWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9KCk7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4ga0F1ZGlvQ29udGVudFR5cGVzID0gW10geworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2NvbnRlbnRfdHlwZV90PiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvIGVudW1WYWwgOiB4c2RjX2VudW1fcmFuZ2U8eHNkOjpBdWRpb0NvbnRlbnRUeXBlPnt9KSB7CisgICAgICAgIGF1ZGlvX2NvbnRlbnRfdHlwZV90IGF1ZGlvQ29udGVudFR5cGVIYWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF1ZGlvQ29udGVudFR5cGUgPSB0b1N0cmluZyhlbnVtVmFsKTsKKyAgICAgICAgaWYgKGF1ZGlvX2NvbnRlbnRfdHlwZV9mcm9tX3N0cmluZyhhdWRpb0NvbnRlbnRUeXBlLmNfc3RyKCksICZhdWRpb0NvbnRlbnRUeXBlSGFsKSkgeworICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhhdWRpb0NvbnRlbnRUeXBlSGFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfSgpOworCitzdGQ6OnZlY3RvcjxpbnQ+IGtNaXhUeXBlcyA9IHtNSVhfVFlQRV9QTEFZRVJTLCBNSVhfVFlQRV9SRUNPUkRFUlN9OworCitzdGQ6OnZlY3RvcjxpbnQ+IGtNaXhSb3V0ZUZsYWdzID0ge01JWF9ST1VURV9GTEFHX1JFTkRFUiwgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUiwgTUlYX1JPVVRFX0ZMQUdfQUxMfTsKKworc3RkOjp2ZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PiBrQXVkaW9GbGFnTWFza3MgPSB7CisgICAgQVVESU9fRkxBR19OT05FLCAgICAgICAgICAgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VELAorICAgIEFVRElPX0ZMQUdfU0VDVVJFLCAgICAgICAgIEFVRElPX0ZMQUdfU0NPLAorICAgIEFVRElPX0ZMQUdfQkVBQ09OLCAgICAgICAgIEFVRElPX0ZMQUdfSFdfQVZfU1lOQywKKyAgICBBVURJT19GTEFHX0hXX0hPVFdPUkQsICAgICBBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZLAorICAgIEFVRElPX0ZMQUdfQllQQVNTX01VVEUsICAgIEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1ksCisgICAgQVVESU9fRkxBR19ERUVQX0JVRkZFUiwgICAgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OLAorICAgIEFVRElPX0ZMQUdfTVVURV9IQVBUSUMsICAgIEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkUsCisgICAgQVVESU9fRkxBR19DQVBUVVJFX1BSSVZBVEV9OworCitzdGQ6OnZlY3RvcjxhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Q+IGtBdWRpb1BvbGljeURldmljZVN0YXRlcyA9IHsKKyAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQ05ULAorfTsKKworc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGtTYW1wbGluZ1JhdGVzID0gezgwMDAsIDE2MDAwLCA0NDEwMCwgNDgwMDAsIDg4MjAwLCA5NjAwMH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBnZXRWYWx1ZUZyb21WZWN0b3IoRnV6emVkRGF0YVByb3ZpZGVyICpmZHAsIHN0ZDo6dmVjdG9yPFQ+IGFycikgeworICAgIGlmIChmZHAtPkNvbnN1bWVCb29sKCkpIHsKKyAgICAgICAgcmV0dXJuIGFycltmZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oMCwgYXJyLnNpemUoKSAtIDEpXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKFQpZmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgfQorfQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcihGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCk7CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKCk7CisgICAgdmlydHVhbCB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpOworICAgIGJvb2wgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0ciwgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7fSk7CisgICAgYm9vbCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBhdWRpb191bmlxdWVfaWRfdCByaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBudWxscHRyKTsKKyAgICBib29sIGZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCk7CisgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGcm9tUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCk7CisgICAgYXVkaW9fcGF0Y2ggY3JlYXRlRnV6emVkUGF0Y2goKTsKKyAgICB2b2lkIGZ1enpQYXRjaENyZWF0aW9uKCk7CisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoKTsKKworICAgcHJvdGVjdGVkOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50PiBtQ2xpZW50e25ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50fTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9Qb2xpY3lUZXN0TWFuYWdlcj4gbU1hbmFnZXJ7bmV3IEF1ZGlvUG9saWN5VGVzdE1hbmFnZXIobUNsaWVudC5nZXQoKSl9OworICAgIEZ1enplZERhdGFQcm92aWRlciAqbUZkcDsKK307CisKK0F1ZGlvUG9saWN5TWFuYWdlckZ1enplcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyKEZ1enplZERhdGFQcm92aWRlciAqZmRwKQorICAgICAgICA6IG1GZHAoZmRwKSB7fQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcjo6aW5pdGlhbGl6ZSgpIHsKKyAgICBpZiAobUZkcC0+cmVtYWluaW5nX2J5dGVzKCkgPCAxKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gaW5pdCBjb2RlCisgICAgU2V0VXBNYW5hZ2VyQ29uZmlnKCk7CisKKyAgICBpZiAobU1hbmFnZXItPmluaXRpYWxpemUoKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtTWFuYWdlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXI6OlNldFVwTWFuYWdlckNvbmZpZygpIHsgbU1hbmFnZXItPmdldENvbmZpZygpLnNldERlZmF1bHQoKTsgfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcjo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgIGludCBzYW1wbGVSYXRlLCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyKSB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgbG9jYWxPdXRwdXQ7CisgICAgaWYgKCFvdXRwdXQpIG91dHB1dCA9ICZsb2NhbE91dHB1dDsKKyAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGxvY2FsUG9ydElkOworICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6Om91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKKworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gMDsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgaWYgKG1NYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCBvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAmY29uZmlnLCAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30sICZvdXRwdXRUeXBlKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FIHx8ICpwb3J0SWQgPT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcjo6Z2V0SW5wdXRGb3JBdHRyKAorICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBpbnQgc2FtcGxlUmF0ZSwKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLCBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGxvY2FsUG9ydElkOworICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CisKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgIGF0dHJpYnV0aW9uU291cmNlLnVpZCA9IDA7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIGlmIChtTWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKCZhdHRyLCAmaW5wdXQsIHJpaWQsIEFVRElPX1NFU1NJT05fTk9ORSwgYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAmY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlucHV0VHlwZSwgcG9ydElkKSAhPSBPSykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUgfHwgaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXI6OmZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCkgeworICAgIHVpbnQzMl90IG51bVBvcnRzID0gMDsKKyAgICB1aW50MzJfdCBnZW5lcmF0aW9uMTsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBudWxscHRyLCAmZ2VuZXJhdGlvbjEpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IGdlbmVyYXRpb24yOworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IHBvcnRzW251bVBvcnRzXTsKKyAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24yKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBvcnQgOiBwb3J0cykgeworICAgICAgICBpZiAocG9ydC5yb2xlID09IHJvbGUgJiYgcG9ydC5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlVHlwZSAmJgorICAgICAgICAgICAgKHN0cm5jbXAocG9ydC5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3MuY19zdHIoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0KKyAgICAgICAgICAgICAwKSkgeworICAgICAgICAgICAgaWYgKGZvdW5kUG9ydCkgKmZvdW5kUG9ydCA9IHBvcnQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyOjpnZXREZXZpY2VJZEZyb21QYXRjaCgKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoKSB7CisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyAhPSAwICYmIHBhdGNoLT5udW1fc2lua3MgIT0gMCkgeworICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0Y2gtPnNpbmtzWzBdLmlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHBhdGNoLT5zb3VyY2VzWzBdLmlkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworfQorCithdWRpb19wYXRjaCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXI6OmNyZWF0ZUZ1enplZFBhdGNoKCkgeworICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CisgICAgcGF0Y2guaWQgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlKDAsIEFVRElPX1BBVENIX1BPUlRTX01BWCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRjaC5udW1fc291cmNlczsgKytpKSB7CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZ3t9OworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBieXRlcyA9IG1GZHAtPkNvbnN1bWVCeXRlczx1aW50OF90PihzaXplb2YoY29uZmlnKSk7CisgICAgICAgIG1lbWNweShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oJmNvbmZpZyksICZieXRlc1swXSwgYnl0ZXMuc2l6ZSgpKTsKKyAgICAgICAgcGF0Y2guc291cmNlc1tpXSA9IGNvbmZpZzsKKyAgICB9CisgICAgcGF0Y2gubnVtX3NpbmtzID0gbUZkcC0+Q29uc3VtZUludGVncmFsSW5SYW5nZSgwLCBBVURJT19QQVRDSF9QT1JUU19NQVgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0Y2gubnVtX3NpbmtzOyArK2kpIHsKKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgY29uZmlne307CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ5dGVzID0gbUZkcC0+Q29uc3VtZUJ5dGVzPHVpbnQ4X3Q+KHNpemVvZihjb25maWcpKTsKKyAgICAgICAgbWVtY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigmY29uZmlnKSwgJmJ5dGVzWzBdLCBieXRlcy5zaXplKCkpOworICAgICAgICBwYXRjaC5zaW5rc1tpXSA9IGNvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHBhdGNoOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcjo6ZnV6elBhdGNoQ3JlYXRpb24oKSB7CisgICAgaWYgKG1GZHAtPnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICB1aWRfdCB1aWQgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWw8dWludDMyX3Q+KCk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgZnV6emVkIHBhdGNoCisgICAgICAgIGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBhdWRpb19wYXRjaCBwYXRjaCA9IGNyZWF0ZUZ1enplZFBhdGNoKCk7CisgICAgICAgIHVpZCA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MzJfdD4oKTsKKyAgICAgICAgaWYgKG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgdWlkKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSkgeworICAgICAgICBmdXp6UGF0Y2hDcmVhdGlvbigpOworICAgIH0KK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlKEZ1enplZERhdGFQcm92aWRlciAqZmRwKQorICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcihmZHApe307CisKKyAgIHByb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q29uZmlnRmlsZSgpOworICAgIHZvaWQgdHJhdmVyc2VBbmRGdXp6WE1MKHhtbERvY1B0ciBwRG9jLCB4bWxOb2RlUHRyIGN1cnIpOworICAgIHN0ZDo6c3RyaW5nIGZ1enpYTUwoc3RkOjpzdHJpbmcgeG1sUGF0aCk7CisKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nIHNFeGVjdXRhYmxlRGlyID0gYmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi8iOworICAgIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgc0RlZmF1bHRDb25maWcgPQorICAgICAgICAgICAgc0V4ZWN1dGFibGVEaXIgKyAiZGF0YS90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7CisgICAgc3RhdGljIGlubGluZSBjb25zdCBzdGQ6OnN0cmluZyBzRnV6emVkQ29uZmlnID0gc0V4ZWN1dGFibGVEaXIgKyAiZnV6emVkLnhtbCI7OworfTsKKworc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlOjpnZXRDb25maWdGaWxlKCkgeworICAgIHJldHVybiBmdXp6WE1MKHNEZWZhdWx0Q29uZmlnKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGU6OlNldFVwTWFuYWdlckNvbmZpZygpIHsKKyAgICBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShnZXRDb25maWdGaWxlKCkuY19zdHIoKSwgJm1NYW5hZ2VyLT5nZXRDb25maWcoKSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlOjp0cmF2ZXJzZUFuZEZ1enpYTUwoeG1sRG9jUHRyIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgY3VycikgeworICAgIGlmIChjdXJyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHhtbEF0dHIgKmF0dHJpYnV0ZSA9IGN1cnItPnByb3BlcnRpZXM7CisgICAgd2hpbGUgKGF0dHJpYnV0ZSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChhdHRyaWJ1dGUtPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhciAqPigiZm9ybWF0IikpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuZXdGb3JtYXQgPQorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcoZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PihtRmRwLCBrQXVkaW9Gb3JtYXRzKSk7CisgICAgICAgICAgICB4bWxTZXRQcm9wKGN1cnIsIGF0dHJpYnV0ZS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyICo+KG5ld0Zvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGF0dHJpYnV0ZS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyICo+KCJmbGFncyIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RmxhZyA9ICIiOworICAgICAgICAgICAgdWludDE2X3QgbnVtRmxhZ3MgPSBzdGQ6Om1heCgodWludDE2X3QpMSwgbUZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpKTsKKyAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBudW1GbGFnczsgKytpKSB7CisgICAgICAgICAgICAgICAgbmV3RmxhZyArPSBzdGQ6OnN0cmluZyhhdWRpb19vdXRwdXRfZmxhZ190b19zdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19vdXRwdXRfZmxhZ3NfdD4obUZkcCwga0F1ZGlvT3V0cHV0RmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gKG51bUZsYWdzIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3RmxhZyArPSBzdGQ6OnN0cmluZygifCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhtbFNldFByb3AoY3VyciwgYXR0cmlidXRlLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4obmV3RmxhZy5jX3N0cigpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoYXR0cmlidXRlLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4oInNhbXBsaW5nUmF0ZXMiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld1JhdGUgPSAiIjsKKyAgICAgICAgICAgIHVpbnQxNl90IG51bVJhdGVzID0gc3RkOjptYXgoKHVpbnQxNl90KTEsIG1GZHAtPkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgbnVtUmF0ZXM7ICsraSkgeworICAgICAgICAgICAgICAgIG5ld1JhdGUgKz0gc3RkOjp0b19zdHJpbmcoZ2V0VmFsdWVGcm9tVmVjdG9yPHVpbnQzMl90PihtRmRwLCBrU2FtcGxpbmdSYXRlcykpOworICAgICAgICAgICAgICAgIGlmIChpICE9IChudW1SYXRlcyAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1JhdGUgKz0gc3RkOjpzdHJpbmcoIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bWxTZXRQcm9wKGN1cnIsIGF0dHJpYnV0ZS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyICo+KG5ld1JhdGUuY19zdHIoKSkpOworICAgICAgICB9CisgICAgICAgIGlmICgheG1sU3RyY21wKGF0dHJpYnV0ZS0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyICo+KCJjaGFubmVsTWFza3MiKSkpIHsKKyAgICAgICAgICAgIGludCBpc091dE1hc2sgPSAtMTsKKyAgICAgICAgICAgIGNoYXIgKnZhbHVlID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIgKj4oeG1sTm9kZUxpc3RHZXRTdHJpbmcocERvYywgYXR0cmlidXRlLT5jaGlsZHJlbiwgMSkpOworICAgICAgICAgICAgaWYgKHN0ZDo6c3RyaW5nKHZhbHVlKS5maW5kKHN0ZDo6c3RyaW5nKCJfT1VUXyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIE9VVCBtYXNrCisgICAgICAgICAgICAgICAgaXNPdXRNYXNrID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RkOjpzdHJpbmcodmFsdWUpLmZpbmQoc3RkOjpzdHJpbmcoIl9JTl8iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAvLyBJTiBtYXNrCisgICAgICAgICAgICAgICAgaXNPdXRNYXNrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc091dE1hc2sgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuZXdNYXNrID0gIiI7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbnVtTWFza3MgPSBzdGQ6Om1heCgodWludDE2X3QpMSwgbUZkcC0+Q29uc3VtZUludGVncmFsPHVpbnQxNl90PigpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgbnVtTWFza3M7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRNYXNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXNrICs9IHN0ZDo6c3RyaW5nKGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfdG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbE91dE1hc2tzKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWFzayArPSBzdGQ6OnN0cmluZyhhdWRpb19jaGFubmVsX2luX21hc2tfdG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbEluTWFza3MpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gKG51bU1hc2tzIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hc2sgKz0gc3RkOjpzdHJpbmcoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWxTZXRQcm9wKGN1cnIsIGF0dHJpYnV0ZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhciAqPihuZXdNYXNrLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhtbEZyZWUodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS0+bmV4dDsKKyAgICB9CisKKyAgICBjdXJyID0gY3Vyci0+eG1sQ2hpbGRyZW5Ob2RlOworICAgIHdoaWxlIChjdXJyICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhdmVyc2VBbmRGdXp6WE1MKHBEb2MsIGN1cnIpOworICAgICAgICBjdXJyID0gY3Vyci0+bmV4dDsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZTo6ZnV6elhNTChzdGQ6OnN0cmluZyB4bWxQYXRoKSB7CisgICAgc3RkOjpzdHJpbmcgb3V0UGF0aCA9IHNGdXp6ZWRDb25maWc7CisKKyAgICAvLyBMb2FkIGluIHRoZSB4bWwgZmlsZSBmcm9tIGRpc2sKKyAgICB4bWxEb2NQdHIgcERvYyA9IHhtbFBhcnNlRmlsZSh4bWxQYXRoLmNfc3RyKCkpOworICAgIHhtbE5vZGVQdHIgcm9vdCA9IHhtbERvY0dldFJvb3RFbGVtZW50KHBEb2MpOworCisgICAgdHJhdmVyc2VBbmRGdXp6WE1MKHBEb2MsIHJvb3QpOworCisgICAgLy8gU2F2ZSB0aGUgZG9jdW1lbnQgYmFjayBvdXQgdG8gZGlzay4KKyAgICB4bWxTYXZlRmlsZUVuYyhvdXRQYXRoLmNfc3RyKCksIHBEb2MsICJVVEYtOCIpOworICAgIHhtbEZyZWVEb2MocERvYyk7CisKKyAgICByZXR1cm4gb3V0UGF0aDsKK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyTXNkIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZSB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyTXNkKEZ1enplZERhdGFQcm92aWRlciAqZmRwKQorICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZShmZHApIHt9CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nIHNNc2RDb25maWcgPQorICAgICAgICAgICAgc0V4ZWN1dGFibGVEaXIgKyAiZGF0YS90ZXN0X2F1ZGlvX3BvbGljeV9tc2RfY29uZmlndXJhdGlvbi54bWwiOworfTsKKworc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyTXNkOjpnZXRDb25maWdGaWxlKCkgeyByZXR1cm4gZnV6elhNTChzTXNkQ29uZmlnKTsgfQorCit1c2luZyBQb2xpY3lNaXhUdXBsZSA9IHN0ZDo6dHVwbGU8YXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QsIHVpbnQzMl90PjsKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeSA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGUgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3koRnV6emVkRGF0YVByb3ZpZGVyICpmZHApCisgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlKGZkcCl7fTsKKyAgICB+QXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygpIG92ZXJyaWRlOworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgYWRkUG9saWN5TWl4KGludCBtaXhUeXBlLCBpbnQgbWl4RmxhZywgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1peEFkZHJlc3MsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICZhdWRpb0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+ICZydWxlcyk7CisgICAgdm9pZCBjbGVhclBvbGljeU1peCgpOworICAgIHZvaWQgcmVnaXN0ZXJQb2xpY3lNaXhlcygpOworICAgIHZvaWQgdW5yZWdpc3RlclBvbGljeU1peGVzKCk7CisKKyAgICBWZWN0b3I8QXVkaW9NaXg+IG1BdWRpb01peGVzOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1NaXhBZGRyZXNzID0gInJlbW90ZV9zdWJtaXhfbWVkaWEiOworfTsKKworQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeTo6fkF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3koKSB7CisgICAgY2xlYXJQb2xpY3lNaXgoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeTo6YWRkUG9saWN5TWl4KAorICAgIGludCBtaXhUeXBlLCBpbnQgbWl4RmxhZywgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsIHN0ZDo6c3RyaW5nIG1peEFkZHJlc3MsCisgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgJmF1ZGlvQ29uZmlnLCBjb25zdCBzdGQ6OnZlY3RvcjxQb2xpY3lNaXhUdXBsZT4gJnJ1bGVzKSB7CisgICAgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG15TWl4TWF0Y2hDcml0ZXJpYTsKKworICAgIGZvciAoY29uc3QgYXV0byAmcnVsZSA6IHJ1bGVzKSB7CisgICAgICAgIG15TWl4TWF0Y2hDcml0ZXJpYS5hZGQoCisgICAgICAgICAgICBBdWRpb01peE1hdGNoQ3JpdGVyaW9uKHN0ZDo6Z2V0PDA+KHJ1bGUpLCBzdGQ6OmdldDwxPihydWxlKSwgc3RkOjpnZXQ8Mj4ocnVsZSkpKTsKKyAgICB9CisKKyAgICBBdWRpb01peCBteUF1ZGlvTWl4KG15TWl4TWF0Y2hDcml0ZXJpYSwgbWl4VHlwZSwgYXVkaW9Db25maWcsIG1peEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG1peEFkZHJlc3MuY19zdHIoKSksIDApOworICAgIG15QXVkaW9NaXgubURldmljZVR5cGUgPSBkZXZpY2VUeXBlOworICAgIC8vIENsZWFyIG1BdWRpb01peCBiZWZvcmUgYWRkIG5ldyBvbmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGFkZCBhbHJlYWR5IGV4aXN0aW5nIG1peGVzLgorICAgIG1BdWRpb01peGVzLmNsZWFyKCk7CisgICAgbUF1ZGlvTWl4ZXMuYWRkKG15QXVkaW9NaXgpOworCisgICAgLy8gQXMgdGhlIHBvbGljeSBtaXhlcyByZWdpc3RyYXRpb24gbWF5IGZhaWwgYXQgc29tZSBjYXNlLAorICAgIC8vIGNhbGxlciBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZCBzdGF0dXMuCisgICAgc3RhdHVzX3QgcmV0ID0gbU1hbmFnZXItPnJlZ2lzdGVyUG9saWN5TWl4ZXMobUF1ZGlvTWl4ZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeTo6Y2xlYXJQb2xpY3lNaXgoKSB7CisgICAgaWYgKG1NYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU1hbmFnZXItPnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhtQXVkaW9NaXhlcyk7CisgICAgfQorICAgIG1BdWRpb01peGVzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeTo6cmVnaXN0ZXJQb2xpY3lNaXhlcygpIHsKKyAgICBjb25zdCB1aW50MzJfdCBudW1Qb2xpY2llcyA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDEsIE1BWF9NSVhFU19QRVJfUE9MSUNZKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUG9saWNpZXM7ICsraSkgeworICAgICAgICBhdWRpb19jb25maWdfdCBhdWRpb0NvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgYXVkaW9Db25maWcuY2hhbm5lbF9tYXNrID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PigKKyAgICAgICAgICAgIG1GZHAsIG1GZHAtPkNvbnN1bWVCb29sKCkgPyBrQXVkaW9DaGFubmVsSW5NYXNrcyA6IGtBdWRpb0NoYW5uZWxPdXRNYXNrcyk7CisgICAgICAgIGF1ZGlvQ29uZmlnLmZvcm1hdCA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19mb3JtYXRfdD4obUZkcCwga0F1ZGlvRm9ybWF0cyk7CisgICAgICAgIGF1ZGlvQ29uZmlnLnNhbXBsZV9yYXRlID0gZ2V0VmFsdWVGcm9tVmVjdG9yPHVpbnQzMl90PihtRmRwLCBrU2FtcGxpbmdSYXRlcyk7CisgICAgICAgIGFkZFBvbGljeU1peChnZXRWYWx1ZUZyb21WZWN0b3I8aW50PihtRmRwLCBrTWl4VHlwZXMpLAorICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPGludD4obUZkcCwga01peFJvdXRlRmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2RldmljZXNfdD4obUZkcCwga0F1ZGlvRGV2aWNlcyksICIiLCBhdWRpb0NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBvbGljeU1peFR1cGxlPigpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeTo6dW5yZWdpc3RlclBvbGljeU1peGVzKCkgeworICAgIG1NYW5hZ2VyLT51bnJlZ2lzdGVyUG9saWN5TWl4ZXMobUF1ZGlvTWl4ZXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3k6OnByb2Nlc3MoKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSkgeworICAgICAgICByZWdpc3RlclBvbGljeU1peGVzKCk7CisgICAgICAgIGZ1enpQYXRjaENyZWF0aW9uKCk7CisgICAgICAgIHVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOworICAgIH0KK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBOb1JlbW90ZVN1Ym1peE1vZHVsZQorICAgIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3kgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTm9SZW1vdGVTdWJtaXhNb2R1bGUoRnV6emVkRGF0YVByb3ZpZGVyICpmZHApCisgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeShmZHApe307CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0ZDo6c3RyaW5nIHNQcmltYXJ5T25seUNvbmZpZyA9CisgICAgICAgICAgICBzRXhlY3V0YWJsZURpciArICJkYXRhL3Rlc3RfYXVkaW9fcG9saWN5X3ByaW1hcnlfb25seV9jb25maWd1cmF0aW9uLnhtbCI7Cit9OworCitzdGQ6OnN0cmluZyBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE5vUmVtb3RlU3VibWl4TW9kdWxlOjpnZXRDb25maWdGaWxlKCkgeworICAgIHJldHVybiBmdXp6WE1MKHNQcmltYXJ5T25seUNvbmZpZyk7Cit9CisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmcgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeSB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBQbGF5YmFja1JlUm91dGluZyhGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCk7CisgICAgfkF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmcoKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoKSBvdmVycmlkZTsKKworICAgcHJvdGVjdGVkOgorICAgIGJvb2wgaW5pdGlhbGl6ZSgpIG92ZXJyaWRlOworICAgIHZvaWQgcGxheUJhY2tSZVJvdXRpbmcoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXI+IG1UcmFja2VyOworCisgICAgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+IG1Vc2FnZVJ1bGVzID0geworICAgICAgICB7QVVESU9fVVNBR0VfTUVESUEsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRX0sCisgICAgICAgIHtBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFfX07CisKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBtSW5qZWN0aW9uUG9ydDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2NvbmZpZ190IG1BdWRpb0NvbmZpZzsKK307CisKK0F1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmc6OkF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmcoCisgICAgICAgIEZ1enplZERhdGFQcm92aWRlciAqZmRwKQorICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3koZmRwKSB7CisgICAgY29uc3QgdWludDMyX3QgbnVtUnVsZXMgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCAxMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SdWxlczsgKytpKSB7CisgICAgICAgIFBvbGljeU1peFR1cGxlIHJ1bGUgPSB7Z2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX3VzYWdlX3Q+KG1GZHAsIGtBdWRpb1VzYWdlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX3NvdXJjZV90PihtRmRwLCBrQXVkaW9Tb3VyY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRX07CisgICAgICAgIG1Vc2FnZVJ1bGVzLnB1c2hfYmFjayhydWxlKTsKKyAgICB9Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmc6On5BdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUFBsYXliYWNrUmVSb3V0aW5nKCkgeworICAgIG1NYW5hZ2VyLT5zdG9wSW5wdXQobVBvcnRJZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBQbGF5YmFja1JlUm91dGluZzo6aW5pdGlhbGl6ZSgpIHsKKyAgICBpZiAoIUF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3k6OmluaXRpYWxpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1UcmFja2VyLnJlc2V0KG5ldyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKSk7CisKKyAgICBtQXVkaW9Db25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbUF1ZGlvQ29uZmlnLmNoYW5uZWxfbWFzayA9CisgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbE91dE1hc2tzKTsKKyAgICBtQXVkaW9Db25maWcuZm9ybWF0ID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PihtRmRwLCBrQXVkaW9Gb3JtYXRzKTsKKyAgICBtQXVkaW9Db25maWcuc2FtcGxlX3JhdGUgPSBnZXRWYWx1ZUZyb21WZWN0b3I8dWludDMyX3Q+KG1GZHAsIGtTYW1wbGluZ1JhdGVzKTsKKyAgICBzdGF0dXNfdCByZXQgPSBhZGRQb2xpY3lNaXgoZ2V0VmFsdWVGcm9tVmVjdG9yPGludD4obUZkcCwga01peFR5cGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPGludD4obUZkcCwga01peFJvdXRlRmxhZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZGV2aWNlc190PihtRmRwLCBrQXVkaW9EZXZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1peEFkZHJlc3MsIG1BdWRpb0NvbmZpZywgbVVzYWdlUnVsZXMpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IGV4dHJhY3Rpb25Qb3J0OworICAgIGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpLAorICAgICAgICAgICAgICAgICAgIG1NaXhBZGRyZXNzLCAmZXh0cmFjdGlvblBvcnQpOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fc291cmNlX3Q+KG1GZHAsIGtBdWRpb1NvdXJjZXMpOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0ge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRkxBR19OT05FLCAiIn07CisgICAgc3RkOjpzdHJpbmcgdGFncyA9ICJhZGRyPSIgKyBtTWl4QWRkcmVzczsKKyAgICBzdHJuY3B5KGF0dHIudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICBnZXRJbnB1dEZvckF0dHIoYXR0ciwgbVRyYWNrZXItPmdldFJpaWQoKSwgJnNlbGVjdGVkRGV2aWNlSWQsIG1BdWRpb0NvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb0NvbmZpZy5jaGFubmVsX21hc2ssIG1BdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZSwgQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAmbVBvcnRJZCk7CisKKyAgICByZXQgPSBtTWFuYWdlci0+c3RhcnRJbnB1dChtUG9ydElkKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFmaW5kRGV2aWNlUG9ydChBVURJT19QT1JUX1JPTEVfU0lOSywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpLCBtTWl4QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtSW5qZWN0aW9uUG9ydCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmc6OnBsYXlCYWNrUmVSb3V0aW5nKCkgeworICAgIGNvbnN0IHVpbnQzMl90IG51bVRlc3RDYXNlcyA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDEsIDEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRlc3RDYXNlczsgKytpKSB7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICAgICAgICBhdHRyLmNvbnRlbnRfdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4obUZkcCwga0F1ZGlvQ29udGVudFR5cGVzKTsKKyAgICAgICAgYXR0ci51c2FnZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb191c2FnZV90PihtRmRwLCBrQXVkaW9Vc2FnZXMpOworICAgICAgICBhdHRyLnNvdXJjZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19zb3VyY2VfdD4obUZkcCwga0F1ZGlvU291cmNlcyk7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PihtRmRwLCBrQXVkaW9GbGFnTWFza3MpOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzKG1GZHAtPkNvbnN1bWVCb29sKCkgPyAiIiA6ICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEiKTsKKyAgICAgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwbGF5YmFja1JvdXRlZFBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnBsYXliYWNrUm91dGVkUG9ydElkLCBtQXVkaW9Db25maWcuZm9ybWF0LCBtQXVkaW9Db25maWcuY2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZSwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgbnVsbHB0ciAvKm91dHB1dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLypwb3J0SWQqLywgYXR0cik7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmc6OnByb2Nlc3MoKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSkgeworICAgICAgICBwbGF5QmFja1JlUm91dGluZygpOworICAgICAgICByZWdpc3RlclBvbGljeU1peGVzKCk7CisgICAgICAgIGZ1enpQYXRjaENyZWF0aW9uKCk7CisgICAgICAgIHVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOworICAgIH0KK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBNaXhSZWNvcmRJbmplY3Rpb24gOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeSB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBNaXhSZWNvcmRJbmplY3Rpb24oRnV6emVkRGF0YVByb3ZpZGVyICpmZHApOworICAgIH5BdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbigpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygpIG92ZXJyaWRlOworCisgICBwcm90ZWN0ZWQ6CisgICAgYm9vbCBpbml0aWFsaXplKCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZWNvcmRpbmdJbmplY3Rpb24oKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXI+IG1UcmFja2VyOworCisgICAgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+IG1Tb3VyY2VSdWxlcyA9IHsKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUfSwKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9NSUMsIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUfSwKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgICAgICAgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVR9fTsKKworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IG1FeHRyYWN0aW9uUG9ydDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2NvbmZpZ190IG1BdWRpb0NvbmZpZzsKK307CisKK0F1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTWl4UmVjb3JkSW5qZWN0aW9uOjpBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbigKKyAgICAgICAgRnV6emVkRGF0YVByb3ZpZGVyICpmZHApCisgICAgICAgIDogQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRHluYW1pY1BvbGljeShmZHApIHsKKyAgICBjb25zdCB1aW50MzJfdCBudW1SdWxlcyA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDEsIDEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJ1bGVzOyArK2kpIHsKKyAgICAgICAgUG9saWN5TWl4VHVwbGUgcnVsZSA9IHtnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fdXNhZ2VfdD4obUZkcCwga0F1ZGlvVXNhZ2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fc291cmNlX3Q+KG1GZHAsIGtBdWRpb1NvdXJjZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUfTsKKyAgICAgICAgbVNvdXJjZVJ1bGVzLnB1c2hfYmFjayhydWxlKTsKKyAgICB9Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTWl4UmVjb3JkSW5qZWN0aW9uOjp+QXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBNaXhSZWNvcmRJbmplY3Rpb24oKSB7CisgICAgbU1hbmFnZXItPnN0b3BPdXRwdXQobVBvcnRJZCk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBNaXhSZWNvcmRJbmplY3Rpb246OmluaXRpYWxpemUoKSB7CisgICAgaWYgKCFBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEeW5hbWljUG9saWN5Ojppbml0aWFsaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1UcmFja2VyLnJlc2V0KG5ldyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKSk7CisKKyAgICBtQXVkaW9Db25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgbUF1ZGlvQ29uZmlnLmNoYW5uZWxfbWFzayA9CisgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbEluTWFza3MpOworICAgIG1BdWRpb0NvbmZpZy5mb3JtYXQgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpOworICAgIG1BdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZSA9IGdldFZhbHVlRnJvbVZlY3Rvcjx1aW50MzJfdD4obUZkcCwga1NhbXBsaW5nUmF0ZXMpOworICAgIHN0YXR1c190IHJldCA9IGFkZFBvbGljeU1peChnZXRWYWx1ZUZyb21WZWN0b3I8aW50PihtRmRwLCBrTWl4VHlwZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21WZWN0b3I8aW50PihtRmRwLCBrTWl4Um91dGVGbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWl4QWRkcmVzcywgbUF1ZGlvQ29uZmlnLCBtU291cmNlUnVsZXMpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IGluamVjdGlvblBvcnQ7CisgICAgZmluZERldmljZVBvcnQoQVVESU9fUE9SVF9ST0xFX1NJTkssIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpLAorICAgICAgICAgICAgICAgICAgIG1NaXhBZGRyZXNzLCAmaW5qZWN0aW9uUG9ydCk7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fdXNhZ2VfdD4obUZkcCwga0F1ZGlvVXNhZ2VzKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgdXNhZ2UsIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OworICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSBzdGQ6OnN0cmluZygiYWRkcj0iKSArIG1NaXhBZGRyZXNzOworICAgIHN0cm5jcHkoYXR0ci50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsIG1BdWRpb0NvbmZpZy5mb3JtYXQsIG1BdWRpb0NvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Db25maWcuc2FtcGxlX3JhdGUgLypzYW1wbGVSYXRlKi8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qb3V0cHV0Ki8sICZtUG9ydElkLCBhdHRyKTsKKyAgICByZXQgPSBtTWFuYWdlci0+c3RhcnRPdXRwdXQobVBvcnRJZCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGdldERldmljZUlkRnJvbVBhdGNoKG1DbGllbnQtPmdldExhc3RBZGRlZFBhdGNoKCkpOworICAgIGlmICghZmluZERldmljZVBvcnQoQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpLCBtTWl4QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICZtRXh0cmFjdGlvblBvcnQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbjo6cmVjb3JkaW5nSW5qZWN0aW9uKCkgeworICAgIGNvbnN0IHVpbnQzMl90IG51bVRlc3RDYXNlcyA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDEsIDEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRlc3RDYXNlczsgKytpKSB7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyOworICAgICAgICBhdHRyLmNvbnRlbnRfdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jb250ZW50X3R5cGVfdD4obUZkcCwga0F1ZGlvQ29udGVudFR5cGVzKTsKKyAgICAgICAgYXR0ci51c2FnZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb191c2FnZV90PihtRmRwLCBrQXVkaW9Vc2FnZXMpOworICAgICAgICBhdHRyLnNvdXJjZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19zb3VyY2VfdD4obUZkcCwga0F1ZGlvU291cmNlcyk7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZmxhZ3NfbWFza190PihtRmRwLCBrQXVkaW9GbGFnTWFza3MpOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzKG1GZHAtPkNvbnN1bWVCb29sKCkgPyAiIiA6ICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEiKTsKKyAgICAgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjYXB0dXJlUm91dGVkUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBnZXRJbnB1dEZvckF0dHIoYXR0ciwgbVRyYWNrZXItPmdldFJpaWQoKSwgJmNhcHR1cmVSb3V0ZWRQb3J0SWQsIG1BdWRpb0NvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Db25maWcuY2hhbm5lbF9tYXNrLCBtQXVkaW9Db25maWcuc2FtcGxlX3JhdGUsIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbjo6cHJvY2VzcygpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZSgpKSB7CisgICAgICAgIHJlY29yZGluZ0luamVjdGlvbigpOworICAgICAgICByZWdpc3RlclBvbGljeU1peGVzKCk7CisgICAgICAgIGZ1enpQYXRjaENyZWF0aW9uKCk7CisgICAgICAgIHVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOworICAgIH0KK30KKwordXNpbmcgRGV2aWNlQ29ubmVjdGlvblRlc3RQYXJhbXMgPQorICAgIHN0ZDo6dHVwbGU8YXVkaW9fZGV2aWNlc190IC8qdHlwZSovLCBzdGQ6OnN0cmluZyAvKm5hbWUqLywgc3RkOjpzdHJpbmcgLyphZGRyZXNzKi8+OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEZXZpY2VDb25uZWN0aW9uCisgICAgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEZXZpY2VDb25uZWN0aW9uKEZ1enplZERhdGFQcm92aWRlciAqZmRwKQorICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZShmZHApe307CisgICAgdm9pZCBwcm9jZXNzKCkgb3ZlcnJpZGU7CisKKyAgIHByb3RlY3RlZDoKKyAgICB2b2lkIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOworICAgIHZvaWQgZXhwbGljaXRseVJvdXRpbmdBZnRlckNvbm5lY3Rpb24oKTsKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgeworICAgIGNvbnN0IHVpbnQzMl90IG51bVRlc3RDYXNlcyA9IG1GZHAtPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDMyX3Q+KDEsIDEwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRlc3RDYXNlczsgKytpKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCB0eXBlID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2RldmljZXNfdD4obUZkcCwga0F1ZGlvRGV2aWNlcyk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBtRmRwLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBtRmRwLT5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCk7CisgICAgICAgIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICB0eXBlLCBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PihtRmRwLCBrQXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZXMpLAorICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19mb3JtYXRfdD4obUZkcCwga0F1ZGlvRm9ybWF0cykpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEZXZpY2VDb25uZWN0aW9uOjpleHBsaWNpdGx5Um91dGluZ0FmdGVyQ29ubmVjdGlvbigpIHsKKyAgICBjb25zdCB1aW50MzJfdCBudW1UZXN0Q2FzZXMgPSBtRmRwLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQzMl90PigxLCAxMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UZXN0Q2FzZXM7ICsraSkgeworICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gbUZkcC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBhZGRyZXNzID0gbUZkcC0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICAgICAgICBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgdHlwZSwgZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4obUZkcCwga0F1ZGlvUG9saWN5RGV2aWNlU3RhdGVzKSwKKyAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpLCBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpKTsKKworICAgICAgICBhdWRpb19wb3J0X3Y3IGRldmljZVBvcnQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgPQorICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICAgICAgZmluZERldmljZVBvcnQocm9sZSwgdHlwZSwgYWRkcmVzcywgJmRldmljZVBvcnQpOworCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgcm91dGVkUG9ydElkID0gZGV2aWNlUG9ydC5pZDsKKyAgICAgICAgLy8gVHJ5IHN0YXJ0IGlucHV0IG9yIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGRldmljZSB0eXBlCisgICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKSkgeworICAgICAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmcm91dGVkUG9ydElkLCBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG1GZHAsIGtBdWRpb0NoYW5uZWxPdXRNYXNrcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3Rvcjx1aW50MzJfdD4obUZkcCwga1NhbXBsaW5nUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkpIHsKKyAgICAgICAgICAgIFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlciB0cmFja2VyOworICAgICAgICAgICAgZ2V0SW5wdXRGb3JBdHRyKHt9LCB0cmFja2VyLmdldFJpaWQoKSwgJnJvdXRlZFBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4obUZkcCwga0F1ZGlvQ2hhbm5lbEluTWFza3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbVZlY3Rvcjx1aW50MzJfdD4obUZkcCwga1NhbXBsaW5nUmF0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbjo6cHJvY2VzcygpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZSgpKSB7CisgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOworICAgICAgICBleHBsaWNpdGx5Um91dGluZ0FmdGVyQ29ubmVjdGlvbigpOworICAgICAgICBmdXp6UGF0Y2hDcmVhdGlvbigpOworICAgIH0KK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVFZGdXp6ZXIgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1BvbGljeU1hbmFnZXJUVkZ1enplcihGdXp6ZWREYXRhUHJvdmlkZXIgKmZkcCkKKyAgICAgICAgOiBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGUoZmRwKXt9OworICAgIHZvaWQgcHJvY2VzcygpIG92ZXJyaWRlOworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgZ2V0Q29uZmlnRmlsZSgpOworICAgIHZvaWQgdGVzdEhETUlQb3J0U2VsZWN0aW9uKGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKworICAgIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RkOjpzdHJpbmcgc1R2Q29uZmlnID0KKyAgICAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlclRWRnV6emVyOjpzRXhlY3V0YWJsZURpciArICJkYXRhL3Rlc3RfdHZfYXBtX2NvbmZpZ3VyYXRpb24ueG1sIjsKK307CisKK3N0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5TWFuYWdlclRWRnV6emVyOjpnZXRDb25maWdGaWxlKCkgeyByZXR1cm4gZnV6elhNTChzVHZDb25maWcpOyB9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVFZGdXp6ZXI6OnRlc3RIRE1JUG9ydFNlbGVjdGlvbihhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgeworICAgIGF1ZGlvX2RldmljZXNfdCBhdWRpb0RldmljZSA9IGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+KG1GZHAsIGtBdWRpb0RldmljZXMpOworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2Zvcm1hdF90PihtRmRwLCBrQXVkaW9Gb3JtYXRzKTsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICBhdWRpb0RldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsICIiIC8qYWRkcmVzcyovLCAiIiAvKm5hbWUqLywgYXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLCBnZXRWYWx1ZUZyb21WZWN0b3I8YXVkaW9fZm9ybWF0X3Q+KG1GZHAsIGtBdWRpb0Zvcm1hdHMpLAorICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PihtRmRwLCBrQXVkaW9DaGFubmVsT3V0TWFza3MpLAorICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tVmVjdG9yPHVpbnQzMl90PihtRmRwLCBrU2FtcGxpbmdSYXRlcyksIGZsYWdzLCAmb3V0cHV0LCAmcG9ydElkKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0RGVzYyA9IG1NYW5hZ2VyLT5nZXRPdXRwdXRzKCkudmFsdWVGb3Iob3V0cHV0KTsKKyAgICBpZiAob3V0RGVzYy5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXVkaW9fcG9ydF92NyBwb3J0ID0ge307CisgICAgb3V0RGVzYy0+dG9BdWRpb1BvcnQoJnBvcnQpOworICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb0RldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIC8qYWRkcmVzcyovLCAiIiAvKm5hbWUqLywgYXVkaW9Gb3JtYXQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRWRnV6emVyOjpwcm9jZXNzKCkgeworICAgIGlmIChpbml0aWFsaXplKCkpIHsKKyAgICAgICAgdGVzdEhETUlQb3J0U2VsZWN0aW9uKGdldFZhbHVlRnJvbVZlY3RvcjxhdWRpb19vdXRwdXRfZmxhZ3NfdD4obUZkcCwga0F1ZGlvT3V0cHV0RmxhZ3MpKTsKKyAgICAgICAgZnV6elBhdGNoQ3JlYXRpb24oKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDApIHsKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyIGF1ZGlvUG9saWN5TWFuYWdlckZ1enplcigmZmRwKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyLnByb2Nlc3MoKTsKKworICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJNc2QgYXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyTXNkKCZmZHApOworICAgICAgICBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJNc2QucHJvY2VzcygpOworCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplcldpdGhDb25maWd1cmF0aW9uRmlsZSBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJXaXRoQ29uZmlndXJhdGlvbkZpbGUoCisgICAgICAgICAgICAmZmRwKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyV2l0aENvbmZpZ3VyYXRpb25GaWxlLnByb2Nlc3MoKTsKKworICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEeW5hbWljUG9saWN5IGF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3koJmZkcCk7CisgICAgICAgIGF1ZGlvUG9saWN5TWFuYWdlckZ1enplckR5bmFtaWNQb2xpY3kucHJvY2VzcygpOworCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTm9SZW1vdGVTdWJtaXhNb2R1bGUKKyAgICAgICAgICAgIGF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTm9SZW1vdGVTdWJtaXhNb2R1bGUoJmZkcCk7CisgICAgICAgIGF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQTm9SZW1vdGVTdWJtaXhNb2R1bGUucHJvY2VzcygpOworCisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlckZ1enplckRQUGxheWJhY2tSZVJvdXRpbmcgYXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRFBQbGF5YmFja1JlUm91dGluZygKKyAgICAgICAgICAgICZmZHApOworICAgICAgICBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUFBsYXliYWNrUmVSb3V0aW5nLnByb2Nlc3MoKTsKKworICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbiBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbigKKyAgICAgICAgICAgICZmZHApOworICAgICAgICBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEUE1peFJlY29yZEluamVjdGlvbi5wcm9jZXNzKCk7CisKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyRnV6emVyRGV2aWNlQ29ubmVjdGlvbiBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEZXZpY2VDb25uZWN0aW9uKCZmZHApOworICAgICAgICBhdWRpb1BvbGljeU1hbmFnZXJGdXp6ZXJEZXZpY2VDb25uZWN0aW9uLnByb2Nlc3MoKTsKKworICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUVkZ1enplciBhdWRpb1BvbGljeU1hbmFnZXJUVkZ1enplcigmZmRwKTsKKyAgICAgICAgYXVkaW9Qb2xpY3lNYW5hZ2VyVFZGdXp6ZXIucHJvY2VzcygpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVlMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL3Jlc291cmNlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9wb2xpY3lmdXp6ZXJfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLAorICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfbXNkX2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICAgICAgInRlc3RfYXVkaW9fcG9saWN5X3ByaW1hcnlfb25seV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgICAgICJ0ZXN0X3R2X2FwbV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjZjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9mdXp6ZXIvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPGdsb2JhbENvbmZpZ3VyYXRpb24gc3BlYWtlcl9kcmNfZW5hYmxlZD0idHJ1ZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBtb2R1bGUgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0icHJpbWFyeSIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICAgICAgICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBNaWM8L2l0ZW0+CisgICAgICAgICAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlNwZWFrZXI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX2lucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDExMDI1LDE2MDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgIDwvbWl4UG9ydHM+CisgICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQnVpbHQtSW4gTWljIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhkbWkiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSERNSSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhkbWktSW4gTWljIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fSERNSSIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0ic2luayIgYWRkcmVzcz0iaGZwX2NsaWVudF9vdXQiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0ic291cmNlIiBhZGRyZXNzPSJoZnBfY2xpZW50X2luIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyxIZG1pLUluIE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkhkbWkiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgU0NPIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJtaXhwb3J0X2J0X2hmcF9vdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJtaXhwb3J0X2J0X2hmcF9pbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQlQgU0NPIEhlYWRzZXQgTWljIi8+CisgICAgICAgICAgICA8L3JvdXRlcz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJyX3N1Ym1peCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICAgICAgICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICAgICAgPGl0ZW0+UmVtb3RlIFN1Ym1peCBJbjwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPG1peFBvcnRzPgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InJfc3VibWl4IG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icl9zdWJtaXggaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iUmVtb3RlIFN1Ym1peCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCIgIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlJlbW90ZSBTdWJtaXggSW4iIHR5cGU9IkFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIiAgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJSZW1vdGUgU3VibWl4IE91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icl9zdWJtaXggb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icl9zdWJtaXggaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IlJlbW90ZSBTdWJtaXggSW4iLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfbXNkX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9tc2RfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0OGQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfbXNkX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgICAgICAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgICAgIDxpdGVtPk1TMTIgSW5wdXQ8L2l0ZW0+CisgICAgICAgICAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgICAgICAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGNvbXByZXNzZWQgaW5wdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1R8QVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRHxBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkciPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OT3xBVURJT19DSEFOTkVMX09VVF9TVEVSRU98QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PfEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT3xBVURJT19DSEFOTkVMX09VVF81UE9JTlQxfEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk98QVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPfEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDF8QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OT3xBVURJT19DSEFOTkVMX09VVF9TVEVSRU98QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMXxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDwhLS0gVGhlIEhXIEFWIFN5bmMgZmxhZyBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCAtLT4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIG91dHB1dCIgcm9sZT0ic2luayIgZmxhZ3M9IkFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQ3xBVURJT19JTlBVVF9GTEFHX0RJUkVDVCI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgIDwvbWl4UG9ydHM+CisgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OT3xBVURJT19DSEFOTkVMX09VVF9TVEVSRU98QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIvPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PfEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT3xBVURJT19DSEFOTkVMX09VVF81UE9JTlQxfEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk98QVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPfEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDF8QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OT3xBVURJT19DSEFOTkVMX09VVF9TVEVSRU98QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMXxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgPC9kZXZpY2VQb3J0cz4KKyAgICAgICAgICAgIDxyb3V0ZXM+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJtczEyIG91dHB1dCIgc291cmNlcz0iTVMxMiBPdXRwdXQiLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfcHJpbWFyeV9vbmx5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9wcmltYXJ5X29ubHlfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlMzc3MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfcHJpbWFyeV9vbmx5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJTcGVha2VyIgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9InByaW1hcnkgaW5wdXQiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9IkJ1aWx0LUluIE1pYyIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZnV6emVyL3Jlc291cmNlcy90ZXN0X3R2X2FwbV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF90dl9hcG1fY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4ZDNjZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2Z1enplci9yZXNvdXJjZXMvdGVzdF90dl9hcG1fY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIi8+CisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGUgbmFtZT0icHJpbWFyeSIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICAgICAgICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8IS0tIFByb2ZpbGVzIG9uIHRoZSBIRE1JIHBvcnQgYXJlIGV4cGxpY2l0IGZvciBzaW1wbGljaXR5LiBJbiByZWFsaXR5IHRoZXkgYXJlIGR5bmFtaWMgLS0+CisgICAgICAgICAgICAgICAgPCEtLSBOb3RlOiBwb3J0cyBhcmUgaW50ZW50aW9uYWxseSBhcnJhbmdlZCBmcm9tIG1vcmUgc3BlY2lmaWMgdG8gbGVzcworICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgaW4gb3JkZXIgdG8gdGVzdCBiLzE0MDQ0NzEyNSBmb3IgSFcgQVYgU3luYywgYW5kIHNpbWlsYXIgImV4cGxpY2l0IG1hdGNoZXMiIC0tPgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InR1bm5lbCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1R8QVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImxvdyBsYXRlbmN5IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0iZGlyZWN0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIiAvPgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik91dCBBdXggRGlnaXRhbCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCIgcm9sZT0ic2luayIgLz4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iT3V0IEF1eCBEaWdpdGFsIiBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCx0dW5uZWwsZGlyZWN0LGxvdyBsYXRlbmN5Ii8+CisgICAgICAgICAgICA8L3JvdXRlcz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTZjZmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBBdWRpb1BvbGljeUZhY3RvcnkuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAotICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYgI2lmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2YTFlYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWV4dGVybiAiQyIgQXVkaW9Qb2xpY3lJbnRlcmZhY2UqIGNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcigKLSAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKLXsKLSAgICBBdWRpb1BvbGljeU1hbmFnZXIgKmFwbSA9IG5ldyBBdWRpb1BvbGljeU1hbmFnZXIoY2xpZW50SW50ZXJmYWNlKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBhcG0tPmluaXRpYWxpemUoKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGRlbGV0ZSBhcG07Ci0gICAgICAgIGFwbSA9IG51bGxwdHI7Ci0gICAgfQotICAgIHJldHVybiBhcG07Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpCi17Ci0gICAgZGVsZXRlIGludGVyZmFjZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggNTc3YjQyZi4uMDE2NWRjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0xLDMgKzEsMTIgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKIApAQCAtMjUsNiArMzQsOCBAQAogICAgICAgICAvLyBhIGRlcGVuZGVuY3kgb24gaXQgaW4gdGhlIGRldmljZSBtYWtlZmlsZS4gVGhlcmUgd2lsbCBiZSBubyBidWlsZCB0aW1lCiAgICAgICAgIC8vIGNvbmZsaWN0IHdpdGggbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0LgogICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0IiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAppbmRleCBjNWMxM2U5Li5jYzJkOGU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKQEAgLTI5LDMyICsyOSwzMiBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotI2RlZmluZSBBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX1BBVEhfTUFYX0xFTkdUSCAxMjgKLSNkZWZpbmUgQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiCi0jZGVmaW5lIEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUgXAotICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCIKLSNkZWZpbmUgQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FIFwKLSAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCIKLQogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8U2VyaWFsaXplci5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9oYXB0aWNnZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgotI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0jaW5jbHVkZSA8cG9saWN5Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwogLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCiAjZGVmaW5lIFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDEwMApAQCAtNjQsMTEgKzY0LDExIEBACiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAogLy8gQ29tcHJlc3NlZCBmb3JtYXRzIGZvciBNU0QgbW9kdWxlLCBvcmRlcmVkIGZyb20gbW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkLgotc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBjb21wcmVzc2VkRm9ybWF0c09yZGVyID0ge3sKLSAgICAgICAgQVVESU9fRk9STUFUX01BVF8yXzEsIEFVRElPX0ZPUk1BVF9NQVRfMl8wLCBBVURJT19GT1JNQVRfRV9BQzMsCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IG1zZENvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfSUVDNjA5NTgsIEFVRElPX0ZPUk1BVF9NQVRfMl8xLCBBVURJT19GT1JNQVRfTUFUXzJfMCwgQVVESU9fRk9STUFUX0VfQUMzLAogICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB9fTsKIC8vIENoYW5uZWwgbWFza3MgZm9yIE1TRCBtb2R1bGUsIDNEID4gMkQgPiAxRCBvcmRlcmluZyAobW9zdCBwcmVmZXJyZWQgdG8gbGVhc3QgcHJlZmVycmVkKS4KLXN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciA9IHt7CitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IG1zZFN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7ewogICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAogICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAogICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CkBAIC0yMDksNiArMjA5LDkgQEAKICAgICAgICAgICAgIC8vIFJlc2V0IGFjdGl2ZSBkZXZpY2UgY29kZWMKICAgICAgICAgICAgIGRldmljZS0+c2V0RW5jb2RlZEZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCk7CiAKKyAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBtUmVwb3J0ZWRGb3JtYXRzTWFwIGNhY2hlCisgICAgICAgICAgICBtUmVwb3J0ZWRGb3JtYXRzTWFwLmVyYXNlKGRldmljZSk7CisKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTI0Niw2ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyQXVkaW9Tb3VyY2VzRm9yT3V0cHV0KG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjYwLDE1ICsyNjQsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNoZWNrQ2xvc2VPdXRwdXRzKCk7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2VzKTsKLSAgICAgICAgfQorICAgICAgICAodm9pZCl1cGRhdGVDYWxsUm91dGluZyhmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHNUb1Jlb3BlbjsKICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yIG1zZE91dERldmljZXMgPSBnZXRNc2RBdWRpb091dERldmljZXMoKTsKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yIGFjdGl2ZU1lZGlhRGV2aWNlcyA9CisgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0QWN0aXZlTWVkaWFEZXZpY2VzKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAoZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKKyAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKKyAgICAgICAgICAgICAgICAoZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpKSB7CiAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGZvcmNlIGRldmljZSBjaGFuZ2Ugb24gZHVwbGljYXRlZCBvdXRwdXQgYmVjYXVzZSBpZiBkZXZpY2UgaXMgMCwgaXQgd2lsbAogICAgICAgICAgICAgICAgIC8vIGFsc28gZm9yY2UgYSBkZXZpY2UgMCBmb3IgdGhlIHR3byBvdXRwdXRzIGl0IGlzIGR1cGxpY2F0ZWQgdG8gd2hpY2ggbWF5IG92ZXJyaWRlCkBAIC0yODAsNiArMjg0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSk7CiAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlLT5oYXNEeW5hbWljQXVkaW9Qcm9maWxlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIWFjdGl2ZU1lZGlhRGV2aWNlcy5lbXB0eSgpICYmIGRlc2MtPmRldmljZXMoKSAhPSBhY3RpdmVNZWRpYURldmljZXMgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+c3VwcG9ydHNEZXZpY2VzRm9yUGxheWJhY2soYWN0aXZlTWVkaWFEZXZpY2VzKSkgeworICAgICAgICAgICAgICAgIC8vIFJlb3BlbiB0aGUgb3V0cHV0IHRvIHF1ZXJ5IHRoZSBkeW5hbWljIHByb2ZpbGVzIHdoZW4gdGhlcmUgaXMgbm90IGFjdGl2ZQorICAgICAgICAgICAgICAgIC8vIGNsaWVudHMgb3IgYWxsIGFjdGl2ZSBjbGllbnRzIHdpbGwgYmUgcmVyb3V0ZWQuIE90aGVyd2lzZSwgc2V0IHRoZSBmbGFnCisgICAgICAgICAgICAgICAgLy8gYG1QZW5kaW5nUmVvcGVuVG9RdWVyeVByb2ZpbGVzYCBpbiB0aGUgU3dPdXRwdXREZXNjcmlwdG9yIHNvIHRoYXQgdGhlIG91dHB1dAorICAgICAgICAgICAgICAgIC8vIGNhbiBiZSByZW9wZW5lZCB0byBxdWVyeSBkeW5hbWljIHByb2ZpbGVzIHdoZW4gYWxsIGNsaWVudHMgYXJlIGluYWN0aXZlLgorICAgICAgICAgICAgICAgIGlmIChhcmVBbGxBY3RpdmVUcmFja3NSZXJvdXRlZChkZXNjKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzVG9SZW9wZW4ucHVzaF9iYWNrKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUGVuZGluZ1Jlb3BlblRvUXVlcnlQcm9maWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZXNjLT5zdXBwb3J0c0RldmljZXNGb3JQbGF5YmFjayhhY3RpdmVNZWRpYURldmljZXMpKSB7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGZsYWcgdGhhdCBwcmV2aW91c2x5IHNldCBmb3IgcmUtcXVlcnlpbmcgcHJvZmlsZXMuCisgICAgICAgICAgICAgICAgZGVzYy0+bVBlbmRpbmdSZW9wZW5Ub1F1ZXJ5UHJvZmlsZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dHB1dCA6IG91dHB1dHNUb1Jlb3BlbikgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIG9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZShkZXNjLT5tUHJvZmlsZSwgYWN0aXZlTWVkaWFEZXZpY2VzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7CkBAIC0zMzcsNiArMzYzLDkgQEAKICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKICAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUpOworCisgICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gbVJlcG9ydGVkRm9ybWF0c01hcCBjYWNoZQorICAgICAgICAgICAgbVJlcG9ydGVkRm9ybWF0c01hcC5lcmFzZShkZXZpY2UpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zNTIsMTEgKzM4MSwxMiBAQAogICAgICAgICAvLyBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGNhY2hlCiAgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAKLSAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcyk7CisgICAgICAgICh2b2lkKXVwZGF0ZUNhbGxSb3V0aW5nKGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAvLyBSZWNvbm5lY3QgQXVkaW8gU291cmNlCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgICAgIGNoZWNrQXVkaW9Tb3VyY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgICAgICB9Ci0KICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKICAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQpAQCAtNDQxLDcgKzQ3MSw3IEBACiAgICAgLy8gQ2FzZSAxOiBBMkRQIGFjdGl2ZSBkZXZpY2Ugc3dpdGNoZXMgZnJvbSBwcmltYXJ5IHRvIHByaW1hcnkKICAgICAvLyBtb2R1bGUKICAgICAvLyBDYXNlIDI6IEEyRFAgZGV2aWNlIGNvbmZpZyBjaGFuZ2VzIG9uIHByaW1hcnkgbW9kdWxlLgotICAgIGlmIChhdWRpb19pc19hMmRwX291dF9kZXZpY2UoZGV2aWNlKSkgeworICAgIGlmIChhdWRpb19pc19hMmRwX291dF9kZXZpY2UoZGV2aWNlKSAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZShkZXZpY2UsIGVuY29kZWRGb3JtYXQpOwogICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKICAgICAgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkuY29udGFpbnMoZGV2RGVzYykgJiYKQEAgLTQ2MSw3ICs0OTEsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQorICAgIGF1dG8gbXVzaWNTdHJhdGVneSA9IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgIC8vIG11dGUgbWVkaWEgc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAorICAgICAgIC8vIFRoaXMgYXZvaWQgc2VuZGluZyB0aGUgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgorICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICBzZXRTdHJhdGVneU11dGUobXVzaWNTdHJhdGVneSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKKyAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCkpOworICAgIH0KICAgICAvLyBUb2dnbGUgdGhlIGRldmljZSBzdGF0ZTogVU5BVkFJTEFCTEUgLT4gQVZBSUxBQkxFCiAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIHJlYWRpbmcgYWdhaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKQEAgLTUwNywzMCArNTQ2LDYxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcykKK0RldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdEJlc3RSeFNpbmtEZXZpY2VzRm9yQ2FsbChib29sIGZyb21DYWNoZSkKK3sKKyAgICBEZXZpY2VWZWN0b3IgcnhTaW5rZGV2aWNlc3t9OworICAgIHJ4U2lua2RldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04pLCBudWxscHRyLCBmcm9tQ2FjaGUpOworICAgIGlmICghcnhTaW5rZGV2aWNlcy5pc0VtcHR5KCkgJiYgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMocnhTaW5rZGV2aWNlcy5pdGVtQXQoMCkpKSB7CisgICAgICAgIGF1dG8gcnhTaW5rRGV2aWNlID0gcnhTaW5rZGV2aWNlcy5pdGVtQXQoMCk7CisgICAgICAgIGF1dG8gdGVsZXBob255UnhNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGUoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgLy8gcmV0cmlldmUgUnggU291cmNlIGRldmljZSBkZXNjcmlwdG9yCisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U291cmNlRGV2aWNlID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworCisgICAgICAgIC8vIFJYIFRlbGVwaG9ueSBhbmQgUnggc2luayBkZXZpY2VzIGFyZSBkZWNsYXJlZCBieSBQcmltYXJ5IEF1ZGlvIEhBTAorICAgICAgICBpZiAoaXNQcmltYXJ5TW9kdWxlKHRlbGVwaG9ueVJ4TW9kdWxlKSAmJiAodGVsZXBob255UnhNb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMpICYmCisgICAgICAgICAgICAgICAgdGVsZXBob255UnhNb2R1bGUtPnN1cHBvcnRzUGF0Y2gocnhTb3VyY2VEZXZpY2UsIHJ4U2lua0RldmljZSkpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcygpIGRldmljZSAlcyB1c2luZyBIVyBCcmlkZ2UiLCBfX2Z1bmNfXywgcnhTaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihyeFNpbmtEZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlcygpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCisgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAorICAgIC8vIChmaWx0ZXIgbGF0ZXIgYnkgc2V0T3V0cHV0RGV2aWNlcygpKQorICAgIHJldHVybiBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmcm9tQ2FjaGUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGJvb2wgZnJvbUNhY2hlLCB1aW50MzJfdCBkZWxheU1zLCB1aW50MzJfdCAqd2FpdE1zKQoreworICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gc2VsZWN0QmVzdFJ4U2lua0RldmljZXNGb3JDYWxsKGZyb21DYWNoZSk7CisgICAgICAgIHJldHVybiB1cGRhdGVDYWxsUm91dGluZ0ludGVybmFsKHJ4RGV2aWNlcywgZGVsYXlNcywgd2FpdE1zKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nSW50ZXJuYWwoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcnhEZXZpY2VzLCB1aW50MzJfdCBkZWxheU1zLCB1aW50MzJfdCAqd2FpdE1zKQogewogICAgIGJvb2wgY3JlYXRlVHhQYXRjaCA9IGZhbHNlOwogICAgIGJvb2wgY3JlYXRlUnhQYXRjaCA9IGZhbHNlOwogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwotCiAgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSB8fAogICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKS5vbmx5Q29udGFpbnNEZXZpY2VzV2l0aFR5cGUoQVVESU9fREVWSUNFX09VVF9TVFVCKSkgewotICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVCghcnhEZXZpY2VzLmlzRW1wdHkoKSwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gc2VsZWN0ZWQgb3V0cHV0IGRldmljZSIpOworICAgIEFMT0dfQVNTRVJUKCFyeERldmljZXMuaXNFbXB0eSgpLCAiJXMoKSBubyBzZWxlY3RlZCBvdXRwdXQgZGV2aWNlIiwgX19mdW5jX18pOwogCiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiB9OwogICAgIGF1dG8gdHhTb3VyY2VEZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cik7Ci0gICAgQUxPR19BU1NFUlQodHhTb3VyY2VEZXZpY2UgIT0gMCwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgaW5wdXQgc2VsZWN0ZWQgZGV2aWNlIG5vdCBhdmFpbGFibGUiKTsKKyAgICBBTE9HX0FTU0VSVCh0eFNvdXJjZURldmljZSAhPSAwLCAiJXMoKSBpbnB1dCBzZWxlY3RlZCBkZXZpY2Ugbm90IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKIAotICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJXMgdHhEZXZpY2UgJXMiLAorICAgIEFMT0dWKCIlcyBkZXZpY2UgcnhEZXZpY2UgJXMgdHhEZXZpY2UgJXMiLCBfX2Z1bmNfXywKICAgICAgICAgICByeERldmljZXMuaXRlbUF0KDApLT50b1N0cmluZygpLmNfc3RyKCksIHR4U291cmNlRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCi0gICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKLSAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFJ4UGF0Y2gtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7Ci0gICAgfQorICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CiAgICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKQEAgLTU1Niw4ICs2MjYsOCBAQAogICAgICAgICAgICAgKHRlbGVwaG9ueVJ4TW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA+PSAzKSkgewogICAgICAgICBpZiAocnhTb3VyY2VEZXZpY2UgPT0gMCB8fCB0eFNpbmtEZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgLy8gUlggLyBUWCBUZWxlcGhvbnkgZGV2aWNlKHMpIGlzKGFyZSkgbm90IGN1cnJlbnRseSBhdmFpbGFibGUKLSAgICAgICAgICAgIEFMT0dFKCJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUeCBhbmQvb3IgUlggZGV2aWNlIik7Ci0gICAgICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIG5vIHRlbGVwaG9ueSBUeCBhbmQvb3IgUlggZGV2aWNlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgICAgIC8vIGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbCBub3cgc3VwcG9ydHMgYm90aCBIVyAvIFNXIGJyaWRnaW5nCiAgICAgICAgIGNyZWF0ZVJ4UGF0Y2ggPSB0cnVlOwpAQCAtNTc4LDggKzY0OCw3IEBACiAgICAgaWYgKCFjcmVhdGVSeFBhdGNoKSB7CiAgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIHRydWUsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlcy5pdGVtQXQoMCksIGRlbGF5TXMpOwotCisgICAgICAgIGNvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CiAgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlIGJ1dCBSWCBkZXZpY2UgaXMKICAgICAgICAgLy8gb24gb3RoZXIgSFcgbW9kdWxlLCBTaW5rTWV0YURhdGEgb2YgdGVsZXBob255IGlucHV0IHNob3VsZCBoYW5kbGUgaXQKICAgICAgICAgLy8gYXNzdW1pbmcgdGhlIGRldmljZSB1c2VzIGF1ZGlvIEhBTCBWNS4wIGFuZCBhYm92ZQpAQCAtNTk2LDggKzY2NSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eFNvdXJjZURldmljZSwgZGVsYXlNcyk7CiAgICAgfQotCi0gICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgaWYgKHdhaXRNcyAhPSBudWxscHRyKSB7CisgICAgICAgICp3YWl0TXMgPSBtdXRlV2FpdE1zOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHNwPEF1ZGlvUGF0Y2g+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlVGVsZXBob255UGF0Y2goCkBAIC02NDIsNiArNzEzLDI0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKQoreworICAgIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZSA9IHsKKyAgICAgICAgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCisgICAgICAgIC5leHQuZGV2aWNlLnR5cGUgPSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCAuZXh0LmRldmljZS5hZGRyZXNzID0gIiIKKyAgICB9OworICAgIGNvbnN0IGF1dG8gYWEgPSBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYWEsICZtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCwgMC8qdWlkKi8pOworICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIiVzIGZhaWxlZCB0byBzdGFydCBUZWxlcGhvbnkgUnggQXVkaW9Tb3VyY2UiLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkaXNjb25uZWN0VGVsZXBob255UnhBdWRpb1NvdXJjZSgpCit7CisgICAgc3RvcEF1ZGlvU291cmNlKG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0KTsKKyAgICBtQ2FsbFJ4U291cmNlQ2xpZW50UG9ydCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKIHsKICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwpAQCAtNjk3LDI4ICs3ODYsMjIgQEAKICAgICB9CiAKICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlcygpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCi0gICAgICAgIC8vIHRoZSBkZXZpY2UgcmV0dXJuZWQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWNoYWJsZSB2aWEgdGhpcyBvdXRwdXQKLSAgICAgICAgRGV2aWNlVmVjdG9yIHJ4RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBlbmRpbmcgY2FsbAotICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiByeERldmljZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByeERldmljZXMgPSBtUHJpbWFyeU91dHB1dC0+ZGV2aWNlcygpOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcocnhEZXZpY2VzLCBkZWxheU1zKTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwobUNhbGxSeFBhdGNoLT5nZXRIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOwotICAgICAgICAgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCBmb3JjZSwgMCk7CisgICAgICAgICAgICAodm9pZCl1cGRhdGVDYWxsUm91dGluZyhmYWxzZSAvKmZyb21DYWNoZSovLCBkZWxheU1zKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIERldmljZVZlY3RvciByeERldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCisgICAgICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCisgICAgICAgICAgICBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgcnhEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2xkU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICAgICAgZGlzY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgIH0KICAgICB9CkBAIC03ODAsMTYgKzg2Myw3IEBACiAgICAgfQogCiAgICAgdXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoZm9yY2VWb2x1bWVSZWV2YWwsIGRlbGF5TXMpOwotCi0gICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICBhdXRvIG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOwotICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAotICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhuZXdEZXZpY2UpKSB7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIG5ld0RldmljZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjbG9zZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdXBkYXRlSW5wdXRSb3V0aW5nKCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpCkBAIC04OTMsNyArOTY3LDggQEAKICAgICAvLyBPbmx5IGhvbm9yIGF1ZGliaWxpdHkgZW5mb3JjZWQgd2hlbiByZXF1aXJlZC4gVGhlIGNsaWVudCB3aWxsIGJlCiAgICAgLy8gZm9yY2VkIHRvIHJlY29ubmVjdCBpZiB0aGUgZm9yY2VkIHVzYWdlIGNoYW5nZXMuCiAgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIGRzdEF0dHItPmZsYWdzICY9IH5BVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQ7CisgICAgICAgIGRzdEF0dHItPmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PigKKyAgICAgICAgICAgICAgICBkc3RBdHRyLT5mbGFncyAmIH5BVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTkyNSw3ICsxMDAwLDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGF1dG8gaXQgPSBtQWxsb3dlZENhcHR1cmVQb2xpY2llcy5maW5kKHVpZCk7IGl0ICE9IGVuZChtQWxsb3dlZENhcHR1cmVQb2xpY2llcykpIHsKLSAgICAgICAgcmVzdWx0QXR0ci0+ZmxhZ3MgfD0gaXQtPnNlY29uZDsKKyAgICAgICAgcmVzdWx0QXR0ci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KHJlc3VsdEF0dHItPmZsYWdzIHwgaXQtPnNlY29uZCk7CiAgICAgfQogICAgICpzdHJlYW0gPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0cik7CiAKQEAgLTEwMjAsMTEgKzEwOTUsOSBAQAogICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBpZiAoIW1zZERldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG1zZERldmljZXMsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywgZmxhZ3MpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBvdXRwdXREZXZpY2VzLmlzRW1wdHkoKSA/IG51bGxwdHIgOiBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKTsKLSAgICAgICAgaWYgKCpvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUgJiYgc2V0TXNkUGF0Y2goZGV2aWNlKSA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RPdXRwdXRQYXRjaGVzKCZvdXRwdXREZXZpY2VzKSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR1YoIiVzKCkgVXNpbmcgTVNEIGRldmljZXMgJXMgaW5zdGVhZCBvZiBkZXZpY2VzICVzIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtc2REZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwotICAgICAgICAgICAgb3V0cHV0RGV2aWNlcyA9IG1zZERldmljZXM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KQEAgLTEwMzgsNiArMTExMSwxMiBAQAogICAgIH0KIAogICAgICpzZWxlY3RlZERldmljZUlkID0gZ2V0Rmlyc3REZXZpY2VJZChvdXRwdXREZXZpY2VzKTsKKyAgICBmb3IgKGF1dG8gJm91dHB1dERldmljZSA6IG91dHB1dERldmljZXMpIHsKKyAgICAgICAgaWYgKG91dHB1dERldmljZS0+Z2V0SWQoKSA9PSBnZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmdldElkKCkpIHsKKyAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gb3V0cHV0RGV2aWNlLT5nZXRJZCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAob3V0cHV0RGV2aWNlcy5vbmx5Q29udGFpbnNEZXZpY2VzV2l0aFR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpKSB7CiAgICAgICAgICpvdXRwdXRUeXBlID0gQVBJX09VVFBVVF9URUxFUEhPTllfVFg7CkBAIC0xMDU0LDcgKzExMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMTA2Niw2ICsxMTQ1LDggQEAKICAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgY29uc3QgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOwogICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOwogICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKQEAgLTExNjUsNyArMTI0Niw3IEBACiAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrID09IGRlc2MtPmdldENoYW5uZWxNYXNrKCkpICYmCiAgICAgICAgICAgICAgICAgKHNlc3Npb24gPT0gZGVzYy0+bURpcmVjdENsaWVudFNlc3Npb24pKSB7CiAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCsrOwotICAgICAgICAgICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAqb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTE4MCwyNCArMTI2MSw5IEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPQogICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKIAotICAgIFN0cmluZzggYWRkcmVzcyA9IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhkZXZpY2VzKTsKLQotICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQotICAgIC8vIE1TRCBwYXRjaCB0byBwcmlvcml0aXplIHRoaXMgcmVxdWVzdCBvdmVyIGFueSBhY3RpdmUgb3V0cHV0IG9uIE1TRC4KLSAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBhdXRvJiBwYXRjaCA9IG1zZFBhdGNoZXNbaV07Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3M7ICsraikgewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07Ci0gICAgICAgICAgICBpZiAoc2luay0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCi0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuY29udGFpbnNEZXZpY2VXaXRoVHlwZShzaW5rLT5leHQuZGV2aWNlLnR5cGUpICYmCi0gICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5nZXRIYW5kbGUoKSwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy8gQW4gTVNEIHBhdGNoIG1heSBiZSB1c2luZyB0aGUgb25seSBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIHNlcnZpY2UgdGhpcyByZXF1ZXN0LiBSZWxlYXNlCisgICAgLy8gYWxsIE1TRCBwYXRjaGVzIHRvIHByaW9yaXRpemUgdGhpcyByZXF1ZXN0IG92ZXIgYW55IGFjdGl2ZSBvdXRwdXQgb24gTVNELgorICAgIHJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzKGRldmljZXMpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZXMsIHN0cmVhbSwgZmxhZ3MsIG91dHB1dCk7CiAKQEAgLTEyNDMsNyArMTMwOSw4IEBACiAKICAgICAvLyBEaXNjYXJkIGhhcHRpYyBjaGFubmVsIG1hc2sgd2hlbiBmb3JjaW5nIG11dGluZyBoYXB0aWMgY2hhbm5lbHMuCiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBmb3JjZU11dGluZ0hhcHRpYwotICAgICAgICAgICAgPyAoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA6IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKQorICAgICAgICAgICAgOiBjb25maWctPmNoYW5uZWxfbWFzazsKIAogICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQpAQCAtMTI5OSw3ICsxMzY2LDggQEAKIAogICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIHNob3VsZCBpZ25vcmUgdGhlIERJUkVDVCBmbGFnIGFzIG5vIGRpcmVjdCBvdXRwdXQgY291bGQgYmUgZm91bmQgZWFybGllcgogICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQoCisgICAgICAgICAgICAgICAgb3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUsIHNlc3Npb24pOwogICAgIH0KICAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlcygpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCiAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLApAQCAtMTMxOSw3ICsxMzg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwogfQogCi1jb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFBhdGNoZXMoKSBjb25zdCB7Citjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZE91dHB1dFBhdGNoZXMoKSBjb25zdCB7CiAgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlczsKICAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKICAgICBpZiAobXNkTW9kdWxlICE9IDApIHsKQEAgLTEzMzcsNDkgKzE0MDUsNDcgQEAKICAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCi0gICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAotewotICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOwotICAgIGlmIChtc2RNb2R1bGUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IE1TRCBtb2R1bGUiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzcDxId01vZHVsZT4gZGV2aWNlTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2Uob3V0cHV0RGV2aWNlLCBBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0gICAgaWYgKGRldmljZU1vZHVsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgbW9kdWxlIGZvciAlcyIsIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBjb25zdCBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uICZpbnB1dFByb2ZpbGVzID0gbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZFByb2ZpbGVzKGJvb2wgaHdBdlN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNvdXJjZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgc291cmNlUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciYgc2lua1Byb2ZpbGVzKSBjb25zdCB7CiAgICAgaWYgKGlucHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG5vIGlucHV0IHByb2ZpbGVzIGZvciBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICBBTE9HRSgiJXMoKSBubyBpbnB1dCBwcm9maWxlcyBmb3Igc291cmNlIG1vZHVsZSIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKICAgICBpZiAob3V0cHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG5vIG91dHB1dCBwcm9maWxlcyBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzKCkgbm8gb3V0cHV0IHByb2ZpbGVzIGZvciBzaW5rIG1vZHVsZSIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKLSAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAogICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgewotICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7Ci0gICAgICAgICAgICBhcHBlbmRBdWRpb1Byb2ZpbGVzKG1zZFByb2ZpbGVzLCBpblByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKGluUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBpblByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKHNvdXJjZURldmljZSkpIHsKKyAgICAgICAgICAgIGFwcGVuZEF1ZGlvUHJvZmlsZXMoc291cmNlUHJvZmlsZXMsIGluUHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKICAgICAgICAgfQogICAgIH0KLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgZGV2aWNlUHJvZmlsZXM7CiAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKLSAgICAgICAgaWYgKGh3QXZTeW5jID09ICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7Ci0gICAgICAgICAgICBhcHBlbmRBdWRpb1Byb2ZpbGVzKGRldmljZVByb2ZpbGVzLCBvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5zdXBwb3J0c0RldmljZShzaW5rRGV2aWNlKSkgeworICAgICAgICAgICAgYXBwZW5kQXVkaW9Qcm9maWxlcyhzaW5rUHJvZmlsZXMsIG91dFByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEJlc3RNc2RDb25maWcoYm9vbCBod0F2U3luYywKKyAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZzb3VyY2VQcm9maWxlcywgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZzaW5rUHJvZmlsZXMsCisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAorewogICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKG1zZFByb2ZpbGVzLCBkZXZpY2VQcm9maWxlcywKLSAgICAgICAgICAgIGNvbXByZXNzZWRGb3JtYXRzT3JkZXIsIHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIsIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sCi0gICAgICAgICAgICBiZXN0U2lua0NvbmZpZyk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhzb3VyY2VQcm9maWxlcywgc2lua1Byb2ZpbGVzLAorICAgICAgICAgICAgbXNkQ29tcHJlc3NlZEZvcm1hdHNPcmRlciwgbXNkU3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwKKyAgICAgICAgICAgIHRydWUgLypwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzKi8sIGJlc3RTaW5rQ29uZmlnKTsKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGVzIGZvdW5kIGZvciBkZXZpY2U6ICVzLCBod0F2U3luYzogJWQiLAotICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdBdlN5bmMpOworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBjb25maWcgZm91bmQgZm9yIHNpbmssIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGh3QXZTeW5jKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgc2lua0NvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKQEAgLTEzOTAsNyArMTQ1Niw3IEBACiAgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgIGlmIChhdWRpb19pc19pZWM2MTkzN19jb21wYXRpYmxlKHNpbmtDb25maWctPmZvcm1hdCkpIHsKICAgICAgICAgLy8gRm9yIGZvcm1hdHMgY29tcGF0aWJsZSB3aXRoIElFQzYxOTM3IGVuY2Fwc3VsYXRpb24sIGFzc3VtZSB0aGF0Ci0gICAgICAgIC8vIHRoZSByZWNvcmQgdGhyZWFkIGlucHV0IGZyb20gTVNEIGlzIElFQzYxOTM3IGZyYW1lZCAoZm9yIHByb3BvcnRpb25hbCBidWZmZXIgc2l6aW5nKS4KKyAgICAgICAgLy8gdGhlIGlucHV0IGlzIElFQzYxOTM3IGZyYW1lZCAoZm9yIHByb3BvcnRpb25hbCBidWZmZXIgc2l6aW5nKS4KICAgICAgICAgLy8gQWRkIHRoZSBBVURJT19PVVRQVVRfRkxBR19JRUM5NThfTk9OQVVESU8gZmxhZyBzbyBkb3duc3RyZWFtIEhBTCBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbgogICAgICAgICAvLyByYXcgYW5kIElFQzYxOTM3IGZyYW1lZCBzdHJlYW1zLgogICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCkBAIC0xNDE2LDcwICsxNDgyLDE0OSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotUGF0Y2hCdWlsZGVyIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnVpbGRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSBjb25zdAorUGF0Y2hCdWlsZGVyIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdAogewogICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7Ci0gICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShnZXRNc2RBdWRpb0luRGV2aWNlKCkpLmFkZFNpbmsob3V0cHV0RGV2aWNlKTsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBBTE9HX0FTU0VSVChtc2RNb2R1bGUgIT0gbnVsbHB0ciwgIk1TRCBtb2R1bGUgbm90IGF2YWlsYWJsZSIpOworICAgIHNwPEh3TW9kdWxlPiBkZXZpY2VNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoZGV2aWNlTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBtb2R1bGUgZm9yICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKKyAgICB9CisgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiBpbnB1dFByb2ZpbGVzID0gbXNkSXNTb3VyY2UgPworICAgICAgICAgICAgbXNkTW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkgOiBkZXZpY2VNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiBvdXRwdXRQcm9maWxlcyA9IG1zZElzU291cmNlID8KKyAgICAgICAgICAgIGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IG1zZE1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHNvdXJjZURldmljZSA9IG1zZElzU291cmNlID8gZ2V0TXNkQXVkaW9JbkRldmljZSgpIDogZGV2aWNlOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSBtc2RJc1NvdXJjZSA/CisgICAgICAgICAgICBkZXZpY2UgOiBnZXRNc2RBdWRpb091dERldmljZXMoKS5pdGVtQXQoMCk7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzb3VyY2VEZXZpY2UpLmFkZFNpbmsoc2lua0RldmljZSk7CisKICAgICBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2VDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c291cmNlc1swXTsKICAgICBhdWRpb19wb3J0X2NvbmZpZyBzaW5rQ29uZmlnID0gcGF0Y2hCdWlsZGVyLnBhdGNoKCktPnNpbmtzWzBdOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBzb3VyY2VQcm9maWxlczsKKyAgICBBdWRpb1Byb2ZpbGVWZWN0b3Igc2lua1Byb2ZpbGVzOwogICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hldGhlciBNU0QgbW9kdWxlIGhhcyBIV19BVl9TWU5DIGZsYWcgc2V0IGluIHRoZSBBUCBjb25maWcgZmlsZS4KICAgICAvLyBGb3Igbm93LCB3ZSBqdXN0IGZvcmNlZnVsbHkgdHJ5IHdpdGggSHdBdlN5bmMgZmlyc3QuCi0gICAgc3RhdHVzX3QgcmVzID0gZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcihvdXRwdXREZXZpY2UsIHRydWUgLypod0F2U3luYyovLAotICAgICAgICAgICAgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpID09IE5PX0VSUk9SID8gTk9fRVJST1IgOgotICAgICAgICAgICAgZ2V0QmVzdE1zZEF1ZGlvUHJvZmlsZUZvcigKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBmYWxzZSAvKmh3QXZTeW5jKi8sICZzb3VyY2VDb25maWcsICZzaW5rQ29uZmlnKTsKLSAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIEZvdW5kIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgZW5jb2RlZCBhdWRpby4gUmUtY3JlYXRlIFBhdGNoQnVpbGRlciB3aXRoIHRoaXMgY29uZmlnLgotICAgICAgICByZXR1cm4gKFBhdGNoQnVpbGRlcigpKS5hZGRTb3VyY2Uoc291cmNlQ29uZmlnKS5hZGRTaW5rKHNpbmtDb25maWcpOworICAgIGZvciAoYXV0byBod0F2U3luYyA6IHsgdHJ1ZSwgZmFsc2UgfSkgeworICAgICAgICBpZiAoZ2V0TXNkUHJvZmlsZXMoaHdBdlN5bmMsIGlucHV0UHJvZmlsZXMsIG91dHB1dFByb2ZpbGVzLCBzb3VyY2VEZXZpY2UsIHNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgc291cmNlUHJvZmlsZXMsIHNpbmtQcm9maWxlcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRCZXN0TXNkQ29uZmlnKGh3QXZTeW5jLCBzb3VyY2VQcm9maWxlcywgc2lua1Byb2ZpbGVzLCAmc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICZzaW5rQ29uZmlnKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBjb25maWcuIFJlLWNyZWF0ZSBQYXRjaEJ1aWxkZXIgd2l0aCB0aGlzIGNvbmZpZy4KKyAgICAgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR1YoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZSBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIGNvbmZpZyBmb3VuZC4gRmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgUENNIHBhdGNoIgogICAgICAgICAgICAgIiBzdXBwb3J0aW5nIFBDTSBmb3JtYXQgY29udmVyc2lvbi4iLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIHBhdGNoQnVpbGRlcjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RQYXRjaChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmb3V0cHV0RGV2aWNlKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlOwotICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRNc2RPdXRwdXRQYXRjaGVzKGNvbnN0IERldmljZVZlY3RvciAqb3V0cHV0RGV2aWNlcykgeworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGlmIChvdXRwdXREZXZpY2VzICE9IG51bGxwdHIgJiYgb3V0cHV0RGV2aWNlcy0+c2l6ZSgpID4gMCkgeworICAgICAgICBkZXZpY2VzLmFkZCgqb3V0cHV0RGV2aWNlcyk7CisgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVXNlIG1lZGlhIHN0cmF0ZWd5IGZvciB1bnNwZWNpZmllZCBvdXRwdXQgZGV2aWNlLiBUaGlzIHNob3VsZCBvbmx5CiAgICAgICAgIC8vIG9jY3VyIG9uIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpLiBEZXZpY2UgY29ubmVjdGlvbiBldmVudHMgbWF5CiAgICAgICAgIC8vIHRoZXJlZm9yZSBpbnZhbGlkYXRlIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMuCi0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRldmljZXMuaXNFbXB0eSgpLCAibm8gb3V0cHVkZXZpY2UgdG8gc2V0IE1zZCBQYXRjaCIpOwotICAgICAgICBkZXZpY2UgPSBkZXZpY2VzLml0ZW1BdCgwKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXZpY2VzLmlzRW1wdHkoKSwgIm5vIG91dHB1dCBkZXZpY2UgdG8gc2V0IE1TRCBwYXRjaCIpOwogICAgIH0KLSAgICBBTE9HVigiJXMoKSBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyID0gYnVpbGRNc2RQYXRjaChkZXZpY2UpOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2ggPSBwYXRjaEJ1aWxkZXIucGF0Y2goKTsKLSAgICBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzID0gZ2V0TXNkUGF0Y2hlcygpOwotICAgIGlmICghbXNkUGF0Y2hlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtc2RQYXRjaGVzLnNpemUoKSA+IDEsCi0gICAgICAgICAgICAgICAgIlRoZSBjdXJyZW50IE1TRCBwcm90b3R5cGUgb25seSBzdXBwb3J0cyBvbmUgb3V0cHV0IHBhdGNoIik7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGN1cnJlbnRQYXRjaCA9IG1zZFBhdGNoZXMudmFsdWVBdCgwKTsKLSAgICAgICAgaWYgKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKCZjdXJyZW50UGF0Y2gtPm1QYXRjaCwgcGF0Y2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UGF0Y2hCdWlsZGVyPiBwYXRjaGVzVG9DcmVhdGU7CisgICAgZm9yIChhdXRvIGkgPSAwdTsgaSA8IGRldmljZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQUxPR1YoIiVzKCkgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2VzW2ldLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBwYXRjaGVzVG9DcmVhdGUucHVzaF9iYWNrKGJ1aWxkTXNkUGF0Y2godHJ1ZSAvKm1zZElzU291cmNlKi8sIGRldmljZXNbaV0pKTsKKyAgICB9CisgICAgLy8gUmV0YWluIG9ubHkgdGhlIE1TRCBwYXRjaGVzIGFzc29jaWF0ZWQgd2l0aCBvdXRwdXREZXZpY2VzIHJlcXVlc3QuCisgICAgLy8gVGVhciBkb3duIHRoZSBvdGhlcnMsIGFuZCBjcmVhdGUgbmV3IG9uZXMgYXMgbmVlZGVkLgorICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIHBhdGNoZXNUb1JlbW92ZSA9IGdldE1zZE91dHB1dFBhdGNoZXMoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBwYXRjaGVzVG9DcmVhdGUuYmVnaW4oKTsgaXQgIT0gcGF0Y2hlc1RvQ3JlYXRlLmVuZCgpOyApIHsKKyAgICAgICAgYXV0byByZXRhaW5lZFBhdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBwYXRjaGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChhdWRpb19wYXRjaGVzX2FyZV9lcXVhbChpdC0+cGF0Y2goKSwgJnBhdGNoZXNUb1JlbW92ZVtpXS0+bVBhdGNoKSkgeworICAgICAgICAgICAgICAgIHBhdGNoZXNUb1JlbW92ZS5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgICAgIHJldGFpbmVkUGF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChyZXRhaW5lZFBhdGNoKSB7CisgICAgICAgICAgICBpdCA9IHBhdGNoZXNUb0NyZWF0ZS5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBpZiAocGF0Y2hlc1RvQ3JlYXRlLnNpemUoKSA9PSAwICYmIHBhdGNoZXNUb1JlbW92ZS5zaXplKCkgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGZvciAoYXV0byBpID0gMHU7IGkgPCBwYXRjaGVzVG9SZW1vdmUuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgYXV0byAmY3VycmVudFBhdGNoID0gcGF0Y2hlc1RvUmVtb3ZlLnZhbHVlQXQoaSk7CiAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKGN1cnJlbnRQYXRjaC0+Z2V0SGFuZGxlKCksIG1VaWRDYWNoZWQpOwogICAgIH0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCi0gICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKLSAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOwotICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCi0gICAgICAgICAgICJkZXZpY2U6JXMgKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKLSAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiBwYXRjaGVzVG9DcmVhdGUpIHsKKyAgICAgICAgYXV0byBjdXJyU3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCAtMSAvKmluZGV4Ki8sIG51bGxwdHIgLypwYXRjaEhhbmRsZSovLAorICAgICAgICAgICAgICAgIHAucGF0Y2goKSwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICAgICAgY2hhciBtZXNzYWdlWzI1Nl07CisgICAgICAgIHNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgIiVzKCkgJXM6IGNyZWF0aW5nIE1TRCBwYXRjaCBmcm9tIGRldmljZTpJTl9CVVMgdG8gIgorICAgICAgICAgICAgImRldmljZTolI3ggKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgY3VyclN0YXR1cyA9PSBOT19FUlJPUiA/ICJTdWNjZXNzIiA6ICJFcnJvciIsCisgICAgICAgICAgICAgICAgcC5wYXRjaCgpLT5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUsIHAucGF0Y2goKS0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgICAgcC5wYXRjaCgpLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywgcC5wYXRjaCgpLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKGN1cnJTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyIsIG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3VyclN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZU1zZE91dHB1dFBhdGNoZXMoY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKSB7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbXNkUGF0Y2hlcyA9IGdldE1zZE91dHB1dFBhdGNoZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1zZFBhdGNoZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzOyArK2opIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2luayA9ICZwYXRjaC0+bVBhdGNoLnNpbmtzW2pdOworICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJiBkZXZpY2VzLmdldERldmljZShzaW5rLT5leHQuZGV2aWNlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc2luay0+ZXh0LmRldmljZS5hZGRyZXNzKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+Z2V0SGFuZGxlKCksIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9JTlZBTElEIHx8IGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSksCiAgICAgICAgICIlcyBjYWxsZWQgd2l0aCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAKKyAgICAvLyBSZXR1cm4gdGhlIG91dHB1dCB0aGF0IGhhcHRpYy1nZW5lcmF0aW5nIGF0dGFjaGVkIHRvIHdoZW4gMSkgc2Vzc2lvbiBpZCBpcyBzcGVjaWZpZWQsCisgICAgLy8gMikgaGFwdGljLWdlbmVyYXRpbmcgZWZmZWN0IGV4aXN0cyBmb3IgZ2l2ZW4gc2Vzc2lvbiBpZCBhbmQgMykgdGhlIG91dHB1dCB0aGF0CisgICAgLy8gaGFwdGljLWdlbmVyYXRpbmcgZWZmZWN0IGF0dGFjaGVkIHRvIGlzIGluIGdpdmVuIG91dHB1dHMuCisgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX05PTkUpIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFwdGljR2VuZXJhdGluZ091dHB1dCA9IG1FZmZlY3RzLmdldElvRm9yU2Vzc2lvbigKKyAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIEZYX0lJRF9IQVBUSUNHRU5FUkFUT1IpOworICAgICAgICBpZiAob3V0cHV0cy5pbmRleE9mKGhhcHRpY0dlbmVyYXRpbmdPdXRwdXQpID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBoYXB0aWNHZW5lcmF0aW5nT3V0cHV0OworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gRmxhZ3MgZGlzcXVhbGlmeWluZyBhbiBvdXRwdXQ6IHRoZSBtYXRjaCBtdXN0IGhhcHBlbiBiZWZvcmUgY2FsbGluZyBzZWxlY3RPdXRwdXQoKQogICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrRXhjbHVkZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKQEAgLTE3NjUsNyArMTkxMCw4IEBACiAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSwgMCAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnVzZUh3R2FpbigpIC8qZm9yY2UqLyk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwpAQCAtMTkxNCw3ICsyMDYwLDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKIApAQCAtMTkyNywzMyArMjA3Myw0OSBAQAogICAgICAgICAvLwogICAgICAgICAvLyBIZXJlIHdlIGp1c3QgbG9nIGEgd2FybmluZywgaW5zdGVhZCBvZiBhIGZhdGFsIGVycm9yLgogICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAKKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjLT5pc0NsaWVudEFjdGl2ZShjbGllbnQpKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW5hY3RpdmF0ZXMgcG9ydElkICVkIGluIGdvb2QgZmFpdGgiLCBwb3J0SWQpOworICAgICAgICBzdG9wT3V0cHV0KHBvcnRJZCk7CisgICAgfQorCiAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewogICAgICAgICBpZiAob3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSB7CiAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQotICAgIC8vIHN0b3BPdXRwdXQoKSBuZWVkcyB0byBiZSBzdWNjZXNzZnVsbHkgY2FsbGVkIGJlZm9yZSByZWxlYXNlT3V0cHV0KCkKLSAgICAvLyBvdGhlcndpc2UgdGhlcmUgbWF5IGJlIGluYWNjdXJhdGUgc3RyZWFtIHJlZmVyZW5jZSBjb3VudHMuCi0gICAgLy8gVGhpcyBpcyBjaGVja2VkIGluIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudCBiZWxvdy4KKwogICAgIG91dHB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjLT5tUGVuZGluZ1Jlb3BlblRvUXVlcnlQcm9maWxlcyAmJiBvdXRwdXREZXNjLT5nZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgLy8gVGhlIG91dHB1dCBpcyBwZW5kaW5nIHJlb3BlbmVkIHRvIHF1ZXJ5IGR5bmFtaWMgcHJvZmlsZXMgYW5kCisgICAgICAgIC8vIHRoZXJlIGlzIG5vIGFjdGl2ZSBjbGllbnRzCisgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBuZXdPdXRwdXREZXNjID0gb3Blbk91dHB1dFdpdGhQcm9maWxlQW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qcm9maWxlLCBtRW5naW5lLT5nZXRBY3RpdmVNZWRpYURldmljZXMobUF2YWlsYWJsZU91dHB1dERldmljZXMpKTsKKyAgICAgICAgaWYgKG5ld091dHB1dERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCB0byBvcGVuIG91dHB1dCIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLApAQCAtMTk3Miw2ICsyMTM0LDcgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjOwogICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2M7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWREZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICBib29sIGlzU291bmRUcmlnZ2VyOwogCiAgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKQEAgLTIwMjgsNyArMjE5MSw3IEBACiAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwogICAgICAgICBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogCi0gICAgICAgIEFMT0dJKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgIEFMT0dWKCIlcyByZXVzaW5nIE1NQVAgaW5wdXQgJWQgZm9yIHNlc3Npb24gJWQiLCBfX0ZVTkNUSU9OX18sICppbnB1dCwgc2Vzc2lvbik7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKQEAgLTIwNjYsMTQgKzIyMjksMTggQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCiAgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CisgICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgdWlkLCAmcG9saWN5TWl4KTsKKyAgICAgICAgICAgIEFMT0dWX0lGKGRldmljZSAhPSBudWxscHRyLCAiJXMgZm91bmQgZGV2aWNlIHR5cGUgaXMgMHglWCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UtPnR5cGUoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIGlmIChwb2xpY3lNaXgpIHsKKyAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSkgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfQ0FQVFVSRTsKKyAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgpIHsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTLCAiSW52YWxpZCBNaXggVHlwZSIpOwogICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCiAgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKQEAgLTIxODIsNiArMjM0OSwyMSBAQAogICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgfQogCisgICAgLy8gUmV1c2UgYW4gYWxyZWFkeSBvcGVuZWQgaW5wdXQgaWYgYSBjbGllbnQgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGFscmVhZHkgZXhpc3RzCisgICAgLy8gb24gdGhhdCBpbnB1dAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGkpOwpAQCAtMjI1Niw3ICsyNDM4LDcgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOwogICAgIGlmIChpbnB1dERlc2MgPT0gMCkgewogICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CkBAIC0yMzQ5LDEyICsyNTMxLDE0IEBACiAgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KKyAgICBhdXRvIG9sZF9zb3VyY2UgPSBpbnB1dERlc2MtPnNvdXJjZSgpOwogICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCiAgICAgaW5wdXREZXNjLT5zdG9wKCk7CiAgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgewotICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOworICAgICAgICBhdXRvIGN1cnJlbnRfc291cmNlID0gaW5wdXREZXNjLT5zb3VyY2UoKTsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksCisgICAgICAgICAgICAgICAgb2xkX3NvdXJjZSAhPSBjdXJyZW50X3NvdXJjZSAvKiBmb3JjZSAqLyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IGlucHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CiAgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCkBAIC0yNDUwLDcgKzI2MzQsNyBAQAogICAgICAgICAgICAgYm9vbCBjbG9zZSA9IGZhbHNlOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dC0+Y2xpZW50c0xpc3QoKSkgewogICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSwgY2xpZW50LT51aWQoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dC0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3NzgsNyArMjk2Miw3IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCiB7CkBAIC0zMDgzLDE2ICszMjY3LDE2IEBACiAKIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgZGV2aWNlcyB0eXBlcyBtYXRjaCB0aGUgcHJlZGljYXRlIGFuZCBhcmUgc3VwcG9ydGVkIGJ5IG9uZSBIVyBtb2R1bGUKIGJvb2wgIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXJlQWxsRGV2aWNlc1N1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAogICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woYXVkaW9fZGV2aWNlc190KT4gcHJlZGljYXRlLAogICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0KSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5jX3N0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5nZXRBZGRyZXNzKCksIFN0cmluZzgoKSwKICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwgZmFsc2UgLyphbGxvd1RvQ3JlYXRlKi8sIHRydWUgLyptYXRjaEFkZHJlc3MqLyk7CiAgICAgICAgIGlmIChkZXZEZXNjID09IG51bGxwdHIgfHwgKHByZWRpY2F0ZSAhPSBudWxscHRyICYmICFwcmVkaWNhdGUoZGV2aWNlc1tpXS5tVHlwZSkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGRldmljZSB0eXBlICUjeCBhZGRyZXNzICVzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IGFuIG91dHB1dCBkZXZpY2UiLAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgdHlwZSAlI3ggYWRkcmVzcyAlcyBub3Qgc3VwcG9ydGVkIG9yIG5vdCBtYXRjaCBwcmVkaWNhdGUiLAorICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLmdldEFkZHJlc3MoKSk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTAwLDcgKzMyODQsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcykgewogICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOwogICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19pc19vdXRwdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTMxMzIsMjUgKzMzMTYsMzUgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgewotICAgIEFMT0dWKCIlcygpIHN0cmF0ZWd5PSVkIGRldmljZT0lMDh4IGFkZHI9JXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBzdHJhdGVneSwgZGV2aWNlLm1UeXBlLCBkZXZpY2UubUFkZHJlc3MuY19zdHIoKSk7CiAKLSAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKLSAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIHN0cmF0ZWd5PSVkIHJvbGU9JWQgJXMiLCBfX2Z1bmNfXywgc3RyYXRlZ3ksIHJvbGUsCisgICAgICAgICAgICBkdW1wQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvcihkZXZpY2VzKS5jX3N0cigpKTsKKwogICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19pc19vdXRwdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+c2V0RGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiRW5naW5lIGNvdWxkIG5vdCBzZXQgcHJlZmVycmVkIGRldmljZSAlMDh4ICVzIGZvciBzdHJhdGVneSAlZCIsCi0gICAgICAgICAgICAgICAgZGV2aWNlLm1UeXBlLCBkZXZpY2UubUFkZHJlc3MuY19zdHIoKSwgc3RyYXRlZ3kpOworICAgICAgICBBTE9HVygiRW5naW5lIGNvdWxkIG5vdCBzZXQgcHJlZmVycmVkIGRldmljZXMgJXMgZm9yIHN0cmF0ZWd5ICVkIHJvbGUgJWQiLAorICAgICAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCksIHN0cmF0ZWd5LCByb2xlKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKLSAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZygpOworCisgICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOworICAgIC8vIEZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCisgICAgLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCisgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7CisgICAgaWYgKHN0cmF0ZWd5ID09IG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5KSB7CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgZGVsYXlNcyA9IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TOworICAgICAgICB1cGRhdGVJbnB1dFJvdXRpbmcoKTsKKyAgICB9CisgICAgdXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoZm9yY2VWb2x1bWVSZWV2YWwsIGRlbGF5TXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMzE1OCw5ICszMzUyLDkgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsLCB1aW50MzJfdCBkZWxheU1zKQogewogICAgIHVpbnQzMl90IHdhaXRNcyA9IDA7Ci0gICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgd2FpdE1zID0gdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcywgZGVsYXlNcyk7CisgICAgaWYgKHVwZGF0ZUNhbGxSb3V0aW5nKHRydWUgLypmcm9tQ2FjaGUqLywgZGVsYXlNcywgJndhaXRNcykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gT25seSBhcHBseSBzcGVjaWFsIHRvdWNoIHNvdW5kIGRlbGF5IG9uY2UKKyAgICAgICAgZGVsYXlNcyA9IDA7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwpAQCAtMzE3MCw2ICszMzY0LDggQEAKICAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KICAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCiAgICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CisgICAgICAgICAgICAvLyBPbmx5IGFwcGx5IHNwZWNpYWwgdG91Y2ggc291bmQgZGVsYXkgb25jZQorICAgICAgICAgICAgZGVsYXlNcyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmICFuZXdEZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZXMudHlwZXMoKSwgd2FpdE1zLCB0cnVlKTsKQEAgLTMxNzcsMzAgKzMzNzMsMTI5IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkKLXsKLSAgICBBTE9HSSgiJXMoKSBzdHJhdGVneT0lZCIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3kpOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUlucHV0Um91dGluZygpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CisgICAgICAgIC8vIFNraXAgZm9yIGhvdHdvcmQgcmVjb3JkaW5nIGFzIHRoZSBpbnB1dCBkZXZpY2Ugc3dpdGNoCisgICAgICAgIC8vIGlzIGhhbmRsZWQgd2l0aGluIHNvdW5kIHRyaWdnZXIgSEFMCisgICAgICAgIGlmIChhY3RpdmVEZXNjLT5pc1NvdW5kVHJpZ2dlcigpICYmIGFjdGl2ZURlc2MtPnNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOworICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAorICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhuZXdEZXZpY2UpKSB7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIG5ld0RldmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbG9zZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5yZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkKK3sKKyAgICBBTE9HVigiJXMoKSBzdHJhdGVneT0lZCByb2xlPSVkIiwgX19mdW5jX18sIHN0cmF0ZWd5LCByb2xlKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3QgcmVtb3ZlIHByZWZlcnJlZCBkZXZpY2UgZm9yIHN0cmF0ZWd5ICVkIiwgc3RyYXRlZ3kpOworICAgICAgICBBTE9HVigiRW5naW5lIGNvdWxkIG5vdCByZW1vdmUgcHJlZmVycmVkIGRldmljZSBmb3Igc3RyYXRlZ3kgJWQgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBzdHJhdGVneSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKLSAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZygpOworCisgICAgYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCA9IGZhbHNlOworICAgIC8vIEZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCisgICAgLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCisgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7CisgICAgaWYgKHN0cmF0ZWd5ID09IG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5KSB7CisgICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKKyAgICAgICAgZGVsYXlNcyA9IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TOworICAgICAgICB1cGRhdGVJbnB1dFJvdXRpbmcoKTsKKyAgICB9CisgICAgdXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoZm9yY2VWb2x1bWVSZWV2YWwsIGRlbGF5TXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgewotICAgIHJldHVybiBtRW5naW5lLT5nZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpIHsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneShzdHJhdGVneSwgcm9sZSwgZGV2aWNlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgYXVkaW9Tb3VyY2U9JWQgcm9sZT0lZCAlcyIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSwgcm9sZSwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCkpOworCisgICAgaWYgKCFhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKGRldmljZXMsIGF1ZGlvX2NhbGxfaXNfaW5wdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAiRW5naW5lIGNvdWxkIG5vdCBzZXQgcHJlZmVycmVkIGRldmljZXMgJXMgZm9yIGF1ZGlvIHNvdXJjZSAlZCByb2xlICVkIiwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCksIGF1ZGlvU291cmNlLCByb2xlKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgYXVkaW9Tb3VyY2U9JWQgcm9sZT0lZCAlcyIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSwgcm9sZSwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCkpOworCisgICAgaWYgKCFhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKGRldmljZXMsIGF1ZGlvX2NhbGxfaXNfaW5wdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+YWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKTsKKyAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAiRW5naW5lIGNvdWxkIG5vdCBhZGQgcHJlZmVycmVkIGRldmljZXMgJXMgZm9yIGF1ZGlvIHNvdXJjZSAlZCByb2xlICVkIiwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCksIGF1ZGlvU291cmNlLCByb2xlKTsKKworICAgIHVwZGF0ZUlucHV0Um91dGluZygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzKQoreworICAgIEFMT0dWKCIlcygpIGF1ZGlvU291cmNlPSVkIHJvbGU9JWQgZGV2aWNlcz0lcyIsIF9fZnVuY19fLCBhdWRpb1NvdXJjZSwgcm9sZSwKKyAgICAgICAgICAgIGR1bXBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yKGRldmljZXMpLmNfc3RyKCkpOworCisgICAgaWYgKCFhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKGRldmljZXMsIGF1ZGlvX2NhbGxfaXNfaW5wdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CisgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAorICAgICAgICAgICAgIkVuZ2luZSBjb3VsZCBub3QgcmVtb3ZlIGRldmljZXMgcm9sZSAoJWQpIGZvciBjYXB0dXJlIHByZXNldCAlZCIsIHJvbGUsIGF1ZGlvU291cmNlKTsKKworICAgIHVwZGF0ZUlucHV0Um91dGluZygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSkgeworICAgIEFMT0dWKCIlcygpIGF1ZGlvU291cmNlPSVkIHJvbGU9JWQiLCBfX2Z1bmNfXywgYXVkaW9Tb3VyY2UsIHJvbGUpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUVuZ2luZS0+Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUpOworICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICJFbmdpbmUgY291bGQgbm90IGNsZWFyIGRldmljZXMgcm9sZSAoJWQpIGZvciBjYXB0dXJlIHByZXNldCAlZCIsIHJvbGUsIGF1ZGlvU291cmNlKTsKKworICAgIHVwZGF0ZUlucHV0Um91dGluZygpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAorICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwgZGV2aWNlX3JvbGVfdCByb2xlLCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKSB7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkLAotICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKLSAgICBBTE9HSSgiJXMoKSB1c2VySWQ9JWQgbnVtIGRldmljZXMgJXp1IiwgX19GVU5DVElPTl9fLCB1c2VySWQsIGRldmljZXMuc2l6ZSgpKTtcCisgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpIHsKKyAgICBBTE9HVigiJXMoKSB1c2VySWQ9JWQgbnVtIGRldmljZXMgJXp1IiwgX19mdW5jX18sIHVzZXJJZCwgZGV2aWNlcy5zaXplKCkpOwogICAgIGlmICghYXJlQWxsRGV2aWNlc1N1cHBvcnRlZChkZXZpY2VzLCBhdWRpb19pc19vdXRwdXRfZGV2aWNlLCBfX2Z1bmNfXykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CkBAIC0zMjE5LDcgKzM1MTQsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCkgewotICAgIEFMT0dJKCIlcygpIHVzZXJJZD0lZCIsIF9fRlVOQ1RJT05fXywgdXNlcklkKTsKKyAgICBBTE9HVigiJXMoKSB1c2VySWQ9JWQiLCBfX0ZVTkNUSU9OX18sIHVzZXJJZCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeU1peGVzLnJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCIlcygpIENvdWxkIG5vdCByZW1vdmUgYWxsIGRldmljZSBhZmZpbml0aWVzIGZvIHVzZXJJZCA9ICVkIiwKQEAgLTMyNTksNyArMzU1NCw5IEBACiAgICAgfQogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29tbXVubmljYXRpb24gU3RyYXRlZ3k6ICVkXG4iLCBtQ29tbXVubmljYXRpb25TdHJhdGVneSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDb25maWcgc291cmNlOiAlc1xuIiwgbUNvbmZpZy5nZXRTb3VyY2UoKS5jX3N0cigpKTsgLy8gZ2V0Q29uZmlnIG5vdCBjb25zdAorCiAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7CiAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIGlucHV0IikpOwogICAgIG1Id01vZHVsZXNBbGwuZHVtcChkc3QpOwpAQCAtMzI5NiwzOCArMzU5MywzOCBAQAogLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCiAvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5CiAvLyBvZiB0aGUgc3lzdGVtLgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCithdWRpb19vZmZsb2FkX21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykKIHsKLSAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBTUj0ldSwgQ009MHgleCwgRm9ybWF0PTB4JXgsIFN0cmVhbVR5cGU9JWQsIgorICAgIEFMT0dWKCIlczogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKICAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lIiBQUklkNjQgIiB1cywgaGFzX3ZpZGVvPSVkIiwKLSAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKKyAgICAgX19mdW5jX18sIG9mZmxvYWRJbmZvLnNhbXBsZV9yYXRlLCBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCiAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUsIG9mZmxvYWRJbmZvLmJpdF9yYXRlLCBvZmZsb2FkSW5mby5kdXJhdGlvbl91cywKICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvKTsKIAogICAgIGlmIChtTWFzdGVyTW9ubykgewotICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIG9mZmxvYWRpbmcgaWYgbW9ubyBpcyBzZXQuCisgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7IC8vIG5vIG9mZmxvYWRpbmcgaWYgbW9ubyBpcyBzZXQuCiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAogICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKLSAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQUxPR1YoIiVzOiBvZmZsb2FkIGRpc2FibGVkIGJ5IGF1ZGlvLm9mZmxvYWQuZGlzYWJsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgogICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCiAgICAgewotICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwogICAgIH0KIAogICAgIC8vVE9ETzogZW5hYmxlIGF1ZGlvIG9mZmxvYWRpbmcgd2l0aCB2aWRlbyB3aGVuIHJlYWR5CiAgICAgY29uc3QgYm9vbCBhbGxvd09mZmxvYWRXaXRoVmlkZW8gPQogICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woImF1ZGlvLm9mZmxvYWQudmlkZW8iLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKICAgICBpZiAob2ZmbG9hZEluZm8uaGFzX3ZpZGVvICYmICFhbGxvd09mZmxvYWRXaXRoVmlkZW8pIHsKLSAgICAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIEFMT0dWKCIlczogaGFzX3ZpZGVvID09IHRydWUsIHJldHVybmluZyBmYWxzZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX09GRkxPQURfTk9UX1NVUFBPUlRFRDsKICAgICB9CiAKICAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQpAQCAtMzMzNSwxMyArMzYzMiwxNCBAQAogICAgICAgICAgICAgImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCAtMSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKICAgICBpZiAobWluX2R1cmF0aW9uX3NlY3MgPj0gMCkgewogICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBtaW5fZHVyYXRpb25fc2VjcyAqIDEwMDAwMDBMTCkgewotICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgbWluX2R1cmF0aW9uX3NlY3MpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtaW5fZHVyYXRpb25fc2Vjcyk7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyAqIDEwMDAwMDApIHsKLSAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgZGVmYXVsdCBtaW4oPSV1KSIsIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgQUxPR1YoIiVzOiBPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEOwogICAgIH0KIAogICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQpAQCAtMzM1MSw3ICszNjQ5LDcgQEAKICAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKICAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KICAgICBpZiAobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCkBAIC0zMzYyLDggKzM2NjAsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOwotICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7Ci0gICAgcmV0dXJuIChwcm9maWxlICE9IDApOworICAgIEFMT0dWKCIlczogcHJvZmlsZSAlc2ZvdW5kJXMiLCBfX2Z1bmNfXywgcHJvZmlsZSAhPSBudWxscHRyID8gIiIgOiAiTk9UICIsCisgICAgICAgICAgICAocHJvZmlsZSAhPSBudWxscHRyICYmIChwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfR0FQTEVTU19PRkZMT0FEKSAhPSAwKQorICAgICAgICAgICAgPyAiLCBzdXBwb3J0cyBnYXBsZXNzIiA6ICIiKTsKKyAgICBpZiAocHJvZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19PRkZMT0FEX05PVF9TVVBQT1JURUQ7CisgICAgfQorICAgIGlmICgocHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0dBUExFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fT0ZGTE9BRF9HQVBMRVNTX1NVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIEFVRElPX09GRkxPQURfU1VQUE9SVEVEOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLApAQCAtMzM4NywxNSArMzY5MywxNSBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKIHsKLSAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAotICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgaWYgKG51bV9wb3J0cyA9PSBudWxscHRyIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOwotICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7CisgICAgaWYgKHBvcnRzID09IG51bGxwdHIpIHsKICAgICAgICAgKm51bV9wb3J0cyA9IDA7CiAgICAgfQogCkBAIC0zNDUzLDcgKzM3NTksNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCkKIHsKICAgICBpZiAocG9ydCA9PSBudWxscHRyIHx8IHBvcnQtPmlkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTM2NjUsNiArMzk3MSwxNSBAQAogICAgICAgICAgICAgLy8gYmUgaW5jb21wbGV0ZS4KICAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2VQb3J0Q29uZmlnID0ge307CisKKyAgICAgICAgICAgIC8vIGlmIGZpcnN0IHNpbmsgaXMgdG8gTVNELCBlc3RhYmxpc2ggc2luZ2xlIE1TRCBwYXRjaAorICAgICAgICAgICAgaWYgKGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpLmNvbnRhaW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHBhdGNoaW5nIHRvIE1TRCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcGF0Y2hCdWlsZGVyID0gYnVpbGRNc2RQYXRjaChmYWxzZSAvKm1zZElzU291cmNlKi8sIHNyY0RldmljZSk7CisgICAgICAgICAgICAgICAgZ290byBpbnN0YWxsUGF0Y2g7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHNyY0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJnNvdXJjZVBvcnRDb25maWcsICZwYXRjaC0+c291cmNlc1swXSk7CiAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKHNvdXJjZVBvcnRDb25maWcpOwogCkBAIC0zNjgyLDYgKzM5OTcsNDEgQEAKICAgICAgICAgICAgICAgICBzaW5rRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZygmc2lua1BvcnRDb25maWcsICZwYXRjaC0+c2lua3NbaV0pOwogICAgICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKHNpbmtQb3J0Q29uZmlnKTsKIAorICAgICAgICAgICAgICAgIC8vIFdoYXRldmVyIFN3IG9yIEh3IGJyaWRnZSwgd2UgZG8gYXR0YWNoIGFuIFN3T3V0cHV0IHRvIGFuIEF1ZGlvIFNvdXJjZSBmb3IKKyAgICAgICAgICAgICAgICAvLyB2b2x1bWUgbWFuYWdlbWVudCBwdXJwb3NlICh0cmFja2luZyBhY3Rpdml0eSkKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIEh3IGJyaWRnZSwgaXQgaXMgYSBXb3JrIEFyb3VuZC4gVGhlIG1peFBvcnQgdXNlZCBpcyB0aGUgb25lIGRlY2xhcmVkCisgICAgICAgICAgICAgICAgLy8gaW4gY29uZmlnIFhNTCB0byByZWFjaCB0aGUgc2luayBzbyB0aGF0IGlzIGNhbiBiZSBkZWNsYXJlZCBhcyBhdmFpbGFibGUuCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIGR5bmFtaWMgcm91dGluZyBmb3IgU3dPdXRwdXQgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzb3VyY2VEZXNjLT5zdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc291cmNlRGVzYy0+Y29uZmlnKCkuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZV90IG91dHB1dFR5cGU7CisgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwgc291cmNlRGVzYy0+dWlkKCksICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG5vIG91dHB1dCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgb3V0cHV0IGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQob3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMApAQCAtMzY5Nyw0OSArNDA0NywyNSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIGR5bmFtaWMgcm91dGluZyBmb3IgU3dPdXRwdXQgc2VsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlX3Qgb3V0cHV0VHlwZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZvdXRwdXRUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHZpYSB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICVzIGlzIGR1cGxpY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlcyBpcyBkdXBsaWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNyY01peFBvcnRDb25maWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzcmNNaXhQb3J0Q29uZmlnLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnNldFN3T3V0cHV0KG91dHB1dERlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHZvbHVtZSBjb250cm9sLCB3ZSBtYXkgbmVlZCBhIHZhbGlkIHN0cmVhbQogICAgICAgICAgICAgICAgICAgICAgICAgc3JjTWl4UG9ydENvbmZpZy5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gc291cmNlRGVzYyAhPSBudWxscHRyID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZURlc2MtPnN0cmVhbSgpIDogQVVESU9fU1RSRUFNX1BBVENIOwpAQCAtMzc0OSw2ICs0MDc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKIAoraW5zdGFsbFBhdGNoOgogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAogICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGluZGV4LCBoYW5kbGUsIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBkZWxheU1zLCB1aWQsICZwYXRjaERlc2MpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMzgzMCw4ICs0MTU3LDkgQEAKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMV0uaWQpOwogICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZU91dHB1dCBoYXMgYWxyZWFkeSBjYWxsZWQgY2xvc2VPdXB1dCBpbiBjYXNlIG9mIGRpcmVjdCBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5nZXRIYW5kbGUoKSAhPSBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIFN3T3V0cHV0IHBhdGNoIHJlbW92YWwgYXMgQUYgY291bnRlciBwYXJ0IHBhdGNoIGhhcyBhbHJlYWR5IGdvbmUuCkBAIC00MDk3LDE1ICs0NDI1LDE5IEBACiAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogCiAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0gc291cmNlRGVzYy0+c3JjRGV2aWNlKCk7Ci0KKyAgICAvLyBNYXkgdGhlIGRldmljZSAoZHluYW1pYykgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZC9yZWNvbm5lY3RlZCwgaWQgaGFzIGNoYW5nZWQuCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPnR5cGUoKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZURlc2MtPnNyY0RldmljZSgpLT5hZGRyZXNzKCkuY19zdHIoKSksCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgIERldmljZVZlY3RvciBzaW5rRGV2aWNlcyA9Ci0gICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgIEFMT0dfQVNTRVJUKCFzaW5rRGV2aWNlcy5pc0VtcHR5KCksICJjb25uZWN0QXVkaW9Tb3VyY2UoKTogbm8gZGV2aWNlIGZvdW5kIGZvciBhdHRyaWJ1dGVzIik7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IHNpbmtEZXZpY2VzLml0ZW1BdCgwKTsKLSAgICBBTE9HX0FTU0VSVChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzaW5rRGV2aWNlKSwgIiVzOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwotCisgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzaW5rRGV2aWNlKSkgeworICAgICAgICBBTE9HRSgiJXMgRGV2aWNlICVzIG5vdCBhdmFpbGFibGUiLCBfX2Z1bmNfXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOwogICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKHNpbmtEZXZpY2UpLmFkZFNvdXJjZShzcmNEZXZpY2UpOwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwpAQCAtNDExNSw3ICs0NDQ3LDcgQEAKICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBzb3VyY2VEZXNjLT5zZXRQYXRjaEhhbmRsZShoYW5kbGUpOworICAgIHNvdXJjZURlc2MtPmNvbm5lY3QoaGFuZGxlLCBzaW5rRGV2aWNlKTsKICAgICAvLyBTVyBCcmlkZ2U/IChAdG9kbzogSFcgYnJpZGdlLCBrZWVwIHRyYWNrIG9mIEh3T3V0cHV0IGZvciBkZXZpY2Ugc2VsZWN0aW9uICJyZWNvbnNpZGVyYXRpb24iKQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOwogICAgIGlmIChzd091dHB1dCAhPSAwKSB7CkBAIC00MjE3LDU0ICs0NTQ5LDI4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCkKIHsKLSAgICBpZiAobnVtU3Vycm91bmRGb3JtYXRzID09IE5VTEwgfHwgKCpudW1TdXJyb3VuZEZvcm1hdHMgIT0gMCAmJgotICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CisgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0cyA9PSBudWxscHRyIHx8ICgqbnVtU3Vycm91bmRGb3JtYXRzICE9IDAgJiYKKyAgICAgICAgICAgIChzdXJyb3VuZEZvcm1hdHMgPT0gbnVsbHB0ciB8fCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkID09IG51bGxwdHIpKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiJXMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAgcmVwb3J0ZWQgJWQiLAotICAgICAgICAgICAgX19mdW5jX18sICpudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOworICAgIEFMT0dWKCIlcygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKIAogICAgIHNpemVfdCBmb3JtYXRzV3JpdHRlbiA9IDA7CiAgICAgc2l6ZV90IGZvcm1hdHNNYXggPSAqbnVtU3Vycm91bmRGb3JtYXRzOwotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsgLy8gVXNlcyBwcmltYXJ5IHN1cnJvdW5kIGZvcm1hdHMgb25seQotICAgIGlmIChyZXBvcnRlZCkgewotICAgICAgICAvLyBSZXR1cm4gZm9ybWF0cyBmcm9tIGFsbCBkZXZpY2UgcHJvZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBieQotICAgICAgICAvLyBjaGVja091dHB1dHNGb3JEZXZpY2UoKS4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07Ci0gICAgICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0cyA9Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKS5nZXRTdXBwb3J0ZWRGb3JtYXRzKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHN1cHBvcnRlZEZvcm1hdHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHN1cHBvcnRlZEZvcm1hdHNbal0pOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLnNlY29uZC5jb3VudChzdXBwb3J0ZWRGb3JtYXRzW2pdKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmluc2VydChwYWlyLmZpcnN0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gZm9ybWF0cy5zaXplKCk7CisKKyAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKS5zaXplKCk7CiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAogICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdDogZm9ybWF0cykgeworICAgIGZvciAoY29uc3QgYXV0byYgZm9ybWF0OiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CiAgICAgICAgIGlmIChmb3JtYXRzV3JpdHRlbiA8IGZvcm1hdHNNYXgpIHsKLSAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c1tmb3JtYXRzV3JpdHRlbl0gPSBmb3JtYXQ7CisgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNbZm9ybWF0c1dyaXR0ZW5dID0gZm9ybWF0LmZpcnN0OwogICAgICAgICAgICAgYm9vbCBmb3JtYXRFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgIHN3aXRjaCAoZm9yY2VVc2UpIHsKICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTDoKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY291bnQoZm9ybWF0KSAhPSAwOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5jb3VudChmb3JtYXQuZmlyc3QpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVI6CiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKQEAgLTQyNzgsNiArNDU4NCw2MCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cykgeworICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPT0gbnVsbHB0ciB8fCAoKm51bVN1cnJvdW5kRm9ybWF0cyAhPSAwICYmIHN1cnJvdW5kRm9ybWF0cyA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCAqbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMpOworCisgICAgc2l6ZV90IGZvcm1hdHNXcml0dGVuID0gMDsKKyAgICBzaXplX3QgZm9ybWF0c01heCA9ICpudW1TdXJyb3VuZEZvcm1hdHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOyAvLyBVc2VzIHByaW1hcnkgc3Vycm91bmQgZm9ybWF0cyBvbmx5CisKKyAgICAvLyBSZXR1cm4gZm9ybWF0cyBmcm9tIGFsbCBkZXZpY2UgcHJvZmlsZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZXNvbHZlZCBieQorICAgIC8vIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZGV2aWNlLT50eXBlKCk7CisgICAgICAgIC8vIEVuYWJsaW5nL2Rpc2FibGluZyBmb3JtYXRzIGFyZSBhcHBsaWVkIHRvIG9ubHkgSERNSSBkZXZpY2VzLiBTbywgdGhpcyBmdW5jdGlvbgorICAgICAgICAvLyByZXR1cm5zIGZvcm1hdHMgcmVwb3J0ZWQgYnkgSERNSSBkZXZpY2VzLgorICAgICAgICBpZiAoZGV2aWNlVHlwZSAhPSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEZvcm1hdHMgcmVwb3J0ZWQgYnkgc2luayBkZXZpY2VzCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0c2V0OworICAgICAgICBpZiAoYXV0byBpdCA9IG1SZXBvcnRlZEZvcm1hdHNNYXAuZmluZChkZXZpY2UpOyBpdCAhPSBtUmVwb3J0ZWRGb3JtYXRzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBmb3JtYXRzZXQuaW5zZXJ0KGl0LT5zZWNvbmQuYmVnaW4oKSwgaXQtPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JtYXRzIGhhcmQtY29kZWQgaW4gdGhlIGluIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgKGlmIGFueSkuCisgICAgICAgIEZvcm1hdFZlY3RvciBlbmNvZGVkRm9ybWF0cyA9IGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKTsKKyAgICAgICAgZm9ybWF0c2V0Lmluc2VydChlbmNvZGVkRm9ybWF0cy5iZWdpbigpLCBlbmNvZGVkRm9ybWF0cy5lbmQoKSk7CisgICAgICAgIC8vIEZpbHRlciB0aGUgZm9ybWF0cyB3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSB2ZW5kb3IgaGFyZHdhcmUuCisgICAgICAgIGZvciAoYXV0byBpdCA9IGZvcm1hdHNldC5iZWdpbigpOyBpdCAhPSBmb3JtYXRzZXQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmNvdW50KCppdCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KCppdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIuc2Vjb25kLmNvdW50KCppdCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gZm9ybWF0cy5zaXplKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQ6IGZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGZvcm1hdHNXcml0dGVuIDwgZm9ybWF0c01heCkgeworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuKytdID0gZm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKICAgICBBTE9HVigiJXMoKSBmb3JtYXQgMHglWCBlbmFibGVkICVkIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKQEAgLTQzOTgsMTMgKzQ3NTgsMjEgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewogICAgIEFMT0dWKCIlcyBwb3J0IElkICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgaWYgKCFzb3VyY2VEZXNjLT5pc0Nvbm5lY3RlZCgpKSB7CisgICAgICAgIEFMT0dWKCIlcyBwb3J0IElkICVkIGFscmVhZHkgZGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgaWYgKHN3T3V0cHV0ICE9IDApIHsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dCwgc291cmNlRGVzYyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3T3V0cHV0LT5zdG9wKCk7CiAgICAgICAgIH0KLSAgICAgICAgcmVsZWFzZU91dHB1dChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgIGlmIChyZWxlYXNlT3V0cHV0KHNvdXJjZURlc2MtPnBvcnRJZCgpKSkgeworICAgICAgICAgICAgLy8gVGhlIG91dHB1dCBkZXNjcmlwdG9yIGlzIHJlb3BlbmVkIHRvIHF1ZXJ5IGR5bmFtaWMgcHJvZmlsZXMuIEluIHRoYXQgY2FzZSwgdGhlcmUgaXMKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcmVsZWFzZSBhdWRpbyBwYXRjaCBoZXJlIGJ1dCBqdXN0IHJldHVybiBOT19FUlJPUi4KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5od091dHB1dCgpLnByb21vdGUoKTsKICAgICAgICAgaWYgKGh3T3V0cHV0RGVzYyAhPSAwKSB7CkBAIC00NDEzLDcgKzQ3ODEsOSBAQAogICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbmVpdGhlciBTVyBub3IgSFcgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKHNvdXJjZURlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHNvdXJjZURlc2MtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dCgKQEAgLTQ0NDEsMzcgKzQ4MTEsMTUgQEAKIH0KIAogc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lYbWxDb25maWcoQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykgewotICAgIGNoYXIgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlW0FVRElPX1BPTElDWV9YTUxfQ09ORklHX0ZJTEVfUEFUSF9NQVhfTEVOR1RIXTsKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gZmlsZU5hbWVzOwotICAgIHN0YXR1c190IHJldDsKLQotICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5ibHVldG9vdGhfYXVkaW9faGFsLmRpc2FibGVkIiwgZmFsc2UpICYmCi0gICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAvLyBCb3RoIEJsdWV0b290aEF1ZGlvQDIuMCBhbmQgQmx1ZXRvb3RoQTJkcEAxLjAgKE9mZmxhb2QpIGFyZSBkaXNhYmxlZCwgYW5kIHVzZXMKLSAgICAgICAgICAgIC8vIHRoZSBsZWdhY3kgaGFyZHdhcmUgbW9kdWxlIGZvciBBMkRQIGFuZCBoZWFyaW5nIGFpZC4KLSAgICAgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKLSAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCi0gICAgICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUpOworICAgIGlmIChzdGQ6OnN0cmluZyBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUgPSBhdWRpb19nZXRfYXVkaW9fcG9saWN5X2NvbmZpZ19maWxlKCk7CisgICAgICAgICAgICAhYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLmVtcHR5KCkpIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLmNfc3RyKCksICZjb25maWcpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjb25maWcuc2V0U291cmNlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5ibHVldG9vdGhfYXVkaW9faGFsLmRpc2FibGVkIiwgZmFsc2UpKSB7Ci0gICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgZmlsZU5hbWVzLnB1c2hfYmFjayhBVURJT19QT0xJQ1lfWE1MX0NPTkZJR19GSUxFX05BTUUpOwotCi0gICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiBhdWRpb19nZXRfY29uZmlndXJhdGlvbl9wYXRocygpKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwgcGF0aC5jX3N0cigpLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsICZjb25maWcpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2UoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwKQEAgLTQ1MjYsNiArNDg3NCw5IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpOworCiAgICAgLy8gYWZ0ZXIgcGFyc2luZyB0aGUgY29uZmlnLCBtT3V0cHV0RGV2aWNlc0FsbCBhbmQgbUlucHV0RGV2aWNlc0FsbCBjb250YWluIGFsbCBrbm93biBkZXZpY2VzOwogICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwogICAgIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlSW50KG51bGxwdHIgLypuZXdEZXZpY2VzKi8pOwpAQCAtNDU0NywxMCArNDg5OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gcHJpbWFyeSBvdXRwdXQiKTsKLSAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICB9CisgICAgQUxPR1dfSUYobVByaW1hcnlPdXRwdXQgPT0gbnVsbHB0ciwgIlRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBkZWNsYXJlIGEgcHJpbWFyeSBvdXRwdXQiKTsKIAogICAgIC8vIFNpbGVuY2UgQUxPR1Ygc3RhdGVtZW50cwogICAgIHByb3BlcnR5X3NldCgibG9nLnRhZy4iIExPR19UQUcsICJEIik7CkBAIC00NjYwLDcgKzUwMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICBzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKKyAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSBudWxscHRyICYmCiAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CiAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOwogICAgICAgICAgICAgfQpAQCAtNDY5Miw3ICs1MDQwLDggQEAKICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmc3VwcG9ydGVkRGV2aWNlcyA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOwogICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsUHJvZmlsZURldmljZXMgPSBzdXBwb3J0ZWREZXZpY2VzLmZpbHRlcihtSW5wdXREZXZpY2VzQWxsKTsKICAgICAgICAgICAgIGlmIChhdmFpbFByb2ZpbGVEZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW5wdXQgZGV2aWNlIGxpc3QgaXMgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IElucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISBmb3IgcHJvZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpblByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPQpAQCAtNDczNyw2ICs1MDg2LDEwIEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogeworICAgIGlmIChtUHJpbWFyeU91dHB1dCAhPSAwICYmIG1QcmltYXJ5T3V0cHV0ID09IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiByZW1vdmluZyBwcmltYXJ5IG91dHB1dCIsIF9fZnVuY19fKTsKKyAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBudWxscHRyOworICAgIH0KICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7CiAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiB9CkBAIC00NzYyLDcgKzUxMTUsMTUgQEAKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgLy8gZmlyc3QgY2FsbCBnZXRBdWRpb1BvcnQgdG8gZ2V0IHRoZSBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmcm9tIHRoZSBIQUwKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgcG9ydCA9IHt9OworICAgICAgICBkZXZpY2UtPnRvQXVkaW9Qb3J0KCZwb3J0KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldEF1ZGlvUG9ydCgmcG9ydCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlbiBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQpAQCAtNDgyMiw4MyArNTE4Myw4IEBACiAKICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAotICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdXBkYXRlQXVkaW9Qcm9maWxlcyhkZXZpY2UsIG91dHB1dCwgcHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmhhc1ZhbGlkQXVkaW9Qcm9maWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlLT5oYXNEeW5hbWljQXVkaW9Qcm9maWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5jaGFubmVsX21hc2ssIGNvbmZpZy5mb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLnNhbXBsZV9yYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLQotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIERldmljZVZlY3RvcihkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoZGV2aWNlVHlwZSwgYWRkcmVzcywgcG9saWN5TWl4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGR1cGxpY2F0ZWQgb3V0cHV0IGZvciBkaXJlY3Qgb3V0cHV0cyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dHMgdXNlZCBieSBkeW5hbWljIHBvbGljeSBtaXhlcwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIGR1cGxpY2F0aW5nIG91dHB1dCB0aHJlYWQgZm9yIHRoZSBuZXcgb3V0cHV0IGFuZCB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwsIG1wQ2xpZW50SW50ZXJmYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGR1cE91dHB1dERlc2MtPm9wZW5EdXBsaWNhdGluZyhtUHJpbWFyeU91dHB1dCwgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYyA9IG9wZW5PdXRwdXRXaXRoUHJvZmlsZUFuZERldmljZShwcm9maWxlLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBkZXNjID09IG51bGxwdHIgPyBBVURJT19JT19IQU5ETEVfTk9ORSA6IGRlc2MtPm1Jb0hhbmRsZTsKICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKQEAgLTQ5MDcsNiArNTE5Myw4IEBACiAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCiAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoZW4gZ2V0QXVkaW9Qb3J0IGlzIHJlYWR5LCBpdCBtYXkgbm90IGJlIG5lZWRlZCB0byBpbXBvcnQgdGhlIGF1ZGlvCisgICAgICAgICAgICAgICAgICAgIC8vIHBvcnQgYnV0IGp1c3QgcGljayBhdWRpbyBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZShwcm9maWxlKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ5MzEsNyArNTIxOSw3IEBACiAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2ggb24gZGV2aWNlCiAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyh7ZGV2aWNlVHlwZX0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5jb250YWluc1NpbmdsZURldmljZVN1cHBvcnRpbmdFbmNvZGVkRm9ybWF0cyhkZXZpY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCkBAIC00OTQ0LDExICs1MjMyLDMwIEBACiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKClbal07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXByb2ZpbGUtPmhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGlmIHRoZXJlIGlzIGFuIElPUHJvZmlsZSB0aGF0IGNvbnRhaW5zIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAvLyBwcm9maWxlcyBhbmQgc3VwcG9ydHMgdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UsIGNhbGwgZ2V0QXVkaW9Qb3J0IHRvIHJlcG9wdWxhdGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2VzIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJT1Byb2ZpbGUuCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdXBwb3J0ZWREZXZpY2UgOiBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZERldmljZSA9PSBkZXZpY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnMoc3VwcG9ydGVkRGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgcG9ydDsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkRGV2aWNlLT50b0F1ZGlvUG9ydCgmcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRBdWRpb1BvcnQoJnBvcnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTE1MCw4ICs1NDU3LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7Ci0gICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7Ci0gICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICAgICAgQUxPR1YoIm5vIGRpcmVjdCBvdXRwdXRzIG9wZW4sIHJlc2V0IE1TRCBwYXRjaGVzIik7CisgICAgICAgICAgICAvLyBUT0RPOiBUaGUgTVNEIHBhdGNoZXMgdG8gYmUgZXN0YWJsaXNoZWQgaGVyZSBtYXkgZGlmZmVyIHRvIGN1cnJlbnQgTVNEIHBhdGNoZXMgZHVlIHRvCisgICAgICAgICAgICAvLyBob3cgb3V0cHV0IGRldmljZXMgZm9yIHBhdGNoaW5nIGFyZSByZXNvbHZlZC4gQXZvaWQgYnkgY2FjaGluZyBhbmQgcmV1c2luZyB0aGUKKyAgICAgICAgICAgIC8vIGFyZ3VtZW50cyB0byBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygpIHdoZW4gcmVzb2x2aW5nIHdoaWNoIG91dHB1dAorICAgICAgICAgICAgLy8gZGV2aWNlcyB0byBwYXRjaCB0by4gVGhpcyBtYXkgYmUgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBkZXZpY2VzIG1heSBiZWNvbWUKKyAgICAgICAgICAgIC8vIHVuYXZhaWxhYmxlLgorICAgICAgICAgICAgc2V0TXNkT3V0cHV0UGF0Y2hlcygpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNTIxOCw4ICs1NTMwLDE2IEBACiAgICAgaWYgKG9uT3V0cHV0c0NoZWNrZWQgIT0gbnVsbHB0ciAmJiBvbk91dHB1dHNDaGVja2VkKCkpIGNoZWNrQTJkcFN1c3BlbmQoKTsKICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogICAgIGlmIChtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpICE9IDApIHsKLSAgICAgICAgc2V0TXNkUGF0Y2goKTsKKyAgICAgICAgLy8gVE9ETzogVGhlIE1TRCBwYXRjaGVzIHRvIGJlIGVzdGFibGlzaGVkIGhlcmUgbWF5IGRpZmZlciB0byBjdXJyZW50IE1TRCBwYXRjaGVzIGR1ZSB0byBob3cKKyAgICAgICAgLy8gb3V0cHV0IGRldmljZXMgZm9yIHBhdGNoaW5nIGFyZSByZXNvbHZlZC4gTmV2ZXJ0aGVsZXNzLCBBdWRpb1RyYWNrcyBhZmZlY3RlZCBieSBkZXZpY2UKKyAgICAgICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdpbGwgdWx0aW1hdGVseSBiZSByZXJvdXRlZCBjb3JyZWN0bHkuIFdlIGNhbiBzdGlsbCBhdm9pZAorICAgICAgICAvLyB1bm5lY2Vzc2FyeSByZXJvdXRpbmcgYnkgY2FjaGluZyBhbmQgcmV1c2luZyB0aGUgYXJndW1lbnRzIHRvCisgICAgICAgIC8vIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCkgd2hlbiByZXNvbHZpbmcgd2hpY2ggb3V0cHV0IGRldmljZXMgdG8gcGF0Y2ggdG8uCisgICAgICAgIC8vIFRoaXMgbWF5IGJlIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgZGV2aWNlcyBtYXkgYmVjb21lIHVuYXZhaWxhYmxlLgorICAgICAgICBzZXRNc2RPdXRwdXRQYXRjaGVzKCk7CiAgICAgfQorICAgIC8vIGFuIGV2ZW50IHRoYXQgY2hhbmdlZCByb3V0aW5nIGxpa2VseSBvY2N1cnJlZCwgaW5mb3JtIHVwcGVyIGxheWVycworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vblJvdXRpbmdVcGRhdGVkKCk7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKQEAgLTUyMjksNiArNTU0OSwyOSBAQAogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyQXR0cik7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0F1ZGlvU291cmNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpCisgICAgICAgICAgICAgICAgJiYgc291cmNlRGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORQorICAgICAgICAgICAgICAgICYmICFpc0NhbGxSeEF1ZGlvU291cmNlKHNvdXJjZURlc2MpKSB7CisgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhckF1ZGlvU291cmNlc0Zvck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYyAhPSBudWxscHRyICYmIHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAmJiBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKS0+bUlvSGFuZGxlID09IG91dHB1dCkgeworICAgICAgICAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKIHsKICAgICBhdXRvIHBzSWQgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOwpAQCAtNTI1OCw3ICs1NjAxLDcgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjbGllbnQtPmdldFByaW1hcnlNaXgoKSAhPSBwcmltYXJ5TWl4KSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5nZXRQcmltYXJ5TWl4KCkgIT0gcHJpbWFyeU1peCB8fCBjbGllbnQtPmhhc0xvc3RQcmltYXJ5TWl4KCkpIHsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwc0lkKSkgewogICAgICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwpAQCAtNTI4OSw3ICs1NjMyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+ZmxhZ3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y29uZmlnKCkuZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5jb25maWcoKS5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNvbmZpZygpLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y29uZmlnKCkuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPnNlc3Npb24oKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdPdXRwdXQgIT0gc3JjT3V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNTMyNCw3ICs1NjY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gbnVsbHB0ciAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUzNDcsMTEgKzU2OTEsMTMgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKICAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkuZnJvbnQoKTsKICAgICAgICAgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICBjaGVja0F1ZGlvU291cmNlRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1NlY29uZGFyeU91dHB1dHMoKSB7CiAgICAgc3RkOjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gc3RyZWFtc1RvSW52YWxpZGF0ZTsKKyAgICBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAgdHJhY2tTZWNvbmRhcnlPdXRwdXRzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjcmlwdG9yID0gbU91dHB1dHNbaV07CiAgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50IDogb3V0cHV0RGVzY3JpcHRvci0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgewpAQCAtNTM2OCwyMCArNTcxNCw0MyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSyB8fAotICAgICAgICAgICAgICAgICFzdGQ6OmVxdWFsKGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdGQ6OmVxdWFsKAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiB3ZWFrU2Vjb25kYXJ5RGVzY3M7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dElkczsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlY29uZGFyeURlc2MgOiBzZWNvbmRhcnlEZXNjcykgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRJZHMucHVzaF9iYWNrKHNlY29uZGFyeURlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHdlYWtTZWNvbmRhcnlEZXNjcy5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cy5lbXBsYWNlKGNsaWVudC0+cG9ydElkKCksIHNlY29uZGFyeU91dHB1dElkcyk7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRTZWNvbmRhcnlPdXRwdXRzKHN0ZDo6bW92ZSh3ZWFrU2Vjb25kYXJ5RGVzY3MpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoIXRyYWNrU2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyk7CisgICAgfQogICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gOiBzdHJlYW1zVG9JbnZhbGlkYXRlKSB7Ci0gICAgICAgIEFMT0dEKCIlcyBJbnZhbGlkYXRlIHN0cmVhbSAlZCBkdWUgdG8gc2Vjb25kYXJ5IG91dHB1dCBjaGFuZ2UiLCBfX2Z1bmNfXywgc3RyZWFtKTsKKyAgICAgICAgQUxPR0QoIiVzIEludmFsaWRhdGUgc3RyZWFtICVkIGR1ZSB0byBmYWlsIGdldHRpbmcgb3V0cHV0IGZvciBhdHRyIiwgX19mdW5jX18sIHN0cmVhbSk7CiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTY29SZXF1ZXN0ZWRGb3JDb21tKCkgY29uc3QgeworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICBtRW5naW5lLT5nZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KG1Db21tdW5uaWNhdGlvblN0cmF0ZWd5LCBERVZJQ0VfUk9MRV9QUkVGRVJSRUQsIGRldmljZXMpOworICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICBpZiAoYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGRldmljZS5tVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQogewogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGEyZHBPdXRwdXQgPSBtT3V0cHV0cy5nZXRBMmRwT3V0cHV0KCk7CkBAIC01MzkzLDIzICs1NzYyLDIxIEBACiAgICAgYm9vbCBpc1Njb0Nvbm5lY3RlZCA9CiAgICAgICAgICAgICAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpLmNvdW50KEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpICE9IDAgfHwKICAgICAgICAgICAgICAhSW50ZXJzZWN0aW9uKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCksIGdldEF1ZGlvRGV2aWNlT3V0QWxsU2NvU2V0KCkpLmVtcHR5KCkpOworICAgIGJvb2wgaXNTY29SZXF1ZXN0ZWQgPSBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKTsKIAogICAgIC8vIGlmIHN1c3BlbmRlZCwgcmVzdG9yZSBBMkRQIG91dHB1dCBpZjoKICAgICAvLyAgICAgICgoU0NPIGRldmljZSBpcyBOT1QgY29ubmVjdGVkKSB8fAotICAgIC8vICAgICAgICgoZm9yY2VkIHVzYWdlIGNvbW11bmljYXRpb24gaXMgTk9UIFNDTykgJiYgKGZvcmNlZCB1c2FnZSBmb3IgcmVjb3JkIGlzIE5PVCBTQ08pICYmCisgICAgLy8gICAgICAgKChTQ08gaXMgbm90IHJlcXVlc3RlZCkgJiYKICAgICAvLyAgICAgICAgKHBob25lIHN0YXRlIGlzIE5PVCBpbiBjYWxsKSAmJiAocGhvbmUgc3RhdGUgaXMgTk9UIHJpbmdpbmcpKSkKICAgICAvLwogICAgIC8vIGlmIG5vdCBzdXNwZW5kZWQsIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6CiAgICAgLy8gICAgICAoU0NPIGRldmljZSBpcyBjb25uZWN0ZWQpICYmCi0gICAgLy8gICAgICAgKChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gaXMgU0NPKSB8fCAoZm9yY2VkIHVzYWdlIGZvciByZWNvcmQgaXMgU0NPKSB8fAorICAgIC8vICAgICAgICgoU0NPIGlzIHJlcXVlc3RlZCkgfHwKICAgICAvLyAgICAgICAoKHBob25lIHN0YXRlIGlzIGluIGNhbGwpIHx8IChwaG9uZSBzdGF0ZSBpcyByaW5naW5nKSkpCiAgICAgLy8KICAgICBpZiAobUEyZHBTdXNwZW5kZWQpIHsKICAgICAgICAgaWYgKCFpc1Njb0Nvbm5lY3RlZCB8fAotICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSAhPQotICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKLSAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSAhPQotICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgICAgICAgICAgKCFpc1Njb1JlcXVlc3RlZCAmJgogICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKIApAQCAtNTQxOCwxMCArNTc4NSw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoaXNTY29Db25uZWN0ZWQgJiYKLSAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgPT0KLSAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkgPT0KLSAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAgICAgIChpc1Njb1JlcXVlc3RlZCB8fAogICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX1JJTkdUT05FKSkpIHsKIApAQCAtNTQ0Niw2ICs1ODEwLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBEbyBub3QgcmV0cmlldmUgZW5naW5lIGRldmljZSBmb3Igb3V0cHV0cyB0aHJvdWdoIE1TRAorICAgIC8vIFRPRE86IHN1cHBvcnQgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBieSByZXNldHRpbmcgTVNEIHBhdGNoIHRvIGVuZ2luZSBkZXZpY2UuCisgICAgaWYgKG91dHB1dERlc2MtPmRldmljZXMoKSA9PSBnZXRNc2RBdWRpb091dERldmljZXMoKSkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIH0KKwogICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCiAgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KICAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCkBAIC01NDY1LDEzICs1ODM1LDI3IEBACiAgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgewogICAgICAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpOwogICAgICAgICBhdXRvIGF0dHIgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgYXV0byBoYXNTdHJlYW1BY3RpdmUgPSBbJl0oYXV0byBzdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNTdHJlYW0oc3RyZWFtcywgc3RyZWFtKSAmJiBpc1N0cmVhbUFjdGl2ZShzdHJlYW0sIDApOworICAgICAgICB9OwogCi0gICAgICAgIGlmICgoaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYKLSAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpICYmCi0gICAgICAgICAgICAgIWlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAwKSkgfHwKLSAgICAgICAgICAgICAoKGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fQUxBUk0pIHx8IGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkpICYmCi0gICAgICAgICAgICAgICAgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSB8fAotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgeworICAgICAgICBhdXRvIGRvR2V0T3V0cHV0RGV2aWNlc0ZvclZvaWNlID0gWyZdKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmIChvdXRwdXREZXNjID09IG1QcmltYXJ5T3V0cHV0IHx8CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgJiYKKyAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpOworICAgICAgICB9OworCisgICAgICAgIC8vIFdpdGggbG93LWxhdGVuY3kgcGxheWluZyBvbiBzcGVha2VyLCBtdXNpYyBvbiBXRkQsIHdoZW4gdGhlIGZpcnN0IGxvdy1sYXRlbmN5CisgICAgICAgIC8vIG91dHB1dCBpcyBzdG9wcGVkLCBnZXROZXdPdXRwdXREZXZpY2VzIGNoZWNrcyBmb3IgYSBwcm9kdWN0IHN0cmF0ZWd5CisgICAgICAgIC8vIGZyb20gdGhlIGxpc3QsIGFzIFNUUkFURUdZX1NPTklGSUNBVElPTiBjb21lcyBwcmlvciB0byBTVFJBVEVHWV9NRURJQS4KKyAgICAgICAgLy8gSWYgYW4gQUxBUk0gb3IgRU5GT1JDRURfQVVESUJMRSBzdHJlYW0gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwcm9kdWN0IHN0cmF0ZWd5LAorICAgICAgICAvLyBkZXZpY2VzIGFyZSByZXR1cm5lZCBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHdpdGhvdXQgY2hlY2tpbmcgd2hldGhlciB0aGUKKyAgICAgICAgLy8gc3RyZWFtIGlzIGFzc29jaWF0ZWQgdG8gdGhlIG91dHB1dCBkZXNjcmlwdG9yLgorICAgICAgICBpZiAoZG9HZXRPdXRwdXREZXZpY2VzRm9yVm9pY2UoKSB8fCBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkgfHwKKyAgICAgICAgICAgICAgICgoaGFzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkgfHwKKyAgICAgICAgICAgICAgICBoYXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkpIHsKICAgICAgICAgICAgIC8vIFJldHJpZXZhbCBvZiBkZXZpY2VzIGZvciB2b2ljZSBETCBpcyBkb25lIG9uIHByaW1hcnkgb3V0cHV0IHByb2ZpbGUsIGNhbm5vdAogICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJvdXRlICh3b3VsZCBmb3JjZSBtb2RpZnlpbmcgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGlzIHByb2ZpbGUpCiAgICAgICAgICAgICBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZnJvbUNhY2hlKTsKQEAgLTU1MDcsMTIgKzU4OTEsMjIgQEAKIAogICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucwogICAgIC8vIGEgbnVsbCBzcDw+LCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gaW5wdXREZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7CisgICAgdWlkX3QgdWlkOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCk7CisgICAgaWYgKHRvcENsaWVudCAhPSBudWxscHRyKSB7CisgICAgICBhdHRyaWJ1dGVzID0gdG9wQ2xpZW50LT5hdHRyaWJ1dGVzKCk7CisgICAgICB1aWQgPSB0b3BDbGllbnQtPnVpZCgpOworICAgIH0gZWxzZSB7CisgICAgICBhdHRyaWJ1dGVzID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX0RFRkFVTFQgfTsKKyAgICAgIHVpZCA9IDA7CisgICAgfQorCiAgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKICAgICAgICAgYXR0cmlidXRlcy5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICB9CiAgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHVpZCk7CiAgICAgfQogCiAgICAgcmV0dXJuIGRldmljZTsKQEAgLTU1MzMsOCArNTkyNyw4IEBACiAgICAgfQogICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOwogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsKLSAgICAgICAgIGN1clN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoY3VyU3RyZWFtICsgMSkpIHsKKyAgICBmb3IgKGludCBpID0gQVVESU9fU1RSRUFNX01JTjsgaSA8IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UOyArK2kpIHsKKyAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW17c3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSl9OwogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIGN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC01NjQ4LDcgKzYwNDIsNyBAQAogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZSh0dHNWb2x1bWVTb3VyY2UsIG11dGUvKm9uKi8sIGRlc2MsIDAgLypkZWxheSovLCBEZXZpY2VUeXBlU2V0KCkpOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKKyAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgbGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjAzMSw3ICs2NDI1LDggQEAKICAgICBpZiAoIUludGVyc2VjdGlvbihkZXZpY2VUeXBlcywKICAgICAgICAgICAgIHtBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsCiAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwKLSAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEfSkuZW1wdHkoKSAmJgorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQsCisgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVH0pLmVtcHR5KCkgJiYKICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8CiAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjKSB8fAogICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikpIHx8CkBAIC02MDYwLDggKzY0NTUsOSBAQAogICAgICAgICAgICAgICAgIHZvbHVtZURiID0gbWluVm9sRGI7CiAgICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sRGIsIG11c2ljVm9sRGIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsIHtBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVN9KS5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlVHlwZXMpICE9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUgorICAgICAgICAgICAgICAgICAgICAmJiAgIUludGVyc2VjdGlvbihkZXZpY2VUeXBlcywge0FVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVN9KS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgLy8gb24gQTJEUCwgYWxzbyBlbnN1cmUgbm90aWZpY2F0aW9uIHZvbHVtZSBpcyBub3QgdG9vIGxvdyBjb21wYXJlZCB0byBtZWRpYSB3aGVuCiAgICAgICAgICAgICAgICAgLy8gaW50ZW5kZWQgdG8gYmUgcGxheWVkCiAgICAgICAgICAgICAgICAgaWYgKCh2b2x1bWVEYiA+IC05Ni4wZikgJiYKQEAgLTYxMjYsMTYgKzY1MjIsMTcgQEAKICAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKICAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CiAKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9Ci0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOworICAgIGJvb2wgaXNTY29SZXF1ZXN0ZWQgPSBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKTsKICAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKICAgICAvLyBpZiBzY28gYW5kIGNhbGwgZm9sbG93IHNhbWUgY3VydmVzLCBieXBhc3MgZm9yY2VVc2VGb3JDb21tCiAgICAgaWYgKChjYWxsVm9sU3JjICE9IGJ0U2NvVm9sU3JjKSAmJgotICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHsKLSAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgdm9sdW1lU291cmNlLCBmb3JjZVVzZUZvckNvbW0pOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgJiYgaXNTY29SZXF1ZXN0ZWQpIHx8CisgICAgICAgICAgICAgKGlzQnRTY29Wb2xTcmMgJiYgIWlzU2NvUmVxdWVzdGVkKSkpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aGVuIGlzJXNyZXF1ZXN0ZWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGlzU2NvUmVxdWVzdGVkID8gIiAiIDogIm4gb3QgIik7CisgICAgICAgIC8vIERvIG5vdCByZXR1cm4gYW4gZXJyb3IgaGVyZSBhcyBBdWRpb1NlcnZpY2Ugd2lsbCBhbHdheXMgc2V0IGJvdGggdm9pY2UgY2FsbAorICAgICAgICAvLyBhbmQgYmx1ZXRvb3RoIFNDTyB2b2x1bWVzIGR1ZSB0byBzdHJlYW0gYWxpYXNpbmcuCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgaWYgKGRldmljZVR5cGVzLmVtcHR5KCkpIHsKICAgICAgICAgZGV2aWNlVHlwZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKQEAgLTYxNDMsOSArNjU0MCw4IEBACiAKICAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2VUeXBlcyk7CiAgICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlVHlwZXMpIHx8Ci0gICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08KLQotICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjIHx8IGlzQnRTY29Wb2xTcmMpICYmCisgICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08gZGV2aWNlIGV4Y2VwdCBpZiBtdXRlZAorICAgICAgICAgICAgKGluZGV4ICE9IDAgJiYgKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgJiYKICAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UpKSkgewogICAgICAgICB2b2x1bWVEYiA9IDAuMGY7CiAgICAgfQpAQCAtNjMwNSw5ICs2NzAxLDEwIEBACiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewogICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKLSAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisgICAgICAgIGlmIChzb3VyY2VEZXNjLT5pc0Nvbm5lY3RlZCgpICYmIChzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKS0+ZXF1YWxzKGRldmljZURlc2MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zaW5rRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSkKKyAgICAgICAgICAgICAgICAmJiAhaXNDYWxsUnhBdWRpb1NvdXJjZShzb3VyY2VEZXNjKSkgeworICAgICAgICAgICAgZGlzY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZURlc2MpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MzIxLDEwICs2NzE4LDE0IEBACiAgICAgICAgICAgICAgICAgcmVsZWFzZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IGRldmljZURlc2MtPmFkZHJlc3MoKS5jX3N0cigpOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoRGVzYy0+bVBhdGNoLm51bV9zaW5rcyAmJiAhcmVsZWFzZTsgaisrKSAgewogICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzW2pdOwogICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgotICAgICAgICAgICAgICAgICAgICBzaW5rLT5leHQuZGV2aWNlLnR5cGUgPT0gZGV2aWNlRGVzYy0+dHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpbmstPmV4dC5kZXZpY2UudHlwZSA9PSBkZXZpY2VEZXNjLT50eXBlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHN0cm5sZW4oYWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMAorICAgICAgICAgICAgICAgICAgICAgfHwgc3RybmNtcChzaW5rLT5leHQuZGV2aWNlLmFkZHJlc3MsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIHJlbGVhc2UgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NDAzLDcgKzY4MDQsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBjaGFubmVsTWFza3MuYmVnaW4oKTsgaXQgIT0gY2hhbm5lbE1hc2tzLmVuZCgpOykgewogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAqaXQ7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiVzOiBmb3JjZSBORVZFUiwgc28gcmVtb3ZlIGNoYW5uZWxNYXNrIDB4JTA4eCIsIF9fRlVOQ1RJT05fXywgY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZm9yY2UgTkVWRVIsIHNvIHJlbW92ZSBjaGFubmVsTWFzayAweCUwOHgiLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpdCA9IGNoYW5uZWxNYXNrcy5lcmFzZShpdCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICsraXQ7CkBAIC02NDIzLDcgKzY4MjQsNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmluc2VydChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgTUFOVUFMIG9yIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HVigiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNjQ0Nyw2ICs2ODQ4LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgbVJlcG9ydGVkRm9ybWF0c01hcFtkZXZEZXNjXSA9IGZvcm1hdHM7CiAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCiAgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgewogICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKQEAgLTY1NDYsNCArNjk0OCwxMjkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXJlQWxsQWN0aXZlVHJhY2tzUmVyb3V0ZWQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQpCit7CisgICAgY29uc3QgVHJhY2tDbGllbnRWZWN0b3IgYWN0aXZlQ2xpZW50cyA9IG91dHB1dC0+Z2V0QWN0aXZlQ2xpZW50cygpOworICAgIGlmIChhY3RpdmVDbGllbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0LT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcywgbm8gYXVkaW8gcGF0Y2ggZm91bmQgd2hpbGUgdGhlcmUgYXJlIGFjdGl2ZSBjbGllbnRzIG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dC0+Z2V0SWQoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBEZXZpY2VWZWN0b3Igcm91dGVkRGV2aWNlczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGNoRGVzYy0+bVBhdGNoLm51bV9zaW5rczsgKytpKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zaW5rc1tpXS5pZCk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzLCBubyBhdWRpbyBkZXZpY2UgZm91bmQgd2l0aCBpZCglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2hEZXNjLT5tUGF0Y2guc2lua3NbaV0uaWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJvdXRlZERldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogYWN0aXZlQ2xpZW50cykgeworICAgICAgICAvLyBUT0RPOiBiLzE3NTM0MzA5OSBvbmx5IHRyYXZlbCB0aGUgdmFsaWQgY2xpZW50CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHByZWZlcnJlZERldmljZSA9CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgICAgIGlmIChtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBjbGllbnQtPmF0dHJpYnV0ZXMoKSwgcHJlZmVycmVkRGV2aWNlLCBmYWxzZSkgPT0gcm91dGVkRGV2aWNlcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpvcGVuT3V0cHV0V2l0aFByb2ZpbGVBbmREZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgY2hlY2tpbmcgaWYgdGhlIHByb2ZpbGUgc3VwcG9ydHMgdGhlIGRldmljZSBjb21iby4KKyAgICAgICAgaWYgKCFwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2VzLAorICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBkZXZpY2VzLmdldERldmljZUZvck9wZW5pbmcoKTsKKyAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOworICAgIGNvbnN0IFN0cmluZzggJmFkZHJlc3MgPSBTdHJpbmc4KGRldmljZS0+YWRkcmVzcygpLmNfc3RyKCkpOworICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CisgICAgICAgIGZyZWUocGFyYW0pOworICAgIH0KKyAgICB1cGRhdGVBdWRpb1Byb2ZpbGVzKGRldmljZSwgb3V0cHV0LCBwcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgIGlmICghcHJvZmlsZS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgeworICAgICAgICBBTE9HVygiJXMoKSBtaXNzaW5nIHBhcmFtIiwgX19mdW5jX18pOworICAgICAgICBkZXNjLT5jbG9zZSgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPmhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSkgeworICAgICAgICBkZXNjLT5jbG9zZSgpOworICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBwcm9maWxlLT5waWNrQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmNoYW5uZWxfbWFzaywgY29uZmlnLmZvcm1hdCk7CisgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgIHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7CisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpICYmIGFkZHJlc3MgIT0gIjAiKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CisgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoZGV2aWNlVHlwZSwgYWRkcmVzcywgcG9saWN5TWl4KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgLy8gbm8gZHVwbGljYXRlZCBvdXRwdXQgZm9yIGRpcmVjdCBvdXRwdXRzIGFuZAorICAgICAgICAvLyBvdXRwdXRzIHVzZWQgYnkgZHluYW1pYyBwb2xpY3kgbWl4ZXMKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHVwbGljYXRlZE91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworCisgICAgICAgIC8vVE9ETzogY29uZmlndXJlIGF1ZGlvIGVmZmVjdCBvdXRwdXQgc3RhZ2UgaGVyZQorCisgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0KKyAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IobnVsbHB0ciwgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICBzdGF0dXMgPSBkdXBPdXRwdXREZXNjLT5vcGVuRHVwbGljYXRpbmcobVByaW1hcnlPdXRwdXQsIGRlc2MsICZkdXBsaWNhdGVkT3V0cHV0KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGFkZE91dHB1dChkdXBsaWNhdGVkT3V0cHV0LCBkdXBPdXRwdXREZXNjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSwgb3V0cHV0KTsKKyAgICAgICAgICAgIGRlc2MtPmNsb3NlKCk7CisgICAgICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVByaW1hcnlPdXRwdXQgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICBBTE9HVigiJXMoKTogcmUtYXNzaWduaW5nIG1QcmltYXJ5T3V0cHV0IiwgX19mdW5jX18pOworICAgICAgICBtUHJpbWFyeU91dHB1dCA9IGRlc2M7CisgICAgfQorICAgIHJldHVybiBkZXNjOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IGI1ODhmODkuLjk4Zjk2ZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC01Miw2ICs1Miw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCkBAIC0xMTYsNyArMTE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKQEAgLTEyNSwxMiArMTI3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGVfdCAqb3V0cHV0VHlwZSkgb3ZlcnJpZGU7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCkBAIC0xODAsNyArMTgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0OwogCiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gc3RyZWFtVG9TdHJhdGVneShzdHJlYW0pOwogICAgICAgICB9CkBAIC0yMDAsNyArMjAyLDcgQEAKICAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYyA9IE5VTEwpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwpAQCAtMjI1LDcgKzIyNyw3IEBACiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKIAogICAgICAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBjYXB0dXJlUG9saWN5KSBvdmVycmlkZTsKLSAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX29mZmxvYWRfbW9kZV90IGdldE9mZmxvYWRTdXBwb3J0KGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CkBAIC0yMzMsOSArMjM1LDkgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKQEAgLTI2MywxNyArMjY1LDQyIEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwKLSAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCk7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yUm9sZUFuZFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9yb2xlX3Qgcm9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLCBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUpOworCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKQEAgLTI4OCw4ICszMTUsOSBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3Vycm91bmRGb3JtYXRzKHVuc2lnbmVkIGludCAqbnVtU3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHModW5zaWduZWQgaW50ICpudW1TdXJyb3VuZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKQEAgLTMwNCwxMSArMzMyLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CiAgICAgICAgIH0KIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgYm9vbCBmYWxsYmFja09uRGVmYXVsdCkKICAgICAgICAgewotICAgICAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3RTdHJhdGVneSAhPSBQUk9EVUNUX1NUUkFURUdZX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHByb2R1Y3RTdHJhdGVneSA9IG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgIGFhLmdldEF0dHJpYnV0ZXMoKSwgZmFsbGJhY2tPbkRlZmF1bHQpOworICAgICAgICAgICAgcmV0dXJuIChmYWxsYmFja09uRGVmYXVsdCAmJiBwcm9kdWN0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSA/CisgICAgICAgICAgICAgICAgICAgIEJBRF9WQUxVRSA6IE5PX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQpAQCAtMzE2LDExICszNDcsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKICAgICAgICAgfQogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwLCBib29sIGZhbGxiYWNrT25EZWZhdWx0KQogICAgICAgICB7Ci0gICAgICAgICAgICB2b2x1bWVHcm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhYS5nZXRBdHRyaWJ1dGVzKCkpOwotICAgICAgICAgICAgcmV0dXJuIHZvbHVtZUdyb3VwICE9IFZPTFVNRV9HUk9VUF9OT05FID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgICAgICAgICB2b2x1bWVHcm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhLmdldEF0dHJpYnV0ZXMoKSwgZmFsbGJhY2tPbkRlZmF1bHQpOworICAgICAgICAgICAgcmV0dXJuIChmYWxsYmFja09uRGVmYXVsdCAmJiB2b2x1bWVHcm91cCA9PSBWT0xVTUVfR1JPVVBfTk9ORSkgPworICAgICAgICAgICAgICAgICAgICBCQURfVkFMVUUgOiBOT19FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgaXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpIG92ZXJyaWRlOwpAQCAtNTMxLDYgKzU2NCwyMCBAQAogICAgICAgICAgKi8KICAgICAgICAgdm9pZCB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOwogCisgICAgICAgIGJvb2wgaXNDYWxsUnhBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiAmc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgICAgICAgICAgICAgICYmIHNvdXJjZSA9PSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKG1DYWxsUnhTb3VyY2VDbGllbnRQb3J0KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY29ubmVjdFRlbGVwaG9ueVJ4QXVkaW9Tb3VyY2UoKTsKKworICAgICAgICB2b2lkIGRpc2Nvbm5lY3RUZWxlcGhvbnlSeEF1ZGlvU291cmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiB1cGRhdGVzIHJvdXRpbmcgZm9yIGFsbCBpbnB1dHMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHVwZGF0ZUlucHV0Um91dGluZygpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciB0aGUKICAgICAgICAgICogZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KQEAgLTU0MSw2ICs1ODgsMTYgQEAKICAgICAgICAgICovCiAgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0F1ZGlvU291cmNlRm9yQXR0cmlidXRlcyBjaGVja3MgaWYgYW55IEF1ZGlvU291cmNlIGZvbGxvd2luZyB0aGUgc2FtZSByb3V0aW5nCisgICAgICAgICAqIGFzIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzIGlzIG5vdCByb3V0ZWQgYW5kIHRyeSB0byBjb25uZWN0IGl0LgorICAgICAgICAgKiBJdCBtdXN0IGJlIGNhbGxlZCBvbmNlIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBoYXMgYmVlbiBjYWxsZWQgZm9yIG9ycGhhbnMgQXVkaW9Tb3VyY2UsCisgICAgICAgICAqIGFrYSBBdWRpb1NvdXJjZSBub3QgYXR0YWNoZWQgdG8gYW55IEF1ZGlvIE91dHB1dCAoZS5nLiBBdWRpb1NvdXJjZSBjb25uZWN0ZWQgdG8gZGlyZWN0CisgICAgICAgICAqIE91dHB1dCB3aGljaCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKGFuZCBvdXRwdXQgY2xvc2VkKSBkdWUgdG8gc2luayBkZXZpY2UgdW5hdmFpbGFibGUpLgorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrQXVkaW9Tb3VyY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisKICAgICAgICAgYm9vbCBmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyQXR0cikgY29uc3Q7CiAKQEAgLTYwOCw3ICs2NjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgICAgICAvLyBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2sgYXJlIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCiAgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLApAQCAtNjgwLDkgKzczOCwyMiBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGRldmljZXMuaXRlbUF0KDApLT5hZGRyZXNzKCkuY19zdHIoKSkgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IHVwZGF0ZUNhbGxSb3V0aW5nKGNvbnN0IERldmljZVZlY3RvciAmcnhEZXZpY2VzLCB1aW50MzJfdCBkZWxheU1zID0gMCk7CisgICAgICAgIHN0YXR1c190IHVwZGF0ZUNhbGxSb3V0aW5nKAorICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlLCB1aW50MzJfdCBkZWxheU1zID0gMCwgdWludDMyX3QgKndhaXRNcyA9IG51bGxwdHIpOworICAgICAgICBzdGF0dXNfdCB1cGRhdGVDYWxsUm91dGluZ0ludGVybmFsKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcnhEZXZpY2VzLCB1aW50MzJfdCBkZWxheU1zLCB1aW50MzJfdCAqd2FpdE1zKTsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBzZWxlY3RCZXN0UnhTaW5rRGV2aWNlc0ZvckNhbGw6IGlmIHRoZSBwcmltYXJ5IG1vZHVsZSBob3N0IGJvdGggVGVsZXBob255IFJ4L1R4CisgICAgICAgICAqIGRldmljZXMsIGFuZCBpdCBkZWNsYXJlcyBhbHNvIHN1cHBvcnRpbmcgYSBIVyBicmlkZ2UgYmV0d2VlbiB0aGUgVGVsZXBob255IFJ4IGFuZCB0aGUKKyAgICAgICAgICogZ2l2ZW4gc2luayBkZXZpY2UgZm9yIFZvaWNlIENhbGwgYXVkaW8gYXR0cmlidXRlcywgc2VsZWN0IHRoaXMgZGV2aWNlIGluIHByaW8uCisgICAgICAgICAqIE90aGVyd2lzZSwgZ2V0TmV3T3V0cHV0RGV2aWNlcygpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQgdG8gc2VsZWN0IHNpbmsgZGV2aWNlLgorICAgICAgICAgKiBAcGFyYW0gZnJvbUNhY2hlIHRydWUgdG8gcHJldmVudCBlbmdpbmUgcmVjb25zaWRlcmluZyBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIGFuZCByZXRyaWV2ZQorICAgICAgICAgKiBmcm9tIGVuZ2luZSBjYWNoZS4KKyAgICAgICAgICogQHJldHVybiB2ZWN0b3Igb2YgZGV2aWNlcywgZW1wdHkgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgICAgICovCisgICAgICAgIERldmljZVZlY3RvciBzZWxlY3RCZXN0UnhTaW5rRGV2aWNlc0ZvckNhbGwoYm9vbCBmcm9tQ2FjaGUpOwogICAgICAgICBib29sIGlzRGV2aWNlT2ZNb2R1bGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKIAogICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCkBAIC03MDksNiArNzgwLDcgQEAKIAogICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKyAgICAgICAgdm9pZCBjbGVhckF1ZGlvU291cmNlc0Zvck91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwogCiAgICAgICAgIHZvaWQgY2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYyk7CiAKQEAgLTc1NSw3ICs4MjcsNiBAQAogICAgICAgICBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CiAKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOwotICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CiAKICAgICAgICAgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gbUh3T3V0cHV0czsKICAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwpAQCAtNzg3LDYgKzg1OCwzNiBAQAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1NYW51YWxTdXJyb3VuZEZvcm1hdHM7CiAKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBhdWRpb19mbGFnc19tYXNrX3Q+IG1BbGxvd2VkQ2FwdHVyZVBvbGljaWVzOworCisgICAgICAgIC8vIFRoZSBtYXAgb2YgZGV2aWNlIGRlc2NyaXB0b3IgYW5kIGZvcm1hdHMgcmVwb3J0ZWQgYnkgdGhlIGRldmljZS4KKyAgICAgICAgc3RkOjptYXA8d3A8RGV2aWNlRGVzY3JpcHRvcj4sIEZvcm1hdFZlY3Rvcj4gbVJlcG9ydGVkRm9ybWF0c01hcDsKKworICAgICAgICAvLyBDYWNoZWQgcHJvZHVjdCBzdHJhdGVneSBJRCBjb3JyZXNwb25kaW5nIHRvIGxlZ2FjeSBzdHJhdGVneSBTVFJBVEVHWV9QSE9ORQorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUNvbW11bm5pY2F0aW9uU3RyYXRlZ3k7CisKKyAgICAgICAgLy8gVGhlIHBvcnQgaGFuZGxlIG9mIHRoZSBoYXJkd2FyZSBhdWRpbyBzb3VyY2UgY3JlYXRlZCBpbnRlcm5hbGx5IGZvciB0aGUgQ2FsbCBSWCBhdWRpbworICAgICAgICAvLyBlbmQgcG9pbnQuCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUNhbGxSeFNvdXJjZUNsaWVudFBvcnQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CisgICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkT3V0cHV0UGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRNc2RQcm9maWxlcyhib29sIGh3QXZTeW5jLAorICAgICAgICAgICAgICAgIGNvbnN0IElucHV0UHJvZmlsZUNvbGxlY3Rpb24gJmlucHV0UHJvZmlsZXMsCisgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZzb3VyY2VEZXZpY2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnNpbmtEZXZpY2UsCisgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZzb3VyY2VQcm9maWxlcywKKyAgICAgICAgICAgICAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgJnNpbmtQcm9maWxlcykgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldEJlc3RNc2RDb25maWcoYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJnNvdXJjZVByb2ZpbGVzLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciAmc2lua1Byb2ZpbGVzLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtDb25maWcpIGNvbnN0OworICAgICAgICBQYXRjaEJ1aWxkZXIgYnVpbGRNc2RQYXRjaChib29sIG1zZElzU291cmNlLCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3Qgc2V0TXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3IgKm91dHB1dERldmljZXMgPSBudWxscHRyKTsKKyAgICAgICAgdm9pZCByZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMpOwogcHJpdmF0ZToKICAgICAgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChEZXZpY2VWZWN0b3IgKm5ld0RldmljZXMpOwogCkBAIC03OTQsMTcgKzg5NSw2IEBACiAgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOwogICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxNYXNrU2V0ICpjaGFubmVsTWFza3NQdHIpOwogCi0gICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7Ci0gICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKLSAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OwotICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKLSAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3Q7Ci0gICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UgPSBudWxscHRyKTsKLQogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgogICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpOwpAQCAtOTM4LDEwICsxMDI4LDE3IEBACiAgICAgICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gKnBhdGNoRGVzY1B0cik7CiAKICAgICAgICAgYm9vbCBhcmVBbGxEZXZpY2VzU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBkZXZpY2VzLAogICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChhdWRpb19kZXZpY2VzX3QpPiBwcmVkaWNhdGUsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29udGV4dCk7CiAKKyAgICAgICAgYm9vbCBpc1Njb1JlcXVlc3RlZEZvckNvbW0oKSBjb25zdDsKKworICAgICAgICBib29sIGFyZUFsbEFjdGl2ZVRyYWNrc1Jlcm91dGVkKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0KTsKKworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3Blbk91dHB1dFdpdGhQcm9maWxlQW5kRGV2aWNlKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKTsKKwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRjMDIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzYgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeXNlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCIsCisgICAgICAgICJBdWRpb1BvbGljeUVmZmVjdHMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAiLAorICAgICAgICAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYXB0dXJlU3RhdGVOb3RpZmllci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfYWlkbF9jb252ZXJzaW9uIiwKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJlZmZlY3RzY29uZmlnIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhdWRpb2NsaWVudC10eXBlcy1haWRsLWNwcCIsCisgICAgICAgICJhdWRpb2ZsaW5nZXItYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktYWlkbC1jcHAiLAorICAgICAgICAiYXVkaW9wb2xpY3ktdHlwZXMtYWlkbC1jcHAiLAorICAgICAgICAiY2FwdHVyZV9zdGF0ZV9saXN0ZW5lci1haWRsLWNwcCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHNfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XdGhyZWFkLXNhZmV0eSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGIwNzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcCBcCi0gICAgQ2FwdHVyZVN0YXRlTm90aWZpZXIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKLSAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyBcCi0gICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliYXVkaW9mb3VuZGF0aW9uIFwKLSAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAotICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCi0gICAgbGlibWVkaWFfaGVscGVyIFwKLSAgICBsaWJtZWRpYW1ldHJpY3MgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYmVmZmVjdHNjb25maWcgXAotICAgIGxpYnNlbnNvcnByaXZhY3kgXAotICAgIGNhcHR1cmVfc3RhdGVfbGlzdGVuZXItYWlkbC1jcHAKLQotTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gXAotICAgIGxpYnNlbnNvcnByaXZhY3kKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IgLVd0aHJlYWQtc2FmZXR5Ci0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IDlmYTdhNTMuLmNkNTMwNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTUwLDcgKzUwLDIyIEBACiAgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KG1vZHVsZSwgb3V0cHV0LCBjb25maWcsIGRldmljZSwgbGF0ZW5jeU1zLCBmbGFncyk7CisKKyAgICBtZWRpYTo6T3Blbk91dHB1dFJlcXVlc3QgcmVxdWVzdDsKKyAgICBtZWRpYTo6T3Blbk91dHB1dFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOworICAgIHJlcXVlc3QuY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfdF9BdWRpb0NvbmZpZygqY29uZmlnKSk7CisgICAgcmVxdWVzdC5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX0RldmljZURlc2NyaXB0b3JCYXNlKGRldmljZSkpOworICAgIHJlcXVlc3QuZmxhZ3MgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX291dHB1dF9mbGFnc190X2ludDMyX3RfbWFzayhmbGFncykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWYtPm9wZW5PdXRwdXQocmVxdWVzdCwgJnJlc3BvbnNlKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICpvdXRwdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QocmVzcG9uc2Uub3V0cHV0KSk7CisgICAgICAgICpjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnX2F1ZGlvX2NvbmZpZ190KHJlc3BvbnNlLmNvbmZpZykpOworICAgICAgICAqbGF0ZW5jeU1zID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KHJlc3BvbnNlLmxhdGVuY3lNcykpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuRHVwbGljYXRlT3V0cHV0KApAQCAtMTExLDcgKzEyNiwyMiBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIGFmLT5vcGVuSW5wdXQobW9kdWxlLCBpbnB1dCwgY29uZmlnLCBkZXZpY2UsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlVHlwZUFkZHIoKmRldmljZSwgYWRkcmVzcy5jX3N0cigpKTsKKworICAgIG1lZGlhOjpPcGVuSW5wdXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgcmVxdWVzdC5tb2R1bGUgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX21vZHVsZV9oYW5kbGVfdF9pbnQzMl90KG1vZHVsZSkpOworICAgIHJlcXVlc3QuaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoKmlucHV0KSk7CisgICAgcmVxdWVzdC5jb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX2NvbmZpZ190X0F1ZGlvQ29uZmlnKCpjb25maWcpKTsKKyAgICByZXF1ZXN0LmRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcyhkZXZpY2VUeXBlQWRkcikpOworICAgIHJlcXVlc3Quc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19zb3VyY2VfdF9BdWRpb1NvdXJjZVR5cGUoc291cmNlKSk7CisgICAgcmVxdWVzdC5mbGFncyA9IFZBTFVFX09SX1JFVFVSTl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9faW5wdXRfZmxhZ3NfdF9pbnQzMl90X21hc2soZmxhZ3MpKTsKKworICAgIG1lZGlhOjpPcGVuSW5wdXRSZXNwb25zZSByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZi0+b3BlbklucHV0KHJlcXVlc3QsICZyZXNwb25zZSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAqaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fbW9kdWxlX2hhbmRsZV90KHJlc3BvbnNlLmlucHV0KSk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCkBAIC0yMzYsNiArMjY2LDExIEBACiAgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9uUm91dGluZ1VwZGF0ZWQoKQoreworICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUm91dGluZ1VwZGF0ZWQoKTsKK30KKwogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6bmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKQogewogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZCh1c2UpOwpAQCAtMjQ2LDQgKzI4MSwyNCBAQAogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm1DYXB0dXJlU3RhdGVOb3RpZmllci5zZXRDYXB0dXJlU3RhdGUoYWN0aXZlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0X3Y3ICpwb3J0KQoreworICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYWYtPmdldEF1ZGlvUG9ydChwb3J0KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6dXBkYXRlU2Vjb25kYXJ5T3V0cHV0cygKKyAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpIHsKKyAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFmLT51cGRhdGVTZWNvbmRhcnlPdXRwdXRzKHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAppbmRleCAxZWMwYzVlLi4zZjAxZGU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCkBAIC0zNSw2ICszNSw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQXVkaW9Qb2xpY3lFZmZlY3RzIEltcGxlbWVudGF0aW9uCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjEsOCArMTIzLDExIEBACiAgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSAiYW5kcm9pZCI7CisgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoYXR0cmlidXRpb25Tb3VyY2UpOworICAgICAgICAgICAgZngtPnNldChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsIDAsIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiYWRkSW5wdXRFZmZlY3RzKCk6IGZhaWxlZCB0byBjcmVhdGUgRnggJXMgb24gc291cmNlICVkIiwKQEAgLTI3MCw4ICsyNzUsMTEgQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CisgICAgICAgICAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlOworICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUgPSAiYW5kcm9pZCI7CisgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoYXR0cmlidXRpb25Tb3VyY2UpOworICAgICAgICAgICAgZngtPnNldChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAgJXMgb24gc2Vzc2lvbiAlZCIsCkBAIC05NzAsMTEgKzk3OCwxNCBAQAogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlRWZmZWN0c0l0ZXIgOiBtRGV2aWNlRWZmZWN0cykgewogICAgICAgICBjb25zdCBhdXRvJiBkZXZpY2VFZmZlY3RzID0gIGRldmljZUVmZmVjdHNJdGVyLnNlY29uZDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZmZlY3REZXNjIDogZGV2aWNlRWZmZWN0cy0+bUVmZmVjdERlc2NyaXB0b3JzLT5tRWZmZWN0cykgewotICAgICAgICAgICAgYXV0byBmeCA9IHN0ZDo6bWFrZV91bmlxdWU8QXVkaW9FZmZlY3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX1VVSURfTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdERlc2MtPm1VdWlkLCAwLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcntkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPmdldERldmljZUFkZHJlc3MoKX0pOworICAgICAgICAgICAgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZTsKKyAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gImFuZHJvaWQiOworICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KGF0dHJpYnV0aW9uU291cmNlKTsKKyAgICAgICAgICAgIGZ4LT5zZXQoRUZGRUNUX1VVSURfTlVMTCwgJmVmZmVjdERlc2MtPm1VdWlkLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJ7ZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPmdldERldmljZUFkZHJlc3MoKX0pOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBwb3J0IHR5cGU9JWQgYWRkcmVzcz0lcyIsIF9fZnVuY19fLApAQCAtOTg3LDcgKzk5OCw3IEBACiAgICAgICAgICAgICBBTE9HVigiJXMoKTogY3JlYXRlIEZ4ICVzIGFkZGVkIG9uIHBvcnQgdHlwZT0lZCBhZGRyZXNzPSVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tTmFtZSwgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlVHlwZSgpLAogICAgICAgICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlQWRkcmVzcygpLmNfc3RyKCkpOwotICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+bUVmZmVjdHMucHVzaF9iYWNrKHN0ZDo6bW92ZShmeCkpOworICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+bUVmZmVjdHMucHVzaF9iYWNrKGZ4KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCmluZGV4IDgxYzcyOGQuLjEzZDVkMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApAQCAtMjA3LDcgKzIwNyw3IEBACiAgICAgICAgICAgICBtRGV2aWNlVHlwZShkZXZpY2UpLCBtRGV2aWNlQWRkcmVzcyhhZGRyZXNzKSB7fQogICAgICAgICAvKnZpcnR1YWwqLyB+RGV2aWNlRWZmZWN0cygpID0gZGVmYXVsdDsKIAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9FZmZlY3Q+PiBtRWZmZWN0czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8IHNwPEF1ZGlvRWZmZWN0PiA+IG1FZmZlY3RzOwogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CiAgICAgICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQWRkcmVzczsgfQogICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RWZmZWN0RGVzY1ZlY3Rvcj4gbUVmZmVjdERlc2NyaXB0b3JzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDM0ZDA3YjYuLjc3MjIzYjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE5LDExICsxOSwzMSBAQAogCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9WYWxpZGF0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldHJpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvUG9saWN5QWlkbENvbnZlcnNpb24uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorCisjZGVmaW5lIFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKHgpIFwKKyAgICAoeyBhdXRvIF90bXAgPSAoeCk7IFwKKyAgICAgICBpZiAoIV90bXAub2soKSkgcmV0dXJuIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKF90bXAuZXJyb3IoKSk7IFwKKyAgICAgICBzdGQ6Om1vdmUoX3RtcC52YWx1ZSgpKTsgfSkKKworI2RlZmluZSBSRVRVUk5fSUZfQklOREVSX0VSUk9SKHgpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBfdG1wID0gKHgpOyAgICAgXAorICAgICAgICBpZiAoIV90bXAuaXNPaygpKSByZXR1cm4gX3RtcDsgXAorICAgIH0KKworI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Cit1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGFpZGxfdXRpbHM6OmJpbmRlclN0YXR1c0Zyb21TdGF0dXNUOwordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKIAogY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fdXNhZ2VfdD4mIFNZU1RFTV9VU0FHRVMgPSB7CiAgICAgQVVESU9fVVNBR0VfQ0FMTF9BU1NJU1RBTlQsCkBAIC00NCwxNSArNjQsMTYgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpIHsKLSAgICAgcmV0dXJuIHZhbGlkYXRlVXNhZ2UodXNhZ2UsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgcmV0dXJuIHZhbGlkYXRlVXNhZ2UodXNhZ2UsIGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp2YWxpZGF0ZVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UpIHsKICAgICBpZiAoaXNTeXN0ZW1Vc2FnZSh1c2FnZSkpIHsKICAgICAgICAgaWYgKGlzU3VwcG9ydGVkU3lzdGVtVXNhZ2UodXNhZ2UpKSB7Ci0gICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQocGlkLCB1aWQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoInBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgYXVkaW8gcm91dGluZyBub3QgYWxsb3dlZCBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgoInBlcm1pc3Npb24gZGVuaWVkOiBtb2RpZnkgYXVkaW8gcm91dGluZyBub3QgYWxsb3dlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJmb3IgYXR0cmlidXRpb25Tb3VyY2UgJXMiKSwgYXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NCw3MSArOTUsOTQgQEAKICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5vbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2VBaWRsLAorICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSBzdGF0ZUFpZGwsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VOYW1lQWlkbCwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXRBaWRsKSB7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvbGljeURldmljZVN0YXRlX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdChzdGF0ZUFpZGwpKTsKKyAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0Zvcm1hdF9hdWRpb19mb3JtYXRfdChlbmNvZGVkRm9ybWF0QWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKHN0YXRlICE9IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFICYmCiAgICAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KIAogICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUFpZGwuYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWVBaWRsLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdCkpOwogfQogCi1hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Qb2xpY3lEZXZpY2VTdGF0ZSogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdF9BdWRpb1BvbGljeURldmljZVN0YXRlKAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlQWlkbC5hZGRyZXNzLmNfc3RyKCkpKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9EZXZpY2UmIGRldmljZUFpZGwsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VOYW1lQWlkbCwKKyAgICAgICAgbWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0IGVuY29kZWRGb3JtYXRBaWRsKSB7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbC50eXBlKSk7CisgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoZW5jb2RlZEZvcm1hdEFpZGwpKTsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogCiAgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VBaWRsLmFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lQWlkbC5jX3N0cigpLCBlbmNvZGVkRm9ybWF0KSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUsIHVpZF90IHVpZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUobWVkaWE6OkF1ZGlvTW9kZSBzdGF0ZUFpZGwsIGludDMyX3QgdWlkQWlkbCkKIHsKKyAgICBhdWRpb19tb2RlX3Qgc3RhdGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvTW9kZV9hdWRpb19tb2RlX3Qoc3RhdGVBaWRsKSk7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAKICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIik7CkBAIC0xNTQsMTA5ICsxOTgsMTUwIEBACiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UGhvbmVTdGF0ZShzdGF0ZSk7CiAgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKICAgICBtUGhvbmVTdGF0ZU93bmVyVWlkID0gdWlkOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWF1ZGlvX21vZGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBob25lU3RhdGUoKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0UGhvbmVTdGF0ZShtZWRpYTo6QXVkaW9Nb2RlKiBfYWlkbF9yZXR1cm4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtUGhvbmVTdGF0ZTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fbW9kZV90X0F1ZGlvTW9kZShtUGhvbmVTdGF0ZSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEZvcmNlVXNlKG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlVXNlIHVzYWdlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeUZvcmNlZENvbmZpZyBjb25maWdBaWRsKQogeworICAgIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb2xpY3lGb3JjZVVzZV9hdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QodXNhZ2VBaWRsKSk7CisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnX2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QoY29uZmlnQWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KIAogICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKICAgICBpZiAodXNhZ2UgPCAwIHx8IHVzYWdlID49IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBpZiAoY29uZmlnIDwgMCB8fCBjb25maWcgPj0gQVVESU9fUE9MSUNZX0ZPUkNFX0NGR19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUG9saWN5Rm9yY2VVc2VfYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90KHVzYWdlQWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgaWYgKHVzYWdlIDwgMCB8fCB1c2FnZSA+PSBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3RfQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcoQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Rm9yY2VVc2UodXNhZ2UpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3RfQXVkaW9Qb2xpY3lGb3JjZWRDb25maWcoCisgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldEZvcmNlVXNlKHVzYWdlKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKQogeworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CisKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QoQVVESU9fSU9fSEFORExFX05PTkUpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQUxPR1YoImdldE91dHB1dCgpIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0pKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnJiBjb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZWxlY3RlZERldmljZUlkQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldE91dHB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKQogeworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19zZXNzaW9uX3Qoc2Vzc2lvbkFpZGwpKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Db25maWdfYXVkaW9fY29uZmlnX3QoY29uZmlnQWlkbCkpOworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX291dHB1dF9mbGFnc190X21hc2soZmxhZ3NBaWRsKSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3Qoc2VsZWN0ZWREZXZpY2VJZEFpZGwpKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXN1bHQgPSB2YWxpZGF0ZVVzYWdlKGF0dHItPnVzYWdlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKAorICAgICAgICAgICAgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHIsICI2ODk1Mzk1MCIpKSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHIudXNhZ2UsIGF0dHJpYnV0aW9uU291cmNlKSkpOwogCiAgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAorICAgIC8vIFRPRE8gYi8xODIzOTI1NTM6IHJlZmFjdG9yIG9yIHJlbW92ZQorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYWRqQXR0cmlidXRpb25Tb3VyY2UgPSBhdHRyaWJ1dGlvblNvdXJjZTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgewotICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19mdW5jX18sIGNhbGxpbmdVaWQsIHVpZCk7Ci0gICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCBhdHRyaWJ1dGlvblNvdXJjZS51aWQgPT0gLTEpIHsKKyAgICAgICAgaW50MzJfdCBjYWxsaW5nVWlkQWlkbCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChjYWxsaW5nVWlkKSk7CisgICAgICAgIEFMT0dXX0lGKGF0dHJpYnV0aW9uU291cmNlLnVpZCAhPSAtMSAmJiBhdHRyaWJ1dGlvblNvdXJjZS51aWQgIT0gY2FsbGluZ1VpZEFpZGwsCisgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBjYWxsaW5nVWlkQWlkbCwgYXR0cmlidXRpb25Tb3VyY2UudWlkKTsKKyAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkID0gY2FsbGluZ1VpZEFpZGw7CiAgICAgfQotICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCkpIHsKLSAgICAgICAgYXR0ci0+ZmxhZ3MgfD0gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOworICAgIGlmICghbVBhY2thZ2VNYW5hZ2VyLmFsbG93UGxheWJhY2tDYXB0dXJlKFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCkpKSkgeworICAgICAgICBhdHRyLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihhdHRyLmZsYWdzIHwgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKTsKICAgICB9Ci0gICAgaWYgKCgoYXR0ci0+ZmxhZ3MgJiAoQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSkgIT0gMCkKLSAgICAgICAgICAgICYmICFieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKHBpZCwgdWlkKSkgewotICAgICAgICBhdHRyLT5mbGFncyAmPSB+KEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1l8QVVESU9fRkxBR19CWVBBU1NfTVVURSk7CisgICAgaWYgKCgoYXR0ci5mbGFncyAmIChBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpKSAhPSAwKQorICAgICAgICAgICAgJiYgIWJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgIGF0dHIuZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19mbGFnc19tYXNrX3Q+KAorICAgICAgICAgICAgICAgIGF0dHIuZmxhZ3MgJiB+KEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1l8QVVESU9fRkxBR19CWVBBU1NfTVVURSkpOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpvdXRwdXRfdHlwZV90IG91dHB1dFR5cGU7Ci0gICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRUeXBlKTsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKCZhdHRyLCAmb3V0cHV0LCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kYXJ5T3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRUeXBlKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewpAQCAtMjY1LDE2ICszNTAsMTYgQEAKICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX09VVFBVVF9MRUdBQ1k6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX09VVFBVVF9URUxFUEhPTllfVFg6Ci0gICAgICAgICAgICBpZiAoIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICAgICAgaWYgKCFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSBwZXJtaXNzaW9uIGRlbmllZDogbW9kaWZ5IHBob25lIHN0YXRlIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX09VVF9NSVhfUExBWUJBQ0s6Ci0gICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQocGlkLCB1aWQpKSB7CisgICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgcGVybWlzc2lvbiBkZW5pZWQ6IG1vZGlmeSBhdWRpbyByb3V0aW5nIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGFkakF0dHJpYnV0aW9uU291cmNlLnVpZCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI4NiwxMSArMzcxLDI0IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBzcCA8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIG5ldyBBdWRpb1BsYXliYWNrQ2xpZW50KCphdHRyLCAqb3V0cHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwgKnBvcnRJZCwgKnNlbGVjdGVkRGV2aWNlSWQsICpzdHJlYW0pOwotICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CisgICAgICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoYXR0ciwgb3V0cHV0LCBhZGpBdHRyaWJ1dGlvblNvdXJjZSwgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgcG9ydElkLCBzZWxlY3RlZERldmljZUlkLCBzdHJlYW0pOworICAgICAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMuYWRkKHBvcnRJZCwgY2xpZW50KTsKKworICAgICAgICBfYWlkbF9yZXR1cm4tPm91dHB1dCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3Qob3V0cHV0KSk7CisgICAgICAgIF9haWRsX3JldHVybi0+c3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc3RyZWFtX3R5cGVfdF9BdWRpb1N0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgIF9haWRsX3JldHVybi0+c2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3BvcnRfaGFuZGxlX3RfaW50MzJfdChzZWxlY3RlZERldmljZUlkKSk7CisgICAgICAgIF9haWRsX3JldHVybi0+cG9ydElkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgICAgICBfYWlkbF9yZXR1cm4tPnNlY29uZGFyeU91dHB1dHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPGludDMyX3Q+PihzZWNvbmRhcnlPdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2lvX2hhbmRsZV90X2ludDMyX3QpKTsKICAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QocmVzdWx0KTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKQEAgLTMwOCwxMCArNDA2LDEyIEBACiAgICAgZWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChpbnQzMl90IHBvcnRJZEFpZGwpCiB7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWRBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOwogICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKQEAgLTMzMywxNyArNDMzLDE5IEBACiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKHN0YXR1cyk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoaW50MzJfdCBwb3J0SWRBaWRsKQogeworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocG9ydElkQWlkbCkpOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChwb3J0SWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC0zNzEsMTMgKzQ3MywxNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChpbnQzMl90IHBvcnRJZEFpZGwpCiB7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWRBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChwb3J0SWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC00MDAsMjggKzUwNSw0MCBAQAogICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0Rm9yQXR0cihjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmlpZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3NBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkdldElucHV0Rm9yQXR0clJlc3BvbnNlKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsKSk7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9faW9faGFuZGxlX3QoaW5wdXRBaWRsKSk7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb191bmlxdWVfaWRfdChyaWlkQWlkbCkpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uQWlkbCkpOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0NvbmZpZ0Jhc2VfYXVkaW9fY29uZmlnX2Jhc2VfdChjb25maWdBaWRsKSk7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pbnB1dF9mbGFnc190X21hc2soZmxhZ3NBaWRsKSk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHNlbGVjdGVkRGV2aWNlSWRBaWRsKSk7CisKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXN1bHQgPSB2YWxpZGF0ZVVzYWdlKGF0dHItPnVzYWdlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKAorICAgICAgICAgICAgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHIsICI2ODk1Mzk1MCIpKSk7CiAKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKKyAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHIuc291cmNlOwogICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewogICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQpAQCAtNDMyLDQ4ICs1NDksNzMgQEAKICAgICAgICAgICAgICAgICAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAogICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICAgICAgICAgICAgICAgICYmIGlucHV0U291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogCi0gICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKLSAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIC8vIE1ha2Ugc3VyZSBhdHRyaWJ1dGlvbiBzb3VyY2UgcmVwcmVzZW50cyB0aGUgY3VycmVudCBjYWxsZXIKKyAgICBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGFkakF0dHJpYnV0aW9uU291cmNlID0gYXR0cmlidXRpb25Tb3VyY2U7CisgICAgLy8gVE9ETyBiLzE4MjM5MjU1MzogcmVmYWN0b3Igb3IgcmVtb3ZlCisgICAgYm9vbCB1cGRhdGVQaWQgPSAoYXR0cmlidXRpb25Tb3VyY2UucGlkID09IC0xKTsKKyAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID1JUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgY29uc3QgdWlkX3QgY3VycmVudFVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoCisgICAgICAgICAgICBhdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dXX0lGKHVpZCAhPSAodWlkX3QpLTEgJiYgdWlkICE9IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIHVpZCk7Ci0gICAgICAgIHVpZCA9IGNhbGxpbmdVaWQ7CisgICAgICAgIEFMT0dXX0lGKGN1cnJlbnRVaWQgIT0gKHVpZF90KS0xICYmIGN1cnJlbnRVaWQgIT0gY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwKKyAgICAgICAgICAgICAgICBjdXJyZW50VWlkKTsKKyAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdCgKKyAgICAgICAgICAgICAgICBjYWxsaW5nVWlkKSk7CiAgICAgICAgIHVwZGF0ZVBpZCA9IHRydWU7CiAgICAgfQogCiAgICAgaWYgKHVwZGF0ZVBpZCkgewotICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICBBTE9HV19JRihwaWQgIT0gKHBpZF90KS0xICYmIHBpZCAhPSBjYWxsaW5nUGlkLAorICAgICAgICBjb25zdCBpbnQzMl90IGNhbGxpbmdQaWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KAorICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSk7CisgICAgICAgIEFMT0dXX0lGKGF0dHJpYnV0aW9uU291cmNlLnBpZCAhPSAtMSAmJiBhdHRyaWJ1dGlvblNvdXJjZS5waWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBwaWQpOwotICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOworICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkLCBjYWxsaW5nUGlkLCBhdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBjYWxsaW5nUGlkOwogICAgIH0KIAorICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyLnVzYWdlLAorICAgICAgICAgICAgYWRqQXR0cmlidXRpb25Tb3VyY2UpKSk7CisKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zLgotICAgIC8vIENhcHR1cmluZyBmcm9tIEZNX1RVTkVSIHNvdXJjZSBpcyBjb250cm9sbGVkIGJ5IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoKSBvbmx5IGFzIHRoaXMKLSAgICAvLyBkb2VzIG5vdCBhZmZlY3QgdXNlcnMgcHJpdmFjeSBhcyBkb2VzIGNhcHR1cmluZyBmcm9tIGFuIGFjdHVhbCBtaWNyb3Bob25lLgotICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpIHx8IGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIGZvciB1aWQgJWQgcGlkICVkIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdWlkLCBwaWQpOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgLy8gQ2FwdHVyaW5nIGZyb20gRk1fVFVORVIgc291cmNlIGlzIGNvbnRyb2xsZWQgYnkgY2FwdHVyZVR1bmVyQXVkaW9JbnB1dEFsbG93ZWQoKSBhbmQKKyAgICAvLyBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkgKGRlcHJlY2F0ZWQpIGFzIHRoaXMgZG9lcyBub3QgYWZmZWN0IHVzZXJzIHByaXZhY3kKKyAgICAvLyBhcyBkb2VzIGNhcHR1cmluZyBmcm9tIGFuIGFjdHVhbCBtaWNyb3Bob25lLgorICAgIGlmICghKHJlY29yZGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UsIGF0dHIuc291cmNlKQorICAgICAgICAgICAgfHwgYXR0ci5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgeworICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgJXMiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAotICAgIGJvb2wgY2FuQ2FwdHVyZU91dHB1dCA9IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpOworICAgIGJvb2wgY2FuQ2FwdHVyZU91dHB1dCA9IGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpOwogICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyB8fAogICAgICAgICBpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKICAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NBTEwgfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFfHwKLSAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSAmJgotICAgICAgICAhY2FuQ2FwdHVyZU91dHB1dCkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkKKyAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKLSAgICBib29sIGNhbkNhcHR1cmVIb3R3b3JkID0gY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCisgICAgICAgICYmICFjYXB0dXJlVHVuZXJBdWRpb0lucHV0QWxsb3dlZChhZGpBdHRyaWJ1dGlvblNvdXJjZSkKKyAgICAgICAgJiYgIWNhbkNhcHR1cmVPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CisKKyAgICBib29sIGNhbkNhcHR1cmVIb3R3b3JkID0gY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGFkakF0dHJpYnV0aW9uU291cmNlKTsKICAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FuQ2FwdHVyZUhvdHdvcmQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CisKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCkgIT0gMCkKKyAgICAgICAgICAgICYmICFjYW5DYXB0dXJlSG90d29yZCkgeworICAgICAgICBBTE9HRSgiJXM6IHBlcm1pc3Npb24gZGVuaWVkOiBob3R3b3JkIG1vZGUgbm90IGFsbG93ZWQiCisgICAgICAgICAgICAgICIgZm9yIHVpZCAlZCBwaWQgJWQiLCBfX2Z1bmNfXywgYWRqQXR0cmlidXRpb25Tb3VyY2UudWlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZS5waWQpOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CkBAIC00ODUsMTAgKzYyNywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgICAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCi0gICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHJpaWQsIHNlc3Npb24sIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSwgcG9ydElkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCByaWlkLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkakF0dHJpYnV0aW9uU291cmNlLCAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRUeXBlLCAmcG9ydElkKTsKKwogICAgICAgICB9CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAKQEAgLTUwOSw3ICs2NTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOgotICAgICAgICAgICAgICAgIGlmICghbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoYWRqQXR0cmlidXRpb25Tb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogbW9kaWZ5IGF1ZGlvIHJvdXRpbmcgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTI0LDI5ICs2NjcsMzcgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCpwb3J0SWQpOworICAgICAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChwb3J0SWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgc2Vzc2lvbiwgKnBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCwgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5DYXB0dXJlT3V0cHV0LCBjYW5DYXB0dXJlSG90d29yZCk7Ci0gICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMuYWRkKCpwb3J0SWQsIGNsaWVudCk7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnQoYXR0ciwgaW5wdXQsIHNlc3Npb24sIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLCBhZGpBdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5DYXB0dXJlT3V0cHV0LCBjYW5DYXB0dXJlSG90d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZCk7CisgICAgICAgIG1BdWRpb1JlY29yZENsaWVudHMuYWRkKHBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRJbnB1dEVmZmVjdHMoKmlucHV0LCBpbnB1dFNvdXJjZSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkSW5wdXRFZmZlY3RzKGlucHV0LCBpbnB1dFNvdXJjZSwgc2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIGlucHV0ICVkIiwgKmlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBpbnB1dCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgX2FpZGxfcmV0dXJuLT5pbnB1dCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9faW9faGFuZGxlX3RfaW50MzJfdChpbnB1dCkpOworICAgIF9haWRsX3JldHVybi0+c2VsZWN0ZWREZXZpY2VJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHNlbGVjdGVkRGV2aWNlSWQpKTsKKyAgICBfYWlkbF9yZXR1cm4tPnBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcG9ydF9oYW5kbGVfdF9pbnQzMl90KHBvcnRJZCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIHN0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQgPSB7fTsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBwb3J0ID0ge307CiAgICAgcG9ydC5pZCA9IHBvcnRJZDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRBdWRpb1BvcnQoJnBvcnQpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcG9ydC50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKQEAgLTU1NSwxMCArNzA2LDEzIEBACiAgICAgcmV0dXJuIHt9OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGludDMyX3QgcG9ydElkQWlkbCkKIHsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wb3J0X2hhbmRsZV90KHBvcnRJZEFpZGwpKTsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudDsKICAgICB7CkBAIC01NjYsMTcgKzcyMCwyMSBAQAogCiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgfQogICAgICAgICBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOwogICAgIH0KIAorICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG1zZzsKKyAgICBtc2cgPDwgIkF1ZGlvIHJlY29yZGluZyBvbiBzZXNzaW9uICIgPDwgY2xpZW50LT5zZXNzaW9uOworCiAgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucwotICAgIGlmICghKHN0YXJ0UmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT5waWQsIGNsaWVudC0+dWlkKQorICAgIGlmICghKHN0YXJ0UmVjb3JkaW5nKGNsaWVudC0+YXR0cmlidXRpb25Tb3VyY2UsIFN0cmluZzE2KG1zZy5zdHIoKS5jX3N0cigpKSwKKyAgICAgICAgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkKICAgICAgICAgICAgIHx8IGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSKSkgewotICAgICAgICBBTE9HRSgiJXMgcGVybWlzc2lvbiBkZW5pZWQ6IHJlY29yZGluZyBub3QgYWxsb3dlZCBmb3IgdWlkICVkIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+dWlkLCBjbGllbnQtPnBpZCk7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgQUxPR0UoIiVzIHBlcm1pc3Npb24gZGVuaWVkOiByZWNvcmRpbmcgbm90IGFsbG93ZWQgZm9yIGF0dHJpYnV0aW9uIHNvdXJjZSAlcyIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+YXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtNjE5LDExICs3NzcsMTMgQEAKICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbiwgY2xpZW50LT5zZXNzaW9uKTsKLSAgICAgICAgICAgIGlmIChjbGllbnQtPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLmhhc192YWx1ZSgpICYmCisgICAgICAgICAgICAgICAgY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS52YWx1ZSgpLnNpemUoKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZS5wYWNrYWdlTmFtZS52YWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csIHN0ZDo6dG9fc3RyaW5nKGNsaWVudC0+dWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGNsaWVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1BvbGljeVJxc3REZXZpY2UsIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoY2xpZW50LT5kZXZpY2VJZCkuY19zdHIoKSk7CkBAIC02MzksMTIgKzc5OSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhvdGhlci0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPmF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLmhhc192YWx1ZSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci0+YXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUudmFsdWUoKS5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci0+YXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUudmFsdWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csIHN0ZDo6dG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLT5hdHRyaWJ1dGlvblNvdXJjZS51aWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQob3RoZXItPmRldmljZUlkKS5jX3N0cigpKTsKQEAgLTY2MCwyMyArODIxLDI2IEBACiAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CiAgICAgICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOwogICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwotICAgICAgICBmaW5pc2hSZWNvcmRpbmcoY2xpZW50LT5vcFBhY2thZ2VOYW1lLCBjbGllbnQtPnVpZCk7CisgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLCBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKTsKICAgICB9CiAKLSAgICByZXR1cm4gc3RhdHVzOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChzdGF0dXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BJbnB1dChpbnQzMl90IHBvcnRJZEFpZGwpCiB7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWRBaWRsKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICB9CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKQEAgLTY4NiwxNSArODUwLDE4IEBACiAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAotICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKKyAgICBmaW5pc2hSZWNvcmRpbmcoY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZSwgY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChwb3J0SWQpKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChpbnQzMl90IHBvcnRJZEFpZGwpCiB7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fcG9ydF9oYW5kbGVfdChwb3J0SWRBaWRsKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQ7CkBAIC03MDMsNyArODcwLDcgQEAKICAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOwogICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICB9CiAgICAgICAgIGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKQEAgLTcxNyw3ICs4ODQsNyBAQAogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICB9CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dApAQCAtNzMxLDIzOSArODk4LDM1NCBAQAogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmluaXRTdHJlYW1Wb2x1bWUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4TWluQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleE1heEFpZGwpIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOworICAgIGludCBpbmRleE1pbiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4TWluQWlkbCkpOworICAgIGludCBpbmRleE1heCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQ+KGluZGV4TWF4QWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0VSUk9SKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3RyZWFtVm9sdW1lSW5kZXgobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90IGluZGV4QWlkbCkgeworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CisgICAgaW50IGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2VBaWRsLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9TdHJlYW1UeXBlX2F1ZGlvX3N0cmVhbV90eXBlX3Qoc3RyZWFtQWlkbCkpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZGV2aWNlc190KGRldmljZUFpZGwpKTsKKyAgICBpbnQgaW5kZXg7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFN0cmVhbVZvbHVtZUluZGV4KHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sICZpbmRleCwgZGV2aWNlKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oaW5kZXgpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ckFpZGwsIGludDMyX3QgZGV2aWNlQWlkbCwgaW50MzJfdCBpbmRleEFpZGwpIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJBaWRsKSk7CisgICAgaW50IGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgIjE2OTU3MjY0MSIpKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJBaWRsLCBpbnQzMl90IGRldmljZUFpZGwsIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0ckFpZGwpKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX2RldmljZXNfdChkZXZpY2VBaWRsKSk7CisgICAgaW50IGluZGV4OworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgIjE2OTU3MjY0MSIpKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSkpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOworICAgIGludCBpbmRleDsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICIxNjk1NzI2NDEiKSkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCkpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyQWlkbCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0ludGVybmFsX2F1ZGlvX2F0dHJpYnV0ZXNfdChhdHRyQWlkbCkpOworICAgIGludCBpbmRleDsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICIxNjk1NzI2NDEiKSkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCkpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludDMyX3Q+KGluZGV4KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CisKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICAgICAgY29udmVydFJlaW50ZXJwcmV0PGludDMyX3Q+KFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBQUk9EVUNUX1NUUkFURUdZX05PTkU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CisKICAgICAvLyBETyBOT1QgTE9DSywgbWF5IGJlIGNhbGxlZCBmcm9tIEF1ZGlvRmxpbmdlciB3aXRoIGxvY2sgaGVsZCwgcmVhY2hpbmcgZGVhZGxvY2sKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX3Byb2R1Y3Rfc3RyYXRlZ3lfdF9pbnQzMl90KAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogLy9hdWRpbyBwb2xpY3k6IHVzZSBhdWRpb19kZXZpY2VfdCBhcHByb3ByaWF0ZWx5CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VzRm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKKwogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KEFVRElPX0RFVklDRV9OT05FKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0pOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JTdHJlYW0oc3RyZWFtKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcykgY29uc3QKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYXR0ckFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pCiB7CisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMoYXR0ckFpZGwpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXM7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYWEuZ2V0QXR0cmlidXRlcygpLCBkZXZpY2VzKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYWEuZ2V0QXR0cmlidXRlcygpLCAmZGV2aWNlcykpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKQotewotICAgIC8vIEZJWE1FIGNoYW5nZSByZXR1cm4gdHlwZSB0byBzdGF0dXNfdCwgYW5kIHJldHVybiBOT19JTklUIGhlcmUKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckVmZmVjdChjb25zdCBtZWRpYTo6RWZmZWN0RGVzY3JpcHRvciYgZGVzY0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoZGVzY0FpZGwpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlRWZmZWN0RGVzY3JpcHRvcihkZXNjLCAiNzMxMjYxMDYiKSkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdChkZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckVmZmVjdCgmZGVzYykpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBkZXNjQWlkbCwgaW50MzJfdCBpb0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmF0ZWd5QWlkbCwgaW50MzJfdCBzZXNzaW9uQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaWRBaWRsKSB7CisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9FZmZlY3REZXNjcmlwdG9yX2VmZmVjdF9kZXNjcmlwdG9yX3QoZGVzY0FpZGwpKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpb0FpZGwpKTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KHN0cmF0ZWd5QWlkbCkpOworICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3Nlc3Npb25fdChzZXNzaW9uQWlkbCkpOworICAgIGludCBpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQ+KGlkQWlkbCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVFZmZlY3REZXNjcmlwdG9yKGRlc2MsICI3MzEyNjEwNiIpKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoJmRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnVucmVnaXN0ZXJFZmZlY3QoaW50MzJfdCBpZEFpZGwpCiB7CisgICAgaW50IGlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydFJlaW50ZXJwcmV0PGludD4oaWRBaWRsKSk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT51bnJlZ2lzdGVyRWZmZWN0KGlkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEVmZmVjdEVuYWJsZWQoaW50MzJfdCBpZEFpZGwsIGJvb2wgZW5hYmxlZCkKIHsKKyAgICBpbnQgaWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50PihpZEFpZGwpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjptb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Om1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaWRzQWlkbCwgaW50MzJfdCBpb0FpZGwpCisKIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8aW50Pj4oaWRzQWlkbCwgY29udmVydFJlaW50ZXJwcmV0PGludCwgaW50MzJfdD4pKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19pb19oYW5kbGVfdChpb0FpZGwpKTsKKyAgICBpZiAoaWRzLnNpemUoKSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5tb3ZlRWZmZWN0c1RvSW8oaWRzLCBpbykpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluUGFzdE1zQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CisgICAgdWludDMyX3QgaW5QYXN0TXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KGluUGFzdE1zQWlkbCkpOworCiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gZmFsc2U7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcyk7CisgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluUGFzdE1zQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU3RyZWFtVHlwZV9hdWRpb19zdHJlYW1fdHlwZV90KHN0cmVhbUFpZGwpKTsKKyAgICB1aW50MzJfdCBpblBhc3RNcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oaW5QYXN0TXNBaWRsKSk7CisKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworICAgICpfYWlkbF9yZXR1cm4gPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1NvdXJjZUFjdGl2ZShtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZUFpZGwsIGJvb2wqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKQpAQCAtOTgyLDI0NiArMTI2NCwzNzggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKLXsKLSAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgKmNvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoCisgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uQWlkbCwKKyAgICAgICAgbWVkaWE6OkludCogY291bnRBaWRsLAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4qIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KGF1ZGlvU2Vzc2lvbkFpZGwpKTsKKyAgICB1aW50MzJfdCBjb3VudCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4oY291bnRBaWRsLT52YWx1ZSkpOworICAgIGlmIChjb3VudCA+IEF1ZGlvRWZmZWN0OjprTWF4UHJlUHJvY2Vzc2luZykgeworICAgICAgICBjb3VudCA9IEF1ZGlvRWZmZWN0OjprTWF4UHJlUHJvY2Vzc2luZzsKICAgICB9Ci0gICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKAotICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CisgICAgdWludDMyX3QgY291bnRSZXEgPSBjb3VudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZWZmZWN0X2Rlc2NyaXB0b3JfdFtdPiBkZXNjcmlwdG9ycyhuZXcgZWZmZWN0X2Rlc2NyaXB0b3JfdFtjb3VudF0pOworCisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBhdWRpb1BvbGljeUVmZmVjdHM7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKSkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoYXVkaW9Qb2xpY3lFZmZlY3RzLT5xdWVyeURlZmF1bHRJbnB1dEVmZmVjdHMoCisgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KSBhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLmdldCgpLCAmY291bnQpKSk7CisgICAgY291bnRSZXEgPSBzdGQ6Om1pbihjb3VudCwgY291bnRSZXEpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UoZGVzY3JpcHRvcnMuZ2V0KCksIGRlc2NyaXB0b3JzLmdldCgpICsgY291bnRSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpfYWlkbF9yZXR1cm4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2VmZmVjdF9kZXNjcmlwdG9yX3RfRWZmZWN0RGVzY3JpcHRvcikpKTsKKyAgICBjb3VudEFpZGwtPnZhbHVlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPHVpbnQzMl90Pihjb3VudCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWVBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBlZmZlY3RfdXVpZF90IHR5cGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodHlwZUFpZGwpKTsKKyAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmcxNihvcFBhY2thZ2VOYW1lQWlkbCkpOworICAgIGVmZmVjdF91dWlkX3QgdXVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9VdWlkX2F1ZGlvX3V1aWRfdCh1dWlkQWlkbCkpOworICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KHNvdXJjZUFpZGwpKTsKKyAgICBhdWRpb191bmlxdWVfaWRfdCBpZDsKKwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpKSk7CiAgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9Ci0gICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKLSAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgICZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgJmlkKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb191bmlxdWVfaWRfdF9pbnQzMl90KGlkKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQotewotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdHlwZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcFBhY2thZ2VOYW1lQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvVXVpZCYgdXVpZEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIG1lZGlhOjpBdWRpb1VzYWdlIHVzYWdlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgZWZmZWN0X3V1aWRfdCB0eXBlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1V1aWRfYXVkaW9fdXVpZF90KHR5cGVBaWRsKSk7CisgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfc3RyaW5nX3ZpZXdfU3RyaW5nMTYob3BQYWNrYWdlTmFtZUFpZGwpKTsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvVXVpZF9hdWRpb191dWlkX3QodXVpZEFpZGwpKTsKKyAgICBhdWRpb191c2FnZV90IHVzYWdlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1VzYWdlX2F1ZGlvX3VzYWdlX3QodXNhZ2VBaWRsKSk7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQ7CisKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IGF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpKSk7CiAgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9Ci0gICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgKLSAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCB1c2FnZSwgaWQpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgdXNhZ2UsICZpZCkpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMobGVnYWN5MmFpZGxfYXVkaW9fdW5pcXVlX2lkX3RfaW50MzJfdChpZCkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaW50MzJfdCBpZEFpZGwpCiB7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoaWRBaWRsKSk7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQorICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cykpKTsKICAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaW50MzJfdCBpZEFpZGwpCiB7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fdW5pcXVlX2lkX3QoaWRBaWRsKSk7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQorICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cykpKTsKICAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KLSAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+JiBzeXN0ZW1Vc2FnZXMpIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVXNhZ2U+JiBzeXN0ZW1Vc2FnZXNBaWRsKSB7CisgICAgc2l6ZV90IHNpemUgPSBzeXN0ZW1Vc2FnZXNBaWRsLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxhdWRpb191c2FnZV90PiBzeXN0ZW1Vc2FnZXM7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzeXN0ZW1Vc2FnZXNBaWRsLmJlZ2luKCksIHN5c3RlbVVzYWdlc0FpZGwuYmVnaW4oKSArIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHN5c3RlbVVzYWdlcyksIGFpZGwybGVnYWN5X0F1ZGlvVXNhZ2VfYXVkaW9fdXNhZ2VfdCkpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogCiAgICAgYm9vbCBhcmVBbGxTeXN0ZW1Vc2FnZXMgPSBzdGQ6OmFsbF9vZihiZWdpbihzeXN0ZW1Vc2FnZXMpLCBlbmQoc3lzdGVtVXNhZ2VzKSwKICAgICAgICAgW10oYXVkaW9fdXNhZ2VfdCB1c2FnZSkgeyByZXR1cm4gaXNTeXN0ZW1Vc2FnZSh1c2FnZSk7IH0pOwogICAgIGlmICghYXJlQWxsU3lzdGVtVXNhZ2VzKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KIAogICAgIG1TdXBwb3J0ZWRTeXN0ZW1Vc2FnZXMgPSBzeXN0ZW1Vc2FnZXM7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgY2FwdHVyZVBvbGljeSkgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50MzJfdCB1aWRBaWRsLCBpbnQzMl90IGNhcHR1cmVQb2xpY3lBaWRsKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7CisgICAgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fZmxhZ3NfbWFza190X21hc2soY2FwdHVyZVBvbGljeUFpZGwpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiJXMoKSBtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGNhcHR1cmVQb2xpY3kpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZCwgY2FwdHVyZVBvbGljeSkpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T2ZmbG9hZFN1cHBvcnQoY29uc3QgbWVkaWE6OkF1ZGlvT2ZmbG9hZEluZm8mIGluZm9BaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvT2ZmbG9hZE1vZGUqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IGluZm8gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvT2ZmbG9hZEluZm9fYXVkaW9fb2ZmbG9hZF9pbmZvX3QoaW5mb0FpZGwpKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQVVESU9fT0ZGTE9BRF9OT1RfU1VQUE9SVEVEKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGxlZ2FjeTJhaWRsX2F1ZGlvX29mZmxvYWRfbW9kZV90X0F1ZGlvT2ZmbG9hZE1vZGUoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPZmZsb2FkU3VwcG9ydChpbmZvKSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnQWlkbCwKKyAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzQWlkbCwKKyAgICAgICAgYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQ29uZmlnQmFzZV9hdWRpb19jb25maWdfYmFzZV90KGNvbmZpZ0FpZGwpKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWxfYXVkaW9fYXR0cmlidXRlc190KGF0dHJpYnV0ZXNBaWRsKSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIEF1ZGlvVmFsaWRhdG9yOjp2YWxpZGF0ZUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCAiMTY5NTcyNjQxIikpKTsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoIm1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXN1bHQgPSB2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMudXNhZ2UpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCh2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMudXNhZ2UpKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworICAgICpfYWlkbF9yZXR1cm4gPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qb3J0cyhtZWRpYTo6QXVkaW9Qb3J0Um9sZSByb2xlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnRUeXBlIHR5cGVBaWRsLCBtZWRpYTo6SW50KiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BvcnQ+KiBwb3J0c0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRSb2xlX2F1ZGlvX3BvcnRfcm9sZV90KHJvbGVBaWRsKSk7CisgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Qb3J0VHlwZV9hdWRpb19wb3J0X3R5cGVfdCh0eXBlQWlkbCkpOworICAgIHVuc2lnbmVkIGludCBudW1fcG9ydHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGNvdW50LT52YWx1ZSkpOworICAgIGlmIChudW1fcG9ydHMgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgbnVtX3BvcnRzID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHNSZXEgPSBudW1fcG9ydHM7CisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3BvcnRfdjdbXT4gcG9ydHMobmV3IGF1ZGlvX3BvcnRfdjdbbnVtX3BvcnRzXSk7CisgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgdHlwZSwgbnVtX3BvcnRzLCBwb3J0cywgZ2VuZXJhdGlvbik7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKHJvbGUsIHR5cGUsICZudW1fcG9ydHMsIHBvcnRzLmdldCgpLCAmZ2VuZXJhdGlvbikpKTsKKyAgICBudW1Qb3J0c1JlcSA9IHN0ZDo6bWluKG51bVBvcnRzUmVxLCBudW1fcG9ydHMpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UocG9ydHMuZ2V0KCksIHBvcnRzLmdldCgpICsgbnVtUG9ydHNSZXEsIHN0ZDo6YmFja19pbnNlcnRlcigqcG9ydHNBaWRsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydCkpKTsKKyAgICBjb3VudC0+dmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4obnVtX3BvcnRzKSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihnZW5lcmF0aW9uKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvcnQoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydCYgcG9ydEFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9ydCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fcG9ydF92NyBwb3J0ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRfYXVkaW9fcG9ydF92Nyhwb3J0QWlkbCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9Qb3J0KHBvcnQpKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KHBvcnQpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KCZwb3J0KSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X3Y3X0F1ZGlvUG9ydChwb3J0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IG1lZGlhOjpBdWRpb1BhdGNoJiBwYXRjaEFpZGwsIGludDMyX3QgaGFuZGxlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2ggPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvUGF0Y2hfYXVkaW9fcGF0Y2gocGF0Y2hBaWRsKSk7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QoaGFuZGxlQWlkbCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9QYXRjaChwYXRjaCkpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9oYW5kbGVfdF9pbnQzMl90KGhhbmRsZSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZUF1ZGlvUGF0Y2goaW50MzJfdCBoYW5kbGVBaWRsKQogeworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19wYXRjaF9oYW5kbGVfdChoYW5kbGVBaWRsKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BhdGNoZXMobWVkaWE6OkludCogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1BhdGNoPiogcGF0Y2hlc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIHVuc2lnbmVkIGludCBudW1fcGF0Y2hlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oY291bnQtPnZhbHVlKSk7CisgICAgaWYgKG51bV9wYXRjaGVzID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgIG51bV9wYXRjaGVzID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgbnVtUGF0Y2hlc1JlcSA9IG51bV9wYXRjaGVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb19wYXRjaFtdPiBwYXRjaGVzKG5ldyBhdWRpb19wYXRjaFtudW1fcGF0Y2hlc10pOworICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMsIGdlbmVyYXRpb24pOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9QYXRjaGVzKCZudW1fcGF0Y2hlcywgcGF0Y2hlcy5nZXQoKSwgJmdlbmVyYXRpb24pKSk7CisgICAgbnVtUGF0Y2hlc1JlcSA9IHN0ZDo6bWluKG51bVBhdGNoZXNSZXEsIG51bV9wYXRjaGVzKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgY29udmVydFJhbmdlKHBhdGNoZXMuZ2V0KCksIHBhdGNoZXMuZ2V0KCkgKyBudW1QYXRjaGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcigqcGF0Y2hlc0FpZGwpLCBsZWdhY3kyYWlkbF9hdWRpb19wYXRjaF9BdWRpb1BhdGNoKSkpOworICAgIGNvdW50LT52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDxpbnQzMl90PihudW1fcGF0Y2hlcykpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oZ2VuZXJhdGlvbikpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IG1lZGlhOjpBdWRpb1BvcnRDb25maWcmIGNvbmZpZ0FpZGwpCiB7CisgICAgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoY29uZmlnQWlkbCkpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoCisgICAgICAgICAgICBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChBdWRpb1ZhbGlkYXRvcjo6dmFsaWRhdGVBdWRpb1BvcnRDb25maWcoY29uZmlnKSkpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKG1lZGlhOjpTb3VuZFRyaWdnZXJTZXNzaW9uKiBfYWlkbF9yZXR1cm4pCiB7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGU7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOworICAgICAgICB9CisgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oJnNlc3Npb24sICZpb0hhbmRsZSwgJmRldmljZSkpKTsKKyAgICB9CisKKyAgICBfYWlkbF9yZXR1cm4tPnNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX3Nlc3Npb25fdF9pbnQzMl90KHNlc3Npb24pKTsKKyAgICBfYWlkbF9yZXR1cm4tPmlvSGFuZGxlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19pb19oYW5kbGVfdF9pbnQzMl90KGlvSGFuZGxlKSk7CisgICAgX2FpZGxfcmV0dXJuLT5kZXZpY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2RldmljZXNfdF9pbnQzMl90KGRldmljZSkpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbkFpZGwpCit7CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfYXVkaW9fc2Vzc2lvbl90KHNlc3Npb25BaWRsKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKHNlc3Npb24sIGlvSGFuZGxlLCBkZXZpY2UpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9NaXg+JiBtaXhlc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVnaXN0cmF0aW9uKSB7CisgICAgc2l6ZV90IHNpemUgPSBtaXhlc0FpZGwuc2l6ZSgpOworICAgIGlmIChzaXplID4gTUFYX01JWEVTX1BFUl9QT0xJQ1kpIHsKKyAgICAgICAgc2l6ZSA9IE1BWF9NSVhFU19QRVJfUE9MSUNZOwogICAgIH0KLSAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihzZXNzaW9uKTsKLX0KKyAgICBWZWN0b3I8QXVkaW9NaXg+IG1peGVzOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2UobWl4ZXNBaWRsLmJlZ2luKCksIG1peGVzQWlkbC5iZWdpbigpICsgc2l6ZSwgc3RkOjpiYWNrX2luc2VydGVyKG1peGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb01peCkpKTsKIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikKLXsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgLy8gbG9vcGJhY2t8cmVuZGVyIG9ubHkgbmVlZCBhIE1lZGlhUHJvamVjdGlvbiAoY2hlY2tlZCBpbiBjYWxsZXIgQXVkaW9TZXJ2aWNlLmphdmEpCiAgICAgYm9vbCBuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgewogICAgICAgICAgICAgcmV0dXJuICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncyk7IH0pOwogICAgIGlmIChuZWVkTW9kaWZ5QXVkaW9Sb3V0aW5nICYmICFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KIAogICAgIC8vIElmIG9uZSBvZiB0aGUgbWl4ZXMgaGFzIG5lZWRDYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0IHNldCB0byB0cnVlLCB0aGVuIHdlCkBAIC0xMjMxLDMwNCArMTY0NSw1NjQgQEAKICAgICAgICAgICAgIHJldHVybiBtaXgubVZvaWNlQ29tbXVuaWNhdGlvbkNhcHR1cmVBbGxvd2VkOyB9KTsKIAogICAgIGJvb2wgbmVlZENhcHR1cmVNZWRpYU91dHB1dCA9IHN0ZDo6YW55X29mKG1peGVzLmJlZ2luKCksIG1peGVzLmVuZCgpLCBbXShhdXRvJiBtaXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXgubUFsbG93UHJpdmlsZWdlZFBsYXliYWNrQ2FwdHVyZTsgfSk7CisgICAgICAgICAgICByZXR1cm4gbWl4Lm1BbGxvd1ByaXZpbGVnZWRNZWRpYVBsYXliYWNrQ2FwdHVyZTsgfSk7CiAKLSAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBhdHRyaWJ1dGlvblNvdXJjZSA9IGdldENhbGxpbmdBdHRyaWJ1dGlvblNvdXJjZSgpOwogCi0gICAgaWYgKG5lZWRDYXB0dXJlTWVkaWFPdXRwdXQgJiYgIWNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKG5lZWRDYXB0dXJlTWVkaWFPdXRwdXQgJiYgIWNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoYXR0cmlidXRpb25Tb3VyY2UpKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogCiAgICAgaWYgKG5lZWRDYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0ICYmCi0gICAgICAgICFjYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0QWxsb3dlZChjYWxsaW5nUGlkLCBjYWxsaW5nVWlkKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICFjYXB0dXJlVm9pY2VDb21tdW5pY2F0aW9uT3V0cHV0QWxsb3dlZChhdHRyaWJ1dGlvblNvdXJjZSkpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgaWYgKHJlZ2lzdHJhdGlvbikgewotICAgICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJQb2xpY3lNaXhlcyhtaXhlcyk7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhtaXhlcyk7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT51bnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMpKTsKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcygKKyAgICAgICAgaW50MzJfdCB1aWRBaWRsLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPihkZXZpY2VzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKFBFUk1JU1NJT05fREVOSUVEKTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1aWRBaWRsKSB7CisgICAgdWlkX3QgdWlkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCh1aWRBaWRsKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQsCi0gICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcygKKyAgICAgICAgaW50MzJfdCB1c2VySWRBaWRsLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgIGludCB1c2VySWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0UmVpbnRlcnByZXQ8aW50Pih1c2VySWRBaWRsKSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVzZXJJZERldmljZUFmZmluaXRpZXModXNlcklkLCBkZXZpY2VzKTsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcyh1c2VySWQsIGRldmljZXMpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKGludCB1c2VySWQpIHsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXMoaW50MzJfdCB1c2VySWRBaWRsKSB7CisgICAgaW50IHVzZXJJZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRSZWludGVycHJldDxpbnQ+KHVzZXJJZEFpZGwpKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChQRVJNSVNTSU9OX0RFTklFRCk7CiAgICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyh1c2VySWQpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVVc2VySWREZXZpY2VBZmZpbml0aWVzKHVzZXJJZCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgc291cmNlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgYXVkaW9fcG9ydF9jb25maWcgc291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1BvcnRDb25maWdfYXVkaW9fcG9ydF9jb25maWcoc291cmNlQWlkbCkpOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbF9hdWRpb19hdHRyaWJ1dGVzX3QoYXR0cmlidXRlc0FpZGwpKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9Qb3J0Q29uZmlnKHNvdXJjZSkpKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgQXVkaW9WYWxpZGF0b3I6OnZhbGlkYXRlQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsICI2ODk1Mzk1MCIpKSk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCByZXN1bHQgPSB2YWxpZGF0ZVVzYWdlKGF0dHJpYnV0ZXMtPnVzYWdlKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQorICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QodmFsaWRhdGVVc2FnZShhdHRyaWJ1dGVzLnVzYWdlKSkpOwogCiAgICAgLy8gc3RhcnRBdWRpb1NvdXJjZSBzaG91bGQgYmUgY3JlYXRlZCBhcyB0aGUgY2FsbGluZyB1aWQKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQsIGNhbGxpbmdVaWQpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmcG9ydElkLCBjYWxsaW5nVWlkKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhsZWdhY3kyYWlkbF9hdWRpb19wb3J0X2hhbmRsZV90X2ludDMyX3QocG9ydElkKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoaW50MzJfdCBwb3J0SWRBaWRsKQogeworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X2F1ZGlvX3BvcnRfaGFuZGxlX3QocG9ydElkQWlkbCkpOworCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wQXVkaW9Tb3VyY2UocG9ydElkKSk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoUEVSTUlTU0lPTl9ERU5JRUQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldE1hc3Rlck1vbm8obW9ubyk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKG1BdWRpb1BvbGljeU1hbmFnZXItPnNldE1hc3Rlck1vbm8obW9ubykpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1hc3Rlck1vbm8oYm9vbCogX2FpZGxfcmV0dXJuKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNYXN0ZXJNb25vKG1vbm8pOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNYXN0ZXJNb25vKF9haWRsX3JldHVybikpOwogfQogCiAKLWZsb2F0IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lREIoCi0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0U3RyZWFtVm9sdW1lREIobWVkaWE6OkF1ZGlvU3RyZWFtVHlwZSBzdHJlYW1BaWRsLCBpbnQzMl90IGluZGV4QWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlQWlkbCwgZmxvYXQqIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1N0cmVhbVR5cGVfYXVkaW9fc3RyZWFtX3R5cGVfdChzdHJlYW1BaWRsKSk7CisgICAgaW50IGluZGV4ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoY29udmVydEludGVncmFsPGludD4oaW5kZXhBaWRsKSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9hdWRpb19kZXZpY2VzX3QoZGV2aWNlQWlkbCkpOworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTkFOOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyZWFtVm9sdW1lREIoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzdXJyb3VuZEZvcm1hdHNFbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN1cnJvdW5kRm9ybWF0cyhtZWRpYTo6SW50KiBjb3VudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8Ym9vbD4qIGZvcm1hdHNFbmFibGVkKSB7CisgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydEludGVncmFsPHVuc2lnbmVkIGludD4oY291bnQtPnZhbHVlKSk7CisgICAgaWYgKG51bVN1cnJvdW5kRm9ybWF0cyA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICBudW1TdXJyb3VuZEZvcm1hdHMgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBudW1TdXJyb3VuZEZvcm1hdHM7CisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX2Zvcm1hdF90W10+c3Vycm91bmRGb3JtYXRzKG5ldyBhdWRpb19mb3JtYXRfdFtudW1TdXJyb3VuZEZvcm1hdHNdKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Ym9vbFtdPnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQobmV3IGJvb2xbbnVtU3Vycm91bmRGb3JtYXRzXSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3Vycm91bmRGb3JtYXRzKG51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwgcmVwb3J0ZWQpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdXJyb3VuZEZvcm1hdHMoJm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQuZ2V0KCkpKSk7CisgICAgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gc3RkOjptaW4obnVtU3Vycm91bmRGb3JtYXRzLCBudW1TdXJyb3VuZEZvcm1hdHNSZXEpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBjb252ZXJ0UmFuZ2Uoc3Vycm91bmRGb3JtYXRzLmdldCgpLCBzdXJyb3VuZEZvcm1hdHMuZ2V0KCkgKyBudW1TdXJyb3VuZEZvcm1hdHNSZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKCpmb3JtYXRzKSwgbGVnYWN5MmFpZGxfYXVkaW9fZm9ybWF0X3RfQXVkaW9Gb3JtYXQpKSk7CisgICAgZm9ybWF0c0VuYWJsZWQtPmluc2VydCgKKyAgICAgICAgICAgIGZvcm1hdHNFbmFibGVkLT5iZWdpbigpLAorICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZC5nZXQoKSwKKyAgICAgICAgICAgIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQuZ2V0KCkgKyBudW1TdXJyb3VuZEZvcm1hdHNSZXEpOworICAgIGNvdW50LT52YWx1ZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGNvbnZlcnRJbnRlZ3JhbDx1aW50MzJfdD4obnVtU3Vycm91bmRGb3JtYXRzKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKAorICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0PiogZm9ybWF0cykgeworICAgIHVuc2lnbmVkIGludCBudW1TdXJyb3VuZEZvcm1hdHMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRJbnRlZ3JhbDx1bnNpZ25lZCBpbnQ+KGNvdW50LT52YWx1ZSkpOworICAgIGlmIChudW1TdXJyb3VuZEZvcm1hdHMgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgbnVtU3Vycm91bmRGb3JtYXRzID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgbnVtU3Vycm91bmRGb3JtYXRzUmVxID0gbnVtU3Vycm91bmRGb3JtYXRzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb19mb3JtYXRfdFtdPnN1cnJvdW5kRm9ybWF0cyhuZXcgYXVkaW9fZm9ybWF0X3RbbnVtU3Vycm91bmRGb3JtYXRzXSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUChmb3JtYXRzKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgICAgICAgICAgICAgICZudW1TdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0cy5nZXQoKSkpKTsKKyAgICBudW1TdXJyb3VuZEZvcm1hdHNSZXEgPSBzdGQ6Om1pbihudW1TdXJyb3VuZEZvcm1hdHMsIG51bVN1cnJvdW5kRm9ybWF0c1JlcSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIGNvbnZlcnRSYW5nZShzdXJyb3VuZEZvcm1hdHMuZ2V0KCksIHN1cnJvdW5kRm9ybWF0cy5nZXQoKSArIG51bVN1cnJvdW5kRm9ybWF0c1JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKmZvcm1hdHMpLCBsZWdhY3kyYWlkbF9hdWRpb19mb3JtYXRfdF9BdWRpb0Zvcm1hdCkpKTsKKyAgICBjb3VudC0+dmFsdWUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8dWludDMyX3Q+KG51bVN1cnJvdW5kRm9ybWF0cykpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpCi17CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZm9ybWF0czsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZmb3JtYXRzKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OmF1ZGlvOjpjb21tb246OkF1ZGlvRm9ybWF0Pj4oCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX2F1ZGlvX2Zvcm1hdF90X0F1ZGlvRm9ybWF0KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKAorICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXRBaWRsLCBib29sIGVuYWJsZWQpIHsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Gb3JtYXRfYXVkaW9fZm9ybWF0X3QoYXVkaW9Gb3JtYXRBaWRsKSk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXNzaXN0YW50VWlkKGludDMyX3QgdWlkQWlkbCkKIHsKKyAgICB1aWRfdCB1aWQgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUyhhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KHVpZEFpZGwpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1VaWRQb2xpY3ktPnNldEFzc2lzdGFudFVpZCh1aWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQoaW50MzJfdCB1aWRBaWRsKQogeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0SG90d29yZERldGVjdGlvblNlcnZpY2VVaWQodWlkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiB1aWRzQWlkbCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IHVpZHNBaWRsLnNpemUoKTsKKyAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgY29udmVydFJhbmdlKHVpZHNBaWRsLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdWlkc0FpZGwuYmVnaW4oKSArIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHVpZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QpKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRDdXJyZW50SW1lVWlkKHVpZF90IHVpZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEN1cnJlbnRJbWVVaWQoaW50MzJfdCB1aWRBaWRsKQogeworICAgIHVpZF90IHVpZCA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QodWlkQWlkbCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVVpZFBvbGljeS0+c2V0Q3VycmVudEltZVVpZCh1aWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1Byb2R1Y3RTdHJhdGVneT4qIF9haWRsX3JldHVybikgeworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoCisgICAgICAgICAgICBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZHVjdFN0cmF0ZWd5Pj4oCisgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMsCisgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvUHJvZHVjdFN0cmF0ZWd5KSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKAotICAgICAgICBjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLCBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYWFBaWRsLCBib29sIGZhbGxiYWNrT25EZWZhdWx0LCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBBdWRpb0F0dHJpYnV0ZXMgYWEgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvQXR0cmlidXRlc0V4X0F1ZGlvQXR0cmlidXRlcyhhYUFpZGwpKTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgcHJvZHVjdFN0cmF0ZWd5OworCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhLCBwcm9kdWN0U3RyYXRlZ3kpOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoCisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICBhYSwgcHJvZHVjdFN0cmF0ZWd5LCBmYWxsYmFja09uRGVmYXVsdCkpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBsZWdhY3kyYWlkbF9wcm9kdWN0X3N0cmF0ZWd5X3RfaW50MzJfdChwcm9kdWN0U3RyYXRlZ3kpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvVm9sdW1lR3JvdXA+KiBfYWlkbF9yZXR1cm4pCiB7CisgICAgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciBncm91cHM7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKAorICAgICAgICAgICAgYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QobUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3VwcykpKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1ZvbHVtZUdyb3VwPj4oZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeTJhaWRsX0F1ZGlvVm9sdW1lR3JvdXApKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQoteworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzRXgmIGFhQWlkbCwgYm9vbCBmYWxsYmFja09uRGVmYXVsdCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0F0dHJpYnV0ZXNFeF9BdWRpb0F0dHJpYnV0ZXMoYWFBaWRsKSk7CisgICAgdm9sdW1lX2dyb3VwX3Qgdm9sdW1lR3JvdXA7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhYSwgdm9sdW1lR3JvdXApOworICAgIFJFVFVSTl9JRl9CSU5ERVJfRVJST1IoCisgICAgICAgICAgICBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhLCB2b2x1bWVHcm91cCwgZmFsbGJhY2tPbkRlZmF1bHQpKSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKGxlZ2FjeTJhaWRsX3ZvbHVtZV9ncm91cF90X2ludDMyX3Qodm9sdW1lR3JvdXApKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVWlkUG9saWN5LT5zZXRSdHRFbmFibGVkKGVuYWJsZWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZCgpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKGJvb2wqIF9haWRsX3JldHVybikKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc0NhbGxTY3JlZW5Nb2RlU3VwcG9ydGVkKCk7CisgICAgKl9haWRsX3JldHVybiA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koCisgICAgICAgIGludDMyX3Qgc3RyYXRlZ3lBaWRsLAorICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X2ludDMyX3RfcHJvZHVjdF9zdHJhdGVneV90KHN0cmF0ZWd5QWlkbCkpOworICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCi17Ci0gICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koaW50MzJfdCBzdHJhdGVneUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsKSB7CisgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF9wcm9kdWN0X3N0cmF0ZWd5X3Qoc3RyYXRlZ3lBaWRsKSk7CisgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKKyAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JTdHJhdGVneShzdHJhdGVneSwgcm9sZSkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkKLXsKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koCisgICAgICAgIGludDMyX3Qgc3RyYXRlZ3lBaWRsLAorICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiogX2FpZGxfcmV0dXJuKSB7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3Byb2R1Y3Rfc3RyYXRlZ3lfdChzdHJhdGVneUFpZGwpKTsKKyAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgUkVUVVJOX0lGX0JJTkRFUl9FUlJPUihiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3koc3RyYXRlZ3ksIHJvbGUsIGRldmljZXMpKSk7CisgICAgKl9haWRsX3JldHVybiA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+PihkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAotICAgIGNvbnN0IHNwPG1lZGlhOjpJQ2FwdHVyZVN0YXRlTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICBib29sKiByZXN1bHQpCi17Ci0gICAgKnJlc3VsdCA9IG1DYXB0dXJlU3RhdGVOb3RpZmllci5SZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyKAorICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUNhcHR1cmVTdGF0ZUxpc3RlbmVyPiYgbGlzdGVuZXIsIGJvb2wqIF9haWRsX3JldHVybikgeworICAgICpfYWlkbF9yZXR1cm4gPSBtQ2FwdHVyZVN0YXRlTm90aWZpZXIuUmVnaXN0ZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXNBaWRsKSB7CisgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlcyA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yPihkZXZpY2VzQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7Cit9CisKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZUFpZGwsCisgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzQWlkbCkgeworICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXMgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8QXVkaW9EZXZpY2VUeXBlQWRkclZlY3Rvcj4oZGV2aWNlc0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvRGV2aWNlVHlwZUFkZHJlc3MpKTsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2VBaWRsLAorICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlQWlkbCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlc0FpZGwpIHsKKyAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfQXVkaW9Tb3VyY2VUeXBlX2F1ZGlvX3NvdXJjZV90KGF1ZGlvU291cmNlQWlkbCkpOworICAgIGRldmljZV9yb2xlX3Qgcm9sZSA9IFZBTFVFX09SX1JFVFVSTl9CSU5ERVJfU1RBVFVTKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfRGV2aWNlUm9sZV9kZXZpY2Vfcm9sZV90KHJvbGVBaWRsKSk7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBkZXZpY2VzID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3I+KGRldmljZXNBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb0RldmljZVR5cGVBZGRyZXNzKSk7CisKKyAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKE5PX0lOSVQpOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVCgKKyAgICAgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworfQorCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpjbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGVBaWRsKSB7CisgICAgYXVkaW9fc291cmNlX3QgYXVkaW9Tb3VyY2UgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0F1ZGlvU291cmNlVHlwZV9hdWRpb19zb3VyY2VfdChhdWRpb1NvdXJjZUFpZGwpKTsKKyAgICBkZXZpY2Vfcm9sZV90IHJvbGUgPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGFpZGwybGVnYWN5X0RldmljZVJvbGVfZGV2aWNlX3JvbGVfdChyb2xlQWlkbCkpOworCisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gYmluZGVyU3RhdHVzRnJvbVN0YXR1c1QoTk9fSU5JVCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Y2xlYXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUpKTsKK30KKworU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAorICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlQWlkbCwKKyAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZUFpZGwsCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgeworICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9BdWRpb1NvdXJjZVR5cGVfYXVkaW9fc291cmNlX3QoYXVkaW9Tb3VyY2VBaWRsKSk7CisgICAgZGV2aWNlX3JvbGVfdCByb2xlID0gVkFMVUVfT1JfUkVUVVJOX0JJTkRFUl9TVEFUVVMoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9EZXZpY2VSb2xlX2RldmljZV9yb2xlX3Qocm9sZUFpZGwpKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZXM7CisKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBiaW5kZXJTdGF0dXNGcm9tU3RhdHVzVChOT19JTklUKTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBSRVRVUk5fSUZfQklOREVSX0VSUk9SKGJpbmRlclN0YXR1c0Zyb21TdGF0dXNUKAorICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSkpOworICAgICpfYWlkbF9yZXR1cm4gPSBWQUxVRV9PUl9SRVRVUk5fQklOREVSX1NUQVRVUygKKyAgICAgICAgICAgIGNvbnZlcnRDb250YWluZXI8c3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPj4oZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfQXVkaW9EZXZpY2VUeXBlQWRkcmVzcykpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBlODQ3ZjlmLi40ZDBlMWYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KQEAgLTM1LDE4ICszNiwyMyBAQAogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewordXNpbmcgYmluZGVyOjpTdGF0dXM7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogc3RhdGljIGNvbnN0IGNoYXIga0NtZERlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCB0aHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CitzdGF0aWMgY29uc3QgY2hhciBrQXVkaW9Qb2xpY3lNYW5hZ2VyQ3VzdG9tUGF0aFtdID0gImxpYmF1ZGlvcG9saWN5bWFuYWdlcmN1c3RvbS5zbyI7CiAKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrVGltZW91dE5zID0gMSAqIE5BTk9TX1BFUl9TRUNPTkQ7CiAKQEAgLTU2LDEyICs2Miw1NCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCit7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyICphcG0gPSBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXBtLT5pbml0aWFsaXplKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBkZWxldGUgYXBtOworICAgICAgICBhcG0gPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gYXBtOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5SW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisgICAgZGVsZXRlIGludGVyZmFjZTsKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeVNlcnZpY2UoKQogICAgIDogQm5BdWRpb1BvbGljeVNlcnZpY2UoKSwKICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIoTlVMTCksCiAgICAgICBtQXVkaW9Qb2xpY3lDbGllbnQoTlVMTCksCiAgICAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX0lOVkFMSUQpLAotICAgICAgbUNhcHR1cmVTdGF0ZU5vdGlmaWVyKGZhbHNlKSB7CisgICAgICBtQ2FwdHVyZVN0YXRlTm90aWZpZXIoZmFsc2UpLAorICAgICAgbUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcihjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIpLAorICAgICAgbURlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcikgeworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6bG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpCit7CisgICAgbUxpYnJhcnlIYW5kbGUgPSBkbG9wZW4oa0F1ZGlvUG9saWN5TWFuYWdlckN1c3RvbVBhdGgsIFJUTERfTk9XKTsKKyAgICBpZiAobUxpYnJhcnlIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HSSgiJXMgbG9hZGluZyAlcyIsIF9fZnVuY19fLCBrQXVkaW9Qb2xpY3lNYW5hZ2VyQ3VzdG9tUGF0aCk7CisgICAgICAgIG1DcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PENyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGxzeW0obUxpYnJhcnlIYW5kbGUsICJjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIiKSk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxhc3RFcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgQUxPR1dfSUYobUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyLCAiJXMgY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyIGlzIG51bGwgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbGFzdEVycm9yICE9IG51bGxwdHIgPyBsYXN0RXJyb3IgOiAibm8gZXJyb3IiKTsKKworICAgICAgICBtRGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlckluc3RhbmNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbHN5bShtTGlicmFyeUhhbmRsZSwgImRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIiKSk7CisgICAgICAgIGxhc3RFcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgQUxPR1dfSUYobURlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIgPT0gbnVsbHB0ciwgIiVzIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIgaXMgbnVsbCAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsYXN0RXJyb3IgIT0gbnVsbHB0ciA/IGxhc3RFcnJvciA6ICJubyBlcnJvciIpOworICAgICAgICBpZiAobUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlciA9PSBudWxscHRyIHx8IG1EZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyID09IG51bGxwdHIpeworICAgICAgICAgICAgdW5sb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJjb3VsZCBub3QgZmluZCBhdWRpb3BvbGljeW1hbmFnZXIgaW50ZXJmYWNlIG1ldGhvZHMiKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uRmlyc3RSZWYoKQpAQCAtNzUsNyArMTIzLDkgQEAKICAgICAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbU91dHB1dCIpLCB0aGlzKTsKIAogICAgICAgICBtQXVkaW9Qb2xpY3lDbGllbnQgPSBuZXcgQXVkaW9Qb2xpY3lDbGllbnQodGhpcyk7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIgPSBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIobUF1ZGlvUG9saWN5Q2xpZW50KTsKKworICAgICAgICBsb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXIgPSBtQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeUNsaWVudCk7CiAgICAgfQogICAgIC8vIGxvYWQgYXVkaW8gcHJvY2Vzc2luZyBtb2R1bGVzCiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBhdWRpb1BvbGljeUVmZmVjdHMgPSBuZXcgQXVkaW9Qb2xpY3lFZmZlY3RzKCk7CkBAIC05MSwxMiArMTQxLDI1IEBACiAgICAgc2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1bmxvYWRBdWRpb1BvbGljeU1hbmFnZXIoKQoreworICAgIEFMT0dWKCIlcyAiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1MaWJyYXJ5SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGxjbG9zZShtTGlicmFyeUhhbmRsZSk7CisgICAgfQorICAgIG1MaWJyYXJ5SGFuZGxlID0gbnVsbHB0cjsKKyAgICBtQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICBtRGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlciA9IG51bGxwdHI7Cit9CisKIEF1ZGlvUG9saWN5U2VydmljZTo6fkF1ZGlvUG9saWN5U2VydmljZSgpCiB7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5leGl0KCk7CiAKLSAgICBkZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgIG1EZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VyKG1BdWRpb1BvbGljeU1hbmFnZXIpOworICAgIHVubG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOworCiAgICAgZGVsZXRlIG1BdWRpb1BvbGljeUNsaWVudDsKIAogICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmNsZWFyKCk7CkBAIC0xMTEsMTEgKzE3NCwxMSBAQAogCiAvLyBBIG5vdGlmaWNhdGlvbiBjbGllbnQgaXMgYWx3YXlzIHJlZ2lzdGVyZWQgYnkgQXVkaW9TeXN0ZW0gd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MKIC8vIGNvbm5lY3RzIHRvIEF1ZGlvUG9saWN5U2VydmljZS4KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KQorU3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8bWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpCiB7CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CiAgICAgICAgIEFMT0dXKCIlcyBnb3QgTlVMTCBjbGllbnQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCkBAIC0xMzUsOSArMTk4LDEwIEBACiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKICAgICB9CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCkBAIC0xNDYsMTIgKzIxMCwxMyBAQAogICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CiAKICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCitTdGF0dXMgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKQEAgLTE2MCw5ICsyMjUsMTAgQEAKICAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOwogCiAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCkBAIC0yNzQsNiArMzQwLDE5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25Sb3V0aW5nVXBkYXRlZCgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJvdXRpbmdDaGFuZ2VkQ29tbWFuZCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJvdXRpbmdVcGRhdGVkKCkKK3sKKyAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJvdXRpbmdVcGRhdGVkKCk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudENyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcykKQEAgLTI5MywxMCArMzcyLDExIEBACiAgICAgcmV0dXJuIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uZmlnLCBkZWxheU1zKTsKIH0KIAotQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCkKK0F1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCisgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIHBpZF90IHBpZCkKICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1QaWQocGlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAogICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpLCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCiB7CkBAIC0zNDIsNyArNDIyLDggQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKLSAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCisgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfU3RyaW5nOF9zdHJpbmcocmVnSWQpLnZhbHVlKCksIHN0YXRlKTsKICAgICB9CiB9CiAKQEAgLTM1Nyw4ICs0MzgsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7Ci0gICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFsmXSgpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnRBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUyhjb252ZXJ0SW50ZWdyYWw8aW50MzJfdD4oZXZlbnQpKTsKKyAgICAgICAgICAgIG1lZGlhOjpSZWNvcmRDbGllbnRJbmZvIGNsaWVudEluZm9BaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfcmVjb3JkX2NsaWVudF9pbmZvX3RfUmVjb3JkQ2xpZW50SW5mbygqY2xpZW50SW5mbykpOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSBjbGllbnRDb25maWdBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fY29uZmlnX2Jhc2VfdF9BdWRpb0NvbmZpZ0Jhc2UoKmNsaWVudENvbmZpZykpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkVmZmVjdERlc2NyaXB0b3I+IGNsaWVudEVmZmVjdHNBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgY29udmVydENvbnRhaW5lcjxzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfZWZmZWN0X2Rlc2NyaXB0b3JfdF9FZmZlY3REZXNjcmlwdG9yKSk7CisgICAgICAgICAgICBtZWRpYTo6QXVkaW9Db25maWdCYXNlIGRldmljZUNvbmZpZ0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9hdWRpb19jb25maWdfYmFzZV90X0F1ZGlvQ29uZmlnQmFzZSgqZGV2aWNlQ29uZmlnKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0c0FpZGwgPSBWQUxVRV9PUl9SRVRVUk5fU1RBVFVTKAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0Q29udGFpbmVyPHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3kyYWlkbF9lZmZlY3RfZGVzY3JpcHRvcl90X0VmZmVjdERlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIGludDMyX3QgcGF0Y2hIYW5kbGVBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fcGF0Y2hfaGFuZGxlX3RfaW50MzJfdChwYXRjaEhhbmRsZSkpOworICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2VBaWRsID0gVkFMVUVfT1JfUkVUVVJOX1NUQVRVUygKKyAgICAgICAgICAgICAgICAgICAgbGVnYWN5MmFpZGxfYXVkaW9fc291cmNlX3RfQXVkaW9Tb3VyY2VUeXBlKHNvdXJjZSkpOworICAgICAgICAgICAgcmV0dXJuIGFpZGxfdXRpbHM6OnN0YXR1c1RGcm9tQmluZGVyU3RhdHVzKAorICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnRBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SW5mb0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RWZmZWN0c0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb25maWdBaWRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0c0FpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZUFpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VBaWRsKSk7CisgICAgICAgIH0oKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE9LLCAib25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKCkgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CiAgICAgfQogfQogCkBAIC0zNzIsNiArNDgyLDEzIEBACiAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25Sb3V0aW5nVXBkYXRlZCgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKKyAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25Sb3V0aW5nVXBkYXRlZCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CkBAIC00NTMsNyArNTcwLDcgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gdG9wQWN0aXZlOwogICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RBY3RpdmU7CiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IHRvcFNlbnNpdGl2ZUFjdGl2ZTsKLSAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBsYXRlc3RTZW5zaXRpdmVBY3RpdmVPckNvbW07CiAKICAgICBuc2Vjc190IHRvcFN0YXJ0TnMgPSAwOwogICAgIG5zZWNzX3QgbGF0ZXN0U3RhcnROcyA9IDA7CkBAIC00NjcsNiArNTg0LDcgQEAKICAgICBib29sIHJ0dENhbGxBY3RpdmUgPSAoaXNJbkNhbGwgfHwgaXNJbkNvbW11bmljYXRpb24pCiAgICAgICAgICAgICAmJiBtVWlkUG9saWN5LT5pc1J0dEVuYWJsZWQoKTsKICAgICBib29sIG9ubHlIb3R3b3JkQWN0aXZlID0gdHJ1ZTsKKyAgICBib29sIGlzUGhvbmVTdGF0ZU93bmVyQWN0aXZlID0gZmFsc2U7CiAKICAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgogICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CkBAIC00NzYsMjQgKzU5NCwyNyBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICB1aWRfdCBjdXJyZW50VWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCgKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYXBwX3N0YXRlX3QgYXBwU3RhdGUgPSBhcG1TdGF0RnJvbUFtU3RhdGUobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSk7CisgICAgICAgIGFwcF9zdGF0ZV90IGFwcFN0YXRlID0gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnRVaWQpKTsKICAgICAgICAgLy8gY2xpZW50cyB3aGljaCBhcHAgaXMgaW4gSURMRSBzdGF0ZSBhcmUgbm90IGVsaWdpYmxlIGZvciB0b3AgYWN0aXZlIG9yCiAgICAgICAgIC8vIGxhdGVzdCBhY3RpdmUKICAgICAgICAgaWYgKGFwcFN0YXRlID09IEFQUF9TVEFURV9JRExFKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2wgaXNBY2Nlc3NpYmlsaXR5ID0gbVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCk7Ci0gICAgICAgIC8vIENsaWVudHMgY2FwdHVyaW5nIGZvciBBY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIGFyZSBub3QgY29uc2lkZXJlZAorICAgICAgICBib29sIGlzQWNjZXNzaWJpbGl0eSA9IG1VaWRQb2xpY3ktPmlzQTExeVVpZChjdXJyZW50VWlkKTsKKyAgICAgICAgLy8gQ2xpZW50cyBjYXB0dXJpbmcgZm9yIEFjY2Vzc2liaWxpdHkgc2VydmljZXMgb3IgdmlydHVhbCBzb3VyY2VzIGFyZSBub3QgY29uc2lkZXJlZAogICAgICAgICAvLyBmb3IgdG9wIG9yIGxhdGVzdCBhY3RpdmUgdG8gYXZvaWQgbWFza2luZyByZWd1bGFyIGNsaWVudHMgc3RhcnRlZCBiZWZvcmUKLSAgICAgICAgaWYgKCFpc0FjY2Vzc2liaWxpdHkpIHsKLSAgICAgICAgICAgIGJvb2wgaXNBc3Npc3RhbnQgPSBtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpOworICAgICAgICBpZiAoIWlzQWNjZXNzaWJpbGl0eSAmJiAhaXNWaXJ0dWFsU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgYm9vbCBpc0Fzc2lzdGFudCA9IG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnRVaWQpOwogICAgICAgICAgICAgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmUgPQogICAgICAgICAgICAgICAgICAgICAoY3VycmVudC0+YXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfQ0FQVFVSRV9QUklWQVRFKSAhPSAwOworCiAgICAgICAgICAgICBpZiAoYXBwU3RhdGUgPT0gQVBQX1NUQVRFX1RPUCkgewogICAgICAgICAgICAgICAgIGlmIChpc1ByaXZhY3lTZW5zaXRpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gdG9wU2Vuc2l0aXZlU3RhcnROcykgewpAQCAtNTE1LDkgKzYzNiwxNyBAQAogICAgICAgICAgICAgaWYgKCEoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQKICAgICAgICAgICAgICAgICAgICAgfHwgKChpc0ExMXlPblRvcCB8fCBydHRDYWxsQWN0aXZlKSAmJiBpc0Fzc2lzdGFudCkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzUHJpdmFjeVNlbnNpdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTZW5zaXRpdmVTdGFydE5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVBY3RpdmUgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBhdWRpbyBtb2RlIGlzIElOX0NPTU1VTklDQVRJT04sIG1ha2Ugc3VyZSB0aGUgYXVkaW8gbW9kZSBvd25lcgorICAgICAgICAgICAgICAgICAgICAvLyBpcyBtYXJrZWQgbGF0ZXN0IHNlbnNpdGl2ZSBhY3RpdmUgZXZlbiBpZiBhbm90aGVyIGFwcCBxdWFsaWZpZXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaXNJbkNvbW11bmljYXRpb24gJiYgY3VycmVudFVpZCA9PSBtUGhvbmVTdGF0ZU93bmVyVWlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luQ29tbXVuaWNhdGlvbiB8fCBsYXRlc3RTZW5zaXRpdmVBY3RpdmVPckNvbW0gPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlT3JDb21tLT5hdHRyaWJ1dGlvblNvdXJjZS51aWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IG1QaG9uZVN0YXRlT3duZXJVaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVBY3RpdmVPckNvbW0gPSBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpc1NlbnNpdGl2ZUFjdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUzMSw2ICs2NjAsOSBAQAogICAgICAgICBpZiAoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKICAgICAgICAgICAgIG9ubHlIb3R3b3JkQWN0aXZlID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRVaWQgPT0gbVBob25lU3RhdGVPd25lclVpZCkgeworICAgICAgICAgICAgaXNQaG9uZVN0YXRlT3duZXJBY3RpdmUgPSB0cnVlOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gaWYgbm8gYWN0aXZlIGNsaWVudCB3aXRoIFVJIG9uIFRvcCwgY29uc2lkZXIgbGF0ZXN0IGFjdGl2ZSBhcyB0b3AKQEAgLTUzOSw4ICs2NzEsMTcgQEAKICAgICAgICAgdG9wU3RhcnROcyA9IGxhdGVzdFN0YXJ0TnM7CiAgICAgfQogICAgIGlmICh0b3BTZW5zaXRpdmVBY3RpdmUgPT0gbnVsbHB0cikgewotICAgICAgICB0b3BTZW5zaXRpdmVBY3RpdmUgPSBsYXRlc3RTZW5zaXRpdmVBY3RpdmU7CisgICAgICAgIHRvcFNlbnNpdGl2ZUFjdGl2ZSA9IGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZU9yQ29tbTsKICAgICAgICAgdG9wU2Vuc2l0aXZlU3RhcnROcyA9IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnM7CisgICAgfSBlbHNlIGlmIChsYXRlc3RTZW5zaXRpdmVBY3RpdmVPckNvbW0gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBpZiBhdWRpbyBtb2RlIGlzIElOX0NPTU1VTklDQVRJT04sIGZhdm9yIGF1ZGlvIG1vZGUgb3duZXIgb3ZlciBhbiBhcHAgd2l0aAorICAgICAgICAvLyBmb3JlZ3JvdW5kIFVJIGluIGNhc2UgYm90aCBhcmUgY2FwdHVyaW5nIHdpdGggcHJpdmFjeSBzZW5zaXRpdmUgZmxhZy4KKyAgICAgICAgdWlkX3QgbGF0ZXN0QWN0aXZlVWlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZU9yQ29tbS0+YXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgICAgIGlmIChpc0luQ29tbXVuaWNhdGlvbiAmJiBsYXRlc3RBY3RpdmVVaWQgPT0gbVBob25lU3RhdGVPd25lclVpZCkgeworICAgICAgICAgICAgdG9wU2Vuc2l0aXZlQWN0aXZlID0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlT3JDb21tOworICAgICAgICAgICAgdG9wU2Vuc2l0aXZlU3RhcnROcyA9IGxhdGVzdFNlbnNpdGl2ZVN0YXJ0TnM7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBJZiBib3RoIHByaXZhY3kgc2Vuc2l0aXZlIGFuZCByZWd1bGFyIGNhcHR1cmUgYXJlIGFjdGl2ZToKQEAgLTU1NSwyNCArNjk2LDI3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0wOyBpIDwgbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY3VycmVudCA9IG1BdWRpb1JlY29yZENsaWVudHNbaV07CisgICAgICAgIHVpZF90IGN1cnJlbnRVaWQgPSBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9pbnQzMl90X3VpZF90KAorICAgICAgICAgICAgY3VycmVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgICAgIGlmICghY3VycmVudC0+YWN0aXZlKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlOwotICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RBY3RpdmUgPSB0b3BBY3RpdmUgPT0gbnVsbHB0ciA/IGZhbHNlIDogY3VycmVudC0+dWlkID09IHRvcEFjdGl2ZS0+dWlkOwotICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RTZW5zaXRpdmUgPSB0b3BTZW5zaXRpdmVBY3RpdmUgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSA6IGN1cnJlbnQtPnVpZCA9PSB0b3BTZW5zaXRpdmVBY3RpdmUtPnVpZDsKKyAgICAgICAgYm9vbCBpc1RvcE9yTGF0ZXN0QWN0aXZlID0gdG9wQWN0aXZlID09IG51bGxwdHIgPyBmYWxzZSA6CisgICAgICAgICAgICBjdXJyZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQgPT0gdG9wQWN0aXZlLT5hdHRyaWJ1dGlvblNvdXJjZS51aWQ7CisgICAgICAgIGJvb2wgaXNUb3BPckxhdGVzdFNlbnNpdGl2ZSA9IHRvcFNlbnNpdGl2ZUFjdGl2ZSA9PSBudWxscHRyID8gZmFsc2UgOgorICAgICAgICAgICAgY3VycmVudC0+YXR0cmlidXRpb25Tb3VyY2UudWlkID09IHRvcFNlbnNpdGl2ZUFjdGl2ZS0+YXR0cmlidXRpb25Tb3VyY2UudWlkOwogCiAgICAgICAgIGF1dG8gY2FuQ2FwdHVyZUlmSW5DYWxsT3JDb21tdW5pY2F0aW9uID0gWyZdKGNvbnN0IGF1dG8gJnJlY29yZENsaWVudCkgUkVRVUlSRVMobUxvY2spIHsKKyAgICAgICAgICAgIHVpZF90IHJlY29yZFVpZCA9IFZBTFVFX09SX0ZBVEFMKGFpZGwybGVnYWN5X2ludDMyX3RfdWlkX3QoCisgICAgICAgICAgICAgICAgcmVjb3JkQ2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICAgICAgICAgIGJvb2wgY2FuQ2FwdHVyZUNhbGwgPSByZWNvcmRDbGllbnQtPmNhbkNhcHR1cmVPdXRwdXQ7Ci0gICAgICAgICAgICByZXR1cm4gIShpc0luQ2FsbCAmJiAhY2FuQ2FwdHVyZUNhbGwpOwotLy9UT0RPKGIvMTYwMjYwODUwKTogcmVzdG9yZSByZXN0cmljdGlvbiB0byBtb2RlIG93bmVyIG9uY2UgZml4IGZvciBtaXNiZWhhdmluZyBhcHBzIGlzIG1lcmdlZAotLy8gICAgICAgICAgICBib29sIGNhbkNhcHR1cmVDb21tdW5pY2F0aW9uID0gcmVjb3JkQ2xpZW50LT5jYW5DYXB0dXJlT3V0cHV0Ci0vLyAgICAgICAgICAgICAgICB8fCByZWNvcmRDbGllbnQtPnVpZCA9PSBtUGhvbmVTdGF0ZU93bmVyVWlkCi0vLyAgICAgICAgICAgICAgICB8fCBpc1NlcnZpY2VVaWQobVBob25lU3RhdGVPd25lclVpZCk7Ci0vLyAgICAgICAgICAgIHJldHVybiAhKGlzSW5DYWxsICYmICFjYW5DYXB0dXJlQ2FsbCkKLS8vICAgICAgICAgICAgICAgICYmICEoaXNJbkNvbW11bmljYXRpb24gJiYgIWNhbkNhcHR1cmVDb21tdW5pY2F0aW9uKTsKKyAgICAgICAgICAgIGJvb2wgY2FuQ2FwdHVyZUNvbW11bmljYXRpb24gPSByZWNvcmRDbGllbnQtPmNhbkNhcHR1cmVPdXRwdXQKKyAgICAgICAgICAgICAgICB8fCAhaXNQaG9uZVN0YXRlT3duZXJBY3RpdmUKKyAgICAgICAgICAgICAgICB8fCByZWNvcmRVaWQgPT0gbVBob25lU3RhdGVPd25lclVpZDsKKyAgICAgICAgICAgIHJldHVybiAhKGlzSW5DYWxsICYmICFjYW5DYXB0dXJlQ2FsbCkKKyAgICAgICAgICAgICAgICAmJiAhKGlzSW5Db21tdW5pY2F0aW9uICYmICFjYW5DYXB0dXJlQ29tbXVuaWNhdGlvbik7CiAgICAgICAgIH07CiAKICAgICAgICAgLy8gQnkgZGVmYXVsdCBhbGxvdyBjYXB0dXJlIGlmOgpAQCAtNTg2LDEwICs3MzAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgIShpc1RvcE9yTGF0ZXN0U2Vuc2l0aXZlIHx8IGN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpKQogICAgICAgICAgICAgICAgICYmIGNhbkNhcHR1cmVJZkluQ2FsbE9yQ29tbXVuaWNhdGlvbihjdXJyZW50KTsKIAotICAgICAgICBpZiAoaXNWaXJ0dWFsU291cmNlKHNvdXJjZSkpIHsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5oYXNPcCgpKSB7CisgICAgICAgICAgICAvLyBOZXZlciBhbGxvdyBjYXB0dXJlIGlmIGFwcCBvcCBpcyBkZW5pZWQKKyAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGlzVmlydHVhbFNvdXJjZShzb3VyY2UpKSB7CiAgICAgICAgICAgICAvLyBBbGxvdyBjYXB0dXJlIGZvciB2aXJ0dWFsIChyZW1vdGUgc3VibWl4LCBjYWxsIGF1ZGlvIFRYIG9yIFJYLi4uKSBzb3VyY2VzCiAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50VWlkKSkgewogICAgICAgICAgICAgLy8gRm9yIGFzc2lzdGFudCBhbGxvdyBjYXB0dXJlIGlmOgogICAgICAgICAgICAgLy8gICAgIEFuIGFjY2Vzc2liaWxpdHkgc2VydmljZSBpcyBvbiBUT1Agb3IgYSBSVFQgY2FsbCBpcyBhY3RpdmUKICAgICAgICAgICAgIC8vICAgICAgICAgICAgQU5EIHRoZSBzb3VyY2UgaXMgVk9JQ0VfUkVDT0dOSVRJT04gb3IgSE9UV09SRApAQCAtNjA5LDcgKzc1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQTExeVVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnRVaWQpKSB7CiAgICAgICAgICAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGFsbG93IGNhcHR1cmUgaWY6CiAgICAgICAgICAgICAvLyAgICAgVGhlIGFzc2lzdGFudCBpcyBub3Qgb24gVE9QCiAgICAgICAgICAgICAvLyAgICAgICAgIEFORCB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCkBAIC02MzUsMTUgKzc4MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjYW5DYXB0dXJlSWZJbkNhbGxPckNvbW11bmljYXRpb24oY3VycmVudCkpIHsKICAgICAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQ3VycmVudEltZVVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNDdXJyZW50SW1lVWlkKGN1cnJlbnRVaWQpKSB7CiAgICAgICAgICAgICAvLyBGb3IgY3VycmVudCBJbnB1dE1ldGhvZFNlcnZpY2UgYWxsb3cgY2FwdHVyZSBpZjoKICAgICAgICAgICAgIC8vICAgICBBIFJUVCBjYWxsIGlzIGFjdGl2ZSBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTgogICAgICAgICAgICAgaWYgKHJ0dENhbGxBY3RpdmUgJiYgc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgewogICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT5wb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID8gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpIDoKKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA/IGFwbVN0YXRGcm9tQW1TdGF0ZShtVWlkUG9saWN5LT5nZXRVaWRTdGF0ZShjdXJyZW50VWlkKSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFBfU1RBVEVfSURMRSk7CiAgICAgfQogfQpAQCAtNjUyLDcgKzc5OSw3IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKICAgICAgICAgaWYgKCFpc1ZpcnR1YWxTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7Ci0gICAgICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnBvcnRJZCwgQVBQX1NUQVRFX0lETEUpOworICAgICAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LCBBUFBfU1RBVEVfSURMRSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02ODYsMTcgKzgzMyw0NSBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFwcFN0YXRlX2woYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGFwcF9zdGF0ZV90IHN0YXRlKQorLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNBcHBPcFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QXBwU3RhdGVfbChzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50LCBhcHBfc3RhdGVfdCBzdGF0ZSkKIHsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogCiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKLSAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QXBwU3RhdGUocG9ydElkLCBzdGF0ZSk7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKGNsaWVudC0+cG9ydElkLCBzdGF0ZSk7CiAgICAgfQogICAgIHNwPElBdWRpb0ZsaW5nZXI+IGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmKSB7CiAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBzdGF0ZSA9PSBBUFBfU1RBVEVfSURMRTsKLSAgICAgICAgYWYtPnNldFJlY29yZFNpbGVuY2VkKHBvcnRJZCwgc2lsZW5jZWQpOworICAgICAgICBpZiAoY2xpZW50LT5zaWxlbmNlZCAhPSBzaWxlbmNlZCkgeworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpbGVuY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPmF0dHJpYnV0aW9uU291cmNlLCBjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBtc2c7CisgICAgICAgICAgICAgICAgICAgIG1zZyA8PCAiQXVkaW8gcmVjb3JkaW5nIHVuLXNpbGVuY2VkIG9uIHNlc3Npb24gIiA8PCBjbGllbnQtPnNlc3Npb247CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRSZWNvcmRpbmcoY2xpZW50LT5hdHRyaWJ1dGlvblNvdXJjZSwgU3RyaW5nMTYobXNnLnN0cigpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaWxlbmNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZi0+c2V0UmVjb3JkU2lsZW5jZWQoY2xpZW50LT5wb3J0SWQsIHNpbGVuY2VkKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2lsZW5jZWQgPSBzaWxlbmNlZDsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtNzQzLDYgKzkxOCw5MyBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uVHJhbnNhY3QoCiAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICAvLyBtYWtlIHN1cmUgdHJhbnNhY3Rpb25zIHJlc2VydmVkIHRvIEF1ZGlvRmxpbmdlciBkbyBub3QgY29tZSBmcm9tIG90aGVyIHByb2Nlc3NlcworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3N0YXJ0T3V0cHV0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3N0b3BPdXRwdXQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVsZWFzZU91dHB1dDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRJbnB1dEZvckF0dHI6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc3RhcnRJbnB1dDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zdG9wSW5wdXQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVsZWFzZUlucHV0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldE91dHB1dEZvckVmZmVjdDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZWdpc3RlckVmZmVjdDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl91bnJlZ2lzdGVyRWZmZWN0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEVmZmVjdEVuYWJsZWQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0U3RyYXRlZ3lGb3JTdHJlYW06CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0T3V0cHV0Rm9yQXR0cjoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9tb3ZlRWZmZWN0c1RvSW86CisgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb25zIGNvbWUgZnJvbSBzeXN0ZW0gY29tcG9uZW50cworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldERldmljZUNvbm5lY3Rpb25TdGF0ZToKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2U6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0UGhvbmVTdGF0ZToKKy8vRklYTUU6IEFsbG93IHNldEZvcmNlVXNlIGNhbGxzIGZyb20gc3lzdGVtIGFwcHMgdW50aWwgYSBiZXR0ZXIgdXNlIGNhc2Ugcm91dGluZyBBUEkgaXMgYXZhaWxhYmxlCisvLyAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0Rm9yY2VVc2U6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faW5pdFN0cmVhbVZvbHVtZToKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRTdHJlYW1Wb2x1bWVJbmRleDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0U3RyZWFtVm9sdW1lSW5kZXg6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlczoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTdHJlYW1BY3RpdmU6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNTdHJlYW1BY3RpdmVSZW1vdGVseToKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9pc1NvdXJjZUFjdGl2ZToKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXREZXZpY2VzRm9yU3RyZWFtOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlZ2lzdGVyUG9saWN5TWl4ZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0TWFzdGVyTW9ubzoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9nZXRTdXJyb3VuZEZvcm1hdHM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldEFzc2lzdGFudFVpZDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRBMTF5U2VydmljZXNVaWRzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFVpZERldmljZUFmZmluaXRpZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllczoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXRVc2VySWREZXZpY2VBZmZpbml0aWVzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlbW92ZVVzZXJJZERldmljZUFmZmluaXRpZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9saXN0QXVkaW9Wb2x1bWVHcm91cHM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2FjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3JlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFJ0dEVuYWJsZWQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05faXNDYWxsU2NyZWVuTW9kZVN1cHBvcnRlZDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9zZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldFN1cHBvcnRlZFN5c3RlbVVzYWdlczoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZW1vdmVEZXZpY2VzUm9sZUZvclN0cmF0ZWd5OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldERldmljZXNGb3JSb2xlQW5kU3RyYXRlZ3k6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXM6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0QWxsb3dlZENhcHR1cmVQb2xpY3k6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGU6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fc2V0Q3VycmVudEltZVVpZDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9yZWdpc3RlclNvdW5kVHJpZ2dlckNhcHR1cmVTdGF0ZUxpc3RlbmVyOgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX3NldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldDoKKyAgICAgICAgY2FzZSBUUkFOU0FDVElPTl9hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQ6CisgICAgICAgIGNhc2UgVFJBTlNBQ1RJT05fcmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2NsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0OgorICAgICAgICBjYXNlIFRSQU5TQUNUSU9OX2dldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldDogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKKwogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNIRUxMX0NPTU1BTkRfVFJBTlNBQ1RJT046IHsKICAgICAgICAgICAgIGludCBpbiA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7CkBAIC03ODksNiArMTA1MSw5IEBACiAgICAgICAgIHJldHVybiBoYW5kbGVSZXNldFVpZFN0YXRlKGFyZ3MsIGVycik7CiAgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlR2V0VWlkU3RhdGUoYXJncywgb3V0LCBlcnIpOworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJwdXJnZV9wZXJtaXNzaW9uLWNhY2hlIikpIHsKKyAgICAgICAgcHVyZ2VQZXJtaXNzaW9uQ2FjaGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKICAgICAgICAgcHJpbnRIZWxwKG91dCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTExNDMsNiArMTQwOCwxNCBAQAogICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGZGb3JNaWNyb3Bob25lT25seShpbnQgdXNlcklkKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc0luZGl2aWR1YWxTZW5zb3JQcml2YWN5RW5hYmxlZCh1c2VySWQsCisgICAgICAgICAgICBTZW5zb3JQcml2YWN5TWFuYWdlcjo6SU5ESVZJRFVBTF9TRU5TT1JfTUlDUk9QSE9ORSk7CisgICAgc3BtLmFkZEluZGl2aWR1YWxTZW5zb3JQcml2YWN5TGlzdGVuZXIodXNlcklkLAorICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX01JQ1JPUEhPTkUsIHRoaXMpOworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CiAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOwogICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CkBAIC0xMTYxLDYgKzE0MzQsMTA5IEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCisvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpPcFJlY29yZEF1ZGlvTW9uaXRvciBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCisKKy8vIHN0YXRpYworc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlOjpPcFJlY29yZEF1ZGlvTW9uaXRvcj4KK0F1ZGlvUG9saWN5U2VydmljZTo6T3BSZWNvcmRBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAorICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwKKyAgICAgICAgICAgIHdwPEF1ZGlvQ29tbWFuZFRocmVhZD4gY29tbWFuZFRocmVhZCkKK3sKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZChhdHRyaWJ1dGlvblNvdXJjZS51aWQpKSB7CisgICAgICAgIEFMT0dWKCJub3Qgc2lsZW5jaW5nIHJlY29yZCBmb3IgYXVkaW8gb3Igcm9vdCBzb3VyY2UgJXMiLAorICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmICghQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0FwcE9wU291cmNlKGF0dHIuc291cmNlKSkgeworICAgICAgICBBTE9HRCgibm90IG1vbml0b3JpbmcgYXBwIG9wIGZvciB1aWQgJWQgYW5kIHNvdXJjZSAlZCIsCisgICAgICAgICAgICAgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkLCBhdHRyLnNvdXJjZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmICghYXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUuaGFzX3ZhbHVlKCkKKyAgICAgICAgICAgIHx8IGF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgT3BSZWNvcmRBdWRpb01vbml0b3IoYXR0cmlidXRpb25Tb3VyY2UsIGdldE9wRm9yU291cmNlKGF0dHIuc291cmNlKSwgY29tbWFuZFRocmVhZCk7Cit9CisKK0F1ZGlvUG9saWN5U2VydmljZTo6T3BSZWNvcmRBdWRpb01vbml0b3I6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yKAorICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwgaW50MzJfdCBhcHBPcCwKKyAgICAgICAgd3A8QXVkaW9Db21tYW5kVGhyZWFkPiBjb21tYW5kVGhyZWFkKSA6CisgICAgICAgICAgICBtSGFzT3AodHJ1ZSksIG1BdHRyaWJ1dGlvblNvdXJjZShhdHRyaWJ1dGlvblNvdXJjZSksIG1BcHBPcChhcHBPcCksCisgICAgICAgICAgICBtQ29tbWFuZFRocmVhZChjb21tYW5kVGhyZWFkKQoreworfQorCitBdWRpb1BvbGljeVNlcnZpY2U6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjp+T3BSZWNvcmRBdWRpb01vbml0b3IoKQoreworICAgIGlmIChtT3BDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ01vZGUobU9wQ2FsbGJhY2spOworICAgIH0KKyAgICBtT3BDYWxsYmFjay5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6T3BSZWNvcmRBdWRpb01vbml0b3I6Om9uRmlyc3RSZWYoKQoreworICAgIGNoZWNrT3AoKTsKKyAgICBtT3BDYWxsYmFjayA9IG5ldyBSZWNvcmRBdWRpb09wQ2FsbGJhY2sodGhpcyk7CisgICAgQUxPR1YoInN0YXJ0IHdhdGNoaW5nIG9wICVkIGZvciAlcyIsIG1BcHBPcCwgbUF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgLy8gVE9ETzogV2UgbmVlZCB0byBhbHdheXMgd2F0Y2ggQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPIHRvbworICAgIC8vIHNpbmNlIGl0IGNvbnRyb2xzIHRoZSBtaWMgcGVybWlzc2lvbiBmb3IgbGVnYWN5IGFwcHMuCisgICAgbUFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ01vZGUobUFwcE9wLCBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmcxNigKKyAgICAgICAgbUF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lLnZhbHVlX29yKCIiKSkpLAorICAgICAgICBtT3BDYWxsYmFjayk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6aGFzT3AoKSBjb25zdCB7CisgICAgcmV0dXJuIG1IYXNPcC5sb2FkKCk7Cit9CisKKy8vIENhbGxlZCBieSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgd2hlbiB0aGUgYXBwIG9wIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBPcFJlY29yZEF1ZGlvTW9uaXRvcgorLy8gaXMgdXBkYXRlZCBpbiBBcHBPcCBjYWxsYmFjayBhbmQgaW4gb25GaXJzdFJlZigpCisvLyBOb3RlIHRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCAoYW5kIG5ldmVyIHRvIGJlKSBmb3IgYXVkaW8gc2VydmVyIC8gcm9vdCB0cmFjaworLy8gZHVlIHRvIHRoZSBVSUQgaW4gY3JlYXRlSWZOZWVkZWQoKS4gQXMgYSByZXN1bHQgZm9yIHRob3NlIHJlY29yZCB0cmFjaywgaXQnczoKKy8vIC0gbm90IGNhbGxlZCBmcm9tIGNvbnN0cnVjdG9yLAorLy8gLSBub3QgY2FsbGVkIGZyb20gUmVjb3JkQXVkaW9PcENhbGxiYWNrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyBjYXNlCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6T3BSZWNvcmRBdWRpb01vbml0b3I6OmNoZWNrT3AoYm9vbCB1cGRhdGVVaWRTdGF0ZXMpCit7CisgICAgLy8gVE9ETzogV2UgbmVlZCB0byBhbHdheXMgY2hlY2sgQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPIHRvbworICAgIC8vIHNpbmNlIGl0IGNvbnRyb2xzIHRoZSBtaWMgcGVybWlzc2lvbiBmb3IgbGVnYWN5IGFwcHMuCisgICAgY29uc3QgaW50MzJfdCBtb2RlID0gbUFwcE9wc01hbmFnZXIuY2hlY2tPcChtQXBwT3AsCisgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UudWlkLCBWQUxVRV9PUl9GQVRBTChhaWRsMmxlZ2FjeV9zdHJpbmdfdmlld19TdHJpbmcxNigKKyAgICAgICAgICAgICAgICBtQXR0cmlidXRpb25Tb3VyY2UucGFja2FnZU5hbWUudmFsdWVfb3IoIiIpKSkpOworICAgIGNvbnN0IGJvb2wgaGFzSXQgPSAobW9kZSA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpOworICAgIC8vIHZlcmJvc2UgbG9nZ2luZyBvbmx5IGxvZyB3aGVuIGFwcE9wIGNoYW5nZWQKKyAgICBBTE9HSV9JRihoYXNJdCAhPSBtSGFzT3AubG9hZCgpLAorICAgICAgICAgICAgIkFwcCBvcCAlZCBtaXNzaW5nLCAlc3NpbGVuY2luZyByZWNvcmQgJXMiLAorICAgICAgICAgICAgbUFwcE9wLCBoYXNJdCA/ICJ1biIgOiAiIiwgbUF0dHJpYnV0aW9uU291cmNlLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgbUhhc09wLnN0b3JlKGhhc0l0KTsKKworICAgIGlmICh1cGRhdGVVaWRTdGF0ZXMpIHsKKyAgICAgICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IGNvbW1hbmRUaHJlYWQgPSBtQ29tbWFuZFRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgaWYgKGNvbW1hbmRUaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICBjb21tYW5kVGhyZWFkLT51cGRhdGVVaWRTdGF0ZXNDb21tYW5kKCk7CisgICAgICAgICAgfQorICAgIH0KK30KKworQXVkaW9Qb2xpY3lTZXJ2aWNlOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6UmVjb3JkQXVkaW9PcENhbGxiYWNrOjpSZWNvcmRBdWRpb09wQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHdwPE9wUmVjb3JkQXVkaW9Nb25pdG9yPiYgbW9uaXRvcikgOiBtTW9uaXRvcihtb25pdG9yKQoreyB9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6UmVjb3JkQXVkaW9PcENhbGxiYWNrOjpvcENoYW5nZWQoaW50MzJfdCBvcCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSBfX3VudXNlZCkgeworICAgIHNwPE9wUmVjb3JkQXVkaW9Nb25pdG9yPiBtb25pdG9yID0gbU1vbml0b3IucHJvbW90ZSgpOworICAgIGlmIChtb25pdG9yICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG9wICE9IG1vbml0b3ItPmdldE9wKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtb25pdG9yLT5jaGVja09wKHRydWUpOworICAgIH0KK30KKworCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKQEAgLTEzNjYsNiArMTc0MiwyNyBAQAogICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUk9VVElOR19VUERBVEVEOiB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJvdXRpbmcgdXBkYXRlIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfVUlEX1NUQVRFUzogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGVVSUQgc3RhdGVzIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT51cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKQEAgLTE1ODAsNiArMTk3NywxNCBAQAogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp1cGRhdGVVaWRTdGF0ZXNDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBVUERBVEVfVUlEX1NUQVRFUzsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHVwZGF0ZSBVSUQgc3RhdGVzIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CkBAIC0xNjYyLDYgKzIwNjcsMTQgQEAKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cm91dGluZ0NoYW5nZWRDb21tYW5kKCkKK3sKKyAgICBzcDxBdWRpb0NvbW1hbmQ+Y29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFJPVVRJTkdfVVBEQVRFRDsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHJvdXRpbmcgdXBkYXRlIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKIHsKICAgICB7CkBAIC0xODI1LDYgKzIyMzgsMTAgQEAKIAogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgUk9VVElOR19VUERBVEVEOiB7CisKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE5MDksOSArMjMyNiwxMCBAQAogICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQtPnNldEVmZmVjdFN1c3BlbmRlZENvbW1hbmQoZWZmZWN0SWQsIHNlc3Npb25JZCwgc3VzcGVuZGVkKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkKK1N0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkKIHsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+YXVkaW9Nb2R1bGVzVXBkYXRlQ29tbWFuZCgpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggODY5YTk2My4uN2VkODI5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0xLDMgKzEsNCBAQAorCiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICAqCkBAIC0xNyw2ICsxOCw3IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWVNFUlZJQ0VfSAogCisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9CbkF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbWlzYy5oPgogI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KQEAgLTI1LDExICsyNywxMSBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lVaWRPYnNlcnZlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KQEAgLTM4LDE2ICs0MCwxOSBAQAogI2luY2x1ZGUgIkNhcHR1cmVTdGF0ZU5vdGlmaWVyLmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L0F0dHJpYnV0aW9uU291cmNlU3RhdGUuaD4KIAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgogICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPEF1ZGlvUG9saWN5U2VydmljZT4sCi0gICAgcHVibGljIEJuQXVkaW9Qb2xpY3lTZXJ2aWNlLAorICAgIHB1YmxpYyBtZWRpYTo6Qm5BdWRpb1BvbGljeVNlcnZpY2UsCiAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiB7CiAgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8QXVkaW9Qb2xpY3lTZXJ2aWNlPjsKQEAgLTYxLDEwOCArNjYsMTgyIEBACiAgICAgLy8KICAgICAvLyBCbkF1ZGlvUG9saWN5U2VydmljZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCi0KLSAgICB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7Ci0gICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSwgdWlkX3QgdWlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwotICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAqZGV2aWNlcykgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Ci0gICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlLAorICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5RGV2aWNlU3RhdGUgc3RhdGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgIG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdCBlbmNvZGVkRm9ybWF0KSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgbWVkaWE6OkF1ZGlvRGV2aWNlJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvbGljeURldmljZVN0YXRlKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb0RldmljZSYgZGV2aWNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZU5hbWUsCisgICAgICAgICAgICBtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgZW5jb2RlZEZvcm1hdCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0UGhvbmVTdGF0ZShtZWRpYTo6QXVkaW9Nb2RlIHN0YXRlLCBpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnIGNvbmZpZykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0Rm9yY2VVc2UobWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VVc2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvUG9saWN5Rm9yY2VkQ29uZmlnKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldE91dHB1dChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwgaW50MzJfdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSAmYXR0cmlidXRpb25Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9Db25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MsIGludDMyX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRPdXRwdXRGb3JBdHRyUmVzcG9uc2UqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc3RhcnRPdXRwdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BPdXRwdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2VPdXRwdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldElucHV0Rm9yQXR0cihjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHIsIGludDMyX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmlpZCwgaW50MzJfdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlICZhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQ29uZmlnQmFzZSYgY29uZmlnLCBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpHZXRJbnB1dEZvckF0dHJSZXNwb25zZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzdGFydElucHV0KGludDMyX3QgcG9ydElkKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzdG9wSW5wdXQoaW50MzJfdCBwb3J0SWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlbGVhc2VJbnB1dChpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaW5pdFN0cmVhbVZvbHVtZShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXhNYXgpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVZvbHVtZUluZGV4KG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdHJlYW1Wb2x1bWVJbmRleChtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZSwgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXZpY2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNJbnRlcm5hbCYgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldFN0cmF0ZWd5Rm9yU3RyZWFtKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvclN0cmVhbShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0V4JiBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyRWZmZWN0KGNvbnN0IG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yJiBkZXNjLCBpbnQzMl90IGlvLCBpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbiwgaW50MzJfdCBpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgdW5yZWdpc3RlckVmZmVjdChpbnQzMl90IGlkKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRFZmZlY3RFbmFibGVkKGludDMyX3QgaWQsIGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+JiBpZHMsIGludDMyX3QgaW8pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGlzU3RyZWFtQWN0aXZlKG1lZGlhOjpBdWRpb1N0cmVhbVR5cGUgc3RyZWFtLCBpbnQzMl90IGluUGFzdE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpblBhc3RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaXNTb3VyY2VBY3RpdmUobWVkaWE6OkF1ZGlvU291cmNlVHlwZSBzb3VyY2UsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZygKKyAgICAgICAgICAgIGludDMyX3QgYXVkaW9TZXNzaW9uLCBtZWRpYTo6SW50KiBjb3VudCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpFZmZlY3REZXNjcmlwdG9yPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lZGlhOjpBdWRpb1V1aWQmIHV1aWQsIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9VdWlkJiB1dWlkLCBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkF1ZGlvVXNhZ2UgdXNhZ2UsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpbnQzMl90IGlkKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGludDMyX3QgaWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFN1cHBvcnRlZFN5c3RlbVVzYWdlcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb1VzYWdlPiYgc3lzdGVtVXNhZ2VzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShpbnQzMl90IHVpZCwgaW50MzJfdCBjYXB0dXJlUG9saWN5KSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRPZmZsb2FkU3VwcG9ydChjb25zdCBtZWRpYTo6QXVkaW9PZmZsb2FkSW5mbyYgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6QXVkaW9PZmZsb2FkTW9kZSogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBtZWRpYTo6QXVkaW9Db25maWdCYXNlJiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWE6OkF1ZGlvQXR0cmlidXRlc0ludGVybmFsJiBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUG9ydHMobWVkaWE6OkF1ZGlvUG9ydFJvbGUgcm9sZSwgbWVkaWE6OkF1ZGlvUG9ydFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUG9ydD4qIHBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0QXVkaW9Qb3J0KGNvbnN0IG1lZGlhOjpBdWRpb1BvcnQmIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpBdWRpb1BvcnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBtZWRpYTo6QXVkaW9QYXRjaCYgcGF0Y2gsIGludDMyX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZWxlYXNlQXVkaW9QYXRjaChpbnQzMl90IGhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgbGlzdEF1ZGlvUGF0Y2hlcyhtZWRpYTo6SW50KiBjb3VudCwgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUGF0Y2g+KiBwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRBdWRpb1BvcnRDb25maWcoY29uc3QgbWVkaWE6OkF1ZGlvUG9ydENvbmZpZyYgY29uZmlnKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZWdpc3RlckNsaWVudChjb25zdCBzcDxtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24obWVkaWE6OlNvdW5kVHJpZ2dlclNlc3Npb24qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oaW50MzJfdCBzZXNzaW9uKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRQaG9uZVN0YXRlKG1lZGlhOjpBdWRpb01vZGUqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9NaXg+JiBtaXhlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVnaXN0cmF0aW9uKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRVaWREZXZpY2VBZmZpbml0aWVzKGludDMyX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyhpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0VXNlcklkRGV2aWNlQWZmaW5pdGllcygKKyAgICAgICAgICAgIGludDMyX3QgdXNlcklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQzMl90IHVzZXJJZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBtZWRpYTo6QXVkaW9Qb3J0Q29uZmlnJiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYTo6QXVkaW9BdHRyaWJ1dGVzSW50ZXJuYWwmIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BBdWRpb1NvdXJjZShpbnQzMl90IHBvcnRJZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldE1hc3Rlck1vbm8oYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRTdHJlYW1Wb2x1bWVEQihtZWRpYTo6QXVkaW9TdHJlYW1UeXBlIHN0cmVhbSwgaW50MzJfdCBpbmRleCwgaW50MzJfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0U3Vycm91bmRGb3JtYXRzKG1lZGlhOjpJbnQqIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxib29sPiogZm9ybWF0c0VuYWJsZWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKAorICAgICAgICAgICAgbWVkaWE6OkludCogY291bnQsIHN0ZDo6dmVjdG9yPG1lZGlhOjphdWRpbzo6Y29tbW9uOjpBdWRpb0Zvcm1hdD4qIGZvcm1hdHMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQ+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChtZWRpYTo6YXVkaW86OmNvbW1vbjo6QXVkaW9Gb3JtYXQgYXVkaW9Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QXNzaXN0YW50VWlkKGludDMyX3QgdWlkKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZChpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdWlkcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0Q3VycmVudEltZVVpZChpbnQzMl90IHVpZCkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZChib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvUHJvZHVjdFN0cmF0ZWd5PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZhbGxiYWNrT25EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9Wb2x1bWVHcm91cD4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IG1lZGlhOjpBdWRpb0F0dHJpYnV0ZXNFeCYgYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFsbGJhY2tPbkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXREZXZpY2VzUm9sZUZvclN0cmF0ZWd5KAorICAgICAgICAgICAgaW50MzJfdCBzdHJhdGVneSwgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlbW92ZURldmljZXNSb2xlRm9yU3RyYXRlZ3koaW50MzJfdCBzdHJhdGVneSwgbWVkaWE6OkRldmljZVJvbGUgcm9sZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvclJvbGVBbmRTdHJhdGVneSgKKyAgICAgICAgICAgIGludDMyX3Qgc3RyYXRlZ3ksIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldCgKKyAgICAgICAgICAgIG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICBtZWRpYTo6RGV2aWNlUm9sZSByb2xlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bWVkaWE6OkF1ZGlvRGV2aWNlPiYgZGV2aWNlcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgYWRkRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+JiBkZXZpY2VzKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoCisgICAgICAgICAgICBtZWRpYTo6QXVkaW9Tb3VyY2VUeXBlIGF1ZGlvU291cmNlLAorICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG1lZGlhOjpBdWRpb0RldmljZT4mIGRldmljZXMpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KG1lZGlhOjpBdWRpb1NvdXJjZVR5cGUgYXVkaW9Tb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6OkRldmljZVJvbGUgcm9sZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgZ2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KAorICAgICAgICAgICAgbWVkaWE6OkF1ZGlvU291cmNlVHlwZSBhdWRpb1NvdXJjZSwKKyAgICAgICAgICAgIG1lZGlhOjpEZXZpY2VSb2xlIHJvbGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6QXVkaW9EZXZpY2U+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIoCisgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUNhcHR1cmVTdGF0ZUxpc3RlbmVyPiYgbGlzdGVuZXIsIGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLApAQCAtMTkwLDE0MiArMjY5LDUzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgc3RhdHVzX3Qgc2V0U3VwcG9ydGVkU3lzdGVtVXNhZ2VzKGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX3VzYWdlX3Q+JiBzeXN0ZW1Vc2FnZXMpOwotICAgIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpbnRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBjYXB0dXJlUG9saWN5KSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICZjb25maWcpOwotICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2b2lkIGRvT25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKKyAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlckNsaWVudChjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50KTsKKyAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgIHN0YXR1c190IGNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbGllbnRTZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKyAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCk7CisgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgdm9pZCBkb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKKyAgICB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CisgICAgdm9pZCBkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2b2lkIG9uUm91dGluZ1VwZGF0ZWQoKTsKKyAgICB2b2lkIGRvT25Sb3V0aW5nVXBkYXRlZCgpOwogCi0gICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSk7Ci0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVzZXJJZERldmljZUFmZmluaXRpZXMoaW50IHVzZXJJZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVXNlcklkRGV2aWNlQWZmaW5pdGllcyhpbnQgdXNlcklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKLQotICAgIHZpcnR1YWwgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCi0gICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q3VycmVudEltZVVpZCh1aWRfdCB1aWQpOwotCi0gICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKLQotICAgIHN0YXR1c190IHJlZ2lzdGVyU291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlTGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IHNwPG1lZGlhOjpJQ2FwdHVyZVN0YXRlTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgYm9vbCogcmVzdWx0KSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpOwotCi0gICAgICAgICAgICBib29sIGlzQ2FsbFNjcmVlbk1vZGVTdXBwb3J0ZWQoKSBvdmVycmlkZTsKLQotICAgICAgICAgICAgdm9pZCBkb09uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLSAgICAgICAgICAgIHN0YXR1c190IGNsaWVudFJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCk7Ci0gICAgICAgICAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotCi0gICAgICAgICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7Ci0gICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwotICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKLSAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwotICAgICAgICAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKTsKKyAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCk7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKQEAgLTMzNiw4ICszMjYsMTAgQEAKICAgICAvLyBIYW5kbGVzIGJpbmRlciBzaGVsbCBjb21tYW5kcwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2hlbGxDb21tYW5kKGludCBpbiwgaW50IG91dCwgaW50IGVyciwgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudDsKKwogICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCi0gICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2woYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGFwcF9zdGF0ZV90IHN0YXRlKSBSRVFVSVJFUyhtTG9jayk7CisgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2woc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCwgYXBwX3N0YXRlX3Qgc3RhdGUpIFJFUVVJUkVTKG1Mb2NrKTsKIAogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKQEAgLTM1OSw3ICszNTEsNyBAQAogCiAgICAgYm9vbCBpc1N1cHBvcnRlZFN5c3RlbVVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwogICAgIHN0YXR1c190IHZhbGlkYXRlVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgc3RhdHVzX3QgdmFsaWRhdGVVc2FnZShhdWRpb191c2FnZV90IHVzYWdlLCBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSk7CiAKICAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlcygpOwogICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzX2woKSBSRVFVSVJFUyhtTG9jayk7CkBAIC0zNjgsNiArMzYwLDEzIEBACiAKICAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAorICAgIC8qKiByZXR1cm5zIHRydWUgaWYgdGhlIGF1ZGlvIHNvdXJjZSBtdXN0IGJlIHNpbGVuY2VkIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgYXBwIG9wIGlzIGRlbmllZC4KKyAgICAgKiAgICAgICAgICBmYWxzZSBpZiB0aGUgYXVkaW8gc291cmNlIGRvZXMgbm90IGFjdHVhbGx5IGNhcHR1cmUgZnJvbSB0aGUgbWljcm9waG9uZSB3aGlsZSBzdGlsbAorICAgICAqICAgICAgICAgIGJlaW5nIG1hcHBlZCB0byBhcHAgb3AgT1BfUkVDT1JEX0FVRElPIGFuZCBub3QgYSBzcGVjaWFsaXplZCBvcCB0cmFja2VkIHNlcGFyYXRlbHkuCisgICAgICogICAgICAgICAgU2VlIGdldE9wRm9yU291cmNlKCkuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgaXNBcHBPcFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCiAgICAgLy8gSWYgcmVjb3JkaW5nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBVSUQgaXMgYWxsb3dlZCB0byBkbyB0aGF0LiBJZiB0aGUgVUlEIGlzIGlkbGUKICAgICAvLyB0aGVuIGl0IGNhbm5vdCByZWNvcmQgYW5kIGdldHMgYnVmZmVycyB3aXRoIHplcm9zIC0gc2lsZW5jZS4gQXMgc29vbiBhcyB0aGUgVUlECiAgICAgLy8gdHJhbnNpdGlvbnMgdG8gYW4gYWN0aXZlIHN0YXRlIHdlIHdpbGwgc3RhcnQgcmVwb3J0aW5nIGJ1ZmZlcnMgd2l0aCBkYXRhLiBUaGlzIGFwcHJvYWNoCkBAIC0zNzgsNyArMzc3LDggQEAKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCiAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSksCi0gICAgICAgICAgICAgICAgICBtQXNzaXN0YW50VWlkKDApLCBtQ3VycmVudEltZVVpZCgwKSwgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgICBtQXNzaXN0YW50VWlkKDApLCBtSG90d29yZERldGVjdGlvblNlcnZpY2VVaWQoMCksIG1DdXJyZW50SW1lVWlkKDApLAorICAgICAgICAgICAgICAgICAgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwpAQCAtMzg4LDggKzM4OCwxMyBAQAogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgaW50IGdldFVpZFN0YXRlKHVpZF90IHVpZCk7Ci0gICAgICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyBtQXNzaXN0YW50VWlkID0gdWlkOyB9Ci0gICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IHJldHVybiB1aWQgPT0gbUFzc2lzdGFudFVpZDsgfQorICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgbUFzc2lzdGFudFVpZCA9IHVpZDsgfTsKKyAgICAgICAgdm9pZCBzZXRIb3R3b3JkRGV0ZWN0aW9uU2VydmljZVVpZCh1aWRfdCB1aWQpIHsgbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkID0gdWlkOyB9CisgICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgICAgICAgICAvLyBUaGUgSG90d29yZERldGVjdGlvblNlcnZpY2UgaXMgcGFydCBvZiB0aGUgQXNzaXN0YW50IHBhY2thZ2UgYnV0IHJ1bnMgd2l0aCBhIHNlcGFyYXRlCisgICAgICAgICAgICAvLyAoaXNvbGF0ZWQpIHVpZCwgc28gd2UgY2hlY2sgZm9yIGVpdGhlciB1aWQgaGVyZS4KKyAgICAgICAgICAgIHJldHVybiB1aWQgPT0gbUFzc2lzdGFudFVpZCB8fCB1aWQgPT0gbUhvdHdvcmREZXRlY3Rpb25TZXJ2aWNlVWlkOworICAgICAgICB9CiAgICAgICAgIHZvaWQgc2V0QTExeVVpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSB7IG1BMTF5VWlkcy5jbGVhcigpOyBtQTExeVVpZHMgPSB1aWRzOyB9CiAgICAgICAgIGJvb2wgaXNBMTF5VWlkKHVpZF90IHVpZCk7CiAgICAgICAgIGJvb2wgaXNBMTF5T25Ub3AoKTsKQEAgLTQyNSw2ICs0MzAsNyBAQAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtT3ZlcnJpZGVVaWRzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtQ2FjaGVkVWlkczsKICAgICAgICAgdWlkX3QgbUFzc2lzdGFudFVpZCA9IC0xOworICAgICAgICB1aWRfdCBtSG90d29yZERldGVjdGlvblNlcnZpY2VVaWQgPSAtMTsKICAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKICAgICAgICAgdWlkX3QgbUN1cnJlbnRJbWVVaWQgPSAtMTsKICAgICAgICAgYm9vbCBtUnR0RW5hYmxlZCA9IGZhbHNlOwpAQCAtNDQwLDYgKzQ0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSkge30KIAogICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmRm9yTWljcm9waG9uZU9ubHkoaW50IHVzZXJJZCk7CiAgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CiAKICAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOwpAQCAtNDc1LDYgKzQ4Miw4IEBACiAgICAgICAgICAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsCiAgICAgICAgICAgICBTRVRfRUZGRUNUX1NVU1BFTkRFRCwKICAgICAgICAgICAgIEFVRElPX01PRFVMRVNfVVBEQVRFLAorICAgICAgICAgICAgUk9VVElOR19VUERBVEVELAorICAgICAgICAgICAgVVBEQVRFX1VJRF9TVEFURVMKICAgICAgICAgfTsKIAogICAgICAgICBBdWRpb0NvbW1hbmRUaHJlYWQgKFN0cmluZzggbmFtZSwgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSk7CkBAIC01MjEsNiArNTMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYXVkaW9Nb2R1bGVzVXBkYXRlQ29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByb3V0aW5nQ2hhbmdlZENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlVWlkU3RhdGVzQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgIHByaXZhdGU6CiAgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7CkBAIC03MzksMTAgKzc1MCwxNyBAQAogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogCisgICAgICAgIHZpcnR1YWwgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCk7CisKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCiAgICAgICAgIHZvaWQgc2V0U291bmRUcmlnZ2VyQ2FwdHVyZVN0YXRlKGJvb2wgYWN0aXZlKSBvdmVycmlkZTsKIAorICAgICAgICBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKnBvcnQpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworCiAgICAgIHByaXZhdGU6CiAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSAqbUF1ZGlvUG9saWN5U2VydmljZTsKICAgICB9OwpAQCAtNzUxLDcgKzc2OSw3IEBACiAgICAgY2xhc3MgTm90aWZpY2F0aW9uQ2xpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OklBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCkBAIC03NjksNiArNzg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUm91dGluZ1VwZGF0ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIApAQCAtNzgzLDY2ICs4MDIsMTI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IE5vdGlmaWNhdGlvbkNsaWVudCYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkNsaWVudCYgb3BlcmF0b3IgPSAoY29uc3QgTm90aWZpY2F0aW9uQ2xpZW50Jik7CiAKLSAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7Ci0gICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7Ci0gICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7Ci0gICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOwotICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQ7CisgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgICAgICAgICBtU2VydmljZTsKKyAgICAgICAgY29uc3QgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICBjb25zdCBzcDxtZWRpYTo6SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOworICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkOwogICAgIH07CiAKICAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIGlvKGlvKSwgdWlkKHVpZCksIHBpZChwaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uKHNlc3Npb24pLCBwb3J0SWQocG9ydElkKSwgZGV2aWNlSWQoZGV2aWNlSWQpLCBhY3RpdmUoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIGlvKGlvKSwgYXR0cmlidXRpb25Tb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uU291cmNlKSwgc2Vzc2lvbihzZXNzaW9uKSwgcG9ydElkKHBvcnRJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQogICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgogICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKLSAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKLSAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSYgYXR0cmlidXRpb25Tb3VyY2U7IC8vY2xpZW50IGF0dHJpYnV0aW9uc291cmNlCiAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECiAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKICAgICAgICAgICAgICAgYm9vbCBhY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8vIFBsYXliYWNrL0NhcHR1cmUgaXMgYWN0aXZlIG9yIGluYWN0aXZlCiAgICAgfTsKIAorICAgIC8vIENoZWNrcyBhbmQgbW9uaXRvcnMgYXBwIG9wcyBmb3IgQXVkaW9SZWNvcmRDbGllbnQKKyAgICBjbGFzcyBPcFJlY29yZEF1ZGlvTW9uaXRvciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIH5PcFJlY29yZEF1ZGlvTW9uaXRvcigpIG92ZXJyaWRlOworICAgICAgICBib29sIGhhc09wKCkgY29uc3Q7CisgICAgICAgIGludDMyX3QgZ2V0T3AoKSBjb25zdCB7IHJldHVybiBtQXBwT3A7IH0KKworICAgICAgICBzdGF0aWMgc3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IGNyZWF0ZUlmTmVlZGVkKAorICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgd3A8QXVkaW9Db21tYW5kVGhyZWFkPiBjb21tYW5kVGhyZWFkKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIE9wUmVjb3JkQXVkaW9Nb25pdG9yKGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUmIGF0dHJpYnV0aW9uU291cmNlLCBpbnQzMl90IGFwcE9wLAorICAgICAgICAgICAgICAgIHdwPEF1ZGlvQ29tbWFuZFRocmVhZD4gY29tbWFuZFRocmVhZCk7CisKKyAgICAgICAgdm9pZCBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgQXBwT3BzTWFuYWdlciBtQXBwT3BzTWFuYWdlcjsKKworICAgICAgICBjbGFzcyBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgOiBwdWJsaWMgQm5BcHBPcHNDYWxsYmFjayB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFJlY29yZEF1ZGlvT3BDYWxsYmFjayhjb25zdCB3cDxPcFJlY29yZEF1ZGlvTW9uaXRvcj4mIG1vbml0b3IpOworICAgICAgICAgICAgdm9pZCBvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lKSBvdmVycmlkZTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgY29uc3Qgd3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IG1Nb25pdG9yOworICAgICAgICB9OworCisgICAgICAgIHNwPFJlY29yZEF1ZGlvT3BDYWxsYmFjaz4gbU9wQ2FsbGJhY2s7CisgICAgICAgIC8vIGNhbGxlZCBieSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgd2hlbiB0aGUgYXBwIG9wIGZvciB0aGlzIE9wUmVjb3JkQXVkaW9Nb25pdG9yIGlzIHVwZGF0ZWQKKyAgICAgICAgLy8gaW4gQXBwT3AgY2FsbGJhY2sgYW5kIGluIG9uRmlyc3RSZWYoKQorICAgICAgICAvLyB1cGRhdGVVaWRTdGF0ZXMgaXMgdHJ1ZSB3aGVuIHRoZSBzaWxlbmNlZCBzdGF0ZSBvZiBhY3RpdmUgQXVkaW9SZWNvcmRDbGllbnRzIG11c3QgYmUKKyAgICAgICAgLy8gcmUtZXZhbHVhdGVkCisgICAgICAgIHZvaWQgY2hlY2tPcChib29sIHVwZGF0ZVVpZFN0YXRlcyA9IGZhbHNlKTsKKworICAgICAgICBzdGQ6OmF0b21pY19ib29sIG1IYXNPcDsKKyAgICAgICAgY29uc3QgQXR0cmlidXRpb25Tb3VyY2VTdGF0ZSBtQXR0cmlidXRpb25Tb3VyY2U7CisgICAgICAgIGNvbnN0IGludDMyX3QgbUFwcE9wOworICAgICAgICB3cDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Db21tYW5kVGhyZWFkOworICAgIH07CisKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKICAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbkNhcHR1cmVPdXRwdXQsIGJvb2wgY2FuQ2FwdHVyZUhvdHdvcmQpIDoKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBwb3J0SWQsIGRldmljZUlkKSwKLSAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc3RhcnRUaW1lTnMoMCksCi0gICAgICAgICAgICAgICAgICAgIGNhbkNhcHR1cmVPdXRwdXQoY2FuQ2FwdHVyZU91dHB1dCksIGNhbkNhcHR1cmVIb3R3b3JkKGNhbkNhcHR1cmVIb3R3b3JkKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlJiBhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYW5DYXB0dXJlT3V0cHV0LCBib29sIGNhbkNhcHR1cmVIb3R3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxBdWRpb0NvbW1hbmRUaHJlYWQ+IGNvbW1hbmRUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIGF0dHJpYnV0aW9uU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwgcG9ydElkLCBkZXZpY2VJZCksIGF0dHJpYnV0aW9uU291cmNlKGF0dHJpYnV0aW9uU291cmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZU5zKDApLCBjYW5DYXB0dXJlT3V0cHV0KGNhbkNhcHR1cmVPdXRwdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuQ2FwdHVyZUhvdHdvcmQoY2FuQ2FwdHVyZUhvdHdvcmQpLCBzaWxlbmNlZChmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BSZWNvcmRBdWRpb01vbml0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wUmVjb3JkQXVkaW9Nb25pdG9yOjpjcmVhdGVJZk5lZWRlZChhdHRyaWJ1dGlvblNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywgY29tbWFuZFRocmVhZCkpIHt9CiAgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCisgICAgICAgIGJvb2wgaGFzT3AoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbU9wUmVjb3JkQXVkaW9Nb25pdG9yID8gbU9wUmVjb3JkQXVkaW9Nb25pdG9yLT5oYXNPcCgpIDogdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7IC8vIGF0dHJpYnV0aW9uIHNvdXJjZSBvZiBjbGllbnQKICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOczsKICAgICAgICAgY29uc3QgYm9vbCBjYW5DYXB0dXJlT3V0cHV0OwogICAgICAgICBjb25zdCBib29sIGNhbkNhcHR1cmVIb3R3b3JkOworICAgICAgICBib29sIHNpbGVuY2VkOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3A8T3BSZWNvcmRBdWRpb01vbml0b3I+ICAgICAgICAgICBtT3BSZWNvcmRBdWRpb01vbml0b3I7CiAgICAgfTsKIAorCiAgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CiAgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCiAgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlIGF0dHJpYnV0aW9uU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgOgotICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgdWlkLCBwaWQsIHNlc3Npb24sIHBvcnRJZCwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChhdHRyaWJ1dGVzLCBpbywgYXR0cmlidXRpb25Tb3VyY2UsIHNlc3Npb24sIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkKSwgc3RyZWFtKHN0cmVhbSkge30KICAgICAgICAgICAgICAgICB+QXVkaW9QbGF5YmFja0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgICAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKQEAgLTg3Miw3ICs5NDksOCBAQAogCiAgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCiAgICAgc3RhdHVzX3QgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkKTsKLQorICAgIHZvaWQgbG9hZEF1ZGlvUG9saWN5TWFuYWdlcigpOworICAgIHZvaWQgdW5sb2FkQXVkaW9Qb2xpY3lNYW5hZ2VyKCk7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAgICAvLyBwcmV2ZW50cyBjb25jdXJyZW50IGFjY2VzcyB0byBBdWRpb1BvbGljeSBtYW5hZ2VyIGZ1bmN0aW9ucyBjaGFuZ2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBjb25uZWN0aW9uIHN0YXRlICBvciByb3V0aW5nCkBAIC05MDYsNiArOTg0LDEwIEBACiAgICAgTWVkaWFQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFsbG93UGxheWJhY2tDYXB0dXJlCiAKICAgICBDYXB0dXJlU3RhdGVOb3RpZmllciBtQ2FwdHVyZVN0YXRlTm90aWZpZXI7CisKKyAgICB2b2lkICptTGlicmFyeUhhbmRsZSA9IG51bGxwdHI7CisgICAgQ3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgbUNyZWF0ZUF1ZGlvUG9saWN5TWFuYWdlcjsKKyAgICBEZXN0cm95QXVkaW9Qb2xpY3lNYW5hZ2VySW5zdGFuY2UgbURlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXI7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlZmRiMjQxLi5iMjk2ZmIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYXVkaW9wb2xpY3lfdGVzdHMiLAogCkBAIC0xNiw5ICsyNSwxNCBAQAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnhtbDIiLAorICAgICAgICAibGlicGVybWlzc2lvbiIsCisgICAgICAgICJsaWJiaW5kZXIiLAogICAgIF0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmdtb2NrIgorICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLApAQCAtNDIsNiArNTYsNyBAQAogCiBjY190ZXN0IHsKICAgICBuYW1lOiAiYXVkaW9faGVhbHRoX3Rlc3RzIiwKKyAgICByZXF1aXJlX3Jvb3Q6IHRydWUsCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaAppbmRleCBlMTcyMWVhLi5mN2IwNTY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCkBAIC03NSw2ICs3NSwxMCBAQAogICAgIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUFjdGl2ZVBhdGNoZXMuZmluZCgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbUFjdGl2ZVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIG1BY3RpdmVQYXRjaGVzLmVyYXNlKCpoYW5kbGUpOworICAgICAgICB9CiAgICAgICAgICpoYW5kbGUgPSBtTmV4dFBhdGNoSGFuZGxlKys7CiAgICAgICAgIG1BY3RpdmVQYXRjaGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcigqaGFuZGxlLCAqcGF0Y2gpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTE3LDYgKzEyMSwyNCBAQAogCiAgICAgc2l6ZV90IGdldEF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQ7IH0KIAorICAgIHZpcnR1YWwgdm9pZCBhZGRTdXBwb3J0ZWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgLyogZm9ybWF0ICovKSB7fQorCisgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCkgb3ZlcnJpZGUgeworICAgICAgICBtUm91dGluZ1VwZGF0ZWRVcGRhdGVDb3VudCsrOworICAgIH0KKworICAgIHZvaWQgcmVzZXRSb3V0aW5nVXBkYXRlZENvdW50ZXIoKSB7CisgICAgICAgIG1Sb3V0aW5nVXBkYXRlZFVwZGF0ZUNvdW50ID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0Um91dGluZ1VwZGF0ZWRDb3VudGVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdVcGRhdGVkVXBkYXRlQ291bnQ7IH0KKworICAgIHN0YXR1c190IHVwZGF0ZVNlY29uZGFyeU91dHB1dHMoCisgICAgICAgICAgICBjb25zdCBUcmFja1NlY29uZGFyeU91dHB1dHNNYXAmIHRyYWNrU2Vjb25kYXJ5T3V0cHV0cyBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiBwcml2YXRlOgogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtTmV4dE1vZHVsZUhhbmRsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSArIDE7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgbU5leHRJb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FICsgMTsKQEAgLTEyNCw2ICsxNDYsNyBAQAogICAgIHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzdHJ1Y3QgYXVkaW9fcGF0Y2g+IG1BY3RpdmVQYXRjaGVzOwogICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQWxsb3dlZE1vZHVsZU5hbWVzOwogICAgIHNpemVfdCBtQXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50ID0gMDsKKyAgICBzaXplX3QgbVJvdXRpbmdVcGRhdGVkVXBkYXRlQ291bnQgPSAwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhZDliMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnRGb3JIZG1pLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCB7CitwdWJsaWM6CisgICAgU3RyaW5nOCBnZXRQYXJhbWV0ZXJzKGF1ZGlvX2lvX2hhbmRsZV90IC8qIGlvSGFuZGxlICovLCBjb25zdCBTdHJpbmc4JiAgLyoga2V5cyovICkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUF1ZGlvUGFyYW1ldGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIHZvaWQgYWRkU3VwcG9ydGVkRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZCgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KGF1ZGlvX2Zvcm1hdF90b19zdHJpbmcoZm9ybWF0KSkpOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwgNDgwMDApOworICAgICAgICBtQXVkaW9QYXJhbWV0ZXJzLmFkZChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIFN0cmluZzgoIiIpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXVkaW9QYXJhbWV0ZXIgbUF1ZGlvUGFyYW1ldGVyczsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCmluZGV4IGM2MjhlNzAuLjEzODQ4NjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oCkBAIC04MywxMCArODMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJvdXRpbmdVcGRhdGVkKCkgb3ZlcnJpZGUgeyB9CiAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQgX191bnVzZWQpIHt9CiAgICAgdm9pZCBzZXRTb3VuZFRyaWdnZXJDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUgX191bnVzZWQpIG92ZXJyaWRlIHt9OworICAgIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqcG9ydCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfTsKKyAgICBzdGF0dXNfdCB1cGRhdGVTZWNvbmRhcnlPdXRwdXRzKAorICAgICAgICAgICAgY29uc3QgVHJhY2tTZWNvbmRhcnlPdXRwdXRzTWFwJiB0cmFja1NlY29uZGFyeU91dHB1dHMgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCmluZGV4IDhiYWIwMjAuLjdmNjc5NDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKQEAgLTI5LDYgKzI5LDEwIEBACiAgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzOwogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZDsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VNc2RPdXRwdXRQYXRjaGVzOworICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkT3V0cHV0UGF0Y2hlczsKKyAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUGF0Y2hlczsKICAgICB1aW50MzJfdCBnZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb247IH0KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCmluZGV4IGI1YzY3YTEuLmRmNDM4OWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9faGVhbHRoX3Rlc3RzLmNwcApAQCAtMTYsMTEgKzE2LDEzIEBACiAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lfQm9vdF9UZXN0IgogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKQEAgLTMzLDcgKzM1LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgbnVtUG9ydHM7CiAgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb24xOwogICAgIHVuc2lnbmVkIGludCBnZW5lcmF0aW9uOwotICAgIHN0cnVjdCBhdWRpb19wb3J0ICphdWRpb1BvcnRzID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyAqYXVkaW9Qb3J0cyA9IG51bGxwdHI7CiAgICAgaW50IGF0dGVtcHRzID0gMTA7CiAgICAgZG8gewogICAgICAgICBpZiAoYXR0ZW1wdHMtLSA8IDApIHsKQEAgLTQyLDEzICs0NCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIG51bVBvcnRzID0gMDsKICAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUG9ydHMoCi0gICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX05PTkUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgTlVMTCwgJmdlbmVyYXRpb24xKSk7CisgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX05PTkUsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgbnVsbHB0ciwgJmdlbmVyYXRpb24xKSk7CiAgICAgICAgIGlmIChudW1Qb3J0cyA9PSAwKSB7CiAgICAgICAgICAgICBmcmVlKGF1ZGlvUG9ydHMpOwogICAgICAgICAgICAgR1RFU1RfRkFJTCgpIDw8ICJOdW1iZXIgb2YgYXVkaW8gcG9ydHMgc2hvdWxkIG5vdCBiZSB6ZXJvIjsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvUG9ydHMgPSAoc3RydWN0IGF1ZGlvX3BvcnQgKilyZWFsbG9jKGF1ZGlvUG9ydHMsIG51bVBvcnRzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0KSk7CisgICAgICAgIGF1ZGlvUG9ydHMgPSAoc3RydWN0IGF1ZGlvX3BvcnRfdjcgKilyZWFsbG9jKAorICAgICAgICAgICAgICAgIGF1ZGlvUG9ydHMsIG51bVBvcnRzICogc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X3Y3KSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qb3J0cygKICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfTk9ORSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBhdWRpb1BvcnRzLCAmZ2VuZXJhdGlvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTY4LDkgKzcxLDU3IEBACiAgICAgQVNTRVJUX05FKCJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCIsIG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0U291cmNlKCkpOwogCiAgICAgZm9yIChhdXRvIGRlc2MgOiBtYW5hZ2VyLmdldENvbmZpZygpLmdldElucHV0RGV2aWNlcygpKSB7Ci0gICAgICAgIEFTU0VSVF9ORShhdHRhY2hlZERldmljZXMuZW5kKCksIGF0dGFjaGVkRGV2aWNlcy5maW5kKGRlc2MtPnR5cGUoKSkpOworICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2VzLmZpbmQoZGVzYy0+dHlwZSgpKSA9PSBhdHRhY2hlZERldmljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZVR5cGU7CisgICAgICAgICAgICAodm9pZClEZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKGRlc2MtPnR5cGUoKSwgZGV2aWNlVHlwZSk7CisgICAgICAgICAgICBBRERfRkFJTFVSRSgpIDw8ICJJbnB1dCBkZXZpY2UgXCIiIDw8IGRldmljZVR5cGUgPDwgIlwiIG5vdCBmb3VuZCI7CisgICAgICAgIH0KICAgICB9CiAgICAgZm9yIChhdXRvIGRlc2MgOiBtYW5hZ2VyLmdldENvbmZpZygpLmdldE91dHB1dERldmljZXMoKSkgewotICAgICAgICBBU1NFUlRfTkUoYXR0YWNoZWREZXZpY2VzLmVuZCgpLCBhdHRhY2hlZERldmljZXMuZmluZChkZXNjLT50eXBlKCkpKTsKKyAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlcy5maW5kKGRlc2MtPnR5cGUoKSkgPT0gYXR0YWNoZWREZXZpY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VUeXBlOworICAgICAgICAgICAgKHZvaWQpRGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXNjLT50eXBlKCksIGRldmljZVR5cGUpOworICAgICAgICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiT3V0cHV0IGRldmljZSBcIiIgPDwgZGV2aWNlVHlwZSA8PCAiXCIgbm90IGZvdW5kIjsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChBdWRpb0hlYWx0aFRlc3QsIENvbm5lY3RTdXBwb3J0ZWREZXZpY2UpIHsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50IGNsaWVudDsKKyAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CisgICAgbWFuYWdlci5sb2FkQ29uZmlnKCk7CisgICAgQVNTRVJUX05FKCJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCIsIG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0U291cmNlKCkpOworCisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGRldmljZXMubWVyZ2UocHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBkZXZpY2VzLm1lcmdlKHByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfYmx1ZXRvb3RoX291dF9zY29fZGV2aWNlKGRldmljZS0+dHlwZSgpKSAmJgorICAgICAgICAgICAgIWF1ZGlvX2lzX2JsdWV0b290aF9pbl9zY29fZGV2aWNlKGRldmljZS0+dHlwZSgpKSkgeworICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIHRvIG9ubHkgdGVzdCBjb25uZWN0aW5nIEJUIGRldmljZXMuCisgICAgICAgICAgICAvLyAxKSBJdCBpcyBlYXNpZXIgdG8gY29uc3RydWN0IGEgZmFrZSBhZGRyZXNzLgorICAgICAgICAgICAgLy8gMikgVGhpcyB0ZXN0IHdpbGwgYmUgcnVuIGluIHByZXN1Ym1pdC4gSW4gdGhhdCBjYXNlLCBpdCBtYWtlcyBzZW5zZSB0byBtYWtlIHRoZSB0ZXN0CisgICAgICAgICAgICAvLyAgICBwcm9jZXNzaW5nIHRpbWUgc2hvcnQuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhZGRyZXNzID0gIjExOjIyOjMzOjQ0OjU1OjY2IjsKKyAgICAgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UtPnR5cGUoKSwgYWRkcmVzcy5jX3N0cigpKSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgICAgICBkZXZpY2UtPnR5cGUoKSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsIGFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAiIiAvKmRldmljZV9uYW1lKi8sIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgICAgIEFTU0VSVF9FUShBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgIGRldmljZS0+dHlwZSgpLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBhZGRyZXNzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIiIgLypkZXZpY2VfbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgICAgICBBU1NFUlRfRVEoQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzLmNfc3RyKCkpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhMDA3NGJjLi5hMTZhYjdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTIwLDEwICsyMCwxMiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgogCiAjZGVmaW5lIExPR19UQUcgIkFQTV9UZXN0IgogI2luY2x1ZGUgPFNlcmlhbGl6ZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9BdHRyaWJ1dGlvblNvdXJjZVN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaD4KQEAgLTMyLDEwICszNCwxMyBAQAogCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgiCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWkuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RDbGllbnQuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgdGVzdGluZzo6VW5vcmRlcmVkRWxlbWVudHNBcmU7Cit1c2luZyBhbmRyb2lkOjpjb250ZW50OjpBdHRyaWJ1dGlvblNvdXJjZVN0YXRlOwogCiBURVNUKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RJbml0LCBFbmdpbmVGYWlsdXJlKSB7CiAgICAgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IGNsaWVudDsKQEAgLTU2LDYgKzYxLDM0IEBACiAgICAgQVNTRVJUX0VRKE5PX0lOSVQsIG1hbmFnZXIuaW5pdENoZWNrKCkpOwogfQogCisvLyBWZXJpZmllcyB0aGF0IGEgZmFpbHVyZSB3aGlsZSBsb2FkaW5nIGEgY29uZmlnIGRvZXNuJ3QgbGVhdmUKKy8vIEFQTSBjb25maWcgaW4gYSAiZGlydHkiIHN0YXRlLiBTaW5jZSBBdWRpb1BvbGljeUNvbmZpZyBvYmplY3QKKy8vIGlzIGEgcHJveHkgZm9yIHRoZSBkYXRhIGhvc3RlZCBieSBBUE0sIGl0IGlzbid0IHBvc3NpYmxlCisvLyB0byAiZGVlcCBjb3B5IiBpdCwgYW5kIHRodXMgd2UgaGF2ZSB0byB0ZXN0IGl0cyBlbGVtZW50cworLy8gaW5kaXZpZHVhbGx5LgorVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgQ29uZmlnTG9hZGluZ0lzVHJhbnNhY3Rpb25hbCkgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIEFTU0VSVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SHdNb2R1bGVzKCkuaXNFbXB0eSgpKTsKKyAgICBBU1NFUlRfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldElucHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgQVNTRVJUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZSgKKyAgICAgICAgICAgIChiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCkgKworICAgICAgICAgICAgICAgICAgICAiL3Rlc3RfaW52YWxpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiKS5jX3N0cigpLAorICAgICAgICAgICAgJm1hbmFnZXIuZ2V0Q29uZmlnKCkpOworICAgIEFTU0VSVF9ORShOT19FUlJPUiwgc3RhdHVzKTsKKyAgICBFWFBFQ1RfVFJVRShtYW5hZ2VyLmdldENvbmZpZygpLmdldEh3TW9kdWxlcygpLmlzRW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUobWFuYWdlci5nZXRDb25maWcoKS5nZXRJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0T3V0cHV0RGV2aWNlcygpLmlzRW1wdHkoKSk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoCisgICAgICAgICAgICAoYmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpICsgIi90ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIpLmNfc3RyKCksCisgICAgICAgICAgICAmbWFuYWdlci5nZXRDb25maWcoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzdGF0dXMpOworICAgIEVYUEVDVF9GQUxTRShtYW5hZ2VyLmdldENvbmZpZygpLmdldEh3TW9kdWxlcygpLmlzRW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1hbmFnZXIuZ2V0Q29uZmlnKCkuZ2V0SW5wdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobWFuYWdlci5nZXRDb25maWcoKS5nZXRPdXRwdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKK30KKwogCiBjbGFzcyBQYXRjaENvdW50Q2hlY2sgewogICBwdWJsaWM6CkBAIC04Nyw3ICsxMjAsNyBAQAogICAgIHZvaWQgZ2V0T3V0cHV0Rm9yQXR0cigKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCA9IG51bGxwdHIsCkBAIC05OCw3ICsxMzEsNyBAQAogICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIpOwpAQCAtMTA3LDE1ICsxNDAsMTYgQEAKICAgICAvLyBUcmllcyB0byBmaW5kIGEgZGV2aWNlIHBvcnQuIElmICdmb3VuZFBvcnQnIGlzbid0IG51bGxwdHIsCiAgICAgLy8gd2lsbCBnZW5lcmF0ZSBhIGZhaWx1cmUgaWYgdGhlIHBvcnQgaGFzbid0IGJlZW4gZm91bmQuCiAgICAgYm9vbCBmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb3J0ICpmb3VuZFBvcnQpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MsIGF1ZGlvX3BvcnRfdjcgKmZvdW5kUG9ydCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGcm9tUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCk7CisgICAgdmlydHVhbCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KiBnZXRDbGllbnQoKSB7IHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudDsgfQogCiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQ+IG1DbGllbnQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5VGVzdE1hbmFnZXI+IG1NYW5hZ2VyOwogfTsKIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcCgpIHsKLSAgICBtQ2xpZW50LnJlc2V0KG5ldyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KTsKKyAgICBtQ2xpZW50LnJlc2V0KGdldENsaWVudCgpKTsKICAgICBtTWFuYWdlci5yZXNldChuZXcgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlcihtQ2xpZW50LmdldCgpKSk7CiAgICAgU2V0VXBNYW5hZ2VyQ29uZmlnKCk7ICAvLyBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGN1c3RvbWl6ZSB0aGUgY29uZmlnLgogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRpYWxpemUoKSk7CkBAIC0xNjQsNyArMTk4LDcgQEAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCkBAIC0xODIsOCArMjE2LDEyIEBACiAgICAgaWYgKCFwb3J0SWQpIHBvcnRJZCA9ICZsb2NhbFBvcnRJZDsKICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6b3V0cHV0X3R5cGVfdCBvdXRwdXRUeXBlOworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gMDsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgQVNTRVJUX0VRKE9LLCBtTWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigKLSAgICAgICAgICAgICAgICAgICAgJmF0dHIsIG91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCAwIC8qdWlkKi8sICZjb25maWcsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgJmF0dHIsIG91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLCAmc3RyZWFtLCBhdHRyaWJ1dGlvblNvdXJjZSwgJmNvbmZpZywgJmZsYWdzLAogICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHt9LCAmb3V0cHV0VHlwZSkpOwogICAgIEFTU0VSVF9ORShBVURJT19QT1JUX0hBTkRMRV9OT05FLCAqcG9ydElkKTsKICAgICBBU1NFUlRfTkUoQVVESU9fSU9fSEFORExFX05PTkUsICpvdXRwdXQpOwpAQCAtMTk0LDcgKzIzMiw3IEBACiAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgaW50IHNhbXBsZVJhdGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgewpAQCAtMjA3LDE0ICsyNDUsMTggQEAKICAgICBpZiAoIXBvcnRJZCkgcG9ydElkID0gJmxvY2FsUG9ydElkOwogICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjppbnB1dF90eXBlX3QgaW5wdXRUeXBlOworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gMDsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CiAgICAgQVNTRVJUX0VRKE9LLCBtTWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKAotICAgICAgICAgICAgJmF0dHIsICZpbnB1dCwgcmlpZCwgQVVESU9fU0VTU0lPTl9OT05FLCAwIC8qdWlkKi8sICZjb25maWcsIGZsYWdzLAorICAgICAgICAgICAgJmF0dHIsICZpbnB1dCwgcmlpZCwgQVVESU9fU0VTU0lPTl9OT05FLCBhdHRyaWJ1dGlvblNvdXJjZSwgJmNvbmZpZywgZmxhZ3MsCiAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLCAmaW5wdXRUeXBlLCBwb3J0SWQpKTsKICAgICBBU1NFUlRfTkUoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgKnBvcnRJZCk7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6ZmluZERldmljZVBvcnQoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb3J0ICpmb3VuZFBvcnQpIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb3J0X3Y3ICpmb3VuZFBvcnQpIHsKICAgICB1aW50MzJfdCBudW1Qb3J0cyA9IDA7CiAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjE7CiAgICAgc3RhdHVzX3QgcmV0OwpAQCAtMjI0LDcgKzI2Niw3IEBACiAgICAgaWYgKEhhc0ZhaWx1cmUoKSkgcmV0dXJuIGZhbHNlOwogCiAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjI7Ci0gICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydHNbbnVtUG9ydHNdOworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IHBvcnRzW251bVBvcnRzXTsKICAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24yKTsKICAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7CiAgICAgRVhQRUNUX0VRKGdlbmVyYXRpb24xLCBnZW5lcmF0aW9uMikgPDwgIkdlbmVyYXRpb25zIGNoYW5nZWQgZHVyaW5nIHBvcnRzIHJldHJpZXZhbCI7CkBAIC0zMTcsMTUgKzM1OSw0NiBAQAogCiAvLyBUT0RPOiBBZGQgcGF0Y2ggY3JlYXRpb24gdGVzdHMgdGhhdCBpbnZvbHZlIGFscmVhZHkgZXhpc3RpbmcgcGF0Y2gKIAotY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IHsKK2VudW0KK3sKKyAgICBNU0RfQVVESU9fUEFUQ0hfQ09VTlRfTlVNX0FVRElPX1BBVENIRVNfSU5ERVggPSAwLAorICAgIE1TRF9BVURJT19QQVRDSF9DT1VOVF9OQU1FX0lOREVYID0gMQorfTsKK3VzaW5nIE1zZEF1ZGlvUGF0Y2hDb3VudFNwZWNpZmljYXRpb24gPSBzdGQ6OnR1cGxlPHNpemVfdCwgc3RkOjpzdHJpbmc+OworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxNc2RBdWRpb1BhdGNoQ291bnRTcGVjaWZpY2F0aW9uPiB7CisgIHB1YmxpYzoKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkKCk7CiAgIHByb3RlY3RlZDoKICAgICB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpIG92ZXJyaWRlOwogICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RPdXRwdXREZXZpY2U7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZElucHV0RGV2aWNlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOworCisgICAgY29uc3Qgc2l6ZV90IG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudDsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3BkaWZEZXZpY2U7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtSGRtaUlucHV0RGV2aWNlOwogfTsKIAorQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6QXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCgpCisgICAgOiBtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQoc3RkOjpnZXQ8TVNEX0FVRElPX1BBVENIX0NPVU5UX05VTV9BVURJT19QQVRDSEVTX0lOREVYPigKKyAgICAgICAgICAgIEdldFBhcmFtKCkpKSB7fQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICAgICAgTXNkQXVkaW9QYXRjaENvdW50LAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBNc2RBdWRpb1BhdGNoQ291bnRTcGVjaWZpY2F0aW9uKDF1LCAic2luZ2xlIiksCisgICAgICAgICAgICAgICAgTXNkQXVkaW9QYXRjaENvdW50U3BlY2lmaWNhdGlvbigydSwgImR1YWwiKQorICAgICAgICApLAorICAgICAgICBbXShjb25zdCA6OnRlc3Rpbmc6OlRlc3RQYXJhbUluZm88TXNkQXVkaW9QYXRjaENvdW50U3BlY2lmaWNhdGlvbj4gJmluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpnZXQ8TVNEX0FVRElPX1BBVENIX0NPVU5UX05BTUVfSU5ERVg+KGluZm8ucGFyYW0pOyB9CispOworCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlNldFVwTWFuYWdlckNvbmZpZygpIHsKICAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBTZXJpYWxpemVyIHRvIGxvYWQgcGFydCBvZiB0aGUgY29uZmlnIGZyb20gYSBzdHJpbmcuCiAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCk7CkBAIC0zMzUsOCArNDA4LDExIEBACiAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CiAgICAgc3A8QXVkaW9Qcm9maWxlPiBhYzNPdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGllYzk1OE91dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKICAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CiAgICAgbU1zZE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThPdXRwdXRQcm9maWxlKTsKICAgICBtTXNkSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVTKTsKICAgICAvLyBNYXRjaCBvdXRwdXQgcHJvZmlsZSBmcm9tIEF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0LgogICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtSW5wdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKQEAgLTM0NSw2ICs0MjEsMTkgQEAKICAgICBjb25maWcuYWRkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOwogICAgIGNvbmZpZy5hZGREZXZpY2UobU1zZElucHV0RGV2aWNlKTsKIAorICAgIGlmIChtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQgPT0gMikgeworICAgICAgICAvLyBBZGQgU1BESUYgZGV2aWNlIHdpdGggUENNIG91dHB1dCBwcm9maWxlIGFzIGEgc2Vjb25kIGRldmljZSBmb3IgZHVhbCBNU0QgYXVkaW8gcGF0Y2hpbmcuCisgICAgICAgIG1TcGRpZkRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BESUYpOworICAgICAgICBtU3BkaWZEZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICAgICAgY29uZmlnLmFkZERldmljZShtU3BkaWZEZXZpY2UpOworCisgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IHNwZGlmT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKCJzcGRpZiBvdXRwdXQiKTsKKyAgICAgICAgc3BkaWZPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CisgICAgICAgIHNwZGlmT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1TcGRpZkRldmljZSk7CisgICAgICAgIGNvbmZpZy5nZXRId01vZHVsZXMoKS5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSktPgorICAgICAgICAgICAgICAgIGFkZE91dHB1dFByb2ZpbGUoc3BkaWZPdXRwdXRQcm9maWxlKTsKKyAgICB9CisKICAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbmV3IEh3TW9kdWxlKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1vZHVsZXMgPSBjb25maWcuZ2V0SHdNb2R1bGVzKCk7CiAgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKQEAgLTM2MSw2ICs0NTAsMTEgQEAKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyk7CiAgICAgbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKICAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUpOworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZEllYzk1OE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZSgibXNkIGllYzk1OCBpbnB1dCIpOworICAgIG1zZEllYzk1OE91dHB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThPdXRwdXRQcm9maWxlKTsKKyAgICBtc2RJZWM5NThPdXRwdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIG1zZEllYzk1OE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkSWVjOTU4T3V0cHV0UHJvZmlsZSk7CiAKICAgICBzcDxJbnB1dFByb2ZpbGU+IG1zZElucHV0UHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoIm1zZCBvdXRwdXQiKTsKICAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOwpAQCAtMzc4LDYyICs0NzIsMTA0IEBACiAgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoY29uZmlnLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CiAgICAgY29uZmlnLmdldEh3TW9kdWxlcygpLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKS0+CiAgICAgICAgICAgICBhZGRPdXRwdXRQcm9maWxlKHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZSk7CisKKyAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IGNvbmZpZy5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCk7CisgICAgaWYgKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCA9PSAyKSB7CisgICAgICAgIG1TcGRpZkRldmljZS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgICAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtU3BkaWZEZXZpY2UpOworICAgIH0KKworICAgIC8vIEFkZCBIRE1JIGlucHV0IGRldmljZSB3aXRoIElFQzYwOTU4IHByb2ZpbGUgZm9yIEhETUkgaW4gLT4gTVNEIHBhdGNoaW5nLgorICAgIG1IZG1pSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fSERNSSk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBpZWM5NThJbnB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0lFQzYwOTU4LCBBVURJT19DSEFOTkVMX0lOX1NURVJFTywgNDgwMDApOworICAgIG1IZG1pSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThJbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy5hZGREZXZpY2UobUhkbWlJbnB1dERldmljZSk7CisgICAgc3A8SW5wdXRQcm9maWxlPiBoZG1pSW5wdXRQcm9maWxlID0gbmV3IElucHV0UHJvZmlsZSgiaGRtaSBpbnB1dCIpOworICAgIGhkbWlJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShpZWM5NThJbnB1dFByb2ZpbGUpOworICAgIGhkbWlJbnB1dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBoZG1pSW5wdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobUhkbWlJbnB1dERldmljZSk7CisgICAgY29uZmlnLmdldEh3TW9kdWxlcygpLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKS0+CisgICAgICAgICAgICBhZGRJbnB1dFByb2ZpbGUoaGRtaUlucHV0UHJvZmlsZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6VGVhckRvd24oKSB7CiAgICAgbU1zZE91dHB1dERldmljZS5jbGVhcigpOwogICAgIG1Nc2RJbnB1dERldmljZS5jbGVhcigpOworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLmNsZWFyKCk7CisgICAgbVNwZGlmRGV2aWNlLmNsZWFyKCk7CisgICAgbUhkbWlJbnB1dERldmljZS5jbGVhcigpOwogICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlRlYXJEb3duKCk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBJbml0U3VjY2VzcykgeworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEluaXRTdWNjZXNzKSB7CiAgICAgQVNTRVJUX1RSVUUobU1zZE91dHB1dERldmljZSk7CiAgICAgQVNTRVJUX1RSVUUobU1zZElucHV0RGV2aWNlKTsKKyAgICBBU1NFUlRfVFJVRShtRGVmYXVsdE91dHB1dERldmljZSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBEdW1wKSB7CitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgRHVtcCkgewogICAgIGR1bXBUb0xvZygpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbk9uU2V0Rm9yY2VVc2UpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBQYXRjaENyZWF0aW9uT25TZXRGb3JjZVVzZSkgewogICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUyk7Ci0gICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBQYXRjaENyZWF0aW9uU2V0UmVsZWFzZU1zZE91dHB1dFBhdGNoZXMpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbU1hbmFnZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICAvLyBSZW1vdmUgTVNEIG91dHB1dCBkZXZpY2UgdG8gYXZvaWQgcGF0Y2hpbmcgdG8gaXRzZWxmCisgICAgZGV2aWNlcy5yZW1vdmUobU1zZE91dHB1dERldmljZSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgZGV2aWNlcy5zaXplKCkpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIC8vIER1YWwgcGF0Y2g6IGV4ZXJjaXNlIGNyZWF0aW5nIG9uZSBuZXcgYXVkaW8gcGF0Y2ggYW5kIHJldXNpbmcgYW5vdGhlciBleGlzdGluZyBhdWRpbyBwYXRjaC4KKyAgICBEZXZpY2VWZWN0b3Igc2luZ2xlRGV2aWNlKGRldmljZXNbMF0pOworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhzaW5nbGVEZXZpY2UpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQgLSAxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIG1NYW5hZ2VyLT5zZXRNc2RPdXRwdXRQYXRjaGVzKCZkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIG1NYW5hZ2VyLT5yZWxlYXNlTXNkT3V0cHV0UGF0Y2hlcyhkZXZpY2VzKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUm91dGVzVG9Nc2QpIHsKICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKLSAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCi1URVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRQbHVzUGNtUm91dGVzVG9Nc2QpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRW5jb2RlZFBsdXNQY21Sb3V0ZXNUb01zZCkgewogICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOwotICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtRGVmYXVsdE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOwotICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKLSAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUShtRXhwZWN0ZWRBdWRpb1BhdGNoQ291bnQsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKLVRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyVW5zdXBwb3J0ZWRGb3JtYXRCeXBhc3Nlc01zZCkgeworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJVbnN1cHBvcnRlZEZvcm1hdEJ5cGFzc2VzTXNkKSB7CiAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCkBAIC00NDIsNyArNTc4LDcgQEAKICAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKIH0KIAotVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJGb3JtYXRTd2l0Y2hpbmcpIHsKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CiAgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgogICAgIHsKICAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKQEAgLTQ1MSwxMCArNTg3LDEwIEBACiAgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKICAgICAgICAgICAgICAgICBudWxscHRyIC8qb3V0cHV0Ki8sICZwb3J0SWQpOwotICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbURlZmF1bHRPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEobUV4cGVjdGVkQXVkaW9QYXRjaENvdW50LCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogICAgICAgICBtTWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwotICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKICAgICB9CiAgICAgewogICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOwpAQCAtNDY0LDcgKzYwMCw3IEBACiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKICAgICAgICAgICAgICAgICBudWxscHRyIC8qb3V0cHV0Ki8sICZwb3J0SWQpOwogICAgICAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgtMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKC1zdGF0aWNfY2FzdDxpbnQ+KG1FeHBlY3RlZEF1ZGlvUGF0Y2hDb3VudCksIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiAgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogICAgIH0KQEAgLTQ3MywxMSArNjA5LDM5IEBACiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7Ci0gICAgICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKICAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiAgICAgfQogfQogCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbkZyb21IZG1pSW5Ub01zZCkgeworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIHVpZF90IHVpZCA9IDQyOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLgorICAgICAgICAgICAgYWRkU291cmNlKG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9IRE1JLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKS4KKyAgICAgICAgICAgIGFkZFNpbmsobU1hbmFnZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKS4KKyAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfQlVTLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBBU1NFUlRfTkUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7CisgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gcGF0Y2hlcyA9IG1NYW5hZ2VyLT5nZXRBdWRpb1BhdGNoZXMoKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IHBhdGNoZXMudmFsdWVGb3IoaGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcyk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgcGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLnJvbGUpOworICAgIEFTU0VSVF9FUShBVURJT19QT1JUX1JPTEVfU0lOSywgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5yb2xlKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRk9STUFUX0lFQzYwOTU4LCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZm9ybWF0KTsKKyAgICBBU1NFUlRfRVEoQVVESU9fRk9STUFUX0lFQzYwOTU4LCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmZvcm1hdCk7CisgICAgQVNTRVJUX0VRKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrKTsKKyAgICBBU1NFUlRfRVEoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCBwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmNoYW5uZWxfbWFzayk7CisgICAgQVNTRVJUX0VRKDQ4MDAwLCBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uc2FtcGxlX3JhdGUpOworICAgIEFTU0VSVF9FUSg0ODAwMCwgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCB7CiBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKSBvdmVycmlkZTsKQEAgLTYzOCw2ICs4MDIsMTg4IEBACiAgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCByZXQpOwogfQogCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaQorICAgICAgICA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgc3RkOjpzdHJpbmcgZ2V0Q29uZmlnRmlsZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHNUdkNvbmZpZzsgfQorICAgIHN0ZDo6bWFwPGF1ZGlvX2Zvcm1hdF90LCBib29sPiBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGdldEZvcm1hdHNGcm9tUG9ydHMoKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50KiBnZXRDbGllbnQoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudEZvckhkbWk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzVHZDb25maWc7CisKK307CisKK2NvbnN0IHN0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpzVHZDb25maWcgPQorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaTo6c0V4ZWN1dGFibGVEaXIgKworICAgICAgICAidGVzdF9zZXR0b3BfYm94X3N1cnJvdW5kX2NvbmZpZ3VyYXRpb24ueG1sIjsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaTo6U2V0VXAoKSB7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6U2V0VXAoKTsKKyAgICBtQ2xpZW50LT5hZGRTdXBwb3J0ZWRGb3JtYXQoQVVESU9fRk9STUFUX0VfQUMzKTsKKyAgICBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICIiIC8qYWRkcmVzcyovLCAiIiAvKm5hbWUqLywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpUZWFyRG93bigpIHsKKyAgICBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgIiIgLyphZGRyZXNzKi8sICIiIC8qbmFtZSovLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6VGVhckRvd24oKTsKK30KKworc3RkOjptYXA8YXVkaW9fZm9ybWF0X3QsIGJvb2w+CisgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pOjpnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKSB7CisgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IDA7CisgICAgc3RkOjptYXA8YXVkaW9fZm9ybWF0X3QsIGJvb2w+IHN1cnJvdW5kRm9ybWF0c01hcDsKKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+Z2V0U3Vycm91bmRGb3JtYXRzKAorICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgbnVsbHB0ciAvKiBzdXJyb3VuZEZvcm1hdHMgKi8sCisgICAgICAgICAgICBudWxscHRyIC8qIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgKi8pOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNNYXA7CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IHN1cnJvdW5kRm9ybWF0c1tudW1TdXJyb3VuZEZvcm1hdHNdOworICAgIG1lbXNldChzdXJyb3VuZEZvcm1hdHMsIDAsIHNpemVvZihhdWRpb19mb3JtYXRfdCkgKiBudW1TdXJyb3VuZEZvcm1hdHMpOworICAgIGJvb2wgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtudW1TdXJyb3VuZEZvcm1hdHNdOworICAgIG1lbXNldChzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCAwLCBzaXplb2YoYm9vbCkgKiBudW1TdXJyb3VuZEZvcm1hdHMpOworICAgIHJldCA9IG1NYW5hZ2VyLT5nZXRTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgICAgICAmbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMsIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNNYXA7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpPCBudW1TdXJyb3VuZEZvcm1hdHM7IGkrKykgeworICAgICAgICBzdXJyb3VuZEZvcm1hdHNNYXBbc3Vycm91bmRGb3JtYXRzW2ldXSA9IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWRbaV07CisgICAgfQorICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNNYXA7Cit9CisKK3N0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaTo6Z2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKSB7CisgICAgdW5zaWduZWQgaW50IG51bVN1cnJvdW5kRm9ybWF0cyA9IDA7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICBzdXJyb3VuZEZvcm1hdHNWZWN0b3I7CisgICAgc3RhdHVzX3QgcmV0ID0gbU1hbmFnZXItPmdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzKAorICAgICAgICAgICAgJm51bVN1cnJvdW5kRm9ybWF0cywgbnVsbHB0ciAvKiBzdXJyb3VuZEZvcm1hdHMgKi8pOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNWZWN0b3I7CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IHN1cnJvdW5kRm9ybWF0c1tudW1TdXJyb3VuZEZvcm1hdHNdOworICAgIG1lbXNldChzdXJyb3VuZEZvcm1hdHMsIDAsIHNpemVvZihhdWRpb19mb3JtYXRfdCkgKiBudW1TdXJyb3VuZEZvcm1hdHMpOworICAgIHJldCA9IG1NYW5hZ2VyLT5nZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0cygmbnVtU3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHMpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNWZWN0b3I7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmc3Vycm91bmRGb3JtYXQgOiBzdXJyb3VuZEZvcm1hdHMpIHsKKyAgICAgICAgc3Vycm91bmRGb3JtYXRzVmVjdG9yLnB1c2hfYmFjayhzdXJyb3VuZEZvcm1hdCk7CisgICAgfQorICAgIHJldHVybiBzdXJyb3VuZEZvcm1hdHNWZWN0b3I7Cit9CisKK3N0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4KKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdEZvckhkbWk6OmdldEZvcm1hdHNGcm9tUG9ydHMoKSB7CisgICAgdWludDMyX3QgbnVtUG9ydHMgPSAwOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24xOworICAgIHN0YXR1c190IHJldDsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7CisgICAgcmV0ID0gbU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzKAorICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NJTkssIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsICZudW1Qb3J0cywgbnVsbHB0ciwgJmdlbmVyYXRpb24xKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZm9ybWF0czsKKyAgICB9CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgcG9ydHNbbnVtUG9ydHNdOworICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cygKKyAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TSU5LLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLCAmbnVtUG9ydHMsIHBvcnRzLCAmZ2VuZXJhdGlvbjEpOworICAgIEVYUEVDVF9FUShOT19FUlJPUiwgcmV0KSA8PCAibU1hbmFnZXItPmxpc3RBdWRpb1BvcnRzIHJldHVybmVkIGVycm9yIjsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmb3JtYXRzOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBvcnQgOiBwb3J0cykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBvcnQubnVtX2F1ZGlvX3Byb2ZpbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBvcnQuYXVkaW9fcHJvZmlsZXNbaV0uZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm9ybWF0czsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLCBHZXRTdXJyb3VuZEZvcm1hdHNSZXR1cm5zU3VwcG9ydGVkRm9ybWF0cykgeworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKTsKKyAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwKKyAgICAgICAgR2V0U3Vycm91bmRGb3JtYXRzUmV0dXJuc01hbmlwdWxhdGVkRm9ybWF0cykgeworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCwgQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMKTsKKworICAgIHN0YXR1c190IHJldCA9CisgICAgICAgICAgICBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFN1cnJvdW5kRm9ybWF0c0hlbHBlcigpOworICAgIEFTU0VSVF9FUSgxLCBzdXJyb3VuZEZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisgICAgQVNTRVJUX0ZBTFNFKHN1cnJvdW5kRm9ybWF0c1tBVURJT19GT1JNQVRfRV9BQzNdKTsKKworICAgIHJldCA9IG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CisgICAgc3Vycm91bmRGb3JtYXRzID0gZ2V0U3Vycm91bmRGb3JtYXRzSGVscGVyKCk7CisgICAgQVNTRVJUX0VRKDEsIHN1cnJvdW5kRm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKKyAgICBBU1NFUlRfVFJVRShzdXJyb3VuZEZvcm1hdHNbQVVESU9fRk9STUFUX0VfQUMzXSk7CisKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBzdXJyb3VuZEZvcm1hdHMgPSBnZXRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBBU1NFUlRfRVEoMSwgc3Vycm91bmRGb3JtYXRzLmNvdW50KEFVRElPX0ZPUk1BVF9FX0FDMykpOworICAgIEFTU0VSVF9GQUxTRShzdXJyb3VuZEZvcm1hdHNbQVVESU9fRk9STUFUX0VfQUMzXSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0Rm9ySGRtaSwKKyAgICAgICAgTGlzdEF1ZGlvUG9ydHNSZXR1cm5NYW5pcHVsYXRlZEhkbWlGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpOworCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pKTsKKyAgICBhdXRvIGZvcm1hdHMgPSBnZXRGb3JtYXRzRnJvbVBvcnRzKCk7CisgICAgQVNTRVJUX0VRKDAsIGZvcm1hdHMuY291bnQoQVVESU9fRk9STUFUX0VfQUMzKSk7CisKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoQVVESU9fRk9STUFUX0VfQUMzLCB0cnVlIC8qZW5hYmxlZCovKSk7CisgICAgZm9ybWF0cyA9IGdldEZvcm1hdHNGcm9tUG9ydHMoKTsKKyAgICBBU1NFUlRfRVEoMSwgZm9ybWF0cy5jb3VudChBVURJT19GT1JNQVRfRV9BQzMpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorICAgICAgICBHZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c1JldHVybnNIZG1pUmVwb3J0ZWRGb3JtYXRzKSB7CisgICAgbU1hbmFnZXItPnNldEZvcmNlVXNlKAorICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5ELCBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOworICAgIGF1dG8gc3Vycm91bmRGb3JtYXRzID0gZ2V0UmVwb3J0ZWRTdXJyb3VuZEZvcm1hdHNIZWxwZXIoKTsKKyAgICBBU1NFUlRfRVEoMSwgc3RkOjpjb3VudChzdXJyb3VuZEZvcm1hdHMuYmVnaW4oKSwgc3Vycm91bmRGb3JtYXRzLmVuZCgpLCBBVURJT19GT1JNQVRfRV9BQzMpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RGb3JIZG1pLAorICAgICAgICBHZXRSZXBvcnRlZFN1cnJvdW5kRm9ybWF0c1JldHVybnNOb25NYW5pcHVsYXRlZEhkbWlSZXBvcnRlZEZvcm1hdHMpIHsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsIEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgZmFsc2UgLyplbmFibGVkKi8pOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKyAgICBhdXRvIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7CisKKyAgICByZXQgPSBtTWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKEFVRElPX0ZPUk1BVF9FX0FDMywgdHJ1ZSAvKmVuYWJsZWQqLyk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOworICAgIHN1cnJvdW5kRm9ybWF0cyA9IGdldFJlcG9ydGVkU3Vycm91bmRGb3JtYXRzSGVscGVyKCk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnQoc3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIHN1cnJvdW5kRm9ybWF0cy5lbmQoKSwgQVVESU9fRk9STUFUX0VfQUMzKSk7Cit9CisKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE5vUmVtb3RlU3VibWl4TW9kdWxlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5IHsKIHByb3RlY3RlZDoKICAgICBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgb3ZlcnJpZGUgeyByZXR1cm4gc1ByaW1hcnlPbmx5Q29uZmlnOyB9CkBAIC02ODQsNyArMTAzMCw3IEBACiAgICAgICAgICAgICB7QVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULCBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRX0KICAgICB9OwogCi0gICAgc3RydWN0IGF1ZGlvX3BvcnQgbUluamVjdGlvblBvcnQ7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfdjcgbUluamVjdGlvblBvcnQ7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIH07CiAKQEAgLTcwMSwxMyArMTA0NywxNCBAQAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBtTWl4QWRkcmVzcywgYXVkaW9Db25maWcsIG1Vc2FnZVJ1bGVzKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBleHRyYWN0aW9uUG9ydDsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBleHRyYWN0aW9uUG9ydDsKICAgICBBU1NFUlRfVFJVRShmaW5kRGV2aWNlUG9ydChBVURJT19QT1JUX1JPTEVfU09VUkNFLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgbU1peEFkZHJlc3MsICZleHRyYWN0aW9uUG9ydCkpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgc291cmNlLCAwLCAiIn07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7CisgICAgICAgIEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBzb3VyY2UsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OwogICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSAiYWRkcj0iICsgbU1peEFkZHJlc3M7CiAgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CiAgICAgZ2V0SW5wdXRGb3JBdHRyKGF0dHIsIG1UcmFja2VyLT5nZXRSaWlkKCksICZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKQEAgLTc1Nyw5ICsxMTA0LDkgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmcsCiAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQUxBUk0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifQogICAgICAgICAgICAgICAgICkKICAgICAgICAgKTsKIApAQCAtNzY4LDQ3ICsxMTE1LDQ3IEBACiAgICAgICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUFBsYXliYWNrUmVSb3V0aW5nLAogICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9NRURJQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQUxBUk0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0dBTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfU1BFRUNILCBBVURJT19VU0FHRV9BU1NJU1RBTlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQorICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KICAgICAgICAgICAgICAgICApCiAgICAgICAgICk7CiAKQEAgLTgxNyw0MSArMTE2NCw0MSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKICAgICAgICAgdGVzdGluZzo6VmFsdWVzKAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19OT05FLCAiIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9HQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC04NjksNyArMTIxNiw3IEBACiAgICAgICAgIHtBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVR9CiAgICAgfTsKIAotICAgIHN0cnVjdCBhdWRpb19wb3J0IG1FeHRyYWN0aW9uUG9ydDsKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF92NyBtRXh0cmFjdGlvblBvcnQ7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIH07CiAKQEAgLTg4NiwxMyArMTIzMywxNCBAQAogICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIG1NaXhBZGRyZXNzLCBhdWRpb0NvbmZpZywgbVNvdXJjZVJ1bGVzKTsKICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBpbmplY3Rpb25Qb3J0OworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IGluamVjdGlvblBvcnQ7CiAgICAgQVNTRVJUX1RSVUUoZmluZERldmljZVBvcnQoQVVESU9fUE9SVF9ST0xFX1NJTkssIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKICAgICAgICAgICAgICAgICAgICAgbU1peEFkZHJlc3MsICZpbmplY3Rpb25Qb3J0KSk7CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRTsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgdXNhZ2UsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn07CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPQorICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCB1c2FnZSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9OwogICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSBzdGQ6OnN0cmluZygiYWRkcj0iKSArIG1NaXhBZGRyZXNzOwogICAgIHN0cm5jcHkoYXR0ci50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOwogICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCkBAIC05NDEsMTcgKzEyODksMTkgQEAKICAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTWl4UmVjb3JkSW5qZWN0aW9uLAogICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgMCwgIiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19GTEFHX05PTkUsICIifSwKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fRkxBR19OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQogICAgICAgICAgICAgICAgICkKICAgICAgICAgKTsKQEAgLTk2MiwxNCArMTMxMiwxNSBAQAogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24sCiAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKICAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIDAsICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCAwLCAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkQsIEFVRElPX0ZMQUdfTk9ORSwgIiJ9LAogICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIEFVRElPX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCiAgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9IT1RXT1JELCBBVURJT19GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9CiAgICAgICAgICAgICAgICAgKQogICAgICAgICApOwogCkBAIC05ODgsNiArMTMzOSwzNCBAQAogICAgIGR1bXBUb0xvZygpOwogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERldmljZUNvbm5lY3Rpb24sIFJvdXRpbmdVcGRhdGUpIHsKKyAgICBtQ2xpZW50LT5yZXNldFJvdXRpbmdVcGRhdGVkQ291bnRlcigpOworICAgIC8vIENvbm5lY3RpbmcgYSB2YWxpZCBvdXRwdXQgZGV2aWNlIHdpdGggdmFsaWQgcGFyYW1ldGVycyBzaG91bGQgdHJpZ2dlciBhIHJvdXRpbmcgdXBkYXRlCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICJhIiwgImIiLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgIEFTU0VSVF9FUSgxLCBtQ2xpZW50LT5nZXRSb3V0aW5nVXBkYXRlZENvdW50ZXIoKSk7CisKKyAgICAvLyBEaXNjb25uZWN0aW5nIGEgY29ubmVjdGVkIGRldmljZSBzaG91bGQgc3VjY2VlZCBhbmQgdHJpZ2dlciBhIHJvdXRpbmcgdXBkYXRlCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgImEiLCAiYiIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgQVNTRVJUX0VRKDIsIG1DbGllbnQtPmdldFJvdXRpbmdVcGRhdGVkQ291bnRlcigpKTsKKworICAgIC8vIERpc2Nvbm5lY3RpbmcgYSBkaXNjb25uZWN0ZWQgZGV2aWNlIHNob3VsZCBmYWlsIGFuZCBub3QgdHJpZ2dlciBhIHJvdXRpbmcgdXBkYXRlCisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgImEiLCAiYiIsICBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgIEFTU0VSVF9FUSgyLCBtQ2xpZW50LT5nZXRSb3V0aW5nVXBkYXRlZENvdW50ZXIoKSk7CisKKyAgICAvLyBDaGFuZ2luZyBmb3JjZSB1c2Ugc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlCisgICAgYXV0byBjb25maWcgPSBtTWFuYWdlci0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSk7CisgICAgYXV0byBuZXdDb25maWcgPSBjb25maWcgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgPworICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgOiBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUDsKKyAgICBtTWFuYWdlci0+c2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSwgbmV3Q29uZmlnKTsKKyAgICBBU1NFUlRfRVEoMywgbUNsaWVudC0+Z2V0Um91dGluZ1VwZGF0ZWRDb3VudGVyKCkpOworfQorCiBURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERldmljZUNvbm5lY3Rpb24sIFNldERldmljZUNvbm5lY3Rpb25TdGF0ZSkgewogICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CiAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOwpAQCAtMTAzMyw3ICsxNDEyLDcgQEAKICAgICAgICAgICAgIHR5cGUsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CiAKLSAgICBhdWRpb19wb3J0IGRldmljZVBvcnQ7CisgICAgYXVkaW9fcG9ydF92NyBkZXZpY2VQb3J0OwogICAgIGNvbnN0IGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpCiAgICAgICAgICAgICA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBBU1NFUlRfVFJVRShmaW5kRGV2aWNlUG9ydChyb2xlLCB0eXBlLCBhZGRyZXNzLCAmZGV2aWNlUG9ydCkpOwpAQCAtMTA5NCw3ICsxNDczLDcgQEAKICAgICAgICAgICAgIGZsYWdzLCAmb3V0cHV0LCAmcG9ydElkKTsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0RGVzYyA9IG1NYW5hZ2VyLT5nZXRPdXRwdXRzKCkudmFsdWVGb3Iob3V0cHV0KTsKICAgICBBU1NFUlRfTkUobnVsbHB0ciwgb3V0RGVzYy5nZXQoKSk7Ci0gICAgYXVkaW9fcG9ydCBwb3J0ID0ge307CisgICAgYXVkaW9fcG9ydF92NyBwb3J0ID0ge307CiAgICAgb3V0RGVzYy0+dG9BdWRpb1BvcnQoJnBvcnQpOwogICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtMTE3Niw3ICsxNTU1LDcgQEAKICAgICAgICAgICAgIGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCAiMCIsIG51bGxwdHIpKTsKICAgICBtQ2xpZW50LT5zd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHsicHJpbWFyeSIsICJyX3N1Ym1peCJ9KTsKICAgICBtTWFuYWdlci0+b25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0OworICAgIHN0cnVjdCBhdWRpb19wb3J0X3Y3IHBvcnQ7CiAgICAgQVNTRVJUX1RSVUUoZmluZERldmljZVBvcnQoQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsICIwIiwgJnBvcnQpKTsKIH0KIApAQCAtMTE4OCwzICsxNTY3LDEwOSBAQAogICAgIEVYUEVDVF9HVChtQ2xpZW50LT5nZXRBdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQoKSwgcHJldkF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCk7CiAgICAgRVhQRUNUX0dUKG1NYW5hZ2VyLT5nZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCksIHByZXZBdWRpb1BvcnRHZW5lcmF0aW9uKTsKIH0KKwordXNpbmcgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0gPSBzdGQ6OnR1cGxlPGF1ZGlvX3NvdXJjZV90LCBkZXZpY2Vfcm9sZV90PjsKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0VGVzdAorICAgICAgICA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlLAorICAgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0+IHsKK3Byb3RlY3RlZDoKKyAgICAvLyBUaGUgYGlucHV0RGV2aWNlYCBhbmQgYGlucHV0RGV2aWNlMmAgaW5kaWNhdGUgdGhlIGF1ZGlvIGRldmljZXMgdHlwZSB0byBiZSB1c2VkIGZvciBzZXR0aW5nCisgICAgLy8gZGV2aWNlIHJvbGUuIFRoZXkgbXVzdCBiZSBkZWNsYXJlZCBpbiB0aGUgdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGlucHV0RGV2aWNlID0gQXVkaW9EZXZpY2VUeXBlQWRkcihBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsICIiKTsKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyIGlucHV0RGV2aWNlMiA9IEF1ZGlvRGV2aWNlVHlwZUFkZHIoQVVESU9fREVWSUNFX0lOX0hETUksICIiKTsKK307CisKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRUZXN0LCBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQpIHsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IHN0ZDo6Z2V0PDA+KEdldFBhcmFtKCkpOworICAgIGNvbnN0IGRldmljZV9yb2xlX3Qgcm9sZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgLy8gVGVzdCBpbnZhbGlkIGRldmljZSB3aGVuIHNldHRpbmcKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyIG91dHB1dERldmljZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsICIiKTsKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIG91dHB1dERldmljZXMgPSB7b3V0cHV0RGV2aWNlfTsKKyAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLAorICAgICAgICAgICAgICBtTWFuYWdlci0+c2V0RGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBvdXRwdXREZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmFkZERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgb3V0cHV0RGV2aWNlcykpOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlczsKKyAgICBBU1NFUlRfRVEoTkFNRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBBU1NFUlRfVFJVRShkZXZpY2VzLmVtcHR5KCkpOworICAgIEFTU0VSVF9FUShCQURfVkFMVUUsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5yZW1vdmVEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIG91dHB1dERldmljZXMpKTsKKworICAgIC8vIFdpdGhvdXQgc2V0dGluZywgY2FsbCBnZXQvcmVtb3ZlL2NsZWFyIG11c3QgZmFpbAorICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmdldERldmljZXNGb3JSb2xlQW5kQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgZGV2aWNlcykpOworICAgIEFTU0VSVF9FUShOQU1FX05PVF9GT1VORCwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPmNsZWFyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlKSk7CisKKyAgICAvLyBUZXN0IHNldC9nZXQgZGV2aWNlcyByb2xlCisgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBpbnB1dERldmljZXMgPSB7aW5wdXREZXZpY2V9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgRVhQRUNUX1RIQVQoZGV2aWNlcywgVW5vcmRlcmVkRWxlbWVudHNBcmUoaW5wdXREZXZpY2UpKTsKKworICAgIC8vIFRlc3Qgc2V0dGluZyB3aWxsIGNoYW5nZSB0aGUgcHJldmlvdXNseSBzZXQgZGV2aWNlcworICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgaW5wdXREZXZpY2VzMiA9IHtpbnB1dERldmljZTJ9OworICAgIEFTU0VSVF9FUShOT19FUlJPUiwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnNldERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzMikpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZTIpKTsKKworICAgIC8vIFRlc3QgYWRkIGRldmljZXMKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5hZGREZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGlucHV0RGV2aWNlcykpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKKyAgICBFWFBFQ1RfVEhBVChkZXZpY2VzLCBVbm9yZGVyZWRFbGVtZW50c0FyZShpbnB1dERldmljZSwgaW5wdXREZXZpY2UyKSk7CisKKyAgICAvLyBUZXN0IHJlbW92ZSBkZXZpY2VzCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLAorICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBpbnB1dERldmljZXMpKTsKKyAgICBkZXZpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Z2V0RGV2aWNlc0ZvclJvbGVBbmRDYXB0dXJlUHJlc2V0KGF1ZGlvU291cmNlLCByb2xlLCBkZXZpY2VzKSk7CisgICAgRVhQRUNUX1RIQVQoZGV2aWNlcywgVW5vcmRlcmVkRWxlbWVudHNBcmUoaW5wdXREZXZpY2UyKSk7CisKKyAgICAvLyBUZXN0IHJlbW92ZSBkZXZpY2VzIHRoYXQgYXJlIG5vdCBzZXQgYXMgdGhlIGRldmljZSByb2xlCisgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwKKyAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZURldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSwgaW5wdXREZXZpY2VzKSk7CisKKyAgICAvLyBUZXN0IGNsZWFyIGRldmljZXMKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5jbGVhckRldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldChhdWRpb1NvdXJjZSwgcm9sZSkpOworICAgIGRldmljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfRVEoTkFNRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgIG1NYW5hZ2VyLT5nZXREZXZpY2VzRm9yUm9sZUFuZENhcHR1cmVQcmVzZXQoYXVkaW9Tb3VyY2UsIHJvbGUsIGRldmljZXMpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldE9wZXJhdGlvbiwKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0VGVzdCwKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfTUlDLCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9DQUxMLCBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX0NBTUNPUkRFUiwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSksCisgICAgICAgICAgICAgICAgRGV2aWNlc1JvbGVGb3JDYXB0dXJlUHJlc2V0UGFyYW0oe0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVZJQ0VfUk9MRV9QUkVGRVJSRUR9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VzUm9sZUZvckNhcHR1cmVQcmVzZXRQYXJhbSh7QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfRk1fVFVORVIsIERFVklDRV9ST0xFX1BSRUZFUlJFRH0pLAorICAgICAgICAgICAgICAgIERldmljZXNSb2xlRm9yQ2FwdHVyZVByZXNldFBhcmFtKHtBVURJT19TT1VSQ0VfSE9UV09SRCwgREVWSUNFX1JPTEVfUFJFRkVSUkVEfSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCmluZGV4IGQ5NDc2ZDkuLmZmNGQ1NjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy9BbmRyb2lkLmJwCkBAIC0xLDggKzEsMTkgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogZmlsZWdyb3VwIHsKICAgICBuYW1lOiAiYXVkaW9wb2xpY3l0ZXN0X2NvbmZpZ3VyYXRpb25fZmlsZXMiLAogICAgIHNyY3M6IFsKICAgICAgICAgInRlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICAgICAgInRlc3RfYXVkaW9fcG9saWN5X3ByaW1hcnlfb25seV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgICAgICJ0ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKICAgICAgICAgInRlc3RfdHZfYXBtX2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICAgICAgInRlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCIsCiAgICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfaW52YWxpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2NDFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2ludmFsaWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMTEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIGFuIHVubmFtZWQgZGV2aWNlIHBvcnQgaW4gdGhlICJyX3N1Ym1peCIgbW9kdWxlIHNlY3Rpb24uIC0tPgorPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX291dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0ibWl4cG9ydF9idF9oZnBfaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTYwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaS1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9IRE1JIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08iIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzaW5rIiBhZGRyZXNzPSJoZnBfY2xpZW50X291dCI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyBIZWFkc2V0IE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzb3VyY2UiIGFkZHJlc3M9ImhmcF9jbGllbnRfaW4iPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEhkbWktSW4gTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSGRtaSIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBTQ08iCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9Im1peHBvcnRfYnRfaGZwX291dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1peHBvcnRfYnRfaGZwX2lucHV0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggbW9kdWxlIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9InJfc3VibWl4IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5SZW1vdGUgU3VibWl4IEluPC9pdGVtPgorICAgICAgICAgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icl9zdWJtaXggb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJyX3N1Ym1peCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICA8IS0tIFRoaXMgcG9ydCBpcyBtaXNzaW5nICJ0YWdOYW1lIiBhdHRyaWJ1dGUuIC0tPgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdHlwZT0iQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iUmVtb3RlIFN1Ym1peCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlJlbW90ZSBTdWJtaXggT3V0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJyX3N1Ym1peCBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJyX3N1Ym1peCBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iUmVtb3RlIFN1Ym1peCBJbiIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3Rfc2V0dG9wX2JveF9zdXJyb3VuZF9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3Mzc1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X3NldHRvcF9ib3hfc3Vycm91bmRfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLQorICB+IENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgIH4KKyAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIH4KKyAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgICAgICAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgICAgIDxpdGVtPlN0dWI8L2l0ZW0+CisgICAgICAgICAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgIDxkZWZhdWx0T3V0cHV0RGV2aWNlPlN0dWI8L2RlZmF1bHRPdXRwdXREZXZpY2U+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBwY20iIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im11bHRpY2hhbm5lbCBvdXRwdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiAvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgIDwvbWl4UG9ydHM+CisgICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3R1YiIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TVFVCIiByb2xlPSJzaW5rIiAvPgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkhETUkiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSERNSSIgcm9sZT0ic2luayIgLz4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlN0dWIiIHNvdXJjZXM9InByaW1hcnkgcGNtIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSERNSSIgc291cmNlcz0icHJpbWFyeSBwY20sbXVsdGljaGFubmVsIG91dHB1dCIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKaW5kZXggNTAxZDkyMi4uMjY1NjJlMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwCkBAIC0xNiw2ICsxNiwyNSBAQAogLy8gbGliY2FtZXJhc2VydmljZQogLy8KIAorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliY2FtZXJhc2VydmljZSIsCiAKQEAgLTMwLDcgKzQ5LDYgQEAKICAgICAgICAgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIiwKICAgICAgICAgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCIsCiAgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCi0gICAgICAgICJhcGkxL0NhbWVyYUNsaWVudC5jcHAiLAogICAgICAgICAiYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCIsCiAgICAgICAgICJhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAiLAogICAgICAgICAiYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCIsCkBAIC00Niw3ICs2NCw2IEBACiAgICAgICAgICJhcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcCIsCiAgICAgICAgICJhcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwIiwKICAgICAgICAgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAotICAgICAgICAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAiLApAQCAtNTQsNyArNzEsNyBAQAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCIsCi0gICAgICAgICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAiLAogICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIiwKQEAgLTY1LDE3ICs4MiwyMSBAQAogICAgICAgICAiZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmNwcCIsCiAgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuY3BwIiwKICAgICAgICAgImRldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1VIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlci5jcHAiLAogICAgICAgICAiZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAiLAogICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCIsCiAgICAgICAgICJoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIiwKICAgICAgICAgImhpZGwvQ29udmVydC5jcHAiLAogICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAiLAogICAgICAgICAiaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAiLAogICAgICAgICAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIiwKICAgICAgICAgInV0aWxzL0NhbWVyYVRyYWNlcy5jcHAiLAogICAgICAgICAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIiwKICAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAogICAgICAgICAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAiLAorICAgICAgICAidXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAiLAogICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAogICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAogICAgIF0sCkBAIC05NCw2ICsxMTUsOCBAQAogICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLApAQCAtMTE3LDI1ICsxNDAsMzMgQEAKICAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmNvbW1vbkAyLjAiLAogICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAiLAogICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjEiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjIiLAogICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuZGV2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4xIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjciLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy42IgorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICAgICAgIm1lZGlhX3Blcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicHJvY2Vzc2luZm9zZXJ2aWNlX2FpZGwiLAogICAgICAgICAibGliYmluZGVydGhyZWFkc3RhdGV1dGlscyIsCisgICAgICAgICJtZWRpYV9wZXJtaXNzaW9uLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmFjdGl2aXR5bWFuYWdlcl9haWRsIiwKKyAgICAgICAgImxpYnBlcm1pc3Npb24iLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJmbXEiLAogICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCkBAIC0xNTksNCArMTkwLDMgQEAKICAgICBdLAogCiB9Ci0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKaW5kZXggZTYyOWNkZC4uY2NkZDllNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKQEAgLTU5LDkgKzU5LDggQEAKICAgICBpZiAobVByb3ZpZGVyTWFuYWdlci0+c3VwcG9ydFNldFRvcmNoTW9kZShjYW1lcmFJZC5zdHJpbmcoKSkpIHsKICAgICAgICAgbUZsYXNoQ29udHJvbCA9IG5ldyBQcm92aWRlckZsYXNoQ29udHJvbChtUHJvdmlkZXJNYW5hZ2VyKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBPbmx5IEhBTDEgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydCBzZXRUb3JjaE1vZGUKLSAgICAgICAgbUZsYXNoQ29udHJvbCA9Ci0gICAgICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKG1Qcm92aWRlck1hbmFnZXIsIG1DYWxsYmFja3MpOworICAgICAgICBBTE9HRSgiRmxhc2hsaWdodCBjb250cm9sIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UhIik7CisgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTMwOSwyNzEgKzMwOCw0IEBACiB9CiAvLyBQcm92aWRlckZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCi0vLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woCi0gICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKSA6Ci0gICAgICAgIG1Qcm92aWRlck1hbmFnZXIobWFuYWdlciksCi0gICAgICAgIG1DYWxsYmFja3MoY2FsbGJhY2tzKSwKLSAgICAgICAgbVRvcmNoRW5hYmxlZChmYWxzZSkgewotfQotCi1DYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6fkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKCkgewotICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLQotICAgIG1TdXJmYWNlLmNsZWFyKCk7Ci0gICAgbVN1cmZhY2VUZXh0dXJlLmNsZWFyKCk7Ci0gICAgbVByb2R1Y2VyLmNsZWFyKCk7Ci0gICAgbUNvbnN1bWVyLmNsZWFyKCk7Ci0KLSAgICBpZiAobVRvcmNoRW5hYmxlZCkgewotICAgICAgICBpZiAobUNhbGxiYWNrcykgewotICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1DYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OnNldFRvcmNoTW9kZSgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLQotICAgIC8vIHByZS1jaGVjawotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBib29sIGhhc0ZsYXNoID0gZmFsc2U7Ci0gICAgICAgIC8vIENoZWNrIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQgYW5kIGxlYXZlIGNhbWVyYSBkZXZpY2Ugb3Blbi4KLSAgICAgICAgcmVzID0gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCAmaGFzRmxhc2gsIC8qa2VlcERldmljZU9wZW4qL3RydWUpOwotICAgICAgICAvLyBpbnZhbGlkIGNhbWVyYT8KLSAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgLy8gaGFzRmxhc2hVbml0TG9ja2VkKCkgcmV0dXJucyBCQURfSU5ERVggaWYgbURldmljZSBpcyBjb25uZWN0ZWQgdG8KLSAgICAgICAgICAgIC8vIGFub3RoZXIgY2FtZXJhIGRldmljZS4KLSAgICAgICAgICAgIHJldHVybiByZXMgPT0gQkFEX0lOREVYID8gQkFEX0lOREVYIDogLUVJTlZBTDsKLSAgICAgICAgfQotICAgICAgICAvLyBubyBmbGFzaCB1bml0PwotICAgICAgICBpZiAoIWhhc0ZsYXNoKSB7Ci0gICAgICAgICAgICAvLyBEaXNjb25uZWN0IGNhbWVyYSBkZXZpY2UgaWYgaXQgaGFzIG5vIGZsYXNoLgotICAgICAgICAgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1EZXZpY2UgPT0gTlVMTCB8fCBjYW1lcmFJZCAhPSBtQ2FtZXJhSWQpIHsKLSAgICAgICAgLy8gZGlzYWJsaW5nIHRoZSB0b3JjaCBtb2RlIG9mIGFuIHVuLW9wZW5lZCBvciBkaWZmZXJlbnQgZGV2aWNlLgotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZGlzYWJsaW5nIHRoZSB0b3JjaCBtb2RlIG9mIGN1cnJlbnRseSBvcGVuZWQgZGV2aWNlCi0gICAgICAgIGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLSAgICAgICAgbVRvcmNoRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBtQ2FsbGJhY2tzLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChjYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJlcyA9IHN0YXJ0UHJldmlld0FuZFRvcmNoKCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIG1Ub3JjaEVuYWJsZWQgPSB0cnVlOwotICAgIG1DYWxsYmFja3MtPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aGFzRmxhc2hVbml0KAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgLy8gQ2xvc2UgZGV2aWNlIGFmdGVyIGNoZWNraW5nIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQuCi0gICAgcmV0dXJuIGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCwgaGFzRmxhc2gsIC8qa2VlcERldmljZU9wZW4qL2ZhbHNlKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6Omhhc0ZsYXNoVW5pdExvY2tlZCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKSB7Ci0gICAgYm9vbCBjbG9zZUNhbWVyYURldmljZSA9IGZhbHNlOwotCi0gICAgaWYgKCFoYXNGbGFzaCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAobURldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIENvbm5lY3QgdG8gY2FtZXJhIGRldmljZSB0byBxdWVyeSBpZiBpdCBoYXMgYSBmbGFzaCB1bml0LgotICAgICAgICByZXMgPSBjb25uZWN0Q2FtZXJhRGV2aWNlKGNhbWVyYUlkKTsKLSAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgICAgICAvLyBDbG9zZSBjYW1lcmEgZGV2aWNlIG9ubHkgd2hlbiBpdCBpcyBqdXN0IG9wZW5lZCBhbmQgdGhlIGNhbGxlciBkb2Vzbid0IHdhbnQgdG8ga2VlcAotICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBvcGVuLgotICAgICAgICBjbG9zZUNhbWVyYURldmljZSA9ICFrZWVwRGV2aWNlT3BlbjsKLSAgICB9Ci0KLSAgICBpZiAoY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7Ci0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqZmxhc2hNb2RlID0KLSAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTKTsKLSAgICBpZiAoZmxhc2hNb2RlICYmIHN0cnN0cihmbGFzaE1vZGUsIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfVE9SQ0gpKSB7Ci0gICAgICAgICpoYXNGbGFzaCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKmhhc0ZsYXNoID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGNsb3NlQ2FtZXJhRGV2aWNlKSB7Ci0gICAgICAgIHJlcyA9IGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZGlzY29ubmVjdCBjYW1lcmEgZGV2aWNlLiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpzdGFydFByZXZpZXdBbmRUb3JjaCgpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICByZXMgPSBtRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc3RhcnQgcHJldmlldyBmYWlsZWQuICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCk7Ci0KLSAgICByZXR1cm4gbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpnZXRTbWFsbGVzdFN1cmZhY2VTaXplKAotICAgICAgICBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7Ci0gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaW50MzJfdCB3ID0gSU5UMzJfTUFYOwotICAgIGludDMyX3QgaCA9IDE7Ci0gICAgVmVjdG9yPFNpemU+IHNpemVzOwotCi0gICAgbVBhcmFtZXRlcnMuZ2V0U3VwcG9ydGVkUHJldmlld1NpemVzKHNpemVzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFNpemUgcyA9IHNpemVzW2ldOwotICAgICAgICBpZiAodyAqIGggPiBzLndpZHRoICogcy5oZWlnaHQpIHsKLSAgICAgICAgICAgIHcgPSBzLndpZHRoOwotICAgICAgICAgICAgaCA9IHMuaGVpZ2h0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHcgPT0gSU5UMzJfTUFYKSB7Ci0gICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0KLSAgICAqd2lkdGggPSB3OwotICAgICpoZWlnaHQgPSBoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6aW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coCi0gICAgICAgIGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgZGV2aWNlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotICAgIHN0YXR1c190IHJlczsKLSAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7Ci0KLSAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgR0xDb25zdW1lcihtQ29uc3VtZXIsIDAsIEdMQ29uc3VtZXI6OlRFWFRVUkVfRVhURVJOQUwsCi0gICAgICAgICAgICB0cnVlLCB0cnVlKTsKLSAgICBpZiAobVN1cmZhY2VUZXh0dXJlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKLSAgICByZXMgPSBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGZvcm1hdCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKnVzZUFzeW5jKi8gdHJ1ZSk7Ci0gICAgaWYgKG1TdXJmYWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGV2aWNlLT5zZXRQcmV2aWV3V2luZG93KG1TdXJmYWNlKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OmNvbm5lY3RDYW1lcmFEZXZpY2UoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7Ci0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGRldmljZSA9Ci0gICAgICAgICAgICBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoY2FtZXJhSWQuc3RyaW5nKCkpOwotCi0gICAgc3RhdHVzX3QgcmVzID0gZGV2aWNlLT5pbml0aWFsaXplKG1Qcm92aWRlck1hbmFnZXIpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBpbml0aWFsaXppbmcgY2FtZXJhICVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLy8gbmVlZCB0byBzZXQgX19nZXRfbWVtb3J5IGluIHNldF9jYWxsYmFja3MoKS4KLSAgICBkZXZpY2UtPnNldENhbGxiYWNrcyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotICAgIG1QYXJhbWV0ZXJzID0gZGV2aWNlLT5nZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgcmVzID0gZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZSgmd2lkdGgsICZoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZ2V0IHNtYWxsZXN0IHN1cmZhY2Ugc2l6ZSBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICByZXMgPSBpbml0aWFsaXplUHJldmlld1dpbmRvdyhkZXZpY2UsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcmV2aWV3IHdpbmRvdyBmb3IgY2FtZXJhICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSAgICBtQ2FtZXJhSWQgPSBjYW1lcmFJZDsKLSAgICBtRGV2aWNlID0gZGV2aWNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OmRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgaWYgKG1QYXJhbWV0ZXJzLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSkpIHsKLSAgICAgICAgLy8gVGhlcmUgaXMgYSBmbGFzaCwgdHVybiBpZiBvZmYuCi0gICAgICAgIC8vIChJZiB0aGVyZSBpc24ndCBvbmUsIGxlYXZlIHRoZSBwYXJhbWV0ZXIgbnVsbCkKLSAgICAgICAgbVBhcmFtZXRlcnMuc2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GTEFTSF9NT0RFLAotICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKLSAgICAgICAgbURldmljZS0+c2V0UGFyYW1ldGVycyhtUGFyYW1ldGVycyk7Ci0gICAgfQotICAgIG1EZXZpY2UtPnN0b3BQcmV2aWV3KCk7Ci0gICAgc3RhdHVzX3QgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtU3VyZmFjZS5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBBTE9HVygiJXM6IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgIH0KLSAgICBtRGV2aWNlLT5zZXRQcmV2aWV3V2luZG93KE5VTEwpOwotICAgIG1EZXZpY2UtPnJlbGVhc2UoKTsKLSAgICBtRGV2aWNlID0gTlVMTDsKLQotICAgIHJldHVybiBPSzsKLX0KLS8vIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sIGltcGxlbWVudGF0aW9uIGVuZHMKLQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCmluZGV4IDFiYWFiYTIuLmI5N2ZhNWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKLSNpbmNsdWRlICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgiCi0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xMjQsNTkgKzEyMiw2IEBACiAgICAgICAgIE11dGV4IG1Mb2NrOwogfTsKIAotLyoqCi0gKiBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIDw9IHYyLjMgYW5kIGNhbWVyYSBIQUwgdjEKLSAqLwotY2xhc3MgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgKLSAgICAgICAgICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpTdGF0dXNMaXN0ZW5lciogY2FsbGJhY2tzKTsKLSAgICAgICAgdmlydHVhbCB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woKTsKLQotICAgICAgICAvLyBGbGFzaENvbnRyb2xCYXNlCi0gICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKTsKLSAgICAgICAgc3RhdHVzX3QgaGFzRmxhc2hVbml0KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyBjb25uZWN0IHRvIGEgY2FtZXJhIGRldmljZQotICAgICAgICBzdGF0dXNfdCBjb25uZWN0Q2FtZXJhRGV2aWNlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKLQotICAgICAgICAvLyBkaXNjb25uZWN0IGFuZCBmcmVlIG1EZXZpY2UKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdENhbWVyYURldmljZSgpOwotCi0gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIHByZXZpZXcgd2luZG93Ci0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemVQcmV2aWV3V2luZG93KGNvbnN0IHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKLQotICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFuZCBlbmFibGUgdG9yY2gKLSAgICAgICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3QW5kVG9yY2goKTsKLQotICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IHN1cmZhY2UKLSAgICAgICAgc3RhdHVzX3QgZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZShpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKLQotICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLSAgICAgICAgLy8gSWYgdGhpcyBmdW5jdGlvbiBvcGVucyBjYW1lcmEgZGV2aWNlIGluIG9yZGVyIHRvIGNoZWNrIGlmIGl0IGhhcyBhIGZsYXNoIHVuaXQsIHRoZQotICAgICAgICAvLyBjYW1lcmEgZGV2aWNlIHdpbGwgcmVtYWluIG9wZW4gaWYga2VlcERldmljZU9wZW4gaXMgdHJ1ZSBhbmQgdGhlIGNhbWVyYSBkZXZpY2Ugd2lsbCBiZQotICAgICAgICAvLyBjbG9zZWQgaWYga2VlcERldmljZU9wZW4gaXMgZmFsc2UuIElmIGNhbWVyYSBkZXZpY2UgaXMgYWxyZWFkeSBvcGVuIHdoZW4gY2FsbGluZyB0aGlzCi0gICAgICAgIC8vIGZ1bmN0aW9uLCBrZWVwRGV2aWNlT3BlbiBpcyBpZ25vcmVkLgotICAgICAgICBzdGF0dXNfdCBoYXNGbGFzaFVuaXRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoLCBib29sIGtlZXBEZXZpY2VPcGVuKTsKLQotICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7Ci0gICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIqIG1DYWxsYmFja3M7Ci0gICAgICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBtRGV2aWNlOwotICAgICAgICBTdHJpbmc4IG1DYW1lcmFJZDsKLSAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtUGFyYW1ldGVyczsKLSAgICAgICAgYm9vbCBtVG9yY2hFbmFibGVkOwotCi0gICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gIG1Db25zdW1lcjsKLSAgICAgICAgc3A8R0xDb25zdW1lcj4gbVN1cmZhY2VUZXh0dXJlOwotICAgICAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKLQotICAgICAgICBNdXRleCBtTG9jazsKLX07Ci0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IGFmMWUwMWQuLmQwZDNhOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjc3RkbGliPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3RpbWU+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMzcsMTEgKzM4LDkgQEAKICNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lSZXN1bHRSZWNlaXZlci5oPgogI2luY2x1ZGUgPGJpbmRlcnRocmVhZHN0YXRlL0NhbGxlclV0aWxzLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgpAQCAtNTcsNiArNTYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPHByb2Nlc3NpbmZvL1Byb2Nlc3NJbmZvU2VydmljZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CkBAIC03MCwxMiArNzAsMTIgQEAKICNpbmNsdWRlIDxzeXN0ZW0vY2FtZXJhLmg+CiAKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiYXBpMS9DYW1lcmFDbGllbnQuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYTJDbGllbnQuaCIKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtODUsMTMgKzg1LDE1IEBACiAKIHVzaW5nIGJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGJpbmRlcjo6U3RhdHVzOwordXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKIHVzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7Ci11c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1czsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYUluamVjdGlvblNlc3Npb247CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9uOwogCkBAIC0xMjgsMTUgKzEzMCwxNiBAQAogICAgICAgICBzQ2FtZXJhU2VuZFN5c3RlbUV2ZW50c1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIik7CiBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhbWVyYU9wZW5DbG9zZUxpc3RlbmVyUGVybWlzc2lvbigKICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfT1BFTl9DTE9TRV9MSVNURU5FUiIpOworc3RhdGljIGNvbnN0IFN0cmluZzE2CisgICAgICAgIHNDYW1lcmFJbmplY3RFeHRlcm5hbENhbWVyYVBlcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfSU5KRUNUX0VYVEVSTkFMX0NBTUVSQSIpOworY29uc3QgY2hhciAqc0ZpbGVOYW1lID0gImxhc3RPcGVuU2Vzc2lvbkR1bXBGaWxlIjsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U2NvcmUgPSByZXNvdXJjZV9wb2xpY3k6OlBFUkNFUFRJQkxFX0FQUF9BREo7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUk7CiAKLS8vIE1hdGNoZXMgd2l0aCBQRVJDRVBUSUJMRV9BUFBfQURKIGluIFByb2Nlc3NMaXN0LmphdmEKLXN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U2NvcmUgPSAyMDA7Ci0vLyBNYXRjaGVzIHdpdGggUFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJIGluIEFjdGl2aXR5TWFuYWdlci5qYXZhCi1zdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFN0YXRlID0gMTsKIGNvbnN0IFN0cmluZzggQ2FtZXJhU2VydmljZTo6a09mZmxpbmVEZXZpY2UoIm9mZmxpbmUtIik7CiAKLU11dGV4IENhbWVyYVNlcnZpY2U6OnNQcm94eU11dGV4Owotc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2U6OnNDYW1lcmFTZXJ2aWNlUHJveHk7CisvLyBTZXQgdG8ga2VlcCB0cmFjayBvZiBsb2dnZWQgc2VydmljZSBlcnJvciBldmVudHMuCitzdGF0aWMgc3RkOjpzZXQ8U3RyaW5nOD4gc1NlcnZpY2VFcnJvckV2ZW50U2V0OwogCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkgOgogICAgICAgICBtRXZlbnRMb2coREVGQVVMVF9FVkVOVF9MT0dfTEVOR1RIKSwKQEAgLTE0NiwxMCArMTQ5LDE1IEBACiAgICAgICAgIG1BdWRpb1Jlc3RyaWN0aW9uKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6QVVESU9fUkVTVFJJQ1RJT05fTk9ORSkgewogICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlIHN0YXJ0ZWQgKHBpZD0lZCkiLCBnZXRwaWQoKSk7CiAgICAgbVNlcnZpY2VMb2NrV3JhcHBlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8V2FpdGFibGVNdXRleFdyYXBwZXI+KCZtU2VydmljZUxvY2spOworICAgIG1NZW1GZCA9IG1lbWZkX2NyZWF0ZShzRmlsZU5hbWUsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBpZiAobU1lbUZkID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3Igd2hpbGUgY3JlYXRpbmcgdGhlIGZpbGU6ICVzIiwgX19GVU5DVElPTl9fLCBzRmlsZU5hbWUpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvbkZpcnN0UmVmKCkKIHsKKwogICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlIHByb2Nlc3Mgc3RhcnRpbmciKTsKIAogICAgIEJuQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpOwpAQCAtMTcwLDYgKzE3OCw3IEBACiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CiAgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyID0gbmV3IEluamVjdGlvblN0YXR1c0xpc3RlbmVyKHRoaXMpOwogICAgIG1BcHBPcHMuc2V0Q2FtZXJhQXVkaW9SZXN0cmljdGlvbihtQXVkaW9SZXN0cmljdGlvbik7CiAgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKICAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CkBAIC0xNzksNyArMTg4LDcgQEAKIAogICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgbGFzdCBjYWxsIGluIHRoaXMgZnVuY3Rpb24sIHNvIHRoYXQgaXQncyBhcyBjbG9zZSB0bwogICAgIC8vIFNlcnZpY2VNYW5hZ2VyOjphZGRTZXJ2aWNlKCkgYXMgcG9zc2libGUuCi0gICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OnBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKTsKICAgICBBTE9HSSgiQ2FtZXJhU2VydmljZSBwaW5nZWQgY2FtZXJhc2VydmljZSBwcm94eSIpOwogfQogCkBAIC0xOTYsNiArMjA1LDggQEAKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBwcm92aWRlciBtYW5hZ2VyOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgbG9nU2VydmljZUVycm9yKFN0cmluZzg6OmZvcm1hdCgiVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIHByb3ZpZGVyIG1hbmFnZXIiKSwKKyAgICAgICAgICAgICAgICBFUlJPUl9ESVNDT05ORUNURUQpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyNiwzNiArMjM3LDMxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBEZXJpdmUgcHJpbWFyeSByZWFyL2Zyb250IGNhbWVyYXMsIGFuZCBmaWx0ZXIgdGhlaXIgY2hhcmFjdGllcnN0aWNzLgorICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBhZnRlciBhbGwgY2FtZXJhcyBhcmUgZW51bWVyYXRlZCBhbmQgY2FtZXJhIGlkcyBhcmUgc29ydGVkLgorICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpJU19QRVJGX0NMQVNTKSB7CisgICAgICAgIC8vIEFzc3VtZSBpbnRlcm5hbCBjYW1lcmFzIGFyZSBhZHZlcnRpc2VkIGZyb20gdGhlIHNhbWUKKyAgICAgICAgLy8gcHJvdmlkZXIuIElmIG11bHRpcGxlIHByb3ZpZGVycyBhcmUgcmVnaXN0ZXJlZCBhdCBkaWZmZXJlbnQgdGltZSwKKyAgICAgICAgLy8gYW5kIGVhY2ggcHJvdmlkZXIgY29udGFpbnMgbXVsdGlwbGUgaW50ZXJuYWwgY29sb3IgY2FtZXJhcywgdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gbG9naWMgbWF5IGZpbHRlciB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIG1vcmUgdGhhbiBvbmUgZnJvbnQvcmVhciBjb2xvcgorICAgICAgICAvLyBjYW1lcmFzLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtU2VydmljZUxvY2spOworICAgICAgICBmaWx0ZXJTUGVyZkNsYXNzQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKCk7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCi1zcDxJQ2FtZXJhU2VydmljZVByb3h5PiBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKSB7Ci0jaWZuZGVmIF9fQlJJTExPX18KLSAgICBNdXRleDo6QXV0b2xvY2sgYWwoc1Byb3h5TXV0ZXgpOwotICAgIGlmIChzQ2FtZXJhU2VydmljZVByb3h5ID09IG51bGxwdHIpIHsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgICAgICAvLyBVc2UgY2hlY2tTZXJ2aWNlIGJlY2F1c2UgY2FtZXJhc2VydmVyIG5vcm1hbGx5IHN0YXJ0cyBiZWZvcmUgdGhlCi0gICAgICAgIC8vIHN5c3RlbSBzZXJ2ZXIgYW5kIHRoZSBwcm94eSBzZXJ2aWNlLiBTbyB0aGUgbG9uZyB0aW1lb3V0IHRoYXQgZ2V0U2VydmljZQotICAgICAgICAvLyBoYXMgYmVmb3JlIGdpdmluZyB1cCBpcyBpbmFwcHJvcHJpYXRlLgotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEucHJveHkiKSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc0NhbWVyYVNlcnZpY2VQcm94eSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlUHJveHk+KGJpbmRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gc0NhbWVyYVNlcnZpY2VQcm94eTsKLX0KLQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgewotICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7Ci0gICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybjsKLSAgICBwcm94eUJpbmRlci0+cGluZ0ZvclVzZXJVcGRhdGUoKTsKLX0KLQotdm9pZCBDYW1lcmFTZXJ2aWNlOjpicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIFRvcmNoTW9kZVN0YXR1cyBzdGF0dXMpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBUb3JjaE1vZGVTdGF0dXMgc3RhdHVzLAorICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKLQogICAgIGZvciAoYXV0byYgaSA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgaWYgKHNob3VsZFNraXBTdGF0dXNVcGRhdGVzKHN5c3RlbUNhbWVyYUtpbmQsIGktPmlzVmVuZG9yTGlzdGVuZXIoKSwgaS0+Z2V0TGlzdGVuZXJQaWQoKSwKKyAgICAgICAgICAgICAgICBpLT5nZXRMaXN0ZW5lclVpZCgpKSkgeworICAgICAgICAgICAgQUxPR1YoIlNraXBwaW5nIHRvcmNoIGNhbGxiYWNrIGZvciBzeXN0ZW0tb25seSBjYW1lcmEgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBpLT5nZXRMaXN0ZW5lcigpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOwogICAgIH0KIH0KQEAgLTI2NCw2ICsyNzAsNyBAQAogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5yZW1vdmVMaXN0ZW5lcigpOwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6Om9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCkgewpAQCAtMzEyLDYgKzMxOSw0NiBAQAogICAgIGZpbHRlckFQSTFTeXN0ZW1DYW1lcmFMb2NrZWQobU5vcm1hbERldmljZUlkcyk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6ZmlsdGVyU1BlcmZDbGFzc0NoYXJhY3RlcmlzdGljc0xvY2tlZCgpIHsKKyAgICAvLyBUbyBjbGFpbSB0byBiZSBTIFBlcmZvcm1hbmNlIHByaW1hcnkgY2FtZXJhcywgdGhlIGNhbWVyYXMgbXVzdCBiZQorICAgIC8vIGJhY2t3YXJkIGNvbXBhdGlibGUuIFNvIHBlcmZvcm1hbmNlIGNsYXNzIHByaW1hcnkgY2FtZXJhIElkcyBtdXN0IGJlIEFQSTEKKyAgICAvLyBjb21wYXRpYmxlLgorICAgIGJvb2wgZmlyc3RSZWFyQ2FtZXJhU2VlbiA9IGZhbHNlLCBmaXJzdEZyb250Q2FtZXJhU2VlbiA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgY2FtZXJhSWQgOiBtTm9ybWFsRGV2aWNlSWRzV2l0aG91dFN5c3RlbUNhbWVyYSkgeworICAgICAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgICAgIGludCBvcmllbnRhdGlvbiA9IDA7CisgICAgICAgIFN0cmluZzggY2FtZXJhSWQ4KGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkOCwgLypvdXQqLyZmYWNpbmcsIC8qb3V0Ki8mb3JpZW50YXRpb24pOworICAgICAgICBpZiAoZmFjaW5nID09IC0xKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgY2FtZXJhIGRldmljZSBcIiVzXCIgZmFjaW5nIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZmFjaW5nID09IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0sgJiYgIWZpcnN0UmVhckNhbWVyYVNlZW4pIHx8CisgICAgICAgICAgICAgICAgKGZhY2luZyA9PSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVCAmJiAhZmlyc3RGcm9udENhbWVyYVNlZW4pKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5maWx0ZXJTbWFsbEpwZWdTaXplcyhjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgbVBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMuaW5zZXJ0KGNhbWVyYUlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmlsdGVyIHNtYWxsIEpQRUcgc2l6ZXMgZm9yIHBlcmZvcm1hbmNlIGNsYXNzIHByaW1hcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNhbWVyYSAlczogJXMoJWQpIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhY2luZyA9PSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLKSB7CisgICAgICAgICAgICAgICAgZmlyc3RSZWFyQ2FtZXJhU2VlbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFjaW5nID09IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UKSB7CisgICAgICAgICAgICAgICAgZmlyc3RGcm9udENhbWVyYVNlZW4gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpcnN0UmVhckNhbWVyYVNlZW4gJiYgZmlyc3RGcm9udENhbWVyYVNlZW4pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OmFkZFN0YXRlcyhjb25zdCBTdHJpbmc4IGlkKSB7CiAgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWQoaWQuY19zdHIoKSk7CiAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgY29zdDsKQEAgLTM0MSw3ICszODgsNyBAQAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOwogICAgICAgICBtVG9yY2hTdGF0dXNNYXAuYWRkKGlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYpOwogCi0gICAgICAgIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhpZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgYnJvYWRjYXN0VG9yY2hNb2RlU3RhdHVzKGlkLCBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYsIGRldmljZUtpbmQpOwogICAgIH0KIAogICAgIHVwZGF0ZUNhbWVyYU51bUFuZElkcygpOwpAQCAtNTAyLDEyICs1NDksMTkgQEAKIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpvblRvcmNoU3RhdHVzQ2hhbmdlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cykgeworICAgIFN5c3RlbUNhbWVyYUtpbmQgc3lzdGVtQ2FtZXJhS2luZCA9IFN5c3RlbUNhbWVyYUtpbmQ6OlBVQkxJQzsKKyAgICBzdGF0dXNfdCByZXMgPSBnZXRTeXN0ZW1DYW1lcmFLaW5kKGNhbWVyYUlkLCAmc3lzdGVtQ2FtZXJhS2luZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZXQgc3lzdGVtIGNhbWVyYSBraW5kIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7Ci0gICAgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cyk7CisgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhSWQsIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICAgICAgVG9yY2hNb2RlU3RhdHVzIG5ld1N0YXR1cywgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKSB7CiAgICAgQUxPR0koIiVzOiBUb3JjaCBzdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JXMsIG5ld1N0YXR1cz0lZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBuZXdTdGF0dXMpOwogCkBAIC01NTYsOCArNjEwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjYW1lcmFJZCwgbmV3U3RhdHVzKTsKKyAgICBicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoY2FtZXJhSWQsIG5ld1N0YXR1cywgc3lzdGVtQ2FtZXJhS2luZCk7CiB9CiAKIHN0YXRpYyBib29sIGhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGludCBjYWxsaW5nUGlkLCBpbnQgY2FsbGluZ1VpZCkgewpAQCAtNjA2LDYgKzY1OSw3IEBACiAgICAgfQogCiAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbG9nU2VydmljZUVycm9yKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhIHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlIiksRVJST1JfRElTQ09OTkVDVEVEKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgICAgICAgICAgICAgIkNhbWVyYSBzdWJzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZSIpOwogICAgIH0KQEAgLTYyOCw2ICs2ODIsOCBAQAogICAgICAgICByZXQgPSBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLAogICAgICAgICAgICAgICAgICJFcnJvciByZXRyaWV2aW5nIGNhbWVyYSBpbmZvIGZyb20gZGV2aWNlICVkOiAlcyAoJWQpIiwgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIGxvZ1NlcnZpY2VFcnJvcihTdHJpbmc4Ojpmb3JtYXQoIkVycm9yIHJldHJpZXZpbmcgY2FtZXJhIGluZm8gZnJvbSBkZXZpY2UgJWQiLGNhbWVyYUlkKSwKKyAgICAgICAgICAgIEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtNjU2LDcgKzcxMiw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAotICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgeworICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEqIGNhbWVyYUluZm8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICghY2FtZXJhSW5mbykgewogICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYUluZm8gaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CkBAIC02NjUsNiArNzIxLDcgQEAKIAogICAgIGlmICghbUluaXRpYWxpemVkKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIEhBTCBjb3VsZG4ndCBiZSBpbml0aWFsaXplZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGxvZ1NlcnZpY2VFcnJvcihTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSBzdWJzeXN0ZW0gaXMgbm90IGF2YWlsYWJsZSIpLEVSUk9SX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfRElTQ09OTkVDVEVELAogICAgICAgICAgICAgICAgICJDYW1lcmEgc3Vic3lzdGVtIGlzIG5vdCBhdmFpbGFibGUiKTs7CiAgICAgfQpAQCAtNjc2LDEyICs3MzMsMjUgQEAKIAogICAgIFN0YXR1cyByZXR7fTsKIAorCisgICAgc3RkOjpzdHJpbmcgY2FtZXJhSWRTdHIgPSBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKTsKKyAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnRhcmdldFBlcmZDbGFzc1ByaW1hcnlDYW1lcmEobVBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLCB0YXJnZXRTZGtWZXJzaW9uKTsKICAgICBzdGF0dXNfdCByZXMgPSBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgY2FtZXJhSW5mbyk7CisgICAgICAgICAgICBjYW1lcmFJZFN0ciwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGNhbWVyYUluZm8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gcmV0cmlldmUgY2FtZXJhICIKLSAgICAgICAgICAgICAgICAiY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlVuYWJsZSB0byByZXRyaWV2ZSBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAiY2hhcmFjdGVyaXN0aWNzIGZvciB1bmtub3duIGRldmljZSAlczogJXMgKCVkKSIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ1NlcnZpY2VFcnJvcihTdHJpbmc4Ojpmb3JtYXQoIlVuYWJsZSB0byByZXRyaWV2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciAiCisgICAgICAgICAgICAiZGV2aWNlICVzLiIsIFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpKSxFUlJPUl9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byByZXRyaWV2ZSBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgICAiY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KICAgICB9CiAgICAgU3lzdGVtQ2FtZXJhS2luZCBkZXZpY2VLaW5kID0gU3lzdGVtQ2FtZXJhS2luZDo6UFVCTElDOwogICAgIGlmIChnZXRTeXN0ZW1DYW1lcmFLaW5kKFN0cmluZzgoY2FtZXJhSWQpLCAmZGV2aWNlS2luZCkgIT0gT0spIHsKQEAgLTc2MSw3ICs4MzEsMTEgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0RGV2aWNlVmVyc2lvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgaW50KiBmYWNpbmcpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6Y2xlYXJDYWNoZWRWYXJpYWJsZXMoKSB7CisgICAgQmFzaWNDbGllbnQ6OkJhc2ljQ2xpZW50OjpzQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7Cit9CisKK2ludCBDYW1lcmFTZXJ2aWNlOjpnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZywgaW50KiBvcmllbnRhdGlvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IDA7CkBAIC03NzgsNiArODUyLDkgQEAKICAgICAgICAgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZC5zdHJpbmcoKSwgJmluZm8pOwogICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gLTE7CiAgICAgICAgICpmYWNpbmcgPSBpbmZvLmZhY2luZzsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICAqb3JpZW50YXRpb24gPSBpbmZvLm9yaWVudGF0aW9uOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIGRldmljZVZlcnNpb247CkBAIC04MDIsNzQgKzg3OSw0NyBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGludCBoYWxWZXJzaW9uLAotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBmZWF0dXJlSWQsICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCisgICAgICAgIGludCBzZXJ2aWNlUGlkLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCiAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgewogCi0gICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgewotICAgICAgICAvLyBEZWZhdWx0IHBhdGg6IEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGJ5IGNhbGxlciwgY3JlYXRlIENhbWVyYUNsaWVudAotICAgICAgICAvLyBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgotICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgewotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6Ci0gICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgIC8vIENhbWVyYTEgQVBJIHJvdXRlCi0gICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKLSAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQotICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgXCIlc1wiIEhBTCB2ZXJzaW9uICVkIGRvZXMgbm90IHN1cHBvcnQgY2FtZXJhMiBBUEkiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgfQorICAgIC8vIENyZWF0ZSBDYW1lcmFDbGllbnQgYmFzZWQgb24gZGV2aWNlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIEhBTC4KKyAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ERVBSRUNBVEVEX0hBTCwKKyAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSBkZXZpY2UgXCIlc1wiIEhBTCB2ZXJzaW9uICVkIG5vIGxvbmdlciBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM182OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM182OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM183OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgZmVhdHVyZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgc2Vuc29yT3JpZW50YXRpb24sIGNsaWVudFBpZCwgY2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOwogICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gdG1wID0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhRGV2aWNlQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsIGZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoYWJsZQogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gY2FtZXJhIGRldmljZSBIQUwgdmVyc2lvbjogJWQiLCBkZXZpY2VWZXJzaW9uKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLAogICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgaGFzIHVua25vd24gSEFMIHZlcnNpb24gJWQiLAogICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBIHBhcnRpY3VsYXIgSEFMIHZlcnNpb24gaXMgcmVxdWVzdGVkIGJ5IGNhbGxlci4gQ3JlYXRlIENhbWVyYUNsaWVudAotICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIEhBTCB2ZXJzaW9uLgotICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICYmCi0gICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KLSAgICAgICAgICAgIHNwPElDYW1lcmFDbGllbnQ+IHRtcCA9IHN0YXRpY19jYXN0PElDYW1lcmFDbGllbnQqPihjYW1lcmFDYi5nZXQoKSk7Ci0gICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBmZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCi0gICAgICAgICAgICAgICAgICAgICIgb3BlbmVkIGFzIEhBTCAleCBkZXZpY2UiLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCk7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIGRldmljZSBcIiVzXCIgKEhBTCB2ZXJzaW9uICVkKSBjYW5ub3QgYmUgb3BlbmVkIGFzIEhBTCB2ZXJzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGRldmljZVZlcnNpb24sIGhhbFZlcnNpb24pOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CkBAIC05NTcsOSArMTAwNyw5IEBACiAgICAgc3A8Q2xpZW50PiB0bXAgPSBudWxscHRyOwogICAgIGlmICghKHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCi0gICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIHVpZCwgVVNFX0NBTExJTkdfUElELAotICAgICAgICAgICAgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLCAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIGludGVybmFsUGFja2FnZU5hbWUsIHt9LCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvb21TY29yZU9mZnNldCovIDAsCisgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qLyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGE6ICVzIiwgX19GVU5DVElPTl9fLCByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwogICAgIH0KQEAgLTEyMzEsMTAgKzEyODEsMTIgQEAKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpmaW5pc2hDb25uZWN0TG9ja2VkKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBkZXNjKSB7CisgICAgICAgIGNvbnN0IENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHImIGRlc2MsIGludCBvb21TY29yZU9mZnNldCkgewogCiAgICAgLy8gTWFrZSBhIGRlc2NyaXB0b3IgZm9yIHRoZSBpbmNvbWluZyBjbGllbnQKLSAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcihjbGllbnQsIGRlc2MpOworICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9CisgICAgICAgICAgICBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcihjbGllbnQsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0KTsKICAgICBhdXRvIGV2aWN0ZWQgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5hZGRBbmRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKIAogICAgIGxvZ0Nvbm5lY3RlZChkZXNjLT5nZXRLZXkoKSwgc3RhdGljX2Nhc3Q8aW50PihkZXNjLT5nZXRPd25lcklkKCkpLApAQCAtMTI2NCw2ICsxMzE2LDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgaW50IG9vbVNjb3JlT2Zmc2V0LAogICAgICAgICAvKm91dCovCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKSB7CkBAIC0xMzE1LDcgKzEzNjgsOCBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG93bmVyUGlkcy5zaXplKCkgLSAxOyBpKyspIHsKICAgICAgICAgICAgIHBpZFRvUHJpb3JpdHlNYXAuZW1wbGFjZShvd25lclBpZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3BvbGljeTo6Q2xpZW50UHJpb3JpdHkocHJpb3JpdHlTY29yZXNbaV0sIHN0YXRlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpc1ZlbmRvckNsaWVudCB3b24ndCBnZXQgY29waWVkIG92ZXIqLyBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzVmVuZG9yQ2xpZW50IHdvbid0IGdldCBjb3BpZWQgb3ZlciovIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9vbVNjb3JlT2Zmc2V0IHdvbid0IGdldCBjb3BpZWQgb3ZlciovIDApKTsKICAgICAgICAgfQogICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci51cGRhdGVQcmlvcml0aWVzKHBpZFRvUHJpb3JpdHlNYXApOwogCkBAIC0xMzI4LDEzICsxMzgyLDE2IEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gTWFrZSBkZXNjcmlwdG9yIGZvciBpbmNvbWluZyBjbGllbnQKKyAgICAgICAgaW50MzJfdCBhY3R1YWxTY29yZSA9IHByaW9yaXR5U2NvcmVzW3ByaW9yaXR5U2NvcmVzLnNpemUoKSAtIDFdOworICAgICAgICBpbnQzMl90IGFjdHVhbFN0YXRlID0gc3RhdGVzW3N0YXRlcy5zaXplKCkgLSAxXTsKKworICAgICAgICAvLyBNYWtlIGRlc2NyaXB0b3IgZm9yIGluY29taW5nIGNsaWVudC4gV2Ugc3RvcmUgdGhlIG9vbVNjb3JlT2Zmc2V0CisgICAgICAgIC8vIHNpbmNlIHdlIG1pZ2h0IG5lZWQgaXQgbGF0ZXIgb24gbmV3IGhhbmRsZUV2aWN0aW9uc0xvY2tlZCBhbmQKKyAgICAgICAgLy8gUHJvY2Vzc0luZm9TZXJ2aWNlIHdvdWxkIG5vdCB0YWtlIHRoYXQgaW50byBhY2NvdW50LgogICAgICAgICBjbGllbnREZXNjcmlwdG9yID0gQ2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+e251bGxwdHJ9LCBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0ZS0+Z2V0Q29zdCgpKSwKLSAgICAgICAgICAgICAgICBzdGF0ZS0+Z2V0Q29uZmxpY3RpbmcoKSwKLSAgICAgICAgICAgICAgICBwcmlvcml0eVNjb3Jlc1twcmlvcml0eVNjb3Jlcy5zaXplKCkgLSAxXSwKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgc3RhdGVzW3N0YXRlcy5zaXplKCkgLSAxXSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmdldENvbmZsaWN0aW5nKCksIGFjdHVhbFNjb3JlLCBjbGllbnRQaWQsIGFjdHVhbFN0YXRlLAorICAgICAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0KTsKIAogICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5IGNsaWVudFByaW9yaXR5ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKTsKIApAQCAtMTQ2Nyw2ICsxNTI0LDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICBpbnQgY2xpZW50UGlkLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxJQ2FtZXJhPiogZGV2aWNlKSB7CiAKQEAgLTE0NzYsMzUgKzE1MzQsOCBAQAogICAgIFN0cmluZzggaWQgPSBjYW1lcmFJZEludFRvU3RyKGFwaTFDYW1lcmFJZCk7CiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKLSAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksCi0gICAgICAgICAgICBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7Ci0KLSAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCi0gICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAqZGV2aWNlID0gY2xpZW50OwotICAgIHJldHVybiByZXQ7Ci19Ci0KLVN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0TGVnYWN5KAotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPElDYW1lcmE+KiBkZXZpY2UpIHsKLQotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU3RyaW5nOCBpZCA9IGNhbWVyYUlkSW50VG9TdHIoYXBpMUNhbWVyYUlkKTsKLQotICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7Ci0gICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwotICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CisgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwge30sIGNsaWVudFVpZCwgY2xpZW50UGlkLCBBUElfMSwKKyAgICAgICAgICAgIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvb21TY29yZU9mZnNldCovIDAsIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKICAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLApAQCAtMTU0NSw4ICsxNTc2LDkgQEAKICAgICBpbnQgY1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kID0gU3lzdGVtQ2FtZXJhS2luZDo6UFVCTElDOwogICAgIGlmIChnZXRTeXN0ZW1DYW1lcmFLaW5kKGNhbWVyYUlkLCAmc3lzdGVtQ2FtZXJhS2luZCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBpZCAlcywgIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIC8vIFRoaXMgaXNuJ3QgYSBrbm93biBjYW1lcmEgSUQsIHNvIGl0J3Mgbm90IGEgc3lzdGVtIGNhbWVyYQorICAgICAgICBBTE9HVigiJXM6IFVua25vd24gY2FtZXJhIGlkICVzLCAiLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gKDEpIENhbWVyYXNlcnZlciB0cnlpbmcgdG8gY29ubmVjdCwgYWNjZXB0LgpAQCAtMTU3OCw4ICsxNjEwLDggQEAKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgaW50IGNsaWVudFVpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IG9vbVNjb3JlT2Zmc2V0LCBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+KiBkZXZpY2UpIHsKIApAQCAtMTU4OCwzMiArMTYyMCw2OSBAQAogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKICAgICBzcDxDYW1lcmFEZXZpY2VDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgU3RyaW5nMTYgY2xpZW50UGFja2FnZU5hbWVBZGogPSBjbGllbnRQYWNrYWdlTmFtZTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgPT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHZlbmRvckNsaWVudCA9CiAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJ2ZW5kb3IuY2xpZW50LnBpZDwlZD4iLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgY2xpZW50UGFja2FnZU5hbWVBZGogPSBTdHJpbmcxNih2ZW5kb3JDbGllbnQuY19zdHIoKSk7CiAgICAgfQorCisgICAgaWYgKG9vbVNjb3JlT2Zmc2V0IDwgMCkgeworICAgICAgICBTdHJpbmc4IG1zZyA9CisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCJDYW5ub3QgaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIGEgY2xpZW50ICVzIHBpZCAlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNhbWVyYSBpZCAlcyIsIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWVBZGopLnN0cmluZygpLCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gZW5mb3JjZSBzeXN0ZW0gY2FtZXJhIHBlcm1pc3Npb25zCisgICAgaWYgKG9vbVNjb3JlT2Zmc2V0ID4gMCAmJgorICAgICAgICAgICAgIWhhc1Blcm1pc3Npb25zRm9yU3lzdGVtQ2FtZXJhKGNhbGxpbmdQaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgIFN0cmluZzggbXNnID0KKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIkNhbm5vdCBjaGFuZ2UgdGhlIHByaW9yaXR5IG9mIGEgY2xpZW50ICVzIHBpZCAlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNhbWVyYSBpZCAlcyB3aXRob3V0IFNZU1RFTV9DQU1FUkEgcGVybWlzc2lvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZUFkaikuc3RyaW5nKCksIGNhbGxpbmdQaWQsIGlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKICAgICByZXQgPSBjb25uZWN0SGVscGVyPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAotICAgICAgICAgICAgLyphcGkxQ2FtZXJhSWQqLy0xLAotICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWVBZGosIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIC8qYXBpMUNhbWVyYUlkKi8tMSwgY2xpZW50UGFja2FnZU5hbWVBZGosIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCBvb21TY29yZU9mZnNldCwKKyAgICAgICAgICAgIHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWVBZGopLAotICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBjYWxsaW5nUGlkLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lQWRqKSwgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICAqZGV2aWNlID0gY2xpZW50OworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisKKyAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgY2FjaGVkIGxvZ3MgYW5kIHJlcG9zaXRpb24gdGhlCisgICAgLy8gZmlsZSBvZmZzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBmaWxlIHRvIGxvZyBuZXcgZGF0YS4KKyAgICAvLyBJZiBlaXRoZXIgdHJ1bmNhdGUgb3IgbHNlZWsgZmFpbHMsIGNsb3NlIHRoZSBwcmV2aW91cyBmaWxlIGFuZCBjcmVhdGUgYSBuZXcgb25lLgorICAgIGlmICgoZnRydW5jYXRlKG1NZW1GZCwgMCkgPT0gLTEpIHx8IChsc2VlayhtTWVtRmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB3aGlsZSB0cnVuY2F0aW5nIHRoZSBmaWxlOiAlcyIsIF9fRlVOQ1RJT05fXywgc0ZpbGVOYW1lKTsKKyAgICAgICAgLy8gQ2xvc2UgdGhlIHByZXZpb3VzIG1lbWZkLgorICAgICAgICBjbG9zZShtTWVtRmQpOworICAgICAgICAvLyBJZiBmYWlsdXJlIHRvIHdpcGUgdGhlIGRhdGEsIHRoZW4gY3JlYXRlIGEgbmV3IGZpbGUgYW5kCisgICAgICAgIC8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlIHRvIG1NZW1GZC4KKyAgICAgICAgbU1lbUZkID0gbWVtZmRfY3JlYXRlKHNGaWxlTmFtZSwgTUZEX0FMTE9XX1NFQUxJTkcpOworICAgICAgICBpZiAobU1lbUZkID09IC0xKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBmaWxlOiAlcyIsIF9fRlVOQ1RJT05fXywgc0ZpbGVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCiB0ZW1wbGF0ZTxjbGFzcyBDQUxMQkFDSywgY2xhc3MgQ0xJRU5UPgogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3RIZWxwZXIoY29uc3Qgc3A8Q0FMTEJBQ0s+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCisgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIGludCBvb21TY29yZU9mZnNldCwgaW50IHRhcmdldFNka1ZlcnNpb24sCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKIApAQCAtMTYyMSwxMiArMTY5MCwxNiBAQAogCiAgICAgaW50IG9yaWdpbmFsQ2xpZW50UGlkID0gMDsKIAotICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGNhbGwgKFBJRCAlZCBcIiVzXCIsIGNhbWVyYSBJRCAlcykgZm9yIEhBTCB2ZXJzaW9uICVzIGFuZCAiCisgICAgQUxPR0koIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgY2FsbCAoUElEICVkIFwiJXNcIiwgY2FtZXJhIElEICVzKSBhbmQgIgogICAgICAgICAgICAgIkNhbWVyYSBBUEkgdmVyc2lvbiAlZCIsIGNsaWVudFBpZCwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkLnN0cmluZygpLAotICAgICAgICAgICAgKGhhbFZlcnNpb24gPT0gLTEpID8gImRlZmF1bHQiIDogc3RkOjp0b19zdHJpbmcoaGFsVmVyc2lvbikuY19zdHIoKSwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZWZmZWN0aXZlQXBpTGV2ZWwpKTsKIAorICAgIG5zZWNzX3Qgb3BlblRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKwogICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKKyAgICBpbnQgZmFjaW5nID0gLTE7CisgICAgaW50IG9yaWVudGF0aW9uID0gMDsKKyAgICBib29sIGlzTmRrID0gKGNsaWVudFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKTsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gbG9jayA9CkBAIC0xNjYwLDcgKzE3MzMsNyBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG1wID0gbnVsbHB0cjsKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiBwYXJ0aWFsOwogICAgICAgICBpZiAoKGVyciA9IGhhbmRsZUV2aWN0aW9uc0xvY2tlZChjYW1lcmFJZCwgb3JpZ2luYWxDbGllbnRQaWQsIGVmZmVjdGl2ZUFwaUxldmVsLAotICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwgY2xpZW50TmFtZTgsIC8qb3V0Ki8mY2xpZW50VG1wLAorICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwgY2xpZW50TmFtZTgsIG9vbVNjb3JlT2Zmc2V0LCAvKm91dCovJmNsaWVudFRtcCwKICAgICAgICAgICAgICAgICAvKm91dCovJnBhcnRpYWwpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICBjYXNlIC1FTk9ERVY6CkBAIC0xNjkxLDggKzE3NjQsNyBAQAogICAgICAgICAvLyBnaXZlIGZsYXNobGlnaHQgYSBjaGFuY2UgdG8gY2xvc2UgZGV2aWNlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgIG1GbGFzaGxpZ2h0LT5wcmVwYXJlRGV2aWNlT3BlbihjYW1lcmFJZCk7CiAKLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsIC8qb3V0Ki8mZmFjaW5nKTsKKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGNhbWVyYUlkLCAvKm91dCovJmZhY2luZywgLypvdXQqLyZvcmllbnRhdGlvbik7CiAgICAgICAgIGlmIChmYWNpbmcgPT0gLTEpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgZGV2aWNlIFwiJXNcIiAgZmFjaW5nIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTE3MDAsMTAgKzE3NzIsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOworICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKKyAgICAgICAgICAgICAgICBtUGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkcywgY2FtZXJhSWQuc3RyaW5nKCksIHRhcmdldFNka1ZlcnNpb24pOwogICAgICAgICBpZighKHJldCA9IG1ha2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGZhY2luZywgb3JpZW50YXRpb24sCiAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLAotICAgICAgICAgICAgICAgIGhhbFZlcnNpb24sIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgICAgIGRldmljZVZlcnNpb24sIGVmZmVjdGl2ZUFwaUxldmVsLCBvdmVycmlkZUZvclBlcmZDbGFzcywKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQpAQCAtMTc2MCw2ICsxODM0LDM3IEBACiAgICAgICAgIC8vIFNldCByb3RhdGUtYW5kLWNyb3Agb3ZlcnJpZGUgYmVoYXZpb3IKICAgICAgICAgaWYgKG1PdmVycmlkZVJvdGF0ZUFuZENyb3BNb2RlICE9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9BVVRPKSB7CiAgICAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZShtT3ZlcnJpZGVSb3RhdGVBbmRDcm9wTW9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAoQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6aXNSb3RhdGVBbmRDcm9wT3ZlcnJpZGVOZWVkZWQoY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBmYWNpbmcpKSB7CisgICAgICAgICAgICBjbGllbnQtPnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZShBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1BfOTApOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IGNhbWVyYSBtdXRpbmcgYmVoYXZpb3IKKyAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkID0KKyAgICAgICAgICAgICAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZChtdWx0aXVzZXJfZ2V0X3VzZXJfaWQoY2xpZW50VWlkKSk7CisgICAgICAgIGlmIChjbGllbnQtPnN1cHBvcnRzQ2FtZXJhTXV0ZSgpKSB7CisgICAgICAgICAgICBjbGllbnQtPnNldENhbWVyYU11dGUoCisgICAgICAgICAgICAgICAgICAgIG1PdmVycmlkZUNhbWVyYU11dGVNb2RlIHx8IGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQpOworICAgICAgICB9IGVsc2UgaWYgKGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIG5vIGNhbWVyYSBtdXRlIHN1cHBvcnRlZCwgYnV0IHByaXZhY3kgaXMgb24hID0+IGRpc2Nvbm5lY3QKKyAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgbXV0ZSBub3Qgc3VwcG9ydGVkIGZvciBwYWNrYWdlOiAlcywgY2FtZXJhIGlkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKS5zdHJpbmcoKSwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0CisgICAgICAgICAgICAvLyByZXRhaW4gdGhlIGNvbmRpdGlvbiBibG9ja2luZyBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZworICAgICAgICAgICAgLy8gaW4gbVNlcnZpY2VMb2NrV3JhcHBlciBpZiBoZWxkLgorICAgICAgICAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRAorICAgICAgICAgICAgLy8gY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgICAgICAgICAvLyBOb3RlIEFwcE9wIHRvIHRyaWdnZXIgdGhlICJVbmJsb2NrIiBkaWFsb2cKKyAgICAgICAgICAgIGNsaWVudC0+bm90ZUFwcE9wKCk7CisgICAgICAgICAgICBjbGllbnQtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICAgICAgICAgIC8vIFJlYWNxdWlyZSBtU2VydmljZUxvY2sKKyAgICAgICAgICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CisKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhIFwiJXNcIiBkaXNhYmxlZCBkdWUgdG8gY2FtZXJhIG11dGUiLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2hpbVVwZGF0ZU9ubHkpIHsKQEAgLTE3NjksMTMgKzE4NzQsMjAgQEAKICAgICAgICAgICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGFkZCBjbGllbnQgdG8gYWN0aXZlIGNsaWVudHMgbGlzdAotICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwpOworICAgICAgICAgICAgZmluaXNoQ29ubmVjdExvY2tlZChjbGllbnQsIHBhcnRpYWwsIG9vbVNjb3JlT2Zmc2V0KTsKICAgICAgICAgfQorCisgICAgICAgIGNsaWVudC0+c2V0SW1hZ2VEdW1wTWFzayhtSW1hZ2VEdW1wTWFzayk7CiAgICAgfSAvLyBsb2NrIGlzIGRlc3Ryb3llZCwgYWxsb3cgZnVydGhlciBjb25uZWN0IGNhbGxzCiAKICAgICAvLyBJbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMKICAgICAvLyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKICAgICBkZXZpY2UgPSBjbGllbnQ7CisKKyAgICBpbnQzMl90IG9wZW5MYXRlbmN5TXMgPSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBvcGVuVGltZU5zKTsKKyAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dPcGVuKGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgZWZmZWN0aXZlQXBpTGV2ZWwsIGlzTmRrLCBvcGVuTGF0ZW5jeU1zKTsKKwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTE4MDksNyArMTkyMSw4IEBACiAgICAgICAgIGF1dG8gb2ZmbGluZUNsaWVudERlc2MgPSBDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcigKICAgICAgICAgICAgICAgICBrT2ZmbGluZURldmljZSArIG9ubGluZUNsaWVudERlc2MtPmdldEtleSgpLCBvZmZsaW5lQ2xpZW50LCAvKmNvc3QqLyAwLAogICAgICAgICAgICAgICAgIC8qY29uZmxpY3RpbmdLZXlzKi8gc3RkOjpzZXQ8U3RyaW5nOD4oKSwgb25saW5lUHJpb3JpdHkuZ2V0U2NvcmUoKSwKLSAgICAgICAgICAgICAgICBvbmxpbmVDbGllbnREZXNjLT5nZXRPd25lcklkKCksIG9ubGluZVByaW9yaXR5LmdldFN0YXRlKCkpOworICAgICAgICAgICAgICAgIG9ubGluZUNsaWVudERlc2MtPmdldE93bmVySWQoKSwgb25saW5lUHJpb3JpdHkuZ2V0U3RhdGUoKSwKKyAgICAgICAgICAgICAgICAvKm9tbVNjb3JlT2Zmc2V0Ki8gMCk7CiAKICAgICAgICAgLy8gQWxsb3cgb25seSBvbmUgb2ZmbGluZSBkZXZpY2UgcGVyIGNhbWVyYQogICAgICAgICBhdXRvIGluY29tcGF0aWJsZUNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRJbmNvbXBhdGlibGVDbGllbnRzKG9mZmxpbmVDbGllbnREZXNjKTsKQEAgLTE4NjQsNiArMTk3NywxMCBAQAogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkLnN0cmluZygpKTsKICAgICBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKIAorICAgIGlmIChzaG91bGRSZWplY3RTeXN0ZW1DYW1lcmFDb25uZWN0aW9uKGlkKSkgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVW5hYmxlIHRvIHNldCB0b3JjaCBtb2RlIgorICAgICAgICAgICAgICAgICIgZm9yIHN5c3RlbSBvbmx5IGRldmljZSAlczogIiwgaWQuc3RyaW5nKCkpOworICAgIH0KICAgICAvLyB2ZXJpZnkgaWQgaXMgdmFsaWQuCiAgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKICAgICBpZiAoc3RhdGUgPT0gbnVsbHB0cikgewpAQCAtMTk0NCw2ICsyMDYxLDcgQEAKICAgICAgICAgICAgICAgICBlcnJvckNvZGUgPSBFUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IobXNnLGVycm9yQ29kZSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBtc2cuc3RyaW5nKCkpOwogICAgIH0KIApAQCAtMjA2Niw3ICsyMTg0LDUwIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAotIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpnZXRDb25jdXJyZW50Q2FtZXJhSWRzKAorU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeURpc3BsYXlDb25maWd1cmF0aW9uQ2hhbmdlKCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY29uc3QgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKKyAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcworICAgIGlmIChjYWxsaW5nUGlkICE9IHNlbGZQaWQpIHsKKyAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aAorICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKKyAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYW1lcmFTZW5kU3lzdGVtRXZlbnRzUGVybWlzc2lvbikpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IG9yaWVudGF0aW9uIgorICAgICAgICAgICAgICAgICAgICAiIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIGNhbGxpbmdQaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IG9yaWVudGF0aW9uIgorICAgICAgICAgICAgICAgICAgICAiIGNoYW5nZXMgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIGNhbGxpbmdQaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworCisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgcm90YXRlLWFuZC1jcm9wIG92ZXJyaWRlIHZpYSBjbWQgaXMgYWN0aXZlCisgICAgaWYgKG1PdmVycmlkZVJvdGF0ZUFuZENyb3BNb2RlICE9IEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9BVVRPKSByZXR1cm4gU3RhdHVzOjpvaygpOworCisgICAgY29uc3QgYXV0byBjbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChhdXRvJiBjdXJyZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmlzUm90YXRlQW5kQ3JvcE92ZXJyaWRlTmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpLCBiYXNpY0NsaWVudC0+Z2V0Q2FtZXJhT3JpZW50YXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+Z2V0Q2FtZXJhRmFjaW5nKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5zZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUoQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QXzkwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0Q29uY3VycmVudENhbWVyYUlkcygKICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uY3VycmVudENhbWVyYUlkQ29tYmluYXRpb24+KiBjb25jdXJyZW50Q2FtZXJhSWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoIWNvbmN1cnJlbnRDYW1lcmFJZHMpIHsKQEAgLTIwNzYsNiArMjIzNyw3IEBACiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBIQUwgY291bGRuJ3QgYmUgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgc3Vic3lzdGVtIGlzIG5vdCBhdmFpbGFibGUiKSxFUlJPUl9ESVNDT05ORUNURUQpOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0RJU0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAiQ2FtZXJhIHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlIik7CiAgICAgfQpAQCAtMjExMSw3ICsyMjczLDcgQEAKIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmlzQ29uY3VycmVudFNlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiYgY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb25zLAotICAgICAgICAvKm91dCovYm9vbCogaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIC8qb3V0Ki9ib29sKiBpc1N1cHBvcnRlZCkgewogICAgIGlmICghaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBpc1N1cHBvcnRlZCBpcyBOVUxMIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiaXNTdXBwb3J0ZWQgaXMgTlVMTCIpOwpAQCAtMjEzNSw4ICsyMjk3LDExIEBACiAKICAgICBzdGF0dXNfdCByZXMgPQogICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWd1cmF0aW9ucywgaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlndXJhdGlvbnMsIG1QZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRTZGtWZXJzaW9uLCBpc1N1cHBvcnRlZCk7CiAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IoU3RyaW5nODo6Zm9ybWF0KCJVbmFibGUgdG8gcXVlcnkgc2Vzc2lvbiBjb25maWd1cmF0aW9uIHN1cHBvcnQiKSwKKyAgICAgICAgICAgIEVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gcXVlcnkgc2Vzc2lvbiBjb25maWd1cmF0aW9uICIKICAgICAgICAgICAgICAgICAic3VwcG9ydCAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQpAQCAtMjE0OSwxMCArMjMxNCwxNSBAQAogICAgIHJldHVybiBhZGRMaXN0ZW5lckhlbHBlcihsaXN0ZW5lciwgY2FtZXJhU3RhdHVzZXMpOwogfQogCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lclRlc3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcykgeworICAgIHJldHVybiBhZGRMaXN0ZW5lckhlbHBlcihsaXN0ZW5lciwgY2FtZXJhU3RhdHVzZXMsIGZhbHNlLCB0cnVlKTsKK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVySGVscGVyKGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAqY2FtZXJhU3RhdHVzZXMsCi0gICAgICAgIGJvb2wgaXNWZW5kb3JMaXN0ZW5lcikgeworICAgICAgICBib29sIGlzVmVuZG9yTGlzdGVuZXIsIGJvb2wgaXNQcm9jZXNzTG9jYWxUZXN0KSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwogCkBAIC0yMTgzLDEwICsyMzUzLDExIEBACiAgICAgICAgIHNwPFNlcnZpY2VMaXN0ZW5lcj4gc2VydmljZUxpc3RlbmVyID0KICAgICAgICAgICAgICAgICBuZXcgU2VydmljZUxpc3RlbmVyKHRoaXMsIGxpc3RlbmVyLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgaXNWZW5kb3JMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5DbG9zZUNhbGxiYWNrQWxsb3dlZCk7Ci0gICAgICAgIGF1dG8gcmV0ID0gc2VydmljZUxpc3RlbmVyLT5pbml0aWFsaXplKCk7CisgICAgICAgIGF1dG8gcmV0ID0gc2VydmljZUxpc3RlbmVyLT5pbml0aWFsaXplKGlzUHJvY2Vzc0xvY2FsVGVzdCk7CiAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzZXJ2aWNlIGxpc3RlbmVyOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICBsb2dTZXJ2aWNlRXJyb3IobXNnLEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwogICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKICAgICAgICAgfQpAQCAtMjIyMCw2ICsyMzkxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG91bGRTa2lwU3RhdHVzVXBkYXRlcyhkZXZpY2VLaW5kLCBpc1ZlbmRvckxpc3RlbmVyLCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkKTt9KSwgY2FtZXJhU3RhdHVzZXMtPmVuZCgpKTsKIAorICAgIC8vY2FtZXJhU3RhdHVzZXMgd2lsbCBoYXZlIG5vbi1lbGlnaWJsZSBjYW1lcmEgaWRzIHJlbW92ZWQuCisgICAgc3RkOjpzZXQ8U3RyaW5nMTY+IGlkc0Nob3NlbkZvckNhbGxiYWNrOworICAgIGZvciAoY29uc3QgYXV0byAmcyA6ICpjYW1lcmFTdGF0dXNlcykgeworICAgICAgICBpZHNDaG9zZW5Gb3JDYWxsYmFjay5pbnNlcnQoU3RyaW5nMTYocy5jYW1lcmFJZCkpOworICAgIH0KIAogICAgIC8qCiAgICAgICogSW1tZWRpYXRlbHkgc2lnbmFsIGN1cnJlbnQgdG9yY2ggc3RhdHVzIHRvIHRoaXMgbGlzdGVuZXIgb25seQpAQCAtMjIyOSw3ICsyNDA1LDExIEBACiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hTdGF0dXNNdXRleCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRvcmNoU3RhdHVzTWFwLnNpemUoKTsgaSsrICkgewogICAgICAgICAgICAgU3RyaW5nMTYgaWQgPSBTdHJpbmcxNihtVG9yY2hTdGF0dXNNYXAua2V5QXQoaSkuc3RyaW5nKCkpOwotICAgICAgICAgICAgbGlzdGVuZXItPm9uVG9yY2hTdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKG1Ub3JjaFN0YXR1c01hcC52YWx1ZUF0KGkpKSwgaWQpOworICAgICAgICAgICAgLy8gVGhlIGNhbWVyYSBpZCBpcyB2aXNpYmxlIHRvIHRoZSBjbGllbnQuIEZpbmUgdG8gc2VuZCB0b3JjaAorICAgICAgICAgICAgLy8gY2FsbGJhY2suCisgICAgICAgICAgICBpZiAoaWRzQ2hvc2VuRm9yQ2FsbGJhY2suZmluZChpZCkgIT0gaWRzQ2hvc2VuRm9yQ2FsbGJhY2suZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2UobVRvcmNoU3RhdHVzTWFwLnZhbHVlQXQoaSkpLCBpZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIzMzAsNiArMjUxMCw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzY6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzc6CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwpAQCAtMjM2Miw2ICsyNTQzLDQyIEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmluamVjdENhbWVyYSgKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmcxNiYgaW50ZXJuYWxDYW1JZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGV4dGVybmFsQ2FtSWQsCisgICAgICAgIGNvbnN0IHNwPElDYW1lcmFJbmplY3Rpb25DYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4qIGNhbWVyYUluamVjdGlvblNlc3Npb24pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYW1lcmFJbmplY3RFeHRlcm5hbENhbWVyYVBlcm1pc3Npb24pKSB7CisgICAgICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBpbmplY3QgY2FtZXJhIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm1pc3Npb24gRGVuaWFsOiBubyBwZXJtaXNzaW9uIHRvIGluamVjdCBjYW1lcmEiKTsKKyAgICB9CisKKyAgICBBTE9HVigKKyAgICAgICAgIiVzOiBQYWNrYWdlIG5hbWUgPSAlcywgSW50ZXJuYWwgY2FtZXJhIElEID0gJXMsIEV4dGVybmFsIGNhbWVyYSBJRCA9ICIKKyAgICAgICAgIiVzIiwKKyAgICAgICAgX19GVU5DVElPTl9fLCBTdHJpbmc4KHBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKKyAgICAgICAgU3RyaW5nOChpbnRlcm5hbENhbUlkKS5zdHJpbmcoKSwgU3RyaW5nOChleHRlcm5hbENhbUlkKS5zdHJpbmcoKSk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIGluamVjdGlvbiBjYW1lcmEgZnVuY3Rpb24uCisgICAgLy8gcmV0ID0gaW50ZXJuYWxJbmplY3RDYW1lcmEoLi4uKTsKKyAgICAvLyBpZighcmV0LmlzT2soKSkgeworICAgIC8vICAgICBtSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXItPm5vdGlmeUluamVjdGlvbkVycm9yKC4uLik7CisgICAgLy8gICAgIHJldHVybiByZXQ7CisgICAgLy8gfQorCisgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5hZGRMaXN0ZW5lcihjYWxsYmFjayk7CisgICAgKmNhbWVyYUluamVjdGlvblNlc3Npb24gPSBuZXcgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbih0aGlzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKIHZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQnlDbGllbnQoY29uc3QgQmFzaWNDbGllbnQqIGNsaWVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKQEAgLTI1MjUsNyArMjc0MiwxNSBAQAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dFdmVudChjb25zdCBjaGFyKiBldmVudCkgewogICAgIFN0cmluZzggY3VyVGltZSA9IGdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvZ0xvY2spOwotICAgIG1FdmVudExvZy5hZGQoU3RyaW5nODo6Zm9ybWF0KCIlcyA6ICVzIiwgY3VyVGltZS5zdHJpbmcoKSwgZXZlbnQpKTsKKyAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiJXMgOiAlcyIsIGN1clRpbWUuc3RyaW5nKCksIGV2ZW50KTsKKyAgICAvLyBGb3Igc2VydmljZSBlcnJvciBldmVudHMsIHByaW50IHRoZSBtc2cgb25seSBvbmNlLgorICAgIGlmKCFtc2cuY29udGFpbnMoIlNFUlZJQ0UgRVJST1IiKSkgeworICAgICAgICBtRXZlbnRMb2cuYWRkKG1zZyk7CisgICAgfSBlbHNlIGlmKHNTZXJ2aWNlRXJyb3JFdmVudFNldC5maW5kKG1zZykgPT0gc1NlcnZpY2VFcnJvckV2ZW50U2V0LmVuZCgpKSB7CisgICAgICAgIC8vIEVycm9yIGV2ZW50IG5vdCBhZGRlZCB0byB0aGUgZHVtcHN5cyBsb2cgYmVmb3JlCisgICAgICAgIG1FdmVudExvZy5hZGQobXNnKTsKKyAgICAgICAgc1NlcnZpY2VFcnJvckV2ZW50U2V0Lmluc2VydChtc2cpOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dEaXNjb25uZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCkBAIC0yNzAwLDYgKzI5MjUsMTEgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTE9HMSgicGxheVNvdW5kKCVkKSIsIGtpbmQpOworICAgIGlmIChraW5kIDwgMCB8fCBraW5kID49IE5VTV9TT1VORFMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHNvdW5kIGlkIHJlcXVlc3RlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGtpbmQpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNvdW5kTG9jayk7CiAgICAgbG9hZFNvdW5kTG9ja2VkKGtpbmQpOwogICAgIHNwPE1lZGlhUGxheWVyPiBwbGF5ZXIgPSBtU291bmRQbGF5ZXJba2luZF07CkBAIC0yNzE0LDE1ICsyOTQ0LDE1IEBACiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAotICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLCBpbnQgc2Vuc29yT3JpZW50YXRpb24sCiAgICAgICAgIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpIDoKICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDbGllbnQpLAogICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWRTdHIsIGNhbWVyYUZhY2luZywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZFN0ciwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKQEAgLTI3NTEsMjkgKzI5ODEsMjQgQEAKIAogQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OkJhc2ljQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKToKLSAgICAgICAgbUNhbWVyYUlkU3RyKGNhbWVyYUlkU3RyKSwgbUNhbWVyYUZhY2luZyhjYW1lcmFGYWNpbmcpLAotICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkKGZhbHNlKSwKKyAgICAgICAgbUNhbWVyYUlkU3RyKGNhbWVyYUlkU3RyKSwgbUNhbWVyYUZhY2luZyhjYW1lcmFGYWNpbmcpLCBtT3JpZW50YXRpb24oc2Vuc29yT3JpZW50YXRpb24pLAorICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLCBtQ2xpZW50RmVhdHVyZUlkKGNsaWVudEZlYXR1cmVJZCksCiAgICAgICAgIG1DbGllbnRQaWQoY2xpZW50UGlkKSwgbUNsaWVudFVpZChjbGllbnRVaWQpLAogICAgICAgICBtU2VydmljZVBpZChzZXJ2aWNlUGlkKSwKICAgICAgICAgbURpc2Nvbm5lY3RlZChmYWxzZSksIG1VaWRJc1RydXN0ZWQoZmFsc2UpLAogICAgICAgICBtQXVkaW9SZXN0cmljdGlvbihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OkFVRElPX1JFU1RSSUNUSU9OX05PTkUpLAotICAgICAgICBtUmVtb3RlQmluZGVyKHJlbW90ZUNhbGxiYWNrKQorICAgICAgICBtUmVtb3RlQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKKyAgICAgICAgbU9wc0FjdGl2ZShmYWxzZSksCisgICAgICAgIG1PcHNTdHJlYW1pbmcoZmFsc2UpCiB7Ci0gICAgaWYgKGNsaWVudEZlYXR1cmVJZCkgewotICAgICAgICBtQ2xpZW50RmVhdHVyZUlkID0gc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PihuZXcgU3RyaW5nMTYoKmNsaWVudEZlYXR1cmVJZCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnRGZWF0dXJlSWQgPSBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCk7Ci0gICAgfQotCiAgICAgaWYgKHNDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKICAgICAgICAgc0NhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlOwogICAgIH0KLSAgICBtT3BzQWN0aXZlID0gZmFsc2U7Ci0gICAgbURlc3RydWN0aW9uU3RhcnRlZCA9IGZhbHNlOwogCiAgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KICAgICAvLyBGb3IgZXhhbXBsZSwgTkRLIGNhbWVyYSBBUEkuCkBAIC0yODU4LDYgKzMwODMsMTMgQEAKICAgICByZXR1cm4gbUNsaWVudFBhY2thZ2VOYW1lOwogfQogCitpbnQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENhbWVyYUZhY2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNhbWVyYUZhY2luZzsKK30KKworaW50IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpnZXRDYW1lcmFPcmllbnRhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbU9yaWVudGF0aW9uOworfQogCiBpbnQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmdldENsaWVudFBpZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbUNsaWVudFBpZDsKQEAgLTI5MDEsNiArMzEzMywyOSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmhhbmRsZUFwcE9wTW9kZShpbnQzMl90IG1vZGUpIHsKKyAgICBpZiAobW9kZSA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKKyAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfSBlbHNlIGlmICghbVVpZElzVHJ1c3RlZCAmJiBtb2RlID09IEFwcE9wc01hbmFnZXI6Ok1PREVfSUdOT1JFRCkgeworICAgICAgICAvLyBJZiB0aGUgY2FsbGluZyBVaWQgaXMgdHJ1c3RlZCAoYSBuYXRpdmUgc2VydmljZSksIHRoZSBBcHBPcHNNYW5hZ2VyIGNvdWxkCisgICAgICAgIC8vIHJldHVybiBNT0RFX0lHTk9SRUQuIERvIG5vdCB0cmVhdCBzdWNoIGNhc2UgYXMgZXJyb3IuCisgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUgPSBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+aXNVaWRBY3RpdmUobUNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICBib29sIGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQgPQorICAgICAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5tU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNDYW1lcmFQcml2YWN5RW5hYmxlZCgKKyAgICAgICAgICAgICAgICAgICAgbXVsdGl1c2VyX2dldF91c2VyX2lkKG1DbGllbnRVaWQpKTsKKyAgICAgICAgaWYgKCFpc1VpZEFjdGl2ZSB8fCAhaXNDYW1lcmFQcml2YWN5RW5hYmxlZCkgeworICAgICAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgc2FtZSBlcnJvciBhcyBmb3IgZGV2aWNlIHBvbGljeSBtYW5hZ2VyIHJlamVjdGlvbgorICAgICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6c3RhcnRDYW1lcmFPcHMoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtMjkxMSwyNiArMzE2NiwxNiBAQAogICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CiAgICAgICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgIG1PcHNDYWxsYmFjayA9IG5ldyBPcHNDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgaW50MzJfdCByZXM7CiAgICAgICAgIG1BcHBPcHNNYW5hZ2VyLT5zdGFydFdhdGNoaW5nTW9kZShBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCiAgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lLCBtT3BzQ2FsbGJhY2spOwotICAgICAgICByZXMgPSBtQXBwT3BzTWFuYWdlci0+c3RhcnRPcE5vVGhyb3coQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgLypzdGFydElmTW9kZURlZmF1bHQqLyBmYWxzZSwgbUNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBTdHJpbmcxNigic3RhcnQgY2FtZXJhICIpICsgU3RyaW5nMTYobUNhbWVyYUlkU3RyKSk7CiAKLSAgICAgICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgJXM6IEFjY2VzcyBmb3IgXCIlc1wiIGhhcyBiZWVuIHJldm9rZWQiLAotICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB0aGUgY2FsbGluZyBVaWQgaXMgdHJ1c3RlZCAoYSBuYXRpdmUgc2VydmljZSksIHRoZSBBcHBPcHNNYW5hZ2VyIGNvdWxkCi0gICAgICAgIC8vIHJldHVybiBNT0RFX0lHTk9SRUQuIERvIG5vdCB0cmVhdCBzdWNoIGNhc2UgYXMgZXJyb3IuCi0gICAgICAgIGlmICghbVVpZElzVHJ1c3RlZCAmJiByZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwotICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzYW1lIGVycm9yIGFzIGZvciBkZXZpY2UgcG9saWN5IG1hbmFnZXIgcmVqZWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgLy8gSnVzdCBjaGVjayBmb3IgY2FtZXJhIGFjY2Nlc3MgaGVyZSBvbiBvcGVuIC0gZGVsYXkgc3RhcnRPcCB1bnRpbAorICAgICAgICAvLyBjYW1lcmEgZnJhbWVzIHN0YXJ0IHN0cmVhbWluZyBpbiBzdGFydENhbWVyYVN0cmVhbWluZ09wcworICAgICAgICBpbnQzMl90IG1vZGUgPSBtQXBwT3BzTWFuYWdlci0+Y2hlY2tPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCisgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gaGFuZGxlQXBwT3BNb2RlKG1vZGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yOTM5LDE0ICszMTg0LDYgQEAKICAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIGZyb20gUFJFU0VOVCAtPiBOT1RfQVZBSUxBQkxFCiAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6Tk9UX0FWQUlMQUJMRSwgbUNhbWVyYUlkU3RyKTsKIAotICAgIGludCBhcGlMZXZlbCA9IGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzE7Ci0gICAgaWYgKGNhbkNhc3RUb0FwaUNsaWVudChBUElfMikpIHsKLSAgICAgICAgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8yOwotICAgIH0KLSAgICAvLyBUcmFuc2l0aW9uIGRldmljZSBzdGF0ZSB0byBPUEVOCi0gICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoSUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX09QRU4sCi0gICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwgYXBpTGV2ZWwpOwotCiAgICAgc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPnJlZ2lzdGVyTW9uaXRvclVpZChtQ2xpZW50VWlkKTsKIAogICAgIC8vIE5vdGlmeSBsaXN0ZW5lcnMgb2YgY2FtZXJhIG9wZW4vY2xvc2Ugc3RhdHVzCkBAIC0yOTU1LDE3ICszMTkyLDkwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6c3RhcnRDYW1lcmFTdHJlYW1pbmdPcHMoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGlmICghbU9wc0FjdGl2ZSkgeworICAgICAgICBBTE9HRSgiJXM6IENhbGxpbmcgc3RyZWFtaW5nIHN0YXJ0IHdoZW4gbm90IHlldCBhY3RpdmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtT3BzU3RyZWFtaW5nKSB7CisgICAgICAgIEFMT0dWKCIlczogU3RyZWFtaW5nIGFscmVhZHkgYWN0aXZlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFN0YXJ0IGNhbWVyYSBzdHJlYW1pbmcgb3BzLCBwYWNrYWdlIG5hbWUgPSAlcywgY2xpZW50IFVJRCA9ICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBtQ2xpZW50VWlkKTsKKworICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIGludDMyX3QgbW9kZSA9IG1BcHBPcHNNYW5hZ2VyLT5zdGFydE9wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCisgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlLCBtQ2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgIFN0cmluZzE2KCJzdGFydCBjYW1lcmEgIikgKyBTdHJpbmcxNihtQ2FtZXJhSWRTdHIpKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gaGFuZGxlQXBwT3BNb2RlKG1vZGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgbU9wc1N0cmVhbWluZyA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Ojpub3RlQXBwT3AoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIEFMT0dWKCIlczogU3RhcnQgY2FtZXJhIG5vdGVBcHBPcCwgcGFja2FnZSBuYW1lID0gJXMsIGNsaWVudCBVSUQgPSAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgbUNsaWVudFVpZCk7CisKKyAgICAvLyBub3RlQXBwT3AgaXMgb25seSB1c2VkIGZvciB3aGVuIGNhbWVyYSBtdXRlIGlzIG5vdCBzdXBwb3J0ZWQsIGluIG9yZGVyCisgICAgLy8gdG8gdHJpZ2dlciB0aGUgc2Vuc29yIHByaXZhY3kgIlVuYmxvY2siIGRpYWxvZworICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIGludDMyX3QgbW9kZSA9IG1BcHBPcHNNYW5hZ2VyLT5ub3RlT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAorICAgICAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgbUNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigic3RhcnQgY2FtZXJhICIpICsgU3RyaW5nMTYobUNhbWVyYUlkU3RyKSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGhhbmRsZUFwcE9wTW9kZShtb2RlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmZpbmlzaENhbWVyYVN0cmVhbWluZ09wcygpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKCFtT3BzQWN0aXZlKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FsbGluZyBzdHJlYW1pbmcgc3RhcnQgd2hlbiBub3QgeWV0IGFjdGl2ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKCFtT3BzU3RyZWFtaW5nKSB7CisgICAgICAgIEFMT0dWKCIlczogU3RyZWFtaW5nIG5vdCBhY3RpdmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLT5maW5pc2hPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCisgICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lLCBtQ2xpZW50RmVhdHVyZUlkKTsKKyAgICAgICAgbU9wc1N0cmVhbWluZyA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmZpbmlzaENhbWVyYU9wcygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCisgICAgaWYgKG1PcHNTdHJlYW1pbmcpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3ZlIG5vdGlmaWVkIGV2ZXJ5b25lIGFib3V0IGNhbWVyYSBzdG9wcGluZworICAgICAgICBmaW5pc2hDYW1lcmFTdHJlYW1pbmdPcHMoKTsKKyAgICB9CisKICAgICAvLyBDaGVjayBpZiBzdGFydENhbWVyYU9wcyBzdWNjZWVkZWQsIGFuZCBpZiBzbywgZmluaXNoIHRoZSBjYW1lcmEgb3AKICAgICBpZiAobU9wc0FjdGl2ZSkgewotICAgICAgICAvLyBOb3RpZnkgYXBwIG9wcyB0aGF0IHRoZSBjYW1lcmEgaXMgYXZhaWxhYmxlIGFnYWluCi0gICAgICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBtQXBwT3BzTWFuYWdlci0+ZmluaXNoT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUsIG1DbGllbnRGZWF0dXJlSWQpOwotICAgICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1PcHNBY3RpdmUgPSBmYWxzZTsKKwogICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGRpc2Nvbm5lY3RzLiBUaGlzIHNob3VsZAogICAgICAgICAvLyByZWxlYXNlIHRoZSBjYW1lcmEsIGJ1dCBhY3R1YWxseSBvbmx5IGlmIGl0IHdhcyBpbiBhIHByb3BlcgogICAgICAgICAvLyBmdW5jdGlvbmFsIHN0YXRlLCBpLmUuIHdpdGggc3RhdHVzIE5PVF9BVkFJTEFCTEUKQEAgLTI5NzUsMTQgKzMyODUsNiBAQAogICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIHRoZSByZWplY3RlZCBzdGF0ZXMKICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhTdGF0dXNJbnRlcm5hbDo6UFJFU0VOVCwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIHJlamVjdGVkKTsKLQotICAgICAgICBpbnQgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xOwotICAgICAgICBpZiAoY2FuQ2FzdFRvQXBpQ2xpZW50KEFQSV8yKSkgewotICAgICAgICAgICAgYXBpTGV2ZWwgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8yOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRyYW5zaXRpb24gZGV2aWNlIHN0YXRlIHRvIENMT1NFRAotICAgICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfQ0xPU0VELAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKICAgICBpZiAobU9wc0NhbGxiYWNrICE9IG51bGxwdHIgJiYgbUFwcE9wc01hbmFnZXIgIT0gbnVsbHB0cikgewpAQCAtMzAxOCwxMCArMzMyMCwzMSBAQAogICAgICAgICAgICAgcmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfRVJST1JFRCA/ICJFUlJPUkVEIiA6CiAgICAgICAgICAgICAiVU5LTk9XTiIpOwogCi0gICAgaWYgKHJlcyAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfRVJST1JFRCkgewogICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiByZXZva2VkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAogICAgICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwogICAgICAgICBibG9jaygpOworICAgIH0gZWxzZSBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfSUdOT1JFRCkgeworICAgICAgICBib29sIGlzVWlkQWN0aXZlID0gc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKG1DbGllbnRVaWQsIG1DbGllbnRQYWNrYWdlTmFtZSk7CisgICAgICAgIGJvb2wgaXNDYW1lcmFQcml2YWN5RW5hYmxlZCA9CisgICAgICAgICAgICAgICAgc0NhbWVyYVNlcnZpY2UtPm1TZW5zb3JQcml2YWN5UG9saWN5LT5pc0NhbWVyYVByaXZhY3lFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGl1c2VyX2dldF91c2VyX2lkKG1DbGllbnRVaWQpKTsKKyAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCwgaXNVaWRUcnVzdGVkICVkLCBpc1VpZEFjdGl2ZSAlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgbVVpZElzVHJ1c3RlZCwgaXNVaWRBY3RpdmUpOworICAgICAgICAvLyBJZiB0aGUgY2FsbGluZyBVaWQgaXMgdHJ1c3RlZCAoYSBuYXRpdmUgc2VydmljZSksIG9yIHRoZSBjbGllbnQgVWlkIGlzIGFjdGl2ZSAoV0FSIGZvcgorICAgICAgICAvLyBiLzE3NTMyMDY2NiksIHRoZSBBcHBPcHNNYW5hZ2VyIGNvdWxkIHJldHVybiBNT0RFX0lHTk9SRUQuIERvIG5vdCB0cmVhdCBzdWNoIGNhc2VzIGFzCisgICAgICAgIC8vIGVycm9yLgorICAgICAgICBpZiAoIW1VaWRJc1RydXN0ZWQpIHsKKyAgICAgICAgICAgIGlmIChpc1VpZEFjdGl2ZSAmJiBpc0NhbWVyYVByaXZhY3lFbmFibGVkICYmIHN1cHBvcnRzQ2FtZXJhTXV0ZSgpKSB7CisgICAgICAgICAgICAgICAgc2V0Q2FtZXJhTXV0ZSh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVWlkQWN0aXZlCisgICAgICAgICAgICAgICAgfHwgKGlzQ2FtZXJhUHJpdmFjeUVuYWJsZWQgJiYgIXN1cHBvcnRzQ2FtZXJhTXV0ZSgpKSkgeworICAgICAgICAgICAgICAgIGJsb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgc2V0Q2FtZXJhTXV0ZShzQ2FtZXJhU2VydmljZS0+bU92ZXJyaWRlQ2FtZXJhTXV0ZU1vZGUpOwogICAgIH0KIH0KIApAQCAtMzI5NCw2ICszNjE3LDcgQEAKICAgICBpZiAobVJlZ2lzdGVyZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBoYXNDYW1lcmFQcml2YWN5RmVhdHVyZSgpOyAvLyBDYWxsZWQgc28gdGhlIHJlc3VsdCBpcyBjYWNoZWQKICAgICBtU3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKICAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBtU3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKICAgICBzdGF0dXNfdCByZXMgPSBtU3BtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtMzMxNiw2ICszNjQwLDE0IEBACiAgICAgcmV0dXJuIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc0NhbWVyYVByaXZhY3lFbmFibGVkKHVzZXJpZF90IHVzZXJJZCkgeworICAgIGlmICghaGFzQ2FtZXJhUHJpdmFjeUZlYXR1cmUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtU3BtLmlzSW5kaXZpZHVhbFNlbnNvclByaXZhY3lFbmFibGVkKHVzZXJJZCwKKyAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX0NBTUVSQSk7Cit9CisKIGJpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKQEAgLTMzMzcsNiArMzY2OSwxMCBAQAogICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aGFzQ2FtZXJhUHJpdmFjeUZlYXR1cmUoKSB7CisgICAgcmV0dXJuIG1TcG0uc3VwcG9ydHNTZW5zb3JUb2dnbGUoU2Vuc29yUHJpdmFjeU1hbmFnZXI6OklORElWSURVQUxfU0VOU09SX0NBTUVSQSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM0ODUsMjEgKzM4MjEsODMgQEAKIENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgaW50MzJfdCBjb3N0LAogICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsCi0gICAgICAgIGludDMyX3Qgc3RhdGUpIHsKKyAgICAgICAgaW50MzJfdCBzdGF0ZSwgaW50MzJfdCBvb21TY29yZU9mZnNldCkgewogCiAgICAgYm9vbCBpc1ZlbmRvckNsaWVudCA9IGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpID09IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUjsKICAgICBpbnQzMl90IHNjb3JlX2FkaiA9IGlzVmVuZG9yQ2xpZW50ID8ga1ZlbmRvckNsaWVudFNjb3JlIDogc2NvcmU7CiAgICAgaW50MzJfdCBzdGF0ZV9hZGogPSBpc1ZlbmRvckNsaWVudCA/IGtWZW5kb3JDbGllbnRTdGF0ZTogc3RhdGU7CiAKICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4oCi0gICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlX2Fkaiwgb3duZXJJZCwgc3RhdGVfYWRqLCBpc1ZlbmRvckNsaWVudCk7CisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlX2Fkaiwgb3duZXJJZCwgc3RhdGVfYWRqLCBpc1ZlbmRvckNsaWVudCwKKyAgICAgICAgICAgIG9vbVNjb3JlT2Zmc2V0KTsKIH0KIAogQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjptYWtlQ2xpZW50RGVzY3JpcHRvcigKLSAgICAgICAgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCkgeworICAgICAgICBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLCBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsLAorICAgICAgICBpbnQzMl90IG9vbVNjb3JlT2Zmc2V0KSB7CiAgICAgcmV0dXJuIG1ha2VDbGllbnREZXNjcmlwdG9yKHBhcnRpYWwtPmdldEtleSgpLCB2YWx1ZSwgcGFydGlhbC0+Z2V0Q29zdCgpLAogICAgICAgICAgICAgcGFydGlhbC0+Z2V0Q29uZmxpY3RpbmcoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKS5nZXRTY29yZSgpLAotICAgICAgICAgICAgcGFydGlhbC0+Z2V0T3duZXJJZCgpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFN0YXRlKCkpOworICAgICAgICAgICAgcGFydGlhbC0+Z2V0T3duZXJJZCgpLCBwYXJ0aWFsLT5nZXRQcmlvcml0eSgpLmdldFN0YXRlKCksIG9vbVNjb3JlT2Zmc2V0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICAgICAgICAgICAgICBJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkluamVjdGlvblN0YXR1c0xpc3RlbmVyOjphZGRMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3A8SUNhbWVyYUluamVjdGlvbkNhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICBpZiAobUNhbWVyYUluamVjdGlvbkNhbGxiYWNrKSByZXR1cm47CisgICAgc3RhdHVzX3QgcmVzID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2FsbGJhY2spLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjayA9IGNhbGxiYWNrOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjo6cmVtb3ZlTGlzdGVuZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxpc3RlbmVyTG9jayk7CisgICAgaWYgKG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjogbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrID09IG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2spLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjayA9IG51bGxwdHI7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6SW5qZWN0aW9uU3RhdHVzTGlzdGVuZXI6Om5vdGlmeUluamVjdGlvbkVycm9yKAorICAgICAgICBpbnQgZXJyb3JDb2RlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxpc3RlbmVyTG9jayk7CisgICAgaWYgKG1DYW1lcmFJbmplY3Rpb25DYWxsYmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCJJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjogbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrID09IG51bGxwdHIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2stPm9uSW5qZWN0aW9uRXJyb3IoZXJyb3JDb2RlKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcjo6YmluZGVyRGllZCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTGlzdGVuZXJMb2NrKTsKKyAgICBBTE9HVigiSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXI6IElDYW1lcmFJbmplY3Rpb25DYWxsYmFjayBoYXMgZGllZCIpOworICAgIGF1dG8gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcmVudC0+c3RvcEluamVjdGlvbkltcGwoKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFJbmplY3Rpb25TZXNzaW9uOjpzdG9wSW5qZWN0aW9uKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25TZXNzaW9uTG9jayk7CisgICAgYXV0byBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYUluamVjdGlvblNlc3Npb246IFBhcmVudCBpcyBnb25lIik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoSUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOjpFUlJPUl9JTkpFQ1RJT05fU0VSVklDRSwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIHNlcnZpY2UgZW5jb3VudGVyZWQgZXJyb3IiKTsKKyAgICB9CisgICAgcGFyZW50LT5zdG9wSW5qZWN0aW9uSW1wbCgpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzUyMCw2ICszOTE4LDI4IEBACiAgICAgcmV0dXJuIGxvY2tlZDsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpjYWNoZUR1bXAoKSB7CisgICAgaWYgKG1NZW1GZCAhPSAtMSkgeworICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgICAgIEFUUkFDRV9DQUxMKCk7CisgICAgICAgIC8vIEFjcXVpcmluZyBzZXJ2aWNlIGxvY2sgaGVyZSB3aWxsIGF2b2lkIHRoZSBkZWFkbG9jayBzaW5jZQorICAgICAgICAvLyBjYWNoZUR1bXAgd2lsbCBub3QgYmUgY2FsbGVkIGR1cmluZyB0aGUgc2Vjb25kIGRpc2Nvbm5lY3QuCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUNhbWVyYVN0YXRlc0xvY2spOworICAgICAgICAvLyBTdGFydCBjb2xsZWN0aW5nIHRoZSBpbmZvIGZvciBvcGVuIHNlc3Npb25zIGFuZCBzdG9yZSBpdCBpbiB0ZW1wIGZpbGUuCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gc3RhdGUuZmlyc3Q7CisgICAgICAgICAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKGNsaWVudERlc2NyaXB0b3IgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGRwcmludGYobU1lbUZkLCAiPT0gQ2FtZXJhIGRldmljZSAlcyBkeW5hbWljIGluZm86ID09XG4iLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgLy8gTG9nIHRoZSBjdXJyZW50IG9wZW4gc2Vzc2lvbiBpbmZvIGJlZm9yZSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLgorICAgICAgICAgICAgICAgIGR1bXBPcGVuU2Vzc2lvbkNsaWVudExvZ3MobU1lbUZkLCBhcmdzLCBjYW1lcmFJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIApAQCAtMzU4NiwyMSArNDAwNiwxMCBAQAogCiAgICAgICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChjYW1lcmFJZCk7CiAgICAgICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgIERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgQ2xpZW50IHByaW9yaXR5IHNjb3JlOiAlZCBzdGF0ZTogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudERlc2NyaXB0b3ItPmdldFByaW9yaXR5KCkuZ2V0U2NvcmUoKSwKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKS5nZXRTdGF0ZSgpKTsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgQ2xpZW50IFBJRDogJWRcbiIsIGNsaWVudERlc2NyaXB0b3ItPmdldE93bmVySWQoKSk7Ci0KLSAgICAgICAgICAgIGF1dG8gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGRwcmludGYoZmQsICIgICAgQ2xpZW50IHBhY2thZ2U6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudC0+Z2V0UGFja2FnZU5hbWUoKSkuc3RyaW5nKCkpOwotCi0gICAgICAgICAgICBjbGllbnQtPmR1bXBDbGllbnQoZmQsIGFyZ3MpOworICAgICAgICAgICAgLy8gbG9nIHRoZSBjdXJyZW50IG9wZW4gc2Vzc2lvbiBpbmZvCisgICAgICAgICAgICBkdW1wT3BlblNlc3Npb25DbGllbnRMb2dzKGZkLCBhcmdzLCBjYW1lcmFJZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBEZXZpY2UgJXMgaXMgY2xvc2VkLCBubyBjbGllbnQgaW5zdGFuY2VcbiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIGR1bXBDbG9zZWRTZXNzaW9uQ2xpZW50TG9ncyhmZCwgY2FtZXJhSWQpOwogICAgICAgICB9CiAKICAgICB9CkBAIC0zNjU3LDkgKzQwNjYsNTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKworICAgIGJvb2wgc2VydmljZUxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKworICAgIC8vIER1bXAgaW5mbyBmcm9tIHByZXZpb3VzIG9wZW4gc2Vzc2lvbnMuCisgICAgLy8gUmVwb3NpdGlvbiB0aGUgb2Zmc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgZmlsZSBiZWZvcmUgcmVhZGluZworCisgICAgaWYgKChtTWVtRmQgPj0gMCkgJiYgKGxzZWVrKG1NZW1GZCwgMCwgU0VFS19TRVQpICE9IC0xKSkgeworICAgICAgICBkcHJpbnRmKGZkLCAiXG4qKioqKioqKioqRHVtcHN5cyBmcm9tIHByZXZpb3VzIG9wZW4gc2Vzc2lvbioqKioqKioqKipcbiIpOworICAgICAgICBzc2l6ZV90IHNpemVfcmVhZDsKKyAgICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICAgIHdoaWxlICgoc2l6ZV9yZWFkID0gcmVhZChtTWVtRmQsIGJ1ZiwgKHNpemVvZihidWYpIC0gMSkpKSA+IDApIHsKKyAgICAgICAgICAgIC8vIFJlYWQgZGF0YSBmcm9tIGZpbGUgdG8gYSBzbWFsbCBidWZmZXIgYW5kIHdyaXRlIGl0IHRvIGZkLgorICAgICAgICAgICAgd3JpdGUoZmQsIGJ1Ziwgc2l6ZV9yZWFkKTsKKyAgICAgICAgICAgIGlmIChzaXplX3JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGR1cmluZyByZWFkaW5nIHRoZSBmaWxlOiAlcyIsIF9fRlVOQ1RJT05fXywgc0ZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkcHJpbnRmKGZkLCAiXG4qKioqKioqKioqRW5kIG9mIER1bXBzeXMgZnJvbSBwcmV2aW91cyBvcGVuIHNlc3Npb24qKioqKioqKioqXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGR1cmluZyByZWFkaW5nIHRoZSBmaWxlOiAlcyIsIF9fRlVOQ1RJT05fXywgc0ZpbGVOYW1lKTsKKyAgICB9CisKKyAgICBpZiAoc2VydmljZUxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAordm9pZCBDYW1lcmFTZXJ2aWNlOjpkdW1wT3BlblNlc3Npb25DbGllbnRMb2dzKGludCBmZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBhdXRvIGNsaWVudERlc2NyaXB0b3IgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOworICAgIGRwcmludGYoZmQsICIgIERldmljZSAlcyBpcyBvcGVuLiBDbGllbnQgaW5zdGFuY2UgZHVtcDpcbiIsCisgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICAgIENsaWVudCBwcmlvcml0eSBzY29yZTogJWQgc3RhdGU6ICVkXG4iLAorICAgICAgICBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpLmdldFNjb3JlKCksCisgICAgICAgIGNsaWVudERlc2NyaXB0b3ItPmdldFByaW9yaXR5KCkuZ2V0U3RhdGUoKSk7CisgICAgZHByaW50ZihmZCwgIiAgICBDbGllbnQgUElEOiAlZFxuIiwgY2xpZW50RGVzY3JpcHRvci0+Z2V0T3duZXJJZCgpKTsKKworICAgIGF1dG8gY2xpZW50ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKTsKKyAgICBkcHJpbnRmKGZkLCAiICAgIENsaWVudCBwYWNrYWdlOiAlc1xuIiwKKyAgICAgICAgU3RyaW5nOChjbGllbnQtPmdldFBhY2thZ2VOYW1lKCkpLnN0cmluZygpKTsKKworICAgIGNsaWVudC0+ZHVtcENsaWVudChmZCwgYXJncyk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6ZHVtcENsb3NlZFNlc3Npb25DbGllbnRMb2dzKGludCBmZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBkcHJpbnRmKGZkLCAiICBEZXZpY2UgJXMgaXMgY2xvc2VkLCBubyBjbGllbnQgaW5zdGFuY2VcbiIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpkdW1wRXZlbnRMb2coaW50IGZkKSB7CiAgICAgZHByaW50ZihmZCwgIlxuPT0gQ2FtZXJhIHNlcnZpY2UgZXZlbnRzIGxvZyAobW9zdCByZWNlbnQgYXQgdG9wKTogPT1cbiIpOwogCkBAIC0zNzM5LDIxICs0MTk0LDE0IEBACiAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgaWQgJXMsIHNraXBwaW5nIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBzdXBwb3J0c0hBTDMgPSBmYWxzZTsKLSAgICAvLyBzdXBwb3J0c0NhbWVyYUFwaSBhbHNvIGhvbGRzIG1JbnRlcmZhY2VNdXRleCwgd2UgY2FuJ3QgY2FsbCBpdCBpbiB0aGUKLSAgICAvLyBISURMIG9uU3RhdHVzQ2hhbmdlZCB3cmFwcGVyIGNhbGwgKHdlJ2xsIGhvbGQgbVN0YXR1c0xpc3RlbmVyTG9jayBhbmQKLSAgICAvLyBtSW50ZXJmYWNlTXV0ZXggdG9nZXRoZXIsIHdoaWNoIGNhbiBsZWFkIHRvIGRlYWRsb2NrcykKLSAgICBiaW5kZXI6OlN0YXR1cyBzUmV0ID0KLSAgICAgICAgICAgIHN1cHBvcnRzQ2FtZXJhQXBpKFN0cmluZzE2KGNhbWVyYUlkKSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLAotICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydHNIQUwzKTsKLSAgICBpZiAoIXNSZXQuaXNPaygpKSB7Ci0gICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGRldGVybWluZSBpZiBkZXZpY2Ugc3VwcG9ydHMgSEFMMyAlcywgc3VwcG9ydHNDYW1lcmFBcGkgY2FsbCBmYWlsZWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorCisgICAgLy8gQ29sbGVjdCB0aGUgbG9naWNhbCBjYW1lcmFzIHdpdGhvdXQgaG9sZGluZyBtU3RhdHVzTG9jayBpbiB1cGRhdGVTdGF0dXMKKyAgICAvLyBhcyB0aGF0IGNhbiBsZWFkIHRvIGEgZGVhZGxvY2soYi8xNjIxOTIzMzEpLgorICAgIGF1dG8gbG9naWNhbENhbWVyYUlkcyA9IGdldExvZ2ljYWxDYW1lcmFzKGNhbWVyYUlkKTsKICAgICAvLyBVcGRhdGUgdGhlIHN0YXR1cyBmb3IgdGhpcyBjYW1lcmEgc3RhdGUsIHRoZW4gc2VuZCB0aGUgb25TdGF0dXNDaGFuZ2VkQ2FsbGJhY2tzIHRvIGVhY2gKICAgICAvLyBvZiB0aGUgbGlzdGVuZXJzIHdpdGggYm90aCB0aGUgbVN0YXR1c0xvY2sgYW5kIG1TdGF0dXNMaXN0ZW5lckxvY2sgaGVsZAotICAgIHN0YXRlLT51cGRhdGVTdGF0dXMoc3RhdHVzLCBjYW1lcmFJZCwgcmVqZWN0U291cmNlU3RhdGVzLCBbdGhpcywgJmRldmljZUtpbmQsICZzdXBwb3J0c0hBTDNdCisgICAgc3RhdGUtPnVwZGF0ZVN0YXR1cyhzdGF0dXMsIGNhbWVyYUlkLCByZWplY3RTb3VyY2VTdGF0ZXMsIFt0aGlzLCAmZGV2aWNlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZsb2dpY2FsQ2FtZXJhSWRzXQogICAgICAgICAgICAgKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBTdGF0dXNJbnRlcm5hbCBzdGF0dXMpIHsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXNJbnRlcm5hbDo6RU5VTUVSQVRJTkcpIHsKQEAgLTM3NjcsMjEgKzQyMTUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PRkYgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcmNoTW9kZVN0YXR1czo6Tk9UX0FWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRvcmNoU3RhdHVzICE9IG5ld1RvcmNoU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvblRvcmNoU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFJZCwgbmV3VG9yY2hTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY2FtZXJhSWQsIG5ld1RvcmNoU3RhdHVzLCBkZXZpY2VLaW5kKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7Ci0KLSAgICAgICAgICAgIG5vdGlmeVBoeXNpY2FsQ2FtZXJhU3RhdHVzTG9ja2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIGNhbWVyYUlkLCBkZXZpY2VLaW5kKTsKKyAgICAgICAgICAgIG5vdGlmeVBoeXNpY2FsQ2FtZXJhU3RhdHVzTG9ja2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2KGNhbWVyYUlkKSwKKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkcywgZGV2aWNlS2luZCk7CiAKICAgICAgICAgICAgIGZvciAoYXV0byYgbGlzdGVuZXIgOiBtTGlzdGVuZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlbmRvckxpc3RlbmVyID0gbGlzdGVuZXItPmlzVmVuZG9yTGlzdGVuZXIoKTsKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2tpcFN0YXR1c1VwZGF0ZXMoZGV2aWNlS2luZCwgaXNWZW5kb3JMaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5nZXRMaXN0ZW5lclBpZCgpLCBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJVaWQoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpc1ZlbmRvckxpc3RlbmVyICYmICFzdXBwb3J0c0hBTDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTa2lwcGluZyBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yIHN5c3RlbS1vbmx5IGNhbWVyYS9IQUwxIGRldmljZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZlbmRvckxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJTa2lwcGluZyBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yIHN5c3RlbS1vbmx5IGNhbWVyYSBkZXZpY2UgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0zODU3LDE0ICs0MzA1LDYgQEAKICAgICBvblN0YXR1c1VwZGF0ZWRMb2NrZWQoY2FtZXJhSWQsIHN0YXR1cyk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShpbnQgbmV3U3RhdGUsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgZmFjaW5nLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgaW50IGFwaUxldmVsKSB7Ci0gICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKLSAgICBpZiAocHJveHlCaW5kZXIgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIFN0cmluZzE2IGlkKGNhbWVyYUlkKTsKLSAgICBwcm94eUJpbmRlci0+bm90aWZ5Q2FtZXJhU3RhdGUoaWQsIG5ld1N0YXRlLCBmYWNpbmcsIGNsaWVudE5hbWUsIGFwaUxldmVsKTsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Z2V0VG9yY2hTdGF0dXNMb2NrZWQoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBUb3JjaE1vZGVTdGF0dXMgKnN0YXR1cykgY29uc3QgewpAQCAtMzg5Miw4ICs0MzMyLDkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQoaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQpIHsKK3N0ZDo6bGlzdDxTdHJpbmcxNj4gQ2FtZXJhU2VydmljZTo6Z2V0TG9naWNhbENhbWVyYXMoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICBzdGQ6Omxpc3Q8U3RyaW5nMTY+IHJldExpc3Q7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgIGZvciAoY29uc3QgYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKQEAgLTM5MDEsMjYgKzQzNDIsMzkgQEAKICAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBjYW1lcmFJZC5jX3N0cigpKQorICAgICAgICBpZiAoc3RkOjpmaW5kKHBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksIHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKICAgICAgICAgICAgIC8vIGNhbWVyYUlkIGlzIG5vdCBhIHBoeXNpY2FsIGNhbWVyYSBvZiB0aGlzIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcxNiBpZDE2KHN0YXRlLmZpcnN0KSwgcGh5c2ljYWxJZDE2KGNhbWVyYUlkKTsKKyAgICAgICAgcmV0TGlzdC5lbXBsYWNlX2JhY2soU3RyaW5nMTYoc3RhdGUuZmlyc3QpKTsKKyAgICB9CisgICAgcmV0dXJuIHJldExpc3Q7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5UGh5c2ljYWxDYW1lcmFTdGF0dXNMb2NrZWQoaW50MzJfdCBzdGF0dXMsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbENhbWVyYUlkLCBjb25zdCBzdGQ6Omxpc3Q8U3RyaW5nMTY+JiBsb2dpY2FsQ2FtZXJhSWRzLAorICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQpIHsKKyAgICAvLyBtU3RhdHVzTGlzdGVuZXJMb2NrIGlzIGV4cGVjdGVkIHRvIGJlIGxvY2tlZAorICAgIGZvciAoY29uc3QgYXV0byYgbG9naWNhbENhbWVyYUlkIDogbG9naWNhbENhbWVyYUlkcykgewogICAgICAgICBmb3IgKGF1dG8mIGxpc3RlbmVyIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgLy8gTm90ZTogd2UgY2hlY2sgb25seSB0aGUgZGV2aWNlS2luZCBvZiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkCisgICAgICAgICAgICAvLyBzaW5jZSwgbG9naWNhbCBjYW1lcmEgaWRzIGFuZCB0aGVpciBwaHlzaWNhbCBjYW1lcmEgaWRzIGFyZQorICAgICAgICAgICAgLy8gZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIHN5c3RlbSBjYW1lcmEga2luZC4KICAgICAgICAgICAgIGlmIChzaG91bGRTa2lwU3RhdHVzVXBkYXRlcyhkZXZpY2VLaW5kLCBsaXN0ZW5lci0+aXNWZW5kb3JMaXN0ZW5lcigpLAogICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci0+Z2V0TGlzdGVuZXJQaWQoKSwgbGlzdGVuZXItPmdldExpc3RlbmVyVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlNraXBwaW5nIGRpc2NvdmVyeSBjYWxsYmFjayBmb3Igc3lzdGVtLW9ubHkgY2FtZXJhIGRldmljZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocGh5c2ljYWxDYW1lcmFJZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsaXN0ZW5lci0+Z2V0TGlzdGVuZXIoKS0+b25QaHlzaWNhbENhbWVyYVN0YXR1c0NoYW5nZWQoc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBpZDE2LCBwaHlzaWNhbElkMTYpOworICAgICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQsIHBoeXNpY2FsQ2FtZXJhSWQpOwogICAgICAgICB9CiAgICAgfQogfQogCisKIHZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCkgewogICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOwogICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKQEAgLTM5NjMsNiArNDQxNywxMiBAQAogICAgICAgICByZXR1cm4gaGFuZGxlU2V0Um90YXRlQW5kQ3JvcChhcmdzKTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiZ2V0LXJvdGF0ZS1hbmQtY3JvcCIpKSB7CiAgICAgICAgIHJldHVybiBoYW5kbGVHZXRSb3RhdGVBbmRDcm9wKG91dCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC1pbWFnZS1kdW1wLW1hc2siKSkgeworICAgICAgICByZXR1cm4gaGFuZGxlU2V0SW1hZ2VEdW1wTWFzayhhcmdzKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiZ2V0LWltYWdlLWR1bXAtbWFzayIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVHZXRJbWFnZUR1bXBNYXNrKG91dCk7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC1jYW1lcmEtbXV0ZSIpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVTZXRDYW1lcmFNdXRlKGFyZ3MpOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKICAgICAgICAgcHJpbnRIZWxwKG91dCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTQwNjIsNiArNDUyMiw1MyBAQAogICAgIHJldHVybiBkcHJpbnRmKG91dCwgInJvdGF0ZUFuZENyb3Agb3ZlcnJpZGU6ICVkXG4iLCBtT3ZlcnJpZGVSb3RhdGVBbmRDcm9wTW9kZSk7CiB9CiAKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVNldEltYWdlRHVtcE1hc2soY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIGNoYXIgKmVuZFB0cjsKKyAgICBlcnJubyA9IDA7CisgICAgU3RyaW5nOCBtYXNrU3RyaW5nOCA9IFN0cmluZzgoYXJnc1sxXSk7CisgICAgbG9uZyBtYXNrVmFsdWUgPSBzdHJ0b2wobWFza1N0cmluZzguY19zdHIoKSwgJmVuZFB0ciwgMTApOworCisgICAgaWYgKGVycm5vICE9IDApIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuZFB0ciAhPSBtYXNrU3RyaW5nOC5jX3N0cigpICsgbWFza1N0cmluZzguc2l6ZSgpKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtYXNrVmFsdWUgPCAwIHx8IG1hc2tWYWx1ZSA+IDEpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworCisgICAgbUltYWdlRHVtcE1hc2sgPSBtYXNrVmFsdWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUdldEltYWdlRHVtcE1hc2soaW50IG91dCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisKKyAgICByZXR1cm4gZHByaW50ZihvdXQsICJJbWFnZSBkdW1wIG1hc2s6ICVkXG4iLCBtSW1hZ2VEdW1wTWFzayk7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVNldENhbWVyYU11dGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgeworICAgIGludCBtdXRlVmFsdWUgPSBzdHJ0b2woU3RyaW5nOChhcmdzWzFdKSwgbnVsbHB0ciwgMTApOworICAgIGlmIChlcnJubyAhPSAwKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKG11dGVWYWx1ZSA8IDAgfHwgbXV0ZVZhbHVlID4gMSkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOworCisgICAgbU92ZXJyaWRlQ2FtZXJhTXV0ZU1vZGUgPSAobXV0ZVZhbHVlID09IDEpOworCisgICAgY29uc3QgYXV0byBjbGllbnRzID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCk7CisgICAgZm9yIChhdXRvJiBjdXJyZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAoY3VycmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIGJhc2ljQ2xpZW50ID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhc2ljQ2xpZW50LT5zdXBwb3J0c0NhbWVyYU11dGUoKSkgeworICAgICAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+c2V0Q2FtZXJhTXV0ZShtT3ZlcnJpZGVDYW1lcmFNdXRlTW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgewogICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkNhbWVyYSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgogICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGdldHMgdGhlIHVpZCBzdGF0ZVxuIgpAQCAtNDA3MCw2ICs0NTc3LDEwIEBACiAgICAgICAgICIgIHNldC1yb3RhdGUtYW5kLWNyb3AgPFJPVEFUSU9OPiBvdmVycmlkZXMgdGhlIHJvdGF0ZS1hbmQtY3JvcCB2YWx1ZSBmb3IgQVVUTyBiYWNrY29tcGF0XG4iCiAgICAgICAgICIgICAgICBWYWxpZCB2YWx1ZXMgMD0wIGRlZywgMT05MCBkZWcsIDI9MTgwIGRlZywgMz0yNzAgZGVnLCA0PU5vIG92ZXJyaWRlXG4iCiAgICAgICAgICIgIGdldC1yb3RhdGUtYW5kLWNyb3AgcmV0dXJucyB0aGUgY3VycmVudCBvdmVycmlkZSByb3RhdGUtYW5kLWNyb3AgdmFsdWVcbiIKKyAgICAgICAgIiAgc2V0LWltYWdlLWR1bXAtbWFzayA8TUFTSz4gc3BlY2lmaWVzIHRoZSBmb3JtYXRzIHRvIGJlIHNhdmVkIHRvIGRpc2tcbiIKKyAgICAgICAgIiAgICAgIFZhbGlkIHZhbHVlcyAwPU9GRiwgMT1PTiBmb3IgSlBFR1xuIgorICAgICAgICAiICBnZXQtaW1hZ2UtZHVtcC1tYXNrIHJldHVybnMgdGhlIGN1cnJlbnQgaW1hZ2UtZHVtcC1tYXNrIHZhbHVlXG4iCisgICAgICAgICIgIHNldC1jYW1lcmEtbXV0ZSA8MC8xPiBlbmFibGUgb3IgZGlzYWJsZSBjYW1lcmEgbXV0aW5nXG4iCiAgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKIH0KIApAQCAtNDA5NCw0ICs0NjA1LDEwIEBACiAgICAgcmV0dXJuIG1vZGU7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6c3RvcEluamVjdGlvbkltcGwoKSB7CisgICAgbUluamVjdGlvblN0YXR1c0xpc3RlbmVyLT5yZW1vdmVMaXN0ZW5lcigpOworCisgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoZSBzdG9wIGluamVjdGlvbiBmdW5jdGlvbi4KK30KKwogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA0MzIxMjAxLi5iYzJlMzQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC0yMCw3ICsyMCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2UuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuU2Vuc29yUHJpdmFjeUxpc3RlbmVyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2suaD4KIAogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTQ5LDggKzUwLDEwIEBACiAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KQEAgLTY5LDcgKzcyLDYgQEAKICAgICBwdWJsaWMgdmlydHVhbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlN0YXR1c0xpc3RlbmVyCiB7CiAgICAgZnJpZW5kIGNsYXNzIEJpbmRlclNlcnZpY2U8Q2FtZXJhU2VydmljZT47Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYUNsaWVudDsKICAgICBmcmllbmQgY2xhc3MgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ7CiBwdWJsaWM6CiAgICAgY2xhc3MgQ2xpZW50OwpAQCAtMTE5LDcgKzEyMSw3IEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICAgZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCiAgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKKyAgICAgICAgICAgIGludCB0YXJnZXRTZGtWZXJzaW9uLCBDYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICAgZ2V0Q2FtZXJhVmVuZG9yVGFnRGVzY3JpcHRvcigKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlZlbmRvclRhZ0Rlc2NyaXB0b3IqIGRlc2MpOwpAQCAtMTI5LDIwICsxMzEsMTQgQEAKIAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgIGNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhPiogZGV2aWNlKTsKLQotICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgIGNvbm5lY3RMZWdhY3koY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCBpbnQzMl90IGhhbFZlcnNpb24sCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludDMyX3QgY2xpZW50VWlkLAorICAgICAgICAgICAgaW50MzJfdCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGludCB0YXJnZXRTZGtWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmE+KiBkZXZpY2UpOwogCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICAgY29ubmVjdERldmljZSgKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgaW50MzJfdCBjbGllbnRVaWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCwgaW50IHNjb3JlT2Zmc2V0LCBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4qIGRldmljZSk7CiAKQEAgLTE1OCw3ICsxNTQsNyBAQAogCiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDYW1lcmFJZEFuZFNlc3Npb25Db25maWd1cmF0aW9uPiYgc2Vzc2lvbnMsCi0gICAgICAgIC8qb3V0Ki9ib29sKiBzdXBwb3J0ZWQpOworICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgLypvdXQqL2Jvb2wqIHN1cHBvcnRlZCk7CiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGdldExlZ2FjeVBhcmFtZXRlcnMoCiAgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLApAQCAtMTczLDYgKzE2OSw4IEBACiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlEaXNwbGF5Q29uZmlndXJhdGlvbkNoYW5nZSgpOworCiAgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IGFwaVZlcnNpb24sCkBAIC0xODQsNiArMTgyLDEzIEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGluamVjdENhbWVyYSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nMTYmIGludGVybmFsQ2FtSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgZXh0ZXJuYWxDYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbj4qIGNhbWVyYUluamVjdGlvblNlc3Npb24pOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtMTk0LDExICsxOTksMTUgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzICAgICAgYWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcywgYm9vbCBpc1ZlbmRvciA9IGZhbHNlKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcywgYm9vbCBpc1ZlbmRvciA9IGZhbHNlLAorICAgICAgICAgICAgYm9vbCBpc1Byb2Nlc3NMb2NhbFRlc3QgPSBmYWxzZSk7CiAKICAgICAvLyBNb25pdG9yZWQgVUlEcyBhdmFpbGFiaWxpdHkgbm90aWZpY2F0aW9uCiAgICAgdm9pZCAgICAgICAgICAgICAgICBub3RpZnlNb25pdG9yZWRVaWRzKCk7CiAKKyAgICAvLyBTdG9yZXMgY3VycmVudCBvcGVuIHNlc3Npb24gZGV2aWNlIGluZm8gaW4gdGVtcCBmaWxlLgorICAgIHZvaWQgY2FjaGVEdW1wKCk7CisKICAgICAvLyBSZWdpc3RlciBhbiBvZmZsaW5lIGNsaWVudCBmb3IgYSBnaXZlbiBhY3RpdmUgY2FtZXJhIGlkCiAgICAgc3RhdHVzX3QgYWRkT2ZmbGluZUNsaWVudChTdHJpbmc4IGNhbWVyYUlkLCBzcDxCYXNpY0NsaWVudD4gb2ZmbGluZUNsaWVudCk7CiAKQEAgLTIxNiwyMCArMjI1LDI0IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICBsb2FkU291bmRMb2NrZWQoc291bmRfa2luZCBraW5kKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIGRlY3JlYXNlU291bmRSZWYoKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIGluY3JlYXNlU291bmRSZWYoKTsKLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHN0YXRlIG9mIGEgZ2l2ZW4gY2FtZXJhIGRldmljZSAob3Blbi9jbG9zZS9hY3RpdmUvaWRsZSkgd2l0aAotICAgICAqIHRoZSBjYW1lcmEgcHJveHkgc2VydmljZSBpbiB0aGUgc3lzdGVtIHNlcnZpY2UKLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCAgICAgICAgIHVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgICAgICBpbnQgbmV3U3RhdGUsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBmYWNpbmcsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwKLSAgICAgICAgICAgIGludCBhcGlMZXZlbCk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDYW1lcmFEZXZpY2VGYWN0b3J5IGZ1bmN0aW9uYWxpdHkKLSAgICBpbnQgICAgICAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCogZmFjaW5nID0gTlVMTCk7CisgICAgaW50ICAgICAgICAgICAgICAgICBnZXREZXZpY2VWZXJzaW9uKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQqIGZhY2luZyA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQqIG9yaWVudGF0aW9uID0gbnVsbHB0cik7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBNZXRob2RzIHRvIGJlIHVzZWQgaW4gQ2FtZXJhU2VydmljZSBjbGFzcyB0ZXN0cyBvbmx5CisgICAgLy8KKyAgICAvLyBDYW1lcmFTZXJ2aWNlIGNsYXNzIHRlc3QgbWV0aG9kIG9ubHkgLSBjbGVhciBzdGF0aWMgdmFyaWFibGVzIGluIHRoZQorICAgIC8vIGNhbWVyYXNlcnZlciBwcm9jZXNzLCB3aGljaCBvdGhlcndpc2UgbWlnaHQgYWZmZWN0IG11bHRpcGxlIHRlc3QgcnVucy4KKyAgICB2b2lkICAgICAgICAgICAgICAgIGNsZWFyQ2FjaGVkVmFyaWFibGVzKCk7CisKKyAgICAvLyBBZGQgdGVzdCBsaXN0ZW5lciwgbGlua1RvRGVhdGggd29uJ3QgYmUgY2FsbGVkIHNpbmNlIHRoaXMgaXMgZm9yIHByb2Nlc3MKKyAgICAvLyBsb2NhbCB0ZXN0aW5nLgorICAgIGJpbmRlcjo6U3RhdHVzICAgIGFkZExpc3RlbmVyVGVzdChjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4qIGNhbWVyYVN0YXR1c2VzKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIFNoYXJlZCB1dGlsaXRpZXMKQEAgLTIzOSw2ICsyNTIsNyBAQAogICAgIC8vIENhbWVyYUNsaWVudCBmdW5jdGlvbmFsaXR5CiAKICAgICBjbGFzcyBCYXNpY0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTZXJ2aWNlOwogICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgPSAwOwpAQCAtMjYxLDYgKzI3NSwxMiBAQAogICAgICAgICAvLyBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhpcyBjbGllbnQKICAgICAgICAgdmlydHVhbCBTdHJpbmcxNiBnZXRQYWNrYWdlTmFtZSgpIGNvbnN0OwogCisgICAgICAgIC8vIFJldHVybiB0aGUgY2FtZXJhIGZhY2luZyBmb3IgdGhpcyBjbGllbnQKKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0Q2FtZXJhRmFjaW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBjYW1lcmEgb3JpZW50YXRpb24gZm9yIHRoaXMgY2xpZW50CisgICAgICAgIHZpcnR1YWwgaW50IGdldENhbWVyYU9yaWVudGF0aW9uKCkgY29uc3Q7CisKICAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCiAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKQEAgLTI5NCwxMyArMzE0LDIwIEBACiAgICAgICAgIC8vIE92ZXJyaWRlIHJvdGF0ZS1hbmQtY3JvcCBBVVRPIGJlaGF2aW9yCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKHVpbnQ4X3Qgcm90YXRlQW5kQ3JvcCkgPSAwOwogCisgICAgICAgIC8vIFdoZXRoZXIgdGhlIGNsaWVudCBzdXBwb3J0cyBjYW1lcmEgbXV0aW5nIChibGFjayBvbmx5IG91dHB1dCkKKyAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzQ2FtZXJhTXV0ZSgpID0gMDsKKworICAgICAgICAvLyBTZXQvcmVzZXQgY2FtZXJhIG11dGUKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmFNdXRlKGJvb2wgZW5hYmxlZCkgPSAwOworCiAgICAgcHJvdGVjdGVkOgogICAgICAgICBCYXNpY0NsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCisgICAgICAgICAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKQEAgLTMxNyw4ICszNDQsOSBAQAogICAgICAgICBzdGF0aWMgc3A8Q2FtZXJhU2VydmljZT4gICAgICAgIHNDYW1lcmFTZXJ2aWNlOwogICAgICAgICBjb25zdCBTdHJpbmc4ICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0cjsKICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhRmFjaW5nOworICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKICAgICAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4gICAgICAgbUNsaWVudEZlYXR1cmVJZDsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gICAgICAgICBtQ2xpZW50RmVhdHVyZUlkOwogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgICAgICBtU2VydmljZVBpZDsKQEAgLTMzMSw5ICszNTksMjEgQEAKICAgICAgICAgLy8gLSBUaGUgYXBwLXNpZGUgQmluZGVyIGludGVyZmFjZSB0byByZWNlaXZlIGNhbGxiYWNrcyBmcm9tIHVzCiAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgICAgICAgICAgICAgbVJlbW90ZUJpbmRlcjsgICAvLyBpbW11dGFibGUgYWZ0ZXIgY29uc3RydWN0b3IKIAotICAgICAgICAvLyBwZXJtaXNzaW9ucyBtYW5hZ2VtZW50CisgICAgICAgIC8vIFBlcm1pc3Npb25zIG1hbmFnZW1lbnQgbWV0aG9kcyBmb3IgY2FtZXJhIGxpZmVjeWNsZQorCisgICAgICAgIC8vIE5vdGlmeSByZXN0IG9mIHN5c3RlbS9hcHBzIGFib3V0IGNhbWVyYSBvcGVuaW5nLCBhbmQgY2hlY2sgYXBwb3BzCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRDYW1lcmFPcHMoKTsKKyAgICAgICAgLy8gTm90aWZ5IHJlc3Qgb2Ygc3lzdGVtL2FwcHMgYWJvdXQgY2FtZXJhIHN0YXJ0aW5nIHRvIHN0cmVhbSBkYXRhLCBhbmQgY29uZmlybSBhcHBvcHMKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydENhbWVyYVN0cmVhbWluZ09wcygpOworICAgICAgICAvLyBOb3RpZnkgcmVzdCBvZiBzeXN0ZW0vYXBwcyBhYm91dCBjYW1lcmEgc3RvcHBpbmcgc3RyZWFtaW5nIGRhdGEKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBmaW5pc2hDYW1lcmFTdHJlYW1pbmdPcHMoKTsKKyAgICAgICAgLy8gTm90aWZ5IHJlc3Qgb2Ygc3lzdGVtL2FwcHMgYWJvdXQgY2FtZXJhIGNsb3NpbmcKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBmaW5pc2hDYW1lcmFPcHMoKTsKKyAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBmb3Igc3RhcnQvY2hlY2tPcHMKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBoYW5kbGVBcHBPcE1vZGUoaW50MzJfdCBtb2RlKTsKKyAgICAgICAgLy8gSnVzdCBub3RpZnkgY2FtZXJhIGFwcG9wcyB0byB0cmlnZ2VyIHVuYmxvY2tpbmcgZGlhbG9nIGlmIHNlbnNvcgorICAgICAgICAvLyBwcml2YWN5IGlzIGVuYWJsZWQgYW5kIGNhbWVyYSBtdXRlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBub3RlQXBwT3AoKTsKIAogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXBwT3BzTWFuYWdlcj4gIG1BcHBPcHNNYW5hZ2VyID0gbnVsbHB0cjsKIApAQCAtMzQ4LDkgKzM4OCwxMiBAQAogICAgICAgICB9OyAvLyBjbGFzcyBPcHNDYWxsYmFjawogCiAgICAgICAgIHNwPE9wc0NhbGxiYWNrPiBtT3BzQ2FsbGJhY2s7Ci0gICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgc3RhcnRDYW1lcmFPcHMgd2FzIGNhbGxlZCBzdWNjZXNzZnVsbHksIHRvIGF2b2lkCi0gICAgICAgIC8vIGZpbmlzaGluZyB3aGF0IHdlIGRpZG4ndCBzdGFydC4KKyAgICAgICAgLy8gVHJhY2sgd2hldGhlciBjaGVja09wcyB3YXMgY2FsbGVkIHN1Y2Nlc3NmdWxseSwgdG8gYXZvaWQKKyAgICAgICAgLy8gZmluaXNoaW5nIHdoYXQgd2UgZGlkbid0IHN0YXJ0LCBvbiBjYW1lcmEgb3Blbi4KICAgICAgICAgYm9vbCAgICAgICAgICAgIG1PcHNBY3RpdmU7CisgICAgICAgIC8vIFRyYWNrIHdoZXRoZXIgc3RhcnRPcHMgd2FzIGNhbGxlZCBzdWNjZXNzZnVsbHkgb24gc3RhcnQgb2YKKyAgICAgICAgLy8gY2FtZXJhIHN0cmVhbWluZy4KKyAgICAgICAgYm9vbCAgICAgICAgICAgIG1PcHNTdHJlYW1pbmc7CiAKICAgICAgICAgLy8gSUFwcE9wc0NhbGxiYWNrIGludGVyZmFjZSwgaW5kaXJlY3RlZCB0aHJvdWdoIG9wTGlzdGVuZXIKICAgICAgICAgdmlydHVhbCB2b2lkIG9wQ2hhbmdlZChpbnQzMl90IG9wLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUpOwpAQCAtMzkwLDEwICs0MzMsMTEgQEAKICAgICAgICAgQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCisgICAgICAgICAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKQEAgLTQxNCw2ICs0NTgsOCBAQAogICAgICAgICAvLyBDaGVjayB3aGF0IEFQSSBsZXZlbCBpcyB1c2VkIGZvciB0aGlzIGNsaWVudC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAogICAgICAgICAvLyBzdXBlcmNsYXNzIHRoaXMgY2FuIGJlIGNhc3QgdG8uCiAgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0SW1hZ2VEdW1wTWFzayhpbnQgLyptYXNrKi8pIHsgfQogICAgIHByb3RlY3RlZDoKICAgICAgICAgLy8gSW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IKIApAQCAtNDcwLDE0ICs1MTYsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBEZXNjcmlwdG9yUHRyIG1ha2VDbGllbnREZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IGNvc3QsIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsIGludCBvb21TY29yZU9mZnNldCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE1ha2UgYSBDbGllbnREZXNjcmlwdG9yIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gQmFzaWNDbGllbnQgc3Ryb25nIHBvaW50ZXIgd2l0aAogICAgICAgICAgKiB2YWx1ZXMgaW50aWFsaXplZCBmcm9tIGEgcHJpb3IgQ2xpZW50RGVzY3JpcHRvci4KICAgICAgICAgICovCiAgICAgICAgIHN0YXRpYyBEZXNjcmlwdG9yUHRyIG1ha2VDbGllbnREZXNjcmlwdG9yKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsCi0gICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCk7CisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgcGFydGlhbCwgaW50IG9vbVNjb3JlT2Zmc2V0KTsKIAogICAgIH07IC8vIGNsYXNzIENhbWVyYUNsaWVudE1hbmFnZXIKIApAQCAtNjUxLDYgKzY5Nyw3IEBACiAgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CiAKICAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworICAgICAgICAgICAgYm9vbCBpc0NhbWVyYVByaXZhY3lFbmFibGVkKHVzZXJpZF90IHVzZXJJZCk7CiAKICAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKIApAQCAtNjYzLDYgKzcxMCw4IEBACiAgICAgICAgICAgICBNdXRleCBtU2Vuc29yUHJpdmFjeUxvY2s7CiAgICAgICAgICAgICBib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKICAgICAgICAgICAgIGJvb2wgbVJlZ2lzdGVyZWQ7CisKKyAgICAgICAgICAgIGJvb2wgaGFzQ2FtZXJhUHJpdmFjeUZlYXR1cmUoKTsKICAgICB9OwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OwpAQCAtNjk2LDYgKzc0NSw3IEBACiAgICAgLy8gT25seSBjYWxsIHdpdGggd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICBzdGF0dXNfdCBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssIGNvbnN0IFN0cmluZzgmIHBhY2thZ2VOYW1lLAorICAgICAgICBpbnQgc2NvcmVPZmZzZXQsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwpAQCAtNzI3LDkgKzc3NywxMCBAQAogICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LCAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKKyAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwgaW50IHNjb3JlT2Zmc2V0LCBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQogICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwpAQCAtNzQzLDYgKzc5NCwxMiBAQAogICAgIC8vIENvbnRhaW5lciBmb3IgbWFuYWdpbmcgY3VycmVudGx5IGFjdGl2ZSBhcHBsaWNhdGlvbi1sYXllciBjbGllbnRzCiAgICAgQ2FtZXJhQ2xpZW50TWFuYWdlciBtQWN0aXZlQ2xpZW50TWFuYWdlcjsKIAorICAgIC8vIEFkZHMgY2xpZW50IGxvZ3MgZHVyaW5nIG9wZW4gc2Vzc2lvbiB0byB0aGUgZmlsZSBwb2ludGVkIGJ5IGZkLgorICAgIHZvaWQgZHVtcE9wZW5TZXNzaW9uQ2xpZW50TG9ncyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgIC8vIEFkZHMgY2xpZW50IGxvZ3MgZHVyaW5nIGNsb3NlZCBzZXNzaW9uIHRvIHRoZSBmaWxlIHBvaW50ZWQgYnkgZmQuCisgICAgdm9pZCBkdW1wQ2xvc2VkU2Vzc2lvbkNsaWVudExvZ3MoaW50IGZkLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKICAgICAvLyBNYXBwaW5nIGZyb20gY2FtZXJhIElEIC0+IHN0YXRlIGZvciBlYWNoIGRldmljZSwgbWFwIGlzIHByb3RlY3RlZCBieSBtQ2FtZXJhU3RhdGVzTG9jawogICAgIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTdGF0ZT4+IG1DYW1lcmFTdGF0ZXM7CiAKQEAgLTc4OCw3ICs4NDUsOCBAQAogICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KICAgICAgKi8KLSAgICB2b2lkIGZpbmlzaENvbm5lY3RMb2NrZWQoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsIGNvbnN0IERlc2NyaXB0b3JQdHImIGRlc2MpOworICAgIHZvaWQgZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwgY29uc3QgRGVzY3JpcHRvclB0ciYgZGVzYywKKyAgICAgICAgICAgIGludCBvb21TY29yZU9mZnNldCk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBJZCBzdHJpbmcgbWFwcGVkIHRvIGEgY2FtZXJhIGlkIGludApAQCAtODg5LDYgKzk0NywxNiBAQAogICAgICAqLwogICAgIHZvaWQgdXBkYXRlQ2FtZXJhTnVtQW5kSWRzKCk7CiAKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgUyBQZXJmb3JtYW5jZSBjbGFzcyBwcmltYXJ5IGNhbWVyYXMuCisgICAgICogbVNlcnZpY2VMb2NrIHNob3VsZCBiZSBsb2NrZWQuCisgICAgICovCisgICAgdm9pZCBmaWx0ZXJTUGVyZkNsYXNzQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKCk7CisKKyAgICAvLyBGaWxlIGRlc2NyaXB0b3IgdG8gdGVtcCBmaWxlIHVzZWQgZm9yIGNhY2hpbmcgcHJldmlvdXMgb3BlbgorICAgIC8vIHNlc3Npb24gZHVtcHN5cyBpbmZvLgorICAgIGludCBtTWVtRmQ7CisKICAgICAvLyBOdW1iZXIgb2YgY2FtZXJhIGRldmljZXMgKGV4Y2x1ZGluZyBoaWRkZW4gc2VjdXJlIGNhbWVyYXMpCiAgICAgaW50ICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzOwogICAgIC8vIE51bWJlciBvZiBjYW1lcmEgZGV2aWNlcyAoZXhjbHVkaW5nIGhpZGRlbiBzZWN1cmUgY2FtZXJhcyBhbmQKQEAgLTg5Nyw2ICs5NjUsNyBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Ob3JtYWxEZXZpY2VJZHM7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Ob3JtYWxEZXZpY2VJZHNXaXRob3V0U3lzdGVtQ2FtZXJhOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtUGVyZkNsYXNzUHJpbWFyeUNhbWVyYUlkczsKIAogICAgIC8vIHNvdW5kcwogICAgIHNwPE1lZGlhUGxheWVyPiAgICAgbmV3TWVkaWFQbGF5ZXIoY29uc3QgY2hhciAqZmlsZSk7CkBAIC05MTgsNyArOTg3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgbUlzVmVuZG9yTGlzdGVuZXIoaXNWZW5kb3JDbGllbnQpLAogICAgICAgICAgICAgICAgICAgICAgIG1PcGVuQ2xvc2VDYWxsYmFja0FsbG93ZWQob3BlbkNsb3NlQ2FsbGJhY2tBbGxvd2VkKSB7IH0KIAotICAgICAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoYm9vbCBpc1Byb2Nlc3NMb2NhbFRlc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQcm9jZXNzTG9jYWxUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKG1MaXN0ZW5lciktPmxpbmtUb0RlYXRoKHRoaXMpOwogICAgICAgICAgICAgfQogCkBAIC05OTQsNyArMTA2Niw4IEBACiAgICAgLy8gaGFuZGxlIHRvcmNoIG1vZGUgc3RhdHVzIGNoYW5nZSBhbmQgaW52b2tlIGNhbGxiYWNrcy4gbVRvcmNoU3RhdHVzTXV0ZXgKICAgICAvLyBzaG91bGQgYmUgbG9ja2VkLgogICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgbmV3U3RhdHVzLAorICAgICAgICAgICAgU3lzdGVtQ2FtZXJhS2luZCBzeXN0ZW1DYW1lcmFLaW5kKTsKIAogICAgIC8vIGdldCBhIGNhbWVyYSdzIHRvcmNoIHN0YXR1cy4gbVRvcmNoU3RhdHVzTXV0ZXggc2hvdWxkIGJlIGxvY2tlZC4KICAgICBzdGF0dXNfdCBnZXRUb3JjaFN0YXR1c0xvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwKQEAgLTEwMDUsOCArMTA3OCwxMyBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpUb3JjaE1vZGVTdGF0dXMgc3RhdHVzKTsKIAogICAgIC8vIG5vdGlmeSBwaHlzaWNhbCBjYW1lcmEgc3RhdHVzIHdoZW4gdGhlIHBoeXNpY2FsIGNhbWVyYSBpcyBwdWJsaWMuCi0gICAgdm9pZCBub3RpZnlQaHlzaWNhbENhbWVyYVN0YXR1c0xvY2tlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCi0gICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQpOworICAgIC8vIEV4cGVjdHMgbVN0YXR1c0xpc3RlbmVyTG9jayB0byBiZSBsb2NrZWQuCisgICAgdm9pZCBub3RpZnlQaHlzaWNhbENhbWVyYVN0YXR1c0xvY2tlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nMTYmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8U3RyaW5nMTY+JiBsb2dpY2FsQ2FtZXJhSWRzLCBTeXN0ZW1DYW1lcmFLaW5kIGRldmljZUtpbmQpOworCisgICAgLy8gZ2V0IGxpc3Qgb2YgbG9naWNhbCBjYW1lcmFzIHdoaWNoIGFyZSBiYWNrZWQgYnkgcGh5c2ljYWxDYW1lcmFJZAorICAgIHN0ZDo6bGlzdDxTdHJpbmcxNj4gZ2V0TG9naWNhbENhbWVyYXMoY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCk7CisKIAogICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCiAgICAgdmlydHVhbCB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwpAQCAtMTA0Nyw2ICsxMTI1LDE1IEBACiAgICAgLy8gR2V0IHRoZSByb3RhdGUtYW5kLWNyb3AgQVVUTyBvdmVycmlkZSBiZWhhdmlvcgogICAgIHN0YXR1c190IGhhbmRsZUdldFJvdGF0ZUFuZENyb3AoaW50IG91dCk7CiAKKyAgICAvLyBTZXQgdGhlIG1hc2sgZm9yIGltYWdlIGR1bXAgdG8gZGlzaworICAgIHN0YXR1c190IGhhbmRsZVNldEltYWdlRHVtcE1hc2soY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAvLyBHZXQgdGhlIG1hc2sgZm9yIGltYWdlIGR1bXAgdG8gZGlzaworICAgIHN0YXR1c190IGhhbmRsZUdldEltYWdlRHVtcE1hc2soaW50IG91dCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbWVyYSBtdXRlIHN0YXRlCisgICAgc3RhdHVzX3QgaGFuZGxlU2V0Q2FtZXJhTXV0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKwogICAgIC8vIFByaW50cyB0aGUgc2hlbGwgY29tbWFuZCBoZWxwCiAgICAgc3RhdHVzX3QgcHJpbnRIZWxwKGludCBvdXQpOwogCkBAIC0xMDU3LDkgKzExNDQsOSBAQAogCiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBpbnQgaGFsVmVyc2lvbiwKLSAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBmZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLAorICAgICAgICAgICAgaW50IGZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKQEAgLTEwNjksMTYgKzExNTYsMTAgQEAKICAgICBzdGF0aWMgU3RhdHVzSW50ZXJuYWwgbWFwVG9JbnRlcm5hbChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOwogICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFN0YXR1c0ludGVybmFsIHN0YXR1cyk7CiAKLSAgICAvLyBHdWFyZCBtQ2FtZXJhU2VydmljZVByb3h5Ci0gICAgc3RhdGljIE11dGV4IHNQcm94eU11dGV4OwotICAgIC8vIENhY2hlZCBpbnRlcmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlIHByb3h5IGluIHN5c3RlbSBzZXJ2aWNlCi0gICAgc3RhdGljIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5PiBzQ2FtZXJhU2VydmljZVByb3h5OwotCi0gICAgc3RhdGljIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5PiBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKLSAgICBzdGF0aWMgdm9pZCBwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CiAKICAgICB2b2lkIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBTeXN0ZW1DYW1lcmFLaW5kIHN5c3RlbUNhbWVyYUtpbmQpOwogCiAgICAgdm9pZCBkaXNjb25uZWN0Q2xpZW50KGNvbnN0IFN0cmluZzgmIGlkLCBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG9EaXNjb25uZWN0KTsKIApAQCAtMTA5Myw4ICsxMTc0LDU0IEBACiAgICAgLy8gQWdncmVhdGVkIGF1ZGlvIHJlc3RyaWN0aW9uIG1vZGUgZm9yIGFsbCBjYW1lcmEgY2xpZW50cwogICAgIGludDMyX3QgbUF1ZGlvUmVzdHJpY3Rpb247CiAKLSAgICAvLyBDdXJyZW50IG92ZXJyaWRlIHJvdGF0ZS1hbmQtY3JvcCBtb2RlCisgICAgLy8gQ3VycmVudCBvdmVycmlkZSBjbWQgcm90YXRlLWFuZC1jcm9wIG1vZGU7IEFVVE8gbWVhbnMgbm8gb3ZlcnJpZGUKICAgICB1aW50OF90IG1PdmVycmlkZVJvdGF0ZUFuZENyb3BNb2RlID0gQU5EUk9JRF9TQ0FMRVJfUk9UQVRFX0FORF9DUk9QX0FVVE87CisKKyAgICAvLyBDdXJyZW50IGltYWdlIGR1bXAgbWFzaworICAgIHVpbnQ4X3QgbUltYWdlRHVtcE1hc2sgPSAwOworCisgICAgLy8gQ3VycmVudCBjYW1lcmEgbXV0ZSBtb2RlCisgICAgYm9vbCBtT3ZlcnJpZGVDYW1lcmFNdXRlTW9kZSA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQSBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGludGVyZmFjZQorICAgICAqIGZvciB1c2UgdG8gY2FsbCBiYWNrIHRoZSBlcnJvciBzdGF0ZSBpbmplY3RlZCBieSB0aGUgZXh0ZXJuYWwgY2FtZXJhLCBhbmQKKyAgICAgKiBjYW1lcmEgc2VydmljZSBjYW4ga2lsbCB0aGUgaW5qZWN0aW9uIHdoZW4gYmluZGVyIHNpZ25hbHMgcHJvY2VzcyBkZWF0aC4KKyAgICAgKi8KKyAgICBjbGFzcyBJbmplY3Rpb25TdGF0dXNMaXN0ZW5lciA6IHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgSW5qZWN0aW9uU3RhdHVzTGlzdGVuZXIoc3A8Q2FtZXJhU2VydmljZT4gcGFyZW50KSA6IG1QYXJlbnQocGFyZW50KSB7fQorCisgICAgICAgICAgICB2b2lkIGFkZExpc3RlbmVyKGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhSW5qZWN0aW9uQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgICAgICAgICB2b2lkIHJlbW92ZUxpc3RlbmVyKCk7CisgICAgICAgICAgICB2b2lkIG5vdGlmeUluamVjdGlvbkVycm9yKGludCBlcnJvckNvZGUpOworCisgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIE11dGV4IG1MaXN0ZW5lckxvY2s7CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtUGFyZW50OworICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFJbmplY3Rpb25DYWxsYmFjaz4gbUNhbWVyYUluamVjdGlvbkNhbGxiYWNrOworICAgIH07CisKKyAgICBzcDxJbmplY3Rpb25TdGF0dXNMaXN0ZW5lcj4gbUluamVjdGlvblN0YXR1c0xpc3RlbmVyOworCisgICAgLyoqCisgICAgICogQSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGhhcmR3YXJlOjpjYW1lcmEyOjpCbkNhbWVyYUluamVjdGlvblNlc3Npb24gaW50ZXJmYWNlCisgICAgICovCisgICAgY2xhc3MgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbiA6IHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhMjo6Qm5DYW1lcmFJbmplY3Rpb25TZXNzaW9uIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQ2FtZXJhSW5qZWN0aW9uU2Vzc2lvbihzcDxDYW1lcmFTZXJ2aWNlPiBwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5DYW1lcmFJbmplY3Rpb25TZXNzaW9uKCkge30KKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0b3BJbmplY3Rpb24oKSBvdmVycmlkZTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgTXV0ZXggbUluamVjdGlvblNlc3Npb25Mb2NrOworICAgICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVBhcmVudDsKKyAgICB9OworCisgICAgdm9pZCBzdG9wSW5qZWN0aW9uSW1wbCgpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvVEVTVF9NQVBQSU5HCmluZGV4IDZmZGFjNjguLmNhNmNjNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKQEAgLTEsNyArMSwxMiBAQAogewogICAicHJlc3VibWl0IjogWwogICAgIHsKLSAgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgICAibmFtZSI6ICJjYW1lcmFzZXJ2aWNlX3Rlc3QiCisgICAgfQorICBdLAorICAiaW1wb3J0cyI6IFsKKyAgICB7CisgICAgICAicGF0aCI6ICJmcmFtZXdvcmtzL2F2L2NhbWVyYSIKICAgICB9CiAgIF0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCmluZGV4IGIwNDNjMGIuLjk0NGI4YWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTUwLDE2ICs1MSwxOCBAQAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFEZXZpY2VJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKKyAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQsCisgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkLCBvdmVycmlkZUZvclBlcmZDbGFzcyksCiAgICAgICAgIG1QYXJhbWV0ZXJzKGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nKQogewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC03NSw3ICs3OCw4IEBACiBib29sIENhbWVyYTJDbGllbnQ6OmlzWnNsRW5hYmxlZEluU3RpbGxUZW1wbGF0ZSgpIHsKICAgICBib29sIHpzbEVuYWJsZWQgPSBmYWxzZTsKICAgICBDYW1lcmFNZXRhZGF0YSBzdGlsbFRlbXBsYXRlOwotICAgIHN0YXR1c190IHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworICAgIHN0YXR1c190IHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAorICAgICAgICAgICAgY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdDo6Q0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZzdGlsbFRlbXBsYXRlKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVuYWJsZVpzbCA9IHN0aWxsVGVtcGxhdGUuZmluZChBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCk7CiAgICAgICAgIGlmIChlbmFibGVac2wuY291bnQgPT0gMSkgewpAQCAtMzk2LDYgKzQwMCw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYTJDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBuc2Vjc190IHN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKQEAgLTQ1Nyw2ICs0NjIsOSBAQAogCiAgICAgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCk7CiAKKyAgICBpbnQzMl90IGNsb3NlTGF0ZW5jeU1zID0gbnMybXMoc3lzdGVtVGltZSgpIC0gc3RhcnRUaW1lKTsKKyAgICBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dDbG9zZShtQ2FtZXJhSWRTdHIsIGNsb3NlTGF0ZW5jeU1zKTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTkyOSw2ICs5MzcsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIG1DYWxsYmFja1Byb2Nlc3Nvci0+dW5wYXVzZUNhbGxiYWNrKCk7CiAgICAgcGFyYW1zLnN0YXRlID0gUGFyYW1ldGVyczo6UFJFVklFVzsKICAgICByZXR1cm4gT0s7CiB9CkBAIC05NjMsNiArOTcyLDcgQEAKICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlJFQ09SRDoKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpQUkVWSUVXOgorICAgICAgICAgICAgbUNhbGxiYWNrUHJvY2Vzc29yLT5wYXVzZUNhbGxiYWNrKCk7CiAgICAgICAgICAgICBzeW5jV2l0aERldmljZSgpOwogICAgICAgICAgICAgLy8gRHVlIHRvIGZsdXNoIGEgY2FtZXJhIGRldmljZSBzeW5jIGlzIG5vdCBhIHN1ZmZpY2llbnQKICAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IHRoZSBjdXJyZW50IGNsaWVudCBwYXJhbWV0ZXJzIGFyZQpAQCAtMjI5MCw2ICsyMzAwLDE0IEBACiAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90Pihyb3RhdGVBbmRDcm9wKSk7CiB9CiAKK2Jvb2wgQ2FtZXJhMkNsaWVudDo6c3VwcG9ydHNDYW1lcmFNdXRlKCkgeworICAgIHJldHVybiBtRGV2aWNlLT5zdXBwb3J0c0NhbWVyYU11dGUoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6c2V0Q2FtZXJhTXV0ZShib29sIGVuYWJsZWQpIHsKKyAgICByZXR1cm4gbURldmljZS0+c2V0Q2FtZXJhTXV0ZShlbmFibGVkKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6d2FpdFVudGlsQ3VycmVudFJlcXVlc3RJZExvY2tlZCgpIHsKICAgICBpbnQzMl90IGFjdGl2ZVJlcXVlc3RJZCA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPmdldEFjdGl2ZVJlcXVlc3RJZCgpOwogICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCAwM2NhNDRhLi42NGFiOGZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtODcsNiArODcsOSBAQAogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgICAgIGdldEdsb2JhbEF1ZGlvUmVzdHJpY3Rpb24oKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCByb3RhdGVBbmRDcm9wKTsKIAorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHN1cHBvcnRzQ2FtZXJhTXV0ZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldENhbWVyYU11dGUoYm9vbCBlbmFibGVkKTsKKwogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKICAgICAgKi8KQEAgLTk0LDEzICs5NywxNSBAQAogICAgIENhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFEZXZpY2VJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyOTk2Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkNhbWVyYUNsaWVudCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KLQotI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCi0jaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgotI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKLSNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7Ci0jZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwotCi1DYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCi0gICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKToKLSAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpLCBjYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQotewotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKLQotICAgIG1IYXJkd2FyZSA9IE5VTEw7Ci0gICAgbU1zZ0VuYWJsZWQgPSAwOwotICAgIG1TdXJmYWNlID0gMDsKLSAgICBtUHJldmlld1dpbmRvdyA9IDA7Ci0gICAgbURlc3RydWN0aW9uU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKLSAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1QbGF5U2h1dHRlclNvdW5kID0gdHJ1ZTsKLSAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgLyptb25pdG9yVGFncyovKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotICAgIHN0YXR1c190IHJlczsKLQotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZSBFIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIG1DYW1lcmFJZCk7Ci0KLSAgICAvLyBWZXJpZnkgb3BzIHBlcm1pc3Npb25zCi0gICAgcmVzID0gc3RhcnRDYW1lcmFPcHMoKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgY2hhciBjYW1lcmFfZGV2aWNlX25hbWVbMTBdOwotICAgIHNucHJpbnRmKGNhbWVyYV9kZXZpY2VfbmFtZSwgc2l6ZW9mKGNhbWVyYV9kZXZpY2VfbmFtZSksICIlZCIsIG1DYW1lcmFJZCk7Ci0KLSAgICBtSGFyZHdhcmUgPSBuZXcgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoY2FtZXJhX2RldmljZV9uYW1lKTsKLSAgICByZXMgPSBtSGFyZHdhcmUtPmluaXRpYWxpemUobWFuYWdlcik7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIG1IYXJkd2FyZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIG1IYXJkd2FyZS0+c2V0Q2FsbGJhY2tzKG5vdGlmeUNhbGxiYWNrLAotICAgICAgICAgICAgZGF0YUNhbGxiYWNrLAotICAgICAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wLAotICAgICAgICAgICAgaGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCwKLSAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltQ2FtZXJhSWQpOwotCi0gICAgLy8gRW5hYmxlIHpvb20sIGVycm9yLCBmb2N1cywgYW5kIG1ldGFkYXRhIG1lc3NhZ2VzIGJ5IGRlZmF1bHQKLSAgICBlbmFibGVNc2dUeXBlKENBTUVSQV9NU0dfRVJST1IgfCBDQU1FUkFfTVNHX1pPT00gfCBDQU1FUkFfTVNHX0ZPQ1VTIHwKLSAgICAgICAgICAgICAgICAgIENBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSB8IENBTUVSQV9NU0dfRk9DVVNfTU9WRSk7Ci0KLSAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwotICAgIHJldHVybiBPSzsKLX0KLQotCi0vLyB0ZWFyIGRvd24gdGhlIGNsaWVudAotQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewotICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwotCi0gICAgZGlzY29ubmVjdCgpOwotICAgIExPRzEoIkNhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIHRoaXMgJXApIiwgY2FsbGluZ1BpZCwgdGhpcyk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmR1bXAoZmQsIGFyZ3MpOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzaXplX3QgbGVuID0gc25wcmludGYoYnVmZmVyLCBTSVpFLCAiQ2xpZW50WyVkXSAoJXApIHdpdGggVUlEICVkXG4iLAotICAgICAgICAgICAgbUNhbWVyYUlkLAotICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/Ci0gICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGdldFJlbW90ZUNhbGxiYWNrKCkpLmdldCgpIDogTlVMTCksCi0gICAgICAgICAgICBtQ2xpZW50VWlkKTsKLSAgICBsZW4gPSAobGVuID4gU0laRSAtIDEpID8gU0laRSAtIDEgOiBsZW47Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgbGVuKTsKLQotICAgIGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkxhdGVzdCBzZXQgcGFyYW1ldGVyczpcbiIpOwotICAgIGxlbiA9IChsZW4gPiBTSVpFIC0gMSkgPyBTSVpFIC0gMSA6IGxlbjsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBsZW4pOwotCi0gICAgbUxhdGVzdFNldFBhcmFtZXRlcnMuZHVtcChmZCwgYXJncyk7Ci0KLSAgICBjb25zdCBjaGFyICplbmRkdW1wID0gIlxuXG4iOwotICAgIHdyaXRlKGZkLCBlbmRkdW1wLCBzdHJsZW4oZW5kZHVtcCkpOwotCi0gICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGhhcmR3YXJlID0gbUhhcmR3YXJlOwotICAgIGlmIChoYXJkd2FyZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZS0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIEFMT0dJKCIlczogY2FtZXJhIGRldmljZSBjbG9zZWQgYWxyZWFkeSwgc2tpcCBkdW1waW5nIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZCgpIGNvbnN0IHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7Ci0gICAgaWYgKGNhbGxpbmdQaWQgPT0gbUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgQUxPR1coImF0dGVtcHQgdG8gdXNlIGEgbG9ja2VkIGNhbWVyYSBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MiCi0gICAgICAgICAiIChvbGQgcGlkICVkLCBuZXcgcGlkICVkKSIsIG1DbGllbnRQaWQsIGNhbGxpbmdQaWQpOwotICAgIHJldHVybiBFQlVTWTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjaGVja1BpZEFuZEhhcmR3YXJlKCkgY29uc3QgewotICAgIGlmIChtSGFyZHdhcmUgPT0gMCkgewotICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwKLSAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpsb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKLSAgICBMT0cxKCJsb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgLy8gbG9jayBjYW1lcmEgdG8gdGhpcyBjbGllbnQgaWYgdGhlIHRoZSBjYW1lcmEgaXMgdW5sb2NrZWQKLSAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5nUGlkOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJucyBOT19FUlJPUiBpZiB0aGUgY2xpZW50IGFscmVhZHkgb3ducyB0aGUgY2FtZXJhLCBFQlVTWSBvdGhlcndpc2UKLSAgICByZXR1cm4gY2hlY2tQaWQoKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp1bmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwotICAgIExPRzEoInVubG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIC8vIGFsbG93IGFueW9uZSB0byB1c2UgY2FtZXJhIChhZnRlciB0aGV5IGxvY2sgdGhlIGNhbWVyYSkKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwotICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKG1IYXJkd2FyZS0+cmVjb3JkaW5nRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm90IGFsbG93ZWQgdG8gdW5sb2NrIGNhbWVyYSBkdXJpbmcgcmVjb3JkaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRQaWQgPSAwOwotICAgICAgICBMT0cxKCJjbGVhciBtUmVtb3RlQ2FsbGJhY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLSAgICAgICAgLy8gd2UgbmVlZCB0byByZW1vdmUgdGhlIHJlZmVyZW5jZSB0byBJQ2FtZXJhQ2xpZW50IHNvIHRoYXQgd2hlbiB0aGUgYXBwCi0gICAgICAgIC8vIGdvZXMgYXdheSwgdGhlIHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIDAuCi0gICAgICAgIG1SZW1vdGVDYWxsYmFjay5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7Ci0gICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBjaGVja1BpZCgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJUcmllZCB0byBjb25uZWN0IHRvIGEgbG9ja2VkIGNhbWVyYSAob2xkIHBpZCAlZCwgbmV3IHBpZCAlZCkiLAotICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsIGNhbGxpbmdQaWQpOwotICAgICAgICByZXR1cm4gRUJVU1k7Ci0gICAgfQotCi0gICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSAwICYmCi0gICAgICAgIChJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKG1SZW1vdGVDYWxsYmFjaykpKSB7Ci0gICAgICAgIExPRzEoIkNvbm5lY3QgdG8gdGhlIHNhbWUgY2xpZW50Iik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7Ci0gICAgbUNsaWVudFBpZCA9IGNhbGxpbmdQaWQ7Ci0gICAgbVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwotCi0gICAgTE9HMSgiY29ubmVjdCBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgdm9pZCBkaXNjb25uZWN0V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiB3aW5kb3cpIHsKLSAgICBpZiAod2luZG93ICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCh3aW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIm5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlc3VsdCksCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIENhbWVyYUNsaWVudDo6ZGlzY29ubmVjdCgpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7Ci0gICAgTE9HMSgiZGlzY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBjYW1lcmFzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpZiAoY2FsbGluZ1BpZCAhPSBtQ2xpZW50UGlkICYmIGNhbGxpbmdQaWQgIT0gbVNlcnZpY2VQaWQpIHsKLSAgICAgICAgQUxPR1coImRpZmZlcmVudCBjbGllbnQgLSBkb24ndCBkaXNjb25uZWN0Iik7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIGRpc2Nvbm5lY3QoKSBpcyBkb25lIG9uY2UgYW5kIG9uY2Ugb25seSwgd2hldGhlciBpdCBpcyBjYWxsZWQKLSAgICAvLyBmcm9tIHRoZSB1c2VyIGRpcmVjdGx5LCBvciBjYWxsZWQgYnkgdGhlIGRlc3RydWN0b3IuCi0gICAgaWYgKG1IYXJkd2FyZSA9PSAwKSByZXR1cm4gcmVzOwotCi0gICAgTE9HMSgiaGFyZHdhcmUgdGVhcmRvd24iKTsKLSAgICAvLyBCZWZvcmUgZGVzdHJveWluZyBtSGFyZHdhcmUsIHdlIG11c3QgbWFrZSBzdXJlIGl0J3MgaW4gdGhlCi0gICAgLy8gaWRsZSBzdGF0ZS4KLSAgICAvLyBUdXJuIG9mZiBhbGwgbWVzc2FnZXMuCi0gICAgZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19BTExfTVNHUyk7Ci0gICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwotICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAotICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLAotICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtQ2FtZXJhRmFjaW5nLCBtQ2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKLSAgICBtSGFyZHdhcmUtPmNhbmNlbFBpY3R1cmUoKTsKLSAgICAvLyBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMuCi0gICAgbUhhcmR3YXJlLT5yZWxlYXNlKCk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSBoZWxkIEFOYXRpdmVXaW5kb3cgcmVzb3VyY2VzLgotICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7Ci0gICAgICAgIGRpc2Nvbm5lY3RXaW5kb3cobVByZXZpZXdXaW5kb3cpOwotICAgICAgICBtUHJldmlld1dpbmRvdyA9IDA7Ci0gICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7Ci0gICAgfQotICAgIG1IYXJkd2FyZS5jbGVhcigpOwotCi0gICAgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCk7Ci0KLSAgICBMT0cxKCJkaXNjb25uZWN0IFggKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiB3aW5kb3cpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICAvLyByZXR1cm4gaWYgbm8gY2hhbmdlIGluIHN1cmZhY2UuCi0gICAgaWYgKGJpbmRlciA9PSBtU3VyZmFjZSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgaWYgKHdpbmRvdyAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3Qod2luZG93LmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzdWx0KSwKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiBwcmV2aWV3IGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZCwgcmVnaXN0ZXIgcHJldmlldyBidWZmZXJzIG5vdy4KLSAgICBpZiAobUhhcmR3YXJlLT5wcmV2aWV3RW5hYmxlZCgpKSB7Ci0gICAgICAgIGlmICh3aW5kb3cgIT0gMCkgewotICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3U2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICAgICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1RyYW5zZm9ybShtT3JpZW50YXRpb24pOwotICAgICAgICAgICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zZXRQcmV2aWV3V2luZG93KHdpbmRvdyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIEV2ZXJ5dGhpbmcgaGFzIHN1Y2NlZWRlZC4gIERpc2Nvbm5lY3QgdGhlIG9sZCB3aW5kb3cgYW5kIHJlbWVtYmVyIHRoZQotICAgICAgICAvLyBuZXcgd2luZG93LgotICAgICAgICBkaXNjb25uZWN0V2luZG93KG1QcmV2aWV3V2luZG93KTsKLSAgICAgICAgbVN1cmZhY2UgPSBiaW5kZXI7Ci0gICAgICAgIG1QcmV2aWV3V2luZG93ID0gd2luZG93OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nIGFmdGVyIHdlIGNvbm5lY3RlZCB0byB0aGUgbmV3IHdpbmRvdywgc28KLSAgICAgICAgLy8gZGlzY29ubmVjdCBoZXJlLgotICAgICAgICBkaXNjb25uZWN0V2luZG93KHdpbmRvdyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc2V0IHRoZSBidWZmZXIgY29uc3VtZXIgdGhhdCB0aGUgcHJldmlldyB3aWxsIHVzZQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAotICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0KLSAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OwotICAgIGlmIChidWZmZXJQcm9kdWNlciAhPSAwKSB7Ci0gICAgICAgIGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICAgICAgLy8gVXNpbmcgY29udHJvbGxlZEJ5QXBwIGZsYWcgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBxdWV1ZSByZW1haW5zIGluCi0gICAgICAgIC8vIGFzeW5jIG1vZGUgZm9yIHRoZSBvbGQgY2FtZXJhIEFQSSwgd2hlcmUgbWFueSBhcHBsaWNhdGlvbnMgZGVwZW5kCi0gICAgICAgIC8vIG9uIHRoYXQgYmVoYXZpb3IuCi0gICAgICAgIHdpbmRvdyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovIHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gc2V0UHJldmlld1dpbmRvdyhiaW5kZXIsIHdpbmRvdyk7Ci19Ci0KLS8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCi0vLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgotdm9pZCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpIHsKLSAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47Ci0KLSAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IGNhbGxiYWNrX2ZsYWc7Ci0gICAgaWYgKG1QcmV2aWV3Q2FsbGJhY2tGbGFnICYgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spIHsKLSAgICAgICAgZW5hYmxlTXNnVHlwZShDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja1RhcmdldCgKLSAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGNhbGxiYWNrUHJvZHVjZXIpIHsKLSAgICAodm9pZCljYWxsYmFja1Byb2R1Y2VyOwotICAgIEFMT0dFKCIlczogVW5pbXBsZW1lbnRlZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotLy8gc3RhcnQgcHJldmlldyBtb2RlCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UHJldmlldygpIHsKLSAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLSAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwotfQotCi0vLyBzdGFydCByZWNvcmRpbmcgbW9kZQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgIHJldHVybiBzdGFydENhbWVyYU1vZGUoQ0FNRVJBX1JFQ09SRElOR19NT0RFKTsKLX0KLQotLy8gc3RhcnQgcHJldmlldyBvciByZWNvcmRpbmcKLXN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRDYW1lcmFNb2RlKGNhbWVyYV9tb2RlIG1vZGUpIHsKLSAgICBMT0cxKCJzdGFydENhbWVyYU1vZGUoJWQpIiwgbW9kZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgc3dpdGNoKG1vZGUpIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfUFJFVklFV19NT0RFOgotICAgICAgICAgICAgaWYgKG1TdXJmYWNlID09IDAgJiYgbVByZXZpZXdXaW5kb3cgPT0gMCkgewotICAgICAgICAgICAgICAgIExPRzEoIm1TdXJmYWNlIGlzIG5vdCBzZXQgeWV0LiIpOwotICAgICAgICAgICAgICAgIC8vIHN0aWxsIGFibGUgdG8gc3RhcnQgcHJldmlldyBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRQcmV2aWV3TW9kZSgpOwotICAgICAgICBjYXNlIENBTUVSQV9SRUNPUkRJTkdfTU9ERToKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZSA9PSAwICYmIG1QcmV2aWV3V2luZG93ID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibVN1cmZhY2Ugb3IgbVByZXZpZXdXaW5kb3cgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nTW9kZS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhcnRSZWNvcmRpbmdNb2RlKCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRQcmV2aWV3TW9kZSgpIHsKLSAgICBMT0cxKCJzdGFydFByZXZpZXdNb2RlIik7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gTk9fRVJST1I7Ci0KLSAgICAvLyBpZiBwcmV2aWV3IGhhcyBiZWVuIGVuYWJsZWQsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQotICAgIGlmIChtSGFyZHdhcmUtPnByZXZpZXdFbmFibGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7Ci0gICAgICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1NjYWxpbmdNb2RlKAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfU0NBTEVfVE9fV0lORE9XKTsKLSAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3VHJhbnNmb3JtKG1PcmllbnRhdGlvbik7Ci0gICAgfQotICAgIG1IYXJkd2FyZS0+c2V0UHJldmlld1dpbmRvdyhtUHJldmlld1dpbmRvdyk7Ci0gICAgcmVzdWx0ID0gbUhhcmR3YXJlLT5zdGFydFByZXZpZXcoKTsKLSAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAotICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9BQ1RJVkUsCi0gICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfQVBJX0xFVkVMXzEpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnN0YXJ0UmVjb3JkaW5nTW9kZSgpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZ01vZGUiKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKLQotICAgIC8vIGlmIHJlY29yZGluZyBoYXMgYmVlbiBlbmFibGVkLCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUKLSAgICBpZiAobUhhcmR3YXJlLT5yZWNvcmRpbmdFbmFibGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIGlmIHByZXZpZXcgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IHByZXZpZXcgZmlyc3QKLSAgICBpZiAoIW1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKSkgewotICAgICAgICByZXN1bHQgPSBzdGFydFByZXZpZXdNb2RlKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQotICAgIGVuYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSk7Ci0gICAgc0NhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChDYW1lcmFTZXJ2aWNlOjpTT1VORF9SRUNPUkRJTkdfU1RBUlQpOwotICAgIHJlc3VsdCA9IG1IYXJkd2FyZS0+c3RhcnRSZWNvcmRpbmcoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJtSGFyZHdhcmUtPnN0YXJ0UmVjb3JkaW5nKCkgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gc3RvcCBwcmV2aWV3IG1vZGUKLXZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUHJldmlldygpIHsKLSAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47Ci0KLQotICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgbUhhcmR3YXJlLT5zdG9wUHJldmlldygpOwotICAgIHNDYW1lcmFTZXJ2aWNlLT51cGRhdGVQcm94eURldmljZVN0YXRlKAotICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsCi0gICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKTsKLSAgICBtUHJldmlld0J1ZmZlci5jbGVhcigpOwotfQotCi0vLyBzdG9wIHJlY29yZGluZyBtb2RlCi12b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKLQotICAgICAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKTsKLSAgICAgICAgbUhhcmR3YXJlLT5zdG9wUmVjb3JkaW5nKCk7Ci0gICAgICAgIHNDYW1lcmFTZXJ2aWNlLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfUkVDT1JESU5HX1NUT1ApOwotCi0gICAgICAgIG1QcmV2aWV3QnVmZmVyLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzTG9jayk7Ci0gICAgICAgIGlmICghbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIHJlbGVhc2UgYSByZWNvcmRpbmcgZnJhbWUKLXZvaWQgQ2FtZXJhQ2xpZW50OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47Ci0gICAgaWYgKG1lbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2MTY0MjcyIiwKLSAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKG1lbSk7Ci19Ci0KLXZvaWQgQ2FtZXJhQ2xpZW50OjpyZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGUobmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKLSAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3A8SU1lbW9yeT4gZGF0YVB0cjsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnNMb2NrKTsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGRhdGFQdHIgPSBtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmJhY2soKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMucG9wX2JhY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChkYXRhUHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiAlZDogTm8gY2FsbGJhY2sgYnVmZmVyIGF2YWlsYWJsZS4gRHJvcHBpbmcgYSBuYXRpdmUgaGFuZGxlLiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBfX0xJTkVfXyk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoZGF0YVB0ci0+c2l6ZSgpICE9IHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSkgewotICAgICAgICBBTE9HRSgiJXM6ICVkOiBDYWxsYmFjayBidWZmZXIgc2l6ZSBkb2Vzbid0IG1hdGNoIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgX19MSU5FX18pOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUhhcmR3YXJlICE9IG51bGxwdHIpIHsKLSAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKGRhdGFQdHItPnVuc2VjdXJlUG9pbnRlcigpKTsKLSAgICAgICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKLSAgICAgICAgbWV0YWRhdGEtPnBIYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGRhdGFQdHIpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGJvb2wgZGlzY29ubmVjdGVkID0gKG1IYXJkd2FyZSA9PSBudWxscHRyKTsKLSAgICBzaXplX3QgbiA9IGhhbmRsZXMuc2l6ZSgpOwotICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+PiBmcmFtZXM7Ci0gICAgaWYgKCFkaXNjb25uZWN0ZWQpIHsKLSAgICAgICAgZnJhbWVzLnJlc2VydmUobik7Ci0gICAgfQotICAgIGJvb2wgZXJyb3IgPSBmYWxzZTsKLSAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IGhhbmRsZXMpIHsKLSAgICAgICAgc3A8SU1lbW9yeT4gZGF0YVB0cjsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyc0xvY2spOwotICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlQ2FsbGJhY2tCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBkYXRhUHRyID0gbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5iYWNrKCk7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVycy5wb3BfYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRhdGFQdHIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoIiVzOiAlZDogTm8gY2FsbGJhY2sgYnVmZmVyIGF2YWlsYWJsZS4gRHJvcHBpbmcgZnJhbWVzLiIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgX19MSU5FX18pOwotICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGF0YVB0ci0+c2l6ZSgpICE9IHNpemVvZihWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiAlZDogQ2FsbGJhY2sgYnVmZmVyIG11c3QgYmUgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgX19MSU5FX18pOwotICAgICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWRpc2Nvbm5lY3RlZCkgewotICAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKGRhdGFQdHItPnVuc2VjdXJlUG9pbnRlcigpKTsKLSAgICAgICAgICAgIG1ldGFkYXRhLT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2U7Ci0gICAgICAgICAgICBtZXRhZGF0YS0+cEhhbmRsZSA9IGhhbmRsZTsKLSAgICAgICAgICAgIGZyYW1lcy5wdXNoX2JhY2soZGF0YVB0cik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBoYW5kbGVzKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghZGlzY29ubmVjdGVkKSB7Ci0gICAgICAgIG1IYXJkd2FyZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lQmF0Y2goZnJhbWVzKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFZpZGVvQnVmZmVyTW9kZShpbnQzMl90IHZpZGVvQnVmZmVyTW9kZSkgewotICAgIExPRzEoInNldFZpZGVvQnVmZmVyTW9kZTogJWQiLCB2aWRlb0J1ZmZlck1vZGUpOwotICAgIGJvb2wgZW5hYmxlTWV0YWRhdGFJbkJ1ZmZlcnMgPSBmYWxzZTsKLQotICAgIGlmICh2aWRlb0J1ZmZlck1vZGUgPT0gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19NRVRBREFUQSkgewotICAgICAgICBlbmFibGVNZXRhZGF0YUluQnVmZmVycyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICh2aWRlb0J1ZmZlck1vZGUgIT0gVklERU9fQlVGRkVSX01PREVfREFUQV9DQUxMQkFDS19ZVVYpIHsKLSAgICAgICAgQUxPR0UoIiVzOiAlZDogdmlkZW9CdWZmZXJNb2RlICVkIGlzIG5vdCBzdXBwb3J0ZWQuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKLSAgICAgICAgICAgICAgICB2aWRlb0J1ZmZlck1vZGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHJldHVybiBtSGFyZHdhcmUtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoZW5hYmxlTWV0YWRhdGFJbkJ1ZmZlcnMpOwotfQotCi1ib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIG1IYXJkd2FyZS0+cHJldmlld0VuYWJsZWQoKTsKLX0KLQotYm9vbCBDYW1lcmFDbGllbnQ6OnJlY29yZGluZ0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicmVjb3JkaW5nRW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gbUhhcmR3YXJlLT5yZWNvcmRpbmdFbmFibGVkKCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6YXV0b0ZvY3VzKCkgewotICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+YXV0b0ZvY3VzKCk7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkgewotICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgcmV0dXJuIG1IYXJkd2FyZS0+Y2FuY2VsQXV0b0ZvY3VzKCk7Ci19Ci0KLS8vIHRha2UgYSBwaWN0dXJlIC0gaW1hZ2UgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2sKLXN0YXR1c190IENhbWVyYUNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKLSAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgaWYgKChtc2dUeXBlICYgQ0FNRVJBX01TR19SQVdfSU1BR0UpICYmCi0gICAgICAgIChtc2dUeXBlICYgQ0FNRVJBX01TR19SQVdfSU1BR0VfTk9USUZZKSkgewotICAgICAgICBBTE9HRSgiQ0FNRVJBX01TR19SQVdfSU1BR0UgYW5kIENBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSIKLSAgICAgICAgICAgICAgICAiIGNhbm5vdCBiZSBib3RoIGVuYWJsZWQiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBXZSBvbmx5IGFjY2VwdCBwaWN0dXJlIHJlbGF0ZWQgbWVzc2FnZSB0eXBlcwotICAgIC8vIGFuZCBpZ25vcmUgb3RoZXIgdHlwZXMgb2YgbWVzc2FnZXMgZm9yIHRha2VQaWN0dXJlKCkuCi0gICAgaW50IHBpY01zZ1R5cGUgPSBtc2dUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAmIChDQU1FUkFfTVNHX1NIVVRURVIgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKTsKLQotICAgIGVuYWJsZU1zZ1R5cGUocGljTXNnVHlwZSk7Ci0KLSAgICByZXR1cm4gbUhhcmR3YXJlLT50YWtlUGljdHVyZSgpOwotfQotCi0vLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKLXN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgbUxhdGVzdFNldFBhcmFtZXRlcnMgPSBDYW1lcmFQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgQ2FtZXJhUGFyYW1ldGVycyBwKHBhcmFtcyk7Ci0gICAgcmV0dXJuIG1IYXJkd2FyZS0+c2V0UGFyYW1ldGVycyhwKTsKLX0KLQotLy8gZ2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCi1TdHJpbmc4IENhbWVyYUNsaWVudDo6Z2V0UGFyYW1ldGVycygpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgLy8gVGhlIGNhbWVyYSBzZXJ2aWNlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZ2V0IHRoZSBwYXJhbWV0ZXJzIGF0IGFsbCB0aW1lcwotICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgpOwotICAgIH0KLQotICAgIFN0cmluZzggcGFyYW1zKG1IYXJkd2FyZS0+Z2V0UGFyYW1ldGVycygpLmZsYXR0ZW4oKSk7Ci0gICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKLSAgICByZXR1cm4gcGFyYW1zOwotfQotCi0vLyBlbmFibGUgc2h1dHRlciBzb3VuZAotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjplbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpIHsKLSAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKLQotICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSByZXR1cm4gcmVzdWx0OwotCi0gICAgaWYgKGVuYWJsZSkgewotICAgICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBtUGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpIHsKLSAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwotICAgIGludCBvcmllbnRhdGlvbjsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7Ci0KLSAgICBpZiAoY21kID09IENBTUVSQV9DTURfU0VUX0RJU1BMQVlfT1JJRU5UQVRJT04pIHsKLSAgICAgICAgLy8gTWlycm9yIHRoZSBwcmV2aWV3IGlmIHRoZSBjYW1lcmEgaXMgZnJvbnQtZmFjaW5nLgotICAgICAgICBvcmllbnRhdGlvbiA9IGdldE9yaWVudGF0aW9uKGFyZzEsIG1DYW1lcmFGYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCk7Ci0gICAgICAgIGlmIChvcmllbnRhdGlvbiA9PSAtMSkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgICAgICBpZiAobU9yaWVudGF0aW9uICE9IG9yaWVudGF0aW9uKSB7Ci0gICAgICAgICAgICBtT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLSAgICAgICAgICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbUhhcmR3YXJlLT5zZXRQcmV2aWV3VHJhbnNmb3JtKG1PcmllbnRhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZiAoY21kID09IENBTUVSQV9DTURfRU5BQkxFX1NIVVRURVJfU09VTkQpIHsKLSAgICAgICAgc3dpdGNoIChhcmcxKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZVNodXR0ZXJTb3VuZChmYWxzZSk7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZVNodXR0ZXJTb3VuZCh0cnVlKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9QTEFZX1JFQ09SRElOR19TT1VORCkgewotICAgICAgICBzQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1JFQ09SRElOR19TVEFSVCk7Ci0gICAgfSBlbHNlIGlmIChjbWQgPT0gQ0FNRVJBX0NNRF9TRVRfVklERU9fQlVGRkVSX0NPVU5UKSB7Ci0gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSB0aGlzIGNvbW1hbmQKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0gZWxzZSBpZiAoY21kID09IENBTUVSQV9DTURfUElORykgewotICAgICAgICAvLyBJZiBtSGFyZHdhcmUgaXMgMCwgY2hlY2tQaWRBbmRIYXJkd2FyZSB3aWxsIHJldHVybiBlcnJvci4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHJldHVybiBtSGFyZHdhcmUtPnNlbmRDb21tYW5kKGNtZCwgYXJnMSwgYXJnMik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKSB7Ci0gICAgYW5kcm9pZF9hdG9taWNfb3IobXNnVHlwZSwgJm1Nc2dFbmFibGVkKTsKLSAgICBtSGFyZHdhcmUtPmVuYWJsZU1zZ1R5cGUobXNnVHlwZSk7Ci19Ci0KLXZvaWQgQ2FtZXJhQ2xpZW50OjpkaXNhYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpIHsKLSAgICBhbmRyb2lkX2F0b21pY19hbmQofm1zZ1R5cGUsICZtTXNnRW5hYmxlZCk7Ci0gICAgbUhhcmR3YXJlLT5kaXNhYmxlTXNnVHlwZShtc2dUeXBlKTsKLX0KLQotI2RlZmluZSBDSEVDS19NRVNTQUdFX0lOVEVSVkFMIDEwIC8vIDEwbXMKLWJvb2wgQ2FtZXJhQ2xpZW50Ojpsb2NrSWZNZXNzYWdlV2FudGVkKGludDMyX3QgbXNnVHlwZSkgewotICAgIGludCBzbGVlcENvdW50ID0gMDsKLSAgICB3aGlsZSAobU1zZ0VuYWJsZWQgJiBtc2dUeXBlKSB7Ci0gICAgICAgIGlmIChtTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGlmIChzbGVlcENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgIExPRzEoImxvY2tJZk1lc3NhZ2VXYW50ZWQoJWQpOiB3YWl0ZWQgZm9yICVkIG1zIiwKLSAgICAgICAgICAgICAgICAgICAgbXNnVHlwZSwgc2xlZXBDb3VudCAqIENIRUNLX01FU1NBR0VfSU5URVJWQUwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBtZXNzYWdlcyBhcmUgbm8gbG9uZ2VyIGVuYWJsZWQgYWZ0ZXIgYWNxdWlyaW5nIGxvY2ssIHJlbGVhc2UgYW5kIGRyb3AgbWVzc2FnZQotICAgICAgICAgICAgaWYgKChtTXNnRW5hYmxlZCAmIG1zZ1R5cGUpID09IDApIHsKLSAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNsZWVwQ291bnQrKyA9PSAwKSB7Ci0gICAgICAgICAgICBMT0cxKCJsb2NrSWZNZXNzYWdlV2FudGVkKCVkKTogZW50ZXIgc2xlZXAiLCBtc2dUeXBlKTsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoQ0hFQ0tfTUVTU0FHRV9JTlRFUlZBTCAqIDEwMDApOwotICAgIH0KLSAgICBBTE9HVygibG9ja0lmTWVzc2FnZVdhbnRlZCglZCk6IGRyb3BwZWQgdW53YW50ZWQgbWVzc2FnZSIsIG1zZ1R5cGUpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3A8Q2FtZXJhQ2xpZW50PiBDYW1lcmFDbGllbnQ6OmdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcikgewotICAgIFN0cmluZzggY2FtZXJhSWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgKGludCkoaW50cHRyX3QpIHVzZXIpOwotICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IHNDYW1lcmFTZXJ2aWNlLT5tQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOwotICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIHNwPENhbWVyYUNsaWVudD57Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKS5nZXQoKSl9OwotICAgIH0KLSAgICByZXR1cm4gc3A8Q2FtZXJhQ2xpZW50PntudWxscHRyfTsKLX0KLQotLy8gQ2FsbGJhY2sgbWVzc2FnZXMgY2FuIGJlIGRpc3BhdGNoZWQgdG8gaW50ZXJuYWwgaGFuZGxlcnMgb3IgcGFzcyB0byBvdXIKLS8vIGNsaWVudCdzIGNhbGxiYWNrIGZ1bmN0aW9ucywgZGVwZW5kaW5nIG9uIHRoZSBtZXNzYWdlIHR5cGUuCi0vLwotLy8gbm90aWZ5Q2FsbGJhY2s6Ci0vLyAgICAgIENBTUVSQV9NU0dfU0hVVFRFUiAgICAgICAgICAgICAgaGFuZGxlU2h1dHRlcgotLy8gICAgICAob3RoZXJzKSAgICAgICAgICAgICAgICAgICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrCi0vLyBkYXRhQ2FsbGJhY2s6Ci0vLyAgICAgIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSAgICAgICAgaGFuZGxlUHJldmlld0RhdGEKLS8vICAgICAgQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSAgICAgICBoYW5kbGVQb3N0dmlldwotLy8gICAgICBDQU1FUkFfTVNHX1JBV19JTUFHRSAgICAgICAgICAgIGhhbmRsZVJhd1BpY3R1cmUKLS8vICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFICAgICBoYW5kbGVDb21wcmVzc2VkUGljdHVyZQotLy8gICAgICAob3RoZXJzKSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjawotLy8gZGF0YUNhbGxiYWNrVGltZXN0YW1wCi0vLyAgICAgIChvdGhlcnMpICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGF0YUNhbGxiYWNrVGltZXN0YW1wCi0KLXZvaWQgQ2FtZXJhQ2xpZW50Ojpub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwKLSAgICAgICAgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKSB7Ci0gICAgTE9HMigibm90aWZ5Q2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7Ci0KLSAgICBzcDxDYW1lcmFDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudEZyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSByZXR1cm47Ci0KLSAgICBpZiAoIWNsaWVudC0+bG9ja0lmTWVzc2FnZVdhbnRlZChtc2dUeXBlKSkgcmV0dXJuOwotCi0gICAgc3dpdGNoIChtc2dUeXBlKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19TSFVUVEVSOgotICAgICAgICAgICAgLy8gZXh0MSBpcyB0aGUgZGltZW5zaW9uIG9mIHRoZSB5dXYgcGljdHVyZS4KLSAgICAgICAgICAgIGNsaWVudC0+aGFuZGxlU2h1dHRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNOb3RpZnkobXNnVHlwZSwgZXh0MSwgZXh0Mik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhQ2xpZW50OjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLCB2b2lkKiB1c2VyKSB7Ci0gICAgTE9HMigiZGF0YUNhbGxiYWNrKCVkKSIsIG1zZ1R5cGUpOwotCi0gICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuOwotCi0gICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKLSAgICBpZiAoZGF0YVB0ciA9PSAwICYmIG1ldGFkYXRhID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIk51bGwgZGF0YSByZXR1cm5lZCBpbiBkYXRhIGNhbGxiYWNrIik7Ci0gICAgICAgIGNsaWVudC0+aGFuZGxlR2VuZXJpY05vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN3aXRjaCAobXNnVHlwZSAmIH5DQU1FUkFfTVNHX1BSRVZJRVdfTUVUQURBVEEpIHsKLSAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVByZXZpZXdEYXRhKG1zZ1R5cGUsIGRhdGFQdHIsIG1ldGFkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUU6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVBvc3R2aWV3KGRhdGFQdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBX01TR19SQVdfSU1BR0U6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZVJhd1BpY3R1cmUoZGF0YVB0cik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0U6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGRhdGFQdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNEYXRhKG1zZ1R5cGUsIGRhdGFQdHIsIG1ldGFkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcikgewotICAgIExPRzIoImRhdGFDYWxsYmFja1RpbWVzdGFtcCglZCkiLCBtc2dUeXBlKTsKLQotICAgIHNwPENhbWVyYUNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKTsKLSAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKLQotICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47Ci0KLSAgICBpZiAoZGF0YVB0ciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJOdWxsIGRhdGEgcmV0dXJuZWQgaW4gZGF0YSB3aXRoIHRpbWVzdGFtcCBjYWxsYmFjayIpOwotICAgICAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNOb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwgVU5LTk9XTl9FUlJPUiwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjbGllbnQtPmhhbmRsZUdlbmVyaWNEYXRhVGltZXN0YW1wKHRpbWVzdGFtcCwgbXNnVHlwZSwgZGF0YVB0cik7Ci19Ci0KLXZvaWQgQ2FtZXJhQ2xpZW50OjpoYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPEhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+JiBtc2dzLCB2b2lkKiB1c2VyKSB7Ci0gICAgTE9HMigiZGF0YUNhbGxiYWNrVGltZXN0YW1wQmF0Y2giKTsKLSAgICBzcDxDYW1lcmFDbGllbnQ+IGNsaWVudCA9IGdldENsaWVudEZyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKLQotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gY2xpZW50LT5tUmVtb3RlQ2FsbGJhY2s7Ci0gICAgY2xpZW50LT5tTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwICYmIG1zZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICBzaXplX3QgbiA9IG1zZ3Muc2l6ZSgpOwotICAgICAgICBzdGQ6OnZlY3Rvcjxuc2Vjc190PiB0aW1lc3RhbXBzOwotICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzOwotICAgICAgICB0aW1lc3RhbXBzLnJlc2VydmUobik7Ci0gICAgICAgIGhhbmRsZXMucmVzZXJ2ZShuKTsKLSAgICAgICAgZm9yIChhdXRvJiBtc2cgOiBtc2dzKSB7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBpZiAobXNnLmRhdGFQdHItPnNpemUoKSAhPSBzaXplb2YoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGRhdGFQdHIgZG9lcyBub3QgY29udGFpbiBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgICAgICAgICAgLy8gICAgICAgKHNlZSBkZWNsYXJhdGlvbiBmb3IgZGV0YWlscykuCi0gICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgICAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICAgICAgICAgIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgKm1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKG1zZy5kYXRhUHRyLT51bnNlY3VyZVBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEtPmVUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBtZXRhZGF0YS0+cEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhIHR5cGUgbWlzbWF0Y2ggb3IgbnVsbCBoYW5kbGUgcGFzc2VkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChjbGllbnQtPm1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnNMb2NrKTsKLSAgICAgICAgICAgICAgICBjbGllbnQtPm1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMucHVzaF9iYWNrKG1zZy5kYXRhUHRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRpbWVzdGFtcHMucHVzaF9iYWNrKG1zZy50aW1lc3RhbXApOwotICAgICAgICAgICAgaGFuZGxlcy5wdXNoX2JhY2soaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICBjLT5yZWNvcmRpbmdGcmFtZUhhbmRsZUNhbGxiYWNrVGltZXN0YW1wQmF0Y2godGltZXN0YW1wcywgaGFuZGxlcyk7Ci0gICAgfQotfQotCi0vLyBzbmFwc2hvdCB0YWtlbiBjYWxsYmFjawotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZVNodXR0ZXIodm9pZCkgewotICAgIGlmIChtUGxheVNodXR0ZXJTb3VuZCkgewotICAgICAgICBzQ2FtZXJhU2VydmljZS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1NIVVRURVIpOwotICAgIH0KLQotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gbVJlbW90ZUNhbGxiYWNrOwotICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfU0hVVFRFUiwgMCwgMCk7Ci0gICAgICAgIGlmICghbG9ja0lmTWVzc2FnZVdhbnRlZChDQU1FUkFfTVNHX1NIVVRURVIpKSByZXR1cm47Ci0gICAgfQotICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfU0hVVFRFUik7Ci0KLSAgICAvLyBTaHV0dGVycyBvbmx5IGhhcHBlbiBpbiByZXNwb25zZSB0byB0YWtlUGljdHVyZSwgc28gbWFyayBkZXZpY2UgYXMKLSAgICAvLyBpZGxlIG5vdywgdW50aWwgcHJldmlldyBpcyByZXN0YXJ0ZWQKLSAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKLSAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9TVEFURV9JRExFLAotICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSk7Ci0KLSAgICBtTG9jay51bmxvY2soKTsKLX0KLQotLy8gcHJldmlldyBjYWxsYmFjayAtIGZyYW1lIGJ1ZmZlciB1cGRhdGUKLXZvaWQgQ2FtZXJhQ2xpZW50OjpoYW5kbGVQcmV2aWV3RGF0YShpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpIHsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLQotICAgIC8vIGxvY2FsIGNvcHkgb2YgdGhlIGNhbGxiYWNrIGZsYWdzCi0gICAgaW50IGZsYWdzID0gbVByZXZpZXdDYWxsYmFja0ZsYWc7Ci0KLSAgICAvLyBpcyBjYWxsYmFjayBlbmFibGVkPwotICAgIGlmICghKGZsYWdzICYgQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfRU5BQkxFX01BU0spKSB7Ci0gICAgICAgIC8vIElmIHRoZSBlbmFibGUgYml0IGlzIG9mZiwgdGhlIGNvcHktb3V0IGFuZCBvbmUtc2hvdCBiaXRzIGFyZSBpZ25vcmVkCi0gICAgICAgIExPRzIoImZyYW1lIGNhbGxiYWNrIGlzIGRpc2FibGVkIik7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaG9sZCBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZSBjbGllbnQKLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLQotICAgIC8vIGNsZWFyIGNhbGxiYWNrIGZsYWdzIGlmIG5vIGNsaWVudCBvciBvbmUtc2hvdCBtb2RlCi0gICAgaWYgKGMgPT0gMCB8fCAobVByZXZpZXdDYWxsYmFja0ZsYWcgJiBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLKSkgewotICAgICAgICBMT0cyKCJEaXNhYmxlIHByZXZpZXcgY2FsbGJhY2siKTsKLSAgICAgICAgbVByZXZpZXdDYWxsYmFja0ZsYWcgJj0gfihDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19PTkVfU0hPVF9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19DT1BZX09VVF9NQVNLIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7Ci0gICAgICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSk7Ci0gICAgfQotCi0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICAvLyBJcyB0aGUgcmVjZWl2ZWQgZnJhbWUgY29waWVkIG91dCBvciBub3Q/Ci0gICAgICAgIGlmIChmbGFncyAmIENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX0NPUFlfT1VUX01BU0spIHsKLSAgICAgICAgICAgIExPRzIoImZyYW1lIGlzIGNvcGllZCIpOwotICAgICAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKG1zZ1R5cGUsIGMsIGhlYXAsIG9mZnNldCwgc2l6ZSwgbWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HMigiZnJhbWUgaXMgZm9yd2FyZGVkIik7Ci0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBtZW0sIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgIH0KLX0KLQotLy8gcGljdHVyZSBjYWxsYmFjayAtIHBvc3R2aWV3IGltYWdlIHJlYWR5Ci12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlUG9zdHZpZXcoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkgewotICAgIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUpOwotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBtUmVtb3RlQ2FsbGJhY2s7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSwgbWVtLCBOVUxMKTsKLSAgICB9Ci19Ci0KLS8vIHBpY3R1cmUgY2FsbGJhY2sgLSByYXcgaW1hZ2UgcmVhZHkKLXZvaWQgQ2FtZXJhQ2xpZW50OjpoYW5kbGVSYXdQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKLSAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1JBV19JTUFHRSk7Ci0KLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG1lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLQotICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiBjID0gbVJlbW90ZUNhbGxiYWNrOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIGlmIChjICE9IDApIHsKLSAgICAgICAgYy0+ZGF0YUNhbGxiYWNrKENBTUVSQV9NU0dfUkFXX0lNQUdFLCBtZW0sIE5VTEwpOwotICAgIH0KLX0KLQotLy8gcGljdHVyZSBjYWxsYmFjayAtIGNvbXByZXNzZWQgcGljdHVyZSByZWFkeQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pIHsKLSAgICBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpOwotCi0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBtUmVtb3RlQ2FsbGJhY2s7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2soQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLCBtZW0sIE5VTEwpOwotICAgIH0KLX0KLQotCi12b2lkIENhbWVyYUNsaWVudDo6aGFuZGxlR2VuZXJpY05vdGlmeShpbnQzMl90IG1zZ1R5cGUsCi0gICAgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwKSB7Ci0gICAgICAgIGMtPm5vdGlmeUNhbGxiYWNrKG1zZ1R5cGUsIGV4dDEsIGV4dDIpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZUdlbmVyaWNEYXRhKGludDMyX3QgbXNnVHlwZSwKLSAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7Ci0gICAgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+IGMgPSBtUmVtb3RlQ2FsbGJhY2s7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kYXRhQ2FsbGJhY2sobXNnVHlwZSwgZGF0YVB0ciwgbWV0YWRhdGEpOwotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmhhbmRsZUdlbmVyaWNEYXRhVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAotICAgIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpIHsKLSAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4gYyA9IG1SZW1vdGVDYWxsYmFjazsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBpZiAoYyAhPSAwICYmIGRhdGFQdHIgIT0gbnVsbHB0cikgewotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgZGF0YVB0ciBjb250YWlucyBhIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEuCi0gICAgICAgIGlmIChkYXRhUHRyLT5zaXplKCkgPT0gc2l6ZW9mKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBVc2luZyB1bnNlY3VyZVBvaW50ZXIoKSBoYXMgc29tZSBhc3NvY2lhdGVkIHNlY3VyaXR5IHBpdGZhbGxzCi0gICAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKLSAgICAgICAgICAgIC8vICAgICAgIGlzc3VlIChlLmcuIGJ5IGNvcHlpbmcpLgotICAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSAqbWV0YWRhdGEgPQotICAgICAgICAgICAgICAgIChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoZGF0YVB0ci0+dW5zZWN1cmVQb2ludGVyKCkpOwotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLT5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlID0gbWV0YWRhdGEtPnBIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBkYXRhUHRyIGNvbnRhaW5zIGEgbmF0aXZlIGhhbmRsZSwgc2VuZCBpdCB2aWEgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcC4KLSAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyc0xvY2spOwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMucHVzaF9iYWNrKGRhdGFQdHIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYy0+cmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAsIGhhbmRsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2tUaW1lc3RhbXAodGltZXN0YW1wLCBtc2dUeXBlLCBkYXRhUHRyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFDbGllbnQ6OmNvcHlGcmFtZUFuZFBvc3RDb3BpZWRGcmFtZSgKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKSB7Ci0gICAgTE9HMigiY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lIik7Ci0gICAgLy8gSXQgaXMgbmVjZXNzYXJ5IHRvIGNvcHkgb3V0IG9mIHBtZW0gYmVmb3JlIHNlbmRpbmcgdGhpcyB0bwotICAgIC8vIHRoZSBjYWxsYmFjay4gRm9yIGVmZmljaWVuY3ksIHJldXNlIHRoZSBzYW1lIE1lbW9yeUhlYXBCYXNlCi0gICAgLy8gcHJvdmlkZWQgaXQncyBiaWcgZW5vdWdoLiBEb24ndCBhbGxvY2F0ZSB0aGUgbWVtb3J5IG9yCi0gICAgLy8gcGVyZm9ybSB0aGUgY29weSBpZiB0aGVyZSdzIG5vIGNhbGxiYWNrLgotICAgIC8vIGhvbGQgdGhlIHByZXZpZXcgbG9jayB3aGlsZSB3ZSBncmFiIGEgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aWV3IGJ1ZmZlcgotICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBwcmV2aWV3QnVmZmVyOwotCi0gICAgaWYgKG1QcmV2aWV3QnVmZmVyID09IDApIHsKLSAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7Ci0gICAgfSBlbHNlIGlmIChzaXplID4gbVByZXZpZXdCdWZmZXItPnZpcnR1YWxTaXplKCkpIHsKLSAgICAgICAgbVByZXZpZXdCdWZmZXIuY2xlYXIoKTsKLSAgICAgICAgbVByZXZpZXdCdWZmZXIgPSBuZXcgTWVtb3J5SGVhcEJhc2Uoc2l6ZSwgMCwgTlVMTCk7Ci0gICAgfQotICAgIGlmIChtUHJldmlld0J1ZmZlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHByZXZpZXcgYnVmZmVyIik7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHByZXZpZXdCdWZmZXIgPSBtUHJldmlld0J1ZmZlcjsKLQotICAgIHZvaWQqIHByZXZpZXdCdWZmZXJCYXNlID0gcHJldmlld0J1ZmZlci0+YmFzZSgpOwotICAgIHZvaWQqIGhlYXBCYXNlID0gaGVhcC0+YmFzZSgpOwotCi0gICAgaWYgKGhlYXBCYXNlID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbW1hcCBoZWFwIGZvciBwcmV2aWV3IGZyYW1lLiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChwcmV2aWV3QnVmZmVyQmFzZSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIG1tYXAgcHJldmlldyBidWZmZXIgZm9yIHByZXZpZXcgZnJhbWUuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1jcHkocHJldmlld0J1ZmZlckJhc2UsICh1aW50OF90ICopIGhlYXBCYXNlICsgb2Zmc2V0LCBzaXplKTsKLQotICAgIHNwPE1lbW9yeUJhc2U+IGZyYW1lID0gbmV3IE1lbW9yeUJhc2UocHJldmlld0J1ZmZlciwgMCwgc2l6ZSk7Ci0gICAgaWYgKGZyYW1lID09IDApIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgZnJhbWUgY2FsbGJhY2siKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICBjbGllbnQtPmRhdGFDYWxsYmFjayhtc2dUeXBlLCBmcmFtZSwgbWV0YWRhdGEpOwotfQotCi1pbnQgQ2FtZXJhQ2xpZW50OjpnZXRPcmllbnRhdGlvbihpbnQgZGVncmVlcywgYm9vbCBtaXJyb3IpIHsKLSAgICBpZiAoIW1pcnJvcikgewotICAgICAgICBpZiAoZGVncmVlcyA9PSAwKSByZXR1cm4gMDsKLSAgICAgICAgZWxzZSBpZiAoZGVncmVlcyA9PSA5MCkgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fUk9UXzkwOwotICAgICAgICBlbHNlIGlmIChkZWdyZWVzID09IDE4MCkgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKLSAgICAgICAgZWxzZSBpZiAoZGVncmVlcyA9PSAyNzApIHJldHVybiBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7Ci0gICAgfSBlbHNlIHsgIC8vIERvIG1pcnJvciAoaG9yaXpvbnRhbCBmbGlwKQotICAgICAgICBpZiAoZGVncmVlcyA9PSAwKSB7ICAgICAgICAgICAvLyBGTElQX0ggYW5kIFJPVF8wCi0gICAgICAgICAgICByZXR1cm4gSEFMX1RSQU5TRk9STV9GTElQX0g7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVncmVlcyA9PSA5MCkgeyAgIC8vIEZMSVBfSCBhbmQgUk9UXzkwCi0gICAgICAgICAgICByZXR1cm4gSEFMX1RSQU5TRk9STV9GTElQX0ggfCBIQUxfVFJBTlNGT1JNX1JPVF85MDsKLSAgICAgICAgfSBlbHNlIGlmIChkZWdyZWVzID09IDE4MCkgeyAgLy8gRkxJUF9IIGFuZCBST1RfMTgwCi0gICAgICAgICAgICByZXR1cm4gSEFMX1RSQU5TRk9STV9GTElQX1Y7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVncmVlcyA9PSAyNzApIHsgIC8vIEZMSVBfSCBhbmQgUk9UXzI3MAotICAgICAgICAgICAgcmV0dXJuIEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR0UoIkludmFsaWQgc2V0RGlzcGxheU9yaWVudGF0aW9uIGRlZ3JlZXM9JWQiLCBkZWdyZWVzKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0VmlkZW9UYXJnZXQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSB7Ci0gICAgKHZvaWQpYnVmZmVyUHJvZHVjZXI7Ci0gICAgQUxPR0UoIiVzOiAlZDogQ2FtZXJhQ2xpZW50IGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nIGEgdmlkZW8gdGFyZ2V0LiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRBdWRpb1Jlc3RyaWN0aW9uKGludCBtb2RlKSB7Ci0gICAgaWYgKCFpc1ZhbGlkQXVkaW9SZXN0cmljdGlvbihtb2RlKSkgewotICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXVkaW8gcmVzdHJpY3Rpb24gbW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgbW9kZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gQmFzaWNDbGllbnQ6OnNldEF1ZGlvUmVzdHJpY3Rpb24obW9kZSk7Ci19Ci0KLWludDMyX3QgQ2FtZXJhQ2xpZW50OjpnZXRHbG9iYWxBdWRpb1Jlc3RyaWN0aW9uKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpnZXRTZXJ2aWNlQXVkaW9SZXN0cmljdGlvbigpOwotfQotCi0vLyBBUEkxLT5EZXZpY2UxIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlCi1zdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFJvdGF0ZUFuZENyb3BPdmVycmlkZSh1aW50OF90IC8qcm90YXRlQW5kQ3JvcCovKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZWI5NjAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQUNMSUVOVF9ICi0jZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBQ0xJRU5UX0gKLQotI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZW1vcnlIZWFwQmFzZTsKLWNsYXNzIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOwotCi0vKioKLSAqIEludGVyZmFjZSBiZXR3ZWVuIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhIEFQSSBhbmQgQ2FtZXJhIEhBTCBkZXZpY2UgZm9yIHZlcnNpb24KLSAqIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wLgotICovCi0KLWNsYXNzIENhbWVyYUNsaWVudCA6IHB1YmxpYyBDYW1lcmFTZXJ2aWNlOjpDbGllbnQKLXsKLXB1YmxpYzoKLSAgICAvLyBJQ2FtZXJhIGludGVyZmFjZSAoc2VlIElDYW1lcmEgZm9yIGRldGFpbHMpCi0gICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgZGlzY29ubmVjdCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGxvY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB1bmxvY2soKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQcmV2aWV3VGFyZ2V0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgZmxhZyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UHJldmlld0NhbGxiYWNrVGFyZ2V0KAotICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGNhbGxiYWNrUHJvZHVjZXIpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UHJldmlldygpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgcHJldmlld0VuYWJsZWQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRWaWRlb0J1ZmZlck1vZGUoaW50MzJfdCB2aWRlb0J1ZmZlck1vZGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UmVjb3JkaW5nKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgc3RvcFJlY29yZGluZygpOwotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIHJlY29yZGluZ0VuYWJsZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZWxlYXNlUmVjb3JkaW5nRnJhbWVIYW5kbGVCYXRjaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+JiBoYW5kbGVzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBhdXRvRm9jdXMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBjYW5jZWxBdXRvRm9jdXMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB0YWtlUGljdHVyZShpbnQgbXNnVHlwZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwotICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgICAgIGdldFBhcmFtZXRlcnMoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvVGFyZ2V0KGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9SZXN0cmljdGlvbihpbnQgbW9kZSk7Ci0gICAgdmlydHVhbCBpbnQzMl90ICAgICAgICAgZ2V0R2xvYmFsQXVkaW9SZXN0cmljdGlvbigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0Um90YXRlQW5kQ3JvcE92ZXJyaWRlKHVpbnQ4X3Qgb3ZlcnJpZGUpOwotCi0gICAgLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQotICAgIENhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKLSAgICAgICAgICAgIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwotICAgIH5DYW1lcmFDbGllbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi1wcml2YXRlOgotCi0gICAgLy8gY2hlY2sgd2hldGhlciB0aGUgY2FsbGluZyBwcm9jZXNzIG1hdGNoZXMgbUNsaWVudFBpZC4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBjaGVja1BpZCgpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdDsgIC8vIGFsc28gY2hlY2sgbUhhcmR3YXJlICE9IDAKLQotICAgIC8vIHRoZXNlIGFyZSBpbnRlcm5hbCBmdW5jdGlvbnMgdXNlZCB0byBzZXQgdXAgcHJldmlldyBidWZmZXJzCi0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcmV2aWV3QnVmZmVycygpOwotCi0gICAgLy8gY2FtZXJhIG9wZXJhdGlvbiBtb2RlCi0gICAgZW51bSBjYW1lcmFfbW9kZSB7Ci0gICAgICAgIENBTUVSQV9QUkVWSUVXX01PREUgICA9IDAsICAvLyBmcmFtZSBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkCi0gICAgICAgIENBTUVSQV9SRUNPUkRJTkdfTU9ERSA9IDEsICAvLyBmcmFtZSBoYXMgdG8gYmUgZXhwbGljaXRseSByZWxlYXNlZCBieSByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKQotICAgIH07Ci0gICAgLy8gdGhlc2UgYXJlIGludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGZvciBwcmV2aWV3L3JlY29yZGluZwotICAgIHN0YXR1c190ICAgICAgICAgICAgICAgIHN0YXJ0Q2FtZXJhTW9kZShjYW1lcmFfbW9kZSBtb2RlKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzdGFydFByZXZpZXdNb2RlKCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc3RhcnRSZWNvcmRpbmdNb2RlKCk7Ci0KLSAgICAvLyBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGJ5IHNlbmRDb21tYW5kIHRvIGVuYWJsZS9kaXNhYmxlIHNodXR0ZXIgc291bmQuCi0gICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgZW5hYmxlU2h1dHRlclNvdW5kKGJvb2wgZW5hYmxlKTsKLQotICAgIHN0YXRpYyBzcDxDYW1lcmFDbGllbnQ+ICAgICAgICBnZXRDbGllbnRGcm9tQ29va2llKHZvaWQqIHVzZXIpOwotCi0gICAgLy8gdGhlc2UgYXJlIHN0YXRpYyBjYWxsYmFjayBmdW5jdGlvbnMKLSAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKTsKLSAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwKLSAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwgdm9pZCogdXNlcik7Ci0gICAgc3RhdGljIHZvaWQgICAgICAgICAgICAgZGF0YUNhbGxiYWNrVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IG1zZ1R5cGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhUHRyLCB2b2lkKiB1c2VyKTsKLSAgICBzdGF0aWMgdm9pZCAgICAgICAgICAgICBoYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzdGQ6OnZlY3RvcjxIYW5kbGVUaW1lc3RhbXBNZXNzYWdlPiYsIHZvaWQqIHVzZXIpOwotICAgIC8vIGhhbmRsZXJzIGZvciBtZXNzYWdlcwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNodXR0ZXIodm9pZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJldmlld0RhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgbWVtLAotICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVQb3N0dmlldyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBoYW5kbGVSYXdQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbXByZXNzZWRQaWN0dXJlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGhhbmRsZUdlbmVyaWNOb3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2VuZXJpY0RhdGEoaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwKLSAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2VuZXJpY0RhdGFUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnVHlwZSwgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOwotCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgY29weUZyYW1lQW5kUG9zdENvcGllZEZyYW1lKAotICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAotICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOwotCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uLCBib29sIG1pcnJvcik7Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXRQcmV2aWV3V2luZG93KAotICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgd2luZG93KTsKLQotCi0gICAgLy8gdGhlc2UgYXJlIGluaXRpYWxpemVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gICAgIG1IYXJkd2FyZTsgICAgICAgLy8gY2xlYXJlZCBhZnRlciBkaXNjb25uZWN0KCkKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOyAgICAgLy8gQ3VycmVudCBkaXNwbGF5IG9yaWVudGF0aW9uCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheVNodXR0ZXJTb3VuZDsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWdhY3lNb2RlOyAvLyBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZT8KLQotICAgIC8vIEVuc3VyZXMgYXRvbWljaXR5IGFtb25nIHRoZSBwdWJsaWMgbWV0aG9kcwotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgLy8gVGhpcyBpcyBhIGJpbmRlciBvZiBTdXJmYWNlIG9yIFN1cmZhY2UuCi0gICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZTsKLSAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICAgICAgIG1QcmV2aWV3V2luZG93OwotCi0gICAgLy8gSWYgdGhlIHVzZXIgd2FudCB1cyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBwcmV2aWV3IGZyYW1lIChpbnN0ZWFkCi0gICAgLy8gb2YgdGhlIG9yaWdpbmFsIG9uZSksIHdlIGFsbG9jYXRlIG1QcmV2aWV3QnVmZmVyIGFuZCByZXVzZSBpdCBpZiBwb3NzaWJsZS4KLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gICAgICAgICAgICAgIG1QcmV2aWV3QnVmZmVyOwotCi0gICAgLy8gRGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICAgQ2FtZXJhUGFyYW1ldGVycyAgICAgICAgICAgICAgICBtTGF0ZXN0U2V0UGFyYW1ldGVyczsKLQotICAgIC8vIG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnMgc3RvcmVzIHNwPElNZW1vcnk+IHRoYXQgSEFMIHVzZXMgdG8gc2VuZCBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhLgotICAgIC8vIEl0IHdpbGwgYmUgdXNlZCB0byBzZW5kIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgYmFjayB0byBIQUwgd2hlbiBjYW1lcmEgcmVjZWl2ZXMgdGhlCi0gICAgLy8gbmF0aXZlIGhhbmRsZSBmcm9tIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZS4KLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVDYWxsYmFja0J1ZmZlcnNMb2NrOwotICAgIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+PiAgICAgICAgbUF2YWlsYWJsZUNhbGxiYWNrQnVmZmVyczsKLQotICAgIC8vIFdlIG5lZWQgdG8gYXZvaWQgdGhlIGRlYWRsb2NrIHdoZW4gdGhlIGluY29taW5nIGNvbW1hbmQgdGhyZWFkIGFuZAotICAgIC8vIHRoZSBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSBjYWxsYmFjayB0aHJlYWQgYm90aCB3YW50IHRvIGdyYWIgbUxvY2suCi0gICAgLy8gQW4gZXh0cmEgZmxhZyBpcyB1c2VkIHRvIHRlbGwgdGhlIGNhbGxiYWNrIHRocmVhZCB0aGF0IGl0IHNob3VsZCBzdG9wCi0gICAgLy8gdHJ5aW5nIHRvIGRlbGl2ZXIgdGhlIGNhbGxiYWNrIG1lc3NhZ2VzIGlmIHRoZSBjbGllbnQgaXMgbm90Ci0gICAgLy8gaW50ZXJlc3RlZCBpbiBpdCBhbnltb3JlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNsaWVudCBpcyBjYWxsaW5nCi0gICAgLy8gc3RvcFByZXZpZXcoKSwgdGhlIHByZXZpZXcgZnJhbWUgbWVzc2FnZXMgZG8gbm90IG5lZWQgdG8gYmUgZGVsaXZlcmVkCi0gICAgLy8gYW55bW9yZS4KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHNhbWUgcGFyYW1ldGVyIGFzIHRoZSBlbmFibGVNc2dUeXBlKCkgYW5kCi0gICAgLy8gZGlzYWJsZU1zZ1R5cGUoKSBmdW5jdGlvbnMgaW4gQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZW5hYmxlTXNnVHlwZShpbnQzMl90IG1zZ1R5cGUpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgIGRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSk7Ci0gICAgdm9sYXRpbGUgaW50MzJfdCAgICAgICAgbU1zZ0VuYWJsZWQ7Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyeWluZyB0byBncmFiIG1Mb2NrLCBvciBnaXZlIHVwIGlmIHRoZSBtZXNzYWdlCi0gICAgLy8gaXMgZm91bmQgdG8gYmUgZGlzYWJsZWQuIEl0IHJldHVybnMgdHJ1ZSBpZiBtTG9jayBpcyBncmFiYmVkLgotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGxvY2tJZk1lc3NhZ2VXYW50ZWQoaW50MzJfdCBtc2dUeXBlKTsKLX07Ci0KLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAppbmRleCBhNzFhNzMyLi5lZTc2NGVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKQEAgLTMxLDEyICszMSwxNSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTIgewogCit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzA7CisKIENhbGxiYWNrUHJvY2Vzc29yOjpDYWxsYmFja1Byb2Nlc3NvcihzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQpOgogICAgICAgICBUaHJlYWQoZmFsc2UpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1EZXZpY2UoY2xpZW50LT5nZXRDYW1lcmFEZXZpY2UoKSksCiAgICAgICAgIG1JZChjbGllbnQtPmdldENhbWVyYUlkKCkpLAogICAgICAgICBtQ2FsbGJhY2tBdmFpbGFibGUoZmFsc2UpLAorICAgICAgICBtQ2FsbGJhY2tQYXVzZWQodHJ1ZSksCiAgICAgICAgIG1DYWxsYmFja1RvQXBwKGZhbHNlKSwKICAgICAgICAgbUNhbGxiYWNrU3RyZWFtSWQoTk9fU1RSRUFNKSB7CiB9CkBAIC0xNTQsOCArMTU3LDggQEAKICAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgcGFyYW1zLnByZXZpZXdGb3JtYXQpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FsbGJhY2tXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsIGNhbGxiYWNrRm9ybWF0LAotICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfSkZJRiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1DYWxsYmFja1N0cmVhbUlkLAotICAgICAgICAgICAgICAgIFN0cmluZzgoKSk7CisgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9KRklGLCBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FsbGJhY2tTdHJlYW1JZCwKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCksIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PntBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFR9KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYWxsYmFja3M6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTIxNCw2ICsyMTcsMTQgQEAKICAgICByZXR1cm4gbUNhbGxiYWNrU3RyZWFtSWQ7CiB9CiAKK3ZvaWQgQ2FsbGJhY2tQcm9jZXNzb3I6OnVucGF1c2VDYWxsYmFjaygpIHsKKyAgICBtQ2FsbGJhY2tQYXVzZWQgPSBmYWxzZTsKK30KKwordm9pZCBDYWxsYmFja1Byb2Nlc3Nvcjo6cGF1c2VDYWxsYmFjaygpIHsKKyAgICBtQ2FsbGJhY2tQYXVzZWQgPSB0cnVlOworfQorCiB2b2lkIENhbGxiYWNrUHJvY2Vzc29yOjpkdW1wKGludCAvKmZkKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdCB7CiB9CiAKQEAgLTIzMiw3ICsyNDMsNyBAQAogCiAgICAgZG8gewogICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNsaWVudCA9PSAwKSB7CisgICAgICAgIGlmIChjbGllbnQgPT0gMCB8fCBtQ2FsbGJhY2tQYXVzZWQpIHsKICAgICAgICAgICAgIHJlcyA9IGRpc2NhcmROZXdDYWxsYmFjaygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzID0gcHJvY2Vzc05ld0NhbGxiYWNrKGNsaWVudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCmluZGV4IDUyMzE2ODguLmEzMzYzMjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBMl9DQUxMQkFDS1BST0NFU1NPUl9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBMl9DQUxMQkFDS1BST0NFU1NPUl9ICiAKKyNpbmNsdWRlIDxhdG9taWM+CisKICNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtNTIsNiArNTQsOSBAQAogICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOwogICAgIGludCBnZXRTdHJlYW1JZCgpIGNvbnN0OwogCisgICAgdm9pZCB1bnBhdXNlQ2FsbGJhY2soKTsKKyAgICB2b2lkIHBhdXNlQ2FsbGJhY2soKTsKKwogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKQEAgLTY3LDYgKzcyLDggQEAKICAgICAgICAgTk9fU1RSRUFNID0gLTEKICAgICB9OwogCisgICAgc3RkOjphdG9taWM8Ym9vbD4gbUNhbGxiYWNrUGF1c2VkOworCiAgICAgLy8gVHJ1ZSBpZiBtQ2FsbGJhY2tXaW5kb3cgaXMgYSByZW1vdGUgY29uc3VtZXIsIGZhbHNlIGlmIGp1c3QgdGhlIGxvY2FsCiAgICAgLy8gbUNhbGxiYWNrQ29uc3VtZXIKICAgICBib29sIG1DYWxsYmFja1RvQXBwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IDBjMDFhOTEuLjRjOWI3ZWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTcwNiw3ICs3MDYsNyBAQAogCiAgICAgaWYgKG1DYXB0dXJlUmVxdWVzdC5lbnRyeUNvdW50KCkgPT0gMCkgewogICAgICAgICByZXMgPSBjbGllbnQtPmdldENhbWVyYURldmljZSgpLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKLSAgICAgICAgICAgICAgICBDQU1FUkEyX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsCisgICAgICAgICAgICAgICAgY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdDo6Q0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsCiAgICAgICAgICAgICAgICAgJm1DYXB0dXJlUmVxdWVzdCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgc3RpbGwgaW1hZ2UgcmVxdWVzdDoiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggZGRmZTVlMy4uZWVkMjY1NCAxMDA3NTUKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtMzUsNiArMzUsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTIgewogCit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzA7CisKIEpwZWdQcm9jZXNzb3I6OkpwZWdQcm9jZXNzb3IoCiAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LAogICAgIHdwPENhcHR1cmVTZXF1ZW5jZXI+IHNlcXVlbmNlcik6CkBAIC0xNDgsOCArMTUwLDggQEAKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUNhcHR1cmVXaW5kb3csCiAgICAgICAgICAgICAgICAgcGFyYW1zLnBpY3R1cmVXaWR0aCwgcGFyYW1zLnBpY3R1cmVIZWlnaHQsCiAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBIQUxfREFUQVNQQUNFX1YwX0pGSUYsCi0gICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1DYXB0dXJlU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgpKTsKKyAgICAgICAgICAgICAgICBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FwdHVyZVN0cmVhbUlkLAorICAgICAgICAgICAgICAgIFN0cmluZzgoKSwgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+e0FORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVH0pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0gZm9yIGNhcHR1cmU6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAppbmRleCBkYmM4NjNiLi44MDUwOGU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCkBAIC0yOSw3ICsyOSw3IEBACiAKICNpbmNsdWRlICJQYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAic3lzdGVtL2NhbWVyYS5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYV9jb21tb24uaCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CkBAIC0zNyw2ICszNyw4IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CiAKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNBTUVSQV9URU1QTEFURV9QUkVWSUVXOworCiBQYXJhbWV0ZXJzOjpQYXJhbWV0ZXJzKGludCBjYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZykgOgogICAgICAgICBjYW1lcmFJZChjYW1lcmFJZCksCkBAIC0xMjQ2LDYgKzEyNDgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZhc3RJbmZvLm1heFpzbFNpemUgPSBtYXhQcml2SW5wdXRTaXplOworICAgICAgICBmYXN0SW5mby51c2VkWnNsU2l6ZSA9IG1heFByaXZJbnB1dFNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmFzdEluZm8ubWF4WnNsU2l6ZSA9IHswLCAwfTsKICAgICB9CkBAIC0yMDQ2LDEyICsyMDQ5LDMzIEBACiAKICAgICBzbG93SnBlZ01vZGUgPSBmYWxzZTsKICAgICBTaXplIHBpY3R1cmVTaXplID0geyBwaWN0dXJlV2lkdGgsIHBpY3R1cmVIZWlnaHQgfTsKLSAgICBpbnQ2NF90IG1pbkZyYW1lRHVyYXRpb25OcyA9IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMocGljdHVyZVNpemUpOwotICAgIGlmIChwcmV2aWV3RnBzUmFuZ2VbMV0gPiAxZTkvbWluRnJhbWVEdXJhdGlvbk5zICsgRlBTX01BUkdJTikgeworICAgIGJvb2wgenNsRnJhbWVSYXRlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgaW50NjRfdCBqcGVnTWluRnJhbWVEdXJhdGlvbk5zID0gZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhwaWN0dXJlU2l6ZSk7CisgICAgaWYgKHByZXZpZXdGcHNSYW5nZVsxXSA+IDFlOS9qcGVnTWluRnJhbWVEdXJhdGlvbk5zICsgRlBTX01BUkdJTikgewogICAgICAgICBzbG93SnBlZ01vZGUgPSB0cnVlOwogICAgIH0KLSAgICBpZiAoaXNEZXZpY2Vac2xTdXBwb3J0ZWQgfHwgc2xvd0pwZWdNb2RlIHx8Ci0gICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgiY2FtZXJhLmRpc2FibGVfenNsX21vZGUiLCBmYWxzZSkpIHsKKyAgICBpZiAoaXNac2xSZXByb2Nlc3NQcmVzZW50KSB7CisgICAgICAgIHVuc2lnbmVkIGludCBmaXJzdEFwaUxldmVsID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFVpbnRQcm9wZXJ0eTx1bnNpZ25lZCBpbnQ+KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIDApOworICAgICAgICBTaXplIGNob3NlblNpemU7CisgICAgICAgIGlmICgoZmlyc3RBcGlMZXZlbCA+PSBfX0FORFJPSURfQVBJX1NfXykgJiYKKyAgICAgICAgICAgICFhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmNhbWVyYS5lbmFibGVDYW1lcmExTWF4WnNsIiwgZmFsc2UpKSB7CisgICAgICAgICAgICBjaG9zZW5TaXplID0gcGljdHVyZVNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gZm9sbG93IG9sZCBiZWhhdmlvciBvZiBrZWVwaW5nIG1heCB6c2wgc2l6ZSBhcyB0aGUgaW5wdXQgLyBvdXRwdXQKKyAgICAgICAgICAvLyB6c2wgc3RyZWFtIHNpemUKKyAgICAgICAgICBjaG9zZW5TaXplID0gZmFzdEluZm8ubWF4WnNsU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHpzbE1pbkZyYW1lRHVyYXRpb25OcyA9IGdldFpzbFN0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhjaG9zZW5TaXplKTsKKyAgICAgICAgaWYgKHpzbE1pbkZyYW1lRHVyYXRpb25OcyA+IDAgJiYKKyAgICAgICAgICAgICAgICBwcmV2aWV3RnBzUmFuZ2VbMV0gPD0gKDFlOS96c2xNaW5GcmFtZUR1cmF0aW9uTnMgKyBGUFNfTUFSR0lOKSkgeworICAgICAgICAgICAgenNsRnJhbWVSYXRlU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGZhc3RJbmZvLnVzZWRac2xTaXplID0gY2hvc2VuU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc0RldmljZVpzbFN1cHBvcnRlZCB8fCBzbG93SnBlZ01vZGUgfHwgIXpzbEZyYW1lUmF0ZVN1cHBvcnRlZCB8fAorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJjYW1lcmEuZGlzYWJsZV96c2xfbW9kZSIsIGZhbHNlKSkgewogICAgICAgICBhbGxvd1pzbE1vZGUgPSBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBhbGxvd1pzbE1vZGUgPSBpc1pzbFJlcHJvY2Vzc1ByZXNlbnQ7CkBAIC0yNDY4LDcgKzI0OTIsNyBAQAogCiAgICAgICAgIC8vIFVzZSBmb2NhbCBsZW5ndGggaW4gcHJldmlldyB0ZW1wbGF0ZSBpZiBpdCBleGlzdHMKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcHJldmlld1RlbXBsYXRlOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfUFJFVklFVywgJnByZXZpZXdUZW1wbGF0ZSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVcsICZwcmV2aWV3VGVtcGxhdGUpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgZGVmYXVsdCBQUkVWSUVXIHJlcXVlc3Q6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjk3NSw3ICsyOTk5LDcgQEAKICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CiAgICAgICAgIGlmIChzYy5pc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCiAgICAgICAgICAgICAgICAgc2MuZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgICAgIHNjLndpZHRoIDw9IGxpbWl0LndpZHRoICYmIHNjLmhlaWdodCA8PSBsaW1pdC5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAoKHNjLndpZHRoICogc2MuaGVpZ2h0KSA8PSAobGltaXQud2lkdGggKiBsaW1pdC5oZWlnaHQpKSkgewogICAgICAgICAgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uID0gZ2V0TWluRnJhbWVEdXJhdGlvbk5zKAogICAgICAgICAgICAgICAgICAgICB7c2Mud2lkdGgsIHNjLmhlaWdodH0sIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7CiAgICAgICAgICAgICBpZiAobWluRnJhbWVEdXJhdGlvbiA+IE1BWF9QUkVWSUVXX1JFQ09SRF9EVVJBVElPTl9OUykgewpAQCAtMzA1NSw2ICszMDc5LDEwIEBACiAgICAgcmV0dXJuIGdldE1pbkZyYW1lRHVyYXRpb25OcyhzaXplLCBIQUxfUElYRUxfRk9STUFUX0JMT0IpOwogfQogCitpbnQ2NF90IFBhcmFtZXRlcnM6OmdldFpzbFN0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpIHsKKyAgICByZXR1cm4gZ2V0TWluRnJhbWVEdXJhdGlvbk5zKHNpemUsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKIGludDY0X3QgUGFyYW1ldGVyczo6Z2V0TWluRnJhbWVEdXJhdGlvbk5zKFBhcmFtZXRlcnM6OlNpemUgc2l6ZSwgaW50IGZtdCkgewogICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fU0laRSA9IDQ7CiAgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKQEAgLTMyNTMsNiArMzI4MSw4IEBACiAKIHN0YXR1c190IFBhcmFtZXRlcnM6OmNhbGN1bGF0ZVBpY3R1cmVGb3ZzKGZsb2F0ICpob3JpekZvdiwgZmxvYXQgKnZlcnRGb3YpCiAgICAgICAgIGNvbnN0IHsKKyAgICAvLyBGb3IgZXh0ZXJuYWwgY2FtZXJhLCB1c2UgRk9WcyA9ICgtMS4wLCAtMS4wKSBhcyBkZWZhdWx0IHZhbHVlcy4gQ2FsY3VsYXRlCisgICAgLy8gRk9WcyBvbmx5IGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgaW5mb3JtYXRpb24uCiAgICAgaWYgKGZhc3RJbmZvLmlzRXh0ZXJuYWxDYW1lcmEpIHsKICAgICAgICAgaWYgKGhvcml6Rm92ICE9IE5VTEwpIHsKICAgICAgICAgICAgICpob3JpekZvdiA9IC0xLjA7CkBAIC0zMjYwLDE2ICszMjkwLDI5IEBACiAgICAgICAgIGlmICh2ZXJ0Rm92ICE9IE5VTEwpIHsKICAgICAgICAgICAgICp2ZXJ0Rm92ID0gLTEuMDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3Qgc2Vuc29yU2l6ZSA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSwgMiwgMik7Ci0gICAgaWYgKCFzZW5zb3JTaXplLmNvdW50KSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAoIXNlbnNvclNpemUuY291bnQpIHsKKyAgICAgICAgLy8gSXQgaXMgbm9uLWZhdGFsIGZvciBleHRlcm5hbCBjYW1lcmFzIHNpbmNlIGl0IGhhcyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaWYgKGZhc3RJbmZvLmlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQogCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGl4ZWxBcnJheVNpemUgPQogICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NFTlNPUl9JTkZPX1BJWEVMX0FSUkFZX1NJWkUsIDIsIDIpOwotICAgIGlmICghcGl4ZWxBcnJheVNpemUuY291bnQpIHJldHVybiBOT19JTklUOworICAgIGlmICghcGl4ZWxBcnJheVNpemUuY291bnQpIHsKKyAgICAgICAgLy8gSXQgaXMgbm9uLWZhdGFsIGZvciBleHRlcm5hbCBjYW1lcmFzIHNpbmNlIGl0IGhhcyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaWYgKGZhc3RJbmZvLmlzRXh0ZXJuYWxDYW1lcmEpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQogCiAgICAgZmxvYXQgYXJyYXlBc3BlY3QgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZmFzdEluZm8uYXJyYXlXaWR0aCkgLwogICAgICAgICAgICAgZmFzdEluZm8uYXJyYXlIZWlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCAzYTcwOWM5Li5lMmY4ZDAxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCkBAIC01Niw3ICs1Niw3IEBACiAgICAgaW50IHByZXZpZXdUcmFuc2Zvcm07IC8vIHNldCBieSBDQU1FUkFfQ01EX1NFVF9ESVNQTEFZX09SSUVOVEFUSU9OCiAKICAgICBpbnQgcGljdHVyZVdpZHRoLCBwaWN0dXJlSGVpZ2h0OwotICAgIC8vIFN0b3JlIHRoZSBwaWN0dXJlIHNpemUgYmVmb3JlIHRoZXkgYXJlIG92ZXJyaWRlbiBieSB2aWRlbyBzbmFwc2hvdAorICAgIC8vIFN0b3JlIHRoZSBwaWN0dXJlIHNpemUgYmVmb3JlIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgdmlkZW8gc25hcHNob3QKICAgICBpbnQgcGljdHVyZVdpZHRoTGFzdFNldCwgcGljdHVyZUhlaWdodExhc3RTZXQ7CiAgICAgYm9vbCBwaWN0dXJlU2l6ZU92ZXJyaWRlbjsKIApAQCAtMjQ4LDYgKzI0OCw3IEBACiAgICAgICAgIGJvb2wgdXNlRmxleGlibGVZdXY7CiAgICAgICAgIFNpemUgbWF4SnBlZ1NpemU7CiAgICAgICAgIFNpemUgbWF4WnNsU2l6ZTsKKyAgICAgICAgU2l6ZSB1c2VkWnNsU2l6ZTsKICAgICAgICAgYm9vbCBzdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3M7CiAgICAgfSBmYXN0SW5mbzsKIApAQCAtNDI2LDYgKzQyNywxMSBAQAogICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKICAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYQorICAgIC8vIElNUExFTUVOVEFUSU9OX0RFRklORUQgc3RyZWFtIG9mIHNpemUgJ3NpemUnCisgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKKyAgICBpbnQ2NF90IGdldFpzbFN0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIHNpemUvZm9ybWF0IGNvbWJpbmF0aW9uCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IHNpemUvZm9ybWF0IGNvbWJpbmF0aW9uIGNhbm5vdCBiZSBmb3VuZC4KICAgICBpbnQ2NF90IGdldE1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUsIGludCBmb3JtYXQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAppbmRleCAwNzg2ZjUzLi4yZDM1OTdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcApAQCAtNDAsNiArNDAsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBjYW1lcmEyIHsKIAordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc7Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpDQU1FUkFfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzsKKwogU3RyZWFtaW5nUHJvY2Vzc29yOjpTdHJlYW1pbmdQcm9jZXNzb3Ioc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50KToKICAgICAgICAgbUNsaWVudChjbGllbnQpLAogICAgICAgICBtRGV2aWNlKGNsaWVudC0+Z2V0Q2FtZXJhRGV2aWNlKCkpLApAQCAtMTEzLDEyICsxMTcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFVzZSBDQU1FUkEzX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcgZm9yIFpTTCBzdHJlYW1pbmcgY2FzZS4KKyAgICAgICAgLy8gVXNlIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHIGZvciBaU0wgc3RyZWFtaW5nIGNhc2UuCiAgICAgICAgIGlmIChwYXJhbXMudXNlWmVyb1NodXR0ZXJMYWcoKSAmJiAhcGFyYW1zLnJlY29yZGluZ0hpbnQpIHsKICAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgIENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRywgJm1QcmV2aWV3UmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIENBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHLCAmbVByZXZpZXdSZXF1ZXN0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXLAorICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChDQU1FUkFfVEVNUExBVEVfUFJFVklFVywKICAgICAgICAgICAgICAgICAgICAgJm1QcmV2aWV3UmVxdWVzdCk7CiAgICAgICAgIH0KIApAQCAtMTk0LDcgKzE5OCw4IEBACiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAogICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVByZXZpZXdTdHJlYW1JZCwgU3RyaW5nOCgpKTsKKyAgICAgICAgICAgICAgICBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsICZtUHJldmlld1N0cmVhbUlkLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+e0FORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVH0pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBwcmV2aWV3IHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI2Myw3ICsyNjgsNyBAQAogICAgIH0KIAogICAgIGlmIChtUmVjb3JkaW5nUmVxdWVzdC5lbnRyeUNvdW50KCkgPT0gMCkgewotICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTJfVEVNUExBVEVfVklERU9fUkVDT1JELAorICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3Q6OkNBTUVSQV9URU1QTEFURV9WSURFT19SRUNPUkQsCiAgICAgICAgICAgICAgICAgJm1SZWNvcmRpbmdSZXF1ZXN0KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCByZWNvcmRpbmcgcmVxdWVzdDoiCkBAIC0zNzksOCArMzg0LDggQEAKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVJlY29yZGluZ1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9XaWR0aCwgcGFyYW1zLnZpZGVvSGVpZ2h0LAogICAgICAgICAgICAgICAgIHBhcmFtcy52aWRlb0Zvcm1hdCwgcGFyYW1zLnZpZGVvRGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtUmVjb3JkaW5nU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgpKTsKKyAgICAgICAgICAgICAgICBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsICZtUmVjb3JkaW5nU3RyZWFtSWQsCisgICAgICAgICAgICAgICAgU3RyaW5nOCgpLCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD57QU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUfSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgcmVjb3JkaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDhkYzk4NjMuLjEzMjFlNmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC00Miw2ICs0Miw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgY2FtZXJhMiB7CiAKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDsKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOworCiBuYW1lc3BhY2Ugewogc3RydWN0IFRpbWVzdGFtcEZpbmRlciA6IHB1YmxpYyBSaW5nQnVmZmVyQ29uc3VtZXI6OlJpbmdCdWZmZXJDb21wYXJhdG9yIHsKICAgICB0eXBlZGVmIFJpbmdCdWZmZXJDb25zdW1lcjo6QnVmZmVySW5mbyBCdWZmZXJJbmZvOwpAQCAtMTcyLDcgKzE3NSw3IEBACiAgICAgbUJ1ZmZlclF1ZXVlRGVwdGggPSBtRnJhbWVMaXN0RGVwdGggKyAxOwogCiAgICAgbVpzbFF1ZXVlLmluc2VydEF0KDAsIG1CdWZmZXJRdWV1ZURlcHRoKTsKLSAgICBtRnJhbWVMaXN0Lmluc2VydEF0KDAsIG1GcmFtZUxpc3REZXB0aCk7CisgICAgbUZyYW1lTGlzdC5yZXNpemUobUZyYW1lTGlzdERlcHRoKTsKICAgICBzcDxDYXB0dXJlU2VxdWVuY2VyPiBjYXB0dXJlU2VxdWVuY2VyID0gbVNlcXVlbmNlci5wcm9tb3RlKCk7CiAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZXIgIT0gMCkgY2FwdHVyZVNlcXVlbmNlci0+c2V0WnNsUHJvY2Vzc29yKHRoaXMpOwogfQpAQCAtMjA4LDcgKzIxMSw3IEBACiAgICAgLy8gQ29ycmVzcG9uZGluZyBidWZmZXIgaGFzIGJlZW4gY2xlYXJlZC4gTm8gbmVlZCB0byBwdXNoIGludG8gbUZyYW1lTGlzdAogICAgIGlmICh0aW1lc3RhbXAgPD0gbUxhdGVzdENsZWFyZWRCdWZmZXJUaW1lc3RhbXApIHJldHVybjsKIAotICAgIG1GcmFtZUxpc3QuZWRpdEl0ZW1BdChtRnJhbWVMaXN0SGVhZCkgPSByZXN1bHQubU1ldGFkYXRhOworICAgIG1GcmFtZUxpc3RbbUZyYW1lTGlzdEhlYWRdID0gcmVzdWx0Lm1NZXRhZGF0YTsKICAgICBtRnJhbWVMaXN0SGVhZCA9IChtRnJhbWVMaXN0SGVhZCArIDEpICUgbUZyYW1lTGlzdERlcHRoOwogfQogCkBAIC0yMzIsOSArMjM1LDkgQEAKICAgICB9CiAKICAgICBpZiAobUlucHV0U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0ocGFyYW1zLmZhc3RJbmZvLm1heFpzbFNpemUud2lkdGgsCi0gICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS5oZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKLSAgICAgICAgICAgICZtSW5wdXRTdHJlYW1JZCk7CisgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0ocGFyYW1zLmZhc3RJbmZvLnVzZWRac2xTaXplLndpZHRoLAorICAgICAgICAgICAgcGFyYW1zLmZhc3RJbmZvLnVzZWRac2xTaXplLmhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELAorICAgICAgICAgICAgLyppc011bHRpUmVzb2x1dGlvbiovZmFsc2UsICZtSW5wdXRTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBjbGllbnQtPmdldENhbWVyYUlkKCksCkBAIC0yNTUsMTAgKzI1OCwxMCBAQAogICAgICAgICBtUHJvZHVjZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1ac2xSaW5nQnVmZmVyQ29uc3VtZXIiKSk7CiAgICAgICAgIHNwPFN1cmZhY2U+IG91dFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKLSAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0ob3V0U3VyZmFjZSwgcGFyYW1zLmZhc3RJbmZvLm1heFpzbFNpemUud2lkdGgsCi0gICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8ubWF4WnNsU2l6ZS5oZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKLSAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1ac2xTdHJlYW1JZCwKLSAgICAgICAgICAgIFN0cmluZzgoKSk7CisgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG91dFN1cmZhY2UsIHBhcmFtcy5mYXN0SW5mby51c2VkWnNsU2l6ZS53aWR0aCwKKyAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby51c2VkWnNsU2l6ZS5oZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKKyAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wLCAmbVpzbFN0cmVhbUlkLAorICAgICAgICAgICAgU3RyaW5nOCgpLCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD57QU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUfSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgWlNMIHN0cmVhbTogIgogICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLApAQCAtMzQ4LDcgKzM1MSw3IEBACiAgICAgfQogCiAgICAgQ2FtZXJhTWV0YWRhdGEgc3RpbGxUZW1wbGF0ZTsKLSAgICBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJnN0aWxsVGVtcGxhdGUpOworICAgIGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoQ0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZzdGlsbFRlbXBsYXRlKTsKIAogICAgIC8vIEZpbmQgc29tZSBvZiB0aGUgcG9zdC1wcm9jZXNzaW5nIHRhZ3MsIGFuZCBhc3NpZ24gdGhlIHZhbHVlIGZyb20gdGVtcGxhdGUgdG8gdGhlIHJlcXVlc3QuCiAgICAgLy8gT25seSBjaGVjayB0aGUgYWJlcnJhdGlvbiBtb2RlIGFuZCBub2lzZSByZWR1Y3Rpb24gbW9kZSBmb3Igbm93LCBhcyB0aGV5IGFyZSB2ZXJ5IGltcG9ydGFudApAQCAtNjcxLDcgKzY3NCw3IEBACiB2b2lkIFpzbFByb2Nlc3Nvcjo6Y2xlYXJac2xSZXN1bHRRdWV1ZUxvY2tlZCgpIHsKICAgICBtRnJhbWVMaXN0LmNsZWFyKCk7CiAgICAgbUZyYW1lTGlzdEhlYWQgPSAwOwotICAgIG1GcmFtZUxpc3QuaW5zZXJ0QXQoMCwgbUZyYW1lTGlzdERlcHRoKTsKKyAgICBtRnJhbWVMaXN0LnJlc2l6ZShtRnJhbWVMaXN0RGVwdGgpOwogfQogCiB2b2lkIFpzbFByb2Nlc3Nvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdCB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKaW5kZXggMWRiMjQwMy4uMzE4NjIzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaApAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRNYXhQaXBlbGluZURlcHRoID0gNDsKICAgICBzaXplX3QgbUJ1ZmZlclF1ZXVlRGVwdGg7CiAgICAgc2l6ZV90IG1GcmFtZUxpc3REZXB0aDsKLSAgICBWZWN0b3I8Q2FtZXJhTWV0YWRhdGE+IG1GcmFtZUxpc3Q7CisgICAgc3RkOjp2ZWN0b3I8Q2FtZXJhTWV0YWRhdGE+IG1GcmFtZUxpc3Q7CiAgICAgc2l6ZV90IG1GcmFtZUxpc3RIZWFkOwogCiAgICAgWnNsUGFpciBtTmV4dFBhaXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggZTM1YjQzNi4uMWYzZDQ3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmgiCiAKICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAKQEAgLTQ5LDE1ICs1MSwxOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKK3VzaW5nIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdDo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOwordXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKIAogQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZTo6Q2FtZXJhRGV2aWNlQ2xpZW50QmFzZSgKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKKyAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6CkBAIC02Nyw2ICs3Miw3IEBACiAgICAgICAgICAgICBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjYW1lcmFJZCwKICAgICAgICAgICAgIGNhbWVyYUZhY2luZywKKyAgICAgICAgICAgIHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgY2xpZW50UGlkLAogICAgICAgICAgICAgY2xpZW50VWlkLAogICAgICAgICAgICAgc2VydmljZVBpZCksCkBAIC04MCwxOCArODYsMjEgQEAKIENhbWVyYURldmljZUNsaWVudDo6Q2FtZXJhRGV2aWNlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCisgICAgICAgIGludCBzZW5zb3JPcmllbnRhdGlvbiwKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCkgOgorICAgICAgICBpbnQgc2VydmljZVBpZCwKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcykgOgogICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIHJlbW90ZUNhbGxiYWNrLCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50RmVhdHVyZUlkLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCAvKkFQSTEgY2FtZXJhIElEKi8gLTEsCi0gICAgICAgICAgICAgICAgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCisgICAgICAgICAgICAgICAgY2FtZXJhSWQsIC8qQVBJMSBjYW1lcmEgSUQqLyAtMSwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MpLAogICAgIG1JbnB1dFN0cmVhbSgpLAogICAgIG1TdHJlYW1pbmdSZXF1ZXN0SWQoUkVRVUVTVF9JRF9OT05FKSwKLSAgICBtUmVxdWVzdElkQ291bnRlcigwKSB7CisgICAgbVJlcXVlc3RJZENvdW50ZXIoMCksCisgICAgbU92ZXJyaWRlRm9yUGVyZkNsYXNzKG92ZXJyaWRlRm9yUGVyZkNsYXNzKSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dJKCJDYW1lcmFEZXZpY2VDbGllbnQgJXM6IE9wZW5lZCIsIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTEyMiw4ICsxMzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxpc3RlbmVyKi90aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnNlbmRQYXJ0aWFscyovdHJ1ZSk7CiAKLSAgICBhdXRvIGRldmljZUluZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgcGh5c2ljYWxLZXlzRW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8gPSBtRGV2aWNlLT5pbmZvKCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgcGh5c2ljYWxLZXlzRW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoCiAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVMpOwogICAgIGlmIChwaHlzaWNhbEtleXNFbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgbVN1cHBvcnRlZFBoeXNpY2FsUmVxdWVzdEtleXMuaW5zZXJ0KG1TdXBwb3J0ZWRQaHlzaWNhbFJlcXVlc3RLZXlzLmJlZ2luKCksCkBAIC0xMzIsNiArMTQxLDE3IEBACiAgICAgfQogCiAgICAgbVByb3ZpZGVyTWFuYWdlciA9IHByb3ZpZGVyUHRyOworICAgIC8vIENhY2hlIHBoeXNpY2FsIGNhbWVyYSBpZHMgY29ycmVzcG9uZGluZyB0byB0aGlzIGRldmljZSBhbmQgYWxzbyB0aGUgaGlnaAorICAgIC8vIHJlc29sdXRpb24gc2Vuc29ycyBpbiB0aGlzIGRldmljZSArIHBoeXNpY2FsIGNhbWVyYSBpZHMKKyAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmbVBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBpZiAoaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKG1DYW1lcmFJZFN0cikpIHsKKyAgICAgICAgbUhpZ2hSZXNvbHV0aW9uU2Vuc29ycy5pbnNlcnQobUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICB9CisgICAgZm9yIChhdXRvICZwaHlzaWNhbElkIDogbVBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgIGlmIChpc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoU3RyaW5nOChwaHlzaWNhbElkLmNfc3RyKCkpKSkgeworICAgICAgICAgICAgbUhpZ2hSZXNvbHV0aW9uU2Vuc29ycy5pbnNlcnQocGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE2OCw3ICsxODgsNiBAQAogCiAgICAgY29uc3QgU3RyZWFtU3VyZmFjZUlkJiBzdHJlYW1TdXJmYWNlSWQgPSBtU3RyZWFtTWFwLnZhbHVlQXQoaWR4KTsKICAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKSkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKLSAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVtzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKV0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CiAgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKHN0cmVhbVN1cmZhY2VJZC5zdHJlYW1JZCgpKTsKICAgICB9CiAgICAgKCpvdXRTdXJmYWNlTWFwKVtzdHJlYW1TdXJmYWNlSWQuc3RyZWFtSWQoKV0ucHVzaF9iYWNrKHN0cmVhbVN1cmZhY2VJZC5zdXJmYWNlSWQoKSk7CkBAIC0xODQsNiArMjAzLDE3IEBACiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCitzdGF0aWMgc3RkOjpsaXN0PGludD4gZ2V0SW50ZXJzZWN0aW9uKGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQ+ICZzdHJlYW1JZHNGb3JUaGlzQ2FtZXJhLAorICAgICAgICBjb25zdCBWZWN0b3I8aW50PiAmc3RyZWFtSWRzRm9yVGhpc1JlcXVlc3QpIHsKKyAgICBzdGQ6Omxpc3Q8aW50PiBpbnRlcnNlY3Rpb247CisgICAgZm9yIChhdXRvICZzdHJlYW1JZCA6IHN0cmVhbUlkc0ZvclRoaXNSZXF1ZXN0KSB7CisgICAgICAgIGlmIChzdHJlYW1JZHNGb3JUaGlzQ2FtZXJhLmZpbmQoc3RyZWFtSWQpICE9IHN0cmVhbUlkc0ZvclRoaXNDYW1lcmEuZW5kKCkpIHsKKyAgICAgICAgICAgIGludGVyc2VjdGlvbi5lbXBsYWNlX2JhY2soc3RyZWFtSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnRlcnNlY3Rpb247Cit9CisKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6c3VibWl0UmVxdWVzdExpc3QoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4mIHJlcXVlc3RzLAogICAgICAgICBib29sIHN0cmVhbWluZywKQEAgLTMzMCw2ICszNjAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IHNldHRpbmdzIGFyZSBlbXB0eSIpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBwaHlzaWNhbCAvIGxvZ2ljYWwgc3RyZWFtIGhhcyBzZXR0aW5ncworICAgICAgICAgICAgLy8gY29uc2lzdGVudCB3aXRoIHRoZSBzZW5zb3IgcGl4ZWwgbW9kZShzKSBpdCB3YXMgY29uZmlndXJlZCB3aXRoLgorICAgICAgICAgICAgLy8gbUNhbWVyYUlkVG9TdHJlYW1TZXQgd2lsbCBvbmx5IGhhdmUgaWRzIHRoYXQgYXJlIGhpZ2ggcmVzb2x1dGlvbgorICAgICAgICAgICAgY29uc3QgYXV0byBzdHJlYW1JZFNldEl0ID0gbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0LmZpbmQoaXQuaWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbUlkU2V0SXQgIT0gbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpsaXN0PGludD4gc3RyZWFtSWRzVXNlZEluUmVxdWVzdCA9IGdldEludGVyc2VjdGlvbihzdHJlYW1JZFNldEl0LT5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMpOworICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC5tSXNSZXByb2Nlc3MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFpc1NlbnNvclBpeGVsTW9kZUNvbnNpc3RlbnQoc3RyZWFtSWRzVXNlZEluUmVxdWVzdCwgaXQuc2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogUmVxdWVzdCBzZXR0aW5ncyBDT05UUk9MX1NFTlNPUl9QSVhFTF9NT0RFIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnNpc3RlbnQgd2l0aCBjb25maWd1cmVkIHN0cmVhbXMuIFJlamVjdGluZyByZXF1ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpdC5pZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3Qgc2V0dGluZ3MgQ09OVFJPTF9TRU5TT1JfUElYRUxfTU9ERSBhcmUgbm90IGNvbnNpc3RlbnQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtcyBjb25maWd1cmVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBTdHJpbmc4IHBoeXNpY2FsSWQoaXQuaWQuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAocGh5c2ljYWxJZCAhPSBtRGV2aWNlLT5nZXRJZCgpKSB7CiAgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IHN0ZDo6ZmluZChyZXF1ZXN0ZWRQaHlzaWNhbElkcy5iZWdpbigpLCByZXF1ZXN0ZWRQaHlzaWNhbElkcy5lbmQoKSwKQEAgLTQ3MCw3ICs1MTgsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FtZXJhTWV0YWRhdGFOYXRpdmUmIHNlc3Npb25QYXJhbXMsIGludDY0X3Qgc3RhcnRUaW1lTXMsCiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG9mZmxpbmVTdHJlYW1JZHMgLypvdXQqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBlbmRpbmcgY29uZmlndXJlICglZCBpbnB1dCBzdHJlYW0sICV6dSBvdXRwdXQgc3VyZmFjZXMpIiwKQEAgLTQ5Miw3ICs1NDAsOCBAQAogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CiAgICAgfQogCi0gICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIG1EZXZpY2UtPmluZm8oKSwgbUNhbWVyYUlkU3RyKTsKKyAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja09wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSwgbURldmljZS0+aW5mbygpLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC01NDUsMjU2ICs1OTQsMjAgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvZmZsaW5lU3RyZWFtSWQgOiAqb2ZmbGluZVN0cmVhbUlkcykgewogICAgICAgICAgICAgbVN0cmVhbUluZm9NYXBbb2ZmbGluZVN0cmVhbUlkXS5zdXBwb3J0c09mZmxpbmUgPSB0cnVlOwogICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBjb25maWd1cmVFbmQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGludDMyX3QgY29uZmlndXJlRHVyYXRpb25NcyA9IG5zMm1zKGNvbmZpZ3VyZUVuZCkgLSBzdGFydFRpbWVNczsKKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nU3RyZWFtQ29uZmlndXJlZChtQ2FtZXJhSWRTdHIsIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgZmFsc2UgLyppbnRlcm5hbFJlY29uZmlnKi8sIGNvbmZpZ3VyZUR1cmF0aW9uTXMpOwogICAgIH0KIAogICAgIHJldHVybiByZXM7CiB9CiAKLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tTdXJmYWNlVHlwZShzaXplX3QgbnVtQnVmZmVyUHJvZHVjZXJzLAotICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIsIGludCBzdXJmYWNlVHlwZSkgIHsKLSAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7Ci0gICAgfQotCi0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKLQotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOwotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCi0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgewotICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLSAgICB9Ci0gICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKLSAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlKGludCBvcGVyYXRpbmdNb2RlLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpIHsKLSAgICBpZiAob3BlcmF0aW5nTW9kZSA8IDApIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCi0gICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZCIsIGNhbWVyYUlkLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkID0gKG9wZXJhdGluZ01vZGUgPT0gSUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSk7Ci0gICAgaWYgKGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOwotICAgICAgICBib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07Ci0gICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBUcnkgdG8gY3JlYXRlIGEgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uIG9uIGEgZGV2aWNlIgotICAgICAgICAgICAgICAgICIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaXQuIiwgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKLX0KLQotdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgewotICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKLSAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOwotICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKLSAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7Ci0gICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOwotICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOwotICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKLSAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKLSAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKLSAgICBzdHJlYW0tPnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKLSAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKLSAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOwotfQotCi1iaW5kZXI6OlN0YXR1cwotQ2FtZXJhRGV2aWNlQ2xpZW50Ojpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sCi0gICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ3VyYXRpb24sCi0gICAgICAgIGJvb2wgKnVuc3VwcG9ydGVkKSB7Ci0gICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOwotICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZShvcGVyYXRpbmdNb2RlLCBkZXZpY2VJbmZvLCBsb2dpY2FsQ2FtZXJhSWQpOwotICAgIGlmICghcmVzLmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIGlmICh1bnN1cHBvcnRlZCA9PSBudWxscHRyKSB7Ci0gICAgICAgIFN0cmluZzggbXNnKCJ1bnN1cHBvcnRlZCBudWxscHRyIik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgKnVuc3VwcG9ydGVkID0gZmFsc2U7Ci0gICAgYXV0byByZXQgPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Q+IChvcGVyYXRpbmdNb2RlKSwKLSAgICAgICAgICAgIC8qb3V0Ki8gJnN0cmVhbUNvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJDYW1lcmEgJXM6IEZhaWxlZCBtYXBwaW5nIG9wZXJhdGluZyBtb2RlICVkIHJlcXVlc3RlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUsIHN0cmVycm9yKC1yZXQpLCByZXQpOwotICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0KLSAgICBib29sIGlzSW5wdXRWYWxpZCA9IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkgPiAwKSAmJgotICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkgPiAwKSAmJgotICAgICAgICAgICAgKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0Rm9ybWF0KCkgPiAwKTsKLSAgICBhdXRvIG91dHB1dENvbmZpZ3MgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOwotICAgIHNpemVfdCBzdHJlYW1Db3VudCA9IG91dHB1dENvbmZpZ3Muc2l6ZSgpOwotICAgIHN0cmVhbUNvdW50ID0gaXNJbnB1dFZhbGlkID8gc3RyZWFtQ291bnQgKyAxIDogc3RyZWFtQ291bnQ7Ci0gICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7Ci0gICAgc2l6ZV90IHN0cmVhbUlkeCA9IDA7Ci0gICAgaWYgKGlzSW5wdXRWYWxpZCkgewotICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdID0ge3svKnN0cmVhbUlkKi8wLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKLSAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAotICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH07Ci0gICAgfQotCi0gICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQotICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOwotICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7Ci0gICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKLSAgICAgICAgc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycyA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7Ci0gICAgICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOwotCi0gICAgICAgIHJlcyA9IGNoZWNrU3VyZmFjZVR5cGUobnVtQnVmZmVyUHJvZHVjZXJzLCBkZWZlcnJlZENvbnN1bWVyLCBpdC5nZXRTdXJmYWNlVHlwZSgpKTsKLSAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkcywgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQpOwotICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVmZXJyZWRDb25zdW1lcikgewotICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IGl0LmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGl0LmdldEhlaWdodCgpOwotICAgICAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0gICAgICAgICAgICBzdHJlYW1JbmZvLmRhdGFTcGFjZSA9IGFuZHJvaWRfZGF0YXNwYWNlX3Q6OkhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKLSAgICAgICAgICAgIGF1dG8gc3VyZmFjZVR5cGUgPSBpdC5nZXRTdXJmYWNlVHlwZSgpOwotICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRTsKLSAgICAgICAgICAgIGlmIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7Ci0gICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgewotICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbERldmljZUluZm8gPSBnZXRNZXRhZGF0YShwaHlzaWNhbENhbWVyYUlkKTsKLSAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDAgPyBwaHlzaWNhbERldmljZUluZm8gOiBkZXZpY2VJbmZvICk7Ci0KLSAgICAgICAgICAgIGlmICghcmVzLmlzT2soKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgICAgICAgICBpZiAoIWlzU3RyZWFtSW5mb1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2UpOwotICAgICAgICAgICAgICAgIGJvb2wgaXNIZWljQ29tcG9zaXRlU3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSB8fCBpc0hlaWNDb21wb3NpdGVTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGluIHRvIGFjY291bnQgdGhhdCBjb21wb3NpdGUgc3RyZWFtcyBjYW4gaGF2ZQotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiBjb21wb3NpdGVTdHJlYW1zOwotICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6RGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oc3RyZWFtSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mbywgJmNvbXBvc2l0ZVN0cmVhbXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8sICZjb21wb3NpdGVTdHJlYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIGFkZGluZyBjb21wb3NpdGUgc3RyZWFtczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLXJldCksIHJldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGludGVybmFsIHN0cmVhbXMgbWVhbnMgY29tcG9zaXRlIHN0cmVhbSBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICp1bnN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+IChpdC5nZXRSb3RhdGlvbigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlzU3RyZWFtSW5mb1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLCBib29sICpzdGF0dXMgLypvdXQqLykgewotICAgIEFUUkFDRV9DQUxMKCk7CiAKKyAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGJpbmRlcjo6U3RhdHVzIHJlczsKICAgICBzdGF0dXNfdCByZXQgPSBPSzsKICAgICBpZiAoIShyZXMgPSBjaGVja1BpZFN0YXR1cyhfX0ZVTkNUSU9OX18pKS5pc09rKCkpIHJldHVybiByZXM7CkBAIC04MDYsNyArNjE5LDggQEAKICAgICB9CiAKICAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7Ci0gICAgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIG1EZXZpY2UtPmluZm8oKSwgbUNhbWVyYUlkU3RyKTsKKyAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja09wZXJhdGluZ01vZGUob3BlcmF0aW5nTW9kZSwgbURldmljZS0+aW5mbygpLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyKTsKICAgICBpZiAoIXJlcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC04MTYsMTMgKzYzMCwxNiBAQAogICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CiAgICAgfQotICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworCisgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHN0cmVhbUNvbmZpZ3VyYXRpb247CiAgICAgYm9vbCBlYXJseUV4aXQgPSBmYWxzZTsKLSAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSA9IFt0aGlzXShjb25zdCBTdHJpbmc4ICZpZCkge3JldHVybiBtRGV2aWNlLT5pbmZvUGh5c2ljYWwoaWQpO307CisgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEgPSBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQsIGJvb2wgLypvdmVycmlkZUZvclBlcmZDbGFzcyovKSB7CisgICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmluZm9QaHlzaWNhbChpZCk7fTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CiAgICAgbVByb3ZpZGVyTWFuYWdlci0+aXNMb2dpY2FsQ2FtZXJhKG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKLSAgICByZXMgPSBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbihzZXNzaW9uQ29uZmlndXJhdGlvbiwgbUNhbWVyYUlkU3RyLAotICAgICAgICAgICAgbURldmljZS0+aW5mbygpLCBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sICZlYXJseUV4aXQpOworICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvKCksIGdldE1ldGFkYXRhLCBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIG1PdmVycmlkZUZvclBlcmZDbGFzcywgJmVhcmx5RXhpdCk7CiAgICAgaWYgKCFyZXMuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtOTQ1LDYgKzc2MiwxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29tcG9zaXRlU3RyZWFtTWFwLnJlbW92ZUl0ZW1zQXQoY29tcG9zaXRlSW5kZXgpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChhdXRvICZtYXBJdDogbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0KSB7CisgICAgICAgICAgICAgICAgYXV0byAmc3RyZWFtU2V0ID0gbWFwSXQuc2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1TZXQuZmluZChzdHJlYW1JZCkgIT0gc3RyZWFtU2V0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNldC5lcmFzZShzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtOTY5LDggKzc5Myw5IEBACiAgICAgYm9vbCBpc1NoYXJlZCA9IG91dHB1dENvbmZpZ3VyYXRpb24uaXNTaGFyZWQoKTsKICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKKyAgICBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc011bHRpUmVzb2x1dGlvbigpOwogCi0gICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZShudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsCisgICAgcmVzID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tTdXJmYWNlVHlwZShudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsCiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCkpOwogICAgIGlmICghcmVzLmlzT2soKSkgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtOTc5LDkgKzgwNCw4IEBACiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIG1Qcm92aWRlck1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtQ2FtZXJhSWRTdHIuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWRzLCBwaHlzaWNhbENhbWVyYUlkLCBtQ2FtZXJhSWRTdHIpOworICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrUGh5c2ljYWxDYW1lcmFJZChtUGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBtQ2FtZXJhSWRTdHIpOwogICAgIGlmICghcmVzLmlzT2soKSkgewogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTk5Nyw2ICs4MjEsOCBAQAogCiAgICAgT3V0cHV0U3RyZWFtSW5mbyBzdHJlYW1JbmZvOwogICAgIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQgPSBmYWxzZTsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPQorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOwogICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKICAgICAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKTsKQEAgLTEwMDksOCArODM1LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7Ci0gICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbENhbWVyYUlkKSk7CisgICAgICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQsIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBtQ2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAKICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTEwMjMsOSArODUwLDE0IEBACiAgICAgICAgIHN1cmZhY2VzLnB1c2hfYmFjayhzdXJmYWNlKTsKICAgICB9CiAKKyAgICAvLyBJZiBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3MgaXMgdHJ1ZSwgZG8gbm90IGZhaWwgY3JlYXRlU3RyZWFtKCkgZm9yIHNtYWxsCisgICAgLy8gSlBFRyBzaXplcyBiZWNhdXNlIGV4aXN0aW5nIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKCkgbG9naWMgd2lsbCBmaW5kIHRoZQorICAgIC8vIGNsb3Nlc3QgcG9zc2libGUgc3VwcG9ydGVkIHNpemUuCisKICAgICBpbnQgc3RyZWFtSWQgPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEOwogICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKLSAgICBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtID0KKyAgICAgICAgICAgIGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKICAgICBib29sIGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CiAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcGlzaXRlU3RyZWFtKSB7CiAgICAgICAgIHNwPENvbXBvc2l0ZVN0cmVhbT4gY29tcG9zaXRlU3RyZWFtOwpAQCAtMTAzNyw5ICs4NjksOSBAQAogCiAgICAgICAgIGVyciA9IGNvbXBvc2l0ZVN0cmVhbS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAogICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCi0gICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsICZzdXJmYWNlSWRzLAorICAgICAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksIGlzU2hhcmVkLCBpc011bHRpUmVzb2x1dGlvbik7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2VzWzBdLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpLAogICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0pOwpAQCAtMTA0Nyw5ICs4NzksOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsIHN0cmVhbUluZm8uZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCi0gICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKLSAgICAgICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCwgJnN1cmZhY2VJZHMsCisgICAgICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsIGlzTXVsdGlSZXNvbHV0aW9uKTsKICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xMDc3LDYgKzkwOSwxNiBAQAogICAgICAgICAvLyBTZXQgdHJhbnNmb3JtIGZsYWdzIHRvIGVuc3VyZSBwcmV2aWV3IHRvIGJlIHJvdGF0ZWQgY29ycmVjdGx5LgogICAgICAgICByZXMgPSBzZXRTdHJlYW1UcmFuc2Zvcm1Mb2NrZWQoc3RyZWFtSWQpOwogCisgICAgICAgIC8vIEZpbGwgaW4gbUhpZ2hSZXNvbHV0aW9uQ2FtZXJhSWRUb1N0cmVhbUlkU2V0IG1hcAorICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZFVzZWQgPQorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpICE9IDAgPyBwaHlzaWNhbENhbWVyYUlkIDogbUNhbWVyYUlkU3RyOworICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZFVzZWRDU3RyID0gY2FtZXJhSWRVc2VkLnN0cmluZygpOworICAgICAgICAvLyBPbmx5IG5lZWRlZCBmb3IgaGlnaCByZXNvbHV0aW9uIHNlbnNvcnMKKyAgICAgICAgaWYgKG1IaWdoUmVzb2x1dGlvblNlbnNvcnMuZmluZChjYW1lcmFJZFVzZWRDU3RyKSAhPQorICAgICAgICAgICAgICAgIG1IaWdoUmVzb2x1dGlvblNlbnNvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIG1IaWdoUmVzb2x1dGlvbkNhbWVyYUlkVG9TdHJlYW1JZFNldFtjYW1lcmFJZFVzZWRDU3RyXS5pbnNlcnQoc3RyZWFtSWQpOworICAgICAgICB9CisKICAgICAgICAgKm5ld1N0cmVhbUlkID0gc3RyZWFtSWQ7CiAgICAgfQogCkBAIC0xMTEzLDEyICs5NTUsMjcgQEAKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gbm9TdXJmYWNlOwogICAgIHN0ZDo6dmVjdG9yPGludD4gc3VyZmFjZUlkczsKICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOworICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkVXNlZCA9CisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnNpemUoKSAhPSAwID8gcGh5c2ljYWxDYW1lcmFJZCA6IG1DYW1lcmFJZFN0cjsKKyAgICAvLyBIZXJlLCB3ZSBvdmVycmlkZSBzZW5zb3IgcGl4ZWwgbW9kZXMKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCA9CisgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCk7CisgICAgaWYgKFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKKyAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGdldFN0YXRpY0luZm8oY2FtZXJhSWRVc2VkKSwKKyAgICAgICAgICAgIC8qYWxsb3dSb3VuZGluZyovIGZhbHNlLCAmb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKSAhPSBPSykgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgInNlbnNvciBwaXhlbCBtb2RlcyB1c2VkIG5vdCB2YWxpZCBmb3IgZGVmZXJyZWQgc3RyZWFtIik7CisgICAgfQorCiAgICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKG5vU3VyZmFjZSwgLypoYXNEZWZlcnJlZENvbnN1bWVyKi90cnVlLCB3aWR0aCwKICAgICAgICAgICAgIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICZzdXJmYWNlSWRzLAogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwgaXNTaGFyZWQsCi0gICAgICAgICAgICBjb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uaXNNdWx0aVJlc29sdXRpb24oKSwgY29uc3VtZXJVc2FnZSk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC0xMTI5LDkgKzk4Niw5IEBACiAgICAgICAgIC8vIGEgc2VwYXJhdGUgbGlzdCB0byB0cmFjay4gT25jZSB0aGUgZGVmZXJyZWQgc3VyZmFjZSBpcyBzZXQsIHRoaXMgaWQgd2lsbCBiZQogICAgICAgICAvLyByZWxvY2F0ZWQgdG8gbVN0cmVhbU1hcC4KICAgICAgICAgbURlZmVycmVkU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtSWQpOwotCiAgICAgICAgIG1TdHJlYW1JbmZvTWFwLmVtcGxhY2Uoc3RkOjpwaWVjZXdpc2VfY29uc3RydWN0LCBzdGQ6OmZvcndhcmRfYXNfdHVwbGUoc3RyZWFtSWQpLAotICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgY29uc3VtZXJVc2FnZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9hc190dXBsZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgY29uc3VtZXJVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCkpOwogCiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBhIG5ldyBzdHJlYW0gSUQgJWQgZm9yIGEgZGVmZXJyZWQgc3VyZmFjZSIKICAgICAgICAgICAgICAgICAiICglZCB4ICVkKSBzdHJlYW0gd2l0aCBmb3JtYXQgMHgleC4iLApAQCAtMTE0MSw2ICs5OTgsMTMgQEAKICAgICAgICAgcmVzID0gc2V0U3RyZWFtVHJhbnNmb3JtTG9ja2VkKHN0cmVhbUlkKTsKIAogICAgICAgICAqbmV3U3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgLy8gRmlsbCBpbiBtSGlnaFJlc29sdXRpb25DYW1lcmFJZFRvU3RyZWFtSWRTZXQKKyAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRVc2VkQ1N0ciA9IGNhbWVyYUlkVXNlZC5zdHJpbmcoKTsKKyAgICAgICAgLy8gT25seSBuZWVkZWQgZm9yIGhpZ2ggcmVzb2x1dGlvbiBzZW5zb3JzCisgICAgICAgIGlmIChtSGlnaFJlc29sdXRpb25TZW5zb3JzLmZpbmQoY2FtZXJhSWRVc2VkQ1N0cikgIT0KKyAgICAgICAgICAgICAgICBtSGlnaFJlc29sdXRpb25TZW5zb3JzLmVuZCgpKSB7CisgICAgICAgICAgICBtSGlnaFJlc29sdXRpb25DYW1lcmFJZFRvU3RyZWFtSWRTZXRbY2FtZXJhSWRVc2VkLnN0cmluZygpXS5pbnNlcnQoc3RyZWFtSWQpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0xMTczLDEyICsxMDM3LDEzIEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlSW5wdXRTdHJlYW0oCi0gICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0LCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAogICAgICAgICAvKm91dCovCiAgICAgICAgIGludDMyX3QqIG5ld1N0cmVhbUlkKSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyAodyA9ICVkLCBoID0gJWQsIGYgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBBTE9HVigiJXMgKHcgPSAlZCwgaCA9ICVkLCBmID0gMHgleCwgaXNNdWx0aVJlc29sdXRpb24gJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpc011bHRpUmVzb2x1dGlvbik7CiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXM7CiAgICAgaWYgKCEocmVzID0gY2hlY2tQaWRTdGF0dXMoX19GVU5DVElPTl9fKSkuaXNPaygpKSByZXR1cm4gcmVzOwpAQCAtMTE5Nyw3ICsxMDYyLDcgQEAKICAgICB9CiAKICAgICBpbnQgc3RyZWFtSWQgPSAtMTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRGV2aWNlLT5jcmVhdGVJbnB1dFN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsICZzdHJlYW1JZCk7CisgICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y3JlYXRlSW5wdXRTdHJlYW0od2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpc011bHRpUmVzb2x1dGlvbiwgJnN0cmVhbUlkKTsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIG1JbnB1dFN0cmVhbS5jb25maWd1cmVkID0gdHJ1ZTsKICAgICAgICAgbUlucHV0U3RyZWFtLndpZHRoID0gd2lkdGg7CkBAIC0xMzA5LDEyICsxMTc0LDE1IEBACiAgICAgICAgICAgICBuZXdPdXRwdXRzTWFwLnJlbW92ZUl0ZW1zQXQoaWR4KTsKICAgICAgICAgfQogICAgIH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPQorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZXdPdXRwdXRzTWFwLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8gb3V0SW5mbzsKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKLSAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLCBzdXJmYWNlLAotICAgICAgICAgICAgICAgIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSwgbUNhbWVyYUlkU3RyLCBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxDYW1lcmFJZCkpOworICAgICAgICByZXMgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjcmVhdGVTdXJmYWNlRnJvbUdicChvdXRJbmZvLAorICAgICAgICAgICAgICAgIC8qaXNTdHJlYW1JbmZvVmFsaWQqLyBmYWxzZSwgc3VyZmFjZSwgbmV3T3V0cHV0c01hcC52YWx1ZUF0KGkpLCBtQ2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgbURldmljZS0+aW5mb1BoeXNpY2FsKHBoeXNpY2FsQ2FtZXJhSWQpLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CiAgICAgICAgIGlmICghcmVzLmlzT2soKSkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAKQEAgLTEzNjQsMjI2ICsxMjMyLDYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1ib29sIENhbWVyYURldmljZUNsaWVudDo6aXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWTg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZMTY6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzEwOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTI6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlU3VyZmFjZUZyb21HYnAoCi0gICAgICAgIE91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCi0gICAgICAgIHNwPFN1cmZhY2U+JiBzdXJmYWNlLCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLAotICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpIHsKLQotICAgIC8vIGJ1ZmZlclByb2R1Y2VyIG11c3QgYmUgbm9uLW51bGwKLSAgICBpZiAoZ2JwID09IG51bGxwdHIpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogU3VyZmFjZSBpcyBOVUxMIiwgY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgICAgICBBTE9HVygiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIC8vIEhBQ0sgYi8xMDk0OTEwNQotICAgIC8vIFF1ZXJ5IGNvbnN1bWVyIHVzYWdlIGJpdHMgdG8gc2V0IGFzeW5jIG9wZXJhdGlvbiBtb2RlIGZvcgotICAgIC8vIEdMQ29uc3VtZXIgdXNpbmcgY29udHJvbGxlZEJ5QXBwIHBhcmFtZXRlci4KLSAgICBib29sIHVzZUFzeW5jID0gZmFsc2U7Ci0gICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGlmICgoZXJyID0gZ2JwLT5nZXRDb25zdW1lclVzYWdlKCZjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgY29uc3VtZXIgdXNhZ2U6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFKSB7Ci0gICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSwgY29uc3VtZXJVc2FnZSk7Ci0gICAgICAgIHVzZUFzeW5jID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOwotICAgIHVpbnQ2NF90IGFsbG93ZWRGbGFncyA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfTUFTSyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOwotICAgIGJvb2wgZmxleGlibGVDb25zdW1lciA9IChjb25zdW1lclVzYWdlICYgZGlzYWxsb3dlZEZsYWdzKSA9PSAwICYmCi0gICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIGFsbG93ZWRGbGFncykgIT0gMDsKLQotICAgIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShnYnAsIHVzZUFzeW5jKTsKLSAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOwotCi0gICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdDsKLSAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7Ci0gICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2Ugd2lkdGg6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfSEVJR0hULCAmaGVpZ2h0KSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgaGVpZ2h0OiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZm9ybWF0OiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsCi0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludCo+KCZkYXRhU3BhY2UpKSkgIT0gT0spIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGlzIG92ZXJyaWRlIHNpbmNlIHRoZSBkZWZhdWx0IGZvcm1hdCBzaG91bGQgYmUKLSAgICAvLyAgICAgICBJTVBMRU1FTlRBVElPTl9ERUZJTkVELiBiLzk0ODc0ODIgJiBiLzM1MzE3OTQ0Ci0gICAgaWYgKChmb3JtYXQgPj0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggJiYgZm9ybWF0IDw9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4KSAmJgotICAgICAgICAgICAgKChjb25zdW1lclVzYWdlICYgR1JBTExPQ19VU0FHRV9IV19NQVNLKSAmJgotICAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLKSA9PSAwKSkpIHsKLSAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJXM6IE92ZXJyaWRpbmcgZm9ybWF0ICUjeCB0byBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpLCBmb3JtYXQpOwotICAgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7Ci0gICAgfQotICAgIC8vIFJvdW5kIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgZGltZW5zaW9ucyBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0Ci0gICAgaWYgKGZsZXhpYmxlQ29uc3VtZXIgJiYgaXNQdWJsaWNGb3JtYXQoZm9ybWF0KSAmJgotICAgICAgICAgICAgIUNhbWVyYURldmljZUNsaWVudDo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IE5vIHN1cHBvcnRlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aCAiCi0gICAgICAgICAgICAgICAgImZvcm1hdCAlI3ggZGVmaW5lZCwgZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0KTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKLSAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IHdpZHRoOwotICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gZGF0YVNwYWNlOwotICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBjb25zdW1lclVzYWdlOwotICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci0gICAgfQotICAgIGlmICh3aWR0aCAhPSBzdHJlYW1JbmZvLndpZHRoKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSB3aWR0aCBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHdpZHRoLCBzdHJlYW1JbmZvLndpZHRoKTsKLSAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0KLSAgICBpZiAoaGVpZ2h0ICE9IHN0cmVhbUluZm8uaGVpZ2h0KSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBoZWlnaHQgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAotICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgaGVpZ2h0LCBzdHJlYW1JbmZvLmhlaWdodCk7Ci0gICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdCAhPSBzdHJlYW1JbmZvLmZvcm1hdCkgewotICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOlN1cmZhY2UgZm9ybWF0IGRvZXNuJ3QgbWF0Y2g6ICVkIHZzICVkIiwKLSAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIGZvcm1hdCwgc3RyZWFtSW5mby5mb3JtYXQpOwotICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGlmIChmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKSB7Ci0gICAgICAgIGlmIChkYXRhU3BhY2UgIT0gc3RyZWFtSW5mby5kYXRhU3BhY2UpIHsKLSAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBkYXRhU3BhY2UgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZGF0YVNwYWNlLCBzdHJlYW1JbmZvLmRhdGFTcGFjZSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vQXQgdGhlIG5hdGl2ZSBzaWRlLCB0aGVyZSBpc24ndCBhIHdheSB0byBjaGVjayB3aGV0aGVyIDIgc3VyZmFjZXMgY29tZSBmcm9tIHRoZSBzYW1lCi0gICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KLSAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7Ci0gICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAlIiBQUkl1NjQgIiB2cyAlIiBQUkl1NjQgIiIsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBjb25zdW1lclVzYWdlLCBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UpOwotICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLWJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAotICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpIHsKLQotICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdHJlYW1Db25maWdzID0KLSAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgPwotICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgotICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9IRUlGKSkgPwotICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKLSAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKLQotICAgIGludDMyX3QgYmVzdFdpZHRoID0gLTE7Ci0gICAgaW50MzJfdCBiZXN0SGVpZ2h0ID0gLTE7Ci0KLSAgICAvLyBJdGVyYXRlIHRocm91Z2ggbGlzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhbmQgZmluZCB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0IGV1Y2xpZGVhbgotICAgIC8vIGRpc3RhbmNlIGZyb20gdGhlIGdpdmVuIGRpbWVuc2lvbnMgZm9yIHRoZSBnaXZlbiBmb3JtYXQuCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKLSAgICAgICAgaW50MzJfdCBmbXQgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOwotICAgICAgICBpbnQzMl90IHcgPSBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyAxXTsKLSAgICAgICAgaW50MzJfdCBoID0gc3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgMl07Ci0KLSAgICAgICAgLy8gSWdub3JlIGlucHV0L291dHB1dCB0eXBlIGZvciBub3cKLSAgICAgICAgaWYgKGZtdCA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgIGlmICh3ID09IHdpZHRoICYmIGggPT0gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgYmVzdFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYmVzdEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodyA8PSBST1VORElOR19XSURUSF9DQVAgJiYgKGJlc3RXaWR0aCA9PSAtMSB8fAotICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnQ6OmV1Y2xpZERpc3RTcXVhcmUodywgaCwgd2lkdGgsIGhlaWdodCkgPAotICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnQ6OmV1Y2xpZERpc3RTcXVhcmUoYmVzdFdpZHRoLCBiZXN0SGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KSkpIHsKLSAgICAgICAgICAgICAgICBiZXN0V2lkdGggPSB3OwotICAgICAgICAgICAgICAgIGJlc3RIZWlnaHQgPSBoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJlc3RXaWR0aCA9PSAtMSkgewotICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgbm8gY29uZmlndXJhdGlvbnMgZm9yIHRoaXMgZm9ybWF0IHdlcmUgbGlzdGVkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dHMgdG8gdGhlIGNsb3NldCB3aWR0aC9oZWlnaHQKLSAgICBpZiAob3V0V2lkdGggIT0gTlVMTCkgewotICAgICAgICAqb3V0V2lkdGggPSBiZXN0V2lkdGg7Ci0gICAgfQotICAgIGlmIChvdXRIZWlnaHQgIT0gTlVMTCkgewotICAgICAgICAqb3V0SGVpZ2h0ID0gYmVzdEhlaWdodDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBmb3JtYXQgd2FzIGxpc3RlZAotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQ2NF90IENhbWVyYURldmljZUNsaWVudDo6ZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKSB7Ci0gICAgaW50NjRfdCBkMCA9IHgwIC0geDE7Ci0gICAgaW50NjRfdCBkMSA9IHkwIC0geTE7Ci0gICAgcmV0dXJuIGQwICogZDAgKyBkMSAqIGQxOwotfQotCiAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICAvKm91dCovCkBAIC0xNjAxLDkgKzEyNDksMTIgQEAKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQsICJDYW1lcmEgZGV2aWNlIG5vIGxvbmdlciBhbGl2ZSIpOwogICAgIH0KIAotICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOwogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoIChlcnIgPSBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCh0ZW1wbGF0ZUlkLCAmbWV0YWRhdGEpICkgPT0gT0sgJiYKKyAgICBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90IHRlbXBJZCA9IGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3Q6OkNBTUVSQV9URU1QTEFURV9DT1VOVDsKKyAgICBpZiAoIShyZXMgPSBtYXBSZXF1ZXN0VGVtcGxhdGUodGVtcGxhdGVJZCwgJnRlbXBJZCkpLmlzT2soKSkgcmV0dXJuIHJlczsKKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIGlmICggKGVyciA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KHRlbXBJZCwgJm1ldGFkYXRhKSApID09IE9LICYmCiAgICAgICAgIHJlcXVlc3QgIT0gTlVMTCkgewogCiAgICAgICAgIHJlcXVlc3QtPnN3YXAobWV0YWRhdGEpOwpAQCAtMTg4Niw2ICsxNTM3LDggQEAKICAgICB9CiAKICAgICBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gY29uc3VtZXJTdXJmYWNlczsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQgPQorICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTZW5zb3JQaXhlbE1vZGVzVXNlZCgpOwogICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKICAgICAgICAgLy8gRG9uJ3QgY3JlYXRlIG11bHRpcGxlIHN0cmVhbXMgZm9yIHRoZSBzYW1lIHRhcmdldCBzdXJmYWNlCiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKQEAgLTE4OTYsOCArMTU0OSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOwotICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChtU3RyZWFtSW5mb01hcFtzdHJlYW1JZF0sIHRydWUgLyppc1N0cmVhbUluZm9WYWxpZCovLAotICAgICAgICAgICAgICAgIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBtQ2FtZXJhSWRTdHIsIG1EZXZpY2UtPmluZm9QaHlzaWNhbChwaHlzaWNhbElkKSk7CisgICAgICAgIHJlcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKG1TdHJlYW1JbmZvTWFwW3N0cmVhbUlkXSwKKyAgICAgICAgICAgICAgICB0cnVlIC8qaXNTdHJlYW1JbmZvVmFsaWQqLywgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsIG1DYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICBtRGV2aWNlLT5pbmZvUGh5c2ljYWwocGh5c2ljYWxJZCksIHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTk3Nyw2ICsxNjMxLDE0IEBACiAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90Pihyb3RhdGVBbmRDcm9wKSk7CiB9CiAKK2Jvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50OjpzdXBwb3J0c0NhbWVyYU11dGUoKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPnN1cHBvcnRzQ2FtZXJhTXV0ZSgpOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OnNldENhbWVyYU11dGUoYm9vbCBlbmFibGVkKSB7CisgICAgcmV0dXJuIG1EZXZpY2UtPnNldENhbWVyYU11dGUoZW5hYmxlZCk7Cit9CisKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6c3dpdGNoVG9PZmZsaW5lKAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIGNhbWVyYUNiLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBvZmZsaW5lT3V0cHV0SWRzLApAQCAtMjA2Miw3ICsxNzI0LDggQEAKICAgICBpZiAob2ZmbGluZVNlc3Npb24uZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICBvZmZsaW5lQ2xpZW50ID0gbmV3IENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50KHNDYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgIG9mZmxpbmVTZXNzaW9uLCBvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwLCBjYW1lcmFDYiwgbUNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIG1DbGllbnRGZWF0dXJlSWQsIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBpZCwgbUNsaWVudFVpZCwgbVNlcnZpY2VQaWQpOworICAgICAgICAgICAgICAgIG1DbGllbnRGZWF0dXJlSWQsIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbU9yaWVudGF0aW9uLCBtQ2xpZW50UGlkLCBtQ2xpZW50VWlkLAorICAgICAgICAgICAgICAgIG1TZXJ2aWNlUGlkKTsKICAgICAgICAgcmV0ID0gc0NhbWVyYVNlcnZpY2UtPmFkZE9mZmxpbmVDbGllbnQobUNhbWVyYUlkU3RyLCBvZmZsaW5lQ2xpZW50KTsKICAgICB9CiAKQEAgLTIxNjIsMTQgKzE4MjUsMTYgQEAKICAgICBtU3RyZWFtaW5nUmVxdWVzdElkID0gUkVRVUVTVF9JRF9OT05FOwogfQogCi12b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5SWRsZSgpIHsKK3ZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlJZGxlKAorICAgICAgICBpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgewogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCiAgICAgaWYgKHJlbW90ZUNiICE9IDApIHsKICAgICAgICAgcmVtb3RlQ2ItPm9uRGV2aWNlSWRsZSgpOwogICAgIH0KLSAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5SWRsZSgpOworICAgIENhbWVyYTJDbGllbnRCYXNlOjpub3RpZnlJZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKIH0KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLApAQCAtMjIwNSw2ICsxODcwLDcgQEAKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkZXRhY2hEZXZpY2UoKSB7CiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwogCisgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgQUxPR1YoIkNhbWVyYSAlczogU3RvcHBpbmcgcHJvY2Vzc29ycyIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKICAgICBtRnJhbWVQcm9jZXNzb3ItPnJlbW92ZUxpc3RlbmVyKGNhbWVyYTI6OkZyYW1lUHJvY2Vzc29yQmFzZTo6RlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCwKQEAgLTIyMzksNiArMTkwNSw5IEBACiAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5jbGVhcigpOwogCiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmRldGFjaERldmljZSgpOworCisgICAgaW50MzJfdCBjbG9zZUxhdGVuY3lNcyA9IG5zMm1zKHN5c3RlbVRpbWUoKSAtIHN0YXJ0VGltZSk7CisgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQ2xvc2UobUNhbWVyYUlkU3RyLCBjbG9zZUxhdGVuY3lNcyk7CiB9CiAKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCkBAIC0yMzI4LDQgKzE5OTcsOTEgQEAKICAgICByZXR1cm4gQ2FtZXJhVXRpbHM6OmdldFJvdGF0aW9uVHJhbnNmb3JtKHN0YXRpY0luZm8sIHRyYW5zZm9ybSk7CiB9CiAKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6bWFwUmVxdWVzdFRlbXBsYXRlKGludCB0ZW1wbGF0ZUlkLAorICAgICAgICBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90KiB0ZW1wSWQgLypvdXQqLykgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOworCisgICAgaWYgKHRlbXBJZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBJbnZhbGlkIHRlbXBsYXRlIGFyZ3VtZW50IiwgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgICAgICp0ZW1wSWQgPSBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90OjpDQU1FUkFfVEVNUExBVEVfUFJFVklFVzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9SRUNPUkQ6CisgICAgICAgICAgICAqdGVtcElkID0gY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdDo6Q0FNRVJBX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgKnRlbXBJZCA9IGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3Q6OkNBTUVSQV9URU1QTEFURV9TVElMTF9DQVBUVVJFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgKnRlbXBJZCA9IGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3Q6OkNBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgKnRlbXBJZCA9IGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3Q6OkNBTUVSQV9URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgICp0ZW1wSWQgPSBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90OjpDQU1FUkFfVEVNUExBVEVfTUFOVUFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBTVEFUVVNfRVJST1JfRk1UKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICJDYW1lcmEgJXM6IFRlbXBsYXRlIElEICVkIGlzIGludmFsaWQgb3Igbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgdGVtcGxhdGVJZCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2NvbnN0IENhbWVyYU1ldGFkYXRhICZDYW1lcmFEZXZpY2VDbGllbnQ6OmdldFN0YXRpY0luZm8oY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpIHsKKyAgICBpZiAobURldmljZS0+Z2V0SWQoKSA9PSBjYW1lcmFJZCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+aW5mbygpOworICAgIH0KKyAgICByZXR1cm4gbURldmljZS0+aW5mb1BoeXNpY2FsKGNhbWVyYUlkKTsKK30KKworYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCkgeworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvID0gZ2V0U3RhdGljSW5mbyhjYW1lcmFJZCk7CisgICAgcmV0dXJuIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihkZXZpY2VJbmZvKTsKK30KKworYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzU2Vuc29yUGl4ZWxNb2RlQ29uc2lzdGVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PGludD4gJnN0cmVhbUlkTGlzdCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnNldHRpbmdzKSB7CisgICAgLy8gRmlyc3Qgd2UgZ2V0IHRoZSBzZW5zb3JQaXhlbE1vZGUgZnJvbSB0aGUgc2V0dGluZ3MgbWV0YWRhdGEuCisgICAgaW50MzJfdCBzZW5zb3JQaXhlbE1vZGUgPSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQ7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNvclBpeGVsTW9kZUVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFKTsKKyAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlRW50cnkuY291bnQgIT0gMCkgeworICAgICAgICBzZW5zb3JQaXhlbE1vZGUgPSBzZW5zb3JQaXhlbE1vZGVFbnRyeS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCAmJgorICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3Qgc2Vuc29yIHBpeGVsIG1vZGUgbm90IGlzIG5vdCBvbmUgb2YgdGhlIHZhbGlkIHZhbHVlcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZW5zb3JQaXhlbE1vZGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIC8vIENoZWNrIHdoZXRoZXIgZWFjaCBzdHJlYW0gaGFzIG1heCByZXNvbHV0aW9uIGFsbG93ZWQuCisgICAgYm9vbCBjb25zaXN0ZW50ID0gdHJ1ZTsKKyAgICBmb3IgKGF1dG8gaXQgOiBzdHJlYW1JZExpc3QpIHsKKyAgICAgICAgYXV0byBjb25zdCBzdHJlYW1JbmZvSXQgPSBtU3RyZWFtSW5mb01hcC5maW5kKGl0KTsKKyAgICAgICAgaWYgKHN0cmVhbUluZm9JdCA9PSBtU3RyZWFtSW5mb01hcC5lbmQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzdHJlYW0gaWQgJWQgbm90IGNyZWF0ZWQsIHNraXBwaW5nIiwgX19GVU5DVElPTl9fLCBpdCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc2lzdGVudCA9CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mb0l0LT5zZWNvbmQuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZmluZChzZW5zb3JQaXhlbE1vZGUpICE9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvSXQtPnNlY29uZC5zZW5zb3JQaXhlbE1vZGVzVXNlZC5lbmQoKTsKKyAgICAgICAgaWYgKCFjb25zaXN0ZW50KSB7CisgICAgICAgICAgICBBTE9HRSgic2Vuc29yUGl4ZWxNb2RlIHVzZWQgJWkgbm90IGNvbnNpc3RlbnQgd2l0aCBjb25maWd1cmVkIG1vZGVzIiwgc2Vuc29yUGl4ZWxNb2RlKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBtIDogc3RyZWFtSW5mb0l0LT5zZWNvbmQuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2Vuc29yIHBpeGVsIG1vZGUgdXNlZCBsaXN0OiAlaSIsIG0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29uc2lzdGVudDsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKaW5kZXggOWQzODc0Zi4uNzZiM2Y1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCkBAIC0yOCwxNCArMjgsMTMgQEAKICNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgiCiAjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgogCiB1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpPdXRwdXRTdHJlYW1JbmZvOwogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q29tcG9zaXRlU3RyZWFtOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDYW1lcmFNZXRhZGF0YSAoY29uc3QgU3RyaW5nOCAmKT4gbWV0YWRhdGFHZXR0ZXI7Ci0KIHN0cnVjdCBDYW1lcmFEZXZpY2VDbGllbnRCYXNlIDoKICAgICAgICAgIHB1YmxpYyBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCwKICAgICAgICAgIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhMjo6Qm5DYW1lcmFEZXZpY2VVc2VyCkBAIC01MCwxMCArNDksMTEgQEAKICAgICBDYW1lcmFEZXZpY2VDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKQEAgLTk1LDYgKzk1LDcgQEAKIAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVNcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4qIG9mZmxpbmVTdHJlYW1JZHMpIG92ZXJyaWRlOwogCkBAIC0xMTQsNiArMTE1LDcgQEAKIAogICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZUlucHV0U3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgaXNNdWx0aVJlc29sdXRpb24sCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBpbnQzMl90KiBuZXdTdHJlYW1JZCA9IE5VTEwpIG92ZXJyaWRlOwogCkBAIC0xNzUsMTIgKzE3NywxNCBAQAogICAgIENhbWVyYURldmljZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAorICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CiAgICAgdmlydHVhbCB+Q2FtZXJhRGV2aWNlQ2xpZW50KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCkBAIC0xODgsNiArMTkyLDkgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCByb3RhdGVBbmRDcm9wKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICBzdXBwb3J0c0NhbWVyYU11dGUoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgc2V0Q2FtZXJhTXV0ZShib29sIGVuYWJsZWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CkBAIC0xOTYsNyArMjAzLDggQEAKICAgICAgKiBEZXZpY2UgbGlzdGVuZXIgaW50ZXJmYWNlCiAgICAgICovCiAKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZSgpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlJZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpOwogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIG5zZWNzX3QgdGltZXN0YW1wKTsKQEAgLTIwNCwxNiArMjEyLDcgQEAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVxdWVzdFF1ZXVlRW1wdHkoKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVwZWF0aW5nUmVxdWVzdEVycm9yKGxvbmcgbGFzdEZyYW1lTnVtYmVyKTsKIAotICAgIC8vIHV0aWxpdHkgZnVuY3Rpb24gdG8gY29udmVydCBBSURMIFNlc3Npb25Db25maWd1cmF0aW9uIHRvIEhJREwKLSAgICAvLyBzdHJlYW1Db25maWd1cmF0aW9uLiBBbHNvIGNoZWNrcyBmb3IgdmFsaWRpdHkgb2YgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gYW5kCi0gICAgLy8gcmV0dXJucyBhIG5vbi1vayBiaW5kZXI6OlN0YXR1cyBpZiB0aGUgcGFzc2VkIGluIHNlc3Npb24gY29uZmlndXJhdGlvbgotICAgIC8vIGlzbid0IHZhbGlkLgotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cwotICAgIGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKLSAgICAgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgYm9vbCAqZWFybHlFeGl0KTsKKyAgICB2b2lkIHNldEltYWdlRHVtcE1hc2soaW50IG1hc2spIHsgaWYgKG1EZXZpY2UgIT0gbnVsbHB0cikgbURldmljZS0+c2V0SW1hZ2VEdW1wTWFzayhtYXNrKTsgfQogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IGluZGVwZW5kZW50IGNvbXBvbmVudHMgb2YgQ2FtZXJhRGV2aWNlQ2xpZW50LgogICAgICAqLwpAQCAtMjI1LDYgKzIyNCwxMyBAQAogICAgIC8vIENhbGN1bGF0ZSB0aGUgQU5hdGl2ZVdpbmRvdyB0cmFuc2Zvcm0gZnJvbSBhbmRyb2lkLnNlbnNvci5vcmllbnRhdGlvbgogICAgIHN0YXR1c190ICAgICAgICAgICAgICBnZXRSb3RhdGlvblRyYW5zZm9ybUxvY2tlZCgvKm91dCovaW50MzJfdCogdHJhbnNmb3JtKTsKIAorICAgIGJvb2wgaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKTsKKworICAgIGJvb2wgaXNTZW5zb3JQaXhlbE1vZGVDb25zaXN0ZW50KGNvbnN0IHN0ZDo6bGlzdDxpbnQ+ICZzdHJlYW1JZExpc3QsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc2V0dGluZ3MpOworCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmdldFN0YXRpY0luZm8oY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQpOworCiBwcml2YXRlOgogICAgIC8vIFN0cmVhbVN1cmZhY2VJZCBlbmNhcHN1bGF0ZXMgc3RyZWFtSWQgKyBzdXJmYWNlSWQgZm9yIGEgcGFydGljdWxhciBzdXJmYWNlLgogICAgIC8vIHN0cmVhbUlkIHNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIHN0cmVhbSB0aGUgc3VyZmFjZSBiZWxvbmdzIHRvLCBhbmQgdGhlCkBAIC0yNjYsMTggKzI3Miw4IEBACiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbik7Ci0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7Ci0gICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywgYm9vbCBkZWZlcnJlZENvbnN1bWVyLAotICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlKTsKLSAgICBzdGF0aWMgdm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogICAgIGJvb2wgZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOwogCi0gICAgLy8gRmluZCB0aGUgc3F1YXJlIG9mIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCi0gICAgc3RhdGljIGludDY0X3QgZXVjbGlkRGlzdFNxdWFyZShpbnQzMl90IHgwLCBpbnQzMl90IHkwLCBpbnQzMl90IHgxLCBpbnQzMl90IHkxKTsKLQogICAgIC8vIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIHdpdGggc3VyZmFjZSBkZWZlcnJlZCBmb3IgZnV0dXJlLgogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZURlZmVycmVkU3VyZmFjZVN0cmVhbUxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gJm91dHB1dENvbmZpZ3VyYXRpb24sCkBAIC0yODgsMzIgKzI4NCwxNCBAQAogICAgIC8vIGNhc2VzLgogICAgIGJpbmRlcjo6U3RhdHVzIHNldFN0cmVhbVRyYW5zZm9ybUxvY2tlZChpbnQgc3RyZWFtSWQpOwogCi0gICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKLSAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFJPVU5ESU5HX1dJRFRIX0NBUCA9IDE5MjA7Ci0gICAgc3RhdGljIGJvb2wgcm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCi0gICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOwotCi0gICAgLy9jaGVjayBpZiBmb3JtYXQgaXMgbm90IGN1c3RvbSBmb3JtYXQKLSAgICBzdGF0aWMgYm9vbCBpc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCk7Ci0KLSAgICAvLyBDcmVhdGUgYSBTdXJmYWNlIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4gUmV0dXJucyBlcnJvciBpZgotICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbwotICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicChPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAotICAgICAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwotCi0KICAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbnNlcnQgdGhlIHN1cmZhY2UgaW50byBTdXJmYWNlTWFwCiAgICAgYmluZGVyOjpTdGF0dXMgaW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgICAgICAvKm91dCovU3VyZmFjZU1hcCogc3VyZmFjZU1hcCwgLypvdXQqL1ZlY3RvcjxpbnQzMl90Piogc3RyZWFtSWRzLAogICAgICAgICAgICAgLypvdXQqL2ludDMyX3QqICBjdXJyZW50U3RyZWFtSWQpOwogCi0gICAgLy8gQ2hlY2sgdGhhdCB0aGUgcGh5c2ljYWxDYW1lcmFJZCBwYXNzZWQgaW4gaXMgc3Bwb3J0ZWQgYnkgdGhlIGNhbWVyYQotICAgIC8vIGRldmljZS4KLSAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgY2hlY2tQaHlzaWNhbENhbWVyYUlkKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZwaHlzaWNhbENhbWVyYUlkLCBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQpOworICAgIC8vIFV0aWxpdHkgbWV0aG9kIHRoYXQgbWFwcyBBSURMIHJlcXVlc3QgdGVtcGxhdGVzLgorICAgIGJpbmRlcjo6U3RhdHVzIG1hcFJlcXVlc3RUZW1wbGF0ZShpbnQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QqIHRlbXBJZCAvKm91dCovKTsKIAogICAgIC8vIElHcmFwaGljc0J1ZmZlclByb2R1Y2VyIGJpbmRlciAtPiBTdHJlYW0gSUQgKyBTdXJmYWNlIElEIGZvciBvdXRwdXQgc3RyZWFtcwogICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBTdHJlYW1TdXJmYWNlSWQ+IG1TdHJlYW1NYXA7CkBAIC0zMzYsNiArMzE0LDggQEAKIAogICAgIGludDMyX3QgbVJlcXVlc3RJZENvdW50ZXI7CiAKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsQ2FtZXJhSWRzOworCiAgICAgLy8gVGhlIGxpc3Qgb2Ygb3V0cHV0IHN0cmVhbXMgd2hvc2Ugc3VyZmFjZXMgYXJlIGRlZmVycmVkLiBXZSBoYXZlIHRvIHRyYWNrIHRoZW0gc2VwYXJhdGVseQogICAgIC8vIGFzIHRoZXJlIGFyZSBubyBzdXJmYWNlcyBhdmFpbGFibGUgYW5kIGNhbiBub3QgYmUgcHV0IGludG8gbVN0cmVhbU1hcC4gT25jZSB0aGUgZGVmZXJyZWQKICAgICAvLyBTdXJmYWNlIGlzIGNvbmZpZ3VyZWQsIHRoZSBzdHJlYW0gaWQgd2lsbCBiZSBtb3ZlZCB0byBtU3RyZWFtTWFwLgpAQCAtMzQ0LDEwICszMjQsMTggQEAKICAgICAvLyBzdHJlYW0gSUQgLT4gb3V0cHV0U3RyZWFtSW5mbyBtYXBwaW5nCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDMyX3QsIE91dHB1dFN0cmVhbUluZm8+IG1TdHJlYW1JbmZvTWFwOwogCisgICAgLy8gbWFwIGhpZ2ggcmVzb2x1dGlvbiBjYW1lcmEgaWQgKGxvZ2ljYWwgLyBwaHlzaWNhbCkgLT4gbGlzdCBvZiBzdHJlYW0gaWRzIGNvbmZpZ3VyZWQKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQ+PiBtSGlnaFJlc29sdXRpb25DYW1lcmFJZFRvU3RyZWFtSWRTZXQ7CisKKyAgICAvLyBzZXQgb2YgaGlnaCByZXNvbHV0aW9uIGNhbWVyYSBpZCAobG9naWNhbCAvIHBoeXNpY2FsKQorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbUhpZ2hSZXNvbHV0aW9uU2Vuc29yczsKKwogICAgIEtleWVkVmVjdG9yPHNwPElCaW5kZXI+LCBzcDxDb21wb3NpdGVTdHJlYW0+PiBtQ29tcG9zaXRlU3RyZWFtTWFwOwogCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OwogICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbVByb3ZpZGVyTWFuYWdlcjsKKworICAgIC8vIE92ZXJyaWRlIHRoZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBwZXJmb3JtYW5jZSBjbGFzcyBwcmltYXJ5IGNhbWVyYXMuCisgICAgYm9vbCBtT3ZlcnJpZGVGb3JQZXJmQ2xhc3M7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcAppbmRleCAyMzdjMjRiLi5lZjE1ZjJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmNwcApAQCAtNzIsNiArNzIsMTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK2Jvb2wgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OnN1cHBvcnRzQ2FtZXJhTXV0ZSgpIHsKKyAgICAvLyBPZmZsaW5lIG1vZGUgZG9lc24ndCBzdXBwb3J0IG11dGluZworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6OnNldENhbWVyYU11dGUoYm9vbCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworCiBzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmR1bXAoZmQsIGFyZ3MpOwogfQpAQCAtMjY1LDEwICsyNzUsMTcgQEAKICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6Om5vdGlmeUlkbGUoKSB7CitzdGF0dXNfdCBDYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudDo6bm90aWZ5QWN0aXZlKCkgeworICAgIHJldHVybiBzdGFydENhbWVyYVN0cmVhbWluZ09wcygpOworfQorCit2b2lkIENhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50Ojpub3RpZnlJZGxlKAorICAgICAgICBpbnQ2NF90IC8qcmVxdWVzdENvdW50Ki8sIGludDY0X3QgLypyZXN1bHRFcnJvckNvdW50Ki8sIGJvb2wgLypkZXZpY2VFcnJvciovLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiAvKnN0cmVhbVN0YXRzKi8pIHsKICAgICBpZiAobVJlbW90ZUNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkRldmljZUlkbGUoKTsKICAgICB9CisgICAgZmluaXNoQ2FtZXJhU3RyZWFtaW5nT3BzKCk7CiB9CiAKIHZvaWQgQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQ6Om5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKaW5kZXggYjY3ZmNiMy4uYjIxOWE0YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaApAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4mIG9mZmxpbmVDb21wb3NpdGVTdHJlYW1NYXAsCiAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwgaW50IGNhbWVyYUZhY2luZywgaW50IHNlbnNvck9yaWVudGF0aW9uLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudEZlYXR1cmVJZCwKLSAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWRTdHIsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZFN0ciwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICAgICAgbVJlbW90ZUNhbGxiYWNrKHJlbW90ZUNhbGxiYWNrKSwgbU9mZmxpbmVTZXNzaW9uKHNlc3Npb24pLAogICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcChvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwKSB7fQogCkBAIC03Niw2ICs3Niw5IEBACiAKICAgICBzdGF0dXNfdCBzZXRSb3RhdGVBbmRDcm9wT3ZlcnJpZGUodWludDhfdCByb3RhdGVBbmRDcm9wKSBvdmVycmlkZTsKIAorICAgIGJvb2wgc3VwcG9ydHNDYW1lcmFNdXRlKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0Q2FtZXJhTXV0ZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOworCiAgICAgLy8gcGVybWlzc2lvbnMgbWFuYWdlbWVudAogICAgIHN0YXR1c190IHN0YXJ0Q2FtZXJhT3BzKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZmluaXNoQ2FtZXJhT3BzKCkgb3ZlcnJpZGU7CkBAIC04Niw3ICs4OSw5IEBACiAgICAgLy8gTm90aWZpY2F0aW9uTGlzdGVuZXIgQVBJCiAgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBub3RpZnlJZGxlKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBub3RpZnlJZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cykgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvRm9jdXModWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgb3ZlcnJpZGU7CiAgICAgdm9pZCBub3RpZnlBdXRvV2hpdGViYWxhbmNlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwCmluZGV4IGE2MWRhYzcuLjRiODQwZmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTQ2LDggKzQ2LDEwIEBACiAKIHN0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqIGlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICogc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSB7CisgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICogaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKiBzdXJmYWNlSWRzLAorICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIHsKICAgICBpZiAoaGFzRGVmZXJyZWRDb25zdW1lcikgewogICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVycyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwpAQCAtNjYsOCArNjgsMTQgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICByZXR1cm4gY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN1bWVycywgaGFzRGVmZXJyZWRDb25zdW1lciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCByb3RhdGlvbiwgaWQsCi0gICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzLCBzdHJlYW1TZXRJZCwgaXNTaGFyZWQpOworICAgIGlmIChpc011bHRpUmVzb2x1dGlvbikgeworICAgICAgICBBTE9HRSgiJXM6IE11bHRpLXJlc29sdXRpb24gb3V0cHV0IG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdW1lcnMsIGhhc0RlZmVycmVkQ29uc3VtZXIsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgcm90YXRpb24sCisgICAgICAgICAgICBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN1cmZhY2VJZHMsIHN0cmVhbVNldElkLCBpc1NoYXJlZCk7CiB9CiAKIHN0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlU3RyZWFtKCkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmgKaW5kZXggNWY2MmQ0Ny4uNjAwYmQyOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oCkBAIC00Myw4ICs0MywxMCBAQAogCiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCk7CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywKKyAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbik7CiAKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKIApAQCAtNTQsOCArNTYsMTAgQEAKICAgICAvLyBDcmVhdGUgYW5kIHJlZ2lzdGVyIGFsbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpID0gMDsKKyAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLAorICAgICAgICAgICAgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSA9IDA7CiAKICAgICAvLyBSZWxlYXNlIGFsbCBpbnRlcm5hbCBzdHJlYW1zIGFuZCBjb3JyZXNwb25kaW5nIHJlc291cmNlcy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKaW5kZXggYzY4NTliZS4uYTY2YTU5MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CkBAIC00MSwxNyArNDIsMjkgQEAKICAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQoZmFsc2UpLAogICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKICAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCi0gICAgICAgIG1NYXhKcGVnU2l6ZSgtMSksCisgICAgICAgIG1NYXhKcGVnQnVmZmVyU2l6ZSgtMSksCisgICAgICAgIG1VSFJNYXhKcGVnQnVmZmVyU2l6ZSgtMSksCiAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpIHsKICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOwogICAgICAgICBhdXRvIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfSlBFR19NQVhfU0laRSk7CiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgIG1NYXhKcGVnU2l6ZSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgbU1heEpwZWdCdWZmZXJTaXplID0gZW50cnkuZGF0YS5pMzJbMF07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IE1heGltdW0ganBlZyBzaXplIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAKKyAgICAgICAgbVVIUk1heEpwZWdTaXplID0KKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihzdGF0aWNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgLyp1bHRyYUhpZ2hSZXNvbHV0aW9uKi90cnVlKTsKKyAgICAgICAgbURlZmF1bHRNYXhKcGVnU2l6ZSA9CisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0TWF4SnBlZ1Jlc29sdXRpb24oc3RhdGljSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qaXNVbHRyYUhpZ2hSZXNvbHV0aW9uKi9mYWxzZSk7CisKKyAgICAgICAgbVVIUk1heEpwZWdCdWZmZXJTaXplID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldFVIUk1heEpwZWdCdWZmZXJTaXplKG1VSFJNYXhKcGVnU2l6ZSwgbURlZmF1bHRNYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbU1heEpwZWdCdWZmZXJTaXplKTsKKwogICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OKTsKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKICAgICAgICAgICAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbi5yZXNlcnZlKDUpOwpAQCAtNzgsNyArOTEsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoc3RhdGljSW5mbywgJm1TdXBwb3J0ZWREZXB0aFNpemVzKTsKKyAgICAgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhzdGF0aWNJbmZvLCAvKm1heFJlc29sdXRpb24qL2ZhbHNlLCAmbVN1cHBvcnRlZERlcHRoU2l6ZXMpOworICAgICAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKHN0YXRpY0luZm8pKSB7CisgICAgICAgICAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKHN0YXRpY0luZm8sIHRydWUsICZtU3VwcG9ydGVkRGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjM5LDEzICsyNTUsMjIgQEAKICAgICAgICAganBlZ1NpemUgPSBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGg7CiAgICAgfQogCi0gICAgc2l6ZV90IG1heERlcHRoSnBlZ1NpemU7Ci0gICAgaWYgKG1NYXhKcGVnU2l6ZSA+IDApIHsKLSAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IG1NYXhKcGVnU2l6ZTsKKyAgICBzaXplX3QgbWF4RGVwdGhKcGVnQnVmZmVyU2l6ZSA9IDA7CisgICAgaWYgKG1NYXhKcGVnQnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiB1bHRyYSBoaWdoIHJlc29sdXRpb24gc2Vuc29yIGFuZCB0aGUgaW5wdXQgZnJhbWVzIHNpemUKKyAgICAgICAgLy8gaXMgPiBkZWZhdWx0IHJlcyBqcGVnLgorICAgICAgICBpZiAobVVIUk1heEpwZWdTaXplLndpZHRoICE9IDAgJiYKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGggKiBpbnB1dEZyYW1lLmpwZWdCdWZmZXIuaGVpZ2h0ID4KKyAgICAgICAgICAgICAgICBtRGVmYXVsdE1heEpwZWdTaXplLndpZHRoICogbURlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpIHsKKyAgICAgICAgICAgIG1heERlcHRoSnBlZ0J1ZmZlclNpemUgPSBtVUhSTWF4SnBlZ0J1ZmZlclNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhEZXB0aEpwZWdCdWZmZXJTaXplID0gbU1heEpwZWdCdWZmZXJTaXplOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IHN0ZDo6bWF4PHNpemVfdD4gKGpwZWdTaXplLAorICAgICAgICBtYXhEZXB0aEpwZWdCdWZmZXJTaXplID0gc3RkOjptYXg8c2l6ZV90PiAoanBlZ1NpemUsCiAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuaGVpZ2h0ICogMyAvIDIpOwogICAgIH0KKwogICAgIHVpbnQ4X3QganBlZ1F1YWxpdHkgPSAxMDA7CiAgICAgYXV0byBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOwogICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKQEAgLTI1NSw3ICsyODAsNyBAQAogICAgIC8vIFRoZSBmaW5hbCBkZXB0aCBwaG90byB3aWxsIGNvbnNpc3Qgb2YgdGhlIG1haW4ganBlZyBidWZmZXIsIHRoZSBkZXB0aCBtYXAgYnVmZmVyIChhbHNvIGluCiAgICAgLy8ganBlZyBmb3JtYXQpIGFuZCBjb25maWRlbmNlIG1hcCAoanBlZyBhcyB3ZWxsKS4gQXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBhbGwgMyBqcGVnIG5lZWQKICAgICAvLyBtYXgganBlZyBzaXplLgotICAgIHNpemVfdCBmaW5hbEpwZWdCdWZmZXJTaXplID0gbWF4RGVwdGhKcGVnU2l6ZSAqIDM7CisgICAgc2l6ZV90IGZpbmFsSnBlZ0J1ZmZlclNpemUgPSBtYXhEZXB0aEpwZWdCdWZmZXJTaXplICogMzsKIAogICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxKSkKICAgICAgICAgICAgICE9IE9LKSB7CkBAIC0yOTgsNyArMzIzLDcgQEAKICAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFN0cmlkZSA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuc3RyaWRlOwogICAgIGRlcHRoUGhvdG8ubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CiAgICAgZGVwdGhQaG90by5tSXNMb2dpY2FsID0gbUlzTG9naWNhbENhbWVyYTsKLSAgICBkZXB0aFBob3RvLm1NYXhKcGVnU2l6ZSA9IG1heERlcHRoSnBlZ1NpemU7CisgICAgZGVwdGhQaG90by5tTWF4SnBlZ1NpemUgPSBtYXhEZXB0aEpwZWdCdWZmZXJTaXplOwogICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgogICAgIC8vIFtmb2NhbExlbmd0aFgsIGZvY2FsTGVuZ3RoWSwgb3B0aWNhbENlbnRlclgsIG9wdGljYWxDZW50ZXJZLCBza2V3XQogICAgIGlmIChtSW50cmluc2ljQ2FsaWJyYXRpb24uc2l6ZSgpID09IDUpIHsKQEAgLTM0MSw3ICszNjYsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHNpemVfdCBmaW5hbEpwZWdTaXplID0gYWN0dWFsSnBlZ1NpemUgKyBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKTsKKyAgICBzaXplX3QgZmluYWxKcGVnU2l6ZSA9IGFjdHVhbEpwZWdTaXplICsgc2l6ZW9mKHN0cnVjdCBjYW1lcmFfanBlZ19ibG9iKTsKICAgICBpZiAoZmluYWxKcGVnU2l6ZSA+IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBGaW5hbCBqcGVnIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUganBlZyBibG9iIGhlYWRlciIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CkBAIC0zNTcsOSArMzgyLDkgQEAKIAogICAgIEFMT0dWKCIlczogRmluYWwganBlZyBzaXplOiAlenUiLCBfX2Z1bmNfXywgZmluYWxKcGVnU2l6ZSk7CiAgICAgdWludDhfdCogaGVhZGVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPiAoZHN0QnVmZmVyKSArCi0gICAgICAgIChnYi0+Z2V0V2lkdGgoKSAtIHNpemVvZihzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IpKTsKLSAgICBzdHJ1Y3QgY2FtZXJhM19qcGVnX2Jsb2IgKmJsb2IgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYio+IChoZWFkZXIpOwotICAgIGJsb2ItPmpwZWdfYmxvYl9pZCA9IENBTUVSQTNfSlBFR19CTE9CX0lEOworICAgICAgICAoZ2ItPmdldFdpZHRoKCkgLSBzaXplb2Yoc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IpKTsKKyAgICBzdHJ1Y3QgY2FtZXJhX2pwZWdfYmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IqPiAoaGVhZGVyKTsKKyAgICBibG9iLT5qcGVnX2Jsb2JfaWQgPSBDQU1FUkFfSlBFR19CTE9CX0lEOwogICAgIGJsb2ItPmpwZWdfc2l6ZSA9IGFjdHVhbEpwZWdTaXplOwogICAgIG91dHB1dEFOVy0+cXVldWVCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKIApAQCAtNDg0LDE3ICs1MDksODIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXRpYyBib29sIHNldENvbnRhaW5zKHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBjb250YWluZXJTZXQsIGludDMyX3QgdmFsdWUpIHsKKyAgICByZXR1cm4gY29udGFpbmVyU2V0LmZpbmQodmFsdWUpICE9IGNvbnRhaW5lclNldC5lbmQoKTsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNoZWNrQW5kR2V0TWF0Y2hpbmdEZXB0aFNpemUoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gJmRlcHRoU2l6ZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAmZGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGgsIHNpemVfdCAqZGVwdGhIZWlnaHQpIHsKKyAgICBpZiAoZGVwdGhXaWR0aCA9PSBudWxscHRyIHx8IGRlcHRoSGVpZ2h0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IGNob3NlbkRlcHRoV2lkdGggPSAwLCBjaG9zZW5EZXB0aEhlaWdodCA9IDA7CisgICAgYm9vbCBoYXNEZWZhdWx0U2Vuc29yUGl4ZWxNb2RlID0KKyAgICAgICAgICAgIHNldENvbnRhaW5zKHNlbnNvclBpeGVsTW9kZXNVc2VkLCBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQpOworCisgICAgYm9vbCBoYXNNYXhpbXVtUmVzb2x1dGlvblNlbnNvclBpeGVsTW9kZSA9CisgICAgICAgIHNldENvbnRhaW5zKHNlbnNvclBpeGVsTW9kZXNVc2VkLCBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTik7CisKKyAgICBpZiAoIWhhc0RlZmF1bHRTZW5zb3JQaXhlbE1vZGUgJiYgIWhhc01heGltdW1SZXNvbHV0aW9uU2Vuc29yUGl4ZWxNb2RlKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vuc29yIHBpeGVsIG1vZGVzIGRvbid0IGNvbnRhaW4gZWl0aGVyIG1heGltdW0gcmVzb2x1dGlvbiBvciBkZWZhdWx0IG1vZGVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChoYXNEZWZhdWx0U2Vuc29yUGl4ZWxNb2RlKSB7CisgICAgICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUod2lkdGgsIGhlaWdodCwgZGVwdGhTaXplcywgJmNob3NlbkRlcHRoV2lkdGgsCisgICAgICAgICAgICAgICAgJmNob3NlbkRlcHRoSGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGhhc01heGltdW1SZXNvbHV0aW9uU2Vuc29yUGl4ZWxNb2RlKSB7CisgICAgICAgIHNpemVfdCBkZXB0aFdpZHRoID0gMCwgZGVwdGhIZWlnaHQgPSAwOworICAgICAgICBhdXRvIHJldCA9IGdldE1hdGNoaW5nRGVwdGhTaXplKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgZGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uLCAmZGVwdGhXaWR0aCwgJmRlcHRoSGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBtYXggcmVzb2x1dGlvbiBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIC8vIEJvdGggbWF0Y2hpbmcgZGVwdGggc2l6ZXMgc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICBpZiAoY2hvc2VuRGVwdGhXaWR0aCAhPSAwICYmIGNob3NlbkRlcHRoV2lkdGggIT0gZGVwdGhXaWR0aCAmJgorICAgICAgICAgICAgICAgIGNob3NlbkRlcHRoSGVpZ2h0ICE9IGRlcHRoSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE1heGltdW0gcmVzb2x1dGlvbiBzZW5zb3IgcGl4ZWwgbW9kZSBhbmQgZGVmYXVsdCBzZW5zb3IgcGl4ZWwgbW9kZSBkb24ndCIKKyAgICAgICAgICAgICAgICAgICAgIiBoYXZlIG1hdGNoaW5nIGRlcHRoIHNpemVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNob3NlbkRlcHRoV2lkdGggPT0gMCkgeworICAgICAgICAgICAgY2hvc2VuRGVwdGhXaWR0aCA9IGRlcHRoV2lkdGg7CisgICAgICAgICAgICBjaG9zZW5EZXB0aEhlaWdodCA9IGRlcHRoSGVpZ2h0OworICAgICAgICB9CisgICAgfQorICAgICpkZXB0aFdpZHRoID0gY2hvc2VuRGVwdGhXaWR0aDsKKyAgICAqZGVwdGhIZWlnaHQgPSBjaG9zZW5EZXB0aEhlaWdodDsKKyAgICByZXR1cm4gT0s7Cit9CisKKwogc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLAorICAgICAgICBpbnQgLypzdHJlYW1TZXRJZCovLCBib29sIC8qaXNTaGFyZWQqLykgewogICAgIGlmIChtU3VwcG9ydGVkRGVwdGhTaXplcy5lbXB0eSgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVGhpcyBjYW1lcmEgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgZGVwdGggbWFwIHN0cmVhbXMhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAogICAgIHNpemVfdCBkZXB0aFdpZHRoLCBkZXB0aEhlaWdodDsKLSAgICBhdXRvIHJldCA9IGdldE1hdGNoaW5nRGVwdGhTaXplKHdpZHRoLCBoZWlnaHQsIG1TdXBwb3J0ZWREZXB0aFNpemVzLCAmZGVwdGhXaWR0aCwgJmRlcHRoSGVpZ2h0KTsKKyAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBjaGVja0FuZEdldE1hdGNoaW5nRGVwdGhTaXplKHdpZHRoLCBoZWlnaHQsIG1TdXBwb3J0ZWREZXB0aFNpemVzLAorICAgICAgICAgICAgICAgICAgICBtU3VwcG9ydGVkRGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgJmRlcHRoV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICZkZXB0aEhlaWdodCk7CiAgICAgaWYgKHJldCAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGRlcHRoIHN0cmVhbSBzaXplISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC01MTUsNyArNjA1LDcgQEAKICAgICBtQmxvYlN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAKICAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQmxvYlN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwga0pwZWdEYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdXJmYWNlSWRzKTsKICAgICBpZiAocmV0ID09IE9LKSB7CiAgICAgICAgIG1CbG9iU3RyZWFtSWQgPSAqaWQ7CiAgICAgICAgIG1CbG9iU3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKQEAgLTUzMSw3ICs2MjEsOCBAQAogICAgIG1EZXB0aFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBkZXB0aFN1cmZhY2VJZDsKICAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtRGVwdGhTdXJmYWNlLCBkZXB0aFdpZHRoLCBkZXB0aEhlaWdodCwga0RlcHRoTWFwUGl4ZWxGb3JtYXQsCi0gICAgICAgICAgICBrRGVwdGhNYXBEYXRhU3BhY2UsIHJvdGF0aW9uLCAmbURlcHRoU3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZkZXB0aFN1cmZhY2VJZCk7CisgICAgICAgICAgICBrRGVwdGhNYXBEYXRhU3BhY2UsIHJvdGF0aW9uLCAmbURlcHRoU3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgJmRlcHRoU3VyZmFjZUlkKTsKICAgICBpZiAocmV0ID09IE9LKSB7CiAgICAgICAgIG1EZXB0aFN1cmZhY2VJZCA9IGRlcHRoU3VyZmFjZUlkWzBdOwogICAgIH0gZWxzZSB7CkBAIC02NjYsMTMgKzc1NywxMSBAQAogc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06Omluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKICAgICAgICAgVmVjdG9yPGludDMyX3Q+ICogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgewogICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1EZXB0aFN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgewotICAgICAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobURlcHRoU3RyZWFtSWQpOwogICAgIH0KICAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXS5wdXNoX2JhY2sobURlcHRoU3VyZmFjZUlkKTsKIAogICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1CbG9iU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7Ci0gICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CiAgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1CbG9iU3RyZWFtSWQpOwogICAgIH0KICAgICAoKm91dFN1cmZhY2VNYXApW21CbG9iU3RyZWFtSWRdLnB1c2hfYmFjayhtQmxvYlN1cmZhY2VJZCk7CkBAIC03NTEsMTMgKzg0MCwxNSBAQAogICAgIHJldHVybiAoKCpkZXB0aFdpZHRoID4gMCkgJiYgKCpkZXB0aEhlaWdodCA+IDApKSA/IE9LIDogQkFEX1ZBTFVFOwogfQogCi12b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldFN1cHBvcnRlZERlcHRoU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBib29sIG1heFJlc29sdXRpb24sCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiogZGVwdGhTaXplcyAvKm91dCovKSB7CiAgICAgaWYgKGRlcHRoU2l6ZXMgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYXV0byBlbnRyeSA9IGNoLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBhdXRvIGVudHJ5ID0gY2guZmluZCgKKyAgICAgICAgICAgIGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKSk7CiAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAvLyBEZXB0aCBzdHJlYW0gZGltZW5zaW9ucyBoYXZlIGZvdXIgaW50MzJfdCBjb21wb25lbnRzCiAgICAgICAgIC8vIChwaXhlbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgdHlwZSkKQEAgLTc4MSwzMCArODcyLDQzIEBACiAgICAgfQogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IGRlcHRoU2l6ZXM7Ci0gICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjaCwgJmRlcHRoU2l6ZXMpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBkZXB0aFNpemVzTWF4aW11bVJlc29sdXRpb247CisgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjaCwgLyptYXhSZXNvbHV0aW9uKi9mYWxzZSwgJmRlcHRoU2l6ZXMpOwogICAgIGlmIChkZXB0aFNpemVzLmVtcHR5KCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBObyBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgcHJlc2VudCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc2l6ZV90IGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0OwotICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUoc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsIGRlcHRoU2l6ZXMsICZkZXB0aFdpZHRoLAotICAgICAgICAgICAgJmRlcHRoSGVpZ2h0KTsKKyAgICBpZiAoU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yKGNoKSkgeworICAgICAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNoLCAvKm1heFJlc29sdXRpb24qL3RydWUsICZkZXB0aFNpemVzTWF4aW11bVJlc29sdXRpb24pOworICAgICAgICBpZiAoZGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBtYXhpbXVtIHJlc29sdXRpb24gcHJlc2VudCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGNob3NlbkRlcHRoV2lkdGggPSAwLCBjaG9zZW5EZXB0aEhlaWdodCA9IDA7CisgICAgYXV0byByZXQgPSBjaGVja0FuZEdldE1hdGNoaW5nRGVwdGhTaXplKHN0cmVhbUluZm8ud2lkdGgsIHN0cmVhbUluZm8uaGVpZ2h0LCBkZXB0aFNpemVzLAorICAgICAgICAgICAgZGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uLCBzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkLCAmY2hvc2VuRGVwdGhXaWR0aCwKKyAgICAgICAgICAgICZjaG9zZW5EZXB0aEhlaWdodCk7CisKICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gbWF0Y2hpbmcgZGVwdGggc3RyZWFtIHNpemUgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGdldCBtYXRjaGluZyBkZXB0aCBzaXplcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOwogICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOwogCisgICAgLy8gU2Vuc29yIHBpeGVsIG1vZGVzIHNob3VsZCBzdGF5IHRoZSBzYW1lIGhlcmUuIFRoZXkncmUgYWxyZWFkeSBvdmVycmlkZGVuLgogICAgIC8vIEpwZWcvQmxvYiBzdHJlYW0gaW5mbwogICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5kYXRhU3BhY2UgPSBrSnBlZ0RhdGFTcGFjZTsKICAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKIAogICAgIC8vIERlcHRoIHN0cmVhbSBpbmZvCi0gICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gZGVwdGhXaWR0aDsKLSAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gZGVwdGhIZWlnaHQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gY2hvc2VuRGVwdGhXaWR0aDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gY2hvc2VuRGVwdGhIZWlnaHQ7CiAgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmZvcm1hdCA9IGtEZXB0aE1hcFBpeGVsRm9ybWF0OwogICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5kYXRhU3BhY2UgPSBrRGVwdGhNYXBEYXRhU3BhY2U7CiAgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKaW5kZXggY2FiNTJiNi4uYzFjNzVjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApAQCAtNTAsOCArNTAsMTAgQEAKICAgICAvLyBDb21wb3NpdGVTdHJlYW0gb3ZlcnJpZGVzCiAgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywKKyAgICAgICAgICAgIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCkBAIC04NiwxMSArODgsMTcgQEAKICAgICB9OwogCiAgICAgLy8gSGVscGVyIG1ldGhvZHMKLSAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgYm9vbCBtYXhSZXNvbHV0aW9uLAogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pOwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHN1cHBvcmVkRGVwdGhTaXplcywKICAgICAgICAgICAgIHNpemVfdCAqZGVwdGhXaWR0aCAvKm91dCovLCBzaXplX3QgKmRlcHRoSGVpZ2h0IC8qb3V0Ki8pOworICAgIHN0YXRpYyBzdGF0dXNfdCBjaGVja0FuZEdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICZkZXB0aFNpemVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gJmRlcHRoU2l6ZXNNYXhpbXVtUmVzb2x1dGlvbiwKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLyk7CisKIAogICAgIC8vIER5bmFtaWMgZGVwdGggcHJvY2Vzc2luZwogICAgIHN0YXR1c190IGVuY29kZUdyYXlzY2FsZUpwZWcoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCB1aW50OF90ICppbiwgdm9pZCAqb3V0LApAQCAtMTI0LDggKzEzMiwxNCBAQAogICAgIHNwPFN1cmZhY2U+ICAgICAgICAgIG1EZXB0aFN1cmZhY2UsIG1CbG9iU3VyZmFjZSwgbU91dHB1dFN1cmZhY2U7CiAgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CiAKLSAgICBzc2l6ZV90ICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgc3NpemVfdCAgICAgICAgICAgICAgbU1heEpwZWdCdWZmZXJTaXplOworICAgIHNzaXplX3QgICAgICAgICAgICAgIG1VSFJNYXhKcGVnQnVmZmVyU2l6ZTsKKworICAgIGNhbWVyYTM6OlNpemUgICAgICAgIG1EZWZhdWx0TWF4SnBlZ1NpemU7CisgICAgY2FtZXJhMzo6U2l6ZSAgICAgICAgbVVIUk1heEpwZWdTaXplOworCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IG1TdXBwb3J0ZWREZXB0aFNpemVzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBtU3VwcG9ydGVkRGVwdGhTaXplc01heGltdW1SZXNvbHV0aW9uOwogICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbiwgbUxlbnNEaXN0b3J0aW9uOwogICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmE7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCmluZGV4IGE2M2Y0MDIuLmE3M2ZmYjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMTYsNiArMTYsNyBAQAogCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZVN0cmVhbSIKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorI2RlZmluZSBBTElHTih4LCBtYXNrKSAoICgoeCkgKyAobWFzaykgLSAxKSAmIH4oKG1hc2spIC0gMSkgKQogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KQEAgLTM2LDYgKzM3LDcgQEAKIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAjaW5jbHVkZSAidXRpbHMvRXhpZlV0aWxzLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgogI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKICNpbmNsdWRlICJIZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAKQEAgLTY1LDcgKzY3LDYgQEAKICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKICAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCiAgICAgICAgIG1EZXF1ZXVlZE91dHB1dEJ1ZmZlckNudCgwKSwKLSAgICAgICAgbUxvY2tlZEFwcFNlZ21lbnRCdWZmZXJDbnQoMCksCiAgICAgICAgIG1Db2RlY091dHB1dENvdW50ZXIoMCksCiAgICAgICAgIG1RdWFsaXR5KC0xKSwKICAgICAgICAgbUdyaWRUaW1lc3RhbXBVcygwKSwKQEAgLTExNSw4ICsxMTYsMTAgQEAKIAogc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICBib29sIC8qaGFzRGVmZXJyZWRDb25zdW1lciovLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgLypzdHJlYW1TZXRJZCovLCBib29sIC8qaXNTaGFyZWQqLykgeworICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsCisgICAgICAgIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CiAKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoIWRldmljZS5nZXQoKSkgewpAQCAtMTQyLDcgKzE0NSw4IEBACiAgICAgbVN0YXRpY0luZm8gPSBkZXZpY2UtPmluZm8oKTsKIAogICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1BcHBTZWdtZW50U3VyZmFjZSwgbUFwcFNlZ21lbnRNYXhTaXplLCAxLCBmb3JtYXQsCi0gICAgICAgICAgICBrQXBwU2VnbWVudERhdGFTcGFjZSwgcm90YXRpb24sICZtQXBwU2VnbWVudFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgICAgIGtBcHBTZWdtZW50RGF0YVNwYWNlLCByb3RhdGlvbiwgJm1BcHBTZWdtZW50U3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZCxzdXJmYWNlSWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKICAgICB9IGVsc2UgewpAQCAtMTc4LDcgKzE4Miw3IEBACiAgICAgaW50IHNyY1N0cmVhbUZtdCA9IG1Vc2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtTWFpbkltYWdlU3VyZmFjZSwgd2lkdGgsIGhlaWdodCwgc3JjU3RyZWFtRm10LCBrSGVpZkRhdGFTcGFjZSwKLSAgICAgICAgICAgIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnNvdXJjZVN1cmZhY2VJZCk7CisgICAgICAgICAgICByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCAmc291cmNlU3VyZmFjZUlkKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQgPSBzb3VyY2VTdXJmYWNlSWRbMF07CiAgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCA9ICppZDsKQEAgLTUxMCw3ICs1MTQsOCBAQAogCiAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gc3RkOjpzdHJpbmcoIkhlaWNTdHJlYW0gIikgKyBzdGQ6OnRvX3N0cmluZyhnZXRTdHJlYW1JZCgpKTsKKyAgICAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KG5hbWUpOwogICAgIH0KIAogICAgIHJ1bigiSGVpY0NvbXBvc2l0ZVN0cmVhbVByb2MiKTsKQEAgLTUyMSwxMyArNTI2LDExIEBACiBzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgewogICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1BcHBTZWdtZW50U3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7Ci0gICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUFwcFNlZ21lbnRTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CiAgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1BcHBTZWdtZW50U3RyZWFtSWQpOwogICAgIH0KICAgICAoKm91dFN1cmZhY2VNYXApW21BcHBTZWdtZW50U3RyZWFtSWRdLnB1c2hfYmFjayhtQXBwU2VnbWVudFN1cmZhY2VJZCk7CiAKICAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtTWFpbkltYWdlU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7Ci0gICAgICAgICgqb3V0U3VyZmFjZU1hcClbbU1haW5JbWFnZVN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKICAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobU1haW5JbWFnZVN0cmVhbUlkKTsKICAgICB9CiAgICAgKCpvdXRTdXJmYWNlTWFwKVttTWFpbkltYWdlU3RyZWFtSWRdLnB1c2hfYmFjayhtTWFpbkltYWdlU3VyZmFjZUlkKTsKQEAgLTYzNCw3ICs2MzcsNiBAQAogICAgICAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ZyYW1lTnVtYmVyXS5hcHBTZWdtZW50QnVmZmVyID0gaW1nQnVmZmVyOwotICAgICAgICAgICAgbUxvY2tlZEFwcFNlZ21lbnRCdWZmZXJDbnQrKzsKICAgICAgICAgfQogICAgICAgICBtSW5wdXRBcHBTZWdtZW50QnVmZmVycy5lcmFzZShpdCk7CiAgICAgICAgIG1BcHBTZWdtZW50RnJhbWVOdW1iZXJzLnBvcCgpOwpAQCAtODk3LDEwICs4OTksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudCA9PSBrTWF4QWNxdWlyZWRBcHBTZWdtZW50KSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE91dC1vZi1vcmRlciBhcHAgc2VnbWVudCBidWZmZXJzIHJlYWNoZXMgbGltaXQgJXUiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGtNYXhBY3F1aXJlZEFwcFNlZ21lbnQpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDM4LDcgKzEwMzYsNiBAQAogICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIpOwogICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKICAgICBpbnB1dEZyYW1lLmV4aWZFcnJvciA9IGZhbHNlOwotICAgIG1Mb2NrZWRBcHBTZWdtZW50QnVmZmVyQ250LS07CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMzg0LDcgKzEzODEsOSBAQAogICAgIG1PdXRwdXRXaWR0aCA9IHdpZHRoOwogICAgIG1PdXRwdXRIZWlnaHQgPSBoZWlnaHQ7CiAgICAgbUFwcFNlZ21lbnRNYXhTaXplID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNhbWVyYURldmljZS0+aW5mbygpKTsKLSAgICBtTWF4SGVpY0J1ZmZlclNpemUgPSBtT3V0cHV0V2lkdGggKiBtT3V0cHV0SGVpZ2h0ICogMyAvIDIgKyBtQXBwU2VnbWVudE1heFNpemU7CisgICAgbU1heEhlaWNCdWZmZXJTaXplID0KKyAgICAgICAgQUxJR04obU91dHB1dFdpZHRoLCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZFdpZHRoKSAqCisgICAgICAgIEFMSUdOKG1PdXRwdXRIZWlnaHQsIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0KSAqIDMgLyAyICsgbUFwcFNlZ21lbnRNYXhTaXplOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaAppbmRleCAzM2NhNjlhLi4xMDc3YTFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApAQCAtNDUsOCArNDUsMTAgQEAKIAogICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICpzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIG92ZXJyaWRlOworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsCisgICAgICAgICAgICBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CiAKQEAgLTI1Myw3ICsyNTUsNiBAQAogCiAgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgQVBQIHNlZ21lbnQgQmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnM7Ci0gICAgaW50MzJfdCAgICAgICAgICAgbUxvY2tlZEFwcFNlZ21lbnRCdWZmZXJDbnQ7CiAKICAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBIRUlDIGJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgogICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gbUNvZGVjT3V0cHV0QnVmZmVyczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKaW5kZXggNThlZGJhMi4uYTY1YmU5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBib29sIGlzU2l6ZVN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSkgY29uc3Q7CiAKKyAgICAvLyBrR3JpZFdpZHRoIGFuZCBrR3JpZEhlaWdodCBzaG91bGQgYmUgMl5uCiAgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRXaWR0aCA9IDUxMjsKICAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZEhlaWdodCA9IDUxMjsKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAwYTQxNzc2Li4xM2QwNDRhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTI3LDEyICsyNywxNSBAQAogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaD4KKwogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIgogCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKQEAgLTQ0LDE4ICs0NywyMSBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCisgICAgICAgIGludCBzZW5zb3JPcmllbnRhdGlvbiwKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkLAorICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKToKICAgICAgICAgVENsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRGZWF0dXJlSWQsCi0gICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCisgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLCBzZW5zb3JPcmllbnRhdGlvbiwgY2xpZW50UGlkLCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgc2VydmljZVBpZCksCiAgICAgICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MocmVtb3RlQ2FsbGJhY2spLAogICAgICAgICBtRGV2aWNlVmVyc2lvbihjYW1lcmFTZXJ2aWNlLT5nZXREZXZpY2VWZXJzaW9uKFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIpKSwKLSAgICAgICAgbURldmljZShuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCkpLAorICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcykpLAogICAgICAgICBtRGV2aWNlQWN0aXZlKGZhbHNlKSwgbUFwaTFDYW1lcmFJZChhcGkxQ2FtZXJhSWQpCiB7CiAgICAgQUxPR0koIkNhbWVyYSAlczogT3BlbmVkLiBDbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAlZCkiLCBjYW1lcmFJZC5zdHJpbmcoKSwKQEAgLTE5MCwxMSArMTk2LDE4IEBACiAKICAgICBBTE9HVigiQ2FtZXJhICVzOiBTaHV0dGluZyBkb3duIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKKyAgICAvLyBCZWZvcmUgZGV0YWNoaW5nIHRoZSBkZXZpY2UsIGNhY2hlIHRoZSBpbmZvIGZyb20gY3VycmVudCBvcGVuIHNlc3Npb24uCisgICAgLy8gVGhlIGRpc2Nvbm5lY3RlZCBjaGVjayBhdm9pZHMgZHVwbGljYXRpb24gb2YgaW5mbyBhbmQgYWxzbyBwcmV2ZW50cworICAgIC8vIGRlYWRsb2NrIHdoaWxlIGFjcXVpcmluZyBzZXJ2aWNlIGxvY2sgaW4gY2FjaGVEdW1wLgorICAgIGlmICghVENsaWVudEJhc2U6Om1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmdldENhbWVyYVNlcnZpY2UoKS0+Y2FjaGVEdW1wKCk7CisgICAgfQorCiAgICAgZGV0YWNoRGV2aWNlKCk7CiAKICAgICBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCgpOwogCi0gICAgQUxPR1YoIkNhbWVyYSAlczogU2h1dCBkb3duIGNvbXBsZXRlIGNvbXBsZXRlIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgQUxPR1YoIkNhbWVyYSAlczogU2h1dCBkb3duIGNvbXBsZXRlIiwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAKICAgICByZXR1cm4gcmVzOwogfQpAQCAtMjQ1LDEzICsyNTgsMzQgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgotdm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUlkbGUoKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeUFjdGl2ZSgpIHsKKyAgICBpZiAoIW1EZXZpY2VBY3RpdmUpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gVENsaWVudEJhc2U6OnN0YXJ0Q2FtZXJhU3RyZWFtaW5nT3BzKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBFcnJvciBzdGFydGluZyBjYW1lcmEgc3RyZWFtaW5nIG9wczogJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ0FjdGl2ZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKTsKKyAgICB9CisgICAgbURldmljZUFjdGl2ZSA9IHRydWU7CisKKyAgICBBTE9HVigiQ2FtZXJhIGRldmljZSBpcyBub3cgYWN0aXZlIik7CisgICAgcmV0dXJuIE9LOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+Cit2b2lkIENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6bm90aWZ5SWRsZSgKKyAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpIHsKICAgICBpZiAobURldmljZUFjdGl2ZSkgewotICAgICAgICBnZXRDYW1lcmFTZXJ2aWNlKCktPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0lETEUsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIsCi0gICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUZhY2luZywgVENsaWVudEJhc2U6Om1DbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICgobUFwaTFDYW1lcmFJZCA8IDApID8gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMiA6Ci0gICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk6OkNBTUVSQV9BUElfTEVWRUxfMSkpOworICAgICAgICBzdGF0dXNfdCByZXMgPSBUQ2xpZW50QmFzZTo6ZmluaXNoQ2FtZXJhU3RyZWFtaW5nT3BzKCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBFcnJvciBmaW5pc2hpbmcgc3RyZWFtaW5nIG9wczogJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCksIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nSWRsZShUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKICAgICB9CiAgICAgbURldmljZUFjdGl2ZSA9IGZhbHNlOwogCkBAIC0yNjQsMTUgKzI5OCw2IEBACiAgICAgKHZvaWQpcmVzdWx0RXh0cmFzOwogICAgICh2b2lkKXRpbWVzdGFtcDsKIAotICAgIGlmICghbURldmljZUFjdGl2ZSkgewotICAgICAgICBnZXRDYW1lcmFTZXJ2aWNlKCktPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoCi0gICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX0FDVElWRSwgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ciwKLSAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2FtZXJhRmFjaW5nLCBUQ2xpZW50QmFzZTo6bUNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgKChtQXBpMUNhbWVyYUlkIDwgMCkgPyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8yIDoKLSAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX0FQSV9MRVZFTF8xKSk7Ci0gICAgfQotICAgIG1EZXZpY2VBY3RpdmUgPSB0cnVlOwotCiAgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKaW5kZXggMDQyZjVhYS4uNjI0NmY3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgKQEAgLTQ4LDEzICs0OCwxNSBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5zb3JPcmllbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk7CiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudEJhc2UoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwgY29uc3QgU3RyaW5nOCYgbW9uaXRvclRhZ3MpOwpAQCAtNjYsNyArNjgsMTAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5SWRsZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBub3RpZnlBY3RpdmUoKTsgIC8vIFJldHVybnMgZXJyb3JzIG9uIGFwcCBvcHMgcGVybWlzc2lvbiBmYWlsdXJlcworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlJZGxlKGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RyZWFtU3RhdHM+JiBzdHJlYW1TdGF0cyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKaW5kZXggYTUzN2VmNS4uODViMGNjMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiAjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMi5oIgotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIgogI2luY2x1ZGUgImd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgiCkBAIC00MSw2ICs0MCw0MSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK25hbWVzcGFjZSBjYW1lcmEzIHsKKwordHlwZWRlZiBlbnVtIGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlIHsKKyAgICBDQU1FUkFfVEVNUExBVEVfUFJFVklFVyA9IDEsCisgICAgQ0FNRVJBX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUgPSAyLAorICAgIENBTUVSQV9URU1QTEFURV9WSURFT19SRUNPUkQgPSAzLAorICAgIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVCA9IDQsCisgICAgQ0FNRVJBX1RFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUcgPSA1LAorICAgIENBTUVSQV9URU1QTEFURV9NQU5VQUwgPSA2LAorICAgIENBTUVSQV9URU1QTEFURV9DT1VOVCwKKyAgICBDQU1FUkFfVkVORE9SX1RFTVBMQVRFX1NUQVJUID0gMHg0MDAwMDAwMAorfSBjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZV90OworCit0eXBlZGVmIGVudW0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGUgeworICAgIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSA9IDAsCisgICAgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSA9IDEsCisgICAgQ0FNRVJBX1ZFTkRPUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NT0RFX1NUQVJUID0gMHg4MDAwCit9IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IGNhbWVyYV9qcGVnX2Jsb2IgeworICAgIHVpbnQxNl90IGpwZWdfYmxvYl9pZDsKKyAgICB1aW50MzJfdCBqcGVnX3NpemU7Cit9IGNhbWVyYV9qcGVnX2Jsb2JfdDsKKworZW51bSB7CisgICAgQ0FNRVJBX0pQRUdfQkxPQl9JRCA9IDB4MDBGRiwKKyAgICBDQU1FUkFfSlBFR19BUFBfU0VHTUVOVFNfQkxPQl9JRCA9IDB4MDEwMCwKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKKwordXNpbmcgY2FtZXJhMzo6Y2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdDs7Cit1c2luZyBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90OwordXNpbmcgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90OworCiBjbGFzcyBDYW1lcmFQcm92aWRlck1hbmFnZXI7CiAKIC8vIE1hcHBpbmcgb2Ygb3V0cHV0IHN0cmVhbSBpbmRleCB0byBzdXJmYWNlIGlkcwpAQCAtMTI4LDExICsxNjIsMTMgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSA9IDA7CisgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gb3V0cHV0IHN0cmVhbSBvZiB0aGUgcmVxdWVzdGVkIHNpemUsIGZvcm1hdCwgcm90YXRpb24gYW5kCkBAIC0xNDMsMTEgKzE3OSwxMyBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSA9IDA7CisgICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYW4gaW5wdXQgc3RyZWFtIG9mIHdpZHRoLCBoZWlnaHQsIGFuZCBmb3JtYXQuCkBAIC0xNTUsNyArMTkzLDcgQEAKICAgICAgKiBSZXR1cm4gdmFsdWUgaXMgdGhlIHN0cmVhbSBJRCBpZiBub24tbmVnYXRpdmUgYW5kIGFuIGVycm9yIGlmIG5lZ2F0aXZlLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LCAvKm91dCovIGludDMyX3QgKmlkKSA9IDA7CisgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwgYm9vbCBtdWx0aVJlc29sdXRpb24sIC8qb3V0Ki8gaW50MzJfdCAqaWQpID0gMDsKIAogICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKICAgICAgICAgdWludDMyX3Qgd2lkdGg7CkBAIC0yMjUsNyArMjYzLDggQEAKICAgICAgKiAtIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBkZXZpY2Ugd2FzIGluIHRoZSB3cm9uZyBzdGF0ZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcywKLSAgICAgICAgICAgIGludCBvcGVyYXRpbmdNb2RlID0gMCkgPSAwOworICAgICAgICAgICAgaW50IG9wZXJhdGluZ01vZGUgPQorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdDo6Q0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0cmVhbSBpZHMgdGhhdCB3ZXJlIGFkdmVydGlzZWQgYXMgY2FwYWJsZSBvZgpAQCAtMjQxLDcgKzI4MCw3IEBACiAgICAgICogQ3JlYXRlIGEgbWV0YWRhdGEgYnVmZmVyIHdpdGggZmllbGRzIHRoYXQgdGhlIEhBTCBkZXZpY2UgYmVsaWV2ZXMgYXJlCiAgICAgICogYmVzdCBmb3IgdGhlIGdpdmVuIHVzZSBjYXNlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KSA9IDA7CiAKICAgICAvKioKQEAgLTM2NCw5ICs0MDMsMzIgQEAKICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90IHJvdGF0ZUFuZENyb3BWYWx1ZSkgPSAwOwogCiAgICAgLyoqCisgICAgICogV2hldGhlciBjYW1lcmEgbXV0aW5nIChwcm9kdWNpbmcgYmxhY2stb25seSBvdXRwdXQpIGlzIHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIENhbGxpbmcgc2V0Q2FtZXJhTXV0ZSh0cnVlKSB3aGVuIHRoaXMgcmV0dXJucyBmYWxzZSB3aWxsIHJldHVybiBhbgorICAgICAqIElOVkFMSURfT1BFUkFUSU9OIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0NhbWVyYU11dGUoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBNdXRlIHRoZSBjYW1lcmEuCisgICAgICoKKyAgICAgKiBXaGVuIG11dGVkLCBibGFjayBpbWFnZSBkYXRhIGlzIG91dHB1dCBvbiBhbGwgb3V0cHV0IHN0cmVhbXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYW1lcmFNdXRlKGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgLyoqCiAgICAgICogR2V0IHRoZSBzdGF0dXMgdHJhY2tlciBvZiB0aGUgY2FtZXJhIGRldmljZQogICAgICAqLwogICAgIHZpcnR1YWwgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gZ2V0U3RhdHVzVHJhY2tlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCBiaXRtYXNrIGZvciBpbWFnZSBkdW1wIGZsYWcKKyAgICAgKi8KKyAgICB2b2lkIHNldEltYWdlRHVtcE1hc2soaW50IG1hc2spIHsgbUltYWdlRHVtcE1hc2sgPSBtYXNrOyB9CisKK3Byb3RlY3RlZDoKKyAgICBib29sIG1JbWFnZUR1bXBNYXNrID0gMDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhT2ZmbGluZVNlc3Npb25CYXNlLmgKaW5kZXggMWY4MzVhOS4uNTRlNDJhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU9mZmxpbmVTZXNzaW9uQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkJhc2UuaApAQCAtMTcsMTEgKzE3LDE0IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBT0ZGTElORVNFU1NJT05CQVNFX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFPRkZMSU5FU0VTU0lPTkJBU0VfSAogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAogI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYVNlc3Npb25TdGF0cy5oIgogI2luY2x1ZGUgIkZyYW1lUHJvZHVjZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzcsOSArNDAsMTEgQEAKICAgICAvLyBSZXF1aXJlZCBmb3IgQVBJIDEgYW5kIDIKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgbm90aWZ5QWN0aXZlKCkgPSAwOyAvLyBNYXkgcmV0dXJuIGFuIGVycm9yIHNpbmNlIGl0IGNoZWNrcyBhcHBvcHMKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5SWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvciwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSA9IDA7CiAKICAgICAvLyBSZXF1aXJlZCBvbmx5IGZvciBBUEkyCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSA9IDA7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDMyZDExOGQuLjRmMmI4NzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlICJDYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvSUNhbWVyYURldmljZS5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNocm9ubz4KQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYV9jb21tb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CkBAIC00Nyw5ICs0NiwxMCBAQAogCiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOwordXNpbmcgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczsKIHVzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OkNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb247Ci11c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbjsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uOwogCiBuYW1lc3BhY2UgewogY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOwpAQCAtMjY3LDcgKzI2Nyw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAogICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOwpAQCAtMjc5LDkgKzI3OSw5IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICByZXR1cm4gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgIHJldHVybiBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoaWQsIG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjaGFyYWN0ZXJpc3RpY3MpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKQEAgLTQxNyw0NiArNDE3LDYgQEAKICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKLQotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7Ci0KLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwKLSAgICAgICAgICAgIC8qbWluVmVyc2lvbiovIHsxLDB9LCAvKm1heFZlcnNpb24qLyB7MiwwfSk7Ci0gICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotCi0gICAgYXV0byAqZGV2aWNlSW5mbzEgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8xKj4oZGV2aWNlSW5mbyk7Ci0gICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciA9IGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci5wcm9tb3RlKCk7Ci0gICAgaWYgKHBhcmVudFByb3ZpZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlciA9IHBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7Ci0gICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKLQotICAgIGF1dG8gaW50ZXJmYWNlID0gZGV2aWNlSW5mbzEtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPAotICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpJbnRlcmZhY2VUPigpOwotICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2spOwotICAgIGlmICghc3RhdHVzLmlzT2soKSkgewotICAgICAgICByZW1vdmVSZWYoRGV2aWNlTW9kZTo6Q0FNRVJBLCBpZCk7Ci0gICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBhIHNlc3Npb24gZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAqc2Vzc2lvbiA9IGludGVyZmFjZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwotfQotCiB2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAogICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBwcm92aWRlcikgewogICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKQEAgLTUxNSwxNiArNDc1LDE3IEBACiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25SZWdpc3RyYXRpb24oCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAotICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgICAgICBib29sIHByZWV4aXN0aW5nKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IHByb3ZpZGVyTG9jayhtUHJvdmlkZXJMaWZlY3ljbGVMb2NrKTsKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKLSAgICAgICAgYWRkUHJvdmlkZXJMb2NrZWQobmFtZSk7CisgICAgICAgIHJlcyA9IGFkZFByb3ZpZGVyTG9ja2VkKG5hbWUsIHByZWV4aXN0aW5nKTsKICAgICB9CiAKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXIgPSBnZXRTdGF0dXNMaXN0ZW5lcigpOwotICAgIGlmIChudWxscHRyICE9IGxpc3RlbmVyLmdldCgpKSB7CisgICAgaWYgKG51bGxwdHIgIT0gbGlzdGVuZXIuZ2V0KCkgJiYgcmVzID09IE9LKSB7CiAgICAgICAgIGxpc3RlbmVyLT5vbk5ld1Byb3ZpZGVyUmVnaXN0ZXJlZCgpOwogICAgIH0KIApAQCAtNzI3LDkgKzY4OCwzOSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjphZGREeW5hbWljRGVwdGhUYWdzKCkgewotICAgIHVpbnQzMl90IGRlcHRoRXhjbFRhZyA9IEFORFJPSURfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFOwotICAgIHVpbnQzMl90IGRlcHRoU2l6ZXNUYWcgPSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmFkZER5bmFtaWNEZXB0aFRhZ3MoCisgICAgICAgIGJvb2wgbWF4UmVzb2x1dGlvbikgeworICAgIGNvbnN0IGludDMyX3QgZGVwdGhFeGNsVGFnID0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkU7CisKKyAgICBjb25zdCBpbnQzMl90IHNjYWxlclNpemVzVGFnID0KKyAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworICAgIGNvbnN0IGludDMyX3Qgc2NhbGVyTWluRnJhbWVEdXJhdGlvbnNUYWcgPQorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlM7CisgICAgY29uc3QgaW50MzJfdCBzY2FsZXJTdGFsbER1cmF0aW9uc1RhZyA9CisgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworCisgICAgY29uc3QgaW50MzJfdCBkZXB0aFNpemVzVGFnID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBjb25zdCBpbnQzMl90IGRlcHRoU3RhbGxEdXJhdGlvbnNUYWcgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworICAgIGNvbnN0IGludDMyX3QgZGVwdGhNaW5GcmFtZUR1cmF0aW9uc1RhZyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworCisgICAgY29uc3QgaW50MzJfdCBkeW5hbWljRGVwdGhTaXplc1RhZyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBjb25zdCBpbnQzMl90IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zVGFnID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworICAgIGNvbnN0IGludDMyX3QgZHluYW1pY0RlcHRoTWluRnJhbWVEdXJhdGlvbnNUYWcgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworCiAgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKICAgICAgICAgICAgIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCBpbnRlcm5hbERlcHRoU2l6ZXM7CkBAIC03NTksNyArNzUwLDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBnZXRTdXBwb3J0ZWRTaXplcyhjLCBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBIQUxfUElYRUxfRk9STUFUX0JMT0IsCisgICAgZ2V0U3VwcG9ydGVkU2l6ZXMoYywgc2NhbGVyU2l6ZXNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKICAgICAgICAgICAgICZzdXBwb3J0ZWRCbG9iU2l6ZXMpOwogICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIGRlcHRoU2l6ZXNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCAmc3VwcG9ydGVkRGVwdGhTaXplcyk7CiAgICAgaWYgKHN1cHBvcnRlZEJsb2JTaXplcy5lbXB0eSgpIHx8IHN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgewpAQCAtNzg2LDEwICs3NzcsMTAgQEAKICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBibG9iTWluRHVyYXRpb25zLCBibG9iU3RhbGxEdXJhdGlvbnM7CiAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uczsKIAotICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TLAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsIGludGVybmFsRGVwdGhTaXplcywgJmRlcHRoTWluRHVyYXRpb25zKTsKLSAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsCi0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYk1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIGRlcHRoTWluRnJhbWVEdXJhdGlvbnNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIHNjYWxlck1pbkZyYW1lRHVyYXRpb25zVGFnLCBIQUxfUElYRUxfRk9STUFUX0JMT0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYk1pbkR1cmF0aW9ucyk7CiAgICAgaWYgKGJsb2JNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fCBkZXB0aE1pbkR1cmF0aW9ucy5lbXB0eSgpIHx8CiAgICAgICAgICAgICAoZGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JNaW5EdXJhdGlvbnMuc2l6ZSgpKSkgewogICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXB0aCBtaW4gZHVyYXRpb25zISAlenUgdnMuICV6dSIsCkBAIC03OTcsMTAgKzc4OCwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGdldFN1cHBvcnRlZER1cmF0aW9ucyhjLCBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMsCi0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1kxNiwgaW50ZXJuYWxEZXB0aFNpemVzLCAmZGVwdGhTdGFsbER1cmF0aW9ucyk7Ci0gICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsCi0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYlN0YWxsRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgZGVwdGhTdGFsbER1cmF0aW9uc1RhZywgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYsIGludGVybmFsRGVwdGhTaXplcywKKyAgICAgICAgICAgICZkZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgc2NhbGVyU3RhbGxEdXJhdGlvbnNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKKyAgICAgICAgICAgIHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLCAmYmxvYlN0YWxsRHVyYXRpb25zKTsKICAgICBpZiAoYmxvYlN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhTdGFsbER1cmF0aW9ucy5lbXB0eSgpIHx8CiAgICAgICAgICAgICAoZGVwdGhTdGFsbER1cmF0aW9ucy5zaXplKCkgIT0gYmxvYlN0YWxsRHVyYXRpb25zLnNpemUoKSkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggc3RhbGwgZHVyYXRpb25zISAlenUgdnMuICV6dSIsCkBAIC04NDUsMTUgKzgzNiwxNCBAQAogICAgIHN1cHBvcnRlZENoVGFncy5yZXNlcnZlKGNoVGFncy5jb3VudCArIDMpOwogICAgIHN1cHBvcnRlZENoVGFncy5pbnNlcnQoc3VwcG9ydGVkQ2hUYWdzLmVuZCgpLCBjaFRhZ3MuZGF0YS5pMzIsCiAgICAgICAgICAgICBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOwotICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwotICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKLSAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TKTsKLSAgICBjLnVwZGF0ZShBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKLSAgICAgICAgICAgIGR5bmFtaWNEZXB0aEVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhFbnRyaWVzLnNpemUoKSk7Ci0gICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TLAotICAgICAgICAgICAgZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLnNpemUoKSk7Ci0gICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMsCi0gICAgICAgICAgICBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLnNpemUoKSk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhkeW5hbWljRGVwdGhTaXplc1RhZyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhkeW5hbWljRGVwdGhNaW5GcmFtZUR1cmF0aW9uc1RhZyk7CisgICAgc3VwcG9ydGVkQ2hUYWdzLnB1c2hfYmFjayhkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uc1RhZyk7CisgICAgYy51cGRhdGUoZHluYW1pY0RlcHRoU2l6ZXNUYWcsIGR5bmFtaWNEZXB0aEVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhFbnRyaWVzLnNpemUoKSk7CisgICAgYy51cGRhdGUoZHluYW1pY0RlcHRoTWluRnJhbWVEdXJhdGlvbnNUYWcsIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5kYXRhKCksCisgICAgICAgICAgICBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uc1RhZywgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZGF0YSgpLAorICAgICAgICAgICAgIGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzLnNpemUoKSk7CiAgICAgYy51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgc3VwcG9ydGVkQ2hUYWdzLmRhdGEoKSwKICAgICAgICAgICAgIHN1cHBvcnRlZENoVGFncy5zaXplKCkpOwogCkBAIC0xMDg3LDcgKzEwNzcsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZGVyaXZlSGVpY1RhZ3MoKSB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmRlcml2ZUhlaWNUYWdzKGJvb2wgbWF4UmVzb2x1dGlvbikgeworICAgIGludDMyX3Qgc2NhbGVyU3RyZWFtU2l6ZXNUYWcgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBpbnQzMl90IHNjYWxlck1pbkZyYW1lRHVyYXRpb25zVGFnID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworCisgICAgaW50MzJfdCBoZWljU3RyZWFtU2l6ZXNUYWcgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBpbnQzMl90IGhlaWNNaW5GcmFtZUR1cmF0aW9uc1RhZyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBpbnQzMl90IGhlaWNTdGFsbER1cmF0aW9uc1RhZyA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMsIG1heFJlc29sdXRpb24pOworCiAgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsSGVpY1N1cHBvcnQgPSBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEKTsKQEAgLTExMTYsMTAgKzExMjMsOCBAQAogICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGhlaWNEdXJhdGlvbnM7CiAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gaGVpY1N0YWxsRHVyYXRpb25zOwogCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGhhbFN0cmVhbUNvbmZpZ3MgPQotICAgICAgICAgICAgYy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwotICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBtaW5GcmFtZUR1cmF0aW9ucyA9Ci0gICAgICAgICAgICBjLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBoYWxTdHJlYW1Db25maWdzID0gYy5maW5kKHNjYWxlclN0cmVhbVNpemVzVGFnKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRnJhbWVEdXJhdGlvbnMgPSBjLmZpbmQoc2NhbGVyTWluRnJhbWVEdXJhdGlvbnNUYWcpOwogCiAgICAgc3RhdHVzX3QgcmVzID0gZmlsbEhlaWNTdHJlYW1Db21iaW5hdGlvbnMoJmhlaWNPdXRwdXRzLCAmaGVpY0R1cmF0aW9ucywgJmhlaWNTdGFsbER1cmF0aW9ucywKICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MsIG1pbkZyYW1lRHVyYXRpb25zKTsKQEAgLTExMjksMTIgKzExMzQsOSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMsCi0gICAgICAgICAgIGhlaWNPdXRwdXRzLmRhdGEoKSwgaGVpY091dHB1dHMuc2l6ZSgpKTsKLSAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUywKLSAgICAgICAgICAgIGhlaWNEdXJhdGlvbnMuZGF0YSgpLCBoZWljRHVyYXRpb25zLnNpemUoKSk7Ci0gICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUywKLSAgICAgICAgICAgIGhlaWNTdGFsbER1cmF0aW9ucy5kYXRhKCksIGhlaWNTdGFsbER1cmF0aW9ucy5zaXplKCkpOworICAgIGMudXBkYXRlKGhlaWNTdHJlYW1TaXplc1RhZywgaGVpY091dHB1dHMuZGF0YSgpLCBoZWljT3V0cHV0cy5zaXplKCkpOworICAgIGMudXBkYXRlKGhlaWNNaW5GcmFtZUR1cmF0aW9uc1RhZywgaGVpY0R1cmF0aW9ucy5kYXRhKCksIGhlaWNEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICBjLnVwZGF0ZShoZWljU3RhbGxEdXJhdGlvbnNUYWcsIGhlaWNTdGFsbER1cmF0aW9ucy5kYXRhKCksIGhlaWNTdGFsbER1cmF0aW9ucy5zaXplKCkpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMTE4Niw2ICsxMTg4LDE3IEBACiAgICAgcmV0dXJuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbChjYW1lcmFJZCkuZmlyc3Q7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6ZmlsdGVyU21hbGxKcGVnU2l6ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSB7CisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bUlkID09IGNhbWVyYUlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmZpbHRlclNtYWxsSnBlZ1NpemVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworfQorCiBzdGQ6OnBhaXI8Ym9vbCwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8gKj4KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNIaWRkZW5QaHlzaWNhbENhbWVyYUludGVybmFsKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgY29uc3QgewogICAgIGF1dG8gZmFsc2VSZXQgPSBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgbnVsbHB0cik7CkBAIC0xMjAxLDE0ICsxMjE0LDYgQEAKIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CiAgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgewotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygmaW5mbyk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1JZC5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VSZXQ7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbElkczsKICAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuYmVnaW4oKSwgZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpLApAQCAtMTIzMCwzMSArMTIzNSw1MyBAQAogICAgIHJldHVybiBmYWxzZVJldDsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjphZGRQcm92aWRlckxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgbmV3UHJvdmlkZXIpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHByb3ZpZGVySW5mbyA6IG1Qcm92aWRlcnMpIHsKLSAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSBuZXdQcm92aWRlcikgewotICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgcmVnaXN0ZXJlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgbmV3UHJvdmlkZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6dHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlck5hbWUsIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbykgewogICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZTsKLSAgICBpbnRlcmZhY2UgPSBtU2VydmljZVByb3h5LT50cnlHZXRTZXJ2aWNlKG5ld1Byb3ZpZGVyKTsKKyAgICBpbnRlcmZhY2UgPSBtU2VydmljZVByb3h5LT50cnlHZXRTZXJ2aWNlKHByb3ZpZGVyTmFtZSk7CiAKICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMICclcycgaXMgbm90IGFjdHVhbGx5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBuZXdQcm92aWRlci5jX3N0cigpKTsKKyAgICAgICAgLy8gVGhlIGludGVyZmFjZSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LiBJbiB0aGF0IGNhc2UsIHRoaXMgaXMgbm90IGEKKyAgICAgICAgLy8gZmF0YWwgZXJyb3IuCisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIHByb3ZpZGVyIEhBTCAnJXMnIGlzIG5vdCBhY3R1YWxseSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgdGhpcyk7Ci0gICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZShpbnRlcmZhY2UsIG1EZXZpY2VTdGF0ZSk7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6YWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLAorICAgICAgICBib29sIHByZWV4aXN0aW5nKSB7CisgICAgLy8gU2V2ZXJhbCBjYW1lcmEgcHJvdmlkZXIgaW5zdGFuY2VzIGNhbiBiZSB0ZW1wb3JhcmlseSBwcmVzZW50LgorICAgIC8vIERlZmVyIGluaXRpYWxpemF0aW9uIG9mIGEgbmV3IGluc3RhbmNlIHVudGlsIHRoZSBvbGRlciBpbnN0YW5jZSBpcyBwcm9wZXJseSByZW1vdmVkLgorICAgIGF1dG8gcHJvdmlkZXJJbnN0YW5jZSA9IG5ld1Byb3ZpZGVyICsgIi0iICsgc3RkOjp0b19zdHJpbmcobVByb3ZpZGVySW5zdGFuY2VJZCk7CisgICAgYm9vbCBwcm92aWRlclByZXNlbnQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb3ZpZGVySW5mbyA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSBuZXdQcm92aWRlcikgeworICAgICAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMIHdpdGggbmFtZSAnJXMnIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3UHJvdmlkZXIuY19zdHIoKSk7CisgICAgICAgICAgICBpZiAocHJlZXhpc3RpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUaGUgbmV3IHByb3ZpZGVyIGluc3RhbmNlIHdpbGwgZ2V0IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY3VycmVudGx5IHByZXNlbnQgaW5zdGFuY2UgaXMgcmVtb3ZlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHByb3ZpZGVyUHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9IG5ldyBQcm92aWRlckluZm8obmV3UHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UsIHRoaXMpOworICAgIGlmICghcHJvdmlkZXJQcmVzZW50KSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKG5ld1Byb3ZpZGVyLCBwcm92aWRlckluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAgICAgfQogCiAgICAgbVByb3ZpZGVycy5wdXNoX2JhY2socHJvdmlkZXJJbmZvKTsKKyAgICBtUHJvdmlkZXJJbnN0YW5jZUlkKys7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMjY0LDEyICsxMjkxLDE0IEBACiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gcmVtb3ZlZERldmljZUlkczsKICAgICBzdGF0dXNfdCByZXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICBzdGQ6OnN0cmluZyByZW1vdmVkUHJvdmlkZXJOYW1lOwogICAgIGZvciAoYXV0byBpdCA9IG1Qcm92aWRlcnMuYmVnaW4oKTsgaXQgIT0gbVByb3ZpZGVycy5lbmQoKTsgaXQrKykgewotICAgICAgICBpZiAoKCppdCktPm1Qcm92aWRlck5hbWUgPT0gcHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlcikgewogICAgICAgICAgICAgcmVtb3ZlZERldmljZUlkcy5yZXNlcnZlKCgqaXQpLT5tRGV2aWNlcy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogKCppdCktPm1EZXZpY2VzKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlZERldmljZUlkcy5wdXNoX2JhY2soU3RyaW5nOChkZXZpY2VJbmZvLT5tSWQuY19zdHIoKSkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVtb3ZlZFByb3ZpZGVyTmFtZSA9ICgqaXQpLT5tUHJvdmlkZXJOYW1lOwogICAgICAgICAgICAgbVByb3ZpZGVycy5lcmFzZShpdCk7CiAgICAgICAgICAgICByZXMgPSBPSzsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI3OSw2ICsxMzA4LDE0IEBACiAgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIHByb3ZpZGVyIEhBTCB3aXRoIG5hbWUgJyVzJyBpcyBub3QgcmVnaXN0ZXJlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBwcm92aWRlci5jX3N0cigpKTsKICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IG5ld2VyIGNhbWVyYSBpbnN0YW5jZXMgZnJvbSB0aGUgc2FtZSBwcm92aWRlciBhbmQgdHJ5IHRvCisgICAgICAgIC8vIGluaXRpYWxpemUuCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvdmlkZXJJbmZvIDogbVByb3ZpZGVycykgeworICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5mby0+bVByb3ZpZGVyTmFtZSA9PSByZW1vdmVkUHJvdmlkZXJOYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRvSW5pdGlhbGl6ZVByb3ZpZGVyTG9ja2VkKHJlbW92ZWRQcm92aWRlck5hbWUsIHByb3ZpZGVySW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBJbmZvcm0gY2FtZXJhIHNlcnZpY2Ugb2YgbG9zcyBvZiBwcmVzZW5jZSBmb3IgYWxsIHRoZSBkZXZpY2VzIGZyb20gdGhpcyBwcm92aWRlciwKICAgICAgICAgLy8gd2l0aG91dCBsb2NrIGhlbGQgZm9yIHJlZW50cmFuY3kKICAgICAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyID0gZ2V0U3RhdHVzTGlzdGVuZXIoKTsKQEAgLTEyODcsNyArMTMyNCw5IEBACiAgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogcmVtb3ZlZERldmljZUlkcykgewogICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoaWQsIENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay5sb2NrKCk7CiAgICAgICAgIH0KKwogICAgIH0KICAgICByZXR1cm4gcmVzOwogfQpAQCAtMTMwMSw4ICsxMzQwLDEwIEBACiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpQcm92aWRlckluZm8oCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAogICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpIDoKICAgICAgICAgbVByb3ZpZGVyTmFtZShwcm92aWRlck5hbWUpLAorICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZShwcm92aWRlckluc3RhbmNlKSwKICAgICAgICAgbVByb3ZpZGVyVGFnaWQoZ2VuZXJhdGVWZW5kb3JUYWdJZChwcm92aWRlck5hbWUpKSwKICAgICAgICAgbVVuaXF1ZURldmljZUNvdW50KDApLAogICAgICAgICBtTWFuYWdlcihtYW5hZ2VyKSB7CkBAIC0xMzQyLDYgKzEzODMsMjggQEAKICAgICAgICAgICAgICAgICBtTWlub3JWZXJzaW9uID0gNTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8gY2FzdDJfNyA9IHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIGlmIChjYXN0Ml83LmlzT2soKSkgeworICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlMl83ID0gY2FzdDJfNzsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2UyXzcgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1NaW5vclZlcnNpb24gPSA3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlIGNhbGxiYWNrcyBtYXkgYmUgY2FsbGVkIChhbmQgY2F1c2luZyBuZXcgZGV2aWNlcyBhZGRlZCkKKyAgICAvLyBiZWZvcmUgc2V0Q2FsbGJhY2sgcmV0dXJucworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKICAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwpAQCAtMTM3Miw3ICsxNDM1LDYgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBTdGF0dXMgc3RhdHVzOwogICAgIC8vIEdldCBpbml0aWFsIGxpc3Qgb2YgY2FtZXJhIGRldmljZXMsIGlmIGFueQogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZXZpY2VzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsIHRoaXMsICZkZXZpY2VzXSgKQEAgLTE0MzcsMjYgKzE0OTksNDMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGNhbWVyYURldmljZVN0YXR1c0NoYW5nZSBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCAoYW5kIGNhdXNpbmcgbmV3IGRldmljZXMgYWRkZWQpCi0gICAgLy8gYmVmb3JlIHNldENhbGxiYWNrIHJldHVybnMuIHNldENhbGxiYWNrIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFkZERldmljZSBzbyB0aGF0Ci0gICAgLy8gdGhlIHBoeXNpY2FsIGNhbWVyYSBzdGF0dXMgY2FsbGJhY2sgY2FuIGxvb2sgdXAgYXZhaWxhYmxlIHJlZ3VsYXIKLSAgICAvLyBjYW1lcmFzLgotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdCA9IGludGVyZmFjZS0+c2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgaWYgKCFzdC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBzZXR0aW5nIHVwIGNhbGxiYWNrcyB3aXRoIGNhbWVyYSBwcm92aWRlciAnJXMnOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHN0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKHN0ICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyciLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdCk7Ci0gICAgfQotCiAgICAgQUxPR0koIkNhbWVyYSBwcm92aWRlciAlcyByZWFkeSB3aXRoICV6dSBjYW1lcmEgZGV2aWNlcyIsCiAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1EZXZpY2VzLnNpemUoKSk7CiAKLSAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIC8vIFByb2Nlc3MgY2FjaGVkIHN0YXR1cyBjYWxsYmFja3MKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PiBjYWNoZWRTdGF0dXMgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+KCk7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5pdExvY2spOworCisgICAgICAgIGZvciAoYXV0byYgc3RhdHVzSW5mbyA6IG1DYWNoZWRTdGF0dXMpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGlkLCBwaHlzaWNhbElkOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgICAgICBpZiAoc3RhdHVzSW5mby5pc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCAmcGh5c2ljYWxJZCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzSW5mby5jYW1lcmFJZCwgc3RhdHVzSW5mby5waHlzaWNhbENhbWVyYUlkLCBzdGF0dXNJbmZvLnN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IGNhbWVyYURldmljZVN0YXR1c0NoYW5nZUxvY2tlZCgmaWQsIHN0YXR1c0luZm8uY2FtZXJhSWQsIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBjYWNoZWRTdGF0dXMtPmVtcGxhY2VfYmFjayhzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBwaHlzaWNhbElkLmNfc3RyKCksIHN0YXR1c0luZm8uc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQ2FjaGVkU3RhdHVzLmNsZWFyKCk7CisKKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBUaGUgY2FjaGVkIHN0YXR1cyBjaGFuZ2UgY2FsbGJhY2tzIGNhbm5vdCBiZSBmaXJlZCBkaXJlY3RseSBmcm9tIHRoaXMKKyAgICAvLyBmdW5jdGlvbiwgZHVlIHRvIHNhbWUtdGhyZWFkIGRlYWRsb2NrIHRyeWluZyB0byBhY3F1aXJlIG1JbnRlcmZhY2VNdXRleAorICAgIC8vIHR3aWNlLgorICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUgPSBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywKKyAgICAgICAgICAgICAgICAmQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeUluaXRpYWxTdGF0dXNDaGFuZ2UsIHRoaXMsCisgICAgICAgICAgICAgICAgbGlzdGVuZXIsIHN0ZDo6bW92ZShjYWNoZWRTdGF0dXMpKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE1MzcsOSArMTYxNiw5IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGRldmljZUluZm87CiAgICAgc3dpdGNoIChtYWpvcikgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBkZXZpY2VJbmZvID0gaW5pdGlhbGl6ZURldmljZUluZm88RGV2aWNlSW5mbzE+KG5hbWUsIG1Qcm92aWRlclRhZ2lkLAotICAgICAgICAgICAgICAgICAgICBpZCwgbWlub3IpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5zdXBwb3J0ZWQgSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIG1ham9yKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIGRldmljZUluZm8gPSBpbml0aWFsaXplRGV2aWNlSW5mbzxEZXZpY2VJbmZvMz4obmFtZSwgbVByb3ZpZGVyVGFnaWQsCiAgICAgICAgICAgICAgICAgICAgIGlkLCBtaW5vcik7CkBAIC0xNTg4LDcgKzE2NjcsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBjb25zdCB7CiAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLiVkLCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlLmNfc3RyKCksCiAgICAgICAgICAgICBtTWlub3JWZXJzaW9uLAogICAgICAgICAgICAgbUlzUmVtb3RlID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAogICAgICAgICAgICAgbURldmljZXMuc2l6ZSgpKTsKQEAgLTE2MjAsNyArMTY5OSw3IEBACiAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICAgIE9yaWVudGF0aW9uOiAlZFxuIiwgaW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgIH0KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzI7Ci0gICAgICAgIHJlcyA9IGRldmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKCZpbmZvMik7CisgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKHRydWUgLypvdmVycmlkZUZvclBlcmZDbGFzcyovLCAmaW5mbzIpOwogICAgICAgICBpZiAocmVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CiAgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICBBUEkyIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWRcbiIpOwogICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewpAQCAtMTczNCwxMDQgKzE4MTMsMTM5IEBACiAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBuZXdTdGF0dXMpIHsKICAgICBzcDxTdGF0dXNMaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgc3RkOjpzdHJpbmcgaWQ7Ci0gICAgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Jbml0TG9jayk7CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICBtQ2FjaGVkU3RhdHVzLmVtcGxhY2VfYmFjayhmYWxzZSAvKmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMqLywKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksIHN0ZDo6c3RyaW5nKCkuY19zdHIoKSwgbmV3U3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7Ci0gICAgICAgIGJvb2wga25vd24gPSBmYWxzZTsKLSAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogbURldmljZXMpIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tTmFtZSA9PSBjYW1lcmFEZXZpY2VOYW1lKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIkNhbWVyYSBkZXZpY2UgJXMgc3RhdHVzIGlzIG5vdyAlcywgd2FzICVzIiwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSwgZGV2aWNlU3RhdHVzVG9TdHJpbmcoZGV2aWNlSW5mby0+bVN0YXR1cykpOwotICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1TdGF0dXMgPSBuZXdTdGF0dXM7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGRldmljZSByZW1vdmFsIChOT1RfUFJFU0VOVCkKLSAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKLSAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUHJldmlvdXNseSB1bnNlZW4gZGV2aWNlOyBzdGF0dXMgbXVzdCBub3QgYmUgTk9UX1BSRVNFTlQKLSAgICAgICAgaWYgKCFrbm93bikgewotICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhIGRldmljZSAlcyBpcyBub3QgcHJlc2VudC4gQ3VyaW91cy4iLAotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGREZXZpY2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzLCAmaWQpOwotICAgICAgICB9IGVsc2UgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7Ci0gICAgICAgICAgICByZW1vdmVEZXZpY2UoaWQpOworICAgICAgICBpZiAoT0sgIT0gY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKCZpZCwgY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKLSAgICAgICAgaW5pdGlhbGl6ZWQgPSBtSW5pdGlhbGl6ZWQ7Ci0gICAgICAgIGlmIChyZUNhY2hlQ29uY3VycmVudFN0cmVhbWluZ0NhbWVyYUlkc0xvY2tlZCgpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYVByb3ZpZGVyICVzIGNvdWxkIG5vdCByZS1jYWNoZSBjb25jdXJyZW50IHN0cmVhbWluZyBjYW1lcmEgaWQgbGlzdCAiLAotICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKLSAgICAgICAgfQogICAgIH0KKwogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKLSAgICAvLyBEb24ndCBzZW5kIHRoZSBjYWxsYmFjayBpZiBwcm92aWRlckluZm8gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgLy8gQ2FtZXJhU2VydmljZSB3aWxsIGluaXRpYWxpemUgZGV2aWNlIHN0YXR1cyBhZnRlciBwcm92aWRlciBpcwotICAgIC8vIGluaXRpYWxpemVkCi0gICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIgJiYgaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewogICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CiAgICAgfQorCiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgYm9vbCBrbm93biA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkOworICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7CisgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tTmFtZSA9PSBjYW1lcmFEZXZpY2VOYW1lKSB7CisgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhIGRldmljZSAlcyBzdGF0dXMgaXMgbm93ICVzLCB3YXMgJXMiLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cyksIGRldmljZVN0YXR1c1RvU3RyaW5nKGRldmljZUluZm8tPm1TdGF0dXMpKTsKKyAgICAgICAgICAgIGRldmljZUluZm8tPm1TdGF0dXMgPSBuZXdTdGF0dXM7CisgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgZGV2aWNlIHJlbW92YWwgKE5PVF9QUkVTRU5UKQorICAgICAgICAgICAgY2FtZXJhSWQgPSBkZXZpY2VJbmZvLT5tSWQ7CisgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBQcmV2aW91c2x5IHVuc2VlbiBkZXZpY2U7IHN0YXR1cyBtdXN0IG5vdCBiZSBOT1RfUFJFU0VOVAorICAgIGlmICgha25vd24pIHsKKyAgICAgICAgaWYgKG5ld1N0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6Ok5PVF9QUkVTRU5UKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIHByb3ZpZGVyICVzIHNheXMgYW4gdW5rbm93biBjYW1lcmEgZGV2aWNlICVzIGlzIG5vdCBwcmVzZW50LiBDdXJpb3VzLiIsCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBjYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhZGREZXZpY2UoY2FtZXJhRGV2aWNlTmFtZSwgbmV3U3RhdHVzLCAmY2FtZXJhSWQpOworICAgIH0gZWxzZSBpZiAobmV3U3RhdHVzID09IENhbWVyYURldmljZVN0YXR1czo6Tk9UX1BSRVNFTlQpIHsKKyAgICAgICAgcmVtb3ZlRGV2aWNlKGNhbWVyYUlkKTsKKyAgICB9CisgICAgaWYgKHJlQ2FjaGVDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzTG9ja2VkKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmFQcm92aWRlciAlcyBjb3VsZCBub3QgcmUtY2FjaGUgY29uY3VycmVudCBzdHJlYW1pbmcgY2FtZXJhIGlkIGxpc3QgIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgKmlkID0gY2FtZXJhSWQ7CisgICAgcmV0dXJuIE9LOworfQorCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwaHlzaWNhbENhbWVyYURldmljZVN0YXR1c0NoYW5nZSgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSwKICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgewogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lcjsKICAgICBzdGQ6OnN0cmluZyBpZDsKLSAgICBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZDsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW5pdExvY2spOworCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUNhY2hlZFN0YXR1cy5lbXBsYWNlX2JhY2sodHJ1ZSAvKmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMqLywgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwotICAgICAgICBib29sIGtub3duID0gZmFsc2U7Ci0gICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlSW5mby0+bU5hbWUgPT0gY2FtZXJhRGV2aWNlTmFtZSkgewotICAgICAgICAgICAgICAgIGlkID0gZGV2aWNlSW5mby0+bUlkOwogCi0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjYW1lcmEgaWQgJXMsIHBoeXNpY2FsIGlkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmJlZ2luKCksIGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSkgPT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjYW1lcmEgaWQgJXMsIHBoeXNpY2FsIGlkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHBoeXNpY2FsIGRldmljZSAlcyBzdGF0dXMgaXMgbm93ICVzLCB3YXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1c1RvU3RyaW5nKG5ld1N0YXR1cyksIGRldmljZVN0YXR1c1RvU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBoeXNpY2FsU3RhdHVzW3BoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZV0pKTsKLSAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUHJldmlvdXNseSB1bnNlZW4gZGV2aWNlOyBzdGF0dXMgbXVzdCBub3QgYmUgTk9UX1BSRVNFTlQKLSAgICAgICAgaWYgKCFrbm93bikgewotICAgICAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhIGRldmljZSAlcy0lcyBpcyBub3QgcHJlc2VudC4gQ3VyaW91cy4iLAotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGNhbWVyYURldmljZU5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICBpZiAoT0sgIT0gcGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoJmlkLCAmcGh5c2ljYWxJZCwgY2FtZXJhRGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsIG5ld1N0YXR1cykpIHsKICAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgICAgICB9CisKICAgICAgICAgbGlzdGVuZXIgPSBtTWFuYWdlci0+Z2V0U3RhdHVzTGlzdGVuZXIoKTsKLSAgICAgICAgaW5pdGlhbGl6ZWQgPSBtSW5pdGlhbGl6ZWQ7CiAgICAgfQogICAgIC8vIENhbGwgd2l0aG91dCBsb2NrIGhlbGQgdG8gYWxsb3cgcmVlbnRyYW5jeSBpbnRvIHByb3ZpZGVyIG1hbmFnZXIKLSAgICAvLyBEb24ndCBzZW5kIHRoZSBjYWxsYmFjayBpZiBwcm92aWRlckluZm8gaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgLy8gQ2FtZXJhU2VydmljZSB3aWxsIGluaXRpYWxpemUgZGV2aWNlIHN0YXR1cyBhZnRlciBwcm92aWRlciBpcwotICAgIC8vIGluaXRpYWxpemVkCi0gICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIgJiYgaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkKHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewogICAgICAgICBsaXN0ZW5lci0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKFN0cmluZzgoaWQuY19zdHIoKSksCi0gICAgICAgICAgICAgICAgcGh5c2ljYWxJZCwgbmV3U3RhdHVzKTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4KHBoeXNpY2FsSWQuY19zdHIoKSksIG5ld1N0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGh5c2ljYWxDYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2VMb2NrZWQoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyogaWQsIHN0ZDo6c3RyaW5nKiBwaHlzaWNhbElkLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwaHlzaWNhbENhbWVyYURldmljZU5hbWUsCisgICAgICAgICAgICBDYW1lcmFEZXZpY2VTdGF0dXMgbmV3U3RhdHVzKSB7CisgICAgYm9vbCBrbm93biA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkOworICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IG1EZXZpY2VzKSB7CisgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tTmFtZSA9PSBjYW1lcmFEZXZpY2VOYW1lKSB7CisgICAgICAgICAgICBjYW1lcmFJZCA9IGRldmljZUluZm8tPm1JZDsKKyAgICAgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjYW1lcmEgaWQgJXMsIHBoeXNpY2FsIGlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSwgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5iZWdpbigpLCBkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZSkgPT0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIGNhbWVyYSBpZCAlcywgcGh5c2ljYWwgaWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dJKCJDYW1lcmEgZGV2aWNlICVzIHBoeXNpY2FsIGRldmljZSAlcyBzdGF0dXMgaXMgbm93ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLCBwaHlzaWNhbENhbWVyYURldmljZU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CisgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBQcmV2aW91c2x5IHVuc2VlbiBkZXZpY2U7IHN0YXR1cyBtdXN0IG5vdCBiZSBOT1RfUFJFU0VOVAorICAgIGlmICgha25vd24pIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBwcm92aWRlciAlcyBzYXlzIGFuIHVua25vd24gY2FtZXJhIGRldmljZSAlcy0lcyBpcyBub3QgcHJlc2VudC4gQ3VyaW91cy4iLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgY2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqaWQgPSBjYW1lcmFJZDsKKyAgICAqcGh5c2ljYWxJZCA9IHBoeXNpY2FsQ2FtZXJhRGV2aWNlTmFtZS5jX3N0cigpOworICAgIHJldHVybiBPSzsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6dG9yY2hNb2RlU3RhdHVzQ2hhbmdlKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIGNhbWVyYURldmljZU5hbWUsCiAgICAgICAgIFRvcmNoTW9kZVN0YXR1cyBuZXdTdGF0dXMpIHsKQEAgLTE4NjksMTIgKzE5ODMsMTIgQEAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwKICAgICAgICAgY29uc3Qgd3A8aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pIHsKICAgICAodm9pZCkgd2hvOwotICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJyVzJyBoYXMgZGllZDsgcmVtb3ZpbmcgaXQiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIEFMT0dJKCJDYW1lcmEgcHJvdmlkZXIgJyVzJyBoYXMgZGllZDsgcmVtb3ZpbmcgaXQiLCBtUHJvdmlkZXJJbnN0YW5jZS5jX3N0cigpKTsKICAgICBpZiAoY29va2llICE9IG1JZCkgewogICAgICAgICBBTE9HVygiJXM6IFVuZXhwZWN0ZWQgc2VydmljZURpZWQgY29va2llICUiIFBSSXU2NCAiLCBleHBlY3RlZCAlIiBQUkl1MzIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjb29raWUsIG1JZCk7CiAgICAgfQotICAgIG1NYW5hZ2VyLT5yZW1vdmVQcm92aWRlcihtUHJvdmlkZXJOYW1lKTsKKyAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVySW5zdGFuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgewpAQCAtMTk0OCw0NCArMjA2Miw4OCBAQAogICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBtaWdodCBiZSBzb21lIG90aGVyIHByb2JsZW0KICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQotICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNjo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKLSAgICAgICAgICAgIHNwPHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZV8yXzYgPSBjYXN0UmVzdWx0OwotICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzYgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIFN0YXR1cyBjYWxsU3RhdHVzOwotICAgICAgICAgICAgICAgIGF1dG8gY2IgPQotICAgICAgICAgICAgICAgICAgICAgICAgWyZpc1N1cHBvcnRlZCwgJmNhbGxTdGF0dXNdKFN0YXR1cyBzLCBib29sIHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7IH07CisgICAgICAgIGF1dG8gY2FzdFJlc3VsdDJfNiA9IHByb3ZpZGVyOjpWMl82OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIGF1dG8gY2FzdFJlc3VsdDJfNyA9IHByb3ZpZGVyOjpWMl83OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgIFN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBhdXRvIGNiID0KKyAgICAgICAgICAgICAgICBbJmlzU3VwcG9ydGVkLCAmY2FsbFN0YXR1c10oU3RhdHVzIHMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gc3VwcG9ydGVkOyB9OwogCi0gICAgICAgICAgICAgICAgYXV0byByZXQgPSAgaW50ZXJmYWNlXzJfNi0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCBjYik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY2FzZSwgZG8gbm90aGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBPSzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzc6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNzsKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzY6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNjsKKyAgICAgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNyAmJiBjYXN0UmVzdWx0Ml83LmlzT2soKSkgeworICAgICAgICAgICAgaW50ZXJmYWNlXzJfNyA9IGNhc3RSZXN1bHQyXzc7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJmYWNlXzJfNy0+aXNDb25jdXJyZW50U3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWRfMl83KAorICAgICAgICAgICAgICAgICAgICAgICAgaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCBjYik7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobU1pbm9yVmVyc2lvbiA9PSA2ICYmIGNhc3RSZXN1bHQyXzYuaXNPaygpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VfMl82ID0gY2FzdFJlc3VsdDJfNjsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VfMl82ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8cHJvdmlkZXI6OlYyXzY6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82OworICAgICAgICAgICAgICAgIHNpemVfdCBudW1TdHJlYW1zID0gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLnNpemUoKTsKKyAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82LnJlc2l6ZShudW1TdHJlYW1zKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMzsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb25zdCYgY29tYmluYXRpb24gPSBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNbaV07CisgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzZbaV0uY2FtZXJhSWQgPSBjb21iaW5hdGlvbi5jYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnNfMl82W2ldLnN0cmVhbUNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbi5zdHJlYW1Db25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfMl82LT5pc0NvbmN1cnJlbnRTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9uc18yXzYsIGNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlcmZhY2VfMl83ICE9IG51bGxwdHIgfHwgaW50ZXJmYWNlXzJfNiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvbiBjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHVuc3VwcG9ydGVkIG9wZXJhdGlvbgogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6bm90aWZ5SW5pdGlhbFN0YXR1c0NoYW5nZSgKKyAgICAgICAgc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q2FtZXJhU3RhdHVzSW5mb1Q+PiBjYWNoZWRTdGF0dXMpIHsKKyAgICBmb3IgKGF1dG8mIHN0YXR1c0luZm8gOiAqY2FjaGVkU3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXNJbmZvLmlzUGh5c2ljYWxDYW1lcmFTdGF0dXMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoU3RyaW5nOChzdGF0dXNJbmZvLmNhbWVyYUlkLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHN0YXR1c0luZm8ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKSwgc3RhdHVzSW5mby5zdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzdGF0dXNJbmZvLmNhbWVyYUlkLmNfc3RyKCkpLCBzdGF0dXNJbmZvLnN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgogICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKQEAgLTIwMzQsMzUgKzIxOTIsNiBAQAogfQogCiB0ZW1wbGF0ZTw+Ci1zcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKLSAgICBTdGF0dXMgc3RhdHVzOwotICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKLSAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAotICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHRyeWluZyB0byBvYnRhaW4gaW50ZXJmYWNlIGZvciBjYW1lcmEgZGV2aWNlICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9idGFpbiBpbnRlcmZhY2UgZm9yIGNhbWVyYSBkZXZpY2UgJXM6ICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgc3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gY2FtZXJhSW50ZXJmYWNlOwotfQotCi10ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+CiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKICAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKQEAgLTIxMTUsMTI2ICsyMjQ0LDYgQEAKICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHMpOwogfQogCi1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkRldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCi0gICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKLSAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6Ci0gICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezEsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7Ci0gICAgLy8gR2V0IGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQotICAgIC8vIFJlcXVpcmVzIHBvd2VyaW5nIG9uIHRoZSBjYW1lcmEgZGV2aWNlCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihudWxscHRyKTsKLSAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9wZW4gY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhbdGhpc10oY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBwYXJtcykgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0UGFyYW1ldGVycy51bmZsYXR0ZW4oU3RyaW5nOChwYXJtcy5jX3N0cigpKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciByZWFkaW5nIGNhbWVyYSBkZXZpY2UgJXMgcGFyYW1zIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSA9Ci0gICAgICAgICAgICBtRGVmYXVsdFBhcmFtZXRlcnMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRkxBU0hfTU9ERVMpOwotICAgIGlmIChmbGFzaE1vZGUgJiYgc3Ryc3RyKGZsYXNoTW9kZSwgQ2FtZXJhUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9UT1JDSCkpIHsKLSAgICAgICAgbUhhc0ZsYXNoVW5pdCA9IHRydWU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmVzID0gY2FjaGVDYW1lcmFJbmZvKGludGVyZmFjZSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBjYWNoZSBDYW1lcmFJbmZvIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJldCA9IGludGVyZmFjZS0+Y2xvc2UoKTsKLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjbG9zaW5nIGNhbWVyYSBkZXZpY2UgJXMgYWZ0ZXIgY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgewotICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5Ci0gICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKLSAgICB9Ci19Ci0KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6fkRldmljZUluZm8xKCkge30KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpnZXRDYW1lcmFJbmZvKAotICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgewotICAgIGlmIChpbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgKmluZm8gPSBtSW5mbzsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Y2FjaGVDYW1lcmFJbmZvKAotICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+IGludGVyZmFjZSkgewotICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNJbmZvOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGNJbmZvID0gY2FtSW5mbzsKLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHJlYWRpbmcgY2FtZXJhIGluZm8gZnJvbSBkZXZpY2UgJXM6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgcmV0dXJuIG1hcFRvU3RhdHVzVChzdGF0dXMpOwotICAgIH0KLQotICAgIHN3aXRjaChjSW5mby5mYWNpbmcpIHsKLSAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6QkFDSzoKLSAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RVhURVJOQUw6Ci0gICAgICAgICAgICAvLyBNYXAgZXh0ZXJuYWwgdG8gZnJvbnQgZm9yIGxlZ2FjeSBBUEkKLSAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RlJPTlQ6Ci0gICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIiVzOiBEZXZpY2UgJXM6IFVua25vd24gY2FtZXJhIGZhY2luZzogJWQiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBjSW5mby5mYWNpbmcpOwotICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKLSAgICB9Ci0gICAgbUluZm8ub3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSB7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwotICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7Ci0gICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgaWYgKCFzLmlzT2soKSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBtYXBUb1N0YXR1c1Qocyk7Ci19Ci0KIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6RGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKQEAgLTIyOTQsNiArMjMwMywyMSBAQAogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgIH0KKworICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobUNhbWVyYUNoYXJhY3RlcmlzdGljcykpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWRkRHluYW1pY0RlcHRoVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzIGZvciBtYXhpbXVtIHJlc29sdXRpb24gbW9kZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBkZXJpdmVIZWljVGFncygvKm1heFJlc29sdXRpb24qL3RydWUpOworICAgICAgICBpZiAoT0sgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzIGZvciIKKyAgICAgICAgICAgICAgICAgICAgIm1heGltdW0gcmVzb2x1dGlvbiBtb2RlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJlcyA9IGFkZFJvdGF0ZUNyb3BUYWdzKCk7CiAgICAgaWYgKE9LICE9IHJlcykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBhZGQgZGVmYXVsdCBTQ0FMRVJfUk9UQVRFX0FORF9DUk9QIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCkBAIC0yNDY0LDEwICsyNDg4LDE1IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CiAKLSAgICAqY2hhcmFjdGVyaXN0aWNzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICBpZiAoIW92ZXJyaWRlRm9yUGVyZkNsYXNzICYmIG1DYW1lcmFDaGFyTm9QQ092ZXJyaWRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmNoYXJhY3RlcmlzdGljcyA9ICptQ2FtZXJhQ2hhck5vUENPdmVycmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgICAqY2hhcmFjdGVyaXN0aWNzID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI0ODQsNyArMjUxMyw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSB7CiAKICAgICBjb25zdCBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+IGludGVyZmFjZSA9CkBAIC0yNDkyLDE5ICsyNTIxLDMzIEBACiAgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9Ci0gICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOwotICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlXzNfNSA9IGNhc3RSZXN1bHQ7Ci0gICAgaWYgKGludGVyZmFjZV8zXzUgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdF8zXzUgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdF8zXzU7CisgICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzcgPSBjYXN0UmVzdWx0XzNfNzsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBTdGF0dXMgY2FsbFN0YXR1czsKLSAgICBhdXRvIHJldCA9ICBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBhdXRvIGhhbENiID0KICAgICAgICAgICAgIFsmY2FsbFN0YXR1cywgJnN0YXR1c10gKFN0YXR1cyBzLCBib29sIGNvbWJTdGF0dXMpIHsKICAgICAgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKICAgICAgICAgICAgICAgICAqc3RhdHVzID0gY29tYlN0YXR1czsKLSAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfTsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzctPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWRfM183KGNvbmZpZ3VyYXRpb24sIGhhbENiKTsKKyAgICB9IGVsc2UgaWYgKGludGVyZmFjZV8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbl8zXzQ7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNvbnZlcnRIQUxTdHJlYW1Db21iaW5hdGlvbkZyb21WMzdUb1YzNCgKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uXzNfNCwgY29uZmlndXJhdGlvbik7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmlzU3RyZWFtQ29tYmluYXRpb25TdXBwb3J0ZWQoY29uZmlndXJhdGlvbl8zXzQsIGhhbENiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIGlmIChyZXQuaXNPaygpKSB7CiAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgewogICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMjUyNiw2ICsyNTY5LDk3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaWx0ZXJTbWFsbEpwZWdTaXplcygpIHsKKyAgICBpbnQzMl90IHRocmVzaG9sZFcgPSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX1c7CisgICAgaW50MzJfdCB0aHJlc2hvbGRIID0gU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6UEVSRl9DTEFTU19KUEVHX1RIUkVTSF9IOworCisgICAgaWYgKG1DYW1lcmFDaGFyTm9QQ092ZXJyaWRlICE9IG51bGxwdHIpIHJldHVybiBPSzsKKworICAgIG1DYW1lcmFDaGFyTm9QQ092ZXJyaWRlID0gc3RkOjptYWtlX3VuaXF1ZTxDYW1lcmFNZXRhZGF0YT4obUNhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisKKyAgICAvLyBSZW1vdmUgc21hbGwgSlBFRyBzaXplcyBmcm9tIGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbnMKKyAgICBzaXplX3QgbGFyZ2VKcGVnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld1N0cmVhbUNvbmZpZ3M7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGlmICgoc3RyZWFtQ29uZmlncy5kYXRhLmkzMltpXSA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpICYmIChzdHJlYW1Db25maWdzLmRhdGEuaTMyW2krM10gPT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0gPCB0aHJlc2hvbGRXICB8fAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0gPCB0aHJlc2hvbGRIKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxhcmdlSnBlZ0NvdW50ICsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG5ld1N0cmVhbUNvbmZpZ3MuaW5zZXJ0KG5ld1N0cmVhbUNvbmZpZ3MuZW5kKCksIHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzIgKyBpLAorICAgICAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzIgKyBpICsgNCk7CisgICAgfQorICAgIGlmIChuZXdTdHJlYW1Db25maWdzLnNpemUoKSA9PSAwIHx8IGxhcmdlSnBlZ0NvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgc21hbGwgSlBFRyBzaXplcyBmcm9tIGF2YWlsYWJsZSBtaW4gZnJhbWUgZHVyYXRpb25zCisgICAgbGFyZ2VKcGVnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG5ld01pbkR1cmF0aW9uczsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRHVyYXRpb25zID0KKyAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW5EdXJhdGlvbnMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpZiAobWluRHVyYXRpb25zLmRhdGEuaTY0W2ldID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgaWYgKG1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpKzFdIDwgdGhyZXNob2xkVyB8fAorICAgICAgICAgICAgICAgICAgICBtaW5EdXJhdGlvbnMuZGF0YS5pNjRbaSsyXSA8IHRocmVzaG9sZEgpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFyZ2VKcGVnQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdNaW5EdXJhdGlvbnMuaW5zZXJ0KG5ld01pbkR1cmF0aW9ucy5lbmQoKSwgbWluRHVyYXRpb25zLmRhdGEuaTY0ICsgaSwKKyAgICAgICAgICAgICAgICBtaW5EdXJhdGlvbnMuZGF0YS5pNjQgKyBpICsgNCk7CisgICAgfQorICAgIGlmIChuZXdNaW5EdXJhdGlvbnMuc2l6ZSgpID09IDAgfHwgbGFyZ2VKcGVnQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFJlbW92ZSBzbWFsbCBKUEVHIHNpemVzIGZyb20gYXZhaWxhYmxlIHN0YWxsIGR1cmF0aW9ucworICAgIGxhcmdlSnBlZ0NvdW50ID0gMDsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBuZXdTdGFsbER1cmF0aW9uczsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgc3RhbGxEdXJhdGlvbnMgPQorICAgICAgICAgICAgbUNhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhbGxEdXJhdGlvbnMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpZiAoc3RhbGxEdXJhdGlvbnMuZGF0YS5pNjRbaV0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBpZiAoc3RhbGxEdXJhdGlvbnMuZGF0YS5pNjRbaSsxXSA8IHRocmVzaG9sZFcgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhbGxEdXJhdGlvbnMuZGF0YS5pNjRbaSsyXSA8IHRocmVzaG9sZEgpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGFyZ2VKcGVnQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdTdGFsbER1cmF0aW9ucy5pbnNlcnQobmV3U3RhbGxEdXJhdGlvbnMuZW5kKCksIHN0YWxsRHVyYXRpb25zLmRhdGEuaTY0ICsgaSwKKyAgICAgICAgICAgICAgICBzdGFsbER1cmF0aW9ucy5kYXRhLmk2NCArIGkgKyA0KTsKKyAgICB9CisgICAgaWYgKG5ld1N0YWxsRHVyYXRpb25zLnNpemUoKSA9PSAwIHx8IGxhcmdlSnBlZ0NvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgbmV3U3RyZWFtQ29uZmlncy5kYXRhKCksIG5ld1N0cmVhbUNvbmZpZ3Muc2l6ZSgpKTsKKyAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIG5ld01pbkR1cmF0aW9ucy5kYXRhKCksIG5ld01pbkR1cmF0aW9ucy5zaXplKCkpOworICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MudXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBuZXdTdGFsbER1cmF0aW9ucy5kYXRhKCksIG5ld1N0YWxsRHVyYXRpb25zLnNpemUoKSk7CisKKyAgICAvLyBSZS1nZW5lcmF0ZSBtZXRhZGF0YSB0YWdzIHRoYXQgaGF2ZSBkZXBlbmRlbmNpZXMgb24gQkxPQiBzaXplcworICAgIGF1dG8gcmVzID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYXBwZW5kIGR5bmFtaWMgZGVwdGggdGFnczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgLy8gQWxsb3cgZmlsdGVyaW5nIG9mIHNtYWxsIEpQRUcgc2l6ZXMgdG8gc3VjY2VlZCBldmVuIGlmIGR5bmFtaWMgZGVwdGgKKyAgICAgICAgLy8gdGFncyBmYWlsIHRvIGdlbmVyYXRlLgorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICBzdGQ6OnN0cmluZyAqdHlwZSwgdWludDMyX3QgKmlkKSB7CiAgICAgLy8gRm9ybWF0IG11c3QgYmUgIjx0eXBlPi88aWQ+IgpAQCAtMjY4OSw5ICsyODIzLDExIEBACiAKIAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86On5Qcm92aWRlckluZm8oKSB7CisgICAgaWYgKG1Jbml0aWFsU3RhdHVzQ2FsbGJhY2tGdXR1cmUudmFsaWQoKSkgeworICAgICAgICBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlLndhaXQoKTsKKyAgICB9CiAgICAgLy8gRGVzdHJ1Y3Rpb24gb2YgUHJvdmlkZXJJbmZvIGlzIG9ubHkgc3VwcG9zZWQgdG8gaGFwcGVuIHdoZW4gdGhlIHJlc3BlY3RpdmUKICAgICAvLyBDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgZGllcywgc28gZG8gbm90IHVucmVnaXN0ZXIgY2FsbGJhY2tzLgotCiB9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKGNvbnN0IFN0YXR1cyYgcykgIHsKQEAgLTI4NzAsNiArMzAwNiw4IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+ICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCiAgICAgICAgIGJvb2wgKmVhcmx5RXhpdCkgewogICAgIGJpbmRlcjo6U3RhdHVzIGJTdGF0dXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKQEAgLTI4NzcsMjUgKzMwMTUsMzEgQEAKICAgICBib29sIHNob3VsZEV4aXQgPSBmYWxzZTsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBmb3IgKGF1dG8gJmNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZyA6IGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiBzdHJlYW1Db25maWd1cmF0aW9uOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQgPSBjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZGV2aWNlSW5mbzsKLSAgICAgICAgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tQ2FtZXJhSWQsICZkZXZpY2VJbmZvKTsKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyA9CisgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6dGFyZ2V0UGVyZkNsYXNzUHJpbWFyeUNhbWVyYSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNhbWVyYUlkLCB0YXJnZXRTZGtWZXJzaW9uKTsKKyAgICAgICAgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNhbWVyYUlkLCBvdmVycmlkZUZvclBlcmZDbGFzcywgJmRldmljZUluZm8pOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhID0KLSAgICAgICAgICAgICAgICBbdGhpc10oY29uc3QgU3RyaW5nOCAmaWQpIHsKKyAgICAgICAgY2FtZXJhMzo6bWV0YWRhdGFHZXR0ZXIgZ2V0TWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIFt0aGlzXShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcykgewogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbERldmljZUluZm87Ci0gICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChpZC5zdHJpbmcoKSwgJnBoeXNpY2FsRGV2aWNlSW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChpZC5zdHJpbmcoKSwgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxEZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBoeXNpY2FsRGV2aWNlSW5mbzsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7Ci0gICAgICAgIGlzTG9naWNhbENhbWVyYUxvY2tlZChjYW1lcmFJZEFuZFNlc3Npb25Db25maWcubUNhbWVyYUlkLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpc0xvZ2ljYWxDYW1lcmFMb2NrZWQoY2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkcyk7CiAgICAgICAgIGJTdGF0dXMgPQogICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb24oCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tU2Vzc2lvbkNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlnLm1DYW1lcmFJZC5jX3N0cigpKSwgZGV2aWNlSW5mbywgZ2V0TWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLCBzdHJlYW1Db25maWd1cmF0aW9uLCAmc2hvdWxkRXhpdCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2FtZXJhSWQuY19zdHIoKSksIGRldmljZUluZm8sIGdldE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcywgc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsICZzaG91bGRFeGl0KTsKICAgICAgICAgaWYgKCFiU3RhdHVzLmlzT2soKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbiBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjkwNSw3ICszMDQ5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgICBDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uIGhhbENhbWVyYUlkQW5kU3RyZWFtOwotICAgICAgICBoYWxDYW1lcmFJZEFuZFN0cmVhbS5jYW1lcmFJZCA9IGNhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZy5tQ2FtZXJhSWQ7CisgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLmNhbWVyYUlkID0gY2FtZXJhSWQ7CiAgICAgICAgIGhhbENhbWVyYUlkQW5kU3RyZWFtLnN0cmVhbUNvbmZpZ3VyYXRpb24gPSBzdHJlYW1Db25maWd1cmF0aW9uOwogICAgICAgICBoYWxDYW1lcmFJZHNBbmRTdHJlYW1zVi5wdXNoX2JhY2soaGFsQ2FtZXJhSWRBbmRTdHJlYW0pOwogICAgIH0KQEAgLTI5MzgsNyArMzA4Miw4IEBACiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbWVyYUlkQW5kU2Vzc2lvbkNvbmZpZ3VyYXRpb24+ICZjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywKLSAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogICAgIC8vIENoZWNrIGlmIGFsbCB0aGUgZGV2aWNlcyBhcmUgYSBzdWJzZXQgb2YgZGV2aWNlcyBhZHZlcnRpc2VkIGJ5IHRoZQogICAgIC8vIHNhbWUgcHJvdmlkZXIgdGhyb3VnaCBnZXRDb25jdXJyZW50U3RyZWFtaW5nQ2FtZXJhSWRzKCkKQEAgLTI5NTIsOCArMzA5Nyw4IEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4gaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zOwogICAgICAgICAgICAgYm9vbCBrbm93VW5zdXBwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uQW5kQ2FtZXJhSWRzTG9ja2VkKAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZHNBbmRTZXNzaW9uQ29uZmlncywgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgJmtub3dVbnN1cHBvcnRlZCk7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLCBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXRTZGtWZXJzaW9uLCAmaGFsQ2FtZXJhSWRzQW5kU3RyZWFtQ29tYmluYXRpb25zLCAma25vd1Vuc3VwcG9ydGVkKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXMgdW5hYmxlIHRvIGNvbnZlcnQgc2Vzc2lvbiBjb25maWd1cmF0aW9ucyBwcm92aWRlZCB0byBIQUwgc3RyZWFtIgogICAgICAgICAgICAgICAgICAgICAgICJjb21iaW5hdGlvbnMiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMjk3NSwxMCArMzEyMCwxMCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3QgewogICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOwogICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG92ZXJyaWRlRm9yUGVyZkNsYXNzLCBjaGFyYWN0ZXJpc3RpY3MpOwogICAgIH0KIAogICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAppbmRleCAyNWQzNjM5Li4xYmRiYjQ0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCkBAIC0yMCw4ICsyMCwxMCBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxmdXR1cmU+CiAKICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9Db25jdXJyZW50Q2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CkBAIC0zMiw3ICszNCw4IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi41L0lDYW1lcmFQcm92aWRlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNi9JQ2FtZXJhUHJvdmlkZXJDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNi9JQ2FtZXJhUHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi43L0lDYW1lcmFQcm92aWRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCkBAIC03Nyw2ICs4MCwxNiBAQAogICAgSElEREVOX1NFQ1VSRV9DQU1FUkEKIH07CiAKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDEsIDApCisjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAwKQorI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgMSkKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDIpCisjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zIEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCAzKQorI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgNCkKKyNkZWZpbmUgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDMsIDUpCisjZGVmaW5lIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM182IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigzLCA2KQorI2RlZmluZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNyBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMywgNykKKwogLyoqCiAgKiBBIG1hbmFnZXIgZm9yIGFsbCBjYW1lcmEgcHJvdmlkZXJzIGF2YWlsYWJsZSBvbiBhbiBBbmRyb2lkIGRldmljZS4KICAqCkBAIC0yMTQsMTkgKzIyNywyMCBAQAogICAgICAqIG5vdCBoYXZlIGEgdjMgb3IgbmV3ZXIgSEFMIHZlcnNpb24uCiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0OworICAgICAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBpc0NvbmN1cnJlbnRTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYUlkc0FuZFNlc3Npb25Db25maWdzLAotICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24sIGJvb2wgKmlzU3VwcG9ydGVkKTsKIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4+IGdldENvbmN1cnJlbnRDYW1lcmFJZHMoKSBjb25zdDsKICAgICAvKioKICAgICAgKiBDaGVjayBmb3IgZGV2aWNlIHN1cHBvcnQgb2Ygc3BlY2lmaWMgc3RyZWFtIGNvbWJpbmF0aW9uLgogICAgICAqLwogICAgIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAogICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIGNvbnN0OwogCiAgICAgLyoqCkBAIC0yNjksMTEgKzI4Myw2IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiAqc2Vzc2lvbik7CiAKLSAgICBzdGF0dXNfdCBvcGVuU2Vzc2lvbihjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7Ci0KICAgICAvKioKICAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKICAgICAgKi8KQEAgLTMyMCw2ICszMjksOCBAQAogICAgIHN0YXR1c190IGdldFN5c3RlbUNhbWVyYUtpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBTeXN0ZW1DYW1lcmFLaW5kICpraW5kKSBjb25zdDsKICAgICBib29sIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdDsKIAorICAgIHN0YXR1c190IGZpbHRlclNtYWxsSnBlZ1NpemVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCk7CisKICAgICBzdGF0aWMgY29uc3QgZmxvYXQga0RlcHRoQVJUb2xlcmFuY2U7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKQEAgLTM1OCw2ICszNjksNyBAQAogICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50CiAgICAgewogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJvdmlkZXJOYW1lOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtUHJvdmlkZXJJbnN0YW5jZTsKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CiAgICAgICAgIGludCBtTWlub3JWZXJzaW9uOwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKQEAgLTM3Miw3ICszODQsNyBAQAogCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKIAotICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKKyAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlckluc3RhbmNlLAogICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CiAgICAgICAgIH5Qcm92aWRlckluZm8oKTsKIApAQCAtNDAzLDYgKzQxNSwxNSBAQAogICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cykgb3ZlcnJpZGU7CiAKKyAgICAgICAgc3RhdHVzX3QgY2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisgICAgICAgIHN0YXR1c190IHBoeXNpY2FsQ2FtZXJhRGV2aWNlU3RhdHVzQ2hhbmdlTG9ja2VkKAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBpZCwgc3RkOjpzdHJpbmcqIHBoeXNpY2FsSWQsCisgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBjYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxDYW1lcmFEZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG5ld1N0YXR1cyk7CisKICAgICAgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgb3ZlcnJpZGU7CiAKQEAgLTQyNSw3ICs0NDYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgc3RhdHVzX3QgaXNDb25jdXJyZW50U2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzY6OkNhbWVyYUlkQW5kU3RyZWFtQ29tYmluYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNzo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbENhbWVyYUlkc0FuZFN0cmVhbUNvbWJpbmF0aW9ucywKICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKQEAgLTQ0NCw4ICs0NjUsNiBAQAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKLSAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cz4KLSAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsU3RhdHVzOwogCiAgICAgICAgICAgICB3cDxQcm92aWRlckluZm8+IG1QYXJlbnRQcm92aWRlcjsKIApAQCAtNDU1LDcgKzQ3NCw5IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3QgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgKHZvaWQpIG92ZXJyaWRlRm9yUGVyZkNsYXNzOwogICAgICAgICAgICAgICAgICh2b2lkKSBjaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQpAQCAtNDY3LDEwICs0ODgsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAogICAgICAgICAgICAgICAgICAgICBib29sICogLypzdGF0dXMqLykgewogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsdGVyU21hbGxKcGVnU2l6ZXMoKSA9IDA7CiAKICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOwpAQCAtNTEzLDI3ICs1MzUsNiBAQAogICAgICAgICAvLyBwaHlzaWNhbCBjYW1lcmEgSURzLgogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzOwogCi0gICAgICAgIC8vIEhBTHYxLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKLSAgICAgICAgc3RydWN0IERldmljZUluZm8xIDogcHVibGljIERldmljZUluZm8gewotICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKLSAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKLSAgICAgICAgICAgIERldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAotICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwotICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzEoKTsKLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMyIG1EZWZhdWx0UGFyYW1ldGVyczsKLSAgICAgICAgICAgIHN0YXR1c190IGNhY2hlQ2FtZXJhSW5mbyhzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwotICAgICAgICB9OwotCiAgICAgICAgIC8vIEhBTHYzLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8zIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKQEAgLTU0MywxMyArNTQ0LDE1IEBACiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pCiAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBmaWx0ZXJTbWFsbEpwZWdTaXplcygpIG92ZXJyaWRlOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLApAQCAtNTU5LDIzICs1NjIsMjcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgLy8gQSBjb3B5IG9mIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3Mgd2l0aG91dCBwZXJmb3JtYW5jZSBjbGFzcworICAgICAgICAgICAgLy8gb3ZlcnJpZGUKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFNZXRhZGF0YT4gbUNhbWVyYUNoYXJOb1BDT3ZlcnJpZGU7CiAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CiAgICAgICAgICAgICB2b2lkIHF1ZXJ5UGh5c2ljYWxDYW1lcmFJZHMoKTsKICAgICAgICAgICAgIFN5c3RlbUNhbWVyYUtpbmQgZ2V0U3lzdGVtQ2FtZXJhS2luZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOwotICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncygpOwotICAgICAgICAgICAgc3RhdHVzX3QgZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGFkZER5bmFtaWNEZXB0aFRhZ3MoYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVyaXZlSGVpY1RhZ3MoYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOwogICAgICAgICAgICAgc3RhdHVzX3QgYWRkUm90YXRlQ3JvcFRhZ3MoKTsKICAgICAgICAgICAgIHN0YXR1c190IGFkZFByZUNvcnJlY3Rpb25BY3RpdmVBcnJheVNpemUoKTsKIAogICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsCiAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKnNpemVzIC8qb3V0Ki8pOwotICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywKICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKTsKLSAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBkZXB0aER1cmF0aW9ucywKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aER1cmF0aW9ucygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKTsKICAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKApAQCAtNjAwLDcgKzYwNywyNyBAQAogCiAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbU1hbmFnZXI7CiAKKyAgICAgICAgc3RydWN0IENhbWVyYVN0YXR1c0luZm9UIHsKKyAgICAgICAgICAgIGJvb2wgaXNQaHlzaWNhbENhbWVyYVN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGNhbWVyYUlkOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXM7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNJbmZvVChib29sIGlzRm9yUGh5c2ljYWxDYW1lcmEsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGh5c2ljYWxJZCwKKyAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgcykgOgorICAgICAgICAgICAgICAgICAgICBpc1BoeXNpY2FsQ2FtZXJhU3RhdHVzKGlzRm9yUGh5c2ljYWxDYW1lcmEpLCBjYW1lcmFJZChpZCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxJZCksIHN0YXR1cyhzKSB7fQorICAgICAgICB9OworCisgICAgICAgIC8vIExvY2sgdG8gc3luY2hyb25pemUgYmV0d2VlbiBpbml0aWFsaXplKCkgYW5kIGNhbWVyYSBzdGF0dXMgY2FsbGJhY2tzCisgICAgICAgIHN0ZDo6bXV0ZXggbUluaXRMb2NrOwogICAgICAgICBib29sIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4gbUNhY2hlZFN0YXR1czsKKyAgICAgICAgLy8gRW5kIG9mIHNjb3BlIGZvciBtSW5pdExvY2sKKworICAgICAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBtSW5pdGlhbFN0YXR1c0NhbGxiYWNrRnV0dXJlOworICAgICAgICB2b2lkIG5vdGlmeUluaXRpYWxTdGF0dXNDaGFuZ2Uoc3A8U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyLAorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxDYW1lcmFTdGF0dXNJbmZvVD4+IGNhY2hlZFN0YXR1cyk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4gbUNvbmN1cnJlbnRDYW1lcmFJZENvbWJpbmF0aW9uczsKIApAQCAtNjQ0LDcgKzY3MSwxMCBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKIAotICAgIHN0YXR1c190IGFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlcik7CisgICAgc3RhdHVzX3QgYWRkUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG5ld1Byb3ZpZGVyLCBib29sIHByZWV4aXN0aW5nID0gZmFsc2UpOworCisgICAgc3RhdHVzX3QgdHJ5VG9Jbml0aWFsaXplUHJvdmlkZXJMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPFByb3ZpZGVySW5mbz4mIHByb3ZpZGVySW5mbyk7CiAKICAgICBib29sIGlzTG9naWNhbENhbWVyYUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCkBAIC02NTMsNiArNjgzLDcgQEAKIAogICAgIGJvb2wgaXNWYWxpZERldmljZUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1ham9yVmVyc2lvbikgY29uc3Q7CiAKKyAgICBzaXplX3QgbVByb3ZpZGVySW5zdGFuY2VJZCA9IDA7CiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAogICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKQEAgLTY2OCw3ICs2OTksNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlRvcmNoTW9kZVN0YXR1cyYpOwogCi0gICAgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKKyAgICBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzLAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIGNoYXJhY3RlcmlzdGljcykgY29uc3Q7CiAgICAgdm9pZCBmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlSWRzKSBjb25zdDsKIApAQCAtNjgyLDcgKzcxMyw5IEBACiAgICAgc3RhdHVzX3QgY29udmVydFRvSEFMU3RyZWFtQ29tYmluYXRpb25BbmRDYW1lcmFJZHNMb2NrZWQoCiAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6Q2FtZXJhSWRBbmRTZXNzaW9uQ29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhSWRzQW5kU2Vzc2lvbkNvbmZpZ3MsCi0gICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNjo6Q2FtZXJhSWRBbmRTdHJlYW1Db21iaW5hdGlvbj4KKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLAorICAgICAgICAgICAgICBpbnQgdGFyZ2V0U2RrVmVyc2lvbiwKKyAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl83OjpDYW1lcmFJZEFuZFN0cmVhbUNvbWJpbmF0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICpoYWxDYW1lcmFJZHNBbmRTdHJlYW1Db21iaW5hdGlvbnMsCiAgICAgICAgICAgICAgIGJvb2wgKmVhcmx5RXhpdCk7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlZjY4MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+IC8vIEZvciBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhCi0jaW5jbHVkZSAiQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi11c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOwotdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKLXVzaW5nIGhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKLQotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6On5DYW1lcmFIYXJkd2FyZUludGVyZmFjZSgpCi17Ci0gICAgQUxPR0koIkRlc3Ryb3lpbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChtSGlkbERldmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5jbG9zZSgpOwotICAgICAgICBtSGlkbERldmljZS5jbGVhcigpOwotICAgICAgICBjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICBBTE9HSSgiT3BlbmluZyBjYW1lcmEgJXMiLCBtTmFtZS5zdHJpbmcoKSk7Ci0KLSAgICBzdGF0dXNfdCByZXQgPSBtYW5hZ2VyLT5vcGVuU2Vzc2lvbihtTmFtZS5zdHJpbmcoKSwgdGhpcywgJm1IaWRsRGV2aWNlKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogb3BlblNlc3Npb24gZmFpbGVkISAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldFByZXZpZXdTY2FsaW5nTW9kZShpbnQgc2NhbGluZ01vZGUpCi17Ci0gICAgaW50IHJjID0gT0s7Ci0gICAgbVByZXZpZXdTY2FsaW5nTW9kZSA9IHNjYWxpbmdNb2RlOwotICAgIGlmIChtUHJldmlld1dpbmRvdyAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJjID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1QcmV2aWV3V2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIHNjYWxpbmdNb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0UHJldmlld1RyYW5zZm9ybShpbnQgdHJhbnNmb3JtKSB7Ci0gICAgaW50IHJjID0gT0s7Ci0gICAgbVByZXZpZXdUcmFuc2Zvcm0gPSB0cmFuc2Zvcm07Ci0gICAgaWYgKG1QcmV2aWV3V2luZG93ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RyYW5zZm9ybShtUHJldmlld1dpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBtUHJldmlld1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIHJldHVybiByYzsKLX0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICovCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpub3RpZnlDYWxsYmFjaygKLSAgICAgICAgTm90aWZ5Q2FsbGJhY2tNc2cgbXNnVHlwZSwgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKLSAgICBzTm90aWZ5Q2IoKGludDMyX3QpIG1zZ1R5cGUsIGV4dDEsIGV4dDIsICh2b2lkKikgdGhpcyk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48dWludDMyX3Q+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpyZWdpc3Rlck1lbW9yeSgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfaGFuZGxlJiBkZXNjcmlwdG9yLAotICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplLCB1aW50MzJfdCBidWZmZXJDb3VudCkgewotICAgIGlmIChkZXNjcmlwdG9yLT5udW1GZHMgIT0gMSkgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBtZW1vcnkgZGVzY3JpcHRvciBoYXMgbnVtRmRzICVkIChleHBlY3QgMSkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVzY3JpcHRvci0+bnVtRmRzKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChkZXNjcmlwdG9yLT5kYXRhWzBdIDwgMCkgewotICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBtZW1vcnkgZGVzY3JpcHRvciBoYXMgRkQgJWQgKGV4cGVjdCA+PSAwKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXNjcmlwdG9yLT5kYXRhWzBdKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBzR2V0TWVtb3J5KGRlc2NyaXB0b3ItPmRhdGFbMF0sIGJ1ZmZlclNpemUsIGJ1ZmZlckNvdW50LCB0aGlzKTsKLSAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBjYW1NZW0oc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihtZW0tPmhhbmRsZSkpOwotICAgIGludCBtZW1Qb29sSWQgPSBjYW1NZW0tPm1IZWFwLT5nZXRIZWFwSUQoKTsKLSAgICBpZiAobWVtUG9vbElkIDwgMCkgewotICAgICAgICBBTE9HRSgiJXM6IENhbWVyYUhlYXBNZW1vcnkgaGFzIEZEICVkIChleHBlY3QgPj0gMCkiLCBfX0ZVTkNUSU9OX18sIG1lbVBvb2xJZCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKLSAgICBtSGlkbE1lbVBvb2xNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1lbVBvb2xJZCwgbWVtKSk7Ci0gICAgcmV0dXJuIG1lbVBvb2xJZDsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6dW5yZWdpc3Rlck1lbW9yeSh1aW50MzJfdCBtZW1JZCkgewotICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOwotICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KG1lbUlkKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgbWVtSWQpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KG1lbUlkKTsKLSAgICAgICAgbUhpZGxNZW1Qb29sTWFwLmVyYXNlKG1lbUlkKTsKLSAgICB9Ci0gICAgc1B1dE1lbW9yeShtZW0pOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkYXRhQ2FsbGJhY2soCi0gICAgICAgIERhdGFDYWxsYmFja01zZyBtc2dUeXBlLCB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBidWZmZXJJbmRleCwKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpDYW1lcmFGcmFtZU1ldGFkYXRhJiBtZXRhZGF0YSkgewotICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOwotICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKTsKLSAgICB9Ci0gICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgbWQ7Ci0gICAgbWQubnVtYmVyX29mX2ZhY2VzID0gbWV0YWRhdGEuZmFjZXMuc2l6ZSgpOwotICAgIG1kLmZhY2VzID0gKGNhbWVyYV9mYWNlX3QqKSBtZXRhZGF0YS5mYWNlcy5kYXRhKCk7Ci0gICAgc0RhdGFDYigoaW50MzJfdCkgbXNnVHlwZSwgbWVtLCBidWZmZXJJbmRleCwgJm1kLCB0aGlzKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6ZGF0YUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICBEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwgdWludDMyX3QgZGF0YSwKLSAgICAgICAgdWludDMyX3QgYnVmZmVySW5kZXgsIGludDY0X3QgdGltZXN0YW1wKSB7Ci0gICAgY2FtZXJhX21lbW9yeV90KiBtZW0gPSBudWxscHRyOwotICAgIHsKLSAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUhpZGxNZW1Qb29sTWFwTG9jayk7Ci0gICAgICAgIGlmIChtSGlkbE1lbVBvb2xNYXAuY291bnQoZGF0YSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBtZW1vcnkgcG9vbCBJRCAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtID0gbUhpZGxNZW1Qb29sTWFwLmF0KGRhdGEpOwotICAgIH0KLSAgICBzRGF0YUNiVGltZXN0YW1wKHRpbWVzdGFtcCwgKGludDMyX3QpIG1zZ1R5cGUsIG1lbSwgYnVmZmVySW5kZXgsIHRoaXMpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpoYW5kbGVDYWxsYmFja1RpbWVzdGFtcCgKLSAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsIGNvbnN0IGhpZGxfaGFuZGxlJiBmcmFtZURhdGEsIHVpbnQzMl90IGRhdGEsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlckluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCkgewotICAgIGNhbWVyYV9tZW1vcnlfdCogbWVtID0gbnVsbHB0cjsKLSAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1IaWRsTWVtUG9vbE1hcExvY2spOwotICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGRhdGEpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogbWVtb3J5IHBvb2wgSUQgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1lbSA9IG1IaWRsTWVtUG9vbE1hcC5hdChkYXRhKTsKLSAgICB9Ci0gICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gaGVhcE1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KG1lbS0+aGFuZGxlKSk7Ci0gICAgLy8gVE9ETzogVXNpbmcgdW5zZWN1cmVQb2ludGVyKCkgaGFzIHNvbWUgYXNzb2NpYXRlZCBzZWN1cml0eSBwaXRmYWxscwotICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgIC8vICAgICAgIEVpdGhlciBkb2N1bWVudCB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIGNhc2Ugb3IgYWRkcmVzcyB0aGUKLSAgICAvLyAgICAgICBpc3N1ZSAoZS5nLiBieSBjb3B5aW5nKS4KLSAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikKLSAgICAgICAgICAgIGhlYXBNZW0tPm1CdWZmZXJzW2J1ZmZlckluZGV4XS0+dW5zZWN1cmVQb2ludGVyKCk7Ci0gICAgbWQtPnBIYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGZyYW1lRGF0YS5nZXROYXRpdmVIYW5kbGUoKSk7Ci0gICAgc0RhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIChpbnQzMl90KSBtc2dUeXBlLCBtZW0sIGJ1ZmZlckluZGV4LCB0aGlzKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6aGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKLSAgICAgICAgRGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OkhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+JiBtZXNzYWdlcykgewotICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OkhhbmRsZVRpbWVzdGFtcE1lc3NhZ2U+IG1zZ3M7Ci0gICAgbXNncy5yZXNlcnZlKG1lc3NhZ2VzLnNpemUoKSk7Ci0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSGlkbE1lbVBvb2xNYXBMb2NrKTsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBoaWRsX21zZyA6IG1lc3NhZ2VzKSB7Ci0gICAgICAgICAgICBpZiAobUhpZGxNZW1Qb29sTWFwLmNvdW50KGhpZGxfbXNnLmRhdGEpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG1lbW9yeSBwb29sIElEICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgaGlkbF9tc2cuZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxDYW1lcmFIZWFwTWVtb3J5PiBtZW0oCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4obUhpZGxNZW1Qb29sTWFwLmF0KGhpZGxfbXNnLmRhdGEpLT5oYW5kbGUpKTsKLQotICAgICAgICAgICAgaWYgKGhpZGxfbXNnLmJ1ZmZlckluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYnVmZmVyIGluZGV4ICVkLCBtYXggYWxsb3dlZCBpcyAlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgIGhpZGxfbXNnLmJ1ZmZlckluZGV4LCBtZW0tPm1OdW1CdWZzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKLSAgICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzIHRoZQotICAgICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikKLSAgICAgICAgICAgICAgICAgICAgbWVtLT5tQnVmZmVyc1toaWRsX21zZy5idWZmZXJJbmRleF0tPnVuc2VjdXJlUG9pbnRlcigpOwotICAgICAgICAgICAgbWQtPnBIYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KGhpZGxfbXNnLmZyYW1lRGF0YS5nZXROYXRpdmVIYW5kbGUoKSk7Ci0KLSAgICAgICAgICAgIG1zZ3MucHVzaF9iYWNrKHtoaWRsX21zZy50aW1lc3RhbXAsIG1lbS0+bUJ1ZmZlcnNbaGlkbF9tc2cuYnVmZmVySW5kZXhdfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbURhdGFDYlRpbWVzdGFtcEJhdGNoKChpbnQzMl90KSBtc2dUeXBlLCBtc2dzLCBtQ2JVc2VyKTsKLSAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKLX0KLQotc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6Z2V0QnVmZmVySWQoCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYikgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwotCi0gICAgYnVmZmVyX2hhbmRsZV90JiBidWYgPSBhbmItPmhhbmRsZTsKLSAgICBhdXRvIGl0ID0gbUJ1ZmZlcklkTWFwLmZpbmQoYnVmKTsKLSAgICBpZiAoaXQgPT0gbUJ1ZmZlcklkTWFwLmVuZCgpKSB7Ci0gICAgICAgIHVpbnQ2NF90IGJ1ZklkID0gbU5leHRCdWZmZXJJZCsrOwotICAgICAgICBtQnVmZmVySWRNYXBbYnVmXSA9IGJ1ZklkOwotICAgICAgICBtUmV2ZXJzZWRCdWZNYXBbYnVmSWRdID0gYW5iOwotICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgYnVmSWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihmYWxzZSwgaXQtPnNlY29uZCk7Ci0gICAgfQotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOwotICAgIG1CdWZmZXJJZE1hcC5jbGVhcigpOwotICAgIG1SZXZlcnNlZEJ1Zk1hcC5jbGVhcigpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6ZGVxdWV1ZUJ1ZmZlcihkZXF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci0gICAgfQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KGEsICZhbmIpOwotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICB1aW50NjRfdCBidWZmZXJJZCA9IDA7Ci0gICAgdWludDMyX3Qgc3RyaWRlID0gMDsKLSAgICBoaWRsX2hhbmRsZSBidWYgPSBudWxscHRyOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBzID0gU3RhdHVzOjpPSzsKLSAgICAgICAgYXV0byBwYWlyID0gZ2V0QnVmZmVySWQoYW5iKTsKLSAgICAgICAgYnVmID0gKHBhaXIuZmlyc3QpID8gYW5iLT5oYW5kbGUgOiBudWxscHRyOwotICAgICAgICBidWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICBzdHJpZGUgPSBhbmItPnN0cmlkZTsKLSAgICB9Ci0KLSAgICBfaGlkbF9jYihzLCBidWZmZXJJZCwgYnVmLCBzdHJpZGUpOwotICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4KLUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjplbnF1ZXVlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgfQotICAgIGlmIChtUmV2ZXJzZWRCdWZNYXAuY291bnQoYnVmZmVySWQpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBidWZmZXJJZCAlIiBQUkl1NjQgIiBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKLSAgICB9Ci0gICAgaW50IHJjID0gYS0+cXVldWVCdWZmZXIoYSwgbVJldmVyc2VkQnVmTWFwLmF0KGJ1ZmZlcklkKSwgLTEpOwotICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6Y2FuY2VsQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgfQotICAgIGlmIChtUmV2ZXJzZWRCdWZNYXAuY291bnQoYnVmZmVySWQpID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBidWZmZXJJZCAlIiBQUkl1NjQgIiBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcklkKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKLSAgICB9Ci0gICAgaW50IHJjID0gYS0+Y2FuY2VsQnVmZmVyKGEsIG1SZXZlcnNlZEJ1Zk1hcC5hdChidWZmZXJJZCksIC0xKTsKLSAgICBpZiAocmMgPT0gMCkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPgotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldEJ1ZmZlckNvdW50KHVpbnQzMl90IGNvdW50KSB7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgYi8yNzAzOTc3NQotICAgICAgICAvLyBQcmV2aW91c2x5LCBzZXR0aW5nIHRoZSBidWZmZXIgY291bnQgd291bGQgcmVzZXQgdGhlIGJ1ZmZlcgotICAgICAgICAvLyBxdWV1ZSdzIGZsYWcgdGhhdCBhbGxvd3MgZm9yIGFsbCBidWZmZXJzIHRvIGJlIGRlcXVldWVkIG9uIHRoZQotICAgICAgICAvLyBwcm9kdWNlciBzaWRlLCBpbnN0ZWFkIG9mIGp1c3QgdGhlIHByb2R1Y2VyJ3MgZGVjbGFyZWQgbWF4IGNvdW50LAotICAgICAgICAvLyBpZiBubyBmaWxsZWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHF1ZXVlZCBieSB0aGUgcHJvZHVjZXIuICBUaGlzCi0gICAgICAgIC8vIHJlc2V0IG5vIGxvbmdlciBoYXBwZW5zLCBidXQgc29tZSBIQUxzIGRlcGVuZCBvbiB0aGlzIGJlaGF2aW9yLAotICAgICAgICAvLyBzbyBpdCBuZWVkcyB0byBiZSBtYWludGFpbmVkIGZvciBIQUwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vIFNpbXVsYXRlIHRoZSBwcmlvciBiZWhhdmlvciBieSBkaXNjb25uZWN0aW5nL3JlY29ubmVjdGluZyB0byB0aGUKLSAgICAgICAgLy8gd2luZG93IGFuZCBzZXR0aW5nIHRoZSB2YWx1ZXMgYWdhaW4uICBUaGlzIGhhcyB0aGUgZHJhd2JhY2sgb2YKLSAgICAgICAgLy8gYWN0dWFsbHkgY2F1c2luZyBtZW1vcnkgcmVhbGxvY2F0aW9uLCB3aGljaCBtYXkgbm90IGhhdmUgaGFwcGVuZWQKLSAgICAgICAgLy8gaW4gdGhlIHBhc3QuCi0gICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoYSwgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhLCBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOwotICAgICAgICBpZiAobVByZXZpZXdTY2FsaW5nTW9kZSAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUoYSwgbVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2aWV3VHJhbnNmb3JtICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtKGEsIG1QcmV2aWV3VHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZpZXdXaWR0aCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYSwKLSAgICAgICAgICAgICAgICAgICAgbVByZXZpZXdXaWR0aCwgbVByZXZpZXdIZWlnaHQpOwotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQoYSwgbVByZXZpZXdGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldmlld1VzYWdlICE9IDApIHsKLSAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGEsIG1QcmV2aWV3VXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldmlld1N3YXBJbnRlcnZhbCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBhLT5zZXRTd2FwSW50ZXJ2YWwoYSwgbVByZXZpZXdTd2FwSW50ZXJ2YWwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJldmlld0Nyb3AubGVmdCAhPSBOT1RfU0VUKSB7Ci0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICYobVByZXZpZXdDcm9wKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KGEsIGNvdW50KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgY2xlYW51cENpcmN1bGF0aW5nQnVmZmVycygpOwotICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKLSAgICB9Ci0gICAgcmV0dXJuIFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPgotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldEJ1ZmZlcnNHZW9tZXRyeSgKLSAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCkgewotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgbVByZXZpZXdXaWR0aCA9IHc7Ci0gICAgbVByZXZpZXdIZWlnaHQgPSBoOwotICAgIG1QcmV2aWV3Rm9ybWF0ID0gKGludCkgZm9ybWF0OwotICAgIGludCByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhhLCB3LCBoKTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcmMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChhLCBtUHJldmlld0Zvcm1hdCk7Ci0gICAgfQotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCk7Ci0gICAgICAgIHMgPSBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gczsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0Q3JvcChpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgewotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgbVByZXZpZXdDcm9wLmxlZnQgPSBsZWZ0OwotICAgIG1QcmV2aWV3Q3JvcC50b3AgPSB0b3A7Ci0gICAgbVByZXZpZXdDcm9wLnJpZ2h0ID0gcmlnaHQ7Ci0gICAgbVByZXZpZXdDcm9wLmJvdHRvbSA9IGJvdHRvbTsKLSAgICBpbnQgcmMgPSBuYXRpdmVfd2luZG93X3NldF9jcm9wKGEsICZtUHJldmlld0Nyb3ApOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBzID0gU3RhdHVzOjpPSzsKLSAgICB9Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPgotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldFVzYWdlKGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpCdWZmZXJVc2FnZSB1c2FnZSkgewotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgbVByZXZpZXdVc2FnZSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PiAodXNhZ2UpOwotICAgIGludCByYyA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKGEsIG1QcmV2aWV3VXNhZ2UpOwotICAgIGlmIChyYyA9PSBPSykgewotICAgICAgICBjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCk7Ci0gICAgICAgIHMgPSBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICByZXR1cm4gczsKLX0KLQotaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0U3dhcEludGVydmFsKGludDMyX3QgaW50ZXJ2YWwpIHsKLSAgICBTdGF0dXMgcyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgQU5hdGl2ZVdpbmRvdyAqYSA9IG1QcmV2aWV3V2luZG93LmdldCgpOwotICAgIGlmIChhID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBwcmV2aWV3IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICAgIG1QcmV2aWV3U3dhcEludGVydmFsID0gaW50ZXJ2YWw7Ci0gICAgaW50IHJjID0gYS0+c2V0U3dhcEludGVydmFsKGEsIGludGVydmFsKTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcyA9IFN0YXR1czo6T0s7Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotCi1oYXJkd2FyZTo6UmV0dXJuPHZvaWQ+Ci1DYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6Z2V0TWluVW5kZXF1ZXVlZEJ1ZmZlckNvdW50KGdldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudF9jYiBfaGlkbF9jYikgewotICAgIEFOYXRpdmVXaW5kb3cgKmEgPSBtUHJldmlld1dpbmRvdy5nZXQoKTsKLSAgICBpZiAoYSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlczogcHJldmlldyB3aW5kb3cgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwotICAgIH0KLSAgICBpbnQgY291bnQgPSAwOwotICAgIGludCByYyA9IGEtPnF1ZXJ5KGEsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJmNvdW50KTsKLSAgICBTdGF0dXMgcyA9IFN0YXR1czo6SU5URVJOQUxfRVJST1I7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgIHMgPSBTdGF0dXM6Ok9LOwotICAgIH0KLSAgICBfaGlkbF9jYihzLCBjb3VudCk7Ci0gICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7Ci19Ci0KLWhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPgotQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldFRpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcCkgewotICAgIFN0YXR1cyBzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93ICphID0gbVByZXZpZXdXaW5kb3cuZ2V0KCk7Ci0gICAgaWYgKGEgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IHByZXZpZXcgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0gICAgaW50IHJjID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAoYSwgdGltZXN0YW1wKTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgcyA9IFN0YXR1czo6T0s7Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c2V0UHJldmlld1dpbmRvdyhjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYnVmKQotewotICAgIEFMT0dWKCIlcyglcykgYnVmICVwIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSwgYnVmLmdldCgpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG1QcmV2aWV3V2luZG93ID0gYnVmOwotICAgICAgICBpZiAoYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGlmIChtUHJldmlld1NjYWxpbmdNb2RlICE9IE5PVF9TRVQpIHsKLSAgICAgICAgICAgICAgICBzZXRQcmV2aWV3U2NhbGluZ01vZGUobVByZXZpZXdTY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByZXZpZXdUcmFuc2Zvcm0gIT0gTk9UX1NFVCkgewotICAgICAgICAgICAgICAgIHNldFByZXZpZXdUcmFuc2Zvcm0obVByZXZpZXdUcmFuc2Zvcm0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2V0UHJldmlld1dpbmRvdyhidWYuZ2V0KCkgPyB0aGlzIDogbnVsbHB0cikpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldENhbGxiYWNrcyhub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAotICAgICAgICBkYXRhX2NhbGxiYWNrIGRhdGFfY2IsCi0gICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wIGRhdGFfY2JfdGltZXN0YW1wLAotICAgICAgICBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcF9iYXRjaCBkYXRhX2NiX3RpbWVzdGFtcF9iYXRjaCwKLSAgICAgICAgdm9pZCogdXNlcikKLXsKLSAgICBtTm90aWZ5Q2IgPSBub3RpZnlfY2I7Ci0gICAgbURhdGFDYiA9IGRhdGFfY2I7Ci0gICAgbURhdGFDYlRpbWVzdGFtcCA9IGRhdGFfY2JfdGltZXN0YW1wOwotICAgIG1EYXRhQ2JUaW1lc3RhbXBCYXRjaCA9IGRhdGFfY2JfdGltZXN0YW1wX2JhdGNoOwotICAgIG1DYlVzZXIgPSB1c2VyOwotCi0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjplbmFibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBtSGlkbERldmljZS0+ZW5hYmxlTXNnVHlwZShtc2dUeXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnVHlwZSkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBtSGlkbERldmljZS0+ZGlzYWJsZU1zZ1R5cGUobXNnVHlwZSk7Ci0gICAgfQotfQotCi1pbnQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6Om1zZ1R5cGVFbmFibGVkKGludDMyX3QgbXNnVHlwZSkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPm1zZ1R5cGVFbmFibGVkKG1zZ1R5cGUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydFByZXZpZXcoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c3RhcnRQcmV2aWV3KCkpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BQcmV2aWV3KCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBtSGlkbERldmljZS0+c3RvcFByZXZpZXcoKTsKLSAgICB9Ci19Ci0KLWludCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6cHJldmlld0VuYWJsZWQoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBtSGlkbERldmljZS0+cHJldmlld0VuYWJsZWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c3RvcmVNZXRhRGF0YUluQnVmZmVycyhpbnQgZW5hYmxlKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhlbmFibGUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVuYWJsZSA/IElOVkFMSURfT1BFUkFUSU9OOiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnN0YXJ0UmVjb3JkaW5nKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnN0YXJ0UmVjb3JkaW5nKCkpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLS8qKgotICogU3RvcCBhIHByZXZpb3VzbHkgc3RhcnRlZCByZWNvcmRpbmcuCi0gKi8KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BSZWNvcmRpbmcoKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5zdG9wUmVjb3JkaW5nKCk7Ci0gICAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiByZWNvcmRpbmcgaXMgZW5hYmxlZC4KLSAqLwotaW50IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpyZWNvcmRpbmdFbmFibGVkKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gbUhpZGxEZXZpY2UtPnJlY29yZGluZ0VuYWJsZWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlUmVjb3JkaW5nRnJhbWUoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBtZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgaW50IGhlYXBJZCA9IGhlYXAtPmdldEhlYXBJRCgpOwotICAgIGludCBidWZmZXJJbmRleCA9IG9mZnNldCAvIHNpemU7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBpZiAoc2l6ZSA9PSBzaXplb2YoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKLSAgICAgICAgICAgIC8vICAgICAgIChzZWUgZGVjbGFyYXRpb24gZm9yIGRldGFpbHMpLgotICAgICAgICAgICAgLy8gICAgICAgRWl0aGVyIGRvY3VtZW50IHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgY2FzZSBvciBhZGRyZXNzIHRoZQotICAgICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKiBtZCA9IChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikgbWVtLT51bnNlY3VyZVBvaW50ZXIoKTsKLSAgICAgICAgICAgIC8vIENhY2hpbmcgdGhlIGhhbmRsZSBoZXJlIGJlY2F1c2UgbWQtPnBIYW5kbGUgd2lsbCBiZSBzdWJqZWN0IHRvIEhBTCdzIGVkaXQKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBtZC0+cEhhbmRsZTsKLSAgICAgICAgICAgIGhpZGxfaGFuZGxlIGZyYW1lID0gbmg7Ci0gICAgICAgICAgICBtSGlkbERldmljZS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lSGFuZGxlKGhlYXBJZCwgYnVmZmVySW5kZXgsIGZyYW1lKTsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZShoZWFwSWQsIGJ1ZmZlckluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6cmVsZWFzZVJlY29yZGluZ0ZyYW1lQmF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4+JiBmcmFtZXMpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIHNpemVfdCBuID0gZnJhbWVzLnNpemUoKTsKLSAgICBzdGQ6OnZlY3RvcjxWaWRlb0ZyYW1lTWVzc2FnZT4gbXNnczsKLSAgICBtc2dzLnJlc2VydmUobik7Ci0gICAgZm9yIChhdXRvJiBtZW0gOiBmcmFtZXMpIHsKLSAgICAgICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwID0gbWVtLT5nZXRNZW1vcnkoJm9mZnNldCwgJnNpemUpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gc2l6ZW9mKFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaGVhcElkID0gaGVhcC0+Z2V0SGVhcElEKCk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySW5kZXggPSBvZmZzZXQgLyBzaXplOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IFVzaW5nIHVuc2VjdXJlUG9pbnRlcigpIGhhcyBzb21lIGFzc29jaWF0ZWQgc2VjdXJpdHkgcGl0ZmFsbHMKLSAgICAgICAgICAgICAgICAvLyAgICAgICAoc2VlIGRlY2xhcmF0aW9uIGZvciBkZXRhaWxzKS4KLSAgICAgICAgICAgICAgICAvLyAgICAgICBFaXRoZXIgZG9jdW1lbnQgd2h5IGl0IGlzIHNhZmUgaW4gdGhpcyBjYXNlIG9yIGFkZHJlc3MgdGhlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgaXNzdWUgKGUuZy4gYnkgY29weWluZykuCi0gICAgICAgICAgICAgICAgVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSogbWQgPSAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopIG1lbS0+dW5zZWN1cmVQb2ludGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gQ2FjaGluZyB0aGUgaGFuZGxlIGhlcmUgYmVjYXVzZSBtZC0+cEhhbmRsZSB3aWxsIGJlIHN1YmplY3QgdG8gSEFMJ3MgZWRpdAotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBtZC0+cEhhbmRsZTsKLSAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lTWVzc2FnZSBtc2c7Ci0gICAgICAgICAgICAgICAgbXNncy5wdXNoX2JhY2soe25oLCBoZWFwSWQsIGJ1ZmZlckluZGV4fSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBvbmx5IHN1cHBvcnRzIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUhpZGxEZXZpY2UtPnJlbGVhc2VSZWNvcmRpbmdGcmFtZUhhbmRsZUJhdGNoKG1zZ3MpOwotCi0gICAgZm9yIChhdXRvJiBtc2cgOiBtc2dzKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KG1zZy5mcmFtZURhdGEuZ2V0TmF0aXZlSGFuZGxlKCkpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG5oKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmF1dG9Gb2N1cygpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5hdXRvRm9jdXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmNhbmNlbEF1dG9Gb2N1cygpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5jYW5jZWxBdXRvRm9jdXMoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnRha2VQaWN0dXJlKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPnRha2VQaWN0dXJlKCkpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxQaWN0dXJlKCkKLXsKLSAgICBBTE9HVigiJXMoJXMpIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1QoCi0gICAgICAgICAgICAgICAgbUhpZGxEZXZpY2UtPmNhbmNlbFBpY3R1cmUoKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNldFBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyAmcGFyYW1zKQotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVCgKLSAgICAgICAgICAgICAgICBtSGlkbERldmljZS0+c2V0UGFyYW1ldGVycyhwYXJhbXMuZmxhdHRlbigpLnN0cmluZygpKSk7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotQ2FtZXJhUGFyYW1ldGVycyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6Z2V0UGFyYW1ldGVycygpIGNvbnN0Ci17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIENhbWVyYVBhcmFtZXRlcnMgcGFybXM7Ci0gICAgaWYgKENDX0xJS0VMWShtSGlkbERldmljZSAhPSBudWxscHRyKSkgewotICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgb3V0UGFyYW07Ci0gICAgICAgIG1IaWRsRGV2aWNlLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgICAgIFsmb3V0UGFyYW1dKGNvbnN0IGF1dG8mIG91dFN0cikgewotICAgICAgICAgICAgICAgICAgICBvdXRQYXJhbSA9IG91dFN0cjsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgU3RyaW5nOCB0bXAob3V0UGFyYW0uY19zdHIoKSk7Ci0gICAgICAgIHBhcm1zLnVuZmxhdHRlbih0bXApOwotICAgIH0KLSAgICByZXR1cm4gcGFybXM7Ci19Ci0KLXN0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpCi17Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgcmV0dXJuIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bWFwVG9TdGF0dXNUKAotICAgICAgICAgICAgICAgIG1IaWRsRGV2aWNlLT5zZW5kQ29tbWFuZCgoQ29tbWFuZFR5cGUpIGNtZCwgYXJnMSwgYXJnMikpOwotICAgIH0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLS8qKgotICogUmVsZWFzZSB0aGUgaGFyZHdhcmUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAqICpub3QqIGRvbmUgaW4gdGhlIGRlc3RydWN0b3IuCi0gKi8KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnJlbGVhc2UoKSB7Ci0gICAgQUxPR1YoIiVzKCVzKSIsIF9fRlVOQ1RJT05fXywgbU5hbWUuc3RyaW5nKCkpOwotICAgIGlmIChDQ19MSUtFTFkobUhpZGxEZXZpY2UgIT0gbnVsbHB0cikpIHsKLSAgICAgICAgbUhpZGxEZXZpY2UtPmNsb3NlKCk7Ci0gICAgICAgIG1IaWRsRGV2aWNlLmNsZWFyKCk7Ci0gICAgfQotfQotCi0vKioKLSAqIER1bXAgc3RhdGUgb2YgdGhlIGNhbWVyYSBoYXJkd2FyZQotICovCi1zdGF0dXNfdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAotewotICAgIEFMT0dWKCIlcyglcykiLCBfX0ZVTkNUSU9OX18sIG1OYW1lLnN0cmluZygpKTsKLSAgICBpZiAoQ0NfTElLRUxZKG1IaWRsRGV2aWNlICE9IG51bGxwdHIpKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKLSAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgICAgIFN0YXR1cyBzID0gbUhpZGxEZXZpY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qocyk7Ci0gICAgfQotICAgIHJldHVybiBPSzsgLy8gSXQncyBmaW5lIGlmIHRoZSBIQUwgZG9lc24ndCBpbXBsZW1lbnQgZHVtcCgpCi19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNOb3RpZnlDYihpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQgKnVzZXIpCi17Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqb2JqZWN0ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOwotICAgIG9iamVjdC0+bU5vdGlmeUNiKG1zZ190eXBlLCBleHQxLCBleHQyLCBvYmplY3QtPm1DYlVzZXIpOwotfQotCi12b2lkIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpzRGF0YUNiKGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCi17Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqb2JqZWN0ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOwotICAgIHNwPENhbWVyYUhlYXBNZW1vcnk+IG1lbShzdGF0aWNfY2FzdDxDYW1lcmFIZWFwTWVtb3J5ICo+KGRhdGEtPmhhbmRsZSkpOwotICAgIGlmIChpbmRleCA+PSBtZW0tPm1OdW1CdWZzKSB7Ci0gICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBidWZmZXIgaW5kZXggJWQsIG1heCBhbGxvd2VkIGlzICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgIGluZGV4LCBtZW0tPm1OdW1CdWZzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBvYmplY3QtPm1EYXRhQ2IobXNnX3R5cGUsIG1lbS0+bUJ1ZmZlcnNbaW5kZXhdLCBtZXRhZGF0YSwgb2JqZWN0LT5tQ2JVc2VyKTsKLX0KLQotdm9pZCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0RhdGFDYlRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwgaW50MzJfdCBtc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCi17Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBDYW1lcmFIYXJkd2FyZUludGVyZmFjZSAqb2JqZWN0ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlICo+KHVzZXIpOwotICAgIC8vIFN0YXJ0IHJlZmNvdW50aW5nIHRoZSBoZWFwIG9iamVjdCBmcm9tIGhlcmUgb24uICBXaGVuIHRoZSBjbGllbnRzCi0gICAgLy8gZHJvcCBhbGwgcmVmZXJlbmNlcywgaXQgd2lsbCBiZSBkZXN0cm95ZWQgKGFzIHdlbGwgYXMgdGhlIGVuY2xvc2VkCi0gICAgLy8gTWVtb3J5SGVhcEJhc2UuCi0gICAgc3A8Q2FtZXJhSGVhcE1lbW9yeT4gbWVtKHN0YXRpY19jYXN0PENhbWVyYUhlYXBNZW1vcnkgKj4oZGF0YS0+aGFuZGxlKSk7Ci0gICAgaWYgKGluZGV4ID49IG1lbS0+bU51bUJ1ZnMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJ1ZmZlciBpbmRleCAlZCwgbWF4IGFsbG93ZWQgaXMgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgaW5kZXgsIG1lbS0+bU51bUJ1ZnMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG9iamVjdC0+bURhdGFDYlRpbWVzdGFtcCh0aW1lc3RhbXAsIG1zZ190eXBlLCBtZW0tPm1CdWZmZXJzW2luZGV4XSwgb2JqZWN0LT5tQ2JVc2VyKTsKLX0KLQotY2FtZXJhX21lbW9yeV90KiBDYW1lcmFIYXJkd2FyZUludGVyZmFjZTo6c0dldE1lbW9yeSgKLSAgICAgICAgaW50IGZkLCBzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmcywKLSAgICAgICAgdm9pZCAqdXNlciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKLXsKLSAgICBDYW1lcmFIZWFwTWVtb3J5ICptZW07Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBtZW0gPSBuZXcgQ2FtZXJhSGVhcE1lbW9yeShidWZfc2l6ZSwgbnVtX2J1ZnMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbSA9IG5ldyBDYW1lcmFIZWFwTWVtb3J5KGZkLCBidWZfc2l6ZSwgbnVtX2J1ZnMpOwotICAgIH0KLSAgICBtZW0tPmluY1N0cm9uZyhtZW0pOwotICAgIHJldHVybiAmbWVtLT5oYW5kbGU7Ci19Ci0KLXZvaWQgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OnNQdXRNZW1vcnkoY2FtZXJhX21lbW9yeV90ICpkYXRhKQotewotICAgIGlmICghZGF0YSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQ2FtZXJhSGVhcE1lbW9yeSAqbWVtID0gc3RhdGljX2Nhc3Q8Q2FtZXJhSGVhcE1lbW9yeSAqPihkYXRhLT5oYW5kbGUpOwotICAgIG1lbS0+ZGVjU3Ryb25nKG1lbSk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTliMDQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ0FNRVJBX0hBUkRXQVJFX0lOVEVSRkFDRV9ICi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KLSNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KLQotI2luY2x1ZGUgPGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHZvaWQgKCpub3RpZnlfY2FsbGJhY2spKGludDMyX3QgbXNnVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpOwotCi10eXBlZGVmIHZvaWQgKCpkYXRhX2NhbGxiYWNrKShpbnQzMl90IG1zZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRhdGFQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpOwotCi10eXBlZGVmIHZvaWQgKCpkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCkobnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkYXRhUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpOwotCi1zdHJ1Y3QgSGFuZGxlVGltZXN0YW1wTWVzc2FnZSB7Ci0gICAgbnNlY3NfdCB0aW1lc3RhbXA7Ci0gICAgY29uc3Qgc3A8SU1lbW9yeT4gZGF0YVB0cjsKLX07Ci0KLXR5cGVkZWYgdm9pZCAoKmRhdGFfY2FsbGJhY2tfdGltZXN0YW1wX2JhdGNoKSgKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxIYW5kbGVUaW1lc3RhbXBNZXNzYWdlPiYsIHZvaWQqIHVzZXIpOwotCi0vKioKLSAqIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZQotICogY2FtZXJhIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyLCB1c2VkIGZvciBzZXR0aW5nIGFuZCBnZXR0aW5nCi0gKiBwYXJhbWV0ZXJzLCBsaXZlIHByZXZpZXdpbmcsIGFuZCB0YWtpbmcgcGljdHVyZXMuIEl0IGlzIHVzZWQgZm9yCi0gKiBIQUwgZGV2aWNlcyB3aXRoIHZlcnNpb24gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgb25seS4KLSAqCi0gKiBJdCBpcyBhIHJlZmVyZW5jZWQgY291bnRlZCBpbnRlcmZhY2Ugd2l0aCBSZWZCYXNlIGFzIGl0cyBiYXNlIGNsYXNzLgotICogQ2FtZXJhU2VydmljZSBjYWxscyBvcGVuQ2FtZXJhSGFyZHdhcmUoKSB0byByZXRyaWV2ZSBhIHN0cm9uZyBwb2ludGVyIHRvIHRoZQotICogaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgYW5kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZQotICogZm9sbG93aW5nIHN0ZXBzIGRlc2NyaWJlIGEgdHlwaWNhbCBzZXF1ZW5jZToKLSAqCi0gKiAgIC0jIEFmdGVyIENhbWVyYVNlcnZpY2UgY2FsbHMgb3BlbkNhbWVyYUhhcmR3YXJlKCksIGdldFBhcmFtZXRlcnMoKSBhbmQKLSAqICAgICAgc2V0UGFyYW1ldGVycygpIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnN0YW5jZS4KLSAqICAgLSMgc3RhcnRQcmV2aWV3KCkgaXMgY2FsbGVkLgotICoKLSAqIFByaW9yIHRvIHRha2luZyBhIHBpY3R1cmUsIENhbWVyYVNlcnZpY2Ugb2Z0ZW4gY2FsbHMgYXV0b2ZvY3VzKCkuIFdoZW4gYXV0bwotICogZm9jdXNpbmcgaGFzIGNvbXBsZXRlZCwgdGhlIGNhbWVyYSBpbnN0YW5jZSBzZW5kcyBhIENBTUVSQV9NU0dfRk9DVVMgbm90aWZpY2F0aW9uLAotICogd2hpY2ggaW5mb3JtcyB0aGUgYXBwbGljYXRpb24gd2hldGhlciBmb2N1c2luZyB3YXMgc3VjY2Vzc2Z1bC4gVGhlIGNhbWVyYSBpbnN0YW5jZQotICogb25seSBzZW5kcyB0aGlzIG1lc3NhZ2Ugb25jZSBhbmQgaXQgaXMgdXAgIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBjYWxsIGF1dG9Gb2N1cygpCi0gKiBhZ2FpbiBpZiByZWZvY3VzaW5nIGlzIGRlc2lyZWQuCi0gKgotICogQ2FtZXJhU2VydmljZSBjYWxscyB0YWtlUGljdHVyZSgpIHRvIHJlcXVlc3QgdGhlIGNhbWVyYSBpbnN0YW5jZSB0YWtlIGEKLSAqIHBpY3R1cmUuIEF0IHRoaXMgcG9pbnQsIGlmIGEgc2h1dHRlciwgcG9zdHZpZXcsIHJhdywgYW5kL29yIGNvbXByZXNzZWQKLSAqIGNhbGxiYWNrIGlzIGRlc2lyZWQsIHRoZSBjb3JyZXNwb25kaW5nIG1lc3NhZ2UgbXVzdCBiZSBlbmFibGVkLiBBbnkgbWVtb3J5Ci0gKiBwcm92aWRlZCBpbiBhIGRhdGEgY2FsbGJhY2sgbXVzdCBiZSBjb3BpZWQgaWYgaXQncyBuZWVkZWQgYWZ0ZXIgcmV0dXJuaW5nLgotICovCi0KLWNsYXNzIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlIDoKLSAgICAgICAgcHVibGljIHZpcnR1YWwgUmVmQmFzZSwKLSAgICAgICAgcHVibGljIHZpcnR1YWwgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZVByZXZpZXdDYWxsYmFjayB7Ci0KLXB1YmxpYzoKLSAgICBleHBsaWNpdCBDYW1lcmFIYXJkd2FyZUludGVyZmFjZShjb25zdCBjaGFyICpuYW1lKToKLSAgICAgICAgICAgIG1IaWRsRGV2aWNlKG51bGxwdHIpLAotICAgICAgICAgICAgbU5hbWUobmFtZSksCi0gICAgICAgICAgICBtUHJldmlld1NjYWxpbmdNb2RlKE5PVF9TRVQpLAotICAgICAgICAgICAgbVByZXZpZXdUcmFuc2Zvcm0oTk9UX1NFVCksCi0gICAgICAgICAgICBtUHJldmlld1dpZHRoKE5PVF9TRVQpLAotICAgICAgICAgICAgbVByZXZpZXdIZWlnaHQoTk9UX1NFVCksCi0gICAgICAgICAgICBtUHJldmlld0Zvcm1hdChOT1RfU0VUKSwKLSAgICAgICAgICAgIG1QcmV2aWV3VXNhZ2UoMCksCi0gICAgICAgICAgICBtUHJldmlld1N3YXBJbnRlcnZhbChOT1RfU0VUKSwKLSAgICAgICAgICAgIG1QcmV2aWV3Q3JvcHtOT1RfU0VULE5PVF9TRVQsTk9UX1NFVCxOT1RfU0VUfQotICAgIHsKLSAgICB9Ci0KLSAgICB+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UoKTsKLQotICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKTsKLQotICAgIC8qKiBTZXQgdGhlIEFOYXRpdmVXaW5kb3cgdG8gd2hpY2ggcHJldmlldyBmcmFtZXMgYXJlIHNlbnQgKi8KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93KGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+JiBidWYpOwotCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld1NjYWxpbmdNb2RlKGludCBzY2FsaW5nTW9kZSk7Ci0KLSAgICBzdGF0dXNfdCBzZXRQcmV2aWV3VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOwotCi0gICAgLyoqIFNldCB0aGUgbm90aWZpY2F0aW9uIGFuZCBkYXRhIGNhbGxiYWNrcyAqLwotICAgIHZvaWQgc2V0Q2FsbGJhY2tzKG5vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCi0gICAgICAgICAgICAgICAgICAgICAgZGF0YV9jYWxsYmFjayBkYXRhX2NiLAotICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wIGRhdGFfY2JfdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wX2JhdGNoIGRhdGFfY2JfdGltZXN0YW1wX2JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYWxsIHRha2UgYSBtc2d0eXBlLAotICAgICAqIHdoaWNoIGlzIGEgYml0bWFzayBvZiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbgotICAgICAqIGluY2x1ZGUvdWkvQ2FtZXJhLmgKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIEVuYWJsZSBhIG1lc3NhZ2UsIG9yIHNldCBvZiBtZXNzYWdlcy4KLSAgICAgKi8KLSAgICB2b2lkIGVuYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKTsKLQotICAgIC8qKgotICAgICAqIERpc2FibGUgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIE9uY2UgcmVjZWl2ZWQgYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBjYW1lcmEgaGFsCi0gICAgICogc2hvdWxkIG5vdCByZWx5IG9uIGl0cyBjbGllbnQgdG8gY2FsbCByZWxlYXNlUmVjb3JkaW5nRnJhbWUoKSB0byByZWxlYXNlCi0gICAgICogdmlkZW8gcmVjb3JkaW5nIGZyYW1lcyBzZW50IG91dCBieSB0aGUgY2FtZXJhbCBoYWwgYmVmb3JlIGFuZCBhZnRlciB0aGUKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSBjYWxsLiBDYW1lcmEgaGFsIGNsaWVudHMgbXVzdCBub3QKLSAgICAgKiBtb2RpZnkvYWNjZXNzIGFueSB2aWRlbyByZWNvcmRpbmcgZnJhbWUgYWZ0ZXIgY2FsbGluZwotICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLgotICAgICAqLwotICAgIHZvaWQgZGlzYWJsZU1zZ1R5cGUoaW50MzJfdCBtc2dUeXBlKTsKLQotICAgIC8qKgotICAgICAqIFF1ZXJ5IHdoZXRoZXIgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcywgaXMgZW5hYmxlZC4KLSAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBvcGVyYXRlcyBhcyBhbiBBTkQsIGlmIGFueSBvZiB0aGUgbWVzc2FnZXMKLSAgICAgKiBxdWVyaWVkIGFyZSBvZmYsIHRoaXMgd2lsbCByZXR1cm4gZmFsc2UuCi0gICAgICovCi0gICAgaW50IG1zZ1R5cGVFbmFibGVkKGludDMyX3QgbXNnVHlwZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCBwcmV2aWV3IG1vZGUuCi0gICAgICovCi0gICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcuCi0gICAgICovCi0gICAgdm9pZCBzdG9wUHJldmlldygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHByZXZpZXcgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBpbnQgcHJldmlld0VuYWJsZWQoKTsKLQotICAgIC8qKgotICAgICAqIFJlcXVlc3QgdGhlIGNhbWVyYSBoYWwgdG8gc3RvcmUgbWV0YSBkYXRhIG9yIHJlYWwgWVVWIGRhdGEgaW4KLSAgICAgKiB0aGUgdmlkZW8gYnVmZmVycyBzZW5kIG91dCB2aWEgQ0FNRVJBX01TR19WSURFT19GUlJBTUUgZm9yIGEKLSAgICAgKiByZWNvcmRpbmcgc2Vzc2lvbi4gSWYgaXQgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgY2FtZXJhCi0gICAgICogaGFsIGJlaGF2aW9yIGlzIHRvIHN0b3JlIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBzdGFydFJlY29yZGluZygpIGluIG9yZGVyCi0gICAgICogdG8gYmUgZWZmZWN0aXZlLgotICAgICAqCi0gICAgICogSWYgbWV0YSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgdmlkZW8gYnVmZmVycywgaXQgaXMgdXAgdG8gdGhlCi0gICAgICogcmVjZWl2ZXIgb2YgdGhlIHZpZGVvIGJ1ZmZlcnMgdG8gaW50ZXJwcmV0IHRoZSBjb250ZW50cyBhbmQKLSAgICAgKiB0byBmaW5kIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBtZXRhIGRhdGEKLSAgICAgKiBpbiB0aGUgYnVmZmVyLiBIb3cgdGhpcyBpcyBkb25lIGlzIG91dHNpZGUgb2YgdGhlIHNjb3BlIG9mCi0gICAgICogdGhpcyBtZXRob2QuCi0gICAgICoKLSAgICAgKiBTb21lIGNhbWVyYSBoYWwgbWF5IG5vdCBzdXBwb3J0IHN0b3JpbmcgbWV0YSBkYXRhIGluIHRoZSB2aWRlbwotICAgICAqIGJ1ZmZlcnMsIGJ1dCBhbGwgY2FtZXJhIGhhbCBzaG91bGQgc3VwcG9ydCBzdG9yaW5nIHJlYWwgWVVWIGRhdGEKLSAgICAgKiBpbiB0aGUgdmlkZW8gYnVmZmVycy4gSWYgdGhlIGNhbWVyYSBoYWwgZG9lcyBub3Qgc3VwcG9ydCBzdG9yaW5nCi0gICAgICogdGhlIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycyB3aGVuIGl0IGlzIHJlcXVlc3RlZCB0byBkbwotICAgICAqIGRvLCBJTlZBTElEX09QRVJBVElPTiBtdXN0IGJlIHJldHVybmVkLiBJdCBpcyB2ZXJ5IHVzZWZ1bCBmb3IKLSAgICAgKiB0aGUgY2FtZXJhIGhhbCB0byBwYXNzIG1ldGEgZGF0YSByYXRoZXIgdGhhbiB0aGUgYWN0dWFsIGZyYW1lCi0gICAgICogZGF0YSBkaXJlY3RseSB0byB0aGUgdmlkZW8gZW5jb2Rlciwgc2luY2UgdGhlIGFtb3VudCBvZiB0aGUKLSAgICAgKiB1bmNvbXByZXNzZWQgZnJhbWUgZGF0YSBjYW4gYmUgdmVyeSBsYXJnZSBpZiB2aWRlbyBzaXplIGlzIGxhcmdlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVuYWJsZSBpZiB0cnVlIHRvIGluc3RydWN0IHRoZSBjYW1lcmEgaGFsIHRvIHN0b3JlCi0gICAgICogICAgICBtZXRhIGRhdGEgaW4gdGhlIHZpZGVvIGJ1ZmZlcnM7IGZhbHNlIHRvIGluc3RydWN0Ci0gICAgICogICAgICB0aGUgY2FtZXJhIGhhbCB0byBzdG9yZSByZWFsIFlVViBkYXRhIGluIHRoZSB2aWRlbwotICAgICAqICAgICAgYnVmZmVycy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gT0sgb24gc3VjY2Vzcy4KLSAgICAgKi8KLQotICAgIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoaW50IGVuYWJsZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydCByZWNvcmQgbW9kZS4gV2hlbiBhIHJlY29yZCBpbWFnZSBpcyBhdmFpbGFibGUgYSBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FCi0gICAgICogbWVzc2FnZSBpcyBzZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWUuIEV2ZXJ5IHJlY29yZCBmcmFtZSBtdXN0IGJlIHJlbGVhc2VkCi0gICAgICogYnkgYSBjYW1lcmFsIGhhbCBjbGllbnQgdmlhIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpIGJlZm9yZSB0aGUgY2xpZW50IGNhbGxzCi0gICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuIEFmdGVyIHRoZSBjbGllbnQgY2FsbHMKLSAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgaXQgaXMgY2FtZXJhIGhhbCdzIHJlc3BvbnNpYmlsaXR5Ci0gICAgICogdG8gbWFuYWdlIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB2aWRlbyByZWNvcmRpbmcgZnJhbWVzLCBhbmQgdGhlIGNsaWVudCBtdXN0Ci0gICAgICogbm90IG1vZGlmeS9hY2Nlc3MgYW55IHZpZGVvIHJlY29yZGluZyBmcmFtZXMuCi0gICAgICovCi0gICAgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFN0b3AgYSBwcmV2aW91c2x5IHN0YXJ0ZWQgcmVjb3JkaW5nLgotICAgICAqLwotICAgIHZvaWQgc3RvcFJlY29yZGluZygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHJlY29yZGluZyBpcyBlbmFibGVkLgotICAgICAqLwotICAgIGludCByZWNvcmRpbmdFbmFibGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlIGEgcmVjb3JkIGZyYW1lIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgQ0FNRVJBX01TR19WSURFT19GUkFNRS4KLSAgICAgKgotICAgICAqIEl0IGlzIGNhbWVyYSBoYWwgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gcmVsZWFzZSB2aWRlbyByZWNvcmRpbmcKLSAgICAgKiBmcmFtZXMgc2VudCBvdXQgYnkgdGhlIGNhbWVyYSBoYWwgYmVmb3JlIHRoZSBjYW1lcmEgaGFsIHJlY2VpdmVzCi0gICAgICogYSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLiBBZnRlciBpdCByZWNlaXZlcwotICAgICAqIHRoZSBjYWxsIHRvIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyBjYW1lcmEgaGFsJ3MKLSAgICAgKiByZXNwb25zaWJpbGl0eSBvZiBtYW5hZ2luZyB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nCi0gICAgICogZnJhbWVzLgotICAgICAqLwotICAgIHZvaWQgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pOwotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZSBhIGJhdGNoIG9mIHJlY29yZGluZyBmcmFtZXMgcHJldmlvdXNseSByZXR1cm5lZCBieQotICAgICAqIENBTUVSQV9NU0dfVklERU9fRlJBTUUuIFRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgZnJhbWVzIHRoYXQgYXJlCi0gICAgICogc3RvcmVkIGFzIFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEuCi0gICAgICoKLSAgICAgKiBJdCBpcyBjYW1lcmEgaGFsIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIHJlbGVhc2UgdmlkZW8gcmVjb3JkaW5nCi0gICAgICogZnJhbWVzIHNlbnQgb3V0IGJ5IHRoZSBjYW1lcmEgaGFsIGJlZm9yZSB0aGUgY2FtZXJhIGhhbCByZWNlaXZlcwotICAgICAqIGEgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgaXQgcmVjZWl2ZXMKLSAgICAgKiB0aGUgY2FsbCB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgaXQgaXMgY2FtZXJhIGhhbCdzCi0gICAgICogcmVzcG9uc2liaWxpdHkgb2YgbWFuYWdpbmcgdGhlIGxpZmUtY3ljbGUgb2YgdGhlIHZpZGVvIHJlY29yZGluZwotICAgICAqIGZyYW1lcy4KLSAgICAgKi8KLSAgICB2b2lkIHJlbGVhc2VSZWNvcmRpbmdGcmFtZUJhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+PiYgZnJhbWVzKTsKLQotICAgIC8qKgotICAgICAqIFN0YXJ0IGF1dG8gZm9jdXMsIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sgcm91dGluZSBpcyBjYWxsZWQKLSAgICAgKiB3aXRoIENBTUVSQV9NU0dfRk9DVVMgb25jZSB3aGVuIGZvY3VzaW5nIGlzIGNvbXBsZXRlLiBhdXRvRm9jdXMoKQotICAgICAqIHdpbGwgYmUgY2FsbGVkIGFnYWluIGlmIGFub3RoZXIgYXV0byBmb2N1cyBpcyBuZWVkZWQuCi0gICAgICovCi0gICAgc3RhdHVzX3QgYXV0b0ZvY3VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGF1dG8tZm9jdXMgZnVuY3Rpb24uIElmIHRoZSBhdXRvLWZvY3VzIGlzIHN0aWxsIGluIHByb2dyZXNzLAotICAgICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjYW5jZWwgaXQuIFdoZXRoZXIgdGhlIGF1dG8tZm9jdXMgaXMgaW4gcHJvZ3Jlc3MKLSAgICAgKiBvciBub3QsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGZvY3VzIHBvc2l0aW9uIHRvIHRoZSBkZWZhdWx0LgotICAgICAqIElmIHRoZSBjYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWZvY3VzLCB0aGlzIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgc3RhdHVzX3QgY2FuY2VsQXV0b0ZvY3VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlIGEgcGljdHVyZS4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCB0YWtlUGljdHVyZSgpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VsIGEgcGljdHVyZSB0aGF0IHdhcyBzdGFydGVkIHdpdGggdGFrZVBpY3R1cmUuICBDYWxsaW5nIHRoaXMKLSAgICAgKiBtZXRob2Qgd2hlbiBubyBwaWN0dXJlIGlzIGJlaW5nIHRha2VuIGlzIGEgbm8tb3AuCi0gICAgICovCi0gICAgc3RhdHVzX3QgY2FuY2VsUGljdHVyZSgpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gVGhpcyByZXR1cm5zIEJBRF9WQUxVRSBpZiBhbnkgcGFyYW1ldGVyIGlzCi0gICAgICogaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiAqLwotICAgIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhUGFyYW1ldGVycyAmcGFyYW1zKTsKLQotICAgIC8qKiBSZXR1cm4gdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiAqLwotICAgIENhbWVyYVBhcmFtZXRlcnMgZ2V0UGFyYW1ldGVycygpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogU2VuZCBjb21tYW5kIHRvIGNhbWVyYSBkcml2ZXIuCi0gICAgICovCi0gICAgc3RhdHVzX3Qgc2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKLQotICAgIC8qKgotICAgICAqIFJlbGVhc2UgdGhlIGhhcmR3YXJlIHJlc291cmNlcyBvd25lZCBieSB0aGlzIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICAgICogKm5vdCogZG9uZSBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICB2b2lkIHJlbGVhc2UoKTsKLQotICAgIC8qKgotICAgICAqIER1bXAgc3RhdGUgb2YgdGhlIGNhbWVyYSBoYXJkd2FyZQotICAgICAqLwotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBtSGlkbERldmljZTsKLSAgICBTdHJpbmc4IG1OYW1lOwotCi0gICAgc3RhdGljIHZvaWQgc05vdGlmeUNiKGludDMyX3QgbXNnX3R5cGUsIGludDMyX3QgZXh0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIsIHZvaWQgKnVzZXIpOwotCi0gICAgc3RhdGljIHZvaWQgc0RhdGFDYihpbnQzMl90IG1zZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyKTsKLQotICAgIHN0YXRpYyB2b2lkIHNEYXRhQ2JUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpOwotCi0gICAgLy8gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdGhhdCBjb21iaW5lcyBhIE1lbW9yeUhlYXBCYXNlIGFuZCBhIE1lbW9yeUJhc2UKLSAgICAvLyBpbiBvbmUuICBTaW5jZSB3ZSB0ZW5kIHRvIHVzZSB0aGVtIGluIGEgb25lLXRvLW9uZSByZWxhdGlvbnNoaXAsIHRoaXMgaXMKLSAgICAvLyBoYW5keS4KLSAgICBjbGFzcyBDYW1lcmFIZWFwTWVtb3J5IDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgQ2FtZXJhSGVhcE1lbW9yeShpbnQgZmQsIHNpemVfdCBidWZfc2l6ZSwgdWludF90IG51bV9idWZmZXJzID0gMSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZTaXplKGJ1Zl9zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmcyhudW1fYnVmZmVycykKLSAgICAgICAgewotICAgICAgICAgICAgbUhlYXAgPSBuZXcgTWVtb3J5SGVhcEJhc2UoZmQsIGJ1Zl9zaXplICogbnVtX2J1ZmZlcnMpOwotICAgICAgICAgICAgY29tbW9uSW5pdGlhbGl6YXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIGV4cGxpY2l0IENhbWVyYUhlYXBNZW1vcnkoc2l6ZV90IGJ1Zl9zaXplLCB1aW50X3QgbnVtX2J1ZmZlcnMgPSAxKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUoYnVmX3NpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1CdWZzKG51bV9idWZmZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICBtSGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZShidWZfc2l6ZSAqIG51bV9idWZmZXJzKTsKLSAgICAgICAgICAgIGNvbW1vbkluaXRpYWxpemF0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNvbW1vbkluaXRpYWxpemF0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlLmRhdGEgPSBtSGVhcC0+YmFzZSgpOwotICAgICAgICAgICAgaGFuZGxlLnNpemUgPSBtQnVmU2l6ZSAqIG1OdW1CdWZzOwotICAgICAgICAgICAgaGFuZGxlLmhhbmRsZSA9IHRoaXM7Ci0KLSAgICAgICAgICAgIG1CdWZmZXJzID0gbmV3IHNwPE1lbW9yeUJhc2U+W21OdW1CdWZzXTsKLSAgICAgICAgICAgIGZvciAodWludF90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykKLSAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IG5ldyBNZW1vcnlCYXNlKG1IZWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAqIG1CdWZTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZlNpemUpOwotCi0gICAgICAgICAgICBoYW5kbGUucmVsZWFzZSA9IHNQdXRNZW1vcnk7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIH5DYW1lcmFIZWFwTWVtb3J5KCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlIFtdIG1CdWZmZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IG1CdWZTaXplOwotICAgICAgICB1aW50X3QgbU51bUJ1ZnM7Ci0gICAgICAgIHNwPE1lbW9yeUhlYXBCYXNlPiBtSGVhcDsKLSAgICAgICAgc3A8TWVtb3J5QmFzZT4gKm1CdWZmZXJzOwotCi0gICAgICAgIGNhbWVyYV9tZW1vcnlfdCBoYW5kbGU7Ci0gICAgfTsKLQotICAgIHN0YXRpYyBjYW1lcmFfbWVtb3J5X3QqIHNHZXRNZW1vcnkoaW50IGZkLCBzaXplX3QgYnVmX3NpemUsIHVpbnRfdCBudW1fYnVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBzUHV0TWVtb3J5KGNhbWVyYV9tZW1vcnlfdCAqZGF0YSk7Ci0KLSAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYik7Ci0gICAgdm9pZCBjbGVhbnVwQ2lyY3VsYXRpbmdCdWZmZXJzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjawotICAgICAqLwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gbm90aWZ5Q2FsbGJhY2soCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6Ok5vdGlmeUNhbGxiYWNrTXNnIG1zZ1R5cGUsCi0gICAgICAgICAgICBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mikgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx1aW50MzJfdD4gcmVnaXN0ZXJNZW1vcnkoCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUmIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJTaXplLCB1aW50MzJfdCBidWZmZXJDb3VudCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiB1bnJlZ2lzdGVyTWVtb3J5KHVpbnQzMl90IG1lbUlkKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGRhdGFDYWxsYmFjaygKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6RGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsCi0gICAgICAgICAgICB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBidWZmZXJJbmRleCwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6Q2FtZXJhRnJhbWVNZXRhZGF0YSYgbWV0YWRhdGEpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZGF0YUNhbGxiYWNrVGltZXN0YW1wKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IGJ1ZmZlckluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBoYW5kbGVDYWxsYmFja1RpbWVzdGFtcCgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6RGF0YUNhbGxiYWNrTXNnIG1zZ1R5cGUsCi0gICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF9oYW5kbGUmIGZyYW1lRGF0YSwgdWludDMyX3QgZGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckluZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBoYW5kbGVDYWxsYmFja1RpbWVzdGFtcEJhdGNoKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpEYXRhQ2FsbGJhY2tNc2cgbXNnVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpIYW5kbGVUaW1lc3RhbXBNZXNzYWdlPiYpIG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlUHJldmlld0NhbGxiYWNrCi0gICAgICovCi0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBkZXF1ZXVlQnVmZmVyKGRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBlbnF1ZXVlQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzPgotICAgICAgICAgICAgY2FuY2VsQnVmZmVyKHVpbnQ2NF90IGJ1ZmZlcklkKSBvdmVycmlkZTsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzPgotICAgICAgICAgICAgc2V0QnVmZmVyQ291bnQodWludDMyX3QgY291bnQpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBzZXRCdWZmZXJzR2VvbWV0cnkodWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIHNldENyb3AoaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBzZXRVc2FnZShoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6QnVmZmVyVXNhZ2UgdXNhZ2UpIG92ZXJyaWRlOwotICAgIGhhcmR3YXJlOjpSZXR1cm48aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM+Ci0gICAgICAgICAgICBzZXRTd2FwSW50ZXJ2YWwoaW50MzJfdCBpbnRlcnZhbCkgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBnZXRNaW5VbmRlcXVldWVkQnVmZmVyQ291bnQoCi0gICAgICAgIGdldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cz4KLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7Ci0KLSAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgbVByZXZpZXdXaW5kb3c7Ci0KLSAgICBub3RpZnlfY2FsbGJhY2sgICAgICAgICAgICAgICBtTm90aWZ5Q2I7Ci0gICAgZGF0YV9jYWxsYmFjayAgICAgICAgICAgICAgICAgbURhdGFDYjsKLSAgICBkYXRhX2NhbGxiYWNrX3RpbWVzdGFtcCAgICAgICBtRGF0YUNiVGltZXN0YW1wOwotICAgIGRhdGFfY2FsbGJhY2tfdGltZXN0YW1wX2JhdGNoIG1EYXRhQ2JUaW1lc3RhbXBCYXRjaDsKLSAgICB2b2lkICptQ2JVc2VyOwotCi0gICAgLy8gQ2FjaGVkIHZhbHVlcyBmb3IgcHJldmlldyBzdHJlYW0gcGFyYW1ldGVycwotICAgIHN0YXRpYyBjb25zdCBpbnQgTk9UX1NFVCA9IC0xOwotICAgIGludCBtUHJldmlld1NjYWxpbmdNb2RlOwotICAgIGludCBtUHJldmlld1RyYW5zZm9ybTsKLSAgICBpbnQgbVByZXZpZXdXaWR0aDsKLSAgICBpbnQgbVByZXZpZXdIZWlnaHQ7Ci0gICAgaW50IG1QcmV2aWV3Rm9ybWF0OwotICAgIHVpbnQ2NF90IG1QcmV2aWV3VXNhZ2U7Ci0gICAgaW50IG1QcmV2aWV3U3dhcEludGVydmFsOwotICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtUHJldmlld0Nyb3A7Ci0KLSAgICBzdHJ1Y3QgQnVmZmVySGFzaGVyIHsKLSAgICAgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYpIGNvbnN0IHsKLSAgICAgICAgICAgIGlmIChidWYgPT0gbnVsbHB0cikKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgc2l6ZV90IHJlc3VsdCA9IDE7Ci0gICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGJ1Zi0+bnVtRmRzOwotICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBidWYtPm51bUludHM7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gYnVmLT5udW1GZHMgKyBidWYtPm51bUludHM7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBidWYtPmRhdGFbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHN0cnVjdCBCdWZmZXJDb21wYXJhdG9yIHsKLSAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmMSwgY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYyKSBjb25zdCB7Ci0gICAgICAgICAgICBpZiAoYnVmMS0+bnVtRmRzID09IGJ1ZjItPm51bUZkcyAmJiBidWYxLT5udW1JbnRzID09IGJ1ZjItPm51bUludHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gYnVmMS0+bnVtRmRzICsgYnVmMS0+bnVtSW50czsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYxLT5kYXRhW2ldICE9IGJ1ZjItPmRhdGFbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdGQ6Om11dGV4IG1CdWZmZXJJZE1hcExvY2s7IC8vIHByb3RlY3RpbmcgbUJ1ZmZlcklkTWFwIGFuZCBtTmV4dEJ1ZmZlcklkCi0gICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgYnVmZmVyX2hhbmRsZV90LCB1aW50NjRfdCwKLSAgICAgICAgICAgIEJ1ZmZlckhhc2hlciwgQnVmZmVyQ29tcGFyYXRvcj4gQnVmZmVySWRNYXA7Ci0gICAgLy8gc3RyZWFtIElEIC0+IHBlciBzdHJlYW0gYnVmZmVyIElEIG1hcAotICAgIEJ1ZmZlcklkTWFwIG1CdWZmZXJJZE1hcDsKLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIEFOYXRpdmVXaW5kb3dCdWZmZXIqPiBtUmV2ZXJzZWRCdWZNYXA7Ci0gICAgdWludDY0X3QgbU5leHRCdWZmZXJJZCA9IDE7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwotCi0gICAgc3RkOjptdXRleCBtSGlkbE1lbVBvb2xNYXBMb2NrOyAvLyBwcm90ZWN0aW5nIG1IaWRsTWVtUG9vbE1hcAotICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIGNhbWVyYV9tZW1vcnlfdCo+IG1IaWRsTWVtUG9vbE1hcDsKLX07Ci0KLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAKaW5kZXggY2MyOTM5MC4uZjNhZGYyMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5jcHAKQEAgLTI4LDE0ICsyOCwxNCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1jYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cykgeworY2FtZXJhX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cykgewogICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzOwogCiAgICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok9LOiByZXR1cm4gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOwotICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6RVJST1I6IHJldHVybiBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpPSzogcmV0dXJuIENBTUVSQV9CVUZGRVJfU1RBVFVTX09LOworICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6RVJST1I6IHJldHVybiBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICB9Ci0gICAgcmV0dXJuIENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICByZXR1cm4gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7CiB9CiAKIHZvaWQgQnVmZmVyUmVjb3Jkczo6dGFrZUluZmxpZ2h0QnVmZmVyTWFwKEJ1ZmZlclJlY29yZHMmIG90aGVyKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0J1ZmZlclV0aWxzLmgKaW5kZXggNDUyYTkwOC4uMWUxY2Q2MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9CdWZmZXJVdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQnVmZmVyVXRpbHMuaApAQCAtMjUsOSArMjUsNiBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlLmg+CiAKLS8vIFRPRE86IHJlbW92ZSBsZWdhY3kgY2FtZXJhMy5oIHJlZmVyZW5jZXMKLSNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEzLmgiCi0KICNpbmNsdWRlIDxkZXZpY2UzL0NhbWVyYTNPdXRwdXRJbnRlcmZhY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMTU4LDcgKzE1NSw3IEBACiAKICAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgQlVGRkVSX0lEX05PX0JVRkZFUiA9IDA7CiAKLSAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKAorICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cygKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKaW5kZXggZDZiZjgzZS4uYTU1NjIwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAKQEAgLTQwLDE2ICs0MCwxNyBAQAogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpbnQgc3RyZWFtSWQgPSBzdHJlYW1JbmZvLnN0cmVhbUlkOwotICAgIGludCBzdHJlYW1TZXRJZCA9IHN0cmVhbUluZm8uc3RyZWFtU2V0SWQ7CisgICAgU3RyZWFtU2V0S2V5IHN0cmVhbVNldEtleSA9IHtzdHJlYW1JbmZvLnN0cmVhbVNldElkLCBzdHJlYW1JbmZvLmlzTXVsdGlSZXN9OwogCi0gICAgaWYgKHN0cmVhbUlkID09IENBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQgfHwgc3RyZWFtU2V0SWQgPT0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpIHsKKyAgICBpZiAoc3RyZWFtSWQgPT0gQ0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRCB8fAorICAgICAgICAgICAgc3RyZWFtU2V0S2V5LmlkID09IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIGlkICglZCkgb3Igc3RyZWFtIHNldCBpZCAoJWQpIGlzIGludmFsaWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRLZXkuaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoc3RyZWFtSW5mby50b3RhbEJ1ZmZlckNvdW50ID4ga01heEJ1ZmZlckNvdW50IHx8IHN0cmVhbUluZm8udG90YWxCdWZmZXJDb3VudCA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtIGlkICglZCkgd2l0aCBzdHJlYW0gc2V0IGlkICglZCkgdG90YWwgYnVmZmVyIGNvdW50ICV6dSBpcyBpbnZhbGlkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgc3RyZWFtSW5mby50b3RhbEJ1ZmZlckNvdW50KTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRLZXkuaWQsIHN0cmVhbUluZm8udG90YWxCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghc3RyZWFtSW5mby5pc0NvbmZpZ3VyZWQpIHsKQEAgLTc1LDcgKzc2LDggQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1TZXRNYXAuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3NpemVfdCBzdHJlYW1JZHggPSBtU3RyZWFtU2V0TWFwW2ldLnN0cmVhbUluZm9NYXAuaW5kZXhPZktleShzdHJlYW1JZCk7CiAgICAgICAgIGlmIChzdHJlYW1JZHggIT0gTkFNRV9OT1RfRk9VTkQgJiYKLSAgICAgICAgICAgIG1TdHJlYW1TZXRNYXBbaV0uc3RyZWFtSW5mb01hcFtzdHJlYW1JZHhdLnN0cmVhbVNldElkICE9IHN0cmVhbUluZm8uc3RyZWFtU2V0SWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1TZXRNYXBbaV0uc3RyZWFtSW5mb01hcFtzdHJlYW1JZHhdLnN0cmVhbVNldElkICE9IHN0cmVhbUluZm8uc3RyZWFtU2V0SWQgJiYKKyAgICAgICAgICAgIG1TdHJlYW1TZXRNYXBbaV0uc3RyZWFtSW5mb01hcFtzdHJlYW1JZHhdLmlzTXVsdGlSZXMgIT0gc3RyZWFtSW5mby5pc011bHRpUmVzKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEl0IGlzIGlsbGVnYWwgdG8gcmVnaXN0ZXIgdGhlIHNhbWUgc3RyZWFtIGlkIHdpdGggZGlmZmVyZW50IHN0cmVhbSBzZXQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTgzLDIwICs4NSwyMCBAQAogICAgIH0KICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzdHJlYW0gc2V0IHJlZ2lzdGVyZWQ7IGlmIG5vdCwgY3JlYXRlIG9uZTsgb3RoZXJ3aXNlLCBhZGQgdGhpcwogICAgIC8vIHN0cmVhbSBpbmZvIHRvIHRoZSBleGlzdGluZyBzdHJlYW0gc2V0IGVudHJ5LgotICAgIHNzaXplX3Qgc2V0SWR4ID0gbVN0cmVhbVNldE1hcC5pbmRleE9mS2V5KHN0cmVhbVNldElkKTsKKyAgICBzc2l6ZV90IHNldElkeCA9IG1TdHJlYW1TZXRNYXAuaW5kZXhPZktleShzdHJlYW1TZXRLZXkpOwogICAgIGlmIChzZXRJZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW0gc2V0ICVkIGlzIG5vdCByZWdpc3RlcmVkIHRvIHN0cmVhbSBzZXQgbWFwIHlldCwgY3JlYXRlIGl0LiIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1TZXRJZCk7CisgICAgICAgIEFMT0dWKCIlczogc3RyZWFtIHNldCAlZCglZCkgaXMgbm90IHJlZ2lzdGVyZWQgdG8gc3RyZWFtIHNldCBtYXAgeWV0LCBjcmVhdGUgaXQuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbVNldEtleS5pZCwgc3RyZWFtU2V0S2V5LmlzTXVsdGlSZXMpOwogICAgICAgICAvLyBDcmVhdGUgc3RyZWFtIGluZm8gbWFwLCB0aGVuIGFkZCB0byBtU3RyZWFtc2V0TWFwLgogICAgICAgICBTdHJlYW1TZXQgbmV3U3RyZWFtU2V0OwotICAgICAgICBzZXRJZHggPSBtU3RyZWFtU2V0TWFwLmFkZChzdHJlYW1TZXRJZCwgbmV3U3RyZWFtU2V0KTsKKyAgICAgICAgc2V0SWR4ID0gbVN0cmVhbVNldE1hcC5hZGQoc3RyZWFtU2V0S2V5LCBuZXdTdHJlYW1TZXQpOwogICAgIH0KICAgICAvLyBVcGRhdGUgc3RyZWFtIHNldCBtYXAgYW5kIHdhdGVyIG1hcmsuCiAgICAgU3RyZWFtU2V0JiBjdXJyZW50U3RyZWFtU2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVBdChzZXRJZHgpOwogICAgIHNzaXplX3Qgc3RyZWFtSWR4ID0gY3VycmVudFN0cmVhbVNldC5zdHJlYW1JbmZvTWFwLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwogICAgIGlmIChzdHJlYW1JZHggIT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQUxPR1coIiVzOiBzdHJlYW0gJWQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHN0cmVhbSBzZXQgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgQUxPR1coIiVzOiBzdHJlYW0gJWQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIHN0cmVhbSBzZXQgJWQoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRLZXkuaWQsIHN0cmVhbVNldEtleS5pc011bHRpUmVzKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KICAgICBjdXJyZW50U3RyZWFtU2V0LnN0cmVhbUluZm9NYXAuYWRkKHN0cmVhbUlkLCBzdHJlYW1JbmZvKTsKQEAgLTExMywyMSArMTE1LDIyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlclN0cmVhbShpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCkgeworc3RhdHVzX3QgQ2FtZXJhM0J1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNNdWx0aVJlcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgQUxPR1YoIiVzOiB1bnJlZ2lzdGVyIHN0cmVhbSAlZCB3aXRoIHN0cmVhbSBzZXQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBzdHJlYW1JZCwgc3RyZWFtU2V0SWQpOworICAgIEFMT0dWKCIlczogdW5yZWdpc3RlciBzdHJlYW0gJWQgd2l0aCBzdHJlYW0gc2V0ICVkKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcyk7CiAKLSAgICBpZiAoIWNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKHN0cmVhbUlkLCBzdHJlYW1TZXRJZCkpewotICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCB3aXRoIHNldCBpZCAlZCB3YXNuJ3QgcHJvcGVybHkgcmVnaXN0ZXJlZCB0byB0aGlzIGJ1ZmZlciBtYW5hZ2VyISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZWFtU2V0SWQpOworICAgIFN0cmVhbVNldEtleSBzdHJlYW1TZXRLZXkgPSB7c3RyZWFtU2V0SWQsIGlzTXVsdGlSZXN9OworICAgIGlmICghY2hlY2tJZlN0cmVhbVJlZ2lzdGVyZWRMb2NrZWQoc3RyZWFtSWQsIHN0cmVhbVNldEtleSkpeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCB3aXRoIHNldCAlZCglZCkgd2Fzbid0IHByb3Blcmx5IHJlZ2lzdGVyZWQgdG8gdGhpcyIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBtYW5hZ2VyISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkLCBpc011bHRpUmVzKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBEZS1saXN0IGFsbCB0aGUgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJlYW0gZmlyc3QuCi0gICAgU3RyZWFtU2V0JiBjdXJyZW50U2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVGb3Ioc3RyZWFtU2V0SWQpOworICAgIFN0cmVhbVNldCYgY3VycmVudFNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldEtleSk7CiAgICAgQnVmZmVyQ291bnRNYXAmIGhhbmRPdXRCdWZmZXJDb3VudHMgPSBjdXJyZW50U2V0LmhhbmRvdXRCdWZmZXJDb3VudE1hcDsKICAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBjdXJyZW50U2V0LmF0dGFjaGVkQnVmZmVyQ291bnRNYXA7CiAgICAgSW5mb01hcCYgaW5mb01hcCA9IGN1cnJlbnRTZXQuc3RyZWFtSW5mb01hcDsKQEAgLTE1MCwyNiArMTUzLDI4IEBACiAKICAgICAvLyBSZW1vdmUgdGhpcyBzdHJlYW0gc2V0IGlmIGFsbCBpdHMgc3RyZWFtcyBoYXZlIGJlZW4gcmVtb3ZlZC4KICAgICBpZiAoaGFuZE91dEJ1ZmZlckNvdW50cy5zaXplKCkgPT0gMCAmJiBpbmZvTWFwLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIG1TdHJlYW1TZXRNYXAucmVtb3ZlSXRlbShzdHJlYW1TZXRJZCk7CisgICAgICAgIG1TdHJlYW1TZXRNYXAucmVtb3ZlSXRlbShzdHJlYW1TZXRLZXkpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6bm90aWZ5QnVmZmVyUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCkgewordm9pZCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6bm90aWZ5QnVmZmVyUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc011bHRpUmVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgIFN0cmVhbVNldCAmc3RyZWFtU2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVGb3Ioc3RyZWFtU2V0SWQpOworICAgIFN0cmVhbVNldEtleSBzdHJlYW1TZXRLZXkgPSB7c3RyZWFtU2V0SWQsIGlzTXVsdGlSZXN9OworICAgIFN0cmVhbVNldCAmc3RyZWFtU2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVGb3Ioc3RyZWFtU2V0S2V5KTsKICAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPQogICAgICAgICAgICAgc3RyZWFtU2V0LmF0dGFjaGVkQnVmZmVyQ291bnRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKICAgICBhdHRhY2hlZEJ1ZmZlckNvdW50LS07CiB9CiAKIHN0YXR1c190IENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpjaGVja0FuZEZyZWVCdWZmZXJPbk90aGVyU3RyZWFtc0xvY2tlZCgKLSAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQpIHsKKyAgICAgICAgaW50IHN0cmVhbUlkLCBTdHJlYW1TZXRLZXkgc3RyZWFtU2V0S2V5KSB7CiAgICAgU3RyZWFtSWQgZmlyc3RPdGhlclN0cmVhbUlkID0gQ0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKLSAgICBTdHJlYW1TZXQgJnN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldElkKTsKKyAgICBTdHJlYW1TZXQgJnN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldEtleSk7CiAgICAgaWYgKHN0cmVhbVNldC5zdHJlYW1JbmZvTWFwLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIEFMT0dWKCJTdHJlYW1TZXQgJWQgaGFzIG5vIG90aGVyIHN0cmVhbSBhdmFpbGFibGUgdG8gZnJlZSIsIHN0cmVhbVNldElkKTsKKyAgICAgICAgQUxPR1YoIlN0cmVhbVNldCAlZCglZCkgaGFzIG5vIG90aGVyIHN0cmVhbSBhdmFpbGFibGUgdG8gZnJlZSIsCisgICAgICAgICAgICAgICAgc3RyZWFtU2V0S2V5LmlkLCBzdHJlYW1TZXRLZXkuaXNNdWx0aVJlcyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTE5MCw3ICsxOTUsOCBAQAogICAgICAgICBmaXJzdE90aGVyU3RyZWFtSWQgPSBDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEOwogICAgIH0KICAgICBpZiAoZmlyc3RPdGhlclN0cmVhbUlkID09IENBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQgfHwgIWZyZWVCdWZmZXJJc0F0dGFjaGVkKSB7Ci0gICAgICAgIEFMT0dWKCJTdHJlYW1TZXQgJWQgaGFzIG5vIGJ1ZmZlciBhdmFpbGFibGUgdG8gZnJlZSIsIHN0cmVhbVNldElkKTsKKyAgICAgICAgQUxPR1YoIlN0cmVhbVNldCAlZCglZCkgaGFzIG5vIGJ1ZmZlciBhdmFpbGFibGUgdG8gZnJlZSIsCisgICAgICAgICAgICAgICAgc3RyZWFtU2V0S2V5LmlkLCBzdHJlYW1TZXRLZXkuaXNNdWx0aVJlcyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTIzNywyMCArMjQzLDIxIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpnZXRCdWZmZXJGb3JTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLCBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKKyAgICAgICAgYm9vbCBpc011bHRpUmVzLCBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCwgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBBTE9HVigiJXM6IGdldCBidWZmZXIgZm9yIHN0cmVhbSAlZCB3aXRoIHN0cmVhbSBzZXQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICBzdHJlYW1JZCwgc3RyZWFtU2V0SWQpOworICAgIEFMT0dWKCIlczogZ2V0IGJ1ZmZlciBmb3Igc3RyZWFtICVkIHdpdGggc3RyZWFtIHNldCAlZCglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBzdHJlYW1JZCwgc3RyZWFtU2V0SWQsIGlzTXVsdGlSZXMpOwogCi0gICAgaWYgKCFjaGVja0lmU3RyZWFtUmVnaXN0ZXJlZExvY2tlZChzdHJlYW1JZCwgc3RyZWFtU2V0SWQpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggc3RyZWFtIHNldCAlZCB5ZXQhISEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICBTdHJlYW1TZXRLZXkgc3RyZWFtU2V0S2V5ID0ge3N0cmVhbVNldElkLCBpc011bHRpUmVzfTsKKyAgICBpZiAoIWNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKHN0cmVhbUlkLCBzdHJlYW1TZXRLZXkpKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggc3RyZWFtIHNldCAlZCglZCkgeWV0ISEhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgU3RyZWFtU2V0ICZzdHJlYW1TZXQgPSBtU3RyZWFtU2V0TWFwLmVkaXRWYWx1ZUZvcihzdHJlYW1TZXRJZCk7CisgICAgU3RyZWFtU2V0ICZzdHJlYW1TZXQgPSBtU3RyZWFtU2V0TWFwLmVkaXRWYWx1ZUZvcihzdHJlYW1TZXRLZXkpOwogICAgIEJ1ZmZlckNvdW50TWFwJiBoYW5kT3V0QnVmZmVyQ291bnRzID0gc3RyZWFtU2V0LmhhbmRvdXRCdWZmZXJDb3VudE1hcDsKICAgICBzaXplX3QmIGJ1ZmZlckNvdW50ID0gaGFuZE91dEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwogICAgIEJ1ZmZlckNvdW50TWFwJiBhdHRhY2hlZEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5hdHRhY2hlZEJ1ZmZlckNvdW50TWFwOwpAQCAtMjcyLDcgKzI3OSw4IEBACiAgICAgICAgIGJ1ZmZlckNvdW50Kys7CiAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKICAgICB9Ci0gICAgQUxPR1YoIlN0cmVhbSAlZCBzZXQgJWQ6IEdldCBidWZmZXIgZm9yIHN0cmVhbTogQWxsb2NhdGUgbmV3Iiwgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICBBTE9HVigiU3RyZWFtICVkIHNldCAlZCglZCk6IEdldCBidWZmZXIgZm9yIHN0cmVhbTogQWxsb2NhdGUgbmV3IiwKKyAgICAgICAgICAgIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcyk7CiAKICAgICBpZiAobUdyYWxsb2NWZXJzaW9uIDwgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDEsMCkpIHsKICAgICAgICAgY29uc3QgU3RyZWFtSW5mbyYgaW5mbyA9IHN0cmVhbVNldC5zdHJlYW1JbmZvTWFwLnZhbHVlRm9yKHN0cmVhbUlkKTsKQEAgLTMxMywxMyArMzIxLDEzIEBACiAgICAgICAgIC8vIGluIHJldHVybkJ1ZmZlckZvclN0cmVhbSgpIGlmIHdlIHdhbnQgdG8gZnJlZSBidWZmZXIgbW9yZSBxdWlja2x5LgogICAgICAgICAvLyBUT0RPOiBwcm9iYWJseSBzaG91bGQgZmluZCBvdXQgYWxsIHRoZSBpbmFjdGl2ZSBzdHJlYW0gSURzLCBhbmQgZnJlZSB0aGUgZmlyc3RseSBmb3VuZAogICAgICAgICAvLyBidWZmZXJzIGZvciB0aGVtLgotICAgICAgICByZXMgPSBjaGVja0FuZEZyZWVCdWZmZXJPbk90aGVyU3RyZWFtc0xvY2tlZChzdHJlYW1JZCwgc3RyZWFtU2V0SWQpOworICAgICAgICByZXMgPSBjaGVja0FuZEZyZWVCdWZmZXJPbk90aGVyU3RyZWFtc0xvY2tlZChzdHJlYW1JZCwgc3RyZWFtU2V0S2V5KTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgICAgICAvLyBTaW5jZSB3ZSBqdXN0IGFsbG9jYXRlZCBvbmUgbmV3IGJ1ZmZlciBhYm92ZSwgdHJ5IGZyZWUgb25lIG1vcmUgYnVmZmVyIGZyb20gb3RoZXIgc3RyZWFtcwogICAgICAgICAvLyB0byBwcmV2ZW50IHRvdGFsIGJ1ZmZlciBjb3VudCBmcm9tIGdyb3dpbmcKLSAgICAgICAgcmVzID0gY2hlY2tBbmRGcmVlQnVmZmVyT25PdGhlclN0cmVhbXNMb2NrZWQoc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgcmVzID0gY2hlY2tBbmRGcmVlQnVmZmVyT25PdGhlclN0cmVhbXNMb2NrZWQoc3RyZWFtSWQsIHN0cmVhbVNldEtleSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KQEAgLTMzMiw3ICszNDAsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6b25CdWZmZXJSZWxlYXNlZCgKLSAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wqIHNob3VsZEZyZWVCdWZmZXIpIHsKKyAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNNdWx0aVJlcywgYm9vbCogc2hvdWxkRnJlZUJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoc2hvdWxkRnJlZUJ1ZmZlciA9PSBudWxscHRyKSB7CkBAIC0zNDEsMjIgKzM0OSwyNCBAQAogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBBTE9HVigiU3RyZWFtICVkIHNldCAlZDogQnVmZmVyIHJlbGVhc2VkIiwgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICBBTE9HVigiU3RyZWFtICVkIHNldCAlZCglZCk6IEJ1ZmZlciByZWxlYXNlZCIsIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcyk7CiAgICAgKnNob3VsZEZyZWVCdWZmZXIgPSBmYWxzZTsKIAotICAgIGlmICghY2hlY2tJZlN0cmVhbVJlZ2lzdGVyZWRMb2NrZWQoc3RyZWFtSWQsIHN0cmVhbVNldElkKSl7CisgICAgU3RyZWFtU2V0S2V5IHN0cmVhbVNldEtleSA9IHtzdHJlYW1TZXRJZCwgaXNNdWx0aVJlc307CisgICAgaWYgKCFjaGVja0lmU3RyZWFtUmVnaXN0ZXJlZExvY2tlZChzdHJlYW1JZCwgc3RyZWFtU2V0S2V5KSl7CiAgICAgICAgIEFMT0dWKCIlczogc2lnbmFsaW5nIGJ1ZmZlciByZWxlYXNlIGZvciBhbiBhbHJlYWR5IHVucmVnaXN0ZXJlZCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICIoc3RyZWFtICVkIHdpdGggc2V0IGlkICVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICAiKHN0cmVhbSAlZCB3aXRoIHNldCBpZCAlZCglZCkpIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlcyk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKICAgICBpZiAobUdyYWxsb2NWZXJzaW9uIDwgSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDEsMCkpIHsKLSAgICAgICAgU3RyZWFtU2V0JiBzdHJlYW1TZXQgPSBtU3RyZWFtU2V0TWFwLmVkaXRWYWx1ZUZvcihzdHJlYW1TZXRJZCk7CisgICAgICAgIFN0cmVhbVNldCYgc3RyZWFtU2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVGb3Ioc3RyZWFtU2V0S2V5KTsKICAgICAgICAgQnVmZmVyQ291bnRNYXAmIGhhbmRPdXRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuaGFuZG91dEJ1ZmZlckNvdW50TWFwOwogICAgICAgICBzaXplX3QmIGJ1ZmZlckNvdW50ID0gaGFuZE91dEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwogICAgICAgICBidWZmZXJDb3VudC0tOwotICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBzZXQgJWQ6IEJ1ZmZlciBjb3VudCBub3cgJXp1IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICAgICAgYnVmZmVyQ291bnQpOworICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBzZXQgJWQoJWQpOiBCdWZmZXIgY291bnQgbm93ICV6dSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsCisgICAgICAgICAgICAgICAgc3RyZWFtU2V0SWQsIGlzTXVsdGlSZXMsIGJ1ZmZlckNvdW50KTsKIAogICAgICAgICBzaXplX3QgdG90YWxBbGxvY2F0ZWRCdWZmZXJDb3VudCA9IDA7CiAgICAgICAgIHNpemVfdCB0b3RhbEhhbmRPdXRCdWZmZXJDb3VudCA9IDA7CkBAIC0zNzEsOCArMzgxLDkgQEAKICAgICAgICAgICAgIC8vIEJ1ZmZlck1hbmFnZXIgZ290IG1vcmUgdGhhbiBlbm91Z2ggYnVmZmVycywgc28gZGVjcmVhc2Ugd2F0ZXJtYXJrCiAgICAgICAgICAgICAvLyB0byB0cmlnZ2VyIG1vcmUgYnVmZmVycyBmcmVlIG9wZXJhdGlvbi4KICAgICAgICAgICAgIHN0cmVhbVNldC5hbGxvY2F0ZWRCdWZmZXJXYXRlck1hcmsgPSBuZXdXYXRlck1hcms7Ci0gICAgICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBzZXQgJWQ6IHdhdGVybWFyay0tOyBub3cgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZWFtU2V0SWQsIHN0cmVhbVNldC5hbGxvY2F0ZWRCdWZmZXJXYXRlck1hcmspOworICAgICAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgc2V0ICVkKCVkKTogd2F0ZXJtYXJrLS07IG5vdyAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2V0LmFsbG9jYXRlZEJ1ZmZlcldhdGVyTWFyayk7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgYXR0YWNoZWRCdWZmZXJDb3VudCA9IHN0cmVhbVNldC5hdHRhY2hlZEJ1ZmZlckNvdW50TWFwLnZhbHVlRm9yKHN0cmVhbUlkKTsKQEAgLTM5NSwyMCArNDA2LDIyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6b25CdWZmZXJzUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwgc2l6ZV90IGNvdW50KSB7CitzdGF0dXNfdCBDYW1lcmEzQnVmZmVyTWFuYWdlcjo6b25CdWZmZXJzUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwKKyAgICAgICAgYm9vbCBpc011bHRpUmVzLCBzaXplX3QgY291bnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIEFMT0dWKCJTdHJlYW0gJWQgc2V0ICVkOiBCdWZmZXIgcmVtb3ZlZCIsIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCk7CisgICAgQUxPR1YoIlN0cmVhbSAlZCBzZXQgJWQoJWQpOiBCdWZmZXIgcmVtb3ZlZCIsIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcyk7CiAKLSAgICBpZiAoIWNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKHN0cmVhbUlkLCBzdHJlYW1TZXRJZCkpeworICAgIFN0cmVhbVNldEtleSBzdHJlYW1TZXRLZXkgPSB7c3RyZWFtU2V0SWQsIGlzTXVsdGlSZXN9OworICAgIGlmICghY2hlY2tJZlN0cmVhbVJlZ2lzdGVyZWRMb2NrZWQoc3RyZWFtSWQsIHN0cmVhbVNldEtleSkpewogICAgICAgICBBTE9HVigiJXM6IHNpZ25hbGluZyBidWZmZXIgcmVtb3ZhbCBmb3IgYW4gYWxyZWFkeSB1bnJlZ2lzdGVyZWQgc3RyZWFtICIKLSAgICAgICAgICAgICAgICAiKHN0cmVhbSAlZCB3aXRoIHNldCBpZCAlZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgIihzdHJlYW0gJWQgd2l0aCBzZXQgaWQgJWQoJWQpKSIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkLCBpc011bHRpUmVzKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGlmIChtR3JhbGxvY1ZlcnNpb24gPCBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04oMSwwKSkgewotICAgICAgICBTdHJlYW1TZXQmIHN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldElkKTsKKyAgICAgICAgU3RyZWFtU2V0JiBzdHJlYW1TZXQgPSBtU3RyZWFtU2V0TWFwLmVkaXRWYWx1ZUZvcihzdHJlYW1TZXRLZXkpOwogICAgICAgICBCdWZmZXJDb3VudE1hcCYgaGFuZE91dEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5oYW5kb3V0QnVmZmVyQ291bnRNYXA7CiAgICAgICAgIHNpemVfdCYgdG90YWxIYW5kb3V0Q291bnQgPSBoYW5kT3V0QnVmZmVyQ291bnRzLmVkaXRWYWx1ZUZvcihzdHJlYW1JZCk7CiAgICAgICAgIEJ1ZmZlckNvdW50TWFwJiBhdHRhY2hlZEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5hdHRhY2hlZEJ1ZmZlckNvdW50TWFwOwpAQCAtNDI3LDggKzQ0MCw5IEBACiAKICAgICAgICAgdG90YWxIYW5kb3V0Q291bnQgLT0gY291bnQ7CiAgICAgICAgIHRvdGFsQXR0YWNoZWRDb3VudCAtPSBjb3VudDsKLSAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgc2V0ICVkOiBCdWZmZXIgY291bnQgbm93ICV6dSwgYXR0YWNoZWQgYnVmZmVyIGNvdW50IG5vdyAlenUiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVhbVNldElkLCB0b3RhbEhhbmRvdXRDb3VudCwgdG90YWxBdHRhY2hlZENvdW50KTsKKyAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgc2V0ICVkKCVkKTogQnVmZmVyIGNvdW50IG5vdyAlenUsIGF0dGFjaGVkIGJ1ZmZlciBjb3VudCBub3cgJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgaXNNdWx0aVJlcywgdG90YWxIYW5kb3V0Q291bnQsCisgICAgICAgICAgICAgICAgdG90YWxBdHRhY2hlZENvdW50KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgZ3JhbGxvYyBWMSBzdXBwb3J0CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC00NDQsNyArNDU4LDggQEAKICAgICBTdHJpbmc4IGxpbmVzOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVG90YWwgc3RyZWFtIHNldHM6ICV6dVxuIiwgbVN0cmVhbVNldE1hcC5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbVNldE1hcC5zaXplKCk7IGkrKykgewotICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgICAgU3RyZWFtIHNldCAlZCBoYXMgYmVsb3cgc3RyZWFtczpcbiIsIG1TdHJlYW1TZXRNYXAua2V5QXQoaSkpOworICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgICAgU3RyZWFtIHNldCAlZCglZCkgaGFzIGJlbG93IHN0cmVhbXM6XG4iLAorICAgICAgICAgICAgICAgIG1TdHJlYW1TZXRNYXAua2V5QXQoaSkuaWQsIG1TdHJlYW1TZXRNYXAua2V5QXQoaSkuaXNNdWx0aVJlcyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVN0cmVhbVNldE1hcFtpXS5zdHJlYW1JbmZvTWFwLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgICAgICBTdHJlYW0gJWRcbiIsIG1TdHJlYW1TZXRNYXBbaV0uc3RyZWFtSW5mb01hcFtqXS5zdHJlYW1JZCk7CiAgICAgICAgIH0KQEAgLTQ3MCwxMSArNDg1LDEyIEBACiAgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOwogfQogCi1ib29sIENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpjaGVja0lmU3RyZWFtUmVnaXN0ZXJlZExvY2tlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCkgY29uc3QgewotICAgIHNzaXplX3Qgc2V0SWR4ID0gbVN0cmVhbVNldE1hcC5pbmRleE9mS2V5KHN0cmVhbVNldElkKTsKK2Jvb2wgQ2FtZXJhM0J1ZmZlck1hbmFnZXI6OmNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKGludCBzdHJlYW1JZCwKKyAgICAgICAgU3RyZWFtU2V0S2V5IHN0cmVhbVNldEtleSkgY29uc3QgeworICAgIHNzaXplX3Qgc2V0SWR4ID0gbVN0cmVhbVNldE1hcC5pbmRleE9mS2V5KHN0cmVhbVNldEtleSk7CiAgICAgaWYgKHNldElkeCA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBBTE9HVigiJXM6IHN0cmVhbSBzZXQgJWQgaXMgbm90IHJlZ2lzdGVyZWQgdG8gc3RyZWFtIHNldCBtYXAgeWV0ISIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1TZXRJZCk7CisgICAgICAgIEFMT0dWKCIlczogc3RyZWFtIHNldCAlZCglZCkgaXMgbm90IHJlZ2lzdGVyZWQgdG8gc3RyZWFtIHNldCBtYXAgeWV0ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1TZXRLZXkuaWQsIHN0cmVhbVNldEtleS5pc011bHRpUmVzKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNDg2LDkgKzUwMiwxMCBAQAogCiAgICAgc2l6ZV90IGJ1ZmZlcldhdGVyTWFyayA9IG1TdHJlYW1TZXRNYXBbc2V0SWR4XS5tYXhBbGxvd2VkQnVmZmVyQ291bnQ7CiAgICAgaWYgKGJ1ZmZlcldhdGVyTWFyayA9PSAwIHx8IGJ1ZmZlcldhdGVyTWFyayA+IGtNYXhCdWZmZXJDb3VudCkgewotICAgICAgICBBTE9HVygiJXM6IHN0cmVhbSAlZCB3aXRoIHN0cmVhbSBzZXQgJWQgaXMgbm90IHJlZ2lzdGVyZWQgY29ycmVjdGx5IHRvIHN0cmVhbSBzZXQgbWFwLCIKKyAgICAgICAgQUxPR1coIiVzOiBzdHJlYW0gJWQgd2l0aCBzdHJlYW0gc2V0ICVkKCVkKSBpcyBub3QgcmVnaXN0ZXJlZCBjb3JyZWN0bHkgdG8gc3RyZWFtIHNldCBtYXAsIgogICAgICAgICAgICAgICAgICIgYXMgdGhlIHdhdGVyIG1hcmsgKCV6dSkgaXMgd3JvbmchIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRJZCwgYnVmZmVyV2F0ZXJNYXJrKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlYW1TZXRLZXkuaWQsIHN0cmVhbVNldEtleS5pc011bHRpUmVzLAorICAgICAgICAgICAgICAgIGJ1ZmZlcldhdGVyTWFyayk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaAppbmRleCBmMGRlMWMxLi42NGFhYTIzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaApAQCAtOTksNyArOTksNyBAQAogICAgICAqICAgICAgICAgICAgIGNvbWJpbmF0aW9uIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3YXMgcmVnaXN0ZXJlZCwgb3IgdGhpcyBzdHJlYW0gd2Fzbid0IHJlZ2lzdGVyZWQKICAgICAgKiAgICAgICAgICAgICB0byB0aGlzIGJ1ZmZlciBtYW5hZ2VyIGJlZm9yZS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkKTsKKyAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBib29sIGlzTXVsdGlSZXMpOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgb2J0YWlucyBhIGJ1ZmZlciBmb3IgYSBzdHJlYW0gZnJvbSB0aGlzIGJ1ZmZlciBtYW5hZ2VyLgpAQCAtMTI3LDggKzEyNyw4IEBACiAgICAgICogIE5PX01FTU9SWTogVW5hYmxlIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIHN0cmVhbSBhdCB0aGlzIHRpbWUuCiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKAotICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLAotICAgICAgICAgICAgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNNdWx0aVJlcywgc3A8R3JhcGhpY0J1ZmZlcj4qIGdiLAorICAgICAgICAgICAgaW50KiBmZW5jZUZkLCBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIgPSBmYWxzZSk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbWFuYWdlciB0aGF0IGEgYnVmZmVyIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHRoZSBjb25zdW1lci4KQEAgLTE1Myw3ICsxNTMsOCBAQAogICAgICAqICAgICAgICAgICAgIGNvbWJpbmF0aW9uIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3YXMgcmVnaXN0ZXJlZCwgb3IgdGhpcyBzdHJlYW0gd2Fzbid0IHJlZ2lzdGVyZWQKICAgICAgKiAgICAgICAgICAgICB0byB0aGlzIGJ1ZmZlciBtYW5hZ2VyIGJlZm9yZSwgb3Igc2hvdWxkRnJlZUJ1ZmZlciBpcyBudWxsLwogICAgICAqLwotICAgIHN0YXR1c190IG9uQnVmZmVyUmVsZWFzZWQoaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIC8qb3V0Ki9ib29sKiBzaG91bGRGcmVlQnVmZmVyKTsKKyAgICBzdGF0dXNfdCBvbkJ1ZmZlclJlbGVhc2VkKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBib29sIGlzTXVsdGlSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovYm9vbCogc2hvdWxkRnJlZUJ1ZmZlcik7CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbWFuYWdlciB0aGF0IGNlcnRhaW4gYnVmZmVycyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlCkBAIC0xNzEsMTMgKzE3MiwxMyBAQAogICAgICAqICAgICAgICAgICAgIHRvIHRoaXMgYnVmZmVyIG1hbmFnZXIgYmVmb3JlLCBvciB0aGUgcmVtb3ZlZCBidWZmZXIgY291bnQgaXMgbGFyZ2VyIHRoYW4KICAgICAgKiAgICAgICAgICAgICBjdXJyZW50IHRvdGFsIGhhbmRvdXRDb3VudCBvciBhdHRhY2hlZENvdW50LgogICAgICAqLwotICAgIHN0YXR1c190IG9uQnVmZmVyc1JlbW92ZWQoaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNpemVfdCBjb3VudCk7CisgICAgc3RhdHVzX3Qgb25CdWZmZXJzUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc011bHRpUmVzLCBzaXplX3QgY291bnQpOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXJzIHRoZSBtYW5hZ2VyIHRoYXQgYSBidWZmZXIgaXMgZnJlZWQgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlLCB1c3VhbGx5CiAgICAgICogYmVjYXVzZSBvbkJ1ZmZlclJlbGVhc2VkIHNpZ25hbHMgdGhlIGNhbGxlciB0byBmcmVlIGEgYnVmZmVyIHZpYSB0aGUgc2hvdWxkRnJlZUJ1ZmZlciBmbGFnLgogICAgICAqLwotICAgIHZvaWQgbm90aWZ5QnVmZmVyUmVtb3ZlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCk7CisgICAgdm9pZCBub3RpZnlCdWZmZXJSZW1vdmVkKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBib29sIGlzTXVsdGlSZXMpOwogCiAgICAgLyoqCiAgICAgICogRHVtcCB0aGUgYnVmZmVyIG1hbmFnZXIgc3RhdGlzdGljcy4KQEAgLTI5Miw4ICsyOTMsMjAgQEAKICAgICAvKioKICAgICAgKiBTdHJlYW0gc2V0IG1hcCBtYW5hZ2VkIGJ5IHRoaXMgYnVmZmVyIG1hbmFnZXIuCiAgICAgICovCi0gICAgdHlwZWRlZiBpbnQgU3RyZWFtU2V0SWQ7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyZWFtU2V0SWQsIFN0cmVhbVNldD4gbVN0cmVhbVNldE1hcDsKKyAgICBzdHJ1Y3QgU3RyZWFtU2V0S2V5IHsKKyAgICAgICAgLy8gVGhlIHN0cmVhbSBzZXQgSUQKKyAgICAgICAgaW50IGlkOworICAgICAgICAvLyBXaGV0aGVyIHRoaXMgc3RyZWFtIHNldCBpcyBmb3IgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQgc3RyZWFtcy4gSXQncworICAgICAgICAvLyB2YWxpZCBmb3IgMiBzdHJlYW0gc2V0cyB0byBoYXZlIHRoZSBzYW1lIHN0cmVhbSBzZXQgSUQgaWY6IG9uZSBpcyBmb3IKKyAgICAgICAgLy8gbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQgc3RyZWFtLCBhbmQgdGhlIG90aGVyIG9uZSBpcyBub3QuCisgICAgICAgIGJvb2wgaXNNdWx0aVJlczsKKworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyZWFtU2V0S2V5JiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIChpc011bHRpUmVzIDwgb3RoZXIuaXNNdWx0aVJlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKChpc011bHRpUmVzID09IG90aGVyLmlzTXVsdGlSZXMpICYmIChpZCA8IG90aGVyLmlkKSk7CisgICAgICAgIH0KKyAgICB9OworICAgIEtleWVkVmVjdG9yPFN0cmVhbVNldEtleSwgU3RyZWFtU2V0PiBtU3RyZWFtU2V0TWFwOwogICAgIEtleWVkVmVjdG9yPFN0cmVhbUlkLCB3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPj4gbVN0cmVhbU1hcDsKIAogICAgIC8vIFRPRE86IFRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIHF1ZXJ5IHRoZSBHcmFsbG9jIHZlcnNpb24gaW4gdGhpcyBjb2RlIHlldCwgd2UgaGF2ZSBkaWZmZXJlbnQKQEAgLTMwNCwxMyArMzE3LDEzIEBACiAgICAgICogQ2hlY2sgaWYgdGhpcyBzdHJlYW0gd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGFscmVhZHkuIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoCiAgICAgICogbUxvY2sgaGVsZC4KICAgICAgKi8KLSAgICBib29sIGNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkKSBjb25zdDsKKyAgICBib29sIGNoZWNrSWZTdHJlYW1SZWdpc3RlcmVkTG9ja2VkKGludCBzdHJlYW1JZCwgU3RyZWFtU2V0S2V5IHN0cmVhbVNldEtleSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBvdGhlciBzdHJlYW1zIGluIHRoZSBzdHJlYW0gc2V0IGhhcyBleHRyYSBidWZmZXIgYXZhaWxhYmxlIHRvIGJlIGZyZWVkLCBhbmQKICAgICAgKiBmcmVlIG9uZSBpZiBzby4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBjaGVja0FuZEZyZWVCdWZmZXJPbk90aGVyU3RyZWFtc0xvY2tlZChpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCk7CisgICAgc3RhdHVzX3QgY2hlY2tBbmRGcmVlQnVmZmVyT25PdGhlclN0cmVhbXNMb2NrZWQoaW50IHN0cmVhbUlkLCBTdHJlYW1TZXRLZXkgc3RyZWFtU2V0S2V5KTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDRhNTA5YWEuLmZkNjQ1YzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy43L0lDYW1lcmFJbmplY3Rpb25TZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKQEAgLTU2LDExICs1NywxMyBAQAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgiCi0jaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSAidXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oIgogI2luY2x1ZGUgInV0aWxzL1RyYWNlSEZSLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHR1cGxlPgpAQCAtNjgsMTAgKzcxLDExIEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6Om1ldGFkYXRhOjpWM182OjpDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUNhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCAmaWQpOgorQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZShjb25zdCBTdHJpbmc4ICZpZCwgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcyk6CiAgICAgICAgIG1JZChpZCksCiAgICAgICAgIG1PcGVyYXRpbmdNb2RlKE5PX01PREUpLAogICAgICAgICBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24oZmFsc2UpLApAQCAtODksNyArOTMsOCBAQAogICAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICAgIG1WZW5kb3JUYWdJZChDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQpLAogICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpLAotICAgICAgICBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MoZmFsc2UpCisgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyhmYWxzZSksCisgICAgICAgIG1PdmVycmlkZUZvclBlcmZDbGFzcyhvdmVycmlkZUZvclBlcmZDbGFzcykKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogQ3JlYXRlZCBkZXZpY2UgZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKQEAgLTEyOCw3ICsxMzMsNyBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtSWQuc3RyaW5nKCksICZtRGV2aWNlSW5mbyk7CisgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKG1JZC5zdHJpbmcoKSwgbU92ZXJyaWRlRm9yUGVyZkNsYXNzLCAmbURldmljZUluZm8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOwpAQCAtMTQwLDggKzE0NSw5IEBACiAgICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwogICAgIGlmIChpc0xvZ2ljYWwpIHsKICAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBvdmVycmlkZSBjaGFyYWN0ZXJpc3RpY3MgZm9yIHBoeXNpY2FsIGNhbWVyYXMKICAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZCwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLCAvKm92ZXJyaWRlRm9yUGVyZkNsYXNzKi9mYWxzZSwgJm1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiQ291bGQgbm90IHJldHJpZXZlIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJZC5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE2NSw2ICsxNzEsMTMgQEAKICAgICAgICAgICAgIG1ab29tUmF0aW9NYXBwZXJzW3BoeXNpY2FsSWRdID0gWm9vbVJhdGlvTWFwcGVyKAogICAgICAgICAgICAgICAgICAgICAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSwKICAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnROYXRpdmVab29tUmF0aW8sIHVzZVByZWNvcnJlY3RBcnJheSk7CisKKyAgICAgICAgICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoCisgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pKSB7CisgICAgICAgICAgICAgICAgbVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnNbcGh5c2ljYWxJZF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZWNvcnJlY3RBcnJheSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3MCw3ICsyODMsNyBAQAogICAgIH0KIAogICAgIC8qKiBSZWdpc3RlciBpbi1mbGlnaHQgbWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlciAqLwotICAgIG1JbkZsaWdodFN0YXR1c0lkID0gbVN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIG1JbkZsaWdodFN0YXR1c0lkID0gbVN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgiSW5mbGlnaHRSZXF1ZXN0cyIpOwogCiAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgICAgIHJlcyA9IG1SZXF1ZXN0QnVmZmVyU00uaW5pdGlhbGl6ZShtU3RhdHVzVHJhY2tlcik7CkBAIC0yOTMsOSArMzA2LDI1IEBACiAgICAgICAgIHNlc3Npb25QYXJhbUtleXMuaW5zZXJ0QXJyYXlBdChzZXNzaW9uS2V5c0VudHJ5LmRhdGEuaTMyLCAwLCBzZXNzaW9uS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhdmFpbGFibGVUZXN0UGF0dGVybk1vZGVzID0gbURldmljZUluZm8uZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlVGVzdFBhdHRlcm5Nb2Rlcy5jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChhdmFpbGFibGVUZXN0UGF0dGVybk1vZGVzLmRhdGEuaTMyW2ldID09CisgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfU09MSURfQ09MT1IpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0Q2FtZXJhTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBtU3VwcG9ydFRlc3RQYXR0ZXJuU29saWRDb2xvciA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVUZXN0UGF0dGVybk1vZGVzLmRhdGEuaTMyW2ldID09CisgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfQkxBQ0spIHsKKyAgICAgICAgICAgIG1TdXBwb3J0Q2FtZXJhTXV0ZSA9IHRydWU7CisgICAgICAgICAgICBtU3VwcG9ydFRlc3RQYXR0ZXJuU29saWRDb2xvciA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCiAgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCgKLSAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCBtVXNlSGFsQnVmTWFuYWdlcik7CisgICAgICAgICAgICB0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtU3VwcG9ydENhbWVyYU11dGUpOwogICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lcy1SZXFRdWV1ZSIsIG1JZC5zdHJpbmcoKSkuc3RyaW5nKCkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBxdWV1ZSB0aHJlYWQ6ICVzICglZCkiLApAQCAtMzA5LDkgKzMzOCwxMCBAQAogCiAgICAgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAgICAgbU5leHRTdHJlYW1JZCA9IDA7Ci0gICAgbUR1bW15U3RyZWFtSWQgPSBOT19TVFJFQU07CisgICAgbUZha2VTdHJlYW1JZCA9IE5PX1NUUkVBTTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CiAgICAgbVBhdXNlU3RhdGVOb3RpZnkgPSBmYWxzZTsKKyAgICBtSXNJbnB1dFN0cmVhbU11bHRpUmVzb2x1dGlvbiA9IGZhbHNlOwogCiAgICAgLy8gTWVhc3VyZSB0aGUgY2xvY2sgZG9tYWluIG9mZnNldCBiZXR3ZWVuIGNhbWVyYSBhbmQgdmlkZW8vaHdfY29tcG9zZXIKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGltZXN0YW1wU291cmNlID0KQEAgLTMyOSwxNyArMzU5LDYgQEAKICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQgPSAobU51bVBhcnRpYWxSZXN1bHRzID4gMSk7CiAgICAgfQogCi0gICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGNvbmZpZ3MgPQotICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY29uZmlncy5jb3VudDsgaSArPSA0KSB7Ci0gICAgICAgIGlmIChjb25maWdzLmRhdGEuaTMyW2ldID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgICAgIGNvbmZpZ3MuZGF0YS5pMzJbaSArIDNdID09Ci0gICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgewotICAgICAgICAgICAgbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXMuYWRkKFNpemUoY29uZmlncy5kYXRhLmkzMltpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3MuZGF0YS5pMzJbaSArIDJdKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBib29sIHVzZVByZWNvcnJlY3RBcnJheSA9IERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtRGV2aWNlSW5mbyk7CiAgICAgaWYgKHVzZVByZWNvcnJlY3RBcnJheSkgewogICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbbUlkLmNfc3RyKCldLnNldHVwU3RhdGljSW5mbyhtRGV2aWNlSW5mbyk7CkBAIC0zNTIsMTAgKzM3MSwxNyBAQAogICAgIG1ab29tUmF0aW9NYXBwZXJzW21JZC5jX3N0cigpXSA9IFpvb21SYXRpb01hcHBlcigmbURldmljZUluZm8sCiAgICAgICAgICAgICBtU3VwcG9ydE5hdGl2ZVpvb21SYXRpbywgdXNlUHJlY29ycmVjdEFycmF5KTsKIAorICAgIGlmIChTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IobURldmljZUluZm8pKSB7CisgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzW21JZC5jX3N0cigpXSA9CisgICAgICAgICAgICAgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKG1EZXZpY2VJbmZvLCB1c2VQcmVjb3JyZWN0QXJyYXkpOworICAgIH0KKwogICAgIGlmIChSb3RhdGVBbmRDcm9wTWFwcGVyOjppc05lZWRlZCgmbURldmljZUluZm8pKSB7CiAgICAgICAgIG1Sb3RhdGVBbmRDcm9wTWFwcGVycy5lbXBsYWNlKG1JZC5jX3N0cigpLCAmbURldmljZUluZm8pOwogICAgIH0KIAorICAgIG1JbmplY3Rpb25NZXRob2RzID0gbmV3IENhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKHRoaXMpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC00MjksNiArNDU1LDEwIEBACiAgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci0+am9pbigpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1JbmplY3Rpb25NZXRob2RzLT5pc0luamVjdGluZygpKSB7CisgICAgICAgICAgICBtSW5qZWN0aW9uTWV0aG9kcy0+c3RvcEluamVjdGlvbigpOworICAgICAgICB9CisKICAgICAgICAgSGFsSW50ZXJmYWNlKiBpbnRlcmZhY2U7CiAgICAgICAgIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTQ4MiwzNyArNTEyLDYgQEAKICAgICByZXR1cm4gZ290TG9jazsKIH0KIAotQ2FtZXJhM0RldmljZTo6U2l6ZSBDYW1lcmEzRGV2aWNlOjpnZXRNYXhKcGVnUmVzb2x1dGlvbigpIGNvbnN0IHsKLSAgICBpbnQzMl90IG1heEpwZWdXaWR0aCA9IDAsIG1heEpwZWdIZWlnaHQgPSAwOwotICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKLSAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOwotICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKLSAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOwotICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVTdHJlYW1Db25maWdzID0KLSAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7Ci0gICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAotICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgewotICAgICAgICByZXR1cm4gU2l6ZSgwLCAwKTsKLSAgICB9Ci0KLSAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KLSAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVTdHJlYW1Db25maWdzLmNvdW50OyBpKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgewotICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOwotICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKLSAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07Ci0gICAgICAgIGlmIChpc0lucHV0ID09IEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCi0gICAgICAgICAgICAgICAgJiYgZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgICh3aWR0aCAqIGhlaWdodCA+IG1heEpwZWdXaWR0aCAqIG1heEpwZWdIZWlnaHQpKSB7Ci0gICAgICAgICAgICBtYXhKcGVnV2lkdGggPSB3aWR0aDsKLSAgICAgICAgICAgIG1heEpwZWdIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU2l6ZShtYXhKcGVnV2lkdGgsIG1heEpwZWdIZWlnaHQpOwotfQotCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCkgewogICAgIC8vIHRyeSB0aHJlZSB0aW1lcyB0byBnZXQgdGhlIGNsb2NrIG9mZnNldCwgY2hvb3NlIHRoZSBvbmUKICAgICAvLyB3aXRoIHRoZSBtaW5pbXVtIGdhcCBpbiBtZWFzdXJlbWVudHMuCkBAIC01NDYsMTUgKzU0NSwxNSBAQAogICAgIHJldHVybiB1c2FnZTsKIH0KIAotU3RyZWFtUm90YXRpb24gQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Sb3RhdGlvbihjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSB7CitTdHJlYW1Sb3RhdGlvbiBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgewogICAgIHN3aXRjaCAocm90YXRpb24pIHsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOgorICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMDoKICAgICAgICAgICAgIHJldHVybiBTdHJlYW1Sb3RhdGlvbjo6Uk9UQVRJT05fMDsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl85MDoKKyAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzkwOgogICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl85MDsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8xODA6CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8xODA6CiAgICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzE4MDsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8yNzA6CisgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8yNzA6CiAgICAgICAgICAgICByZXR1cm4gU3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzI3MDsKICAgICB9CiAgICAgQUxPR0UoIiVzOiBVbmtub3duIHN0cmVhbSByb3RhdGlvbiAlZCIsIF9fRlVOQ1RJT05fXywgcm90YXRpb24pOwpAQCAtNTYyLDE0ICs1NjEsMTQgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6bWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZSgKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3Qgb3BlcmF0aW9uTW9kZSwgU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpIHsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLCBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSAqbW9kZSkgewogICAgIGlmIChtb2RlID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaWYgKG9wZXJhdGlvbk1vZGUgPCBDQU1FUkEzX1ZFTkRPUl9TVFJFQU1fQ09ORklHVVJBVElPTl9NT0RFX1NUQVJUKSB7CisgICAgaWYgKG9wZXJhdGlvbk1vZGUgPCBDQU1FUkFfVkVORE9SX1NUUkVBTV9DT05GSUdVUkFUSU9OX01PREVfU1RBUlQpIHsKICAgICAgICAgc3dpdGNoKG9wZXJhdGlvbk1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFOgogICAgICAgICAgICAgICAgICptb2RlID0gU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKICAgICAgICAgICAgICAgICAqbW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtNjAzLDEzICs2MDIsMjYgQEAKIH0KIAogc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCB7Ci0gICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCi0gICAgU2l6ZSBtYXhKcGVnUmVzb2x1dGlvbiA9IGdldE1heEpwZWdSZXNvbHV0aW9uKCk7Ci0gICAgaWYgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoID09IDApIHsKKyAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKSBmb3IgZGVmYXVsdCBzZW5zb3IgcGl4ZWwgbW9kZQorICAgIGNhbWVyYTM6OlNpemUgbWF4RGVmYXVsdEpwZWdSZXNvbHV0aW9uID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldE1heEpwZWdSZXNvbHV0aW9uKG1EZXZpY2VJbmZvLAorICAgICAgICAgICAgICAgICAgICAvKmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvciovZmFsc2UpOworICAgIC8vIEdldCBtYXgganBlZyBzaXplIChhcmVhLXdpc2UpIGZvciBtYXggcmVzb2x1dGlvbiBzZW5zb3IgcGl4ZWwgbW9kZSAvIDAgaWYKKyAgICAvLyBub3QgdWx0cmEgaGlnaCByZXMgc2Vuc29yCisgICAgY2FtZXJhMzo6U2l6ZSB1aHJNYXhKcGVnUmVzb2x1dGlvbiA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihtRGV2aWNlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgLyppc1VsdHJhSGlnaFJlc29sdXRpb24qL3RydWUpOworICAgIGlmIChtYXhEZWZhdWx0SnBlZ1Jlc29sdXRpb24ud2lkdGggPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogQ2FuJ3QgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIGJvb2wgdXNlTWF4U2Vuc29yUGl4ZWxNb2RlVGhyZXNob2xkID0gZmFsc2U7CisgICAgaWYgKHVock1heEpwZWdSZXNvbHV0aW9uLndpZHRoICE9IDAgJiYKKyAgICAgICAgICAgIHdpZHRoICogaGVpZ2h0ID4gbWF4RGVmYXVsdEpwZWdSZXNvbHV0aW9uLndpZHRoICogbWF4RGVmYXVsdEpwZWdSZXNvbHV0aW9uLmhlaWdodCkgeworICAgICAgICAvLyBVc2UgdGhlIHVsdHJhIGhpZ2ggcmVzIG1heCBqcGVnIHNpemUgYW5kIG1heCBqcGVnIGJ1ZmZlciBzaXplCisgICAgICAgIHVzZU1heFNlbnNvclBpeGVsTW9kZVRocmVzaG9sZCA9IHRydWU7CisgICAgfQogCiAgICAgLy8gR2V0IG1heCBqcGVnIGJ1ZmZlciBzaXplCiAgICAgc3NpemVfdCBtYXhKcGVnQnVmZmVyU2l6ZSA9IDA7CkBAIC02MjAsMTcgKzYzMiwyNiBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtYXhKcGVnQnVmZmVyU2l6ZSA9IGpwZWdCdWZNYXhTaXplLmRhdGEuaTMyWzBdOworCisgICAgY2FtZXJhMzo6U2l6ZSBjaG9zZW5NYXhKcGVnUmVzb2x1dGlvbiA9IG1heERlZmF1bHRKcGVnUmVzb2x1dGlvbjsKKyAgICBpZiAodXNlTWF4U2Vuc29yUGl4ZWxNb2RlVGhyZXNob2xkKSB7CisgICAgICAgIG1heEpwZWdCdWZmZXJTaXplID0KKyAgICAgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRVSFJNYXhKcGVnQnVmZmVyU2l6ZSh1aHJNYXhKcGVnUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heERlZmF1bHRKcGVnUmVzb2x1dGlvbiwgbWF4SnBlZ0J1ZmZlclNpemUpOworICAgICAgICBjaG9zZW5NYXhKcGVnUmVzb2x1dGlvbiA9IHVock1heEpwZWdSZXNvbHV0aW9uOworICAgIH0KICAgICBhc3NlcnQoa01pbkpwZWdCdWZmZXJTaXplIDwgbWF4SnBlZ0J1ZmZlclNpemUpOwogCiAgICAgLy8gQ2FsY3VsYXRlIGZpbmFsIGpwZWcgYnVmZmVyIHNpemUgZm9yIHRoZSBnaXZlbiByZXNvbHV0aW9uLgogICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gKChmbG9hdCkgKHdpZHRoICogaGVpZ2h0KSkgLwotICAgICAgICAgICAgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoICogbWF4SnBlZ1Jlc29sdXRpb24uaGVpZ2h0KTsKKyAgICAgICAgICAgIChjaG9zZW5NYXhKcGVnUmVzb2x1dGlvbi53aWR0aCAqIGNob3Nlbk1heEpwZWdSZXNvbHV0aW9uLmhlaWdodCk7CiAgICAgc3NpemVfdCBqcGVnQnVmZmVyU2l6ZSA9IHNjYWxlRmFjdG9yICogKG1heEpwZWdCdWZmZXJTaXplIC0ga01pbkpwZWdCdWZmZXJTaXplKSArCiAgICAgICAgICAgICBrTWluSnBlZ0J1ZmZlclNpemU7CiAgICAgaWYgKGpwZWdCdWZmZXJTaXplID4gbWF4SnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0koIiVzOiBqcGVnIGJ1ZmZlciBzaXplIGNhbGN1bGF0ZWQgaXMgPiBtYXhKcGVnIGJ1ZmZlclNpemUoJXpkKSwgY2xhbXBpbmciLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtYXhKcGVnQnVmZmVyU2l6ZSk7CiAgICAgICAgIGpwZWdCdWZmZXJTaXplID0gbWF4SnBlZ0J1ZmZlclNpemU7CiAgICAgfQotCiAgICAgcmV0dXJuIGpwZWdCdWZmZXJTaXplOwogfQogCkBAIC02NDcsMTMgKzY2OCwxNyBAQAogICAgIHJldHVybiBtYXhCeXRlc0ZvclBvaW50Q2xvdWQ7CiB9CiAKLXNzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0UmF3T3BhcXVlQnVmZmVyU2l6ZShpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3Qgeworc3NpemVfdCBDYW1lcmEzRGV2aWNlOjpnZXRSYXdPcGFxdWVCdWZmZXJTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICBib29sIG1heFJlc29sdXRpb24pIGNvbnN0IHsKICAgICBjb25zdCBpbnQgUEVSX0NPTkZJR1VSQVRJT05fU0laRSA9IDM7CiAgICAgY29uc3QgaW50IFdJRFRIX09GRlNFVCA9IDA7CiAgICAgY29uc3QgaW50IEhFSUdIVF9PRkZTRVQgPSAxOwogICAgIGNvbnN0IGludCBTSVpFX09GRlNFVCA9IDI7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHJhd09wYXF1ZVNpemVzID0KLSAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkUpOworICAgICAgICBtRGV2aWNlSW5mby5maW5kKAorICAgICAgICAgICAgY2FtZXJhMzo6U2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkUsCisgICAgICAgICAgICAgICAgICAgIG1heFJlc29sdXRpb24pKTsKICAgICBzaXplX3QgY291bnQgPSByYXdPcGFxdWVTaXplcy5jb3VudDsKICAgICBpZiAoY291bnQgPT0gMCB8fCAoY291bnQgJSBQRVJfQ09ORklHVVJBVElPTl9TSVpFKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlczogYmFkIG9wYXF1ZSBSQVcgc2l6ZSBzdGF0aWMgbWV0YWRhdGEgbGVuZ3RoKCV6dSkhIiwKQEAgLTc1MSwxNiArNzc2LDIxIEBACiAgICAgfQogCiAgICAgbGluZXMgPSBTdHJpbmc4KCIgICAgSW4tZmxpZ2h0IHJlcXVlc3RzOlxuIik7Ci0gICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICBsaW5lcy5hcHBlbmQoIiAgICAgIE5vbmVcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluRmxpZ2h0TWFwLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgciA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGkpOwotICAgICAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiLCBtZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIiBhcnJpdmVkOiAlcywgYnVmZmVycyBsZWZ0OiAlZFxuIiwgbUluRmxpZ2h0TWFwLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICAgICByLnNodXR0ZXJUaW1lc3RhbXAsIHIuaGF2ZVJlc3VsdE1ldGFkYXRhID8gInRydWUiIDogImZhbHNlIiwKLSAgICAgICAgICAgICAgICAgICAgci5udW1CdWZmZXJzTGVmdCk7CisgICAgaWYgKG1JbkZsaWdodExvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBpZiAobUluRmxpZ2h0TWFwLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiAgICAgIE5vbmVcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgciA9IG1JbkZsaWdodE1hcC52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWUgJWQgfCAgVGltZXN0YW1wOiAlIiBQUklkNjQgIiwgbWV0YWRhdGEiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFycml2ZWQ6ICVzLCBidWZmZXJzIGxlZnQ6ICVkXG4iLCBtSW5GbGlnaHRNYXAua2V5QXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICByLnNodXR0ZXJUaW1lc3RhbXAsIHIuaGF2ZVJlc3VsdE1ldGFkYXRhID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHIubnVtQnVmZmVyc0xlZnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIG1JbkZsaWdodExvY2sudW5sb2NrKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGluZXMuYXBwZW5kKCIgICAgICBGYWlsZWQgdG8gYWNxdWlyZSBJbi1mbGlnaHQgbG9jayFcbiIpOwogICAgIH0KICAgICB3cml0ZShmZCwgbGluZXMuc3RyaW5nKCksIGxpbmVzLnNpemUoKSk7CiAKQEAgLTc3OCw3ICs4MDgsNyBAQAogICAgIH0KIAogICAgIGlmIChkdW1wVGVtcGxhdGVzKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnRlbXBsYXRlTmFtZXNbQ0FNRVJBM19URU1QTEFURV9DT1VOVF0gPSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnRlbXBsYXRlTmFtZXNbQ0FNRVJBX1RFTVBMQVRFX0NPVU5UXSA9IHsKICAgICAgICAgICAgICJURU1QTEFURV9QUkVWSUVXIiwKICAgICAgICAgICAgICJURU1QTEFURV9TVElMTF9DQVBUVVJFIiwKICAgICAgICAgICAgICJURU1QTEFURV9WSURFT19SRUNPUkQiLApAQCAtNzg3LDEwICs4MTcsMTAgQEAKICAgICAgICAgICAgICJURU1QTEFURV9NQU5VQUwiLAogICAgICAgICB9OwogCi0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgQ0FNRVJBM19URU1QTEFURV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgQ0FNRVJBX1RFTVBMQVRFX0NPVU5UOyBpKyspIHsKICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICp0ZW1wbGF0ZVJlcXVlc3QgPSBudWxscHRyOwogICAgICAgICAgICAgbUludGVyZmFjZS0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKLSAgICAgICAgICAgICAgICAgICAgKGNhbWVyYTNfcmVxdWVzdF90ZW1wbGF0ZV90KSBpLCAmdGVtcGxhdGVSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QpIGksICZ0ZW1wbGF0ZVJlcXVlc3QpOwogICAgICAgICAgICAgbGluZXMgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgICBIQUwgUmVxdWVzdCAlczpcbiIsIHRlbXBsYXRlTmFtZXNbaS0xXSk7CiAgICAgICAgICAgICBpZiAodGVtcGxhdGVSZXF1ZXN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiAgICAgICBOb3Qgc3VwcG9ydGVkXG4iKTsKQEAgLTg2Nyw3ICs4OTcsNyBAQAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y29udmVydE1ldGFkYXRhTGlzdFRvUmVxdWVzdExpc3RMb2NrZWQoCiAgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZtZXRhZGF0YUxpc3QsCiAgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiAmc3VyZmFjZU1hcHMsCi0gICAgICAgIGJvb2wgcmVwZWF0aW5nLAorICAgICAgICBib29sIHJlcGVhdGluZywgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAogICAgICAgICBSZXF1ZXN0TGlzdCAqcmVxdWVzdExpc3QpIHsKICAgICBpZiAocmVxdWVzdExpc3QgPT0gTlVMTCkgewogICAgICAgICBDTE9HRSgicmVxdWVzdExpc3QgY2Fubm90IGJlIE5VTEwuIik7CkBAIC04ODYsNiArOTE2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIG5ld1JlcXVlc3QtPm1SZXBlYXRpbmcgPSByZXBlYXRpbmc7CisgICAgICAgIG5ld1JlcXVlc3QtPm1SZXF1ZXN0VGltZU5zID0gcmVxdWVzdFRpbWVOczsKIAogICAgICAgICAvLyBTZXR1cCBidXJzdCBJZCBhbmQgcmVxdWVzdCBJZAogICAgICAgICBuZXdSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBidXJzdElkKys7CkBAIC05MTEsNiArOTQyLDcgQEAKICAgICAgICAgZm9yIChhdXRvJiBvdXRwdXRTdHJlYW0gOiAoKmZpcnN0UmVxdWVzdCktPm1PdXRwdXRTdHJlYW1zKSB7CiAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc1ZpZGVvU3RyZWFtKCkpIHsKICAgICAgICAgICAgICAgICAoKmZpcnN0UmVxdWVzdCktPm1CYXRjaFNpemUgPSByZXF1ZXN0TGlzdC0+c2l6ZSgpOworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+c2V0QmF0Y2hTaXplKHJlcXVlc3RMaXN0LT5zaXplKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NTMsNiArOTg1LDggQEAKICAgICAgICAgLypvdXQqLwogICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIG5zZWNzX3QgcmVxdWVzdFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC05NjUsNyArOTk5LDcgQEAKICAgICBSZXF1ZXN0TGlzdCByZXF1ZXN0TGlzdDsKIAogICAgIHJlcyA9IGNvbnZlcnRNZXRhZGF0YUxpc3RUb1JlcXVlc3RMaXN0TG9ja2VkKHJlcXVlc3RzLCBzdXJmYWNlTWFwcywKLSAgICAgICAgICAgIHJlcGVhdGluZywgLypvdXQqLyZyZXF1ZXN0TGlzdCk7CisgICAgICAgICAgICByZXBlYXRpbmcsIHJlcXVlc3RUaW1lTnMsIC8qb3V0Ki8mcmVxdWVzdExpc3QpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgLy8gZXJyb3IgbG9nZ2VkIGJ5IHByZXZpb3VzIGNhbGwKICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTk5Nyw3ICsxMDMxLDcgQEAKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCiAgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CiAgICAgUmVxdWVzdEJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLAorICAgICAgICBtSWQsIG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jaywgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwKICAgICAgICAgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpc307CiAgICAgY2FtZXJhMzo6cmVxdWVzdFN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZSZXFzLCBfaGlkbF9jYik7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CkBAIC0xMDA2LDcgKzEwNDAsNyBAQAogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CiAgICAgUmV0dXJuQnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCAqbUludGVyZmFjZX07CisgICAgICAgIG1JZCwgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgKm1JbnRlcmZhY2V9OwogICAgIGNhbWVyYTM6OnJldHVyblN0cmVhbUJ1ZmZlcnMoc3RhdGVzLCBidWZmZXJzKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKIH0KQEAgLTEwNTQsNyArMTA4OCw4IEBACiAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtVXNlUGFydGlhbFJlc3VsdCwgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzLAogICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMsIG1WZW5kb3JUYWdJZCwgbURldmljZUluZm8sIG1QaHlzaWNhbERldmljZUluZm9NYXAsCiAgICAgICAgIG1SZXN1bHRNZXRhZGF0YVF1ZXVlLCBtRGlzdG9ydGlvbk1hcHBlcnMsIG1ab29tUmF0aW9NYXBwZXJzLCBtUm90YXRlQW5kQ3JvcE1hcHBlcnMsCi0gICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLCAqbUludGVyZmFjZQorICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsCisgICAgICAgICptSW50ZXJmYWNlCiAgICAgfTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogcmVzdWx0cykgewpAQCAtMTExMiw3ICsxMTQ3LDggQEAKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIsIG1Vc2VQYXJ0aWFsUmVzdWx0LCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MsCiAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cywgbVZlbmRvclRhZ0lkLCBtRGV2aWNlSW5mbywgbVBoeXNpY2FsRGV2aWNlSW5mb01hcCwKICAgICAgICAgbVJlc3VsdE1ldGFkYXRhUXVldWUsIG1EaXN0b3J0aW9uTWFwcGVycywgbVpvb21SYXRpb01hcHBlcnMsIG1Sb3RhdGVBbmRDcm9wTWFwcGVycywKLSAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIGxpc3RlbmVyLCAqdGhpcywgKnRoaXMsICptSW50ZXJmYWNlCisgICAgICAgIG1UYWdNb25pdG9yLCBtSW5wdXRTdHJlYW0sIG1PdXRwdXRTdHJlYW1zLCBtU2Vzc2lvblN0YXRzQnVpbGRlciwgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywKKyAgICAgICAgKm1JbnRlcmZhY2UKICAgICB9OwogCiAgICAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiByZXN1bHRzKSB7CkBAIC0xMTUyLDcgKzExODgsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgKm1JbnRlcmZhY2UKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICAqbUludGVyZmFjZQogICAgIH07CiAgICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7CiAgICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7CkBAIC0xMTk2LDcgKzEyMzMsNyBAQAogICAgICAgICAvLyBUaGlzIHBvaW50IHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgdmlhIEFQSTEgKEFQSTIgbXVzdCBleHBsaWNpdGx5IGNhbGwgY29uZmlndXJlU3RyZWFtcykKICAgICAgICAgLy8gc28gdW5pbGF0ZXJhbGx5IHNlbGVjdCBub3JtYWwgb3BlcmF0aW5nIG1vZGUuCiAgICAgICAgIHJlcyA9IGZpbHRlclBhcmFtc0FuZENvbmZpZ3VyZUxvY2tlZChyZXF1ZXN0LmJlZ2luKCktPm1ldGFkYXRhLAotICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUpOworICAgICAgICAgICAgICAgIENBTUVSQV9TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSk7CiAgICAgICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZC4gQ2xpZW50IG1pZ2h0IHRyeSBvdGhlciBjb25maWd1cmFpdG9ucy4KICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IHNldCB1cCBzdHJlYW1zOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xMjQ2LDcgKzEyODMsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVJbnB1dFN0cmVhbSgKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgaW50ICppZCkgeworICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOwpAQCAtMTI5Myw2ICsxMzMwLDcgQEAKICAgICBuZXdTdHJlYW0tPnNldFN0YXR1c1RyYWNrZXIobVN0YXR1c1RyYWNrZXIpOwogCiAgICAgbUlucHV0U3RyZWFtID0gbmV3U3RyZWFtOworICAgIG1Jc0lucHV0U3RyZWFtTXVsdGlSZXNvbHV0aW9uID0gaXNNdWx0aVJlc29sdXRpb247CiAKICAgICAqaWQgPSBtTmV4dFN0cmVhbUlkKys7CiAKQEAgLTEzMTUsOSArMTM1MywxMSBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAoY29uc3VtZXIgPT0gbnVsbHB0cikgewpAQCAtMTMyOSwyNCArMTM2OSwzNyBAQAogICAgIGNvbnN1bWVycy5wdXNoX2JhY2soY29uc3VtZXIpOwogCiAgICAgcmV0dXJuIGNyZWF0ZVN0cmVhbShjb25zdW1lcnMsIC8qaGFzRGVmZXJyZWRDb25zdW1lciovIGZhbHNlLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcywgc3RyZWFtU2V0SWQsCi0gICAgICAgICAgICBpc1NoYXJlZCwgY29uc3VtZXJVc2FnZSk7CisgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIGlkLCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIHN0cmVhbVNldElkLCBpc1NoYXJlZCwgaXNNdWx0aVJlc29sdXRpb24sIGNvbnN1bWVyVXNhZ2UpOworfQorCitzdGF0aWMgYm9vbCBpc1Jhd0Zvcm1hdChpbnQgZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTI6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCwgdWludDY0X3QgY29uc3VtZXJVc2FnZSkgeworICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkLCBib29sIGlzTXVsdGlSZXNvbHV0aW9uLAorICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIEFMT0dWKCJDYW1lcmEgJXM6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIgotICAgICAgICAgICAgIiBjb25zdW1lciB1c2FnZSAlIiBQUkl1NjQgIiwgaXNTaGFyZWQgJWQsIHBoeXNpY2FsQ2FtZXJhSWQgJXMiLCBtSWQuc3RyaW5nKCksCi0gICAgICAgICAgICBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIGNvbnN1bWVyVXNhZ2UsIGlzU2hhcmVkLAotICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAiIGNvbnN1bWVyIHVzYWdlICUiIFBSSXU2NCAiLCBpc1NoYXJlZCAlZCwgcGh5c2ljYWxDYW1lcmFJZCAlcywgaXNNdWx0aVJlc29sdXRpb24gJWQiLAorICAgICAgICAgICAgbUlkLnN0cmluZygpLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCisgICAgICAgICAgICBjb25zdW1lclVzYWdlLCBpc1NoYXJlZCwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgaXNNdWx0aVJlc29sdXRpb24pOwogCiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7CkBAIC0xMzg5LDYgKzE0NDIsMTIgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBpZiAoaXNSYXdGb3JtYXQoZm9ybWF0KSAmJiBzZW5zb3JQaXhlbE1vZGVzVXNlZC5zaXplKCkgPiAxKSB7CisgICAgICAgIC8vIFdlIGNhbid0IHVzZSBvbmUgc3RyZWFtIHdpdGggYSByYXcgZm9ybWF0IGluIGJvdGggc2Vuc29yIHBpeGVsIG1vZGVzIHNpbmNlIGl0cyBnb2luZyB0bworICAgICAgICAvLyBiZSBmb3VuZCBpbiBvbmx5IG9uZSBzZW5zb3IgcGl4ZWwgbW9kZS4KKyAgICAgICAgQUxPR0UoIiVzOiBSQVcgb3BhcXVlIHN0cmVhbSBjYW5ub3QgYmUgdXNlZCB3aXRoID4gMSBzZW5zb3IgcGl4ZWwgbW9kZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICBzc2l6ZV90IGJsb2JCdWZmZXJTaXplOwogICAgICAgICBpZiAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpIHsKQEAgLTE0MDgsMjkgKzE0NjcsMzYgQEAKICAgICAgICAgfQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYmxvYkJ1ZmZlclNpemUsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpIHsKLSAgICAgICAgc3NpemVfdCByYXdPcGFxdWVCdWZmZXJTaXplID0gZ2V0UmF3T3BhcXVlQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uID0KKyAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZC5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQuZW5kKCk7CisgICAgICAgIHNzaXplX3QgcmF3T3BhcXVlQnVmZmVyU2l6ZSA9IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUod2lkdGgsIGhlaWdodCwgbWF4UmVzb2x1dGlvbik7CiAgICAgICAgIGlmIChyYXdPcGFxdWVCdWZmZXJTaXplIDw9IDApIHsKICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBSQVcgb3BhcXVlIGJ1ZmZlciBzaXplICV6ZCIsIHJhd09wYXF1ZUJ1ZmZlclNpemUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lcnNbMF0sCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcmF3T3BhcXVlQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLAotICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24pOwogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwgc3RyZWFtU2V0SWQsCiAgICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzdHJlYW1TZXRJZCwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzb2x1dGlvbik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIGlzTXVsdGlSZXNvbHV0aW9uKTsKICAgICB9CiAKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IGNvbnN1bWVycy5zaXplKCk7CkBAIC0xNDQ5LDEyICsxNTE1LDE2IEBACiAKICAgICBuZXdTdHJlYW0tPnNldEJ1ZmZlck1hbmFnZXIobUJ1ZmZlck1hbmFnZXIpOwogCisgICAgbmV3U3RyZWFtLT5zZXRJbWFnZUR1bXBNYXNrKG1JbWFnZUR1bXBNYXNrKTsKKwogICAgIHJlcyA9IG1PdXRwdXRTdHJlYW1zLmFkZChtTmV4dFN0cmVhbUlkLCBuZXdTdHJlYW0pOwogICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgYWRkIG5ldyBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgbVNlc3Npb25TdGF0c0J1aWxkZXIuYWRkU3RyZWFtKG1OZXh0U3RyZWFtSWQpOworCiAgICAgKmlkID0gbU5leHRTdHJlYW1JZCsrOwogICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKIApAQCAtMTU3OCw2ICsxNjQ4LDcgQEAKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLnJlbW92ZVN0cmVhbShpZCk7CiAgICAgfQogCiAgICAgLy8gRGVsZXRlIG91dHB1dCBzdHJlYW0gb3IgdGhlIG91dHB1dCBwYXJ0IG9mIGEgYmktZGlyZWN0aW9uYWwgc3RyZWFtLgpAQCAtMTYwOSw3ICsxNjgwLDcgQEAKICAgICAvLyBzcGVjdWxhdGl2ZSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbGFzdCBjYWNoZWQKICAgICAvLyBkZWZhdWx0IHJlcXVlc3QuCiAgICAgaWYgKHNlc3Npb25QYXJhbXMuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAoKG1MYXN0VGVtcGxhdGVJZCA+IDApICYmIChtTGFzdFRlbXBsYXRlSWQgPCBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UKSkgJiYKKyAgICAgICAgICAgICgobUxhc3RUZW1wbGF0ZUlkID4gMCkgJiYgKG1MYXN0VGVtcGxhdGVJZCA8IENBTUVSQV9URU1QTEFURV9DT1VOVCkpICYmCiAgICAgICAgICAgICAoIW1SZXF1ZXN0VGVtcGxhdGVDYWNoZVttTGFzdFRlbXBsYXRlSWRdLmlzRW1wdHkoKSkpIHsKICAgICAgICAgQUxPR1YoIiVzOiBTcGVjdWxhdGl2ZSBzZXNzaW9uIHBhcmFtIGNvbmZpZ3VyYXRpb24gd2l0aCB0ZW1wbGF0ZSBpZDogJWQiLCBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICBtTGFzdFRlbXBsYXRlSWQpOwpAQCAtMTY1OSwxMiArMTczMCwxMiBAQAogICAgIHJldHVybiBtSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyUHJvZHVjZXIocHJvZHVjZXIpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogZm9yIHRlbXBsYXRlICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKIAotICAgIGlmICh0ZW1wbGF0ZUlkIDw9IDAgfHwgdGVtcGxhdGVJZCA+PSBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UKSB7CisgICAgaWYgKHRlbXBsYXRlSWQgPD0gMCB8fCB0ZW1wbGF0ZUlkID49IENBTUVSQV9URU1QTEFURV9DT1VOVCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjg2NjExMCIsCiAgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0xNzAwLDcgKzE3NzEsNyBAQAogCiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJhd1JlcXVlc3Q7CiAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKLSAgICAgICAgICAgIChjYW1lcmEzX3JlcXVlc3RfdGVtcGxhdGVfdCkgdGVtcGxhdGVJZCwgJnJhd1JlcXVlc3QpOworICAgICAgICAgICAgKGNhbWVyYV9yZXF1ZXN0X3RlbXBsYXRlX3QpIHRlbXBsYXRlSWQsICZyYXdSZXF1ZXN0KTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMTc2OCwxMyArMTgzOSwxMyBAQAogICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbik7CiAgICAgc3RhdHVzX3QgcmVzID0gd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gZmFsc2UsIG1heEV4cGVjdGVkRHVyYXRpb24pOwogICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgbVN0YXR1c1RyYWNrZXItPmR1bXBBY3RpdmVDb21wb25lbnRzKCk7CiAgICAgICAgIFNFVF9FUlJfTCgiRXJyb3Igd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksCiAgICAgICAgICAgICAgICAgcmVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KIAotCiB2b2lkIENhbWVyYTNEZXZpY2U6OmludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFN0YXR1cyBzdGF0dXMpIHsKICAgICBtU3RhdHVzID0gc3RhdHVzOwogICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzLmFkZChtU3RhdHVzKTsKQEAgLTE4MzMsMTAgKzE5MDQsMTIgQEAKIAogICAgIG1TdGF0dXNXYWl0ZXJzKys7CiAKKyAgICBib29sIHNpZ25hbFBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKICAgICBpZiAoIWFjdGl2ZSAmJiBtVXNlSGFsQnVmTWFuYWdlcikgewogICAgICAgICBhdXRvIHN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOwogICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSB7CiAgICAgICAgICAgICBtUmVxdWVzdFRocmVhZC0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICAgICAgc2lnbmFsUGlwZWxpbmVEcmFpbiA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbldhaXRVbnRpbElkbGUoKTsKICAgICB9CkBAIC0xODY2LDYgKzE5MzksMTAgQEAKICAgICAgICAgfQogICAgIH0gd2hpbGUgKCFzdGF0ZVNlZW4pOwogCisgICAgaWYgKHNpZ25hbFBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgbVJlcXVlc3RUaHJlYWQtPnJlc2V0UGlwZWxpbmVEcmFpbigpOworICAgIH0KKwogICAgIG1TdGF0dXNXYWl0ZXJzLS07CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMjAwMyw2ICsyMDgwLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5jbGVhcigvKm91dCovZnJhbWVOdW1iZXIpOworCisgICAgICAgIC8vIFN0b3Agc2Vzc2lvbiBhbmQgc3RyZWFtIGNvdW50ZXIKKyAgICAgICAgbVNlc3Npb25TdGF0c0J1aWxkZXIuc3RvcENvdW50ZXIoKTsKICAgICB9CiAKICAgICByZXR1cm4gbVJlcXVlc3RUaHJlYWQtPmZsdXNoKCk7CkBAIC0yMDgwLDYgKzIxNjAsOSBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om5vdGlmeVN0YXR1cyhib29sIGlkbGUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RyZWFtSWRzOworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4gc3RyZWFtU3RhdHM7CisKICAgICB7CiAgICAgICAgIC8vIE5lZWQgbUxvY2sgdG8gc2FmZWx5IHVwZGF0ZSBzdGF0ZSBhbmQgc3luY2hyb25pemUgdG8gY3VycmVudAogICAgICAgICAvLyBzdGF0ZSBvZiBtZXRob2RzIGluIGZsaWdodC4KQEAgLTIwOTcsNiArMjE4MCwyNCBAQAogICAgICAgICAvLyBTa2lwIG5vdGlmeWluZyBsaXN0ZW5lciBpZiB3ZSdyZSBkb2luZyBzb21lIHVzZXItdHJhbnNwYXJlbnQKICAgICAgICAgLy8gc3RhdGUgY2hhbmdlcwogICAgICAgICBpZiAobVBhdXNlU3RhdGVOb3RpZnkpIHJldHVybjsKKworICAgICAgICAvLyBQb3B1bGF0ZSBzdHJlYW0gc3RhdGlzdGljcyBpbiBjYXNlIG9mIElkbGUKKyAgICAgICAgaWYgKGlkbGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdXRvIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgY29udGludWU7CisgICAgICAgICAgICAgICAgc3RyZWFtSWRzLnB1c2hfYmFjayhzdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbWVyYTNTdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHN0cmVhbS0+YXNIYWxTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgaW50NjRfdCB1c2FnZSA9IDBMTDsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhM1N0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHVzYWdlID0gY2FtZXJhM1N0cmVhbS0+Z2V0VXNhZ2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHMuZW1wbGFjZV9iYWNrKHN0cmVhbS0+Z2V0V2lkdGgoKSwgc3RyZWFtLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGb3JtYXQoKSwgc3RyZWFtLT5nZXREYXRhU3BhY2UoKSwgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0TWF4SGFsQnVmZmVycygpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldE1heFRvdGFsQnVmZmVycygpIC0gc3RyZWFtLT5nZXRNYXhIYWxCdWZmZXJzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyOwpAQCAtMjEwNCw4ICsyMjA1LDQwIEBACiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1PdXRwdXRMb2NrKTsKICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogICAgIH0KLSAgICBpZiAoaWRsZSAmJiBsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5ub3RpZnlJZGxlKCk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlkbGUpIHsKKyAgICAgICAgICAgIC8vIEdldCBzZXNzaW9uIHN0YXRzIGZyb20gdGhlIGJ1aWxkZXIsIGFuZCBub3RpZnkgdGhlIGxpc3RlbmVyLgorICAgICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIHJlc3VsdEVycm9yQ291bnQ7CisgICAgICAgICAgICBib29sIGRldmljZUVycm9yOworICAgICAgICAgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gc3RyZWFtU3RhdHNNYXA7CisgICAgICAgICAgICBtU2Vzc2lvblN0YXRzQnVpbGRlci5idWlsZEFuZFJlc2V0KCZyZXF1ZXN0Q291bnQsICZyZXN1bHRFcnJvckNvdW50LAorICAgICAgICAgICAgICAgICAgICAmZGV2aWNlRXJyb3IsICZzdHJlYW1TdGF0c01hcCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUlkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IHN0cmVhbUlkc1tpXTsKKyAgICAgICAgICAgICAgICBhdXRvIHN0YXRzID0gc3RyZWFtU3RhdHNNYXAuZmluZChzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRzICE9IHN0cmVhbVN0YXRzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzW2ldLm1SZXF1ZXN0Q291bnQgPSBzdGF0cy0+c2Vjb25kLm1SZXF1ZXN0ZWRGcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tRXJyb3JDb3VudCA9IHN0YXRzLT5zZWNvbmQubURyb3BwZWRGcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tU3RhcnRMYXRlbmN5TXMgPSBzdGF0cy0+c2Vjb25kLm1TdGFydExhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHNbaV0ubUhpc3RvZ3JhbVR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0czo6SElTVE9HUkFNX1RZUEVfQ0FQVFVSRV9MQVRFTkNZOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdGF0c1tpXS5tSGlzdG9ncmFtQmlucy5hc3NpZ24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPnNlY29uZC5tQ2FwdHVyZUxhdGVuY3lCaW5zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPnNlY29uZC5tQ2FwdHVyZUxhdGVuY3lCaW5zLmVuZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtU3RhdHNbaV0ubUhpc3RvZ3JhbUNvdW50cy5hc3NpZ24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy0+c2Vjb25kLm1DYXB0dXJlTGF0ZW5jeUhpc3RvZ3JhbS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtPnNlY29uZC5tQ2FwdHVyZUxhdGVuY3lIaXN0b2dyYW0uZW5kKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnlJZGxlKHJlcXVlc3RDb3VudCwgcmVzdWx0RXJyb3JDb3VudCwgZGV2aWNlRXJyb3IsIHN0cmVhbVN0YXRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IGxpc3RlbmVyLT5ub3RpZnlBY3RpdmUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBsb3N0IG1pZC1vcGVyYXRpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgIH0KIH0KIApAQCAtMjIxNSw2ICsyMzQ4LDEyIEBACiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGlzIG5vdCBmb3VuZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisKKyAgICBpZiAoZHJvcHBpbmcpIHsKKyAgICAgICAgbVNlc3Npb25TdGF0c0J1aWxkZXIuc3RvcENvdW50ZXIoc3RyZWFtSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLnN0YXJ0Q291bnRlcihzdHJlYW1JZCk7CisgICAgfQogICAgIHJldHVybiBzdHJlYW0tPmRyb3BCdWZmZXJzKGRyb3BwaW5nKTsKIH0KIApAQCAtMjMwNiw2ICsyNDQ1LDM1IEBACiAgICAgICAgIG5ld1JlcXVlc3QtPm1Sb3RhdGVBbmRDcm9wQXV0byA9IGZhbHNlOwogICAgIH0KIAorICAgIGF1dG8gem9vbVJhdGlvRW50cnkgPQorICAgICAgICAgICAgbmV3UmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPKTsKKyAgICBpZiAoem9vbVJhdGlvRW50cnkuY291bnQgPiAwICYmCisgICAgICAgICAgICB6b29tUmF0aW9FbnRyeS5kYXRhLmZbMF0gPT0gMS4wZikgeworICAgICAgICBuZXdSZXF1ZXN0LT5tWm9vbVJhdGlvSXMxeCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3UmVxdWVzdC0+bVpvb21SYXRpb0lzMXggPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobVN1cHBvcnRDYW1lcmFNdXRlKSB7CisgICAgICAgIGF1dG8gdGVzdFBhdHRlcm5Nb2RlRW50cnkgPQorICAgICAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSk7CisgICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZSA9IHRlc3RQYXR0ZXJuTW9kZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5Nb2RlRW50cnkuZGF0YS5pMzJbMF0gOgorICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRjsKKworICAgICAgICBhdXRvIHRlc3RQYXR0ZXJuRGF0YUVudHJ5ID0KKyAgICAgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEpOworICAgICAgICBpZiAodGVzdFBhdHRlcm5EYXRhRW50cnkuY291bnQgPj0gNCkgeworICAgICAgICAgICAgbWVtY3B5KG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YSwgdGVzdFBhdHRlcm5EYXRhRW50cnkuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihDYXB0dXJlUmVxdWVzdDo6bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMF0gPSAwOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzFdID0gMDsKKyAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsyXSA9IDA7CisgICAgICAgICAgICBuZXdSZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbM10gPSAwOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIG5ld1JlcXVlc3Q7CiB9CiAKQEAgLTIzNjAsNiArMjUyOCw4IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBib29sIHJldCA9IGZhbHNlOwogCisgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CisKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOwogCkBAIC0yNDA3LDYgKzI1NzcsOSBAQAogICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwYXVzZSBzdHJlYW1pbmc6ICVkIiwgX19GVU5DVElPTl9fLCByYyk7CiAgICAgfQogCisgICAgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nU3RyZWFtQ29uZmlndXJlZChtSWQsIG1PcGVyYXRpbmdNb2RlLCB0cnVlIC8qaW50ZXJuYWxSZWNvbmZpZyovLAorICAgICAgICBuczJtcyhzeXN0ZW1UaW1lKCkgLSBzdGFydFRpbWUpKTsKKwogICAgIGlmIChtYXJrQ2xpZW50QWN0aXZlKSB7CiAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKGNsaWVudFN0YXR1c0lkKTsKICAgICB9CkBAIC0yNDQzLDE1ICsyNjE2LDE2IEBACiAgICAgLy8gYW55IHBlbmRpbmcgcmVxdWVzdHMuCiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIG5vdGlmeVJlcXVlc3RUaHJlYWQpIHsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgIGNhbWVyYTM6OlNpemUgaW5wdXRCdWZmZXJTaXplOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gbUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIC8qcmVzcGVjdEhhbExpbWl0Ki8gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAmaW5wdXRCdWZmZXJTaXplLCAvKnJlc3BlY3RIYWxMaW1pdCovIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAvLyBFeGhhdXN0ZWQgYWNxdWlyaW5nIGFsbCBpbnB1dCBidWZmZXJzLgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICAgICAgICAgIHJlcyA9IG1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJWQ6IGNvdWxkbid0IHJldHVybiBpbnB1dCBidWZmZXIgd2hpbGUgY2xlYXJpbmcgaW5wdXQgcXVldWU6ICIKQEAgLTI0NjYsMTIgKzI2NDAsMTIgQEAKICAgICB9CiAKICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXZpY2UgSEFMdjMuMiBvciBvbGRlciBzcGVjIGJ1ZyAtIHplcm8gc3RyZWFtcyByZXF1aXJlcwotICAgIC8vIGFkZGluZyBhIGR1bW15IHN0cmVhbSBpbnN0ZWFkLgorICAgIC8vIGFkZGluZyBhIGZha2Ugc3RyZWFtIGluc3RlYWQuCiAgICAgLy8gVE9ETzogQnVnOiAxNzMyMTQwNCBmb3IgZml4aW5nIHRoZSBIQUwgc3BlYyBhbmQgcmVtb3ZpbmcgdGhpcyB3b3JrYXJvdW5kLgogICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMCkgewotICAgICAgICBhZGREdW1teVN0cmVhbUxvY2tlZCgpOworICAgICAgICBhZGRGYWtlU3RyZWFtTG9ja2VkKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKTsKKyAgICAgICAgdHJ5UmVtb3ZlRmFrZVN0cmVhbUxvY2tlZCgpOwogICAgIH0KIAogICAgIC8vIFN0YXJ0IGNvbmZpZ3VyaW5nIHRoZSBzdHJlYW1zCkBAIC0yNDc5LDE3ICsyNjUzLDE4IEBACiAKICAgICBtUHJlcGFyZXJUaHJlYWQtPnBhdXNlKCk7CiAKLSAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24gY29uZmlnOwogICAgIGNvbmZpZy5vcGVyYXRpb25fbW9kZSA9IG1PcGVyYXRpbmdNb2RlOwogICAgIGNvbmZpZy5udW1fc3RyZWFtcyA9IChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgKyBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgY29uZmlnLmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24gPSBmYWxzZTsKIAotICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV90Kj4gc3RyZWFtczsKKyAgICBWZWN0b3I8Y2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90Kj4gc3RyZWFtczsKICAgICBzdHJlYW1zLnNldENhcGFjaXR5KGNvbmZpZy5udW1fc3RyZWFtcyk7CiAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGJ1ZmZlclNpemVzKGNvbmZpZy5udW1fc3RyZWFtcywgMCk7CiAKIAogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICppbnB1dFN0cmVhbTsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICppbnB1dFN0cmVhbTsKICAgICAgICAgaW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW0tPnN0YXJ0Q29uZmlndXJhdGlvbigpOwogICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IHN0YXJ0IGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CkBAIC0yNDk3LDggKzI2NzIsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQogICAgICAgICBzdHJlYW1zLmFkZChpbnB1dFN0cmVhbSk7CisKKyAgICAgICAgY29uZmlnLmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24gPSBtSXNJbnB1dFN0cmVhbU11bHRpUmVzb2x1dGlvbjsKICAgICB9CiAKKyAgICBtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwLmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewogCiAgICAgICAgIC8vIERvbid0IGNvbmZpZ3VyZSBiaWRpIHN0cmVhbXMgdHdpY2UsIG5vciBhZGQgdGhlbSB0d2ljZSB0byB0aGUgbGlzdApAQCAtMjUwOSw3ICsyNjg3LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqb3V0cHV0U3RyZWFtOworICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3QgKm91dHB1dFN0cmVhbTsKICAgICAgICAgb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV0tPnN0YXJ0Q29uZmlndXJhdGlvbigpOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IE5VTEwpIHsKICAgICAgICAgICAgIENMT0dFKCJDYW4ndCBzdGFydCBvdXRwdXQgc3RyZWFtIGNvbmZpZ3VyYXRpb24iKTsKQEAgLTI1MzIsNiArMjcxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW1zW2ldLT5pc011bHRpUmVzb2x1dGlvbigpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUdyb3VwSWQgPSBtT3V0cHV0U3RyZWFtc1tpXS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCA9IG1PdXRwdXRTdHJlYW1zW2ldLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7CisgICAgICAgICAgICBtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwW3N0cmVhbUdyb3VwSWRdLmluc2VydChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGNvbmZpZy5zdHJlYW1zID0gc3RyZWFtcy5lZGl0QXJyYXkoKTsKQEAgLTI2MDIsNyArMjc4Niw4IEBACiAgICAgLy8gUmVxdWVzdCB0aHJlYWQgbmVlZHMgdG8ga25vdyB0byBhdm9pZCB1c2luZyByZXBlYXQtbGFzdC1zZXR0aW5ncyBwcm90b2NvbAogICAgIC8vIGFjcm9zcyBjb25maWd1cmVfc3RyZWFtcygpIGNhbGxzCiAgICAgaWYgKG5vdGlmeVJlcXVlc3RUaHJlYWQpIHsKLSAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNvbmZpZ3VyYXRpb25Db21wbGV0ZShtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24sIHNlc3Npb25QYXJhbXMpOworICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y29uZmlndXJhdGlvbkNvbXBsZXRlKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1zLCBtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwKTsKICAgICB9CiAKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CkBAIC0yNjMzLDcgKzI4MTgsNyBAQAogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIAotICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pID8KKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZCgobUZha2VTdHJlYW1JZCA9PSBOT19TVFJFQU0pID8KICAgICAgICAgICAgIFNUQVRVU19DT05GSUdVUkVEIDogU1RBVFVTX1VOQ09ORklHVVJFRCk7CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogU3RyZWFtIGNvbmZpZ3VyYXRpb24gY29tcGxldGUiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CkBAIC0yNjQ3LDY5ICsyODMyLDgyIEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKLSAgICBpZiAobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CisgICAgaWYgKG1GYWtlU3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25TdHJlYW1zQ29uZmlndXJlZCgpOwogICAgIH0KIAorICAgIC8vIFNpbmNlIHRoZSBzdHJlYW1zIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGluamVjdGlvbiBjYW1lcmEgaXMgYmFzZWQgb24gdGhlIGludGVybmFsIGNhbWVyYSwgd2UKKyAgICAvLyBtdXN0IHdhaXQgdW50aWwgdGhlIGludGVybmFsIGNhbWVyYSBjb25maWd1cmUgc3RyZWFtcyBiZWZvcmUgY2FsbGluZyBpbmplY3RDYW1lcmEoKSB0bworICAgIC8vIGNvbmZpZ3VyZSB0aGUgaW5qZWN0aW9uIHN0cmVhbXMuCisgICAgaWYgKG1JbmplY3Rpb25NZXRob2RzLT5pc0luamVjdGluZygpKSB7CisgICAgICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSAlczogU3RhcnQgdG8gY29uZmlndXJlIHN0cmVhbXMuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSW5qZWN0aW9uTWV0aG9kcy0+Z2V0SW5qZWN0ZWRDYW1JZCgpLnN0cmluZygpKTsKKyAgICAgICAgcmVzID0gbUluamVjdGlvbk1ldGhvZHMtPmluamVjdENhbWVyYShjb25maWcsIGJ1ZmZlclNpemVzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbid0IGZpbmlzaCBpbmplY3QgY2FtZXJhIHByb2Nlc3MhIik7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjphZGREdW1teVN0cmVhbUxvY2tlZCgpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmFkZEZha2VTdHJlYW1Mb2NrZWQoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKLSAgICBpZiAobUR1bW15U3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7Ci0gICAgICAgIC8vIFNob3VsZCBuZXZlciBiZSBhZGRpbmcgYSBzZWNvbmQgZHVtbXkgc3RyZWFtIHdoZW4gb25lIGlzIGFscmVhZHkKKyAgICBpZiAobUZha2VTdHJlYW1JZCAhPSBOT19TVFJFQU0pIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGJlIGFkZGluZyBhIHNlY29uZCBmYWtlIHN0cmVhbSB3aGVuIG9uZSBpcyBhbHJlYWR5CiAgICAgICAgIC8vIGFjdGl2ZQotICAgICAgICBTRVRfRVJSX0woIiVzOiBDYW1lcmEgJXM6IEEgZHVtbXkgc3RyZWFtIGFscmVhZHkgZXhpc3RzISIsCisgICAgICAgIFNFVF9FUlJfTCgiJXM6IENhbWVyYSAlczogQSBmYWtlIHN0cmVhbSBhbHJlYWR5IGV4aXN0cyEiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogQ2FtZXJhICVzOiBBZGRpbmcgYSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IEFkZGluZyBhIGZha2Ugc3RyZWFtIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZHVtbXlTdHJlYW0gPQotICAgICAgICAgICAgbmV3IENhbWVyYTNEdW1teVN0cmVhbShtTmV4dFN0cmVhbUlkKTsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBmYWtlU3RyZWFtID0KKyAgICAgICAgICAgIG5ldyBDYW1lcmEzRmFrZVN0cmVhbShtTmV4dFN0cmVhbUlkKTsKIAotICAgIHJlcyA9IG1PdXRwdXRTdHJlYW1zLmFkZChtTmV4dFN0cmVhbUlkLCBkdW1teVN0cmVhbSk7CisgICAgcmVzID0gbU91dHB1dFN0cmVhbXMuYWRkKG1OZXh0U3RyZWFtSWQsIGZha2VTdHJlYW0pOwogICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiQ2FuJ3QgYWRkIGR1bW15IHN0cmVhbSB0byBzZXQ6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBhZGQgZmFrZSBzdHJlYW0gdG8gc2V0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgbUR1bW15U3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOworICAgIG1GYWtlU3RyZWFtSWQgPSBtTmV4dFN0cmVhbUlkOwogICAgIG1OZXh0U3RyZWFtSWQrKzsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6dHJ5UmVtb3ZlRHVtbXlTdHJlYW1Mb2NrZWQoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp0cnlSZW1vdmVGYWtlU3RyZWFtTG9ja2VkKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCi0gICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgcmV0dXJuIE9LOworICAgIGlmIChtRmFrZVN0cmVhbUlkID09IE5PX1NUUkVBTSkgcmV0dXJuIE9LOwogICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgPT0gMSkgcmV0dXJuIE9LOwogCi0gICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFJlbW92aW5nIHRoZSBkdW1teSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJXM6IFJlbW92aW5nIHRoZSBmYWtlIHN0cmVhbSIsIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKIAotICAgIC8vIE9rLCBoYXZlIGEgZHVtbXkgc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAotICAgIC8vIHNvIHJlbW92ZSB0aGUgZHVtbXkKKyAgICAvLyBPaywgaGF2ZSBhIGZha2Ugc3RyZWFtIGFuZCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBvdGhlciBvdXRwdXQgc3RyZWFtLAorICAgIC8vIHNvIHJlbW92ZSB0aGUgZmFrZQogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRHVtbXlTdHJlYW1JZCk7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChtRmFrZVN0cmVhbUlkKTsKICAgICBpZiAoZGVsZXRlZFN0cmVhbSA9PSBudWxscHRyKSB7Ci0gICAgICAgIFNFVF9FUlJfTCgiRHVtbXkgc3RyZWFtICVkIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCIsIG1EdW1teVN0cmVhbUlkKTsKKyAgICAgICAgU0VUX0VSUl9MKCJGYWtlIHN0cmVhbSAlZCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QiLCBtRmFrZVN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUobUR1bW15U3RyZWFtSWQpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRmFrZVN0cmVhbUlkKTsKIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCiAgICAgcmVzID0gZGVsZXRlZFN0cmVhbS0+ZGlzY29ubmVjdCgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBkaXNjb25uZWN0IGRlbGV0ZWQgZHVtbXkgc3RyZWFtICVkIiwgbUR1bW15U3RyZWFtSWQpOworICAgICAgICBTRVRfRVJSX0woIkNhbid0IGRpc2Nvbm5lY3QgZGVsZXRlZCBmYWtlIHN0cmVhbSAlZCIsIG1GYWtlU3RyZWFtSWQpOwogICAgICAgICAvLyBmYWxsIHRocm91Z2ggc2luY2Ugd2Ugd2FudCB0byBzdGlsbCBsaXN0IHRoZSBzdHJlYW0gYXMgZGVsZXRlZC4KICAgICB9CiAgICAgbURlbGV0ZWRTdHJlYW1zLmFkZChkZWxldGVkU3RyZWFtKTsKLSAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKKyAgICBtRmFrZVN0cmVhbUlkID0gTk9fU1RSRUFNOwogCiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTI3NjAsNiArMjk1OCw3IEBACiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgbGlzdGVuZXItPm5vdGlmeUVycm9yKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfREVWSUNFLAogICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMoKSk7CisgICAgICAgIG1TZXNzaW9uU3RhdHNCdWlsZGVyLm9uRGV2aWNlRXJyb3IoKTsKICAgICB9CiAKICAgICAvLyBTYXZlIHN0YWNrIHRyYWNlLiBWaWV3IGJ5IGR1bXBpbmcgaXQgbGF0ZXIuCkBAIC0yNzc0LDE2ICsyOTczLDE3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpyZWdpc3RlckluRmxpZ2h0KHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCi0gICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKLSAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgY2FtZXJhSWRzV2l0aFpvb20sCi0gICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c2V0PFN0cmluZzg+PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUsIGJvb2wgaXNac2xDYXB0dXJlLCBib29sIHJvdGF0ZUFuZENyb3BBdXRvLAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLAorICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywgbnNlY3NfdCByZXF1ZXN0VGltZU5zKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAogICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzLCBpc1N0aWxsQ2FwdHVyZSwgaXNac2xDYXB0dXJlLAotICAgICAgICAgICAgcm90YXRlQW5kQ3JvcEF1dG8sIGNhbWVyYUlkc1dpdGhab29tLCBvdXRwdXRTdXJmYWNlcykpOworICAgICAgICAgICAgcm90YXRlQW5kQ3JvcEF1dG8sIGNhbWVyYUlkc1dpdGhab29tLCByZXF1ZXN0VGltZU5zLCBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewpAQCAtMjgxNCw3ICszMDE0LDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpjaGVja0luZmxpZ2h0TWFwTGVuZ3RoTG9ja2VkKCkgewotICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHdlIGhhdmUgdG9vIG1hbnkgaW4tZmxpZ2h0IGZyYW1lcyB3aXRoIGxvbmcgdG90YWwgaW5mbGlnaHQgZHVyYXRpb24sCisgICAgLy8gVmFsaWRhdGlvbiBjaGVjayAtIGlmIHdlIGhhdmUgdG9vIG1hbnkgaW4tZmxpZ2h0IGZyYW1lcyB3aXRoIGxvbmcgdG90YWwgaW5mbGlnaHQgZHVyYXRpb24sCiAgICAgLy8gc29tZXRoaW5nIGhhcyBsaWtlbHkgZ29uZSB3cm9uZy4gVGhpcyBtaWdodCBzdGlsbCBiZSBsZWdpdCBvbmx5IGlmIGFwcGxpY2F0aW9uIHNlbmQgaW4KICAgICAvLyBhIGxvbmcgYnVyc3Qgb2YgbG9uZyBleHBvc3VyZSByZXF1ZXN0cy4KICAgICBpZiAobUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA+IGtNaW5XYXJuSW5mbGlnaHREdXJhdGlvbikgewpAQCAtMjg1Myw3ICszMDUzLDcgQEAKIAogICAgIEZsdXNoSW5mbGlnaHRSZXFTdGF0ZXMgc3RhdGVzIHsKICAgICAgICAgbUlkLCBtSW5GbGlnaHRMb2NrLCBtSW5GbGlnaHRNYXAsIG1Vc2VIYWxCdWZNYW5hZ2VyLAotICAgICAgICBsaXN0ZW5lciwgKnRoaXMsICptSW50ZXJmYWNlLCAqdGhpc307CisgICAgICAgIGxpc3RlbmVyLCAqdGhpcywgKm1JbnRlcmZhY2UsICp0aGlzLCBtU2Vzc2lvblN0YXRzQnVpbGRlcn07CiAKICAgICBjYW1lcmEzOjpmbHVzaEluZmxpZ2h0UmVxdWVzdHMoc3RhdGVzKTsKIH0KQEAgLTI4OTMsNiArMzA5MywxMCBAQAogICAgICAgICBtU3VwcG9ydE9mZmxpbmVQcm9jZXNzaW5nKHN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZykgewogICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCiAgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNyA9IGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM183LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM183ID0gY2FzdFJlc3VsdF8zXzc7CisgICAgfQogICAgIGF1dG8gY2FzdFJlc3VsdF8zXzYgPSBkZXZpY2U6OlYzXzY6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwogICAgIGlmIChjYXN0UmVzdWx0XzNfNi5pc09rKCkpIHsKICAgICAgICAgbUhpZGxTZXNzaW9uXzNfNiA9IGNhc3RSZXN1bHRfM182OwpAQCAtMjkyNiw2ICszMTMwLDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzcuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM182LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKQEAgLTI5MzQsNyArMzEzOSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKLSAgICAgICAgY2FtZXJhM19yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKKyAgICAgICAgY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdCB0ZW1wbGF0ZUlkLAogICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSB7CiAgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyIpOwogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjk2NiwyMiArMzE3MSwyMiBAQAogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZXJyOwogICAgIFJlcXVlc3RUZW1wbGF0ZSBpZDsKICAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVc6CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1BSRVZJRVc6CiAgICAgICAgICAgICBpZCA9IFJlcXVlc3RUZW1wbGF0ZTo6UFJFVklFVzsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpTVElMTF9DQVBUVVJFOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19SRUNPUkQ7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICBjYXNlIENBTUVSQV9URU1QTEFURV9WSURFT19TTkFQU0hPVDoKICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpWSURFT19TTkFQU0hPVDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgY2FzZSBDQU1FUkFfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzoKICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpaRVJPX1NIVVRURVJfTEFHOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9NQU5VQUw6CisgICAgICAgIGNhc2UgQ0FNRVJBX1RFTVBMQVRFX01BTlVBTDoKICAgICAgICAgICAgIGlkID0gUmVxdWVzdFRlbXBsYXRlOjpNQU5VQUw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTMwNDcsMzEgKzMyNTIsMzkgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAotICAgICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpIHsKICAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpjb25maWd1cmVTdHJlYW1zIik7CiAgICAgaWYgKCF2YWxpZCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKKyAgICBpZiAoY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uICYmIG1IaWRsU2Vzc2lvbl8zXzcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG11bHRpLXJlc29sdXRpb24gaW5wdXQgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICAvLyBDb252ZXJ0IHN0cmVhbSBjb25maWcgdG8gSElETAogICAgIHN0ZDo6c2V0PGludD4gYWN0aXZlU3RyZWFtczsKICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMjsKICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNDsKKyAgICBkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNzsKICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM18yLnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOwogICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZpZy0+bnVtX3N0cmVhbXM7IGkrKykgewogICAgICAgICBkZXZpY2U6OlYzXzI6OlN0cmVhbSAmZHN0M18yID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zW2ldOwogICAgICAgICBkZXZpY2U6OlYzXzQ6OlN0cmVhbSAmZHN0M180ID0gcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldOwotICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzcmMgPSBjb25maWctPnN0cmVhbXNbaV07CisgICAgICAgIGRldmljZTo6VjNfNzo6U3RyZWFtICZkc3QzXzcgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbXNbaV07CisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fdCAqc3JjID0gY29uZmlnLT5zdHJlYW1zW2ldOwogCiAgICAgICAgIENhbWVyYTNTdHJlYW0qIGNhbTNzdHJlYW0gPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYyk7CiAgICAgICAgIGNhbTNzdHJlYW0tPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIGludCBzdHJlYW1JZCA9IGNhbTNzdHJlYW0tPmdldElkKCk7CiAgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKICAgICAgICAgc3dpdGNoIChzcmMtPnN0cmVhbV90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9PVVRQVVQ6CiAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fSU5QVVQ6CisgICAgICAgICAgICBjYXNlIENBTUVSQV9TVFJFQU1fSU5QVVQ6CiAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6OklOUFVUOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTMwODQsOSArMzI5Nyw5IEBACiAgICAgICAgIGRzdDNfMi53aWR0aCA9IHNyYy0+d2lkdGg7CiAgICAgICAgIGRzdDNfMi5oZWlnaHQgPSBzcmMtPmhlaWdodDsKICAgICAgICAgZHN0M18yLnVzYWdlID0gbWFwVG9Db25zdW1lclVzYWdlKGNhbTNzdHJlYW0tPmdldFVzYWdlKCkpOwotICAgICAgICBkc3QzXzIucm90YXRpb24gPSBtYXBUb1N0cmVhbVJvdGF0aW9uKChjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKKyAgICAgICAgZHN0M18yLnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90KSBzcmMtPnJvdGF0aW9uKTsKICAgICAgICAgLy8gRm9yIEhpZGxTZXNzaW9uIHZlcnNpb24gMy41IG9yIG5ld2VyLCB0aGUgZm9ybWF0IGFuZCBkYXRhU3BhY2Ugc2VudAotICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRlbiBvbmVzLgorICAgICAgICAvLyB0byBIQUwgYXJlIG9yaWdpbmFsLCBub3QgdGhlIG92ZXJyaWRkZW4gb25lcy4KICAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPwogICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOwpAQCAtMzEwMSw3ICszMzE0LDE0IEBACiAgICAgICAgIGlmIChzcmMtPnBoeXNpY2FsX2NhbWVyYV9pZCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBkc3QzXzQucGh5c2ljYWxDYW1lcmFJZCA9IHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkOwogICAgICAgICB9Ci0KKyAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7CisgICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgeworICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQogICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CiAgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQogICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CkBAIC0zMTExLDE2ICszMzMxLDIyIEBACiAKICAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOwogICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCi0gICAgICAgICAgICAoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl9tb2RlX3QpIGNvbmZpZy0+b3BlcmF0aW9uX21vZGUsCisgICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCkgY29uZmlnLT5vcGVyYXRpb25fbW9kZSwKICAgICAgICAgICAgIC8qb3V0Ki8gJm9wZXJhdGlvbk1vZGUpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5vcGVyYXRpb25Nb2RlID0gb3BlcmF0aW9uTW9kZTsKICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgc2l6ZV90IHNlc3Npb25QYXJhbVNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc2Vzc2lvblBhcmFtcyk7CiAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNC5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCiAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAotICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpKTsKKyAgICAgICAgICAgIHNlc3Npb25QYXJhbVNpemUpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7CiAKICAgICAvLyBJbnZva2UgY29uZmlndXJlU3RyZWFtcwogICAgIGRldmljZTo6VjNfMzo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb247CkBAIC0zMTY3LDcgKzMzOTMsMTcgQEAKICAgICAgICAgICAgIH07CiAKICAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQotICAgIGlmIChtSGlkbFNlc3Npb25fM182ICE9IG51bGxwdHIpIHsKKyAgICBpZiAobUhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogdjMuNyBkZXZpY2UgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0gY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzctPmNvbmZpZ3VyZVN0cmVhbXNfM183KAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGNvbmZpZ1N0cmVhbTM2Q2IpOworICAgICAgICByZXMgPSBwb3N0cHJvY0NvbmZpZ1N0cmVhbTM2KGVycik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1IaWRsU2Vzc2lvbl8zXzYgIT0gbnVsbHB0cikgewogICAgICAgICBBTE9HVigiJXM6IHYzLjYgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgZGV2aWNlOjpWM181OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzU7CiAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzUudjNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CkBAIC0zMjQwLDcgKzM0NzYsNyBAQAogICAgIC8vIEFuZCBjb252ZXJ0IG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbiBmcm9tIEhJREwKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uZmlnLT5udW1fc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKmRzdCA9IGNvbmZpZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90ICpkc3QgPSBjb25maWctPnN0cmVhbXNbaV07CiAgICAgICAgIGludCBzdHJlYW1JZCA9IENhbWVyYTNTdHJlYW06OmNhc3QoZHN0KS0+Z2V0SWQoKTsKIAogICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKQEAgLTMyOTMsNyArMzUyOSw3IEBACiAgICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgIGlmIChkc3QtPnN0cmVhbV90eXBlID09IENBTUVSQV9TVFJFQU1fSU5QVVQpIHsKICAgICAgICAgICAgIGlmIChzcmMudjNfMi5wcm9kdWNlclVzYWdlICE9IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogSU5QVVQgc3RyZWFtcyBtdXN0IGhhdmUgMCBmb3IgcHJvZHVjZXIgdXNhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC0zMzE3LDcgKzM1NTMsMTQ3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25maWd1cmVJbmplY3RlZFN0cmVhbXMoCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBzZXNzaW9uUGFyYW1zLCBjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24qIGNvbmZpZywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcywKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNhbWVyYUNoYXJhY3RlcmlzdGljcykgeworICAgIEFUUkFDRV9OQU1FKCJJbmplY3Rpb25DYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKKyAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmIChjb25maWctPmlucHV0X2lzX211bHRpX3Jlc29sdXRpb24pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbmplY3Rpb24gY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBpbnB1dCAiCisgICAgICAgICAgICAgICAgInN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ29udmVydCBzdHJlYW0gY29uZmlnIHRvIEhJREwKKyAgICBzdGQ6OnNldDxpbnQ+IGFjdGl2ZVN0cmVhbXM7CisgICAgZGV2aWNlOjpWM18yOjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzI7CisgICAgZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQ7CisgICAgZGV2aWNlOjpWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzc7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfMi5zdHJlYW1zLnJlc2l6ZShjb25maWctPm51bV9zdHJlYW1zKTsKKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LnN0cmVhbXMucmVzaXplKGNvbmZpZy0+bnVtX3N0cmVhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtcy5yZXNpemUoY29uZmlnLT5udW1fc3RyZWFtcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25maWctPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgZGV2aWNlOjpWM18yOjpTdHJlYW0mIGRzdDNfMiA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXTsKKyAgICAgICAgZGV2aWNlOjpWM180OjpTdHJlYW0mIGRzdDNfNCA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXTsKKyAgICAgICAgZGV2aWNlOjpWM183OjpTdHJlYW0mIGRzdDNfNyA9IHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcuc3RyZWFtc1tpXTsKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV90KiBzcmMgPSBjb25maWctPnN0cmVhbXNbaV07CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbSogY2FtM3N0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qoc3JjKTsKKyAgICAgICAgY2FtM3N0cmVhbS0+c2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgaW50IHN0cmVhbUlkID0gY2FtM3N0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW1UeXBlOworICAgICAgICBzd2l0Y2ggKHNyYy0+c3RyZWFtX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IFN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX1NUUkVBTV9JTlBVVDoKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gU3RyZWFtVHlwZTo6SU5QVVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBjb25maWctPnN0cmVhbXNbaV0tPnN0cmVhbV90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZHN0M18yLmlkID0gc3RyZWFtSWQ7CisgICAgICAgIGRzdDNfMi5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgZHN0M18yLndpZHRoID0gc3JjLT53aWR0aDsKKyAgICAgICAgZHN0M18yLmhlaWdodCA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7CisgICAgICAgIGRzdDNfMi5yb3RhdGlvbiA9CisgICAgICAgICAgICAgICAgbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90KXNyYy0+cm90YXRpb24pOworICAgICAgICAvLyBGb3IgSGlkbFNlc3Npb24gdmVyc2lvbiAzLjUgb3IgbmV3ZXIsIHRoZSBmb3JtYXQgYW5kIGRhdGFTcGFjZSBzZW50CisgICAgICAgIC8vIHRvIEhBTCBhcmUgb3JpZ2luYWwsIG5vdCB0aGUgb3ZlcnJpZGRlbiBvbmVzLgorICAgICAgICBpZiAobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBkc3QzXzIuZm9ybWF0ID0gbWFwVG9QaXhlbEZvcm1hdChjYW0zc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzcmMtPmZvcm1hdCk7CisgICAgICAgICAgICBkc3QzXzIuZGF0YVNwYWNlID0KKyAgICAgICAgICAgICAgICAgICAgbWFwVG9IaWRsRGF0YXNwYWNlKGNhbTNzdHJlYW0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdDNfMi5mb3JtYXQgPSBtYXBUb1BpeGVsRm9ybWF0KHNyYy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKKyAgICAgICAgfQorICAgICAgICBkc3QzXzQudjNfMiA9IGRzdDNfMjsKKyAgICAgICAgZHN0M180LmJ1ZmZlclNpemUgPSBidWZmZXJTaXplc1tpXTsKKyAgICAgICAgaWYgKHNyYy0+cGh5c2ljYWxfY2FtZXJhX2lkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRzdDNfNC5waHlzaWNhbENhbWVyYUlkID0gc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQ7CisgICAgICAgIH0KKyAgICAgICAgZHN0M183LnYzXzQgPSBkc3QzXzQ7CisgICAgICAgIGRzdDNfNy5ncm91cElkID0gY2FtM3N0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICBkc3QzXzcuc2Vuc29yUGl4ZWxNb2Rlc1VzZWQucmVzaXplKHNyYy0+c2Vuc29yX3BpeGVsX21vZGVzX3VzZWQuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGludCBtb2RlIDogc3JjLT5zZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCkgeworICAgICAgICAgICAgZHN0M183LnNlbnNvclBpeGVsTW9kZXNVc2VkW2orK10gPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPihtb2RlKTsKKyAgICAgICAgfQorICAgICAgICBhY3RpdmVTdHJlYW1zLmluc2VydChzdHJlYW1JZCk7CisgICAgICAgIC8vIENyZWF0ZSBCdWZmZXIgSUQgbWFwIGlmIG5lY2Vzc2FyeQorICAgICAgICBtQnVmZmVyUmVjb3Jkcy50cnlDcmVhdGVCdWZmZXJDYWNoZShzdHJlYW1JZCk7CisgICAgfQorICAgIC8vIHJlbW92ZSBCdWZmZXJJZE1hcCBmb3IgZGVsZXRlZCBzdHJlYW1zCisgICAgbUJ1ZmZlclJlY29yZHMucmVtb3ZlSW5hY3RpdmVCdWZmZXJDYWNoZXMoYWN0aXZlU3RyZWFtcyk7CisKKyAgICBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpb25Nb2RlOworICAgIHJlcyA9IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICAoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCljb25maWctPm9wZXJhdGlvbl9tb2RlLAorICAgICAgICAgICAgLypvdXQqLyAmb3BlcmF0aW9uTW9kZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM183Lm9wZXJhdGlvbk1vZGUgPSBvcGVyYXRpb25Nb2RlOworICAgIHNpemVfdCBzZXNzaW9uUGFyYW1TaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNlc3Npb25QYXJhbXMpOworICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcub3BlcmF0aW9uTW9kZSA9IG9wZXJhdGlvbk1vZGU7CisgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zZXNzaW9uUGFyYW1zLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oc2Vzc2lvblBhcmFtcykpLAorICAgICAgICAgICAgc2Vzc2lvblBhcmFtU2l6ZSk7CisKKyAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQorICAgIGlmIChtSGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNy5zdHJlYW1Db25maWdDb3VudGVyID0gbU5leHRTdHJlYW1Db25maWdDb3VudGVyKys7CisgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSA9CisgICAgICAgICAgICAgICAgY29uZmlnLT5pbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworCisgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiByYXdNZXRhZGF0YSA9IGNhbWVyYUNoYXJhY3RlcmlzdGljcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBoaWRsQ2hhcnMgPSB7fTsKKyAgICAgICAgaGlkbENoYXJzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KHJhd01ldGFkYXRhKSksCisgICAgICAgICAgICAgICAgZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKSk7CisgICAgICAgIGNhbWVyYUNoYXJhY3RlcmlzdGljcy51bmxvY2socmF3TWV0YWRhdGEpOworCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6SUNhbWVyYUluamVjdGlvblNlc3Npb24+CisgICAgICAgICAgICAgICAgaGlkbEluamVjdGlvblNlc3Npb25fM183OworICAgICAgICBhdXRvIGNhc3RJbmplY3Rpb25SZXN1bHRfM183ID0KKyAgICAgICAgICAgICAgICBkZXZpY2U6OlYzXzc6OklDYW1lcmFJbmplY3Rpb25TZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb25fM183KTsKKyAgICAgICAgaWYgKGNhc3RJbmplY3Rpb25SZXN1bHRfM183LmlzT2soKSkgeworICAgICAgICAgICAgaGlkbEluamVjdGlvblNlc3Npb25fM183ID0gY2FzdEluamVjdGlvblJlc3VsdF8zXzc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgY2FzdEluamVjdGlvblJlc3VsdF8zXzcuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gZXJyID0gaGlkbEluamVjdGlvblNlc3Npb25fM183LT5jb25maWd1cmVJbmplY3Rpb25TdHJlYW1zKAorICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzcsIGhpZGxDaGFycyk7CisgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtSGlkbFNlc3Npb25fM183IGRvZXMgbm90IGV4aXN0LCB0aGUgbG93ZXN0IHZlcnNpb24gb2YgaW5qZWN0aW9uICIKKyAgICAgICAgICAgICAgICAic2Vzc2lvbiBpcyAzLjciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QsCiAgICAgICAgIC8qb3V0Ki9kZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXF1ZXN0KiBjYXB0dXJlUmVxdWVzdCwKICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgewpAQCAtMzM2Miw3ICszNzM4LDcgQEAKIAogICAgICAgICBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVycy5yZXNpemUocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgewotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKnNyYyA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaTsKICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciAmZHN0ID0gY2FwdHVyZVJlcXVlc3QtPm91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChzcmMtPnN0cmVhbSktPmdldElkKCk7CiAgICAgICAgICAgICBpZiAoc3JjLT5idWZmZXIgIT0gbnVsbHB0cikgewpAQCAtMzQyMCwxMSArMzc5NiwxNiBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKLSAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCkgewogICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cyIpOwogICAgIGlmICghdmFsaWQoKSkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogCiAgICAgc3A8ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gaGlkbFNlc3Npb25fM180OworICAgIHNwPGRldmljZTo6VjNfNzo6SUNhbWVyYURldmljZVNlc3Npb24+IGhpZGxTZXNzaW9uXzNfNzsKKyAgICBhdXRvIGNhc3RSZXN1bHRfM183ID0gZGV2aWNlOjpWM183OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzcuaXNPaygpKSB7CisgICAgICAgIGhpZGxTZXNzaW9uXzNfNyA9IGNhc3RSZXN1bHRfM183OworICAgIH0KICAgICBhdXRvIGNhc3RSZXN1bHRfM180ID0gZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKICAgICBpZiAoY2FzdFJlc3VsdF8zXzQuaXNPaygpKSB7CiAgICAgICAgIGhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwpAQCAtMzQzMiw4ICszODEzLDExIEBACiAKICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdD4gY2FwdHVyZVJlcXVlc3RzOwogICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM180OworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxkZXZpY2U6OlYzXzc6OkNhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdHNfM183OwogICAgIHNpemVfdCBiYXRjaFNpemUgPSByZXF1ZXN0cy5zaXplKCk7Ci0gICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzcucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgfSBlbHNlIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgewogICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180LnJlc2l6ZShiYXRjaFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNhcHR1cmVSZXF1ZXN0cy5yZXNpemUoYmF0Y2hTaXplKTsKQEAgLTM0NDMsNyArMzgyNywxMCBAQAogCiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBiYXRjaFNpemU7IGkrKykgewotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM183W2ldLnYzXzQudjNfMiwKKyAgICAgICAgICAgICAgICAgICAgLypvdXQqLyZoYW5kbGVzQ3JlYXRlZCwgLypvdXQqLyZpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXMgPSB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCiAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQsIC8qb3V0Ki8maW5mbGlnaHRCdWZmZXJzKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTM0NzQsOSArMzg2MSwxMSBAQAogCiAgICAgLy8gV3JpdGUgbWV0YWRhdGEgdG8gRk1RLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKLSAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogcmVxdWVzdCA9IHJlcXVlc3RzW2ldOworICAgICAgICBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIHJlcXVlc3QgPSByZXF1ZXN0c1tpXTsKICAgICAgICAgZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3Q7Ci0gICAgICAgIGlmIChoaWRsU2Vzc2lvbl8zXzQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0ID0gJmNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC52M18yOworICAgICAgICB9IGVsc2UgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdCA9ICZjYXB0dXJlUmVxdWVzdHNbaV07CkBAIC0zNTAzLDMzICszODkyLDQyIEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+Zm1xU2V0dGluZ3NTaXplID0gMHU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOworICAgICAgICAvLyBoaWRsIHNlc3Npb24gMy43IHNwZWNpZmljIGhhbmRsaW5nLgorICAgICAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0uaW5wdXRXaWR0aCA9IHJlcXVlc3QtPmlucHV0X3dpZHRoOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfN1tpXS5pbnB1dEhlaWdodCA9IHJlcXVlc3QtPmlucHV0X2hlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhpZGwgc2Vzc2lvbiAzLjcgYW5kIDMuNCBzcGVjaWZpYyBoYW5kbGluZy4KKyAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyIHx8IGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYVNldHRpbmc+JiBwaHlzaWNhbENhbWVyYVNldHRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgKGhpZGxTZXNzaW9uXzNfNyAhPSBudWxscHRyKSA/CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzdbaV0udjNfNC5waHlzaWNhbENhbWVyYVNldHRpbmdzIDoKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzOworICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5yZXNpemUocmVxdWVzdC0+bnVtX3BoeXNjYW1fc2V0dGluZ3MpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCByZXF1ZXN0LT5udW1fcGh5c2NhbV9zZXR0aW5nczsgaisrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3MgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2V0dGluZ3NTaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJlcXVlc3QtPnBoeXNjYW1fc2V0dGluZ3Nbal0pOwogICAgICAgICAgICAgICAgICAgICBpZiAobVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocmVxdWVzdC0+cGh5c2NhbV9zZXR0aW5nc1tqXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzU2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0c18zXzRbaV0ucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tqXS5zZXR0aW5ncy5yZXNpemUoMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc1NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gc2V0dGluZ3NTaXplOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBjb3VsZG4ndCB1dGlsaXplIGZtcSwgZmFsbGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnNldFRvRXh0ZXJuYWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShyZXF1ZXN0LT5waHlzY2FtX3NldHRpbmdzW2pdKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uZm1xU2V0dGluZ3NTaXplID0gMHU7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OwotICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdHNfM180W2ldLnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0uc2V0dGluZ3MucmVzaXplKDApOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLmZtcVNldHRpbmdzU2l6ZSA9IDB1OworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnNldHRpbmdzLnJlc2l6ZSgwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS5waHlzaWNhbENhbWVyYVNldHRpbmdzW2pdLnBoeXNpY2FsQ2FtZXJhSWQgPQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5waHlzY2FtX2lkW2pdOworICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Nbal0ucGh5c2ljYWxDYW1lcmFJZCA9IHJlcXVlc3QtPnBoeXNjYW1faWRbal07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTQwLDcgKzM5MzgsMTAgQEAKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgICpudW1SZXF1ZXN0UHJvY2Vzc2VkID0gbjsKICAgICAgICAgfTsKLSAgICBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICBpZiAoaGlkbFNlc3Npb25fM183ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM183LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM183KGNhcHR1cmVSZXF1ZXN0c18zXzcsIGNhY2hlc1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOworICAgIH0gZWxzZSBpZiAoaGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKICAgICAgICAgZXJyID0gaGlkbFNlc3Npb25fM180LT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3RfM180KGNhcHR1cmVSZXF1ZXN0c18zXzQsIGNhY2hlc1RvUmVtb3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2spOwogICAgIH0gZWxzZSB7CkBAIC0zNzU1LDEzICs0MTU2LDE1IEBACiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKLSAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKKyAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSkgOgogICAgICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAogICAgICAgICBtUGFyZW50KHBhcmVudCksCiAgICAgICAgIG1TdGF0dXNUcmFja2VyKHN0YXR1c1RyYWNrZXIpLAogICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1MaXN0ZW5lcihudWxscHRyKSwKICAgICAgICAgbUlkKGdldElkKHBhcmVudCkpLAorICAgICAgICBtRmlyc3RSZXBlYXRpbmcoZmFsc2UpLAogICAgICAgICBtUmVjb25maWd1cmVkKGZhbHNlKSwKICAgICAgICAgbURvUGF1c2UoZmFsc2UpLAogICAgICAgICBtUGF1c2VkKHRydWUpLApAQCAtMzc3MSw2ICs0MTc0LDggQEAKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAogICAgICAgICBtUm90YXRlQW5kQ3JvcE92ZXJyaWRlKEFORFJPSURfU0NBTEVSX1JPVEFURV9BTkRfQ1JPUF9OT05FKSwKKyAgICAgICAgbUNhbWVyYU11dGUoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfT0ZGKSwKKyAgICAgICAgbUNhbWVyYU11dGVDaGFuZ2VkKGZhbHNlKSwKICAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcigKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Tk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpLAogICAgICAgICBtUHJlcGFyZVZpZGVvU3RyZWFtKGZhbHNlKSwKQEAgLTM3NzgsOCArNDE4Myw5IEBACiAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeShrUmVxdWVzdExhdGVuY3lCaW5TaXplKSwKICAgICAgICAgbVNlc3Npb25QYXJhbUtleXMoc2Vzc2lvblBhcmFtS2V5cyksCiAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSwKLSAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewotICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgbVN1cHBvcnRDYW1lcmFNdXRlKHN1cHBvcnRDYW1lcmFNdXRlKXsKKyAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoIlJlcXVlc3RUaHJlYWQiKTsKIH0KIAogQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6flJlcXVlc3RUaHJlYWQoKSB7fQpAQCAtMzc5MiwxMSArNDE5OCwxMyBAQAogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNvbmZpZ3VyYXRpb25Db21wbGV0ZShib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zKSB7CisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXNzaW9uUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnNldDxTdHJpbmc4Pj4mIGdyb3VwSWRQaHlzaWNhbENhbWVyYU1hcCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUmVjb25maWd1cmVkID0gdHJ1ZTsKICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyA9IHNlc3Npb25QYXJhbXM7CisgICAgbUdyb3VwSWRQaHlzaWNhbENhbWVyYU1hcCA9IGdyb3VwSWRQaHlzaWNhbENhbWVyYU1hcDsKICAgICAvLyBQcmVwYXJlIHZpZGVvIHN0cmVhbSBmb3IgaGlnaCBzcGVlZCByZWNvcmRpbmcuCiAgICAgbVByZXBhcmVWaWRlb1N0cmVhbSA9IGlzQ29uc3RyYWluZWRIaWdoU3BlZWQ7CiAgICAgbUNvbnN0cmFpbmVkTW9kZSA9IGlzQ29uc3RyYWluZWRIaWdoU3BlZWQ7CkBAIC0zODkyLDYgKzQzMDAsNyBAQAogICAgICAgICAqbGFzdEZyYW1lTnVtYmVyID0gbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKICAgICB9CiAgICAgbVJlcGVhdGluZ1JlcXVlc3RzLmNsZWFyKCk7CisgICAgbUZpcnN0UmVwZWF0aW5nID0gdHJ1ZTsKICAgICBtUmVwZWF0aW5nUmVxdWVzdHMuaW5zZXJ0KG1SZXBlYXRpbmdSZXF1ZXN0cy5iZWdpbigpLAogICAgICAgICAgICAgcmVxdWVzdHMuYmVnaW4oKSwgcmVxdWVzdHMuZW5kKCkpOwogCkBAIC0zOTQ0LDE0ICs0MzUzLDE1IEBACiAgICAgICAgICAgICAgICAgIGl0ICE9IG1SZXF1ZXN0UXVldWUuZW5kKCk7ICsraXQpIHsKICAgICAgICAgICAgIC8vIEFib3J0IHRoZSBpbnB1dCBidWZmZXJzIGZvciByZXByb2Nlc3MgcmVxdWVzdHMuCiAgICAgICAgICAgICBpZiAoKCppdCktPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaW5wdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBjYW1lcmEzOjpTaXplIGlucHV0QnVmZmVyU2l6ZTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSAoKml0KS0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlc3BlY3RIYWxMaW1pdCovIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEJ1ZmZlclNpemUsIC8qcmVzcGVjdEhhbExpbWl0Ki8gZmFsc2UpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiAlZDogY291bGRuJ3QgZ2V0IGlucHV0IGJ1ZmZlciB3aGlsZSBjbGVhcmluZyB0aGUgcmVxdWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICByZXMgPSAoKml0KS0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJWQ6IGNvdWxkbid0IHJldHVybiBpbnB1dCBidWZmZXIgd2hpbGUgY2xlYXJpbmcgdGhlIHJlcXVlc3QgIgpAQCAtNDA1NSw3ICs0NDY1LDcgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKICAgICBzaXplX3QgYmF0Y2hTaXplID0gbU5leHRSZXF1ZXN0cy5zaXplKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+IHJlcXVlc3RzKGJhdGNoU2l6ZSk7CisgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4gcmVxdWVzdHMoYmF0Y2hTaXplKTsKICAgICB1aW50MzJfdCBudW1SZXF1ZXN0UHJvY2Vzc2VkID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgaSsrKSB7CiAgICAgICAgIHJlcXVlc3RzW2ldID0gJm1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKS5oYWxSZXF1ZXN0OwpAQCAtNDE1MiwzMyArNDU2MiwzNCBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVwZGF0ZU5leHRSZXF1ZXN0KE5leHRSZXF1ZXN0JiBuZXh0UmVxdWVzdCkgewogICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKLSAgICBpZiAobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7IC8vIERvbid0IHVwZGF0ZSBpZiB0aGV5IHdlcmUgdW5jaGFuZ2VkCisgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90JiBoYWxSZXF1ZXN0ID0gbmV4dFJlcXVlc3QuaGFsUmVxdWVzdDsKKyAgICBpZiAoaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7IC8vIERvbid0IHVwZGF0ZSBpZiB0aGV5IHdlcmUgdW5jaGFuZ2VkCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKIAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKGhhbFJlcXVlc3Quc2V0dGluZ3MpOwogICAgICAgICBtTGF0ZXN0UmVxdWVzdC5hY3F1aXJlKGNsb25lZCk7CiAKICAgICAgICAgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdC5jbGVhcigpOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5udW1fcGh5c2NhbV9zZXR0aW5nczsgaSsrKSB7Ci0gICAgICAgICAgICBjbG9uZWQgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5waHlzY2FtX3NldHRpbmdzW2ldKTsKLSAgICAgICAgICAgIG1MYXRlc3RQaHlzaWNhbFJlcXVlc3QuZW1wbGFjZShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnBoeXNjYW1faWRbaV0sCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBoYWxSZXF1ZXN0Lm51bV9waHlzY2FtX3NldHRpbmdzOyBpKyspIHsKKyAgICAgICAgICAgIGNsb25lZCA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShoYWxSZXF1ZXN0LnBoeXNjYW1fc2V0dGluZ3NbaV0pOworICAgICAgICAgICAgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdC5lbXBsYWNlKGhhbFJlcXVlc3QucGh5c2NhbV9pZFtpXSwKICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEoY2xvbmVkKSk7CiAgICAgICAgIH0KIAogICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBwYXJlbnQtPm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0LCBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKKyAgICBpZiAoaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7CiAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKLSAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LnNldHRpbmdzKTsKICAgICB9CiAKLSAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOworICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmaGFsUmVxdWVzdCk7CiB9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CkBAIC00Mzc0LDggKzQ3ODUsOCBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5leHRSZXF1ZXN0cy5zaXplKCk7IGkrKykgewogICAgICAgICBhdXRvJiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IGNhcHR1cmVSZXF1ZXN0ID0gbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3Q7Ci0gICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGhhbFJlcXVlc3QgPSAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdDsKLSAgICAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90Piogb3V0cHV0QnVmZmVycyA9ICZuZXh0UmVxdWVzdC5vdXRwdXRCdWZmZXJzOworICAgICAgICBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QqIGhhbFJlcXVlc3QgPSAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdDsKKyAgICAgICAgVmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+KiBvdXRwdXRCdWZmZXJzID0gJm5leHRSZXF1ZXN0Lm91dHB1dEJ1ZmZlcnM7CiAKICAgICAgICAgLy8gUHJlcGFyZSBhIHJlcXVlc3QgdG8gSEFMCiAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciA9IGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOwpAQCAtNDM5NCwxMCArNDgwNSwxMyBAQAogICAgICAgICBtUHJldlRyaWdnZXJzID0gdHJpZ2dlckNvdW50OwogCiAgICAgICAgIGJvb2wgcm90YXRlQW5kQ3JvcENoYW5nZWQgPSBvdmVycmlkZUF1dG9Sb3RhdGVBbmRDcm9wKGNhcHR1cmVSZXF1ZXN0KTsKKyAgICAgICAgYm9vbCB0ZXN0UGF0dGVybkNoYW5nZWQgPSBvdmVycmlkZVRlc3RQYXR0ZXJuKGNhcHR1cmVSZXF1ZXN0KTsKIAotICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCBpcyB0aGUgc2FtZSBhcyBsYXN0LCBvciB3ZSBoYWQgdHJpZ2dlcnMgbGFzdCB0aW1lCisgICAgICAgIC8vIElmIHRoZSByZXF1ZXN0IGlzIHRoZSBzYW1lIGFzIGxhc3QsIG9yIHdlIGhhZCB0cmlnZ2VycyBub3cgb3IgbGFzdCB0aW1lIG9yCisgICAgICAgIC8vIGNoYW5naW5nIG92ZXJyaWRlcyB0aGlzIHRpbWUKICAgICAgICAgYm9vbCBuZXdSZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbiB8fCByb3RhdGVBbmRDcm9wQ2hhbmdlZCkgJiYKKyAgICAgICAgICAgICAgICAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlQW5kQ3JvcENoYW5nZWQgfHwgdGVzdFBhdHRlcm5DaGFuZ2VkKSAmJgogICAgICAgICAgICAgICAgIC8vIFJlcXVlc3Qgc2V0dGluZ3MgYXJlIGFsbCB0aGUgc2FtZSB3aXRoaW4gb25lIGJhdGNoLCBzbyBvbmx5IHRyZWF0IHRoZSBmaXJzdAogICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgaW4gYSBiYXRjaCBhcyBuZXcKICAgICAgICAgICAgICAgICAhKGJhdGNoZWRSZXF1ZXN0ICYmIGkgPiAwKTsKQEAgLTQ0MDUsMzQgKzQ4MTksNTkgQEAKICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjYW1lcmFJZHNXaXRoWm9vbTsKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogSEFMIHdvcmthcm91bmQ6Ci0gICAgICAgICAgICAgKiBJbnNlcnQgYSBkdW1teSB0cmlnZ2VyIElEIGlmIGEgdHJpZ2dlciBpcyBzZXQgYnV0IG5vIHRyaWdnZXIgSUQgaXMKKyAgICAgICAgICAgICAqIEluc2VydCBhIGZha2UgdHJpZ2dlciBJRCBpZiBhIHRyaWdnZXIgaXMgc2V0IGJ1dCBubyB0cmlnZ2VyIElEIGlzCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHJlcyA9IGFkZER1bW15VHJpZ2dlcklkcyhjYXB0dXJlUmVxdWVzdCk7CisgICAgICAgICAgICByZXMgPSBhZGRGYWtlVHJpZ2dlcklkcyhjYXB0dXJlUmVxdWVzdCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGluc2VydCBkdW1teSB0cmlnZ2VyIElEcyAiCisgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGluc2VydCBmYWtlIHRyaWdnZXIgSURzICIKICAgICAgICAgICAgICAgICAgICAgICAgICIoY2FwdHVyZSByZXF1ZXN0ICVkLCBIQUwgZGV2aWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ29ycmVjdCBtZXRhZGF0YSByZWdpb25zIGZvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaWYgZW5hYmxlZAogICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBMaXN0PFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+OjppdGVyYXRvciBpdDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpdCA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzLmZpbmQoaXQtPmNhbWVyYUlkKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZVJlcXVlc3QtPm1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25zVXBkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHBhcmVudC0+bVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcnNbaXQtPmNhbWVyYUlkXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhcHR1cmVSZXF1ZXN0KCYoaXQtPm1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHNjYWxlciBjcm9wIHJlZ2lvbiBhbmQgbWV0ZXJpbmcgcmVnaW9ucyBmb3IgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkOiAlcyAoJWQpIiwgaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uc1VwZGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCBtZXRhZGF0YSByZWdpb25zIGZvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaWYgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGl0ID0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzLmZpbmQoaXQtPmNhbWVyYUlkKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1EaXN0b3J0aW9uTWFwcGVycy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnNbaXQtPmNhbWVyYUlkXS5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgbGVucyBkaXN0b3J0aW9uIGZvciByZXF1ZXN0ICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVSZXF1ZXN0LT5tRGlzdG9ydGlvbkNvcnJlY3Rpb25VcGRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnNbaXQtPmNhbWVyYUlkXS5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGl0LT5tZXRhZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIGNvcnJlY3QgY2FwdHVyZSByZXF1ZXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBsZW5zIGRpc3RvcnRpb24gZm9yIHJlcXVlc3QgJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1EaXN0b3J0aW9uQ29ycmVjdGlvblVwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTQ0NDMsMjEgKzQ4ODIsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZSA9IGl0LT5tZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNvdW50ID4gMCAmJiBlLmRhdGEuZlswXSAhPSAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVSZXF1ZXN0LT5tWm9vbVJhdGlvSXMxeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkc1dpdGhab29tLmluc2VydChpdC0+Y2FtZXJhSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBwYXJlbnQtPm1ab29tUmF0aW9NYXBwZXJzW2l0LT5jYW1lcmFJZF0udXBkYXRlQ2FwdHVyZVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igem9vbSByYXRpbyBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FwdHVyZVJlcXVlc3QtPm1ab29tUmF0aW9VcGRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tWm9vbVJhdGlvTWFwcGVyc1tpdC0+Y2FtZXJhSWRdLnVwZGF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVxdWVzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igem9vbSByYXRpbyBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVpvb21SYXRpb1VwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlUmVxdWVzdC0+bVJvdGF0ZUFuZENyb3BBdXRvKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlUmVxdWVzdC0+bVJvdGF0ZUFuZENyb3BBdXRvICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWNhcHR1cmVSZXF1ZXN0LT5tUm90YXRpb25BbmRDcm9wVXBkYXRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpdCA9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmVuZCgpOyBpdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBtYXBwZXIgPSBwYXJlbnQtPm1Sb3RhdGVBbmRDcm9wTWFwcGVycy5maW5kKGl0LT5jYW1lcmFJZCk7CkBAIC00NDcxLDYgKzQ5MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1Sb3RhdGlvbkFuZENyb3BVcGRhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ1MzAsMTUgKzQ5NzMsMTggQEAKICAgICAgICAgLy8gRmlsbCBpbiBidWZmZXJzCiAgICAgICAgIGlmIChjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmlucHV0X2J1ZmZlciA9ICZjYXB0dXJlUmVxdWVzdC0+bUlucHV0QnVmZmVyOworCisgICAgICAgICAgICBoYWxSZXF1ZXN0LT5pbnB1dF93aWR0aCA9IGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRCdWZmZXJTaXplLndpZHRoOworICAgICAgICAgICAgaGFsUmVxdWVzdC0+aW5wdXRfaGVpZ2h0ID0gY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlclNpemUuaGVpZ2h0OwogICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IDE7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBoYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgb3V0cHV0QnVmZmVycy0+aW5zZXJ0QXQoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QoKSwgMCwKKyAgICAgICAgb3V0cHV0QnVmZmVycy0+aW5zZXJ0QXQoY2FtZXJhX3N0cmVhbV9idWZmZXJfdCgpLCAwLAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCkpOwogICAgICAgICBoYWxSZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMtPmFycmF5KCk7Ci0gICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhczsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzZXQ8U3RyaW5nOD4+IHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhczsKIAogICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CkBAIC00NTkxLDEyICs1MDM3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEhBTCB3aWxsIHJlcXVlc3QgYnVmZmVyIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgYnVmZmVyID0gb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90JiBidWZmZXIgPSBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGopOwogICAgICAgICAgICAgICAgIGJ1ZmZlci5zdHJlYW0gPSBvdXRwdXRTdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0s7CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgICAgICAgICBidWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIG91dHB1dCBzdHJlYW0gYXMgdW5wcmVwYXJhYmxlIHRvIGJsb2NrIGNsaWVudHMgZnJvbSBjYWxsaW5nCisgICAgICAgICAgICAgICAgLy8gJ3ByZXBhcmUnIGFmdGVyIHRoaXMgcmVxdWVzdCByZWFjaGVzIENhbWVyYUhhbCBhbmQgYmVmb3JlIHRoZSByZXNwZWN0aXZlCisgICAgICAgICAgICAgICAgLy8gYnVmZmVycyBhcmUgcmVxdWVzdGVkLgorICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+bWFya1VucHJlcGFyYWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKQEAgLTQ2MjksMTQgKzUwNzksMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkID0gb3V0cHV0U3RyZWFtLT5nZXRQaHlzaWNhbENhbWVyYUlkKCk7Ci0KLSAgICAgICAgICAgIGlmICghcGh5c2ljYWxDYW1lcmFJZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBQaHlzaWNhbCBzdHJlYW0gaXNuJ3Qgc3VwcG9ydGVkIGZvciBpbnB1dCByZXF1ZXN0LgotICAgICAgICAgICAgICAgIGlmIChoYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgQ0xPR0UoIlBoeXNpY2FsIHN0cmVhbSBpcyBub3Qgc3VwcG9ydGVkIGZvciBpbnB1dCByZXF1ZXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLmluc2VydChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtR3JvdXBJZCA9IG91dHB1dFN0cmVhbS0+Z2V0SGFsU3RyZWFtR3JvdXBJZCgpOworICAgICAgICAgICAgaWYgKHN0cmVhbUdyb3VwSWQgIT0gLTEgJiYgbUdyb3VwSWRQaHlzaWNhbENhbWVyYU1hcC5jb3VudChzdHJlYW1Hcm91cElkKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLmluc2VydChtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwW3N0cmVhbUdyb3VwSWRdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXBoeXNpY2FsQ2FtZXJhSWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzLmluc2VydChzdGQ6OnNldDxTdHJpbmc4Pih7cGh5c2ljYWxDYW1lcmFJZH0pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycysrOwogICAgICAgICB9CkBAIC00NjUyLDE1ICs1MDk5LDIyIEBACiAgICAgICAgIH0KICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSA9IGZhbHNlOwogICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2V0dGluZ3MgPSBoYWxSZXF1ZXN0LT5zZXR0aW5nczsKKyAgICAgICAgYm9vbCBzaG91bGRVbmxvY2tTZXR0aW5ncyA9IGZhbHNlOworICAgICAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2hvdWxkVW5sb2NrU2V0dGluZ3MgPSB0cnVlOworICAgICAgICAgICAgc2V0dGluZ3MgPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKCFtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZSA9IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90KCk7Ci0gICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmZSk7CisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShzZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmZSk7CiAgICAgICAgICAgICBpZiAoKGUuY291bnQgPiAwKSAmJiAoZS5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKSkgewogICAgICAgICAgICAgICAgIGlzU3RpbGxDYXB0dXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oInN0aWxsIGNhcHR1cmUiLCBtTmV4dFJlcXVlc3RzW2ldLmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMLCAmZSk7CisgICAgICAgICAgICBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KHNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTCwgJmUpOwogICAgICAgICAgICAgaWYgKChlLmNvdW50ID4gMCkgJiYgKGUuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfRU5BQkxFX1pTTF9UUlVFKSkgewogICAgICAgICAgICAgICAgIGlzWnNsQ2FwdHVyZSA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC00NjY5LDE2ICs1MTIzLDIxIEBACiAgICAgICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAvKmhhc0lucHV0Ki9oYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjaywKLSAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKHNldHRpbmdzKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCiAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1Sb3RhdGVBbmRDcm9wQXV0bywgbVByZXZDYW1lcmFJZHNXaXRoWm9vbSwKICAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9LCBjYXB0dXJlUmVxdWVzdC0+bVJlcXVlc3RUaW1lTnMpOwogICAgICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgICAgICIsIGJ1cnN0SWQgPSAlIiBQUklkMzIgIi4iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmJ1cnN0SWQpOworCisgICAgICAgIGlmIChzaG91bGRVbmxvY2tTZXR0aW5ncykgeworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKHNldHRpbmdzKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byByZWdpc3RlciBuZXcgaW4tZmxpZ2h0IHJlcXVlc3Q6IgogICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTQ3ODUsNiArNTI0NCwxMiBAQAogICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZCA9IHN0cmVhbUlkczsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpyZXNldFBpcGVsaW5lRHJhaW4oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIHBsKG1QYXVzZUxvY2spOworICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7Cit9CisKIHZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2xlYXJQcmV2aW91c1JlcXVlc3QoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtUHJldlJlcXVlc3QuY2xlYXIoKTsKQEAgLTQ4MzMsNiArNTI5OCwxNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0Q2FtZXJhTXV0ZShpbnQzMl90IG11dGVNb2RlKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtVHJpZ2dlck11dGV4KTsKKyAgICBpZiAobXV0ZU1vZGUgIT0gbUNhbWVyYU11dGUpIHsKKyAgICAgICAgbUNhbWVyYU11dGUgPSBtdXRlTW9kZTsKKyAgICAgICAgbUNhbWVyYU11dGVDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1JbkZsaWdodExvY2spOwpAQCAtNDg0MSw3ICs1MzE2LDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCwKLSAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqaGFsUmVxdWVzdCkgeworICAgICAgICBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QgKmhhbFJlcXVlc3QpIHsKICAgICBpZiAoKHJlcXVlc3QgPT0gbnVsbHB0cikgfHwgKGhhbFJlcXVlc3QgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJlcXVlc3QhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNDg3Niw4ICs1MzUxLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdCA9IG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0OwotICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBoYWxSZXF1ZXN0ID0gJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3Q7Ci0gICAgICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4qIG91dHB1dEJ1ZmZlcnMgPSAmbmV4dFJlcXVlc3Qub3V0cHV0QnVmZmVyczsKKyAgICAgICAgY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiBoYWxSZXF1ZXN0ID0gJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3Q7CisgICAgICAgIFZlY3RvcjxjYW1lcmFfc3RyZWFtX2J1ZmZlcl90Piogb3V0cHV0QnVmZmVycyA9ICZuZXh0UmVxdWVzdC5vdXRwdXRCdWZmZXJzOwogCiAgICAgICAgIGlmIChoYWxSZXF1ZXN0LT5zZXR0aW5ncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS51bmxvY2soaGFsUmVxdWVzdC0+c2V0dGluZ3MpOwpAQCAtNDg4Niw3ICs1MzYxLDcgQEAKICAgICAgICAgY2xlYW51cFBoeXNpY2FsU2V0dGluZ3MoY2FwdHVyZVJlcXVlc3QsIGhhbFJlcXVlc3QpOwogCiAgICAgICAgIGlmIChjYXB0dXJlUmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRCdWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlci5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRCdWZmZXIpOwogICAgICAgICB9CiAKQEAgLTQ5MDAsNyArNTM3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGFjcXVpcmVGZW5jZSk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuYWNxdWlyZV9mZW5jZSA9IC0xOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKQEAgLTQ5NTAsNyArNTQyNSw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0ID0gY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCgpOworICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QgPSBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QoKTsKICAgICBuZXh0UmVxdWVzdC5zdWJtaXR0ZWQgPSBmYWxzZTsKICAgICBtTmV4dFJlcXVlc3RzLmFkZChuZXh0UmVxdWVzdCk7CiAKQEAgLTQ5NjQsNyArNTQzOSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0LmhhbFJlcXVlc3QgPSBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KCk7CisgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0LmhhbFJlcXVlc3QgPSBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QoKTsKICAgICAgICAgYWRkaXRpb25hbFJlcXVlc3Quc3VibWl0dGVkID0gZmFsc2U7CiAgICAgICAgIG1OZXh0UmVxdWVzdHMuYWRkKGFkZGl0aW9uYWxSZXF1ZXN0KTsKICAgICB9CkBAIC00OTg5LDYgKzU0NjQsMTcgQEAKICAgICAgICAgICAgIC8vIGxpc3QuIEd1YXJhbnRlZXMgYSBjb21wbGV0ZSBpbi1zZXF1ZW5jZSBzZXQgb2YgY2FwdHVyZXMgdG8KICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLgogICAgICAgICAgICAgY29uc3QgUmVxdWVzdExpc3QgJnJlcXVlc3RzID0gbVJlcGVhdGluZ1JlcXVlc3RzOworICAgICAgICAgICAgaWYgKG1GaXJzdFJlcGVhdGluZykgeworICAgICAgICAgICAgICAgIG1GaXJzdFJlcGVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlcXVlc3QgOiByZXF1ZXN0cykgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcmVwZWF0aW5nIHJlcXVlc3RzLCBvdmVycmlkZSB0aW1lc3RhbXAgcmVxdWVzdCB1c2luZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBhIHJlcXVlc3QgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVxdWVzdCBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgb3JpZ2luYWwgcmVwZWF0aW5nIHJlcXVlc3Qgd2lsbCBoYXZlIGFuIG9sZAorICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZCB0aW1lc3RhbXAuCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm1SZXF1ZXN0VGltZU5zID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlcXVlc3RMaXN0Ojpjb25zdF9pdGVyYXRvciBmaXJzdFJlcXVlc3QgPQogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy5iZWdpbigpOwogICAgICAgICAgICAgbmV4dFJlcXVlc3QgPSAqZmlyc3RSZXF1ZXN0OwpAQCAtNTA3Myw3ICs1NTU5LDggQEAKICAgICAgICAgLy8gU2luY2UgUmVxdWVzdFRocmVhZDo6Y2xlYXIoKSByZW1vdmVzIGJ1ZmZlcnMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAogICAgICAgICAvLyBnZXQgdGhlIHJpZ2h0IGJ1ZmZlciBoZXJlIGJlZm9yZSB1bmxvY2tpbmcgbVJlcXVlc3RMb2NrCiAgICAgICAgIGlmIChuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcyA9IG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyKCZuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIHJlcyA9IG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyKCZuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAmbmV4dFJlcXVlc3QtPm1JbnB1dEJ1ZmZlclNpemUpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBpbnB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KICAgICAgICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgcXVldWUgb3Igb3RoZXIgcHJvZHVjZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCkBAIC01MzEzLDI2ICs1ODAwLDI2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjphZGREdW1teVRyaWdnZXJJZHMoCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjphZGRGYWtlVHJpZ2dlcklkcygKICAgICAgICAgY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KSB7CiAgICAgLy8gVHJpZ2dlciBJRCAwIGhhZCBzcGVjaWFsIG1lYW5pbmcgaW4gdGhlIEhBTDIgc3BlYywgc28gYXZvaWQgaXQgaGVyZQotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGR1bW15VHJpZ2dlcklkID0gMTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBmYWtlVHJpZ2dlcklkID0gMTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEgPSByZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhOwogCi0gICAgLy8gSWYgQUYgdHJpZ2dlciBpcyBhY3RpdmUsIGluc2VydCBhIGR1bW15IEFGIHRyaWdnZXIgSUQgaWYgbm9uZSBhbHJlYWR5CisgICAgLy8gSWYgQUYgdHJpZ2dlciBpcyBhY3RpdmUsIGluc2VydCBhIGZha2UgQUYgdHJpZ2dlciBJRCBpZiBub25lIGFscmVhZHkKICAgICAvLyBleGlzdHMKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYWZUcmlnZ2VyID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUik7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGFmSWQgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lEKTsKICAgICBpZiAoYWZUcmlnZ2VyLmNvdW50ID4gMCAmJgogICAgICAgICAgICAgYWZUcmlnZ2VyLmRhdGEudThbMF0gIT0gQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSURMRSAmJgogICAgICAgICAgICAgYWZJZC5jb3VudCA9PSAwKSB7Ci0gICAgICAgIHJlcyA9IG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRCwgJmR1bW15VHJpZ2dlcklkLCAxKTsKKyAgICAgICAgcmVzID0gbWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELCAmZmFrZVRyaWdnZXJJZCwgMSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gSWYgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGlzIGFjdGl2ZSwgaW5zZXJ0IGEgZHVtbXkgcHJlY2FwdHVyZSB0cmlnZ2VyIElECisgICAgLy8gSWYgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGlzIGFjdGl2ZSwgaW5zZXJ0IGEgZmFrZSBwcmVjYXB0dXJlIHRyaWdnZXIgSUQKICAgICAvLyBpZiBub25lIGFscmVhZHkgZXhpc3RzCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHBjVHJpZ2dlciA9CiAgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIpOwpAQCAtNTM0MSw3ICs1ODI4LDcgQEAKICAgICAgICAgICAgIHBjVHJpZ2dlci5kYXRhLnU4WzBdICE9IEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfSURMRSAmJgogICAgICAgICAgICAgcGNJZC5jb3VudCA9PSAwKSB7CiAgICAgICAgIHJlcyA9IG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKLSAgICAgICAgICAgICAgICAmZHVtbXlUcmlnZ2VySWQsIDEpOworICAgICAgICAgICAgICAgICZmYWtlVHJpZ2dlcklkLCAxKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICB9CiAKQEAgLTUzNzQsNiArNTg2MSw3NSBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpvdmVycmlkZVRlc3RQYXR0ZXJuKAorICAgICAgICBjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcXVlc3QpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKCFtU3VwcG9ydENhbWVyYU11dGUpIHJldHVybiBmYWxzZTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1UcmlnZ2VyTXV0ZXgpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKKyAgICBpbnQzMl90IHRlc3RQYXR0ZXJuTW9kZSA9IHJlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZTsKKyAgICBpbnQzMl90IHRlc3RQYXR0ZXJuRGF0YVs0XSA9IHsKKyAgICAgICAgcmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzBdLAorICAgICAgICByZXF1ZXN0LT5tT3JpZ2luYWxUZXN0UGF0dGVybkRhdGFbMV0sCisgICAgICAgIHJlcXVlc3QtPm1PcmlnaW5hbFRlc3RQYXR0ZXJuRGF0YVsyXSwKKyAgICAgICAgcmVxdWVzdC0+bU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzNdCisgICAgfTsKKworICAgIGlmIChtQ2FtZXJhTXV0ZSAhPSBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERV9PRkYpIHsKKyAgICAgICAgdGVzdFBhdHRlcm5Nb2RlID0gbUNhbWVyYU11dGU7CisgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVswXSA9IDA7CisgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVsxXSA9IDA7CisgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVsyXSA9IDA7CisgICAgICAgIHRlc3RQYXR0ZXJuRGF0YVszXSA9IDA7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhID0gcmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YTsKKworICAgIGF1dG8gdGVzdFBhdHRlcm5FbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUpOworICAgIGlmICh0ZXN0UGF0dGVybkVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBpZiAodGVzdFBhdHRlcm5FbnRyeS5kYXRhLmkzMlswXSAhPSB0ZXN0UGF0dGVybk1vZGUpIHsKKyAgICAgICAgICAgIHRlc3RQYXR0ZXJuRW50cnkuZGF0YS5pMzJbMF0gPSB0ZXN0UGF0dGVybk1vZGU7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSwKKyAgICAgICAgICAgICAgICAmdGVzdFBhdHRlcm5Nb2RlLCAxKTsKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgfQorCisgICAgYXV0byB0ZXN0UGF0dGVybkNvbG9yID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSk7CisgICAgaWYgKHRlc3RQYXR0ZXJuQ29sb3IuY291bnQgPj0gNCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHRlc3RQYXR0ZXJuQ29sb3IuZGF0YS5pMzJbaV0gIT0gdGVzdFBhdHRlcm5EYXRhW2ldKSB7CisgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5Db2xvci5kYXRhLmkzMltpXSA9IHRlc3RQYXR0ZXJuRGF0YVtpXTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSwKKyAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEsIDQpOworICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6c2V0SGFsSW50ZXJmYWNlKAorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSkgeworICAgIGlmIChuZXdIYWxJbnRlcmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IFRoZSBuZXdIYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1JbnRlcmZhY2UgPSBuZXdIYWxJbnRlcmZhY2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIC8qKgogICogUHJlcGFyZXJUaHJlYWQgaW5uZXIgY2xhc3MgbWV0aG9kcwogICovCkBAIC01NjA3LDcgKzYxNjMsNyBAQAogCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIG1TdGF0dXNUcmFja2VyID0gc3RhdHVzVHJhY2tlcjsKLSAgICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgiQnVmZmVyUmVxdWVzdFNNIik7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC01OTk5LDQgKzY1NTUsODAgQEAKICAgICByZXR1cm4gbVJlcXVlc3RUaHJlYWQtPnNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3Iocm90YXRlQW5kQ3JvcFZhbHVlKTsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpzdXBwb3J0c0NhbWVyYU11dGUoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICByZXR1cm4gbVN1cHBvcnRDYW1lcmFNdXRlOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpzZXRDYW1lcmFNdXRlKGJvb2wgZW5hYmxlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBpZiAobVJlcXVlc3RUaHJlYWQgPT0gbnVsbHB0ciB8fCAhbVN1cHBvcnRDYW1lcmFNdXRlKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaW50MzJfdCBtdXRlTW9kZSA9CisgICAgICAgICAgICAhZW5hYmxlZCAgICAgICAgICAgICAgICAgICAgICA/IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRiA6CisgICAgICAgICAgICBtU3VwcG9ydFRlc3RQYXR0ZXJuU29saWRDb2xvciA/IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX1NPTElEX0NPTE9SIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfQkxBQ0s7CisgICAgcmV0dXJuIG1SZXF1ZXN0VGhyZWFkLT5zZXRDYW1lcmFNdXRlKG11dGVNb2RlKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5qZWN0Q2FtZXJhKGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKSB7CisgICAgQUxPR0koIiVzIEluamVjdGlvbiBjYW1lcmE6IGluamVjdGVkQ2FtSWQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSk7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworCisgICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7CisgICAgaWYgKG1JbmplY3Rpb25NZXRob2RzLT5pc0luamVjdGluZygpKSB7CisgICAgICAgIGlmIChpbmplY3RlZENhbUlkID09IG1JbmplY3Rpb25NZXRob2RzLT5nZXRJbmplY3RlZENhbUlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5zdG9wSW5qZWN0aW9uKCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RvcCB0aGUgaW5qZWN0aW9uIGNhbWVyYSEgcmV0ICE9IE5PX0VSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3Rpb25Jbml0aWFsaXplKGluamVjdGVkQ2FtSWQsIG1hbmFnZXIsIHRoaXMpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaW5qZWN0aW9uIGNhbWVyYSEgcmV0ICE9IE5PX0VSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiBpbmplY3Rpb25Db25maWc7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGluamVjdGlvbkJ1ZmZlclNpemVzOworICAgIG1JbmplY3Rpb25NZXRob2RzLT5nZXRJbmplY3Rpb25Db25maWcoJmluamVjdGlvbkNvbmZpZywgJmluamVjdGlvbkJ1ZmZlclNpemVzKTsKKyAgICAvLyBXaGVuIHRoZSBzZWNvbmQgZGlzcGxheSBvZiBhbmRyb2lkIGlzIGNhc3QgdG8gdGhlIHJlbW90ZSBkZXZpY2UsIGFuZCB0aGUgb3BlbmVkIGNhbWVyYSBpcworICAgIC8vIGFsc28gY2FzdCB0byB0aGUgc2Vjb25kIGRpc3BsYXksIGluIHRoaXMgY2FzZSwgYmVjYXVzZSB0aGUgY2FtZXJhIGhhcyBjb25maWd1cmVkIHRoZSBzdHJlYW1zCisgICAgLy8gYXQgdGhpcyB0aW1lLCB3ZSBjYW4gZGlyZWN0bHkgY2FsbCBpbmplY3RDYW1lcmEoKSB0byByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEgd2l0aAorICAgIC8vIGluamVjdGlvbiBjYW1lcmEuCisgICAgaWYgKG1PcGVyYXRpbmdNb2RlID49IDAgJiYgaW5qZWN0aW9uQ29uZmlnLm51bV9zdHJlYW1zID4gMAorICAgICAgICAgICAgICAgICYmIGluamVjdGlvbkJ1ZmZlclNpemVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgQUxPR1YoIiVzOiBUaGUgb3BlbmVkIGNhbWVyYSBpcyBkaXJlY3RseSBjYXN0IHRvIHRoZSByZW1vdGUgZGV2aWNlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJlcyA9IG1JbmplY3Rpb25NZXRob2RzLT5pbmplY3RDYW1lcmEoCisgICAgICAgICAgICAgICAgaW5qZWN0aW9uQ29uZmlnLCBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW4ndCBmaW5pc2ggaW5qZWN0IGNhbWVyYSBwcm9jZXNzISIpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6c3RvcEluamVjdGlvbigpIHsKKyAgICBBTE9HSSgiJXM6IEluamVjdGlvbiBjYW1lcmE6IHN0b3BJbmplY3Rpb24iLCBfX0ZVTkNUSU9OX18pOworICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CisgICAgcmV0dXJuIG1JbmplY3Rpb25NZXRob2RzLT5zdG9wSW5qZWN0aW9uKCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IDQwOGYxZjkuLjM5NzE0ZjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy42L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgpAQCAtNDksMTMgKzUwLDIyIEBACiAjaW5jbHVkZSAiZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuaCIKICNpbmNsdWRlICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaCIKKyNpbmNsdWRlICJkZXZpY2UzL1VIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlci5oIgogI2luY2x1ZGUgImRldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0SW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCiAjaW5jbHVkZSAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5oIgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX2pwZWdfYmxvYl90OwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX3JlcXVlc3RfdGVtcGxhdGU7Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2J1ZmZlcl90OwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90OwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6Q0FNRVJBX1RFTVBMQVRFX0NPVU5UOwogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNjQsNyArNzQsNiBAQAogCiBjbGFzcyBDYW1lcmEzU3RyZWFtOwogY2xhc3MgQ2FtZXJhM1pzbFN0cmVhbTsKLWNsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U7CiBjbGFzcyBDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOwogCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCkBAIC04MSw3ICs5MCw3IEBACiAgICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6Rmx1c2hCdWZmZXJJbnRlcmZhY2UgewogICBwdWJsaWM6CiAKLSAgICBleHBsaWNpdCBDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkKTsKKyAgICBleHBsaWNpdCBDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkLCBib29sIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNEZXZpY2UoKTsKIApAQCAtMTIyLDIxICsxMzEsMjYgQEAKICAgICAvLyBhbmQgZmluaXNoIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgb3V0cHV0IHN0cmVhbWluZy4KICAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOworCiAgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAogICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMgPSBudWxscHRyLAogICAgICAgICAgICAgaW50IHN0cmVhbVNldElkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCi0gICAgICAgICAgICBib29sIGlzU2hhcmVkID0gZmFsc2UsIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwKSBvdmVycmlkZTsKKyAgICAgICAgICAgIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDApIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbiwKICAgICAgICAgICAgIGludCAqaWQpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3QgZ2V0U3RyZWFtSW5mbyhpbnQgaWQsIFN0cmVhbUluZm8gKnN0cmVhbUluZm8pIG92ZXJyaWRlOwpAQCAtMTQ2LDE0ICsxNjAsMTQgQEAKIAogICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsCiAgICAgICAgICAgICBpbnQgb3BlcmF0aW5nTW9kZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFKSkKLSAgICAgICAgICAgIG92ZXJyaWRlOworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdDo6Q0FNRVJBX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSBvdmVycmlkZTsKIAogICAgIHZvaWQgZ2V0T2ZmbGluZVN0cmVhbUlkcyhzdGQ6OnZlY3RvcjxpbnQ+ICpvZmZsaW5lU3RyZWFtSWRzKSBvdmVycmlkZTsKIAotICAgIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoY2FtZXJhX3JlcXVlc3RfdGVtcGxhdGVfdCB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIG92ZXJyaWRlOwogCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gdGhlIGlkbGUgc3RhdGUgb24gc3VjY2VzcwogICAgIHN0YXR1c190IHdhaXRVbnRpbERyYWluZWQoKSBvdmVycmlkZTsKQEAgLTE4MCw3ICsxOTQsNyBAQAogCiAgICAgc3NpemVfdCBnZXRKcGVnQnVmZmVyU2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSBjb25zdCBvdmVycmlkZTsKICAgICBzc2l6ZV90IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgc3NpemVfdCBnZXRSYXdPcGFxdWVCdWZmZXJTaXplKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdDsKKyAgICBzc2l6ZV90IGdldFJhd09wYXF1ZUJ1ZmZlclNpemUoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGJvb2wgbWF4UmVzb2x1dGlvbikgY29uc3Q7CiAKICAgICAvLyBNZXRob2RzIGNhbGxlZCBieSBzdWJjbGFzc2VzCiAgICAgdm9pZCAgICAgICAgICAgICBub3RpZnlTdGF0dXMoYm9vbCBpZGxlKTsgLy8gdXBkYXRlcyBmcm9tIFN0YXR1c1RyYWNrZXIKQEAgLTIzMSwxMCArMjQ1LDM3IEBACiAgICAgc3RhdHVzX3Qgc2V0Um90YXRlQW5kQ3JvcEF1dG9CZWhhdmlvcigKICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX3JvdGF0ZV9hbmRfY3JvcF90IHJvdGF0ZUFuZENyb3BWYWx1ZSk7CiAKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIGNhbWVyYSBtdXRpbmcgKHByb2R1Y2luZyBibGFjay1vbmx5IG91dHB1dCkgaXMgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQ2FsbGluZyBzZXRDYW1lcmFNdXRlKHRydWUpIHdoZW4gdGhpcyByZXR1cm5zIGZhbHNlIHdpbGwgcmV0dXJuIGFuCisgICAgICogSU5WQUxJRF9PUEVSQVRJT04gZXJyb3IuCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c0NhbWVyYU11dGUoKTsKKworICAgIC8qKgorICAgICAqIE11dGUgdGhlIGNhbWVyYS4KKyAgICAgKgorICAgICAqIFdoZW4gbXV0ZWQsIGJsYWNrIGltYWdlIGRhdGEgaXMgb3V0cHV0IG9uIGFsbCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRDYW1lcmFNdXRlKGJvb2wgZW5hYmxlZCk7CisKICAgICAvLyBHZXQgdGhlIHN0YXR1cyB0cmFja2VlciBmb3IgdGhlIGNhbWVyYSBkZXZpY2UKICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBnZXRTdGF0dXNUcmFja2VyKCkgeyByZXR1cm4gbVN0YXR1c1RyYWNrZXI7IH0KIAogICAgIC8qKgorICAgICAqIFRoZSBpbmplY3Rpb24gY2FtZXJhIHNlc3Npb24gdG8gcmVwbGFjZSB0aGUgaW50ZXJuYWwgY2FtZXJhCisgICAgICogc2Vzc2lvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpbmplY3RDYW1lcmEoY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIHJlc3RvcmUgdG8gaW50ZXJuYWwgY2FtZXJhIHNlc3Npb24uCisgICAgICovCisgICAgc3RhdHVzX3Qgc3RvcEluamVjdGlvbigpOworCisgICAgLyoqCiAgICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCiAgICAgICovCiAgICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwpAQCAtMjQyLDkgKzI4Myw5IEBACiAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UpOwogICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgbWFwVG9Db25zdW1lclVzYWdlKHVpbnQ2NF90IHVzYWdlKTsKICAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1Sb3RhdGlvbiBtYXBUb1N0cmVhbVJvdGF0aW9uKAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgotICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgc3RhdGljIHN0YXR1c190IG1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAogICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKICAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7CiAgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKApAQCAtMjU1LDcgKzI5Niw2IEBACiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwogCiAgIHByaXZhdGU6Ci0KICAgICBzdGF0dXNfdCBkaXNjb25uZWN0SW1wbCgpOwogCiAgICAgLy8gaW50ZXJuYWwgdHlwZWRlZnMKQEAgLTI3NSw3ICszMTUsNyBAQAogCiAgICAgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFRyaWdnZXI7CiAgICAgLy8gbWluaW1hbCBqcGVnIGJ1ZmZlciBzaXplOiAyNTZLQiArIGJsb2IgaGVhZGVyCi0gICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgc3RhdGljIGNvbnN0IHNzaXplX3QgICAgICAga01pbkpwZWdCdWZmZXJTaXplID0gMjU2ICogMTAyNCArIHNpemVvZihjYW1lcmFfanBlZ19ibG9iX3QpOwogICAgIC8vIENvbnN0YW50IHRvIHVzZSBmb3Igc3RyZWFtIElEIHdoZW4gb25lIGRvZXNuJ3QgZXhpc3QKICAgICBzdGF0aWMgY29uc3QgaW50ICAgICAgICAgICBOT19TVFJFQU0gPSAtMTsKIApAQCAtMzMwLDE4ICszNzAsMjUgQEAKICAgICAgICAgLy8gQ2FsbHMgaW50byB0aGUgSEFMIGludGVyZmFjZQogCiAgICAgICAgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgcmVxdWVzdFRlbXBsYXRlCi0gICAgICAgIHN0YXR1c190IGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0U2V0dGluZ3MoY2FtZXJhM19yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKKyAgICAgICAgc3RhdHVzX3QgY29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncyhjYW1lcmFfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gY2FtZXJhX21ldGFkYXRhX3QgKipyZXF1ZXN0VGVtcGxhdGUpOwogICAgICAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAotICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsCisgICAgICAgICAgICAgICAgLyppbm91dCovIGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbl90ICpjb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcyk7CiAKKyAgICAgICAgLy8gVGhlIGluamVjdGlvbiBjYW1lcmEgY29uZmlndXJlcyB0aGUgc3RyZWFtcyB0byBoYWwuCisgICAgICAgIHN0YXR1c190IGNvbmZpZ3VyZUluamVjdGVkU3RyZWFtcygKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3QqIGNvbmZpZywKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjYW1lcmFDaGFyYWN0ZXJpc3RpY3MpOworCiAgICAgICAgIC8vIFdoZW4gdGhlIGNhbGwgc3VjY2VlZHMsIHRoZSBvd25lcnNoaXAgb2YgYWNxdWlyZSBmZW5jZXMgaW4gcmVxdWVzdHMgaXMgdHJhbnNmZXJyZWQgdG8KICAgICAgICAgLy8gSGFsSW50ZXJmYWNlLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBzZW5kIHRoZSBmZW5jZSB0bwogICAgICAgICAvLyBIQUwgcHJvY2VzcyBhbmQgY2xvc2UgdGhlIEZEIGluIGNhbWVyYXNlcnZlciBwcm9jZXNzLiBXaGVuIHRoZSBjYWxsIGZhaWxzLCB0aGUgb3duZXJzaGlwCiAgICAgICAgIC8vIG9mIHRoZSBhY3F1aXJlIGZlbmNlIHN0aWxsIGJlbG9uZ3MgdG8gdGhlIGNhbGxlci4KICAgICAgICAgc3RhdHVzX3QgcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKAotICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLAogICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCk7CiAgICAgICAgIHN0YXR1c190IGZsdXNoKCk7CiAgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKQEAgLTM5NywxMiArNDQ0LDE0IEBACiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjYgb3IgbmV3ZXIKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM182OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNjsKKyAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNyBvciBuZXdlcgorICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM183OwogCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gbVJlcXVlc3RNZXRhZGF0YVF1ZXVlOwogCi0gICAgICAgIC8vIFRoZSBvdXRwdXQgSElETCByZXF1ZXN0IHN0aWxsIGRlcGVuZHMgb24gaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdAotICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90IGJlZm9yZSBvdXRwdXQgSElETCByZXF1ZXN0Ci0gICAgICAgIHN0YXR1c190IHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAorICAgICAgICAvLyBUaGUgb3V0cHV0IEhJREwgcmVxdWVzdCBzdGlsbCBkZXBlbmRzIG9uIGlucHV0IGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdAorICAgICAgICAvLyBEbyBub3QgZnJlZSBpbnB1dCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKICAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogb3V0LAogICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCiAgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycyk7CkBAIC00NDIsMTUgKzQ5MSwxMyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1TdXBwb3J0TmF0aXZlWm9vbVJhdGlvOwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbERldmljZUluZm9NYXA7CiAKLSAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbQ0FNRVJBM19URU1QTEFURV9DT1VOVF07CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW0NBTUVSQV9URU1QTEFURV9DT1VOVF07CiAKICAgICBzdHJ1Y3QgU2l6ZSB7CiAgICAgICAgIHVpbnQzMl90IHdpZHRoOwogICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CiAgICAgICAgIGV4cGxpY2l0IFNpemUodWludDMyX3QgdyA9IDAsIHVpbnQzMl90IGggPSAwKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQogICAgIH07Ci0gICAgLy8gTWFwIGZyb20gZm9ybWF0IHRvIHNpemUuCi0gICAgVmVjdG9yPFNpemU+ICAgICAgICAgICAgICAgbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXM7CiAKICAgICBlbnVtIFN0YXR1cyB7CiAgICAgICAgIFNUQVRVU19FUlJPUiwKQEAgLTQ3MSwxMCArNTE4LDE1IEBACiAKICAgICBjYW1lcmEzOjpTdHJlYW1TZXQgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzSW5wdXRTdHJlYW1NdWx0aVJlc29sdXRpb247CisgICAgU2Vzc2lvblN0YXRzQnVpbGRlciAgICAgICAgbVNlc3Npb25TdGF0c0J1aWxkZXI7CisgICAgLy8gTWFwIGZyb20gc3RyZWFtIGdyb3VwIElEIHRvIHBoeXNpY2FsIGNhbWVyYXMgYmFja2luZyB0aGUgc3RyZWFtIGdyb3VwCisgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzZXQ8U3RyaW5nOD4+IG1Hcm91cElkUGh5c2ljYWxDYW1lcmFNYXA7CisKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFN0cmVhbUlkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1OZWVkQ29uZmlnOwogCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbUR1bW15U3RyZWFtSWQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgbUZha2VTdHJlYW1JZDsKIAogICAgIC8vIFdoZXRoZXIgdG8gc2VuZCBzdGF0ZSB1cGRhdGVzIHVwc3RyZWFtCiAgICAgLy8gUGF1c2Ugd2hlbiBkb2luZyB0cmFuc3BhcmVudCByZWNvbmZpZ3VyYXRpb24KQEAgLTUwMSw3ICs1NTMsOCBAQAogICAgICAgcHVibGljOgogICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdCAgICAgICAgICBtU2V0dGluZ3NMaXN0OwogICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiAgICAgICAgICBtSW5wdXRTdHJlYW07Ci0gICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcjsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAgICAgICAgICAgICAgbUlucHV0QnVmZmVyOworICAgICAgICBjYW1lcmEzOjpTaXplICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJTaXplOwogICAgICAgICBWZWN0b3I8c3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICAgICAgU3VyZmFjZU1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dFN1cmZhY2VzOwpAQCAtNTE3LDYgKzU3MCwyOSBAQAogICAgICAgICAvLyBvdmVycmlkaW5nIG9mIFJPVEFURV9BTkRfQ1JPUCB2YWx1ZSBhbmQgYWRqdXN0bWVudCBvZiBjb29yZGluYXRlcwogICAgICAgICAvLyBpbiBzZXZlcmFsIG90aGVyIGNvbnRyb2xzIGluIGJvdGggdGhlIHJlcXVlc3QgYW5kIHRoZSByZXN1bHQKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdGF0ZUFuZENyb3BBdXRvOworICAgICAgICAvLyBPcmlnaW5hbCB2YWx1ZSBvZiBURVNUX1BBVFRFUk5fTU9ERSBhbmQgREFUQSBzbyB0aGF0IHRoZXkgY2FuIGJlCisgICAgICAgIC8vIHJlc3RvcmVkIHdoZW4gc2Vuc29yIG11dGluZyBpcyB0dXJuZWQgb2ZmCisgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PcmlnaW5hbFRlc3RQYXR0ZXJuTW9kZTsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdpbmFsVGVzdFBhdHRlcm5EYXRhWzRdOworCisgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBjYXB0dXJlIHJlcXVlc3QgaGFzIGl0cyB6b29tIHJhdGlvIHNldCB0byAxLjB4IGJlZm9yZQorICAgICAgICAvLyB0aGUgZnJhbWV3b3JrIG92ZXJyaWRlcyBpdCBmb3IgY2FtZXJhIEhBTCBjb25zdW1wdGlvbi4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVpvb21SYXRpb0lzMXg7CisgICAgICAgIC8vIFRoZSBzeXN0ZW1UaW1lIHRpbWVzdGFtcCB3aGVuIHRoZSByZXF1ZXN0IGlzIGNyZWF0ZWQuCisgICAgICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXF1ZXN0VGltZU5zOworCisKKyAgICAgICAgLy8gV2hldGhlciB0aGlzIGNhcHR1cmUgcmVxdWVzdCdzIGRpc3RvcnRpb24gY29ycmVjdGlvbiB1cGRhdGUgaGFzCisgICAgICAgIC8vIGJlZW4gZG9uZS4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3RvcnRpb25Db3JyZWN0aW9uVXBkYXRlZCA9IGZhbHNlOworICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FwdHVyZSByZXF1ZXN0J3Mgcm90YXRpb24gYW5kIGNyb3AgdXBkYXRlIGhhcyBiZWVuCisgICAgICAgIC8vIGRvbmUuCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3RhdGlvbkFuZENyb3BVcGRhdGVkID0gZmFsc2U7CisgICAgICAgIC8vIFdoZXRoZXIgdGhpcyBjYXB0dXJlIHJlcXVlc3QncyB6b29tIHJhdGlvIHVwZGF0ZSBoYXMgYmVlbiBkb25lLgorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtWm9vbVJhdGlvVXBkYXRlZCA9IGZhbHNlOworICAgICAgICAvLyBXaGV0aGVyIHRoaXMgbWF4IHJlc29sdXRpb24gY2FwdHVyZSByZXF1ZXN0J3MgIGNyb3AgLyBtZXRlcmluZyByZWdpb24gdXBkYXRlIGhhcyBiZWVuCisgICAgICAgIC8vIGRvbmUuCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25zVXBkYXRlZCA9IGZhbHNlOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCkBAIC01MjUsNyArNjAxLDcgQEAKICAgICBzdGF0dXNfdCBjb252ZXJ0TWV0YWRhdGFMaXN0VG9SZXF1ZXN0TGlzdExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IExpc3Q8Y29uc3QgUGh5c2ljYWxDYW1lcmFTZXR0aW5nc0xpc3Q+ICZtZXRhZGF0YUxpc3QsCiAgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8Y29uc3QgU3VyZmFjZU1hcD4gJnN1cmZhY2VNYXBzLAotICAgICAgICAgICAgYm9vbCByZXBlYXRpbmcsCisgICAgICAgICAgICBib29sIHJlcGVhdGluZywgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgUmVxdWVzdExpc3QgKnJlcXVlc3RMaXN0KTsKIApAQCAtNjY4LDE1ICs3NDQsMTUgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgY2FuY2VsU3RyZWFtc0NvbmZpZ3VyYXRpb25Mb2NrZWQoKTsKIAogICAgIC8qKgotICAgICAqIEFkZCBhIGR1bW15IHN0cmVhbSB0byB0aGUgY3VycmVudCBzdHJlYW0gc2V0IGFzIGEgd29ya2Fyb3VuZCBmb3IKKyAgICAgKiBBZGQgYSBmYWtlIHN0cmVhbSB0byB0aGUgY3VycmVudCBzdHJlYW0gc2V0IGFzIGEgd29ya2Fyb3VuZCBmb3IKICAgICAgKiBub3QgYWxsb3dpbmcgMCBzdHJlYW1zIGluIHRoZSBjYW1lcmEgSEFMIHNwZWMuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICAgIGFkZER1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZEZha2VTdHJlYW1Mb2NrZWQoKTsKIAogICAgIC8qKgotICAgICAqIFJlbW92ZSBhIGR1bW15IHN0cmVhbSBpZiB0aGUgY3VycmVudCBjb25maWcgaW5jbHVkZXMgcmVhbCBzdHJlYW1zLgorICAgICAqIFJlbW92ZSBhIGZha2Ugc3RyZWFtIGlmIHRoZSBjdXJyZW50IGNvbmZpZyBpbmNsdWRlcyByZWFsIHN0cmVhbXMuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICAgIHRyeVJlbW92ZUR1bW15U3RyZWFtTG9ja2VkKCk7CisgICAgc3RhdHVzX3QgICAgICAgICAgIHRyeVJlbW92ZUZha2VTdHJlYW1Mb2NrZWQoKTsKIAogICAgIC8qKgogICAgICAqIFNldCBkZXZpY2UgaW50byBhbiBlcnJvciBzdGF0ZSBkdWUgdG8gc29tZSBmYXRhbCBmYWlsdXJlLCBhbmQgc2V0IGFuCkBAIC03MDQsMTIgKzc4MCw2IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgIHRyeUxvY2tTcGluUmlnaHRSb3VuZChNdXRleCYgbG9jayk7CiAKICAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXJnZXN0IEpwZWcgcmVzb2x1dGlvbiAoaW4gYXJlYSkKLSAgICAgKiBSZXR1cm4gU2l6ZSgwLCAwKSBpZiBzdGF0aWMgbWV0YXRkYXRhIGlzIGludmFsaWQKLSAgICAgKi8KLSAgICBTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKCkgY29uc3Q7Ci0KLSAgICAvKioKICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBvZmZzZXQgYmV0d2VlbiBNT05PVE9OSUMgYW5kIEJPT1RUSU1FCiAgICAgICogdGltZXN0YW1wLgogICAgICAqLwpAQCAtNzQzLDcgKzgxMyw4IEBACiAgICAgICAgICAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKICAgICAgICAgICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwKICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCi0gICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCisgICAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0Q2FtZXJhTXV0ZSk7CiAgICAgICAgIH5SZXF1ZXN0VGhyZWFkKCk7CiAKICAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKTsKQEAgLTc1Miw3ICs4MjMsOCBAQAogICAgICAgICAgKiBDYWxsIGFmdGVyIHN0cmVhbSAocmUpLWNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkLgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCAgICAgY29uZmlndXJhdGlvbkNvbXBsZXRlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCwKLSAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2Vzc2lvblBhcmFtcyk7CisgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzZXQ8U3RyaW5nOD4+JiBncm91cElkUGh5c2ljYWxDYW1lcmFNYXApOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgb3IgY2xlYXIgdGhlIGxpc3Qgb2YgcmVwZWF0aW5nIHJlcXVlc3RzLiBEb2VzIG5vdCBibG9jawpAQCAtODMyLDYgKzkwNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB2b2lkIHNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKTsKKyAgICAgICAgdm9pZCByZXNldFBpcGVsaW5lRHJhaW4oKTsKIAogICAgICAgICBzdGF0dXNfdCBzd2l0Y2hUb09mZmxpbmUoCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHN0cmVhbXNUb0tlZXAsCkBAIC04NDQsNiArOTE3LDEwIEBACiAgICAgICAgIHN0YXR1c190IHNldFJvdGF0ZUFuZENyb3BBdXRvQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3Qgcm90YXRlQW5kQ3JvcFZhbHVlKTsKIAorICAgICAgICBzdGF0dXNfdCBzZXRDYW1lcmFNdXRlKGludDMyX3QgbXV0ZU1vZGUpOworCisgICAgICAgIHN0YXR1c190IHNldEhhbEludGVyZmFjZShzcDxIYWxJbnRlcmZhY2U+IG5ld0hhbEludGVyZmFjZSk7CisKICAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpAQCAtODYwLDExICs5MzcsMTUgQEAKIAogICAgICAgICAvLyBIQUwgd29ya2Fyb3VuZDogTWFrZSBzdXJlIGEgdHJpZ2dlciBJRCBhbHdheXMgZXhpc3RzIGlmCiAgICAgICAgIC8vIGEgdHJpZ2dlciBkb2VzCi0gICAgICAgIHN0YXR1c190ICAgICAgICAgICBhZGREdW1teVRyaWdnZXJJZHMoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KTsKKyAgICAgICAgc3RhdHVzX3QgICAgICAgICAgIGFkZEZha2VUcmlnZ2VySWRzKGNvbnN0IHNwPENhcHR1cmVSZXF1ZXN0PiAmcmVxdWVzdCk7CiAKICAgICAgICAgLy8gT3ZlcnJpZGUgcm90YXRlX2FuZF9jcm9wIGNvbnRyb2wgaWYgbmVlZGVkOyByZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdmFsdWUgd2FzIGNoYW5nZWQKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG92ZXJyaWRlQXV0b1JvdGF0ZUFuZENyb3AoY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KTsKIAorICAgICAgICAvLyBPdmVycmlkZSB0ZXN0X3BhdHRlcm4gY29udHJvbCBpZiBuZWVkZWQgZm9yIGNhbWVyYSBtdXRlOyByZXR1cm5zIHRydWUKKyAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgdmFsdWUgd2FzIGNoYW5nZWQKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG92ZXJyaWRlVGVzdFBhdHRlcm4oY29uc3Qgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXF1ZXN0KTsKKwogICAgICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVxdWVzdFRpbWVvdXQgPSA1MGU2OyAvLyA1MCBtcwogCiAgICAgICAgIC8vIFRPRE86IGRvZXMgdGhpcyBuZWVkIHRvIGJlIGFkanVzdGVkIGZvciBsb25nIGV4cG9zdXJlIHJlcXVlc3RzPwpAQCAtODczLDggKzk1NCw4IEBACiAgICAgICAgIC8vIFVzZWQgdG8gcHJlcGFyZSBhIGJhdGNoIG9mIHJlcXVlc3RzLgogICAgICAgICBzdHJ1Y3QgTmV4dFJlcXVlc3QgewogICAgICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdDsKLSAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgICAgICAgaGFsUmVxdWVzdDsKLSAgICAgICAgICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gb3V0cHV0QnVmZmVyczsKKyAgICAgICAgICAgIGNhbWVyYV9jYXB0dXJlX3JlcXVlc3RfdCAgICAgICBoYWxSZXF1ZXN0OworICAgICAgICAgICAgVmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnM7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZDsKICAgICAgICAgfTsKIApAQCAtOTAwLDcgKzk4MSw3IEBACiAKICAgICAgICAgLy8gUmVsZWFzZSBwaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MgYW5kIGNhbWVyYSBpZCByZXNvdXJjZXMuCiAgICAgICAgIHZvaWQgY2xlYW51cFBoeXNpY2FsU2V0dGluZ3Moc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgLypvdXQqL2NhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKmhhbFJlcXVlc3QpOworICAgICAgICAgICAgICAgIC8qb3V0Ki9jYW1lcmFfY2FwdHVyZV9yZXF1ZXN0X3QgKmhhbFJlcXVlc3QpOwogCiAgICAgICAgIC8vIFBhdXNlIGhhbmRsaW5nCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICB3YWl0SWZQYXVzZWQoKTsKQEAgLTk0Nyw2ICsxMDI4LDcgQEAKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1SZXF1ZXN0U3VibWl0dGVkU2lnbmFsOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcXVlc3RRdWV1ZTsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0czsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1GaXJzdFJlcGVhdGluZzsKICAgICAgICAgLy8gVGhlIG5leHQgYmF0Y2ggb2YgcmVxdWVzdHMgYmVpbmcgcHJlcHBlZCBmb3Igc3VibWlzc2lvbiB0byB0aGUgSEFMLCBubyBsb25nZXIKICAgICAgICAgLy8gb24gdGhlIHJlcXVlc3QgcXVldWUuIFJlYWQtb25seSBldmVuIHdpdGggbVJlcXVlc3RMb2NrIGhlbGQsIG91dHNpZGUKICAgICAgICAgLy8gb2YgdGhyZWFkTG9vcApAQCAtOTg2LDYgKzEwNjgsOCBAQAogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZDsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgIG1DdXJyZW50UHJlQ2FwdHVyZVRyaWdnZXJJZDsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfcm90YXRlX2FuZF9jcm9wX3QgbVJvdGF0ZUFuZENyb3BPdmVycmlkZTsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG1DYW1lcmFNdXRlOyAvLyAwID0gbm8gbXV0ZSwgb3RoZXJ3aXNlIHRoZSBURVNUX1BBVFRFUk5fTU9ERSB0byB1c2UKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1DYW1lcmFNdXRlQ2hhbmdlZDsKIAogICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgbVJlcGVhdGluZ0xhc3RGcmFtZU51bWJlcjsKIApAQCAtMTAwMCw3ICsxMDg0LDEwIEBACiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiAgICBtU2Vzc2lvblBhcmFtS2V5czsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zOwogCisgICAgICAgIHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6c2V0PFN0cmluZzg+PiBtR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwOworCiAgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcjsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgIG1TdXBwb3J0Q2FtZXJhTXV0ZTsKICAgICB9OwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCkBAIC0xMDE5LDkgKzExMDYsMTEgQEAKIAogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4mIHBoeXNpY2FsQ2FtZXJhSWRzLAogICAgICAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSwgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIGNhbWVyYUlkc1dpdGhab29tLCBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIG5zZWNzX3QgcmVxdWVzdFRpbWVOcyk7CiAKICAgICAvKioKICAgICAgKiBUcmFja2luZyBmb3IgaWRsZSBkZXRlY3Rpb24KQEAgLTExNDEsNiArMTIzMCwxMiBAQAogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6Wm9vbVJhdGlvTWFwcGVyPiBtWm9vbVJhdGlvTWFwcGVyczsKIAogICAgIC8qKgorICAgICAqIFVIUiByZXF1ZXN0IGNyb3AgLyBtZXRlcmluZyByZWdpb24gbWFwcGVyIHN1cHBvcnQKKyAgICAgKi8KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6OlVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcj4KKyAgICAgICAgICAgIG1VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXJzOworCisgICAgLyoqCiAgICAgICogUm90YXRlQW5kQ3JvcCBtYXBwZXIgc3VwcG9ydAogICAgICAqLwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6Um90YXRlQW5kQ3JvcE1hcHBlcj4gbVJvdGF0ZUFuZENyb3BNYXBwZXJzOwpAQCAtMTI1MCw2ICsxMzQ1LDg1IEBACiAKICAgICAvLyBXaGV0aGVyIEhBTCBzdXBwb3J0cyBvZmZsaW5lIHByb2Nlc3NpbmcgY2FwYWJpbGl0eS4KICAgICBib29sIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBmYWxzZTsKKworICAgIC8vIFdoZXRoZXIgdGhlIEhBTCBzdXBwb3J0cyBjYW1lcmEgbXV0aW5nIHZpYSB0ZXN0IHBhdHRlcm4KKyAgICBib29sIG1TdXBwb3J0Q2FtZXJhTXV0ZSA9IGZhbHNlOworICAgIC8vIFdoZXRoZXIgdGhlIEhBTCBzdXBwb3J0cyBTT0xJRF9DT0xPUiBvciBCTEFDSyBpZiBtU3VwcG9ydENhbWVyYU11dGUgaXMgdHJ1ZQorICAgIGJvb2wgbVN1cHBvcnRUZXN0UGF0dGVyblNvbGlkQ29sb3IgPSBmYWxzZTsKKworICAgIC8vIFdoZXRoZXIgdGhlIGNhbWVyYSBmcmFtZXdvcmsgb3ZlcnJpZGVzIHRoZSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIGZvcgorICAgIC8vIHBlcmZvcm1hbmNlIGNsYXNzLgorICAgIGJvb2wgbU92ZXJyaWRlRm9yUGVyZkNsYXNzOworCisgICAgLy8gSW5qZWN0aW9uIGNhbWVyYSByZWxhdGVkIG1ldGhvZHMuCisgICAgY2xhc3MgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50KTsKKworICAgICAgICB+Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMoKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBpbmplY3Rpb24gY2FtZXJhIGFuZCBnZW5lcmF0ZSBhbiBoYWwgaW50ZXJmYWNlLgorICAgICAgICBzdGF0dXNfdCBpbmplY3Rpb25Jbml0aWFsaXplKAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGluamVjdGVkQ2FtSWQsIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gbWFuYWdlciwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yIDo6SUNhbWVyYURldmljZUNhbGxiYWNrPiYKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2spOworCisgICAgICAgIC8vIEluamVjdGlvbiBjYW1lcmEgd2lsbCByZXBsYWNlIHRoZSBpbnRlcm5hbCBjYW1lcmEgYW5kIGNvbmZpZ3VyZSBzdHJlYW1zCisgICAgICAgIC8vIHdoZW4gZGV2aWNlIGlzIElETEUgYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgc3RhdHVzX3QgaW5qZWN0Q2FtZXJhKAorICAgICAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiYgaW5qZWN0aW9uQ29uZmlnLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpOworCisgICAgICAgIC8vIFN0b3AgdGhlIGluamVjdGlvbiBjYW1lcmEgYW5kIHN3aXRjaCBiYWNrIHRvIGJhY2t1cCBoYWwgaW50ZXJmYWNlLgorICAgICAgICBzdGF0dXNfdCBzdG9wSW5qZWN0aW9uKCk7CisKKyAgICAgICAgYm9vbCBpc0luamVjdGluZygpOworCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGdldEluamVjdGVkQ2FtSWQoKSBjb25zdDsKKworICAgICAgICB2b2lkIGdldEluamVjdGlvbkNvbmZpZygvKm91dCovIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiogaW5qZWN0aW9uQ29uZmlnLAorICAgICAgICAgICAgICAgIC8qb3V0Ki8gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc3RyZWFtcyBvZiBpbmplY3Rpb24gY2FtZXJhLCBpdCBuZWVkIHdhaXQgdW50aWwgdGhlCisgICAgICAgIC8vIG91dHB1dCBzdHJlYW1zIGFyZSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIHRvIHRoZSBvcmlnaW5hbCBjYW1lcmEgYmVmb3JlCisgICAgICAgIC8vIHByb2NlZWRpbmcuCisgICAgICAgIHN0YXR1c190IGluamVjdGlvbkNvbmZpZ3VyZVN0cmVhbXMoCisgICAgICAgICAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcyk7CisKKyAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgaW5qZWN0aW9uIGNhbWVyYSBhbmQgZGVsZXRlIHRoZSBoYWwgaW50ZXJmYWNlLgorICAgICAgICB2b2lkIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CisKKyAgICAgICAgLy8gVXNlIGluamVjdGlvbiBjYW1lcmEgaGFsIGludGVyZmFjZSB0byByZXBsYWNlIGFuZCBiYWNrdXAgb3JpZ2luYWwKKyAgICAgICAgLy8gY2FtZXJhIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHN0YXR1c190IHJlcGxhY2VIYWxJbnRlcmZhY2Uoc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgYm9vbCBrZWVwQmFja3VwKTsKKworICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiBtUGFyZW50OworCisgICAgICAgIC8vIEJhY2t1cCBvZiB0aGUgb3JpZ2luYWwgY2FtZXJhIGhhbCBpbnRlcmZhY2UuCisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gbUJhY2t1cEhhbEludGVyZmFjZTsKKworICAgICAgICAvLyBHZW5lcmF0ZWQgaW5qZWN0aW9uIGNhbWVyYSBoYWwgaW50ZXJmYWNlLgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbmplY3RlZENhbUhhbEludGVyZmFjZTsKKworICAgICAgICAvLyBDb3B5IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjYW1lcmEuCisgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiBtSW5qZWN0aW9uQ29uZmlnOworCisgICAgICAgIC8vIENvcHkgdGhlIGJ1ZmZlclNpemVzIG9mIHRoZSBvdXRwdXQgc3RyZWFtcyBvZiB0aGUgaW50ZXJuYWwgY2FtZXJhLgorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbUluamVjdGlvbkJ1ZmZlclNpemVzOworCisgICAgICAgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gaW5qZWN0aW9uIGNhbWVyYSBiZXR3ZWVuIGluaXRpYWxpemUgYW5kCisgICAgICAgIC8vIGRpc2Nvbm5lY3QuCisgICAgICAgIE11dGV4IG1JbmplY3Rpb25Mb2NrOworCisgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gY2FtZXJhIElELgorICAgICAgICBTdHJpbmc4IG1JbmplY3RlZENhbUlkOworICAgIH07CisgICAgc3A8Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM+IG1JbmplY3Rpb25NZXRob2RzOworCiB9OyAvLyBjbGFzcyBDYW1lcmEzRGV2aWNlCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDVkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzLmNwcApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjsKKworQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzKAorICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQpCisgICAgICAgIDogbVBhcmVudChwYXJlbnQpIHsKKyAgICBBTE9HVigiJXM6IENyZWF0ZWQgaW5qZWN0aW9uIGNhbWVyYSBtZXRob2RzIiwgX19GVU5DVElPTl9fKTsKK30KKworQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6On5DYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kcygpIHsKKyAgICBBTE9HVigiJXM6IFJlbW92ZWQgaW5qZWN0aW9uIGNhbWVyYSBtZXRob2RzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpbmplY3Rpb25EaXNjb25uZWN0SW1wbCgpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uSW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgaW5qZWN0ZWRDYW1JZCwgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mCisgICAgICAgICAgICAgICAgY2FsbGJhY2spIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKKworICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtYW5hZ2VyIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1JbmplY3RlZENhbUlkID0gaW5qZWN0ZWRDYW1JZDsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBBVFJBQ0VfQkVHSU4oIkluamVjdGlvbiBDYW1lcmFIYWw6Om9wZW5TZXNzaW9uIik7CisgICAgc3RhdHVzX3QgcmVzID0gbWFuYWdlci0+b3BlblNlc3Npb24oaW5qZWN0ZWRDYW1JZC5zdHJpbmcoKSwgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovICZzZXNzaW9uKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSBjb3VsZCBub3Qgb3BlbiBjYW1lcmEgc2Vzc2lvbjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZTsKKyAgICBhdXRvIHJlcXVlc3RRdWV1ZVJldCA9CisgICAgICAgIHNlc3Npb24tPmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZShbJnF1ZXVlXShjb25zdCBhdXRvJiBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICBxdWV1ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVxdWVzdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFxdWV1ZS0+aXNWYWxpZCgpIHx8IHF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlcXVlc3QgbWV0YWRhdGEgZm1xLCBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBpdCIpOworICAgICAgICAgICAgICAgIHF1ZXVlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHF1ZXVlIG9ud2FyZHMuCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmVxdWVzdFF1ZXVlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiSW5qZWN0aW9uIGNhbWVyYSB0cmFuc2FjdGlvbiBlcnJvciB3aGVuIGdldHRpbmcgcmVxdWVzdCBtZXRhZGF0YSBmbXE6ICIKKyAgICAgICAgICAgICAgICAiJXMsIG5vdCB1c2UgaXQiLCByZXF1ZXN0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiYgcmVzUXVldWUgPSBwYXJlbnQtPm1SZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIGF1dG8gcmVzdWx0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byYgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlc3VsdE1ldGFkYXRhUXVldWU+KGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbmplY3Rpb24gY2FtZXJhIEhBTCByZXR1cm5zIGVtcHR5IHJlc3VsdCBtZXRhZGF0YSBmbXEsIG5vdCB1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIml0Iik7CisgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBudWxscHRyOworICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgcmVzUXVldWUgb253YXJkcy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgaWYgKCFyZXN1bHRRdWV1ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIkluamVjdGlvbiBjYW1lcmEgdHJhbnNhY3Rpb24gZXJyb3Igd2hlbiBnZXR0aW5nIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSAiCisgICAgICAgICAgICAgICAgImZyb20gY2FtZXJhIHNlc3Npb246ICVzIiwgcmVzdWx0UXVldWVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBJRl9BTE9HVigpIHsKKyAgICAgICAgc2Vzc2lvbi0+aW50ZXJmYWNlQ2hhaW4oCisgICAgICAgICAgICAgICAgW10oOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VDaGFpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkluamVjdGlvbiBjYW1lcmEgc2Vzc2lvbiBpbnRlcmZhY2UgY2hhaW46Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGlmYWNlIDogaW50ZXJmYWNlQ2hhaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiICAlcyIsIGlmYWNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEFMT0dWKCIlczogSW5qZWN0aW9uIGNhbWVyYSBpbnRlcmZhY2UgPSBuZXcgSGFsSW50ZXJmYWNlKCkiLCBfX0ZVTkNUSU9OX18pOworICAgIG1JbmplY3RlZENhbUhhbEludGVyZmFjZSA9CisgICAgICAgICAgICBuZXcgSGFsSW50ZXJmYWNlKHNlc3Npb24sIHF1ZXVlLCBwYXJlbnQtPm1Vc2VIYWxCdWZNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcpOworICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IG1JbmplY3RlZENhbUhhbEludGVyZmFjZSBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0Q2FtZXJhKAorICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb24mIGluamVjdGlvbkNvbmZpZywKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBpbmplY3Rpb25CdWZmZXJTaXplcykgeworICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworICAgIG1JbmplY3Rpb25Db25maWcgPSBpbmplY3Rpb25Db25maWc7CisgICAgbUluamVjdGlvbkJ1ZmZlclNpemVzID0gaW5qZWN0aW9uQnVmZmVyU2l6ZXM7CisKKyAgICBpZiAobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gcGFyZW50LT5nZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKyAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOworICAgIGlmIChwYXJlbnQtPm1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICBBTE9HVigiJXM6IExldCB0aGUgZGV2aWNlIGJlIElETEUgYW5kIHRoZSByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHBhcmVudC0+bVBhdXNlU3RhdGVOb3RpZnkgPSB0cnVlOworICAgICAgICByZXMgPSBwYXJlbnQtPmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHBhdXNlIGNhcHR1cmVzIHRvIGluamVjdCBjYW1lcmEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgd2FzQWN0aXZlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IEluamVjdGlvbiBjYW1lcmE6IHJlcGxhY2VIYWxJbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOworICAgIHJlcyA9IHJlcGxhY2VIYWxJbnRlcmZhY2UobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlLCB0cnVlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlcGxhY2UgdGhlIG5ldyBIYWxJbnRlcmZhY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaW5qZWN0aW9uRGlzY29ubmVjdEltcGwoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBwYXJlbnQtPm1SZXF1ZXN0VGhyZWFkLT5zZXRIYWxJbnRlcmZhY2UobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCBuZXcgSGFsSW50ZXJmYWNlIGluIFJlcXVlc3RUaHJlYWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmVwbGFjZUhhbEludGVyZmFjZShtQmFja3VwSGFsSW50ZXJmYWNlLCBmYWxzZSk7CisgICAgICAgIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcGFyZW50LT5tTmVlZENvbmZpZyA9IHRydWU7CisgICAgcmVzID0gaW5qZWN0aW9uQ29uZmlndXJlU3RyZWFtcyhpbmplY3Rpb25Db25maWcsIGluamVjdGlvbkJ1ZmZlclNpemVzKTsKKyAgICBwYXJlbnQtPm1OZWVkQ29uZmlnID0gZmFsc2U7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiQ2FuJ3QgaW5qZWN0aW9uQ29uZmlndXJlU3RyZWFtcyBkZXZpY2UgZm9yIHN0cmVhbXM6ICAlZDogJXMgIgorICAgICAgICAgICAgICAgICIoJWQpIiwgcGFyZW50LT5tTmV4dFN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmVwbGFjZUhhbEludGVyZmFjZShtQmFja3VwSGFsSW50ZXJmYWNlLCBmYWxzZSk7CisgICAgICAgIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKHdhc0FjdGl2ZSkgeworICAgICAgICBBTE9HVigiJXM6IFJlc3RhcnRpbmcgYWN0aXZpdHkgdG8gaW5qZWN0IGNhbWVyYSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbQorICAgICAgICAvLyBjb25maWcuCisgICAgICAgIHBhcmVudC0+aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0FDVElWRSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6c3RvcEluamVjdGlvbigpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKKworICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgIGlmIChwYXJlbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHBhcmVudCBkb2VzIG5vdCBleGlzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gcGFyZW50LT5nZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKyAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOworICAgIGlmIChwYXJlbnQtPm1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkgeworICAgICAgICBBTE9HVigiJXM6IExldCB0aGUgZGV2aWNlIGJlIElETEUgYW5kIHRoZSByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHBhcmVudC0+bVBhdXNlU3RhdGVOb3RpZnkgPSB0cnVlOworICAgICAgICByZXMgPSBwYXJlbnQtPmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHBhdXNlIGNhcHR1cmVzIHRvIHN0b3AgaW5qZWN0aW9uISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHdhc0FjdGl2ZSA9IHRydWU7CisgICAgfQorCisgICAgcmVzID0gcmVwbGFjZUhhbEludGVyZmFjZShtQmFja3VwSGFsSW50ZXJmYWNlLCBmYWxzZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZXN0b3JlIHRoZSBiYWNrdXAgSGFsSW50ZXJmYWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGluamVjdGlvbkRpc2Nvbm5lY3RJbXBsKCk7CisKKyAgICBpZiAod2FzQWN0aXZlKSB7CisgICAgICAgIEFMT0dWKCIlczogUmVzdGFydGluZyBhY3Rpdml0eSB0byBzdG9wIGluamVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIC8vIFJldXNlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgYW5kIHNlc3Npb24gcGFyYW1ldGVycyBmb3IgbmV3IHN0cmVhbQorICAgICAgICAvLyBjb25maWcuCisgICAgICAgIHBhcmVudC0+aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0FDVElWRSk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitib29sIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjppc0luamVjdGluZygpIHsKKyAgICBpZiAobUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0RldmljZTo6Q2FtZXJhM0RldmljZUluamVjdGlvbk1ldGhvZHM6OmdldEluamVjdGVkQ2FtSWQoKQorICAgICAgICBjb25zdCB7CisgICAgcmV0dXJuIG1JbmplY3RlZENhbUlkOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2VJbmplY3Rpb25NZXRob2RzOjpnZXRJbmplY3Rpb25Db25maWcoCisgICAgICAgIC8qb3V0Ki8gY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uKiBpbmplY3Rpb25Db25maWcsCisgICAgICAgIC8qb3V0Ki8gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBpbmplY3Rpb25CdWZmZXJTaXplcykgeworICAgIGlmIChpbmplY3Rpb25Db25maWcgPT0gbnVsbHB0ciB8fCBpbmplY3Rpb25CdWZmZXJTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW5qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYXJndW1lbnRzIG11c3Qgbm90IGJlIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICppbmplY3Rpb25Db25maWcgPSBtSW5qZWN0aW9uQ29uZmlnOworICAgICppbmplY3Rpb25CdWZmZXJTaXplcyA9IG1JbmplY3Rpb25CdWZmZXJTaXplczsKK30KKworCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uQ29uZmlndXJlU3RyZWFtcygKKyAgICAgICAgY2FtZXJhMzo6Y2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uJiBpbmplY3Rpb25Db25maWcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgaW5qZWN0aW9uQnVmZmVyU2l6ZXMpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHN0YXR1c190IHJlcyA9IE5PX0VSUk9SOworCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogcGFyZW50IGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocGFyZW50LT5tT3BlcmF0aW5nTW9kZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgb3BlcmF0aW5nIG1vZGU6ICVkIiwgcGFyZW50LT5tT3BlcmF0aW5nTW9kZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU3RhcnQgY29uZmlndXJpbmcgdGhlIHN0cmVhbXMKKyAgICBBTE9HVigiJXM6IEluamVjdGlvbiBjYW1lcmEgJXM6IFN0YXJ0aW5nIHN0cmVhbSBjb25maWd1cmF0aW9uIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbUluamVjdGVkQ2FtSWQuc3RyaW5nKCkpOworCisgICAgcGFyZW50LT5tUHJlcGFyZXJUaHJlYWQtPnBhdXNlKCk7CisKKyAgICAvLyBEbyB0aGUgSEFMIGNvbmZpZ3VyYXRpb247IHdpbGwgcG90ZW50aWFsbHkgdG91Y2ggc3RyZWFtCisgICAgLy8gbWF4X2J1ZmZlcnMsIHVzYWdlLCBhbmQgcHJpdiBmaWVsZHMsIGFzIHdlbGwgYXMgZGF0YV9zcGFjZSBhbmQgZm9ybWF0CisgICAgLy8gZmllbGRzIGZvciBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGZvcm1hdHMuCisKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogc2Vzc2lvbkJ1ZmZlciA9IHBhcmVudC0+bVNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpOworICAgIHJlcyA9IG1JbmplY3RlZENhbUhhbEludGVyZmFjZS0+Y29uZmlndXJlSW5qZWN0ZWRTdHJlYW1zKAorICAgICAgICAgICAgc2Vzc2lvbkJ1ZmZlciwgJmluamVjdGlvbkNvbmZpZywgaW5qZWN0aW9uQnVmZmVyU2l6ZXMsCisgICAgICAgICAgICBwYXJlbnQtPm1EZXZpY2VJbmZvKTsKKyAgICBwYXJlbnQtPm1TZXNzaW9uUGFyYW1zLnVubG9jayhzZXNzaW9uQnVmZmVyKTsKKworICAgIGlmIChyZXMgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIC8vIEhBTCByZWplY3RlZCB0aGlzIHNldCBvZiBzdHJlYW1zIGFzIHVuc3VwcG9ydGVkLCBjbGVhbiB1cCBjb25maWcKKyAgICAgICAgLy8gYXR0ZW1wdCBhbmQgcmV0dXJuIHRvIHVuY29uZmlndXJlZCBzdGF0ZQorICAgICAgICBBTE9HRSgiU2V0IG9mIHJlcXVlc3RlZCBvdXRwdXRzIG5vdCBzdXBwb3J0ZWQgYnkgSEFMIik7CisgICAgICAgIHBhcmVudC0+Y2FuY2VsU3RyZWFtc0NvbmZpZ3VyYXRpb25Mb2NrZWQoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAvLyBTb21lIG90aGVyIGtpbmQgb2YgZXJyb3IgZnJvbSBjb25maWd1cmVfc3RyZWFtcyAtIHRoaXMgaXMgbm90CisgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbXMgd2l0aCBIQUw6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwKKyAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJlbnQtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgcGFyZW50LT5tT3V0cHV0U3RyZWFtc1tpXTsKKyAgICAgICAgbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlLT5vblN0cmVhbVJlQ29uZmlndXJlZChvdXRwdXRTdHJlYW0tPmdldElkKCkpOworICAgIH0KKworICAgIC8vIFJlcXVlc3QgdGhyZWFkIG5lZWRzIHRvIGtub3cgdG8gYXZvaWQgdXNpbmcgcmVwZWF0LWxhc3Qtc2V0dGluZ3MgcHJvdG9jb2wKKyAgICAvLyBhY3Jvc3MgY29uZmlndXJlX3N0cmVhbXMoKSBjYWxscworICAgIHBhcmVudC0+bVJlcXVlc3RUaHJlYWQtPmNvbmZpZ3VyYXRpb25Db21wbGV0ZSgKKyAgICAgICAgICAgIHBhcmVudC0+bUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uLCBwYXJlbnQtPm1TZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgcGFyZW50LT5tR3JvdXBJZFBoeXNpY2FsQ2FtZXJhTWFwKTsKKworICAgIHBhcmVudC0+aW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU1RBVFVTX0NPTkZJR1VSRUQpOworCisgICAgQUxPR1YoIiVzOiBJbmplY3Rpb24gY2FtZXJhICVzOiBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIG1JbmplY3RlZENhbUlkLnN0cmluZygpKTsKKworICAgIGF1dG8gcmMgPSBwYXJlbnQtPm1QcmVwYXJlclRocmVhZC0+cmVzdW1lKCk7CisKKyAgICBpZiAocmMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbmplY3Rpb24gY2FtZXJhICVzOiBQcmVwYXJlciB0aHJlYWQgZmFpbGVkIHRvIHJlc3VtZSEiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JbmplY3RlZENhbUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6aW5qZWN0aW9uRGlzY29ubmVjdEltcGwoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HSSgiJXM6IEluamVjdGlvbiBjYW1lcmEgZGlzY29ubmVjdCIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gbnVsbHB0cjsKKyAgICBIYWxJbnRlcmZhY2UqIGludGVyZmFjZSA9IG51bGxwdHI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtSW5qZWN0aW9uTG9jayk7CisgICAgICAgIGlmIChtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW50ZXJmYWNlID0gbUluamVjdGVkQ2FtSGFsSW50ZXJmYWNlLmdldCgpOworICAgICAgICAgICAgLy8gQ2FsbCBjbG9zZSB3aXRob3V0IGludGVybmFsIG11dGV4IGhlbGQsIGFzIHRoZSBIQUwgY2xvc2UgbWF5IG5lZWQKKyAgICAgICAgICAgIC8vIHRvIHdhaXQgb24gYXNzb3J0ZWQgY2FsbGJhY2tzLGV0YywgdG8gY29tcGxldGUgYmVmb3JlIGl0IGNhbgorICAgICAgICAgICAgLy8gcmV0dXJuLgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgIGludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKKyAgICAgICAgaWYgKG1JbmplY3RlZENhbUhhbEludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UtPmNsZWFyKCk7CisgICAgICAgICAgICBtSW5qZWN0ZWRDYW1IYWxJbnRlcmZhY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpDYW1lcmEzRGV2aWNlSW5qZWN0aW9uTWV0aG9kczo6cmVwbGFjZUhhbEludGVyZmFjZSgKKyAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBuZXdIYWxJbnRlcmZhY2UsIGJvb2wga2VlcEJhY2t1cCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1JbmplY3Rpb25Mb2NrKTsKKyAgICBpZiAobmV3SGFsSW50ZXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGUgbmV3SGFsSW50ZXJmYWNlIGRvZXMgbm90IGV4aXN0LCB0byBzdG9wIHJlcGxhY2luZy4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBwYXJlbnQgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChrZWVwQmFja3VwICYmIG1CYWNrdXBIYWxJbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBtQmFja3VwSGFsSW50ZXJmYWNlID0gcGFyZW50LT5tSW50ZXJmYWNlOworICAgIH0gZWxzZSBpZiAoIWtlZXBCYWNrdXApIHsKKyAgICAgICAgbUJhY2t1cEhhbEludGVyZmFjZSA9IG51bGxwdHI7CisgICAgfQorICAgIHBhcmVudC0+bUludGVyZmFjZSA9IG5ld0hhbEludGVyZmFjZTsKKworICAgIHJldHVybiBPSzsKK30KKworfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzcxNjAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1EdW1teVN0cmVhbSIKLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLSNpbmNsdWRlICJDYW1lcmEzRHVtbXlTdHJlYW0uaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgY2FtZXJhMyB7Ci0KLWNvbnN0IFN0cmluZzggQ2FtZXJhM0R1bW15U3RyZWFtOjpEVU1NWV9JRDsKLQotQ2FtZXJhM0R1bW15U3RyZWFtOjpDYW1lcmEzRHVtbXlTdHJlYW0oaW50IGlkKSA6Ci0gICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgRFVNTVlfV0lEVEgsIERVTU1ZX0hFSUdIVCwKLSAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIERVTU1ZX0ZPUk1BVCwgRFVNTVlfREFUQVNQQUNFLCBEVU1NWV9ST1RBVElPTiwKLSAgICAgICAgICAgICAgICBEVU1NWV9JRCkgewotCi19Ci0KLUNhbWVyYTNEdW1teVN0cmVhbTo6fkNhbWVyYTNEdW1teVN0cmVhbSgpIHsKLQotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKiwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHByb2R1Y2UgYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKLSAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgIG5zZWNzX3QsCi0gICAgICAgICAgICBib29sLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxGZW5jZT4qKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRHVtbXkgc3RyZWFtIGNhbm5vdCByZXR1cm4gYnVmZmVycyEiLCBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi12b2lkIENhbWVyYTNEdW1teVN0cmVhbTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKLSAgICAodm9pZCkgYXJnczsKLSAgICBTdHJpbmc4IGxpbmVzOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IER1bW15XG4iLCBtSWQpOwotICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKLQotICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnNldFRyYW5zZm9ybShpbnQpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIC8vIERvIG5vdGhpbmcKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZGV0YWNoQnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCkgewotICAgICh2b2lkKSBidWZmZXI7Ci0gICAgKHZvaWQpIGZlbmNlRmQ7Ci0gICAgLy8gRG8gbm90aGluZwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpjb25maWd1cmVRdWV1ZUxvY2tlZCgpIHsKLSAgICAvLyBEbyBub3RoaW5nCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKSB7Ci0gICAgbVN0YXRlID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgPyBTVEFURV9JTl9DT05GSUcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNUQVRFX0NPTlNUUlVDVEVEOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0R1bW15U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgewotICAgICp1c2FnZSA9IERVTU1ZX1VTQUdFOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBDYW1lcmEzRHVtbXlTdHJlYW06OmlzVmlkZW9TdHJlYW0oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENhbWVyYTNEdW1teVN0cmVhbTo6aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3QgLypzdXJmYWNlX2lkKi8pIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6ZHJvcEJ1ZmZlcnMoYm9vbCAvKmRyb3BwaW5nKi8pIHsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWNvbnN0IFN0cmluZzgmIENhbWVyYTNEdW1teVN0cmVhbTo6Z2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRFVNTVlfSUQ7Ci19Ci0KLXN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgLypjb25zdW1lcnMqLykgewotICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gZG9lc24ndCBzdXBwb3J0IHNldCBjb25zdW1lciBzdXJmYWNlISIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJi8qb3V0cHV0U3VyZmFjZXMqLywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICYvKm91dHB1dEluZm8qLywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJi8qcmVtb3ZlZFN1cmZhY2VJZHMqLywKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICogLypvdXRwdXRNYXAqLykgewotICAgIEFMT0dFKCIlczogdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY3ZWE1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAotI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19EVU1NWV9TVFJFQU1fSAotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCi0jaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgotI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGNhbWVyYTMgewotCi0vKioKLSAqIEEgZHVtbXkgb3V0cHV0IHN0cmVhbSBjbGFzcywgdG8gYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gbm8gdmFsaWQKLSAqIHN0cmVhbXMgYXJlIGNvbmZpZ3VyZWQgYnkgdGhlIGNsaWVudC4KLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgY2FtZXJhIEhBTCB2My4yIG9yIG9sZGVyIGRpc2FsbG93IGNvbmZpZ3VyaW5nCi0gKiAwIG91dHB1dCBzdHJlYW1zLCB3aGlsZSB0aGUgcHVibGljIGNhbWVyYTIgQVBJIGFsbG93cyBmb3IgaXQuCi0gKi8KLWNsYXNzIENhbWVyYTNEdW1teVN0cmVhbSA6Ci0gICAgICAgIHB1YmxpYyBDYW1lcmEzSU9TdHJlYW1CYXNlLAotICAgICAgICBwdWJsaWMgQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZSB7Ci0KLSAgcHVibGljOgotICAgIC8qKgotICAgICAqIFNldCB1cCBhIGR1bW15IHN0cmVhbTsgZG9lc24ndCBhY3R1YWxseSBjb25uZWN0IHRvIGFueXRoaW5nLCBhbmQgdXNlcwotICAgICAqIGEgZGVmYXVsdCBkdW1teSBmb3JtYXQgYW5kIHNpemUuCi0gICAgICovCi0gICAgZXhwbGljaXQgQ2FtZXJhM0R1bW15U3RyZWFtKGludCBpZCk7Ci0KLSAgICB2aXJ0dWFsIH5DYW1lcmEzRHVtbXlTdHJlYW0oKTsKLQotICAgIC8qKgotICAgICAqIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCi0gICAgICovCi0KLSAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKLQotICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKLQotICAgIC8qKgotICAgICAqIERyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkIGlmIGRyb3BwaW5nIGlzIHRydWUuIElmIGRyb3BwaW5nIGlzIGZhbHNlLCBkbyBub3QKLSAgICAgKiBkcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSBvdmVycmlkZTsKLQotICAgIC8qKgotICAgICAqIFF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCYgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCi0gICAgICovCi0gICAgYm9vbCBpc1ZpZGVvU3RyZWFtKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gaWYgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBzdHJlYW0gaXMgZGVmZXJyZWQuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIGlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoc2l6ZV90IHN1cmZhY2VfaWQpIGNvbnN0OwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb25zdW1lciBzdXJmYWNlcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycyk7Ci0KLSAgICAvKioKLSAgICAgKiBRdWVyeSB0aGUgb3V0cHV0IHN1cmZhY2UgaWQuCi0gICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKLSAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCi0gICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7Ci0KLSAgcHJvdGVjdGVkOgotCi0gICAgLyoqCi0gICAgICogTm90ZSB0aGF0IHdlIHJlbGVhc2UgdGhlIGxvY2sgYnJpZWZseSBpbiB0aGlzIGZ1bmN0aW9uCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIGJvb2wgb3V0cHV0LAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKLQotICBwcml2YXRlOgotCi0gICAgLy8gRGVmYXVsdCBkdW1teSBwYXJhbWV0ZXJzOyAzMjB4MjQwIGlzIGEgcmVxdWlyZWQgc2l6ZSBmb3IgYWxsIGRldmljZXMsCi0gICAgLy8gb3RoZXJ3aXNlIGFjdCBsaWtlIGEgU3VyZmFjZVZpZXcgd291bGQuCi0gICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9XSURUSCA9IDMyMDsKLSAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0hFSUdIVCA9IDI0MDsKLSAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKLSAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2UgRFVNTVlfREFUQVNQQUNFID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwotICAgIHN0YXRpYyBjb25zdCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IERVTU1ZX1JPVEFUSU9OID0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDsKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmc4IERVTU1ZX0lEOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50NjRfdCAqdXNhZ2UpIGNvbnN0OwotCi19OyAvLyBjbGFzcyBDYW1lcmEzRHVtbXlTdHJlYW0KLQotfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNGYWtlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M2ODMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1GYWtlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgIkNhbWVyYTNGYWtlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjb25zdCBTdHJpbmc4IENhbWVyYTNGYWtlU3RyZWFtOjpGQUtFX0lEOworCitDYW1lcmEzRmFrZVN0cmVhbTo6Q2FtZXJhM0Zha2VTdHJlYW0oaW50IGlkKSA6CisgICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQV9TVFJFQU1fT1VUUFVULCBGQUtFX1dJRFRILCBGQUtFX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsIEZBS0VfRk9STUFULCBGQUtFX0RBVEFTUEFDRSwgRkFLRV9ST1RBVElPTiwKKyAgICAgICAgICAgICAgICBGQUtFX0lELCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD57QU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUfSkgeworCit9CisKK0NhbWVyYTNGYWtlU3RyZWFtOjp+Q2FtZXJhM0Zha2VTdHJlYW0oKSB7CisKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZha2Ugc3RyZWFtIGNhbm5vdCBwcm9kdWNlIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKKyAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJiwKKyAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGYWtlIHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmLAorICAgICAgICAgICAgbnNlY3NfdCwKKyAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBGYWtlIHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKwordm9pZCBDYW1lcmEzRmFrZVN0cmVhbTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpIGNvbnN0IHsKKyAgICAodm9pZCkgYXJnczsKKyAgICBTdHJpbmc4IGxpbmVzOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgIFN0cmVhbVslZF06IEZha2VcbiIsIG1JZCk7CisgICAgd3JpdGUoZmQsIGxpbmVzLnN0cmluZygpLCBsaW5lcy5zaXplKCkpOworCisgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6ZHVtcChmZCwgYXJncyk7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpzZXRUcmFuc2Zvcm0oaW50KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvLyBEbyBub3RoaW5nCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmEzRmFrZVN0cmVhbTo6ZGV0YWNoQnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCkgeworICAgICh2b2lkKSBidWZmZXI7CisgICAgKHZvaWQpIGZlbmNlRmQ7CisgICAgLy8gRG8gbm90aGluZworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OmNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCkgeworICAgIC8vIERvIG5vdGhpbmcKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgeworICAgIG1TdGF0ZSA9IChtU3RhdGUgPT0gU1RBVEVfSU5fUkVDT05GSUcpID8gU1RBVEVfSU5fQ09ORklHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTVEFURV9DT05TVFJVQ1RFRDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgeworICAgICp1c2FnZSA9IEZBS0VfVVNBR0U7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENhbWVyYTNGYWtlU3RyZWFtOjppc1ZpZGVvU3RyZWFtKCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDYW1lcmEzRmFrZVN0cmVhbTo6aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZChzaXplX3QgLypzdXJmYWNlX2lkKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpkcm9wQnVmZmVycyhib29sIC8qZHJvcHBpbmcqLykgeworICAgIHJldHVybiBPSzsKK30KKworY29uc3QgU3RyaW5nOCYgQ2FtZXJhM0Zha2VTdHJlYW06OmdldFBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEZBS0VfSUQ7Cit9CisKK3N0YXR1c190IENhbWVyYTNGYWtlU3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiAvKmNvbnN1bWVycyovKSB7CisgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEZha2Ugc3RyZWFtIGRvZXNuJ3Qgc3VwcG9ydCBzZXQgY29uc3VtZXIgc3VyZmFjZSEiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJi8qb3V0cHV0U3VyZmFjZXMqLywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICYvKm91dHB1dEluZm8qLywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJi8qcmVtb3ZlZFN1cmZhY2VJZHMqLywKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPHNwPFN1cmZhY2U+LCBzaXplX3Q+ICogLypvdXRwdXRNYXAqLykgeworICAgIEFMT0dFKCIlczogdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0Zha2VTdHJlYW06OnNldEJhdGNoU2l6ZShzaXplX3QgLypiYXRjaFNpemUqLykgeworICAgIEFMT0dFKCIlczogdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0Zha2VTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTRjY2JmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRmFrZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX0ZBS0VfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfRkFLRV9TVFJFQU1fSAorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKKyNpbmNsdWRlICJDYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiQ2FtZXJhM0lPU3RyZWFtQmFzZS5oIgorI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvKioKKyAqIEEgZmFrZSBvdXRwdXQgc3RyZWFtIGNsYXNzLCB0byBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBubyB2YWxpZAorICogc3RyZWFtcyBhcmUgY29uZmlndXJlZCBieSB0aGUgY2xpZW50LgorICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBjYW1lcmEgSEFMIHYzLjIgb3Igb2xkZXIgZGlzYWxsb3cgY29uZmlndXJpbmcKKyAqIDAgb3V0cHV0IHN0cmVhbXMsIHdoaWxlIHRoZSBwdWJsaWMgY2FtZXJhMiBBUEkgYWxsb3dzIGZvciBpdC4KKyAqLworY2xhc3MgQ2FtZXJhM0Zha2VTdHJlYW0gOgorICAgICAgICBwdWJsaWMgQ2FtZXJhM0lPU3RyZWFtQmFzZSwKKyAgICAgICAgcHVibGljIENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UgeworCisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTZXQgdXAgYSBmYWtlIHN0cmVhbTsgZG9lc24ndCBhY3R1YWxseSBjb25uZWN0IHRvIGFueXRoaW5nLCBhbmQgdXNlcworICAgICAqIGEgZGVmYXVsdCBmYWtlIGZvcm1hdCBhbmQgc2l6ZS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBDYW1lcmEzRmFrZVN0cmVhbShpbnQgaWQpOworCisgICAgdmlydHVhbCB+Q2FtZXJhM0Zha2VTdHJlYW0oKTsKKworICAgIC8qKgorICAgICAqIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCisgICAgICovCisKKyAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKKworICAgIHN0YXR1c190ICAgICAgICAgc2V0VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKKworICAgIC8qKgorICAgICAqIERyb3AgYnVmZmVycyBmb3Igc3RyZWFtIG9mIHN0cmVhbUlkIGlmIGRyb3BwaW5nIGlzIHRydWUuIElmIGRyb3BwaW5nIGlzIGZhbHNlLCBkbyBub3QKKyAgICAgKiBkcm9wIGJ1ZmZlcnMgZm9yIHN0cmVhbSBvZiBzdHJlYW1JZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyb3BCdWZmZXJzKGJvb2wgLypkcm9wcGluZyovKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSBwaHlzaWNhbCBjYW1lcmEgaWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCYgZ2V0UGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGlmIHRoaXMgb3V0cHV0IHN0cmVhbSBpcyBmb3IgdmlkZW8gZW5jb2RpbmcuCisgICAgICovCisgICAgYm9vbCBpc1ZpZGVvU3RyZWFtKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gaWYgdGhlIGNvbnN1bWVyIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBzdHJlYW0gaXMgZGVmZXJyZWQuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoc2l6ZV90IHN1cmZhY2VfaWQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25zdW1lciBzdXJmYWNlcyB0byB0aGUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycyk7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgb3V0cHV0IHN1cmZhY2UgaWQuCisgICAgICovCisgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplKSBvdmVycmlkZTsKKworICBwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBOb3RlIHRoYXQgd2UgcmVsZWFzZSB0aGUgbG9jayBicmllZmx5IGluIHRoaXMgZnVuY3Rpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CisKKyAgcHJpdmF0ZToKKworICAgIC8vIERlZmF1bHQgZmFrZSBwYXJhbWV0ZXJzOyAzMjB4MjQwIGlzIGEgcmVxdWlyZWQgc2l6ZSBmb3IgYWxsIGRldmljZXMsCisgICAgLy8gb3RoZXJ3aXNlIGFjdCBsaWtlIGEgU3VyZmFjZVZpZXcgd291bGQuCisgICAgc3RhdGljIGNvbnN0IGludCBGQUtFX1dJRFRIID0gMzIwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRkFLRV9IRUlHSFQgPSAyNDA7CisgICAgc3RhdGljIGNvbnN0IGludCBGQUtFX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2UgRkFLRV9EQVRBU1BBQ0UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgc3RhdGljIGNvbnN0IGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCBGQUtFX1JPVEFUSU9OID0gQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBGQUtFX1VTQUdFID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nOCBGQUtFX0lEOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAorICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDY0X3QgKnVzYWdlKSBjb25zdDsKKworfTsgLy8gY2xhc3MgQ2FtZXJhM0Zha2VTdHJlYW0KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggYmRhMjk2MS4uMDIwNGQ0OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC0yOSwxMyArMjksMTUgQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1DYW1lcmEzSU9TdHJlYW1CYXNlOjpDYW1lcmEzSU9TdHJlYW1CYXNlKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCitDYW1lcmEzSU9TdHJlYW1CYXNlOjpDYW1lcmEzSU9TdHJlYW1CYXNlKGludCBpZCwgY2FtZXJhX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6CisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKICAgICAgICAgQ2FtZXJhM1N0cmVhbShpZCwgdHlwZSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLApAQCAtNzcsMTMgKzc5LDEzIEBACiAKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFN0YXRlOiAlZFxuIiwgbVN0YXRlKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIERpbXM6ICVkIHggJWQsIGZvcm1hdCAweCV4LCBkYXRhc3BhY2UgMHgleFxuIiwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlKTsKKyAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06OndpZHRoLCBjYW1lcmFfc3RyZWFtOjpoZWlnaHQsCisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjpmb3JtYXQsIGNhbWVyYV9zdHJlYW06OmRhdGFfc3BhY2UpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICV6dVxuIiwgbU1heFNpemUpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICUiIFBSSXU2NCAiLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAotICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKLSAgICBpZiAoc3RybGVuKGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpID4gMCkgewotICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFBoeXNpY2FsIGNhbWVyYSBpZDogJXNcbiIsIGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpOworICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgIGlmIChzdHJsZW4oY2FtZXJhX3N0cmVhbTo6cGh5c2ljYWxfY2FtZXJhX2lkKSA+IDApIHsKKyAgICAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBQaHlzaWNhbCBjYW1lcmEgaWQ6ICVzXG4iLCBjYW1lcmFfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpOwogICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CkBAIC0xNTAsMTEgKzE1MiwxMSBAQAogICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYTNJT1N0cmVhbUJhc2U6OmhhbmRvdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCit2b2lkIENhbWVyYTNJT1N0cmVhbUJhc2U6OmhhbmRvdXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlRmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0KSB7CiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IGFsbCBmZW5jZXMgYXJlIG5vdyBvd25lZCBieSBIQUwuCkBAIC0yMjAsNyArMjIyLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6cmV0dXJuQW55QnVmZmVyTG9ja2VkKAotICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCA0NDgzNzljLi45MGM4YTdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtMzIsMTEgKzMyLDEyIEBACiBjbGFzcyBDYW1lcmEzSU9TdHJlYW1CYXNlIDoKICAgICAgICAgcHVibGljIENhbWVyYTNTdHJlYW0gewogICBwcm90ZWN0ZWQ6Ci0gICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAorICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaW50IGlkLCBjYW1lcmFfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZSk7CiAKICAgcHVibGljOgogCkBAIC00OCw2ICs0OSw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdDsKIAorICAgIGludCAgICAgICAgICAgICAgZ2V0TWF4VG90YWxCdWZmZXJzKCkgY29uc3QgeyByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7IH0KICAgcHJvdGVjdGVkOgogICAgIHNpemVfdCAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50OwogICAgIC8vIHN1bSBvZiBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdGhhdCBhcmUgY3VycmVudGx5IGFjcXVpcmVkIGJ5IEhBTApAQCAtNjMsMTMgKzY1LDEzIEBACiAgICAgc3A8RmVuY2U+ICAgICAgICAgbUNvbWJpbmVkRmVuY2U7CiAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCkBAIC05OSwxMSArMTAxLDExIEBACiAKICAgICAvLyBIYW5kIG91dCB0aGUgYnVmZmVyIHRvIGEgbmF0aXZlIGxvY2F0aW9uLAogICAgIC8vICAgaW5jcmVtZW50aW5nIHRoZSBpbnRlcm5hbCByZWZjb3VudCBhbmQgZGVxdWV1ZWQgYnVmZmVyIGNvdW50Ci0gICAgdm9pZCBoYW5kb3V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgIHZvaWQgaGFuZG91dEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVfZmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxlYXNlX2ZlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3Qgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dCk7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJT1N0cmVhbUJhc2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAppbmRleCBjYjU5YTc2Li42ZDgzMTdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCkBAIC0yNywxMyArMjcsMTQgQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCi1jb25zdCBTdHJpbmc4IENhbWVyYTNJbnB1dFN0cmVhbTo6RFVNTVlfSUQ7Citjb25zdCBTdHJpbmc4IENhbWVyYTNJbnB1dFN0cmVhbTo6RkFLRV9JRDsKIAogQ2FtZXJhM0lucHV0U3RyZWFtOjpDYW1lcmEzSW5wdXRTdHJlYW0oaW50IGlkLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KSA6Ci0gICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX0lOUFVULCB3aWR0aCwgaGVpZ2h0LCAvKm1heFNpemUqLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVNTVlfSUQpIHsKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9JTlBVVCwgd2lkdGgsIGhlaWdodCwgLyptYXhTaXplKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFLRV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD57QU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUfSkgewogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0LCBCTE9CIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDYsMTAgKzQ3LDE0IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6Z2V0SW5wdXRCdWZmZXJMb2NrZWQoCi0gICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKSB7CisgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyICpidWZmZXIsIFNpemUgKnNpemUpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIAorICAgIGlmIChzaXplID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzaXplIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KICAgICAvLyBGSVhNRTogd2lsbCBub3Qgd29yayBpbiAocmUtKXJlZ2lzdHJhdGlvbgogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5fQ09ORklHIHx8IG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRykgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQnVmZmVyIHJlZ2lzdHJhdGlvbiBmb3IgaW5wdXQgc3RyZWFtcyIKQEAgLTc3LDE2ICs4MiwxOCBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIHNpemUtPndpZHRoICA9IGJ1ZmZlckl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCk7CisgICAgc2l6ZS0+aGVpZ2h0ID0gYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCk7CisKICAgICBhbmIgPSBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKTsKICAgICBhc3NlcnQoYW5iICE9IE5VTEwpOwogICAgIGZlbmNlRmQgPSBidWZmZXJJdGVtLm1GZW5jZS0+ZHVwKCk7Ci0KICAgICAvKioKICAgICAgKiBGZW5jZUZEIG5vdyBvd25lZCBieSBIQUwgZXhjZXB0IGluIGNhc2Ugb2YgZXJyb3IsCiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL2ZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki9mYWxzZSk7CiAgICAgbUJ1ZmZlcnNJbkZsaWdodC5wdXNoX2JhY2soYnVmZmVySXRlbSk7CiAKICAgICBtRnJhbWVDb3VudCsrOwpAQCAtOTYsNyArMTAzLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLApAQCAtMTM0LDcgKzE0MSw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUikgewogICAgICAgICBpZiAoYnVmZmVyLnJlbGVhc2VfZmVuY2UgIT0gLTEpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBIQUwgc2hvdWxkIG5vdCBzZXQgcmVsZWFzZV9mZW5jZSglZCkgd2hlbiAiCiAgICAgICAgICAgICAgICAgICAidGhlcmUgaXMgYW4gZXJyb3IiLCBfX0ZVTkNUSU9OX18sIG1JZCwgYnVmZmVyLnJlbGVhc2VfZmVuY2UpOwpAQCAtMTQ0LDcgKzE1MSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZWFzc2lnbiByZWxlYXNlIGZlbmNlIGFzIHRoZSBhY3F1aXJlIGZlbmNlIGluY2FzZSBvZiBlcnJvcgogICAgICAgICAgKi8KLSAgICAgICAgY29uc3RfY2FzdDxjYW1lcmEzX3N0cmVhbV9idWZmZXIqPigmYnVmZmVyKS0+cmVsZWFzZV9mZW5jZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8Y2FtZXJhX3N0cmVhbV9idWZmZXIqPigmYnVmZmVyKS0+cmVsZWFzZV9mZW5jZSA9CiAgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2U7CiAgICAgfQogCkBAIC0xNjUsNyArMTcyLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0lucHV0U3RyZWFtOjpyZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKLSAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpIHsKKyAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICByZXR1cm4gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgLyp0aW1lc3RhbXAqLzAsIC8qb3V0cHV0Ki9mYWxzZSk7CkBAIC0yMjQsNyArMjMxLDcgQEAKICAgICB9CiAKICAgICBhc3NlcnQobU1heFNpemUgPT0gMCk7Ci0gICAgYXNzZXJ0KGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKKyAgICBhc3NlcnQoY2FtZXJhX3N0cmVhbTo6Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7CiAKICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKQEAgLTI0NCwxNCArMjUxLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG1pbkJ1ZnMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKIAotICAgICAgICBpZiAoY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID09IDApIHsKKyAgICAgICAgaWYgKGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID09IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogJWQ6IEhBTCBzZXRzIG1heF9idWZmZXIgdG8gMC4gTXVzdCBiZSBhdCBsZWFzdCAxLiIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAKICAgICAgICAgLyoKLSAgICAgICAgICogV2UgcHJvbWlzZSBuZXZlciB0byAnYWNxdWlyZScgbW9yZSB0aGFuIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycworICAgICAgICAgKiBXZSBwcm9taXNlIG5ldmVyIHRvICdhY3F1aXJlJyBtb3JlIHRoYW4gY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMKICAgICAgICAgICogYXQgYW55IG9uZSB0aW1lLgogICAgICAgICAgKgogICAgICAgICAgKiBCb29zdCB0aGUgbnVtYmVyIHVwIHRvIG1lZXQgdGhlIG1pbmltdW0gcmVxdWlyZWQgYnVmZmVyIGNvdW50LgpAQCAtMjU5LDggKzI2Niw4IEBACiAgICAgICAgICAqIChOb3RlIHRoYXQgdGhpcyBzZXRzIGNvbnN1bWVyLXNpZGUgYnVmZmVyIGNvdW50IG9ubHksCiAgICAgICAgICAqIGFuZCBub3QgdGhlIHN1bSBvZiBwcm9kdWNlcitjb25zdW1lciBzaWRlIGFzIGluIG90aGVyIGNhbWVyYSBzdHJlYW1zKS4KICAgICAgICAgICovCi0gICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50ID0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID4gbWluQnVmcyA/Ci0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgOiBtaW5CdWZzOworICAgICAgICBtVG90YWxCdWZmZXJDb3VudCA9IGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID4gbWluQnVmcyA/CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyA6IG1pbkJ1ZnM7CiAgICAgICAgIC8vIFRPRE86IHNvbWVob3cgc2V0IHRoZSB0b3RhbCBidWZmZXIgY291bnQgd2hlbiBwcm9kdWNlciBjb25uZWN0cz8KIAogICAgICAgICBtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKGNvbnN1bWVyLCBtVXNhZ2UsCkBAIC0yNzIsMTcgKzI3OSwxNyBAQAogICAgICAgICBtQ29uc3VtZXItPnNldEJ1ZmZlckZyZWVkTGlzdGVuZXIodGhpcyk7CiAgICAgfQogCi0gICAgcmVzID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShjYW1lcmEzX3N0cmVhbTo6d2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0KTsKKyAgICByZXMgPSBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJTaXplKGNhbWVyYV9zdHJlYW06OndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6aGVpZ2h0KTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDb3VsZCBub3Qgc2V0IGJ1ZmZlciBkaW1lbnNpb25zICVkeCVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCk7CisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBjYW1lcmFfc3RyZWFtOjp3aWR0aCwgY2FtZXJhX3N0cmVhbTo6aGVpZ2h0KTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgIHJlcyA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChjYW1lcmFfc3RyZWFtOjpmb3JtYXQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENvdWxkIG5vdCBzZXQgYnVmZmVyIGZvcm1hdCAlZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIGNhbWVyYV9zdHJlYW06OmZvcm1hdCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC0yOTgsOCArMzA1LDggQEAKIHZvaWQgQ2FtZXJhM0lucHV0U3RyZWFtOjpvbkJ1ZmZlckZyZWVkKGNvbnN0IHdwPEdyYXBoaWNCdWZmZXI+JiBnYikgewogICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlciA9IGdiLnByb21vdGUoKTsKICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyIHN0cmVhbUJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAge251bGxwdHIsICZidWZmZXItPmhhbmRsZSwgMCwgLTEsIC0xfTsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXIgc3RyZWFtQnVmZmVyID0KKyAgICAgICAgICAgICAgICB7bnVsbHB0ciwgJmJ1ZmZlci0+aGFuZGxlLCBDQU1FUkFfQlVGRkVSX1NUQVRVU19PSywgLTEsIC0xfTsKICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBidWZmZXIgaXMgb3V0c3RhbmRpbmcuCiAgICAgICAgIGlmIChpc091dHN0YW5kaW5nQnVmZmVyKHN0cmVhbUJ1ZmZlcikpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkOiBUcnlpbmcgdG8gZnJlZSBhIGJ1ZmZlciB0aGF0IGlzIHN0aWxsIGJlaW5nICIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCmluZGV4IDk3YTYyN2EuLjQ2MjIxZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaApAQCAtNTMsMTMgKzUzLDEzIEBACiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOwogICAgIFZlY3RvcjxCdWZmZXJJdGVtPiBtQnVmZmVyc0luRmxpZ2h0OwogCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzggRFVNTVlfSUQ7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzggRkFLRV9JRDsKIAogICAgIC8qKgogICAgICAqIENhbWVyYTNJT1N0cmVhbUJhc2UKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCkBAIC03MCw5ICs3MCw5IEBACiAgICAgICogQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwgU2l6ZSAqc2l6ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZCgKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5jcHAKaW5kZXggOTVmOTYzMy4uYTdlNjRjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmNwcApAQCAtMTc2LDcgKzE3Niw3IEBACiAKICAgICBGbHVzaEluZmxpZ2h0UmVxU3RhdGVzIHN0YXRlcyB7CiAgICAgICAgIG1JZCwgbU9mZmxpbmVSZXFzTG9jaywgbU9mZmxpbmVSZXFzLCBtVXNlSGFsQnVmTWFuYWdlciwKLSAgICAgICAgbGlzdGVuZXIsICp0aGlzLCBtQnVmZmVyUmVjb3JkcywgKnRoaXN9OworICAgICAgICBsaXN0ZW5lciwgKnRoaXMsIG1CdWZmZXJSZWNvcmRzLCAqdGhpcywgbVNlc3Npb25TdGF0c0J1aWxkZXJ9OwogCiAgICAgY2FtZXJhMzo6Zmx1c2hJbmZsaWdodFJlcXVlc3RzKHN0YXRlcyk7CiAKQEAgLTI2MCw3ICsyNjAsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKQEAgLTI5OSw3ICszMDAsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrKTsKQEAgLTMzMyw3ICszMzUsOCBAQAogICAgICAgICBtVXNlSGFsQnVmTWFuYWdlciwgbVVzZVBhcnRpYWxSZXN1bHQsIG1OZWVkRml4dXBNb25vY2hyb21lVGFncywKICAgICAgICAgbU51bVBhcnRpYWxSZXN1bHRzLCBtVmVuZG9yVGFnSWQsIG1EZXZpY2VJbmZvLCBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLAogICAgICAgICBtUmVzdWx0TWV0YWRhdGFRdWV1ZSwgbURpc3RvcnRpb25NYXBwZXJzLCBtWm9vbVJhdGlvTWFwcGVycywgbVJvdGF0ZUFuZENyb3BNYXBwZXJzLAotICAgICAgICBtVGFnTW9uaXRvciwgbUlucHV0U3RyZWFtLCBtT3V0cHV0U3RyZWFtcywgbGlzdGVuZXIsICp0aGlzLCAqdGhpcywgbUJ1ZmZlclJlY29yZHMKKyAgICAgICAgbVRhZ01vbml0b3IsIG1JbnB1dFN0cmVhbSwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLCBsaXN0ZW5lciwgKnRoaXMsICp0aGlzLAorICAgICAgICBtQnVmZmVyUmVjb3JkcwogICAgIH07CiAgICAgZm9yIChjb25zdCBhdXRvJiBtc2cgOiBtc2dzKSB7CiAgICAgICAgIGNhbWVyYTM6Om5vdGlmeShzdGF0ZXMsIG1zZyk7CkBAIC0zNTMsNyArMzU2LDcgQEAKICAgICB9CiAKICAgICBSZXF1ZXN0QnVmZmVyU3RhdGVzIHN0YXRlcyB7Ci0gICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsCisgICAgICAgIG1JZCwgbVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrLCBtVXNlSGFsQnVmTWFuYWdlciwgbU91dHB1dFN0cmVhbXMsIG1TZXNzaW9uU3RhdHNCdWlsZGVyLAogICAgICAgICAqdGhpcywgbUJ1ZmZlclJlY29yZHMsICp0aGlzfTsKICAgICBjYW1lcmEzOjpyZXF1ZXN0U3RyZWFtQnVmZmVycyhzdGF0ZXMsIGJ1ZlJlcXMsIF9oaWRsX2NiKTsKICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKQEAgLTM3MCw3ICszNzMsNyBAQAogICAgIH0KIAogICAgIFJldHVybkJ1ZmZlclN0YXRlcyBzdGF0ZXMgewotICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbUJ1ZmZlclJlY29yZHN9OworICAgICAgICBtSWQsIG1Vc2VIYWxCdWZNYW5hZ2VyLCBtT3V0cHV0U3RyZWFtcywgbVNlc3Npb25TdGF0c0J1aWxkZXIsIG1CdWZmZXJSZWNvcmRzfTsKICAgICBjYW1lcmEzOjpyZXR1cm5TdHJlYW1CdWZmZXJzKHN0YXRlcywgYnVmZmVycyk7CiAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT2ZmbGluZVNlc3Npb24uaAppbmRleCBjNGM3YTg1Li41NTgxOTY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPZmZsaW5lU2Vzc2lvbi5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM09mZmxpbmVTZXNzaW9uLmgKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlICJkZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaCIKICNpbmNsdWRlICJkZXZpY2UzL1pvb21SYXRpb01hcHBlci5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKLSNpbmNsdWRlICJ1dGlscy9MYXRlbmN5SGlzdG9ncmFtLmgiCiAjaW5jbHVkZSA8Y2FtZXJhX21ldGFkYXRhX2hpZGRlbi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yMDksNiArMjA4LDcgQEAKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CiAgICAgY2FtZXJhMzo6U3RyZWFtU2V0IG1PdXRwdXRTdHJlYW1zOwogICAgIGNhbWVyYTM6OkJ1ZmZlclJlY29yZHMgbUJ1ZmZlclJlY29yZHM7CisgICAgU2Vzc2lvblN0YXRzQnVpbGRlciBtU2Vzc2lvblN0YXRzQnVpbGRlcjsKIAogICAgIHN0ZDo6bXV0ZXggbU9mZmxpbmVSZXFzTG9jazsKICAgICBjYW1lcmEzOjpJbkZsaWdodFJlcXVlc3RNYXAgbU9mZmxpbmVSZXFzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMDFjYTAwNi4uMDNiNzdmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC0xOCw4ICsxOCwxNSBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJDYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbHMvVHJhY2VIRlIuaCIKIApAQCAtMzUsMTIgKzQyLDEzIEBACiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKICAgICAgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBpbnQgc2V0SWQpIDoKLSAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTYyLDEwICs3MCwxMyBAQAogQ2FtZXJhM091dHB1dFN0cmVhbTo6Q2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKLSAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6Ci0gICAgICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsIHNldElkKSwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsIG1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAogICAgICAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKQEAgLTk0LDExICsxMDUsMTMgQEAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCi0gICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAotICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpIDoKLSAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICBpbnQgc2V0SWQsIGJvb2wgaXNNdWx0aVJlc29sdXRpb24pIDoKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAogICAgICAgICBtQ29uc3VtZXIobnVsbHB0ciksCiAgICAgICAgIG1UcmFuc2Zvcm0oMCksCiAgICAgICAgIG1UcmFjZUZpcnN0QnVmZmVyKHRydWUpLApAQCAtMTE0LDcgKzEyNyw3IEBACiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VSUk9SOwogICAgIH0KIAotICAgIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlIGZsYWcuCisgICAgLy8gVmFsaWRhdGlvbiBjaGVjayBmb3IgdGhlIGNvbnN1bWVyIHVzYWdlIGZsYWcuCiAgICAgaWYgKChjb25zdW1lclVzYWdlICYgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSkgPT0gMCAmJgogICAgICAgICAgICAgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUikgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVyIHVzYWdlIGZsYWcgaXMgaWxsZWdhbCAlIiBQUkl1NjQgIiEiLApAQCAtMTI3LDE4ICsxNDAsMTkgQEAKICAgICBtQnVmZmVyUHJvZHVjZXJMaXN0ZW5lciA9IG5ldyBCdWZmZXJQcm9kdWNlckxpc3RlbmVyKHRoaXMsIG5lZWRzUmVsZWFzZU5vdGlmeSk7CiB9CiAKLUNhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKK0NhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmFfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNldElkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCB0eXBlLCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgc2V0SWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHNlbnNvclBpeGVsTW9kZXNVc2VkLCBzZXRJZCwgaXNNdWx0aVJlc29sdXRpb24pLAogICAgICAgICBtVHJhbnNmb3JtKDApLAogICAgICAgICBtVHJhY2VGaXJzdEJ1ZmZlcih0cnVlKSwKICAgICAgICAgbVVzZU1vbm9UaW1lc3RhbXAoZmFsc2UpLApAQCAtMTU5LDcgKzE3Myw3IEBACiAgICAgZGlzY29ubmVjdExvY2tlZCgpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBVFJBQ0VfSEZSX0NBTEwoKTsKIApAQCAtMTc3LDExICsxOTEsNzAgQEAKICAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKICAgICAgKi8KICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCpidWZmZXIsICYoYW5iLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovZmVuY2VGZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQV9CVUZGRVJfU1RBVFVTX09LLCAvKm91dHB1dCovdHJ1ZSk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEJ1ZmZlcnNMb2NrZWQoc3RkOjp2ZWN0b3I8T3V0c3RhbmRpbmdCdWZmZXI+KiBvdXRCdWZmZXJzKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgaWYgKChyZXMgPSBnZXRCdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IHN0cmVhbSAlZCBpcyBtYW5hZ2VkIGJ5IGJ1ZmZlciBtYW5hZ2VyIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoIG9wZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIgPSBtQ29uc3VtZXI7CisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgbG9jayBicmllZmx5IHRvIGF2b2lkIGRlYWRsb2NrIGZvciBiZWxvdyBzY2VuYXJpbzoKKyAgICAgKiBUaHJlYWQgMTogU3RyZWFtaW5nUHJvY2Vzc29yOjpzdGFydFN0cmVhbSAtPiBDYW1lcmEzU3RyZWFtOjppc0NvbmZpZ3VyaW5nKCkuCisgICAgICogVGhpcyB0aHJlYWQgYWNxdWlyZWQgU3RyZWFtaW5nUHJvY2Vzc29yIGxvY2sgYW5kIHRyeSB0byBsb2NrIENhbWVyYTNTdHJlYW0gbG9jay4KKyAgICAgKiBUaHJlYWQgMjogQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyLT5TdHJlYW1pbmdQcm9jZXNzb3I6Om9uRnJhbWVBdmFpbGFibGUoKS4KKyAgICAgKiBUaGlzIHRocmVhZCBhY3F1aXJlZCBDYW1lcmEzU3RyZWFtIGxvY2sgYW5kIGJ1ZmZlclF1ZXVlIGxvY2ssIGFuZCB0cnkgdG8gbG9jaworICAgICAqIFN0cmVhbWluZ1Byb2Nlc3NvciBsb2NrLgorICAgICAqIFRocmVhZCAzOiBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoKS4gVGhpcyB0aHJlYWQgYWNxdWlyZWQgQ2FtZXJhM1N0cmVhbSBsb2NrCisgICAgICogYW5kIHRyeSB0byBsb2NrIGJ1ZmZlclF1ZXVlIGxvY2suCisgICAgICogVGhlbiB0aGVyZSBpcyBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVuY3kuCisgICAgICovCisgICAgbUxvY2sudW5sb2NrKCk7CisKKyAgICBzaXplX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IG91dEJ1ZmZlcnMtPnNpemUoKTsKKyAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gYnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKworICAgIG5zZWNzX3QgZGVxdWV1ZVN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIHJlcyA9IGNvbnN1bWVyLT5kZXF1ZXVlQnVmZmVycygmYnVmZmVycyk7CisgICAgbnNlY3NfdCBkZXF1ZXVlRW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeS5hZGQoZGVxdWV1ZVN0YXJ0LCBkZXF1ZXVlRW5kKTsKKworICAgIG1Mb2NrLmxvY2soKTsKKworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGRlcXVldWUgJXp1IG91dHB1dCBidWZmZXJzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoKTsKKworICAgIC8qKgorICAgICAqIEZlbmNlRkQgbm93IG93bmVkIGJ5IEhBTCBleGNlcHQgaW4gY2FzZSBvZiBlcnJvciwKKyAgICAgKiBpbiB3aGljaCBjYXNlIHdlIHJlYXNzaWduIGl0IHRvIGFjcXVpcmVfZmVuY2UKKyAgICAgKi8KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7IGkrKykgeworICAgICAgICBoYW5kb3V0QnVmZmVyTG9ja2VkKCoob3V0QnVmZmVycy0+YXQoaSkub3V0QnVmZmVyKSwKKyAgICAgICAgICAgICAgICAmKGJ1ZmZlcnNbaV0uYnVmZmVyLT5oYW5kbGUpLCAvKmFjcXVpcmVGZW5jZSovYnVmZmVyc1tpXS5mZW5jZUZkLAorICAgICAgICAgICAgICAgIC8qcmVsZWFzZUZlbmNlKi8tMSwgQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0ssIC8qb3V0cHV0Ki90cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAogICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKQEAgLTE4OSwxMCArMjYyLDE0IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKLSAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9IRlJfQ0FMTCgpOwogCisgICAgaWYgKG1IYW5kb3V0VG90YWxCdWZmZXJDb3VudCA9PSAxKSB7CisgICAgICAgIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CisgICAgfQorCiAgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewpAQCAtMjA2LDcgKzI4Myw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCkBAIC0yMzYsMTEgKzMxMywxMSBAQAogICAgIC8qKgogICAgICAqIFJldHVybiBidWZmZXIgYmFjayB0byBBTmF0aXZlV2luZG93CiAgICAgICovCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgeworICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycyB8fCB0aW1lc3RhbXAgPT0gMCkgewogICAgICAgICAvLyBDYW5jZWwgYnVmZmVyCiAgICAgICAgIGlmIChtRHJvcEJ1ZmZlcnMpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogRHJvcHBpbmcgYSBmcmFtZSBmb3Igc3RyZWFtICVkLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgeworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dWKCIlczogQSBmcmFtZSBpcyBkcm9wcGVkIGZvciBzdHJlYW0gJWQgZHVlIHRvIGJ1ZmZlciBlcnJvci4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wIHNob3VsZG4ndCBiZSAwIiwgX19GVU5DVElPTl9fLCBtSWQpOwpAQCAtMjYwLDcgKzMzNyw3IEBACiAgICAgICAgICAgICBtQnVmZmVyUHJvZHVjZXJMaXN0ZW5lci0+b25CdWZmZXJSZWxlYXNlZCgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1UcmFjZUZpcnN0QnVmZmVyICYmIChzdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQpKSB7CisgICAgICAgIGlmIChtVHJhY2VGaXJzdEJ1ZmZlciAmJiAoc3RyZWFtX3R5cGUgPT0gQ0FNRVJBX1NUUkVBTV9PVVRQVVQpKSB7CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2hhciB0cmFjZUxvZ1s0OF07CiAgICAgICAgICAgICAgICAgc25wcmludGYodHJhY2VMb2csIHNpemVvZih0cmFjZUxvZyksICJTdHJlYW0gJWQ6IGZpcnN0IGZ1bGwgYnVmZmVyXG4iLCBtSWQpOwpAQCAtMjc5LDYgKzM1NiwxMiBAQAogICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGlzIGlzIGEgSlBFRyBvdXRwdXQsIGFuZCBpbWFnZSBkdW1wIG1hc2sgaXMgc2V0LCBzYXZlIGltYWdlIHRvCisgICAgICAgIC8vIGRpc2suCisgICAgICAgIGlmIChnZXRGb3JtYXQoKSA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYgZ2V0RGF0YVNwYWNlKCkgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGICYmCisgICAgICAgICAgICAgICAgbUltYWdlRHVtcE1hc2spIHsKKyAgICAgICAgICAgIGR1bXBJbWFnZVRvRGlzayh0aW1lc3RhbXAsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CiAgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIHN0YXRlKSkgewpAQCAtMjkwLDcgKzM3Myw3IEBACiAKICAgICAvLyBPbmNlIGEgdmFsaWQgYnVmZmVyIGhhcyBiZWVuIHJldHVybmVkIHRvIHRoZSBxdWV1ZSwgY2FuIG5vIGxvbmdlcgogICAgIC8vIGRlcXVldWUgYWxsIGJ1ZmZlcnMgZm9yIHByZWFsbG9jYXRpb24uCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgIT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CisgICAgaWYgKGJ1ZmZlci5zdGF0dXMgIT0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKICAgICAgICAgbVN0cmVhbVVucHJlcGFyYWJsZSA9IHRydWU7CiAgICAgfQogCkBAIC00MTEsNyArNDk0LDcgQEAKICAgICBpZiAobU1heFNpemUgPT0gMCkgewogICAgICAgICAvLyBGb3IgYnVmZmVycyBvZiBrbm93biBzaXplCiAgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoLCBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjp3aWR0aCwgY2FtZXJhX3N0cmVhbTo6aGVpZ2h0KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBGb3IgYnVmZmVycyB3aXRoIGJvdW5kZWQgc2l6ZQogICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobUNvbnN1bWVyLmdldCgpLApAQCAtNDIwLDIzICs1MDMsMjMgQEAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGRpbWVuc2lvbnMiCiAgICAgICAgICAgICAgICAgIiAlZCB4ICVkIChtYXhTaXplICV6dSkgZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6d2lkdGgsIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFfc3RyZWFtOjp3aWR0aCwgY2FtZXJhX3N0cmVhbTo6aGVpZ2h0LAogICAgICAgICAgICAgICAgIG1NYXhTaXplLCBtSWQpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtQ29uc3VtZXIuZ2V0KCksCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0KTsKKyAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06OmZvcm1hdCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgJSN4IGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgbUlkKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYV9zdHJlYW06OmZvcm1hdCwgbUlkKTsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UobUNvbnN1bWVyLmdldCgpLAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UpOworICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6ZGF0YV9zcGFjZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGRhdGFzcGFjZSAlI3ggZm9yIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSwgbUlkKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYV9zdHJlYW06OmRhdGFfc3BhY2UsIG1JZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCkBAIC00NTEsMTQgKzUzNCwxNCBAQAogICAgIH0KIAogICAgIEFMT0dWKCIlczogQ29uc3VtZXIgd2FudHMgJWQgYnVmZmVycywgSEFMIHdhbnRzICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgbWF4Q29uc3VtZXJCdWZmZXJzLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwotICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPT0gMCkgeworICAgICAgICAgICAgbWF4Q29uc3VtZXJCdWZmZXJzLCBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgaWYgKGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID09IDApIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgSEFMIHJlcXVlc3RlZCBtYXhfYnVmZmVyIGNvdW50OiAlZCwgcmVxdWlyZXMgYXQgbGVhc3QgMSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CisgICAgbVRvdGFsQnVmZmVyQ291bnQgPSBtYXhDb25zdW1lckJ1ZmZlcnMgKyBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVyczsKICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQgPSAwOwogICAgIG1GcmFtZUNvdW50ID0gMDsKICAgICBtTGFzdFRpbWVzdGFtcCA9IDA7CkBAIC00OTQsMTAgKzU3NywxMiBAQAogICAgICAgICAgICAgIShpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgfHwgaXNDb25zdW1lZEJ5SFdUZXh0dXJlKCkpKSB7CiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UgPSAwOwogICAgICAgICBnZXRFbmRwb2ludFVzYWdlKCZjb25zdW1lclVzYWdlKTsKKyAgICAgICAgdWludDMyX3Qgd2lkdGggPSAobU1heFNpemUgPT0gMCkgPyBnZXRXaWR0aCgpIDogbU1heFNpemU7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IChtTWF4U2l6ZSA9PSAwKSA/IGdldEhlaWdodCgpIDogMTsKICAgICAgICAgU3RyZWFtSW5mbyBzdHJlYW1JbmZvKAotICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksIGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBnZXRGb3JtYXQoKSwgZ2V0RGF0YVNwYWNlKCksCisgICAgICAgICAgICAgICAgZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgd2lkdGgsIGhlaWdodCwgZ2V0Rm9ybWF0KCksIGdldERhdGFTcGFjZSgpLAogICAgICAgICAgICAgICAgIG1Vc2FnZSB8IGNvbnN1bWVyVXNhZ2UsIG1Ub3RhbEJ1ZmZlckNvdW50LAotICAgICAgICAgICAgICAgIC8qaXNDb25maWd1cmVkKi90cnVlKTsKKyAgICAgICAgICAgICAgICAvKmlzQ29uZmlndXJlZCovdHJ1ZSwgaXNNdWx0aVJlc29sdXRpb24oKSk7CiAgICAgICAgIHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHdlYWtUaGlzKHRoaXMpOwogICAgICAgICByZXMgPSBtQnVmZmVyTWFuYWdlci0+cmVnaXN0ZXJTdHJlYW0od2Vha1RoaXMsCiAgICAgICAgICAgICAgICAgc3RyZWFtSW5mbyk7CkBAIC01MjgsNyArNjEzLDggQEAKIAogICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlcikgewogICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYjsKLSAgICAgICAgcmVzID0gbUJ1ZmZlck1hbmFnZXItPmdldEJ1ZmZlckZvclN0cmVhbShnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpLCAmZ2IsIGZlbmNlRmQpOworICAgICAgICByZXMgPSBtQnVmZmVyTWFuYWdlci0+Z2V0QnVmZmVyRm9yU3RyZWFtKGdldElkKCksIGdldFN0cmVhbVNldElkKCksCisgICAgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24oKSwgJmdiLCBmZW5jZUZkKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICAgICAgLy8gQXR0YWNoIHRoaXMgYnVmZmVyIHRvIHRoZSBidWZmZXJRdWV1ZTogdGhlIGJ1ZmZlciB3aWxsIGJlIGluIGRlcXVldWUgc3RhdGUgYWZ0ZXIgYQogICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCByZXR1cm4uCkBAIC01NjcsMTEgKzY1Myw1MCBAQAogICAgICAgICAgKiBhbmQgdHJ5IHRvIGxvY2sgYnVmZmVyUXVldWUgbG9jay4KICAgICAgICAgICogVGhlbiB0aGVyZSBpcyBjaXJjdWxhciBsb2NraW5nIGRlcGVuZGVuY3kuCiAgICAgICAgICAqLwotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBjdXJyZW50Q29uc3VtZXIgPSBtQ29uc3VtZXI7CisgICAgICAgIHNwPFN1cmZhY2U+IGNvbnN1bWVyID0gbUNvbnN1bWVyOworICAgICAgICBzaXplX3QgcmVtYWluaW5nQnVmZmVycyA9IChtU3RhdGUgPT0gU1RBVEVfUFJFUEFSSU5HID8gbVRvdGFsQnVmZmVyQ291bnQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycykgLSBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQ7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogCiAgICAgICAgIG5zZWNzX3QgZGVxdWV1ZVN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmRlcXVldWVCdWZmZXIoY3VycmVudENvbnN1bWVyLmdldCgpLCBhbmIsIGZlbmNlRmQpOworCisgICAgICAgIHNpemVfdCBiYXRjaFNpemUgPSBtQmF0Y2hTaXplLmxvYWQoKTsKKyAgICAgICAgaWYgKGJhdGNoU2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBhbncgPSBjb25zdW1lcjsKKyAgICAgICAgICAgIHJlcyA9IGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksIGFuYiwgZmVuY2VGZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGJhdGNoTG9jayhtQmF0Y2hMb2NrKTsKKyAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgaWYgKG1CYXRjaGVkQnVmZmVycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdCdWZmZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IGJ1ZmZlciB3aGlsZSBhbGwgYnVmZmVycyBhcmUgaGFuZGVkIG91dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJhdGNoU2l6ZSA+IHJlbWFpbmluZ0J1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gcmVtYWluaW5nQnVmZmVyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmF0Y2hMb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIC8vIFJlZmlsbCBiYXRjaGVkIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gYmF0Y2hlZEJ1ZmZlcnM7CisgICAgICAgICAgICAgICAgYmF0Y2hlZEJ1ZmZlcnMucmVzaXplKGJhdGNoU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVzID0gY29uc3VtZXItPmRlcXVldWVCdWZmZXJzKCZiYXRjaGVkQnVmZmVycyk7CisgICAgICAgICAgICAgICAgYmF0Y2hMb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogYmF0Y2ggZGVxdWV1ZUJ1ZmZlcnMgY2FsbCBmYWlsZWQhICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUJhdGNoZWRCdWZmZXJzID0gc3RkOjptb3ZlKGJhdGNoZWRCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCBiYXRjaCBidWZmZXJzCisgICAgICAgICAgICAgICAgKmFuYiA9IG1CYXRjaGVkQnVmZmVycy5iYWNrKCkuYnVmZmVyOworICAgICAgICAgICAgICAgICpmZW5jZUZkID0gbUJhdGNoZWRCdWZmZXJzLmJhY2soKS5mZW5jZUZkOworICAgICAgICAgICAgICAgIG1CYXRjaGVkQnVmZmVycy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgbnNlY3NfdCBkZXF1ZXVlRW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3kuYWRkKGRlcXVldWVTdGFydCwgZGVxdWV1ZUVuZCk7CiAKQEAgLTU4Miw3ICs3MDcsOCBAQAogCiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYjsKICAgICAgICAgICAgIHJlcyA9IG1CdWZmZXJNYW5hZ2VyLT5nZXRCdWZmZXJGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksICZnYiwgZmVuY2VGZCwgLypub0ZyZWVCdWZmZXIqL3RydWUpOworICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpLCBpc011bHRpUmVzb2x1dGlvbigpLAorICAgICAgICAgICAgICAgICAgICAmZ2IsIGZlbmNlRmQsIC8qbm9GcmVlQnVmZmVyKi90cnVlKTsKIAogICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aGlzIGJ1ZmZlciB0byB0aGUgYnVmZmVyUXVldWU6IHRoZSBidWZmZXIgd2lsbCBiZSBpbiBkZXF1ZXVlIHN0YXRlIGFmdGVyCkBAIC02MjksNyArNzU1LDggQEAKICAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7CiAKICAgICAgICAgaWYgKG5vdGlmeUJ1ZmZlck1hbmFnZXIgJiYgbVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlcnNSZW1vdmVkKGdldElkKCksIGdldFN0cmVhbVNldElkKCksIGlzTXVsdGlSZXNvbHV0aW9uKCksCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRCdWZmZXJzLnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02NjUsNiArNzkyLDggQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAorICAgIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CisKICAgICBBTE9HVigiJXM6IGRpc2Nvbm5lY3Rpbmcgc3RyZWFtICVkIGZyb20gbmF0aXZlIHdpbmRvdyIsIF9fRlVOQ1RJT05fXywgZ2V0SWQoKSk7CiAKICAgICByZXMgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1Db25zdW1lci5nZXQoKSwKQEAgLTY4OSw3ICs4MTgsNyBAQAogICAgIC8vIFNpbmNlIGRldmljZSBpcyBhbHJlYWR5IGlkbGUsIHRoZXJlIGlzIG5vIGdldEJ1ZmZlciBjYWxsIHRvIGJ1ZmZlciBtYW5hZ2VyLCB1bnJlZ2lzdGVyIHRoZQogICAgIC8vIHN0cmVhbSBhdCB0aGlzIHBvaW50IHNob3VsZCBiZSBzYWZlLgogICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlcikgewotICAgICAgICByZXMgPSBtQnVmZmVyTWFuYWdlci0+dW5yZWdpc3RlclN0cmVhbShnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpKTsKKyAgICAgICAgcmVzID0gbUJ1ZmZlck1hbmFnZXItPnVucmVnaXN0ZXJTdHJlYW0oZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgaXNNdWx0aVJlc29sdXRpb24oKSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHVucmVnaXN0ZXIgc3RyZWFtICVkIGZyb20gYnVmZmVyIG1hbmFnZXIgIgogICAgICAgICAgICAgICAgICAgICAiKGVycm9yICVkICVzKSIsIF9fRlVOQ1RJT05fXywgbUlkLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKQEAgLTc1MCw3ICs4NzksNyBAQAogICAgIHVpbnQ2NF90IHUgPSAwOwogCiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7Ci0gICAgYXBwbHlaU0xVc2FnZVF1aXJrKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQsICZ1KTsKKyAgICBhcHBseVpTTFVzYWdlUXVpcmsoY2FtZXJhX3N0cmVhbTo6Zm9ybWF0LCAmdSk7CiAgICAgKnVzYWdlID0gdTsKICAgICByZXR1cm4gcmVzOwogfQpAQCAtODAxLDcgKzkzMCw4IEBACiAgICAgQUxPR1YoIlN0cmVhbSAlZDogQnVmZmVyIHJlbGVhc2VkIiwgc3RyZWFtLT5nZXRJZCgpKTsKICAgICBib29sIHNob3VsZEZyZWVCdWZmZXIgPSBmYWxzZTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPm1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlclJlbGVhc2VkKAotICAgICAgICBzdHJlYW0tPmdldElkKCksIHN0cmVhbS0+Z2V0U3RyZWFtU2V0SWQoKSwgJnNob3VsZEZyZWVCdWZmZXIpOworICAgICAgICBzdHJlYW0tPmdldElkKCksIHN0cmVhbS0+Z2V0U3RyZWFtU2V0SWQoKSwgc3RyZWFtLT5pc011bHRpUmVzb2x1dGlvbigpLAorICAgICAgICAmc2hvdWxkRnJlZUJ1ZmZlcik7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IHNpZ25hbGluZyBidWZmZXIgcmVsZWFzZSB0byBidWZmZXIgbWFuYWdlciBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtODE0LDcgKzk0NCw3IEBACiAgICAgICAgIHN0cmVhbS0+ZGV0YWNoQnVmZmVyTG9ja2VkKCZidWZmZXIsIC8qZmVuY2VGZCovIG51bGxwdHIpOwogICAgICAgICBpZiAoYnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIHN0cmVhbS0+bUJ1ZmZlck1hbmFnZXItPm5vdGlmeUJ1ZmZlclJlbW92ZWQoCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0SWQoKSwgc3RyZWFtLT5nZXRTdHJlYW1TZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRJZCgpLCBzdHJlYW0tPmdldFN0cmVhbVNldElkKCksIHN0cmVhbS0+aXNNdWx0aVJlc29sdXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC04MzIsNyArOTYyLDcgQEAKICAgICAgICAgc3RyZWFtLT5vbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKGJ1ZmZlcnMpOwogICAgICAgICBpZiAoc3RyZWFtLT5tVXNlQnVmZmVyTWFuYWdlcikgewogICAgICAgICAgICAgc3RyZWFtLT5tQnVmZmVyTWFuYWdlci0+b25CdWZmZXJzUmVtb3ZlZChzdHJlYW0tPmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0U3RyZWFtU2V0SWQoKSwgYnVmZmVycy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldFN0cmVhbVNldElkKCksIHN0cmVhbS0+aXNNdWx0aVJlc29sdXRpb24oKSwgYnVmZmVycy5zaXplKCkpOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJTdHJlYW0gJWQ6ICV6dSBCdWZmZXJzIGRpc2NhcmRlZC4iLCBzdHJlYW0tPmdldElkKCksIGJ1ZmZlcnMuc2l6ZSgpKTsKICAgICB9CkBAIC05NTcsNiArMTA4Nyw5OSBAQAogICAgIHJldHVybiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpICE9IDA7CiB9CiAKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6ZHVtcEltYWdlVG9EaXNrKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCBmZW5jZSkgeworICAgIC8vIERlcml2ZXIgb3V0cHV0IGZpbGUgbmFtZQorICAgIHN0ZDo6c3RyaW5nIGZpbGVFeHRlbnNpb24gPSAianBnIjsKKyAgICBjaGFyIGltYWdlRmlsZU5hbWVbNjRdOworICAgIHRpbWVfdCBub3cgPSB0aW1lKDApOworICAgIHRtICpsb2NhbFRpbWUgPSBsb2NhbHRpbWUoJm5vdyk7CisgICAgc25wcmludGYoaW1hZ2VGaWxlTmFtZSwgc2l6ZW9mKGltYWdlRmlsZU5hbWUpLCAiSU1HXyU0ZCUwMmQlMDJkXyUwMmQlMDJkJTAyZF8lIiBQUklkNjQgIi4lcyIsCisgICAgICAgICAgICAxOTAwICsgbG9jYWxUaW1lLT50bV95ZWFyLCBsb2NhbFRpbWUtPnRtX21vbiArIDEsIGxvY2FsVGltZS0+dG1fbWRheSwKKyAgICAgICAgICAgIGxvY2FsVGltZS0+dG1faG91ciwgbG9jYWxUaW1lLT50bV9taW4sIGxvY2FsVGltZS0+dG1fc2VjLAorICAgICAgICAgICAgdGltZXN0YW1wLCBmaWxlRXh0ZW5zaW9uLmNfc3RyKCkpOworCisgICAgLy8gTG9jayB0aGUgaW1hZ2UgZm9yIENQVSByZWFkCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IEdyYXBoaWNCdWZmZXI6OmZyb20oYW53QnVmZmVyKTsKKyAgICB2b2lkKiBtYXBwZWQgPSBudWxscHRyOworICAgIGJhc2U6OnVuaXF1ZV9mZCBmZW5jZUZkKGR1cChmZW5jZSkpOworICAgIHN0YXR1c190IHJlcyA9IGdyYXBoaWNCdWZmZXItPmxvY2tBc3luYyhHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX09GVEVOLCAmbWFwcGVkLAorICAgICAgICAgICAgZmVuY2VGZC5nZXQoKSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsb2NrIHRoZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRmlndXJlIG91dCBhY3R1YWwgZmlsZSBzaXplCisgICAgYXV0byBhY3R1YWxKcGVnU2l6ZSA9IGFuZHJvaWQ6OmNhbWVyYTI6OkpwZWdQcm9jZXNzb3I6OmZpbmRKcGVnU2l6ZSgodWludDhfdCopbWFwcGVkLCBtTWF4U2l6ZSk7CisgICAgaWYgKGFjdHVhbEpwZWdTaXplID09IDApIHsKKyAgICAgICAgYWN0dWFsSnBlZ1NpemUgPSBtTWF4U2l6ZTsKKyAgICB9CisKKyAgICAvLyBPdXRwdXQgaW1hZ2UgZGF0YSB0byBmaWxlCisgICAgc3RkOjpzdHJpbmcgZmlsZVBhdGggPSAiL2RhdGEvbWlzYy9jYW1lcmFzZXJ2ZXIvIjsKKyAgICBmaWxlUGF0aCArPSBpbWFnZUZpbGVOYW1lOworICAgIHN0ZDo6b2ZzdHJlYW0gaW1hZ2VGaWxlKGZpbGVQYXRoLmNfc3RyKCksIHN0ZDo6b2ZzdHJlYW06OmJpbmFyeSk7CisgICAgaWYgKCFpbWFnZUZpbGUuaXNfb3BlbigpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNyZWF0ZSBmaWxlICVzIiwgX19GVU5DVElPTl9fLCBmaWxlUGF0aC5jX3N0cigpKTsKKyAgICAgICAgZ3JhcGhpY0J1ZmZlci0+dW5sb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW1hZ2VGaWxlLndyaXRlKChjb25zdCBjaGFyKiltYXBwZWQsIGFjdHVhbEpwZWdTaXplKTsKKworICAgIGdyYXBoaWNCdWZmZXItPnVubG9jaygpOworfQorCitzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpzZXRCYXRjaFNpemUoc2l6ZV90IGJhdGNoU2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAoYmF0Y2hTaXplID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJhdGNoIHNpemUgMCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1Vc2VCdWZmZXJNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogYmF0Y2ggb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBidWZmZXIgbWFuYWdlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoIWlzVmlkZW9TdHJlYW0oKSkgeworICAgICAgICBBTE9HRSgiJXM6IGJhdGNoIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uLXZpZGVvIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPCBiYXRjaFNpemUpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYXRjaCBzaXplIGlzIGNhcHBlZCBieSBtYXhfYnVmZmVycyAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgIGJhdGNoU2l6ZSA9IGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzOworICAgIH0KKworICAgIHNpemVfdCBkZWZhdWx0QmF0Y2hTaXplID0gMTsKKyAgICBpZiAoIW1CYXRjaFNpemUuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoZGVmYXVsdEJhdGNoU2l6ZSwgYmF0Y2hTaXplKSkgeworICAgICAgICBBTE9HRSgiJXM6IGNoYW5nZSBiYXRjaCBzaXplIGZyb20gJXp1IHRvICV6dSBkeW5hbWljYWxseSBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlZmF1bHRCYXRjaFNpemUsIGJhdGNoU2l6ZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6cmV0dXJuUHJlZmV0Y2hlZEJ1ZmZlcnNMb2NrZWQoKSB7CisgICAgc3RkOjp2ZWN0b3I8U3VyZmFjZTo6QmF0Y2hCdWZmZXI+IGJhdGNoZWRCdWZmZXJzOworCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gYmF0Y2hMb2NrKG1CYXRjaExvY2spOworICAgICAgICBpZiAobUJhdGNoZWRCdWZmZXJzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICV6dSBleHRyYSBwcmVmZXRjaGVkIGJ1ZmZlcnMgZGV0ZWN0ZWQuIFJldHVybmluZyIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQmF0Y2hlZEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGJhdGNoZWRCdWZmZXJzID0gc3RkOjptb3ZlKG1CYXRjaGVkQnVmZmVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmF0Y2hlZEJ1ZmZlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICBtQ29uc3VtZXItPmNhbmNlbEJ1ZmZlcnMoYmF0Y2hlZEJ1ZmZlcnMpOworICAgIH0KK30KKwogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggYjRlNDlmOS4uYWQwM2I1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfT1VUUFVUX1NUUkVBTV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX09VVFBVVF9TVFJFQU1fSAogCisjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC00Nyw2ICs0OCw3IEBACiAgICAgdWludDY0X3QgY29tYmluZWRVc2FnZTsKICAgICBzaXplX3QgdG90YWxCdWZmZXJDb3VudDsKICAgICBib29sIGlzQ29uZmlndXJlZDsKKyAgICBib29sIGlzTXVsdGlSZXM7CiAgICAgZXhwbGljaXQgU3RyZWFtSW5mbyhpbnQgaWQgPSBDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElELAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICB1aW50MzJfdCB3ID0gMCwKQEAgLTU1LDcgKzU3LDggQEAKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRzID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOLAogICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UgPSAwLAogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gMCwKLSAgICAgICAgICAgIGJvb2wgY29uZmlndXJlZCA9IGZhbHNlKSA6CisgICAgICAgICAgICBib29sIGNvbmZpZ3VyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGJvb2wgbXVsdGlSZXMgPSBmYWxzZSkgOgogICAgICAgICAgICAgICAgIHN0cmVhbUlkKGlkKSwKICAgICAgICAgICAgICAgICBzdHJlYW1TZXRJZChzZXRJZCksCiAgICAgICAgICAgICAgICAgd2lkdGgodyksCkBAIC02NCw3ICs2Nyw4IEBACiAgICAgICAgICAgICAgICAgZGF0YVNwYWNlKGRzKSwKICAgICAgICAgICAgICAgICBjb21iaW5lZFVzYWdlKHVzYWdlKSwKICAgICAgICAgICAgICAgICB0b3RhbEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KSwKLSAgICAgICAgICAgICAgICBpc0NvbmZpZ3VyZWQoY29uZmlndXJlZCl7fQorICAgICAgICAgICAgICAgIGlzQ29uZmlndXJlZChjb25maWd1cmVkKSwKKyAgICAgICAgICAgICAgICBpc011bHRpUmVzKG11bHRpUmVzKSB7fQogfTsKIAogLyoqCkBAIC04MSwxMCArODUsMTAgQEAKICAgICAgKi8KICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKLQorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOwogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSBmb3IgZm9ybWF0cyB0aGF0IGhhdmUgYSB2YXJpYWJsZSBidWZmZXIgc2l6ZSBmb3IgdGhlIHNhbWUKICAgICAgKiBkaW1lbnNpb25zLCBzdWNoIGFzIGNvbXByZXNzZWQgSlBFRy4KQEAgLTkzLDEwICs5NywxMCBAQAogICAgICAqLwogICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxTdXJmYWNlPiBjb25zdW1lciwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKLQorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOwogICAgIC8qKgogICAgICAqIFNldCB1cCBhIHN0cmVhbSB3aXRoIGRlZmVycmVkIGNvbnN1bWVyIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSAyIGRpbWVuc2lvbnMsIHN1Y2ggYXMKICAgICAgKiBSQVcgYW5kIFlVVi4gVGhlIGNvbnN1bWVyIG11c3QgYmUgc2V0IGJlZm9yZSB1c2luZyB0aGlzIHN0cmVhbSBmb3Igb3V0cHV0LiBBIHZhbGlkCkBAIC0xMDQsOSArMTA4LDEwIEBACiAgICAgICovCiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKKyAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOwogCiAgICAgdmlydHVhbCB+Q2FtZXJhM091dHB1dFN0cmVhbSgpOwogCkBAIC0yMDYsMjMgKzIxMSwzOSBAQAogICAgICAgICAgICAgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gKm91dHB1dE1hcC8qb3V0Ki8pOwogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBiYXRjaCBzaXplIGZvciBidWZmZXIgb3BlcmF0aW9ucy4gVGhlIG91dHB1dCBzdHJlYW0gd2lsbCByZXF1ZXN0CisgICAgICogYnVmZmVycyBmcm9tIGJ1ZmZlciBxdWV1ZSBvbiBhIGJhdGNoIGJhc2lzLiBDdXJyZW50bHkgb25seSB2aWRlbyBzdHJlYW1zCisgICAgICogYXJlIGFsbG93ZWQgdG8gc2V0IHRoZSBiYXRjaCBzaXplLiBBbHNvIGlmIHRoZSBzdHJlYW0gaXMgbWFuYWdlZCBieQorICAgICAqIGJ1ZmZlciBtYW5hZ2VyIChTdXJmYWNlIGdyb3VwIGluIEphdmEgQVBJKSB0aGVuIGJhdGNoaW5nIGlzIGFsc28gbm90CisgICAgICogc3VwcG9ydGVkLiBDaGFuZ2luZyBiYXRjaCBzaXplIG9uIHRoZSBmbHkgd2hpbGUgdGhlcmUgaXMgYWxyZWFkeSBiYXRjaGVkCisgICAgICogYnVmZmVycyBpbiB0aGUgc3RyZWFtIGlzIGFsc28gbm90IHN1cHBvcnRlZC4KKyAgICAgKiBJZiB0aGUgYmF0Y2ggc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4IGRlcXVldWUgY291bnQgc2V0CisgICAgICogYnkgdGhlIGNhbWVyYSBIQUwsIHRoZSBiYXRjaCBzaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBtYXggZGVxdWV1ZSBjb3VudAorICAgICAqIGluc3RlYWQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCYXRjaFNpemUoc2l6ZV90IGJhdGNoU2l6ZSA9IDEpIG92ZXJyaWRlOworCisgICAgLyoqCiAgICAgICogQXBwbHkgWlNMIHJlbGF0ZWQgY29uc3VtZXIgdXNhZ2UgcXVpcmsuCiAgICAgICovCiAgICAgc3RhdGljIHZvaWQgYXBwbHlaU0xVc2FnZVF1aXJrKGludCBmb3JtYXQsIHVpbnQ2NF90ICpjb25zdW1lclVzYWdlIC8qaW5vdXQqLyk7CiAKKyAgICB2b2lkIHNldEltYWdlRHVtcE1hc2soaW50IG1hc2spIHsgbUltYWdlRHVtcE1hc2sgPSBtYXNrOyB9CisKICAgcHJvdGVjdGVkOgotICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKKyAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDAsIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKTsKKyAgICAgICAgICAgIGludCBzZXRJZCA9IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElELCBib29sIGlzTXVsdGlSZXNvbHV0aW9uID0gZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IHdlIHJlbGVhc2UgdGhlIGxvY2sgYnJpZWZseSBpbiB0aGlzIGZ1bmN0aW9uCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLApAQCAtMjkwLDE0ICszMTEsMjcgQEAKICAgICAvLyBXaGV0aGVyIHRvIGRyb3AgdmFsaWQgYnVmZmVycy4KICAgICBib29sIG1Ecm9wQnVmZmVyczsKIAorCisKKyAgICAvLyBUaGUgYmF0Y2ggc2l6ZSBmb3IgYnVmZmVyIG9wZXJhdGlvbgorICAgIHN0ZDo6YXRvbWljX3NpemVfdCBtQmF0Y2hTaXplID0gMTsKKworICAgIC8vIFByb3RlY3RpbmcgYmF0Y2ggc3RhdGVzIGJlbG93LCBtdXN0IGJlIGFjcXVpcmVkIGFmdGVyIG1Mb2NrCisgICAgc3RkOjptdXRleCBtQmF0Y2hMb2NrOworICAgIC8vIFByZWZldGNoZWQgYnVmZmVycyAocmVhZHkgdG8gYmUgaGFuZGVkIHRvIGNsaWVudCkKKyAgICBzdGQ6OnZlY3RvcjxTdXJmYWNlOjpCYXRjaEJ1ZmZlcj4gbUJhdGNoZWRCdWZmZXJzOworICAgIC8vIC0tLS0gRW5kIG9mIG1CYXRjaExvY2sgcHJvdGVjdGVkIHNjb3BlIC0tLS0KKwogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyc0xvY2tlZCgvKm91dCovc3RkOjp2ZWN0b3I8T3V0c3RhbmRpbmdCdWZmZXI+KiBidWZmZXJzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKQEAgLTMyNSw5ICszNTksMTYgQEAKICAgICAvLyBTVEFURV9BQkFORE9ORUQKICAgICBzdGF0aWMgYm9vbCBzaG91bGRMb2dFcnJvcihzdGF0dXNfdCByZXMsIFN0cmVhbVN0YXRlIHN0YXRlKTsKIAorICAgIC8vIER1bXAgaW1hZ2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0byBjb25zdW1lcgorICAgIHZvaWQgZHVtcEltYWdlVG9EaXNrKG5zZWNzX3QgdGltZXN0YW1wLCBBTmF0aXZlV2luZG93QnVmZmVyKiBhbndCdWZmZXIsIGludCBmZW5jZSk7CisKKyAgICB2b2lkIHJldHVyblByZWZldGNoZWRCdWZmZXJzTG9ja2VkKCk7CisKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVxdWV1ZUxhdGVuY3lCaW5TaXplID0gNTsgLy8gaW4gbXMKICAgICBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeTsKIAorICAgIGludCBtSW1hZ2VEdW1wTWFzayA9IDA7CisKIH07IC8vIGNsYXNzIENhbWVyYTNPdXRwdXRTdHJlYW0KIAogfSAvLyBuYW1lc3BhY2UgY2FtZXJhMwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCA3ZjVjODdhLi40OWY5ZjYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtOTUsNiArOTUsMTkgQEAKICAgICAgKiBRdWVyeSB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkIGZvciB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzgmIGdldFBoeXNpY2FsQ2FtZXJhSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGJhdGNoIHNpemUgZm9yIGJ1ZmZlciBvcGVyYXRpb25zLiBUaGUgb3V0cHV0IHN0cmVhbSB3aWxsIHJlcXVlc3QKKyAgICAgKiBidWZmZXJzIGZyb20gYnVmZmVyIHF1ZXVlIG9uIGEgYmF0Y2ggYmFzaXMuIEN1cnJlbnRseSBvbmx5IHZpZGVvIHN0cmVhbXMKKyAgICAgKiBhcmUgYWxsb3dlZCB0byBzZXQgdGhlIGJhdGNoIHNpemUuIEFsc28gaWYgdGhlIHN0cmVhbSBpcyBtYW5hZ2VkIGJ5CisgICAgICogYnVmZmVyIG1hbmFnZXIgKFN1cmZhY2UgZ3JvdXAgaW4gSmF2YSBBUEkpIHRoZW4gYmF0Y2hpbmcgaXMgYWxzbyBub3QKKyAgICAgKiBzdXBwb3J0ZWQuIENoYW5naW5nIGJhdGNoIHNpemUgb24gdGhlIGZseSB3aGlsZSB0aGVyZSBpcyBhbHJlYWR5IGJhdGNoZWQKKyAgICAgKiBidWZmZXJzIGluIHRoZSBzdHJlYW0gaXMgYWxzbyBub3Qgc3VwcG9ydGVkLgorICAgICAqIElmIHRoZSBiYXRjaCBzaXplIGlzIGxhcmdlciB0aGFuIHRoZSBtYXggZGVxdWV1ZSBjb3VudCBzZXQKKyAgICAgKiBieSB0aGUgY2FtZXJhIEhBTCwgdGhlIGJhdGNoIHNpemUgd2lsbCBiZSBzZXQgdG8gdGhlIG1heCBkZXF1ZXVlIGNvdW50CisgICAgICogaW5zdGVhZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhdGNoU2l6ZShzaXplX3QgYmF0Y2hTaXplID0gMSkgPSAwOwogfTsKIAogLy8gSGVscGVyIGNsYXNzIHRvIG9yZ2FuaXplIGEgc3luY2hyb25pemVkIG1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5jcHAKaW5kZXggZWVhNWVmMS4uOWYyMjVkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmNwcApAQCAtMTgyLDcgKzE4MiwzMyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKKyAgICAvLyBVcGRhdGUgcGFydGlhbCByZXN1bHQgYnkgcmVtb3Zpbmcga2V5cyByZW1hcHBlZCBieSBEaXN0b3J0aW9uQ29ycmVjdGlvbiwgWm9vbVJhdGlvLAorICAgIC8vIGFuZCBSb3RhdGlvbkFuZENyb3AgbWFwcGVycy4KKyAgICBzdGQ6OnNldDx1aW50MzJfdD4ga2V5c1RvUmVtb3ZlOworCisgICAgYXV0byBpdGVyID0gc3RhdGVzLmRpc3RvcnRpb25NYXBwZXJzLmZpbmQoc3RhdGVzLmNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChpdGVyICE9IHN0YXRlcy5kaXN0b3J0aW9uTWFwcGVycy5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiByZW1hcHBlZEtleXMgPSBpdGVyLT5zZWNvbmQuZ2V0UmVtYXBwZWRLZXlzKCk7CisgICAgICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgcmVtYXBwZWRLZXlzID0gc3RhdGVzLnpvb21SYXRpb01hcHBlcnNbc3RhdGVzLmNhbWVyYUlkLmNfc3RyKCldLmdldFJlbWFwcGVkS2V5cygpOworICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisKKyAgICBhdXRvIG1hcHBlciA9IHN0YXRlcy5yb3RhdGVBbmRDcm9wTWFwcGVycy5maW5kKHN0YXRlcy5jYW1lcmFJZC5jX3N0cigpKTsKKyAgICBpZiAobWFwcGVyICE9IHN0YXRlcy5yb3RhdGVBbmRDcm9wTWFwcGVycy5lbmQoKSkgeworICAgICAgICBjb25zdCBhdXRvJiByZW1hcHBlZEtleXMgPSBpdGVyLT5zZWNvbmQuZ2V0UmVtYXBwZWRLZXlzKCk7CisgICAgICAgIGtleXNUb1JlbW92ZS5pbnNlcnQocmVtYXBwZWRLZXlzLmJlZ2luKCksIHJlbWFwcGVkS2V5cy5lbmQoKSk7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBrZXkgOiBrZXlzVG9SZW1vdmUpIHsKKyAgICAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEuZXJhc2Uoa2V5KTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHBhcnRpYWwgcmVzdWx0CisgICAgaWYgKGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhLmVudHJ5Q291bnQoKSA+IDApIHsKKyAgICAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKHN0YXRlcywgJmNhcHR1cmVSZXN1bHQsIGZyYW1lTnVtYmVyKTsKKyAgICB9CiB9CiAKIHZvaWQgc2VuZENhcHR1cmVSZXN1bHQoCkBAIC0zOTcsNiArNDIzLDcgQEAKICAgICBJbkZsaWdodFJlcXVlc3RNYXAmIGluZmxpZ2h0TWFwID0gc3RhdGVzLmluZmxpZ2h0TWFwOwogICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IGluZmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKICAgICBjb25zdCB1aW50MzJfdCBmcmFtZU51bWJlciA9IGluZmxpZ2h0TWFwLmtleUF0KGlkeCk7CisgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlciA9IHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyOwogCiAgICAgbnNlY3NfdCBzZW5zb3JUaW1lc3RhbXAgPSByZXF1ZXN0LnNlbnNvclRpbWVzdGFtcDsKICAgICBuc2Vjc190IHNodXR0ZXJUaW1lc3RhbXAgPSByZXF1ZXN0LnNodXR0ZXJUaW1lc3RhbXA7CkBAIC00MTYsNyArNDQzLDcgQEAKIAogICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJmcmFtZSBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOwogCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBjaGVjayAtIGlmIHNlbnNvciB0aW1lc3RhbXAgbWF0Y2hlcyBzaHV0dGVyIHRpbWVzdGFtcCBpbiB0aGUKICAgICAgICAgLy8gY2FzZSBvZiByZXF1ZXN0IGhhdmluZyBjYWxsYmFjay4KICAgICAgICAgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2sgJiYgcmVxdWVzdC5yZXF1ZXN0U3RhdHVzID09IE9LICYmCiAgICAgICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wICE9IHNodXR0ZXJUaW1lc3RhbXApIHsKQEAgLTQzMyw3ICs0NjAsOSBAQAogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgIC8qcmVxdWVzdGVkKi90cnVlLCByZXF1ZXN0LnJlcXVlc3RUaW1lTnMsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyLAorICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAogICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOwogCkBAIC00NDYsNiArNDc1LDggQEAKICAgICAgICAgICAgIHN0YXRlcy5sYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIH0KIAorICAgICAgICBzZXNzaW9uU3RhdHNCdWlsZGVyLmluY1Jlc3VsdENvdW50ZXIocmVxdWVzdC5za2lwUmVzdWx0TWV0YWRhdGEpOworCiAgICAgICAgIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoc3RhdGVzLCBpZHgpOwogICAgICAgICBBTE9HVlYoIiVzOiByZW1vdmVkIGZyYW1lICVkIGZyb20gSW5GbGlnaHRNYXAiLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKICAgICB9CkBAIC00NTMsNyArNDg0LDIxIEBACiAgICAgc3RhdGVzLmluZmxpZ2h0SW50Zi5jaGVja0luZmxpZ2h0TWFwTGVuZ3RoTG9ja2VkKCk7CiB9CiAKLXZvaWQgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLCBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0ICpyZXN1bHQpIHsKKy8vIEVyYXNlIHRoZSBzdWJzZXQgb2YgcGh5c2ljYWxDYW1lcmFJZHMgdGhhdCBjb250YWlucyBpZAorYm9vbCBlcmFzZVBoeXNpY2FsQ2FtZXJhSWRTZXQoCisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c2V0PFN0cmluZzg+PiYgcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzgmIGlkKSB7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvciAoYXV0byBpdGVyID0gcGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKTsgaXRlciAhPSBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKTsgaXRlcisrKSB7CisgICAgICAgIGlmIChpdGVyLT5jb3VudChpZCkgPT0gMSkgeworICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9CisKK3ZvaWQgcHJvY2Vzc0NhcHR1cmVSZXN1bHQoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLCBjb25zdCBjYW1lcmFfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBzdGF0dXNfdCByZXM7CkBAIC01NTIsMTIgKzU5NywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlc3VsdC0+bnVtX3BoeXNjYW1fbWV0YWRhdGE7IGkrKykgewogICAgICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxJZChyZXN1bHQtPnBoeXNjYW1faWRzW2ldKTsKLSAgICAgICAgICAgICAgICBzdGQ6OnNldDxTdHJpbmc4Pjo6aXRlcmF0b3IgY2FtZXJhSWRJdGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGh5c2ljYWxDYW1lcmFJZHMuZmluZChwaHlzaWNhbElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRJdGVyICE9IHJlcXVlc3QucGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbENhbWVyYUlkcy5lcmFzZShjYW1lcmFJZEl0ZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlRvdGFsIHJlc3VsdCBmb3IgZnJhbWUgJWQgaGFzIGFscmVhZHkgcmV0dXJuZWQgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgYm9vbCB2YWxpZFBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VQaHlzaWNhbENhbWVyYUlkU2V0KHJlcXVlc3QucGh5c2ljYWxDYW1lcmFJZHMsIHBoeXNpY2FsSWQpOworICAgICAgICAgICAgICAgIGlmICghdmFsaWRQaHlzaWNhbENhbWVyYU1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlVuZXhwZWN0ZWQgdG90YWwgcmVzdWx0IGZvciBmcmFtZSAlZCBjYW1lcmEgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBwaHlzaWNhbElkLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQpAQCAtNjAyLDcgKzY0NSw3IEBACiAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wICE9IDApIHsKICAgICAgICAgICAgIHJldHVybkFuZFJlbW92ZVBlbmRpbmdPdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewpAQCAtNjU3LDcgKzcwMCw3IEBACiAgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXM7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+JiBmbXEgPSBzdGF0ZXMuZm1xOwogICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHMgPSBzdGF0ZXMuYnVmZmVyUmVjb3Jkc0ludGY7Ci0gICAgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCByOworICAgIGNhbWVyYV9jYXB0dXJlX3Jlc3VsdCByOwogICAgIHN0YXR1c190IHJlczsKICAgICByLmZyYW1lX251bWJlciA9IHJlc3VsdC5mcmFtZU51bWJlcjsKIApAQCAtNjk2LDcgKzczOSw3IEBACiAgICAgci5waHlzY2FtX2lkcyA9IHBoeXNDYW1JZHMuZGF0YSgpOwogICAgIHIucGh5c2NhbV9tZXRhZGF0YSA9IHBoeUNhbU1ldGFkYXRhcy5kYXRhKCk7CiAKLSAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gb3V0cHV0QnVmZmVycyhyZXN1bHQub3V0cHV0QnVmZmVycy5zaXplKCkpOworICAgIHN0ZDo6dmVjdG9yPGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Q+IG91dHB1dEJ1ZmZlcnMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKICAgICBzdGQ6OnZlY3RvcjxidWZmZXJfaGFuZGxlX3Q+IG91dHB1dEJ1ZmZlckhhbmRsZXMocmVzdWx0Lm91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5vdXRwdXRCdWZmZXJzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwpAQCAtNzU3LDcgKzgwMCw3IEBACiAgICAgci5udW1fb3V0cHV0X2J1ZmZlcnMgPSBvdXRwdXRCdWZmZXJzLnNpemUoKTsKICAgICByLm91dHB1dF9idWZmZXJzID0gb3V0cHV0QnVmZmVycy5kYXRhKCk7CiAKLSAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKKyAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOwogICAgIGlmIChyZXN1bHQuaW5wdXRCdWZmZXIuc3RyZWFtSWQgPT0gLTEpIHsKICAgICAgICAgci5pbnB1dF9idWZmZXIgPSBudWxscHRyOwogICAgIH0gZWxzZSB7CkBAIC03OTgsOCArODQxLDkgQEAKIHZvaWQgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyLAogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHJlcXVlc3RlZCwgbnNlY3NfdCByZXF1ZXN0VGltZU5zLAorICAgICAgICBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCiAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZpblJlc3VsdEV4dHJhcywKICAgICAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3kpIHsKQEAgLTgxMCw3ICs4NTQsNyBAQAogICAgICAgICBpbnQgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CiAKICAgICAgICAgLy8gQ2FsbCBub3RpZnkoRVJST1JfQlVGRkVSKSBpZiBuZWNlc3NhcnkuCi0gICAgICAgIGlmIChvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgJiYKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzID09IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SICYmCiAgICAgICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneSA9PSBFUlJPUl9CVUZfUkVUVVJOX05PVElGWSkgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcyA9IGluUmVzdWx0RXh0cmFzOwpAQCAtODI3LDYgKzg3MSwxMCBAQAogICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKICAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZCkgeworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RhdHNCdWlsZGVyLmluY0NvdW50ZXIoc3RyZWFtSWQsIC8qZHJvcHBlZCovdHJ1ZSwgMCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTgzNiw3ICs4ODQsNyBAQAogCiAgICAgICAgIC8vIERvIG5vdCByZXR1cm4gdGhlIGJ1ZmZlciBpZiB0aGUgYnVmZmVyIHN0YXR1cyBpcyBlcnJvciwgYW5kIHRoZSBlcnJvcgogICAgICAgICAvLyBidWZmZXIgc3RyYXRlZ3kgaXMgQ0FDSEUuCi0gICAgICAgIGlmIChvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyAhPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzICE9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SIHx8CiAgICAgICAgICAgICAgICAgZXJyb3JCdWZTdHJhdGVneSAhPSBFUlJPUl9CVUZfQ0FDSEUpIHsKICAgICAgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgewogICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKApAQCAtODUwLDIwICs4OTgsMzMgQEAKICAgICAgICAgfQogICAgICAgICAvLyBOb3RlOiBzdHJlYW0gbWF5IGJlIGRlYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQsIGlmIHRoaXMgYnVmZmVyIHdhcwogICAgICAgICAvLyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIGJvb2wgZHJvcHBlZCA9IGZhbHNlOwogICAgICAgICBpZiAocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSB7CiAgICAgICAgICAgICBBTE9HVigiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBzZXNzaW9uU3RhdHNCdWlsZGVyLnN0b3BDb3VudGVyKHN0cmVhbUlkKTsKICAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDYW4ndCByZXR1cm4gYnVmZmVyIHRvIGl0cyBzdHJlYW06ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGRyb3BwZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzID09IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IHRpbWVzdGFtcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZHJvcHBlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcXVlc3RlZCkgeworICAgICAgICAgICAgbnNlY3NfdCBidWZmZXJUaW1lTnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICBpbnQzMl90IGNhcHR1cmVMYXRlbmN5TXMgPSBuczJtcyhidWZmZXJUaW1lTnMgLSByZXF1ZXN0VGltZU5zKTsKKyAgICAgICAgICAgIHNlc3Npb25TdGF0c0J1aWxkZXIuaW5jQ291bnRlcihzdHJlYW1JZCwgZHJvcHBlZCwgY2FwdHVyZUxhdGVuY3lNcyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBMb25nIHByb2Nlc3NpbmcgY29uc3VtZXJzIGNhbiBjYXVzZSByZXR1cm5CdWZmZXIgdGltZW91dCBmb3Igc2hhcmVkIHN0cmVhbQogICAgICAgICAvLyBJZiB0aGF0IGhhcHBlbnMsIGNhbmNlbCB0aGUgYnVmZmVyIGFuZCBzZW5kIGEgYnVmZmVyIGVycm9yIHRvIGNsaWVudAogICAgICAgICBpZiAoaXQgIT0gb3V0cHV0U3VyZmFjZXMuZW5kKCkgJiYgcmVzID09IFRJTUVEX09VVCAmJgotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSykgeworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0uc3RhdHVzID09IENBTUVSQV9CVUZGRVJfU1RBVFVTX09LKSB7CiAgICAgICAgICAgICAvLyBjYW5jZWwgdGhlIGJ1ZmZlcgotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc2IgPSBvdXRwdXRCdWZmZXJzW2ldOwotICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgc3RyZWFtLT5yZXR1cm5CdWZmZXIoc2IsIC8qdGltZXN0YW1wKi8wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLCBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIHN0cmVhbS0+cmV0dXJuQnVmZmVyKHNiLCAvKnRpbWVzdGFtcCovMCwKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKICAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgewpAQCAtODc4LDEyICs5MzksMTQgQEAKIH0KIAogdm9pZCByZXR1cm5BbmRSZW1vdmVQZW5kaW5nT3V0cHV0QnVmZmVycyhib29sIHVzZUhhbEJ1Zk1hbmFnZXIsCi0gICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwgSW5GbGlnaHRSZXF1ZXN0JiByZXF1ZXN0KSB7CisgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwgSW5GbGlnaHRSZXF1ZXN0JiByZXF1ZXN0LAorICAgICAgICBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyKSB7CiAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyZXF1ZXN0LnpzbENhcHR1cmUgfHwgcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyh1c2VIYWxCdWZNYW5hZ2VyLCBsaXN0ZW5lciwKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLAotICAgICAgICAgICAgcmVxdWVzdC5zaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgcmVxdWVzdC5zaHV0dGVyVGltZXN0YW1wLCAvKnJlcXVlc3RlZCovdHJ1ZSwKKyAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdFRpbWVOcywgc2Vzc2lvblN0YXRzQnVpbGRlciwgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKIApAQCAtODkxLDcgKzk1NCw3IEBACiAgICAgZm9yIChhdXRvIGl0ZXIgPSByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmJlZ2luKCk7CiAgICAgICAgICAgICBpdGVyICE9IHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuZW5kKCk7ICkgewogICAgICAgICBpZiAocmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5ICE9IEVSUk9SX0JVRl9DQUNIRSB8fAotICAgICAgICAgICAgICAgIGl0ZXItPnN0YXR1cyAhPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpdGVyLT5zdGF0dXMgIT0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKICAgICAgICAgICAgIGl0ZXIgPSByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmVyYXNlKGl0ZXIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaXRlcisrOwpAQCAtODk5LDcgKzk2Miw3IEBACiAgICAgfQogfQogCi12b2lkIG5vdGlmeVNodXR0ZXIoQ2FwdHVyZU91dHB1dFN0YXRlcyYgc3RhdGVzLCBjb25zdCBjYW1lcmEzX3NodXR0ZXJfbXNnX3QgJm1zZykgewordm9pZCBub3RpZnlTaHV0dGVyKENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywgY29uc3QgY2FtZXJhX3NodXR0ZXJfbXNnX3QgJm1zZykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3NpemVfdCBpZHg7CiAKQEAgLTk2Niw3ICsxMDI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgci5yb3RhdGVBbmRDcm9wQXV0bywgci5jYW1lcmFJZHNXaXRoWm9vbSwgci5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5BbmRSZW1vdmVQZW5kaW5nT3V0cHV0QnVmZmVycygKLSAgICAgICAgICAgICAgICAgICAgc3RhdGVzLnVzZUhhbEJ1Zk1hbmFnZXIsIHN0YXRlcy5saXN0ZW5lciwgcik7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsIHIsIHN0YXRlcy5zZXNzaW9uU3RhdHNCdWlsZGVyKTsKIAogICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChzdGF0ZXMsIGlkeCk7CiAgICAgICAgIH0KQEAgLTk3NywyNiArMTA0MCwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBub3RpZnlFcnJvcihDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYTNfZXJyb3JfbXNnX3QgJm1zZykgewordm9pZCBub3RpZnlFcnJvcihDYXB0dXJlT3V0cHV0U3RhdGVzJiBzdGF0ZXMsIGNvbnN0IGNhbWVyYV9lcnJvcl9tc2dfdCAmbXNnKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICAvLyBNYXAgY2FtZXJhIEhBTCBlcnJvciBjb2RlcyB0byBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgZXJyb3IgY29kZXMKICAgICAvLyBJbmRleCBpbnRvIHRoaXMgd2l0aCB0aGUgSEFMIGVycm9yIGNvZGUKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBoYWxFcnJvck1hcFtDQU1FUkEzX01TR19OVU1fRVJST1JTXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBoYWxFcnJvck1hcFtDQU1FUkFfTVNHX05VTV9FUlJPUlNdID0gewogICAgICAgICAvLyAwID0gVW51c2VkIGVycm9yIGNvZGUKICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SLAotICAgICAgICAvLyAxID0gQ0FNRVJBM19NU0dfRVJST1JfREVWSUNFCisgICAgICAgIC8vIDEgPSBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRQogICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSwKLSAgICAgICAgLy8gMiA9IENBTUVSQTNfTVNHX0VSUk9SX1JFUVVFU1QKKyAgICAgICAgLy8gMiA9IENBTUVSQV9NU0dfRVJST1JfUkVRVUVTVAogICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCi0gICAgICAgIC8vIDMgPSBDQU1FUkEzX01TR19FUlJPUl9SRVNVTFQKKyAgICAgICAgLy8gMyA9IENBTUVSQV9NU0dfRVJST1JfUkVTVUxUCiAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxULAotICAgICAgICAvLyA0ID0gQ0FNRVJBM19NU0dfRVJST1JfQlVGRkVSCisgICAgICAgIC8vIDQgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUgogICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUgogICAgIH07CiAKICAgICBpbnQzMl90IGVycm9yQ29kZSA9CiAgICAgICAgICAgICAoKG1zZy5lcnJvcl9jb2RlID49IDApICYmCi0gICAgICAgICAgICAgICAgICAgIChtc2cuZXJyb3JfY29kZSA8IENBTUVSQTNfTVNHX05VTV9FUlJPUlMpKSA/CisgICAgICAgICAgICAgICAgICAgIChtc2cuZXJyb3JfY29kZSA8IENBTUVSQV9NU0dfTlVNX0VSUk9SUykpID8KICAgICAgICAgICAgIGhhbEVycm9yTWFwW21zZy5lcnJvcl9jb2RlXSA6CiAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1I7CiAKQEAgLTEwMzIsMTQgKzEwOTUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXRlciA9IHIucGh5c2ljYWxDYW1lcmFJZHMuZmluZChjYW1lcmFJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gci5waHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsaWRQaHlzaWNhbENhbWVyYUlkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlUGh5c2ljYWxDYW1lcmFJZFNldChyLnBoeXNpY2FsQ2FtZXJhSWRzLCBjYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZFBoeXNpY2FsQ2FtZXJhSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBSZXBvcnRlZCByZXN1bHQgZmFpbHVyZSBmb3IgcGh5c2ljYWwgY2FtZXJhIGRldmljZTogJXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhlIHJlc3BlY3RpdmUgcmVxdWVzdCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5waHlzaWNhbENhbWVyYUlkcy5lcmFzZShpdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxDYW1lcmFJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbERldmljZVJlc3VsdEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwODUsMTMgKzExNDgsMTMgQEAKICAgICB9CiB9CiAKLXZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKK3ZvaWQgbm90aWZ5KENhcHR1cmVPdXRwdXRTdGF0ZXMmIHN0YXRlcywgY29uc3QgY2FtZXJhX25vdGlmeV9tc2cgKm1zZykgewogICAgIHN3aXRjaCAobXNnLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgQ0FNRVJBM19NU0dfRVJST1I6IHsKKyAgICAgICAgY2FzZSBDQU1FUkFfTVNHX0VSUk9SOiB7CiAgICAgICAgICAgICBub3RpZnlFcnJvcihzdGF0ZXMsIG1zZy0+bWVzc2FnZS5lcnJvcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIENBTUVSQTNfTVNHX1NIVVRURVI6IHsKKyAgICAgICAgY2FzZSBDQU1FUkFfTVNHX1NIVVRURVI6IHsKICAgICAgICAgICAgIG5vdGlmeVNodXR0ZXIoc3RhdGVzLCBtc2ctPm1lc3NhZ2Uuc2h1dHRlcik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTEwNywxMCArMTE3MCwxMCBAQAogICAgIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RXJyb3JDb2RlOwogCiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjYW1lcmEzX25vdGlmeV9tc2cgbTsKKyAgICBjYW1lcmFfbm90aWZ5X21zZyBtOwogICAgIHN3aXRjaCAobXNnLnR5cGUpIHsKICAgICAgICAgY2FzZSBNc2dUeXBlOjpFUlJPUjoKLSAgICAgICAgICAgIG0udHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOworICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBX01TR19FUlJPUjsKICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBtc2cubXNnLmVycm9yLmZyYW1lTnVtYmVyOwogICAgICAgICAgICAgaWYgKG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KQEAgLTExMjYsMjEgKzExODksMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN3aXRjaCAobXNnLm1zZy5lcnJvci5lcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfREVWSUNFOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQTNfTVNHX0VSUk9SX0RFVklDRTsKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0RFVklDRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBFcnJvckNvZGU6OkVSUk9SX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBM19NU0dfRVJST1JfUkVRVUVTVDsKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1Q7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpFUlJPUl9SRVNVTFQ6Ci0gICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUOworICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQV9NU0dfRVJST1JfUkVTVUxUOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6RVJST1JfQlVGRkVSOgotICAgICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBDQU1FUkFfTVNHX0VSUk9SX0JVRkZFUjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNc2dUeXBlOjpTSFVUVEVSOgotICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBM19NU0dfU0hVVFRFUjsKKyAgICAgICAgICAgIG0udHlwZSA9IENBTUVSQV9NU0dfU0hVVFRFUjsKICAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLmZyYW1lX251bWJlciA9IG1zZy5tc2cuc2h1dHRlci5mcmFtZU51bWJlcjsKICAgICAgICAgICAgIG0ubWVzc2FnZS5zaHV0dGVyLnRpbWVzdGFtcCA9IG1zZy5tc2cuc2h1dHRlci50aW1lc3RhbXA7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEyMTgsMTMgKzEyODEsMTMgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CiAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgYnVmUmV0LnN0cmVhbUlkID0gc3RyZWFtSWQ7CiAgICAgICAgIHNpemVfdCBoYW5kT3V0QnVmZmVyQ291bnQgPSBvdXRwdXRTdHJlYW0tPmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCk7CiAgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnNSZXF1ZXN0ZWQgPSBidWZSZXEubnVtQnVmZmVyc1JlcXVlc3RlZDsKICAgICAgICAgc2l6ZV90IHRvdGFsSGFuZG91dCA9IGhhbmRPdXRCdWZmZXJDb3VudCArIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CkBAIC0xMjQxLDExICsxMzA0LDExIEBACiAKICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlcj4gdG1wUmV0QnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKICAgICAgICAgYm9vbCBjdXJyZW50UmVxU3VjY2VlZHMgPSB0cnVlOwotICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKICAgICAgICAgc2l6ZV90IG51bUFsbG9jYXRlZEJ1ZmZlcnMgPSAwOwogICAgICAgICBzaXplX3QgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzID0gMDsKICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1CdWZmZXJzUmVxdWVzdGVkOyBiKyspIHsKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CiAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCiAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKICAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0gIHN0YXRlcy5yZXFCdWZmZXJJbnRmLmdldFdhaXREdXJhdGlvbigpOwpAQCAtMTI1NSw2ICsxMzE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlci5zdG9wQ291bnRlcihzdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTEzMTUsMTIgKzEzNzksMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBiID0gMDsgYiA8IG51bUFsbG9jYXRlZEJ1ZmZlcnM7IGIrKykgewotICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOwogICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKLSAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwLCAvKnJlcXVlc3RlZCovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIC8qcmVxdWVzdFRpbWVOcyovMCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzU0LDkgKzE0MTksOSBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOwogICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBzdHJlYW1CdWZmZXIuc3RhdHVzID0gQ0FNRVJBX0JVRkZFUl9TVEFUVVNfRVJST1I7CiAgICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CiAgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CiAKQEAgLTEzNzcsMjIgKzE0NDIsMjMgQEAKICAgICAgICAgfQogICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCAvKmxpc3RlbmVyKi9udWxscHRyLAotICAgICAgICAgICAgICAgICZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwKTsKKyAgICAgICAgICAgICAgICAmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCwgLypyZXF1ZXN0ZWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgIC8qcmVxdWVzdFRpbWVOcyovMCwgc3RhdGVzLnNlc3Npb25TdGF0c0J1aWxkZXIpOwogICAgIH0KIH0KIAogdm9pZCBmbHVzaEluZmxpZ2h0UmVxdWVzdHMoRmx1c2hJbmZsaWdodFJlcVN0YXRlcyYgc3RhdGVzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICB7IC8vIEZpcnN0IHJldHVybiBidWZmZXJzIGNhY2hlZCBpbiBtSW5GbGlnaHRNYXAKKyAgICB7IC8vIEZpcnN0IHJldHVybiBidWZmZXJzIGNhY2hlZCBpbiBpbkZsaWdodE1hcAogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbChzdGF0ZXMuaW5mbGlnaHRMb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgc3RhdGVzLmluZmxpZ2h0TWFwLnNpemUoKTsgaWR4KyspIHsKICAgICAgICAgICAgIGNvbnN0IEluRmxpZ2h0UmVxdWVzdCAmcmVxdWVzdCA9IHN0YXRlcy5pbmZsaWdodE1hcC52YWx1ZUF0KGlkeCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICAgICAgICAgIHN0YXRlcy51c2VIYWxCdWZNYW5hZ2VyLCBzdGF0ZXMubGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLAotICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywKLSAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcywgcmVxdWVzdC5lcnJvckJ1ZlN0cmF0ZWd5KTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLypyZXF1ZXN0ZWQqL3RydWUsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0VGltZU5zLCBzdGF0ZXMuc2Vzc2lvblN0YXRzQnVpbGRlciwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzLCByZXF1ZXN0LmVycm9yQnVmU3RyYXRlZ3kpOwogICAgICAgICAgICAgQUxPR1coIiVzOiBGcmFtZSAlZCB8ICBUaW1lc3RhbXA6ICUiIFBSSWQ2NCAiLCBtZXRhZGF0YSIKICAgICAgICAgICAgICAgICAgICAgIiBhcnJpdmVkOiAlcywgYnVmZmVycyBsZWZ0OiAlZC5cbiIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLmluZmxpZ2h0TWFwLmtleUF0KGlkeCksIHJlcXVlc3Quc2h1dHRlclRpbWVzdGFtcCwKQEAgLTE0NTAsMjggKzE1MTYsMjkgQEAKICAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHN0ZDo6Z2V0PDE+KHR1cGxlKTsKICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIgPSBzdGQ6OmdldDwyPih0dXBsZSk7CiAKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOworICAgICAgICBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKICAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwogICAgICAgICBzdHJlYW1CdWZmZXIuYWNxdWlyZV9mZW5jZSA9IC0xOwogICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOwogCiAgICAgICAgIGZvciAoYXV0byYgc3RyZWFtIDogc3RyZWFtcykgewogICAgICAgICAgICAgaWYgKHN0cmVhbUlkID09IHN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFJldHVybiBidWZmZXIgdG8gZGVsZXRlZCBzdHJlYW0KLSAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbSogaGFsU3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW0qIGhhbFN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gaGFsU3RyZWFtOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX09VVFBVVDoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICgpLCBmcmFtZU51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCByZXR1cm4gb3V0cHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzdHJlYW0gJWQ6ICVzICglZCkiLCAgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9JTlBVVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1FUkFfU1RSRUFNX0lOUFVUOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihzdHJlYW1CdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcmV0dXJuIGlucHV0IGJ1ZmZlciBmb3IgZnJhbWUgJWQgdG8iCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0VXRpbHMuaAppbmRleCA5OTQ2MzEyLi4xNDI4ODlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRVdGlscy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFV0aWxzLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJkZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oIgorI2luY2x1ZGUgInV0aWxzL1Nlc3Npb25TdGF0c0J1aWxkZXIuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTQxLDYgKzQyLDY2IEBACiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAorICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zdHJlYW1fY29uZmlndXJhdGlvbiB7CisgICAgICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOworICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKipzdHJlYW1zOworICAgICAgICB1aW50MzJfdCBvcGVyYXRpb25fbW9kZTsKKyAgICAgICAgYm9vbCBpbnB1dF9pc19tdWx0aV9yZXNvbHV0aW9uOworICAgIH0gY2FtZXJhX3N0cmVhbV9jb25maWd1cmF0aW9uX3Q7CisKKyAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfY2FwdHVyZV9yZXF1ZXN0IHsKKyAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3M7CisgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKmlucHV0X2J1ZmZlcjsKKyAgICAgICAgdWludDMyX3QgbnVtX291dHB1dF9idWZmZXJzOworICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRfYnVmZmVyczsKKyAgICAgICAgdWludDMyX3QgbnVtX3BoeXNjYW1fc2V0dGluZ3M7CisgICAgICAgIGNvbnN0IGNoYXIgKipwaHlzY2FtX2lkOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fc2V0dGluZ3M7CisgICAgICAgIGludDMyX3QgaW5wdXRfd2lkdGg7CisgICAgICAgIGludDMyX3QgaW5wdXRfaGVpZ2h0OworICAgIH0gY2FtZXJhX2NhcHR1cmVfcmVxdWVzdF90OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX2NhcHR1cmVfcmVzdWx0IHsKKyAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVzdWx0OworICAgICAgICB1aW50MzJfdCBudW1fb3V0cHV0X2J1ZmZlcnM7CisgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyX3QgKm91dHB1dF9idWZmZXJzOworICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90ICppbnB1dF9idWZmZXI7CisgICAgICAgIHVpbnQzMl90IHBhcnRpYWxfcmVzdWx0OworICAgICAgICB1aW50MzJfdCBudW1fcGh5c2NhbV9tZXRhZGF0YTsKKyAgICAgICAgY29uc3QgY2hhciAqKnBoeXNjYW1faWRzOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqKnBoeXNjYW1fbWV0YWRhdGE7CisgICAgfSBjYW1lcmFfY2FwdHVyZV9yZXN1bHRfdDsKKworICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9zaHV0dGVyX21zZyB7CisgICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOworICAgIH0gY2FtZXJhX3NodXR0ZXJfbXNnX3Q7CisKKyAgICB0eXBlZGVmIHN0cnVjdCBjYW1lcmFfZXJyb3JfbXNnIHsKKyAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgICAgICBjYW1lcmFfc3RyZWFtX3QgKmVycm9yX3N0cmVhbTsKKyAgICAgICAgaW50IGVycm9yX2NvZGU7CisgICAgfSBjYW1lcmFfZXJyb3JfbXNnX3Q7CisKKyAgICB0eXBlZGVmIGVudW0gY2FtZXJhX2Vycm9yX21zZ19jb2RlIHsKKyAgICAgICAgQ0FNRVJBX01TR19FUlJPUl9ERVZJQ0UgPSAxLAorICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFUVVFU1QgPSAyLAorICAgICAgICBDQU1FUkFfTVNHX0VSUk9SX1JFU1VMVCA9IDMsCisgICAgICAgIENBTUVSQV9NU0dfRVJST1JfQlVGRkVSID0gNCwKKyAgICAgICAgQ0FNRVJBX01TR19OVU1fRVJST1JTCisgICAgfSBjYW1lcmFfZXJyb3JfbXNnX2NvZGVfdDsKKworICAgIHR5cGVkZWYgc3RydWN0IGNhbWVyYV9ub3RpZnlfbXNnIHsKKyAgICAgICAgaW50IHR5cGU7CisKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgY2FtZXJhX2Vycm9yX21zZ190IGVycm9yOworICAgICAgICAgICAgY2FtZXJhX3NodXR0ZXJfbXNnX3Qgc2h1dHRlcjsKKyAgICAgICAgfSBtZXNzYWdlOworICAgIH0gY2FtZXJhX25vdGlmeV9tc2dfdDsKKwogICAgIC8qKgogICAgICAqIEhlbHBlciBtZXRob2RzIHNoYXJlZCBiZXR3ZWVuIENhbWVyYTNEZXZpY2UvQ2FtZXJhM09mZmxpbmVTZXNzaW9uIGZvciBIQUwgY2FsbGJhY2tzCiAgICAgICovCkBAIC01MCw4ICsxMTEsOSBAQAogICAgIHZvaWQgcmV0dXJuT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKICAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwgLy8gT25seSBuZWVkZWQgd2hlbiBvdXRwdXRTdXJmYWNlcyBpcyBub3QgZW1wdHkKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCByZXF1ZXN0ZWQsIG5zZWNzX3QgcmVxdWVzdFRpbWVOcywKKyAgICAgICAgICAgIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9IHRydWUsCiAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgb25seSBtZWFudCBmb3Igc3VyZmFjZSBzaGFyaW5nIHVzZSBjYXNlCiAgICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRwdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSwKICAgICAgICAgICAgIC8vIFVzZWQgdG8gc2VuZCBidWZmZXIgZXJyb3IgY2FsbGJhY2sgd2hlbiBmYWlsaW5nIHRvIHJldHVybiBidWZmZXIKQEAgLTY0LDcgKzEyNiw3IEBACiAgICAgdm9pZCByZXR1cm5BbmRSZW1vdmVQZW5kaW5nT3V0cHV0QnVmZmVycygKICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciwKICAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lciwgLy8gT25seSBuZWVkZWQgd2hlbiBvdXRwdXRTdXJmYWNlcyBpcyBub3QgZW1wdHkKLSAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCYgcmVxdWVzdCk7CisgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QmIHJlcXVlc3QsIFNlc3Npb25TdGF0c0J1aWxkZXImIHNlc3Npb25TdGF0c0J1aWxkZXIpOwogCiAgICAgLy8gQ2FtZXJhM0RldmljZS9DYW1lcmEzT2ZmbGluZVNlc3Npb24gaW50ZXJuYWwgc3RhdGVzIHVzZWQgaW4gbm90aWZ5L3Byb2Nlc3NDYXB0dXJlUmVzdWx0CiAgICAgLy8gY2FsbGJhY2tzCkBAIC03Miw4ICsxMzQsOCBAQAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZDsKICAgICAgICAgc3RkOjptdXRleCYgaW5mbGlnaHRMb2NrOwogICAgICAgICBpbnQ2NF90JiBsYXN0Q29tcGxldGVkUmVndWxhckZyYW1lTnVtYmVyOwotICAgICAgICBpbnQ2NF90JiBsYXN0Q29tcGxldGVkWnNsRnJhbWVOdW1iZXI7CiAgICAgICAgIGludDY0X3QmIGxhc3RDb21wbGV0ZWRSZXByb2Nlc3NGcmFtZU51bWJlcjsKKyAgICAgICAgaW50NjRfdCYgbGFzdENvbXBsZXRlZFpzbEZyYW1lTnVtYmVyOwogICAgICAgICBJbkZsaWdodFJlcXVlc3RNYXAmIGluZmxpZ2h0TWFwOyAvLyBlbmQgb2YgaW5mbGlnaHRMb2NrIHNjb3BlCiAgICAgICAgIHN0ZDo6bXV0ZXgmIG91dHB1dExvY2s7CiAgICAgICAgIHN0ZDo6bGlzdDxDYXB0dXJlUmVzdWx0PiYgcmVzdWx0UXVldWU7CkBAIC05OCw2ICsxNjAsNyBAQAogICAgICAgICBUYWdNb25pdG9yJiB0YWdNb25pdG9yOwogICAgICAgICBzcDxDYW1lcmEzU3RyZWFtPiBpbnB1dFN0cmVhbTsKICAgICAgICAgU3RyZWFtU2V0JiBvdXRwdXRTdHJlYW1zOworICAgICAgICBTZXNzaW9uU3RhdHNCdWlsZGVyJiBzZXNzaW9uU3RhdHNCdWlsZGVyOwogICAgICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXI7CiAgICAgICAgIFNldEVycm9ySW50ZXJmYWNlJiBzZXRFcnJJbnRmOwogICAgICAgICBJbmZsaWdodFJlcXVlc3RVcGRhdGVJbnRlcmZhY2UmIGluZmxpZ2h0SW50ZjsKQEAgLTEyMSw2ICsxODQsNyBAQAogICAgICAgICBzdGQ6Om11dGV4JiByZXFCdWZmZXJMb2NrOyAvLyBsb2NrIHRvIHNlcmlhbGl6ZSByZXF1ZXN0IGJ1ZmZlciBjYWxscwogICAgICAgICBjb25zdCBib29sIHVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgICAgIFN0cmVhbVNldCYgb3V0cHV0U3RyZWFtczsKKyAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcjsKICAgICAgICAgU2V0RXJyb3JJbnRlcmZhY2UmIHNldEVyckludGY7CiAgICAgICAgIEJ1ZmZlclJlY29yZHNJbnRlcmZhY2UmIGJ1ZmZlclJlY29yZHNJbnRmOwogICAgICAgICBSZXF1ZXN0QnVmZmVySW50ZXJmYWNlJiByZXFCdWZmZXJJbnRmOwpAQCAtMTM0LDYgKzE5OCw3IEBACiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkOwogICAgICAgICBjb25zdCBib29sIHVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgICAgIFN0cmVhbVNldCYgb3V0cHV0U3RyZWFtczsKKyAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcjsKICAgICAgICAgQnVmZmVyUmVjb3Jkc0ludGVyZmFjZSYgYnVmZmVyUmVjb3Jkc0ludGY7CiAgICAgfTsKIApAQCAtMTQ5LDYgKzIxNCw3IEBACiAgICAgICAgIEluZmxpZ2h0UmVxdWVzdFVwZGF0ZUludGVyZmFjZSYgaW5mbGlnaHRJbnRmOwogICAgICAgICBCdWZmZXJSZWNvcmRzSW50ZXJmYWNlJiBidWZmZXJSZWNvcmRzSW50ZjsKICAgICAgICAgRmx1c2hCdWZmZXJJbnRlcmZhY2UmIGZsdXNoQnVmZmVySW50ZjsKKyAgICAgICAgU2Vzc2lvblN0YXRzQnVpbGRlciYgc2Vzc2lvblN0YXRzQnVpbGRlcjsKICAgICB9OwogCiAgICAgdm9pZCBmbHVzaEluZmxpZ2h0UmVxdWVzdHMoRmx1c2hJbmZsaWdodFJlcVN0YXRlcyYgc3RhdGVzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCmluZGV4IDg2YjQ1Y2IuLjE1Y2Y3ZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcApAQCAtMzAsMTEgKzMwLDEyIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKLSAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLCBwaHlzaWNhbENhbWVyYUlkLCBzZW5zb3JQaXhlbE1vZGVzVXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSwKICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIHNpemVfdCBjb25zdW1lckNvdW50ID0gc3RkOjptaW4oc3VyZmFjZXMuc2l6ZSgpLCBrTWF4T3V0cHV0cyk7CkBAIC02NSw3ICs2Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXMgPSBtU3RyZWFtU3BsaXR0ZXItPmNvbm5lY3QoaW5pdGlhbFN1cmZhY2VzLCB1c2FnZSwgbVVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMsCisgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KGluaXRpYWxTdXJmYWNlcywgdXNhZ2UsIG1Vc2FnZSwgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMsCiAgICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksICZtQ29uc3VtZXIpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCB0byBzdHJlYW0gc3BsaXR0ZXI6ICVzKCVkKSIsCkBAIC0xNTcsNyArMTU4LDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBpbnQgZmVuY2VGZCA9IC0xOwpAQCAtMTgwLDcgKzE4MSw3IEBACiAgICAgICogaW4gd2hpY2ggY2FzZSB3ZSByZWFzc2lnbiBpdCB0byBhY3F1aXJlX2ZlbmNlCiAgICAgICovCiAgICAgaGFuZG91dEJ1ZmZlckxvY2tlZCgqYnVmZmVyLCAmKGFuYi0+aGFuZGxlKSwgLyphY3F1aXJlRmVuY2UqL2ZlbmNlRmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKnJlbGVhc2VGZW5jZSovLTEsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgLypyZWxlYXNlRmVuY2UqLy0xLCBDQU1FUkFfQlVGRkVSX1NUQVRVU19PSywgLypvdXRwdXQqL3RydWUpOwogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCBlNjQ1ZTA1Li40YjYzNDFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMzYsOCArMzYsOSBAQAogICAgIENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oaW50IGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIHN1cmZhY2VzLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2UsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LAorICAgICAgICAgICAgY2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkLAogICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCiAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKQEAgLTExNiw3ICsxMTcsNyBAQAogICAgIC8qKgogICAgICAqIEludGVybmFsIENhbWVyYTNTdHJlYW0gaW50ZXJmYWNlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDIwZjYxNjguLjAyYjY1ODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtMzcsMjAgKzM3LDIyIEBACiAgICAgfQogfQogCi1DYW1lcmEzU3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpjYXN0KGNhbWVyYTNfc3RyZWFtICpzdHJlYW0pIHsKK0NhbWVyYTNTdHJlYW0qIENhbWVyYTNTdHJlYW06OmNhc3QoY2FtZXJhX3N0cmVhbSAqc3RyZWFtKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENhbWVyYTNTdHJlYW0qPihzdHJlYW0pOwogfQogCi1jb25zdCBDYW1lcmEzU3RyZWFtKiBDYW1lcmEzU3RyZWFtOjpjYXN0KGNvbnN0IGNhbWVyYTNfc3RyZWFtICpzdHJlYW0pIHsKK2NvbnN0IENhbWVyYTNTdHJlYW0qIENhbWVyYTNTdHJlYW06OmNhc3QoY29uc3QgY2FtZXJhX3N0cmVhbSAqc3RyZWFtKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNTdHJlYW0qPihzdHJlYW0pOwogfQogCiBDYW1lcmEzU3RyZWFtOjpDYW1lcmEzU3RyZWFtKGludCBpZCwKLSAgICAgICAgY2FtZXJhM19zdHJlYW1fdHlwZSB0eXBlLAorICAgICAgICBjYW1lcmFfc3RyZWFtX3R5cGUgdHlwZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCi0gICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwgaW50IHNldElkKSA6Ci0gICAgY2FtZXJhM19zdHJlYW0oKSwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsCisgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbikgOgorICAgIGNhbWVyYV9zdHJlYW0oKSwKICAgICBtSWQoaWQpLAogICAgIG1TZXRJZChzZXRJZCksCiAgICAgbU5hbWUoU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEzU3RyZWFtWyVkXSIsIGlkKSksCkBAIC03MywxNyArNzUsMTggQEAKICAgICBtRGF0YVNwYWNlT3ZlcnJpZGRlbihmYWxzZSksCiAgICAgbU9yaWdpbmFsRGF0YVNwYWNlKGRhdGFTcGFjZSksCiAgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCksCi0gICAgbUxhc3RUaW1lc3RhbXAoMCkgeworICAgIG1MYXN0VGltZXN0YW1wKDApLAorICAgIG1Jc011bHRpUmVzb2x1dGlvbihpc011bHRpUmVzb2x1dGlvbikgewogCi0gICAgY2FtZXJhM19zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKLSAgICBjYW1lcmEzX3N0cmVhbTo6d2lkdGggPSB3aWR0aDsKLSAgICBjYW1lcmEzX3N0cmVhbTo6aGVpZ2h0ID0gaGVpZ2h0OwotICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPSBmb3JtYXQ7Ci0gICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UgPSBkYXRhU3BhY2U7Ci0gICAgY2FtZXJhM19zdHJlYW06OnJvdGF0aW9uID0gcm90YXRpb247Ci0gICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gMDsKLSAgICBjYW1lcmEzX3N0cmVhbTo6cHJpdiA9IE5VTEw7Ci0gICAgY2FtZXJhM19zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCA9IG1QaHlzaWNhbENhbWVyYUlkLnN0cmluZygpOworICAgIGNhbWVyYV9zdHJlYW06OnN0cmVhbV90eXBlID0gdHlwZTsKKyAgICBjYW1lcmFfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOworICAgIGNhbWVyYV9zdHJlYW06OmhlaWdodCA9IGhlaWdodDsKKyAgICBjYW1lcmFfc3RyZWFtOjpmb3JtYXQgPSBmb3JtYXQ7CisgICAgY2FtZXJhX3N0cmVhbTo6ZGF0YV9zcGFjZSA9IGRhdGFTcGFjZTsKKyAgICBjYW1lcmFfc3RyZWFtOjpyb3RhdGlvbiA9IHJvdGF0aW9uOworICAgIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzID0gMDsKKyAgICBjYW1lcmFfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQgPSBtUGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKTsKKyAgICBjYW1lcmFfc3RyZWFtOjpzZW5zb3JfcGl4ZWxfbW9kZXNfdXNlZCA9IHNlbnNvclBpeGVsTW9kZXNVc2VkOwogCiAgICAgaWYgKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CIHx8IGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUpICYmCiAgICAgICAgICAgICBtYXhTaXplID09IDApIHsKQEAgLTEwMCwyMCArMTAzLDI4IEBACiAgICAgcmV0dXJuIG1TZXRJZDsKIH0KIAoraW50IENhbWVyYTNTdHJlYW06OmdldEhhbFN0cmVhbUdyb3VwSWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc011bHRpUmVzb2x1dGlvbiA/IG1TZXRJZCA6IC0xOworfQorCitib29sIENhbWVyYTNTdHJlYW06OmlzTXVsdGlSZXNvbHV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtSXNNdWx0aVJlc29sdXRpb247Cit9CisKIHVpbnQzMl90IENhbWVyYTNTdHJlYW06OmdldFdpZHRoKCkgY29uc3QgewotICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6d2lkdGg7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OndpZHRoOwogfQogCiB1aW50MzJfdCBDYW1lcmEzU3RyZWFtOjpnZXRIZWlnaHQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQ7CisgICAgcmV0dXJuIGNhbWVyYV9zdHJlYW06OmhlaWdodDsKIH0KIAogaW50IENhbWVyYTNTdHJlYW06OmdldEZvcm1hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKKyAgICByZXR1cm4gY2FtZXJhX3N0cmVhbTo6Zm9ybWF0OwogfQogCiBhbmRyb2lkX2RhdGFzcGFjZSBDYW1lcmEzU3RyZWFtOjpnZXREYXRhU3BhY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOworICAgIHJldHVybiBjYW1lcmFfc3RyZWFtOjpkYXRhX3NwYWNlOwogfQogCiB1aW50NjRfdCBDYW1lcmEzU3RyZWFtOjpnZXRVc2FnZSgpIGNvbnN0IHsKQEAgLTE1Miw2ICsxNjMsMTAgQEAKICAgICByZXR1cm4gbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9CiAKK2ludCBDYW1lcmEzU3RyZWFtOjpnZXRNYXhIYWxCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVyczsKK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpzZXRPZmZsaW5lUHJvY2Vzc2luZ1N1cHBvcnQoYm9vbCBzdXBwb3J0KSB7CiAgICAgbVN1cHBvcnRPZmZsaW5lUHJvY2Vzc2luZyA9IHN1cHBvcnQ7CiB9CkBAIC0yMjksNyArMjQ0LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1jYW1lcmEzX3N0cmVhbSogQ2FtZXJhM1N0cmVhbTo6c3RhcnRDb25maWd1cmF0aW9uKCkgeworY2FtZXJhX3N0cmVhbSogQ2FtZXJhM1N0cmVhbTo6c3RhcnRDb25maWd1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN0YXR1c190IHJlczsKQEAgLTI2MCw5ICsyNzUsOSBAQAogICAgIH0KIAogICAgIG1PbGRVc2FnZSA9IG1Vc2FnZTsKLSAgICBtT2xkTWF4QnVmZmVycyA9IGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVyczsKLSAgICBtT2xkRm9ybWF0ID0gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKLSAgICBtT2xkRGF0YVNwYWNlID0gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2U7CisgICAgbU9sZE1heEJ1ZmZlcnMgPSBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVyczsKKyAgICBtT2xkRm9ybWF0ID0gY2FtZXJhX3N0cmVhbTo6Zm9ybWF0OworICAgIG1PbGREYXRhU3BhY2UgPSBjYW1lcmFfc3RyZWFtOjpkYXRhX3NwYWNlOwogCiAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmbVVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0zMzAsMTYgKzM0NSwxNyBAQAogICAgIC8vIFJlZ2lzdGVyIGZvciBpZGxlIHRyYWNraW5nCiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwICYmIG1TdGF0dXNJZCA9PSBTdGF0dXNUcmFja2VyOjpOT19TVEFUVVNfSUQpIHsKLSAgICAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnN0cmluZygiU3RyZWFtICIpICsgc3RkOjp0b19zdHJpbmcobUlkKTsKKyAgICAgICAgbVN0YXR1c0lkID0gc3RhdHVzVHJhY2tlci0+YWRkQ29tcG9uZW50KG5hbWUuY19zdHIoKSk7CiAgICAgfQogCiAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIHVuY2hhbmdlZCwgYW5kIHNraXAgcmVhbGxvY2F0aW9uIGlmCi0gICAgLy8gc28uIEFzIGRvY3VtZW50ZWQgaW4gaGFyZHdhcmUvY2FtZXJhMy5oOmNvbmZpZ3VyZV9zdHJlYW1zKCkuCisgICAgLy8gc28uCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyAmJgogICAgICAgICAgICAgbU9sZFVzYWdlID09IG1Vc2FnZSAmJgotICAgICAgICAgICAgbU9sZE1heEJ1ZmZlcnMgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzICYmCi0gICAgICAgICAgICBtT2xkRGF0YVNwYWNlID09IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlICYmCi0gICAgICAgICAgICBtT2xkRm9ybWF0ID09IGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpIHsKKyAgICAgICAgICAgIG1PbGRNYXhCdWZmZXJzID09IGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzICYmCisgICAgICAgICAgICBtT2xkRGF0YVNwYWNlID09IGNhbWVyYV9zdHJlYW06OmRhdGFfc3BhY2UgJiYKKyAgICAgICAgICAgIG1PbGRGb3JtYXQgPT0gY2FtZXJhX3N0cmVhbTo6Zm9ybWF0KSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC0zOTgsNyArNDE0LDcgQEAKICAgICB9CiAKICAgICBtVXNhZ2UgPSBtT2xkVXNhZ2U7Ci0gICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID0gbU9sZE1heEJ1ZmZlcnM7CisgICAgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMgPSBtT2xkTWF4QnVmZmVyczsKIAogICAgIG1TdGF0ZSA9ICgobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKSB8fCAobVN0YXRlID09IFNUQVRFX0lOX0lETEUpKSA/IFNUQVRFX0NPTkZJR1VSRUQgOgogICAgICAgICAgICAgU1RBVEVfQ09OU1RSVUNURUQ7CkBAIC00MTMsNiArNDI5LDEzIEBACiAgICAgcmV0dXJuIG1TdHJlYW1VbnByZXBhcmFibGU7CiB9CiAKK3ZvaWQgQ2FtZXJhM1N0cmVhbTo6bWFya1VucHJlcGFyYWJsZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIG1TdHJlYW1VbnByZXBhcmFibGUgPSB0cnVlOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzdGFydFByZXBhcmUoaW50IG1heENvdW50LCBib29sIGJsb2NrUmVxdWVzdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTQ1OCw3ICs0ODEsNyBAQAogCiAgICAgbUxhc3RNYXhDb3VudCA9IGJ1ZmZlckNvdW50OwogCi0gICAgbVByZXBhcmVkQnVmZmVycy5pbnNlcnRBdChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCgpLCAvKmluZGV4Ki8wLCBidWZmZXJDb3VudCk7CisgICAgbVByZXBhcmVkQnVmZmVycy5pbnNlcnRBdChjYW1lcmFfc3RyZWFtX2J1ZmZlcl90KCksIC8qaW5kZXgqLzAsIGJ1ZmZlckNvdW50KTsKICAgICBtUHJlcGFyZWRCdWZmZXJJZHggPSAwOwogCiAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwpAQCAtNTMzLDcgKzU1Niw3IEBACiAgICAgLy8gdGhleSB3ZXJlbid0IGZpbGxlZC4KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QcmVwYXJlZEJ1ZmZlcklkeDsgaSsrKSB7CiAgICAgICAgIG1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5yZWxlYXNlX2ZlbmNlID0gLTE7Ci0gICAgICAgIG1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIG1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkFfQlVGRkVSX1NUQVRVU19FUlJPUjsKICAgICAgICAgcmV0dXJuQnVmZmVyTG9ja2VkKG1QcmVwYXJlZEJ1ZmZlcnNbaV0sIDApOwogICAgIH0KICAgICBtUHJlcGFyZWRCdWZmZXJzLmNsZWFyKCk7CkBAIC01OTksNyArNjIyLDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlcihjYW1lcmFfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICBuc2Vjc190IHdhaXRCdWZmZXJUaW1lb3V0LAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9IRlJfQ0FMTCgpOwpAQCAtNjE4LDkgKzY0MSwxMCBAQAogICAgIH0KIAogICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KLSAgICBpZiAoZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgc2l6ZV90IG51bU91dHN0YW5kaW5nQnVmZmVycyA9IGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworICAgIGlmIChudW1PdXRzdGFuZGluZ0J1ZmZlcnMgPT0gY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBBbHJlYWR5IGRlcXVldWVkIG1heCBvdXRwdXQgYnVmZmVycyAoJWQpLCB3YWl0IGZvciBuZXh0IHJldHVybmVkIG9uZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgICAgIG5zZWNzX3Qgd2FpdFN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgICAgICBpZiAod2FpdEJ1ZmZlclRpbWVvdXQgPCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKSB7CiAgICAgICAgICAgICB3YWl0QnVmZmVyVGltZW91dCA9IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb247CkBAIC02MzIsMTAgKzY1NiwxOCBAQAogICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHdhaXQgZm9yIG91dHB1dCBidWZmZXIgcmV0dXJuIHRpbWVkIG91dCBhZnRlciAlbGxkbXMgKG1heF9idWZmZXJzICVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdhaXRCdWZmZXJUaW1lb3V0IC8gMTAwMDAwMExMLAotICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KKworICAgICAgICBzaXplX3QgdXBkYXRlZE51bU91dHN0YW5kaW5nQnVmZmVycyA9IGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworICAgICAgICBpZiAodXBkYXRlZE51bU91dHN0YW5kaW5nQnVmZmVycyA+PSBudW1PdXRzdGFuZGluZ0J1ZmZlcnMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogb3V0c2FuZGluZyBidWZmZXIgY291bnQgZ29lcyBmcm9tICV6dSB0byAlenUsICIKKyAgICAgICAgICAgICAgICAgICAgImdldEJ1ZmZlcihzKSBjYWxsIG11c3Qgbm90IHJ1biBpbiBwYXJhbGxlbCEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIG51bU91dHN0YW5kaW5nQnVmZmVycywgdXBkYXRlZE51bU91dHN0YW5kaW5nQnVmZmVycyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXMgPSBnZXRCdWZmZXJMb2NrZWQoYnVmZmVyLCBzdXJmYWNlX2lkcyk7CkBAIC02NTAsNyArNjgyLDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1ib29sIENhbWVyYTNTdHJlYW06OmlzT3V0c3RhbmRpbmdCdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpIGNvbnN0eworYm9vbCBDYW1lcmEzU3RyZWFtOjppc091dHN0YW5kaW5nQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpIGNvbnN0ewogICAgIGlmIChidWZmZXIuYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTY2NSw3ICs2OTcsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDYW1lcmEzU3RyZWFtOjpyZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcikgewordm9pZCBDYW1lcmEzU3RyZWFtOjpyZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKSB7CiAgICAgaWYgKGJ1ZmZlci5idWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNjgwLDcgKzcxMiw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9IRlJfQ0FMTCgpOwpAQCAtNjk1LDExICs3MjcsMTEgQEAKICAgICByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihidWZmZXIpOwogCiAgICAgLy8gQnVmZmVyIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCwgc28gbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmVhbV9idWZmZXIgc3RydWN0LgotICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciBiID0gYnVmZmVyOworICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyIGIgPSBidWZmZXI7CiAgICAgaWYgKHRpbWVzdGFtcEluY3JlYXNpbmcgJiYgdGltZXN0YW1wICE9IDAgJiYgdGltZXN0YW1wIDw9IG1MYXN0VGltZXN0YW1wKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgJSIgUFJJZDY0ICIgaXMgbm90IGluY3JlYXNpbmcuIFByZXYgdGltZXN0YW1wICUiIFBSSWQ2NCwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgdGltZXN0YW1wLCBtTGFzdFRpbWVzdGFtcCk7Ci0gICAgICAgIGIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBiLnN0YXR1cyA9IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SOwogICAgIH0KICAgICBtTGFzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKIApAQCAtNzIzLDExICs3NTUsMTYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwgYm9vbCByZXNwZWN0SGFsTGltaXQpIHsKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmdldElucHV0QnVmZmVyKGNhbWVyYV9zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgICAgIFNpemUqIHNpemUsIGJvb2wgcmVzcGVjdEhhbExpbWl0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKKyAgICBpZiAoc2l6ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogc2l6ZSBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgb25seSBjYWxsZWQgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbmZpZ3VyZWQgYWxyZWFkeS4KICAgICBpZiAobVN0YXRlICE9IFNUQVRFX0NPTkZJR1VSRUQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXJzIGlmIHN0cmVhbSBpcyBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSAlZCIsCkBAIC03MzYsOSArNzczLDkgQEAKICAgICB9CiAKICAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCi0gICAgaWYgKGdldEhhbmRvdXRJbnB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzICYmIHJlc3BlY3RIYWxMaW1pdCkgeworICAgIGlmIChnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpID09IGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzICYmIHJlc3BlY3RIYWxMaW1pdCkgewogICAgICAgICBBTE9HVigiJXM6IEFscmVhZHkgZGVxdWV1ZWQgbWF4IGlucHV0IGJ1ZmZlcnMgKCVkKSwgd2FpdCBmb3IgbmV4dCByZXR1cm5lZCBvbmUuIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgICAgIHJlcyA9IG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsLndhaXRSZWxhdGl2ZShtTG9jaywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbik7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUKSB7CkBAIC03NDksNyArNzg2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlcyA9IGdldElucHV0QnVmZmVyTG9ja2VkKGJ1ZmZlcik7CisgICAgcmVzID0gZ2V0SW5wdXRCdWZmZXJMb2NrZWQoYnVmZmVyLCBzaXplKTsKICAgICBpZiAocmVzID09IE9LKSB7CiAgICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoKmJ1ZmZlciwgLyphY3F1aXJlZCovdHJ1ZSwgLypvdXRwdXQqL2ZhbHNlKTsKICAgICAgICAgaWYgKGJ1ZmZlci0+YnVmZmVyKSB7CkBAIC03NjEsNyArNzk4LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5JbnB1dEJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcikgeworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuSW5wdXRCdWZmZXIoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC04MDMsNyArODQwLDcgQEAKIH0KIAogdm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKAotICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCwgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID46Oml0ZXJhdG9yIGl0LCBlbmQ7CiAKQEAgLTgxMiw3ICs4NDksNyBAQAogICAgIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcjo6QnVmZmVySW5mbyBpbmZvID0KICAgICAgICAgQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyOjpCdWZmZXJJbmZvKCk7CiAgICAgaW5mby5tT3V0cHV0ID0gb3V0cHV0OwotICAgIGluZm8ubUVycm9yID0gKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKTsKKyAgICBpbmZvLm1FcnJvciA9IChidWZmZXIuc3RhdHVzID09IENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SKTsKICAgICBpbmZvLm1GcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgIGluZm8ubVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKICAgICBpbmZvLm1TdHJlYW1JZCA9IGdldElkKCk7CkBAIC04ODIsMjIgKzkxOSwyOCBAQAogICAgICAgICAgICAgIiAgICAgIExhdGVuY3kgaGlzdG9ncmFtIGZvciB3YWl0IG9uIG1heF9idWZmZXJzIik7CiB9CiAKLXN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKiwKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFMT0dFKCIlczogVGhpcyB0eXBlIG9mIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IG91dHB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQotc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXJzTG9ja2VkKHN0ZDo6dmVjdG9yPE91dHN0YW5kaW5nQnVmZmVyPiopIHsKKyAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KLXN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqKSB7CitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqLCBTaXplICopIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cmV0dXJuSW5wdXRCdWZmZXJMb2NrZWQoCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmKSB7CisgICAgICAgIGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQpAQCAtOTYwLDYgKzEwMDMsODAgQEAKICAgICBtQnVmZmVyRnJlZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXJzKHN0ZDo6dmVjdG9yPE91dHN0YW5kaW5nQnVmZmVyPiogYnVmZmVycywKKyAgICAgICAgbnNlY3NfdCB3YWl0QnVmZmVyVGltZW91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgaWYgKGJ1ZmZlcnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HSSgiJXM6IGJ1ZmZlcnMgbXVzdCBub3QgYmUgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCBudW1CdWZmZXJzUmVxdWVzdGVkID0gYnVmZmVycy0+c2l6ZSgpOworICAgIGlmIChudW1CdWZmZXJzUmVxdWVzdGVkID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiAwIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FCQU5ET05FRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IG51bU91dHN0YW5kaW5nQnVmZmVycyA9IGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworICAgIC8vIFdhaXQgZm9yIG5ldyBidWZmZXIgcmV0dXJuZWQgYmFjayBpZiB3ZSBhcmUgcnVubmluZyBpbnRvIHRoZSBsaW1pdC4KKyAgICB3aGlsZSAobnVtT3V0c3RhbmRpbmdCdWZmZXJzICsgbnVtQnVmZmVyc1JlcXVlc3RlZCA+IGNhbWVyYV9zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogQWxyZWFkeSBkZXF1ZXVlZCAlenUgb3V0cHV0IGJ1ZmZlcnMgYW5kIHJlcXVlc3RpbmcgJXp1IChtYXggaXMgJWQpLCB3YWl0aW5nLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1PdXRzdGFuZGluZ0J1ZmZlcnMsIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsCisgICAgICAgICAgICAgICAgY2FtZXJhX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgICAgICBuc2Vjc190IHdhaXRTdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKKyAgICAgICAgaWYgKHdhaXRCdWZmZXJUaW1lb3V0IDwga1dhaXRGb3JCdWZmZXJEdXJhdGlvbikgeworICAgICAgICAgICAgd2FpdEJ1ZmZlclRpbWVvdXQgPSBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB3YWl0RW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICBtQnVmZmVyTGltaXRMYXRlbmN5LmFkZCh3YWl0U3RhcnQsIHdhaXRFbmQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3Igb3V0cHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyAobWF4X2J1ZmZlcnMgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2FpdEJ1ZmZlclRpbWVvdXQgLyAxMDAwMDAwTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfc3RyZWFtOjptYXhfYnVmZmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHNpemVfdCB1cGRhdGVkTnVtT3V0c3RhbmRpbmdCdWZmZXJzID0gZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisgICAgICAgIGlmICh1cGRhdGVkTnVtT3V0c3RhbmRpbmdCdWZmZXJzID49IG51bU91dHN0YW5kaW5nQnVmZmVycykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBvdXRzYW5kaW5nIGJ1ZmZlciBjb3VudCBnb2VzIGZyb20gJXp1IHRvICV6dSwgIgorICAgICAgICAgICAgICAgICAgICAiZ2V0QnVmZmVyKHMpIGNhbGwgbXVzdCBub3QgcnVuIGluIHBhcmFsbGVsISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgbnVtT3V0c3RhbmRpbmdCdWZmZXJzLCB1cGRhdGVkTnVtT3V0c3RhbmRpbmdCdWZmZXJzKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBudW1PdXRzdGFuZGluZ0J1ZmZlcnMgPSB1cGRhdGVkTnVtT3V0c3RhbmRpbmdCdWZmZXJzOworICAgIH0KKworICAgIHJlcyA9IGdldEJ1ZmZlcnNMb2NrZWQoYnVmZmVycyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBmb3IgKGF1dG8mIG91dHN0YW5kaW5nQnVmZmVyIDogKmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIGNhbWVyYV9zdHJlYW1fYnVmZmVyKiBidWZmZXIgPSBvdXRzdGFuZGluZ0J1ZmZlci5vdXRCdWZmZXI7CisgICAgICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKCpidWZmZXIsIC8qYWNxdWlyZWQqL3RydWUsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1PdXRzdGFuZGluZ0J1ZmZlcnNMb2NrKTsKKyAgICAgICAgICAgICAgICBtT3V0c3RhbmRpbmdCdWZmZXJzLnB1c2hfYmFjaygqYnVmZmVyLT5idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggZDc2OGQzZC4uNWEzNjRhYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKLQogI2luY2x1ZGUgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uaCIKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaCIKICNpbmNsdWRlICJDYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgiCkBAIC01MCw3ICs0OCw3IEBACiAgKiAgICB3aXRoIHRoZSBIQUwuCiAgKgogICogIFNUQVRFX0lOX0NPTkZJRzogQ29uZmlndXJhdGlvbiBoYXMgc3RhcnRlZCwgYnV0IG5vdCB5ZXQgY29uY2x1ZGVkLiBEdXJpbmcgdGhpcwotICogICAgdGltZSwgdGhlIHVzYWdlLCBtYXhfYnVmZmVycywgYW5kIHByaXYgZmllbGRzIG9mIGNhbWVyYTNfc3RyZWFtIHJldHVybmVkIGJ5CisgKiAgICB0aW1lLCB0aGUgdXNhZ2UsIG1heF9idWZmZXJzLCBhbmQgcHJpdiBmaWVsZHMgb2YgY2FtZXJhX3N0cmVhbSByZXR1cm5lZCBieQogICogICAgc3RhcnRDb25maWd1cmF0aW9uKCkgbWF5IGJlIG1vZGlmaWVkLgogICoKICAqICBTVEFURV9JTl9SRV9DT05GSUc6IENvbmZpZ3VyYXRpb24gaGFzIHN0YXJ0ZWQsIGFuZCB0aGUgc3RyZWFtIGhhcyBiZWVuCkBAIC0xMzAsMTUgKzEyOCwxNSBAQAogICoKICAqLwogY2xhc3MgQ2FtZXJhM1N0cmVhbSA6Ci0gICAgICAgIHByb3RlY3RlZCBjYW1lcmEzX3N0cmVhbSwKKyAgICAgICAgcHJvdGVjdGVkIGNhbWVyYV9zdHJlYW0sCiAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIENhbWVyYTNTdHJlYW1JbnRlcmZhY2UsCiAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzU3RyZWFtKCk7CiAKLSAgICBzdGF0aWMgQ2FtZXJhM1N0cmVhbSogICAgICAgY2FzdChjYW1lcmEzX3N0cmVhbSAqc3RyZWFtKTsKLSAgICBzdGF0aWMgY29uc3QgQ2FtZXJhM1N0cmVhbSogY2FzdChjb25zdCBjYW1lcmEzX3N0cmVhbSAqc3RyZWFtKTsKKyAgICBzdGF0aWMgQ2FtZXJhM1N0cmVhbSogICAgICAgY2FzdChjYW1lcmFfc3RyZWFtICpzdHJlYW0pOworICAgIHN0YXRpYyBjb25zdCBDYW1lcmEzU3RyZWFtKiBjYXN0KGNvbnN0IGNhbWVyYV9zdHJlYW0gKnN0cmVhbSk7CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0cmVhbSdzIElECkBAIC0xNDksNiArMTQ3LDE0IEBACiAgICAgICogR2V0IHRoZSBvdXRwdXQgc3RyZWFtIHNldCBpZC4KICAgICAgKi8KICAgICBpbnQgICAgICAgICAgICAgIGdldFN0cmVhbVNldElkKCkgY29uc3Q7CisgICAgLyoqCisgICAgICogSXMgdGhpcyBzdHJlYW0gcGFydCBvZiBhIG11bHRpLXJlc29sdXRpb24gc3RyZWFtIHNldAorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICAgaXNNdWx0aVJlc29sdXRpb24oKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEhBTCBzdHJlYW0gZ3JvdXAgaWQgZm9yIGEgbXVsdGktcmVzb2x1dGlvbiBzdHJlYW0gc2V0CisgICAgICovCisgICAgaW50ICAgICAgICAgICAgICBnZXRIYWxTdHJlYW1Hcm91cElkKCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0cmVhbSdzIGRpbWVuc2lvbnMgYW5kIGZvcm1hdApAQCAtMTY1LDEyICsxNzEsMTMgQEAKICAgICB2b2lkICAgICAgICAgICAgICBzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRlbik7CiAgICAgYm9vbCAgICAgICAgICAgICAgaXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3Q7CiAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0T3JpZ2luYWxEYXRhU3BhY2UoKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgICBnZXRNYXhIYWxCdWZmZXJzKCkgY29uc3Q7CiAgICAgY29uc3QgU3RyaW5nOCYgICAgcGh5c2ljYWxDYW1lcmFJZCgpIGNvbnN0OwogCiAgICAgdm9pZCAgICAgICAgICAgICAgc2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KGJvb2wpIG92ZXJyaWRlOwogICAgIGJvb2wgICAgICAgICAgICAgIGdldE9mZmxpbmVQcm9jZXNzaW5nU3VwcG9ydCgpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgY2FtZXJhM19zdHJlYW0qICAgYXNIYWxTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgY2FtZXJhX3N0cmVhbSogICBhc0hhbFN0cmVhbSgpIG92ZXJyaWRlIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCkBAIC0xNzksMTQgKzE4NiwxMiBAQAogICAgICAqIGluZm9ybWF0aW9uIHRvIGJlIHBhc3NlZCBpbnRvIHRoZSBIQUwgZGV2aWNlJ3MgY29uZmlndXJlX3N0cmVhbXMgY2FsbC4KICAgICAgKgogICAgICAqIFVudGlsIGZpbmlzaENvbmZpZ3VyYXRpb24oKSBpcyBjYWxsZWQsIG5vIG90aGVyIG1ldGhvZHMgb24gdGhlIHN0cmVhbSBtYXkgYmUKLSAgICAgKiBjYWxsZWQuIFRoZSB1c2FnZSBhbmQgbWF4X2J1ZmZlcnMgZmllbGRzIG9mIGNhbWVyYTNfc3RyZWFtIG1heSBiZSBtb2RpZmllZAorICAgICAqIGNhbGxlZC4gVGhlIHVzYWdlIGFuZCBtYXhfYnVmZmVycyBmaWVsZHMgb2YgY2FtZXJhX3N0cmVhbSBtYXkgYmUgbW9kaWZpZWQKICAgICAgKiBiZXR3ZWVuIHN0YXJ0L2ZpbmlzaENvbmZpZ3VyYXRpb24sIGJ1dCBtYXkgbm90IGJlIGNoYW5nZWQgYWZ0ZXIgdGhhdC4KLSAgICAgKiBUaGUgcHJpdiBmaWVsZCBvZiBjYW1lcmEzX3N0cmVhbSBtYXkgYmUgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIKLSAgICAgKiBzdGFydENvbmZpZ3VyYXRpb24uCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciBzdGFydGluZyBjb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIGNhbWVyYTNfc3RyZWFtKiAgc3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgY2FtZXJhX3N0cmVhbSogIHN0YXJ0Q29uZmlndXJhdGlvbigpOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBpcyBtaWQtY29uZmlndXJhdGlvbiAoc3RhcnQgaGFzIGJlZW4gY2FsbGVkLCBidXQgbm90CkBAIC0yMjYsNiArMjMxLDExIEBACiAgICAgYm9vbCAgICAgICAgICAgICBpc1VucHJlcGFyYWJsZSgpOwogCiAgICAgLyoqCisgICAgICogTWFyayB0aGUgc3RyZWFtIGFzIHVucHJlcGFyYWJsZS4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgIG1hcmtVbnByZXBhcmFibGUoKSBvdmVycmlkZTsKKworICAgIC8qKgogICAgICAqIFN0YXJ0IHN0cmVhbSBwcmVwYXJhdGlvbi4gTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLAogICAgICAqIHdoZW4gbm8gdmFsaWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLiBQcmVwYXJlcwogICAgICAqIHVwIHRvIG1heENvdW50IGJ1ZmZlcnMsIG9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIG5lZWRlZCBieSB0aGUKQEAgLTMwNyw3ICszMTcsNyBAQAogICAgIHN0YXR1c190ICAgICAgIHRlYXJEb3duKCk7CiAKICAgICAvKioKLSAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKKyAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmFfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKICAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQpAQCAtMzIwLDExICszMzAsMTcgQEAKICAgICAgKiBidWZmZXJzLgogICAgICAqCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgc3RhdHVzX3QgICAgICAgICBnZXRCdWZmZXIoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3Qgd2FpdEJ1ZmZlclRpbWVvdXQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICAvKioKKyAgICAgKiBTaW1pbGFyIHRvIGdldEJ1ZmZlcigpIGV4Y2VwdCB0aGlzIG1ldGhvZCBmaWxscyBtdWx0aXBsZSBidWZmZXJzLgorICAgICAqLworICAgIHN0YXR1c190ICAgICAgICAgZ2V0QnVmZmVycyhzdGQ6OnZlY3RvcjxPdXRzdGFuZGluZ0J1ZmZlcj4qIGJ1ZmZlcnMsCisgICAgICAgICAgICBuc2Vjc190IHdhaXRCdWZmZXJUaW1lb3V0KTsKKworICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgogICAgICAqCiAgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKQEAgLTMzNSwyMyArMzUxLDI2IEBACiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KLSAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKKyAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAogICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKIAogICAgIC8qKgotICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcworICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYV9zdHJlYW1fYnVmZmVyIHdpdGggdGhlIG5leHQgdmFsaWQgYnVmZmVyIGZvciB0aGlzCiAgICAgICogc3RyZWFtLCB0byBoYW5kIG92ZXIgdG8gdGhlIEhBTC4KICAgICAgKgogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIGZpbmlzaENvbmZpZ3VyYXRpb24gaGFzIGJlZW4gY2FsbGVkLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIGlucHV0LXNpZGUKICAgICAgKiBidWZmZXJzLgogICAgICAqCisgICAgICogVGhpcyBtZXRob2QgYWxzbyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBpbnB1dCBidWZmZXIuCisgICAgICoKICAgICAgKiBOb3JtYWxseSB0aGlzIGNhbGwgd2lsbCBibG9jayB1bnRpbCB0aGUgaGFuZGVkIG91dCBidWZmZXIgY291bnQgaXMgbGVzcyB0aGFuIHRoZSBzdHJlYW0KICAgICAgKiBtYXggYnVmZmVyIGNvdW50OyBpZiByZXNwZWN0SGFsTGltaXQgaXMgc2V0IHRvIGZhbHNlLCB0aGlzIGlzIGlnbm9yZWQuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBnZXRJbnB1dEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwgYm9vbCByZXNwZWN0SGFsTGltaXQgPSB0cnVlKTsKKyAgICBzdGF0dXNfdCAgICAgICAgIGdldElucHV0QnVmZmVyKGNhbWVyYV9zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUqIHNpemUsIGJvb2wgcmVzcGVjdEhhbExpbWl0ID0gdHJ1ZSk7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KQEAgLTM1OSw3ICszNzgsNyBAQAogICAgICAqIFRoaXMgbWV0aG9kIG1heSBvbmx5IGJlIGNhbGxlZCBmb3IgYnVmZmVycyBwcm92aWRlZCBieSBnZXRCdWZmZXIoKS4KICAgICAgKiBGb3IgYmlkaXJlY3Rpb25hbCBzdHJlYW1zLCB0aGlzIG1ldGhvZCBhcHBsaWVzIHRvIHRoZSBpbnB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KLSAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybklucHV0QnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKKyAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybklucHV0QnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpOwogCiAgICAgLy8gZ2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IGJ1ZmZlciBxdWV1ZS4KICAgICAvLyBvbmx5IGFwcGx5IHRvIGlucHV0IHN0cmVhbXMuCkBAIC00NzYsMTAgKzQ5NSwxMiBAQAogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAotICAgIENhbWVyYTNTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlIHR5cGUsCisgICAgQ2FtZXJhM1N0cmVhbShpbnQgaWQsIGNhbWVyYV9zdHJlYW1fdHlwZSB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQsCi0gICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLCBpbnQgc2V0SWQpOworICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwKKyAgICAgICAgICAgIGludCBzZXRJZCwgYm9vbCBpc011bHRpUmVzb2x1dGlvbik7CiAKICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbUJ1ZmZlckZyZWVkTGlzdGVuZXI7CiAKQEAgLTQ4OSwxOCArNTEwLDIyIEBACiAKICAgICAvLyBnZXRCdWZmZXIgLyByZXR1cm5CdWZmZXIgaW1wbGVtZW50YXRpb25zCiAKLSAgICAvLyBTaW5jZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgaW5jbHVkZXMgYSByYXcgcG9pbnRlciB0byB0aGUgc3RyZWFtLAotICAgIC8vIGNhc3QgdG8gY2FtZXJhM19zdHJlYW0qLCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpbmNyZW1lbnQgdGhlCisgICAgLy8gU2luY2UgY2FtZXJhX3N0cmVhbV9idWZmZXIgaW5jbHVkZXMgYSByYXcgcG9pbnRlciB0byB0aGUgc3RyZWFtLAorICAgIC8vIGNhc3QgdG8gY2FtZXJhX3N0cmVhbSosIGltcGxlbWVudGF0aW9ucyBtdXN0IGluY3JlbWVudCB0aGUKICAgICAvLyByZWZjb3VudCBvZiB0aGUgc3RyZWFtIG1hbnVhbGx5IGluIGdldEJ1ZmZlckxvY2tlZCwgYW5kIGRlY3JlbWVudCBpdCBpbgogICAgIC8vIHJldHVybkJ1ZmZlckxvY2tlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmFfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyc0xvY2tlZChzdGQ6OnZlY3RvcjxPdXRzdGFuZGluZ0J1ZmZlcj4qKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJMb2NrZWQoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwgU2l6ZSogc2l6ZSk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAotICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOworICAgICAgICAgICAgY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcik7CiAgICAgdmlydHVhbCBib29sICAgICBoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKSBjb25zdCA9IDA7CiAgICAgLy8gR2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IGJ1ZmZlciBxdWV1ZS4gT25seSBhcHBseSB0byBpbnB1dCBzdHJlYW1zLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwpAQCAtNTI5LDcgKzU1NCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQ2NF90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgLy8gUmV0dXJuIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyBpbiB0aGUgbGlzdCBvZiBvdXRzdGFuZGluZyBidWZmZXJzLgotICAgIGJvb2wgaXNPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlcikgY29uc3Q7CisgICAgYm9vbCBpc091dHN0YW5kaW5nQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyJiBidWZmZXIpIGNvbnN0OwogCiAgICAgLy8gVHJhY2tpbmcgZm9yIGlkbGUgc3RhdGUKICAgICB3cDxTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKQEAgLTU1MywxNCArNTc4LDE0IEBACiAgICAgQ29uZGl0aW9uIG1JbnB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0Rm9yQnVmZmVyRHVyYXRpb24gPSAzMDAwMDAwMDAwTEw7IC8vIDMwMDAgbXMKIAotICAgIHZvaWQgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwKKyAgICB2b2lkIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoY29uc3QgY2FtZXJhX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwKICAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0LCBuc2Vjc190IHRpbWVzdGFtcCA9IDAsIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAgICAgTGlzdDx3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+ID4gbUJ1ZmZlckxpc3RlbmVyTGlzdDsKIAogICAgIHN0YXR1c190ICAgICAgICBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7CiAKICAgICAvLyBSZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIHRoZSBsaXN0IG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMuCi0gICAgdm9pZCByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlcik7CisgICAgdm9pZCByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihjb25zdCBjYW1lcmFfc3RyZWFtX2J1ZmZlciYgYnVmZmVyKTsKIAogICAgIC8vIFRyYWNraW5nIGZvciBQUkVQQVJJTkcgc3RhdGUKIApAQCAtNTcwLDcgKzU5NSw3IEBACiAgICAgYm9vbCBtUHJlcGFyZWQ7CiAgICAgYm9vbCBtUHJlcGFyZUJsb2NrUmVxdWVzdDsKIAotICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gbVByZXBhcmVkQnVmZmVyczsKKyAgICBWZWN0b3I8Y2FtZXJhX3N0cmVhbV9idWZmZXJfdD4gbVByZXBhcmVkQnVmZmVyczsKICAgICBzaXplX3QgbVByZXBhcmVkQnVmZmVySWR4OwogCiAgICAgLy8gTnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIG9uIGxhc3QgcHJlcGFyZSBjYWxsLgpAQCAtNTk2LDYgKzYyMSw3IEBACiAgICAgU3RyaW5nOCBtUGh5c2ljYWxDYW1lcmFJZDsKICAgICBuc2Vjc190IG1MYXN0VGltZXN0YW1wOwogCisgICAgYm9vbCBtSXNNdWx0aVJlc29sdXRpb24gPSBmYWxzZTsKICAgICBib29sIG1TdXBwb3J0T2ZmbGluZVByb2Nlc3NpbmcgPSBmYWxzZTsKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAppbmRleCA2NjdlM2JiLi4yZDMzOTdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaApAQCAtMjMsMTMgKzIzLDYzIEBACiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKIAotc3RydWN0IGNhbWVyYTNfc3RyZWFtOwotc3RydWN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcjsKLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CiAKK3R5cGVkZWYgZW51bSBjYW1lcmFfYnVmZmVyX3N0YXR1cyB7CisgICAgQ0FNRVJBX0JVRkZFUl9TVEFUVVNfT0sgPSAwLAorICAgIENBTUVSQV9CVUZGRVJfU1RBVFVTX0VSUk9SID0gMQorfSBjYW1lcmFfYnVmZmVyX3N0YXR1c190OworCit0eXBlZGVmIGVudW0gY2FtZXJhX3N0cmVhbV90eXBlIHsKKyAgICBDQU1FUkFfU1RSRUFNX09VVFBVVCA9IDAsCisgICAgQ0FNRVJBX1NUUkVBTV9JTlBVVCA9IDEsCisgICAgQ0FNRVJBX05VTV9TVFJFQU1fVFlQRVMKK30gY2FtZXJhX3N0cmVhbV90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSBjYW1lcmFfc3RyZWFtX3JvdGF0aW9uIHsKKyAgICAvKiBObyByb3RhdGlvbiAqLworICAgIENBTUVSQV9TVFJFQU1fUk9UQVRJT05fMCA9IDAsCisKKyAgICAvKiBSb3RhdGUgYnkgOTAgZGVncmVlIGNvdW50ZXJjbG9ja3dpc2UgKi8KKyAgICBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzkwID0gMSwKKworICAgIC8qIFJvdGF0ZSBieSAxODAgZGVncmVlIGNvdW50ZXJjbG9ja3dpc2UgKi8KKyAgICBDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzE4MCA9IDIsCisKKyAgICAvKiBSb3RhdGUgYnkgMjcwIGRlZ3JlZSBjb3VudGVyY2xvY2t3aXNlICovCisgICAgQ0FNRVJBX1NUUkVBTV9ST1RBVElPTl8yNzAgPSAzCit9IGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX3N0cmVhbSB7CisgICAgY2FtZXJhX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGU7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIGludCBmb3JtYXQ7CisgICAgdWludDMyX3QgdXNhZ2U7CisgICAgdWludDMyX3QgbWF4X2J1ZmZlcnM7CisgICAgYW5kcm9pZF9kYXRhc3BhY2VfdCBkYXRhX3NwYWNlOworICAgIGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbjsKKyAgICBjb25zdCBjaGFyKiBwaHlzaWNhbF9jYW1lcmFfaWQ7CisKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8aW50MzJfdD4gc2Vuc29yX3BpeGVsX21vZGVzX3VzZWQ7Cit9IGNhbWVyYV9zdHJlYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FtZXJhX3N0cmVhbV9idWZmZXIgeworICAgIGNhbWVyYV9zdHJlYW1fdCAqc3RyZWFtOworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyOworICAgIGNhbWVyYV9idWZmZXJfc3RhdHVzX3Qgc3RhdHVzOworICAgIGludCBhY3F1aXJlX2ZlbmNlOworICAgIGludCByZWxlYXNlX2ZlbmNlOworfSBjYW1lcmFfc3RyZWFtX2J1ZmZlcl90OworCitzdHJ1Y3QgU2l6ZSB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIGV4cGxpY2l0IFNpemUodWludDMyX3QgdyA9IDAsIHVpbnQzMl90IGggPSAwKSA6IHdpZHRoKHcpLCBoZWlnaHQoaCl7fQorfTsKKwogZW51bSB7CiAgICAgLyoqCiAgICAgICogVGhpcyBzdHJlYW0gc2V0IElEIGluZGljYXRlcyB0aGF0IHRoZSBzZXQgSUQgaXMgaW52YWxpZCwgYW5kIHRoaXMgc3RyZWFtIGRvZXNuJ3QgaW50ZW5kIHRvCkBAIC01NiwxMyArMTA2LDE1IEBACiAgICAgICAgIHVpbnQ2NF90IGNvbnN1bWVyVXNhZ2U7CiAgICAgICAgIGJvb2wgZmluYWxpemVkID0gZmFsc2U7CiAgICAgICAgIGJvb2wgc3VwcG9ydHNPZmZsaW5lID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiBzZW5zb3JQaXhlbE1vZGVzVXNlZDsKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbygpIDoKICAgICAgICAgICAgIHdpZHRoKC0xKSwgaGVpZ2h0KC0xKSwgZm9ybWF0KC0xKSwgZGF0YVNwYWNlKEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiksCiAgICAgICAgICAgICBjb25zdW1lclVzYWdlKDApIHt9CiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8oaW50IF93aWR0aCwgaW50IF9oZWlnaHQsIGludCBfZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBfZGF0YVNwYWNlLAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IF9jb25zdW1lclVzYWdlKSA6CisgICAgICAgICAgICAgICAgdWludDY0X3QgX2NvbnN1bWVyVXNhZ2UsIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiYgX3NlbnNvclBpeGVsTW9kZXNVc2VkKSA6CiAgICAgICAgICAgICB3aWR0aChfd2lkdGgpLCBoZWlnaHQoX2hlaWdodCksIGZvcm1hdChfZm9ybWF0KSwKLSAgICAgICAgICAgIGRhdGFTcGFjZShfZGF0YVNwYWNlKSwgY29uc3VtZXJVc2FnZShfY29uc3VtZXJVc2FnZSkge30KKyAgICAgICAgICAgIGRhdGFTcGFjZShfZGF0YVNwYWNlKSwgY29uc3VtZXJVc2FnZShfY29uc3VtZXJVc2FnZSksCisgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZChfc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHt9CiB9OwogCiAvKioKQEAgLTg3LDYgKzEzOSwxNiBAQAogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0U3RyZWFtU2V0SWQoKSBjb25zdCA9IDA7CiAKICAgICAvKioKKyAgICAgKiBJcyB0aGlzIHN0cmVhbSBwYXJ0IG9mIGEgbXVsdGktcmVzb2x1dGlvbiBzdHJlYW0gc2V0CisgICAgICovCisgICAgdmlydHVhbCBib29sICAgICBpc011bHRpUmVzb2x1dGlvbigpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSEFMIHN0cmVhbSBncm91cCBpZCBmb3IgYSBtdWx0aS1yZXNvbHV0aW9uIHN0cmVhbSBzZXQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGludCAgICAgIGdldEhhbFN0cmVhbUdyb3VwSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0cmVhbSdzIGRpbWVuc2lvbnMgYW5kIGZvcm1hdAogICAgICAqLwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCA9IDA7CkBAIC05OSw2ICsxNjEsOCBAQAogICAgIHZpcnR1YWwgdm9pZCBzZXREYXRhU3BhY2VPdmVycmlkZShib29sIGRhdGFTcGFjZU92ZXJyaWRlbikgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBhbmRyb2lkX2RhdGFzcGFjZSBnZXRPcmlnaW5hbERhdGFTcGFjZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXhIYWxCdWZmZXJzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldE1heFRvdGFsQnVmZmVycygpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIE9mZmxpbmUgcHJvY2Vzc2luZwpAQCAtMTA3LDIzICsxNzEsMjMgQEAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2ZmbGluZVByb2Nlc3NpbmdTdXBwb3J0KCkgY29uc3QgPSAwOwogCiAgICAgLyoqCi0gICAgICogR2V0IGEgSEFMMyBoYW5kbGUgZm9yIHRoZSBzdHJlYW0sIHdpdGhvdXQgc3RhcnRpbmcgc3RyZWFtIGNvbmZpZ3VyYXRpb24uCisgICAgICogR2V0IGEgaGFuZGxlIGZvciB0aGUgc3RyZWFtLCB3aXRob3V0IHN0YXJ0aW5nIHN0cmVhbSBjb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIHZpcnR1YWwgY2FtZXJhM19zdHJlYW0qIGFzSGFsU3RyZWFtKCkgPSAwOworICAgIHZpcnR1YWwgY2FtZXJhX3N0cmVhbSogYXNIYWxTdHJlYW0oKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgc3RyZWFtJ3MKLSAgICAgKiBpbmZvcm1hdGlvbiB0byBiZSBwYXNzZWQgaW50byB0aGUgSEFMIGRldmljZSdzIGNvbmZpZ3VyZV9zdHJlYW1zIGNhbGwuCisgICAgICogaW5mb3JtYXRpb24gdG8gYmUgcGFzc2VkIGludG8gdGhlIGRldmljZSdzIGNvbmZpZ3VyZV9zdHJlYW1zIGNhbGwuCiAgICAgICoKICAgICAgKiBVbnRpbCBmaW5pc2hDb25maWd1cmF0aW9uKCkgaXMgY2FsbGVkLCBubyBvdGhlciBtZXRob2RzIG9uIHRoZSBzdHJlYW0gbWF5Ci0gICAgICogYmUgY2FsbGVkLiBUaGUgdXNhZ2UgYW5kIG1heF9idWZmZXJzIGZpZWxkcyBvZiBjYW1lcmEzX3N0cmVhbSBtYXkgYmUKKyAgICAgKiBiZSBjYWxsZWQuIFRoZSB1c2FnZSBhbmQgbWF4X2J1ZmZlcnMgZmllbGRzIG9mIGNhbWVyYV9zdHJlYW0gbWF5IGJlCiAgICAgICogbW9kaWZpZWQgYmV0d2VlbiBzdGFydC9maW5pc2hDb25maWd1cmF0aW9uLCBidXQgbWF5IG5vdCBiZSBjaGFuZ2VkIGFmdGVyCi0gICAgICogdGhhdC4gVGhlIHByaXYgZmllbGQgb2YgY2FtZXJhM19zdHJlYW0gbWF5IGJlIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyCisgICAgICogdGhhdC4gVGhlIHByaXYgZmllbGQgb2YgY2FtZXJhX3N0cmVhbSBtYXkgYmUgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIKICAgICAgKiBzdGFydENvbmZpZ3VyYXRpb24uCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciBzdGFydGluZyBjb25maWd1cmF0aW9uLgogICAgICAqLwotICAgIHZpcnR1YWwgY2FtZXJhM19zdHJlYW0qIHN0YXJ0Q29uZmlndXJhdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIGNhbWVyYV9zdHJlYW0qIHN0YXJ0Q29uZmlndXJhdGlvbigpID0gMDsKIAogICAgIC8qKgogICAgICAqIENoZWNrIGlmIHRoZSBzdHJlYW0gaXMgbWlkLWNvbmZpZ3VyYXRpb24gKHN0YXJ0IGhhcyBiZWVuIGNhbGxlZCwgYnV0IG5vdApAQCAtMTYzLDYgKzIyNywxMSBAQAogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNVbnByZXBhcmFibGUoKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBNYXJrIHRoZSBzdHJlYW0gYXMgdW5wcmVwYXJhYmxlLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCAgICAgbWFya1VucHJlcGFyYWJsZSgpID0gMDsKKworICAgIC8qKgogICAgICAqIFN0YXJ0IHN0cmVhbSBwcmVwYXJhdGlvbi4gTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLAogICAgICAqIHdoZW4gbm8gdmFsaWQgYnVmZmVycyBoYXZlIHlldCBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLiBQcmVwYXJlcwogICAgICAqIHVwIHRvIG1heENvdW50IGJ1ZmZlcnMsIG9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIG5lZWRlZCBieSB0aGUKQEAgLTIzOSw3ICszMDgsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKKyAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmFfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKICAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQpAQCAtMjUzLDEwICszMjIsMjggQEAKICAgICAgKiBidWZmZXJzLgogICAgICAqCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXIoY2FtZXJhX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3Qgd2FpdEJ1ZmZlclRpbWVvdXQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSkgPSAwOwogCisgICAgc3RydWN0IE91dHN0YW5kaW5nQnVmZmVyIHsKKyAgICAgICAgY2FtZXJhX3N0cmVhbV9idWZmZXIqIG91dEJ1ZmZlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogTXVsdGlwbGUgc3VyZmFjZXMgY291bGQgc2hhcmUgdGhlIHNhbWUgSEFMIHN0cmVhbSwgYnV0IGEgcmVxdWVzdCBtYXkKKyAgICAgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGFjcXVpcmUKKyAgICAgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgICAgICogc3RyZWFtLCBzdXJmYWNlX2lkcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdC4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gc3VyZmFjZV9pZHM7CisgICAgfTsKKyAgICAvKioKKyAgICAgKiBTaW1pbGFyIHRvIGdldEJ1ZmZlcigpIGV4Y2VwdCB0aGlzIG1ldGhvZCBmaWxscyBtdWx0aXBsZSBidWZmZXJzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVycyhzdGQ6OnZlY3RvcjxPdXRzdGFuZGluZ0J1ZmZlcj4qIGJ1ZmZlcnMsCisgICAgICAgICAgICBuc2Vjc190IHdhaXRCdWZmZXJUaW1lb3V0KSA9IDA7CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgpAQCAtMjY5LDEzICszNTYsMTMgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgZm9yIGJ1ZmZlcnMgcHJvdmlkZWQgYnkgZ2V0QnVmZmVyKCkuCiAgICAgICogRm9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtcywgdGhpcyBtZXRob2QgYXBwbGllcyB0byB0aGUgb3V0cHV0LXNpZGUgYnVmZmVycwogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAogICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKKyAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmFfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBmaW5pc2hDb25maWd1cmF0aW9uIGhhcyBiZWVuIGNhbGxlZC4KQEAgLTI4NSw3ICszNzIsOCBAQAogICAgICAqIE5vcm1hbGx5IHRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRoZSBoYW5kZWQgb3V0IGJ1ZmZlciBjb3VudCBpcyBsZXNzIHRoYW4gdGhlIHN0cmVhbQogICAgICAqIG1heCBidWZmZXIgY291bnQ7IGlmIHJlc3BlY3RIYWxMaW1pdCBpcyBzZXQgdG8gZmFsc2UsIHRoaXMgaXMgaWdub3JlZC4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLCBib29sIHJlc3BlY3RIYWxMaW1pdCA9IHRydWUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyKGNhbWVyYV9zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICBTaXplICpzaXplLCBib29sIHJlc3BlY3RIYWxMaW1pdCA9IHRydWUpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJldHVybiBhIGJ1ZmZlciB0byB0aGUgc3RyZWFtIGFmdGVyIHVzZSBieSB0aGUgSEFMLgpAQCAtMjkzLDcgKzM4MSw3IEBACiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIGlucHV0LXNpZGUgYnVmZmVycwogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuSW5wdXRCdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyKGNvbnN0IGNhbWVyYV9zdHJlYW1fYnVmZmVyICZidWZmZXIpID0gMDsKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBidWZmZXIgcXVldWUuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Nvb3JkaW5hdGVNYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCmluZGV4IDUxNjQ4NTYuLjU1OGY0YzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ29vcmRpbmF0ZU1hcHBlci5oCkBAIC0xOCwxNiArMTgsMjMgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NPT1JESU5BVEVNQVBQRVJfSAogCiAjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8c2V0PgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAogY2xhc3MgQ29vcmRpbmF0ZU1hcHBlciB7Ci0gICAgLy8gUmlnaHQgbm93IG9ubHkgc3RvcmVzIG1ldGFkYXRhIHRhZ3MgY29udGFpbmluZyAyRCBjb29yZGluYXRlcwotICAgIC8vIHRvIGJlIGNvcnJlY3RlZC4KK3B1YmxpYzoKKyAgICAvLyBUaGUgcmVzdWx0IG1ldGFkYXRhIHRhZ3MgdGhhdCBhcmUgdG8gYmUgcmUtbWFwcGVkCisgICAgY29uc3Qgc3RkOjpzZXQ8dWludDMyX3Q+JiBnZXRSZW1hcHBlZEtleXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVtYXBwZWRLZXlzOworICAgIH0KKworICAgIHZpcnR1YWwgfkNvb3JkaW5hdGVNYXBwZXIoKSA9IGRlZmF1bHQ7CisKIHByb3RlY3RlZDoKLSAgICAvLyBNZXRhZGF0YSBrZXkgbGlzdHMgdG8gY29ycmVjdAorICAgIC8vIE1ldGFkYXRhIHRhZ3MgY29udGFpbmluZyAyRCBjb29yZGluYXRlcyB0byBiZSBjb3JyZWN0ZWQuCiAKICAgICAvLyBCb3RoIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0CiAgICAgc3RhdGljIGNvbnN0IHN0ZDo6YXJyYXk8dWludDMyX3QsIDM+IGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3Q7CkBAIC0zNyw2ICs0NCwxMCBAQAogCiAgICAgLy8gT25seSBmb3IgY2FwdHVyZSByZXN1bHRzOyBkb24ndCBjbGFtcAogICAgIHN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PHVpbnQzMl90LCAyPiBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0Tm9DbGFtcDsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0UmVtYXBwZWRLZXlzKCkgPSAwOworICAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtUmVtYXBwZWRLZXlzOworCiB9OyAvLyBjbGFzcyBDb29yZGluYXRlTWFwcGVyCiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCmluZGV4IDgxMzIyMjUuLjg5ZGQxMTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcApAQCAtMjIsMTMgKzIyLDI4IEBACiAjaW5jbHVkZSA8Y21hdGg+CiAKICNpbmNsdWRlICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCiAKLURpc3RvcnRpb25NYXBwZXI6OkRpc3RvcnRpb25NYXBwZXIoKSA6IG1WYWxpZE1hcHBpbmcoZmFsc2UpLCBtVmFsaWRHcmlkcyhmYWxzZSkgeworRGlzdG9ydGlvbk1hcHBlcjo6RGlzdG9ydGlvbk1hcHBlcigpIHsKKyAgICBpbml0UmVtYXBwZWRLZXlzKCk7Cit9CisKK3ZvaWQgRGlzdG9ydGlvbk1hcHBlcjo6aW5pdFJlbWFwcGVkS2V5cygpIHsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydCgKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuYmVnaW4oKSwKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1JlY3RzVG9Db3JyZWN0LmJlZ2luKCksCisgICAgICAgICAgICBrUmVjdHNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXAuYmVnaW4oKSwKKyAgICAgICAgICAgIGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wLmVuZCgpKTsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydChBTkRST0lEX0RJU1RPUlRJT05fQ09SUkVDVElPTl9NT0RFKTsKIH0KIAogYm9vbCBEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKQEAgLTQ3LDQxICs2Miw4MSBAQAogCiBzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjpzZXR1cFN0YXRpY0luZm8oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIHN0YXR1c190IHJlcyA9IHNldHVwU3RhdGljSW5mb0xvY2tlZChkZXZpY2VJbmZvLCAvKm1heFJlc29sdXRpb24qL2ZhbHNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYm9vbCBtTWF4UmVzb2x1dGlvbiA9IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihkZXZpY2VJbmZvKTsKKyAgICBpZiAobU1heFJlc29sdXRpb24pIHsKKyAgICAgICAgcmVzID0gc2V0dXBTdGF0aWNJbmZvTG9ja2VkKGRldmljZUluZm8sIC8qbWF4UmVzb2x1dGlvbiovdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IERpc3RvcnRpb25NYXBwZXI6OnNldHVwU3RhdGljSW5mb0xvY2tlZChjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKKyAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uKSB7CisgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8gPSBtYXhSZXNvbHV0aW9uID8gJm1EaXN0b3J0aW9uTWFwcGVySW5mb01heGltdW1SZXNvbHV0aW9uIDoKKyAgICAgICAgICAgICZtRGlzdG9ydGlvbk1hcHBlckluZm87CisKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhcnJheTsKIAotICAgIGFycmF5ID0gZGV2aWNlSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOworICAgIGFycmF5ID0gZGV2aWNlSW5mby5maW5kKAorICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSwgbWF4UmVzb2x1dGlvbikpOwogICAgIGlmIChhcnJheS5jb3VudCAhPSA0KSByZXR1cm4gQkFEX1ZBTFVFOwogCiAgICAgZmxvYXQgYXJyYXlYID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFycmF5LmRhdGEuaTMyWzBdKTsKICAgICBmbG9hdCBhcnJheVkgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJyYXkuZGF0YS5pMzJbMV0pOwotICAgIG1BcnJheVdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFycmF5LmRhdGEuaTMyWzJdKTsKLSAgICBtQXJyYXlIZWlnaHQgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJyYXkuZGF0YS5pMzJbM10pOworICAgIG1hcHBlckluZm8tPm1BcnJheVdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFycmF5LmRhdGEuaTMyWzJdKTsKKyAgICBtYXBwZXJJbmZvLT5tQXJyYXlIZWlnaHQgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJyYXkuZGF0YS5pMzJbM10pOwogCi0gICAgYXJyYXkgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CisgICAgYXJyYXkgPSBkZXZpY2VJbmZvLmZpbmQoCisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUsIG1heFJlc29sdXRpb24pKTsKICAgICBpZiAoYXJyYXkuY291bnQgIT0gNCkgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIGZsb2F0IGFjdGl2ZVggPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJyYXkuZGF0YS5pMzJbMF0pOwogICAgIGZsb2F0IGFjdGl2ZVkgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJyYXkuZGF0YS5pMzJbMV0pOwotICAgIG1BY3RpdmVXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0PihhcnJheS5kYXRhLmkzMlsyXSk7Ci0gICAgbUFjdGl2ZUhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihhcnJheS5kYXRhLmkzMlszXSk7CisgICAgbWFwcGVySW5mby0+bUFjdGl2ZVdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFycmF5LmRhdGEuaTMyWzJdKTsKKyAgICBtYXBwZXJJbmZvLT5tQWN0aXZlSGVpZ2h0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFycmF5LmRhdGEuaTMyWzNdKTsKIAotICAgIG1BcnJheURpZmZYID0gYWN0aXZlWCAtIGFycmF5WDsKLSAgICBtQXJyYXlEaWZmWSA9IGFjdGl2ZVkgLSBhcnJheVk7CisgICAgbWFwcGVySW5mby0+bUFycmF5RGlmZlggPSBhY3RpdmVYIC0gYXJyYXlYOworICAgIG1hcHBlckluZm8tPm1BcnJheURpZmZZID0gYWN0aXZlWSAtIGFycmF5WTsKIAotICAgIHJldHVybiB1cGRhdGVDYWxpYnJhdGlvbihkZXZpY2VJbmZvKTsKKyAgICByZXR1cm4gdXBkYXRlQ2FsaWJyYXRpb24oZGV2aWNlSW5mbywgLyppc1N0YXRpYyovIHRydWUsIG1heFJlc29sdXRpb24pOworfQorCitzdGF0aWMgYm9vbCBkb2VzU2V0dGluZ3NIYXZlTWF4UmVzb2x1dGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSAqc2V0dGluZ3MpIHsKKyAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIEZpcnN0IHdlIGdldCB0aGUgc2Vuc29yUGl4ZWxNb2RlIGZyb20gdGhlIHNldHRpbmdzIG1ldGFkYXRhLgorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzZW5zb3JQaXhlbE1vZGVFbnRyeSA9IHNldHRpbmdzLT5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREUpOworICAgIGlmIChzZW5zb3JQaXhlbE1vZGVFbnRyeS5jb3VudCAhPSAwKSB7CisgICAgICAgIHJldHVybiAoc2Vuc29yUGl4ZWxNb2RlRW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBEaXN0b3J0aW9uTWFwcGVyOjpjYWxpYnJhdGlvblZhbGlkKCkgY29uc3QgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7Ci0KLSAgICByZXR1cm4gbVZhbGlkTWFwcGluZzsKKyAgICBib29sIGlzVmFsaWQgPSAgbURpc3RvcnRpb25NYXBwZXJJbmZvLm1WYWxpZE1hcHBpbmc7CisgICAgaWYgKG1NYXhSZXNvbHV0aW9uKSB7CisgICAgICAgIGlzVmFsaWQgPSBpc1ZhbGlkICYmIG1EaXN0b3J0aW9uTWFwcGVySW5mb01heGltdW1SZXNvbHV0aW9uLm1WYWxpZE1hcHBpbmc7CisgICAgfQorICAgIHJldHVybiBpc1ZhbGlkOwogfQogCiBzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjpjb3JyZWN0Q2FwdHVyZVJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOwogICAgIHN0YXR1c190IHJlczsKIAotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIE9LOworICAgIGJvb2wgbWF4UmVzb2x1dGlvbiA9IGRvZXNTZXR0aW5nc0hhdmVNYXhSZXNvbHV0aW9uKHJlcXVlc3QpOworICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvID0gbWF4UmVzb2x1dGlvbiA/ICZtRGlzdG9ydGlvbk1hcHBlckluZm9NYXhpbXVtUmVzb2x1dGlvbiA6CisgICAgICAgICAgICAmbURpc3RvcnRpb25NYXBwZXJJbmZvOworCisgICAgaWYgKCFtYXBwZXJJbmZvLT5tVmFsaWRNYXBwaW5nKSByZXR1cm4gT0s7CiAKICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlOwogICAgIGUgPSByZXF1ZXN0LT5maW5kKEFORFJPSURfRElTVE9SVElPTl9DT1JSRUNUSU9OX01PREUpOwpAQCAtOTMsMjcgKzE0OCwzMCBAQAogICAgICAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzID0gbWFwQ29ycmVjdGVkVG9SYXcoZS5kYXRhLmkzMiArIGosIDIsIC8qY2xhbXAqL3RydWUpOworICAgICAgICAgICAgICAgIHJlcyA9IG1hcENvcnJlY3RlZFRvUmF3KGUuZGF0YS5pMzIgKyBqLCAyLCBtYXBwZXJJbmZvLCAvKmNsYW1wKi90cnVlKTsKICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZvciAoYXV0byByZWN0IDoga1JlY3RzVG9Db3JyZWN0KSB7CiAgICAgICAgICAgICBlID0gcmVxdWVzdC0+ZmluZChyZWN0KTsKLSAgICAgICAgICAgIHJlcyA9IG1hcENvcnJlY3RlZFJlY3RUb1JhdyhlLmRhdGEuaTMyLCBlLmNvdW50IC8gNCwgLypjbGFtcCovdHJ1ZSk7CisgICAgICAgICAgICByZXMgPSBtYXBDb3JyZWN0ZWRSZWN0VG9SYXcoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDQsIG1hcHBlckluZm8sIC8qY2xhbXAqL3RydWUpOwogICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6Y29ycmVjdENhcHR1cmVSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgKnJlc3VsdCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBib29sIG1heFJlc29sdXRpb24gPSBkb2VzU2V0dGluZ3NIYXZlTWF4UmVzb2x1dGlvbihyZXN1bHQpOworICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvID0gbWF4UmVzb2x1dGlvbiA/ICZtRGlzdG9ydGlvbk1hcHBlckluZm9NYXhpbXVtUmVzb2x1dGlvbiA6CisgICAgICAgICAgICAmbURpc3RvcnRpb25NYXBwZXJJbmZvOwogICAgIHN0YXR1c190IHJlczsKIAotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIE9LOworICAgIGlmICghbWFwcGVySW5mby0+bVZhbGlkTWFwcGluZykgcmV0dXJuIE9LOwogCi0gICAgcmVzID0gdXBkYXRlQ2FsaWJyYXRpb24oKnJlc3VsdCk7CisgICAgcmVzID0gdXBkYXRlQ2FsaWJyYXRpb24oKnJlc3VsdCwgLyppc1N0YXRpYyovIGZhbHNlLCBtYXhSZXNvbHV0aW9uKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsdXJlIHRvIHVwZGF0ZSBsZW5zIGNhbGlicmF0aW9uIGluZm9ybWF0aW9uIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEyOSwxOCArMTg3LDE4IEBACiAgICAgICAgICAgICAgICAgaWYgKHdlaWdodCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXMgPSBtYXBSYXdUb0NvcnJlY3RlZChlLmRhdGEuaTMyICsgaiwgMiwgLypjbGFtcCovdHJ1ZSk7CisgICAgICAgICAgICAgICAgcmVzID0gbWFwUmF3VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiArIGosIDIsIG1hcHBlckluZm8sIC8qY2xhbXAqL3RydWUpOwogICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9yIChhdXRvIHJlY3QgOiBrUmVjdHNUb0NvcnJlY3QpIHsKICAgICAgICAgICAgIGUgPSByZXN1bHQtPmZpbmQocmVjdCk7Ci0gICAgICAgICAgICByZXMgPSBtYXBSYXdSZWN0VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDQsIC8qY2xhbXAqL3RydWUpOworICAgICAgICAgICAgcmVzID0gbWFwUmF3UmVjdFRvQ29ycmVjdGVkKGUuZGF0YS5pMzIsIGUuY291bnQgLyA0LCBtYXBwZXJJbmZvLCAvKmNsYW1wKi90cnVlKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChhdXRvIHB0cyA6IGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wKSB7CiAgICAgICAgICAgICBlID0gcmVzdWx0LT5maW5kKHB0cyk7Ci0gICAgICAgICAgICByZXMgPSBtYXBSYXdUb0NvcnJlY3RlZChlLmRhdGEuaTMyLCBlLmNvdW50IC8gMiwgLypjbGFtcCovZmFsc2UpOworICAgICAgICAgICAgcmVzID0gbWFwUmF3VG9Db3JyZWN0ZWQoZS5kYXRhLmkzMiwgZS5jb3VudCAvIDIsIG1hcHBlckluZm8sIC8qY2xhbXAqL2ZhbHNlKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTAsMjUgKzIwOCwzNyBAQAogCiAvLyBVdGlsaXR5IG1ldGhvZHM7IG5vdCBndWFyZGVkIGJ5IG11dGV4CiAKLXN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6OnVwZGF0ZUNhbGlicmF0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXN1bHQpIHsKK3N0YXR1c190IERpc3RvcnRpb25NYXBwZXI6OnVwZGF0ZUNhbGlicmF0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZyZXN1bHQsIGJvb2wgaXNTdGF0aWMsCisgICAgICAgIGJvb2wgbWF4UmVzb2x1dGlvbikgewogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGNhbGliLCBkaXN0b3J0aW9uOworICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvID0KKyAgICAgICAgICAgIG1heFJlc29sdXRpb24gPyAmbURpc3RvcnRpb25NYXBwZXJJbmZvTWF4aW11bVJlc29sdXRpb24gOiAmbURpc3RvcnRpb25NYXBwZXJJbmZvOworICAgIC8vIFdlIG9ubHkgbmVlZCBtYXhpbXVtIHJlc29sdXRpb24gdmVyc2lvbiBvZiBMRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiBhbmQKKyAgICAvLyBMRU5TX0RJU1RPUlRJT04gc2luY2UgQ2FwdHVyZVJlc3VsdHMgd291bGQgc3RpbGwgdXNlIHRoZSBzYW1lIGtleQorICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygc2Vuc29yIHBpeGVsIG1vZGUuCisgICAgaW50IGNhbGlicmF0aW9uS2V5ID0KKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04sCisgICAgICAgICAgICAgICAgbWF4UmVzb2x1dGlvbiAmJiBpc1N0YXRpYyk7CisgICAgaW50IGRpc3RvcnRpb25LZXkgPQorICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoQU5EUk9JRF9MRU5TX0RJU1RPUlRJT04sCisgICAgICAgICAgICAgICAgbWF4UmVzb2x1dGlvbiAmJiBpc1N0YXRpYyk7CiAKLSAgICBjYWxpYiA9IHJlc3VsdC5maW5kKEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04pOwotICAgIGRpc3RvcnRpb24gPSByZXN1bHQuZmluZChBTkRST0lEX0xFTlNfRElTVE9SVElPTik7CisgICAgY2FsaWIgPSByZXN1bHQuZmluZChjYWxpYnJhdGlvbktleSk7CisgICAgZGlzdG9ydGlvbiA9IHJlc3VsdC5maW5kKGRpc3RvcnRpb25LZXkpOwogCiAgICAgaWYgKGNhbGliLmNvdW50ICE9IDUpIHJldHVybiBCQURfVkFMVUU7CiAgICAgaWYgKGRpc3RvcnRpb24uY291bnQgIT0gNSkgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIC8vIFNraXAgcmVkb2luZyB3b3JrIGlmIG5vIGNoYW5nZSB0byBjYWxpYnJhdGlvbiBmaWVsZHMKLSAgICBpZiAobVZhbGlkTWFwcGluZyAmJgotICAgICAgICAgICAgbUZ4ID09IGNhbGliLmRhdGEuZlswXSAmJgotICAgICAgICAgICAgbUZ5ID09IGNhbGliLmRhdGEuZlsxXSAmJgotICAgICAgICAgICAgbUN4ID09IGNhbGliLmRhdGEuZlsyXSAmJgotICAgICAgICAgICAgbUN5ID09IGNhbGliLmRhdGEuZlszXSAmJgotICAgICAgICAgICAgbVMgPT0gY2FsaWIuZGF0YS5mWzRdKSB7CisgICAgaWYgKG1hcHBlckluZm8tPm1WYWxpZE1hcHBpbmcgJiYKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1GeCA9PSBjYWxpYi5kYXRhLmZbMF0gJiYKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1GeSA9PSBjYWxpYi5kYXRhLmZbMV0gJiYKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1DeCA9PSBjYWxpYi5kYXRhLmZbMl0gJiYKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1DeSA9PSBjYWxpYi5kYXRhLmZbM10gJiYKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1TID09IGNhbGliLmRhdGEuZls0XSkgewogICAgICAgICBib29sIG5vQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXN0b3J0aW9uLmNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtS1tpXSAhPSBkaXN0b3J0aW9uLmRhdGEuZltpXSkgeworICAgICAgICAgICAgaWYgKG1hcHBlckluZm8tPm1LW2ldICE9IGRpc3RvcnRpb24uZGF0YS5mW2ldKSB7CiAgICAgICAgICAgICAgICAgbm9DaGFuZ2UgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE3NiwzOSArMjQ2LDM5IEBACiAgICAgICAgIGlmIChub0NoYW5nZSkgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIG1GeCA9IGNhbGliLmRhdGEuZlswXTsKLSAgICBtRnkgPSBjYWxpYi5kYXRhLmZbMV07Ci0gICAgbUN4ID0gY2FsaWIuZGF0YS5mWzJdOwotICAgIG1DeSA9IGNhbGliLmRhdGEuZlszXTsKLSAgICBtUyA9IGNhbGliLmRhdGEuZls0XTsKKyAgICBtYXBwZXJJbmZvLT5tRnggPSBjYWxpYi5kYXRhLmZbMF07CisgICAgbWFwcGVySW5mby0+bUZ5ID0gY2FsaWIuZGF0YS5mWzFdOworICAgIG1hcHBlckluZm8tPm1DeCA9IGNhbGliLmRhdGEuZlsyXTsKKyAgICBtYXBwZXJJbmZvLT5tQ3kgPSBjYWxpYi5kYXRhLmZbM107CisgICAgbWFwcGVySW5mby0+bVMgPSBjYWxpYi5kYXRhLmZbNF07CiAKLSAgICBtSW52RnggPSAxIC8gbUZ4OwotICAgIG1JbnZGeSA9IDEgLyBtRnk7CisgICAgbWFwcGVySW5mby0+bUludkZ4ID0gMSAvIG1hcHBlckluZm8tPm1GeDsKKyAgICBtYXBwZXJJbmZvLT5tSW52RnkgPSAxIC8gbWFwcGVySW5mby0+bUZ5OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXN0b3J0aW9uLmNvdW50OyBpKyspIHsKLSAgICAgICAgbUtbaV0gPSBkaXN0b3J0aW9uLmRhdGEuZltpXTsKKyAgICAgICAgbWFwcGVySW5mby0+bUtbaV0gPSBkaXN0b3J0aW9uLmRhdGEuZltpXTsKICAgICB9CiAKLSAgICBtVmFsaWRNYXBwaW5nID0gdHJ1ZTsKKyAgICBtYXBwZXJJbmZvLT5tVmFsaWRNYXBwaW5nID0gdHJ1ZTsKICAgICAvLyBOZWVkIHRvIHJlY2FsY3VsYXRlIGdyaWQKLSAgICBtVmFsaWRHcmlkcyA9IGZhbHNlOworICAgIG1hcHBlckluZm8tPm1WYWxpZEdyaWRzID0gZmFsc2U7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcFJhd1RvQ29ycmVjdGVkKGludDMyX3QgKmNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAotICAgICAgICBib29sIGNsYW1wLCBib29sIHNpbXBsZSkgewotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBEaXN0b3J0aW9uTWFwcGVySW5mbyAqbWFwcGVySW5mbywgYm9vbCBjbGFtcCwgYm9vbCBzaW1wbGUpIHsKKyAgICBpZiAoIW1hcHBlckluZm8tPm1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAotICAgIGlmIChzaW1wbGUpIHJldHVybiBtYXBSYXdUb0NvcnJlY3RlZFNpbXBsZShjb29yZFBhaXJzLCBjb29yZENvdW50LCBjbGFtcCk7CisgICAgaWYgKHNpbXBsZSkgcmV0dXJuIG1hcFJhd1RvQ29ycmVjdGVkU2ltcGxlKGNvb3JkUGFpcnMsIGNvb3JkQ291bnQsIG1hcHBlckluZm8sIGNsYW1wKTsKIAotICAgIGlmICghbVZhbGlkR3JpZHMpIHsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYnVpbGRHcmlkcygpOworICAgIGlmICghbWFwcGVySW5mby0+bVZhbGlkR3JpZHMpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYnVpbGRHcmlkcyhtYXBwZXJJbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3JkQ291bnQgKiAyOyBpICs9IDIpIHsKLSAgICAgICAgY29uc3QgR3JpZFF1YWQgKnF1YWQgPSBmaW5kRW5jbG9zaW5nUXVhZChjb29yZFBhaXJzICsgaSwgbURpc3RvcnRlZEdyaWQpOworICAgICAgICBjb25zdCBHcmlkUXVhZCAqcXVhZCA9IGZpbmRFbmNsb3NpbmdRdWFkKGNvb3JkUGFpcnMgKyBpLCBtYXBwZXJJbmZvLT5tRGlzdG9ydGVkR3JpZCk7CiAgICAgICAgIGlmIChxdWFkID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCJSYXcgdG8gY29ycmVjdGVkIG1hcHBpbmcgZmFpbHVyZTogTm8gcXVhZCBmb3VuZCBmb3IgKCVkLCAlZCkiLAogICAgICAgICAgICAgICAgICAgICAqKGNvb3JkUGFpcnMgKyBpKSwgKihjb29yZFBhaXJzICsgaSArIDEpKTsKQEAgLTI0NCw4ICszMTQsOCBAQAogCiAgICAgICAgIC8vIENsYW1wIHRvIHdpdGhpbiBhY3RpdmUgYXJyYXkKICAgICAgICAgaWYgKGNsYW1wKSB7Ci0gICAgICAgICAgICBjb3JyWCA9IHN0ZDo6bWluKG1BY3RpdmVXaWR0aCAtIDEsIHN0ZDo6bWF4KDAuZiwgY29yclgpKTsKLSAgICAgICAgICAgIGNvcnJZID0gc3RkOjptaW4obUFjdGl2ZUhlaWdodCAtIDEsIHN0ZDo6bWF4KDAuZiwgY29yclkpKTsKKyAgICAgICAgICAgIGNvcnJYID0gc3RkOjptaW4obWFwcGVySW5mby0+bUFjdGl2ZVdpZHRoIC0gMSwgc3RkOjptYXgoMC5mLCBjb3JyWCkpOworICAgICAgICAgICAgY29yclkgPSBzdGQ6Om1pbihtYXBwZXJJbmZvLT5tQWN0aXZlSGVpZ2h0IC0gMSwgc3RkOjptYXgoMC5mLCBjb3JyWSkpOwogICAgICAgICB9CiAKICAgICAgICAgY29vcmRQYWlyc1tpXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHN0ZDo6cm91bmQoY29yclgpKTsKQEAgLTI1NiwxOSArMzI2LDE5IEBACiB9CiAKIHN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcFJhd1RvQ29ycmVjdGVkU2ltcGxlKGludDMyX3QgKmNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAotICAgICAgICBib29sIGNsYW1wKSBjb25zdCB7Ci0gICAgaWYgKCFtVmFsaWRNYXBwaW5nKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXApIGNvbnN0IHsKKyAgICBpZiAoIW1hcHBlckluZm8tPm1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAotICAgIGZsb2F0IHNjYWxlWCA9IG1BY3RpdmVXaWR0aCAvIG1BcnJheVdpZHRoOwotICAgIGZsb2F0IHNjYWxlWSA9IG1BY3RpdmVIZWlnaHQgLyBtQXJyYXlIZWlnaHQ7CisgICAgZmxvYXQgc2NhbGVYID0gbWFwcGVySW5mby0+bUFjdGl2ZVdpZHRoIC8gbWFwcGVySW5mby0+bUFycmF5V2lkdGg7CisgICAgZmxvYXQgc2NhbGVZID0gbWFwcGVySW5mby0+bUFjdGl2ZUhlaWdodCAvIG1hcHBlckluZm8tPm1BcnJheUhlaWdodDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3JkQ291bnQgKiAyOyBpICs9IDIpIHsKICAgICAgICAgZmxvYXQgeCA9IGNvb3JkUGFpcnNbaV07CiAgICAgICAgIGZsb2F0IHkgPSBjb29yZFBhaXJzW2kgKyAxXTsKICAgICAgICAgZmxvYXQgY29yclggPSB4ICogc2NhbGVYOwogICAgICAgICBmbG9hdCBjb3JyWSA9IHkgKiBzY2FsZVk7CiAgICAgICAgIGlmIChjbGFtcCkgewotICAgICAgICAgICAgY29yclggPSBzdGQ6Om1pbihtQWN0aXZlV2lkdGggLSAxLCBzdGQ6Om1heCgwLmYsIGNvcnJYKSk7Ci0gICAgICAgICAgICBjb3JyWSA9IHN0ZDo6bWluKG1BY3RpdmVIZWlnaHQgLSAxLCBzdGQ6Om1heCgwLmYsIGNvcnJZKSk7CisgICAgICAgICAgICBjb3JyWCA9IHN0ZDo6bWluKG1hcHBlckluZm8tPm1BY3RpdmVXaWR0aCAtIDEsIHN0ZDo6bWF4KDAuZiwgY29yclgpKTsKKyAgICAgICAgICAgIGNvcnJZID0gc3RkOjptaW4obWFwcGVySW5mby0+bUFjdGl2ZUhlaWdodCAtIDEsIHN0ZDo6bWF4KDAuZiwgY29yclkpKTsKICAgICAgICAgfQogICAgICAgICBjb29yZFBhaXJzW2ldID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RkOjpyb3VuZChjb3JyWCkpOwogICAgICAgICBjb29yZFBhaXJzW2kgKyAxXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHN0ZDo6cm91bmQoY29yclkpKTsKQEAgLTI3Nyw5ICszNDcsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwUmF3UmVjdFRvQ29ycmVjdGVkKGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LCBib29sIGNsYW1wLAotICAgICAgICBib29sIHNpbXBsZSkgewotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwUmF3UmVjdFRvQ29ycmVjdGVkKGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LAorICAgICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvLCBib29sIGNsYW1wLCBib29sIHNpbXBsZSkgeworICAgIGlmICghbWFwcGVySW5mby0+bVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVjdENvdW50ICogNDsgaSArPSA0KSB7CiAgICAgICAgIC8vIE1hcCBmcm9tIChsLCB0LCB3aWR0aCwgaGVpZ2h0KSB0byAobCwgdCwgciwgYikKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CkBAIC0yODksNyArMzU5LDcgQEAKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAotICAgICAgICBtYXBSYXdUb0NvcnJlY3RlZChjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOworICAgICAgICBtYXBSYXdUb0NvcnJlY3RlZChjb29yZHMsIDIsIG1hcHBlckluZm8sIGNsYW1wLCBzaW1wbGUpOwogCiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKQEAgLTMwMSw2MCArMzcxLDYwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjptYXBDb3JyZWN0ZWRUb1JhdyhpbnQzMl90ICpjb29yZFBhaXJzLCBpbnQgY29vcmRDb3VudCwgYm9vbCBjbGFtcCwKLSAgICAgICAgYm9vbCBzaW1wbGUpIGNvbnN0IHsKLSAgICByZXR1cm4gbWFwQ29ycmVjdGVkVG9SYXdJbXBsKGNvb3JkUGFpcnMsIGNvb3JkQ291bnQsIGNsYW1wLCBzaW1wbGUpOworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwQ29ycmVjdGVkVG9SYXcoaW50MzJfdCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsCisgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXAsIGJvb2wgc2ltcGxlKSBjb25zdCB7CisgICAgcmV0dXJuIG1hcENvcnJlY3RlZFRvUmF3SW1wbChjb29yZFBhaXJzLCBjb29yZENvdW50LCBtYXBwZXJJbmZvLCBjbGFtcCwgc2ltcGxlKTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcENvcnJlY3RlZFRvUmF3SW1wbChUICpjb29yZFBhaXJzLCBpbnQgY29vcmRDb3VudCwgYm9vbCBjbGFtcCwKLSAgICAgICAgYm9vbCBzaW1wbGUpIGNvbnN0IHsKLSAgICBpZiAoIW1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK3N0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcENvcnJlY3RlZFRvUmF3SW1wbChUICpjb29yZFBhaXJzLCBpbnQgY29vcmRDb3VudCwKKyAgICAgICBjb25zdCBEaXN0b3J0aW9uTWFwcGVySW5mbyAqbWFwcGVySW5mbywgYm9vbCBjbGFtcCwgYm9vbCBzaW1wbGUpIGNvbnN0IHsKKyAgICBpZiAoIW1hcHBlckluZm8tPm1WYWxpZE1hcHBpbmcpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIAotICAgIGlmIChzaW1wbGUpIHJldHVybiBtYXBDb3JyZWN0ZWRUb1Jhd0ltcGxTaW1wbGUoY29vcmRQYWlycywgY29vcmRDb3VudCwgY2xhbXApOworICAgIGlmIChzaW1wbGUpIHJldHVybiBtYXBDb3JyZWN0ZWRUb1Jhd0ltcGxTaW1wbGUoY29vcmRQYWlycywgY29vcmRDb3VudCwgbWFwcGVySW5mbywgY2xhbXApOwogCi0gICAgZmxvYXQgYWN0aXZlQ3ggPSBtQ3ggLSBtQXJyYXlEaWZmWDsKLSAgICBmbG9hdCBhY3RpdmVDeSA9IG1DeSAtIG1BcnJheURpZmZZOworICAgIGZsb2F0IGFjdGl2ZUN4ID0gbWFwcGVySW5mby0+bUN4IC0gbWFwcGVySW5mby0+bUFycmF5RGlmZlg7CisgICAgZmxvYXQgYWN0aXZlQ3kgPSBtYXBwZXJJbmZvLT5tQ3kgLSBtYXBwZXJJbmZvLT5tQXJyYXlEaWZmWTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvb3JkQ291bnQgKiAyOyBpICs9IDIpIHsKICAgICAgICAgLy8gTW92ZSB0byBub3JtYWxpemVkIHNwYWNlIGZyb20gYWN0aXZlIGFycmF5IHNwYWNlCi0gICAgICAgIGZsb2F0IHl3aSA9IChjb29yZFBhaXJzW2kgKyAxXSAtIGFjdGl2ZUN5KSAqIG1JbnZGeTsKLSAgICAgICAgZmxvYXQgeHdpID0gKGNvb3JkUGFpcnNbaV0gLSBhY3RpdmVDeCAtIG1TICogeXdpKSAqIG1JbnZGeDsKKyAgICAgICAgZmxvYXQgeXdpID0gKGNvb3JkUGFpcnNbaSArIDFdIC0gYWN0aXZlQ3kpICogbWFwcGVySW5mby0+bUludkZ5OworICAgICAgICBmbG9hdCB4d2kgPSAoY29vcmRQYWlyc1tpXSAtIGFjdGl2ZUN4IC0gbWFwcGVySW5mby0+bVMgKiB5d2kpICogbWFwcGVySW5mby0+bUludkZ4OwogICAgICAgICAvLyBBcHBseSBkaXN0b3J0aW9uIG1vZGVsIHRvIGNhbGN1bGF0ZSByYXcgaW1hZ2UgY29vcmRpbmF0ZXMKKyAgICAgICAgY29uc3Qgc3RkOjphcnJheTxmbG9hdCwgNT4gJmtLID0gbWFwcGVySW5mby0+bUs7CiAgICAgICAgIGZsb2F0IHJTcSA9IHh3aSAqIHh3aSArIHl3aSAqIHl3aTsKLSAgICAgICAgZmxvYXQgRnIgPSAxLmYgKyAobUtbMF0gKiByU3EpICsgKG1LWzFdICogclNxICogclNxKSArIChtS1syXSAqIHJTcSAqIHJTcSAqIHJTcSk7Ci0gICAgICAgIGZsb2F0IHhjID0geHdpICogRnIgKyAobUtbM10gKiAyICogeHdpICogeXdpKSArIG1LWzRdICogKHJTcSArIDIgKiB4d2kgKiB4d2kpOwotICAgICAgICBmbG9hdCB5YyA9IHl3aSAqIEZyICsgKG1LWzRdICogMiAqIHh3aSAqIHl3aSkgKyBtS1szXSAqIChyU3EgKyAyICogeXdpICogeXdpKTsKKyAgICAgICAgZmxvYXQgRnIgPSAxLmYgKyAoa0tbMF0gKiByU3EpICsgKGtLWzFdICogclNxICogclNxKSArIChrS1syXSAqIHJTcSAqIHJTcSAqIHJTcSk7CisgICAgICAgIGZsb2F0IHhjID0geHdpICogRnIgKyAoa0tbM10gKiAyICogeHdpICogeXdpKSArIGtLWzRdICogKHJTcSArIDIgKiB4d2kgKiB4d2kpOworICAgICAgICBmbG9hdCB5YyA9IHl3aSAqIEZyICsgKGtLWzRdICogMiAqIHh3aSAqIHl3aSkgKyBrS1szXSAqIChyU3EgKyAyICogeXdpICogeXdpKTsKICAgICAgICAgLy8gTW92ZSBiYWNrIHRvIGltYWdlIHNwYWNlCi0gICAgICAgIGZsb2F0IHhyID0gbUZ4ICogeGMgKyBtUyAqIHljICsgbUN4OwotICAgICAgICBmbG9hdCB5ciA9IG1GeSAqIHljICsgbUN5OworICAgICAgICBmbG9hdCB4ciA9IG1hcHBlckluZm8tPm1GeCAqIHhjICsgbWFwcGVySW5mby0+bVMgKiB5YyArIG1hcHBlckluZm8tPm1DeDsKKyAgICAgICAgZmxvYXQgeXIgPSBtYXBwZXJJbmZvLT5tRnkgKiB5YyArIG1hcHBlckluZm8tPm1DeTsKICAgICAgICAgLy8gQ2xhbXAgdG8gd2l0aGluIHByZS1jb3JyZWN0aW9uIGFjdGl2ZSBhcnJheQogICAgICAgICBpZiAoY2xhbXApIHsKLSAgICAgICAgICAgIHhyID0gc3RkOjptaW4obUFycmF5V2lkdGggLSAxLCBzdGQ6Om1heCgwLmYsIHhyKSk7Ci0gICAgICAgICAgICB5ciA9IHN0ZDo6bWluKG1BcnJheUhlaWdodCAtIDEsIHN0ZDo6bWF4KDAuZiwgeXIpKTsKKyAgICAgICAgICAgIHhyID0gc3RkOjptaW4obWFwcGVySW5mby0+bUFycmF5V2lkdGggLSAxLCBzdGQ6Om1heCgwLmYsIHhyKSk7CisgICAgICAgICAgICB5ciA9IHN0ZDo6bWluKG1hcHBlckluZm8tPm1BcnJheUhlaWdodCAtIDEsIHN0ZDo6bWF4KDAuZiwgeXIpKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvb3JkUGFpcnNbaV0gPSBzdGF0aWNfY2FzdDxUPihzdGQ6OnJvdW5kKHhyKSk7CiAgICAgICAgIGNvb3JkUGFpcnNbaSArIDFdID0gc3RhdGljX2Nhc3Q8VD4oc3RkOjpyb3VuZCh5cikpOwogICAgIH0KLQogICAgIHJldHVybiBPSzsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHN0YXR1c190IERpc3RvcnRpb25NYXBwZXI6Om1hcENvcnJlY3RlZFRvUmF3SW1wbFNpbXBsZShUICpjb29yZFBhaXJzLCBpbnQgY29vcmRDb3VudCwKLSAgICAgICAgYm9vbCBjbGFtcCkgY29uc3QgewotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgIGNvbnN0IERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvLCBib29sIGNsYW1wKSBjb25zdCB7CisgICAgaWYgKCFtYXBwZXJJbmZvLT5tVmFsaWRNYXBwaW5nKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAKLSAgICBmbG9hdCBzY2FsZVggPSBtQXJyYXlXaWR0aCAvIG1BY3RpdmVXaWR0aDsKLSAgICBmbG9hdCBzY2FsZVkgPSBtQXJyYXlIZWlnaHQgLyBtQWN0aXZlSGVpZ2h0OworICAgIGZsb2F0IHNjYWxlWCA9IG1hcHBlckluZm8tPm1BcnJheVdpZHRoIC8gbWFwcGVySW5mby0+bUFjdGl2ZVdpZHRoOworICAgIGZsb2F0IHNjYWxlWSA9IG1hcHBlckluZm8tPm1BcnJheUhlaWdodCAvIG1hcHBlckluZm8tPm1BY3RpdmVIZWlnaHQ7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZENvdW50ICogMjsgaSArPSAyKSB7CiAgICAgICAgIGZsb2F0IHggPSBjb29yZFBhaXJzW2ldOwogICAgICAgICBmbG9hdCB5ID0gY29vcmRQYWlyc1tpICsgMV07CiAgICAgICAgIGZsb2F0IHJhd1ggPSB4ICogc2NhbGVYOwogICAgICAgICBmbG9hdCByYXdZID0geSAqIHNjYWxlWTsKICAgICAgICAgaWYgKGNsYW1wKSB7Ci0gICAgICAgICAgICByYXdYID0gc3RkOjptaW4obUFycmF5V2lkdGggLSAxLCBzdGQ6Om1heCgwLmYsIHJhd1gpKTsKLSAgICAgICAgICAgIHJhd1kgPSBzdGQ6Om1pbihtQXJyYXlIZWlnaHQgLSAxLCBzdGQ6Om1heCgwLmYsIHJhd1kpKTsKKyAgICAgICAgICAgIHJhd1ggPSBzdGQ6Om1pbihtYXBwZXJJbmZvLT5tQXJyYXlXaWR0aCAtIDEsIHN0ZDo6bWF4KDAuZiwgcmF3WCkpOworICAgICAgICAgICAgcmF3WSA9IHN0ZDo6bWluKG1hcHBlckluZm8tPm1BcnJheUhlaWdodCAtIDEsIHN0ZDo6bWF4KDAuZiwgcmF3WSkpOwogICAgICAgICB9CiAgICAgICAgIGNvb3JkUGFpcnNbaV0gPSBzdGF0aWNfY2FzdDxUPihzdGQ6OnJvdW5kKHJhd1gpKTsKICAgICAgICAgY29vcmRQYWlyc1tpICsgMV0gPSBzdGF0aWNfY2FzdDxUPihzdGQ6OnJvdW5kKHJhd1kpKTsKQEAgLTM2Myw5ICs0MzMsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwQ29ycmVjdGVkUmVjdFRvUmF3KGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LCBib29sIGNsYW1wLAotICAgICAgICBib29sIHNpbXBsZSkgY29uc3QgewotICAgIGlmICghbVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6bWFwQ29ycmVjdGVkUmVjdFRvUmF3KGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LAorICAgICAgIGNvbnN0IERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvLCBib29sIGNsYW1wLCBib29sIHNpbXBsZSkgY29uc3QgeworICAgIGlmICghbWFwcGVySW5mby0+bVZhbGlkTWFwcGluZykgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWN0Q291bnQgKiA0OyBpICs9IDQpIHsKICAgICAgICAgLy8gTWFwIGZyb20gKGwsIHQsIHdpZHRoLCBoZWlnaHQpIHRvIChsLCB0LCByLCBiKQpAQCAtMzc2LDcgKzQ0Niw3IEBACiAgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKLSAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKKyAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyLCBtYXBwZXJJbmZvLCBjbGFtcCwgc2ltcGxlKTsKIAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CkBAIC0zODgsMzcgKzQ1OCwzNyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgRGlzdG9ydGlvbk1hcHBlcjo6YnVpbGRHcmlkcygpIHsKLSAgICBpZiAobUNvcnJlY3RlZEdyaWQuc2l6ZSgpICE9IGtHcmlkU2l6ZSAqIGtHcmlkU2l6ZSkgewotICAgICAgICBtQ29ycmVjdGVkR3JpZC5yZXNpemUoa0dyaWRTaXplICoga0dyaWRTaXplKTsKLSAgICAgICAgbURpc3RvcnRlZEdyaWQucmVzaXplKGtHcmlkU2l6ZSAqIGtHcmlkU2l6ZSk7CitzdGF0dXNfdCBEaXN0b3J0aW9uTWFwcGVyOjpidWlsZEdyaWRzKERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvKSB7CisgICAgaWYgKG1hcHBlckluZm8tPm1Db3JyZWN0ZWRHcmlkLnNpemUoKSAhPSBrR3JpZFNpemUgKiBrR3JpZFNpemUpIHsKKyAgICAgICAgbWFwcGVySW5mby0+bUNvcnJlY3RlZEdyaWQucmVzaXplKGtHcmlkU2l6ZSAqIGtHcmlkU2l6ZSk7CisgICAgICAgIG1hcHBlckluZm8tPm1EaXN0b3J0ZWRHcmlkLnJlc2l6ZShrR3JpZFNpemUgKiBrR3JpZFNpemUpOwogICAgIH0KIAotICAgIGZsb2F0IGdyaWRNYXJnaW4gPSBtQXJyYXlXaWR0aCAqIGtHcmlkTWFyZ2luOwotICAgIGZsb2F0IGdyaWRTcGFjaW5nWCA9IChtQXJyYXlXaWR0aCArIDIgKiBncmlkTWFyZ2luKSAvIGtHcmlkU2l6ZTsKLSAgICBmbG9hdCBncmlkU3BhY2luZ1kgPSAobUFycmF5SGVpZ2h0ICsgMiAqIGdyaWRNYXJnaW4pIC8ga0dyaWRTaXplOworICAgIGZsb2F0IGdyaWRNYXJnaW4gPSBtYXBwZXJJbmZvLT5tQXJyYXlXaWR0aCAqIGtHcmlkTWFyZ2luOworICAgIGZsb2F0IGdyaWRTcGFjaW5nWCA9IChtYXBwZXJJbmZvLT5tQXJyYXlXaWR0aCArIDIgKiBncmlkTWFyZ2luKSAvIGtHcmlkU2l6ZTsKKyAgICBmbG9hdCBncmlkU3BhY2luZ1kgPSAobWFwcGVySW5mby0+bUFycmF5SGVpZ2h0ICsgMiAqIGdyaWRNYXJnaW4pIC8ga0dyaWRTaXplOwogCiAgICAgc2l6ZV90IGluZGV4ID0gMDsKICAgICBmbG9hdCB4ID0gLWdyaWRNYXJnaW47CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrR3JpZFNpemU7IGkrKywgeCArPSBncmlkU3BhY2luZ1gpIHsKICAgICAgICAgZmxvYXQgeSA9IC1ncmlkTWFyZ2luOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtHcmlkU2l6ZTsgaisrLCB5ICs9IGdyaWRTcGFjaW5nWSwgaW5kZXgrKykgewotICAgICAgICAgICAgbUNvcnJlY3RlZEdyaWRbaW5kZXhdLnNyYyA9IG51bGxwdHI7Ci0gICAgICAgICAgICBtQ29ycmVjdGVkR3JpZFtpbmRleF0uY29vcmRzID0geworICAgICAgICAgICAgbWFwcGVySW5mby0+bUNvcnJlY3RlZEdyaWRbaW5kZXhdLnNyYyA9IG51bGxwdHI7CisgICAgICAgICAgICBtYXBwZXJJbmZvLT5tQ29ycmVjdGVkR3JpZFtpbmRleF0uY29vcmRzID0gewogICAgICAgICAgICAgICAgIHgsIHksCiAgICAgICAgICAgICAgICAgeCArIGdyaWRTcGFjaW5nWCwgeSwKICAgICAgICAgICAgICAgICB4ICsgZ3JpZFNwYWNpbmdYLCB5ICsgZ3JpZFNwYWNpbmdZLAogICAgICAgICAgICAgICAgIHgsIHkgKyBncmlkU3BhY2luZ1kKICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBtRGlzdG9ydGVkR3JpZFtpbmRleF0uc3JjID0gJm1Db3JyZWN0ZWRHcmlkW2luZGV4XTsKLSAgICAgICAgICAgIG1EaXN0b3J0ZWRHcmlkW2luZGV4XS5jb29yZHMgPSBtQ29ycmVjdGVkR3JpZFtpbmRleF0uY29vcmRzOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gbWFwQ29ycmVjdGVkVG9SYXdJbXBsKG1EaXN0b3J0ZWRHcmlkW2luZGV4XS5jb29yZHMuZGF0YSgpLCA0LAotICAgICAgICAgICAgICAgICAgICAvKmNsYW1wKi9mYWxzZSwgLypzaW1wbGUqL2ZhbHNlKTsKKyAgICAgICAgICAgIG1hcHBlckluZm8tPm1EaXN0b3J0ZWRHcmlkW2luZGV4XS5zcmMgPSAmKG1hcHBlckluZm8tPm1Db3JyZWN0ZWRHcmlkW2luZGV4XSk7CisgICAgICAgICAgICBtYXBwZXJJbmZvLT5tRGlzdG9ydGVkR3JpZFtpbmRleF0uY29vcmRzID0gbWFwcGVySW5mby0+bUNvcnJlY3RlZEdyaWRbaW5kZXhdLmNvb3JkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1hcENvcnJlY3RlZFRvUmF3SW1wbChtYXBwZXJJbmZvLT5tRGlzdG9ydGVkR3JpZFtpbmRleF0uY29vcmRzLmRhdGEoKSwgNCwKKyAgICAgICAgICAgICAgICAgICAgbWFwcGVySW5mbywgLypjbGFtcCovZmFsc2UsIC8qc2ltcGxlKi9mYWxzZSk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogCi0gICAgbVZhbGlkR3JpZHMgPSB0cnVlOworICAgIG1hcHBlckluZm8tPm1WYWxpZEdyaWRzID0gdHJ1ZTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTQ4NSw3ICs1NTUsNyBAQAogCiAgICAgZmxvYXQgZGV0ID0gYiAqIGIgLSA0ICogYSAqIGM7CiAgICAgaWYgKGRldCA8IDApIHsKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIC0gc2hvdWxkIG5vdCBoYXBwZW4gaWYgcHQgaXMgd2l0aGluIHRoZSBxdWFkCisgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2sgLSBzaG91bGQgbm90IGhhcHBlbiBpZiBwdCBpcyB3aXRoaW4gdGhlIHF1YWQKICAgICAgICAgQUxPR0UoIkJhZCBkZXRlcm1pbmFudCEgYTogJWYsIGI6ICVmLCBjOiAlZiwgZGV0OiAlZiIsIGEsYixjLGRldCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCmluZGV4IDdkY2I2N2IuLjk2ZjRmZGEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oCkBAIC0zMiwxOCArMzIsMTYgQEAKICAqIFV0aWxpdGllcyB0byB0cmFuc2Zvcm0gYmV0d2VlbiByYXcgKGRpc3RvcnRlZCkgYW5kIHdhcnBlZCAoY29ycmVjdGVkKSBjb29yZGluYXRlIHN5c3RlbXMKICAqIGZvciBjYW1lcmFzIHRoYXQgc3VwcG9ydCBnZW9tZXRyaWMgZGlzdG9ydGlvbgogICovCi1jbGFzcyBEaXN0b3J0aW9uTWFwcGVyIDogcHJpdmF0ZSBDb29yZGluYXRlTWFwcGVyIHsKK2NsYXNzIERpc3RvcnRpb25NYXBwZXIgOiBwdWJsaWMgQ29vcmRpbmF0ZU1hcHBlciB7CiAgIHB1YmxpYzoKICAgICBEaXN0b3J0aW9uTWFwcGVyKCk7CiAKICAgICBEaXN0b3J0aW9uTWFwcGVyKGNvbnN0IERpc3RvcnRpb25NYXBwZXImIG90aGVyKSA6Ci0gICAgICAgICAgICBtVmFsaWRNYXBwaW5nKG90aGVyLm1WYWxpZE1hcHBpbmcpLCBtVmFsaWRHcmlkcyhvdGhlci5tVmFsaWRHcmlkcyksCi0gICAgICAgICAgICBtRngob3RoZXIubUZ4KSwgbUZ5KG90aGVyLm1GeSksIG1DeChvdGhlci5tQ3gpLCBtQ3kob3RoZXIubUN5KSwgbVMob3RoZXIubVMpLAotICAgICAgICAgICAgbUludkZ4KG90aGVyLm1JbnZGeCksIG1JbnZGeShvdGhlci5tSW52RnkpLCBtSyhvdGhlci5tSyksCi0gICAgICAgICAgICBtQXJyYXlXaWR0aChvdGhlci5tQXJyYXlXaWR0aCksIG1BcnJheUhlaWdodChvdGhlci5tQXJyYXlIZWlnaHQpLAotICAgICAgICAgICAgbUFjdGl2ZVdpZHRoKG90aGVyLm1BY3RpdmVXaWR0aCksIG1BY3RpdmVIZWlnaHQob3RoZXIubUFjdGl2ZUhlaWdodCksCi0gICAgICAgICAgICBtQXJyYXlEaWZmWChvdGhlci5tQXJyYXlEaWZmWCksIG1BcnJheURpZmZZKG90aGVyLm1BcnJheURpZmZZKSwKLSAgICAgICAgICAgIG1Db3JyZWN0ZWRHcmlkKG90aGVyLm1Db3JyZWN0ZWRHcmlkKSwgbURpc3RvcnRlZEdyaWQob3RoZXIubURpc3RvcnRlZEdyaWQpIHt9CisgICAgICAgICAgICBtRGlzdG9ydGlvbk1hcHBlckluZm8ob3RoZXIubURpc3RvcnRpb25NYXBwZXJJbmZvKSwKKyAgICAgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVySW5mb01heGltdW1SZXNvbHV0aW9uKG90aGVyLm1EaXN0b3J0aW9uTWFwcGVySW5mb01heGltdW1SZXNvbHV0aW9uKSB7CisgICAgICAgICAgICBpbml0UmVtYXBwZWRLZXlzKCk7IH0KKworICAgIHZvaWQgaW5pdFJlbWFwcGVkS2V5cygpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogQ2hlY2sgd2hldGhlciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgSEFMCkBAIC03MiwxMCArNzAsMTQgQEAKIAogCiAgIHB1YmxpYzogLy8gVmlzaWJsZSBmb3IgdGVzdGluZy4gTm90IGd1YXJkZWQgYnkgbXV0ZXg7IGRvIG5vdCB1c2UgY29uY3VycmVudGx5CisKKyAgICBzdHJ1Y3QgRGlzdG9ydGlvbk1hcHBlckluZm87CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgbGVucyBjYWxpYnJhdGlvbiBmcm9tIGNhcHR1cmUgcmVzdWx0cyBvciBlcXVpdmFsZW50CiAgICAgICovCi0gICAgc3RhdHVzX3QgdXBkYXRlQ2FsaWJyYXRpb24oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCk7CisgICAgc3RhdHVzX3QgdXBkYXRlQ2FsaWJyYXRpb24oY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCwgYm9vbCBpc1N0YXRpYyA9IGZhbHNlLAorICAgICAgICAgICAgYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogVHJhbnNmb3JtIGZyb20gZGlzdG9ydGVkIChvcmlnaW5hbCkgdG8gY29ycmVjdGVkICh3YXJwZWQpIGNvb3JkaW5hdGVzLgpAQCAtODYsOCArODgsOCBAQAogICAgICAqICAgY2xhbXA6IFdoZXRoZXIgdG8gY2xhbXAgdGhlIHJlc3VsdCB0byB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgYXJyYXkKICAgICAgKiAgIHNpbXBsZTogV2hldGhlciB0byBkbyBjb21wbGV4IGNvcnJlY3Rpb24gb3IganVzdCBhIHNpbXBsZSBsaW5lYXIgbWFwCiAgICAgICovCi0gICAgc3RhdHVzX3QgbWFwUmF3VG9Db3JyZWN0ZWQoaW50MzJfdCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsIGJvb2wgY2xhbXAsCi0gICAgICAgICAgICBib29sIHNpbXBsZSA9IHRydWUpOworICAgIHN0YXR1c190IG1hcFJhd1RvQ29ycmVjdGVkKGludDMyX3QgKmNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAorICAgICAgICAgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXAsIGJvb2wgc2ltcGxlID0gdHJ1ZSk7CiAKICAgICAvKioKICAgICAgKiBUcmFuc2Zvcm0gZnJvbSBkaXN0b3J0ZWQgKG9yaWdpbmFsKSB0byBjb3JyZWN0ZWQgKHdhcnBlZCkgY29vcmRpbmF0ZXMuCkBAIC05OCw4ICsxMDAsOCBAQAogICAgICAqICAgY2xhbXA6IFdoZXRoZXIgdG8gY2xhbXAgdGhlIHJlc3VsdCB0byB0aGUgYm91bmRzIG9mIHRoZSBhY3RpdmUgYXJyYXkKICAgICAgKiAgIHNpbXBsZTogV2hldGhlciB0byBkbyBjb21wbGV4IGNvcnJlY3Rpb24gb3IganVzdCBhIHNpbXBsZSBsaW5lYXIgbWFwCiAgICAgICovCi0gICAgc3RhdHVzX3QgbWFwUmF3UmVjdFRvQ29ycmVjdGVkKGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LCBib29sIGNsYW1wLAotICAgICAgICAgICAgYm9vbCBzaW1wbGUgPSB0cnVlKTsKKyAgICBzdGF0dXNfdCBtYXBSYXdSZWN0VG9Db3JyZWN0ZWQoaW50MzJfdCAqcmVjdHMsIGludCByZWN0Q291bnQsCisgICAgICAgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXAsIGJvb2wgc2ltcGxlID0gdHJ1ZSk7CiAKICAgICAvKioKICAgICAgKiBUcmFuc2Zvcm0gZnJvbSBjb3JyZWN0ZWQgKHdhcnBlZCkgdG8gZGlzdG9ydGVkIChvcmlnaW5hbCkgY29vcmRpbmF0ZXMuCkBAIC0xMTAsOCArMTEyLDggQEAKICAgICAgKiAgIGNsYW1wOiBXaGV0aGVyIHRvIGNsYW1wIHRoZSByZXN1bHQgdG8gdGhlIGJvdW5kcyBvZiB0aGUgcHJlY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkKICAgICAgKiAgIHNpbXBsZTogV2hldGhlciB0byBkbyBjb21wbGV4IGNvcnJlY3Rpb24gb3IganVzdCBhIHNpbXBsZSBsaW5lYXIgbWFwCiAgICAgICovCi0gICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkVG9SYXcoaW50MzJfdCogY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsIGJvb2wgY2xhbXAsCi0gICAgICAgICAgICBib29sIHNpbXBsZSA9IHRydWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hcENvcnJlY3RlZFRvUmF3KGludDMyX3QqIGNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAorICAgICAgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXAsIGJvb2wgc2ltcGxlID0gdHJ1ZSkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBUcmFuc2Zvcm0gZnJvbSBjb3JyZWN0ZWQgKHdhcnBlZCkgdG8gZGlzdG9ydGVkIChvcmlnaW5hbCkgY29vcmRpbmF0ZXMuCkBAIC0xMjIsOCArMTI0LDggQEAKICAgICAgKiAgIGNsYW1wOiBXaGV0aGVyIHRvIGNsYW1wIHRoZSByZXN1bHQgdG8gdGhlIGJvdW5kcyBvZiB0aGUgcHJlY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkKICAgICAgKiAgIHNpbXBsZTogV2hldGhlciB0byBkbyBjb21wbGV4IGNvcnJlY3Rpb24gb3IganVzdCBhIHNpbXBsZSBsaW5lYXIgbWFwCiAgICAgICovCi0gICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkUmVjdFRvUmF3KGludDMyX3QgKnJlY3RzLCBpbnQgcmVjdENvdW50LCBib29sIGNsYW1wLAotICAgICAgICAgICAgYm9vbCBzaW1wbGUgPSB0cnVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBtYXBDb3JyZWN0ZWRSZWN0VG9SYXcoaW50MzJfdCAqcmVjdHMsIGludCByZWN0Q291bnQsCisgICAgICAgICAgIGNvbnN0IERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvLCBib29sIGNsYW1wLCBib29sIHNpbXBsZSA9IHRydWUpIGNvbnN0OwogCiAgICAgc3RydWN0IEdyaWRRdWFkIHsKICAgICAgICAgLy8gU291cmNlIGdyaWQgcXVhZCwgb3IgbnVsbApAQCAtMTMzLDYgKzEzNSwyOCBAQAogICAgICAgICBzdGQ6OmFycmF5PGZsb2F0LCA4PiBjb29yZHM7CiAgICAgfTsKIAorICAgIHN0cnVjdCBEaXN0b3J0aW9uTWFwcGVySW5mbyB7CisgICAgICAgIGJvb2wgbVZhbGlkTWFwcGluZyA9IGZhbHNlOworICAgICAgICBib29sIG1WYWxpZEdyaWRzID0gZmFsc2U7CisKKyAgICAgICAgLy8gaW50cmlzaWMgcGFyYW1ldGVycywgaW4gcGl4ZWxzCisgICAgICAgIGZsb2F0IG1GeCwgbUZ5LCBtQ3gsIG1DeSwgbVM7CisgICAgICAgIC8vIHByZS1jYWxjdWxhdGVkIGludmVyc2VzIGZvciBzcGVlZAorICAgICAgICBmbG9hdCBtSW52RngsIG1JbnZGeTsKKyAgICAgICAgLy8gcmFkaWFsL3RhbmdlbnRpYWwgZGlzdG9ydGlvbiBwYXJhbWV0ZXJzCisgICAgICAgIHN0ZDo6YXJyYXk8ZmxvYXQsIDU+IG1LOworCisgICAgICAgIC8vIHByZS1jb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBkaW1lbnNpb25zCisgICAgICAgIGZsb2F0IG1BcnJheVdpZHRoLCBtQXJyYXlIZWlnaHQ7CisgICAgICAgIC8vIGFjdGl2ZSBhcnJheSBkaW1lbnNpb25zCisgICAgICAgIGZsb2F0IG1BY3RpdmVXaWR0aCwgbUFjdGl2ZUhlaWdodDsKKyAgICAgICAgLy8gY29ybmVyIG9mZnNldHMgYmV0d2VlbiBwcmUtY29ycmVjdGlvbiBhbmQgYWN0aXZlIGFycmF5cworICAgICAgICBmbG9hdCBtQXJyYXlEaWZmWCwgbUFycmF5RGlmZlk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8R3JpZFF1YWQ+IG1Db3JyZWN0ZWRHcmlkOworICAgICAgICBzdGQ6OnZlY3RvcjxHcmlkUXVhZD4gbURpc3RvcnRlZEdyaWQ7CisgICAgfTsKKwogICAgIC8vIEZpbmQgd2hpY2ggZ3JpZCBxdWFkIGVuY2xvc2VzIHRoZSBwb2ludDsgcmV0dXJucyBudWxsIGlmIG5vbmUgZG8KICAgICBzdGF0aWMgY29uc3QgR3JpZFF1YWQqIGZpbmRFbmNsb3NpbmdRdWFkKAogICAgICAgICAgICAgY29uc3QgaW50MzJfdCBwdFsyXSwgY29uc3Qgc3RkOjp2ZWN0b3I8R3JpZFF1YWQ+JiBncmlkKTsKQEAgLTE1MCw2ICsxNzQsMTEgQEAKICAgICAvLyBpZiBpdCBpcyBmYWxzZSwgdGhlbiBhbiBpbnRlcnBvbGF0aW9uIGNvb3JkaW5hdGUgZm9yIGVkZ2VzIEUxNCBhbmQgRTIzIGlzIGZvdW5kLgogICAgIHN0YXRpYyBmbG9hdCBjYWxjdWxhdGVVb3JWKGNvbnN0IGludDMyX3QgcHRbMl0sIGNvbnN0IEdyaWRRdWFkJiBxdWFkLCBib29sIGNhbGN1bGF0ZVUpOwogCisgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKmdldE1hcHBlckluZm8oYm9vbCBtYXhSZXNvbHV0aW9uID0gZmFsc2UpIHsKKyAgICAgICAgICByZXR1cm4gbWF4UmVzb2x1dGlvbiA/ICZtRGlzdG9ydGlvbk1hcHBlckluZm9NYXhpbXVtUmVzb2x1dGlvbiA6CisgICAgICAgICAgICAgICAgICAmbURpc3RvcnRpb25NYXBwZXJJbmZvOworICAgIH07CisKICAgcHJpdmF0ZToKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OwogCkBAIC0xNjAsMzkgKzE4OSwyOCBAQAogICAgIC8vIEZ1enppbmVzcyBmb3IgZmxvYXQgaW5lcXVhbGl0eSB0ZXN0cwogICAgIGNvbnN0ZXhwciBzdGF0aWMgZmxvYXQga0Zsb2F0RnV6eiA9IDFlLTQ7CiAKKyAgICBib29sIG1NYXhSZXNvbHV0aW9uID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBzZXR1cFN0YXRpY0luZm9Mb2NrZWQoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8sIGJvb2wgbWF4UmVzb2x1dGlvbik7CisKICAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMgbWFwQ29ycmVjdGVkVG9SYXcgbWV0aG9kcwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkVG9SYXdJbXBsKFQqIGNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LCBib29sIGNsYW1wLCBib29sIHNpbXBsZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkVG9SYXdJbXBsKFQqIGNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAorICAgICAgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXAsIGJvb2wgc2ltcGxlKSBjb25zdDsKIAogICAgIC8vIFNpbXBsZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBvcHRpb24KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IG1hcENvcnJlY3RlZFRvUmF3SW1wbFNpbXBsZShUKiBjb29yZFBhaXJzLCBpbnQgY29vcmRDb3VudCwgYm9vbCBjbGFtcCkgY29uc3Q7CisgICAgc3RhdHVzX3QgbWFwQ29ycmVjdGVkVG9SYXdJbXBsU2ltcGxlKFQqIGNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAorICAgICAgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXApIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgbWFwUmF3VG9Db3JyZWN0ZWRTaW1wbGUoaW50MzJfdCAqY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsIGJvb2wgY2xhbXApIGNvbnN0OworICAgIHN0YXR1c190IG1hcFJhd1RvQ29ycmVjdGVkU2ltcGxlKGludDMyX3QgKmNvb3JkUGFpcnMsIGludCBjb29yZENvdW50LAorICAgICAgICAgICAgY29uc3QgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8sIGJvb2wgY2xhbXApIGNvbnN0OwogCiAgICAgLy8gVXRpbGl0eSB0byBjcmVhdGUgcmV2ZXJzZSBtYXBwaW5nIGdyaWRzCi0gICAgc3RhdHVzX3QgYnVpbGRHcmlkcygpOworICAgIHN0YXR1c190IGJ1aWxkR3JpZHMoRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8pOwogCi0KLSAgICBib29sIG1WYWxpZE1hcHBpbmc7Ci0gICAgYm9vbCBtVmFsaWRHcmlkczsKLQotICAgIC8vIGludHJpc2ljIHBhcmFtZXRlcnMsIGluIHBpeGVscwotICAgIGZsb2F0IG1GeCwgbUZ5LCBtQ3gsIG1DeSwgbVM7Ci0gICAgLy8gcHJlLWNhbGN1bGF0ZWQgaW52ZXJzZXMgZm9yIHNwZWVkCi0gICAgZmxvYXQgbUludkZ4LCBtSW52Rnk7Ci0gICAgLy8gcmFkaWFsL3RhbmdlbnRpYWwgZGlzdG9ydGlvbiBwYXJhbWV0ZXJzCi0gICAgc3RkOjphcnJheTxmbG9hdCwgNT4gbUs7Ci0KLSAgICAvLyBwcmUtY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkgZGltZW5zaW9ucwotICAgIGZsb2F0IG1BcnJheVdpZHRoLCBtQXJyYXlIZWlnaHQ7Ci0gICAgLy8gYWN0aXZlIGFycmF5IGRpbWVuc2lvbnMKLSAgICBmbG9hdCBtQWN0aXZlV2lkdGgsIG1BY3RpdmVIZWlnaHQ7Ci0gICAgLy8gY29ybmVyIG9mZnNldHMgYmV0d2VlbiBwcmUtY29ycmVjdGlvbiBhbmQgYWN0aXZlIGFycmF5cwotICAgIGZsb2F0IG1BcnJheURpZmZYLCBtQXJyYXlEaWZmWTsKLQotICAgIHN0ZDo6dmVjdG9yPEdyaWRRdWFkPiBtQ29ycmVjdGVkR3JpZDsKLSAgICBzdGQ6OnZlY3RvcjxHcmlkUXVhZD4gbURpc3RvcnRlZEdyaWQ7CisgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gbURpc3RvcnRpb25NYXBwZXJJbmZvOworICAgIERpc3RvcnRpb25NYXBwZXJJbmZvIG1EaXN0b3J0aW9uTWFwcGVySW5mb01heGltdW1SZXNvbHV0aW9uOwogCiB9OyAvLyBjbGFzcyBEaXN0b3J0aW9uTWFwcGVyCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0luRmxpZ2h0UmVxdWVzdC5oCmluZGV4IGRhNGYyMjguLjUyM2EyYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvSW5GbGlnaHRSZXF1ZXN0LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9JbkZsaWdodFJlcXVlc3QuaApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KIAotI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKLQogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTc1LDcgKzczLDcgQEAKICAgICAvLyByZXR1cm4gZnJvbSBIQUwgYnV0IGZyYW1ld29yayBoYXMgbm90IHlldCByZWNlaXZlZCB0aGUgc2h1dHRlcgogICAgIC8vIGV2ZW50LiBUaGV5IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHN0cmVhbXMgd2hlbiBmcmFtZXdvcmsgcmVjZWl2ZXMKICAgICAvLyB0aGUgc2h1dHRlciBldmVudC4KLSAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHBlbmRpbmdPdXRwdXRCdWZmZXJzOworICAgIFZlY3RvcjxjYW1lcmFfc3RyZWFtX2J1ZmZlcl90PiBwZW5kaW5nT3V0cHV0QnVmZmVyczsKIAogICAgIC8vIFdoZXRoZXIgdGhpcyBpbmZsaWdodCByZXF1ZXN0J3Mgc2h1dHRlciBhbmQgcmVzdWx0IGNhbGxiYWNrIGFyZSB0byBiZQogICAgIC8vIGNhbGxlZC4gVGhlIHBvbGljeSBpcyB0aGF0IGlmIHRoZSByZXF1ZXN0IGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgY29uc3RyYWluZWQKQEAgLTk4LDcgKzk2LDEwIEBACiAgICAgRVJST1JfQlVGX1NUUkFURUdZIGVycm9yQnVmU3RyYXRlZ3k7CiAKICAgICAvLyBUaGUgcGh5c2ljYWwgY2FtZXJhIGlkcyBiZWluZyByZXF1ZXN0ZWQuCi0gICAgc3RkOjpzZXQ8U3RyaW5nOD4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgLy8gRm9yIHJlcXVlc3Qgb24gYSBwaHlzaWNhbCBjYW1lcmEgc3RyZWFtLCB0aGUgaW5zaWRlIHNldCBjb250YWlucyBvbmUgSWQKKyAgICAvLyBGb3IgcmVxdWVzdCBvbiBhIHN0cmVhbSBncm91cCBjb250YWluaW5nIHBoeXNpY2FsIGNhbWVyYSBzdHJlYW1zLCB0aGUKKyAgICAvLyBpbnNpZGUgc2V0IGNvbnRhaW5zIGFsbCBzdHJlYW0gSWRzIGluIHRoZSBncm91cC4KKyAgICBzdGQ6OnNldDxzdGQ6OnNldDxTdHJpbmc4Pj4gcGh5c2ljYWxDYW1lcmFJZHM7CiAKICAgICAvLyBNYXAgb2YgcGh5c2ljYWxDYW1lcmFJZCA8LT4gTWV0YWRhdGEKICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbE1ldGFkYXRhczsKQEAgLTExNSw2ICsxMTYsOSBAQAogICAgIC8vIFJlcXVlc3RlZCBjYW1lcmEgaWRzIChib3RoIGxvZ2ljYWwgYW5kIHBoeXNpY2FsKSB3aXRoIHpvb21SYXRpbyAhPSAxLjBmCiAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNhbWVyYUlkc1dpdGhab29tOwogCisgICAgLy8gVGltZSBvZiBjYXB0dXJlIHJlcXVlc3QgKGZyb20gc3lzdGVtVGltZSkgaW4gTnMKKyAgICBuc2Vjc190IHJlcXVlc3RUaW1lTnM7CisKICAgICAvLyBXaGF0IHNoYXJlZCBzdXJmYWNlcyBhbiBvdXRwdXQgc2hvdWxkIGdvIHRvCiAgICAgU3VyZmFjZU1hcCBvdXRwdXRTdXJmYWNlczsKIApAQCAtMTM1LDE0ICsxMzksMTUgQEAKICAgICAgICAgICAgIGVycm9yQnVmU3RyYXRlZ3koRVJST1JfQlVGX0NBQ0hFKSwKICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShmYWxzZSksCiAgICAgICAgICAgICB6c2xDYXB0dXJlKGZhbHNlKSwKLSAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvKGZhbHNlKSB7CisgICAgICAgICAgICByb3RhdGVBbmRDcm9wQXV0byhmYWxzZSksCisgICAgICAgICAgICByZXF1ZXN0VGltZU5zKDApIHsKICAgICB9CiAKICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0LAogICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzZXQ8U3RyaW5nOD4+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAogICAgICAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGJvb2wgcm90YXRlQW5kQ3JvcEF1dG8sIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYgaWRzV2l0aFpvb20sCi0gICAgICAgICAgICBjb25zdCBTdXJmYWNlTWFwJiBvdXRTdXJmYWNlcyA9IFN1cmZhY2VNYXB7fSkgOgorICAgICAgICAgICAgbnNlY3NfdCByZXF1ZXN0TnMsIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAogICAgICAgICAgICAgc2Vuc29yVGltZXN0YW1wKDApLAogICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xNTksNiArMTY0LDcgQEAKICAgICAgICAgICAgIHpzbENhcHR1cmUoaXNac2xDYXB0dXJlKSwKICAgICAgICAgICAgIHJvdGF0ZUFuZENyb3BBdXRvKHJvdGF0ZUFuZENyb3BBdXRvKSwKICAgICAgICAgICAgIGNhbWVyYUlkc1dpdGhab29tKGlkc1dpdGhab29tKSwKKyAgICAgICAgICAgIHJlcXVlc3RUaW1lTnMocmVxdWVzdE5zKSwKICAgICAgICAgICAgIG91dHB1dFN1cmZhY2VzKG91dFN1cmZhY2VzKSB7CiAgICAgfQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuY3BwCmluZGV4IDM3MThmNTQuLmEwMmU1ZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvUm90YXRlQW5kQ3JvcE1hcHBlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmNwcApAQCAtMjcsNiArMjcsMTggQEAKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCit2b2lkIFJvdGF0ZUFuZENyb3BNYXBwZXI6OmluaXRSZW1hcHBlZEtleXMoKSB7CisgICAgbVJlbWFwcGVkS2V5cy5pbnNlcnQoCisgICAgICAgICAgICBrTWV0ZXJpbmdSZWdpb25zVG9Db3JyZWN0LmJlZ2luKCksCisgICAgICAgICAgICBrTWV0ZXJpbmdSZWdpb25zVG9Db3JyZWN0LmVuZCgpKTsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydCgKKyAgICAgICAgICAgIGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wLmJlZ2luKCksCisgICAgICAgICAgICBrUmVzdWx0UG9pbnRzVG9Db3JyZWN0Tm9DbGFtcC5lbmQoKSk7CisKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydChBTkRST0lEX1NDQUxFUl9ST1RBVEVfQU5EX0NST1ApOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKTsKK30KKwogYm9vbCBSb3RhdGVBbmRDcm9wTWFwcGVyOjppc05lZWRlZChjb25zdCBDYW1lcmFNZXRhZGF0YSogZGV2aWNlSW5mbykgewogICAgIGF1dG8gZW50cnkgPSBkZXZpY2VJbmZvLT5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9ST1RBVEVfQU5EX0NST1BfTU9ERVMpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgewpAQCAtMzYsNiArNDgsOCBAQAogfQogCiBSb3RhdGVBbmRDcm9wTWFwcGVyOjpSb3RhdGVBbmRDcm9wTWFwcGVyKGNvbnN0IENhbWVyYU1ldGFkYXRhKiBkZXZpY2VJbmZvKSB7CisgICAgaW5pdFJlbWFwcGVkS2V5cygpOworCiAgICAgYXV0byBlbnRyeSA9IGRldmljZUluZm8tPmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CiAgICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9Sb3RhdGVBbmRDcm9wTWFwcGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaAppbmRleCA0NTllMjdmLi5mOWUyMjYzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1JvdGF0ZUFuZENyb3BNYXBwZXIuaApAQCAtMzIsMTIgKzMyLDE0IEBACiAgKiBVdGlsaXRpZXMgdG8gdHJhbnNmb3JtIGJldHdlZW4gdW5yb3RhdGVkIGFuZCByb3RhdGVkLWFuZC1jcm9wcGVkIGNvb3JkaW5hdGUgc3lzdGVtcwogICogZm9yIGNhbWVyYXMgdGhhdCBzdXBwb3J0IFNDQUxFUl9ST1RBVEVfQU5EX0NST1AgY29udHJvbHMgaW4gQVVUTyBtb2RlLgogICovCi1jbGFzcyBSb3RhdGVBbmRDcm9wTWFwcGVyIDogcHJpdmF0ZSBDb29yZGluYXRlTWFwcGVyIHsKK2NsYXNzIFJvdGF0ZUFuZENyb3BNYXBwZXIgOiBwdWJsaWMgQ29vcmRpbmF0ZU1hcHBlciB7CiAgIHB1YmxpYzoKICAgICBzdGF0aWMgYm9vbCBpc05lZWRlZChjb25zdCBDYW1lcmFNZXRhZGF0YSogZGV2aWNlSW5mbyk7CiAKICAgICBSb3RhdGVBbmRDcm9wTWFwcGVyKGNvbnN0IENhbWVyYU1ldGFkYXRhKiBkZXZpY2VJbmZvKTsKIAorICAgIHZvaWQgaW5pdFJlbWFwcGVkS2V5cygpIG92ZXJyaWRlOworCiAgICAgLyoqCiAgICAgICogQWRqdXN0IGNhcHR1cmUgcmVxdWVzdCBhc3N1bWluZyByb3RhdGUgYW5kIGNyb3AgQVVUTyBpcyBlbmFibGVkCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcAppbmRleCA3MjNiNWMyLi5lYTFmMmMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKIFN0YXR1c1RyYWNrZXI6On5TdGF0dXNUcmFja2VyKCkgewogfQogCi1pbnQgU3RhdHVzVHJhY2tlcjo6YWRkQ29tcG9uZW50KCkgeworaW50IFN0YXR1c1RyYWNrZXI6OmFkZENvbXBvbmVudChzdGQ6OnN0cmluZyBjb21wb25lbnROYW1lKSB7CiAgICAgaW50IGlkOwogICAgIHNzaXplX3QgZXJyOwogICAgIHsKQEAgLTQ5LDggKzQ5LDEyIEBACiAgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyBjb21wb25lbnQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKIAogICAgICAgICBlcnIgPSBtU3RhdGVzLmFkZChpZCwgSURMRSk7Ci0gICAgICAgIEFMT0dFX0lGKGVyciA8IDAsICIlczogQ2FuJ3QgYWRkIG5ldyBjb21wb25lbnQgJWQ6ICVzICglemQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudE5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgY29tcG9uZW50TmFtZSA9IHN0ZDo6dG9fc3RyaW5nKGlkKTsKKyAgICAgICAgfQorICAgICAgICBtQ29tcG9uZW50TmFtZXMuYWRkKGlkLCBjb21wb25lbnROYW1lKTsKKyAgICAgICAgQUxPR0VfSUYoZXJyIDwgMCwgIiVzOiBDYW4ndCBhZGQgbmV3IGNvbXBvbmVudCAlZCAoJXMpOiAlcyAoJXpkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCwgY29tcG9uZW50TmFtZS5jX3N0cigpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKICAgICB9CiAKICAgICBpZiAoZXJyID49IDApIHsKQEAgLTY4LDYgKzcyLDcgQEAKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgICAgICBBTE9HVigiJXM6IFJlbW92aW5nIGNvbXBvbmVudCAlZCIsIF9fRlVOQ1RJT05fXywgaWQpOwogICAgICAgICBpZHggPSBtU3RhdGVzLnJlbW92ZUl0ZW0oaWQpOworICAgICAgICBtQ29tcG9uZW50TmFtZXMucmVtb3ZlSXRlbShpZCk7CiAgICAgfQogCiAgICAgaWYgKGlkeCA+PSAwKSB7CkBAIC04MCw2ICs4NSwyMCBAQAogfQogCiAKK3ZvaWQgU3RhdHVzVHJhY2tlcjo6ZHVtcEFjdGl2ZUNvbXBvbmVudHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChtRGV2aWNlU3RhdGUgPT0gSURMRSkgeworICAgICAgICBBTE9HSSgiJXM6IGFsbCBjb21wb25lbnRzIGFyZSBJRExFIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdGF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdGF0ZXMudmFsdWVBdChpKSA9PSBBQ1RJVkUpIHsKKyAgICAgICAgICAgIEFMT0dJKCIlczogY29tcG9uZW50ICVkICglcykgaXMgYWN0aXZlIiwgX19GVU5DVElPTl9fLCBtU3RhdGVzLmtleUF0KGkpLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZXMudmFsdWVBdChpKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBTdGF0dXNUcmFja2VyOjptYXJrQ29tcG9uZW50SWRsZShpbnQgaWQsIGNvbnN0IHNwPEZlbmNlPiYgY29tcG9uZW50RmVuY2UpIHsKICAgICBtYXJrQ29tcG9uZW50KGlkLCBJRExFLCBjb21wb25lbnRGZW5jZSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1N0YXR1c1RyYWNrZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5oCmluZGV4IDNhMWQ4NWMuLjA2OWJmZjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvU3RhdHVzVHJhY2tlci5oCkBAIC0xNywxMyArMTcsMTMgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RBVFVTVFJBQ0tFUl9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUQVRVU1RSQUNLRVJfSAogCisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKIApAQCAtNTQsNyArNTQsNyBAQAogICAgIC8vIEFkZCBhIGNvbXBvbmVudCB0byB0cmFjazsgcmV0dXJucyBub24tbmVnYXRpdmUgdW5pcXVlIElEIGZvciB0aGUgbmV3CiAgICAgLy8gY29tcG9uZW50IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAgICAvLyBOZXcgY29tcG9uZW50cyBzdGFydCBpbiB0aGUgaWRsZSBzdGF0ZS4KLSAgICBpbnQgYWRkQ29tcG9uZW50KCk7CisgICAgaW50IGFkZENvbXBvbmVudChzdGQ6OnN0cmluZyBjb21wb25lbnROYW1lKTsKIAogICAgIC8vIFJlbW92ZSBleGlzdGluZyBjb21wb25lbnQgZnJvbSBpZGxlIHRyYWNraW5nLiBJZ25vcmVzIHVua25vd24gSURzCiAgICAgdm9pZCByZW1vdmVDb21wb25lbnQoaW50IGlkKTsKQEAgLTY4LDYgKzY4LDggQEAKICAgICAvLyBTZXQgdGhlIHN0YXRlIG9mIGEgdHJhY2tlZCBjb21wb25lbnQgdG8gYmUgYWN0aXZlLiBJZ25vcmVzIHVua25vd24gSURzLgogICAgIHZvaWQgbWFya0NvbXBvbmVudEFjdGl2ZShpbnQgaWQpOwogCisgICAgdm9pZCBkdW1wQWN0aXZlQ29tcG9uZW50cygpOworCiAgICAgdmlydHVhbCB2b2lkIHJlcXVlc3RFeGl0KCk7CiAgIHByb3RlY3RlZDoKIApAQCAtMTA1LDYgKzEwNyw3IEBACiAKICAgICAvLyBDdXJyZW50IGNvbXBvbmVudCBzdGF0ZXMKICAgICBLZXllZFZlY3RvcjxpbnQsIENvbXBvbmVudFN0YXRlPiBtU3RhdGVzOworICAgIEtleWVkVmVjdG9yPGludCwgc3RkOjpzdHJpbmc+IG1Db21wb25lbnROYW1lczsKICAgICAvLyBNZXJnZWQgZmVuY2UgZm9yIGFsbCBwcm9jZXNzZWQgc3RhdGUgY2hhbmdlcwogICAgIHNwPEZlbmNlPiBtSWRsZUZlbmNlOwogICAgIC8vIEN1cnJlbnQgb3ZlcmFsbCBkZXZpY2Ugc3RhdGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU4ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiZGV2aWNlMy9VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworLy8gRm9yIENhcHR1cmUgcmVxdWVzdAorLy8gbWV0ZXJpbmcgcmVnaW9uIC0+IHtmd2sgcHJpdmF0ZSBrZXkgZm9yIG1ldGVyaW5nIHJlZ2lvbiBzZXQsIHRydWV9CitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBzdGQ6OnBhaXI8dWludDMyX3QsIHVpbnQzMl90Pj4ga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdCA9IHsKKyAgICB7QU5EUk9JRF9DT05UUk9MX0FGX1JFR0lPTlMsCisgICAgICAgIHtBTkRST0lEX0NPTlRST0xfQUZfUkVHSU9OU19TRVQsIEFORFJPSURfQ09OVFJPTF9BRl9SRUdJT05TX1NFVF9UUlVFfX0sCisgICAge0FORFJPSURfQ09OVFJPTF9BRV9SRUdJT05TLAorICAgICAgICB7QU5EUk9JRF9DT05UUk9MX0FFX1JFR0lPTlNfU0VULCBBTkRST0lEX0NPTlRST0xfQUVfUkVHSU9OU19TRVRfVFJVRX19LAorICAgIHtBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlMsCisgICAgICAgIHtBTkRST0lEX0NPTlRST0xfQVdCX1JFR0lPTlNfU0VULCAgQU5EUk9JRF9DT05UUk9MX0FXQl9SRUdJT05TX1NFVF9UUlVFfX0KK307CisKK1VIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcjo6VUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAorICAgICAgICBib29sIHVzZVByZUNvcnJlY3RlZEFycmF5KSB7CisKKyAgICBpZiAodXNlUHJlQ29ycmVjdGVkQXJyYXkpIHsKKyAgICAgICAgaWYgKCFTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KCZkZXZpY2VJbmZvLAorICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsICZtQXJyYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAmbUFycmF5SGVpZ2h0KSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBnZXQgcHJlIGNvcnJlY3Rpb24gYWN0aXZlIGFycmF5IHNpemUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXJyYXlXaWR0aEFuZEhlaWdodCgmZGV2aWNlSW5mbywKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICAgICAgICAmbUFycmF5V2lkdGhNYXhpbXVtUmVzb2x1dGlvbiwgJm1BcnJheUhlaWdodE1heGltdW1SZXNvbHV0aW9uKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZG4ndCBnZXQgbWF4aW11bSByZXNvbHV0aW9uIHByZSBjb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXJyYXlXaWR0aEFuZEhlaWdodCgmZGV2aWNlSW5mbywKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLCAmbUFycmF5V2lkdGgsCisgICAgICAgICAgICAgICAgJm1BcnJheUhlaWdodCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IGFjdGl2ZSBhcnJheSBzaXplIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFycmF5V2lkdGhBbmRIZWlnaHQoJmRldmljZUluZm8sCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRV9NQVhJTVVNX1JFU09MVVRJT04sCisgICAgICAgICAgICAgICAgJm1BcnJheVdpZHRoTWF4aW11bVJlc29sdXRpb24sICZtQXJyYXlIZWlnaHRNYXhpbXVtUmVzb2x1dGlvbikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IG1heGltdW0gcmVzb2x1dGlvbiBhY3RpdmUgYXJyYXkgc2l6ZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgIH0KKworICAgIG1Jc1ZhbGlkID0gdHJ1ZTsKKworICAgIEFMT0dWKCIlczogYXJyYXkgc2l6ZTogJWQgeCAlZCwgZnVsbCByZXMgYXJyYXkgc2l6ZTogJWQgeCAlZCwiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQXJyYXlXaWR0aCwgbUFycmF5SGVpZ2h0LCBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uLAorICAgICAgICAgICAgbUFycmF5SGVpZ2h0TWF4aW11bVJlc29sdXRpb24pOworfQorCit2b2lkIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcjo6Zml4TWV0ZXJpbmdSZWdpb25zSWZOZWVkZWQoQ2FtZXJhTWV0YWRhdGEgKnJlcXVlc3QpIHsKKyAgICBpZiAocmVxdWVzdCA9PSBudWxscHRyKSB7CisgICAgICBBTE9HRSgiJXMgcmVxdWVzdCBpcyBudWxscHRyLCBjYW4ndCBmaXggY3JvcCByZWdpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJmVudHJ5IDoga01ldGVyaW5nUmVnaW9uc1RvQ29ycmVjdCkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgbWV0ZXJpbmcgcmVnaW9uIFNldCBrZXkgaXMgc2V0IHRvIFRSVUUsIHdlIGRvbid0CisgICAgICAgIC8vIG5lZWQgdG8gY29ycmVjdCB0aGUgbWV0ZXJpbmcgcmVnaW9ucy4KKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1ldGVyaW5nUmVnaW9uc1NldEVudHJ5ID0KKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5maW5kKGVudHJ5LnNlY29uZC5maXJzdCk7CisgICAgICAgIGlmIChtZXRlcmluZ1JlZ2lvbnNTZXRFbnRyeS5jb3VudCA9PSAxICYmCisgICAgICAgICAgICAgICAgbWV0ZXJpbmdSZWdpb25zU2V0RW50cnkuZGF0YS51OFswXSA9PSBlbnRyeS5zZWNvbmQuc2Vjb25kKSB7CisgICAgICAgICAgICAvLyBtZXRlcmluZyByZWdpb24gc2V0IGJ5IGNsaWVudCwgZG9lc24ndCBuZWVkIHRvIGJlIGZpeGVkLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IG1ldGVyaW5nUmVnaW9uRW50cnkgPSByZXF1ZXN0LT5maW5kKGVudHJ5LmZpcnN0KTsKKyAgICAgICAgaWYgKG1ldGVyaW5nUmVnaW9uRW50cnkuY291bnQgJSA1ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTWV0ZXJpbmcgcmVnaW9uIGVudHJ5IGZvciB0YWcgJWQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIG51bWJlciBvZiBlbnRyaWVzLCAiCisgICAgICAgICAgICAgICAgICAgICJza2lwcGluZyIsIF9fRlVOQ1RJT05fXywgKGludCllbnRyeS5maXJzdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1ldGVyaW5nUmVnaW9uRW50cnkuY291bnQ7IGogKz0gNSkgeworICAgICAgICAgICAgaW50MzJfdCAqbWV0ZXJpbmdSZWdpb25TdGFydCA9IG1ldGVyaW5nUmVnaW9uRW50cnkuZGF0YS5pMzIgKyBqOworICAgICAgICAgICAgbWV0ZXJpbmdSZWdpb25TdGFydFswXSA9IDA7CisgICAgICAgICAgICBtZXRlcmluZ1JlZ2lvblN0YXJ0WzFdID0gMDsKKyAgICAgICAgICAgIG1ldGVyaW5nUmVnaW9uU3RhcnRbMl0gPSBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uOworICAgICAgICAgICAgbWV0ZXJpbmdSZWdpb25TdGFydFszXSA9IG1BcnJheUhlaWdodE1heGltdW1SZXNvbHV0aW9uOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcjo6Zml4Q3JvcFJlZ2lvbnNJZk5lZWRlZChDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgeworICAgIGlmIChyZXF1ZXN0ID09IG51bGxwdHIpIHsKKyAgICAgIEFMT0dFKCIlcyByZXF1ZXN0IGlzIG51bGxwdHIsIGNhbid0IGZpeCBjcm9wIHJlZ2lvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoZSBzY2FsZXJDcm9wUmVnaW9uU2V0IGtleSBpcyBzZXQgdG8gVFJVRSwgd2UgZG9uJ3QKKyAgICAvLyBuZWVkIHRvIGNvcnJlY3QgdGhlIGNyb3AgcmVnaW9uLgorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBjcm9wUmVnaW9uU2V0RW50cnkgPQorICAgICAgICAgICAgcmVxdWVzdC0+ZmluZChBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTl9TRVQpOworICAgIGlmIChjcm9wUmVnaW9uU2V0RW50cnkuY291bnQgPT0gMSAmJgorICAgICAgICBjcm9wUmVnaW9uU2V0RW50cnkuZGF0YS51OFswXSA9PSBBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTl9TRVRfVFJVRSkgeworICAgICAgICAvLyBjcm9wIHJlZ2lvbnMgc2V0IGJ5IGNsaWVudCwgZG9lc24ndCBuZWVkIHRvIGJlIGZpeGVkLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGNyb3BSZWdpb25FbnRyeSA9IHJlcXVlc3QtPmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pOworICAgIGlmIChjcm9wUmVnaW9uRW50cnkuY291bnQgPT0gNCkgeworICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMF0gPSAwOworICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMV0gPSAwOworICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMl0gPSBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uOworICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbM10gPSBtQXJyYXlIZWlnaHRNYXhpbXVtUmVzb2x1dGlvbjsKKyAgICB9Cit9CisKK3N0YXR1c190IFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcjo6dXBkYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEqIHJlcXVlc3QpIHsKKyAgICBpZiAocmVxdWVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBJbnZhbGlkIHJlcXVlc3QsIHJlcXVlc3QgaXMgbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghbUlzVmFsaWQpIHsKKyAgICAgICAgQUxPR0UoIiVzIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlciBkaWRuJ3QgaW5pdGlhbGl6ZSBjb3JyZWN0bHkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHNlbnNvclBpeGVsTW9kZUVudHJ5ID0gcmVxdWVzdC0+ZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFKTsKKworICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgbWF4IHJlc29sdXRpb24gY2FwdHVyZSwgaWYgbm90LCB3ZSBkb24ndCBuZWVkIHRvIGRvCisgICAgLy8gYW55dGhpbmcuCisgICAgaWYgKHNlbnNvclBpeGVsTW9kZUVudHJ5LmNvdW50ICE9IDApIHsKKyAgICAgICAgaW50MzJfdCBzZW5zb3JQaXhlbE1vZGUgPSBzZW5zb3JQaXhlbE1vZGVFbnRyeS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSB7CisgICAgICAgICAgICAvLyBDb3JyZWN0aW9uIG5vdCBuZWVkZWQgZm9yIGRlZmF1bHQgbW9kZSByZXF1ZXN0cy4KKyAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc2Vuc29yIHBpeGVsIG1vZGUgbm90IHNldCAtPiBkZWZhdWx0IHNlbnNvciBwaXhlbCBtb2RlIHJlcXVlc3QsIHdoaWNoCisgICAgICAgIC8vIGRvZXNuJ3QgbmVlZCBjb3JyZWN0aW9uLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZml4Q3JvcFJlZ2lvbnNJZk5lZWRlZChyZXF1ZXN0KTsKKyAgICBmaXhNZXRlcmluZ1JlZ2lvbnNJZk5lZWRlZChyZXF1ZXN0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9VSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyNmU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX1VIUkNST1BfUkVHSU9OU19NQVBQRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfVUhSQ1JPUF9SRUdJT05TX01BUFBFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxhcnJheT4KKworI2luY2x1ZGUgImNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLyoqCisgKiBVdGlsaXRpZXMgdG8gdHJhbnNmb3JtIFNDQUxFUl9DUk9QX1JFR0lPTiBhbmQgbWV0ZXJpbmcgcmVnaW9ucyBmb3IgdWx0cmEgaGlnaAorICogcmVzb2x1dGlvbiBzZW5zb3JzLgorICovCitjbGFzcyBVSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIgeworIHB1YmxpYzoKKyAgICBVSFJDcm9wQW5kTWV0ZXJpbmdSZWdpb25NYXBwZXIoKSA9IGRlZmF1bHQ7CisgICAgVUhSQ3JvcEFuZE1ldGVyaW5nUmVnaW9uTWFwcGVyKGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLCBib29sIHVzZVByZUNvcnJlY3Rpb25BcnJheSk7CisKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgY2FwdHVyZSByZXF1ZXN0IGFzc3VtaW5nIHJvdGF0ZSBhbmQgY3JvcCBBVVRPIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCB1cGRhdGVDYXB0dXJlUmVxdWVzdChDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CisKKyBwcml2YXRlOgorCisgICAgdm9pZCBmaXhDcm9wUmVnaW9uc0lmTmVlZGVkKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKKyAgICB2b2lkIGZpeE1ldGVyaW5nUmVnaW9uc0lmTmVlZGVkKENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKKworICAgIGludDMyX3QgbUFycmF5V2lkdGggPSAwOworICAgIGludDMyX3QgbUFycmF5SGVpZ2h0ID0gMDsKKyAgICBpbnQzMl90IG1BcnJheVdpZHRoTWF4aW11bVJlc29sdXRpb24gPSAwOworICAgIGludDMyX3QgbUFycmF5SGVpZ2h0TWF4aW11bVJlc29sdXRpb24gPSAwOworICAgIGJvb2wgbUlzVmFsaWQgPSBmYWxzZTsKK307IC8vIGNsYXNzIFVIUkNyb3BBbmRNZXRlcmluZ1JlZ2lvbk1hcHBlcgorCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5jcHAKaW5kZXggYTg3ZGU3Ny4uN2VjMDk1NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmNwcApAQCAtMjAsMTEgKzIwLDI1IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSAiZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuaCIKKyNpbmNsdWRlICJ1dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIGNhbWVyYTMgewogCit2b2lkIFpvb21SYXRpb01hcHBlcjo6aW5pdFJlbWFwcGVkS2V5cygpIHsKKyAgICBtUmVtYXBwZWRLZXlzLmluc2VydCgKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuYmVnaW4oKSwKKyAgICAgICAgICAgIGtNZXRlcmluZ1JlZ2lvbnNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1JlY3RzVG9Db3JyZWN0LmJlZ2luKCksCisgICAgICAgICAgICBrUmVjdHNUb0NvcnJlY3QuZW5kKCkpOworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KAorICAgICAgICAgICAga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXAuYmVnaW4oKSwKKyAgICAgICAgICAgIGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wLmVuZCgpKTsKKworICAgIG1SZW1hcHBlZEtleXMuaW5zZXJ0KEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPKTsKK30KIAogc3RhdHVzX3QgWm9vbVJhdGlvTWFwcGVyOjppbml0Wm9vbVJhdGlvSW5UZW1wbGF0ZShDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgewogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwpAQCAtMTE3LDQ4ICsxMzEsMTI2IEBACiAKIFpvb21SYXRpb01hcHBlcjo6Wm9vbVJhdGlvTWFwcGVyKGNvbnN0IENhbWVyYU1ldGFkYXRhKiBkZXZpY2VJbmZvLAogICAgICAgICBib29sIHN1cHBvcnROYXRpdmVab29tUmF0aW8sIGJvb2wgdXNlUHJlY29ycmVjdEFycmF5KSB7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnk7CisgICAgaW5pdFJlbWFwcGVkS2V5cygpOwogCi0gICAgZW50cnkgPSBkZXZpY2VJbmZvLT5maW5kKEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUpOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm47Ci0gICAgaW50MzJfdCBhcnJheVcgPSBlbnRyeS5kYXRhLmkzMlsyXTsKLSAgICBpbnQzMl90IGFycmF5SCA9IGVudHJ5LmRhdGEuaTMyWzNdOworICAgIGludDMyX3QgYXJyYXlXID0gMDsKKyAgICBpbnQzMl90IGFycmF5SCA9IDA7CisgICAgaW50MzJfdCBhcnJheU1heGltdW1SZXNvbHV0aW9uVyA9IDA7CisgICAgaW50MzJfdCBhcnJheU1heGltdW1SZXNvbHV0aW9uSCA9IDA7CisgICAgaW50MzJfdCBhY3RpdmVXID0gMDsKKyAgICBpbnQzMl90IGFjdGl2ZUggPSAwOworICAgIGludDMyX3QgYWN0aXZlTWF4aW11bVJlc29sdXRpb25XID0gMDsKKyAgICBpbnQzMl90IGFjdGl2ZU1heGltdW1SZXNvbHV0aW9uSCA9IDA7CiAKLSAgICBlbnRyeSA9IGRldmljZUluZm8tPmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7Ci0gICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHJldHVybjsKLSAgICBpbnQzMl90IGFjdGl2ZVcgPSBlbnRyeS5kYXRhLmkzMlsyXTsKLSAgICBpbnQzMl90IGFjdGl2ZUggPSBlbnRyeS5kYXRhLmkzMlszXTsKKyAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFycmF5V2lkdGhBbmRIZWlnaHQoZGV2aWNlSW5mbywKKyAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fUFJFX0NPUlJFQ1RJT05fQUNUSVZFX0FSUkFZX1NJWkUsICZhcnJheVcsICZhcnJheUgpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IHByZSBjb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBzaXplIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAgaWYgKCFTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGRldmljZUluZm8sCisgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLCAmYWN0aXZlVywgJmFjdGl2ZUgpKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IGFjdGl2ZSBhcnJheSBzaXplIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNVbHRyYUhpZ2hSZXNvbHV0aW9uU2Vuc29yID0KKyAgICAgICAgICAgIGNhbWVyYTM6OlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcigqZGV2aWNlSW5mbyk7CisgICAgaWYgKGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcikgeworICAgICAgICBpZiAoIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFycmF5V2lkdGhBbmRIZWlnaHQoZGV2aWNlSW5mbywKKyAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiwKKyAgICAgICAgICAgICAgICAmYXJyYXlNYXhpbXVtUmVzb2x1dGlvblcsICZhcnJheU1heGltdW1SZXNvbHV0aW9uSCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgZ2V0IG1heGltdW0gcmVzb2x1dGlvbiBwcmUgY29ycmVjdGlvbiBhY3RpdmUgYXJyYXkgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgIGlmICghU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXJyYXlXaWR0aEFuZEhlaWdodChkZXZpY2VJbmZvLAorICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkVfTUFYSU1VTV9SRVNPTFVUSU9OLAorICAgICAgICAgICAgICAgICZhY3RpdmVNYXhpbXVtUmVzb2x1dGlvblcsICZhY3RpdmVNYXhpbXVtUmVzb2x1dGlvbkgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGdldCBtYXhpbXVtIHJlc29sdXRpb24gcHJlIGNvcnJlY3Rpb24gYWN0aXZlIGFycmF5IHNpemUiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKHVzZVByZWNvcnJlY3RBcnJheSkgewogICAgICAgICBtQXJyYXlXaWR0aCA9IGFycmF5VzsKICAgICAgICAgbUFycmF5SGVpZ2h0ID0gYXJyYXlIOworICAgICAgICBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uID0gYXJyYXlNYXhpbXVtUmVzb2x1dGlvblc7CisgICAgICAgIG1BcnJheUhlaWdodE1heGltdW1SZXNvbHV0aW9uID0gYXJyYXlNYXhpbXVtUmVzb2x1dGlvbkg7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUFycmF5V2lkdGggPSBhY3RpdmVXOwogICAgICAgICBtQXJyYXlIZWlnaHQgPSBhY3RpdmVIOworICAgICAgICBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uID0gYWN0aXZlTWF4aW11bVJlc29sdXRpb25XOworICAgICAgICBtQXJyYXlIZWlnaHRNYXhpbXVtUmVzb2x1dGlvbiA9IGFjdGl2ZU1heGltdW1SZXNvbHV0aW9uSDsKICAgICB9CiAgICAgbUhhbFN1cHBvcnRzWm9vbVJhdGlvID0gc3VwcG9ydE5hdGl2ZVpvb21SYXRpbzsKIAotICAgIEFMT0dWKCIlczogYXJyYXkgc2l6ZTogJWQgeCAlZCwgbUhhbFN1cHBvcnRzWm9vbVJhdGlvICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUFycmF5V2lkdGgsIG1BcnJheUhlaWdodCwgbUhhbFN1cHBvcnRzWm9vbVJhdGlvKTsKKyAgICBBTE9HVigiJXM6IGFycmF5IHNpemU6ICVkIHggJWQsIGZ1bGwgcmVzIGFycmF5IHNpemU6ICVkIHggJWQsICBtSGFsU3VwcG9ydHNab29tUmF0aW8gJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQXJyYXlXaWR0aCwgbUFycmF5SGVpZ2h0LCBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uLAorICAgICAgICAgICAgbUFycmF5SGVpZ2h0TWF4aW11bVJlc29sdXRpb24sIG1IYWxTdXBwb3J0c1pvb21SYXRpbyk7CiAgICAgbUlzVmFsaWQgPSB0cnVlOwogfQogCitzdGF0dXNfdCBab29tUmF0aW9NYXBwZXI6OmdldEFycmF5RGltZW5zaW9uc1RvQmVVc2VkKGNvbnN0IENhbWVyYU1ldGFkYXRhICpzZXR0aW5ncywKKyAgICAgICAgaW50MzJfdCAqYXJyYXlXaWR0aCwgaW50MzJfdCAqYXJyYXlIZWlnaHQpIHsKKyAgICBpZiAoc2V0dGluZ3MgPT0gbnVsbHB0ciB8fCBhcnJheVdpZHRoID09IG51bGxwdHIgfHwgYXJyYXlIZWlnaHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBGaXJzdCB3ZSBnZXQgdGhlIHNlbnNvclBpeGVsTW9kZSBmcm9tIHRoZSBzZXR0aW5ncyBtZXRhZGF0YS4KKyAgICBpbnQzMl90IHNlbnNvclBpeGVsTW9kZSA9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc29yUGl4ZWxNb2RlRW50cnkgPSBzZXR0aW5ncy0+ZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFKTsKKyAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlRW50cnkuY291bnQgIT0gMCkgeworICAgICAgICBzZW5zb3JQaXhlbE1vZGUgPSBzZW5zb3JQaXhlbE1vZGVFbnRyeS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCAmJgorICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3Qgc2Vuc29yIHBpeGVsIG1vZGUgaXMgbm90IG9uZSBvZiB0aGUgdmFsaWQgdmFsdWVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlbnNvclBpeGVsTW9kZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZW5zb3JQaXhlbE1vZGUgPT0gQU5EUk9JRF9TRU5TT1JfUElYRUxfTU9ERV9ERUZBVUxUKSB7CisgICAgICAgICphcnJheVdpZHRoID0gbUFycmF5V2lkdGg7CisgICAgICAgICphcnJheUhlaWdodCA9IG1BcnJheUhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICAqYXJyYXlXaWR0aCA9IG1BcnJheVdpZHRoTWF4aW11bVJlc29sdXRpb247CisgICAgICAgICphcnJheUhlaWdodCA9IG1BcnJheUhlaWdodE1heGltdW1SZXNvbHV0aW9uOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFpvb21SYXRpb01hcHBlcjo6dXBkYXRlQ2FwdHVyZVJlcXVlc3QoQ2FtZXJhTWV0YWRhdGEqIHJlcXVlc3QpIHsKICAgICBpZiAoIW1Jc1ZhbGlkKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKICAgICBib29sIHpvb21SYXRpb0lzMSA9IHRydWU7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7Ci0KKyAgICBpbnQgYXJyYXlIZWlnaHQsIGFycmF5V2lkdGggPSAwOworICAgIHJlcyA9IGdldEFycmF5RGltZW5zaW9uc1RvQmVVc2VkKHJlcXVlc3QsICZhcnJheVdpZHRoLCAmYXJyYXlIZWlnaHQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAgICAgZW50cnkgPSByZXF1ZXN0LT5maW5kKEFORFJPSURfQ09OVFJPTF9aT09NX1JBVElPKTsKICAgICBpZiAoZW50cnkuY291bnQgPT0gMSAmJiBlbnRyeS5kYXRhLmZbMF0gIT0gMS4wZikgewogICAgICAgICB6b29tUmF0aW9JczEgPSBmYWxzZTsKKworICAgICAgICAvLyBJZiBjcm9wUmVnaW9uIGlzIHdpbmRvd2JveGluZywgb3ZlcnJpZGUgaXQgd2l0aCBhY3RpdmVBcnJheQorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBjcm9wUmVnaW9uRW50cnkgPSByZXF1ZXN0LT5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKTsKKyAgICAgICAgaWYgKGNyb3BSZWdpb25FbnRyeS5jb3VudCA9PSA0KSB7CisgICAgICAgICAgICBpbnQgY3JvcFdpZHRoID0gY3JvcFJlZ2lvbkVudHJ5LmRhdGEuaTMyWzJdOworICAgICAgICAgICAgaW50IGNyb3BIZWlnaHQgPSBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbM107CisgICAgICAgICAgICBpZiAoY3JvcFdpZHRoIDwgYXJyYXlXaWR0aCAmJiBjcm9wSGVpZ2h0IDwgYXJyYXlIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbMF0gPSAwOworICAgICAgICAgICAgICAgIGNyb3BSZWdpb25FbnRyeS5kYXRhLmkzMlsxXSA9IDA7CisgICAgICAgICAgICAgICAgY3JvcFJlZ2lvbkVudHJ5LmRhdGEuaTMyWzJdID0gYXJyYXlXaWR0aDsKKyAgICAgICAgICAgICAgICBjcm9wUmVnaW9uRW50cnkuZGF0YS5pMzJbM10gPSBhcnJheUhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtSGFsU3VwcG9ydHNab29tUmF0aW8gJiYgem9vbVJhdGlvSXMxKSB7Ci0gICAgICAgIHJlcyA9IHNlcGFyYXRlWm9vbUZyb21Dcm9wTG9ja2VkKHJlcXVlc3QsIGZhbHNlLyppc1Jlc3VsdCovKTsKKyAgICAgICAgcmVzID0gc2VwYXJhdGVab29tRnJvbUNyb3BMb2NrZWQocmVxdWVzdCwgZmFsc2UvKmlzUmVzdWx0Ki8sIGFycmF5V2lkdGgsIGFycmF5SGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKCFtSGFsU3VwcG9ydHNab29tUmF0aW8gJiYgIXpvb21SYXRpb0lzMSkgewotICAgICAgICByZXMgPSBjb21iaW5lWm9vbUFuZENyb3BMb2NrZWQocmVxdWVzdCwgZmFsc2UvKmlzUmVzdWx0Ki8pOworICAgICAgICByZXMgPSBjb21iaW5lWm9vbUFuZENyb3BMb2NrZWQocmVxdWVzdCwgZmFsc2UvKmlzUmVzdWx0Ki8sIGFycmF5V2lkdGgsIGFycmF5SGVpZ2h0KTsKICAgICB9CiAKICAgICAvLyBJZiBDT05UUk9MX1pPT01fUkFUSU8gaXMgaW4gcmVxdWVzdCwgYnV0IEhBTCBkb2Vzbid0IHN1cHBvcnQKQEAgLTE3NSwxMCArMjY3LDE1IEBACiAKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKIAorICAgIGludCBhcnJheUhlaWdodCwgYXJyYXlXaWR0aCA9IDA7CisgICAgcmVzID0gZ2V0QXJyYXlEaW1lbnNpb25zVG9CZVVzZWQocmVzdWx0LCAmYXJyYXlXaWR0aCwgJmFycmF5SGVpZ2h0KTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogICAgIGlmIChtSGFsU3VwcG9ydHNab29tUmF0aW8gJiYgcmVxdWVzdGVkWm9vbVJhdGlvSXMxKSB7Ci0gICAgICAgIHJlcyA9IGNvbWJpbmVab29tQW5kQ3JvcExvY2tlZChyZXN1bHQsIHRydWUvKmlzUmVzdWx0Ki8pOworICAgICAgICByZXMgPSBjb21iaW5lWm9vbUFuZENyb3BMb2NrZWQocmVzdWx0LCB0cnVlLyppc1Jlc3VsdCovLCBhcnJheVdpZHRoLCBhcnJheUhlaWdodCk7CiAgICAgfSBlbHNlIGlmICghbUhhbFN1cHBvcnRzWm9vbVJhdGlvICYmICFyZXF1ZXN0ZWRab29tUmF0aW9JczEpIHsKLSAgICAgICAgcmVzID0gc2VwYXJhdGVab29tRnJvbUNyb3BMb2NrZWQocmVzdWx0LCB0cnVlLyppc1Jlc3VsdCovKTsKKyAgICAgICAgcmVzID0gc2VwYXJhdGVab29tRnJvbUNyb3BMb2NrZWQocmVzdWx0LCB0cnVlLyppc1Jlc3VsdCovLCBhcnJheVdpZHRoLCBhcnJheUhlaWdodCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnkgPSByZXN1bHQtPmZpbmQoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8pOwogICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgewpAQCAtMTkwLDE2ICsyODcsMjIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1mbG9hdCBab29tUmF0aW9NYXBwZXI6OmRlcml2ZVpvb21SYXRpbyhjb25zdCBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIHsKK3N0YXR1c190IFpvb21SYXRpb01hcHBlcjo6ZGVyaXZlWm9vbVJhdGlvKGNvbnN0IENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSwgZmxvYXQgKnpvb21SYXRpb1JldCwKKyAgICAgICAgaW50IGFycmF5V2lkdGgsIGludCBhcnJheUhlaWdodCkgeworICAgIGlmIChtZXRhZGF0YSA9PSBudWxscHRyIHx8IHpvb21SYXRpb1JldCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogICAgIGZsb2F0IHpvb21SYXRpbyA9IDEuMDsKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5OwogICAgIGVudHJ5ID0gbWV0YWRhdGEtPmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pOwotICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm4gem9vbVJhdGlvOwotCisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDQpIHsKKyAgICAgICAgKnpvb21SYXRpb1JldCA9IDE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CiAgICAgLy8gQ2VudGVyIG9mIHRoZSBwcmVDb3JyZWN0aW9uL2FjdGl2ZSBzaXplCi0gICAgZmxvYXQgYXJyYXlDZW50ZXJYID0gbUFycmF5V2lkdGggLyAyLjA7Ci0gICAgZmxvYXQgYXJyYXlDZW50ZXJZID0gbUFycmF5SGVpZ2h0IC8gMi4wOworICAgIGZsb2F0IGFycmF5Q2VudGVyWCA9IGFycmF5V2lkdGggLyAyLjA7CisgICAgZmxvYXQgYXJyYXlDZW50ZXJZID0gYXJyYXlIZWlnaHQgLyAyLjA7CiAKICAgICAvLyBSZS1tYXAgY3JvcCByZWdpb24gdG8gY29vcmRpbmF0ZSBzeXN0ZW0gY2VudGVyZWQgdG8gKGFycmF5Q2VudGVyWCwKICAgICAvLyBhcnJheUNlbnRlclkpLgpAQCAtMjA5LDIyICszMTIsMzAgQEAKICAgICBmbG9hdCBjcm9wUmVnaW9uQm90dG9tID0gZW50cnkuZGF0YS5pMzJbMV0gKyBlbnRyeS5kYXRhLmkzMlszXSAtIGFycmF5Q2VudGVyWTsKIAogICAgIC8vIENhbGN1bGF0ZSB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGxlZnQsIHRvcCwgYm90dG9tLCByaWdodAotICAgIGZsb2F0IHpvb21SYXRpb0xlZnQgPSBzdGQ6Om1heChtQXJyYXlXaWR0aCAvICgyICogY3JvcFJlZ2lvbkxlZnQpLCAxLjBmKTsKLSAgICBmbG9hdCB6b29tUmF0aW9Ub3AgPSBzdGQ6Om1heChtQXJyYXlIZWlnaHQgLyAoMiAqIGNyb3BSZWdpb25Ub3ApLCAxLjBmKTsKLSAgICBmbG9hdCB6b29tUmF0aW9SaWdodCA9IHN0ZDo6bWF4KG1BcnJheVdpZHRoIC8gKDIgKiBjcm9wUmVnaW9uUmlnaHQpLCAxLjBmKTsKLSAgICBmbG9hdCB6b29tUmF0aW9Cb3R0b20gPSBzdGQ6Om1heChtQXJyYXlIZWlnaHQgLyAoMiAqIGNyb3BSZWdpb25Cb3R0b20pLCAxLjBmKTsKKyAgICBmbG9hdCB6b29tUmF0aW9MZWZ0ID0gc3RkOjptYXgoYXJyYXlXaWR0aCAvICgyICogY3JvcFJlZ2lvbkxlZnQpLCAxLjBmKTsKKyAgICBmbG9hdCB6b29tUmF0aW9Ub3AgPSBzdGQ6Om1heChhcnJheUhlaWdodCAvICgyICogY3JvcFJlZ2lvblRvcCksIDEuMGYpOworICAgIGZsb2F0IHpvb21SYXRpb1JpZ2h0ID0gc3RkOjptYXgoYXJyYXlXaWR0aCAvICgyICogY3JvcFJlZ2lvblJpZ2h0KSwgMS4wZik7CisgICAgZmxvYXQgem9vbVJhdGlvQm90dG9tID0gc3RkOjptYXgoYXJyYXlIZWlnaHQgLyAoMiAqIGNyb3BSZWdpb25Cb3R0b20pLCAxLjBmKTsKIAogICAgIC8vIFVzZSBtaW5pbXVtIHNjYWxpbmcgZmFjdG9yIHRvIGhhbmRsZSBsZXR0ZXJib3hpbmcgb3IgcGlsbGFyYm94aW5nCiAgICAgem9vbVJhdGlvID0gc3RkOjptaW4oc3RkOjptaW4oem9vbVJhdGlvTGVmdCwgem9vbVJhdGlvUmlnaHQpLAogICAgICAgICAgICAgc3RkOjptaW4oem9vbVJhdGlvVG9wLCB6b29tUmF0aW9Cb3R0b20pKTsKIAogICAgIEFMT0dWKCIlczogZGVyaXZlZCB6b29tUmF0aW8gaXMgJWYiLCBfX0ZVTkNUSU9OX18sIHpvb21SYXRpbyk7Ci0gICAgcmV0dXJuIHpvb21SYXRpbzsKKyAgICAqem9vbVJhdGlvUmV0ID0gem9vbVJhdGlvOworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgWm9vbVJhdGlvTWFwcGVyOjpzZXBhcmF0ZVpvb21Gcm9tQ3JvcExvY2tlZChDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIGJvb2wgaXNSZXN1bHQpIHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgZmxvYXQgem9vbVJhdGlvID0gZGVyaXZlWm9vbVJhdGlvKG1ldGFkYXRhKTsKK3N0YXR1c190IFpvb21SYXRpb01hcHBlcjo6c2VwYXJhdGVab29tRnJvbUNyb3BMb2NrZWQoQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhLCBib29sIGlzUmVzdWx0LAorICAgICAgICBpbnQgYXJyYXlXaWR0aCwgaW50IGFycmF5SGVpZ2h0KSB7CisgICAgZmxvYXQgem9vbVJhdGlvID0gMS4wOworICAgIHN0YXR1c190IHJlcyA9IGRlcml2ZVpvb21SYXRpbyhtZXRhZGF0YSwgJnpvb21SYXRpbywgYXJyYXlXaWR0aCwgYXJyYXlIZWlnaHQpOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBkZXJpdmUgem9vbSByYXRpbzogJXMoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAogICAgIC8vIFVwZGF0ZSB6b29tUmF0aW8gbWV0YWRhdGEgdGFnCiAgICAgcmVzID0gbWV0YWRhdGEtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfWk9PTV9SQVRJTywgJnpvb21SYXRpbywgMSk7CkBAIC0yNDQsMTIgKzM1NSwxNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVG9wIGxlZnQgKGluY2x1c2l2ZSkKLSAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqLCAxLCB6b29tUmF0aW8sIHRydWUgLypjbGFtcCovKTsKKyAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqLCAxLCB6b29tUmF0aW8sIHRydWUgLypjbGFtcCovLCBhcnJheVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhcnJheUhlaWdodCk7CiAgICAgICAgICAgICAvLyBCb3R0b20gcmlnaHQgKGV4Y2x1c2l2ZSk6IFVzZSBhZGphY2VudCBpbmNsdXNpdmUgcGl4ZWwgdG8KICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZS4KICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orMl0gLT0gMTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orM10gLT0gMTsKLSAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqICsgMiwgMSwgem9vbVJhdGlvLCB0cnVlIC8qY2xhbXAqLyk7CisgICAgICAgICAgICBzY2FsZUNvb3JkaW5hdGVzKGVudHJ5LmRhdGEuaTMyICsgaiArIDIsIDEsIHpvb21SYXRpbywgdHJ1ZSAvKmNsYW1wKi8sIGFycmF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFycmF5SGVpZ2h0KTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orMl0gKz0gMTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orM10gKz0gMTsKICAgICAgICAgfQpAQCAtMjU3LDIwICszNzAsMjIgQEAKIAogICAgIGZvciAoYXV0byByZWN0IDoga1JlY3RzVG9Db3JyZWN0KSB7CiAgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEtPmZpbmQocmVjdCk7Ci0gICAgICAgIHNjYWxlUmVjdHMoZW50cnkuZGF0YS5pMzIsIGVudHJ5LmNvdW50IC8gNCwgem9vbVJhdGlvKTsKKyAgICAgICAgc2NhbGVSZWN0cyhlbnRyeS5kYXRhLmkzMiwgZW50cnkuY291bnQgLyA0LCB6b29tUmF0aW8sIGFycmF5V2lkdGgsIGFycmF5SGVpZ2h0KTsKICAgICB9CiAKICAgICBpZiAoaXNSZXN1bHQpIHsKICAgICAgICAgZm9yIChhdXRvIHB0cyA6IGtSZXN1bHRQb2ludHNUb0NvcnJlY3ROb0NsYW1wKSB7CiAgICAgICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLT5maW5kKHB0cyk7Ci0gICAgICAgICAgICBzY2FsZUNvb3JkaW5hdGVzKGVudHJ5LmRhdGEuaTMyLCBlbnRyeS5jb3VudCAvIDIsIHpvb21SYXRpbywgZmFsc2UgLypjbGFtcCovKTsKKyAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIsIGVudHJ5LmNvdW50IC8gMiwgem9vbVJhdGlvLCBmYWxzZSAvKmNsYW1wKi8sCisgICAgICAgICAgICAgICAgICAgIGFycmF5V2lkdGgsIGFycmF5SGVpZ2h0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgWm9vbVJhdGlvTWFwcGVyOjpjb21iaW5lWm9vbUFuZENyb3BMb2NrZWQoQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhLCBib29sIGlzUmVzdWx0KSB7CitzdGF0dXNfdCBab29tUmF0aW9NYXBwZXI6OmNvbWJpbmVab29tQW5kQ3JvcExvY2tlZChDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIGJvb2wgaXNSZXN1bHQsCisgICAgICAgIGludCBhcnJheVdpZHRoLCBpbnQgYXJyYXlIZWlnaHQpIHsKICAgICBmbG9hdCB6b29tUmF0aW8gPSAxLjBmOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogICAgIGVudHJ5ID0gbWV0YWRhdGEtPmZpbmQoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8pOwpAQCAtMjc5LDcgKzM5NCw2IEBACiAgICAgfQogCiAgICAgLy8gVW5zY2FsZSByZWdpb25zIHdpdGggem9vbVJhdGlvCi0gICAgc3RhdHVzX3QgcmVzOwogICAgIGZvciAoYXV0byByZWdpb24gOiBrTWV0ZXJpbmdSZWdpb25zVG9Db3JyZWN0KSB7CiAgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEtPmZpbmQocmVnaW9uKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBlbnRyeS5jb3VudDsgaiArPSA1KSB7CkBAIC0yODgsMjkgKzQwMiwzMiBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVG9wLWxlZnQgKGluY2x1c2l2ZSkKLSAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqLCAxLCAxLjAgLyB6b29tUmF0aW8sIHRydWUgLypjbGFtcCovKTsKKyAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqLCAxLCAxLjAgLyB6b29tUmF0aW8sIHRydWUgLypjbGFtcCovLCBhcnJheVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhcnJheUhlaWdodCk7CiAgICAgICAgICAgICAvLyBCb3R0b20tcmlnaHQgKGV4Y2x1c2l2ZSk6IFVzZSBhZGphY2VudCBpbmNsdXNpdmUgcGl4ZWwgdG8KICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZS4KICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orMl0gLT0gMTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orM10gLT0gMTsKLSAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIgKyBqICsgMiwgMSwgMS4wIC8gem9vbVJhdGlvLCB0cnVlIC8qY2xhbXAqLyk7CisgICAgICAgICAgICBzY2FsZUNvb3JkaW5hdGVzKGVudHJ5LmRhdGEuaTMyICsgaiArIDIsIDEsIDEuMCAvIHpvb21SYXRpbywgdHJ1ZSAvKmNsYW1wKi8sIGFycmF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFycmF5SGVpZ2h0KTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orMl0gKz0gMTsKICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2orM10gKz0gMTsKICAgICAgICAgfQogICAgIH0KICAgICBmb3IgKGF1dG8gcmVjdCA6IGtSZWN0c1RvQ29ycmVjdCkgewogICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLT5maW5kKHJlY3QpOwotICAgICAgICBzY2FsZVJlY3RzKGVudHJ5LmRhdGEuaTMyLCBlbnRyeS5jb3VudCAvIDQsIDEuMCAvIHpvb21SYXRpbyk7CisgICAgICAgIHNjYWxlUmVjdHMoZW50cnkuZGF0YS5pMzIsIGVudHJ5LmNvdW50IC8gNCwgMS4wIC8gem9vbVJhdGlvLCBhcnJheVdpZHRoLCBhcnJheUhlaWdodCk7CiAgICAgfQogICAgIGlmIChpc1Jlc3VsdCkgewogICAgICAgICBmb3IgKGF1dG8gcHRzIDoga1Jlc3VsdFBvaW50c1RvQ29ycmVjdE5vQ2xhbXApIHsKICAgICAgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEtPmZpbmQocHRzKTsKLSAgICAgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoZW50cnkuZGF0YS5pMzIsIGVudHJ5LmNvdW50IC8gMiwgMS4wIC8gem9vbVJhdGlvLCBmYWxzZSAvKmNsYW1wKi8pOworICAgICAgICAgICAgc2NhbGVDb29yZGluYXRlcyhlbnRyeS5kYXRhLmkzMiwgZW50cnkuY291bnQgLyAyLCAxLjAgLyB6b29tUmF0aW8sIGZhbHNlIC8qY2xhbXAqLywKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlXaWR0aCwgYXJyYXlIZWlnaHQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgem9vbVJhdGlvID0gMS4wOwotICAgIHJlcyA9IG1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8sICZ6b29tUmF0aW8sIDEpOworICAgIHN0YXR1c190IHJlcyA9IG1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1pPT01fUkFUSU8sICZ6b29tUmF0aW8sIDEpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC0zMTksNyArNDM2LDcgQEAKIH0KIAogdm9pZCBab29tUmF0aW9NYXBwZXI6OnNjYWxlQ29vcmRpbmF0ZXMoaW50MzJfdCogY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsCi0gICAgICAgIGZsb2F0IHNjYWxlUmF0aW8sIGJvb2wgY2xhbXApIHsKKyAgICAgICAgZmxvYXQgc2NhbGVSYXRpbywgYm9vbCBjbGFtcCwgaW50MzJfdCBhcnJheVdpZHRoLCBpbnQzMl90IGFycmF5SGVpZ2h0KSB7CiAgICAgLy8gQSBwaXhlbCdzIGNvb3JkaW5hdGUgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHBvc2l0aW9uIG9mIGl0cyB0b3AtbGVmdCBjb3JuZXIuCiAgICAgLy8gVG8gYXZvaWQgdGhlIHJvdW5kaW5nIGVycm9yLCB3ZSB1c2UgdGhlIGNvb3JkaW5hdGUgZm9yIHRoZSBjZW50ZXIgb2YgdGhlCiAgICAgLy8gcGl4ZWwgaW5zdGVhZDoKQEAgLTMzMiwxOCArNDQ5LDE4IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb29yZENvdW50ICogMjsgaSArPSAyKSB7CiAgICAgICAgIGZsb2F0IHggPSBjb29yZFBhaXJzW2ldOwogICAgICAgICBmbG9hdCB5ID0gY29vcmRQYWlyc1tpICsgMV07Ci0gICAgICAgIGZsb2F0IHhDZW50ZXJlZCA9IHggLSAobUFycmF5V2lkdGggLSAyKSAvIDI7Ci0gICAgICAgIGZsb2F0IHlDZW50ZXJlZCA9IHkgLSAobUFycmF5SGVpZ2h0IC0gMikgLyAyOworICAgICAgICBmbG9hdCB4Q2VudGVyZWQgPSB4IC0gKGFycmF5V2lkdGggLSAyKSAvIDI7CisgICAgICAgIGZsb2F0IHlDZW50ZXJlZCA9IHkgLSAoYXJyYXlIZWlnaHQgLSAyKSAvIDI7CiAgICAgICAgIGZsb2F0IHNjYWxlZFggPSB4Q2VudGVyZWQgKiBzY2FsZVJhdGlvOwogICAgICAgICBmbG9hdCBzY2FsZWRZID0geUNlbnRlcmVkICogc2NhbGVSYXRpbzsKLSAgICAgICAgc2NhbGVkWCArPSAobUFycmF5V2lkdGggLSAyKSAvIDI7Ci0gICAgICAgIHNjYWxlZFkgKz0gKG1BcnJheUhlaWdodCAtIDIpIC8gMjsKKyAgICAgICAgc2NhbGVkWCArPSAoYXJyYXlXaWR0aCAtIDIpIC8gMjsKKyAgICAgICAgc2NhbGVkWSArPSAoYXJyYXlIZWlnaHQgLSAyKSAvIDI7CiAgICAgICAgIGNvb3JkUGFpcnNbaV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihzdGQ6OnJvdW5kKHNjYWxlZFgpKTsKICAgICAgICAgY29vcmRQYWlyc1tpKzFdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RkOjpyb3VuZChzY2FsZWRZKSk7CiAgICAgICAgIC8vIENsYW1wIHRvIHdpdGhpbiBhY3RpdmVBcnJheS9wcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkKICAgICAgICAgaWYgKGNsYW1wKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHJpZ2h0ID0gbUFycmF5V2lkdGggLSAxOwotICAgICAgICAgICAgaW50MzJfdCBib3R0b20gPSBtQXJyYXlIZWlnaHQgLSAxOworICAgICAgICAgICAgaW50MzJfdCByaWdodCA9IGFycmF5V2lkdGggLSAxOworICAgICAgICAgICAgaW50MzJfdCBib3R0b20gPSBhcnJheUhlaWdodCAtIDE7CiAgICAgICAgICAgICBjb29yZFBhaXJzW2ldID0KICAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4ocmlnaHQsIHN0ZDo6bWF4KDAsIGNvb3JkUGFpcnNbaV0pKTsKICAgICAgICAgICAgIGNvb3JkUGFpcnNbaSsxXSA9CkBAIC0zNTQsNyArNDcxLDcgQEAKIH0KIAogdm9pZCBab29tUmF0aW9NYXBwZXI6OnNjYWxlUmVjdHMoaW50MzJfdCogcmVjdHMsIGludCByZWN0Q291bnQsCi0gICAgICAgIGZsb2F0IHNjYWxlUmF0aW8pIHsKKyAgICAgICAgZmxvYXQgc2NhbGVSYXRpbywgaW50MzJfdCBhcnJheVdpZHRoLCBpbnQzMl90IGFycmF5SGVpZ2h0KSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWN0Q291bnQgKiA0OyBpICs9IDQpIHsKICAgICAgICAgLy8gTWFwIGZyb20gKGwsIHQsIHdpZHRoLCBoZWlnaHQpIHRvIChsLCB0LCBsK3dpZHRoLTEsIHQraGVpZ2h0LTEpLAogICAgICAgICAvLyB3aGVyZSBib3RoIHRvcC1sZWZ0IGFuZCBib3R0b20tcmlnaHQgYXJlIGluY2x1c2l2ZS4KQEAgLTM2Niw5ICs0ODMsOSBAQAogICAgICAgICB9OwogCiAgICAgICAgIC8vIHRvcC1sZWZ0Ci0gICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLCAxLCBzY2FsZVJhdGlvLCB0cnVlIC8qY2xhbXAqLyk7CisgICAgICAgIHNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLCAxLCBzY2FsZVJhdGlvLCB0cnVlIC8qY2xhbXAqLywgYXJyYXlXaWR0aCwgYXJyYXlIZWlnaHQpOwogICAgICAgICAvLyBib3R0b20tcmlnaHQKLSAgICAgICAgc2NhbGVDb29yZGluYXRlcyhjb29yZHMrMiwgMSwgc2NhbGVSYXRpbywgdHJ1ZSAvKmNsYW1wKi8pOworICAgICAgICBzY2FsZUNvb3JkaW5hdGVzKGNvb3JkcysyLCAxLCBzY2FsZVJhdGlvLCB0cnVlIC8qY2xhbXAqLywgYXJyYXlXaWR0aCwgYXJyYXlIZWlnaHQpOwogCiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL1pvb21SYXRpb01hcHBlci5oCmluZGV4IDY5OGY4N2YuLmI3YTllNDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvWm9vbVJhdGlvTWFwcGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9ab29tUmF0aW9NYXBwZXIuaApAQCAtMzMsNyArMzMsNyBAQAogICogLSBIQUwgc3VwcG9ydHMgem9vbVJhdGlvIGFuZCB0aGUgYXBwbGljYXRpb24gdXNlcyBjcm9wUmVnaW9uLCBvcgogICogLSBIQUwgZG9lc24ndCBzdXBwb3J0IHpvb21SYXRpbywgYnV0IHRoZSBhcHBsaWNhdGlvbiB1c2VzIHpvb21SYXRpbwogICovCi1jbGFzcyBab29tUmF0aW9NYXBwZXIgOiBwcml2YXRlIENvb3JkaW5hdGVNYXBwZXIgeworY2xhc3MgWm9vbVJhdGlvTWFwcGVyIDogcHVibGljIENvb3JkaW5hdGVNYXBwZXIgewogICBwdWJsaWM6CiAgICAgWm9vbVJhdGlvTWFwcGVyKCkgPSBkZWZhdWx0OwogICAgIFpvb21SYXRpb01hcHBlcihjb25zdCBDYW1lcmFNZXRhZGF0YSAqZGV2aWNlSW5mbywKQEAgLTQxLDcgKzQxLDkgQEAKICAgICBab29tUmF0aW9NYXBwZXIoY29uc3QgWm9vbVJhdGlvTWFwcGVyJiBvdGhlcikgOgogICAgICAgICAgICAgbUhhbFN1cHBvcnRzWm9vbVJhdGlvKG90aGVyLm1IYWxTdXBwb3J0c1pvb21SYXRpbyksCiAgICAgICAgICAgICBtQXJyYXlXaWR0aChvdGhlci5tQXJyYXlXaWR0aCksIG1BcnJheUhlaWdodChvdGhlci5tQXJyYXlIZWlnaHQpLAotICAgICAgICAgICAgbUlzVmFsaWQob3RoZXIubUlzVmFsaWQpIHt9CisgICAgICAgICAgICBtSXNWYWxpZChvdGhlci5tSXNWYWxpZCkgeyBpbml0UmVtYXBwZWRLZXlzKCk7IH0KKworICAgIHZvaWQgaW5pdFJlbWFwcGVkS2V5cygpIG92ZXJyaWRlOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSByZXF1ZXN0IHRlbXBsYXRlIHdpdGggdmFsaWQgem9vbVJhdGlvIGlmIG5lY2Vzc2FyeS4KQEAgLTY2LDIyICs2OCwzMSBAQAogCiAgIHB1YmxpYzogLy8gVmlzaWJsZSBmb3IgdGVzdGluZy4gRG8gbm90IHVzZSBjb25jdXJlbnRseS4KICAgICB2b2lkIHNjYWxlQ29vcmRpbmF0ZXMoaW50MzJfdCogY29vcmRQYWlycywgaW50IGNvb3JkQ291bnQsCi0gICAgICAgICAgICBmbG9hdCBzY2FsZVJhdGlvLCBib29sIGNsYW1wKTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlUmF0aW8sIGJvb2wgY2xhbXAsIGludDMyX3QgYXJyYXlXaWR0aCwgaW50MzJfdCBhcnJheUhlaWdodCk7CiAKICAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSXNWYWxpZDsgfQogICBwcml2YXRlOgogICAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdGlvbgogICAgIGJvb2wgbUhhbFN1cHBvcnRzWm9vbVJhdGlvOwotICAgIC8vIGFjdGl2ZSBhcnJheSAvIHByZS1jb3JyZWN0aW9uIGFycmF5IGRpbWVuc2lvbgorCisgICAgLy8gYWN0aXZlIGFycmF5IC8gcHJlLWNvcnJlY3Rpb24gYXJyYXkgZGltZW5zaW9uIGZvciBkZWZhdWx0IGFuZCBtYXhpbXVtCisgICAgLy8gcmVzb2x1dGlvbiBtb2Rlcy4KICAgICBpbnQzMl90IG1BcnJheVdpZHRoLCBtQXJyYXlIZWlnaHQ7CisgICAgaW50MzJfdCBtQXJyYXlXaWR0aE1heGltdW1SZXNvbHV0aW9uLCBtQXJyYXlIZWlnaHRNYXhpbXVtUmVzb2x1dGlvbjsKIAogICAgIGJvb2wgbUlzVmFsaWQgPSBmYWxzZTsKIAotICAgIGZsb2F0IGRlcml2ZVpvb21SYXRpbyhjb25zdCBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpOwotICAgIHZvaWQgc2NhbGVSZWN0cyhpbnQzMl90KiByZWN0cywgaW50IHJlY3RDb3VudCwgZmxvYXQgc2NhbGVSYXRpbyk7CisgICAgc3RhdHVzX3QgZGVyaXZlWm9vbVJhdGlvKGNvbnN0IENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSwgZmxvYXQgKnpvb21SYXRpbywgaW50IGFycmF5V2lkdGgsCisgICAgICAgICAgICBpbnQgYXJyYXlIZWlnaHQpOworICAgIHZvaWQgc2NhbGVSZWN0cyhpbnQzMl90KiByZWN0cywgaW50IHJlY3RDb3VudCwgZmxvYXQgc2NhbGVSYXRpbywgaW50MzJfdCBhcnJheVdpZHRoLAorICAgICAgICAgICAgaW50MzJfdCBhcnJheUhlaWdodCk7CiAKLSAgICBzdGF0dXNfdCBzZXBhcmF0ZVpvb21Gcm9tQ3JvcExvY2tlZChDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIGJvb2wgaXNSZXN1bHQpOwotICAgIHN0YXR1c190IGNvbWJpbmVab29tQW5kQ3JvcExvY2tlZChDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIGJvb2wgaXNSZXN1bHQpOworICAgIHN0YXR1c190IHNlcGFyYXRlWm9vbUZyb21Dcm9wTG9ja2VkKENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSwgYm9vbCBpc1Jlc3VsdCwgaW50IGFycmF5V2lkdGgsCisgICAgICAgICAgICBpbnQgYXJyYXlIZWlnaHQpOworICAgIHN0YXR1c190IGNvbWJpbmVab29tQW5kQ3JvcExvY2tlZChDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIGJvb2wgaXNSZXN1bHQsIGludCBhcnJheVdpZHRoLAorICAgICAgICAgICAgaW50IGFycmF5SGVpZ2h0KTsKKyAgICBzdGF0dXNfdCBnZXRBcnJheURpbWVuc2lvbnNUb0JlVXNlZChjb25zdCBDYW1lcmFNZXRhZGF0YSAqc2V0dGluZ3MsIGludDMyX3QgKmFycmF5V2lkdGgsCisgICAgICAgICAgICBpbnQzMl90ICphcnJheUhlaWdodCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWEwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19jYW1lcmFfbGliY2FtZXJhc2VydmljZV9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsKKyAgICAgICAgImZyYW1ld29ya3NfYXZfc2VydmljZXNfY2FtZXJhX2xpYmNhbWVyYXNlcnZpY2VfbGljZW5zZSIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlX2Z1enpfZGVmYXVsdHMiLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNvbXBvbmVudGlkOiA0MTcyNworICAgIH0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJjYW1lcmFzZXJ2aWNlX2Rpc3RvcnRpb25fbWFwcGVyX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibGliY2FtZXJhc2VydmljZV9mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2VfZGVwdGhfcHJvY2Vzc29yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibGliY2FtZXJhc2VydmljZV9mdXp6X2RlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICBdLAorICAgIGNvcnB1czogWyJjb3JwdXMvKi5qcGciXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EZXB0aFByb2Nlc3NvckZ1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGNhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGVwdGhQcm9jZXNzb3JGdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorCisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlcldpZHRoID0gNjQwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJEZXB0aFNpemUgKGtUZXN0QnVmZmVyV2lkdGggKiBrVGVzdEJ1ZmZlckhlaWdodCk7CisKK3ZvaWQgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplLCBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gKmRlcHRoMTZCdWZmZXIgLypvdXQqLykgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXB0aDE2QnVmZmVyLT5zaXplKCk7IGkrKykgeworICAgICAgICAoKmRlcHRoMTZCdWZmZXIpW2ldID0gZGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aW50MTZfdD4oKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworCisgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKGRhdGEsIHNpemUsICZkZXB0aDE2QnVmZmVyKTsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGRhdGEpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IHNpemU7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBwcm9jZXNzRGVwdGhQaG90b0ZyYW1lKAorICAgICAgICBpbnB1dEZyYW1lLAorICAgICAgICBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwKKyAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvRGlzdG9ydGlvbk1hcHBlckZ1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlYzg1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9EaXN0b3J0aW9uTWFwcGVyRnV6emVyLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKworI2luY2x1ZGUgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5oIgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwordXNpbmcgRGlzdG9ydGlvbk1hcHBlckluZm8gPSBhbmRyb2lkOjpjYW1lcmEzOjpEaXN0b3J0aW9uTWFwcGVyOjpEaXN0b3J0aW9uTWFwcGVySW5mbzsKKworaW50MzJfdCB0ZXN0QWN0aXZlQXJyYXlbXSA9IHsxMDAsIDEwMCwgMTAwMCwgNzUwfTsKK2Zsb2F0IHRlc3RJQ2FsW10gPSB7IDEwMDAuZiwgMTAwMC5mLCA1MDAuZiwgNTAwLmYsIDAuZiB9OworZmxvYXQgaWRlbnRpdHlEaXN0b3J0aW9uW10gPSB7IDAuZiwgMC5mLCAwLmYsIDAuZiwgMC5mfTsKKwordm9pZCBzZXR1cFRlc3RNYXBwZXIoRGlzdG9ydGlvbk1hcHBlciAqbSwKKyAgICAgICAgZmxvYXQgZGlzdG9ydGlvbls1XSwgZmxvYXQgaW50cmluc2ljc1s1XSwKKyAgICAgICAgaW50MzJfdCBhY3RpdmVBcnJheVs0XSwgaW50MzJfdCBwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXlbNF0pIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBkZXZpY2VJbmZvOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSwKKyAgICAgICAgICAgIHByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSwgNCk7CisKKyAgICBkZXZpY2VJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFLAorICAgICAgICAgICAgYWN0aXZlQXJyYXksIDQpOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTiwKKyAgICAgICAgICAgIGludHJpbnNpY3MsIDUpOworCisgICAgZGV2aWNlSW5mby51cGRhdGUoQU5EUk9JRF9MRU5TX0RJU1RPUlRJT04sCisgICAgICAgICAgICBkaXN0b3J0aW9uLCA1KTsKKworICAgIG0tPnNldHVwU3RhdGljSW5mbyhkZXZpY2VJbmZvKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAoZGF0YSwgc2l6ZSk7CisKKyAgICBEaXN0b3J0aW9uTWFwcGVyIG07CisgICAgc2V0dXBUZXN0TWFwcGVyKCZtLCBpZGVudGl0eURpc3RvcnRpb24sIHRlc3RJQ2FsLAorICAgICAgICAvKmFjdGl2ZUFycmF5Ki8gdGVzdEFjdGl2ZUFycmF5LAorICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIHRlc3RBY3RpdmVBcnJheSk7CisKKyAgICBib29sIGNsYW1wID0gZmRwLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBzaW1wbGUgPSBmZHAuQ29uc3VtZUJvb2woKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnB1dDsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGZkcC5yZW1haW5pbmdfYnl0ZXMoKSA+IDA7IGluZGV4KyspIHsKKyAgICAgICAgaW5wdXQucHVzaF9iYWNrKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgfQorICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvID0gbS5nZXRNYXBwZXJJbmZvKCk7CisgICAgLy8gVGhlIHNpemUgYXJndW1lbnQgY291bnRzIGhvdyBtYW55IGNvb3JkaW5hdGUgcGFpcnMgdGhlcmUgYXJlLCBzbworICAgIC8vIGl0IGlzIGV4cGVjdGVkIHRvIGJlIDEvMiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQuCisgICAgbS5tYXBDb3JyZWN0ZWRUb1JhdyhpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKS8yLCAgbWFwcGVySW5mbywgY2xhbXAsIHNpbXBsZSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvQ2Fub25fTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvQ2Fub25fTWFrZXJOb3RlX3ZhcmlhbnRfdHlwZV8xLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWIzN2QwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9DYW5vbl9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvRnVqaV9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9GdWppX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlMDM3MQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvRnVqaV9NYWtlck5vdGVfdmFyaWFudF90eXBlXzEuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxZDYxMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0OThlMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzUuanBnIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZnV6emVyL2NvcnB1cy9PbHltcHVzX01ha2VyTm90ZV92YXJpYW50X3R5cGVfNS5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4M2Y3NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvT2x5bXB1c19NYWtlck5vdGVfdmFyaWFudF90eXBlXzUuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMi5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjBlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzIuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfMy5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2I4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzMuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2Z1enplci9jb3JwdXMvUGVudGF4X01ha2VyTm90ZV92YXJpYW50X3R5cGVfNC5qcGcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5N2VhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9mdXp6ZXIvY29ycHVzL1BlbnRheF9NYWtlck5vdGVfdmFyaWFudF90eXBlXzQuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKaW5kZXggYmY4OWNhNS4uMjUwOWU2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBmcmFtZXdvcmtzIHsKIG5hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKIG5hbWVzcGFjZSBkZXZpY2UgewotbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIFYyXzEgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAogdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcmlhbGx5IGJ5IHRoZSBjbGllbnQgaWYgaXQgZGVjaWRlcyB0bwogICAgICAgICAvLyB1c2UgZm1xLgogICAgICAgICBpZiAoZS5zZXR0aW5ncy5nZXREaXNjcmltaW5hdG9yKCkgPT0KLSAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICAgICAgVjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6Zm1xTWV0YWRhdGFTaXplKSB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEdldCBzZXR0aW5ncyBmcm9tIHRoZSBmbXEuCiAgICAgICAgICAgICAgKi8KQEAgLTE5Niw2ICsxOTYsMTIgQEAKIAogUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKSB7CisgICAgcmV0dXJuIGVuZENvbmZpZ3VyZV8yXzEob3BlcmF0aW5nTW9kZSwgc2Vzc2lvblBhcmFtcywgc3lzdGVtVGltZSgpKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmVfMl8xKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnMpIHsKICAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKICAgICBpZiAoIWNvbnZlcnRGcm9tSGlkbChzZXNzaW9uUGFyYW1zLCAmY2FtZXJhTWV0YWRhdGEpKSB7CiAgICAgICAgIHJldHVybiBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOwpAQCAtMjAzLDcgKzIwOSw4IEBACiAKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IG9mZmxpbmVTdHJlYW1JZHM7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZW5kQ29uZmlndXJlKGNvbnZlcnRGcm9tSGlkbChvcGVyYXRpbmdNb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWV0YWRhdGEsICZvZmZsaW5lU3RyZWFtSWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWV0YWRhdGEsIG5zMm1zKHN0YXJ0VGltZU5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZmxpbmVTdHJlYW1JZHMpOwogICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCmluZGV4IGMzYTgwZmUuLjBlMmFiM2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMS9JQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KQEAgLTM2LDcgKzM3LDcgQEAKIG5hbWVzcGFjZSBmcmFtZXdvcmtzIHsKIG5hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKIG5hbWVzcGFjZSBkZXZpY2UgewotbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIFYyXzEgewogbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKIAogdXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKQEAgLTUwLDcgKzUxLDcgQEAKIHVzaW5nIENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKIHVzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CiAKLXVzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VVc2VyID0gZGV2aWNlOjpWMl8xOjpJQ2FtZXJhRGV2aWNlVXNlcjsKIHVzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwogdXNpbmcgSENhcHR1cmVSZXF1ZXN0ID0gZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdDsKIHVzaW5nIEhTZXNzaW9uQ29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CkBAIC04Myw2ICs4NCwxMCBAQAogICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBvcGVyYXRpbmdNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmVfMl8xKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN0YXJ0VGltZU5zKTsKKwogICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggYTQ2MTMzZS4uN2QxYjNjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKIHVzaW5nIGhhcmR3YXJlOjpWb2lkOwogCiB1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M7Ci11c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIGRldmljZTo6VjJfMTo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFEZXZpY2VVc2VyOwogdXNpbmcgc2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKIHVzaW5nIEhDYW1lcmFNZXRhZGF0YVR5cGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OkNhbWVyYU1ldGFkYXRhVHlwZTsKIHVzaW5nIEhWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKQEAgLTU5LDcgKzU5LDggQEAKICAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKICAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOwogICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQotICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksICZjYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qL19fQU5EUk9JRF9BUElfRlVUVVJFX18sICZjYW1lcmFNZXRhZGF0YSk7CiAgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKICAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CiAgICAgICAgIHN3aXRjaChzZXJ2aWNlUmV0LnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpKSB7CkBAIC0xMDMsOCArMTA0LDkgQEAKICAgICB9CiAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGh5YnJpZENhbGxiYWNrczsKICAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZSgKLSAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAotICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIC8qb3V0Ki8mZGV2aWNlUmVtb3RlKTsKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwge30sCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgMC8qb29tU2NvcmVPZmZzZXQqLywKKyAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCmluZGV4IDA5N2Y0YzUuLjg2YTdjZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjEvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMi9JQ2FtZXJhU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgogCkBAIC00Miw3ICs0Miw3IEBACiAKIHVzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwogdXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Ci11c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzE6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgSENhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8yOjpJQ2FtZXJhU2VydmljZTsKIHVzaW5nIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwogdXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lcjJfMSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzE6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CiB1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc0ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfc2VydmljZXNfY2FtZXJhX2xpYmNhbWVyYXNlcnZpY2VfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX2NhbWVyYV9saWJjYW1lcmFzZXJ2aWNlX2xpY2Vuc2UiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJjYW1lcmFfc2VydmljZV9mdXp6ZXIiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjUiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi42IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy43IiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL1JFQURNRS5tZCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAzODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvbGliY2FtZXJhc2VydmljZV9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTkgQEAKKyMgRnV6emVyIGZvciBsaWJjYW1lcmFzZXJ2aWNlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZQorbGlicmFyeSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitsaWJjYW1lcmFzZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIENhbWVyYSBUeXBlIChwYXJhbWV0ZXIgbmFtZTogYGNhbWVyYVR5cGVgKQorMi4gQ2FtZXJhIEFQSSBWZXJzaW9uIChwYXJhbWV0ZXIgbmFtZTogYGNhbWVyYUFQSVZlcnNpb25gKQorMy4gRXZlbnQgSUQgKHBhcmFtZXRlciBuYW1lOiBgZXZlbnRJZGApCis0LiBDYW1lcmEgU291bmQgS2luZCAocGFyYW1ldGVyIG5hbWU6IGBzb3VuZEtpbmRgKQorNS4gU2hlbGwgQ29tbWFuZCAocGFyYW1ldGVyIG5hbWU6IGBzaGVsbENvbW1hbmRgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYGNhbWVyYVR5cGVgIHwgMC4gYENBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEVgIDEuIGBDQU1FUkFfVFlQRV9BTExgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgY2FtZXJhQVBJVmVyc2lvbmAgfCAgMC4gYEFQSV9WRVJTSU9OXzFgIDEuIGBBUElfVkVSU0lPTl8yYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGV2ZW50SWRgIHwgIDAuIGBFVkVOVF9VU0VSX1NXSVRDSEVEYCAxLiBgRVZFTlRfTk9ORWAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzb3VuZEtpbmRgIHwgIDAuIGBTT1VORF9TSFVUVEVSYCAxLiBgU09VTkRfUkVDT1JESU5HX1NUQVJUYCAyLiBgU09VTkRfUkVDT1JESU5HX1NUT1BgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBzaGVsbENvbW1hbmRgIHwgIDAuIGBzZXQtdWlkLXN0YXRlYCAxLiBgcmVzZXQtdWlkLXN0YXRlYCAyLiBgZ2V0LXVpZC1zdGF0ZWAgMy4gYHNldC1yb3RhdGUtYW5kLWNyb3BgIDQuIGBnZXQtcm90YXRlLWFuZC1jcm9wYCA1LiBgaGVscGB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gdG9sZXJhdGVzIGFueSBraW5kIG9mIGlucHV0IChlbXB0eSwgaHVnZSwKK21hbGZvcm1lZCwgZXRjKSBhbmQgZG9lc24ndCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGNhbWVyYV9zZXJ2aWNlX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgY2FtZXJhX3NlcnZpY2VfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSCitgYGAKKyAgJCBhZGIgc2hlbGwgbWtkaXIgQ09SUFVTX0RJUgorYGBgCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9jYW1lcmFfc2VydmljZV9mdXp6ZXIvY2FtZXJhX3NlcnZpY2VfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2xpYmNhbWVyYXNlcnZpY2VfZnV6emVyL2NhbWVyYV9zZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmJmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9saWJjYW1lcmFzZXJ2aWNlX2Z1enplci9jYW1lcmFfc2VydmljZV9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNjAwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2aWNlRnV6emVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGRldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NvbnN0IGludDMyX3Qga1ByZXZpZXdUaHJlc2hvbGQgPSA4OworY29uc3QgaW50MzJfdCBrTnVtUmVxdWVzdHNUZXN0ZWQgPSA4OworY29uc3QgbnNlY3NfdCBrUHJldmlld1RpbWVvdXQgPSA1MDAwMDAwMDAwOyAgLy8gLjUgW3MuXQorY29uc3QgbnNlY3NfdCBrRXZlbnRUaW1lb3V0ID0gMTAwMDAwMDAwMDA7ICAgLy8gMSBbcy5dCitjb25zdCBzaXplX3Qga01heE51bUxpbmVzID0gVVNIUlRfTUFYOworY29uc3Qgc2l6ZV90IGtNaW5BcmdzID0gMTsKK2NvbnN0IHNpemVfdCBrTWF4QXJncyA9IDU7Citjb25zdCBpbnQzMl90IGtDYW1UeXBlW10gPSB7aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMfTsKK2NvbnN0IGludCBrQ2FtZXJhQXBpVmVyc2lvbltdID0ge2FuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OkFQSV9WRVJTSU9OXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yfTsKK2NvbnN0IHVpbnQ4X3Qga1NlbnNvclBpeGVsTW9kZXNbXSA9IHtBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQsCisgICAgICAgIEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OfTsKK2NvbnN0IGludDMyX3Qga1JlcXVlc3RUZW1wbGF0ZXNbXSA9IHsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1BSRVZJRVcsCisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9TVElMTF9DQVBUVVJFLAorICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUkVDT1JELAorICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfVklERU9fU05BUFNIT1QsCisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9NQU5VQUwsCisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHCit9OworCitjb25zdCBpbnQzMl90IGtSb3RhdGlvbnNbXSA9IHsKKyAgICBjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzAsCisgICAgY2FtZXJhMzo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl85MCwKKyAgICBjYW1lcmEzOjpDQU1FUkFfU1RSRUFNX1JPVEFUSU9OXzI3MAorfTsKKworY29uc3QgaW50IGtMYXllck1ldGFkYXRhW10gPSB7CisgICAgMHgwMDEwMDAwMCAvKkdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUKi8sIDB4MDAwMDAwMDMgLypHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4qLywKKyAgICAweDAwMDAwMTAwIC8qR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKi8sICAgMHgwMDAwMDgwMCAvKkdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIqLywKKyAgICAweDAwMDAwMjAwIC8qR1JBTExPQ19VU0FHRV9IV19SRU5ERVIqLywgICAgMHgwMDAxMDAwMCAvKkdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiovfTsKK2NvbnN0IGludCBrQ2FtZXJhTXNnW10gPSB7MHgwMDEgLypDQU1FUkFfTVNHX0VSUk9SKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyIC8qQ0FNRVJBX01TR19TSFVUVEVSKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0IC8qQ0FNRVJBX01TR19GT0NVUyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwOCAvKkNBTUVSQV9NU0dfWk9PTSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMCAvKkNBTUVSQV9NU0dfUFJFVklFV19GUkFNRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMCAvKkNBTUVSQV9NU0dfVklERU9fRlJBTUUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwIC8qQ0FNRVJBX01TR19QT1NUVklFV19GUkFNRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MCAvKkNBTUVSQV9NU0dfUkFXX0lNQUdFICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMCAvKkNBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMCAvKkNBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMCAvKkNBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMCAvKkNBTUVSQV9NU0dfRk9DVVNfTU9WRSovfTsKK2NvbnN0IGludDMyX3Qga0V2ZW50SWRbXSA9IHtJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNFUl9TV0lUQ0hFRCwgSUNhbWVyYVNlcnZpY2U6OkVWRU5UX05PTkV9OworY29uc3QgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6c291bmRfa2luZCBrU291bmRLaW5kW10gPSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUiwgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6U09VTkRfUkVDT1JESU5HX1NUQVJULAorICAgIGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2U6OlNPVU5EX1JFQ09SRElOR19TVE9QfTsKK2NvbnN0IFN0cmluZzE2IGtTaGVsbENtZFtdID0ge1N0cmluZzE2KCJzZXQtdWlkLXN0YXRlIiksICAgICAgIFN0cmluZzE2KCJyZXNldC11aWQtc3RhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIiksICAgICAgIFN0cmluZzE2KCJzZXQtcm90YXRlLWFuZC1jcm9wIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiZ2V0LXJvdGF0ZS1hbmQtY3JvcCIpLCBTdHJpbmcxNigiaGVscCIpfTsKK2NvbnN0IHNpemVfdCBrTnVtTGF5ZXJNZXRhRGF0YSA9IHNpemUoa0xheWVyTWV0YWRhdGEpOworY29uc3Qgc2l6ZV90IGtOdW1DYW1lcmFNc2cgPSBzaXplKGtDYW1lcmFNc2cpOworY29uc3Qgc2l6ZV90IGtOdW1Tb3VuZEtpbmQgPSBzaXplKGtTb3VuZEtpbmQpOworY29uc3Qgc2l6ZV90IGtOdW1TaGVsbENtZCA9IHNpemUoa1NoZWxsQ21kKTsKKworY2xhc3MgQ2FtZXJhRnV6emVyIDogcHVibGljIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkJuQ2FtZXJhQ2xpZW50IHsKKyAgIHB1YmxpYzoKKyAgICBDYW1lcmFGdXp6ZXIoc3A8Q2FtZXJhU2VydmljZT4gY3MsIHN0ZDo6c2hhcmVkX3B0cjxGdXp6ZWREYXRhUHJvdmlkZXI+IGZwKSA6CisgICAgICAgICAgbUNhbWVyYVNlcnZpY2UoY3MpLCBtRnV6emVkRGF0YVByb3ZpZGVyKGZwKSB7fTsKKyAgICB+Q2FtZXJhRnV6emVyKCkgeyBkZUluaXQoKTsgfQorICAgIHZvaWQgcHJvY2VzcygpOworICAgIHZvaWQgZGVJbml0KCk7CisKKyAgIHByaXZhdGU6CisgICAgc3A8Q2FtZXJhU2VydmljZT4gbUNhbWVyYVNlcnZpY2UgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxGdXp6ZWREYXRhUHJvdmlkZXI+IG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBudWxscHRyOworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNvbXBvc2VyQ2xpZW50ID0gbnVsbHB0cjsKKyAgICBpbnQzMl90IG1OdW1DYW1lcmFzID0gMDsKKyAgICBzaXplX3QgbVByZXZpZXdCdWZmZXJDb3VudCA9IDA7CisgICAgYm9vbCBtQXV0b0ZvY3VzTWVzc2FnZSA9IGZhbHNlOworICAgIGJvb2wgbVNuYXBzaG90Tm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgbXV0YWJsZSBNdXRleCBtUHJldmlld0xvY2s7CisgICAgbXV0YWJsZSBDb25kaXRpb24gbVByZXZpZXdDb25kaXRpb247CisgICAgbXV0YWJsZSBNdXRleCBtQXV0b0ZvY3VzTG9jazsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtQXV0b0ZvY3VzQ29uZGl0aW9uOworICAgIG11dGFibGUgTXV0ZXggbVNuYXBzaG90TG9jazsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiBtU25hcHNob3RDb25kaXRpb247CisKKyAgICB2b2lkIGdldE51bUNhbWVyYXMoKTsKKyAgICB2b2lkIGdldENhbWVyYUluZm9ybWF0aW9uKGludDMyX3QgY2FtZXJhSWQpOworICAgIHZvaWQgaW52b2tlQ2FtZXJhQVBJcygpOworICAgIHZvaWQgaW52b2tlQ2FtZXJhU291bmQoKTsKKyAgICB2b2lkIGludm9rZUR1bXAoKTsKKyAgICB2b2lkIGludm9rZVNoZWxsQ29tbWFuZCgpOworICAgIHZvaWQgaW52b2tlTm90aWZ5Q2FsbHMoKTsKKworICAgIC8vIENhbWVyYUNsaWVudCBpbnRlcmZhY2UKKyAgICB2b2lkIG5vdGlmeUNhbGxiYWNrKGludDMyX3QgbXNnVHlwZSwgaW50MzJfdCwgaW50MzJfdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmLCBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqKSBvdmVycmlkZTsKKyAgICB2b2lkIGRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190LCBpbnQzMl90LCBjb25zdCBzcDxJTWVtb3J5PiAmKSBvdmVycmlkZXt9OworICAgIHZvaWQgcmVjb3JkaW5nRnJhbWVIYW5kbGVDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190LCBuYXRpdmVfaGFuZGxlX3QgKikgb3ZlcnJpZGV7fTsKKyAgICB2b2lkIHJlY29yZGluZ0ZyYW1lSGFuZGxlQ2FsbGJhY2tUaW1lc3RhbXBCYXRjaCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8bnNlY3NfdD4gJiwgY29uc3Qgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+ICYpIG92ZXJyaWRle307CisgICAgc3RhdHVzX3Qgd2FpdEZvclByZXZpZXdTdGFydCgpOworICAgIHN0YXR1c190IHdhaXRGb3JFdmVudChNdXRleCAmbXV0ZXgsIENvbmRpdGlvbiAmY29uZGl0aW9uLCBib29sICZmbGFnKTsKK307CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjpub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QsIGludDMyX3QpIHsKKyAgICBpZiAoQ0FNRVJBX01TR19GT0NVUyA9PSBtc2dUeXBlKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1BdXRvRm9jdXNMb2NrKTsKKyAgICAgICAgbUF1dG9Gb2N1c01lc3NhZ2UgPSB0cnVlOworICAgICAgICBtQXV0b0ZvY3VzQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIH0KK307CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjpkYXRhQ2FsbGJhY2soaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmIC8qZGF0YSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqKSB7CisgICAgc3dpdGNoIChtc2dUeXBlKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FOiB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUHJldmlld0xvY2spOworICAgICAgICAgICAgKyttUHJldmlld0J1ZmZlckNvdW50OworICAgICAgICAgICAgbVByZXZpZXdDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRTogeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNuYXBzaG90TG9jayk7CisgICAgICAgICAgICBtU25hcHNob3ROb3RpZmljYXRpb24gPSB0cnVlOworICAgICAgICAgICAgbVNuYXBzaG90Q29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK307CisKK3N0YXR1c190IENhbWVyYUZ1enplcjo6d2FpdEZvclByZXZpZXdTdGFydCgpIHsKKyAgICBzdGF0dXNfdCByYyA9IE5PX0VSUk9SOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1QcmV2aWV3TG9jayk7CisgICAgbVByZXZpZXdCdWZmZXJDb3VudCA9IDA7CisKKyAgICB3aGlsZSAobVByZXZpZXdCdWZmZXJDb3VudCA8IGtQcmV2aWV3VGhyZXNob2xkKSB7CisgICAgICAgIHJjID0gbVByZXZpZXdDb25kaXRpb24ud2FpdFJlbGF0aXZlKG1QcmV2aWV3TG9jaywga1ByZXZpZXdUaW1lb3V0KTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRnV6emVyOjp3YWl0Rm9yRXZlbnQoTXV0ZXggJm11dGV4LCBDb25kaXRpb24gJmNvbmRpdGlvbiwgYm9vbCAmZmxhZykgeworICAgIHN0YXR1c190IHJjID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobXV0ZXgpOworICAgIGZsYWcgPSBmYWxzZTsKKworICAgIHdoaWxlICghZmxhZykgeworICAgICAgICByYyA9IGNvbmRpdGlvbi53YWl0UmVsYXRpdmUobXV0ZXgsIGtFdmVudFRpbWVvdXQpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIENhbWVyYUZ1enplcjo6ZGVJbml0KCkgeworICAgIGlmIChtQ29tcG9zZXJDbGllbnQpIHsKKyAgICAgICAgbUNvbXBvc2VyQ2xpZW50LT5kaXNwb3NlKCk7CisgICAgfQorfQorCit2b2lkIENhbWVyYUZ1enplcjo6Z2V0TnVtQ2FtZXJhcygpIHsKKyAgICBib29sIHNob3VsZFBhc3NJbnZhbGlkQ2FtVHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgaW50MzJfdCBjYW1UeXBlOworICAgIGlmIChzaG91bGRQYXNzSW52YWxpZENhbVR5cGUpIHsKKyAgICAgICAgY2FtVHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbVR5cGUgPSBrQ2FtVHlwZVttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpXTsKKyAgICB9CisgICAgbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcyhjYW1UeXBlLCAmbU51bUNhbWVyYXMpOworfQorCit2b2lkIENhbWVyYUZ1enplcjo6Z2V0Q2FtZXJhSW5mb3JtYXRpb24oaW50MzJfdCBjYW1lcmFJZCkgeworICAgIFN0cmluZzE2IGNhbWVyYUlkU3RyID0gU3RyaW5nMTYoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSk7CisgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIG1DYW1lcmFTZXJ2aWNlLT5zdXBwb3J0c0NhbWVyYUFwaSgKKyAgICAgICAgY2FtZXJhSWRTdHIsIGtDYW1lcmFBcGlWZXJzaW9uW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCldLCAmaXNTdXBwb3J0ZWQpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5pc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNhbWVyYUlkU3RyLCAmaXNTdXBwb3J0ZWQpOworCisgICAgU3RyaW5nMTYgcGFyYW1ldGVyczsKKyAgICBtQ2FtZXJhU2VydmljZS0+Z2V0TGVnYWN5UGFyYW1ldGVycyhjYW1lcmFJZCwgJnBhcmFtZXRlcnMpOworCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpDb25jdXJyZW50Q2FtZXJhSWRDb21iaW5hdGlvbj4gY29uY3VycmVudENhbWVyYUlkczsKKyAgICBtQ2FtZXJhU2VydmljZS0+Z2V0Q29uY3VycmVudENhbWVyYUlkcygmY29uY3VycmVudENhbWVyYUlkcyk7CisKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUgY2FjaGU7CisgICAgbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYVZlbmRvclRhZ0NhY2hlKCZjYWNoZSk7CisKKyAgICBDYW1lcmFJbmZvIGNhbWVyYUluZm87CisgICAgbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUluZm8oY2FtZXJhSWQsICZjYW1lcmFJbmZvKTsKKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgIG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAvKnRhcmdldFNka1ZlcnNpb24qL19fQU5EUk9JRF9BUElfRlVUVVJFX18sICZtZXRhZGF0YSk7Cit9CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjppbnZva2VDYW1lcmFTb3VuZCgpIHsKKyAgICBtQ2FtZXJhU2VydmljZS0+aW5jcmVhc2VTb3VuZFJlZigpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5kZWNyZWFzZVNvdW5kUmVmKCk7CisgICAgYm9vbCBzaG91bGRQYXNzSW52YWxpZFBsYXlTb3VuZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBzaG91bGRQYXNzSW52YWxpZExvY2tTb3VuZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6c291bmRfa2luZCBwbGF5U291bmQsIGxvY2tTb3VuZDsKKyAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRQbGF5U291bmQpIHsKKyAgICAgICAgcGxheVNvdW5kID0gc3RhdGljX2Nhc3Q8YW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6c291bmRfa2luZD4oCisgICAgICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwbGF5U291bmQgPQorICAgICAgICAgICAga1NvdW5kS2luZFttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bVNvdW5kS2luZCAtIDEpXTsKKyAgICB9CisKKyAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRMb2NrU291bmQpIHsKKyAgICAgICAgbG9ja1NvdW5kID0gc3RhdGljX2Nhc3Q8YW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6c291bmRfa2luZD4oCisgICAgICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8c2l6ZV90PigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2NrU291bmQgPQorICAgICAgICAgICAga1NvdW5kS2luZFttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga051bVNvdW5kS2luZCAtIDEpXTsKKyAgICB9CisgICAgbUNhbWVyYVNlcnZpY2UtPnBsYXlTb3VuZChwbGF5U291bmQpOworICAgIG1DYW1lcmFTZXJ2aWNlLT5sb2FkU291bmRMb2NrZWQobG9ja1NvdW5kKTsKK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6Omludm9rZUR1bXAoKSB7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHNpemVfdCBudW1iZXJPZkxpbmVzID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIGtNYXhOdW1MaW5lcyk7CisgICAgZm9yIChzaXplX3QgbGluZUlkeCA9IDA7IGxpbmVJZHggPCBudW1iZXJPZkxpbmVzOyArK2xpbmVJZHgpIHsKKyAgICAgICAgYXJncy5hZGQoc3RhdGljX2Nhc3Q8U3RyaW5nMTY+KG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gImxvZ0R1bXBGaWxlIjsKKyAgICBpbnQgZmQgPSBtZW1mZF9jcmVhdGUoZmlsZU5hbWUsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+ZHVtcChmZCwgYXJncyk7CisgICAgY2xvc2UoZmQpOworfQorCit2b2lkIENhbWVyYUZ1enplcjo6aW52b2tlU2hlbGxDb21tYW5kKCkgeworICAgIGludCBpbiA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgaW50IG91dCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgaW50IGVyciA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHNpemVfdCBudW1BcmdzID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KGtNaW5BcmdzLCBrTWF4QXJncyk7CisgICAgZm9yIChzaXplX3QgYXJnc0lkeCA9IDA7IGFyZ3NJZHggPCBudW1BcmdzOyArK2FyZ3NJZHgpIHsKKyAgICAgICAgYm9vbCBzaG91bGRQYXNzSW52YWxpZENvbW1hbmQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpOworICAgICAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRDb21tYW5kKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxTdHJpbmcxNj4obUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKGtTaGVsbENtZFttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oCisgICAgICAgICAgICAgICAgMCwga051bVNoZWxsQ21kIC0gMSldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2FtZXJhU2VydmljZS0+c2hlbGxDb21tYW5kKGluLCBvdXQsIGVyciwgYXJncyk7Cit9CisKK3ZvaWQgQ2FtZXJhRnV6emVyOjppbnZva2VOb3RpZnlDYWxscygpIHsKKyAgICBtQ2FtZXJhU2VydmljZS0+bm90aWZ5TW9uaXRvcmVkVWlkcygpOworICAgIGludDY0X3QgbmV3U3RhdGUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICBtQ2FtZXJhU2VydmljZS0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3U3RhdGUpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGFyZ3M7CisgICAgc2l6ZV90IG51bUFyZ3MgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa01pbkFyZ3MsIGtNYXhBcmdzKTsKKyAgICBmb3IgKHNpemVfdCBhcmdzSWR4ID0gMDsgYXJnc0lkeCA8IG51bUFyZ3M7ICsrYXJnc0lkeCkgeworICAgICAgICBhcmdzLnB1c2hfYmFjayhtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgfQorICAgIGJvb2wgc2hvdWxkUGFzc0ludmFsaWRFdmVudCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgaW50MzJfdCBldmVudElkOworICAgIGlmIChzaG91bGRQYXNzSW52YWxpZEV2ZW50KSB7CisgICAgICAgIGV2ZW50SWQgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICB9IGVsc2UgeworICAgICAgICBldmVudElkID0ga0V2ZW50SWRbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKV07CisgICAgfQorICAgIG1DYW1lcmFTZXJ2aWNlLT5ub3RpZnlTeXN0ZW1FdmVudChldmVudElkLCBhcmdzKTsKK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6Omludm9rZUNhbWVyYUFQSXMoKSB7CisgICAgZm9yIChpbnQzMl90IGNhbWVyYUlkID0gMDsgY2FtZXJhSWQgPCBtTnVtQ2FtZXJhczsgKytjYW1lcmFJZCkgeworICAgICAgICBnZXRDYW1lcmFJbmZvcm1hdGlvbihjYW1lcmFJZCk7CisKKyAgICAgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyByYzsKKyAgICAgICAgc3A8SUNhbWVyYT4gY2FtZXJhRGV2aWNlOworCisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmNvbm5lY3QodGhpcywgY2FtZXJhSWQsIFN0cmluZzE2KCksCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19QSUQsCisgICAgICAgICAgICAgICAgLyp0YXJnZXRTZGtWZXJzaW9uKi9fX0FORFJPSURfQVBJX0ZVVFVSRV9fLCAmY2FtZXJhRGV2aWNlKTsKKyAgICAgICAgaWYgKCFyYy5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIGNhbWVyYSBub3QgY29ubmVjdGVkCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhbWVyYURldmljZSkgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gcHJldmlld1N1cmZhY2U7CisgICAgICAgICAgICBzcDxTdXJmYWNlQ29udHJvbD4gc3VyZmFjZUNvbnRyb2w7CisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhjYW1lcmFEZXZpY2UtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICBTdHJpbmc4IGZvY3VzTW9kZXMocGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZPQ1VTX01PREVTKSk7CisgICAgICAgICAgICBib29sIGlzQUZTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvY3VzTW9kZSA9IG51bGxwdHI7CisKKyAgICAgICAgICAgIGlmIChmb2N1c01vZGVzLmNvbnRhaW5zKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfQVVUTykpIHsKKyAgICAgICAgICAgICAgICBpc0FGU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNNb2Rlcy5jb250YWlucyhDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNfUElDVFVSRSkpIHsKKyAgICAgICAgICAgICAgICBpc0FGU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb2N1c01vZGUgPSBDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNfUElDVFVSRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9jdXNNb2Rlcy5jb250YWlucyhDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX0NPTlRJTlVPVVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgaXNBRlN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9jdXNNb2RlID0gQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9DT05USU5VT1VTX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c01vZGVzLmNvbnRhaW5zKENhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX01PREVfTUFDUk8pKSB7CisgICAgICAgICAgICAgICAgaXNBRlN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9jdXNNb2RlID0gQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERV9NQUNSTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudWxscHRyICE9IGZvY3VzTW9kZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX01PREUsIGZvY3VzTW9kZSk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHByZXZpZXdXaWR0aCwgcHJldmlld0hlaWdodDsKKyAgICAgICAgICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmcHJldmlld1dpZHRoLCAmcHJldmlld0hlaWdodCk7CisKKyAgICAgICAgICAgIG1Db21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CisgICAgICAgICAgICBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpOworCisgICAgICAgICAgICBib29sIHNob3VsZFBhc3NJbnZhbGlkTGF5ZXJNZXRhRGF0YSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgICAgICAgICBpbnQgbGF5ZXJNZXRhRGF0YTsKKyAgICAgICAgICAgIGlmIChzaG91bGRQYXNzSW52YWxpZExheWVyTWV0YURhdGEpIHsKKyAgICAgICAgICAgICAgICBsYXllck1ldGFEYXRhID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGF5ZXJNZXRhRGF0YSA9IGtMYXllck1ldGFkYXRhW21GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigKKyAgICAgICAgICAgICAgICAgICAgMCwga051bUxheWVyTWV0YURhdGEgLSAxKV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBTdHJpbmc4KCJUZXN0IFN1cmZhY2UiKSwgcHJldmlld1dpZHRoLCBwcmV2aWV3SGVpZ2h0LAorICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnByZXZpZXdGb3JtYXRUb0VudW0ocGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKSksIGxheWVyTWV0YURhdGEpOworCisgICAgICAgICAgICBpZiAoc3VyZmFjZUNvbnRyb2wuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb257fQorICAgICAgICAgICAgICAgICAgICAuc2V0TGF5ZXIoc3VyZmFjZUNvbnRyb2wsIDB4N2ZmZmZmZmYpCisgICAgICAgICAgICAgICAgICAgIC5zaG93KHN1cmZhY2VDb250cm9sKQorICAgICAgICAgICAgICAgICAgICAuYXBwbHkoKTsKKworICAgICAgICAgICAgICAgIHByZXZpZXdTdXJmYWNlID0gc3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFByZXZpZXdUYXJnZXQocHJldmlld1N1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFByZXZpZXdDYWxsYmFja0ZsYWcoQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfQ0FNQ09SREVSKTsKKworICAgICAgICAgICAgVmVjdG9yPFNpemU+IHBpY3R1cmVTaXplczsKKyAgICAgICAgICAgIHBhcmFtcy5nZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMocGljdHVyZVNpemVzKTsKKworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaWN0dXJlU2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0UGljdHVyZVNpemUocGljdHVyZVNpemVzW2ldLndpZHRoLCBwaWN0dXJlU2l6ZXNbaV0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnNldFBhcmFtZXRlcnMocGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yUHJldmlld1N0YXJ0KCk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5hdXRvRm9jdXMoKTsKKyAgICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQobUF1dG9Gb2N1c0xvY2ssIG1BdXRvRm9jdXNDb25kaXRpb24sIG1BdXRvRm9jdXNNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBib29sIHNob3VsZFBhc3NJbnZhbGlkQ2FtZXJhTXNnID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKTsKKyAgICAgICAgICAgICAgICBpbnQgbXNnVHlwZTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkUGFzc0ludmFsaWRDYW1lcmFNc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnVHlwZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQ+KCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnVHlwZSA9IGtDYW1lcmFNc2dbbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgMCwga051bUNhbWVyYU1zZyAtIDEpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT50YWtlUGljdHVyZShtc2dUeXBlKTsKKworICAgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChtU25hcHNob3RMb2NrLCBtU25hcHNob3RDb25kaXRpb24sIG1TbmFwc2hvdE5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZlY3RvcjxTaXplPiB2aWRlb1NpemVzOworICAgICAgICAgICAgcGFyYW1zLmdldFN1cHBvcnRlZFZpZGVvU2l6ZXModmlkZW9TaXplcyk7CisKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmlkZW9TaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5zZXRWaWRlb1NpemUodmlkZW9TaXplc1tpXS53aWR0aCwgdmlkZW9TaXplc1tpXS5oZWlnaHQpOworCisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZS0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgd2FpdEZvclByZXZpZXdTdGFydCgpOworICAgICAgICAgICAgICAgIGNhbWVyYURldmljZS0+c2V0VmlkZW9CdWZmZXJNb2RlKAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Qm5DYW1lcmE6OlZJREVPX0JVRkZFUl9NT0RFX0JVRkZFUl9RVUVVRSk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zZXRWaWRlb1RhcmdldChwcmV2aWV3U3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKKyAgICAgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnN0YXJ0UmVjb3JkaW5nKCk7CisgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlLT5zdG9wUmVjb3JkaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBjYW1lcmFEZXZpY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgZ2V0TnVtQ2FtZXJhcygpOworICAgIGludm9rZUNhbWVyYVNvdW5kKCk7CisgICAgaWYgKG1OdW1DYW1lcmFzID4gMCkgeworICAgICAgICBpbnZva2VDYW1lcmFBUElzKCk7CisgICAgfQorICAgIGludm9rZUR1bXAoKTsKKyAgICBpbnZva2VTaGVsbENvbW1hbmQoKTsKKyAgICBpbnZva2VOb3RpZnlDYWxscygpOworfQorCitjbGFzcyBUZXN0Q2FtZXJhU2VydmljZUxpc3RlbmVyIDogcHVibGljIGhhcmR3YXJlOjpCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+VGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcigpIHt9OworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblN0YXR1c0NoYW5nZWQoaW50MzJfdCAsIGNvbnN0IFN0cmluZzE2JikgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25QaHlzaWNhbENhbWVyYVN0YXR1c0NoYW5nZWQoaW50MzJfdCAvKnN0YXR1cyovLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIC8qY2FtZXJhSWQqLywgY29uc3QgU3RyaW5nMTYmIC8qcGh5c2ljYWxDYW1lcmFJZCovKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9OworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblRvcmNoU3RhdHVzQ2hhbmdlZChpbnQzMl90IC8qc3RhdHVzKi8sIGNvbnN0IFN0cmluZzE2JiAvKmNhbWVyYUlkKi8pIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH07CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhT3BlbmVkKGNvbnN0IFN0cmluZzE2JiAvKmNhbWVyYUlkKi8sCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgLypjbGllbnRQYWNrYWdlTmFtZSovKSB7CisgICAgICAgIC8vIE5vIG9wCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FtZXJhQ2xvc2VkKGNvbnN0IFN0cmluZzE2JiAvKmNhbWVyYUlkKi8pIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KK307CisKK2NsYXNzIFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MgOiBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkge30KKworICAgIHZpcnR1YWwgflRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSB7fQorCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludCAvKmVycm9yQ29kZSovLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgLypyZXN1bHRFeHRyYXMqLykgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUlkbGUoKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uQ2FwdHVyZVN0YXJ0ZWQoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgLypyZXN1bHRFeHRyYXMqLywKKyAgICAgICAgICAgIGludDY0X3QgLyp0aW1lc3RhbXAqLykgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKGNvbnN0IENhbWVyYU1ldGFkYXRhJiAvKm1ldGFkYXRhKi8sCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiAvKnJlc3VsdEV4dHJhcyovLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIC8qcGh5c2ljYWxSZXN1bHRJbmZvcyovKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50IC8qc3RyZWFtSWQqLykgeworICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICAgICAgICAgIGludDY0X3QgLypsYXN0RnJhbWVOdW1iZXIqLywgaW50MzJfdCAvKnN0b3BwZWRTZXF1ZW5jZUlkKi8pIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KK307CisKK2NsYXNzIENhbWVyYTJGdXp6ZXIgeworICAgcHVibGljOgorICAgIENhbWVyYTJGdXp6ZXIoc3A8Q2FtZXJhU2VydmljZT4gY3MsIHN0ZDo6c2hhcmVkX3B0cjxGdXp6ZWREYXRhUHJvdmlkZXI+IGZwKSA6CisgICAgICAgICAgbUNhbWVyYVNlcnZpY2UoY3MpLCBtRnV6emVkRGF0YVByb3ZpZGVyKGZwKSB7IH07CisgICAgfkNhbWVyYTJGdXp6ZXIoKSB7fQorICAgIHZvaWQgcHJvY2VzcygpOworICAgcHJpdmF0ZToKKyAgICBzcDxDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEZ1enplZERhdGFQcm92aWRlcj4gbUZ1enplZERhdGFQcm92aWRlciA9IG51bGxwdHI7Cit9OworCit2b2lkIENhbWVyYTJGdXp6ZXI6OnByb2Nlc3MoKSB7CisgICAgc3A8VGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgVGVzdENhbWVyYVNlcnZpY2VMaXN0ZW5lcigpOworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+IHN0YXR1c2VzOworICAgIG1DYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lclRlc3QobGlzdGVuZXIsICZzdGF0dXNlcyk7CisgICAgZm9yIChhdXRvIHMgOiBzdGF0dXNlcykgeworICAgICAgICBzcDxUZXN0Q2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MobmV3IFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3MoKSk7CisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlOworICAgICAgICBtQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZShjYWxsYmFja3MsIFN0cmluZzE2KHMuY2FtZXJhSWQpLCBTdHJpbmcxNigpLCB7fSwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsIDAvKm9vbVNjb3JlRGlmZiovLAorICAgICAgICAgICAgICAgIC8qdGFyZ2V0U2RrVmVyc2lvbiovX19BTkRST0lEX0FQSV9GVVRVUkVfXywgJmRldmljZSk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGV2aWNlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYlByb2R1Y2VyOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnYkNvbnN1bWVyOworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJmdiUHJvZHVjZXIsICZnYkNvbnN1bWVyKTsKKyAgICAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBvcGFxdWVDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoZ2JDb25zdW1lciwKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIsIC8qbWF4SW1hZ2VzKi84LCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CisgICAgICAgIG9wYXF1ZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIlJvZ2VyIikpOworCisgICAgICAgIC8vIFNldCB0byBWR0EgZGltZW5zaW9uIGZvciBkZWZhdWx0LCBhcyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudAorICAgICAgICBnYkNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSg2NDAsIDQ4MCk7CisgICAgICAgIGdiQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlKG5ldyBTdXJmYWNlKGdiUHJvZHVjZXIsIC8qY29udHJvbGxlZEJ5QXBwKi9mYWxzZSkpOworCisgICAgICAgIFN0cmluZzE2IG5vUGh5c2ljYWxJZDsKKyAgICAgICAgc2l6ZV90IHJvdGF0aW9ucyA9IHNpemVvZihrUm90YXRpb25zKSAvIHNpemVvZihpbnQzMl90KSAtIDE7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0KGdiUHJvZHVjZXIsCisgICAgICAgICAgICAgICAga1JvdGF0aW9uc1ttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwgcm90YXRpb25zKV0sCisgICAgICAgICAgICAgICAgbm9QaHlzaWNhbElkKTsKKyAgICAgICAgaW50IHN0cmVhbUlkOworICAgICAgICBkZXZpY2UtPmNyZWF0ZVN0cmVhbShvdXRwdXQsICZzdHJlYW1JZCk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHNlc3Npb25QYXJhbXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gb2ZmbGluZVN0cmVhbUlkczsKKyAgICAgICAgZGV2aWNlLT5lbmRDb25maWd1cmUoLyppc0NvbnN0cmFpbmVkSGlnaFNwZWVkKi8gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUJvb2woKSwKKyAgICAgICAgICAgICAgICBzZXNzaW9uUGFyYW1zLCBuczJtcyhzeXN0ZW1UaW1lKCkpLCAmb2ZmbGluZVN0cmVhbUlkcyk7CisKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVxdWVzdFRlbXBsYXRlOworICAgICAgICBzaXplX3QgcmVxdWVzdFRlbXBsYXRlc1NpemUgPSAgc2l6ZW9mKGtSZXF1ZXN0VGVtcGxhdGVzKSAvc2l6ZW9mKGludDMyX3QpICAtIDE7CisgICAgICAgIGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3Qoa1JlcXVlc3RUZW1wbGF0ZXNbCisgICAgICAgICAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxzaXplX3Q+KDAsIHJlcXVlc3RUZW1wbGF0ZXNTaXplKV0sCisgICAgICAgICAgICAgICAgLypvdXQqLyZyZXF1ZXN0VGVtcGxhdGUpOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcmVxdWVzdC5tU3VyZmFjZUxpc3QuYWRkKHN1cmZhY2UpOworICAgICAgICByZXF1ZXN0Lm1Jc1JlcHJvY2VzcyA9IGZhbHNlOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gaW5mbzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtUmVxdWVzdHNUZXN0ZWQ7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCBzZW5zb3JQaXhlbE1vZGUgPQorICAgICAgICAgICAgICAgICAgICBrU2Vuc29yUGl4ZWxNb2Rlc1ttRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lQm9vbCgpID8gMSA6IDBdOworICAgICAgICAgICAgcmVxdWVzdFRlbXBsYXRlLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFLCAmc2Vuc29yUGl4ZWxNb2RlLCAxKTsKKyAgICAgICAgICAgIHJlcXVlc3QubVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlcXVlc3QubVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzLmNhbWVyYUlkLnN0cmluZygpLCByZXF1ZXN0VGVtcGxhdGV9KTsKKyAgICAgICAgICAgIGRldmljZS0+c3VibWl0UmVxdWVzdChyZXF1ZXN0LCAvKnN0cmVhbWluZyovZmFsc2UsIC8qb3V0Ki8maW5mbyk7CisgICAgICAgICAgICBBTE9HVigiJXMgOiBjYW1lcmEgaWQgJXMgc3VibWl0IHJlcXVlc3QgaWQgJWQiLF9fRlVOQ1RJT05fXywgcy5jYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUmVxdWVzdElkKTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNldHVpZChBSURfQ0FNRVJBU0VSVkVSKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RnV6emVkRGF0YVByb3ZpZGVyPiBmcCA9IHN0ZDo6bWFrZV9zaGFyZWQ8RnV6emVkRGF0YVByb3ZpZGVyPihkYXRhLCBzaXplKTsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlPiBjcyA9IG5ldyBDYW1lcmFTZXJ2aWNlKCk7CisgICAgY3MtPmNsZWFyQ2FjaGVkVmFyaWFibGVzKCk7CisgICAgc3A8Q2FtZXJhRnV6emVyPiBjYW1lcmFmdXp6ZXIgPSBuZXcgQ2FtZXJhRnV6emVyKGNzLCBmcCk7CisgICAgaWYgKCFjYW1lcmFmdXp6ZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhbWVyYWZ1enplci0+cHJvY2VzcygpOworICAgIENhbWVyYTJGdXp6ZXIgY2FtZXJhMmZ1enplcihjcywgZnApOworICAgIGNhbWVyYTJmdXp6ZXIucHJvY2VzcygpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggM2VhZDcxNS4uMGI1YWQ3OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0zMyw5ICszMywxMSBAQAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjYgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNyBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNCBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNyBcCiAgICAgYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscwogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKQEAgLTUxLDYgKzUzLDkgQEAKIExPQ0FMX1NBTklUSVpFIDo9IGFkZHJlc3MKIAogTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0CitMT0NBTF9MSUNFTlNFX0tJTkRTOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorTE9DQUxfTElDRU5TRV9DT05ESVRJT05TOj0gbm90aWNlCitMT0NBTF9OT1RJQ0VfRklMRTo9ICQoTE9DQUxfUEFUSCkvLi4vTk9USUNFCiBMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCA4NTViNWFiLi5hNzRmZDlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwpAQCAtMTczLDYgKzE3NSwyNSBAQAogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB1aW50NjRfdCBjb29raWUpIHsKKyAgICAgICAgaWYgKG1Jbml0aWFsRGVhdGhSZWNpcGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUluaXRpYWxEZWF0aFJlY2lwaWVudCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpbmRlcl9kZWF0aF9yZWNpcGllbnQ+KHJlY2lwaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSwgdGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzaWduYWxJbml0aWFsQmluZGVyRGVhdGhSZWNpcGllbnQoKSB7CisgICAgICAgIGlmIChtSW5pdGlhbERlYXRoUmVjaXBpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Jbml0aWFsRGVhdGhSZWNpcGllbnQtPmJpbmRlckRpZWQobnVsbHB0ciAvKndobyovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpbmRlcl9kZWF0aF9yZWNpcGllbnQ+IG1Jbml0aWFsRGVhdGhSZWNpcGllbnQ7CisKICAgICBlbnVtIE1ldGhvZE5hbWVzIHsKICAgICAgICAgU0VUX0NBTExCQUNLLAogICAgICAgICBHRVRfVkVORE9SX1RBR1MsCkBAIC01NjcsMyArNTg4LDQ3IEBACiAgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIH0KKworLy8gVGVzdCB0aGF0IENhbWVyYVByb3ZpZGVyTWFuYWdlciBjYW4gaGFuZGxlIHJhY2VzIGJldHdlZW4gcHJvdmlkZXIgZGVhdGggbm90aWZpY2F0aW9ucyBhbmQKKy8vIHByb3ZpZGVyIHJlZ2lzdHJhdGlvbiBjYWxsYmFja3MKK1RFU1QoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdCwgQmluZGVyRGVhdGhSZWdpc3RyYXRpb25SYWNlVGVzdCkgeworCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBkZXZpY2VOYW1lczsKKyAgICBkZXZpY2VOYW1lcy5wdXNoX2JhY2soImRldmljZUAzLjIvdGVzdC8wIik7CisgICAgZGV2aWNlTmFtZXMucHVzaF9iYWNrKCJkZXZpY2VAMy4yL3Rlc3QvMSIpOworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+IHZlbmRvclNlY3Rpb247CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBwcm92aWRlck1hbmFnZXIgPSBuZXcgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyKCk7CisgICAgc3A8VGVzdFN0YXR1c0xpc3RlbmVyPiBzdGF0dXNMaXN0ZW5lciA9IG5ldyBUZXN0U3RhdHVzTGlzdGVuZXIoKTsKKyAgICBUZXN0SW50ZXJhY3Rpb25Qcm94eSBzZXJ2aWNlUHJveHk7CisgICAgc3A8VGVzdElDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPSAgbmV3IFRlc3RJQ2FtZXJhUHJvdmlkZXIoZGV2aWNlTmFtZXMsCisgICAgICAgICAgICB2ZW5kb3JTZWN0aW9uKTsKKworICAgIC8vIE5vdCBzZXR0aW5nIHVwIHByb3ZpZGVyIGluIHRoZSBzZXJ2aWNlIHByb3h5IHlldCwgdG8gdGVzdCBjYXNlcyB3aGVyZSBhCisgICAgLy8gSEFMIGlzbid0IHN0YXJ0aW5nIHJpZ2h0CisgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOworCisgICAgLy8gTm93IHNldCB1cCBwcm92aWRlciBhbmQgdHJpZ2dlciBhIHJlZ2lzdHJhdGlvbgorICAgIHNlcnZpY2VQcm94eS5zZXRQcm92aWRlcihwcm92aWRlcik7CisKKyAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lID0KKyAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CisgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSA9ICJ0ZXN0LzAiOworICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCisgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsCisgICAgICAgICAgICB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKKworICAgIC8vIFNpbXVsYXRlIGFydGlmaWNpYWwgZGVsYXkgb2YgdGhlIHJlZ2lzdHJhdGlvbiBjYWxsYmFjayB3aGljaCBhcnJpdmVzIGJlZm9yZSB0aGUKKyAgICAvLyBkZWF0aCBub3RpZmljYXRpb24KKyAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAorICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLAorICAgICAgICAgICAgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lLCBmYWxzZSk7CisKKyAgICBwcm92aWRlci0+c2lnbmFsSW5pdGlhbEJpbmRlckRlYXRoUmVjaXBpZW50KCk7CisKKyAgICBhdXRvIGRldmljZUNvdW50ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+IChwcm92aWRlck1hbmFnZXItPmdldENhbWVyYUNvdW50KCkuc2Vjb25kKTsKKyAgICBBU1NFUlRfRVEoZGV2aWNlQ291bnQsIGRldmljZU5hbWVzLnNpemUoKSkgPDwKKyAgICAgICAgICAgICJVbmV4cGVjdGVkIGFtb3VudCBvZiBjYW1lcmEgZGV2aWNlcyI7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DbGllbnRNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DbGllbnRNYW5hZ2VyVGVzdC5jcHAKaW5kZXggNmEzODQyNy4uYzc5ZWY0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2xpZW50TWFuYWdlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NsaWVudE1hbmFnZXJUZXN0LmNwcApAQCAtMTcsMTAgKzE3LDEzIEBACiAjZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDbGllbnRNYW5hZ2VyVGVzdCIKIAorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KKwogI2luY2x1ZGUgIi4uL3V0aWxzL0NsaWVudE1hbmFnZXIuaCIKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6cmVzb3VyY2VfcG9saWN5OwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0cnVjdCBUZXN0Q2xpZW50IHsKICAgICBUZXN0Q2xpZW50KGludCBpZCwgaW50MzJfdCBjb3N0LCBjb25zdCBzdGQ6OnNldDxpbnQ+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgb3duZXJJZCwKQEAgLTQxLDcgKzQ0LDcgQEAKIAogVGVzdERlc2NyaXB0b3JQdHIgbWFrZURlc2NGcm9tVGVzdENsaWVudChjb25zdCBUZXN0Q2xpZW50JiB0YykgewogICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RDbGllbnREZXNjcmlwdG9yPigvKklEKi90Yy5tSWQsIHRjLCB0Yy5tQ29zdCwgdGMubUNvbmZsaWN0aW5nS2V5cywKLSAgICAgICAgICAgIHRjLm1TY29yZSwgdGMubU93bmVySWQsIHRjLm1TdGF0ZSwgdGMubUlzVmVuZG9yQ2xpZW50KTsKKyAgICAgICAgICAgIHRjLm1TY29yZSwgdGMubU93bmVySWQsIHRjLm1TdGF0ZSwgdGMubUlzVmVuZG9yQ2xpZW50LCAvKm9vbVNjb3JlT2Zmc2V0Ki8wKTsKIH0KIAogY2xhc3MgVGVzdENsaWVudE1hbmFnZXIgOiBwdWJsaWMgQ2xpZW50TWFuYWdlcjxpbnQsIFRlc3RDbGllbnQ+IHsKQEAgLTU5LDEzICs2MiwxNSBAQAogCiAgICAgVGVzdENsaWVudE1hbmFnZXIgY207CiAgICAgVGVzdENsaWVudCBjYW0wQ2xpZW50KC8qSUQqLzAsIC8qY29zdCovMTAwLCAvKmNvbmZsaWN0cyovezF9LAotICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgLypzY29yZSovNTAsIC8qc3RhdGUqLyAxLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOworICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgUEVSQ0VQVElCTEVfUkVDRU5UX0ZPUkVHUk9VTkRfQVBQX0FESiwKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOwogICAgIGF1dG8gY2FtMERlc2MgPSBtYWtlRGVzY0Zyb21UZXN0Q2xpZW50KGNhbTBDbGllbnQpOwogICAgIGF1dG8gZXZpY3RlZCA9IGNtLmFkZEFuZEV2aWN0KGNhbTBEZXNjKTsKICAgICBBU1NFUlRfRVEoZXZpY3RlZC5zaXplKCksIDB1KSA8PCAiRXZpY3RlZCBsaXN0IG11c3QgYmUgZW1wdHkiOwogCiAgICAgVGVzdENsaWVudCBjYW0xQ2xpZW50KC8qSUQqLzEsIC8qY29zdCovMTAwLCAvKmNvbmZsaWN0cyovezB9LAotICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgLypzY29yZSovNTAsIC8qc3RhdGUqLyAxLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOworICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgUEVSQ0VQVElCTEVfUkVDRU5UX0ZPUkVHUk9VTkRfQVBQX0FESiwKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOwogICAgIGF1dG8gY2FtMURlc2MgPSBtYWtlRGVzY0Zyb21UZXN0Q2xpZW50KGNhbTFDbGllbnQpOwogCiAgICAgLy8gMS4gQ2hlY2sgd2l0aCBjb25mbGljdGluZyBkZXZpY2VzLCBuZXcgY2xpZW50IHdvdWxkIGJlIGV2aWN0ZWQKQEAgLTc2LDEzICs4MSwxNSBAQAogICAgIGNtLnJlbW92ZUFsbCgpOwogCiAgICAgVGVzdENsaWVudCBjYW0yQ2xpZW50KC8qSUQqLzIsIC8qY29zdCovMTAwLCAvKmNvbmZsaWN0cyove30sCi0gICAgICAgICAgICAvKm93bmVySWQqLyAxMDAwLCAvKnNjb3JlKi81MCwgLypzdGF0ZSovIDEsIC8qaXNWZW5kb3JDbGllbnQqLyBmYWxzZSk7CisgICAgICAgICAgICAvKm93bmVySWQqLyAxMDAwLCBQRVJDRVBUSUJMRV9SRUNFTlRfRk9SRUdST1VORF9BUFBfQURKLAorICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUksIC8qaXNWZW5kb3JDbGllbnQqLyBmYWxzZSk7CiAgICAgYXV0byBjYW0yRGVzYyA9IG1ha2VEZXNjRnJvbVRlc3RDbGllbnQoY2FtMkNsaWVudCk7CiAgICAgZXZpY3RlZCA9IGNtLmFkZEFuZEV2aWN0KGNhbTJEZXNjKTsKICAgICBBU1NFUlRfRVEoZXZpY3RlZC5zaXplKCksIDB1KSA8PCAiRXZpY3RlZCBsaXN0IG11c3QgYmUgZW1wdHkiOwogCiAgICAgVGVzdENsaWVudCBjYW0zQ2xpZW50KC8qSUQqLzMsIC8qY29zdCovMTAwLCAvKmNvbmZsaWN0cyove30sCi0gICAgICAgICAgICAvKm93bmVySWQqLyAxMDAwLCAvKnNjb3JlKi81MCwgLypzdGF0ZSovIDEsIC8qaXNWZW5kb3JDbGllbnQqLyBmYWxzZSk7CisgICAgICAgICAgICAvKm93bmVySWQqLyAxMDAwLCBQRVJDRVBUSUJMRV9SRUNFTlRfRk9SRUdST1VORF9BUFBfQURKLAorICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUksIC8qaXNWZW5kb3JDbGllbnQqLyBmYWxzZSk7CiAgICAgYXV0byBjYW0zRGVzYyA9IG1ha2VEZXNjRnJvbVRlc3RDbGllbnQoY2FtM0NsaWVudCk7CiAKICAgICAvLyAyLiBDaGVjayB3aXRob3V0IGNvbmZsaWN0aW5nIGRldmljZXMsIHRoZSBwcmUtZXhpc3RpbmcgY2xpZW50IHdvbid0IGJlIGV2aWN0ZWQKQEAgLTk3LDEyICsxMDQsNDIgQEAKICAgICBBU1NFUlRfRVEoZXZpY3RlZC5zaXplKCksIDB1KSA8PCAiRXZpY3RlZCBsaXN0IG11c3QgYmUgZW1wdHkiOwogCiAgICAgVGVzdENsaWVudCBjYW0wQ2xpZW50TmV3KC8qSUQqLzAsIC8qY29zdCovMTAwLCAvKmNvbmZsaWN0cyovezF9LAotICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgLypzY29yZSovNTAsIC8qc3RhdGUqLyAxLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOworICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgUEVSQ0VQVElCTEVfUkVDRU5UX0ZPUkVHUk9VTkRfQVBQX0FESiwKKyAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9QRVJTSVNURU5UX1VJLCAvKmlzVmVuZG9yQ2xpZW50Ki8gZmFsc2UpOwogICAgIGF1dG8gY2FtMERlc2NOZXcgPSBtYWtlRGVzY0Zyb21UZXN0Q2xpZW50KGNhbTBDbGllbnROZXcpOwogICAgIHdvdWxkQmVFdmljdGVkID0gY20ud291bGRFdmljdChjYW0wRGVzY05ldyk7CiAKICAgICAvLyAzLiBDaGVjayBvcGVuaW5nIHRoZSBzYW1lIGNhbWVyYSB0d2ljZSB3aWxsIGV2aWN0IHRoZSBvbGRlciBjbGllbnQKICAgICBBU1NFUlRfRVEod291bGRCZUV2aWN0ZWQuc2l6ZSgpLCAxdSkgPDwgIkV2aWN0ZWQgbGlzdCBsZW5ndGggbXVzdCBiZSAxIjsKICAgICBBU1NFUlRfRVEod291bGRCZUV2aWN0ZWRbMF0sIGNhbTBEZXNjKSA8PCAiY2FtMCAob2xkKSBtdXN0IGJlIGV2aWN0ZWQiOwotfQogCisgICAgLy8gNC4gQ2hlY2sgdGhhdCBhbiBpbnZhbGlkIGNsaWVudCAoZGVhZCBwcm9jZXNzKSB3aWxsIGJlIGV2aWN0ZWQKKworICAgIGNtLnJlbW92ZUFsbCgpOworCisgICAgVGVzdENsaWVudCBjYW1EZWFkQ2xpZW50KC8qSUQqLyAwLCAvKmNvc3QqLzEwMCwgLypjb25mbGljdHMqL3t9LAorICAgICAgICAgICAgLypvd25lcklkKi8gMTAwMCwgSU5WQUxJRF9BREosCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQsIC8qaXNWZW5kb3JDbGllbnQqLyBmYWxzZSk7CisgICAgYXV0byBjYW1EZWFkRGVzYyA9IG1ha2VEZXNjRnJvbVRlc3RDbGllbnQoY2FtRGVhZENsaWVudCk7CisgICAgZXZpY3RlZCA9IGNtLmFkZEFuZEV2aWN0KGNhbURlYWREZXNjKTsKKyAgICB3b3VsZEJlRXZpY3RlZCA9IGNtLndvdWxkRXZpY3QoY2FtMERlc2MpOworCisgICAgQVNTRVJUX0VRKGV2aWN0ZWQuc2l6ZSgpLCAwdSkgPDwgIkV2aWN0ZWQgbGlzdCBtdXN0IGJlIGVtcHR5IjsKKyAgICBBU1NFUlRfRVEod291bGRCZUV2aWN0ZWQuc2l6ZSgpLCAxdSkgPDwgIkV2aWN0ZWQgbGlzdCBsZW5ndGggbXVzdCBiZSAxIjsKKyAgICBBU1NFUlRfRVEod291bGRCZUV2aWN0ZWRbMF0sIGNhbURlYWREZXNjKSA8PCAiZGVhZCBjYW0gbXVzdCBiZSBldmljdGVkIjsKKworICAgIC8vIDUuIENoZWNrIHRoYXQgYSBtb3JlIGltcG9ydGFudCBjbGllbnQgd2lsbCB3aW4KKworICAgIFRlc3RDbGllbnQgY2FtMEZvcmVncm91bmRDbGllbnQoLypJRCovMCwgLypjb3N0Ki8xMDAsIC8qY29uZmxpY3RzKi97MX0sCisgICAgICAgICAgICAvKm93bmVySWQqLyAxMDAwLCBGT1JFR1JPVU5EX0FQUF9BREosCisgICAgICAgICAgICBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVF9VSSwgLyppc1ZlbmRvckNsaWVudCovIGZhbHNlKTsKKyAgICBhdXRvIGNhbTBGZ0Rlc2MgPSBtYWtlRGVzY0Zyb21UZXN0Q2xpZW50KGNhbTBGb3JlZ3JvdW5kQ2xpZW50KTsKKworICAgIGNtLnJlbW92ZUFsbCgpOworICAgIGV2aWN0ZWQgPSBjbS5hZGRBbmRFdmljdChjYW0wRGVzYyk7CisgICAgd291bGRCZUV2aWN0ZWQgPSBjbS53b3VsZEV2aWN0KGNhbTBGZ0Rlc2MpOworCisgICAgQVNTRVJUX0VRKGV2aWN0ZWQuc2l6ZSgpLCAwdSk7CisgICAgQVNTRVJUX0VRKHdvdWxkQmVFdmljdGVkLnNpemUoKSwgMXUpOworICAgIEFTU0VSVF9FUSh3b3VsZEJlRXZpY3RlZFswXSxjYW0wRGVzYykgPDwgImxlc3MgaW1wb3J0YW50IGNhbTAgbXVzdCBiZSBldmljdGVkIjsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAppbmRleCA1NDkzNWM5Li44MzMxMTM2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7Ci0KK3VzaW5nIERpc3RvcnRpb25NYXBwZXJJbmZvID0gYW5kcm9pZDo6Y2FtZXJhMzo6RGlzdG9ydGlvbk1hcHBlcjo6RGlzdG9ydGlvbk1hcHBlckluZm87CiAKIGludDMyX3QgdGVzdEFjdGl2ZUFycmF5W10gPSB7MTAwLCAxMDAsIDEwMDAsIDc1MH07CiBpbnQzMl90IHRlc3RQcmVDb3JyQWN0aXZlQXJyYXlbXSA9IHs5MCwgOTAsIDEwMjAsIDc3MH07CkBAIC0xMzIsMTQgKzEzMiwxNSBAQAogICAgICAgICAgICAgLypwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkqLyB0ZXN0QWN0aXZlQXJyYXkpOwogCiAgICAgYXV0byBjb29yZHMgPSBiYXNpY0Nvb3JkczsKLSAgICByZXMgPSBtLm1hcENvcnJlY3RlZFRvUmF3KGNvb3Jkcy5kYXRhKCksIDUsICAvKmNsYW1wKi90cnVlKTsKKyAgICBEaXN0b3J0aW9uTWFwcGVySW5mbyAqbWFwcGVySW5mbyA9IG0uZ2V0TWFwcGVySW5mbygpOworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLmRhdGEoKSwgNSwgbWFwcGVySW5mbywgLypjbGFtcCovdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgRVhQRUNUX0VRKGNvb3Jkc1tpXSwgYmFzaWNDb29yZHNbaV0pOwogICAgIH0KIAotICAgIHJlcyA9IG0ubWFwUmF3VG9Db3JyZWN0ZWQoY29vcmRzLmRhdGEoKSwgNSwgLypjbGFtcCovdHJ1ZSk7CisgICAgcmVzID0gbS5tYXBSYXdUb0NvcnJlY3RlZChjb29yZHMuZGF0YSgpLCA1LCBtYXBwZXJJbmZvLCAvKmNsYW1wKi90cnVlKTsKICAgICBBU1NFUlRfRVEocmVzLCBPSyk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb3Jkcy5zaXplKCk7IGkrKykgewpAQCAtMTUyLDE0ICsxNTMsMTQgQEAKICAgICB9OwogCiAgICAgYXV0byByZWN0c09yaWcgPSByZWN0czsKLSAgICByZXMgPSBtLm1hcENvcnJlY3RlZFJlY3RUb1JhdyhyZWN0cy5kYXRhKCksIDIsIC8qY2xhbXAqL3RydWUpOworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KHJlY3RzLmRhdGEoKSwgMiwgbWFwcGVySW5mbywgLypjbGFtcCovdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICBFWFBFQ1RfRVEocmVjdHNbaV0sIHJlY3RzT3JpZ1tpXSk7CiAgICAgfQogCi0gICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQocmVjdHMuZGF0YSgpLCAyLCAvKmNsYW1wKi90cnVlKTsKKyAgICByZXMgPSBtLm1hcFJhd1JlY3RUb0NvcnJlY3RlZChyZWN0cy5kYXRhKCksIDIsIG1hcHBlckluZm8sIC8qY2xhbXAqL3RydWUpOwogICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyBpKyspIHsKQEAgLTE3NiwxNCArMTc3LDE3IEBACiAgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSk7CiAKICAgICBhdXRvIHJlY3RzT3JpZyA9IGFjdGl2ZUFycmF5OwotICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBEaXN0b3J0aW9uTWFwcGVySW5mbyAqbWFwcGVySW5mbyA9IG0uZ2V0TWFwcGVySW5mbygpOworICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkUmVjdFRvUmF3KGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgbWFwcGVySW5mbywgLypjbGFtcCovdHJ1ZSwKKyAgICAgICAgICAgIC8qc2ltcGxlKi8gdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgewogICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CiAgICAgfQogCi0gICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIHJlcyA9IG0ubWFwUmF3UmVjdFRvQ29ycmVjdGVkKGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgbWFwcGVySW5mbywgLypjbGFtcCovdHJ1ZSwKKyAgICAgICAgICAgIC8qc2ltcGxlKi8gdHJ1ZSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgewpAQCAtMjAwLDcgKzIwNCw4IEBACiAgICAgICAgICAgICAvKnByZUNvcnJlY3Rpb25BY3RpdmVBcnJheSovIHRlc3RQcmVDb3JyQWN0aXZlQXJyYXkpOwogCiAgICAgYXV0byBjb29yZHMgPSBiYXNpY0Nvb3JkczsKLSAgICByZXMgPSBtLm1hcENvcnJlY3RlZFRvUmF3KGNvb3Jkcy5kYXRhKCksIDUsICAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovdHJ1ZSk7CisgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8gPSBtLmdldE1hcHBlckluZm8oKTsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFRvUmF3KGNvb3Jkcy5kYXRhKCksIDUsIG1hcHBlckluZm8sIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi90cnVlKTsKICAgICBBU1NFUlRfRVEocmVzLCBPSyk7CiAKICAgICBBU1NFUlRfRVEoY29vcmRzWzBdLCAwKTsgQVNTRVJUX0VRKGNvb3Jkc1sxXSwgMCk7CkBAIC0yMzcsMTIgKzI0MiwxMyBAQAogICAgIGF1dG8gb3JpZ0Nvb3JkcyA9IHJhbmRDb29yZHM7CiAKICAgICBiYXNlOjpUaW1lciBjb3JyZWN0ZWRUb1Jhd1RpbWVyOwotICAgIHJlcyA9IG0ubWFwQ29ycmVjdGVkVG9SYXcocmFuZENvb3Jkcy5kYXRhKCksIHJhbmRDb29yZHMuc2l6ZSgpIC8gMiwgY2xhbXAsIHNpbXBsZSk7CisgICAgRGlzdG9ydGlvbk1hcHBlckluZm8gKm1hcHBlckluZm8gPSBtLmdldE1hcHBlckluZm8oKTsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFRvUmF3KHJhbmRDb29yZHMuZGF0YSgpLCByYW5kQ29vcmRzLnNpemUoKSAvIDIsIG1hcHBlckluZm8sIGNsYW1wLCBzaW1wbGUpOwogICAgIGF1dG8gY29ycmVjdGVkVG9SYXdEdXJhdGlvbk1zID0gY29ycmVjdGVkVG9SYXdUaW1lci5kdXJhdGlvbigpOwogICAgIEVYUEVDVF9FUShyZXMsIE9LKTsKIAogICAgIGJhc2U6OlRpbWVyIHJhd1RvQ29ycmVjdGVkVGltZXI7Ci0gICAgcmVzID0gbS5tYXBSYXdUb0NvcnJlY3RlZChyYW5kQ29vcmRzLmRhdGEoKSwgcmFuZENvb3Jkcy5zaXplKCkgLyAyLCBjbGFtcCwgc2ltcGxlKTsKKyAgICByZXMgPSBtLm1hcFJhd1RvQ29ycmVjdGVkKHJhbmRDb29yZHMuZGF0YSgpLCByYW5kQ29vcmRzLnNpemUoKSAvIDIsIG1hcHBlckluZm8sIGNsYW1wLCBzaW1wbGUpOwogICAgIGF1dG8gcmF3VG9Db3JyZWN0ZWREdXJhdGlvbk1zID0gcmF3VG9Db3JyZWN0ZWRUaW1lci5kdXJhdGlvbigpOwogICAgIEVYUEVDVF9FUShyZXMsIE9LKTsKIApAQCAtMzYzLDcgKzM2OSw4IEBACiAKICAgICB1c2luZyBuYW1lc3BhY2Ugb3BlbkN2RGF0YTsKIAotICAgIHJlcyA9IG0ubWFwUmF3VG9Db3JyZWN0ZWQocmF3Q29vcmRzLmRhdGEoKSwgcmF3Q29vcmRzLnNpemUoKSAvIDIsIC8qY2xhbXAqL2ZhbHNlLAorICAgIERpc3RvcnRpb25NYXBwZXJJbmZvICptYXBwZXJJbmZvID0gbS5nZXRNYXBwZXJJbmZvKCk7CisgICAgcmVzID0gbS5tYXBSYXdUb0NvcnJlY3RlZChyYXdDb29yZHMuZGF0YSgpLCByYXdDb29yZHMuc2l6ZSgpIC8gMiwgbWFwcGVySW5mbywgLypjbGFtcCovZmFsc2UsCiAgICAgICAgICAgICAvKnNpbXBsZSovZmFsc2UpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByYXdDb29yZHMuc2l6ZSgpOyBpKz0yKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9ab29tUmF0aW9UZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL1pvb21SYXRpb1Rlc3QuY3BwCmluZGV4IDRlOTQ5OTEuLmZmN2FhZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL1pvb21SYXRpb1Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL1pvb21SYXRpb1Rlc3QuY3BwCkBAIC0xODIsNyArMTgyLDcgQEAKIAogICAgIC8vIFZlcmlmeSAxLjB4IHpvb20gZG9lc24ndCBjaGFuZ2UgdGhlIGNvb3JkaW5hdGVzCiAgICAgYXV0byBjb29yZHMgPSBvcmlnaW5hbENvb3JkczsKLSAgICBtYXBwZXIuc2NhbGVDb29yZGluYXRlcyhjb29yZHMuZGF0YSgpLCBjb29yZHMuc2l6ZSgpLzIsIDEuMGYsIGZhbHNlIC8qY2xhbXAqLyk7CisgICAgbWFwcGVyLnNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLmRhdGEoKSwgY29vcmRzLnNpemUoKS8yLCAxLjBmLCBmYWxzZSAvKmNsYW1wKi8sIHdpZHRoLCBoZWlnaHQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEVYUEVDVF9FUShjb29yZHNbaV0sIG9yaWdpbmFsQ29vcmRzW2ldKTsKICAgICB9CkBAIC0xOTksNyArMTk5LDcgQEAKICAgICAgICAgICAgICh3aWR0aCAtIDEpICogNS4wZiAvIDQuMGYsIChoZWlnaHQgLSAxKSAvIDIuMGYsIC8vIG1pZGRsZS1yaWdodCBhZnRlciAxLjMzeCB6b29tCiAgICAgfTsKICAgICBjb29yZHMgPSBvcmlnaW5hbENvb3JkczsKLSAgICBtYXBwZXIuc2NhbGVDb29yZGluYXRlcyhjb29yZHMuZGF0YSgpLCBjb29yZHMuc2l6ZSgpLzIsIDIuMGYsIGZhbHNlIC8qY2xhbXAqLyk7CisgICAgbWFwcGVyLnNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLmRhdGEoKSwgY29vcmRzLnNpemUoKS8yLCAyLjBmLCBmYWxzZSAvKmNsYW1wKi8sIHdpZHRoLCBoZWlnaHQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEVYUEVDVF9MRShzdGQ6OmFicyhjb29yZHNbaV0gLSBleHBlY3RlZDJ4Q29vcmRzW2ldKSwga01heEFsbG93ZWRQaXhlbEVycm9yKTsKICAgICB9CkBAIC0yMTYsNyArMjE2LDcgQEAKICAgICAgICAgICAgIHdpZHRoIC0gMS4wZiwgIChoZWlnaHQgLSAxKSAvIDIuMGYsIC8vIG1pZGRsZS1yaWdodCBhZnRlciAxLjMzeCB6b29tCiAgICAgfTsKICAgICBjb29yZHMgPSBvcmlnaW5hbENvb3JkczsKLSAgICBtYXBwZXIuc2NhbGVDb29yZGluYXRlcyhjb29yZHMuZGF0YSgpLCBjb29yZHMuc2l6ZSgpLzIsIDIuMGYsIHRydWUgLypjbGFtcCovKTsKKyAgICBtYXBwZXIuc2NhbGVDb29yZGluYXRlcyhjb29yZHMuZGF0YSgpLCBjb29yZHMuc2l6ZSgpLzIsIDIuMGYsIHRydWUgLypjbGFtcCovLCB3aWR0aCwgaGVpZ2h0KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvb3Jkcy5zaXplKCk7IGkrKykgewogICAgICAgICBFWFBFQ1RfTEUoc3RkOjphYnMoY29vcmRzW2ldIC0gZXhwZWN0ZWQyeENvb3Jkc0NsYW1wZWRJbmNbaV0pLCBrTWF4QWxsb3dlZFBpeGVsRXJyb3IpOwogICAgIH0KQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICAgICAgd2lkdGggLSAxLjBmLCAgaGVpZ2h0IC8gMi4wZiwgLy8gbWlkZGxlLXJpZ2h0IGFmdGVyIDEuMzN4IHpvb20KICAgICB9OwogICAgIGNvb3JkcyA9IG9yaWdpbmFsQ29vcmRzOwotICAgIG1hcHBlci5zY2FsZUNvb3JkaW5hdGVzKGNvb3Jkcy5kYXRhKCksIGNvb3Jkcy5zaXplKCkvMiwgMi4wZiwgdHJ1ZSAvKmNsYW1wKi8pOworICAgIG1hcHBlci5zY2FsZUNvb3JkaW5hdGVzKGNvb3Jkcy5kYXRhKCksIGNvb3Jkcy5zaXplKCkvMiwgMi4wZiwgdHJ1ZSAvKmNsYW1wKi8sIHdpZHRoLCBoZWlnaHQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29vcmRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEVYUEVDVF9MRShzdGQ6OmFicyhjb29yZHNbaV0gLSBleHBlY3RlZDJ4Q29vcmRzQ2xhbXBlZEV4Y1tpXSksIGtNYXhBbGxvd2VkUGl4ZWxFcnJvcik7CiAgICAgfQpAQCAtMjUwLDcgKzI1MCw3IEBACiAgICAgICAgICAgICAod2lkdGggLSAxKSAqIDUgLyA4LjBmLCAoaGVpZ2h0IC0gMSkgLyAyLjBmLCAvLyBtaWRkbGUtcmlnaHQgYWZ0ZXIgMS4zM3ggem9vbS1pbgogICAgIH07CiAgICAgY29vcmRzID0gb3JpZ2luYWxDb29yZHM7Ci0gICAgbWFwcGVyLnNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLmRhdGEoKSwgY29vcmRzLnNpemUoKS8yLCAxLjBmLzMsIGZhbHNlIC8qY2xhbXAqLyk7CisgICAgbWFwcGVyLnNjYWxlQ29vcmRpbmF0ZXMoY29vcmRzLmRhdGEoKSwgY29vcmRzLnNpemUoKS8yLCAxLjBmLzMsIGZhbHNlIC8qY2xhbXAqLywgd2lkdGgsIGhlaWdodCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb29yZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgRVhQRUNUX0xFKHN0ZDo6YWJzKGNvb3Jkc1tpXSAtIGV4cGVjdGVkWm9vbU91dENvb3Jkc1tpXSksIGtNYXhBbGxvd2VkUGl4ZWxFcnJvcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjkyN2MwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5jcHAKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSAiQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5OwordXNpbmcgaGFyZHdhcmU6OkNhbWVyYVNlc3Npb25TdGF0czsKKworTXV0ZXggQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6c1Byb3h5TXV0ZXg7CitzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6c0NhbWVyYVNlcnZpY2VQcm94eTsKKworTXV0ZXggQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bUxvY2s7CitzdGQ6Om1hcDxTdHJpbmc4LCBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4+CisgICAgICAgIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6Om1TZXNzaW9uU3RhdHNNYXA7CisKKy8qKgorICogQ2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlciBmdW5jdGlvbnMKKyAqLworCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OkNhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI6Om9uT3BlbigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICB1cGRhdGVQcm94eURldmljZVN0YXRlKG1TZXNzaW9uU3RhdHMpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OkNhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI6Om9uQ2xvc2UoaW50MzJfdCBsYXRlbmN5TXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBtU2Vzc2lvblN0YXRzLm1OZXdDYW1lcmFTdGF0ZSA9IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX1NUQVRFX0NMT1NFRDsKKyAgICBtU2Vzc2lvblN0YXRzLm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvblN0cmVhbUNvbmZpZ3VyZWQoCisgICAgICAgIGludCBvcGVyYXRpbmdNb2RlLCBib29sIGludGVybmFsUmVjb25maWcsIGludDMyX3QgbGF0ZW5jeU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgaWYgKGludGVybmFsUmVjb25maWcpIHsKKyAgICAgICAgbVNlc3Npb25TdGF0cy5tSW50ZXJuYWxSZWNvbmZpZ3VyZSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXNzaW9uU3RhdHMubUxhdGVuY3lNcyA9IGxhdGVuY3lNczsKKyAgICAgICAgbVNlc3Npb25TdGF0cy5tU2Vzc2lvblR5cGUgPSBvcGVyYXRpbmdNb2RlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbkFjdGl2ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBtU2Vzc2lvblN0YXRzLm1OZXdDYW1lcmFTdGF0ZSA9IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX1NUQVRFX0FDVElWRTsKKyAgICB1cGRhdGVQcm94eURldmljZVN0YXRlKG1TZXNzaW9uU3RhdHMpOworCisgICAgLy8gUmVzZXQgbUNyZWF0aW9uRHVyYXRpb24gdG8gLTEgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAxc3Qgc2Vzc2lvbgorICAgIC8vIGFmdGVyIGNvbmZpZ3VyYXRpb24sIGFuZCBhbGwgb3RoZXIgc2Vzc2lvbnMgYWZ0ZXIgY29uZmlndXJhdGlvbi4KKyAgICBtU2Vzc2lvblN0YXRzLm1MYXRlbmN5TXMgPSAtMTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyOjpvbklkbGUoCisgICAgICAgIGludDY0X3QgcmVxdWVzdENvdW50LCBpbnQ2NF90IHJlc3VsdEVycm9yQ291bnQsIGJvb2wgZGV2aWNlRXJyb3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgbVNlc3Npb25TdGF0cy5tTmV3Q2FtZXJhU3RhdGUgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9TVEFURV9JRExFOworICAgIG1TZXNzaW9uU3RhdHMubVJlcXVlc3RDb3VudCA9IHJlcXVlc3RDb3VudDsKKyAgICBtU2Vzc2lvblN0YXRzLm1SZXN1bHRFcnJvckNvdW50ID0gcmVzdWx0RXJyb3JDb3VudDsKKyAgICBtU2Vzc2lvblN0YXRzLm1EZXZpY2VFcnJvciA9IGRldmljZUVycm9yOworICAgIG1TZXNzaW9uU3RhdHMubVN0cmVhbVN0YXRzID0gc3RyZWFtU3RhdHM7CisgICAgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZShtU2Vzc2lvblN0YXRzKTsKKworICAgIG1TZXNzaW9uU3RhdHMubUludGVybmFsUmVjb25maWd1cmUgPSAwOworICAgIG1TZXNzaW9uU3RhdHMubVN0cmVhbVN0YXRzLmNsZWFyKCk7Cit9CisKKy8qKgorICogQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlciBmdW5jdGlvbnMKKyAqLworCitzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKSB7CisjaWZuZGVmIF9fQlJJTExPX18KKyAgICBNdXRleDo6QXV0b2xvY2sgYWwoc1Byb3h5TXV0ZXgpOworICAgIGlmIChzQ2FtZXJhU2VydmljZVByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICAvLyBVc2UgY2hlY2tTZXJ2aWNlIGJlY2F1c2UgY2FtZXJhc2VydmVyIG5vcm1hbGx5IHN0YXJ0cyBiZWZvcmUgdGhlCisgICAgICAgIC8vIHN5c3RlbSBzZXJ2ZXIgYW5kIHRoZSBwcm94eSBzZXJ2aWNlLiBTbyB0aGUgbG9uZyB0aW1lb3V0IHRoYXQgZ2V0U2VydmljZQorICAgICAgICAvLyBoYXMgYmVmb3JlIGdpdmluZyB1cCBpcyBpbmFwcHJvcHJpYXRlLgorICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEucHJveHkiKSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc0NhbWVyYVNlcnZpY2VQcm94eSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlUHJveHk+KGJpbmRlcik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc0NhbWVyYVNlcnZpY2VQcm94eTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgeworICAgIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IHByb3h5QmluZGVyID0gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7CisgICAgaWYgKHByb3h5QmluZGVyID09IG51bGxwdHIpIHJldHVybjsKKyAgICBwcm94eUJpbmRlci0+cGluZ0ZvclVzZXJVcGRhdGUoKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjppc1JvdGF0ZUFuZENyb3BPdmVycmlkZU5lZWRlZCgKKyAgICAgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCBzZW5zb3JPcmllbnRhdGlvbiwgaW50IGxlbnNGYWNpbmcpIHsKKyAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOworICAgIGlmIChwcm94eUJpbmRlciA9PSBudWxscHRyKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgYXV0byBzdGF0dXMgPSBwcm94eUJpbmRlci0+aXNSb3RhdGVBbmRDcm9wT3ZlcnJpZGVOZWVkZWQocGFja2FnZU5hbWUsIHNlbnNvck9yaWVudGF0aW9uLAorICAgICAgICAgICAgbGVuc0ZhY2luZywgJnJldCk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGR1cmluZyB0b3AgYWN0aXZpdHkgb3JpZW50YXRpb24gcXVlcnk6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0YXR1cy5leGNlcHRpb25NZXNzYWdlKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjp1cGRhdGVQcm94eURldmljZVN0YXRlKGNvbnN0IENhbWVyYVNlc3Npb25TdGF0cyYgc2Vzc2lvblN0YXRzKSB7CisgICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKKyAgICBpZiAocHJveHlCaW5kZXIgPT0gbnVsbHB0cikgcmV0dXJuOworICAgIHByb3h5QmluZGVyLT5ub3RpZnlDYW1lcmFTdGF0ZShzZXNzaW9uU3RhdHMpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ1N0cmVhbUNvbmZpZ3VyZWQoY29uc3QgU3RyaW5nOCYgaWQsCisgICAgICAgIGludCBvcGVyYXRpbmdNb2RlLCBib29sIGludGVybmFsQ29uZmlnLCBpbnQzMl90IGxhdGVuY3lNcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPiBzZXNzaW9uU3RhdHM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIHNlc3Npb25TdGF0cyA9IG1TZXNzaW9uU3RhdHNNYXBbaWRdOworICAgICAgICBpZiAoc2Vzc2lvblN0YXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU2Vzc2lvblN0YXRzTWFwIHNob3VsZCBjb250YWluIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXM6IGlkICVzLCBvcGVyYXRpbmdNb2RlICVkLCBpbnRlcm5hbENvbmZpZyAlZCwgbGF0ZW5jeU1zICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgb3BlcmF0aW5nTW9kZSwgaW50ZXJuYWxDb25maWcsIGxhdGVuY3lNcyk7CisgICAgc2Vzc2lvblN0YXRzLT5vblN0cmVhbUNvbmZpZ3VyZWQob3BlcmF0aW5nTW9kZSwgaW50ZXJuYWxDb25maWcsIGxhdGVuY3lNcyk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nQWN0aXZlKGNvbnN0IFN0cmluZzgmIGlkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc2Vzc2lvblN0YXRzID0gbVNlc3Npb25TdGF0c01hcFtpZF07CisgICAgICAgIGlmIChzZXNzaW9uU3RhdHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uU3RhdHNNYXAgc2hvdWxkIGNvbnRhaW4gY2FtZXJhICVzIHdoZW4gbG9nQWN0aXZlIGlzIGNhbGxlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXM6IGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKKyAgICBzZXNzaW9uU3RhdHMtPm9uQWN0aXZlKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlcjo6bG9nSWRsZShjb25zdCBTdHJpbmc4JiBpZCwKKyAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0cmVhbVN0YXRzPiYgc3RyZWFtU3RhdHMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4gc2Vzc2lvblN0YXRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBzZXNzaW9uU3RhdHMgPSBtU2Vzc2lvblN0YXRzTWFwW2lkXTsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvblN0YXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uU3RhdHNNYXAgc2hvdWxkIGNvbnRhaW4gY2FtZXJhICVzIHdoZW4gbG9nSWRsZSBpcyBjYWxsZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IGlkICVzLCByZXF1ZXN0Q291bnQgJSIgUFJJZDY0ICIsIHJlc3VsdEVycm9yQ291bnQgJSIgUFJJZDY0ICIsIGRldmljZUVycm9yICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1TdGF0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVigiJXM6IHN0cmVhbVN0YXRzWyV6dV06IHcgJWQgaCAlZCwgcmVxdWVzdGVkQ291bnQgJSIgUFJJZDY0ICIsIGRyb3BDb3VudCAlIgorICAgICAgICAgICAgICAgIFBSSWQ2NCAiLCBzdGFydFRpbWVNcyAlZCIgLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaSwgc3RyZWFtU3RhdHNbaV0ubVdpZHRoLCBzdHJlYW1TdGF0c1tpXS5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzW2ldLm1SZXF1ZXN0Q291bnQsIHN0cmVhbVN0YXRzW2ldLm1FcnJvckNvdW50LAorICAgICAgICAgICAgICAgIHN0cmVhbVN0YXRzW2ldLm1TdGFydExhdGVuY3lNcyk7CisgICAgfQorCisgICAgc2Vzc2lvblN0YXRzLT5vbklkbGUocmVxdWVzdENvdW50LCByZXN1bHRFcnJvckNvdW50LCBkZXZpY2VFcnJvciwgc3RyZWFtU3RhdHMpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXI6OmxvZ09wZW4oY29uc3QgU3RyaW5nOCYgaWQsIGludCBmYWNpbmcsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBpc05kaywKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVNlc3Npb25TdGF0c1dyYXBwZXI+IHNlc3Npb25TdGF0czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1TZXNzaW9uU3RhdHNNYXAuY291bnQoaWQpID4gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uU3RhdHNNYXAgc2hvdWxkbid0IGNvbnRhaW4gY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhcGlMZXZlbCA9IENhbWVyYVNlc3Npb25TdGF0czo6Q0FNRVJBX0FQSV9MRVZFTF8xOworICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gMikgeworICAgICAgICAgICAgYXBpTGV2ZWwgPSBDYW1lcmFTZXNzaW9uU3RhdHM6OkNBTUVSQV9BUElfTEVWRUxfMjsKKyAgICAgICAgfQorCisgICAgICAgIHNlc3Npb25TdGF0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4oU3RyaW5nMTYoaWQpLCBmYWNpbmcsCisgICAgICAgICAgICAgICAgQ2FtZXJhU2Vzc2lvblN0YXRzOjpDQU1FUkFfU1RBVEVfT1BFTiwgY2xpZW50UGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgYXBpTGV2ZWwsIGlzTmRrLCBsYXRlbmN5TXMpOworICAgICAgICBtU2Vzc2lvblN0YXRzTWFwLmVtcGxhY2UoaWQsIHNlc3Npb25TdGF0cyk7CisgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IGlkICVzLCBmYWNpbmcgJWQsIGVmZmVjdGl2ZUFwaUxldmVsICVkLCBpc05kayAlZCwgbGF0ZW5jeU1zICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgZmFjaW5nLCBlZmZlY3RpdmVBcGlMZXZlbCwgaXNOZGssIGxhdGVuY3lNcyk7CisgICAgc2Vzc2lvblN0YXRzLT5vbk9wZW4oKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyOjpsb2dDbG9zZShjb25zdCBTdHJpbmc4JiBpZCwgaW50MzJfdCBsYXRlbmN5TXMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcj4gc2Vzc2lvblN0YXRzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBpZiAobVNlc3Npb25TdGF0c01hcC5jb3VudChpZCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uU3RhdHNNYXAgc2hvdWxkIGNvbnRhaW4gY2FtZXJhICVzIGJlZm9yZSBpdCdzIGNsb3NlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzZXNzaW9uU3RhdHMgPSBtU2Vzc2lvblN0YXRzTWFwW2lkXTsKKyAgICAgICAgaWYgKHNlc3Npb25TdGF0cyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb25TdGF0c01hcCBzaG91bGQgY29udGFpbiBjYW1lcmEgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1TZXNzaW9uU3RhdHNNYXAuZXJhc2UoaWQpOworICAgICAgICBBTE9HVigiJXM6IEVyYXNpbmcgaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCkpOworICAgIH0KKworICAgIEFMT0dWKCIlczogaWQgJXMsIGxhdGVuY3lNcyAlZCIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbGF0ZW5jeU1zKTsKKyAgICBzZXNzaW9uU3RhdHMtPm9uQ2xvc2UobGF0ZW5jeU1zKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVNlcnZpY2VQcm94eVdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDlkYjY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhU2VydmljZVByb3h5V3JhcHBlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFUlZJQ0VfUFJPWFlfV1JBUFBFUl9IXworI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX1NFUlZJQ0VfUFJPWFlfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZVByb3h5Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFTZXNzaW9uU3RhdHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFTZXJ2aWNlUHJveHlXcmFwcGVyIHsKK3ByaXZhdGU6CisgICAgLy8gR3VhcmQgbUNhbWVyYVNlcnZpY2VQcm94eQorICAgIHN0YXRpYyBNdXRleCBzUHJveHlNdXRleDsKKyAgICAvLyBDYWNoZWQgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZSBwcm94eSBpbiBzeXN0ZW0gc2VydmljZQorICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gc0NhbWVyYVNlcnZpY2VQcm94eTsKKworICAgIHN0cnVjdCBDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyIHsKKyAgICAgICAgaGFyZHdhcmU6OkNhbWVyYVNlc3Npb25TdGF0cyBtU2Vzc2lvblN0YXRzOworICAgICAgICBNdXRleCBtTG9jazsgLy8gbG9jayBmb3IgcGVyIGNhbWVyYSBzZXNzaW9uIHN0YXRzCisKKyAgICAgICAgQ2FtZXJhU2Vzc2lvblN0YXRzV3JhcHBlcihjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBuZXdDYW1lcmFTdGF0ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50TmFtZSwgaW50IGFwaUxldmVsLCBib29sIGlzTmRrLCBpbnQzMl90IGxhdGVuY3lNcykgOgorICAgICAgICAgICAgbVNlc3Npb25TdGF0cyhjYW1lcmFJZCwgZmFjaW5nLCBuZXdDYW1lcmFTdGF0ZSwgY2xpZW50TmFtZSwgYXBpTGV2ZWwsIGlzTmRrLCBsYXRlbmN5TXMpCisgICAgICAgICAgICB7fQorCisgICAgICAgIHZvaWQgb25PcGVuKCk7CisgICAgICAgIHZvaWQgb25DbG9zZShpbnQzMl90IGxhdGVuY3lNcyk7CisgICAgICAgIHZvaWQgb25TdHJlYW1Db25maWd1cmVkKGludCBvcGVyYXRpbmdNb2RlLCBib29sIGludGVybmFsUmVjb25maWcsIGludDMyX3QgbGF0ZW5jeU1zKTsKKyAgICAgICAgdm9pZCBvbkFjdGl2ZSgpOworICAgICAgICB2b2lkIG9uSWRsZShpbnQ2NF90IHJlcXVlc3RDb3VudCwgaW50NjRfdCByZXN1bHRFcnJvckNvdW50LCBib29sIGRldmljZUVycm9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKyAgICB9OworCisgICAgLy8gTG9jayBmb3IgY2FtZXJhIHNlc3Npb24gc3RhdHMgbWFwCisgICAgc3RhdGljIE11dGV4IG1Mb2NrOworICAgIC8vIE1hcCBmcm9tIGNhbWVyYSBpZCB0byB0aGUgY2FtZXJhJ3Mgc2Vzc2lvbiBzdGF0aXN0aWNzCisgICAgc3RhdGljIHN0ZDo6bWFwPFN0cmluZzgsIHN0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXNzaW9uU3RhdHNXcmFwcGVyPj4gbVNlc3Npb25TdGF0c01hcDsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc2Vzc2lvbiBzdGF0cyBvZiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UgKG9wZW4vY2xvc2UvYWN0aXZlL2lkbGUpIHdpdGgKKyAgICAgKiB0aGUgY2FtZXJhIHByb3h5IHNlcnZpY2UgaW4gdGhlIHN5c3RlbSBzZXJ2aWNlCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdXBkYXRlUHJveHlEZXZpY2VTdGF0ZSgKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpDYW1lcmFTZXNzaW9uU3RhdHMmIHNlc3Npb25TdGF0cyk7CisKKyAgICBzdGF0aWMgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IGdldENhbWVyYVNlcnZpY2VQcm94eSgpOworCitwdWJsaWM6CisgICAgLy8gT3BlbgorICAgIHN0YXRpYyB2b2lkIGxvZ09wZW4oY29uc3QgU3RyaW5nOCYgaWQsIGludCBmYWNpbmcsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGludCBhcGlMZXZlbCwgYm9vbCBpc05kaywKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIENsb3NlCisgICAgc3RhdGljIHZvaWQgbG9nQ2xvc2UoY29uc3QgU3RyaW5nOCYgaWQsIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgc3RhdGljIHZvaWQgbG9nU3RyZWFtQ29uZmlndXJlZChjb25zdCBTdHJpbmc4JiBpZCwgaW50IG9wZXJhdGluZ01vZGUsIGJvb2wgaW50ZXJuYWxSZWNvbmZpZywKKyAgICAgICAgICAgIGludDMyX3QgbGF0ZW5jeU1zKTsKKworICAgIC8vIFNlc3Npb24gc3RhdGUgYmVjb21lcyBhY3RpdmUKKyAgICBzdGF0aWMgdm9pZCBsb2dBY3RpdmUoY29uc3QgU3RyaW5nOCYgaWQpOworCisgICAgLy8gU2Vzc2lvbiBzdGF0ZSBiZWNvbWVzIGlkbGUKKyAgICBzdGF0aWMgdm9pZCBsb2dJZGxlKGNvbnN0IFN0cmluZzgmIGlkLAorICAgICAgICAgICAgaW50NjRfdCByZXF1ZXN0Q291bnQsIGludDY0X3QgcmVzdWx0RXJyb3JDb3VudCwgYm9vbCBkZXZpY2VFcnJvciwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdHJlYW1TdGF0cz4mIHN0cmVhbVN0YXRzKTsKKworICAgIC8vIFBpbmcgY2FtZXJhIHNlcnZpY2UgcHJveHkgZm9yIHVzZXIgdXBkYXRlCisgICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworCisgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCB0b3AgYWN0aXZpdHkgbmVlZHMgYSByb3RhdGUgYW5kIGNyb3Agb3ZlcnJpZGUuCisgICAgc3RhdGljIGJvb2wgaXNSb3RhdGVBbmRDcm9wT3ZlcnJpZGVOZWVkZWQoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCBzZW5zb3JPcmllbnRhdGlvbiwKKyAgICAgICAgICAgIGludCBsZW5zRmFjaW5nKTsKK307CisKK30gLy8gYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9TRVJWSUNFX1BST1hZX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaAppbmRleCA2NGJlNmM1Li5kMTY0ODg1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCkBAIC0zMSw2ICszMSwzMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHJlc291cmNlX3BvbGljeSB7CiAKKy8vIFZhbHVlcyBmcm9tIGZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NMaXN0LmphdmEKK2NvbnN0IGludDMyX3QgSU5WQUxJRF9BREogPSAtMTAwMDA7Citjb25zdCBpbnQzMl90IFVOS05PV05fQURKID0gMTAwMTsKK2NvbnN0IGludDMyX3QgQ0FDSEVEX0FQUF9NQVhfQURKID0gOTk5OworY29uc3QgaW50MzJfdCBDQUNIRURfQVBQX01JTl9BREogPSA5MDA7Citjb25zdCBpbnQzMl90IENBQ0hFRF9BUFBfTE1LX0ZJUlNUX0FESiA9IDk1MDsKK2NvbnN0IGludDMyX3QgQ0FDSEVEX0FQUF9JTVBPUlRBTkNFX0xFVkVMUyA9IDU7Citjb25zdCBpbnQzMl90IFNFUlZJQ0VfQl9BREogPSA4MDA7Citjb25zdCBpbnQzMl90IFBSRVZJT1VTX0FQUF9BREogPSA3MDA7Citjb25zdCBpbnQzMl90IEhPTUVfQVBQX0FESiA9IDYwMDsKK2NvbnN0IGludDMyX3QgU0VSVklDRV9BREogPSA1MDA7Citjb25zdCBpbnQzMl90IEhFQVZZX1dFSUdIVF9BUFBfQURKID0gNDAwOworY29uc3QgaW50MzJfdCBCQUNLVVBfQVBQX0FESiA9IDMwMDsKK2NvbnN0IGludDMyX3QgUEVSQ0VQVElCTEVfTE9XX0FQUF9BREogPSAyNTA7Citjb25zdCBpbnQzMl90IFBFUkNFUFRJQkxFX01FRElVTV9BUFBfQURKID0gMjI1OworY29uc3QgaW50MzJfdCBQRVJDRVBUSUJMRV9BUFBfQURKID0gMjAwOworY29uc3QgaW50MzJfdCBWSVNJQkxFX0FQUF9BREogPSAxMDA7Citjb25zdCBpbnQzMl90IFZJU0lCTEVfQVBQX0xBWUVSX01BWCA9IFBFUkNFUFRJQkxFX0FQUF9BREogLSBWSVNJQkxFX0FQUF9BREogLSAxOworY29uc3QgaW50MzJfdCBQRVJDRVBUSUJMRV9SRUNFTlRfRk9SRUdST1VORF9BUFBfQURKID0gNTA7Citjb25zdCBpbnQzMl90IEZPUkVHUk9VTkRfQVBQX0FESiA9IDA7Citjb25zdCBpbnQzMl90IFBFUlNJU1RFTlRfU0VSVklDRV9BREogPSAtNzAwOworY29uc3QgaW50MzJfdCBQRVJTSVNURU5UX1BST0NfQURKID0gLTgwMDsKK2NvbnN0IGludDMyX3QgU1lTVEVNX0FESiA9IC05MDA7Citjb25zdCBpbnQzMl90IE5BVElWRV9BREogPSAtMTAwMDsKKwogY2xhc3MgQ2xpZW50UHJpb3JpdHkgewogcHVibGljOgogICAgIC8qKgpAQCAtMzksMTggKzY0LDI2IEBACiAgICAgICogY2FzZSB3aGVyZSB0aGUgY29uc3RydWN0aW9uIGlzIG9mZmxvYWRlZCB0byBhbm90aGVyIHRocmVhZCB3aGljaCBpc24ndCBhCiAgICAgICogaHdiaW5kZXIgdGhyZWFkLgogICAgICAqLwotICAgIENsaWVudFByaW9yaXR5KGludDMyX3Qgc2NvcmUsIGludDMyX3Qgc3RhdGUsIGJvb2wgaXNWZW5kb3JDbGllbnQpIDoKLSAgICAgICAgICAgIG1TY29yZShzY29yZSksIG1TdGF0ZShzdGF0ZSksIG1Jc1ZlbmRvckNsaWVudChpc1ZlbmRvckNsaWVudCkgeyB9CisgICAgQ2xpZW50UHJpb3JpdHkoaW50MzJfdCBzY29yZSwgaW50MzJfdCBzdGF0ZSwgYm9vbCBpc1ZlbmRvckNsaWVudCwgaW50MzJfdCBzY29yZU9mZnNldCA9IDApIDoKKyAgICAgICAgICAgIG1Jc1ZlbmRvckNsaWVudChpc1ZlbmRvckNsaWVudCksIG1TY29yZU9mZnNldChzY29yZU9mZnNldCkgeworICAgICAgICBzZXRTY29yZShzY29yZSk7CisgICAgICAgIHNldFN0YXRlKHN0YXRlKTsKKyAgICB9CiAKICAgICBpbnQzMl90IGdldFNjb3JlKCkgY29uc3QgeyByZXR1cm4gbVNjb3JlOyB9CiAgICAgaW50MzJfdCBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TdGF0ZTsgfQorICAgIGludDMyX3QgaXNWZW5kb3JDbGllbnQoKSBjb25zdCB7IHJldHVybiBtSXNWZW5kb3JDbGllbnQ7IH0KIAogICAgIHZvaWQgc2V0U2NvcmUoaW50MzJfdCBzY29yZSkgewogICAgICAgICAvLyBGb3IgdmVuZG9yIGNsaWVudHMsIHRoZSBzY29yZSBpcyBzZXQgb25jZSBhbmQgZm9yIGFsbCBkdXJpbmcKICAgICAgICAgLy8gY29uc3RydWN0aW9uLiBPdGhlcndpc2UsIGl0IGNhbiBnZXQgcmVzZXQgZWFjaCB0aW1lIGNhbWVyYXNlcnZlcgogICAgICAgICAvLyBxdWVyaWVzIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgZm9yIG9vbV9hZGogc2NvcmVzIC8gc3RhdGVzIC4KLSAgICAgICAgaWYgKCFtSXNWZW5kb3JDbGllbnQpIHsKLSAgICAgICAgICAgIG1TY29yZSA9IHNjb3JlOworICAgICAgICAvLyBGb3IgY2xpZW50cyB3aGVyZSB0aGUgc2NvcmUgb2Zmc2V0IGlzIHNldCBieSB0aGUgYXBwLCBhZGQgaXQgdG8gdGhlCisgICAgICAgIC8vIHNjb3JlIHByb3ZpZGVkIGJ5IEFjdGl2aXR5TWFuYWdlclNlcnZpY2UuCisgICAgICAgIGlmIChzY29yZSA9PSBJTlZBTElEX0FESikgeworICAgICAgICAgICAgbVNjb3JlID0gVU5LTk9XTl9BREo7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2NvcmUgPSBtU2NvcmVPZmZzZXQgKyBzY29yZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjAsOSArOTMsNyBAQAogICAgICAgLy8gcXVlcmllcyBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIGZvciBvb21fYWRqIHNjb3JlcyAvIHN0YXRlcwogICAgICAgLy8gKEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgcmV0dXJucyBhIHZlbmRvciBwcm9jZXNzJyBzdGF0ZSBhcwogICAgICAgLy8gUFJPQ0VTU19TVEFURV9OT05FWElTVEVOVC4KLSAgICAgIGlmICghbUlzVmVuZG9yQ2xpZW50KSB7Ci0gICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICB9CisgICAgICBtU3RhdGUgPSBzdGF0ZTsKICAgICB9CiAKICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2xpZW50UHJpb3JpdHkmIHJocykgY29uc3QgewpAQCAtOTMsNiArMTI0LDcgQEAKICAgICAgICAgaW50MzJfdCBtU2NvcmU7CiAgICAgICAgIGludDMyX3QgbVN0YXRlOwogICAgICAgICBib29sIG1Jc1ZlbmRvckNsaWVudCA9IGZhbHNlOworICAgICAgICBpbnQzMl90IG1TY29yZU9mZnNldCA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDkgKzE0MiwxMCBAQAogcHVibGljOgogICAgIENsaWVudERlc2NyaXB0b3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsCi0gICAgICAgICAgICBib29sIGlzVmVuZG9yQ2xpZW50KTsKKyAgICAgICAgICAgIGJvb2wgaXNWZW5kb3JDbGllbnQsIGludDMyX3Qgb29tU2NvcmVPZmZzZXQpOwogICAgIENsaWVudERlc2NyaXB0b3IoS0VZJiYga2V5LCBWQUxVRSYmIHZhbHVlLCBpbnQzMl90IGNvc3QsIHN0ZDo6c2V0PEtFWT4mJiBjb25mbGljdGluZ0tleXMsCi0gICAgICAgICAgICBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsIGJvb2wgaXNWZW5kb3JDbGllbnQpOworICAgICAgICAgICAgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLCBib29sIGlzVmVuZG9yQ2xpZW50LAorICAgICAgICAgICAgaW50MzJfdCBvb21TY29yZU9mZnNldCk7CiAKICAgICB+Q2xpZW50RGVzY3JpcHRvcigpOwogCkBAIC0xNzcsMTggKzIxMCwxOCBAQAogdGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OkNsaWVudERlc2NyaXB0b3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAogICAgICAgICBjb25zdCBzdGQ6OnNldDxLRVk+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSwKLSAgICAgICAgYm9vbCBpc1ZlbmRvckNsaWVudCkgOgorICAgICAgICBib29sIGlzVmVuZG9yQ2xpZW50LCBpbnQzMl90IHNjb3JlT2Zmc2V0KSA6CiAgICAgICAgIG1LZXl7a2V5fSwgbVZhbHVle3ZhbHVlfSwgbUNvc3R7Y29zdH0sIG1Db25mbGljdGluZ3tjb25mbGljdGluZ0tleXN9LAotICAgICAgICBtUHJpb3JpdHkoc2NvcmUsIHN0YXRlLCBpc1ZlbmRvckNsaWVudCksCisgICAgICAgIG1Qcmlvcml0eShzY29yZSwgc3RhdGUsIGlzVmVuZG9yQ2xpZW50LCBzY29yZU9mZnNldCksCiAgICAgICAgIG1Pd25lcklke293bmVySWR9IHt9CiAKIHRlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpDbGllbnREZXNjcmlwdG9yKEtFWSYmIGtleSwgVkFMVUUmJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAogICAgICAgICBzdGQ6OnNldDxLRVk+JiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsCi0gICAgICAgIGJvb2wgaXNWZW5kb3JDbGllbnQpIDoKKyAgICAgICAgYm9vbCBpc1ZlbmRvckNsaWVudCwgaW50MzJfdCBzY29yZU9mZnNldCkgOgogICAgICAgICBtS2V5e3N0ZDo6Zm9yd2FyZDxLRVk+KGtleSl9LCBtVmFsdWV7c3RkOjpmb3J3YXJkPFZBTFVFPih2YWx1ZSl9LCBtQ29zdHtjb3N0fSwKICAgICAgICAgbUNvbmZsaWN0aW5ne3N0ZDo6Zm9yd2FyZDxzdGQ6OnNldDxLRVk+Pihjb25mbGljdGluZ0tleXMpfSwKLSAgICAgICAgbVByaW9yaXR5KHNjb3JlLCBzdGF0ZSwgaXNWZW5kb3JDbGllbnQpLCBtT3duZXJJZHtvd25lcklkfSB7fQorICAgICAgICBtUHJpb3JpdHkoc2NvcmUsIHN0YXRlLCBpc1ZlbmRvckNsaWVudCwgc2NvcmVPZmZzZXQpLCBtT3duZXJJZHtvd25lcklkfSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgogQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6fkNsaWVudERlc2NyaXB0b3IoKSB7fQpAQCAtMjM5LDYgKzI3Miw5IEBACiAgICAgLy8gb2ZmIGluIHRoZSBpbmNvbWluZyBwcmlvcml0eSBhcmd1bWVudCBzaW5jZSBhbiBBSURMIHRocmVhZCBtaWdodCBoYXZlCiAgICAgLy8gY2FsbGVkIGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpID09IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUiBhZnRlciByZWZyZXNoaW5nCiAgICAgLy8gcHJpb3JpdGllcyBmb3Igb2xkIGNsaWVudHMgdGhyb3VnaCBQcm9jZXNzSW5mb1NlcnZpY2U6OmdldFByb2Nlc3NTdGF0ZXNTY29yZXNGcm9tUGlkcygpLgorICAgIGlmIChtUHJpb3JpdHkuaXNWZW5kb3JDbGllbnQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIG1Qcmlvcml0eS5zZXRTY29yZShwcmlvcml0eS5nZXRTY29yZSgpKTsKICAgICBtUHJpb3JpdHkuc2V0U3RhdGUocHJpb3JpdHkuZ2V0U3RhdGUoKSk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcAppbmRleCA4YTAzMDNhLi40ODU3MDVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKQEAgLTkxNiwxMSArOTE2LDI1IEBACiAgICAgICAgIEFMT0dWKCIlczogQ2Fubm90IGZpbmQgZm9jYWwgbGVuZ3RoIGluIG1ldGFkYXRhLiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogCisgICAgaW50MzJfdCBzZW5zb3JQaXhlbE1vZGUgPSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQ7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHNlbnNvclBpeGVsTW9kZUVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFKTsKKyAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlRW50cnkuY291bnQgIT0gMCkgeworICAgICAgICBzZW5zb3JQaXhlbE1vZGUgPSBzZW5zb3JQaXhlbE1vZGVFbnRyeS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCB8fAorICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2RlICE9IEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcXVlc3Qgc2Vuc29yIHBpeGVsIG1vZGUgaXMgbm90IG9uZSBvZiB0aGUgdmFsaWQgdmFsdWVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlbnNvclBpeGVsTW9kZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50MzJfdCBhY3RpdmVBcnJheVRhZyA9IHNlbnNvclBpeGVsTW9kZSA9PSBBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTiA/CisgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFX01BWElNVU1fUkVTT0xVVElPTiA6CisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkU7CiAgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTikgJiYKLSAgICAgICAgICAgIHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpKSB7CisgICAgICAgICAgICBzdGF0aWNJbmZvLmV4aXN0cyhhY3RpdmVBcnJheVRhZykpIHsKICAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKTsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGFjdGl2ZUFycmF5RW50cnkgPQotICAgICAgICAgICAgICAgIHN0YXRpY0luZm8uZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKTsKKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoYWN0aXZlQXJyYXlUYWcpOwogCiAgICAgICAgIGlmICghc2V0RGlnaXRhbFpvb21SYXRpbyhlbnRyeS5kYXRhLmkzMlsyXSwgZW50cnkuZGF0YS5pMzJbM10sCiAgICAgICAgICAgICAgICAgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlsyXSwgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlszXSkpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKaW5kZXggODg4NjcxYy4uYTIzOWM4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5jcHAKQEAgLTEzLDIxICsxMyw4MzIgQEAKICAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKwogI2luY2x1ZGUgIlNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCIKLSNpbmNsdWRlICIuLi9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgorI2luY2x1ZGUgIi4uL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaCIKKyNpbmNsdWRlICIuLi9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgIi4uL0NhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaCIKKwordXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjptZXRhZGF0YTo6VjNfNjo6Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitpbnQzMl90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OlBFUkZfQ0xBU1NfTEVWRUwgPQorICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoInJvLm9kbS5idWlsZC5tZWRpYV9wZXJmb3JtYW5jZV9jbGFzcyIsIDApOworCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OklTX1BFUkZfQ0xBU1MgPSAoUEVSRl9DTEFTU19MRVZFTCA9PSBTREtfVkVSU0lPTl9TKTsKKworY2FtZXJhMzo6U2l6ZSBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRNYXhKcGVnUmVzb2x1dGlvbihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsCisgICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbikgeworICAgIGludDMyX3QgbWF4SnBlZ1dpZHRoID0gMCwgbWF4SnBlZ0hlaWdodCA9IDA7CisgICAgY29uc3QgaW50IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA0OworICAgIGNvbnN0IGludCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDA7CisgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgIGNvbnN0IGludCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDI7CisgICAgY29uc3QgaW50IFNUUkVBTV9JU19JTlBVVF9PRkZTRVQgPSAzOworCisgICAgaW50MzJfdCBzY2FsZXJTaXplc1RhZyA9IHVsdHJhSGlnaFJlc29sdXRpb24gPworICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT04gOgorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgbWV0YWRhdGEuZmluZChzY2FsZXJTaXplc1RhZyk7CisgICAgaWYgKGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCB8fAorICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudCAlIFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgIT0gMCkgeworICAgICAgICByZXR1cm4gY2FtZXJhMzo6U2l6ZSgwLCAwKTsKKyAgICB9CisKKyAgICAvLyBHZXQgbWF4IGpwZWcgc2l6ZSAoYXJlYS13aXNlKS4KKyAgICBmb3IgKHNpemVfdCBpPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaXNJbnB1dCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBpZiAoaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVAorICAgICAgICAgICAgICAgICYmIGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IgJiYKKyAgICAgICAgICAgICAgICAod2lkdGggKiBoZWlnaHQgPiBtYXhKcGVnV2lkdGggKiBtYXhKcGVnSGVpZ2h0KSkgeworICAgICAgICAgICAgbWF4SnBlZ1dpZHRoID0gd2lkdGg7CisgICAgICAgICAgICBtYXhKcGVnSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNhbWVyYTM6OlNpemUobWF4SnBlZ1dpZHRoLCBtYXhKcGVnSGVpZ2h0KTsKK30KKworc2l6ZV90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCisgICAgICAgIGNhbWVyYTM6OlNpemUgZGVmYXVsdE1heEpwZWdTaXplLCBzaXplX3QgZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplKSB7CisgICAgcmV0dXJuICh1aHJNYXhKcGVnU2l6ZS53aWR0aCAqIHVock1heEpwZWdTaXplLmhlaWdodCkgLworICAgICAgICAgICAgKGRlZmF1bHRNYXhKcGVnU2l6ZS53aWR0aCAqIGRlZmF1bHRNYXhKcGVnU2l6ZS5oZWlnaHQpICogZGVmYXVsdE1heEpwZWdCdWZmZXJTaXplOworfQorCit2b2lkIFN0cmVhbUNvbmZpZ3VyYXRpb246OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljSW5mbywgaW50IGNvbmZpZ3VyYXRpb24sCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+PiAqc2NtKSB7CisgICAgaWYgKHNjbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtQ29uZmlndXJhdGlvbk1hcCBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhdmFpbGFibGVTdHJlYW1Db25maWdzID0gc3RhdGljSW5mby5maW5kKGNvbmZpZ3VyYXRpb24pOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICAoKnNjbSlbZm9ybWF0XS5wdXNoX2JhY2soc2MpOworICAgIH0KK30KKwordm9pZCBTdHJlYW1Db25maWd1cmF0aW9uOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGJvb2wgbWF4UmVzLAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPj4gKnNjbSkgeworICAgIGludDMyX3Qgc2NhbGVyS2V5ID0KKyAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZygKKyAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgbWF4UmVzKTsKKworICAgIGludDMyX3QgZGVwdGhLZXkgPQorICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0QXBwcm9wcmlhdGVNb2RlVGFnKAorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsIG1heFJlcyk7CisKKyAgICBpbnQzMl90IGR5bmFtaWNEZXB0aEtleSA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKworICAgIGludDMyX3QgaGVpY0tleSA9CisgICAgICAgICAgICBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcHByb3ByaWF0ZU1vZGVUYWcoCisgICAgICAgICAgICAgICAgICAgIEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpOworCisgICAgZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoc3RhdGljSW5mbywgc2NhbGVyS2V5LCBzY20pOworICAgIGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKHN0YXRpY0luZm8sIGRlcHRoS2V5LCBzY20pOworICAgIGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKHN0YXRpY0luZm8sIGR5bmFtaWNEZXB0aEtleSwgc2NtKTsKKyAgICBnZXRTdHJlYW1Db25maWd1cmF0aW9ucyhzdGF0aWNJbmZvLCBoZWljS2V5LCBzY20pOworfQorCitpbnQzMl90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmdldEFwcHJvcHJpYXRlTW9kZVRhZyhpbnQzMl90IGRlZmF1bHRUYWcsIGJvb2wgbWF4UmVzb2x1dGlvbikgeworICAgIGlmICghbWF4UmVzb2x1dGlvbikgeworICAgICAgICByZXR1cm4gZGVmYXVsdFRhZzsKKyAgICB9CisgICAgc3dpdGNoIChkZWZhdWx0VGFnKSB7CisgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlNfTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OU19NQVhJTVVNX1JFU09MVVRJT047CisgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkU6CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9TRU5TT1JfT1BBUVVFX1JBV19TSVpFX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgY2FzZSBBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT05fTUFYSU1VTV9SRVNPTFVUSU9OOworICAgICAgICBjYXNlIEFORFJPSURfTEVOU19ESVNUT1JUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfTEVOU19ESVNUT1JUSU9OX01BWElNVU1fUkVTT0xVVElPTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVGFnICVkIGRvZXNuJ3QgaGF2ZSBhIG1heGltdW0gcmVzb2x1dGlvbiBjb3VudGVycGFydCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRhZyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpnZXRBcnJheVdpZHRoQW5kSGVpZ2h0KGNvbnN0IENhbWVyYU1ldGFkYXRhICpkZXZpY2VJbmZvLAorICAgICAgICBpbnQzMl90IGFycmF5VGFnLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgaWYgKHdpZHRoID09IG51bGxwdHIgfHwgaGVpZ2h0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB3aWR0aCAvIGhlaWdodCBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeTsKKyAgICBlbnRyeSA9IGRldmljZUluZm8tPmZpbmQoYXJyYXlUYWcpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSA0KSByZXR1cm4gZmFsc2U7CisgICAgKndpZHRoID0gZW50cnkuZGF0YS5pMzJbMl07CisgICAgKmhlaWdodCA9IGVudHJ5LmRhdGEuaTMyWzNdOworICAgIHJldHVybiB0cnVlOworfQorCitTdHJlYW1Db25maWd1cmF0aW9uUGFpcgorU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Z2V0U3RyZWFtQ29uZmlndXJhdGlvblBhaXIoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8pIHsKKyAgICBjYW1lcmEzOjpTdHJlYW1Db25maWd1cmF0aW9uUGFpciBzdHJlYW1Db25maWd1cmF0aW9uUGFpcjsKKyAgICBjYW1lcmEzOjpTdHJlYW1Db25maWd1cmF0aW9uOjpnZXRTdHJlYW1Db25maWd1cmF0aW9ucyhzdGF0aWNJbmZvLCBmYWxzZSwKKyAgICAgICAgICAgICZzdHJlYW1Db25maWd1cmF0aW9uUGFpci5tRGVmYXVsdFN0cmVhbUNvbmZpZ3VyYXRpb25NYXApOworICAgIGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb246OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKHN0YXRpY0luZm8sIHRydWUsCisgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvblBhaXIubU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcCk7CisgICAgcmV0dXJuIHN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyOworfQorCitpbnQ2NF90IFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmV1Y2xpZERpc3RTcXVhcmUoaW50MzJfdCB4MCwgaW50MzJfdCB5MCwgaW50MzJfdCB4MSwgaW50MzJfdCB5MSkgeworICAgIGludDY0X3QgZDAgPSB4MCAtIHgxOworICAgIGludDY0X3QgZDEgPSB5MCAtIHkxOworICAgIHJldHVybiBkMCAqIGQwICsgZDEgKiBkMTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3QoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sIC8qb3V0Ki9pbnQzMl90KiBvdXRXaWR0aCwKKyAgICAgICAgLypvdXQqL2ludDMyX3QqIG91dEhlaWdodCkgeworICAgIGNvbnN0IGludDMyX3QgZGVwdGhTaXplc1RhZyA9CisgICAgICAgICAgICBnZXRBcHByb3ByaWF0ZU1vZGVUYWcoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgICAgICAgICBtYXhSZXNvbHV0aW9uKTsKKyAgICBjb25zdCBpbnQzMl90IHNjYWxlclNpemVzVGFnID0KKyAgICAgICAgICAgIGdldEFwcHJvcHJpYXRlTW9kZVRhZyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBtYXhSZXNvbHV0aW9uKTsKKyAgICBjb25zdCBpbnQzMl90IGhlaWNTaXplc1RhZyA9CisgICAgICAgICAgICBnZXRBcHByb3ByaWF0ZU1vZGVUYWcoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgbWF4UmVzb2x1dGlvbik7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtQ29uZmlncyA9CisgICAgICAgICAgICAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpID8gaW5mby5maW5kKGRlcHRoU2l6ZXNUYWcpIDoKKyAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRikpID8KKyAgICAgICAgICAgIGluZm8uZmluZChoZWljU2l6ZXNUYWcpIDoKKyAgICAgICAgICAgIGluZm8uZmluZChzY2FsZXJTaXplc1RhZyk7CisKKyAgICBpbnQzMl90IGJlc3RXaWR0aCA9IC0xOworICAgIGludDMyX3QgYmVzdEhlaWdodCA9IC0xOworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGxpc3RlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMgYW5kIGZpbmQgdGhlIG9uZSB3aXRoIHRoZSBzbWFsbGVzdCBldWNsaWRlYW4KKyAgICAvLyBkaXN0YW5jZSBmcm9tIHRoZSBnaXZlbiBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gZm9ybWF0LgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtQ29uZmlncy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgIGludDMyX3QgZm10ID0gc3RyZWFtQ29uZmlncy5kYXRhLmkzMltpXTsKKyAgICAgICAgaW50MzJfdCB3ID0gc3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgMV07CisgICAgICAgIGludDMyX3QgaCA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIDJdOworCisgICAgICAgIC8vIElnbm9yZSBpbnB1dC9vdXRwdXQgdHlwZSBmb3Igbm93CisgICAgICAgIGlmIChmbXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICBpZiAodyA9PSB3aWR0aCAmJiBoID09IGhlaWdodCkgeworICAgICAgICAgICAgICAgIGJlc3RXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIGJlc3RIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPD0gUk9VTkRJTkdfV0lEVEhfQ0FQICYmIChiZXN0V2lkdGggPT0gLTEgfHwKKyAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6ZXVjbGlkRGlzdFNxdWFyZSh3LCBoLCB3aWR0aCwgaGVpZ2h0KSA8CisgICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmV1Y2xpZERpc3RTcXVhcmUoYmVzdFdpZHRoLCBiZXN0SGVpZ2h0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpKSkgeworICAgICAgICAgICAgICAgIGJlc3RXaWR0aCA9IHc7CisgICAgICAgICAgICAgICAgYmVzdEhlaWdodCA9IGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmVzdFdpZHRoID09IC0xKSB7CisgICAgICAgIC8vIFJldHVybiBmYWxzZSBpZiBubyBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBmb3JtYXQgd2VyZSBsaXN0ZWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNldCB0aGUgb3V0cHV0cyB0byB0aGUgY2xvc2V0IHdpZHRoL2hlaWdodAorICAgIGlmIChvdXRXaWR0aCAhPSBOVUxMKSB7CisgICAgICAgICpvdXRXaWR0aCA9IGJlc3RXaWR0aDsKKyAgICB9CisgICAgaWYgKG91dEhlaWdodCAhPSBOVUxMKSB7CisgICAgICAgICpvdXRIZWlnaHQgPSBiZXN0SGVpZ2h0OworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSBjb25maWd1cmF0aW9uIGZvciB0aGlzIGZvcm1hdCB3YXMgbGlzdGVkCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6aXNQdWJsaWNGb3JtYXQoaW50MzJfdCBmb3JtYXQpCit7CisgICAgc3dpdGNoKGZvcm1hdCkgeworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZMTY6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzEwOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTI6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2JpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNyZWF0ZVN1cmZhY2VGcm9tR2JwKAorICAgICAgICBPdXRwdXRTdHJlYW1JbmZvJiBzdHJlYW1JbmZvLCBib29sIGlzU3RyZWFtSW5mb1ZhbGlkLAorICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJnNlbnNvclBpeGVsTW9kZXNVc2VkKXsKKyAgICAvLyBidWZmZXJQcm9kdWNlciBtdXN0IGJlIG5vbi1udWxsCisgICAgaWYgKGdicCA9PSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFN1cmZhY2UgaXMgTlVMTCIsIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dXKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgLy8gSEFDSyBiLzEwOTQ5MTA1CisgICAgLy8gUXVlcnkgY29uc3VtZXIgdXNhZ2UgYml0cyB0byBzZXQgYXN5bmMgb3BlcmF0aW9uIG1vZGUgZm9yCisgICAgLy8gR0xDb25zdW1lciB1c2luZyBjb250cm9sbGVkQnlBcHAgcGFyYW1ldGVyLgorICAgIGJvb2wgdXNlQXN5bmMgPSBmYWxzZTsKKyAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMDsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaWYgKChlcnIgPSBnYnAtPmdldENvbnN1bWVyVXNhZ2UoJmNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBjb25zdW1lciB1c2FnZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKGNvbnN1bWVyVXNhZ2UgJiBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzIHdpdGggY29uc3VtZXIgdXNhZ2UgZmxhZzogJSIgUFJJdTY0ICI6IEZvcmNpbmcgYXN5bmNocm9ub3VzIG1vZGUgZm9yIgorICAgICAgICAgICAgICAgICJzdHJlYW0iLCBfX0ZVTkNUSU9OX18sIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgY29uc3VtZXJVc2FnZSk7CisgICAgICAgIHVzZUFzeW5jID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBkaXNhbGxvd2VkRmxhZ3MgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19WSURFT19FTkNPREVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBUOworICAgIHVpbnQ2NF90IGFsbG93ZWRGbGFncyA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX0NPTVBPU0VSOworICAgIGJvb2wgZmxleGlibGVDb25zdW1lciA9IChjb25zdW1lclVzYWdlICYgZGlzYWxsb3dlZEZsYWdzKSA9PSAwICYmCisgICAgICAgICAgICAoY29uc3VtZXJVc2FnZSAmIGFsbG93ZWRGbGFncykgIT0gMDsKKworICAgIHN1cmZhY2UgPSBuZXcgU3VyZmFjZShnYnAsIHVzZUFzeW5jKTsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworCisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGZvcm1hdDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2U7CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2Ugd2lkdGg6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0hFSUdIVCwgJmhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGhlaWdodDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKChlcnIgPSBhbnctPnF1ZXJ5KGFudywgTkFUSVZFX1dJTkRPV19GT1JNQVQsICZmb3JtYXQpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludCo+KCZkYXRhU3BhY2UpKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OLCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhpcyBvdmVycmlkZSBzaW5jZSB0aGUgZGVmYXVsdCBmb3JtYXQgc2hvdWxkIGJlCisgICAgLy8gICAgICAgSU1QTEVNRU5UQVRJT05fREVGSU5FRC4gYi85NDg3NDgyICYgYi8zNTMxNzk0NAorICAgIGlmICgoZm9ybWF0ID49IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4ICYmIGZvcm1hdCA8PSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCkgJiYKKyAgICAgICAgICAgICgoY29uc3VtZXJVc2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfTUFTSykgJiYKKyAgICAgICAgICAgICAoKGNvbnN1bWVyVXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPT0gMCkpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVzOiBPdmVycmlkaW5nIGZvcm1hdCAlI3ggdG8gSU1QTEVNRU5UQVRJT05fREVGSU5FRCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIGZvcm1hdCk7CisgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICB9CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzOworICAgIGlmIChjaGVja0FuZE92ZXJyaWRlU2Vuc29yUGl4ZWxNb2Rlc1VzZWQoc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIGZsZXhpYmxlQ29uc3VtZXIsICZvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2RlcykgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogc2Vuc29yIHBpeGVsIG1vZGVzIGZvciBzdHJlYW0gd2l0aCAiCisgICAgICAgICAgICAgICAgImZvcm1hdCAlI3ggYXJlIG5vdCB2YWxpZCIsbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGJvb2wgZm91bmRJbk1heFJlcyA9IGZhbHNlOworICAgIGlmIChvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlcy5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSAhPQorICAgICAgICAgICAgb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZGVmYXVsdCBzdHJlYW0gY29uZmlndXJhdGlvbiBtYXAKKyAgICAgICAgZm91bmRJbk1heFJlcyA9IHRydWU7CisgICAgfQorICAgIC8vIFJvdW5kIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgZGltZW5zaW9ucyBhdmFpbGFibGUgZm9yIHRoaXMgZm9ybWF0CisgICAgaWYgKGZsZXhpYmxlQ29uc3VtZXIgJiYgaXNQdWJsaWNGb3JtYXQoZm9ybWF0KSAmJgorICAgICAgICAgICAgIVNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdCh3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIGZvdW5kSW5NYXhSZXMsIC8qb3V0Ki8md2lkdGgsCisgICAgICAgICAgICAvKm91dCovJmhlaWdodCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogTm8gc3VwcG9ydGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoICIKKyAgICAgICAgICAgICAgICAiZm9ybWF0ICUjeCBkZWZpbmVkLCBmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW0iLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGlmICghaXNTdHJlYW1JbmZvVmFsaWQpIHsKKyAgICAgICAgc3RyZWFtSW5mby53aWR0aCA9IHdpZHRoOworICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgc3RyZWFtSW5mby5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBjb25zdW1lclVzYWdlOworICAgICAgICBzdHJlYW1JbmZvLnNlbnNvclBpeGVsTW9kZXNVc2VkID0gb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXM7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHdpZHRoICE9IHN0cmVhbUluZm8ud2lkdGgpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIHdpZHRoIGRvZXNuJ3QgbWF0Y2g6ICVkIHZzICVkIiwKKyAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIHdpZHRoLCBzdHJlYW1JbmZvLndpZHRoKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoaGVpZ2h0ICE9IHN0cmVhbUluZm8uaGVpZ2h0KSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6U3VyZmFjZSBoZWlnaHQgZG9lc24ndCBtYXRjaDogJWQgdnMgJWQiLAorICAgICAgICAgICAgICAgICBsb2dpY2FsQ2FtZXJhSWQuc3RyaW5nKCksIGhlaWdodCwgc3RyZWFtSW5mby5oZWlnaHQpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChmb3JtYXQgIT0gc3RyZWFtSW5mby5mb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIGZvcm1hdCBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCisgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgZm9ybWF0LCBzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBzdHJlYW1JbmZvLmRhdGFTcGFjZSkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczpTdXJmYWNlIGRhdGFTcGFjZSBkb2Vzbid0IG1hdGNoOiAlZCB2cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgZGF0YVNwYWNlLCBzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIC8vQXQgdGhlIG5hdGl2ZSBzaWRlLCB0aGVyZSBpc24ndCBhIHdheSB0byBjaGVjayB3aGV0aGVyIDIgc3VyZmFjZXMgY29tZSBmcm9tIHRoZSBzYW1lCisgICAgICAgIC8vc3VyZmFjZSBjbGFzcyB0eXBlLiBVc2UgdXNhZ2UgZmxhZyB0byBhcHByb3hpbWF0ZSB0aGUgY29tcGFyaXNvbi4KKyAgICAgICAgaWYgKGNvbnN1bWVyVXNhZ2UgIT0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIkNhbWVyYSAlczpTdXJmYWNlIHVzYWdlIGZsYWcgZG9lc24ndCBtYXRjaCAlIiBQUkl1NjQgIiB2cyAlIiBQUkl1NjQgIiIsCisgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZC5zdHJpbmcoKSwgY29uc3VtZXJVc2FnZSwgc3RyZWFtSW5mby5jb25zdW1lclVzYWdlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit2b2lkIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTM6OmNhbWVyYV9zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaW50MzJfdCBncm91cElkLCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cmVhbS0+djNfNC52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzQudjNfMi53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgc3RyZWFtLT52M180LnYzXzIuaGVpZ2h0ID0gc3RyZWFtSW5mby5oZWlnaHQ7CisgICAgc3RyZWFtLT52M180LnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfNC52M18yLnVzYWdlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9Db25zdW1lclVzYWdlKHUpOworICAgIHN0cmVhbS0+djNfNC52M18yLmRhdGFTcGFjZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvSGlkbERhdGFzcGFjZShzdHJlYW1JbmZvLmRhdGFTcGFjZSk7CisgICAgc3RyZWFtLT52M180LnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnYzXzQudjNfMi5pZCA9IC0xOyAvLyBJbnZhbGlkIHN0cmVhbSBpZAorICAgIHN0cmVhbS0+djNfNC5waHlzaWNhbENhbWVyYUlkID0gc3RkOjpzdHJpbmcocGh5c2ljYWxJZC5zdHJpbmcoKSk7CisgICAgc3RyZWFtLT52M180LmJ1ZmZlclNpemUgPSAwOworICAgIHN0cmVhbS0+Z3JvdXBJZCA9IGdyb3VwSWQ7CisgICAgc3RyZWFtLT5zZW5zb3JQaXhlbE1vZGVzVXNlZC5yZXNpemUoc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZC5zaXplKCkpOworICAgIHNpemVfdCBpZHggPSAwOworICAgIGZvciAoYXV0byBtb2RlIDogc3RyZWFtSW5mby5zZW5zb3JQaXhlbE1vZGVzVXNlZCkgeworICAgICAgICBzdHJlYW0tPnNlbnNvclBpeGVsTW9kZXNVc2VkW2lkeCsrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhTWV0YWRhdGFFbnVtQW5kcm9pZFNlbnNvclBpeGVsTW9kZT4obW9kZSk7CisgICAgfQorfQorCitiaW5kZXI6OlN0YXR1cyBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjaGVja1BoeXNpY2FsQ2FtZXJhSWQoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IFN0cmluZzggJnBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCkgeworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9CisgICAgaWYgKHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSkgPT0gcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCisgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrU3VyZmFjZVR5cGUoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpICB7CisgICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbnVtQnVmZmVyUHJvZHVjZXJzLCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlN1cmZhY2UgY291bnQgaXMgdG9vIGhpZ2giKTsKKyAgICB9IGVsc2UgaWYgKChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgJiYgKCFkZWZlcnJlZENvbnN1bWVyKSkgeworICAgICAgICBBTE9HRSgiJXM6IE51bWJlciBvZiBjb25zdW1lcnMgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiAxIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiTm8gdmFsaWQgY29uc3VtZXJzLiIpOworICAgIH0KKworICAgIGJvb2wgdmFsaWRTdXJmYWNlVHlwZSA9ICgoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgfHwKKyAgICAgICAgICAgIChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9URVhUVVJFKSk7CisKKyAgICBpZiAoZGVmZXJyZWRDb25zdW1lciAmJiAhdmFsaWRTdXJmYWNlVHlwZSkgeworICAgICAgICBBTE9HRSgiJXM6IFRhcmdldCBzdXJmYWNlIGhhcyBpbnZhbGlkIHN1cmZhY2VUeXBlID0gJWQuIiwgX19GVU5DVElPTl9fLCBzdXJmYWNlVHlwZSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHM6OmNoZWNrT3BlcmF0aW5nTW9kZShpbnQgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7CisgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBjYW1lcmFJZC5zdHJpbmcoKSwgb3BlcmF0aW5nTW9kZSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICBtc2cuc3RyaW5nKCkpOworICAgIH0KKworICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOworICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgYm9vbCBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQ09OU1RSQUlORURfSElHSF9TUEVFRF9WSURFTykgeworICAgICAgICAgICAgICAgIGlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCkgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgIkNhbWVyYSAlczogVHJ5IHRvIGNyZWF0ZSBhIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbiBvbiBhIGRldmljZSIKKyAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CiAKIGJpbmRlcjo6U3RhdHVzCiBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0VG9IQUxTdHJlYW1Db21iaW5hdGlvbigKICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBTdHJpbmc4ICZsb2dpY2FsQ2FtZXJhSWQsIGNvbnN0IENhbWVyYU1ldGFkYXRhICZkZXZpY2VJbmZvLAogICAgICAgICBtZXRhZGF0YUdldHRlciBnZXRNZXRhZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywKLSAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLCBib29sICplYXJseUV4aXQpIHsKLSAgICAvLyBUT0RPOiBodHRwOi8vYi8xNDgzMjkyOTggTW92ZSB0aGUgb3RoZXIgZGVwZW5kZW5jaWVzIGZyb20KLSAgICAvLyBDYW1lcmFEZXZpY2VDbGllbnQgaW50byBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLgotICAgIHJldHVybiBDYW1lcmFEZXZpY2VDbGllbnQ6OmNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKHNlc3Npb25Db25maWd1cmF0aW9uLCBsb2dpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBkZXZpY2VJbmZvLCBnZXRNZXRhZGF0YSwgcGh5c2ljYWxDYW1lcmFJZHMsIHN0cmVhbUNvbmZpZ3VyYXRpb24sIGVhcmx5RXhpdCk7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCBvdmVycmlkZUZvclBlcmZDbGFzcywgYm9vbCAqZWFybHlFeGl0KSB7CisKKyAgICBhdXRvIG9wZXJhdGluZ01vZGUgPSBzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRPcGVyYXRpbmdNb2RlKCk7CisgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gY2hlY2tPcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUsIGRldmljZUluZm8sIGxvZ2ljYWxDYW1lcmFJZCk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKGVhcmx5RXhpdCA9PSBudWxscHRyKSB7CisgICAgICAgIFN0cmluZzggbXNnKCJlYXJseUV4aXQgbnVsbHB0ciIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorICAgICplYXJseUV4aXQgPSBmYWxzZTsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmFfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90PiAob3BlcmF0aW5nTW9kZSksCisgICAgICAgICAgICAvKm91dCovICZzdHJlYW1Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgbWFwcGluZyBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBvcGVyYXRpbmdNb2RlLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpID4gMCk7CisgICAgYXV0byBvdXRwdXRDb25maWdzID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKyAgICBzaXplX3Qgc3RyZWFtQ291bnQgPSBvdXRwdXRDb25maWdzLnNpemUoKTsKKyAgICBzdHJlYW1Db3VudCA9IGlzSW5wdXRWYWxpZCA/IHN0cmVhbUNvdW50ICsgMSA6IHN0cmVhbUNvdW50OworICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOworICAgIGlmIChpc0lucHV0VmFsaWQpIHsKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPENhbWVyYU1ldGFkYXRhRW51bUFuZHJvaWRTZW5zb3JQaXhlbE1vZGU+IGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzOworICAgICAgICBkZWZhdWx0U2Vuc29yUGl4ZWxNb2Rlcy5yZXNpemUoMSk7CisgICAgICAgIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzWzBdID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFNZXRhZGF0YUVudW1BbmRyb2lkU2Vuc29yUGl4ZWxNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7CisgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10gPSB7e3svKnN0cmVhbUlkKi8wLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtVHlwZTo6SU5QVVQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dFdpZHRoKCkpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRIZWlnaHQoKSksCisgICAgICAgICAgICAgICAgQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpKSwKKyAgICAgICAgICAgICAgICAvKnVzYWdlKi8gMCwgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb246OlJPVEFUSU9OXzB9LAorICAgICAgICAgICAgICAgIC8qcGh5c2ljYWxJZCovIG51bGxwdHIsIC8qYnVmZmVyU2l6ZSovMH0sIC8qZ3JvdXBJZCovLTEsIGRlZmF1bHRTZW5zb3JQaXhlbE1vZGVzfTsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5tdWx0aVJlc29sdXRpb25JbnB1dEltYWdlID0KKyAgICAgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5pbnB1dElzTXVsdGlSZXNvbHV0aW9uKCk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG91dHB1dENvbmZpZ3MpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBidWZmZXJQcm9kdWNlcnMgPQorICAgICAgICAgICAgaXQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOworICAgICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBpdC5pc0RlZmVycmVkKCk7CisgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgoaXQuZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzZW5zb3JQaXhlbE1vZGVzVXNlZCA9IGl0LmdldFNlbnNvclBpeGVsTW9kZXNVc2VkKCk7CisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZwaHlzaWNhbERldmljZUluZm8gPSBnZXRNZXRhZGF0YShwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgIG92ZXJyaWRlRm9yUGVyZkNsYXNzKTsKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhQ2hvc2VuID0KKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDAgPyBwaHlzaWNhbERldmljZUluZm8gOiBkZXZpY2VJbmZvOworCisgICAgICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOworICAgICAgICBib29sIGlzU3RyZWFtSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgICAgIGludDMyX3QgZ3JvdXBJZCA9IGl0LmlzTXVsdGlSZXNvbHV0aW9uKCkgPyBpdC5nZXRTdXJmYWNlU2V0SUQoKSA6IC0xOworICAgICAgICBPdXRwdXRTdHJlYW1JbmZvIHN0cmVhbUluZm87CisKKyAgICAgICAgcmVzID0gY2hlY2tTdXJmYWNlVHlwZShudW1CdWZmZXJQcm9kdWNlcnMsIGRlZmVycmVkQ29uc3VtZXIsIGl0LmdldFN1cmZhY2VUeXBlKCkpOworICAgICAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWRzLCBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgIGxvZ2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgICAgICBzdHJlYW1JbmZvLndpZHRoID0gaXQuZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0ID0gaXQuZ2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZGF0YVNwYWNlID0gYW5kcm9pZF9kYXRhc3BhY2VfdDo6SEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgICAgICAgICAgYXV0byBzdXJmYWNlVHlwZSA9IGl0LmdldFN1cmZhY2VUeXBlKCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFOworICAgICAgICAgICAgaWYgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1ZJRVcpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmNvbnN1bWVyVXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2tBbmRPdmVycmlkZVNlbnNvclBpeGVsTW9kZXNVc2VkKHNlbnNvclBpeGVsTW9kZXNVc2VkLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIG1ldGFkYXRhQ2hvc2VuLCBmYWxzZSAvKmZsZXhpYmxlQ29uc3VtZXIqLywKKyAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUluZm8uc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIHN1cmZhY2Ugc2Vuc29yIHBpeGVsIG1vZGVzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWZlcnJlZCBzdXJmYWNlIHNlbnNvciBwaXhlbCBtb2RlcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgY2FtZXJhMzo6Q0FNRVJBX1NUUkVBTV9ST1RBVElPTl8wLCBwaHlzaWNhbENhbWVyYUlkLCBncm91cElkLAorICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChudW1CdWZmZXJQcm9kdWNlcnMgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBidWZmZXJQcm9kdWNlciA6IGJ1ZmZlclByb2R1Y2VycykgeworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLCBtZXRhZGF0YUNob3Nlbiwgc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpOworCisgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSBpbiB0byBhY2NvdW50IHRoYXQgY29tcG9zaXRlIHN0cmVhbXMgY2FuIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gY29tcG9zaXRlU3RyZWFtczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBUYWtlIGNhcmUgb2YgY29tcG9zaXRlIHN0cmVhbXMuCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLCAmY29tcG9zaXRlU3RyZWFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mbywgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgYWRkaW5nIGNvbXBvc2l0ZSBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbENhbWVyYUlkLnN0cmluZygpLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaW50ZXJuYWwgc3RyZWFtcyBtZWFucyBjb21wb3NpdGUgc3RyZWFtIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgKmVhcmx5RXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db3VudCArPSBjb21wb3NpdGVTdHJlYW1zLnNpemUoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKHN0cmVhbUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY29tcG9zaXRlU3RyZWFtIDogY29tcG9zaXRlU3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwU3RyZWFtSW5mbyhjb21wb3NpdGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9zdHJlYW1fcm90YXRpb25fdD4gKGl0LmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBncm91cElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXBTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgZ3JvdXBJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogfQogCi19Ly8gbmFtZXNwYWNlIGFuZHJvaWQKK3N0YXRpYyBib29sIGluU3RyZWFtQ29uZmlndXJhdGlvbk1hcChpbnQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+PiAmc20pIHsKKyAgICBhdXRvIHNjcyA9IHNtLmZpbmQoZm9ybWF0KTsKKyAgICBpZiAoc2NzID09IHNtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChhdXRvICZzYyA6IHNjcy0+c2Vjb25kKSB7CisgICAgICAgIGlmIChzYy53aWR0aCA9PSB3aWR0aCAmJiBzYy5oZWlnaHQgPT0gaGVpZ2h0ICYmIHNjLmlzSW5wdXQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+IGNvbnZlcnRUb1NldChjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKKyAgICByZXR1cm4gc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+KHNlbnNvclBpeGVsTW9kZXNVc2VkLmJlZ2luKCksIHNlbnNvclBpeGVsTW9kZXNVc2VkLmVuZCgpKTsKK30KKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlsczo6Y2hlY2tBbmRPdmVycmlkZVNlbnNvclBpeGVsTW9kZXNVc2VkKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWQsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGJvb2wgZmxleGlibGVDb25zdW1lciwKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGludDMyX3Q+ICpvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQpIHsKKworICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAmc2Vuc29yUGl4ZWxNb2Rlc1VzZWRTZXQgPQorICAgICAgICAgICAgY29udmVydFRvU2V0KHNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKyAgICBpZiAoIWlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihzdGF0aWNJbmZvKSkgeworICAgICAgICBpZiAoc2Vuc29yUGl4ZWxNb2Rlc1VzZWRTZXQuZmluZChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTikgIT0KKyAgICAgICAgICAgICAgICBzZW5zb3JQaXhlbE1vZGVzVXNlZFNldC5lbmQoKSkgeworICAgICAgICAgICAgLy8gaW52YWxpZCB2YWx1ZSBmb3Igbm9uIHVsdHJhIGhpZ2ggcmVzIHNlbnNvcnMKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkLT5jbGVhcigpOworICAgICAgICBvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQtPmluc2VydChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX0RFRkFVTFQpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgU3RyZWFtQ29uZmlndXJhdGlvblBhaXIgc3RyZWFtQ29uZmlndXJhdGlvblBhaXIgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihzdGF0aWNJbmZvKTsKKworICAgIGJvb2wgaXNJbkRlZmF1bHRTdHJlYW1Db25maWd1cmF0aW9uTWFwID0KKyAgICAgICAgICAgIGluU3RyZWFtQ29uZmlndXJhdGlvbk1hcChmb3JtYXQsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNvbmZpZ3VyYXRpb25QYWlyLm1EZWZhdWx0U3RyZWFtQ29uZmlndXJhdGlvbk1hcCk7CisKKyAgICBib29sIGlzSW5NYXhpbXVtUmVzb2x1dGlvblN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgPQorICAgICAgICAgICAgaW5TdHJlYW1Db25maWd1cmF0aW9uTWFwKGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvblBhaXIubU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcCk7CisKKyAgICAvLyBDYXNlIDE6IFRoZSBjbGllbnQgaGFzIG5vdCBjaGFuZ2VkIHRoZSBzZW5zb3IgbW9kZSBkZWZhdWx0cy4gSW4gdGhpcyBjYXNlLCB3ZSBjaGVjayBpZiB0aGUKKyAgICAvLyBzaXplICsgZm9ybWF0IG9mIHRoZSBPdXRwdXRDb25maWd1cmF0aW9uIGlzIGZvdW5kIGV4Y2x1c2l2ZWx5IGluIDEuCisgICAgLy8gSWYgeWVzLCBhZGQgdGhhdCBzZW5zb3JQaXhlbE1vZGUgdG8gb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXMuCisgICAgLy8gSWYgbm8sIGFkZCAnREVGQVVMVCcgdG8gc2Vuc29yUGl4ZWxNb2RlLiBUaGlzIG1haW50YWlucyBiYWNrd2FyZHMKKyAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgIGlmIChzZW5zb3JQaXhlbE1vZGVzVXNlZFNldC5zaXplKCkgPT0gMCkgeworICAgICAgICAvLyBBbWJpZ3VvdXMgY2FzZSwgZGVmYXVsdCB0byBvbmx5ICdERUZBVUxUJyBtb2RlLgorICAgICAgICBpZiAoaXNJbkRlZmF1bHRTdHJlYW1Db25maWd1cmF0aW9uTWFwICYmIGlzSW5NYXhpbXVtUmVzb2x1dGlvblN0cmVhbUNvbmZpZ3VyYXRpb25NYXApIHsKKyAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZC0+aW5zZXJ0KEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgZmxleGlibGUgY29uc3VtZXIgZm9yIG1heCByZXNvbHV0aW9uIG1vZGUuCisgICAgICAgIGlmIChpc0luTWF4aW11bVJlc29sdXRpb25TdHJlYW1Db25maWd1cmF0aW9uTWFwKSB7CisgICAgICAgICAgICBvdmVycmlkZGVuU2Vuc29yUGl4ZWxNb2Rlc1VzZWQtPmluc2VydChBTkRST0lEX1NFTlNPUl9QSVhFTF9NT0RFX01BWElNVU1fUkVTT0xVVElPTik7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5EZWZhdWx0U3RyZWFtQ29uZmlndXJhdGlvbk1hcCB8fCAoZmxleGlibGVDb25zdW1lciAmJiB3aWR0aCA8IFJPVU5ESU5HX1dJRFRIX0NBUCkpIHsKKyAgICAgICAgICAgIG92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZC0+aW5zZXJ0KEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDYXNlMjogVGhlIGFwcCBoYXMgc2V0IHNlbnNvclBpeGVsTW9kZXNVc2VkLCB3ZSBuZWVkIHRvIHZlcmlmeSB0aGF0IHRoZXkKKyAgICAvLyBhcmUgdmFsaWQgLyBlcnIgb3V0LgorICAgIGlmIChzZW5zb3JQaXhlbE1vZGVzVXNlZFNldC5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfREVGQVVMVCkgIT0KKyAgICAgICAgICAgIHNlbnNvclBpeGVsTW9kZXNVc2VkU2V0LmVuZCgpICYmICFpc0luRGVmYXVsdFN0cmVhbUNvbmZpZ3VyYXRpb25NYXApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgIGlmIChzZW5zb3JQaXhlbE1vZGVzVXNlZFNldC5maW5kKEFORFJPSURfU0VOU09SX1BJWEVMX01PREVfTUFYSU1VTV9SRVNPTFVUSU9OKSAhPQorICAgICAgICAgICAgc2Vuc29yUGl4ZWxNb2Rlc1VzZWRTZXQuZW5kKCkgJiYgIWlzSW5NYXhpbXVtUmVzb2x1dGlvblN0cmVhbUNvbmZpZ3VyYXRpb25NYXApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgKm92ZXJyaWRkZW5TZW5zb3JQaXhlbE1vZGVzVXNlZCA9IHNlbnNvclBpeGVsTW9kZXNVc2VkU2V0OworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjppc1VsdHJhSGlnaFJlc29sdXRpb25TZW5zb3IoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmRldmljZUluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUNhcDsKKyAgICBlbnRyeUNhcCA9IGRldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgLy8gR28gdGhyb3VnaCB0aGUgY2FwYWJpbGl0aWVzIGFuZCBjaGVjayBpZiBpdCBoYXMKKyAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19VTFRSQV9ISUdIX1JFU09MVVRJT05fU0VOU09SCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1VMVFJBX0hJR0hfUkVTT0xVVElPTl9TRU5TT1IpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjpjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM0LAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzc6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNykgeworICAgIGlmIChzdHJlYW1Db25maWdWMzcubXVsdGlSZXNvbHV0aW9uSW5wdXRJbWFnZSkgeworICAgICAgICAvLyBJQ2FtZXJhRGV2aWNlIG9sZGVyIHRoYW4gMy43IGRvZXNuJ3Qgc3VwcG9ydCBtdWx0aS1yZXNvbHV0aW9uIGlucHV0IGltYWdlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXMucmVzaXplKHN0cmVhbUNvbmZpZ1YzNy5zdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1Db25maWdWMzcuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoc3RyZWFtQ29uZmlnVjM3LnN0cmVhbXNbaV0uZ3JvdXBJZCAhPSAtMSkgeworICAgICAgICAgICAgLy8gSUNhbWVyYURldmljZSBvbGRlciB0aGFuIDMuNyBkb2Vzbid0IHN1cHBvcnQgbXVsdGktcmVzb2x1dGlvbiBvdXRwdXQKKyAgICAgICAgICAgIC8vIGltYWdlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQ29uZmlnVjM0LnN0cmVhbXNbaV0gPSBzdHJlYW1Db25maWdWMzcuc3RyZWFtc1tpXS52M180OworICAgIH0KKyAgICBzdHJlYW1Db25maWdWMzQub3BlcmF0aW9uTW9kZSA9IHN0cmVhbUNvbmZpZ1YzNy5vcGVyYXRpb25Nb2RlOworICAgIHN0cmVhbUNvbmZpZ1YzNC5zZXNzaW9uUGFyYW1zID0gc3RyZWFtQ29uZmlnVjM3LnNlc3Npb25QYXJhbXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzOjp0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorICAgICAgICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4mIHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgaW50IHRhcmdldFNka1ZlcnNpb24pIHsKKyAgICBib29sIGlzUGVyZkNsYXNzUHJpbWFyeUNhbWVyYSA9CisgICAgICAgICAgICBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLmZpbmQoY2FtZXJhSWQpICE9IHBlcmZDbGFzc1ByaW1hcnlDYW1lcmFJZHMuZW5kKCk7CisgICAgcmV0dXJuIHRhcmdldFNka1ZlcnNpb24gPj0gU0RLX1ZFUlNJT05fUyAmJiBpc1BlcmZDbGFzc1ByaW1hcnlDYW1lcmE7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1Nlc3Npb25Db25maWd1cmF0aW9uVXRpbHMuaAppbmRleCBjZmI5ZjE3Li4xOTJlMjQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uQ29uZmlndXJhdGlvblV0aWxzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvbkNvbmZpZ3VyYXRpb25VdGlscy5oCkBAIC0yMSwxNiArMjEsMTAwIEBACiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjcvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogCisjaW5jbHVkZSA8ZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbnN0cnVjdGluZyBiaW5kZXI6OlN0YXR1cyBvYmplY3RzIGZvciBlcnJvciByZXR1cm5zCiAKLXR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDYW1lcmFNZXRhZGF0YSAoY29uc3QgU3RyaW5nOCAmKT4gbWV0YWRhdGFHZXR0ZXI7CisjZGVmaW5lIFNUQVRVU19FUlJPUihlcnJvckNvZGUsIGVycm9yU3RyaW5nKSBcCisgICAgYmluZGVyOjpTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnJvckNvZGUsIFwKKyAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJXM6JWQ6ICVzIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXJyb3JTdHJpbmcpKQorCisjZGVmaW5lIFNUQVRVU19FUlJPUl9GTVQoZXJyb3JDb2RlLCBlcnJvclN0cmluZywgLi4uKSBcCisgICAgYmluZGVyOjpTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihlcnJvckNvZGUsIFwKKyAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJXM6JWQ6ICIgZXJyb3JTdHJpbmcsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIFwKKyAgICAgICAgICAgICAgICAgICAgX19WQV9BUkdTX18pKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjxDYW1lcmFNZXRhZGF0YSAoY29uc3QgU3RyaW5nOCAmLCBpbnQgdGFyZ2V0U2RrVmVyc2lvbik+IG1ldGFkYXRhR2V0dGVyOworCitjbGFzcyBTdHJlYW1Db25maWd1cmF0aW9uIHsKK3B1YmxpYzoKKyAgICBpbnQzMl90IGZvcm1hdDsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3QgaXNJbnB1dDsKKyAgICBzdGF0aWMgdm9pZCBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNfaW5mbywgYm9vbCBtYXhSZXMsCisgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBzdGQ6OnZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPj4gKnNjbSk7CisgICAgc3RhdGljIHZvaWQgZ2V0U3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmc3RhdGljX2luZm8sIGludCBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgc3RkOjp2ZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4+ICpzY20pOworfTsKKworLy8gSG9sZHMgdGhlIGRlZmF1bHQgU3RyZWFtQ29uZmlndXJhdGlvbk1hcCBhbmQgTWF4aW11bSByZXNvbHV0aW9uCisvLyBTdHJlYW1Db25maWd1cmF0aW9uTWFwIGZvciBhIGNhbWVyYSBkZXZpY2UuCitzdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvblBhaXIgeworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+PgorICAgICAgICAgICAgbURlZmF1bHRTdHJlYW1Db25maWd1cmF0aW9uTWFwOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIHN0ZDo6dmVjdG9yPGNhbWVyYTM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+PgorICAgICAgICAgICAgbU1heGltdW1SZXNvbHV0aW9uU3RyZWFtQ29uZmlndXJhdGlvbk1hcDsKK307CiAKIGNsYXNzIFNlc3Npb25Db25maWd1cmF0aW9uVXRpbHMgewogcHVibGljOgorICAgIHN0YXRpYyBjYW1lcmEzOjpTaXplIGdldE1heEpwZWdSZXNvbHV0aW9uKGNvbnN0IENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwKKyAgICAgICAgICAgIGJvb2wgdWx0cmFIaWdoUmVzb2x1dGlvbik7CisKKyAgICBzdGF0aWMgc2l6ZV90IGdldFVIUk1heEpwZWdCdWZmZXJTaXplKGNhbWVyYTM6OlNpemUgdWhyTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBjYW1lcmEzOjpTaXplIGRlZmF1bHRNYXhKcGVnU2l6ZSwgc2l6ZV90IGRlZmF1bHRNYXhKcGVnQnVmZmVyU2l6ZSk7CisKKyAgICBzdGF0aWMgaW50NjRfdCBldWNsaWREaXN0U3F1YXJlKGludDMyX3QgeDAsIGludDMyX3QgeTAsIGludDMyX3QgeDEsIGludDMyX3QgeTEpOworCisgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBkaW1lbnNpb25zIGZvciBhIGdpdmVuIGZvcm1hdCBpbiBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAvLyBhIHdpZHRoIDw9IFJPVU5ESU5HX1dJRFRIX0NBUAorICAgIHN0YXRpYyBib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLCBib29sIG1heFJlc29sdXRpb24sCisgICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOworCisgICAgc3RhdGljIGJvb2wgZ2V0QXJyYXlXaWR0aEFuZEhlaWdodChjb25zdCBDYW1lcmFNZXRhZGF0YSAqZGV2aWNlSW5mbywgaW50MzJfdCBhcnJheVRhZywKKyAgICAgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpOworCisgICAgLy9jaGVjayBpZiBmb3JtYXQgaXMgbm90IGN1c3RvbSBmb3JtYXQKKyAgICBzdGF0aWMgYm9vbCBpc1B1YmxpY0Zvcm1hdChpbnQzMl90IGZvcm1hdCk7CisKKyAgICAvLyBDcmVhdGUgYSBTdXJmYWNlIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4gUmV0dXJucyBlcnJvciBpZgorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbworICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdXJmYWNlRnJvbUdicCgKKyAgICAgICAgY2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKKyAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCisgICAgICAgIGNvbnN0IFN0cmluZzggJmxvZ2ljYWxDYW1lcmFJZCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCk7CisKKyAgICBzdGF0aWMgdm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IGNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjYW1lcmEzOjpjYW1lcmFfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwgaW50MzJfdCBncm91cElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM183OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIHBoeXNpY2FsQ2FtZXJhSWQgcGFzc2VkIGluIGlzIHNwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKKyAgICAvLyBkZXZpY2UuCisgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZwaHlzaWNhbENhbWVyYUlkcywgY29uc3QgU3RyaW5nOCAmcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmbG9naWNhbENhbWVyYUlkKTsKKworICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsCisgICAgICAgIGJvb2wgZGVmZXJyZWRDb25zdW1lciwgaW50IHN1cmZhY2VUeXBlKTsKKworICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGUoaW50IG9wZXJhdGluZ01vZGUsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhICZzdGF0aWNJbmZvLCBjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CisKICAgICAvLyB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgQUlETCBTZXNzaW9uQ29uZmlndXJhdGlvbiB0byBISURMCiAgICAgLy8gc3RyZWFtQ29uZmlndXJhdGlvbi4gQWxzbyBjaGVja3MgZm9yIHZhbGlkaXR5IG9mIFNlc3Npb25Db25maWd1cmF0aW9uIGFuZAogICAgIC8vIHJldHVybnMgYSBub24tb2sgYmluZGVyOjpTdGF0dXMgaWYgdGhlIHBhc3NlZCBpbiBzZXNzaW9uIGNvbmZpZ3VyYXRpb24KQEAgLTM5LDkgKzEyMyw0MiBAQAogICAgIGNvbnZlcnRUb0hBTFN0cmVhbUNvbWJpbmF0aW9uKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLCBjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbywKICAgICAgICAgICAgIG1ldGFkYXRhR2V0dGVyIGdldE1ldGFkYXRhLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnBoeXNpY2FsQ2FtZXJhSWRzLAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZzdHJlYW1Db25maWd1cmF0aW9uLAotICAgICAgICAgICAgYm9vbCAqZWFybHlFeGl0KTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgb3ZlcnJpZGVGb3JQZXJmQ2xhc3MsIGJvb2wgKmVhcmx5RXhpdCk7CisKKyAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBWM183OjpTdHJlYW1Db25maWd1cmF0aW9uIHRvCisgICAgLy8gVjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbi4gUmV0dXJuIGZhbHNlIGlmIHRoZSBvcmlnaW5hbCBWM183IGNvbmZpZ3VyYXRpb24gY2Fubm90CisgICAgLy8gYmUgdXNlZCBieSBvbGRlciB2ZXJzaW9uIEhBTC4KKyAgICBzdGF0aWMgYm9vbCBjb252ZXJ0SEFMU3RyZWFtQ29tYmluYXRpb25Gcm9tVjM3VG9WMzQoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJnN0cmVhbUNvbmZpZ1YzNCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNzo6U3RyZWFtQ29uZmlndXJhdGlvbiAmc3RyZWFtQ29uZmlnVjM3KTsKKworICAgIHN0YXRpYyBTdHJlYW1Db25maWd1cmF0aW9uUGFpciBnZXRTdHJlYW1Db25maWd1cmF0aW9uUGFpcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEpOworCisgICAgc3RhdGljIHN0YXR1c190IGNoZWNrQW5kT3ZlcnJpZGVTZW5zb3JQaXhlbE1vZGVzVXNlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICZzZW5zb3JQaXhlbE1vZGVzVXNlZCwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnN0YXRpY0luZm8sIGJvb2wgZmxleGlibGVDb25zdW1lciwKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxpbnQzMl90PiAqb3ZlcnJpZGRlblNlbnNvclBpeGVsTW9kZXNVc2VkKTsKKworICAgIHN0YXRpYyBib29sIGlzVWx0cmFIaWdoUmVzb2x1dGlvblNlbnNvcihjb25zdCBDYW1lcmFNZXRhZGF0YSAmZGV2aWNlSW5mbyk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRBcHByb3ByaWF0ZU1vZGVUYWcoaW50MzJfdCBkZWZhdWx0VGFnLCBib29sIG1heFJlc29sdXRpb24gPSBmYWxzZSk7CisKKyAgICBzdGF0aWMgYm9vbCB0YXJnZXRQZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+JiBwZXJmQ2xhc3NQcmltYXJ5Q2FtZXJhSWRzLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICBpbnQzMl90IHRhcmdldFNka1ZlcnNpb24pOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0gPSA0OworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTkyMDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNES19WRVJTSU9OX1MgPSAzMTsKKyAgICBzdGF0aWMgaW50MzJfdCBQRVJGX0NMQVNTX0xFVkVMOworICAgIHN0YXRpYyBib29sIElTX1BFUkZfQ0xBU1M7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgUEVSRl9DTEFTU19KUEVHX1RIUkVTSF9XID0gMTkyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBQRVJGX0NMQVNTX0pQRUdfVEhSRVNIX0ggPSAxMDgwOwogfTsKIAorfSAvLyBjYW1lcmEzCiB9IC8vIGFuZHJvaWQKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTc3MDdjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlc3Npb25TdGF0c0J1aWxkZXIiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU2Vzc2lvblN0YXRzQnVpbGRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEJpbnMgZm9yIGNhcHR1cmUgbGF0ZW5jeTogWzAsIDEwMF0sIFsxMDAsIDIwMF0sIFsyMDAsIDMwMF0sIC4uLgorLy8gWzEzMDAsIDIxMDBdLCBbMjEwMCwgaW5mXS4KKy8vIENhcHR1cmUgbGF0ZW5jeSBpcyBpbiB0aGUgdW5pdCBvZiBtaWxsaXNlY29uZC4KK2NvbnN0IHN0ZDo6YXJyYXk8aW50MzJfdCwgU3RyZWFtU3RhdHM6OkxBVEVOQ1lfQklOX0NPVU5ULTE+IFN0cmVhbVN0YXRzOjptQ2FwdHVyZUxhdGVuY3lCaW5zIHsKKyAgICAgICAgeyAxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNzAwLCA5MDAsIDEzMDAsIDIxMDAgfSB9OworCitzdGF0dXNfdCBTZXNzaW9uU3RhdHNCdWlsZGVyOjphZGRTdHJlYW0oaW50IGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIFN0cmVhbVN0YXRzIHN0YXRzOworICAgIG1TdGF0c01hcC5lbXBsYWNlKGlkLCBzdGF0cyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTZXNzaW9uU3RhdHNCdWlsZGVyOjpyZW1vdmVTdHJlYW0oaW50IGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIG1TdGF0c01hcC5lcmFzZShpZCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFNlc3Npb25TdGF0c0J1aWxkZXI6OmJ1aWxkQW5kUmVzZXQoaW50NjRfdCogcmVxdWVzdENvdW50LAorICAgICAgICBpbnQ2NF90KiBlcnJvclJlc3VsdENvdW50LCBib29sKiBkZXZpY2VFcnJvciwKKyAgICAgICAgc3RkOjptYXA8aW50LCBTdHJlYW1TdGF0cz4gKnN0YXRzTWFwKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgICpyZXF1ZXN0Q291bnQgPSBtUmVxdWVzdENvdW50OworICAgICplcnJvclJlc3VsdENvdW50ID0gbUVycm9yUmVzdWx0Q291bnQ7CisgICAgKmRldmljZUVycm9yID0gbURldmljZUVycm9yOworICAgICpzdGF0c01hcCA9IG1TdGF0c01hcDsKKworICAgIC8vIFJlc2V0IGludGVybmFsIHN0YXRlcworICAgIG1SZXF1ZXN0Q291bnQgPSAwOworICAgIG1FcnJvclJlc3VsdENvdW50ID0gMDsKKyAgICBtQ291bnRlclN0b3BwZWQgPSBmYWxzZTsKKyAgICBtRGV2aWNlRXJyb3IgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIHN0cmVhbVN0YXRzIDogbVN0YXRzTWFwKSB7CisgICAgICAgIFN0cmVhbVN0YXRzJiBzdHJlYW1TdGF0ID0gc3RyZWFtU3RhdHMuc2Vjb25kOworICAgICAgICBzdHJlYW1TdGF0Lm1SZXF1ZXN0ZWRGcmFtZUNvdW50ID0gMDsKKyAgICAgICAgc3RyZWFtU3RhdC5tRHJvcHBlZEZyYW1lQ291bnQgPSAwOworICAgICAgICBzdHJlYW1TdGF0Lm1Db3VudGVyU3RvcHBlZCA9IGZhbHNlOworICAgICAgICBzdHJlYW1TdGF0Lm1TdGFydExhdGVuY3lNcyA9IDA7CisKKyAgICAgICAgc3RkOjpmaWxsKHN0cmVhbVN0YXQubUNhcHR1cmVMYXRlbmN5SGlzdG9ncmFtLmJlZ2luKCksCisgICAgICAgICAgICAgICAgc3RyZWFtU3RhdC5tQ2FwdHVyZUxhdGVuY3lIaXN0b2dyYW0uZW5kKCksIDApOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uU3RhdHNCdWlsZGVyOjpzdGFydENvdW50ZXIoaW50IGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIG1TdGF0c01hcFtpZF0ubUNvdW50ZXJTdG9wcGVkID0gZmFsc2U7Cit9CisKK3ZvaWQgU2Vzc2lvblN0YXRzQnVpbGRlcjo6c3RvcENvdW50ZXIoaW50IGlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIFN0cmVhbVN0YXRzJiBzdHJlYW1TdGF0ID0gbVN0YXRzTWFwW2lkXTsKKyAgICBzdHJlYW1TdGF0Lm1Db3VudGVyU3RvcHBlZCA9IHRydWU7Cit9CisKK3ZvaWQgU2Vzc2lvblN0YXRzQnVpbGRlcjo6aW5jQ291bnRlcihpbnQgaWQsIGJvb2wgZHJvcHBlZCwgaW50MzJfdCBjYXB0dXJlTGF0ZW5jeU1zKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworCisgICAgYXV0byBpdCA9IG1TdGF0c01hcC5maW5kKGlkKTsKKyAgICBpZiAoaXQgPT0gbVN0YXRzTWFwLmVuZCgpKSByZXR1cm47CisKKyAgICBTdHJlYW1TdGF0cyYgc3RyZWFtU3RhdCA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKHN0cmVhbVN0YXQubUNvdW50ZXJTdG9wcGVkKSByZXR1cm47CisKKyAgICBzdHJlYW1TdGF0Lm1SZXF1ZXN0ZWRGcmFtZUNvdW50Kys7CisgICAgaWYgKGRyb3BwZWQpIHsKKyAgICAgICAgc3RyZWFtU3RhdC5tRHJvcHBlZEZyYW1lQ291bnQrKzsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbVN0YXQubVJlcXVlc3RlZEZyYW1lQ291bnQgLSBzdHJlYW1TdGF0Lm1Ecm9wcGVkRnJhbWVDb3VudCA9PSAxKSB7CisgICAgICAgIC8vIFRoZSBjYXB0dXJlIGxhdGVuY3kgZm9yIHRoZSBmaXJzdCByZXF1ZXN0LgorICAgICAgICBzdHJlYW1TdGF0Lm1TdGFydExhdGVuY3lNcyA9IGNhcHR1cmVMYXRlbmN5TXM7CisgICAgfQorCisgICAgc3RyZWFtU3RhdC51cGRhdGVMYXRlbmN5SGlzdG9ncmFtKGNhcHR1cmVMYXRlbmN5TXMpOworfQorCit2b2lkIFNlc3Npb25TdGF0c0J1aWxkZXI6OnN0b3BDb3VudGVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBtQ291bnRlclN0b3BwZWQgPSB0cnVlOworICAgIGZvciAoYXV0byYgc3RyZWFtU3RhdHMgOiBtU3RhdHNNYXApIHsKKyAgICAgICAgc3RyZWFtU3RhdHMuc2Vjb25kLm1Db3VudGVyU3RvcHBlZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25TdGF0c0J1aWxkZXI6OmluY1Jlc3VsdENvdW50ZXIoYm9vbCBkcm9wcGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGwobUxvY2spOworICAgIGlmIChtQ291bnRlclN0b3BwZWQpIHJldHVybjsKKworICAgIG1SZXF1ZXN0Q291bnQrKzsKKyAgICBpZiAoZHJvcHBlZCkgbUVycm9yUmVzdWx0Q291bnQrKzsKK30KKwordm9pZCBTZXNzaW9uU3RhdHNCdWlsZGVyOjpvbkRldmljZUVycm9yKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsKG1Mb2NrKTsKKyAgICBtRGV2aWNlRXJyb3IgPSB0cnVlOworfQorCit2b2lkIFN0cmVhbVN0YXRzOjp1cGRhdGVMYXRlbmN5SGlzdG9ncmFtKGludDMyX3QgbGF0ZW5jeU1zKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG1DYXB0dXJlTGF0ZW5jeUJpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGxhdGVuY3lNcyA8IG1DYXB0dXJlTGF0ZW5jeUJpbnNbaV0pIHsKKyAgICAgICAgICAgIG1DYXB0dXJlTGF0ZW5jeUhpc3RvZ3JhbVtpXSArKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPT0gbUNhcHR1cmVMYXRlbmN5Qmlucy5zaXplKCkpIHsKKyAgICAgICAgbUNhcHR1cmVMYXRlbmN5SGlzdG9ncmFtW2ldKys7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvU2Vzc2lvblN0YXRzQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyM2FiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9TZXNzaW9uU3RhdHNCdWlsZGVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1NFU1NJT05fU1RBVFNfQlVJTERFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVklDRV9VVElMU19TRVNTSU9OX1NUQVRTX0JVSUxERVJfSAorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gSGVscGVyIGNsYXNzIHRvIGJ1aWxkIHN0cmVhbSBzdGF0cworc3RydWN0IFN0cmVhbVN0YXRzIHsKKyAgICAvLyBGaWVsZHMgZm9yIGJ1ZmZlciBkcm9wCisgICAgaW50NjRfdCBtUmVxdWVzdGVkRnJhbWVDb3VudDsKKyAgICBpbnQ2NF90IG1Ecm9wcGVkRnJhbWVDb3VudDsKKyAgICBib29sIG1Db3VudGVyU3RvcHBlZDsKKworICAgIC8vIEZpZWxkcyBmb3Igc3RyZWFtIHN0YXJ0dXAgbGF0ZW5jeQorICAgIGludDMyX3QgbVN0YXJ0TGF0ZW5jeU1zOworCisgICAgLy8gRmllbGRzIGZvciBjYXB0dXJlIGxhdGVuY3kgbWVhc3VyZW1lbnQKKyAgICBjb25zdCBzdGF0aWMgaW50IExBVEVOQ1lfQklOX0NPVU5UID0gMTA7CisgICAgLy8gQm91bmRhcnkgdmFsdWVzIHNlcGFyYXRpbmcgYmV0d2VlbiBhZGphY2VudCBiaW5zLCBleGNsdWRpbmcgMCBhbmQKKyAgICAvLyBpbmZpbml0eS4KKyAgICBjb25zdCBzdGF0aWMgc3RkOjphcnJheTxpbnQzMl90LCBMQVRFTkNZX0JJTl9DT1VOVC0xPiBtQ2FwdHVyZUxhdGVuY3lCaW5zOworICAgIC8vIENvdW50ZXIgdmFsdWVzIGZvciBhbGwgaGlzdG9ncmFtIGJpbnMuIE9uZSBtb3JlIGVudHJ5IHRoYW4gbUNhcHR1cmVMYXRlbmN5Qmlucy4KKyAgICBzdGQ6OmFycmF5PGludDY0X3QsIExBVEVOQ1lfQklOX0NPVU5UPiBtQ2FwdHVyZUxhdGVuY3lIaXN0b2dyYW07CisKKyAgICBTdHJlYW1TdGF0cygpIDogbVJlcXVlc3RlZEZyYW1lQ291bnQoMCksCisgICAgICAgICAgICAgICAgICAgICBtRHJvcHBlZEZyYW1lQ291bnQoMCksCisgICAgICAgICAgICAgICAgICAgICBtQ291bnRlclN0b3BwZWQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0TGF0ZW5jeU1zKDApLAorICAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVMYXRlbmN5SGlzdG9ncmFte30KKyAgICAgICAgICAgICAgICAgIHt9CisKKyAgICB2b2lkIHVwZGF0ZUxhdGVuY3lIaXN0b2dyYW0oaW50MzJfdCBsYXRlbmN5TXMpOworfTsKKworLy8gSGVscGVyIGNsYXNzIHRvIGJ1aWxkIHNlc3Npb24gc3RhdHMKK2NsYXNzIFNlc3Npb25TdGF0c0J1aWxkZXIgeworcHVibGljOgorCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtKGludCBzdHJlYW1JZCk7CisgICAgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtKGludCBzdHJlYW1JZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIHNlc3Npb24gc3RhdGlzdGljcyBhbmQgcmVzZXQgdGhlIGludGVybmFsIHN0YXRlcy4KKyAgICB2b2lkIGJ1aWxkQW5kUmVzZXQoLypvdXQqL2ludDY0X3QqIHJlcXVlc3RDb3VudCwKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQ2NF90KiBlcnJvclJlc3VsdENvdW50LAorICAgICAgICAgICAgLypvdXQqL2Jvb2wqIGRldmljZUVycm9yLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6bWFwPGludCwgU3RyZWFtU3RhdHM+ICpzdGF0c01hcCk7CisKKyAgICAvLyBTdHJlYW0gc3BlY2lmaWMgY291bnRlcgorICAgIHZvaWQgc3RhcnRDb3VudGVyKGludCBzdHJlYW1JZCk7CisgICAgdm9pZCBzdG9wQ291bnRlcihpbnQgc3RyZWFtSWQpOworICAgIHZvaWQgaW5jQ291bnRlcihpbnQgc3RyZWFtSWQsIGJvb2wgZHJvcHBlZCwgaW50MzJfdCBjYXB0dXJlTGF0ZW5jeU1zKTsKKworICAgIC8vIFNlc3Npb24gc3BlY2lmaWMgY291bnRlcgorICAgIHZvaWQgc3RvcENvdW50ZXIoKTsKKyAgICB2b2lkIGluY1Jlc3VsdENvdW50ZXIoYm9vbCBkcm9wcGVkKTsKKyAgICB2b2lkIG9uRGV2aWNlRXJyb3IoKTsKKworICAgIFNlc3Npb25TdGF0c0J1aWxkZXIoKSA6IG1SZXF1ZXN0Q291bnQoMCksIG1FcnJvclJlc3VsdENvdW50KDApLAorICAgICAgICAgICAgIG1Db3VudGVyU3RvcHBlZChmYWxzZSksIG1EZXZpY2VFcnJvcihmYWxzZSkge30KK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBpbnQ2NF90IG1SZXF1ZXN0Q291bnQ7CisgICAgaW50NjRfdCBtRXJyb3JSZXN1bHRDb3VudDsKKyAgICBib29sIG1Db3VudGVyU3RvcHBlZDsKKyAgICBib29sIG1EZXZpY2VFcnJvcjsKKyAgICAvLyBNYXAgZnJvbSBzdHJlYW0gaWQgdG8gc3RyZWFtIHN0YXRpc3RpY3MKKyAgICBzdGQ6Om1hcDxpbnQsIFN0cmVhbVN0YXRzPiBtU3RhdHNNYXA7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1NFU1NJT05fU1RBVFNfQlVJTERFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKaW5kZXggYzRlZmJhYS4uYmY0ZDUyNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icApAQCAtMSwzICsxLDIwIEBACitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiXSwKK30KKworLy8gQWRkZWQgYXV0b21hdGljYWxseSBieSBhIGxhcmdlLXNjYWxlLWNoYW5nZQorLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorbGljZW5zZSB7CisgICAgbmFtZTogImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIiwKKyAgICB2aXNpYmlsaXR5OiBbIjpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlX2tpbmRzOiBbCisgICAgICAgICJTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIiwKKyAgICBdLAorICAgIGxpY2Vuc2VfdGV4dDogWworICAgICAgICAiTk9USUNFIiwKKyAgICBdLAorfQorCiBjY19iaW5hcnkgewogICAgIG5hbWU6ICJtZWRpYXN3Y29kZWMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xNSwyNCArMzIsMTAgQEAKICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAogCi0gICAgaW5pdF9yYzogWyJtZWRpYXN3Y29kZWMucmMiXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ5NjY2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCi0gICAgY2xhc3MgbWFpbgotICAgIHVzZXIgbWVkaWFjb2RlYwotICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KLSAgICB1cGRhdGFibGUKLSAgICBpb3ByaW8gcnQgNAotICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKaW5kZXggMDQ0MWNmYS4uNjk2Yjk2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKQEAgLTEsMyArMSwxMiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfc2VydmljZXNfbWVkaWFjb2RlY19saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYWNvZGVjX2xpY2Vuc2UiXSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLApAQCAtNTUsNCArNjQsMyBAQAogICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKICAgICBdLAogfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKaW5kZXggMTg0MjUxYS4uYjQ3OTQzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMjUsOCArMjUsOSBAQAogI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CiAjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4xL0NvbXBvbmVudFN0b3JlLmg+Ci0jaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4xL0NvbmZpZ3VyYWJsZS5oPgotI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMi9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjIvdHlwZXMuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5oPgogCkBAIC0zNyw4ICszOCw4IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzE7Ci11c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8xOjp1dGlsczsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzI7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8yOjp1dGlsczsKIAogY29uc3RleHByIGMyX3N0YXR1c190IEMyX1RSQU5TQUNUSU9OX0ZBSUxFRCA9IEMyX0NPUlJVUFRFRDsKIApAQCAtNDIwLDExICs0MjEsMjAgQEAKICAgICAvLyBTVE9QU0hJUDogUmVtb3ZlIGNvZGUgbmFtZSBjaGVja2luZyBvbmNlIHBsYXRmb3JtIHZlcnNpb24gYnVtcHMgdXAgdG8gMzAuCiAgICAgc3RkOjpzdHJpbmcgY29kZU5hbWUgPQogICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsICIiKTsKLSAgICBpZiAoY29kZU5hbWUgPT0gIlIiKSB7Ci0gICAgICAgIHBsYXRmb3JtVmVyc2lvbiA9IDMwOworICAgIGlmIChjb2RlTmFtZSA9PSAiUyIpIHsKKyAgICAgICAgcGxhdGZvcm1WZXJzaW9uID0gMzE7CiAgICAgfQogCiAgICAgc3dpdGNoIChwbGF0Zm9ybVZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAzMTogeworICAgICAgICAgICAgYW5kcm9pZDo6c3A8VjFfMjo6SUNvbXBvbmVudFN0b3JlPiBzdG9yZVYxXzIgPQorICAgICAgICAgICAgICAgIG5ldyBWMV8yOjp1dGlsczo6Q29tcG9uZW50U3RvcmUoc3RvcmUpOworICAgICAgICAgICAgaWYgKHN0b3JlVjFfMi0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgc29mdHdhcmUgQ29kZWMyIHYxLjIgc2VydmljZS4iOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIGNhc2UgMzA6IHsKICAgICAgICAgICAgIGFuZHJvaWQ6OnNwPFYxXzE6OklDb21wb25lbnRTdG9yZT4gc3RvcmVWMV8xID0KICAgICAgICAgICAgICAgICBuZXcgVjFfMTo6dXRpbHM6OkNvbXBvbmVudFN0b3JlKHN0b3JlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKaW5kZXggYTlkMzJkNi4uNGJjYzA3NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKQEAgLTI3LDYgKzI3LDcgQEAKIG1tYXA6IDEKIGZzdGF0NjQ6IDEKIGZzdGF0OiAxCitzdGF0OiAxCiBzdGF0NjQ6IDEKIHN0YXRmczY0OiAxCiBtYWR2aXNlOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODZfNjQucG9saWN5CmluZGV4IGE5ZDMyZDYuLjRiY2MwNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODZfNjQucG9saWN5CkBAIC0yNyw2ICsyNyw3IEBACiBtbWFwOiAxCiBmc3RhdDY0OiAxCiBmc3RhdDogMQorc3RhdDogMQogc3RhdDY0OiAxCiBzdGF0ZnM2NDogMQogbWFkdmlzZTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Ni5wb2xpY3kKaW5kZXggZWI3MWUyOC4uOWJhZmU3YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5CkBAIC0yNyw2ICsyNyw3IEBACiBtbWFwOiAxCiBmc3RhdDY0OiAxCiBmc3RhdDogMQorc3RhdDogMQogc3RhdDY0OiAxCiBzdGF0ZnM2NDogMQogbWFkdmlzZTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLXg4Nl82NC5wb2xpY3kKaW5kZXggZTcyZDRkYi4uYjBlZDA0MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5CkBAIC0yNyw2ICsyNyw3IEBACiBtbWFwOiAxCiBmc3RhdDY0OiAxCiBmc3RhdDogMQorc3RhdDogMQogc3RhdDY0OiAxCiBzdGF0ZnM2NDogMQogbWFkdmlzZTogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKaW5kZXggMGIyNWQ2Mi4uODVjZTExMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsMjMgQEAKIC8vIHNlcnZpY2UgbGlicmFyeQorcGFja2FnZSB7CisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhZXh0cmFjdG9yX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhZXh0cmFjdG9yX2xpY2Vuc2UiLAorICAgIHZpc2liaWxpdHk6IFsiOl9fc3VicGFja2FnZXNfXyJdLAorICAgIGxpY2Vuc2Vfa2luZHM6IFsKKyAgICAgICAgIlNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAiLAorICAgIF0sCisgICAgbGljZW5zZV90ZXh0OiBbCisgICAgICAgICJOT1RJQ0UiLAorICAgIF0sCit9CisKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIiwKICAgICBjZmxhZ3M6IFsKQEAgLTM1LDIwICs1NCw2IEBACiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCiAgICAgXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCi0gICAgXSwKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKICAgICBpbml0X3JjOiBbIm1lZGlhZXh0cmFjdG9yLnJjIl0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTgxLDQgKzg2LDMgQEAKICAgICAgICAgImNvZGVfY292ZXJhZ2UucG9saWN5IiwKICAgICBdLAogfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCA5OTkyZDFjLi43MWE1YmZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTM5LDIzICszOSwyMyBAQAogCiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvcigKICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklEYXRhU291cmNlPiYgcmVtb3RlU291cmNlLAotICAgICAgICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCisgICAgICAgIGNvbnN0IDo6c3RkOjpvcHRpb25hbDwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCiAgICAgICAgIDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJTWVkaWFFeHRyYWN0b3I+KiBfYWlkbF9yZXR1cm4pIHsKLSAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lLmdldCgpLT5jX3N0cigpKTsKKyAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lID8gbWltZS0+Y19zdHIoKSA6IG51bGxwdHIpOwogCiAgICAgc3A8RGF0YVNvdXJjZT4gbG9jYWxTb3VyY2UgPSBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlKHJlbW90ZVNvdXJjZSk7CiAKICAgICBNZWRpYUJ1ZmZlcjo6dXNlU2hhcmVkTWVtb3J5KCk7CiAgICAgc3A8SU1lZGlhRXh0cmFjdG9yPiBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZUZyb21TZXJ2aWNlKAogICAgICAgICAgICAgbG9jYWxTb3VyY2UsCi0gICAgICAgICAgICBtaW1lLmdldCgpID8gbWltZS5nZXQoKS0+Y19zdHIoKSA6IG51bGxwdHIpOworICAgICAgICAgICAgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKIAogICAgIEFMT0dWKCJleHRyYWN0b3Igc2VydmljZSBjcmVhdGVkICVwICglcykiLAogICAgICAgICAgICAgZXh0cmFjdG9yLmdldCgpLAogICAgICAgICAgICAgZXh0cmFjdG9yID09IG51bGxwdHIgPyAiIiA6IGV4dHJhY3Rvci0+bmFtZSgpKTsKIAogICAgIGlmIChleHRyYWN0b3IgIT0gbnVsbHB0cikgewotICAgICAgICByZWdpc3Rlck1lZGlhRXh0cmFjdG9yKGV4dHJhY3RvciwgbG9jYWxTb3VyY2UsIG1pbWUuZ2V0KCkgPyBtaW1lLmdldCgpLT5jX3N0cigpIDogbnVsbHB0cik7CisgICAgICAgIHJlZ2lzdGVyTWVkaWFFeHRyYWN0b3IoZXh0cmFjdG9yLCBsb2NhbFNvdXJjZSwgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKICAgICB9CiAgICAgKl9haWRsX3JldHVybiA9IGV4dHJhY3RvcjsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCmluZGV4IDFiNDBiZjkuLjAwODFlN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oCkBAIC0zMyw3ICszMyw3IEBACiAKICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWFrZUV4dHJhY3RvcigKICAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJRGF0YVNvdXJjZT4mIHNvdXJjZSwKLSAgICAgICAgICAgIGNvbnN0IDo6c3RkOjp1bmlxdWVfcHRyPCA6OnN0ZDo6c3RyaW5nPiAmbWltZSwKKyAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpvcHRpb25hbDwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCiAgICAgICAgICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SU1lZGlhRXh0cmFjdG9yPiogX2FpZGxfcmV0dXJuKTsKIAogICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBtYWtlSURhdGFTb3VyY2UoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAppbmRleCBmMjE1NzRmLi4xMGI4MTM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKQEAgLTE1LDYgKzE1LDkgQEAKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIAorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtYWluX2V4dHJhY3RvcnNlcnZpY2UiCisKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0yNiwxMCArMjksOSBAQAogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAotI2luY2x1ZGUgPGJpb25pYy9yZXNlcnZlZF9zaWduYWxzLmg+Ci0KIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgogI2luY2x1ZGUgIm1pbmlqYWlsLmgiCkBAIC00MywxNyArNDUsMTkgQEAKIAogaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KQogeworCisjaWYgX19oYXNfZmVhdHVyZShod2FkZHJlc3Nfc2FuaXRpemVyKQorICAgIEFMT0dJKCJkaXNhYmxlIG1lZGlhLmV4dHJhY3RvciBtZW1vcnkgbGltaXRzIChod2FzYW4gZW5hYmxlZCkiKTsKKyNlbHNlCisgICAgQUxPR0koImVuYWJsZSBtZWRpYS5leHRyYWN0b3IgbWVtb3J5IGxpbWl0cyIpOwogICAgIGxpbWl0UHJvY2Vzc01lbW9yeSgKICAgICAgICAgInJvLm1lZGlhLm1heG1lbSIsIC8qIHByb3BlcnR5IHRoYXQgZGVmaW5lcyBsaW1pdCAqLwogICAgICAgICBTSVpFX01BWCwgLyogdXBwZXIgbGltaXQgaW4gYnl0ZXMgKi8KICAgICAgICAgMjAgLyogdXBwZXIgbGltaXQgYXMgcGVyY2VudGFnZSBvZiBwaHlzaWNhbCBSQU0gKi8pOworI2VuZGlmCiAKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKLSAgICAvLyBEbyBub3QgYXNzaXN0IHBsYXRmb3JtIHByb2ZpbGVycyAocmVsZXZhbnQgb25seSBvbiBkZWJ1ZyBidWlsZHMpLgotICAgIC8vIE90aGVyd2lzZSwgdGhlIHNpZ25hbCBoYW5kbGVyIGNhbiB2aW9sYXRlIHRoZSBzZWNjb21wIHBvbGljeS4KLSAgICBzaWduYWwoQklPTklDX1NJR05BTF9QUk9GSUxFUiwgU0lHX0lHTik7Ci0KICAgICAvL2IvNjIyNTU5NTk6IHRoaXMgZm9yY2VzIGxpYnV0aXMuc28gdG8gZGxvcGVuIHZlbmRvciB2ZXJzaW9uIG9mIGxpYnV0aWxzLnNvCiAgICAgLy9iZWZvcmUgbWluaWphaWwgaXMgb24uIFRoaXMgaXMgZGlydHkgYnV0IHJlcXVpcmVkIHNpbmNlIHNvbWUgc3lzY2FsbHMgc3VjaAogICAgIC8vYXMgcHJlYWQ2NCBhcmUgdXNlZCBieSBsaW5rZXIgYnV0IGFyZW4ndCBhbGxvd2VkIGluIHRoZSBtaW5pamFpbC4gQnkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDc0YjYzZDUuLmNmYzRjNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtMSw0ICsxLDEzIEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYWxvZ3NlcnZpY2UiLAogCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmYwY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibWVkaWFfbG9nX2Z1enplciIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhbG9nc2VydmljZSIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9sb2dfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlibmJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvUkVBRE1FLm1kIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzllNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDUwIEBACisjIEZ1enplciBmb3IgbGlibWVkaWFsb2dzZXJ2aWNlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBsaWJtZWRpYWxvZ3NlcnZpY2UgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitzZXJ2aWNlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK21lZGlhbG9nc2VydmljZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBXcml0ZXIgbmFtZSAocGFyYW1ldGVyIG5hbWU6IGB3cml0ZXJOYW1lSWR4YCkKKzIuIExvZyBzaXplIChwYXJhbWV0ZXIgbmFtZTogYGxvZ1NpemVgKQorMy4gRW5hYmxlIGR1bXAgYmVmb3JlIHVucmdpc3RlciBBUEkgKHBhcmFtZXRlciBuYW1lOiBgc2hvdWxkRHVtcEJlZm9yZVVucmVnaXN0ZXJgKQorNS4gc2l6ZSBvZiBzdHJpbmcgZm9yIGxvZyBkdW1wIChwYXJhbWV0ZXIgbmFtZTogYG51bWJlck9mTGluZXNgKQorCit8IFBhcmFtZXRlcnwgVmFsaWQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYHdyaXRlck5hbWVJZHhgIHwgMC4gYDBgIDEuIGAxYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYGxvZ1NpemVgIHwgSW4gdGhlIHJhbmdlIGAyNTYgdG8gNjU1MzZgIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgc2hvdWxkRHVtcEJlZm9yZVVucmVnaXN0ZXJgIHwgMC4gYDBgIDEuIGAxYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYG51bWJlck9mTGluZXNgIHwgSW4gdGhlIHJhbmdlIGAwIHRvIDY1NTM1YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhX2xvZ19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG1lZGlhX2xvZ19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tZWRpYV9sb2dfZnV6emVyL21lZGlhX2xvZ19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL21lZGlhX2xvZ19mdXp6ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFsb2cvZnV6emVyL21lZGlhX2xvZ19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTBkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9mdXp6ZXIvbWVkaWFfbG9nX2Z1enplci5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKworY29uc3RleHByIGNvbnN0IGNoYXIqIGtXcml0ZXJOYW1lc1syXSA9IHsiRmFzdE1peGVyIiwgIkZhc3RDYXB0dXJlIn07Citjb25zdGV4cHIgc2l6ZV90IGtNaW5TaXplID0gMHgxMDA7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhTaXplID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MDAgKiAxMDI0OworY29uc3RleHByIHNpemVfdCBrTWF4TnVtTGluZXMgPSBVU0hSVF9NQVg7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNZWRpYUxvZ0Z1enplciB7CisgICBwdWJsaWM6CisgICAgdm9pZCBpbml0KCk7CisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworICAgcHJpdmF0ZToKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1NZW1vcnlEZWFsZXIgPSBudWxscHRyOworICAgIHNwPE1lZGlhTG9nU2VydmljZT4gbVNlcnZpY2UgPSBudWxscHRyOworfTsKKwordm9pZCBNZWRpYUxvZ0Z1enplcjo6aW5pdCgpIHsKKyAgICBzZXR1aWQoQUlEX01FRElBKTsKKyAgICBtU2VydmljZSA9IG5ldyBNZWRpYUxvZ1NlcnZpY2UoKTsKKyAgICBtTWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihrTG9nTWVtb3J5U2l6ZSwgIk1lZGlhTG9nRnV6emVyIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSk7Cit9CisKK3ZvaWQgTWVkaWFMb2dGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNpemVfdCB3cml0ZXJOYW1lSWR4ID0KKyAgICAgICAgZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8c2l6ZV90PigwLCBzdGQ6OnNpemUoa1dyaXRlck5hbWVzKSAtIDEpOworICAgIGJvb2wgc2hvdWxkRHVtcEJlZm9yZVVucmVnaXN0ZXIgPSBmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICBzaXplX3QgbG9nU2l6ZSA9IGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa01pblNpemUsIGtNYXhTaXplKTsKKyAgICBzcDxJTWVtb3J5PiBsb2dCdWZmZXIgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShOQkxvZzo6VGltZWxpbmU6OnNoYXJlZFNpemUobG9nU2l6ZSkpOworICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICBzaXplX3QgbnVtYmVyT2ZMaW5lcyA9IGZ1enplZERhdGFQcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oMCwga01heE51bUxpbmVzKTsKKyAgICBmb3IgKHNpemVfdCBsaW5lSWR4ID0gMDsgbGluZUlkeCA8IG51bWJlck9mTGluZXM7ICsrbGluZUlkeCkgeworICAgICAgICBhcmdzLmFkZChzdGF0aWNfY2FzdDxTdHJpbmcxNj4oZnV6emVkRGF0YVByb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKSk7CisgICAgfQorICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gImxvZ0R1bXBGaWxlIjsKKyAgICBpbnQgZmQgPSBtZW1mZF9jcmVhdGUoZmlsZU5hbWUsIE1GRF9BTExPV19TRUFMSU5HKTsKKyAgICBmdXp6ZWREYXRhUHJvdmlkZXIuQ29uc3VtZURhdGEobG9nQnVmZmVyLT51bnNlY3VyZVBvaW50ZXIoKSwgbG9nQnVmZmVyLT5zaXplKCkpOworICAgIG1TZXJ2aWNlLT5yZWdpc3RlcldyaXRlcihsb2dCdWZmZXIsIGxvZ1NpemUsIGtXcml0ZXJOYW1lc1t3cml0ZXJOYW1lSWR4XSk7CisgICAgaWYgKHNob3VsZER1bXBCZWZvcmVVbnJlZ2lzdGVyKSB7CisgICAgICAgIG1TZXJ2aWNlLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgbVNlcnZpY2UtPnVucmVnaXN0ZXJXcml0ZXIobG9nQnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VydmljZS0+dW5yZWdpc3RlcldyaXRlcihsb2dCdWZmZXIpOworICAgICAgICBtU2VydmljZS0+ZHVtcChmZCwgYXJncyk7CisgICAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgTWVkaWFMb2dGdXp6ZXIgbWVkaWFMb2dGdXp6ZXIgPSBNZWRpYUxvZ0Z1enplcigpOworICAgIG1lZGlhTG9nRnV6emVyLmluaXQoKTsKKyAgICBtZWRpYUxvZ0Z1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icAppbmRleCA5MTU5MGUxLi41OTg5MTgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQW5kcm9pZC5icApAQCAtMSw2ICsxLDE1IEBACiAvLyBNZWRpYSBTdGF0aXN0aWNzIHNlcnZpY2UKIC8vCiAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogdGlkeV9lcnJvcnMgPSBbCiAgICAgLy8gaHR0cHM6Ly9jbGFuZy5sbHZtLm9yZy9leHRyYS9jbGFuZy10aWR5L2NoZWNrcy9saXN0Lmh0bWwKICAgICAvLyBGb3IgbWFueSBjYXRlZ29yaWVzLCB0aGUgY2hlY2tzIGFyZSB0b28gbWFueSB0byBzcGVjaWZ5IGluZGl2aWR1YWxseS4KQEAgLTIxLDcgKzMwLDcgQEAKICAgICAibW9kZXJuaXplLWxvb3AtY29udmVydCIsCiAgICAgIm1vZGVybml6ZS1tYWtlLXNoYXJlZCIsCiAgICAgIm1vZGVybml6ZS1tYWtlLXVuaXF1ZSIsCi0gICAgIm1vZGVybml6ZS1wYXNzLWJ5LXZhbHVlIiwKKyAgICAvLyAibW9kZXJuaXplLXBhc3MtYnktdmFsdWUiLCAvLyBmb3VuZCBpbiBUaW1lTWFjaGluZS5oCiAgICAgIm1vZGVybml6ZS1yYXctc3RyaW5nLWxpdGVyYWwiLAogICAgICJtb2Rlcm5pemUtcmVkdW5kYW50LXZvaWQtYXJnIiwKICAgICAibW9kZXJuaXplLXJlcGxhY2UtYXV0by1wdHIiLApAQCAtMjksMTMgKzM4LDEzIEBACiAgICAgIm1vZGVybml6ZS1yZXR1cm4tYnJhY2VkLWluaXQtbGlzdCIsCiAgICAgIm1vZGVybml6ZS1zaHJpbmstdG8tZml0IiwKICAgICAibW9kZXJuaXplLXVuYXJ5LXN0YXRpYy1hc3NlcnQiLAotICAgICJtb2Rlcm5pemUtdXNlLWF1dG8iLCAgLy8gZGViYXRhYmxlIC0gYXV0byBjYW4gb2JzY3VyZSB0eXBlCisgICAgLy8gIm1vZGVybml6ZS11c2UtYXV0byIsICAvLyBmb3VuZCBpbiBNZWRpYU1ldHJpY3NTZXJ2aWNlLmgsIGRlYmF0YWJsZSAtIGF1dG8gY2FuIG9ic2N1cmUgdHlwZQogICAgICJtb2Rlcm5pemUtdXNlLWJvb2wtbGl0ZXJhbHMiLAogICAgICJtb2Rlcm5pemUtdXNlLWRlZmF1bHQtbWVtYmVyLWluaXQiLAogICAgICJtb2Rlcm5pemUtdXNlLWVtcGxhY2UiLAogICAgICJtb2Rlcm5pemUtdXNlLWVxdWFscy1kZWZhdWx0IiwKICAgICAibW9kZXJuaXplLXVzZS1lcXVhbHMtZGVsZXRlIiwKLSAgICAibW9kZXJuaXplLXVzZS1ub2Rpc2NhcmQiLAorICAgIC8vICJtb2Rlcm5pemUtdXNlLW5vZGlzY2FyZCIsIC8vIGZvdW5kIGluIFRpbWVNYWNoaW5lLmgKICAgICAibW9kZXJuaXplLXVzZS1ub2V4Y2VwdCIsCiAgICAgIm1vZGVybml6ZS11c2UtbnVsbHB0ciIsCiAgICAgIm1vZGVybml6ZS11c2Utb3ZlcnJpZGUiLApAQCAtNDgsNiArNTcsMTEgQEAKICAgICAvLyBSZW1vdmUgc29tZSBwZWRhbnRpYyBzdHlsaXN0aWMgcmVxdWlyZW1lbnRzLgogICAgICItZ29vZ2xlLXJlYWRhYmlsaXR5LWNhc3RpbmciLCAvLyBDKysgY2FzdHMgbm90IGFsd2F5cyBuZWNlc3NhcnkgYW5kIG1heSBiZSB2ZXJib3NlCiAgICAgIi1nb29nbGUtcmVhZGFiaWxpdHktdG9kbyIsICAgIC8vIGRvIG5vdCByZXF1aXJlIFRPRE8oaW5mbykKKworICAgICItYnVncHJvbmUtdW5oYW5kbGVkLXNlbGYtYXNzaWdubWVudCIsIC8vIGZvdW5kIGluIFRpbWVNYWNoaW5lLmgKKyAgICAiLWJ1Z3Byb25lLXN1c3BpY2lvdXMtc3RyaW5nLWNvbXBhcmUiLCAvLyBmb3VuZCBpbiBUaW1lTWFjaGluZS5oCisgICAgIi1jZXJ0LW9vcDU0LWNwcCIsIC8vIGZvdW5kIGluIFRyYW5zYWN0aW9uTG9nLmgKKyAgICAiLWJ1Z3Byb25lLW5hcnJvd2luZy1jb252ZXJzaW9ucyIsIC8vIGIvMTgyNDEwODQ1CiBdCiAKIGNjX2RlZmF1bHRzIHsKQEAgLTc5LDggKzkzLDcgQEAKICAgICB0aWR5X2NoZWNrczogdGlkeV9lcnJvcnMsCiAgICAgdGlkeV9jaGVja3NfYXNfZXJyb3JzOiB0aWR5X2Vycm9ycywKICAgICB0aWR5X2ZsYWdzOiBbCi0gICAgICAiLWZvcm1hdC1zdHlsZT0nZmlsZSciLAotICAgICAgIi0taGVhZGVyLWZpbHRlcj0nZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvJyIsCisgICAgICAiLWZvcm1hdC1zdHlsZT1maWxlIiwKICAgICBdLAogfQogCkBAIC0xMDAsNiArMTEzLDcgQEAKICAgICAgICAgImxpYm1lZGlhbWV0cmljc3NlcnZpY2UiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzX2hlYWRlcnMiLApAQCAtMTExLDcgKzEyNSw3IEBACiAgICAgXSwKIH0KIAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbWV0cmljc3NlcnZpY2UiLAogICAgIGRlZmF1bHRzOiBbCiAgICAgICAgICJtZWRpYW1ldHJpY3NfZmxhZ3NfZGVmYXVsdHMiLApAQCAtMTQyLDYgKzE1Niw3IEBACiAgICAgfSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKICAgICAgICAgImxpYmJhc2UiLCAvLyBhbmRyb2lkIGxvZ2dpbmcKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLApAQCAtMTUxLDEwICsxNjYsMTggQEAKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAogICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGF0c2xvZyIsCisgICAgICAgICJsaWJzdGF0c3B1bGwiLAorICAgICAgICAibGlic3RhdHNzb2NrZXQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGF0c3B1bGwiLAorICAgICAgICAibGlic3RhdHNzb2NrZXQiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlicGxhdGZvcm1wcm90b3MiLAogICAgIF0sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvQW5hbHl0aWNzLmNwcAppbmRleCBkNzhkMWUzLi40NWM5ZjU2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPiAgICAvLyBjbG9jayBjb252ZXJzaW9ucwogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4gICAgICAgICAgICAgLy8gc3RhdHNkCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlICJBdWRpb1R5cGVzLmgiICAgICAgICAgICAvLyBzdHJpbmcgdG8gaW50IGNvbnZlcnNpb25zCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIiAgLy8gcGFja2FnZSBpbmZvCkBAIC04Nyw2ICs4OCw3IEBACiAgICAgInNlbGVjdGVkX2RldmljZV9pZCIsCiAgICAgImNhbGxlciIsCiAgICAgInNvdXJjZSIsCisgICAgImxvZ19zZXNzaW9uX2lkIiwKIH07CiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvVGhyZWFkRGV2aWNlVXNhZ2VGaWVsZHNbXSA9IHsKQEAgLTEyNCw2ICsxMjYsNyBAQAogICAgICJjb250ZW50X3R5cGUiLAogICAgICJjYWxsZXIiLAogICAgICJ0cmFpdHMiLAorICAgICJsb2dfc2Vzc2lvbl9pZCIsCiB9OwogCiBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb0RldmljZUNvbm5lY3Rpb25GaWVsZHNbXSA9IHsKQEAgLTEzNiw2ICsxMzksNTYgQEAKICAgICAiY29ubmVjdGlvbl9jb3VudCIsCiB9OwogCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKiBjb25zdCBBQXVkaW9TdHJlYW1GaWVsZHNbXSB7CisgICAgIm1lZGlhbWV0cmljc19hYXVkaW9zdHJlYW1fcmVwb3J0ZWQiLAorICAgICJwYXRoIiwKKyAgICAiZGlyZWN0aW9uIiwKKyAgICAiZnJhbWVzX3Blcl9idXJzdCIsCisgICAgImJ1ZmZlcl9zaXplIiwKKyAgICAiYnVmZmVyX2NhcGFjaXR5IiwKKyAgICAiY2hhbm5lbF9jb3VudCIsCisgICAgInRvdGFsX2ZyYW1lc190cmFuc2ZlcnJlZCIsCisgICAgInBlcmZfbW9kZV9yZXF1ZXN0ZWQiLAorICAgICJwZXJmX21vZGVfYWN0dWFsIiwKKyAgICAic2hhcmluZyIsCisgICAgInhydW5fY291bnQiLAorICAgICJkZXZpY2VfdHlwZSIsCisgICAgImZvcm1hdF9hcHAiLAorICAgICJmb3JtYXRfZGV2aWNlIiwKKyAgICAibG9nX3Nlc3Npb25faWQiLAorICAgICJzYW1wbGVfcmF0ZSIsCisgICAgImNvbnRlbnRfdHlwZSIsCisgICAgInNoYXJpbmdfcmVxdWVzdGVkIiwKK307CisKKy8qKgorICogcHJpbnRGaWVsZHMgaXMgYSBoZWxwZXIgbWV0aG9kIHRoYXQgcHJpbnRzIHRoZSBmaWVsZHMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgKiBpbiBhIGh1bWFuIHJlYWRhYmxlIHN0eWxlLgorICovCit0ZW1wbGF0ZSA8c2l6ZV90IE4sIHR5cGVuYW1lIC4uLlR5cGVzPgorc3RkOjpzdHJpbmcgcHJpbnRGaWVsZHMoY29uc3QgY2hhciAqIGNvbnN0ICgmIGZpZWxkcylbTl0sIFR5cGVzIC4uLiBhcmdzKQoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICIgeyAiOworICAgIHN0cmluZ3V0aWxzOjpmaWVsZFByaW50KHNzLCBmaWVsZHMsIGFyZ3MuLi4pOworICAgIHNzIDw8ICJ9IjsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8qKgorICogc2VuZFRvU3RhdHNkIGlzIGEgaGVscGVyIG1ldGhvZCB0aGF0IHNlbmRzIHRoZSBhcmd1bWVudHMgdG8gc3RhdHNkCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSAuLi5UeXBlcz4KK2ludCBzZW5kVG9TdGF0c2QoVHlwZXMgLi4uIGFyZ3MpCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyNpZmRlZiBTVEFUU0RfRU5BQkxFCisgICAgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYXJncy4uLik7CisjZW5kaWYKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiAvKioKICAqIHNlbmRUb1N0YXRzZCBpcyBhIGhlbHBlciBtZXRob2QgdGhhdCBzZW5kcyB0aGUgYXJndW1lbnRzIHRvIHN0YXRzZAogICogYW5kIHJldHVybnMgYSBwYWlyIHsgcmVzdWx0LCBzdW1tYXJ5X3N0cmluZyB9LgpAQCAtMTU2LDggKzIwOSwxMCBAQAogICAgIHJldHVybiB7IHJlc3VsdCwgc3Muc3RyKCkgfTsKIH0KIAotQXVkaW9BbmFseXRpY3M6OkF1ZGlvQW5hbHl0aWNzKCkKK0F1ZGlvQW5hbHl0aWNzOjpBdWRpb0FuYWx5dGljcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiYgc3RhdHNkTG9nKQogICAgIDogbURlbGl2ZXJTdGF0aXN0aWNzKHByb3BlcnR5X2dldF9ib29sKFBST1BfQVVESU9fQU5BTFlUSUNTX0NMT1VEX0VOQUJMRUQsIHRydWUpKQorICAgICwgbVN0YXRzZExvZyhzdGF0c2RMb2cpCisgICAgLCBtQXVkaW9Qb3dlclVzYWdlKHRoaXMsIHN0YXRzZExvZykKIHsKICAgICBTZXRNaW5pbXVtTG9nU2V2ZXJpdHkoYW5kcm9pZDo6YmFzZTo6REVCVUcpOyAvLyBmb3IgTE9HKCkuCiAgICAgQUxPR0QoIiVzIiwgX19mdW5jX18pOwpAQCAtMTkyLDYgKzI0NywzMyBAQAogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfSkpOwogCisgICAgLy8gSGFuZGxlIGxlZ2FjeSBhYXVkaW8gcGxheWJhY2sgc3RyZWFtIHN0YXRpc3RpY3MKKyAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCisgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19UUkFDSyAiKi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKKyAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0VOREFBVURJT1NUUkVBTSksCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKSB7CisgICAgICAgICAgICAgICAgbUFBdWRpb1N0cmVhbUluZm8uZW5kQUF1ZGlvU3RyZWFtKGl0ZW0sIEFBdWRpb1N0cmVhbUluZm86OkNBTExFUl9QQVRIX0xFR0FDWSk7CisgICAgICAgICAgICB9KSk7CisKKyAgICAvLyBIYW5kbGUgbGVnYWN5IGFhdWRpbyBjYXB0dXJlIHN0cmVhbSBzdGF0aXN0aWNzCisgICAgbUFjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICBBTUVESUFNRVRSSUNTX0tFWV9QUkVGSVhfQVVESU9fUkVDT1JEICIqLiIgQU1FRElBTUVUUklDU19QUk9QX0VWRU5ULAorICAgICAgICBzdGQ6OnN0cmluZyhBTUVESUFNRVRSSUNTX1BST1BfRVZFTlRfVkFMVUVfRU5EQUFVRElPU1RSRUFNKSwKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBbmFseXRpY3NBY3Rpb25zOjpGdW5jdGlvbj4oCisgICAgICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJml0ZW0pIHsKKyAgICAgICAgICAgICAgICBtQUF1ZGlvU3RyZWFtSW5mby5lbmRBQXVkaW9TdHJlYW0oaXRlbSwgQUF1ZGlvU3RyZWFtSW5mbzo6Q0FMTEVSX1BBVEhfTEVHQUNZKTsKKyAgICAgICAgICAgIH0pKTsKKworICAgIC8vIEhhbmRsZSBtbWFwIGFhdWRpbyBzdHJlYW0gc3RhdGlzdGljcworICAgIG1BY3Rpb25zLmFkZEFjdGlvbigKKyAgICAgICAgQU1FRElBTUVUUklDU19LRVlfUFJFRklYX0FVRElPX1NUUkVBTSAiKi4iIEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwKKyAgICAgICAgc3RkOjpzdHJpbmcoQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0VOREFBVURJT1NUUkVBTSksCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QW5hbHl0aWNzQWN0aW9uczo6RnVuY3Rpb24+KAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtKSB7CisgICAgICAgICAgICAgICAgbUFBdWRpb1N0cmVhbUluZm8uZW5kQUF1ZGlvU3RyZWFtKGl0ZW0sIEFBdWRpb1N0cmVhbUluZm86OkNBTExFUl9QQVRIX01NQVApOworICAgICAgICAgICAgfSkpOworCiAgICAgLy8gSGFuZGxlIGRldmljZSB1c2UgcmVjb3JkIHN0YXRpc3RpY3MKICAgICBtQWN0aW9ucy5hZGRBY3Rpb24oCiAgICAgICAgIEFNRURJQU1FVFJJQ1NfS0VZX1BSRUZJWF9BVURJT19SRUNPUkQgIiouIiBBTUVESUFNRVRSSUNTX1BST1BfRVZFTlQsCkBAIC0zMzgsMjAgKzQyMCw2IEBACiAgICAgICAgIGxsIC09IGw7CiAgICAgfQogCi0gICAgaWYgKGxsID4gMCkgewotICAgICAgICAvLyBQcmludCB0aGUgc3RhdHNkIGF0b21zIHdlIHNlbnQgb3V0LgotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBzdGF0c2QgPSBtU3RhdHNkTG9nLmR1bXBUb1N0cmluZygiICAiIC8qIHByZWZpeCAqLywgbGwgLSAxKTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IG4gPSBzdGQ6OmNvdW50KHN0YXRzZC5iZWdpbigpLCBzdGF0c2QuZW5kKCksICdcbicpICsgMTsgLy8gd2UgY29udHJvbCB0aGlzLgotICAgICAgICBpZiAoKHNpemVfdClsbCA+PSBuKSB7Ci0gICAgICAgICAgICBpZiAobiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3MgPDwgIlN0YXRzZCBhdG9tczogZW1wdHkgb3IgdHJ1bmNhdGVkXG4iOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcyA8PCAiU3RhdHNkIGF0b21zOlxuIiA8PCBzdGF0c2Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsbCAtPSBuOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgaWYgKGxsID4gMCAmJiBwcmVmaXggPT0gbnVsbHB0cikgewogICAgICAgICBhdXRvIFtzLCBsXSA9IG1BdWRpb1Bvd2VyVXNhZ2UuZHVtcChsbCk7CiAgICAgICAgIHNzIDw8IHM7CkBAIC00ODQsMTIgKzU1MiwxOCBAQAogICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2U7CiAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAogICAgICAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX1NPVVJDRSwgJnNvdXJjZSk7CisgICAgICAgIC8vIEFuZHJvaWQgUworICAgICAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CisgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX0xPR1NFU1NJT05JRCwgJmxvZ1Nlc3Npb25JZCk7CiAKICAgICAgICAgY29uc3QgYXV0byBjYWxsZXJOYW1lRm9yU3RhdHMgPQogICAgICAgICAgICAgICAgIHR5cGVzOjpsb29rdXA8dHlwZXM6OkNBTExFUl9OQU1FLCBzaG9ydF9lbnVtX3R5cGVfdD4oY2FsbGVyTmFtZSk7CiAgICAgICAgIGNvbnN0IGF1dG8gZW5jb2RpbmdGb3JTdGF0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OkVOQ09ESU5HLCBzaG9ydF9lbnVtX3R5cGVfdD4oZW5jb2RpbmcpOwogICAgICAgICBjb25zdCBhdXRvIGZsYWdzRm9yU3RhdHMgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpJTlBVVF9GTEFHLCBzaG9ydF9lbnVtX3R5cGVfdD4oZmxhZ3MpOwogICAgICAgICBjb25zdCBhdXRvIHNvdXJjZUZvclN0YXRzID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6U09VUkNFX1RZUEUsIHNob3J0X2VudW1fdHlwZV90Pihzb3VyY2UpOworICAgICAgICAvLyBBbmRyb2lkIFMKKyAgICAgICAgY29uc3QgYXV0byBsb2dTZXNzaW9uSWRGb3JTdGF0cyA9IHN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOwogCiAgICAgICAgIExPRyhMT0dfTEVWRUwpIDw8ICJrZXk6IiA8PCBrZXkKICAgICAgICAgICAgICAgPDwgIiBpZDoiIDw8IGlkCkBAIC01MDQsNyArNTc4LDkgQEAKICAgICAgICAgICAgICAgPDwgIikgcGFja2FnZU5hbWU6IiA8PCBwYWNrYWdlTmFtZQogICAgICAgICAgICAgICA8PCAiIHNlbGVjdGVkRGV2aWNlSWQ6IiA8PCBzZWxlY3RlZERldmljZUlkCiAgICAgICAgICAgICAgIDw8ICIgY2FsbGVyTmFtZToiIDw8IGNhbGxlck5hbWUgPDwgIigiIDw8IGNhbGxlck5hbWVGb3JTdGF0cwotICAgICAgICAgICAgICA8PCAiKSBzb3VyY2U6IiA8PCBzb3VyY2UgPDwgIigiIDw8IHNvdXJjZUZvclN0YXRzIDw8ICIpIjsKKyAgICAgICAgICAgICAgPDwgIikgc291cmNlOiIgPDwgc291cmNlIDw8ICIoIiA8PCBzb3VyY2VGb3JTdGF0cworICAgICAgICAgICAgICA8PCAiKSBsb2dTZXNzaW9uSWQ6IiA8PCBsb2dTZXNzaW9uSWQgPDwgIigiIDw8IGxvZ1Nlc3Npb25JZEZvclN0YXRzCisgICAgICAgICAgICAgIDw8ICIpIjsKICAgICAgICAgaWYgKGNsaWVudENhbGxlZCAgLy8gb25seSBsb2cgaWYgY2xpZW50IGFwcCBjYWxsZWQgQXVkaW9SZWNvcmQuCiAgICAgICAgICAgICAgICAgJiYgbUF1ZGlvQW5hbHl0aWNzLm1EZWxpdmVyU3RhdGlzdGljcykgewogICAgICAgICAgICAgY29uc3QgYXV0byBbIHJlc3VsdCwgc3RyIF0gPSBzZW5kVG9TdGF0c2QoQXVkaW9SZWNvcmREZXZpY2VVc2FnZUZpZWxkcywKQEAgLTUyMiw5ICs1OTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLCBzZWxlY3RlZERldmljZUlkCiAgICAgICAgICAgICAgICAgICAgICwgRU5VTV9FWFRSQUNUKGNhbGxlck5hbWVGb3JTdGF0cykKICAgICAgICAgICAgICAgICAgICAgLCBFTlVNX0VYVFJBQ1Qoc291cmNlRm9yU3RhdHMpCisgICAgICAgICAgICAgICAgICAgICwgbG9nU2Vzc2lvbklkRm9yU3RhdHMuY19zdHIoKQogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBzdGF0c2QgJXMiLCBfX2Z1bmNfXywgc3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1TdGF0c2RMb2cubG9nKCIlcyIsIHN0ci5jX3N0cigpKTsKKyAgICAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tU3RhdHNkTG9nLT5sb2coCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRERFVklDRVVTQUdFX1JFUE9SVEVELCBzdHIpOwogICAgICAgICB9CiAgICAgfSBicmVhazsKICAgICBjYXNlIFRIUkVBRDogewpAQCAtNTcyLDcgKzY1MCw4IEBACiAgICAgICAgICAgICAgICAgLCBFTlVNX0VYVFJBQ1QodHlwZUZvclN0YXRzKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogc3RhdHNkICVzIiwgX19mdW5jX18sIHN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tU3RhdHNkTG9nLmxvZygiJXMiLCBzdHIuY19zdHIoKSk7CisgICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MubVN0YXRzZExvZy0+bG9nKAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9USFJFQURERVZJQ0VVU0FHRV9SRVBPUlRFRCwgc3RyKTsKICAgICAgICAgfQogICAgIH0gYnJlYWs7CiAgICAgY2FzZSBUUkFDSzogewpAQCAtNjIyLDYgKzcwMSwxMCBAQAogICAgICAgICBzdGQ6OnN0cmluZyB1c2FnZTsKICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCiAgICAgICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfVVNBR0UsICZ1c2FnZSk7CisgICAgICAgIC8vIEFuZHJvaWQgUworICAgICAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CisgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX0xPR1NFU1NJT05JRCwgJmxvZ1Nlc3Npb25JZCk7CiAKICAgICAgICAgY29uc3QgYXV0byBjYWxsZXJOYW1lRm9yU3RhdHMgPQogICAgICAgICAgICAgICAgIHR5cGVzOjpsb29rdXA8dHlwZXM6OkNBTExFUl9OQU1FLCBzaG9ydF9lbnVtX3R5cGVfdD4oY2FsbGVyTmFtZSk7CkBAIC02MzQsNiArNzE3LDggQEAKICAgICAgICAgY29uc3QgYXV0byB0cmFpdHNGb3JTdGF0cyA9CiAgICAgICAgICAgICAgICAgIHR5cGVzOjpsb29rdXA8dHlwZXM6OlRSQUNLX1RSQUlUUywgc2hvcnRfZW51bV90eXBlX3Q+KHRyYWl0cyk7CiAgICAgICAgIGNvbnN0IGF1dG8gdXNhZ2VGb3JTdGF0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OlVTQUdFLCBzaG9ydF9lbnVtX3R5cGVfdD4odXNhZ2UpOworICAgICAgICAvLyBBbmRyb2lkIFMKKyAgICAgICAgY29uc3QgYXV0byBsb2dTZXNzaW9uSWRGb3JTdGF0cyA9IHN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOwogCiAgICAgICAgIExPRyhMT0dfTEVWRUwpIDw8ICJrZXk6IiA8PCBrZXkKICAgICAgICAgICAgICAgPDwgIiBpZDoiIDw8IGlkCkBAIC02NTgsNiArNzQzLDcgQEAKICAgICAgICAgICAgICAgPDwgIiBzdHJlYW1UeXBlOiIgPDwgc3RyZWFtVHlwZSA8PCAiKCIgPDwgc3RyZWFtVHlwZUZvclN0YXRzCiAgICAgICAgICAgICAgIDw8ICIpIHRyYWl0czoiIDw8IHRyYWl0cyA8PCAiKCIgPDwgdHJhaXRzRm9yU3RhdHMKICAgICAgICAgICAgICAgPDwgIikgdXNhZ2U6IiA8PCB1c2FnZSA8PCAiKCIgPDwgdXNhZ2VGb3JTdGF0cworICAgICAgICAgICAgICA8PCAiKSBsb2dTZXNzaW9uSWQ6IiA8PCBsb2dTZXNzaW9uSWQgPDwgIigiIDw8IGxvZ1Nlc3Npb25JZEZvclN0YXRzCiAgICAgICAgICAgICAgIDw8ICIpIjsKICAgICAgICAgaWYgKGNsaWVudENhbGxlZCAvLyBvbmx5IGxvZyBpZiBjbGllbnQgYXBwIGNhbGxlZCBBdWRpb1RyYWNrcwogICAgICAgICAgICAgICAgICYmIG1BdWRpb0FuYWx5dGljcy5tRGVsaXZlclN0YXRpc3RpY3MpIHsKQEAgLTY4Miw5ICs3NjgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgLCBFTlVNX0VYVFJBQ1QoY29udGVudFR5cGVGb3JTdGF0cykKICAgICAgICAgICAgICAgICAgICAgLCBFTlVNX0VYVFJBQ1QoY2FsbGVyTmFtZUZvclN0YXRzKQogICAgICAgICAgICAgICAgICAgICAsIEVOVU1fRVhUUkFDVCh0cmFpdHNGb3JTdGF0cykKKyAgICAgICAgICAgICAgICAgICAgLCBsb2dTZXNzaW9uSWRGb3JTdGF0cy5jX3N0cigpCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBBTE9HVigiJXM6IHN0YXRzZCAlcyIsIF9fZnVuY19fLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MubVN0YXRzZExvZy5sb2coIiVzIiwgc3RyLmNfc3RyKCkpOworICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1TdGF0c2RMb2ctPmxvZygKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tERVZJQ0VVU0FHRV9SRVBPUlRFRCwgc3RyKTsKICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgIH0KQEAgLTczNyw3ICs4MjUsNyBAQAogICAgICAgICBtQTJkcENvbm5lY3Rpb25TZXJ2aWNlTnMgPSAwOwogICAgICAgICArK21BMmRwQ29ubmVjdGlvblN1Y2Nlc3NlczsKIAotICAgICAgICBjb25zdCBhdXRvIGNvbm5lY3Rpb25UaW1lTXMgPSBmbG9hdCh0aW1lRGlmZk5zICogMWUtNik7CisgICAgICAgIGNvbnN0IGF1dG8gY29ubmVjdGlvblRpbWVNcyA9IGZsb2F0KChkb3VibGUpdGltZURpZmZOcyAqIDFlLTYpOwogCiAgICAgICAgIGNvbnN0IGF1dG8gb3V0cHV0RGV2aWNlQml0cyA9IHR5cGVzOjpsb29rdXA8dHlwZXM6Ok9VVFBVVF9ERVZJQ0UsIGxvbmdfZW51bV90eXBlX3Q+KAogICAgICAgICAgICAgICAgICJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIik7CkBAIC03NjAsNyArODQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgLCAvKiBjb25uZWN0aW9uX2NvdW50ICovIDEKICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogc3RhdHNkICVzIiwgX19mdW5jX18sIHN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tU3RhdHNkTG9nLmxvZygiJXMiLCBzdHIuY19zdHIoKSk7CisgICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MubVN0YXRzZExvZy0+bG9nKAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9ERVZJQ0VDT05ORUNUSU9OX1JFUE9SVEVELCBzdHIpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtODEzLDcgKzkwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICwgLyogY29ubmVjdGlvbl9jb3VudCAqLyAxCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBBTE9HVigiJXM6IHN0YXRzZCAlcyIsIF9fZnVuY19fLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICBtQXVkaW9BbmFseXRpY3MubVN0YXRzZExvZy5sb2coIiVzIiwgc3RyLmNfc3RyKCkpOworICAgICAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1TdGF0c2RMb2ctPmxvZygKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPREVWSUNFQ09OTkVDVElPTl9SRVBPUlRFRCwgc3RyKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODM5LDcgKzkyOSwxODUgQEAKICAgICAgICAgICAgICAgICAsIC8qIGNvbm5lY3Rpb25fY291bnQgKi8gMQogICAgICAgICAgICAgICAgICk7CiAgICAgICAgIEFMT0dWKCIlczogc3RhdHNkICVzIiwgX19mdW5jX18sIHN0ci5jX3N0cigpKTsKLSAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1TdGF0c2RMb2cubG9nKCIlcyIsIHN0ci5jX3N0cigpKTsKKyAgICAgICAgbUF1ZGlvQW5hbHl0aWNzLm1TdGF0c2RMb2ctPmxvZygKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9ERVZJQ0VDT05ORUNUSU9OX1JFUE9SVEVELCBzdHIpOworICAgIH0KK30KKwordm9pZCBBdWRpb0FuYWx5dGljczo6QUF1ZGlvU3RyZWFtSW5mbzo6ZW5kQUF1ZGlvU3RyZWFtKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgYW5kcm9pZDo6bWVkaWFtZXRyaWNzOjpJdGVtPiAmaXRlbSwgQ2FsbGVyUGF0aCBwYXRoKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSA9IGl0ZW0tPmdldEtleSgpOworCisgICAgc3RkOjpzdHJpbmcgZGlyZWN0aW9uU3RyOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfRElSRUNUSU9OLCAmZGlyZWN0aW9uU3RyKTsKKyAgICBjb25zdCBhdXRvIGRpcmVjdGlvbiA9IHR5cGVzOjpsb29rdXA8dHlwZXM6OkFBVURJT19ESVJFQ1RJT04sIGludDMyX3Q+KGRpcmVjdGlvblN0cik7CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gLTE7CisgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCisgICAgICAgICAgICBrZXksIEFNRURJQU1FVFJJQ1NfUFJPUF9CVVJTVEZSQU1FUywgJmZyYW1lc1BlckJ1cnN0KTsKKworICAgIGludDMyX3QgYnVmZmVyU2l6ZUluRnJhbWVzID0gLTE7CisgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCisgICAgICAgICAgICBrZXksIEFNRURJQU1FVFJJQ1NfUFJPUF9CVUZGRVJTSVpFRlJBTUVTLCAmYnVmZmVyU2l6ZUluRnJhbWVzKTsKKworICAgIGludDMyX3QgYnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyA9IC0xOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfQlVGRkVSQ0FQQUNJVFlGUkFNRVMsICZidWZmZXJDYXBhY2l0eUluRnJhbWVzKTsKKworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCisgICAgICAgICAgICBrZXksIEFNRURJQU1FVFJJQ1NfUFJPUF9DSEFOTkVMQ09VTlQsICZjaGFubmVsQ291bnQpOworICAgIGlmIChjaGFubmVsQ291bnQgPT0gLTEpIHsKKyAgICAgICAgLy8gVHJ5IHRvIGdldCBjaGFubmVsIGNvdW50IGZyb20gY2hhbm5lbCBtYXNrLiBGcm9tIHRoZSBsZWdhY3kgcGF0aCwKKyAgICAgICAgLy8gb25seSBjaGFubmVsIG1hc2sgYXJlIGxvZ2dlZC4KKyAgICAgICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7CisgICAgICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX0NIQU5ORUxNQVNLLCAmY2hhbm5lbE1hc2spOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIE91dHB1dCwga2VlcCBzeW5jIHdpdGggQXVkaW9UeXBlcyNnZXRBQXVkaW9EaXJlY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8vIElucHV0LCBrZWVwIHN5bmMgd2l0aCBBdWRpb1R5cGVzI2dldEFBdWRpb0RpcmVjdGlvbigpCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkludmFsaWQgZGlyZWN0aW9uICVkIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgdG90YWxGcmFtZXNUcmFuc2ZlcnJlZCA9IC0xOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfRlJBTUVTVFJBTlNGRVJSRUQsICZ0b3RhbEZyYW1lc1RyYW5zZmVycmVkKTsKKworICAgIHN0ZDo6c3RyaW5nIHBlcmZNb2RlUmVxdWVzdGVkU3RyOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfUEVSRk9STUFOQ0VNT0RFLCAmcGVyZk1vZGVSZXF1ZXN0ZWRTdHIpOworICAgIGNvbnN0IGF1dG8gcGVyZk1vZGVSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgdHlwZXM6Omxvb2t1cDx0eXBlczo6QUFVRElPX1BFUkZPUk1BTkNFX01PREUsIGludDMyX3Q+KHBlcmZNb2RlUmVxdWVzdGVkU3RyKTsKKworICAgIHN0ZDo6c3RyaW5nIHBlcmZNb2RlQWN0dWFsU3RyOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfUEVSRk9STUFOQ0VNT0RFQUNUVUFMLCAmcGVyZk1vZGVBY3R1YWxTdHIpOworICAgIGNvbnN0IGF1dG8gcGVyZk1vZGVBY3R1YWwgPQorICAgICAgICAgICAgdHlwZXM6Omxvb2t1cDx0eXBlczo6QUFVRElPX1BFUkZPUk1BTkNFX01PREUsIGludDMyX3Q+KHBlcmZNb2RlQWN0dWFsU3RyKTsKKworICAgIHN0ZDo6c3RyaW5nIHNoYXJpbmdNb2RlQWN0dWFsU3RyOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfU0hBUklOR01PREVBQ1RVQUwsICZzaGFyaW5nTW9kZUFjdHVhbFN0cik7CisgICAgY29uc3QgYXV0byBzaGFyaW5nTW9kZUFjdHVhbCA9CisgICAgICAgICAgICB0eXBlczo6bG9va3VwPHR5cGVzOjpBQVVESU9fU0hBUklOR19NT0RFLCBpbnQzMl90PihzaGFyaW5nTW9kZUFjdHVhbFN0cik7CisKKyAgICBpbnQzMl90IHhydW5Db3VudCA9IC0xOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfVU5ERVJSVU4sICZ4cnVuQ291bnQpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZERldmljZVR5cGVzOworICAgIC8vIFRPRE86IG9ubHkgcm91dGVkIGRldmljZSBpZCBpcyBsb2dnZWQsIGJ1dCBubyBkZXZpY2UgdHlwZQorCisgICAgc3RkOjpzdHJpbmcgZm9ybWF0QXBwU3RyOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfRU5DT0RJTkdDTElFTlQsICZmb3JtYXRBcHBTdHIpOworICAgIGNvbnN0IGF1dG8gZm9ybWF0QXBwID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6RU5DT0RJTkcsIGludDMyX3Q+KGZvcm1hdEFwcFN0cik7CisKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXREZXZpY2VTdHI7CisgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCisgICAgICAgICAgICBrZXksIEFNRURJQU1FVFJJQ1NfUFJPUF9FTkNPRElORywgJmZvcm1hdERldmljZVN0cik7CisgICAgY29uc3QgYXV0byBmb3JtYXREZXZpY2UgPSB0eXBlczo6bG9va3VwPHR5cGVzOjpFTkNPRElORywgaW50MzJfdD4oZm9ybWF0RGV2aWNlU3RyKTsKKworICAgIHN0ZDo6c3RyaW5nIGxvZ1Nlc3Npb25JZDsKKyAgICBtQXVkaW9BbmFseXRpY3MubUFuYWx5dGljc1N0YXRlLT50aW1lTWFjaGluZSgpLmdldCgKKyAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX0xPR1NFU1NJT05JRCwgJmxvZ1Nlc3Npb25JZCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIG1BdWRpb0FuYWx5dGljcy5tQW5hbHl0aWNzU3RhdGUtPnRpbWVNYWNoaW5lKCkuZ2V0KAorICAgICAgICAgICAga2V5LCBBTUVESUFNRVRSSUNTX1BST1BfU0FNUExFUkFURSwgJnNhbXBsZVJhdGUpOworCisgICAgc3RkOjpzdHJpbmcgY29udGVudFR5cGVTdHI7CisgICAgbUF1ZGlvQW5hbHl0aWNzLm1BbmFseXRpY3NTdGF0ZS0+dGltZU1hY2hpbmUoKS5nZXQoCisgICAgICAgICAgICBrZXksIEFNRURJQU1FVFJJQ1NfUFJPUF9DT05URU5UVFlQRSwgJmNvbnRlbnRUeXBlU3RyKTsKKyAgICBjb25zdCBhdXRvIGNvbnRlbnRUeXBlID0gdHlwZXM6Omxvb2t1cDx0eXBlczo6Q09OVEVOVF9UWVBFLCBpbnQzMl90Pihjb250ZW50VHlwZVN0cik7CisKKyAgICBzdGQ6OnN0cmluZyBzaGFyaW5nTW9kZVJlcXVlc3RlZFN0cjsKKyAgICBtQXVkaW9BbmFseXRpY3MubUFuYWx5dGljc1N0YXRlLT50aW1lTWFjaGluZSgpLmdldCgKKyAgICAgICAgICAgIGtleSwgQU1FRElBTUVUUklDU19QUk9QX1NIQVJJTkdNT0RFLCAmc2hhcmluZ01vZGVSZXF1ZXN0ZWRTdHIpOworICAgIGNvbnN0IGF1dG8gc2hhcmluZ01vZGVSZXF1ZXN0ZWQgPQorICAgICAgICAgICAgdHlwZXM6Omxvb2t1cDx0eXBlczo6QUFVRElPX1NIQVJJTkdfTU9ERSwgaW50MzJfdD4oc2hhcmluZ01vZGVSZXF1ZXN0ZWRTdHIpOworCisgICAgTE9HKExPR19MRVZFTCkgPDwgImtleToiIDw8IGtleQorICAgICAgICAgICAgPDwgIiBwYXRoOiIgPDwgcGF0aAorICAgICAgICAgICAgPDwgIiBkaXJlY3Rpb246IiA8PCBkaXJlY3Rpb24gPDwgIigiIDw8IGRpcmVjdGlvblN0ciA8PCAiKSIKKyAgICAgICAgICAgIDw8ICIgZnJhbWVzX3Blcl9idXJzdDoiIDw8IGZyYW1lc1BlckJ1cnN0CisgICAgICAgICAgICA8PCAiIGJ1ZmZlcl9zaXplOiIgPDwgYnVmZmVyU2l6ZUluRnJhbWVzCisgICAgICAgICAgICA8PCAiIGJ1ZmZlcl9jYXBhY2l0eToiIDw8IGJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMKKyAgICAgICAgICAgIDw8ICIgY2hhbm5lbF9jb3VudDoiIDw8IGNoYW5uZWxDb3VudAorICAgICAgICAgICAgPDwgIiB0b3RhbF9mcmFtZXNfdHJhbnNmZXJyZWQ6IiA8PCB0b3RhbEZyYW1lc1RyYW5zZmVycmVkCisgICAgICAgICAgICA8PCAiIHBlcmZfbW9kZV9yZXF1ZXN0ZWQ6IiA8PCBwZXJmTW9kZVJlcXVlc3RlZCA8PCAiKCIgPDwgcGVyZk1vZGVSZXF1ZXN0ZWRTdHIgPDwgIikiCisgICAgICAgICAgICA8PCAiIHBlcmZfbW9kZV9hY3R1YWw6IiA8PCBwZXJmTW9kZUFjdHVhbCA8PCAiKCIgPDwgcGVyZk1vZGVBY3R1YWxTdHIgPDwgIikiCisgICAgICAgICAgICA8PCAiIHNoYXJpbmc6IiA8PCBzaGFyaW5nTW9kZUFjdHVhbCA8PCAiKCIgPDwgc2hhcmluZ01vZGVBY3R1YWxTdHIgPDwgIikiCisgICAgICAgICAgICA8PCAiIHhydW5fY291bnQ6IiA8PCB4cnVuQ291bnQKKyAgICAgICAgICAgIDw8ICIgZGV2aWNlX3R5cGU6IiA8PCBzZXJpYWxpemVkRGV2aWNlVHlwZXMKKyAgICAgICAgICAgIDw8ICIgZm9ybWF0X2FwcDoiIDw8IGZvcm1hdEFwcCA8PCAiKCIgPDwgZm9ybWF0QXBwU3RyIDw8ICIpIgorICAgICAgICAgICAgPDwgIiBmb3JtYXRfZGV2aWNlOiAiIDw8IGZvcm1hdERldmljZSA8PCAiKCIgPDwgZm9ybWF0RGV2aWNlU3RyIDw8ICIpIgorICAgICAgICAgICAgPDwgIiBsb2dfc2Vzc2lvbl9pZDogIiA8PCBsb2dTZXNzaW9uSWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlX3JhdGU6ICIgPDwgc2FtcGxlUmF0ZQorICAgICAgICAgICAgPDwgIiBjb250ZW50X3R5cGU6ICIgPDwgY29udGVudFR5cGUgPDwgIigiIDw8IGNvbnRlbnRUeXBlU3RyIDw8ICIpIgorICAgICAgICAgICAgPDwgIiBzaGFyaW5nX3JlcXVlc3RlZDoiIDw8IHNoYXJpbmdNb2RlUmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBzaGFyaW5nTW9kZVJlcXVlc3RlZFN0ciA8PCAiKSI7CisKKyAgICBpZiAobUF1ZGlvQW5hbHl0aWNzLm1EZWxpdmVyU3RhdGlzdGljcykgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoCisgICAgICAgICAgICBzZXJpYWxpemVkRGV2aWNlVHlwZXMuY19zdHIoKSwgc2VyaWFsaXplZERldmljZVR5cGVzLnNpemUoKSk7CisgICAgICAgIGNvbnN0IGF1dG8gcmVzdWx0ID0gc2VuZFRvU3RhdHNkKAorICAgICAgICAgICAgICAgIENPTkRJVElPTihhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQUFVRElPU1RSRUFNX1JFUE9SVEVEKQorICAgICAgICAgICAgICAgICwgcGF0aAorICAgICAgICAgICAgICAgICwgZGlyZWN0aW9uCisgICAgICAgICAgICAgICAgLCBmcmFtZXNQZXJCdXJzdAorICAgICAgICAgICAgICAgICwgYnVmZmVyU2l6ZUluRnJhbWVzCisgICAgICAgICAgICAgICAgLCBidWZmZXJDYXBhY2l0eUluRnJhbWVzCisgICAgICAgICAgICAgICAgLCBjaGFubmVsQ291bnQKKyAgICAgICAgICAgICAgICAsIHRvdGFsRnJhbWVzVHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAsIHBlcmZNb2RlUmVxdWVzdGVkCisgICAgICAgICAgICAgICAgLCBwZXJmTW9kZUFjdHVhbAorICAgICAgICAgICAgICAgICwgc2hhcmluZ01vZGVBY3R1YWwKKyAgICAgICAgICAgICAgICAsIHhydW5Db3VudAorICAgICAgICAgICAgICAgICwgYmZfc2VyaWFsaXplZAorICAgICAgICAgICAgICAgICwgZm9ybWF0QXBwCisgICAgICAgICAgICAgICAgLCBmb3JtYXREZXZpY2UKKyAgICAgICAgICAgICAgICAsIGxvZ1Nlc3Npb25JZC5jX3N0cigpCisgICAgICAgICAgICAgICAgLCBzYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgLCBjb250ZW50VHlwZQorICAgICAgICAgICAgICAgICwgc2hhcmluZ01vZGVSZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICApOworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgc3MgPDwgInJlc3VsdDoiIDw8IHJlc3VsdDsKKyAgICAgICAgY29uc3QgYXV0byBmaWVsZHNTdHIgPSBwcmludEZpZWxkcyhBQXVkaW9TdHJlYW1GaWVsZHMsCisgICAgICAgICAgICAgICAgQ09ORElUSU9OKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BQVVESU9TVFJFQU1fUkVQT1JURUQpCisgICAgICAgICAgICAgICAgLCBwYXRoCisgICAgICAgICAgICAgICAgLCBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAsIGZyYW1lc1BlckJ1cnN0CisgICAgICAgICAgICAgICAgLCBidWZmZXJTaXplSW5GcmFtZXMKKyAgICAgICAgICAgICAgICAsIGJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMKKyAgICAgICAgICAgICAgICAsIGNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgICwgdG90YWxGcmFtZXNUcmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICwgcGVyZk1vZGVSZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICAsIHBlcmZNb2RlQWN0dWFsCisgICAgICAgICAgICAgICAgLCBzaGFyaW5nTW9kZUFjdHVhbAorICAgICAgICAgICAgICAgICwgeHJ1bkNvdW50CisgICAgICAgICAgICAgICAgLCBzZXJpYWxpemVkRGV2aWNlVHlwZXMuY19zdHIoKQorICAgICAgICAgICAgICAgICwgZm9ybWF0QXBwCisgICAgICAgICAgICAgICAgLCBmb3JtYXREZXZpY2UKKyAgICAgICAgICAgICAgICAsIGxvZ1Nlc3Npb25JZC5jX3N0cigpCisgICAgICAgICAgICAgICAgLCBzYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgLCBjb250ZW50VHlwZQorICAgICAgICAgICAgICAgICwgc2hhcmluZ01vZGVSZXF1ZXN0ZWQKKyAgICAgICAgICAgICAgICApOworICAgICAgICBzcyA8PCAiICIgPDwgZmllbGRzU3RyOworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBzcy5zdHIoKTsKKyAgICAgICAgQUxPR1YoIiVzOiBzdGF0c2QgJXMiLCBfX2Z1bmNfXywgc3RyLmNfc3RyKCkpOworICAgICAgICBtQXVkaW9BbmFseXRpY3MubVN0YXRzZExvZy0+bG9nKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BQVVESU9TVFJFQU1fUkVQT1JURUQsIHN0cik7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9BbmFseXRpY3MuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5oCmluZGV4IGRmMDk3YjEuLjJiNDFhOTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb0FuYWx5dGljcy5oCkBAIC0xNywxMCArMTcsMTAgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1NpbXBsZUxvZy5oPgogI2luY2x1ZGUgIkFuYWx5dGljc0FjdGlvbnMuaCIKICNpbmNsdWRlICJBbmFseXRpY3NTdGF0ZS5oIgogI2luY2x1ZGUgIkF1ZGlvUG93ZXJVc2FnZS5oIgorI2luY2x1ZGUgIlN0YXRzZExvZy5oIgogI2luY2x1ZGUgIlRpbWVkQWN0aW9uLmgiCiAjaW5jbHVkZSAiV3JhcC5oIgogCkBAIC0zMiw3ICszMiw3IEBACiAgICAgZnJpZW5kIEF1ZGlvUG93ZXJVc2FnZTsKIAogcHVibGljOgotICAgIEF1ZGlvQW5hbHl0aWNzKCk7CisgICAgZXhwbGljaXQgQXVkaW9BbmFseXRpY3MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRzZExvZz4mIHN0YXRzZExvZyk7CiAgICAgfkF1ZGlvQW5hbHl0aWNzKCk7CiAKICAgICAvKioKQEAgLTEyMiw4ICsxMjIsNyBAQAogICAgIFNoYXJlZFB0cldyYXA8QW5hbHl0aWNzU3RhdGU+IG1QcmV2aW91c0FuYWx5dGljc1N0YXRlOwogCiAgICAgVGltZWRBY3Rpb24gbVRpbWVkQWN0aW9uOyAvLyBsb2NrZWQgaW50ZXJuYWxseQotCi0gICAgU2ltcGxlTG9nIG1TdGF0c2RMb2d7MTYgLyogbG9nIGxpbmVzICovfTsgLy8gbG9ja2VkIGludGVybmFsbHkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiBtU3RhdHNkTG9nOyAvLyBsb2NrZWQgaW50ZXJuYWxseSwgb2sgZm9yIG11bHRpcGxlIHRocmVhZHMuCiAKICAgICAvLyBEZXZpY2VVc2UgaXMgYSBuZXN0ZWQgY2xhc3Mgd2hpY2ggaGFuZGxlcyBhdWRpbyBkZXZpY2UgdXNhZ2UgYWNjb3VudGluZy4KICAgICAvLyBXZSBkZWZpbmUgdGhpcyBjbGFzcyBhdCB0aGUgZW5kIHRvIGVuc3VyZSBwcmlvciB2YXJpYWJsZXMgYWxsIHByb3Blcmx5IGNvbnN0cnVjdGVkLgpAQCAtMTg5LDcgKzE4OCwzMCBAQAogICAgICAgICBpbnQzMl90IG1BMmRwQ29ubmVjdGlvblVua25vd25zIEdVQVJERURfQlkobUxvY2spID0gMDsKICAgICB9IG1EZXZpY2VDb25uZWN0aW9ueyp0aGlzfTsKIAotICAgIEF1ZGlvUG93ZXJVc2FnZSBtQXVkaW9Qb3dlclVzYWdle3RoaXN9OworICAgIC8vIEFBdWRpb1N0cmVhbUluZm8gaXMgYSBuZXN0ZWQgY2xhc3Mgd2hpY2ggY29sbGVjdCBhYXVkaW8gc3RyZWFtIGluZm8gZnJvbSBib3RoIGNsaWVudCBhbmQKKyAgICAvLyBzZXJ2ZXIgc2lkZS4KKyAgICBjbGFzcyBBQXVkaW9TdHJlYW1JbmZvIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIEFsbCB0aGUgZW51bSBoZXJlIG11c3QgYmUga2VwdCB0aGUgc2FtZSBhcyB0aGUgb25lcyBkZWZpbmVkIGluIGF0b21zLnByb3RvCisgICAgICAgIGVudW0gQ2FsbGVyUGF0aCB7CisgICAgICAgICAgICBDQUxMRVJfUEFUSF9VTktOT1dOID0gMCwKKyAgICAgICAgICAgIENBTExFUl9QQVRIX0xFR0FDWSA9IDEsCisgICAgICAgICAgICBDQUxMRVJfUEFUSF9NTUFQID0gMiwKKyAgICAgICAgfTsKKworICAgICAgICBleHBsaWNpdCBBQXVkaW9TdHJlYW1JbmZvKEF1ZGlvQW5hbHl0aWNzICZhdWRpb0FuYWx5dGljcykKKyAgICAgICAgICAgIDogbUF1ZGlvQW5hbHl0aWNzKGF1ZGlvQW5hbHl0aWNzKSB7fQorCisgICAgICAgIHZvaWQgZW5kQUF1ZGlvU3RyZWFtKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBhbmRyb2lkOjptZWRpYW1ldHJpY3M6Okl0ZW0+ICZpdGVtLAorICAgICAgICAgICAgICAgIENhbGxlclBhdGggcGF0aCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIEF1ZGlvQW5hbHl0aWNzICZtQXVkaW9BbmFseXRpY3M7CisgICAgfSBtQUF1ZGlvU3RyZWFtSW5mb3sqdGhpc307CisKKyAgICBBdWRpb1Bvd2VyVXNhZ2UgbUF1ZGlvUG93ZXJVc2FnZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcAppbmRleCBjY2E2YjQxLi5hYjc0YzhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KICNpbmNsdWRlIDxzeXMvdGltZXJmZC5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIC8vIHByb3BlcnR5IHRvIGRpc2FibGUgYXVkaW8gcG93ZXIgdXNlIG1ldHJpY3MgZmVhdHVyZSwgZGVmYXVsdCBpcyBlbmFibGVkCiAjZGVmaW5lIFBST1BfQVVESU9fTUVUUklDU19ESVNBQkxFRCAicGVyc2lzdC5tZWRpYS5hdWRpb19tZXRyaWNzLnBvd2VyX3VzYWdlX2Rpc2FibGVkIgpAQCAtMTI3LDE0ICsxMjcsMTMgQEAKICAgICByZXR1cm4gZGV2aWNlTWFzazsKIH0KIAotLyogc3RhdGljICovCi12b2lkIEF1ZGlvUG93ZXJVc2FnZTo6c2VuZEl0ZW0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pCit2b2lkIEF1ZGlvUG93ZXJVc2FnZTo6c2VuZEl0ZW0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0pIGNvbnN0CiB7CiAgICAgaW50MzJfdCB0eXBlOwogICAgIGlmICghaXRlbS0+Z2V0SW50MzIoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9UWVBFLCAmdHlwZSkpIHJldHVybjsKIAotICAgIGludDMyX3QgZGV2aWNlOwotICAgIGlmICghaXRlbS0+Z2V0SW50MzIoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9ERVZJQ0UsICZkZXZpY2UpKSByZXR1cm47CisgICAgaW50MzJfdCBhdWRpb19kZXZpY2U7CisgICAgaWYgKCFpdGVtLT5nZXRJbnQzMihBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RFVklDRSwgJmF1ZGlvX2RldmljZSkpIHJldHVybjsKIAogICAgIGludDY0X3QgZHVyYXRpb25fbnM7CiAgICAgaWYgKCFpdGVtLT5nZXRJbnQ2NChBVURJT19QT1dFUl9VU0FHRV9QUk9QX0RVUkFUSU9OX05TLCAmZHVyYXRpb25fbnMpKSByZXR1cm47CkBAIC0xNDIsMTEgKzE0MSwyNCBAQAogICAgIGRvdWJsZSB2b2x1bWU7CiAgICAgaWYgKCFpdGVtLT5nZXREb3VibGUoQVVESU9fUE9XRVJfVVNBR0VfUFJPUF9WT0xVTUUsICZ2b2x1bWUpKSByZXR1cm47CiAKLSAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShkdXJhdGlvbl9ucyAvIE5BTk9TX1BFUl9TRUNPTkQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdm9sdW1lLAorICAgIGNvbnN0IGludDMyX3QgZHVyYXRpb25fc2VjcyA9IChpbnQzMl90KShkdXJhdGlvbl9ucyAvIE5BTk9TX1BFUl9TRUNPTkQpOworICAgIGNvbnN0IGZsb2F0IGF2ZXJhZ2Vfdm9sdW1lID0gKGZsb2F0KXZvbHVtZTsKKyAgICBjb25zdCBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6QVVESU9fUE9XRVJfVVNBR0VfREFUQV9SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9zZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3ZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBsb2c7CisgICAgbG9nIDw8ICJyZXN1bHQ6IiA8PCByZXN1bHQgPDwgIiB7IgorICAgICAgICAgICAgPDwgIiBtZWRpYW1ldHJpY3NfYXVkaW9fcG93ZXJfdXNhZ2VfZGF0YV9yZXBvcnRlZDoiCisgICAgICAgICAgICA8PCBhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVECisgICAgICAgICAgICA8PCAiIGF1ZGlvX2RldmljZToiIDw8IGF1ZGlvX2RldmljZQorICAgICAgICAgICAgPDwgIiBkdXJhdGlvbl9zZWNzOiIgPDwgZHVyYXRpb25fc2VjcworICAgICAgICAgICAgPDwgIiBhdmVyYWdlX3ZvbHVtZToiIDw8IGF2ZXJhZ2Vfdm9sdW1lCisgICAgICAgICAgICA8PCAiIHR5cGU6IiA8PCB0eXBlCisgICAgICAgICAgICA8PCAiIH0iOworICAgIG1TdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpBVURJT19QT1dFUl9VU0FHRV9EQVRBX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogfQogCiBib29sIEF1ZGlvUG93ZXJVc2FnZTo6c2F2ZUFzSXRlbV9sKApAQCAtMTc0LDggKzE4Niw4IEBACiAgICAgICAgIGlmIChpdGVtX2RldmljZSA9PSBkZXZpY2UgJiYgaXRlbV90eXBlID09IHR5cGUpIHsKICAgICAgICAgICAgIGludDY0X3QgZmluYWxfZHVyYXRpb25fbnMgPSBpdGVtX2R1cmF0aW9uX25zICsgZHVyYXRpb25fbnM7CiAgICAgICAgICAgICBkb3VibGUgZmluYWxfdm9sdW1lID0gKGRldmljZSAmIElOUFVUX0RFVklDRV9CSVQpID8gMS4wOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaXRlbV92b2x1bWUgKiBpdGVtX2R1cmF0aW9uX25zICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3ZvbCAqIGR1cmF0aW9uX25zKSAvIGZpbmFsX2R1cmF0aW9uX25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW1fdm9sdW1lICogKGRvdWJsZSlpdGVtX2R1cmF0aW9uX25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlX3ZvbCAqIChkb3VibGUpZHVyYXRpb25fbnMpIC8gKGRvdWJsZSlmaW5hbF9kdXJhdGlvbl9ucyk7CiAKICAgICAgICAgICAgIGl0ZW0tPnNldEludDY0KEFVRElPX1BPV0VSX1VTQUdFX1BST1BfRFVSQVRJT05fTlMsIGZpbmFsX2R1cmF0aW9uX25zKTsKICAgICAgICAgICAgIGl0ZW0tPnNldERvdWJsZShBVURJT19QT1dFUl9VU0FHRV9QUk9QX1ZPTFVNRSwgZmluYWxfdm9sdW1lKTsKQEAgLTIwMCw2ICsyMTIsMzQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBBdWRpb1Bvd2VyVXNhZ2U6OnNhdmVBc0l0ZW1zX2woCisgICAgICAgIGludDMyX3QgZGV2aWNlLCBpbnQ2NF90IGR1cmF0aW9uX25zLCBpbnQzMl90IHR5cGUsIGRvdWJsZSBhdmVyYWdlX3ZvbCkKK3sKKyAgICBBTE9HVigiJXM6ICglI3gsICVkLCAlbGxkLCAlZikiLCBfX2Z1bmNfXywgZGV2aWNlLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uX25zLCBhdmVyYWdlX3ZvbCApOworICAgIGlmIChkdXJhdGlvbl9ucyA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBza2lwIGR1cmF0aW9uIDAgdXNhZ2UKKyAgICB9CisgICAgaWYgKGRldmljZSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvL2lnbm9yZSB1bmtub3duIGRldmljZQorICAgIH0KKworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgY29uc3QgaW50MzJfdCBpbnB1dF9iaXQgPSBkZXZpY2UgJiBJTlBVVF9ERVZJQ0VfQklUOworICAgIGludDMyX3QgZGV2aWNlX2JpdHMgPSBkZXZpY2UgXiBpbnB1dF9iaXQ7CisKKyAgICB3aGlsZSAoZGV2aWNlX2JpdHMgIT0gMCkgeworICAgICAgICBpbnQzMl90IHRtcF9kZXZpY2UgPSBkZXZpY2VfYml0cyAmIC1kZXZpY2VfYml0czsgLy8gZ2V0IGxvd2VzdCBiaXQKKyAgICAgICAgZGV2aWNlX2JpdHMgXj0gdG1wX2RldmljZTsgIC8vIGNsZWFyIGxvd2VzdCBiaXQKKyAgICAgICAgdG1wX2RldmljZSB8PSBpbnB1dF9iaXQ7ICAgIC8vIHJlc3RvcmUgaW5wdXQgYml0CisgICAgICAgIHJldCA9IHNhdmVBc0l0ZW1fbCh0bXBfZGV2aWNlLCBkdXJhdGlvbl9ucywgdHlwZSwgYXZlcmFnZV92b2wpOworCisgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICUjeCByZWNvcmRlZCwgcmVtYWluaW5nIGRldmljZV9iaXRzID0gJSN4IiwgX19mdW5jX18sCisgICAgICAgICAgICB0bXBfZGV2aWNlLCBkZXZpY2VfYml0cyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIHZvaWQgQXVkaW9Qb3dlclVzYWdlOjpjaGVja1RyYWNrUmVjb3JkKAogICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwgYm9vbCBpc1RyYWNrKQogewpAQCAtMjQ1LDcgKzI4NSw3IEBACiAgICAgICAgIEFMT0dWKCJkZXZpY2UgPSAlcyA9PiAlZCIsIGRldmljZV9zdHJpbmdzLmNfc3RyKCksIGRldmljZSk7CiAgICAgfQogICAgIHN0ZDo6bG9ja19ndWFyZCBsKG1Mb2NrKTsKLSAgICBzYXZlQXNJdGVtX2woZGV2aWNlLCBkZXZpY2VUaW1lTnMsIHR5cGUsIGRldmljZVZvbHVtZSk7CisgICAgc2F2ZUFzSXRlbXNfbChkZXZpY2UsIGRldmljZVRpbWVOcywgdHlwZSwgZGV2aWNlVm9sdW1lKTsKIH0KIAogdm9pZCBBdWRpb1Bvd2VyVXNhZ2U6OmNoZWNrTW9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkKQEAgLTI2MSw4ICszMDEsOCBAQAogICAgICAgICBjb25zdCBpbnQ2NF90IGR1cmF0aW9uTnMgPSBlbmRDYWxsTnMgLSBtRGV2aWNlVGltZU5zOwogICAgICAgICBpZiAoZHVyYXRpb25OcyA+IDApIHsKICAgICAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAobURldmljZVZvbHVtZSAqIGRvdWJsZShtVm9sdW1lVGltZU5zIC0gbURldmljZVRpbWVOcykgKwotICAgICAgICAgICAgICAgICAgICBtVm9pY2VWb2x1bWUgKiBkb3VibGUoZW5kQ2FsbE5zIC0gbVZvbHVtZVRpbWVOcykpIC8gZHVyYXRpb25OczsKLSAgICAgICAgICAgIHNhdmVBc0l0ZW1fbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZENhbGxOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIChkb3VibGUpZHVyYXRpb25OczsKKyAgICAgICAgICAgIHNhdmVBc0l0ZW1zX2wobVByaW1hcnlEZXZpY2UsIGR1cmF0aW9uTnMsIFZPSUNFX0NBTExfVFlQRSwgbURldmljZVZvbHVtZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gIkFVRElPX01PREVfSU5fQ0FMTCIpIHsgLy8gZW50ZXJpbmcgY2FsbCBtb2RlCiAgICAgICAgIG1TdGFydENhbGxOcyA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOyAvLyBhZHZpc29yeSBvbmx5CkBAIC0yODksNyArMzI5LDcgQEAKICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbk5zID0gdGltZU5zIC0gbURldmljZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKHRpbWVOcyAtIG1Wb2x1bWVUaW1lTnMpKSAvIGR1cmF0aW9uTnM7CisgICAgICAgICAgICAgICAgICAgIG1Wb2ljZVZvbHVtZSAqIGRvdWJsZSh0aW1lTnMgLSBtVm9sdW1lVGltZU5zKSkgLyAoZG91YmxlKWR1cmF0aW9uTnM7CiAgICAgICAgICAgICBtVm9sdW1lVGltZU5zID0gdGltZU5zOwogICAgICAgICB9CiAgICAgfQpAQCAtMzIwLDggKzM2MCw4IEBACiAgICAgICAgIGNvbnN0IGludDY0X3QgZHVyYXRpb25OcyA9IGVuZERldmljZU5zIC0gbURldmljZVRpbWVOczsKICAgICAgICAgaWYgKGR1cmF0aW9uTnMgPiAwKSB7CiAgICAgICAgICAgICBtRGV2aWNlVm9sdW1lID0gKG1EZXZpY2VWb2x1bWUgKiBkb3VibGUobVZvbHVtZVRpbWVOcyAtIG1EZXZpY2VUaW1lTnMpICsKLSAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gZHVyYXRpb25OczsKLSAgICAgICAgICAgIHNhdmVBc0l0ZW1fbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVZvaWNlVm9sdW1lICogZG91YmxlKGVuZERldmljZU5zIC0gbVZvbHVtZVRpbWVOcykpIC8gKGRvdWJsZSlkdXJhdGlvbk5zOworICAgICAgICAgICAgc2F2ZUFzSXRlbXNfbChtUHJpbWFyeURldmljZSwgZHVyYXRpb25OcywgVk9JQ0VfQ0FMTF9UWVBFLCBtRGV2aWNlVm9sdW1lKTsKICAgICAgICAgfQogICAgICAgICAvLyByZXNldCBzdGF0aXN0aWNzCiAgICAgICAgIG1EZXZpY2VWb2x1bWUgPSAwOwpAQCAtMzMyLDggKzM3MiwxMCBAQAogICAgIG1QcmltYXJ5RGV2aWNlID0gZGV2aWNlOwogfQogCi1BdWRpb1Bvd2VyVXNhZ2U6OkF1ZGlvUG93ZXJVc2FnZShBdWRpb0FuYWx5dGljcyAqYXVkaW9BbmFseXRpY3MpCitBdWRpb1Bvd2VyVXNhZ2U6OkF1ZGlvUG93ZXJVc2FnZSgKKyAgICAgICAgQXVkaW9BbmFseXRpY3MgKmF1ZGlvQW5hbHl0aWNzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiYgc3RhdHNkTG9nKQogICAgIDogbUF1ZGlvQW5hbHl0aWNzKGF1ZGlvQW5hbHl0aWNzKQorICAgICwgbVN0YXRzZExvZyhzdGF0c2RMb2cpCiAgICAgLCBtRGlzYWJsZWQocHJvcGVydHlfZ2V0X2Jvb2woUFJPUF9BVURJT19NRVRSSUNTX0RJU0FCTEVELCBBVURJT19NRVRSSUNTX0RJU0FCTEVEX0RFRkFVTFQpKQogICAgICwgbUludGVydmFsSG91cnMocHJvcGVydHlfZ2V0X2ludDMyKFBST1BfQVVESU9fTUVUUklDU19JTlRFUlZBTF9IUiwgSU5URVJWQUxfSFJfREVGQVVMVCkpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9Qb3dlclVzYWdlLmgKaW5kZXggNDQ2ZmY0Zi4uNzAyMTkwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvUG93ZXJVc2FnZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1Bvd2VyVXNhZ2UuaApAQCAtMjIsMTMgKzIyLDE1IEBACiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8dGhyZWFkPgogCisjaW5jbHVkZSAiU3RhdHNkTG9nLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MgewogCiBjbGFzcyBBdWRpb0FuYWx5dGljczsKIAogY2xhc3MgQXVkaW9Qb3dlclVzYWdlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBBdWRpb1Bvd2VyVXNhZ2UoQXVkaW9BbmFseXRpY3MgKmF1ZGlvQW5hbHl0aWNzKTsKKyAgICBBdWRpb1Bvd2VyVXNhZ2UoQXVkaW9BbmFseXRpY3MgKmF1ZGlvQW5hbHl0aWNzLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdHNkTG9nPiYgc3RhdHNkTG9nKTsKICAgICB+QXVkaW9Qb3dlclVzYWdlKCk7CiAKICAgICB2b2lkIGNoZWNrVHJhY2tSZWNvcmQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIGJvb2wgaXNUcmFjayk7CkBAIC04MywxMCArODUsMTMgQEAKIHByaXZhdGU6CiAgICAgYm9vbCBzYXZlQXNJdGVtX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQogICAgICAgICAgUkVRVUlSRVMobUxvY2spOwotICAgIHN0YXRpYyB2b2lkIHNlbmRJdGVtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKTsKKyAgICB2b2lkIHNlbmRJdGVtKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtKSBjb25zdDsKICAgICB2b2lkIGNvbGxlY3QoKTsKKyAgICBib29sIHNhdmVBc0l0ZW1zX2woaW50MzJfdCBkZXZpY2UsIGludDY0X3QgZHVyYXRpb24sIGludDMyX3QgdHlwZSwgZG91YmxlIGF2ZXJhZ2Vfdm9sKQorICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogCiAgICAgQXVkaW9BbmFseXRpY3MgKiBjb25zdCBtQXVkaW9BbmFseXRpY3M7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRzZExvZz4gbVN0YXRzZExvZzsgIC8vIG1TdGF0c2RMb2cgaXMgaW50ZXJuYWxseSBsb2NrZWQKICAgICBjb25zdCBib29sIG1EaXNhYmxlZDsKICAgICBjb25zdCBpbnQzMl90IG1JbnRlcnZhbEhvdXJzOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5jcHAKaW5kZXggYWE0NDQ0Ny4uODM4Y2RkNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmNwcApAQCAtNzYsNiArNzYsOCBAQAogICAgICAgICB7IkFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSIsICAgICAgICAgMUxMIDw8IDI3fSwKICAgICAgICAgeyJBVURJT19ERVZJQ0VfSU5fREVGQVVMVCIsICAgICAgICAgICAgICAgIDFMTCA8PCAyOH0sCiAgICAgICAgIC8vIFIgdmFsdWVzIGFib3ZlLgorICAgICAgICB7IkFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCIsICAgICAgICAgICAgMUxMIDw8IDI5fSwKKyAgICAgICAgeyJBVURJT19ERVZJQ0VfSU5fSERNSV9FQVJDIiwgICAgICAgICAgICAgIDFMTCA8PCAzMH0sCiAgICAgfTsKICAgICByZXR1cm4gbWFwOwogfQpAQCAtMTIxLDYgKzEyMyw5IEBACiAgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9FQ0hPX0NBTkNFTExFUiIsICAgICAgICAgICAgMUxMIDw8IDI5fSwKICAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQiLCAgICAgICAgICAgICAgICAgICAxTEwgPDwgMzB9LAogICAgICAgICAvLyBSIHZhbHVlcyBhYm92ZS4KKyAgICAgICAgeyJBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUIiwgICAgICAgICAgICAgICAxTEwgPDwgMzF9LAorICAgICAgICB7IkFVRElPX0RFVklDRV9PVVRfQkxFX1NQRUFLRVIiLCAgICAgICAgICAgICAgIDFMTCA8PCAzMn0sCisgICAgICAgIHsiQVVESU9fREVWSUNFX09VVF9IRE1JX0VBUkMiLCAgICAgICAgICAgICAgICAgMUxMIDw8IDMzfSwKICAgICB9OwogICAgIHJldHVybiBtYXA7CiB9CkBAIC0xNTEsNiArMTU2LDQwIEBACiAgICAgcmV0dXJuIG1hcDsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiYgZ2V0QUF1ZGlvRGlyZWN0aW9uKCkgeworICAgIC8vIERPIE5PVCBNT0RJRlkgVkFMVUVTKE9LIHRvIGFkZCBuZXcgb25lcykuCisgICAgLy8gVGhpcyBtYXkgYmUgZm91bmQgaW4gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiBtYXAgeworICAgICAgICAvLyBVTktOT1dOIGlzIDAKKyAgICAgICAgeyJBQVVESU9fRElSRUNUSU9OX09VVFBVVCIsICAgIDEgLyogQUFVRElPX0RJUkVDVElPTl9PVVRQVVQgKyAxICovfSwKKyAgICAgICAgeyJBQVVESU9fRElSRUNUSU9OX0lOUFVUIiwgICAgIDIgLyogQUFVRElPX0RJUkVDVElPTl9JTlBVVCArIDEqL30sCisgICAgfTsKKyAgICByZXR1cm4gbWFwOworfQorCitjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+JiBnZXRBQXVkaW9QZXJmb3JtYW5jZU1vZGUoKSB7CisgICAgLy8gRE8gTk9UIE1PRElGWSBWQUxVRVMoT0sgdG8gYWRkIG5ldyBvbmVzKS4KKyAgICAvLyBUaGlzIG1heSBiZSBmb3VuZCBpbiBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+IG1hcCB7CisgICAgICAgIC8vIFVOS05PV04gaXMgMAorICAgICAgICB7IkFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUiLCAgICAgICAgICAgIDEwfSwKKyAgICAgICAgeyJBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkciLCAgICAxMX0sCisgICAgICAgIHsiQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kiLCAgICAgMTJ9LAorICAgIH07CisgICAgcmV0dXJuIG1hcDsKK30KKworY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBpbnQzMl90PiYgZ2V0QUF1ZGlvU2hhcmluZ01vZGUoKSB7CisgICAgLy8gRE8gTk9UIE1PRElGWSBWQUxVRVMoT0sgdG8gYWRkIG5ldyBvbmVzKS4KKyAgICAvLyBUaGlzIG1heSBiZSBmb3VuZCBpbiBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAorICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludDMyX3Q+IG1hcCB7CisgICAgICAgIC8vIFVOS05PV04gaXMgMAorICAgICAgICB7IkFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFIiwgICAgMSAvKiBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSArIDEgKi99LAorICAgICAgICB7IkFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEIiwgICAgICAgMiAvKiBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCArIDEgKi99LAorICAgIH07CisgICAgcmV0dXJuIG1hcDsKK30KKwogLy8gSGVscGVyOiBDcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgaW50MzIgZnJvbSBzdHJpbmcgZmxhZ3Mgc3BsaXQgd2l0aCAnfCcuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHJhaXRzPgogaW50MzJfdCBpbnQzMkZyb21GbGFncyhjb25zdCBzdGQ6OnN0cmluZyAmZmxhZ3MpCkBAIC00MzAsNCArNDY5LDcwIEBACiAgICAgcmV0dXJuIGZsYWdzRnJvbU1hcCh0cmFpdHMsIGdldEF1ZGlvVHJhY2tUcmFpdHNNYXAoKSk7CiB9CiAKK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyBsb29rdXA8QUFVRElPX0RJUkVDVElPTj4oY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdGlvbikKK3sKKyAgICBhdXRvJiBtYXAgPSBnZXRBQXVkaW9EaXJlY3Rpb24oKTsKKyAgICBhdXRvIGl0ID0gbWFwLmZpbmQoZGlyZWN0aW9uKTsKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgcmV0dXJuIGRpcmVjdGlvbjsKK30KKwordGVtcGxhdGUgPD4KK2ludDMyX3QgbG9va3VwPEFBVURJT19ESVJFQ1RJT04+KGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3Rpb24pCit7CisgICAgYXV0byYgbWFwID0gZ2V0QUF1ZGlvRGlyZWN0aW9uKCk7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKGRpcmVjdGlvbik7CisgICAgaWYgKGl0ID09IG1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gMDsgLy8gcmV0dXJuIHVua25vd24KKyAgICB9CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDw+CitzdGQ6OnN0cmluZyBsb29rdXA8QUFVRElPX1BFUkZPUk1BTkNFX01PREU+KGNvbnN0IHN0ZDo6c3RyaW5nICZwZXJmb3JtYW5jZU1vZGUpCit7CisgICAgYXV0byYgbWFwID0gZ2V0QUF1ZGlvUGVyZm9ybWFuY2VNb2RlKCk7CisgICAgYXV0byBpdCA9IG1hcC5maW5kKHBlcmZvcm1hbmNlTW9kZSk7CisgICAgaWYgKGl0ID09IG1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHJldHVybiBwZXJmb3JtYW5jZU1vZGU7Cit9CisKK3RlbXBsYXRlIDw+CitpbnQzMl90IGxvb2t1cDxBQVVESU9fUEVSRk9STUFOQ0VfTU9ERT4oY29uc3Qgc3RkOjpzdHJpbmcgJnBlcmZvcm1hbmNlTW9kZSkKK3sKKyAgICBhdXRvJiBtYXAgPSBnZXRBQXVkaW9QZXJmb3JtYW5jZU1vZGUoKTsKKyAgICBhdXRvIGl0ID0gbWFwLmZpbmQocGVyZm9ybWFuY2VNb2RlKTsKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyByZXR1cm4gdW5rbm93bgorICAgIH0KKyAgICByZXR1cm4gaXQtPnNlY29uZDsKK30KKwordGVtcGxhdGUgPD4KK3N0ZDo6c3RyaW5nIGxvb2t1cDxBQVVESU9fU0hBUklOR19NT0RFPihjb25zdCBzdGQ6OnN0cmluZyAmc2hhcmluZ01vZGUpCit7CisgICAgYXV0byYgbWFwID0gZ2V0QUF1ZGlvU2hhcmluZ01vZGUoKTsKKyAgICBhdXRvIGl0ID0gbWFwLmZpbmQoc2hhcmluZ01vZGUpOworICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gc2hhcmluZ01vZGU7Cit9CisKK3RlbXBsYXRlIDw+CitpbnQzMl90IGxvb2t1cDxBQVVESU9fU0hBUklOR19NT0RFPihjb25zdCBzdGQ6OnN0cmluZyAmc2hhcmluZ01vZGUpCit7CisgICAgYXV0byYgbWFwID0gZ2V0QUF1ZGlvU2hhcmluZ01vZGUoKTsKKyAgICBhdXRvIGl0ID0gbWFwLmZpbmQoc2hhcmluZ01vZGUpOworICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIHJldHVybiB1bmtub3duCisgICAgfQorICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OnR5cGVzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL0F1ZGlvVHlwZXMuaAppbmRleCBlMWRlZWIxLi40Mzk0ZDc5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvQXVkaW9UeXBlcy5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9BdWRpb1R5cGVzLmgKQEAgLTQwLDYgKzQwLDkgQEAKIAogLy8gRW51bWVyYXRpb24gZm9yIGFsbCB0aGUgc3RyaW5nIHRyYW5zbGF0aW9ucyB0byBpbnRlZ2VycyAoZ2VuZXJhbGx5IGludDMyX3QpIHVubGVzcyBub3RlZC4KIGVudW0gQXVkaW9FbnVtQ2F0ZWdvcnkgeworICAgIEFBVURJT19ESVJFQ1RJT04sCisgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREUsCisgICAgQUFVRElPX1NIQVJJTkdfTU9ERSwKICAgICBDQUxMRVJfTkFNRSwKICAgICBDT05URU5UX1RZUEUsCiAgICAgRU5DT0RJTkcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5jcHAKaW5kZXggYmY2ZTQyOC4uMWQ2NDg3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmNwcApAQCAtMTksMTkgKzE5LDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKICNpbmNsdWRlIDxwd2QuaD4gLy9nZXRwd3VpZAogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvY29udGVudC9wbS9JUGFja2FnZU1hbmFnZXJOYXRpdmUuaD4gIC8vIHBhY2thZ2UgaW5mbwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+ICAgICAgICAgICAgICAgICAvLyBjbG9jayBjb252ZXJzaW9ucwogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPiAgICAgICAgICAgICAvLyBnZXQgY2FsbGluZyB1aWQKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+ICAgICAgICAgICAgLy8gY2hlY2tDYWxsaW5nUGVybWlzc2lvbgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+ICAgICAgICAgICAgICAgICAvLyBmb3IgcHJvcGVydHlfZ2V0CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9NZW1vcnlMZWFrVHJhY2tVdGlsLmg+CiAjaW5jbHVkZSA8bWVtdW5yZWFjaGFibGUvbWVtdW5yZWFjaGFibGUuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4gLy8gVUlECisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgPHNldD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCit1c2luZyBiYXNlOjpTdHJpbmdQcmludGY7CiB1c2luZyBtZWRpYW1ldHJpY3M6Okl0ZW07CiB1c2luZyBtZWRpYW1ldHJpY3M6OnN0YXJ0c1dpdGg7CiAKQEAgLTEwNyw3ICsxMTQsNyBAQAogewogICAgIEFMT0dEKCIlcyIsIF9fZnVuY19fKTsKICAgICAvLyB0aGUgY2xhc3MgZGVzdHJ1Y3RvciBjbGVhcnMgYW55aG93LCBidXQgd2UgZW5mb3JjZSBjbGVhcmluZyBpdGVtcyBmaXJzdC4KLSAgICBtSXRlbXNEaXNjYXJkZWQgKz0gbUl0ZW1zLnNpemUoKTsKKyAgICBtSXRlbXNEaXNjYXJkZWQgKz0gKGludDY0X3QpbUl0ZW1zLnNpemUoKTsKICAgICBtSXRlbXMuY2xlYXIoKTsKIH0KIApAQCAtMTk5LDIyICsyMDYsMTkgQEAKIAogICAgICh2b2lkKW1BdWRpb0FuYWx5dGljcy5zdWJtaXQoc2l0ZW0sIGlzVHJ1c3RlZCk7CiAKLSAgICBleHRlcm4gYm9vbCBkdW1wMlN0YXRzZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSk7Ci0gICAgKHZvaWQpZHVtcDJTdGF0c2Qoc2l0ZW0pOyAgLy8gZmFpbHVyZSBzaG91bGQgYmUgbG9nZ2VkIGluIGZ1bmN0aW9uLgorICAgICh2b2lkKWR1bXAyU3RhdHNkKHNpdGVtLCBtU3RhdHNkTG9nKTsgIC8vIGZhaWx1cmUgc2hvdWxkIGJlIGxvZ2dlZCBpbiBmdW5jdGlvbi4KICAgICBzYXZlSXRlbShzaXRlbSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQgPSBTdHJpbmdQcmludGYoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgImNhbid0IGR1bXAgTWVkaWFNZXRyaWNzU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5jX3N0cigpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KIApAQCAtMjQ2LDE3ICsyNTAsMTggQEAKICAgICAgICAgICAgIC8vIGR1bXBzeXMgbWVkaWEubWV0cmljcyBhdWRpb3RyYWNrLGNvZGVjCiAgICAgICAgICAgICAvLyBvciBkdW1wc3lzIG1lZGlhLm1ldHJpY3MgYXVkaW90cmFjayBjb2RlYwogCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJSZWNvZ25pemVkIHBhcmFtZXRlcnM6XG4iKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi0tYWxsICAgICAgICAgc2hvdyBhbGwgcmVjb3Jkc1xuIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItLWNsZWFyICAgICAgIGNsZWFyIG91dCBzYXZlZCByZWNvcmRzXG4iKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIi0taGVhcCAgICAgICAgc2hvdyBoZWFwIHVzYWdlICh0b3AgMTAwKVxuIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItLWhlbHAgICAgICAgIGRpc3BsYXkgaGVscFxuIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItLXByZWZpeCBYICAgIHByb2Nlc3MgcmVjb3JkcyBmb3IgY29tcG9uZW50IFhcbiIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLS1zaW5jZSBYICAgICBYIDwgMDogcmVjb3JkcyBmcm9tIC1YIHNlY29uZHMgaW4gdGhlIHBhc3RcbiIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAgICAgICBYID0gMDogaWdub3JlXG4iKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgICAgICAgICAgWCA+IDA6IHJlY29yZHMgZnJvbSBYIHNlY29uZHMgc2luY2UgVW5peCBlcG9jaFxuIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCItLXVucmVhY2hhYmxlIHNob3cgdW5yZWFjaGFibGUgbWVtb3J5IChsZWFrcylcbiIpOwotICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgcmVzdWx0W10gPQorICAgICAgICAgICAgICAgICAgICAiUmVjb2duaXplZCBwYXJhbWV0ZXJzOlxuIgorICAgICAgICAgICAgICAgICAgICAiLS1hbGwgICAgICAgICBzaG93IGFsbCByZWNvcmRzXG4iCisgICAgICAgICAgICAgICAgICAgICItLWNsZWFyICAgICAgIGNsZWFyIG91dCBzYXZlZCByZWNvcmRzXG4iCisgICAgICAgICAgICAgICAgICAgICItLWhlYXAgICAgICAgIHNob3cgaGVhcCB1c2FnZSAodG9wIDEwMClcbiIKKyAgICAgICAgICAgICAgICAgICAgIi0taGVscCAgICAgICAgZGlzcGxheSBoZWxwXG4iCisgICAgICAgICAgICAgICAgICAgICItLXByZWZpeCBYICAgIHByb2Nlc3MgcmVjb3JkcyBmb3IgY29tcG9uZW50IFhcbiIKKyAgICAgICAgICAgICAgICAgICAgIi0tc2luY2UgWCAgICAgWCA8IDA6IHJlY29yZHMgZnJvbSAtWCBzZWNvbmRzIGluIHRoZSBwYXN0XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIFggPSAwOiBpZ25vcmVcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgWCA+IDA6IHJlY29yZHMgZnJvbSBYIHNlY29uZHMgc2luY2UgVW5peCBlcG9jaFxuIgorICAgICAgICAgICAgICAgICAgICAiLS11bnJlYWNoYWJsZSBzaG93IHVucmVhY2hhYmxlIG1lbW9yeSAobGVha3MpXG4iOworICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdCwgc3RkOjpzaXplKHJlc3VsdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gcHJlZml4T3B0aW9uKSB7CiAgICAgICAgICAgICArK2k7CkBAIC0yODIsMzAgKzI4NywzNiBAQAogICAgICAgICAgICAgdW5yZWFjaGFibGUgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQotCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIF9sKG1Mb2NrKTsKIAogICAgICAgICBpZiAoY2xlYXIpIHsKLSAgICAgICAgICAgIG1JdGVtc0Rpc2NhcmRlZCArPSBtSXRlbXMuc2l6ZSgpOworICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkICs9IChpbnQ2NF90KW1JdGVtcy5zaXplKCk7CiAgICAgICAgICAgICBtSXRlbXMuY2xlYXIoKTsKICAgICAgICAgICAgIG1BdWRpb0FuYWx5dGljcy5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRHVtcCBvZiB0aGUgJXMgcHJvY2VzczpcbiIsIGtTZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICByZXN1bHQgPDwgU3RyaW5nUHJpbnRmKCJEdW1wIG9mIHRoZSAlcyBwcm9jZXNzOlxuIiwga1NlcnZpY2VOYW1lKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeHB0ciA9IHByZWZpeC5zaXplKCkgPiAwID8gcHJlZml4LmNfc3RyKCkgOiBudWxscHRyOwotICAgICAgICAgICAgZHVtcEhlYWRlcnMocmVzdWx0LCBzaW5jZU5zLCBwcmVmaXhwdHIpOwotICAgICAgICAgICAgZHVtcFF1ZXVlKHJlc3VsdCwgc2luY2VOcywgcHJlZml4cHRyKTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCBkdW1wSGVhZGVycyhzaW5jZU5zLCBwcmVmaXhwdHIpOworICAgICAgICAgICAgcmVzdWx0IDw8IGR1bXBRdWV1ZShzaW5jZU5zLCBwcmVmaXhwdHIpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBtYXliZSBjb25zaWRlciBhIGJldHRlciB3YXkgb2YgZHVtcGluZyBhdWRpbyBhbmFseXRpY3MgaW5mby4KICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGluZXNUb0R1bXAgPSBhbGwgPyBJTlQzMl9NQVggOiAxMDAwOwogICAgICAgICAgICAgYXV0byBbIGR1bXBTdHJpbmcsIGxpbmVzIF0gPSBtQXVkaW9BbmFseXRpY3MuZHVtcChsaW5lc1RvRHVtcCwgc2luY2VOcywgcHJlZml4cHRyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZHVtcFN0cmluZy5jX3N0cigpKTsKKyAgICAgICAgICAgIHJlc3VsdCA8PCBkdW1wU3RyaW5nOwogICAgICAgICAgICAgaWYgKGxpbmVzID09IGxpbmVzVG9EdW1wKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLS0gc29tZSBsaW5lcyBtYXkgYmUgdHJ1bmNhdGVkIC0tXG4iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPDwgIi0tIHNvbWUgbGluZXMgbWF5IGJlIHRydW5jYXRlZCAtLVxuIjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRHVtcCB0aGUgc3RhdHNkIGF0b21zIHdlIHNlbnQgb3V0LgorICAgICAgICAgICAgcmVzdWx0IDw8ICJTdGF0c2QgYXRvbXM6XG4iCisgICAgICAgICAgICAgICAgICAgPDwgbVN0YXRzZExvZy0+ZHVtcFRvU3RyaW5nKCIgICIgLyogcHJlZml4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsID8gU1RBVFNEX0xPR19MSU5FU19NQVggOiBTVEFUU0RfTE9HX0xJTkVTX0RVTVApOwogICAgICAgICB9CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0ciA9IHJlc3VsdC5zdHIoKTsKKyAgICB3cml0ZShmZCwgc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwogCiAgICAgLy8gQ2hlY2sgaGVhcCBhbmQgdW5yZWFjaGFibGUgbWVtb3J5IG91dHNpZGUgb2YgbG9jay4KICAgICBpZiAoaGVhcCkgewpAQCAtMzIzLDM4ICszMzQsMzcgQEAKIH0KIAogLy8gZHVtcCBoZWFkZXJzCi12b2lkIE1lZGlhTWV0cmljc1NlcnZpY2U6OmR1bXBIZWFkZXJzKFN0cmluZzggJnJlc3VsdCwgaW50NjRfdCBzaW5jZU5zLCBjb25zdCBjaGFyKiBwcmVmaXgpCitzdGQ6OnN0cmluZyBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpkdW1wSGVhZGVycyhpbnQ2NF90IHNpbmNlTnMsIGNvbnN0IGNoYXIqIHByZWZpeCkKIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAgICAgaWYgKG1lZGlhbWV0cmljczo6SXRlbTo6aXNFbmFibGVkKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWV0cmljcyBnYXRoZXJpbmc6IGVuYWJsZWRcbiIpOworICAgICAgICByZXN1bHQgPDwgIk1ldHJpY3MgZ2F0aGVyaW5nOiBlbmFibGVkXG4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1ldHJpY3MgZ2F0aGVyaW5nOiBESVNBQkxFRCB2aWEgcHJvcGVydHlcbiIpOworICAgICAgICByZXN1bHQgPDwgIk1ldHJpY3MgZ2F0aGVyaW5nOiBESVNBQkxFRCB2aWEgcHJvcGVydHlcbiI7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoCisgICAgcmVzdWx0IDw8IFN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICJTaW5jZSBCb290OiBTdWJtaXNzaW9uczogJWxsZCBBY2NlcHRlZDogJWxsZFxuIiwKICAgICAgICAgICAgIChsb25nIGxvbmcpbUl0ZW1zU3VibWl0dGVkLmxvYWQoKSwgKGxvbmcgbG9uZyltSXRlbXNGaW5hbGl6ZWQpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoCisgICAgcmVzdWx0IDw8IFN0cmluZ1ByaW50ZigKICAgICAgICAgICAgICJSZWNvcmRzIERpc2NhcmRlZDogJWxsZCAoYnkgQ291bnQ6ICVsbGQgYnkgRXhwaXJhdGlvbjogJWxsZClcbiIsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1JdGVtc0Rpc2NhcmRlZCwgKGxvbmcgbG9uZyltSXRlbXNEaXNjYXJkZWRDb3VudCwKICAgICAgICAgICAgIChsb25nIGxvbmcpbUl0ZW1zRGlzY2FyZGVkRXhwaXJlKTsKICAgICBpZiAocHJlZml4ICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUmVzdHJpY3RpbmcgdG8gcHJlZml4ICVzIiwgcHJlZml4KTsKKyAgICAgICAgcmVzdWx0IDw8ICJSZXN0cmljdGluZyB0byBwcmVmaXggIiA8PCBwcmVmaXggPDwgIlxuIjsKICAgICB9CiAgICAgaWYgKHNpbmNlTnMgIT0gMCkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KAotICAgICAgICAgICAgIkVtaXR0aW5nIFF1ZXVlIGVudHJpZXMgbW9yZSByZWNlbnQgdGhhbjogJWxsZFxuIiwKLSAgICAgICAgICAgIChsb25nIGxvbmcpc2luY2VOcyk7CisgICAgICAgIHJlc3VsdCA8PCAiRW1pdHRpbmcgUXVldWUgZW50cmllcyBtb3JlIHJlY2VudCB0aGFuOiAiIDw8IHNpbmNlTnMgPDwgIlxuIjsKICAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAogLy8gVE9ETzogc2hvdWxkIHByZWZpeCBiZSBhIHNldDxzdHJpbmc+Pwotdm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpkdW1wUXVldWUoU3RyaW5nOCAmcmVzdWx0LCBpbnQ2NF90IHNpbmNlTnMsIGNvbnN0IGNoYXIqIHByZWZpeCkKK3N0ZDo6c3RyaW5nIE1lZGlhTWV0cmljc1NlcnZpY2U6OmR1bXBRdWV1ZShpbnQ2NF90IHNpbmNlTnMsIGNvbnN0IGNoYXIqIHByZWZpeCkKIHsKICAgICBpZiAobUl0ZW1zLmVtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiZW1wdHlcbiIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiAiZW1wdHlcbiI7CiAgICAgfQotCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogICAgIGludCBzbG90ID0gMDsKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiBtSXRlbXMpIHsgICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBzdGQ6Omxvd2VyX2JvdW5kKCkgb24gbUl0ZW1zCiAgICAgICAgIGlmIChpdGVtLT5nZXRUaW1lc3RhbXAoKSA8IHNpbmNlTnMpIHsgLy8gc2luY2VOcyA9PSAwIG1lYW5zIGFsbCBpdGVtcyBzaG93bgpAQCAtMzY1LDkgKzM3NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSwgcHJlZml4KTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU1ZDogJXNcbiIsIHNsb3QsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJlc3VsdCA8PCBTdHJpbmdQcmludGYoIiU1ZDogJXNcbiIsIHNsb3QsIGl0ZW0tPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHNsb3QrKzsKICAgICB9CisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAogLy8KQEAgLTQxNiwxMCArNDI3LDEwIEBACiAKICAgICBpZiAoY29uc3Qgc2l6ZV90IHRvRXJhc2UgPSBvdmVybGltaXQgKyBleHBpcmVkOwogICAgICAgICAgICAgdG9FcmFzZSA+IDApIHsKLSAgICAgICAgbUl0ZW1zRGlzY2FyZGVkQ291bnQgKz0gb3ZlcmxpbWl0OwotICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUgKz0gZXhwaXJlZDsKLSAgICAgICAgbUl0ZW1zRGlzY2FyZGVkICs9IHRvRXJhc2U7Ci0gICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSwgbUl0ZW1zLmJlZ2luKCkgKyB0b0VyYXNlKTsgLy8gZXJhc2UgZnJvbSBmcm9udAorICAgICAgICBtSXRlbXNEaXNjYXJkZWRDb3VudCArPSAoaW50NjRfdClvdmVybGltaXQ7CisgICAgICAgIG1JdGVtc0Rpc2NhcmRlZEV4cGlyZSArPSAoaW50NjRfdClleHBpcmVkOworICAgICAgICBtSXRlbXNEaXNjYXJkZWQgKz0gKGludDY0X3QpdG9FcmFzZTsKKyAgICAgICAgbUl0ZW1zLmVyYXNlKG1JdGVtcy5iZWdpbigpLCBtSXRlbXMuYmVnaW4oKSArIChwdHJkaWZmX3QpdG9FcmFzZSk7IC8vIGVyYXNlIGZyb20gZnJvbnQKICAgICB9CiAgICAgcmV0dXJuIG1vcmU7CiB9CkBAIC00MzksNiArNDUwLDEwIEBACiAgICAgc3RkOjpsb2NrX2d1YXJkIF9sKG1Mb2NrKTsKICAgICAvLyB3ZSBhc3N1bWUgdGhlIGl0ZW1zIGFyZSByb3VnaGx5IGluIHRpbWUgb3JkZXIuCiAgICAgbUl0ZW1zLmVtcGxhY2VfYmFjayhpdGVtKTsKKyAgICBpZiAoaXNQdWxsYWJsZShpdGVtLT5nZXRLZXkoKSkpIHsKKyAgICAgICAgcmVnaXN0ZXJTdGF0c2RDYWxsYmFja3NJZk5lZWRlZCgpOworICAgICAgICBtUHVsbGFibGVJdGVtc1tpdGVtLT5nZXRLZXkoKV0uZW1wbGFjZV9iYWNrKGl0ZW0pOworICAgIH0KICAgICArK21JdGVtc0ZpbmFsaXplZDsKICAgICBpZiAoZXhwaXJhdGlvbnMoaXRlbSkKICAgICAgICAgICAgICYmICghbUV4cGlyZUZ1dHVyZS52YWxpZCgpCkBAIC00ODUsNCArNTAwLDU4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2U6OnJlZ2lzdGVyU3RhdHNkQ2FsbGJhY2tzSWZOZWVkZWQoKQoreworICAgIGlmIChtU3RhdHNkUmVnaXN0ZXJlZC50ZXN0X2FuZF9zZXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gdGFnID0gYW5kcm9pZDo6dXRpbDo6TUVESUFfRFJNX0FDVElWSVRZX0lORk87CisgICAgYXV0byBjYiA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnB1bGxBdG9tQ2FsbGJhY2s7CisgICAgQVN0YXRzTWFuYWdlcl9zZXRQdWxsQXRvbUNhbGxiYWNrKHRhZywgLyogbWV0YWRhdGEgKi8gbnVsbHB0ciwgY2IsIHRoaXMpOworfQorCisvKiBzdGF0aWMgKi8KK2Jvb2wgTWVkaWFNZXRyaWNzU2VydmljZTo6aXNQdWxsYWJsZShjb25zdCBzdGQ6OnN0cmluZyAma2V5KQoreworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcHVsbGFibGVLZXlzeworICAgICAgICAibWVkaWFkcm0iLAorICAgIH07CisgICAgcmV0dXJuIHB1bGxhYmxlS2V5cy5jb3VudChrZXkpOworfQorCisvKiBzdGF0aWMgKi8KK3N0ZDo6c3RyaW5nIE1lZGlhTWV0cmljc1NlcnZpY2U6OmF0b21UYWdUb0tleShpbnQzMl90IGF0b21UYWcpCit7CisgICAgc3dpdGNoIChhdG9tVGFnKSB7CisgICAgY2FzZSBhbmRyb2lkOjp1dGlsOjpNRURJQV9EUk1fQUNUSVZJVFlfSU5GTzoKKyAgICAgICAgcmV0dXJuICJtZWRpYWRybSI7CisgICAgfQorICAgIHJldHVybiB7fTsKK30KKworLyogc3RhdGljICovCitBU3RhdHNNYW5hZ2VyX1B1bGxBdG9tQ2FsbGJhY2tSZXR1cm4gTWVkaWFNZXRyaWNzU2VydmljZTo6cHVsbEF0b21DYWxsYmFjaygKKyAgICAgICAgaW50MzJfdCBhdG9tVGFnLCBBU3RhdHNFdmVudExpc3QqIGRhdGEsIHZvaWQqIGNvb2tpZSkKK3sKKyAgICBNZWRpYU1ldHJpY3NTZXJ2aWNlKiBzdmMgPSByZWludGVycHJldF9jYXN0PE1lZGlhTWV0cmljc1NlcnZpY2UqPihjb29raWUpOworICAgIHJldHVybiBzdmMtPnB1bGxJdGVtcyhhdG9tVGFnLCBkYXRhKTsKK30KKworQVN0YXRzTWFuYWdlcl9QdWxsQXRvbUNhbGxiYWNrUmV0dXJuIE1lZGlhTWV0cmljc1NlcnZpY2U6OnB1bGxJdGVtcygKKyAgICAgICAgaW50MzJfdCBhdG9tVGFnLCBBU3RhdHNFdmVudExpc3QqIGRhdGEpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga2V5KGF0b21UYWdUb0tleShhdG9tVGFnKSk7CisgICAgaWYgKGtleS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBBU3RhdHNNYW5hZ2VyX1BVTExfU0tJUDsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkIF9sKG1Mb2NrKTsKKyAgICBib29sIGR1bXBlZCA9IGZhbHNlOworICAgIGZvciAoYXV0byAmaXRlbSA6IG1QdWxsYWJsZUl0ZW1zW2tleV0pIHsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gc2l0ZW0gPSBpdGVtLmxvY2soKSkgeworICAgICAgICAgICAgZHVtcGVkIHw9IGR1bXAyU3RhdHNkKHNpdGVtLCBkYXRhLCBtU3RhdHNkTG9nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUHVsbGFibGVJdGVtc1trZXldLmNsZWFyKCk7CisgICAgcmV0dXJuIGR1bXBlZCA/IEFTdGF0c01hbmFnZXJfUFVMTF9TVUNDRVNTIDogQVN0YXRzTWFuYWdlcl9QVUxMX1NLSVA7Cit9CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL01lZGlhTWV0cmljc1NlcnZpY2UuaAppbmRleCA3OTJiN2YwLi44ZDBiMWNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3NTZXJ2aWNlLmgKQEAgLTI0LDIwICsyNCwyNyBAQAogCiAvLyBJTWVkaWFNZXRyaWNzU2VydmljZSBtdXN0IGluY2x1ZGUgVmVjdG9yLCBTdHJpbmcxNiwgRXJyb3JzCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldHJpY3NTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9tZWRpYS9Cbk1lZGlhTWV0cmljc1NlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxzdGF0c19wdWxsX2F0b21fY2FsbGJhY2suaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlICJBdWRpb0FuYWx5dGljcy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIE1lZGlhTWV0cmljc1NlcnZpY2UgOiBwdWJsaWMgQm5NZWRpYU1ldHJpY3NTZXJ2aWNlCitjbGFzcyBNZWRpYU1ldHJpY3NTZXJ2aWNlIDogcHVibGljIG1lZGlhOjpCbk1lZGlhTWV0cmljc1NlcnZpY2UKIHsKIHB1YmxpYzoKICAgICBNZWRpYU1ldHJpY3NTZXJ2aWNlKCk7CiAgICAgfk1lZGlhTWV0cmljc1NlcnZpY2UoKSBvdmVycmlkZTsKIAorICAgIC8vIEFJREwgaW50ZXJmYWNlCisgICAgYmluZGVyOjpTdGF0dXMgc3VibWl0QnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBidWZmZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3VibWl0QnVmZmVyKChjaGFyICopYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTdWJtaXRzIHRoZSBpbmRpY2F0ZWQgcmVjb3JkIHRvIHRoZSBtZWRpYWFuYWx5dGljcyBzZXJ2aWNlLgogICAgICAqCkBAIC00NSwxMSArNTIsMTEgQEAKICAgICAgKiBccmV0dXJuIHN0YXR1cyBmYWlsdXJlLCB3aGljaCBpcyBuZWdhdGl2ZSBvbiBiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbHVyZS4KICAgICAgKiAgICAgICAgIEFzIHRoZSB0cmFuc2FjdGlvbiBpcyBvbmUtd2F5LCByZW1vdGUgZmFpbHVyZXMgd2lsbCBub3QgYmUgcmVwb3J0ZWQuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc3VibWl0KG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkgb3ZlcnJpZGUgeworICAgIHN0YXR1c190IHN1Ym1pdChtZWRpYW1ldHJpY3M6Okl0ZW0gKml0ZW0pIHsKICAgICAgICAgcmV0dXJuIHN1Ym1pdEludGVybmFsKGl0ZW0sIGZhbHNlIC8qIHJlbGVhc2UgKi8pOwogICAgIH0KIAotICAgIHN0YXR1c190IHN1Ym1pdEJ1ZmZlcihjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICBzdGF0dXNfdCBzdWJtaXRCdWZmZXIoY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSA9IG5ldyBtZWRpYW1ldHJpY3M6Okl0ZW0oKTsKICAgICAgICAgcmV0dXJuIGl0ZW0tPnJlYWRGcm9tQnl0ZVN0cmluZyhidWZmZXIsIGxlbmd0aCkKICAgICAgICAgICAgICAgICA/OiBzdWJtaXRJbnRlcm5hbChpdGVtLCB0cnVlIC8qIHJlbGVhc2UgKi8pOwpAQCAtODEsNyArODgsNyBAQAogCiAgICAgLy8gSW50ZXJuYWwgY2FsbCB3aGVyZSByZWxlYXNlIGlzIHRydWUgaWYgb3duZXJzaGlwIG9mIGl0ZW0gaXMgdHJhbnNmZXJyZWQKICAgICAvLyB0byB0aGUgc2VydmljZSAodGhhdCBpcywgdGhlIHNlcnZpY2Ugd2lsbCBldmVudHVhbGx5IGRlbGV0ZSB0aGUgaXRlbSkuCi0gICAgc3RhdHVzX3Qgc3VibWl0SW50ZXJuYWwobWVkaWFtZXRyaWNzOjpJdGVtICppdGVtLCBib29sIHJlbGVhc2UpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN1Ym1pdEludGVybmFsKG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSwgYm9vbCByZWxlYXNlKTsKIAogcHJpdmF0ZToKICAgICB2b2lkIHByb2Nlc3NFeHBpcmF0aW9ucygpOwpAQCAtOTMsOCArMTAwLDE3IEBACiAgICAgYm9vbCBleHBpcmF0aW9ucyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkgUkVRVUlSRVMobUxvY2spOwogCiAgICAgLy8gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBvdXRwdXQKLSAgICB2b2lkIGR1bXBRdWV1ZShTdHJpbmc4ICZyZXN1bHQsIGludDY0X3Qgc2luY2VOcywgY29uc3QgY2hhciogcHJlZml4KSBSRVFVSVJFUyhtTG9jayk7Ci0gICAgdm9pZCBkdW1wSGVhZGVycyhTdHJpbmc4ICZyZXN1bHQsIGludDY0X3Qgc2luY2VOcywgY29uc3QgY2hhciogcHJlZml4KSBSRVFVSVJFUyhtTG9jayk7CisgICAgc3RkOjpzdHJpbmcgZHVtcFF1ZXVlKGludDY0X3Qgc2luY2VOcywgY29uc3QgY2hhciogcHJlZml4KSBSRVFVSVJFUyhtTG9jayk7CisgICAgc3RkOjpzdHJpbmcgZHVtcEhlYWRlcnMoaW50NjRfdCBzaW5jZU5zLCBjb25zdCBjaGFyKiBwcmVmaXgpIFJFUVVJUkVTKG1Mb2NrKTsKKworICAgIC8vIHN1cHBvcnQgc3RhdHNkIHB1c2hlZCBhdG9tcworICAgIHN0YXRpYyBib29sIGlzUHVsbGFibGUoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSk7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGF0b21UYWdUb0tleShpbnQzMl90IGF0b21UYWcpOworICAgIHN0YXRpYyBBU3RhdHNNYW5hZ2VyX1B1bGxBdG9tQ2FsbGJhY2tSZXR1cm4gcHVsbEF0b21DYWxsYmFjaygKKyAgICAgICAgICAgIGludDMyX3QgYXRvbVRhZywgQVN0YXRzRXZlbnRMaXN0KiBkYXRhLCB2b2lkKiBjb29raWUpOworICAgIEFTdGF0c01hbmFnZXJfUHVsbEF0b21DYWxsYmFja1JldHVybiBwdWxsSXRlbXMoaW50MzJfdCBhdG9tVGFnLCBBU3RhdHNFdmVudExpc3QqIGRhdGEpOworICAgIHZvaWQgcmVnaXN0ZXJTdGF0c2RDYWxsYmFja3NJZk5lZWRlZCgpOworICAgIHN0ZDo6YXRvbWljX2ZsYWcgbVN0YXRzZFJlZ2lzdGVyZWQgPSBBVE9NSUNfRkxBR19JTklUOwogCiAgICAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYWNjZXNzZWQgd2l0aG91dCBtTG9jawogCkBAIC0xMDgsNyArMTI0LDE0IEBACiAKICAgICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBtSXRlbXNTdWJtaXR0ZWR7fTsgLy8gYWNjZXNzZWQgb3V0c2lkZSBvZiBsb2NrLgogCi0gICAgbWVkaWFtZXRyaWNzOjpBdWRpb0FuYWx5dGljcyBtQXVkaW9BbmFseXRpY3M7IC8vIG1BdWRpb0FuYWx5dGljcyBpcyBsb2NrZWQgaW50ZXJuYWxseS4KKyAgICAvLyBtU3RhdHNkTG9nIGlzIGxvY2tlZCBpbnRlcm5hbGx5ICh0aHJlYWQtc2FmZSkgYW5kIHNob3dzIHRoZSBsYXN0IGF0b21zIGxvZ2dlZAorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNUQVRTRF9MT0dfTElORVNfTUFYID0gMzA7IC8vIHJlY2VudCBsb2cgbGluZXMgdG8ga2VlcAorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IFNUQVRTRF9MT0dfTElORVNfRFVNUCA9IDQ7IC8vIG5vcm1hbCBhbW91bnQgb2YgbGluZXMgdG8gZHVtcAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4gbVN0YXRzZExvZ3sKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+KFNUQVRTRF9MT0dfTElORVNfTUFYKX07CisKKyAgICAvLyBtQXVkaW9BbmFseXRpY3MgaXMgbG9ja2VkIGludGVybmFsbHkuCisgICAgbWVkaWFtZXRyaWNzOjpBdWRpb0FuYWx5dGljcyBtQXVkaW9BbmFseXRpY3N7bVN0YXRzZExvZ307CiAKICAgICBzdGQ6Om11dGV4IG1Mb2NrOwogICAgIC8vIHN0YXRpc3RpY3MgYWJvdXQgb3VyIGFuYWx5dGljcwpAQCAtMTI0LDYgKzE0NywxMiBAQAogICAgIC8vIFRPRE86IE1ha2Ugc2VwYXJhdGUgY2xhc3MsIHVzZSBzZWdtZW50ZWQgcXVldWUsIHdyaXRlIGxvY2sgb25seSBlbmQuCiAgICAgLy8gTm90ZTogQW5vdGhlciBhbmFseXRpY3MgbW9kdWxlIG1pZ2h0IGhhdmUgb3duZXJzaGlwIG9mIGFuIGl0ZW0gbG9uZ2VyIHRoYW4gdGhlIGxvZy4KICAgICBzdGQ6OmRlcXVlPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+PiBtSXRlbXMgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAvLyBRdWV1ZXMgcGVyIGl0ZW0ga2V5LCBwZW5kaW5nIHRvIGJlIHB1bGxlZCBieSBzdGF0c2QuCisgICAgLy8gVXNlIHdlYWtfcHRyIHN1Y2ggdGhhdCBhIHB1bGxhYmxlIGl0ZW0gY2FuIHN0aWxsIGV4cGlyZS4KKyAgICB1c2luZyBJdGVtS2V5ID0gc3RkOjpzdHJpbmc7CisgICAgdXNpbmcgV2Vha0l0ZW1RdWV1ZSA9IHN0ZDo6ZGVxdWU8c3RkOjp3ZWFrX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+PjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8SXRlbUtleSwgV2Vha0l0ZW1RdWV1ZT4gbVB1bGxhYmxlSXRlbXMgR1VBUkRFRF9CWShtTG9jayk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RhdHNkTG9nLmggYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvU3RhdHNkTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwN2JhYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9TdGF0c2RMb2cuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIxIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljcyB7CisKK2NsYXNzIFN0YXRzZExvZyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU3RhdHNkTG9nKHNpemVfdCBsaW5lcykgOiBtU2ltcGxlTG9nKGxpbmVzKSB7fQorCisgICAgdm9pZCBsb2coaW50IGF0b20sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmcpIHsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIGxvY2sobUxvY2spOworICAgICAgICAgICAgKyttQ291bnRNYXBbYXRvbV07CisgICAgICAgIH0KKyAgICAgICAgbVNpbXBsZUxvZy5sb2coIiVzIiwgc3RyaW5nLmNfc3RyKCkpOworICAgIH0KKworICAgc3RkOjpzdHJpbmcgZHVtcFRvU3RyaW5nKGNvbnN0IGNoYXIgKnByZWZpeCA9ICIiLCBzaXplX3QgbG9nTGluZXMgPSAwKSBjb25zdCB7CisgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICAgICB7ICAgLy8gZmlyc3QgcHJpbnQgb3V0IHRoZSBhdG9tIGNvdW50cworICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgbG9jayhtTG9jayk7CisKKyAgICAgICAgICAgc2l6ZV90IGNvbCA9IDA7CisgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY291bnQgOiBtQ291bnRNYXApIHsKKyAgICAgICAgICAgICAgIGlmIChjb2wgPT0gOCkgeworICAgICAgICAgICAgICAgICAgIGNvbCA9IDA7CisgICAgICAgICAgICAgICAgICAgc3MgPDwgIlxuIiA8PCBwcmVmaXg7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgIHNzIDw8ICIgIjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHNzIDw8ICJbICIgPDwgY291bnQuZmlyc3QgPDwgIiA6ICIgPDwgY291bnQuc2Vjb25kIDw8ICIgXSI7CisgICAgICAgICAgICAgICArK2NvbDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzcyA8PCAiXG4iOworICAgICAgIH0KKworICAgICAgIC8vIHRoZW4gcHJpbnQgb3V0IHRoZSBsb2cgbGluZXMKKyAgICAgICBzcyA8PCBtU2ltcGxlTG9nLmR1bXBUb1N0cmluZyhwcmVmaXgsIGxvZ0xpbmVzKTsKKyAgICAgICByZXR1cm4gc3Muc3RyKCk7CisgICB9CisKK3ByaXZhdGU6CisgICAgU2ltcGxlTG9nIG1TaW1wbGVMb2c7IC8vIGludGVybmFsbHkgbG9ja2VkCisgICAgc3RkOjptYXA8aW50IC8qIGF0b20gKi8sIHNpemVfdCAvKiBjb3VudCAqLz4gbUNvdW50TWFwIEdVQVJERURfQlkobUxvY2spOyAvLyBzb3J0ZWQKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOjptZWRpYW1ldHJpY3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9TdHJpbmdVdGlscy5oIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmgKaW5kZXggN2E4YmJlZS4uMDEwMzRkOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmgKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL1N0cmluZ1V0aWxzLmgKQEAgLTE2LDYgKzE2LDggQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtNjgsNCArNzAsMTAxIEBACiAgKi8KIHNpemVfdCByZXBsYWNlKHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKnRhcmdldENoYXJzLCBjb25zdCBjaGFyIHJlcGxhY2VDaGFyKTsKIAorLy8gUkZDIDE0MjEsIDIwNDUsIDIxNTIsIDQ2NDgoNCksIDQ4ODAKK2lubGluZSBjb25zdGV4cHIgY2hhciBCYXNlNjRUYWJsZVtdID0KKyAgICAvLyAwMDAwMDAwMDAwMTExMTExMTExMTIyMjIyMjIyMjIzMzMzMzMzMzMzNDQ0NDQ0NDQ0NDU1NTU1NTU1NTU2NjY2CisgICAgLy8gMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworLy8gUkZDIDQ2NDgoNSkgVVJMLXNhZmUgQmFzZTY0IGVuY29kaW5nCitpbmxpbmUgY29uc3RleHByIGNoYXIgQmFzZTY0VXJsVGFibGVbXSA9CisgICAgLy8gMDAwMDAwMDAwMDExMTExMTExMTEyMjIyMjIyMjIyMzMzMzMzMzMzMzQ0NDQ0NDQ0NDQ1NTU1NTU1NTU1NjY2NgorICAgIC8vIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKKyAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXyI7CisKKy8vIEFuIGNvbnN0ZXhwciBzdHJ1Y3QgdGhhdCB0cmFuc3Bvc2VzL2ludmVydHMgYSBzdHJpbmcgY29udmVyc2lvbiB0YWJsZS4KK3N0cnVjdCBUcmFuc3Bvc2UgeworICAgIC8vIGNvbnN0ZXhwciBidWcsIHJldHVybmluZyBjaGFyIHN0aWxsIG1lYW5zIC0xID09IDB4ZmYsIHNvIHdlIHVzZSB1bnNpZ25lZCBjaGFyLgorICAgIHVzaW5nIGJhc2VfY2hhcl90ID0gdW5zaWduZWQgY2hhcjsKKyAgICBzdGF0aWMgaW5saW5lIGNvbnN0ZXhwciBiYXNlX2NoYXJfdCBJTlZBTElEX0NIQVIgPSAweGZmOworCisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIGV4cGxpY2l0IGNvbnN0ZXhwciBUcmFuc3Bvc2UoY29uc3QgY2hhcigmc3RyaW5nKVtOXSkgeworICAgICAgICBmb3IgKGF1dG8mIGUgOiBtTWFwKSB7CisgICAgICAgICAgICBlID0gSU5WQUxJRF9DSEFSOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBzdHJpbmdbaV0gIT0gMDsgKytpKSB7CisgICAgICAgICAgICBtTWFwW3N0YXRpY19jYXN0PHNpemVfdD4oc3RyaW5nW2ldKSAmIDB4ZmZdID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0ZXhwciBiYXNlX2NoYXJfdCBvcGVyYXRvcltdIChzaXplX3QgbikgY29uc3QgeworICAgICAgICByZXR1cm4gbiA8IHNpemVvZihtTWFwKSA/IG1NYXBbbl0gOiBJTlZBTElEX0NIQVI7CisgICAgfQorCisgICAgY29uc3RleHByIGNvbnN0IGF1dG8mIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1NYXA7CisgICAgfQorCitwcml2YXRlOgorICAgIGJhc2VfY2hhcl90IG1NYXBbMjU2XTsgIC8vIGNvbnN0cnVjdCBhbiBpbnZlcnNlIGNoYXJhY3RlciBtYXBwaW5nLgorfTsKKworLy8gVGhpcyB0YWJsZSBpcyB1c2VkIHRvIGNvbnZlcnQgYW4gaW5wdXQgY2hhciB0byBhIDYgYml0ICgwIC0gNjMpIHZhbHVlLgorLy8gSWYgdGhlIGlucHV0IGNoYXIgaXMgbm90IGluIHRoZSBCYXNlNjRVcmwgY2hhcnNldCwgVHJhbnNwb3NlOjpJTlZBTElEX0NIQVIgaXMgcmV0dXJuZWQuCitpbmxpbmUgY29uc3RleHByIFRyYW5zcG9zZSBJbnZlcnNlQmFzZTY0VXJsVGFibGUoQmFzZTY0VXJsVGFibGUpOworCisvLyBSZXR1cm5zIHRydWUgaWYgcyBjb25zaXN0cyBvZiBvbmx5IHZhbGlkIEJhc2U2NFVybCBjaGFyYWN0ZXJzIChubyBwYWRkaW5nIGNoYXJzIGFsbG93ZWQpLgoraW5saW5lIGNvbnN0ZXhwciBib29sIGlzQmFzZTY0VXJsKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBmb3IgKDsgKnMgIT0gMDsgKytzKSB7CisgICAgICAgIGlmIChJbnZlcnNlQmFzZTY0VXJsVGFibGVbKHVuc2lnbmVkIGNoYXIpKnNdID09IFRyYW5zcG9zZTo6SU5WQUxJRF9DSEFSKSByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgcyBpcyBhIHZhbGlkIGxvZyBzZXNzaW9uIGlkOiBleGFjdGx5IDE2IEJhc2U2NFVybCBjaGFyYWN0ZXJzLgorLy8KKy8vIGxvZ1Nlc3Npb25JZHMgYXJlIGEgd2ViLXNhZmUgQmFzZTY0VXJsIFJGQyA0NjQ4KDUpIGVuY29kZWQgc3RyaW5nIG9mIDE2IGNoYXJhY3RlcnMKKy8vIChyZXByZXNlbnRpbmcgOTYgdW5pcXVlIGJpdHMgMTYgKiA2KS4KKy8vCisvLyBUaGUgc3RyaW5nIHZlcnNpb24gaXMgY29uc2lkZXJlZCB0aGUgcmVmZXJlbmNlIHJlcHJlc2VudGF0aW9uLiAgSG93ZXZlciwgZm9yIGVhc2Ugb2YKKy8vIG1hbmlwdWxhdGlvbiBhbmQgY29tcGFyaXNvbiwgaXQgbWF5IGJlIGNvbnZlcnRlZCB0byBhbiBpbnQxMjguCisvLworLy8gRm9yIGludDEyOCBjb252ZXJzaW9uLCBzb21lIGNvbW1vbiBpbnRlcnByZXRhdGlvbnMgZXhpc3QgLSBmb3IgZXhhbXBsZQorLy8gKDEpIHRoZSAxNiBCYXNlNjQgY2hhcnMgY2FuIGJlIGNvbnZlcnRlZCA2IGJpdHMgcGVyIGNoYXIgdG8gYSA5NiBiaXQgdmFsdWUKKy8vICh3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgYXMgemVybykgYXMgdGhlcmUgYXJlIG9ubHkgMTIgdW5pcXVlIGJ5dGVzIHdvcnRoIG9mIGRhdGEKKy8vIG9yICgyKSB0aGUgMTYgQmFzZTY0IGNoYXJzIGNhbiBiZSB1c2VkIHRvIGRpcmVjdGx5IGZpbGwgdGhlIDEyOCBiaXRzIG9mIGludDEyOCBhc3N1bWluZworLy8gdGhlIDE2IGNoYXJzIGFyZSAxNiBieXRlcywgZmlsbGluZyB0aGUgbGF5b3V0IG9mIHRoZSBpbnQxMjggdmFyaWFibGUuCisvLyBFbmRpYW5uZXNzIG9mIHRoZSBkYXRhIG1heSBmb2xsb3cgd2hhdGV2ZXIgaXMgY29udmVuaWVudCBpbiB0aGUgaW50ZXJwcmV0YXRpb24gYXMgbG9uZworLy8gYXMgaXQgaXMgYXBwbGllZCB0byBlYWNoIHN1Y2ggY29udmVyc2lvbiBvZiBzdHJpbmcgdG8gaW50MTI4IGlkZW50aWNhbGx5LgorLy8KK2lubGluZSBjb25zdGV4cHIgYm9vbCBpc0xvZ1Nlc3Npb25JZChjb25zdCBjaGFyICpzKSB7CisgICAgcmV0dXJuIHN0ZDo6Y2hhcl90cmFpdHM8c3RkOjpkZWNheV90PGRlY2x0eXBlKCpzKT4+OjpsZW5ndGgocykgPT0gMTYgJiYgaXNCYXNlNjRVcmwocyk7Cit9CisKKy8vIFJldHVybnMgZWl0aGVyIHRoZSBvcmlnaW5hbCBzdHJpbmcgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGlzTG9nU2Vzc2lvbklkIGNoZWNrIGZhaWxzLgoraW5saW5lIHN0ZDo6c3RyaW5nIHNhbml0aXplTG9nU2Vzc2lvbklkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmcpIHsKKyAgICBpZiAoaXNMb2dTZXNzaW9uSWQoc3RyaW5nLmNfc3RyKCkpKSByZXR1cm4gc3RyaW5nOworICAgIHJldHVybiB7fTsgLy8gaWYgbm90IGEgbG9nU2Vzc2lvbklkLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgorfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgYnl0ZXNUb1N0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYnl0ZXMsIHNpemVfdCBtYXhTaXplID0gU0laRV9NQVgpIHsKKyAgICBpZiAoYnl0ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuICJ7fSI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8ICJ7IjsKKyAgICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKTsKKyAgICBtYXhTaXplID0gc3RkOjptaW4obWF4U2l6ZSwgYnl0ZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1heFNpemU7ICsraSkgeworICAgICAgICBzcyA8PCAiICIgPDwgc3RkOjpzZXR3KDIpIDw8IChpbnQpYnl0ZXNbaV07CisgICAgfQorICAgIGlmIChtYXhTaXplICE9IGJ5dGVzLnNpemUoKSkgeworICAgICAgICBzcyA8PCAiIC4uLiB9IjsKKyAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCAiIH0iOworICAgIH0KKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvYmVuY2htYXJrcy9BbmRyb2lkLmJwCmluZGV4IGI2MWY0NGYuLjY4ZDQxNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9iZW5jaG1hcmtzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2JlbmNobWFya3MvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJtZWRpYW1ldHJpY3NfYmVuY2htYXJrcyIsCiAgICAgc3JjczogWyJtZWRpYW1ldHJpY3NfYmVuY2htYXJrcy5jcHAiXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNlNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtZWRpYW1ldHJpY3Nfc2VydmljZV9mdXp6ZXIiLAorCisgICAgc3JjczogWworICAgICAgICAibWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzc2VydmljZSIsCisgICAgICAgICJsaWJwbGF0Zm9ybXByb3RvcyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhdHNsb2ciLAorICAgICAgICAibGlic3RhdHNwdWxsIiwKKyAgICAgICAgImxpYnN0YXRzc29ja2V0IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgIm1lZGlhbWV0cmljc3NlcnZpY2UtYWlkbC1jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFtZXRyaWNzIiwKKyAgICAgICAgInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM4MzBlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NCBAQAorIyBGdXp6ZXIgZm9yIGxpYm1lZGlhbWV0cmljc3NlcnZpY2UKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIGxpYm1lZGlhbWV0cmljc3NlcnZpY2UgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlCit1bmRlcnN0YW5kaW5nIG9mIHRoZSBzZXJ2aWNlIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK01lZGlhIE1ldHJpY3MgU2VydmljZSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisxLiBNZWRpYSBNZXRyaWNzIEl0ZW0gTWFuaXB1bGF0aW9uIChtb2R1bGUgbmFtZTogYEl0ZW1gKQorMi4gTWVkaWEgTWV0cmljcyBUaW1lIE1hY2hpbmUgU3RvcmFnZSAobW9kdWxlIG5hbWU6IGBUaW1lTWFjaGluZVN0b3JhZ2VgKQorMy4gTWVkaWEgTWV0cmljcyBUcmFuc2FjdGlvbiBMb2cgKG1vZHVsZSBuYW1lOiBgVHJhbnNhY3Rpb25Mb2dgKQorNC4gTWVkaWEgTWV0cmljcyBBbmFseXRpY3MgQWN0aW9uIChtb2R1bGUgbmFtZTogYEFuYWx5dGljc0FjdGlvbmApCis1LiBNZWRpYSBNZXRyaWNzIEF1ZGlvIEFuYWx5dGljcyAobW9kdWxlIG5hbWU6IGBBdWRpb0FuYWx5dGljc2ApCis2LiBNZWRpYSBNZXRyaWNzIFRpbWVkIEFjdGlvbiAobW9kdWxlIG5hbWU6IGBUaW1lZEFjdGlvbmApCisKK3wgTW9kdWxlfCBWYWxpZCBJbnB1dCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgSXRlbWAgfCBLZXk6IGBzdGQ6OnN0cmluZ2AuIFZhbHVlczogYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAsIGBJTlQ2NF9NSU5gIHRvIGBJTlQ2NF9NQVhgLCBgc3RkOjpzdHJpbmdgLCBgZG91YmxlYCwgYHBhaXI8SU5UMzJfTUlOIHRvIElOVDMyX01BWCwgSU5UMzJfTUlOIHRvIElOVDMyX01BWD5gIHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgVGltZU1hY2hpbmVTdG9yYWdlYCAgIHwgS2V5OiBgc3RkOjpzdHJpbmdgLiBWYWx1ZXM6IGBJTlQzMl9NSU5gIHRvIGBJTlQzMl9NQVhgLCBgSU5UNjRfTUlOYCB0byBgSU5UNjRfTUFYYCwgYHN0ZDo6c3RyaW5nYCwgYGRvdWJsZWAsIGBwYWlyPElOVDMyX01JTiB0byBJTlQzMl9NQVgsIElOVDMyX01JTiB0byBJTlQzMl9NQVg+YCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYFRyYW5zY2F0aW9uTG9nYCAgIHwgYG1lZGlhbWV0cmljczo6SXRlbWAgfCBgbWVkaWFtZXRyaWNzOjpJdGVtYCBjcmVhdGVkIGJ5IG9idGFpbmluZyB2YWx1ZXMgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXJ8Cit8IGBBbmFseXRpY3NBY3Rpb25gICAgfCBVUkw6IGBzdGQ6OnN0cmluZ2AgZW5kaW5nIHdpdGggLmV2ZW50LCBWYWx1ZTogYHN0ZDo6c3RyaW5nYCwgYWN0aW9uOiBBIGZ1bmN0aW9uIHwgVVJMIGFuZCBWYWx1ZXMgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIsIGEgcGxhY2Vob2xkZXIgZnVuY3Rpb24gd2FzIHBhc3NlZCBhcyBhY3Rpb258Cit8IGBBdWRpb0FuYWx5dGljc2AgICB8IGBtZWRpYW1ldHJpY3M6Okl0ZW1gIHwgYG1lZGlhbWV0cmljczo6SXRlbWAgY3JlYXRlZCBieSBvYnRhaW5pbmcgdmFsdWVzIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyfAorfCBgVGltZWRBY3Rpb25gICAgfCB0aW1lOiBgc3RkOjpjaHJvbm86OnNlY29uZHNgLCBmdW5jdGlvbjogYHN0ZDo6ZnVuY3Rpb25gIHwgYHN0ZDo6Y2hyb25vOjpzZWNvbmRzYCA6IHZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyLCBgc3RkOjpmdW5jdGlvbmA6IGEgcGxhY2Vob2xkZXIgZnVuY3Rpb24gd2FzIHVzZWQuIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvZnV6emVyL21lZGlhbWV0cmljc19zZXJ2aWNlX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwYjQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9mdXp6ZXIvbWVkaWFtZXRyaWNzX3NlcnZpY2VfZnV6emVyLmNwcApAQCAtMCwwICsxLDM3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSA8ZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljc0l0ZW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgIkF1ZGlvVHlwZXMuaCIKKyNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIGxvdyB3YXRlciBtYXJrCitjb25zdGV4cHIgc2l6ZV90IGtMb2dJdGVtc0xvd1dhdGVyID0gMTsKKy8vIGhpZ2ggd2F0ZXIgbWFyaworY29uc3RleHByIHNpemVfdCBrTG9nSXRlbXNIaWdoV2F0ZXIgPSAyOworCitjbGFzcyBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICB2b2lkIGludm9rZVN0YXJ0c1dpdGgoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlSW5zdGFudGlhdGUoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlUGFja2FnZUluc3RhbGxlckNoZWNrKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUl0ZW1NYW5pcHVsYXRpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlSXRlbUV4cGFuc2lvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCBpbnZva2VUaW1lTWFjaGluZVN0b3JhZ2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlVHJhbnNhY3Rpb25Mb2coY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgaW52b2tlQW5hbHl0aWNzQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZUF1ZGlvQW5hbHl0aWNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGludm9rZVRpbWVkQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworfTsKKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VTdGFydHNXaXRoKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6c3RhcnRzV2l0aChmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUluc3RhbnRpYXRlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzcCBtZWRpYU1ldHJpY3NTZXJ2aWNlID0gbmV3IE1lZGlhTWV0cmljc1NlcnZpY2UoKTsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPG1lZGlhbWV0cmljczo6SXRlbT4gcmFuZG9tX2tleSgKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbTo6Y3JlYXRlKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkpKTsKKyAgICAgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KHJhbmRvbV9rZXkuZ2V0KCkpOworICAgICAgICByYW5kb21fa2V5LT5zZXRJbnQzMihmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdChyYW5kb21fa2V5LmdldCgpKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8bWVkaWFtZXRyaWNzOjpJdGVtPiBhdWRpb3RyYWNrX2tleSgKKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6SXRlbTo6Y3JlYXRlKCJhdWRpb3RyYWNrIikpOworICAgICAgICBtZWRpYU1ldHJpY3NTZXJ2aWNlLT5zdWJtaXQoYXVkaW90cmFja19rZXkuZ2V0KCkpOworICAgICAgICBhdWRpb3RyYWNrX2tleS0+YWRkSW50MzIoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KGF1ZGlvdHJhY2tfa2V5LmdldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlUGFja2FnZUluc3RhbGxlckNoZWNrKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIE1lZGlhTWV0cmljc1NlcnZpY2U6OnVzZVVpZEZvclBhY2thZ2UoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZUl0ZW1NYW5pcHVsYXRpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworCisgICAgbWVkaWFtZXRyaWNzOjpJdGVtIGl0ZW0oZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgYWN0aW9uID0gZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgMTYpOworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBrZXkgPSBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpOworICAgICAgICBpZiAoZmRwLnJlbWFpbmluZ19ieXRlcygpIDwgMSB8fCBrZXkubGVuZ3RoKCkgPCAxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRJbnQzMihrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgIGl0ZW0uYWRkSW50MzIoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDI6IHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGkzMiA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRJbnQzMihrZXkuY19zdHIoKSwgJmkzMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDM6IHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEludDY0KGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA0OiB7CisgICAgICAgICAgICAgICAgaXRlbS5hZGRJbnQ2NChrZXkuY19zdHIoKSwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNTogeworICAgICAgICAgICAgICAgIGludDY0X3QgaTY0ID0gMDsKKyAgICAgICAgICAgICAgICBpdGVtLmdldEludDY0KGtleS5jX3N0cigpLCAmaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNjogeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0RG91YmxlKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZG91YmxlPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgNzogeworICAgICAgICAgICAgICAgIGl0ZW0uYWRkRG91YmxlKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZUZsb2F0aW5nUG9pbnQ8ZG91YmxlPigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gMDsKKyAgICAgICAgICAgICAgICBpdGVtLmdldERvdWJsZShrZXkuY19zdHIoKSwgJmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA5OiB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXRDU3RyaW5nKGtleS5jX3N0cigpLCBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxMDogeworICAgICAgICAgICAgICAgIGNoYXIgKnMgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGl0ZW0uZ2V0Q1N0cmluZyhrZXkuY19zdHIoKSwgJnMpOworICAgICAgICAgICAgICAgIGlmIChzKSBmcmVlKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxMTogeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHM7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRTdHJpbmcoa2V5LmNfc3RyKCksICZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTI6IHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldFJhdGUoa2V5LmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTM6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGIgPSAwLCBoID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IDA7CisgICAgICAgICAgICAgICAgaXRlbS5nZXRSYXRlKGtleS5jX3N0cigpLCAmYiwgJmgsICZkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMTQ6IHsKKyAgICAgICAgICAgICAgICAodm9pZClpdGVtLmZpbHRlcihrZXkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE1OiB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJyWzFdID0geyIifTsKKyAgICAgICAgICAgICAgICBhcnJbMF0gPSBjb25zdF9jYXN0PGNoYXIgKj4oa2V5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgICh2b2lkKWl0ZW0uZmlsdGVyTm90KDEsIGFycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDE2OiB7CisgICAgICAgICAgICAgICAgKHZvaWQpaXRlbS50b1N0cmluZygpLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQYXJjZWwgcDsKKyAgICBtZWRpYW1ldHJpY3M6Okl0ZW0gaXRlbTI7CisKKyAgICAodm9pZClpdGVtLndyaXRlVG9QYXJjZWwoJnApOworICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOyAgLy8gcmV3aW5kIGZvciByZWFkaW5nCisgICAgKHZvaWQpaXRlbTIucmVhZEZyb21QYXJjZWwocCk7CisKKyAgICBjaGFyICpieXRlRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IGxlbmd0aCA9IDA7CisgICAgKHZvaWQpaXRlbS53cml0ZVRvQnl0ZVN0cmluZygmYnl0ZURhdGEsICZsZW5ndGgpOworICAgICh2b2lkKWl0ZW0yLnJlYWRGcm9tQnl0ZVN0cmluZyhieXRlRGF0YSwgbGVuZ3RoKTsKKyAgICBpZiAoYnl0ZURhdGEpIHsKKyAgICAgICAgZnJlZShieXRlRGF0YSk7CisgICAgfQorCisgICAgc3AgbWVkaWFNZXRyaWNzU2VydmljZSA9IG5ldyBNZWRpYU1ldHJpY3NTZXJ2aWNlKCk7CisgICAgbWVkaWFNZXRyaWNzU2VydmljZS0+c3VibWl0KCZpdGVtMik7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlSXRlbUV4cGFuc2lvbihjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW08MT4gaXRlbSgiRnV6ekl0ZW0iKTsKKyAgICBpdGVtLnNldFBpZChmZHAuQ29uc3VtZUludGVncmFsPGludDE2X3Q+KCkpLnNldFVpZChmZHAuQ29uc3VtZUludGVncmFsPGludDE2X3Q+KCkpOworCisgICAgd2hpbGUgKGZkcC5yZW1haW5pbmdfYnl0ZXMoKSkgeworICAgICAgICBpbnQzMl90IGkgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7CisgICAgICAgIGl0ZW0uc2V0KHN0ZDo6dG9fc3RyaW5nKGkpLmNfc3RyKCksIChpbnQzMl90KWkpOworICAgIH0KKyAgICBpdGVtLnVwZGF0ZUhlYWRlcigpOworCisgICAgbWVkaWFtZXRyaWNzOjpJdGVtIGl0ZW0yOworICAgICh2b2lkKWl0ZW0yLnJlYWRGcm9tQnl0ZVN0cmluZyhpdGVtLmdldEJ1ZmZlcigpLCBpdGVtLmdldExlbmd0aCgpKTsKKworICAgIHNwIG1lZGlhTWV0cmljc1NlcnZpY2UgPSBuZXcgTWVkaWFNZXRyaWNzU2VydmljZSgpOworICAgIG1lZGlhTWV0cmljc1NlcnZpY2UtPnN1Ym1pdCgmaXRlbTIpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRpbWVNYWNoaW5lU3RvcmFnZShjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICBhdXRvIGl0ZW0gPSBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6SXRlbT4oIkZ1enpLZXkiKTsKKyAgICBpbnQzMl90IGkzMiA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBpbnQ2NF90IGk2NCA9IGZkcC5Db25zdW1lSW50ZWdyYWw8aW50NjRfdD4oKTsKKyAgICBkb3VibGUgZCA9IGZkcC5Db25zdW1lRmxvYXRpbmdQb2ludDxkb3VibGU+KCk7CisgICAgc3RkOjpzdHJpbmcgc3RyID0gZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKTsKKyAgICBzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gcGFpcihmZHAuQ29uc3VtZUludGVncmFsPGludDY0X3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQ2NF90PigpKTsKKyAgICAoKml0ZW0pLnNldCgiaTMyIiwgaTMyKS5zZXQoImk2NCIsIGk2NCkuc2V0KCJkb3VibGUiLCBkKS5zZXQoInN0cmluZyIsIHN0cikuc2V0KCJyYXRlIiwgcGFpcik7CisKKyAgICBhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlRpbWVNYWNoaW5lIHRpbWVNYWNoaW5lOworICAgIHRpbWVNYWNoaW5lLnB1dChpdGVtLCB0cnVlKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImkzMiIsICZpMzIsIC0xKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImk2NCIsICZpNjQsIC0xKTsKKworICAgIHRpbWVNYWNoaW5lLmdldCgiS2V5IiwgImRvdWJsZSIsICZkLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleSIsICJzdHJpbmciLCAmc3RyLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5pMzIiLCAmaTMyLCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5pNjQiLCAmaTY0LCAtMSk7CisKKyAgICB0aW1lTWFjaGluZS5nZXQoIktleS5kb3VibGUiLCAmZCwgLTEpOworCisgICAgc3RyLmNsZWFyKCk7CisgICAgdGltZU1hY2hpbmUuZ2V0KCJLZXkuc3RyaW5nIiwgJnN0ciwgLTEpOworfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6Omludm9rZVRyYW5zYWN0aW9uTG9nKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIGF1dG8gaXRlbSA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPigiS2V5MSIpOworICAgICgqaXRlbSkKKyAgICAgICAgLnNldCgib25lIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJ0d28iLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgIC5zZXRUaW1lc3RhbXAoZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKTsKKworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6VHJhbnNhY3Rpb25Mb2cgdHJhbnNhY3Rpb25Mb2coCisgICAgICAgIGtMb2dJdGVtc0xvd1dhdGVyLCBrTG9nSXRlbXNIaWdoV2F0ZXIpOyAgLy8ga2VlcCBhdCBtb3N0IDIgaXRlbXMKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7CisKKyAgICB0cmFuc2FjdGlvbkxvZy5wdXQoaXRlbSk7CisgICAgdHJhbnNhY3Rpb25Mb2cuc2l6ZSgpOworCisgICAgYXV0byBpdGVtMiA9IHN0ZDo6bWFrZV9zaGFyZWQ8bWVkaWFtZXRyaWNzOjpJdGVtPigiS2V5MiIpOworICAgICgqaXRlbTIpCisgICAgICAgIC5zZXQoInRocmVlIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJbS2V5MV10aHJlZSIsIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgdHJhbnNhY3Rpb25Mb2cucHV0KGl0ZW0yKTsKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7CisKKyAgICBhdXRvIGl0ZW0zID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KCJLZXkzIik7CisgICAgKCppdGVtMykKKyAgICAgICAgLnNldCgic2l4IiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKQorICAgICAgICAuc2V0KCJbS2V5MV1mb3VyIiwgZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpKSAgLy8gYWZmZWN0cyBLZXkxCisgICAgICAgIC5zZXQoIltLZXkxXWZpdmUiLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpICAvLyBhZmZlY3RzIGtleTEKKyAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworCisgICAgdHJhbnNhY3Rpb25Mb2cucHV0KGl0ZW0zKTsKKyAgICB0cmFuc2FjdGlvbkxvZy5zaXplKCk7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlQW5hbHl0aWNzQWN0aW9uKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIG1lZGlhbWV0cmljczo6QW5hbHl0aWNzQWN0aW9ucyBhbmFseXRpY3NBY3Rpb25zOworICAgIGJvb2wgYWN0aW9uID0gZmFsc2U7CisKKyAgICB3aGlsZSAoZmRwLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIGFuYWx5dGljc0FjdGlvbnMuYWRkQWN0aW9uKAorICAgICAgICAgICAgKGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkgKyBzdGQ6OnN0cmluZygiLmV2ZW50IikpLmNfc3RyKCksCisgICAgICAgICAgICBmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6OkFuYWx5dGljc0FjdGlvbnM6OkZ1bmN0aW9uPigKKyAgICAgICAgICAgICAgICBbJl0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6SXRlbT4gJikgeworICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwMiA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKworICAgIHdoaWxlIChmZHAyLnJlbWFpbmluZ19ieXRlcygpKSB7CisgICAgICAgIC8vIG1ha2UgYSB0ZXN0IGl0ZW0KKyAgICAgICAgYXV0byBpdGVtID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KGZkcDIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAoKml0ZW0pLnNldCgiZXZlbnQiLCBmZHAyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICAvLyBnZXQgdGhlIGFjdGlvbnMgYW5kIGV4ZWN1dGUgdGhlbQorICAgICAgICBhdXRvIGFjdGlvbnMgPSBhbmFseXRpY3NBY3Rpb25zLmdldEFjdGlvbnNGb3JJdGVtKGl0ZW0pOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmFjdGlvbiA6IGFjdGlvbnMpIHsKKyAgICAgICAgICAgIGFjdGlvbi0+b3BlcmF0b3IoKShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOjppbnZva2VBdWRpb0FuYWx5dGljcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBmZHAgPSBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6U3RhdHNkTG9nPiBzdGF0c2RMb2cgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxhbmRyb2lkOjptZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4oMTApOworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3N7c3RhdHNkTG9nfTsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgYXV0byBpdGVtID0gc3RkOjptYWtlX3NoYXJlZDxtZWRpYW1ldHJpY3M6Okl0ZW0+KGZkcC5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGludDMyX3QgdHJhbnNhY3Rpb25VaWQgPSBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCk7ICAvLyBhcmJpdHJhcnkKKyAgICAgICAgKCppdGVtKQorICAgICAgICAgICAgLnNldChmZHAuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZygpLmNfc3RyKCksIGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSkKKyAgICAgICAgICAgIC5zZXQoZmRwLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoKS5jX3N0cigpLCBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpCisgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9BTExPV1VJRCwgdHJhbnNhY3Rpb25VaWQpCisgICAgICAgICAgICAuc2V0VWlkKHRyYW5zYWN0aW9uVWlkKQorICAgICAgICAgICAgLnNldFRpbWVzdGFtcChmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgICAgICBhdWRpb0FuYWx5dGljcy5zdWJtaXQoaXRlbSwgZmRwLkNvbnN1bWVCb29sKCkpOworICAgIH0KKworICAgIGF1ZGlvQW5hbHl0aWNzLmR1bXAoMTAwMCk7Cit9CisKK3ZvaWQgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplcjo6aW52b2tlVGltZWRBY3Rpb24oY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZmRwID0gRnV6emVkRGF0YVByb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6VGltZWRBY3Rpb24gdGltZWRBY3Rpb247CisgICAgc3RkOjphdG9taWNfaW50IHZhbHVlID0gMDsKKworICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgdGltZWRBY3Rpb24ucG9zdEluKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnZhbHVlXSB7ICsrdmFsdWU7IH0pOworICAgICAgICB0aW1lZEFjdGlvbi5zaXplKCk7CisgICAgfQorfQorCit2b2lkIE1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXI6OnByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpbnZva2VTdGFydHNXaXRoKGRhdGEsIHNpemUpOworICAgIGludm9rZUluc3RhbnRpYXRlKGRhdGEsIHNpemUpOworICAgIGludm9rZVBhY2thZ2VJbnN0YWxsZXJDaGVjayhkYXRhLCBzaXplKTsKKyAgICBpbnZva2VJdGVtTWFuaXB1bGF0aW9uKGRhdGEsIHNpemUpOworICAgIGludm9rZUl0ZW1FeHBhbnNpb24oZGF0YSwgc2l6ZSk7CisgICAgaW52b2tlVGltZU1hY2hpbmVTdG9yYWdlKGRhdGEsIHNpemUpOworICAgIGludm9rZVRyYW5zYWN0aW9uTG9nKGRhdGEsIHNpemUpOworICAgIGludm9rZUFuYWx5dGljc0FjdGlvbihkYXRhLCBzaXplKTsKKyAgICBpbnZva2VBdWRpb0FuYWx5dGljcyhkYXRhLCBzaXplKTsKKyAgICBpbnZva2VUaW1lZEFjdGlvbihkYXRhLCBzaXplKTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgTWVkaWFNZXRyaWNzU2VydmljZUZ1enplciBtZWRpYU1ldHJpY3NTZXJ2aWNlRnV6emVyOworICAgIG1lZGlhTWV0cmljc1NlcnZpY2VGdXp6ZXIucHJvY2VzcyhkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pZmFjZV9zdGF0c2QuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5jcHAKaW5kZXggMTYyMDRkZS4uNzc2Zjg3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5jcHAKQEAgLTI3LDcgKzI3LDEwIEBACiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHB3ZC5oPgogCkBAIC00NSwzMyArNDgsMTIgQEAKIC8vIGhhcyBpdHMgb3duIHJvdXRpbmUgdG8gaGFuZGxlIHRoaXMuCiAvLwogCi1ib29sIGVuYWJsZWRfc3RhdHNkID0gdHJ1ZTsKK3N0YXRpYyBib29sIGVuYWJsZWRfc3RhdHNkID0gdHJ1ZTsKIAotc3RydWN0IHN0YXRzZF9ob29rcyB7Ci0gICAgY29uc3QgY2hhciAqa2V5OwotICAgIGJvb2wgKCpoYW5kbGVyKShjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7Ci19OwotCi0vLyBrZWVwIHRoaXMgc29ydGVkLCBzbyB3ZSBjYW4gZG8gYmluYXJ5IHNlYXJjaGVzCi1zdGF0aWMgY29uc3RleHByIHN0cnVjdCBzdGF0c2RfaG9va3Mgc3RhdHNkX2hhbmRsZXJzW10gPQotewotICAgIHsgImF1ZGlvcG9saWN5Iiwgc3RhdHNkX2F1ZGlvcG9saWN5IH0sCi0gICAgeyAiYXVkaW9yZWNvcmQiLCBzdGF0c2RfYXVkaW9yZWNvcmQgfSwKLSAgICB7ICJhdWRpb3RocmVhZCIsIHN0YXRzZF9hdWRpb3RocmVhZCB9LAotICAgIHsgImF1ZGlvdHJhY2siLCBzdGF0c2RfYXVkaW90cmFjayB9LAotICAgIHsgImNvZGVjIiwgc3RhdHNkX2NvZGVjfSwKLSAgICB7ICJkcm0udmVuZG9yLkdvb2dsZS5XaWRldmluZUNETSIsIHN0YXRzZF93aWRldmluZUNETSB9LAotICAgIHsgImRybW1hbmFnZXIiLCBzdGF0c2RfZHJtbWFuYWdlciB9LAotICAgIHsgImV4dHJhY3RvciIsIHN0YXRzZF9leHRyYWN0b3IgfSwKLSAgICB7ICJtZWRpYWRybSIsIHN0YXRzZF9tZWRpYWRybSB9LAotICAgIHsgIm1lZGlhcGFyc2VyIiwgc3RhdHNkX21lZGlhcGFyc2VyIH0sCi0gICAgeyAibnVwbGF5ZXIiLCBzdGF0c2RfbnVwbGF5ZXIgfSwKLSAgICB7ICJudXBsYXllcjIiLCBzdGF0c2RfbnVwbGF5ZXIgfSwKLSAgICB7ICJyZWNvcmRlciIsIHN0YXRzZF9yZWNvcmRlciB9LAotfTsKLQotLy8gZ2l2ZSBtZSBhIHJlY29yZCwgaSdsbCBsb29rIGF0IHRoZSB0eXBlIGFuZCB1cGxvYWQgYXBwcm9wcmlhdGVseQotYm9vbCBkdW1wMlN0YXRzZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSkgeworbmFtZXNwYWNlIHsKK3RlbXBsYXRlPHR5cGVuYW1lIEhhbmRsZXIsIHR5cGVuYW1lLi4uIEFyZ3M+Citib29sIGR1bXAyU3RhdHNkSW50ZXJuYWwoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEhhbmRsZXI+JiBoYW5kbGVycywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIEFyZ3MuLi4gYXJncykgewogICAgIGlmIChpdGVtID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIGdldCB0aGUga2V5CkBAIC04MiwxMiArNjQsNDIgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGZvciAoY29uc3QgYXV0byAmc3RhdHNkX2hhbmRsZXIgOiBzdGF0c2RfaGFuZGxlcnMpIHsKLSAgICAgICAgaWYgKGtleSA9PSBzdGF0c2RfaGFuZGxlci5rZXkpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0c2RfaGFuZGxlci5oYW5kbGVyKGl0ZW0uZ2V0KCkpOwotICAgICAgICB9CisgICAgaWYgKGhhbmRsZXJzLmNvdW50KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIChoYW5kbGVycy5hdChrZXkpKShpdGVtLCBhcmdzLi4uKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQorfSAvLyBuYW1lc3BhY2UKKworLy8gZ2l2ZSBtZSBhIHJlY29yZCwgSSdsbCBsb29rIGF0IHRoZSB0eXBlIGFuZCB1cGxvYWQgYXBwcm9wcmlhdGVseQorYm9vbCBkdW1wMlN0YXRzZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykgeworICAgIHN0YXRpYyBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RhdHNkX3B1c2hlcio+IHN0YXRzZF9wdXNoZXJzID0KKyAgICB7CisgICAgICAgIHsgImF1ZGlvcG9saWN5Iiwgc3RhdHNkX2F1ZGlvcG9saWN5IH0sCisgICAgICAgIHsgImF1ZGlvcmVjb3JkIiwgc3RhdHNkX2F1ZGlvcmVjb3JkIH0sCisgICAgICAgIHsgImF1ZGlvdGhyZWFkIiwgc3RhdHNkX2F1ZGlvdGhyZWFkIH0sCisgICAgICAgIHsgImF1ZGlvdHJhY2siLCBzdGF0c2RfYXVkaW90cmFjayB9LAorICAgICAgICB7ICJjb2RlYyIsIHN0YXRzZF9jb2RlY30sCisgICAgICAgIHsgImRybW1hbmFnZXIiLCBzdGF0c2RfZHJtbWFuYWdlciB9LAorICAgICAgICB7ICJleHRyYWN0b3IiLCBzdGF0c2RfZXh0cmFjdG9yIH0sCisgICAgICAgIHsgIm1lZGlhZHJtIiwgc3RhdHNkX21lZGlhZHJtIH0sCisgICAgICAgIHsgIm1lZGlhcGFyc2VyIiwgc3RhdHNkX21lZGlhcGFyc2VyIH0sCisgICAgICAgIHsgIm51cGxheWVyIiwgc3RhdHNkX251cGxheWVyIH0sCisgICAgICAgIHsgIm51cGxheWVyMiIsIHN0YXRzZF9udXBsYXllciB9LAorICAgICAgICB7ICJyZWNvcmRlciIsIHN0YXRzZF9yZWNvcmRlciB9LAorICAgIH07CisgICAgcmV0dXJuIGR1bXAyU3RhdHNkSW50ZXJuYWwoc3RhdHNkX3B1c2hlcnMsIGl0ZW0sIHN0YXRzZExvZyk7Cit9CisKK2Jvb2wgZHVtcDJTdGF0c2QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIEFTdGF0c0V2ZW50TGlzdCogb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YXRzZF9wdWxsZXIqPiBzdGF0c2RfcHVsbGVycyA9CisgICAgeworICAgICAgICB7ICJtZWRpYWRybSIsIHN0YXRzZF9tZWRpYWRybV9wdWxsZXIgfSwKKyAgICB9OworICAgIHJldHVybiBkdW1wMlN0YXRzZEludGVybmFsKHN0YXRzZF9wdWxsZXJzLCBpdGVtLCBvdXQsIHN0YXRzZExvZyk7Cit9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pZmFjZV9zdGF0c2QuaCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9pZmFjZV9zdGF0c2QuaAppbmRleCA5YjQ5NTU2Li5jMmE4YjNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvaWZhY2Vfc3RhdHNkLmgKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL2lmYWNlX3N0YXRzZC5oCkBAIC0xNCwyMyArMTQsMzcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RhdHNfZXZlbnQuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1lZGlhbWV0cmljcyB7CitjbGFzcyBJdGVtOworfQogCi1leHRlcm4gYm9vbCBlbmFibGVkX3N0YXRzZDsKLQordXNpbmcgc3RhdHNkX3B1c2hlciA9IGJvb2wgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPiYgc3RhdHNkTG9nKTsKIC8vIGNvbXBvbmVudCBzcGVjaWZpYyBkdW1wZXJzCi1leHRlcm4gYm9vbCBzdGF0c2RfYXVkaW9wb2xpY3koY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICopOwotZXh0ZXJuIGJvb2wgc3RhdHNkX2F1ZGlvcmVjb3JkKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqKTsKLWV4dGVybiBib29sIHN0YXRzZF9hdWRpb3RocmVhZChjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7Ci1leHRlcm4gYm9vbCBzdGF0c2RfYXVkaW90cmFjayhjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7Ci1leHRlcm4gYm9vbCBzdGF0c2RfY29kZWMoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICopOwotZXh0ZXJuIGJvb2wgc3RhdHNkX2V4dHJhY3Rvcihjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7Ci1leHRlcm4gYm9vbCBzdGF0c2RfbWVkaWFwYXJzZXIoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICopOwotZXh0ZXJuIGJvb2wgc3RhdHNkX251cGxheWVyKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqKTsKLWV4dGVybiBib29sIHN0YXRzZF9yZWNvcmRlcihjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7CitleHRlcm4gc3RhdHNkX3B1c2hlciBzdGF0c2RfYXVkaW9wb2xpY3k7CitleHRlcm4gc3RhdHNkX3B1c2hlciBzdGF0c2RfYXVkaW9yZWNvcmQ7CitleHRlcm4gc3RhdHNkX3B1c2hlciBzdGF0c2RfYXVkaW90aHJlYWQ7CitleHRlcm4gc3RhdHNkX3B1c2hlciBzdGF0c2RfYXVkaW90cmFjazsKK2V4dGVybiBzdGF0c2RfcHVzaGVyIHN0YXRzZF9jb2RlYzsKK2V4dGVybiBzdGF0c2RfcHVzaGVyIHN0YXRzZF9leHRyYWN0b3I7CitleHRlcm4gc3RhdHNkX3B1c2hlciBzdGF0c2RfbWVkaWFwYXJzZXI7CiAKLWV4dGVybiBib29sIHN0YXRzZF9tZWRpYWRybShjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKik7Ci1leHRlcm4gYm9vbCBzdGF0c2Rfd2lkZXZpbmVDRE0oY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICopOwotZXh0ZXJuIGJvb2wgc3RhdHNkX2RybW1hbmFnZXIoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICopOworZXh0ZXJuIHN0YXRzZF9wdXNoZXIgc3RhdHNkX251cGxheWVyOworZXh0ZXJuIHN0YXRzZF9wdXNoZXIgc3RhdHNkX3JlY29yZGVyOworZXh0ZXJuIHN0YXRzZF9wdXNoZXIgc3RhdHNkX21lZGlhZHJtOworZXh0ZXJuIHN0YXRzZF9wdXNoZXIgc3RhdHNkX2RybW1hbmFnZXI7CiAKK3VzaW5nIHN0YXRzZF9wdWxsZXIgPSBib29sIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgQVN0YXRzRXZlbnRMaXN0ICosIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZyk7CisvLyBjb21wb25lbnQgc3BlY2lmaWMgcHVsbGVycworZXh0ZXJuIHN0YXRzZF9wdWxsZXIgc3RhdHNkX21lZGlhZHJtX3B1bGxlcjsKKworYm9vbCBkdW1wMlN0YXRzZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPiYgc3RhdHNkTG9nKTsKK2Jvb2wgZHVtcDJTdGF0c2QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIEFTdGF0c0V2ZW50TGlzdCogb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3BvbGljeS5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcAppbmRleCA2ZWYyZjJjLi4zZDkzNzZlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcApAQCAtMzIsMjUgKzMyLDI1IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9tZXNzYWdlL21lZGlhbWV0cmljc19tZXNzYWdlLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotYm9vbCBzdGF0c2RfYXVkaW9wb2xpY3koY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKQorYm9vbCBzdGF0c2RfYXVkaW9wb2xpY3koY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPiYgc3RhdHNkTG9nKQogewogICAgIGlmIChpdGVtID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCi0gICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXAgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOwotICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7Ci0gICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7Ci0gICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKLQorICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wX25hbm9zID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgY29uc3QgaW50NjRfdCBwYWNrYWdlX3ZlcnNpb25fY29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgY29uc3QgaW50NjRfdCBtZWRpYV9hcGV4X3ZlcnNpb24gPSAwOwogCiAgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCiAgICAgLy8KLSAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkF1ZGlvUG9saWN5RGF0YSBtZXRyaWNzX3Byb3RvOworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpBdWRpb1BvbGljeURhdGEgbWV0cmljc19wcm90bzsKIAogICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQogICAgIC8vCkBAIC02MCwzNSArNjAsMzUgQEAKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfc3RhdHVzKHN0YXR1cyk7CiAgICAgfQogICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiOwotICAgIHN0ZDo6c3RyaW5nIHJxc3Rfc3JjOwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiLCAmcnFzdF9zcmMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlcXVlc3Rfc291cmNlKHN0ZDo6bW92ZShycXN0X3NyYykpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Rfc291cmNlOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiLCAmcmVxdWVzdF9zb3VyY2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlcXVlc3Rfc291cmNlKHJlcXVlc3Rfc291cmNlKTsKICAgICB9CiAgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7Ci0gICAgc3RkOjpzdHJpbmcgcnFzdF9wa2c7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyIsICZycXN0X3BrZykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9wYWNrYWdlKHN0ZDo6bW92ZShycXN0X3BrZykpOworICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3RfcGFja2FnZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIiwgJnJlcXVlc3RfcGFja2FnZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9wYWNrYWdlKHJlcXVlc3RfcGFja2FnZSk7CiAgICAgfQogICAgIC8vaW50MzIgY2hhciBrQXVkaW9Qb2xpY3lScXN0U2Vzc2lvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zZXNzaW9uIjsKLSAgICBpbnQzMl90IHJxc3Rfc2Vzc2lvbiA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNlc3Npb24iLCAmcnFzdF9zZXNzaW9uKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZXF1ZXN0X3Nlc3Npb24ocnFzdF9zZXNzaW9uKTsKKyAgICBpbnQzMl90IHJlcXVlc3Rfc2Vzc2lvbiA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNlc3Npb24iLCAmcmVxdWVzdF9zZXNzaW9uKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZXF1ZXN0X3Nlc3Npb24ocmVxdWVzdF9zZXNzaW9uKTsKICAgICB9CiAgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LmRldmljZSI7Ci0gICAgc3RkOjpzdHJpbmcgcnFzdF9kZXZpY2U7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LmRldmljZSIsICZycXN0X2RldmljZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9kZXZpY2Uoc3RkOjptb3ZlKHJxc3RfZGV2aWNlKSk7CisgICAgc3RkOjpzdHJpbmcgcmVxdWVzdF9kZXZpY2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LmRldmljZSIsICZyZXF1ZXN0X2RldmljZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9kZXZpY2UocmVxdWVzdF9kZXZpY2UpOwogICAgIH0KIAogICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuc3JjIjsKLSAgICBzdGQ6OnN0cmluZyBhY3RpdmVfc3JjOwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNyYyIsICZhY3RpdmVfc3JjKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfc291cmNlKHN0ZDo6bW92ZShhY3RpdmVfc3JjKSk7CisgICAgc3RkOjpzdHJpbmcgYWN0aXZlX3NvdXJjZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5zcmMiLCAmYWN0aXZlX3NvdXJjZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYWN0aXZlX3NvdXJjZShhY3RpdmVfc291cmNlKTsKICAgICB9CiAgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVQa2dbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5wa2ciOwotICAgIHN0ZDo6c3RyaW5nIGFjdGl2ZV9wa2c7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIiwgJmFjdGl2ZV9wa2cpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9wYWNrYWdlKHN0ZDo6bW92ZShhY3RpdmVfcGtnKSk7CisgICAgc3RkOjpzdHJpbmcgYWN0aXZlX3BhY2thZ2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIiwgJmFjdGl2ZV9wYWNrYWdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfcGFja2FnZShhY3RpdmVfcGFja2FnZSk7CiAgICAgfQogICAgIC8vaW50MzIgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuc2Vzc2lvbiI7CiAgICAgaW50MzJfdCBhY3RpdmVfc2Vzc2lvbiA9IC0xOwpAQCAtOTgsMjcgKzk4LDQwIEBACiAgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOwogICAgIHN0ZDo6c3RyaW5nIGFjdGl2ZV9kZXZpY2U7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuZGV2aWNlIiwgJmFjdGl2ZV9kZXZpY2UpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9kZXZpY2Uoc3RkOjptb3ZlKGFjdGl2ZV9kZXZpY2UpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYWN0aXZlX2RldmljZShhY3RpdmVfZGV2aWNlKTsKICAgICB9CiAKLQogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CiAgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpcG9saWN5IG1ldHJpY3MiKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChlbmFibGVkX3N0YXRzZCkgewotICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOwotICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9QT0xJQ1lfUkVQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUE9MSUNZX1JFUE9SVEVELAorICAgICAgICB0aW1lc3RhbXBfbmFub3MsIHBhY2thZ2VfbmFtZS5jX3N0cigpLCBwYWNrYWdlX3ZlcnNpb25fY29kZSwKKyAgICAgICAgbWVkaWFfYXBleF92ZXJzaW9uLAorICAgICAgICBiZl9zZXJpYWxpemVkKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBsb2c7CisgICAgbG9nIDw8ICJyZXN1bHQ6IiA8PCByZXN1bHQgPDwgIiB7IgorICAgICAgICAgICAgPDwgIiBtZWRpYW1ldHJpY3NfYXVkaW9wb2xpY3lfcmVwb3J0ZWQ6IgorICAgICAgICAgICAgPDwgYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUE9MSUNZX1JFUE9SVEVECisgICAgICAgICAgICA8PCAiIHRpbWVzdGFtcF9uYW5vczoiIDw8IHRpbWVzdGFtcF9uYW5vcworICAgICAgICAgICAgPDwgIiBwYWNrYWdlX25hbWU6IiA8PCBwYWNrYWdlX25hbWUKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV92ZXJzaW9uX2NvZGU6IiA8PCBwYWNrYWdlX3ZlcnNpb25fY29kZQorICAgICAgICAgICAgPDwgIiBtZWRpYV9hcGV4X3ZlcnNpb246IiA8PCBtZWRpYV9hcGV4X3ZlcnNpb24KIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsIHN0cmxlbihzZXJpYWxpemVkLmNfc3RyKCkpKTsKLSAgICB9Ci0KKyAgICAgICAgICAgIDw8ICIgc3RhdHVzOiIgPDwgc3RhdHVzCisgICAgICAgICAgICA8PCAiIHJlcXVlc3Rfc291cmNlOiIgPDwgcmVxdWVzdF9zb3VyY2UKKyAgICAgICAgICAgIDw8ICIgcmVxdWVzdF9wYWNrYWdlOiIgPDwgcmVxdWVzdF9wYWNrYWdlCisgICAgICAgICAgICA8PCAiIHJlcXVlc3Rfc2Vzc2lvbjoiIDw8IHJlcXVlc3Rfc2Vzc2lvbgorICAgICAgICAgICAgPDwgIiByZXF1ZXN0X2RldmljZToiIDw8IHJlcXVlc3RfZGV2aWNlCisgICAgICAgICAgICA8PCAiIGFjdGl2ZV9zb3VyY2U6IiA8PCBhY3RpdmVfc291cmNlCisgICAgICAgICAgICA8PCAiIGFjdGl2ZV9wYWNrYWdlOiIgPDwgYWN0aXZlX3BhY2thZ2UKKyAgICAgICAgICAgIDw8ICIgYWN0aXZlX3Nlc3Npb246IiA8PCBhY3RpdmVfc2Vzc2lvbgorICAgICAgICAgICAgPDwgIiBhY3RpdmVfZGV2aWNlOiIgPDwgYWN0aXZlX2RldmljZQorICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9QT0xJQ1lfUkVQT1JURUQsIGxvZy5zdHIoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3JlY29yZC5jcHAKaW5kZXggNzZmNGI1OS4uNDFlZmNhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3JlY29yZC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3JlY29yZC5jcHAKQEAgLTMyLDM2ICszMiwzNiBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9tZXNzYWdlL21lZGlhbWV0cmljc19tZXNzYWdlLnBiLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotYm9vbCBzdGF0c2RfYXVkaW9yZWNvcmQoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKQoteworYm9vbCBzdGF0c2RfYXVkaW9yZWNvcmQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykgewogICAgIGlmIChpdGVtID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKIAogICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCi0gICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXAgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOwotICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7Ci0gICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7Ci0gICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKLQorICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wX25hbm9zID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgY29uc3QgaW50NjRfdCBwYWNrYWdlX3ZlcnNpb25fY29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgY29uc3QgaW50NjRfdCBtZWRpYV9hcGV4X3ZlcnNpb24gPSAwOwogCiAgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCiAgICAgLy8KLSAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkF1ZGlvUmVjb3JkRGF0YSBtZXRyaWNzX3Byb3RvOworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpBdWRpb1JlY29yZERhdGEgbWV0cmljc19wcm90bzsKIAogICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQogICAgIC8vCiAgICAgc3RkOjpzdHJpbmcgZW5jb2Rpbmc7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lbmNvZGluZyIsICZlbmNvZGluZykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZW5jb2Rpbmcoc3RkOjptb3ZlKGVuY29kaW5nKSk7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKGVuY29kaW5nKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzb3VyY2U7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zb3VyY2UiLCAmc291cmNlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zb3VyY2Uoc3RkOjptb3ZlKHNvdXJjZSkpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zb3VyY2Uoc291cmNlKTsKICAgICB9CiAKICAgICBpbnQzMl90IGxhdGVuY3kgPSAtMTsKQEAgLTc5LDE0ICs3OSwxNCBAQAogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVscyhjaGFubmVscyk7CiAgICAgfQogCi0gICAgaW50NjRfdCBjcmVhdGVkTXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY3JlYXRlZE1zIiwgJmNyZWF0ZWRNcykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfY3JlYXRlZF9taWxsaXMoY3JlYXRlZE1zKTsKKyAgICBpbnQ2NF90IGNyZWF0ZWRfbWlsbGlzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNyZWF0ZWRNcyIsICZjcmVhdGVkX21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY3JlYXRlZF9taWxsaXMoY3JlYXRlZF9taWxsaXMpOwogICAgIH0KIAotICAgIGludDY0X3QgZHVyYXRpb25NcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uX21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uX21pbGxpcyk7CiAgICAgfQogCiAgICAgaW50MzJfdCBjb3VudCA9IC0xOwpAQCAtOTQsNDYgKzk0LDQ0IEBACiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvdW50KGNvdW50KTsKICAgICB9CiAKLSAgICBpbnQzMl90IGVycmNvZGUgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSIsICZlcnJjb2RlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycmNvZGUpOwotICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGFzdEVycm9yLmNvZGUiLCAmZXJyY29kZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJjb2RlKTsKKyAgICBpbnQzMl90IGVycm9yX2NvZGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSIsICZlcnJvcl9jb2RlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycm9yX2NvZGUpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGFzdEVycm9yLmNvZGUiLCAmZXJyb3JfY29kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJvcl9jb2RlKTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBlcnJmdW5jOwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyZnVuYyIsICZlcnJmdW5jKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9mdW5jdGlvbihzdGQ6Om1vdmUoZXJyZnVuYykpOwotICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhc3RFcnJvci5hdCIsICZlcnJmdW5jKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9mdW5jdGlvbihzdGQ6Om1vdmUoZXJyZnVuYykpOworICAgIHN0ZDo6c3RyaW5nIGVycm9yX2Z1bmN0aW9uOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyZnVuYyIsICZlcnJvcl9mdW5jdGlvbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfZnVuY3Rpb24oZXJyb3JfZnVuY3Rpb24pOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhc3RFcnJvci5hdCIsICZlcnJvcl9mdW5jdGlvbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfZnVuY3Rpb24oZXJyb3JfZnVuY3Rpb24pOwogICAgIH0KIAotICAgIC8vIHBvcnRJZCAoaW50MzIpCiAgICAgaW50MzJfdCBwb3J0X2lkID0gLTE7CiAgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnBvcnRJZCIsICZwb3J0X2lkKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wb3J0X2lkKGNvdW50KTsKICAgICB9Ci0gICAgLy8gZnJhbWVDb3VudCAoaW50MzIpCi0gICAgaW50MzJfdCBmcmFtZUNvdW50ID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmZyYW1lQ291bnQiLCAmZnJhbWVDb3VudCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVfY291bnQoZnJhbWVDb3VudCk7Ci0gICAgfQotICAgIC8vIGF0dHJpYnV0ZXMgKHN0cmluZykKLSAgICBzdGQ6OnN0cmluZyBhdHRyaWJ1dGVzOwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuYXR0cmlidXRlcyIsICZhdHRyaWJ1dGVzKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdHRyaWJ1dGVzKHN0ZDo6bW92ZShhdHRyaWJ1dGVzKSk7Ci0gICAgfQotICAgIC8vIGNoYW5uZWxNYXNrIChpbnQ2NCkKLSAgICBpbnQ2NF90IGNoYW5uZWxNYXNrID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNoYW5uZWxNYXNrIiwgJmNoYW5uZWxNYXNrKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbE1hc2spOwotICAgIH0KLSAgICAvLyBzdGFydGNvdW50IChpbnQ2NCkKLSAgICBpbnQ2NF90IHN0YXJ0Y291bnQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc3RhcnRjb3VudCIsICZzdGFydGNvdW50KSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdGFydF9jb3VudChzdGFydGNvdW50KTsKKworICAgIGludDMyX3QgZnJhbWVfY291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZnJhbWVDb3VudCIsICZmcmFtZV9jb3VudCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVfY291bnQoZnJhbWVfY291bnQpOwogICAgIH0KIAorICAgIHN0ZDo6c3RyaW5nIGF0dHJpYnV0ZXM7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5hdHRyaWJ1dGVzIiwgJmF0dHJpYnV0ZXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgfQorCisgICAgaW50NjRfdCBjaGFubmVsX21hc2sgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbE1hc2siLCAmY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbF9tYXNrKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0X2NvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnN0YXJ0Y291bnQiLCAmc3RhcnRfY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXJ0X2NvdW50KHN0YXJ0X2NvdW50KTsKKyAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOwogICAgIGlmICghbWV0cmljc19wcm90by5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpIHsKQEAgLTE0MSwxNyArMTM5LDQ4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUkVDT1JEX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIC8vIEFuZHJvaWQgUworICAgIC8vIGxvZ19zZXNzaW9uX2lkIChzdHJpbmcpCisgICAgc3RkOjpzdHJpbmcgbG9nU2Vzc2lvbklkOworICAgICh2b2lkKWl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5sb2dTZXNzaW9uSWQiLCAmbG9nU2Vzc2lvbklkKTsKKyAgICBjb25zdCBhdXRvIGxvZ19zZXNzaW9uX2lkID0KKyAgICAgICAgICAgIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CiAKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7Ci0gICAgfQorICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRF9SRVBPUlRFRCwKKyAgICAgICAgdGltZXN0YW1wX25hbm9zLCBwYWNrYWdlX25hbWUuY19zdHIoKSwgcGFja2FnZV92ZXJzaW9uX2NvZGUsCisgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgYmZfc2VyaWFsaXplZCwKKyAgICAgICAgbG9nX3Nlc3Npb25faWQuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX2F1ZGlvcmVjb3JkX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1JFQ09SRF9SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCiAKKyAgICAgICAgICAgIDw8ICIgZW5jb2Rpbmc6IiA8PCBlbmNvZGluZworICAgICAgICAgICAgPDwgIiBzb3VyY2U6IiA8PCBzb3VyY2UKKyAgICAgICAgICAgIDw8ICIgbGF0ZW5jeToiIDw8IGxhdGVuY3kKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlcmF0ZToiIDw8IHNhbXBsZXJhdGUKKyAgICAgICAgICAgIDw8ICIgY2hhbm5lbHM6IiA8PCBjaGFubmVscworICAgICAgICAgICAgPDwgIiBjcmVhdGVkX21pbGxpczoiIDw8IGNyZWF0ZWRfbWlsbGlzCisgICAgICAgICAgICA8PCAiIGR1cmF0aW9uX21pbGxpczoiIDw8IGR1cmF0aW9uX21pbGxpcworICAgICAgICAgICAgPDwgIiBjb3VudDoiIDw8IGNvdW50CisgICAgICAgICAgICA8PCAiIGVycm9yX2NvZGU6IiA8PCBlcnJvcl9jb2RlCisgICAgICAgICAgICA8PCAiIGVycm9yX2Z1bmN0aW9uOiIgPDwgZXJyb3JfZnVuY3Rpb24KKworICAgICAgICAgICAgPDwgIiBwb3J0X2lkOiIgPDwgcG9ydF9pZAorICAgICAgICAgICAgPDwgIiBmcmFtZV9jb3VudDoiIDw8IGZyYW1lX2NvdW50CisgICAgICAgICAgICA8PCAiIGF0dHJpYnV0ZXM6IiA8PCBhdHRyaWJ1dGVzCisgICAgICAgICAgICA8PCAiIGNoYW5uZWxfbWFzazoiIDw8IGNoYW5uZWxfbWFzaworICAgICAgICAgICAgPDwgIiBzdGFydF9jb3VudDoiIDw8IHN0YXJ0X2NvdW50CisKKyAgICAgICAgICAgIDw8ICIgbG9nX3Nlc3Npb25faWQ6IiA8PCBsb2dfc2Vzc2lvbl9pZAorICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9SRUNPUkRfUkVQT1JURUQsIGxvZy5zdHIoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAKaW5kZXggMmFkMjU2Mi4uZTliNmRkNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAKQEAgLTMyLDI1ICszMiwyNSBAQAogI2luY2x1ZGUgPHN0YXRzbG9nLmg+CiAKICNpbmNsdWRlICJNZWRpYU1ldHJpY3NTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWJvb2wgc3RhdHNkX2F1ZGlvdGhyZWFkKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkKK2Jvb2wgc3RhdHNkX2F1ZGlvdGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpCiB7CiAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOwotCisgICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXBfbmFub3MgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBjb25zdCBpbnQ2NF90IHBhY2thZ2VfdmVyc2lvbl9jb2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBjb25zdCBpbnQ2NF90IG1lZGlhX2FwZXhfdmVyc2lvbiA9IDA7CiAKICAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KICAgICAvLwotICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6QXVkaW9UaHJlYWREYXRhIG1ldHJpY3NfcHJvdG87CisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OkF1ZGlvVGhyZWFkRGF0YSBtZXRyaWNzX3Byb3RvOwogCiAjZGVmaW5lCU1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC4iCiAKQEAgLTY4LDE3ICs2OCwxNyBAQAogICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZXJhdGUiLCAmc2FtcGxlcmF0ZSkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfc2FtcGxlcmF0ZShzYW1wbGVyYXRlKTsKICAgICB9Ci0gICAgc3RkOjpzdHJpbmcgd29ya2hpc3Q7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggIndvcmtNcy5oaXN0IiwgJndvcmtoaXN0KSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF93b3JrX21pbGxpc19oaXN0KHN0ZDo6bW92ZSh3b3JraGlzdCkpOworICAgIHN0ZDo6c3RyaW5nIHdvcmtfbWlsbGlzX2hpc3Q7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggIndvcmtNcy5oaXN0IiwgJndvcmtfbWlsbGlzX2hpc3QpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3dvcmtfbWlsbGlzX2hpc3Qod29ya19taWxsaXNfaGlzdCk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGxhdGVuY3loaXN0OwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoTU1fUFJFRklYICJsYXRlbmN5TXMuaGlzdCIsICZsYXRlbmN5aGlzdCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9taWxsaXNfaGlzdChzdGQ6Om1vdmUobGF0ZW5jeWhpc3QpKTsKKyAgICBzdGQ6OnN0cmluZyBsYXRlbmN5X21pbGxpc19oaXN0OworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoTU1fUFJFRklYICJsYXRlbmN5TXMuaGlzdCIsICZsYXRlbmN5X21pbGxpc19oaXN0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21pbGxpc19oaXN0KGxhdGVuY3lfbWlsbGlzX2hpc3QpOwogICAgIH0KLSAgICBzdGQ6OnN0cmluZyB3YXJtdXBoaXN0OwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoTU1fUFJFRklYICJ3YXJtdXBNcy5oaXN0IiwgJndhcm11cGhpc3QpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3dhcm11cF9taWxsaXNfaGlzdChzdGQ6Om1vdmUod2FybXVwaGlzdCkpOworICAgIHN0ZDo6c3RyaW5nIHdhcm11cF9taWxsaXNfaGlzdDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAid2FybXVwTXMuaGlzdCIsICZ3YXJtdXBfbWlsbGlzX2hpc3QpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3dhcm11cF9taWxsaXNfaGlzdCh3YXJtdXBfbWlsbGlzX2hpc3QpOwogICAgIH0KICAgICBpbnQ2NF90IHVuZGVycnVucyA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQ2NChNTV9QUkVGSVggInVuZGVycnVucyIsICZ1bmRlcnJ1bnMpKSB7CkBAIC04OCwxMDEgKzg4LDk5IEBACiAgICAgaWYgKGl0ZW0tPmdldEludDY0KE1NX1BSRUZJWCAib3ZlcnJ1bnMiLCAmb3ZlcnJ1bnMpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X292ZXJydW5zKG92ZXJydW5zKTsKICAgICB9Ci0gICAgaW50NjRfdCBhY3RpdmVNcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NChNTV9QUkVGSVggImFjdGl2ZU1zIiwgJmFjdGl2ZU1zKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfbWlsbGlzKGFjdGl2ZU1zKTsKKyAgICBpbnQ2NF90IGFjdGl2ZV9taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoTU1fUFJFRklYICJhY3RpdmVNcyIsICZhY3RpdmVfbWlsbGlzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfbWlsbGlzKGFjdGl2ZV9taWxsaXMpOwogICAgIH0KLSAgICBpbnQ2NF90IGR1cmF0aW9uTXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoTU1fUFJFRklYICJkdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NChNTV9QUkVGSVggImR1cmF0aW9uTXMiLCAmZHVyYXRpb25fbWlsbGlzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9kdXJhdGlvbl9taWxsaXMoZHVyYXRpb25fbWlsbGlzKTsKICAgICB9CiAKLSAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImlkIiwgKGludDMyX3QpbUlkKTsgLy8gSU8gaGFuZGxlCiAgICAgaW50MzJfdCBpZCA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggImlkIiwgJmlkKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pZChpZCk7CiAgICAgfQotICAgIC8vIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpbVBvcnRJZCk7CisKICAgICBpbnQzMl90IHBvcnRfaWQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJwb3J0SWQiLCAmaWQpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgJnBvcnRfaWQpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BvcnRfaWQocG9ydF9pZCk7CiAgICAgfQogICAgIC8vIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJ0eXBlIiwgdGhyZWFkVHlwZVRvU3RyaW5nKG1UeXBlKSk7CiAgICAgc3RkOjpzdHJpbmcgdHlwZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsICZ0eXBlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90eXBlKHN0ZDo6bW92ZSh0eXBlKSk7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3R5cGUodHlwZSk7CiAgICAgfQotICAgIC8vIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlUmF0ZSIsIChpbnQzMl90KW1TYW1wbGVSYXRlKTsKKwogICAgIGludDMyX3Qgc2FtcGxlX3JhdGUgPSAtMTsKICAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVSYXRlIiwgJnNhbXBsZV9yYXRlKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVfcmF0ZShzYW1wbGVfcmF0ZSk7CiAgICAgfQotICAgIC8vIGl0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdCltQ2hhbm5lbE1hc2spOworCiAgICAgaW50MzJfdCBjaGFubmVsX21hc2sgPSAtMTsKICAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJjaGFubmVsTWFzayIsICZjaGFubmVsX21hc2spKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxfbWFzayhjaGFubmVsX21hc2spOwogICAgIH0KLSAgICAvLyBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIGVuY29kaW5nOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoTU1fUFJFRklYICJlbmNvZGluZyIsICZlbmNvZGluZykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZW5jb2Rpbmcoc3RkOjptb3ZlKGVuY29kaW5nKSk7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKGVuY29kaW5nKTsKICAgICB9Ci0gICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpbUZyYW1lQ291bnQpOworCiAgICAgaW50MzJfdCBmcmFtZV9jb3VudCA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAmZnJhbWVfY291bnQpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lX2NvdW50KGZyYW1lX2NvdW50KTsKICAgICB9Ci0gICAgLy8gaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggIm91dERldmljZSIsIHRvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOwotICAgIHN0ZDo6c3RyaW5nIG91dERldmljZTsKLSAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAib3V0RGV2aWNlIiwgJm91dERldmljZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfb3V0cHV0X2RldmljZShzdGQ6Om1vdmUob3V0RGV2aWNlKSk7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJpbkRldmljZSIsIHRvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7Ci0gICAgc3RkOjpzdHJpbmcgaW5EZXZpY2U7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggImluRGV2aWNlIiwgJmluRGV2aWNlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pbnB1dF9kZXZpY2Uoc3RkOjptb3ZlKGluRGV2aWNlKSk7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsIG1Jb0ppdHRlck1zLmdldE1lYW4oKSk7Ci0gICAgZG91YmxlIGlvaml0dGVyc19tc19tZWFuID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsICZpb2ppdHRlcnNfbXNfbWVhbikpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfaW9faml0dGVyX21lYW5fbWlsbGlzKGlvaml0dGVyc19tc19tZWFuKTsKLSAgICB9Ci0gICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCBtSW9KaXR0ZXJNcy5nZXRTdGREZXYoKSk7Ci0gICAgZG91YmxlIGlvaml0dGVyc19tc19zdGQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCAmaW9qaXR0ZXJzX21zX3N0ZCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfaW9faml0dGVyX3N0ZGRldl9taWxsaXMoaW9qaXR0ZXJzX21zX3N0ZCk7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsIG1Qcm9jZXNzVGltZU1zLmdldE1lYW4oKSk7Ci0gICAgZG91YmxlIHByb2Nlc3NfdGltZV9tc19tZWFuID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsICZwcm9jZXNzX3RpbWVfbXNfbWVhbikpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJvY2Vzc190aW1lX21lYW5fbWlsbGlzKHByb2Nlc3NfdGltZV9tc19tZWFuKTsKLSAgICB9Ci0gICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCBtUHJvY2Vzc1RpbWVNcy5nZXRTdGREZXYoKSk7Ci0gICAgZG91YmxlIHByb2Nlc3NfdGltZV9tc19zdGQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCAmcHJvY2Vzc190aW1lX21zX3N0ZCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJvY2Vzc190aW1lX3N0ZGRldl9taWxsaXMocHJvY2Vzc190aW1lX21zX3N0ZCk7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLm1lYW4iLCB0c2ppdHRlci5nZXRNZWFuKCkpOwotICAgIGRvdWJsZSB0aW1lc3RhbXBfaml0dGVyX21zX21lYW4gPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMubWVhbiIsICZ0aW1lc3RhbXBfaml0dGVyX21zX21lYW4pKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RpbWVzdGFtcF9qaXR0ZXJfbWVhbl9taWxsaXModGltZXN0YW1wX2ppdHRlcl9tc19tZWFuKTsKLSAgICB9Ci0gICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgdHNqaXR0ZXIuZ2V0U3RkRGV2KCkpOwotICAgIGRvdWJsZSB0aW1lc3RhbXBfaml0dGVyX21zX3N0ZGRldiA9IC0xOwotICAgIGlmIChpdGVtLT5nZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5zdGQiLCAmdGltZXN0YW1wX2ppdHRlcl9tc19zdGRkZXYpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RpbWVzdGFtcF9qaXR0ZXJfc3RkZGV2X21pbGxpcyh0aW1lc3RhbXBfaml0dGVyX21zX3N0ZGRldik7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgbUxhdGVuY3lNcy5nZXRNZWFuKCkpOwotICAgIGRvdWJsZSBsYXRlbmN5X21zX21lYW4gPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLm1lYW4iLCAmbGF0ZW5jeV9tc19tZWFuKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21lYW5fbWlsbGlzKGxhdGVuY3lfbXNfbWVhbik7Ci0gICAgfQotICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5zdGQiLCBtTGF0ZW5jeU1zLmdldFN0ZERldigpKTsKLSAgICBkb3VibGUgbGF0ZW5jeV9tc19zdGRkZXYgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsICZsYXRlbmN5X21zX3N0ZGRldikpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9zdGRkZXZfbWlsbGlzKGxhdGVuY3lfbXNfc3RkZGV2KTsKKworICAgIHN0ZDo6c3RyaW5nIG91dHB1dF9kZXZpY2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggIm91dERldmljZSIsICZvdXRwdXRfZGV2aWNlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9vdXRwdXRfZGV2aWNlKG91dHB1dF9kZXZpY2UpOwogICAgIH0KIAorICAgIHN0ZDo6c3RyaW5nIGlucHV0X2RldmljZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAiaW5EZXZpY2UiLCAmaW5wdXRfZGV2aWNlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pbnB1dF9kZXZpY2UoaW5wdXRfZGV2aWNlKTsKKyAgICB9CisKKyAgICBkb3VibGUgaW9faml0dGVyX21lYW5fbWlsbGlzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsICZpb19qaXR0ZXJfbWVhbl9taWxsaXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2lvX2ppdHRlcl9tZWFuX21pbGxpcyhpb19qaXR0ZXJfbWVhbl9taWxsaXMpOworICAgIH0KKworICAgIGRvdWJsZSBpb19qaXR0ZXJfc3RkZGV2X21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLnN0ZCIsICZpb19qaXR0ZXJfc3RkZGV2X21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaW9faml0dGVyX3N0ZGRldl9taWxsaXMoaW9faml0dGVyX3N0ZGRldl9taWxsaXMpOworICAgIH0KKworICAgIGRvdWJsZSBwcm9jZXNzX3RpbWVfbWVhbl9taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5tZWFuIiwgJnByb2Nlc3NfdGltZV9tZWFuX21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJvY2Vzc190aW1lX21lYW5fbWlsbGlzKHByb2Nlc3NfdGltZV9tZWFuX21pbGxpcyk7CisgICAgfQorCisgICAgZG91YmxlIHByb2Nlc3NfdGltZV9zdGRkZXZfbWlsbGlzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMuc3RkIiwgJnByb2Nlc3NfdGltZV9zdGRkZXZfbWlsbGlzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wcm9jZXNzX3RpbWVfc3RkZGV2X21pbGxpcyhwcm9jZXNzX3RpbWVfc3RkZGV2X21pbGxpcyk7CisgICAgfQorCisgICAgZG91YmxlIHRpbWVzdGFtcF9qaXR0ZXJfbWVhbl9taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMubWVhbiIsICZ0aW1lc3RhbXBfaml0dGVyX21lYW5fbWlsbGlzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90aW1lc3RhbXBfaml0dGVyX21lYW5fbWlsbGlzKHRpbWVzdGFtcF9qaXR0ZXJfbWVhbl9taWxsaXMpOworICAgIH0KKworICAgIGRvdWJsZSB0aW1lc3RhbXBfaml0dGVyX3N0ZGRldl9taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgJnRpbWVzdGFtcF9qaXR0ZXJfc3RkZGV2X21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdGltZXN0YW1wX2ppdHRlcl9zdGRkZXZfbWlsbGlzKHRpbWVzdGFtcF9qaXR0ZXJfc3RkZGV2X21pbGxpcyk7CisgICAgfQorCisgICAgZG91YmxlIGxhdGVuY3lfbWVhbl9taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLm1lYW4iLCAmbGF0ZW5jeV9tZWFuX21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9tZWFuX21pbGxpcyhsYXRlbmN5X21lYW5fbWlsbGlzKTsKKyAgICB9CisKKyAgICBkb3VibGUgbGF0ZW5jeV9zdGRkZXZfbWlsbGlzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5zdGQiLCAmbGF0ZW5jeV9zdGRkZXZfbWlsbGlzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X3N0ZGRldl9taWxsaXMobGF0ZW5jeV9zdGRkZXZfbWlsbGlzKTsKKyAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOwogICAgIGlmICghbWV0cmljc19wcm90by5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpIHsKQEAgLTE5MCwxNyArMTg4LDUwIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVEhSRUFEX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RIUkVBRF9SRVBPUlRFRCwKKyAgICAgICAgdGltZXN0YW1wX25hbm9zLCBwYWNrYWdlX25hbWUuY19zdHIoKSwgcGFja2FnZV92ZXJzaW9uX2NvZGUsCisgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX2F1ZGlvdGhyZWFkX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RIUkVBRF9SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCiAKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7Ci0gICAgfQorICAgICAgICAgICAgPDwgIiB0eXBlOiIgPDwgdHlwZQorICAgICAgICAgICAgPDwgIiBmcmFtZWNvdW50OiIgPDwgZnJhbWVjb3VudAorICAgICAgICAgICAgPDwgIiBzYW1wbGVyYXRlOiIgPDwgc2FtcGxlcmF0ZQorICAgICAgICAgICAgPDwgIiB3b3JrX21pbGxpc19oaXN0OiIgPDwgd29ya19taWxsaXNfaGlzdAorICAgICAgICAgICAgPDwgIiBsYXRlbmN5X21pbGxpc19oaXN0OiIgPDwgbGF0ZW5jeV9taWxsaXNfaGlzdAorICAgICAgICAgICAgPDwgIiB3YXJtdXBfbWlsbGlzX2hpc3Q6IiA8PCB3YXJtdXBfbWlsbGlzX2hpc3QKKyAgICAgICAgICAgIDw8ICIgdW5kZXJydW5zOiIgPDwgdW5kZXJydW5zCisgICAgICAgICAgICA8PCAiIG92ZXJydW5zOiIgPDwgb3ZlcnJ1bnMKKyAgICAgICAgICAgIDw8ICIgYWN0aXZlX21pbGxpczoiIDw8IGFjdGl2ZV9taWxsaXMKKyAgICAgICAgICAgIDw8ICIgZHVyYXRpb25fbWlsbGlzOiIgPDwgZHVyYXRpb25fbWlsbGlzCiAKKyAgICAgICAgICAgIDw8ICIgaWQ6IiA8PCBpZAorICAgICAgICAgICAgPDwgIiBwb3J0X2lkOiIgPDwgcG9ydF9pZAorICAgICAgICAgICAgPDwgIiBzYW1wbGVfcmF0ZToiIDw8IHNhbXBsZV9yYXRlCisgICAgICAgICAgICA8PCAiIGNoYW5uZWxfbWFzazoiIDw8IGNoYW5uZWxfbWFzaworICAgICAgICAgICAgPDwgIiBlbmNvZGluZzoiIDw8IGVuY29kaW5nCisgICAgICAgICAgICA8PCAiIGZyYW1lX2NvdW50OiIgPDwgZnJhbWVfY291bnQKKyAgICAgICAgICAgIDw8ICIgb3V0cHV0X2RldmljZToiIDw8IG91dHB1dF9kZXZpY2UKKyAgICAgICAgICAgIDw8ICIgaW5wdXRfZGV2aWNlOiIgPDwgaW5wdXRfZGV2aWNlCisgICAgICAgICAgICA8PCAiIGlvX2ppdHRlcl9tZWFuX21pbGxpczoiIDw8IGlvX2ppdHRlcl9tZWFuX21pbGxpcworICAgICAgICAgICAgPDwgIiBpb19qaXR0ZXJfc3RkZGV2X21pbGxpczoiIDw8IGlvX2ppdHRlcl9zdGRkZXZfbWlsbGlzCisKKyAgICAgICAgICAgIDw8ICIgcHJvY2Vzc190aW1lX21lYW5fbWlsbGlzOiIgPDwgcHJvY2Vzc190aW1lX21lYW5fbWlsbGlzCisgICAgICAgICAgICA8PCAiIHByb2Nlc3NfdGltZV9zdGRkZXZfbWlsbGlzOiIgPDwgcHJvY2Vzc190aW1lX3N0ZGRldl9taWxsaXMKKyAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wX2ppdHRlcl9tZWFuX21pbGxpczoiIDw8IHRpbWVzdGFtcF9qaXR0ZXJfbWVhbl9taWxsaXMKKyAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wX2ppdHRlcl9zdGRkZXZfbWlsbGlzOiIgPDwgdGltZXN0YW1wX2ppdHRlcl9zdGRkZXZfbWlsbGlzCisgICAgICAgICAgICA8PCAiIGxhdGVuY3lfbWVhbl9taWxsaXM6IiA8PCBsYXRlbmN5X21lYW5fbWlsbGlzCisgICAgICAgICAgICA8PCAiIGxhdGVuY3lfc3RkZGV2X21pbGxpczoiIDw8IGxhdGVuY3lfc3RkZGV2X21pbGxpcworICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9USFJFQURfUkVQT1JURUQsIGxvZy5zdHIoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCmluZGV4IDZiMDhhNzguLjU5NjI3YWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcApAQCAtMzIsNzcgKzMyLDc4IEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1ib29sIHN0YXRzZF9hdWRpb3RyYWNrKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkKK2Jvb2wgc3RhdHNkX2F1ZGlvdHJhY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykKIHsKICAgICBpZiAoaXRlbSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgotICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKLSAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOwotICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOwotICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7Ci0KKyAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcF9uYW5vcyA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGNvbnN0IGludDY0X3QgcGFja2FnZV92ZXJzaW9uX2NvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGNvbnN0IGludDY0X3QgbWVkaWFfYXBleF92ZXJzaW9uID0gMDsKIAogICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bwogICAgIC8vCi0gICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpBdWRpb1RyYWNrRGF0YSBtZXRyaWNzX3Byb3RvOworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpBdWRpb1RyYWNrRGF0YSBtZXRyaWNzX3Byb3RvOwogCiAgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCiAgICAgLy8KIAogICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0cmVhbVR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSI7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN0cmVhbVR5cGU7Ci0gICAgc3RkOjpzdHJpbmcgc3RyZWFtdHlwZTsKLSAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSIsICZzdHJlYW10eXBlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdHJlYW1fdHlwZShzdGQ6Om1vdmUoc3RyZWFtdHlwZSkpOworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbV90eXBlOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zdHJlYW10eXBlIiwgJnN0cmVhbV90eXBlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdHJlYW1fdHlwZShzdHJlYW1fdHlwZSk7CiAgICAgfQogCiAgICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrQ29udGVudFR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSI7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnR0eXBlOwotICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIiwgJmNvbnRlbnR0eXBlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jb250ZW50X3R5cGUoc3RkOjptb3ZlKGNvbnRlbnR0eXBlKSk7CisgICAgc3RkOjpzdHJpbmcgY29udGVudF90eXBlOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIiwgJmNvbnRlbnRfdHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29udGVudF90eXBlKGNvbnRlbnRfdHlwZSk7CiAgICAgfQogCiAgICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVXNhZ2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudXNhZ2UiOwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFja1VzYWdlOwotICAgIHN0ZDo6c3RyaW5nIHRyYWNrdXNhZ2U7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIiwgJnRyYWNrdXNhZ2UpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RyYWNrX3VzYWdlKHN0ZDo6bW92ZSh0cmFja3VzYWdlKSk7CisgICAgc3RkOjpzdHJpbmcgdHJhY2tfdXNhZ2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIiwgJnRyYWNrX3VzYWdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90cmFja191c2FnZSh0cmFja191c2FnZSk7CiAgICAgfQogCiAgICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVyYXRlIjsKICAgICAvLyBvcHRpb25hbCBpbnQzMiBzYW1wbGVyYXRlOwotICAgIGludDMyX3Qgc2FtcGxlcmF0ZSA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiLCAmc2FtcGxlcmF0ZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfc2FtcGxlX3JhdGUoc2FtcGxlcmF0ZSk7CisgICAgaW50MzJfdCBzYW1wbGVfcmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiLCAmc2FtcGxlX3JhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZV9yYXRlKHNhbXBsZV9yYXRlKTsKICAgICB9CiAKICAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDaGFubmVsTWFza1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayI7CiAgICAgLy8gb3B0aW9uYWwgaW50NjQgY2hhbm5lbE1hc2s7Ci0gICAgaW50NjRfdCBjaGFubmVsTWFzayA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIiwgJmNoYW5uZWxNYXNrKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbE1hc2spOworICAgIGludDY0X3QgY2hhbm5lbF9tYXNrID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbG1hc2siLCAmY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbF9tYXNrKTsKICAgICB9CiAKICAgICAvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgogICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VuZGVycnVuRnJhbWVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIjsKICAgICAvLyBvcHRpb25hbCBpbnQzMiB1bmRlcnJ1bmZyYW1lczsKLSAgICBpbnQzMl90IHVuZGVycnVuZnJhbWVzID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5mcmFtZXMiLCAmdW5kZXJydW5mcmFtZXMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3VuZGVycnVuX2ZyYW1lcyh1bmRlcnJ1bmZyYW1lcyk7CisgICAgaW50MzJfdCB1bmRlcnJ1bl9mcmFtZXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyIsICZ1bmRlcnJ1bl9mcmFtZXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3VuZGVycnVuX2ZyYW1lcyh1bmRlcnJ1bl9mcmFtZXMpOwogICAgIH0KIAogICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOwogICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0dXBnbGl0Y2g7Ci0gICAgaW50MzJfdCBzdGFydHVwZ2xpdGNoID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiLCAmc3RhcnR1cGdsaXRjaCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfc3RhcnR1cF9nbGl0Y2goc3RhcnR1cGdsaXRjaCk7CisgICAgaW50MzJfdCBzdGFydHVwX2dsaXRjaCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIiwgJnN0YXJ0dXBfZ2xpdGNoKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdGFydHVwX2dsaXRjaChzdGFydHVwX2dsaXRjaCk7CiAgICAgfQogCiAgICAgLy8gcG9ydElkIChpbnQzMikKQEAgLTExMyw3ICsxMTQsNyBAQAogICAgIC8vIGVuY29kaW5nIChzdHJpbmcpCiAgICAgc3RkOjpzdHJpbmcgZW5jb2Rpbmc7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmVuY29kaW5nIiwgJmVuY29kaW5nKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lbmNvZGluZyhzdGQ6Om1vdmUoZW5jb2RpbmcpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZW5jb2RpbmcoZW5jb2RpbmcpOwogICAgIH0KICAgICAvLyBmcmFtZUNvdW50IChpbnQzMikKICAgICBpbnQzMl90IGZyYW1lX2NvdW50ID0gLTE7CkBAIC0xMjMsNyArMTI0LDcgQEAKICAgICAvLyBhdHRyaWJ1dGVzIChzdHJpbmcpCiAgICAgc3RkOjpzdHJpbmcgYXR0cmlidXRlczsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suYXR0cmlidXRlcyIsICZhdHRyaWJ1dGVzKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdHRyaWJ1dGVzKHN0ZDo6bW92ZShhdHRyaWJ1dGVzKSk7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKQEAgLTEzMiwxNyArMTMzLDQ0IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tfUkVQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgLy8gQW5kcm9pZCBTCisgICAgLy8gbG9nX3Nlc3Npb25faWQgKHN0cmluZykKKyAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CisgICAgKHZvaWQpaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2subG9nU2Vzc2lvbklkIiwgJmxvZ1Nlc3Npb25JZCk7CisgICAgY29uc3QgYXV0byBsb2dfc2Vzc2lvbl9pZCA9CisgICAgICAgICAgICBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dTZXNzaW9uSWQpOwogCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOwotICAgIH0KKyAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgIGludCByZXN1bHQgPSBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9UUkFDS19SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbmFub3MsIHBhY2thZ2VfbmFtZS5jX3N0cigpLCBwYWNrYWdlX3ZlcnNpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9hcGV4X3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfc2Vzc2lvbl9pZC5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBsb2c7CisgICAgbG9nIDw8ICJyZXN1bHQ6IiA8PCByZXN1bHQgPDwgIiB7IgorICAgICAgICAgICAgPDwgIiBtZWRpYW1ldHJpY3NfYXVkaW90cmFja19yZXBvcnRlZDoiCisgICAgICAgICAgICA8PCBhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9UUkFDS19SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCiAKKyAgICAgICAgICAgIDw8ICIgc3RyZWFtX3R5cGU6IiA8PCBzdHJlYW1fdHlwZQorICAgICAgICAgICAgPDwgIiBjb250ZW50X3R5cGU6IiA8PCBjb250ZW50X3R5cGUKKyAgICAgICAgICAgIDw8ICIgdHJhY2tfdXNhZ2U6IiA8PCB0cmFja191c2FnZQorICAgICAgICAgICAgPDwgIiBzYW1wbGVfcmF0ZToiIDw8IHNhbXBsZV9yYXRlCisgICAgICAgICAgICA8PCAiIGNoYW5uZWxfbWFzazoiIDw8IGNoYW5uZWxfbWFzaworICAgICAgICAgICAgPDwgIiB1bmRlcnJ1bl9mcmFtZXM6IiA8PCB1bmRlcnJ1bl9mcmFtZXMKKyAgICAgICAgICAgIDw8ICIgc3RhcnR1cF9nbGl0Y2g6IiA8PCBzdGFydHVwX2dsaXRjaAorICAgICAgICAgICAgPDwgIiBwb3J0X2lkOiIgPDwgcG9ydF9pZAorICAgICAgICAgICAgPDwgIiBlbmNvZGluZzoiIDw8IGVuY29kaW5nCisgICAgICAgICAgICA8PCAiIGZyYW1lX2NvdW50OiIgPDwgZnJhbWVfY291bnQKKworICAgICAgICAgICAgPDwgIiBhdHRyaWJ1dGVzOiIgPDwgYXR0cmlidXRlcworCisgICAgICAgICAgICA8PCAiIGxvZ19zZXNzaW9uX2lkOiIgPDwgbG9nX3Nlc3Npb25faWQKKyAgICAgICAgICAgIDw8ICIgfSI7CisgICAgc3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVFJBQ0tfUkVQT1JURUQsIGxvZy5zdHIoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfY29kZWMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKaW5kZXggZDUwMmIzMC4uNDZjYmRjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9jb2RlYy5jcHAKQEAgLTMwLDE3OCArMzAsNDQ5IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgorI2luY2x1ZGUgPHN0YXRzX2V2ZW50Lmg+CiAKICNpbmNsdWRlICJjbGVhbmVyLmgiCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWJvb2wgc3RhdHNkX2NvZGVjKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkKK2Jvb2wgc3RhdHNkX2NvZGVjKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpCiB7CiAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogCi0gICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworICAgIEFTdGF0c0V2ZW50KiBldmVudCA9IEFTdGF0c0V2ZW50X29idGFpbigpOworICAgIEFTdGF0c0V2ZW50X3NldEF0b21JZChldmVudCwgYW5kcm9pZDo6dXRpbDo6TUVESUFfQ09ERUNfUkVQT1JURUQpOwogCisgICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXBfbmFub3MgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOworICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIHRpbWVzdGFtcF9uYW5vcyk7CisKKyAgICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIHBhY2thZ2VfbmFtZS5jX3N0cigpKTsKKworICAgIGludDY0X3QgcGFja2FnZV92ZXJzaW9uX2NvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIHBhY2thZ2VfdmVyc2lvbl9jb2RlKTsKKworICAgIGludDY0X3QgbWVkaWFfYXBleF92ZXJzaW9uID0gMDsKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBtZWRpYV9hcGV4X3ZlcnNpb24pOwogCiAgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCiAgICAgLy8KLSAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkNvZGVjRGF0YSBtZXRyaWNzX3Byb3RvOworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpDb2RlY0RhdGEgbWV0cmljc19wcm90bzsKIAogICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQogICAgIC8vCi0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjICAgc3RyaW5nCiAgICAgc3RkOjpzdHJpbmcgY29kZWM7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjIiwgJmNvZGVjKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jb2RlYyhzdGQ6Om1vdmUoY29kZWMpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29kZWMoY29kZWMpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWltZSAgICBzdHJpbmcKKyAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgY29kZWMuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyBtaW1lOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5taW1lIiwgJm1pbWUpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21pbWUoc3RkOjptb3ZlKG1pbWUpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbWltZShtaW1lKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUgICAgc3RyaW5nCisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIG1pbWUuY19zdHIoKSk7CisKICAgICBzdGQ6OnN0cmluZyBtb2RlOwotICAgIGlmICggaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubW9kZSIsICZtb2RlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tb2RlKHN0ZDo6bW92ZShtb2RlKSk7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUiLCAmbW9kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbW9kZShtb2RlKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVuY29kZXIgaW50MzIKKyAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgbW9kZS5jX3N0cigpKTsKKwogICAgIGludDMyX3QgZW5jb2RlciA9IC0xOwotICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZW5jb2RlciIsICZlbmNvZGVyKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lbmNvZGVyKGVuY29kZXIpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlICBpbnQzMgorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGVuY29kZXIpOworCiAgICAgaW50MzJfdCBzZWN1cmUgPSAtMTsKLSAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlIiwgJnNlY3VyZSkpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUiLCAmc2VjdXJlKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zZWN1cmUoc2VjdXJlKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLndpZHRoICAgaW50MzIKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBzZWN1cmUpOworCiAgICAgaW50MzJfdCB3aWR0aCA9IC0xOwotICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCIsICZ3aWR0aCkpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCIsICZ3aWR0aCkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfd2lkdGgod2lkdGgpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0ICBpbnQzMgorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHdpZHRoKTsKKwogICAgIGludDMyX3QgaGVpZ2h0ID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0IiwgJmhlaWdodCkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfaGVpZ2h0KGhlaWdodCk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yb3RhdGlvbi1kZWdyZWVzICAgICAgICBpbnQzMgorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGhlaWdodCk7CisKICAgICBpbnQzMl90IHJvdGF0aW9uID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb24pKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbikpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfcm90YXRpb24ocm90YXRpb24pOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY3J5cHRvICBpbnQzMiAoYWx0aG91Z2ggbWlzc2luZyBpZiBub3QgbmVlZGVkCisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcm90YXRpb24pOworCiAgICAgaW50MzJfdCBjcnlwdG8gPSAtMTsKLSAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY3J5cHRvIiwgJmNyeXB0bykpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iLCAmY3J5cHRvKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jcnlwdG8oY3J5cHRvKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByb2ZpbGUgaW50MzIKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBjcnlwdG8pOworCiAgICAgaW50MzJfdCBwcm9maWxlID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByb2ZpbGUiLCAmcHJvZmlsZSkpIHsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcm9maWxlIiwgJnByb2ZpbGUpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3Byb2ZpbGUocHJvZmlsZSk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sZXZlbCAgIGludDMyCisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcHJvZmlsZSk7CisKICAgICBpbnQzMl90IGxldmVsID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxldmVsIiwgJmxldmVsKSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxldmVsIiwgJmxldmVsKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sZXZlbChsZXZlbCk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXh3aWR0aCAgICAgICAgaW50MzIKLSAgICBpbnQzMl90IG1heHdpZHRoID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heHdpZHRoIiwgJm1heHdpZHRoKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tYXhfd2lkdGgobWF4d2lkdGgpOworICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGxldmVsKTsKKworCisgICAgaW50MzJfdCBtYXhfd2lkdGggPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWF4d2lkdGgiLCAmbWF4X3dpZHRoKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tYXhfd2lkdGgobWF4X3dpZHRoKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCAgICAgICBpbnQzMgotICAgIGludDMyX3QgbWF4aGVpZ2h0ID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCIsICZtYXhoZWlnaHQpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21heF9oZWlnaHQobWF4aGVpZ2h0KTsKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBtYXhfd2lkdGgpOworCisgICAgaW50MzJfdCBtYXhfaGVpZ2h0ID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCIsICZtYXhfaGVpZ2h0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tYXhfaGVpZ2h0KG1heF9oZWlnaHQpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZXJyY29kZSAgICAgICAgIGludDMyCi0gICAgaW50MzJfdCBlcnJjb2RlID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycmNvZGUiLCAmZXJyY29kZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJjb2RlKTsKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBtYXhfaGVpZ2h0KTsKKworICAgIGludDMyX3QgZXJyb3JfY29kZSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJjb2RlIiwgJmVycm9yX2NvZGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Vycm9yX2NvZGUoZXJyb3JfY29kZSk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSAgICAgICAgc3RyaW5nCi0gICAgc3RkOjpzdHJpbmcgZXJyc3RhdGU7Ci0gICAgaWYgKCBpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSIsICZlcnJzdGF0ZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3Jfc3RhdGUoc3RkOjptb3ZlKGVycnN0YXRlKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgZXJyb3JfY29kZSk7CisKKyAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdGF0ZTsKKyAgICBpZiAoIGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycnN0YXRlIiwgJmVycm9yX3N0YXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9zdGF0ZShlcnJvcl9zdGF0ZSk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1heCAgaW50NjQKKyAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgZXJyb3Jfc3RhdGUuY19zdHIoKSk7CisKICAgICBpbnQ2NF90IGxhdGVuY3lfbWF4ID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWF4IiwgJmxhdGVuY3lfbWF4KSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWF4IiwgJmxhdGVuY3lfbWF4KSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21heChsYXRlbmN5X21heCk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1pbiAgaW50NjQKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBsYXRlbmN5X21heCk7CisKICAgICBpbnQ2NF90IGxhdGVuY3lfbWluID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWluIiwgJmxhdGVuY3lfbWluKSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWluIiwgJmxhdGVuY3lfbWluKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21pbihsYXRlbmN5X21pbik7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LmF2ZyAgaW50NjQKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBsYXRlbmN5X21pbik7CisKICAgICBpbnQ2NF90IGxhdGVuY3lfYXZnID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuYXZnIiwgJmxhdGVuY3lfYXZnKSkgeworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuYXZnIiwgJmxhdGVuY3lfYXZnKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X2F2ZyhsYXRlbmN5X2F2Zyk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm4gICAgaW50NjQKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBsYXRlbmN5X2F2Zyk7CisKICAgICBpbnQ2NF90IGxhdGVuY3lfY291bnQgPSAtMTsKLSAgICBpZiAoIGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5uIiwgJmxhdGVuY3lfY291bnQpKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5uIiwgJmxhdGVuY3lfY291bnQpKSB7CiAgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xhdGVuY3lfY291bnQobGF0ZW5jeV9jb3VudCk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LnVua25vd24gICAgaW50NjQKKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBsYXRlbmN5X2NvdW50KTsKKwogICAgIGludDY0X3QgbGF0ZW5jeV91bmtub3duID0gLTE7Ci0gICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kudW5rbm93biIsICZsYXRlbmN5X3Vua25vd24pKSB7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS51bmtub3duIiwgJmxhdGVuY3lfdW5rbm93bikpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV91bmtub3duKGxhdGVuY3lfdW5rbm93bik7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyRXJyb3IgIGludDMyCi0gICAgaWYgKGludDMyX3QgcXVldWVTZWN1cmVJbnB1dEJ1ZmZlckVycm9yID0gLTE7Ci0gICAgICAgIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucXVldWVTZWN1cmVJbnB1dEJ1ZmZlckVycm9yIiwKLSAgICAgICAgICAgICAgICAmcXVldWVTZWN1cmVJbnB1dEJ1ZmZlckVycm9yKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9xdWV1ZV9zZWN1cmVfaW5wdXRfYnVmZmVyX2Vycm9yKHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXJFcnJvcik7Ci0gICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5xdWV1ZUlucHV0QnVmZmVyRXJyb3IgIGludDMyCi0gICAgaWYgKGludDMyX3QgcXVldWVJbnB1dEJ1ZmZlckVycm9yID0gLTE7Ci0gICAgICAgIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucXVldWVJbnB1dEJ1ZmZlckVycm9yIiwKLSAgICAgICAgICAgICAgICAmcXVldWVJbnB1dEJ1ZmZlckVycm9yKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9xdWV1ZV9pbnB1dF9idWZmZXJfZXJyb3IocXVldWVJbnB1dEJ1ZmZlckVycm9yKTsKLSAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuaGlzdCAgICBOT1QgRU1JVFRFRAorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIGxhdGVuY3lfdW5rbm93bik7CiAKLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuYml0cmF0ZV9tb2RlIHN0cmluZworICAgIGludDMyX3QgcXVldWVfc2VjdXJlX2lucHV0X2J1ZmZlcl9lcnJvciA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXJFcnJvciIsCisgICAgICAgICAgICAmcXVldWVfc2VjdXJlX2lucHV0X2J1ZmZlcl9lcnJvcikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcXVldWVfc2VjdXJlX2lucHV0X2J1ZmZlcl9lcnJvcihxdWV1ZV9zZWN1cmVfaW5wdXRfYnVmZmVyX2Vycm9yKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcXVldWVfc2VjdXJlX2lucHV0X2J1ZmZlcl9lcnJvcik7CisKKyAgICBpbnQzMl90IHF1ZXVlX2lucHV0X2J1ZmZlcl9lcnJvciA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnF1ZXVlSW5wdXRCdWZmZXJFcnJvciIsCisgICAgICAgICAgICAmcXVldWVfaW5wdXRfYnVmZmVyX2Vycm9yKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9xdWV1ZV9pbnB1dF9idWZmZXJfZXJyb3IocXVldWVfaW5wdXRfYnVmZmVyX2Vycm9yKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcXVldWVfaW5wdXRfYnVmZmVyX2Vycm9yKTsKKwogICAgIHN0ZDo6c3RyaW5nIGJpdHJhdGVfbW9kZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuYml0cmF0ZV9tb2RlIiwgJmJpdHJhdGVfbW9kZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfYml0cmF0ZV9tb2RlKHN0ZDo6bW92ZShiaXRyYXRlX21vZGUpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYml0cmF0ZV9tb2RlKGJpdHJhdGVfbW9kZSk7CiAgICAgfQotICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5iaXRyYXRlIGludDMyCisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIGJpdHJhdGVfbW9kZS5jX3N0cigpKTsKKwogICAgIGludDMyX3QgYml0cmF0ZSA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmJpdHJhdGUiLCAmYml0cmF0ZSkpIHsKICAgICAgICAgbWV0cmljc19wcm90by5zZXRfYml0cmF0ZShiaXRyYXRlKTsKICAgICB9Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxpZmV0aW1lTXMgaW50NjQKLSAgICBpbnQ2NF90IGxpZmV0aW1lTXMgPSAtMTsKLSAgICBpZiAoIGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGlmZXRpbWVNcyIsICZsaWZldGltZU1zKSkgewotICAgICAgICBsaWZldGltZU1zID0gbWVkaWFtZXRyaWNzOjpidWNrZXRfdGltZV9taW51dGVzKGxpZmV0aW1lTXMpOwotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9saWZldGltZV9taWxsaXMobGlmZXRpbWVNcyk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgYml0cmF0ZSk7CisKKyAgICBpbnQ2NF90IGxpZmV0aW1lX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxpZmV0aW1lTXMiLCAmbGlmZXRpbWVfbWlsbGlzKSkgeworICAgICAgICBsaWZldGltZV9taWxsaXMgPSBtZWRpYW1ldHJpY3M6OmJ1Y2tldF90aW1lX21pbnV0ZXMobGlmZXRpbWVfbWlsbGlzKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGlmZXRpbWVfbWlsbGlzKGxpZmV0aW1lX21pbGxpcyk7CiAgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIGxpZmV0aW1lX21pbGxpcyk7CisKKyAgICBpbnQ2NF90IHBsYXliYWNrX2R1cmF0aW9uX3NlYyA9IC0xOworICAgIGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucGxheWJhY2stZHVyYXRpb24tc2VjIiwgJnBsYXliYWNrX2R1cmF0aW9uX3NlYyk7CisgICAgLy8gRE8gTk9UIHJlY29yZCAgcGxheWJhY2stZHVyYXRpb24gaW4gdGhlIG1ldHJpY3NfcHJvdG8gLSBpdCBzaG91bGQgb25seQorICAgIC8vIGV4aXN0IGluIHRoZSBmbGF0dGVuZWQgYXRvbQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIHBsYXliYWNrX2R1cmF0aW9uX3NlYyk7CisKKyAgICBzdGQ6OnN0cmluZyBzZXNzaW9uSWQ7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxvZy1zZXNzaW9uLWlkIiwgJnNlc3Npb25JZCkpIHsKKyAgICAgICAgc2Vzc2lvbklkID0gbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQoc2Vzc2lvbklkKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbG9nX3Nlc3Npb25faWQoc2Vzc2lvbklkKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIGNvZGVjLmNfc3RyKCkpOworCisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jaGFubmVsQ291bnQiLCAmY2hhbm5lbENvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zYW1wbGVSYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZV9yYXRlKHNhbXBsZVJhdGUpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBzYW1wbGVSYXRlKTsKKworICAgIC8vIFRPRE8gUFdHIG1heSB3YW50IHRoZXNlIGZ1enplZCB1cCBhIGJpdCB0byBvYnNjdXJlIHNvbWUgcHJlY2lzaW9uCisgICAgaW50NjRfdCBieXRlcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZlbmNvZGUuYnl0ZXMiLCAmYnl0ZXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX2VuY29kZV9ieXRlcyhieXRlcyk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIGJ5dGVzKTsKKworICAgIGludDY0X3QgZnJhbWVzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmVuY29kZS5mcmFtZXMiLCAmZnJhbWVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19lbmNvZGVfZnJhbWVzKGZyYW1lcyk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50NjQoZXZlbnQsIGZyYW1lcyk7CisKKyAgICBpbnQ2NF90IGlucHV0Qnl0ZXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby5pbnB1dC5ieXRlcyIsICZpbnB1dEJ5dGVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19pbnB1dF9ieXRlcyhpbnB1dEJ5dGVzKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQ2NChldmVudCwgaW5wdXRCeXRlcyk7CisKKyAgICBpbnQ2NF90IGlucHV0RnJhbWVzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmlkZW8uaW5wdXQuZnJhbWVzIiwgJmlucHV0RnJhbWVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19pbnB1dF9mcmFtZXMoaW5wdXRGcmFtZXMpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBpbnB1dEZyYW1lcyk7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52ZW5jb2RlLmR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fZW5jb2RlX2R1cmF0aW9uX3VzKGR1cmF0aW9uVXMpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDY0KGV2ZW50LCBkdXJhdGlvblVzKTsKKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jb2xvci1mb3JtYXQiLCAmY29sb3JGb3JtYXQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvbG9yX2Zvcm1hdChjb2xvckZvcm1hdCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIGNvbG9yRm9ybWF0KTsKKworICAgIGRvdWJsZSBmcmFtZVJhdGUgPSAtMS4wOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5mcmFtZS1yYXRlIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVfcmF0ZShmcmFtZVJhdGUpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUZsb2F0KGV2ZW50LCAoZmxvYXQpIGZyYW1lUmF0ZSk7CisKKyAgICBkb3VibGUgY2FwdHVyZVJhdGUgPSAtMS4wOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jYXB0dXJlLXJhdGUiLCAmY2FwdHVyZVJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NhcHR1cmVfcmF0ZShjYXB0dXJlUmF0ZSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlRmxvYXQoZXZlbnQsIChmbG9hdCkgY2FwdHVyZVJhdGUpOworCisgICAgZG91YmxlIG9wZXJhdGluZ1JhdGUgPSAtMS4wOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcGVyYXRpbmctcmF0ZSIsICZvcGVyYXRpbmdSYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9vcGVyYXRpbmdfcmF0ZShvcGVyYXRpbmdSYXRlKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVGbG9hdChldmVudCwgKGZsb2F0KSBvcGVyYXRpbmdSYXRlKTsKKworICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcmlvcml0eSIsICZwcmlvcml0eSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJpb3JpdHkocHJpb3JpdHkpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBwcmlvcml0eSk7CisKKyAgICBpbnQzMl90IHFwSU1pbiA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZpZGVvLXFwLWktbWluIiwgJnFwSU1pbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fcXBfaV9taW4ocXBJTWluKTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcXBJTWluKTsKKworICAgIGludDMyX3QgcXBJTWF4ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmlkZW8tcXAtaS1tYXgiLCAmcXBJTWF4KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19xcF9pX21heChxcElNYXgpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBxcElNYXgpOworCisgICAgaW50MzJfdCBxcFBNaW4gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby1xcC1wLW1pbiIsICZxcFBNaW4pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX3FwX3BfbWluKHFwUE1pbik7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwUE1pbik7CisKKyAgICBpbnQzMl90IHFwUE1heCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnZpZGVvLXFwLXAtbWF4IiwgJnFwUE1heCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fcXBfcF9tYXgocXBQTWF4KTsKKyAgICB9CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQzMihldmVudCwgcXBQTWF4KTsKKworICAgIGludDMyX3QgcXBCTWluID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMudmlkZW8tcXAtYi1taW4iLCAmcXBCTWluKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19xcF9iX21pbihxcEJNaW4pOworICAgIH0KKyAgICBBU3RhdHNFdmVudF93cml0ZUludDMyKGV2ZW50LCBxcEJNaW4pOworCisgICAgaW50MzJfdCBxcEJNYXggPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy52aWRlby1xcC1iLW1heCIsICZxcEJNYXgpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX3FwX2JfbWF4KHFwQk1heCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwQk1heCk7CisKKyAgICBpbnQzMl90IG9yaWdpbmFsQml0cmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm9yaWdpbmFsLmJpdHJhdGUiLCAmb3JpZ2luYWxCaXRyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9vcmlnaW5hbF9iaXRyYXRlKG9yaWdpbmFsQml0cmF0ZSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIG9yaWdpbmFsQml0cmF0ZSk7CisKKyAgICBpbnQzMl90IHNoYXBpbmdFbmhhbmNlZCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zaGFwZWQiLCAmc2hhcGluZ0VuaGFuY2VkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zaGFwaW5nX2VuaGFuY2VkKHNoYXBpbmdFbmhhbmNlZCk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHNoYXBpbmdFbmhhbmNlZCk7CisKKyAgICBpbnQzMl90IHFwSU1pbk9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1pLW1pbiIsICZxcElNaW5PcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX2lfbWluKHFwSU1pbk9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwSU1pbk9yaSk7CisKKyAgICBpbnQzMl90IHFwSU1heE9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1pLW1heCIsICZxcElNYXhPcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX2lfbWF4KHFwSU1heE9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwSU1heE9yaSk7CisKKyAgICBpbnQzMl90IHFwUE1pbk9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1wLW1pbiIsICZxcFBNaW5PcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX3BfbWluKHFwUE1pbk9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwUE1pbk9yaSk7CisKKyAgICBpbnQzMl90IHFwUE1heE9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1wLW1heCIsICZxcFBNYXhPcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX3BfbWF4KHFwUE1heE9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwUE1heE9yaSk7CisKKyAgICBpbnQzMl90IHFwQk1pbk9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1iLW1pbiIsICZxcEJNaW5PcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX2JfbWluKHFwQk1pbk9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwQk1pbk9yaSk7CisKKyAgICBpbnQzMl90IHFwQk1heE9yaSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5vcmlnaW5hbC12aWRlby1xcC1iLW1heCIsICZxcEJNYXhPcmkpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X29yaWdpbmFsX3ZpZGVvX3FwX2JfbWF4KHFwQk1heE9yaSk7CisgICAgfQorICAgIEFTdGF0c0V2ZW50X3dyaXRlSW50MzIoZXZlbnQsIHFwQk1heE9yaSk7CisKKyAgICBpbnQgZXJyID0gQVN0YXRzRXZlbnRfd3JpdGUoZXZlbnQpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICBBTE9HRSgiRmFpbGVkIHRvIHdyaXRlIGNvZGVjIG1ldHJpY3MgdG8gc3RhdHNkICglZCkiLCBlcnIpOworICAgIH0KKyAgICBBU3RhdHNFdmVudF9yZWxlYXNlKGV2ZW50KTsKIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CiAgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBjb2RlYyBtZXRyaWNzIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0NPREVDX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9uYW5vcywgcGFja2FnZV9uYW1lLmNfc3RyKCksIHBhY2thZ2VfdmVyc2lvbl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKIAotICAgIGlmIChlbmFibGVkX3N0YXRzZCkgewotICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOwotICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQ09ERUNfUkVQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX2NvZGVjX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19DT0RFQ19SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCiAKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7Ci0gICAgfQorICAgICAgICAgICAgPDwgIiBjb2RlYzoiIDw8IGNvZGVjCisgICAgICAgICAgICA8PCAiIG1pbWU6IiA8PCBtaW1lCisgICAgICAgICAgICA8PCAiIG1vZGU6IiA8PCBtb2RlCisgICAgICAgICAgICA8PCAiIGVuY29kZXI6IiA8PCBlbmNvZGVyCisgICAgICAgICAgICA8PCAiIHNlY3VyZToiIDw8IHNlY3VyZQorICAgICAgICAgICAgPDwgIiB3aWR0aDoiIDw8IHdpZHRoCisgICAgICAgICAgICA8PCAiIGhlaWdodDoiIDw8IGhlaWdodAorICAgICAgICAgICAgPDwgIiByb3RhdGlvbjoiIDw8IHJvdGF0aW9uCisgICAgICAgICAgICA8PCAiIGNyeXB0bzoiIDw8IGNyeXB0bworICAgICAgICAgICAgPDwgIiBwcm9maWxlOiIgPDwgcHJvZmlsZQorCisgICAgICAgICAgICA8PCAiIGxldmVsOiIgPDwgbGV2ZWwKKyAgICAgICAgICAgIDw8ICIgbWF4X3dpZHRoOiIgPDwgbWF4X3dpZHRoCisgICAgICAgICAgICA8PCAiIG1heF9oZWlnaHQ6IiA8PCBtYXhfaGVpZ2h0CisgICAgICAgICAgICA8PCAiIGVycm9yX2NvZGU6IiA8PCBlcnJvcl9jb2RlCisgICAgICAgICAgICA8PCAiIGVycm9yX3N0YXRlOiIgPDwgZXJyb3Jfc3RhdGUKKyAgICAgICAgICAgIDw8ICIgbGF0ZW5jeV9tYXg6IiA8PCBsYXRlbmN5X21heAorICAgICAgICAgICAgPDwgIiBsYXRlbmN5X21pbjoiIDw8IGxhdGVuY3lfbWluCisgICAgICAgICAgICA8PCAiIGxhdGVuY3lfYXZnOiIgPDwgbGF0ZW5jeV9hdmcKKyAgICAgICAgICAgIDw8ICIgbGF0ZW5jeV9jb3VudDoiIDw8IGxhdGVuY3lfY291bnQKKyAgICAgICAgICAgIDw8ICIgbGF0ZW5jeV91bmtub3duOiIgPDwgbGF0ZW5jeV91bmtub3duCisKKyAgICAgICAgICAgIDw8ICIgcXVldWVfaW5wdXRfYnVmZmVyX2Vycm9yOiIgPDwgcXVldWVfaW5wdXRfYnVmZmVyX2Vycm9yCisgICAgICAgICAgICA8PCAiIHF1ZXVlX3NlY3VyZV9pbnB1dF9idWZmZXJfZXJyb3I6IiA8PCBxdWV1ZV9zZWN1cmVfaW5wdXRfYnVmZmVyX2Vycm9yCisgICAgICAgICAgICA8PCAiIGJpdHJhdGVfbW9kZToiIDw8IGJpdHJhdGVfbW9kZQorICAgICAgICAgICAgPDwgIiBiaXRyYXRlOiIgPDwgYml0cmF0ZQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9iaXRyYXRlOiIgPDwgb3JpZ2luYWxCaXRyYXRlCisgICAgICAgICAgICA8PCAiIGxpZmV0aW1lX21pbGxpczoiIDw8IGxpZmV0aW1lX21pbGxpcworICAgICAgICAgICAgPDwgIiBwbGF5YmFja19kdXJhdGlvbl9zZWNvbmRzOiIgPDwgcGxheWJhY2tfZHVyYXRpb25fc2VjCisgICAgICAgICAgICA8PCAiIGxvZ19zZXNzaW9uX2lkOiIgPDwgc2Vzc2lvbklkCisgICAgICAgICAgICA8PCAiIGNoYW5uZWxfY291bnQ6IiA8PCBjaGFubmVsQ291bnQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlX3JhdGU6IiA8PCBzYW1wbGVSYXRlCisgICAgICAgICAgICA8PCAiIGVuY29kZV9ieXRlczoiIDw8IGJ5dGVzCisgICAgICAgICAgICA8PCAiIGVuY29kZV9mcmFtZXM6IiA8PCBmcmFtZXMKKyAgICAgICAgICAgIDw8ICIgZW5jb2RlX2R1cmF0aW9uX3VzOiIgPDwgZHVyYXRpb25VcworICAgICAgICAgICAgPDwgIiBjb2xvcl9mb3JtYXQ6IiA8PCBjb2xvckZvcm1hdAorICAgICAgICAgICAgPDwgIiBmcmFtZV9yYXRlOiIgPDwgZnJhbWVSYXRlCisgICAgICAgICAgICA8PCAiIGNhcHR1cmVfcmF0ZToiIDw8IGNhcHR1cmVSYXRlCisgICAgICAgICAgICA8PCAiIG9wZXJhdGluZ19yYXRlOiIgPDwgb3BlcmF0aW5nUmF0ZQorICAgICAgICAgICAgPDwgIiBwcmlvcml0eToiIDw8IHByaW9yaXR5CisgICAgICAgICAgICA8PCAiIHNoYXBpbmdfZW5oYW5jZWQ6IiA8PCBzaGFwaW5nRW5oYW5jZWQKKworICAgICAgICAgICAgPDwgIiBxcF9pX21pbjoiIDw8IHFwSU1pbgorICAgICAgICAgICAgPDwgIiBxcF9pX21heDoiIDw8IHFwSU1heAorICAgICAgICAgICAgPDwgIiBxcF9wX21pbjoiIDw8IHFwUE1pbgorICAgICAgICAgICAgPDwgIiBxcF9wX21heDoiIDw8IHFwUE1heAorICAgICAgICAgICAgPDwgIiBxcF9iX21pbjoiIDw8IHFwQk1pbgorICAgICAgICAgICAgPDwgIiBxcF9iX21heDoiIDw8IHFwQk1heAorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9pX21pbjoiIDw8IHFwSU1pbk9yaQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9pX21heDoiIDw8IHFwSU1heE9yaQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9wX21pbjoiIDw8IHFwUE1pbk9yaQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9wX21heDoiIDw8IHFwUE1heE9yaQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9iX21pbjoiIDw8IHFwQk1pbk9yaQorICAgICAgICAgICAgPDwgIiBvcmlnaW5hbF9xcF9iX21heDoiIDw8IHFwQk1heE9yaQorICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQ09ERUNfUkVQT1JURUQsIGxvZy5zdHIoKSk7CisKIAogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9kcm0uY3BwCmluZGV4IGFjNTg5MjkuLjI4N2ZiOGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZHJtLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2RybS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX2RybSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTMxLDkwICszMiw3OSBAQAogI2luY2x1ZGUgPHB3ZC5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCiAjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCiAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBtZWRpYWRybQotYm9vbCBzdGF0c2RfbWVkaWFkcm0oY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKQorYm9vbCBzdGF0c2RfbWVkaWFkcm0oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykKIHsKICAgICBpZiAoaXRlbSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAKLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wX25hbm9zID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgY29uc3QgaW50NjRfdCBwYWNrYWdlX3ZlcnNpb25fY29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgY29uc3QgaW50NjRfdCBtZWRpYV9hcGV4X3ZlcnNpb24gPSAwOwogCiAgICAgc3RkOjpzdHJpbmcgdmVuZG9yOwogICAgICh2b2lkKSBpdGVtLT5nZXRTdHJpbmcoInZlbmRvciIsICZ2ZW5kb3IpOwogICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOwogICAgICh2b2lkKSBpdGVtLT5nZXRTdHJpbmcoImRlc2NyaXB0aW9uIiwgJmRlc2NyaXB0aW9uKTsKLSAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkX21ldHJpY3M7Ci0gICAgKHZvaWQpIGl0ZW0tPmdldFN0cmluZygic2VyaWFsaXplZF9tZXRyaWNzIiwgJnNlcmlhbGl6ZWRfbWV0cmljcyk7Ci0KLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKHNlcmlhbGl6ZWRfbWV0cmljcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9tZXRyaWNzLnNpemUoKSk7Ci0gICAgICAgIGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19NRURJQURSTV9SRVBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3IuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBtZWRpYWRybSBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc2VyaWFsaXplZF9tZXRyaWNzLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHdpZGV2aW5lQ0RNCi1ib29sIHN0YXRzZF93aWRldmluZUNETShjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKml0ZW0pCi17Ci0gICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwotCi0gICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXAgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOwotICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7Ci0gICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7Ci0gICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRfbWV0cmljczsKICAgICAodm9pZCkgaXRlbS0+Z2V0U3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCAmc2VyaWFsaXplZF9tZXRyaWNzKTsKLQotICAgIGlmIChlbmFibGVkX3N0YXRzZCkgewotICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoc2VyaWFsaXplZF9tZXRyaWNzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkX21ldHJpY3Muc2l6ZSgpKTsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0RSTV9XSURFVklORV9SRVBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHdpZGV2aW5lIHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzZXJpYWxpemVkX21ldHJpY3Muc2l6ZSgpKTsKKyAgICBpZiAoc2VyaWFsaXplZF9tZXRyaWNzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0QoInN0YXRzZF9tZWRpYWRybSBza2lwcGluZyBlbXB0eSBlbnRyeSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgLy8gVGhpcyBmaWVsZCBpcyBsZWZ0IGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgLy8gVGhpcyBmaWVsZCBpcyBub3QgdXNlZCBhbnltb3JlLgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICBrVW51c2VkRmllbGQoIiIpOworICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZChrVW51c2VkRmllbGQuY19zdHIoKSwga1VudXNlZEZpZWxkLnNpemUoKSk7CisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19NRURJQURSTV9SRVBPUlRFRCwKKyAgICAgICAgdGltZXN0YW1wX25hbm9zLCBwYWNrYWdlX25hbWUuY19zdHIoKSwgcGFja2FnZV92ZXJzaW9uX2NvZGUsCisgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgdmVuZG9yLmNfc3RyKCksCisgICAgICAgIGRlc2NyaXB0aW9uLmNfc3RyKCksCisgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX21lZGlhZHJtX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19NRURJQURSTV9SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCisKKyAgICAgICAgICAgIDw8ICIgdmVuZG9yOiIgPDwgdmVuZG9yCisgICAgICAgICAgICA8PCAiIGRlc2NyaXB0aW9uOiIgPDwgZGVzY3JpcHRpb24KKyAgICAgICAgICAgIC8vIG9taXR0aW5nIHNlcmlhbGl6ZWQKKyAgICAgICAgICAgIDw8ICIgfSI7CisgICAgc3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX01FRElBRFJNX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCiAvLyBkcm1tYW5hZ2VyCi1ib29sIHN0YXRzZF9kcm1tYW5hZ2VyKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkKK2Jvb2wgc3RhdHNkX2RybW1hbmFnZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykKIHsKICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpzdHJpbmdfbGl0ZXJhbHM7CiAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCFlbmFibGVkX3N0YXRzZCkgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IGRybW1hbmFnZXIgZGF0YSIpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wX25hbm9zID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgY29uc3QgaW50NjRfdCBwYWNrYWdlX3ZlcnNpb25fY29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgY29uc3QgaW50NjRfdCBtZWRpYV9hcGV4X3ZlcnNpb24gPSAwOwogCiAgICAgc3RkOjpzdHJpbmcgcGx1Z2luX2lkOwogICAgICh2b2lkKSBpdGVtLT5nZXRTdHJpbmcoInBsdWdpbl9pZCIsICZwbHVnaW5faWQpOwpAQCAtMTMyLDggKzEyMiw5IEBACiAgICAgICAgIGl0ZW0tPmdldEludDY0KCgibWV0aG9kInMgKyBzdGQ6OnRvX3N0cmluZyhpKSkuY19zdHIoKSwgJm1ldGhvZENvdW50c1tpXSk7CiAgICAgfQogCi0gICAgYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0RSTU1BTkFHRVJfUkVQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLCBtZWRpYUFwZXhWZXJzaW9uLAorICAgIGNvbnN0IGludCByZXN1bHQgPSBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfRFJNTUFOQUdFUl9SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBfbmFub3MsIHBhY2thZ2VfbmFtZS5jX3N0cigpLCBwYWNrYWdlX3ZlcnNpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9hcGV4X3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luX2lkLmNfc3RyKCksIGRlc2NyaXB0aW9uLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2lkLCBtaW1lX3R5cGVzLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQ291bnRzWzBdLCBtZXRob2RDb3VudHNbMV0sIG1ldGhvZENvdW50c1syXSwKQEAgLTE0Miw2ICsxMzMsMTAxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQ291bnRzWzldLCBtZXRob2RDb3VudHNbMTBdLCBtZXRob2RDb3VudHNbMTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZENvdW50c1sxMl0pOwogCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX2RybW1hbmFnZXJfcmVwb3J0ZWQ6IgorICAgICAgICAgICAgPDwgYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0RSTU1BTkFHRVJfUkVQT1JURUQKKyAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wX25hbm9zOiIgPDwgdGltZXN0YW1wX25hbm9zCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfbmFtZToiIDw8IHBhY2thZ2VfbmFtZQorICAgICAgICAgICAgPDwgIiBwYWNrYWdlX3ZlcnNpb25fY29kZToiIDw8IHBhY2thZ2VfdmVyc2lvbl9jb2RlCisgICAgICAgICAgICA8PCAiIG1lZGlhX2FwZXhfdmVyc2lvbjoiIDw8IG1lZGlhX2FwZXhfdmVyc2lvbgorCisgICAgICAgICAgICA8PCAiIHBsdWdpbl9pZDoiIDw8IHBsdWdpbl9pZAorICAgICAgICAgICAgPDwgIiBkZXNjcmlwdGlvbjoiIDw8IGRlc2NyaXB0aW9uCisgICAgICAgICAgICA8PCAiIG1ldGhvZF9pZDoiIDw8IG1ldGhvZF9pZAorICAgICAgICAgICAgPDwgIiBtaW1lX3R5cGVzOiIgPDwgbWltZV90eXBlczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWV0aG9kQ291bnRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGxvZyA8PCAiIG1ldGhvZF8iIDw8IGkgPDwgIjoiIDw8IG1ldGhvZENvdW50c1tpXTsKKyAgICB9CisgICAgbG9nIDw8ICIgfSI7CisgICAgc3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0RSTU1BTkFHRVJfUkVQT1JURUQsIGxvZy5zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSB7CitzdGQ6OnZlY3Rvcjx1aW50OF90PiBiYXNlNjREZWNvZGVOb1BhZChzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0ci5sZW5ndGgoKSAlIDQpIHsKKyAgICBjYXNlIDM6IHN0ciArPSAiPSI7IGJyZWFrOworICAgIGNhc2UgMjogc3RyICs9ICI9PSI7IGJyZWFrOworICAgIGNhc2UgMTogc3RyICs9ICI9PT0iOyBicmVhazsKKyAgICBjYXNlIDA6IC8qIHVuY2hhbmdlZCAqLyBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoc3RyLmxlbmd0aCgpIC8gNCAqIDMsIDApOworICAgIHNpemVfdCBzaXplID0gYnVmLnNpemUoKTsKKyAgICBpZiAoZGVjb2RlQmFzZTY0KGJ1Zi5kYXRhKCksICZzaXplLCBzdHIuY19zdHIoKSkgJiYgc2l6ZSA8PSBidWYuc2l6ZSgpKSB7CisgICAgICAgIGJ1Zi5lcmFzZShidWYuYmVnaW4oKSArIHNpemUsIGJ1Zi5lbmQoKSk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIHJldHVybiB7fTsKK30KK30gLy8gbmFtZXNwYWNlCisKKy8vIHxvdXR8IGFuZCBpdHMgY29udGVudHMgYXJlIG1lbW9yeS1tYW5hZ2VkIGJ5IHN0YXRzZC4KK2Jvb2wgc3RhdHNkX21lZGlhZHJtX3B1bGxlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sIEFTdGF0c0V2ZW50TGlzdCogb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpCit7CisgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZF9tZXRyaWNzOworICAgICh2b2lkKSBpdGVtLT5nZXRTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsICZzZXJpYWxpemVkX21ldHJpY3MpOworICAgIGNvbnN0IGF1dG8gZnJhbWV3b3JrX3JhdyhiYXNlNjREZWNvZGVOb1BhZChzZXJpYWxpemVkX21ldHJpY3MpKTsKKworICAgIHN0ZDo6c3RyaW5nIHBsdWdpbl9tZXRyaWNzOworICAgICh2b2lkKSBpdGVtLT5nZXRTdHJpbmcoInBsdWdpbl9tZXRyaWNzIiwgJnBsdWdpbl9tZXRyaWNzKTsKKyAgICBjb25zdCBhdXRvIHBsdWdpbl9yYXcoYmFzZTY0RGVjb2RlTm9QYWQocGx1Z2luX21ldHJpY3MpKTsKKworICAgIGlmIChzZXJpYWxpemVkX21ldHJpY3Muc2l6ZSgpID09IDAgJiYgcGx1Z2luX21ldHJpY3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0QoInN0YXRzZF9tZWRpYWRybV9wdWxsZXIgc2tpcHBpbmcgZW1wdHkgZW50cnkiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHZlbmRvcjsKKyAgICAodm9pZCkgaXRlbS0+Z2V0U3RyaW5nKCJ2ZW5kb3IiLCAmdmVuZG9yKTsKKyAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAodm9pZCkgaXRlbS0+Z2V0U3RyaW5nKCJkZXNjcmlwdGlvbiIsICZkZXNjcmlwdGlvbik7CisKKyAgICAvLyBNZW1vcnkgZm9yIHxldmVudHwgaXMgaW50ZXJuYWxseSBtYW5hZ2VkIGJ5IHN0YXRzZC4KKyAgICBBU3RhdHNFdmVudCogZXZlbnQgPSBBU3RhdHNFdmVudExpc3RfYWRkU3RhdHNFdmVudChvdXQpOworICAgIEFTdGF0c0V2ZW50X3NldEF0b21JZChldmVudCwgYW5kcm9pZDo6dXRpbDo6TUVESUFfRFJNX0FDVElWSVRZX0lORk8pOworICAgIEFTdGF0c0V2ZW50X3dyaXRlU3RyaW5nKGV2ZW50LCBpdGVtLT5nZXRQa2dOYW1lKCkuY19zdHIoKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVJbnQ2NChldmVudCwgaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVTdHJpbmcoZXZlbnQsIHZlbmRvci5jX3N0cigpKTsKKyAgICBBU3RhdHNFdmVudF93cml0ZVN0cmluZyhldmVudCwgZGVzY3JpcHRpb24uY19zdHIoKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVCeXRlQXJyYXkoZXZlbnQsIGZyYW1ld29ya19yYXcuZGF0YSgpLCBmcmFtZXdvcmtfcmF3LnNpemUoKSk7CisgICAgQVN0YXRzRXZlbnRfd3JpdGVCeXRlQXJyYXkoZXZlbnQsIHBsdWdpbl9yYXcuZGF0YSgpLCBwbHVnaW5fcmF3LnNpemUoKSk7CisgICAgQVN0YXRzRXZlbnRfYnVpbGQoZXZlbnQpOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicHVsbGVkOiIgPDwgIiB7IgorICAgICAgICAgICAgPDwgIiBtZWRpYV9kcm1fYWN0aXZpdHlfaW5mbzoiCisgICAgICAgICAgICA8PCBhbmRyb2lkOjp1dGlsOjpNRURJQV9EUk1fQUNUSVZJVFlfSU5GTworICAgICAgICAgICAgPDwgIiBwYWNrYWdlX25hbWU6IiA8PCBpdGVtLT5nZXRQa2dOYW1lKCkKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV92ZXJzaW9uX2NvZGU6IiA8PCBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpCisgICAgICAgICAgICA8PCAiIHZlbmRvcjoiIDw8IHZlbmRvcgorICAgICAgICAgICAgPDwgIiBkZXNjcmlwdGlvbjoiIDw8IGRlc2NyaXB0aW9uCisgICAgICAgICAgICA8PCAiIGZyYW1ld29ya19tZXRyaWNzOiIgPDwgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6Ynl0ZXNUb1N0cmluZyhmcmFtZXdvcmtfcmF3LCA4KQorICAgICAgICAgICAgPDwgIiB2ZW5kb3JfbWV0cmljczoiIDw8ICBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpieXRlc1RvU3RyaW5nKHBsdWdpbl9yYXcsIDgpCisgICAgICAgICAgICA8PCAiIH0iOworICAgIHN0YXRzZExvZy0+bG9nKGFuZHJvaWQ6OnV0aWw6Ok1FRElBX0RSTV9BQ1RJVklUWV9JTkZPLCBsb2cuc3RyKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAgYi9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAKaW5kZXggMTY4MTRkOS4uYmNmMmUwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcApAQCAtMzIsNDMgKzMyLDYyIEBACiAjaW5jbHVkZSA8c3RhdHNsb2cuaD4KIAogI2luY2x1ZGUgIk1lZGlhTWV0cmljc1NlcnZpY2UuaCIKLSNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvZW51bXMvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1ib29sIHN0YXRzZF9leHRyYWN0b3IoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKQorYm9vbCBzdGF0c2RfZXh0cmFjdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpCiB7CiAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOwotCisgICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXBfbmFub3MgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBjb25zdCBpbnQ2NF90IHBhY2thZ2VfdmVyc2lvbl9jb2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBjb25zdCBpbnQ2NF90IG1lZGlhX2FwZXhfdmVyc2lvbiA9IDA7CiAKICAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KICAgICAvLwotICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6RXh0cmFjdG9yRGF0YSBtZXRyaWNzX3Byb3RvOworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpFeHRyYWN0b3JEYXRhIG1ldHJpY3NfcHJvdG87CiAKLSAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKLSAgICAvLwotCi0gICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5mbXQgICAgICAgICBzdHJpbmcKLSAgICBzdGQ6OnN0cmluZyBmbXQ7Ci0gICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5mbXQiLCAmZm10KSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mb3JtYXQoc3RkOjptb3ZlKGZtdCkpOworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCIsICZmb3JtYXQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Zvcm1hdChmb3JtYXQpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm1pbWUgICAgICAgIHN0cmluZworCiAgICAgc3RkOjpzdHJpbmcgbWltZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm1pbWUiLCAmbWltZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfbWltZShzdGQ6Om1vdmUobWltZSkpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9taW1lKG1pbWUpOwogICAgIH0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsgICAgICAgIGludDMyCi0gICAgaW50MzJfdCBudHJrID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsiLCAmbnRyaykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfdHJhY2tzKG50cmspOworCisgICAgaW50MzJfdCB0cmFja3MgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayIsICZ0cmFja3MpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RyYWNrcyh0cmFja3MpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVudHJ5X3BvaW50X3N0cmluZzsKKyAgICBzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OkV4dHJhY3RvckRhdGE6OkVudHJ5UG9pbnQgZW50cnlfcG9pbnQgPQorICAgICAgICAgICAgc3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpFeHRyYWN0b3JEYXRhX0VudHJ5UG9pbnRfT1RIRVI7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5lbnRyeSIsICZlbnRyeV9wb2ludF9zdHJpbmcpKSB7CisgICAgICBpZiAoZW50cnlfcG9pbnRfc3RyaW5nID09ICJzZGsiKSB7CisgICAgICAgIGVudHJ5X3BvaW50ID0gc3RhdHM6Om1lZGlhbWV0cmljc19tZXNzYWdlOjpFeHRyYWN0b3JEYXRhX0VudHJ5UG9pbnRfU0RLOworICAgICAgfSBlbHNlIGlmIChlbnRyeV9wb2ludF9zdHJpbmcgPT0gIm5kay13aXRoLWp2bSIpIHsKKyAgICAgICAgZW50cnlfcG9pbnQgPSBzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OkV4dHJhY3RvckRhdGFfRW50cnlQb2ludF9OREtfV0lUSF9KVk07CisgICAgICB9IGVsc2UgaWYgKGVudHJ5X3BvaW50X3N0cmluZyA9PSAibmRrLW5vLWp2bSIpIHsKKyAgICAgICAgZW50cnlfcG9pbnQgPSBzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OkV4dHJhY3RvckRhdGFfRW50cnlQb2ludF9OREtfTk9fSlZNOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW50cnlfcG9pbnQgPSBzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OkV4dHJhY3RvckRhdGFfRW50cnlQb2ludF9PVEhFUjsKKyAgICAgIH0KKyAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VudHJ5X3BvaW50KGVudHJ5X3BvaW50KTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBsb2dfc2Vzc2lvbl9pZDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmxvZ1Nlc3Npb25JZCIsICZsb2dfc2Vzc2lvbl9pZCkpIHsKKyAgICAgICAgbG9nX3Nlc3Npb25faWQgPSBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZChsb2dfc2Vzc2lvbl9pZCk7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xvZ19zZXNzaW9uX2lkKGxvZ19zZXNzaW9uX2lkKTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOwpAQCAtNzcsMTcgKzk2LDI3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0VYVFJBQ1RPUl9SRVBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKKyAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgIGludCByZXN1bHQgPSBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfRVhUUkFDVE9SX1JFUE9SVEVELAorICAgICAgICB0aW1lc3RhbXBfbmFub3MsIHBhY2thZ2VfbmFtZS5jX3N0cigpLCBwYWNrYWdlX3ZlcnNpb25fY29kZSwKKyAgICAgICAgbWVkaWFfYXBleF92ZXJzaW9uLAorICAgICAgICBiZl9zZXJpYWxpemVkKTsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBsb2c7CisgICAgbG9nIDw8ICJyZXN1bHQ6IiA8PCByZXN1bHQgPDwgIiB7IgorICAgICAgICAgICAgPDwgIiBtZWRpYW1ldHJpY3NfZXh0cmFjdG9yX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19FWFRSQUNUT1JfUkVQT1JURUQKKyAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wX25hbm9zOiIgPDwgdGltZXN0YW1wX25hbm9zCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfbmFtZToiIDw8IHBhY2thZ2VfbmFtZQorICAgICAgICAgICAgPDwgIiBwYWNrYWdlX3ZlcnNpb25fY29kZToiIDw8IHBhY2thZ2VfdmVyc2lvbl9jb2RlCisgICAgICAgICAgICA8PCAiIG1lZGlhX2FwZXhfdmVyc2lvbjoiIDw8IG1lZGlhX2FwZXhfdmVyc2lvbgogCi0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOwotICAgIH0KLQorICAgICAgICAgICAgPDwgIiBmb3JtYXQ6IiA8PCBmb3JtYXQKKyAgICAgICAgICAgIDw8ICIgbWltZToiIDw8IG1pbWUKKyAgICAgICAgICAgIDw8ICIgdHJhY2tzOiIgPDwgdHJhY2tzCisgICAgICAgICAgICA8PCAiIGVudHJ5X3BvaW50OiIgPDwgZW50cnlfcG9pbnRfc3RyaW5nIDw8ICIoIiA8PCBlbnRyeV9wb2ludCA8PCAiKSIKKyAgICAgICAgICAgIDw8ICIgbG9nX3Nlc3Npb25faWQ6IiA8PCBsb2dfc2Vzc2lvbl9pZAorICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfRVhUUkFDVE9SX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX21lZGlhcGFyc2VyLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCmluZGV4IDI2MmIyYWUuLjkyMWIzMjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbWVkaWFwYXJzZXIuY3BwCkBAIC0zMSwyMSArMzEsMjAgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgorI2luY2x1ZGUgIlN0cmluZ1V0aWxzLmgiCiAjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL2VudW1zL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1ib29sIHN0YXRzZF9tZWRpYXBhcnNlcihjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0gKml0ZW0pCitib29sIHN0YXRzZF9tZWRpYXBhcnNlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtPiYgaXRlbSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPiYgc3RhdHNkTG9nKQogewotICAgIGlmIChpdGVtID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBpZiAoaXRlbSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAKLSAgICAvLyBzdGF0c2Qgd3JhcHBlciBkYXRhLgotICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKLSAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOwotICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wX25hbm9zID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgY29uc3QgaW50NjRfdCBwYWNrYWdlX3ZlcnNpb25fY29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CiAKICAgICBzdGQ6OnN0cmluZyBwYXJzZXJOYW1lOwogICAgIGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBhcnNlci5wYXJzZXJOYW1lIiwgJnBhcnNlck5hbWUpOwpAQCAtODAsMjYgKzc5LDQ4IEBACiAgICAgaW50MzJfdCB2aWRlb0hlaWdodCA9IC0xOwogICAgIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGFyc2VyLnZpZGVvSGVpZ2h0IiwgJnZpZGVvSGVpZ2h0KTsKIAotICAgIGlmIChlbmFibGVkX3N0YXRzZCkgewotICAgICAgICAodm9pZCkgYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX01FRElBUEFSU0VSX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ05hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnVmVyc2lvbkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlck5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEJ5TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyUG9vbC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXhjZXB0aW9uLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQnl0ZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tNaW1lVHlwZXMuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tDb2RlY3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJlZFBhcmFtZXRlcnMuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9IZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZyBNZWRpYVBhcnNlciBtZWRpYSBtZXRyaWNzLiIpOwotICAgIH0KKyAgICBzdGQ6OnN0cmluZyBsb2dTZXNzaW9uSWQ7CisgICAgaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGFyc2VyLmxvZ1Nlc3Npb25JZCIsICZsb2dTZXNzaW9uSWQpOworICAgIGxvZ1Nlc3Npb25JZCA9IG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKGxvZ1Nlc3Npb25JZCk7CiAKKyAgICBpbnQgcmVzdWx0ID0gYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX01FRElBUEFSU0VSX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcF9uYW5vcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX3ZlcnNpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJOYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZEJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJQb29sLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEV4Y2VwdGlvbi5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQnl0ZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrTWltZVR5cGVzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tDb2RlY3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcmVkUGFyYW1ldGVycy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nU2Vzc2lvbklkLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX21lZGlhcGFyc2VyX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19NRURJQVBBUlNFUl9SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgcGFyc2VyX25hbWU6IiA8PCBwYXJzZXJOYW1lCisgICAgICAgICAgICA8PCAiIGNyZWF0ZWRfYnlfbmFtZToiIDw8IGNyZWF0ZWRCeU5hbWUKKyAgICAgICAgICAgIDw8ICIgcGFyc2VyX3Bvb2w6IiA8PCBwYXJzZXJQb29sCisgICAgICAgICAgICA8PCAiIGxhc3RfZXhjZXB0aW9uOiIgPDwgbGFzdEV4Y2VwdGlvbgorICAgICAgICAgICAgPDwgIiByZXNvdXJjZV9ieXRlX2NvdW50OiIgPDwgcmVzb3VyY2VCeXRlQ291bnQKKyAgICAgICAgICAgIDw8ICIgZHVyYXRpb25fbWlsbGlzOiIgPDwgZHVyYXRpb25NaWxsaXMKKyAgICAgICAgICAgIDw8ICIgdHJhY2tfbWltZV90eXBlczoiIDw8IHRyYWNrTWltZVR5cGVzCisgICAgICAgICAgICA8PCAiIHRyYWNrX2NvZGVjczoiIDw8IHRyYWNrQ29kZWNzCisgICAgICAgICAgICA8PCAiIGFsdGVyZWRfcGFyYW1ldGVyczoiIDw8IGFsdGVyZWRQYXJhbWV0ZXJzCisgICAgICAgICAgICA8PCAiIHZpZGVvX3dpZHRoOiIgPDwgdmlkZW9XaWR0aAorICAgICAgICAgICAgPDwgIiB2aWRlb19oZWlnaHQ6IiA8PCB2aWRlb0hlaWdodAorICAgICAgICAgICAgPDwgIiBsb2dfc2Vzc2lvbl9pZDoiIDw8IGxvZ1Nlc3Npb25JZAorICAgICAgICAgICAgPDwgIiB9IjsKKyAgICBzdGF0c2RMb2ctPmxvZyhhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfTUVESUFQQVJTRVJfUkVQT1JURUQsIGxvZy5zdHIoKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfbnVwbGF5ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKaW5kZXggYThkMGY1NS4uYmRlZTFmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3N0YXRzZF9udXBsYXllci5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9wcm90b19sb2dnaW5nL3N0YXRzL21lc3NhZ2UvbWVkaWFtZXRyaWNzX21lc3NhZ2UucGIuaCIKICNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDEsMzQgKzQxLDM1IEBACiAgKiAgaGFuZGxlcyBudXBsYXllciBBTkQgbnVwbGF5ZXIyCiAgKiAgY2hlY2tzIGZvciB0aGUgdW5pb24gb2Ygd2hhdCB0aGUgdHdvIHBsYXllcnMgZ2VuZXJhdGUKICAqLwotYm9vbCBzdGF0c2RfbnVwbGF5ZXIoY29uc3QgbWVkaWFtZXRyaWNzOjpJdGVtICppdGVtKQorYm9vbCBzdGF0c2RfbnVwbGF5ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbT4mIGl0ZW0sCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4mIHN0YXRzZExvZykKIHsKICAgICBpZiAoaXRlbSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CiAKICAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgotICAgIGNvbnN0IG5zZWNzX3QgdGltZXN0YW1wID0gTWVkaWFNZXRyaWNzU2VydmljZTo6cm91bmRUaW1lKGl0ZW0tPmdldFRpbWVzdGFtcCgpKTsKLSAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOwotICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOwotICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7Ci0KKyAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcF9uYW5vcyA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGNvbnN0IGludDY0X3QgcGFja2FnZV92ZXJzaW9uX2NvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGNvbnN0IGludDY0X3QgbWVkaWFfYXBleF92ZXJzaW9uID0gMDsKIAogICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bwogICAgIC8vCi0gICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpOdVBsYXllckRhdGEgbWV0cmljc19wcm90bzsKKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3NfbWVzc2FnZTo6TnVQbGF5ZXJEYXRhIG1ldHJpY3NfcHJvdG87CiAKICAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKICAgICAvLwogCiAgICAgLy8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG51cGxheWVyIGFuZCBudXBsYXllcjIKLSAgICBtZXRyaWNzX3Byb3RvLnNldF93aGljaHBsYXllcihpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyB3aGljaFBsYXllciA9IGl0ZW0tPmdldEtleSgpOworICAgIG1ldHJpY3NfcHJvdG8uc2V0X3doaWNocGxheWVyKHdoaWNoUGxheWVyLmNfc3RyKCkpOwogCiAgICAgc3RkOjpzdHJpbmcgdmlkZW9fbWltZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiLCAmdmlkZW9fbWltZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fbWltZShzdGQ6Om1vdmUodmlkZW9fbWltZSkpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19taW1lKHZpZGVvX21pbWUpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyB2aWRlb19jb2RlYzsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLmNvZGVjIiwgJnZpZGVvX2NvZGVjKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19jb2RlYyhzdGQ6Om1vdmUodmlkZW9fY29kZWMpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fY29kZWModmlkZW9fY29kZWMpOwogICAgIH0KIAogICAgIGludDMyX3Qgd2lkdGggPSAtMTsKQEAgLTkyLDMyICs5MywzMiBAQAogICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5zdGFydHVwZHJvcHBlZCIsICZmcmFtZXNfZHJvcHBlZF9zdGFydHVwKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mcmFtZXNfZHJvcHBlZF9zdGFydHVwKGZyYW1lc19kcm9wcGVkX3N0YXJ0dXApOwogICAgIH0KLSAgICBkb3VibGUgZnBzID0gLTEuMDsKLSAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZwcyIsICZmcHMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lcmF0ZShmcHMpOworICAgIGRvdWJsZSBmcmFtZXJhdGUgPSAtMS4wOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnBzIiwgJmZyYW1lcmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVyYXRlKGZyYW1lcmF0ZSk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgYXVkaW9fbWltZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiLCAmYXVkaW9fbWltZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fbWltZShzdGQ6Om1vdmUoYXVkaW9fbWltZSkpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19taW1lKGF1ZGlvX21pbWUpOwogICAgIH0KICAgICBzdGQ6OnN0cmluZyBhdWRpb19jb2RlYzsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIiwgJmF1ZGlvX2NvZGVjKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19jb2RlYyhzdGQ6Om1vdmUoYXVkaW9fY29kZWMpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fY29kZWMoYXVkaW9fY29kZWMpOwogICAgIH0KIAotICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbl9tcykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uX21zKTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uX21pbGxpcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uX21pbGxpcyk7CiAgICAgfQotICAgIGludDY0X3QgcGxheWluZ19tcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZ19tcykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGxheWluZ19taWxsaXMocGxheWluZ19tcyk7CisgICAgaW50NjRfdCBwbGF5aW5nX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZ19taWxsaXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BsYXlpbmdfbWlsbGlzKHBsYXlpbmdfbWlsbGlzKTsKICAgICB9CiAKLSAgICBpbnQzMl90IGVyciA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnIiLCAmZXJyKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcihlcnIpOworICAgIGludDMyX3QgZXJyb3IgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIiwgJmVycm9yKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcihlcnJvcik7CiAgICAgfQogICAgIGludDMyX3QgZXJyb3JfY29kZSA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJjb2RlIiwgJmVycm9yX2NvZGUpKSB7CkBAIC0xMjUsNDUgKzEyNiw3NCBAQAogICAgIH0KICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdGF0ZTsKICAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycnN0YXRlIiwgJmVycm9yX3N0YXRlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9zdGF0ZShzdGQ6Om1vdmUoZXJyb3Jfc3RhdGUpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3Jfc3RhdGUoZXJyb3Jfc3RhdGUpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIGRhdGFfc291cmNlX3R5cGU7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kYXRhU291cmNlIiwgJmRhdGFfc291cmNlX3R5cGUpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2RhdGFfc291cmNlX3R5cGUoc3RkOjptb3ZlKGRhdGFfc291cmNlX3R5cGUpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZGF0YV9zb3VyY2VfdHlwZShkYXRhX3NvdXJjZV90eXBlKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IHJlYnVmZmVyaW5nTXMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJpbmdNcyIsICZyZWJ1ZmZlcmluZ01zKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZWJ1ZmZlcmluZ19taWxsaXMocmVidWZmZXJpbmdNcyk7CisgICAgaW50NjRfdCByZWJ1ZmZlcmluZ19taWxsaXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJpbmdNcyIsICZyZWJ1ZmZlcmluZ19taWxsaXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlYnVmZmVyaW5nX21pbGxpcyhyZWJ1ZmZlcmluZ19taWxsaXMpOwogICAgIH0KICAgICBpbnQzMl90IHJlYnVmZmVycyA9IC0xOwogICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiLCAmcmVidWZmZXJzKSkgewogICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZWJ1ZmZlcnMocmVidWZmZXJzKTsKICAgICB9Ci0gICAgaW50MzJfdCByZWJ1ZmZlckV4aXQgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJFeGl0IiwgJnJlYnVmZmVyRXhpdCkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVidWZmZXJfYXRfZXhpdChyZWJ1ZmZlckV4aXQpOworICAgIGludDMyX3QgcmVidWZmZXJfYXRfZXhpdCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiLCAmcmVidWZmZXJfYXRfZXhpdCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVidWZmZXJfYXRfZXhpdChyZWJ1ZmZlcl9hdF9leGl0KTsKICAgICB9CiAKLQogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CiAgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBudXBsYXllciBtZXRyaWNzIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX05VUExBWUVSX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19OVVBMQVlFUl9SRVBPUlRFRCwKKyAgICAgICAgdGltZXN0YW1wX25hbm9zLCBwYWNrYWdlX25hbWUuY19zdHIoKSwgcGFja2FnZV92ZXJzaW9uX2NvZGUsCisgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgYmZfc2VyaWFsaXplZCk7CiAKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7Ci0gICAgfQorICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGxvZzsKKyAgICBsb2cgPDwgInJlc3VsdDoiIDw8IHJlc3VsdCA8PCAiIHsiCisgICAgICAgICAgICA8PCAiIG1lZGlhbWV0cmljc19udXBsYXllcl9yZXBvcnRlZDoiCisgICAgICAgICAgICA8PCBhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfTlVQTEFZRVJfUkVQT1JURUQKKyAgICAgICAgICAgIDw8ICIgdGltZXN0YW1wX25hbm9zOiIgPDwgdGltZXN0YW1wX25hbm9zCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfbmFtZToiIDw8IHBhY2thZ2VfbmFtZQorICAgICAgICAgICAgPDwgIiBwYWNrYWdlX3ZlcnNpb25fY29kZToiIDw8IHBhY2thZ2VfdmVyc2lvbl9jb2RlCisgICAgICAgICAgICA8PCAiIG1lZGlhX2FwZXhfdmVyc2lvbjoiIDw8IG1lZGlhX2FwZXhfdmVyc2lvbgogCisgICAgICAgICAgICA8PCAiIHdoaWNoUGxheWVyOiIgPDwgd2hpY2hQbGF5ZXIKKyAgICAgICAgICAgIDw8ICIgdmlkZW9fbWltZToiIDw8IHZpZGVvX21pbWUKKyAgICAgICAgICAgIDw8ICIgdmlkZW9fY29kZWM6IiA8PCB2aWRlb19jb2RlYworICAgICAgICAgICAgPDwgIiB3aWR0aDoiIDw8IHdpZHRoCisgICAgICAgICAgICA8PCAiIGhlaWdodDoiIDw8IGhlaWdodAorICAgICAgICAgICAgPDwgIiBmcmFtZXM6IiA8PCBmcmFtZXMKKyAgICAgICAgICAgIDw8ICIgZnJhbWVzX2Ryb3BwZWQ6IiA8PCBmcmFtZXNfZHJvcHBlZAorICAgICAgICAgICAgPDwgIiBmcmFtZXJhdGU6IiA8PCBmcmFtZXJhdGUKKyAgICAgICAgICAgIDw8ICIgYXVkaW9fbWltZToiIDw8IGF1ZGlvX21pbWUKKyAgICAgICAgICAgIDw8ICIgYXVkaW9fY29kZWM6IiA8PCBtZWRpYV9hcGV4X3ZlcnNpb24KKworICAgICAgICAgICAgPDwgIiBkdXJhdGlvbl9taWxsaXM6IiA8PCBkdXJhdGlvbl9taWxsaXMKKyAgICAgICAgICAgIDw8ICIgcGxheWluZ19taWxsaXM6IiA8PCBwbGF5aW5nX21pbGxpcworICAgICAgICAgICAgPDwgIiBlcnJvcjoiIDw8IGVycm9yCisgICAgICAgICAgICA8PCAiIGVycm9yX2NvZGU6IiA8PCBlcnJvcl9jb2RlCisgICAgICAgICAgICA8PCAiIGVycm9yX3N0YXRlOiIgPDwgZXJyb3Jfc3RhdGUKKyAgICAgICAgICAgIDw8ICIgZGF0YV9zb3VyY2VfdHlwZToiIDw8IGRhdGFfc291cmNlX3R5cGUKKyAgICAgICAgICAgIDw8ICIgcmVidWZmZXJpbmdfbWlsbGlzOiIgPDwgcmVidWZmZXJpbmdfbWlsbGlzCisgICAgICAgICAgICA8PCAiIHJlYnVmZmVyczoiIDw8IHJlYnVmZmVycworICAgICAgICAgICAgPDwgIiByZWJ1ZmZlcl9hdF9leGl0OiIgPDwgcmVidWZmZXJfYXRfZXhpdAorICAgICAgICAgICAgPDwgIiBmcmFtZXNfZHJvcHBlZF9zdGFydHVwOiIgPDwgZnJhbWVzX2Ryb3BwZWRfc3RhcnR1cAorCisgICAgICAgICAgICAvLyBUT0RPIE51UGxheWVyIC0gYWRkIGxvZ19zZXNzaW9uX2lkCisgICAgICAgICAgICAvLyA8PCAiIGxvZ19zZXNzaW9uX2lkOiIgPDwgbG9nX3Nlc3Npb25faWQKKyAgICAgICAgICAgIDw8ICIgfSI7CisgICAgc3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX05VUExBWUVSX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCmluZGV4IDJlNWFkYTQuLmIyOWFkNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy9zdGF0c2RfcmVjb3JkZXIuY3BwCkBAIC0zMiw0OCArMzIsNTUgQEAKICNpbmNsdWRlIDxzdGF0c2xvZy5oPgogCiAjaW5jbHVkZSAiTWVkaWFNZXRyaWNzU2VydmljZS5oIgotI2luY2x1ZGUgImZyYW1ld29ya3MvcHJvdG9fbG9nZ2luZy9zdGF0cy9lbnVtcy9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL3Byb3RvX2xvZ2dpbmcvc3RhdHMvbWVzc2FnZS9tZWRpYW1ldHJpY3NfbWVzc2FnZS5wYi5oIgogI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWJvb2wgc3RhdHNkX3JlY29yZGVyKGNvbnN0IG1lZGlhbWV0cmljczo6SXRlbSAqaXRlbSkKK2Jvb2wgc3RhdHNkX3JlY29yZGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBtZWRpYW1ldHJpY3M6Okl0ZW0+JiBpdGVtLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8bWVkaWFtZXRyaWNzOjpTdGF0c2RMb2c+JiBzdGF0c2RMb2cpCiB7CiAgICAgaWYgKGl0ZW0gPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOwogCiAgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKLSAgICBjb25zdCBuc2Vjc190IHRpbWVzdGFtcCA9IE1lZGlhTWV0cmljc1NlcnZpY2U6OnJvdW5kVGltZShpdGVtLT5nZXRUaW1lc3RhbXAoKSk7Ci0gICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKLSAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKLSAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOwotCisgICAgY29uc3QgbnNlY3NfdCB0aW1lc3RhbXBfbmFub3MgPSBNZWRpYU1ldHJpY3NTZXJ2aWNlOjpyb3VuZFRpbWUoaXRlbS0+Z2V0VGltZXN0YW1wKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBjb25zdCBpbnQ2NF90IHBhY2thZ2VfdmVyc2lvbl9jb2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBjb25zdCBpbnQ2NF90IG1lZGlhX2FwZXhfdmVyc2lvbiA9IDA7CiAKICAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KICAgICAvLwotICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6UmVjb3JkZXJEYXRhIG1ldHJpY3NfcHJvdG87CisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzX21lc3NhZ2U6OlJlY29yZGVyRGF0YSBtZXRyaWNzX3Byb3RvOwogCiAgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCiAgICAgLy8KIAorICAgIC8vIHN0cmluZyBrUmVjb3JkZXJMb2dTZXNzaW9uSWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmxvZy1zZXNzaW9uLWlkIjsKKyAgICBzdGQ6OnN0cmluZyBsb2dfc2Vzc2lvbl9pZDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubG9nLXNlc3Npb24taWQiLCAmbG9nX3Nlc3Npb25faWQpKSB7CisgICAgICAgIGxvZ19zZXNzaW9uX2lkID0gbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQobG9nX3Nlc3Npb25faWQpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sb2dfc2Vzc2lvbl9pZChsb2dfc2Vzc2lvbl9pZCk7CisgICAgfQogICAgIC8vIHN0cmluZyBrUmVjb3JkZXJBdWRpb01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLm1pbWUiOwogICAgIHN0ZDo6c3RyaW5nIGF1ZGlvX21pbWU7CiAgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLm1pbWUiLCAmYXVkaW9fbWltZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fbWltZShzdGQ6Om1vdmUoYXVkaW9fbWltZSkpOworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19taW1lKGF1ZGlvX21pbWUpOwogICAgIH0KICAgICAvLyBzdHJpbmcga1JlY29yZGVyVmlkZW9NaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby5taW1lIjsKICAgICBzdGQ6OnN0cmluZyB2aWRlb19taW1lOwogICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby5taW1lIiwgJnZpZGVvX21pbWUpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX21pbWUoc3RkOjptb3ZlKHZpZGVvX21pbWUpKTsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fbWltZSh2aWRlb19taW1lKTsKICAgICB9CiAgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9Qcm9maWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLXByb2ZpbGUiOwotICAgIGludDMyX3QgdmlkZW9Qcm9maWxlID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tZW5jb2Rlci1wcm9maWxlIiwgJnZpZGVvUHJvZmlsZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fcHJvZmlsZSh2aWRlb1Byb2ZpbGUpOworICAgIGludDMyX3QgdmlkZW9fcHJvZmlsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItcHJvZmlsZSIsICZ2aWRlb19wcm9maWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19wcm9maWxlKHZpZGVvX3Byb2ZpbGUpOwogICAgIH0KICAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIjsKLSAgICBpbnQzMl90IHZpZGVvTGV2ZWwgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIiwgJnZpZGVvTGV2ZWwpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX2xldmVsKHZpZGVvTGV2ZWwpOworICAgIGludDMyX3QgdmlkZW9fbGV2ZWwgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIiwgJnZpZGVvX2xldmVsKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19sZXZlbCh2aWRlb19sZXZlbCk7CiAgICAgfQogICAgIC8vIGludDMyIGtSZWNvcmRlcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci53aWR0aCI7CiAgICAgaW50MzJfdCB3aWR0aCA9IC0xOwpAQCAtOTcsNzMgKzEwNCw3MyBAQAogICAgIH0KIAogICAgIC8vIGludDMyIGtSZWNvcmRlckNhcHR1cmVGcHMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzIjsKLSAgICBpbnQzMl90IGNhcHR1cmVGcHMgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwcyIsICZjYXB0dXJlRnBzKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jYXB0dXJlX2ZwcyhjYXB0dXJlRnBzKTsKKyAgICBpbnQzMl90IGNhcHR1cmVfZnBzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuY2FwdHVyZS1mcHMiLCAmY2FwdHVyZV9mcHMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NhcHR1cmVfZnBzKGNhcHR1cmVfZnBzKTsKICAgICB9CiAgICAgLy8gZG91YmxlIGtSZWNvcmRlckNhcHR1cmVGcHNFbmFibGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzZW5hYmxlIjsKLSAgICBkb3VibGUgY2FwdHVyZUZwc0VuYWJsZSA9IC0xOwotICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwc2VuYWJsZSIsICZjYXB0dXJlRnBzRW5hYmxlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jYXB0dXJlX2Zwc19lbmFibGUoY2FwdHVyZUZwc0VuYWJsZSk7CisgICAgZG91YmxlIGNhcHR1cmVfZnBzX2VuYWJsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwc2VuYWJsZSIsICZjYXB0dXJlX2Zwc19lbmFibGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NhcHR1cmVfZnBzX2VuYWJsZShjYXB0dXJlX2Zwc19lbmFibGUpOwogICAgIH0KIAogICAgIC8vIGludDY0IGtSZWNvcmRlckR1cmF0aW9uTXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmR1cmF0aW9uTXMiOwotICAgIGludDY0X3QgZHVyYXRpb25NcyA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmR1cmF0aW9uTXMiLCAmZHVyYXRpb25NcykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uTXMpOworICAgIGludDY0X3QgZHVyYXRpb25fbWlsbGlzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbl9taWxsaXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbl9taWxsaXMpOwogICAgIH0KICAgICAvLyBpbnQ2NCBrUmVjb3JkZXJQYXVzZWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnBhdXNlZE1zIjsKLSAgICBpbnQ2NF90IHBhdXNlZE1zID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIucGF1c2VkTXMiLCAmcGF1c2VkTXMpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhdXNlZF9taWxsaXMocGF1c2VkTXMpOworICAgIGludDY0X3QgcGF1c2VkX21pbGxpcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnBhdXNlZE1zIiwgJnBhdXNlZF9taWxsaXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhdXNlZF9taWxsaXMocGF1c2VkX21pbGxpcyk7CiAgICAgfQogICAgIC8vIGludDMyIGtSZWNvcmRlck51bVBhdXNlcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuTlBhdXNlcyI7Ci0gICAgaW50MzJfdCBwYXVzZWRDb3VudCA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLk5QYXVzZXMiLCAmcGF1c2VkQ291bnQpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhdXNlZF9jb3VudChwYXVzZWRDb3VudCk7CisgICAgaW50MzJfdCBwYXVzZWRfY291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5OUGF1c2VzIiwgJnBhdXNlZF9jb3VudCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGF1c2VkX2NvdW50KHBhdXNlZF9jb3VudCk7CiAgICAgfQogCiAgICAgLy8gaW50MzIga1JlY29yZGVyQXVkaW9CaXRyYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1iaXRyYXRlIjsKLSAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWJpdHJhdGUiLCAmYXVkaW9CaXRyYXRlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19iaXRyYXRlKGF1ZGlvQml0cmF0ZSk7CisgICAgaW50MzJfdCBhdWRpb19iaXRyYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tYml0cmF0ZSIsICZhdWRpb19iaXRyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19iaXRyYXRlKGF1ZGlvX2JpdHJhdGUpOwogICAgIH0KICAgICAvLyBpbnQzMiBrUmVjb3JkZXJBdWRpb0NoYW5uZWxzID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1jaGFubmVscyI7Ci0gICAgaW50MzJfdCBhdWRpb0NoYW5uZWxzID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tY2hhbm5lbHMiLCAmYXVkaW9DaGFubmVscykpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fY2hhbm5lbHMoYXVkaW9DaGFubmVscyk7CisgICAgaW50MzJfdCBhdWRpb19jaGFubmVscyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWNoYW5uZWxzIiwgJmF1ZGlvX2NoYW5uZWxzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19jaGFubmVscyhhdWRpb19jaGFubmVscyk7CiAgICAgfQogICAgIC8vIGludDMyIGtSZWNvcmRlckF1ZGlvU2FtcGxlUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tc2FtcGxlcmF0ZSI7Ci0gICAgaW50MzJfdCBhdWRpb1NhbXBsZVJhdGUgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1zYW1wbGVyYXRlIiwgJmF1ZGlvU2FtcGxlUmF0ZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fc2FtcGxlcmF0ZShhdWRpb1NhbXBsZVJhdGUpOworICAgIGludDMyX3QgYXVkaW9fc2FtcGxlcmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXNhbXBsZXJhdGUiLCAmYXVkaW9fc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fc2FtcGxlcmF0ZShhdWRpb19zYW1wbGVyYXRlKTsKICAgICB9CiAKICAgICAvLyBpbnQzMiBrUmVjb3JkZXJNb3ZpZVRpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIjsKLSAgICBpbnQzMl90IG1vdmllVGltZXNjYWxlID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIiwgJm1vdmllVGltZXNjYWxlKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tb3ZpZV90aW1lc2NhbGUobW92aWVUaW1lc2NhbGUpOworICAgIGludDMyX3QgbW92aWVfdGltZXNjYWxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIiwgJm1vdmllX3RpbWVzY2FsZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbW92aWVfdGltZXNjYWxlKG1vdmllX3RpbWVzY2FsZSk7CiAgICAgfQogICAgIC8vIGludDMyIGtSZWNvcmRlckF1ZGlvVGltZXNjYWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby10aW1lc2NhbGUiOwotICAgIGludDMyX3QgYXVkaW9UaW1lc2NhbGUgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby10aW1lc2NhbGUiLCAmYXVkaW9UaW1lc2NhbGUpKSB7Ci0gICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX3RpbWVzY2FsZShhdWRpb1RpbWVzY2FsZSk7CisgICAgaW50MzJfdCBhdWRpb190aW1lc2NhbGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby10aW1lc2NhbGUiLCAmYXVkaW9fdGltZXNjYWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb190aW1lc2NhbGUoYXVkaW9fdGltZXNjYWxlKTsKICAgICB9CiAgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSI7Ci0gICAgaW50MzJfdCB2aWRlb1RpbWVzY2FsZSA9IC0xOwotICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSIsICZ2aWRlb1RpbWVzY2FsZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fdGltZXNjYWxlKHZpZGVvVGltZXNjYWxlKTsKKyAgICBpbnQzMl90IHZpZGVvX3RpbWVzY2FsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSIsICZ2aWRlb190aW1lc2NhbGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX3RpbWVzY2FsZSh2aWRlb190aW1lc2NhbGUpOwogICAgIH0KIAogICAgIC8vIGludDMyIGtSZWNvcmRlclZpZGVvQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tYml0cmF0ZSI7Ci0gICAgaW50MzJfdCB2aWRlb0JpdFJhdGUgPSAtMTsKLSAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1iaXRyYXRlIiwgJnZpZGVvQml0UmF0ZSkpIHsKLSAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fYml0cmF0ZSh2aWRlb0JpdFJhdGUpOworICAgIGludDMyX3QgdmlkZW9fYml0cmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWJpdHJhdGUiLCAmdmlkZW9fYml0cmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fYml0cmF0ZSh2aWRlb19iaXRyYXRlKTsKICAgICB9CiAgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9JZnJhbWVJbnRlcnZhbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIjsKLSAgICBpbnQzMl90IGlGcmFtZUludGVydmFsID0gLTE7Ci0gICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgewotICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pZnJhbWVfaW50ZXJ2YWwoaUZyYW1lSW50ZXJ2YWwpOworICAgIGludDMyX3QgaWZyYW1lX2ludGVydmFsID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIiwgJmlmcmFtZV9pbnRlcnZhbCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaWZyYW1lX2ludGVydmFsKGlmcmFtZV9pbnRlcnZhbCk7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKQEAgLTE3MiwxNyArMTc5LDQ2IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKLSAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKLSAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX1JFQ09SREVSX1JFUE9SVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgaW50IHJlc3VsdCA9IGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19SRUNPUkRFUl9SRVBPUlRFRCwKKyAgICAgICAgdGltZXN0YW1wX25hbm9zLCBwYWNrYWdlX25hbWUuY19zdHIoKSwgcGFja2FnZV92ZXJzaW9uX2NvZGUsCisgICAgICAgIG1lZGlhX2FwZXhfdmVyc2lvbiwKKyAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gbG9nOworICAgIGxvZyA8PCAicmVzdWx0OiIgPDwgcmVzdWx0IDw8ICIgeyIKKyAgICAgICAgICAgIDw8ICIgbWVkaWFtZXRyaWNzX3JlY29yZGVyX3JlcG9ydGVkOiIKKyAgICAgICAgICAgIDw8IGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19SRUNPUkRFUl9SRVBPUlRFRAorICAgICAgICAgICAgPDwgIiB0aW1lc3RhbXBfbmFub3M6IiA8PCB0aW1lc3RhbXBfbmFub3MKKyAgICAgICAgICAgIDw8ICIgcGFja2FnZV9uYW1lOiIgPDwgcGFja2FnZV9uYW1lCisgICAgICAgICAgICA8PCAiIHBhY2thZ2VfdmVyc2lvbl9jb2RlOiIgPDwgcGFja2FnZV92ZXJzaW9uX2NvZGUKKyAgICAgICAgICAgIDw8ICIgbWVkaWFfYXBleF92ZXJzaW9uOiIgPDwgbWVkaWFfYXBleF92ZXJzaW9uCiAKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7Ci0gICAgfQorICAgICAgICAgICAgPDwgIiBhdWRpb19taW1lOiIgPDwgYXVkaW9fbWltZQorICAgICAgICAgICAgPDwgIiB2aWRlb19taW1lOiIgPDwgdmlkZW9fbWltZQorICAgICAgICAgICAgPDwgIiB2aWRlb19wcm9maWxlOiIgPDwgdmlkZW9fcHJvZmlsZQorICAgICAgICAgICAgPDwgIiB2aWRlb19sZXZlbDoiIDw8IHZpZGVvX2xldmVsCisgICAgICAgICAgICA8PCAiIHdpZHRoOiIgPDwgd2lkdGgKKyAgICAgICAgICAgIDw8ICIgaGVpZ2h0OiIgPDwgaGVpZ2h0CisgICAgICAgICAgICA8PCAiIHJvdGF0aW9uOiIgPDwgcm90YXRpb24KKyAgICAgICAgICAgIDw8ICIgZnJhbWVyYXRlOiIgPDwgZnJhbWVyYXRlCisgICAgICAgICAgICA8PCAiIGNhcHR1cmVfZnBzOiIgPDwgY2FwdHVyZV9mcHMKKyAgICAgICAgICAgIDw8ICIgY2FwdHVyZV9mcHNfZW5hYmxlOiIgPDwgY2FwdHVyZV9mcHNfZW5hYmxlCiAKKyAgICAgICAgICAgIDw8ICIgZHVyYXRpb25fbWlsbGlzOiIgPDwgZHVyYXRpb25fbWlsbGlzCisgICAgICAgICAgICA8PCAiIHBhdXNlZF9taWxsaXM6IiA8PCBwYXVzZWRfbWlsbGlzCisgICAgICAgICAgICA8PCAiIHBhdXNlZF9jb3VudDoiIDw8IHBhdXNlZF9jb3VudAorICAgICAgICAgICAgPDwgIiBhdWRpb19iaXRyYXRlOiIgPDwgYXVkaW9fYml0cmF0ZQorICAgICAgICAgICAgPDwgIiBhdWRpb19jaGFubmVsczoiIDw8IGF1ZGlvX2NoYW5uZWxzCisgICAgICAgICAgICA8PCAiIGF1ZGlvX3NhbXBsZXJhdGU6IiA8PCBhdWRpb19zYW1wbGVyYXRlCisgICAgICAgICAgICA8PCAiIG1vdmllX3RpbWVzY2FsZToiIDw8IG1vdmllX3RpbWVzY2FsZQorICAgICAgICAgICAgPDwgIiBhdWRpb190aW1lc2NhbGU6IiA8PCBhdWRpb190aW1lc2NhbGUKKyAgICAgICAgICAgIDw8ICIgdmlkZW9fdGltZXNjYWxlOiIgPDwgdmlkZW9fdGltZXNjYWxlCisgICAgICAgICAgICA8PCAiIHZpZGVvX2JpdHJhdGU6IiA8PCB2aWRlb19iaXRyYXRlCisKKyAgICAgICAgICAgIDw8ICIgaWZyYW1lX2ludGVydmFsOiIgPDwgaWZyYW1lX2ludGVydmFsCisgICAgICAgICAgICA8PCAiIGxvZ19zZXNzaW9uX2lkOiIgPDwgbG9nX3Nlc3Npb25faWQKKyAgICAgICAgICAgIDw8ICIgfSI7CisgICAgc3RhdHNkTG9nLT5sb2coYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX1JFQ09SREVSX1JFUE9SVEVELCBsb2cuc3RyKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYW1ldHJpY3MvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGMyZTA3NTkuLjNiYWY3MzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDcgKzEsMjAgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKwogY2NfdGVzdCB7CiAgICAgbmFtZTogIm1lZGlhbWV0cmljc190ZXN0cyIsCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAKKyAgICAvLyBub3QgYWxsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHBvcHVsYXRlZCBpbiB0aGUgMm5kIGFyY2hpdGVjdHVyZSBpbgorICAgIC8vIHBhcnRpY3VsYXIsIGxpYm1lZGlhbWV0cmljc3NlcnZpY2Ugd2UgdXNlIHRvIGhhdmUgYSB0YW1lIGNvcHkgb2YgdGhlIHNlcnZpY2UKKyAgICBjb21waWxlX211bHRpbGliOiAiZmlyc3QiLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTE5LDYgKzMyLDcgQEAKICAgICAgICAgImxpYm1lZGlhbWV0cmljc3NlcnZpY2UiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJtZWRpYW1ldHJpY3NzZXJ2aWNlLWFpZGwtY3BwIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbWV0cmljcy90ZXN0cy9tZWRpYW1ldHJpY3NfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKaW5kZXggNDc4MzU1Yi4uMjMzNmQ2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFtZXRyaWNzL3Rlc3RzL21lZGlhbWV0cmljc190ZXN0cy5jcHAKQEAgLTgwOSw3ICs4MDksOSBAQAogICAoKml0ZW0zKS5zZXQoImZvdXIiLCAoaW50MzJfdCk0KQogICAgICAgICAgIC5zZXRUaW1lc3RhbXAoMTIpOwogCi0gIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3M7CisgIHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4gc3RhdHNkTG9nID0KKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPigxMCk7CisgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3N7c3RhdHNkTG9nfTsKIAogICAvLyB1bnRydXN0ZWQgZW50aXRpZXMgY2Fubm90IGNyZWF0ZSBhIG5ldyBrZXkuCiAgIEFTU0VSVF9FUShQRVJNSVNTSU9OX0RFTklFRCwgYXVkaW9BbmFseXRpY3Muc3VibWl0KGl0ZW0sIGZhbHNlIC8qIGlzVHJ1c3RlZCAqLykpOwpAQCAtODE3LDcgKzgxOSw3IEBACiAKICAgLy8gVE9ETzogVmVyaWZ5IGNvbnRlbnRzIG9mIEF1ZGlvQW5hbHl0aWNzLgogICAvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gZ2V0dGVyIEFQSSBpbiBBdWRpb0FuYWx5dGljcyBiZXNpZGVzIGR1bXAuCi0gIEFTU0VSVF9FUSgxMSwgYXVkaW9BbmFseXRpY3MuZHVtcCgxMDAwKS5zZWNvbmQgLyogbGluZXMgKi8pOworICBBU1NFUlRfRVEoMTAsIGF1ZGlvQW5hbHl0aWNzLmR1bXAoMTAwMCkuc2Vjb25kIC8qIGxpbmVzICovKTsKIAogICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvQW5hbHl0aWNzLnN1Ym1pdChpdGVtLCB0cnVlIC8qIGlzVHJ1c3RlZCAqLykpOwogICAvLyB1bnRydXN0ZWQgZW50aXRpZXMgY2FuIGFkZCB0byBhbiBleGlzdGluZyBrZXkKQEAgLTg0NSw3ICs4NDcsOSBAQAogICAoKml0ZW0zKS5zZXQoImZvdXIiLCAoaW50MzJfdCk0KQogICAgICAgICAgIC5zZXRUaW1lc3RhbXAoMTIpOwogCi0gIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3M7CisgIHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4gc3RhdHNkTG9nID0KKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPigxMCk7CisgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3N7c3RhdHNkTG9nfTsKIAogICAvLyB1bnRydXN0ZWQgZW50aXRpZXMgY2Fubm90IGNyZWF0ZSBhIG5ldyBrZXkuCiAgIEFTU0VSVF9FUShQRVJNSVNTSU9OX0RFTklFRCwgYXVkaW9BbmFseXRpY3Muc3VibWl0KGl0ZW0sIGZhbHNlIC8qIGlzVHJ1c3RlZCAqLykpOwpAQCAtODUzLDcgKzg1Nyw3IEBACiAKICAgLy8gVE9ETzogVmVyaWZ5IGNvbnRlbnRzIG9mIEF1ZGlvQW5hbHl0aWNzLgogICAvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gZ2V0dGVyIEFQSSBpbiBBdWRpb0FuYWx5dGljcyBiZXNpZGVzIGR1bXAuCi0gIEFTU0VSVF9FUSgxMSwgYXVkaW9BbmFseXRpY3MuZHVtcCgxMDAwKS5zZWNvbmQgLyogbGluZXMgKi8pOworICBBU1NFUlRfRVEoMTAsIGF1ZGlvQW5hbHl0aWNzLmR1bXAoMTAwMCkuc2Vjb25kIC8qIGxpbmVzICovKTsKIAogICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvQW5hbHl0aWNzLnN1Ym1pdChpdGVtLCB0cnVlIC8qIGlzVHJ1c3RlZCAqLykpOwogICAvLyB1bnRydXN0ZWQgZW50aXRpZXMgY2FuIGFkZCB0byBhbiBleGlzdGluZyBrZXkKQEAgLTg3Nyw3ICs4ODEsOSBAQAogICAoKml0ZW0zKS5zZXQoImZvdXIiLCAoaW50MzJfdCk0KQogICAgICAgICAgIC5zZXRUaW1lc3RhbXAoMTIpOwogCi0gIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3M7CisgIHN0ZDo6c2hhcmVkX3B0cjxtZWRpYW1ldHJpY3M6OlN0YXRzZExvZz4gc3RhdHNkTG9nID0KKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPG1lZGlhbWV0cmljczo6U3RhdHNkTG9nPigxMCk7CisgIGFuZHJvaWQ6Om1lZGlhbWV0cmljczo6QXVkaW9BbmFseXRpY3MgYXVkaW9BbmFseXRpY3N7c3RhdHNkTG9nfTsKIAogICBBU1NFUlRfRVEoTk9fRVJST1IsIGF1ZGlvQW5hbHl0aWNzLnN1Ym1pdChpdGVtLCB0cnVlIC8qIGlzVHJ1c3RlZCAqLykpOwogICAvLyB1bnRydXN0ZWQgZW50aXRpZXMgY2FuIGFkZCB0byBhbiBleGlzdGluZyBrZXkKQEAgLTEwODIsMyArMTA4OCw0MiBAQAogICAvL21lZGlhTWV0cmljcy0+ZHVtcChmaWxlbm8oc3Rkb3V0KSwge30gLyogYXJncyAqLyk7CiB9CiAjZW5kaWYKKworLy8gQmFzZTY0VXJsIGFuZCBpc0xvZ1Nlc3Npb25JZCBzdHJpbmcgdXRpbGl0aWVzIGNhbiBiZSB0ZXN0ZWQgYnkgc3RhdGljIGFzc2VydHMuCitzdGF0aWNfYXNzZXJ0KG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OmlzQmFzZTY0VXJsKCJhYmMiKSk7CitzdGF0aWNfYXNzZXJ0KG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OkludmVyc2VCYXNlNjRVcmxUYWJsZVsnQSddID09IDApOworc3RhdGljX2Fzc2VydChtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpJbnZlcnNlQmFzZTY0VXJsVGFibGVbJ2EnXSA9PSAyNik7CitzdGF0aWNfYXNzZXJ0KG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OkludmVyc2VCYXNlNjRVcmxUYWJsZVsnISddID09CisgICAgICAgIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OlRyYW5zcG9zZTo6SU5WQUxJRF9DSEFSKTsKK3N0YXRpY19hc3NlcnQobWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6SW52ZXJzZUJhc2U2NFVybFRhYmxlWydAJ10gPT0KKyAgICAgICAgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6VHJhbnNwb3NlOjpJTlZBTElEX0NIQVIpOworc3RhdGljX2Fzc2VydChtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpJbnZlcnNlQmFzZTY0VXJsVGFibGVbJyMnXSA9PQorICAgICAgICBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpUcmFuc3Bvc2U6OklOVkFMSURfQ0hBUik7CitzdGF0aWNfYXNzZXJ0KCFtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjppc0Jhc2U2NFVybCgiIUAjIikpOworCitzdGF0aWNfYXNzZXJ0KG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OmlzTG9nU2Vzc2lvbklkKCIwMTIzNDU2Nzg5YWJjZGVmIikpOworc3RhdGljX2Fzc2VydCghbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6aXNMb2dTZXNzaW9uSWQoImFiYyIpKTsKK3N0YXRpY19hc3NlcnQoIW1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OmlzTG9nU2Vzc2lvbklkKCIhQCMiKSk7CitzdGF0aWNfYXNzZXJ0KCFtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjppc0xvZ1Nlc3Npb25JZCgiMDEyMzQ1Njc4OWFiY2RlISIpKTsKKworVEVTVChtZWRpYW1ldHJpY3NfdGVzdHMsIHNhbml0aXplTG9nU2Vzc2lvbklkKSB7CisgICAvLyBpbnZhbGlkIGlkIHJldHVybnMgZW1wdHkgc3RyaW5nLgorICAgQVNTRVJUX0VRKCIiLCBtZWRpYW1ldHJpY3M6OnN0cmluZ3V0aWxzOjpzYW5pdGl6ZUxvZ1Nlc3Npb25JZCgiYWJjIikpOworCisgICAvLyB2YWxpZCBpZCBwYXNzZXMgdGhyb3VnaC4KKyAgIHN0ZDo6c3RyaW5nIHZhbGlkSWQgPSAiZmVkY2JhOTg3NjU0MzIxMCI7CisgICBBU1NFUlRfRVEodmFsaWRJZCwgbWVkaWFtZXRyaWNzOjpzdHJpbmd1dGlsczo6c2FuaXRpemVMb2dTZXNzaW9uSWQodmFsaWRJZCkpOworCisgICAvLyBvbmUgbW9yZSBjaGFyIG1ha2VzIHRoZSBpZCBpbnZhbGlkCisgICBBU1NFUlRfRVEoIiIsIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKHZhbGlkSWQgKyAiQSIpKTsKKworICAgc3RkOjpzdHJpbmcgdmFsaWRJZDIgPSAiWllYV1ZVVDEyMzQ1Njc4OSI7CisgICBBU1NFUlRfRVEodmFsaWRJZDIsIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKHZhbGlkSWQyKSk7CisKKyAgIC8vIG9uZSBmZXdlciBjaGFyIG1ha2VzIHRoZSBpZCBpbnZhbGlkCisgICBBU1NFUlRfRVEoIiIsIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKHZhbGlkSWQuY19zdHIoKSArIDEpKTsKKworICAgLy8gcmVwbGFjaW5nIG9uZSBjaGFyYWN0ZXIgd2l0aCBhbiBpbnZhbGlkIGNoYXJhY3RlciBtYWtlcyBhbiBpbnZhbGlkIGlkLgorICAgdmFsaWRJZDJbM10gPSAnISc7CisgICBBU1NFUlRfRVEoIiIsIG1lZGlhbWV0cmljczo6c3RyaW5ndXRpbHM6OnNhbml0aXplTG9nU2Vzc2lvbklkKHZhbGlkSWQyKSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAppbmRleCBhMzUxOWQ1Li5mMzEyMDJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKQEAgLTEsMTEgKzEsODMgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KIAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVzb3VyY2VtYW5hZ2VyX2FpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQYXJjZWwuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KIAotY2NfbGlicmFyeV9zaGFyZWQgeworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicmVzb3VyY2VvYnNlcnZlcl9haWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbCIsCisgICAgICAgICJhaWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUV2ZW50LmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwiLAorICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVBhcmNlbC5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UiLAorICAgIHVuc3RhYmxlOiB0cnVlLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiOnJlc291cmNlbWFuYWdlcl9haWRsIiwKKyAgICBdLAorfQorCithaWRsX2ludGVyZmFjZSB7CisgICAgbmFtZTogInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UiLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyOiAiYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiOnJlc291cmNlb2JzZXJ2ZXJfYWlkbCIsCisgICAgXSwKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBjcHA6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBuZGs6IHsKKyAgICAgICAgICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKKyAgICB2ZXJzaW9uczogWyIxIl0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIiwKKyAgICAgICAgIlJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJTZXJ2aWNlTG9nLmNwcCIsCisKKyAgICAgICAgLy8gVE9ETzogY29udmVydCB0byBBSURMPworICAgICAgICAiSU1lZGlhUmVzb3VyY2VNb25pdG9yLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xNyw2ICs4OSwxMCBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorCiAgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvaW5jbHVkZSJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0yNSw1ICsxMDEsNCBAQAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKLQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkN2ZlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0lNZWRpYVJlc291cmNlTW9uaXRvci5jcHAKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIklNZWRpYVJlc291cmNlTW9uaXRvci5oIgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJwTWVkaWFSZXNvdXJjZU1vbml0b3IgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUmVzb3VyY2VNb25pdG9yPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQnBNZWRpYVJlc291cmNlTW9uaXRvcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJTWVkaWFSZXNvdXJjZU1vbml0b3I+KGltcGwpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVzb3VyY2VHcmFudGVkKC8qaW4qLyBpbnQzMl90IHBpZCwgLyppbiovIGNvbnN0IGludDMyX3QgdHlwZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlc291cmNlTW9uaXRvcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih0eXBlKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE5PVElGWV9SRVNPVVJDRV9HUkFOVEVELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZXNvdXJjZU1vbml0b3IsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlc291cmNlTW9uaXRvciIpCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWRlZmF1bHQtYXJndW1lbnRzKQorc3RhdHVzX3QgQm5NZWRpYVJlc291cmNlTW9uaXRvcjo6b25UcmFuc2FjdCggdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAorICAgICAgICB1aW50MzJfdCBmbGFncykgeworICAgIHN3aXRjaChjb2RlKSB7CisgICAgICAgIGNhc2UgTk9USUZZX1JFU09VUkNFX0dSQU5URUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZXNvdXJjZU1vbml0b3IsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludDMyX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdHlwZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBub3RpZnlSZXNvdXJjZUdyYW50ZWQoLyppbiovIHBpZCwgLyppbiovIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9JTWVkaWFSZXNvdXJjZU1vbml0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTJkNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX19BTkRST0lEX1ZOREtfXworCisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIElNZWRpYVJlc291cmNlTW9uaXRvciA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lZGlhUmVzb3VyY2VNb25pdG9yKQorCisgICAgLy8gVmFsdWVzIHNob3VsZCBiZSBpbiBzeW5jIHdpdGggSW50ZW50LkVYVFJBX01FRElBX1JFU09VUkNFX1RZUEVfWFhYLgorICAgIGVudW0geworICAgICAgICBUWVBFX1ZJREVPX0NPREVDID0gMCwKKyAgICAgICAgVFlQRV9BVURJT19DT0RFQyA9IDEsCisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvdXJjZUdyYW50ZWQoLyppbiovIGludDMyX3QgcGlkLCAvKmluKi8gY29uc3QgaW50MzJfdCB0eXBlKSA9IDA7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9USUZZX1JFU09VUkNFX0dSQU5URUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIH07Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJuTWVkaWFSZXNvdXJjZU1vbml0b3IgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhUmVzb3VyY2VNb25pdG9yPiB7CitwdWJsaWM6CisgICAgLy8gTk9MSU5UTkVYVExJTkUoZ29vZ2xlLWRlZmF1bHQtYXJndW1lbnRzKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbHNlIC8vIF9fQU5EUk9JRF9WTkRLX18KKyNlcnJvciAiVGhpcyBoZWFkZXIgaXMgbm90IHZpc2libGUgdG8gdmVuZG9ycyIKKyNlbmRpZiAvLyBfX0FORFJPSURfVk5ES19fCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDNkMzZmOGUuLjk1MzY4NmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfcHJvY2Vzcy5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVkaWFSZXNvdXJjZU1vbml0b3IuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgpAQCAtMzUsMTkgKzM1LDU2IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgIklNZWRpYVJlc291cmNlTW9uaXRvci5oIgogI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZU9ic2VydmVyU2VydmljZS5oIgogI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCisvL3N0YXRpYworc3RkOjptdXRleCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpzQ29va2llTG9jazsKKy8vc3RhdGljCit1aW50cHRyX3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6c0Nvb2tpZUNvdW50ZXIgPSAwOworLy9zdGF0aWMKK3N0ZDo6bWFwPHVpbnRwdHJfdCwgc3A8RGVhdGhOb3RpZmllcj4gPiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpzQ29va2llVG9EZWF0aE5vdGlmaWVyTWFwOworCitjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIERlYXRoTm90aWZpZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlLAorICAgICAgICAgICAgaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCk7CisKKyAgICB2aXJ0dWFsIH5EZWF0aE5vdGlmaWVyKCkge30KKworICAgIC8vIEltcGxlbWVudCBkZWF0aCByZWNpcGllbnQKKyAgICBzdGF0aWMgdm9pZCBCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKTsKKyAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZCgpOworCitwcm90ZWN0ZWQ6CisgICAgc3RkOjp3ZWFrX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBpbnQgbVBpZDsKKyAgICBpbnQ2NF90IG1DbGllbnRJZDsKK307CisKIERlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlLAogICAgICAgICBpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKQogICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1QaWQocGlkKSwgbUNsaWVudElkKGNsaWVudElkKSB7fQogCiAvL3N0YXRpYwogdm9pZCBEZWF0aE5vdGlmaWVyOjpCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKSB7Ci0gICAgYXV0byB0aGl6ID0gc3RhdGljX2Nhc3Q8RGVhdGhOb3RpZmllcio+KGNvb2tpZSk7Ci0gICAgdGhpei0+YmluZGVyRGllZCgpOworICAgIHNwPERlYXRoTm90aWZpZXI+IG5vdGlmaWVyOworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre1Jlc291cmNlTWFuYWdlclNlcnZpY2U6OnNDb29raWVMb2NrfTsKKyAgICAgICAgYXV0byBpdCA9IFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZmluZCgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oY29va2llKSk7CisgICAgICAgIGlmIChpdCA9PSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpzQ29va2llVG9EZWF0aE5vdGlmaWVyTWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbm90aWZpZXIgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICBpZiAobm90aWZpZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBub3RpZmllci0+YmluZGVyRGllZCgpOworICAgIH0KIH0KIAogdm9pZCBEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKCkgewpAQCAtNjAsOCArOTcsMjggQEAKIAogICAgIHNlcnZpY2UtPm92ZXJyaWRlUGlkKG1QaWQsIC0xKTsKICAgICAvLyB0aGl6IGlzIGZyZWVkIGluIHRoZSBjYWxsIGJlbG93LCBzbyBpdCBtdXN0IGJlIGxhc3QgY2FsbCByZWZlcnJpbmcgdGhpegotICAgIHNlcnZpY2UtPnJlbW92ZVJlc291cmNlKG1QaWQsIG1DbGllbnRJZCwgZmFsc2UpOworICAgIHNlcnZpY2UtPnJlbW92ZVJlc291cmNlKG1QaWQsIG1DbGllbnRJZCwgZmFsc2UgLypjaGVja1ZhbGlkKi8pOworfQogCitjbGFzcyBPdmVycmlkZVByb2Nlc3NJbmZvRGVhdGhOb3RpZmllciA6IHB1YmxpYyBEZWF0aE5vdGlmaWVyIHsKK3B1YmxpYzoKKyAgICBPdmVycmlkZVByb2Nlc3NJbmZvRGVhdGhOb3RpZmllcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UsCisgICAgICAgICAgICBpbnQgcGlkKSA6IERlYXRoTm90aWZpZXIoc2VydmljZSwgcGlkLCAwKSB7fQorCisgICAgdmlydHVhbCB+T3ZlcnJpZGVQcm9jZXNzSW5mb0RlYXRoTm90aWZpZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoKTsKK307CisKK3ZvaWQgT3ZlcnJpZGVQcm9jZXNzSW5mb0RlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoKSB7CisgICAgLy8gRG9uJ3QgY2hlY2sgZm9yIHBpZCB2YWxpZGl0eSBzaW5jZSB3ZSBrbm93IGl0J3MgYWxyZWFkeSBkZWFkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UubG9jaygpOworICAgIGlmIChzZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIlJlc291cmNlTWFuYWdlclNlcnZpY2UgaXMgZGVhZCBhcyB3ZWxsLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VydmljZS0+cmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShtUGlkKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CkBAIC0xMTYsNiArMTczLDcgQEAKICAgICAgICAgaW5mby51aWQgPSB1aWQ7CiAgICAgICAgIGluZm8uY2xpZW50SWQgPSBjbGllbnRJZDsKICAgICAgICAgaW5mby5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIGluZm8uY29va2llID0gMDsKICAgICAgICAgaW5mby5wZW5kaW5nUmVtb3ZhbCA9IGZhbHNlOwogCiAgICAgICAgIGluZGV4ID0gaW5mb3MuYWRkKGNsaWVudElkLCBpbmZvKTsKQEAgLTI2Nyw2ICszMjUsMTMgQEAKICAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgewogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiBvYnNlcnZlclNlcnZpY2UgPQorICAgICAgICAgICAgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisKKyAgICBpZiAob2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+c2V0T2JzZXJ2ZXJTZXJ2aWNlKG9ic2VydmVyU2VydmljZSk7CisgICAgfQogICAgIC8vIFRPRE86IG1lZGlhc2VydmVyIG1haW4oKSBpcyBhbHJlYWR5IHN0YXJ0aW5nIHRoZSB0aHJlYWQgcG9vbCwKICAgICAvLyBtb3ZlIHRoaXMgdG8gbWVkaWFzZXJ2ZXIgbWFpbigpIHdoZW4gb3RoZXIgc2VydmljZXMgaW4gbWVkaWFzZXJ2ZXIKICAgICAvLyBhcmUgY29udmVydGVkIHRvIG5kay1wbGF0Zm9ybSBhaWRsLgpAQCAtMjc1LDYgKzM0MCwxMSBAQAogCiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjp+UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpIHt9CiAKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6c2V0T2JzZXJ2ZXJTZXJ2aWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+JiBvYnNlcnZlclNlcnZpY2UpIHsKKyAgICBtT2JzZXJ2ZXJTZXJ2aWNlID0gb2JzZXJ2ZXJTZXJ2aWNlOworfQorCiBTdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Y29uZmlnKGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWw+JiBwb2xpY2llcykgewogICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJjb25maWcoJXMpIiwgZ2V0U3RyaW5nKHBvbGljaWVzKS5zdHJpbmcoKSk7CiAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOwpAQCAtMzUzLDExICs0MjMsMTYgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJSZWplY3RlZCBhZGRSZXNvdXJjZSBjYWxsIHdpdGggaW52YWxpZCBwaWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQsIHVpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpOworICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOworICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICBSZXNvdXJjZUluZm9zJiBpbmZvcyA9IGdldFJlc291cmNlSW5mb3NGb3JFZGl0KHBpZCwgbU1hcCk7CiAgICAgUmVzb3VyY2VJbmZvJiBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdCh1aWQsIGNsaWVudElkLCBjbGllbnQsIGluZm9zKTsKKyAgICBSZXNvdXJjZUxpc3QgcmVzb3VyY2VBZGRlZDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgKytpKSB7CiAgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlc1tpXTsKQEAgLTM3OSwxMSArNDU0LDIwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZXJnZVJlc291cmNlcyhpbmZvLnJlc291cmNlc1tyZXNUeXBlXSwgcmVzKTsKICAgICAgICAgfQorICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgYWRkZWQgcmVzb3VyY2VzIGZvciBvYnNlcnZlcnMuCisgICAgICAgIGF1dG8gaXQgPSByZXNvdXJjZUFkZGVkLmZpbmQocmVzVHlwZSk7CisgICAgICAgIGlmIChpdCA9PSByZXNvdXJjZUFkZGVkLmVuZCgpKSB7CisgICAgICAgICAgICByZXNvdXJjZUFkZGVkW3Jlc1R5cGVdID0gcmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVyZ2VSZXNvdXJjZXMoaXQtPnNlY29uZCwgcmVzKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAoaW5mby5kZWF0aE5vdGlmaWVyID09IG51bGxwdHIgJiYgY2xpZW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgaW5mby5kZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIocmVmPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KCksIHBpZCwgY2xpZW50SWQpOwotICAgICAgICBBSUJpbmRlcl9saW5rVG9EZWF0aChjbGllbnQtPmFzQmluZGVyKCkuZ2V0KCksCi0gICAgICAgICAgICAgICAgbURlYXRoUmVjaXBpZW50LmdldCgpLCBpbmZvLmRlYXRoTm90aWZpZXIuZ2V0KCkpOworICAgIGlmIChpbmZvLmNvb2tpZSA9PSAwICYmIGNsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgIGluZm8uY29va2llID0gYWRkQ29va2llQW5kTGlua19sKGNsaWVudC0+YXNCaW5kZXIoKSwKKyAgICAgICAgICAgICAgICBuZXcgRGVhdGhOb3RpZmllcihyZWY8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oKSwgcGlkLCBjbGllbnRJZCkpOworICAgIH0KKyAgICBpZiAobU9ic2VydmVyU2VydmljZSAhPSBudWxscHRyICYmICFyZXNvdXJjZUFkZGVkLmVtcHR5KCkpIHsKKyAgICAgICAgbU9ic2VydmVyU2VydmljZS0+b25SZXNvdXJjZUFkZGVkKHVpZCwgcGlkLCByZXNvdXJjZUFkZGVkKTsKICAgICB9CiAgICAgbm90aWZ5UmVzb3VyY2VHcmFudGVkKHBpZCwgcmVzb3VyY2VzKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwpAQCAtMzk4LDggKzQ4MiwxMCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKLSAgICAgICAgQUxPR0UoIlJlamVjdGVkIHJlbW92ZVJlc291cmNlIGNhbGwgd2l0aCBpbnZhbGlkIHBpZC4iKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgICAgIHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBwaWQsIGNhbGxpbmdQaWQpOworICAgICAgICBwaWQgPSBjYWxsaW5nUGlkOwogICAgIH0KICAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewpAQCAtNDE1LDcgKzUwMSw3IEBACiAgICAgfQogCiAgICAgUmVzb3VyY2VJbmZvICZpbmZvID0gaW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpOwotCisgICAgUmVzb3VyY2VMaXN0IHJlc291cmNlUmVtb3ZlZDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBhdXRvICZyZXMgPSByZXNvdXJjZXNbaV07CiAgICAgICAgIGNvbnN0IGF1dG8gcmVzVHlwZSA9IHN0ZDo6dHVwbGUocmVzLnR5cGUsIHJlcy5zdWJUeXBlLCByZXMuaWQpOwpAQCAtNDI3LDE5ICs1MTMsMzIgQEAKICAgICAgICAgLy8gaWdub3JlIGlmIHdlIGRvbid0IGhhdmUgaXQKICAgICAgICAgaWYgKGluZm8ucmVzb3VyY2VzLmZpbmQocmVzVHlwZSkgIT0gaW5mby5yZXNvdXJjZXMuZW5kKCkpIHsKICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWwgJnJlc291cmNlID0gaW5mby5yZXNvdXJjZXNbcmVzVHlwZV07CisgICAgICAgICAgICBNZWRpYVJlc291cmNlUGFyY2VsIGFjdHVhbFJlbW92ZWQgPSByZXM7CiAgICAgICAgICAgICBpZiAocmVzb3VyY2UudmFsdWUgPiByZXMudmFsdWUpIHsKICAgICAgICAgICAgICAgICByZXNvdXJjZS52YWx1ZSAtPSByZXMudmFsdWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9uTGFzdFJlbW92ZWQocmVzLCBpbmZvKTsKKyAgICAgICAgICAgICAgICBhY3R1YWxSZW1vdmVkLnZhbHVlID0gcmVzb3VyY2UudmFsdWU7CiAgICAgICAgICAgICAgICAgaW5mby5yZXNvdXJjZXMuZXJhc2UocmVzVHlwZSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgbGlzdCBvZiByZW1vdmVkIHJlc291cmNlcyBmb3Igb2JzZXJ2ZXJzLgorICAgICAgICAgICAgYXV0byBpdCA9IHJlc291cmNlUmVtb3ZlZC5maW5kKHJlc1R5cGUpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlc291cmNlUmVtb3ZlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIHJlc291cmNlUmVtb3ZlZFtyZXNUeXBlXSA9IGFjdHVhbFJlbW92ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lcmdlUmVzb3VyY2VzKGl0LT5zZWNvbmQsIGFjdHVhbFJlbW92ZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIGlmIChtT2JzZXJ2ZXJTZXJ2aWNlICE9IG51bGxwdHIgJiYgIXJlc291cmNlUmVtb3ZlZC5lbXB0eSgpKSB7CisgICAgICAgIG1PYnNlcnZlclNlcnZpY2UtPm9uUmVzb3VyY2VSZW1vdmVkKGluZm8udWlkLCBwaWQsIHJlc291cmNlUmVtb3ZlZCk7CisgICAgfQogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIFN0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVDbGllbnQoaW50MzJfdCBwaWQsIGludDY0X3QgY2xpZW50SWQpIHsKLSAgICByZW1vdmVSZXNvdXJjZShwaWQsIGNsaWVudElkLCB0cnVlKTsKKyAgICByZW1vdmVSZXNvdXJjZShwaWQsIGNsaWVudElkLCB0cnVlIC8qY2hlY2tWYWxpZCovKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCkBAIC00NTEsOCArNTUwLDEwIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrVmFsaWQgJiYgIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChwaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJSZWplY3RlZCByZW1vdmVSZXNvdXJjZSBjYWxsIHdpdGggaW52YWxpZCBwaWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcGlkLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAgICAgc3NpemVfdCBpbmRleCA9IG1NYXAuaW5kZXhPZktleShwaWQpOwogICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTQ3Miw4ICs1NzMsMTEgQEAKICAgICAgICAgb25MYXN0UmVtb3ZlZChpdC0+c2Vjb25kLCBpbmZvKTsKICAgICB9CiAKLSAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGluZm8uY2xpZW50LT5hc0JpbmRlcigpLmdldCgpLAotICAgICAgICAgICAgbURlYXRoUmVjaXBpZW50LmdldCgpLCBpbmZvLmRlYXRoTm90aWZpZXIuZ2V0KCkpOworICAgIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGluZm8uY2xpZW50LT5hc0JpbmRlcigpLCBpbmZvLmNvb2tpZSk7CisKKyAgICBpZiAobU9ic2VydmVyU2VydmljZSAhPSBudWxscHRyICYmICFpbmZvLnJlc291cmNlcy5lbXB0eSgpKSB7CisgICAgICAgIG1PYnNlcnZlclNlcnZpY2UtPm9uUmVzb3VyY2VSZW1vdmVkKGluZm8udWlkLCBwaWQsIGluZm8ucmVzb3VyY2VzKTsKKyAgICB9CiAKICAgICBpbmZvcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwpAQCAtNTA0LDggKzYwOCwxMCBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+aXNWYWxpZFBpZChjYWxsaW5nUGlkKSkgewotICAgICAgICAgICAgQUxPR0UoIlJlamVjdGVkIHJlY2xhaW1SZXNvdXJjZSBjYWxsIHdpdGggaW52YWxpZCBjYWxsaW5nUGlkLiIpOwotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgICAgICAgICBwaWRfdCBhY3R1YWxDYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxlZCB3aXRoIHVudHJ1c3RlZCBwaWQgJWQsIHVzaW5nIGFjdHVhbCBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgYWN0dWFsQ2FsbGluZ1BpZCk7CisgICAgICAgICAgICBjYWxsaW5nUGlkID0gYWN0dWFsQ2FsbGluZ1BpZDsKICAgICAgICAgfQogICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsICpzZWN1cmVDb2RlYyA9IE5VTEw7CiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwgKm5vblNlY3VyZUNvZGVjID0gTlVMTDsKQEAgLTU3NSwxMyArNjgxLDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAqX2FpZGxfcmV0dXJuID0gcmVjbGFpbUludGVybmFsKGNsaWVudHMpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbUludGVybmFsKAorICAgICAgICBjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cykgewogICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gZmFpbGVkQ2xpZW50OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2xpZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoInJlY2xhaW1SZXNvdXJjZSBmcm9tIGNsaWVudCAlcCIsIGNsaWVudHNbaV0uZ2V0KCkpOworICAgICAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlIGZyb20gY2xpZW50ICVwIiwgY2xpZW50c1tpXS5nZXQoKSk7CiAgICAgICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKICAgICAgICAgYm9vbCBzdWNjZXNzOwogICAgICAgICBTdGF0dXMgc3RhdHVzID0gY2xpZW50c1tpXS0+cmVjbGFpbVJlc291cmNlKCZzdWNjZXNzKTsKQEAgLTU5Miw4ICs3MDQsNyBAQAogICAgIH0KIAogICAgIGlmIChmYWlsZWRDbGllbnQgPT0gTlVMTCkgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiAgICAgewpAQCAtNjE4LDcgKzcyOSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIHJldHVybiBmYWxzZTsKIH0KIAogU3RhdHVzIFJlc291cmNlTWFuYWdlclNlcnZpY2U6Om92ZXJyaWRlUGlkKApAQCAtNjUxLDYgKzc2Miw4MyBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgaW50IHBpZCwKKyAgICAgICAgaW50IHByb2NTdGF0ZSwKKyAgICAgICAgaW50IG9vbVNjb3JlKSB7CisgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoIm92ZXJyaWRlUHJvY2Vzc0luZm8ocGlkICVkLCBwcm9jU3RhdGUgJWQsIG9vbVNjb3JlICVkKSIsCisgICAgICAgICAgICBwaWQsIHByb2NTdGF0ZSwgb29tU2NvcmUpOworICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKworICAgIC8vIE9ubHkgYWxsb3cgdGhlIG92ZXJyaWRlIGlmIHRoZSBjYWxsZXIgYWxyZWFkeSBjYW4gYWNjZXNzIHByb2Nlc3Mgc3RhdGUgYW5kIG9vbSBzY29yZXMuCisgICAgaW50IGNhbGxpbmdQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYgKGNhbGxpbmdQaWQgIT0gcGlkIHx8ICFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KAorICAgICAgICAgICAgImFuZHJvaWQucGVybWlzc2lvbi5HRVRfUFJPQ0VTU19TVEFURV9BTkRfT09NX1NDT1JFIikpKSkgeworICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IG92ZXJyaWRlUHJvY2Vzc0luZm8gbWV0aG9kIGZyb20gcGlkPSVkIiwgY2FsbGluZ1BpZCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihQRVJNSVNTSU9OX0RFTklFRCk7CisgICAgfQorCisgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlX2wocGlkKTsKKworICAgIGlmICghbVByb2Nlc3NJbmZvLT5vdmVycmlkZVByb2Nlc3NJbmZvKHBpZCwgcHJvY1N0YXRlLCBvb21TY29yZSkpIHsKKyAgICAgICAgLy8gT3ZlcnJpZGUgdmFsdWUgaXMgcmVqZWN0ZWQgYnkgUHJvY2Vzc0luZm8uCisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgIH0KKworICAgIHVpbnRwdHJfdCBjb29raWUgPSBhZGRDb29raWVBbmRMaW5rX2woY2xpZW50LT5hc0JpbmRlcigpLAorICAgICAgICAgICAgbmV3IE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyKHJlZjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPigpLCBwaWQpKTsKKworICAgIG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVtcGxhY2UocGlkLCBQcm9jZXNzSW5mb092ZXJyaWRle2Nvb2tpZSwgY2xpZW50fSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCit1aW50cHRyX3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6YWRkQ29va2llQW5kTGlua19sKAorICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzQ29va2llTG9ja307CisKKyAgICB1aW50cHRyX3QgY29va2llOworICAgIC8vIE5lZWQgdG8gc2tpcCBjb29raWUgMCAoaWYgaXQgd3JhcHMgYXJvdW5kKS4gUmVzb3VyY2VJbmZvIGhhcyBjb29raWUgaW5pdGlhbGl6ZWQgdG8gMAorICAgIC8vIGluZGljYXRpbmcgdGhlIGRlYXRoIG5vdGlmaWVyIGlzIG5vdCBjcmVhdGVkIHlldC4KKyAgICB3aGlsZSAoKGNvb2tpZSA9ICsrc0Nvb2tpZUNvdW50ZXIpID09IDApOworICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLCAodm9pZCopY29va2llKTsKKyAgICBzQ29va2llVG9EZWF0aE5vdGlmaWVyTWFwLmVtcGxhY2UoY29va2llLCBub3RpZmllcik7CisKKyAgICByZXR1cm4gY29va2llOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZUNvb2tpZUFuZFVubGlua19sKAorICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIHVpbnRwdHJfdCBjb29raWUpIHsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7c0Nvb2tpZUxvY2t9OworICAgIEFJQmluZGVyX3VubGlua1RvRGVhdGgoYmluZGVyLmdldCgpLCBtRGVhdGhSZWNpcGllbnQuZ2V0KCksICh2b2lkKiljb29raWUpOworICAgIHNDb29raWVUb0RlYXRoTm90aWZpZXJNYXAuZXJhc2UoY29va2llKTsKK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlX2wocGlkKTsKK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlX2woaW50IHBpZCkgeworICAgIGF1dG8gaXQgPSBtUHJvY2Vzc0luZm9PdmVycmlkZU1hcC5maW5kKHBpZCk7CisgICAgaWYgKGl0ID09IG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtUHJvY2Vzc0luZm8tPnJlbW92ZVByb2Nlc3NJbmZvT3ZlcnJpZGUocGlkKTsKKworICAgIHJlbW92ZUNvb2tpZUFuZFVubGlua19sKGl0LT5zZWNvbmQuY2xpZW50LT5hc0JpbmRlcigpLCBpdC0+c2Vjb25kLmNvb2tpZSk7CisKKyAgICBtUHJvY2Vzc0luZm9PdmVycmlkZU1hcC5lcmFzZShwaWQpOworfQorCiBTdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkKSB7CiAgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoCiAgICAgICAgICAgICAibWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKHBpZCAlZCwgY2xpZW50SWQgJWxsZCkiLApAQCAtNjU5LDggKzg0NywxMCBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmICghbVByb2Nlc3NJbmZvLT5pc1ZhbGlkUGlkKHBpZCkpIHsKLSAgICAgICAgQUxPR0UoIlJlamVjdGVkIG1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCBjYWxsIHdpdGggaW52YWxpZCBwaWQuIik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihCQURfVkFMVUUpOworICAgICAgICBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHdpdGggdW50cnVzdGVkIHBpZCAlZCwgdXNpbmcgY2FsbGluZyBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcGlkLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgcGlkID0gY2FsbGluZ1BpZDsKICAgICB9CiAgICAgc3NpemVfdCBpbmRleCA9IG1NYXAuaW5kZXhPZktleShwaWQpOwogICAgIGlmIChpbmRleCA8IDApIHsKQEAgLTY4MSw2ICs4NzEsMzggQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCitTdGF0dXMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoaW50MzJfdCBwaWQpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwocGlkICVkKSIsIHBpZCk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgVmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgICAgICAgICAgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsZWQgd2l0aCB1bnRydXN0ZWQgcGlkICVkLCB1c2luZyBjYWxsaW5nIHBpZCAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgICAgIHBpZCA9IGNhbGxpbmdQaWQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSA6IHtNZWRpYVJlc291cmNlOjpUeXBlOjprU2VjdXJlQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtOb25TZWN1cmVDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZTo6a0dyYXBoaWNNZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGU6OmtEcm1TZXNzaW9ufSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgICAgIGlmIChnZXRCaWdnZXN0Q2xpZW50X2wocGlkLCB0eXBlLCAmY2xpZW50LCB0cnVlIC8qIHBlbmRpbmdSZW1vdmFsT25seSAqLykpIHsKKyAgICAgICAgICAgICAgICBjbGllbnRzLmFkZChjbGllbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjbGllbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgcmVjbGFpbUludGVybmFsKGNsaWVudHMpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBib29sIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldFByaW9yaXR5X2woaW50IHBpZCwgaW50KiBwcmlvcml0eSkgewogICAgIGludCBuZXdQaWQgPSBwaWQ7CiAKQEAgLTgwNCw3ICsxMDI2LDggQEAKICAgICAgICAgYm9vbCBwZW5kaW5nUmVtb3ZhbE9ubHkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbU1hcC5pbmRleE9mS2V5KHBpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiZ2V0QmlnZ2VzdENsaWVudF9sOiBjYW4ndCBmaW5kIHJlc291cmNlIGluZm8gZm9yIHBpZCAlZCIsIHBpZCk7CisgICAgICAgIEFMT0dFX0lGKCFwZW5kaW5nUmVtb3ZhbE9ubHksCisgICAgICAgICAgICAgICAgICJnZXRCaWdnZXN0Q2xpZW50X2w6IGNhbid0IGZpbmQgcmVzb3VyY2UgaW5mbyBmb3IgcGlkICVkIiwgcGlkKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtODI4LDcgKzEwNTEsOSBAQAogICAgIH0KIAogICAgIGlmIChjbGllbnRUZW1wID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGZvciBwaWQgJWQiLCBhc1N0cmluZyh0eXBlKSwgcGlkKTsKKyAgICAgICAgQUxPR0VfSUYoIXBlbmRpbmdSZW1vdmFsT25seSwKKyAgICAgICAgICAgICAgICAgImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlKSwgcGlkKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCmluZGV4IGVlOTgyYjcuLjljMjYzNmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9SRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKIAogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KIAogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KQEAgLTMzLDYgKzM0LDcgQEAKIAogY2xhc3MgRGVhdGhOb3RpZmllcjsKIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2U7CitjbGFzcyBSZXNvdXJjZU9ic2VydmVyU2VydmljZTsKIGNsYXNzIFNlcnZpY2VMb2c7CiBzdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2U7CiAKQEAgLTQzLDE0ICs0NSwxNCBAQAogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbDsKIAogdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnR1cGxlPAotICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlLCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+PiwKKyAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4+LAogICAgICAgICBNZWRpYVJlc291cmNlUGFyY2VsPiBSZXNvdXJjZUxpc3Q7CiAKIHN0cnVjdCBSZXNvdXJjZUluZm8gewogICAgIGludDY0X3QgY2xpZW50SWQ7CiAgICAgdWlkX3QgdWlkOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgc3A8RGVhdGhOb3RpZmllcj4gZGVhdGhOb3RpZmllcjsKKyAgICB1aW50cHRyX3QgY29va2llezB9OwogICAgIFJlc291cmNlTGlzdCByZXNvdXJjZXM7CiAgICAgYm9vbCBwZW5kaW5nUmVtb3ZhbHtmYWxzZX07CiB9OwpAQCAtNTksMjIgKzYxLDYgQEAKIHR5cGVkZWYgS2V5ZWRWZWN0b3I8aW50NjRfdCwgUmVzb3VyY2VJbmZvPiBSZXNvdXJjZUluZm9zOwogdHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIFJlc291cmNlSW5mb3M+IFBpZFJlc291cmNlSW5mb3NNYXA7CiAKLWNsYXNzIERlYXRoTm90aWZpZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgRGVhdGhOb3RpZmllcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gJnNlcnZpY2UsCi0gICAgICAgICAgICBpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKTsKLQotICAgIH5EZWF0aE5vdGlmaWVyKCkge30KLQotICAgIC8vIEltcGxlbWVudCBkZWF0aCByZWNpcGllbnQKLSAgICBzdGF0aWMgdm9pZCBCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKTsKLSAgICB2b2lkIGJpbmRlckRpZWQoKTsKLQotcHJpdmF0ZToKLSAgICBzdGQ6OndlYWtfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwotICAgIGludCBtUGlkOwotICAgIGludDY0X3QgbUNsaWVudElkOwotfTsKIGNsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2UgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHsKIHB1YmxpYzoKICAgICBzdHJ1Y3QgU3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgOiBwdWJsaWMgUmVmQmFzZSB7CkBAIC05NSw2ICs4MSw4IEBACiAgICAgICAgICAgICBjb25zdCBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gJnByb2Nlc3NJbmZvLAogICAgICAgICAgICAgY29uc3Qgc3A8U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2U+ICZzeXN0ZW1SZXNvdXJjZSk7CiAgICAgdmlydHVhbCB+UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOworICAgIHZvaWQgc2V0T2JzZXJ2ZXJTZXJ2aWNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiYgb2JzZXJ2ZXJTZXJ2aWNlKTsKIAogICAgIC8vIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGludGVyZmFjZQogICAgIFN0YXR1cyBjb25maWcoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbD4mIHBvbGljaWVzKSBvdmVycmlkZTsKQEAgLTEyNSwxMiArMTEzLDI3IEBACiAgICAgICAgICAgICBpbnQgb3JpZ2luYWxQaWQsCiAgICAgICAgICAgICBpbnQgbmV3UGlkKSBvdmVycmlkZTsKIAorICAgIFN0YXR1cyBvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHByb2NTdGF0ZSwKKyAgICAgICAgICAgIGludCBvb21TY29yZSkgb3ZlcnJpZGU7CisKICAgICBTdGF0dXMgbWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGludDMyX3QgcGlkLCBpbnQ2NF90IGNsaWVudElkKSBvdmVycmlkZTsKIAorICAgIFN0YXR1cyByZWNsYWltUmVzb3VyY2VzRnJvbUNsaWVudHNQZW5kaW5nUmVtb3ZhbChpbnQzMl90IHBpZCkgb3ZlcnJpZGU7CisKICAgICBTdGF0dXMgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCwgYm9vbCBjaGVja1ZhbGlkKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3Q7CisgICAgZnJpZW5kIGNsYXNzIERlYXRoTm90aWZpZXI7CisgICAgZnJpZW5kIGNsYXNzIE92ZXJyaWRlUHJvY2Vzc0luZm9EZWF0aE5vdGlmaWVyOworCisgICAgLy8gUmVjbGFpbXMgcmVzb3VyY2VzIGZyb20gfGNsaWVudHN8LiBSZXR1cm5zIHRydWUgaWYgcmVjbGFpbSBzdWNjZWVkZWQKKyAgICAvLyBmb3IgYWxsIGNsaWVudHMuCisgICAgYm9vbCByZWNsYWltSW50ZXJuYWwoCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8c3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAmY2xpZW50cyk7CiAKICAgICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyB3aG8gb3duIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KICAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGFueSBjbGllbnQgYmVsb25ncyB0byBhIHByb2Nlc3Mgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUKQEAgLTE3MCw2ICsxNzMsMTIgQEAKICAgICAvLyBHZXQgcHJpb3JpdHkgZnJvbSBwcm9jZXNzJ3MgcGlkCiAgICAgYm9vbCBnZXRQcmlvcml0eV9sKGludCBwaWQsIGludCogcHJpb3JpdHkpOwogCisgICAgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCBwaWQpOworCisgICAgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlX2woaW50IHBpZCk7CisgICAgdWludHB0cl90IGFkZENvb2tpZUFuZExpbmtfbCg6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIGNvbnN0IHNwPERlYXRoTm90aWZpZXI+JiBub3RpZmllcik7CisgICAgdm9pZCByZW1vdmVDb29raWVBbmRVbmxpbmtfbCg6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIsIHVpbnRwdHJfdCBjb29raWUpOworCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKICAgICBzcDxQcm9jZXNzSW5mb0ludGVyZmFjZT4gbVByb2Nlc3NJbmZvOwogICAgIHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiBtU3lzdGVtQ0I7CkBAIC0xNzksNyArMTg4LDE3IEBACiAgICAgYm9vbCBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWM7CiAgICAgaW50MzJfdCBtQ3B1Qm9vc3RDb3VudDsKICAgICA6Om5kazo6U2NvcGVkQUlCaW5kZXJfRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OworICAgIHN0cnVjdCBQcm9jZXNzSW5mb092ZXJyaWRlIHsKKyAgICAgICAgdWludHB0cl90IGNvb2tpZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICB9OwogICAgIHN0ZDo6bWFwPGludCwgaW50PiBtT3ZlcnJpZGVQaWRNYXA7CisgICAgc3RkOjptYXA8cGlkX3QsIFByb2Nlc3NJbmZvT3ZlcnJpZGU+IG1Qcm9jZXNzSW5mb092ZXJyaWRlTWFwOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNDb29raWVMb2NrOworICAgIHN0YXRpYyB1aW50cHRyX3Qgc0Nvb2tpZUNvdW50ZXIgR1VBUkRFRF9CWShzQ29va2llTG9jayk7CisgICAgc3RhdGljIHN0ZDo6bWFwPHVpbnRwdHJfdCwgc3A8RGVhdGhOb3RpZmllcj4gPiBzQ29va2llVG9EZWF0aE5vdGlmaWVyTWFwCisgICAgICAgICAgICBHVUFSREVEX0JZKHNDb29raWVMb2NrKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+IG1PYnNlcnZlclNlcnZpY2U7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU9ic2VydmVyU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU9ic2VydmVyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NzQwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDMyOCBAQAorLyoqCisgKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBhcmNlbC5oPgorCisjaW5jbHVkZSAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlUGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlRXZlbnQ7CisKKy8vIE1lZGlhT2JzZXJ2YWJsZUV2ZW50IHdpbGwgYmUgdXNlZCBhcyB1aW50NjRfdCBmbGFncy4KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKE1lZGlhT2JzZXJ2YWJsZUV2ZW50KSA9PSBzaXplb2YodWludDY0X3QpKTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUV2ZW50PiBzRXZlbnRzID0geworICAgICAgICBNZWRpYU9ic2VydmFibGVFdmVudDo6a0J1c3ksCisgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZSwKK307CisKK3N0YXRpYyBNZWRpYU9ic2VydmFibGVUeXBlIGdldE9ic2VydmFibGVUeXBlKGNvbnN0IE1lZGlhUmVzb3VyY2VQYXJjZWwmIHJlcykgeworICAgIGlmIChyZXMuc3ViVHlwZSA9PSBNZWRpYVJlc291cmNlU3ViVHlwZTo6a1ZpZGVvQ29kZWMpIHsKKyAgICAgICAgaWYgKHJlcy50eXBlID09IE1lZGlhUmVzb3VyY2VUeXBlOjprTm9uU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYzsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzLnR5cGUgPT0gTWVkaWFSZXNvdXJjZVR5cGU6OmtTZWN1cmVDb2RlYykgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNZWRpYU9ic2VydmFibGVUeXBlOjprSW52YWxpZDsKK30KKworLy9zdGF0aWMKK3N0ZDo6bXV0ZXggUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OnNEZWF0aFJlY2lwaWVudExvY2s7CisvL3N0YXRpYworc3RkOjptYXA8dWludHB0cl90LCBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OkRlYXRoUmVjaXBpZW50PiA+CitSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6c0RlYXRoUmVjaXBpZW50TWFwOworCitzdHJ1Y3QgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBEZWF0aFJlY2lwaWVudChSZXNvdXJjZU9ic2VydmVyU2VydmljZSogX3NlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlT2JzZXJ2ZXI+JiBfb2JzZXJ2ZXIpCisgICAgICAgIDogc2VydmljZShfc2VydmljZSksIG9ic2VydmVyKF9vYnNlcnZlcikge30KKyAgICB+RGVhdGhSZWNpcGllbnQoKSB7fQorCisgICAgdm9pZCBiaW5kZXJEaWVkKCkgeworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT51bnJlZ2lzdGVyT2JzZXJ2ZXIob2JzZXJ2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UqIHNlcnZpY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU9ic2VydmVyPiBvYnNlcnZlcjsKK307CisKKy8vIHN0YXRpYwordm9pZCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6QmluZGVyRGllZENhbGxiYWNrKHZvaWQqIGNvb2tpZSkgeworICAgIHVpbnRwdHJfdCBpZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihjb29raWUpOworCisgICAgQUxPR1coIk9ic2VydmVyICVsbGQgaXMgZGVhZCIsIChsb25nIGxvbmcpaWQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPERlYXRoUmVjaXBpZW50PiByZWNpcGllbnQ7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzRGVhdGhSZWNpcGllbnRMb2NrfTsKKworICAgICAgICBhdXRvIGl0ID0gc0RlYXRoUmVjaXBpZW50TWFwLmZpbmQoaWQpOworICAgICAgICBpZiAoaXQgIT0gc0RlYXRoUmVjaXBpZW50TWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZWNpcGllbnQgPSBpdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlY2lwaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHJlY2lwaWVudC0+YmluZGVyRGllZCgpOworICAgIH0KK30KKworLy9zdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4gUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU9ic2VydmVyU2VydmljZT4gb2JzZXJ2ZXJTZXJ2aWNlID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPigpOworICAgIGJpbmRlcl9zdGF0dXNfdCBzdGF0dXMgPSBBU2VydmljZU1hbmFnZXJfYWRkU2VydmljZShvYnNlcnZlclNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksCisgICAgICAgICAgICBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6Z2V0U2VydmljZU5hbWUoKSk7CisgICAgaWYgKHN0YXR1cyAhPSBTVEFUVVNfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBvYnNlcnZlclNlcnZpY2U7Cit9CisKK1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpSZXNvdXJjZU9ic2VydmVyU2VydmljZSgpCisgICAgOiBtRGVhdGhSZWNpcGllbnQoQUlCaW5kZXJfRGVhdGhSZWNpcGllbnRfbmV3KEJpbmRlckRpZWRDYWxsYmFjaykpIHt9CisKK2JpbmRlcl9zdGF0dXNfdCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6ZHVtcCgKKyAgICAgICAgaW50IGZkLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgcmVzdWx0LmZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6ICVwXG4iLCB0aGlzKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFJlZ2lzdGVyZWQgT2JzZXJ2ZXJzOiAlenVcbiIsIG1PYnNlcnZlckluZm9NYXAuc2l6ZSgpKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21PYnNlcnZlckxvY2t9OworCisgICAgICAgIGZvciAoYXV0byAmb2JzZXJ2ZXIgOiBtT2JzZXJ2ZXJJbmZvTWFwKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAgT2JzZXJ2ZXIgJXA6XG4iLCBvYnNlcnZlci5zZWNvbmQuYmluZGVyLmdldCgpKTsKKyAgICAgICAgICAgIGZvciAoYXV0byAmb2JzZXJ2YWJsZSA6IG9ic2VydmVyLnNlY29uZC5maWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBlbmFibGVkRXZlbnRzU3RyOworICAgICAgICAgICAgICAgIGZvciAoYXV0byAmZXZlbnQgOiBzRXZlbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KW9ic2VydmFibGUuZXZlbnRGaWx0ZXIgJiAodWludDY0X3QpZXZlbnQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZEV2ZW50c1N0ci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkRXZlbnRzU3RyLmFwcGVuZCgifCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZEV2ZW50c1N0ci5hcHBlbmQodG9TdHJpbmcoZXZlbnQpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAgICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKG9ic2VydmFibGUudHlwZSkuY19zdHIoKSwgZW5hYmxlZEV2ZW50c1N0ci5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBPSzsKK30KKworU3RhdHVzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpyZWdpc3Rlck9ic2VydmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlT2JzZXJ2ZXI+JiBpbl9vYnNlcnZlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlRmlsdGVyPiYgaW5fZmlsdGVycykgeworICAgIGlmICgoZ2V0cGlkKCkgIT0gQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpKSAmJgorICAgICAgICAgICAgY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uUkVHSVNURVJfTUVESUFfUkVTT1VSQ0VfT0JTRVJWRVIiKSkgPT0gZmFsc2UpIHsKKyAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgICAgICAgICAgImNhbid0IHJlZ2lzdGVyT2JzZXJ2ZXIgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKFBFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9CisKKyAgICBpZiAoaW5fb2JzZXJ2ZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICB9CisKKyAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXIgPSBpbl9vYnNlcnZlci0+YXNCaW5kZXIoKTsKKworICAgIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21PYnNlcnZlckxvY2t9OworCisgICAgICAgIGlmIChtT2JzZXJ2ZXJJbmZvTWFwLmZpbmQoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCkpICE9IG1PYnNlcnZlckluZm9NYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihBTFJFQURZX0VYSVNUUyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5fZmlsdGVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBvYnNlcnZlciBpbmZvLgorICAgICAgICBtT2JzZXJ2ZXJJbmZvTWFwLmVtcGxhY2UoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgT2JzZXJ2ZXJJbmZve2JpbmRlciwgaW5fb2JzZXJ2ZXIsIGluX2ZpbHRlcnN9KTsKKworICAgICAgICAvLyBBZGQgb2JzZXJ2ZXIgdG8gb2JzZXJ2YWJsZS0+c3Vic2NyaWJlcnMgbWFwLgorICAgICAgICBmb3IgKGF1dG8gJmZpbHRlciA6IGluX2ZpbHRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byAmZXZlbnQgOiBzRXZlbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoKHVpbnQ2NF90KWZpbHRlci5ldmVudEZpbHRlciAmICh1aW50NjRfdClldmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciBrZXl7ZmlsdGVyLnR5cGUsIGV2ZW50fTsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXBba2V5XS5lbXBsYWNlKCh1aW50cHRyX3QpYmluZGVyLmdldCgpLCBpbl9vYnNlcnZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBZGQgZGVhdGggYmluZGVyIGFuZCBsaW5rLgorICAgIHVpbnRwdHJfdCBjb29raWUgPSAodWludHB0cl90KWJpbmRlci5nZXQoKTsKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzRGVhdGhSZWNpcGllbnRMb2NrfTsKKyAgICAgICAgc0RlYXRoUmVjaXBpZW50TWFwLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6Om1ha2Vfc2hhcmVkPERlYXRoUmVjaXBpZW50Pih0aGlzLCBpbl9vYnNlcnZlcikpOworICAgIH0KKworICAgIEFJQmluZGVyX2xpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGNvb2tpZSkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjp1bnJlZ2lzdGVyT2JzZXJ2ZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4mIGluX29ic2VydmVyKSB7CisgICAgaWYgKChnZXRwaWQoKSAhPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCkpICYmCisgICAgICAgICAgICBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5SRUdJU1RFUl9NRURJQV9SRVNPVVJDRV9PQlNFUlZFUiIpKSA9PSBmYWxzZSkgeworICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdW5yZWdpc3Rlck9ic2VydmVyIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgQUlCaW5kZXJfZ2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihQRVJNSVNTSU9OX0RFTklFRCk7CisgICAgfQorCisgICAgaWYgKGluX29ic2VydmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyID0gaW5fb2JzZXJ2ZXItPmFzQmluZGVyKCk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttT2JzZXJ2ZXJMb2NrfTsKKworICAgICAgICBhdXRvIGl0ID0gbU9ic2VydmVySW5mb01hcC5maW5kKCh1aW50cHRyX3QpYmluZGVyLmdldCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1PYnNlcnZlckluZm9NYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihOQU1FX05PVF9GT1VORCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgb2JzZXJ2ZXIgZnJvbSBvYnNlcnZhYmxlLT5zdWJzY3JpYmVycyBtYXAuCisgICAgICAgIGZvciAoYXV0byAmZmlsdGVyIDogaXQtPnNlY29uZC5maWx0ZXJzKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gJmV2ZW50IDogc0V2ZW50cykgeworICAgICAgICAgICAgICAgIGlmICghKCh1aW50NjRfdClmaWx0ZXIuZXZlbnRGaWx0ZXIgJiAodWludDY0X3QpZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBNZWRpYU9ic2VydmFibGVGaWx0ZXIga2V5e2ZpbHRlci50eXBlLCBldmVudH07CisgICAgICAgICAgICAgICAgbU9ic2VydmFibGVUb1N1YnNjcmliZXJzTWFwW2tleV0uZXJhc2UoKHVpbnRwdHJfdCliaW5kZXIuZ2V0KCkpOworCisgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhlIGVudHJ5IGlmIHRoZXJlJ3Mgbm8gbW9yZSBzdWJzY3JpYmVycy4KKyAgICAgICAgICAgICAgICBpZiAobU9ic2VydmFibGVUb1N1YnNjcmliZXJzTWFwW2tleV0uZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXAuZXJhc2Uoa2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgb2JzZXJ2ZXIgaW5mby4KKyAgICAgICAgbU9ic2VydmVySW5mb01hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgLy8gVW5saW5rIGFuZCByZW1vdmUgZGVhdGggYmluZGVyLgorICAgIHVpbnRwdHJfdCBjb29raWUgPSAodWludHB0cl90KWJpbmRlci5nZXQoKTsKKyAgICBBSUJpbmRlcl91bmxpbmtUb0RlYXRoKGJpbmRlci5nZXQoKSwgbURlYXRoUmVjaXBpZW50LmdldCgpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oY29va2llKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3tzRGVhdGhSZWNpcGllbnRMb2NrfTsKKyAgICAgICAgc0RlYXRoUmVjaXBpZW50TWFwLmVyYXNlKGNvb2tpZSk7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwordm9pZCBSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6bm90aWZ5T2JzZXJ2ZXJzKAorICAgICAgICBNZWRpYU9ic2VydmFibGVFdmVudCBldmVudCwgaW50IHVpZCwgaW50IHBpZCwgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMpIHsKKyAgICBzdHJ1Y3QgQ2FsbGVlSW5mbyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4gb2JzZXJ2ZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4gbW9uaXRvcnM7CisgICAgfTsKKyAgICAvLyBCdWlsZCBhIGNvbnNvbGlkYXRlZCBsaXN0IG9mIG9ic2VydmVycyB0byBjYWxsIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBvYnNlcnZhYmxlcy4KKyAgICBzdGQ6Om1hcDx1aW50cHRyX3QsIENhbGxlZUluZm8+IGNhbGxlZUxpc3Q7CisKKyAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttT2JzZXJ2ZXJMb2NrfTsKKworICAgICAgICBmb3IgKGF1dG8gJnJlcyA6IHJlc291cmNlcykgeworICAgICAgICAgICAgLy8gU2tpcCBpZiB0aGlzIHJlc291cmNlIGRvZXNuJ3QgbWFwIHRvIGFueSBvYnNlcnZhYmxlIHR5cGUuCisgICAgICAgICAgICBNZWRpYU9ic2VydmFibGVUeXBlIG9ic2VydmFibGVUeXBlID0gZ2V0T2JzZXJ2YWJsZVR5cGUocmVzLnNlY29uZCk7CisgICAgICAgICAgICBpZiAob2JzZXJ2YWJsZVR5cGUgPT0gTWVkaWFPYnNlcnZhYmxlVHlwZTo6a0ludmFsaWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciBrZXl7b2JzZXJ2YWJsZVR5cGUsIGV2ZW50fTsKKyAgICAgICAgICAgIC8vIFNraXAgaWYgbm8gb25lIHN1YnNjcmliZWQgdG8gdGhpcyBvYnNlcnZhYmxlLgorICAgICAgICAgICAgYXV0byBvYnNlcnZhYmxlSXQgPSBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXAuZmluZChrZXkpOworICAgICAgICAgICAgaWYgKG9ic2VydmFibGVJdCA9PSBtT2JzZXJ2YWJsZVRvU3Vic2NyaWJlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc3Vic3JpYmVycy4KKyAgICAgICAgICAgIGZvciAoYXV0byAmc3Vic2NyaWJlciA6IG9ic2VydmFibGVJdC0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgYXV0byBjYWxsZWVJdCA9IGNhbGxlZUxpc3QuZmluZChzdWJzY3JpYmVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGVlSXQgPT0gY2FsbGVlTGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYWxsZWVMaXN0LmVtcGxhY2Uoc3Vic2NyaWJlci5maXJzdCwgQ2FsbGVlSW5mb3sKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuc2Vjb25kLCB7e29ic2VydmFibGVUeXBlLCByZXMuc2Vjb25kLnZhbHVlfX19KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjYWxsZWVJdC0+c2Vjb25kLm1vbml0b3JzLnB1c2hfYmFjayh7b2JzZXJ2YWJsZVR5cGUsIHJlcy5zZWNvbmQudmFsdWV9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaW5hbGx5IGNhbGwgdGhlIG9ic2VydmVycyBhYm91dCB0aGUgc3RhdHVzIGNoYW5nZS4KKyAgICBmb3IgKGF1dG8gJmNhbGxlZUluZm8gOiBjYWxsZWVMaXN0KSB7CisgICAgICAgIGNhbGxlZUluZm8uc2Vjb25kLm9ic2VydmVyLT5vblN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICAgICAgZXZlbnQsIHVpZCwgcGlkLCBjYWxsZWVJbmZvLnNlY29uZC5tb25pdG9ycyk7CisgICAgfQorfQorCit2b2lkIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlOjpvblJlc291cmNlQWRkZWQoCisgICAgICAgIGludCB1aWQsIGludCBwaWQsIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzKSB7CisgICAgbm90aWZ5T2JzZXJ2ZXJzKE1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprQnVzeSwgdWlkLCBwaWQsIHJlc291cmNlcyk7Cit9CisKK3ZvaWQgUmVzb3VyY2VPYnNlcnZlclNlcnZpY2U6Om9uUmVzb3VyY2VSZW1vdmVkKAorICAgICAgICBpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlcykgeworICAgIG5vdGlmeU9ic2VydmVycyhNZWRpYU9ic2VydmFibGVFdmVudDo6a0lkbGUsIHVpZCwgcGlkLCByZXNvdXJjZXMpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU9ic2VydmVyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJjNWZiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaApAQCAtMCwwICsxLDk1IEBACisvKioKKyAqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9PQlNFUlZFUl9TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9PQlNFUlZFUl9TRVJWSUNFX0gKKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU9ic2VydmVyU2VydmljZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU9ic2VydmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlUGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlVHlwZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUV2ZW50OworCitjbGFzcyBSZXNvdXJjZU9ic2VydmVyU2VydmljZSA6IHB1YmxpYyBCblJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIHsKK3B1YmxpYzoKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0ICpnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yZXNvdXJjZV9vYnNlcnZlciI7IH0KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlPiBpbnN0YW50aWF0ZSgpOworCisgICAgdmlydHVhbCBpbmxpbmUgYmluZGVyX3N0YXR1c190IGR1bXAoCisgICAgICAgICAgICBpbnQgLypmZCovLCBjb25zdCBjaGFyKiogLyphcmdzKi8sIHVpbnQzMl90IC8qbnVtQXJncyovKTsKKworICAgIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+UmVzb3VyY2VPYnNlcnZlclNlcnZpY2UoKSB7fQorCisgICAgLy8gSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGludGVyZmFjZQorICAgIFN0YXR1cyByZWdpc3Rlck9ic2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4mIGluX29ic2VydmVyLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlRmlsdGVyPiYgaW5fZmlsdGVycykgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgdW5yZWdpc3Rlck9ic2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4mIGluX29ic2VydmVyKSBvdmVycmlkZTsKKyAgICAvLyB+SVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGludGVyZmFjZQorCisgICAgLy8gQ2FsbGVkIGJ5IFJlc291cmNlTWFuYWdlclNlcnZpY2Ugd2hlbiByZXNvdXJjZXMgYXJlIGFkZGVkLgorICAgIHZvaWQgb25SZXNvdXJjZUFkZGVkKGludCB1aWQsIGludCBwaWQsIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzKTsKKworICAgIC8vIENhbGxlZCBieSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHdoZW4gcmVzb3VyY2VzIGFyZSByZW1vdmVkLgorICAgIHZvaWQgb25SZXNvdXJjZVJlbW92ZWQoaW50IHVpZCwgaW50IHBpZCwgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMpOworCitwcml2YXRlOgorICAgIHN0cnVjdCBPYnNlcnZlckluZm8geworICAgICAgICA6Om5kazo6U3BBSUJpbmRlciBiaW5kZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VPYnNlcnZlcj4gb2JzZXJ2ZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVyczsKKyAgICB9OworICAgIHN0cnVjdCBEZWF0aFJlY2lwaWVudDsKKworICAgIC8vIEJlbG93IG1hcHMgYXJlIGFsbCBrZXllZCBvbiB0aGUgb2JzZXJ2ZXIncyBiaW5kZXIgcHRyIHZhbHVlLgorICAgIHVzaW5nIE9ic2VydmVySW5mb01hcCA9IHN0ZDo6bWFwPHVpbnRwdHJfdCwgT2JzZXJ2ZXJJbmZvPjsKKyAgICB1c2luZyBTdWJzY3JpYmVyTWFwID0gc3RkOjptYXA8dWludHB0cl90LCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlT2JzZXJ2ZXI+PjsKKworICAgIHN0ZDo6bXV0ZXggbU9ic2VydmVyTG9jazsKKyAgICAvLyBCaW5kZXItPk9ic2VydmVySW5mbworICAgIE9ic2VydmVySW5mb01hcCBtT2JzZXJ2ZXJJbmZvTWFwIEdVQVJERURfQlkobU9ic2VydmVyTG9jayk7CisgICAgLy8gT2JzZXJ2YWJsZSg8dHlwZSxldmVudD4pLT5TdWJzY3JpYmVycworICAgIHN0ZDo6bWFwPE1lZGlhT2JzZXJ2YWJsZUZpbHRlciwgU3Vic2NyaWJlck1hcD4gbU9ic2VydmFibGVUb1N1YnNjcmliZXJzTWFwCisgICAgICAgICAgICBHVUFSREVEX0JZKG1PYnNlcnZlckxvY2spOworCisgICAgOjpuZGs6OlNjb3BlZEFJQmluZGVyX0RlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKKworICAgIC8vIEJpbmRlciBkZWF0aCBoYW5kbGluZy4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBzRGVhdGhSZWNpcGllbnRMb2NrOworICAgIHN0YXRpYyBzdGQ6Om1hcDx1aW50cHRyX3QsIHN0ZDo6c2hhcmVkX3B0cjxEZWF0aFJlY2lwaWVudD4+IHNEZWF0aFJlY2lwaWVudE1hcAorICAgICAgICAgICAgR1VBUkRFRF9CWShzRGVhdGhSZWNpcGllbnRMb2NrKTsKKyAgICBzdGF0aWMgdm9pZCBCaW5kZXJEaWVkQ2FsbGJhY2sodm9pZCogY29va2llKTsKKworICAgIHZvaWQgbm90aWZ5T2JzZXJ2ZXJzKE1lZGlhT2JzZXJ2YWJsZUV2ZW50IGV2ZW50LAorICAgICAgICAgICAgaW50IHVpZCwgaW50IHBpZCwgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMpOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9PQlNFUlZFUl9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1RFU1RfTUFQUElORwppbmRleCA0MThiMTU5Li41MmFkNDQxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9URVNUX01BUFBJTkcKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvVEVTVF9NQVBQSU5HCkBAIC01LDYgKzUsOSBAQAogICAgIH0sCiAgICAgewogICAgICAgICJuYW1lIjogIlNlcnZpY2VMb2dfdGVzdCIKKyAgICB9LAorICAgIHsKKyAgICAgICAibmFtZSI6ICJSZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0IgogICAgIH0KICAgXQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmFpZGwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmFpZGwKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwYTUwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5haWRsCkBAIC0wLDAgKzEsMTM0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVJlc291cmNlTWFuYWdlckNsaWVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUmVzb3VyY2VQYXJjZWw7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOworCisvKioKKyAqIFJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlIHRoYXQga2VlcHMgdHJhY2sgb2YgbWVkaWEgcmVzb3VyY2UKKyAqIG93bmVkIGJ5IGNsaWVudHMsIGFuZCByZWNsYWltcyByZXNvdXJjZXMgYmFzZWQgb24gY29uZmlndXJlZCBwb2xpY2llcworICogd2hlbiBuZWNlc3NhcnkuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVJlc291cmNlTWFuYWdlclNlcnZpY2UgeworICAgIGNvbnN0IEB1dGY4SW5DcHAgU3RyaW5nIGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzCisgICAgICAgICAgICA9ICJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzIjsKKyAgICBjb25zdCBAdXRmOEluQ3BwIFN0cmluZyBrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMKKyAgICAgICAgICAgID0gInN1cHBvcnRzLXNlY3VyZS13aXRoLW5vbi1zZWN1cmUtY29kZWMiOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHRvIGFkb3B0ZWQgcGFydGljdWxhciBwb2xpY2llcyB3aGVuCisgICAgICogbWFuYWdpbmcgdGhlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb2xpY2llcyBhbiBhcnJheSBvZiBwb2xpY2llcyB0byBiZSBhZG9wdGVkLgorICAgICAqLworICAgIHZvaWQgY29uZmlnKGluIE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWxbXSBwb2xpY2llcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjbGllbnQgdG8gYSBwcm9jZXNzIHdpdGggYSBsaXN0IG9mIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaWQgcGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHVpZCB1aWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIGNsaWVudCB3aXRoaW4gdGhlIHBpZC4KKyAgICAgKiBAcGFyYW0gY2xpZW50IGludGVyZmFjZSBmb3IgdGhlIFJlc291cmNlTWFuYWdlclNlcnZpY2UgdG8gY2FsbCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHZvaWQgYWRkUmVzb3VyY2UoCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHVpZCwKKyAgICAgICAgICAgIGxvbmcgY2xpZW50SWQsCisgICAgICAgICAgICBJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBsaXN0ZWQgcmVzb3VyY2VzIGZyb20gYSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGlkIHBpZCBmcm9tIHdoaWNoIHRoZSBsaXN0IG9mIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIGZyb20gd2hpY2ggdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIGFuIGFycmF5IG9mIHJlc291cmNlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZVJlc291cmNlKGludCBwaWQsIGxvbmcgY2xpZW50SWQsIGluIE1lZGlhUmVzb3VyY2VQYXJjZWxbXSByZXNvdXJjZXMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCByZXNvdXJjZXMgZnJvbSBhIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggdGhlIGNsaWVudCdzIHJlc291cmNlcyB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGNsaWVudElkIGNsaWVudElkIHdpdGhpbiB0aGUgcGlkIHRoYXQgd2lsbCBiZSByZW1vdmVkLgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludCBwaWQsIGxvbmcgY2xpZW50SWQpOworCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gcmVjbGFpbSByZXNvdXJjZSBmcm9tIHByb2Nlc3NlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlCisgICAgICogY2FsbGluZyBwcm9jZXNzIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsaW5nUGlkIHBpZCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgYW4gYXJyYXkgb2YgcmVzb3VyY2VzIHRvIGJlIHJlY2xhaW1lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVjbGFpbSB3YXMgc3VjY2Vzc2Z1bCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gcmVjbGFpbVJlc291cmNlKGludCBjYWxsaW5nUGlkLCBpbiBNZWRpYVJlc291cmNlUGFyY2VsW10gcmVzb3VyY2VzKTsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHRoZSBwaWQgb2Ygb3JpZ2luYWwgY2FsbGluZyBwcm9jZXNzIHdpdGggdGhlIHBpZCBvZiB0aGUgcHJvY2VzcworICAgICAqIHdobyBhY3R1YWxseSB1c2UgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWxQaWQgcGlkIG9mIHRoZSBvcmlnaW5hbCBjYWxsaW5nIHByb2Nlc3MuCisgICAgICogQHBhcmFtIG5ld1BpZCBwaWQgb2YgdGhlIGFjdHVhbCBwcm9jZXNzIHdobyB1c2UgdGhlIHJlc291cmNlcy4KKyAgICAgKiAgICAgICAgcmVtb3ZlIGV4aXN0aW5nIG92ZXJyaWRlIG9uIG9yaWdpbmFsUGlkIGlmIG5ld1BpZCBpcyAtMS4KKyAgICAgKi8KKyAgICB2b2lkIG92ZXJyaWRlUGlkKGludCBvcmlnaW5hbFBpZCwgaW50IG5ld1BpZCk7CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgcHJvY2VzcyBzdGF0ZSBhbmQgT09NIHNjb3JlIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3Mgd2l0aCB0aGUKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gVGhpcyBpcyB1c2VkIGJ5IG5hdGl2ZSBzZXJ2aWNlIHByb2Nlc3NlcyB0byBzcGVjaWZ5CisgICAgICogdGhlc2UgdmFsdWVzIGZvciBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHRvIHVzZS4gUmVzb3VyY2VNYW5hZ2VyU2VydmljZSB1c3VhbGx5CisgICAgICogZ2V0cyB0aGVzZSB2YWx1ZXMgZnJvbSBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLCBob3dldmVyLCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlCisgICAgICogZG9lc24ndCB0cmFjayBuYXRpdmUgc2VydmljZSBwcm9jZXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IGEgdG9rZW4gZm9yIHRoZSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHRvIGxpbmsgdG8gdGhlIGNhbGxlciBhbmQKKyAgICAgKiAgICAgICAgICAgICAgcmVjZWl2ZSBub3RpZmljYXRpb24gaWYgaXQgZ29lcyBhd2F5LiBUaGlzIGlzIG5lZWRlZCBmb3IgY2xlYXJpbmcKKyAgICAgKiAgICAgICAgICAgICAgdGhlIG92ZXJyaWRlcy4KKyAgICAgKiBAcGFyYW0gcGlkIHBpZCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBwcm9jU3RhdGUgdGhlIHByb2Nlc3Mgc3RhdGUgdmFsdWUgdGhhdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIHNob3VsZAorICAgICAqICAgICAgICAgICAgICAgICAgdXNlIGZvciB0aGlzIHBpZC4KKyAgICAgKiBAcGFyYW0gb29tU2NvcmUgdGhlIG9vbSBzY29yZSB2YWx1ZSB0aGF0IFJlc291cmNlTWFuYWdlclNlcnZpY2Ugc2hvdWxkCisgICAgICogICAgICAgICAgICAgICAgICB1c2UgZm9yIHRoaXMgcGlkLgorICAgICAqLworICAgIHZvaWQgb3ZlcnJpZGVQcm9jZXNzSW5mbygKKyAgICAgICAgICAgIElSZXNvdXJjZU1hbmFnZXJDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgaW50IHBpZCwKKyAgICAgICAgICAgIGludCBwcm9jU3RhdGUsCisgICAgICAgICAgICBpbnQgb29tU2NvcmUpOworCisgICAgLyoqCisgICAgICogTWFyayBhIGNsaWVudCBmb3IgcGVuZGluZyByZW1vdmFsCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGlkIHBpZCBmcm9tIHdoaWNoIHRoZSBjbGllbnQncyByZXNvdXJjZXMgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEBwYXJhbSBjbGllbnRJZCBjbGllbnRJZCB3aXRoaW4gdGhlIHBpZCB0aGF0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICB2b2lkIG1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChpbnQgcGlkLCBsb25nIGNsaWVudElkKTsKKworICAgIC8qKgorICAgICAqIFJlY2xhaW0gcmVzb3VyY2VzIGZyb20gY2xpZW50cyBwZW5kaW5nIHJlbW92YWwsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaWQgcGlkIGZyb20gd2hpY2ggcmVzb3VyY2VzIHdpbGwgYmUgcmVjbGFpbWVkLgorICAgICAqLworICAgIHZvaWQgcmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoaW50IHBpZCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjAwOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVQYXJjZWw7CisKKy8qKgorICogSVJlc291cmNlT2JzZXJ2ZXIgaW50ZXJmYWNlIGZvciByZWNlaXZpbmcgb2JzZXJ2YWJsZSByZXNvdXJjZSB1cGRhdGVzCisgKiBmcm9tIElSZXNvdXJjZU9ic2VydmVyU2VydmljZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJUmVzb3VyY2VPYnNlcnZlciB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIHdoZW4gYW4gb2JzZXJ2ZWQgcmVzb3VyY2UgaXMgZ3JhbnRlZCB0byBhIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgc3RhdHVzIGNoYW5nZSB0aGF0IGhhcHBlbmVkIHRvIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gdWlkIHVpZCB0byB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKiBAcGFyYW0gcGlkIHBpZCB0byB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXNzb2NpYXRlZC4KKyAgICAgKiBAcGFyYW0gb2JzZXJ2YWJsZXMgdGhlIHJlc291cmNlcyB3aG9zZSBzdGF0dXMgaGFzIGNoYW5nZWQuCisgICAgICovCisgICAgb25ld2F5IHZvaWQgb25TdGF0dXNDaGFuZ2VkKE1lZGlhT2JzZXJ2YWJsZUV2ZW50IGV2ZW50LAorICAgICAgICBpbnQgdWlkLCBpbnQgcGlkLCBpbiBNZWRpYU9ic2VydmFibGVQYXJjZWxbXSBvYnNlcnZhYmxlcyk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmNGNhMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuSVJlc291cmNlT2JzZXJ2ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVGaWx0ZXI7CisKKy8qKgorICogSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIGludGVyZmFjZSBmb3IgcmVnaXN0ZXJpbmcgYW4gSVJlc291cmNlT2JzZXJ2ZXIKKyAqIGNhbGxiYWNrIHRvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgb2JzZXJ2YWJsZSBtZWRpYSByZXNvdXJjZXMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIG9uIHRoZSBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgdG8gcmVjZWl2ZQorICAgICAqIHN0YXR1cyB1cGRhdGVzIGZvciBvYnNlcnZhYmxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYnNlcnZlciB0aGUgb2JzZXJ2ZXIgdG8gcmVnaXN0ZXIuCisgICAgICogQHBhcmFtIGZpbHRlcnMgYW4gYXJyYXkgb2YgZmlsdGVycyBmb3IgcmVzb3VyY2VzIGFuZCBldmVudHMgdG8gcmVjZWl2ZQorICAgICAqICAgICAgICAgICAgICAgIHVwZGF0ZXMgZm9yLgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXJPYnNlcnZlcigKKyAgICAgICAgICAgIElSZXNvdXJjZU9ic2VydmVyIG9ic2VydmVyLAorICAgICAgICAgICAgaW4gTWVkaWFPYnNlcnZhYmxlRmlsdGVyW10gZmlsdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBVbnJlZ2lzdGVyIGFuIG9ic2VydmVyIGZyb20gdGhlIElSZXNvdXJjZU9ic2VydmVyU2VydmljZS4KKyAgICAgKiBUaGUgb2JzZXJ2ZXIgd2lsbCBzdG9wIHJlY2VpdmluZyB0aGUgc3RhdHVzIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgdGhlIG9ic2VydmVyIHRvIHVucmVnaXN0ZXIuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyT2JzZXJ2ZXIoSVJlc291cmNlT2JzZXJ2ZXIgb2JzZXJ2ZXIpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUV2ZW50LmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFiMjRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUV2ZW50LmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisKKy8qKgorICogRW51bXMgZm9yIG1lZGlhIG9ic2VydmFibGUgZXZlbnRzLgorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBhcyBiaXRtYXNrcyB0byBpbmRpY2F0ZSB0aGUgZXZlbnRzIHRoYXQgdGhlCisgKiBvYnNlcnZlciBpcyBpbnRlcmVzdGVkIGluIGluIHRoZSBNZWRpYU9ic2VydmFibGVGaWx0ZXIgb2JqZWN0cyBwYXNzZWQgdG8KKyAqIElSZXNvdXJjZU9ic2VydmVyU2VydmljZTo6cmVnaXN0ZXJPYnNlcnZlcigpLgorICoKKyAqIHtAaGlkZX0KKyAqLworQEJhY2tpbmcodHlwZT0ibG9uZyIpCitlbnVtIE1lZGlhT2JzZXJ2YWJsZUV2ZW50IHsKKyAgICAvKioKKyAgICAgKiBBIG1lZGlhIHJlc291cmNlIGlzIGdyYW50ZWQgdG8gYSBjbGllbnQgYW5kIGJlY29tZXMgYnVzeS4KKyAgICAgKi8KKyAgICBrQnVzeSA9IDEsCisKKyAgICAvKioKKyAgICAgKiBBIG1lZGlhIHJlc291cmNlIGlzIHJlbGVhc2VkIGJ5IGEgY2xpZW50IGFuZCBiZWNvbWVzIGlkbGUuCisgICAgICovCisgICAga0lkbGUgPSAyLAorCisgICAgLyoqCisgICAgICogQSBiaXRtYXNrIHRoYXQgY292ZXJzIGFsbCBvYnNlcnZhYmxlIGV2ZW50cyBkZWZpbmVkLgorICAgICAqLworICAgIGtBbGwgPSB+MCwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVGaWx0ZXIuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVGaWx0ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY3ZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVUeXBlOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlRXZlbnQ7CisKKy8qKgorICogRGVzY3JpcHRpb24gb2YgYW4gb2JzZXJ2YWJsZSByZXNvdXJjZSBhbmQgaXRzIGFzc29jaWF0ZWQgZXZlbnRzIHRoYXQgdGhlCisgKiBvYnNlcnZlciBpcyBpbnRlcmVzdGVkIGluLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBNZWRpYU9ic2VydmFibGVGaWx0ZXIgeworICAgIC8qKgorICAgICAqIFR5cGUgb2YgdGhlIG9ic2VydmFibGUgbWVkaWEgcmVzb3VyY2UuCisgICAgICovCisgICAgTWVkaWFPYnNlcnZhYmxlVHlwZSB0eXBlOworCisgICAgLyoqCisgICAgICogRXZlbnRzIHRoYXQgdGhlIG9ic2VydmVyIGlzIGludGVyZXN0ZWQgaW4uCisgICAgICoKKyAgICAgKiBUaGlzIGZpZWxkIGlzIGEgYml0d2lzZS1PUiBvZiB0aGUgZXZlbnRzIGluIE1lZGlhT2JzZXJ2YWJsZUV2ZW50LiBJZiBhCisgICAgICogcGFydGljdWxhciBldmVudCdzIGJpdCBpcyBzZXQsIGl0IG1lYW5zIHRoYXQgdXBkYXRlcyBzaG91bGQgYmUgc2VudCBmb3IKKyAgICAgKiB0aGF0IGV2ZW50LiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVyIGlzIG9ubHkgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcKKyAgICAgKiB1cGRhdGVzIHdoZW4gYSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSwgaXQgc2hvdWxkIG9ubHkgc2V0ICdrSWRsZScuCisgICAgICovCisgICAgTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnRGaWx0ZXI7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlUGFyY2VsLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlUGFyY2VsLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyMzNlMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlVHlwZTsKKworLyoqCisgKiBEZXNjcmlwdGlvbiBvZiBhbiBvYnNlcnZhYmxlIHJlc291cmNlIHdob3NlIHN0YXR1cyBoYXMgY2hhbmdlZC4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgTWVkaWFPYnNlcnZhYmxlUGFyY2VsIHsKKyAgICAvKioKKyAgICAgKiBUeXBlIG9mIHRoZSBvYnNlcnZhYmxlIG1lZGlhIHJlc291cmNlLgorICAgICAqLworICAgIE1lZGlhT2JzZXJ2YWJsZVR5cGUgdHlwZTsvLyA9IE1lZGlhT2JzZXJ2YWJsZVR5cGU6OmtJbnZhbGlkOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBvYnNlcnZhYmxlIHJlc291cmNlIChudW1iZXIgb2YgY29kZWNzLCBieXRlcyBvZgorICAgICAqIGdyYXBoaWMgbWVtb3J5LCBldGMuKS4KKyAgICAgKi8KKyAgICBsb25nIHZhbHVlID0gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjAyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlVHlwZS5haWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworCisvKioKKyAqIFR5cGUgZW51bXMgb2Ygb2JzZXJ2YWJsZSBtZWRpYSByZXNvdXJjZXMuCisgKgorICoge0BoaWRlfQorICovCitAQmFja2luZyh0eXBlPSJpbnQiKQorZW51bSBNZWRpYU9ic2VydmFibGVUeXBlIHsKKyAgICBrSW52YWxpZCA9IDAsCisKKyAgICAvL2tWaWRlb1N0YXJ0ID0gMTAwMCwKKyAgICBrVmlkZW9TZWN1cmVDb2RlYyA9IDEwMDAsCisgICAga1ZpZGVvTm9uU2VjdXJlQ29kZWMgPSAxMDAxLAorCisgICAgLy9rQXVkaW9TdGFydCA9IDIwMDAsCisKKyAgICAvL2tHcmFwaGljTWVtb3J5ID0gMzAwMCwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlUGFyY2VsLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBhcmNlbC5haWRsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBhcmNlbC5haWRsCnJlbmFtZSB0byBzZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBhcmNlbC5haWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeVBhcmNlbC5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWwuYWlkbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWwuYWlkbApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWwuYWlkbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVN1YlR5cGUuYWlkbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VTdWJUeXBlLmFpZGwKcmVuYW1lIHRvIHNlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlU3ViVHlwZS5haWRsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVR5cGUuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGwvYW5kcm9pZC9tZWRpYS9NZWRpYVJlc291cmNlVHlwZS5haWRsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9haWRsL2FuZHJvaWQvbWVkaWEvTWVkaWFSZXNvdXJjZVR5cGUuYWlkbApyZW5hbWUgdG8gc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbC9hbmRyb2lkL21lZGlhL01lZGlhUmVzb3VyY2VUeXBlLmFpZGwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS8uaGFzaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS8uaGFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjkwZmZiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS8xLy5oYXNoCkBAIC0wLDAgKzEgQEAKKzdlMTk4MjgxNDM0ZTljNjc5YjAyMjY1ZTk1YzUxZWEyNWVkMTgwZDMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU9ic2VydmVyLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTBlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRISVMgRklMRSBJUyBJTU1VVEFCTEUuIERPIE5PVCBFRElUIElOIEFOWSBDQVNFLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBmaWxlIGlzIGEgc25hcHNob3Qgb2YgYW4gQUlETCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4gVGhlcmUgYXJlCisvLyB0d28gY2FzZXM6CisvLyAxKS4gdGhpcyBpcyBhIGZyb3plbiB2ZXJzaW9uIGZpbGUgLSBkbyBub3QgZWRpdCB0aGlzIGluIGFueSBjYXNlLgorLy8gMikuIHRoaXMgaXMgYSAnY3VycmVudCcgZmlsZS4gSWYgeW91IG1ha2UgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2UgdG8KKy8vICAgICB0aGUgaW50ZXJmYWNlIChmcm9tIHRoZSBsYXRlc3QgZnJvemVuIHZlcnNpb24pLCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwKKy8vICAgICBwcm9tcHQgeW91IHRvIHVwZGF0ZSB0aGlzIGZpbGUgd2l0aCBgbSA8bmFtZT4tdXBkYXRlLWFwaWAuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIGFueSBBSURMIGZpbGUgYnVpbHQKKy8vIHdpdGggdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZSB0eXBlIHdpdGggdmVyc2lvbnMgcHJvcGVydHkgc2V0LiBUaGUgbW9kdWxlCisvLyB0eXBlIGlzIHVzZWQgdG8gYnVpbGQgQUlETCBmaWxlcyBpbiBhIHdheSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWNyb3NzCisvLyBpbmRlcGVuZGVudGx5IHVwZGF0YWJsZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlIGlzIHNoaXBwZWQKKy8vIHdpdGggc3VjaCBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGl0IGhhcyBhIGhpZ2ggcmlzayBvZiBicmVha2luZworLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKy8qIEBoaWRlICovCitpbnRlcmZhY2UgSVJlc291cmNlT2JzZXJ2ZXIgeworICBvbmV3YXkgdm9pZCBvblN0YXR1c0NoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVFdmVudCBldmVudCwgaW50IHVpZCwgaW50IHBpZCwgaW4gYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVQYXJjZWxbXSBvYnNlcnZhYmxlcyk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS9hbmRyb2lkL21lZGlhL0lSZXNvdXJjZU9ic2VydmVyU2VydmljZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDYwYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuIFRoZXJlIGFyZQorLy8gdHdvIGNhc2VzOgorLy8gMSkuIHRoaXMgaXMgYSBmcm96ZW4gdmVyc2lvbiBmaWxlIC0gZG8gbm90IGVkaXQgdGhpcyBpbiBhbnkgY2FzZS4KKy8vIDIpLiB0aGlzIGlzIGEgJ2N1cnJlbnQnIGZpbGUuIElmIHlvdSBtYWtlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlIHRvCisvLyAgICAgdGhlIGludGVyZmFjZSAoZnJvbSB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uKSwgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsCisvLyAgICAgcHJvbXB0IHlvdSB0byB1cGRhdGUgdGhpcyBmaWxlIHdpdGggYG0gPG5hbWU+LXVwZGF0ZS1hcGlgLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbnkgQUlETCBmaWxlIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisvKiBAaGlkZSAqLworaW50ZXJmYWNlIElSZXNvdXJjZU9ic2VydmVyU2VydmljZSB7CisgIHZvaWQgcmVnaXN0ZXJPYnNlcnZlcihhbmRyb2lkLm1lZGlhLklSZXNvdXJjZU9ic2VydmVyIG9ic2VydmVyLCBpbiBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZUZpbHRlcltdIGZpbHRlcnMpOworICB2b2lkIHVucmVnaXN0ZXJPYnNlcnZlcihhbmRyb2lkLm1lZGlhLklSZXNvdXJjZU9ic2VydmVyIG9ic2VydmVyKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUV2ZW50LmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWYwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVFdmVudC5haWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRISVMgRklMRSBJUyBJTU1VVEFCTEUuIERPIE5PVCBFRElUIElOIEFOWSBDQVNFLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBmaWxlIGlzIGEgc25hcHNob3Qgb2YgYW4gQUlETCBmaWxlLiBEbyBub3QgZWRpdCBpdCBtYW51YWxseS4gVGhlcmUgYXJlCisvLyB0d28gY2FzZXM6CisvLyAxKS4gdGhpcyBpcyBhIGZyb3plbiB2ZXJzaW9uIGZpbGUgLSBkbyBub3QgZWRpdCB0aGlzIGluIGFueSBjYXNlLgorLy8gMikuIHRoaXMgaXMgYSAnY3VycmVudCcgZmlsZS4gSWYgeW91IG1ha2UgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBjaGFuZ2UgdG8KKy8vICAgICB0aGUgaW50ZXJmYWNlIChmcm9tIHRoZSBsYXRlc3QgZnJvemVuIHZlcnNpb24pLCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwKKy8vICAgICBwcm9tcHQgeW91IHRvIHVwZGF0ZSB0aGlzIGZpbGUgd2l0aCBgbSA8bmFtZT4tdXBkYXRlLWFwaWAuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIGFueSBBSURMIGZpbGUgYnVpbHQKKy8vIHdpdGggdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZSB0eXBlIHdpdGggdmVyc2lvbnMgcHJvcGVydHkgc2V0LiBUaGUgbW9kdWxlCisvLyB0eXBlIGlzIHVzZWQgdG8gYnVpbGQgQUlETCBmaWxlcyBpbiBhIHdheSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWNyb3NzCisvLyBpbmRlcGVuZGVudGx5IHVwZGF0YWJsZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlIGlzIHNoaXBwZWQKKy8vIHdpdGggc3VjaCBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGl0IGhhcyBhIGhpZ2ggcmlzayBvZiBicmVha2luZworLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKy8qIEBoaWRlICovCitAQmFja2luZyh0eXBlPSJsb25nIikKK2VudW0gTWVkaWFPYnNlcnZhYmxlRXZlbnQgeworICBrQnVzeSA9IDEsCisgIGtJZGxlID0gMiwKKyAga0FsbCA9IC0xLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS8xL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRmlsdGVyLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVGaWx0ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmFlMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS8xL2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRmlsdGVyLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEhJUyBGSUxFIElTIElNTVVUQUJMRS4gRE8gTk9UIEVESVQgSU4gQU5ZIENBU0UuICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGZpbGUgaXMgYSBzbmFwc2hvdCBvZiBhbiBBSURMIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LiBUaGVyZSBhcmUKKy8vIHR3byBjYXNlczoKKy8vIDEpLiB0aGlzIGlzIGEgZnJvemVuIHZlcnNpb24gZmlsZSAtIGRvIG5vdCBlZGl0IHRoaXMgaW4gYW55IGNhc2UuCisvLyAyKS4gdGhpcyBpcyBhICdjdXJyZW50JyBmaWxlLiBJZiB5b3UgbWFrZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIGNoYW5nZSB0bworLy8gICAgIHRoZSBpbnRlcmZhY2UgKGZyb20gdGhlIGxhdGVzdCBmcm96ZW4gdmVyc2lvbiksIHRoZSBidWlsZCBzeXN0ZW0gd2lsbAorLy8gICAgIHByb21wdCB5b3UgdG8gdXBkYXRlIHRoaXMgZmlsZSB3aXRoIGBtIDxuYW1lPi11cGRhdGUtYXBpYC4KKy8vCisvLyBZb3UgbXVzdCBub3QgbWFrZSBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW55IEFJREwgZmlsZSBidWlsdAorLy8gd2l0aCB0aGUgYWlkbF9pbnRlcmZhY2UgbW9kdWxlIHR5cGUgd2l0aCB2ZXJzaW9ucyBwcm9wZXJ0eSBzZXQuIFRoZSBtb2R1bGUKKy8vIHR5cGUgaXMgdXNlZCB0byBidWlsZCBBSURMIGZpbGVzIGluIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhY3Jvc3MKKy8vIGluZGVwZW5kZW50bHkgdXBkYXRhYmxlIGNvbXBvbmVudHMgb2YgdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UgaXMgc2hpcHBlZAorLy8gd2l0aCBzdWNoIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSwgaXQgaGFzIGEgaGlnaCByaXNrIG9mIGJyZWFraW5nCisvLyBsYXRlciB3aGVuIGEgbW9kdWxlIHVzaW5nIHRoZSBpbnRlcmZhY2UgaXMgdXBkYXRlZCwgZS5nLiwgTWFpbmxpbmUgbW9kdWxlcy4KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworLyogQGhpZGUgKi8KK3BhcmNlbGFibGUgTWVkaWFPYnNlcnZhYmxlRmlsdGVyIHsKKyAgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVUeXBlIHR5cGU7CisgIGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnRGaWx0ZXI7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVBhcmNlbC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzBkODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbApAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuIFRoZXJlIGFyZQorLy8gdHdvIGNhc2VzOgorLy8gMSkuIHRoaXMgaXMgYSBmcm96ZW4gdmVyc2lvbiBmaWxlIC0gZG8gbm90IGVkaXQgdGhpcyBpbiBhbnkgY2FzZS4KKy8vIDIpLiB0aGlzIGlzIGEgJ2N1cnJlbnQnIGZpbGUuIElmIHlvdSBtYWtlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlIHRvCisvLyAgICAgdGhlIGludGVyZmFjZSAoZnJvbSB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uKSwgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsCisvLyAgICAgcHJvbXB0IHlvdSB0byB1cGRhdGUgdGhpcyBmaWxlIHdpdGggYG0gPG5hbWU+LXVwZGF0ZS1hcGlgLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbnkgQUlETCBmaWxlIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisvKiBAaGlkZSAqLworcGFyY2VsYWJsZSBNZWRpYU9ic2VydmFibGVQYXJjZWwgeworICBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZVR5cGUgdHlwZTsKKyAgbG9uZyB2YWx1ZSA9IDA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlLzEvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiM2YzZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvMS9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZVR5cGUuYWlkbApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgZmlsZS4gRG8gbm90IGVkaXQgaXQgbWFudWFsbHkuIFRoZXJlIGFyZQorLy8gdHdvIGNhc2VzOgorLy8gMSkuIHRoaXMgaXMgYSBmcm96ZW4gdmVyc2lvbiBmaWxlIC0gZG8gbm90IGVkaXQgdGhpcyBpbiBhbnkgY2FzZS4KKy8vIDIpLiB0aGlzIGlzIGEgJ2N1cnJlbnQnIGZpbGUuIElmIHlvdSBtYWtlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgY2hhbmdlIHRvCisvLyAgICAgdGhlIGludGVyZmFjZSAoZnJvbSB0aGUgbGF0ZXN0IGZyb3plbiB2ZXJzaW9uKSwgdGhlIGJ1aWxkIHN5c3RlbSB3aWxsCisvLyAgICAgcHJvbXB0IHlvdSB0byB1cGRhdGUgdGhpcyBmaWxlIHdpdGggYG0gPG5hbWU+LXVwZGF0ZS1hcGlgLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSB0byBhbnkgQUlETCBmaWxlIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisvKiBAaGlkZSAqLworQEJhY2tpbmcodHlwZT0iaW50IikKK2VudW0gTWVkaWFPYnNlcnZhYmxlVHlwZSB7CisgIGtJbnZhbGlkID0gMCwKKyAga1ZpZGVvU2VjdXJlQ29kZWMgPSAxMDAwLAorICBrVmlkZW9Ob25TZWN1cmVDb2RlYyA9IDEwMDEsCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlci5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI3MDRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXIuYWlkbApAQCAtMCwwICsxLDIyIEBACisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgaW50ZXJmYWNlIChvciBwYXJjZWxhYmxlKS4gRG8gbm90IHRyeSB0bworLy8gZWRpdCB0aGlzIGZpbGUuIEl0IGxvb2tzIGxpa2UgeW91IGFyZSBkb2luZyB0aGF0IGJlY2F1c2UgeW91IGhhdmUgbW9kaWZpZWQKKy8vIGFuIEFJREwgaW50ZXJmYWNlIGluIGEgYmFja3dhcmQtaW5jb21wYXRpYmxlIHdheSwgZS5nLiwgZGVsZXRpbmcgYSBmdW5jdGlvbgorLy8gZnJvbSBhbiBpbnRlcmZhY2Ugb3IgYSBmaWVsZCBmcm9tIGEgcGFyY2VsYWJsZSBhbmQgaXQgYnJva2UgdGhlIGJ1aWxkLiBUaGF0CisvLyBicmVha2FnZSBpcyBpbnRlbmRlZC4KKy8vCisvLyBZb3UgbXVzdCBub3QgbWFrZSBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBBSURMIGZpbGVzIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisvKiBAaGlkZSAqLworaW50ZXJmYWNlIElSZXNvdXJjZU9ic2VydmVyIHsKKyAgb25ld2F5IHZvaWQgb25TdGF0dXNDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlRXZlbnQgZXZlbnQsIGludCB1aWQsIGludCBwaWQsIGluIGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlUGFyY2VsW10gb2JzZXJ2YWJsZXMpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGVmNzYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvSVJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlLmFpZGwKQEAgLTAsMCArMSwyMyBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEhJUyBGSUxFIElTIElNTVVUQUJMRS4gRE8gTk9UIEVESVQgSU4gQU5ZIENBU0UuICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGZpbGUgaXMgYSBzbmFwc2hvdCBvZiBhbiBBSURMIGludGVyZmFjZSAob3IgcGFyY2VsYWJsZSkuIERvIG5vdCB0cnkgdG8KKy8vIGVkaXQgdGhpcyBmaWxlLiBJdCBsb29rcyBsaWtlIHlvdSBhcmUgZG9pbmcgdGhhdCBiZWNhdXNlIHlvdSBoYXZlIG1vZGlmaWVkCisvLyBhbiBBSURMIGludGVyZmFjZSBpbiBhIGJhY2t3YXJkLWluY29tcGF0aWJsZSB3YXksIGUuZy4sIGRlbGV0aW5nIGEgZnVuY3Rpb24KKy8vIGZyb20gYW4gaW50ZXJmYWNlIG9yIGEgZmllbGQgZnJvbSBhIHBhcmNlbGFibGUgYW5kIGl0IGJyb2tlIHRoZSBidWlsZC4gVGhhdAorLy8gYnJlYWthZ2UgaXMgaW50ZW5kZWQuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUgQUlETCBmaWxlcyBidWlsdAorLy8gd2l0aCB0aGUgYWlkbF9pbnRlcmZhY2UgbW9kdWxlIHR5cGUgd2l0aCB2ZXJzaW9ucyBwcm9wZXJ0eSBzZXQuIFRoZSBtb2R1bGUKKy8vIHR5cGUgaXMgdXNlZCB0byBidWlsZCBBSURMIGZpbGVzIGluIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhY3Jvc3MKKy8vIGluZGVwZW5kZW50bHkgdXBkYXRhYmxlIGNvbXBvbmVudHMgb2YgdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UgaXMgc2hpcHBlZAorLy8gd2l0aCBzdWNoIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSwgaXQgaGFzIGEgaGlnaCByaXNrIG9mIGJyZWFraW5nCisvLyBsYXRlciB3aGVuIGEgbW9kdWxlIHVzaW5nIHRoZSBpbnRlcmZhY2UgaXMgdXBkYXRlZCwgZS5nLiwgTWFpbmxpbmUgbW9kdWxlcy4KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworLyogQGhpZGUgKi8KK2ludGVyZmFjZSBJUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UgeworICB2b2lkIHJlZ2lzdGVyT2JzZXJ2ZXIoYW5kcm9pZC5tZWRpYS5JUmVzb3VyY2VPYnNlcnZlciBvYnNlcnZlciwgaW4gYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVGaWx0ZXJbXSBmaWx0ZXJzKTsKKyAgdm9pZCB1bnJlZ2lzdGVyT2JzZXJ2ZXIoYW5kcm9pZC5tZWRpYS5JUmVzb3VyY2VPYnNlcnZlciBvYnNlcnZlcik7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVFdmVudC5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDYwYmVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRXZlbnQuYWlkbApAQCAtMCwwICsxLDI1IEBACisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUSElTIEZJTEUgSVMgSU1NVVRBQkxFLiBETyBOT1QgRURJVCBJTiBBTlkgQ0FTRS4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFRoaXMgZmlsZSBpcyBhIHNuYXBzaG90IG9mIGFuIEFJREwgaW50ZXJmYWNlIChvciBwYXJjZWxhYmxlKS4gRG8gbm90IHRyeSB0bworLy8gZWRpdCB0aGlzIGZpbGUuIEl0IGxvb2tzIGxpa2UgeW91IGFyZSBkb2luZyB0aGF0IGJlY2F1c2UgeW91IGhhdmUgbW9kaWZpZWQKKy8vIGFuIEFJREwgaW50ZXJmYWNlIGluIGEgYmFja3dhcmQtaW5jb21wYXRpYmxlIHdheSwgZS5nLiwgZGVsZXRpbmcgYSBmdW5jdGlvbgorLy8gZnJvbSBhbiBpbnRlcmZhY2Ugb3IgYSBmaWVsZCBmcm9tIGEgcGFyY2VsYWJsZSBhbmQgaXQgYnJva2UgdGhlIGJ1aWxkLiBUaGF0CisvLyBicmVha2FnZSBpcyBpbnRlbmRlZC4KKy8vCisvLyBZb3UgbXVzdCBub3QgbWFrZSBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBBSURMIGZpbGVzIGJ1aWx0CisvLyB3aXRoIHRoZSBhaWRsX2ludGVyZmFjZSBtb2R1bGUgdHlwZSB3aXRoIHZlcnNpb25zIHByb3BlcnR5IHNldC4gVGhlIG1vZHVsZQorLy8gdHlwZSBpcyB1c2VkIHRvIGJ1aWxkIEFJREwgZmlsZXMgaW4gYSB3YXkgdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFjcm9zcworLy8gaW5kZXBlbmRlbnRseSB1cGRhdGFibGUgY29tcG9uZW50cyBvZiB0aGUgc3lzdGVtLiBJZiBhIGRldmljZSBpcyBzaGlwcGVkCisvLyB3aXRoIHN1Y2ggYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlLCBpdCBoYXMgYSBoaWdoIHJpc2sgb2YgYnJlYWtpbmcKKy8vIGxhdGVyIHdoZW4gYSBtb2R1bGUgdXNpbmcgdGhlIGludGVyZmFjZSBpcyB1cGRhdGVkLCBlLmcuLCBNYWlubGluZSBtb2R1bGVzLgorCitwYWNrYWdlIGFuZHJvaWQubWVkaWE7CisvKiBAaGlkZSAqLworQEJhY2tpbmcodHlwZT0ibG9uZyIpCitlbnVtIE1lZGlhT2JzZXJ2YWJsZUV2ZW50IHsKKyAga0J1c3kgPSAxLAorICBrSWRsZSA9IDIsCisgIGtBbGwgPSAtMSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlRmlsdGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0NWFlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2FpZGxfYXBpL3Jlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UvY3VycmVudC9hbmRyb2lkL21lZGlhL01lZGlhT2JzZXJ2YWJsZUZpbHRlci5haWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRISVMgRklMRSBJUyBJTU1VVEFCTEUuIERPIE5PVCBFRElUIElOIEFOWSBDQVNFLiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVGhpcyBmaWxlIGlzIGEgc25hcHNob3Qgb2YgYW4gQUlETCBpbnRlcmZhY2UgKG9yIHBhcmNlbGFibGUpLiBEbyBub3QgdHJ5IHRvCisvLyBlZGl0IHRoaXMgZmlsZS4gSXQgbG9va3MgbGlrZSB5b3UgYXJlIGRvaW5nIHRoYXQgYmVjYXVzZSB5b3UgaGF2ZSBtb2RpZmllZAorLy8gYW4gQUlETCBpbnRlcmZhY2UgaW4gYSBiYWNrd2FyZC1pbmNvbXBhdGlibGUgd2F5LCBlLmcuLCBkZWxldGluZyBhIGZ1bmN0aW9uCisvLyBmcm9tIGFuIGludGVyZmFjZSBvciBhIGZpZWxkIGZyb20gYSBwYXJjZWxhYmxlIGFuZCBpdCBicm9rZSB0aGUgYnVpbGQuIFRoYXQKKy8vIGJyZWFrYWdlIGlzIGludGVuZGVkLgorLy8KKy8vIFlvdSBtdXN0IG5vdCBtYWtlIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIEFJREwgZmlsZXMgYnVpbHQKKy8vIHdpdGggdGhlIGFpZGxfaW50ZXJmYWNlIG1vZHVsZSB0eXBlIHdpdGggdmVyc2lvbnMgcHJvcGVydHkgc2V0LiBUaGUgbW9kdWxlCisvLyB0eXBlIGlzIHVzZWQgdG8gYnVpbGQgQUlETCBmaWxlcyBpbiBhIHdheSB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYWNyb3NzCisvLyBpbmRlcGVuZGVudGx5IHVwZGF0YWJsZSBjb21wb25lbnRzIG9mIHRoZSBzeXN0ZW0uIElmIGEgZGV2aWNlIGlzIHNoaXBwZWQKKy8vIHdpdGggc3VjaCBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2UsIGl0IGhhcyBhIGhpZ2ggcmlzayBvZiBicmVha2luZworLy8gbGF0ZXIgd2hlbiBhIG1vZHVsZSB1c2luZyB0aGUgaW50ZXJmYWNlIGlzIHVwZGF0ZWQsIGUuZy4sIE1haW5saW5lIG1vZHVsZXMuCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKy8qIEBoaWRlICovCitwYXJjZWxhYmxlIE1lZGlhT2JzZXJ2YWJsZUZpbHRlciB7CisgIGFuZHJvaWQubWVkaWEuTWVkaWFPYnNlcnZhYmxlVHlwZSB0eXBlOworICBhbmRyb2lkLm1lZGlhLk1lZGlhT2JzZXJ2YWJsZUV2ZW50IGV2ZW50RmlsdGVyOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlUGFyY2VsLmFpZGwgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVQYXJjZWwuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVhOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlUGFyY2VsLmFpZGwKQEAgLTAsMCArMSwyMyBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEhJUyBGSUxFIElTIElNTVVUQUJMRS4gRE8gTk9UIEVESVQgSU4gQU5ZIENBU0UuICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGZpbGUgaXMgYSBzbmFwc2hvdCBvZiBhbiBBSURMIGludGVyZmFjZSAob3IgcGFyY2VsYWJsZSkuIERvIG5vdCB0cnkgdG8KKy8vIGVkaXQgdGhpcyBmaWxlLiBJdCBsb29rcyBsaWtlIHlvdSBhcmUgZG9pbmcgdGhhdCBiZWNhdXNlIHlvdSBoYXZlIG1vZGlmaWVkCisvLyBhbiBBSURMIGludGVyZmFjZSBpbiBhIGJhY2t3YXJkLWluY29tcGF0aWJsZSB3YXksIGUuZy4sIGRlbGV0aW5nIGEgZnVuY3Rpb24KKy8vIGZyb20gYW4gaW50ZXJmYWNlIG9yIGEgZmllbGQgZnJvbSBhIHBhcmNlbGFibGUgYW5kIGl0IGJyb2tlIHRoZSBidWlsZC4gVGhhdAorLy8gYnJlYWthZ2UgaXMgaW50ZW5kZWQuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUgQUlETCBmaWxlcyBidWlsdAorLy8gd2l0aCB0aGUgYWlkbF9pbnRlcmZhY2UgbW9kdWxlIHR5cGUgd2l0aCB2ZXJzaW9ucyBwcm9wZXJ0eSBzZXQuIFRoZSBtb2R1bGUKKy8vIHR5cGUgaXMgdXNlZCB0byBidWlsZCBBSURMIGZpbGVzIGluIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhY3Jvc3MKKy8vIGluZGVwZW5kZW50bHkgdXBkYXRhYmxlIGNvbXBvbmVudHMgb2YgdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UgaXMgc2hpcHBlZAorLy8gd2l0aCBzdWNoIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSwgaXQgaGFzIGEgaGlnaCByaXNrIG9mIGJyZWFraW5nCisvLyBsYXRlciB3aGVuIGEgbW9kdWxlIHVzaW5nIHRoZSBpbnRlcmZhY2UgaXMgdXBkYXRlZCwgZS5nLiwgTWFpbmxpbmUgbW9kdWxlcy4KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworLyogQGhpZGUgKi8KK3BhcmNlbGFibGUgTWVkaWFPYnNlcnZhYmxlUGFyY2VsIHsKKyAgYW5kcm9pZC5tZWRpYS5NZWRpYU9ic2VydmFibGVUeXBlIHR5cGU7CisgIGxvbmcgdmFsdWUgPSAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlVHlwZS5haWRsIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvYWlkbF9hcGkvcmVzb3VyY2VvYnNlcnZlcl9haWRsX2ludGVyZmFjZS9jdXJyZW50L2FuZHJvaWQvbWVkaWEvTWVkaWFPYnNlcnZhYmxlVHlwZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjhkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9haWRsX2FwaS9yZXNvdXJjZW9ic2VydmVyX2FpZGxfaW50ZXJmYWNlL2N1cnJlbnQvYW5kcm9pZC9tZWRpYS9NZWRpYU9ic2VydmFibGVUeXBlLmFpZGwKQEAgLTAsMCArMSwyNSBAQAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVEhJUyBGSUxFIElTIElNTVVUQUJMRS4gRE8gTk9UIEVESVQgSU4gQU5ZIENBU0UuICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvLyBUaGlzIGZpbGUgaXMgYSBzbmFwc2hvdCBvZiBhbiBBSURMIGludGVyZmFjZSAob3IgcGFyY2VsYWJsZSkuIERvIG5vdCB0cnkgdG8KKy8vIGVkaXQgdGhpcyBmaWxlLiBJdCBsb29rcyBsaWtlIHlvdSBhcmUgZG9pbmcgdGhhdCBiZWNhdXNlIHlvdSBoYXZlIG1vZGlmaWVkCisvLyBhbiBBSURMIGludGVyZmFjZSBpbiBhIGJhY2t3YXJkLWluY29tcGF0aWJsZSB3YXksIGUuZy4sIGRlbGV0aW5nIGEgZnVuY3Rpb24KKy8vIGZyb20gYW4gaW50ZXJmYWNlIG9yIGEgZmllbGQgZnJvbSBhIHBhcmNlbGFibGUgYW5kIGl0IGJyb2tlIHRoZSBidWlsZC4gVGhhdAorLy8gYnJlYWthZ2UgaXMgaW50ZW5kZWQuCisvLworLy8gWW91IG11c3Qgbm90IG1ha2UgYSBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUgQUlETCBmaWxlcyBidWlsdAorLy8gd2l0aCB0aGUgYWlkbF9pbnRlcmZhY2UgbW9kdWxlIHR5cGUgd2l0aCB2ZXJzaW9ucyBwcm9wZXJ0eSBzZXQuIFRoZSBtb2R1bGUKKy8vIHR5cGUgaXMgdXNlZCB0byBidWlsZCBBSURMIGZpbGVzIGluIGEgd2F5IHRoYXQgdGhleSBjYW4gYmUgdXNlZCBhY3Jvc3MKKy8vIGluZGVwZW5kZW50bHkgdXBkYXRhYmxlIGNvbXBvbmVudHMgb2YgdGhlIHN5c3RlbS4gSWYgYSBkZXZpY2UgaXMgc2hpcHBlZAorLy8gd2l0aCBzdWNoIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIGNoYW5nZSwgaXQgaGFzIGEgaGlnaCByaXNrIG9mIGJyZWFraW5nCisvLyBsYXRlciB3aGVuIGEgbW9kdWxlIHVzaW5nIHRoZSBpbnRlcmZhY2UgaXMgdXBkYXRlZCwgZS5nLiwgTWFpbmxpbmUgbW9kdWxlcy4KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhOworLyogQGhpZGUgKi8KK0BCYWNraW5nKHR5cGU9ImludCIpCitlbnVtIE1lZGlhT2JzZXJ2YWJsZVR5cGUgeworICBrSW52YWxpZCA9IDAsCisgIGtWaWRlb1NlY3VyZUNvZGVjID0gMTAwMCwKKyAga1ZpZGVvTm9uU2VjdXJlQ29kZWMgPSAxMDAxLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM4NWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplciIsCisgICAgc3JjczogWworICAgICAgICAibWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9SRUFETUUubWQgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDBiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDYgQEAKKyMgRnV6emVyIGZvciBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIGlzIGRlc2lnbmVkIGJhc2VkIG9uIHRoZQordW5kZXJzdGFuZGluZyBvZiB0aGUgc2VydmljZSBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitUaGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBub3QgaGFyZGNvZGVkLCBidXQgaW5zdGVhZCBzZWxlY3RlZCBiYXNlZCBvbgoraW5jb21pbmcgZGF0YS4gVGhpcyBlbnN1cmVzIG1vcmUgY29kZSBwYXRocyBhcmUgcmVhY2hlZCBieSB0aGUgZnV6emVyLgorCitNZWRpYSBSZXNvdXJjZSBNYW5hZ2VyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKzEuIE1lZGlhIFJlc291cmNlIFR5cGUgKHBhcmFtZXRlciBuYW1lOiBgbWVkaWFSZXNvdXJjZVR5cGVgKQorMi4gTWVkaWEgUmVzb3VyY2UgU3ViVHlwZSAocGFyYW1ldGVyIG5hbWU6IGBtZWRpYVJlc291cmNlU3ViVHlwZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgbWVkaWFSZXNvdXJjZVR5cGVgIHwgMC5gTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjYCAxLmBNZWRpYVJlc291cmNlOjprTm9uU2VjdXJlQ29kZWNDYCAyLmBNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeWAgMy5gTWVkaWFSZXNvdXJjZTo6a0NwdUJvb3N0YCAgNC5gTWVkaWFSZXNvdXJjZTo6a0JhdHRlcnlgIDUuYE1lZGlhUmVzb3VyY2U6OmtEcm1TZXNzaW9uYHwgVmFsdWUgb2J0YWluZWQgZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgbWVkaWFSZXNvdXJjZVN1YlR5cGVgICAgfCAwLmBNZWRpYVJlc291cmNlOjprQXVkaW9Db2RlY2AgMS5gTWVkaWFSZXNvdXJjZTo6a1ZpZGVvQ29kZWNgIDIuYE1lZGlhUmVzb3VyY2U6OmtVbnNwZWNpZmllZFN1YlR5cGVgICB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyL21lZGlhcmVzb3VyY2VtYW5hZ2VyX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL2Z1enplci9tZWRpYXJlc291cmNlbWFuYWdlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTBiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9mdXp6ZXIvbWVkaWFyZXNvdXJjZW1hbmFnZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDI5OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlIDxTZXJ2aWNlTG9nLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU1hbmFnZXJDbGllbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTsKK3VzaW5nIE1lZFJlc1R5cGUgPSBhaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFSZXNvdXJjZVR5cGU7Cit1c2luZyBNZWRSZXNTdWJUeXBlID0gYWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VTdWJUeXBlOworCitjb25zdCBzaXplX3Qga01heFN0cmluZ0xlbmd0aCA9IDEwMDsKK2NvbnN0IGludDMyX3Qga01heFNlcnZpY2VMb2cgPSAxMDA7Citjb25zdCBpbnQzMl90IGtNaW5TZXJ2aWNlTG9nID0gMTsKK2NvbnN0IGludDMyX3Qga01pblJlc291cmNlVHlwZSA9IDA7Citjb25zdCBpbnQzMl90IGtNYXhSZXNvdXJjZVR5cGUgPSAxMDsKK2NvbnN0IGludDMyX3Qga01pblRocmVhZFBhaXJzID0gMTsKK2NvbnN0IGludDMyX3Qga01heFRocmVhZFBhaXJzID0gMzsKKworY29uc3Qgc3RyaW5nIGtQb2xpY3lUeXBlW10gPSB7SVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmtQb2xpY3lTdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlY307CisKK3N0cnVjdCByZXNvdXJjZVRocmVhZEFyZ3MgeworICAgIGludDMyX3QgcGlkOworICAgIGludDMyX3QgdWlkOworICAgIGludDY0X3QgdGVzdENsaWVudElkOworICAgIHNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZTsKKyAgICBzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IHRlc3RDbGllbnQ7CisgICAgdmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IG1lZGlhUmVzb3VyY2U7Cit9OworCitzdGF0aWMgaW50NjRfdCBnZXRJZChjb25zdCBzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQpIHsKKyAgICByZXR1cm4gKGludDY0X3QpY2xpZW50LmdldCgpOworfQorCitzdHJ1Y3QgVGVzdFByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKKyAgICBUZXN0UHJvY2Vzc0luZm8oKSB7fQorICAgIHZpcnR1YWwgflRlc3RQcm9jZXNzSW5mbygpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50KiBwcmlvcml0eSkgeworICAgICAgICAvLyBGb3IgdGVzdGluZywgdXNlIHBpZCBhcyBwcmlvcml0eS4KKyAgICAgICAgLy8gTG93ZXIgdGhlIHZhbHVlIGhpZ2hlciB0aGUgcHJpb3JpdHkuCisgICAgICAgICpwcmlvcml0eSA9IHBpZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKGludCAvKiBwaWQgKi8sIGludCAvKnByb2NTdGF0ZSovLCBpbnQgLypvb21TY29yZSovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUHJvY2Vzc0luZm9PdmVycmlkZShpbnQgLyogcGlkICovKSB7IHJldHVybjsgfQorCisgICBwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RQcm9jZXNzSW5mbyk7Cit9OworCitzdHJ1Y3QgVGVzdFN5c3RlbUNhbGxiYWNrIDogcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OlN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBUZXN0U3lzdGVtQ2FsbGJhY2soKSA6IG1MYXN0RXZlbnQoe0V2ZW50VHlwZTo6SU5WQUxJRCwgMH0pLCBtRXZlbnRDb3VudCgwKSB7fQorCisgICAgZW51bSBFdmVudFR5cGUgeworICAgICAgICBJTlZBTElEID0gLTEsCisgICAgICAgIFZJREVPX09OID0gMCwKKyAgICAgICAgVklERU9fT0ZGID0gMSwKKyAgICAgICAgVklERU9fUkVTRVQgPSAyLAorICAgICAgICBDUFVTRVRfRU5BQkxFID0gMywKKyAgICAgICAgQ1BVU0VUX0RJU0FCTEUgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7CisgICAgICAgIEV2ZW50VHlwZSB0eXBlOworICAgICAgICBpbnQgYXJnOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07CisgICAgICAgICsrbUV2ZW50Q291bnQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OworICAgICAgICArK21FdmVudENvdW50OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKKyAgICAgICAgKyttRXZlbnRDb3VudDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlKSBvdmVycmlkZSB7CisgICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07CisgICAgICAgICsrbUV2ZW50Q291bnQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KKyAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQorICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KKworICAgcHJpdmF0ZToKKyAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7CisgICAgc2l6ZV90IG1FdmVudENvdW50OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKK307CisKK3N0cnVjdCBUZXN0Q2xpZW50IDogcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKKyAgICBUZXN0Q2xpZW50KGludCBwaWQsIGNvbnN0IHNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4mIHNlcnZpY2UpCisgICAgICAgIDogbVJlY2xhaW1lZChmYWxzZSksIG1QaWQocGlkKSwgbVNlcnZpY2Uoc2VydmljZSkge30KKworICAgIFN0YXR1cyByZWNsYWltUmVzb3VyY2UoYm9vbCogYWlkbFJldHVybikgb3ZlcnJpZGUgeworICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7CisgICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICAqYWlkbFJldHVybiA9IHRydWU7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIGdldE5hbWUoc3RyaW5nKiBhaWRsUmV0dXJuKSBvdmVycmlkZSB7CisgICAgICAgICphaWRsUmV0dXJuID0gInRlc3RfY2xpZW50IjsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KKworICAgcHJpdmF0ZToKKyAgICBib29sIG1SZWNsYWltZWQ7CisgICAgaW50IG1QaWQ7CisgICAgc2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXN0Q2xpZW50KTsKK307CisKK2NsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXIgeworICAgcHVibGljOgorICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXIoKSA9IGRlZmF1bHQ7CisgICAgflJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXIoKSB7CisgICAgICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKKyAgICAgICAgZGVsZXRlIG1GdXp6ZWREYXRhUHJvdmlkZXI7CisgICAgfQorICAgIHZvaWQgcHJvY2Vzcyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgIHByaXZhdGU6CisgICAgdm9pZCBzZXRDb25maWcoKTsKKyAgICB2b2lkIHNldFJlc291cmNlcygpOworICAgIHZvaWQgc2V0U2VydmljZUxvZygpOworCisgICAgc3RhdGljIHZvaWQqIGFkZFJlc291cmNlKHZvaWQqIGFyZykgeworICAgICAgICByZXNvdXJjZVRocmVhZEFyZ3MqIHRBcmdzID0gKHJlc291cmNlVGhyZWFkQXJncyopYXJnOworICAgICAgICBpZiAodEFyZ3MpIHsKKyAgICAgICAgICAgICh0QXJncy0+c2VydmljZSkKKyAgICAgICAgICAgICAgICAtPmFkZFJlc291cmNlKHRBcmdzLT5waWQsIHRBcmdzLT51aWQsIHRBcmdzLT50ZXN0Q2xpZW50SWQsIHRBcmdzLT50ZXN0Q2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEFyZ3MtPm1lZGlhUmVzb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkKiByZW1vdmVSZXNvdXJjZSh2b2lkKiBhcmcpIHsKKyAgICAgICAgcmVzb3VyY2VUaHJlYWRBcmdzKiB0QXJncyA9IChyZXNvdXJjZVRocmVhZEFyZ3MqKWFyZzsKKyAgICAgICAgaWYgKHRBcmdzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdDsKKyAgICAgICAgICAgICh0QXJncy0+c2VydmljZSktPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbCh0QXJncy0+cGlkLCB0QXJncy0+dGVzdENsaWVudElkKTsKKyAgICAgICAgICAgICh0QXJncy0+c2VydmljZSktPnJlbW92ZVJlc291cmNlKHRBcmdzLT5waWQsIHRBcmdzLT50ZXN0Q2xpZW50SWQsIHRBcmdzLT5tZWRpYVJlc291cmNlKTsKKyAgICAgICAgICAgICh0QXJncy0+c2VydmljZSktPnJlY2xhaW1SZXNvdXJjZSh0QXJncy0+cGlkLCB0QXJncy0+bWVkaWFSZXNvdXJjZSwgJnJlc3VsdCk7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpLT5yZW1vdmVDbGllbnQodEFyZ3MtPnBpZCwgdEFyZ3MtPnRlc3RDbGllbnRJZCk7CisgICAgICAgICAgICAodEFyZ3MtPnNlcnZpY2UpLT5vdmVycmlkZVBpZCh0QXJncy0+cGlkLCB0QXJncy0+cGlkIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZSA9CisgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KG5ldyBUZXN0UHJvY2Vzc0luZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRlc3RTeXN0ZW1DYWxsYmFjaygpKTsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIqIG1GdXp6ZWREYXRhUHJvdmlkZXIgPSBudWxscHRyOworfTsKKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgbUZ1enplZERhdGFQcm92aWRlciA9IG5ldyBGdXp6ZWREYXRhUHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisgICAgc2V0Q29uZmlnKCk7CisgICAgc2V0UmVzb3VyY2VzKCk7CisgICAgc2V0U2VydmljZUxvZygpOworfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2VGdXp6ZXI6OnNldENvbmZpZygpIHsKKyAgICBib29sIHBvbGljeVR5cGVJbmRleCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVCb29sKCk7CisgICAgc3RyaW5nIHBvbGljeVZhbHVlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICBpZiAobVNlcnZpY2UpIHsKKyAgICAgICAgdmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3lQYXJjZWw+IHBvbGljaWVzOworICAgICAgICBwb2xpY2llcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZVBvbGljeShrUG9saWN5VHlwZVtwb2xpY3lUeXBlSW5kZXhdLCBwb2xpY3lWYWx1ZSkpOworICAgICAgICBtU2VydmljZS0+Y29uZmlnKHBvbGljaWVzKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZUZ1enplcjo6c2V0UmVzb3VyY2VzKCkgeworICAgIGlmICghbVNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3QgbnVtVGhyZWFkUGFpcnMgPQorICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHNpemVfdD4oa01pblRocmVhZFBhaXJzLCBrTWF4VGhyZWFkUGFpcnMpOworICAgIC8vIE1ha2UgZXZlbiBudW1iZXIgb2YgdGhyZWFkcworICAgIHNpemVfdCBudW1UaHJlYWRzID0gbnVtVGhyZWFkUGFpcnMgKiAyOworICAgIHJlc291cmNlVGhyZWFkQXJncyB0aHJlYWRBcmdzOworICAgIHZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiBtZWRpYVJlc291cmNlOworICAgIHB0aHJlYWRfdCBwdFtudW1UaHJlYWRzXTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkcyAtIDE7IGkgKz0gMikgeworICAgICAgICB0aHJlYWRBcmdzLnBpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICB0aHJlYWRBcmdzLnVpZCA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpOworICAgICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VUeXBlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigKKyAgICAgICAgICAgIGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOworICAgICAgICBpbnQzMl90IG1lZGlhUmVzb3VyY2VTdWJUeXBlID0gbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigKKyAgICAgICAgICAgIGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOworICAgICAgICB1aW50NjRfdCBtZWRpYVJlc291cmNlVmFsdWUgPSBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWw8dWludDY0X3Q+KCk7CisgICAgICAgIHRocmVhZEFyZ3Muc2VydmljZSA9IG1TZXJ2aWNlOworICAgICAgICBzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IHRlc3RDbGllbnQgPQorICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4odGhyZWFkQXJncy5waWQsIG1TZXJ2aWNlKTsKKyAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50ID0gdGVzdENsaWVudDsKKyAgICAgICAgdGhyZWFkQXJncy50ZXN0Q2xpZW50SWQgPSBnZXRJZCh0ZXN0Q2xpZW50KTsKKyAgICAgICAgbWVkaWFSZXNvdXJjZS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShzdGF0aWNfY2FzdDxNZWRSZXNUeXBlPihtZWRpYVJlc291cmNlVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkUmVzU3ViVHlwZT4obWVkaWFSZXNvdXJjZVN1YlR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVzb3VyY2VWYWx1ZSkpOworICAgICAgICB0aHJlYWRBcmdzLm1lZGlhUmVzb3VyY2UgPSBtZWRpYVJlc291cmNlOworICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmcHRbaV0sIG51bGxwdHIsIGFkZFJlc291cmNlLCAmdGhyZWFkQXJncyk7CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZwdFtpICsgMV0sIG51bGxwdHIsIHJlbW92ZVJlc291cmNlLCAmdGhyZWFkQXJncyk7CisgICAgICAgIG1lZGlhUmVzb3VyY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgKytpKSB7CisgICAgICAgIHB0aHJlYWRfam9pbihwdFtpXSwgbnVsbHB0cik7CisgICAgfQorCisgICAgLy8gTm8gcmVzb3VyY2Ugd2FzIGFkZGVkIHdpdGggcGlkID0gMAorICAgIGludDMyX3QgcGlkWmVybyA9IDA7CisgICAgc2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiB0ZXN0Q2xpZW50ID0KKyAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4ocGlkWmVybywgbVNlcnZpY2UpOworICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVR5cGUgPQorICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOworICAgIGludDMyX3QgbWVkaWFSZXNvdXJjZVN1YlR5cGUgPQorICAgICAgICBtRnV6emVkRGF0YVByb3ZpZGVyLT5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KGtNaW5SZXNvdXJjZVR5cGUsIGtNYXhSZXNvdXJjZVR5cGUpOworICAgIHVpbnQ2NF90IG1lZGlhUmVzb3VyY2VWYWx1ZSA9IG1GdXp6ZWREYXRhUHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aW50NjRfdD4oKTsKKyAgICBtZWRpYVJlc291cmNlLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHN0YXRpY19jYXN0PE1lZFJlc1R5cGU+KG1lZGlhUmVzb3VyY2VUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1lZFJlc1N1YlR5cGU+KG1lZGlhUmVzb3VyY2VTdWJUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhUmVzb3VyY2VWYWx1ZSkpOworICAgIGJvb2wgcmVzdWx0OworICAgIG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2UocGlkWmVybywgbWVkaWFSZXNvdXJjZSwgJnJlc3VsdCk7CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKHBpZFplcm8sIGdldElkKHRlc3RDbGllbnQpLCBtZWRpYVJlc291cmNlKTsKKyAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KHBpZFplcm8sIGdldElkKHRlc3RDbGllbnQpKTsKKyAgICBtZWRpYVJlc291cmNlLmNsZWFyKCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZUZ1enplcjo6c2V0U2VydmljZUxvZygpIHsKKyAgICBzaXplX3QgbWF4TnVtID0KKyAgICAgICAgbUZ1enplZERhdGFQcm92aWRlci0+Q29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PihrTWluU2VydmljZUxvZywga01heFNlcnZpY2VMb2cpOworICAgIHNwPFNlcnZpY2VMb2c+IHNlcnZpY2VMb2cgPSBuZXcgU2VydmljZUxvZyhtYXhOdW0pOworICAgIGlmIChzZXJ2aWNlTG9nKSB7CisgICAgICAgIHNlcnZpY2VMb2ctPmFkZChTdHJpbmc4KCJsb2ciKSk7CisgICAgICAgIHNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyKiBybUZ1enplciA9IG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlRnV6emVyKCk7CisgICAgaWYgKCFybUZ1enplcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcm1GdXp6ZXItPnByb2Nlc3MoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIHJtRnV6emVyOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCmluZGV4IGI2YzU0OGMuLmVjNGJhNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTEsMTQgKzEsMjMgQEAKIC8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgorcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCiBjY190ZXN0IHsKICAgICBuYW1lOiAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IiwKICAgICBzcmNzOiBbIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAiXSwKICAgICB0ZXN0X3N1aXRlczogWyJkZXZpY2UtdGVzdHMiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMTksMTcgKzI4LDE2IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJTZXJ2aWNlTG9nX3Rlc3QiLAogICAgIHNyY3M6IFsiU2VydmljZUxvZ190ZXN0LmNwcCJdLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC00MCw1ICs0OCwyOSBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdCIsCisgICAgc3JjczogWyJSZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcCJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICAgICAgInJlc291cmNlb2JzZXJ2ZXJfYWlkbF9pbnRlcmZhY2UtVjEtbmRrX3BsYXRmb3JtIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjkzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0VXRpbHMuaApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblJlc291cmNlTWFuYWdlckNsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlckNsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhUmVzb3VyY2VQYXJjZWw7CisKK3N0YXRpYyBpbnQ2NF90IGdldElkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiYgY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQuZ2V0KCk7Cit9CisKK3N0cnVjdCBUZXN0UHJvY2Vzc0luZm8gOiBwdWJsaWMgUHJvY2Vzc0luZm9JbnRlcmZhY2UgeworICAgIFRlc3RQcm9jZXNzSW5mbygpIHt9CisgICAgdmlydHVhbCB+VGVzdFByb2Nlc3NJbmZvKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQgKnByaW9yaXR5KSB7CisgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB1c2UgcGlkIGFzIHByaW9yaXR5LgorICAgICAgICAvLyBMb3dlciB0aGUgdmFsdWUgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAgICAgKnByaW9yaXR5ID0gcGlkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZFBpZChpbnQgLyogcGlkICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZVByb2Nlc3NJbmZvKAorICAgICAgICAgICAgaW50IC8qIHBpZCAqLywgaW50IC8qIHByb2NTdGF0ZSAqLywgaW50IC8qIG9vbVNjb3JlICovKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVQcm9jZXNzSW5mb092ZXJyaWRlKGludCAvKiBwaWQgKi8pIHsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKK307CisKK3N0cnVjdCBUZXN0U3lzdGVtQ2FsbGJhY2sgOgorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgeworICAgIFRlc3RTeXN0ZW1DYWxsYmFjaygpIDoKKyAgICAgICAgbUxhc3RFdmVudCh7RXZlbnRUeXBlOjpJTlZBTElELCAwfSksIG1FdmVudENvdW50KDApIHt9CisKKyAgICBlbnVtIEV2ZW50VHlwZSB7CisgICAgICAgIElOVkFMSUQgICAgICAgICAgPSAtMSwKKyAgICAgICAgVklERU9fT04gICAgICAgICA9IDAsCisgICAgICAgIFZJREVPX09GRiAgICAgICAgPSAxLAorICAgICAgICBWSURFT19SRVNFVCAgICAgID0gMiwKKyAgICAgICAgQ1BVU0VUX0VOQUJMRSAgICA9IDMsCisgICAgICAgIENQVVNFVF9ESVNBQkxFICAgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7CisgICAgICAgIEV2ZW50VHlwZSB0eXBlOworICAgICAgICBpbnQgYXJnOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OworICAgICAgICBtRXZlbnRDb3VudCsrOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKKyAgICAgICAgbUV2ZW50Q291bnQrKzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlKSBvdmVycmlkZSB7CisgICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KKyAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQorICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KKworcHJpdmF0ZToKKyAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7CisgICAgc2l6ZV90IG1FdmVudENvdW50OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKK307CisKKworc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgeworICAgIFRlc3RDbGllbnQoaW50IHBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQorICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7CisgICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVjbGFpbWVkOworICAgIH0KKworICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KKworcHJpdmF0ZToKKyAgICBib29sIG1SZWNsYWltZWQ7CisgICAgaW50IG1QaWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOworfTsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQxID0gMTAxMDsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQyID0gMTAxMTsKKworc3RhdGljIGNvbnN0IGludCBrTG93UHJpb3JpdHlQaWQgPSA0MDsKK3N0YXRpYyBjb25zdCBpbnQga01pZFByaW9yaXR5UGlkID0gMjU7CitzdGF0aWMgY29uc3QgaW50IGtIaWdoUHJpb3JpdHlQaWQgPSAxMDsKKwordXNpbmcgRXZlbnRUeXBlID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudFR5cGU7Cit1c2luZyBFdmVudEVudHJ5ID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudEVudHJ5OworYm9vbCBvcGVyYXRvcj09IChjb25zdCBFdmVudEVudHJ5JiBsaHMsIGNvbnN0IEV2ZW50RW50cnkmIHJocykgeworICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAmJiBsaHMuYXJnID09IHJocy5hcmc7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uKSBcCisgICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvbikuaXNPaygpICYmIChyZXN1bHQpKQorCisjZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb24pIFwKKyAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgIShyZXN1bHQpKQorCitjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKQorICAgICAgICA6IG1TeXN0ZW1DQihuZXcgVGVzdFN5c3RlbUNhbGxiYWNrKCkpLAorICAgICAgICAgIG1TZXJ2aWNlKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlclNlcnZpY2U+KAorICAgICAgICAgICAgICAgICAgbmV3IFRlc3RQcm9jZXNzSW5mbywgbVN5c3RlbUNCKSksCisgICAgICAgICAgbVRlc3RDbGllbnQxKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMSwgbVNlcnZpY2UpKSwKKyAgICAgICAgICBtVGVzdENsaWVudDIoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4oa1Rlc3RQaWQyLCBtU2VydmljZSkpLAorICAgICAgICAgIG1UZXN0Q2xpZW50Myg6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihrVGVzdFBpZDIsIG1TZXJ2aWNlKSkgeworICAgIH0KKworICAgIHNwPFRlc3RTeXN0ZW1DYWxsYmFjaz4gbVN5c3RlbUNCOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MzsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29sIGlzRXF1YWxSZXNvdXJjZXMoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gJnJlc291cmNlczEsCisgICAgICAgICAgICBjb25zdCBSZXNvdXJjZUxpc3QgJnJlc291cmNlczIpIHsKKyAgICAgICAgLy8gY29udmVydCByZXNvdXJjZTEgdG8gUmVzb3VyY2VMaXN0CisgICAgICAgIFJlc291cmNlTGlzdCByMTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMxLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZyZXMgPSByZXNvdXJjZXMxW2ldOworICAgICAgICAgICAgY29uc3QgYXV0byByZXNUeXBlID0gc3RkOjp0dXBsZShyZXMudHlwZSwgcmVzLnN1YlR5cGUsIHJlcy5pZCk7CisgICAgICAgICAgICByMVtyZXNUeXBlXSA9IHJlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcjEgPT0gcmVzb3VyY2VzMjsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBleHBlY3RFcVJlc291cmNlSW5mbyhjb25zdCBSZXNvdXJjZUluZm8gJmluZm8sCisgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+ICZyZXNvdXJjZXMpIHsKKyAgICAgICAgRVhQRUNUX0VRKHVpZCwgaW5mby51aWQpOworICAgICAgICBFWFBFQ1RfRVEoY2xpZW50LCBpbmZvLmNsaWVudCk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxSZXNvdXJjZXMocmVzb3VyY2VzLCBpbmZvLnJlc291cmNlcykpOworICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcAppbmRleCA3MDI5MzVkLi5hMDI5ZDQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCkBAIC0xNiwxOTcgKzE2LDE3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RVdGlscy5oIgogI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm9JbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFpZGwgewotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLWJvb2wgb3BlcmF0b3I9PSAoY29uc3QgTWVkaWFSZXNvdXJjZVBhcmNlbCYgbGhzLCBjb25zdCBNZWRpYVJlc291cmNlUGFyY2VsJiByaHMpIHsKLSAgICByZXR1cm4gbGhzLnR5cGUgPT0gcmhzLnR5cGUgJiYgbGhzLnN1YlR5cGUgPT0gcmhzLnN1YlR5cGUgJiYKLSAgICAgICAgICAgIGxocy5pZCA9PSByaHMuaWQgJiYgbGhzLnZhbHVlID09IHJocy52YWx1ZTsKLX19fX0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwotdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6SVJlc291cmNlTWFuYWdlclNlcnZpY2U7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwotCi1zdGF0aWMgaW50NjRfdCBnZXRJZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGNsaWVudCkgewotICAgIHJldHVybiAoaW50NjRfdCkgY2xpZW50LmdldCgpOwotfQotCi1zdHJ1Y3QgVGVzdFByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKLSAgICBUZXN0UHJvY2Vzc0luZm8oKSB7fQotICAgIHZpcnR1YWwgflRlc3RQcm9jZXNzSW5mbygpIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0UHJpb3JpdHkoaW50IHBpZCwgaW50ICpwcmlvcml0eSkgewotICAgICAgICAvLyBGb3IgdGVzdGluZywgdXNlIHBpZCBhcyBwcmlvcml0eS4KLSAgICAgICAgLy8gTG93ZXIgdGhlIHZhbHVlIGhpZ2hlciB0aGUgcHJpb3JpdHkuCi0gICAgICAgICpwcmlvcml0eSA9IHBpZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBib29sIGlzVmFsaWRQaWQoaW50IC8qIHBpZCAqLykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKLX07Ci0KLXN0cnVjdCBUZXN0U3lzdGVtQ2FsbGJhY2sgOgotICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgewotICAgIFRlc3RTeXN0ZW1DYWxsYmFjaygpIDoKLSAgICAgICAgbUxhc3RFdmVudCh7RXZlbnRUeXBlOjpJTlZBTElELCAwfSksIG1FdmVudENvdW50KDApIHt9Ci0KLSAgICBlbnVtIEV2ZW50VHlwZSB7Ci0gICAgICAgIElOVkFMSUQgICAgICAgICAgPSAtMSwKLSAgICAgICAgVklERU9fT04gICAgICAgICA9IDAsCi0gICAgICAgIFZJREVPX09GRiAgICAgICAgPSAxLAotICAgICAgICBWSURFT19SRVNFVCAgICAgID0gMiwKLSAgICAgICAgQ1BVU0VUX0VOQUJMRSAgICA9IDMsCi0gICAgICAgIENQVVNFVF9ESVNBQkxFICAgPSA0LAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7Ci0gICAgICAgIEV2ZW50VHlwZSB0eXBlOwotICAgICAgICBpbnQgYXJnOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgewotICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07Ci0gICAgICAgIG1FdmVudENvdW50Kys7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgewotICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OwotICAgICAgICBtRXZlbnRDb3VudCsrOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKLSAgICAgICAgbUV2ZW50Q291bnQrKzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KGJvb2wgZW5hYmxlKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07Ci0gICAgICAgIG1FdmVudENvdW50Kys7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KLSAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQotICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KLQotcHJpdmF0ZToKLSAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7Ci0gICAgc2l6ZV90IG1FdmVudENvdW50OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKLX07Ci0KLQotc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgewotICAgIFRlc3RDbGllbnQoaW50IHBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQotICAgICAgICA6IG1SZWNsYWltZWQoZmFsc2UpLCBtUGlkKHBpZCksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9Ci0KLSAgICBTdGF0dXMgcmVjbGFpbVJlc291cmNlKGJvb2wqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewotICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KG1QaWQsIGdldElkKHJlZjxUZXN0Q2xpZW50PigpKSk7Ci0gICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgZ2V0TmFtZSg6OnN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKLSAgICAgICAgKl9haWRsX3JldHVybiA9ICJ0ZXN0X2NsaWVudCI7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgYm9vbCByZWNsYWltZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtUmVjbGFpbWVkOwotICAgIH0KLQotICAgIHZvaWQgcmVzZXQoKSB7Ci0gICAgICAgIG1SZWNsYWltZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5UZXN0Q2xpZW50KCkge30KLQotcHJpdmF0ZToKLSAgICBib29sIG1SZWNsYWltZWQ7Ci0gICAgaW50IG1QaWQ7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOwotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOwotfTsKLQotc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQxID0gMTAxMDsKLQotc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RVaWQyID0gMTAxMTsKLQotc3RhdGljIGNvbnN0IGludCBrTG93UHJpb3JpdHlQaWQgPSA0MDsKLXN0YXRpYyBjb25zdCBpbnQga01pZFByaW9yaXR5UGlkID0gMjU7Ci1zdGF0aWMgY29uc3QgaW50IGtIaWdoUHJpb3JpdHlQaWQgPSAxMDsKLQotdXNpbmcgRXZlbnRUeXBlID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudFR5cGU7Ci11c2luZyBFdmVudEVudHJ5ID0gVGVzdFN5c3RlbUNhbGxiYWNrOjpFdmVudEVudHJ5OwotYm9vbCBvcGVyYXRvcj09IChjb25zdCBFdmVudEVudHJ5JiBsaHMsIGNvbnN0IEV2ZW50RW50cnkmIHJocykgewotICAgIHJldHVybiBsaHMudHlwZSA9PSByaHMudHlwZSAmJiBsaHMuYXJnID09IHJocy5hcmc7Ci19Ci0KLSNkZWZpbmUgQ0hFQ0tfU1RBVFVTX1RSVUUoY29uZGl0aW9uKSBcCi0gICAgRVhQRUNUX1RSVUUoKGNvbmRpdGlvbikuaXNPaygpICYmIChyZXN1bHQpKQotCi0jZGVmaW5lIENIRUNLX1NUQVRVU19GQUxTRShjb25kaXRpb24pIFwKLSAgICBFWFBFQ1RfVFJVRSgoY29uZGl0aW9uKS5pc09rKCkgJiYgIShyZXN1bHQpKQotCi1jbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QgOiBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlIHsKIHB1YmxpYzoKLSAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCgpCi0gICAgICAgIDogbVN5c3RlbUNCKG5ldyBUZXN0U3lzdGVtQ2FsbGJhY2soKSksCi0gICAgICAgICAgbVNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4oCi0gICAgICAgICAgICAgICAgICBuZXcgVGVzdFByb2Nlc3NJbmZvLCBtU3lzdGVtQ0IpKSwKLSAgICAgICAgICBtVGVzdENsaWVudDEoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4oa1Rlc3RQaWQxLCBtU2VydmljZSkpLAotICAgICAgICAgIG1UZXN0Q2xpZW50Mig6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihrVGVzdFBpZDIsIG1TZXJ2aWNlKSksCi0gICAgICAgICAgbVRlc3RDbGllbnQzKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSB7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIGJvb2wgaXNFcXVhbFJlc291cmNlcyhjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiAmcmVzb3VyY2VzMSwKLSAgICAgICAgICAgIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzMikgewotICAgICAgICAvLyBjb252ZXJ0IHJlc291cmNlMSB0byBSZXNvdXJjZUxpc3QKLSAgICAgICAgUmVzb3VyY2VMaXN0IHIxOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlczEuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlczFbaV07Ci0gICAgICAgICAgICBjb25zdCBhdXRvIHJlc1R5cGUgPSBzdGQ6OnR1cGxlKHJlcy50eXBlLCByZXMuc3ViVHlwZSwgcmVzLmlkKTsKLSAgICAgICAgICAgIHIxW3Jlc1R5cGVdID0gcmVzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByMSA9PSByZXNvdXJjZXMyOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGNvbnN0IFJlc291cmNlSW5mbyAmaW5mbywKLSAgICAgICAgICAgIGludCB1aWQsCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gJnJlc291cmNlcykgewotICAgICAgICBFWFBFQ1RfRVEodWlkLCBpbmZvLnVpZCk7Ci0gICAgICAgIEVYUEVDVF9FUShjbGllbnQsIGluZm8uY2xpZW50KTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFJlc291cmNlcyhyZXNvdXJjZXMsIGluZm8ucmVzb3VyY2VzKSk7Ci0gICAgfQorICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0KCkgOiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UoKSB7fQogCiAgICAgdm9pZCB2ZXJpZnlDbGllbnRzKGJvb2wgYzEsIGJvb2wgYzIsIGJvb2wgYzMpIHsKICAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MSA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDEuZ2V0KCkpOwpAQCAtNTIwLDYgKzM0MCwzMCBAQAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAogICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOwogICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICBtU2VydmljZS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSk7CisKKyAgICAgICAgICAgIC8vIGNsaWVudCBtYXJrZWQgZm9yIHBlbmRpbmcgcmVtb3ZhbCBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBObyBtb3JlIGNsaWVudHMgbWFya2VkIGZvciByZW1vdmFsCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlc0Zyb21DbGllbnRzUGVuZGluZ1JlbW92YWwoa1Rlc3RQaWQyKS5pc09rKCkpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgbVNlcnZpY2UtPm1hcmtDbGllbnRGb3JQZW5kaW5nUmVtb3ZhbChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOworCisgICAgICAgICAgICAvLyBjbGllbnQgbWFya2VkIGZvciBwZW5kaW5nIHJlbW92YWwgZ290IHJlY2xhaW1lZAorICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZXNGcm9tQ2xpZW50c1BlbmRpbmdSZW1vdmFsKGtUZXN0UGlkMikuaXNPaygpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDEgd2hpY2ggc3RpbGwgbGVmdAorICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCB0ZXN0UmVtb3ZlQ2xpZW50KCkgewpAQCAtODgxLDEyICs3MjUsNiBAQAogICAgICAgICBFWFBFQ1RfRVEoNHUsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKICAgICAgICAgRVhQRUNUX0VRKEV2ZW50VHlwZTo6Q1BVU0VUX0RJU0FCTEUsIG1TeXN0ZW1DQi0+bGFzdEV2ZW50VHlwZSgpKTsKICAgICB9Ci0KLSAgICBzcDxUZXN0U3lzdGVtQ2FsbGJhY2s+IG1TeXN0ZW1DQjsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MTsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQyOwotICAgIHN0ZDo6c2hhcmVkX3B0cjxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDM7CiB9OwogCiBURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGNvbmZpZykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkOWRmMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdCIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5SZXNvdXJjZU9ic2VydmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiUmVzb3VyY2VPYnNlcnZlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5SZXNvdXJjZU9ic2VydmVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlUGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlVHlwZTsKKworI2RlZmluZSBCVVNZIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprQnVzeQorI2RlZmluZSBJRExFIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6Ok1lZGlhT2JzZXJ2YWJsZUV2ZW50OjprSWRsZQorI2RlZmluZSBBTEwgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6TWVkaWFPYnNlcnZhYmxlRXZlbnQ6OmtBbGwKKworc3RydWN0IEV2ZW50VHJhY2tlciB7CisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSB7IE5vRXZlbnQsIEJ1c3ksIElkbGUgfSB0eXBlID0gTm9FdmVudDsKKyAgICAgICAgaW50IHVpZCA9IDA7CisgICAgICAgIGludCBwaWQgPSAwOworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+IG9ic2VydmFibGVzOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgRXZlbnQgTm9FdmVudDsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBNZWRpYU9ic2VydmFibGVQYXJjZWwmIG9ic2VydmFibGUpIHsKKyAgICAgICAgcmV0dXJuICJ7IiArIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnRvU3RyaW5nKG9ic2VydmFibGUudHlwZSkKKyAgICAgICAgKyAiLCAiICsgc3RkOjp0b19zdHJpbmcob2JzZXJ2YWJsZS52YWx1ZSkgKyAifSI7CisgICAgfQorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXZlbnRTdHI7CisgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlIEV2ZW50OjpCdXN5OgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiQnVzeSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFdmVudDo6SWRsZToKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIklkbGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIk5vRXZlbnQiOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIG9ic2VydmFibGVTdHI7CisgICAgICAgIGZvciAoYXV0byAmb2JzZXJ2YWJsZSA6IGV2ZW50Lm9ic2VydmFibGVzKSB7CisgICAgICAgICAgICBpZiAoIW9ic2VydmFibGVTdHIuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG9ic2VydmFibGVTdHIgKz0gIiwgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9ic2VydmFibGVTdHIgKz0gdG9TdHJpbmcob2JzZXJ2YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJ7IiArIGV2ZW50U3RyICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKGV2ZW50LnVpZCkgKyAiLCAiCisgICAgICAgICAgICAgICAgKyBzdGQ6OnRvX3N0cmluZyhldmVudC5waWQpICsgIiwgeyIgKyBvYnNlcnZhYmxlU3RyICsgIn19IjsKKyAgICB9CisKKyAgICBzdGF0aWMgRXZlbnQgQnVzeShpbnQgdWlkLCBpbnQgcGlkLCBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+JiBvYnNlcnZhYmxlcykgeworICAgICAgICByZXR1cm4geyBFdmVudDo6QnVzeSwgdWlkLCBwaWQsIG9ic2VydmFibGVzIH07CisgICAgfQorICAgIHN0YXRpYyBFdmVudCBJZGxlKGludCB1aWQsIGludCBwaWQsIGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4mIG9ic2VydmFibGVzKSB7CisgICAgICAgIHJldHVybiB7IEV2ZW50OjpJZGxlLCB1aWQsIHBpZCwgb2JzZXJ2YWJsZXMgfTsKKyAgICB9CisKKyAgICAvLyBQb3AgMSBldmVudCBmcm9tIGZyb250LCB3YWl0IGZvciB1cCB0byB0aW1lb3V0VXMgaWYgZW1wdHkuCisgICAgY29uc3QgRXZlbnQmIHBvcChpbnQ2NF90IHRpbWVvdXRVcyA9IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSAmJiB0aW1lb3V0VXMgPiAwKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModGltZW91dFVzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVBvcHBlZEV2ZW50OworICAgIH0KKworICAgIC8vIFB1c2ggMSBldmVudCB0byBiYWNrLgorICAgIHZvaWQgYXBwZW5kKGNvbnN0IEV2ZW50JiBldmVudCkgeworICAgICAgICBBTE9HRCgiJXMiLCB0b1N0cmluZyhldmVudCkuY19zdHIoKSk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBtRXZlbnRRdWV1ZS5wdXNoX2JhY2soZXZlbnQpOworICAgICAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29uZGl0aW9uOworICAgIEV2ZW50IG1Qb3BwZWRFdmVudDsKKyAgICBzdGQ6Omxpc3Q8RXZlbnQ+IG1FdmVudFF1ZXVlOworfTsKKworY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQ7CisKKy8vIE9wZXJhdG9ycyBmb3IgR1Rlc3QgbWFjcm9zLgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIGxocywgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgcmhzKSB7CisgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy51aWQgPT0gcmhzLnVpZCAmJiBsaHMucGlkID09IHJocy5waWQgJiYKKyAgICAgICAgICAgIGxocy5vYnNlcnZhYmxlcyA9PSByaHMub2JzZXJ2YWJsZXM7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIHN0ciwgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgdikgeworICAgIHN0ciA8PCBFdmVudFRyYWNrZXI6OnRvU3RyaW5nKHYpOworICAgIHJldHVybiBzdHI7Cit9CisKK3N0cnVjdCBUZXN0T2JzZXJ2ZXIgOiBwdWJsaWMgQm5SZXNvdXJjZU9ic2VydmVyLCBwdWJsaWMgRXZlbnRUcmFja2VyIHsKKyAgICBUZXN0T2JzZXJ2ZXIoY29uc3QgY2hhciAqbmFtZSkgOiBtTmFtZShuYW1lKSB7fQorICAgIH5UZXN0T2JzZXJ2ZXIoKSA9IGRlZmF1bHQ7CisgICAgU3RhdHVzIG9uU3RhdHVzQ2hhbmdlZChNZWRpYU9ic2VydmFibGVFdmVudCBldmVudCwgaW50MzJfdCB1aWQsIGludDMyX3QgcGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiYgb2JzZXJ2YWJsZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR0QoIiVzOiAlcyIsIG1OYW1lLmNfc3RyKCksIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGlmIChldmVudCA9PSBNZWRpYU9ic2VydmFibGVFdmVudDo6a0J1c3kpIHsKKyAgICAgICAgICAgIGFwcGVuZChCdXN5KHVpZCwgcGlkLCBvYnNlcnZhYmxlcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwZW5kKElkbGUodWlkLCBwaWQsIG9ic2VydmFibGVzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKK307CisKK2NsYXNzIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCA6IHB1YmxpYyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdEJhc2UgeworcHVibGljOgorICAgIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCgpIDogUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3RCYXNlKCksCisgICAgICAgIG1PYnNlcnZlclNlcnZpY2UoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+KCkpLAorICAgICAgICBtVGVzdE9ic2VydmVyMSg6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0T2JzZXJ2ZXI+KCJvYnNlcnZlcjEiKSksCisgICAgICAgIG1UZXN0T2JzZXJ2ZXIyKDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RPYnNlcnZlcj4oIm9ic2VydmVyMiIpKSwKKyAgICAgICAgbVRlc3RPYnNlcnZlcjMoOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdE9ic2VydmVyPigib2JzZXJ2ZXIzIikpIHsKKyAgICAgICAgbVNlcnZpY2UtPnNldE9ic2VydmVyU2VydmljZShtT2JzZXJ2ZXJTZXJ2aWNlKTsKKyAgICB9CisKKyAgICB2b2lkIHJlZ2lzdGVyT2JzZXJ2ZXJzKE1lZGlhT2JzZXJ2YWJsZUV2ZW50IGZpbHRlciA9IEFMTCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+IGZpbHRlcnMxLCBmaWx0ZXJzMiwgZmlsdGVyczM7CisgICAgICAgIGZpbHRlcnMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgZmlsdGVyfX07CisgICAgICAgIGZpbHRlcnMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgZmlsdGVyfX07CisgICAgICAgIGZpbHRlcnMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgZmlsdGVyfSwKKyAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIGZpbHRlcn19OworCisgICAgICAgIC8vIG1UZXN0T2JzZXJ2ZXIxIG1vbml0b3JzIHNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgICAgIEVYUEVDVF9UUlVFKG1PYnNlcnZlclNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEsIGZpbHRlcnMxKS5pc09rKCkpOworCisgICAgICAgIC8vIG1UZXN0T2JzZXJ2ZXIyIG1vbml0b3JzIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgICAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIyLCBmaWx0ZXJzMikuaXNPaygpKTsKKworICAgICAgICAvLyBtVGVzdE9ic2VydmVyMyBtb25pdG9ycyBib3RoIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgICAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIzLCBmaWx0ZXJzMykuaXNPaygpKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzb3VyY2VPYnNlcnZlclNlcnZpY2U+IG1PYnNlcnZlclNlcnZpY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjE7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RPYnNlcnZlcj4gbVRlc3RPYnNlcnZlcjM7Cit9OworCitURVNUX0YoUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VUZXN0LCB0ZXN0UmVnaXN0ZXJPYnNlcnZlcikgeworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVyczE7CisgICAgU3RhdHVzIHN0YXR1czsKKworICAgIC8vIFJlZ2lzdGVyIHdpdGggbnVsbCBvYnNlcnZlciBzaG91bGQgZmFpbC4KKyAgICBzdGF0dXMgPSBtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG51bGxwdHIsIGZpbHRlcnMxKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy5nZXRTZXJ2aWNlU3BlY2lmaWNFcnJvcigpLCBCQURfVkFMVUUpOworCisgICAgLy8gUmVnaXN0ZXIgd2l0aCBlbXB0eSBvYnNlcnZhYmxlcyBzaG91bGQgZmFpbC4KKyAgICBzdGF0dXMgPSBtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxLCBmaWx0ZXJzMSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgQkFEX1ZBTFVFKTsKKworICAgIC8vIG1UZXN0T2JzZXJ2ZXIxIG1vbml0b3JzIHNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgZmlsdGVyczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCBBTEx9fTsKKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxLCBmaWx0ZXJzMSkuaXNPaygpKTsKKworICAgIC8vIFJlZ2lzdGVyIGR1cGxpY2F0ZXMgc2hvdWxkIGZhaWwuCisgICAgc3RhdHVzID0gbU9ic2VydmVyU2VydmljZS0+cmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSwgZmlsdGVyczEpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIEFMUkVBRFlfRVhJU1RTKTsKK30KKworVEVTVF9GKFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCwgdGVzdFVucmVnaXN0ZXJPYnNlcnZlcikgeworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZUZpbHRlcj4gZmlsdGVyczE7CisgICAgU3RhdHVzIHN0YXR1czsKKworICAgIC8vIFVucmVnaXN0ZXIgd2l0aG91dCByZWdpc3RlcmluZyBmaXJzdCBzaG91bGQgZmFpbC4KKyAgICBzdGF0dXMgPSBtT2JzZXJ2ZXJTZXJ2aWNlLT51bnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIE5BTUVfTk9UX0ZPVU5EKTsKKworICAgIC8vIG1UZXN0T2JzZXJ2ZXIxIG1vbml0b3JzIHNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgZmlsdGVyczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCBBTEx9fTsKKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxLCBmaWx0ZXJzMSkuaXNPaygpKTsKKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT51bnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjEpLmlzT2soKSk7CisKKyAgICAvLyBVbnJlZ2lzdGVyIGFnYWluIHNob3VsZCBmYWlsLgorICAgIHN0YXR1cyA9IG1PYnNlcnZlclNlcnZpY2UtPnVucmVnaXN0ZXJPYnNlcnZlcihtVGVzdE9ic2VydmVyMSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgTkFNRV9OT1RfRk9VTkQpOworfQorCitURVNUX0YoUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VUZXN0LCB0ZXN0QWRkUmVzb3VyY2VCYXNpYykgeworICAgIHJlZ2lzdGVyT2JzZXJ2ZXJzKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVQYXJjZWw+IG9ic2VydmFibGVzMSwgb2JzZXJ2YWJsZXMyLCBvYnNlcnZhYmxlczM7CisgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfSwKKyAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKyAgICAvLyBBZGQgc2VjdXJlIHZpZGVvIGNvZGVjLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKworICAgIC8vIEFkZCBub24tc2VjdXJlIHZpZGVvIGNvZGVjLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKworICAgIC8vIEFkZCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7CisKKyAgICAvLyBBZGQgYWRkaXRpb25hbCBhdWRpbyBjb2RlY3MsIHNob3VsZCBiZSBpZ25vcmVkLgorICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKSk7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pKTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczMpKTsKK30KKworVEVTVF9GKFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCwgdGVzdEFkZFJlc291cmNlTXVsdGlwbGUpIHsKKyAgICByZWdpc3Rlck9ic2VydmVycygpOworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiBvYnNlcnZhYmxlczEsIG9ic2VydmFibGVzMiwgb2JzZXJ2YWJsZXMzOworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX0sCisgICAgICAgICAgICAgICAgICAge01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisKKyAgICBzdGQ6OnZlY3RvcjxNZWRpYVJlc291cmNlUGFyY2VsPiByZXNvdXJjZXM7CisKKyAgICAvLyBBZGQgbXVsdGlwbGUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgLy8gTXVsdGlwbGUgZW50cmllcyBvZiB0aGUgc2FtZSB0eXBlIHNob3VsZCBiZSBtZXJnZWQsIGNvdW50IHNob3VsZCBiZSBwcm9wYWdhdGVkIGNvcnJlY3RseS4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCAzIC8qY291bnQqLyl9OworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDJ9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAzfX07CisgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMn0sCisgICAgICAgICAgICAgICAgICAge01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAzfX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMzKSk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU9ic2VydmVyU2VydmljZVRlc3QsIHRlc3RSZW1vdmVSZXNvdXJjZUJhc2ljKSB7CisgICAgcmVnaXN0ZXJPYnNlcnZlcnMoKTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4gb2JzZXJ2YWJsZXMxLCBvYnNlcnZhYmxlczIsIG9ic2VydmFibGVzMzsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9LAorICAgICAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworICAgIC8vIEFkZCBzZWN1cmUgdmlkZW8gY29kZWMgdG8gY2xpZW50MS4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDEsIGtUZXN0UGlkMSwgb2JzZXJ2YWJsZXMxKSk7CisgICAgLy8gUmVtb3ZlIHNlY3VyZSB2aWRlbyBjb2RlYy4gb2JzZXJ2ZXIgMSYzIHNob3VsZCByZWNlaXZlIHVwZGF0ZXMuCisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQxLCBrVGVzdFBpZDEsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMSwga1Rlc3RQaWQxLCBvYnNlcnZhYmxlczEpKTsKKyAgICAvLyBSZW1vdmUgc2VjdXJlIHZpZGVvIGNvZGVjIGFnYWluLCBzaG91bGQgaGF2ZSBubyBldmVudC4KKyAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIC8vIFJlbW92ZSBjbGllbnQxLCBzaG91bGQgaGF2ZSBubyBldmVudC4KKyAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBBZGQgbm9uLXNlY3VyZSB2aWRlbyBjb2RlYyB0byBjbGllbnQyLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MiksIG1UZXN0Q2xpZW50MiwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICAvLyBSZW1vdmUgY2xpZW50Miwgb2JzZXJ2ZXIgMiYzIHNob3VsZCByZWNlaXZlIHVwZGF0ZXMuCisgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIC8vIFJlbW92ZSBub24tc2VjdXJlIGNvZGVjIGFmdGVyIGNsaWVudDIgcmVtb3ZlZCwgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICAvLyBSZW1vdmUgY2xpZW50MiBhZ2Fpbiwgc2hvdWxkIGhhdmUgbm8gZXZlbnQuCisgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gQWRkIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLCBwbHVzIGF1ZGlvIGNvZGVjcyAodGhhdCdzIGlnbm9yZWQpLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBrVGVzdFVpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKKyAgICAvLyBSZW1vdmUgb25lIGF1ZGlvIGNvZGVjLCBzaG91bGQgaGF2ZSBubyBldmVudC4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDAgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICAvLyBSZW1vdmUgdGhlIG90aGVyIGF1ZGlvIGNvZGVjIGFuZCB0aGUgc2VjdXJlIHZpZGVvIGNvZGVjLCBvbmx5IHNlY3VyZSB2aWRlbyBjb2RlYworICAgIC8vIHJlbW92YWwgc2hvdWxkIGJlIHJlcG9ydGVkLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pfTsKKyAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCByZXNvdXJjZXMpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOworICAgIC8vIFJlbW92ZSBjbGllbnQzIGVudGlyZWx5LiBOb24tc2VjdXJlIHZpZGVvIGNvZGVjIHJlbW92YWwgc2hvdWxkIGJlIHJlcG9ydGVkLgorICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKK30KKworVEVTVF9GKFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlVGVzdCwgdGVzdFJlbW92ZVJlc291cmNlTXVsdGlwbGUpIHsKKyAgICByZWdpc3Rlck9ic2VydmVycygpOworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFPYnNlcnZhYmxlUGFyY2VsPiBvYnNlcnZhYmxlczEsIG9ic2VydmFibGVzMiwgb2JzZXJ2YWJsZXMzOworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX0sCisgICAgICAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMX19OworCisgICAgc3RkOjp2ZWN0b3I8TWVkaWFSZXNvdXJjZVBhcmNlbD4gcmVzb3VyY2VzOworCisgICAgLy8gQWRkIG11bHRpcGxlIHNlY3VyZSAmIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLCBwbHVzIGF1ZGlvIGNvZGVjcyAodGhhdCdzIGlnbm9yZWQpLgorICAgIC8vIChSZXNvdXJjZU1hbmFnZXIgd2lsbCBtZXJnZSB0aGVzZSBpbnRlcm5hbGx5LikKKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovLCA0IC8qY291bnQqLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMSAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyksCisgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UoMCAvKnNlY3VyZSovLCAwIC8qdmlkZW8qLyl9OworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMpOworICAgIG9ic2VydmFibGVzMSA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9fTsKKyAgICBvYnNlcnZhYmxlczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCA0fX07CisgICAgb2JzZXJ2YWJsZXMzID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX0sCisgICAgICAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgNH19OworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMS0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMxKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIyLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczIpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjMtPnBvcCgpLCBFdmVudFRyYWNrZXI6OkJ1c3koa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMykpOworICAgIC8vIFJlbW92ZSBvbmUgYXVkaW8gY29kZWMsIDIgc2VjdXJlIHZpZGVvIGNvZGVjcyBhbmQgMiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICAvLyAxIHNlY3VyZSB2aWRlbyBjb2RlYyByZW1vdmFsIGFuZCAyIG5vbi1zZWN1cmUgdmlkZW8gY29kZWMgcmVtb3ZhbHMgc2hvdWxkIGJlIHJlcG9ydGVkLgorICAgIHJlc291cmNlcyA9IHtNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMCAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDEgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8pLAorICAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlOjpDb2RlY1Jlc291cmNlKDAgLypzZWN1cmUqLywgMSAvKnZpZGVvKi8sIDIgLypjb3VudCovKX07CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKKyAgICBvYnNlcnZhYmxlczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCAxfX07CisgICAgb2JzZXJ2YWJsZXMyID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgMn19OworICAgIG9ic2VydmFibGVzMyA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvU2VjdXJlQ29kZWMsIDF9LAorICAgICAgICAgICAgICAgICAgICB7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDJ9fTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMSkpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczMpKTsKKyAgICAvLyBSZW1vdmUgY2xpZW50MyBlbnRpcmVseS4gMiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcyByZW1vdmFsIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6OklkbGUoa1Rlc3RVaWQyLCBrVGVzdFBpZDIsIG9ic2VydmFibGVzMikpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU9ic2VydmVyU2VydmljZVRlc3QsIHRlc3RFdmVudEZpbHRlcnMpIHsKKyAgICAvLyBSZWdpc3RlciBvYnNlcnZlcnMgd2l0aCBkaWZmZXJlbnQgZXZlbnQgZmlsdGVycy4KKyAgICBzdGQ6OnZlY3RvcjxNZWRpYU9ic2VydmFibGVGaWx0ZXI+IGZpbHRlcnMxLCBmaWx0ZXJzMiwgZmlsdGVyczM7CisgICAgZmlsdGVyczEgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCBCVVNZfX07CisgICAgZmlsdGVyczIgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb05vblNlY3VyZUNvZGVjLCBJRExFfX07CisgICAgZmlsdGVyczMgPSB7e01lZGlhT2JzZXJ2YWJsZVR5cGU6OmtWaWRlb1NlY3VyZUNvZGVjLCBJRExFfSwKKyAgICAgICAgICAgICAgIHtNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9Ob25TZWN1cmVDb2RlYywgQlVTWX19OworCisgICAgLy8gbVRlc3RPYnNlcnZlcjEgbW9uaXRvcnMgc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIxLCBmaWx0ZXJzMSkuaXNPaygpKTsKKworICAgIC8vIG1UZXN0T2JzZXJ2ZXIyIG1vbml0b3JzIG5vbi1zZWN1cmUgdmlkZW8gY29kZWNzLgorICAgIEVYUEVDVF9UUlVFKG1PYnNlcnZlclNlcnZpY2UtPnJlZ2lzdGVyT2JzZXJ2ZXIobVRlc3RPYnNlcnZlcjIsIGZpbHRlcnMyKS5pc09rKCkpOworCisgICAgLy8gbVRlc3RPYnNlcnZlcjMgbW9uaXRvcnMgYm90aCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICBFWFBFQ1RfVFJVRShtT2JzZXJ2ZXJTZXJ2aWNlLT5yZWdpc3Rlck9ic2VydmVyKG1UZXN0T2JzZXJ2ZXIzLCBmaWx0ZXJzMykuaXNPaygpKTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhT2JzZXJ2YWJsZVBhcmNlbD4gb2JzZXJ2YWJsZXMxLCBvYnNlcnZhYmxlczI7CisgICAgb2JzZXJ2YWJsZXMxID0ge3tNZWRpYU9ic2VydmFibGVUeXBlOjprVmlkZW9TZWN1cmVDb2RlYywgMX19OworICAgIG9ic2VydmFibGVzMiA9IHt7TWVkaWFPYnNlcnZhYmxlVHlwZTo6a1ZpZGVvTm9uU2VjdXJlQ29kZWMsIDF9fTsKKworICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKKworICAgIC8vIEFkZCBzZWN1cmUgJiBub24tc2VjdXJlIHZpZGVvIGNvZGVjcy4KKyAgICByZXNvdXJjZXMgPSB7TWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgxIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKSwKKyAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6Q29kZWNSZXNvdXJjZSgwIC8qc2VjdXJlKi8sIDEgLyp2aWRlbyovKX07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlcyk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIxLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpCdXN5KGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjItPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMy0+cG9wKCksIEV2ZW50VHJhY2tlcjo6QnVzeShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisKKyAgICAvLyBSZW1vdmUgc2VjdXJlICYgbm9uLXNlY3VyZSB2aWRlbyBjb2RlY3MuCisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgcmVzb3VyY2VzKTsKKyAgICBFWFBFQ1RfRVEobVRlc3RPYnNlcnZlcjEtPnBvcCgpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtVGVzdE9ic2VydmVyMi0+cG9wKCksIEV2ZW50VHJhY2tlcjo6SWRsZShrVGVzdFVpZDIsIGtUZXN0UGlkMiwgb2JzZXJ2YWJsZXMyKSk7CisgICAgRVhQRUNUX0VRKG1UZXN0T2JzZXJ2ZXIzLT5wb3AoKSwgRXZlbnRUcmFja2VyOjpJZGxlKGtUZXN0VWlkMiwga1Rlc3RQaWQyLCBvYnNlcnZhYmxlczEpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjNGFlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbICIkU1lOQ19GSU5JU0hFRCIgIT0gdHJ1ZSBdOyB0aGVuCisgIGlmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgICAgZXhpdCAtMQorICBmaQorCisgICMgZW5zdXJlIHdlIGhhdmUgbW0KKyAgLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworICBtbQorCisgIGVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworICBhZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQgJiYgYWRiIHN5bmMKK2ZpCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisKK2VjaG8gInRlc3RpbmcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QKK2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QKKworZWNobyAidGVzdGluZyBTZXJ2aWNlTG9nIgorI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvU2VydmljZUxvZ190ZXN0L1NlcnZpY2VMb2dfdGVzdAorYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvU2VydmljZUxvZ190ZXN0L1NlcnZpY2VMb2dfdGVzdAorCitlY2hvICJ0ZXN0aW5nIFJlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlIgorI2FkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvUmVzb3VyY2VPYnNlcnZlclNlcnZpY2VfdGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0CithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9SZXNvdXJjZU9ic2VydmVyU2VydmljZV90ZXN0L1Jlc291cmNlT2JzZXJ2ZXJTZXJ2aWNlX3Rlc3QKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAppbmRleCAxNzM0N2E5Li5hOWZkMTRmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCkBAIC0xLDE3ICsxLDUxIEBACiAvLyBzZXJ2aWNlIGxpYnJhcnkKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYXRyYW5zY29kaW5nX2xpY2Vuc2UiLAorICAgIF0sCit9CisKKy8vIEFkZGVkIGF1dG9tYXRpY2FsbHkgYnkgYSBsYXJnZS1zY2FsZS1jaGFuZ2UKKy8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKK2xpY2Vuc2UgeworICAgIG5hbWU6ICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhdHJhbnNjb2RpbmdfbGljZW5zZSIsCisgICAgdmlzaWJpbGl0eTogWyI6X19zdWJwYWNrYWdlc19fIl0sCisgICAgbGljZW5zZV9raW5kczogWworICAgICAgICAiU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMCIsCisgICAgXSwKKyAgICBsaWNlbnNlX3RleHQ6IFsKKyAgICAgICAgIk5PVElDRSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlIiwKIAotICAgIHNyY3M6IFsiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwIl0sCisgICAgc3JjczogWworICAgICAgICAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNpbXVsYXRlZFRyYW5zY29kZXIuY3BwIiwKKyAgICBdLAorCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgICAgICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFuZHJvaWQjMzEiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmciLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCkBAIC0zMSw4ICs2NSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCi0gICAgICAgIC8vIFRPRE8oaGt1YW5nKTogVXNlIGxpYmJpbmRlcl9uZGsKLSAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJiYXNlIiwKQEAgLTQwLDI0ICs3MywxNiBAQAogICAgICAgICAibGlibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UiLAogICAgIF0sCiAKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICAgICAgInRlc3RfY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQotICAgIGluaXRfcmM6IFsibWVkaWF0cmFuc2NvZGluZy5yYyJdLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9NZWRpYVRyYW5zY29kaW5nU2VydmljZS5jcHAKaW5kZXggODJkNDE2MS4uMmEyMDk4MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9NZWRpYVRyYW5zY29kaW5nU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9NZWRpYVRyYW5zY29kaW5nU2VydmljZS5jcHAKQEAgLTE2LDEzICsxNiwyNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIgotI2luY2x1ZGUgPE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+CisjaW5jbHVkZSAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaCIKKwogI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9wZXJtaXNzaW9uX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdMb2dnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9UcmFuc2NvZGluZ1Jlc291cmNlUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nVGhlcm1hbFBvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nVWlkUG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKKyNpbmNsdWRlICJTaW11bGF0ZWRUcmFuc2NvZGVyLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKQEAgLTMxLDIzICs0Myw1MyBAQAogICAgICAgICAgICAgZXJyb3JDb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlczolZDogIiBlcnJvclN0cmluZywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXykpCiAKLS8vIENhbiBNZWRpYVRyYW5zY29kaW5nIHNlcnZpY2UgdHJ1c3QgdGhlIGNhbGxlciBiYXNlZCBvbiB0aGUgY2FsbGluZyBVSUQ/Ci0vLyBUT0RPKGhrdWFuZyk6IEFkZCBNZWRpYVByb3ZpZGVyJ3MgVUlELgotc3RhdGljIGJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpIHsKLSAgICBzd2l0Y2ggKHVpZCkgewotICAgIGNhc2UgQUlEX1JPT1Q6ICAvLyByb290IHVzZXIKLSAgICBjYXNlIEFJRF9TWVNURU06Ci0gICAgY2FzZSBBSURfU0hFTEw6Ci0gICAgY2FzZSBBSURfTUVESUE6ICAvLyBtZWRpYXNlcnZlcgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtUcmFuc2NvZGVySGVhcnRCZWF0SW50ZXJ2YWxVcyA9IDEwMDAwMDBMTDsKIAogTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6Ok1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlKCkKLSAgICAgIDogbVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcihUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkpIHsKKyAgICAgIDogbVVpZFBvbGljeShuZXcgVHJhbnNjb2RpbmdVaWRQb2xpY3koKSksCisgICAgICAgIG1SZXNvdXJjZVBvbGljeShuZXcgVHJhbnNjb2RpbmdSZXNvdXJjZVBvbGljeSgpKSwKKyAgICAgICAgbVRoZXJtYWxQb2xpY3kobmV3IFRyYW5zY29kaW5nVGhlcm1hbFBvbGljeSgpKSwKKyAgICAgICAgbUxvZ2dlcihuZXcgVHJhbnNjb2RpbmdMb2dnZXIoKSkgewogICAgIEFMT0dWKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZSBpcyBjcmVhdGVkIik7CisgICAgYm9vbCBzaW11bGF0ZWQgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcudHJhbnNjb2Rpbmcuc2ltdWxhdGVkX3RyYW5zY29kZXIiLCBmYWxzZSk7CisgICAgaWYgKHNpbXVsYXRlZCkgeworICAgICAgICAvLyBPdmVycmlkIGRlZmF1bHQgY29uZmlnIHBhcmFtcyB3aXRoIHNob3J0ZXIgdmFsdWVzIGZvciB0ZXN0aW5nLgorICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOjpDb250cm9sbGVyQ29uZmlnIGNvbmZpZyA9IHsKKyAgICAgICAgICAgICAgICAucGFjZXJCdXJzdFRocmVzaG9sZE1zID0gNTAwLAorICAgICAgICAgICAgICAgIC5wYWNlckJ1cnN0Q291bnRRdW90YSA9IDEwLAorICAgICAgICAgICAgICAgIC5wYWNlckJ1cnN0VGltZVF1b3RhU2Vjb25kcyA9IDMsCisgICAgICAgIH07CisgICAgICAgIG1TZXNzaW9uQ29udHJvbGxlci5yZXNldChuZXcgVHJhbnNjb2RpbmdTZXNzaW9uQ29udHJvbGxlcigKKyAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpCisgICAgICAgICAgICAgICAgICAgICAgICAtPiBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckludGVyZmFjZT4geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxTaW11bGF0ZWRUcmFuc2NvZGVyPihjYik7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBtVWlkUG9saWN5LCBtUmVzb3VyY2VQb2xpY3ksIG1UaGVybWFsUG9saWN5LCAmY29uZmlnKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCBvdmVycmlkZUJ1cnN0Q291bnRRdW90YSA9CisgICAgICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2ludDMyKCJwZXJzaXN0LnRyYW5zY29kaW5nLmJ1cnN0X2NvdW50X3F1b3RhIiwgLTEpOworICAgICAgICBpbnQzMl90IHBhY2VyQnVyc3RUaW1lUXVvdGFTZWNvbmRzID0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfaW50MzIoInBlcnNpc3QudHJhbnNjb2RpbmcuYnVyc3RfdGltZV9xdW90YV9zZWNvbmRzIiwgLTEpOworICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IGNvbmZpZyBwYXJhbXMgd2l0aCBwcm9wZXJ0aWVzIGlmIHByZXNlbnQuCisgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI6OkNvbnRyb2xsZXJDb25maWcgY29uZmlnOworICAgICAgICBpZiAob3ZlcnJpZGVCdXJzdENvdW50UXVvdGEgPiAwKSB7CisgICAgICAgICAgICBjb25maWcucGFjZXJCdXJzdENvdW50UXVvdGEgPSBvdmVycmlkZUJ1cnN0Q291bnRRdW90YTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFjZXJCdXJzdFRpbWVRdW90YVNlY29uZHMgPiAwKSB7CisgICAgICAgICAgICBjb25maWcucGFjZXJCdXJzdFRpbWVRdW90YVNlY29uZHMgPSBwYWNlckJ1cnN0VGltZVF1b3RhU2Vjb25kczsKKyAgICAgICAgfQorICAgICAgICBtU2Vzc2lvbkNvbnRyb2xsZXIucmVzZXQobmV3IFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXIoCisgICAgICAgICAgICAgICAgW2xvZ2dlciA9IG1Mb2dnZXJdKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiBjYikKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVySW50ZXJmYWNlPiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRyYW5zY29kZXJXcmFwcGVyPihjYiwgbG9nZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RyYW5zY29kZXJIZWFydEJlYXRJbnRlcnZhbFVzKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG1VaWRQb2xpY3ksIG1SZXNvdXJjZVBvbGljeSwgbVRoZXJtYWxQb2xpY3ksICZjb25maWcpKTsKKyAgICB9CisgICAgbUNsaWVudE1hbmFnZXIucmVzZXQobmV3IFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcihtU2Vzc2lvbkNvbnRyb2xsZXIpKTsKKyAgICBtVWlkUG9saWN5LT5zZXRDYWxsYmFjayhtU2Vzc2lvbkNvbnRyb2xsZXIpOworICAgIG1SZXNvdXJjZVBvbGljeS0+c2V0Q2FsbGJhY2sobVNlc3Npb25Db250cm9sbGVyKTsKKyAgICBtVGhlcm1hbFBvbGljeS0+c2V0Q2FsbGJhY2sobVNlc3Npb25Db250cm9sbGVyKTsKIH0KIAogTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6On5NZWRpYVRyYW5zY29kaW5nU2VydmljZSgpIHsKQEAgLTU2LDYgKzk4LDIzIEBACiAKIGJpbmRlcl9zdGF0dXNfdCBNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IGNoYXIqKiAvKmFyZ3MqLywgdWludDMyX3QgLypudW1BcmdzKi8pIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHVpZF90IGNhbGxpbmdVaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7CisgICAgcGlkX3QgY2FsbGluZ1BpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoX19idWlsdGluX2F2YWlsYWJsZShhbmRyb2lkIF9fVFJBTlNDT0RJTkdfTUlOX0FQSV9fLCAqKSkgeworICAgICAgICBpbnQzMl90IHBlcm1pc3Npb25SZXN1bHQ7CisgICAgICAgIGlmIChBUGVybWlzc2lvbk1hbmFnZXJfY2hlY2tQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIsIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uUmVzdWx0KSAhPSBQRVJNSVNTSU9OX01BTkFHRVJfU1RBVFVTX09LIHx8CisgICAgICAgICAgICBwZXJtaXNzaW9uUmVzdWx0ICE9IFBFUk1JU1NJT05fTUFOQUdFUl9QRVJNSVNTSU9OX0dSQU5URUQpIHsKKyAgICAgICAgICAgIHJlc3VsdC5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBNZWRpYVRyYW5zY29kaW5nU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCksIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCkBAIC02NCw3ICsxMjMsOCBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOwotICAgIG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuZHVtcEFsbENsaWVudHMoZmQsIGFyZ3MpOworICAgIG1DbGllbnRNYW5hZ2VyLT5kdW1wQWxsQ2xpZW50cyhmZCwgYXJncyk7CisgICAgbVNlc3Npb25Db250cm9sbGVyLT5kdW1wQWxsU2Vzc2lvbnMoZmQsIGFyZ3MpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNzIsMTI2ICsxMzIsMzkgQEAKIHZvaWQgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6Omluc3RhbnRpYXRlKCkgewogICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYVRyYW5zY29kaW5nU2VydmljZT4gc2VydmljZSA9CiAgICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxNZWRpYVRyYW5zY29kaW5nU2VydmljZT4oKTsKLSAgICBiaW5kZXJfc3RhdHVzX3Qgc3RhdHVzID0KLSAgICAgICAgICAgIEFTZXJ2aWNlTWFuYWdlcl9hZGRTZXJ2aWNlKHNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOwotICAgIGlmIChzdGF0dXMgIT0gU1RBVFVTX09LKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoX19idWlsdGluX2F2YWlsYWJsZShhbmRyb2lkIF9fVFJBTlNDT0RJTkdfTUlOX0FQSV9fLCAqKSkgeworICAgICAgICAvLyBPbmNlIHNlcnZpY2UgaXMgc3RhcnRlZCwgd2Ugd2FudCBpdCB0byBzdGF5IGV2ZW4gaXMgY2xpZW50IHNpZGUgcGVyaXNoZWQuCisgICAgICAgIEFTZXJ2aWNlTWFuYWdlcl9mb3JjZUxhenlTZXJ2aWNlc1BlcnNpc3QodHJ1ZSAvKnBlcnNpc3QqLyk7CisgICAgICAgICh2b2lkKUFTZXJ2aWNlTWFuYWdlcl9yZWdpc3RlckxhenlTZXJ2aWNlKHNlcnZpY2UtPmFzQmluZGVyKCkuZ2V0KCksIGdldFNlcnZpY2VOYW1lKCkpOwogICAgIH0KIH0KIAogU3RhdHVzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpyZWdpc3RlckNsaWVudCgKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+JiBpbl9jbGllbnQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLCBpbnQzMl90IGluX2NsaWVudFVpZCwgaW50MzJfdCBpbl9jbGllbnRQaWQsCi0gICAgICAgIGludDMyX3QqIF9haWRsX3JldHVybikgewotICAgIGlmIChpbl9jbGllbnQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiQ2xpZW50IGNhbiBub3QgYmUgbnVsbCIpOwotICAgICAgICAqX2FpZGxfcmV0dXJuID0ga0ludmFsaWRKb2JJZDsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwotICAgIH0KLQotICAgIGludDMyX3QgY2FsbGluZ1BpZCA9IEFJQmluZGVyX2dldENhbGxpbmdQaWQoKTsKLSAgICBpbnQzMl90IGNhbGxpbmdVaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nVWlkKCk7Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUgdWlkIG9uIGFwcCBjbGllbnQncyBiZWhhbGYuCi0gICAgaWYgKGluX2NsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKLSAgICAgICAgaW5fY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKLSAgICB9IGVsc2UgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgZmFpbGVkIChjYWxsaW5nIFBJRCAlZCwgY2FsbGluZyBVSUQgJWQpICIKLSAgICAgICAgICAgICAgInJlamVjdGVkICIKLSAgICAgICAgICAgICAgIihkb24ndCB0cnVzdCBjbGllbnRVaWQgJWQpIiwKLSAgICAgICAgICAgICAgaW5fY2xpZW50UGlkLCBpbl9jbGllbnRVaWQsIGluX2NsaWVudFVpZCk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX1BFUk1JU1NJT05fREVOSUVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW50cnVzdGVkIGNhbGxlciAoY2FsbGluZyBQSUQgJWQsIFVJRCAlZCkgdHJ5aW5nIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NsaWVudFBpZCwgaW5fY2xpZW50VWlkKTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50UGlkLiBPbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQgZm9yd2FyZCB0aGUgcGlkIG9uIGFwcCBjbGllbnQncyBiZWhhbGYuCi0gICAgaWYgKGluX2NsaWVudFBpZCA9PSBVU0VfQ0FMTElOR19QSUQpIHsKLSAgICAgICAgaW5fY2xpZW50UGlkID0gY2FsbGluZ1BpZDsKLSAgICB9IGVsc2UgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7Ci0gICAgICAgIEFMT0dFKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6cmVnaXN0ZXJDbGllbnQgY2xpZW50IGZhaWxlZCAoY2FsbGluZyBQSUQgJWQsIGNhbGxpbmcgVUlEICIKLSAgICAgICAgICAgICAgIiVkKSByZWplY3RlZCAiCi0gICAgICAgICAgICAgICIoZG9uJ3QgdHJ1c3QgY2xpZW50UGlkICVkKSIsCi0gICAgICAgICAgICAgIGluX2NsaWVudFBpZCwgaW5fY2xpZW50VWlkLCBpbl9jbGllbnRQaWQpOwotICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVudHJ1c3RlZCBjYWxsZXIgKGNhbGxpbmcgUElEICVkLCBVSUQgJWQpIHRyeWluZyB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlciBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCk7Ci0gICAgfQotCi0gICAgLy8gV2Uga25vdyB0aGUgY2xpZW50SWQgbXVzdCBiZSBlcXVhbCB0byBpdHMgcGlkIGFzIHdlIGFzc2lnbmVkIGNsaWVudCdzIHBpZCBhcyBpdHMgY2xpZW50SWQuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IGluX2NsaWVudFBpZDsKLQotICAgIC8vIENoZWNrcyBpZiB0aGUgY2xpZW50IGFscmVhZHkgcmVnaXN0ZXJzLgotICAgIGlmIChtVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyLmlzQ2xpZW50SWRSZWdpc3RlcmVkKGNsaWVudElkKSkgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoRVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBpbl9jYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKGluX2NhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJDbGllbnQgY2FsbGJhY2sgY2Fubm90IGJlIG51bGwhIik7CiAgICAgfQogCiAgICAgLy8gQ3JlYXRlcyB0aGUgY2xpZW50IGFuZCB1c2VzIGl0cyBwcm9jZXNzIGlkIGFzIGNsaWVudCBpZC4KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOjpDbGllbnRJbmZvPiBuZXdDbGllbnQgPQotICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2NvZGluZ0NsaWVudE1hbmFnZXI6OkNsaWVudEluZm8+KAotICAgICAgICAgICAgICAgICAgICBpbl9jbGllbnQsIGNsaWVudElkLCBpbl9jbGllbnRQaWQsIGluX2NsaWVudFVpZCwgaW5fb3BQYWNrYWdlTmFtZSk7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5hZGRDbGllbnQoc3RkOjptb3ZlKG5ld0NsaWVudCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IG5ld0NsaWVudDsKKworICAgIHN0YXR1c190IGVyciA9CisgICAgICAgICAgICBtQ2xpZW50TWFuYWdlci0+YWRkQ2xpZW50KGluX2NhbGxiYWNrLCBpbl9jbGllbnROYW1lLCBpbl9vcFBhY2thZ2VOYW1lLCAmbmV3Q2xpZW50KTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICpfYWlkbF9yZXR1cm4gPSBrSW52YWxpZENsaWVudElkOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbnVsbHB0cjsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoZXJyLCAiRmFpbGVkIHRvIGFkZCBjbGllbnQgdG8gVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyIik7CiAgICAgfQogCi0gICAgQUxPR0QoIkFzc2lnbiBjbGllbnQ6ICVzIHBpZDogJWQsIHVpZDogJWQgd2l0aCBpZDogJWQiLCBpbl9vcFBhY2thZ2VOYW1lLmNfc3RyKCksIGluX2NsaWVudFBpZCwKLSAgICAgICAgICBpbl9jbGllbnRVaWQsIGNsaWVudElkKTsKLQotICAgICpfYWlkbF9yZXR1cm4gPSBjbGllbnRJZDsKLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OnVucmVnaXN0ZXJDbGllbnQoaW50MzJfdCBjbGllbnRJZCwgYm9vbCogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR0QoInVucmVnaXN0ZXJDbGllbnQgaWQ6ICVkIiwgY2xpZW50SWQpOwotICAgIGludDMyX3QgY2FsbGluZ1VpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKLSAgICBpbnQzMl90IGNhbGxpbmdQaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICAvLyBPbmx5IHRoZSBjbGllbnQgd2l0aCBjbGllbnRJZCBvciB0aGUgdHJ1c3RlZCBjYWxsZXIgY291bGQgdW5yZWdpc3RlciB0aGUgY2xpZW50LgotICAgIGlmIChjYWxsaW5nUGlkICE9IGNsaWVudElkKSB7Ci0gICAgICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgewotICAgICAgICAgICAgQUxPR0UoIlVudHJ1c3RlZCBjYWxsZXIgKGNhbGxpbmcgUElEICVkLCBVSUQgJWQpIHRyeWluZyB0byAiCi0gICAgICAgICAgICAgICAgICAidW5yZWdpc3RlciBjbGllbnQgd2l0aCBpZDogJWQiLAotICAgICAgICAgICAgICAgICAgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50SWQpOwotICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnRydXN0ZWQgY2FsbGVyIChjYWxsaW5nIFBJRCAlZCwgVUlEICVkKSB0cnlpbmcgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVnaXN0ZXIgY2xpZW50IHdpdGggaWQ6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudElkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICpfYWlkbF9yZXR1cm4gPSAobVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5yZW1vdmVDbGllbnQoY2xpZW50SWQpID09IE9LKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbmV3Q2xpZW50OwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKIFN0YXR1cyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Z2V0TnVtT2ZDbGllbnRzKGludDMyX3QqIF9haWRsX3JldHVybikgewogICAgIEFMT0dEKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Z2V0TnVtT2ZDbGllbnRzIik7Ci0gICAgKl9haWRsX3JldHVybiA9IG1UcmFuc2NvZGluZ0NsaWVudE1hbmFnZXIuZ2V0TnVtT2ZDbGllbnRzKCk7Ci0gICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLX0KLQotU3RhdHVzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpzdWJtaXRSZXF1ZXN0KGludDMyX3QgLypjbGllbnRJZCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgLypyZXF1ZXN0Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdKb2JQYXJjZWwqIC8qam9iKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogLypfYWlkbF9yZXR1cm4qLykgewotICAgIC8vIFRPRE8oaGt1YW5nKTogQWRkIGltcGxlbWVudGF0aW9uLgotICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci19Ci0KLVN0YXR1cyBNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6Y2FuY2VsSm9iKGludDMyX3QgLyppbl9jbGllbnRJZCovLCBpbnQzMl90IC8qaW5fam9iSWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKLSAgICAvLyBUT0RPKGhrdWFuZyk6IEFkZCBpbXBsZW1lbnRhdGlvbi4KLSAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotfQotCi1TdGF0dXMgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OmdldEpvYldpdGhJZChpbnQzMl90IC8qaW5fam9iSWQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zY29kaW5nSm9iUGFyY2VsKiAvKm91dF9qb2IqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIC8qX2FpZGxfcmV0dXJuKi8pIHsKLSAgICAvLyBUT0RPKGhrdWFuZyk6IEFkZCBpbXBsZW1lbnRhdGlvbi4KKyAgICAqX2FpZGxfcmV0dXJuID0gbUNsaWVudE1hbmFnZXItPmdldE51bU9mQ2xpZW50cygpOwogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaAppbmRleCBjYzY5NzI3Li4xMmJlMTMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9NZWRpYVRyYW5zY29kaW5nU2VydmljZS5oCkBAIC0xOSwxOSArMTksMjUgQEAKIAogI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9Cbk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL1RyYW5zY29kaW5nQ2xpZW50TWFuYWdlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6Qm5NZWRpYVRyYW5zY29kaW5nU2VydmljZTsKLXVzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ7Ci11c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0pvYlBhcmNlbDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrOwogdXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOworY2xhc3MgVHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyOworY2xhc3MgVHJhbnNjb2RpbmdMb2dnZXI7CitjbGFzcyBUcmFuc2NvZGluZ1Nlc3Npb25Db250cm9sbGVyOworY2xhc3MgVWlkUG9saWN5SW50ZXJmYWNlOworY2xhc3MgUmVzb3VyY2VQb2xpY3lJbnRlcmZhY2U7CitjbGFzcyBUaGVybWFsUG9saWN5SW50ZXJmYWNlOwogCiBjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0ludmFsaWRKb2JJZCA9IC0xOworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZFNlc3Npb25JZCA9IC0xOwogICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudElkID0gLTE7CiAKICAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZSgpOwpAQCAtNDEsMjIgKzQ3LDEyIEBACiAKICAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEudHJhbnNjb2RpbmciOyB9CiAKLSAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+JiBpbl9jbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLCBpbnQzMl90IGluX2NsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbl9jbGllbnRQaWQsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7Ci0KLSAgICBTdGF0dXMgdW5yZWdpc3RlckNsaWVudChpbnQzMl90IGNsaWVudElkLCBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyByZWdpc3RlckNsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s+JiBpbl9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluX2NsaWVudE5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9vcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAogICAgIFN0YXR1cyBnZXROdW1PZkNsaWVudHMoaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIFN0YXR1cyBzdWJtaXRSZXF1ZXN0KGludDMyX3QgaW5fY2xpZW50SWQsIGNvbnN0IFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCYgaW5fcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ0pvYlBhcmNlbCogb3V0X2pvYiwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBjYW5jZWxKb2IoaW50MzJfdCBpbl9jbGllbnRJZCwgaW50MzJfdCBpbl9qb2JJZCwgYm9vbCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKLQotICAgIFN0YXR1cyBnZXRKb2JXaXRoSWQoaW50MzJfdCBpbl9qb2JJZCwgVHJhbnNjb2RpbmdKb2JQYXJjZWwqIG91dF9qb2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwotCiAgICAgdmlydHVhbCBpbmxpbmUgYmluZGVyX3N0YXR1c190IGR1bXAoaW50IC8qZmQqLywgY29uc3QgY2hhcioqIC8qYXJncyovLCB1aW50MzJfdCAvKm51bUFyZ3MqLyk7CiAKIHByaXZhdGU6CkBAIC02NCw3ICs2MCwxMiBAQAogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1TZXJ2aWNlTG9jazsKIAotICAgIFRyYW5zY29kaW5nQ2xpZW50TWFuYWdlciYgbVRyYW5zY29kaW5nQ2xpZW50TWFuYWdlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VWlkUG9saWN5SW50ZXJmYWNlPiBtVWlkUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZVBvbGljeUludGVyZmFjZT4gbVJlc291cmNlUG9saWN5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaGVybWFsUG9saWN5SW50ZXJmYWNlPiBtVGhlcm1hbFBvbGljeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdMb2dnZXI+IG1Mb2dnZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zY29kaW5nU2Vzc2lvbkNvbnRyb2xsZXI+IG1TZXNzaW9uQ29udHJvbGxlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RpbmdDbGllbnRNYW5hZ2VyPiBtQ2xpZW50TWFuYWdlcjsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL1NpbXVsYXRlZFRyYW5zY29kZXIuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9TaW11bGF0ZWRUcmFuc2NvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODBkYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9TaW11bGF0ZWRUcmFuc2NvZGVyLmNwcApAQCAtMCwwICsxLDIxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltdWxhdGVkVHJhbnNjb2RlciIKKyNpbmNsdWRlICJTaW11bGF0ZWRUcmFuc2NvZGVyLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvL3N0YXRpYworY29uc3QgY2hhciogU2ltdWxhdGVkVHJhbnNjb2Rlcjo6dG9TdHJpbmcoRXZlbnQ6OlR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRXZlbnQ6OlN0YXJ0OgorICAgICAgICByZXR1cm4gIlN0YXJ0IjsKKyAgICBjYXNlIEV2ZW50OjpQYXVzZToKKyAgICAgICAgcmV0dXJuICJQYXVzZSI7CisgICAgY2FzZSBFdmVudDo6UmVzdW1lOgorICAgICAgICByZXR1cm4gIlJlc3VtZSI7CisgICAgY2FzZSBFdmVudDo6U3RvcDoKKyAgICAgICAgcmV0dXJuICJTdG9wIjsKKyAgICBjYXNlIEV2ZW50OjpGaW5pc2hlZDoKKyAgICAgICAgcmV0dXJuICJGaW5pc2hlZCI7CisgICAgY2FzZSBFdmVudDo6RmFpbGVkOgorICAgICAgICByZXR1cm4gIkZhaWxlZCI7CisgICAgY2FzZSBFdmVudDo6QWJhbmRvbjoKKyAgICAgICAgcmV0dXJuICJBYmFuZG9uIjsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuICIodW5rbm93bikiOworfQorCitTaW11bGF0ZWRUcmFuc2NvZGVyOjpTaW11bGF0ZWRUcmFuc2NvZGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFuc2NvZGVyQ2FsbGJhY2tJbnRlcmZhY2U+JiBjYikKKyAgICAgIDogbUNhbGxiYWNrKGNiKSwgbUxvb3BlclJlYWR5KGZhbHNlKSB7CisgICAgQUxPR1YoIlNpbXVsYXRlZFRyYW5zY29kZXIgQ1RPUjogJXAiLCB0aGlzKTsKK30KKworU2ltdWxhdGVkVHJhbnNjb2Rlcjo6flNpbXVsYXRlZFRyYW5zY29kZXIoKSB7CisgICAgQUxPR1YoIlNpbXVsYXRlZFRyYW5zY29kZXIgRFRPUjogJXAiLCB0aGlzKTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpzdGFydCgKKyAgICAgICAgQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LAorICAgICAgICB1aWRfdCAvKmNhbGxpbmdVaWQqLywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgLypjbGllbnRDYWxsYmFjayovKSB7CisgICAgeworICAgICAgICBhdXRvIGxvY2sgPSBzdGQ6OnNjb3BlZF9sb2NrKG1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBwcm9jZXNzaW5nVGltZVVzID0ga1Nlc3Npb25EdXJhdGlvblVzOworICAgICAgICBpZiAocmVxdWVzdC50ZXN0Q29uZmlnLmhhc192YWx1ZSgpICYmIHJlcXVlc3QudGVzdENvbmZpZy0+cHJvY2Vzc2luZ1RvdGFsVGltZU1zID4gMCkgeworICAgICAgICAgICAgcHJvY2Vzc2luZ1RpbWVVcyA9IHJlcXVlc3QudGVzdENvbmZpZy0+cHJvY2Vzc2luZ1RvdGFsVGltZU1zICogMTAwMDsKKyAgICAgICAgfQorICAgICAgICBBTE9HSSgiJXM6IHNlc3Npb24geyVsbGQsICVkfTogcHJvY2Vzc2luZ1RpbWVVczogJWxsZCIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZyljbGllbnRJZCwKKyAgICAgICAgICAgICAgc2Vzc2lvbklkLCAobG9uZyBsb25nKXByb2Nlc3NpbmdUaW1lVXMpOworICAgICAgICBTZXNzaW9uS2V5VHlwZSBrZXkgPSBzdGQ6Om1ha2VfcGFpcihjbGllbnRJZCwgc2Vzc2lvbklkKTsKKyAgICAgICAgbVJlbWFpbmluZ1RpbWVNYXAuZW1wbGFjZShrZXksIHByb2Nlc3NpbmdUaW1lVXMpOworICAgIH0KKworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0YXJ0LCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblN0YXJ0ZWQoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpwYXVzZShDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkKSB7CisgICAgcXVldWVFdmVudChFdmVudDo6UGF1c2UsIGNsaWVudElkLCBzZXNzaW9uSWQsIFs9XSB7CisgICAgICAgIGF1dG8gY2FsbGJhY2sgPSBtQ2FsbGJhY2subG9jaygpOworICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY2FsbGJhY2stPm9uUGF1c2VkKGNsaWVudElkLCBzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgfSk7Cit9CisKK3ZvaWQgU2ltdWxhdGVkVHJhbnNjb2Rlcjo6cmVzdW1lKAorICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIC8qcmVxdWVzdCovLAorICAgICAgICB1aWRfdCAvKmNhbGxpbmdVaWQqLywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgLypjbGllbnRDYWxsYmFjayovKSB7CisgICAgcXVldWVFdmVudChFdmVudDo6UmVzdW1lLCBjbGllbnRJZCwgc2Vzc2lvbklkLCBbPV0geworICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vblJlc3VtZWQoY2xpZW50SWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjpzdG9wKENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsIGJvb2wgYWJhbmRvbikgeworICAgIHF1ZXVlRXZlbnQoRXZlbnQ6OlN0b3AsIGNsaWVudElkLCBzZXNzaW9uSWQsIG51bGxwdHIpOworCisgICAgaWYgKGFiYW5kb24pIHsKKyAgICAgICAgcXVldWVFdmVudChFdmVudDo6QWJhbmRvbiwgMCwgMCwgbnVsbHB0cik7CisgICAgfQorfQorCit2b2lkIFNpbXVsYXRlZFRyYW5zY29kZXI6OnF1ZXVlRXZlbnQoRXZlbnQ6OlR5cGUgdHlwZSwgQ2xpZW50SWRUeXBlIGNsaWVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcnVubmFibGUpIHsKKyAgICBBTE9HVigiJXM6IHNlc3Npb24geyVsbGQsICVkfTogJXMiLCBfX0ZVTkNUSU9OX18sIChsb25nIGxvbmcpY2xpZW50SWQsIHNlc3Npb25JZCwKKyAgICAgICAgICB0b1N0cmluZyh0eXBlKSk7CisKKyAgICBhdXRvIGxvY2sgPSBzdGQ6OnNjb3BlZF9sb2NrKG1Mb2NrKTsKKworICAgIGlmICghbUxvb3BlclJlYWR5KSB7CisgICAgICAgIC8vIEEgc2hhcmVkX3B0ciB0byBvdXJzZWx2ZXMgaXMgZ2l2ZW4gdG8gdGhlIHRocmVhZCdzIHN0YWNrLCBzbyB0aGF0IFNpbXVsYXRlZFRyYW5zY29kZXIKKyAgICAgICAgLy8gb2JqZWN0IGRvZXNuJ3QgZ28gYXdheSB1bnRpbCB0aGUgdGhyZWFkIGV4aXRzLiBXaGVuIGEgd2F0Y2hkb2cgdGltZW91dCBoYXBwZW5zLCB0aGlzCisgICAgICAgIC8vIGFsbG93cyB0aGUgc2Vzc2lvbiBjb250cm9sbGVyIHRvIHJlbGVhc2UgaXRzIHJlZmVyZW5jZSB0byB0aGUgVHJhbnNjb2RlcldyYXBwZXIgb2JqZWN0CisgICAgICAgIC8vIHdpdGhvdXQgYmxvY2tpbmcgb24gdGhlIHRocmVhZCBleGl0cy4KKyAgICAgICAgc3RkOjp0aHJlYWQoW293bmVyID0gc2hhcmVkX2Zyb21fdGhpcygpXSgpIHsgb3duZXItPnRocmVhZExvb3AoKTsgfSkuZGV0YWNoKCk7CisgICAgICAgIG1Mb29wZXJSZWFkeSA9IHRydWU7CisgICAgfQorCisgICAgbVF1ZXVlLnB1c2hfYmFjayh7dHlwZSwgY2xpZW50SWQsIHNlc3Npb25JZCwgcnVubmFibGV9KTsKKyAgICBtQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKK30KKwordm9pZCBTaW11bGF0ZWRUcmFuc2NvZGVyOjp0aHJlYWRMb29wKCkgeworICAgIGJvb2wgcnVubmluZyA9IGZhbHNlOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbGFzdFJ1bm5pbmdUaW1lOworICAgIEV2ZW50IGxhc3RSdW5uaW5nRXZlbnQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIC8vIFNpbXVsYXRlZFRyYW5zY29kZXIgY3VycmVudGx5IGxpdmVzIGluIHRoZSB0cmFuc2NvZGluZyBzZXJ2aWNlLCBhcyBsb25nIGFzCisgICAgLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgaXRzZWxmLgorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGV2ZW50LgorICAgICAgICB3aGlsZSAobVF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghcnVubmluZykgeworICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChsb2NrKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHJ1bm5pbmcsIHdhaXQgZm9yIHRoZSByZW1haW5pbmcgbGlmZSBvZiB0aGlzIHNlc3Npb24uIFJlcG9ydCBmaW5pc2ggaWYgdGltZWQgb3V0LgorICAgICAgICAgICAgU2Vzc2lvbktleVR5cGUga2V5ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIobGFzdFJ1bm5pbmdFdmVudC5jbGllbnRJZCwgbGFzdFJ1bm5pbmdFdmVudC5zZXNzaW9uSWQpOworICAgICAgICAgICAgc3RkOjpjdl9zdGF0dXMgc3RhdHVzID0gbUNvbmRpdGlvbi53YWl0X2Zvcihsb2NrLCBtUmVtYWluaW5nVGltZU1hcFtrZXldKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gc3RkOjpjdl9zdGF0dXM6OnRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBhdXRvIGNhbGxiYWNrID0gbUNhbGxiYWNrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nVGltZU1hcC5lcmFzZShrZXkpOworCisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkZpbmlzaChsYXN0UnVubmluZ0V2ZW50LmNsaWVudElkLCBsYXN0UnVubmluZ0V2ZW50LnNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBsYXN0IHJ1bm5pbmcgdGltZSBhbmQgcmVtYWluaW5nIHRpbWUuIFRoaXMgaXMgbmVlZGVkIHRvIGd1YXJkCisgICAgICAgICAgICAgICAgLy8gYWdhaW5zdCBiYWQgZXZlbnRzICh3aGljaCB3aWxsIGJlIGlnbm9yZWQpIG9yIHNwdXJpb3VzIHdha2V1cHMsIGluIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBjYXNlIHdlIGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgdGhlIHNhbWUgdGltZSBhZ2Fpbi4KKyAgICAgICAgICAgICAgICBhdXRvIG5vdyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICAgICAgICAgIG1SZW1haW5pbmdUaW1lTWFwW2tleV0gLT0gc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oCisgICAgICAgICAgICAgICAgICAgICAgICBub3cgLSBsYXN0UnVubmluZ1RpbWUpOworICAgICAgICAgICAgICAgIGxhc3RSdW5uaW5nVGltZSA9IG5vdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSB0aGUgZXZlbnRzLCBhZGp1c3Qgc3RhdGUgYW5kIHNlbmQgdXBkYXRlcyB0byBjbGllbnQgYWNjb3JkaW5nbHkuCisgICAgICAgIEV2ZW50IGV2ZW50ID0gKm1RdWV1ZS5iZWdpbigpOworICAgICAgICBtUXVldWUucG9wX2Zyb250KCk7CisKKyAgICAgICAgQUxPR0QoIiVzOiBzZXNzaW9uIHslbGxkLCAlZH06ICVzIiwgX19GVU5DVElPTl9fLCAobG9uZyBsb25nKWV2ZW50LmNsaWVudElkLAorICAgICAgICAgICAgICBldmVudC5zZXNzaW9uSWQsIHRvU3RyaW5nKGV2ZW50LnR5cGUpKTsKKworICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSBFdmVudDo6QWJhbmRvbikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBTZXNzaW9uS2V5VHlwZSBrZXkgPSBzdGQ6Om1ha2VfcGFpcihldmVudC5jbGllbnRJZCwgZXZlbnQuc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFydW5uaW5nICYmIChldmVudC50eXBlID09IEV2ZW50OjpTdGFydCB8fCBldmVudC50eXBlID09IEV2ZW50OjpSZXN1bWUpKSB7CisgICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGxhc3RSdW5uaW5nVGltZSA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgICAgICAgICAgbGFzdFJ1bm5pbmdFdmVudCA9IGV2ZW50OworICAgICAgICAgICAgQUxPR1YoIiVzOiBzZXNzaW9uIHslbGxkLCAlZH06IHJlbWFpbmluZyB0aW1lOiAlbGxkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylldmVudC5jbGllbnRJZCwgZXZlbnQuc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUmVtYWluaW5nVGltZU1hcFtrZXldLmNvdW50KCkpOworCisgICAgICAgIH0gZWxzZSBpZiAocnVubmluZyAmJiAoZXZlbnQudHlwZSA9PSBFdmVudDo6UGF1c2UgfHwgZXZlbnQudHlwZSA9PSBFdmVudDo6U3RvcCkpIHsKKyAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChldmVudC50eXBlID09IEV2ZW50OjpTdG9wKSB7CisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ1RpbWVNYXAuZXJhc2Uoa2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVJlbWFpbmluZ1RpbWVNYXBba2V5XSAtPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gbGFzdFJ1bm5pbmdUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogZGlzY2FyZGluZyBiYWQgZXZlbnQ6IHNlc3Npb24geyVsbGQsICVkfTogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWV2ZW50LmNsaWVudElkLCBldmVudC5zZXNzaW9uSWQsIHRvU3RyaW5nKGV2ZW50LnR5cGUpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV2ZW50LnJ1bm5hYmxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBldmVudC5ydW5uYWJsZSgpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL1NpbXVsYXRlZFRyYW5zY29kZXIuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvU2ltdWxhdGVkVHJhbnNjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTJlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL1NpbXVsYXRlZFRyYW5zY29kZXIuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1NJTVVMQVRFRF9UUkFOU0NPREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9TSU1VTEFURURfVFJBTlNDT0RFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisjaW5jbHVkZSA8bWVkaWEvVHJhbnNjb2RlckludGVyZmFjZS5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTaW11bGF0ZWRUcmFuc2NvZGVyIGlzIGN1cnJlbnRseSB1c2VkIHRvIGluc3RhbnRpYXRlIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlCisgKiBvbiBzZXJ2aWNlIHNpZGUgZm9yIHRlc3RpbmcsIHNvIHRoYXQgd2UgY291bGQgYWN0dWFsbHkgdGVzdCB0aGUgSVBDIGNhbGxzIG9mCisgKiBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB0byBleHBvc2UgaXNzdWVzIHRoYXQncyBvYnNlcnZhYmxlIG9ubHkgb3ZlciBJUEMuCisgKiBTaW11bGF0ZWRUcmFuc2NvZGVyIGlzIHVzZWQgd2hlbiB1c2VTaW11bGF0ZWRUcmFuc2NvZGVyIGluIFRyYW5zY29kaW5nVGVzdENvbmZpZworICogaXMgc2V0IHRvIHRydWUuCisgKgorICogU2ltdWxhdGVkVHJhbnNjb2RlciBzaW11bGF0ZXMgc2Vzc2lvbiBleGVjdXRpb24gYnkgcmVwb3J0aW5nIGZpbmlzaCBhZnRlciBrU2Vzc2lvbkR1cmF0aW9uVXMuCisgKiBTZXNzaW9uIGxpZmVjeWNsZSBldmVudHMgYXJlIHJlcG9ydGVkIHZpYSBwcm9ncmVzcyB1cGRhdGVzIHdpdGggc3BlY2lhbCBwcm9ncmVzcworICogbnVtYmVycyAoZXF1YWwgdG8gdGhlIEV2ZW50J3MgdHlwZSkuCisgKi8KK2NsYXNzIFNpbXVsYXRlZFRyYW5zY29kZXIgOiBwdWJsaWMgVHJhbnNjb2RlckludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTaW11bGF0ZWRUcmFuc2NvZGVyPiB7CitwdWJsaWM6CisgICAgc3RydWN0IEV2ZW50IHsKKyAgICAgICAgZW51bSBUeXBlIHsgTm9FdmVudCwgU3RhcnQsIFBhdXNlLCBSZXN1bWUsIFN0b3AsIEZpbmlzaGVkLCBGYWlsZWQsIEFiYW5kb24gfSB0eXBlOworICAgICAgICBDbGllbnRJZFR5cGUgY2xpZW50SWQ7CisgICAgICAgIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkOworICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gcnVubmFibGU7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrU2Vzc2lvbkR1cmF0aW9uVXMgPSAxMDAwMDAwOworCisgICAgU2ltdWxhdGVkVHJhbnNjb2Rlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNjb2RlckNhbGxiYWNrSW50ZXJmYWNlPiYgY2IpOworICAgIH5TaW11bGF0ZWRUcmFuc2NvZGVyKCk7CisKKyAgICAvLyBUcmFuc2NvZGVySW50ZXJmYWNlCisgICAgdm9pZCBzdGFydChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsJiByZXF1ZXN0LCB1aWRfdCBjYWxsaW5nVWlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgcGF1c2UoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXN1bWUoQ2xpZW50SWRUeXBlIGNsaWVudElkLCBTZXNzaW9uSWRUeXBlIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICBjb25zdCBUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWwmIHJlcXVlc3QsIHVpZF90IGNhbGxpbmdVaWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrPiYgY2xpZW50Q2FsbGJhY2spIG92ZXJyaWRlOworICAgIHZvaWQgc3RvcChDbGllbnRJZFR5cGUgY2xpZW50SWQsIFNlc3Npb25JZFR5cGUgc2Vzc2lvbklkLCBib29sIGFiYW5kb24gPSBmYWxzZSkgb3ZlcnJpZGU7CisgICAgLy8gflRyYW5zY29kZXJJbnRlcmZhY2UKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPFRyYW5zY29kZXJDYWxsYmFja0ludGVyZmFjZT4gbUNhbGxiYWNrOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8RXZlbnQ+IG1RdWV1ZSBHVUFSREVEX0JZKG1Mb2NrKTsKKyAgICBib29sIG1Mb29wZXJSZWFkeTsKKworICAgIHVzaW5nIFNlc3Npb25LZXlUeXBlID0gc3RkOjpwYWlyPENsaWVudElkVHlwZSwgU2Vzc2lvbklkVHlwZT47CisgICAgLy8gbWFwIG9mIHNlc3Npb24ncyByZW1haW5pbmcgdGltZSBpbiBtaWNyb3NlYy4KKyAgICBzdGQ6Om1hcDxTZXNzaW9uS2V5VHlwZSwgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4gbVJlbWFpbmluZ1RpbWVNYXA7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogdG9TdHJpbmcoRXZlbnQ6OlR5cGUgdHlwZSk7CisgICAgdm9pZCBxdWV1ZUV2ZW50KEV2ZW50OjpUeXBlIHR5cGUsIENsaWVudElkVHlwZSBjbGllbnRJZCwgU2Vzc2lvbklkVHlwZSBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBydW5uYWJsZSk7CisgICAgdm9pZCB0aHJlYWRMb29wKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfU0lNVUxBVEVEX1RSQU5TQ09ERVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9tYWluX21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvbWFpbl9tZWRpYXRyYW5zY29kaW5nc2VydmljZS5jcHAKaW5kZXggN2Q4NjJlNi4uMTRjNTY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9tYWluX21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL21haW5fbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2UuY3BwCkBAIC0xNSw4ICsxNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KIAogI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmgiCiAKQEAgLTI1LDEyICsyNCw5IEBACiBpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpIHsKICAgICBMT0coSU5GTykgPDwgIm1lZGlhIHRyYW5zY29kaW5nIHNlcnZpY2Ugc3RhcnRpbmciOwogCi0gICAgLy8gVE9ETyhoa3VhbmcpOiBTdGFydCB0aGUgc2VydmljZSB3aXRoIGxpYmJpbmRlcl9uZGsuCiAgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS50cmFuc2NvZGluZyIpOwotICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIGFuZHJvaWQ6Ok1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogCi0gICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7CisgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CisgICAgQUJpbmRlclByb2Nlc3Nfam9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvbWVkaWF0cmFuc2NvZGluZy5yYyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvbWVkaWF0cmFuc2NvZGluZy5yYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmZWY1OS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL21lZGlhdHJhbnNjb2RpbmcucmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNlcnZpY2UgbWVkaWEudHJhbnNjb2RpbmcgL3N5c3RlbS9iaW4vbWVkaWF0cmFuc2NvZGluZwotICAgIGNsYXNzIG1haW4KLSAgICB1c2VyIG1lZGlhCi0gICAgZ3JvdXAgbWVkaWEKLSAgICBpb3ByaW8gcnQgNAotICAgIHRhc2tfcHJvZmlsZXMgUHJvY2Vzc0NhcGFjaXR5SGlnaCBIaWdoUGVyZm9ybWFuY2UKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlMGUwNDBjLi5jYjE4MGVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMTYgQEAKIC8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBNZWRpYVRyYW5zY29kaW5nU2VydmljZQogCitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYXRyYW5zY29kaW5nX2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWworICAgICAgICAiZnJhbWV3b3Jrc19hdl9zZXJ2aWNlc19tZWRpYXRyYW5zY29kaW5nX2xpY2Vuc2UiLAorICAgIF0sCit9CisKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdF9kZWZhdWx0cyIsCiAKQEAgLTE0LDIyICsyNSw0NyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWN0aXZpdHltYW5hZ2VyX2FpZGwiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJtZWRpYXRyYW5zY29kaW5nX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJyZXNvdXJjZW1hbmFnZXJfYWlkbF9pbnRlcmZhY2UtbmRrX3BsYXRmb3JtIiwKKyAgICAgICAgImxpYm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlIiwKKyAgICBdLAorCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBBIiwKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBCIiwKKyAgICAgICAgIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBDIiwKICAgICBdLAogfQogCi0vLyBNZWRpYVRyYW5zY29kaW5nU2VydmljZSB1bml0IHRlc3QKKy8vIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlIHVuaXQgdGVzdCB1c2luZyBzaW11bGF0ZWQgdHJhbnNjb2RlcgogY2NfdGVzdCB7Ci0gICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzIiwKKyAgICBuYW1lOiAibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzIiwKICAgICBkZWZhdWx0czogWyJtZWRpYXRyYW5zY29kaW5nc2VydmljZV90ZXN0X2RlZmF1bHRzIl0sCiAKLSAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzLmNwcCJdLAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3NpbXVsYXRlZF90ZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdW5pdCB0ZXN0IHVzaW5nIHJlYWwgdHJhbnNjb2RlcgorY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMiLAorICAgIGRlZmF1bHRzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsibWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cy5jcHAiXSwKK30KKworLy8gTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UgdW5pdCB0ZXN0IHJlbGF0ZWQgdG8gcmVzb3VyY2UgbWFuYWdlbWVudAorY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJtZWRpYXRyYW5zY29kaW5nc2VydmljZV90ZXN0X2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbIm1lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RIZWxwZXIuaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiMmZhZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0SGVscGVyLmgKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLgorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0JuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Lmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nUmVxdWVzdFBhcmNlbC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgbWVkaWEgeworCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2s7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklUcmFuc2NvZGluZ0NsaWVudDsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjazsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1JlcXVlc3RQYXJjZWw7Cit1c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdTZXNzaW9uUGFyY2VsOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nVGVzdENvbmZpZzsKK3VzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ1ZpZGVvVHJhY2tGb3JtYXQ7CisKK2NvbnN0ZXhwciBpbnQzMl90IGtDbGllbnRVc2VDYWxsaW5nUGlkID0gSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpVU0VfQ0FMTElOR19QSUQ7CisKK2NvbnN0ZXhwciB1aWRfdCBrQ2xpZW50VWlkID0gNTAwMDsKKyNkZWZpbmUgVUlEKG4pIChrQ2xpZW50VWlkICsgKG4pKQorCitjb25zdGV4cHIgcGlkX3Qga0NsaWVudFBpZCA9IDEwMDAwOworI2RlZmluZSBQSUQobikgKGtDbGllbnRQaWQgKyAobikpCisKK2NvbnN0ZXhwciBpbnQzMl90IGtDbGllbnRJZCA9IDA7CisjZGVmaW5lIENMSUVOVChuKSAoa0NsaWVudElkICsgKG4pKQorCitjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudE5hbWUgPSAiVGVzdENsaWVudCI7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudFBhY2thZ2VBID0gImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQSI7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudFBhY2thZ2VCID0gImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQiI7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0NsaWVudFBhY2thZ2VDID0gImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQyI7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrVGVzdEFjdGl2aXR5TmFtZSA9ICIvY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcuTWFpbkFjdGl2aXR5IjsKKworc3RhdGljIHN0YXR1c190IGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYgcGFja2FnZU5hbWUsIHVzZXJpZF90IHVzZXJJZCwgLyppbm91dCovIHVpZF90JiB1aWQpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodXNlcklkIDwgMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2VyOiAlZCIsIHVzZXJJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdWlkID0gbXVsdGl1c2VyX2dldF91aWQodXNlcklkLCB1aWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RydWN0IFNoZWxsSGVscGVyIHsKKyAgICBzdGF0aWMgYm9vbCBSdW5DbWQoY29uc3Qgc3RkOjpzdHJpbmcmIGNtZFN0cikgeworICAgICAgICBpbnQgcmV0ID0gc3lzdGVtKGNtZFN0ci5jX3N0cigpKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJ1biBjbWQ6ICVzLCBleGl0Y29kZSAlZCIsIGNtZFN0ci5jX3N0cigpLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyBib29sIFN0YXJ0KGNvbnN0IGNoYXIqIHBhY2thZ2VOYW1lLCBjb25zdCBjaGFyKiBhY3Rpdml0eU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFJ1bkNtZCgiYW0gc3RhcnQgLVcgIiArIHN0ZDo6c3RyaW5nKHBhY2thZ2VOYW1lKSArIHN0ZDo6c3RyaW5nKGFjdGl2aXR5TmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgICIgJj4gL2Rldi9udWxsIik7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgU3RvcChjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSkgeworICAgICAgICByZXR1cm4gUnVuQ21kKCJhbSBmb3JjZS1zdG9wICIgKyBzdGQ6OnN0cmluZyhwYWNrYWdlTmFtZSkpOworICAgIH0KK307CisKK3N0cnVjdCBFdmVudFRyYWNrZXIgeworICAgIHN0cnVjdCBFdmVudCB7CisgICAgICAgIGVudW0geyBOb0V2ZW50LCBTdGFydCwgUGF1c2UsIFJlc3VtZSwgRmluaXNoZWQsIEZhaWxlZCB9IHR5cGU7CisgICAgICAgIGludDY0X3QgY2xpZW50SWQ7CisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkOworICAgIH07CisKKyNkZWZpbmUgREVDTEFSRV9FVkVOVChhY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgRXZlbnQgYWN0aW9uKGludDMyX3QgY2xpZW50SWQsIGludDMyX3Qgc2Vzc2lvbklkKSB7IFwKKyAgICAgICAgcmV0dXJuIHtFdmVudDo6YWN0aW9uLCBjbGllbnRJZCwgc2Vzc2lvbklkfTsgICAgICAgICAgIFwKKyAgICB9CisKKyAgICBERUNMQVJFX0VWRU5UKFN0YXJ0KTsKKyAgICBERUNMQVJFX0VWRU5UKFBhdXNlKTsKKyAgICBERUNMQVJFX0VWRU5UKFJlc3VtZSk7CisgICAgREVDTEFSRV9FVkVOVChGaW5pc2hlZCk7CisgICAgREVDTEFSRV9FVkVOVChGYWlsZWQpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBFdmVudCBOb0V2ZW50ID0ge0V2ZW50OjpOb0V2ZW50LCAwLCAwfTsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXZlbnRTdHI7CisgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlIEV2ZW50OjpTdGFydDoKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIlN0YXJ0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEV2ZW50OjpQYXVzZToKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIlBhdXNlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEV2ZW50OjpSZXN1bWU6CisgICAgICAgICAgICBldmVudFN0ciA9ICJSZXN1bWUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXZlbnQ6OkZpbmlzaGVkOgorICAgICAgICAgICAgZXZlbnRTdHIgPSAiRmluaXNoZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRXZlbnQ6OkZhaWxlZDoKKyAgICAgICAgICAgIGV2ZW50U3RyID0gIkZhaWxlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiTm9FdmVudCI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJzZXNzaW9uIHsiICsgc3RkOjp0b19zdHJpbmcoZXZlbnQuY2xpZW50SWQpICsgIiwgIiArCisgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhldmVudC5zZXNzaW9uSWQpICsgIn06ICIgKyBldmVudFN0cjsKKyAgICB9CisKKyAgICAvLyBQb3AgMSBldmVudCBmcm9tIGZyb250LCB3YWl0IGZvciB1cCB0byB0aW1lb3V0VXMgaWYgZW1wdHkuCisgICAgY29uc3QgRXZlbnQmIHBvcChpbnQ2NF90IHRpbWVvdXRVcyA9IDApIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSAmJiB0aW1lb3V0VXMgPiAwKSB7CisgICAgICAgICAgICBtQ29uZGl0aW9uLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHModGltZW91dFVzKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUV2ZW50UXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgbVBvcHBlZEV2ZW50ID0gTm9FdmVudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qb3BwZWRFdmVudCA9ICptRXZlbnRRdWV1ZS5iZWdpbigpOworICAgICAgICAgICAgbUV2ZW50UXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbVBvcHBlZEV2ZW50OworICAgIH0KKworICAgIGJvb2wgd2FpdEZvclNwZWNpZmljRXZlbnRBbmRQb3AoY29uc3QgRXZlbnQmIHRhcmdldCwgc3RkOjpsaXN0PEV2ZW50Piogb3V0RXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0VXMgPSAwKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisKKyAgICAgICAgYXV0byBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKyAgICAgICAgaW50NjRfdCByZW1haW5pbmdVcyA9IHRpbWVvdXRVczsKKworICAgICAgICBzdGQ6Omxpc3Q8RXZlbnQ+OjppdGVyYXRvciBpdDsKKyAgICAgICAgd2hpbGUgKCgoaXQgPSBzdGQ6OmZpbmQobUV2ZW50UXVldWUuYmVnaW4oKSwgbUV2ZW50UXVldWUuZW5kKCksIHRhcmdldCkpID09CisgICAgICAgICAgICAgICAgbUV2ZW50UXVldWUuZW5kKCkpICYmCisgICAgICAgICAgICAgICByZW1haW5pbmdVcyA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6Y3Zfc3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdF9mb3IobG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhyZW1haW5pbmdVcykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyBlbGFwc2VkVGltZSA9IHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6Om5vdygpIC0gc3RhcnRUaW1lOworICAgICAgICAgICAgcmVtYWluaW5nVXMgPSB0aW1lb3V0VXMgLSBlbGFwc2VkVGltZS5jb3VudCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGl0ID09IG1FdmVudFF1ZXVlLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKm91dEV2ZW50cyA9IHN0ZDo6bGlzdDxFdmVudD4obUV2ZW50UXVldWUuYmVnaW4oKSwgc3RkOjpuZXh0KGl0KSk7CisgICAgICAgIG1FdmVudFF1ZXVlLmVyYXNlKG1FdmVudFF1ZXVlLmJlZ2luKCksIHN0ZDo6bmV4dChpdCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBQdXNoIDEgZXZlbnQgdG8gYmFjay4KKyAgICB2b2lkIGFwcGVuZChjb25zdCBFdmVudCYgZXZlbnQsCisgICAgICAgICAgICAgICAgY29uc3QgVHJhbnNjb2RpbmdFcnJvckNvZGUgZXJyID0gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtOb0Vycm9yKSB7CisgICAgICAgIEFMT0dEKCIlcyIsIHRvU3RyaW5nKGV2ZW50KS5jX3N0cigpKTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrIGxvY2sobUxvY2spOworCisgICAgICAgIG1FdmVudFF1ZXVlLnB1c2hfYmFjayhldmVudCk7CisgICAgICAgIGlmIChlcnIgIT0gVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtOb0Vycm9yKSB7CisgICAgICAgICAgICBtTGFzdEVyclF1ZXVlLnB1c2hfYmFjayhlcnIpOworICAgICAgICB9CisgICAgICAgIG1Db25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlUHJvZ3Jlc3MoaW50IHByb2dyZXNzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIG1MYXN0UHJvZ3Jlc3MgPSBwcm9ncmVzczsKKyAgICAgICAgbVVwZGF0ZUNvdW50Kys7CisgICAgfQorCisgICAgaW50IGdldFVwZGF0ZUNvdW50KGludCogbGFzdFByb2dyZXNzKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2sgbG9jayhtTG9jayk7CisgICAgICAgICpsYXN0UHJvZ3Jlc3MgPSBtTGFzdFByb2dyZXNzOworICAgICAgICByZXR1cm4gbVVwZGF0ZUNvdW50OworICAgIH0KKworICAgIFRyYW5zY29kaW5nRXJyb3JDb2RlIGdldExhc3RFcnJvcigpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1MYXN0RXJyUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprTm9FcnJvcjsKKyAgICAgICAgfQorICAgICAgICBUcmFuc2NvZGluZ0Vycm9yQ29kZSBlcnIgPSBtTGFzdEVyclF1ZXVlLmZyb250KCk7CisgICAgICAgIG1MYXN0RXJyUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBFdmVudCBtUG9wcGVkRXZlbnQ7CisgICAgc3RkOjpsaXN0PEV2ZW50PiBtRXZlbnRRdWV1ZTsKKyAgICBzdGQ6Omxpc3Q8VHJhbnNjb2RpbmdFcnJvckNvZGU+IG1MYXN0RXJyUXVldWU7CisgICAgaW50IG1VcGRhdGVDb3VudCA9IDA7CisgICAgaW50IG1MYXN0UHJvZ3Jlc3MgPSAtMTsKK307CisKKy8vIE9wZXJhdG9ycyBmb3IgR1Rlc3QgbWFjcm9zLgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIGxocywgY29uc3QgRXZlbnRUcmFja2VyOjpFdmVudCYgcmhzKSB7CisgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy5jbGllbnRJZCA9PSByaHMuY2xpZW50SWQgJiYgbGhzLnNlc3Npb25JZCA9PSByaHMuc2Vzc2lvbklkOworfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHIsIGNvbnN0IEV2ZW50VHJhY2tlcjo6RXZlbnQmIHYpIHsKKyAgICBzdHIgPDwgRXZlbnRUcmFja2VyOjp0b1N0cmluZyh2KTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY29uc3RleHByIGJvb2wgc3VjY2VzcyA9IHRydWU7CitzdGF0aWMgY29uc3RleHByIGJvb2wgZmFpbCA9IGZhbHNlOworCitzdHJ1Y3QgVGVzdENsaWVudENhbGxiYWNrIDogcHVibGljIEJuVHJhbnNjb2RpbmdDbGllbnRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRXZlbnRUcmFja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFRlc3RDbGllbnRDYWxsYmFjaz4geworICAgIFRlc3RDbGllbnRDYWxsYmFjayhjb25zdCBjaGFyKiBwYWNrYWdlTmFtZSwgaW50MzJfdCBpZCkKKyAgICAgICAgICA6IG1DbGllbnRJZChpZCksIG1DbGllbnRQaWQoUElEKGlkKSksIG1DbGllbnRVaWQoVUlEKGlkKSksIG1QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSkgeworICAgICAgICBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGNyZWF0ZWQ6IHBpZCAlZCwgdWlkICVkIiwgaWQsIFBJRChpZCksIFVJRChpZCkpOworCisgICAgICAgIC8vIFVzZSBwYWNrYWdlIHVpZCBpZiB0aGF0J3MgYXZhaWxhYmxlLgorICAgICAgICB1aWRfdCBwYWNrYWdlVWlkOworICAgICAgICBpZiAoZ2V0VWlkRm9yUGFja2FnZShTdHJpbmcxNihwYWNrYWdlTmFtZSksIDAgLyp1c2VySWQqLywgcGFja2FnZVVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DbGllbnRVaWQgPSBwYWNrYWdlVWlkOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdENsaWVudENhbGxiYWNrKCkgeyBBTE9HSSgiVGVzdENsaWVudENhbGxiYWNrICVkIGRlc3Ryb3llZCIsIG1DbGllbnRJZCk7IH0KKworICAgIFN0YXR1cyBvcGVuRmlsZURlc2NyaXB0b3IoY29uc3Qgc3RkOjpzdHJpbmcmIGluX2ZpbGVVcmksIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpuZGs6OlNjb3BlZEZpbGVEZXNjcmlwdG9yKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR0QoIkBAQCBvcGVuRmlsZURlc2NyaXB0b3I6ICVzIiwgaW5fZmlsZVVyaS5jX3N0cigpKTsKKyAgICAgICAgaW50IGZkOworICAgICAgICBpZiAoaW5fbW9kZSA9PSAidyIgfHwgaW5fbW9kZSA9PSAicnciKSB7CisgICAgICAgICAgICBpbnQga09wZW5GbGFnczsKKyAgICAgICAgICAgIGlmIChpbl9tb2RlID09ICJ3IikgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlLW9ubHksIGNyZWF0ZSBmaWxlIGlmIG5vbi1leGlzdGVudCwgdHJ1bmNhdGUgZXhpc3RpbmcgZmlsZS4KKyAgICAgICAgICAgICAgICBrT3BlbkZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUmVhZC1Xcml0ZSwgY3JlYXRlIGlmIG5vbi1leGlzdGVudCwgbm8gdHJ1bmNhdGUgKHNlcnZpY2Ugd2lsbCB0cnVuY2F0ZSBpZiBuZWVkZWQpCisgICAgICAgICAgICAgICAga09wZW5GbGFncyA9IE9fUkRXUiB8IE9fQ1JFQVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2VyIFIrVyBwZXJtaXNzaW9uLgorICAgICAgICAgICAgY29uc3RleHByIGludCBrRmlsZU1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUjsKKyAgICAgICAgICAgIGZkID0gb3Blbihpbl9maWxlVXJpLmNfc3RyKCksIGtPcGVuRmxhZ3MsIGtGaWxlTW9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZCA9IG9wZW4oaW5fZmlsZVVyaS5jX3N0cigpLCBPX1JET05MWSk7CisgICAgICAgIH0KKyAgICAgICAgX2FpZGxfcmV0dXJuLT5zZXQoZmQpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nU3RhcnRlZChpbnQzMl90IGluX3Nlc3Npb25JZCkgb3ZlcnJpZGUgeworICAgICAgICBhcHBlbmQoRXZlbnRUcmFja2VyOjpTdGFydChtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nUGF1c2VkKGludDMyX3QgaW5fc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChFdmVudFRyYWNrZXI6OlBhdXNlKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdSZXN1bWVkKGludDMyX3QgaW5fc2Vzc2lvbklkKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChFdmVudFRyYWNrZXI6OlJlc3VtZShtQ2xpZW50SWQsIGluX3Nlc3Npb25JZCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblRyYW5zY29kaW5nRmluaXNoZWQoCisgICAgICAgICAgICBpbnQzMl90IGluX3Nlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVzdWx0UGFyY2VsJiAvKiBpbl9yZXN1bHQgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgYXBwZW5kKEZpbmlzaGVkKG1DbGllbnRJZCwgaW5fc2Vzc2lvbklkKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgU3RhdHVzIG9uVHJhbnNjb2RpbmdGYWlsZWQoaW50MzJfdCBpbl9zZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6VHJhbnNjb2RpbmdFcnJvckNvZGUgaW5fZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIGFwcGVuZChGYWlsZWQobUNsaWVudElkLCBpbl9zZXNzaW9uSWQpLCBpbl9lcnJvckNvZGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvbkF3YWl0TnVtYmVyT2ZTZXNzaW9uc0NoYW5nZWQoaW50MzJfdCAvKiBpbl9zZXNzaW9uSWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX29sZEF3YWl0TnVtYmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9uZXdBd2FpdE51bWJlciAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBvblByb2dyZXNzVXBkYXRlKGludDMyX3QgLyogaW5fc2Vzc2lvbklkICovLCBpbnQzMl90IGluX3Byb2dyZXNzKSBvdmVycmlkZSB7CisgICAgICAgIHVwZGF0ZVByb2dyZXNzKGluX3Byb2dyZXNzKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICBTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3QgY2hhciogcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+JiBzZXJ2aWNlKSB7CisgICAgICAgIC8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHVpZCBpZiB0aGUgcGFja2FnZSB1aWQgaXMgZm91bmQuCisgICAgICAgIHVpZF90IHVpZDsKKyAgICAgICAgaWYgKGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYocGFja2FnZU5hbWUpLCAwIC8qdXNlcklkKi8sIHVpZCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgICAgIH0KKworICAgICAgICBBTE9HRCgicmVnaXN0ZXJpbmcgJXMgd2l0aCB1aWQgJWQiLCBwYWNrYWdlTmFtZSwgbUNsaWVudFVpZCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgICAgICBTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBzZXJ2aWNlLT5yZWdpc3RlckNsaWVudChzaGFyZWRfZnJvbV90aGlzKCksIGtDbGllbnROYW1lLCBwYWNrYWdlTmFtZSwgJmNsaWVudCk7CisKKyAgICAgICAgbUNsaWVudCA9IHN0YXR1cy5pc09rKCkgPyBjbGllbnQgOiBudWxscHRyOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFN0YXR1cyB1bnJlZ2lzdGVyQ2xpZW50KCkgeworICAgICAgICBTdGF0dXMgc3RhdHVzOworICAgICAgICBpZiAobUNsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgICAgICAgICBtQ2xpZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHRlbXBsYXRlIDxib29sIGV4cGVjdGF0aW9uID0gc3VjY2Vzcz4KKyAgICBib29sIHN1Ym1pdChpbnQzMl90IHNlc3Npb25JZCwgY29uc3QgY2hhciogc291cmNlRmlsZVBhdGgsIGNvbnN0IGNoYXIqIGRlc3RpbmF0aW9uRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHkgcHJpb3JpdHkgPSBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICBpbnQgYml0cmF0ZUJwcyA9IC0xLCBpbnQgb3ZlcnJpZGVQaWQgPSAtMSwgaW50IG92ZXJyaWRlVWlkID0gLTEsCisgICAgICAgICAgICAgICAgaW50IHNlc3Npb25EdXJhdGlvbk1zID0gLTEpIHsKKyAgICAgICAgY29uc3RleHByIGJvb2wgc2hvdWxkU3VjY2VlZCA9IChleHBlY3RhdGlvbiA9PSBzdWNjZXNzKTsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OworICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKworICAgICAgICByZXF1ZXN0LnNvdXJjZUZpbGVQYXRoID0gc291cmNlRmlsZVBhdGg7CisgICAgICAgIHJlcXVlc3QuZGVzdGluYXRpb25GaWxlUGF0aCA9IGRlc3RpbmF0aW9uRmlsZVBhdGg7CisgICAgICAgIHJlcXVlc3QucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgcmVxdWVzdC5jbGllbnRQaWQgPSAob3ZlcnJpZGVQaWQgPT0gLTEpID8gbUNsaWVudFBpZCA6IG92ZXJyaWRlUGlkOworICAgICAgICByZXF1ZXN0LmNsaWVudFVpZCA9IChvdmVycmlkZVVpZCA9PSAtMSkgPyBtQ2xpZW50VWlkIDogb3ZlcnJpZGVVaWQ7CisgICAgICAgIHJlcXVlc3QuY2xpZW50UGFja2FnZU5hbWUgPSAob3ZlcnJpZGVVaWQgPT0gLTEpID8gbVBhY2thZ2VOYW1lIDogIiI7CisgICAgICAgIGlmIChiaXRyYXRlQnBzID4gMCkgeworICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZWRWaWRlb1RyYWNrRm9ybWF0LmVtcGxhY2UoVHJhbnNjb2RpbmdWaWRlb1RyYWNrRm9ybWF0KCkpOworICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZWRWaWRlb1RyYWNrRm9ybWF0LT5iaXRyYXRlQnBzID0gYml0cmF0ZUJwczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vzc2lvbkR1cmF0aW9uTXMgPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0LmlzRm9yVGVzdGluZyA9IHRydWU7CisgICAgICAgICAgICByZXF1ZXN0LnRlc3RDb25maWcuZW1wbGFjZShUcmFuc2NvZGluZ1Rlc3RDb25maWcoKSk7CisgICAgICAgICAgICByZXF1ZXN0LnRlc3RDb25maWctPnByb2Nlc3NpbmdUb3RhbFRpbWVNcyA9IHNlc3Npb25EdXJhdGlvbk1zOworICAgICAgICB9CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtQ2xpZW50LT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KTsKKworICAgICAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgc2hvdWxkU3VjY2VlZCk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIHNlc3Npb25JZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSAmJiAocmVzdWx0ID09IHNob3VsZFN1Y2NlZWQpICYmCisgICAgICAgICAgICAgICAoIXNob3VsZFN1Y2NlZWQgfHwgc2Vzc2lvbi5zZXNzaW9uSWQgPT0gc2Vzc2lvbklkKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBleHBlY3RhdGlvbiA9IHN1Y2Nlc3M+CisgICAgYm9vbCBjYW5jZWwoaW50MzJfdCBzZXNzaW9uSWQpIHsKKyAgICAgICAgY29uc3RleHByIGJvb2wgc2hvdWxkU3VjY2VlZCA9IChleHBlY3RhdGlvbiA9PSBzdWNjZXNzKTsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIFN0YXR1cyBzdGF0dXMgPSBtQ2xpZW50LT5jYW5jZWxTZXNzaW9uKHNlc3Npb25JZCwgJnJlc3VsdCk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9FUShyZXN1bHQsIHNob3VsZFN1Y2NlZWQpOworCisgICAgICAgIHJldHVybiBzdGF0dXMuaXNPaygpICYmIChyZXN1bHQgPT0gc2hvdWxkU3VjY2VlZCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPGJvb2wgZXhwZWN0YXRpb24gPSBzdWNjZXNzPgorICAgIGJvb2wgZ2V0U2Vzc2lvbihpbnQzMl90IHNlc3Npb25JZCwgY29uc3QgY2hhciogc291cmNlRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlc3RpbmF0aW9uRmlsZVBhdGgpIHsKKyAgICAgICAgY29uc3RleHByIGJvb2wgc2hvdWxkU3VjY2VlZCA9IChleHBlY3RhdGlvbiA9PSBzdWNjZXNzKTsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbUNsaWVudC0+Z2V0U2Vzc2lvbldpdGhJZChzZXNzaW9uSWQsICZzZXNzaW9uLCAmcmVzdWx0KTsKKworICAgICAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgc2hvdWxkU3VjY2VlZCk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5zZXNzaW9uSWQsIHNlc3Npb25JZCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc2Vzc2lvbi5yZXF1ZXN0LnNvdXJjZUZpbGVQYXRoLCBzb3VyY2VGaWxlUGF0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSAmJiAocmVzdWx0ID09IHNob3VsZFN1Y2NlZWQpICYmCisgICAgICAgICAgICAgICAoIXNob3VsZFN1Y2NlZWQgfHwgKHNlc3Npb24uc2Vzc2lvbklkID09IHNlc3Npb25JZCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnJlcXVlc3Quc291cmNlRmlsZVBhdGggPT0gc291cmNlRmlsZVBhdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0LmRlc3RpbmF0aW9uRmlsZVBhdGggPT0gZGVzdGluYXRpb25GaWxlUGF0aCkpOworICAgIH0KKworICAgIHRlbXBsYXRlIDxib29sIGV4cGVjdGF0aW9uID0gc3VjY2Vzcz4KKyAgICBib29sIGFkZENsaWVudFVpZChpbnQzMl90IHNlc3Npb25JZCwgdWlkX3QgY2xpZW50VWlkKSB7CisgICAgICAgIGNvbnN0ZXhwciBib29sIHNob3VsZFN1Y2NlZWQgPSAoZXhwZWN0YXRpb24gPT0gc3VjY2Vzcyk7CisgICAgICAgIGJvb2wgcmVzdWx0OworICAgICAgICBTdGF0dXMgc3RhdHVzID0gbUNsaWVudC0+YWRkQ2xpZW50VWlkKHNlc3Npb25JZCwgY2xpZW50VWlkLCAmcmVzdWx0KTsKKworICAgICAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0VRKHJlc3VsdCwgc2hvdWxkU3VjY2VlZCk7CisKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgJiYgKHJlc3VsdCA9PSBzaG91bGRTdWNjZWVkKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBleHBlY3RhdGlvbiA9IHN1Y2Nlc3M+CisgICAgYm9vbCBnZXRDbGllbnRVaWRzKGludDMyX3Qgc2Vzc2lvbklkLCBzdGQ6OnZlY3RvcjxpbnQzMl90PiogY2xpZW50VWlkcykgeworICAgICAgICBjb25zdGV4cHIgYm9vbCBzaG91bGRTdWNjZWVkID0gKGV4cGVjdGF0aW9uID09IHN1Y2Nlc3MpOworICAgICAgICBzdGQ6Om9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludDMyX3Q+PiBhaWRsX3JldHVybjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1DbGllbnQtPmdldENsaWVudFVpZHMoc2Vzc2lvbklkLCAmYWlkbF9yZXR1cm4pOworCisgICAgICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgICAgICBib29sIHN1Y2Nlc3MgPSAoYWlkbF9yZXR1cm4gIT0gc3RkOjpudWxsb3B0KTsKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICpjbGllbnRVaWRzID0gKmFpZGxfcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9FUShzdWNjZXNzLCBzaG91bGRTdWNjZWVkKTsKKworICAgICAgICByZXR1cm4gc3RhdHVzLmlzT2soKSAmJiAoc3VjY2VzcyA9PSBzaG91bGRTdWNjZWVkKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1DbGllbnRJZDsKKyAgICBwaWRfdCBtQ2xpZW50UGlkOworICAgIHVpZF90IG1DbGllbnRVaWQ7CisgICAgc3RkOjpzdHJpbmcgbVBhY2thZ2VOYW1lOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IG1DbGllbnQ7Cit9OworCitjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0QmFzZSgpIHsgQUxPR0koIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEJhc2UgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlKCkgeworICAgICAgICBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0QmFzZSBkZXN0cm95ZWQiKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBOZWVkIHRocmVhZCBwb29sIHRvIHJlY2VpdmUgY2FsbGJhY2tzLCBvdGhlcndpc2Ugb25ld2F5IGNhbGxiYWNrcyBhcmUKKyAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlZC4KKyAgICAgICAgQUJpbmRlclByb2Nlc3Nfc3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfd2FpdEZvclNlcnZpY2UoIm1lZGlhLnRyYW5zY29kaW5nIikpOworICAgICAgICBtU2VydmljZSA9IElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgICAgICBpZiAobVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBtZWRpYS50cmFzY29kaW5nIHNlcnZpY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtQ2xpZW50MSA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnRDYWxsYmFjaz4oa0NsaWVudFBhY2thZ2VBLCAxKTsKKyAgICAgICAgbUNsaWVudDIgPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50Q2FsbGJhY2s+KGtDbGllbnRQYWNrYWdlQiwgMik7CisgICAgICAgIG1DbGllbnQzID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudENhbGxiYWNrPihrQ2xpZW50UGFja2FnZUMsIDMpOworICAgIH0KKworICAgIFN0YXR1cyByZWdpc3Rlck9uZUNsaWVudChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiYgY2FsbGJhY2spIHsKKyAgICAgICAgQUxPR0QoInJlZ2lzdGVyaW5nICVzIHdpdGggdWlkICVkIiwgY2FsbGJhY2stPm1QYWNrYWdlTmFtZS5jX3N0cigpLCBjYWxsYmFjay0+bUNsaWVudFVpZCk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworICAgICAgICBTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgICAgICBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2FsbGJhY2ssIGtDbGllbnROYW1lLCBjYWxsYmFjay0+bVBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKworICAgICAgICBpZiAoc3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgY2FsbGJhY2stPm1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWxsYmFjay0+bUNsaWVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2b2lkIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCkgeworICAgICAgICAvLyBSZWdpc3RlciAzIGNsaWVudHMuCisgICAgICAgIEVYUEVDVF9UUlVFKHJlZ2lzdGVyT25lQ2xpZW50KG1DbGllbnQxKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShyZWdpc3Rlck9uZUNsaWVudChtQ2xpZW50MikuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmVnaXN0ZXJPbmVDbGllbnQobUNsaWVudDMpLmlzT2soKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlIG51bWJlciBvZiBjbGllbnRzLgorICAgICAgICBpbnQzMl90IG51bU9mQ2xpZW50czsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5nZXROdW1PZkNsaWVudHMoJm51bU9mQ2xpZW50cyk7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworICAgICAgICBFWFBFQ1RfR0UobnVtT2ZDbGllbnRzLCAzKTsKKyAgICB9CisKKyAgICB2b2lkIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKSB7CisgICAgICAgIC8vIFVucmVnaXN0ZXIgdGhlIGNsaWVudHMuCisgICAgICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT51bnJlZ2lzdGVyQ2xpZW50KCkuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnVucmVnaXN0ZXJDbGllbnQoKS5pc09rKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtQ2xpZW50My0+dW5yZWdpc3RlckNsaWVudCgpLmlzT2soKSk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogcHJlcGFyZU91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCkgeworICAgICAgICBkZWxldGVGaWxlKHBhdGgpOworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICB2b2lkIGRlbGV0ZUZpbGUoY29uc3QgY2hhciogcGF0aCkgeyB1bmxpbmsocGF0aCk7IH0KKworICAgIHZvaWQgZGlzbWlzc0tleWd1YXJkKCkgeworICAgICAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlJ1bkNtZCgid20gZGlzbWlzcy1rZXlndWFyZCIpKTsKKyAgICB9CisKKyAgICB2b2lkIHN0b3BBcHBQYWNrYWdlcygpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQikpOworICAgICAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUMpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50MTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50MjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdENsaWVudENhbGxiYWNrPiBtQ2xpZW50MzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvUkVBRE1FLnR4dCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGU0NjVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9SRUFETUUudHh0CkBAIC0wLDAgKzEsOCBAQAorbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzOgorCVRlc3RzIG1lZGlhIHRyYW5zY29kaW5nIHNlcnZpY2Ugd2l0aCBzaW11bGF0ZWQgdHJhbnNjb2Rlci4KKworbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0czoKKwlUZXN0cyBtZWRpYSB0cmFuc2NvZGluZyBzZXJ2aWNlIHdpdGggcmVhbCB0cmFuc2NvZGVyLiBVc2VzIHRoZSBzYW1lIHRlc3QgYXNzZXRzCisJYXMgdGhlIE1lZGlhVHJhbnNjb2RlciB1bml0IHRlc3RzLiBCZWZvcmUgcnVubmluZyB0aGUgdGVzdCwgcGxlYXNlIG1ha2Ugc3VyZQorCXRvIHB1c2ggdGhlIHRlc3QgYXNzZXRzIHRvIC9zZGNhcmQ6CisJYWRiIHB1c2ggJFRPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYXNzZXRzIC9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhdHJhbnNjb2RpbmdfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbCisgICAgICAgICJmcmFtZXdvcmtzX2F2X3NlcnZpY2VzX21lZGlhdHJhbnNjb2RpbmdfbGljZW5zZSIsCisgICAgXSwKK30KKworYW5kcm9pZF90ZXN0X2hlbHBlcl9hcHAgeworICAgIG5hbWU6ICJUcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQSIsCisgICAgbWFuaWZlc3Q6ICJUZXN0QXBwQS54bWwiLAorICAgIHN0YXRpY19saWJzOiBbImFuZHJvaWR4LnRlc3QucnVsZXMiXSwKKyAgICBzZGtfdmVyc2lvbjogInRlc3RfY3VycmVudCIsCisgICAgc3JjczogWyJzcmMvKiovKi5qYXZhIl0sCit9CisKK2FuZHJvaWRfdGVzdF9oZWxwZXJfYXBwIHsKKyAgICBuYW1lOiAiVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEIiLAorICAgIG1hbmlmZXN0OiAiVGVzdEFwcEIueG1sIiwKKyAgICBzdGF0aWNfbGliczogWyJhbmRyb2lkeC50ZXN0LnJ1bGVzIl0sCisgICAgc2RrX3ZlcnNpb246ICJ0ZXN0X2N1cnJlbnQiLAorICAgIHNyY3M6IFsic3JjLyoqLyouamF2YSJdLAorfQorCithbmRyb2lkX3Rlc3RfaGVscGVyX2FwcCB7CisgICAgbmFtZTogIlRyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBDIiwKKyAgICBtYW5pZmVzdDogIlRlc3RBcHBDLnhtbCIsCisgICAgc3RhdGljX2xpYnM6IFsiYW5kcm9pZHgudGVzdC5ydWxlcyJdLAorICAgIHNka192ZXJzaW9uOiAidGVzdF9jdXJyZW50IiwKKyAgICBzcmNzOiBbInNyYy8qKi8qLmphdmEiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL1Rlc3RBcHBBLnhtbCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL1Rlc3RBcHBBLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGZmMTcxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvVGVzdEFwcEEueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcudGVzdGFwcC5BIgorICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCisgICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+CisKKyAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iVGVzdEFwcEEiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy5NYWluQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmV4cG9ydGVkPSJ0cnVlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5ERUZBVUxUIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLlJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQi54bWwgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhYTM1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL1Rlc3RBcHBCLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQiIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlRlc3RBcHBCIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcuTWFpbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQy54bWwgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9UZXN0QXBwQy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkZTNhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL1Rlc3RBcHBDLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nLnRlc3RhcHAuQyIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IlRlc3RBcHBDIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQudGVzdHMudHJhbnNjb2RpbmcuTWFpbkFjdGl2aXR5IgorICAgICAgICAgICAgYW5kcm9pZDpleHBvcnRlZD0idHJ1ZSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuREVGQVVMVCIvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3RyYW5zY29kaW5nL01haW5BY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3RyYW5zY29kaW5nL01haW5BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTE2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL1RyYW5zY29kaW5nVWlkUG9saWN5VGVzdEFwcC9zcmMvY29tL2FuZHJvaWQvdGVzdHMvdHJhbnNjb2RpbmcvTWFpbkFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworLyoqCisgKiBUaGlzIGlzIGFuIGVtcHR5IGFjdGl2aXR5IGZvciB0ZXN0aW5nIHRoZSBVSUQgcG9saWN5IG9mIG1lZGlhIHRyYW5zY29kaW5nIHNlcnZpY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNYWluQWN0aXZpdHkiOworCisgICAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVsbCBsaWZldGltZS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIC8vIEluaXRpYWxpemUgQWN0aXZpdHkgYW5kIGluZmxhdGUgdGhlIFVJLgorICAgIH0KKworICAgIC8vIENhbGxlZCBhZnRlciBvbkNyZWF0ZSBoYXMgZmluaXNoZWQsIHVzZSB0byByZXN0b3JlIFVJIHN0YXRlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gUmVzdG9yZSBVSSBzdGF0ZSBmcm9tIHRoZSBzYXZlZEluc3RhbmNlU3RhdGUuCisgICAgICAgIC8vIFRoaXMgYnVuZGxlIGhhcyBhbHNvIGJlZW4gcGFzc2VkIHRvIG9uQ3JlYXRlLgorICAgICAgICAvLyBXaWxsIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBBY3Rpdml0eSBoYXMgYmVlbgorICAgICAgICAvLyBraWxsZWQgYnkgdGhlIHN5c3RlbSBzaW5jZSBpdCB3YXMgbGFzdCB2aXNpYmxlLgorICAgIH0KKworICAgIC8vIENhbGxlZCBiZWZvcmUgc3Vic2VxdWVudCB2aXNpYmxlIGxpZmV0aW1lcworICAgIC8vIGZvciBhbiBhY3Rpdml0eSBwcm9jZXNzLgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVzdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25SZXN0YXJ0KCk7CisgICAgICAgIC8vIExvYWQgY2hhbmdlcyBrbm93aW5nIHRoYXQgdGhlIEFjdGl2aXR5IGhhcyBhbHJlYWR5CisgICAgICAgIC8vIGJlZW4gdmlzaWJsZSB3aXRoaW4gdGhpcyBwcm9jZXNzLgorICAgIH0KKworICAgIC8vIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHZpc2libGUgbGlmZXRpbWUuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKKyAgICAgICAgc3VwZXIub25TdGFydCgpOworICAgICAgICAvLyBBcHBseSBhbnkgcmVxdWlyZWQgVUkgY2hhbmdlIG5vdyB0aGF0IHRoZSBBY3Rpdml0eSBpcyB2aXNpYmxlLgorICAgIH0KKworICAgIC8vIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFjdGl2ZSBsaWZldGltZS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgLy8gUmVzdW1lIGFueSBwYXVzZWQgVUkgdXBkYXRlcywgdGhyZWFkcywgb3IgcHJvY2Vzc2VzIHJlcXVpcmVkCisgICAgICAgIC8vIGJ5IHRoZSBBY3Rpdml0eSBidXQgc3VzcGVuZGVkIHdoZW4gaXQgd2FzIGluYWN0aXZlLgorICAgIH0KKworICAgIC8vIENhbGxlZCB0byBzYXZlIFVJIHN0YXRlIGNoYW5nZXMgYXQgdGhlCisgICAgLy8gZW5kIG9mIHRoZSBhY3RpdmUgbGlmZWN5Y2xlLgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAvLyBTYXZlIFVJIHN0YXRlIGNoYW5nZXMgdG8gdGhlIHNhdmVkSW5zdGFuY2VTdGF0ZS4KKyAgICAgICAgLy8gVGhpcyBidW5kbGUgd2lsbCBiZSBwYXNzZWQgdG8gb25DcmVhdGUgYW5kCisgICAgICAgIC8vIG9uUmVzdG9yZUluc3RhbmNlU3RhdGUgaWYgdGhlIHByb2Nlc3MgaXMKKyAgICAgICAgLy8ga2lsbGVkIGFuZCByZXN0YXJ0ZWQgYnkgdGhlIHJ1biB0aW1lLgorICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFjdGl2ZSBsaWZldGltZS4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBTdXNwZW5kIFVJIHVwZGF0ZXMsIHRocmVhZHMsIG9yIENQVSBpbnRlbnNpdmUgcHJvY2Vzc2VzCisgICAgICAgIC8vIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSB1cGRhdGVkIHdoZW4gdGhlIEFjdGl2aXR5IGlzbid0CisgICAgICAgIC8vIHRoZSBhY3RpdmUgZm9yZWdyb3VuZCBBY3Rpdml0eS4KKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgIH0KKworICAgIC8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSB2aXNpYmxlIGxpZmV0aW1lLgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKKyAgICAgICAgLy8gU3VzcGVuZCByZW1haW5pbmcgVUkgdXBkYXRlcywgdGhyZWFkcywgb3IgcHJvY2Vzc2luZworICAgICAgICAvLyB0aGF0IGFyZW4ndCByZXF1aXJlZCB3aGVuIHRoZSBBY3Rpdml0eSBpc24ndCB2aXNpYmxlLgorICAgICAgICAvLyBQZXJzaXN0IGFsbCBlZGl0cyBvciBzdGF0ZSBjaGFuZ2VzCisgICAgICAgIC8vIGFzIGFmdGVyIHRoaXMgY2FsbCB0aGUgcHJvY2VzcyBpcyBsaWtlbHkgdG8gYmUga2lsbGVkLgorICAgICAgICBzdXBlci5vblN0b3AoKTsKKyAgICB9CisKKyAgICAvLyBTb21ldGltZXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bGwgbGlmZXRpbWUuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAvLyBDbGVhbiB1cCBhbnkgcmVzb3VyY2VzIGluY2x1ZGluZyBlbmRpbmcgdGhyZWFkcywKKyAgICAgICAgLy8gY2xvc2luZyBkYXRhYmFzZSBjb25uZWN0aW9ucyBldGMuCisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC90ZXN0cy90cmFuc2NvZGluZy9SZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eS5qYXZhIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9UcmFuc2NvZGluZ1VpZFBvbGljeVRlc3RBcHAvc3JjL2NvbS9hbmRyb2lkL3Rlc3RzL3RyYW5zY29kaW5nL1Jlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllMmRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvVHJhbnNjb2RpbmdVaWRQb2xpY3lUZXN0QXBwL3NyYy9jb20vYW5kcm9pZC90ZXN0cy90cmFuc2NvZGluZy9SZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eS5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RzLnRyYW5zY29kaW5nOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0luZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvLlZpZGVvQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKKworcHVibGljIGNsYXNzIFJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfTk9OU0VDVVJFID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NFQ1VSRSA9IDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NSVggPSAyOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBUQUc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZSQU1FX1JBVEUgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSUZSQU1FX0lOVEVSVkFMID0gMTA7IC8vIDEwIHNlY29uZHMgYmV0d2VlbiBJLWZyYW1lcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FID0gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fQVZDOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FT1VUX01TID0gNTAwMDsKKworICAgIHByaXZhdGUgVmVjdG9yPE1lZGlhQ29kZWM+IG1Db2RlY3MgPSBuZXcgVmVjdG9yPE1lZGlhQ29kZWM+KCk7CisKKyAgICBwcml2YXRlIGNsYXNzIFRlc3RDb2RlY0NhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb2RlYy5DYWxsYmFjayB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbklucHV0QnVmZmVyQXZhaWxhYmxlKE1lZGlhQ29kZWMgY29kZWMsIGludCBpbmRleCkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25JbnB1dEJ1ZmZlckF2YWlsYWJsZSAiICsgY29kZWMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25PdXRwdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYyBjb2RlYywgaW50IGluZGV4LCBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gaW5mbykgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAib25PdXRwdXRCdWZmZXJBdmFpbGFibGUgIiArIGNvZGVjLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoTWVkaWFDb2RlYyBjb2RlYywgTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJvbkVycm9yICIgKyBjb2RlYy50b1N0cmluZygpICsgIiBlcnJvckNvZGUgIiArIGUuZ2V0RXJyb3JDb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0Rm9ybWF0Q2hhbmdlZChNZWRpYUNvZGVjIGNvZGVjLCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIm9uT3V0cHV0Rm9ybWF0Q2hhbmdlZCAiICsgY29kZWMudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1lZGlhQ29kZWMuQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IFRlc3RDb2RlY0NhbGxiYWNrKCk7CisKKyAgICBwcml2YXRlIE1lZGlhRm9ybWF0IGdldFRlc3RGb3JtYXQoQ29kZWNDYXBhYmlsaXRpZXMgY2FwcywgYm9vbGVhbiBzZWN1cmVQbGF5YmFjaykgeworICAgICAgICBWaWRlb0NhcGFiaWxpdGllcyB2Y2FwcyA9IGNhcHMuZ2V0VmlkZW9DYXBhYmlsaXRpZXMoKTsKKyAgICAgICAgaW50IHdpZHRoID0gdmNhcHMuZ2V0U3VwcG9ydGVkV2lkdGhzKCkuZ2V0TG93ZXIoKTsKKyAgICAgICAgaW50IGhlaWdodCA9IHZjYXBzLmdldFN1cHBvcnRlZEhlaWdodHNGb3Iod2lkdGgpLmdldExvd2VyKCk7CisgICAgICAgIGludCBiaXRyYXRlID0gdmNhcHMuZ2V0Qml0cmF0ZVJhbmdlKCkuZ2V0TG93ZXIoKTsKKworICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChNSU1FLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwgY2Fwcy5jb2xvckZvcm1hdHNbMF0pOworICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdHJhdGUpOworICAgICAgICBmb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfRlJBTUVfUkFURSwgRlJBTUVfUkFURSk7CisgICAgICAgIGZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JX0ZSQU1FX0lOVEVSVkFMLCBJRlJBTUVfSU5URVJWQUwpOworICAgICAgICBmb3JtYXQuc2V0RmVhdHVyZUVuYWJsZWQoQ29kZWNDYXBhYmlsaXRpZXMuRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywgc2VjdXJlUGxheWJhY2spOworICAgICAgICByZXR1cm4gZm9ybWF0OworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFDb2RlY0luZm8gZ2V0VGVzdENvZGVjSW5mbyhib29sZWFuIHNlY3VyZVBsYXliYWNrKSB7CisgICAgICAgIC8vIFVzZSBhdmMgZGVjb2RlciBmb3IgdGVzdGluZy4KKyAgICAgICAgYm9vbGVhbiBpc0VuY29kZXIgPSBmYWxzZTsKKworICAgICAgICBNZWRpYUNvZGVjTGlzdCBtY2wgPSBuZXcgTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3QuQUxMX0NPREVDUyk7CisgICAgICAgIGZvciAoTWVkaWFDb2RlY0luZm8gaW5mbyA6IG1jbC5nZXRDb2RlY0luZm9zKCkpIHsKKyAgICAgICAgICAgIGlmIChpbmZvLmlzRW5jb2RlcigpICE9IGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29kZWNDYXBhYmlsaXRpZXMgY2FwczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2FwcyA9IGluZm8uZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZShNSU1FKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIHNlY3VyZVBsYXliYWNrU3VwcG9ydGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHMuaXNGZWF0dXJlU3VwcG9ydGVkKENvZGVjQ2FwYWJpbGl0aWVzLkZFQVRVUkVfU2VjdXJlUGxheWJhY2spOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VjdXJlUGxheWJhY2tSZXF1aXJlZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLmlzRmVhdHVyZVJlcXVpcmVkKENvZGVjQ2FwYWJpbGl0aWVzLkZFQVRVUkVfU2VjdXJlUGxheWJhY2spOworICAgICAgICAgICAgICAgIGlmICgoc2VjdXJlUGxheWJhY2sgJiYgc2VjdXJlUGxheWJhY2tTdXBwb3J0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoIXNlY3VyZVBsYXliYWNrICYmICFzZWN1cmVQbGF5YmFja1JlcXVpcmVkKSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZWN1cmVQbGF5YmFjayAiICsgc2VjdXJlUGxheWJhY2sgKyAiIHdpbGwgdXNlICIgKyBpbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2VjdXJlUGxheWJhY2sgIiArIHNlY3VyZVBsYXliYWNrICsgIiBza2lwICIgKyBpbmZvLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbWltZSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgYWxsb2NhdGVDb2RlY3MoaW50IG1heCkgeworICAgICAgICBCdW5kbGUgZXh0cmFzID0gZ2V0SW50ZW50KCkuZ2V0RXh0cmFzKCk7CisgICAgICAgIGludCB0eXBlID0gVFlQRV9OT05TRUNVUkU7CisgICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZSA9IGV4dHJhcy5nZXRJbnQoInRlc3QtdHlwZSIsIHR5cGUpOworICAgICAgICAgICAgTG9nLmQoVEFHLCAidHlwZSBpczogIiArIHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBzaG91bGRTa2lwID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gc2VjdXJlUGxheWJhY2s7CisgICAgICAgIGlmICh0eXBlID09IFRZUEVfTk9OU0VDVVJFIHx8IHR5cGUgPT0gVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHNlY3VyZVBsYXliYWNrID0gZmFsc2U7CisgICAgICAgICAgICBNZWRpYUNvZGVjSW5mbyBpbmZvID0gZ2V0VGVzdENvZGVjSW5mbyhzZWN1cmVQbGF5YmFjayk7CisgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWxsb2NhdGVDb2RlY3MobWF4LCBpbmZvLCBzZWN1cmVQbGF5YmFjayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNob3VsZFNraXAgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzaG91bGRTa2lwKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBUWVBFX1NFQ1VSRSB8fCB0eXBlID09IFRZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgc2VjdXJlUGxheWJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvIGluZm8gPSBnZXRUZXN0Q29kZWNJbmZvKHNlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlQ29kZWNzKG1heCwgaW5mbywgc2VjdXJlUGxheWJhY2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNob3VsZFNraXAgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaG91bGRTa2lwKSB7CisgICAgICAgICAgICBMb2cuZChUQUcsICJ0ZXN0IHNraXBwZWQgYXMgdGhlcmUncyBubyBzdXBwb3J0ZWQgY29kZWMuIik7CisgICAgICAgICAgICBmaW5pc2hXaXRoUmVzdWx0KFJFU1VMVF9PSyk7CisgICAgICAgIH0KKworICAgICAgICBMb2cuZChUQUcsICJhbGxvY2F0ZUNvZGVjcyByZXR1cm5lZCAiICsgbUNvZGVjcy5zaXplKCkpOworICAgICAgICByZXR1cm4gbUNvZGVjcy5zaXplKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWxsb2NhdGVDb2RlY3MoaW50IG1heCwgTWVkaWFDb2RlY0luZm8gaW5mbywgYm9vbGVhbiBzZWN1cmVQbGF5YmFjaykgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGluZm8uZ2V0TmFtZSgpOworICAgICAgICBDb2RlY0NhcGFiaWxpdGllcyBjYXBzID0gaW5mby5nZXRDYXBhYmlsaXRpZXNGb3JUeXBlKE1JTUUpOworICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBnZXRUZXN0Rm9ybWF0KGNhcHMsIHNlY3VyZVBsYXliYWNrKTsKKyAgICAgICAgTWVkaWFDb2RlYyBjb2RlYyA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSBtQ29kZWNzLnNpemUoKTsgaSA8IG1heDsgKytpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNyZWF0ZSBjb2RlYyAiICsgbmFtZSArICIgIyIgKyBpKTsKKyAgICAgICAgICAgICAgICBjb2RlYyA9IE1lZGlhQ29kZWMuY3JlYXRlQnlDb2RlY05hbWUobmFtZSk7CisgICAgICAgICAgICAgICAgY29kZWMuc2V0Q2FsbGJhY2sobUNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb25maWd1cmUgY29kZWMgIiArIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgY29kZWMuY29uZmlndXJlKGZvcm1hdCwgbnVsbCwgbnVsbCwgMCk7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3RhcnQgY29kZWMgIiArIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgY29kZWMuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNzLmFkZChjb2RlYyk7CisgICAgICAgICAgICAgICAgY29kZWMgPSBudWxsOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJT0V4Y2VwdGlvbiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBjYXRjaCAoTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29kZWNFeGNlcHRpb24gMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhlLmdldEVycm9yQ29kZSgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjb2RlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJlbGVhc2UgY29kZWMiKTsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoV2l0aFJlc3VsdChpbnQgcmVzdWx0KSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBjb2RlYyAjIiArIGkpOworICAgICAgICAgICAgbUNvZGVjcy5nZXQoaSkucmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIG1Db2RlY3MuY2xlYXIoKTsKKyAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCk7CisgICAgICAgIGZpbmlzaCgpOworICAgICAgICBMb2cuZChUQUcsICJhY3Rpdml0eSBmaW5pc2hlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1VzZUNvZGVjcygpIHsKKyAgICAgICAgaW50IGN1cnJlbnQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChjdXJyZW50ID0gMDsgY3VycmVudCA8IG1Db2RlY3Muc2l6ZSgpOyArK2N1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNzLmdldChjdXJyZW50KS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTG9nLmQoVEFHLCAidXNlQ29kZWNzIGdvdCBDb2RlY0V4Y2VwdGlvbiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGUuZ2V0RXJyb3JDb2RlKCkpKTsKKyAgICAgICAgICAgIGlmIChlLmdldEVycm9yQ29kZSgpID09IE1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb24uRVJST1JfUkVDTEFJTUVEKSB7CisgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVtb3ZlIGNvZGVjICIgKyBjdXJyZW50ICsgIiBmcm9tIHRoZSBsaXN0Iik7CisgICAgICAgICAgICAgICAgbUNvZGVjcy5nZXQoY3VycmVudCkucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1Db2RlY3MucmVtb3ZlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIG1Hb3RSZWNsYWltZWRFeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIG1Vc2VDb2RlY3MgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVGhyZWFkIG1Xb3JrZXJUaHJlYWQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Vc2VDb2RlY3MgPSB0cnVlOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtR290UmVjbGFpbWVkRXhjZXB0aW9uID0gZmFsc2U7CisgICAgcHJvdGVjdGVkIHZvaWQgdXNlQ29kZWNzKCkgeworICAgICAgICBtV29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICAgICAgbG9uZyB0aW1lU2luY2VTdGFydGVkTXMgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlIChtVXNlQ29kZWNzICYmICh0aW1lU2luY2VTdGFydGVkTXMgPCBUSU1FT1VUX01TKSkgeworICAgICAgICAgICAgICAgICAgICBkb1VzZUNvZGVjcygpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwIC8qIG1pbGxpcyAqLyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aW1lU2luY2VTdGFydGVkTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUdvdFJlY2xhaW1lZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJHb3QgZXhwZWN0ZWQgcmVjbGFpbSBleGNlcHRpb24uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmlzaFdpdGhSZXN1bHQoUkVTVUxUX09LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG1Xb3JrZXJUaHJlYWQuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lOU1RBTkNFUyA9IDMyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBUQUcgPSAiUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHkiOworCisgICAgICAgIExvZy5kKFRBRywgIm9uQ3JlYXRlIGNhbGxlZC4iKTsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBpZiAoYWxsb2NhdGVDb2RlY3MoTUFYX0lOU1RBTkNFUykgPT0gTUFYX0lOU1RBTkNFUykgeworICAgICAgICAgICAgLy8gaGF2ZW4ndCByZWFjaGVkIHRoZSBsaW1pdCB3aXRoIE1BWF9JTlNUQU5DRVMsIG5vIG5lZWQgdG8gd2FpdCBmb3IgcmVjbGFpbSBleGNlcHRpb24uCisgICAgICAgICAgICAvL21XYWl0Rm9yUmVjbGFpbSA9IGZhbHNlOworICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGlkbid0IGhpdCByZXNvdXJjZSBsaW1pdGF0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICB1c2VDb2RlY3MoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIExvZy5kKFRBRywgIm9uRGVzdHJveSBjYWxsZWQuIik7CisgICAgICAgIHN1cGVyLm9uRGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGJjZGM3ZjcuLmVkZjY3NzgKLS0tIGEvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMTMsMTEgKzEzLDM1IEBACiAKIG1tCiAKLWVjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKyMgUHVzaCB0aGUgZmlsZXMgb250byB0aGUgZGV2aWNlLgorLiAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXRyYW5zY29kaW5nL3Rlc3RzL3B1c2hfYXNzZXRzLnNoCiAKLWFkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudCAmJiBhZGIgc3luYworZWNobyAiWz09PT09PT09PT1dIGluc3RhbGxpbmcgdGVzdCBhcHBzIgorYWRiIHJvb3QKK2FkYiBpbnN0YWxsIC10IC1yIC1nIC1kICRBTkRST0lEX1RBUkdFVF9PVVRfVEVTVENBU0VTL1RyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBBL2FybTY0L1RyYW5zY29kaW5nVWlkUG9saWN5X1Rlc3RBcHBBLmFwaworYWRiIGluc3RhbGwgLXQgLXIgLWcgLWQgJEFORFJPSURfVEFSR0VUX09VVF9URVNUQ0FTRVMvVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEIvYXJtNjQvVHJhbnNjb2RpbmdVaWRQb2xpY3lfVGVzdEFwcEIuYXBrCithZGIgaW5zdGFsbCAtdCAtciAtZyAtZCAkQU5EUk9JRF9UQVJHRVRfT1VUX1RFU1RDQVNFUy9UcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQy9hcm02NC9UcmFuc2NvZGluZ1VpZFBvbGljeV9UZXN0QXBwQy5hcGsKIAotZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gIls9PT09PT09PT09XSB3YWl0aW5nIGZvciBkZXZpY2UgYW5kIHN5bmMiCithZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQgJiYgYWRiIHN5bmMKIAotZWNobyAidGVzdGluZyBtZWRpYXRyYW5zY29kaW5nc2VydmljZSIKLWFkYiBzaGVsbCAvZGF0YS9uYXRpdmV0ZXN0NjQvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdHMKK2VjaG8gIls9PT09PT09PT09XSBydW5uaW5nIHNpbXVsYXRlZCB0ZXN0cyIKK2FkYiBzaGVsbCBzZXRwcm9wIGRlYnVnLnRyYW5zY29kaW5nLnNpbXVsYXRlZF90cmFuc2NvZGVyIHRydWUKK2FkYiBzaGVsbCBraWxsIC05IGBwaWQgbWVkaWEudHJhbnNjb2RpbmdgCisjYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3Q2NC9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzCithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzCisKK2VjaG8gIls9PT09PT09PT09XSBydW5uaW5nIHJlYWwgdGVzdHMiCithZGIgc2hlbGwgc2V0cHJvcCBkZWJ1Zy50cmFuc2NvZGluZy5zaW11bGF0ZWRfdHJhbnNjb2RlciBmYWxzZQorYWRiIHNoZWxsIGtpbGwgLTkgYHBpZCBtZWRpYS50cmFuc2NvZGluZ2AKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cworYWRiIHNoZWxsIC9kYXRhL25hdGl2ZXRlc3QvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVhbF90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzCisKK2VjaG8gIls9PT09PT09PT09XSBydW5uaW5nIHJlc291cmNlIHRlc3RzIgorYWRiIHNoZWxsIGtpbGwgLTkgYHBpZCBtZWRpYS50cmFuc2NvZGluZ2AKKyNhZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdDY0L21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Jlc291cmNlX3Rlc3RzCithZGIgc2hlbGwgL2RhdGEvbmF0aXZldGVzdC9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cworCitlY2hvICJbPT09PT09PT09PV0gcmVtb3ZpbmcgZGVidWcgcHJvcGVydGllcyIKK2FkYiBzaGVsbCBzZXRwcm9wIGRlYnVnLnRyYW5zY29kaW5nLnNpbXVsYXRlZF90cmFuc2NvZGVyIFwiXCIKK2FkYiBzaGVsbCBraWxsIC05IGBwaWQgbWVkaWEudHJhbnNjb2RpbmdgCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3JlYWxfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVlYmUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZWFsX3Rlc3RzLmNwcApAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgVGVzdCBmb3IgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2UuCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCIKKworI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oIgorCisvKgorICogVGVzdHMgbWVkaWEgdHJhbnNjb2Rpbmcgc2VydmljZSB3aXRoIHJlYWwgdHJhbnNjb2Rlci4KKyAqCisgKiBVc2VzIHRoZSBzYW1lIHRlc3QgYXNzZXRzIGFzIHRoZSBNZWRpYVRyYW5zY29kZXIgdW5pdCB0ZXN0cy4gQmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3QsCisgKiBwbGVhc2UgbWFrZSBzdXJlIHRvIHB1c2ggdGhlIHRlc3QgYXNzZXRzIHRvIC9zZGNhcmQ6CisgKgorICogYWRiIHB1c2ggJFRPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9hc3NldHMgL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cworICovCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtQYWRkaW5nVXMgPSAxMDAwMDAwOworY29uc3RleHByIGludDY0X3Qga1Nlc3Npb25XaXRoUGFkZGluZ1VzID0gMTAwMDAwMDAgKyBrUGFkZGluZ1VzOworY29uc3RleHByIGludDMyX3Qga0JpdFJhdGUgPSA4ICogMTAwMCAqIDEwMDA7ICAvLyA4TWJzCisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrU2hvcnRTcmNQYXRoID0KKyAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9UcmFuc2NvZGluZ1Rlc3RBc3NldHMvY3ViaWNsZV9hdmNfNDgweDI0MF9hYWNfMjRLSHoubXA0IjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrTG9uZ1NyY1BhdGggPSAiL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cy9sb25ndGVzdF8xNXMubXA0IjsKKworI2RlZmluZSBPVVRQQVRIKG5hbWUpICIvZGF0YS9sb2NhbC90bXAvTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VfIiAjbmFtZSAiLk1QNCIKKworY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCA6IHB1YmxpYyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0KCkgeyBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgY3JlYXRlZCIpOyB9CisKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0KCkgeworICAgICAgICBBTE9HSSgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QgZGVzdHJveWVkIik7CisgICAgfQorfTsKKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RJbnZhbGlkU291cmNlKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGggPSAiYmFkX2ZpbGVfdXJpIjsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0SW52YWxpZFNvdXJjZSkpOworCisgICAgLy8gU3VibWl0IG9uZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICAgbUNsaWVudDEtPnN1Ym1pdCgwLCBzcmNQYXRoLCBkc3RQYXRoLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKworICAgIC8vIENoZWNrIGV4cGVjdGVkIGVycm9yLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZhaWxlZChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0Vycm9ySU8pOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFBhc3N0aHJ1KSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGggPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RQYXNzdGhydSkpOworCisgICAgLy8gU3VibWl0IG9uZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwga1Nob3J0U3JjUGF0aCwgZHN0UGF0aCkpOworCisgICAgLy8gV2FpdCBmb3Igc2Vzc2lvbiB0byBmaW5pc2guCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RUcmFuc2NvZGVWaWRlbykgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0VHJhbnNjb2RlVmlkZW8pKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgc2Vzc2lvbi4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsIGtTaG9ydFNyY1BhdGgsIGRzdFBhdGgsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JpdFJhdGUpKTsKKworICAgIC8vIFdhaXQgZm9yIHNlc3Npb24gdG8gZmluaXNoLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0LCBUZXN0VHJhbnNjb2RlVmlkZW9Qcm9ncmVzcykgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0VHJhbnNjb2RlVmlkZW9Qcm9ncmVzcykpOworCisgICAgLy8gU3VibWl0IG9uZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwga0xvbmdTcmNQYXRoLCBkc3RQYXRoLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisKKyAgICAvLyBXYWl0IGZvciBzZXNzaW9uIHRvIGZpbmlzaC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworCisgICAgLy8gQ2hlY2sgdGhlIHByb2dyZXNzIHVwZGF0ZSBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQuIEZvciB0aGlzIGNsaXAgKGFyb3VuZCB+MTUgc2Vjb25kIGxvbmcpLAorICAgIC8vIGV4cGVjdCBhdCBsZWFzdCAxMCB1cGRhdGVzLCBhbmQgdGhlIGxhc3QgdXBkYXRlIHNob3VsZCBiZSAxMDAuCisgICAgaW50IGxhc3RQcm9ncmVzczsKKyAgICBFWFBFQ1RfR0UobUNsaWVudDEtPmdldFVwZGF0ZUNvdW50KCZsYXN0UHJvZ3Jlc3MpLCAxMCk7CisgICAgRVhQRUNUX0VRKGxhc3RQcm9ncmVzcywgMTAwKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworLyoKKyAqIFRlc3QgY2FuY2VsIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0LgorICovCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdENhbmNlbEltbWVkaWF0ZWx5KSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdENhbmNlbEltbWVkaWF0ZWx5X1Nlc3Npb24wKSk7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDEgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RDYW5jZWxJbW1lZGlhdGVseV9TZXNzaW9uMSkpOworCisgICAgLy8gU3VibWl0IG9uZSBzZXNzaW9uLCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50MS0+c3VibWl0KDAsIHNyY1BhdGgwLCBkc3RQYXRoMCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb24oMCwgc3JjUGF0aDAsIGRzdFBhdGgwKSk7CisKKyAgICAvLyBUZXN0IGNhbmNlbCBzZXNzaW9uIGltbWVkaWF0ZWx5LCBnZXRTZXNzaW9uIHNob3VsZCBmYWlsIGFmdGVyIGNhbmNlbC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigwLCAiIiwgIiIpKTsKKworICAgIC8vIFN1Ym1pdCBuZXcgc2Vzc2lvbiwgbmV3IHNlc3Npb24gc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5IGFuZCBmaW5pc2guCisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50MS0+c3VibWl0KDEsIHNyY1BhdGgxLCBkc3RQYXRoMSwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAxKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDEpKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworLyoKKyAqIFRlc3QgY2FuY2VsIGluIHRoZSBtaWRkbGUgb2YgdHJhbnNjb2RpbmcuCisgKi8KK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0LCBUZXN0Q2FuY2VsV2hpbGVSdW5uaW5nKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdENhbmNlbFdoaWxlUnVubmluZ19TZXNzaW9uMCkpOworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgxID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0Q2FuY2VsV2hpbGVSdW5uaW5nX1Nlc3Npb24xKSk7CisKKyAgICAvLyBTdWJtaXQgdHdvIHNlc3Npb25zLCBzZXNzaW9uIDAgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LCBzZXNzaW9uIDEgc2hvdWxkIGJlIHF1ZXVlZC4KKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMCwgc3JjUGF0aDAsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQxLT5zdWJtaXQoMSwgc3JjUGF0aDEsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCBzcmNQYXRoMCwgZHN0UGF0aDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigxLCBzcmNQYXRoMSwgZHN0UGF0aDEpKTsKKworICAgIC8vIFNlc3Npb24gMCAobG9uZ3Rlc3QpIHNob3VsZG4ndCBmaW5pc2ggaW4gMSBzZWNvbmRzLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKDEwMDAwMDApLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gTm93IGNhbmNlbCBzZXNzaW9uIDAuIFNlc3Npb24gMSBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkgYW5kIGZpbmlzaC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigwLCAiIiwgIiIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFBhdXNlUmVzdW1lU2luZ2xlQ2xpZW50KSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lU2luZ2xlQ2xpZW50X1Nlc3Npb24wKSk7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDEgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RQYXVzZVJlc3VtZVNpbmdsZUNsaWVudF9TZXNzaW9uMSkpOworCisgICAgLy8gU3VibWl0IG9uZSBvZmZsaW5lIHNlc3Npb24sIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsIHNyY1BhdGgwLCBkc3RQYXRoMCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBzdGFydHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb24oMCwgc3JjUGF0aDAsIGRzdFBhdGgwKSk7CisKKyAgICAvLyBTdWJtaXQgb25lIHJlYWx0aW1lIHNlc3Npb24uCisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50MS0+c3VibWl0KDEsIHNyY1BhdGgxLCBkc3RQYXRoMSwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisKKyAgICAvLyBPZmZsaW5lIHNlc3Npb24gc2hvdWxkIHBhdXNlLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uKDAsIHNyY1BhdGgwLCBkc3RQYXRoMCkpOworCisgICAgLy8gUmVhbHRpbWUgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHksIGFuZCBydW4gdG8gZmluaXNoLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAxKSk7CisKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9uIGFmdGVyIGZpbmlzaCBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigxLCAiIiwgIiIpKTsKKworICAgIC8vIFRoZW4gb2ZmbGluZSBzZXNzaW9uIHNob3VsZCByZXN1bWUuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMCkpOworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb24gYWZ0ZXIgcmVzdW1lLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uKDAsIHNyY1BhdGgwLCBkc3RQYXRoMCkpOworCisgICAgLy8gT2ZmbGluZSBzZXNzaW9uIHNob3VsZCBmaW5pc2guCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKyAgICAvLyBUZXN0IGdldCBzZXNzaW9uIGFmdGVyIGZpbmlzaCBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbjxmYWlsPigwLCAiIiwgIiIpKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworLyoKKyAqIEJhc2ljIHRlc3QgZm9yIHBhdXNlL3Jlc3VtZSB3aXRoIHR3byBjbGllbnRzLCB3aXRoIG9uZSBzZXNzaW9uIGVhY2guCisgKiBUb3AgYXBwJ3Mgc2Vzc2lvbiBzaG91bGQgcHJlZW1wdCB0aGUgb3RoZXIgYXBwJ3Mgc2Vzc2lvbi4KKyAqLworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RQYXVzZVJlc3VtZU11bHRpQ2xpZW50cykgeworICAgIEFMT0dEKCJUZXN0UGF1c2VSZXN1bWVNdWx0aUNsaWVudHMgc3RhcnRpbmcuLi4iKTsKKworICAgIGRpc21pc3NLZXlndWFyZCgpOworICAgIHN0b3BBcHBQYWNrYWdlcygpOworCisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgxID0ga1Nob3J0U3JjUGF0aDsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lTXVsdGlDbGllbnRzX0NsaWVudDApKTsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMSA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdFBhdXNlUmVzdW1lTXVsdGlDbGllbnRzX0NsaWVudDEpKTsKKworICAgIEFMT0dEKCJNb3ZpbmcgYXBwIEEgdG8gdG9wLi4uIik7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0YXJ0KGtDbGllbnRQYWNrYWdlQSwga1Rlc3RBY3Rpdml0eU5hbWUpKTsKKworICAgIC8vIFN1Ym1pdCBzZXNzaW9uIHRvIENsaWVudDEuCisgICAgQUxPR0QoIlN1Ym1pdHRpbmcgc2Vzc2lvbiB0byBjbGllbnQxIChhcHAgQSkgLi4uIik7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICBtQ2xpZW50MS0+c3VibWl0KDAsIHNyY1BhdGgwLCBkc3RQYXRoMCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsIGtCaXRSYXRlKSk7CisKKyAgICAvLyBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICBBTE9HRCgiTW92aW5nIGFwcCBCIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUIsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgY29udGludWUgdG8gcnVuLCBzaW5jZSBDbGllbnQyIChhcHAgQikgZG9lc24ndCBoYXZlIGFueSBzZXNzaW9uLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKDEwMDAwMDApLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gU3VibWl0IHNlc3Npb24gdG8gQ2xpZW50Mi4KKyAgICBBTE9HRCgiU3VibWl0dGluZyBzZXNzaW9uIHRvIGNsaWVudDIgKGFwcCBCKSAuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgIG1DbGllbnQyLT5zdWJtaXQoMCwgc3JjUGF0aDEsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwga0JpdFJhdGUpKTsKKworICAgIC8vIENsaWVudDEncyBzZXNzaW9uIHNob3VsZCBwYXVzZSwgY2xpZW50MidzIHNlc3Npb24gc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgyKSwgMCkpOworCisgICAgLy8gQ2xpZW50MidzIHNlc3Npb24gc2hvdWxkIGZpbmlzaCwgdGhlbiBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgcmVzdW1lLgorICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDIpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMCkpOworCisgICAgLy8gQ2xpZW50MSdzIHNlc3Npb24gc2hvdWxkIGZpbmlzaC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgc3RvcEFwcFBhY2thZ2VzKCk7CisKKyAgICBBTE9HRCgiVGVzdFBhdXNlUmVzdW1lTXVsdGlDbGllbnRzIGZpbmlzaGVkLiIpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFVpZEdvbmVGb3JlZ3JvdW5kKSB7CisgICAgQUxPR0QoIlRlc3RVaWRHb25lRm9yZWdyb3VuZCBzdGFydGluZy4uLiIpOworCisgICAgZGlzbWlzc0tleWd1YXJkKCk7CisgICAgc3RvcEFwcFBhY2thZ2VzKCk7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgY29uc3QgY2hhciogZHN0UGF0aDAgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RVaWRHb25lRm9yZWdyb3VuZFNlc3Npb24wKSk7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDEgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RVaWRHb25lRm9yZWdyb3VuZFNlc3Npb24xKSk7CisKKyAgICAvLyBUZXN0IGtpbGwgZm9yZWdyb3VuZCBhcHAsIHVzaW5nIG9ubHkgMSB1aWQuCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gU3VibWl0IHNlc3Npb25zIHRvIENsaWVudDEgKGFwcCBBKS4KKyAgICBBTE9HRCgiU3VibWl0dGluZyBzZXNzaW9ucyB0byBjbGllbnQxIChhcHAgQSkgLi4uIik7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCBrTG9uZ1NyY1BhdGgsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgxLCBrTG9uZ1NyY1BhdGgsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisKKyAgICAvLyBLaWxsIGFwcCBBLCBleHBlY3QgdG8gc2VlIEEncyBzZXNzaW9uIHBhdXNlIGZvbGxvd2VkIGJ5IEIncyBzZXNzaW9uIHN0YXJ0LAorICAgIC8vIHRoZW4gQSdzIHNlc3Npb24gY2FuY2VsbGVkIHdpdGggZXJyb3IgY29kZSBrVWlkR29uZUNhbmNlbGxlZC4KKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVaWRHb25lQ2FuY2VsbGVkKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDEpLCAxKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVaWRHb25lQ2FuY2VsbGVkKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIHN0b3BBcHBQYWNrYWdlcygpOworCisgICAgQUxPR0QoIlRlc3RVaWRHb25lRm9yZWdyb3VuZCBmaW5pc2hlZC4iKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVhbFRlc3QsIFRlc3RVaWRHb25lRm9yZWdyb3VuZE11bHRpVWlkcykgeworICAgIEFMT0dEKCJUZXN0VWlkR29uZUZvcmVncm91bmRNdWx0aVVpZHMgc3RhcnRpbmcuLi4iKTsKKworICAgIGRpc21pc3NLZXlndWFyZCgpOworICAgIHN0b3BBcHBQYWNrYWdlcygpOworCisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgwID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0VWlkR29uZUZvcmVncm91bmRTZXNzaW9uMCkpOworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgxID0gcHJlcGFyZU91dHB1dEZpbGUoT1VUUEFUSChUZXN0VWlkR29uZUZvcmVncm91bmRTZXNzaW9uMSkpOworCisgICAgLy8gVGVzdCBraWxsIGZvcmVncm91bmQgYXBwLCB1c2luZyB0d28gdWlkcy4KKyAgICBBTE9HRCgiTW92aW5nIGFwcCBCIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUIsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnN1Ym1pdCgwLCBrTG9uZ1NyY1BhdGgsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDIpLCAwKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPnN1Ym1pdCgxLCBrTG9uZ1NyY1BhdGgsIGRzdFBhdGgxLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisgICAgLy8gTWFrZSBhcHAgQSBhbHNvIHJlcXVlc3Rpbmcgc2Vzc2lvbiAxLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5hZGRDbGllbnRVaWQoMSwgbUNsaWVudDEtPm1DbGllbnRVaWQpKTsKKworICAgIEFMT0dEKCJNb3ZpbmcgYXBwIEEgdG8gdG9wLi4uIik7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0YXJ0KGtDbGllbnRQYWNrYWdlQSwga1Rlc3RBY3Rpdml0eU5hbWUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMiksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMiksIDEpKTsKKworICAgIC8vIEtpbGwgYXBwIEEsIENMSUVOVCgyKSdzIHNlc3Npb24gMSBzaG91bGQgY29udGludWUgYmVjYXVzZSBpdCdzIGFsc28gcmVxdWVzdGVkIGJ5IGFwcCBCLgorICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgLy8gS2lsbCBhcHAgQiwgc2Vzc2lvbnMgc2hvdWxkIGJlIGNhbmNlbGxlZC4KKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDIpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVaWRHb25lQ2FuY2VsbGVkKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDIpLCAxKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5nZXRMYXN0RXJyb3IoKSwgVHJhbnNjb2RpbmdFcnJvckNvZGU6OmtVaWRHb25lQ2FuY2VsbGVkKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIHN0b3BBcHBQYWNrYWdlcygpOworCisgICAgQUxPR0QoIlRlc3RVaWRHb25lRm9yZWdyb3VuZE11bHRpVWlkcyBmaW5pc2hlZC4iKTsKK30KK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlYWxUZXN0LCBUZXN0VWlkR29uZUJhY2tncm91bmQpIHsKKyAgICBBTE9HRCgiVGVzdFVpZEdvbmVCYWNrZ3JvdW5kIHN0YXJ0aW5nLi4uIik7CisKKyAgICBkaXNtaXNzS2V5Z3VhcmQoKTsKKyAgICBzdG9wQXBwUGFja2FnZXMoKTsKKworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMCA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdFVpZEdvbmVGb3JlZ3JvdW5kU2Vzc2lvbjApKTsKKyAgICBjb25zdCBjaGFyKiBkc3RQYXRoMSA9IHByZXBhcmVPdXRwdXRGaWxlKE9VVFBBVEgoVGVzdFVpZEdvbmVGb3JlZ3JvdW5kU2Vzc2lvbjEpKTsKKworICAgIC8vIFRlc3Qga2lsbCBiYWNrZ3JvdW5kIGFwcCwgdXNpbmcgdHdvIHVpZHMuCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQiB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VCLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXQoMCwga0xvbmdTcmNQYXRoLCBkc3RQYXRoMCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0UmF0ZSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgyKSwgMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXQoMSwga0xvbmdTcmNQYXRoLCBkc3RQYXRoMSwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0UmF0ZSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwga0xvbmdTcmNQYXRoLCBkc3RQYXRoMCwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0UmF0ZSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgyKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworCisgICAgLy8gS2lsbCBhcHAgQiwgYWxsIGl0cyBzZXNzaW9ucyBzaG91bGQgYmUgY2FuY2VsbGVkLgorICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQikpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZhaWxlZChDTElFTlQoMiksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1VpZEdvbmVDYW5jZWxsZWQpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZhaWxlZChDTElFTlQoMiksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a1VpZEdvbmVDYW5jZWxsZWQpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgc3RvcEFwcFBhY2thZ2VzKCk7CisKKyAgICBBTE9HRCgiVGVzdFVpZEdvbmVCYWNrZ3JvdW5kIGZpbmlzaGVkLiIpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZWFsVGVzdCwgVGVzdFVpZEdvbmVCYWNrZ3JvdW5kTXVsdGlVaWRzKSB7CisgICAgQUxPR0QoIlRlc3RVaWRHb25lQmFja2dyb3VuZE11bHRpVWlkcyBzdGFydGluZy4uLiIpOworCisgICAgZGlzbWlzc0tleWd1YXJkKCk7CisgICAgc3RvcEFwcFBhY2thZ2VzKCk7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgY29uc3QgY2hhciogZHN0UGF0aDAgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RVaWRHb25lRm9yZWdyb3VuZFNlc3Npb24wKSk7CisgICAgY29uc3QgY2hhciogZHN0UGF0aDEgPSBwcmVwYXJlT3V0cHV0RmlsZShPVVRQQVRIKFRlc3RVaWRHb25lRm9yZWdyb3VuZFNlc3Npb24xKSk7CisKKyAgICAvLyBUZXN0IGtpbGwgYmFja2dyb3VuZCBhcHAsIHVzaW5nIHR3byB1aWRzLgorICAgIEFMT0dEKCJNb3ZpbmcgYXBwIEIgdG8gdG9wLi4uIik7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0YXJ0KGtDbGllbnRQYWNrYWdlQiwga1Rlc3RBY3Rpdml0eU5hbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0KDAsIGtMb25nU3JjUGF0aCwgZHN0UGF0aDAsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMiksIDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+c3VibWl0KDEsIGtMb25nU3JjUGF0aCwgZHN0UGF0aDEsIFRyYW5zY29kaW5nU2Vzc2lvblByaW9yaXR5OjprTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0JpdFJhdGUpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKyAgICAvLyBNYWtlIGFwcCBBIGFsc28gcmVxdWVzdGluZyBzZXNzaW9uIDEuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDItPmFkZENsaWVudFVpZCgxLCBtQ2xpZW50MS0+bUNsaWVudFVpZCkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgyKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgyKSwgMSkpOworCisgICAgLy8gS2lsbCBhcHAgQiwgQ0xJRU5UKDIpJ3Mgc2Vzc2lvbiAxIHNob3VsZCBjb250aW51ZSB0byBydW4sIHNlc3Npb24gMCBvbgorICAgIC8vIHRoZSBvdGhlciBoYW5kIHNob3VsZCBiZSBjYW5jZWxsZWQuCisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VCKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmFpbGVkKENMSUVOVCgyKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+Z2V0TGFzdEVycm9yKCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprVWlkR29uZUNhbmNlbGxlZCk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBzdG9wQXBwUGFja2FnZXMoKTsKKworICAgIEFMT0dEKCJUZXN0VWlkR29uZUJhY2tncm91bmRNdWx0aVVpZHMgZmluaXNoZWQuIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVzb3VyY2VfdGVzdHMuY3BwIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9yZXNvdXJjZV90ZXN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwZTgwYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfcmVzb3VyY2VfdGVzdHMuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCIKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9CblJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KKworI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oIgorCisvKgorICogVGVzdHMgbWVkaWEgdHJhbnNjb2Rpbmcgc2VydmljZSB3aXRoIHJlYWwgdHJhbnNjb2Rlci4KKyAqCisgKiBVc2VzIHRoZSBzYW1lIHRlc3QgYXNzZXRzIGFzIHRoZSBNZWRpYVRyYW5zY29kZXIgdW5pdCB0ZXN0cy4gQmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3QsCisgKiBwbGVhc2UgbWFrZSBzdXJlIHRvIHB1c2ggdGhlIHRlc3QgYXNzZXRzIHRvIC9zZGNhcmQ6CisgKgorICogYWRiIHB1c2ggJFRPUC9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhdHJhbnNjb2RpbmcvdHJhbnNjb2Rlci90ZXN0cy9hc3NldHMgL2RhdGEvbG9jYWwvdG1wL1RyYW5zY29kaW5nVGVzdEFzc2V0cworICovCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtQYWRkaW5nVXMgPSA0MDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQml0UmF0ZSA9IDggKiAxMDAwICogMTAwMDsgIC8vIDhNYnMKKworY29uc3RleHByIGNvbnN0IGNoYXIqIGtMb25nU3JjUGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvVHJhbnNjb2RpbmdUZXN0QXNzZXRzL2xvbmd0ZXN0XzE1cy5tcDQiOworCitjb25zdGV4cHIgY29uc3QgY2hhcioga1Jlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5ID0KKyAgICAgICAgIi9jb20uYW5kcm9pZC50ZXN0cy50cmFuc2NvZGluZy5SZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eSI7CisKKyNkZWZpbmUgT1VUUEFUSChuYW1lKSAiL2RhdGEvbG9jYWwvdG1wL01lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlXyIgI25hbWUgIi5NUDQiCisKKy8qCisgKiBUaGUgT09NIHNjb3JlIHdlJ3JlIGdvaW5nIHRvIGFzayBSZXNvdXJjZU1hbmFnZXIgdG8gdXNlIGZvciBvdXIgbmF0aXZlIHRyYW5zY29kaW5nCisgKiBzZXJ2aWNlLiBSZXNvdXJjZU1hbmFnZXIgaXNzdWVzIHJlY2xhaW1zIGJhc2VkIG9uIHRoZXNlIHNjb3Jlcy4gSXQgZ2V0cyB0aGUgc2NvcmVzCisgKiBmcm9tIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UsIHdoaWNoIGRvZXNuJ3QgdHJhY2sgbmF0aXZlIHNlcnZpY2VzLiBUaGUgdmFsdWVzIG9mIHRoZQorICogT09NIHNjb3JlcyBhcmUgZGVmaW5lZCBpbjoKKyAqIGZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Byb2Nlc3NMaXN0LmphdmEKKyAqIFdlIHVzZSBTRVJWSUNFX0FESiB3aGljaCBpcyBsb3dlciBwcmlvcml0eSB0aGFuIGFuIGFwcCBwb3NzaWJseSB2aXNpYmxlIHRvIHRoZQorICogdXNlciwgYnV0IGhpZ2hlciBwcmlvcml0eSB0aGFuIGEgY2FjaGVkIGFwcCAod2hpY2ggY291bGQgYmUga2lsbGVkIHdpdGhvdXQgZGlzcnVwdGlvbgorICogdG8gdGhlIHVzZXIpLgorICovCitjb25zdGV4cHIgc3RhdGljIGludDMyX3QgU0VSVklDRV9BREogPSA1MDA7CisKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OkJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwordXNpbmcgYWlkbDo6YW5kcm9pZDo6bWVkaWE6OklSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOworCisvKgorICogUGxhY2Vob2xkZXIgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IGZvciByZWdpc3RlcmluZyBwcm9jZXNzIGluZm8gb3ZlcnJpZGUKKyAqIHdpdGggdGhlIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLiBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIHRva2VuIGJ5IHRoZSBzZXJ2aWNlCisgKiB0byBnZXQgbm90aWZpY2F0aW9ucyBhYm91dCBiaW5kZXIgZGVhdGgsIG5vdCB1c2VkIGZvciByZWNsYWltaW5nIHJlc291cmNlcy4KKyAqLworc3RydWN0IFJlc291cmNlTWFuYWdlckNsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgZXhwbGljaXQgUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgU3RhdHVzIHJlY2xhaW1SZXNvdXJjZShib29sKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGZhbHNlOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIFN0YXR1cyBnZXROYW1lKDo6c3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgeworICAgICAgICBfYWlkbF9yZXR1cm4tPmNsZWFyKCk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgdmlydHVhbCB+UmVzb3VyY2VNYW5hZ2VyQ2xpZW50KCkgPSBkZWZhdWx0OworfTsKKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGdSZXNvdXJjZU1hbmFnZXJDbGllbnQgPQorICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxSZXNvdXJjZU1hbmFnZXJDbGllbnQ+KCk7CisKK3ZvaWQgVHJhbnNjb2RpbmdIZWxwZXJfc2V0UHJvY2Vzc0luZm9PdmVycmlkZShpbnQzMl90IHByb2NTdGF0ZSwgaW50MzJfdCBvb21TY29yZSkgeworICAgIDo6bmRrOjpTcEFJQmluZGVyIGJpbmRlcihBU2VydmljZU1hbmFnZXJfZ2V0U2VydmljZSgibWVkaWEucmVzb3VyY2VfbWFuYWdlciIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPSBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgIGlmIChzZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgSVJlc291cmNlTWFuYWdlclNlcnZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIHNlcnZpY2UtPm92ZXJyaWRlUHJvY2Vzc0luZm8oZ1Jlc291cmNlTWFuYWdlckNsaWVudCwgZ2V0cGlkKCksIHByb2NTdGF0ZSwgb29tU2NvcmUpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHNldFByb2Nlc3NJbmZvT3ZlcnJpZGUuIik7CisgICAgfQorfQorCitjbGFzcyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCA6IHB1YmxpYyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCgpIHsgQUxPR0koIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0IGNyZWF0ZWQiKTsgfQorCisgICAgdmlydHVhbCB+TWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QoKSB7CisgICAgICAgIEFMT0dJKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCBkZXN0cm95ZWQiKTsKKyAgICB9Cit9OworCisvKioKKyAqIEJhc2ljIHRlc3RpbmcgZm9yIGhhbmRsaW5nIHJlc291cmNlIGxvc3QuCisgKgorICogVGhpcyB0ZXN0IHN0YXJ0cyBhIHRyYW5zY29kaW5nIHNlc3Npb24gKHRoYXQncyBzb21ld2hhdCBsb25nIGFuZCB0YWtlcyBzZXZlcmFsIHNlY29uZHMpLAorICogdGhlbiBsYXVuY2hlcyBhbiBhY3Rpdml0eSB0aGF0IGFsbG9jYXRlcyB2aWRlbyBjb2RlYyBpbnN0YW5jZXMgdW50aWwgaXQgaGl0cyBpbnN1ZmZpY2llbnQKKyAqIHJlc291cmNlIGVycm9yLiBCZWNhdXNlIHRoZSBhY3Rpdml0eSBpcyBydW5uaW5nIGluIGZvcmVncm91bmQsCisgKiBSZXNvdXJjZU1hbmFnZXIgd291bGQgcmVjbGFpbSBjb2RlY3MgZnJvbSB0cmFuc2NvZGluZyBzZXJ2aWNlIHdoaWNoIHNob3VsZAorICogY2F1c2UgdGhlIHNlc3Npb24gdG8gYmUgcGF1c2VkLiBUaGUgYWN0aXZpdHkgd2lsbCBob2xkIHRoZSBjb2RlY3MgZm9yIGEgZmV3IHNlY29uZHMKKyAqIGJlZm9yZSByZWxlYXNpbmcgdGhlbSwgYW5kIHRoZSB0cmFuc2NvZGluZyBzZXJ2aWNlIHNob3VsZCBiZSBhYmxlIHRvIHJlc3VtZQorICogYW5kIGNvbXBsZXRlIHRoZSBzZXNzaW9uLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIHRlc3QgbXVzdCBydW4gYXMgcm9vdC4gV2UgbmVlZCB0byBzaW11bGF0ZSBzdWJtaXR0aW5nIGEgcmVxdWVzdCBmb3IgYQorICogY2xpZW50IHt1aWQscGlkfSBydW5uaW5nIGF0IGxvd2VyIHByaW9yaXR5LiBBcyBhIGNtZCBsaW5lIHRlc3QsIGl0J3Mgbm90IGVhc3kgdG8gZ2V0IHRoZQorICogcGlkIG9mIGEgbGl2aW5nIGFwcCwgc28gd2UgdXNlIG91ciBvd24ge3VpZCxwaWR9IHRvIHN1Ym1pdC4gSG93ZXZlciwgc2luY2Ugd2UncmUgYSBuYXRpdmUKKyAqIHByb2Nlc3MsIFJNIGRvZXNuJ3QgaGF2ZSBvdXIgcHJvYyBpbmZvIGFuZCB0aGUgcmVjbGFpbSB3aWxsIGZhaWwuIFNvIHdlIG5lZWQgdG8gdXNlCisgKiBSTSdzIHNldFByb2Nlc3NJbmZvT3ZlcnJpZGUgdG8gb3ZlcnJpZGUgb3VyIHByb2MgaW5mbywgd2hpY2ggcmVxdWlyZXMgcGVybWlzc2lvbiAodW5sZXNzIHJvb3QpLgorICovCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VSZXNvdXJjZVRlc3QsIFRlc3RSZXNvdXJjZUxvc3QpIHsKKyAgICBBTE9HRCgiVGVzdFJlc291cmNlTG9zdCBzdGFydGluZy4uLiwgcGlkICVkIiwgOjpnZXRwaWQoKSk7CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byBzdWJtaXQgdGhlIHJlcXVlc3QgdXNpbmcgb3VyIG93biB7dWlkLHBpZH0uIFNpbmNlIHdlJ3JlIGEgbmF0aXZlCisgICAgLy8gcHJvY2VzcywgUk0gZG9lc24ndCBoYXZlIG91ciBwcm9jIGluZm8gYW5kIHRoZSByZWNsYWltIHdpbGwgZmFpbC4gU28gd2UgbmVlZCB0byB1c2UKKyAgICAvLyBSTSdzIHNldFByb2Nlc3NJbmZvT3ZlcnJpZGUgdG8gb3ZlcnJpZGUgb3VyIHByb2MgaW5mby4KKyAgICBUcmFuc2NvZGluZ0hlbHBlcl9zZXRQcm9jZXNzSW5mb092ZXJyaWRlKEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9TRVJWSUNFLCBTRVJWSUNFX0FESik7CisKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJpbnB1dCBrZXlldmVudCBLRVlDT0RFX1dBS0VVUCIpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJ3bSBkaXNtaXNzLWtleWd1YXJkIikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdG9wKGtDbGllbnRQYWNrYWdlQSkpOworCisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIGNvbnN0IGNoYXIqIHNyY1BhdGgwID0ga0xvbmdTcmNQYXRoOworICAgIGNvbnN0IGNoYXIqIGRzdFBhdGgwID0gT1VUUEFUSChUZXN0UGF1c2VSZXN1bWVNdWx0aUNsaWVudHNfQ2xpZW50MCk7CisgICAgZGVsZXRlRmlsZShkc3RQYXRoMCk7CisKKyAgICBBTE9HRCgiTW92aW5nIGFwcCBBIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBTdWJtaXQgc2Vzc2lvbiB0byBDbGllbnQxLgorICAgIEFMT0dEKCJTdWJtaXR0aW5nIHNlc3Npb24gdG8gY2xpZW50MSAoYXBwIEEpIC4uLiIpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwgc3JjUGF0aDAsIGRzdFBhdGgwLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtCaXRSYXRlLCA6OmdldHBpZCgpLCA6OmdldHVpZCgpKSk7CisKKyAgICAvLyBDbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICAvLyBMYXVuY2ggUmVzb3VyY2VQb2xpY3lUZXN0QWN0aXZpdHksIHdoaWNoIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIHVwIHRvIDMyCisgICAgLy8gaW5zdGFuY2VzLCB3aGljaCBzaG91bGQgdHJpZ2dlciBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIG9uIG1vc3QgZGV2aWNlcy4KKyAgICAvLyAoTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgdGhhdCB0aGUgZGV2aWNlIHN1cHBvcnRzIGEgdmVyeSBoaWdoIG51bWJlciBvZgorICAgIC8vIHJlc291cmNlIGluc3RhbmNlcywgaW4gd2hpY2ggY2FzZSB3ZSdsbCBzaW1wbHkgcmVxdWlyZSB0aGF0IHRoZSBzZXNzaW9uIGNvbXBsZXRlcy4pCisgICAgQUxPR0QoIkxhdW5jaCBSZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eS4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtSZXNvdXJjZVBvbGljeVRlc3RBY3Rpdml0eSkpOworCisgICAgLy8gVGhlIGJhc2ljIHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIHNlc3Npb24gc2hvdWxkIGNvbXBsZXRlLiBXYWl0IGZvciBmaW5pc2gKKyAgICAvLyBldmVudCB0byBjb21lIGFuZCBwb3AgdXAgYWxsIGV2ZW50cyByZWNlaXZlZC4KKyAgICBzdGQ6Omxpc3Q8RXZlbnRUcmFja2VyOjpFdmVudD4gZXZlbnRzOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT53YWl0Rm9yU3BlY2lmaWNFdmVudEFuZFBvcChFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCksICZldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MDAwMDAwKSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IDEgZXZlbnQsIGl0IG11c3QgYmUgZmluaXNoIChvdGhlcndpc2Ugd2FpdEZvclNwZWNpZmljRXZlbnRBbmRQb3AKKyAgICAvLyB3b3VkbGRuJ3QgcG9wIHVwIGFueXRoaW5nKSwgYW5kIHdlJ3JlIG9rLgorICAgIC8vCisgICAgLy8gVE9ETzogSWYgdGhlcmUgaXMgb25seSAxIGV2ZW50IChmaW5pc2gpLCBhbmQgbm8gcGF1c2UvcmVzdW1lIGhhcHBlbmVkLCB3ZSBuZWVkCisgICAgLy8gdG8gdmVyaWZ5IHRoYXQgdGhlIFJlc291cmNlUG9saWN5VGVzdEFjdGl2aXR5IGFjdHVhbGx5IHdhcyBhYmxlIHRvIGFsbG9jYXRlCisgICAgLy8gYWxsIDMyIGluc3RhbmNlcyB3aXRob3V0IGhpdHRpbmcgaW5zdWZmaWNpZW50IHJlc291cmNlcy4gT3RoZXJ3aXNlLCBpdCBjb3VsZAorICAgIC8vIGJlIHRoYXQgUmVzb3VyY2VNYW5hZ2VyIHdhcyBub3QgYWJsZSB0byByZWNsYWltIGNvZGVjcyBmcm9tIHRoZSB0cmFuc2NvZGluZworICAgIC8vIHNlcnZpY2UgYXQgYWxsLCB3aGljaCBtZWFucyB0aGUgcmVzb3VyY2UgbWFuYWdlbWVudCBpcyBicm9rZW4uCisgICAgaWYgKGV2ZW50cy5zaXplKCkgPiAxKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50cy5zaXplKCkgPj0gMyk7CisgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgZm9yIChhdXRvJiBldmVudCA6IGV2ZW50cykgeworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShldmVudCwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMSksIDApKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSBldmVudHMuc2l6ZSgpIC0gMikgeworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShldmVudCwgRXZlbnRUcmFja2VyOjpSZXN1bWUoQ0xJRU5UKDEpLCAwKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gZXZlbnRzLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoZXZlbnQsIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50ID09IEV2ZW50VHJhY2tlcjo6UGF1c2UoQ0xJRU5UKDEpLCAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2Vfc2ltdWxhdGVkX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy90ZXN0cy9tZWRpYXRyYW5zY29kaW5nc2VydmljZV9zaW11bGF0ZWRfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNTY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCBUZXN0IGZvciBNZWRpYVRyYW5zY29kaW5nU2VydmljZS4KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QiCisKKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5UcmFuc2NvZGluZ0NsaWVudENhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYVRyYW5zY29kaW5nU2VydmljZS5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9JVHJhbnNjb2RpbmdDbGllbnQuaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSVRyYW5zY29kaW5nQ2xpZW50Q2FsbGJhY2suaD4KKyNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL1RyYW5zY29kaW5nU2Vzc2lvblBhcmNlbC5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS9UcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfbWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX3Byb2Nlc3MuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdEhlbHBlci5oIgorI2luY2x1ZGUgIlNpbXVsYXRlZFRyYW5zY29kZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgbWVkaWEgeworCisvLyBOb3RlIHRoYXQgLTEgaXMgdmFsaWQgYW5kIG1lYW5zIHVzaW5nIGNhbGxpbmcgcGlkL3VpZCBmb3IgdGhlIHNlcnZpY2UuIEJ1dCBvbmx5IHByaXZpbGVnZSBjYWxsZXIKKy8vIGNvdWxkIHVzZSB0aGVtLiBUaGlzIHRlc3QgaXMgbm90IGEgcHJpdmlsZWdlIGNhbGxlci4KK2NvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50UGlkID0gLTU7Citjb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFVpZCA9IC0xMDsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE5hbWUgPSAiIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUgPSAiIjsKKworY29uc3RleHByIGludDY0X3Qga1BhZGRpbmdVcyA9IDEwMDAwMDA7Citjb25zdGV4cHIgaW50NjRfdCBrU2Vzc2lvbldpdGhQYWRkaW5nVXMgPSBTaW11bGF0ZWRUcmFuc2NvZGVyOjprU2Vzc2lvbkR1cmF0aW9uVXMgKyBrUGFkZGluZ1VzOworY29uc3RleHByIGludDY0X3Qga1dhdGNoZG9nVGltZW91dFVzID0gMzAwMDAwMDsKKy8vIFBhY2VyIHNldHRpbmdzIHVzZWQgZm9yIHNpbXVsYXRlZCB0ZXN0cy4gTGlzdGVkIGhlcmUgZm9yIHJlZmVyZW5jZS4KK2NvbnN0ZXhwciBpbnQzMl90IGtTaW11bGF0ZWRQYWNlckJ1cnN0VGhyZXNob2xkTXMgPSA1MDA7CisvL2NvbnN0ZXhwciBpbnQzMl90IGtTaW11bGF0ZWRQYWNlckJ1cnN0Q291bnRRdW90YSA9IDEwOworLy9jb25zdGV4cHIgaW50MzJfdCBrU2ltdWxhdGVkUGFjZXJCdXJzdFRpbWVRdW90YVNlYyA9IDM7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50T3BQYWNrYWdlTmFtZSA9ICJUZXN0Q2xpZW50UGFja2FnZSI7CisKK2NsYXNzIE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCA6IHB1YmxpYyBNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3RCYXNlIHsKK3B1YmxpYzoKKyAgICBNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QoKSB7IEFMT0dJKCJNZWRpYVRyYW5zY29kaW5nU2VydmljZVJlc291cmNlVGVzdCBjcmVhdGVkIik7IH0KKworICAgIHZpcnR1YWwgfk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCgpIHsKKyAgICAgICAgQUxPR0koIk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlUmVzb3VyY2VUZXN0IGRlc3Ryb3llZCIpOworICAgIH0KKworICAgIHZvaWQgdGVzdFBhY2VySGVscGVyKGludCBudW1TdWJtaXRzLCBpbnQgc2Vzc2lvbkR1cmF0aW9uTXMsIGludCBleHBlY3RlZFN1Y2Nlc3MpIHsKKyAgICAgICAgLy8gSWRsZSB0byBjbGVhciBvdXQgYnVyc3QgaGlzdG9yeS4KKyAgICAgICAgdXNsZWVwKGtTaW11bGF0ZWRQYWNlckJ1cnN0VGhyZXNob2xkTXMgKiAyICogMTAwMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU3VibWl0czsgaSsrKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtQ2xpZW50My0+c3VibWl0KGksICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwgLTEgLypiaXRyYXRlQnBzKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIC8qb3ZlcnJpZGVQaWQqLywgLTEgLypvdmVycmlkZVVpZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uRHVyYXRpb25NcykpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRTdWNjZXNzOyBpKyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShtQ2xpZW50My0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgzKSwgaSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKG1DbGllbnQzLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMyksIGkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gZXhwZWN0ZWRTdWNjZXNzOyBpIDwgbnVtU3VibWl0czsgaSsrKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobUNsaWVudDMtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGYWlsZWQoQ0xJRU5UKDMpLCBpKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEobUNsaWVudDMtPmdldExhc3RFcnJvcigpLCBUcmFuc2NvZGluZ0Vycm9yQ29kZTo6a0Ryb3BwZWRCeVNlcnZpY2UpOworICAgICAgICB9CisgICAgfQorfTsKKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFJlZ2lzdGVyTnVsbENsaWVudCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCBudWxsIGNhbGxiYWNrLgorICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobnVsbHB0ciwga0NsaWVudE5hbWUsIGtDbGllbnRPcFBhY2thZ2VOYW1lLCAmY2xpZW50KTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RSZWdpc3RlckNsaWVudFdpdGhJbnZhbGlkQ2xpZW50TmFtZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1DbGllbnQxLCBrSW52YWxpZENsaWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW52YWxpZENsaWVudE9wUGFja2FnZU5hbWUsICZjbGllbnQpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFJlZ2lzdGVyQ2xpZW50V2l0aEludmFsaWRDbGllbnRQYWNrYWdlTmFtZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdDbGllbnQ+IGNsaWVudDsKKworICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KKyAgICBTdGF0dXMgc3RhdHVzID0KKyAgICAgICAgICAgIG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChtQ2xpZW50MSwga0NsaWVudE5hbWUsIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSwgJmNsaWVudCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXR1cy5pc09rKCkpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0UmVnaXN0ZXJPbmVDbGllbnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1DbGllbnQxLCBrQ2xpZW50TmFtZSwga0NsaWVudE9wUGFja2FnZU5hbWUsICZjbGllbnQpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIGNsaWVudC4KKyAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7CisKKyAgICAvLyBDaGVjayB0aGUgbnVtYmVyIG9mIENsaWVudHMuCisgICAgaW50MzJfdCBudW1PZkNsaWVudHM7CisgICAgc3RhdHVzID0gbVNlcnZpY2UtPmdldE51bU9mQ2xpZW50cygmbnVtT2ZDbGllbnRzKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKKyAgICBFWFBFQ1RfR0UobnVtT2ZDbGllbnRzLCAxKTsKKworICAgIC8vIFVucmVnaXN0ZXIgdGhlIGNsaWVudC4KKyAgICBzdGF0dXMgPSBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFJlZ2lzdGVyQ2xpZW50VHdpY2UpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nQ2xpZW50PiBjbGllbnQ7CisKKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1DbGllbnQxLCBrQ2xpZW50TmFtZSwga0NsaWVudE9wUGFja2FnZU5hbWUsICZjbGllbnQpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIGNsaWVudC4KKyAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7CisKKyAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IGFnYWluIGFuZCBleHBlY3RzIGZhaWx1cmUuCisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50MTsKKyAgICBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQobUNsaWVudDEsIGtDbGllbnROYW1lLCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwgJmNsaWVudDEpOworICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKKworICAgIC8vIFVucmVnaXN0ZXIgdGhlIGNsaWVudC4KKyAgICBzdGF0dXMgPSBjbGllbnQtPnVucmVnaXN0ZXIoKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RTZXNzaW9uSWRJbmRlcGVuZGVuY2UpIHsKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgLy8gU3VibWl0IDIgcmVxdWVzdHMgb24gY2xpZW50MSBmaXJzdC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZSIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDEsICJ0ZXN0X3NvdXJjZV9maWxlIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZSIpKTsKKworICAgIC8vIFN1Ym1pdCAyIHJlcXVlc3RzIG9uIGNsaWVudDIsIHNlc3Npb25JZCBzaG91bGQgYmUgaW5kZXBlbmRlbnQgZm9yIGVhY2ggY2xpZW50LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGUiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGUiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworCisgICAgLy8gQ2FuY2VsIGFsbCBzZXNzaW9ucy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsKDEpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+Y2FuY2VsKDApKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50Mi0+Y2FuY2VsKDEpKTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFN1Ym1pdENhbmNlbFNlc3Npb25zKSB7CisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIC8vIFRlc3Qgc2Vzc2lvbklkIGFzc2lnbm1lbnQuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgwLCAidGVzdF9zb3VyY2VfZmlsZV8wIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZSIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDEsICJ0ZXN0X3NvdXJjZV9maWxlXzEiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGUiKSk7CisKKyAgICAvLyBUZXN0IHN1Ym1pdCBiYWQgcmVxdWVzdCAobm8gdmFsaWQgc291cmNlRmlsZVBhdGgpIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQ8ZmFpbD4oMCwgIiIsICIiKSk7CisKKyAgICAvLyBUZXN0IHN1Ym1pdCBiYWQgcmVxdWVzdCAobm8gdmFsaWQgc291cmNlRmlsZVBhdGgpIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQ8ZmFpbD4oMCwgInNyYyIsICJkc3QiLCBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a05vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAsIGtJbnZhbGlkQ2xpZW50UGlkLCBrSW52YWxpZENsaWVudFVpZCkpOworCisgICAgLy8gVGVzdCBjYW5jZWwgbm9uLWV4aXN0ZW50IHNlc3Npb24gZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbDxmYWlsPigxMDApKTsKKworICAgIC8vIFNlc3Npb24gMCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkgYW5kIGZpbmlzaCBpbiAyIHNlY29uZHMsIGZvbGxvd2VkIGJ5IFNlc3Npb24gMSBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMSkpOworCisgICAgLy8gVGVzdCBjYW5jZWwgdmFsaWQgc2Vzc2lvbklkIGluIHJhbmRvbSBvcmRlci4KKyAgICAvLyBUZXN0IGNhbmNlbCBmaW5pc2hlZCBzZXNzaW9uIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWw8ZmFpbD4oMCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMSkpOworCisgICAgLy8gVGVzdCBjYW5jZWwgc2Vzc2lvbiBhZ2FpbiBmYWlscy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Y2FuY2VsPGZhaWw+KDEpKTsKKworICAgIC8vIFRlc3Qgbm8gbW9yZSBldmVudHMgYXJyaXZpbmcgYWZ0ZXIgY2FuY2VsLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6Tm9FdmVudCk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RHZXRTZXNzaW9ucykgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICAvLyBTdWJtaXQgMyByZXF1ZXN0cy4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgxLCAidGVzdF9zb3VyY2VfZmlsZV8xIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiIpKTsKKworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb25zIGJ5IGlkLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uKDIsICJ0ZXN0X3NvdXJjZV9maWxlXzIiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzIiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb24oMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0U2Vzc2lvbigwLCAidGVzdF9zb3VyY2VfZmlsZV8wIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8wIikpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBieSBpbnZhbGlkIGlkIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uPGZhaWw+KDEwMCwgIiIsICIiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oLTEsICIiLCAiIikpOworCisgICAgLy8gVGVzdCBnZXQgc2Vzc2lvbiBhZnRlciBjYW5jZWwgZmFpbHMuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmNhbmNlbCgyKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb248ZmFpbD4oMiwgIiIsICIiKSk7CisKKyAgICAvLyBTZXNzaW9uIDAgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5IGFuZCBmaW5pc2ggaW4gMiBzZWNvbmRzLCBmb2xsb3dlZCBieSBTZXNzaW9uIDEgc3RhcnQuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKworICAgIC8vIFRlc3QgZ2V0IHNlc3Npb24gYWZ0ZXIgZmluaXNoIGZhaWxzLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRTZXNzaW9uPGZhaWw+KDAsICIiLCAiIikpOworCisgICAgLy8gVGVzdCBnZXQgdGhlIHJlbWFpbmluZyBzZXNzaW9uIDEuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmdldFNlc3Npb24oMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIpKTsKKworICAgIC8vIENhbmNlbCByZW1haW5pbmcgc2Vzc2lvbiAxLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0QWRkR2V0Q2xpZW50VWlkcykgeworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBjbGllbnRVaWRzOworICAgIFRyYW5zY29kaW5nUmVxdWVzdFBhcmNlbCByZXF1ZXN0OworICAgIFRyYW5zY29kaW5nU2Vzc2lvblBhcmNlbCBzZXNzaW9uOworICAgIHVpZF90IG93blVpZCA9IDo6Z2V0dWlkKCk7CisKKyAgICAvLyBTdWJtaXQgb25lIHJlYWwtdGltZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGVfMCIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGUiKSk7CisKKyAgICAvLyBTaG91bGQgaGF2ZSBtQ2xpZW50VWlkIGluIGNsaWVudCB1aWQgbGlzdC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0Q2xpZW50VWlkcygwLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzLnNpemUoKSwgMXUpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzWzBdLCAoaW50MzJfdCltQ2xpZW50MS0+bUNsaWVudFVpZCk7CisKKyAgICAvLyBBZGRpbmcgaW52YWxpZCBjbGllbnQgdWlkIHNob3VsZCBmYWlsLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5hZGRDbGllbnRVaWQ8ZmFpbD4oMCwga0ludmFsaWRDbGllbnRVaWQpKTsKKworICAgIC8vIEFkZGluZyBtQ2xpZW50VWlkIGFnYWluIHNob3VsZCBmYWlsLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5hZGRDbGllbnRVaWQ8ZmFpbD4oMCwgbUNsaWVudDEtPm1DbGllbnRVaWQpKTsKKworICAgIC8vIFN1Ym1pdCBvbmUgb2ZmbGluZSBzZXNzaW9uLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a1Vuc3BlY2lmaWVkKSk7CisKKyAgICAvLyBTaG91bGQgbm90IGhhdmUgYW55IHVpZHMgaW4gY2xpZW50IHVpZCBsaXN0LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRDbGllbnRVaWRzKDEsICZjbGllbnRVaWRzKSk7CisgICAgRVhQRUNUX0VRKGNsaWVudFVpZHMuc2l6ZSgpLCAwdSk7CisKKyAgICAvLyBBZGQgb3duIHVpZCAod2l0aCBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCksIHNob3VsZCBzdWNjZWVkLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5hZGRDbGllbnRVaWQoMSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+Z2V0Q2xpZW50VWlkcygxLCAmY2xpZW50VWlkcykpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzLnNpemUoKSwgMXUpOworICAgIEVYUEVDVF9FUShjbGllbnRVaWRzWzBdLCAoaW50MzJfdClvd25VaWQpOworCisgICAgLy8gQWRkaW5nIG1DbGllbnRVaWQgc2hvdWxkIHN1Y2NlZWQuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmFkZENsaWVudFVpZCgxLCBtQ2xpZW50MS0+bUNsaWVudFVpZCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5nZXRDbGllbnRVaWRzKDEsICZjbGllbnRVaWRzKSk7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiB1aWRTZXQ7CisgICAgdWlkU2V0Lmluc2VydChjbGllbnRVaWRzLmJlZ2luKCksIGNsaWVudFVpZHMuZW5kKCkpOworICAgIEVYUEVDVF9FUSh1aWRTZXQuc2l6ZSgpLCAydSk7CisgICAgRVhQRUNUX0VRKHVpZFNldC5jb3VudChvd25VaWQpLCAxdSk7CisgICAgRVhQRUNUX0VRKHVpZFNldC5jb3VudChtQ2xpZW50MS0+bUNsaWVudFVpZCksIDF1KTsKKworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFN1Ym1pdENhbmNlbFdpdGhPZmZsaW5lU2Vzc2lvbnMpIHsKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgLy8gU3VibWl0IHNvbWUgb2ZmbGluZSBzZXNzaW9ucyBmaXJzdC4KKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtVbnNwZWNpZmllZCkpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2NvZGluZ1Nlc3Npb25Qcmlvcml0eTo6a1Vuc3BlY2lmaWVkKSk7CisKKyAgICAvLyBTZXNzaW9uIDAgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMCkpOworCisgICAgLy8gU3VibWl0IG1vcmUgcmVhbC10aW1lIHNlc3Npb25zLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiIpKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDMsICJ0ZXN0X3NvdXJjZV9maWxlXzMiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzMiKSk7CisKKyAgICAvLyBTZXNzaW9uIDAgc2hvdWxkIHBhdXNlIGltbWVkaWF0ZWx5IGFuZCBzZXNzaW9uIDIgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMikpOworCisgICAgLy8gU2Vzc2lvbiAyIHNob3VsZCBmaW5pc2ggaW4gMiBzZWNvbmRzIGFuZCBzZXNzaW9uIDMgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAyKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAzKSk7CisKKyAgICAvLyBDYW5jZWwgc2Vzc2lvbiAzIG5vdworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMykpOworCisgICAgLy8gU2Vzc2lvbiAwIHNob3VsZCByZXN1bWUgYW5kIGZpbmlzaCBpbiAyIHNlY29uZHMsIGZvbGxvd2VkIGJ5IHNlc3Npb24gMSBzdGFydC4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpSZXN1bWUoQ0xJRU5UKDEpLCAwKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKworICAgIC8vIENhbmNlbCByZW1haW5pbmcgc2Vzc2lvbiAxLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5jYW5jZWwoMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0Q2xpZW50VXNlQWZ0ZXJVbnJlZ2lzdGVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ0NsaWVudD4gY2xpZW50OworCisgICAgLy8gUmVnaXN0ZXIgYSBjbGllbnQsIHRoZW4gdW5yZWdpc3Rlci4KKyAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1DbGllbnQxLCBrQ2xpZW50TmFtZSwga0NsaWVudE9wUGFja2FnZU5hbWUsICZjbGllbnQpOworICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOworCisgICAgc3RhdHVzID0gY2xpZW50LT51bnJlZ2lzdGVyKCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7CisKKyAgICAvLyBUZXN0IHZhcmlvdXMgb3BlcmF0aW9ucyBvbiB0aGUgY2xpZW50LCBzaG91bGQgZmFpbCB3aXRoIEVSUk9SX0RJU0NPTk5FQ1RFRC4KKyAgICBUcmFuc2NvZGluZ1Nlc3Npb25QYXJjZWwgc2Vzc2lvbjsKKyAgICBib29sIHJlc3VsdDsKKyAgICBzdGF0dXMgPSBjbGllbnQtPmdldFNlc3Npb25XaXRoSWQoMCwgJnNlc3Npb24sICZyZXN1bHQpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgc3RhdHVzID0gY2xpZW50LT5jYW5jZWxTZXNzaW9uKDAsICZyZXN1bHQpOworICAgIEVYUEVDVF9FUShzdGF0dXMuZ2V0U2VydmljZVNwZWNpZmljRXJyb3IoKSwgSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlOjpFUlJPUl9ESVNDT05ORUNURUQpOworCisgICAgVHJhbnNjb2RpbmdSZXF1ZXN0UGFyY2VsIHJlcXVlc3Q7CisgICAgc3RhdHVzID0gY2xpZW50LT5zdWJtaXRSZXF1ZXN0KHJlcXVlc3QsICZzZXNzaW9uLCAmcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoc3RhdHVzLmdldFNlcnZpY2VTcGVjaWZpY0Vycm9yKCksIElNZWRpYVRyYW5zY29kaW5nU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFRyYW5zY29kaW5nVWlkUG9saWN5KSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1VpZFBvbGljeSBzdGFydGluZy4uLiIpOworCisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlJ1bkNtZCgiaW5wdXQga2V5ZXZlbnQgS0VZQ09ERV9XQUtFVVAiKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlJ1bkNtZCgid20gZGlzbWlzcy1rZXlndWFyZCIpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUEpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUIpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUMpKTsKKworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBBTE9HRCgiTW92aW5nIGFwcCBBIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBTdWJtaXQgMyByZXF1ZXN0cy4KKyAgICBBTE9HRCgiU3VibWl0dGluZyBzZXNzaW9uIHRvIGNsaWVudDEgKGFwcCBBKSAuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgxLCAidGVzdF9zb3VyY2VfZmlsZV8xIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiIpKTsKKworICAgIC8vIFNlc3Npb24gMCBzaG91bGQgc3RhcnQgaW1tZWRpYXRlbHkuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICBBTE9HRCgiTW92aW5nIGFwcCBCIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUIsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBTZXNzaW9uIDAgc2hvdWxkIGNvbnRpbnVlIGFuZCBmaW5pc2ggaW4gMiBzZWNvbmRzLCB0aGVuIHNlc3Npb24gMSBzaG91bGQgc3RhcnQuCisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKworICAgIEFMT0dEKCJTdWJtaXR0aW5nIHNlc3Npb24gdG8gY2xpZW50MiAoYXBwIEIpIC4uLiIpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQyLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGVfMCIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMCIpKTsKKworICAgIC8vIENsaWVudDEncyBzZXNzaW9uIHNob3VsZCBwYXVzZSwgY2xpZW50MidzIHNlc3Npb24gc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMSkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50Mi0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgyKSwgMCkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSBiYWNrIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisKKyAgICAvLyBDbGllbnQyJ3Mgc2Vzc2lvbiBzaG91bGQgcGF1c2UsIGNsaWVudDEncyBzZXNzaW9uIDEgc2hvdWxkIHJlc3VtZS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDItPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpQYXVzZShDTElFTlQoMiksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpSZXN1bWUoQ0xJRU5UKDEpLCAxKSk7CisKKyAgICAvLyBDbGllbnQyJ3Mgc2Vzc2lvbiAxIHNob3VsZCBmaW5pc2ggaW4gMiBzZWNvbmRzLCB0aGVuIGl0cyBzZXNzaW9uIDIgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAxKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6U3RhcnQoQ0xJRU5UKDEpLCAyKSk7CisKKyAgICAvLyBBZnRlciBjbGllbnQyJ3Mgc2Vzc2lvbnMgZmluaXNoLCBjbGllbnQxJ3Mgc2Vzc2lvbiBzaG91bGQgcmVzdW1lLgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtTZXNzaW9uV2l0aFBhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6RmluaXNoZWQoQ0xJRU5UKDEpLCAyKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQyLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgyKSwgMCkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VCKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VDKSk7CisKKyAgICBBTE9HRCgiVGVzdFRyYW5zY29kaW5nVWlkUG9saWN5IGZpbmlzaGVkLiIpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0VHJhbnNjb2RpbmdVaWRQb2xpY3lXaXRoTXVsdGlwbGVDbGllbnRVaWRzKSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1VpZFBvbGljeVdpdGhNdWx0aXBsZUNsaWVudFVpZHMgc3RhcnRpbmcuLi4iKTsKKworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoImlucHV0IGtleWV2ZW50IEtFWUNPREVfV0FLRVVQIikpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoIndtIGRpc21pc3Mta2V5Z3VhcmQiKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VBKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VCKSk7CisgICAgRVhQRUNUX1RSVUUoU2hlbGxIZWxwZXI6OlN0b3Aoa0NsaWVudFBhY2thZ2VDKSk7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VBLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gU3VibWl0IDMgcmVxdWVzdHMuCisgICAgQUxPR0QoIlN1Ym1pdHRpbmcgc2Vzc2lvbiB0byBjbGllbnQxIChhcHAgQSkuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShtQ2xpZW50MS0+c3VibWl0KDAsICJ0ZXN0X3NvdXJjZV9maWxlXzAiLCAidGVzdF9kZXN0aW5hdGlvbl9maWxlXzAiKSk7CisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPnN1Ym1pdCgxLCAidGVzdF9zb3VyY2VfZmlsZV8xIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8xIikpOworICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMiwgInRlc3Rfc291cmNlX2ZpbGVfMiIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMiIpKTsKKworICAgIC8vIG1DbGllbnQxJ3MgU2Vzc2lvbiAwIHNob3VsZCBzdGFydCBpbW1lZGlhdGVseS4KKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKworICAgIC8vIEFkZCBjbGllbnQyIChhcHAgQikncyB1aWQgdG8gbUNsaWVudDEncyBzZXNzaW9uIDEuCisgICAgRVhQRUNUX1RSVUUobUNsaWVudDEtPmFkZENsaWVudFVpZCgxLCBtQ2xpZW50Mi0+bUNsaWVudFVpZCkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQiB0byB0b3AuLi4iKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RhcnQoa0NsaWVudFBhY2thZ2VCLCBrVGVzdEFjdGl2aXR5TmFtZSkpOworCisgICAgLy8gbUNsaWVudDEncyBzZXNzaW9uIDAgc2hvdWxkIHBhdXNlLCBzZXNzaW9uIDEgc2hvdWxkIHN0YXJ0LgorICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlBhdXNlKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKGtQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OlN0YXJ0KENMSUVOVCgxKSwgMSkpOworCisgICAgQUxPR0QoIk1vdmluZyBhcHAgQSBiYWNrIHRvIHRvcC4uLiIpOworICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpTdGFydChrQ2xpZW50UGFja2FnZUEsIGtUZXN0QWN0aXZpdHlOYW1lKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1Nlc3Npb25XaXRoUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpGaW5pc2hlZChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpSZXN1bWUoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUEpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUIpKTsKKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6U3RvcChrQ2xpZW50UGFja2FnZUMpKTsKKworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RpbmdVaWRQb2xpY3lXaXRoTXVsdGlwbGVDbGllbnRVaWRzIGZpbmlzaGVkLiIpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0VHJhbnNjb2RpbmdUaGVybWFsUG9saWN5KSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kgc3RhcnRpbmcuLi4iKTsKKworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICAvLyBTdWJtaXQgcmVxdWVzdCwgc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMCwgInRlc3Rfc291cmNlX2ZpbGVfMCIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMCIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKworICAgIC8vIE5vdywgc2ltdWxhdGUgdGhlcm1hbCBzdGF0dXMgY2hhbmdlIGJ5IGFkYiBjbWQuIFRoZSBzdGF0dXMgY29kZSBpcyBhcyBkZWZpbmVkIGluCisgICAgLy8gZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL3RoZXJtYWwuaC4KKyAgICAvLyBBVEhFUk1BTF9TVEFUVVNfU0VWRVJFKDMpOiBzaG91bGQgc3RhcnQgdGhyb3R0bGluZy4KKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJjbWQgdGhlcm1hbHNlcnZpY2Ugb3ZlcnJpZGUtc3RhdHVzIDMiKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UGF1c2UoQ0xJRU5UKDEpLCAwKSk7CisKKyAgICAvLyBBVEhFUk1BTF9TVEFUVVNfQ1JJVElDQUwoNCk6IHNob3VsZG4ndCBzdGFydCB0aHJvdHRsaW5nIGFnYWluIChhbHJlYWR5IHN0YXJ0ZWQpLgorICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoImNtZCB0aGVybWFsc2VydmljZSBvdmVycmlkZS1zdGF0dXMgNCIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpOb0V2ZW50KTsKKworICAgIC8vIEFUSEVSTUFMX1NUQVRVU19NT0RFUkFURSgyKTogc2hvdWxkIHN0b3AgdGhyb3R0bGluZy4KKyAgICBFWFBFQ1RfVFJVRShTaGVsbEhlbHBlcjo6UnVuQ21kKCJjbWQgdGhlcm1hbHNlcnZpY2Ugb3ZlcnJpZGUtc3RhdHVzIDIiKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3Aoa1BhZGRpbmdVcyksIEV2ZW50VHJhY2tlcjo6UmVzdW1lKENMSUVOVCgxKSwgMCkpOworCisgICAgLy8gQVRIRVJNQUxfU1RBVFVTX0xJR0hUKDEpOiBzaG91bGRuJ3Qgc3RvcCB0aHJvdHRsaW5nIGFnYWluIChhbHJlYWR5IHN0b3BwZWQpLgorICAgIEVYUEVDVF9UUlVFKFNoZWxsSGVscGVyOjpSdW5DbWQoImNtZCB0aGVybWFsc2VydmljZSBvdmVycmlkZS1zdGF0dXMgMSIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMCkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1RoZXJtYWxQb2xpY3kgZmluaXNoZWQuIik7Cit9CisKK1RFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVNpbXVsYXRlZFRlc3QsIFRlc3RUcmFuc2NvZGluZ1dhdGNoZG9nKSB7CisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1dhdGNoZG9nIHN0YXJ0aW5nLi4uIik7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgLy8gU2ltdWxhdGVkVHJhbnNjb2RlciBpdHNlbGYgZG9lcyBub3Qgc2VuZCBoZWFydGJlYXQuIEl0cyBzZXNzaW9ucyBsYXN0IDFzZWMKKyAgICAvLyBieSBkZWZhdWx0LCBzbyB0aW1lb3V0IHdpbGwgbm90IGhhcHBlbiBub3JtYWxseS4KKyAgICAvLyBIZXJlIHdlIHJ1biBhIHNlc3Npb24gb2YgNDAwMG1zIHdpdGggVHJhbnNjb2RpbmdUZXN0Q29uZmlnLiBUaGlzIHdpbGwgdHJpZ2dlcgorICAgIC8vIGEgd2F0Y2hkb2cgdGltZW91dCBvbiBzZXJ2ZXIgc2lkZS4gV2UgdXNlIGl0IHRvIGNoZWNrIHRoYXQgZXJyb3IgY29kZSBpcyBjb3JyZWN0LgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoCisgICAgICAgICAgICAwLCAidGVzdF9zb3VyY2VfZmlsZV8wIiwgInRlc3RfZGVzdGluYXRpb25fZmlsZV8wIiwgVHJhbnNjb2RpbmdTZXNzaW9uUHJpb3JpdHk6OmtOb3JtYWwsCisgICAgICAgICAgICAtMSAvKmJpdHJhdGVCcHMqLywgLTEgLypvdmVycmlkZVBpZCovLCAtMSAvKm92ZXJyaWRlVWlkKi8sIDQwMDAgLypzZXNzaW9uRHVyYXRpb25NcyovKSk7CisgICAgRVhQRUNUX0VRKG1DbGllbnQxLT5wb3AoMTAwMDAwKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDApKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrV2F0Y2hkb2dUaW1lb3V0VXMgLSAxMDAwMDApLCBFdmVudFRyYWNrZXI6Ok5vRXZlbnQpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+cG9wKDIwMDAwMCksIEV2ZW50VHJhY2tlcjo6RmFpbGVkKENMSUVOVCgxKSwgMCkpOworICAgIEVYUEVDVF9FUShtQ2xpZW50MS0+Z2V0TGFzdEVycm9yKCksIFRyYW5zY29kaW5nRXJyb3JDb2RlOjprV2F0Y2hkb2dUaW1lb3V0KTsKKworICAgIC8vIEFmdGVyIHRoZSB0aW1lb3V0LCBzdWJtaXQgYW5vdGhlciByZXF1ZXN0IGFuZCBjaGVjayBpdCdzIGZpbmlzaGVkLgorICAgIEVYUEVDVF9UUlVFKG1DbGllbnQxLT5zdWJtaXQoMSwgInRlc3Rfc291cmNlX2ZpbGVfMSIsICJ0ZXN0X2Rlc3RpbmF0aW9uX2ZpbGVfMSIpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrUGFkZGluZ1VzKSwgRXZlbnRUcmFja2VyOjpTdGFydChDTElFTlQoMSksIDEpKTsKKyAgICBFWFBFQ1RfRVEobUNsaWVudDEtPnBvcChrU2Vzc2lvbldpdGhQYWRkaW5nVXMpLCBFdmVudFRyYWNrZXI6OkZpbmlzaGVkKENMSUVOVCgxKSwgMSkpOworCisgICAgdW5yZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworCisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1dhdGNoZG9nIGZpbmlzaGVkLiIpOworfQorCitURVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VTaW11bGF0ZWRUZXN0LCBUZXN0VHJhbnNjb2RpbmdQYWNlck92ZXJDb3VudFF1b3RhT25seSkgeworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RpbmdQYWNlck92ZXJDb3VudFF1b3RhT25seSBzdGFydGluZy4uLiIpOworCisgICAgcmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKyAgICB0ZXN0UGFjZXJIZWxwZXIoMTIgLypudW1TdWJtaXRzKi8sIDEwMCAvKnNlc3Npb25EdXJhdGlvbk1zKi8sIDEyIC8qZXhwZWN0ZWRTdWNjZXNzKi8pOworICAgIHVucmVnaXN0ZXJNdWx0aXBsZUNsaWVudHMoKTsKKworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RpbmdQYWNlck92ZXJDb3VudFF1b3RhT25seSBmaW5pc2hlZC4iKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFRyYW5zY29kaW5nUGFjZXJPdmVyVGltZVF1b3RhT25seSkgeworICAgIEFMT0dEKCJUZXN0VHJhbnNjb2RpbmdQYWNlck92ZXJUaW1lUXVvdGFPbmx5IHN0YXJ0aW5nLi4uIik7CisKKyAgICByZWdpc3Rlck11bHRpcGxlQ2xpZW50cygpOworICAgIHRlc3RQYWNlckhlbHBlcig1IC8qbnVtU3VibWl0cyovLCAxMDAwIC8qc2Vzc2lvbkR1cmF0aW9uTXMqLywgNSAvKmV4cGVjdGVkU3VjY2VzcyovKTsKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICBBTE9HRCgiVGVzdFRyYW5zY29kaW5nUGFjZXJPdmVyVGltZVF1b3RhT25seSBmaW5pc2hlZC4iKTsKK30KKworVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlU2ltdWxhdGVkVGVzdCwgVGVzdFRyYW5zY29kaW5nUGFjZXJPdmVyUXVvdGEpIHsKKyAgICBBTE9HRCgiVGVzdFRyYW5zY29kaW5nUGFjZXJPdmVyUXVvdGEgc3RhcnRpbmcuLi4iKTsKKworICAgIHJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisgICAgdGVzdFBhY2VySGVscGVyKDEyIC8qbnVtU3VibWl0cyovLCA0MDAgLypzZXNzaW9uRHVyYXRpb25NcyovLCAxMCAvKmV4cGVjdGVkU3VjY2VzcyovKTsKKyAgICB1bnJlZ2lzdGVyTXVsdGlwbGVDbGllbnRzKCk7CisKKyAgICAvLyBJZGxlIHRvIGNsZWFyIG91dCBidXJzdCBoaXN0b3J5LiBTaW5jZSB3ZSBleHBlY3QgaXQgdG8gYWN0dWFsbHkgZmFpbCwgd2FpdCBmb3IgY29vbGRvd24uCisgICAgQUxPR0QoIlRlc3RUcmFuc2NvZGluZ1BhY2VyT3ZlclF1b3RhIGZpbmlzaGVkLiIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL3Rlc3RzL21lZGlhdHJhbnNjb2RpbmdzZXJ2aWNlX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTc5MWZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvdGVzdHMvbWVkaWF0cmFuc2NvZGluZ3NlcnZpY2VfdGVzdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBVbml0IFRlc3QgZm9yIE1lZGlhVHJhbnNjb2RpbmcgU2VydmljZS4KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QiCi0KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvQm5UcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlIDxhaWRsL2FuZHJvaWQvbWVkaWEvSU1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL0lUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyX2puaS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX21hbmFnZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9wcm9jZXNzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgbWVkaWEgewotCi11c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKLXVzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpCblRyYW5zY29kaW5nU2VydmljZUNsaWVudDsKLXVzaW5nIGFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U7Ci11c2luZyBhaWRsOjphbmRyb2lkOjptZWRpYTo6SVRyYW5zY29kaW5nU2VydmljZUNsaWVudDsKLQotY29uc3RleHByIGludDMyX3Qga0ludmFsaWRDbGllbnRJZCA9IC01OwotCi0vLyBOb3RlIHRoYXQgLTEgaXMgdmFsaWQgYW5kIG1lYW5zIHVzaW5nIGNhbGxpbmcgcGlkL3VpZCBmb3IgdGhlIHNlcnZpY2UuIEJ1dCBvbmx5IHByaXZpbGVnZSBjYWxsZXIgY291bGQKLS8vIHVzZSB0aGVtLiBUaGlzIHRlc3QgaXMgbm90IGEgcHJpdmlsZWdlIGNhbGxlci4KLWNvbnN0ZXhwciBpbnQzMl90IGtJbnZhbGlkQ2xpZW50UGlkID0gLTU7Ci1jb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZENsaWVudFVpZCA9IC01OwotY29uc3RleHByIGNvbnN0IGNoYXIqIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSA9ICIiOwotCi1jb25zdGV4cHIgaW50MzJfdCBrQ2xpZW50VXNlQ2FsbGluZ1BpZCA9IC0xOwotY29uc3RleHByIGludDMyX3Qga0NsaWVudFVzZUNhbGxpbmdVaWQgPSAtMTsKLWNvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ2xpZW50T3BQYWNrYWdlTmFtZSA9ICJUZXN0Q2xpZW50IjsKLQotY2xhc3MgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0KCkgeyBBTE9HRCgiTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0IGNyZWF0ZWQiKTsgfQotCi0gICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl9nZXRTZXJ2aWNlKCJtZWRpYS50cmFuc2NvZGluZyIpKTsKLSAgICAgICAgbVNlcnZpY2UgPSBJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U6OmZyb21CaW5kZXIoYmluZGVyKTsKLSAgICAgICAgaWYgKG1TZXJ2aWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCB0byB0aGUgbWVkaWEudHJhc2NvZGluZyBzZXJ2aWNlLiIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgfk1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCgpIHsgQUxPR0QoIk1lZGlhVHJhbnNjb2RpbmdpbmdTZXJ2aWNlVGVzdCBkZXN0cm95ZWQiKTsgfQotCi0gICAgc3RkOjpzaGFyZWRfcHRyPElNZWRpYVRyYW5zY29kaW5nU2VydmljZT4gbVNlcnZpY2UgPSBudWxscHRyOwotfTsKLQotc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5UcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQgewotICAgIFRlc3RDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElNZWRpYVRyYW5zY29kaW5nU2VydmljZT4mIHNlcnZpY2UpIDogbVNlcnZpY2Uoc2VydmljZSkgewotICAgICAgICBBTE9HRCgiVGVzdENsaWVudCBDcmVhdGVkIik7Ci0gICAgfQotCi0gICAgU3RhdHVzIGdldE5hbWUoc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgb3ZlcnJpZGUgewotICAgICAgICAqX2FpZGxfcmV0dXJuID0gInRlc3RfY2xpZW50IjsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZpbmlzaGVkKAotICAgICAgICAgICAgaW50MzJfdCAvKiBpbl9qb2JJZCAqLywKLSAgICAgICAgICAgIGNvbnN0IDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OlRyYW5zY29kaW5nUmVzdWx0UGFyY2VsJiAvKiBpbl9yZXN1bHQgKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25UcmFuc2NvZGluZ0ZhaWxlZCgKLSAgICAgICAgICAgIGludDMyX3QgLyogaW5fam9iSWQgKi8sCi0gICAgICAgICAgICA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpUcmFuc2NvZGluZ0Vycm9yQ29kZSAvKmluX2Vycm9yQ29kZSAqLykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbkF3YWl0TnVtYmVyT2ZKb2JzQ2hhbmdlZChpbnQzMl90IC8qIGluX2pvYklkICovLCBpbnQzMl90IC8qIGluX29sZEF3YWl0TnVtYmVyICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIGluX25ld0F3YWl0TnVtYmVyICovKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Ci0gICAgfQotCi0gICAgU3RhdHVzIG9uUHJvZ3Jlc3NVcGRhdGUoaW50MzJfdCAvKiBpbl9qb2JJZCAqLywgaW50MzJfdCAvKiBpbl9wcm9ncmVzcyAqLykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwotICAgIH0KLQotICAgIHZpcnR1YWwgflRlc3RDbGllbnQoKSB7IEFMT0dJKCJUZXN0Q2xpZW50IGRlc3Ryb3llZCIpOyB9OwotCi1wcml2YXRlOgotICAgIHN0ZDo6c2hhcmVkX3B0cjxJTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2U+IG1TZXJ2aWNlOwotfTsKLQotVEVTVF9GKE1lZGlhVHJhbnNjb2RpbmdTZXJ2aWNlVGVzdCwgVGVzdFJlZ2lzdGVyTnVsbENsaWVudCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPSBudWxscHRyOwotICAgIGludDMyX3QgY2xpZW50SWQgPSAwOwotICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50LCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwga0NsaWVudFVzZUNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50VXNlQ2FsbGluZ1BpZCwgJmNsaWVudElkKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Ci19Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RSZWdpc3RlckNsaWVudFdpdGhJbnZhbGlkQ2xpZW50UGlkKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0gICAgRVhQRUNUX1RSVUUoY2xpZW50ICE9IG51bGxwdHIpOwotCi0gICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgIGludDMyX3QgY2xpZW50SWQgPSAwOwotICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50LCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwga0NsaWVudFVzZUNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW52YWxpZENsaWVudFBpZCwgJmNsaWVudElkKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Ci19Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RSZWdpc3RlckNsaWVudFdpdGhJbnZhbGlkQ2xpZW50VWlkKSB7Ci0gICAgc3RkOjpzaGFyZWRfcHRyPElUcmFuc2NvZGluZ1NlcnZpY2VDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUZXN0Q2xpZW50PihtU2VydmljZSk7Ci0gICAgRVhQRUNUX1RSVUUoY2xpZW50ICE9IG51bGxwdHIpOwotCi0gICAgLy8gUmVnaXN0ZXIgdGhlIGNsaWVudCB3aXRoIHRoZSBzZXJ2aWNlLgotICAgIGludDMyX3QgY2xpZW50SWQgPSAwOwotICAgIFN0YXR1cyBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50LCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwga0ludmFsaWRDbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2xpZW50VXNlQ2FsbGluZ1BpZCwgJmNsaWVudElkKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Ci19Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RSZWdpc3RlckNsaWVudFdpdGhJbnZhbGlkQ2xpZW50UGFja2FnZU5hbWUpIHsKLSAgICBzdGQ6OnNoYXJlZF9wdHI8SVRyYW5zY29kaW5nU2VydmljZUNsaWVudD4gY2xpZW50ID0KLSAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFRlc3RDbGllbnQ+KG1TZXJ2aWNlKTsKLSAgICBFWFBFQ1RfVFJVRShjbGllbnQgIT0gbnVsbHB0cik7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGUgY2xpZW50IHdpdGggdGhlIHNlcnZpY2UuCi0gICAgaW50MzJfdCBjbGllbnRJZCA9IDA7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IG1TZXJ2aWNlLT5yZWdpc3RlckNsaWVudChjbGllbnQsIGtJbnZhbGlkQ2xpZW50T3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRVc2VDYWxsaW5nVWlkLCBrQ2xpZW50VXNlQ2FsbGluZ1BpZCwgJmNsaWVudElkKTsKLSAgICBFWFBFQ1RfRkFMU0Uoc3RhdHVzLmlzT2soKSk7Ci19Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RSZWdpc3Rlck9uZUNsaWVudCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nUGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NsaWVudFVzZUNhbGxpbmdVaWQsICZjbGllbnRJZCk7Ci0gICAgQUxPR0QoImNsaWVudCBpZCBpcyAlZCIsIGNsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBjbGllbnRJZC4KLSAgICBFWFBFQ1RfVFJVRShjbGllbnRJZCA+IDApOwotCi0gICAgLy8gQ2hlY2sgdGhlIG51bWJlciBvZiBDbGllbnRzLgotICAgIGludDMyX3QgbnVtT2ZDbGllbnRzOwotICAgIHN0YXR1cyA9IG1TZXJ2aWNlLT5nZXROdW1PZkNsaWVudHMoJm51bU9mQ2xpZW50cyk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG51bU9mQ2xpZW50cyk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIHRoZSBjbGllbnQuCi0gICAgYm9vbCByZXM7Ci0gICAgc3RhdHVzID0gbVNlcnZpY2UtPnVucmVnaXN0ZXJDbGllbnQoY2xpZW50SWQsICZyZXMpOwotICAgIEVYUEVDVF9UUlVFKHN0YXR1cy5pc09rKCkpOwotICAgIEVYUEVDVF9UUlVFKHJlcyk7Ci19Ci0KLVRFU1RfRihNZWRpYVRyYW5zY29kaW5nU2VydmljZVRlc3QsIFRlc3RVblJlZ2lzdGVyQ2xpZW50V2l0aEludmFsaWRDbGllbnRJZCkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NsaWVudFVzZUNhbGxpbmdQaWQsICZjbGllbnRJZCk7Ci0gICAgQUxPR0QoImNsaWVudCBpZCBpcyAlZCIsIGNsaWVudElkKTsKLSAgICBFWFBFQ1RfVFJVRShzdGF0dXMuaXNPaygpKTsKLQotICAgIC8vIFZhbGlkYXRlIHRoZSBjbGllbnRJZC4KLSAgICBFWFBFQ1RfVFJVRShjbGllbnRJZCA+IDApOwotCi0gICAgLy8gQ2hlY2sgdGhlIG51bWJlciBvZiBDbGllbnRzLgotICAgIGludDMyX3QgbnVtT2ZDbGllbnRzOwotICAgIHN0YXR1cyA9IG1TZXJ2aWNlLT5nZXROdW1PZkNsaWVudHMoJm51bU9mQ2xpZW50cyk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG51bU9mQ2xpZW50cyk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCBpbnZhbGlkIElECi0gICAgYm9vbCByZXM7Ci0gICAgbVNlcnZpY2UtPnVucmVnaXN0ZXJDbGllbnQoa0ludmFsaWRDbGllbnRJZCwgJnJlcyk7Ci0gICAgRVhQRUNUX0ZBTFNFKHJlcyk7Ci0KLSAgICAvLyBVbnJlZ2lzdGVyIHRoZSB2YWxpZCBjbGllbnQuCi0gICAgbVNlcnZpY2UtPnVucmVnaXN0ZXJDbGllbnQoY2xpZW50SWQsICZyZXMpOwotfQotCi1URVNUX0YoTWVkaWFUcmFuc2NvZGluZ1NlcnZpY2VUZXN0LCBUZXN0UmVnaXN0ZXJDbGllbnRUd2ljZSkgewotICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHJhbnNjb2RpbmdTZXJ2aWNlQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VGVzdENsaWVudD4obVNlcnZpY2UpOwotICAgIEVYUEVDVF9UUlVFKGNsaWVudCAhPSBudWxscHRyKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgd2l0aCB0aGUgc2VydmljZS4KLSAgICBpbnQzMl90IGNsaWVudElkID0gMDsKLSAgICBTdGF0dXMgc3RhdHVzID0gbVNlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KGNsaWVudCwga0NsaWVudE9wUGFja2FnZU5hbWUsIGtDbGllbnRVc2VDYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NsaWVudFVzZUNhbGxpbmdQaWQsICZjbGllbnRJZCk7Ci0gICAgRVhQRUNUX1RSVUUoc3RhdHVzLmlzT2soKSk7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgY2xpZW50SWQuCi0gICAgRVhQRUNUX1RSVUUoY2xpZW50SWQgPiAwKTsKLQotICAgIC8vIFJlZ2lzdGVyIHRoZSBjbGllbnQgYWdhaW4gYW5kIGV4cGVjdHMgZmFpbHVyZS4KLSAgICBzdGF0dXMgPSBtU2VydmljZS0+cmVnaXN0ZXJDbGllbnQoY2xpZW50LCBrQ2xpZW50T3BQYWNrYWdlTmFtZSwga0NsaWVudFVzZUNhbGxpbmdVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbGllbnRVc2VDYWxsaW5nUGlkLCAmY2xpZW50SWQpOwotICAgIEVYUEVDVF9GQUxTRShzdGF0dXMuaXNPaygpKTsKLQotICAgIC8vIFVucmVnaXN0ZXIgdGhlIHZhbGlkIGNsaWVudC4KLSAgICBib29sIHJlczsKLSAgICBtU2VydmljZS0+dW5yZWdpc3RlckNsaWVudChjbGllbnRJZCwgJnJlcyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCmluZGV4IGIwNTc5NjguLjNhODllMTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icApAQCAtMSwzICsxLDEyIEBACitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKIG1pbmlqYWlsX2NvbW1vbl9jZmxhZ3MgPSBbCiAgICAgIi1XYWxsIiwKICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCmluZGV4IDlkOWNhNjMuLjA1NGE4OTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgIDogU2luZ2xldG9uPEFBdWRpb0NsaWVudFRyYWNrZXI+KCkgewogfQogCi1zdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpkdW1wKCkgY29uc3Qgeworc3RkOjpzdHJpbmcgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6ZHVtcCgpIGNvbnN0IE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKICAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKICAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIG1Mb2NrLnRyeV9sb2NrKCk7IH0gLyogZiAqLywKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2VTdHJlYW0gOiBzdHJlYW1zVG9DbG9zZSkgewogICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IHNlcnZpY2VTdHJlYW0tPmdldEhhbmRsZSgpOwogICAgICAgICAgICAgQUxPR1coImJpbmRlckRpZWQoKSBjbG9zZSBhYmFuZG9uZWQgc3RyZWFtIDB4JTA4WFxuIiwgaGFuZGxlKTsKLSAgICAgICAgICAgIGFhdWRpb1NlcnZpY2UtPmNsb3NlU3RyZWFtKGhhbmRsZSk7CisgICAgICAgICAgICBhYXVkaW9TZXJ2aWNlLT5hc0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKS5jbG9zZVN0cmVhbShoYW5kbGUpOwogICAgICAgICB9CiAgICAgICAgIC8vIG1TdHJlYW1zIHNob3VsZCBiZSBlbXB0eSBub3cKICAgICB9CkBAIC0yMDcsNyArMjA3LDcgQEAKIH0KIAogCi1zdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmR1bXAoKSBjb25zdCB7CitzdGQ6OnN0cmluZyBBQXVkaW9DbGllbnRUcmFja2VyOjpOb3RpZmljYXRpb25DbGllbnQ6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAgICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCiAgICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmgKaW5kZXggOTQzYjgwOS4uMmIzODYyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuaApAQCAtMjEsMTAgKzIxLDExIEBACiAjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8c2V0PgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgotI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5oIgorI2luY2x1ZGUgPGFhdWRpby9JQUF1ZGlvQ2xpZW50Lmg+CiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZS5oIgogCiBuYW1lc3BhY2UgYWF1ZGlvIHsKQEAgLTQ2LDcgKzQ3LDcgQEAKICAgICAgKi8KICAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVnaXN0ZXJDbGllbnQocGlkX3QgcGlkLCBjb25zdCBhbmRyb2lkOjpzcDxJQUF1ZGlvQ2xpZW50PiYgY2xpZW50KTsKIAogICAgIHZvaWQgdW5yZWdpc3RlckNsaWVudChwaWRfdCBwaWQpOwogCkBAIC0xMTQsMTAgKzExNSwxMiBAQAogICAgIH07CiAKICAgICAvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1Mb2NrCi0gICAgYW5kcm9pZDo6c3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBnZXROb3RpZmljYXRpb25DbGllbnRfbChwaWRfdCBwaWQpOworICAgIGFuZHJvaWQ6OnNwPE5vdGlmaWNhdGlvbkNsaWVudD4gZ2V0Tm90aWZpY2F0aW9uQ2xpZW50X2wocGlkX3QgcGlkKQorICAgICAgICAgICAgUkVRVUlSRVMobUxvY2spOwogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIHN0ZDo6bWFwPHBpZF90LCBhbmRyb2lkOjpzcDxOb3RpZmljYXRpb25DbGllbnQ+PiBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICBzdGQ6Om1hcDxwaWRfdCwgYW5kcm9pZDo6c3A8Tm90aWZpY2F0aW9uQ2xpZW50Pj4gbU5vdGlmaWNhdGlvbkNsaWVudHMKKyAgICAgICAgICAgIEdVQVJERURfQlkobUxvY2spOwogICAgIGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICptQUF1ZGlvU2VydmljZSA9IG51bGxwdHI7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCA5ZjM0MTUzLi4yMGU0Y2M1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQWlkbENvbnZlcnNpb24uaD4KIAogI2luY2x1ZGUgIkFBdWRpb0NsaWVudFRyYWNrZXIuaCIKICNpbmNsdWRlICJBQXVkaW9FbmRwb2ludE1hbmFnZXIuaCIKQEAgLTQzLDcgKzQ0LDcgQEAKICAgICAgICAgLCBtRXhjbHVzaXZlU3RyZWFtcygpIHsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpkdW1wKCkgY29uc3Qgeworc3RkOjpzdHJpbmcgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpkdW1wKCkgY29uc3QgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogICAgIGludCBpbmRleCA9IDA7CiAKQEAgLTE4Miw3ICsxODMsOSBAQAogICAgICAgICAgICAgLy8gYW5kIFNUQVJUIGNhbGxzLiBUaGlzIHdpbGwgaGVscCBwcmVzZXJ2ZSBhcHAgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAgIC8vIEFuIGFwcCBjYW4gYXZvaWQgaGF2aW5nIHRoaXMgaGFwcGVuIGJ5IGNsb3NpbmcgdGhlaXIgc3RyZWFtcyB3aGVuCiAgICAgICAgICAgICAvLyB0aGUgYXBwIGlzIHBhdXNlZC4KLSAgICAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkuc2V0RXhjbHVzaXZlRW5hYmxlZChyZXF1ZXN0LmdldFByb2Nlc3NJZCgpLCBmYWxzZSk7CisgICAgICAgICAgICBwaWRfdCBwaWQgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgICAgICAgICBhaWRsMmxlZ2FjeV9pbnQzMl90X3BpZF90KHJlcXVlc3QuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKS5waWQpKTsKKyAgICAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkuc2V0RXhjbHVzaXZlRW5hYmxlZChwaWQsIGZhbHNlKTsKICAgICAgICAgICAgIGVuZHBvaW50VG9TdGVhbCA9IGVuZHBvaW50OyAvLyByZXR1cm4gaXQgdG8gY2FsbGVyCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0zMDYsNiArMzA5LDcgQEAKICAgICAgICAgICAgICAgICBtU2hhcmVkU3RyZWFtcy5lbmQoKSk7CiAKICAgICAgICAgc2VydmljZUVuZHBvaW50LT5jbG9zZSgpOworCiAgICAgICAgIG1TaGFyZWRDbG9zZUNvdW50Kys7CiAgICAgICAgIEFMT0dWKCIlcyglcCkgY2xvc2VkIGZvciBkZXZpY2UgJWQiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgc2VydmljZUVuZHBvaW50LmdldCgpLCBzZXJ2aWNlRW5kcG9pbnQtPmdldERldmljZUlkKCkpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCBhZTc3NmIxLi5iMDdiY2VmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KICNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTcwLDEwICs3MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCk7CiAKICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGZpbmRFeGNsdXNpdmVFbmRwb2ludF9sKAotICAgICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uJiBjb25maWd1cmF0aW9uKQorICAgICAgICAgICAgUkVRVUlSRVMobUV4Y2x1c2l2ZUxvY2spOwogCiAgICAgYW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiBmaW5kU2hhcmVkRW5kcG9pbnRfbCgKLSAgICAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24mIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgY29uc3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiYgY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIFJFUVVJUkVTKG1TaGFyZWRMb2NrKTsKIAogICAgIHZvaWQgY2xvc2VFeGNsdXNpdmVFbmRwb2ludChhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IHNlcnZpY2VFbmRwb2ludCk7CiAgICAgdm9pZCBjbG9zZVNoYXJlZEVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKQEAgLTgzLDIzICs4NywyNSBAQAogICAgIC8vIExvY2sgbVNoYXJlZExvY2sgYmVmb3JlIG1FeGNsdXNpdmVMb2NrLgogICAgIC8vIGl0IGlzIE9LIHRvIG9ubHkgbG9jayBtRXhjbHVzaXZlTG9jay4KICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNoYXJlZExvY2s7Ci0gICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPj4gIG1TaGFyZWRTdHJlYW1zOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4+ICBtU2hhcmVkU3RyZWFtcworICAgICAgICAgICAgR1VBUkRFRF9CWShtU2hhcmVkTG9jayk7CiAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUV4Y2x1c2l2ZUxvY2s7Ci0gICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUD4+ICAgIG1FeGNsdXNpdmVTdHJlYW1zOworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+PiAgICBtRXhjbHVzaXZlU3RyZWFtcworICAgICAgICAgICAgR1VBUkRFRF9CWShtRXhjbHVzaXZlTG9jayk7CiAKLSAgICAvLyBNb2RpZmllZCB1bmRlciBhIGxvY2suCi0gICAgaW50MzJfdCBtRXhjbHVzaXZlU2VhcmNoQ291bnQgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgU0VBUkNIRUQgZm9yIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAotICAgIGludDMyX3QgbUV4Y2x1c2l2ZUZvdW5kQ291bnQgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIEZPVU5EIGFuIGV4Y2x1c2l2ZSBlbmRwb2ludAotICAgIGludDMyX3QgbUV4Y2x1c2l2ZU9wZW5Db3VudCAgID0gMDsgLy8gbnVtYmVyIG9mIHRpbWVzIHdlIE9QRU5FRCBhbiBleGNsdXNpdmUgZW5kcG9pbnQKLSAgICBpbnQzMl90IG1FeGNsdXNpdmVDbG9zZUNvdW50ICA9IDA7IC8vIG51bWJlciBvZiB0aW1lcyB3ZSBDTE9TRUQgYW4gZXhjbHVzaXZlIGVuZHBvaW50Ci0gICAgaW50MzJfdCBtRXhjbHVzaXZlU3RvbGVuQ291bnQgPSAwOyAvLyBudW1iZXIgb2YgdGltZXMgd2UgU1RPTEUgYW4gZXhjbHVzaXZlIGVuZHBvaW50CisgICAgLy8gQ291bnRzIHJlbGF0ZWQgdG8gYW4gZXhjbHVzaXZlIGVuZHBvaW50LgorICAgIGludDMyX3QgbUV4Y2x1c2l2ZVNlYXJjaENvdW50IEdVQVJERURfQlkobUV4Y2x1c2l2ZUxvY2spID0gMDsgLy8gIyBTRUFSQ0hFRAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZUZvdW5kQ291bnQgIEdVQVJERURfQlkobUV4Y2x1c2l2ZUxvY2spID0gMDsgLy8gIyBGT1VORAorICAgIGludDMyX3QgbUV4Y2x1c2l2ZU9wZW5Db3VudCAgIEdVQVJERURfQlkobUV4Y2x1c2l2ZUxvY2spID0gMDsgLy8gIyBPUEVORUQKKyAgICBpbnQzMl90IG1FeGNsdXNpdmVDbG9zZUNvdW50ICBHVUFSREVEX0JZKG1FeGNsdXNpdmVMb2NrKSA9IDA7IC8vICMgQ0xPU0VECisgICAgaW50MzJfdCBtRXhjbHVzaXZlU3RvbGVuQ291bnQgR1VBUkRFRF9CWShtRXhjbHVzaXZlTG9jaykgPSAwOyAvLyAjIFNUT0xFTgogCiAgICAgLy8gU2FtZSBhcyBhYm92ZSBidXQgZm9yIFNIQVJFRCBlbmRwb2ludHMuCi0gICAgaW50MzJfdCBtU2hhcmVkU2VhcmNoQ291bnQgICAgPSAwOwotICAgIGludDMyX3QgbVNoYXJlZEZvdW5kQ291bnQgICAgID0gMDsKLSAgICBpbnQzMl90IG1TaGFyZWRPcGVuQ291bnQgICAgICA9IDA7Ci0gICAgaW50MzJfdCBtU2hhcmVkQ2xvc2VDb3VudCAgICAgPSAwOworICAgIGludDMyX3QgbVNoYXJlZFNlYXJjaENvdW50ICAgIEdVQVJERURfQlkobVNoYXJlZExvY2spID0gMDsKKyAgICBpbnQzMl90IG1TaGFyZWRGb3VuZENvdW50ICAgICBHVUFSREVEX0JZKG1TaGFyZWRMb2NrKSA9IDA7CisgICAgaW50MzJfdCBtU2hhcmVkT3BlbkNvdW50ICAgICAgR1VBUkRFRF9CWShtU2hhcmVkTG9jaykgPSAwOworICAgIGludDMyX3QgbVNoYXJlZENsb3NlQ291bnQgICAgIEdVQVJERURfQlkobVNoYXJlZExvY2spID0gMDsKIAogICAgIC8vIEZvciBlYXNpbHkgZGlzYWJsaW5nIHRoZSBzdGVhbGluZyBvZiBleGNsdXNpdmUgc3RyZWFtcy4KICAgICBzdGF0aWMgY29uc3RleHByIGJvb2wga1N0ZWFsaW5nRW5hYmxlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKaW5kZXggMWMwM2I3Zi4uYWQ0YjgzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcApAQCAtMzMsMjUgKzMzLDIxIEBACiB1c2luZyBhbmRyb2lkOjpGaWZvQnVmZmVyOwogdXNpbmcgYW5kcm9pZDo6Zmlmb19mcmFtZXNfdDsKIAotQUF1ZGlvTWl4ZXI6On5BQXVkaW9NaXhlcigpIHsKLSAgICBkZWxldGVbXSBtT3V0cHV0QnVmZmVyOwotfQotCiB2b2lkIEFBdWRpb01peGVyOjphbGxvY2F0ZShpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCkgewogICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBzYW1wbGVzUGVyRnJhbWU7CiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gZnJhbWVzUGVyQnVyc3Q7CiAgICAgaW50MzJfdCBzYW1wbGVzUGVyQnVmZmVyID0gc2FtcGxlc1BlckZyYW1lICogZnJhbWVzUGVyQnVyc3Q7Ci0gICAgbU91dHB1dEJ1ZmZlciA9IG5ldyBmbG9hdFtzYW1wbGVzUGVyQnVmZmVyXTsKKyAgICBtT3V0cHV0QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPihzYW1wbGVzUGVyQnVmZmVyKTsKICAgICBtQnVmZmVyU2l6ZUluQnl0ZXMgPSBzYW1wbGVzUGVyQnVmZmVyICogc2l6ZW9mKGZsb2F0KTsKIH0KIAogdm9pZCBBQXVkaW9NaXhlcjo6Y2xlYXIoKSB7Ci0gICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDAsIG1CdWZmZXJTaXplSW5CeXRlcyk7CisgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIuZ2V0KCksIDAsIG1CdWZmZXJTaXplSW5CeXRlcyk7CiB9CiAKLWludDMyX3QgQUF1ZGlvTWl4ZXI6Om1peChpbnQgc3RyZWFtSW5kZXgsIEZpZm9CdWZmZXIgKmZpZm8sIGJvb2wgYWxsb3dVbmRlcmZsb3cpIHsKK2ludDMyX3QgQUF1ZGlvTWl4ZXI6Om1peChpbnQgc3RyZWFtSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxGaWZvQnVmZmVyPiBmaWZvLCBib29sIGFsbG93VW5kZXJmbG93KSB7CiAgICAgV3JhcHBpbmdCdWZmZXIgd3JhcHBpbmdCdWZmZXI7Ci0gICAgZmxvYXQgKmRlc3RpbmF0aW9uID0gbU91dHB1dEJ1ZmZlcjsKKyAgICBmbG9hdCAqZGVzdGluYXRpb24gPSBtT3V0cHV0QnVmZmVyLmdldCgpOwogCiAjaWYgQUFVRElPX01JWEVSX0FUUkFDRV9FTkFCTEVECiAgICAgQVRSQUNFX0JFR0lOKCJhYU1peCIpOwpAQCAtMTE3LDUgKzExMyw1IEBACiB9CiAKIGZsb2F0ICpBQXVkaW9NaXhlcjo6Z2V0T3V0cHV0QnVmZmVyKCkgewotICAgIHJldHVybiBtT3V0cHV0QnVmZmVyOworICAgIHJldHVybiBtT3V0cHV0QnVmZmVyLmdldCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmgKaW5kZXggZDVhYmM1Yi4uMWExMjBmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5oCkBAIC0yNSw3ICsyNSw2IEBACiBjbGFzcyBBQXVkaW9NaXhlciB7CiBwdWJsaWM6CiAgICAgQUF1ZGlvTWl4ZXIoKSB7fQotICAgIH5BQXVkaW9NaXhlcigpOwogCiAgICAgdm9pZCBhbGxvY2F0ZShpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKQEAgLTM4LDcgKzM3LDcgQEAKICAgICAgKiBAcGFyYW0gYWxsb3dVbmRlcmZsb3cgaWYgdHJ1ZSB0aGVuIGFsbG93IG1peGVyIHRvIGFkdmFuY2UgcmVhZCBpbmRleCBwYXN0IHRoZSB3cml0ZSBpbmRleAogICAgICAqIEByZXR1cm4gZnJhbWVzIHJlYWQgZnJvbSB0aGlzIHN0cmVhbQogICAgICAqLwotICAgIGludDMyX3QgbWl4KGludCBzdHJlYW1JbmRleCwgYW5kcm9pZDo6Rmlmb0J1ZmZlciAqZmlmbywgYm9vbCBhbGxvd1VuZGVyZmxvdyk7CisgICAgaW50MzJfdCBtaXgoaW50IHN0cmVhbUluZGV4LCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlcj4gZmlmbywgYm9vbCBhbGxvd1VuZGVyZmxvdyk7CiAKICAgICBmbG9hdCAqZ2V0T3V0cHV0QnVmZmVyKCk7CiAKQEAgLTQ3LDcgKzQ2LDcgQEAKIHByaXZhdGU6CiAgICAgdm9pZCBtaXhQYXJ0KGZsb2F0ICpkZXN0aW5hdGlvbiwgZmxvYXQgKnNvdXJjZSwgaW50MzJfdCBudW1GcmFtZXMpOwogCi0gICAgZmxvYXQgICAqbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IG1PdXRwdXRCdWZmZXI7CiAgICAgaW50MzJfdCAgbVNhbXBsZXNQZXJGcmFtZSA9IDA7CiAgICAgaW50MzJfdCAgbUZyYW1lc1BlckJ1cnN0ID0gMDsKICAgICBpbnQzMl90ICBtQnVmZmVyU2l6ZUluQnl0ZXMgPSAwOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAppbmRleCAyMmNkYjM1Li40MGE2NjRlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmNwcApAQCAtMjIsNyArMjIsOSBAQAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKQEAgLTMyLDI2ICszNCwzNCBAQAogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKLSNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAogI2RlZmluZSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyAgIDgKKyNkZWZpbmUgQUlETF9SRVRVUk4oeCkgeyAqX2FpZGxfcmV0dXJuID0gKHgpOyByZXR1cm4gU3RhdHVzOjpvaygpOyB9CisKKyNkZWZpbmUgVkFMVUVfT1JfUkVUVVJOX0lMTEVHQUxfQVJHX1NUQVRVUyh4KSBcCisgICAgKHsgYXV0byBfdG1wID0gKHgpOyBcCisgICAgICAgaWYgKCFfdG1wLm9rKCkpIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UKTsgXAorICAgICAgIHN0ZDo6bW92ZShfdG1wLnZhbHVlKCkpOyB9KQogCiB1c2luZyBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlOwordXNpbmcgYW5kcm9pZDo6Y29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKK3VzaW5nIGJpbmRlcjo6U3RhdHVzOwogCiBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlOjpBQXVkaW9TZXJ2aWNlKCkKLSAgICA6IEJuQUF1ZGlvU2VydmljZSgpIHsKLSAgICBtQXVkaW9DbGllbnQuY2xpZW50VWlkID0gZ2V0dWlkKCk7ICAgLy8gVE9ETyBjb25zaWRlciB1c2luZyBnZXRldWlkKCkKLSAgICBtQXVkaW9DbGllbnQuY2xpZW50UGlkID0gZ2V0cGlkKCk7Ci0gICAgbUF1ZGlvQ2xpZW50LnBhY2thZ2VOYW1lID0gU3RyaW5nMTYoIiIpOworICAgIDogQm5BQXVkaW9TZXJ2aWNlKCksCisgICAgICBtQWRhcHRlcih0aGlzKSB7CisgICAgLy8gVE9ETyBjb25zaWRlciB1c2luZyBnZXRldWlkKCkKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICBtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgIG1BdWRpb0NsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTChsZWdhY3kyYWlkbF9waWRfdF9pbnQzMl90KGdldHBpZCgpKSk7CisgICAgbUF1ZGlvQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnBhY2thZ2VOYW1lID0gc3RkOjpudWxsb3B0OworICAgIG1BdWRpb0NsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS5hdHRyaWJ1dGlvblRhZyA9IHN0ZDo6bnVsbG9wdDsKICAgICBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLnNldEFBdWRpb1NlcnZpY2UodGhpcyk7CiB9CiAKLUFBdWRpb1NlcnZpY2U6On5BQXVkaW9TZXJ2aWNlKCkgewotfQotCiBzdGF0dXNfdCBBQXVkaW9TZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKIApAQCAtNzIsMTggKzgyLDIxIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEFBdWRpb1NlcnZpY2U6OnJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpIHsKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckNsaWVudChjb25zdCBzcDxJQUF1ZGlvQ2xpZW50PiAmY2xpZW50KSB7CiAgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnQocGlkLCBjbGllbnQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKLWJvb2wgQUF1ZGlvU2VydmljZTo6aXNDYWxsZXJJblNlcnZpY2UoKSB7Ci0gICAgcmV0dXJuIG1BdWRpb0NsaWVudC5jbGllbnRQaWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICYmCi0gICAgICAgIG1BdWRpb0NsaWVudC5jbGllbnRVaWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQorU3RhdHVzCitBQXVkaW9TZXJ2aWNlOjpvcGVuU3RyZWFtKGNvbnN0IFN0cmVhbVJlcXVlc3QgJl9yZXF1ZXN0LCBTdHJlYW1QYXJhbWV0ZXJzKiBfcGFyYW1zT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKIAotYWF1ZGlvX2hhbmRsZV90IEFBdWRpb1NlcnZpY2U6Om9wZW5TdHJlYW0oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7CisgICAgLy8gQ3JlYXRlIHdyYXBwZXIgb2JqZWN0cyBmb3Igc2ltcGxlIHVzYWdlIG9mIHRoZSBwYXJjZWxhYmxlcy4KKyAgICBjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0IHJlcXVlc3QoX3JlcXVlc3QpOworICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gcGFyYW1zT3V0OworCiAgICAgLy8gQSBsb2NrIGluIGlzIHVzZWQgdG8gb3JkZXIgdGhlIG9wZW5pbmcgb2YgZW5kcG9pbnRzIHdoZW4gYW4KICAgICAvLyBFWENMVVNJVkUgZW5kcG9pbnQgaXMgc3RvbGVuLiBXZSB3YW50IHRoZSBvcmRlciB0byBiZToKICAgICAvLyAxKSBUaHJlYWQgQSBvcGVucyBleGNsdXNpdmUgTU1BUCBlbmRwb2ludApAQCAtMTAyLDIzICsxMTUsMjkgQEAKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUgPSBjb25maWd1cmF0aW9uSW5wdXQuZ2V0U2hhcmluZ01vZGUoKTsKIAogICAgIC8vIEVuZm9yY2UgbGltaXQgb24gY2xpZW50IHByb2Nlc3Nlcy4KLSAgICBwaWRfdCBwaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgIGlmIChwaWQgIT0gbUF1ZGlvQ2xpZW50LmNsaWVudFBpZCkgeworICAgIEF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2UgPSByZXF1ZXN0LmdldEF0dHJpYnV0aW9uU291cmNlKCk7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGF0dHJpYnV0aW9uU291cmNlLnBpZCA9IFZBTFVFX09SX1JFVFVSTl9JTExFR0FMX0FSR19TVEFUVVMoCisgICAgICAgIGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QocGlkKSk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfUkVUVVJOX0lMTEVHQUxfQVJHX1NUQVRVUygKKyAgICAgICAgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKTsKKyAgICBhdHRyaWJ1dGlvblNvdXJjZS50b2tlbiA9IHNwPEJCaW5kZXI+OjptYWtlKCk7CisgICAgaWYgKGF0dHJpYnV0aW9uU291cmNlLnBpZCAhPSBtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkKSB7CiAgICAgICAgIGludDMyX3QgY291bnQgPSBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLmdldFN0cmVhbUNvdW50KHBpZCk7CiAgICAgICAgIGlmIChjb3VudCA+PSBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUykgewogICAgICAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZXhjZWVkZWQgbWF4IHN0cmVhbXMgcGVyIHByb2Nlc3MgJWQgPj0gJWQiLAogICAgICAgICAgICAgICAgICAgY291bnQsICBNQVhfU1RSRUFNU19QRVJfUFJPQ0VTUyk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOworICAgICAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSAmJiBzaGFyaW5nTW9kZSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgewogICAgICAgICBBTE9HRSgib3BlblN0cmVhbSgpOiB1bnJlY29nbml6ZWQgc2hhcmluZyBtb2RlID0gJWQiLCBzaGFyaW5nTW9kZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQpOwogICAgIH0KIAogICAgIGlmIChzaGFyaW5nTW9kZSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRQotICAgICAgICAmJiBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLmlzRXhjbHVzaXZlRW5hYmxlZChyZXF1ZXN0LmdldFByb2Nlc3NJZCgpKSkgeworICAgICAgICAmJiBBQXVkaW9DbGllbnRUcmFja2VyOjpnZXRJbnN0YW5jZSgpLmlzRXhjbHVzaXZlRW5hYmxlZChwaWQpKSB7CiAgICAgICAgIC8vIG9ubHkgdHJ1c3QgYXVkaW9zZXJ2ZXIgZm9yIGluIHNlcnZpY2UgaW5kaWNhdGlvbgogICAgICAgICBib29sIGluU2VydmljZSA9IGZhbHNlOwogICAgICAgICBpZiAoaXNDYWxsZXJJblNlcnZpY2UoKSkgewpAQCAtMTQ3LDI5ICsxNjYsMTI1IEBACiAKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBzZXJ2aWNlU3RyZWFtLmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIEFJRExfUkVUVVJOKHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKLSAgICAgICAgY29uZmlndXJhdGlvbk91dHB1dC5jb3B5RnJvbSgqc2VydmljZVN0cmVhbSk7CisgICAgICAgIHBhcmFtc091dC5jb3B5RnJvbSgqc2VydmljZVN0cmVhbSk7CisgICAgICAgICpfcGFyYW1zT3V0ID0gc3RkOjptb3ZlKHBhcmFtc091dCkucGFyY2VsYWJsZSgpOwogICAgICAgICAvLyBMb2cgb3BlbiBpbiBNZWRpYU1ldHJpY3MgYWZ0ZXIgd2UgaGF2ZSB0aGUgaGFuZGxlIGJlY2F1c2Ugd2UgbmVlZCB0aGUgaGFuZGxlIHRvCiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgbWV0cmljcyBJRC4KICAgICAgICAgc2VydmljZVN0cmVhbS0+bG9nT3BlbihoYW5kbGUpOwogICAgICAgICBBTE9HVigiJXMoKTogcmV0dXJuIGhhbmRsZSA9IDB4JTA4WCIsIF9fZnVuY19fLCBoYW5kbGUpOwotICAgICAgICByZXR1cm4gaGFuZGxlOworICAgICAgICBBSURMX1JFVFVSTihoYW5kbGUpOwogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpjbG9zZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKICAgICAvLyBDaGVjayBwZXJtaXNzaW9uIGFuZCBvd25lcnNoaXAgZmlyc3QuCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiY2xvc2VTdHJlYW0oMHglMHgpLCBpbGxlZ2FsIHN0cmVhbSBoYW5kbGUiLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOworICAgICAgICBBSURMX1JFVFVSTihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOwogICAgIH0KLSAgICByZXR1cm4gY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbSk7CisgICAgQUlETF9SRVRVUk4oY2xvc2VTdHJlYW0oc2VydmljZVN0cmVhbSkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oaW50MzJfdCBzdHJlYW1IYW5kbGUsIEVuZHBvaW50KiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImdldFN0cmVhbURlc2NyaXB0aW9uKCksIGlsbGVnYWwgc3RyZWFtIGhhbmRsZSA9IDB4JTB4Iiwgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgZW5kcG9pbnRQYXJjZWxhYmxlOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5nZXREZXNjcmlwdGlvbihlbmRwb2ludFBhcmNlbGFibGUpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgICplbmRwb2ludCA9IHN0ZDo6bW92ZShlbmRwb2ludFBhcmNlbGFibGUpLnBhcmNlbGFibGUoKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4ocmVzdWx0KTsKK30KKworU3RhdHVzIEFBdWRpb1NlcnZpY2U6OnN0YXJ0U3RyZWFtKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpwYXVzZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPnBhdXNlKCkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPnN0b3AoKSk7Cit9CisKK1N0YXR1cyBBQXVkaW9TZXJ2aWNlOjpmbHVzaFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCAqX2FpZGxfcmV0dXJuKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWVfdjxhYXVkaW9fcmVzdWx0X3QsIHN0ZDo6ZGVjYXlfdDx0eXBlb2YoKl9haWRsX3JldHVybik+Pik7CisKKyAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKKyAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFJRExfUkVUVVJOKEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRSk7CisgICAgfQorICAgIEFJRExfUkVUVVJOKHNlcnZpY2VTdHJlYW0tPmZsdXNoKCkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6cmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKl9haWRsX3JldHVybikgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8YWF1ZGlvX3Jlc3VsdF90LCBzdGQ6OmRlY2F5X3Q8dHlwZW9mKCpfYWlkbF9yZXR1cm4pPj4pOworCisgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7CisgICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOworICAgICAgICBBSURMX1JFVFVSTihBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOworICAgIH0KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gaXNDYWxsZXJJblNlcnZpY2UoKQorICAgICAgICA/IGtSZWFsVGltZUF1ZGlvUHJpb3JpdHlTZXJ2aWNlIDoga1JlYWxUaW1lQXVkaW9Qcmlvcml0eUNsaWVudDsKKyAgICBBSURMX1JFVFVSTihzZXJ2aWNlU3RyZWFtLT5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkLCBwcmlvcml0eSkpOworfQorCitTdGF0dXMgQUF1ZGlvU2VydmljZTo6dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90IGNsaWVudFRocmVhZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpfYWlkbF9yZXR1cm4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZV92PGFhdWRpb19yZXN1bHRfdCwgc3RkOjpkZWNheV90PHR5cGVvZigqX2FpZGxfcmV0dXJuKT4+KTsKKworICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOworICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKKyAgICAgICAgQUlETF9SRVRVUk4oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICB9CisgICAgQUlETF9SRVRVUk4oc2VydmljZVN0cmVhbS0+dW5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkKSk7Cit9CisKK2Jvb2wgQUF1ZGlvU2VydmljZTo6aXNDYWxsZXJJblNlcnZpY2UoKSB7CisgICAgcGlkX3QgY2xpZW50UGlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF9waWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CisgICAgdWlkX3QgY2xpZW50VWlkID0gVkFMVUVfT1JfRkFUQUwoYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CisgICAgcmV0dXJuIGNsaWVudFBpZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkgJiYKKyAgICAgICAgY2xpZW50VWlkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OmNsb3NlU3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7CkBAIC0xOTIsOSArMzA3LDExIEBACiAgICAgICAgIC8vIE9ubHkgYWxsb3cgb3duZXIgb3IgdGhlIGFhdWRpbyBzZXJ2aWNlIHRvIGFjY2VzcyB0aGUgc3RyZWFtLgogICAgICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVXNlcklkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICBjb25zdCB1aWRfdCBvd25lclVzZXJJZCA9IHNlcnZpY2VTdHJlYW0tPmdldE93bmVyVXNlcklkKCk7CisgICAgICAgIGNvbnN0IHVpZF90IGNsaWVudFVpZCA9IFZBTFVFX09SX0ZBVEFMKAorICAgICAgICAgICAgYWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdChtQXVkaW9DbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkKSk7CiAgICAgICAgIGJvb2wgY2FsbGVyT3duc0l0ID0gY2FsbGluZ1VzZXJJZCA9PSBvd25lclVzZXJJZDsKLSAgICAgICAgYm9vbCBzZXJ2ZXJDYWxsaW5nID0gY2FsbGluZ1VzZXJJZCA9PSBtQXVkaW9DbGllbnQuY2xpZW50VWlkOwotICAgICAgICBib29sIHNlcnZlck93bnNJdCA9IG93bmVyVXNlcklkID09IG1BdWRpb0NsaWVudC5jbGllbnRVaWQ7CisgICAgICAgIGJvb2wgc2VydmVyQ2FsbGluZyA9IGNhbGxpbmdVc2VySWQgPT0gY2xpZW50VWlkOworICAgICAgICBib29sIHNlcnZlck93bnNJdCA9IG93bmVyVXNlcklkID09IGNsaWVudFVpZDsKICAgICAgICAgYm9vbCBhbGxvd2VkID0gY2FsbGVyT3duc0l0IHx8IHNlcnZlckNhbGxpbmcgfHwgc2VydmVyT3duc0l0OwogICAgICAgICBpZiAoIWFsbG93ZWQpIHsKICAgICAgICAgICAgIEFMT0dFKCJBQXVkaW9TZXJ2aWNlOiBjYWxsaW5nIHVpZCAlZCBjYW5ub3QgYWNjZXNzIHN0cmVhbSAweCUwOFggb3duZWQgYnkgJWQiLApAQCAtMjA1LDc2ICszMjIsNiBAQAogICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Z2V0U3RyZWFtRGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZ2V0U3RyZWFtRGVzY3JpcHRpb24oKSwgaWxsZWdhbCBzdHJlYW0gaGFuZGxlID0gMHglMHgiLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+Z2V0RGVzY3JpcHRpb24ocGFyY2VsYWJsZSk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RhcnQoKTsKLX0KLQotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2U6OnBhdXNlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5wYXVzZSgpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RvcFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7Ci0gICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNlcnZpY2VTdHJlYW0gPSBjb252ZXJ0SGFuZGxlVG9TZXJ2aWNlU3RyZWFtKHN0cmVhbUhhbmRsZSk7Ci0gICAgaWYgKHNlcnZpY2VTdHJlYW0uZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygiJXMoKSwgaW52YWxpZCBzdHJlYW1IYW5kbGUgPSAweCUweCIsIF9fZnVuY19fLCBzdHJlYW1IYW5kbGUpOwotICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFOwotICAgIH0KLSAgICByZXR1cm4gc2VydmljZVN0cmVhbS0+c3RvcCgpOwotfQotCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6Zmx1c2hTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgewotICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtID0gY29udmVydEhhbmRsZVRvU2VydmljZVN0cmVhbShzdHJlYW1IYW5kbGUpOwotICAgIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1coIiVzKCksIGludmFsaWQgc3RyZWFtSGFuZGxlID0gMHglMHgiLCBfX2Z1bmNfXywgc3RyZWFtSGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0hBTkRMRTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlcnZpY2VTdHJlYW0tPmZsdXNoKCk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjpyZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogcGVyaW9kTmFub3NlY29uZHMgKi8pIHsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIGludDMyX3QgcHJpb3JpdHkgPSBpc0NhbGxlckluU2VydmljZSgpCi0gICAgICAgID8ga1JlYWxUaW1lQXVkaW9Qcmlvcml0eVNlcnZpY2UgOiBrUmVhbFRpbWVBdWRpb1ByaW9yaXR5Q2xpZW50OwotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT5yZWdpc3RlckF1ZGlvVGhyZWFkKGNsaWVudFRocmVhZElkLCBwcmlvcml0eSk7Ci19Ci0KLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlOjp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKLSAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSA9IGNvbnZlcnRIYW5kbGVUb1NlcnZpY2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKLSAgICBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpLCBpbnZhbGlkIHN0cmVhbUhhbmRsZSA9IDB4JTB4IiwgX19mdW5jX18sIHN0cmVhbUhhbmRsZSk7Ci0gICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEU7Ci0gICAgfQotICAgIHJldHVybiBzZXJ2aWNlU3RyZWFtLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoY2xpZW50VGhyZWFkSWQpOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZTo6c3RhcnRDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuaAppbmRleCBjYWY0OGE1Li43YzFiNzk2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5oCkBAIC0yNCw2OSArMjQsNzEgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9CbkFBdWRpb1NlcnZpY2UuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvQ29tbW9uLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJBZGFwdGVyLmgiCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCIKICNpbmNsdWRlICJBQXVkaW9TdHJlYW1UcmFja2VyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorI2RlZmluZSBBQVVESU9fU0VSVklDRV9OQU1FICAibWVkaWEuYWF1ZGlvIgorCiBjbGFzcyBBQXVkaW9TZXJ2aWNlIDoKICAgICBwdWJsaWMgQmluZGVyU2VydmljZTxBQXVkaW9TZXJ2aWNlPiwKLSAgICBwdWJsaWMgQm5BQXVkaW9TZXJ2aWNlLAotICAgIHB1YmxpYyBhYXVkaW86OkFBdWRpb1NlcnZpY2VJbnRlcmZhY2UKKyAgICBwdWJsaWMgYWF1ZGlvOjpCbkFBdWRpb1NlcnZpY2UKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxBQXVkaW9TZXJ2aWNlPjsKIAogcHVibGljOgogICAgIEFBdWRpb1NlcnZpY2UoKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZSgpID0gZGVmYXVsdDsKKworICAgIGFhdWRpbzo6QUF1ZGlvU2VydmljZUludGVyZmFjZSYgYXNBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCkgeworICAgICAgICByZXR1cm4gbUFkYXB0ZXI7CisgICAgfQogCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldFNlcnZpY2VOYW1lKCkgeyByZXR1cm4gQUFVRElPX1NFUlZJQ0VfTkFNRTsgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCk7CisgICAgYmluZGVyOjpTdGF0dXMgcmVnaXN0ZXJDbGllbnQoY29uc3QgOjphbmRyb2lkOjpzcDw6OmFhdWRpbzo6SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBvcGVuU3RyZWFtKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpbzo6QUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbk91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIG9wZW5TdHJlYW0oY29uc3QgOjphYXVkaW86OlN0cmVhbVJlcXVlc3QmIHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OmFhdWRpbzo6U3RyZWFtUGFyYW1ldGVycyogcGFyYW1zT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIC8qCi0gICAgICogVGhpcyBpcyBjYWxsZWQgZnJvbSBCaW5kZXIuIEl0IGNoZWNrcyBmb3IgcGVybWlzc2lvbnMKLSAgICAgKiBhbmQgY29udmVydHMgdGhlIGhhbmRsZSBwYXNzZWQgdGhyb3VnaCBCaW5kZXIgdG8gYSBzdHJlYW0gcG9pbnRlci4KLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgY2xvc2VTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjbG9zZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBnZXRTdHJlYW1EZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICBhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCi0gICAgICAgICAgICAgICAgYWF1ZGlvOjpBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMKKyAgICBnZXRTdHJlYW1EZXNjcmlwdGlvbihpbnQzMl90IHN0cmVhbUhhbmRsZSwgOjphYXVkaW86OkVuZHBvaW50KiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc3RhcnRTdHJlYW0oaW50MzJfdCBzdHJlYW1IYW5kbGUsIGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VTdHJlYW0oYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKyAgICBiaW5kZXI6OlN0YXR1cyBwYXVzZVN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMgc3RvcFN0cmVhbShpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaFN0cmVhbShhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIGZsdXNoU3RyZWFtKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgb3ZlcnJpZGU7CisgICAgYmluZGVyOjpTdGF0dXMKKyAgICByZWdpc3RlckF1ZGlvVGhyZWFkKGludDMyX3Qgc3RyZWFtSGFuZGxlLCBpbnQzMl90IGNsaWVudFRocmVhZElkLCBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQpIG92ZXJyaWRlOworICAgIGJpbmRlcjo6U3RhdHVzIHVucmVnaXN0ZXJBdWRpb1RocmVhZChpbnQzMl90IHN0cmVhbUhhbmRsZSwgaW50MzJfdCBjbGllbnRUaHJlYWRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wQ2xpZW50KGFhdWRpbzo6YWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgY2xpZW50SGFuZGxlKTsKIAogIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAvLyBUaGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzIGFyZSBvbmx5IGNhbGxlZCBmcm9tIHRoZSBzZXJ2aWNlIGFuZCBOT1QgYnkgQmluZGVyLgpAQCAtMTAxLDYgKzEwMywyOSBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZVN0cmVhbShzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKTsKIAogcHJpdmF0ZToKKyAgICBjbGFzcyBBZGFwdGVyIDogcHVibGljIGFhdWRpbzo6QUF1ZGlvQmluZGVyQWRhcHRlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBZGFwdGVyKEFBdWRpb1NlcnZpY2UgKnNlcnZpY2UpCisgICAgICAgICAgICAgICAgOiBhYXVkaW86OkFBdWRpb0JpbmRlckFkYXB0ZXIoc2VydmljZSksCisgICAgICAgICAgICAgICAgICBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChhYXVkaW86OmFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCAmY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gbVNlcnZpY2UtPnN0YXJ0Q2xpZW50KHN0cmVhbUhhbmRsZSwgY2xpZW50LCBhdHRyLCBjbGllbnRIYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvOjphYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1TZXJ2aWNlLT5zdG9wQ2xpZW50KHN0cmVhbUhhbmRsZSwgY2xpZW50SGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgQUF1ZGlvU2VydmljZSogY29uc3QgbVNlcnZpY2U7CisgICAgfTsKKworICAgIEFkYXB0ZXIgbUFkYXB0ZXI7CiAKICAgICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSBjbGllbnQgaXMgdGhlIGF1ZGlvc2VydmVyCiAgICAgICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAppbmRleCBjZWVmZTkzLi4xM2RkM2QzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKQEAgLTM4LDcgKzM4LDExIEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLXN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKK0FBdWRpb1NlcnZpY2VFbmRwb2ludDo6fkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpIHsKKyAgICBBTE9HRCgiJXMoKSBjYWxsZWQiLCBfX2Z1bmNfXyk7Cit9CisKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IE5PX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMgewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKIAogICAgIGNvbnN0IGJvb2wgaXNMb2NrZWQgPSBBQXVkaW9fdHJ5VW50aWxUcnVlKApAQCAtMTgyLDExICsxODYsMTIgQEAKICAgICAgICAgICAgIDogQVVESU9fU09VUkNFX0RFRkFVTFQ7CiAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzOwogICAgIGlmIChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfYWxsb3dDYXB0dXJlUG9saWN5VG9BdWRpb0ZsYWdzTWFzayhwYXJhbXMtPmdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworICAgICAgICBmbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4oQVVESU9fRkxBR19MT1dfTEFURU5DWQorICAgICAgICAgICAgICAgIHwgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZCi0gICAgICAgICAgICB8IEFBdWRpb0NvbnZlcnRfcHJpdmFjeVNlbnNpdGl2ZVRvQXVkaW9GbGFnc01hc2socGFyYW1zLT5pc1ByaXZhY3lTZW5zaXRpdmUoKSk7CisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihBVURJT19GTEFHX0xPV19MQVRFTkNZCisgICAgICAgICAgICAgICAgfCBBQXVkaW9Db252ZXJ0X3ByaXZhY3lTZW5zaXRpdmVUb0F1ZGlvRmxhZ3NNYXNrKHBhcmFtcy0+aXNQcml2YWN5U2Vuc2l0aXZlKCkpKTsKICAgICB9CiAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKaW5kZXggYTE3MWNiMC4uYTdmNjNkMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmgKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgogI2luY2x1ZGUgImNvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oIgpAQCAtNDEsMTMgKzQzLDE3IEBACiAgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgogCi0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOwogCiAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgPSAwOwogCi0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2UoKSA9IDA7CisgICAgLyoKKyAgICAgKiBQZXJmb3JtIGFueSBjbGVhbnVwIG5lY2Vzc2FyeSBiZWZvcmUgZGVsZXRpbmcgdGhlIHN0cmVhbS4KKyAgICAgKiBUaGlzIG1pZ2h0IGluY2x1ZGUgcmVsZWFzaW5nIGFuZCBjbG9zaW5nIGludGVybmFsIHN0cmVhbXMuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyU3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0pOwogCkBAIC0xMzcsNyArMTQzLDggQEAKICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IGRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogCiAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgIG1Mb2NrU3RyZWFtczsKLSAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtczsKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4+IG1SZWdpc3RlcmVkU3RyZWFtcworICAgICAgICAgICAgR1VBUkRFRF9CWShtTG9ja1N0cmVhbXMpOwogCiAgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcDsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAppbmRleCAzN2QxMDViLi5iYzc2OWYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcApAQCAtMzUsMjIgKzM1LDE3IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiB1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOyAgIC8vIFRPRE8ganVzdCBpbXBvcnQgbmFtZXMgbmVlZGVkCiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6OkFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoQUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKQotICAgICAgICA6IG1TdHJlYW1JbnRlcm5hbENhcHR1cmUoYXVkaW9TZXJ2aWNlLCB0cnVlKSB7Ci0gICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbENhcHR1cmU7Ci19Ci0KLUFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmU6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKCkgewotICAgIGRlbGV0ZSBtRGlzdHJpYnV0aW9uQnVmZmVyOworQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZTo6QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZShBQXVkaW9TZXJ2aWNlJiBhdWRpb1NlcnZpY2UpCisgICAgICAgIDogQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkKAorICAgICAgICAgICAgICAgIG5ldyBBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZShhdWRpb1NlcnZpY2UuYXNBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCksIHRydWUpKSB7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKLSAgICAgICAgZGVsZXRlIG1EaXN0cmlidXRpb25CdWZmZXI7CiAgICAgICAgIGludCBkaXN0cmlidXRpb25CdWZmZXJTaXplQnl0ZXMgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNQZXJCdXJzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGdldFN0cmVhbUludGVybmFsKCktPmdldEJ5dGVzUGVyRnJhbWUoKTsKLSAgICAgICAgbURpc3RyaWJ1dGlvbkJ1ZmZlciA9IG5ldyB1aW50OF90W2Rpc3RyaWJ1dGlvbkJ1ZmZlclNpemVCeXRlc107CisgICAgICAgIG1EaXN0cmlidXRpb25CdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPHVpbnQ4X3RbXT4oZGlzdHJpYnV0aW9uQnVmZmVyU2l6ZUJ5dGVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTY3LDkgKzYyLDEyIEBACiAgICAgICAgIGludDY0X3QgbW1hcEZyYW1lc1JlYWQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNSZWFkKCk7CiAKICAgICAgICAgLy8gUmVhZCBhdWRpbyBkYXRhIGZyb20gc3RyZWFtIHVzaW5nIGEgYmxvY2tpbmcgcmVhZC4KLSAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVhZChtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOworICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZWFkKG1EaXN0cmlidXRpb25CdWZmZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSwgdGltZW91dE5hbm9zKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpIHJlYWQoKSByZXR1cm5lZCBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEIiwgX19mdW5jX18pOworICAgICAgICAgICAgLy8gV2UgZG8gbm90IG5lZWQgdGhlIHJldHVybmVkIHZlY3Rvci4KKyAgICAgICAgICAgICh2b2lkKSBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJjYWxsYmFja0xvb3AoKSByZWFkICVkIC8gJWQiLApAQCAtNzksNDggKzc3LDE0IEBACiAKICAgICAgICAgLy8gRGlzdHJpYnV0ZSBkYXRhIHRvIGVhY2ggYWN0aXZlIHN0cmVhbS4KICAgICAgICAgeyAvLyBicmFja2V0cyBhcmUgZm9yIGxvY2tfZ3VhcmQKLQogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewogICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpICYmICFjbGllbnRTdHJlYW0tPmlzU3VzcGVuZGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKLQogICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkPiBzdHJlYW1TaGFyZWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQgKj4oY2xpZW50U3RyZWFtLmdldCgpKTsKLQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIHRoZSBBdWRpb0ZpZm8gdG8gcHJvdGVjdCBhZ2FpbnN0IGNsb3NlLgotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhUXVldWVMb2NrKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWZvQnVmZmVyICpmaWZvID0gc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvICE9IG51bGxwdHIpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBvZmZzZXQgYmV0d2VlbiBmcmFtZVBvc2l0aW9uIGluIGNsaWVudCdzIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEZyYW1lc1dyaXR0ZW4gPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIGluZGljZXMgdGhhdCByZWZlciB0byB0aGUgc2FtZSBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1JlYWQgLSBjbGllbnRGcmFtZXNXcml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5pbmNyZW1lbnRYUnVuQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWZvLT53cml0ZShtRGlzdHJpYnV0aW9uQnVmZmVyLCBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50RnJhbWVzV3JpdHRlbiA9IGZpZm8tPmdldFdyaXRlQ291bnRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudEZyYW1lc1dyaXR0ZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCByZXByZXNlbnRzIHRoZSBjb21wbGV0aW9uIG9mIGRhdGEgYmVpbmcgd3JpdHRlbiBpbnRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGJ1ZmZlci4gSXQgaXMgc2VudCB0byB0aGUgY2xpZW50IGFuZCB1c2VkIGluIHRoZSB0aW1pbmcgbW9kZWwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRlY2lkZSB3aGVuIGRhdGEgd2lsbCBiZSBhdmFpbGFibGUgdG8gcmVhZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoY2xpZW50RnJhbWVzV3JpdHRlbiwgQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPm1hcmtUcmFuc2ZlclRpbWUodGltZXN0YW1wKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+d3JpdGVEYXRhSWZSb29tKG1tYXBGcmFtZXNSZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGlzdHJpYnV0aW9uQnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuaAppbmRleCA5NzFkYTlhLi4yY2E0M2NmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIEFBVURJT19TRVJWSUNFX0VORFBPSU5UX0NBUFRVUkVfSAogI2RlZmluZSBBQVVESU9fU0VSVklDRV9FTkRQT0lOVF9DQVBUVVJFX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmgiCiAKQEAgLTI4LDE2ICszMCwxNCBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlKCk7CisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZSgpID0gZGVmYXVsdDsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgb3ZlcnJpZGU7CiAKLQogICAgIHZvaWQgKmNhbGxiYWNrTG9vcCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlICBtU3RyZWFtSW50ZXJuYWxDYXB0dXJlOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAgICptRGlzdHJpYnV0aW9uQnVmZmVyID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiAgbURpc3RyaWJ1dGlvbkJ1ZmZlcjsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCAwODQzZTBiLi5hMDgwOThjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtNTEsOCArNTEsNiBAQAogICAgICAgICA6IG1NbWFwU3RyZWFtKG51bGxwdHIpCiAgICAgICAgICwgbUFBdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7fQogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjp+QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCgpIHt9Ci0KIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogCkBAIC03MiwyNCArNzAsNTQgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBjb3B5RnJvbShyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpKTsKKyAgICBtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZSA9IHJlcXVlc3QuZ2V0QXR0cmlidXRpb25Tb3VyY2UoKTsKKyAgICAvLyBUT0RPIGIvMTgyMzkyNzY5OiB1c2UgYXR0cmlidXRpb24gc291cmNlIHV0aWwKKyAgICBtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS51aWQgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgbGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKTsKKyAgICBtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS5waWQgPSBWQUxVRV9PUl9GQVRBTCgKKyAgICAgICAgbGVnYWN5MmFpZGxfcGlkX3RfaW50MzJfdChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpKTsKKworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisKKyAgICAvLyBGTE9BVCBpcyBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IHRoZSBIQUwgc28gYXNrIGZvciBhIDMyLWJpdC4KKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGVzZSBsb2dzIHdoZW4gZmluaXNoZWQgZGVidWdnaW5nLgorICAgICAgICBBTE9HRCgiJXMoKSBjaGFuZ2UgZm9ybWF0IGZyb20gJWQgdG8gMzJfQklUIiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKKyAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHJldHVybiByZXN1bHQ7CisKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSAmJiBhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzMyX0JJVCkgeworICAgICAgICBBTE9HRCgiJXMoKSAzMl9CSVQgZmFpbGVkLCBwZXJoYXBzIGR1ZSB0byBmb3JtYXQuIFRyeSBhZ2FpbiB3aXRoIDI0X0JJVF9QQUNLRUQiLCBfX2Z1bmNfXyk7CisgICAgICAgIGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOworICAgICAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OworCisgICAgLy8gVE9ETyBUaGUgSEFMIGFuZCBBdWRpb0ZsaW5nZXIgc2hvdWxkIGJlIHJlY29tbWVuZGluZyBhIGZvcm1hdCBpZiB0aGUgb3BlbiBmYWlscy4KKyAgICAvLyAgICAgIEJ1dCB0aGF0IHJlY29tbWVuZGF0aW9uIGlzIG5vdCBwcm9wYWdhdGluZyBiYWNrIGZyb20gdGhlIEhBTC4KKyAgICAvLyAgICAgIFNvIGZvciBub3cganVzdCB0cnkgc29tZXRoaW5nIHZlcnkgbGlrZWx5IHRvIHdvcmsuCisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUgJiYgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEKSB7CisgICAgICAgIEFMT0dEKCIlcygpIDI0X0JJVCBmYWlsZWQsIHBlcmhhcHMgZHVlIHRvIGZvcm1hdC4gVHJ5IGFnYWluIHdpdGggMTZfQklUIiwgX19mdW5jX18pOworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICByZXN1bHQgPSBvcGVuV2l0aEZvcm1hdChhdWRpb0Zvcm1hdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvcGVuV2l0aEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKIAotICAgIGNvcHlGcm9tKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkpOwotCiAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBnZXRBdWRpb0F0dHJpYnV0ZXNGcm9tKHRoaXMpOwogCi0gICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKLSAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwotICAgIG1NbWFwQ2xpZW50LnBhY2thZ2VOYW1lLnNldFRvKFN0cmluZzE2KCIiKSk7Ci0KICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAKICAgICAvLyBGaWxsIGluIGNvbmZpZwotICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7Ci0gICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUIHx8IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICB9CiAgICAgY29uZmlnLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OwogCiAgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOwpAQCAtMTM3LDggKzE2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgLy8gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTW1hcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBvcnRIYW5kbGUpOwotICAgIEFMT0dEKCIlcygpIG1NYXBDbGllbnQudWlkID0gJWQsIHBpZCA9ICVkID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKLSAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuY2xpZW50VWlkLCAgbU1tYXBDbGllbnQuY2xpZW50UGlkLCBtUG9ydEhhbmRsZSk7CisgICAgQUxPR0QoIiVzKCkgbU1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZSA9ICVzID0+IHBvcnRIYW5kbGUgPSAlZFxuIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudG9TdHJpbmcoKS5jX3N0cigpLCBtUG9ydEhhbmRsZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHJlc291cmNlIGlzIGJ1c3kgb3IgdGhlIGNvbmZpZyBkb2VzCiAgICAgICAgIC8vIG5vdCBtYXRjaCB0aGUgaGFyZHdhcmUuCkBAIC0xODYsOCArMjE0LDkgQEAKICAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKICAgICBpZiAoIWlzQnVmZmVyU2hhcmVhYmxlKSB7CiAgICAgICAgIC8vIEV4Y2x1c2l2ZSBtb2RlIGNhbiBvbmx5IGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UgYmVjYXVzZSB0aGUgRkQgY2Fubm90IGJlIHNoYXJlZC4KLSAgICAgICAgdWlkX3QgYXVkaW9TZXJ2aWNlVWlkID0gZ2V0dWlkKCk7Ci0gICAgICAgIGlmICgobU1tYXBDbGllbnQuY2xpZW50VWlkICE9IGF1ZGlvU2VydmljZVVpZCkgJiYKKyAgICAgICAgaW50MzJfdCBhdWRpb1NlcnZpY2VVaWQgPQorICAgICAgICAgICAgVkFMVUVfT1JfRkFUQUwobGVnYWN5MmFpZGxfdWlkX3RfaW50MzJfdChnZXR1aWQoKSkpOworICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmF0dHJpYnV0aW9uU291cmNlLnVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCiAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CiAgICAgICAgICAgICBBTE9HVygiJXMoKSAtIGV4Y2x1c2l2ZSBGRCBjYW5ub3QgYmUgdXNlZCBieSBjbGllbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CkBAIC0yMDgsNiArMjM3LDEyIEBACiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CisgICAgLy8gQ2FsbCB0byBIQUwgdG8gbWFrZSBzdXJlIHRoZSB0cmFuc3BvcnQgRkQgd2FzIGFibGUgdG8gYmUgY2xvc2VkIGJ5IGJpbmRlci4KKyAgICAvLyBUaGlzIGlzIGEgdHJpY2t5IHdvcmthcm91bmQgZm9yIGEgcHJvYmxlbSBpbiBCaW5kZXIuCisgICAgLy8gVE9ETzpbYi8xOTIwNDg4NDJdIFdoZW4gdGhhdCBwcm9ibGVtIGlzIGZpeGVkIHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSBvciBjaGFuZ2UgdGhpcyBjb2RlLgorICAgIHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uIHBvc2l0aW9uOworICAgIG1NbWFwU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oJnBvc2l0aW9uKTsKKwogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKICAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwpAQCAtMjI2LDcgKzI2MSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgewordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpjbG9zZSgpIHsKICAgICBpZiAobU1tYXBTdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICAvLyBOZWVkcyB0byBiZSBleHBsaWNpdGx5IGNsZWFyZWQgb3IgQ1RTIHdpbGwgZmFpbCBidXQgaXQgaXMgbm90IGNsZWFyIHdoeS4KICAgICAgICAgbU1tYXBTdHJlYW0uY2xlYXIoKTsKQEAgLTIzNSw4ICsyNzAsNiBAQAogICAgICAgICAvLyBGSVhNRSBNYWtlIGNsb3Npbmcgc3luY2hyb25vdXMuCiAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwRm9yTmFub3MoMTAwICogQUFVRElPX05BTk9TX1BFUl9NSUxMSVNFQ09ORCk7CiAgICAgfQotCi0gICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0U3RyZWFtKHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCkBAIC0zMzMsNyArMzY2LDEwIEBACiAvLyBUaGlzIGlzIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIgd2hlbiBpdCB3YW50cyB0byBkZXN0cm95IGEgc3RyZWFtLgogdm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblRlYXJEb3duKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIEFMT0dEKCIlcyhwb3J0SGFuZGxlID0gJWQpIGNhbGxlZCIsIF9fZnVuY19fLCBwb3J0SGFuZGxlKTsKLSAgICBzdGQ6OnRocmVhZCBhc3luY1Rhc2soJkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmhhbmRsZVRlYXJEb3duQXN5bmMsIHRoaXMsIHBvcnRIYW5kbGUpOworICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA+IGhvbGRFbmRwb2ludCh0aGlzKTsKKyAgICBzdGQ6OnRocmVhZCBhc3luY1Rhc2soW2hvbGRFbmRwb2ludCwgcG9ydEhhbmRsZV0oKSB7CisgICAgICAgIGhvbGRFbmRwb2ludC0+aGFuZGxlVGVhckRvd25Bc3luYyhwb3J0SGFuZGxlKTsKKyAgICB9KTsKICAgICBhc3luY1Rhc2suZGV0YWNoKCk7CiB9CiAKQEAgLTM1NCw5ICszOTAsMTEgQEAKICAgICBBTE9HRCgiJXMoKSBjYWxsZWQgd2l0aCBkZXYgJWQsIG9sZCA9ICVkIiwgX19mdW5jX18sIGRldmljZUlkLCBnZXREZXZpY2VJZCgpKTsKICAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBkZXZpY2VJZCkgewogICAgICAgICBpZiAoZ2V0RGV2aWNlSWQoKSAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzdGQ6OnRocmVhZCBhc3luY1Rhc2soW3RoaXMsIGRldmljZUlkXSgpIHsKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CisgICAgICAgICAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBob2xkRW5kcG9pbnQodGhpcyk7CisgICAgICAgICAgICBzdGQ6OnRocmVhZCBhc3luY1Rhc2soW2hvbGRFbmRwb2ludCwgZGV2aWNlSWRdKCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJvblJvdXRpbmdDaGFuZ2VkKCkgYXN5bmNUYXNrIGxhdW5jaGVkIik7CisgICAgICAgICAgICAgICAgaG9sZEVuZHBvaW50LT5kaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKTsKKyAgICAgICAgICAgICAgICBob2xkRW5kcG9pbnQtPnNldERldmljZUlkKGRldmljZUlkKTsKICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgYXN5bmNUYXNrLmRldGFjaCgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzgwLDMgKzQxOCwxOCBAQAogICAgIHBhcmNlbGFibGUubURvd25EYXRhUXVldWVQYXJjZWxhYmxlLnNldENhcGFjaXR5SW5GcmFtZXMoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmdldEV4dGVybmFsUG9zaXRpb24odWludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKQoreworICAgIGlmICghbUV4dGVybmFsUG9zaXRpb25TdXBwb3J0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Z2V0RXh0ZXJuYWxQb3NpdGlvbihwb3NpdGlvbkZyYW1lcywgdGltZU5hbm9zKTsKKyAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIC8vIGdldEV4dGVybmFsUG9zaXRpb24gaXMgbm90IHN1cHBvcnRlZC4gU2V0IG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkIGFzIGZhbHNlCisgICAgICAgIC8vIHNvIHRoYXQgdGhlIGNhbGwgd2lsbCBub3QgZ28gdG8gdGhlIEhBTCBuZXh0IHRpbWUuCisgICAgICAgIG1FeHRlcm5hbFBvc2l0aW9uU3VwcG9ydGVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5oCmluZGV4IDNkMTA4NjEuLjVhNTM4ODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmgKQEAgLTQ0LDEzICs0NCwxMyBAQAogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKIAotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAoKTsKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQKCkgPSBkZWZhdWx0OwogCiAgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZSgpIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2UoKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIG92ZXJyaWRlOwpAQCAtODUsNyArODUsMTIgQEAKICAgICAgICAgcmV0dXJuIG1IYXJkd2FyZVRpbWVPZmZzZXROYW5vczsKICAgICB9CiAKKyAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RXh0ZXJuYWxQb3NpdGlvbih1aW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcyk7CisKIHByaXZhdGU6CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgb3BlbldpdGhGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpOworCiAgICAgTW9ub3RvbmljQ291bnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RyYW5zZmVycmVkOwogCiAgICAgLy8gSW50ZXJmYWNlIHRvIHRoZSBBdWRpb0ZsaW5nZXIgTU1BUCBzdXBwb3J0LgpAQCAtMTAxLDYgKzEwNiw4IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFyZHdhcmVUaW1lT2Zmc2V0TmFub3MgPSAwOyAvLyBUT0RPIGdldCBmcm9tIEhBTAogCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUV4dGVybmFsUG9zaXRpb25TdXBwb3J0ZWQgPSB0cnVlOworCiB9OwogCiB9IC8qIG5hbWVzcGFjZSBhYXVkaW8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKaW5kZXggYmRhNGI5MC4uNGU0NjAzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAKQEAgLTQxLDEwICs0MSw5IEBACiAKICNkZWZpbmUgQlVSU1RTX1BFUl9CVUZGRVJfREVGQVVMVCAgIDIKIAotQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCi0gICAgICAgIDogbVN0cmVhbUludGVybmFsUGxheShhdWRpb1NlcnZpY2UsIHRydWUpIHsKLSAgICBtU3RyZWFtSW50ZXJuYWwgPSAmbVN0cmVhbUludGVybmFsUGxheTsKLX0KK0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6OkFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoQUF1ZGlvU2VydmljZSYgYXVkaW9TZXJ2aWNlKQorICAgICAgICA6IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCgKKyAgICAgICAgICAgICAgICBuZXcgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkoYXVkaW9TZXJ2aWNlLmFzQUF1ZGlvU2VydmljZUludGVyZmFjZSgpLCB0cnVlKSkge30KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6b3BlbihyZXF1ZXN0KTsKQEAgLTk5LDEwICs5OCwxMSBAQAogCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBMb2NrIHRoZSBBdWRpb0ZpZm8gdG8gcHJvdGVjdCBhZ2FpbnN0IGNsb3NlLgotICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2soc3RyZWFtU2hhcmVkLT5nZXRBdWRpb0RhdGFRdWV1ZUxvY2soKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlmb0J1ZmZlciAqZmlmbyA9IHN0cmVhbVNoYXJlZC0+Z2V0QXVkaW9EYXRhRmlmb0J1ZmZlcl9sKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKHN0cmVhbVNoYXJlZC0+YXVkaW9EYXRhUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNoYXJlZFJpbmdCdWZmZXI+IGF1ZGlvRGF0YVF1ZXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzdHJlYW1TaGFyZWQtPmdldEF1ZGlvRGF0YVF1ZXVlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZm9CdWZmZXI+IGZpZm87CisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0RhdGFRdWV1ZSAmJiAoZmlmbyA9IGF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCkpKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBvZmZzZXQgYmV0d2VlbiBmcmFtZVBvc2l0aW9uIGluIGNsaWVudCdzIHN0cmVhbQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdnMgdGhlIHVuZGVybHlpbmcgTU1BUCBzdHJlYW0uCkBAIC0xNDUsNyArMTQ1LDkgQEAKICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+d3JpdGUobU1peGVyLmdldE91dHB1dEJ1ZmZlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGcmFtZXNQZXJCdXJzdCgpLCB0aW1lb3V0TmFub3MpOwogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CisgICAgICAgICAgICBBTE9HRCgiJXMoKSB3cml0ZSgpIHJldHVybmVkIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgbmVlZCB0aGUgcmV0dXJuZWQgdmVjdG9yLgorICAgICAgICAgICAgKHZvaWQpIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgQUxPR1coImNhbGxiYWNrTG9vcCgpIHdyb3RlICVkIC8gJWQiLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCmluZGV4IDk4MWU0MzAuLjE2MGExZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKQEAgLTQ1LDcgKzQ1LDYgQEAKICAgICB2b2lkICpjYWxsYmFja0xvb3AoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKLSAgICBBdWRpb1N0cmVhbUludGVybmFsUGxheSAgbVN0cmVhbUludGVybmFsUGxheTsgLy8gZm9yIHBsYXlpbmcgb3V0cHV0IG9mIG1peGVyCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5VHVuaW5nRW5hYmxlZCA9IGZhbHNlOyAvLyBUT0RPIGltcGxlbWVudCB0dW5pbmcKICAgICBBQXVkaW9NaXhlciAgICAgICAgICAgICAgbU1peGVyOyAgICAvLwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCmluZGV4IGRjMjE4ODYuLjVmYmNhZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcApAQCAtNDAsNiArNDAsOSBAQAogLy8gVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIGluIGZyYW1lcy4gVGhlIGVmZmVjdGl2ZSBzaXplIGNhbiBiZSB0dW5lZCBzbWFsbGVyIGF0IHJ1bnRpbWUuCiAjZGVmaW5lIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZICAgKDQ4ICogOCkKIAorQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQoQXVkaW9TdHJlYW1JbnRlcm5hbCAqc3RyZWFtSW50ZXJuYWwpCisgICAgOiBtU3RyZWFtSW50ZXJuYWwoc3RyZWFtSW50ZXJuYWwpIHt9CisKIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKQEAgLTg0LDI0ICs4NywzMSBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmNsb3NlKCkgewotICAgIHJldHVybiBnZXRTdHJlYW1JbnRlcm5hbCgpLT5yZWxlYXNlQ2xvc2VGaW5hbCgpOwordm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmNsb3NlKCkgeworICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7CisgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c2FmZVJlbGVhc2VDbG9zZSgpOwogfQogCiAvLyBHbHVlIGJldHdlZW4gQyBhbmQgQysrIGNhbGxiYWNrcy4KIHN0YXRpYyB2b2lkICphYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2Modm9pZCAqYXJnKSB7CiAgICAgYXNzZXJ0KGFyZyAhPSBudWxscHRyKTsKKyAgICBBTE9HRCgiJXMoKSBjYWxsZWQiLCBfX2Z1bmNfXyk7CiAKLSAgICAvLyBUaGUgY2FsbGVyIHBhc3NlZCBpbiBhIHNtYXJ0IHBvaW50ZXIgdG8gcHJldmVudCB0aGUgZW5kcG9pbnQgZnJvbSBnZXR0aW5nIGRlbGV0ZWQKLSAgICAvLyB3aGlsZSB0aGUgdGhyZWFkIHdhcyBsYXVuY2hpbmcuCi0gICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqZW5kcG9pbnRGb3JUaHJlYWQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8QUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkPiAqPihhcmcpOwotICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gZW5kcG9pbnQgPSAqZW5kcG9pbnRGb3JUaHJlYWQ7Ci0gICAgZGVsZXRlIGVuZHBvaW50Rm9yVGhyZWFkOyAvLyBKdXN0IHVzZSBzY29wZWQgc21hcnQgcG9pbnRlci4gRG9uJ3QgbmVlZCB0aGlzIGFueW1vcmUuCisgICAgLy8gUHJldmVudCB0aGUgc3RyZWFtIGZyb20gYmVpbmcgZGVsZXRlZCB3aGlsZSBiZWluZyB1c2VkLgorICAgIC8vIFRoaXMgaXMganVzdCBmb3IgZXh0cmEgc2FmZXR5LiBJdCBpcyBwcm9iYWJseSBub3QgbmVlZGVkIGJlY2F1c2UKKyAgICAvLyB0aGlzIGNhbGxiYWNrIHNob3VsZCBiZSBqb2luZWQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgY2xvc2VkLgorICAgIEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZCAqZW5kcG9pbnRQdHIgPQorICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgKj4oYXJnKTsKKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50KGVuZHBvaW50UHRyKTsKKyAgICAvLyBCYWxhbmNlIHRoZSBpbmNTdHJvbmcoKSBpbiBzdGFydFNoYXJpbmdUaHJlYWRfbCgpLgorICAgIGVuZHBvaW50LT5kZWNTdHJvbmcobnVsbHB0cik7CisKICAgICB2b2lkICpyZXN1bHQgPSBlbmRwb2ludC0+Y2FsbGJhY2tMb29wKCk7CiAgICAgLy8gQ2xvc2Ugbm93IHNvIHRoYXQgdGhlIEhXIHJlc291cmNlIGlzIGZyZWVkIGFuZCB3ZSBjYW4gb3BlbiBhIG5ldyBkZXZpY2UuCiAgICAgaWYgKCFlbmRwb2ludC0+aXNDb25uZWN0ZWQoKSkgewotICAgICAgICBlbmRwb2ludC0+Y2xvc2UoKTsKKyAgICAgICAgQUxPR0QoIiVzKCkgY2FsbCBzYWZlUmVsZWFzZUNsb3NlRnJvbUNhbGxiYWNrKCkiLCBfX2Z1bmNfXyk7CisgICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsb3NlIHVuZGVyIGEgbG9jayB3aXRoIG5vIGNoZWNrIGZvciBjYWxsYmFjayBjb2xsaXNpb25zLgorICAgICAgICBlbmRwb2ludC0+Z2V0U3RyZWFtSW50ZXJuYWwoKS0+c2FmZVJlbGVhc2VDbG9zZUludGVybmFsKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTExMywzOCArMTIzLDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUFVRElPX05BTk9TX1BFUl9TRUNPTkQKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICAvLyBQYXNzIGEgc21hcnQgcG9pbnRlciBzbyB0aGUgdGhyZWFkIGNhbiBob2xkIGEgcmVmZXJlbmNlLgotICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4gKmVuZHBvaW50Rm9yVGhyZWFkID0gbmV3IHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZD4odGhpcyk7CisgICAgLy8gUHJldmVudCB0aGlzIG9iamVjdCBmcm9tIGdldHRpbmcgZGVsZXRlZCBiZWZvcmUgdGhlIHRocmVhZCBoYXMgYSBjaGFuY2UgdG8gY3JlYXRlCisgICAgLy8gaXRzIHN0cm9uZyBwb2ludGVyLiBBc3N1bWUgdGhlIHRocmVhZCB3aWxsIGNhbGwgZGVjU3Ryb25nKCkuCisgICAgdGhpcy0+aW5jU3Ryb25nKG51bGxwdHIpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5jcmVhdGVUaHJlYWQocGVyaW9kTmFub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZW5kcG9pbnRfdGhyZWFkX3Byb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludEZvclRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAvLyBUaGUgdGhyZWFkIGNhbid0IGRlbGV0ZSBpdCBzbyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUuCi0gICAgICAgIGRlbGV0ZSBlbmRwb2ludEZvclRocmVhZDsKKyAgICAgICAgdGhpcy0+ZGVjU3Ryb25nKG51bGxwdHIpOyAvLyBCZWNhdXNlIHRoZSB0aHJlYWQgd29uJ3QgZG8gaXQuCiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBhYXVkaW86OkFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RvcFNoYXJpbmdUaHJlYWQoKSB7CiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGdldFN0cmVhbUludGVybmFsKCktPmpvaW5UaHJlYWQoTlVMTCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+am9pblRocmVhZChOVUxMKTsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RhcnRTdHJlYW0oc3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+IHNoYXJlZFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6c3RhcnRTdHJlYW0oCisgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzaGFyZWRTdHJlYW0sCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkKKyAgICAgICAgTk9fVEhSRUFEX1NBRkVUWV9BTkFMWVNJUyB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAogICAgIHsKICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKICAgICAgICAgaWYgKCsrbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAxKSB7IC8vIGF0b21pYwotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0YXJ0KCk7CisgICAgICAgICAgICByZXN1bHQgPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5zeXN0ZW1TdGFydCgpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAtLW1SdW5uaW5nU3RyZWFtQ291bnQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0YXJ0U2hhcmluZ1RocmVhZF9sKCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKICAgICAgICAgICAgICAgICAgICAgLS1tUnVubmluZ1N0cmVhbUNvdW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE1OCw3ICsxNjksNyBAQAogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgaWYgKC0tbVJ1bm5pbmdTdHJlYW1Db3VudCA9PSAwKSB7IC8vIGF0b21pYwogICAgICAgICAgICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0b3AoKTsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1JbnRlcm5hbCgpLT5zeXN0ZW1TdG9wRnJvbUFwcCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTczLDcgKzE4NCw3IEBACiAKICAgICBpZiAoLS1tUnVubmluZ1N0cmVhbUNvdW50ID09IDApIHsgLy8gYXRvbWljCiAgICAgICAgIHN0b3BTaGFyaW5nVGhyZWFkKCk7IC8vIHRoZSBzaGFyaW5nIHRocmVhZCBsb2NrcyBtTG9ja1N0cmVhbXMKLSAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+cmVxdWVzdFN0b3AoKTsKKyAgICAgICAgZ2V0U3RyZWFtSW50ZXJuYWwoKS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKaW5kZXggYmZjMTc0NC4uODM1NzU2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bXV0ZXg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CisKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oIgogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIgpAQCAtMzUsMTIgKzM3LDE1IEBACiBjbGFzcyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50IHsKIAogcHVibGljOgorICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZChBdWRpb1N0cmVhbUludGVybmFsICpzdHJlYW1JbnRlcm5hbCk7CisKKyAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQoKSA9IGRlZmF1bHQ7CiAKICAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjbG9zZSgpIG92ZXJyaWRlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0U3RyZWFtKGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgb3ZlcnJpZGU7CkBAIC01NCwxOCArNTksMTggQEAKIAogICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKLXByb3RlY3RlZDoKLQogICAgIEF1ZGlvU3RyZWFtSW50ZXJuYWwgKmdldFN0cmVhbUludGVybmFsKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbUludGVybmFsOworICAgICAgICByZXR1cm4gbVN0cmVhbUludGVybmFsLmdldCgpOwogICAgIH07CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RhcnRTaGFyaW5nVGhyZWFkX2woKTsKK3Byb3RlY3RlZDoKKworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICBzdGFydFNoYXJpbmdUaHJlYWRfbCgpIFJFUVVJUkVTKG1Mb2NrU3RyZWFtcyk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgc3RvcFNoYXJpbmdUaHJlYWQoKTsKIAotICAgIC8vIHBvaW50ZXIgdG8gb2JqZWN0IHN0YXRpY2FsbHkgYWxsb2NhdGVkIGluIHN1YmNsYXNzZXMKLSAgICBBdWRpb1N0cmVhbUludGVybmFsICAgICAqbVN0cmVhbUludGVybmFsID0gbnVsbHB0cjsKKyAgICAvLyBBbiBNTUFQIHN0cmVhbSB0aGF0IGlzIHNoYXJlZCBieSBtdWx0aXBsZSBjbGllbnRzLgorICAgIGFuZHJvaWQ6OnNwPEF1ZGlvU3RyZWFtSW50ZXJuYWw+IG1TdHJlYW1JbnRlcm5hbDsKIAogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgICBtQ2FsbGJhY2tFbmFibGVke2ZhbHNlfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDMwZGViNWQuLjM0ZGRkNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgogCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCkBAIC00MCwyMiArMzksMjMgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAordXNpbmcgY29udGVudDo6QXR0cmlidXRpb25Tb3VyY2VTdGF0ZTsKKwogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBzdHJlYW1zIGluIHRoZSBzZXJ2aWNlLgogICogQHJldHVybgogICovCiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCi0gICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCi0gICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgiQUFUaW1lIikKKyAgICAgICAgOiBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQogICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7Ci0gICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7Ci0gICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gLTE7Ci0gICAgbU1tYXBDbGllbnQucGFja2FnZU5hbWUgPSBTdHJpbmcxNigiIik7CisgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UgPSBBdHRyaWJ1dGlvblNvdXJjZVN0YXRlKCk7CiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7CisgICAgQUxPR0QoIiVzKCkgY2FsbGVkIiwgX19mdW5jX18pOworCiAgICAgLy8gTWF5IG5vdCBiZSBzZXQgaWYgb3BlbiBmYWlsZWQuCiAgICAgaWYgKG1NZXRyaWNzSWQuc2l6ZSgpID4gMCkgewogICAgICAgICBtZWRpYW1ldHJpY3M6OkxvZ0l0ZW0obU1ldHJpY3NJZCkKQEAgLTY3LDggKzY3LDcgQEAKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2Ugc3RyZWFtICVwIHN0aWxsIG9wZW4sIHN0YXRlID0gJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgZ2V0U3RhdGUoKSk7CiB9CkBAIC04Miw3ICs4MSw3IEBACiAKICAgICByZXN1bHQgPDwgIiAgICAweCIgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDgpIDw8IHN0ZDo6aGV4IDw8IG1IYW5kbGUKICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykgOwotICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbU1tYXBDbGllbnQuY2xpZW50VWlkOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNykgPDwgbUNsaWVudEhhbmRsZTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDQpIDw8IChpc1J1bm5pbmcoKSA/ICJ5ZXMiIDogIiBubyIpOwogICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoNikgPDwgZ2V0U3RhdGUoKTsKQEAgLTEyOCw5ICsxMjcsMTIgQEAKICAgICBBQXVkaW9FbmRwb2ludE1hbmFnZXIgJm1FbmRwb2ludE1hbmFnZXIgPSBBQXVkaW9FbmRwb2ludE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAotICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IHJlcXVlc3QuZ2V0VXNlcklkKCk7Ci0gICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKLSAgICBtTW1hcENsaWVudC5wYWNrYWdlTmFtZS5zZXRUbyhTdHJpbmcxNigiIikpOyAvLyBUT0RPIFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/CisgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UgPSByZXF1ZXN0LmdldEF0dHJpYnV0aW9uU291cmNlKCk7CisgICAgLy8gVE9ETyBiLzE4MjM5Mjc2OTogdXNlIGF0dHJpYnV0aW9uIHNvdXJjZSB1dGlsCisgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UudWlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgIGxlZ2FjeTJhaWRsX3VpZF90X2ludDMyX3QoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSk7CisgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkID0gVkFMVUVfT1JfRkFUQUwoCisgICAgICAgIGxlZ2FjeTJhaWRsX3BpZF90X2ludDMyX3QoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSk7CiAKICAgICAvLyBMaW1pdCBzY29wZSBvZiBsb2NrIHRvIGF2b2lkIHJlY3Vyc2l2ZSBsb2NrIGluIGNsb3NlKCkuCiAgICAgewpAQCAtMTQwLDcgKzE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIH0KIAotICAgICAgICBtVXBNZXNzYWdlUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOworICAgICAgICBtVXBNZXNzYWdlUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZFJpbmdCdWZmZXI+KCk7CiAgICAgICAgIHJlc3VsdCA9IG1VcE1lc3NhZ2VRdWV1ZS0+YWxsb2NhdGUoc2l6ZW9mKEFBdWRpb1NlcnZpY2VNZXNzYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVVRV9VUF9DQVBBQ0lUWV9DT01NQU5EUyk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC0xNzksNiArMTgxLDggQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKKyAgICAvLyBUaGlzIHdpbGwgY2FsbCBzdG9wVGltZXN0YW1wVGhyZWFkKCkgYW5kIGFsc28gc3RvcCB0aGUgc3RyZWFtLAorICAgIC8vIGp1c3QgaW4gY2FzZSBpdCB3YXMgbm90IGFscmVhZHkgc3RvcHBlZC4KICAgICBzdG9wX2woKTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CkBAIC0xOTQsMTMgKzE5OCw2IEBACiAgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQuY2xlYXIoKTsgLy8gZW5kcG9pbnQgd2lsbCBob2xkIHRoZSBwb2ludGVyIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCiAgICAgfQogCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKLSAgICAgICAgc3RvcFRpbWVzdGFtcFRocmVhZCgpOwotICAgICAgICBkZWxldGUgbVVwTWVzc2FnZVF1ZXVlOwotICAgICAgICBtVXBNZXNzYWdlUXVldWUgPSBudWxscHRyOwotICAgIH0KLQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKTsKIAogICAgIG1lZGlhbWV0cmljczo6TG9nSXRlbShtTWV0cmljc0lkKQpAQCAtMjMxLDcgKzIyOCw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKIAogICAgIGlmIChhdXRvIHN0YXRlID0gZ2V0U3RhdGUoKTsKLSAgICAgICAgc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQgfHwgc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKKyAgICAgICAgc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQgfHwgaXNEaXNjb25uZWN0ZWRfbCgpKSB7CiAgICAgICAgIEFMT0dXKCIlcygpIGFscmVhZHkgQ0xPU0VELCByZXR1cm5zIElOVkFMSURfU1RBVEUsIGhhbmRsZSA9ICVkIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZ2V0SGFuZGxlKCkpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0yNjMsOCArMjYwLDE0IEBACiAgICAgc2VuZFNlcnZpY2VFdmVudChBQVVESU9fU0VSVklDRV9FVkVOVF9TVEFSVEVEKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpOwogICAgIG1UaHJlYWRFbmFibGVkLnN0b3JlKHRydWUpOworICAgIC8vIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBkb2VzIG5vdCBnZXQgZGVsZXRlZCBiZWZvcmUgdGhlIHJ1bigpIG1ldGhvZAorICAgIC8vIGNhbiBwcm90ZWN0IGl0IGJ5IG1ha2luZyBhIHN0cm9uZyBwb2ludGVyLgorICAgIGluY1N0cm9uZyhudWxscHRyKTsgLy8gU2VlIHJ1bigpIG1ldGhvZC4KICAgICByZXN1bHQgPSBtVGltZXN0YW1wVGhyZWFkLnN0YXJ0KHRoaXMpOwotICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSBnb3RvIGVycm9yOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIGRlY1N0cm9uZyhudWxscHRyKTsgLy8gcnVuKCkgY2FuJ3QgZG8gaXQgc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLgorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiAKQEAgLTQwMyw3ICs0MDYsMTIgQEAKIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewogICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CisgICAgLy8gSG9sZCBvbnRvIHRoZSByZWYgY291bnRlZCBzdHJlYW0gdW50aWwgdGhlIGVuZC4KKyAgICBhbmRyb2lkOjpzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gaG9sZFN0cmVhbSh0aGlzKTsKICAgICBUaW1lc3RhbXBTY2hlZHVsZXIgdGltZXN0YW1wU2NoZWR1bGVyOworICAgIC8vIEJhbGFuY2UgdGhlIGluY1N0cm9uZyBmcm9tIHdoZW4gdGhlIHRocmVhZCB3YXMgbGF1bmNoZWQuCisgICAgaG9sZFN0cmVhbS0+ZGVjU3Ryb25nKG51bGxwdHIpOworCiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CkBAIC00MzksOCArNDQ3LDcgQEAKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGlzY29ubmVjdF9sKCkgewotICAgIGlmIChnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVECi0gICAgICAgICYmIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpIHsKKyAgICBpZiAoIWlzRGlzY29ubmVjdGVkX2woKSAmJiBnZXRTdGF0ZSgpICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7CiAKICAgICAgICAgbWVkaWFtZXRyaWNzOjpMb2dJdGVtKG1NZXRyaWNzSWQpCiAgICAgICAgICAgICAuc2V0KEFNRURJQU1FVFJJQ1NfUFJPUF9FVkVOVCwgQU1FRElBTUVUUklDU19QUk9QX0VWRU5UX1ZBTFVFX0RJU0NPTk5FQ1QpCkBAIC00NDgsNyArNDU1LDcgQEAKICAgICAgICAgICAgIC5yZWNvcmQoKTsKIAogICAgICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgc2V0RGlzY29ubmVjdGVkX2wodHJ1ZSk7CiAgICAgfQogfQogCkBAIC01MTgsMTIgKzUyNSw4IEBACiAgICAgICAgIEFMT0dFKCIlcygpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpCi0gICAgICAgIC0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwotICAgIGludDMyX3QgY2FwYWNpdHkgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKQotICAgICAgICAtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKICAgICAvLyBJcyBpdCBoYWxmIGZ1bGwgb3IgbW9yZQotICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGUgPj0gKGNhcGFjaXR5IC8gMik7CisgICAgcmV0dXJuIG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0RnJhY3Rpb25hbEZ1bGxuZXNzKCkgPj0gMC41OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OndyaXRlVXBNZXNzYWdlUXVldWUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKmNvbW1hbmQpIHsKQEAgLTYwOCwxNCArNjExLDMgQEAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9uVm9sdW1lQ2hhbmdlZChmbG9hdCB2b2x1bWUpIHsKICAgICBzZW5kU2VydmljZUV2ZW50KEFBVURJT19TRVJWSUNFX0VWRU5UX1ZPTFVNRSwgdm9sdW1lKTsKIH0KLQotaW50MzJfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6aW5jcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50X2woKSB7Ci0gICAgcmV0dXJuICsrbUNhbGxpbmdDb3VudDsKLX0KLQotaW50MzJfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZGVjcmVtZW50U2VydmljZVJlZmVyZW5jZUNvdW50X2woKSB7Ci0gICAgaW50MzJfdCBjb3VudCA9IC0tbUNhbGxpbmdDb3VudDsKLSAgICAvLyBFYWNoIGNhbGwgdG8gaW5jcmVtZW50IHNob3VsZCBiZSBiYWxhbmNlZCB3aXRoIG9uZSBjYWxsIHRvIGRlY3JlbWVudC4KLSAgICBhc3NlcnQoY291bnQgPj0gMCk7Ci0gICAgcmV0dXJuIGNvdW50OwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKaW5kZXggOTRjYzk4MC4uOTc2OTk2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCkBAIC0yMCwxMyArMjAsMTYgQEAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxtdXRleD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS90aHJlYWRfYW5ub3RhdGlvbnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BaWRsQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgogI2luY2x1ZGUgImJpbmRpbmcvQXVkaW9FbmRwb2ludFBhcmNlbGFibGUuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmgiCisjaW5jbHVkZSAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaCIKICNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIApAQCAtNzcsNyArODAsNyBAQAogICAgIC8vIGJlY2F1c2Ugd2UgaGFkIHRvIHdhaXQgdW50aWwgd2UgZ2VuZXJhdGVkIHRoZSBoYW5kbGUuCiAgICAgdm9pZCBsb2dPcGVuKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlKCkgRVhDTFVERVMobUxvY2spOwogCiAgICAgLyoqCiAgICAgICogU3RhcnQgdGhlIGZsb3cgb2YgYXVkaW8gZGF0YS4KQEAgLTg1LDcgKzg4LDcgQEAKICAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCiAgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RBUlRFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICAgICAqLwotICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpOworICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIEVYQ0xVREVTKG1Mb2NrKTsKIAogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGZsb3cgb2YgZGF0YSBzbyB0aGF0IHN0YXJ0KCkgY2FuIHJlc3VtZSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KQEAgLTkzLDcgKzk2LDcgQEAKICAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCiAgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2UoKSBFWENMVURFUyhtTG9jayk7CiAKICAgICAvKioKICAgICAgKiBTdG9wIHRoZSBmbG93IG9mIGRhdGEgYWZ0ZXIgdGhlIGN1cnJlbnRseSBxdWV1ZWQgZGF0YSBoYXMgZmluaXNoZWQgcGxheWluZy4KQEAgLTEwMiwxNCArMTA1LDE0IEBACiAgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfU1RPUFBFRCB3aWxsIGJlIHNlbnQgdG8gdGhlIGNsaWVudCB3aGVuIGNvbXBsZXRlLgogICAgICAqCiAgICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3AoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RvcCgpIEVYQ0xVREVTKG1Mb2NrKTsKIAogICAgIC8qKgogICAgICAqIERpc2NhcmQgYW55IGRhdGEgaGVsZCBieSB0aGUgdW5kZXJseWluZyBIQUwgb3IgU2VydmljZS4KICAgICAgKgogICAgICAqIEFuIEFBVURJT19TRVJWSUNFX0VWRU5UX0ZMVVNIRUQgd2lsbCBiZSBzZW50IHRvIHRoZSBjbGllbnQgd2hlbiBjb21wbGV0ZS4KICAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgZmx1c2goKSBFWENMVURFUyhtTG9jayk7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciBfX3VudXNlZCwKQEAgLTEyMyw5ICsxMjYsOSBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpOworICAgIGFhdWRpb19yZXN1bHRfdCByZWdpc3RlckF1ZGlvVGhyZWFkKHBpZF90IGNsaWVudFRocmVhZElkLCBpbnQgcHJpb3JpdHkpIEVYQ0xVREVTKG1Mb2NrKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQpOworICAgIGFhdWRpb19yZXN1bHRfdCB1bnJlZ2lzdGVyQXVkaW9UaHJlYWQocGlkX3QgY2xpZW50VGhyZWFkSWQpIEVYQ0xVREVTKG1Mb2NrKTsKIAogICAgIGJvb2wgaXNSdW5uaW5nKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDsKQEAgLTEzNCw3ICsxMzcsNyBAQAogICAgIC8qKgogICAgICAqIEZpbGwgaW4gYSBwYXJjZWxhYmxlIGRlc2NyaXB0aW9uIG9mIHN0cmVhbS4KICAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0RGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpOworICAgIGFhdWRpb19yZXN1bHRfdCBnZXREZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgRVhDTFVERVMobUxvY2spOwogCiAgICAgdm9pZCBzZXRSZWdpc3RlcmVkVGhyZWFkKHBpZF90IHBpZCkgewogICAgICAgICBtUmVnaXN0ZXJlZENsaWVudFRocmVhZCA9IHBpZDsKQEAgLTE1MCwxOCArMTUzLDIwIEBACiAKICAgICB2b2lkIHJ1bigpIG92ZXJyaWRlOyAvLyB0byBpbXBsZW1lbnQgUnVubmFibGUKIAotICAgIHZvaWQgZGlzY29ubmVjdCgpOworICAgIHZvaWQgZGlzY29ubmVjdCgpIEVYQ0xVREVTKG1Mb2NrKTsKIAogICAgIGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICZnZXRBdWRpb0NsaWVudCgpIHsKICAgICAgICAgcmV0dXJuIG1NbWFwQ2xpZW50OwogICAgIH0KIAogICAgIHVpZF90IGdldE93bmVyVXNlcklkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbU1tYXBDbGllbnQuY2xpZW50VWlkOworICAgICAgICByZXR1cm4gVkFMVUVfT1JfRkFUQUwoYW5kcm9pZDo6YWlkbDJsZWdhY3lfaW50MzJfdF91aWRfdCgKKyAgICAgICAgICAgICAgICBtTW1hcENsaWVudC5hdHRyaWJ1dGlvblNvdXJjZS51aWQpKTsKICAgICB9CiAKICAgICBwaWRfdCBnZXRPd25lclByb2Nlc3NJZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1NbWFwQ2xpZW50LmNsaWVudFBpZDsKKyAgICAgICAgcmV0dXJuIFZBTFVFX09SX0ZBVEFMKGFuZHJvaWQ6OmFpZGwybGVnYWN5X2ludDMyX3RfcGlkX3QoCisgICAgICAgICAgICAgICAgbU1tYXBDbGllbnQuYXR0cmlidXRpb25Tb3VyY2UucGlkKSk7CiAgICAgfQogCiAgICAgYWF1ZGlvX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsKQEAgLTIwOCwyNSArMjEzLDYgQEAKICAgICAgICAgcmV0dXJuIG1TdXNwZW5kZWQ7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQXRvbWljYWxseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHZhbHVlIGFmdGVyIHRoZSBpbmNyZW1lbnQKLSAgICAgKi8KLSAgICBpbnQzMl90IGluY3JlbWVudFNlcnZpY2VSZWZlcmVuY2VDb3VudF9sKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KLSAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBpbmNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpLgotICAgICAqCi0gICAgICogVGhpcyBpcyBjYWxsZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgotICAgICAqCi0gICAgICogQHJldHVybiB2YWx1ZSBhZnRlciB0aGUgZGVjcmVtZW50Ci0gICAgICovCi0gICAgaW50MzJfdCBkZWNyZW1lbnRTZXJ2aWNlUmVmZXJlbmNlQ291bnRfbCgpOwotCiAgICAgYm9vbCBpc0Nsb3NlTmVlZGVkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbUNsb3NlTmVlZGVkLmxvYWQoKTsKICAgICB9CkBAIC0yNDksMTEgKzIzNSwxMCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpOwogCi0gICAgLy8gVGhlc2UgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbUxvY2sKLSAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjbG9zZV9sKCk7Ci0gICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcGF1c2VfbCgpOwotICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BfbCgpOwotICAgIHZvaWQgZGlzY29ubmVjdF9sKCk7CisgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY2xvc2VfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBwYXVzZV9sKCkgUkVRVUlSRVMobUxvY2spOworICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0b3BfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKKyAgICB2b2lkIGRpc2Nvbm5lY3RfbCgpIFJFUVVJUkVTKG1Mb2NrKTsKIAogICAgIHZvaWQgc2V0U3RhdGUoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKTsKIApAQCAtMjY1LDcgKzI1MCw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgd3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKTsKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZEN1cnJlbnRUaW1lc3RhbXAoKSBFWENMVURFUyhtTG9jayk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgc2VuZFhSdW5Db3VudChpbnQzMl90IHhSdW5Db3VudCk7CiAKQEAgLTI4MiwxMCArMjY3LDE3IEBACiAKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAKKyAgICBib29sIGlzRGlzY29ubmVjdGVkX2woKSBjb25zdCBSRVFVSVJFUyhtTG9jaykgeworICAgICAgICByZXR1cm4gbURpc2Nvbm5lY3RlZDsKKyAgICB9CisgICAgdm9pZCBzZXREaXNjb25uZWN0ZWRfbChib29sIGZsYWcpIFJFUVVJUkVTKG1Mb2NrKSB7CisgICAgICAgIG1EaXNjb25uZWN0ZWQgPSBmbGFnOworICAgIH0KKwogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcmVkQ2xpZW50VGhyZWFkID0gSUxMRUdBTF9USFJFQURfSUQ7CiAKLSAgICBTaGFyZWRSaW5nQnVmZmVyKiAgICAgICBtVXBNZXNzYWdlUXVldWU7CiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbVVwTWVzc2FnZVF1ZXVlTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2hhcmVkUmluZ0J1ZmZlcj4gbVVwTWVzc2FnZVF1ZXVlOwogCiAgICAgQUF1ZGlvVGhyZWFkICAgICAgICAgICAgbVRpbWVzdGFtcFRocmVhZDsKICAgICAvLyBUaGlzIGlzIHVzZWQgYnkgb25lIHRocmVhZCB0byB0ZWxsIGFub3RoZXIgdGhyZWFkIHRvIGV4aXQuIFNvIGl0IG11c3QgYmUgYXRvbWljLgpAQCAtMzMxLDE4ICszMjMsMTkgQEAKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZsb3dpbmcgPSBmYWxzZTsKIAotICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgotICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOwotCi0gICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHN0cmVhbSB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQgYnkgYSBiaW5kZXIgY2FsbCBuZWVkcyB0byBjbG9zZWQuCi0gICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGF0IGEgc3RyZWFtIHRoYXQgaXMgYmVpbmcgcmVmZXJlbmNlZCBieSBhIGJpbmRlciBjYWxsCisgICAgLy8gYW5kIG5lZWRzIHRvIGNsb3NlZC4KKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtQ2xvc2VOZWVkZWR7ZmFsc2V9OyAvLyBUT0RPIHJlbW92ZQogCiAgICAgLy8gVGhpcyBpbmRpY2F0ZSB0aGF0IGEgcnVubmluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYmVjYXVzZSBvZiBhbiBlcnJvciwKICAgICAvLyBmb3IgZXhhbXBsZSBhIGZ1bGwgbWVzc2FnZSBxdWV1ZS4gTm90ZSB0aGF0IHRoaXMgYXRvbWljIGlzIHVucmVsYXRlZCB0byBtQ2xvc2VOZWVkZWQuCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbVN1c3BlbmRlZHtmYWxzZX07CiAKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkIEdVQVJERURfQlkobUxvY2spIHtmYWxzZX07CisKK3Byb3RlY3RlZDoKICAgICAvLyBMb2NraW5nIG9yZGVyIGlzIGltcG9ydGFudC4KLSAgICAvLyBBbHdheXMgYWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCisgICAgLy8gQWNxdWlyZSBtTG9jayBiZWZvcmUgYWNxdWlyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6bUxvY2tTdHJlYW1zCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgbUxvY2s7IC8vIFByZXZlbnQgc3RhcnQvc3RvcC9jbG9zZSBldGNldGVyYSBmcm9tIGNvbGxpZGluZwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IDU0ZDdkMDYuLjU3ZGMxYWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0xNjIsNyArMTYzLDggQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0vLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigpCisvLyBHZXQgdGltZXN0YW1wIGZyb20gcHJlc2VudGF0aW9uIHBvc2l0aW9uLgorLy8gSWYgaXQgZmFpbHMsIGdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCkKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUDo6Z2V0SGFyZHdhcmVUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAKQEAgLTE3NCw3ICsxNzYsMTcgQEAKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQPiBzZXJ2aWNlRW5kcG9pbnRNTUFQID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCi0gICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKKyAgICAvLyBEaXNhYmxlIHRoaXMgY29kZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoZSBIQUwgaXMgbm90IHJldHVybmluZworICAgIC8vIGEgdXNlZnVsIHJlc3VsdC4KKyNpZiAwCisgICAgdWludDY0X3QgcG9zaXRpb247CisgICAgaWYgKHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEV4dGVybmFsUG9zaXRpb24oJnBvc2l0aW9uLCB0aW1lTmFub3MpID09IEFBVURJT19PSykgeworICAgICAgICBBTE9HRCgiJXMoKSBnZXRFeHRlcm5hbFBvc2l0aW9uKCkgc2F5cyBwb3MgPSAlIiBQUklpNjQgIiwgdGltZSA9ICUiIFBSSWk2NCwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcG9zaXRpb24sICp0aW1lTmFub3MpOworICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSAoaW50NjRfdCkgcG9zaXRpb247CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfSBlbHNlCisjZW5kaWYKICAgICBpZiAobUF0b21pY1N0cmVhbVRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNTdHJlYW1UaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oCmluZGV4IDU5MDI2MTMuLjY2NzQ2NWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXRvbWljPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NbWFwU3RyZWFtQ2FsbGJhY2suaD4KQEAgLTM0LDEwICszNSw4IEBACiAjaW5jbHVkZSAiVGltZXN0YW1wU2NoZWR1bGVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgiCiAKLQogbmFtZXNwYWNlIGFhdWRpbyB7CiAKLQogLyoqCiAgKiBUaGVzZSBjb3JyZXNwb25kcyB0byBhbiBFWENMVVNJVkUgbW9kZSBNTUFQIGNsaWVudCBzdHJlYW0uCiAgKiBJdCBoYXMgZXhjbHVzaXZlIHVzZSBvZiBvbmUgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSB1bmRlcmx5aW5nCkBAIC02OCwxMyArNjcsMTQgQEAKICAgICAgKiBUaGlzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNocm9ub3VzIGJ1dCBpdCBjdXJyZW50bHkgaXMuCiAgICAgICogQW4gQUFVRElPX1NFUlZJQ0VfRVZFTlRfUEFVU0VEIHdpbGwgYmUgc2VudCB0byB0aGUgY2xpZW50IHdoZW4gY29tcGxldGUuCiAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3QgcGF1c2VfbCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZV9sKCkgUkVRVUlSRVMobUxvY2spIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BfbCgpIG92ZXJyaWRlOworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wX2woKSBSRVFVSVJFUyhtTG9jaykgb3ZlcnJpZGU7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0QXVkaW9EYXRhRGVzY3JpcHRpb24oQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIG92ZXJyaWRlOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCisgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIEVYQ0xVREVTKG1Mb2NrKSBvdmVycmlkZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRIYXJkd2FyZVRpbWVzdGFtcChpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywgaW50NjRfdCAqdGltZU5hbm9zKSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwMWIxYzJlLi5jNjY1Y2RhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMjQsOCArMjQsNiBAQAogCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCi0jaW5jbHVkZSAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5oIgotCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9TZXJ2aWNlTWVzc2FnZS5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAjaW5jbHVkZSAiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIgpAQCAtNTQsMTkgKzUyLDI2IEBACiAgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6ZHVtcCgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKKyAgICBjb25zdCBib29sIGlzTG9ja2VkID0gQUF1ZGlvX3RyeVVudGlsVHJ1ZSgKKyAgICAgICAgICAgIFt0aGlzXSgpLT5ib29sIHsgcmV0dXJuIGF1ZGlvRGF0YVF1ZXVlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCisgICAgICAgICAgICA1MCAvKiB0aW1lcyAqLywKKyAgICAgICAgICAgIDIwIC8qIHNsZWVwTXMgKi8pOworICAgIGlmICghaXNMb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0IDw8ICJBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkIG1heSBiZSBkZWFkbG9ja2VkXG4iOworICAgIH0KKwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6ZHVtcCgpOwogCi0gICAgYXV0byBmaWZvID0gbUF1ZGlvRGF0YVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCk7Ci0gICAgaW50MzJfdCByZWFkQ291bnRlciA9IGZpZm8tPmdldFJlYWRDb3VudGVyKCk7Ci0gICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKLSAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDEwKSA8PCB3cml0ZUNvdW50ZXI7Ci0gICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgcmVhZENvdW50ZXI7Ci0gICAgcmVzdWx0IDw8IHN0ZDo6c2V0dyg4KSA8PCAod3JpdGVDb3VudGVyIC0gcmVhZENvdW50ZXIpOworICAgIHJlc3VsdCA8PCBtQXVkaW9EYXRhUXVldWUtPmR1bXAoKTsKICAgICByZXN1bHQgPDwgc3RkOjpzZXR3KDgpIDw8IGdldFhSdW5Db3VudCgpOwogCisgICAgaWYgKGlzTG9ja2VkKSB7CisgICAgICAgIGF1ZGlvRGF0YVF1ZXVlTG9jay51bmxvY2soKTsKKyAgICB9CisKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCkBAIC0xMDUsNyArMTEwLDcgQEAKICAgICB9CiAgICAgaW50MzJfdCBjYXBhY2l0eUluRnJhbWVzID0gbnVtQnVyc3RzICogZnJhbWVzUGVyQnVyc3Q7CiAKLSAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2suCisgICAgLy8gRmluYWwgcmFuZ2UgY2hlY2suCiAgICAgaWYgKGNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKICAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgY2FsYyBjYXBhY2l0eSAlZCA+IG1heCAlZCIsCiAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CkBAIC0xNzgsOSArMTgzLDkgQEAKICAgICB9CiAKICAgICB7Ci0gICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhhdWRpb0RhdGFRdWV1ZUxvY2spOwogICAgICAgICAvLyBDcmVhdGUgYXVkaW8gZGF0YSBzaGFyZWQgbWVtb3J5IGJ1ZmZlciBmb3IgY2xpZW50LgotICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBuZXcgU2hhcmVkUmluZ0J1ZmZlcigpOworICAgICAgICBtQXVkaW9EYXRhUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFNoYXJlZFJpbmdCdWZmZXI+KCk7CiAgICAgICAgIHJlc3VsdCA9IG1BdWRpb0RhdGFRdWV1ZS0+YWxsb2NhdGUoY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNvdWxkIG5vdCBhbGxvY2F0ZSBGSUZPIHdpdGggJWQgZnJhbWVzIiwKQEAgLTIwMywyNSArMjA4LDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmNsb3NlX2woKSAgewotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6Y2xvc2VfbCgpOwotCi0gICAgewotICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQXVkaW9EYXRhUXVldWVMb2NrKTsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0RhdGFRdWV1ZTsKLSAgICAgICAgbUF1ZGlvRGF0YVF1ZXVlID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiAvKioKICAqIEdldCBhbiBpbW11dGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhdGEgcXVldWUgY3JlYXRlZCBieSB0aGlzIHNlcnZpY2UuCiAgKi8KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbigKICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpCiB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soYXVkaW9EYXRhUXVldWVMb2NrKTsKICAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwpAQCAtMjczLDMgKzI2NiwzNyBAQAogICAgICpwb3NpdGlvbkZyYW1lcyA9IHBvc2l0aW9uOwogICAgIHJldHVybiByZXN1bHQ7CiB9CisKK3ZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6d3JpdGVEYXRhSWZSb29tKGludDY0X3QgbW1hcEZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50NjRfdCBjbGllbnRGcmFtZXNXcml0dGVuID0gMDsKKworICAgIC8vIExvY2sgdGhlIEF1ZGlvRmlmbyB0byBwcm90ZWN0IGFnYWluc3QgY2xvc2UuCisgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKGF1ZGlvRGF0YVF1ZXVlTG9jayk7CisKKyAgICBpZiAobUF1ZGlvRGF0YVF1ZXVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZm9CdWZmZXI+IGZpZm8gPSBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsKKyAgICAgICAgLy8gRGV0ZXJtaW5lIG9mZnNldCBiZXR3ZWVuIGZyYW1lUG9zaXRpb24gaW4gY2xpZW50J3Mgc3RyZWFtCisgICAgICAgIC8vIHZzIHRoZSB1bmRlcmx5aW5nIE1NQVAgc3RyZWFtLgorICAgICAgICBjbGllbnRGcmFtZXNXcml0dGVuID0gZmlmby0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgICAgIC8vIFRoZXJlIGFyZSB0d28gaW5kaWNlcyB0aGF0IHJlZmVyIHRvIHRoZSBzYW1lIGZyYW1lLgorICAgICAgICBpbnQ2NF90IHBvc2l0aW9uT2Zmc2V0ID0gbW1hcEZyYW1lc1JlYWQgLSBjbGllbnRGcmFtZXNXcml0dGVuOworICAgICAgICBzZXRUaW1lc3RhbXBQb3NpdGlvbk9mZnNldChwb3NpdGlvbk9mZnNldCk7CisKKyAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PworICAgICAgICBpZiAoZmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgICAgIGluY3JlbWVudFhSdW5Db3VudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlmby0+d3JpdGUoYnVmZmVyLCBudW1GcmFtZXMpOworICAgICAgICB9CisgICAgICAgIGNsaWVudEZyYW1lc1dyaXR0ZW4gPSBmaWZvLT5nZXRXcml0ZUNvdW50ZXIoKTsKKyAgICB9CisKKyAgICBpZiAoY2xpZW50RnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgLy8gVGhpcyB0aW1lc3RhbXAgcmVwcmVzZW50cyB0aGUgY29tcGxldGlvbiBvZiBkYXRhIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUKKyAgICAgICAgLy8gY2xpZW50IGJ1ZmZlci4gSXQgaXMgc2VudCB0byB0aGUgY2xpZW50IGFuZCB1c2VkIGluIHRoZSB0aW1pbmcgbW9kZWwKKyAgICAgICAgLy8gdG8gZGVjaWRlIHdoZW4gZGF0YSB3aWxsIGJlIGF2YWlsYWJsZSB0byByZWFkLgorICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKGNsaWVudEZyYW1lc1dyaXR0ZW4sIEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOworICAgICAgICBtYXJrVHJhbnNmZXJUaW1lKHRpbWVzdGFtcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5oCmluZGV4IGFiY2I3ODIuLjRmYWU1YjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmgKQEAgLTUyLDIzICs1MiwxNiBAQAogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCBjbG9zZV9sKCkgb3ZlcnJpZGU7CisgICAgdm9pZCB3cml0ZURhdGFJZlJvb20oaW50NjRfdCBtbWFwRnJhbWVzUmVhZCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBpbnQzMl90IG51bUZyYW1lcyk7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG11c3QgYmUgbG9ja2VkIHdoZW4gY2FsbGluZyBnZXRBdWRpb0RhdGFGaWZvQnVmZmVyX2woKSBhbmQgd2hpbGUKLSAgICAgKiB1c2luZyB0aGUgRmlmb0J1ZmZlciBpdCByZXR1cm5zLgotICAgICAqLwotICAgIHN0ZDo6bXV0ZXggJmdldEF1ZGlvRGF0YVF1ZXVlTG9jaygpIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb0RhdGFRdWV1ZUxvY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbCB1bmRlciBnZXRBdWRpb0RhdGFRdWV1ZUxvY2soKS4KKyAgICAgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgdW5kZXIgZ2V0QXVkaW9EYXRhUXVldWVMb2NrKCkuCiAgICAgICogQHJldHVybgogICAgICAqLwotICAgIGFuZHJvaWQ6OkZpZm9CdWZmZXIgKmdldEF1ZGlvRGF0YUZpZm9CdWZmZXJfbCgpIHsgcmV0dXJuIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbHB0cgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtQXVkaW9EYXRhUXVldWUtPmdldEZpZm9CdWZmZXIoKTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxTaGFyZWRSaW5nQnVmZmVyPiBnZXRBdWRpb0RhdGFRdWV1ZV9sKCkKKyAgICAgICAgICAgIFJFUVVJUkVTKGF1ZGlvRGF0YVF1ZXVlTG9jaykgeworICAgICAgICByZXR1cm4gbUF1ZGlvRGF0YVF1ZXVlOworICAgIH0KIAogICAgIC8qIEtlZXAgYSByZWNvcmQgb2Ygd2hlbiBhIGJ1ZmZlciB0cmFuc2ZlciBjb21wbGV0ZWQuCiAgICAgICogVGhpcyBhbGxvd3MgZm9yIGEgbW9yZSBhY2N1cmF0ZSB0aW1pbmcgbW9kZWwuCkBAIC04OSw2ICs4MiwxMCBAQAogCiAgICAgY29uc3QgY2hhciAqZ2V0VHlwZVRleHQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiU2hhcmVkIjsgfQogCisgICAgLy8gVGhpcyBpcyBwdWJsaWMgc28gdGhhdCB0aGUgdGhyZWFkIHNhZmV0eSBhbm5vdGF0aW9uLCBHVUFSREVEX0JZKCksCisgICAgLy8gQ2FuIHdvcmsgd2hlbiBhbm90aGVyIG9iamVjdCB0YWtlcyB0aGUgbG9jay4KKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICBhdWRpb0RhdGFRdWV1ZUxvY2s7CisKIHByb3RlY3RlZDoKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRBdWRpb0RhdGFEZXNjcmlwdGlvbihBdWRpb0VuZHBvaW50UGFyY2VsYWJsZSAmcGFyY2VsYWJsZSkgb3ZlcnJpZGU7CkBAIC0xMDYsOCArMTAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCk7CiAKIHByaXZhdGU6Ci0gICAgU2hhcmVkUmluZ0J1ZmZlciAgICAgICAgKm1BdWRpb0RhdGFRdWV1ZSA9IG51bGxwdHI7IC8vIHByb3RlY3RlZCBieSBtQXVkaW9EYXRhUXVldWVMb2NrCi0gICAgc3RkOjptdXRleCAgICAgICAgICAgICAgIG1BdWRpb0RhdGFRdWV1ZUxvY2s7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2hhcmVkUmluZ0J1ZmZlcj4gbUF1ZGlvRGF0YVF1ZXVlIEdVQVJERURfQlkoYXVkaW9EYXRhUXVldWVMb2NrKTsKIAogICAgIHN0ZDo6YXRvbWljPGludDY0X3Q+ICAgICBtVGltZXN0YW1wUG9zaXRpb25PZmZzZXQ7CiAgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICAgIG1YUnVuQ291bnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCmluZGV4IDhlNjZiOTQuLjliYmJjNzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuY3BwCkBAIC05Niw3ICs5Niw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RkOjpzdHJpbmcgQUF1ZGlvU3RyZWFtVHJhY2tlcjo6ZHVtcCgpIGNvbnN0IHsKK3N0ZDo6c3RyaW5nIEFBdWRpb1N0cmVhbVRyYWNrZXI6OmR1bXAoKSBjb25zdCBOT19USFJFQURfU0FGRVRZX0FOQUxZU0lTIHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAgICAgY29uc3QgYm9vbCBpc0xvY2tlZCA9IEFBdWRpb190cnlVbnRpbFRydWUoCiAgICAgICAgICAgICBbdGhpc10oKS0+Ym9vbCB7IHJldHVybiBtSGFuZGxlTG9jay50cnlfbG9jaygpOyB9IC8qIGYgKi8sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TdHJlYW1UcmFja2VyLmgKaW5kZXggZDEzMDFhMi4uNDM4NzBmYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU3RyZWFtVHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1N0cmVhbVRyYWNrZXIuaApAQCAtMTcsMTMgKzE3LDEzIEBACiAjaWZuZGVmIEFBVURJT19BQVVESU9fU1RSRUFNX1RSQUNLRVJfSAogI2RlZmluZSBBQVVESU9fQUFVRElPX1NUUkVBTV9UUkFDS0VSX0gKIAorI2luY2x1ZGUgPG11dGV4PgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdGhyZWFkX2Fubm90YXRpb25zLmg+CiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgogCiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9Db21tb24uaCIKLQogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgiCiAKIG5hbWVzcGFjZSBhYXVkaW8gewpAQCAtNzUsMTEgKzc1LDEwIEBACiAgICAgc3RhdGljIGFhdWRpb19oYW5kbGVfdCBidW1wSGFuZGxlKGFhdWRpb19oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgLy8gVHJhY2sgc3RyZWFtIHVzaW5nIGEgdW5pcXVlIGhhbmRsZSB0aGF0IHdyYXBzLiBPbmx5IHVzZSBwb3NpdGl2ZSBoYWxmLgotICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgICAgICBtSGFuZGxlTG9jazsKLSAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhbmRsZUxvY2sKLSAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzSGFuZGxlID0gMDsKLSAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhbmRsZUxvY2sKLSAgICBzdGQ6Om1hcDxhYXVkaW9faGFuZGxlX3QsIGFuZHJvaWQ6OnNwPGFhdWRpbzo6QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtU3RyZWFtc0J5SGFuZGxlOworICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICAgICAgIG1IYW5kbGVMb2NrOworICAgIGFhdWRpb19oYW5kbGVfdCAgICAgICAgICAgICAgIG1QcmV2aW91c0hhbmRsZSBHVUFSREVEX0JZKG1IYW5kbGVMb2NrKSA9IDA7CisgICAgc3RkOjptYXA8YWF1ZGlvX2hhbmRsZV90LCBhbmRyb2lkOjpzcDxhYXVkaW86OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4KKyAgICAgICAgICAgIG1TdHJlYW1zQnlIYW5kbGUgR1VBUkRFRF9CWShtSGFuZGxlTG9jayk7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuY3BwCmluZGV4IGVkNzg5NWIuLjY4NDk2YWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1RocmVhZC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmNwcApAQCAtMzcsMTAgKzM3LDEzIEBACiAgICAgc2V0dXAoIkFBdWRpbyIpOwogfQogCi12b2lkIEFBdWRpb1RocmVhZDo6c2V0dXAoY29uc3QgY2hhciAqcHJlZml4KSB7Ci0gICAgLy8gbVRocmVhZCBpcyBhIHB0aHJlYWRfdCBvZiB1bmtub3duIHNpemUgc28gd2UgbmVlZCBtZW1zZXQoKS4KLSAgICBtZW1zZXQoJm1UaHJlYWQsIDAsIHNpemVvZihtVGhyZWFkKSk7CitBQXVkaW9UaHJlYWQ6On5BQXVkaW9UaHJlYWQoKSB7CisgICAgQUxPR0VfSUYocHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgbVRocmVhZCksCisgICAgICAgICAgICAiJXMoKSBkZXN0cnVjdG9yIHJ1bm5pbmcgaW4gdGhyZWFkIiwgX19mdW5jX18pOworICAgIEFMT0dFX0lGKG1IYXNUaHJlYWQsICIlcygpIHRocmVhZCBuZXZlciBqb2luZWQiLCBfX2Z1bmNfXyk7Cit9CiAKK3ZvaWQgQUF1ZGlvVGhyZWFkOjpzZXR1cChjb25zdCBjaGFyICpwcmVmaXgpIHsKICAgICAvLyBOYW1lIHRoZSB0aHJlYWQgd2l0aCBhbiBpbmNyZWFzaW5nIGluZGV4LCAicHJlZml4XyMiLCBmb3IgZGVidWdnaW5nLgogICAgIHVpbnQzMl90IGluZGV4ID0gbU5leHRUaHJlYWRJbmRleCsrOwogICAgIC8vIFdyYXAgdGhlIGluZGV4IHNvIHRoYXQgd2UgZG8gbm90IGhpdCB0aGUgMTYgY2hhciBsaW1pdApAQCAtNTcsNyArNjAsNyBAQAogICAgIH0KIH0KIAotLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBuZXcgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlVGhyZWFkKCkuCisvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIG5ldyB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVUaHJlYWRfbCgpLgogLy8gSXQgY29udmVydHMgdGhlICdDJyBmdW5jdGlvbiBjYWxsIHRvIGEgQysrIG1ldGhvZCBjYWxsLgogc3RhdGljIHZvaWQgKiBBQXVkaW9UaHJlYWRfaW50ZXJuYWxUaHJlYWRQcm9jKHZvaWQgKmFyZykgewogICAgIEFBdWRpb1RocmVhZCAqYWF1ZGlvVGhyZWFkID0gKEFBdWRpb1RocmVhZCAqKSBhcmc7CkBAIC05MCwxMyArOTMsMTggQEAKICAgICAgICAgQUxPR0UoInN0b3AoKSBidXQgbm8gdGhyZWFkIHJ1bm5pbmciKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHRocmVhZCBpcyB0cnlpbmcgdG8gc3RvcCBpdHNlbGYuCisgICAgaWYgKHB0aHJlYWRfZXF1YWwocHRocmVhZF9zZWxmKCksIG1UaHJlYWQpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGF0dGVtcHQgdG8gcHRocmVhZF9qb2luKCkgZnJvbSBsYXVuY2hlZCB0aHJlYWQhIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKwogICAgIGludCBlcnIgPSBwdGhyZWFkX2pvaW4obVRocmVhZCwgbnVsbHB0cik7Ci0gICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICBBTE9HRSgic3RvcCgpIC0gcHRocmVhZF9qb2luKCkgcmV0dXJuZWQgJWQgJXMiLCBlcnIsIHN0cmVycm9yKGVycikpOwogICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvVGhyZWFkLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAppbmRleCBkY2NlNjhhLi4wOGE4YTk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9UaHJlYWQuaApAQCAtNDYsNyArNDYsNyBAQAogCiAgICAgZXhwbGljaXQgQUF1ZGlvVGhyZWFkKGNvbnN0IGNoYXIgKnByZWZpeCk7CiAKLSAgICB2aXJ0dWFsIH5BQXVkaW9UaHJlYWQoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB+QUF1ZGlvVGhyZWFkKCk7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgdGhyZWFkIHJ1bm5pbmcuCkBAIC03Myw3ICs3Myw3IEBACiAKICAgICBSdW5uYWJsZSAgICAqbVJ1bm5hYmxlID0gbnVsbHB0cjsKICAgICBib29sICAgICAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHB0aHJlYWRfdCAgICBtVGhyZWFkOyAvLyBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgIHB0aHJlYWRfdCAgICBtVGhyZWFkID0ge307CiAKICAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDMyX3Q+IG1OZXh0VGhyZWFkSW5kZXg7CiAgICAgY2hhciAgICAgICAgIG1OYW1lWzE2XTsgLy8gbWF4IGxlbmd0aCBmb3IgYSBwdGhyZWFkX25hbWUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLmJwCmluZGV4IDhiMWUyYzAuLjRjNTgwNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMTIsNyArMTIsMTYgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitwYWNrYWdlIHsKKyAgICAvLyBTZWU6IGh0dHA6Ly9nby9hbmRyb2lkLWxpY2Vuc2UtZmFxCisgICAgLy8gQSBsYXJnZS1zY2FsZS1jaGFuZ2UgYWRkZWQgJ2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcycgdG8gaW1wb3J0CisgICAgLy8gYWxsIG9mIHRoZSAnbGljZW5zZV9raW5kcycgZnJvbSAiZnJhbWV3b3Jrc19hdl9saWNlbnNlIgorICAgIC8vIHRvIGdldCB0aGUgYmVsb3cgbGljZW5zZSBraW5kczoKKyAgICAvLyAgIFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiZnJhbWV3b3Jrc19hdl9saWNlbnNlIl0sCit9CisKK2NjX2xpYnJhcnkgewogCiAgICAgbmFtZTogImxpYmFhdWRpb3NlcnZpY2UiLAogCkBAIC0zNyw2ICs0Niw3IEBACiAgICAgXSwKIAogICAgIGNmbGFnczogWworICAgICAgICAiLVd0aHJlYWQtc2FmZXR5IiwKICAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTU1LDYgKzY1LDE0IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFhdWRpby1haWRsLWNwcCIsCisgICAgICAgICJmcmFtZXdvcmstcGVybWlzc2lvbi1haWRsLWNwcCIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9haWRsX2NvbnZlcnNpb24iLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAorICAgICAgICAiZnJhbWV3b3JrLXBlcm1pc3Npb24tYWlkbC1jcHAiLAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCmluZGV4IGM0M2VkMjIuLjc4ZDQ4ODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAjaW5jbHVkZSAiU2hhcmVkTWVtb3J5UHJveHkuaCIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKaW5kZXggMjQ1NDQ0Ni4uYzFkNGUxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvUmluZ0J1ZmZlclBhcmNlbGFibGUuaCIKQEAgLTMwLDggKzMyLDggQEAKIAogU2hhcmVkUmluZ0J1ZmZlcjo6flNoYXJlZFJpbmdCdWZmZXIoKQogeworICAgIG1GaWZvQnVmZmVyLnJlc2V0KCk7IC8vIHVzZXMgbVNoYXJlZE1lbW9yeQogICAgIGlmIChtU2hhcmVkTWVtb3J5ICE9IG51bGxwdHIpIHsKLSAgICAgICAgZGVsZXRlIG1GaWZvQnVmZmVyOwogICAgICAgICBtdW5tYXAobVNoYXJlZE1lbW9yeSwgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzKTsKICAgICAgICAgbVNoYXJlZE1lbW9yeSA9IG51bGxwdHI7CiAgICAgfQpAQCAtNTgsMTYgKzYwLDE4IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQogCi0gICAgLy8gTWFwIHRoZSBmZCB0byBtZW1vcnkgYWRkcmVzc2VzLgotICAgIG1TaGFyZWRNZW1vcnkgPSAodWludDhfdCAqKSBtbWFwKDAsIG1TaGFyZWRNZW1vcnlTaXplSW5CeXRlcywKKyAgICAvLyBNYXAgdGhlIGZkIHRvIG1lbW9yeSBhZGRyZXNzZXMuIFVzZSBhIHRlbXBvcmFyeSBwb2ludGVyIHRvIGtlZXAgdGhlIG1tYXAgcmVzdWx0IGFuZCB1cGRhdGUKKyAgICAvLyBpdCB0byBgbVNoYXJlZE1lbW9yeWAgb25seSB3aGVuIG1tYXAgb3BlcmF0ZSBzdWNjZXNzZnVsbHkuCisgICAgdWludDhfdCogdG1wUHRyID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2hhcmVkTWVtb3J5U2l6ZUluQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEfFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlsZURlc2NyaXB0b3IuZ2V0KCksIDApOwotICAgIGlmIChtU2hhcmVkTWVtb3J5ID09IE1BUF9GQUlMRUQpIHsKKyAgICBpZiAodG1wUHRyID09IE1BUF9GQUlMRUQpIHsKICAgICAgICAgQUxPR0UoImFsbG9jYXRlKCkgbW1hcCgpIGZhaWxlZCAlZCIsIGVycm5vKTsKICAgICAgICAgbUZpbGVEZXNjcmlwdG9yLnJlc2V0KCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7IC8vIFRPRE8gY29udmVydCBlcnJubyB0byBhIGJldHRlciBBQVVESU9fRVJST1I7CiAgICAgfQorICAgIG1TaGFyZWRNZW1vcnkgPSB0bXBQdHI7CiAKICAgICAvLyBHZXQgYWRkcmVzc2VzIGZvciBvdXIgY291bnRlcnMgYW5kIGRhdGEgZnJvbSB0aGUgc2hhcmVkIG1lbW9yeS4KICAgICBmaWZvX2NvdW50ZXJfdCAqcmVhZENvdW50ZXJBZGRyZXNzID0KQEAgLTc2LDcgKzgwLDcgQEAKICAgICAgICAgICAgIChmaWZvX2NvdW50ZXJfdCAqKSAmbVNoYXJlZE1lbW9yeVtTSEFSRURfUklOR0JVRkZFUl9XUklURV9PRkZTRVRdOwogICAgIHVpbnQ4X3QgKmRhdGFBZGRyZXNzID0gJm1TaGFyZWRNZW1vcnlbU0hBUkVEX1JJTkdCVUZGRVJfREFUQV9PRkZTRVRdOwogCi0gICAgbUZpZm9CdWZmZXIgPSBuZXcgRmlmb0J1ZmZlcihieXRlc1BlckZyYW1lLCBjYXBhY2l0eUluRnJhbWVzLAorICAgIG1GaWZvQnVmZmVyID0gc3RkOjptYWtlX3NoYXJlZDxGaWZvQnVmZmVySW5kaXJlY3Q+KGJ5dGVzUGVyRnJhbWUsIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ291bnRlckFkZHJlc3MsIHdyaXRlQ291bnRlckFkZHJlc3MsIGRhdGFBZGRyZXNzKTsKICAgICByZXR1cm4gQUFVRElPX09LOwogfQpAQCAtOTQsMyArOTgsMTkgQEAKICAgICByaW5nQnVmZmVyUGFyY2VsYWJsZS5zZXRGcmFtZXNQZXJCdXJzdCgxKTsKICAgICByaW5nQnVmZmVyUGFyY2VsYWJsZS5zZXRDYXBhY2l0eUluRnJhbWVzKG1DYXBhY2l0eUluRnJhbWVzKTsKIH0KKworZG91YmxlIFNoYXJlZFJpbmdCdWZmZXI6OmdldEZyYWN0aW9uYWxGdWxsbmVzcygpIGNvbnN0IHsKKyAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICBpbnQzMl90IGNhcGFjaXR5ID0gbUZpZm9CdWZmZXItPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZSAvIChkb3VibGUpIGNhcGFjaXR5OworfQorCitzdGQ6OnN0cmluZyBTaGFyZWRSaW5nQnVmZmVyOjpkdW1wKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICBpbnQzMl90IHJlYWRDb3VudGVyID0gbUZpZm9CdWZmZXItPmdldFJlYWRDb3VudGVyKCk7CisgICAgaW50MzJfdCB3cml0ZUNvdW50ZXIgPSBtRmlmb0J1ZmZlci0+Z2V0V3JpdGVDb3VudGVyKCk7CisgICAgcmVzdWx0IDw8IHN0ZDo6c2V0dygxMCkgPDwgd3JpdGVDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoMTApIDw8IHJlYWRDb3VudGVyOworICAgIHJlc3VsdCA8PCBzdGQ6OnNldHcoOCkgPDwgKHdyaXRlQ291bnRlciAtIHJlYWRDb3VudGVyKTsKKyAgICByZXR1cm4gcmVzdWx0LnN0cigpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkUmluZ0J1ZmZlci5oCmluZGV4IDc5MTY5YmMuLmMzYTliYjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZFJpbmdCdWZmZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRSaW5nQnVmZmVyLmgKQEAgLTE4LDggKzE4LDkgQEAKICNkZWZpbmUgQUFVRElPX1NIQVJFRF9SSU5HQlVGRkVSX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKICNpbmNsdWRlICJmaWZvL0ZpZm9CdWZmZXIuaCIKQEAgLTQ3LDE1ICs0OCwyNSBAQAogICAgIHZvaWQgZmlsbFBhcmNlbGFibGUoQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJmVuZHBvaW50UGFyY2VsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFJpbmdCdWZmZXJQYXJjZWxhYmxlICZyaW5nQnVmZmVyUGFyY2VsYWJsZSk7CiAKLSAgICBhbmRyb2lkOjpGaWZvQnVmZmVyICogZ2V0Rmlmb0J1ZmZlcigpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXZhaWxhYmxlIGZyYW1lcyBhcyBhIGZyYWN0aW9uIG9mIHRoZSBjYXBhY2l0eS4KKyAgICAgKiBAcmV0dXJuIGZ1bGxuZXNzIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgKi8KKyAgICBkb3VibGUgZ2V0RnJhY3Rpb25hbEZ1bGxuZXNzKCkgY29uc3Q7CisKKyAgICAvLyBkdW1wOiB3cml0ZSMgcmVhZCMgYXZhaWxhYmxlCisgICAgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkZpZm9CdWZmZXI+IGdldEZpZm9CdWZmZXIoKSB7CiAgICAgICAgIHJldHVybiBtRmlmb0J1ZmZlcjsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICBtRmlsZURlc2NyaXB0b3I7Ci0gICAgYW5kcm9pZDo6Rmlmb0J1ZmZlciAgICAgICptRmlmb0J1ZmZlciA9IG51bGxwdHI7Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU2hhcmVkTWVtb3J5ID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Rmlmb0J1ZmZlckluZGlyZWN0PiAgbUZpZm9CdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICptU2hhcmVkTWVtb3J5ID0gbnVsbHB0cjsgLy8gbW1hcAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgbVNoYXJlZE1lbW9yeVNpemVJbkJ5dGVzID0gMDsKKyAgICAvLyBzaXplIG9mIG1lbW9yeSB1c2VkIGZvciBkYXRhIHZzIGNvdW50ZXJzCiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBtRGF0YU1lbW9yeVNpemVJbkJ5dGVzID0gMDsKICAgICBhbmRyb2lkOjpmaWZvX2ZyYW1lc190ICAgIG1DYXBhY2l0eUluRnJhbWVzID0gMDsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWFjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworcGFja2FnZSB7CisgICAgLy8gU2VlOiBodHRwOi8vZ28vYW5kcm9pZC1saWNlbnNlLWZhcQorICAgIC8vIEEgbGFyZ2Utc2NhbGUtY2hhbmdlIGFkZGVkICdkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMnIHRvIGltcG9ydAorICAgIC8vIGFsbCBvZiB0aGUgJ2xpY2Vuc2Vfa2luZHMnIGZyb20gImZyYW1ld29ya3NfYXZfbGljZW5zZSIKKyAgICAvLyB0byBnZXQgdGhlIGJlbG93IGxpY2Vuc2Uga2luZHM6CisgICAgLy8gICBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbImZyYW1ld29ya3NfYXZfbGljZW5zZSJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAib2JvZXNlcnZpY2VfZnV6emVyIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJvYm9lc2VydmljZV9mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYXVkaW9mbGluZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYWF1ZGlvLWFpZGwtY3BwIiwKKyAgICAgICAgImZyYW1ld29yay1wZXJtaXNzaW9uLWFpZGwtY3BwIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2FpZGxfY29udmVyc2lvbiIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWF1ZGlvc2VydmljZSIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvb2JvZXNlcnZpY2UiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgXSwKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvUkVBRE1FLm1kIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI4NWRmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL1JFQURNRS5tZApAQCAtMCwwICsxLDY1IEBACisjIEZ1enplciBmb3IgbGliYWF1ZGlvc2VydmljZQorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgbGliYWF1ZGlvc2VydmljZSBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUKK3VuZGVyc3RhbmRpbmcgb2YgdGhlIHNlcnZpY2UgYW5kIHRyaWVzIHRvIGFjaGlldmUgdGhlIGZvbGxvd2luZzoKKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgbm90IGhhcmRjb2RlZCwgYnV0IGluc3RlYWQgc2VsZWN0ZWQgYmFzZWQgb24KK2luY29taW5nIGRhdGEuIFRoaXMgZW5zdXJlcyBtb3JlIGNvZGUgcGF0aHMgYXJlIHJlYWNoZWQgYnkgdGhlIGZ1enplci4KKworQUF1ZGlvIFNlcnZpY2UgcmVxdWVzdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBBQXVkaW9Gb3JtYXQKKzIuIFVzZXJJZAorMy4gUHJvY2Vzc0lkCis0LiBJblNlcnZpY2UKKzUuIERldmljZUlkCis2LiBTYW1wbGVSYXRlCis3LiBTYW1wbGVzUGVyRnJhbWUKKzguIERpcmVjdGlvbgorOS4gU2hhcmluZ01vZGUKKzEwLiBVc2FnZQorMTEuIENvbnRlbnRUeXBlCisxMi4gSW5wdXRQcmVzZXQKKzEzLiBCdWZmZXJDYXBhY2l0eQorCit8IFBhcmFtZXRlcnwgVmFsaWQgSW5wdXQgVmFsdWVzfCBDb25maWd1cmVkIFZhbHVlfAorfC0tLS0tLS0tLS0tLS0gfC0tLS0tLS0tLS0tLS18IC0tLS0tIHwKK3wgYEFBdWRpb0Zvcm1hdGAgfCBgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRGAsIGBBQVVESU9fRk9STUFUX1BDTV9JMTZgLCBgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVRgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBVc2VySWRgICAgfCBgSU5UMzJfTUlOYCB0byBgSU5UMzJfTUFYYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gZ2V0dWlkKCkgfAorfCBgUHJvY2Vzc0lkYCAgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIGdldHBpZCgpIHwKK3wgYEluU2VydmljZWAgICB8IGBib29sYCB8IFZhbHVlIG9idGFpbmVkIGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYERldmljZUlkYCAgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBTYW1wbGVSYXRlYCAgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBTYW1wbGVzUGVyRnJhbWVgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBEaXJlY3Rpb25gIHwgYEFBVURJT19ESVJFQ1RJT05fT1VUUFVUYCwgYEFBVURJT19ESVJFQ1RJT05fSU5QVVRgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBTaGFyaW5nTW9kZWAgfCBgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkVgLCBgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRURgIHwgVmFsdWUgY2hvc2VuIGZyb20gdmFsaWQgdmFsdWVzIGJ5IG9idGFpbmluZyBpbmRleCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8Cit8IGBVc2FnZWAgfCBgQUFVRElPX1VTQUdFX01FRElBYCwgYEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OYCwgYEFBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkdgLCBgQUFVRElPX1VTQUdFX0FMQVJNYCwgYEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05gLCBgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9SSU5HVE9ORWAsIGBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UYCwgYEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFlgLCBgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRWAsIGBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT05gLCBgQUFVRElPX1VTQUdFX0dBTUVgLCBgQUFVRElPX1VTQUdFX0FTU0lTVEFOVGAsIGBBQVVESU9fU1lTVEVNX1VTQUdFX0VNRVJHRU5DWWAsIGBBQVVESU9fU1lTVEVNX1VTQUdFX1NBRkVUWWAsIGBBQVVESU9fU1lTVEVNX1VTQUdFX1ZFSElDTEVfU1RBVFVTYCwgYEFBVURJT19TWVNURU1fVVNBR0VfQU5OT1VOQ0VNRU5UYCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgQ29udGVudFR5cGVgIHwgYEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNIYCwgYEFBVURJT19DT05URU5UX1RZUEVfTVVTSUNgLCBgQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRWAsIGBBQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTmAgfCBWYWx1ZSBjaG9zZW4gZnJvbSB2YWxpZCB2YWx1ZXMgYnkgb2J0YWluaW5nIGluZGV4IGZyb20gRnV6emVkRGF0YVByb3ZpZGVyIHwKK3wgYElucHV0UHJlc2V0YCB8IGBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUNgLCBgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVJgLCBgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTmAsIGBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT05gLCBgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRGAsIGBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFYCB8IFZhbHVlIGNob3NlbiBmcm9tIHZhbGlkIHZhbHVlcyBieSBvYnRhaW5pbmcgaW5kZXggZnJvbSBGdXp6ZWREYXRhUHJvdmlkZXIgfAorfCBgQnVmZmVyQ2FwYWNpdHlgIHwgYElOVDMyX01JTmAgdG8gYElOVDMyX01BWGAgfCBWYWx1ZSBvYnRhaW5lZCBmcm9tIEZ1enplZERhdGFQcm92aWRlciB8CisKK1RoaXMgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiBpcyBhbHdheXMgZGV0ZXJtaW5pc3RpYyBmb3IgYW55IGdpdmVuIGlucHV0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBvYm9lc2VydmljZV9mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorCisjIyMjIFN0ZXBzIHRvIGJ1aWxkCitCdWlsZCB0aGUgZnV6emVyCitgYGAKKyAgJCBtbSAtaiQobnByb2MpIG9ib2VzZXJ2aWNlX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvb2JvZXNlcnZpY2VfZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplcgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9mdXp6ZXIvb2JvZXNlcnZpY2VfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM2NjFjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvZnV6emVyL29ib2VzZXJ2aWNlX2Z1enplci5jcHAKQEAgLTAsMCArMSwzNzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworI2luY2x1ZGUgPGZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8QUF1ZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlICJhYXVkaW8vQm5BQXVkaW9DbGllbnQuaCIKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvQXR0cmlidXRpb25Tb3VyY2VTdGF0ZS5oPgorCisjZGVmaW5lIFVOVVNFRF9QQVJBTSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKK2FhdWRpb19mb3JtYXRfdCBrQUF1ZGlvRm9ybWF0c1tdID0geworICAgIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LAorICAgIEFBVURJT19GT1JNQVRfUENNX0ZMT0FULAorfTsKKworYWF1ZGlvX3VzYWdlX3Qga0FBdWRpb1VzYWdlc1tdID0geworICAgIEFBVURJT19VU0FHRV9NRURJQSwKKyAgICBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwKKyAgICBBQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAorICAgIEFBVURJT19VU0FHRV9BTEFSTSwKKyAgICBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLAorICAgIEFBVURJT19VU0FHRV9OT1RJRklDQVRJT05fUklOR1RPTkUsCisgICAgQUFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKKyAgICBBQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZLAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCisgICAgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgIEFBVURJT19VU0FHRV9HQU1FLAorICAgIEFBVURJT19VU0FHRV9BU1NJU1RBTlQsCisgICAgQUFVRElPX1NZU1RFTV9VU0FHRV9FTUVSR0VOQ1ksCisgICAgQUFVRElPX1NZU1RFTV9VU0FHRV9TQUZFVFksCisgICAgQUFVRElPX1NZU1RFTV9VU0FHRV9WRUhJQ0xFX1NUQVRVUywKKyAgICBBQVVESU9fU1lTVEVNX1VTQUdFX0FOTk9VTkNFTUVOVCwKK307CisKK2FhdWRpb19jb250ZW50X3R5cGVfdCBrQUF1ZGlvQ29udGVudFR5cGVzW10gPSB7CisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsCisgICAgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFLAorICAgIEFBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OLAorfTsKKworYWF1ZGlvX2lucHV0X3ByZXNldF90IGtBQXVkaW9JbnB1dFByZXNldHNbXSA9IHsKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0dFTkVSSUMsICAgICAgICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUiwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLCBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwgICAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSwKK307CisKK2NvbnN0IHNpemVfdCBrTnVtQUF1ZGlvRm9ybWF0cyA9IHN0ZDo6c2l6ZShrQUF1ZGlvRm9ybWF0cyk7Citjb25zdCBzaXplX3Qga051bUFBdWRpb1VzYWdlcyA9IHN0ZDo6c2l6ZShrQUF1ZGlvVXNhZ2VzKTsKK2NvbnN0IHNpemVfdCBrTnVtQUF1ZGlvQ29udGVudFR5cGVzID0gc3RkOjpzaXplKGtBQXVkaW9Db250ZW50VHlwZXMpOworY29uc3Qgc2l6ZV90IGtOdW1BQXVkaW9JbnB1dFByZXNldHMgPSBzdGQ6OnNpemUoa0FBdWRpb0lucHV0UHJlc2V0cyk7CisKK2NsYXNzIEZ1enpBQXVkaW9DbGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwdWJsaWMgQUF1ZGlvU2VydmljZUludGVyZmFjZSB7CisgICBwdWJsaWM6CisgICAgRnV6ekFBdWRpb0NsaWVudChzcDxBQXVkaW9TZXJ2aWNlPiBzZXJ2aWNlKTsKKworICAgIHZpcnR1YWwgfkZ1enpBQXVkaW9DbGllbnQoKTsKKworICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgKmdldEFBdWRpb1NlcnZpY2UoKTsKKworICAgIHZvaWQgZHJvcEFBdWRpb1NlcnZpY2UoKTsKKworICAgIHZvaWQgcmVnaXN0ZXJDbGllbnQoY29uc3Qgc3A8SUFBdWRpb0NsaWVudD4gJmNsaWVudCBVTlVTRURfUEFSQU0pIG92ZXJyaWRlIHt9CisKKyAgICBhYXVkaW9faGFuZGxlX3Qgb3BlblN0cmVhbShjb25zdCBBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb25PdXRwdXQpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNsb3NlU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlICZwYXJjZWxhYmxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydFN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSBvdmVycmlkZTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IGZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIG92ZXJyaWRlOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwgcGlkX3QgY2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcykgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgdW5yZWdpc3RlckF1ZGlvVGhyZWFkKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjbGllbnRUaHJlYWRJZCkgb3ZlcnJpZGU7CisKKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnRDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQ2xpZW50ICZjbGllbnQgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgVU5VU0VEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN0b3BDbGllbnQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSBVTlVTRURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUgVU5VU0VEX1BBUkFNKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CisgICAgfQorCisgICAgdm9pZCBvblN0cmVhbUNoYW5nZShhYXVkaW9faGFuZGxlX3QgaGFuZGxlLCBpbnQzMl90IG9wY29kZSwgaW50MzJfdCB2YWx1ZSkge30KKworICAgIGludCBnZXREZWF0aENvdW50KCkgeyByZXR1cm4gbURlYXRoQ291bnQ7IH0KKworICAgIHZvaWQgaW5jRGVhdGhDb3VudCgpIHsgKyttRGVhdGhDb3VudDsgfQorCisgICAgY2xhc3MgQUF1ZGlvQ2xpZW50IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LCBwdWJsaWMgQm5BQXVkaW9DbGllbnQgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgQUF1ZGlvQ2xpZW50KHdwPEZ1enpBQXVkaW9DbGllbnQ+IGZ1enpBQXVkaW9DbGllbnQpIDogbUJpbmRlckNsaWVudChmdXp6QUF1ZGlvQ2xpZW50KSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8gVU5VU0VEX1BBUkFNKSB7CisgICAgICAgICAgICBzcDxGdXp6QUF1ZGlvQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBjbGllbnQtPmRyb3BBQXVkaW9TZXJ2aWNlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50LT5pbmNEZWF0aENvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0cmVhbUNoYW5nZShpbnQzMl90IGhhbmRsZSwgaW50MzJfdCBvcGNvZGUsIGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lX3Y8YWF1ZGlvX2hhbmRsZV90LCBpbnQzMl90Pik7CisgICAgICAgICAgICBhbmRyb2lkOjpzcDxGdXp6QUF1ZGlvQ2xpZW50PiBjbGllbnQgPSBtQmluZGVyQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNsaWVudC0+b25TdHJlYW1DaGFuZ2UoaGFuZGxlLCBvcGNvZGUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICAgICAgfQorCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8RnV6ekFBdWRpb0NsaWVudD4gbUJpbmRlckNsaWVudDsKKyAgICB9OworCisgICBwcml2YXRlOgorICAgIHNwPEFBdWRpb1NlcnZpY2U+IG1BQXVkaW9TZXJ2aWNlOworICAgIHNwPEFBdWRpb0NsaWVudD4gbUFBdWRpb0NsaWVudDsKKyAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICptQUF1ZGlvU2VydmljZUludGVyZmFjZTsKKyAgICBpbnQgbURlYXRoQ291bnQ7Cit9OworCitGdXp6QUF1ZGlvQ2xpZW50OjpGdXp6QUF1ZGlvQ2xpZW50KHNwPEFBdWRpb1NlcnZpY2U+IHNlcnZpY2UpIDogQUF1ZGlvU2VydmljZUludGVyZmFjZSgpIHsKKyAgICBtQUF1ZGlvU2VydmljZSA9IHNlcnZpY2U7CisgICAgbUFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgPSAmc2VydmljZS0+YXNBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlKCk7CisgICAgbUFBdWRpb0NsaWVudCA9IG5ldyBBQXVkaW9DbGllbnQodGhpcyk7CisgICAgbURlYXRoQ291bnQgPSAwOworICAgIGlmIChtQUF1ZGlvQ2xpZW50LmdldCgpICYmIG1BQXVkaW9TZXJ2aWNlLmdldCgpKSB7CisgICAgICAgIG1BQXVkaW9TZXJ2aWNlLT5saW5rVG9EZWF0aChtQUF1ZGlvQ2xpZW50KTsKKyAgICAgICAgbUFBdWRpb1NlcnZpY2UtPnJlZ2lzdGVyQ2xpZW50KG1BQXVkaW9DbGllbnQpOworICAgIH0KK30KKworRnV6ekFBdWRpb0NsaWVudDo6fkZ1enpBQXVkaW9DbGllbnQoKSB7IGRyb3BBQXVkaW9TZXJ2aWNlKCk7IH0KKworQUF1ZGlvU2VydmljZUludGVyZmFjZSAqRnV6ekFBdWRpb0NsaWVudDo6Z2V0QUF1ZGlvU2VydmljZSgpIHsKKyAgICBpZiAoIW1BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICYmIG1BQXVkaW9TZXJ2aWNlLmdldCgpKSB7CisgICAgICAgIG1BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlID0gJm1BQXVkaW9TZXJ2aWNlLT5hc0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIG1BQXVkaW9TZXJ2aWNlSW50ZXJmYWNlOworfQorCit2b2lkIEZ1enpBQXVkaW9DbGllbnQ6OmRyb3BBQXVkaW9TZXJ2aWNlKCkgeworICAgIG1BQXVkaW9TZXJ2aWNlLmNsZWFyKCk7Cit9CisKK2FhdWRpb19oYW5kbGVfdCBGdXp6QUF1ZGlvQ2xpZW50OjpvcGVuU3RyZWFtKGNvbnN0IEFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uT3V0cHV0KSB7CisgICAgYWF1ZGlvX2hhbmRsZV90IHN0cmVhbTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICpzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgICAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmVhbSA9IHNlcnZpY2UtPm9wZW5TdHJlYW0ocmVxdWVzdCwgY29uZmlndXJhdGlvbk91dHB1dCk7CisKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBQVVESU9fRVJST1JfTk9fU0VSVklDRSkgeworICAgICAgICAgICAgZHJvcEFBdWRpb1NlcnZpY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdHJlYW07Cit9CisKK2FhdWRpb19yZXN1bHRfdCBGdXp6QUF1ZGlvQ2xpZW50OjpjbG9zZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAqc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+Y2xvc2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEZ1enpBQXVkaW9DbGllbnQ6OmdldFN0cmVhbURlc2NyaXB0aW9uKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgJnBhcmNlbGFibGUpIHsKKyAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICpzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmICghc2VydmljZSkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5nZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW1IYW5kbGUsIHBhcmNlbGFibGUpOworfQorCithYXVkaW9fcmVzdWx0X3QgRnV6ekFBdWRpb0NsaWVudDo6c3RhcnRTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgKnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKCFzZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2UtPnN0YXJ0U3RyZWFtKHN0cmVhbUhhbmRsZSk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBGdXp6QUF1ZGlvQ2xpZW50OjpwYXVzZVN0cmVhbShhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlKSB7CisgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAqc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+cGF1c2VTdHJlYW0oc3RyZWFtSGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEZ1enpBQXVkaW9DbGllbnQ6OnN0b3BTdHJlYW0oYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSkgeworICAgIEFBdWRpb1NlcnZpY2VJbnRlcmZhY2UgKnNlcnZpY2UgPSBnZXRBQXVkaW9TZXJ2aWNlKCk7CisgICAgaWYgKCFzZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTk9fU0VSVklDRTsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2UtPnN0b3BTdHJlYW0oc3RyZWFtSGFuZGxlKTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEZ1enpBQXVkaW9DbGllbnQ6OmZsdXNoU3RyZWFtKGFhdWRpb19oYW5kbGVfdCBzdHJlYW1IYW5kbGUpIHsKKyAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICpzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmICghc2VydmljZSkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT5mbHVzaFN0cmVhbShzdHJlYW1IYW5kbGUpOworfQorCithYXVkaW9fcmVzdWx0X3QgRnV6ekFBdWRpb0NsaWVudDo6cmVnaXN0ZXJBdWRpb1RocmVhZChhYXVkaW9faGFuZGxlX3Qgc3RyZWFtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBlcmlvZE5hbm9zZWNvbmRzKSB7CisgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAqc2VydmljZSA9IGdldEFBdWRpb1NlcnZpY2UoKTsKKyAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9OT19TRVJWSUNFOworICAgIH0KKyAgICByZXR1cm4gc2VydmljZS0+cmVnaXN0ZXJBdWRpb1RocmVhZChzdHJlYW1IYW5kbGUsIGNsaWVudFRocmVhZElkLCBwZXJpb2ROYW5vc2Vjb25kcyk7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBGdXp6QUF1ZGlvQ2xpZW50Ojp1bnJlZ2lzdGVyQXVkaW9UaHJlYWQoYWF1ZGlvX2hhbmRsZV90IHN0cmVhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY2xpZW50VGhyZWFkSWQpIHsKKyAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICpzZXJ2aWNlID0gZ2V0QUF1ZGlvU2VydmljZSgpOworICAgIGlmICghc2VydmljZSkgeworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05PX1NFUlZJQ0U7CisgICAgfQorICAgIHJldHVybiBzZXJ2aWNlLT51bnJlZ2lzdGVyQXVkaW9UaHJlYWQoc3RyZWFtSGFuZGxlLCBjbGllbnRUaHJlYWRJZCk7Cit9CisKK2NsYXNzIE9ib2VzZXJ2aWNlRnV6emVyIHsKKyAgIHB1YmxpYzoKKyAgICBPYm9lc2VydmljZUZ1enplcigpOworICAgIH5PYm9lc2VydmljZUZ1enplcigpID0gZGVmYXVsdDsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICBwcml2YXRlOgorICAgIHNwPEZ1enpBQXVkaW9DbGllbnQ+IG1DbGllbnQ7Cit9OworCitPYm9lc2VydmljZUZ1enplcjo6T2JvZXNlcnZpY2VGdXp6ZXIoKSB7CisgICAgc3A8QUF1ZGlvU2VydmljZT4gc2VydmljZSA9IG5ldyBBQXVkaW9TZXJ2aWNlKCk7CisgICAgbUNsaWVudCA9IG5ldyBGdXp6QUF1ZGlvQ2xpZW50KHNlcnZpY2UpOworfQorCit2b2lkIE9ib2VzZXJ2aWNlRnV6emVyOjpwcm9jZXNzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGZkcCA9IEZ1enplZERhdGFQcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBBQXVkaW9TdHJlYW1SZXF1ZXN0IHJlcXVlc3Q7CisgICAgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uT3V0cHV0OworCisgICAgLy8gSW5pdGlhbGl6ZSBzdHJlYW0gcmVxdWVzdAorICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdCgoYXVkaW9fZm9ybWF0X3QpKAorICAgICAgICBmZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgIDoga0FBdWRpb0Zvcm1hdHNbZmRwLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8aW50MzJfdD4oMCwga051bUFBdWRpb0Zvcm1hdHMgLSAxKV0pKTsKKworICAgIC8vIFRPRE8gYi8xODIzOTI3Njk6IHVzZSBhdHRyaWJ1dGlvbiBzb3VyY2UgdXRpbAorICAgIGFuZHJvaWQ6OmNvbnRlbnQ6OkF0dHJpYnV0aW9uU291cmNlU3RhdGUgYXR0cmlidXRpb25Tb3VyY2U7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudWlkID0gZ2V0dWlkKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UucGlkID0gZ2V0cGlkKCk7CisgICAgYXR0cmlidXRpb25Tb3VyY2UudG9rZW4gPSBzcDxCQmluZGVyPjo6bWFrZSgpOworICAgIHJlcXVlc3Quc2V0QXR0cmlidXRpb25Tb3VyY2UoYXR0cmlidXRpb25Tb3VyY2UpOworICAgIHJlcXVlc3Quc2V0SW5TZXJ2aWNlKGZkcC5Db25zdW1lQm9vbCgpKTsKKworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERldmljZUlkKGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2FtcGxlUmF0ZShmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZShmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkpOworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldERpcmVjdGlvbigKKyAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZmRwLkNvbnN1bWVCb29sKCkgPyBBQVVESU9fRElSRUNUSU9OX09VVFBVVCA6IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZSgKKyAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkKKyAgICAgICAgICAgID8gZmRwLkNvbnN1bWVJbnRlZ3JhbDxpbnQzMl90PigpCisgICAgICAgICAgICA6IChmZHAuQ29uc3VtZUJvb2woKSA/IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFIDogQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpKTsKKworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFVzYWdlKAorICAgICAgICBmZHAuQ29uc3VtZUJvb2woKQorICAgICAgICAgICAgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgIDoga0FBdWRpb1VzYWdlc1tmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCBrTnVtQUF1ZGlvVXNhZ2VzIC0gMSldKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRDb250ZW50VHlwZSgKKyAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrQUF1ZGlvQ29udGVudFR5cGVzW2ZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBrTnVtQUF1ZGlvQ29udGVudFR5cGVzIC0gMSldKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRJbnB1dFByZXNldCgKKyAgICAgICAgZmRwLkNvbnN1bWVCb29sKCkgPyBmZHAuQ29uc3VtZUludGVncmFsPGludDMyX3Q+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrQUF1ZGlvSW5wdXRQcmVzZXRzW2ZkcC5Db25zdW1lSW50ZWdyYWxJblJhbmdlPGludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBrTnVtQUF1ZGlvSW5wdXRQcmVzZXRzIC0gMSldKTsKKyAgICByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRQcml2YWN5U2Vuc2l0aXZlKGZkcC5Db25zdW1lQm9vbCgpKTsKKworICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEJ1ZmZlckNhcGFjaXR5KGZkcC5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKSk7CisKKyAgICBhYXVkaW9faGFuZGxlX3Qgc3RyZWFtID0gbUNsaWVudC0+b3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKKyAgICBpZiAoc3RyZWFtIDwgMCkgeworICAgICAgICAvLyBpbnZhbGlkIHJlcXVlc3QsIHN0cmVhbSBub3Qgb3BlbmVkLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdoaWxlIChmZHAucmVtYWluaW5nX2J5dGVzKCkpIHsKKyAgICAgICAgQXVkaW9FbmRwb2ludFBhcmNlbGFibGUgYXVkaW9FbmRwb2ludFBhcmNlbGFibGU7CisgICAgICAgIGludCBhY3Rpb24gPSBmZHAuQ29uc3VtZUludGVncmFsSW5SYW5nZTxpbnQzMl90PigwLCA0KTsKKyAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBtQ2xpZW50LT5nZXRTdHJlYW1EZXNjcmlwdGlvbihzdHJlYW0sIGF1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBtQ2xpZW50LT5zdGFydFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIG1DbGllbnQtPnBhdXNlU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgbUNsaWVudC0+c3RvcFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIG1DbGllbnQtPmZsdXNoU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNsaWVudC0+Y2xvc2VTdHJlYW0oc3RyZWFtKTsKKyAgICBhc3NlcnQobUNsaWVudC0+Z2V0RGVhdGhDb3VudCgpID09IDApOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBPYm9lc2VydmljZUZ1enplciBvYm9lc2VydmljZUZ1enplcjsKKyAgICBvYm9lc2VydmljZUZ1enplci5wcm9jZXNzKGRhdGEsIHNpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMWM4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNDUgQEAKK3BhY2thZ2UgeworICAgIC8vIFNlZTogaHR0cDovL2dvL2FuZHJvaWQtbGljZW5zZS1mYXEKKyAgICAvLyBBIGxhcmdlLXNjYWxlLWNoYW5nZSBhZGRlZCAnZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzJyB0byBpbXBvcnQKKyAgICAvLyBhbGwgb2YgdGhlICdsaWNlbnNlX2tpbmRzJyBmcm9tICJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiCisgICAgLy8gdG8gZ2V0IHRoZSBiZWxvdyBsaWNlbnNlIGtpbmRzOgorICAgIC8vICAgU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAorICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJmcmFtZXdvcmtzX2F2X2xpY2Vuc2UiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAidHZfdHVuZXJfYWlkbCIsCisgICAgc3JjczogWworICAgICAgICAiYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyLyouYWlkbCIsCisgICAgXSwKKyAgICBwYXRoOiAiYWlkbCIsCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogInR2X3R1bmVyX2Zyb250ZW5kX2luZm8iLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSW5mby5haWRsIiwKKyAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kKkNhcGFiaWxpdGllcy5haWRsIiwKKyAgICBdLAorICAgIHBhdGg6ICJhaWRsIiwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZSIsCisgICAgdW5zdGFibGU6IHRydWUsCisgICAgbG9jYWxfaW5jbHVkZV9kaXI6ICJhaWRsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6dHZfdHVuZXJfYWlkbCIsCisgICAgXSwKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi1WMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEtVjEiLAorICAgIF0sCisKKyAgICBiYWNrZW5kOiB7CisgICAgICAgIGphdmE6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBjcHA6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgICAgICBuZGs6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgfSwKK30KKworYWlkbF9pbnRlcmZhY2UgeworICAgIG5hbWU6ICJ0dl90dW5lcl9mcm9udGVuZF9pbmZvX2FpZGxfaW50ZXJmYWNlIiwKKyAgICB1bnN0YWJsZTogdHJ1ZSwKKyAgICBsb2NhbF9pbmNsdWRlX2RpcjogImFpZGwiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjp0dl90dW5lcl9mcm9udGVuZF9pbmZvIiwKKyAgICBdLAorCisgICAgYmFja2VuZDogeworICAgICAgICBqYXZhOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBjcHA6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgIH0sCisgICAgICAgIG5kazogeworICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlidHVuZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlR1bmVyKi5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS50di50dW5lckAxLjEiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgICAgICAidHZfdHVuZXJfcmVzb3VyY2VfbWFuYWdlcl9haWRsX2ludGVyZmFjZS1jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLVYxLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJsaWJhaWRsY29tbW9uc3VwcG9ydCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIgorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KKworCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtZWRpYXR1bmVyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1haW5fdHVuZXJzZXJ2aWNlLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyQDEuMSIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnR1bmVyc2VydmljZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLW5ka19wbGF0Zm9ybSIsCisgICAgICAgICJ0dl90dW5lcl9yZXNvdXJjZV9tYW5hZ2VyX2FpZGxfaW50ZXJmYWNlLWNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJ0dl90dW5lcl9haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAorICAgIF0sCisKKyAgICBpbml0X3JjOiBbIm1lZGlhdHVuZXIucmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL09XTkVSUyBiL3NlcnZpY2VzL3R1bmVyL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ViOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorbmNoYWxrb0Bnb29nbGUuY29tCitxdXhpYW5nZmFuZ0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjIzNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmNwcApAQCAtMCwwICsxLDIzMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEZW11eCIKKworI2luY2x1ZGUgIlR1bmVyRHZyLmgiCisjaW5jbHVkZSAiVHVuZXJEZW11eC5oIgorI2luY2x1ZGUgIlR1bmVyVGltZUZpbHRlci5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhNbXRwRmlsdGVyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUbHZGaWx0ZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RHZyVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyRGVtdXg6OlR1bmVyRGVtdXgoc3A8SURlbXV4PiBkZW11eCwgaW50IGlkKSB7CisgICAgbURlbXV4ID0gZGVtdXg7CisgICAgbURlbXV4SWQgPSBpZDsKK30KKworVHVuZXJEZW11eDo6flR1bmVyRGVtdXgoKSB7CisgICAgbURlbXV4ID0gbnVsbHB0cjsKK30KKworU3RhdHVzIFR1bmVyRGVtdXg6OnNldEZyb250ZW5kRGF0YVNvdXJjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBmcm9udGVuZCkgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGludCBmcm9udGVuZElkOworICAgIGZyb250ZW5kLT5nZXRGcm9udGVuZElkKCZmcm9udGVuZElkKTsKKyAgICBSZXN1bHQgcmVzID0gbURlbXV4LT5zZXRGcm9udGVuZERhdGFTb3VyY2UoZnJvbnRlbmRJZCk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckRlbXV4OjpvcGVuRmlsdGVyKAorICAgICAgICBpbnQgdHlwZSwgaW50IHN1YlR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+JiBjYiwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmIChtRGVtdXggPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlbXV4IGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBEZW11eEZpbHRlck1haW5UeXBlIG1haW5UeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhGaWx0ZXJNYWluVHlwZT4odHlwZSk7CisgICAgRGVtdXhGaWx0ZXJUeXBlIGZpbHRlclR5cGUgeworICAgICAgICAubWFpblR5cGUgPSBtYWluVHlwZSwKKyAgICB9OworCisgICAgc3dpdGNoKG1haW5UeXBlKSB7CisgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFM6CisgICAgICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUudHNGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4VHNGaWx0ZXJUeXBlPihzdWJUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpNTVRQOgorICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLm1tdHBGaWx0ZXJUeXBlKHN0YXRpY19jYXN0PERlbXV4TW10cEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERlbXV4RmlsdGVyTWFpblR5cGU6OklQOgorICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLmlwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eElwRmlsdGVyVHlwZT4oc3ViVHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJNYWluVHlwZTo6VExWOgorICAgICAgICAgICAgZmlsdGVyVHlwZS5zdWJUeXBlLnRsdkZpbHRlclR5cGUoc3RhdGljX2Nhc3Q8RGVtdXhUbHZGaWx0ZXJUeXBlPihzdWJUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZW11eEZpbHRlck1haW5UeXBlOjpBTFA6CisgICAgICAgICAgICBmaWx0ZXJUeXBlLnN1YlR5cGUuYWxwRmlsdGVyVHlwZShzdGF0aWNfY2FzdDxEZW11eEFscEZpbHRlclR5cGU+KHN1YlR5cGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBSZXN1bHQgc3RhdHVzOworICAgIHNwPElGaWx0ZXI+IGZpbHRlclNwOworICAgIHNwPElGaWx0ZXJDYWxsYmFjaz4gY2JTcCA9IG5ldyBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2soY2IpOworICAgIG1EZW11eC0+b3BlbkZpbHRlcihmaWx0ZXJUeXBlLCBidWZmZXJTaXplLCBjYlNwLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyU3AgPSBmaWx0ZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGaWx0ZXI+KGZpbHRlclNwLCB0eXBlLCBzdWJUeXBlKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEZW11eDo6b3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXM7CisgICAgc3A8SVRpbWVGaWx0ZXI+IGZpbHRlclNwOworICAgIG1EZW11eC0+b3BlblRpbWVGaWx0ZXIoWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJVGltZUZpbHRlcj4mIGZpbHRlcikgeworICAgICAgICBmaWx0ZXJTcCA9IGZpbHRlcjsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyVGltZUZpbHRlcj4oZmlsdGVyU3ApOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNId0lkKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgdHVuZXJGaWx0ZXIsIGludCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHVpbnQzMl90IGF2U3luY0h3SWQ7CisgICAgUmVzdWx0IHJlczsKKyAgICBzcDxJRmlsdGVyPiBoYWxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KHR1bmVyRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgbURlbXV4LT5nZXRBdlN5bmNId0lkKGhhbEZpbHRlciwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgaWQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSByOworICAgICAgICAgICAgICAgIGF2U3luY0h3SWQgPSBpZDsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gKGludClhdlN5bmNId0lkOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckRlbXV4OjpnZXRBdlN5bmNUaW1lKGludCBhdlN5bmNId0lkLCBpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgdWludDY0X3QgdGltZTsKKyAgICBSZXN1bHQgcmVzOworICAgIG1EZW11eC0+Z2V0QXZTeW5jVGltZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXZTeW5jSHdJZCksCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IHRzKSB7CisgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgICAgICB0aW1lID0gdHM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KXRpbWU7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRGVtdXg6Om9wZW5EdnIoaW50IGR2clR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiYgY2IsCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRHZyPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXM7CisgICAgc3A8SUR2ckNhbGxiYWNrPiBjYWxsYmFjayA9IG5ldyBUdW5lckR2cjo6RHZyQ2FsbGJhY2soY2IpOworICAgIHNwPElEdnI+IGhpZGxEdnI7CisgICAgbURlbXV4LT5vcGVuRHZyKHN0YXRpY19jYXN0PER2clR5cGU+KGR2clR5cGUpLCBidWZmZXJTaXplLCBjYWxsYmFjaywKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUR2cj4mIGR2cikgeworICAgICAgICAgICAgICAgIGhpZGxEdnIgPSBkdnI7CisgICAgICAgICAgICAgICAgcmVzID0gcjsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSBOVUxMOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgKl9haWRsX3JldHVybiA9IDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyRHZyPihoaWRsRHZyLCBkdnJUeXBlKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEZW11eDo6Y29ubmVjdENpQ2FtKGludCBjaUNhbUlkKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPmNvbm5lY3RDaUNhbShzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2lDYW1JZCkpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRGVtdXg6OmRpc2Nvbm5lY3RDaUNhbSgpIHsKKyAgICBpZiAobURlbXV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZW11eCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1EZW11eC0+ZGlzY29ubmVjdENpQ2FtKCk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEZW11eDo6Y2xvc2UoKSB7CisgICAgaWYgKG1EZW11eCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVtdXggaXMgbm90IGluaXRpYWxpemVkLiIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXMgPSBtRGVtdXgtPmNsb3NlKCk7CisgICAgbURlbXV4ID0gTlVMTDsKKworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE5ODM2YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVtdXguaApAQCAtMCwwICsxLDY4IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJEZW11eC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckRlbXV4OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEdnI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckR2ckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyVGltZUZpbHRlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlbXV4OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRHZyQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUaW1lRmlsdGVyOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFR1bmVyRGVtdXggOiBwdWJsaWMgQm5UdW5lckRlbXV4IHsKKworcHVibGljOgorICAgIFR1bmVyRGVtdXgoc3A8SURlbXV4PiBkZW11eCwgaW50IGRlbXV4SWQpOworICAgIHZpcnR1YWwgflR1bmVyRGVtdXgoKTsKKyAgICBTdGF0dXMgc2V0RnJvbnRlbmREYXRhU291cmNlKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+JiBmcm9udGVuZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5GaWx0ZXIoCisgICAgICAgIGludCBtYWluVHlwZSwgaW50IHN1YnR5cGUsIGludCBidWZmZXJTaXplLCBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiYgY2IsCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3BlblRpbWVGaWx0ZXIoc2hhcmVkX3B0cjxJVHVuZXJUaW1lRmlsdGVyPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0QXZTeW5jSHdJZChjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIHR1bmVyRmlsdGVyLCBpbnQqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEF2U3luY1RpbWUoaW50IGF2U3luY0h3SWQsIGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5EdnIoCisgICAgICAgIGludCBkdmJUeXBlLCBpbnQgYnVmZmVyU2l6ZSwgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJEdnJDYWxsYmFjaz4mIGNiLAorICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2cj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNvbm5lY3RDaUNhbShpbnQgY2lDYW1JZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGRpc2Nvbm5lY3RDaUNhbSgpIG92ZXJyaWRlOworICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgaW50IGdldElkKCkgeyByZXR1cm4gbURlbXV4SWQ7IH0KKworcHJpdmF0ZToKKyAgICBzcDxJRGVtdXg+IG1EZW11eDsKKyAgICBpbnQgbURlbXV4SWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSREVNVVhfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FlMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJEZXNjcmFtYmxlci5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVyRGVzY3JhbWJsZXIiCisKKyNpbmNsdWRlICJUdW5lckZpbHRlci5oIgorI2luY2x1ZGUgIlR1bmVyRGVtdXguaCIKKyNpbmNsdWRlICJUdW5lckRlc2NyYW1ibGVyLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyRGVzY3JhbWJsZXI6OlR1bmVyRGVzY3JhbWJsZXIoc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcikgeworICAgIG1EZXNjcmFtYmxlciA9IGRlc2NyYW1ibGVyOworfQorCitUdW5lckRlc2NyYW1ibGVyOjp+VHVuZXJEZXNjcmFtYmxlcigpIHsKKyAgICBtRGVzY3JhbWJsZXIgPSBudWxscHRyOworfQorCitTdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6c2V0RGVtdXhTb3VyY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgZGVtdXgpIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5zZXREZW11eFNvdXJjZShzdGF0aWNfY2FzdDxUdW5lckRlbXV4Kj4oZGVtdXguZ2V0KCkpLT5nZXRJZCgpKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OnNldEtleVRva2VuKGNvbnN0IHZlY3Rvcjx1aW50OF90PiYga2V5VG9rZW4pIHsKKyAgICBpZiAobURlc2NyYW1ibGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklEZXNjcmFtYmxlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5zZXRLZXlUb2tlbihrZXlUb2tlbik7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckRlc2NyYW1ibGVyOjphZGRQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIG9wdGlvbmFsU291cmNlRmlsdGVyKSB7CisgICAgaWYgKG1EZXNjcmFtYmxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRGVzY3JhbWJsZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgc3A8SUZpbHRlcj4gaGFsRmlsdGVyID0gKG9wdGlvbmFsU291cmNlRmlsdGVyID09IE5VTEwpCisgICAgICAgICAgICA/IE5VTEwgOiBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KG9wdGlvbmFsU291cmNlRmlsdGVyLmdldCgpKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgUmVzdWx0IHJlcyA9IG1EZXNjcmFtYmxlci0+YWRkUGlkKGdldEhpZGxEZW11eFBpZChwaWQpLCBoYWxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEZXNjcmFtYmxlcjo6cmVtb3ZlUGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCwKKyAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIHNwPElGaWx0ZXI+IGhhbEZpbHRlciA9IChvcHRpb25hbFNvdXJjZUZpbHRlciA9PSBOVUxMKQorICAgICAgICAgICAgPyBOVUxMIDogc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPihvcHRpb25hbFNvdXJjZUZpbHRlci5nZXQoKSktPmdldEhhbEZpbHRlcigpOworICAgIFJlc3VsdCByZXMgPSBtRGVzY3JhbWJsZXItPnJlbW92ZVBpZChnZXRIaWRsRGVtdXhQaWQocGlkKSwgaGFsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRGVzY3JhbWJsZXI6OmNsb3NlKCkgeworICAgIGlmIChtRGVzY3JhbWJsZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSURlc2NyYW1ibGVyIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbURlc2NyYW1ibGVyLT5jbG9zZSgpOworICAgIG1EZXNjcmFtYmxlciA9IE5VTEw7CisKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK0RlbXV4UGlkIFR1bmVyRGVzY3JhbWJsZXI6OmdldEhpZGxEZW11eFBpZChjb25zdCBUdW5lckRlbXV4UGlkJiBwaWQpIHsKKyAgICBEZW11eFBpZCBoaWRsUGlkOworICAgIHN3aXRjaCAocGlkLmdldFRhZygpKSB7CisgICAgICAgIGNhc2UgVHVuZXJEZW11eFBpZDo6dFBpZDogeworICAgICAgICAgICAgaGlkbFBpZC50UGlkKCh1aW50MTZfdClwaWQuZ2V0PFR1bmVyRGVtdXhQaWQ6OnRQaWQ+KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckRlbXV4UGlkOjptbXRwUGlkOiB7CisgICAgICAgICAgICBoaWRsUGlkLm1tdHBQaWQoKHVpbnQxNl90KXBpZC5nZXQ8VHVuZXJEZW11eFBpZDo6bW10cFBpZD4oKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGlkbFBpZDsKK30KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckRlc2NyYW1ibGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3MGZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRGVzY3JhbWJsZXIuaApAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSREVTQ1JBTUJMRVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSREVTQ1JBTUJMRVJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJEZXNjcmFtYmxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckRlc2NyYW1ibGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZW11eDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRmlsdGVyOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckRlbXV4UGlkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFBpZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFR1bmVyRGVzY3JhbWJsZXIgOiBwdWJsaWMgQm5UdW5lckRlc2NyYW1ibGVyIHsKKworcHVibGljOgorICAgIFR1bmVyRGVzY3JhbWJsZXIoc3A8SURlc2NyYW1ibGVyPiBkZXNjcmFtYmxlcik7CisgICAgdmlydHVhbCB+VHVuZXJEZXNjcmFtYmxlcigpOworICAgIFN0YXR1cyBzZXREZW11eFNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckRlbXV4PiYgZGVtdXgpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRLZXlUb2tlbihjb25zdCB2ZWN0b3I8dWludDhfdD4mIGtleVRva2VuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgYWRkUGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCwKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgb3B0aW9uYWxTb3VyY2VGaWx0ZXIpIG92ZXJyaWRlOworICAgIFN0YXR1cyByZW1vdmVQaWQoY29uc3QgVHVuZXJEZW11eFBpZCYgcGlkLAorICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBvcHRpb25hbFNvdXJjZUZpbHRlcikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNsb3NlKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgRGVtdXhQaWQgZ2V0SGlkbERlbXV4UGlkKGNvbnN0IFR1bmVyRGVtdXhQaWQmIHBpZCk7CisKKyAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJERVNDUkFNQkxFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI0ZTA3YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJEdnIiCisKKyNpbmNsdWRlIDxmbXEvQ29udmVydE1RRGVzY3JpcHRvcnMuaD4KKyNpbmNsdWRlICJUdW5lckR2ci5oIgorI2luY2x1ZGUgIlR1bmVyRmlsdGVyLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGF0YUZvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyRHZyOjpUdW5lckR2cihzcDxJRHZyPiBkdnIsIGludCB0eXBlKSB7CisgICAgbUR2ciA9IGR2cjsKKyAgICBtVHlwZSA9IHN0YXRpY19jYXN0PER2clR5cGU+KHR5cGUpOworfQorCitUdW5lckR2cjo6flR1bmVyRHZyKCkgeworICAgIG1EdnIgPSBOVUxMOworfQorCitTdGF0dXMgVHVuZXJEdnI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUR2ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIE1RRGVzYyBkdnJNUURlc2M7CisgICAgUmVzdWx0IHJlczsKKyAgICBtRHZyLT5nZXRRdWV1ZURlc2MoWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2MmIGRlc2MpIHsKKyAgICAgICAgZHZyTVFEZXNjID0gZGVzYzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgQWlkbE1RRGVzYyBhaWRsTVFEZXNjOworICAgIHVuc2FmZUhpZGxUb0FpZGxNUURlc2NyaXB0b3I8dWludDhfdCwgaW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+KAorICAgICAgICAgICAgICAgIGR2ck1RRGVzYywgICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEdnI6OmNvbmZpZ3VyZShjb25zdCBUdW5lckR2clNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGlmIChtRHZyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1EdnItPmNvbmZpZ3VyZShnZXRIaWRsRHZyU2V0dGluZ3NGcm9tQWlkbChzZXR0aW5ncykpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEdnI6OmF0dGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgeworICAgIGlmIChtRHZyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSVR1bmVyRmlsdGVyKiB0dW5lckZpbHRlciA9IGZpbHRlci5nZXQoKTsKKyAgICBzcDxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlciktPmdldEhhbEZpbHRlcigpOworICAgIGlmIChoaWRsRmlsdGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIFJlc3VsdCByZXMgPSBtRHZyLT5hdHRhY2hGaWx0ZXIoaGlkbEZpbHRlcik7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckR2cjo6ZGV0YWNoRmlsdGVyKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyPiYgZmlsdGVyKSB7CisgICAgaWYgKG1EdnIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBJVHVuZXJGaWx0ZXIqIHR1bmVyRmlsdGVyID0gZmlsdGVyLmdldCgpOworICAgIHNwPElGaWx0ZXI+IGhpZGxGaWx0ZXIgPSBzdGF0aWNfY2FzdDxUdW5lckZpbHRlcio+KHR1bmVyRmlsdGVyKS0+Z2V0SGFsRmlsdGVyKCk7CisgICAgaWYgKGhpZGxGaWx0ZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1EdnItPmRldGFjaEZpbHRlcihoaWRsRmlsdGVyKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRHZyOjpzdGFydCgpIHsKKyAgICBpZiAobUR2ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJRHZyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXMgPSBtRHZyLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEdnI6OnN0b3AoKSB7CisgICAgaWYgKG1EdnIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUR2ci0+c3RvcCgpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJEdnI6OmZsdXNoKCkgeworICAgIGlmIChtRHZyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklEdnIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1EdnItPmZsdXNoKCk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIDo6bmRrOjpTY29wZWRBU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckR2cjo6Y2xvc2UoKSB7CisgICAgaWYgKG1EdnIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUR2ciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUR2ci0+Y2xvc2UoKTsKKyAgICBtRHZyID0gTlVMTDsKKworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitEdnJTZXR0aW5ncyBUdW5lckR2cjo6Z2V0SGlkbER2clNldHRpbmdzRnJvbUFpZGwoVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncykgeworICAgIER2clNldHRpbmdzIHM7CisgICAgc3dpdGNoIChtVHlwZSkgeworICAgICAgICBjYXNlIER2clR5cGU6OlBMQVlCQUNLOiB7CisgICAgICAgICAgICBzLnBsYXliYWNrKHsKKyAgICAgICAgICAgICAgICAuc3RhdHVzTWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnN0YXR1c01hc2spLAorICAgICAgICAgICAgICAgIC5sb3dUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MubG93VGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuaGlnaFRocmVzaG9sZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXR0aW5ncy5oaWdoVGhyZXNob2xkKSwKKyAgICAgICAgICAgICAgICAuZGF0YUZvcm1hdCA9IHN0YXRpY19jYXN0PERhdGFGb3JtYXQ+KHNldHRpbmdzLmRhdGFGb3JtYXQpLAorICAgICAgICAgICAgICAgIC5wYWNrZXRTaXplID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oc2V0dGluZ3MucGFja2V0U2l6ZSksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgICAgIGNhc2UgRHZyVHlwZTo6UkVDT1JEOiB7CisgICAgICAgICAgICBzLnJlY29yZCh7CisgICAgICAgICAgICAgICAgLnN0YXR1c01hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PihzZXR0aW5ncy5zdGF0dXNNYXNrKSwKKyAgICAgICAgICAgICAgICAubG93VGhyZXNob2xkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNldHRpbmdzLmxvd1RocmVzaG9sZCksCisgICAgICAgICAgICAgICAgLmhpZ2hUaHJlc2hvbGQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2V0dGluZ3MuaGlnaFRocmVzaG9sZCksCisgICAgICAgICAgICAgICAgLmRhdGFGb3JtYXQgPSBzdGF0aWNfY2FzdDxEYXRhRm9ybWF0PihzZXR0aW5ncy5kYXRhRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAucGFja2V0U2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBhY2tldFNpemUpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvLy8vLy8vLy8vLy8vLy8gSUR2ckNhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1JldHVybjx2b2lkPiBUdW5lckR2cjo6RHZyQ2FsbGJhY2s6Om9uUmVjb3JkU3RhdHVzKGNvbnN0IFJlY29yZFN0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25SZWNvcmRTdGF0dXMoc3RhdGljX2Nhc3Q8aW50PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IFR1bmVyRHZyOjpEdnJDYWxsYmFjazo6b25QbGF5YmFja1N0YXR1cyhjb25zdCBQbGF5YmFja1N0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRHZyQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICBtVHVuZXJEdnJDYWxsYmFjay0+b25QbGF5YmFja1N0YXR1cyhzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRHZyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDhlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckR2ci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJEVlJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRFZSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRHZyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorCisjaW5jbHVkZSA8VHVuZXJGaWx0ZXIuaD4KKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6R3JhbnRvckRlc2NyaXB0b3I7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246OmZtcTo6TVFEZXNjcmlwdG9yOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lckR2cjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRHZyQ2FsbGJhY2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJEdnJTZXR0aW5nczsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RHZyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkR2clR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEdnI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEdnJDYWxsYmFjazsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UGxheWJhY2tTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlY29yZFN0YXR1czsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OwordXNpbmcgQWlkbE1RRGVzYyA9IE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK2NsYXNzIFR1bmVyRHZyIDogcHVibGljIEJuVHVuZXJEdnIgeworCitwdWJsaWM6CisgICAgVHVuZXJEdnIoc3A8SUR2cj4gZHZyLCBpbnQgdHlwZSk7CisgICAgflR1bmVyRHZyKCk7CisKKyAgICBTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgY29uZmlndXJlKGNvbnN0IFR1bmVyRHZyU2V0dGluZ3MmIHNldHRpbmdzKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBhdHRhY2hGaWx0ZXIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJGaWx0ZXI+JiBmaWx0ZXIpIG92ZXJyaWRlOworCisgICAgU3RhdHVzIGRldGFjaEZpbHRlcihjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgc3RhcnQoKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBzdG9wKCkgb3ZlcnJpZGU7CisKKyAgICBTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKworICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCisgICAgc3RydWN0IER2ckNhbGxiYWNrIDogcHVibGljIElEdnJDYWxsYmFjayB7CisgICAgICAgIER2ckNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRHZyQ2FsbGJhY2s+IHR1bmVyRHZyQ2FsbGJhY2spCisgICAgICAgICAgICAgICAgOiBtVHVuZXJEdnJDYWxsYmFjayh0dW5lckR2ckNhbGxiYWNrKSB7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvblJlY29yZFN0YXR1cyhjb25zdCBSZWNvcmRTdGF0dXMgc3RhdHVzKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25QbGF5YmFja1N0YXR1cyhjb25zdCBQbGF5YmFja1N0YXR1cyBzdGF0dXMpOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzaGFyZWRfcHRyPElUdW5lckR2ckNhbGxiYWNrPiBtVHVuZXJEdnJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIER2clNldHRpbmdzIGdldEhpZGxEdnJTZXR0aW5nc0Zyb21BaWRsKFR1bmVyRHZyU2V0dGluZ3Mgc2V0dGluZ3MpOworCisgICAgc3A8SUR2cj4gbUR2cjsKKyAgICBEdnJUeXBlIG1UeXBlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkRWUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5ZmQzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmNwcApAQCAtMCwwICsxLDkxMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJGaWx0ZXIiCisKKyNpbmNsdWRlICJUdW5lckZpbHRlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwTGVuZ3RoVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNYWluVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhJcEFkZHJlc3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cFBpZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhSZWNvcmRTY0luZGV4VHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhTdHJlYW1JZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhUc0ZpbHRlclR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6QXVkaW9TdHJlYW1UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpDb25zdGFudDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6VmlkZW9TdHJlYW1UeXBlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK1R1bmVyRmlsdGVyOjpUdW5lckZpbHRlcigKKyAgICAgICAgc3A8SUZpbHRlcj4gZmlsdGVyLCBpbnQgbWFpblR5cGUsIGludCBzdWJUeXBlKSB7CisgICAgbUZpbHRlciA9IGZpbHRlcjsKKyAgICBtRmlsdGVyXzFfMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZpbHRlcjo6Y2FzdEZyb20oZmlsdGVyKTsKKyAgICBtTWFpblR5cGUgPSBtYWluVHlwZTsKKyAgICBtU3ViVHlwZSA9IHN1YlR5cGU7Cit9CisKK1R1bmVyRmlsdGVyOjp+VHVuZXJGaWx0ZXIoKSB7CisgICAgbUZpbHRlciA9IG51bGxwdHI7CisgICAgbUZpbHRlcl8xXzEgPSBudWxscHRyOworfQorCitTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldFF1ZXVlRGVzYyhBaWRsTVFEZXNjKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZpbHRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIE1RRGVzYyBmaWx0ZXJNUURlc2M7CisgICAgUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyLT5nZXRRdWV1ZURlc2MoWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2MmIGRlc2MpIHsKKyAgICAgICAgZmlsdGVyTVFEZXNjID0gZGVzYzsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgQWlkbE1RRGVzYyBhaWRsTVFEZXNjOworICAgIHVuc2FmZUhpZGxUb0FpZGxNUURlc2NyaXB0b3I8dWludDhfdCwgaW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+KAorICAgICAgICAgICAgICAgIGZpbHRlck1RRGVzYywgICZhaWRsTVFEZXNjKTsKKyAgICAqX2FpZGxfcmV0dXJuID0gbW92ZShhaWRsTVFEZXNjKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyLT5nZXRJZChbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGZpbHRlcklkKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIG1JZCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgKl9haWRsX3JldHVybiA9IG1JZDsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGaWx0ZXI6OmdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXM7CisgICAgbUZpbHRlcl8xXzEtPmdldElkNjRCaXQoWyZdKFJlc3VsdCByLCB1aW50NjRfdCBmaWx0ZXJJZCkgeworICAgICAgICByZXMgPSByOworICAgICAgICBtSWQ2NEJpdCA9IGZpbHRlcklkOworICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkNjRCaXQ7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRmlsdGVyOjpjb25maWd1cmUoY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcpIHsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIERlbXV4RmlsdGVyU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc3dpdGNoIChjb25maWcuZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRzOiB7CisgICAgICAgICAgICBnZXRIaWRsVHNTZXR0aW5ncyhjb25maWcsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjptbXRwOiB7CisgICAgICAgICAgICBnZXRIaWRsTW10cFNldHRpbmdzKGNvbmZpZywgc2V0dGluZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OmlwOiB7CisgICAgICAgICAgICBnZXRIaWRsSXBTZXR0aW5ncyhjb25maWcsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjp0bHY6IHsKKyAgICAgICAgICAgIGdldEhpZGxUbHZTZXR0aW5ncyhjb25maWcsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjphbHA6IHsKKyAgICAgICAgICAgIGdldEhpZGxBbHBTZXR0aW5ncyhjb25maWcsIHNldHRpbmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNvbmZpZ3VyZShzZXR0aW5ncyk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQgbW9uaXRvckV2ZW50VHlwZSkgeworICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZU1vbml0b3JFdmVudChtb25pdG9yRXZlbnRUeXBlKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZpbHRlcjo6Y29uZmlndXJlSXBGaWx0ZXJDb250ZXh0SWQoaW50IGNpZCkgeworICAgIGlmIChtRmlsdGVyXzFfMSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUlwQ2lkKGNpZCk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGaWx0ZXI6OmNvbmZpZ3VyZUF2U3RyZWFtVHlwZShpbnQgYXZTdHJlYW1UeXBlKSB7CisgICAgaWYgKG1GaWx0ZXJfMV8xID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXJfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIEF2U3RyZWFtVHlwZSB0eXBlOworICAgIGlmICghZ2V0SGlkbEF2U3RyZWFtVHlwZShhdlN0cmVhbVR5cGUsIHR5cGUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfU1RBVEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlcl8xXzEtPmNvbmZpZ3VyZUF2U3RyZWFtVHlwZSh0eXBlKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZpbHRlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgeworICAgIGlmIChtRmlsdGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIklGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgSVR1bmVyRmlsdGVyKiB0dW5lckZpbHRlciA9IGZpbHRlci5nZXQoKTsKKyAgICBzcDxJRmlsdGVyPiBoaWRsRmlsdGVyID0gc3RhdGljX2Nhc3Q8VHVuZXJGaWx0ZXIqPih0dW5lckZpbHRlciktPmdldEhhbEZpbHRlcigpOworICAgIFJlc3VsdCByZXMgPSBtRmlsdGVyLT5zZXREYXRhU291cmNlKGhpZGxGaWx0ZXIpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwordm9pZCBUdW5lckZpbHRlcjo6Z2V0SGlkbFRzU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGF1dG8gdHNDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRzPigpOworICAgIERlbXV4VHNGaWx0ZXJTZXR0aW5ncyB0c3sKKyAgICAgICAgLnRwaWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odHNDb25mLnRwaWQpLAorICAgIH07CisKKyAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSB0c0NvbmYuZmlsdGVyU2V0dGluZ3M7CisgICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6YXY6IHsKKyAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLmF2KGdldEF2U2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE6IHsKKyAgICAgICAgICAgIHRzLmZpbHRlclNldHRpbmdzLnBlc0RhdGEoZ2V0UGVzRGF0YVNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6cmVjb3JkOiB7CisgICAgICAgICAgICB0cy5maWx0ZXJTZXR0aW5ncy5yZWNvcmQoZ2V0UmVjb3JkU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgdHMuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXR0aW5ncy50cyh0cyk7Cit9CisKK3ZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxNbXRwU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGF1dG8gbW10cENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6bW10cD4oKTsKKyAgICBEZW11eE1tdHBGaWx0ZXJTZXR0aW5ncyBtbXRweworICAgICAgICAubW10cFBpZCA9IHN0YXRpY19jYXN0PERlbXV4TW10cFBpZD4obW10cENvbmYubW10cFBpZCksCisgICAgfTsKKworICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IG1tdHBDb25mLmZpbHRlclNldHRpbmdzOworICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmF2OiB7CisgICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLmF2KGdldEF2U2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgICAgICBtbXRwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0U2VjdGlvblNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6cGVzRGF0YTogeworICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5wZXNEYXRhKGdldFBlc0RhdGFTZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnJlY29yZDogeworICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5yZWNvcmQoZ2V0UmVjb3JkU2V0dGluZ3ModHVuZXJTZXR0aW5ncykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpkb3dubG9hZDogeworICAgICAgICAgICAgbW10cC5maWx0ZXJTZXR0aW5ncy5kb3dubG9hZChnZXREb3dubG9hZFNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIG1tdHAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXR0aW5ncy5tbXRwKG1tdHApOworfQorCit2b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsSXBTZXR0aW5ncygKKyAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgYXV0byBpcENvbmYgPSBjb25maWcuZ2V0PFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbjo6aXA+KCk7CisgICAgRGVtdXhJcEFkZHJlc3MgaXBBZGRyeworICAgICAgICAuc3JjUG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLnNyY1BvcnQpLAorICAgICAgICAuZHN0UG9ydCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihpcENvbmYuaXBBZGRyLmRzdFBvcnQpLAorICAgIH07CisKKyAgICBpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcy5pc0lwVjYKKyAgICAgICAgICAgID8gaXBBZGRyLnNyY0lwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLnNyY0lwQWRkcmVzcykpCisgICAgICAgICAgICA6IGlwQWRkci5zcmNJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5zcmNJcEFkZHJlc3MpKTsKKyAgICBpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcy5pc0lwVjYKKyAgICAgICAgICAgID8gaXBBZGRyLmRzdElwQWRkcmVzcy52NihnZXRJcFY2QWRkcmVzcyhpcENvbmYuaXBBZGRyLmRzdElwQWRkcmVzcykpCisgICAgICAgICAgICA6IGlwQWRkci5kc3RJcEFkZHJlc3MudjQoZ2V0SXBWNEFkZHJlc3MoaXBDb25mLmlwQWRkci5kc3RJcEFkZHJlc3MpKTsKKyAgICBEZW11eElwRmlsdGVyU2V0dGluZ3MgaXB7CisgICAgICAgIC5pcEFkZHIgPSBpcEFkZHIsCisgICAgfTsKKworICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IGlwQ29uZi5maWx0ZXJTZXR0aW5nczsKKyAgICBzd2l0Y2ggKHR1bmVyU2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNldHRpbmdzOjpzZWN0aW9uOiB7CisgICAgICAgICAgICBpcC5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmlzUGFzc3Rocm91Z2g6IHsKKyAgICAgICAgICAgIGlwLmZpbHRlclNldHRpbmdzLmJQYXNzdGhyb3VnaCh0dW5lclNldHRpbmdzLmlzUGFzc3Rocm91Z2gpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaXAuZmlsdGVyU2V0dGluZ3Mubm9pbml0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZXR0aW5ncy5pcChpcCk7Cit9CisKK2hpZGxfYXJyYXk8dWludDhfdCwgSVBfVjZfTEVOR1RIPiBUdW5lckZpbHRlcjo6Z2V0SXBWNkFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKSB7CisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNl9MRU5HVEg+IGlwOworICAgIGlmIChhZGRyLmFkZHIuc2l6ZSgpICE9IElQX1Y2X0xFTkdUSCkgeworICAgICAgICByZXR1cm4gaXA7CisgICAgfQorICAgIGNvcHkoYWRkci5hZGRyLmJlZ2luKCksIGFkZHIuYWRkci5lbmQoKSwgaXAuZGF0YSgpKTsKKyAgICByZXR1cm4gaXA7Cit9CisKK2hpZGxfYXJyYXk8dWludDhfdCwgSVBfVjRfTEVOR1RIPiBUdW5lckZpbHRlcjo6Z2V0SXBWNEFkZHJlc3MoVHVuZXJEZW11eElwQWRkcmVzcyBhZGRyKSB7CisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGlwOworICAgIGlmIChhZGRyLmFkZHIuc2l6ZSgpICE9IElQX1Y0X0xFTkdUSCkgeworICAgICAgICByZXR1cm4gaXA7CisgICAgfQorICAgIGNvcHkoYWRkci5hZGRyLmJlZ2luKCksIGFkZHIuYWRkci5lbmQoKSwgaXAuZGF0YSgpKTsKKyAgICByZXR1cm4gaXA7Cit9CisKK3ZvaWQgVHVuZXJGaWx0ZXI6OmdldEhpZGxUbHZTZXR0aW5ncygKKyAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgYXV0byB0bHZDb25mID0gY29uZmlnLmdldDxUdW5lckZpbHRlckNvbmZpZ3VyYXRpb246OnRsdj4oKTsKKyAgICBEZW11eFRsdkZpbHRlclNldHRpbmdzIHRsdnsKKyAgICAgICAgLnBhY2tldFR5cGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih0bHZDb25mLnBhY2tldFR5cGUpLAorICAgICAgICAuaXNDb21wcmVzc2VkSXBQYWNrZXQgPSB0bHZDb25mLmlzQ29tcHJlc3NlZElwUGFja2V0LAorICAgIH07CisKKyAgICBUdW5lckZpbHRlclNldHRpbmdzIHR1bmVyU2V0dGluZ3MgPSB0bHZDb25mLmZpbHRlclNldHRpbmdzOworICAgIHN3aXRjaCAodHVuZXJTZXR0aW5ncy5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb246IHsKKyAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5zZWN0aW9uKGdldFNlY3Rpb25TZXR0aW5ncyh0dW5lclNldHRpbmdzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2V0dGluZ3M6OmlzUGFzc3Rocm91Z2g6IHsKKyAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5iUGFzc3Rocm91Z2godHVuZXJTZXR0aW5ncy5pc1Bhc3N0aHJvdWdoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHRsdi5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNldHRpbmdzLnRsdih0bHYpOworfQorCit2b2lkIFR1bmVyRmlsdGVyOjpnZXRIaWRsQWxwU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IFR1bmVyRmlsdGVyQ29uZmlndXJhdGlvbiYgY29uZmlnLCBEZW11eEZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGF1dG8gYWxwQ29uZiA9IGNvbmZpZy5nZXQ8VHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOjphbHA+KCk7CisgICAgRGVtdXhBbHBGaWx0ZXJTZXR0aW5ncyBhbHB7CisgICAgICAgIC5wYWNrZXRUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYWxwQ29uZi5wYWNrZXRUeXBlKSwKKyAgICAgICAgLmxlbmd0aFR5cGUgPSBzdGF0aWNfY2FzdDxEZW11eEFscExlbmd0aFR5cGU+KGFscENvbmYubGVuZ3RoVHlwZSksCisgICAgfTsKKworICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgdHVuZXJTZXR0aW5ncyA9IGFscENvbmYuZmlsdGVyU2V0dGluZ3M7CisgICAgc3dpdGNoICh0dW5lclNldHRpbmdzLmdldFRhZygpKSB7CisgICAgICAgIGNhc2UgVHVuZXJGaWx0ZXJTZXR0aW5nczo6c2VjdGlvbjogeworICAgICAgICAgICAgYWxwLmZpbHRlclNldHRpbmdzLnNlY3Rpb24oZ2V0U2VjdGlvblNldHRpbmdzKHR1bmVyU2V0dGluZ3MpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGFscC5maWx0ZXJTZXR0aW5ncy5ub2luaXQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNldHRpbmdzLmFscChhbHApOworfQorCitEZW11eEZpbHRlckF2U2V0dGluZ3MgVHVuZXJGaWx0ZXI6OmdldEF2U2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBEZW11eEZpbHRlckF2U2V0dGluZ3MgYXYgeworICAgICAgICAuaXNQYXNzdGhyb3VnaCA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjphdj4oKS5pc1Bhc3N0aHJvdWdoLAorICAgIH07CisgICAgcmV0dXJuIGF2OworfQorCitEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0U2VjdGlvblNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKSB7CisgICAgYXV0byBzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRmlsdGVyU2V0dGluZ3M6OnNlY3Rpb24+KCk7CisgICAgRGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbnsKKyAgICAgICAgLmlzQ2hlY2tDcmMgPSBzLmlzQ2hlY2tDcmMsCisgICAgICAgIC5pc1JlcGVhdCA9IHMuaXNSZXBlYXQsCisgICAgICAgIC5pc1JhdyA9IHMuaXNSYXcsCisgICAgfTsKKworICAgIHN3aXRjaCAocy5jb25kaXRpb24uZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnNlY3Rpb25CaXRzOiB7CisgICAgICAgICAgICBhdXRvIHNlY3Rpb25CaXRzID0gcy5jb25kaXRpb24uZ2V0PFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjo6c2VjdGlvbkJpdHM+KCk7CisgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gZmlsdGVyKHNlY3Rpb25CaXRzLmZpbHRlci5iZWdpbigpLCBzZWN0aW9uQml0cy5maWx0ZXIuZW5kKCkpOworICAgICAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IG1hc2soc2VjdGlvbkJpdHMubWFzay5iZWdpbigpLCBzZWN0aW9uQml0cy5tYXNrLmVuZCgpKTsKKyAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBtb2RlKHNlY3Rpb25CaXRzLm1vZGUuYmVnaW4oKSwgc2VjdGlvbkJpdHMubW9kZS5lbmQoKSk7CisgICAgICAgICAgICBzZWN0aW9uLmNvbmRpdGlvbi5zZWN0aW9uQml0cyh7CisgICAgICAgICAgICAgICAgLmZpbHRlciA9IGZpbHRlciwKKyAgICAgICAgICAgICAgICAubWFzayA9IG1hc2ssCisgICAgICAgICAgICAgICAgLm1vZGUgPSBtb2RlLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbjo6dGFibGVJbmZvOiB7CisgICAgICAgICAgICBhdXRvIHRhYmxlSW5mbyA9IHMuY29uZGl0aW9uLmdldDxUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb246OnRhYmxlSW5mbz4oKTsKKyAgICAgICAgICAgIHNlY3Rpb24uY29uZGl0aW9uLnRhYmxlSW5mbyh7CisgICAgICAgICAgICAgICAgLnRhYmxlSWQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4odGFibGVJbmZvLnRhYmxlSWQpLAorICAgICAgICAgICAgICAgIC52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHRhYmxlSW5mby52ZXJzaW9uKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlY3Rpb247Cit9CisKK0RlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRQZXNEYXRhU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgICBEZW11eEZpbHRlclBlc0RhdGFTZXR0aW5ncyBwZXN7CisgICAgICAgIC5zdHJlYW1JZCA9IHN0YXRpY19jYXN0PERlbXV4U3RyZWFtSWQ+KAorICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpwZXNEYXRhPigpLnN0cmVhbUlkKSwKKyAgICAgICAgLmlzUmF3ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRmlsdGVyU2V0dGluZ3M6OnBlc0RhdGE+KCkuaXNSYXcsCisgICAgfTsKKyAgICByZXR1cm4gcGVzOworfQorCitEZW11eEZpbHRlclJlY29yZFNldHRpbmdzIFR1bmVyRmlsdGVyOjpnZXRSZWNvcmRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGF1dG8gciA9IHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpyZWNvcmQ+KCk7CisgICAgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyByZWNvcmR7CisgICAgICAgIC50c0luZGV4TWFzayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyLnRzSW5kZXhNYXNrKSwKKyAgICAgICAgLnNjSW5kZXhUeXBlID0gc3RhdGljX2Nhc3Q8RGVtdXhSZWNvcmRTY0luZGV4VHlwZT4oci5zY0luZGV4VHlwZSksCisgICAgfTsKKworICAgIHN3aXRjaCAoci5zY0luZGV4TWFzay5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFR1bmVyRmlsdGVyU2NJbmRleE1hc2s6OnNjOiB7CisgICAgICAgICAgICByZWNvcmQuc2NJbmRleE1hc2suc2Moc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICByLnNjSW5kZXhNYXNrLmdldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzYz4oKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM6IHsKKyAgICAgICAgICAgIHJlY29yZC5zY0luZGV4TWFzay5zY0hldmMoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICByLnNjSW5kZXhNYXNrLmdldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWNvcmQ7Cit9CisKK0RlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBUdW5lckZpbHRlcjo6Z2V0RG93bmxvYWRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIERlbXV4RmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZCB7CisgICAgICAgIC5kb3dubG9hZElkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIHNldHRpbmdzLmdldDxUdW5lckZpbHRlclNldHRpbmdzOjpkb3dubG9hZD4oKS5kb3dubG9hZElkKSwKKyAgICB9OworICAgIHJldHVybiBkb3dubG9hZDsKK30KKworU3RhdHVzIFR1bmVyRmlsdGVyOjpnZXRBdlNoYXJlZEhhbmRsZUluZm8oVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZpbHRlcl8xXzEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlcl8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlczsKKyAgICBtRmlsdGVyXzFfMS0+Z2V0QXZTaGFyZWRIYW5kbGUoWyZdKFJlc3VsdCByLCBoaWRsX2hhbmRsZSBhdk1lbW9yeSwgdWludDY0X3QgYXZNZW1TaXplKSB7CisgICAgICAgIHJlcyA9IHI7CisgICAgICAgIGlmIChyZXMgPT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICBUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8gaW5mb3sKKyAgICAgICAgICAgICAgICAuaGFuZGxlID0gZHVwVG9BaWRsKGF2TWVtb3J5KSwKKyAgICAgICAgICAgICAgICAuc2l6ZSA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGF2TWVtU2l6ZSksCisgICAgICAgICAgICB9OworICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IG1vdmUoaW5mbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfYWlkbF9yZXR1cm4gPSBOVUxMOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZpbHRlcjo6cmVsZWFzZUF2SGFuZGxlKAorICAgICAgICBjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSYgaGFuZGxlLCBpbnQ2NF90IGF2RGF0YUlkKSB7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+cmVsZWFzZUF2SGFuZGxlKGhpZGxfaGFuZGxlKG1ha2VGcm9tQWlkbChoYW5kbGUpKSwgYXZEYXRhSWQpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRmlsdGVyOjpzdGFydCgpIHsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZpbHRlcjo6c3RvcCgpIHsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+c3RvcCgpOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRmlsdGVyOjpmbHVzaCgpIHsKKyAgICBpZiAobUZpbHRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJJRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKyAgICBSZXN1bHQgcmVzID0gbUZpbHRlci0+Zmx1c2goKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZpbHRlcjo6Y2xvc2UoKSB7CisgICAgaWYgKG1GaWx0ZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiSUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisgICAgUmVzdWx0IHJlcyA9IG1GaWx0ZXItPmNsb3NlKCk7CisgICAgbUZpbHRlciA9IE5VTEw7CisgICAgbUZpbHRlcl8xXzEgPSBOVUxMOworCisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitzcDxJRmlsdGVyPiBUdW5lckZpbHRlcjo6Z2V0SGFsRmlsdGVyKCkgeworICAgIHJldHVybiBtRmlsdGVyOworfQorCitib29sIFR1bmVyRmlsdGVyOjppc0F1ZGlvRmlsdGVyKCkgeworICAgIHJldHVybiAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6VFMKKyAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eFRzRmlsdGVyVHlwZTo6QVVESU8pCisgICAgICAgICAgICB8fCAobU1haW5UeXBlID09IChpbnQpRGVtdXhGaWx0ZXJNYWluVHlwZTo6TU1UUAorICAgICAgICAgICAgICAgICAgICAmJiBtU3ViVHlwZSA9PSAoaW50KURlbXV4TW10cEZpbHRlclR5cGU6OkFVRElPKTsKK30KKworYm9vbCBUdW5lckZpbHRlcjo6aXNWaWRlb0ZpbHRlcigpIHsKKyAgICByZXR1cm4gKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6OlRTCisgICAgICAgICAgICAgICAgICAgICYmIG1TdWJUeXBlID09IChpbnQpRGVtdXhUc0ZpbHRlclR5cGU6OlZJREVPKQorICAgICAgICAgICAgfHwgKG1NYWluVHlwZSA9PSAoaW50KURlbXV4RmlsdGVyTWFpblR5cGU6Ok1NVFAKKyAgICAgICAgICAgICAgICAgICAgJiYgbVN1YlR5cGUgPT0gKGludClEZW11eE1tdHBGaWx0ZXJUeXBlOjpWSURFTyk7Cit9CisKK2Jvb2wgVHVuZXJGaWx0ZXI6OmdldEhpZGxBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSwgQXZTdHJlYW1UeXBlJiB0eXBlKSB7CisgICAgaWYgKGlzQXVkaW9GaWx0ZXIoKSkgeworICAgICAgICB0eXBlLmF1ZGlvKHN0YXRpY19jYXN0PEF1ZGlvU3RyZWFtVHlwZT4oYXZTdHJlYW1UeXBlKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChpc1ZpZGVvRmlsdGVyKCkpIHsKKyAgICAgICAgdHlwZS52aWRlbyhzdGF0aWNfY2FzdDxWaWRlb1N0cmVhbVR5cGU+KGF2U3RyZWFtVHlwZSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBGaWx0ZXJDYWxsYmFjayAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitSZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpIHsKKyAgICBpZiAobVR1bmVyRmlsdGVyQ2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICBtVHVuZXJGaWx0ZXJDYWxsYmFjay0+b25GaWx0ZXJTdGF0dXMoKGludClzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpvbkZpbHRlckV2ZW50KGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50KSB7CisgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiBlbXB0eUV2ZW50c0V4dDsKKyAgICBEZW11eEZpbHRlckV2ZW50RXh0IGVtcHR5RmlsdGVyRXZlbnRFeHQgeworICAgICAgICAgICAgLmV2ZW50cyA9IGVtcHR5RXZlbnRzRXh0LAorICAgIH07CisgICAgb25GaWx0ZXJFdmVudF8xXzEoZmlsdGVyRXZlbnQsIGVtcHR5RmlsdGVyRXZlbnRFeHQpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6Om9uRmlsdGVyRXZlbnRfMV8xKGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50LAorICAgICAgICBjb25zdCBEZW11eEZpbHRlckV2ZW50RXh0JiBmaWx0ZXJFdmVudEV4dCkgeworICAgIGlmIChtVHVuZXJGaWx0ZXJDYWxsYmFjayAhPSBOVUxMKSB7CisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4gZXZlbnRzID0gZmlsdGVyRXZlbnQuZXZlbnRzOworICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+IGV2ZW50c0V4dCA9IGZpbHRlckV2ZW50RXh0LmV2ZW50czsKKyAgICAgICAgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+IHR1bmVyRXZlbnQ7CisKKyAgICAgICAgZ2V0QWlkbEZpbHRlckV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCB0dW5lckV2ZW50KTsKKyAgICAgICAgbVR1bmVyRmlsdGVyQ2FsbGJhY2stPm9uRmlsdGVyRXZlbnQodHVuZXJFdmVudCk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBGaWx0ZXJDYWxsYmFjayBIZWxwZXIgTWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0QWlkbEZpbHRlckV2ZW50KHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHR1bmVyRXZlbnQpIHsKKyAgICBpZiAoZXZlbnRzLmVtcHR5KCkgJiYgIWV2ZW50c0V4dC5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gZXZlbnRFeHQgPSBldmVudHNFeHRbMF07CisgICAgICAgIHN3aXRjaCAoZXZlbnRFeHQuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vbml0b3JFdmVudDogeworICAgICAgICAgICAgICAgIGdldE1vbml0b3JFdmVudChldmVudHNFeHQsIHR1bmVyRXZlbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c3RhcnRJZDogeworICAgICAgICAgICAgICAgIGdldFJlc3RhcnRFdmVudChldmVudHNFeHQsIHR1bmVyRXZlbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFldmVudHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGV2ZW50ID0gZXZlbnRzWzBdOworICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptZWRpYTogeworICAgICAgICAgICAgICAgIGdldE1lZGlhRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2VjdGlvbjogeworICAgICAgICAgICAgICAgIGdldFNlY3Rpb25FdmVudChldmVudHMsIHR1bmVyRXZlbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpwZXM6IHsKKyAgICAgICAgICAgICAgICBnZXRQZXNFdmVudChldmVudHMsIHR1bmVyRXZlbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c1JlY29yZDogeworICAgICAgICAgICAgICAgIGdldFRzUmVjb3JkRXZlbnQoZXZlbnRzLCBldmVudHNFeHQsIHR1bmVyRXZlbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBEZW11eEZpbHRlckV2ZW50OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptbXRwUmVjb3JkOiB7CisgICAgICAgICAgICAgICAgZ2V0TW10cFJlY29yZEV2ZW50KGV2ZW50cywgZXZlbnRzRXh0LCB0dW5lckV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZG93bmxvYWQ6IHsKKyAgICAgICAgICAgICAgICBnZXREb3dubG9hZEV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlwUGF5bG9hZDogeworICAgICAgICAgICAgICAgIGdldElwUGF5bG9hZEV2ZW50KGV2ZW50cywgdHVuZXJFdmVudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRlbWk6IHsKKyAgICAgICAgICAgICAgICBnZXRUZW1pRXZlbnQoZXZlbnRzLCB0dW5lckV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1lZGlhRXZlbnQoCisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50IGUgOiBldmVudHMpIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJNZWRpYUV2ZW50IG1lZGlhRXZlbnQgPSBlLm1lZGlhKCk7CisgICAgICAgIFR1bmVyRmlsdGVyTWVkaWFFdmVudCB0dW5lck1lZGlhOworCisgICAgICAgIHR1bmVyTWVkaWEuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4obWVkaWFFdmVudC5zdHJlYW1JZCk7CisgICAgICAgIHR1bmVyTWVkaWEuaXNQdHNQcmVzZW50ID0gbWVkaWFFdmVudC5pc1B0c1ByZXNlbnQ7CisgICAgICAgIHR1bmVyTWVkaWEucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4obWVkaWFFdmVudC5wdHMpOworICAgICAgICB0dW5lck1lZGlhLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQ+KG1lZGlhRXZlbnQuZGF0YUxlbmd0aCk7CisgICAgICAgIHR1bmVyTWVkaWEub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50PihtZWRpYUV2ZW50Lm9mZnNldCk7CisgICAgICAgIHR1bmVyTWVkaWEuaXNTZWN1cmVNZW1vcnkgPSBtZWRpYUV2ZW50LmlzU2VjdXJlTWVtb3J5OworICAgICAgICB0dW5lck1lZGlhLmF2RGF0YUlkID0gc3RhdGljX2Nhc3Q8bG9uZz4obWVkaWFFdmVudC5hdkRhdGFJZCk7CisgICAgICAgIHR1bmVyTWVkaWEubXB1U2VxdWVuY2VOdW1iZXIgPSBzdGF0aWNfY2FzdDxpbnQ+KG1lZGlhRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOworICAgICAgICB0dW5lck1lZGlhLmlzUGVzUHJpdmF0ZURhdGEgPSBtZWRpYUV2ZW50LmlzUGVzUHJpdmF0ZURhdGE7CisKKyAgICAgICAgaWYgKG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgICAgICBEZW11eEZpbHRlck1lZGlhRXZlbnQ6OkV4dHJhTWV0YURhdGE6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXVkaW8pIHsKKyAgICAgICAgICAgIHR1bmVyTWVkaWEuaXNBdWRpb0V4dHJhTWV0YURhdGEgPSB0cnVlOworICAgICAgICAgICAgdHVuZXJNZWRpYS5hdWRpbyA9IHsKKyAgICAgICAgICAgICAgICAuYWRGYWRlID0gc3RhdGljX2Nhc3Q8aW50OF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkRmFkZSksCisgICAgICAgICAgICAgICAgLmFkUGFuID0gc3RhdGljX2Nhc3Q8aW50OF90PigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRXZlbnQuZXh0cmFNZXRhRGF0YS5hdWRpbygpLmFkUGFuKSwKKyAgICAgICAgICAgICAgICAudmVyc2lvblRleHRUYWcgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkudmVyc2lvblRleHRUYWcpLAorICAgICAgICAgICAgICAgIC5hZEdhaW5DZW50ZXIgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRHYWluQ2VudGVyKSwKKyAgICAgICAgICAgICAgICAuYWRHYWluRnJvbnQgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFFdmVudC5leHRyYU1ldGFEYXRhLmF1ZGlvKCkuYWRHYWluRnJvbnQpLAorICAgICAgICAgICAgICAgIC5hZEdhaW5TdXJyb3VuZCA9IHN0YXRpY19jYXN0PGludDhfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUV2ZW50LmV4dHJhTWV0YURhdGEuYXVkaW8oKS5hZEdhaW5TdXJyb3VuZCksCisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHVuZXJNZWRpYS5pc0F1ZGlvRXh0cmFNZXRhRGF0YSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lZGlhRXZlbnQuYXZNZW1vcnkuZ2V0TmF0aXZlSGFuZGxlKCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdHVuZXJNZWRpYS5hdk1lbW9yeSA9IGR1cFRvQWlkbChtZWRpYUV2ZW50LmF2TWVtb3J5LmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKKyAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6bWVkaWE+KG1vdmUodHVuZXJNZWRpYSkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldFNlY3Rpb25FdmVudCgKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIGZvciAoRGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQgZSA6IGV2ZW50cykgeworICAgICAgICBEZW11eEZpbHRlclNlY3Rpb25FdmVudCBzZWN0aW9uRXZlbnQgPSBlLnNlY3Rpb24oKTsKKyAgICAgICAgVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQgdHVuZXJTZWN0aW9uOworCisgICAgICAgIHR1bmVyU2VjdGlvbi50YWJsZUlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC50YWJsZUlkKTsKKyAgICAgICAgdHVuZXJTZWN0aW9uLnZlcnNpb24gPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oc2VjdGlvbkV2ZW50LnZlcnNpb24pOworICAgICAgICB0dW5lclNlY3Rpb24uc2VjdGlvbk51bSA9IHN0YXRpY19jYXN0PGNoYXIxNl90PihzZWN0aW9uRXZlbnQuc2VjdGlvbk51bSk7CisgICAgICAgIHR1bmVyU2VjdGlvbi5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHNlY3Rpb25FdmVudC5kYXRhTGVuZ3RoKTsKKworICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7CisgICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnNlY3Rpb24+KG1vdmUodHVuZXJTZWN0aW9uKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0UGVzRXZlbnQoCisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50IGUgOiBldmVudHMpIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJQZXNFdmVudCBwZXNFdmVudCA9IGUucGVzKCk7CisgICAgICAgIFR1bmVyRmlsdGVyUGVzRXZlbnQgdHVuZXJQZXM7CisKKyAgICAgICAgdHVuZXJQZXMuc3RyZWFtSWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4ocGVzRXZlbnQuc3RyZWFtSWQpOworICAgICAgICB0dW5lclBlcy5kYXRhTGVuZ3RoID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KHBlc0V2ZW50LmRhdGFMZW5ndGgpOworICAgICAgICB0dW5lclBlcy5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4ocGVzRXZlbnQubXB1U2VxdWVuY2VOdW1iZXIpOworCisgICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKKyAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6cGVzPihtb3ZlKHR1bmVyUGVzKSk7CisgICAgICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7CisgICAgfQorfQorCit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0VHNSZWNvcmRFdmVudCh2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBUdW5lckZpbHRlclRzUmVjb3JkRXZlbnQgdHVuZXJUc1JlY29yZDsKKyAgICAgICAgRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50IHRzUmVjb3JkRXZlbnQgPSBldmVudHNbaV0udHNSZWNvcmQoKTsKKworICAgICAgICBUdW5lckZpbHRlclNjSW5kZXhNYXNrIHNjSW5kZXhNYXNrOworICAgICAgICBpZiAodHNSZWNvcmRFdmVudC5zY0luZGV4TWFzay5nZXREaXNjcmltaW5hdG9yKCkKKyAgICAgICAgICAgICAgICA9PSBEZW11eEZpbHRlclRzUmVjb3JkRXZlbnQ6OlNjSW5kZXhNYXNrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnNjKSB7CisgICAgICAgICAgICBzY0luZGV4TWFzay5zZXQ8VHVuZXJGaWx0ZXJTY0luZGV4TWFzazo6c2M+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2MoKSkpOworICAgICAgICB9IGVsc2UgaWYgKHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suZ2V0RGlzY3JpbWluYXRvcigpCisgICAgICAgICAgICAgICAgPT0gRGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OjpTY0luZGV4TWFzazo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY0hldmMpIHsKKyAgICAgICAgICAgIHNjSW5kZXhNYXNrLnNldDxUdW5lckZpbHRlclNjSW5kZXhNYXNrOjpzY0hldmM+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQuc2NJbmRleE1hc2suc2NIZXZjKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0c1JlY29yZEV2ZW50LnBpZC5nZXREaXNjcmltaW5hdG9yKCkgPT0gRGVtdXhQaWQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6dFBpZCkgeworICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5waWQgPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4odHNSZWNvcmRFdmVudC5waWQudFBpZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHR1bmVyVHNSZWNvcmQucGlkID0gc3RhdGljX2Nhc3Q8Y2hhcjE2X3Q+KENvbnN0YW50OjpJTlZBTElEX1RTX1BJRCk7CisgICAgICAgIH0KKworICAgICAgICB0dW5lclRzUmVjb3JkLnNjSW5kZXhNYXNrID0gc2NJbmRleE1hc2s7CisgICAgICAgIHR1bmVyVHNSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KHRzUmVjb3JkRXZlbnQudHNJbmRleE1hc2spOworICAgICAgICB0dW5lclRzUmVjb3JkLmJ5dGVOdW1iZXIgPSBzdGF0aWNfY2FzdDxsb25nPih0c1JlY29yZEV2ZW50LmJ5dGVOdW1iZXIpOworCisgICAgICAgIGlmIChldmVudHNFeHQuc2l6ZSgpID4gaSAmJiBldmVudHNFeHRbaV0uZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgIERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRzUmVjb3JkKSB7CisgICAgICAgICAgICB0dW5lclRzUmVjb3JkLmlzRXh0ZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5wdHMgPSBzdGF0aWNfY2FzdDxsb25nPihldmVudHNFeHRbaV0udHNSZWNvcmQoKS5wdHMpOworICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5maXJzdE1iSW5TbGljZSA9IHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLnRzUmVjb3JkKCkuZmlyc3RNYkluU2xpY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHVuZXJUc1JlY29yZC5pc0V4dGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7CisgICAgICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnRzUmVjb3JkPihtb3ZlKHR1bmVyVHNSZWNvcmQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRNbXRwUmVjb3JkRXZlbnQodmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgdHVuZXJNbXRwUmVjb3JkOworICAgICAgICBEZW11eEZpbHRlck1tdHBSZWNvcmRFdmVudCBtbXRwUmVjb3JkRXZlbnQgPSBldmVudHNbaV0ubW10cFJlY29yZCgpOworCisgICAgICAgIHR1bmVyTW10cFJlY29yZC5zY0hldmNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KG1tdHBSZWNvcmRFdmVudC5zY0hldmNJbmRleE1hc2spOworICAgICAgICB0dW5lck1tdHBSZWNvcmQuYnl0ZU51bWJlciA9IHN0YXRpY19jYXN0PGxvbmc+KG1tdHBSZWNvcmRFdmVudC5ieXRlTnVtYmVyKTsKKworICAgICAgICBpZiAoZXZlbnRzRXh0LnNpemUoKSA+IGkgJiYgZXZlbnRzRXh0W2ldLmdldERpc2NyaW1pbmF0b3IoKSA9PQorICAgICAgICAgICAgICAgICAgICBEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjptbXRwUmVjb3JkKSB7CisgICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQuaXNFeHRlbmRlZCA9IHRydWU7CisgICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5wdHMpOworICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLm1wdVNlcXVlbmNlTnVtYmVyID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihldmVudHNFeHRbaV0ubW10cFJlY29yZCgpLm1wdVNlcXVlbmNlTnVtYmVyKTsKKyAgICAgICAgICAgIHR1bmVyTW10cFJlY29yZC5maXJzdE1iSW5TbGljZSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0W2ldLm1tdHBSZWNvcmQoKS5maXJzdE1iSW5TbGljZSk7CisgICAgICAgICAgICB0dW5lck1tdHBSZWNvcmQudHNJbmRleE1hc2sgPSBzdGF0aWNfY2FzdDxpbnQ+KGV2ZW50c0V4dFtpXS5tbXRwUmVjb3JkKCkudHNJbmRleE1hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHVuZXJNbXRwUmVjb3JkLmlzRXh0ZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKKyAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6bW10cFJlY29yZD4obW92ZSh0dW5lck1tdHBSZWNvcmQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXREb3dubG9hZEV2ZW50KAorICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7CisgICAgICAgIERlbXV4RmlsdGVyRG93bmxvYWRFdmVudCBkb3dubG9hZEV2ZW50ID0gZS5kb3dubG9hZCgpOworICAgICAgICBUdW5lckZpbHRlckRvd25sb2FkRXZlbnQgdHVuZXJEb3dubG9hZDsKKworICAgICAgICB0dW5lckRvd25sb2FkLml0ZW1JZCA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5pdGVtSWQpOworICAgICAgICB0dW5lckRvd25sb2FkLml0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pihkb3dubG9hZEV2ZW50Lml0ZW1GcmFnbWVudEluZGV4KTsKKyAgICAgICAgdHVuZXJEb3dubG9hZC5tcHVTZXF1ZW5jZU51bWJlciA9IHN0YXRpY19jYXN0PGludD4oZG93bmxvYWRFdmVudC5tcHVTZXF1ZW5jZU51bWJlcik7CisgICAgICAgIHR1bmVyRG93bmxvYWQubGFzdEl0ZW1GcmFnbWVudEluZGV4ID0gc3RhdGljX2Nhc3Q8aW50Pihkb3dubG9hZEV2ZW50Lmxhc3RJdGVtRnJhZ21lbnRJbmRleCk7CisgICAgICAgIHR1bmVyRG93bmxvYWQuZGF0YUxlbmd0aCA9IHN0YXRpY19jYXN0PGNoYXIxNl90Pihkb3dubG9hZEV2ZW50LmRhdGFMZW5ndGgpOworCisgICAgICAgIFR1bmVyRmlsdGVyRXZlbnQgdHVuZXJFdmVudDsKKyAgICAgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6ZG93bmxvYWQ+KG1vdmUodHVuZXJEb3dubG9hZCkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldElwUGF5bG9hZEV2ZW50KAorICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgZm9yIChEZW11eEZpbHRlckV2ZW50OjpFdmVudCBlIDogZXZlbnRzKSB7CisgICAgICAgIERlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQgaXBQYXlsb2FkRXZlbnQgPSBlLmlwUGF5bG9hZCgpOworICAgICAgICBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IHR1bmVySXBQYXlsb2FkOworCisgICAgICAgIHR1bmVySXBQYXlsb2FkLmRhdGFMZW5ndGggPSBzdGF0aWNfY2FzdDxjaGFyMTZfdD4oaXBQYXlsb2FkRXZlbnQuZGF0YUxlbmd0aCk7CisKKyAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OworICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50OjppcFBheWxvYWQ+KG1vdmUodHVuZXJJcFBheWxvYWQpKTsKKyAgICAgICAgcmVzLnB1c2hfYmFjayhtb3ZlKHR1bmVyRXZlbnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJGaWx0ZXI6OkZpbHRlckNhbGxiYWNrOjpnZXRUZW1pRXZlbnQoCisgICAgICAgIHZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgdmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpIHsKKyAgICBmb3IgKERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50IGUgOiBldmVudHMpIHsKKyAgICAgICAgRGVtdXhGaWx0ZXJUZW1pRXZlbnQgdGVtaUV2ZW50ID0gZS50ZW1pKCk7CisgICAgICAgIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHR1bmVyVGVtaTsKKworICAgICAgICB0dW5lclRlbWkucHRzID0gc3RhdGljX2Nhc3Q8bG9uZz4odGVtaUV2ZW50LnB0cyk7CisgICAgICAgIHR1bmVyVGVtaS5kZXNjclRhZyA9IHN0YXRpY19jYXN0PGludDhfdD4odGVtaUV2ZW50LmRlc2NyVGFnKTsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IGRlc2NyRGF0YSA9IHRlbWlFdmVudC5kZXNjckRhdGE7CisgICAgICAgIHR1bmVyVGVtaS5kZXNjckRhdGEucmVzaXplKGRlc2NyRGF0YS5zaXplKCkpOworICAgICAgICBjb3B5KGRlc2NyRGF0YS5iZWdpbigpLCBkZXNjckRhdGEuZW5kKCksIHR1bmVyVGVtaS5kZXNjckRhdGEuYmVnaW4oKSk7CisKKyAgICAgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OworICAgICAgICB0dW5lckV2ZW50LnNldDxUdW5lckZpbHRlckV2ZW50Ojp0ZW1pPihtb3ZlKHR1bmVyVGVtaSkpOworICAgICAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOworICAgIH0KK30KKwordm9pZCBUdW5lckZpbHRlcjo6RmlsdGVyQ2FsbGJhY2s6OmdldE1vbml0b3JFdmVudCgKKyAgICAgICAgdmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LCB2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcykgeworICAgIERlbXV4RmlsdGVyTW9uaXRvckV2ZW50IG1vbml0b3JFdmVudCA9IGV2ZW50c0V4dFswXS5tb25pdG9yRXZlbnQoKTsKKyAgICBUdW5lckZpbHRlck1vbml0b3JFdmVudCB0dW5lck1vbml0b3I7CisKKyAgICBzd2l0Y2ggKG1vbml0b3JFdmVudC5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgY2FzZSBEZW11eEZpbHRlck1vbml0b3JFdmVudDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzY3JhbWJsaW5nU3RhdHVzOiB7CisgICAgICAgICAgICB0dW5lck1vbml0b3Iuc2V0PFR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OjpzY3JhbWJsaW5nU3RhdHVzPigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihtb25pdG9yRXZlbnQuc2NyYW1ibGluZ1N0YXR1cygpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIERlbXV4RmlsdGVyTW9uaXRvckV2ZW50OjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmNpZDogeworICAgICAgICAgICAgdHVuZXJNb25pdG9yLnNldDxUdW5lckZpbHRlck1vbml0b3JFdmVudDo6Y2lkPihzdGF0aWNfY2FzdDxpbnQ+KG1vbml0b3JFdmVudC5jaWQoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUdW5lckZpbHRlckV2ZW50IHR1bmVyRXZlbnQ7CisgICAgdHVuZXJFdmVudC5zZXQ8VHVuZXJGaWx0ZXJFdmVudDo6bW9uaXRvcj4obW92ZSh0dW5lck1vbml0b3IpKTsKKyAgICByZXMucHVzaF9iYWNrKG1vdmUodHVuZXJFdmVudCkpOworfQorCit2b2lkIFR1bmVyRmlsdGVyOjpGaWx0ZXJDYWxsYmFjazo6Z2V0UmVzdGFydEV2ZW50KAorICAgICAgICB2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsIHZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKSB7CisgICAgVHVuZXJGaWx0ZXJFdmVudCB0dW5lckV2ZW50OworICAgIHR1bmVyRXZlbnQuc2V0PFR1bmVyRmlsdGVyRXZlbnQ6OnN0YXJ0SWQ+KHN0YXRpY19jYXN0PGludD4oZXZlbnRzRXh0WzBdLnN0YXJ0SWQoKSkpOworICAgIHJlcy5wdXNoX2JhY2sobW92ZSh0dW5lckV2ZW50KSk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGaWx0ZXIuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0NzI4YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRmlsdGVyLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRklMVEVSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyRmlsdGVyLmg+CisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlckNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YWlkbGNvbW1vbnN1cHBvcnQvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSVR1bmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvSUZpbHRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGaWx0ZXJDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxmbXEvQ29udmVydE1RRGVzY3JpcHRvcnMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisKK3VzaW5nIFN0YXR1cyA9IDo6bmRrOjpTY29wZWRBU3RhdHVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJGaWx0ZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZpbHRlckNhbGxiYWNrOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckRlbXV4SXBBZGRyZXNzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlckNvbmZpZ3VyYXRpb247Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyRG93bmxvYWRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNZWRpYUV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyUGVzRXZlbnQ7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm87Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRmlsdGVyVGVtaUV2ZW50OwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZpbHRlclRzUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4QWxwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyQXZTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJEb3dubG9hZEV2ZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckRvd25sb2FkU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVySXBQYXlsb2FkRXZlbnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyRXZlbnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyTWVkaWFFdmVudDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJNbXRwUmVjb3JkRXZlbnQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclBlc0V2ZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclJlY29yZFNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNlY3Rpb25FdmVudDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4RmlsdGVyU3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclRlbWlFdmVudDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUc1JlY29yZEV2ZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eElwRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4TW10cEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRsdkZpbHRlclNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4UGlkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpBdlN0cmVhbVR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkRlbXV4RmlsdGVyRXZlbnRFeHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkRlbXV4RmlsdGVyTW9uaXRvckV2ZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpEZW11eEZpbHRlclRzUmVjb3JkRXZlbnRFeHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGaWx0ZXJDYWxsYmFjazsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBNUURlc2MgPSBNUURlc2NyaXB0b3JTeW5jPHVpbnQ4X3Q+OwordXNpbmcgQWlkbE1RRGVzYyA9IE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK2NvbnN0IHN0YXRpYyBpbnQgSVBfVjRfTEVOR1RIID0gNDsKK2NvbnN0IHN0YXRpYyBpbnQgSVBfVjZfTEVOR1RIID0gMTY7CisKK2NsYXNzIFR1bmVyRmlsdGVyIDogcHVibGljIEJuVHVuZXJGaWx0ZXIgeworCitwdWJsaWM6CisgICAgVHVuZXJGaWx0ZXIoc3A8SUZpbHRlcj4gZmlsdGVyLCBpbnQgbWFpblR5cGUsIGludCBzdWJUeXApOworICAgIHZpcnR1YWwgflR1bmVyRmlsdGVyKCk7CisgICAgU3RhdHVzIGdldElkKGludDMyX3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldElkNjRCaXQoaW50NjRfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0UXVldWVEZXNjKEFpZGxNUURlc2MqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNvbmZpZ3VyZShjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbnQgbW9uaXRvckV2ZW50VHlwZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGludCBjaWQpIG92ZXJyaWRlOworICAgIFN0YXR1cyBjb25maWd1cmVBdlN0cmVhbVR5cGUoaW50IGF2U3RyZWFtVHlwZSkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEF2U2hhcmVkSGFuZGxlSW5mbyhUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHJlbGVhc2VBdkhhbmRsZShjb25zdCA6OmFpZGw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjb21tb246Ok5hdGl2ZUhhbmRsZSYgaGFuZGxlLAorICAgICAgICAgICAgaW50NjRfdCBhdkRhdGFJZCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldERhdGFTb3VyY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlcj4mIGZpbHRlcikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0b3AoKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZmx1c2goKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKyAgICBzcDxJRmlsdGVyPiBnZXRIYWxGaWx0ZXIoKTsKKworICAgIHN0cnVjdCBGaWx0ZXJDYWxsYmFjayA6IHB1YmxpYyBJRmlsdGVyQ2FsbGJhY2sgeworICAgICAgICBGaWx0ZXJDYWxsYmFjayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRmlsdGVyQ2FsbGJhY2s+IHR1bmVyRmlsdGVyQ2FsbGJhY2spCisgICAgICAgICAgICAgICAgOiBtVHVuZXJGaWx0ZXJDYWxsYmFjayh0dW5lckZpbHRlckNhbGxiYWNrKSB7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlckV2ZW50KGNvbnN0IERlbXV4RmlsdGVyRXZlbnQmIGZpbHRlckV2ZW50KTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GaWx0ZXJFdmVudF8xXzEoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYgZmlsdGVyRXZlbnQsCisgICAgICAgICAgICAgICAgY29uc3QgRGVtdXhGaWx0ZXJFdmVudEV4dCYgZmlsdGVyRXZlbnRFeHQpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZpbHRlclN0YXR1cyhEZW11eEZpbHRlclN0YXR1cyBzdGF0dXMpOworCisgICAgICAgIHZvaWQgZ2V0QWlkbEZpbHRlckV2ZW50KHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiB0dW5lckV2ZW50KTsKKworICAgICAgICB2b2lkIGdldE1lZGlhRXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFNlY3Rpb25FdmVudCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50OjpFdmVudD4mIGV2ZW50cywgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0UGVzRXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldFRzUmVjb3JkRXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7CisgICAgICAgIHZvaWQgZ2V0TW10cFJlY29yZEV2ZW50KAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnRFeHQ6OkV2ZW50PiYgZXZlbnRzRXh0LAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldERvd25sb2FkRXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldElwUGF5bG9hZEV2ZW50KAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPERlbXV4RmlsdGVyRXZlbnQ6OkV2ZW50PiYgZXZlbnRzLCBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRUZW1pRXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudDo6RXZlbnQ+JiBldmVudHMsIHN0ZDo6dmVjdG9yPFR1bmVyRmlsdGVyRXZlbnQ+JiByZXMpOworICAgICAgICB2b2lkIGdldE1vbml0b3JFdmVudCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEZW11eEZpbHRlckV2ZW50RXh0OjpFdmVudD4mIGV2ZW50c0V4dCwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUdW5lckZpbHRlckV2ZW50PiYgcmVzKTsKKyAgICAgICAgdm9pZCBnZXRSZXN0YXJ0RXZlbnQoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8RGVtdXhGaWx0ZXJFdmVudEV4dDo6RXZlbnQ+JiBldmVudHNFeHQsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VHVuZXJGaWx0ZXJFdmVudD4mIHJlcyk7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElUdW5lckZpbHRlckNhbGxiYWNrPiBtVHVuZXJGaWx0ZXJDYWxsYmFjazsKKyAgICB9OworCitwcml2YXRlOgorICAgIERlbXV4RmlsdGVyQXZTZXR0aW5ncyBnZXRBdlNldHRpbmdzKGNvbnN0IFR1bmVyRmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICBEZW11eEZpbHRlclNlY3Rpb25TZXR0aW5ncyBnZXRTZWN0aW9uU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIERlbXV4RmlsdGVyUGVzRGF0YVNldHRpbmdzIGdldFBlc0RhdGFTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgRGVtdXhGaWx0ZXJSZWNvcmRTZXR0aW5ncyBnZXRSZWNvcmRTZXR0aW5ncyhjb25zdCBUdW5lckZpbHRlclNldHRpbmdzJiBzZXR0aW5ncyk7CisgICAgRGVtdXhGaWx0ZXJEb3dubG9hZFNldHRpbmdzIGdldERvd25sb2FkU2V0dGluZ3MoY29uc3QgVHVuZXJGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworCisgICAgYm9vbCBpc0F1ZGlvRmlsdGVyKCk7CisgICAgYm9vbCBpc1ZpZGVvRmlsdGVyKCk7CisgICAgYm9vbCBnZXRIaWRsQXZTdHJlYW1UeXBlKGludCBhdlN0cmVhbVR5cGUsIEF2U3RyZWFtVHlwZSYgdHlwZSk7CisKKyAgICB2b2lkIGdldEhpZGxUc1NldHRpbmdzKAorICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbE1tdHBTZXR0aW5ncygKKyAgICAgICAgY29uc3QgVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uJiBjb25maWcsIERlbXV4RmlsdGVyU2V0dGluZ3MmIHNldHRpbmdzKTsKKyAgICB2b2lkIGdldEhpZGxJcFNldHRpbmdzKAorICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbFRsdlNldHRpbmdzKAorICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIHZvaWQgZ2V0SGlkbEFscFNldHRpbmdzKAorICAgICAgICBjb25zdCBUdW5lckZpbHRlckNvbmZpZ3VyYXRpb24mIGNvbmZpZywgRGVtdXhGaWx0ZXJTZXR0aW5ncyYgc2V0dGluZ3MpOworCisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNF9MRU5HVEg+IGdldElwVjRBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7CisgICAgaGlkbF9hcnJheTx1aW50OF90LCBJUF9WNl9MRU5HVEg+IGdldElwVjZBZGRyZXNzKFR1bmVyRGVtdXhJcEFkZHJlc3MgYWRkcik7CisKKyAgICBzcDxJRmlsdGVyPiBtRmlsdGVyOworICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZpbHRlcj4gbUZpbHRlcl8xXzE7CisgICAgaW50MzJfdCBtSWQ7CisgICAgaW50NjRfdCBtSWQ2NEJpdDsKKyAgICBpbnQgbU1haW5UeXBlOworICAgIGludCBtU3ViVHlwZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGSUxURVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAgYi9zZXJ2aWNlcy90dW5lci9UdW5lckZyb250ZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGI1NTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5jcHAKQEAgLTAsMCArMSwxMDk0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUdW5lckZyb250ZW5kIgorCisjaW5jbHVkZSAiVHVuZXJGcm9udGVuZC5oIgorI2luY2x1ZGUgIlR1bmVyTG5iLmgiCisKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dTaWZTdGFuZGFyZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBbmFsb2dUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2NNb2R1bGF0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQmFuZHdpZHRoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEF0c2MzQ29kZVJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM0ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRBdHNjM01vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZiY0FubmV4OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNNb2R1bGF0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YmNPdXRlckZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJjU3BlY3RyYWxJbnZlcnNpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic01vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1BpbG90OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNSb2xsb2ZmOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnNTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzU3RhbmRhcmQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZic1ZjbU1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEJhbmR3aWR0aDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0Q29kZXJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidENvbnN0ZWxsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidEhpZXJhcmNoeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0UGxwTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJ0U2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRHZidFN0YW5kYXJkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElubmVyRmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM0NvZGVyYXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzM01vZHVsYXRpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnMzUm9sbG9mZjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RiczNTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric0NvZGVyYXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJzTW9kdWxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1JvbGxvZmY7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnNTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidEJhbmR3aWR0aDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidENvZGVyYXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0R3VhcmRJbnRlcnZhbDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRJc2RidE1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kSXNkYnRNb2R1bGF0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElzZGJ0U2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kTW9kdWxhdGlvblN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRBbmFsb2dBZnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEJhbmR3aWR0aDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRDYWJsZVRpbWVJbnRlcmxlYXZlTW9kZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdmJjQmFuZHdpZHRoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJCYW5kd2lkdGg7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYkNvZGVSYXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJHdWFyZEludGVydmFsOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJNb2R1bGF0aW9uOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER0bWJUaW1lSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kRHZic1NjYW5UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZEd1YXJkSW50ZXJ2YWw7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kSW50ZXJsZWF2ZU1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kTW9kdWxhdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmRSb2xsT2ZmOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3BlY3RyYWxJbnZlcnNpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitUdW5lckZyb250ZW5kOjpUdW5lckZyb250ZW5kKHNwPElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCkgeworICAgIG1Gcm9udGVuZCA9IGZyb250ZW5kOworICAgIG1Gcm9udGVuZF8xXzEgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklGcm9udGVuZDo6Y2FzdEZyb20obUZyb250ZW5kKTsKKyAgICBtSWQgPSBpZDsKK30KKworVHVuZXJGcm9udGVuZDo6flR1bmVyRnJvbnRlbmQoKSB7CisgICAgbUZyb250ZW5kID0gTlVMTDsKKyAgICBtRnJvbnRlbmRfMV8xID0gTlVMTDsKKyAgICBtSWQgPSAtMTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldENhbGxiYWNrKAorICAgICAgICBjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+JiB0dW5lckZyb250ZW5kQ2FsbGJhY2spIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAodHVuZXJGcm9udGVuZENhbGxiYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVCkpOworICAgIH0KKworICAgIHNwPElGcm9udGVuZENhbGxiYWNrPiBmcm9udGVuZENhbGxiYWNrID0gbmV3IEZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKTsKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRDYWxsYmFjayhmcm9udGVuZENhbGxiYWNrKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXM7CisgICAgRnJvbnRlbmRTZXR0aW5ncyBmcm9udGVuZFNldHRpbmdzID0gZ2V0SGlkbEZyb250ZW5kU2V0dGluZ3Moc2V0dGluZ3MpOworICAgIGlmIChzZXR0aW5ncy5pc0V4dGVuZGVkKSB7CisgICAgICAgIGlmIChtRnJvbnRlbmRfMV8xID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICAgICAgfQorICAgICAgICBGcm9udGVuZFNldHRpbmdzRXh0MV8xIGZyb250ZW5kU2V0dGluZ3NFeHQgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChzZXR0aW5ncyk7CisgICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZF8xXzEtPnR1bmVfMV8xKGZyb250ZW5kU2V0dGluZ3MsIGZyb250ZW5kU2V0dGluZ3NFeHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IG1Gcm9udGVuZC0+dHVuZShmcm9udGVuZFNldHRpbmdzKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BUdW5lKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnN0b3BUdW5lKCk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpzY2FuKGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgc2V0dGluZ3MsIGludCBmcm9udGVuZFNjYW5UeXBlKSB7CisgICAgaWYgKG1Gcm9udGVuZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmQgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHN0YXR1czsKKyAgICBGcm9udGVuZFNldHRpbmdzIGZyb250ZW5kU2V0dGluZ3MgPSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhzZXR0aW5ncyk7CisgICAgaWYgKHNldHRpbmdzLmlzRXh0ZW5kZWQpIHsKKyAgICAgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIklGcm9udGVuZF8xXzEgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgICAgICB9CisgICAgICAgIEZyb250ZW5kU2V0dGluZ3NFeHQxXzEgZnJvbnRlbmRTZXR0aW5nc0V4dCA9IGdldEhpZGxGcm9udGVuZFNldHRpbmdzRXh0KHNldHRpbmdzKTsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+c2Nhbl8xXzEoZnJvbnRlbmRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZFNjYW5UeXBlPihmcm9udGVuZFNjYW5UeXBlKSwgZnJvbnRlbmRTZXR0aW5nc0V4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gbUZyb250ZW5kLT5zY2FuKAorICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3MsIHN0YXRpY19jYXN0PEZyb250ZW5kU2NhblR5cGU+KGZyb250ZW5kU2NhblR5cGUpKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnN0b3BTY2FuKCkgeworICAgIGlmIChtRnJvbnRlbmQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXMgPSBtRnJvbnRlbmQtPnN0b3BTY2FuKCk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRMbmIoc3RhdGljX2Nhc3Q8VHVuZXJMbmIqPihsbmIuZ2V0KCkpLT5nZXRJZCgpKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OnNldExuYShib29sIGJFbmFibGUpIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5zZXRMbmEoYkVuYWJsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpsaW5rQ2lDYW1Ub0Zyb250ZW5kKGludCBjaUNhbUlkLCBpbnQzMl90KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kXzFfMSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dEKCJJRnJvbnRlbmRfMV8xIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIGludCBsdHNJZDsKKyAgICBSZXN1bHQgc3RhdHVzOworICAgIG1Gcm9udGVuZF8xXzEtPmxpbmtDaUNhbShzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2lDYW1JZCksCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGlkKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgICAgICAgICBsdHNJZCA9IGlkOworICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gbHRzSWQ7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworfQorCitTdGF0dXMgVHVuZXJGcm9udGVuZDo6dW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludCBjaUNhbUlkKSB7CisgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kXzFfMS0+dW5saW5rQ2lDYW0oY2lDYW1JZCk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpjbG9zZSgpIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbUZyb250ZW5kLT5jbG9zZSgpOworICAgIG1Gcm9udGVuZCA9IE5VTEw7CisgICAgbUZyb250ZW5kXzFfMSA9IE5VTEw7CisKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckZyb250ZW5kOjpnZXRTdGF0dXMoY29uc3QgdmVjdG9yPGludDMyX3Q+JiBzdGF0dXNUeXBlcywKKyAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAobUZyb250ZW5kID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0QoIklGcm9udGVuZCBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzOworICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1cz4gc3RhdHVzOworICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGU+IHR5cGVzOworICAgIGZvciAoYXV0byBzIDogc3RhdHVzVHlwZXMpIHsKKyAgICAgICAgdHlwZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZT4ocykpOworICAgIH0KKworICAgIG1Gcm9udGVuZC0+Z2V0U3RhdHVzKHR5cGVzLCBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEZyb250ZW5kU3RhdHVzPiYgcykgeworICAgICAgICByZXMgPSByOworICAgICAgICBzdGF0dXMgPSBzOworICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICBnZXRBaWRsRnJvbnRlbmRTdGF0dXMoc3RhdHVzLCAqX2FpZGxfcmV0dXJuKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJGcm9udGVuZDo6Z2V0U3RhdHVzRXh0ZW5kZWRfMV8xKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCisgICAgICAgIHZlY3RvcjxUdW5lckZyb250ZW5kU3RhdHVzPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1Gcm9udGVuZF8xXzEgPT0gTlVMTCkgeworICAgICAgICBBTE9HRCgiSUZyb250ZW5kXzFfMSBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgcmVzOworICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c0V4dDFfMT4gc3RhdHVzOworICAgIHZlY3RvcjxGcm9udGVuZFN0YXR1c1R5cGVFeHQxXzE+IHR5cGVzOworICAgIGZvciAoYXV0byBzIDogc3RhdHVzVHlwZXMpIHsKKyAgICAgICAgdHlwZXMucHVzaF9iYWNrKHN0YXRpY19jYXN0PEZyb250ZW5kU3RhdHVzVHlwZUV4dDFfMT4ocykpOworICAgIH0KKworICAgIG1Gcm9udGVuZF8xXzEtPmdldFN0YXR1c0V4dDFfMSh0eXBlcywgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxGcm9udGVuZFN0YXR1c0V4dDFfMT4mIHMpIHsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgc3RhdHVzID0gczsKKyAgICB9KTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorCisgICAgZ2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KHN0YXR1cywgKl9haWRsX3JldHVybik7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyRnJvbnRlbmQ6OmdldEZyb250ZW5kSWQoaW50KiBfYWlkbF9yZXR1cm4pIHsKKyAgICAqX2FpZGxfcmV0dXJuID0gbUlkOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBGcm9udGVuZENhbGxiYWNrIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK1JldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKSB7CisgICAgQUxPR0QoIkZyb250ZW5kQ2FsbGJhY2s6Om9uRXZlbnQsIHR5cGU9JWQiLCBmcm9udGVuZEV2ZW50VHlwZSk7CisgICAgbVR1bmVyRnJvbnRlbmRDYWxsYmFjay0+b25FdmVudCgoaW50KWZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJGcm9udGVuZDo6RnJvbnRlbmRDYWxsYmFjazo6b25TY2FuTWVzc2FnZSgKKyAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGUgdHlwZSwgY29uc3QgRnJvbnRlbmRTY2FuTWVzc2FnZSYgbWVzc2FnZSkgeworICAgIEFMT0dEKCJGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlLCB0eXBlPSVkIiwgdHlwZSk7CisgICAgVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlIHNjYW5NZXNzYWdlOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkxPQ0tFRDogeworICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aXNMb2NrZWQ+KG1lc3NhZ2UuaXNMb2NrZWQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpFTkQ6IHsKKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzRW5kPihtZXNzYWdlLmlzRW5kKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UFJPR1JFU1NfUEVSQ0VOVDogeworICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6cHJvZ3Jlc3NQZXJjZW50PihtZXNzYWdlLnByb2dyZXNzUGVyY2VudCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkZSRVFVRU5DWTogeworICAgICAgICAgICAgYXV0byBmID0gbWVzc2FnZS5mcmVxdWVuY2llcygpOworICAgICAgICAgICAgdmVjdG9yPGludD4gZnJlcXVlbmNpZXMoYmVnaW4oZiksIGVuZChmKSk7CisgICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpmcmVxdWVuY2llcz4oZnJlcXVlbmNpZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1lNQk9MX1JBVEU6IHsKKyAgICAgICAgICAgIGF1dG8gcyA9IG1lc3NhZ2Uuc3ltYm9sUmF0ZXMoKTsKKyAgICAgICAgICAgIHZlY3RvcjxpbnQ+IHN5bWJvbFJhdGVzKGJlZ2luKHMpLCBlbmQocykpOworICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6c3ltYm9sUmF0ZXM+KHN5bWJvbFJhdGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkhJRVJBUkNIWTogeworICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6aGllcmFyY2h5PigoaW50KW1lc3NhZ2UuaGllcmFyY2h5KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6QU5BTE9HX1RZUEU6IHsKKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmFuYWxvZ1R5cGU+KChpbnQpbWVzc2FnZS5hbmFsb2dUeXBlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6UExQX0lEUzogeworICAgICAgICAgICAgYXV0byBwID0gbWVzc2FnZS5wbHBJZHMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBwbHBJZHMoYmVnaW4ocCksIGVuZChwKSk7CisgICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpwbHBJZHM+KHBscElkcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpHUk9VUF9JRFM6IHsKKyAgICAgICAgICAgIGF1dG8gZyA9IG1lc3NhZ2UuZ3JvdXBJZHMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBncm91cElkcyhiZWdpbihnKSwgZW5kKGcpKTsKKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6Omdyb3VwSWRzPihncm91cElkcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlOjpJTlBVVF9TVFJFQU1fSURTOiB7CisgICAgICAgICAgICBhdXRvIGkgPSBtZXNzYWdlLmlucHV0U3RyZWFtSWRzKCk7CisgICAgICAgICAgICB2ZWN0b3I8Y2hhcjE2X3Q+IHN0cmVhbUlkcyhiZWdpbihpKSwgZW5kKGkpKTsKKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlucHV0U3RyZWFtSWRzPihzdHJlYW1JZHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTo6U1RBTkRBUkQ6IHsKKyAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkIHN0ZCA9IG1lc3NhZ2Uuc3RkKCk7CisgICAgICAgICAgICBpbnQgc3RhbmRhcmQ7CisgICAgICAgICAgICBpZiAoc3RkLmdldERpc2NyaW1pbmF0b3IoKSA9PSBGcm9udGVuZFNjYW5NZXNzYWdlOjpTdGFuZGFyZDo6aGlkbF9kaXNjcmltaW5hdG9yOjpzU3RkKSB7CisgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc1N0ZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGQuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICAgICAgICAgIEZyb250ZW5kU2Nhbk1lc3NhZ2U6OlN0YW5kYXJkOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnRTdGQpIHsKKyAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IChpbnQpIHN0ZC50U3RkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZC5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmRTY2FuTWVzc2FnZTo6U3RhbmRhcmQ6OmhpZGxfZGlzY3JpbWluYXRvcjo6c2lmU3RkKSB7CisgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSAoaW50KSBzdGQuc2lmU3RkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuTWVzc2FnZS5zZXQ8VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOjpzdGQ+KHN0YW5kYXJkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGU6OkFUU0MzX1BMUF9JTkZPOiB7CisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiBwbHBJbmZvcyA9IG1lc3NhZ2UuYXRzYzNQbHBJbmZvcygpOworICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvPiB0dW5lclBscEluZm9zOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHBJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9IHBscEluZm9zW2ldOworICAgICAgICAgICAgICAgIGludDhfdCBwbHBJZCA9IChpbnQ4X3QpIGluZm8ucGxwSWQ7CisgICAgICAgICAgICAgICAgYm9vbCBsbHMgPSAoYm9vbCkgaW5mby5iTGxzRmxhZzsKKyAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kU2NhbkF0c2MzUGxwSW5mbyBwbHBJbmZveworICAgICAgICAgICAgICAgICAgICAucGxwSWQgPSBwbHBJZCwKKyAgICAgICAgICAgICAgICAgICAgLmxsc0ZsYWcgPSBsbHMsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0dW5lclBscEluZm9zLnB1c2hfYmFjayhwbHBJbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmF0c2MzUGxwSW5mb3M+KHR1bmVyUGxwSW5mb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKChpbnQpdHlwZSwgc2Nhbk1lc3NhZ2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBUdW5lckZyb250ZW5kOjpGcm9udGVuZENhbGxiYWNrOjpvblNjYW5NZXNzYWdlRXh0MV8xKAorICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xJiBtZXNzYWdlKSB7CisgICAgQUxPR0QoIm9uU2Nhbk1lc3NhZ2VFeHQxXzE6Om9uU2Nhbk1lc3NhZ2UsIHR5cGU9JWQiLCB0eXBlKTsKKyAgICBUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2Ugc2Nhbk1lc3NhZ2U7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6TU9EVUxBVElPTjogeworICAgICAgICAgICAgRnJvbnRlbmRNb2R1bGF0aW9uIG0gPSBtZXNzYWdlLm1vZHVsYXRpb24oKTsKKyAgICAgICAgICAgIGludCBtb2R1bGF0aW9uOworICAgICAgICAgICAgc3dpdGNoIChtLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmR2YmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uZHZidCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5kdmJzKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJzOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGF0aW9uID0gKGludCkgbS5pc2RicygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsYXRpb24gPSAoaW50KSBtLmlzZGJzMygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uaXNkYnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzYzoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uYXRzYygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uYXRzYzMoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxhdGlvbiA9IChpbnQpIG0uZHRtYigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6Om1vZHVsYXRpb24+KG1vZHVsYXRpb24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMTo6RFZCQ19BTk5FWDogeworICAgICAgICAgICAgc2Nhbk1lc3NhZ2Uuc2V0PFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTo6YW5uZXg+KChpbnQpbWVzc2FnZS5hbm5leCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRTY2FuTWVzc2FnZVR5cGVFeHQxXzE6OkhJR0hfUFJJT1JJVFk6IHsKKyAgICAgICAgICAgIHNjYW5NZXNzYWdlLnNldDxUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2U6OmlzSGlnaFByaW9yaXR5PihtZXNzYWdlLmlzSGlnaFByaW9yaXR5KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtVHVuZXJGcm9udGVuZENhbGxiYWNrLT5vblNjYW5NZXNzYWdlKChpbnQpdHlwZSwgc2Nhbk1lc3NhZ2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBUdW5lckZyb250ZW5kIEhlbHBlciBNZXRob2RzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgVHVuZXJGcm9udGVuZDo6Z2V0QWlkbEZyb250ZW5kU3RhdHVzKAorICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBoaWRsU3RhdHVzLCB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4mIGFpZGxTdGF0dXMpIHsKKyAgICBmb3IgKEZyb250ZW5kU3RhdHVzIHMgOiBoaWRsU3RhdHVzKSB7CisgICAgICAgIFR1bmVyRnJvbnRlbmRTdGF0dXMgc3RhdHVzOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzRGVtb2RMb2NrZWQ6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzRGVtb2RMb2NrZWQ+KHMuaXNEZW1vZExvY2tlZCgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzbnI6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnNucj4oKGludClzLnNucigpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpiZXI6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJlcj4oKGludClzLmJlcigpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwZXI6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnBlcj4oKGludClzLnBlcigpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwcmVCZXI6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnByZUJlcj4oKGludClzLnByZUJlcigpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWduYWxRdWFsaXR5OiB7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzaWduYWxRdWFsaXR5PigoaW50KXMuc2lnbmFsUXVhbGl0eSgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzaWduYWxTdHJlbmd0aDogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c2lnbmFsU3RyZW5ndGg+KChpbnQpcy5zaWduYWxTdHJlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpzeW1ib2xSYXRlOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpzeW1ib2xSYXRlPigoaW50KXMuc3ltYm9sUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppbm5lckZlYzogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW5uZXJGZWM+KChsb25nKXMuaW5uZXJGZWMoKSk7CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6bW9kdWxhdGlvbjogeworICAgICAgICAgICAgICAgIHN3aXRjaCAocy5tb2R1bGF0aW9uKCkuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuZHZiYygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5kdmJzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvblN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbj4oKGludClzLm1vZHVsYXRpb24oKS5pc2RicygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjptb2R1bGF0aW9uPigoaW50KXMubW9kdWxhdGlvbigpLmlzZGJzMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb25TdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6Om1vZHVsYXRpb24+KChpbnQpcy5tb2R1bGF0aW9uKCkuaXNkYnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppbnZlcnNpb246IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludmVyc2lvbj4oKGludClzLmludmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpsbmJWb2x0YWdlOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpsbmJWb2x0YWdlPigoaW50KXMubG5iVm9sdGFnZSgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwbHBJZDogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6cGxwSWQ+KChpbnQ4X3Qpcy5wbHBJZCgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjppc0VXQlM6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzRVdCUz4ocy5pc0VXQlMoKSk7CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YWdjOiB7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjphZ2M+KChpbnQ4X3Qpcy5hZ2MoKSk7CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMbmFPbjogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNMbmFPbj4ocy5pc0xuYU9uKCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzTGF5ZXJFcnJvcjogeworICAgICAgICAgICAgICAgIHZlY3Rvcjxib29sPiBlKHMuaXNMYXllckVycm9yKCkuYmVnaW4oKSwgcy5pc0xheWVyRXJyb3IoKS5lbmQoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppc0xheWVyRXJyb3I+KGUpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1lcjogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bWVyPigoaW50KXMubWVyKCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZyZXFPZmZzZXQ6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmZyZXFPZmZzZXQ+KChpbnQpcy5mcmVxT2Zmc2V0KCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmhpZXJhcmNoeTogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aGllcmFyY2h5PigoaW50KXMuaGllcmFyY2h5KCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzUmZMb2NrZWQ6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzUmZMb2NrZWQ+KHMuaXNSZkxvY2tlZCgpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1czo6aGlkbF9kaXNjcmltaW5hdG9yOjpwbHBJbmZvOiB7CisgICAgICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8+IGluZm87CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGkgOiBzLnBscEluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLnB1c2hfYmFjayh7CisgICAgICAgICAgICAgICAgICAgICAgICAucGxwSWQgPSAoaW50OF90KWkucGxwSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNMb2NrZWQgPSBpLmlzTG9ja2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgLnVlYyA9IChpbnQpaS51ZWMsCisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnBscEluZm8+KGluZm8pOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgVHVuZXJGcm9udGVuZDo6Z2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KAorICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXNFeHQxXzE+JiBoaWRsU3RhdHVzLCB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4mIGFpZGxTdGF0dXMpIHsKKyAgICBmb3IgKEZyb250ZW5kU3RhdHVzRXh0MV8xIHMgOiBoaWRsU3RhdHVzKSB7CisgICAgICAgIFR1bmVyRnJvbnRlbmRTdGF0dXMgc3RhdHVzOworICAgICAgICBzd2l0Y2ggKHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om1vZHVsYXRpb25zOiB7CisgICAgICAgICAgICAgICAgdmVjdG9yPGludD4gYWlkbE1vZDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gbSA6IHMubW9kdWxhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0uZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5kdmJjKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZE1vZHVsYXRpb246OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uZHZicygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmR2YnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uaXNkYnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmlzZGJzMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5pc2RidCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRNb2R1bGF0aW9uOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbE1vZC5wdXNoX2JhY2soKGludCltLmF0c2MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRsTW9kLnB1c2hfYmFjaygoaW50KW0uYXRzYzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kTW9kdWxhdGlvbjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxNb2QucHVzaF9iYWNrKChpbnQpbS5kdG1iKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6bW9kdWxhdGlvbnM+KGFpZGxNb2QpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJlcnM6IHsKKyAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiBiKHMuYmVycygpLmJlZ2luKCksIHMuYmVycygpLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJlcnM+KGIpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmNvZGVSYXRlczogeworICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ2NF90PiBjb2RlUmF0ZXM7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGMgOiBzLmNvZGVSYXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGVSYXRlcy5wdXNoX2JhY2soKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6Y29kZVJhdGVzPihjb2RlUmF0ZXMpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmJhbmR3aWR0aDogeworICAgICAgICAgICAgICAgIHN3aXRjaCAocy5iYW5kd2lkdGgoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuYXRzYzMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEJhbmR3aWR0aDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJjOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5kdmJjKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRCYW5kd2lkdGg6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6YmFuZHdpZHRoPigoaW50KXMuYmFuZHdpZHRoKCkuZHZidCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzZGJ0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpiYW5kd2lkdGg+KChpbnQpcy5iYW5kd2lkdGgoKS5pc2RidCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kQmFuZHdpZHRoOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR0bWI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmJhbmR3aWR0aD4oKGludClzLmJhbmR3aWR0aCgpLmR0bWIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aW50ZXJ2YWw6IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMuaW50ZXJ2YWwoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aW50ZXJ2YWw+KChpbnQpcy5pbnRlcnZhbCgpLmR2YnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEd1YXJkSW50ZXJ2YWw6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmludGVydmFsPigoaW50KXMuaW50ZXJ2YWwoKS5pc2RidCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kR3VhcmRJbnRlcnZhbDo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnRlcnZhbD4oKGludClzLmludGVydmFsKCkuZHRtYigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp0cmFuc21pc3Npb25Nb2RlOiB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzLnRyYW5zbWlzc2lvbk1vZGUoKS5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZidDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dHJhbnNtaXNzaW9uTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcy50cmFuc21pc3Npb25Nb2RlKCkuZHZidCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kVHJhbnNtaXNzaW9uTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dHJhbnNtaXNzaW9uTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcy50cmFuc21pc3Npb25Nb2RlKCkuaXNkYnQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFRyYW5zbWlzc2lvbk1vZGU6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHRtYjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dHJhbnNtaXNzaW9uTW9kZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcy50cmFuc21pc3Npb25Nb2RlKCkuZHRtYigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp1ZWM6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnVlYz4oKGludClzLnVlYygpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjpzeXN0ZW1JZDogeworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6c3lzdGVtSWQ+KChjaGFyMTZfdClzLnN5c3RlbUlkKCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmludGVybGVhdmluZzogeworICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+IGFpZGxJbnRlcjsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaSA6IHMuaW50ZXJsZWF2aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmF0c2MzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxJbnRlci5wdXNoX2JhY2soKGludClpLmF0c2MzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZEludGVybGVhdmVNb2RlOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmR2YmM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkbEludGVyLnB1c2hfYmFjaygoaW50KWkuZHZiYygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRJbnRlcmxlYXZlTW9kZTo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdG1iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGxJbnRlci5wdXNoX2JhY2soKGludClpLmR0bWIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjppbnRlcmxlYXZpbmc+KGFpZGxJbnRlcik7CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnRTZWdtZW50OiB7CisgICAgICAgICAgICAgICAgYXV0byBzZWcgPSBzLmlzZGJ0U2VnbWVudCgpOworICAgICAgICAgICAgICAgIHZlY3Rvcjx1aW50OF90PiBpKHNlZy5iZWdpbigpLCBzZWcuZW5kKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6aXNkYnRTZWdtZW50PihpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjp0c0RhdGFSYXRlOiB7CisgICAgICAgICAgICAgICAgdmVjdG9yPGludD4gdHMocy50c0RhdGFSYXRlKCkuYmVnaW4oKSwgcy50c0RhdGFSYXRlKCkuZW5kKCkpOworICAgICAgICAgICAgICAgIHN0YXR1cy5zZXQ8VHVuZXJGcm9udGVuZFN0YXR1czo6dHNEYXRhUmF0ZT4odHMpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnJvbGxPZmY6IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMucm9sbE9mZigpLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEZyb250ZW5kUm9sbE9mZjo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpyb2xsT2ZmPigoaW50KXMucm9sbE9mZigpLmR2YnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFJvbGxPZmY6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OnJvbGxPZmY+KChpbnQpcy5yb2xsT2ZmKCkuaXNkYnMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcm9udGVuZFJvbGxPZmY6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNkYnMzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldDxUdW5lckZyb250ZW5kU3RhdHVzOjpyb2xsT2ZmPigoaW50KXMucm9sbE9mZigpLmlzZGJzMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBGcm9udGVuZFN0YXR1c0V4dDFfMTo6aGlkbF9kaXNjcmltaW5hdG9yOjppc01pc286IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzTWlzbz4ocy5pc01pc28oKSk7CisgICAgICAgICAgICAgICAgYWlkbFN0YXR1cy5wdXNoX2JhY2soc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRnJvbnRlbmRTdGF0dXNFeHQxXzE6OmhpZGxfZGlzY3JpbWluYXRvcjo6aXNMaW5lYXI6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzTGluZWFyPihzLmlzTGluZWFyKCkpOworICAgICAgICAgICAgICAgIGFpZGxTdGF0dXMucHVzaF9iYWNrKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZyb250ZW5kU3RhdHVzRXh0MV8xOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmlzU2hvcnRGcmFtZXM6IHsKKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0PFR1bmVyRnJvbnRlbmRTdGF0dXM6OmlzU2hvcnRGcmFtZXM+KHMuaXNTaG9ydEZyYW1lcygpKTsKKyAgICAgICAgICAgICAgICBhaWRsU3RhdHVzLnB1c2hfYmFjayhzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IFR1bmVyRnJvbnRlbmQ6OmdldEF0c2MzUGxwU2V0dGluZ3MoCisgICAgICAgIGNvbnN0IFR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzJiBzZXR0aW5ncykgeworICAgIGludCBsZW4gPSBzZXR0aW5ncy5wbHBTZXR0aW5ncy5zaXplKCk7CisgICAgaGlkbF92ZWM8RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPiBwbHBzID0gaGlkbF92ZWM8RnJvbnRlbmRBdHNjM1BscFNldHRpbmdzPihsZW4pOworICAgIC8vIHBhcnNlIFBMUCBzZXR0aW5ncworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdWludDhfdCBwbHBJZCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLnBscElkKTsKKyAgICAgICAgRnJvbnRlbmRBdHNjM01vZHVsYXRpb24gbW9kdWxhdGlvbiA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjM01vZHVsYXRpb24+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLm1vZHVsYXRpb24pOworICAgICAgICBGcm9udGVuZEF0c2MzVGltZUludGVybGVhdmVNb2RlIGludGVybGVhdmVNb2RlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzVGltZUludGVybGVhdmVNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnBscFNldHRpbmdzW2ldLmludGVybGVhdmVNb2RlKTsKKyAgICAgICAgRnJvbnRlbmRBdHNjM0NvZGVSYXRlIGNvZGVSYXRlID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzQ29kZVJhdGU+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLmNvZGVSYXRlKTsKKyAgICAgICAgRnJvbnRlbmRBdHNjM0ZlYyBmZWMgPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNGZWM+KHNldHRpbmdzLnBscFNldHRpbmdzW2ldLmZlYyk7CisgICAgICAgIEZyb250ZW5kQXRzYzNQbHBTZXR0aW5ncyBmcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgeworICAgICAgICAgICAgICAgIC5wbHBJZCA9IHBscElkLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gbW9kdWxhdGlvbiwKKyAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPSBpbnRlcmxlYXZlTW9kZSwKKyAgICAgICAgICAgICAgICAuY29kZVJhdGUgPSBjb2RlUmF0ZSwKKyAgICAgICAgICAgICAgICAuZmVjID0gZmVjLAorICAgICAgICB9OworICAgICAgICBwbHBzW2ldID0gZnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOworICAgIH0KKyAgICByZXR1cm4gcGxwczsKK30KKworRnJvbnRlbmREdmJzQ29kZVJhdGUgVHVuZXJGcm9udGVuZDo6Z2V0RHZic0NvZGVSYXRlKGNvbnN0IFR1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUmIGNvZGVSYXRlKSB7CisgICAgRnJvbnRlbmRJbm5lckZlYyBpbm5lckZlYyA9IHN0YXRpY19jYXN0PEZyb250ZW5kSW5uZXJGZWM+KGNvZGVSYXRlLmZlYyk7CisgICAgYm9vbCBpc0xpbmVhciA9IGNvZGVSYXRlLmlzTGluZWFyOworICAgIGJvb2wgaXNTaG9ydEZyYW1lcyA9IGNvZGVSYXRlLmlzU2hvcnRGcmFtZXM7CisgICAgdWludDMyX3QgYml0c1BlcjEwMDBTeW1ib2wgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29kZVJhdGUuYml0c1BlcjEwMDBTeW1ib2wpOworICAgIEZyb250ZW5kRHZic0NvZGVSYXRlIGNvZGVyYXRlIHsKKyAgICAgICAgICAgIC5mZWMgPSBpbm5lckZlYywKKyAgICAgICAgICAgIC5pc0xpbmVhciA9IGlzTGluZWFyLAorICAgICAgICAgICAgLmlzU2hvcnRGcmFtZXMgPSBpc1Nob3J0RnJhbWVzLAorICAgICAgICAgICAgLmJpdHNQZXIxMDAwU3ltYm9sID0gYml0c1BlcjEwMDBTeW1ib2wsCisgICAgfTsKKyAgICByZXR1cm4gY29kZXJhdGU7Cit9CisKK0Zyb250ZW5kU2V0dGluZ3MgVHVuZXJGcm9udGVuZDo6Z2V0SGlkbEZyb250ZW5kU2V0dGluZ3MoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBhaWRsU2V0dGluZ3MpIHsKKyAgICBhdXRvIHNldHRpbmdzID0gYWlkbFNldHRpbmdzLnNldHRpbmdzOworICAgIEZyb250ZW5kU2V0dGluZ3MgZnJvbnRlbmRTZXR0aW5nczsKKworICAgIHN3aXRjaCAoc2V0dGluZ3MuZ2V0VGFnKCkpIHsKKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YW5hbG9nOiB7CisgICAgICAgICAgICBhdXRvIGFuYWxvZyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YW5hbG9nPigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5hbmFsb2coeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYW5hbG9nLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLnR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZEFuYWxvZ1R5cGU+KGFuYWxvZy5zaWduYWxUeXBlKSwKKyAgICAgICAgICAgICAgICAuc2lmU3RhbmRhcmQgPSBzdGF0aWNfY2FzdDxGcm9udGVuZEFuYWxvZ1NpZlN0YW5kYXJkPihhbmFsb2cuc2lmU3RhbmRhcmQpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphdHNjOiB7CisgICAgICAgICAgICBhdXRvIGF0c2MgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmF0c2M+KCk7CisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmF0c2MoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYXRzYy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRBdHNjTW9kdWxhdGlvbj4oYXRzYy5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6YXRzYzM6IHsKKyAgICAgICAgICAgIGF1dG8gYXRzYzMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmF0c2MzPigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5hdHNjMyh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhdHNjMy5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZEF0c2MzQmFuZHdpZHRoPihhdHNjMy5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdCA9IHN0YXRpY19jYXN0PEZyb250ZW5kQXRzYzNEZW1vZE91dHB1dEZvcm1hdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBhdHNjMy5kZW1vZE91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgLnBscFNldHRpbmdzID0gZ2V0QXRzYzNQbHBTZXR0aW5ncyhhdHNjMyksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmNhYmxlOiB7CisgICAgICAgICAgICBhdXRvIGR2YmMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmNhYmxlPigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5kdmJjKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YmMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY01vZHVsYXRpb24+KGR2YmMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmZlYyA9IHN0YXRpY19jYXN0PEZyb250ZW5kSW5uZXJGZWM+KGR2YmMuaW5uZXJGZWMpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YmMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLm91dGVyRmVjID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJjT3V0ZXJGZWM+KGR2YmMub3V0ZXJGZWMpLAorICAgICAgICAgICAgICAgIC5hbm5leCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY0FubmV4PihkdmJjLmFubmV4KSwKKyAgICAgICAgICAgICAgICAuc3BlY3RyYWxJbnZlcnNpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YmNTcGVjdHJhbEludmVyc2lvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICBkdmJjLnNwZWN0cmFsSW52ZXJzaW9uKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZiczogeworICAgICAgICAgICAgYXV0byBkdmJzID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJzPigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5kdmJzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic01vZHVsYXRpb24+KGR2YnMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gZ2V0RHZic0NvZGVSYXRlKGR2YnMuY29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5zeW1ib2xSYXRlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNSb2xsb2ZmPihkdmJzLnJvbGxvZmYpLAorICAgICAgICAgICAgICAgIC5waWxvdCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1BpbG90PihkdmJzLnBpbG90KSwKKyAgICAgICAgICAgICAgICAuaW5wdXRTdHJlYW1JZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkdmJzLmlucHV0U3RyZWFtSWQpLAorICAgICAgICAgICAgICAgIC5zdGFuZGFyZCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1N0YW5kYXJkPihkdmJzLnN0YW5kYXJkKSwKKyAgICAgICAgICAgICAgICAudmNtTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZic1ZjbU1vZGU+KGR2YnMudmNtKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZidDogeworICAgICAgICAgICAgYXV0byBkdmJ0ID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJ0PigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5kdmJ0KHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR2YnQuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidFRyYW5zbWlzc2lvbk1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgZHZidC50cmFuc21pc3Npb25Nb2RlKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0QmFuZHdpZHRoPihkdmJ0LmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLmNvbnN0ZWxsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uPihkdmJ0LmNvbnN0ZWxsYXRpb24pLAorICAgICAgICAgICAgICAgIC5oaWVyYXJjaHkgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRIaWVyYXJjaHk+KGR2YnQuaGllcmFyY2h5KSwKKyAgICAgICAgICAgICAgICAuaHBDb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidENvZGVyYXRlPihkdmJ0LmhwQ29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5scENvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0Q29kZXJhdGU+KGR2YnQubHBDb2RlUmF0ZSksCisgICAgICAgICAgICAgICAgLmd1YXJkSW50ZXJ2YWwgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnRHdWFyZEludGVydmFsPihkdmJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5pc0hpZ2hQcmlvcml0eSA9IGR2YnQuaXNIaWdoUHJpb3JpdHksCisgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdmJ0U3RhbmRhcmQ+KGR2YnQuc3RhbmRhcmQpLAorICAgICAgICAgICAgICAgIC5pc01pc28gPSBkdmJ0LmlzTWlzbywKKyAgICAgICAgICAgICAgICAucGxwTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZidFBscE1vZGU+KGR2YnQucGxwTW9kZSksCisgICAgICAgICAgICAgICAgLnBscElkID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZHZidC5wbHBJZCksCisgICAgICAgICAgICAgICAgLnBscEdyb3VwSWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkdmJ0LnBscEdyb3VwSWQpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjppc2RiczogeworICAgICAgICAgICAgYXV0byBpc2RicyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnM+KCk7CisgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzLmlzZGJzKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJzLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGlzZGJzLnN0cmVhbUlkKSwKKyAgICAgICAgICAgICAgICAuc3RyZWFtSWRUeXBlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2Ric1N0cmVhbUlkVHlwZT4oaXNkYnMuc3RyZWFtSWRUeXBlKSwKKyAgICAgICAgICAgICAgICAubW9kdWxhdGlvbiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNNb2R1bGF0aW9uPihpc2Ricy5tb2R1bGF0aW9uKSwKKyAgICAgICAgICAgICAgICAuY29kZXJhdGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzQ29kZXJhdGU+KGlzZGJzLmNvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2Ricy5zeW1ib2xSYXRlKSwKKyAgICAgICAgICAgICAgICAucm9sbG9mZiA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNSb2xsb2ZmPihpc2Ricy5yb2xsb2ZmKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnMzOiB7CisgICAgICAgICAgICBhdXRvIGlzZGJzMyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnMzPigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5pc2RiczMoeworICAgICAgICAgICAgICAgIC5mcmVxdWVuY3kgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oaXNkYnMzLmZyZXF1ZW5jeSksCisgICAgICAgICAgICAgICAgLnN0cmVhbUlkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGlzZGJzMy5zdHJlYW1JZCksCisgICAgICAgICAgICAgICAgLnN0cmVhbUlkVHlwZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnNTdHJlYW1JZFR5cGU+KGlzZGJzMy5zdHJlYW1JZFR5cGUpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNNb2R1bGF0aW9uPihpc2RiczMubW9kdWxhdGlvbiksCisgICAgICAgICAgICAgICAgLmNvZGVyYXRlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RiczNDb2RlcmF0ZT4oaXNkYnMzLmNvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAuc3ltYm9sUmF0ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RiczMuc3ltYm9sUmF0ZSksCisgICAgICAgICAgICAgICAgLnJvbGxvZmYgPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJzM1JvbGxvZmY+KGlzZGJzMy5yb2xsb2ZmKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6aXNkYnQ6IHsKKyAgICAgICAgICAgIGF1dG8gaXNkYnQgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmlzZGJ0PigpOworICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5ncy5pc2RidCh7CisgICAgICAgICAgICAgICAgLmZyZXF1ZW5jeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihpc2RidC5mcmVxdWVuY3kpLAorICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZHVsYXRpb24+KGlzZGJ0Lm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5iYW5kd2lkdGggPSBzdGF0aWNfY2FzdDxGcm9udGVuZElzZGJ0QmFuZHdpZHRoPihpc2RidC5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIC5tb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidE1vZGU+KGlzZGJ0Lm1vZGUpLAorICAgICAgICAgICAgICAgIC5jb2RlcmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kSXNkYnRDb2RlcmF0ZT4oaXNkYnQuY29kZVJhdGUpLAorICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRJc2RidEd1YXJkSW50ZXJ2YWw+KGlzZGJ0Lmd1YXJkSW50ZXJ2YWwpLAorICAgICAgICAgICAgICAgIC5zZXJ2aWNlQXJlYUlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlzZGJ0LnNlcnZpY2VBcmVhSWQpLAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZyb250ZW5kU2V0dGluZ3M7Cit9CisKK0Zyb250ZW5kU2V0dGluZ3NFeHQxXzEgVHVuZXJGcm9udGVuZDo6Z2V0SGlkbEZyb250ZW5kU2V0dGluZ3NFeHQoCisgICAgICAgIGNvbnN0IFR1bmVyRnJvbnRlbmRTZXR0aW5ncyYgYWlkbFNldHRpbmdzKSB7CisgICAgRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBmcm9udGVuZFNldHRpbmdzRXh0eworICAgICAgICAuZW5kRnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGFpZGxTZXR0aW5ncy5lbmRGcmVxdWVuY3kpLAorICAgICAgICAuaW52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmRTcGVjdHJhbEludmVyc2lvbj4oYWlkbFNldHRpbmdzLmludmVyc2lvbiksCisgICAgfTsKKworICAgIGF1dG8gc2V0dGluZ3MgPSBhaWRsU2V0dGluZ3Muc2V0dGluZ3M7CisgICAgc3dpdGNoIChzZXR0aW5ncy5nZXRUYWcoKSkgeworICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c6IHsKKyAgICAgICAgICAgIGF1dG8gYW5hbG9nID0gc2V0dGluZ3MuZ2V0PFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjphbmFsb2c+KCk7CisgICAgICAgICAgICBpZiAoYW5hbG9nLmlzRXh0ZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuYW5hbG9nKHsKKyAgICAgICAgICAgICAgICAgICAgLmFmdEZsYWcgPSBzdGF0aWNfY2FzdDxGcm9udGVuZEFuYWxvZ0FmdEZsYWc+KGFuYWxvZy5hZnRGbGFnKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0Lm5vaW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU6IHsKKyAgICAgICAgICAgIGF1dG8gZHZiYyA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6Y2FibGU+KCk7CisgICAgICAgICAgICBpZiAoZHZiYy5pc0V4dGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YmMoeworICAgICAgICAgICAgICAgICAgICAuaW50ZXJsZWF2ZU1vZGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZENhYmxlVGltZUludGVybGVhdmVNb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmJjLmludGVybGVhdmVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHZiY0JhbmR3aWR0aD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZiYy5iYW5kd2lkdGgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQubm9pbml0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOjpkdmJzOiB7CisgICAgICAgICAgICBhdXRvIGR2YnMgPSBzZXR0aW5ncy5nZXQ8VHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnM+KCk7CisgICAgICAgICAgICBpZiAoZHZicy5pc0V4dGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZnJvbnRlbmRTZXR0aW5nc0V4dC5zZXR0aW5nRXh0LmR2YnMoeworICAgICAgICAgICAgICAgICAgICAuc2NhblR5cGUgPSBzdGF0aWNfY2FzdDxGcm9udGVuZER2YnNTY2FuVHlwZT4oZHZicy5zY2FuVHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5pc0Rpc2VxY1J4TWVzc2FnZSA9IGR2YnMuaXNEaXNlcWNSeE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR2YnQ6IHsKKyAgICAgICAgICAgIGF1dG8gZHZidCA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHZidD4oKTsKKyAgICAgICAgICAgIGlmIChkdmJ0LmlzRXh0ZW5kZWQpIHsKKyAgICAgICAgICAgICAgICBmcm9udGVuZFNldHRpbmdzRXh0LnNldHRpbmdFeHQuZHZidCh7CisgICAgICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER2YnRDb25zdGVsbGF0aW9uPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YnQuY29uc3RlbGxhdGlvbiksCisgICAgICAgICAgICAgICAgICAgIC50cmFuc21pc3Npb25Nb2RlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZER2YnRUcmFuc21pc3Npb25Nb2RlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR2YnQudHJhbnNtaXNzaW9uTW9kZSksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3M6OmR0bWI6IHsKKyAgICAgICAgICAgIGF1dG8gZHRtYiA9IHNldHRpbmdzLmdldDxUdW5lckZyb250ZW5kVW5pb25TZXR0aW5nczo6ZHRtYj4oKTsKKyAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5kdG1iKHsKKyAgICAgICAgICAgICAgICAuZnJlcXVlbmN5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGR0bWIuZnJlcXVlbmN5KSwKKyAgICAgICAgICAgICAgICAudHJhbnNtaXNzaW9uTW9kZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYlRyYW5zbWlzc2lvbk1vZGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgZHRtYi50cmFuc21pc3Npb25Nb2RlKSwKKyAgICAgICAgICAgICAgICAuYmFuZHdpZHRoID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iQmFuZHdpZHRoPihkdG1iLmJhbmR3aWR0aCksCisgICAgICAgICAgICAgICAgLm1vZHVsYXRpb24gPSBzdGF0aWNfY2FzdDxGcm9udGVuZER0bWJNb2R1bGF0aW9uPihkdG1iLm1vZHVsYXRpb24pLAorICAgICAgICAgICAgICAgIC5jb2RlUmF0ZSA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYkNvZGVSYXRlPihkdG1iLmNvZGVSYXRlKSwKKyAgICAgICAgICAgICAgICAuZ3VhcmRJbnRlcnZhbCA9IHN0YXRpY19jYXN0PEZyb250ZW5kRHRtYkd1YXJkSW50ZXJ2YWw+KGR0bWIuZ3VhcmRJbnRlcnZhbCksCisgICAgICAgICAgICAgICAgLmludGVybGVhdmVNb2RlID0gc3RhdGljX2Nhc3Q8RnJvbnRlbmREdG1iVGltZUludGVybGVhdmVNb2RlPihkdG1iLmludGVybGVhdmVNb2RlKSwKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZyb250ZW5kU2V0dGluZ3NFeHQuc2V0dGluZ0V4dC5ub2luaXQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmcm9udGVuZFNldHRpbmdzRXh0OworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyRnJvbnRlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmZkNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJGcm9udGVuZC5oCkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUdW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lGcm9udGVuZENhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJGcm9udGVuZDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRnJvbnRlbmRDYWxsYmFjazsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyTG5iOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5nczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZTsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kU2V0dGluZ3M7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kQXRzYzNQbHBTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmREdmJzQ29kZVJhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkZyb250ZW5kRXZlbnRUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFNjYW5NZXNzYWdlVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTZXR0aW5nczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RnJvbnRlbmRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGcm9udGVuZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6SUZyb250ZW5kQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VFeHQxXzE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OkZyb250ZW5kU2Nhbk1lc3NhZ2VUeXBlRXh0MV8xOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFNldHRpbmdzRXh0MV8xOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpGcm9udGVuZFN0YXR1c0V4dDFfMTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUdW5lckZyb250ZW5kIDogcHVibGljIEJuVHVuZXJGcm9udGVuZCB7CisKK3B1YmxpYzoKKyAgICBUdW5lckZyb250ZW5kKHNwPElGcm9udGVuZD4gZnJvbnRlbmQsIGludCBpZCk7CisgICAgdmlydHVhbCB+VHVuZXJGcm9udGVuZCgpOworICAgIFN0YXR1cyBzZXRDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmRDYWxsYmFjaz4mIHR1bmVyRnJvbnRlbmRDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHR1bmUoY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHN0b3BUdW5lKCkgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNjYW4oY29uc3QgVHVuZXJGcm9udGVuZFNldHRpbmdzJiBzZXR0aW5ncywgaW50IGZyb250ZW5kU2NhblR5cGUpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzdG9wU2NhbigpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRMbmIoY29uc3Qgc2hhcmVkX3B0cjxJVHVuZXJMbmI+JiBsbmIpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRMbmEoYm9vbCBiRW5hYmxlKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgbGlua0NpQ2FtVG9Gcm9udGVuZChpbnQgY2lDYW1JZCwgaW50MzJfdCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgdW5saW5rQ2lDYW1Ub0Zyb250ZW5kKGludCBjaUNhbUlkKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgZ2V0U3RhdHVzKGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgc3RhdHVzVHlwZXMsCisgICAgICAgICAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldFN0YXR1c0V4dGVuZGVkXzFfMShjb25zdCB2ZWN0b3I8aW50MzJfdD4mIHN0YXR1c1R5cGVzLAorICAgICAgICAgICAgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRGcm9udGVuZElkKGludCogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKworICAgIHN0cnVjdCBGcm9udGVuZENhbGxiYWNrIDogcHVibGljIElGcm9udGVuZENhbGxiYWNrIHsKKyAgICAgICAgRnJvbnRlbmRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IHR1bmVyRnJvbnRlbmRDYWxsYmFjaykKKyAgICAgICAgICAgICAgICA6IG1UdW5lckZyb250ZW5kQ2FsbGJhY2sodHVuZXJGcm9udGVuZENhbGxiYWNrKSB7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KEZyb250ZW5kRXZlbnRUeXBlIGZyb250ZW5kRXZlbnRUeXBlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlJiBtZXNzYWdlKTsKKyAgICAgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25TY2FuTWVzc2FnZUV4dDFfMSgKKyAgICAgICAgICAgICAgICBGcm9udGVuZFNjYW5NZXNzYWdlVHlwZUV4dDFfMSB0eXBlLCBjb25zdCBGcm9udGVuZFNjYW5NZXNzYWdlRXh0MV8xJiBtZXNzYWdlKTsKKworICAgICAgICBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kQ2FsbGJhY2s+IG1UdW5lckZyb250ZW5kQ2FsbGJhY2s7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBoaWRsX3ZlYzxGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3M+IGdldEF0c2MzUGxwU2V0dGluZ3MoCisgICAgICAgICAgICBjb25zdCBUdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncyYgc2V0dGluZ3MpOworICAgIEZyb250ZW5kRHZic0NvZGVSYXRlIGdldER2YnNDb2RlUmF0ZShjb25zdCBUdW5lckZyb250ZW5kRHZic0NvZGVSYXRlJiBjb2RlUmF0ZSk7CisgICAgRnJvbnRlbmRTZXR0aW5ncyBnZXRIaWRsRnJvbnRlbmRTZXR0aW5ncyhjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncyk7CisgICAgRnJvbnRlbmRTZXR0aW5nc0V4dDFfMSBnZXRIaWRsRnJvbnRlbmRTZXR0aW5nc0V4dChjb25zdCBUdW5lckZyb250ZW5kU2V0dGluZ3MmIGFpZGxTZXR0aW5ncyk7CisgICAgdm9pZCBnZXRBaWRsRnJvbnRlbmRTdGF0dXMoCisgICAgICAgICAgICB2ZWN0b3I8RnJvbnRlbmRTdGF0dXM+JiBoaWRsU3RhdHVzLCB2ZWN0b3I8VHVuZXJGcm9udGVuZFN0YXR1cz4mIGFpZGxTdGF0dXMpOworICAgIHZvaWQgZ2V0QWlkbEZyb250ZW5kU3RhdHVzRXh0KAorICAgICAgICAgICAgdmVjdG9yPEZyb250ZW5kU3RhdHVzRXh0MV8xPiYgaGlkbFN0YXR1cywgdmVjdG9yPFR1bmVyRnJvbnRlbmRTdGF0dXM+JiBhaWRsU3RhdHVzKTsKKworICAgIGludCBtSWQ7CisgICAgc3A8SUZyb250ZW5kPiBtRnJvbnRlbmQ7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJRnJvbnRlbmQ+IG1Gcm9udGVuZF8xXzE7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSRlJPTlRFTkRfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJMbmIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjQ4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlR1bmVyTG5iIgorCisjaW5jbHVkZSAiVHVuZXJMbmIuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpMbmJQb3NpdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVG9uZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iVm9sdGFnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyTG5iOjpUdW5lckxuYihzcDxJTG5iPiBsbmIsIGludCBpZCkgeworICAgIG1MbmIgPSBsbmI7CisgICAgbUlkID0gaWQ7Cit9CisKK1R1bmVyTG5iOjp+VHVuZXJMbmIoKSB7CisgICAgbUxuYiA9IE5VTEw7CisgICAgbUlkID0gLTE7Cit9CisKK1N0YXR1cyBUdW5lckxuYjo6c2V0Q2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+JiB0dW5lckxuYkNhbGxiYWNrKSB7CisgICAgaWYgKG1MbmIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpZiAodHVuZXJMbmJDYWxsYmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlQpKTsKKyAgICB9CisKKyAgICBzcDxJTG5iQ2FsbGJhY2s+IGxuYkNhbGxiYWNrID0gbmV3IExuYkNhbGxiYWNrKHR1bmVyTG5iQ2FsbGJhY2spOworICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRDYWxsYmFjayhsbmJDYWxsYmFjayk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJMbmI6OnNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIHsKKyAgICBpZiAobUxuYiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRWb2x0YWdlKHN0YXRpY19jYXN0PExuYlZvbHRhZ2U+KHZvbHRhZ2UpKTsKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckxuYjo6c2V0VG9uZShpbnQgdG9uZSkgeworICAgIGlmIChtTG5iID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHN0YXR1cyA9IG1MbmItPnNldFRvbmUoc3RhdGljX2Nhc3Q8TG5iVG9uZT4odG9uZSkpOworICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyTG5iOjpzZXRTYXRlbGxpdGVQb3NpdGlvbihpbnQgcG9zaXRpb24pIHsKKyAgICBpZiAobUxuYiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJTG5iIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCBzdGF0dXMgPSBtTG5iLT5zZXRTYXRlbGxpdGVQb3NpdGlvbihzdGF0aWNfY2FzdDxMbmJQb3NpdGlvbj4ocG9zaXRpb24pKTsKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lckxuYjo6c2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSB7CisgICAgaWYgKG1MbmIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSUxuYiBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbUxuYi0+c2VuZERpc2VxY01lc3NhZ2UoZGlzZXFjTWVzc2FnZSk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJMbmI6OmNsb3NlKCkgeworICAgIGlmIChtTG5iID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklMbmIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1MbmItPmNsb3NlKCk7CisgICAgbUxuYiA9IE5VTEw7CisKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLyBJTG5iQ2FsbGJhY2sgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUmV0dXJuPHZvaWQ+IFR1bmVyTG5iOjpMbmJDYWxsYmFjazo6b25FdmVudChjb25zdCBMbmJFdmVudFR5cGUgbG5iRXZlbnRUeXBlKSB7CisgICAgaWYgKG1UdW5lckxuYkNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRXZlbnQoKGludClsbmJFdmVudFR5cGUpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gVHVuZXJMbmI6OkxuYkNhbGxiYWNrOjpvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpIHsKKyAgICBpZiAobVR1bmVyTG5iQ2FsbGJhY2sgIT0gTlVMTCAmJiBkaXNlcWNNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgdmVjdG9yPHVpbnQ4X3Q+IG1zZyhiZWdpbihkaXNlcWNNZXNzYWdlKSwgZW5kKGRpc2VxY01lc3NhZ2UpKTsKKyAgICAgICAgbVR1bmVyTG5iQ2FsbGJhY2stPm9uRGlzZXFjTWVzc2FnZShtc2cpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL1R1bmVyTG5iLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMGQwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lckxuYi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJGTE5CX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkZMTkJfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0JuVHVuZXJMbmIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3R2L3R1bmVyLzEuMC9JTG5iLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjAvSUxuYkNhbGxiYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwordXNpbmcgU3RhdHVzID0gOjpuZGs6OlNjb3BlZEFTdGF0dXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJMbmI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckxuYkNhbGxiYWNrOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJTG5iQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkxuYkV2ZW50VHlwZTsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUdW5lckxuYiA6IHB1YmxpYyBCblR1bmVyTG5iIHsKKworcHVibGljOgorICAgIFR1bmVyTG5iKHNwPElMbmI+IGxuYiwgaW50IGlkKTsKKyAgICB2aXJ0dWFsIH5UdW5lckxuYigpOworICAgIFN0YXR1cyBzZXRDYWxsYmFjayhjb25zdCBzaGFyZWRfcHRyPElUdW5lckxuYkNhbGxiYWNrPiYgdHVuZXJMbmJDYWxsYmFjaykgb3ZlcnJpZGU7CisgICAgU3RhdHVzIHNldFZvbHRhZ2UoaW50IHZvbHRhZ2UpIG92ZXJyaWRlOworICAgIFN0YXR1cyBzZXRUb25lKGludCB0b25lKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW50IHBvc2l0aW9uKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgc2VuZERpc2VxY01lc3NhZ2UoY29uc3QgdmVjdG9yPHVpbnQ4X3Q+JiBkaXNlcWNNZXNzYWdlKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgY2xvc2UoKSBvdmVycmlkZTsKKworICAgIGludCBnZXRJZCgpIHsgcmV0dXJuIG1JZDsgfQorCisgICAgc3RydWN0IExuYkNhbGxiYWNrIDogcHVibGljIElMbmJDYWxsYmFjayB7CisgICAgICAgIExuYkNhbGxiYWNrKGNvbnN0IHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IHR1bmVyTG5iQ2FsbGJhY2spCisgICAgICAgICAgICAgICAgOiBtVHVuZXJMbmJDYWxsYmFjayh0dW5lckxuYkNhbGxiYWNrKSB7fTsKKworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkV2ZW50KGNvbnN0IExuYkV2ZW50VHlwZSBsbmJFdmVudFR5cGUpOworICAgICAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkRpc2VxY01lc3NhZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGRpc2VxY01lc3NhZ2UpOworCisgICAgICAgIHNoYXJlZF9wdHI8SVR1bmVyTG5iQ2FsbGJhY2s+IG1UdW5lckxuYkNhbGxiYWNrOworICAgIH07CisKK3ByaXZhdGU6CisgICAgaW50IG1JZDsKKyAgICBzcDxJTG5iPiBtTG5iOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQV9UVU5FUkZMTkJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0MTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5jcHAKQEAgLTAsMCArMSw1NjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJUdW5lclNlcnZpY2UiCisKKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9tYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJUdW5lclNlcnZpY2UuaCIKKyNpbmNsdWRlICJUdW5lckZyb250ZW5kLmgiCisjaW5jbHVkZSAiVHVuZXJMbmIuaCIKKyNpbmNsdWRlICJUdW5lckRlbXV4LmgiCisjaW5jbHVkZSAiVHVuZXJEZXNjcmFtYmxlci5oIgorCit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6VHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZFR5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklGcm9udGVuZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SUxuYjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6TG5iSWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMTo6RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyU2VydmljZTo6VHVuZXJTZXJ2aWNlKCkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1nciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VNZ3I7CisgICAgaWYgKHNlcnZpY2VNZ3IuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHNlcnZpY2UgbWFuYWdlciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNlcnZpY2VNZ3ItPndhaXRGb3JTZXJ2aWNlKFN0cmluZzE2KCJwYWNrYWdlX25hdGl2ZSIpKTsKKyAgICAgICAgcGFja2FnZU1nciA9IGludGVyZmFjZV9jYXN0PGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+KGJpbmRlcik7CisgICAgfQorCisgICAgYm9vbCBoYXNGZWF0dXJlID0gZmFsc2U7CisgICAgaWYgKHBhY2thZ2VNZ3IgIT0gbnVsbHB0cikgeworICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBwYWNrYWdlTWdyLT5oYXNTeXN0ZW1GZWF0dXJlKEZFQVRVUkVfVFVORVIsIDAsICZoYXNGZWF0dXJlKTsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGhhc1N5c3RlbUZlYXR1cmUgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMuZXhjZXB0aW9uTWVzc2FnZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzRmVhdHVyZSkgeworICAgICAgICAgICAgQUxPR0QoIkN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdHVuZXIgZmVhdXJlLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIiVzOiBDYW5ub3QgZmluZCBwYWNrYWdlIG1hbmFnZXIuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgOjpuZGs6OlNwQUlCaW5kZXIgYmluZGVyKEFTZXJ2aWNlTWFuYWdlcl93YWl0Rm9yU2VydmljZSgidHZfdHVuZXJfcmVzb3VyY2VfbWdyIikpOworICAgIG1UdW5lclJlc291cmNlTWFuYWdlciA9IElUdW5lclJlc291cmNlTWFuYWdlcjo6ZnJvbUJpbmRlcihiaW5kZXIpOworICAgIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKCk7Cit9CisKK1R1bmVyU2VydmljZTo6flR1bmVyU2VydmljZSgpIHt9CisKK2JpbmRlcl9zdGF0dXNfdCBUdW5lclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgeworICAgIHNoYXJlZF9wdHI8VHVuZXJTZXJ2aWNlPiBzZXJ2aWNlID0KKyAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFR1bmVyU2VydmljZT4oKTsKKyAgICByZXR1cm4gQVNlcnZpY2VNYW5hZ2VyX2FkZFNlcnZpY2Uoc2VydmljZS0+YXNCaW5kZXIoKS5nZXQoKSwgZ2V0U2VydmljZU5hbWUoKSk7Cit9CisKK2Jvb2wgVHVuZXJTZXJ2aWNlOjpoYXNJVHVuZXIoKSB7CisgICAgQUxPR0QoImhhc0lUdW5lciIpOworICAgIGlmIChtVHVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgbVR1bmVyID0gSVR1bmVyOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1UdW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lciBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OXzFfMDsKKyAgICBtVHVuZXJfMV8xID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpJVHVuZXI6OmNhc3RGcm9tKG1UdW5lcik7CisgICAgaWYgKG1UdW5lcl8xXzEgIT0gbnVsbHB0cikgeworICAgICAgICBtVHVuZXJWZXJzaW9uID0gVFVORVJfSEFMX1ZFUlNJT05fMV8xOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IElUdW5lcl8xXzEgc2VydmljZSIpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBUdW5lclNlcnZpY2U6Omhhc0lUdW5lcl8xXzEoKSB7CisgICAgQUxPR0QoImhhc0lUdW5lcl8xXzEiKTsKKyAgICBoYXNJVHVuZXIoKTsKKyAgICByZXR1cm4gKG1UdW5lclZlcnNpb24gPT0gVFVORVJfSEFMX1ZFUlNJT05fMV8xKTsKK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkRlbXV4KAorICAgICAgICBpbnQgLyogZGVtdXhIYW5kbGUgKi8sIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZW11eD4qIF9haWRsX3JldHVybikgeworICAgIEFMT0dEKCJvcGVuRGVtdXgiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRCkpOworICAgIH0KKyAgICBSZXN1bHQgcmVzOworICAgIHVpbnQzMl90IGlkOworICAgIHNwPElEZW11eD4gZGVtdXhTcCA9IG51bGxwdHI7CisgICAgc2hhcmVkX3B0cjxJVHVuZXJEZW11eD4gdHVuZXJEZW11eCA9IG51bGxwdHI7CisgICAgbVR1bmVyLT5vcGVuRGVtdXgoWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkZW11eElkLCBjb25zdCBzcDxJRGVtdXg+JiBkZW11eCkgeworICAgICAgICBkZW11eFNwID0gZGVtdXg7CisgICAgICAgIGlkID0gZGVtdXhJZDsKKyAgICAgICAgcmVzID0gcjsKKyAgICAgICAgQUxPR0QoIm9wZW4gZGVtdXgsIGlkID0gJWQiLCBkZW11eElkKTsKKyAgICB9KTsKKyAgICBpZiAocmVzID09IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICB0dW5lckRlbXV4ID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZW11eD4oZGVtdXhTcCwgaWQpOworICAgICAgICAqX2FpZGxfcmV0dXJuID0gdHVuZXJEZW11eC0+cmVmPElUdW5lckRlbXV4PigpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOworICAgIH0KKworICAgIEFMT0dXKCJvcGVuIGRlbXV4IGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RGVtdXhDYXBzKFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMqIF9haWRsX3JldHVybikgeworICAgIEFMT0dEKCJnZXREZW11eENhcHMiKTsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRCkpOworICAgIH0KKyAgICBSZXN1bHQgcmVzOworICAgIERlbXV4Q2FwYWJpbGl0aWVzIGNhcHM7CisgICAgbVR1bmVyLT5nZXREZW11eENhcHMoWyZdKFJlc3VsdCByLCBjb25zdCBEZW11eENhcGFiaWxpdGllcyYgZGVtdXhDYXBzKSB7CisgICAgICAgIGNhcHMgPSBkZW11eENhcHM7CisgICAgICAgIHJlcyA9IHI7CisgICAgfSk7CisgICAgaWYgKHJlcyA9PSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IGdldEFpZGxEZW11eENhcHMoY2Fwcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorCisgICAgQUxPR1coIkdldCBkZW11eCBjYXBzIGZhaWxlZCwgcmVzID0gJWQiLCByZXMpOworICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRCkpOworICAgIH0KKyAgICBoaWRsX3ZlYzxGcm9udGVuZElkPiBmZUlkczsKKyAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGZlSWRzKTsKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIGlkcy0+cmVzaXplKGZlSWRzLnNpemUoKSk7CisgICAgY29weShmZUlkcy5iZWdpbigpLCBmZUlkcy5lbmQoKSwgaWRzLT5iZWdpbigpKTsKKworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lclNlcnZpY2U6OmdldEZyb250ZW5kSW5mbyhpbnQzMl90IGlkLCBUdW5lckZyb250ZW5kSW5mbyogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiSVR1bmVyIHNlcnZpY2UgaXMgbm90IGluaXQuIik7CisgICAgICAgIHJldHVybiA6Om5kazo6U2NvcGVkQVN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBGcm9udGVuZEluZm8gaW5mbzsKKyAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSW5mbyhpZCwgaW5mbyk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHJlcykpOworICAgIH0KKworICAgIFR1bmVyRnJvbnRlbmRJbmZvIHR1bmVySW5mbyA9IGNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oaW5mbyk7CisgICAgKl9haWRsX3JldHVybiA9IHR1bmVySW5mbzsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJTZXJ2aWNlOjpnZXRGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMoCisgICAgICAgIGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcl8xXzEoKSkgeworICAgICAgICBBTE9HRSgiSVR1bmVyXzFfMSBzZXJ2aWNlIGlzIG5vdCBpbml0LiIpOworICAgICAgICByZXR1cm4gOjpuZGs6OlNjb3BlZEFTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcigKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHJlczsKKyAgICBGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZHRtYkNhcHM7CisgICAgbVR1bmVyXzFfMS0+Z2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKGlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMmIGNhcHMpIHsKKyAgICAgICAgZHRtYkNhcHMgPSBjYXBzOworICAgICAgICByZXMgPSByOworICAgIH0pOworICAgIGlmIChyZXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihyZXMpKTsKKyAgICB9CisKKyAgICBUdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcyBhaWRsRHRtYkNhcHN7CisgICAgICAgIC50cmFuc21pc3Npb25Nb2RlQ2FwID0gKGludClkdG1iQ2Fwcy50cmFuc21pc3Npb25Nb2RlQ2FwLAorICAgICAgICAuYmFuZHdpZHRoQ2FwID0gKGludClkdG1iQ2Fwcy5iYW5kd2lkdGhDYXAsCisgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludClkdG1iQ2Fwcy5tb2R1bGF0aW9uQ2FwLAorICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWR0bWJDYXBzLmNvZGVSYXRlQ2FwLAorICAgICAgICAuZ3VhcmRJbnRlcnZhbENhcCA9IChpbnQpZHRtYkNhcHMuZ3VhcmRJbnRlcnZhbENhcCwKKyAgICAgICAgLmludGVybGVhdmVNb2RlQ2FwID0gKGludClkdG1iQ2Fwcy5pbnRlcmxlYXZlTW9kZUNhcCwKKyAgICB9OworCisgICAgKl9haWRsX3JldHVybiA9IGFpZGxEdG1iQ2FwczsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuRnJvbnRlbmQoCisgICAgICAgIGludDMyX3QgZnJvbnRlbmRIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyRnJvbnRlbmQ+KiBfYWlkbF9yZXR1cm4pIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpKSB7CisgICAgICAgIEFMT0dFKCJJVHVuZXIgc2VydmljZSBpcyBub3QgaW5pdC4iKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzOworICAgIHNwPElGcm9udGVuZD4gZnJvbnRlbmQ7CisgICAgaW50IGlkID0gZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZnJvbnRlbmRIYW5kbGUsIEZST05URU5EKTsKKyAgICBtVHVuZXItPm9wZW5Gcm9udGVuZEJ5SWQoaWQsIFsmXShSZXN1bHQgcmVzdWx0LCBjb25zdCBzcDxJRnJvbnRlbmQ+JiBmZSkgeworICAgICAgICBmcm9udGVuZCA9IGZlOworICAgICAgICBzdGF0dXMgPSByZXN1bHQ7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJGcm9udGVuZD4oZnJvbnRlbmQsIGlkKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJTZXJ2aWNlOjpvcGVuTG5iKGludCBsbmJIYW5kbGUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRCgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzOworICAgIHNwPElMbmI+IGxuYjsKKyAgICBpbnQgaWQgPSBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShsbmJIYW5kbGUsIExOQik7CisgICAgbVR1bmVyLT5vcGVuTG5iQnlJZChpZCwgWyZdKFJlc3VsdCByZXN1bHQsIGNvbnN0IHNwPElMbmI+JiBsbmJTcCl7CisgICAgICAgIGxuYiA9IGxuYlNwOworICAgICAgICBzdGF0dXMgPSByZXN1bHQ7CisgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKworICAgICpfYWlkbF9yZXR1cm4gPSA6Om5kazo6U2hhcmVkUmVmQmFzZTo6bWFrZTxUdW5lckxuYj4obG5iLCBpZCk7CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6b3BlbkxuYkJ5TmFtZShjb25zdCBzdHJpbmcmIGxuYk5hbWUsIHNoYXJlZF9wdHI8SVR1bmVyTG5iPiogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKCFoYXNJVHVuZXIoKSkgeworICAgICAgICBBTE9HRSgiZ2V0IElUdW5lciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBpbnQgbG5iSWQ7CisgICAgUmVzdWx0IHN0YXR1czsKKyAgICBzcDxJTG5iPiBsbmI7CisgICAgbVR1bmVyLT5vcGVuTG5iQnlOYW1lKGxuYk5hbWUsIFsmXShSZXN1bHQgciwgTG5iSWQgaWQsIGNvbnN0IHNwPElMbmI+JiBsbmJTcCkgeworICAgICAgICBzdGF0dXMgPSByOworICAgICAgICBsbmIgPSBsbmJTcDsKKyAgICAgICAgbG5iSWQgPSAoaW50KWlkOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJMbmI+KGxuYiwgbG5iSWQpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lclNlcnZpY2U6Om9wZW5EZXNjcmFtYmxlcihpbnQzMl90IC8qZGVzY3JhbWJsZXJIYW5kbGUqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJVHVuZXJEZXNjcmFtYmxlcj4qIF9haWRsX3JldHVybikgeworICAgIGlmICghaGFzSVR1bmVyKCkpIHsKKyAgICAgICAgQUxPR0QoImdldCBJVHVuZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHN0YXR1czsKKyAgICBzcDxJRGVzY3JhbWJsZXI+IGRlc2NyYW1ibGVyOworICAgIC8vaW50IGlkID0gZ2V0UmVzb3VyY2VJZEZyb21IYW5kbGUoZGVzY3JhbWJsZXJIYW5kbGUsIERFU0NSQU1CTEVSKTsKKyAgICBtVHVuZXItPm9wZW5EZXNjcmFtYmxlcihbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXNjcmFtYmxlcj4mIGRlc2NyYW1ibGVyU3ApIHsKKyAgICAgICAgc3RhdHVzID0gcjsKKyAgICAgICAgZGVzY3JhbWJsZXIgPSBkZXNjcmFtYmxlclNwOworICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gOjpuZGs6OlNoYXJlZFJlZkJhc2U6Om1ha2U8VHVuZXJEZXNjcmFtYmxlcj4oZGVzY3JhbWJsZXIpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgVHVuZXJTZXJ2aWNlOjp1cGRhdGVUdW5lclJlc291cmNlcygpIHsKKyAgICBpZiAoIWhhc0lUdW5lcigpIHx8IG1UdW5lclJlc291cmNlTWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gdXBkYXRlVHVuZXJSZXNvdXJjZXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCk7CisgICAgdXBkYXRlTG5iUmVzb3VyY2VzKCk7CisgICAgLy8gVE9ETzogdXBkYXRlIERlbXV4LCBEZXNjcmFtYmxlci4KK30KKworU3RhdHVzIFR1bmVyU2VydmljZTo6Z2V0VHVuZXJIYWxWZXJzaW9uKGludCogX2FpZGxfcmV0dXJuKSB7CisgICAgaGFzSVR1bmVyKCk7CisgICAgKl9haWRsX3JldHVybiA9IG1UdW5lclZlcnNpb247CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwordm9pZCBUdW5lclNlcnZpY2U6OnVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCkgeworICAgIGhpZGxfdmVjPEZyb250ZW5kSWQ+IGlkczsKKyAgICBSZXN1bHQgcmVzID0gZ2V0SGlkbEZyb250ZW5kSWRzKGlkcyk7CisgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2ZWN0b3I8VHVuZXJGcm9udGVuZEluZm8+IGluZm9zOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEZyb250ZW5kSW5mbyBmcm9udGVuZEluZm87CisgICAgICAgIFJlc3VsdCByZXMgPSBnZXRIaWRsRnJvbnRlbmRJbmZvKChpbnQpaWRzW2ldLCBmcm9udGVuZEluZm8pOworICAgICAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVHVuZXJGcm9udGVuZEluZm8gdHVuZXJGcm9udGVuZEluZm97CisgICAgICAgICAgICAuaGFuZGxlID0gZ2V0UmVzb3VyY2VIYW5kbGVGcm9tSWQoKGludClpZHNbaV0sIEZST05URU5EKSwKKyAgICAgICAgICAgIC50eXBlID0gc3RhdGljX2Nhc3Q8aW50Pihmcm9udGVuZEluZm8udHlwZSksCisgICAgICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IHN0YXRpY19jYXN0PGludD4oZnJvbnRlbmRJbmZvLmV4Y2x1c2l2ZUdyb3VwSWQpLAorICAgICAgICB9OworICAgICAgICBpbmZvcy5wdXNoX2JhY2sodHVuZXJGcm9udGVuZEluZm8pOworICAgIH0KKyAgICBtVHVuZXJSZXNvdXJjZU1hbmFnZXItPnNldEZyb250ZW5kSW5mb0xpc3QoaW5mb3MpOworfQorCit2b2lkIFR1bmVyU2VydmljZTo6dXBkYXRlTG5iUmVzb3VyY2VzKCkgeworICAgIHZlY3RvcjxpbnQ+IGhhbmRsZXMgPSBnZXRMbmJIYW5kbGVzKCk7CisgICAgaWYgKGhhbmRsZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVHVuZXJSZXNvdXJjZU1hbmFnZXItPnNldExuYkluZm9MaXN0KGhhbmRsZXMpOworfQorCit2ZWN0b3I8aW50PiBUdW5lclNlcnZpY2U6OmdldExuYkhhbmRsZXMoKSB7CisgICAgdmVjdG9yPGludD4gbG5iSGFuZGxlczsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgUmVzdWx0IHJlczsKKyAgICAgICAgdmVjdG9yPExuYklkPiBsbmJJZHM7CisgICAgICAgIG1UdW5lci0+Z2V0TG5iSWRzKFsmXShSZXN1bHQgciwgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPExuYklkPiYgaWRzKSB7CisgICAgICAgICAgICBsbmJJZHMgPSBpZHM7CisgICAgICAgICAgICByZXMgPSByOworICAgICAgICB9KTsKKyAgICAgICAgaWYgKHJlcyAhPSBSZXN1bHQ6OlNVQ0NFU1MgfHwgbG5iSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxuYklkcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGxuYkhhbmRsZXMucHVzaF9iYWNrKGdldFJlc291cmNlSGFuZGxlRnJvbUlkKChpbnQpbG5iSWRzW2ldLCBMTkIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsbmJIYW5kbGVzOworfQorCitSZXN1bHQgVHVuZXJTZXJ2aWNlOjpnZXRIaWRsRnJvbnRlbmRJZHMoaGlkbF92ZWM8RnJvbnRlbmRJZD4mIGlkcykgeworICAgIGlmIChtVHVuZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgfQorICAgIFJlc3VsdCByZXM7CisgICAgbVR1bmVyLT5nZXRGcm9udGVuZElkcyhbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEZyb250ZW5kSWQ+JiBmcm9udGVuZElkcykgeworICAgICAgICBpZHMgPSBmcm9udGVuZElkczsKKyAgICAgICAgcmVzID0gcjsKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitSZXN1bHQgVHVuZXJTZXJ2aWNlOjpnZXRIaWRsRnJvbnRlbmRJbmZvKGludCBpZCwgRnJvbnRlbmRJbmZvJiBpbmZvKSB7CisgICAgaWYgKG1UdW5lciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICB9CisgICAgUmVzdWx0IHJlczsKKyAgICBtVHVuZXItPmdldEZyb250ZW5kSW5mbyhpZCwgWyZdKFJlc3VsdCByLCBjb25zdCBGcm9udGVuZEluZm8mIGZlSW5mbykgeworICAgICAgICBpbmZvID0gZmVJbmZvOworICAgICAgICByZXMgPSByOworICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMgVHVuZXJTZXJ2aWNlOjpnZXRBaWRsRGVtdXhDYXBzKERlbXV4Q2FwYWJpbGl0aWVzIGNhcHMpIHsKKyAgICBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIGFpZGxDYXBzeworICAgICAgICAubnVtRGVtdXggPSAoaW50KWNhcHMubnVtRGVtdXgsCisgICAgICAgIC5udW1SZWNvcmQgPSAoaW50KWNhcHMubnVtUmVjb3JkLAorICAgICAgICAubnVtUGxheWJhY2sgPSAoaW50KWNhcHMubnVtUGxheWJhY2ssCisgICAgICAgIC5udW1Uc0ZpbHRlciA9IChpbnQpY2Fwcy5udW1Uc0ZpbHRlciwKKyAgICAgICAgLm51bVNlY3Rpb25GaWx0ZXIgPSAoaW50KWNhcHMubnVtU2VjdGlvbkZpbHRlciwKKyAgICAgICAgLm51bUF1ZGlvRmlsdGVyID0gKGludCljYXBzLm51bUF1ZGlvRmlsdGVyLAorICAgICAgICAubnVtVmlkZW9GaWx0ZXIgPSAoaW50KWNhcHMubnVtVmlkZW9GaWx0ZXIsCisgICAgICAgIC5udW1QZXNGaWx0ZXIgPSAoaW50KWNhcHMubnVtUGVzRmlsdGVyLAorICAgICAgICAubnVtUGNyRmlsdGVyID0gKGludCljYXBzLm51bVBjckZpbHRlciwKKyAgICAgICAgLm51bUJ5dGVzSW5TZWN0aW9uRmlsdGVyID0gKGludCljYXBzLm51bUJ5dGVzSW5TZWN0aW9uRmlsdGVyLAorICAgICAgICAuZmlsdGVyQ2FwcyA9IChpbnQpY2Fwcy5maWx0ZXJDYXBzLAorICAgICAgICAuYlRpbWVGaWx0ZXIgPSBjYXBzLmJUaW1lRmlsdGVyLAorICAgIH07CisgICAgYWlkbENhcHMubGlua0NhcHMucmVzaXplKGNhcHMubGlua0NhcHMuc2l6ZSgpKTsKKyAgICBjb3B5KGNhcHMubGlua0NhcHMuYmVnaW4oKSwgY2Fwcy5saW5rQ2Fwcy5lbmQoKSwgYWlkbENhcHMubGlua0NhcHMuYmVnaW4oKSk7CisgICAgcmV0dXJuIGFpZGxDYXBzOworfQorCitUdW5lckZyb250ZW5kSW5mbyBUdW5lclNlcnZpY2U6OmNvbnZlcnRUb0FpZGxGcm9udGVuZEluZm8oRnJvbnRlbmRJbmZvIGhhbEluZm8pIHsKKyAgICBUdW5lckZyb250ZW5kSW5mbyBpbmZveworICAgICAgICAudHlwZSA9IChpbnQpaGFsSW5mby50eXBlLAorICAgICAgICAubWluRnJlcXVlbmN5ID0gKGludCloYWxJbmZvLm1pbkZyZXF1ZW5jeSwKKyAgICAgICAgLm1heEZyZXF1ZW5jeSA9IChpbnQpaGFsSW5mby5tYXhGcmVxdWVuY3ksCisgICAgICAgIC5taW5TeW1ib2xSYXRlID0gKGludCloYWxJbmZvLm1pblN5bWJvbFJhdGUsCisgICAgICAgIC5tYXhTeW1ib2xSYXRlID0gKGludCloYWxJbmZvLm1heFN5bWJvbFJhdGUsCisgICAgICAgIC5hY3F1aXJlUmFuZ2UgPSAoaW50KWhhbEluZm8uYWNxdWlyZVJhbmdlLAorICAgICAgICAuZXhjbHVzaXZlR3JvdXBJZCA9IChpbnQpaGFsSW5mby5leGNsdXNpdmVHcm91cElkLAorICAgIH07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYWxJbmZvLnN0YXR1c0NhcHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaW5mby5zdGF0dXNDYXBzLnB1c2hfYmFjaygoaW50KWhhbEluZm8uc3RhdHVzQ2Fwc1tpXSk7CisgICAgfQorCisgICAgVHVuZXJGcm9udGVuZENhcGFiaWxpdGllcyBjYXBzOworICAgIHN3aXRjaCAoaGFsSW5mby50eXBlKSB7CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpBTkFMT0c6IHsKKyAgICAgICAgICAgIGlmIChGcm9udGVuZEluZm86OkZyb250ZW5kQ2FwYWJpbGl0aWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmFuYWxvZ0NhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcyBhbmFsb2dDYXBzeworICAgICAgICAgICAgICAgICAgICAudHlwZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYW5hbG9nQ2FwcygpLnR5cGVDYXAsCisgICAgICAgICAgICAgICAgICAgIC5zaWZTdGFuZGFyZENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYW5hbG9nQ2FwcygpLnNpZlN0YW5kYXJkQ2FwLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6YW5hbG9nQ2Fwcz4oYW5hbG9nQ2Fwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6QVRTQzogeworICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6YXRzY0NhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMgYXRzY0NhcHN7CisgICAgICAgICAgICAgICAgICAgIC5tb2R1bGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjphdHNjQ2Fwcz4oYXRzY0NhcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OkFUU0MzOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjphdHNjM0NhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzIGF0c2MzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuYmFuZHdpZHRoQ2FwLAorICAgICAgICAgICAgICAgICAgICAubW9kdWxhdGlvbkNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkubW9kdWxhdGlvbkNhcCwKKyAgICAgICAgICAgICAgICAgICAgLnRpbWVJbnRlcmxlYXZlTW9kZUNhcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS50aW1lSW50ZXJsZWF2ZU1vZGVDYXAsCisgICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuYXRzYzNDYXBzKCkuY29kZVJhdGVDYXAsCisgICAgICAgICAgICAgICAgICAgIC5kZW1vZE91dHB1dEZvcm1hdENhcAorICAgICAgICAgICAgICAgICAgICAgICAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmF0c2MzQ2FwcygpLmRlbW9kT3V0cHV0Rm9ybWF0Q2FwLAorICAgICAgICAgICAgICAgICAgICAuZmVjQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5hdHNjM0NhcHMoKS5mZWNDYXAsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjphdHNjM0NhcHM+KGF0c2MzQ2Fwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6RFZCQzogeworICAgICAgICAgICAgaWYgKEZyb250ZW5kSW5mbzo6RnJvbnRlbmRDYXBhYmlsaXRpZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZHZiY0NhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzIGNhYmxlQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YmNDYXBzKCkubW9kdWxhdGlvbkNhcCwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGludDY0X3QpaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5mZWNDYXAsCisgICAgICAgICAgICAgICAgICAgIC5hbm5leENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZiY0NhcHMoKS5hbm5leENhcCwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmNhYmxlQ2Fwcz4oY2FibGVDYXBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJTOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJzQ2FwcworICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyBkdmJzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnNDYXBzKCkubW9kdWxhdGlvbkNhcCwKKyAgICAgICAgICAgICAgICAgICAgLmNvZGVSYXRlQ2FwID0gKGxvbmcpaGFsSW5mby5mcm9udGVuZENhcHMuZHZic0NhcHMoKS5pbm5lcmZlY0NhcCwKKyAgICAgICAgICAgICAgICAgICAgLnN0YW5kYXJkID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJzQ2FwcygpLnN0YW5kYXJkLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6ZHZic0NhcHM+KGR2YnNDYXBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRnJvbnRlbmRUeXBlOjpEVkJUOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjpkdmJ0Q2FwcworICAgICAgICAgICAgICAgICAgICA9PSBoYWxJbmZvLmZyb250ZW5kQ2Fwcy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICAgICAgICAgICAgICBUdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllcyBkdmJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLnRyYW5zbWlzc2lvbk1vZGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmR2YnRDYXBzKCkudHJhbnNtaXNzaW9uTW9kZUNhcCwKKyAgICAgICAgICAgICAgICAgICAgLmJhbmR3aWR0aENhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5iYW5kd2lkdGhDYXAsCisgICAgICAgICAgICAgICAgICAgIC5jb25zdGVsbGF0aW9uQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmNvbnN0ZWxsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5jb2RlcmF0ZUNhcCwKKyAgICAgICAgICAgICAgICAgICAgLmhpZXJhcmNoeUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5oaWVyYXJjaHlDYXAsCisgICAgICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5kdmJ0Q2FwcygpLmd1YXJkSW50ZXJ2YWxDYXAsCisgICAgICAgICAgICAgICAgICAgIC5pc1QyU3VwcG9ydGVkID0gKGJvb2wpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5pc1QyU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAuaXNNaXNvU3VwcG9ydGVkID0gKGJvb2wpaGFsSW5mby5mcm9udGVuZENhcHMuZHZidENhcHMoKS5pc01pc29TdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjpkdmJ0Q2Fwcz4oZHZidENhcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OklTREJTOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2Ric0NhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzIGlzZGJzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzQ2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnNDYXBzKCkuY29kZXJhdGVDYXAsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjYXBzLnNldDxUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzOjppc2Ric0NhcHM+KGlzZGJzQ2Fwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZyb250ZW5kVHlwZTo6SVNEQlMzOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RiczNDYXBzCisgICAgICAgICAgICAgICAgICAgID09IGhhbEluZm8uZnJvbnRlbmRDYXBzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgICAgICAgICAgICAgIFR1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXMgaXNkYnMzQ2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5tb2R1bGF0aW9uQ2FwLAorICAgICAgICAgICAgICAgICAgICAuY29kZVJhdGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJzM0NhcHMoKS5jb2RlcmF0ZUNhcCwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGNhcHMuc2V0PFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXM6OmlzZGJzM0NhcHM+KGlzZGJzM0NhcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGcm9udGVuZFR5cGU6OklTREJUOiB7CisgICAgICAgICAgICBpZiAoRnJvbnRlbmRJbmZvOjpGcm9udGVuZENhcGFiaWxpdGllczo6aGlkbF9kaXNjcmltaW5hdG9yOjppc2RidENhcHMKKyAgICAgICAgICAgICAgICAgICAgPT0gaGFsSW5mby5mcm9udGVuZENhcHMuZ2V0RGlzY3JpbWluYXRvcigpKSB7CisgICAgICAgICAgICAgICAgVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzIGlzZGJ0Q2Fwc3sKKyAgICAgICAgICAgICAgICAgICAgLm1vZGVDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLm1vZGVDYXAsCisgICAgICAgICAgICAgICAgICAgIC5iYW5kd2lkdGhDYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLmJhbmR3aWR0aENhcCwKKyAgICAgICAgICAgICAgICAgICAgLm1vZHVsYXRpb25DYXAgPSAoaW50KWhhbEluZm8uZnJvbnRlbmRDYXBzLmlzZGJ0Q2FwcygpLm1vZHVsYXRpb25DYXAsCisgICAgICAgICAgICAgICAgICAgIC5jb2RlUmF0ZUNhcCA9IChpbnQpaGFsSW5mby5mcm9udGVuZENhcHMuaXNkYnRDYXBzKCkuY29kZXJhdGVDYXAsCisgICAgICAgICAgICAgICAgICAgIC5ndWFyZEludGVydmFsQ2FwID0gKGludCloYWxJbmZvLmZyb250ZW5kQ2Fwcy5pc2RidENhcHMoKS5ndWFyZEludGVydmFsQ2FwLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgY2Fwcy5zZXQ8VHVuZXJGcm9udGVuZENhcGFiaWxpdGllczo6aXNkYnRDYXBzPihpc2RidENhcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGluZm8uY2FwcyA9IGNhcHM7CisgICAgcmV0dXJuIGluZm87Cit9Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaCBiL3NlcnZpY2VzL3R1bmVyL1R1bmVyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTJlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9UdW5lclNlcnZpY2UuaApAQCAtMCwwICsxLDE1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfVFVORVJTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUlNFUlZJQ0VfSAorCisjaW5jbHVkZSA8YWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVycmVzb3VyY2VtYW5hZ2VyL0lUdW5lclJlc291cmNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4xL0lUdW5lci5oPgorI2luY2x1ZGUgPGZtcS9BaWRsTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6OkdyYW50b3JEZXNjcmlwdG9yOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29tbW9uOjpmbXE6Ok1RRGVzY3JpcHRvcjsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbW1vbjo6Zm1xOjpTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OkJuVHVuZXJTZXJ2aWNlOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJEZW11eDsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6SVR1bmVyRGVzY3JhbWJsZXI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OklUdW5lckZyb250ZW5kOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpJVHVuZXJMbmI7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRGVtdXhDYXBhYmlsaXRpZXM7Cit1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjp0djo6dHVuZXI6OlR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzOwordXNpbmcgOjphaWRsOjphbmRyb2lkOjptZWRpYTo6dHY6OnR1bmVyOjpUdW5lckZyb250ZW5kSW5mbzsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcnJlc291cmNlbWFuYWdlcjo6SVR1bmVyUmVzb3VyY2VNYW5hZ2VyOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpsb2dFcnJvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eENhcGFiaWxpdGllczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJBdlNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlckV2ZW50OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlck1haW5UeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclNldHRpbmdzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eEZpbHRlclN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6RGVtdXhGaWx0ZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpEZW11eFRzRmlsdGVyU2V0dGluZ3M7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OkRlbXV4VHNGaWx0ZXJUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZElkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpGcm9udGVuZEluZm87Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklEZW11eDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6SURlc2NyYW1ibGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8wOjpJRmlsdGVyQ2FsbGJhY2s7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUdW5lcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OworCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdCBzdGF0aWMgaW50IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV04gPSAwOworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl8xXzAgPSAxIDw8IDE2OworY29uc3Qgc3RhdGljIGludCBUVU5FUl9IQUxfVkVSU0lPTl8xXzEgPSAoMSA8PCAxNikgfCAxOworLy8gU3lzdGVtIEZlYXR1cmUgZGVmaW5lZCBpbiBQYWNrYWdlTWFuYWdlcgorc3RhdGljIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYgRkVBVFVSRV9UVU5FUig6OmFuZHJvaWQ6OlN0cmluZzE2KCJhbmRyb2lkLmhhcmR3YXJlLnR2LnR1bmVyIikpOworCit0eXBlZGVmIGVudW0geworICAgIEZST05URU5ELAorICAgIExOQiwKKyAgICBERU1VWCwKKyAgICBERVNDUkFNQkxFUiwKK30gVHVuZXJSZXNvdXJjZVR5cGU7CisKK3N0cnVjdCBGaWx0ZXJDYWxsYmFjayA6IHB1YmxpYyBJRmlsdGVyQ2FsbGJhY2sgeworICAgIH5GaWx0ZXJDYWxsYmFjaygpIHt9CisgICAgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyRXZlbnQoY29uc3QgRGVtdXhGaWx0ZXJFdmVudCYpIHsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgUmV0dXJuPHZvaWQ+IG9uRmlsdGVyU3RhdHVzKGNvbnN0IERlbXV4RmlsdGVyU3RhdHVzKSB7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorfTsKKworY2xhc3MgVHVuZXJTZXJ2aWNlIDogcHVibGljIEJuVHVuZXJTZXJ2aWNlIHsKKyAgICB0eXBlZGVmIEFpZGxNZXNzYWdlUXVldWU8aW50OF90LCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEFpZGxNZXNzYWdlUXVldWU7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gSGlkbE1lc3NhZ2VRdWV1ZTsKKyAgICB0eXBlZGVmIE1RRGVzY3JpcHRvcjxpbnQ4X3QsIFN5bmNocm9uaXplZFJlYWRXcml0ZT4gQWlkbE1RRGVzYzsKKworcHVibGljOgorICAgIHN0YXRpYyBjaGFyIGNvbnN0ICpnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS50dW5lciI7IH0KKyAgICBzdGF0aWMgYmluZGVyX3N0YXR1c190IGluc3RhbnRpYXRlKCk7CisgICAgVHVuZXJTZXJ2aWNlKCk7CisgICAgdmlydHVhbCB+VHVuZXJTZXJ2aWNlKCk7CisKKyAgICBTdGF0dXMgZ2V0RnJvbnRlbmRJZHModmVjdG9yPGludDMyX3Q+KiBpZHMpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRGcm9udGVuZEluZm8oaW50MzJfdCBpZCwgVHVuZXJGcm9udGVuZEluZm8qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldEZyb250ZW5kRHRtYkNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIGludDMyX3QgaWQsIFR1bmVyRnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBvcGVuRnJvbnRlbmQoCisgICAgICAgICAgICBpbnQzMl90IGZyb250ZW5kSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckZyb250ZW5kPiogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3BlbkxuYihpbnQgbG5iSGFuZGxlLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5MbmJCeU5hbWUoY29uc3Qgc3RyaW5nJiBsbmJOYW1lLCBzaGFyZWRfcHRyPElUdW5lckxuYj4qIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIG9wZW5EZW11eChpbnQzMl90IGRlbXV4SGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVtdXg+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXREZW11eENhcHMoVHVuZXJEZW11eENhcGFiaWxpdGllcyogX2FpZGxfcmV0dXJuKSBvdmVycmlkZTsKKyAgICBTdGF0dXMgb3BlbkRlc2NyYW1ibGVyKGludDMyX3QgZGVzY3JhbWJsZXJIYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SVR1bmVyRGVzY3JhbWJsZXI+KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRUdW5lckhhbFZlcnNpb24oaW50KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworCisgICAgLy8gVE9ETzogY3JlYXRlIGEgbWFwIGJldHdlZW4gcmVzb3VyY2UgaWQgYW5kIGhhbmRsZXMuCisgICAgc3RhdGljIGludCBnZXRSZXNvdXJjZUlkRnJvbUhhbmRsZShpbnQgcmVzb3VyY2VIYW5kbGUsIGludCAvKnR5cGUqLykgeworICAgICAgICByZXR1cm4gKHJlc291cmNlSGFuZGxlICYgMHgwMGZmMDAwMCkgPj4gMTY7CisgICAgfQorCisgICAgaW50IGdldFJlc291cmNlSGFuZGxlRnJvbUlkKGludCBpZCwgaW50IHJlc291cmNlVHlwZSkgeworICAgICAgICAvLyBUT0RPOiBidWlsZCB1cCByYW5kb21seSBnZW5lcmF0ZWQgaWQgdG8gaGFuZGxlIG1hcHBpbmcKKyAgICAgICAgcmV0dXJuIChyZXNvdXJjZVR5cGUgJiAweDAwMDAwMGZmKSA8PCAyNAorICAgICAgICAgICAgICAgIHwgKGlkIDw8IDE2KQorICAgICAgICAgICAgICAgIHwgKG1SZXNvdXJjZVJlcXVlc3RDb3VudCsrICYgMHhmZmZmKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBoYXNJVHVuZXIoKTsKKyAgICBib29sIGhhc0lUdW5lcl8xXzEoKTsKKyAgICB2b2lkIHVwZGF0ZVR1bmVyUmVzb3VyY2VzKCk7CisKKyAgICB2b2lkIHVwZGF0ZUZyb250ZW5kUmVzb3VyY2VzKCk7CisgICAgdm9pZCB1cGRhdGVMbmJSZXNvdXJjZXMoKTsKKyAgICBSZXN1bHQgZ2V0SGlkbEZyb250ZW5kSWRzKGhpZGxfdmVjPEZyb250ZW5kSWQ+JiBpZHMpOworICAgIFJlc3VsdCBnZXRIaWRsRnJvbnRlbmRJbmZvKGludCBpZCwgRnJvbnRlbmRJbmZvJiBpbmZvKTsKKyAgICB2ZWN0b3I8aW50PiBnZXRMbmJIYW5kbGVzKCk7CisKKyAgICBUdW5lckRlbXV4Q2FwYWJpbGl0aWVzIGdldEFpZGxEZW11eENhcHMoRGVtdXhDYXBhYmlsaXRpZXMgY2Fwcyk7CisgICAgVHVuZXJGcm9udGVuZEluZm8gY29udmVydFRvQWlkbEZyb250ZW5kSW5mbyhGcm9udGVuZEluZm8gaGFsSW5mbyk7CisKKyAgICBzcDxJVHVuZXI+IG1UdW5lcjsKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzE6OklUdW5lcj4gbVR1bmVyXzFfMTsKKworICAgIHNoYXJlZF9wdHI8SVR1bmVyUmVzb3VyY2VNYW5hZ2VyPiBtVHVuZXJSZXNvdXJjZU1hbmFnZXI7CisgICAgaW50IG1SZXNvdXJjZVJlcXVlc3RDb3VudCA9IDA7CisKKyAgICBpbnQgbVR1bmVyVmVyc2lvbiA9IFRVTkVSX0hBTF9WRVJTSU9OX1VOS05PV047Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBX1RVTkVSU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuY3BwIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTlkYTMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmNwcApAQCAtMCwwICsxLDExNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVHVuZXJUaW1lRmlsdGVyIgorCisjaW5jbHVkZSAiVHVuZXJUaW1lRmlsdGVyLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnR2Ojp0dW5lcjo6VjFfMDo6UmVzdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6dHY6OnR1bmVyOjpWMV8xOjpDb25zdGFudDY0Qml0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1R1bmVyVGltZUZpbHRlcjo6VHVuZXJUaW1lRmlsdGVyKHNwPElUaW1lRmlsdGVyPiB0aW1lRmlsdGVyKSB7CisgICAgbVRpbWVGaWx0ZXIgPSB0aW1lRmlsdGVyOworfQorCitUdW5lclRpbWVGaWx0ZXI6On5UdW5lclRpbWVGaWx0ZXIoKSB7CisgICAgbVRpbWVGaWx0ZXIgPSBOVUxMOworfQorCitTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICBpZiAobVRpbWVGaWx0ZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHN0YXR1cyA9IG1UaW1lRmlsdGVyLT5zZXRUaW1lU3RhbXAodGltZVN0YW1wKTsKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK1N0YXR1cyBUdW5lclRpbWVGaWx0ZXI6OmNsZWFyVGltZVN0YW1wKCkgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzID0gbVRpbWVGaWx0ZXItPmNsZWFyVGltZVN0YW1wKCk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgeworICAgIGlmIChtVGltZUZpbHRlciA9PSBOVUxMKSB7CisgICAgICAgICpfYWlkbF9yZXR1cm4gPSAoaW50NjRfdClDb25zdGFudDY0Qml0OjpJTlZBTElEX1BSRVNFTlRBVElPTl9USU1FX1NUQU1QOworICAgICAgICBBTE9HRSgiSVRpbWVGaWx0ZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihSZXN1bHQ6OlVOQVZBSUxBQkxFKSk7CisgICAgfQorCisgICAgUmVzdWx0IHN0YXR1czsKKyAgICBtVGltZUZpbHRlci0+Z2V0U291cmNlVGltZSgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgdCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHI7CisgICAgICAgICAgICAgICAgKl9haWRsX3JldHVybiA9IHQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc3RhdHVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICAqX2FpZGxfcmV0dXJuID0gKGludDY0X3QpQ29uc3RhbnQ2NEJpdDo6SU5WQUxJRF9QUkVTRU5UQVRJT05fVElNRV9TVEFNUDsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cykpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgVHVuZXJUaW1lRmlsdGVyOjpnZXRUaW1lU3RhbXAoaW50NjRfdCogX2FpZGxfcmV0dXJuKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IE5VTEwpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CisgICAgICAgIEFMT0dFKCJJVGltZUZpbHRlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKHN0YXRpY19jYXN0PGludDMyX3Q+KFJlc3VsdDo6VU5BVkFJTEFCTEUpKTsKKyAgICB9CisKKyAgICBSZXN1bHQgc3RhdHVzOworICAgIG1UaW1lRmlsdGVyLT5nZXRUaW1lU3RhbXAoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IHQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSByOworICAgICAgICAgICAgICAgICpfYWlkbF9yZXR1cm4gPSB0OworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHQ6OlNVQ0NFU1MpIHsKKyAgICAgICAgKl9haWRsX3JldHVybiA9IChpbnQ2NF90KUNvbnN0YW50NjRCaXQ6OklOVkFMSURfUFJFU0VOVEFUSU9OX1RJTUVfU1RBTVA7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TZXJ2aWNlU3BlY2lmaWNFcnJvcihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICB9CisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIFR1bmVyVGltZUZpbHRlcjo6Y2xvc2UoKSB7CisgICAgaWYgKG1UaW1lRmlsdGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIklUaW1lRmlsdGVyIGlzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oUmVzdWx0OjpVTkFWQUlMQUJMRSkpOworICAgIH0KKworICAgIFJlc3VsdCByZXMgPSBtVGltZUZpbHRlci0+Y2xvc2UoKTsKKyAgICBtVGltZUZpbHRlciA9IE5VTEw7CisKKyAgICBpZiAocmVzICE9IFJlc3VsdDo6U1VDQ0VTUykgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzKSk7CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmggYi9zZXJ2aWNlcy90dW5lci9UdW5lclRpbWVGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjc1MzE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvVHVuZXJUaW1lRmlsdGVyLmgKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9UVU5FUkZUSU1FRklMVEVSX0gKKworI2luY2x1ZGUgPGFpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9CblR1bmVyVGltZUZpbHRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvdHYvdHVuZXIvMS4wL0lUaW1lRmlsdGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS90di90dW5lci8xLjEvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBTdGF0dXMgPSA6Om5kazo6U2NvcGVkQVN0YXR1czsKK3VzaW5nIDo6YWlkbDo6YW5kcm9pZDo6bWVkaWE6OnR2Ojp0dW5lcjo6Qm5UdW5lclRpbWVGaWx0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjp0djo6dHVuZXI6OlYxXzA6OklUaW1lRmlsdGVyOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFR1bmVyVGltZUZpbHRlciA6IHB1YmxpYyBCblR1bmVyVGltZUZpbHRlciB7CisKK3B1YmxpYzoKKyAgICBUdW5lclRpbWVGaWx0ZXIoc3A8SVRpbWVGaWx0ZXI+IHRpbWVGaWx0ZXIpOworICAgIHZpcnR1YWwgflR1bmVyVGltZUZpbHRlcigpOworICAgIFN0YXR1cyBzZXRUaW1lU3RhbXAoaW50NjRfdCB0aW1lU3RhbXApIG92ZXJyaWRlOworICAgIFN0YXR1cyBjbGVhclRpbWVTdGFtcCgpIG92ZXJyaWRlOworICAgIFN0YXR1cyBnZXRTb3VyY2VUaW1lKGludDY0X3QqIF9haWRsX3JldHVybikgb3ZlcnJpZGU7CisgICAgU3RhdHVzIGdldFRpbWVTdGFtcChpbnQ2NF90KiBfYWlkbF9yZXR1cm4pIG92ZXJyaWRlOworICAgIFN0YXR1cyBjbG9zZSgpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHNwPElUaW1lRmlsdGVyPiBtVGltZUZpbHRlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFfVFVORVJGVElNRUZJTFRFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvT1dORVJTIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ViOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK25jaGFsa29AZ29vZ2xlLmNvbQorcXV4aWFuZ2ZhbmdAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlbXV4LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRGVtdXguYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IwMGFlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlbXV4LmFpZGwKQEAgLTAsMCArMSw3OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRHZyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRHZyQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJGaWx0ZXJDYWxsYmFjazsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZyb250ZW5kOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyVGltZUZpbHRlcjsKKworLyoqCisgKiBUdW5lciBEZW11eCBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVR1bmVyRGVtdXggeworCisgICAgLyoqCisgICAgICogU2V0IGEgZnJvbnRlbmQgcmVzb3VyY2UgYXMgZGF0YSBpbnB1dCBvZiB0aGUgZGVtdXgKKyAgICAgKi8KKyAgICB2b2lkIHNldEZyb250ZW5kRGF0YVNvdXJjZShpbiBJVHVuZXJGcm9udGVuZCBmcm9udGVuZCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IGZpbHRlciBpbiB0aGUgZGVtdXgKKyAgICAgKi8KKyAgICBJVHVuZXJGaWx0ZXIgb3BlbkZpbHRlcigKKyAgICAgICAgaW4gaW50IG1haW5UeXBlLCBpbiBpbnQgc3VidHlwZSwgaW4gaW50IGJ1ZmZlclNpemUsIGluIElUdW5lckZpbHRlckNhbGxiYWNrIGNiKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGltZSBmaWx0ZXIgb2YgdGhlIGRlbXV4LgorICAgICAqLworICAgIElUdW5lclRpbWVGaWx0ZXIgb3BlblRpbWVGaWx0ZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldCBoYXJkd2FyZSBzeW5jIElEIGZvciBhdWRpbyBhbmQgdmlkZW8uCisgICAgICovCisgICAgaW50IGdldEF2U3luY0h3SWQoSVR1bmVyRmlsdGVyIHR1bmVyRmlsdGVyKTsKKworICAgIC8qKgorICAgICAqIEdldCBjdXJyZW50IHRpbWUgc3RhbXAgdG8gdXNlIGZvciBBL1Ygc3luYy4KKyAgICAgKi8KKyAgICBsb25nIGdldEF2U3luY1RpbWUoaW4gaW50IGF2U3luY0h3SWQpOworCisgICAgLyoqCisgICAgICogT3BlbiBhIERWUiAoRGlnaXRhbCBWaWRlbyBSZWNvcmQpIGluc3RhbmNlIGluIHRoZSBkZW11eC4KKyAgICAgKi8KKyAgICBJVHVuZXJEdnIgb3BlbkR2cihpbiBpbnQgZHZiVHlwZSwgaW4gaW50IGJ1ZmZlclNpemUsIGluIElUdW5lckR2ckNhbGxiYWNrIGNiKTsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgQ29uZGl0aW9uYWwgQWNjZXNzIE1vZHVsZXMgKENBTSkgdGhyb3VnaCBDb21tb24gSW50ZXJmYWNlIChDSSkuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0Q2lDYW0oaW4gaW50IGNpQ2FtSWQpOworCisgICAgLyoqCisgICAgICogRGlzY29ubmVjdCBDb25kaXRpb25hbCBBY2Nlc3MgTW9kdWxlcyAoQ0FNKS4KKyAgICAgKi8KKyAgICB2b2lkIGRpc2Nvbm5lY3RDaUNhbSgpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhlIElUdW5lckRlbXV4IGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZXNjcmFtYmxlci5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckRlc2NyYW1ibGVyLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MGVlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEZXNjcmFtYmxlci5haWRsCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckRlbXV4OworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRmlsdGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJEZW11eFBpZDsKKworLyoqCisgKiBUdW5lciBEZW11eCBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVR1bmVyRGVzY3JhbWJsZXIgeworICAgIC8qKgorICAgICAqIFNldCBhIGRlbXV4IGFzIHNvdXJjZSBvZiB0aGUgZGVzY3JhbWJsZXIuCisgICAgICovCisgICAgdm9pZCBzZXREZW11eFNvdXJjZShpbiBJVHVuZXJEZW11eCB0dW5lckRlbXV4KTsKKworICAgIC8qKgorICAgICAqIFNldCBhIGtleSB0b2tlbiB0byBsaW5rIGRlc2NyYW1ibGVyIHRvIGEga2V5IHNsb3QuCisgICAgICovCisgICAgdm9pZCBzZXRLZXlUb2tlbihpbiBieXRlW10ga2V5VG9rZW4pOworCisgICAgLyoqCisgICAgICogQWRkIHBhY2tldHMnIFBJRCB0byB0aGUgZGVzY3JhbWJsZXIgZm9yIGRlc2NyYW1ibGluZy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFBpZChpbiBUdW5lckRlbXV4UGlkIHBpZCwgaW4gSVR1bmVyRmlsdGVyIG9wdGlvbmFsU291cmNlRmlsdGVyKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBwYWNrZXRzJyBQSUQgZnJvbSB0aGUgZGVzY3JhbWJsZXIuCisgICAgICovCisgICAgdm9pZCByZW1vdmVQaWQoaW4gVHVuZXJEZW11eFBpZCBwaWQsIGluIElUdW5lckZpbHRlciBvcHRpb25hbFNvdXJjZUZpbHRlcik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIG5ldyBpbnRlcmZhY2Ugb2YgSVR1bmVyRGVzY3JhbWJsZXIuCisgICAgICovCisgICAgdm9pZCBjbG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ci5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckR2ci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMTYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyLmFpZGwKQEAgLTAsMCArMSw2OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5NUURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlN5bmNocm9uaXplZFJlYWRXcml0ZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZpbHRlcjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRHZyU2V0dGluZ3M7CisKKy8qKgorICogVHVuZXIgRHZyIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJEdnIgeworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVzY3JpcHRvciBvZiB0aGUgRFZSJ3MgRk1RLgorICAgICAqLworICAgIE1RRGVzY3JpcHRvcjxieXRlLCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IGdldFF1ZXVlRGVzYygpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBEVlIuCisgICAgICovCisgICAgdm9pZCBjb25maWd1cmUoaW4gVHVuZXJEdnJTZXR0aW5ncyBzZXR0aW5ncyk7CisKKyAgICAvKioKKyAgICAgKiBBdHRhY2ggb25lIGZpbHRlciB0byBEVlIgaW50ZXJmYWNlIGZvciByZWNvcmRpbmcuCisgICAgICovCisgICAgdm9pZCBhdHRhY2hGaWx0ZXIoaW4gSVR1bmVyRmlsdGVyIGZpbHRlcik7CisKKyAgICAvKioKKyAgICAgKiBEZXRhY2ggb25lIGZpbHRlciBmcm9tIHRoZSBEVlIncyByZWNvcmRpbmcuCisgICAgICovCisgICAgdm9pZCBkZXRhY2hGaWx0ZXIoaW4gSVR1bmVyRmlsdGVyIGZpbHRlcik7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBEVlIuCisgICAgICovCisgICAgdm9pZCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogU3RvcCBEVlIuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBEVlIgZGF0YS4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBjbG9zZSB0aGUgRFZSIGluc3RhbmNlIHRvIHJlbGVhc2UgcmVzb3VyY2UgZm9yIERWUi4KKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJEdnJDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzRmZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRHZyQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIFR1bmVyRHZyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZHZyIHJlbGF0ZWQgY2FsbGJhY2tzLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElUdW5lckR2ckNhbGxiYWNrIHsKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCBhIG5ldyBzdGF0dXMgb2YgdGhlIGRlbXV4J3MgcmVjb3JkLgorICAgICAqLworICAgIHZvaWQgb25SZWNvcmRTdGF0dXMoaW4gaW50IHN0YXR1cyk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCBhIG5ldyBzdGF0dXMgb2YgdGhlIGRlbXV4J3MgcGxheWJhY2suCisgICAgICovCisgICAgdm9pZCBvblBsYXliYWNrU3RhdHVzKGluIGludCBzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZpbHRlci5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDRjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyLmFpZGwKQEAgLTAsMCArMSwxMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuTVFEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5TeW5jaHJvbml6ZWRSZWFkV3JpdGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uTmF0aXZlSGFuZGxlOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTaGFyZWRIYW5kbGVJbmZvOworCisvKioKKyAqIFR1bmVyIEZpbHRlciBpbnRlcmZhY2UgaGFuZGxlcyB0dW5lciByZWxhdGVkIG9wZXJhdGlvbnMuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVR1bmVyRmlsdGVyIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbHRlciBJZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0SWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgNjQtYml0IGZpbHRlciBJZC4KKyAgICAgKi8KKyAgICBsb25nIGdldElkNjRCaXQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVzY3JpcHRvciBvZiB0aGUgRmlsdGVyJ3MgRk1RLgorICAgICAqLworICAgIE1RRGVzY3JpcHRvcjxieXRlLCBTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IGdldFF1ZXVlRGVzYygpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBmaWx0ZXIuCisgICAgICovCisgICAgdm9pZCBjb25maWd1cmUoaW4gVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uIGNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIG1vbml0b3IgZXZlbnQgb2YgdGhlIEZpbHRlci4KKyAgICAgKi8KKyAgICB2b2lkIGNvbmZpZ3VyZU1vbml0b3JFdmVudChpbiBpbnQgbW9uaXRvckV2ZW50VHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIGNvbnRleHQgaWQgb2YgdGhlIElQIEZpbHRlci4KKyAgICAgKi8KKyAgICB2b2lkIGNvbmZpZ3VyZUlwRmlsdGVyQ29udGV4dElkKGluIGludCBjaWQpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBzdHJlYW0gdHlwZSBvZiB0aGUgbWVkaWEgRmlsdGVyLgorICAgICAqLworICAgIHZvaWQgY29uZmlndXJlQXZTdHJlYW1UeXBlKGluIGludCBhdlN0cmVhbVR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhL3Ygc2hhcmVkIG1lbW9yeSBoYW5kbGUKKyAgICAgKi8KKyAgICBUdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8gZ2V0QXZTaGFyZWRIYW5kbGVJbmZvKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBoYW5kbGUgcmVwb3J0ZWQgYnkgdGhlIEhBTCBmb3IgQVYgbWVtb3J5LgorICAgICAqLworICAgIHZvaWQgcmVsZWFzZUF2SGFuZGxlKGluIE5hdGl2ZUhhbmRsZSBoYW5kbGUsIGluIGxvbmcgYXZEYXRhSWQpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmaWx0ZXIncyBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldERhdGFTb3VyY2UoSVR1bmVyRmlsdGVyIGZpbHRlcik7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgZmlsdGVyLgorICAgICAqLworICAgIHZvaWQgc3RhcnQoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgdGhlIGZpbHRlci4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3AoKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoIHRoZSBmaWx0ZXIuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIGZpbHRlci4KKyAgICAgKi8KKyAgICB2b2lkIGNsb3NlKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGaWx0ZXJDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTUyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRmlsdGVyQ2FsbGJhY2suYWlkbApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlckV2ZW50OworCisvKioKKyAqIFR1bmVyRmlsdGVyQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZmlsdGVyIHJlbGF0ZWQgY2FsbGJhY2tzLgorICoKKyAqIHtAaGlkZX0KKyAqLworaW50ZXJmYWNlIElUdW5lckZpbHRlckNhbGxiYWNrIHsKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIGNsaWVudCBhIG5ldyBzdGF0dXMgb2YgYSBmaWx0ZXIuCisgICAgICovCisgICAgdm9pZCBvbkZpbHRlclN0YXR1cyhpbnQgc3RhdHVzKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZmlsdGVyIGV2ZW50IGhhcHBlbmVkLgorICAgICAqLworICAgIHZvaWQgb25GaWx0ZXJFdmVudChpbiBUdW5lckZpbHRlckV2ZW50W10gZmlsdGVyRXZlbnQpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyNTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckZyb250ZW5kLmFpZGwKQEAgLTAsMCArMSwxMDcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckZyb250ZW5kQ2FsbGJhY2s7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kU3RhdHVzOworCisvKioKKyAqIFR1bmVyIEZyb250ZW5kIGludGVyZmFjZSBoYW5kbGVzIGZyb250ZW5kIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJGcm9udGVuZCB7CisgICAgLyoqCisgICAgICogU2V0IHRoZSBmcm9udGVuZCBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0dW5lckZyb250ZW5kQ2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIHJlY2VpdmUgZnJvbnRlbmQgcmVsYXRlZCBpbmZvLgorICAgICAqLworICAgIHZvaWQgc2V0Q2FsbGJhY2soaW4gSVR1bmVyRnJvbnRlbmRDYWxsYmFjayB0dW5lckZyb250ZW5kQ2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogVHVuZXMgdGhlIGZyb250ZW5kIHRvIHVzaW5nIHRoZSBzZXR0aW5ncyBnaXZlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXR0aW5ncyB0aGUgc2V0dGluZ3MgdG8gdHVuZSB3aXRoLgorICAgICAqLworICAgIHZvaWQgdHVuZShpbiBUdW5lckZyb250ZW5kU2V0dGluZ3Mgc2V0dGluZ3MpOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgcHJldmlvdXMgdHVuaW5nLgorICAgICAqLworICAgIHZvaWQgc3RvcFR1bmUoKTsKKworICAgIC8qKgorICAgICAqIFNjYW4gdGhlIGZyb250ZW5kIHRvIHVzZSB0aGUgc2V0dGluZ3MgZ2l2ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0dGluZ3MgdGhlIHNldHRpbmdzIHRvIHNjYW4gd2l0aC4KKyAgICAgKiBAcGFyYW0gZnJvbnRlbmRTY2FuVHlwZSBzY2FuIHdpdGggZ2l2ZW4gdHlwZS4KKyAgICAgKi8KKyAgICB2b2lkIHNjYW4oaW4gVHVuZXJGcm9udGVuZFNldHRpbmdzIHNldHRpbmdzLCBpbiBpbnQgZnJvbnRlbmRTY2FuVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBwcmV2aW91cyBzY2FubmluZy4KKyAgICAgKi8KKyAgICB2b2lkIHN0b3BTY2FuKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIExvdy1Ob2lzZSBCbG9jayBkb3duY29udmVydGVyIChMTkIpIGZvciBzYXRlbGxpdGUgZnJvbnRlbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHVuZXIgbG5iIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldExuYihpbiBJVHVuZXJMbmIgbG5iKTsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSBvciBEaXNhYmxlIExvdyBOb2lzZSBBbXBsaWZpZXIgKExOQSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYkVuYWJsZSBlbmFibGUgTG5hIG9yIG5vdC4KKyAgICAgKi8KKyAgICB2b2lkIHNldExuYShpbiBib29sZWFuIGJFbmFibGUpOworCisgICAgLyoqCisgICAgICogTGluayBGcm9udGVuZCB0byB0aGUgY2ljYW0gd2l0aCBnaXZlbiBpZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbHRzIGlkCisgICAgICovCisgICAgaW50IGxpbmtDaUNhbVRvRnJvbnRlbmQoaW4gaW50IGNpQ2FtSWQpOworCisgICAgLyoqCisgICAgICogVW5pbmsgRnJvbnRlbmQgdG8gdGhlIGNpY2FtIHdpdGggZ2l2ZW4gaWQuCisgICAgICovCisgICAgdm9pZCB1bmxpbmtDaUNhbVRvRnJvbnRlbmQoaW4gaW50IGNpQ2FtSWQpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhlIElUdW5lckZyb250ZW5kIGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHN0YXR1c2VzIG9mIHRoZSBmcm9udGVuZC4KKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kU3RhdHVzW10gZ2V0U3RhdHVzKGluIGludFtdIHN0YXR1c1R5cGVzKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIDEuMSBleHRlbmRlZCBzdGF0dXNlcyBvZiB0aGUgZnJvbnRlbmQuCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZFN0YXR1c1tdIGdldFN0YXR1c0V4dGVuZGVkXzFfMShpbiBpbnRbXSBzdGF0dXNUeXBlcyk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBpZCBvZiB0aGUgZnJvbnRlbmQuCisgICAgICovCisgICAgaW50IGdldEZyb250ZW5kSWQoKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJGcm9udGVuZENhbGxiYWNrLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmY1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyRnJvbnRlbmRDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZTsKKworLyoqCisgKiBUdW5lckZyb250ZW5kQ2FsbGJhY2sgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgZnJvbnRlbmQgcmVsYXRlZCBjYWxsYmFja3MuCisgKgorICoge0BoaWRlfQorICovCitpbnRlcmZhY2UgSVR1bmVyRnJvbnRlbmRDYWxsYmFjayB7CisgICAgICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYSBuZXcgZXZlbnQgaGFwcGVuZWQgb24gdGhlIGZyb250ZW5kLgorICAgICAqLworICAgIHZvaWQgb25FdmVudChpbiBpbnQgZnJvbnRlbmRFdmVudFR5cGUpOworCisgICAgLyoqCisgICAgICogbm90aWZ5IHRoZSBjbGllbnQgb2Ygc2NhbiBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIG9uU2Nhbk1lc3NhZ2UoaW4gaW50IG1lc3NhZ2VUeXBlLCBpbiBUdW5lckZyb250ZW5kU2Nhbk1lc3NhZ2UgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyTG5iLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMTQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmIuYWlkbApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmJDYWxsYmFjazsKKworLyoqCisgKiBUdW5lciBMbmIgaW50ZXJmYWNlIGhhbmRsZXMgTG5iIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJMbmIgeworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG5iIGNhbGxiYWNrLgorICAgICAqLworICAgIHZvaWQgc2V0Q2FsbGJhY2soaW4gSVR1bmVyTG5iQ2FsbGJhY2sgdHVuZXJMbmJDYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxuYidzIHBvd2VyIHZvbHRhZ2UuCisgICAgICovCisgICAgdm9pZCBzZXRWb2x0YWdlKGluIGludCB2b2x0YWdlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbG5iJ3MgdG9uZSBtb2RlLgorICAgICAqLworICAgIHZvaWQgc2V0VG9uZShpbiBpbnQgdG9uZSk7CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIGxuYidzIHBvc2l0aW9uLgorICAgICAqLworICAgIHZvaWQgc2V0U2F0ZWxsaXRlUG9zaXRpb24oaW4gaW50IHBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFNlbmRzIERpU0VxQyAoRGlnaXRhbCBTYXRlbGxpdGUgRXF1aXBtZW50IENvbnRyb2wpIG1lc3NhZ2UuCisgICAgICovCisgICAgdm9pZCBzZW5kRGlzZXFjTWVzc2FnZShpbiBieXRlW10gZGlzZXFjTWVzc2FnZSk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgTE5CIGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lckxuYkNhbGxiYWNrLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3MzUyZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9JVHVuZXJMbmJDYWxsYmFjay5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogVHVuZUxuYkNhbGxiYWNrIGludGVyZmFjZSBoYW5kbGVzIHR1bmVyIGxuYiByZWxhdGVkIGNhbGxiYWNrcy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJMbmJDYWxsYmFjayB7CisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjbGllbnQgdGhhdCBhIG5ldyBldmVudCBoYXBwZW5lZCBvbiB0aGUgTG5iLgorICAgICAqLworICAgIHZvaWQgb25FdmVudChpbiBpbnQgbG5iRXZlbnRUeXBlKTsKKworICAgIC8qKgorICAgICAqIG5vdGlmeSB0aGUgY2xpZW50IG9mIG5ldyBEaVNFcUMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICB2b2lkIG9uRGlzZXFjTWVzc2FnZShpbiBieXRlW10gZGlzZXFjTWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyU2VydmljZS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTViMTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclNlcnZpY2UuYWlkbApAQCAtMCwwICsxLDEwNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5mbXEuTVFEZXNjcmlwdG9yOworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLmZtcS5TeW5jaHJvbml6ZWRSZWFkV3JpdGU7CitpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLlVuc3luY2hyb25pemVkV3JpdGU7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJEZW11eDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLklUdW5lckRlc2NyYW1ibGVyOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuSVR1bmVyRnJvbnRlbmQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5JVHVuZXJMbmI7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4Q2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSW5mbzsKKworLyoqCisgKiBUdW5lclNlcnZpY2UgaW50ZXJmYWNlIGhhbmRsZXMgdHVuZXIgcmVsYXRlZCBvcGVyYXRpb25zLgorICoKKyAqIHtAaGlkZX0KKyAqLworLy9AVmludGZTdGFiaWxpdHkKK2ludGVyZmFjZSBJVHVuZXJTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIEdldHMgZnJvbnRlbmQgSURzLgorICAgICAqLworICAgIHZvaWQgZ2V0RnJvbnRlbmRJZHMob3V0IGludFtdIGlkcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgZnJvbnRlbmQncyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9udGVuZEhhbmRsZSB0aGUgaGFuZGxlIG9mIHRoZSBmcm9udGVuZCBncmFudGVkIGJ5IFRSTS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBvZiB0aGUgZnJvbnRlbmQuCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZEluZm8gZ2V0RnJvbnRlbmRJbmZvKGluIGludCBmcm9udGVuZEhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgRHRtYiBGcm9udGVuZCBDYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgZ2V0RnJvbnRlbmREdG1iQ2FwYWJpbGl0aWVzKGluIGludCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgVHVuZXIgRnJvbnRlbmQgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGZyb250ZW5kSGFuZGxlIHRoZSBoYW5kbGUgb2YgdGhlIGZyb250ZW5kIGdyYW50ZWQgYnkgVFJNLgorICAgICAqIEByZXR1cm4gdGhlIGFpZGwgaW50ZXJmYWNlIG9mIHRoZSBmcm9udGVuZC4KKyAgICAgKi8KKyAgICBJVHVuZXJGcm9udGVuZCBvcGVuRnJvbnRlbmQoaW4gaW50IGZyb250ZW5kSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gYSBuZXcgaW50ZXJmYWNlIG9mIElUdW5lckxuYiBnaXZlbiBhIGxuYkhhbmRsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsbmJIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgTE5CIGdyYW50ZWQgYnkgVFJNLgorICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIElUdW5lckxuYiBpbnRlcmZhY2UuCisgICAgICovCisgICAgSVR1bmVyTG5iIG9wZW5MbmIoaW4gaW50IGxuYkhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgbmV3IGludGVyZmFjZSBvZiBJVHVuZXJMbmIgZ2l2ZW4gYSBMTkIgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsbmJOYW1lIHRoZSBuYW1lIGZvciBhbiBleHRlcm5hbCBMTkIgdG8gYmUgb3BlbmVkLgorICAgICAqIEByZXR1cm4gYSBuZXdseSBjcmVhdGVkIElUdW5lckxuYiBpbnRlcmZhY2UuCisgICAgICovCisgICAgSVR1bmVyTG5iIG9wZW5MbmJCeU5hbWUoaW4gU3RyaW5nIGxuYk5hbWUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIERlbXV4LgorICAgICAqLworICAgIElUdW5lckRlbXV4IG9wZW5EZW11eChpbiBpbnQgZGVtdXhIYW5kbGUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIFR1bmVyIERlbXV4IGNhcGFiaWxpdGllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlbXV44oCZcyBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgVHVuZXJEZW11eENhcGFiaWxpdGllcyBnZXREZW11eENhcHMoKTsKKworICAgIC8qIE9wZW4gYSBuZXcgaW50ZXJmYWNlIG9mIElUdW5lckRlc2NyYW1ibGVyIGdpdmVuIGEgZGVzY3JhbWJsZXJIYW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JhbWJsZXJIYW5kbGUgdGhlIGhhbmRsZSBvZiB0aGUgZGVzY3JhbWJsZXIgZ3JhbnRlZCBieSBUUk0uCisgICAgICogQHJldHVybiBhIG5ld2x5IGNyZWF0ZWQgSVR1bmVyRGVzY3JhbWJsZXIgaW50ZXJmYWNlLgorICAgICAqLworICAgIElUdW5lckRlc2NyYW1ibGVyIG9wZW5EZXNjcmFtYmxlcihpbiBpbnQgZGVzY3JhbWJsZXJIYW5kbGUpOworCisgICAgLyoqCisgICAgICogR2V0IGFuIGludGVnZXIgdGhhdCBjYXJyaWVzIHRoZSBUdW5lciBISURMIHZlcnNpb24uIFRoZSBoaWdoIDE2IGJpdHMgYXJlIHRoZQorICAgICAqIG1ham9yIHZlcnNpb24gbnVtYmVyIHdoaWxlIHRoZSBsb3cgMTYgYml0cyBhcmUgdGhlIG1pbm9yIHZlcnNpb24uIERlZmF1bHQKKyAgICAgKiB2YWx1ZSBpcyB1bmtub3duIHZlcnNpb24gMC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0VHVuZXJIYWxWZXJzaW9uKCk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvSVR1bmVyVGltZUZpbHRlci5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclRpbWVGaWx0ZXIuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRiOWJmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL0lUdW5lclRpbWVGaWx0ZXIuYWlkbApAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIFR1bmVyIFRpbWUgRmlsdGVyIGludGVyZmFjZSBoYW5kbGVzIHRpbWUgZmlsdGVyIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK2ludGVyZmFjZSBJVHVuZXJUaW1lRmlsdGVyIHsKKyAgICAvKioKKyAgICAgKiBTZXQgdGltZSBzdGFtcCBmb3IgdGltZSBiYXNlZCBmaWx0ZXIuCisgICAgICovCisgICAgdm9pZCBzZXRUaW1lU3RhbXAoaW4gbG9uZyB0aW1lU3RhbXApOworCisgICAgLyoqCisgICAgICogQ2xlYXIgdGhlIHRpbWUgc3RhbXAgaW4gdGhlIHRpbWUgZmlsdGVyLgorICAgICAqLworICAgIHZvaWQgY2xlYXJUaW1lU3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGltZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgY3VycmVudCBkYXRhIHNvdXJjZS4KKyAgICAgKi8KKyAgICBsb25nIGdldFNvdXJjZVRpbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSB0aW1lIGZpbHRlci4KKyAgICAgKi8KKyAgICBsb25nIGdldFRpbWVTdGFtcCgpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIFRpbWUgRmlsdGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckF1ZGlvRXh0cmFNZXRhRGF0YS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyQXVkaW9FeHRyYU1ldGFEYXRhLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzMzc0YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckF1ZGlvRXh0cmFNZXRhRGF0YS5haWRsCkBAIC0wLDAgKzEsMzYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogRXh0cmEgTWV0YSBEYXRhIGZyb20gQUQgKEF1ZGlvIERlc2NyaXB0b3IpIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQgVjIuMS4xLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckF1ZGlvRXh0cmFNZXRhRGF0YSB7CisgICAgYnl0ZSBhZEZhZGU7CisKKyAgICBieXRlIGFkUGFuOworCisgICAgYnl0ZSB2ZXJzaW9uVGV4dFRhZzsKKworICAgIGJ5dGUgYWRHYWluQ2VudGVyOworCisgICAgYnl0ZSBhZEdhaW5Gcm9udDsKKworICAgIGJ5dGUgYWRHYWluU3Vycm91bmQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eENhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFiMTUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIFR1bmVyIERlbXV4IGNhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRGVtdXhDYXBhYmlsaXRpZXMgeworICAgIGludCBudW1EZW11eDsKKworICAgIGludCBudW1SZWNvcmQ7CisKKyAgICBpbnQgbnVtUGxheWJhY2s7CisKKyAgICBpbnQgbnVtVHNGaWx0ZXI7CisKKyAgICBpbnQgbnVtU2VjdGlvbkZpbHRlcjsKKworICAgIGludCBudW1BdWRpb0ZpbHRlcjsKKworICAgIGludCBudW1WaWRlb0ZpbHRlcjsKKworICAgIGludCBudW1QZXNGaWx0ZXI7CisKKyAgICBpbnQgbnVtUGNyRmlsdGVyOworCisgICAgaW50IG51bUJ5dGVzSW5TZWN0aW9uRmlsdGVyOworCisgICAgaW50IGZpbHRlckNhcHM7CisKKyAgICBpbnRbXSBsaW5rQ2FwczsKKworICAgIGJvb2xlYW4gYlRpbWVGaWx0ZXI7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVmNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3MuYWlkbApAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIERlbXV4IGlwIGFkZHJlc3MgY29uZmlndXJlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckRlbXV4SXBBZGRyZXNzIHsKKyAgICBib29sZWFuIGlzSXBWNjsKKworICAgIGJ5dGVbXSBhZGRyOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhJcEFkZHJlc3NTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDQzODgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJEZW11eElwQWRkcmVzczsKKworLyoqCisgKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIElwIGZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJEZW11eElwQWRkcmVzc1NldHRpbmdzIHsKKyAgICBUdW5lckRlbXV4SXBBZGRyZXNzIHNyY0lwQWRkcmVzczsKKworICAgIFR1bmVyRGVtdXhJcEFkZHJlc3MgZHN0SXBBZGRyZXNzOworCisgICAgY2hhciBzcmNQb3J0OworCisgICAgY2hhciBkc3RQb3J0OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRGVtdXhQaWQuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyMzhiNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckRlbXV4UGlkLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEZW11eCBQSUQgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gVHVuZXJEZW11eFBpZCB7CisgICAgY2hhciB0UGlkOworCisgICAgY2hhciBtbXRwUGlkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRHZyU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckR2clNldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNGQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckR2clNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEdnIgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckR2clNldHRpbmdzIHsKKyAgICBpbnQgc3RhdHVzTWFzazsKKworICAgIGludCBsb3dUaHJlc2hvbGQ7CisKKyAgICBpbnQgaGlnaFRocmVzaG9sZDsKKworICAgIGludCBkYXRhRm9ybWF0OworCisgICAgaW50IHBhY2tldFNpemU7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5ZTNhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckFscENvbmZpZ3VyYXRpb24uYWlkbApAQCAtMCwwICsxLDMyIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNldHRpbmdzOworCisvKioKKyAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYW4gQUxQIGZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJBbHBDb25maWd1cmF0aW9uIHsKKyAgICBieXRlIHBhY2tldFR5cGU7CisKKyAgICBieXRlIGxlbmd0aFR5cGU7CisKKyAgICBUdW5lckZpbHRlclNldHRpbmdzIGZpbHRlclNldHRpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQXZTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQXZTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZjg4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJBdlNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgVmlkZW8gYW5kIEF1ZGlvLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlckF2U2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIHRydWUgaWYgdGhlIGZpbHRlciBvdXRwdXQgZ29lcyB0byBkZWNvZGVyIGRpcmVjdGx5IGluIHBhc3MgdGhyb3VnaCBtb2RlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNQYXNzdGhyb3VnaDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckNvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckNvbmZpZ3VyYXRpb24uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhjZmQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJNbXRwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uOworCisvKioKKyAqIEZpbHRlciBjb25maWd1cmF0aW9uLgorICoKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gVHVuZXJGaWx0ZXJDb25maWd1cmF0aW9uIHsKKyAgICBUdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbiB0czsKKworICAgIFR1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24gbW10cDsKKworICAgIFR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uIGlwOworCisgICAgVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uIHRsdjsKKworICAgIFR1bmVyRmlsdGVyQWxwQ29uZmlndXJhdGlvbiBhbHA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3MWRkMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkRXZlbnQuYWlkbApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEZpbHRlciBFdmVudCBmb3IgRG93bmxvYWQgZGF0YS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJEb3dubG9hZEV2ZW50IHsKKyAgICBpbnQgaXRlbUlkOworCisgICAgLyoqCisgICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhIChvbmx5IGZvciBNTVRQKQorICAgICAqLworICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKKworICAgIGludCBpdGVtRnJhZ21lbnRJbmRleDsKKworICAgIGludCBsYXN0SXRlbUZyYWdtZW50SW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBEYXRhIHNpemUgaW4gYnl0ZXMgb2YgZmlsdGVyZWQgZGF0YQorICAgICAqLworICAgIGNoYXIgZGF0YUxlbmd0aDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckRvd25sb2FkU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdhNWZlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogRmlsdGVyIFNldHRpbmdzIGZvciBkb3dubG9hZGluZy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzIHsKKyAgICBpbnQgZG93bmxvYWRJZDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlckV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJFdmVudC5haWRsCkBAIC0wLDAgKzEsNTQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyRG93bmxvYWRFdmVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1lZGlhRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlck1tdHBSZWNvcmRFdmVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyTW9uaXRvckV2ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJQZXNFdmVudDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJUZW1pRXZlbnQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQ7CisKKy8qKgorICogRmlsdGVyIGV2ZW50cy4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIFR1bmVyRmlsdGVyRXZlbnQgeworICAgIFR1bmVyRmlsdGVyTWVkaWFFdmVudCBtZWRpYTsKKworICAgIFR1bmVyRmlsdGVyU2VjdGlvbkV2ZW50IHNlY3Rpb247CisKKyAgICBUdW5lckZpbHRlclBlc0V2ZW50IHBlczsKKworICAgIFR1bmVyRmlsdGVyVHNSZWNvcmRFdmVudCB0c1JlY29yZDsKKworICAgIFR1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50IG1tdHBSZWNvcmQ7CisKKyAgICBUdW5lckZpbHRlckRvd25sb2FkRXZlbnQgZG93bmxvYWQ7CisKKyAgICBUdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50IGlwUGF5bG9hZDsKKworICAgIFR1bmVyRmlsdGVyVGVtaUV2ZW50IHRlbWk7CisKKyAgICBUdW5lckZpbHRlck1vbml0b3JFdmVudCBtb25pdG9yOworCisgICAgaW50IHN0YXJ0SWQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNGQ4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcENvbmZpZ3VyYXRpb24uYWlkbApAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNldHRpbmdzOworCisvKioKKyAqIEZpbHRlciBTZXR0aW5ncyBmb3IgYSBpcCBmaWx0ZXIuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVySXBDb25maWd1cmF0aW9uIHsKKyAgICBUdW5lckRlbXV4SXBBZGRyZXNzU2V0dGluZ3MgaXBBZGRyOworCisgICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlcklwUGF5bG9hZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmRhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJJcFBheWxvYWRFdmVudC5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogRmlsdGVyIEV2ZW50IGZvciBJUCBwYXlsb2FkIGRhdGEuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVySXBQYXlsb2FkRXZlbnQgeworICAgIC8qKgorICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBpcCBkYXRhCisgICAgICovCisgICAgY2hhciBkYXRhTGVuZ3RoOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTWVkaWFFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTWVkaWFFdmVudC5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGJjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNZWRpYUV2ZW50LmFpZGwKQEAgLTAsMCArMSw4NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLk5hdGl2ZUhhbmRsZTsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhOworCisvKioKKyAqIEZpbHRlciBFdmVudCBmb3IgQXVkaW8gb3IgVmlkZW8gRmlsdGVyLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlck1lZGlhRXZlbnQgeworICAgIGNoYXIgc3RyZWFtSWQ7CisKKyAgICAvKioKKyAgICAgKiB0cnVlIGlmIFBUUyBpcyBwcmVzZW50IGluIFBFUyBoZWFkZXIuCisgICAgICovCisgICAgYm9vbGVhbiBpc1B0c1ByZXNlbnQ7CisKKyAgICAvKioKKyAgICAgKiBQcmVzZW50YXRpb24gVGltZSBTdGFtcCBmb3IgYXVkaW8gb3IgdmlkZW8gZnJhbWUuIEl0IGJhc2VkIG9uIDkwS0h6IGhhcworICAgICAqIHRoZSBzYW1lIGZvcm1hdCBhcyBQVFMgKFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKS4KKyAgICAgKi8KKyAgICBsb25nIHB0czsKKworICAgIC8qKgorICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBhdWRpbyBvciB2aWRlbyBmcmFtZQorICAgICAqLworICAgIGludCBkYXRhTGVuZ3RoOworCisgICAgLyoqCisgICAgICogIFRoZSBvZmZzZXQgaW4gdGhlIG1lbW9yeSBibG9jayB3aGljaCBpcyBzaGFyZWQgYW1vbmcgbXVsdGlwbGUKKyAgICAgKiAgTWVkaWFFdmVudHMuCisgICAgICovCisgICAgaW50IG9mZnNldDsKKworICAgIC8qKgorICAgICAqIEEgaGFuZGxlIGFzc29jaWF0ZWQgdG8gdGhlIG1lbW9yeSB3aGVyZSBhdWRpbyBvciB2aWRlbyBkYXRhIHN0YXlzLgorICAgICAqLworICAgIE5hdGl2ZUhhbmRsZSBhdk1lbW9yeTsKKworICAgIC8qKgorICAgICAqIFRydWUgaWYgdGhlIGF2TWVtb3J5IGlzIGluIHNlY3VyZSBhcmVhLCBhbmQgaXNuJ3QgbWFwcGFibGUuCisgICAgICovCisgICAgYm9vbGVhbiBpc1NlY3VyZU1lbW9yeTsKKworICAgIC8qKgorICAgICAqIEFuIElkIGlzIHVzZWQgYnkgSEFMIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgQVYgZGF0YS4KKyAgICAgKiBGb3Igc2VjdXJlIGF1ZGlvLCBpdCdzIHRoZSBhdWRpbyBoYW5kbGUgdXNlZCBieSBBdWRpbyBUcmFjay4KKyAgICAgKi8KKyAgICBsb25nIGF2RGF0YUlkOworCisgICAgLyoqCisgICAgICogTVBVIHNlcXVlbmNlIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhIChvbmx5IGZvciBNTVRQKQorICAgICAqLworICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKKworICAgIGJvb2xlYW4gaXNQZXNQcml2YXRlRGF0YTsKKworICAgIC8qKgorICAgICAqIElmIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGZpZWxkIGlzIHZhbGlkIG9yIG5vdAorICAgICAqLworICAgIGJvb2xlYW4gaXNBdWRpb0V4dHJhTWV0YURhdGE7CisKKyAgICAvKioKKyAgICAgKiBPbmx5IHZhbGlkIHdoZW4gaXNBdWRpb0V4dHJhTWV0YURhdGEgaXMgdHJ1ZQorICAgICAqLworICAgIFR1bmVyQXVkaW9FeHRyYU1ldGFEYXRhIGF1ZGlvOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cENvbmZpZ3VyYXRpb24uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyY2E4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKKworLyoqCisgKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGFuIG1tdHAgZmlsdGVyLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlck1tdHBDb25maWd1cmF0aW9uIHsKKyAgICBjaGFyIG1tdHBQaWQ7CisKKyAgICBUdW5lckZpbHRlclNldHRpbmdzIGZpbHRlclNldHRpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODg3MWNmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW10cFJlY29yZEV2ZW50LmFpZGwKQEAgLTAsMCArMSw1NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgRXZlbnQgZm9yIGFuIE1NVFAgUmVjb3JkIEZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJNbXRwUmVjb3JkRXZlbnQgeworICAgIGludCBzY0hldmNJbmRleE1hc2s7CisKKyAgICAvKioKKyAgICAgKiBCeXRlIG51bWJlciBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsdGVyJ3Mgb3V0cHV0CisgICAgICovCisgICAgbG9uZyBieXRlTnVtYmVyOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGN1cnJlbnQgZXZlbnQgY29udGFpbnMgZXh0ZW5kZWQgaW5mb3JtYXRpb24gb3Igbm90CisgICAgICovCisgICAgYm9vbGVhbiBpc0V4dGVuZGVkOworCisgICAgLyoqCisgICAgICogVGhlIFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKFBUUykgZm9yIHRoZSBhdWRpbyBvciB2aWRlbyBmcmFtZS4gSXQgaXMgYmFzZWQgb24gOTBLSHoKKyAgICAgKiBhbmQgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgUFRTIGluIElTTy9JRUMgMTM4MTgtMS4KKyAgICAgKi8KKyAgICBsb25nIHB0czsKKworICAgIC8qKgorICAgICAqIE1QVSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGZpbHRlcmVkIGRhdGEuIFRoaXMgaXMgb25seSB1c2VkIGZvciBNTVRQLgorICAgICAqLworICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UgZGVmaW5lZCBpbiBJVFUtVCBSZWMuIEguMjY0LgorICAgICAqLworICAgIGludCBmaXJzdE1iSW5TbGljZTsKKworICAgIC8qKgorICAgICAqIFRTIGluZGV4IG1hc2suCisgICAgICovCisgICAgaW50IHRzSW5kZXhNYXNrOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW9uaXRvckV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJNb25pdG9yRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWFiNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyTW9uaXRvckV2ZW50LmFpZGwKQEAgLTAsMCArMSwzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgbW9uaXRvciBldmVudHMuCisgKgorICoge0BoaWRlfQorICovCit1bmlvbiBUdW5lckZpbHRlck1vbml0b3JFdmVudCB7CisgICAgLyoqCisgICAgICogTmV3IHNjcmFtYmxpbmcgc3RhdHVzLgorICAgICAqLworICAgIGludCBzY3JhbWJsaW5nU3RhdHVzOworCisgICAgLyoqCisgICAgICogTmV3IGNpZCBmb3IgdGhlIElQIGZpbHRlci4KKyAgICAgKi8KKyAgICBpbnQgY2lkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTJmMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIFBlcyBEYXRhLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlclBlc0RhdGFTZXR0aW5ncyB7CisgICAgY2hhciBzdHJlYW1JZDsKKworICAgIGJvb2xlYW4gaXNSYXc7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJQZXNFdmVudC5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzFlY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyUGVzRXZlbnQuYWlkbApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEZpbHRlciBFdmVudCBmb3IgUEVTIEZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJQZXNFdmVudCB7CisgICAgY2hhciBzdHJlYW1JZDsKKworICAgIC8qKgorICAgICAqIERhdGEgc2l6ZSBpbiBieXRlcyBvZiBQRVMgZGF0YQorICAgICAqLworICAgIGNoYXIgZGF0YUxlbmd0aDsKKworICAgIC8qKgorICAgICAqIE1QVSBzZXF1ZW5jZSBudW1iZXIgb2YgZmlsdGVyZWQgZGF0YQorICAgICAqLworICAgIGludCBtcHVTZXF1ZW5jZU51bWJlcjsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclJlY29yZFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YmU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJSZWNvcmRTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2NJbmRleE1hc2s7CisKKy8qKgorICogRmlsdGVyIFNldHRpbmdzIGZvciByZWNvcmRpbmcuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVyUmVjb3JkU2V0dGluZ3MgeworICAgIGludCB0c0luZGV4TWFzazsKKworICAgIGludCBzY0luZGV4VHlwZTsKKworICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTY0luZGV4TWFzay5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2NJbmRleE1hc2suYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM3ZmNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2NJbmRleE1hc2suYWlkbApAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEZpbHRlciBTQyBJbmRleCBNYXNrCisgKgorICoge0BoaWRlfQorICovCit1bmlvbiBUdW5lckZpbHRlclNjSW5kZXhNYXNrIHsKKyAgICBpbnQgc2M7CisKKyAgICBpbnQgc2NIZXZjOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkJpdHMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0Zjg0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25CaXRzLmFpZGwKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBCaXRzIHNldHRpbmdzIG9mIGEgc2VjdGlvbiBGaWx0ZXIuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvbkJpdHMgeworICAgIGJ5dGVbXSBmaWx0ZXI7CisKKyAgICBieXRlW10gbWFzazsKKworICAgIGJ5dGVbXSBtb2RlOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkNvbmRpdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWFiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uLmFpZGwKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uQml0czsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbzsKKworLyoqCisgKiBTZWN0aW9uIGZpbHRlciBjb25kaXRpb24gc2V0dGluZ3MuCisgKgorICoge0BoaWRlfQorICovCit1bmlvbiBUdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb24geworICAgIFR1bmVyRmlsdGVyU2VjdGlvbkJpdHMgc2VjdGlvbkJpdHM7CisKKyAgICBUdW5lckZpbHRlclNlY3Rpb25UYWJsZUluZm8gdGFibGVJbmZvOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjIwOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvbkV2ZW50LmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgRXZlbnQgZm9yIFNlY3Rpb24gRmlsdGVyLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlclNlY3Rpb25FdmVudCB7CisgICAgLyoqCisgICAgICogVGFibGUgSUQgb2YgZmlsdGVyZWQgZGF0YQorICAgICAqLworICAgIGNoYXIgdGFibGVJZDsKKworICAgIC8qKgorICAgICAqIFZlcnNpb24gbnVtYmVyIG9mIGZpbHRlcmVkIGRhdGEKKyAgICAgKi8KKyAgICBjaGFyIHZlcnNpb247CisKKyAgICAvKioKKyAgICAgKiBTZWN0aW9uIG51bWJlciBvZiBmaWx0ZXJlZCBkYXRhCisgICAgICovCisgICAgY2hhciBzZWN0aW9uTnVtOworCisgICAgLyoqCisgICAgICogRGF0YSBzaXplIGluIGJ5dGVzIG9mIGZpbHRlcmVkIGRhdGEKKyAgICAgKi8KKyAgICBjaGFyIGRhdGFMZW5ndGg7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNlY3Rpb25TZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTI5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNlY3Rpb25Db25kaXRpb247CisKKy8qKgorICogRmlsdGVyIFNldHRpbmdzIGZvciBhIHNlY3Rpb24gZmlsdGVyLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlclNlY3Rpb25TZXR0aW5ncyB7CisgICAgVHVuZXJGaWx0ZXJTZWN0aW9uQ29uZGl0aW9uIGNvbmRpdGlvbjsKKworICAgIGJvb2xlYW4gaXNDaGVja0NyYzsKKworICAgIGJvb2xlYW4gaXNSZXBlYXQ7CisKKyAgICBib29sZWFuIGlzUmF3OworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mby5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mby5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzhjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJTZWN0aW9uVGFibGVJbmZvLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBUYWJsZSBpbmZvIHNldHRpbmdzIG9mIGEgc2VjdGlvbiBGaWx0ZXIuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2VjdGlvblRhYmxlSW5mbyB7CisgICAgY2hhciB0YWJsZUlkOworCisgICAgY2hhciB2ZXJzaW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3ZWFhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJBdlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJEb3dubG9hZFNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJQZXNEYXRhU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclJlY29yZFNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3M7CisKKy8qKgorICogRmlsdGVyIFNldHRpbmdzLgorICoKKyAqIHtAaGlkZX0KKyAqLwordW5pb24gVHVuZXJGaWx0ZXJTZXR0aW5ncyB7CisgICAgYm9vbGVhbiBub3RoaW5nOworCisgICAgVHVuZXJGaWx0ZXJBdlNldHRpbmdzIGF2OworCisgICAgVHVuZXJGaWx0ZXJTZWN0aW9uU2V0dGluZ3Mgc2VjdGlvbjsKKworICAgIFR1bmVyRmlsdGVyUGVzRGF0YVNldHRpbmdzIHBlc0RhdGE7CisKKyAgICBUdW5lckZpbHRlclJlY29yZFNldHRpbmdzIHJlY29yZDsKKworICAgIFR1bmVyRmlsdGVyRG93bmxvYWRTZXR0aW5ncyBkb3dubG9hZDsKKworICAgIGJvb2xlYW4gaXNQYXNzdGhyb3VnaDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8uYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclNoYXJlZEhhbmRsZUluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mby5haWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNvbW1vbi5OYXRpdmVIYW5kbGU7CisKKy8qKgorICogRmlsdGVyIFNoYXJlZCBIYW5kbGUgSW5mb3JtYXRpb24uCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRmlsdGVyU2hhcmVkSGFuZGxlSW5mbyB7CisgICAgTmF0aXZlSGFuZGxlIGhhbmRsZTsKKyAgICBsb25nIHNpemU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGVtaUV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUZW1pRXZlbnQuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRlOTkzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGVtaUV2ZW50LmFpZGwKQEAgLTAsMCArMSw0MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBGaWx0ZXIgRXZlbnQgZm9yIFRpbWVkIEV4dGVybmFsIE1lZGlhIEluZm9ybWF0aW9uIChURU1JKSBkYXRhLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZpbHRlclRlbWlFdmVudCB7CisgICAgLyoqCisgICAgICogUHJlc2VudGF0aW9uIFRpbWUgU3RhbXAgZm9yIGF1ZGlvIG9yIHZpZGVvIGZyYW1lLiBJdCBiYXNlZCBvbiA5MEtIeiBoYXMKKyAgICAgKiB0aGUgc2FtZSBmb3JtYXQgYXMgUFRTIChQcmVzZW50YXRpb24gVGltZSBTdGFtcCkgaW4gSVNPL0lFQyAxMzgxOC0xLgorICAgICAqLworICAgIGxvbmcgcHRzOworCisgICAgLyoqCisgICAgICogVEVNSSBEZXNjcmlwdG9yIFRhZworICAgICAqLworICAgIGJ5dGUgZGVzY3JUYWc7CisKKyAgICAvKioKKyAgICAgKiBURU1JIERlc2NyaXB0b3IKKyAgICAgKi8KKyAgICBieXRlW10gZGVzY3JEYXRhOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVGx2Q29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjM3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwzMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGaWx0ZXJTZXR0aW5nczsKKworLyoqCisgKiBGaWx0ZXIgU2V0dGluZ3MgZm9yIGEgdGx2IGZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJUbHZDb25maWd1cmF0aW9uIHsKKyAgICBieXRlIHBhY2tldFR5cGU7CisKKyAgICBib29sZWFuIGlzQ29tcHJlc3NlZElwUGFja2V0OworCisgICAgVHVuZXJGaWx0ZXJTZXR0aW5ncyBmaWx0ZXJTZXR0aW5nczsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRmlsdGVyVHNDb25maWd1cmF0aW9uLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzODZlNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzQ29uZmlndXJhdGlvbi5haWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRmlsdGVyU2V0dGluZ3M7CisKKy8qKgorICogRmlsdGVyIFNldHRpbmdzIGZvciBhIFRTIGZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJUc0NvbmZpZ3VyYXRpb24geworICAgIGNoYXIgdHBpZDsKKworICAgIFR1bmVyRmlsdGVyU2V0dGluZ3MgZmlsdGVyU2V0dGluZ3M7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50LmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50LmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyYTc0OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZpbHRlclRzUmVjb3JkRXZlbnQuYWlkbApAQCAtMCwwICsxLDU2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZpbHRlclNjSW5kZXhNYXNrOworCisvKioKKyAqIEZpbHRlciBFdmVudCBmb3IgVFMgUmVjb3JkIEZpbHRlci4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGaWx0ZXJUc1JlY29yZEV2ZW50IHsKKyAgICBjaGFyIHBpZDsKKworICAgIGludCB0c0luZGV4TWFzazsKKworICAgIC8qKgorICAgICAqIEluZGV4ZXMgb2YgcmVjb3JkIG91dHB1dAorICAgICAqLworICAgIFR1bmVyRmlsdGVyU2NJbmRleE1hc2sgc2NJbmRleE1hc2s7CisKKyAgICAvKioKKyAgICAgKiBCeXRlIG51bWJlciBmcm9tIGJlZ2lubmluZyBvZiB0aGUgZmlsdGVyJ3Mgb3V0cHV0CisgICAgICovCisgICAgbG9uZyBieXRlTnVtYmVyOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGN1cnJlbnQgZXZlbnQgY29udGFpbnMgZXh0ZW5kZWQgaW5mb3JtYXRpb24gb3Igbm90CisgICAgICovCisgICAgYm9vbGVhbiBpc0V4dGVuZGVkOworCisgICAgLyoqCisgICAgICogVGhlIFByZXNlbnRhdGlvbiBUaW1lIFN0YW1wKFBUUykgZm9yIHRoZSBhdWRpbyBvciB2aWRlbyBmcmFtZS4gSXQgaXMgYmFzZWQgb24gOTBLSHoKKyAgICAgKiBhbmQgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgUFRTIGluIElTTy9JRUMgMTM4MTgtMS4KKyAgICAgKi8KKyAgICBsb25nIHB0czsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayBpbiB0aGUgc2xpY2UgZGVmaW5lZCBpbiBJVFUtVCBSZWMuIEguMjY0LgorICAgICAqLworICAgIGludCBmaXJzdE1iSW5TbGljZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQW5hbG9nQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YmYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogQW5hbG9nIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBbmFsb2dDYXBhYmlsaXRpZXMgeworCS8qKgorICAgICAqIFNpZ25hbCBUeXBlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgdHlwZUNhcDsKKworICAgIC8qKgorICAgICAqIFN0YW5kYXJkIEludGVyY2hhbmdlIEZvcm1hdCAoU0lGKSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHNpZlN0YW5kYXJkQ2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBbmFsb2dTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwY2Q4YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw0MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBbmFsb2cgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgaW50IHNpZ25hbFR5cGU7CisKKyAgICAvKioKKyAgICAgKiBTdGFuZGFyZCBJbnRlcmNoYW5nZSBGb3JtYXQgKFNJRikgc2V0dGluZworICAgICAqLworICAgIGludCBzaWZTdGFuZGFyZDsKKworICAgIC8qKgorICAgICAqIEZpZWxkcyBhZnRlciBpc0V4dGVuZGVkIGFyZSBvbmx5IHZhbGlkIHdoZW4gaXNFeHRlbmRlZCBpcyB0cnVlCisgICAgICovCisgICAgYm9vbGVhbiBpc0V4dGVuZGVkOworCisgICAgaW50IGFmdEZsYWc7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5YmU3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDU0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyB7CisgICAgLyoqCisgICAgICogQmFuZHdpZHRoIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgYmFuZHdpZHRoQ2FwOworCisgICAgLyoqCisgICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZHVsYXRpb25DYXA7CisKKyAgICAvKioKKyAgICAgKiBUaW1lSW50ZXJsZWF2ZU1vZGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCB0aW1lSW50ZXJsZWF2ZU1vZGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBDb2RlUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgLyoqCisgICAgICogRkVDIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgZmVjQ2FwOworCisgICAgLyoqCisgICAgICogRGVtb2R1bGF0b3IgT3V0cHV0IEZvcm1hdCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGRlbW9kT3V0cHV0Rm9ybWF0Q2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjllMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzUGxwU2V0dGluZ3MgeworICAgIGludCBwbHBJZDsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgaW50IGludGVybGVhdmVNb2RlOworCisgICAgaW50IGNvZGVSYXRlOworCisgICAgLyoqCisgICAgICogRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIFR5cGUuCisgICAgICovCisgICAgaW50IGZlYzsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmYjhjNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQXRzYzNTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM1BscFNldHRpbmdzOworCisvKioKKyAqIEF0c2MzIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgLyoqCisgICAgICogQmFuZHdpZHRoIG9mIHR1bmluZyBiYW5kLgorICAgICAqLworICAgIGludCBiYW5kd2lkdGg7CisKKyAgICBpbnQgZGVtb2RPdXRwdXRGb3JtYXQ7CisKKyAgICBUdW5lckZyb250ZW5kQXRzYzNQbHBTZXR0aW5nc1tdIHBscFNldHRpbmdzOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZjMmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBVFNDIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbkNhcDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E4YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRBdHNjU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEF0c2MgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQXRzY1NldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZUNhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODBjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBDYWJsZShEVkJDKSBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBtb2R1bGF0aW9uQ2FwOworCisgICAgLyoqCisgICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBsb25nIGNvZGVSYXRlQ2FwOyAvLyBpbm5lciBGRUMgd2lsbCBjb252ZXJnZSB0byBjb2RlUmF0ZQorCisgICAgLyoqCisgICAgICogQW5uZXggY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBhbm5leENhcDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYWJsZVNldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliY2YyOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogQ2FibGUgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyB7CisgICAgLyoqCisgICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBmcmVxdWVuY3k7CisKKyAgICBpbnQgbW9kdWxhdGlvbjsKKworICAgIC8qKgorICAgICAqIElubmVyIEZvcndhcmQgRXJyb3IgQ29ycmVjdGlvbiB0eXBlIGFzIHNwZWNpZmllZCBpbiBFVFNJIEVOIDMwMCA0NjggVjEuMTUuMQorICAgICAqIGFuZCBFVFNJIEVOIDMwMiAzMDctMiBWMS4xLjEuCisgICAgICovCisgICAgbG9uZyBpbm5lckZlYzsKKworICAgIC8qKgorICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgLyoqCisgICAgICogT3V0ZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIChGRUMpIFR5cGUuCisgICAgICovCisgICAgaW50IG91dGVyRmVjOworCisgICAgaW50IGFubmV4OworCisgICAgLyoqCisgICAgICogU3BlY3RyYWwgSW52ZXJzaW9uIFR5cGUuCisgICAgICovCisgICAgaW50IHNwZWN0cmFsSW52ZXJzaW9uOworCisgICAgLyoqCisgICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKKyAgICAgKi8KKyAgICBib29sZWFuIGlzRXh0ZW5kZWQ7CisKKyAgICBpbnQgaW50ZXJsZWF2ZU1vZGU7CisKKyAgICBpbnQgYmFuZHdpZHRoOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmMzFmMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSw4NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2MzQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhYmxlQ2FwYWJpbGl0aWVzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZidENhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2Ric0NhcGFiaWxpdGllczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNDYXBhYmlsaXRpZXM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXM7CisKKy8qKgorICogRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KKyAqCisgKiBVc2UgYSBncm91cCBvZiB2ZWN0b3JzIGFzIHRoZSB3b3JrYXJvdW5kIGZvciBVbmlvbiBzdHJ1Y3R1cmUgdGhhdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkCisgKiBpbiBBSURMIGN1cnJlbnRseS4KKyAqCisgKiBDbGllbnQgbWF5IHVzZSBGcm9udGVuZEluZm8udHlwZSBhcyB0aGUgZGlzY3JpbWluYXIgdG8gY2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdmVjdG9yLiBJZgorICogdGhlIHZlY3RvciBpcyBub3QgbnVsbCwgaXQgY29udGFpbnMgdmFsaWQgdmFsdWUuCisgKgorICoge0BoaWRlfQorICovCit1bmlvbiBUdW5lckZyb250ZW5kQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBBbmFsb2cgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZEFuYWxvZ0NhcGFiaWxpdGllcyBhbmFsb2dDYXBzOworCisgICAgLyoqCisgICAgICogQVRTQyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kQXRzY0NhcGFiaWxpdGllcyBhdHNjQ2FwczsKKworICAgIC8qKgorICAgICAqIEFUU0MzIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRBdHNjM0NhcGFiaWxpdGllcyBhdHNjM0NhcHM7CisKKyAgICAvKioKKyAgICAgKiBDYWJsZSBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kQ2FibGVDYXBhYmlsaXRpZXMgY2FibGVDYXBzOworCisgICAgLyoqCisgICAgICogRFZCUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMKKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyBkdmJzQ2FwczsKKworICAgIC8qKgorICAgICAqIERWQlQgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMgZHZidENhcHM7CisKKyAgICAvKioKKyAgICAgKiBJU0RCLVMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzIGlzZGJzQ2FwczsKKworICAgIC8qKgorICAgICAqIElTREItUzMgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzCisgICAgICovCisgICAgVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcyBpc2RiczNDYXBzOworCisgICAgLyoqCisgICAgICogSVNEQi1UIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRJc2RidENhcGFiaWxpdGllcyBpc2RidENhcHM7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHRtYkNhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTQ5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDM2IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIERUTUIgRnJvbnRlbmQgQ2FwYWJpbGl0aWVzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZER0bWJDYXBhYmlsaXRpZXMgeworICAgIGludCB0cmFuc21pc3Npb25Nb2RlQ2FwOworCisgICAgaW50IGJhbmR3aWR0aENhcDsKKworICAgIGludCBtb2R1bGF0aW9uQ2FwOworCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgaW50IGd1YXJkSW50ZXJ2YWxDYXA7CisKKyAgICBpbnQgaW50ZXJsZWF2ZU1vZGVDYXA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU3ZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdG1iU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIERUTUIgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHRtYlNldHRpbmdzIHsKKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgaW50IHRyYW5zbWlzc2lvbk1vZGU7CisKKyAgICBpbnQgYmFuZHdpZHRoOworCisgICAgaW50IG1vZHVsYXRpb247CisKKyAgICBpbnQgY29kZVJhdGU7CisKKyAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKKworICAgIGludCBpbnRlcmxlYXZlTW9kZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0MzIyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogRFZCUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic0NhcGFiaWxpdGllcyB7CisgICAgLyoqCisgICAgICogTW9kdWxhdGlvbiBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IG1vZHVsYXRpb25DYXA7CisKKyAgICAvKioKKyAgICAgKiBDb2RlIFJhdGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGxvbmcgY29kZVJhdGVDYXA7ICAvLyBpbm5lciBGRUMgd2lsbCBjb252ZXJnZSB0byBjb2RlUmF0ZQorCisgICAgLyoqCisgICAgICogU3ViIHN0YW5kYXJkcyBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHN0YW5kYXJkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzQ29kZVJhdGUuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliN2RlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlLmFpZGwKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEdmJzIEZyb250ZW5kIENvZGVSYXRlIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSB7CisgICAgLyoqCisgICAgICogSW5uZXIgRm9yd2FyZCBFcnJvciBDb3JyZWN0aW9uIHR5cGUgYXMgc3BlY2lmaWVkIGluIEVUU0kgRU4gMzAwIDQ2OCBWMS4xNS4xCisgICAgICogYW5kIEVUU0kgRU4gMzAyIDMwNy0yIFYxLjEuMS4KKyAgICAgKi8KKyAgICBsb25nIGZlYzsKKworICAgIGJvb2xlYW4gaXNMaW5lYXI7CisKKyAgICAvKioKKyAgICAgKiB0cnVlIGlmIGVuYWJsZSBzaG9ydCBmcmFtZQorICAgICAqLworICAgIGJvb2xlYW4gaXNTaG9ydEZyYW1lczsKKworICAgIC8qKgorICAgICAqIGJpdHMgbnVtYmVyIGluIDEwMDAgc3ltYm9sLiAwIGlmIHVzZSB0aGUgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBpbnQgYml0c1BlcjEwMDBTeW1ib2w7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNlNGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHZic0NvZGVSYXRlOworCisvKioKKyAqIER2YnMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kRHZic1NldHRpbmdzIHsKKyAgICAvKioKKyAgICAgKiBTaWduYWwgZnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IGZyZXF1ZW5jeTsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgVHVuZXJGcm9udGVuZER2YnNDb2RlUmF0ZSBjb2RlUmF0ZTsKKworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgLyoqCisgICAgICogUm9sbCBvZmYgdHlwZS4KKyAgICAgKi8KKyAgICBpbnQgcm9sbG9mZjsKKworICAgIC8qKgorICAgICAqIFBpbG90IG1vZGUuCisgICAgICovCisgICAgaW50IHBpbG90OworCisgICAgaW50IGlucHV0U3RyZWFtSWQ7CisKKyAgICBpbnQgc3RhbmRhcmQ7CisKKyAgICAvKioKKyAgICAgKiBWY20gbW9kZS4KKyAgICAgKi8KKyAgICBpbnQgdmNtOworCisgICAgLyoqCisgICAgICogRmllbGRzIGFmdGVyIGlzRXh0ZW5kZWQgYXJlIG9ubHkgdmFsaWQgd2hlbiBpc0V4dGVuZGVkIGlzIHRydWUKKyAgICAgKi8KKyAgICBib29sZWFuIGlzRXh0ZW5kZWQ7CisKKyAgICBpbnQgc2NhblR5cGU7CisKKyAgICBib29sZWFuIGlzRGlzZXFjUnhNZXNzYWdlOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZER2YnRDYXBhYmlsaXRpZXMuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2YxNmRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzLmFpZGwKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEVkJUIEZyb250ZW5kIENhcGFiaWxpdGllcyBpbnRlcmZhY2UuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmREdmJ0Q2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBUcmFuc21pc3Npb24gTW9kZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IHRyYW5zbWlzc2lvbk1vZGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBCYW5kd2lkdGggY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBiYW5kd2lkdGhDYXA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGVsbGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgY29uc3RlbGxhdGlvbkNhcDsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworCisgICAgLyoqCisgICAgICogSGllcmFyY2h5IFR5cGUgY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBoaWVyYXJjaHlDYXA7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZCBJbnRlcnZhbCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGd1YXJkSW50ZXJ2YWxDYXA7CisKKyAgICAvKioKKyAgICAgKiBUMiBTdXBwb3J0IGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBib29sZWFuIGlzVDJTdXBwb3J0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBNaXNvIFN1cHBvcnQgY2FwYWJpbGl0eQorICAgICAqLworICAgIGJvb2xlYW4gaXNNaXNvU3VwcG9ydGVkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjOTQyYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kRHZidFNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw3NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBEdmJ0IEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZER2YnRTZXR0aW5ncyB7CisgICAgLyoqCisgICAgICogU2lnbmFsIGZyZXF1ZW5jeSBpbiBIZXJ0egorICAgICAqLworICAgIGludCBmcmVxdWVuY3k7CisKKyAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZTsKKworICAgIGludCBiYW5kd2lkdGg7CisKKyAgICBpbnQgY29uc3RlbGxhdGlvbjsKKworICAgIGludCBoaWVyYXJjaHk7CisKKyAgICAvKioKKyAgICAgKiBDb2RlIFJhdGUgZm9yIEhpZ2ggUHJpb3JpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBpbnQgaHBDb2RlUmF0ZTsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBmb3IgTG93IFByaW9yaXR5IGxldmVsCisgICAgICovCisgICAgaW50IGxwQ29kZVJhdGU7CisKKyAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKKworICAgIGJvb2xlYW4gaXNIaWdoUHJpb3JpdHk7CisKKyAgICBpbnQgc3RhbmRhcmQ7CisKKyAgICBib29sZWFuIGlzTWlzbzsKKworICAgIC8qKgorICAgICAqIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkgbW9kZQorICAgICAqLworICAgIGludCBwbHBNb2RlOworCisgICAgLyoqCisgICAgICogUGh5c2ljYWwgTGF5ZXIgUGlwZSAoUExQKSBJZAorICAgICAqLworICAgIGludCBwbHBJZDsKKworICAgIC8qKgorICAgICAqIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkgR3JvdXAgSWQKKyAgICAgKi8KKyAgICBpbnQgcGxwR3JvdXBJZDsKKworICAgIC8qKgorICAgICAqIEZpZWxkcyBhZnRlciBpc0V4dGVuZGVkIGFyZSBvbmx5IHZhbGlkIHdoZW4gaXNFeHRlbmRlZCBpcyB0cnVlCisgICAgICovCisgICAgYm9vbGVhbiBpc0V4dGVuZGVkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNjZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJbmZvLmFpZGwKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhcGFiaWxpdGllczsKKworLyoqCisgKiBGcm9udGVuZEluZm8gaW50ZXJmYWNlIHRoYXQgY2FycmllcyB0dW5lciBmcm9udGVuZCBpbmZvcm1hdGlvbi4KKyAqCisgKiA8cD5UaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBUdW5lclJlc291cmNlTWFuYWdlciBhbmQgcGFzcyBGcm9udGVuZAorICogaW5mb3JtYXRpb24gZnJvbSBIQUwgdG8gdGhlIGNsaWVudCBzaWRlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSW5mbyB7CisgICAgLyoqCisgICAgICogRnJvbnRlbmQgSGFuZGxlCisgICAgICovCisgICAgaW50IGhhbmRsZTsKKworICAgIC8qKgorICAgICAqIEZyb250ZW5kIFR5cGUKKyAgICAgKi8KKyAgICBpbnQgdHlwZTsKKworICAgIC8qKgorICAgICAqIE1pbmltdW0gRnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IG1pbkZyZXF1ZW5jeTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gRnJlcXVlbmN5IGluIEhlcnR6CisgICAgICovCisgICAgaW50IG1heEZyZXF1ZW5jeTsKKworICAgIC8qKgorICAgICAqIE1pbmltdW0gc3ltYm9scyBwZXIgc2Vjb25kCisgICAgICovCisgICAgaW50IG1pblN5bWJvbFJhdGU7CisKKyAgICAvKioKKyAgICAgKiBNYXhpbXVtIHN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBtYXhTeW1ib2xSYXRlOworCisgICAgLyoqCisgICAgICogUmFuZ2UgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgYWNxdWlyZVJhbmdlOworCisgICAgLyoqCisgICAgICogRnJvbnRlbmRzIGFyZSBhc3NpZ25lZCB3aXRoIHRoZSBzYW1lIGV4Y2x1c2l2ZUdyb3VwSWQgaWYgdGhleSBjYW4ndAorICAgICAqIGZ1bmN0aW9uIGF0IHNhbWUgdGltZS4gRm9yIGluc3RhbmNlLCB0aGV5IHNoYXJlIHNhbWUgaGFyZHdhcmUgbW9kdWxlLgorICAgICAqLworICAgIGludCBleGNsdXNpdmVHcm91cElkOworCisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIHN1cHBvcnRlZCBzdGF0dXMgdHlwZXMgd2hpY2ggY2xpZW50IGNhbiBpbnF1aXJ5CisgICAgICovCisgICAgaW50W10gc3RhdHVzQ2FwczsKKworICAgIC8qKgorICAgICAqIEZyb250ZW5kIENhcGFiaWxpdGllcworICAgICAqLworICAgIFR1bmVyRnJvbnRlbmRDYXBhYmlsaXRpZXMgY2FwczsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZGQ2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM0NhcGFiaWxpdGllcy5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKKy8qKgorICogSVNEQi1TMyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnMzQ2FwYWJpbGl0aWVzIHsKKyAgICAvKioKKyAgICAgKiBNb2R1bGF0aW9uIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbkNhcDsKKworICAgIC8qKgorICAgICAqIENvZGUgUmF0ZSBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGNvZGVSYXRlQ2FwOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTFmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw0NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBJc2RiczMgRnJvbnRlbmQgU2V0dGluZ3MgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnMzU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgY2hhciBzdHJlYW1JZDsKKworICAgIGludCBzdHJlYW1JZFR5cGU7CisKKyAgICBpbnQgbW9kdWxhdGlvbjsKKworICAgIGludCBjb2RlUmF0ZTsKKworICAgIC8qKgorICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgaW50IHJvbGxvZmY7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzQ2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkZmRmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDM0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIElTREItUyBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnNDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBtb2R1bGF0aW9uQ2FwOworCisgICAgLyoqCisgICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgY29kZVJhdGVDYXA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjlmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDQ0IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIElzZGJzIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJzU2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgY2hhciBzdHJlYW1JZDsKKworICAgIGludCBzdHJlYW1JZFR5cGU7CisKKyAgICBpbnQgbW9kdWxhdGlvbjsKKworICAgIGludCBjb2RlUmF0ZTsKKworICAgIC8qKgorICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgaW50IHJvbGxvZmY7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0Q2FwYWJpbGl0aWVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyOTVkOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMuYWlkbApAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIElTREItVCBGcm9udGVuZCBDYXBhYmlsaXRpZXMgaW50ZXJmYWNlLgorICoKKyAqIHtAaGlkZX0KKyAqLworcGFyY2VsYWJsZSBUdW5lckZyb250ZW5kSXNkYnRDYXBhYmlsaXRpZXMgeworICAgIC8qKgorICAgICAqIElTREItVCBNb2RlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgbW9kZUNhcDsKKworICAgIC8qKgorICAgICAqIEJhbmR3aWR0aCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGJhbmR3aWR0aENhcDsKKworICAgIC8qKgorICAgICAqIE1vZHVsYXRpb24gY2FwYWJpbGl0eQorICAgICAqLworICAgIGludCBtb2R1bGF0aW9uQ2FwOworCisgICAgLyoqCisgICAgICogQ29kZSBSYXRlIGNhcGFiaWxpdHkKKyAgICAgKi8KKyAgICBpbnQgY29kZVJhdGVDYXA7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZCBJbnRlcnZhbCBjYXBhYmlsaXR5CisgICAgICovCisgICAgaW50IGd1YXJkSW50ZXJ2YWxDYXA7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kSXNkYnRTZXR0aW5ncy5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWYzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MuYWlkbApAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIENvcHlyaWdodCAyMDIwLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIElzZGJ0IEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZElzZGJ0U2V0dGluZ3MgeworICAgIC8qKgorICAgICAqIFNpZ25hbCBmcmVxdWVuY3kgaW4gSGVydHoKKyAgICAgKi8KKyAgICBpbnQgZnJlcXVlbmN5OworCisgICAgaW50IG1vZHVsYXRpb247CisKKyAgICBpbnQgYmFuZHdpZHRoOworCisgICAgaW50IG1vZGU7CisKKyAgICBpbnQgY29kZVJhdGU7CisKKyAgICBpbnQgZ3VhcmRJbnRlcnZhbDsKKworICAgIGludCBzZXJ2aWNlQXJlYUlkOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhmY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvLmFpZGwKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworLyoqCisgKiBBdHNjMyBGcm9udGVuZCBQaHlzaWNhbCBMYXllciBQaXBlIEluZm8uCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvIHsKKyAgICBieXRlIHBscElkOworCisgICAgYm9vbGVhbiBsbHNGbGFnOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZS5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZS5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjFjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFNjYW5NZXNzYWdlLmFpZGwKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZFNjYW5BdHNjM1BscEluZm87CisKKy8qKgorICogVHVuZXIgRnJvbnRlbmQgU2NhbiBNZXNzYWdlIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIFR1bmVyRnJvbnRlbmRTY2FuTWVzc2FnZSB7CisgICAgYm9vbGVhbiBpc0xvY2tlZDsKKworICAgIGJvb2xlYW4gaXNFbmQ7CisKKyAgICBieXRlIHByb2dyZXNzUGVyY2VudDsKKworICAgIGludFtdIGZyZXF1ZW5jaWVzOworCisgICAgaW50W10gc3ltYm9sUmF0ZXM7CisKKyAgICBpbnQgaGllcmFyY2h5OworCisgICAgaW50IGFuYWxvZ1R5cGU7CisKKyAgICBieXRlW10gcGxwSWRzOworCisgICAgYnl0ZVtdIGdyb3VwSWRzOworCisgICAgY2hhcltdIGlucHV0U3RyZWFtSWRzOworCisgICAgaW50IHN0ZDsKKworICAgIFR1bmVyRnJvbnRlbmRTY2FuQXRzYzNQbHBJbmZvW10gYXRzYzNQbHBJbmZvczsKKworICAgIGludCBtb2R1bGF0aW9uOworCisgICAgaW50IGFubmV4OworCisgICAgYm9vbGVhbiBpc0hpZ2hQcmlvcml0eTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE1ZjNlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTZXR0aW5ncy5haWRsCkBAIC0wLDAgKzEsMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzOworCisvKioKKyAqIEZyb250ZW5kIFNldHRpbmdzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3BhcmNlbGFibGUgVHVuZXJGcm9udGVuZFNldHRpbmdzIHsKKyAgICBUdW5lckZyb250ZW5kVW5pb25TZXR0aW5ncyBzZXR0aW5nczsKKworICAgIGJvb2xlYW4gaXNFeHRlbmRlZDsKKworICAgIGludCBlbmRGcmVxdWVuY3k7CisKKyAgICBpbnQgaW52ZXJzaW9uOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXMuYWlkbCBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzLmFpZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzYzAxYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3R1bmVyL2FpZGwvYW5kcm9pZC9tZWRpYS90di90dW5lci9UdW5lckZyb250ZW5kU3RhdHVzLmFpZGwKQEAgLTAsMCArMSwxODcgQEAKKy8qKgorICogQ29weXJpZ2h0IDIwMjAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQubWVkaWEudHYudHVuZXI7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm87CisKKy8qKgorICogVHVuZXIgRnJvbnRlbmQgU3RhdHVzIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIFR1bmVyRnJvbnRlbmRTdGF0dXMgeworICAgIC8qKgorICAgICAqIExvY2sgc3RhdHVzIGZvciBEZW1vZCBpbiBUcnVlL0ZhbHNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNEZW1vZExvY2tlZDsKKworICAgIC8qKgorICAgICAqIFNOUiB2YWx1ZSBtZWFzdXJlZCBieSAwLjAwMSBkQi4KKyAgICAgKi8KKyAgICBpbnQgc25yOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlcnJvciBiaXRzIHBlciAxIGJpbGxpb24gYml0cy4KKyAgICAgKi8KKyAgICBpbnQgYmVyOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBlcnJvciBwYWNrYWdlcyBwZXIgMSBiaWxsaW9uIHBhY2thZ2VzLgorICAgICAqLworICAgIGludCBwZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVycm9yIGJpdHMgcGVyIDEgYmlsbGlvbiBiaXRzIGJlZm9yZSBGRUMuCisgICAgICovCisgICAgaW50IHByZUJlcjsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCBRdWFsaXR5IGluIHBlcmNlbnQuCisgICAgICovCisgICAgaW50IHNpZ25hbFF1YWxpdHk7CisKKyAgICAvKioKKyAgICAgKiBTaWduYWwgU3RyZW5ndGggbWVhc3VyZWQgYnkgMC4wMDEgZEJtLgorICAgICAqLworICAgIGludCBzaWduYWxTdHJlbmd0aDsKKworICAgIC8qKgorICAgICAqIFN5bWJvbHMgcGVyIHNlY29uZAorICAgICAqLworICAgIGludCBzeW1ib2xSYXRlOworCisgICAgbG9uZyBpbm5lckZlYzsKKworICAgIC8qKgorICAgICAqIENoZWNrIGZyb250ZW5kIHR5cGUgdG8gZGVjaWRlIHRoZSBoaWRsIHR5cGUgdmFsdWUKKyAgICAgKi8KKyAgICBpbnQgbW9kdWxhdGlvbjsKKworICAgIGludCBpbnZlcnNpb247CisKKyAgICBpbnQgbG5iVm9sdGFnZTsKKworICAgIGJ5dGUgcGxwSWQ7CisKKyAgICBib29sZWFuIGlzRVdCUzsKKworICAgIC8qKgorICAgICAqIEFHQyB2YWx1ZSBpcyBub3JtYWxpemVkIGZyb20gMCB0byAyNTUuCisgICAgICovCisgICAgYnl0ZSBhZ2M7CisKKyAgICBib29sZWFuIGlzTG5hT247CisKKyAgICBib29sZWFuW10gaXNMYXllckVycm9yOworCisgICAgLyoqCisgICAgICogTUVSIHZhbHVlIG1lYXN1cmVkIGJ5IDAuMDAxIGRCCisgICAgICovCisgICAgaW50IG1lcjsKKworICAgIC8qKgorICAgICAqIEZyZXF1ZW5jeSBkaWZmZXJlbmNlIGluIEhlcnR6LgorICAgICAqLworICAgIGludCBmcmVxT2Zmc2V0OworCisgICAgaW50IGhpZXJhcmNoeTsKKworICAgIGJvb2xlYW4gaXNSZkxvY2tlZDsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBQTFAgc3RhdHVzIGZvciB0dW5lZCBQTFBzIGZvciBBVFNDMyBmcm9udGVuZC4KKyAgICAgKi8KKyAgICBUdW5lckZyb250ZW5kU3RhdHVzQXRzYzNQbHBJbmZvW10gcGxwSW5mbzsKKworICAgIC8vIDEuMSBFeHRlbnNpb24gU3RhcnRpbmcKKworICAgIC8qKgorICAgICAqIEV4dGVuZGVkIG1vZHVsYXRpb24gc3RhdHVzLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgorICAgICAqLworICAgIGludFtdIG1vZHVsYXRpb25zOworCisgICAgLyoqCisgICAgICogRXh0ZW5kZWQgYml0IGVycm9yIHJhdGlvIHN0YXR1cy4KKyAgICAgKi8KKyAgICBpbnRbXSBiZXJzOworCisgICAgLyoqCisgICAgICogRXh0ZW5kZWQgY29kZSByYXRlIHN0YXR1cy4KKyAgICAgKi8KKyAgICBsb25nW10gY29kZVJhdGVzOworCisgICAgLyoqCisgICAgICogRXh0ZW5kZWQgYmFuZHdpZHRoIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpbnQgYmFuZHdpZHRoOworCisgICAgLyoqCisgICAgICogRXh0ZW5kZWQgZ3VhcmQgaW50ZXJ2YWwgc3RhdHVzLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgorICAgICAqLworICAgIGludCBpbnRlcnZhbDsKKworICAgIC8qKgorICAgICAqIEV4dGVuZGVkIHRyYW5zbWlzc2lvbiBtb2RlIHN0YXR1cy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpbnQgdHJhbnNtaXNzaW9uTW9kZTsKKworICAgIC8qKgorICAgICAqIFVuY29ycmVjdGFibGUgRXJyb3IgQ291bnRzIG9mIHRoZSBmcm9udGVuZCdzIFBoeXNpY2FsIExheWVyIFBpcGUgKFBMUCkKKyAgICAgKiBzaW5jZSB0aGUgbGFzdCB0dW5lIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgdWVjOworCisgICAgLyoqCisgICAgICogVGhlIGN1cnJlbnQgRFZCLVQyIHN5c3RlbSBpZCBzdGF0dXMuCisgICAgICovCisgICAgY2hhciBzeXN0ZW1JZDsKKworICAgIC8qKgorICAgICAqIEZyb250ZW5kIEludGVybGVhdmluZyBNb2Rlcy4gQ2hlY2sgZnJvbnRlbmQgdHlwZSB0byBkZWNpZGUgdGhlIGhpZGwgdHlwZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpbnRbXSBpbnRlcmxlYXZpbmc7CisKKyAgICAvKioKKyAgICAgKiBTZWdtZW50cyBpbiBJU0RCLVQgU3BlY2lmaWNhdGlvbiBvZiBhbGwgdGhlIGNoYW5uZWxzLgorICAgICAqLworICAgIGJ5dGVbXSBpc2RidFNlZ21lbnQ7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc3BvcnQgU3RyZWFtIERhdGEgUmF0ZSBpbiBCUFMgb2YgdGhlIGN1cnJlbnQgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBpbnRbXSB0c0RhdGFSYXRlOworCisgICAgLyoqCisgICAgICogUm9sbCBPZmYgVHlwZSBzdGF0dXMgb2YgdGhlIGZyb250ZW5kLiBDaGVjayBmcm9udGVuZCB0eXBlIHRvIGRlY2lkZSB0aGUgaGlkbCB0eXBlIHZhbHVlLgorICAgICAqLworICAgIGludCByb2xsT2ZmOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGZyb250ZW5kIGN1cnJlbnRseSBzdXBwb3J0cyBNSVNPIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzTWlzbzsKKworICAgIC8qKgorICAgICAqIElmIHRoZSBmcm9udGVuZCBjb2RlIHJhdGUgaXMgbGluZWFyIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzTGluZWFyOworCisgICAgLyoqCisgICAgICogSWYgc2hvcnQgZnJhbWVzIGFyZSBlbmFibGVkIG9yIG5vdC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzU2hvcnRGcmFtZXM7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFN0YXR1c0F0c2MzUGxwSW5mby5haWRsIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE2YzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8uYWlkbApAQCAtMCwwICsxLDM5IEBACisvKioKKyAqIENvcHlyaWdodCAyMDIxLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyOworCisvKioKKyAqIEF0c2MzIEZyb250ZW5kIFBoeXNpY2FsIExheWVyIFBpcGUgSW5mbyBpbiBGcm9udGVuZCBzdGF0dXMuCisgKgorICoge0BoaWRlfQorICovCitwYXJjZWxhYmxlIFR1bmVyRnJvbnRlbmRTdGF0dXNBdHNjM1BscEluZm8geworICAgIC8qKgorICAgICAqIFBMUCBJZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBieXRlIHBscElkOworCisgICAgLyoqCisgICAgICogRGVtb2QgTG9jay9VbmxvY2sgc3RhdHVzIG9mIHRoaXMgcGFydGljdWxhciBQTFAuCisgICAgICovCisgICAgYm9vbGVhbiBpc0xvY2tlZDsKKworICAgIC8qKgorICAgICAqIFVuY29ycmVjdGFibGUgRXJyb3IgQ291bnRzIChVRUMpIG9mIHRoaXMgcGFydGljdWxhciBQTFAgc2luY2UgbGFzdCB0dW5lIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgdWVjOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzLmFpZGwgYi9zZXJ2aWNlcy90dW5lci9haWRsL2FuZHJvaWQvbWVkaWEvdHYvdHVuZXIvVHVuZXJGcm9udGVuZFVuaW9uU2V0dGluZ3MuYWlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzYyYzJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvdHVuZXIvYWlkbC9hbmRyb2lkL21lZGlhL3R2L3R1bmVyL1R1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzLmFpZGwKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYS50di50dW5lcjsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEFuYWxvZ1NldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRBdHNjM1NldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZENhYmxlU2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kRHRtYlNldHRpbmdzOworaW1wb3J0IGFuZHJvaWQubWVkaWEudHYudHVuZXIuVHVuZXJGcm9udGVuZER2YnNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3M7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS50di50dW5lci5UdW5lckZyb250ZW5kSXNkYnNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RiczNTZXR0aW5nczsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLnR2LnR1bmVyLlR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzOworCisvKioKKyAqIEZyb250ZW5kIFNldHRpbmdzIFVuaW9uIGludGVyZmFjZS4KKyAqCisgKiB7QGhpZGV9CisgKi8KK3VuaW9uIFR1bmVyRnJvbnRlbmRVbmlvblNldHRpbmdzIHsKKyAgICBUdW5lckZyb250ZW5kQW5hbG9nU2V0dGluZ3MgYW5hbG9nOworCisgICAgVHVuZXJGcm9udGVuZEF0c2NTZXR0aW5ncyBhdHNjOworCisgICAgVHVuZXJGcm9udGVuZEF0c2MzU2V0dGluZ3MgYXRzYzM7CisKKyAgICBUdW5lckZyb250ZW5kQ2FibGVTZXR0aW5ncyBjYWJsZTsKKworICAgIFR1bmVyRnJvbnRlbmREdmJzU2V0dGluZ3MgZHZiczsKKworICAgIFR1bmVyRnJvbnRlbmREdmJ0U2V0dGluZ3MgZHZidDsKKworICAgIFR1bmVyRnJvbnRlbmRJc2Ric1NldHRpbmdzIGlzZGJzOworCisgICAgVHVuZXJGcm9udGVuZElzZGJzM1NldHRpbmdzIGlzZGJzMzsKKworICAgIFR1bmVyRnJvbnRlbmRJc2RidFNldHRpbmdzIGlzZGJ0OworCisgICAgVHVuZXJGcm9udGVuZER0bWJTZXR0aW5ncyBkdG1iOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwIGIvc2VydmljZXMvdHVuZXIvbWFpbl90dW5lcnNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmEwZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9tYWluX3R1bmVyc2VydmljZS5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworI2luY2x1ZGUgIlR1bmVyU2VydmljZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworaW50IG1haW4oaW50IGFyZ2MgX191bnVzZWQsIGNoYXIqKiBhcmd2KSB7CisgICAgQUxPR0QoIlR1bmVyIHNlcnZpY2Ugc3RhcnRpbmciKTsKKworICAgIHN0cmNweShhcmd2WzBdLCAibWVkaWEudHVuZXIiKTsKKyAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBBTE9HRCgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOworCisgICAgYmluZGVyX3N0YXR1c190IHN0YXR1cyA9IFR1bmVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICBpZiAoc3RhdHVzICE9IFNUQVRVU19PSykgeworICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGFkZCB0dW5lciBzZXJ2aWNlIGFzIEFJREwgaW50ZXJmYWNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3R1bmVyL21lZGlhdHVuZXIucmMgYi9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzA2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy90dW5lci9tZWRpYXR1bmVyLnJjCkBAIC0wLDAgKzEsNSBAQAorc2VydmljZSBtZWRpYS50dW5lciAvc3lzdGVtL2Jpbi9tZWRpYXR1bmVyCisgICAgY2xhc3MgbWFpbgorICAgIGdyb3VwIG1lZGlhCisgICAgaW9wcmlvIHJ0IDQKKyAgICB0YXNrX3Byb2ZpbGVzIFByb2Nlc3NDYXBhY2l0eUhpZ2ggSGlnaFBlcmZvcm1hbmNlCmRpZmYgLS1naXQgYS90b29scy9tYWlubGluZV9ob29rLnNoIGIvdG9vbHMvbWFpbmxpbmVfaG9vay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNThhZmI0OS4uMDAwMDAwMAotLS0gYS90b29scy9tYWlubGluZV9ob29rLnNoCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLUxPQ0FMX0RJUj0iJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRX0iICkiCi0KLU1BSU5MSU5FX0ZSQU1FV09SS1NfQVZfUEFUSFM9KAotICAgIG1lZGlhL2V4dHJhY3RvcnMvCi0gICAgbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvCi0gICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iCi0gICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiCi0gICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jCi0gICAgbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbgotICAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMKLSAgICBtZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMKLSAgICBtZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYwotICAgIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMKLSkKLQotTUFJTkxJTkVfRVhURVJOQUxfUFJPSkVDVFM9KAotICAgIGV4dGVybmFsL2FhYwotICAgIGV4dGVybmFsL2ZsYWMKLSAgICBleHRlcm5hbC9saWJhYWMKLSAgICBleHRlcm5hbC9saWJhb20KLSAgICBleHRlcm5hbC9saWJhdmMKLSAgICBleHRlcm5hbC9saWJnYXYxCi0gICAgZXh0ZXJuYWwvbGliZ3NtCi0gICAgZXh0ZXJuYWwvbGliaGV2YwotICAgIGV4dGVybmFsL2xpYm1wZWcyCi0gICAgZXh0ZXJuYWwvbGlib3B1cwotICAgIGV4dGVybmFsL2xpYnZweAotICAgIGV4dGVybmFsL2xpYnhhYWMKLSAgICBleHRlcm5hbC9zb25pdm94Ci0gICAgZXh0ZXJuYWwvdHJlbW9sbwotKQotCi1ERVZfQlJBTkNIPXF0LWFtbC1tZWRpYS1kZXYKLVJFRD0kKHRwdXQgc2V0YWYgMSkKLU5PUk1BTD0kKHRwdXQgc2dyMCkKLVdBUk5JTkdfRlVMTD0iJHtSRUR9UGxlYXNlIHVwbG9hZCB0aGlzIGNoYW5nZSBpbiAke0RFVl9CUkFOQ0h9IHVubGVzcyBpdCBpcyByZXN0cmljdGVkCi1mcm9tIG1haW5saW5lIHJlbGVhc2UgdW50aWwgbmV4dCBkZXNzZXJ0IHJlbGVhc2UuIExvdy9tb2RlcmF0ZSBzZWN1cml0eSBidWdzCi1hcmUgcmVzdHJpY3RlZCB0aGlzIHdheS4ke05PUk1BTH0iCi1XQVJOSU5HX1BBUlRJQUw9IiR7UkVEfUl0IGxvb2tzIGxpa2UgeW91ciBjaGFuZ2UgaGFzIG1haW5saW5lIGFuZCBub24tbWFpbmxpbmUgY2hhbmdlczsKLUNvbnNpZGVyIHNlcGFyYXRpbmcgdGhlbSBpbnRvIHR3byBzZXBhcmF0ZSBDTHMgLS0gb25lIGZvciBtYWlubGluZSBmaWxlcywKLW9uZSBmb3Igbm9uLW1haW5saW5lIGZpbGVzLiR7Tk9STUFMfSIKLVBXRD1gcHdkYAotCi1pZiBnaXQgYnJhbmNoIC12diB8IGdyZXAgLXEgLVAgIl5cKlteXFtdK1xbZ29vZy9xdC1hbWwtbWVkaWEtZGV2IjsgdGhlbgotICAgICMgQ2hhbmdlIGFwcGVhcnMgdG8gYmUgaW4gbWFpbmxpbmUgZGV2IGJyYW5jaAotICAgIGV4aXQgMAotZmkKLQotZm9yIHBhdGggaW4gIiR7TUFJTkxJTkVfRVhURVJOQUxfUFJPSkVDVFNbQF19IjsgZG8KLSAgICBpZiBbWyAkUFdEID1+ICRwYXRoIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gLWUgIiR7UkVEfVRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yICckcGF0aCcgaXMgaW4gJHtERVZfQlJBTkNIfS4ke05PUk1BTH0iCi0gICAgICAgIGVjaG8gLWUgJHtXQVJOSU5HX0ZVTEx9Ci0gICAgICAgIGV4aXQgMQotICAgIGZpCi1kb25lCi0KLWlmIFtbICEgJFBXRCA9fiBmcmFtZXdvcmtzL2F2IF1dOyB0aGVuCi0gICAgZXhpdCAwCi1maQotCi1tYWlubGluZV9jb3VudD0wCi10b3RhbF9jb3VudD0wCi1lY2hvCi13aGlsZSByZWFkIC1yIGZpbGUgOyBkbwotICAgICgoIHRvdGFsX2NvdW50KysgKSkKLSAgICBmb3IgcGF0aCBpbiAiJHtNQUlOTElORV9GUkFNRVdPUktTX0FWX1BBVEhTW0BdfSI7IGRvCi0gICAgICAgIGlmIFtbICRmaWxlID1+IF4kcGF0aCBdXTsgdGhlbgotICAgICAgICAgICAgZWNobyAtZSAiJHtSRUR9VGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgJyRmaWxlJyBpcyBpbiAke0RFVl9CUkFOQ0h9LiR7Tk9STUFMfSIKLSAgICAgICAgICAgICgoIG1haW5saW5lX2NvdW50KysgKSkKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZG9uZSA8IDwoZ2l0IHNob3cgLS1uYW1lLW9ubHkgLS1wcmV0dHk9Zm9ybWF0OiAkMSB8IGdyZXAgLS0gIiQyIikKLQotaWYgKCggbWFpbmxpbmVfY291bnQgIT0gMCApKTsgdGhlbgotICAgIGlmICgoIG1haW5saW5lX2NvdW50ID09IHRvdGFsX2NvdW50ICkpOyB0aGVuCi0gICAgICAgIGVjaG8gLWUgJHtXQVJOSU5HX0ZVTEx9Ci0gICAgZWxzZQotICAgICAgICBlY2hvIC1lICR7V0FSTklOR19QQVJUSUFMfQotICAgIGZpCi0gICAgZXhpdCAxCi1maQotZXhpdCAwCmRpZmYgLS1naXQgYS90b29scy9tYWlubGluZV9ob29rX3BhcnRpYWwuc2ggYi90b29scy9tYWlubGluZV9ob29rX3BhcnRpYWwuc2gKaW5kZXggM2RjNjE2My4uYmQ4MjMxNSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFpbmxpbmVfaG9va19wYXJ0aWFsLnNoCisrKyBiL3Rvb2xzL21haW5saW5lX2hvb2tfcGFydGlhbC5zaApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYWlubGluZV9ob29rX3Byb2plY3Quc2ggYi90b29scy9tYWlubGluZV9ob29rX3Byb2plY3Quc2gKaW5kZXggOGQzNTQ3MC4uY2I1ZmM0NCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFpbmxpbmVfaG9va19wcm9qZWN0LnNoCisrKyBiL3Rvb2xzL21haW5saW5lX2hvb2tfcHJvamVjdC5zaApAQCAtMTYsNyArMTYsOCBAQAogCiAKICMgdHVuYWJsZXMKLURFVl9CUkFOQ0g9cnZjLWRldgorREVWX0JSQU5DSD1tYXN0ZXIKK01BSU5MSU5FX0JSQU5DSD1zYy1tYWlubGluZS1wcm9kCiAKICMjIwogUkVEPSQodHB1dCBzZXRhZiAxKQpAQCAtMjUsNDEgKzI2LDI3IEBACiAjIyBjaGVjayB0aGUgYWN0aXZlIGJyYW5jaDoKICMjICogYjEzMTE4MzY5NCBkMTk4YzZhIFtnb29nL21hc3Rlcl0gRml4IHRvIGhhbmRsZSBtaXNzaW5nIGNoZWNrcyBvbiBlcnJvciByZXR1cm5lZAogIyMKLWN1cnJlbnQ9YGdpdCBicmFuY2ggLXZ2IHwgZ3JlcCAtUCAiXlwqW15cW10rXFtnb29nLyJ8c2VkIC1lICdzL14uKlxbLy8nIHwgc2VkIC1lICdzLzouKiQvLyd8IHNlZCAtZSAncy9eZ29vZ1wvLy8nYAorY3VycmVudD1gZ2l0IGJyYW5jaCAtdnYgfCBncmVwIC1QICJeXCpbXlxbXStcW2dvb2cvInxzZWQgLWUgJ3MvXi4qXFsvLycgfCBzZWQgLWUgJ3MvXF0uKiQvLyd8c2VkIC1lICdzLzouKiQvLyd8IHNlZCAtZSAncy9eZ29vZ1wvLy8nYAogaWYgWyAiJHtjdXJyZW50fSIgPSAiIiBdIDsgdGhlbgogICAgICAgICBjdXJyZW50PXVua25vd24KIGZpCiAKLWlmIFsgIiR7Y3VycmVudH0iID0gIiR7REVWX0JSQU5DSH0iIF0gOyB0aGVuCi0gICAgIyBDaGFuZ2UgYXBwZWFycyB0byBiZSBpbiBtYWlubGluZSBkZXYgYnJhbmNoCi0gICAgZXhpdCAwCisjIHNpbXBsZSByZW1pbmRlciB0aGF0IGl0IHNob3VsZCBhbHNvIGxhbmQgaW4gbWFpbmxpbmUgYnJhbmNoCisjCitpZiBbICIke2N1cnJlbnR9IiAhPSAiJHtNQUlOTElORV9CUkFOQ0h9IiBdIDsgdGhlbgorICAgICAgICAjIHNpbXBsZSByZW1pbmRlciB0byBlbnN1cmUgaXQgaGl0cyBtYWlubGluZQorICAgICAgICBjYXQgLSA8PEVPRgorWW91IGFyZSB1cGxvYWRpbmcgcmVwbyAgJHtSRUR9JHtSRVBPX1BBVEh9JHtOT1JNQUx9IHRvIGJyYW5jaCAke1JFRH0ke2N1cnJlbnR9JHtOT1JNQUx9LgorVGhlIG1haW5saW5lIGJyYW5jaCBmb3IgJHtSRUR9JHtSRVBPX1BBVEh9JHtOT1JNQUx9IGlzIGJyYW5jaCAke1JFRH0ke01BSU5MSU5FX0JSQU5DSH0ke05PUk1BTH0uCisKK0Vuc3VyZSBhbiBhcHByb3ByaWF0ZSBjaGVycnkgcGljayBvciBlcXVpdmFsZW50IGxhbmRzIGluIGJyYW5jaCAke1JFRH0ke01BSU5MSU5FX0JSQU5DSH0ke05PUk1BTH0uCitTZWN1cml0eSBidWxsZXRpbiB0aW1pbmcgb3IgdW5yZWxlYXNlZCBmdW5jdGlvbmFsaXR5IG1heSBkZXRlcm1pbmUgd2hlbiB0aGF0IGNhbiBiZSBsYW5kZWQuCisKK0VPRgogZmkKIAotIyMgd2FybiB0aGUgdXNlciB0aGF0IGFib3V0IG5vdCBiZWluZyBvbiB0aGUgdHlwaWNhbC9kZXNpcmVkIGJyYW5jaC4KLQotY2F0IC0gPDxFT0YKLQotWW91IGFyZSB1cGxvYWRpbmcgcmVwbyAgJHtSRUR9JHtSRVBPX1BBVEh9JHtOT1JNQUx9IHRvIGJyYW5jaCAke1JFRH0ke2N1cnJlbnR9JHtOT1JNQUx9LiAKLVRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yICR7UkVEfSR7UkVQT19QQVRIfSR7Tk9STUFMfSBpcyBicmFuY2ggJHtSRUR9JHtERVZfQlJBTkNIfSR7Tk9STUFMfS4gCi0KLVBsZWFzZSB1cGxvYWQgdGhpcyBjaGFuZ2UgdG8gYnJhbmNoICR7UkVEfSR7REVWX0JSQU5DSH0ke05PUk1BTH0gdW5sZXNzIG9uZSBvciBtb3JlIG9mCi10aGUgZm9sbG93aW5nIGFwcGx5OgotLSB0aGlzIGlzIGEgc2VjdXJpdHkgYnVnIHByb2hpYml0ZWQgZnJvbSBkaXNjbG9zdXJlIGJlZm9yZSB0aGUgbmV4dCBkZXNzZXJ0IHJlbGVhc2UuCi0gIChtb2RlcmF0ZSBzZWN1cml0eSBidWdzIGZhbGwgaW50byB0aGlzIGNhdGVnb3J5KS4KLS0gdGhpcyBpcyBuZXcgZnVuY3Rpb25hbGl0eSBwcm9oaWJpdGllZCBmcm9tIGRpc2Nsb3N1cmUgYmVmb3JlIHRoZSBuZXh0IGRlc3NlcnQgcmVsZWFzZS4KLUVPRgotCi0KLSMjCi0jIyBUT0RPOiBwcm9tcHQgdGhlIHVzZXIgeS9uIHRvIGNvbnRpbnVlIHJpZ2h0IG5vdyBpbnN0ZWFkIG9mIHJlLWludm9raW5nIHdpdGggbm8tdmVyaWZ5Ci0jIyB0aGlzIGhhcyB0byBnZXQgYXJvdW5kIGhvdyByZXBvIGJ1ZmZlcnMgc3Rkb3V0IGZyb20gdGhpcyBzY3JpcHQgc3VjaCB0aGF0IHRoZSBvdXRwdXQKLSMjIGlzIG5vdCBmbHVzaGVkIGJlZm9yZSB3ZSB0cnkgdG8gcmVhZCB0aGUgaW5wdXQuCi0jIyAKLQotY2F0IC0gPDxFT0YKLUlmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkIHVwbG9hZGluZyB0byBicmFuY2ggJHtSRUR9JHtjdXJyZW50fSR7Tk9STUFMfSwKLXJlLXJ1biB5b3VyIHJlcG8gdXBsb2FkIGNvbW1hbmQgd2l0aCB0aGUgJy0tbm8tdmVyaWZ5JyBvcHRpb24KLQotRU9GCi1leGl0IDEKKyMgZXhpdCAwIGlzICJhbGwgZ29vZCwgbm8gb3V0cHV0IHBhc3NlZCBhbG9uZyB0byB1c2VyIgorIyBleGl0IDc3IGlzICJhbGwgb2ssIGJ1dCBvdXRwdXQgaXMgcGFzc2VkIGFsb25nIHRvIHRoZSB1c2VyIgorIworZXhpdCA3NwogCg==